From 7fb96fee17c0aabf38eb76469744e101021b285a Mon Sep 17 00:00:00 2001 From: Gleb Morgachev Date: Fri, 13 Feb 2026 20:29:01 -0800 Subject: [PATCH 01/13] Fix: v0.2.9-post3 (#748) * Fix: intersection * use previous active participant set * version --- deploy/join/docker-compose.yml | 10 +- .../api/inference/inference/params.pulsar.go | 2194 ++++-- .../api/inference/inference/query.pulsar.go | 6286 ++++++++++------- .../api/inference/inference/query_grpc.pb.go | 39 + .../proto/inference/inference/query.proto | 16 + .../x/inference/keeper/query_random_seeds.go | 35 + .../x/inference/module/confirmation_poc.go | 6 +- inference-chain/x/inference/module/module.go | 81 +- inference-chain/x/inference/types/query.pb.go | 1281 ++-- .../x/inference/types/query.pb.gw.go | 101 + 10 files changed, 6152 insertions(+), 3897 deletions(-) create mode 100644 inference-chain/x/inference/keeper/query_random_seeds.go diff --git a/deploy/join/docker-compose.yml b/deploy/join/docker-compose.yml index 2c626edbc..9cabba95f 100644 --- a/deploy/join/docker-compose.yml +++ b/deploy/join/docker-compose.yml @@ -1,6 +1,6 @@ services: tmkms: - image: ghcr.io/product-science/tmkms-softsign-with-keygen:0.2.9-post2 + image: ghcr.io/product-science/tmkms-softsign-with-keygen:0.2.9-post3 container_name: tmkms restart: unless-stopped environment: @@ -10,7 +10,7 @@ services: node: container_name: node - image: ghcr.io/product-science/inferenced:0.2.9-post2 + image: ghcr.io/product-science/inferenced:0.2.9-post3 command: ["sh", "./init-docker.sh"] volumes: - .inference:/root/.inference @@ -44,7 +44,7 @@ services: api: container_name: api - image: ghcr.io/product-science/api:0.2.9-post2 + image: ghcr.io/product-science/api:0.2.9-post3 volumes: - .inference:/root/.inference - .dapi:/root/.dapi @@ -99,7 +99,7 @@ services: proxy: container_name: proxy - image: ghcr.io/product-science/proxy:0.2.9-post2 + image: ghcr.io/product-science/proxy:0.2.9-post3 ports: - "${API_PORT:-8000}:80" - "${API_SSL_PORT:-8443}:443" @@ -145,7 +145,7 @@ services: proxy-ssl: container_name: proxy-ssl - image: ghcr.io/product-science/proxy-ssl:0.2.9-post2 + image: ghcr.io/product-science/proxy-ssl:0.2.9-post3 profiles: - ssl environment: diff --git a/inference-chain/api/inference/inference/params.pulsar.go b/inference-chain/api/inference/inference/params.pulsar.go index 28ecb36f8..3b330a4c3 100644 --- a/inference-chain/api/inference/inference/params.pulsar.go +++ b/inference-chain/api/inference/inference/params.pulsar.go @@ -16,19 +16,20 @@ import ( ) var ( - md_Params protoreflect.MessageDescriptor - fd_Params_epoch_params protoreflect.FieldDescriptor - fd_Params_validation_params protoreflect.FieldDescriptor - fd_Params_poc_params protoreflect.FieldDescriptor - fd_Params_tokenomics_params protoreflect.FieldDescriptor - fd_Params_collateral_params protoreflect.FieldDescriptor - fd_Params_bitcoin_reward_params protoreflect.FieldDescriptor - fd_Params_dynamic_pricing_params protoreflect.FieldDescriptor - fd_Params_bandwidth_limits_params protoreflect.FieldDescriptor - fd_Params_confirmation_poc_params protoreflect.FieldDescriptor - fd_Params_genesis_guardian_params protoreflect.FieldDescriptor - fd_Params_developer_access_params protoreflect.FieldDescriptor - fd_Params_participant_access_params protoreflect.FieldDescriptor + md_Params protoreflect.MessageDescriptor + fd_Params_epoch_params protoreflect.FieldDescriptor + fd_Params_validation_params protoreflect.FieldDescriptor + fd_Params_poc_params protoreflect.FieldDescriptor + fd_Params_tokenomics_params protoreflect.FieldDescriptor + fd_Params_collateral_params protoreflect.FieldDescriptor + fd_Params_bitcoin_reward_params protoreflect.FieldDescriptor + fd_Params_dynamic_pricing_params protoreflect.FieldDescriptor + fd_Params_bandwidth_limits_params protoreflect.FieldDescriptor + fd_Params_confirmation_poc_params protoreflect.FieldDescriptor + fd_Params_genesis_guardian_params protoreflect.FieldDescriptor + fd_Params_developer_access_params protoreflect.FieldDescriptor + fd_Params_participant_access_params protoreflect.FieldDescriptor + fd_Params_transfer_agent_access_params protoreflect.FieldDescriptor ) func init() { @@ -46,6 +47,7 @@ func init() { fd_Params_genesis_guardian_params = md_Params.Fields().ByName("genesis_guardian_params") fd_Params_developer_access_params = md_Params.Fields().ByName("developer_access_params") fd_Params_participant_access_params = md_Params.Fields().ByName("participant_access_params") + fd_Params_transfer_agent_access_params = md_Params.Fields().ByName("transfer_agent_access_params") } var _ protoreflect.Message = (*fastReflection_Params)(nil) @@ -185,6 +187,12 @@ func (x *fastReflection_Params) Range(f func(protoreflect.FieldDescriptor, proto return } } + if x.TransferAgentAccessParams != nil { + value := protoreflect.ValueOfMessage(x.TransferAgentAccessParams.ProtoReflect()) + if !f(fd_Params_transfer_agent_access_params, value) { + return + } + } } // Has reports whether a field is populated. @@ -224,6 +232,8 @@ func (x *fastReflection_Params) Has(fd protoreflect.FieldDescriptor) bool { return x.DeveloperAccessParams != nil case "inference.inference.Params.participant_access_params": return x.ParticipantAccessParams != nil + case "inference.inference.Params.transfer_agent_access_params": + return x.TransferAgentAccessParams != nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.Params")) @@ -264,6 +274,8 @@ func (x *fastReflection_Params) Clear(fd protoreflect.FieldDescriptor) { x.DeveloperAccessParams = nil case "inference.inference.Params.participant_access_params": x.ParticipantAccessParams = nil + case "inference.inference.Params.transfer_agent_access_params": + x.TransferAgentAccessParams = nil default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.Params")) @@ -316,6 +328,9 @@ func (x *fastReflection_Params) Get(descriptor protoreflect.FieldDescriptor) pro case "inference.inference.Params.participant_access_params": value := x.ParticipantAccessParams return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "inference.inference.Params.transfer_agent_access_params": + value := x.TransferAgentAccessParams + return protoreflect.ValueOfMessage(value.ProtoReflect()) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.Params")) @@ -360,6 +375,8 @@ func (x *fastReflection_Params) Set(fd protoreflect.FieldDescriptor, value proto x.DeveloperAccessParams = value.Message().Interface().(*DeveloperAccessParams) case "inference.inference.Params.participant_access_params": x.ParticipantAccessParams = value.Message().Interface().(*ParticipantAccessParams) + case "inference.inference.Params.transfer_agent_access_params": + x.TransferAgentAccessParams = value.Message().Interface().(*TransferAgentAccessParams) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.Params")) @@ -440,6 +457,11 @@ func (x *fastReflection_Params) Mutable(fd protoreflect.FieldDescriptor) protore x.ParticipantAccessParams = new(ParticipantAccessParams) } return protoreflect.ValueOfMessage(x.ParticipantAccessParams.ProtoReflect()) + case "inference.inference.Params.transfer_agent_access_params": + if x.TransferAgentAccessParams == nil { + x.TransferAgentAccessParams = new(TransferAgentAccessParams) + } + return protoreflect.ValueOfMessage(x.TransferAgentAccessParams.ProtoReflect()) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.Params")) @@ -489,6 +511,9 @@ func (x *fastReflection_Params) NewField(fd protoreflect.FieldDescriptor) protor case "inference.inference.Params.participant_access_params": m := new(ParticipantAccessParams) return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "inference.inference.Params.transfer_agent_access_params": + m := new(TransferAgentAccessParams) + return protoreflect.ValueOfMessage(m.ProtoReflect()) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.Params")) @@ -606,6 +631,10 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { l = options.Size(x.ParticipantAccessParams) n += 1 + l + runtime.Sov(uint64(l)) } + if x.TransferAgentAccessParams != nil { + l = options.Size(x.TransferAgentAccessParams) + n += 1 + l + runtime.Sov(uint64(l)) + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -635,6 +664,20 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if x.TransferAgentAccessParams != nil { + encoded, err := options.Marshal(x.TransferAgentAccessParams) + 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] = 0x6a + } if x.ParticipantAccessParams != nil { encoded, err := options.Marshal(x.ParticipantAccessParams) if err != nil { @@ -1284,6 +1327,42 @@ func (x *fastReflection_Params) ProtoMethods() *protoiface.Methods { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err } iNdEx = postIndex + case 13: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field TransferAgentAccessParams", 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.TransferAgentAccessParams == nil { + x.TransferAgentAccessParams = &TransferAgentAccessParams{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.TransferAgentAccessParams); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -15183,215 +15262,703 @@ func (x *fastReflection_ParticipantAccessParams) ProtoMethods() *protoiface.Meth } } -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.0 -// protoc (unknown) -// source: inference/inference/params.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) -) - -// Params defines the parameters for the module. -type Params struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +var _ protoreflect.List = (*_TransferAgentAccessParams_1_list)(nil) - EpochParams *EpochParams `protobuf:"bytes,1,opt,name=epoch_params,json=epochParams,proto3" json:"epoch_params,omitempty"` - ValidationParams *ValidationParams `protobuf:"bytes,2,opt,name=validation_params,json=validationParams,proto3" json:"validation_params,omitempty"` - PocParams *PocParams `protobuf:"bytes,3,opt,name=poc_params,json=pocParams,proto3" json:"poc_params,omitempty"` - TokenomicsParams *TokenomicsParams `protobuf:"bytes,4,opt,name=tokenomics_params,json=tokenomicsParams,proto3" json:"tokenomics_params,omitempty"` - CollateralParams *CollateralParams `protobuf:"bytes,5,opt,name=collateral_params,json=collateralParams,proto3" json:"collateral_params,omitempty"` - BitcoinRewardParams *BitcoinRewardParams `protobuf:"bytes,6,opt,name=bitcoin_reward_params,json=bitcoinRewardParams,proto3" json:"bitcoin_reward_params,omitempty"` - DynamicPricingParams *DynamicPricingParams `protobuf:"bytes,7,opt,name=dynamic_pricing_params,json=dynamicPricingParams,proto3" json:"dynamic_pricing_params,omitempty"` - BandwidthLimitsParams *BandwidthLimitsParams `protobuf:"bytes,8,opt,name=bandwidth_limits_params,json=bandwidthLimitsParams,proto3" json:"bandwidth_limits_params,omitempty"` - ConfirmationPocParams *ConfirmationPoCParams `protobuf:"bytes,9,opt,name=confirmation_poc_params,json=confirmationPocParams,proto3" json:"confirmation_poc_params,omitempty"` - GenesisGuardianParams *GenesisGuardianParams `protobuf:"bytes,10,opt,name=genesis_guardian_params,json=genesisGuardianParams,proto3" json:"genesis_guardian_params,omitempty"` - DeveloperAccessParams *DeveloperAccessParams `protobuf:"bytes,11,opt,name=developer_access_params,json=developerAccessParams,proto3" json:"developer_access_params,omitempty"` - ParticipantAccessParams *ParticipantAccessParams `protobuf:"bytes,12,opt,name=participant_access_params,json=participantAccessParams,proto3" json:"participant_access_params,omitempty"` +type _TransferAgentAccessParams_1_list struct { + list *[]string } -func (x *Params) Reset() { - *x = Params{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_params_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *_TransferAgentAccessParams_1_list) Len() int { + if x.list == nil { + return 0 } + return len(*x.list) } -func (x *Params) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *_TransferAgentAccessParams_1_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfString((*x.list)[i]) } -func (*Params) ProtoMessage() {} - -// Deprecated: Use Params.ProtoReflect.Descriptor instead. -func (*Params) Descriptor() ([]byte, []int) { - return file_inference_inference_params_proto_rawDescGZIP(), []int{0} +func (x *_TransferAgentAccessParams_1_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + (*x.list)[i] = concreteValue } -func (x *Params) GetEpochParams() *EpochParams { - if x != nil { - return x.EpochParams - } - return nil +func (x *_TransferAgentAccessParams_1_list) Append(value protoreflect.Value) { + valueUnwrapped := value.String() + concreteValue := valueUnwrapped + *x.list = append(*x.list, concreteValue) } -func (x *Params) GetValidationParams() *ValidationParams { - if x != nil { - return x.ValidationParams - } - return nil +func (x *_TransferAgentAccessParams_1_list) AppendMutable() protoreflect.Value { + panic(fmt.Errorf("AppendMutable can not be called on message TransferAgentAccessParams at list field AllowedTransferAddresses as it is not of Message kind")) } -func (x *Params) GetPocParams() *PocParams { - if x != nil { - return x.PocParams - } - return nil +func (x *_TransferAgentAccessParams_1_list) Truncate(n int) { + *x.list = (*x.list)[:n] } -func (x *Params) GetTokenomicsParams() *TokenomicsParams { - if x != nil { - return x.TokenomicsParams - } - return nil +func (x *_TransferAgentAccessParams_1_list) NewElement() protoreflect.Value { + v := "" + return protoreflect.ValueOfString(v) } -func (x *Params) GetCollateralParams() *CollateralParams { - if x != nil { - return x.CollateralParams - } - return nil +func (x *_TransferAgentAccessParams_1_list) IsValid() bool { + return x.list != nil } -func (x *Params) GetBitcoinRewardParams() *BitcoinRewardParams { - if x != nil { - return x.BitcoinRewardParams - } - return nil -} +var ( + md_TransferAgentAccessParams protoreflect.MessageDescriptor + fd_TransferAgentAccessParams_allowed_transfer_addresses protoreflect.FieldDescriptor +) -func (x *Params) GetDynamicPricingParams() *DynamicPricingParams { - if x != nil { - return x.DynamicPricingParams - } - return nil +func init() { + file_inference_inference_params_proto_init() + md_TransferAgentAccessParams = File_inference_inference_params_proto.Messages().ByName("TransferAgentAccessParams") + fd_TransferAgentAccessParams_allowed_transfer_addresses = md_TransferAgentAccessParams.Fields().ByName("allowed_transfer_addresses") } -func (x *Params) GetBandwidthLimitsParams() *BandwidthLimitsParams { - if x != nil { - return x.BandwidthLimitsParams - } - return nil -} +var _ protoreflect.Message = (*fastReflection_TransferAgentAccessParams)(nil) -func (x *Params) GetConfirmationPocParams() *ConfirmationPoCParams { - if x != nil { - return x.ConfirmationPocParams - } - return nil -} +type fastReflection_TransferAgentAccessParams TransferAgentAccessParams -func (x *Params) GetGenesisGuardianParams() *GenesisGuardianParams { - if x != nil { - return x.GenesisGuardianParams - } - return nil +func (x *TransferAgentAccessParams) ProtoReflect() protoreflect.Message { + return (*fastReflection_TransferAgentAccessParams)(x) } -func (x *Params) GetDeveloperAccessParams() *DeveloperAccessParams { - if x != nil { - return x.DeveloperAccessParams +func (x *TransferAgentAccessParams) slowProtoReflect() protoreflect.Message { + mi := &file_inference_inference_params_proto_msgTypes[17] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } - return nil + return mi.MessageOf(x) } -func (x *Params) GetParticipantAccessParams() *ParticipantAccessParams { - if x != nil { - return x.ParticipantAccessParams - } - return nil -} +var _fastReflection_TransferAgentAccessParams_messageType fastReflection_TransferAgentAccessParams_messageType +var _ protoreflect.MessageType = fastReflection_TransferAgentAccessParams_messageType{} -type GenesisOnlyParams struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +type fastReflection_TransferAgentAccessParams_messageType struct{} - TotalSupply int64 `protobuf:"varint,1,opt,name=total_supply,json=totalSupply,proto3" json:"total_supply,omitempty"` - OriginatorSupply int64 `protobuf:"varint,2,opt,name=originator_supply,json=originatorSupply,proto3" json:"originator_supply,omitempty"` - TopRewardAmount int64 `protobuf:"varint,3,opt,name=top_reward_amount,json=topRewardAmount,proto3" json:"top_reward_amount,omitempty"` - StandardRewardAmount int64 `protobuf:"varint,4,opt,name=standard_reward_amount,json=standardRewardAmount,proto3" json:"standard_reward_amount,omitempty"` - PreProgrammedSaleAmount int64 `protobuf:"varint,5,opt,name=pre_programmed_sale_amount,json=preProgrammedSaleAmount,proto3" json:"pre_programmed_sale_amount,omitempty"` - TopRewards int32 `protobuf:"varint,6,opt,name=top_rewards,json=topRewards,proto3" json:"top_rewards,omitempty"` - SupplyDenom string `protobuf:"bytes,7,opt,name=supply_denom,json=supplyDenom,proto3" json:"supply_denom,omitempty"` - TopRewardPeriod int64 `protobuf:"varint,8,opt,name=top_reward_period,json=topRewardPeriod,proto3" json:"top_reward_period,omitempty"` - TopRewardPayouts int64 `protobuf:"varint,9,opt,name=top_reward_payouts,json=topRewardPayouts,proto3" json:"top_reward_payouts,omitempty"` - TopRewardPayoutsPerMiner int64 `protobuf:"varint,10,opt,name=top_reward_payouts_per_miner,json=topRewardPayoutsPerMiner,proto3" json:"top_reward_payouts_per_miner,omitempty"` - TopRewardMaxDuration int64 `protobuf:"varint,11,opt,name=top_reward_max_duration,json=topRewardMaxDuration,proto3" json:"top_reward_max_duration,omitempty"` - MaxIndividualPowerPercentage *Decimal `protobuf:"bytes,12,opt,name=max_individual_power_percentage,json=maxIndividualPowerPercentage,proto3" json:"max_individual_power_percentage,omitempty"` - GenesisGuardianEnabled bool `protobuf:"varint,13,opt,name=genesis_guardian_enabled,json=genesisGuardianEnabled,proto3" json:"genesis_guardian_enabled,omitempty"` - GenesisGuardianNetworkMaturityThreshold int64 `protobuf:"varint,14,opt,name=genesis_guardian_network_maturity_threshold,json=genesisGuardianNetworkMaturityThreshold,proto3" json:"genesis_guardian_network_maturity_threshold,omitempty"` - GenesisGuardianMultiplier *Decimal `protobuf:"bytes,15,opt,name=genesis_guardian_multiplier,json=genesisGuardianMultiplier,proto3" json:"genesis_guardian_multiplier,omitempty"` - GenesisGuardianAddresses []string `protobuf:"bytes,16,rep,name=genesis_guardian_addresses,json=genesisGuardianAddresses,proto3" json:"genesis_guardian_addresses,omitempty"` +func (x fastReflection_TransferAgentAccessParams_messageType) Zero() protoreflect.Message { + return (*fastReflection_TransferAgentAccessParams)(nil) } - -func (x *GenesisOnlyParams) Reset() { - *x = GenesisOnlyParams{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_params_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } +func (x fastReflection_TransferAgentAccessParams_messageType) New() protoreflect.Message { + return new(fastReflection_TransferAgentAccessParams) } - -func (x *GenesisOnlyParams) String() string { - return protoimpl.X.MessageStringOf(x) +func (x fastReflection_TransferAgentAccessParams_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_TransferAgentAccessParams } -func (*GenesisOnlyParams) ProtoMessage() {} +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_TransferAgentAccessParams) Descriptor() protoreflect.MessageDescriptor { + return md_TransferAgentAccessParams +} -// Deprecated: Use GenesisOnlyParams.ProtoReflect.Descriptor instead. -func (*GenesisOnlyParams) Descriptor() ([]byte, []int) { - return file_inference_inference_params_proto_rawDescGZIP(), []int{1} +// 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_TransferAgentAccessParams) Type() protoreflect.MessageType { + return _fastReflection_TransferAgentAccessParams_messageType } -func (x *GenesisOnlyParams) GetTotalSupply() int64 { - if x != nil { - return x.TotalSupply - } - return 0 +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_TransferAgentAccessParams) New() protoreflect.Message { + return new(fastReflection_TransferAgentAccessParams) } -func (x *GenesisOnlyParams) GetOriginatorSupply() int64 { - if x != nil { - return x.OriginatorSupply - } - return 0 +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_TransferAgentAccessParams) Interface() protoreflect.ProtoMessage { + return (*TransferAgentAccessParams)(x) } -func (x *GenesisOnlyParams) GetTopRewardAmount() int64 { - if x != nil { - return x.TopRewardAmount +// 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_TransferAgentAccessParams) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.AllowedTransferAddresses) != 0 { + value := protoreflect.ValueOfList(&_TransferAgentAccessParams_1_list{list: &x.AllowedTransferAddresses}) + if !f(fd_TransferAgentAccessParams_allowed_transfer_addresses, value) { + return + } } - return 0 } -func (x *GenesisOnlyParams) GetStandardRewardAmount() int64 { - if x != nil { - return x.StandardRewardAmount +// 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_TransferAgentAccessParams) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "inference.inference.TransferAgentAccessParams.allowed_transfer_addresses": + return len(x.AllowedTransferAddresses) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.TransferAgentAccessParams")) + } + panic(fmt.Errorf("message inference.inference.TransferAgentAccessParams does not contain field %s", fd.FullName())) } - return 0 } -func (x *GenesisOnlyParams) GetPreProgrammedSaleAmount() int64 { +// 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_TransferAgentAccessParams) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "inference.inference.TransferAgentAccessParams.allowed_transfer_addresses": + x.AllowedTransferAddresses = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.TransferAgentAccessParams")) + } + panic(fmt.Errorf("message inference.inference.TransferAgentAccessParams 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_TransferAgentAccessParams) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "inference.inference.TransferAgentAccessParams.allowed_transfer_addresses": + if len(x.AllowedTransferAddresses) == 0 { + return protoreflect.ValueOfList(&_TransferAgentAccessParams_1_list{}) + } + listValue := &_TransferAgentAccessParams_1_list{list: &x.AllowedTransferAddresses} + return protoreflect.ValueOfList(listValue) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.TransferAgentAccessParams")) + } + panic(fmt.Errorf("message inference.inference.TransferAgentAccessParams 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_TransferAgentAccessParams) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "inference.inference.TransferAgentAccessParams.allowed_transfer_addresses": + lv := value.List() + clv := lv.(*_TransferAgentAccessParams_1_list) + x.AllowedTransferAddresses = *clv.list + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.TransferAgentAccessParams")) + } + panic(fmt.Errorf("message inference.inference.TransferAgentAccessParams 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_TransferAgentAccessParams) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.TransferAgentAccessParams.allowed_transfer_addresses": + if x.AllowedTransferAddresses == nil { + x.AllowedTransferAddresses = []string{} + } + value := &_TransferAgentAccessParams_1_list{list: &x.AllowedTransferAddresses} + return protoreflect.ValueOfList(value) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.TransferAgentAccessParams")) + } + panic(fmt.Errorf("message inference.inference.TransferAgentAccessParams 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_TransferAgentAccessParams) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.TransferAgentAccessParams.allowed_transfer_addresses": + list := []string{} + return protoreflect.ValueOfList(&_TransferAgentAccessParams_1_list{list: &list}) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.TransferAgentAccessParams")) + } + panic(fmt.Errorf("message inference.inference.TransferAgentAccessParams 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_TransferAgentAccessParams) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in inference.inference.TransferAgentAccessParams", 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_TransferAgentAccessParams) 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_TransferAgentAccessParams) 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_TransferAgentAccessParams) 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_TransferAgentAccessParams) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*TransferAgentAccessParams) + 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.AllowedTransferAddresses) > 0 { + for _, s := range x.AllowedTransferAddresses { + 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().(*TransferAgentAccessParams) + 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.AllowedTransferAddresses) > 0 { + for iNdEx := len(x.AllowedTransferAddresses) - 1; iNdEx >= 0; iNdEx-- { + i -= len(x.AllowedTransferAddresses[iNdEx]) + copy(dAtA[i:], x.AllowedTransferAddresses[iNdEx]) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.AllowedTransferAddresses[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().(*TransferAgentAccessParams) + 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: TransferAgentAccessParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: TransferAgentAccessParams: 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 AllowedTransferAddresses", 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.AllowedTransferAddresses = append(x.AllowedTransferAddresses, 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: inference/inference/params.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) +) + +// Params defines the parameters for the module. +type Params struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EpochParams *EpochParams `protobuf:"bytes,1,opt,name=epoch_params,json=epochParams,proto3" json:"epoch_params,omitempty"` + ValidationParams *ValidationParams `protobuf:"bytes,2,opt,name=validation_params,json=validationParams,proto3" json:"validation_params,omitempty"` + PocParams *PocParams `protobuf:"bytes,3,opt,name=poc_params,json=pocParams,proto3" json:"poc_params,omitempty"` + TokenomicsParams *TokenomicsParams `protobuf:"bytes,4,opt,name=tokenomics_params,json=tokenomicsParams,proto3" json:"tokenomics_params,omitempty"` + CollateralParams *CollateralParams `protobuf:"bytes,5,opt,name=collateral_params,json=collateralParams,proto3" json:"collateral_params,omitempty"` + BitcoinRewardParams *BitcoinRewardParams `protobuf:"bytes,6,opt,name=bitcoin_reward_params,json=bitcoinRewardParams,proto3" json:"bitcoin_reward_params,omitempty"` + DynamicPricingParams *DynamicPricingParams `protobuf:"bytes,7,opt,name=dynamic_pricing_params,json=dynamicPricingParams,proto3" json:"dynamic_pricing_params,omitempty"` + BandwidthLimitsParams *BandwidthLimitsParams `protobuf:"bytes,8,opt,name=bandwidth_limits_params,json=bandwidthLimitsParams,proto3" json:"bandwidth_limits_params,omitempty"` + ConfirmationPocParams *ConfirmationPoCParams `protobuf:"bytes,9,opt,name=confirmation_poc_params,json=confirmationPocParams,proto3" json:"confirmation_poc_params,omitempty"` + GenesisGuardianParams *GenesisGuardianParams `protobuf:"bytes,10,opt,name=genesis_guardian_params,json=genesisGuardianParams,proto3" json:"genesis_guardian_params,omitempty"` + DeveloperAccessParams *DeveloperAccessParams `protobuf:"bytes,11,opt,name=developer_access_params,json=developerAccessParams,proto3" json:"developer_access_params,omitempty"` + ParticipantAccessParams *ParticipantAccessParams `protobuf:"bytes,12,opt,name=participant_access_params,json=participantAccessParams,proto3" json:"participant_access_params,omitempty"` + TransferAgentAccessParams *TransferAgentAccessParams `protobuf:"bytes,13,opt,name=transfer_agent_access_params,json=transferAgentAccessParams,proto3" json:"transfer_agent_access_params,omitempty"` +} + +func (x *Params) Reset() { + *x = Params{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_params_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *Params) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*Params) ProtoMessage() {} + +// Deprecated: Use Params.ProtoReflect.Descriptor instead. +func (*Params) Descriptor() ([]byte, []int) { + return file_inference_inference_params_proto_rawDescGZIP(), []int{0} +} + +func (x *Params) GetEpochParams() *EpochParams { + if x != nil { + return x.EpochParams + } + return nil +} + +func (x *Params) GetValidationParams() *ValidationParams { + if x != nil { + return x.ValidationParams + } + return nil +} + +func (x *Params) GetPocParams() *PocParams { + if x != nil { + return x.PocParams + } + return nil +} + +func (x *Params) GetTokenomicsParams() *TokenomicsParams { + if x != nil { + return x.TokenomicsParams + } + return nil +} + +func (x *Params) GetCollateralParams() *CollateralParams { + if x != nil { + return x.CollateralParams + } + return nil +} + +func (x *Params) GetBitcoinRewardParams() *BitcoinRewardParams { + if x != nil { + return x.BitcoinRewardParams + } + return nil +} + +func (x *Params) GetDynamicPricingParams() *DynamicPricingParams { + if x != nil { + return x.DynamicPricingParams + } + return nil +} + +func (x *Params) GetBandwidthLimitsParams() *BandwidthLimitsParams { + if x != nil { + return x.BandwidthLimitsParams + } + return nil +} + +func (x *Params) GetConfirmationPocParams() *ConfirmationPoCParams { + if x != nil { + return x.ConfirmationPocParams + } + return nil +} + +func (x *Params) GetGenesisGuardianParams() *GenesisGuardianParams { + if x != nil { + return x.GenesisGuardianParams + } + return nil +} + +func (x *Params) GetDeveloperAccessParams() *DeveloperAccessParams { + if x != nil { + return x.DeveloperAccessParams + } + return nil +} + +func (x *Params) GetParticipantAccessParams() *ParticipantAccessParams { + if x != nil { + return x.ParticipantAccessParams + } + return nil +} + +func (x *Params) GetTransferAgentAccessParams() *TransferAgentAccessParams { + if x != nil { + return x.TransferAgentAccessParams + } + return nil +} + +type GenesisOnlyParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TotalSupply int64 `protobuf:"varint,1,opt,name=total_supply,json=totalSupply,proto3" json:"total_supply,omitempty"` + OriginatorSupply int64 `protobuf:"varint,2,opt,name=originator_supply,json=originatorSupply,proto3" json:"originator_supply,omitempty"` + TopRewardAmount int64 `protobuf:"varint,3,opt,name=top_reward_amount,json=topRewardAmount,proto3" json:"top_reward_amount,omitempty"` + StandardRewardAmount int64 `protobuf:"varint,4,opt,name=standard_reward_amount,json=standardRewardAmount,proto3" json:"standard_reward_amount,omitempty"` + PreProgrammedSaleAmount int64 `protobuf:"varint,5,opt,name=pre_programmed_sale_amount,json=preProgrammedSaleAmount,proto3" json:"pre_programmed_sale_amount,omitempty"` + TopRewards int32 `protobuf:"varint,6,opt,name=top_rewards,json=topRewards,proto3" json:"top_rewards,omitempty"` + SupplyDenom string `protobuf:"bytes,7,opt,name=supply_denom,json=supplyDenom,proto3" json:"supply_denom,omitempty"` + TopRewardPeriod int64 `protobuf:"varint,8,opt,name=top_reward_period,json=topRewardPeriod,proto3" json:"top_reward_period,omitempty"` + TopRewardPayouts int64 `protobuf:"varint,9,opt,name=top_reward_payouts,json=topRewardPayouts,proto3" json:"top_reward_payouts,omitempty"` + TopRewardPayoutsPerMiner int64 `protobuf:"varint,10,opt,name=top_reward_payouts_per_miner,json=topRewardPayoutsPerMiner,proto3" json:"top_reward_payouts_per_miner,omitempty"` + TopRewardMaxDuration int64 `protobuf:"varint,11,opt,name=top_reward_max_duration,json=topRewardMaxDuration,proto3" json:"top_reward_max_duration,omitempty"` + MaxIndividualPowerPercentage *Decimal `protobuf:"bytes,12,opt,name=max_individual_power_percentage,json=maxIndividualPowerPercentage,proto3" json:"max_individual_power_percentage,omitempty"` + GenesisGuardianEnabled bool `protobuf:"varint,13,opt,name=genesis_guardian_enabled,json=genesisGuardianEnabled,proto3" json:"genesis_guardian_enabled,omitempty"` + GenesisGuardianNetworkMaturityThreshold int64 `protobuf:"varint,14,opt,name=genesis_guardian_network_maturity_threshold,json=genesisGuardianNetworkMaturityThreshold,proto3" json:"genesis_guardian_network_maturity_threshold,omitempty"` + GenesisGuardianMultiplier *Decimal `protobuf:"bytes,15,opt,name=genesis_guardian_multiplier,json=genesisGuardianMultiplier,proto3" json:"genesis_guardian_multiplier,omitempty"` + GenesisGuardianAddresses []string `protobuf:"bytes,16,rep,name=genesis_guardian_addresses,json=genesisGuardianAddresses,proto3" json:"genesis_guardian_addresses,omitempty"` +} + +func (x *GenesisOnlyParams) Reset() { + *x = GenesisOnlyParams{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_params_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GenesisOnlyParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GenesisOnlyParams) ProtoMessage() {} + +// Deprecated: Use GenesisOnlyParams.ProtoReflect.Descriptor instead. +func (*GenesisOnlyParams) Descriptor() ([]byte, []int) { + return file_inference_inference_params_proto_rawDescGZIP(), []int{1} +} + +func (x *GenesisOnlyParams) GetTotalSupply() int64 { + if x != nil { + return x.TotalSupply + } + return 0 +} + +func (x *GenesisOnlyParams) GetOriginatorSupply() int64 { + if x != nil { + return x.OriginatorSupply + } + return 0 +} + +func (x *GenesisOnlyParams) GetTopRewardAmount() int64 { + if x != nil { + return x.TopRewardAmount + } + return 0 +} + +func (x *GenesisOnlyParams) GetStandardRewardAmount() int64 { + if x != nil { + return x.StandardRewardAmount + } + return 0 +} + +func (x *GenesisOnlyParams) GetPreProgrammedSaleAmount() int64 { if x != nil { return x.PreProgrammedSaleAmount } @@ -16864,6 +17431,45 @@ func (x *ParticipantAccessParams) GetParticipantAllowlistUntilBlockHeight() int6 return 0 } +// TransferAgentAccessParams controls which Transfer Agents are allowed to process inference requests. +// If allowed_transfer_addresses is empty, all TAs are allowed (no restriction). +type TransferAgentAccessParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // allowed_transfer_addresses are bech32 account addresses allowed to act as Transfer Agents. + // If empty, all TAs are allowed. + AllowedTransferAddresses []string `protobuf:"bytes,1,rep,name=allowed_transfer_addresses,json=allowedTransferAddresses,proto3" json:"allowed_transfer_addresses,omitempty"` +} + +func (x *TransferAgentAccessParams) Reset() { + *x = TransferAgentAccessParams{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_params_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TransferAgentAccessParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TransferAgentAccessParams) ProtoMessage() {} + +// Deprecated: Use TransferAgentAccessParams.ProtoReflect.Descriptor instead. +func (*TransferAgentAccessParams) Descriptor() ([]byte, []int) { + return file_inference_inference_params_proto_rawDescGZIP(), []int{17} +} + +func (x *TransferAgentAccessParams) GetAllowedTransferAddresses() []string { + if x != nil { + return x.AllowedTransferAddresses + } + return nil +} + var File_inference_inference_params_proto protoreflect.FileDescriptor var file_inference_inference_params_proto_rawDesc = []byte{ @@ -16874,7 +17480,7 @@ var file_inference_inference_params_proto_rawDesc = []byte{ 0x6d, 0x69, 0x6e, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x67, 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xe8, 0x08, 0x0a, 0x06, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd9, 0x09, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x43, 0x0a, 0x0c, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, @@ -16942,560 +17548,574 @@ var file_inference_inference_params_proto_rawDesc = []byte{ 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x3a, - 0x25, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x1c, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x78, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0xb0, 0x07, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, 0x73, - 0x69, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, - 0x2b, 0x0a, 0x11, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, 0x75, - 0x70, 0x70, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6f, 0x72, 0x69, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x2a, 0x0a, 0x11, - 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x74, 0x61, 0x6e, - 0x64, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x73, 0x74, 0x61, 0x6e, 0x64, 0x61, - 0x72, 0x64, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x3b, - 0x0a, 0x1a, 0x70, 0x72, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x65, 0x64, - 0x5f, 0x73, 0x61, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x17, 0x70, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x65, - 0x64, 0x53, 0x61, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, - 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x21, 0x0a, 0x0c, - 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0b, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x44, 0x65, 0x6e, 0x6f, 0x6d, 0x12, - 0x2a, 0x0a, 0x11, 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x65, - 0x72, 0x69, 0x6f, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x74, 0x6f, 0x70, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x12, 0x74, - 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, - 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x74, 0x6f, 0x70, - 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x73, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x18, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, - 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x17, 0x74, 0x6f, 0x70, - 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x74, 0x6f, 0x70, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x4d, 0x61, 0x78, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x63, 0x0a, 0x1f, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, 0x75, - 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, - 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x1c, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x64, 0x69, - 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, - 0x5f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, - 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x5c, 0x0a, 0x2b, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x64, - 0x69, 0x61, 0x6e, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6d, 0x61, 0x74, 0x75, - 0x72, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0e, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x27, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x47, 0x75, 0x61, - 0x72, 0x64, 0x69, 0x61, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x61, 0x74, 0x75, - 0x72, 0x69, 0x74, 0x79, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x5c, 0x0a, - 0x1b, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, - 0x6e, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, - 0x52, 0x19, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, - 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x1a, 0x67, - 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, 0x52, - 0x18, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0xdf, 0x04, 0x0a, 0x10, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x5a, - 0x0a, 0x1a, 0x73, 0x75, 0x62, 0x73, 0x69, 0x64, 0x79, 0x5f, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, - 0x52, 0x18, 0x73, 0x75, 0x62, 0x73, 0x69, 0x64, 0x79, 0x52, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x56, 0x0a, 0x18, 0x73, 0x75, - 0x62, 0x73, 0x69, 0x64, 0x79, 0x5f, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x16, 0x73, 0x75, 0x62, 0x73, - 0x69, 0x64, 0x79, 0x52, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x12, 0x5a, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x75, - 0x62, 0x73, 0x69, 0x64, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, - 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x75, 0x62, - 0x73, 0x69, 0x64, 0x79, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x59, - 0x0a, 0x1a, 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, - 0x52, 0x17, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x74, 0x6f, 0x70, - 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x71, 0x75, 0x61, 0x6c, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, - 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x63, 0x51, 0x75, 0x61, 0x6c, 0x69, - 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x6f, 0x72, 0x6b, - 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x56, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x56, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x37, 0x0a, 0x18, - 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, - 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xfe, 0x05, 0x0a, 0x0b, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, 0x29, - 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, - 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x4d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x68, 0x69, 0x66, 0x74, 0x12, 0x40, 0x0a, 0x1d, 0x64, 0x65, - 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, - 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x19, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, - 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x12, - 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x70, 0x6f, - 0x63, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x6f, 0x63, 0x45, 0x78, - 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x30, - 0x0a, 0x14, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x70, 0x6f, - 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x61, 0x79, - 0x12, 0x36, 0x0a, 0x17, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x15, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x74, 0x5f, - 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x5f, 0x64, - 0x65, 0x6c, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x73, 0x65, 0x74, 0x4e, - 0x65, 0x77, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x44, 0x65, 0x6c, 0x61, - 0x79, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x75, 0x74, 0x6f, 0x66, 0x66, - 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x75, 0x74, 0x6f, 0x66, - 0x66, 0x12, 0x49, 0x0a, 0x21, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, - 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x32, 0x0a, 0x15, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, - 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x78, - 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x6f, 0x63, 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, - 0x6d, 0x61, 0x78, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x50, 0x72, - 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x78, 0x12, 0x4c, 0x0a, 0x13, 0x70, 0x6f, 0x63, 0x5f, - 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, - 0x6d, 0x61, 0x6c, 0x52, 0x11, 0x70, 0x6f, 0x63, 0x53, 0x6c, 0x6f, 0x74, 0x41, 0x6c, 0x6c, 0x6f, - 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x8e, 0x0e, 0x0a, - 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, 0x74, - 0x69, 0x76, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x11, 0x66, 0x61, - 0x6c, 0x73, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x52, 0x61, 0x74, 0x65, 0x12, - 0x37, 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x70, 0x5f, 0x6d, - 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x61, 0x6d, 0x70, 0x55, 0x70, 0x4d, 0x65, 0x61, 0x73, - 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x61, 0x73, 0x73, - 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x09, 0x70, 0x61, 0x73, 0x73, - 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, - 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x61, 0x78, - 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, 0x72, - 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x2b, 0x0a, - 0x11, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x54, 0x6f, 0x4d, 0x61, 0x78, 0x12, 0x43, - 0x0a, 0x1e, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x63, 0x75, 0x74, 0x6f, 0x66, 0x66, - 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1b, 0x66, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x43, 0x75, 0x74, - 0x6f, 0x66, 0x66, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x77, 0x61, 0x79, 0x18, 0x09, 0x20, + 0x61, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x6f, 0x0a, 0x1c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x61, 0x67, 0x65, 0x6e, + 0x74, 0x5f, 0x61, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, + 0x0d, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x19, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x3a, 0x25, 0xe8, 0xa0, 0x1f, 0x01, 0x8a, 0xe7, 0xb0, 0x2a, 0x1c, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x78, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0xb0, 0x07, 0x0a, 0x11, 0x47, 0x65, 0x6e, 0x65, + 0x73, 0x69, 0x73, 0x4f, 0x6e, 0x6c, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, + 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x73, + 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x6f, 0x72, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x2a, 0x0a, + 0x11, 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x34, 0x0a, 0x16, 0x73, 0x74, 0x61, + 0x6e, 0x64, 0x61, 0x72, 0x64, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x73, 0x74, 0x61, 0x6e, 0x64, + 0x61, 0x72, 0x64, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x3b, 0x0a, 0x1a, 0x70, 0x72, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, 0x65, + 0x64, 0x5f, 0x73, 0x61, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x17, 0x70, 0x72, 0x65, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x61, 0x6d, 0x6d, + 0x65, 0x64, 0x53, 0x61, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, + 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x21, 0x0a, + 0x0c, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x5f, 0x64, 0x65, 0x6e, 0x6f, 0x6d, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x44, 0x65, 0x6e, 0x6f, 0x6d, + 0x12, 0x2a, 0x0a, 0x11, 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x2c, 0x0a, 0x12, + 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x79, 0x6f, 0x75, + 0x74, 0x73, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x50, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x73, 0x12, 0x3e, 0x0a, 0x1c, 0x74, 0x6f, + 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x70, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x73, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x18, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x79, 0x6f, 0x75, + 0x74, 0x73, 0x50, 0x65, 0x72, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x35, 0x0a, 0x17, 0x74, 0x6f, + 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x64, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x74, 0x6f, 0x70, + 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x4d, 0x61, 0x78, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x63, 0x0a, 0x1f, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x64, 0x69, 0x76, 0x69, 0x64, + 0x75, 0x61, 0x6c, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x1c, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x64, + 0x69, 0x76, 0x69, 0x64, 0x75, 0x61, 0x6c, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x50, 0x65, 0x72, 0x63, + 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x38, 0x0a, 0x18, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, + 0x73, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, + 0x65, 0x64, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x08, 0x52, 0x16, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, + 0x73, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x5c, 0x0a, 0x2b, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x67, 0x75, 0x61, 0x72, + 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6d, 0x61, 0x74, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x27, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x47, 0x75, + 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x4e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x61, 0x74, + 0x75, 0x72, 0x69, 0x74, 0x79, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x5c, + 0x0a, 0x1b, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, + 0x61, 0x6e, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, - 0x6c, 0x52, 0x14, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x48, 0x61, 0x6c, 0x66, 0x77, 0x61, 0x79, 0x12, 0x41, 0x0a, 0x1d, 0x6d, 0x69, 0x6e, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, - 0x63, 0x5f, 0x63, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1a, - 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, - 0x66, 0x66, 0x69, 0x63, 0x43, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x69, - 0x73, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x63, 0x75, - 0x74, 0x6f, 0x66, 0x66, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x69, 0x73, 0x73, 0x50, 0x65, - 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x43, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x12, 0x50, - 0x0a, 0x15, 0x6d, 0x69, 0x73, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x5f, - 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x6c, 0x52, 0x19, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, + 0x61, 0x6e, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x3c, 0x0a, 0x1a, + 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x10, 0x20, 0x03, 0x28, 0x09, + 0x52, 0x18, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, + 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0xdf, 0x04, 0x0a, 0x10, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x5a, 0x0a, 0x1a, 0x73, 0x75, 0x62, 0x73, 0x69, 0x64, 0x79, 0x5f, 0x72, 0x65, 0x64, 0x75, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, + 0x6c, 0x52, 0x18, 0x73, 0x75, 0x62, 0x73, 0x69, 0x64, 0x79, 0x52, 0x65, 0x64, 0x75, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x12, 0x56, 0x0a, 0x18, 0x73, + 0x75, 0x62, 0x73, 0x69, 0x64, 0x79, 0x5f, 0x72, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x13, 0x6d, 0x69, 0x73, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, - 0x12, 0x31, 0x0a, 0x14, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x65, 0x78, - 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x5f, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, - 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, - 0x12, 0x40, 0x0a, 0x1d, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x69, - 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6b, - 0x62, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, - 0x65, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x4b, 0x62, 0x12, 0x5c, 0x0a, 0x1b, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x72, 0x65, - 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x16, 0x73, 0x75, 0x62, + 0x73, 0x69, 0x64, 0x79, 0x52, 0x65, 0x64, 0x75, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0x5a, 0x0a, 0x1a, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x75, 0x62, 0x73, 0x69, 0x64, 0x79, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, + 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, - 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x19, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x52, 0x65, - 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x12, 0x67, 0x0a, 0x21, 0x62, 0x61, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x1e, 0x62, 0x61, 0x64, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x18, 0x69, 0x6e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x16, 0x69, 0x6e, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x12, 0x56, 0x0a, 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, 0x6f, - 0x6f, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x13, 0x20, + 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x18, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x75, + 0x62, 0x73, 0x69, 0x64, 0x79, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, + 0x59, 0x0a, 0x1a, 0x74, 0x6f, 0x70, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, - 0x6c, 0x52, 0x16, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x6f, 0x6f, 0x64, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x17, 0x64, 0x6f, 0x77, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x62, 0x61, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, - 0x74, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, + 0x6c, 0x52, 0x17, 0x74, 0x6f, 0x70, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x65, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x3d, 0x0a, 0x1b, 0x74, 0x6f, + 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x71, 0x75, 0x61, 0x6c, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x18, 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x50, 0x6f, 0x63, 0x51, 0x75, 0x61, 0x6c, + 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2e, 0x0a, 0x13, 0x77, 0x6f, 0x72, + 0x6b, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x77, 0x6f, 0x72, 0x6b, 0x56, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x32, 0x0a, 0x15, 0x72, 0x65, 0x77, + 0x61, 0x72, 0x64, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x37, 0x0a, + 0x18, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x15, 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xfe, 0x05, 0x0a, + 0x0b, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, + 0x29, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, + 0x69, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x73, 0x68, 0x69, 0x66, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x68, 0x69, 0x66, 0x74, 0x12, 0x40, 0x0a, 0x1d, 0x64, + 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x63, + 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x19, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, + 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x0a, + 0x12, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x6f, 0x63, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x70, + 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x6f, 0x63, 0x45, + 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x30, 0x0a, 0x14, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x70, + 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x61, + 0x79, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x15, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x74, + 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x5f, + 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x73, 0x65, 0x74, + 0x4e, 0x65, 0x77, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x44, 0x65, 0x6c, + 0x61, 0x79, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x75, 0x74, 0x6f, 0x66, + 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x75, 0x74, 0x6f, + 0x66, 0x66, 0x12, 0x49, 0x0a, 0x21, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, + 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x32, 0x0a, + 0x15, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, + 0x6e, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x61, + 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x6f, 0x63, 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x50, + 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x78, 0x12, 0x4c, 0x0a, 0x13, 0x70, 0x6f, 0x63, + 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, + 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x11, 0x70, 0x6f, 0x63, 0x53, 0x6c, 0x6f, 0x74, 0x41, 0x6c, 0x6c, + 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x8e, 0x0e, + 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x76, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x11, 0x66, + 0x61, 0x6c, 0x73, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x52, 0x61, 0x74, 0x65, + 0x12, 0x37, 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x70, 0x5f, + 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x61, 0x6d, 0x70, 0x55, 0x70, 0x4d, 0x65, 0x61, + 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x61, 0x73, + 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x09, 0x70, 0x61, 0x73, + 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, + 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x61, + 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x15, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x42, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, - 0x4e, 0x0a, 0x14, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x68, 0x5f, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x2b, + 0x0a, 0x11, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x54, 0x6f, 0x4d, 0x61, 0x78, 0x12, + 0x43, 0x0a, 0x1e, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x63, 0x75, 0x74, 0x6f, 0x66, + 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1b, 0x66, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x43, 0x75, + 0x74, 0x6f, 0x66, 0x66, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x77, 0x61, 0x79, 0x18, 0x09, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, + 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x48, 0x61, 0x6c, 0x66, 0x77, 0x61, 0x79, 0x12, 0x41, 0x0a, 0x1d, 0x6d, 0x69, 0x6e, 0x5f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x5f, 0x63, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x1a, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x43, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x12, 0x52, 0x0a, 0x16, 0x6d, + 0x69, 0x73, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x63, + 0x75, 0x74, 0x6f, 0x66, 0x66, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x69, 0x73, 0x73, 0x50, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x43, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x12, + 0x50, 0x0a, 0x15, 0x6d, 0x69, 0x73, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, + 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x13, 0x6d, 0x69, + 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, + 0x79, 0x12, 0x31, 0x0a, 0x14, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x5f, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x10, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, + 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x6b, 0x62, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, + 0x74, 0x65, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x4b, 0x62, 0x12, 0x5c, 0x0a, 0x1b, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x72, + 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, + 0x76, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x19, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x52, + 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, + 0x65, 0x12, 0x67, 0x0a, 0x21, 0x62, 0x61, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x1e, 0x62, 0x61, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x18, 0x69, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x5f, 0x74, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x16, 0x69, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x12, 0x56, 0x0a, 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, + 0x6f, 0x6f, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x13, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, + 0x61, 0x6c, 0x52, 0x16, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x6f, 0x6f, 0x64, + 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x17, 0x64, 0x6f, + 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x62, 0x61, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x15, 0x64, 0x6f, 0x77, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x42, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, + 0x12, 0x4e, 0x0a, 0x14, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x68, 0x5f, 0x74, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x12, 0x64, 0x6f, + 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x12, 0x5e, 0x0a, 0x1c, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x70, + 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, + 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x1a, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, + 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x12, 0x54, 0x0a, 0x17, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, + 0x15, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x69, 0x6e, 0x6f, 0x6d, 0x5f, + 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x30, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x12, 0x64, 0x6f, 0x77, - 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, - 0x5e, 0x0a, 0x1c, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x75, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x18, - 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, - 0x6d, 0x61, 0x6c, 0x52, 0x1a, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, 0x70, - 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x12, - 0x54, 0x0a, 0x17, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, - 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, 0x0b, + 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0b, 0x62, 0x69, 0x6e, + 0x6f, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x50, 0x30, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xd8, + 0x03, 0x0a, 0x0e, 0x50, 0x6f, 0x43, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, + 0x64, 0x69, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x17, + 0x0a, 0x07, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x06, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x0a, 0x6e, 0x5f, 0x6b, 0x76, 0x5f, + 0x68, 0x65, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x4b, 0x76, + 0x48, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x5f, 0x73, + 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x76, 0x6f, 0x63, 0x61, 0x62, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x66, 0x66, 0x6e, 0x5f, 0x64, 0x69, 0x6d, 0x5f, + 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x15, - 0x71, 0x75, 0x69, 0x63, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x54, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x69, 0x6e, 0x6f, 0x6d, 0x5f, 0x74, - 0x65, 0x73, 0x74, 0x5f, 0x70, 0x30, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x10, + 0x66, 0x66, 0x6e, 0x44, 0x69, 0x6d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, + 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, + 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, + 0x66, 0x12, 0x37, 0x0a, 0x08, 0x6e, 0x6f, 0x72, 0x6d, 0x5f, 0x65, 0x70, 0x73, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, + 0x6c, 0x52, 0x07, 0x6e, 0x6f, 0x72, 0x6d, 0x45, 0x70, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, + 0x70, 0x65, 0x5f, 0x74, 0x68, 0x65, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, + 0x72, 0x6f, 0x70, 0x65, 0x54, 0x68, 0x65, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x73, 0x65, + 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x70, + 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x65, 0x71, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x06, 0x73, 0x65, 0x71, 0x4c, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x72, 0x5f, + 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0b, 0x62, 0x69, 0x6e, 0x6f, - 0x6d, 0x54, 0x65, 0x73, 0x74, 0x50, 0x30, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xd8, 0x03, - 0x0a, 0x0e, 0x50, 0x6f, 0x43, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, 0x64, - 0x69, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x17, 0x0a, - 0x07, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, - 0x6e, 0x48, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x0a, 0x6e, 0x5f, 0x6b, 0x76, 0x5f, 0x68, - 0x65, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x4b, 0x76, 0x48, - 0x65, 0x61, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x5f, 0x73, 0x69, - 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x66, 0x66, 0x6e, 0x5f, 0x64, 0x69, 0x6d, 0x5f, 0x6d, - 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x10, 0x66, - 0x66, 0x6e, 0x44, 0x69, 0x6d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x12, - 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, 0x07, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, 0x66, - 0x12, 0x37, 0x0a, 0x08, 0x6e, 0x6f, 0x72, 0x6d, 0x5f, 0x65, 0x70, 0x73, 0x18, 0x08, 0x20, 0x01, + 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x07, 0x72, 0x54, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xe5, 0x01, 0x0a, 0x11, 0x50, 0x6f, + 0x43, 0x53, 0x74, 0x61, 0x74, 0x54, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x43, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, + 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x5f, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, + 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x09, 0x70, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, + 0x68, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x70, 0x56, 0x61, 0x6c, + 0x75, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, + 0x01, 0x22, 0xb6, 0x04, 0x0a, 0x09, 0x50, 0x6f, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, + 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x69, + 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x64, 0x65, 0x66, + 0x61, 0x75, 0x6c, 0x74, 0x44, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x34, + 0x0a, 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, + 0x53, 0x69, 0x7a, 0x65, 0x12, 0x46, 0x0a, 0x20, 0x70, 0x6f, 0x63, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1c, + 0x70, 0x6f, 0x63, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x4c, 0x0a, 0x13, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x66, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x11, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x53, + 0x63, 0x61, 0x6c, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4a, 0x0a, 0x0c, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, + 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, + 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x65, 0x71, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x06, 0x73, 0x65, 0x71, 0x4c, 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x6f, + 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0c, 0x70, 0x6f, 0x63, 0x56, 0x32, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, + 0x43, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x53, 0x74, 0x61, 0x74, + 0x54, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, + 0x54, 0x65, 0x73, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x41, 0x0a, 0x07, 0x44, 0x65, + 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, + 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, + 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x8b, 0x04, + 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x16, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x66, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, - 0x52, 0x07, 0x6e, 0x6f, 0x72, 0x6d, 0x45, 0x70, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, 0x70, - 0x65, 0x5f, 0x74, 0x68, 0x65, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x72, - 0x6f, 0x70, 0x65, 0x54, 0x68, 0x65, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x73, 0x65, 0x5f, - 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x70, 0x65, - 0x12, 0x17, 0x0a, 0x07, 0x73, 0x65, 0x71, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x06, 0x73, 0x65, 0x71, 0x4c, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x72, 0x5f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x07, 0x72, 0x54, 0x61, 0x72, 0x67, - 0x65, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xe5, 0x01, 0x0a, 0x11, 0x50, 0x6f, 0x43, - 0x53, 0x74, 0x61, 0x74, 0x54, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x43, - 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, - 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x5f, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x52, 0x14, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, + 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x54, 0x0a, 0x17, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, + 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, - 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x09, 0x70, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, - 0x12, 0x48, 0x0a, 0x11, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, - 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, + 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x15, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x6d, 0x0a, 0x24, + 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x5f, + 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x21, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x4d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, + 0x67, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x33, 0x0a, 0x16, 0x67, + 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x5f, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x67, 0x72, 0x61, + 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x12, 0x48, 0x0a, 0x11, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x70, 0x56, 0x61, 0x6c, 0x75, - 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, - 0x22, 0xb6, 0x04, 0x0a, 0x09, 0x50, 0x6f, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2d, - 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x69, 0x63, - 0x75, 0x6c, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x64, 0x65, 0x66, 0x61, - 0x75, 0x6c, 0x74, 0x44, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x34, 0x0a, - 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x53, - 0x69, 0x7a, 0x65, 0x12, 0x46, 0x0a, 0x20, 0x70, 0x6f, 0x63, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x5f, - 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1c, 0x70, - 0x6f, 0x63, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x4c, 0x0a, 0x13, 0x77, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x66, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, - 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x11, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x53, 0x63, - 0x61, 0x6c, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4a, 0x0a, 0x0c, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, - 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, - 0x12, 0x17, 0x0a, 0x07, 0x73, 0x65, 0x71, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x06, 0x73, 0x65, 0x71, 0x4c, 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x6f, 0x63, - 0x5f, 0x76, 0x32, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x0c, 0x70, 0x6f, 0x63, 0x56, 0x32, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x3d, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, - 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, 0x43, - 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x53, 0x74, 0x61, 0x74, 0x54, - 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, 0x54, - 0x65, 0x73, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x41, 0x0a, 0x07, 0x44, 0x65, 0x63, - 0x69, 0x6d, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, - 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x8b, 0x04, 0x0a, - 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x52, 0x0a, 0x16, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x62, 0x61, 0x73, 0x65, 0x57, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x59, 0x0a, 0x1a, 0x63, 0x6f, + 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x17, 0x63, 0x6f, + 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x57, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x55, 0x6e, 0x69, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xf3, 0x03, 0x0a, 0x13, + 0x42, 0x69, 0x74, 0x63, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x63, 0x6f, + 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, + 0x52, 0x11, 0x75, 0x73, 0x65, 0x42, 0x69, 0x74, 0x63, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x77, 0x61, + 0x72, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x12, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, + 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x72, + 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x09, 0x64, 0x65, 0x63, 0x61, 0x79, 0x52, 0x61, + 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, + 0x69, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x56, 0x0a, 0x18, 0x75, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x66, 0x61, 0x63, + 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x16, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6e, 0x75, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, + 0x59, 0x0a, 0x1a, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x5f, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, + 0x6c, 0x52, 0x17, 0x66, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x42, + 0x6f, 0x6e, 0x75, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5f, 0x0a, 0x1d, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, + 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, - 0x14, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x54, 0x0a, 0x17, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x66, - 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, - 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x15, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x6d, 0x0a, 0x24, 0x64, - 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x70, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x1a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x42, 0x6f, 0x6e, 0x75, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, + 0x01, 0x22, 0xb0, 0x04, 0x0a, 0x14, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x72, 0x69, + 0x63, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x59, 0x0a, 0x1a, 0x73, 0x74, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x6c, 0x6f, 0x77, + 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x17, 0x73, 0x74, + 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5a, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x77, 0x65, 0x72, + 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x59, 0x0a, 0x1a, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x21, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x4d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, - 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x33, 0x0a, 0x16, 0x67, 0x72, - 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x67, 0x72, 0x61, 0x63, - 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, - 0x48, 0x0a, 0x11, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, + 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x17, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x5a, 0x6f, 0x6e, 0x65, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x12, 0x47, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x62, 0x61, 0x73, 0x65, 0x57, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x59, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, - 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x17, 0x63, 0x6f, 0x6c, - 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x55, 0x6e, 0x69, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xf3, 0x03, 0x0a, 0x13, 0x42, - 0x69, 0x74, 0x63, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x63, 0x6f, 0x69, - 0x6e, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x11, 0x75, 0x73, 0x65, 0x42, 0x69, 0x74, 0x63, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, - 0x64, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x12, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x72, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, - 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x09, 0x64, 0x65, 0x63, 0x61, 0x79, 0x52, 0x61, 0x74, - 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x56, 0x0a, 0x18, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, - 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x45, + 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x1b, 0x75, 0x74, 0x69, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, + 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, + 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, + 0x77, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x69, 0x6e, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x50, 0x65, 0x72, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x62, 0x61, 0x73, 0x65, + 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x62, 0x61, 0x73, 0x65, 0x50, 0x65, 0x72, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x67, 0x72, 0x61, + 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x67, 0x72, 0x61, 0x63, 0x65, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3e, + 0x0a, 0x1c, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x70, + 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x08, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, 0x67, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x3a, 0x04, + 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xa7, 0x04, 0x0a, 0x15, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, + 0x74, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x40, + 0x0a, 0x1d, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6b, 0x62, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, + 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4b, 0x62, + 0x12, 0x49, 0x0a, 0x12, 0x6b, 0x62, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x6b, 0x62, 0x50, 0x65, + 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x4b, 0x0a, 0x13, 0x6b, + 0x62, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, - 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x16, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6e, 0x75, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x59, - 0x0a, 0x1a, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, - 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, - 0x52, 0x17, 0x66, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x42, 0x6f, - 0x6e, 0x75, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5f, 0x0a, 0x1d, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x6f, - 0x6e, 0x75, 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x10, 0x6b, 0x62, 0x50, 0x65, 0x72, 0x4f, 0x75, 0x74, + 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2f, 0x0a, 0x13, 0x69, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, + 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, + 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x61, 0x6d, + 0x70, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x69, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, + 0x5f, 0x63, 0x75, 0x72, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x69, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x43, 0x75, 0x72, 0x76, 0x65, 0x12, 0x48, 0x0a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x1e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, + 0x37, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xae, + 0x02, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x43, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x20, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x1d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x12, 0x45, 0x0a, 0x0f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0e, 0x73, 0x6c, 0x61, 0x73, + 0x68, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x1a, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x42, - 0x6f, 0x6e, 0x75, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, - 0x22, 0xb0, 0x04, 0x0a, 0x14, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x72, 0x69, 0x63, - 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x59, 0x0a, 0x1a, 0x73, 0x74, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x65, - 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x17, 0x73, 0x74, 0x61, - 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5a, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, - 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x59, 0x0a, 0x1a, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, - 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, - 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x17, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, - 0x79, 0x5a, 0x6f, 0x6e, 0x65, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, - 0x47, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, - 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x45, 0x6c, - 0x61, 0x73, 0x74, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x1b, 0x75, 0x74, 0x69, 0x6c, - 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x64, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x75, - 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x62, 0x61, 0x73, 0x65, 0x5f, - 0x70, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x62, 0x61, 0x73, 0x65, 0x50, 0x65, 0x72, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x67, 0x72, 0x61, 0x63, - 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x67, 0x72, 0x61, 0x63, 0x65, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3e, 0x0a, - 0x1c, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x70, 0x65, - 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x18, 0x67, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, - 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x3a, 0x04, 0xe8, - 0xa0, 0x1f, 0x01, 0x22, 0xa7, 0x04, 0x0a, 0x15, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, - 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x40, 0x0a, - 0x1d, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6b, 0x62, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x4c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4b, 0x62, 0x12, - 0x49, 0x0a, 0x12, 0x6b, 0x62, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x6b, 0x62, 0x50, 0x65, 0x72, - 0x49, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x4b, 0x0a, 0x13, 0x6b, 0x62, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, - 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x10, 0x6b, 0x62, 0x50, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, - 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2f, 0x0a, 0x13, 0x69, 0x6e, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x69, - 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x61, 0x6d, 0x70, - 0x6c, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x69, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, - 0x63, 0x75, 0x72, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x69, 0x6e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, - 0x75, 0x72, 0x76, 0x65, 0x12, 0x48, 0x0a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, - 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1e, - 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, - 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x15, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x50, - 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xae, 0x02, - 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x43, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, - 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x1d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x12, 0x45, 0x0a, 0x0f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, - 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x54, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0e, 0x73, 0x6c, 0x61, 0x73, 0x68, - 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0d, 0x73, - 0x6c, 0x61, 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, - 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x17, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xc9, - 0x01, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, - 0x61, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x6e, 0x65, 0x74, 0x77, - 0x6f, 0x72, 0x6b, 0x5f, 0x6d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3d, 0x0a, 0x1b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, - 0x6b, 0x5f, 0x6d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4d, 0x69, 0x6e, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, - 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, - 0x09, 0x52, 0x11, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x8b, 0x01, 0x0a, 0x15, 0x44, - 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x10, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x3e, 0x0a, 0x1b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x64, 0x65, - 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x19, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, - 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xd1, 0x02, 0x0a, 0x17, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x58, 0x0a, 0x29, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x25, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x42, - 0x0a, 0x1d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, - 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x75, 0x73, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x56, - 0x0a, 0x28, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x24, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, - 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x42, 0xb9, 0x01, 0x0a, - 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, - 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xa2, 0x02, 0x03, - 0x49, 0x49, 0x58, 0xaa, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xca, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xe2, - 0x02, 0x1f, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0xea, 0x02, 0x14, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x3a, 0x49, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0d, + 0x73, 0x6c, 0x61, 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, + 0x19, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x17, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, + 0xc9, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x47, 0x75, 0x61, 0x72, 0x64, + 0x69, 0x61, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x6e, 0x65, 0x74, + 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x6e, + 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x54, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3d, 0x0a, 0x1b, 0x6e, 0x65, 0x74, 0x77, 0x6f, + 0x72, 0x6b, 0x5f, 0x6d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x6e, 0x65, + 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4d, 0x69, 0x6e, + 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, + 0x61, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x11, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x8b, 0x01, 0x0a, 0x15, + 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x10, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x12, 0x3e, 0x0a, 0x1b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x64, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x19, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, + 0x64, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xd1, 0x02, 0x0a, 0x17, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x58, 0x0a, 0x29, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x25, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, + 0x42, 0x0a, 0x1d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x75, 0x73, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x12, + 0x56, 0x0a, 0x28, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x24, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, + 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x42, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x5f, 0x0a, + 0x19, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x63, + 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x61, 0x6c, + 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x42, 0xb9, + 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0b, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xa2, + 0x02, 0x03, 0x49, 0x49, 0x58, 0xaa, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xca, 0x02, 0x13, 0x49, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0xe2, 0x02, 0x1f, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0xea, 0x02, 0x14, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, + 0x3a, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -17510,25 +18130,26 @@ func file_inference_inference_params_proto_rawDescGZIP() []byte { return file_inference_inference_params_proto_rawDescData } -var file_inference_inference_params_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_inference_inference_params_proto_msgTypes = make([]protoimpl.MessageInfo, 18) var file_inference_inference_params_proto_goTypes = []interface{}{ - (*Params)(nil), // 0: inference.inference.Params - (*GenesisOnlyParams)(nil), // 1: inference.inference.GenesisOnlyParams - (*TokenomicsParams)(nil), // 2: inference.inference.TokenomicsParams - (*EpochParams)(nil), // 3: inference.inference.EpochParams - (*ValidationParams)(nil), // 4: inference.inference.ValidationParams - (*PoCModelParams)(nil), // 5: inference.inference.PoCModelParams - (*PoCStatTestParams)(nil), // 6: inference.inference.PoCStatTestParams - (*PocParams)(nil), // 7: inference.inference.PocParams - (*Decimal)(nil), // 8: inference.inference.Decimal - (*CollateralParams)(nil), // 9: inference.inference.CollateralParams - (*BitcoinRewardParams)(nil), // 10: inference.inference.BitcoinRewardParams - (*DynamicPricingParams)(nil), // 11: inference.inference.DynamicPricingParams - (*BandwidthLimitsParams)(nil), // 12: inference.inference.BandwidthLimitsParams - (*ConfirmationPoCParams)(nil), // 13: inference.inference.ConfirmationPoCParams - (*GenesisGuardianParams)(nil), // 14: inference.inference.GenesisGuardianParams - (*DeveloperAccessParams)(nil), // 15: inference.inference.DeveloperAccessParams - (*ParticipantAccessParams)(nil), // 16: inference.inference.ParticipantAccessParams + (*Params)(nil), // 0: inference.inference.Params + (*GenesisOnlyParams)(nil), // 1: inference.inference.GenesisOnlyParams + (*TokenomicsParams)(nil), // 2: inference.inference.TokenomicsParams + (*EpochParams)(nil), // 3: inference.inference.EpochParams + (*ValidationParams)(nil), // 4: inference.inference.ValidationParams + (*PoCModelParams)(nil), // 5: inference.inference.PoCModelParams + (*PoCStatTestParams)(nil), // 6: inference.inference.PoCStatTestParams + (*PocParams)(nil), // 7: inference.inference.PocParams + (*Decimal)(nil), // 8: inference.inference.Decimal + (*CollateralParams)(nil), // 9: inference.inference.CollateralParams + (*BitcoinRewardParams)(nil), // 10: inference.inference.BitcoinRewardParams + (*DynamicPricingParams)(nil), // 11: inference.inference.DynamicPricingParams + (*BandwidthLimitsParams)(nil), // 12: inference.inference.BandwidthLimitsParams + (*ConfirmationPoCParams)(nil), // 13: inference.inference.ConfirmationPoCParams + (*GenesisGuardianParams)(nil), // 14: inference.inference.GenesisGuardianParams + (*DeveloperAccessParams)(nil), // 15: inference.inference.DeveloperAccessParams + (*ParticipantAccessParams)(nil), // 16: inference.inference.ParticipantAccessParams + (*TransferAgentAccessParams)(nil), // 17: inference.inference.TransferAgentAccessParams } var file_inference_inference_params_proto_depIdxs = []int32{ 3, // 0: inference.inference.Params.epoch_params:type_name -> inference.inference.EpochParams @@ -17543,59 +18164,60 @@ var file_inference_inference_params_proto_depIdxs = []int32{ 14, // 9: inference.inference.Params.genesis_guardian_params:type_name -> inference.inference.GenesisGuardianParams 15, // 10: inference.inference.Params.developer_access_params:type_name -> inference.inference.DeveloperAccessParams 16, // 11: inference.inference.Params.participant_access_params:type_name -> inference.inference.ParticipantAccessParams - 8, // 12: inference.inference.GenesisOnlyParams.max_individual_power_percentage:type_name -> inference.inference.Decimal - 8, // 13: inference.inference.GenesisOnlyParams.genesis_guardian_multiplier:type_name -> inference.inference.Decimal - 8, // 14: inference.inference.TokenomicsParams.subsidy_reduction_interval:type_name -> inference.inference.Decimal - 8, // 15: inference.inference.TokenomicsParams.subsidy_reduction_amount:type_name -> inference.inference.Decimal - 8, // 16: inference.inference.TokenomicsParams.current_subsidy_percentage:type_name -> inference.inference.Decimal - 8, // 17: inference.inference.TokenomicsParams.top_reward_allowed_failure:type_name -> inference.inference.Decimal - 8, // 18: inference.inference.EpochParams.poc_slot_allocation:type_name -> inference.inference.Decimal - 8, // 19: inference.inference.ValidationParams.false_positive_rate:type_name -> inference.inference.Decimal - 8, // 20: inference.inference.ValidationParams.pass_value:type_name -> inference.inference.Decimal - 8, // 21: inference.inference.ValidationParams.min_validation_average:type_name -> inference.inference.Decimal - 8, // 22: inference.inference.ValidationParams.max_validation_average:type_name -> inference.inference.Decimal - 8, // 23: inference.inference.ValidationParams.min_validation_halfway:type_name -> inference.inference.Decimal - 8, // 24: inference.inference.ValidationParams.miss_percentage_cutoff:type_name -> inference.inference.Decimal - 8, // 25: inference.inference.ValidationParams.miss_requests_penalty:type_name -> inference.inference.Decimal - 8, // 26: inference.inference.ValidationParams.invalid_reputation_preserve:type_name -> inference.inference.Decimal - 8, // 27: inference.inference.ValidationParams.bad_participant_invalidation_rate:type_name -> inference.inference.Decimal - 8, // 28: inference.inference.ValidationParams.invalidation_h_threshold:type_name -> inference.inference.Decimal - 8, // 29: inference.inference.ValidationParams.downtime_good_percentage:type_name -> inference.inference.Decimal - 8, // 30: inference.inference.ValidationParams.downtime_bad_percentage:type_name -> inference.inference.Decimal - 8, // 31: inference.inference.ValidationParams.downtime_h_threshold:type_name -> inference.inference.Decimal - 8, // 32: inference.inference.ValidationParams.downtime_reputation_preserve:type_name -> inference.inference.Decimal - 8, // 33: inference.inference.ValidationParams.quick_failure_threshold:type_name -> inference.inference.Decimal - 8, // 34: inference.inference.ValidationParams.binom_test_p0:type_name -> inference.inference.Decimal - 8, // 35: inference.inference.PoCModelParams.ffn_dim_multiplier:type_name -> inference.inference.Decimal - 8, // 36: inference.inference.PoCModelParams.norm_eps:type_name -> inference.inference.Decimal - 8, // 37: inference.inference.PoCModelParams.r_target:type_name -> inference.inference.Decimal - 8, // 38: inference.inference.PoCStatTestParams.dist_threshold:type_name -> inference.inference.Decimal - 8, // 39: inference.inference.PoCStatTestParams.p_mismatch:type_name -> inference.inference.Decimal - 8, // 40: inference.inference.PoCStatTestParams.p_value_threshold:type_name -> inference.inference.Decimal - 8, // 41: inference.inference.PocParams.weight_scale_factor:type_name -> inference.inference.Decimal - 5, // 42: inference.inference.PocParams.model_params:type_name -> inference.inference.PoCModelParams - 6, // 43: inference.inference.PocParams.stat_test:type_name -> inference.inference.PoCStatTestParams - 8, // 44: inference.inference.CollateralParams.slash_fraction_invalid:type_name -> inference.inference.Decimal - 8, // 45: inference.inference.CollateralParams.slash_fraction_downtime:type_name -> inference.inference.Decimal - 8, // 46: inference.inference.CollateralParams.downtime_missed_percentage_threshold:type_name -> inference.inference.Decimal - 8, // 47: inference.inference.CollateralParams.base_weight_ratio:type_name -> inference.inference.Decimal - 8, // 48: inference.inference.CollateralParams.collateral_per_weight_unit:type_name -> inference.inference.Decimal - 8, // 49: inference.inference.BitcoinRewardParams.decay_rate:type_name -> inference.inference.Decimal - 8, // 50: inference.inference.BitcoinRewardParams.utilization_bonus_factor:type_name -> inference.inference.Decimal - 8, // 51: inference.inference.BitcoinRewardParams.full_coverage_bonus_factor:type_name -> inference.inference.Decimal - 8, // 52: inference.inference.BitcoinRewardParams.partial_coverage_bonus_factor:type_name -> inference.inference.Decimal - 8, // 53: inference.inference.DynamicPricingParams.stability_zone_lower_bound:type_name -> inference.inference.Decimal - 8, // 54: inference.inference.DynamicPricingParams.stability_zone_upper_bound:type_name -> inference.inference.Decimal - 8, // 55: inference.inference.DynamicPricingParams.price_elasticity:type_name -> inference.inference.Decimal - 8, // 56: inference.inference.BandwidthLimitsParams.kb_per_input_token:type_name -> inference.inference.Decimal - 8, // 57: inference.inference.BandwidthLimitsParams.kb_per_output_token:type_name -> inference.inference.Decimal - 8, // 58: inference.inference.ConfirmationPoCParams.alpha_threshold:type_name -> inference.inference.Decimal - 8, // 59: inference.inference.ConfirmationPoCParams.slash_fraction:type_name -> inference.inference.Decimal - 60, // [60:60] is the sub-list for method output_type - 60, // [60:60] is the sub-list for method input_type - 60, // [60:60] is the sub-list for extension type_name - 60, // [60:60] is the sub-list for extension extendee - 0, // [0:60] is the sub-list for field type_name + 17, // 12: inference.inference.Params.transfer_agent_access_params:type_name -> inference.inference.TransferAgentAccessParams + 8, // 13: inference.inference.GenesisOnlyParams.max_individual_power_percentage:type_name -> inference.inference.Decimal + 8, // 14: inference.inference.GenesisOnlyParams.genesis_guardian_multiplier:type_name -> inference.inference.Decimal + 8, // 15: inference.inference.TokenomicsParams.subsidy_reduction_interval:type_name -> inference.inference.Decimal + 8, // 16: inference.inference.TokenomicsParams.subsidy_reduction_amount:type_name -> inference.inference.Decimal + 8, // 17: inference.inference.TokenomicsParams.current_subsidy_percentage:type_name -> inference.inference.Decimal + 8, // 18: inference.inference.TokenomicsParams.top_reward_allowed_failure:type_name -> inference.inference.Decimal + 8, // 19: inference.inference.EpochParams.poc_slot_allocation:type_name -> inference.inference.Decimal + 8, // 20: inference.inference.ValidationParams.false_positive_rate:type_name -> inference.inference.Decimal + 8, // 21: inference.inference.ValidationParams.pass_value:type_name -> inference.inference.Decimal + 8, // 22: inference.inference.ValidationParams.min_validation_average:type_name -> inference.inference.Decimal + 8, // 23: inference.inference.ValidationParams.max_validation_average:type_name -> inference.inference.Decimal + 8, // 24: inference.inference.ValidationParams.min_validation_halfway:type_name -> inference.inference.Decimal + 8, // 25: inference.inference.ValidationParams.miss_percentage_cutoff:type_name -> inference.inference.Decimal + 8, // 26: inference.inference.ValidationParams.miss_requests_penalty:type_name -> inference.inference.Decimal + 8, // 27: inference.inference.ValidationParams.invalid_reputation_preserve:type_name -> inference.inference.Decimal + 8, // 28: inference.inference.ValidationParams.bad_participant_invalidation_rate:type_name -> inference.inference.Decimal + 8, // 29: inference.inference.ValidationParams.invalidation_h_threshold:type_name -> inference.inference.Decimal + 8, // 30: inference.inference.ValidationParams.downtime_good_percentage:type_name -> inference.inference.Decimal + 8, // 31: inference.inference.ValidationParams.downtime_bad_percentage:type_name -> inference.inference.Decimal + 8, // 32: inference.inference.ValidationParams.downtime_h_threshold:type_name -> inference.inference.Decimal + 8, // 33: inference.inference.ValidationParams.downtime_reputation_preserve:type_name -> inference.inference.Decimal + 8, // 34: inference.inference.ValidationParams.quick_failure_threshold:type_name -> inference.inference.Decimal + 8, // 35: inference.inference.ValidationParams.binom_test_p0:type_name -> inference.inference.Decimal + 8, // 36: inference.inference.PoCModelParams.ffn_dim_multiplier:type_name -> inference.inference.Decimal + 8, // 37: inference.inference.PoCModelParams.norm_eps:type_name -> inference.inference.Decimal + 8, // 38: inference.inference.PoCModelParams.r_target:type_name -> inference.inference.Decimal + 8, // 39: inference.inference.PoCStatTestParams.dist_threshold:type_name -> inference.inference.Decimal + 8, // 40: inference.inference.PoCStatTestParams.p_mismatch:type_name -> inference.inference.Decimal + 8, // 41: inference.inference.PoCStatTestParams.p_value_threshold:type_name -> inference.inference.Decimal + 8, // 42: inference.inference.PocParams.weight_scale_factor:type_name -> inference.inference.Decimal + 5, // 43: inference.inference.PocParams.model_params:type_name -> inference.inference.PoCModelParams + 6, // 44: inference.inference.PocParams.stat_test:type_name -> inference.inference.PoCStatTestParams + 8, // 45: inference.inference.CollateralParams.slash_fraction_invalid:type_name -> inference.inference.Decimal + 8, // 46: inference.inference.CollateralParams.slash_fraction_downtime:type_name -> inference.inference.Decimal + 8, // 47: inference.inference.CollateralParams.downtime_missed_percentage_threshold:type_name -> inference.inference.Decimal + 8, // 48: inference.inference.CollateralParams.base_weight_ratio:type_name -> inference.inference.Decimal + 8, // 49: inference.inference.CollateralParams.collateral_per_weight_unit:type_name -> inference.inference.Decimal + 8, // 50: inference.inference.BitcoinRewardParams.decay_rate:type_name -> inference.inference.Decimal + 8, // 51: inference.inference.BitcoinRewardParams.utilization_bonus_factor:type_name -> inference.inference.Decimal + 8, // 52: inference.inference.BitcoinRewardParams.full_coverage_bonus_factor:type_name -> inference.inference.Decimal + 8, // 53: inference.inference.BitcoinRewardParams.partial_coverage_bonus_factor:type_name -> inference.inference.Decimal + 8, // 54: inference.inference.DynamicPricingParams.stability_zone_lower_bound:type_name -> inference.inference.Decimal + 8, // 55: inference.inference.DynamicPricingParams.stability_zone_upper_bound:type_name -> inference.inference.Decimal + 8, // 56: inference.inference.DynamicPricingParams.price_elasticity:type_name -> inference.inference.Decimal + 8, // 57: inference.inference.BandwidthLimitsParams.kb_per_input_token:type_name -> inference.inference.Decimal + 8, // 58: inference.inference.BandwidthLimitsParams.kb_per_output_token:type_name -> inference.inference.Decimal + 8, // 59: inference.inference.ConfirmationPoCParams.alpha_threshold:type_name -> inference.inference.Decimal + 8, // 60: inference.inference.ConfirmationPoCParams.slash_fraction:type_name -> inference.inference.Decimal + 61, // [61:61] is the sub-list for method output_type + 61, // [61:61] is the sub-list for method input_type + 61, // [61:61] is the sub-list for extension type_name + 61, // [61:61] is the sub-list for extension extendee + 0, // [0:61] is the sub-list for field type_name } func init() { file_inference_inference_params_proto_init() } @@ -17808,6 +18430,18 @@ func file_inference_inference_params_proto_init() { return nil } } + file_inference_inference_params_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*TransferAgentAccessParams); 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{ @@ -17815,7 +18449,7 @@ func file_inference_inference_params_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_inference_inference_params_proto_rawDesc, NumEnums: 0, - NumMessages: 17, + NumMessages: 18, NumExtensions: 0, NumServices: 0, }, diff --git a/inference-chain/api/inference/inference/query.pulsar.go b/inference-chain/api/inference/inference/query.pulsar.go index b5d5afe5e..bbfff4185 100644 --- a/inference-chain/api/inference/inference/query.pulsar.go +++ b/inference-chain/api/inference/inference/query.pulsar.go @@ -51332,7 +51332,7 @@ func (x *QueryDebugStatsResponse_TemporaryTimeStat) ProtoReflect() protoreflect. } func (x *QueryDebugStatsResponse_TemporaryTimeStat) slowProtoReflect() protoreflect.Message { - mi := &file_inference_inference_query_proto_msgTypes[174] + mi := &file_inference_inference_query_proto_msgTypes[176] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -51890,7 +51890,7 @@ func (x *QueryDebugStatsResponse_TemporaryEpochStat) ProtoReflect() protoreflect } func (x *QueryDebugStatsResponse_TemporaryEpochStat) slowProtoReflect() protoreflect.Message { - mi := &file_inference_inference_query_proto_msgTypes[175] + mi := &file_inference_inference_query_proto_msgTypes[177] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -81894,276 +81894,1174 @@ func (x *fastReflection_QueryParticipantsWithBalancesResponse) ProtoMethods() *p } } -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.0 -// protoc (unknown) -// source: inference/inference/query.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) +var ( + md_QueryRandomSeedsRequest protoreflect.MessageDescriptor + fd_QueryRandomSeedsRequest_epoch_index protoreflect.FieldDescriptor ) -// QueryParamsRequest is request type for the Query/Params RPC method. -type QueryParamsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +func init() { + file_inference_inference_query_proto_init() + md_QueryRandomSeedsRequest = File_inference_inference_query_proto.Messages().ByName("QueryRandomSeedsRequest") + fd_QueryRandomSeedsRequest_epoch_index = md_QueryRandomSeedsRequest.Fields().ByName("epoch_index") } -func (x *QueryParamsRequest) Reset() { - *x = QueryParamsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[0] +var _ protoreflect.Message = (*fastReflection_QueryRandomSeedsRequest)(nil) + +type fastReflection_QueryRandomSeedsRequest QueryRandomSeedsRequest + +func (x *QueryRandomSeedsRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryRandomSeedsRequest)(x) +} + +func (x *QueryRandomSeedsRequest) slowProtoReflect() protoreflect.Message { + mi := &file_inference_inference_query_proto_msgTypes[174] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } + return mi.MessageOf(x) } -func (x *QueryParamsRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} +var _fastReflection_QueryRandomSeedsRequest_messageType fastReflection_QueryRandomSeedsRequest_messageType +var _ protoreflect.MessageType = fastReflection_QueryRandomSeedsRequest_messageType{} -func (*QueryParamsRequest) ProtoMessage() {} +type fastReflection_QueryRandomSeedsRequest_messageType struct{} -// Deprecated: Use QueryParamsRequest.ProtoReflect.Descriptor instead. -func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{0} +func (x fastReflection_QueryRandomSeedsRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryRandomSeedsRequest)(nil) } - -// QueryParamsResponse is response type for the Query/Params RPC method. -type QueryParamsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - // params holds all the parameters of this module. - Params *Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"` +func (x fastReflection_QueryRandomSeedsRequest_messageType) New() protoreflect.Message { + return new(fastReflection_QueryRandomSeedsRequest) +} +func (x fastReflection_QueryRandomSeedsRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryRandomSeedsRequest } -func (x *QueryParamsResponse) Reset() { - *x = QueryParamsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[1] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryRandomSeedsRequest) Descriptor() protoreflect.MessageDescriptor { + return md_QueryRandomSeedsRequest } -func (x *QueryParamsResponse) String() string { - return protoimpl.X.MessageStringOf(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_QueryRandomSeedsRequest) Type() protoreflect.MessageType { + return _fastReflection_QueryRandomSeedsRequest_messageType } -func (*QueryParamsResponse) ProtoMessage() {} +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryRandomSeedsRequest) New() protoreflect.Message { + return new(fastReflection_QueryRandomSeedsRequest) +} -// Deprecated: Use QueryParamsResponse.ProtoReflect.Descriptor instead. -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{1} +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryRandomSeedsRequest) Interface() protoreflect.ProtoMessage { + return (*QueryRandomSeedsRequest)(x) } -func (x *QueryParamsResponse) GetParams() *Params { - if x != nil { - return x.Params +// 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_QueryRandomSeedsRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.EpochIndex != uint64(0) { + value := protoreflect.ValueOfUint64(x.EpochIndex) + if !f(fd_QueryRandomSeedsRequest_epoch_index, value) { + return + } } - return nil } -type QueryGetInferenceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Index string `protobuf:"bytes,1,opt,name=index,proto3" json:"index,omitempty"` +// 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_QueryRandomSeedsRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "inference.inference.QueryRandomSeedsRequest.epoch_index": + return x.EpochIndex != uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsRequest does not contain field %s", fd.FullName())) + } } -func (x *QueryGetInferenceRequest) Reset() { - *x = QueryGetInferenceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +// 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_QueryRandomSeedsRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "inference.inference.QueryRandomSeedsRequest.epoch_index": + x.EpochIndex = uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsRequest does not contain field %s", fd.FullName())) } } -func (x *QueryGetInferenceRequest) String() string { - return protoimpl.X.MessageStringOf(x) +// 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_QueryRandomSeedsRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "inference.inference.QueryRandomSeedsRequest.epoch_index": + value := x.EpochIndex + return protoreflect.ValueOfUint64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsRequest does not contain field %s", descriptor.FullName())) + } } -func (*QueryGetInferenceRequest) ProtoMessage() {} - -// Deprecated: Use QueryGetInferenceRequest.ProtoReflect.Descriptor instead. -func (*QueryGetInferenceRequest) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{2} +// 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_QueryRandomSeedsRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "inference.inference.QueryRandomSeedsRequest.epoch_index": + x.EpochIndex = value.Uint() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsRequest does not contain field %s", fd.FullName())) + } } -func (x *QueryGetInferenceRequest) GetIndex() string { - if x != nil { - return x.Index +// 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_QueryRandomSeedsRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.QueryRandomSeedsRequest.epoch_index": + panic(fmt.Errorf("field epoch_index of message inference.inference.QueryRandomSeedsRequest is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsRequest does not contain field %s", fd.FullName())) } - return "" } -type QueryGetInferenceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Inference *Inference `protobuf:"bytes,1,opt,name=inference,proto3" json:"inference,omitempty"` +// 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_QueryRandomSeedsRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.QueryRandomSeedsRequest.epoch_index": + return protoreflect.ValueOfUint64(uint64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsRequest does not contain field %s", fd.FullName())) + } } -func (x *QueryGetInferenceResponse) Reset() { - *x = QueryGetInferenceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +// 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_QueryRandomSeedsRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in inference.inference.QueryRandomSeedsRequest", d.FullName())) } + panic("unreachable") } -func (x *QueryGetInferenceResponse) String() string { - return protoimpl.X.MessageStringOf(x) +// 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_QueryRandomSeedsRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields } -func (*QueryGetInferenceResponse) ProtoMessage() {} +// 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_QueryRandomSeedsRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields +} -// Deprecated: Use QueryGetInferenceResponse.ProtoReflect.Descriptor instead. -func (*QueryGetInferenceResponse) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{3} +// 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_QueryRandomSeedsRequest) IsValid() bool { + return x != nil } -func (x *QueryGetInferenceResponse) GetInference() *Inference { - if x != nil { - return x.Inference +// 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_QueryRandomSeedsRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryRandomSeedsRequest) + 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.EpochIndex != 0 { + n += 1 + runtime.Sov(uint64(x.EpochIndex)) + } + 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().(*QueryRandomSeedsRequest) + 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.EpochIndex != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.EpochIndex)) + i-- + dAtA[i] = 0x8 + } + 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().(*QueryRandomSeedsRequest) + 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: QueryRandomSeedsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryRandomSeedsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field EpochIndex", wireType) + } + x.EpochIndex = 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.EpochIndex |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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, } - return nil } -type QueryAllInferenceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +var _ protoreflect.List = (*_QueryRandomSeedsResponse_1_list)(nil) - Pagination *v1beta1.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +type _QueryRandomSeedsResponse_1_list struct { + list *[]*RandomSeed } -func (x *QueryAllInferenceRequest) Reset() { - *x = QueryAllInferenceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *_QueryRandomSeedsResponse_1_list) Len() int { + if x.list == nil { + return 0 } + return len(*x.list) } -func (x *QueryAllInferenceRequest) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *_QueryRandomSeedsResponse_1_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect()) } -func (*QueryAllInferenceRequest) ProtoMessage() {} - -// Deprecated: Use QueryAllInferenceRequest.ProtoReflect.Descriptor instead. -func (*QueryAllInferenceRequest) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{4} +func (x *_QueryRandomSeedsResponse_1_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*RandomSeed) + (*x.list)[i] = concreteValue } -func (x *QueryAllInferenceRequest) GetPagination() *v1beta1.PageRequest { - if x != nil { - return x.Pagination - } - return nil +func (x *_QueryRandomSeedsResponse_1_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*RandomSeed) + *x.list = append(*x.list, concreteValue) } -type QueryAllInferenceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Inference []*Inference `protobuf:"bytes,1,rep,name=inference,proto3" json:"inference,omitempty"` - Pagination *v1beta1.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +func (x *_QueryRandomSeedsResponse_1_list) AppendMutable() protoreflect.Value { + v := new(RandomSeed) + *x.list = append(*x.list, v) + return protoreflect.ValueOfMessage(v.ProtoReflect()) } -func (x *QueryAllInferenceResponse) Reset() { - *x = QueryAllInferenceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +func (x *_QueryRandomSeedsResponse_1_list) Truncate(n int) { + for i := n; i < len(*x.list); i++ { + (*x.list)[i] = nil } + *x.list = (*x.list)[:n] } -func (x *QueryAllInferenceResponse) String() string { - return protoimpl.X.MessageStringOf(x) +func (x *_QueryRandomSeedsResponse_1_list) NewElement() protoreflect.Value { + v := new(RandomSeed) + return protoreflect.ValueOfMessage(v.ProtoReflect()) } -func (*QueryAllInferenceResponse) ProtoMessage() {} - -// Deprecated: Use QueryAllInferenceResponse.ProtoReflect.Descriptor instead. -func (*QueryAllInferenceResponse) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{5} +func (x *_QueryRandomSeedsResponse_1_list) IsValid() bool { + return x.list != nil } -func (x *QueryAllInferenceResponse) GetInference() []*Inference { - if x != nil { - return x.Inference - } - return nil -} +var ( + md_QueryRandomSeedsResponse protoreflect.MessageDescriptor + fd_QueryRandomSeedsResponse_seeds protoreflect.FieldDescriptor +) -func (x *QueryAllInferenceResponse) GetPagination() *v1beta1.PageResponse { - if x != nil { - return x.Pagination - } - return nil +func init() { + file_inference_inference_query_proto_init() + md_QueryRandomSeedsResponse = File_inference_inference_query_proto.Messages().ByName("QueryRandomSeedsResponse") + fd_QueryRandomSeedsResponse_seeds = md_QueryRandomSeedsResponse.Fields().ByName("seeds") } -type QueryGetParticipantRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +var _ protoreflect.Message = (*fastReflection_QueryRandomSeedsResponse)(nil) - Index string `protobuf:"bytes,1,opt,name=index,proto3" json:"index,omitempty"` +type fastReflection_QueryRandomSeedsResponse QueryRandomSeedsResponse + +func (x *QueryRandomSeedsResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryRandomSeedsResponse)(x) } -func (x *QueryGetParticipantRequest) Reset() { - *x = QueryGetParticipantRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[6] +func (x *QueryRandomSeedsResponse) slowProtoReflect() protoreflect.Message { + mi := &file_inference_inference_query_proto_msgTypes[175] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } + return mi.MessageOf(x) } -func (x *QueryGetParticipantRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} +var _fastReflection_QueryRandomSeedsResponse_messageType fastReflection_QueryRandomSeedsResponse_messageType +var _ protoreflect.MessageType = fastReflection_QueryRandomSeedsResponse_messageType{} -func (*QueryGetParticipantRequest) ProtoMessage() {} +type fastReflection_QueryRandomSeedsResponse_messageType struct{} -// Deprecated: Use QueryGetParticipantRequest.ProtoReflect.Descriptor instead. -func (*QueryGetParticipantRequest) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{6} +func (x fastReflection_QueryRandomSeedsResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryRandomSeedsResponse)(nil) +} +func (x fastReflection_QueryRandomSeedsResponse_messageType) New() protoreflect.Message { + return new(fastReflection_QueryRandomSeedsResponse) +} +func (x fastReflection_QueryRandomSeedsResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryRandomSeedsResponse } -func (x *QueryGetParticipantRequest) GetIndex() string { - if x != nil { - return x.Index - } - return "" +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryRandomSeedsResponse) Descriptor() protoreflect.MessageDescriptor { + return md_QueryRandomSeedsResponse } -type QueryGetParticipantResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +// 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_QueryRandomSeedsResponse) Type() protoreflect.MessageType { + return _fastReflection_QueryRandomSeedsResponse_messageType +} - Participant *Participant `protobuf:"bytes,1,opt,name=participant,proto3" json:"participant,omitempty"` +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryRandomSeedsResponse) New() protoreflect.Message { + return new(fastReflection_QueryRandomSeedsResponse) } -func (x *QueryGetParticipantResponse) Reset() { - *x = QueryGetParticipantResponse{} +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryRandomSeedsResponse) Interface() protoreflect.ProtoMessage { + return (*QueryRandomSeedsResponse)(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_QueryRandomSeedsResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if len(x.Seeds) != 0 { + value := protoreflect.ValueOfList(&_QueryRandomSeedsResponse_1_list{list: &x.Seeds}) + if !f(fd_QueryRandomSeedsResponse_seeds, 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_QueryRandomSeedsResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "inference.inference.QueryRandomSeedsResponse.seeds": + return len(x.Seeds) != 0 + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsResponse 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_QueryRandomSeedsResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "inference.inference.QueryRandomSeedsResponse.seeds": + x.Seeds = nil + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsResponse 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_QueryRandomSeedsResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "inference.inference.QueryRandomSeedsResponse.seeds": + if len(x.Seeds) == 0 { + return protoreflect.ValueOfList(&_QueryRandomSeedsResponse_1_list{}) + } + listValue := &_QueryRandomSeedsResponse_1_list{list: &x.Seeds} + return protoreflect.ValueOfList(listValue) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsResponse 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_QueryRandomSeedsResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "inference.inference.QueryRandomSeedsResponse.seeds": + lv := value.List() + clv := lv.(*_QueryRandomSeedsResponse_1_list) + x.Seeds = *clv.list + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsResponse 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_QueryRandomSeedsResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.QueryRandomSeedsResponse.seeds": + if x.Seeds == nil { + x.Seeds = []*RandomSeed{} + } + value := &_QueryRandomSeedsResponse_1_list{list: &x.Seeds} + return protoreflect.ValueOfList(value) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsResponse 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_QueryRandomSeedsResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.QueryRandomSeedsResponse.seeds": + list := []*RandomSeed{} + return protoreflect.ValueOfList(&_QueryRandomSeedsResponse_1_list{list: &list}) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryRandomSeedsResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryRandomSeedsResponse 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_QueryRandomSeedsResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in inference.inference.QueryRandomSeedsResponse", 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_QueryRandomSeedsResponse) 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_QueryRandomSeedsResponse) 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_QueryRandomSeedsResponse) 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_QueryRandomSeedsResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryRandomSeedsResponse) + 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.Seeds) > 0 { + for _, e := range x.Seeds { + l = options.Size(e) + 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().(*QueryRandomSeedsResponse) + 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.Seeds) > 0 { + for iNdEx := len(x.Seeds) - 1; iNdEx >= 0; iNdEx-- { + encoded, err := options.Marshal(x.Seeds[iNdEx]) + 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] = 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().(*QueryRandomSeedsResponse) + 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: QueryRandomSeedsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryRandomSeedsResponse: 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 Seeds", 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 + } + x.Seeds = append(x.Seeds, &RandomSeed{}) + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Seeds[len(x.Seeds)-1]); 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, + } +} + +// Code generated by protoc-gen-go. DO NOT EDIT. +// versions: +// protoc-gen-go v1.27.0 +// protoc (unknown) +// source: inference/inference/query.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) +) + +// QueryParamsRequest is request type for the Query/Params RPC method. +type QueryParamsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *QueryParamsRequest) Reset() { + *x = QueryParamsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryParamsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryParamsRequest) ProtoMessage() {} + +// Deprecated: Use QueryParamsRequest.ProtoReflect.Descriptor instead. +func (*QueryParamsRequest) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{0} +} + +// QueryParamsResponse is response type for the Query/Params RPC method. +type QueryParamsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // params holds all the parameters of this module. + Params *Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"` +} + +func (x *QueryParamsResponse) Reset() { + *x = QueryParamsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryParamsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryParamsResponse) ProtoMessage() {} + +// Deprecated: Use QueryParamsResponse.ProtoReflect.Descriptor instead. +func (*QueryParamsResponse) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{1} +} + +func (x *QueryParamsResponse) GetParams() *Params { + if x != nil { + return x.Params + } + return nil +} + +type QueryGetInferenceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index string `protobuf:"bytes,1,opt,name=index,proto3" json:"index,omitempty"` +} + +func (x *QueryGetInferenceRequest) Reset() { + *x = QueryGetInferenceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryGetInferenceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryGetInferenceRequest) ProtoMessage() {} + +// Deprecated: Use QueryGetInferenceRequest.ProtoReflect.Descriptor instead. +func (*QueryGetInferenceRequest) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{2} +} + +func (x *QueryGetInferenceRequest) GetIndex() string { + if x != nil { + return x.Index + } + return "" +} + +type QueryGetInferenceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inference *Inference `protobuf:"bytes,1,opt,name=inference,proto3" json:"inference,omitempty"` +} + +func (x *QueryGetInferenceResponse) Reset() { + *x = QueryGetInferenceResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryGetInferenceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryGetInferenceResponse) ProtoMessage() {} + +// Deprecated: Use QueryGetInferenceResponse.ProtoReflect.Descriptor instead. +func (*QueryGetInferenceResponse) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{3} +} + +func (x *QueryGetInferenceResponse) GetInference() *Inference { + if x != nil { + return x.Inference + } + return nil +} + +type QueryAllInferenceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Pagination *v1beta1.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (x *QueryAllInferenceRequest) Reset() { + *x = QueryAllInferenceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryAllInferenceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryAllInferenceRequest) ProtoMessage() {} + +// Deprecated: Use QueryAllInferenceRequest.ProtoReflect.Descriptor instead. +func (*QueryAllInferenceRequest) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{4} +} + +func (x *QueryAllInferenceRequest) GetPagination() *v1beta1.PageRequest { + if x != nil { + return x.Pagination + } + return nil +} + +type QueryAllInferenceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inference []*Inference `protobuf:"bytes,1,rep,name=inference,proto3" json:"inference,omitempty"` + Pagination *v1beta1.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (x *QueryAllInferenceResponse) Reset() { + *x = QueryAllInferenceResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryAllInferenceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryAllInferenceResponse) ProtoMessage() {} + +// Deprecated: Use QueryAllInferenceResponse.ProtoReflect.Descriptor instead. +func (*QueryAllInferenceResponse) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{5} +} + +func (x *QueryAllInferenceResponse) GetInference() []*Inference { + if x != nil { + return x.Inference + } + return nil +} + +func (x *QueryAllInferenceResponse) GetPagination() *v1beta1.PageResponse { + if x != nil { + return x.Pagination + } + return nil +} + +type QueryGetParticipantRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index string `protobuf:"bytes,1,opt,name=index,proto3" json:"index,omitempty"` +} + +func (x *QueryGetParticipantRequest) Reset() { + *x = QueryGetParticipantRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryGetParticipantRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryGetParticipantRequest) ProtoMessage() {} + +// Deprecated: Use QueryGetParticipantRequest.ProtoReflect.Descriptor instead. +func (*QueryGetParticipantRequest) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{6} +} + +func (x *QueryGetParticipantRequest) GetIndex() string { + if x != nil { + return x.Index + } + return "" +} + +type QueryGetParticipantResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Participant *Participant `protobuf:"bytes,1,opt,name=participant,proto3" json:"participant,omitempty"` +} + +func (x *QueryGetParticipantResponse) Reset() { + *x = QueryGetParticipantResponse{} if protoimpl.UnsafeEnabled { mi := &file_inference_inference_query_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) @@ -88535,6 +89433,78 @@ func (x *QueryParticipantsWithBalancesResponse) GetBlockHeight() int64 { return 0 } +// QueryRandomSeedsRequest is request type for the Query/RandomSeeds RPC method. +type QueryRandomSeedsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EpochIndex uint64 `protobuf:"varint,1,opt,name=epoch_index,json=epochIndex,proto3" json:"epoch_index,omitempty"` +} + +func (x *QueryRandomSeedsRequest) Reset() { + *x = QueryRandomSeedsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[174] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryRandomSeedsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryRandomSeedsRequest) ProtoMessage() {} + +// Deprecated: Use QueryRandomSeedsRequest.ProtoReflect.Descriptor instead. +func (*QueryRandomSeedsRequest) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{174} +} + +func (x *QueryRandomSeedsRequest) GetEpochIndex() uint64 { + if x != nil { + return x.EpochIndex + } + return 0 +} + +// QueryRandomSeedsResponse is response type for the Query/RandomSeeds RPC method. +type QueryRandomSeedsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Seeds []*RandomSeed `protobuf:"bytes,1,rep,name=seeds,proto3" json:"seeds,omitempty"` +} + +func (x *QueryRandomSeedsResponse) Reset() { + *x = QueryRandomSeedsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[175] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryRandomSeedsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryRandomSeedsResponse) ProtoMessage() {} + +// Deprecated: Use QueryRandomSeedsResponse.ProtoReflect.Descriptor instead. +func (*QueryRandomSeedsResponse) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{175} +} + +func (x *QueryRandomSeedsResponse) GetSeeds() []*RandomSeed { + if x != nil { + return x.Seeds + } + return nil +} + type QueryDebugStatsResponse_TemporaryTimeStat struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -88547,7 +89517,7 @@ type QueryDebugStatsResponse_TemporaryTimeStat struct { func (x *QueryDebugStatsResponse_TemporaryTimeStat) Reset() { *x = QueryDebugStatsResponse_TemporaryTimeStat{} if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[174] + mi := &file_inference_inference_query_proto_msgTypes[176] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -88590,7 +89560,7 @@ type QueryDebugStatsResponse_TemporaryEpochStat struct { func (x *QueryDebugStatsResponse_TemporaryEpochStat) Reset() { *x = QueryDebugStatsResponse_TemporaryEpochStat{} if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[175] + mi := &file_inference_inference_query_proto_msgTypes[177] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -88707,2274 +89677,2297 @@ var file_inference_inference_query_proto_rawDesc = []byte{ 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x22, 0x14, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x55, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x09, 0xc8, 0xde, - 0x1f, 0x00, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, - 0x30, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x22, 0x5f, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, - 0x0a, 0x09, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x09, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x22, 0x62, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa8, 0x01, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x09, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x32, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x67, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, - 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, - 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x64, - 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd3, 0x01, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, - 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, - 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x47, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3c, 0x0a, 0x20, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x55, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, - 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, - 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, - 0x35, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, - 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x64, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x74, 0x6f, 0x1a, 0x25, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x5f, 0x73, + 0x65, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x14, 0x0a, 0x12, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x55, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x30, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x5f, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x09, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x62, 0x0a, 0x18, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa8, 0x01, + 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x04, + 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x09, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, + 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x32, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x67, 0x0a, 0x1b, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x64, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, + 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd3, 0x01, 0x0a, 0x1b, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, + 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x22, 0x3c, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, + 0x55, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x35, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, - 0x75, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, - 0x1f, 0x00, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x22, 0x5b, 0x0a, 0x1d, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, - 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x75, 0x0a, 0x1e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, - 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, - 0x22, 0x67, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xbe, 0x01, 0x0a, 0x1e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, - 0x00, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, - 0x61, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3f, 0x0a, 0x1b, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x6c, 0x0a, 0x1c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x73, - 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, - 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x74, - 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x65, 0x0a, 0x1b, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x64, 0x0a, + 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, + 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x42, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x22, 0x5b, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, + 0x22, 0x75, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, + 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x22, 0x67, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, + 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0xb5, 0x01, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x74, - 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x53, - 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, - 0x00, 0x52, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0xbe, 0x01, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, + 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x3f, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, + 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x91, 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, - 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, - 0x52, 0x15, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6e, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x6e, 0x74, 0x22, 0x6c, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, + 0x1f, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x22, 0x65, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, + 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xda, 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x68, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x04, - 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x15, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x75, 0x0a, 0x1f, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, - 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x09, - 0x70, 0x6f, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, - 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, - 0x22, 0xb9, 0x01, 0x0a, 0x1a, 0x50, 0x6f, 0x43, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x57, - 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, - 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x65, - 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x09, 0x70, 0x6f, - 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x42, 0x61, 0x74, 0x63, 0x68, 0x42, 0x04, 0xc8, 0xde, - 0x1f, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x22, 0x47, 0x0a, 0x22, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x87, 0x01, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, - 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, - 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, - 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0xcc, 0x01, 0x0a, 0x1e, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, - 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x4f, 0x0a, - 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, - 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x49, - 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x25, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, - 0x56, 0x32, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd0, 0x01, 0x0a, 0x20, 0x50, 0x6f, 0x43, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x12, 0x20, 0x0a, 0x0b, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x17, - 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, - 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, - 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x24, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x63, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8f, 0x01, 0x0a, 0x1c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x70, - 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x18, 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, - 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x68, 0x0a, 0x1d, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, - 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x97, 0x01, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb5, 0x01, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x73, 0x65, 0x74, 0x74, + 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x69, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x91, 0x01, 0x0a, 0x25, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x15, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6e, + 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xda, + 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x15, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x1e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, + 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x22, 0x75, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x09, 0x70, 0x6f, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, + 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x70, + 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb9, 0x01, 0x0a, 0x1a, 0x50, 0x6f, 0x43, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x12, 0x40, 0x0a, 0x09, 0x70, 0x6f, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x63, 0x42, 0x61, + 0x74, 0x63, 0x68, 0x22, 0x47, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x87, 0x01, 0x0a, + 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xcc, 0x01, 0x0a, 0x1e, 0x50, 0x6f, 0x43, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, + 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, + 0x62, 0x4b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x49, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, + 0x63, 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, + 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x22, 0x8b, 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0e, 0x70, 0x6f, + 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, + 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd0, + 0x01, 0x0a, 0x20, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x73, 0x56, 0x32, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1e, + 0x0a, 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x51, + 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x42, 0x04, 0xc8, 0xde, + 0x1f, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x8f, 0x01, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x32, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x22, 0x68, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, + 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, + 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, + 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x97, 0x01, + 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x6f, + 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, + 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x7a, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3b, 0x0a, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x52, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x22, 0x6a, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, + 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, + 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x22, 0x7a, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x77, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x07, 0x77, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x6a, 0x0a, 0x28, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, - 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, 0x5f, - 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, - 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x77, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, + 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, + 0x77, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, + 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x07, + 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x57, 0x69, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, + 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x1b, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x57, 0x69, 0x74, - 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x1b, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x57, 0x69, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, - 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x6f, 0x6f, - 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, - 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, - 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x72, 0x0a, 0x30, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, - 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, - 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x18, 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x31, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, - 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5e, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, + 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0b, + 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x72, 0x0a, 0x30, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, + 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x22, 0x93, 0x01, 0x0a, 0x31, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, - 0x93, 0x01, 0x0a, 0x23, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x07, 0x77, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, - 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x34, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x22, 0x1f, 0x0a, 0x1d, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x74, 0x0a, 0x1e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, - 0x0f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, - 0x00, 0x52, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, - 0x61, 0x22, 0x4d, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, - 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x22, 0x93, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, - 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, - 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x4b, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, - 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, - 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x64, - 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x23, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x79, 0x0a, 0x22, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, - 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x22, 0x24, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, - 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7a, 0x0a, 0x23, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, + 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x23, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, + 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, + 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2f, + 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x3b, 0x0a, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x52, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x22, 0x1d, 0x0a, 0x1b, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x34, 0x0a, 0x1c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x22, 0x1f, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x74, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, + 0x63, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, - 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x22, 0x5f, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x42, - 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x47, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x33, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, - 0x74, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x5c, 0x0a, 0x18, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, - 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, - 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x22, 0x61, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, + 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, + 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4d, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, + 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x55, + 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x23, 0x0a, + 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x79, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x22, 0x24, 0x0a, + 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x7a, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x65, 0x76, + 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, + 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, + 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x22, + 0x5f, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0x99, 0x01, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, + 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x05, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa5, 0x01, 0x0a, 0x18, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x5f, - 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, - 0x52, 0x08, 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, + 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x33, 0x0a, 0x17, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x22, 0x5c, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, + 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, + 0x09, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x42, + 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x22, + 0x61, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x22, 0x6f, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x49, 0x64, 0x22, 0x7c, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, - 0x52, 0x10, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, - 0x75, 0x74, 0x22, 0x69, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc5, 0x01, - 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x10, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xa5, 0x01, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, + 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x40, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, + 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, + 0x72, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, + 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, + 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6f, 0x0a, 0x1f, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, + 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x7c, 0x0a, 0x20, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x58, 0x0a, 0x11, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x10, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x69, 0x0a, 0x1f, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x67, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, - 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0xa3, - 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, - 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc5, 0x01, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, + 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, + 0x00, 0x52, 0x10, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x67, 0x0a, 0x29, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0xa3, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, + 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x73, 0x0a, 0x29, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xec, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x75, 0x0a, 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x22, 0x73, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, - 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xec, 0x01, 0x0a, 0x2a, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x1a, 0x69, 0x6e, 0x66, 0x65, + 0x61, 0x69, 0x6c, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x04, 0xc8, - 0xde, 0x1f, 0x00, 0x52, 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, - 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x5e, 0x0a, 0x2c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x22, 0xb8, 0x02, 0x0a, 0x2d, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x12, 0x49, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x45, 0x0a, 0x0a, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x22, 0x47, 0x0a, 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, - 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x4d, 0x0a, 0x2a, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x9b, 0x01, 0x0a, 0x2b, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x17, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, - 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, - 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x79, 0x0a, 0x30, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, - 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, - 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x49, 0x64, 0x22, 0xa1, 0x01, 0x0a, 0x31, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x17, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x5e, 0x0a, 0x2c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, + 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x22, + 0xb8, 0x02, 0x0a, 0x2d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, + 0x6f, 0x77, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, - 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, - 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, - 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, 0x70, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe0, 0x01, 0x0a, 0x27, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, + 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, + 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, + 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x49, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x12, 0x45, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, + 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x0a, + 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x47, 0x0a, 0x0e, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x6f, 0x77, + 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, + 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, + 0x64, 0x65, 0x78, 0x22, 0x4d, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, + 0x65, 0x78, 0x22, 0x9b, 0x01, 0x0a, 0x2b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, + 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x22, 0x79, 0x0a, 0x30, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, + 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xa1, 0x01, 0x0a, 0x31, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x6c, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, + 0x70, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xe0, 0x01, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x17, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, - 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, - 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, - 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, 0x22, 0x52, 0x0a, 0x19, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, + 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, + 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, + 0x1f, 0x00, 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x47, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, + 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, + 0x22, 0x52, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, + 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, + 0x74, 0x61, 0x73, 0x6b, 0x22, 0x3d, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, + 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, + 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x38, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x1c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x59, 0x0a, 0x1d, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x05, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, + 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x21, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x51, + 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5b, 0x0a, 0x20, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, + 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x57, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, + 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x3d, 0x0a, - 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x1a, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x05, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x05, 0x6e, - 0x6f, 0x64, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, - 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x59, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, - 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, - 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, - 0x21, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x5b, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, - 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, - 0x1d, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x57, - 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, - 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, - 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x4e, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x61, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, - 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, - 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2b, 0x0a, 0x29, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x19, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, - 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x4e, + 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x61, + 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x2b, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x64, 0x22, 0xc8, - 0x01, 0x0a, 0x17, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, - 0x64, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x66, 0x66, - 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0f, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x57, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x77, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x63, 0x61, 0x70, - 0x70, 0x65, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x70, - 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, - 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb1, 0x02, 0x0a, 0x14, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6f, - 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x75, - 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, 0x1a, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, - 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x73, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x65, 0x61, 0x72, 0x6e, - 0x65, 0x64, 0x43, 0x6f, 0x69, 0x6e, 0x73, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x12, 0x3d, 0x0a, 0x1b, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, - 0x63, 0x6f, 0x69, 0x6e, 0x73, 0x5f, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, - 0x65, 0x64, 0x43, 0x6f, 0x69, 0x6e, 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x63, 0x6f, 0x6d, - 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x23, 0x0a, - 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x7e, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x11, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x22, 0x7e, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, - 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, - 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x08, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x65, - 0x54, 0x6f, 0x22, 0x6c, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, - 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x3f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x22, 0x68, 0x0a, 0x2d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, - 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x12, - 0x19, 0x0a, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x4e, 0x22, 0x52, 0x0a, 0x35, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x6e, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x4e, 0x22, 0x68, - 0x0a, 0x30, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, - 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x12, - 0x17, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x06, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x22, 0x64, 0x0a, 0x2c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, - 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, 0x6d, - 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x22, 0x5f, - 0x0a, 0x0a, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x69, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x61, 0x69, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, - 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, - 0x73, 0x0a, 0x2d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x42, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x73, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xd4, + 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, + 0x19, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x75, 0x72, + 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x17, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x49, 0x64, 0x22, 0xc8, 0x01, 0x0a, 0x17, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x12, 0x29, 0x0a, 0x10, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x65, 0x66, 0x66, 0x65, + 0x63, 0x74, 0x69, 0x76, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, + 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x22, 0xb1, 0x02, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x63, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x70, + 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, + 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, + 0x1a, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x73, 0x5f, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x17, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x69, 0x6e, 0x73, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3d, 0x0a, 0x1b, 0x72, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x73, 0x5f, 0x6c, 0x61, 0x74, + 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x18, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x69, 0x6e, 0x73, 0x4c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, + 0x65, 0x74, 0x65, 0x64, 0x22, 0x23, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7e, 0x0a, 0x22, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, + 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x58, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x5f, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x46, 0x75, 0x6c, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x11, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x7e, 0x0a, 0x28, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6d, + 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x22, 0x6c, 0x0a, 0x29, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, + 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x68, 0x0a, 0x2d, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, + 0x41, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, + 0x5f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, + 0x4e, 0x22, 0x52, 0x0a, 0x35, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, + 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x73, 0x4e, 0x22, 0x68, 0x0a, 0x30, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, - 0x0a, 0x09, 0x61, 0x69, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x08, 0x61, 0x69, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x0a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x61, - 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x61, 0x63, 0x74, - 0x75, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x43, 0x6f, 0x73, - 0x74, 0x22, 0x22, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, - 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x39, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, - 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, - 0x22, 0x18, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xce, 0x03, 0x0a, 0x17, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, - 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, + 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, + 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, + 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x22, + 0x64, 0x0a, 0x2c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x17, 0x0a, 0x07, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, + 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x22, 0x5f, 0x0a, 0x0a, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x69, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x61, 0x69, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x73, 0x0a, 0x2d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x73, + 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, - 0x6f, 0x72, 0x61, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x52, 0x0b, 0x73, - 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x65, 0x0a, 0x0e, 0x73, 0x74, - 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, - 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, - 0x74, 0x61, 0x74, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x1a, 0x72, 0x0a, 0x11, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x54, 0x69, - 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, - 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, - 0x6f, 0x70, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, - 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x74, 0x0a, 0x12, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, - 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, - 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, - 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, - 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x29, 0x0a, 0x27, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb0, 0x01, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x62, - 0x61, 0x73, 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, - 0x66, 0x69, 0x63, 0x42, 0x61, 0x73, 0x69, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x6d, 0x69, 0x6e, 0x69, - 0x6d, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, - 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6d, 0x69, + 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0b, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x25, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, + 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x69, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x61, 0x69, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x14, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x73, 0x43, 0x6f, 0x73, 0x74, 0x22, 0x22, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x39, 0x0a, 0x21, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x18, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0xce, 0x03, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, + 0x0d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, + 0x53, 0x74, 0x61, 0x74, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x65, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, + 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x72, 0x0a, 0x11, 0x54, 0x65, 0x6d, 0x70, + 0x6f, 0x72, 0x61, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x12, 0x1c, 0x0a, + 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x05, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, + 0x79, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x74, 0x0a, 0x12, + 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, + 0x61, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, + 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x22, 0x29, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, - 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x25, 0x0a, 0x23, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x22, 0x5f, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb0, 0x01, + 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, + 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, + 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x42, 0x61, 0x73, 0x69, 0x73, 0x12, + 0x3c, 0x0a, 0x1a, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x18, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, + 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x22, 0x25, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, - 0x73, 0x22, 0x37, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x73, 0x0a, 0x1e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0e, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, - 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, - 0x67, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, - 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, - 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xbc, 0x01, 0x0a, 0x1e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, - 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x47, - 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, - 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x48, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, - 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, - 0x79, 0x22, 0x62, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x73, 0x6b, 0x4b, 0x56, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x06, 0x72, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x3e, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, - 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x74, - 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x3b, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, - 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, - 0x79, 0x73, 0x22, 0x5d, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, - 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x3e, 0x0a, 0x03, 0x72, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5f, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x37, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x03, 0x72, 0x65, - 0x71, 0x22, 0x61, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x41, 0x0a, 0x04, 0x72, 0x65, 0x73, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, - 0x72, 0x65, 0x73, 0x70, 0x22, 0x5d, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, - 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, 0x03, 0x72, 0x65, 0x71, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x69, - 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x03, - 0x72, 0x65, 0x71, 0x22, 0x61, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x04, 0x72, 0x65, 0x73, 0x70, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, - 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x52, 0x04, 0x72, 0x65, 0x73, 0x70, 0x22, 0x8d, 0x01, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0b, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x21, - 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, - 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, - 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x81, 0x01, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x12, - 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, - 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6b, 0x0a, 0x21, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xcb, 0x01, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, - 0x0a, 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x37, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x22, 0x73, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, + 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0x67, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, + 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, + 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, + 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xbc, 0x01, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe0, 0x01, 0x0a, 0x13, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, - 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x4e, 0x0a, - 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x57, 0x72, - 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, - 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, - 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, - 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, - 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x3c, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x69, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, - 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x62, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, - 0x73, 0x22, 0x3f, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, - 0x49, 0x64, 0x22, 0x75, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, - 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x09, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, - 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x09, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x28, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, - 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, - 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x22, 0x46, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, - 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, - 0x08, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x07, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x22, 0x1b, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, - 0x06, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x63, - 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0xe6, 0x02, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x39, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x04, 0xc8, 0xde, - 0x1f, 0x00, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x43, 0x0a, 0x0c, 0x6c, 0x61, - 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x04, 0xc8, 0xde, - 0x1f, 0x00, 0x52, 0x0b, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, - 0x3b, 0x0a, 0x1a, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x17, 0x69, 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x63, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x6c, 0x0a, 0x1d, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x1a, - 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x47, 0x0a, 0x23, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x22, 0x3c, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, - 0x74, 0x22, 0x4b, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, - 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x40, - 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x24, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, - 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7f, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, - 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, - 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, - 0x0f, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, - 0x64, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, - 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3e, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x50, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, - 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x72, - 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x27, 0x0a, 0x25, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x3d, 0x0a, 0x0a, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, - 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, - 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x22, 0x72, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, - 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0c, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x73, 0x22, 0x39, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, - 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, - 0x22, 0x51, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, - 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, - 0x75, 0x6e, 0x64, 0x22, 0x23, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, - 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x79, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, - 0x0a, 0x10, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, - 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x04, 0xc8, 0xde, - 0x1f, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x0d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, - 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0x76, 0x0a, 0x21, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, - 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x73, - 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x55, 0x72, 0x6c, 0x22, 0x3c, 0x0a, 0x07, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x18, - 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x22, 0x5e, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, - 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, - 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x42, + 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x48, + 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, + 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, + 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, + 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x62, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, + 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x72, 0x65, 0x63, + 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, - 0x73, 0x22, 0x33, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, - 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x3e, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, - 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x22, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, - 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x41, 0x0a, 0x21, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, - 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x1e, 0x0a, - 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x70, 0x0a, - 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, - 0x0a, 0x0e, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, - 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, - 0x52, 0x0d, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, - 0x43, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, - 0x6e, 0x64, 0x65, 0x78, 0x22, 0x63, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x63, - 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x69, 0x74, 0x65, - 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x22, 0x28, 0x0a, 0x26, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x87, 0x01, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x3f, 0x0a, 0x05, - 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, + 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x4b, 0x56, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x3e, 0x0a, 0x24, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x3b, 0x0a, 0x25, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x5d, 0x0a, 0x1b, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x03, 0x72, 0x65, 0x71, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, + 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x52, 0x03, 0x72, 0x65, 0x71, 0x22, 0x61, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x72, 0x65, 0x73, 0x70, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, + 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x72, 0x65, 0x73, 0x70, 0x22, 0x5d, 0x0a, 0x1e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, + 0x03, 0x72, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x03, 0x72, 0x65, 0x71, 0x22, 0x61, 0x0a, 0x1f, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, + 0x04, 0x72, 0x65, 0x73, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, - 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x44, 0x0a, - 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x67, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, - 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9f, 0x01, 0x0a, - 0x16, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x42, 0x04, - 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, - 0x03, 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, 0x04, - 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x6e, - 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x72, 0x65, 0x73, 0x70, 0x22, 0x8d, 0x01, + 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, + 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, + 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, + 0x69, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x81, 0x01, + 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, + 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x12, 0x62, + 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x6b, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xea, - 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, - 0x00, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, - 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x32, 0xba, 0x85, 0x01, 0x0a, - 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x8f, 0x01, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x27, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6e, 0x66, + 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xcb, + 0x01, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, + 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, + 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, + 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe0, 0x01, 0x0a, + 0x13, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, + 0x72, 0x69, 0x64, 0x67, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x07, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, + 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, + 0x6c, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x5f, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, + 0x3c, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x69, 0x0a, + 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, + 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x75, 0x0a, 0x23, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, + 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4e, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, + 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x22, 0x55, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, + 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x10, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, + 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x46, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x22, + 0x1b, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x1a, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, + 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, + 0x17, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, + 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe6, 0x02, 0x0a, 0x16, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, + 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x12, 0x43, 0x0a, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x6c, 0x61, 0x74, 0x65, 0x73, + 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3b, 0x0a, 0x1a, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x61, 0x63, + 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x69, 0x73, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x63, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x12, 0x6c, 0x0a, 0x1d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x1a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x63, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x22, 0x47, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, + 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3c, 0x0a, 0x24, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, + 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x4b, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x40, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, + 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, + 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7f, 0x0a, + 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, + 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, + 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3e, + 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, + 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x50, + 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, + 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x22, 0x27, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3d, 0x0a, 0x0a, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x72, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0c, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x69, 0x63, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, + 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x22, 0x39, 0x0a, 0x1c, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x51, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x23, 0x0a, 0x21, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x79, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x0d, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x22, 0x76, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, + 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x72, 0x61, 0x6e, 0x74, + 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, + 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x55, 0x72, 0x6c, 0x22, 0x3c, 0x0a, 0x07, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, + 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x08, + 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x22, 0x33, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, + 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x3e, 0x0a, + 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, + 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x22, 0x0a, + 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x41, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x70, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, + 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x63, 0x0a, 0x21, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x28, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, + 0x22, 0x28, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x87, 0x01, 0x0a, 0x27, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, + 0x69, 0x76, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x67, 0x0a, 0x22, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x41, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x16, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x48, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, + 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 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, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x62, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x6e, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xea, 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x42, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x55, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x22, 0x3a, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, + 0x6d, 0x53, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x51, + 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, + 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x73, 0x65, + 0x65, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x52, 0x05, 0x73, 0x65, 0x65, 0x64, + 0x73, 0x32, 0xf3, 0x86, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x8f, 0x01, 0x0a, + 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x27, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x28, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0xa9, + 0x01, 0x0a, 0x09, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xa4, 0x01, 0x0a, 0x0c, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x12, 0x2d, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0xa9, 0x01, 0x0a, 0x09, 0x49, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x7b, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x7d, 0x12, 0xa4, 0x01, 0x0a, 0x0c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x12, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x70, + 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x12, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, + 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0b, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, + 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x2f, 0x7b, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xac, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x12, 0xd2, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x35, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x45, 0x12, 0x43, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, + 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x2f, + 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xbd, 0x01, 0x0a, 0x11, 0x47, 0x65, + 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, + 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x52, 0x61, + 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, + 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, + 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0xc5, 0x01, 0x0a, 0x0e, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, - 0xac, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, - 0x6c, 0x6c, 0x12, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, - 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, - 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0xd2, - 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, + 0x61, 0x74, 0x61, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, + 0x7d, 0x12, 0xba, 0x01, 0x0a, 0x11, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x44, 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x12, 0x43, + 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x12, 0xbc, + 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x53, 0x65, + 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x12, 0x3f, 0x2f, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x2f, + 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x7d, 0x12, 0xb1, 0x01, + 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, + 0x6c, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, + 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, + 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x7d, 0x12, 0xbd, 0x01, 0x0a, 0x11, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, - 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, - 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, - 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, + 0x6e, 0x63, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0xef, 0x01, 0x0a, 0x15, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x5f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x59, 0x12, 0x57, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x67, 0x65, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x12, 0xc5, 0x01, 0x0a, 0x0e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x7b, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xba, 0x01, 0x0a, 0x11, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x41, 0x6c, - 0x6c, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x36, 0x12, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x12, 0xbc, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x74, - 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x7d, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x7d, 0x12, 0xd6, 0x01, 0x0a, 0x18, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, + 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x12, 0x3f, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, + 0x3b, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xd1, 0x01, 0x0a, + 0x12, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x12, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, + 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, 0x12, 0x48, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x74, - 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x7d, 0x12, 0xb1, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x74, - 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x30, 0x2e, 0x69, 0x6e, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, + 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x67, + 0x65, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, + 0x12, 0xe1, 0x01, 0x0a, 0x16, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, - 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x73, 0x65, - 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xef, 0x01, 0x0a, 0x15, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5f, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x59, 0x12, 0x57, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, - 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, - 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x7d, 0x2f, - 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xd6, 0x01, - 0x0a, 0x18, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, 0x3b, 0x2f, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xd1, 0x01, 0x0a, 0x12, 0x50, 0x6f, 0x63, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x33, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, - 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, - 0x12, 0x48, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, - 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xe1, 0x01, 0x0a, 0x16, 0x50, - 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, - 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, + 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x12, 0x4c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x7d, 0x12, 0xea, 0x01, 0x0a, 0x18, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, + 0x65, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, + 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, - 0x12, 0x4c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x51, + 0x12, 0x4f, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x2f, - 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xea, - 0x01, 0x0a, 0x18, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x39, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, + 0x67, 0x65, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x7d, 0x12, 0xef, 0x01, 0x0a, 0x10, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x57, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x51, 0x12, 0x4f, 0x2f, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xef, 0x01, 0x0a, 0x10, - 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, - 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, - 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, - 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x6e, 0x12, - 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, + 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x74, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x6e, 0x12, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x76, + 0x32, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x7b, + 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x2f, 0x7b, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x7d, 0x12, 0x8e, 0x02, 0x0a, 0x18, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, + 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, + 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x75, 0x12, + 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x73, 0x74, 0x6f, 0x72, - 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x7b, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, - 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x8e, 0x02, - 0x0a, 0x18, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, - 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x7b, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x2f, 0x7b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x7d, 0x12, 0x82, 0x02, 0x0a, 0x1c, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, + 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x7b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x75, 0x12, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, + 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5d, 0x12, 0x5b, 0x2f, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x73, 0x74, 0x6f, + 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x63, 0x5f, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xa1, 0x02, 0x0a, 0x24, 0x41, 0x6c, + 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x12, 0x45, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, + 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x6a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x64, 0x12, 0x62, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, - 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x64, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x70, 0x6f, 0x63, 0x5f, 0x73, - 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x82, - 0x02, 0x0a, 0x1c, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, - 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x6f, - 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, - 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, - 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, - 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5d, 0x12, 0x5b, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, - 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x7d, 0x12, 0xa1, 0x02, 0x0a, 0x24, 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, - 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x45, 0x2e, 0x69, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, + 0x6c, 0x6c, 0x5f, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, + 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xb5, 0x01, + 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, + 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0xb6, 0x01, 0x0a, 0x0e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, + 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, - 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, - 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, - 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6a, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x64, 0x12, 0x62, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x6c, 0x6e, - 0x6f, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, - 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, - 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xb5, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x30, 0x2e, 0x69, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x12, 0xf0, + 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, + 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, + 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, + 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, + 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x4e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x12, 0x46, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, + 0x65, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, + 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x12, 0xce, 0x01, 0x0a, 0x15, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, - 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, - 0xb6, 0x01, 0x0a, 0x0e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, - 0x74, 0x61, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, - 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, + 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, + 0x74, 0x61, 0x12, 0x9c, 0x01, 0x0a, 0x09, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, 0x6c, + 0x12, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x30, 0x12, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x5f, 0x61, 0x6c, + 0x6c, 0x12, 0xa8, 0x01, 0x0a, 0x08, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x2c, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, + 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4d, 0x69, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, - 0x69, 0x63, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x12, 0xf0, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, - 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, - 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, + 0x65, 0x72, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xa1, 0x01, 0x0a, + 0x0b, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x6c, 0x6c, 0x12, 0x2c, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, - 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x2f, 0x12, 0x2d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, + 0x12, 0xdf, 0x01, 0x0a, 0x10, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, + 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x5e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x58, 0x12, 0x56, 0x2f, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x2f, 0x7b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x7d, 0x2f, 0x7b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, + 0x64, 0x7d, 0x12, 0xc1, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, - 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4e, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x48, 0x12, 0x46, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x6e, 0x69, - 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0xce, 0x01, 0x0a, 0x15, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, + 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0xff, 0x01, 0x0a, 0x1a, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, + 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5a, 0x12, 0x58, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x12, 0x9c, 0x01, 0x0a, - 0x09, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x12, 0x2a, 0x2e, 0x69, 0x6e, 0x66, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x12, 0xea, 0x01, 0x0a, 0x1d, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x5f, 0x61, 0x6c, 0x6c, 0x12, 0xa8, 0x01, 0x0a, 0x08, - 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x2f, 0x7b, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xa1, 0x01, 0x0a, 0x0b, 0x54, 0x6f, 0x70, 0x4d, 0x69, - 0x6e, 0x65, 0x72, 0x41, 0x6c, 0x6c, 0x12, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x12, 0xdf, 0x01, 0x0a, 0x10, 0x49, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, - 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x58, 0x12, 0x56, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, - 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x2f, 0x7b, 0x65, 0x78, 0x70, - 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x2f, 0x7b, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x12, 0xc1, 0x01, 0x0a, - 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x69, 0x6e, 0x66, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, + 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x42, 0x12, 0x40, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, - 0x12, 0xff, 0x01, 0x0a, 0x1a, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, - 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x60, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5a, 0x12, 0x58, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, - 0x64, 0x7d, 0x12, 0xea, 0x01, 0x0a, 0x1d, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x41, 0x6c, 0x6c, 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x12, 0x40, 0x2f, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, - 0x8c, 0x02, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, - 0x74, 0x65, 0x72, 0x73, 0x12, 0x41, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x42, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, - 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x61, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x5b, 0x12, 0x59, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, - 0x73, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x7d, 0x12, 0xf1, - 0x01, 0x0a, 0x17, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x3f, 0x2e, 0x69, 0x6e, 0x66, + 0x63, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x8c, 0x02, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x41, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x12, 0x4b, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, - 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x7d, 0x12, 0x9a, 0x02, 0x0a, 0x24, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x45, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x5d, 0x12, 0x5b, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2f, - 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x12, - 0xde, 0x01, 0x0a, 0x1a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x12, 0x3b, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x42, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x61, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5b, 0x12, 0x59, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, + 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, + 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x73, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x65, 0x72, 0x7d, 0x12, 0xf1, 0x01, 0x0a, 0x17, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, + 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, + 0x12, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x40, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, - 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x12, 0xa8, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x12, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, - 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x53, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x12, 0x4b, 0x2f, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, + 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0x9a, 0x02, 0x0a, 0x24, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x12, 0x45, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x63, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5d, 0x12, 0x5b, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x12, 0xba, 0x01, 0x0a, 0x0d, - 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2e, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x12, 0x40, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x68, 0x61, 0x72, 0x64, - 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x7d, 0x12, 0xb9, 0x01, 0x0a, 0x10, 0x48, 0x61, 0x72, - 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x41, 0x6c, 0x6c, 0x12, 0x31, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, - 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x70, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, + 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x12, 0xde, 0x01, 0x0a, 0x1a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, + 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, + 0x79, 0x41, 0x6c, 0x6c, 0x12, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, + 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, + 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0xa8, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, + 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x12, 0xba, 0x01, 0x0a, 0x0d, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, + 0x64, 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, + 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, + 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x12, 0x40, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x5f, 0x61, 0x6c, 0x6c, 0x12, 0xc5, 0x01, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, - 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x7d, 0x12, 0xb9, + 0x01, 0x0a, 0x10, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, + 0x41, 0x6c, 0x6c, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, + 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x41, 0x6c, 0x6c, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x41, + 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x38, 0x12, 0x36, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, + 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x61, 0x6c, 0x6c, 0x12, 0xc5, 0x01, 0x0a, 0x13, 0x51, + 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x3b, 0x12, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x71, 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x74, 0x72, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0xb5, 0x01, 0x0a, - 0x0f, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, - 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, - 0x5f, 0x61, 0x6c, 0x6c, 0x12, 0xf2, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, + 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x71, 0x75, 0x65, + 0x75, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, + 0x6b, 0x73, 0x12, 0xb5, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, + 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x61, 0x6c, 0x6c, 0x12, 0xf2, 0x01, 0x0a, 0x1a, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x59, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x53, 0x12, 0x51, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, - 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x12, 0xef, 0x01, 0x0a, 0x1d, 0x47, 0x65, - 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3e, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, + 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x59, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x53, 0x12, 0x51, 0x2f, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2f, + 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x12, + 0xef, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x12, 0x45, 0x2f, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x67, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x12, 0xcb, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x36, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, + 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, + 0xee, 0x01, 0x0a, 0x1c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, + 0x12, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x12, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x76, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, + 0x72, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x12, 0x81, 0x02, 0x0a, 0x22, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x61, + 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x42, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x65, 0x72, 0x41, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x63, 0x6b, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x47, 0x12, 0x45, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, - 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x6c, - 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0xcb, 0x01, 0x0a, 0x18, - 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, - 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, - 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x55, 0x12, + 0x53, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x7b, + 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, + 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x12, 0xc2, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0xee, 0x01, 0x0a, 0x1c, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, - 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x12, 0x3d, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, - 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, - 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x49, 0x12, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, - 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x7d, 0x2f, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x81, 0x02, 0x0a, 0x22, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, - 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x12, 0x42, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x6e, 0x64, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x5b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x55, 0x12, 0x53, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, + 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, + 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, - 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, - 0x70, 0x65, 0x72, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0xc2, - 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x12, 0x2b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, - 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2f, 0x64, - 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x12, 0x84, 0x02, 0x0a, 0x29, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, - 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, - 0x12, 0x4a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x61, 0x63, 0x6b, - 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, - 0x12, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, - 0x62, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0xe8, 0x01, 0x0a, 0x24, 0x49, 0x6e, + 0x65, 0x62, 0x75, 0x67, 0x2f, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x61, + 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x84, 0x02, 0x0a, 0x29, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x61, 0x63, + 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x4a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x12, 0x45, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x12, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, + 0xe8, 0x01, 0x0a, 0x24, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, + 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, + 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x45, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, + 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, + 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0xeb, 0x01, 0x0a, 0x20, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, + 0x41, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x42, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, - 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, + 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, + 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, + 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0xe6, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, + 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, - 0x74, 0x69, 0x6d, 0x65, 0x12, 0xeb, 0x01, 0x0a, 0x20, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, 0x41, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, - 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, - 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x42, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, - 0x6d, 0x65, 0x12, 0xe6, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, - 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, - 0x67, 0x65, 0x12, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, - 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, - 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, - 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0xd6, 0x01, 0x0a, 0x17, - 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x12, 0xd6, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, + 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x38, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, + 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, - 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, - 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, - 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, - 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, - 0x61, 0x73, 0x6b, 0x73, 0x12, 0xbf, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, - 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, - 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x2f, 0x7b, 0x68, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xb9, 0x01, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x41, 0x6c, 0x6c, 0x12, 0x32, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x12, 0xf0, 0x01, 0x0a, 0x11, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, - 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, 0x12, - 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, - 0x63, 0x68, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, - 0x6d, 0x62, 0x65, 0x72, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x5f, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xc6, 0x01, 0x0a, 0x12, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x72, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0xbf, 0x01, 0x0a, 0x0e, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x32, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, + 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x2f, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xb9, 0x01, 0x0a, + 0x11, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x41, + 0x6c, 0x6c, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, + 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0xf0, 0x01, 0x0a, 0x11, 0x42, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x66, 0x12, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x62, 0x72, 0x69, 0x64, 0x67, - 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xd4, - 0x01, 0x0a, 0x16, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, - 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, - 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x41, 0x12, 0x3f, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, - 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xac, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, - 0x12, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, - 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0xd3, 0x01, 0x0a, 0x14, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x35, 0x2e, + 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6f, + 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x7b, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x63, + 0x65, 0x69, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xc6, 0x01, 0x0a, 0x12, + 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, + 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xd4, 0x01, 0x0a, 0x16, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, + 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, + 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, + 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x12, 0x3f, 0x2f, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xac, 0x01, 0x0a, 0x0d, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x46, 0x12, 0x44, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, - 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, - 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, - 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xfe, 0x01, 0x0a, 0x1c, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x3d, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, - 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, - 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x69, 0x6e, 0x66, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0xd3, 0x01, 0x0a, 0x14, 0x57, + 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, + 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, - 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, - 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5f, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x59, 0x12, 0x57, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, - 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x66, - 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, - 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xd2, 0x01, 0x0a, 0x16, - 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, - 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, - 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, - 0x12, 0xc8, 0x01, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, - 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x12, 0x44, 0x2f, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, + 0x12, 0xfe, 0x01, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, + 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, + 0x65, 0x12, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x5f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x59, 0x12, 0x57, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x2f, 0x7b, + 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x7d, 0x12, 0xd2, 0x01, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x37, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x47, 0x12, 0x45, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, - 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x5f, 0x6b, 0x76, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x2f, 0x7b, 0x74, 0x61, - 0x73, 0x6b, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x6b, 0x65, 0x79, 0x7d, 0x12, 0xe4, 0x01, 0x0a, 0x18, - 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, - 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, + 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, - 0x74, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x76, 0x5f, 0x72, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x49, - 0x64, 0x7d, 0x12, 0xb4, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, - 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, - 0x69, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x5f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x12, 0xc1, 0x01, 0x0a, 0x12, 0x54, 0x72, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x12, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x5f, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x9c, 0x01, - 0x0a, 0x09, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2a, 0x2e, 0x69, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x70, 0x70, + 0x72, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x5f, 0x66, 0x6f, 0x72, + 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x12, 0xc8, 0x01, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0xe6, 0x01, 0x0a, - 0x17, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, - 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x12, 0x4e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, - 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, - 0x5f, 0x70, 0x6f, 0x5f, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x61, 0x74, - 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xf6, 0x01, 0x0a, 0x1b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, - 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, - 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x5a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x54, 0x12, 0x52, 0x2f, 0x70, 0x72, 0x6f, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, + 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, + 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x12, 0x45, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x5f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xd6, - 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x76, 0x5f, 0x72, 0x65, 0x63, 0x6f, + 0x72, 0x64, 0x2f, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x6b, 0x65, 0x79, + 0x7d, 0x12, 0xe4, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, + 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x39, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, + 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, + 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, + 0x5f, 0x6b, 0x76, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2f, + 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x7d, 0x12, 0xb4, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, + 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, + 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, + 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, + 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x12, + 0xc1, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, + 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, + 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x6f, + 0x64, 0x65, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x09, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, + 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, + 0x66, 0x6f, 0x12, 0xe6, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x38, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, + 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, - 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x46, 0x12, 0x44, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x65, 0x72, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x2f, 0x7b, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xdc, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, - 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, - 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, - 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0xc0, 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x31, 0x2e, 0x69, 0x6e, + 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x56, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x12, 0x4e, 0x2f, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x5f, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, + 0x68, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x7b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xf6, 0x01, 0x0a, 0x1b, + 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x54, + 0x12, 0x52, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x5f, 0x63, + 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x74, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x7d, 0x12, 0xd6, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x2f, 0x7b, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xca, 0x01, 0x0a, 0x15, 0x47, 0x65, - 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x69, 0x65, 0x73, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, - 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, + 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x12, 0x44, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, + 0x65, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, + 0x63, 0x65, 0x2f, 0x7b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xdc, 0x01, + 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x70, + 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, + 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0xf3, 0x01, 0x0a, 0x15, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, - 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, - 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x69, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x63, 0x12, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x7b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x72, - 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x2f, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x7d, 0x12, 0xb2, 0x01, 0x0a, - 0x0d, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x31, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x4c, 0x4e, - 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0xc0, 0x01, 0x0a, + 0x10, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, + 0x79, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0xbd, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, - 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, + 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63, 0x61, 0x70, 0x61, + 0x63, 0x69, 0x74, 0x79, 0x2f, 0x7b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, + 0xca, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0xf3, 0x01, 0x0a, + 0x15, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, + 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, + 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x63, 0x12, + 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x5f, 0x62, 0x79, + 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x7b, 0x67, + 0x72, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x2f, + 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x75, 0x72, + 0x6c, 0x7d, 0x12, 0xb2, 0x01, 0x0a, 0x0d, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x47, 0x65, 0x74, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0xbd, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x32, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, + 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, + 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0xc9, 0x01, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, + 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, - 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, + 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, + 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x12, 0x3a, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, + 0x69, 0x73, 0x74, 0x12, 0xd6, 0x01, 0x0a, 0x14, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, + 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x49, 0x12, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xe2, 0x01, 0x0a, + 0x1a, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, - 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x12, 0x41, + 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0xdf, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, + 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, + 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x73, - 0x74, 0x12, 0xc9, 0x01, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x3c, 0x12, 0x3a, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0xd6, 0x01, - 0x0a, 0x14, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x12, 0x47, 0x2f, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, - 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xe2, 0x01, 0x0a, 0x1a, 0x41, 0x63, 0x74, 0x69, 0x76, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x63, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x65, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x7d, 0x12, 0xb6, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x61, 0x6e, 0x64, + 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x73, 0x12, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x12, 0x41, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x12, 0xdf, 0x01, 0x0a, 0x19, - 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x73, 0x2f, 0x7b, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xd9, 0x01, 0x0a, + 0x18, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, + 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, - 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xd9, 0x01, - 0x0a, 0x18, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, - 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, - 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, - 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x42, 0xb8, 0x01, 0x0a, 0x17, 0x63, 0x6f, - 0x6d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, - 0x6f, 0x50, 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, - 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xa2, 0x02, 0x03, 0x49, 0x49, 0x58, 0xaa, - 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0xca, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xe2, 0x02, 0x1f, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x14, - 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x3a, 0x49, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x73, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x42, 0xb8, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, + 0x50, 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, + 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xa2, 0x02, 0x03, 0x49, 0x49, 0x58, 0xaa, 0x02, + 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0xca, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xe2, 0x02, 0x1f, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x14, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x3a, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -90989,7 +91982,7 @@ func file_inference_inference_query_proto_rawDescGZIP() []byte { return file_inference_inference_query_proto_rawDescData } -var file_inference_inference_query_proto_msgTypes = make([]protoimpl.MessageInfo, 176) +var file_inference_inference_query_proto_msgTypes = make([]protoimpl.MessageInfo, 178) var file_inference_inference_query_proto_goTypes = []interface{}{ (*QueryParamsRequest)(nil), // 0: inference.inference.QueryParamsRequest (*QueryParamsResponse)(nil), // 1: inference.inference.QueryParamsResponse @@ -91165,319 +92158,325 @@ var file_inference_inference_query_proto_goTypes = []interface{}{ (*ParticipantWithBalance)(nil), // 171: inference.inference.ParticipantWithBalance (*QueryParticipantsWithBalancesRequest)(nil), // 172: inference.inference.QueryParticipantsWithBalancesRequest (*QueryParticipantsWithBalancesResponse)(nil), // 173: inference.inference.QueryParticipantsWithBalancesResponse - (*QueryDebugStatsResponse_TemporaryTimeStat)(nil), // 174: inference.inference.QueryDebugStatsResponse.TemporaryTimeStat - (*QueryDebugStatsResponse_TemporaryEpochStat)(nil), // 175: inference.inference.QueryDebugStatsResponse.TemporaryEpochStat - (*Params)(nil), // 176: inference.inference.Params - (*Inference)(nil), // 177: inference.inference.Inference - (*v1beta1.PageRequest)(nil), // 178: cosmos.base.query.v1beta1.PageRequest - (*v1beta1.PageResponse)(nil), // 179: cosmos.base.query.v1beta1.PageResponse - (*Participant)(nil), // 180: inference.inference.Participant - (*EpochGroupData)(nil), // 181: inference.inference.EpochGroupData - (*SettleAmount)(nil), // 182: inference.inference.SettleAmount - (*EpochGroupValidations)(nil), // 183: inference.inference.EpochGroupValidations - (*PoCBatch)(nil), // 184: inference.inference.PoCBatch - (*PoCValidation)(nil), // 185: inference.inference.PoCValidation - (*PoCValidationV2)(nil), // 186: inference.inference.PoCValidationV2 - (*MLNodeWeight)(nil), // 187: inference.inference.MLNodeWeight - (*TokenomicsData)(nil), // 188: inference.inference.TokenomicsData - (*UnitOfComputePriceProposal)(nil), // 189: inference.inference.UnitOfComputePriceProposal - (*Model)(nil), // 190: inference.inference.Model - (*TopMiner)(nil), // 191: inference.inference.TopMiner - (*InferenceTimeout)(nil), // 192: inference.inference.InferenceTimeout - (*InferenceValidationDetails)(nil), // 193: inference.inference.InferenceValidationDetails - (*ValidationParams)(nil), // 194: inference.inference.ValidationParams - (*EpochPerformanceSummary)(nil), // 195: inference.inference.EpochPerformanceSummary - (*TrainingTask)(nil), // 196: inference.inference.TrainingTask - (*HardwareNodes)(nil), // 197: inference.inference.HardwareNodes - (*DeveloperStatsByTime)(nil), // 198: inference.inference.DeveloperStatsByTime - (*PartialUpgrade)(nil), // 199: inference.inference.PartialUpgrade - (*TrainingTaskKVRecord)(nil), // 200: inference.inference.TrainingTaskKVRecord - (*GetBarrierStatusRequest)(nil), // 201: inference.inference.GetBarrierStatusRequest - (*GetBarrierStatusResponse)(nil), // 202: inference.inference.GetBarrierStatusResponse - (*GetAliveNodesRequest)(nil), // 203: inference.inference.GetAliveNodesRequest - (*GetAliveNodesResponse)(nil), // 204: inference.inference.GetAliveNodesResponse - (*BridgeTransaction)(nil), // 205: inference.inference.BridgeTransaction - (*BridgeWrappedTokenContract)(nil), // 206: inference.inference.BridgeWrappedTokenContract - (*BridgeContractAddress)(nil), // 207: inference.inference.BridgeContractAddress - (*Epoch)(nil), // 208: inference.inference.Epoch - (*ConfirmationPoCEvent)(nil), // 209: inference.inference.ConfirmationPoCEvent - (*BridgeTokenReference)(nil), // 210: inference.inference.BridgeTokenReference - (*MLNodeVersion)(nil), // 211: inference.inference.MLNodeVersion - (*ExcludedParticipant)(nil), // 212: inference.inference.ExcludedParticipant - (*v1beta11.Coin)(nil), // 213: cosmos.base.v1beta1.Coin - (*DeveloperStatsByEpoch)(nil), // 214: inference.inference.DeveloperStatsByEpoch + (*QueryRandomSeedsRequest)(nil), // 174: inference.inference.QueryRandomSeedsRequest + (*QueryRandomSeedsResponse)(nil), // 175: inference.inference.QueryRandomSeedsResponse + (*QueryDebugStatsResponse_TemporaryTimeStat)(nil), // 176: inference.inference.QueryDebugStatsResponse.TemporaryTimeStat + (*QueryDebugStatsResponse_TemporaryEpochStat)(nil), // 177: inference.inference.QueryDebugStatsResponse.TemporaryEpochStat + (*Params)(nil), // 178: inference.inference.Params + (*Inference)(nil), // 179: inference.inference.Inference + (*v1beta1.PageRequest)(nil), // 180: cosmos.base.query.v1beta1.PageRequest + (*v1beta1.PageResponse)(nil), // 181: cosmos.base.query.v1beta1.PageResponse + (*Participant)(nil), // 182: inference.inference.Participant + (*EpochGroupData)(nil), // 183: inference.inference.EpochGroupData + (*SettleAmount)(nil), // 184: inference.inference.SettleAmount + (*EpochGroupValidations)(nil), // 185: inference.inference.EpochGroupValidations + (*PoCBatch)(nil), // 186: inference.inference.PoCBatch + (*PoCValidation)(nil), // 187: inference.inference.PoCValidation + (*PoCValidationV2)(nil), // 188: inference.inference.PoCValidationV2 + (*MLNodeWeight)(nil), // 189: inference.inference.MLNodeWeight + (*TokenomicsData)(nil), // 190: inference.inference.TokenomicsData + (*UnitOfComputePriceProposal)(nil), // 191: inference.inference.UnitOfComputePriceProposal + (*Model)(nil), // 192: inference.inference.Model + (*TopMiner)(nil), // 193: inference.inference.TopMiner + (*InferenceTimeout)(nil), // 194: inference.inference.InferenceTimeout + (*InferenceValidationDetails)(nil), // 195: inference.inference.InferenceValidationDetails + (*ValidationParams)(nil), // 196: inference.inference.ValidationParams + (*EpochPerformanceSummary)(nil), // 197: inference.inference.EpochPerformanceSummary + (*TrainingTask)(nil), // 198: inference.inference.TrainingTask + (*HardwareNodes)(nil), // 199: inference.inference.HardwareNodes + (*DeveloperStatsByTime)(nil), // 200: inference.inference.DeveloperStatsByTime + (*PartialUpgrade)(nil), // 201: inference.inference.PartialUpgrade + (*TrainingTaskKVRecord)(nil), // 202: inference.inference.TrainingTaskKVRecord + (*GetBarrierStatusRequest)(nil), // 203: inference.inference.GetBarrierStatusRequest + (*GetBarrierStatusResponse)(nil), // 204: inference.inference.GetBarrierStatusResponse + (*GetAliveNodesRequest)(nil), // 205: inference.inference.GetAliveNodesRequest + (*GetAliveNodesResponse)(nil), // 206: inference.inference.GetAliveNodesResponse + (*BridgeTransaction)(nil), // 207: inference.inference.BridgeTransaction + (*BridgeWrappedTokenContract)(nil), // 208: inference.inference.BridgeWrappedTokenContract + (*BridgeContractAddress)(nil), // 209: inference.inference.BridgeContractAddress + (*Epoch)(nil), // 210: inference.inference.Epoch + (*ConfirmationPoCEvent)(nil), // 211: inference.inference.ConfirmationPoCEvent + (*BridgeTokenReference)(nil), // 212: inference.inference.BridgeTokenReference + (*MLNodeVersion)(nil), // 213: inference.inference.MLNodeVersion + (*ExcludedParticipant)(nil), // 214: inference.inference.ExcludedParticipant + (*v1beta11.Coin)(nil), // 215: cosmos.base.v1beta1.Coin + (*RandomSeed)(nil), // 216: inference.inference.RandomSeed + (*DeveloperStatsByEpoch)(nil), // 217: inference.inference.DeveloperStatsByEpoch } var file_inference_inference_query_proto_depIdxs = []int32{ - 176, // 0: inference.inference.QueryParamsResponse.params:type_name -> inference.inference.Params - 177, // 1: inference.inference.QueryGetInferenceResponse.inference:type_name -> inference.inference.Inference - 178, // 2: inference.inference.QueryAllInferenceRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 177, // 3: inference.inference.QueryAllInferenceResponse.inference:type_name -> inference.inference.Inference - 179, // 4: inference.inference.QueryAllInferenceResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 180, // 5: inference.inference.QueryGetParticipantResponse.participant:type_name -> inference.inference.Participant - 178, // 6: inference.inference.QueryAllParticipantRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 180, // 7: inference.inference.QueryAllParticipantResponse.participant:type_name -> inference.inference.Participant - 179, // 8: inference.inference.QueryAllParticipantResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 180, // 9: inference.inference.QueryGetRandomExecutorResponse.executor:type_name -> inference.inference.Participant - 181, // 10: inference.inference.QueryGetEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData - 178, // 11: inference.inference.QueryAllEpochGroupDataRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 181, // 12: inference.inference.QueryAllEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData - 179, // 13: inference.inference.QueryAllEpochGroupDataResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 182, // 14: inference.inference.QueryGetSettleAmountResponse.settle_amount:type_name -> inference.inference.SettleAmount - 178, // 15: inference.inference.QueryAllSettleAmountRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 182, // 16: inference.inference.QueryAllSettleAmountResponse.settle_amount:type_name -> inference.inference.SettleAmount - 179, // 17: inference.inference.QueryAllSettleAmountResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 183, // 18: inference.inference.QueryGetEpochGroupValidationsResponse.epoch_group_validations:type_name -> inference.inference.EpochGroupValidations - 178, // 19: inference.inference.QueryAllEpochGroupValidationsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 183, // 20: inference.inference.QueryAllEpochGroupValidationsResponse.epoch_group_validations:type_name -> inference.inference.EpochGroupValidations - 179, // 21: inference.inference.QueryAllEpochGroupValidationsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 178, // 0: inference.inference.QueryParamsResponse.params:type_name -> inference.inference.Params + 179, // 1: inference.inference.QueryGetInferenceResponse.inference:type_name -> inference.inference.Inference + 180, // 2: inference.inference.QueryAllInferenceRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 179, // 3: inference.inference.QueryAllInferenceResponse.inference:type_name -> inference.inference.Inference + 181, // 4: inference.inference.QueryAllInferenceResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 182, // 5: inference.inference.QueryGetParticipantResponse.participant:type_name -> inference.inference.Participant + 180, // 6: inference.inference.QueryAllParticipantRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 182, // 7: inference.inference.QueryAllParticipantResponse.participant:type_name -> inference.inference.Participant + 181, // 8: inference.inference.QueryAllParticipantResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 182, // 9: inference.inference.QueryGetRandomExecutorResponse.executor:type_name -> inference.inference.Participant + 183, // 10: inference.inference.QueryGetEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData + 180, // 11: inference.inference.QueryAllEpochGroupDataRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 183, // 12: inference.inference.QueryAllEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData + 181, // 13: inference.inference.QueryAllEpochGroupDataResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 184, // 14: inference.inference.QueryGetSettleAmountResponse.settle_amount:type_name -> inference.inference.SettleAmount + 180, // 15: inference.inference.QueryAllSettleAmountRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 184, // 16: inference.inference.QueryAllSettleAmountResponse.settle_amount:type_name -> inference.inference.SettleAmount + 181, // 17: inference.inference.QueryAllSettleAmountResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 185, // 18: inference.inference.QueryGetEpochGroupValidationsResponse.epoch_group_validations:type_name -> inference.inference.EpochGroupValidations + 180, // 19: inference.inference.QueryAllEpochGroupValidationsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 185, // 20: inference.inference.QueryAllEpochGroupValidationsResponse.epoch_group_validations:type_name -> inference.inference.EpochGroupValidations + 181, // 21: inference.inference.QueryAllEpochGroupValidationsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse 28, // 22: inference.inference.QueryPocBatchesForStageResponse.poc_batch:type_name -> inference.inference.PoCBatchesWithParticipants - 184, // 23: inference.inference.PoCBatchesWithParticipants.poc_batch:type_name -> inference.inference.PoCBatch + 186, // 23: inference.inference.PoCBatchesWithParticipants.poc_batch:type_name -> inference.inference.PoCBatch 31, // 24: inference.inference.QueryPocValidationsForStageResponse.poc_validation:type_name -> inference.inference.PoCValidationsWithParticipants - 185, // 25: inference.inference.PoCValidationsWithParticipants.poc_validation:type_name -> inference.inference.PoCValidation + 187, // 25: inference.inference.PoCValidationsWithParticipants.poc_validation:type_name -> inference.inference.PoCValidation 34, // 26: inference.inference.QueryPocV2ValidationsForStageResponse.poc_validation:type_name -> inference.inference.PoCValidationsWithParticipantsV2 - 186, // 27: inference.inference.PoCValidationsWithParticipantsV2.poc_validation:type_name -> inference.inference.PoCValidationV2 - 187, // 28: inference.inference.QueryMLNodeWeightDistributionResponse.weights:type_name -> inference.inference.MLNodeWeight + 188, // 27: inference.inference.PoCValidationsWithParticipantsV2.poc_validation:type_name -> inference.inference.PoCValidationV2 + 189, // 28: inference.inference.QueryMLNodeWeightDistributionResponse.weights:type_name -> inference.inference.MLNodeWeight 41, // 29: inference.inference.QueryAllPoCV2StoreCommitsForStageResponse.commits:type_name -> inference.inference.PoCV2StoreCommitWithAddress 44, // 30: inference.inference.QueryAllMLNodeWeightDistributionsForStageResponse.distributions:type_name -> inference.inference.MLNodeWeightDistributionWithAddress - 187, // 31: inference.inference.MLNodeWeightDistributionWithAddress.weights:type_name -> inference.inference.MLNodeWeight - 188, // 32: inference.inference.QueryGetTokenomicsDataResponse.tokenomics_data:type_name -> inference.inference.TokenomicsData - 189, // 33: inference.inference.QueryGetUnitOfComputePriceProposalResponse.proposal:type_name -> inference.inference.UnitOfComputePriceProposal - 181, // 34: inference.inference.QueryCurrentEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData - 181, // 35: inference.inference.QueryPreviousEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData - 178, // 36: inference.inference.QueryModelsAllRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 190, // 37: inference.inference.QueryModelsAllResponse.model:type_name -> inference.inference.Model - 179, // 38: inference.inference.QueryModelsAllResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 191, // 39: inference.inference.QueryGetTopMinerResponse.top_miner:type_name -> inference.inference.TopMiner - 178, // 40: inference.inference.QueryAllTopMinerRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 191, // 41: inference.inference.QueryAllTopMinerResponse.top_miner:type_name -> inference.inference.TopMiner - 179, // 42: inference.inference.QueryAllTopMinerResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 192, // 43: inference.inference.QueryGetInferenceTimeoutResponse.inference_timeout:type_name -> inference.inference.InferenceTimeout - 178, // 44: inference.inference.QueryAllInferenceTimeoutRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 192, // 45: inference.inference.QueryAllInferenceTimeoutResponse.inference_timeout:type_name -> inference.inference.InferenceTimeout - 179, // 46: inference.inference.QueryAllInferenceTimeoutResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 193, // 47: inference.inference.QueryGetInferenceValidationDetailsResponse.inferenceValidationDetails:type_name -> inference.inference.InferenceValidationDetails - 178, // 48: inference.inference.QueryAllInferenceValidationDetailsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 193, // 49: inference.inference.QueryAllInferenceValidationDetailsResponse.inferenceValidationDetails:type_name -> inference.inference.InferenceValidationDetails - 179, // 50: inference.inference.QueryAllInferenceValidationDetailsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 189, // 31: inference.inference.MLNodeWeightDistributionWithAddress.weights:type_name -> inference.inference.MLNodeWeight + 190, // 32: inference.inference.QueryGetTokenomicsDataResponse.tokenomics_data:type_name -> inference.inference.TokenomicsData + 191, // 33: inference.inference.QueryGetUnitOfComputePriceProposalResponse.proposal:type_name -> inference.inference.UnitOfComputePriceProposal + 183, // 34: inference.inference.QueryCurrentEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData + 183, // 35: inference.inference.QueryPreviousEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData + 180, // 36: inference.inference.QueryModelsAllRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 192, // 37: inference.inference.QueryModelsAllResponse.model:type_name -> inference.inference.Model + 181, // 38: inference.inference.QueryModelsAllResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 193, // 39: inference.inference.QueryGetTopMinerResponse.top_miner:type_name -> inference.inference.TopMiner + 180, // 40: inference.inference.QueryAllTopMinerRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 193, // 41: inference.inference.QueryAllTopMinerResponse.top_miner:type_name -> inference.inference.TopMiner + 181, // 42: inference.inference.QueryAllTopMinerResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 194, // 43: inference.inference.QueryGetInferenceTimeoutResponse.inference_timeout:type_name -> inference.inference.InferenceTimeout + 180, // 44: inference.inference.QueryAllInferenceTimeoutRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 194, // 45: inference.inference.QueryAllInferenceTimeoutResponse.inference_timeout:type_name -> inference.inference.InferenceTimeout + 181, // 46: inference.inference.QueryAllInferenceTimeoutResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 195, // 47: inference.inference.QueryGetInferenceValidationDetailsResponse.inferenceValidationDetails:type_name -> inference.inference.InferenceValidationDetails + 180, // 48: inference.inference.QueryAllInferenceValidationDetailsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 195, // 49: inference.inference.QueryAllInferenceValidationDetailsResponse.inferenceValidationDetails:type_name -> inference.inference.InferenceValidationDetails + 181, // 50: inference.inference.QueryAllInferenceValidationDetailsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse 71, // 51: inference.inference.QueryGetInferenceValidationParametersResponse.validator_powers:type_name -> inference.inference.ValidatorPower - 193, // 52: inference.inference.QueryGetInferenceValidationParametersResponse.details:type_name -> inference.inference.InferenceValidationDetails - 194, // 53: inference.inference.QueryGetInferenceValidationParametersResponse.parameters:type_name -> inference.inference.ValidationParams - 195, // 54: inference.inference.QueryEpochPerformanceSummaryByEpochResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary - 195, // 55: inference.inference.QueryEpochPerformanceSummaryByParticipantResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary - 178, // 56: inference.inference.QueryAllEpochPerformanceSummaryRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 195, // 57: inference.inference.QueryAllEpochPerformanceSummaryResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary - 179, // 58: inference.inference.QueryAllEpochPerformanceSummaryResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 196, // 59: inference.inference.QueryTrainingTaskResponse.task:type_name -> inference.inference.TrainingTask - 197, // 60: inference.inference.QueryHardwareNodesResponse.nodes:type_name -> inference.inference.HardwareNodes - 197, // 61: inference.inference.QueryHardwareNodesAllResponse.nodes:type_name -> inference.inference.HardwareNodes - 196, // 62: inference.inference.QueryQueuedTrainingTasksResponse.tasks:type_name -> inference.inference.TrainingTask - 196, // 63: inference.inference.QueryTrainingTaskAllResponse.tasks:type_name -> inference.inference.TrainingTask + 195, // 52: inference.inference.QueryGetInferenceValidationParametersResponse.details:type_name -> inference.inference.InferenceValidationDetails + 196, // 53: inference.inference.QueryGetInferenceValidationParametersResponse.parameters:type_name -> inference.inference.ValidationParams + 197, // 54: inference.inference.QueryEpochPerformanceSummaryByEpochResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary + 197, // 55: inference.inference.QueryEpochPerformanceSummaryByParticipantResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary + 180, // 56: inference.inference.QueryAllEpochPerformanceSummaryRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 197, // 57: inference.inference.QueryAllEpochPerformanceSummaryResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary + 181, // 58: inference.inference.QueryAllEpochPerformanceSummaryResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 198, // 59: inference.inference.QueryTrainingTaskResponse.task:type_name -> inference.inference.TrainingTask + 199, // 60: inference.inference.QueryHardwareNodesResponse.nodes:type_name -> inference.inference.HardwareNodes + 199, // 61: inference.inference.QueryHardwareNodesAllResponse.nodes:type_name -> inference.inference.HardwareNodes + 198, // 62: inference.inference.QueryQueuedTrainingTasksResponse.tasks:type_name -> inference.inference.TrainingTask + 198, // 63: inference.inference.QueryTrainingTaskAllResponse.tasks:type_name -> inference.inference.TrainingTask 92, // 64: inference.inference.QueryGetAllParticipantCurrentStatsResponse.participant_current_stats:type_name -> inference.inference.ParticipantCurrentStats 93, // 65: inference.inference.QueryParticipantsFullStatsResponse.participants_stats:type_name -> inference.inference.ParticipantFullStats - 198, // 66: inference.inference.QueryStatsByTimePeriodByDeveloperResponse.stats:type_name -> inference.inference.DeveloperStatsByTime + 200, // 66: inference.inference.QueryStatsByTimePeriodByDeveloperResponse.stats:type_name -> inference.inference.DeveloperStatsByTime 102, // 67: inference.inference.QueryInferencesAndTokensStatsByModelsResponse.stats_models:type_name -> inference.inference.ModelStats - 174, // 68: inference.inference.QueryDebugStatsResponse.stats_by_time:type_name -> inference.inference.QueryDebugStatsResponse.TemporaryTimeStat - 175, // 69: inference.inference.QueryDebugStatsResponse.stats_by_epoch:type_name -> inference.inference.QueryDebugStatsResponse.TemporaryEpochStat - 196, // 70: inference.inference.QueryInProgressTrainingTasksResponse.tasks:type_name -> inference.inference.TrainingTask - 199, // 71: inference.inference.QueryGetPartialUpgradeResponse.partialUpgrade:type_name -> inference.inference.PartialUpgrade - 178, // 72: inference.inference.QueryAllPartialUpgradeRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 199, // 73: inference.inference.QueryAllPartialUpgradeResponse.partialUpgrade:type_name -> inference.inference.PartialUpgrade - 179, // 74: inference.inference.QueryAllPartialUpgradeResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 200, // 75: inference.inference.QueryTrainingKvRecordResponse.record:type_name -> inference.inference.TrainingTaskKVRecord - 201, // 76: inference.inference.QueryTrainingBarrierRequest.req:type_name -> inference.inference.GetBarrierStatusRequest - 202, // 77: inference.inference.QueryTrainingBarrierResponse.resp:type_name -> inference.inference.GetBarrierStatusResponse - 203, // 78: inference.inference.QueryTrainingAliveNodesRequest.req:type_name -> inference.inference.GetAliveNodesRequest - 204, // 79: inference.inference.QueryTrainingAliveNodesResponse.resp:type_name -> inference.inference.GetAliveNodesResponse - 205, // 80: inference.inference.QueryGetBridgeTransactionResponse.bridgeTransactions:type_name -> inference.inference.BridgeTransaction - 178, // 81: inference.inference.QueryAllBridgeTransactionsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 205, // 82: inference.inference.QueryAllBridgeTransactionsResponse.bridgeTransactions:type_name -> inference.inference.BridgeTransaction - 179, // 83: inference.inference.QueryAllBridgeTransactionsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 206, // 84: inference.inference.WrappedTokenBalance.token_info:type_name -> inference.inference.BridgeWrappedTokenContract + 176, // 68: inference.inference.QueryDebugStatsResponse.stats_by_time:type_name -> inference.inference.QueryDebugStatsResponse.TemporaryTimeStat + 177, // 69: inference.inference.QueryDebugStatsResponse.stats_by_epoch:type_name -> inference.inference.QueryDebugStatsResponse.TemporaryEpochStat + 198, // 70: inference.inference.QueryInProgressTrainingTasksResponse.tasks:type_name -> inference.inference.TrainingTask + 201, // 71: inference.inference.QueryGetPartialUpgradeResponse.partialUpgrade:type_name -> inference.inference.PartialUpgrade + 180, // 72: inference.inference.QueryAllPartialUpgradeRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 201, // 73: inference.inference.QueryAllPartialUpgradeResponse.partialUpgrade:type_name -> inference.inference.PartialUpgrade + 181, // 74: inference.inference.QueryAllPartialUpgradeResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 202, // 75: inference.inference.QueryTrainingKvRecordResponse.record:type_name -> inference.inference.TrainingTaskKVRecord + 203, // 76: inference.inference.QueryTrainingBarrierRequest.req:type_name -> inference.inference.GetBarrierStatusRequest + 204, // 77: inference.inference.QueryTrainingBarrierResponse.resp:type_name -> inference.inference.GetBarrierStatusResponse + 205, // 78: inference.inference.QueryTrainingAliveNodesRequest.req:type_name -> inference.inference.GetAliveNodesRequest + 206, // 79: inference.inference.QueryTrainingAliveNodesResponse.resp:type_name -> inference.inference.GetAliveNodesResponse + 207, // 80: inference.inference.QueryGetBridgeTransactionResponse.bridgeTransactions:type_name -> inference.inference.BridgeTransaction + 180, // 81: inference.inference.QueryAllBridgeTransactionsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 207, // 82: inference.inference.QueryAllBridgeTransactionsResponse.bridgeTransactions:type_name -> inference.inference.BridgeTransaction + 181, // 83: inference.inference.QueryAllBridgeTransactionsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 208, // 84: inference.inference.WrappedTokenBalance.token_info:type_name -> inference.inference.BridgeWrappedTokenContract 129, // 85: inference.inference.QueryWrappedTokenBalancesResponse.balances:type_name -> inference.inference.WrappedTokenBalance - 207, // 86: inference.inference.QueryBridgeAddressesByChainResponse.addresses:type_name -> inference.inference.BridgeContractAddress - 176, // 87: inference.inference.QueryEpochInfoResponse.params:type_name -> inference.inference.Params - 208, // 88: inference.inference.QueryEpochInfoResponse.latest_epoch:type_name -> inference.inference.Epoch - 209, // 89: inference.inference.QueryEpochInfoResponse.active_confirmation_poc_event:type_name -> inference.inference.ConfirmationPoCEvent - 210, // 90: inference.inference.QueryApprovedTokensForTradeResponse.approved_tokens:type_name -> inference.inference.BridgeTokenReference + 209, // 86: inference.inference.QueryBridgeAddressesByChainResponse.addresses:type_name -> inference.inference.BridgeContractAddress + 178, // 87: inference.inference.QueryEpochInfoResponse.params:type_name -> inference.inference.Params + 210, // 88: inference.inference.QueryEpochInfoResponse.latest_epoch:type_name -> inference.inference.Epoch + 211, // 89: inference.inference.QueryEpochInfoResponse.active_confirmation_poc_event:type_name -> inference.inference.ConfirmationPoCEvent + 212, // 90: inference.inference.QueryApprovedTokensForTradeResponse.approved_tokens:type_name -> inference.inference.BridgeTokenReference 149, // 91: inference.inference.QueryGetAllModelPerTokenPricesResponse.model_prices:type_name -> inference.inference.ModelPrice 155, // 92: inference.inference.QueryGetAllModelCapacitiesResponse.model_capacities:type_name -> inference.inference.ModelCapacity 157, // 93: inference.inference.QueryGranteesByMessageTypeResponse.grantees:type_name -> inference.inference.Grantee - 211, // 94: inference.inference.QueryGetMLNodeVersionResponse.mlnode_version:type_name -> inference.inference.MLNodeVersion - 212, // 95: inference.inference.QueryExcludedParticipantsResponse.items:type_name -> inference.inference.ExcludedParticipant - 209, // 96: inference.inference.QueryActiveConfirmationPoCEventResponse.event:type_name -> inference.inference.ConfirmationPoCEvent - 209, // 97: inference.inference.QueryConfirmationPoCEventsResponse.events:type_name -> inference.inference.ConfirmationPoCEvent - 180, // 98: inference.inference.ParticipantWithBalance.participant:type_name -> inference.inference.Participant - 213, // 99: inference.inference.ParticipantWithBalance.balances:type_name -> cosmos.base.v1beta1.Coin - 178, // 100: inference.inference.QueryParticipantsWithBalancesRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 213, // 94: inference.inference.QueryGetMLNodeVersionResponse.mlnode_version:type_name -> inference.inference.MLNodeVersion + 214, // 95: inference.inference.QueryExcludedParticipantsResponse.items:type_name -> inference.inference.ExcludedParticipant + 211, // 96: inference.inference.QueryActiveConfirmationPoCEventResponse.event:type_name -> inference.inference.ConfirmationPoCEvent + 211, // 97: inference.inference.QueryConfirmationPoCEventsResponse.events:type_name -> inference.inference.ConfirmationPoCEvent + 182, // 98: inference.inference.ParticipantWithBalance.participant:type_name -> inference.inference.Participant + 215, // 99: inference.inference.ParticipantWithBalance.balances:type_name -> cosmos.base.v1beta1.Coin + 180, // 100: inference.inference.QueryParticipantsWithBalancesRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest 171, // 101: inference.inference.QueryParticipantsWithBalancesResponse.participants:type_name -> inference.inference.ParticipantWithBalance - 179, // 102: inference.inference.QueryParticipantsWithBalancesResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 198, // 103: inference.inference.QueryDebugStatsResponse.TemporaryTimeStat.stats:type_name -> inference.inference.DeveloperStatsByTime - 214, // 104: inference.inference.QueryDebugStatsResponse.TemporaryEpochStat.stats:type_name -> inference.inference.DeveloperStatsByEpoch - 0, // 105: inference.inference.Query.Params:input_type -> inference.inference.QueryParamsRequest - 2, // 106: inference.inference.Query.Inference:input_type -> inference.inference.QueryGetInferenceRequest - 4, // 107: inference.inference.Query.InferenceAll:input_type -> inference.inference.QueryAllInferenceRequest - 6, // 108: inference.inference.Query.Participant:input_type -> inference.inference.QueryGetParticipantRequest - 8, // 109: inference.inference.Query.ParticipantAll:input_type -> inference.inference.QueryAllParticipantRequest - 10, // 110: inference.inference.Query.InferenceParticipant:input_type -> inference.inference.QueryInferenceParticipantRequest - 12, // 111: inference.inference.Query.GetRandomExecutor:input_type -> inference.inference.QueryGetRandomExecutorRequest - 14, // 112: inference.inference.Query.EpochGroupData:input_type -> inference.inference.QueryGetEpochGroupDataRequest - 16, // 113: inference.inference.Query.EpochGroupDataAll:input_type -> inference.inference.QueryAllEpochGroupDataRequest - 18, // 114: inference.inference.Query.SettleAmount:input_type -> inference.inference.QueryGetSettleAmountRequest - 20, // 115: inference.inference.Query.SettleAmountAll:input_type -> inference.inference.QueryAllSettleAmountRequest - 22, // 116: inference.inference.Query.EpochGroupValidations:input_type -> inference.inference.QueryGetEpochGroupValidationsRequest - 24, // 117: inference.inference.Query.EpochGroupValidationsAll:input_type -> inference.inference.QueryAllEpochGroupValidationsRequest - 26, // 118: inference.inference.Query.PocBatchesForStage:input_type -> inference.inference.QueryPocBatchesForStageRequest - 29, // 119: inference.inference.Query.PocValidationsForStage:input_type -> inference.inference.QueryPocValidationsForStageRequest - 32, // 120: inference.inference.Query.PocV2ValidationsForStage:input_type -> inference.inference.QueryPocV2ValidationsForStageRequest - 35, // 121: inference.inference.Query.PoCV2StoreCommit:input_type -> inference.inference.QueryPoCV2StoreCommitRequest - 37, // 122: inference.inference.Query.MLNodeWeightDistribution:input_type -> inference.inference.QueryMLNodeWeightDistributionRequest - 39, // 123: inference.inference.Query.AllPoCV2StoreCommitsForStage:input_type -> inference.inference.QueryAllPoCV2StoreCommitsForStageRequest - 42, // 124: inference.inference.Query.AllMLNodeWeightDistributionsForStage:input_type -> inference.inference.QueryAllMLNodeWeightDistributionsForStageRequest - 45, // 125: inference.inference.Query.GetCurrentEpoch:input_type -> inference.inference.QueryGetCurrentEpochRequest - 47, // 126: inference.inference.Query.TokenomicsData:input_type -> inference.inference.QueryGetTokenomicsDataRequest - 49, // 127: inference.inference.Query.GetUnitOfComputePriceProposal:input_type -> inference.inference.QueryGetUnitOfComputePriceProposalRequest - 51, // 128: inference.inference.Query.CurrentEpochGroupData:input_type -> inference.inference.QueryCurrentEpochGroupDataRequest - 55, // 129: inference.inference.Query.ModelsAll:input_type -> inference.inference.QueryModelsAllRequest - 57, // 130: inference.inference.Query.TopMiner:input_type -> inference.inference.QueryGetTopMinerRequest - 59, // 131: inference.inference.Query.TopMinerAll:input_type -> inference.inference.QueryAllTopMinerRequest - 61, // 132: inference.inference.Query.InferenceTimeout:input_type -> inference.inference.QueryGetInferenceTimeoutRequest - 63, // 133: inference.inference.Query.InferenceTimeoutAll:input_type -> inference.inference.QueryAllInferenceTimeoutRequest - 65, // 134: inference.inference.Query.InferenceValidationDetails:input_type -> inference.inference.QueryGetInferenceValidationDetailsRequest - 67, // 135: inference.inference.Query.InferenceValidationDetailsAll:input_type -> inference.inference.QueryAllInferenceValidationDetailsRequest - 69, // 136: inference.inference.Query.GetInferenceValidationParameters:input_type -> inference.inference.QueryGetInferenceValidationParametersRequest - 72, // 137: inference.inference.Query.EpochPerformanceSummary:input_type -> inference.inference.QueryEpochPerformanceSummaryByEpochRequest - 74, // 138: inference.inference.Query.EpochPerformanceSummaryByParticipant:input_type -> inference.inference.QueryEpochPerformanceSummaryByParticipantRequest - 76, // 139: inference.inference.Query.EpochPerformanceSummaryAll:input_type -> inference.inference.QueryAllEpochPerformanceSummaryRequest - 78, // 140: inference.inference.Query.TrainingTask:input_type -> inference.inference.QueryTrainingTaskRequest - 80, // 141: inference.inference.Query.HardwareNodes:input_type -> inference.inference.QueryHardwareNodesRequest - 82, // 142: inference.inference.Query.HardwareNodesAll:input_type -> inference.inference.QueryHardwareNodesAllRequest - 84, // 143: inference.inference.Query.QueuedTrainingTasks:input_type -> inference.inference.QueryQueuedTrainingTasksRequest - 86, // 144: inference.inference.Query.TrainingTaskAll:input_type -> inference.inference.QueryTrainingTaskAllRequest - 88, // 145: inference.inference.Query.GetParticipantCurrentStats:input_type -> inference.inference.QueryGetParticipantCurrentStatsRequest - 90, // 146: inference.inference.Query.GetAllParticipantCurrentStats:input_type -> inference.inference.QueryGetAllParticipantCurrentStatsRequest - 94, // 147: inference.inference.Query.GetParticipantsFullStats:input_type -> inference.inference.QueryParticipantsFullStatsRequest - 96, // 148: inference.inference.Query.StatsByTimePeriodByDeveloper:input_type -> inference.inference.QueryStatsByTimePeriodByDeveloperRequest - 98, // 149: inference.inference.Query.StatsByDeveloperAndEpochsBackwards:input_type -> inference.inference.QueryStatsByDeveloperAndEpochBackwardsRequest - 105, // 150: inference.inference.Query.CountParticipants:input_type -> inference.inference.QueryCountAllParticipantsRequest - 107, // 151: inference.inference.Query.DebugStatsDeveloperStats:input_type -> inference.inference.QueryDebugStatsRequest - 99, // 152: inference.inference.Query.InferencesAndTokensStatsByEpochsBackwards:input_type -> inference.inference.QueryInferencesAndTokensStatsByEpochsBackwardsRequest - 100, // 153: inference.inference.Query.InferencesAndTokensStatsByTimePeriod:input_type -> inference.inference.QueryInferencesAndTokensStatsByTimePeriodRequest - 101, // 154: inference.inference.Query.InferencesAndTokensStatsByModels:input_type -> inference.inference.QueryInferencesAndTokensStatsByModelsRequest - 109, // 155: inference.inference.Query.GetMinimumValidationAverage:input_type -> inference.inference.QueryGetMinimumValidationAverageRequest - 111, // 156: inference.inference.Query.InProgressTrainingTasks:input_type -> inference.inference.QueryInProgressTrainingTasksRequest - 113, // 157: inference.inference.Query.PartialUpgrade:input_type -> inference.inference.QueryGetPartialUpgradeRequest - 115, // 158: inference.inference.Query.PartialUpgradeAll:input_type -> inference.inference.QueryAllPartialUpgradeRequest - 125, // 159: inference.inference.Query.BridgeTransaction:input_type -> inference.inference.QueryGetBridgeTransactionRequest - 127, // 160: inference.inference.Query.BridgeTransactions:input_type -> inference.inference.QueryAllBridgeTransactionsRequest - 132, // 161: inference.inference.Query.BridgeAddressesByChain:input_type -> inference.inference.QueryBridgeAddressesByChainRequest - 136, // 162: inference.inference.Query.LiquidityPool:input_type -> inference.inference.QueryLiquidityPoolRequest - 130, // 163: inference.inference.Query.WrappedTokenBalances:input_type -> inference.inference.QueryWrappedTokenBalancesRequest - 134, // 164: inference.inference.Query.ValidateWrappedTokenForTrade:input_type -> inference.inference.QueryValidateWrappedTokenForTradeRequest - 144, // 165: inference.inference.Query.ApprovedTokensForTrade:input_type -> inference.inference.QueryApprovedTokensForTradeRequest - 117, // 166: inference.inference.Query.TrainingKvRecord:input_type -> inference.inference.QueryTrainingKvRecordRequest - 119, // 167: inference.inference.Query.ListTrainingKvRecordKeys:input_type -> inference.inference.QueryListTrainingKvRecordKeysRequest - 121, // 168: inference.inference.Query.TrainingBarrier:input_type -> inference.inference.QueryTrainingBarrierRequest - 123, // 169: inference.inference.Query.TrainingAliveNodes:input_type -> inference.inference.QueryTrainingAliveNodesRequest - 138, // 170: inference.inference.Query.EpochInfo:input_type -> inference.inference.QueryEpochInfoRequest - 140, // 171: inference.inference.Query.CountPoCbatchesAtHeight:input_type -> inference.inference.QueryCountPoCbatchesAtHeightRequest - 142, // 172: inference.inference.Query.CountPoCvalidationsAtHeight:input_type -> inference.inference.QueryCountPoCvalidationsAtHeightRequest - 146, // 173: inference.inference.Query.GetModelPerTokenPrice:input_type -> inference.inference.QueryGetModelPerTokenPriceRequest - 148, // 174: inference.inference.Query.GetAllModelPerTokenPrices:input_type -> inference.inference.QueryGetAllModelPerTokenPricesRequest - 151, // 175: inference.inference.Query.GetModelCapacity:input_type -> inference.inference.QueryGetModelCapacityRequest - 153, // 176: inference.inference.Query.GetAllModelCapacities:input_type -> inference.inference.QueryGetAllModelCapacitiesRequest - 156, // 177: inference.inference.Query.GranteesByMessageType:input_type -> inference.inference.QueryGranteesByMessageTypeRequest - 163, // 178: inference.inference.Query.MLNodeVersion:input_type -> inference.inference.QueryGetMLNodeVersionRequest - 159, // 179: inference.inference.Query.TrainingAllowList:input_type -> inference.inference.QueryTrainingAllowListRequest - 161, // 180: inference.inference.Query.ParticipantAllowList:input_type -> inference.inference.QueryParticipantAllowListRequest - 165, // 181: inference.inference.Query.ExcludedParticipants:input_type -> inference.inference.QueryExcludedParticipantsRequest - 167, // 182: inference.inference.Query.ActiveConfirmationPoCEvent:input_type -> inference.inference.QueryActiveConfirmationPoCEventRequest - 169, // 183: inference.inference.Query.ListConfirmationPoCEvents:input_type -> inference.inference.QueryConfirmationPoCEventsRequest - 172, // 184: inference.inference.Query.ParticipantsWithBalances:input_type -> inference.inference.QueryParticipantsWithBalancesRequest - 1, // 185: inference.inference.Query.Params:output_type -> inference.inference.QueryParamsResponse - 3, // 186: inference.inference.Query.Inference:output_type -> inference.inference.QueryGetInferenceResponse - 5, // 187: inference.inference.Query.InferenceAll:output_type -> inference.inference.QueryAllInferenceResponse - 7, // 188: inference.inference.Query.Participant:output_type -> inference.inference.QueryGetParticipantResponse - 9, // 189: inference.inference.Query.ParticipantAll:output_type -> inference.inference.QueryAllParticipantResponse - 11, // 190: inference.inference.Query.InferenceParticipant:output_type -> inference.inference.QueryInferenceParticipantResponse - 13, // 191: inference.inference.Query.GetRandomExecutor:output_type -> inference.inference.QueryGetRandomExecutorResponse - 15, // 192: inference.inference.Query.EpochGroupData:output_type -> inference.inference.QueryGetEpochGroupDataResponse - 17, // 193: inference.inference.Query.EpochGroupDataAll:output_type -> inference.inference.QueryAllEpochGroupDataResponse - 19, // 194: inference.inference.Query.SettleAmount:output_type -> inference.inference.QueryGetSettleAmountResponse - 21, // 195: inference.inference.Query.SettleAmountAll:output_type -> inference.inference.QueryAllSettleAmountResponse - 23, // 196: inference.inference.Query.EpochGroupValidations:output_type -> inference.inference.QueryGetEpochGroupValidationsResponse - 25, // 197: inference.inference.Query.EpochGroupValidationsAll:output_type -> inference.inference.QueryAllEpochGroupValidationsResponse - 27, // 198: inference.inference.Query.PocBatchesForStage:output_type -> inference.inference.QueryPocBatchesForStageResponse - 30, // 199: inference.inference.Query.PocValidationsForStage:output_type -> inference.inference.QueryPocValidationsForStageResponse - 33, // 200: inference.inference.Query.PocV2ValidationsForStage:output_type -> inference.inference.QueryPocV2ValidationsForStageResponse - 36, // 201: inference.inference.Query.PoCV2StoreCommit:output_type -> inference.inference.QueryPoCV2StoreCommitResponse - 38, // 202: inference.inference.Query.MLNodeWeightDistribution:output_type -> inference.inference.QueryMLNodeWeightDistributionResponse - 40, // 203: inference.inference.Query.AllPoCV2StoreCommitsForStage:output_type -> inference.inference.QueryAllPoCV2StoreCommitsForStageResponse - 43, // 204: inference.inference.Query.AllMLNodeWeightDistributionsForStage:output_type -> inference.inference.QueryAllMLNodeWeightDistributionsForStageResponse - 46, // 205: inference.inference.Query.GetCurrentEpoch:output_type -> inference.inference.QueryGetCurrentEpochResponse - 48, // 206: inference.inference.Query.TokenomicsData:output_type -> inference.inference.QueryGetTokenomicsDataResponse - 50, // 207: inference.inference.Query.GetUnitOfComputePriceProposal:output_type -> inference.inference.QueryGetUnitOfComputePriceProposalResponse - 52, // 208: inference.inference.Query.CurrentEpochGroupData:output_type -> inference.inference.QueryCurrentEpochGroupDataResponse - 56, // 209: inference.inference.Query.ModelsAll:output_type -> inference.inference.QueryModelsAllResponse - 58, // 210: inference.inference.Query.TopMiner:output_type -> inference.inference.QueryGetTopMinerResponse - 60, // 211: inference.inference.Query.TopMinerAll:output_type -> inference.inference.QueryAllTopMinerResponse - 62, // 212: inference.inference.Query.InferenceTimeout:output_type -> inference.inference.QueryGetInferenceTimeoutResponse - 64, // 213: inference.inference.Query.InferenceTimeoutAll:output_type -> inference.inference.QueryAllInferenceTimeoutResponse - 66, // 214: inference.inference.Query.InferenceValidationDetails:output_type -> inference.inference.QueryGetInferenceValidationDetailsResponse - 68, // 215: inference.inference.Query.InferenceValidationDetailsAll:output_type -> inference.inference.QueryAllInferenceValidationDetailsResponse - 70, // 216: inference.inference.Query.GetInferenceValidationParameters:output_type -> inference.inference.QueryGetInferenceValidationParametersResponse - 73, // 217: inference.inference.Query.EpochPerformanceSummary:output_type -> inference.inference.QueryEpochPerformanceSummaryByEpochResponse - 75, // 218: inference.inference.Query.EpochPerformanceSummaryByParticipant:output_type -> inference.inference.QueryEpochPerformanceSummaryByParticipantResponse - 77, // 219: inference.inference.Query.EpochPerformanceSummaryAll:output_type -> inference.inference.QueryAllEpochPerformanceSummaryResponse - 79, // 220: inference.inference.Query.TrainingTask:output_type -> inference.inference.QueryTrainingTaskResponse - 81, // 221: inference.inference.Query.HardwareNodes:output_type -> inference.inference.QueryHardwareNodesResponse - 83, // 222: inference.inference.Query.HardwareNodesAll:output_type -> inference.inference.QueryHardwareNodesAllResponse - 85, // 223: inference.inference.Query.QueuedTrainingTasks:output_type -> inference.inference.QueryQueuedTrainingTasksResponse - 87, // 224: inference.inference.Query.TrainingTaskAll:output_type -> inference.inference.QueryTrainingTaskAllResponse - 89, // 225: inference.inference.Query.GetParticipantCurrentStats:output_type -> inference.inference.QueryGetParticipantCurrentStatsResponse - 91, // 226: inference.inference.Query.GetAllParticipantCurrentStats:output_type -> inference.inference.QueryGetAllParticipantCurrentStatsResponse - 95, // 227: inference.inference.Query.GetParticipantsFullStats:output_type -> inference.inference.QueryParticipantsFullStatsResponse - 97, // 228: inference.inference.Query.StatsByTimePeriodByDeveloper:output_type -> inference.inference.QueryStatsByTimePeriodByDeveloperResponse - 104, // 229: inference.inference.Query.StatsByDeveloperAndEpochsBackwards:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse - 106, // 230: inference.inference.Query.CountParticipants:output_type -> inference.inference.QueryCountAllParticipantsResponse - 108, // 231: inference.inference.Query.DebugStatsDeveloperStats:output_type -> inference.inference.QueryDebugStatsResponse - 104, // 232: inference.inference.Query.InferencesAndTokensStatsByEpochsBackwards:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse - 104, // 233: inference.inference.Query.InferencesAndTokensStatsByTimePeriod:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse - 103, // 234: inference.inference.Query.InferencesAndTokensStatsByModels:output_type -> inference.inference.QueryInferencesAndTokensStatsByModelsResponse - 110, // 235: inference.inference.Query.GetMinimumValidationAverage:output_type -> inference.inference.QueryGetMinimumValidationAverageResponse - 112, // 236: inference.inference.Query.InProgressTrainingTasks:output_type -> inference.inference.QueryInProgressTrainingTasksResponse - 114, // 237: inference.inference.Query.PartialUpgrade:output_type -> inference.inference.QueryGetPartialUpgradeResponse - 116, // 238: inference.inference.Query.PartialUpgradeAll:output_type -> inference.inference.QueryAllPartialUpgradeResponse - 126, // 239: inference.inference.Query.BridgeTransaction:output_type -> inference.inference.QueryGetBridgeTransactionResponse - 128, // 240: inference.inference.Query.BridgeTransactions:output_type -> inference.inference.QueryAllBridgeTransactionsResponse - 133, // 241: inference.inference.Query.BridgeAddressesByChain:output_type -> inference.inference.QueryBridgeAddressesByChainResponse - 137, // 242: inference.inference.Query.LiquidityPool:output_type -> inference.inference.QueryLiquidityPoolResponse - 131, // 243: inference.inference.Query.WrappedTokenBalances:output_type -> inference.inference.QueryWrappedTokenBalancesResponse - 135, // 244: inference.inference.Query.ValidateWrappedTokenForTrade:output_type -> inference.inference.QueryValidateWrappedTokenForTradeResponse - 145, // 245: inference.inference.Query.ApprovedTokensForTrade:output_type -> inference.inference.QueryApprovedTokensForTradeResponse - 118, // 246: inference.inference.Query.TrainingKvRecord:output_type -> inference.inference.QueryTrainingKvRecordResponse - 120, // 247: inference.inference.Query.ListTrainingKvRecordKeys:output_type -> inference.inference.QueryListTrainingKvRecordKeysResponse - 122, // 248: inference.inference.Query.TrainingBarrier:output_type -> inference.inference.QueryTrainingBarrierResponse - 124, // 249: inference.inference.Query.TrainingAliveNodes:output_type -> inference.inference.QueryTrainingAliveNodesResponse - 139, // 250: inference.inference.Query.EpochInfo:output_type -> inference.inference.QueryEpochInfoResponse - 141, // 251: inference.inference.Query.CountPoCbatchesAtHeight:output_type -> inference.inference.QueryCountPoCbatchesAtHeightResponse - 143, // 252: inference.inference.Query.CountPoCvalidationsAtHeight:output_type -> inference.inference.QueryCountPoCvalidationsAtHeightResponse - 147, // 253: inference.inference.Query.GetModelPerTokenPrice:output_type -> inference.inference.QueryGetModelPerTokenPriceResponse - 150, // 254: inference.inference.Query.GetAllModelPerTokenPrices:output_type -> inference.inference.QueryGetAllModelPerTokenPricesResponse - 152, // 255: inference.inference.Query.GetModelCapacity:output_type -> inference.inference.QueryGetModelCapacityResponse - 154, // 256: inference.inference.Query.GetAllModelCapacities:output_type -> inference.inference.QueryGetAllModelCapacitiesResponse - 158, // 257: inference.inference.Query.GranteesByMessageType:output_type -> inference.inference.QueryGranteesByMessageTypeResponse - 164, // 258: inference.inference.Query.MLNodeVersion:output_type -> inference.inference.QueryGetMLNodeVersionResponse - 160, // 259: inference.inference.Query.TrainingAllowList:output_type -> inference.inference.QueryTrainingAllowListResponse - 162, // 260: inference.inference.Query.ParticipantAllowList:output_type -> inference.inference.QueryParticipantAllowListResponse - 166, // 261: inference.inference.Query.ExcludedParticipants:output_type -> inference.inference.QueryExcludedParticipantsResponse - 168, // 262: inference.inference.Query.ActiveConfirmationPoCEvent:output_type -> inference.inference.QueryActiveConfirmationPoCEventResponse - 170, // 263: inference.inference.Query.ListConfirmationPoCEvents:output_type -> inference.inference.QueryConfirmationPoCEventsResponse - 173, // 264: inference.inference.Query.ParticipantsWithBalances:output_type -> inference.inference.QueryParticipantsWithBalancesResponse - 185, // [185:265] is the sub-list for method output_type - 105, // [105:185] is the sub-list for method input_type - 105, // [105:105] is the sub-list for extension type_name - 105, // [105:105] is the sub-list for extension extendee - 0, // [0:105] is the sub-list for field type_name + 181, // 102: inference.inference.QueryParticipantsWithBalancesResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 216, // 103: inference.inference.QueryRandomSeedsResponse.seeds:type_name -> inference.inference.RandomSeed + 200, // 104: inference.inference.QueryDebugStatsResponse.TemporaryTimeStat.stats:type_name -> inference.inference.DeveloperStatsByTime + 217, // 105: inference.inference.QueryDebugStatsResponse.TemporaryEpochStat.stats:type_name -> inference.inference.DeveloperStatsByEpoch + 0, // 106: inference.inference.Query.Params:input_type -> inference.inference.QueryParamsRequest + 2, // 107: inference.inference.Query.Inference:input_type -> inference.inference.QueryGetInferenceRequest + 4, // 108: inference.inference.Query.InferenceAll:input_type -> inference.inference.QueryAllInferenceRequest + 6, // 109: inference.inference.Query.Participant:input_type -> inference.inference.QueryGetParticipantRequest + 8, // 110: inference.inference.Query.ParticipantAll:input_type -> inference.inference.QueryAllParticipantRequest + 10, // 111: inference.inference.Query.InferenceParticipant:input_type -> inference.inference.QueryInferenceParticipantRequest + 12, // 112: inference.inference.Query.GetRandomExecutor:input_type -> inference.inference.QueryGetRandomExecutorRequest + 14, // 113: inference.inference.Query.EpochGroupData:input_type -> inference.inference.QueryGetEpochGroupDataRequest + 16, // 114: inference.inference.Query.EpochGroupDataAll:input_type -> inference.inference.QueryAllEpochGroupDataRequest + 18, // 115: inference.inference.Query.SettleAmount:input_type -> inference.inference.QueryGetSettleAmountRequest + 20, // 116: inference.inference.Query.SettleAmountAll:input_type -> inference.inference.QueryAllSettleAmountRequest + 22, // 117: inference.inference.Query.EpochGroupValidations:input_type -> inference.inference.QueryGetEpochGroupValidationsRequest + 24, // 118: inference.inference.Query.EpochGroupValidationsAll:input_type -> inference.inference.QueryAllEpochGroupValidationsRequest + 26, // 119: inference.inference.Query.PocBatchesForStage:input_type -> inference.inference.QueryPocBatchesForStageRequest + 29, // 120: inference.inference.Query.PocValidationsForStage:input_type -> inference.inference.QueryPocValidationsForStageRequest + 32, // 121: inference.inference.Query.PocV2ValidationsForStage:input_type -> inference.inference.QueryPocV2ValidationsForStageRequest + 35, // 122: inference.inference.Query.PoCV2StoreCommit:input_type -> inference.inference.QueryPoCV2StoreCommitRequest + 37, // 123: inference.inference.Query.MLNodeWeightDistribution:input_type -> inference.inference.QueryMLNodeWeightDistributionRequest + 39, // 124: inference.inference.Query.AllPoCV2StoreCommitsForStage:input_type -> inference.inference.QueryAllPoCV2StoreCommitsForStageRequest + 42, // 125: inference.inference.Query.AllMLNodeWeightDistributionsForStage:input_type -> inference.inference.QueryAllMLNodeWeightDistributionsForStageRequest + 45, // 126: inference.inference.Query.GetCurrentEpoch:input_type -> inference.inference.QueryGetCurrentEpochRequest + 47, // 127: inference.inference.Query.TokenomicsData:input_type -> inference.inference.QueryGetTokenomicsDataRequest + 49, // 128: inference.inference.Query.GetUnitOfComputePriceProposal:input_type -> inference.inference.QueryGetUnitOfComputePriceProposalRequest + 51, // 129: inference.inference.Query.CurrentEpochGroupData:input_type -> inference.inference.QueryCurrentEpochGroupDataRequest + 55, // 130: inference.inference.Query.ModelsAll:input_type -> inference.inference.QueryModelsAllRequest + 57, // 131: inference.inference.Query.TopMiner:input_type -> inference.inference.QueryGetTopMinerRequest + 59, // 132: inference.inference.Query.TopMinerAll:input_type -> inference.inference.QueryAllTopMinerRequest + 61, // 133: inference.inference.Query.InferenceTimeout:input_type -> inference.inference.QueryGetInferenceTimeoutRequest + 63, // 134: inference.inference.Query.InferenceTimeoutAll:input_type -> inference.inference.QueryAllInferenceTimeoutRequest + 65, // 135: inference.inference.Query.InferenceValidationDetails:input_type -> inference.inference.QueryGetInferenceValidationDetailsRequest + 67, // 136: inference.inference.Query.InferenceValidationDetailsAll:input_type -> inference.inference.QueryAllInferenceValidationDetailsRequest + 69, // 137: inference.inference.Query.GetInferenceValidationParameters:input_type -> inference.inference.QueryGetInferenceValidationParametersRequest + 72, // 138: inference.inference.Query.EpochPerformanceSummary:input_type -> inference.inference.QueryEpochPerformanceSummaryByEpochRequest + 74, // 139: inference.inference.Query.EpochPerformanceSummaryByParticipant:input_type -> inference.inference.QueryEpochPerformanceSummaryByParticipantRequest + 76, // 140: inference.inference.Query.EpochPerformanceSummaryAll:input_type -> inference.inference.QueryAllEpochPerformanceSummaryRequest + 78, // 141: inference.inference.Query.TrainingTask:input_type -> inference.inference.QueryTrainingTaskRequest + 80, // 142: inference.inference.Query.HardwareNodes:input_type -> inference.inference.QueryHardwareNodesRequest + 82, // 143: inference.inference.Query.HardwareNodesAll:input_type -> inference.inference.QueryHardwareNodesAllRequest + 84, // 144: inference.inference.Query.QueuedTrainingTasks:input_type -> inference.inference.QueryQueuedTrainingTasksRequest + 86, // 145: inference.inference.Query.TrainingTaskAll:input_type -> inference.inference.QueryTrainingTaskAllRequest + 88, // 146: inference.inference.Query.GetParticipantCurrentStats:input_type -> inference.inference.QueryGetParticipantCurrentStatsRequest + 90, // 147: inference.inference.Query.GetAllParticipantCurrentStats:input_type -> inference.inference.QueryGetAllParticipantCurrentStatsRequest + 94, // 148: inference.inference.Query.GetParticipantsFullStats:input_type -> inference.inference.QueryParticipantsFullStatsRequest + 96, // 149: inference.inference.Query.StatsByTimePeriodByDeveloper:input_type -> inference.inference.QueryStatsByTimePeriodByDeveloperRequest + 98, // 150: inference.inference.Query.StatsByDeveloperAndEpochsBackwards:input_type -> inference.inference.QueryStatsByDeveloperAndEpochBackwardsRequest + 105, // 151: inference.inference.Query.CountParticipants:input_type -> inference.inference.QueryCountAllParticipantsRequest + 107, // 152: inference.inference.Query.DebugStatsDeveloperStats:input_type -> inference.inference.QueryDebugStatsRequest + 99, // 153: inference.inference.Query.InferencesAndTokensStatsByEpochsBackwards:input_type -> inference.inference.QueryInferencesAndTokensStatsByEpochsBackwardsRequest + 100, // 154: inference.inference.Query.InferencesAndTokensStatsByTimePeriod:input_type -> inference.inference.QueryInferencesAndTokensStatsByTimePeriodRequest + 101, // 155: inference.inference.Query.InferencesAndTokensStatsByModels:input_type -> inference.inference.QueryInferencesAndTokensStatsByModelsRequest + 109, // 156: inference.inference.Query.GetMinimumValidationAverage:input_type -> inference.inference.QueryGetMinimumValidationAverageRequest + 111, // 157: inference.inference.Query.InProgressTrainingTasks:input_type -> inference.inference.QueryInProgressTrainingTasksRequest + 113, // 158: inference.inference.Query.PartialUpgrade:input_type -> inference.inference.QueryGetPartialUpgradeRequest + 115, // 159: inference.inference.Query.PartialUpgradeAll:input_type -> inference.inference.QueryAllPartialUpgradeRequest + 125, // 160: inference.inference.Query.BridgeTransaction:input_type -> inference.inference.QueryGetBridgeTransactionRequest + 127, // 161: inference.inference.Query.BridgeTransactions:input_type -> inference.inference.QueryAllBridgeTransactionsRequest + 132, // 162: inference.inference.Query.BridgeAddressesByChain:input_type -> inference.inference.QueryBridgeAddressesByChainRequest + 136, // 163: inference.inference.Query.LiquidityPool:input_type -> inference.inference.QueryLiquidityPoolRequest + 130, // 164: inference.inference.Query.WrappedTokenBalances:input_type -> inference.inference.QueryWrappedTokenBalancesRequest + 134, // 165: inference.inference.Query.ValidateWrappedTokenForTrade:input_type -> inference.inference.QueryValidateWrappedTokenForTradeRequest + 144, // 166: inference.inference.Query.ApprovedTokensForTrade:input_type -> inference.inference.QueryApprovedTokensForTradeRequest + 117, // 167: inference.inference.Query.TrainingKvRecord:input_type -> inference.inference.QueryTrainingKvRecordRequest + 119, // 168: inference.inference.Query.ListTrainingKvRecordKeys:input_type -> inference.inference.QueryListTrainingKvRecordKeysRequest + 121, // 169: inference.inference.Query.TrainingBarrier:input_type -> inference.inference.QueryTrainingBarrierRequest + 123, // 170: inference.inference.Query.TrainingAliveNodes:input_type -> inference.inference.QueryTrainingAliveNodesRequest + 138, // 171: inference.inference.Query.EpochInfo:input_type -> inference.inference.QueryEpochInfoRequest + 140, // 172: inference.inference.Query.CountPoCbatchesAtHeight:input_type -> inference.inference.QueryCountPoCbatchesAtHeightRequest + 142, // 173: inference.inference.Query.CountPoCvalidationsAtHeight:input_type -> inference.inference.QueryCountPoCvalidationsAtHeightRequest + 146, // 174: inference.inference.Query.GetModelPerTokenPrice:input_type -> inference.inference.QueryGetModelPerTokenPriceRequest + 148, // 175: inference.inference.Query.GetAllModelPerTokenPrices:input_type -> inference.inference.QueryGetAllModelPerTokenPricesRequest + 151, // 176: inference.inference.Query.GetModelCapacity:input_type -> inference.inference.QueryGetModelCapacityRequest + 153, // 177: inference.inference.Query.GetAllModelCapacities:input_type -> inference.inference.QueryGetAllModelCapacitiesRequest + 156, // 178: inference.inference.Query.GranteesByMessageType:input_type -> inference.inference.QueryGranteesByMessageTypeRequest + 163, // 179: inference.inference.Query.MLNodeVersion:input_type -> inference.inference.QueryGetMLNodeVersionRequest + 159, // 180: inference.inference.Query.TrainingAllowList:input_type -> inference.inference.QueryTrainingAllowListRequest + 161, // 181: inference.inference.Query.ParticipantAllowList:input_type -> inference.inference.QueryParticipantAllowListRequest + 165, // 182: inference.inference.Query.ExcludedParticipants:input_type -> inference.inference.QueryExcludedParticipantsRequest + 167, // 183: inference.inference.Query.ActiveConfirmationPoCEvent:input_type -> inference.inference.QueryActiveConfirmationPoCEventRequest + 169, // 184: inference.inference.Query.ListConfirmationPoCEvents:input_type -> inference.inference.QueryConfirmationPoCEventsRequest + 174, // 185: inference.inference.Query.ListRandomSeeds:input_type -> inference.inference.QueryRandomSeedsRequest + 172, // 186: inference.inference.Query.ParticipantsWithBalances:input_type -> inference.inference.QueryParticipantsWithBalancesRequest + 1, // 187: inference.inference.Query.Params:output_type -> inference.inference.QueryParamsResponse + 3, // 188: inference.inference.Query.Inference:output_type -> inference.inference.QueryGetInferenceResponse + 5, // 189: inference.inference.Query.InferenceAll:output_type -> inference.inference.QueryAllInferenceResponse + 7, // 190: inference.inference.Query.Participant:output_type -> inference.inference.QueryGetParticipantResponse + 9, // 191: inference.inference.Query.ParticipantAll:output_type -> inference.inference.QueryAllParticipantResponse + 11, // 192: inference.inference.Query.InferenceParticipant:output_type -> inference.inference.QueryInferenceParticipantResponse + 13, // 193: inference.inference.Query.GetRandomExecutor:output_type -> inference.inference.QueryGetRandomExecutorResponse + 15, // 194: inference.inference.Query.EpochGroupData:output_type -> inference.inference.QueryGetEpochGroupDataResponse + 17, // 195: inference.inference.Query.EpochGroupDataAll:output_type -> inference.inference.QueryAllEpochGroupDataResponse + 19, // 196: inference.inference.Query.SettleAmount:output_type -> inference.inference.QueryGetSettleAmountResponse + 21, // 197: inference.inference.Query.SettleAmountAll:output_type -> inference.inference.QueryAllSettleAmountResponse + 23, // 198: inference.inference.Query.EpochGroupValidations:output_type -> inference.inference.QueryGetEpochGroupValidationsResponse + 25, // 199: inference.inference.Query.EpochGroupValidationsAll:output_type -> inference.inference.QueryAllEpochGroupValidationsResponse + 27, // 200: inference.inference.Query.PocBatchesForStage:output_type -> inference.inference.QueryPocBatchesForStageResponse + 30, // 201: inference.inference.Query.PocValidationsForStage:output_type -> inference.inference.QueryPocValidationsForStageResponse + 33, // 202: inference.inference.Query.PocV2ValidationsForStage:output_type -> inference.inference.QueryPocV2ValidationsForStageResponse + 36, // 203: inference.inference.Query.PoCV2StoreCommit:output_type -> inference.inference.QueryPoCV2StoreCommitResponse + 38, // 204: inference.inference.Query.MLNodeWeightDistribution:output_type -> inference.inference.QueryMLNodeWeightDistributionResponse + 40, // 205: inference.inference.Query.AllPoCV2StoreCommitsForStage:output_type -> inference.inference.QueryAllPoCV2StoreCommitsForStageResponse + 43, // 206: inference.inference.Query.AllMLNodeWeightDistributionsForStage:output_type -> inference.inference.QueryAllMLNodeWeightDistributionsForStageResponse + 46, // 207: inference.inference.Query.GetCurrentEpoch:output_type -> inference.inference.QueryGetCurrentEpochResponse + 48, // 208: inference.inference.Query.TokenomicsData:output_type -> inference.inference.QueryGetTokenomicsDataResponse + 50, // 209: inference.inference.Query.GetUnitOfComputePriceProposal:output_type -> inference.inference.QueryGetUnitOfComputePriceProposalResponse + 52, // 210: inference.inference.Query.CurrentEpochGroupData:output_type -> inference.inference.QueryCurrentEpochGroupDataResponse + 56, // 211: inference.inference.Query.ModelsAll:output_type -> inference.inference.QueryModelsAllResponse + 58, // 212: inference.inference.Query.TopMiner:output_type -> inference.inference.QueryGetTopMinerResponse + 60, // 213: inference.inference.Query.TopMinerAll:output_type -> inference.inference.QueryAllTopMinerResponse + 62, // 214: inference.inference.Query.InferenceTimeout:output_type -> inference.inference.QueryGetInferenceTimeoutResponse + 64, // 215: inference.inference.Query.InferenceTimeoutAll:output_type -> inference.inference.QueryAllInferenceTimeoutResponse + 66, // 216: inference.inference.Query.InferenceValidationDetails:output_type -> inference.inference.QueryGetInferenceValidationDetailsResponse + 68, // 217: inference.inference.Query.InferenceValidationDetailsAll:output_type -> inference.inference.QueryAllInferenceValidationDetailsResponse + 70, // 218: inference.inference.Query.GetInferenceValidationParameters:output_type -> inference.inference.QueryGetInferenceValidationParametersResponse + 73, // 219: inference.inference.Query.EpochPerformanceSummary:output_type -> inference.inference.QueryEpochPerformanceSummaryByEpochResponse + 75, // 220: inference.inference.Query.EpochPerformanceSummaryByParticipant:output_type -> inference.inference.QueryEpochPerformanceSummaryByParticipantResponse + 77, // 221: inference.inference.Query.EpochPerformanceSummaryAll:output_type -> inference.inference.QueryAllEpochPerformanceSummaryResponse + 79, // 222: inference.inference.Query.TrainingTask:output_type -> inference.inference.QueryTrainingTaskResponse + 81, // 223: inference.inference.Query.HardwareNodes:output_type -> inference.inference.QueryHardwareNodesResponse + 83, // 224: inference.inference.Query.HardwareNodesAll:output_type -> inference.inference.QueryHardwareNodesAllResponse + 85, // 225: inference.inference.Query.QueuedTrainingTasks:output_type -> inference.inference.QueryQueuedTrainingTasksResponse + 87, // 226: inference.inference.Query.TrainingTaskAll:output_type -> inference.inference.QueryTrainingTaskAllResponse + 89, // 227: inference.inference.Query.GetParticipantCurrentStats:output_type -> inference.inference.QueryGetParticipantCurrentStatsResponse + 91, // 228: inference.inference.Query.GetAllParticipantCurrentStats:output_type -> inference.inference.QueryGetAllParticipantCurrentStatsResponse + 95, // 229: inference.inference.Query.GetParticipantsFullStats:output_type -> inference.inference.QueryParticipantsFullStatsResponse + 97, // 230: inference.inference.Query.StatsByTimePeriodByDeveloper:output_type -> inference.inference.QueryStatsByTimePeriodByDeveloperResponse + 104, // 231: inference.inference.Query.StatsByDeveloperAndEpochsBackwards:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse + 106, // 232: inference.inference.Query.CountParticipants:output_type -> inference.inference.QueryCountAllParticipantsResponse + 108, // 233: inference.inference.Query.DebugStatsDeveloperStats:output_type -> inference.inference.QueryDebugStatsResponse + 104, // 234: inference.inference.Query.InferencesAndTokensStatsByEpochsBackwards:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse + 104, // 235: inference.inference.Query.InferencesAndTokensStatsByTimePeriod:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse + 103, // 236: inference.inference.Query.InferencesAndTokensStatsByModels:output_type -> inference.inference.QueryInferencesAndTokensStatsByModelsResponse + 110, // 237: inference.inference.Query.GetMinimumValidationAverage:output_type -> inference.inference.QueryGetMinimumValidationAverageResponse + 112, // 238: inference.inference.Query.InProgressTrainingTasks:output_type -> inference.inference.QueryInProgressTrainingTasksResponse + 114, // 239: inference.inference.Query.PartialUpgrade:output_type -> inference.inference.QueryGetPartialUpgradeResponse + 116, // 240: inference.inference.Query.PartialUpgradeAll:output_type -> inference.inference.QueryAllPartialUpgradeResponse + 126, // 241: inference.inference.Query.BridgeTransaction:output_type -> inference.inference.QueryGetBridgeTransactionResponse + 128, // 242: inference.inference.Query.BridgeTransactions:output_type -> inference.inference.QueryAllBridgeTransactionsResponse + 133, // 243: inference.inference.Query.BridgeAddressesByChain:output_type -> inference.inference.QueryBridgeAddressesByChainResponse + 137, // 244: inference.inference.Query.LiquidityPool:output_type -> inference.inference.QueryLiquidityPoolResponse + 131, // 245: inference.inference.Query.WrappedTokenBalances:output_type -> inference.inference.QueryWrappedTokenBalancesResponse + 135, // 246: inference.inference.Query.ValidateWrappedTokenForTrade:output_type -> inference.inference.QueryValidateWrappedTokenForTradeResponse + 145, // 247: inference.inference.Query.ApprovedTokensForTrade:output_type -> inference.inference.QueryApprovedTokensForTradeResponse + 118, // 248: inference.inference.Query.TrainingKvRecord:output_type -> inference.inference.QueryTrainingKvRecordResponse + 120, // 249: inference.inference.Query.ListTrainingKvRecordKeys:output_type -> inference.inference.QueryListTrainingKvRecordKeysResponse + 122, // 250: inference.inference.Query.TrainingBarrier:output_type -> inference.inference.QueryTrainingBarrierResponse + 124, // 251: inference.inference.Query.TrainingAliveNodes:output_type -> inference.inference.QueryTrainingAliveNodesResponse + 139, // 252: inference.inference.Query.EpochInfo:output_type -> inference.inference.QueryEpochInfoResponse + 141, // 253: inference.inference.Query.CountPoCbatchesAtHeight:output_type -> inference.inference.QueryCountPoCbatchesAtHeightResponse + 143, // 254: inference.inference.Query.CountPoCvalidationsAtHeight:output_type -> inference.inference.QueryCountPoCvalidationsAtHeightResponse + 147, // 255: inference.inference.Query.GetModelPerTokenPrice:output_type -> inference.inference.QueryGetModelPerTokenPriceResponse + 150, // 256: inference.inference.Query.GetAllModelPerTokenPrices:output_type -> inference.inference.QueryGetAllModelPerTokenPricesResponse + 152, // 257: inference.inference.Query.GetModelCapacity:output_type -> inference.inference.QueryGetModelCapacityResponse + 154, // 258: inference.inference.Query.GetAllModelCapacities:output_type -> inference.inference.QueryGetAllModelCapacitiesResponse + 158, // 259: inference.inference.Query.GranteesByMessageType:output_type -> inference.inference.QueryGranteesByMessageTypeResponse + 164, // 260: inference.inference.Query.MLNodeVersion:output_type -> inference.inference.QueryGetMLNodeVersionResponse + 160, // 261: inference.inference.Query.TrainingAllowList:output_type -> inference.inference.QueryTrainingAllowListResponse + 162, // 262: inference.inference.Query.ParticipantAllowList:output_type -> inference.inference.QueryParticipantAllowListResponse + 166, // 263: inference.inference.Query.ExcludedParticipants:output_type -> inference.inference.QueryExcludedParticipantsResponse + 168, // 264: inference.inference.Query.ActiveConfirmationPoCEvent:output_type -> inference.inference.QueryActiveConfirmationPoCEventResponse + 170, // 265: inference.inference.Query.ListConfirmationPoCEvents:output_type -> inference.inference.QueryConfirmationPoCEventsResponse + 175, // 266: inference.inference.Query.ListRandomSeeds:output_type -> inference.inference.QueryRandomSeedsResponse + 173, // 267: inference.inference.Query.ParticipantsWithBalances:output_type -> inference.inference.QueryParticipantsWithBalancesResponse + 187, // [187:268] is the sub-list for method output_type + 106, // [106:187] is the sub-list for method input_type + 106, // [106:106] is the sub-list for extension type_name + 106, // [106:106] is the sub-list for extension extendee + 0, // [0:106] is the sub-list for field type_name } func init() { file_inference_inference_query_proto_init() } @@ -91512,6 +92511,7 @@ func file_inference_inference_query_proto_init() { file_inference_inference_confirmation_poc_event_proto_init() file_inference_inference_liquidity_pool_proto_init() file_inference_inference_poc_v2_proto_init() + file_inference_inference_random_seed_proto_init() if !protoimpl.UnsafeEnabled { file_inference_inference_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryParamsRequest); i { @@ -93602,7 +94602,7 @@ func file_inference_inference_query_proto_init() { } } file_inference_inference_query_proto_msgTypes[174].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryDebugStatsResponse_TemporaryTimeStat); i { + switch v := v.(*QueryRandomSeedsRequest); i { case 0: return &v.state case 1: @@ -93614,6 +94614,30 @@ func file_inference_inference_query_proto_init() { } } file_inference_inference_query_proto_msgTypes[175].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryRandomSeedsResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_inference_inference_query_proto_msgTypes[176].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryDebugStatsResponse_TemporaryTimeStat); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_inference_inference_query_proto_msgTypes[177].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryDebugStatsResponse_TemporaryEpochStat); i { case 0: return &v.state @@ -93632,7 +94656,7 @@ func file_inference_inference_query_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_inference_inference_query_proto_rawDesc, NumEnums: 0, - NumMessages: 176, + NumMessages: 178, NumExtensions: 0, NumServices: 1, }, diff --git a/inference-chain/api/inference/inference/query_grpc.pb.go b/inference-chain/api/inference/inference/query_grpc.pb.go index 99d51f87a..1557fa738 100644 --- a/inference-chain/api/inference/inference/query_grpc.pb.go +++ b/inference-chain/api/inference/inference/query_grpc.pb.go @@ -98,6 +98,7 @@ const ( Query_ExcludedParticipants_FullMethodName = "/inference.inference.Query/ExcludedParticipants" Query_ActiveConfirmationPoCEvent_FullMethodName = "/inference.inference.Query/ActiveConfirmationPoCEvent" Query_ListConfirmationPoCEvents_FullMethodName = "/inference.inference.Query/ListConfirmationPoCEvents" + Query_ListRandomSeeds_FullMethodName = "/inference.inference.Query/ListRandomSeeds" Query_ParticipantsWithBalances_FullMethodName = "/inference.inference.Query/ParticipantsWithBalances" ) @@ -241,6 +242,8 @@ type QueryClient interface { ActiveConfirmationPoCEvent(ctx context.Context, in *QueryActiveConfirmationPoCEventRequest, opts ...grpc.CallOption) (*QueryActiveConfirmationPoCEventResponse, error) // Queries confirmation PoC events for a specific epoch. ListConfirmationPoCEvents(ctx context.Context, in *QueryConfirmationPoCEventsRequest, opts ...grpc.CallOption) (*QueryConfirmationPoCEventsResponse, error) + // Queries random seeds for a specific epoch. + ListRandomSeeds(ctx context.Context, in *QueryRandomSeedsRequest, opts ...grpc.CallOption) (*QueryRandomSeedsResponse, error) ParticipantsWithBalances(ctx context.Context, in *QueryParticipantsWithBalancesRequest, opts ...grpc.CallOption) (*QueryParticipantsWithBalancesResponse, error) } @@ -963,6 +966,15 @@ func (c *queryClient) ListConfirmationPoCEvents(ctx context.Context, in *QueryCo return out, nil } +func (c *queryClient) ListRandomSeeds(ctx context.Context, in *QueryRandomSeedsRequest, opts ...grpc.CallOption) (*QueryRandomSeedsResponse, error) { + out := new(QueryRandomSeedsResponse) + err := c.cc.Invoke(ctx, Query_ListRandomSeeds_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *queryClient) ParticipantsWithBalances(ctx context.Context, in *QueryParticipantsWithBalancesRequest, opts ...grpc.CallOption) (*QueryParticipantsWithBalancesResponse, error) { out := new(QueryParticipantsWithBalancesResponse) err := c.cc.Invoke(ctx, Query_ParticipantsWithBalances_FullMethodName, in, out, opts...) @@ -1112,6 +1124,8 @@ type QueryServer interface { ActiveConfirmationPoCEvent(context.Context, *QueryActiveConfirmationPoCEventRequest) (*QueryActiveConfirmationPoCEventResponse, error) // Queries confirmation PoC events for a specific epoch. ListConfirmationPoCEvents(context.Context, *QueryConfirmationPoCEventsRequest) (*QueryConfirmationPoCEventsResponse, error) + // Queries random seeds for a specific epoch. + ListRandomSeeds(context.Context, *QueryRandomSeedsRequest) (*QueryRandomSeedsResponse, error) ParticipantsWithBalances(context.Context, *QueryParticipantsWithBalancesRequest) (*QueryParticipantsWithBalancesResponse, error) mustEmbedUnimplementedQueryServer() } @@ -1357,6 +1371,9 @@ func (UnimplementedQueryServer) ActiveConfirmationPoCEvent(context.Context, *Que func (UnimplementedQueryServer) ListConfirmationPoCEvents(context.Context, *QueryConfirmationPoCEventsRequest) (*QueryConfirmationPoCEventsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListConfirmationPoCEvents not implemented") } +func (UnimplementedQueryServer) ListRandomSeeds(context.Context, *QueryRandomSeedsRequest) (*QueryRandomSeedsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRandomSeeds not implemented") +} func (UnimplementedQueryServer) ParticipantsWithBalances(context.Context, *QueryParticipantsWithBalancesRequest) (*QueryParticipantsWithBalancesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ParticipantsWithBalances not implemented") } @@ -2795,6 +2812,24 @@ func _Query_ListConfirmationPoCEvents_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } +func _Query_ListRandomSeeds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryRandomSeedsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ListRandomSeeds(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Query_ListRandomSeeds_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ListRandomSeeds(ctx, req.(*QueryRandomSeedsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Query_ParticipantsWithBalances_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryParticipantsWithBalancesRequest) if err := dec(in); err != nil { @@ -3136,6 +3171,10 @@ var Query_ServiceDesc = grpc.ServiceDesc{ MethodName: "ListConfirmationPoCEvents", Handler: _Query_ListConfirmationPoCEvents_Handler, }, + { + MethodName: "ListRandomSeeds", + Handler: _Query_ListRandomSeeds_Handler, + }, { MethodName: "ParticipantsWithBalances", Handler: _Query_ParticipantsWithBalances_Handler, diff --git a/inference-chain/proto/inference/inference/query.proto b/inference-chain/proto/inference/inference/query.proto index c186fdf21..6ce4cc48c 100644 --- a/inference-chain/proto/inference/inference/query.proto +++ b/inference-chain/proto/inference/inference/query.proto @@ -34,6 +34,7 @@ import "inference/inference/excluded_participant.proto"; import "inference/inference/confirmation_poc_event.proto"; import "inference/inference/liquidity_pool.proto"; import "inference/inference/poc_v2.proto"; +import "inference/inference/random_seed.proto"; option go_package = "github.com/productscience/inference/x/inference/types"; @@ -469,6 +470,11 @@ service Query { option (google.api.http).get = "/productscience/inference/inference/confirmation_poc_events/{epoch_index}"; } + // Queries random seeds for a specific epoch. + rpc ListRandomSeeds (QueryRandomSeedsRequest) returns (QueryRandomSeedsResponse) { + option (google.api.http).get = "/productscience/inference/inference/random_seeds/{epoch_index}"; + } + rpc ParticipantsWithBalances (QueryParticipantsWithBalancesRequest) returns (QueryParticipantsWithBalancesResponse) { option (google.api.http).get = "/productscience/inference/inference/participants_with_balances"; @@ -1242,3 +1248,13 @@ message QueryParticipantsWithBalancesResponse { cosmos.base.query.v1beta1.PageResponse pagination = 2; int64 block_height = 3; } + +// QueryRandomSeedsRequest is request type for the Query/RandomSeeds RPC method. +message QueryRandomSeedsRequest { + uint64 epoch_index = 1; +} + +// QueryRandomSeedsResponse is response type for the Query/RandomSeeds RPC method. +message QueryRandomSeedsResponse { + repeated RandomSeed seeds = 1; +} diff --git a/inference-chain/x/inference/keeper/query_random_seeds.go b/inference-chain/x/inference/keeper/query_random_seeds.go new file mode 100644 index 000000000..c4f0c8b5f --- /dev/null +++ b/inference-chain/x/inference/keeper/query_random_seeds.go @@ -0,0 +1,35 @@ +package keeper + +import ( + "context" + + "cosmossdk.io/collections" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/productscience/inference/x/inference/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +// ListRandomSeeds returns all random seeds for a given epoch index. +func (k Keeper) ListRandomSeeds(ctx context.Context, req *types.QueryRandomSeedsRequest) (*types.QueryRandomSeedsResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + var seeds []*types.RandomSeed + it, err := k.RandomSeeds.Iterate(ctx, collections.NewPrefixedPairRange[uint64, sdk.AccAddress](req.EpochIndex)) + if err != nil { + return nil, status.Error(codes.Internal, "failed to iterate random seeds") + } + defer it.Close() + + for ; it.Valid(); it.Next() { + val, err := it.Value() + if err != nil { + return nil, status.Error(codes.Internal, "failed to read random seed value") + } + seeds = append(seeds, &val) + } + + return &types.QueryRandomSeedsResponse{Seeds: seeds}, nil +} diff --git a/inference-chain/x/inference/module/confirmation_poc.go b/inference-chain/x/inference/module/confirmation_poc.go index 849306da4..8332b5e12 100644 --- a/inference-chain/x/inference/module/confirmation_poc.go +++ b/inference-chain/x/inference/module/confirmation_poc.go @@ -16,6 +16,8 @@ import ( "github.com/shopspring/decimal" ) +const safetyWindow = 50 + // handleConfirmationPoC manages confirmation PoC trigger decisions and phase transitions func (am AppModule) handleConfirmationPoC(ctx context.Context, blockHeight int64) error { sdkCtx := sdk.UnwrapSDKContext(ctx) @@ -127,7 +129,9 @@ func (am AppModule) checkConfirmationPoCTrigger( confirmationWindowDuration := epochParams.PocStageDuration + epochParams.PocExchangeDuration + epochParams.PocValidationDelay + - epochParams.PocValidationDuration + epochParams.PocValidationDuration + + epochParams.SetNewValidatorsDelay + + safetyWindow triggerWindowEnd := nextPoCStart - epochParams.InferenceValidationCutoff - confirmationWindowDuration if blockHeight < setNewValidatorsHeight || blockHeight > triggerWindowEnd { diff --git a/inference-chain/x/inference/module/module.go b/inference-chain/x/inference/module/module.go index a40263653..17b0bc34e 100644 --- a/inference-chain/x/inference/module/module.go +++ b/inference-chain/x/inference/module/module.go @@ -520,42 +520,65 @@ func (am AppModule) onEndOfPoCValidationStage(ctx context.Context, blockHeight i return } var activeParticipants []*types.ActiveParticipant - if params.PocParams.PocV2Enabled { - activeParticipants = am.ComputeNewWeights(ctx, *upcomingEpoch) + + if upcomingEpoch.Index == 170 { + currentActiveParticipants, found := am.keeper.GetActiveParticipants(ctx, 169) + if !found { + am.LogError("onEndOfPoCValidationStage: Unable to get active participants", types.EpochGroup) + panic("Unable to get active participants") + } + previousActiveParticipants := currentActiveParticipants.Participants + activeParticipants = make([]*types.ActiveParticipant, 0) + for _, participant := range previousActiveParticipants { + am.LogInfo("onEndOfPoCValidationStage: participant", types.EpochGroup, "participant.Index", participant.Index, "participant.Weight", participant.Weight) + + seed, found := am.keeper.GetRandomSeed(ctx, upcomingEpoch.Index, participant.Index) + if !found { + am.LogError("onEndOfPoCValidationStage: Unable to get seed", types.EpochGroup, "participant.Index", participant.Index) + continue + } + participant.Seed = &seed + activeParticipants = append(activeParticipants, participant) + am.LogInfo("onEndOfPoCValidationStage: seed", types.EpochGroup, "seed.EpochIndex", seed.EpochIndex, "seed.Participant", seed.Participant, "seed.Signature", seed.Signature) + } } else { - activeParticipants = am.ComputeNewWeightsV1(ctx, *upcomingEpoch) - } - if activeParticipants == nil { - am.LogError("onEndOfPoCValidationStage: computeResult == nil && activeParticipants == nil", types.PoC) - return - } + if params.PocParams.PocV2Enabled { + activeParticipants = am.ComputeNewWeights(ctx, *upcomingEpoch) + } else { + activeParticipants = am.ComputeNewWeightsV1(ctx, *upcomingEpoch) + } + if activeParticipants == nil { + am.LogError("onEndOfPoCValidationStage: computeResult == nil && activeParticipants == nil", types.PoC) + return + } - modelAssigner := NewModelAssigner(am.keeper, am.keeper) - modelAssigner.setModelsForParticipants(ctx, activeParticipants, *upcomingEpoch) + modelAssigner := NewModelAssigner(am.keeper, am.keeper) + modelAssigner.setModelsForParticipants(ctx, activeParticipants, *upcomingEpoch) - // Adjust weights based on collateral after the grace period. This modifies the weights in-place. - if err := am.keeper.AdjustWeightsByCollateral(ctx, activeParticipants); err != nil { - am.LogError("onSetNewValidatorsStage: failed to adjust weights by collateral", types.Tokenomics, "error", err) - // Depending on chain policy, we might want to halt on error. For now, we log and continue, - // which means participants will proceed with their unadjusted PotentialWeight. - } + // Adjust weights based on collateral after the grace period. This modifies the weights in-place. + if err := am.keeper.AdjustWeightsByCollateral(ctx, activeParticipants); err != nil { + am.LogError("onSetNewValidatorsStage: failed to adjust weights by collateral", types.Tokenomics, "error", err) + // Depending on chain policy, we might want to halt on error. For now, we log and continue, + // which means participants will proceed with their unadjusted PotentialWeight. + } - // Apply universal power capping to epoch powers - activeParticipants = am.applyEpochPowerCapping(ctx, activeParticipants) + // Apply universal power capping to epoch powers + activeParticipants = am.applyEpochPowerCapping(ctx, activeParticipants) - modelAssigner.AllocateMLNodesForPoC(ctx, *upcomingEpoch, activeParticipants) - am.LogInfo("Finished PoC allocation for all participants", types.EpochGroup, "step", "poc_allocation_complete") + modelAssigner.AllocateMLNodesForPoC(ctx, *upcomingEpoch, activeParticipants) + am.LogInfo("Finished PoC allocation for all participants", types.EpochGroup, "step", "poc_allocation_complete") - err = am.RegisterTopMiners(ctx, activeParticipants, blockTime) - if err != nil { - am.LogError("onEndOfPoCValidationStage: Unable to register top miners", types.Tokenomics, "error", err.Error()) - return - } + err = am.RegisterTopMiners(ctx, activeParticipants, blockTime) + if err != nil { + am.LogError("onEndOfPoCValidationStage: Unable to register top miners", types.Tokenomics, "error", err.Error()) + return + } - am.LogInfo("onEndOfPoCValidationStage: computed new weights", types.Stages, - "upcomingEpoch.Index", upcomingEpoch.Index, - "PocStartBlockHeight", upcomingEpoch.PocStartBlockHeight, - "len(activeParticipants)", len(activeParticipants)) + am.LogInfo("onEndOfPoCValidationStage: computed new weights", types.Stages, + "upcomingEpoch.Index", upcomingEpoch.Index, + "PocStartBlockHeight", upcomingEpoch.PocStartBlockHeight, + "len(activeParticipants)", len(activeParticipants)) + } err = am.keeper.SetActiveParticipants(ctx, types.ActiveParticipants{ Participants: activeParticipants, diff --git a/inference-chain/x/inference/types/query.pb.go b/inference-chain/x/inference/types/query.pb.go index b6cbe374f..b2386d40d 100644 --- a/inference-chain/x/inference/types/query.pb.go +++ b/inference-chain/x/inference/types/query.pb.go @@ -8484,6 +8484,96 @@ func (m *QueryParticipantsWithBalancesResponse) GetBlockHeight() int64 { return 0 } +// QueryRandomSeedsRequest is request type for the Query/RandomSeeds RPC method. +type QueryRandomSeedsRequest struct { + EpochIndex uint64 `protobuf:"varint,1,opt,name=epoch_index,json=epochIndex,proto3" json:"epoch_index,omitempty"` +} + +func (m *QueryRandomSeedsRequest) Reset() { *m = QueryRandomSeedsRequest{} } +func (m *QueryRandomSeedsRequest) String() string { return proto.CompactTextString(m) } +func (*QueryRandomSeedsRequest) ProtoMessage() {} +func (*QueryRandomSeedsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_cf0cfe3b0e1cc5bd, []int{174} +} +func (m *QueryRandomSeedsRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryRandomSeedsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryRandomSeedsRequest.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 *QueryRandomSeedsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryRandomSeedsRequest.Merge(m, src) +} +func (m *QueryRandomSeedsRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryRandomSeedsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryRandomSeedsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryRandomSeedsRequest proto.InternalMessageInfo + +func (m *QueryRandomSeedsRequest) GetEpochIndex() uint64 { + if m != nil { + return m.EpochIndex + } + return 0 +} + +// QueryRandomSeedsResponse is response type for the Query/RandomSeeds RPC method. +type QueryRandomSeedsResponse struct { + Seeds []*RandomSeed `protobuf:"bytes,1,rep,name=seeds,proto3" json:"seeds,omitempty"` +} + +func (m *QueryRandomSeedsResponse) Reset() { *m = QueryRandomSeedsResponse{} } +func (m *QueryRandomSeedsResponse) String() string { return proto.CompactTextString(m) } +func (*QueryRandomSeedsResponse) ProtoMessage() {} +func (*QueryRandomSeedsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cf0cfe3b0e1cc5bd, []int{175} +} +func (m *QueryRandomSeedsResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryRandomSeedsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryRandomSeedsResponse.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 *QueryRandomSeedsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryRandomSeedsResponse.Merge(m, src) +} +func (m *QueryRandomSeedsResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryRandomSeedsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryRandomSeedsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryRandomSeedsResponse proto.InternalMessageInfo + +func (m *QueryRandomSeedsResponse) GetSeeds() []*RandomSeed { + if m != nil { + return m.Seeds + } + return nil +} + func init() { proto.RegisterType((*QueryParamsRequest)(nil), "inference.inference.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "inference.inference.QueryParamsResponse") @@ -8661,467 +8751,473 @@ func init() { proto.RegisterType((*ParticipantWithBalance)(nil), "inference.inference.ParticipantWithBalance") proto.RegisterType((*QueryParticipantsWithBalancesRequest)(nil), "inference.inference.QueryParticipantsWithBalancesRequest") proto.RegisterType((*QueryParticipantsWithBalancesResponse)(nil), "inference.inference.QueryParticipantsWithBalancesResponse") + proto.RegisterType((*QueryRandomSeedsRequest)(nil), "inference.inference.QueryRandomSeedsRequest") + proto.RegisterType((*QueryRandomSeedsResponse)(nil), "inference.inference.QueryRandomSeedsResponse") } func init() { proto.RegisterFile("inference/inference/query.proto", fileDescriptor_cf0cfe3b0e1cc5bd) } var fileDescriptor_cf0cfe3b0e1cc5bd = []byte{ - // 7265 bytes of a gzipped FileDescriptorProto + // 7336 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x7d, 0x69, 0x6c, 0x1c, 0xc9, - 0x75, 0xff, 0xf6, 0x50, 0x07, 0x59, 0x22, 0x29, 0xaa, 0x56, 0xbb, 0xa2, 0x46, 0x12, 0xa5, 0x2d, - 0x69, 0x57, 0xe7, 0x72, 0x56, 0xd4, 0xb5, 0x5a, 0x49, 0x94, 0x48, 0xea, 0x5c, 0x1d, 0x4b, 0x8d, - 0x2e, 0xaf, 0xd7, 0xde, 0x76, 0x73, 0xa6, 0x49, 0xb6, 0xd9, 0x33, 0x3d, 0xdb, 0xdd, 0x43, 0x89, - 0xe6, 0x9f, 0xfe, 0xc3, 0x46, 0x02, 0x7f, 0xc8, 0xe1, 0x04, 0xfe, 0x10, 0xc4, 0x09, 0x10, 0x18, - 0x49, 0x00, 0x07, 0xc8, 0x07, 0x3b, 0x88, 0x83, 0xd8, 0x70, 0x0e, 0x07, 0x70, 0xb0, 0x89, 0x03, - 0xc3, 0xb1, 0x8d, 0x45, 0x12, 0x04, 0xb6, 0xb3, 0x36, 0x9c, 0xc0, 0x09, 0x62, 0x27, 0x01, 0xf2, + 0x75, 0xff, 0xf6, 0x50, 0x07, 0x59, 0xa2, 0x44, 0xaa, 0x56, 0x2b, 0x51, 0x23, 0x89, 0xd2, 0x96, + 0xb4, 0xab, 0x73, 0x39, 0x2b, 0xea, 0x5a, 0xad, 0x24, 0x4a, 0x24, 0x75, 0xae, 0x8e, 0xa5, 0x46, + 0x97, 0xd7, 0x6b, 0x6f, 0xbb, 0x39, 0xd3, 0x24, 0xdb, 0xec, 0x99, 0x9e, 0xed, 0xee, 0xa1, 0x44, + 0xf3, 0x4f, 0xff, 0x61, 0x23, 0x88, 0x3f, 0xe4, 0x70, 0x02, 0x7f, 0x08, 0xe2, 0x04, 0x08, 0x8c, + 0x24, 0x80, 0x03, 0xe4, 0x83, 0x1d, 0xc4, 0x46, 0x6c, 0x38, 0x87, 0x03, 0x38, 0xd8, 0xc4, 0x81, + 0xe1, 0xd8, 0xc6, 0x22, 0x09, 0x02, 0xdb, 0x59, 0x1b, 0x4e, 0xe0, 0x04, 0x59, 0x27, 0x06, 0xf2, 0x31, 0x09, 0xba, 0xea, 0x55, 0x77, 0x75, 0x4f, 0x75, 0x75, 0xf7, 0x70, 0xd6, 0xfe, 0x42, 0xb0, - 0xab, 0xab, 0x5e, 0xbd, 0xa3, 0xaa, 0xfa, 0xbd, 0x57, 0x55, 0xbf, 0x41, 0x7b, 0xad, 0xe6, 0xbc, - 0xe9, 0x9a, 0xcd, 0x9a, 0x59, 0x89, 0xfe, 0x7b, 0xab, 0x6d, 0xba, 0x2b, 0xe3, 0x2d, 0xd7, 0xf1, - 0x1d, 0xfc, 0x74, 0x58, 0x3c, 0x1e, 0xfe, 0x57, 0xde, 0x66, 0x34, 0xac, 0xa6, 0x53, 0xa1, 0x7f, - 0x59, 0xbd, 0xf2, 0xf6, 0x05, 0x67, 0xc1, 0xa1, 0xff, 0x56, 0x82, 0xff, 0xa0, 0x74, 0xf7, 0x82, - 0xe3, 0x2c, 0xd8, 0x66, 0xc5, 0x68, 0x59, 0x15, 0xa3, 0xd9, 0x74, 0x7c, 0xc3, 0xb7, 0x9c, 0xa6, - 0x07, 0x6f, 0x8f, 0xd4, 0x1c, 0xaf, 0xe1, 0x78, 0x95, 0x39, 0xc3, 0x83, 0x4e, 0x2b, 0xcb, 0xc7, - 0xe7, 0x4c, 0xdf, 0x38, 0x5e, 0x69, 0x19, 0x0b, 0x56, 0x93, 0x56, 0x86, 0xba, 0xfb, 0x64, 0x8c, - 0xb6, 0x0c, 0xd7, 0x68, 0x70, 0x6a, 0xfb, 0x65, 0x35, 0x22, 0xee, 0x59, 0xa5, 0xe7, 0x53, 0xc8, - 0xf8, 0x56, 0xcd, 0x6a, 0x19, 0x4d, 0x9f, 0x73, 0x26, 0xab, 0x66, 0xb6, 0x9c, 0xda, 0xa2, 0xbe, - 0xe0, 0x3a, 0xed, 0x96, 0x5e, 0x37, 0x7c, 0x03, 0xea, 0x1e, 0x94, 0xd5, 0xf5, 0x4c, 0xdf, 0xb7, - 0x4d, 0xdd, 0x68, 0x38, 0xed, 0x90, 0xe8, 0xf1, 0x2c, 0xa2, 0xcb, 0x86, 0x6d, 0xd5, 0x63, 0x1a, - 0x22, 0x52, 0x76, 0x9d, 0xda, 0x9c, 0xe1, 0xd7, 0x16, 0xa1, 0xce, 0x61, 0x59, 0x1d, 0xdf, 0x59, - 0x32, 0x9b, 0x4e, 0xc3, 0xaa, 0x79, 0x22, 0xab, 0xd2, 0xaa, 0xed, 0xa6, 0xe5, 0xeb, 0xce, 0xbc, + 0xab, 0xab, 0x5e, 0xbd, 0xa3, 0xaa, 0xfa, 0xbd, 0x57, 0x55, 0xbf, 0x41, 0x7b, 0xad, 0xe6, 0x9c, + 0xe9, 0x9a, 0xcd, 0x9a, 0x59, 0x89, 0xfe, 0x7b, 0xb3, 0x6d, 0xba, 0xcb, 0x63, 0x2d, 0xd7, 0xf1, + 0x1d, 0xfc, 0x74, 0x58, 0x3c, 0x16, 0xfe, 0x57, 0xde, 0x6a, 0x34, 0xac, 0xa6, 0x53, 0xa1, 0x7f, + 0x59, 0xbd, 0xf2, 0xb6, 0x79, 0x67, 0xde, 0xa1, 0xff, 0x56, 0x82, 0xff, 0xa0, 0x74, 0xf7, 0xbc, + 0xe3, 0xcc, 0xdb, 0x66, 0xc5, 0x68, 0x59, 0x15, 0xa3, 0xd9, 0x74, 0x7c, 0xc3, 0xb7, 0x9c, 0xa6, + 0x07, 0x6f, 0x8f, 0xd4, 0x1c, 0xaf, 0xe1, 0x78, 0x95, 0x59, 0xc3, 0x83, 0x4e, 0x2b, 0x4b, 0xc7, + 0x67, 0x4d, 0xdf, 0x38, 0x5e, 0x69, 0x19, 0xf3, 0x56, 0x93, 0x56, 0x86, 0xba, 0xfb, 0x64, 0x8c, + 0xb6, 0x0c, 0xd7, 0x68, 0x70, 0x6a, 0xfb, 0x65, 0x35, 0x22, 0xee, 0x59, 0xa5, 0xe7, 0x52, 0xc8, + 0xf8, 0x56, 0xcd, 0x6a, 0x19, 0x4d, 0x9f, 0x73, 0x26, 0xab, 0x66, 0xb6, 0x9c, 0xda, 0x82, 0x3e, + 0xef, 0x3a, 0xed, 0x96, 0x5e, 0x37, 0x7c, 0x03, 0xea, 0x1e, 0x94, 0xd5, 0xf5, 0x4c, 0xdf, 0xb7, + 0x4d, 0xdd, 0x68, 0x38, 0xed, 0x90, 0xe8, 0xf1, 0x2c, 0xa2, 0x4b, 0x86, 0x6d, 0xd5, 0x63, 0x1a, + 0x22, 0x52, 0x76, 0x9d, 0xda, 0xac, 0xe1, 0xd7, 0x16, 0xa0, 0xce, 0x61, 0x59, 0x1d, 0xdf, 0x59, + 0x34, 0x9b, 0x4e, 0xc3, 0xaa, 0x79, 0x22, 0xab, 0xd2, 0xaa, 0xed, 0xa6, 0xe5, 0xeb, 0xce, 0x9c, 0x5e, 0x73, 0x1a, 0xad, 0xb6, 0xcf, 0x15, 0x25, 0x1d, 0x18, 0x0d, 0xa7, 0x6e, 0xda, 0x2a, 0x75, - 0xfb, 0x4e, 0x4b, 0x6f, 0x58, 0x4d, 0xd3, 0x85, 0x4a, 0x63, 0xa2, 0x85, 0xb9, 0x6d, 0x6b, 0x8e, + 0xfb, 0x4e, 0x4b, 0x6f, 0x58, 0x4d, 0xd3, 0x85, 0x4a, 0xa3, 0xa2, 0x85, 0xb9, 0x6d, 0x6b, 0x8e, 0xc5, 0xad, 0x7a, 0x54, 0x69, 0x33, 0xdd, 0xb7, 0x1a, 0xa6, 0xd3, 0xe6, 0xfa, 0x3b, 0xad, 0xae, 0x1c, 0x69, 0x4f, 0xaf, 0x9b, 0xbe, 0x61, 0xd9, 0x5c, 0x89, 0x27, 0xd2, 0xf5, 0xde, 0x32, 0xdd, - 0x79, 0xc7, 0x6d, 0x18, 0x41, 0x7b, 0xaf, 0xdd, 0x68, 0x18, 0x7c, 0xdc, 0xcb, 0xad, 0xea, 0xbb, - 0x86, 0xd5, 0xb4, 0x9a, 0x0b, 0xba, 0x6f, 0x78, 0x4b, 0x50, 0xf1, 0x58, 0x66, 0x45, 0xdd, 0x5b, - 0x69, 0xd6, 0x54, 0x64, 0x17, 0x0d, 0xb7, 0xfe, 0xd8, 0x70, 0x4d, 0xbd, 0xe9, 0xd4, 0x4d, 0x95, - 0xa9, 0xe8, 0x40, 0x35, 0x6c, 0xbd, 0xdd, 0x5a, 0x70, 0x8d, 0xb0, 0xea, 0x0b, 0xb2, 0xaa, 0x4d, - 0xd3, 0x7f, 0xec, 0xb8, 0x4b, 0x22, 0x49, 0xe9, 0x14, 0x9a, 0x73, 0xad, 0xfa, 0x82, 0xb2, 0x53, - 0xcf, 0x37, 0x7c, 0x4f, 0xaf, 0x9b, 0xcb, 0xa6, 0xed, 0xb4, 0x42, 0xcb, 0xee, 0x4d, 0x55, 0x2a, - 0x54, 0x38, 0x24, 0x1d, 0x40, 0x76, 0xc0, 0x8f, 0xbe, 0x6c, 0xba, 0x5e, 0x34, 0xb5, 0xc7, 0xa5, - 0xa4, 0x9e, 0xd4, 0xec, 0x76, 0xdd, 0xac, 0xeb, 0x9d, 0x93, 0xf3, 0x25, 0x59, 0xfd, 0x9a, 0xd3, - 0x9c, 0xb7, 0xdc, 0x06, 0xb3, 0x7f, 0xcb, 0xa9, 0xe9, 0xe6, 0xb2, 0x19, 0xb6, 0x90, 0xf2, 0x62, - 0x5b, 0x6f, 0xb5, 0xad, 0xba, 0xe5, 0xaf, 0xe8, 0x2d, 0xc7, 0xb1, 0x95, 0xcb, 0x8c, 0x53, 0xd3, - 0x97, 0x27, 0x58, 0x0d, 0xb2, 0x1d, 0xe1, 0xbb, 0xc1, 0x52, 0x35, 0x4b, 0xd7, 0x9e, 0xaa, 0xf9, - 0x56, 0xdb, 0xf4, 0x7c, 0xf2, 0x00, 0x3d, 0x1d, 0x2b, 0xf5, 0x5a, 0x4e, 0xd3, 0x33, 0xf1, 0x24, - 0xda, 0xc4, 0xd6, 0xa8, 0x51, 0x6d, 0x9f, 0x76, 0x68, 0xcb, 0xc4, 0xae, 0x71, 0xc9, 0x72, 0x3a, - 0xce, 0x1a, 0x4d, 0x0f, 0xbc, 0xfd, 0x9d, 0xbd, 0x4f, 0x7d, 0xf6, 0x9f, 0x3f, 0x77, 0x44, 0xab, - 0x42, 0x2b, 0xf2, 0x12, 0x1a, 0xa5, 0x64, 0xaf, 0x99, 0xfe, 0x0d, 0x5e, 0x1d, 0xba, 0xc4, 0xdb, - 0xd1, 0x46, 0xab, 0x59, 0x37, 0x9f, 0x50, 0xd2, 0x03, 0x55, 0xf6, 0x40, 0x74, 0xb4, 0x53, 0xd2, - 0x02, 0xd8, 0x99, 0x46, 0x03, 0x61, 0xaf, 0xc0, 0xd1, 0x98, 0x94, 0xa3, 0xb0, 0xe9, 0xf4, 0x86, - 0x80, 0xa9, 0x6a, 0xd4, 0x8c, 0xcc, 0x01, 0x4b, 0x53, 0xb6, 0xdd, 0xc1, 0xd2, 0x55, 0x84, 0xa2, - 0x85, 0x1b, 0x3a, 0x78, 0x61, 0x9c, 0xad, 0x01, 0xe3, 0xc1, 0x1a, 0x30, 0xce, 0x3e, 0x2d, 0xb0, - 0x12, 0x8c, 0xcf, 0x1a, 0x0b, 0xbc, 0x6d, 0x55, 0x68, 0x49, 0x3e, 0xab, 0x81, 0x14, 0xf1, 0x4e, - 0xe4, 0x52, 0xf4, 0x75, 0x21, 0x05, 0xbe, 0x16, 0xe3, 0xb4, 0x44, 0x39, 0x3d, 0x98, 0xc9, 0x29, - 0x63, 0x20, 0xc6, 0xea, 0x04, 0x2a, 0x73, 0x7d, 0xcf, 0x46, 0x23, 0x55, 0x6d, 0xa3, 0x05, 0xb4, - 0x4b, 0xda, 0x06, 0xe4, 0xbb, 0x8e, 0xb6, 0x08, 0x83, 0x1e, 0xd4, 0xb8, 0x2f, 0x6d, 0xe4, 0xf0, - 0x7a, 0x20, 0xa3, 0xd8, 0x94, 0xd4, 0x81, 0xb9, 0x29, 0xdb, 0x96, 0x30, 0xd7, 0x2b, 0x6b, 0x7d, - 0x4b, 0x03, 0x79, 0x92, 0xdd, 0xa4, 0xc9, 0xd3, 0xd7, 0xa5, 0x3c, 0x3d, 0xb3, 0x1a, 0x7e, 0x0e, - 0x0d, 0xce, 0xd9, 0x4e, 0x6d, 0x49, 0x5f, 0x34, 0xad, 0x85, 0x45, 0x7f, 0xb4, 0x6f, 0x9f, 0x76, - 0xa8, 0xaf, 0xba, 0x85, 0x96, 0x5d, 0xa7, 0x45, 0xe4, 0x3c, 0xda, 0x47, 0x85, 0x0a, 0x07, 0x91, - 0x44, 0x83, 0xa3, 0x68, 0xb3, 0x51, 0xaf, 0xbb, 0xa6, 0xe7, 0x81, 0x81, 0xf9, 0x23, 0x79, 0x80, - 0x9e, 0x53, 0xb4, 0x06, 0xc5, 0x3c, 0x8b, 0x36, 0xb5, 0xda, 0x73, 0x4b, 0xe6, 0x0a, 0xb4, 0x86, - 0xa7, 0x80, 0xec, 0x9c, 0x61, 0x07, 0x1f, 0x25, 0x2a, 0x63, 0x5f, 0x95, 0x3f, 0x92, 0x53, 0x68, - 0x0f, 0x1f, 0x39, 0x55, 0xa3, 0x59, 0x77, 0x1a, 0x57, 0x9e, 0x98, 0xb5, 0xb6, 0xef, 0xb8, 0xc2, - 0x80, 0xa3, 0x1f, 0x69, 0x3e, 0xe0, 0xe8, 0x03, 0xa9, 0xa3, 0xb1, 0xb4, 0x66, 0xe1, 0x9c, 0xea, - 0x37, 0xa1, 0xac, 0xe0, 0x80, 0x0b, 0xdb, 0x91, 0x37, 0x22, 0xe6, 0xae, 0x04, 0x1f, 0x82, 0x6b, - 0x81, 0x53, 0x73, 0xd9, 0xf0, 0x0d, 0xce, 0xdc, 0x5e, 0xb4, 0x85, 0x7d, 0x76, 0xa3, 0x39, 0xb1, - 0xa1, 0x8a, 0x68, 0xd1, 0x8d, 0xa0, 0x04, 0xef, 0x44, 0xfd, 0x94, 0x61, 0xdd, 0xaa, 0x53, 0xc9, - 0x07, 0xaa, 0x9b, 0xe9, 0xf3, 0x8d, 0x3a, 0x69, 0x47, 0x22, 0x24, 0x89, 0x83, 0x08, 0xf7, 0xd0, - 0x48, 0xd2, 0x43, 0x03, 0x51, 0xf6, 0x4b, 0x45, 0x89, 0x93, 0x01, 0x69, 0x86, 0xcd, 0x58, 0x29, - 0x59, 0x00, 0x99, 0xa6, 0x6c, 0x5b, 0x2e, 0x53, 0xaf, 0x26, 0xd1, 0x9f, 0x6a, 0x20, 0xa0, 0xa4, - 0x27, 0xa5, 0x80, 0x7d, 0xeb, 0x12, 0xb0, 0x77, 0x0b, 0xe1, 0xc5, 0x68, 0x51, 0xbb, 0x47, 0x9d, - 0xdf, 0x29, 0xea, 0xfb, 0x72, 0x3d, 0xed, 0xeb, 0x5c, 0xd4, 0x06, 0xe2, 0x8b, 0x95, 0x8d, 0x76, - 0xcb, 0x09, 0x80, 0xf8, 0xb7, 0xd0, 0x50, 0xcc, 0xab, 0x06, 0x65, 0x3f, 0x27, 0x95, 0x5d, 0xa4, - 0x00, 0x92, 0x0f, 0x7a, 0x42, 0x19, 0x31, 0xa3, 0x35, 0x4b, 0xc6, 0x6e, 0xaf, 0xcc, 0xfa, 0x05, - 0x0d, 0xa4, 0xea, 0xe8, 0x27, 0x5d, 0xaa, 0xbe, 0xae, 0xa5, 0xea, 0x9d, 0x35, 0x2d, 0x74, 0xa0, - 0x73, 0xba, 0x3d, 0x8c, 0xe2, 0x93, 0xdc, 0x66, 0x4d, 0x4e, 0xfa, 0x52, 0x72, 0xd2, 0x93, 0x5f, - 0xd5, 0xd0, 0xf3, 0x19, 0x7d, 0x81, 0xae, 0x16, 0xd1, 0x8e, 0x94, 0x70, 0x09, 0x2c, 0x74, 0x24, - 0x63, 0x1e, 0x08, 0x44, 0x41, 0x7d, 0xcf, 0x98, 0xb2, 0x97, 0xa4, 0x09, 0xe2, 0xc7, 0x26, 0xa3, - 0x44, 0xfc, 0x5e, 0x0d, 0x93, 0x7f, 0xe0, 0x3a, 0x48, 0xef, 0x30, 0x8f, 0x0e, 0xfa, 0x7a, 0xa8, - 0x83, 0xde, 0x8d, 0xa5, 0x19, 0x58, 0xd9, 0x66, 0x9d, 0xda, 0x74, 0x10, 0xb7, 0x9a, 0xde, 0x55, - 0xc7, 0xbd, 0xe7, 0x47, 0xaa, 0xe8, 0xf8, 0x1c, 0x6b, 0x9d, 0x9f, 0xe3, 0x36, 0xda, 0x9b, 0x4a, - 0x04, 0x54, 0x53, 0x45, 0x03, 0x81, 0xa7, 0x4e, 0x63, 0x63, 0x50, 0x46, 0x45, 0xfe, 0x11, 0x73, - 0x66, 0x80, 0xc6, 0x23, 0xcb, 0x5f, 0x14, 0x3e, 0x69, 0x5c, 0x23, 0xfd, 0x2d, 0xe8, 0x85, 0x7c, - 0x51, 0x43, 0xe5, 0xf4, 0xea, 0x39, 0x86, 0xff, 0x0e, 0xb4, 0xb9, 0xd5, 0x9e, 0xd3, 0x83, 0x8f, - 0x7c, 0x29, 0xfc, 0xc8, 0xdf, 0x34, 0x57, 0xf0, 0x18, 0xda, 0xb2, 0x68, 0x3e, 0xd1, 0xf9, 0xcb, - 0x3e, 0xfa, 0x72, 0x60, 0xd1, 0x7c, 0x32, 0xcb, 0xde, 0x5f, 0x12, 0xa5, 0xd9, 0x40, 0xa5, 0xd9, - 0xa3, 0x94, 0xa6, 0x83, 0xf7, 0x6b, 0x88, 0x70, 0x95, 0x09, 0x76, 0xed, 0x42, 0xf7, 0x9f, 0xd0, - 0xd0, 0x7e, 0x25, 0x25, 0x30, 0xc0, 0x87, 0xd0, 0x30, 0x0d, 0x95, 0xc2, 0x2a, 0x60, 0x85, 0x13, - 0x69, 0x7c, 0x0b, 0xc4, 0x52, 0x2c, 0x31, 0xd4, 0x12, 0xbb, 0x24, 0x7f, 0xa3, 0xa1, 0x31, 0x75, - 0xbb, 0xf7, 0xd2, 0x24, 0xaf, 0x75, 0xc8, 0xc7, 0xec, 0x42, 0xb2, 0xe5, 0x93, 0x8b, 0x73, 0x03, - 0x96, 0x99, 0x40, 0xaf, 0x13, 0xeb, 0xb3, 0xd1, 0x2f, 0xf0, 0x15, 0x24, 0x9d, 0x16, 0x58, 0x69, - 0x2e, 0xc5, 0x4a, 0xa7, 0xba, 0xb0, 0xd2, 0xc3, 0x09, 0xb9, 0x60, 0xdf, 0xd0, 0xd0, 0xbe, 0xac, - 0x96, 0xef, 0xa5, 0xa5, 0xee, 0xa6, 0x58, 0xea, 0x40, 0xb6, 0x8c, 0x69, 0x22, 0x7d, 0x92, 0x7f, - 0xc9, 0x83, 0xda, 0x13, 0xf7, 0x7c, 0xc7, 0x35, 0x67, 0x9c, 0x46, 0xc3, 0x0a, 0x5d, 0x86, 0x49, - 0xb4, 0x3b, 0xe8, 0xd3, 0x0b, 0x94, 0x1d, 0xfc, 0x75, 0x7d, 0x5d, 0x62, 0xb4, 0xd1, 0x96, 0x53, - 0xa3, 0xf6, 0xb8, 0x17, 0xd4, 0x98, 0x8e, 0x2c, 0x88, 0x2b, 0xe8, 0x69, 0x41, 0x76, 0x9d, 0x07, - 0x16, 0x4c, 0x70, 0x2c, 0xbc, 0x9a, 0x82, 0x18, 0x63, 0x11, 0x7c, 0xd3, 0x4e, 0x86, 0xc0, 0xd2, - 0xdb, 0xd1, 0xc6, 0x5a, 0xe8, 0x29, 0x0d, 0x55, 0xd9, 0x03, 0xde, 0x85, 0x06, 0x5c, 0xc7, 0xf1, - 0xf5, 0x45, 0xc3, 0x5b, 0xa4, 0xd4, 0x07, 0xab, 0xfd, 0x41, 0xc1, 0x75, 0xc3, 0x5b, 0x0c, 0x9a, - 0xcc, 0x3b, 0xed, 0x66, 0x9d, 0xaa, 0xb4, 0xbf, 0xca, 0x1e, 0xc8, 0xaf, 0x69, 0x30, 0x50, 0x6f, - 0xdf, 0xba, 0xe3, 0xd4, 0xcd, 0x47, 0x94, 0xe1, 0xcb, 0x96, 0xe7, 0xbb, 0xd6, 0x5c, 0x3b, 0xd0, - 0xce, 0xcf, 0x4c, 0x07, 0x1f, 0x81, 0x51, 0x9f, 0xce, 0x18, 0xe8, 0xe2, 0x1c, 0xda, 0xfc, 0x98, - 0xbe, 0xf5, 0x94, 0x1e, 0x96, 0x48, 0xa7, 0xca, 0x5b, 0x44, 0x5a, 0x29, 0x89, 0x5a, 0xf9, 0x30, - 0x3a, 0x14, 0x86, 0xbd, 0x09, 0x13, 0x74, 0xcc, 0xe0, 0x75, 0x2a, 0x86, 0x3c, 0x46, 0x87, 0x73, - 0xf4, 0x05, 0xb2, 0xbe, 0x8a, 0x36, 0xd7, 0xd8, 0x2b, 0x90, 0xf5, 0xa5, 0xd4, 0x61, 0x2f, 0x12, - 0x0a, 0xa6, 0x28, 0xe8, 0xb5, 0xca, 0x09, 0x90, 0xcf, 0x68, 0x68, 0x97, 0xa2, 0x62, 0x9a, 0xc5, - 0xb4, 0x34, 0x8b, 0x45, 0x83, 0xb2, 0x94, 0x3a, 0x28, 0xfb, 0x12, 0x83, 0x32, 0x31, 0xdb, 0x37, - 0x24, 0x66, 0x3b, 0x71, 0xd1, 0x4b, 0x5c, 0x39, 0x69, 0xe3, 0xa0, 0xe7, 0x06, 0xf9, 0x94, 0x86, - 0x8e, 0x17, 0xe8, 0x14, 0x2c, 0xf3, 0x26, 0x1a, 0xaa, 0x8b, 0x15, 0xc0, 0x3e, 0x2f, 0x67, 0x8e, - 0x45, 0x91, 0xac, 0x68, 0xa7, 0x38, 0xb9, 0x80, 0xab, 0xfd, 0x39, 0x9a, 0x15, 0xb7, 0x9a, 0x30, - 0x7d, 0x4a, 0x45, 0xa7, 0x0f, 0xd9, 0x13, 0x85, 0x86, 0x33, 0x6d, 0xd7, 0x35, 0x9b, 0xcc, 0xcf, - 0xe7, 0xb9, 0xd3, 0x93, 0x51, 0xe0, 0x17, 0x7f, 0x1d, 0x2d, 0x63, 0xd4, 0x43, 0x85, 0x84, 0x01, - 0x7b, 0x20, 0x7b, 0xa3, 0x6c, 0xc3, 0xfd, 0x70, 0xb3, 0x43, 0x88, 0xcc, 0x89, 0x1f, 0x65, 0x0c, - 0x92, 0x15, 0x42, 0x87, 0x71, 0x6b, 0x62, 0x9f, 0x44, 0x99, 0x30, 0x88, 0x53, 0xe1, 0xf1, 0xb4, - 0x1f, 0x2b, 0x25, 0xb7, 0x61, 0xa2, 0x5e, 0x33, 0xfd, 0x07, 0x4d, 0xcb, 0x7f, 0x6d, 0x7e, 0x86, - 0x6d, 0xab, 0xcc, 0xba, 0x56, 0xcd, 0x9c, 0x75, 0x9d, 0x96, 0xe3, 0x19, 0x76, 0xfe, 0xa0, 0xf8, - 0x53, 0x1a, 0x3a, 0x92, 0x87, 0x1e, 0x48, 0x74, 0x13, 0xf5, 0xb7, 0xa0, 0x0c, 0x44, 0x91, 0x7b, - 0xc0, 0x0a, 0x52, 0x21, 0x01, 0x3c, 0x8a, 0x36, 0xd7, 0xcd, 0x79, 0xa3, 0x6d, 0xfb, 0x10, 0xb5, - 0xf1, 0x47, 0xb2, 0x1f, 0xb2, 0x5b, 0xa2, 0xb9, 0x92, 0x99, 0x11, 0xb2, 0x02, 0xee, 0x67, 0x4a, - 0xa5, 0xf7, 0x32, 0x6b, 0x73, 0x80, 0x7b, 0xbe, 0xae, 0xb9, 0x6c, 0x39, 0x6d, 0x4f, 0xce, 0xe0, - 0x47, 0xb8, 0x57, 0x9b, 0x52, 0xeb, 0xbd, 0xe4, 0x50, 0x47, 0xcf, 0xb0, 0xef, 0x96, 0x53, 0x37, - 0x6d, 0x6f, 0xca, 0xb6, 0x7b, 0x1d, 0x51, 0xfe, 0xba, 0x86, 0x9e, 0x4d, 0xf6, 0x00, 0x02, 0x9d, - 0x8e, 0x72, 0x84, 0xc1, 0x4c, 0x2e, 0xcb, 0x67, 0x72, 0x50, 0x03, 0x98, 0x67, 0xd5, 0x7b, 0x17, - 0x10, 0x9e, 0x40, 0x3b, 0xa2, 0x99, 0xd9, 0xba, 0x6d, 0x35, 0x4d, 0x37, 0x3b, 0xa3, 0xfa, 0x81, - 0x68, 0x2b, 0x24, 0x6a, 0x04, 0x12, 0x5d, 0x42, 0x03, 0xe1, 0xce, 0x23, 0xe8, 0x6c, 0x4f, 0xca, - 0x14, 0x66, 0x2d, 0x79, 0xac, 0xe4, 0xc3, 0x33, 0x31, 0x80, 0xa5, 0x29, 0xdb, 0x4e, 0xb2, 0xd4, - 0x2b, 0x8b, 0xfc, 0xae, 0x16, 0xed, 0x9c, 0x64, 0x49, 0xd0, 0x57, 0x58, 0x82, 0xde, 0x59, 0xc7, - 0x81, 0x48, 0x5b, 0xdc, 0x41, 0xba, 0xcf, 0x36, 0x62, 0xb9, 0x4a, 0x8e, 0xa0, 0x11, 0xf3, 0x49, - 0xcb, 0x72, 0x69, 0x83, 0xeb, 0xd1, 0x07, 0x73, 0x43, 0xb5, 0xa3, 0x3c, 0x58, 0xe3, 0x42, 0xee, - 0x6f, 0xf0, 0xb4, 0xae, 0x58, 0x44, 0xfe, 0x1f, 0x64, 0xda, 0xa5, 0x1d, 0x82, 0x7e, 0xde, 0x87, - 0xb6, 0x75, 0x6c, 0x0b, 0x83, 0x2d, 0x9e, 0x57, 0xef, 0xfd, 0x00, 0x25, 0xd0, 0xd7, 0x88, 0x95, - 0x28, 0x27, 0x16, 0x88, 0x2b, 0x6e, 0x35, 0x25, 0xc4, 0xed, 0xd5, 0x08, 0xf8, 0xaa, 0x06, 0x92, - 0x4a, 0xfb, 0x52, 0x4b, 0xda, 0xb7, 0x6e, 0x49, 0x7b, 0x37, 0x42, 0x16, 0xa2, 0x6f, 0x5c, 0xd8, - 0x79, 0x14, 0x29, 0x5d, 0x66, 0x9b, 0xef, 0xc2, 0x8c, 0x66, 0xc9, 0xbe, 0x3a, 0x0c, 0x11, 0xfe, - 0x98, 0x63, 0x64, 0xfc, 0xb6, 0xf0, 0xf5, 0x53, 0xf5, 0x04, 0xaa, 0x6b, 0xa3, 0xb2, 0x95, 0x5a, - 0x4b, 0xf9, 0x3d, 0x4c, 0x27, 0x0e, 0xda, 0x54, 0x10, 0x26, 0x5e, 0xe4, 0x9b, 0x67, 0xab, 0xa3, - 0x57, 0x63, 0xe9, 0xdf, 0xb8, 0x6a, 0x32, 0x7a, 0xcd, 0xa9, 0x9a, 0xbe, 0xf7, 0x44, 0x35, 0xbd, - 0x1b, 0x72, 0x6f, 0xa2, 0x63, 0x8a, 0x81, 0x40, 0x37, 0xd0, 0x4d, 0xdf, 0x74, 0x43, 0x35, 0x8f, - 0xa0, 0x3e, 0xab, 0xce, 0x04, 0x1b, 0xa8, 0x06, 0xff, 0xe2, 0xdd, 0x68, 0xc0, 0x65, 0x2f, 0x4d, - 0x17, 0xc6, 0x5a, 0x54, 0x40, 0xfe, 0xb8, 0x84, 0x5e, 0xcc, 0xd9, 0x01, 0x68, 0xf4, 0x0e, 0x1a, - 0x81, 0xf4, 0x82, 0xe3, 0xea, 0x2d, 0xe7, 0xb1, 0xe9, 0x7a, 0xca, 0xdd, 0x98, 0x87, 0xbc, 0xf2, - 0x6c, 0x50, 0xb7, 0xba, 0x75, 0x39, 0xf6, 0xec, 0xe1, 0xe7, 0xd1, 0x70, 0x8d, 0x79, 0x4a, 0x3c, - 0x04, 0x61, 0x4e, 0xd7, 0x10, 0x94, 0xc2, 0x72, 0x7a, 0x23, 0x70, 0xca, 0x98, 0xd5, 0xfa, 0xba, - 0xb2, 0x5a, 0x95, 0xb7, 0xc7, 0x57, 0x02, 0xe3, 0x70, 0xb9, 0x68, 0x54, 0x95, 0xb6, 0xc4, 0x24, - 0x14, 0xe1, 0x55, 0x85, 0x86, 0xe4, 0x1a, 0x1a, 0x8e, 0xcb, 0x16, 0x38, 0xec, 0x54, 0x21, 0xdc, - 0x61, 0xa7, 0x0f, 0xd9, 0x1b, 0x01, 0xb7, 0x61, 0x44, 0x53, 0x07, 0x6a, 0x36, 0x3a, 0x99, 0x73, - 0x8f, 0x1d, 0xcc, 0x99, 0x5e, 0x11, 0xa3, 0x86, 0xcc, 0xcd, 0x44, 0xf2, 0x1b, 0x1a, 0x3a, 0x9a, - 0x8b, 0x1e, 0x18, 0xd4, 0x86, 0xcc, 0x7a, 0x67, 0x4d, 0xb0, 0xeb, 0xb1, 0x74, 0x77, 0x4f, 0x42, - 0x9d, 0x4d, 0x8e, 0x34, 0x92, 0x64, 0x05, 0x62, 0xd6, 0x54, 0xe6, 0x24, 0xdb, 0xcd, 0x99, 0xfb, - 0xa7, 0x07, 0xd0, 0x90, 0x10, 0x3c, 0x84, 0x6b, 0x6a, 0xbc, 0x30, 0x08, 0xe9, 0x8f, 0x17, 0xe8, - 0x3b, 0x8f, 0x7a, 0xb4, 0x5e, 0xab, 0xa7, 0x85, 0x5e, 0x88, 0xed, 0x87, 0x74, 0x56, 0xe9, 0xf5, - 0x82, 0xfa, 0x3d, 0x0d, 0x1d, 0xcc, 0xec, 0xf2, 0x67, 0x31, 0x54, 0x7a, 0xb7, 0x88, 0x1e, 0x01, - 0x07, 0xf4, 0x3e, 0x9c, 0x4e, 0xbb, 0x6f, 0x78, 0x4b, 0x5c, 0x8d, 0xc3, 0xa8, 0x64, 0xf1, 0x2f, - 0x74, 0xc9, 0xaa, 0x93, 0x2a, 0x9c, 0xc0, 0x89, 0xd7, 0x05, 0xf9, 0x4f, 0xa1, 0x0d, 0xbe, 0xe1, - 0x2d, 0x29, 0x77, 0x60, 0x63, 0x0d, 0x69, 0x75, 0x72, 0x01, 0x68, 0x5e, 0x87, 0xf3, 0x6e, 0x77, - 0x9c, 0xba, 0x99, 0x7f, 0x27, 0x91, 0x3c, 0x84, 0xd3, 0x2c, 0x89, 0xe6, 0xc0, 0xd3, 0xcb, 0x68, - 0x63, 0x33, 0x28, 0x00, 0xa6, 0xe4, 0x39, 0xf9, 0x78, 0x53, 0xd6, 0x80, 0x8c, 0x41, 0xfe, 0x21, - 0xf6, 0x32, 0x0a, 0xc9, 0xc8, 0xeb, 0x90, 0x69, 0xe8, 0x7c, 0xdf, 0xd9, 0x75, 0x5f, 0xb1, 0xae, - 0x9f, 0x03, 0xe7, 0xf3, 0x6e, 0xdb, 0x6c, 0x9b, 0x75, 0x51, 0x65, 0xe1, 0xc9, 0xb2, 0x37, 0xc0, - 0x67, 0x94, 0x56, 0x01, 0x06, 0xce, 0xa0, 0x8d, 0x81, 0x82, 0xd5, 0xa9, 0xcd, 0x98, 0x41, 0x58, - 0xfd, 0x30, 0x33, 0x23, 0xbe, 0x13, 0x24, 0x7f, 0x04, 0x9a, 0xe9, 0x78, 0xbd, 0xde, 0x7e, 0xef, - 0xc0, 0xf4, 0x8e, 0x9f, 0x80, 0x82, 0x4c, 0xc1, 0x3d, 0xdf, 0xf0, 0xc3, 0x61, 0xd1, 0xb1, 0xa4, - 0x69, 0xb2, 0x25, 0xcd, 0x80, 0xb9, 0xab, 0xa2, 0x17, 0x1d, 0xba, 0x79, 0x2c, 0x46, 0x2c, 0xf0, - 0x84, 0xc7, 0x10, 0x72, 0xcd, 0x56, 0xdb, 0x8f, 0x66, 0xd9, 0xc6, 0xaa, 0x50, 0x42, 0x8e, 0x46, - 0x4e, 0x6f, 0xfc, 0x9c, 0x93, 0x84, 0x6b, 0xf2, 0x6d, 0xc1, 0x71, 0x55, 0xd5, 0x0e, 0x37, 0x75, - 0x77, 0x8a, 0xe9, 0x38, 0xee, 0x07, 0xd0, 0x93, 0x97, 0xca, 0x15, 0x25, 0x8d, 0xf0, 0x8e, 0x96, - 0xfc, 0x45, 0xc7, 0x4e, 0x52, 0xa9, 0x63, 0x27, 0x09, 0xef, 0x44, 0xfd, 0xf0, 0x95, 0xa9, 0xc3, - 0xb9, 0x28, 0xee, 0xb1, 0x93, 0xb7, 0x35, 0xb4, 0x23, 0xa5, 0xcb, 0xc0, 0x7f, 0x11, 0x65, 0xb0, - 0xe4, 0x96, 0x12, 0xd4, 0x5f, 0x8a, 0xa9, 0xff, 0x30, 0x1a, 0x31, 0xe7, 0xe7, 0xcd, 0x9a, 0x6f, - 0x2d, 0x9b, 0x3a, 0xd4, 0xd8, 0x40, 0x6b, 0x6c, 0x0d, 0xcb, 0x59, 0x5e, 0x11, 0xef, 0x47, 0x43, - 0x35, 0xa3, 0xd5, 0x32, 0xeb, 0xbc, 0xde, 0x46, 0x5a, 0x6f, 0x90, 0x15, 0x3e, 0x92, 0x99, 0xb3, - 0xaf, 0xc3, 0x9c, 0x9f, 0x2f, 0xa1, 0xed, 0x82, 0x28, 0x57, 0xdb, 0xb6, 0xcd, 0xe4, 0x38, 0x88, - 0xb6, 0x1a, 0x35, 0x9a, 0x94, 0x4e, 0xa4, 0x45, 0x87, 0xa1, 0x98, 0xa7, 0x44, 0x0f, 0xa3, 0x11, - 0xa7, 0x65, 0xba, 0xd4, 0xff, 0x8b, 0x6f, 0x54, 0x6c, 0xe5, 0xe5, 0xbc, 0x6a, 0x06, 0x33, 0xf8, - 0x1c, 0x2a, 0x9b, 0x86, 0xdb, 0x34, 0xeb, 0x7a, 0xcd, 0xb1, 0x9a, 0x5e, 0x38, 0x00, 0x58, 0xda, - 0x93, 0xa9, 0x61, 0x07, 0xab, 0x31, 0x13, 0x54, 0x10, 0x53, 0x6a, 0xf8, 0x02, 0xda, 0xe5, 0x9a, - 0x8f, 0x0d, 0xb7, 0x1e, 0x36, 0xb7, 0x0d, 0xdf, 0xf4, 0x78, 0x6b, 0xa6, 0x9c, 0x51, 0x5e, 0x85, - 0xb6, 0xbf, 0x45, 0x2b, 0xb0, 0xe6, 0x87, 0x21, 0xbd, 0xe5, 0xd1, 0x03, 0xe0, 0xb6, 0xe9, 0x9b, - 0xf5, 0xd1, 0x4d, 0x34, 0x35, 0xbf, 0x95, 0x95, 0xcf, 0xf0, 0xe2, 0x30, 0xed, 0x27, 0xee, 0xe3, - 0x85, 0x8a, 0xe3, 0x43, 0xff, 0xa3, 0x3c, 0xf7, 0x26, 0xaf, 0x14, 0x46, 0xb9, 0x62, 0x96, 0xd9, - 0x8b, 0x0d, 0xf5, 0xc3, 0x59, 0x43, 0x3d, 0x22, 0xb7, 0x4d, 0x24, 0x42, 0x8b, 0xc8, 0x47, 0x61, - 0x57, 0x86, 0x3e, 0x4d, 0xaf, 0x04, 0xc1, 0xef, 0xac, 0xe9, 0x5a, 0x4e, 0x7d, 0x7a, 0xe5, 0x32, - 0x3f, 0xc3, 0xcc, 0x17, 0x97, 0xdd, 0x68, 0x20, 0x3c, 0xd7, 0x0c, 0x56, 0x8e, 0x0a, 0xf0, 0x2e, - 0x34, 0x10, 0xc4, 0xdf, 0xfa, 0xbc, 0xeb, 0x34, 0x60, 0xa2, 0xf4, 0x07, 0x05, 0x57, 0x5d, 0xa7, - 0x81, 0x77, 0xa0, 0xcd, 0xf4, 0xa5, 0xef, 0xc0, 0x24, 0xd9, 0x14, 0x3c, 0xde, 0x77, 0x88, 0x0d, - 0xeb, 0x84, 0xba, 0x7f, 0x50, 0xc3, 0x45, 0xb4, 0x31, 0x5b, 0xf2, 0xb0, 0x99, 0x40, 0xb2, 0xca, - 0xda, 0x91, 0x45, 0x08, 0x5b, 0xe0, 0x55, 0x58, 0x75, 0xaa, 0x59, 0xa7, 0xe6, 0x9d, 0x36, 0x6a, - 0x4b, 0x81, 0xe1, 0xbd, 0x7c, 0x22, 0xf3, 0xb9, 0xef, 0xe9, 0x7c, 0x09, 0x64, 0x73, 0xdf, 0xbb, - 0x43, 0xaa, 0xe8, 0x54, 0xfc, 0x44, 0xa3, 0x37, 0xd5, 0xac, 0xd3, 0x94, 0xb8, 0x07, 0x9d, 0xd3, - 0x0e, 0xbd, 0x8e, 0x1e, 0x45, 0x9a, 0x5a, 0x9c, 0xe6, 0x22, 0x38, 0xc1, 0xe9, 0x34, 0x23, 0xf5, - 0x71, 0x72, 0xdd, 0x59, 0xa5, 0x0e, 0xf1, 0x63, 0x7a, 0x4f, 0x2c, 0x4f, 0xba, 0xbe, 0x5e, 0x74, - 0x84, 0x28, 0x19, 0xb6, 0x92, 0x48, 0xcf, 0x62, 0x06, 0x94, 0x0d, 0x4b, 0xa7, 0xbb, 0x06, 0x1e, - 0xa7, 0x6c, 0x58, 0x8c, 0x95, 0x60, 0xa1, 0x08, 0xed, 0xee, 0xf1, 0x85, 0x22, 0x2a, 0x21, 0x1e, - 0x98, 0x3b, 0x5b, 0x8c, 0xf0, 0x5c, 0xe7, 0x20, 0x3b, 0xbf, 0x4f, 0x3b, 0xe7, 0xe3, 0x6c, 0x6f, - 0x7a, 0xca, 0x97, 0xcd, 0xab, 0x2d, 0xb4, 0x11, 0xa3, 0x45, 0x3e, 0xcd, 0x8f, 0x16, 0xa4, 0xf5, - 0x1a, 0xf6, 0x16, 0x93, 0x4d, 0x53, 0xca, 0x56, 0x4a, 0xca, 0x86, 0x4f, 0xa2, 0x67, 0x8d, 0x9a, - 0xdf, 0x36, 0x6c, 0x3d, 0x2a, 0xd4, 0x6b, 0x8e, 0xc7, 0x4f, 0xe7, 0x6e, 0x67, 0x6f, 0x23, 0x26, - 0x66, 0x1c, 0xcf, 0x27, 0x04, 0xdc, 0xa3, 0x19, 0xba, 0x34, 0xc7, 0x3e, 0xb5, 0xe1, 0x92, 0x74, - 0x96, 0x6f, 0x57, 0x48, 0xeb, 0x44, 0xbb, 0x4c, 0xbe, 0xe3, 0xc3, 0xbe, 0x49, 0x5f, 0x95, 0x3d, - 0x90, 0x51, 0xc8, 0xa2, 0x5f, 0x36, 0xe7, 0xda, 0x0b, 0xb1, 0x75, 0xee, 0xeb, 0x7d, 0x90, 0x32, - 0x16, 0x5f, 0x85, 0x47, 0x2c, 0x86, 0x98, 0xd6, 0xe7, 0x56, 0x68, 0x0a, 0x0f, 0xd4, 0x3e, 0x29, - 0x55, 0x7b, 0x0a, 0x91, 0xf1, 0xfb, 0x66, 0xa3, 0xe5, 0xb8, 0x86, 0x4b, 0xe7, 0x40, 0xf0, 0x0a, - 0xac, 0xc2, 0x26, 0x05, 0x36, 0xd1, 0x70, 0xd8, 0x07, 0x5b, 0xe9, 0xd9, 0xc6, 0xdc, 0xc5, 0xee, - 0x3a, 0xa1, 0x93, 0x97, 0xf6, 0x32, 0xe8, 0x09, 0xd3, 0xb9, 0xec, 0xa2, 0x6d, 0x1d, 0x8c, 0x64, - 0x2c, 0x22, 0xe1, 0xa2, 0x56, 0xea, 0x6e, 0x51, 0x2b, 0xfb, 0x08, 0x77, 0xf2, 0x95, 0xd1, 0xe9, - 0xa5, 0x78, 0xa7, 0x47, 0x72, 0x75, 0xca, 0x12, 0x00, 0xb0, 0x94, 0x1e, 0x8e, 0x7c, 0xc8, 0xdb, - 0x56, 0xd3, 0x6a, 0xb4, 0x1b, 0x51, 0xda, 0x63, 0x6a, 0xd9, 0x74, 0xa3, 0xb8, 0x91, 0x7c, 0x4e, - 0x83, 0x8f, 0x8c, 0xb2, 0x2e, 0x0c, 0x86, 0xfd, 0x68, 0xc8, 0x77, 0x8d, 0xf9, 0x79, 0xab, 0xa6, - 0xcf, 0x19, 0x9e, 0xe5, 0x81, 0xdf, 0x39, 0x08, 0x85, 0xd3, 0x41, 0x19, 0x3e, 0x8f, 0xca, 0x0d, - 0x46, 0x48, 0xbc, 0xc7, 0x64, 0x30, 0x52, 0xe0, 0x56, 0x8c, 0x36, 0x52, 0xba, 0x92, 0x1e, 0x67, - 0xdf, 0x10, 0x3f, 0x1f, 0xf4, 0x3c, 0x6c, 0x76, 0xdd, 0x68, 0xce, 0xba, 0xce, 0x42, 0xe0, 0x95, - 0x48, 0xa3, 0x0d, 0x1d, 0x0e, 0x7a, 0xa4, 0x56, 0x5b, 0xaf, 0xe7, 0x7f, 0x26, 0xda, 0xb6, 0x9d, - 0x65, 0xb7, 0x99, 0x1e, 0xb0, 0xcb, 0x4c, 0x7c, 0xe5, 0x7d, 0x16, 0x6d, 0x5a, 0x8c, 0xf9, 0xe7, - 0xec, 0x89, 0x78, 0xd1, 0x76, 0x6e, 0xb2, 0x21, 0xf0, 0x74, 0x17, 0x3c, 0xd0, 0xf0, 0x8d, 0x72, - 0x9b, 0x2e, 0x4e, 0x84, 0x6f, 0xd3, 0xc5, 0x09, 0x88, 0xc7, 0xbf, 0xe5, 0xdc, 0xf6, 0x2a, 0xfb, - 0xf0, 0x65, 0xe1, 0xf8, 0x77, 0x01, 0xf1, 0xfa, 0xd6, 0x25, 0x5e, 0xef, 0x32, 0x0b, 0xd7, 0x13, - 0x81, 0xe2, 0xcd, 0xe5, 0xaa, 0x59, 0x73, 0xdc, 0xba, 0x60, 0xd4, 0xc0, 0xfc, 0xe1, 0x1e, 0x00, - 0x3c, 0xe1, 0x11, 0xd4, 0x17, 0x1d, 0xee, 0x0a, 0xfe, 0x25, 0x73, 0xa0, 0xf1, 0x4e, 0x4a, 0xa0, - 0x86, 0x29, 0xb4, 0xc9, 0xa5, 0x25, 0xa0, 0xed, 0xc3, 0x99, 0x43, 0xef, 0xe6, 0x43, 0x20, 0x01, - 0x0d, 0xc9, 0x24, 0x0c, 0xf2, 0x5b, 0x96, 0xe7, 0x27, 0xfb, 0xb9, 0x69, 0xae, 0x78, 0x19, 0x5c, - 0x93, 0x73, 0xf0, 0x3d, 0x4c, 0x6f, 0x0f, 0xbc, 0x62, 0xb4, 0x61, 0xc9, 0x5c, 0xe1, 0x69, 0x68, - 0xfa, 0x3f, 0xf9, 0x60, 0x22, 0xe4, 0x9e, 0x36, 0x5c, 0xd7, 0x8a, 0x5c, 0xd2, 0x49, 0xd4, 0xe7, - 0x9a, 0x6f, 0x29, 0x53, 0x6a, 0xd7, 0x4c, 0x1f, 0x1a, 0x05, 0xcb, 0x58, 0x9b, 0xb3, 0x5b, 0x0d, - 0x1a, 0x12, 0x23, 0x61, 0x89, 0x90, 0x7c, 0xa8, 0xbe, 0x0d, 0xae, 0xe9, 0xb5, 0xc0, 0xd8, 0x2f, - 0xe6, 0xec, 0x00, 0x4c, 0x4e, 0x9b, 0x92, 0x0f, 0xc2, 0x50, 0xe5, 0x5d, 0x4c, 0xd9, 0xd6, 0x72, - 0x3c, 0x97, 0x73, 0x4e, 0x14, 0xe2, 0x70, 0x5a, 0x1f, 0x1d, 0xed, 0xb8, 0x04, 0x7b, 0x53, 0xc9, - 0x87, 0xd7, 0xea, 0x44, 0x21, 0x8e, 0xe4, 0xe9, 0x20, 0x26, 0xc1, 0x2f, 0x69, 0xd1, 0x96, 0xe3, - 0x34, 0xbd, 0x00, 0x79, 0xdf, 0x35, 0x9a, 0x9e, 0x51, 0x13, 0xcf, 0xb2, 0x3d, 0x87, 0x06, 0x1d, - 0xd7, 0x5a, 0xb0, 0x9a, 0x7a, 0x6d, 0xd1, 0xb0, 0x9a, 0x3c, 0x23, 0xc5, 0xca, 0x66, 0x82, 0xa2, - 0x68, 0xdd, 0x6d, 0xb6, 0x1b, 0x73, 0xe1, 0xb6, 0x02, 0x5b, 0x77, 0xef, 0xd0, 0xa2, 0x60, 0xf5, - 0x77, 0xcd, 0x9a, 0x69, 0xb5, 0x7c, 0xc8, 0xda, 0xb2, 0xb3, 0x8a, 0x83, 0x50, 0xc8, 0x52, 0xd5, - 0x1f, 0xd3, 0xc0, 0x43, 0x91, 0xf3, 0x03, 0x52, 0x7f, 0x00, 0xe1, 0xb9, 0xe4, 0x4b, 0xbe, 0x00, - 0xbf, 0x20, 0xd5, 0x41, 0x07, 0x2d, 0x58, 0x07, 0x24, 0x74, 0xc8, 0x12, 0xb0, 0x30, 0x65, 0xdb, - 0x1d, 0xcd, 0x7a, 0xbe, 0x7b, 0xf5, 0x35, 0x0d, 0xa2, 0xc4, 0x94, 0xde, 0x7e, 0x1a, 0x12, 0xf7, - 0x6e, 0xf5, 0xfb, 0x9e, 0x86, 0x9e, 0x7e, 0xe4, 0xd2, 0xec, 0x03, 0xf5, 0x75, 0xa7, 0xd9, 0x6d, - 0x2d, 0x7c, 0x07, 0x21, 0xea, 0x0b, 0x07, 0x0e, 0xad, 0xa3, 0xdc, 0x7f, 0x64, 0x6c, 0x8b, 0x34, - 0x66, 0x9c, 0xa6, 0xef, 0x1a, 0x35, 0xbf, 0x3a, 0x40, 0x49, 0xdc, 0x68, 0xce, 0x3b, 0xc1, 0x7a, - 0xe4, 0xad, 0x34, 0xe6, 0x1c, 0x9b, 0x9f, 0x86, 0x65, 0x4f, 0xe2, 0x7d, 0x31, 0x36, 0xba, 0xf8, - 0x23, 0x2e, 0xa3, 0xfe, 0xba, 0x59, 0xb3, 0x1a, 0x86, 0xed, 0xc1, 0xb1, 0xb9, 0xf0, 0x19, 0x1f, - 0x45, 0xdb, 0x68, 0xa6, 0xd9, 0xf7, 0xcd, 0xba, 0xce, 0xdb, 0x6f, 0xa4, 0x95, 0x46, 0xc2, 0x17, - 0x20, 0x4a, 0x78, 0x1b, 0x4e, 0x22, 0xa6, 0x97, 0x7d, 0x76, 0xc3, 0x82, 0xb1, 0x25, 0x6f, 0x0d, - 0xc6, 0xbe, 0x8c, 0xfa, 0x81, 0x0b, 0x6e, 0xe2, 0x43, 0x52, 0x5d, 0x49, 0x88, 0x54, 0xc3, 0x96, - 0xe4, 0x22, 0x0c, 0x2c, 0xa6, 0x51, 0x48, 0xc0, 0x98, 0xde, 0xf4, 0x0a, 0x9d, 0xb1, 0x42, 0x4c, - 0x4a, 0x27, 0x75, 0x94, 0xa6, 0xda, 0x4c, 0x9f, 0xe9, 0x45, 0xb3, 0xfd, 0x4a, 0x02, 0xe1, 0xf6, - 0xdf, 0x80, 0xc1, 0xdf, 0x29, 0x6f, 0x5e, 0x30, 0x3a, 0xdc, 0x9c, 0x40, 0x8f, 0x5f, 0x48, 0x0d, - 0x49, 0x90, 0x07, 0xe0, 0x51, 0x82, 0x73, 0x17, 0x1b, 0x0b, 0x57, 0x1d, 0xf7, 0xbe, 0xe8, 0x74, - 0x1c, 0x46, 0x23, 0x35, 0xa0, 0x97, 0xc8, 0x51, 0x6d, 0xad, 0xc5, 0xfb, 0x21, 0x57, 0x21, 0x1b, - 0xa1, 0x26, 0x0b, 0x32, 0xed, 0x44, 0xfd, 0x96, 0xc7, 0xfc, 0x4f, 0x4a, 0xaf, 0xbf, 0xba, 0xd9, - 0xf2, 0x68, 0x4b, 0xb2, 0x0b, 0x52, 0xf7, 0xb7, 0xf8, 0xa5, 0xe9, 0x59, 0xc7, 0x09, 0xd3, 0xc4, - 0x6f, 0x41, 0x62, 0x3e, 0xf1, 0x12, 0xa8, 0xa6, 0x0e, 0x8b, 0x60, 0x3c, 0xd7, 0x9c, 0x3a, 0xdf, - 0xfb, 0xdf, 0x50, 0x85, 0xa7, 0x3c, 0xee, 0xec, 0x0e, 0x38, 0x3f, 0x75, 0x85, 0x6d, 0x7e, 0xcd, - 0x3b, 0x9c, 0x97, 0x1f, 0x96, 0x20, 0x62, 0x13, 0xde, 0x00, 0x23, 0xd9, 0xa7, 0xe8, 0xf1, 0xd9, - 0xf0, 0xbe, 0x76, 0x29, 0xfb, 0xbe, 0x36, 0xb3, 0x21, 0x34, 0xc0, 0x33, 0x68, 0x30, 0x96, 0x77, - 0xeb, 0xa3, 0x04, 0xca, 0xe9, 0x1b, 0x41, 0xfc, 0x82, 0xab, 0x2d, 0x24, 0xe3, 0xce, 0xa1, 0xb2, - 0x15, 0x04, 0xbd, 0x89, 0xbb, 0xec, 0x06, 0x4d, 0x7f, 0xd2, 0x19, 0xdc, 0x5f, 0xdd, 0x61, 0x79, - 0x33, 0x42, 0x85, 0x59, 0xa7, 0x36, 0x45, 0x5f, 0x63, 0x1b, 0xed, 0x61, 0x15, 0x75, 0xf9, 0x65, - 0x78, 0x3a, 0xb9, 0xd3, 0xbe, 0xc7, 0x71, 0x92, 0x33, 0x57, 0x82, 0x06, 0xd5, 0x32, 0xa3, 0x97, - 0xe8, 0x8e, 0xbe, 0x23, 0xd7, 0x60, 0x9e, 0xd0, 0xa0, 0x7a, 0xd6, 0x99, 0x99, 0x63, 0x57, 0x64, - 0xa6, 0x60, 0xa3, 0x5a, 0xd8, 0xd6, 0x11, 0x14, 0x0c, 0x09, 0xa0, 0xc4, 0x45, 0xdb, 0x03, 0x6a, - 0x42, 0xb2, 0xd3, 0xec, 0x1b, 0xe0, 0xe0, 0x30, 0xb9, 0x09, 0x51, 0x1b, 0x6f, 0x2d, 0x5c, 0x88, - 0x2a, 0xce, 0xca, 0x25, 0x98, 0x84, 0x4a, 0x62, 0x4a, 0x76, 0xf8, 0xc9, 0xc3, 0xa9, 0x56, 0xcb, - 0x75, 0x96, 0x61, 0xa2, 0x79, 0x89, 0x09, 0x4c, 0xfe, 0x3f, 0xe8, 0x2e, 0xad, 0x56, 0x98, 0x24, - 0xdd, 0x6a, 0x40, 0x8d, 0x28, 0xa9, 0x92, 0x1e, 0x52, 0xc3, 0xb7, 0x2f, 0xa8, 0x58, 0x35, 0xe3, - 0x37, 0xdf, 0x87, 0x8d, 0x58, 0x4f, 0x64, 0x32, 0xf2, 0x37, 0x68, 0x92, 0x67, 0xd6, 0x74, 0xe9, - 0x1b, 0x7a, 0x14, 0x54, 0x58, 0x24, 0xc3, 0xdb, 0xb8, 0x5a, 0xfc, 0x36, 0xee, 0x2c, 0x88, 0x99, - 0xd2, 0x3e, 0x52, 0x51, 0x2b, 0x28, 0x08, 0xcf, 0x01, 0x04, 0x0f, 0x29, 0x87, 0xe9, 0x0f, 0x46, - 0x97, 0x00, 0xa7, 0x6c, 0xbb, 0x93, 0x68, 0x18, 0xa1, 0x5e, 0x80, 0x1c, 0x1b, 0x2d, 0x55, 0xf0, - 0x18, 0xf5, 0x5e, 0x12, 0x7a, 0x27, 0x6e, 0xb4, 0xf3, 0x94, 0xd6, 0x4f, 0x78, 0x6d, 0x7d, 0x90, - 0x91, 0xa6, 0x0d, 0x73, 0xa4, 0xce, 0x68, 0x7b, 0x3e, 0xab, 0x1b, 0x61, 0x89, 0x47, 0xce, 0x46, - 0x07, 0x9c, 0x69, 0xc5, 0x19, 0xa3, 0x65, 0xd4, 0x2c, 0x7f, 0x25, 0x87, 0xa2, 0xef, 0x46, 0xe1, - 0x72, 0xa2, 0x29, 0x70, 0x59, 0x46, 0xfd, 0x35, 0x28, 0x03, 0x35, 0x87, 0xcf, 0x29, 0x9a, 0xde, - 0x1f, 0xd9, 0x9e, 0x6b, 0x00, 0xa8, 0x5a, 0x91, 0x96, 0x57, 0x22, 0x03, 0xcb, 0x2a, 0x45, 0x47, - 0x63, 0x19, 0xe3, 0xb5, 0xf0, 0x9d, 0x72, 0x0f, 0x34, 0x26, 0x02, 0x68, 0x6a, 0x6b, 0x23, 0x4e, - 0x9c, 0x5c, 0x45, 0x43, 0xb1, 0x7a, 0x2a, 0x1b, 0x8b, 0xd2, 0x97, 0xe2, 0xd2, 0x93, 0x65, 0x2e, - 0xa7, 0x6b, 0x34, 0x7d, 0x33, 0xf8, 0x82, 0xdf, 0x36, 0x3d, 0xcf, 0x58, 0x30, 0xef, 0xaf, 0xb4, - 0xc2, 0x31, 0x7e, 0x10, 0x6d, 0x5d, 0xa0, 0xef, 0xdd, 0xe4, 0x6e, 0x0f, 0x14, 0xf3, 0x2d, 0x9c, - 0x43, 0x68, 0xa4, 0xc1, 0x9a, 0xeb, 0xfe, 0x4a, 0xcb, 0xd4, 0xdb, 0x2e, 0xf7, 0xc2, 0x86, 0x1b, - 0x11, 0xd9, 0x07, 0xae, 0x4d, 0xce, 0xa3, 0xcd, 0xd0, 0xa5, 0xe2, 0xd3, 0x97, 0x76, 0xb3, 0x89, - 0xbc, 0xc9, 0x15, 0x2f, 0xe7, 0x3a, 0xdc, 0x71, 0xee, 0x5f, 0x80, 0x0a, 0xa0, 0xf0, 0xdd, 0xf2, - 0x20, 0x88, 0x55, 0xaa, 0x86, 0xb5, 0xc9, 0x89, 0x44, 0x7c, 0x3d, 0x65, 0xdb, 0xce, 0xe3, 0x20, - 0x90, 0xe5, 0x1a, 0xc1, 0x68, 0x83, 0xeb, 0xd8, 0x26, 0x2c, 0x8f, 0xf4, 0x7f, 0x32, 0xd9, 0x11, - 0xf1, 0x85, 0x8d, 0x80, 0xa1, 0xdd, 0x49, 0x77, 0x68, 0x40, 0x74, 0x6e, 0x78, 0x92, 0x56, 0x48, - 0xbc, 0x26, 0xfb, 0x25, 0x53, 0x9d, 0x9b, 0x4b, 0x45, 0xbb, 0x19, 0x13, 0xe6, 0x19, 0xbd, 0x88, - 0xf0, 0x90, 0xe1, 0xcc, 0xf0, 0x2e, 0x5a, 0xc2, 0x64, 0x8a, 0xbf, 0x07, 0xf2, 0xaf, 0xa1, 0xe1, - 0x38, 0x42, 0x8d, 0xf2, 0x30, 0x41, 0x8c, 0x06, 0xbf, 0x34, 0xc6, 0xda, 0x43, 0x21, 0x99, 0x01, - 0xc1, 0xaf, 0x00, 0x9a, 0x8d, 0x24, 0x3b, 0x9d, 0x7d, 0x90, 0xa9, 0x06, 0x9a, 0x91, 0x13, 0x09, - 0x43, 0xe2, 0x8d, 0x96, 0x6f, 0x36, 0xd4, 0xae, 0xb3, 0x84, 0x42, 0x95, 0x35, 0x23, 0x87, 0xf8, - 0x81, 0x1b, 0xc9, 0x17, 0x1f, 0xbc, 0x01, 0xd0, 0xe2, 0x27, 0xc2, 0x83, 0x32, 0x8a, 0xaa, 0xd1, - 0x86, 0x80, 0xe5, 0x71, 0xf7, 0x85, 0xb9, 0x94, 0xfd, 0x96, 0x07, 0xfe, 0xca, 0x45, 0xb4, 0x91, - 0xf9, 0x25, 0xa5, 0xa2, 0x7e, 0x09, 0x6b, 0x47, 0x2e, 0x87, 0x79, 0xfd, 0xce, 0x3a, 0xf9, 0xd5, - 0xbb, 0xc0, 0xef, 0x29, 0xc8, 0xa9, 0x44, 0x69, 0x27, 0xda, 0xa9, 0xfa, 0x13, 0x2c, 0xe5, 0x16, - 0x1a, 0x92, 0xdf, 0xd2, 0xd0, 0xb3, 0x82, 0xe6, 0x1f, 0x59, 0xfe, 0x22, 0x8f, 0x14, 0x7b, 0x06, - 0xf9, 0x82, 0xcf, 0x09, 0x51, 0x14, 0x4b, 0x85, 0xef, 0x8c, 0x85, 0xb4, 0x3c, 0x98, 0x9d, 0x71, - 0x2c, 0x3e, 0x66, 0xa3, 0xe0, 0x89, 0x5f, 0x7b, 0x17, 0x47, 0x98, 0xc0, 0x66, 0xcf, 0xd3, 0x00, - 0x3f, 0x0a, 0x2f, 0xad, 0xa6, 0x76, 0x08, 0xea, 0x7f, 0x80, 0x06, 0xc5, 0xad, 0x5e, 0x30, 0xc2, - 0xd1, 0x2c, 0x0d, 0x09, 0xb4, 0x38, 0x5e, 0x82, 0x48, 0xe6, 0xa7, 0x09, 0x28, 0x33, 0xf1, 0xa5, - 0x9f, 0xd7, 0xd0, 0x46, 0x2a, 0x2d, 0xfe, 0xa4, 0x86, 0x36, 0xb1, 0x20, 0x02, 0x1f, 0x4c, 0xdf, - 0xae, 0x89, 0x21, 0x4c, 0x95, 0x0f, 0x65, 0x57, 0x64, 0x7c, 0x91, 0x89, 0x8f, 0x7f, 0xeb, 0x07, - 0x9f, 0x2a, 0x1d, 0xc3, 0x47, 0x2a, 0x2d, 0xd7, 0xa9, 0xb7, 0x6b, 0xbe, 0x57, 0xb3, 0xd2, 0x50, - 0xd3, 0x00, 0x42, 0x0f, 0xff, 0x9e, 0x86, 0x06, 0xc2, 0x9d, 0x35, 0xfc, 0x62, 0x7a, 0x5f, 0x12, - 0x24, 0xaa, 0xf2, 0x78, 0xde, 0xea, 0xc0, 0xe0, 0x05, 0xca, 0xe0, 0x19, 0x7c, 0x2a, 0x0f, 0x83, - 0xd1, 0x7f, 0xab, 0x74, 0x06, 0xaf, 0xe1, 0xdf, 0xd1, 0xd0, 0x60, 0x48, 0x74, 0xca, 0xb6, 0x55, - 0xec, 0x4a, 0x50, 0xaa, 0x54, 0xec, 0xca, 0xf0, 0xa6, 0xc8, 0x29, 0xca, 0x6e, 0x05, 0xbf, 0x58, - 0x88, 0x5d, 0xfc, 0x79, 0x0d, 0x6d, 0x11, 0x86, 0x22, 0xae, 0x28, 0xb5, 0xd4, 0x79, 0xdc, 0xb3, - 0xfc, 0x52, 0xfe, 0x06, 0xc0, 0xe9, 0x45, 0xca, 0xe9, 0x59, 0x7c, 0x26, 0xa7, 0xe5, 0x39, 0x81, - 0x50, 0xb5, 0xbf, 0xaf, 0xa1, 0xe1, 0xf8, 0x07, 0x58, 0xc5, 0xb6, 0x14, 0x56, 0x4a, 0xc5, 0xb6, - 0x1c, 0x20, 0x8a, 0x9c, 0xa1, 0x6c, 0x1f, 0xc7, 0x95, 0x82, 0x6c, 0xe3, 0x6f, 0x6a, 0x68, 0xbb, - 0x0c, 0x61, 0x09, 0x9f, 0x4a, 0xe7, 0x41, 0x81, 0xe7, 0x54, 0x3e, 0x5d, 0xb4, 0x19, 0x08, 0x70, - 0x93, 0x0a, 0x70, 0x05, 0xcf, 0x14, 0x1a, 0x21, 0x7a, 0xcc, 0x02, 0xe0, 0xc6, 0xac, 0xe1, 0x3f, - 0xd1, 0xd0, 0xb6, 0x0e, 0xa0, 0x26, 0x3c, 0xa1, 0x1c, 0x0c, 0x52, 0x30, 0xa8, 0xf2, 0x89, 0x42, - 0x6d, 0xba, 0x19, 0x43, 0x0b, 0xa6, 0xaf, 0xbb, 0x94, 0x8e, 0xce, 0x61, 0xa0, 0xf0, 0x57, 0x35, - 0x34, 0x1c, 0xbf, 0x03, 0x97, 0xc1, 0xbc, 0xf4, 0x76, 0x5e, 0x06, 0xf3, 0xf2, 0xbb, 0x7a, 0xe4, - 0x55, 0xca, 0xfc, 0x65, 0x3c, 0x9d, 0x87, 0xf9, 0xe4, 0xad, 0xbe, 0xca, 0xaa, 0xe0, 0x28, 0xac, - 0xe1, 0x2f, 0x69, 0x68, 0x5b, 0xbc, 0x9b, 0x60, 0x3a, 0x4c, 0x28, 0x47, 0x77, 0x61, 0x51, 0x52, - 0xd1, 0x9e, 0xc8, 0x79, 0x2a, 0xca, 0x69, 0x7c, 0xb2, 0x1b, 0x51, 0xf0, 0x97, 0x35, 0x34, 0x28, - 0xa2, 0x05, 0x61, 0xf5, 0x62, 0x22, 0x81, 0x40, 0x2a, 0x1f, 0x2f, 0xd0, 0x02, 0x78, 0xbe, 0x46, - 0x79, 0x9e, 0xc2, 0x17, 0xf3, 0xf0, 0x1c, 0x83, 0x3d, 0xaa, 0xac, 0x0a, 0x93, 0x61, 0x2d, 0x58, - 0x3b, 0xb7, 0x8a, 0x3d, 0x04, 0x9a, 0x57, 0xaf, 0x2b, 0x05, 0x25, 0x48, 0x81, 0x63, 0x22, 0x67, - 0xa9, 0x04, 0x27, 0xf0, 0xf1, 0xc2, 0x12, 0xe0, 0x1f, 0x6b, 0xe8, 0x19, 0x29, 0xcc, 0x0e, 0x3e, - 0x9b, 0x73, 0x28, 0x77, 0x02, 0x0c, 0x95, 0x5f, 0xe9, 0xa6, 0x29, 0xc8, 0xa2, 0x53, 0x59, 0x5e, - 0xc7, 0x8f, 0x8a, 0x8e, 0x20, 0x21, 0xed, 0x15, 0xb7, 0x4b, 0x62, 0x86, 0xbc, 0xa3, 0xa1, 0x51, - 0x29, 0x0b, 0x81, 0xb9, 0xce, 0xe6, 0x1c, 0xf4, 0xc5, 0x84, 0xce, 0xc2, 0x47, 0x22, 0x33, 0x54, - 0xe8, 0x0b, 0xf8, 0xdc, 0x3a, 0x84, 0xc6, 0x7f, 0xab, 0x21, 0xdc, 0x09, 0x34, 0x84, 0x15, 0xf3, - 0x38, 0x15, 0xdb, 0xa8, 0x7c, 0xb2, 0x58, 0x23, 0x10, 0x63, 0x96, 0x8a, 0xf1, 0x2a, 0xbe, 0x9e, - 0xeb, 0x93, 0xc8, 0x71, 0x82, 0x4c, 0x4f, 0x9f, 0x77, 0x5c, 0x06, 0x6a, 0x50, 0x59, 0x15, 0x1d, - 0xd2, 0x35, 0xfc, 0x4f, 0x41, 0xf4, 0x21, 0xc5, 0xef, 0xc1, 0x67, 0x94, 0x2c, 0xa6, 0xe3, 0xd2, - 0x94, 0x5f, 0x2e, 0xde, 0x10, 0xe4, 0xbb, 0x4f, 0xe5, 0xbb, 0x83, 0x6f, 0xe5, 0x95, 0x4f, 0x30, - 0x4f, 0xba, 0x8c, 0x3f, 0xd2, 0xd0, 0x68, 0x1a, 0xfe, 0x8d, 0x6a, 0x40, 0x66, 0xe0, 0xef, 0xa8, - 0x06, 0x64, 0x16, 0xdc, 0x0e, 0x79, 0x44, 0x25, 0xbd, 0x8b, 0x5f, 0xcb, 0x2d, 0xe9, 0x44, 0x3e, - 0x61, 0x7f, 0xac, 0xa1, 0x91, 0x24, 0x32, 0x07, 0x3e, 0xae, 0xe2, 0x54, 0x8a, 0x5b, 0x53, 0x9e, - 0x28, 0xd2, 0x04, 0x84, 0xf2, 0xa9, 0x50, 0x4d, 0x6c, 0x17, 0x10, 0xca, 0x0b, 0xe8, 0xe8, 0x0c, - 0x57, 0xa4, 0xb2, 0xaa, 0x02, 0xdf, 0x58, 0x8b, 0xad, 0x3a, 0x7a, 0xe8, 0x19, 0xfd, 0x72, 0x09, - 0x8d, 0xa6, 0xa1, 0x5b, 0xa8, 0xcc, 0x9b, 0x81, 0x5a, 0xa3, 0x32, 0x6f, 0x16, 0xae, 0x0c, 0x59, - 0xa5, 0x9a, 0x68, 0x63, 0x2f, 0x8f, 0x26, 0x20, 0xb9, 0xc4, 0x8e, 0xad, 0xeb, 0x22, 0x74, 0x47, - 0x77, 0x0a, 0xf9, 0x78, 0x09, 0xed, 0x56, 0x21, 0xc2, 0xe0, 0x0b, 0x6a, 0x5f, 0x3c, 0x03, 0xb5, - 0xa6, 0x3c, 0xd9, 0x6d, 0x73, 0x50, 0x4e, 0x8d, 0x2a, 0xe7, 0x83, 0xf8, 0x8d, 0x3c, 0xca, 0x31, - 0x6c, 0x5b, 0x97, 0x0c, 0x15, 0x2f, 0x43, 0x35, 0xf8, 0x33, 0x25, 0x74, 0x20, 0x0f, 0x08, 0x0b, - 0xbe, 0xa2, 0x94, 0x26, 0x2f, 0x72, 0x4c, 0xf9, 0xea, 0x7a, 0xc9, 0x80, 0x72, 0x3e, 0x4c, 0x95, - 0x53, 0xc7, 0x73, 0x79, 0x95, 0x93, 0x3e, 0x7a, 0x32, 0x75, 0xf4, 0x05, 0x0d, 0x6d, 0x4d, 0xc0, - 0xab, 0x64, 0x78, 0x84, 0x12, 0xa0, 0x96, 0x0c, 0x8f, 0x50, 0x86, 0xdd, 0x52, 0x2c, 0xd4, 0x0f, - 0xa2, 0x89, 0xd8, 0xd5, 0x07, 0xfc, 0x47, 0x1a, 0x1a, 0x8e, 0xc3, 0xae, 0x64, 0xc4, 0x12, 0x52, - 0x28, 0x98, 0x8c, 0x58, 0x42, 0x8e, 0x0e, 0x43, 0xce, 0x51, 0xd6, 0x4f, 0xe1, 0x13, 0x79, 0x58, - 0x4f, 0xe0, 0xc8, 0xe0, 0x9f, 0x68, 0x68, 0x8f, 0x12, 0xb2, 0x05, 0x4f, 0x2a, 0x79, 0xca, 0xc4, - 0x8e, 0x29, 0x5f, 0xec, 0xba, 0x3d, 0xc8, 0x77, 0x87, 0xca, 0x77, 0x1d, 0x5f, 0xcd, 0x6b, 0x9a, - 0xc4, 0x0f, 0x05, 0xb0, 0x7d, 0x31, 0x3d, 0x84, 0x8b, 0xf9, 0xba, 0x86, 0x9e, 0x91, 0x62, 0xbd, - 0x60, 0x45, 0x58, 0xad, 0x42, 0x90, 0x29, 0x9f, 0x29, 0xdc, 0x0e, 0x44, 0xbb, 0x4c, 0x45, 0x9b, - 0xc4, 0xe7, 0xf3, 0x88, 0x16, 0x1b, 0x71, 0x62, 0x0c, 0xf5, 0x9b, 0x1a, 0x1a, 0x08, 0xd1, 0x53, - 0xf0, 0x11, 0xc5, 0x47, 0x22, 0x01, 0xe2, 0x52, 0x3e, 0x9a, 0xab, 0x2e, 0x30, 0x7b, 0x9a, 0x32, - 0xfb, 0x12, 0x1e, 0xcf, 0xf5, 0x05, 0xa1, 0xcd, 0x75, 0xc3, 0xb6, 0xf1, 0x67, 0x35, 0xd4, 0xcf, - 0xd1, 0x40, 0xf0, 0xb1, 0x8c, 0x11, 0x1e, 0x83, 0x34, 0x29, 0xbf, 0x98, 0xb3, 0x76, 0x37, 0x29, - 0x81, 0x10, 0xc6, 0x44, 0x48, 0x69, 0x7c, 0x46, 0x43, 0x5b, 0x38, 0xd5, 0x40, 0x97, 0xc7, 0x94, - 0x4b, 0x68, 0x01, 0x6e, 0x25, 0x50, 0x2a, 0xc5, 0xd2, 0x75, 0x21, 0xb7, 0xf8, 0xbb, 0x1a, 0x1a, - 0x49, 0x42, 0x69, 0xe0, 0x93, 0xf9, 0x32, 0x9b, 0x71, 0xbc, 0x90, 0xf2, 0xa9, 0x82, 0xad, 0x80, - 0xf1, 0x37, 0x29, 0xe3, 0xef, 0xc3, 0x0f, 0x8b, 0x65, 0x91, 0x00, 0x23, 0xa4, 0xb2, 0x9a, 0x84, - 0x5e, 0x59, 0xab, 0xac, 0x0a, 0x60, 0x1a, 0x6b, 0xf8, 0x2b, 0x1a, 0x7a, 0x3a, 0xd9, 0x79, 0x60, - 0x8d, 0x93, 0xf9, 0xf2, 0xa1, 0xf9, 0x85, 0x54, 0xc0, 0x9b, 0x74, 0x99, 0xfb, 0xe5, 0x42, 0xe2, - 0xff, 0xd5, 0x50, 0x39, 0x1d, 0xdb, 0x20, 0x63, 0x51, 0xcd, 0x44, 0xe7, 0xc8, 0x58, 0x54, 0xb3, - 0x71, 0x36, 0xc8, 0x87, 0xa8, 0x78, 0xef, 0xc7, 0xef, 0x2b, 0x26, 0x5e, 0xe7, 0x6f, 0x97, 0x40, - 0xa8, 0x7d, 0xa3, 0x9e, 0xb4, 0xe2, 0x8f, 0x34, 0xb4, 0x27, 0x9d, 0x91, 0xc0, 0x9e, 0x93, 0xf9, - 0x2c, 0xd3, 0x8d, 0x12, 0x72, 0x81, 0x8d, 0x90, 0xeb, 0x54, 0x09, 0xd3, 0xf8, 0xd2, 0x7a, 0x95, - 0x80, 0x7f, 0xb1, 0x84, 0xf6, 0x65, 0x21, 0x72, 0xe0, 0xa9, 0xa2, 0x46, 0xeb, 0x80, 0x0b, 0x29, - 0x4f, 0xaf, 0x87, 0x04, 0x48, 0x6d, 0x50, 0xa9, 0xdf, 0xc0, 0xaf, 0xe7, 0xfd, 0x9e, 0x4a, 0x25, - 0x8f, 0x80, 0x35, 0x2a, 0xab, 0x56, 0xdd, 0x5b, 0xab, 0xac, 0x86, 0x20, 0x25, 0x6b, 0xf8, 0x3f, - 0x34, 0xb4, 0x23, 0x05, 0x44, 0x00, 0x2b, 0xac, 0x96, 0x0b, 0x50, 0xa3, 0x7c, 0xa9, 0x7b, 0x02, - 0xa0, 0x81, 0x7b, 0x54, 0x03, 0xb7, 0xf1, 0xcd, 0xfc, 0xb9, 0x17, 0xc9, 0x0f, 0xf0, 0x24, 0x92, - 0x4c, 0x9f, 0x2e, 0xa1, 0x03, 0x79, 0x80, 0x2a, 0x54, 0xee, 0x7d, 0x01, 0x90, 0x0d, 0x95, 0x7b, - 0x5f, 0x04, 0x2f, 0xa3, 0x58, 0xec, 0x93, 0x53, 0x19, 0xb1, 0x30, 0x30, 0x58, 0x0c, 0xbe, 0xa3, - 0xa1, 0x72, 0x0a, 0x57, 0xc1, 0x4a, 0x70, 0x2e, 0x3b, 0x91, 0x96, 0x0a, 0xac, 0x51, 0x3e, 0xdf, - 0x5d, 0x63, 0x10, 0xff, 0x0a, 0x15, 0xff, 0x22, 0xbe, 0xb0, 0x2e, 0xf1, 0x03, 0x27, 0x67, 0x50, - 0xbc, 0xcb, 0xa1, 0xda, 0xeb, 0x93, 0xc0, 0x5a, 0xa8, 0xf6, 0xfa, 0x64, 0xc8, 0x16, 0xc5, 0xf2, - 0xbf, 0xb1, 0x5f, 0x79, 0xc2, 0x5f, 0xd2, 0xd0, 0x50, 0x0c, 0xe4, 0x01, 0x2b, 0x3a, 0x97, 0x41, - 0x60, 0x94, 0x2b, 0xb9, 0xeb, 0x77, 0xb3, 0xd0, 0xc6, 0x7e, 0x65, 0x2a, 0x91, 0xd8, 0xc5, 0x5f, - 0xd4, 0xd0, 0x48, 0x12, 0xdf, 0x42, 0x95, 0x4c, 0x4a, 0xc1, 0xca, 0x50, 0x25, 0x93, 0xd2, 0xe0, - 0x33, 0xc8, 0x24, 0x95, 0xe2, 0x65, 0x7c, 0xba, 0xb8, 0x14, 0xd4, 0x11, 0xfe, 0xaa, 0x46, 0x7f, - 0x7c, 0x29, 0x89, 0x8e, 0xa1, 0xf2, 0x6b, 0xd2, 0xf1, 0x36, 0x54, 0x7e, 0x8d, 0x02, 0x82, 0x83, - 0x4c, 0x51, 0x21, 0xce, 0xe1, 0xb3, 0x79, 0x84, 0x78, 0x8b, 0x12, 0xd2, 0x63, 0xe3, 0xc7, 0xa3, - 0x41, 0x7a, 0x02, 0x69, 0x43, 0x15, 0xa4, 0xcb, 0x31, 0x3b, 0x54, 0x41, 0x7a, 0x0a, 0x8c, 0x47, - 0x31, 0x9f, 0x2c, 0xfe, 0xd3, 0x66, 0x81, 0xfe, 0xff, 0x53, 0x43, 0xe5, 0x74, 0xe0, 0x0d, 0xd5, - 0x22, 0x94, 0x09, 0xff, 0xa1, 0x5a, 0x84, 0xb2, 0xb1, 0x3e, 0xc8, 0xeb, 0x54, 0xb0, 0x7b, 0xf8, - 0x6e, 0xde, 0x4f, 0x72, 0x2a, 0x0a, 0x47, 0xc7, 0xca, 0xfb, 0x63, 0x16, 0xe0, 0xa7, 0x83, 0x7b, - 0x64, 0xf8, 0xa2, 0x99, 0x18, 0x22, 0x19, 0xbe, 0x68, 0x36, 0xaa, 0x08, 0xb9, 0x4d, 0xa5, 0xbf, - 0x86, 0xaf, 0xe4, 0x95, 0x9e, 0x66, 0xe0, 0xd2, 0x34, 0x80, 0xbf, 0xa6, 0xa1, 0xd1, 0xb8, 0xce, - 0x23, 0x5c, 0x07, 0x55, 0x88, 0xaf, 0x42, 0x8b, 0x50, 0x85, 0xf8, 0x4a, 0x00, 0x89, 0x62, 0x8b, - 0x46, 0x27, 0xd4, 0x04, 0xfe, 0x77, 0x0d, 0xed, 0x56, 0x41, 0x34, 0xa8, 0x52, 0xa7, 0x39, 0xa0, - 0x25, 0x54, 0xa9, 0xd3, 0x3c, 0xc8, 0x10, 0xe4, 0x35, 0x2a, 0xdf, 0x0d, 0x7c, 0x2d, 0x8f, 0x7c, - 0xe1, 0x35, 0xe8, 0xca, 0x6a, 0xf8, 0xef, 0x5a, 0x25, 0x76, 0x05, 0x1d, 0x7f, 0xac, 0x84, 0x48, - 0x1a, 0x4a, 0x44, 0x04, 0xda, 0x80, 0xa7, 0x33, 0xf9, 0xce, 0xc4, 0x98, 0x50, 0xe5, 0xd3, 0xb3, - 0x20, 0x04, 0xc8, 0x1b, 0x54, 0xee, 0x07, 0xf8, 0x5e, 0x0f, 0xe4, 0x06, 0xd8, 0x89, 0xb9, 0x50, - 0xb8, 0xbf, 0xd0, 0xd0, 0x36, 0x76, 0xb6, 0x5f, 0x3c, 0x04, 0xa6, 0x58, 0xf1, 0x15, 0xa8, 0x02, - 0xaa, 0xc3, 0x22, 0x2a, 0xa0, 0x81, 0xee, 0x47, 0x6e, 0x85, 0x41, 0xa5, 0x7f, 0x59, 0x43, 0xa3, - 0xd1, 0x4d, 0xfe, 0xf8, 0x95, 0x76, 0x7c, 0x34, 0xdf, 0xed, 0x7f, 0x26, 0xc1, 0xb1, 0x22, 0x50, - 0x01, 0xc5, 0x3c, 0xba, 0x7a, 0xd0, 0x5e, 0xb0, 0x4f, 0xb0, 0xb4, 0xb0, 0x89, 0xf7, 0x73, 0x25, - 0x74, 0x38, 0x37, 0x86, 0x08, 0x7e, 0xb5, 0xf8, 0x50, 0x4a, 0x03, 0x22, 0x59, 0xd7, 0xb0, 0xec, - 0x72, 0x3a, 0xa6, 0x0f, 0xc5, 0x7f, 0xd1, 0xd0, 0x81, 0x3c, 0xb0, 0x27, 0xaa, 0xb0, 0xa6, 0x00, - 0x6c, 0xca, 0xba, 0x84, 0x2f, 0xe4, 0x1f, 0x84, 0x96, 0x0e, 0x57, 0x9e, 0x7f, 0xd5, 0xd0, 0xbe, - 0x2c, 0xc0, 0x12, 0x55, 0x10, 0x9f, 0x13, 0xb3, 0x45, 0x15, 0xc4, 0xe7, 0xc5, 0x4b, 0x21, 0x97, - 0xa8, 0xa8, 0xaf, 0xe0, 0x97, 0x0b, 0x24, 0x63, 0xe3, 0xd2, 0xfe, 0x50, 0x43, 0xbb, 0x14, 0xb0, - 0x10, 0x58, 0xed, 0xd1, 0x64, 0x20, 0x4f, 0x94, 0x2f, 0x74, 0xd9, 0xba, 0x9b, 0xf3, 0x51, 0x81, - 0x4b, 0x90, 0x0e, 0x4a, 0x81, 0xdf, 0xd1, 0xd0, 0x8e, 0x14, 0x98, 0x08, 0xfc, 0xb2, 0xca, 0x14, - 0x2a, 0x00, 0x8a, 0xf2, 0xd9, 0x2e, 0x5a, 0x82, 0x70, 0x57, 0xa9, 0x70, 0x97, 0xf0, 0x64, 0xbe, - 0xb4, 0x93, 0xde, 0x02, 0x6a, 0x49, 0x3f, 0xfc, 0xcf, 0xf8, 0x21, 0xc8, 0x08, 0x28, 0x61, 0x22, - 0xdb, 0x0d, 0x4d, 0x42, 0x43, 0x64, 0x6c, 0x3a, 0xc9, 0x41, 0x1e, 0x8a, 0xed, 0x5c, 0x24, 0x7e, - 0x0e, 0xb8, 0xb2, 0xca, 0xb7, 0xfb, 0xbe, 0xa8, 0xa1, 0x6d, 0xf1, 0x0e, 0xb2, 0x8f, 0xae, 0x15, - 0x16, 0x22, 0x15, 0xa9, 0xa2, 0xd8, 0xce, 0x59, 0x42, 0x08, 0xfc, 0x13, 0x0d, 0x6d, 0xeb, 0xb8, - 0xc5, 0x8d, 0xd5, 0x29, 0xf5, 0xb4, 0x3b, 0xfc, 0xaa, 0x6f, 0xb4, 0xea, 0xaa, 0x3d, 0xb1, 0xa9, - 0x04, 0xf3, 0xb8, 0x9e, 0x47, 0x02, 0x76, 0xb5, 0x3c, 0x18, 0x45, 0x9c, 0x4e, 0x65, 0x55, 0x44, - 0x0e, 0x58, 0xe3, 0x27, 0x37, 0x18, 0x4a, 0x00, 0x4d, 0xe9, 0x09, 0x88, 0x00, 0x6b, 0xf8, 0x2f, - 0x35, 0x84, 0x3b, 0x6f, 0xc1, 0xab, 0x7c, 0x6a, 0xd5, 0x25, 0x7d, 0x95, 0x4f, 0xad, 0xbc, 0x6e, - 0x5f, 0x6c, 0x9f, 0xa7, 0x53, 0x6a, 0x0f, 0x7f, 0x5b, 0x43, 0xcf, 0xca, 0xef, 0x4d, 0xab, 0xce, - 0x18, 0x29, 0xaf, 0x6a, 0xab, 0xce, 0x18, 0xa9, 0xaf, 0x68, 0x17, 0x3b, 0x8d, 0x08, 0xe2, 0x84, - 0x97, 0x89, 0x2a, 0xab, 0xfc, 0x82, 0x38, 0x3d, 0x15, 0x3d, 0x14, 0xbb, 0xdb, 0xac, 0xca, 0xec, - 0xc8, 0x6e, 0x48, 0xab, 0x32, 0x3b, 0xd2, 0x4b, 0xd3, 0xe4, 0x15, 0xca, 0xfb, 0x49, 0x3c, 0x91, - 0x87, 0xf7, 0xf8, 0x2f, 0x59, 0xe3, 0x6f, 0x69, 0x68, 0xbb, 0xec, 0xa6, 0xbd, 0x6a, 0x12, 0x29, - 0xee, 0xf5, 0xab, 0x26, 0x91, 0xea, 0x42, 0x3f, 0xb9, 0x45, 0x65, 0xb8, 0x8a, 0x2f, 0xe7, 0x91, - 0xe1, 0x31, 0xa3, 0xc4, 0xee, 0xb9, 0x72, 0x38, 0x02, 0x4f, 0xd8, 0x43, 0xfc, 0x1f, 0x0d, 0xed, - 0x56, 0xdd, 0x62, 0x57, 0x05, 0x6c, 0x39, 0x2e, 0xd5, 0xab, 0x02, 0xb6, 0x3c, 0x97, 0xe7, 0x8b, - 0x9d, 0xb6, 0x84, 0xcf, 0xa9, 0xa9, 0xc7, 0xc5, 0x9e, 0x77, 0xdc, 0x60, 0x42, 0x05, 0x4b, 0x79, - 0xf2, 0x82, 0xff, 0x1a, 0xfe, 0xa6, 0x86, 0x9e, 0x95, 0x5f, 0x18, 0x56, 0x4d, 0x2e, 0xe5, 0x45, - 0x64, 0xd5, 0xe4, 0x52, 0xdf, 0x4d, 0x2e, 0x16, 0x0d, 0x24, 0x6e, 0x31, 0x47, 0x72, 0xe2, 0xb7, - 0x35, 0x34, 0x92, 0x84, 0xd0, 0xc1, 0x39, 0x52, 0x58, 0x09, 0x80, 0x21, 0x55, 0xde, 0x31, 0x0d, - 0x49, 0xa8, 0x58, 0x7e, 0x24, 0xf4, 0x11, 0x96, 0x96, 0x75, 0x06, 0x23, 0x54, 0x59, 0x65, 0x70, - 0x40, 0x6b, 0x95, 0xd5, 0x25, 0x73, 0x65, 0x0d, 0xff, 0x40, 0x43, 0xa3, 0x69, 0x88, 0x40, 0xaa, - 0xd3, 0x69, 0x19, 0x28, 0x44, 0x2a, 0xcf, 0x3d, 0x0b, 0x80, 0x88, 0xdc, 0xa5, 0x22, 0xde, 0xc4, - 0x37, 0xf2, 0x2d, 0x23, 0x9e, 0xaf, 0x77, 0xca, 0xa9, 0x2f, 0x99, 0x2b, 0x5e, 0x28, 0x2c, 0xfe, - 0x43, 0x21, 0x4b, 0x09, 0x28, 0x41, 0x79, 0xb2, 0x94, 0x71, 0x98, 0xa3, 0x3c, 0x59, 0xca, 0x04, - 0x72, 0x51, 0xb1, 0x03, 0xf1, 0xa1, 0x18, 0x73, 0xc0, 0xe2, 0x57, 0x34, 0x84, 0x3b, 0x11, 0x85, - 0x54, 0x47, 0x7a, 0x53, 0xe1, 0x8d, 0x54, 0x47, 0x7a, 0xd3, 0x41, 0x8b, 0x8a, 0x85, 0x16, 0x21, - 0xff, 0x46, 0x40, 0x88, 0x25, 0xbb, 0xe9, 0x81, 0x94, 0x10, 0xd6, 0x42, 0x75, 0x20, 0x25, 0x89, - 0x8a, 0xa1, 0x3a, 0x90, 0xd2, 0x81, 0x93, 0x51, 0xec, 0x40, 0x0a, 0xdf, 0x9e, 0x9a, 0x77, 0x82, - 0xc8, 0x67, 0x47, 0x0a, 0x88, 0x83, 0x2a, 0x20, 0x50, 0x03, 0x48, 0xa8, 0x02, 0x82, 0x0c, 0xc4, - 0x08, 0xf2, 0x90, 0x0a, 0x32, 0x8b, 0xef, 0xe4, 0x3a, 0x06, 0x44, 0x21, 0x7f, 0x5b, 0x8e, 0x1e, - 0x9d, 0xa5, 0x36, 0xf8, 0x4f, 0x31, 0x80, 0x03, 0x07, 0xc7, 0x2a, 0xf0, 0x7f, 0x6b, 0x68, 0x97, - 0x02, 0x22, 0x42, 0x15, 0xe2, 0x65, 0xc3, 0x54, 0xa8, 0x42, 0xbc, 0x1c, 0xb8, 0x14, 0xe4, 0xfd, - 0x54, 0xe8, 0xfb, 0xb8, 0x5a, 0x50, 0x68, 0xf1, 0xcc, 0x71, 0x9a, 0xe0, 0xef, 0x68, 0xe8, 0x19, - 0x29, 0xe4, 0x03, 0x56, 0x3b, 0xda, 0xa9, 0x18, 0x13, 0x2a, 0x5f, 0x55, 0x89, 0x2d, 0x51, 0xcc, - 0xb9, 0x00, 0x1c, 0x07, 0xd3, 0x85, 0xef, 0x2c, 0x3d, 0xb9, 0x56, 0x59, 0xe5, 0xa8, 0x02, 0x6b, - 0xf8, 0x1f, 0x35, 0xb4, 0x33, 0x15, 0x11, 0x02, 0xbf, 0x92, 0x95, 0x89, 0x4f, 0x87, 0xab, 0x28, - 0x9f, 0xeb, 0xaa, 0x6d, 0x37, 0x11, 0x2d, 0x3d, 0x22, 0x2a, 0x13, 0xd4, 0xc3, 0x7f, 0xae, 0xa1, - 0x91, 0x24, 0x82, 0x04, 0x3e, 0x9e, 0xad, 0xfa, 0x04, 0x50, 0x45, 0x79, 0xa2, 0x48, 0x93, 0x6e, - 0x1c, 0x85, 0x18, 0x9a, 0xc4, 0x8a, 0x68, 0xa1, 0xbf, 0x66, 0x43, 0xaf, 0x13, 0x8c, 0x22, 0x63, - 0xe8, 0xa5, 0x42, 0x5c, 0x64, 0x0c, 0xbd, 0x74, 0xd4, 0x8b, 0x62, 0x0b, 0x79, 0x64, 0x95, 0x08, - 0x23, 0x03, 0xff, 0x57, 0x20, 0x8c, 0x0c, 0xe0, 0x41, 0x29, 0x8c, 0x02, 0xc7, 0x42, 0x29, 0x8c, - 0x0a, 0x49, 0x82, 0x58, 0x54, 0x98, 0x1a, 0x36, 0x72, 0x65, 0x84, 0x80, 0x94, 0x3e, 0xb7, 0xa2, - 0x8b, 0x68, 0x18, 0x95, 0xd5, 0x04, 0x88, 0xc6, 0x5a, 0x65, 0x35, 0x89, 0x96, 0xb1, 0x86, 0xff, - 0x40, 0x43, 0x43, 0x31, 0xcc, 0x84, 0xac, 0x21, 0x28, 0xc1, 0x70, 0xc8, 0x1a, 0x82, 0x32, 0x58, - 0x87, 0x62, 0xc1, 0x54, 0x1c, 0x00, 0x82, 0xde, 0xc6, 0xec, 0x80, 0xbd, 0xc0, 0x13, 0x79, 0x3c, - 0x80, 0x38, 0xc0, 0x45, 0xf9, 0x44, 0xa1, 0x36, 0x5d, 0x1d, 0xbd, 0x8c, 0x9c, 0x06, 0xdb, 0x79, - 0xac, 0x07, 0xfe, 0x1c, 0xfe, 0x2b, 0x2d, 0x86, 0x73, 0x1f, 0x89, 0x70, 0x2a, 0xd7, 0xce, 0x5b, - 0x87, 0x14, 0xa7, 0x8b, 0x36, 0x03, 0x41, 0xa6, 0xa9, 0x20, 0xe7, 0xf1, 0x2b, 0x05, 0x77, 0x3d, - 0x44, 0x59, 0xde, 0xd1, 0xd0, 0x76, 0x19, 0x08, 0x86, 0x4a, 0x16, 0x05, 0xf2, 0x86, 0x4a, 0x16, - 0x15, 0xd6, 0x46, 0xb1, 0xcd, 0x00, 0x13, 0x28, 0xe9, 0xb1, 0xad, 0x9c, 0xf8, 0x19, 0xa7, 0x77, - 0x35, 0x54, 0x4e, 0x47, 0xd3, 0x50, 0x1e, 0xe3, 0xc9, 0x82, 0xeb, 0x50, 0x1e, 0xe3, 0xc9, 0x04, - 0xf0, 0x20, 0x37, 0xa8, 0xa8, 0x33, 0x78, 0x2a, 0xd7, 0x5a, 0xa7, 0x42, 0x1f, 0xc3, 0xdf, 0xd5, - 0xd0, 0xce, 0x60, 0x48, 0x48, 0x71, 0x36, 0x94, 0x67, 0xc4, 0x15, 0xf0, 0x1e, 0xca, 0x33, 0xe2, - 0x2a, 0x40, 0x8f, 0x62, 0xa1, 0x91, 0x5c, 0xa4, 0xa4, 0x19, 0xff, 0x5e, 0x43, 0xa3, 0x69, 0x48, - 0x16, 0xca, 0xeb, 0x67, 0x6a, 0xb8, 0x0d, 0xe5, 0xf5, 0xb3, 0x0c, 0xe0, 0x8c, 0x62, 0x2e, 0x44, - 0x6c, 0x9f, 0xfc, 0xb1, 0xe5, 0x2f, 0x86, 0x89, 0x98, 0xe9, 0xd7, 0xde, 0x7e, 0x77, 0x4c, 0xfb, - 0xc6, 0xbb, 0x63, 0xda, 0xf7, 0xde, 0x1d, 0xd3, 0x7e, 0xe5, 0xfb, 0x63, 0x4f, 0x7d, 0xe3, 0xfb, - 0x63, 0x4f, 0xfd, 0xdd, 0xf7, 0xc7, 0x9e, 0x7a, 0xff, 0xa9, 0x05, 0xcb, 0x5f, 0x6c, 0xcf, 0x8d, - 0xd7, 0x9c, 0x46, 0x7a, 0x1f, 0x4f, 0xc4, 0x65, 0x6a, 0xa5, 0x65, 0x7a, 0x73, 0x9b, 0x5a, 0xae, - 0xe3, 0x3b, 0x27, 0xfe, 0x2f, 0x00, 0x00, 0xff, 0xff, 0x94, 0xa1, 0x3b, 0x0c, 0x82, 0x92, 0x00, - 0x00, + 0x39, 0xc7, 0x6d, 0x18, 0x41, 0x7b, 0xaf, 0xdd, 0x68, 0x18, 0x7c, 0xdc, 0xcb, 0xad, 0xea, 0xbb, + 0x86, 0xd5, 0xb4, 0x9a, 0xf3, 0xba, 0x6f, 0x78, 0x8b, 0x50, 0xf1, 0x58, 0x66, 0x45, 0xdd, 0x5b, + 0x6e, 0xd6, 0x54, 0x64, 0x17, 0x0c, 0xb7, 0xfe, 0xd8, 0x70, 0x4d, 0xbd, 0xe9, 0xd4, 0x4d, 0x95, + 0xa9, 0xe8, 0x40, 0x35, 0x6c, 0xbd, 0xdd, 0x9a, 0x77, 0x8d, 0xb0, 0xea, 0xf3, 0xb2, 0xaa, 0x4d, + 0xd3, 0x7f, 0xec, 0xb8, 0x8b, 0x22, 0x49, 0xe9, 0x14, 0x9a, 0x75, 0xad, 0xfa, 0xbc, 0xb2, 0x53, + 0xcf, 0x37, 0x7c, 0x4f, 0xaf, 0x9b, 0x4b, 0xa6, 0xed, 0xb4, 0x42, 0xcb, 0xee, 0x4d, 0x55, 0x2a, + 0x54, 0x38, 0x24, 0x1d, 0x40, 0x76, 0xc0, 0x8f, 0xbe, 0x64, 0xba, 0x5e, 0x34, 0xb5, 0xc7, 0xa4, + 0xa4, 0x9e, 0xd4, 0xec, 0x76, 0xdd, 0xac, 0xeb, 0x9d, 0x93, 0xf3, 0x45, 0x59, 0xfd, 0x9a, 0xd3, + 0x9c, 0xb3, 0xdc, 0x06, 0xb3, 0x7f, 0xcb, 0xa9, 0xe9, 0xe6, 0x92, 0x19, 0xb6, 0x90, 0xf2, 0x62, + 0x5b, 0x6f, 0xb6, 0xad, 0xba, 0xe5, 0x2f, 0xeb, 0x2d, 0xc7, 0xb1, 0x95, 0xcb, 0x8c, 0x53, 0xd3, + 0x97, 0xc6, 0x55, 0x2b, 0x88, 0x6b, 0x34, 0xeb, 0x4e, 0x43, 0xf7, 0x4c, 0xb3, 0xce, 0xaa, 0x91, + 0x6d, 0x08, 0xdf, 0x0d, 0x56, 0xb4, 0x19, 0xba, 0x44, 0x55, 0xcd, 0x37, 0xdb, 0xa6, 0xe7, 0x93, + 0x07, 0xe8, 0xe9, 0x58, 0xa9, 0xd7, 0x72, 0x9a, 0x9e, 0x89, 0x27, 0xd0, 0x06, 0xb6, 0x94, 0x8d, + 0x68, 0xfb, 0xb4, 0x43, 0x9b, 0xc6, 0x77, 0x8d, 0x49, 0x56, 0xdd, 0x31, 0xd6, 0x68, 0x6a, 0xe0, + 0xad, 0xef, 0xee, 0x7d, 0xea, 0xb3, 0xff, 0xf2, 0xb9, 0x23, 0x5a, 0x15, 0x5a, 0x91, 0x17, 0xd1, + 0x08, 0x25, 0x7b, 0xcd, 0xf4, 0x6f, 0xf0, 0xea, 0xd0, 0x25, 0xde, 0x86, 0xd6, 0x5b, 0xcd, 0xba, + 0xf9, 0x84, 0x92, 0x1e, 0xa8, 0xb2, 0x07, 0xa2, 0xa3, 0x9d, 0x92, 0x16, 0xc0, 0xce, 0x14, 0x1a, + 0x08, 0x7b, 0x05, 0x8e, 0x46, 0xa5, 0x1c, 0x85, 0x4d, 0xa7, 0xd6, 0x05, 0x4c, 0x55, 0xa3, 0x66, + 0x64, 0x16, 0x58, 0x9a, 0xb4, 0xed, 0x0e, 0x96, 0xae, 0x22, 0x14, 0xad, 0xef, 0xd0, 0xc1, 0xf3, + 0x63, 0x6c, 0xa9, 0x18, 0x0b, 0x96, 0x8a, 0x31, 0xf6, 0x05, 0x82, 0x05, 0x63, 0x6c, 0xc6, 0x98, + 0xe7, 0x6d, 0xab, 0x42, 0x4b, 0xf2, 0x59, 0x0d, 0xa4, 0x88, 0x77, 0x22, 0x97, 0xa2, 0xaf, 0x0b, + 0x29, 0xf0, 0xb5, 0x18, 0xa7, 0x25, 0xca, 0xe9, 0xc1, 0x4c, 0x4e, 0x19, 0x03, 0x31, 0x56, 0xc7, + 0x51, 0x99, 0xeb, 0x7b, 0x26, 0x1a, 0xd0, 0x6a, 0x1b, 0xcd, 0xa3, 0x5d, 0xd2, 0x36, 0x20, 0xdf, + 0x75, 0xb4, 0x49, 0x98, 0x1b, 0xa0, 0xc6, 0x7d, 0x69, 0x23, 0x87, 0xd7, 0x03, 0x19, 0xc5, 0xa6, + 0xa4, 0x0e, 0xcc, 0x4d, 0xda, 0xb6, 0x84, 0xb9, 0x5e, 0x59, 0xeb, 0xdb, 0x1a, 0xc8, 0x93, 0xec, + 0x26, 0x4d, 0x9e, 0xbe, 0x2e, 0xe5, 0xe9, 0x99, 0xd5, 0xf0, 0xb3, 0x68, 0x70, 0xd6, 0x76, 0x6a, + 0x8b, 0xfa, 0x82, 0x69, 0xcd, 0x2f, 0xf8, 0x23, 0x7d, 0xfb, 0xb4, 0x43, 0x7d, 0xd5, 0x4d, 0xb4, + 0xec, 0x3a, 0x2d, 0x22, 0xe7, 0xd1, 0x3e, 0x2a, 0x54, 0x38, 0x88, 0x24, 0x1a, 0x1c, 0x41, 0x1b, + 0x8d, 0x7a, 0xdd, 0x35, 0x3d, 0x0f, 0x0c, 0xcc, 0x1f, 0xc9, 0x03, 0xf4, 0xac, 0xa2, 0x35, 0x28, + 0x66, 0x3b, 0xda, 0xd0, 0x6a, 0xcf, 0x2e, 0x9a, 0xcb, 0xd0, 0x1a, 0x9e, 0x02, 0xb2, 0xb3, 0x86, + 0x1d, 0x7c, 0xbb, 0xa8, 0x8c, 0x7d, 0x55, 0xfe, 0x48, 0x4e, 0xa1, 0x3d, 0x7c, 0xe4, 0x54, 0xe9, + 0xca, 0x74, 0xe5, 0x89, 0x59, 0x6b, 0xfb, 0x8e, 0x2b, 0x0c, 0x38, 0xfa, 0x2d, 0xe7, 0x03, 0x8e, + 0x3e, 0x90, 0x3a, 0x1a, 0x4d, 0x6b, 0x16, 0xce, 0xa9, 0x7e, 0x13, 0xca, 0x0a, 0x0e, 0xb8, 0xb0, + 0x1d, 0x79, 0x3d, 0x62, 0xee, 0x4a, 0xf0, 0xbd, 0xb8, 0x16, 0xf8, 0x3e, 0x97, 0x0d, 0xdf, 0xe0, + 0xcc, 0xed, 0x45, 0x9b, 0xd8, 0xd7, 0x39, 0x9a, 0x13, 0xeb, 0xaa, 0x88, 0x16, 0xdd, 0x08, 0x4a, + 0xf0, 0x4e, 0xd4, 0x4f, 0x19, 0xd6, 0xad, 0x3a, 0x95, 0x7c, 0xa0, 0xba, 0x91, 0x3e, 0xdf, 0xa8, + 0x93, 0x76, 0x24, 0x42, 0x92, 0x38, 0x88, 0x70, 0x0f, 0x0d, 0x27, 0x1d, 0x39, 0x10, 0x65, 0xbf, + 0x54, 0x94, 0x38, 0x19, 0x90, 0x66, 0x8b, 0x19, 0x2b, 0x25, 0xf3, 0x20, 0xd3, 0xa4, 0x6d, 0xcb, + 0x65, 0xea, 0xd5, 0x24, 0xfa, 0x33, 0x0d, 0x04, 0x94, 0xf4, 0xa4, 0x14, 0xb0, 0x6f, 0x4d, 0x02, + 0xf6, 0x6e, 0x21, 0xbc, 0x18, 0x2d, 0x6a, 0xf7, 0xa8, 0x8f, 0x3c, 0x49, 0x5d, 0x64, 0xae, 0xa7, + 0x7d, 0x9d, 0x8b, 0xda, 0x40, 0x7c, 0xb1, 0xb2, 0xd1, 0x6e, 0x39, 0x01, 0x10, 0xff, 0x16, 0xda, + 0x1c, 0x73, 0xbe, 0x41, 0xd9, 0xcf, 0x4a, 0x65, 0x17, 0x29, 0x80, 0xe4, 0x83, 0x9e, 0x50, 0x46, + 0xcc, 0x68, 0xcd, 0x92, 0xb1, 0xdb, 0x2b, 0xb3, 0x7e, 0x41, 0x03, 0xa9, 0x3a, 0xfa, 0x49, 0x97, + 0xaa, 0xaf, 0x6b, 0xa9, 0x7a, 0x67, 0x4d, 0x0b, 0x1d, 0xe8, 0x9c, 0x6e, 0x0f, 0xa3, 0x30, 0x26, + 0xb7, 0x59, 0x93, 0x93, 0xbe, 0x94, 0x9c, 0xf4, 0xe4, 0xd7, 0x35, 0xf4, 0x5c, 0x46, 0x5f, 0xa0, + 0xab, 0x05, 0xb4, 0x23, 0x25, 0xaa, 0x02, 0x0b, 0x1d, 0xc9, 0x98, 0x07, 0x02, 0x51, 0x50, 0xdf, + 0x33, 0xa6, 0xec, 0x25, 0x69, 0x82, 0xf8, 0xb1, 0xc9, 0x28, 0x11, 0xbf, 0x57, 0xc3, 0xe4, 0x1f, + 0xb9, 0x0e, 0xd2, 0x3b, 0xcc, 0xa3, 0x83, 0xbe, 0x1e, 0xea, 0xa0, 0x77, 0x63, 0x69, 0x1a, 0x56, + 0xb6, 0x19, 0xa7, 0x36, 0x15, 0x84, 0xb7, 0xa6, 0x77, 0xd5, 0x71, 0xef, 0xf9, 0x91, 0x2a, 0x3a, + 0x3e, 0xc7, 0x5a, 0xe7, 0xe7, 0xb8, 0x8d, 0xf6, 0xa6, 0x12, 0x01, 0xd5, 0x54, 0xd1, 0x40, 0xe0, + 0xd0, 0xd3, 0x10, 0x1a, 0x94, 0x51, 0x91, 0x7f, 0xc4, 0x9c, 0x69, 0xa0, 0xf1, 0xc8, 0xf2, 0x17, + 0x84, 0x4f, 0x1a, 0xd7, 0x48, 0x7f, 0x0b, 0x7a, 0x21, 0x5f, 0xd2, 0x50, 0x39, 0xbd, 0x7a, 0x8e, + 0xe1, 0xbf, 0x03, 0x6d, 0x6c, 0xb5, 0x67, 0xf5, 0xe0, 0x23, 0x5f, 0x0a, 0x3f, 0xf2, 0x37, 0xcd, + 0x65, 0x3c, 0x8a, 0x36, 0x2d, 0x98, 0x4f, 0x74, 0xfe, 0xb2, 0x8f, 0xbe, 0x1c, 0x58, 0x30, 0x9f, + 0xcc, 0xb0, 0xf7, 0x97, 0x44, 0x69, 0xd6, 0x51, 0x69, 0xf6, 0x28, 0xa5, 0xe9, 0xe0, 0xfd, 0x1a, + 0x22, 0x5c, 0x65, 0x82, 0x5d, 0xbb, 0xd0, 0xfd, 0x27, 0x34, 0xb4, 0x5f, 0x49, 0x09, 0x0c, 0xf0, + 0x21, 0xb4, 0x85, 0x46, 0x54, 0x61, 0x15, 0xb0, 0xc2, 0x89, 0x34, 0xbe, 0x05, 0x62, 0x29, 0x96, + 0xd8, 0xdc, 0x12, 0xbb, 0x24, 0x7f, 0xab, 0xa1, 0x51, 0x75, 0xbb, 0xf7, 0xd2, 0x24, 0xaf, 0x76, + 0xc8, 0xc7, 0xec, 0x42, 0xb2, 0xe5, 0x93, 0x8b, 0x73, 0x03, 0x96, 0x99, 0x40, 0xaf, 0xe3, 0x6b, + 0xb3, 0xd1, 0x2f, 0xf1, 0x15, 0x24, 0x9d, 0x16, 0x58, 0x69, 0x36, 0xc5, 0x4a, 0xa7, 0xba, 0xb0, + 0xd2, 0xc3, 0x71, 0xb9, 0x60, 0xdf, 0xd4, 0xd0, 0xbe, 0xac, 0x96, 0xef, 0xa5, 0xa5, 0xee, 0xa6, + 0x58, 0xea, 0x40, 0xb6, 0x8c, 0x69, 0x22, 0x7d, 0x92, 0x7f, 0xc9, 0x83, 0xda, 0xe3, 0xf7, 0x7c, + 0xc7, 0x35, 0xa7, 0x9d, 0x46, 0xc3, 0x0a, 0x5d, 0x86, 0x09, 0xb4, 0x3b, 0xe8, 0xd3, 0x0b, 0x94, + 0x1d, 0xfc, 0x75, 0x7d, 0x5d, 0x62, 0xb4, 0x91, 0x96, 0x53, 0xa3, 0xf6, 0xb8, 0x17, 0xd4, 0x98, + 0x8a, 0x2c, 0x88, 0x2b, 0xe8, 0x69, 0x41, 0x76, 0x9d, 0x07, 0x16, 0x4c, 0x70, 0x2c, 0xbc, 0x9a, + 0x84, 0x18, 0x63, 0x01, 0x7c, 0xd3, 0x4e, 0x86, 0xc0, 0xd2, 0xdb, 0xd0, 0xfa, 0x5a, 0xe8, 0x29, + 0x6d, 0xae, 0xb2, 0x07, 0xbc, 0x0b, 0x0d, 0xb8, 0x8e, 0xe3, 0xeb, 0x0b, 0x86, 0xb7, 0x40, 0xa9, + 0x0f, 0x56, 0xfb, 0x83, 0x82, 0xeb, 0x86, 0xb7, 0x10, 0x34, 0x99, 0x73, 0xda, 0xcd, 0x3a, 0x55, + 0x69, 0x7f, 0x95, 0x3d, 0x90, 0xdf, 0xd0, 0x60, 0xa0, 0xde, 0xbe, 0x75, 0xc7, 0xa9, 0x9b, 0x8f, + 0x28, 0xc3, 0x97, 0x2d, 0xcf, 0x77, 0xad, 0xd9, 0x76, 0xa0, 0x9d, 0x9f, 0x9b, 0x0e, 0x3e, 0x02, + 0xa3, 0x3e, 0x9d, 0x31, 0xd0, 0xc5, 0x39, 0xb4, 0xf1, 0x31, 0x7d, 0xeb, 0x29, 0x3d, 0x2c, 0x91, + 0x4e, 0x95, 0xb7, 0x88, 0xb4, 0x52, 0x12, 0xb5, 0xf2, 0x61, 0x74, 0x28, 0x0c, 0x7b, 0x13, 0x26, + 0xe8, 0x98, 0xc1, 0x6b, 0x54, 0x0c, 0x79, 0x8c, 0x0e, 0xe7, 0xe8, 0x0b, 0x64, 0x7d, 0x05, 0x6d, + 0xac, 0xb1, 0x57, 0x20, 0xeb, 0x8b, 0xa9, 0xc3, 0x5e, 0x24, 0x14, 0x4c, 0x51, 0xd0, 0x6b, 0x95, + 0x13, 0x20, 0x9f, 0xd1, 0xd0, 0x2e, 0x45, 0xc5, 0x34, 0x8b, 0x69, 0x69, 0x16, 0x8b, 0x06, 0x65, + 0x29, 0x75, 0x50, 0xf6, 0x25, 0x06, 0x65, 0x62, 0xb6, 0xaf, 0x4b, 0xcc, 0x76, 0xe2, 0xa2, 0x17, + 0xb9, 0x72, 0xd2, 0xc6, 0x41, 0xcf, 0x0d, 0xf2, 0x29, 0x0d, 0x1d, 0x2f, 0xd0, 0x29, 0x58, 0xe6, + 0x0d, 0xb4, 0xb9, 0x2e, 0x56, 0x00, 0xfb, 0xbc, 0x94, 0x39, 0x16, 0x45, 0xb2, 0xa2, 0x9d, 0xe2, + 0xe4, 0x02, 0xae, 0xf6, 0xe7, 0x68, 0x56, 0xdc, 0x6a, 0xc2, 0xf4, 0x29, 0x15, 0x9d, 0x3e, 0x64, + 0x4f, 0x14, 0x1a, 0x4e, 0xb7, 0x5d, 0xd7, 0x6c, 0x32, 0x3f, 0x9f, 0xe7, 0x4e, 0x4f, 0x46, 0x81, + 0x5f, 0xfc, 0x75, 0xb4, 0x8c, 0x51, 0x0f, 0x15, 0x12, 0x06, 0xec, 0x81, 0xec, 0x8d, 0xb2, 0x0d, + 0xf7, 0xc3, 0x3d, 0x11, 0x21, 0x32, 0x27, 0x7e, 0x94, 0x31, 0x48, 0x56, 0x08, 0x1d, 0xc6, 0xa1, + 0xc4, 0x76, 0x8a, 0x32, 0x61, 0x10, 0xa7, 0xc2, 0xe3, 0x69, 0x3f, 0x56, 0x4a, 0x6e, 0xc3, 0x44, + 0xbd, 0x66, 0xfa, 0x0f, 0x9a, 0x96, 0xff, 0xea, 0xdc, 0x34, 0xdb, 0x7d, 0x99, 0x71, 0xad, 0x9a, + 0x39, 0xe3, 0x3a, 0x2d, 0xc7, 0x33, 0xec, 0xfc, 0x41, 0xf1, 0xa7, 0x34, 0x74, 0x24, 0x0f, 0x3d, + 0x90, 0xe8, 0x26, 0xea, 0x6f, 0x41, 0x19, 0x88, 0x22, 0xf7, 0x80, 0x15, 0xa4, 0x42, 0x02, 0x78, + 0x04, 0x6d, 0xac, 0x9b, 0x73, 0x46, 0xdb, 0xf6, 0x21, 0x6a, 0xe3, 0x8f, 0x64, 0x3f, 0x64, 0xb7, + 0x44, 0x73, 0x25, 0x33, 0x23, 0x64, 0x19, 0xdc, 0xcf, 0x94, 0x4a, 0xef, 0x65, 0xd6, 0xe6, 0x00, + 0xf7, 0x7c, 0x5d, 0x73, 0xc9, 0x72, 0xda, 0x9e, 0x9c, 0xc1, 0x8f, 0x70, 0xaf, 0x36, 0xa5, 0xd6, + 0x7b, 0xc9, 0xa1, 0x8e, 0x9e, 0x61, 0xdf, 0x2d, 0xa7, 0x6e, 0xda, 0xde, 0xa4, 0x6d, 0xf7, 0x3a, + 0xa2, 0xfc, 0x4d, 0x0d, 0x6d, 0x4f, 0xf6, 0x00, 0x02, 0x9d, 0x8e, 0x72, 0x84, 0xc1, 0x4c, 0x2e, + 0xcb, 0x67, 0x72, 0x50, 0x03, 0x98, 0x67, 0xd5, 0x7b, 0x17, 0x10, 0x9e, 0x40, 0x3b, 0xa2, 0x99, + 0xd9, 0xba, 0x6d, 0x35, 0x4d, 0x37, 0x3b, 0xa3, 0xfa, 0x81, 0x68, 0x2b, 0x24, 0x6a, 0x04, 0x12, + 0x5d, 0x42, 0x03, 0xe1, 0x06, 0x25, 0xe8, 0x6c, 0x4f, 0xca, 0x14, 0x66, 0x2d, 0x79, 0xac, 0xe4, + 0xc3, 0x33, 0x31, 0x80, 0xa5, 0x49, 0xdb, 0x4e, 0xb2, 0xd4, 0x2b, 0x8b, 0xfc, 0xbe, 0x16, 0xed, + 0x9c, 0x64, 0x49, 0xd0, 0x57, 0x58, 0x82, 0xde, 0x59, 0xc7, 0x81, 0x48, 0x5b, 0xdc, 0x41, 0xba, + 0xcf, 0xf6, 0x6b, 0xb9, 0x4a, 0x8e, 0xa0, 0x61, 0xf3, 0x49, 0xcb, 0x72, 0x69, 0x83, 0xeb, 0xd1, + 0x07, 0x73, 0x5d, 0xb5, 0xa3, 0x3c, 0x58, 0xe3, 0x42, 0xee, 0x6f, 0xf0, 0xb4, 0xae, 0x58, 0x44, + 0xfe, 0x1f, 0x64, 0xda, 0xa5, 0x1d, 0x82, 0x7e, 0xde, 0x87, 0xb6, 0x76, 0xec, 0x1e, 0x83, 0x2d, + 0x9e, 0x53, 0xef, 0xfd, 0x00, 0x25, 0xd0, 0xd7, 0xb0, 0x95, 0x28, 0x27, 0x16, 0x88, 0x2b, 0x6e, + 0x35, 0x25, 0xc4, 0xed, 0xd5, 0x08, 0xf8, 0x9a, 0x06, 0x92, 0x4a, 0xfb, 0x52, 0x4b, 0xda, 0xb7, + 0x66, 0x49, 0x7b, 0x37, 0x42, 0xe6, 0xa3, 0x6f, 0x5c, 0xd8, 0x79, 0x14, 0x29, 0x5d, 0x66, 0x7b, + 0xf4, 0xc2, 0x8c, 0x66, 0xc9, 0xbe, 0x3a, 0x0c, 0x11, 0xfe, 0x98, 0x63, 0x64, 0xfc, 0xae, 0xf0, + 0xf5, 0x53, 0xf5, 0x04, 0xaa, 0x6b, 0xa3, 0xb2, 0x95, 0x5a, 0x4b, 0xf9, 0x3d, 0x4c, 0x27, 0x0e, + 0xda, 0x54, 0x10, 0x26, 0x5e, 0xe4, 0x9b, 0x67, 0xab, 0xa3, 0x57, 0x63, 0xe9, 0xdf, 0xb9, 0x6a, + 0x32, 0x7a, 0xcd, 0xa9, 0x9a, 0xbe, 0xf7, 0x44, 0x35, 0xbd, 0x1b, 0x72, 0x6f, 0xa0, 0x63, 0x8a, + 0x81, 0x40, 0x37, 0xd0, 0x4d, 0xdf, 0x74, 0x43, 0x35, 0x0f, 0xa3, 0x3e, 0xab, 0xce, 0x04, 0x1b, + 0xa8, 0x06, 0xff, 0xe2, 0xdd, 0x68, 0xc0, 0x65, 0x2f, 0x4d, 0x17, 0xc6, 0x5a, 0x54, 0x40, 0xfe, + 0xa4, 0x84, 0x5e, 0xc8, 0xd9, 0x01, 0x68, 0xf4, 0x0e, 0x1a, 0x86, 0xf4, 0x82, 0xe3, 0xea, 0x2d, + 0xe7, 0xb1, 0xe9, 0x7a, 0xca, 0xdd, 0x98, 0x87, 0xbc, 0xf2, 0x4c, 0x50, 0xb7, 0x3a, 0xb4, 0x14, + 0x7b, 0xf6, 0xf0, 0x73, 0x68, 0x4b, 0x8d, 0x79, 0x4a, 0x3c, 0x04, 0x61, 0x4e, 0xd7, 0x66, 0x28, + 0x85, 0xe5, 0xf4, 0x46, 0xe0, 0x94, 0x31, 0xab, 0xf5, 0x75, 0x65, 0xb5, 0x2a, 0x6f, 0x8f, 0xaf, + 0x04, 0xc6, 0xe1, 0x72, 0xd1, 0xa8, 0x2a, 0x6d, 0x89, 0x49, 0x28, 0xc2, 0xab, 0x0a, 0x0d, 0xc9, + 0x35, 0xb4, 0x25, 0x2e, 0x5b, 0xe0, 0xb0, 0x53, 0x85, 0x70, 0x87, 0x9d, 0x3e, 0x64, 0x6f, 0x04, + 0xdc, 0x86, 0x11, 0x4d, 0x1d, 0xa8, 0x99, 0xe8, 0x00, 0xcf, 0x3d, 0x76, 0x7e, 0x67, 0x6a, 0x59, + 0x8c, 0x1a, 0x32, 0x37, 0x13, 0xc9, 0x6f, 0x69, 0xe8, 0x68, 0x2e, 0x7a, 0x60, 0x50, 0x1b, 0x32, + 0xeb, 0x9d, 0x35, 0xc1, 0xae, 0xc7, 0xd2, 0xdd, 0x3d, 0x09, 0x75, 0x36, 0x39, 0xd2, 0x48, 0x92, + 0x65, 0x88, 0x59, 0x53, 0x99, 0x93, 0x6c, 0x37, 0x67, 0xee, 0x9f, 0x1e, 0x40, 0x9b, 0x85, 0xe0, + 0x21, 0x5c, 0x53, 0xe3, 0x85, 0x41, 0x48, 0x7f, 0xbc, 0x40, 0xdf, 0x79, 0xd4, 0xa3, 0xf5, 0x5a, + 0x3d, 0x2d, 0xf4, 0x7c, 0x6c, 0x3f, 0xa4, 0xb3, 0x4a, 0xaf, 0x17, 0xd4, 0xef, 0x6b, 0xe8, 0x60, + 0x66, 0x97, 0x3f, 0x8f, 0xa1, 0xd2, 0xbb, 0x45, 0xf4, 0x08, 0x38, 0xa0, 0xf7, 0xe1, 0x10, 0xdb, + 0x7d, 0xc3, 0x5b, 0xe4, 0x6a, 0xdc, 0x82, 0x4a, 0x16, 0xff, 0x42, 0x97, 0xac, 0x3a, 0xa9, 0xc2, + 0x09, 0x9c, 0x78, 0x5d, 0x90, 0xff, 0x14, 0x5a, 0xe7, 0x1b, 0xde, 0xa2, 0x72, 0x07, 0x36, 0xd6, + 0x90, 0x56, 0x27, 0x17, 0x80, 0xe6, 0x75, 0x38, 0x16, 0x77, 0xc7, 0xa9, 0x9b, 0xf9, 0x77, 0x12, + 0xc9, 0x43, 0x38, 0xcd, 0x92, 0x68, 0x0e, 0x3c, 0xbd, 0x84, 0xd6, 0x37, 0x83, 0x02, 0x60, 0x4a, + 0x9e, 0x93, 0x8f, 0x37, 0x65, 0x0d, 0xc8, 0x28, 0xe4, 0x1f, 0x62, 0x2f, 0xa3, 0x90, 0x8c, 0xbc, + 0x06, 0x99, 0x86, 0xce, 0xf7, 0x9d, 0x5d, 0xf7, 0x15, 0xeb, 0xfa, 0x59, 0x70, 0x3e, 0xef, 0xb6, + 0xcd, 0xb6, 0x59, 0x17, 0x55, 0x16, 0x9e, 0x2c, 0x7b, 0x1d, 0x7c, 0x46, 0x69, 0x15, 0x60, 0xe0, + 0x0c, 0x5a, 0x1f, 0x28, 0x58, 0x9d, 0xda, 0x8c, 0x19, 0x84, 0xd5, 0x0f, 0x33, 0x33, 0xe2, 0x3b, + 0x41, 0xf2, 0x47, 0xa0, 0x99, 0x8e, 0xd7, 0x6b, 0xed, 0xf7, 0x0e, 0x4c, 0xef, 0xf8, 0x09, 0x28, + 0xc8, 0x14, 0xdc, 0xf3, 0x0d, 0x3f, 0x1c, 0x16, 0x1d, 0x4b, 0x9a, 0x26, 0x5b, 0xd2, 0x0c, 0x98, + 0xbb, 0x2a, 0x7a, 0xd1, 0xa1, 0x9b, 0xc7, 0x62, 0xc4, 0x02, 0x4f, 0x78, 0x14, 0x21, 0xd7, 0x6c, + 0xb5, 0xfd, 0x68, 0x96, 0xad, 0xaf, 0x0a, 0x25, 0xe4, 0x68, 0xe4, 0xf4, 0xc6, 0xcf, 0x39, 0x49, + 0xb8, 0x26, 0xdf, 0x11, 0x1c, 0x57, 0x55, 0xed, 0x70, 0x53, 0x77, 0xa7, 0x98, 0x8e, 0xe3, 0x7e, + 0x00, 0x3d, 0xa0, 0xa9, 0x5c, 0x51, 0xd2, 0x08, 0xef, 0x68, 0xc9, 0x5f, 0x74, 0xec, 0x24, 0x95, + 0x3a, 0x76, 0x92, 0xf0, 0x4e, 0xd4, 0x0f, 0x5f, 0x99, 0x3a, 0x9c, 0x8b, 0xe2, 0x1e, 0x3b, 0x79, + 0x4b, 0x43, 0x3b, 0x52, 0xba, 0x0c, 0xfc, 0x17, 0x51, 0x06, 0x4b, 0x6e, 0x29, 0x41, 0xfd, 0xa5, + 0x98, 0xfa, 0x0f, 0xa3, 0x61, 0x73, 0x6e, 0xce, 0xac, 0xf9, 0xd6, 0x92, 0xa9, 0x43, 0x8d, 0x75, + 0xb4, 0xc6, 0x50, 0x58, 0xce, 0xf2, 0x8a, 0x78, 0x3f, 0xda, 0x5c, 0x33, 0x5a, 0x2d, 0xb3, 0xce, + 0xeb, 0xad, 0xa7, 0xf5, 0x06, 0x59, 0xe1, 0x23, 0x99, 0x39, 0xfb, 0x3a, 0xcc, 0xf9, 0xf9, 0x12, + 0xda, 0x26, 0x88, 0x72, 0xb5, 0x6d, 0xdb, 0x4c, 0x8e, 0x83, 0x68, 0xc8, 0xa8, 0xd1, 0xa4, 0x74, + 0x22, 0x2d, 0xba, 0x05, 0x8a, 0x79, 0x4a, 0xf4, 0x30, 0x1a, 0x76, 0x5a, 0xa6, 0x4b, 0xfd, 0xbf, + 0xf8, 0x46, 0xc5, 0x10, 0x2f, 0xe7, 0x55, 0x33, 0x98, 0xc1, 0xe7, 0x50, 0xd9, 0x34, 0xdc, 0xa6, + 0x59, 0xd7, 0x6b, 0x8e, 0xd5, 0xf4, 0xc2, 0x01, 0xc0, 0xd2, 0x9e, 0x4c, 0x0d, 0x3b, 0x58, 0x8d, + 0xe9, 0xa0, 0x82, 0x98, 0x52, 0xc3, 0x17, 0xd0, 0x2e, 0xd7, 0x7c, 0x6c, 0xb8, 0xf5, 0xb0, 0xb9, + 0x6d, 0xf8, 0xa6, 0xc7, 0x5b, 0x33, 0xe5, 0x8c, 0xf0, 0x2a, 0xb4, 0xfd, 0x2d, 0x5a, 0x81, 0x35, + 0x3f, 0x0c, 0xe9, 0x2d, 0x8f, 0x9e, 0x13, 0xb7, 0x4d, 0xdf, 0xac, 0x8f, 0x6c, 0xa0, 0xa9, 0xf9, + 0x21, 0x56, 0x3e, 0xcd, 0x8b, 0xc3, 0xb4, 0x9f, 0xb8, 0x8f, 0x17, 0x2a, 0x8e, 0x0f, 0xfd, 0x8f, + 0xf2, 0xdc, 0x9b, 0xbc, 0x52, 0x18, 0xe5, 0x8a, 0x59, 0x66, 0x2f, 0x36, 0xd4, 0x0f, 0x67, 0x0d, + 0xf5, 0x88, 0xdc, 0x56, 0x91, 0x08, 0x2d, 0x22, 0x1f, 0x85, 0x5d, 0x19, 0xfa, 0x34, 0xb5, 0x1c, + 0x04, 0xbf, 0x33, 0xa6, 0x6b, 0x39, 0xf5, 0xa9, 0xe5, 0xcb, 0xfc, 0xa8, 0x33, 0x5f, 0x5c, 0x76, + 0xa3, 0x81, 0xf0, 0xf8, 0x33, 0x58, 0x39, 0x2a, 0xc0, 0xbb, 0xd0, 0x40, 0x10, 0x7f, 0xeb, 0x73, + 0xae, 0xd3, 0x80, 0x89, 0xd2, 0x1f, 0x14, 0x5c, 0x75, 0x9d, 0x06, 0xde, 0x81, 0x36, 0xd2, 0x97, + 0xbe, 0x03, 0x93, 0x64, 0x43, 0xf0, 0x78, 0xdf, 0x21, 0x36, 0xac, 0x13, 0xea, 0xfe, 0x41, 0x0d, + 0x17, 0xd1, 0xfa, 0x6c, 0xc9, 0xc3, 0x66, 0x02, 0xc9, 0x2a, 0x6b, 0x47, 0x16, 0x20, 0x6c, 0x81, + 0x57, 0x61, 0xd5, 0xc9, 0x66, 0x9d, 0x9a, 0x77, 0xca, 0xa8, 0x2d, 0x06, 0x86, 0xf7, 0xf2, 0x89, + 0xcc, 0xe7, 0xbe, 0xa7, 0xf3, 0x25, 0x90, 0xcd, 0x7d, 0xef, 0x0e, 0xa9, 0xa2, 0x53, 0xf1, 0x13, + 0x8d, 0xde, 0x64, 0xb3, 0x4e, 0x53, 0xe2, 0x1e, 0x74, 0x4e, 0x3b, 0xf4, 0x3a, 0x7a, 0x14, 0x69, + 0x6a, 0x71, 0x9a, 0x0b, 0xe0, 0x04, 0xa7, 0xd3, 0x8c, 0xd4, 0xc7, 0xc9, 0x75, 0x67, 0x95, 0x3a, + 0xc4, 0x8f, 0xe9, 0x3d, 0xb1, 0x3c, 0xe9, 0xda, 0x7a, 0xd1, 0x11, 0xa2, 0x64, 0xd8, 0x4a, 0x22, + 0x3d, 0x8b, 0x19, 0x50, 0x36, 0x2c, 0x9d, 0xee, 0x1a, 0x78, 0x9c, 0xb2, 0x61, 0x31, 0x56, 0x82, + 0x85, 0x22, 0xb4, 0xbb, 0xc7, 0x17, 0x8a, 0xa8, 0x84, 0x78, 0x60, 0xee, 0x6c, 0x31, 0xc2, 0x73, + 0x9d, 0x83, 0xec, 0x98, 0x3f, 0xed, 0x9c, 0x8f, 0xb3, 0xbd, 0xe9, 0x29, 0x5f, 0x36, 0xaf, 0x36, + 0xd1, 0x46, 0x8c, 0x16, 0xf9, 0x34, 0x3f, 0x5a, 0x90, 0xd6, 0x6b, 0xd8, 0x5b, 0x4c, 0x36, 0x4d, + 0x29, 0x5b, 0x29, 0x29, 0x1b, 0x3e, 0x89, 0xb6, 0x1b, 0x35, 0xbf, 0x6d, 0xd8, 0x7a, 0x54, 0xa8, + 0xd7, 0x1c, 0x8f, 0x9f, 0xce, 0xdd, 0xc6, 0xde, 0x46, 0x4c, 0x4c, 0x3b, 0x9e, 0x4f, 0x08, 0xb8, + 0x47, 0xd3, 0x74, 0x69, 0x8e, 0x7d, 0x6a, 0xc3, 0x25, 0xe9, 0x2c, 0xdf, 0xae, 0x90, 0xd6, 0x89, + 0x76, 0x99, 0x7c, 0xc7, 0x87, 0x7d, 0x93, 0xbe, 0x2a, 0x7b, 0x20, 0x23, 0x90, 0x45, 0xbf, 0x6c, + 0xce, 0xb6, 0xe7, 0x63, 0xeb, 0xdc, 0x37, 0xfa, 0x20, 0x65, 0x2c, 0xbe, 0x0a, 0x8f, 0x58, 0x6c, + 0x66, 0x5a, 0x9f, 0x5d, 0xa6, 0x29, 0x3c, 0x50, 0xfb, 0x84, 0x54, 0xed, 0x29, 0x44, 0xc6, 0xee, + 0x9b, 0x8d, 0x96, 0xe3, 0x1a, 0x2e, 0x9d, 0x03, 0xc1, 0x2b, 0xb0, 0x0a, 0x9b, 0x14, 0xd8, 0x44, + 0x5b, 0xc2, 0x3e, 0xd8, 0x4a, 0xcf, 0x36, 0xe6, 0x2e, 0x76, 0xd7, 0x09, 0x9d, 0xbc, 0xb4, 0x97, + 0x41, 0x4f, 0x98, 0xce, 0x65, 0x17, 0x6d, 0xed, 0x60, 0x24, 0x63, 0x11, 0x09, 0x17, 0xb5, 0x52, + 0x77, 0x8b, 0x5a, 0xd9, 0x47, 0xb8, 0x93, 0xaf, 0x8c, 0x4e, 0x2f, 0xc5, 0x3b, 0x3d, 0x92, 0xab, + 0x53, 0x96, 0x00, 0x80, 0xa5, 0xf4, 0x70, 0xe4, 0x43, 0xde, 0xb6, 0x9a, 0x56, 0xa3, 0xdd, 0x88, + 0xd2, 0x1e, 0x93, 0x4b, 0xa6, 0x1b, 0xc5, 0x8d, 0xe4, 0x73, 0x1a, 0x7c, 0x64, 0x94, 0x75, 0x61, + 0x30, 0xec, 0x47, 0x9b, 0x7d, 0xd7, 0x98, 0x9b, 0xb3, 0x6a, 0xfa, 0xac, 0xe1, 0x59, 0x1e, 0xf8, + 0x9d, 0x83, 0x50, 0x38, 0x15, 0x94, 0xe1, 0xf3, 0xa8, 0xdc, 0x60, 0x84, 0xc4, 0xeb, 0x4e, 0x06, + 0x23, 0x05, 0x6e, 0xc5, 0x48, 0x23, 0xa5, 0x2b, 0xe9, 0x71, 0xf6, 0x75, 0xf1, 0xf3, 0x41, 0xcf, + 0xc1, 0x66, 0xd7, 0x8d, 0xe6, 0x8c, 0xeb, 0xcc, 0x07, 0x5e, 0x89, 0x34, 0xda, 0xd0, 0xe1, 0xa0, + 0x47, 0x6a, 0xb5, 0xb5, 0x7a, 0xfe, 0x67, 0xa2, 0x6d, 0xdb, 0x19, 0x76, 0xe9, 0xe9, 0x01, 0xbb, + 0xf3, 0xc4, 0x57, 0xde, 0xed, 0x68, 0xc3, 0x42, 0xcc, 0x3f, 0x67, 0x4f, 0xc4, 0x8b, 0xb6, 0x73, + 0x93, 0x0d, 0x81, 0xa7, 0xbb, 0xe0, 0x81, 0x86, 0x6f, 0x94, 0xdb, 0x74, 0x71, 0x22, 0x7c, 0x9b, + 0x2e, 0x4e, 0x40, 0x3c, 0xfe, 0x2d, 0xe7, 0xb6, 0x57, 0xd9, 0x87, 0xaf, 0x08, 0xc7, 0xbf, 0x0b, + 0x88, 0xd7, 0xb7, 0x26, 0xf1, 0x7a, 0x97, 0x59, 0xb8, 0x9e, 0x08, 0x14, 0x6f, 0x2e, 0x55, 0xcd, + 0x9a, 0xe3, 0xd6, 0x05, 0xa3, 0x06, 0xe6, 0x0f, 0xf7, 0x00, 0xe0, 0x09, 0x0f, 0xa3, 0xbe, 0xe8, + 0x70, 0x57, 0xf0, 0x2f, 0x99, 0x05, 0x8d, 0x77, 0x52, 0x02, 0x35, 0x4c, 0xa2, 0x0d, 0x2e, 0x2d, + 0x01, 0x6d, 0x1f, 0xce, 0x1c, 0x7a, 0x37, 0x1f, 0x02, 0x09, 0x68, 0x48, 0x26, 0x60, 0x90, 0xdf, + 0xb2, 0x3c, 0x3f, 0xd9, 0xcf, 0x4d, 0x73, 0xd9, 0xcb, 0xe0, 0x9a, 0x9c, 0x83, 0xef, 0x61, 0x7a, + 0x7b, 0xe0, 0x15, 0xa3, 0x75, 0x8b, 0xe6, 0x32, 0x4f, 0x43, 0xd3, 0xff, 0xc9, 0x07, 0x13, 0x21, + 0xf7, 0x94, 0xe1, 0xba, 0x56, 0xe4, 0x92, 0x4e, 0xa0, 0x3e, 0xd7, 0x7c, 0x53, 0x99, 0x52, 0xbb, + 0x66, 0xfa, 0xd0, 0x28, 0x58, 0xc6, 0xda, 0x9c, 0xdd, 0x6a, 0xd0, 0x90, 0x18, 0x09, 0x4b, 0x84, + 0xe4, 0x43, 0xf5, 0xad, 0x73, 0x4d, 0xaf, 0x05, 0xc6, 0x7e, 0x21, 0x67, 0x07, 0x60, 0x72, 0xda, + 0x94, 0x7c, 0x10, 0x86, 0x2a, 0xef, 0x62, 0xd2, 0xb6, 0x96, 0xe2, 0xb9, 0x9c, 0x73, 0xa2, 0x10, + 0x87, 0xd3, 0xfa, 0xe8, 0x68, 0xc7, 0x25, 0xd8, 0x9b, 0x4a, 0x3e, 0xbc, 0x56, 0x27, 0x0a, 0x71, + 0x24, 0x4f, 0x07, 0x31, 0x09, 0x7e, 0x45, 0x8b, 0xb6, 0x1c, 0xa7, 0xe8, 0x3d, 0xc9, 0xfb, 0xae, + 0xd1, 0xf4, 0x8c, 0x9a, 0x78, 0x96, 0xed, 0x59, 0x34, 0xe8, 0xb8, 0xd6, 0xbc, 0xd5, 0xd4, 0x6b, + 0x0b, 0x86, 0xd5, 0xe4, 0x19, 0x29, 0x56, 0x36, 0x1d, 0x14, 0x45, 0xeb, 0x6e, 0xb3, 0xdd, 0x98, + 0x0d, 0xb7, 0x15, 0xd8, 0xba, 0x7b, 0x87, 0x16, 0x05, 0xab, 0xbf, 0x6b, 0xd6, 0x4c, 0xab, 0xe5, + 0x43, 0xd6, 0x96, 0x9d, 0x55, 0x1c, 0x84, 0x42, 0x96, 0xaa, 0xfe, 0x98, 0x06, 0x1e, 0x8a, 0x9c, + 0x1f, 0x90, 0xfa, 0x03, 0x08, 0xcf, 0x26, 0x5f, 0xf2, 0x05, 0xf8, 0x79, 0xa9, 0x0e, 0x3a, 0x68, + 0xc1, 0x3a, 0x20, 0xa1, 0x43, 0x16, 0x81, 0x85, 0x49, 0xdb, 0xee, 0x68, 0xd6, 0xf3, 0xdd, 0xab, + 0xaf, 0x6b, 0x10, 0x25, 0xa6, 0xf4, 0xf6, 0xb3, 0x90, 0xb8, 0x77, 0xab, 0xdf, 0xf7, 0x35, 0xf4, + 0xf4, 0x23, 0x97, 0x66, 0x1f, 0xa8, 0xaf, 0x3b, 0xc5, 0x6e, 0x6b, 0xe1, 0x3b, 0x08, 0x51, 0x5f, + 0x38, 0x70, 0x68, 0x1d, 0xe5, 0xfe, 0x23, 0x63, 0x5b, 0xa4, 0x31, 0xed, 0x34, 0x7d, 0xd7, 0xa8, + 0xf9, 0xd5, 0x01, 0x4a, 0xe2, 0x46, 0x73, 0xce, 0x09, 0xd6, 0x23, 0x6f, 0xb9, 0x31, 0xeb, 0xd8, + 0xfc, 0x34, 0x2c, 0x7b, 0x12, 0xef, 0x8b, 0xb1, 0xd1, 0xc5, 0x1f, 0x71, 0x19, 0xf5, 0xd7, 0xcd, + 0x9a, 0xd5, 0x30, 0x6c, 0x0f, 0x8e, 0xcd, 0x85, 0xcf, 0xf8, 0x28, 0xda, 0x4a, 0x33, 0xcd, 0xbe, + 0x6f, 0xd6, 0x75, 0xde, 0x7e, 0x3d, 0xad, 0x34, 0x1c, 0xbe, 0x00, 0x51, 0xc2, 0xdb, 0x70, 0x12, + 0x31, 0xbd, 0xec, 0xb3, 0x1b, 0x16, 0x8c, 0x2d, 0x79, 0x6b, 0x30, 0xf6, 0x65, 0xd4, 0x0f, 0x5c, + 0x70, 0x13, 0x1f, 0x92, 0xea, 0x4a, 0x42, 0xa4, 0x1a, 0xb6, 0x24, 0x17, 0x61, 0x60, 0x31, 0x8d, + 0x42, 0x02, 0xc6, 0xf4, 0xa6, 0x96, 0xe9, 0x8c, 0x15, 0x62, 0x52, 0x3a, 0xa9, 0xa3, 0x34, 0xd5, + 0x46, 0xfa, 0x4c, 0x2f, 0x9a, 0xed, 0x57, 0x12, 0x08, 0xb7, 0xff, 0x06, 0x0c, 0xfe, 0x4e, 0x79, + 0xf3, 0x82, 0xd1, 0xe1, 0xe6, 0x04, 0x7a, 0xfc, 0x42, 0x6a, 0x48, 0x82, 0x3c, 0x00, 0x8f, 0x12, + 0x9c, 0xbb, 0xd8, 0x58, 0xb8, 0xea, 0xb8, 0xf7, 0x45, 0xa7, 0xe3, 0x30, 0x1a, 0xae, 0x01, 0xbd, + 0x44, 0x8e, 0x6a, 0xa8, 0x16, 0xef, 0x87, 0x5c, 0x85, 0x6c, 0x84, 0x9a, 0x2c, 0xc8, 0xb4, 0x13, + 0xf5, 0x5b, 0x1e, 0xf3, 0x3f, 0x29, 0xbd, 0xfe, 0xea, 0x46, 0xcb, 0xa3, 0x2d, 0xc9, 0x2e, 0x48, + 0xdd, 0xdf, 0xe2, 0x77, 0xab, 0x67, 0x1c, 0x27, 0x4c, 0x13, 0xbf, 0x09, 0x89, 0xf9, 0xc4, 0x4b, + 0xa0, 0x9a, 0x3a, 0x2c, 0x82, 0xf1, 0x5c, 0x73, 0xea, 0x7c, 0xef, 0x7f, 0x5d, 0x15, 0x9e, 0xf2, + 0xb8, 0xb3, 0x3b, 0xe0, 0xfc, 0xd4, 0x15, 0xb6, 0xf9, 0x35, 0xe7, 0x70, 0x5e, 0x7e, 0x54, 0x82, + 0x88, 0x4d, 0x78, 0x03, 0x8c, 0x64, 0x9f, 0xa2, 0xc7, 0x67, 0xc3, 0xfb, 0xda, 0xa5, 0xec, 0xfb, + 0xda, 0xcc, 0x86, 0xd0, 0x00, 0x4f, 0xa3, 0xc1, 0x58, 0xde, 0xad, 0x8f, 0x12, 0x28, 0xa7, 0x6f, + 0x04, 0xf1, 0x0b, 0xae, 0xb6, 0x90, 0x8c, 0x3b, 0x87, 0xca, 0x56, 0x10, 0xf4, 0x26, 0xae, 0xbc, + 0x1b, 0x34, 0xfd, 0x49, 0x67, 0x70, 0x7f, 0x75, 0x87, 0xe5, 0x4d, 0x0b, 0x15, 0x66, 0x9c, 0xda, + 0x24, 0x7d, 0x8d, 0x6d, 0xb4, 0x87, 0x55, 0xd4, 0xe5, 0x77, 0xe6, 0xe9, 0xe4, 0x4e, 0xfb, 0x1e, + 0xc7, 0x49, 0x4e, 0x5f, 0x09, 0x1a, 0x54, 0xcb, 0x8c, 0x5e, 0xa2, 0x3b, 0xfa, 0x8e, 0x5c, 0x83, + 0x79, 0x42, 0x83, 0xea, 0x19, 0x67, 0x7a, 0x96, 0x5d, 0x91, 0x99, 0x84, 0x8d, 0x6a, 0x61, 0x5b, + 0x47, 0x50, 0x30, 0x24, 0x80, 0x12, 0x17, 0x6d, 0x0f, 0xa8, 0x09, 0xc9, 0x4e, 0xb3, 0xaf, 0x83, + 0x83, 0xc3, 0xe4, 0x26, 0x44, 0x6d, 0xbc, 0xb5, 0x70, 0x21, 0xaa, 0x38, 0x2b, 0x97, 0x60, 0x12, + 0x2a, 0x89, 0x29, 0xd9, 0xe1, 0x27, 0x0f, 0x27, 0x5b, 0x2d, 0xd7, 0x59, 0x82, 0x89, 0xe6, 0x25, + 0x26, 0x30, 0xf9, 0xff, 0xa0, 0xbb, 0xb4, 0x5a, 0x61, 0x92, 0x74, 0xc8, 0x80, 0x1a, 0x51, 0x52, + 0x25, 0x3d, 0xa4, 0x86, 0x6f, 0x5f, 0x50, 0xb1, 0x6a, 0xc6, 0x6f, 0xbe, 0x6f, 0x31, 0x62, 0x3d, + 0x91, 0x89, 0xc8, 0xdf, 0xa0, 0x49, 0x9e, 0x19, 0xd3, 0xa5, 0x6f, 0xe8, 0x51, 0x50, 0x61, 0x91, + 0x0c, 0x6f, 0xe3, 0x6a, 0xf1, 0xdb, 0xb8, 0x33, 0x20, 0x66, 0x4a, 0xfb, 0x48, 0x45, 0xad, 0xa0, + 0x20, 0x3c, 0x07, 0x10, 0x3c, 0xa4, 0x1c, 0xa6, 0x3f, 0x18, 0x5d, 0x02, 0x9c, 0xb4, 0xed, 0x4e, + 0xa2, 0x61, 0x84, 0x7a, 0x01, 0x72, 0x6c, 0xb4, 0x54, 0xc1, 0x63, 0xd4, 0x7b, 0x49, 0xe8, 0x9d, + 0xb8, 0xd1, 0xce, 0x53, 0x5a, 0x3f, 0xe1, 0xb5, 0xf5, 0x41, 0x46, 0x9a, 0x36, 0xcc, 0x91, 0x3a, + 0xa3, 0xed, 0xf9, 0xac, 0x6e, 0x84, 0x25, 0x1e, 0x39, 0x1b, 0x1d, 0x70, 0xa6, 0x15, 0xa7, 0x8d, + 0x96, 0x51, 0xb3, 0xfc, 0xe5, 0x1c, 0x8a, 0xbe, 0x1b, 0x85, 0xcb, 0x89, 0xa6, 0xc0, 0x65, 0x19, + 0xf5, 0xd7, 0xa0, 0x0c, 0xd4, 0x1c, 0x3e, 0xa7, 0x68, 0x7a, 0x7f, 0x64, 0x7b, 0xae, 0x01, 0xa0, + 0x6a, 0x45, 0x5a, 0x5e, 0x8e, 0x0c, 0x2c, 0xab, 0x14, 0x1d, 0x8d, 0x65, 0x8c, 0xd7, 0xc2, 0x77, + 0xca, 0x3d, 0xd0, 0x98, 0x08, 0xa0, 0xa9, 0xa1, 0x46, 0x9c, 0x38, 0xb9, 0x8a, 0x36, 0xc7, 0xea, + 0xa9, 0x6c, 0x2c, 0x4a, 0x5f, 0x8a, 0x4b, 0x4f, 0x96, 0xb8, 0x9c, 0xae, 0xd1, 0xf4, 0xcd, 0xe0, + 0x0b, 0x7e, 0xdb, 0xf4, 0x3c, 0x63, 0xde, 0xbc, 0xbf, 0xdc, 0x0a, 0xc7, 0xf8, 0x41, 0x34, 0x34, + 0x4f, 0xdf, 0xbb, 0xc9, 0xdd, 0x1e, 0x28, 0xe6, 0x5b, 0x38, 0x87, 0xd0, 0x70, 0x83, 0x35, 0xd7, + 0xfd, 0xe5, 0x96, 0xa9, 0xb7, 0x5d, 0xee, 0x85, 0x6d, 0x69, 0x44, 0x64, 0x1f, 0xb8, 0x36, 0x39, + 0x8f, 0x36, 0x42, 0x97, 0x8a, 0x4f, 0x5f, 0xda, 0xcd, 0x26, 0xf2, 0x06, 0x57, 0xbc, 0x9c, 0xeb, + 0x70, 0xc7, 0xb9, 0x7f, 0x1e, 0x2a, 0x80, 0xc2, 0x77, 0xcb, 0x83, 0x20, 0x56, 0xa9, 0x1a, 0xd6, + 0x26, 0x27, 0x12, 0xf1, 0xf5, 0xa4, 0x6d, 0x3b, 0x8f, 0x83, 0x40, 0x96, 0x6b, 0x04, 0xa3, 0x75, + 0xae, 0x63, 0x9b, 0xb0, 0x3c, 0xd2, 0xff, 0xc9, 0x44, 0x47, 0xc4, 0x17, 0x36, 0x02, 0x86, 0x76, + 0x27, 0xdd, 0xa1, 0x01, 0xd1, 0xb9, 0xe1, 0x49, 0x5a, 0x21, 0xf1, 0x9a, 0xec, 0x97, 0x4c, 0x76, + 0x6e, 0x2e, 0x15, 0xed, 0x66, 0x54, 0x98, 0x67, 0xf4, 0x22, 0xc2, 0x43, 0x06, 0x47, 0xc3, 0xbb, + 0x68, 0x09, 0x93, 0x29, 0xfe, 0x1e, 0xc8, 0xbf, 0x8a, 0xb6, 0xc4, 0x81, 0x6c, 0x94, 0x87, 0x09, + 0x62, 0x34, 0xf8, 0xa5, 0x31, 0xd6, 0x1e, 0x0a, 0xc9, 0x34, 0x08, 0x7e, 0x05, 0x40, 0x6f, 0x24, + 0xd9, 0xe9, 0xec, 0x83, 0x4c, 0x35, 0xd0, 0x8c, 0x9c, 0x48, 0x18, 0x12, 0xaf, 0xb7, 0x7c, 0xb3, + 0xa1, 0x76, 0x9d, 0x25, 0x14, 0xaa, 0xac, 0x19, 0x39, 0xc4, 0x0f, 0xdc, 0x48, 0xbe, 0xf8, 0xe0, + 0x0d, 0x80, 0x16, 0x3f, 0x11, 0x1e, 0x94, 0x51, 0x54, 0x8d, 0x36, 0x04, 0x2c, 0x8f, 0xbb, 0x2f, + 0xcc, 0xa5, 0xec, 0xb7, 0x3c, 0xf0, 0x57, 0x2e, 0xa2, 0xf5, 0xcc, 0x2f, 0x29, 0x15, 0xf5, 0x4b, + 0x58, 0x3b, 0x72, 0x39, 0xcc, 0xeb, 0x77, 0xd6, 0xc9, 0xaf, 0xde, 0x79, 0x7e, 0x4f, 0x41, 0x4e, + 0x25, 0x4a, 0x3b, 0xd1, 0x4e, 0xd5, 0x9f, 0x60, 0x29, 0xb7, 0xd0, 0x90, 0xfc, 0x8e, 0x86, 0xb6, + 0x0b, 0x9a, 0x7f, 0x64, 0xf9, 0x0b, 0x3c, 0x52, 0xec, 0x19, 0xe4, 0x0b, 0x3e, 0x27, 0x44, 0x51, + 0x2c, 0x15, 0xbe, 0x33, 0x16, 0xd2, 0xf2, 0x60, 0x76, 0xda, 0xb1, 0xf8, 0x98, 0x8d, 0x82, 0x27, + 0x7e, 0xed, 0x5d, 0x1c, 0x61, 0x02, 0x9b, 0x3d, 0x4f, 0x03, 0xfc, 0x38, 0xbc, 0xb4, 0x9a, 0xda, + 0x21, 0xa8, 0xff, 0x01, 0x1a, 0x14, 0xb7, 0x7a, 0xc1, 0x08, 0x47, 0xb3, 0x34, 0x24, 0xd0, 0xe2, + 0x78, 0x09, 0x22, 0x99, 0x9f, 0x29, 0xa0, 0xcc, 0xcb, 0xb0, 0x5f, 0xc4, 0x10, 0x58, 0xee, 0x99, + 0x66, 0x3d, 0xff, 0x18, 0xbd, 0x0b, 0x27, 0xb7, 0x62, 0x6d, 0xc3, 0xc3, 0x58, 0xeb, 0xbd, 0xa0, + 0x40, 0xe9, 0xa0, 0x44, 0x0d, 0xab, 0xac, 0xf6, 0xf8, 0x4f, 0x7f, 0x51, 0x43, 0xeb, 0x29, 0x51, + 0xfc, 0x49, 0x0d, 0x6d, 0x60, 0x31, 0x0d, 0x3e, 0x98, 0xbe, 0x7b, 0x14, 0x03, 0xbc, 0x2a, 0x1f, + 0xca, 0xae, 0xc8, 0xf8, 0x23, 0xe3, 0x1f, 0xff, 0xf6, 0x0f, 0x3f, 0x55, 0x3a, 0x86, 0x8f, 0x54, + 0x5a, 0xae, 0x53, 0x6f, 0xd7, 0x7c, 0xaf, 0x66, 0xa5, 0x61, 0xbd, 0x01, 0xf0, 0x1f, 0xfe, 0x03, + 0x0d, 0x0d, 0x84, 0x1b, 0x7d, 0xf8, 0x85, 0xf4, 0xbe, 0x24, 0xc0, 0x58, 0xe5, 0xb1, 0xbc, 0xd5, + 0x81, 0xc1, 0x0b, 0x94, 0xc1, 0x33, 0xf8, 0x54, 0x1e, 0x06, 0xa3, 0xff, 0x56, 0xa8, 0xb1, 0x56, + 0xf1, 0xef, 0x69, 0x68, 0x30, 0x24, 0x3a, 0x69, 0xdb, 0x2a, 0x76, 0x25, 0xa0, 0x59, 0x2a, 0x76, + 0x65, 0xf0, 0x57, 0xe4, 0x14, 0x65, 0xb7, 0x82, 0x5f, 0x28, 0xc4, 0x2e, 0xfe, 0xbc, 0x86, 0x36, + 0x09, 0x33, 0x03, 0x57, 0x94, 0x5a, 0xea, 0x3c, 0x7d, 0x5a, 0x7e, 0x31, 0x7f, 0x03, 0xe0, 0xf4, + 0x22, 0xe5, 0xf4, 0x2c, 0x3e, 0x93, 0xd3, 0xf2, 0x9c, 0x40, 0xa8, 0xda, 0x3f, 0xd4, 0xd0, 0x96, + 0xb8, 0x3f, 0xa0, 0x62, 0x5b, 0x8a, 0x72, 0xa5, 0x62, 0x5b, 0x8e, 0x57, 0x45, 0xce, 0x50, 0xb6, + 0x8f, 0xe3, 0x4a, 0x41, 0xb6, 0xf1, 0xb7, 0x34, 0xb4, 0x4d, 0x06, 0xf8, 0x84, 0x4f, 0xa5, 0xf3, + 0xa0, 0x80, 0x97, 0x2a, 0x9f, 0x2e, 0xda, 0x0c, 0x04, 0xb8, 0x49, 0x05, 0xb8, 0x82, 0xa7, 0x0b, + 0x8d, 0x10, 0x3d, 0x66, 0x01, 0xf0, 0xaa, 0x56, 0xf1, 0x9f, 0x6a, 0x68, 0x6b, 0x07, 0x6e, 0x14, + 0x1e, 0x57, 0x0e, 0x06, 0x29, 0x36, 0x55, 0xf9, 0x44, 0xa1, 0x36, 0xdd, 0x8c, 0xa1, 0x79, 0xd3, + 0xd7, 0x01, 0xb1, 0x8f, 0xa3, 0x52, 0xe1, 0xaf, 0x69, 0x68, 0x4b, 0xfc, 0x4a, 0x5e, 0x06, 0xf3, + 0xd2, 0xcb, 0x82, 0x19, 0xcc, 0xcb, 0xaf, 0x0e, 0x92, 0x57, 0x28, 0xf3, 0x97, 0xf1, 0x54, 0x1e, + 0xe6, 0x93, 0x97, 0x0c, 0x2b, 0x2b, 0xc2, 0x37, 0x61, 0x15, 0x7f, 0x59, 0x43, 0x5b, 0xe3, 0xdd, + 0x04, 0xd3, 0x61, 0x5c, 0x39, 0xba, 0x0b, 0x8b, 0x92, 0x0a, 0x3e, 0x45, 0xce, 0x53, 0x51, 0x4e, + 0xe3, 0x93, 0xdd, 0x88, 0x82, 0xbf, 0xa2, 0xa1, 0x41, 0x11, 0xbc, 0x08, 0xab, 0x17, 0x13, 0x09, + 0x22, 0x53, 0xf9, 0x78, 0x81, 0x16, 0xc0, 0xf3, 0x35, 0xca, 0xf3, 0x24, 0xbe, 0x98, 0x87, 0xe7, + 0x18, 0x0a, 0x53, 0x65, 0x45, 0x98, 0x0c, 0xab, 0xc1, 0xda, 0x39, 0x24, 0xf6, 0x10, 0x68, 0x5e, + 0xbd, 0xae, 0x14, 0x94, 0x20, 0x05, 0x1d, 0x8a, 0x9c, 0xa5, 0x12, 0x9c, 0xc0, 0xc7, 0x0b, 0x4b, + 0x80, 0xdf, 0xd5, 0xd0, 0x33, 0x52, 0xd4, 0x1f, 0x7c, 0x36, 0xe7, 0x50, 0xee, 0xc4, 0x3b, 0x2a, + 0xbf, 0xdc, 0x4d, 0x53, 0x90, 0x45, 0xa7, 0xb2, 0xbc, 0x86, 0x1f, 0x15, 0x1d, 0x41, 0x42, 0x16, + 0x2e, 0x6e, 0x97, 0xc4, 0x0c, 0x79, 0x5b, 0x43, 0x23, 0x52, 0x16, 0x02, 0x73, 0x9d, 0xcd, 0x39, + 0xe8, 0x8b, 0x09, 0x9d, 0x05, 0xd7, 0x44, 0xa6, 0xa9, 0xd0, 0x17, 0xf0, 0xb9, 0x35, 0x08, 0x8d, + 0xff, 0x4e, 0x43, 0xb8, 0x13, 0xf7, 0x08, 0x2b, 0xe6, 0x71, 0x2a, 0xd4, 0x52, 0xf9, 0x64, 0xb1, + 0x46, 0x20, 0xc6, 0x0c, 0x15, 0xe3, 0x15, 0x7c, 0x3d, 0xd7, 0x27, 0x91, 0xc3, 0x16, 0x99, 0x9e, + 0x3e, 0xe7, 0xb8, 0x0c, 0x63, 0xa1, 0xb2, 0x22, 0xfa, 0xc7, 0xab, 0xf8, 0x9f, 0x83, 0x60, 0x48, + 0x0a, 0x27, 0x84, 0xcf, 0x28, 0x59, 0x4c, 0x87, 0xc9, 0x29, 0xbf, 0x54, 0xbc, 0x21, 0xc8, 0x77, + 0x9f, 0xca, 0x77, 0x07, 0xdf, 0xca, 0x2b, 0x9f, 0x60, 0x9e, 0x74, 0x19, 0x7f, 0xac, 0xa1, 0x91, + 0x34, 0x38, 0x1e, 0xd5, 0x80, 0xcc, 0x80, 0x03, 0x52, 0x0d, 0xc8, 0x2c, 0xf4, 0x1f, 0xf2, 0x88, + 0x4a, 0x7a, 0x17, 0xbf, 0x9a, 0x5b, 0xd2, 0xf1, 0x7c, 0xc2, 0xbe, 0xab, 0xa1, 0xe1, 0x24, 0x50, + 0x08, 0x3e, 0xae, 0xe2, 0x54, 0x0a, 0xa3, 0x53, 0x1e, 0x2f, 0xd2, 0x04, 0x84, 0xf2, 0xa9, 0x50, + 0x4d, 0x6c, 0x17, 0x10, 0xca, 0x0b, 0xe8, 0xe8, 0x0c, 0xe6, 0xa4, 0xb2, 0xa2, 0xc2, 0x02, 0x59, + 0x8d, 0xad, 0x3a, 0x7a, 0xe8, 0x19, 0xfd, 0x6a, 0x09, 0x8d, 0xa4, 0x81, 0x6d, 0xa8, 0xcc, 0x9b, + 0x01, 0xa2, 0xa3, 0x32, 0x6f, 0x16, 0xcc, 0x0d, 0x59, 0xa1, 0x9a, 0x68, 0x63, 0x2f, 0x8f, 0x26, + 0x20, 0xd7, 0xc5, 0x4e, 0xd1, 0xeb, 0x22, 0x92, 0x48, 0x77, 0x0a, 0xf9, 0x78, 0x09, 0xed, 0x56, + 0x01, 0xd4, 0xe0, 0x0b, 0x6a, 0x5f, 0x3c, 0x03, 0x44, 0xa7, 0x3c, 0xd1, 0x6d, 0x73, 0x50, 0x4e, + 0x8d, 0x2a, 0xe7, 0x83, 0xf8, 0xf5, 0x3c, 0xca, 0x31, 0x6c, 0x5b, 0x97, 0x0c, 0x15, 0x2f, 0x43, + 0x35, 0xf8, 0x33, 0x25, 0x74, 0x20, 0x0f, 0x26, 0x0c, 0xbe, 0xa2, 0x94, 0x26, 0x2f, 0x90, 0x4d, + 0xf9, 0xea, 0x5a, 0xc9, 0x80, 0x72, 0x3e, 0x4c, 0x95, 0x53, 0xc7, 0xb3, 0x79, 0x95, 0x93, 0x3e, + 0x7a, 0x32, 0x75, 0xf4, 0x05, 0x0d, 0x0d, 0x25, 0xd0, 0x5e, 0x32, 0x3c, 0x42, 0x09, 0x6e, 0x4c, + 0x86, 0x47, 0x28, 0x83, 0x92, 0x29, 0x16, 0xea, 0x07, 0xd1, 0x44, 0xec, 0x26, 0x06, 0xfe, 0xa2, + 0x86, 0xb6, 0xc4, 0x51, 0x60, 0x32, 0x62, 0x09, 0x29, 0x32, 0x4d, 0x46, 0x2c, 0x21, 0x07, 0xab, + 0x21, 0xe7, 0x28, 0xeb, 0xa7, 0xf0, 0x89, 0x3c, 0xac, 0x27, 0x60, 0x6d, 0xf0, 0x4f, 0x34, 0xb4, + 0x47, 0x89, 0x20, 0x83, 0x27, 0x94, 0x3c, 0x65, 0x42, 0xd9, 0x94, 0x2f, 0x76, 0xdd, 0x1e, 0xe4, + 0xbb, 0x43, 0xe5, 0xbb, 0x8e, 0xaf, 0xe6, 0x35, 0x4d, 0xe2, 0xe7, 0x0d, 0xd8, 0x36, 0x9d, 0x1e, + 0xa2, 0xd7, 0x7c, 0x43, 0x43, 0xcf, 0x48, 0xa1, 0x67, 0xb0, 0x22, 0xac, 0x56, 0x01, 0xda, 0x94, + 0xcf, 0x14, 0x6e, 0x07, 0xa2, 0x5d, 0xa6, 0xa2, 0x4d, 0xe0, 0xf3, 0x79, 0x44, 0x8b, 0x8d, 0x38, + 0x31, 0x86, 0xfa, 0x6d, 0x0d, 0x0d, 0x84, 0x60, 0x2e, 0xf8, 0x88, 0xe2, 0x23, 0x91, 0xc0, 0x94, + 0x29, 0x1f, 0xcd, 0x55, 0x17, 0x98, 0x3d, 0x4d, 0x99, 0x7d, 0x11, 0x8f, 0xe5, 0xfa, 0x82, 0xd0, + 0xe6, 0xba, 0x61, 0xdb, 0xf8, 0xb3, 0x1a, 0xea, 0xe7, 0xe0, 0x24, 0xf8, 0x58, 0xc6, 0x08, 0x8f, + 0x21, 0xac, 0x94, 0x5f, 0xc8, 0x59, 0xbb, 0x9b, 0x94, 0x40, 0x88, 0xaa, 0x22, 0xa4, 0x34, 0x3e, + 0xa3, 0xa1, 0x4d, 0x9c, 0x6a, 0xa0, 0xcb, 0x63, 0xca, 0x25, 0xb4, 0x00, 0xb7, 0x12, 0x64, 0x97, + 0x62, 0xe9, 0xba, 0x90, 0x5b, 0xfc, 0x3d, 0x0d, 0x0d, 0x27, 0x91, 0x3d, 0xf0, 0xc9, 0x7c, 0x99, + 0xcd, 0x38, 0x7c, 0x49, 0xf9, 0x54, 0xc1, 0x56, 0xc0, 0xf8, 0x1b, 0x94, 0xf1, 0xf7, 0xe1, 0x87, + 0xc5, 0xb2, 0x48, 0x00, 0x59, 0x52, 0x59, 0x49, 0x22, 0xc1, 0xac, 0x56, 0x56, 0x04, 0x6c, 0x8f, + 0x55, 0xfc, 0x55, 0x0d, 0x3d, 0x9d, 0xec, 0x3c, 0xb0, 0xc6, 0xc9, 0x7c, 0xf9, 0xd0, 0xfc, 0x42, + 0x2a, 0xd0, 0x56, 0xba, 0xcc, 0xfd, 0x72, 0x21, 0xf1, 0xff, 0x6a, 0xa8, 0x9c, 0x0e, 0xb5, 0x90, + 0xb1, 0xa8, 0x66, 0x82, 0x85, 0x64, 0x2c, 0xaa, 0xd9, 0xb0, 0x1f, 0xe4, 0x43, 0x54, 0xbc, 0xf7, + 0xe3, 0xf7, 0x15, 0x13, 0xaf, 0xf3, 0x17, 0x57, 0x20, 0xd4, 0xbe, 0x51, 0x4f, 0x5a, 0xf1, 0xc7, + 0x1a, 0xda, 0x93, 0xce, 0x48, 0x60, 0xcf, 0x89, 0x7c, 0x96, 0xe9, 0x46, 0x09, 0xb9, 0xb0, 0x4f, + 0xc8, 0x75, 0xaa, 0x84, 0x29, 0x7c, 0x69, 0xad, 0x4a, 0xc0, 0xbf, 0x5c, 0x42, 0xfb, 0xb2, 0x00, + 0x42, 0xf0, 0x64, 0x51, 0xa3, 0x75, 0xa0, 0x97, 0x94, 0xa7, 0xd6, 0x42, 0x02, 0xa4, 0x36, 0xa8, + 0xd4, 0xaf, 0xe3, 0xd7, 0xf2, 0x7e, 0x4f, 0xa5, 0x92, 0x47, 0x38, 0x1f, 0x95, 0x15, 0xab, 0xee, + 0xad, 0x56, 0x56, 0x42, 0xcc, 0x94, 0x55, 0xfc, 0x9f, 0x1a, 0xda, 0x91, 0x82, 0x69, 0x80, 0x15, + 0x56, 0xcb, 0x85, 0xef, 0x51, 0xbe, 0xd4, 0x3d, 0x01, 0xd0, 0xc0, 0x3d, 0xaa, 0x81, 0xdb, 0xf8, + 0x66, 0xfe, 0xdc, 0x8b, 0xe4, 0x67, 0x83, 0x12, 0x49, 0xa6, 0x4f, 0x97, 0xd0, 0x81, 0x3c, 0xb8, + 0x19, 0x2a, 0xf7, 0xbe, 0x00, 0xe6, 0x87, 0xca, 0xbd, 0x2f, 0x02, 0xdf, 0x51, 0x2c, 0xf6, 0xc9, + 0xa9, 0x8c, 0x58, 0x18, 0x18, 0x2c, 0x06, 0xdf, 0xd5, 0x50, 0x39, 0x85, 0xab, 0x60, 0x25, 0x38, + 0x97, 0x9d, 0x48, 0x4b, 0xc5, 0xf9, 0x28, 0x9f, 0xef, 0xae, 0x31, 0x88, 0x7f, 0x85, 0x8a, 0x7f, + 0x11, 0x5f, 0x58, 0x93, 0xf8, 0x81, 0x93, 0x33, 0x28, 0x5e, 0x2d, 0x51, 0xed, 0xf5, 0x49, 0x50, + 0x36, 0x54, 0x7b, 0x7d, 0x32, 0xa0, 0x8d, 0x62, 0xf9, 0xdf, 0xd8, 0x6f, 0x53, 0xe1, 0x2f, 0x6b, + 0x68, 0x73, 0x0c, 0x73, 0x02, 0x2b, 0x3a, 0x97, 0x21, 0x72, 0x94, 0x2b, 0xb9, 0xeb, 0x77, 0xb3, + 0xd0, 0xc6, 0x7e, 0x1b, 0x2b, 0x91, 0xd8, 0xc5, 0x5f, 0xd2, 0xd0, 0x70, 0x12, 0x6e, 0x43, 0x95, + 0x4c, 0x4a, 0x81, 0xee, 0x50, 0x25, 0x93, 0xd2, 0xd0, 0x3c, 0xc8, 0x04, 0x95, 0xe2, 0x25, 0x7c, + 0xba, 0xb8, 0x14, 0xd4, 0x11, 0xfe, 0x9a, 0x46, 0x7f, 0x0b, 0x2a, 0x09, 0xd6, 0xa1, 0xf2, 0x6b, + 0xd2, 0xe1, 0x3f, 0x54, 0x7e, 0x8d, 0x02, 0x11, 0x84, 0x4c, 0x52, 0x21, 0xce, 0xe1, 0xb3, 0x79, + 0x84, 0x78, 0x93, 0x12, 0xd2, 0x63, 0xe3, 0xc7, 0xa3, 0x41, 0x7a, 0x02, 0xf8, 0x43, 0x15, 0xa4, + 0xcb, 0x21, 0x44, 0x54, 0x41, 0x7a, 0x0a, 0xaa, 0x48, 0x31, 0x9f, 0x2c, 0xfe, 0x83, 0x6c, 0x81, + 0xfe, 0xff, 0x4b, 0x43, 0xe5, 0x74, 0x1c, 0x10, 0xd5, 0x22, 0x94, 0x89, 0x46, 0xa2, 0x5a, 0x84, + 0xb2, 0xa1, 0x47, 0xc8, 0x6b, 0x54, 0xb0, 0x7b, 0xf8, 0x6e, 0xde, 0x4f, 0x72, 0x2a, 0x28, 0x48, + 0xc7, 0xca, 0xfb, 0x2e, 0x0b, 0xf0, 0xd3, 0xb1, 0x46, 0x32, 0x7c, 0xd1, 0x4c, 0x48, 0x93, 0x0c, + 0x5f, 0x34, 0x1b, 0xe4, 0x84, 0xdc, 0xa6, 0xd2, 0x5f, 0xc3, 0x57, 0xf2, 0x4a, 0x4f, 0x33, 0x70, + 0x69, 0x1a, 0xc0, 0x5f, 0xd7, 0xd0, 0x48, 0x5c, 0xe7, 0x11, 0xcc, 0x84, 0x2a, 0xc4, 0x57, 0x81, + 0x57, 0xa8, 0x42, 0x7c, 0x25, 0x9e, 0x45, 0xb1, 0x45, 0xa3, 0x13, 0xf9, 0x02, 0xff, 0x87, 0x86, + 0x76, 0xab, 0x10, 0x23, 0x54, 0xa9, 0xd3, 0x1c, 0x48, 0x17, 0xaa, 0xd4, 0x69, 0x1e, 0xa0, 0x0a, + 0xf2, 0x2a, 0x95, 0xef, 0x06, 0xbe, 0x96, 0x47, 0xbe, 0xf0, 0x56, 0x76, 0x65, 0x25, 0xfc, 0x77, + 0xb5, 0x12, 0xbb, 0x11, 0x8f, 0x3f, 0x56, 0x42, 0x24, 0x0d, 0xb4, 0x22, 0xc2, 0x90, 0xc0, 0x53, + 0x99, 0x7c, 0x67, 0x42, 0x5e, 0xa8, 0xf2, 0xe9, 0x59, 0x88, 0x06, 0xe4, 0x75, 0x2a, 0xf7, 0x03, + 0x7c, 0xaf, 0x07, 0x72, 0x03, 0x0a, 0xc6, 0x6c, 0x28, 0xdc, 0x5f, 0x6a, 0x68, 0x2b, 0xbb, 0x6a, + 0x20, 0x9e, 0x49, 0x53, 0xac, 0xf8, 0x0a, 0x90, 0x03, 0xd5, 0x61, 0x11, 0x15, 0xee, 0x41, 0xf7, + 0x23, 0xb7, 0xc2, 0x90, 0xdb, 0xbf, 0xa2, 0xa1, 0x91, 0x08, 0x58, 0x20, 0x7e, 0xc3, 0x1e, 0x1f, + 0xcd, 0x07, 0x46, 0xc0, 0x24, 0x38, 0x56, 0x04, 0xb9, 0xa0, 0x98, 0x47, 0x57, 0x0f, 0xda, 0x0b, + 0xf6, 0x09, 0x96, 0x16, 0x36, 0xf1, 0x7e, 0xa1, 0x84, 0x0e, 0xe7, 0x86, 0x34, 0xc1, 0xaf, 0x14, + 0x1f, 0x4a, 0x69, 0xb8, 0x28, 0x6b, 0x1a, 0x96, 0x5d, 0x4e, 0xc7, 0xf4, 0xa1, 0xf8, 0xaf, 0x1a, + 0x3a, 0x90, 0x07, 0x85, 0x45, 0x15, 0xd6, 0x14, 0x40, 0x71, 0x59, 0x93, 0xf0, 0x85, 0xfc, 0x83, + 0xd0, 0xd2, 0xe1, 0xca, 0xf3, 0x6f, 0x1a, 0xda, 0x97, 0x85, 0x9f, 0xa2, 0x0a, 0xe2, 0x73, 0x42, + 0xc8, 0xa8, 0x82, 0xf8, 0xbc, 0xf0, 0x2d, 0xe4, 0x12, 0x15, 0xf5, 0x65, 0xfc, 0x52, 0x81, 0x64, + 0x6c, 0x5c, 0xda, 0x1f, 0x69, 0x68, 0x97, 0x02, 0xa5, 0x02, 0xab, 0x3d, 0x9a, 0x0c, 0x20, 0x8c, + 0xf2, 0x85, 0x2e, 0x5b, 0x77, 0x73, 0x3e, 0x2a, 0x70, 0x09, 0xd2, 0x31, 0x32, 0xf0, 0xdb, 0x1a, + 0xda, 0x91, 0x82, 0x5a, 0x81, 0x5f, 0x52, 0x99, 0x42, 0x85, 0x87, 0x51, 0x3e, 0xdb, 0x45, 0x4b, + 0x10, 0xee, 0x2a, 0x15, 0xee, 0x12, 0x9e, 0xc8, 0x97, 0x76, 0xd2, 0x5b, 0x40, 0x2d, 0xe9, 0x87, + 0xff, 0x39, 0x3f, 0x04, 0x19, 0xe1, 0x36, 0x8c, 0x67, 0xbb, 0xa1, 0x49, 0xa4, 0x8a, 0x8c, 0x4d, + 0x27, 0x39, 0xe6, 0x44, 0xb1, 0x9d, 0x8b, 0xc4, 0x8f, 0x18, 0x57, 0x56, 0xf8, 0x76, 0xdf, 0x97, + 0x34, 0xb4, 0x35, 0xde, 0x41, 0xf6, 0xd1, 0xb5, 0xc2, 0x42, 0xa4, 0x02, 0x67, 0x14, 0xdb, 0x39, + 0x4b, 0x08, 0x81, 0x7f, 0xa2, 0xa1, 0xad, 0x1d, 0x97, 0xca, 0xb1, 0x3a, 0xa5, 0x9e, 0x06, 0x29, + 0xa0, 0xfa, 0x46, 0xab, 0x6e, 0xfe, 0x13, 0x9b, 0x4a, 0x30, 0x87, 0xeb, 0x79, 0x24, 0x60, 0x37, + 0xdd, 0x83, 0x51, 0xc4, 0xe9, 0x54, 0x56, 0x44, 0x20, 0x83, 0x55, 0x7e, 0x72, 0x83, 0x81, 0x16, + 0xd0, 0x94, 0x9e, 0x00, 0x50, 0xb0, 0x8a, 0xff, 0x4a, 0x43, 0xb8, 0xf3, 0x52, 0xbe, 0xca, 0xa7, + 0x56, 0x61, 0x06, 0xa8, 0x7c, 0x6a, 0xe5, 0xed, 0xff, 0x62, 0xfb, 0x3c, 0x9d, 0x52, 0x7b, 0xf8, + 0x3b, 0x1a, 0xda, 0x2e, 0xbf, 0xc6, 0xad, 0x3a, 0x63, 0xa4, 0xbc, 0x39, 0xae, 0x3a, 0x63, 0xa4, + 0xbe, 0x31, 0x5e, 0xec, 0x34, 0x22, 0x88, 0x13, 0xde, 0x6d, 0xaa, 0xac, 0xf0, 0xfb, 0xea, 0xf4, + 0x54, 0xf4, 0xe6, 0xd8, 0x55, 0x6b, 0x55, 0x66, 0x47, 0x76, 0x61, 0x5b, 0x95, 0xd9, 0x91, 0xde, + 0xe1, 0x26, 0x2f, 0x53, 0xde, 0x4f, 0xe2, 0xf1, 0x3c, 0xbc, 0xc7, 0x7f, 0x7f, 0x1b, 0x7f, 0x5b, + 0x43, 0xdb, 0x64, 0x17, 0xff, 0x55, 0x93, 0x48, 0x01, 0x33, 0xa0, 0x9a, 0x44, 0x2a, 0x7c, 0x01, + 0x72, 0x8b, 0xca, 0x70, 0x15, 0x5f, 0xce, 0x23, 0xc3, 0x63, 0x46, 0x89, 0x5d, 0xbb, 0xe5, 0xe8, + 0x08, 0x9e, 0xb0, 0x87, 0xf8, 0x3f, 0x1a, 0xda, 0xad, 0xba, 0x54, 0xaf, 0x0a, 0xd8, 0x72, 0xdc, + 0xf1, 0x57, 0x05, 0x6c, 0x79, 0xee, 0xf2, 0x17, 0x3b, 0x6d, 0x09, 0x9f, 0x53, 0x53, 0x8f, 0x8b, + 0x3d, 0xe7, 0xb8, 0xc1, 0x84, 0x0a, 0x96, 0xf2, 0x24, 0xde, 0xc0, 0x2a, 0xfe, 0x96, 0x86, 0xb6, + 0xcb, 0xef, 0x2f, 0xab, 0x26, 0x97, 0xf2, 0x5e, 0xb4, 0x6a, 0x72, 0xa9, 0xaf, 0x4a, 0x17, 0x8b, + 0x06, 0x12, 0x97, 0xaa, 0x23, 0x39, 0xf1, 0x5b, 0x1a, 0x1a, 0x4e, 0x22, 0xfa, 0xe0, 0x1c, 0x29, + 0xac, 0x04, 0xde, 0x91, 0x2a, 0xef, 0x98, 0x06, 0x6c, 0x54, 0x2c, 0x3f, 0x12, 0xfa, 0x08, 0x8b, + 0x4b, 0x3a, 0x43, 0x35, 0xaa, 0xac, 0x30, 0x74, 0xa2, 0xd5, 0xca, 0xca, 0xa2, 0xb9, 0xbc, 0x8a, + 0x7f, 0xa8, 0xa1, 0x91, 0x34, 0x80, 0x22, 0xd5, 0xe9, 0xb4, 0x0c, 0x50, 0x24, 0x95, 0xe7, 0x9e, + 0x85, 0x87, 0x44, 0xee, 0x52, 0x11, 0x6f, 0xe2, 0x1b, 0xf9, 0x96, 0x11, 0xcf, 0xd7, 0x3b, 0xe5, + 0xd4, 0x17, 0xcd, 0x65, 0x2f, 0x14, 0x16, 0xff, 0xb1, 0x90, 0xa5, 0x04, 0xd0, 0xa2, 0x3c, 0x59, + 0xca, 0x38, 0xea, 0x52, 0x9e, 0x2c, 0x65, 0x02, 0x48, 0xa9, 0xd8, 0x81, 0xf8, 0x50, 0x8c, 0x59, + 0x60, 0xf1, 0xab, 0x1a, 0xc2, 0x9d, 0x00, 0x47, 0xaa, 0x23, 0xbd, 0xa9, 0x68, 0x4b, 0xaa, 0x23, + 0xbd, 0xe9, 0x18, 0x4a, 0xc5, 0x42, 0x8b, 0x90, 0x7f, 0x23, 0x20, 0xc4, 0x92, 0xdd, 0xf4, 0x40, + 0x4a, 0x88, 0xb2, 0xa1, 0x3a, 0x90, 0x92, 0x04, 0xe9, 0x50, 0x1d, 0x48, 0xe9, 0x80, 0xed, 0x28, + 0x76, 0x20, 0x85, 0x6f, 0x4f, 0xcd, 0x39, 0x41, 0xe4, 0xb3, 0x23, 0x05, 0x53, 0x42, 0x15, 0x10, + 0xa8, 0xf1, 0x2c, 0x54, 0x01, 0x41, 0x06, 0x80, 0x05, 0x79, 0x48, 0x05, 0x99, 0xc1, 0x77, 0x72, + 0x1d, 0x03, 0xa2, 0x08, 0xc4, 0x2d, 0x47, 0x8f, 0xce, 0x52, 0x1b, 0xfc, 0x97, 0x21, 0xc0, 0x81, + 0x83, 0x63, 0x15, 0xf8, 0xbf, 0x35, 0xb4, 0x4b, 0x81, 0x58, 0xa1, 0x0a, 0xf1, 0xb2, 0x51, 0x33, + 0x54, 0x21, 0x5e, 0x0e, 0x98, 0x0c, 0xf2, 0x7e, 0x2a, 0xf4, 0x7d, 0x5c, 0x2d, 0x28, 0xb4, 0x78, + 0xe6, 0x38, 0x4d, 0xf0, 0xb7, 0x35, 0xf4, 0x8c, 0x14, 0x81, 0x02, 0xab, 0x1d, 0xed, 0x54, 0xc8, + 0x0b, 0x95, 0xaf, 0xaa, 0x84, 0xba, 0x28, 0xe6, 0x5c, 0x00, 0xac, 0x84, 0xe9, 0xc2, 0x77, 0x96, + 0x9e, 0x5c, 0xab, 0xac, 0x70, 0x90, 0x83, 0x55, 0xfc, 0x4f, 0x1a, 0xda, 0x99, 0x0a, 0x50, 0x81, + 0x5f, 0xce, 0xca, 0xc4, 0xa7, 0xa3, 0x67, 0x94, 0xcf, 0x75, 0xd5, 0xb6, 0x9b, 0x88, 0x96, 0x1e, + 0x11, 0x95, 0x09, 0xea, 0xe1, 0xbf, 0xd0, 0xd0, 0x70, 0x12, 0xd0, 0x02, 0x1f, 0xcf, 0x56, 0x7d, + 0x02, 0x37, 0xa3, 0x3c, 0x5e, 0xa4, 0x49, 0x37, 0x8e, 0x42, 0x0c, 0xdc, 0x62, 0x59, 0xb4, 0xd0, + 0xdf, 0xb0, 0xa1, 0xd7, 0x89, 0x8d, 0x91, 0x31, 0xf4, 0x52, 0x11, 0x37, 0x32, 0x86, 0x5e, 0x3a, + 0x08, 0x47, 0xb1, 0x85, 0x3c, 0xb2, 0x4a, 0x04, 0xd9, 0x81, 0x7f, 0x1a, 0x08, 0x23, 0xc3, 0x9b, + 0x50, 0x0a, 0xa3, 0x80, 0xd5, 0x50, 0x0a, 0xa3, 0x02, 0xb6, 0x20, 0x16, 0x15, 0xa6, 0x86, 0x8d, + 0x5c, 0x19, 0x21, 0x20, 0xa5, 0xcf, 0x2e, 0xeb, 0x22, 0x38, 0x47, 0x65, 0x25, 0x81, 0xe9, 0xb1, + 0x5a, 0x59, 0x49, 0x82, 0x77, 0xac, 0xe2, 0x3f, 0xd2, 0xd0, 0xe6, 0x18, 0x84, 0x43, 0xd6, 0x10, + 0x94, 0x40, 0x4a, 0x64, 0x0d, 0x41, 0x19, 0xca, 0x44, 0xb1, 0x60, 0x2a, 0x8e, 0x47, 0x41, 0x6f, + 0x63, 0x76, 0xa0, 0x70, 0xe0, 0xf1, 0x3c, 0x1e, 0x40, 0x1c, 0x6f, 0xa3, 0x7c, 0xa2, 0x50, 0x9b, + 0xae, 0x8e, 0x5e, 0x46, 0x4e, 0x83, 0xed, 0x3c, 0xd6, 0x03, 0x7f, 0x0e, 0xff, 0xb5, 0x16, 0x83, + 0xdd, 0x8f, 0x44, 0x38, 0x95, 0x6b, 0xe7, 0xad, 0x43, 0x8a, 0xd3, 0x45, 0x9b, 0x81, 0x20, 0x53, + 0x54, 0x90, 0xf3, 0xf8, 0xe5, 0x82, 0xbb, 0x1e, 0xa2, 0x2c, 0x6f, 0x6b, 0x68, 0x9b, 0x0c, 0x93, + 0x43, 0x25, 0x8b, 0x02, 0x08, 0x44, 0x25, 0x8b, 0x0a, 0xfa, 0xa3, 0xd8, 0x66, 0x80, 0x09, 0x94, + 0xf4, 0xd8, 0x56, 0x4e, 0xfc, 0x8c, 0xd3, 0x3b, 0x1a, 0x2a, 0xa7, 0x83, 0x7b, 0x28, 0x8f, 0xf1, + 0x64, 0xa1, 0x87, 0x28, 0x8f, 0xf1, 0x64, 0xe2, 0x89, 0x90, 0x1b, 0x54, 0xd4, 0x69, 0x3c, 0x99, + 0x6b, 0xad, 0x53, 0x81, 0xa1, 0xe1, 0xef, 0x69, 0x68, 0x67, 0x30, 0x24, 0xa4, 0xb0, 0x1f, 0xca, + 0x33, 0xe2, 0x0a, 0xb4, 0x11, 0xe5, 0x19, 0x71, 0x15, 0xbe, 0x48, 0xb1, 0xd0, 0x48, 0x2e, 0x52, + 0xd2, 0x8c, 0x5f, 0xd4, 0xd0, 0x10, 0x1d, 0xf4, 0x11, 0x68, 0x84, 0xea, 0xa8, 0x73, 0x27, 0x2e, + 0x85, 0xea, 0xa8, 0xb3, 0x04, 0x89, 0xa2, 0x98, 0x7f, 0x00, 0xf7, 0xb4, 0x29, 0x18, 0x45, 0x82, + 0xf1, 0x7f, 0xd0, 0xd0, 0x48, 0x1a, 0x22, 0x88, 0xf2, 0xde, 0x9c, 0x1a, 0xb6, 0x44, 0x79, 0x6f, + 0x2e, 0x03, 0x80, 0xa4, 0x98, 0x6c, 0xb1, 0x0d, 0xfe, 0xc7, 0x96, 0xbf, 0x10, 0x66, 0x90, 0xa6, + 0x5e, 0x7d, 0xeb, 0x9d, 0x51, 0xed, 0x9b, 0xef, 0x8c, 0x6a, 0xdf, 0x7f, 0x67, 0x54, 0xfb, 0xb5, + 0x1f, 0x8c, 0x3e, 0xf5, 0xcd, 0x1f, 0x8c, 0x3e, 0xf5, 0xf7, 0x3f, 0x18, 0x7d, 0xea, 0xfd, 0xa7, + 0xe6, 0x2d, 0x7f, 0xa1, 0x3d, 0x3b, 0x56, 0x73, 0x1a, 0xe9, 0x7d, 0x3c, 0x11, 0xd7, 0xd7, 0xe5, + 0x96, 0xe9, 0xcd, 0x6e, 0x68, 0xb9, 0x8e, 0xef, 0x9c, 0xf8, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, + 0x32, 0x67, 0x30, 0x12, 0xf1, 0x93, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -9272,6 +9368,8 @@ type QueryClient interface { ActiveConfirmationPoCEvent(ctx context.Context, in *QueryActiveConfirmationPoCEventRequest, opts ...grpc.CallOption) (*QueryActiveConfirmationPoCEventResponse, error) // Queries confirmation PoC events for a specific epoch. ListConfirmationPoCEvents(ctx context.Context, in *QueryConfirmationPoCEventsRequest, opts ...grpc.CallOption) (*QueryConfirmationPoCEventsResponse, error) + // Queries random seeds for a specific epoch. + ListRandomSeeds(ctx context.Context, in *QueryRandomSeedsRequest, opts ...grpc.CallOption) (*QueryRandomSeedsResponse, error) ParticipantsWithBalances(ctx context.Context, in *QueryParticipantsWithBalancesRequest, opts ...grpc.CallOption) (*QueryParticipantsWithBalancesResponse, error) } @@ -9994,6 +10092,15 @@ func (c *queryClient) ListConfirmationPoCEvents(ctx context.Context, in *QueryCo return out, nil } +func (c *queryClient) ListRandomSeeds(ctx context.Context, in *QueryRandomSeedsRequest, opts ...grpc.CallOption) (*QueryRandomSeedsResponse, error) { + out := new(QueryRandomSeedsResponse) + err := c.cc.Invoke(ctx, "/inference.inference.Query/ListRandomSeeds", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *queryClient) ParticipantsWithBalances(ctx context.Context, in *QueryParticipantsWithBalancesRequest, opts ...grpc.CallOption) (*QueryParticipantsWithBalancesResponse, error) { out := new(QueryParticipantsWithBalancesResponse) err := c.cc.Invoke(ctx, "/inference.inference.Query/ParticipantsWithBalances", in, out, opts...) @@ -10141,6 +10248,8 @@ type QueryServer interface { ActiveConfirmationPoCEvent(context.Context, *QueryActiveConfirmationPoCEventRequest) (*QueryActiveConfirmationPoCEventResponse, error) // Queries confirmation PoC events for a specific epoch. ListConfirmationPoCEvents(context.Context, *QueryConfirmationPoCEventsRequest) (*QueryConfirmationPoCEventsResponse, error) + // Queries random seeds for a specific epoch. + ListRandomSeeds(context.Context, *QueryRandomSeedsRequest) (*QueryRandomSeedsResponse, error) ParticipantsWithBalances(context.Context, *QueryParticipantsWithBalancesRequest) (*QueryParticipantsWithBalancesResponse, error) } @@ -10385,6 +10494,9 @@ func (*UnimplementedQueryServer) ActiveConfirmationPoCEvent(ctx context.Context, func (*UnimplementedQueryServer) ListConfirmationPoCEvents(ctx context.Context, req *QueryConfirmationPoCEventsRequest) (*QueryConfirmationPoCEventsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ListConfirmationPoCEvents not implemented") } +func (*UnimplementedQueryServer) ListRandomSeeds(ctx context.Context, req *QueryRandomSeedsRequest) (*QueryRandomSeedsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListRandomSeeds not implemented") +} func (*UnimplementedQueryServer) ParticipantsWithBalances(ctx context.Context, req *QueryParticipantsWithBalancesRequest) (*QueryParticipantsWithBalancesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ParticipantsWithBalances not implemented") } @@ -11815,6 +11927,24 @@ func _Query_ListConfirmationPoCEvents_Handler(srv interface{}, ctx context.Conte return interceptor(ctx, in, info, handler) } +func _Query_ListRandomSeeds_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryRandomSeedsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).ListRandomSeeds(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/inference.inference.Query/ListRandomSeeds", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).ListRandomSeeds(ctx, req.(*QueryRandomSeedsRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _Query_ParticipantsWithBalances_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(QueryParticipantsWithBalancesRequest) if err := dec(in); err != nil { @@ -12154,6 +12284,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "ListConfirmationPoCEvents", Handler: _Query_ListConfirmationPoCEvents_Handler, }, + { + MethodName: "ListRandomSeeds", + Handler: _Query_ListRandomSeeds_Handler, + }, { MethodName: "ParticipantsWithBalances", Handler: _Query_ParticipantsWithBalances_Handler, @@ -18407,6 +18541,71 @@ func (m *QueryParticipantsWithBalancesResponse) MarshalToSizedBuffer(dAtA []byte return len(dAtA) - i, nil } +func (m *QueryRandomSeedsRequest) 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 *QueryRandomSeedsRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryRandomSeedsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.EpochIndex != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.EpochIndex)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryRandomSeedsResponse) 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 *QueryRandomSeedsResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryRandomSeedsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if len(m.Seeds) > 0 { + for iNdEx := len(m.Seeds) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Seeds[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -20976,6 +21175,33 @@ func (m *QueryParticipantsWithBalancesResponse) Size() (n int) { return n } +func (m *QueryRandomSeedsRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EpochIndex != 0 { + n += 1 + sovQuery(uint64(m.EpochIndex)) + } + return n +} + +func (m *QueryRandomSeedsResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if len(m.Seeds) > 0 { + for _, e := range m.Seeds { + l = e.Size() + n += 1 + l + sovQuery(uint64(l)) + } + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -36944,6 +37170,159 @@ func (m *QueryParticipantsWithBalancesResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryRandomSeedsRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryRandomSeedsRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryRandomSeedsRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EpochIndex", wireType) + } + m.EpochIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EpochIndex |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryRandomSeedsResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryRandomSeedsResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryRandomSeedsResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Seeds", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Seeds = append(m.Seeds, &RandomSeed{}) + if err := m.Seeds[len(m.Seeds)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/inference-chain/x/inference/types/query.pb.gw.go b/inference-chain/x/inference/types/query.pb.gw.go index 7880796f5..44a556860 100644 --- a/inference-chain/x/inference/types/query.pb.gw.go +++ b/inference-chain/x/inference/types/query.pb.gw.go @@ -3461,6 +3461,60 @@ func local_request_Query_ListConfirmationPoCEvents_0(ctx context.Context, marsha } +func request_Query_ListRandomSeeds_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryRandomSeedsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["epoch_index"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "epoch_index") + } + + protoReq.EpochIndex, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "epoch_index", err) + } + + msg, err := client.ListRandomSeeds(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_ListRandomSeeds_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryRandomSeedsRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["epoch_index"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "epoch_index") + } + + protoReq.EpochIndex, err = runtime.Uint64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "epoch_index", err) + } + + msg, err := server.ListRandomSeeds(ctx, &protoReq) + return msg, metadata, err + +} + var ( filter_Query_ParticipantsWithBalances_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} ) @@ -5320,6 +5374,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_ListRandomSeeds_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_ListRandomSeeds_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ListRandomSeeds_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Query_ParticipantsWithBalances_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -6964,6 +7041,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_ListRandomSeeds_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_ListRandomSeeds_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_ListRandomSeeds_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("GET", pattern_Query_ParticipantsWithBalances_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -7146,6 +7243,8 @@ var ( pattern_Query_ListConfirmationPoCEvents_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"productscience", "inference", "confirmation_poc_events", "epoch_index"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ListRandomSeeds_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"productscience", "inference", "random_seeds", "epoch_index"}, "", runtime.AssumeColonVerbOpt(true))) + pattern_Query_ParticipantsWithBalances_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 1, 2, 2}, []string{"productscience", "inference", "participants_with_balances"}, "", runtime.AssumeColonVerbOpt(true))) ) @@ -7308,5 +7407,7 @@ var ( forward_Query_ListConfirmationPoCEvents_0 = runtime.ForwardResponseMessage + forward_Query_ListRandomSeeds_0 = runtime.ForwardResponseMessage + forward_Query_ParticipantsWithBalances_0 = runtime.ForwardResponseMessage ) From bb2de824ab454693de753afa38b1d9cf1f768fdd Mon Sep 17 00:00:00 2001 From: John Long Date: Wed, 18 Feb 2026 10:46:19 -0800 Subject: [PATCH 02/13] Upgrade v0.2.10 (#695) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Upgrade template * Use a portable build of BLST for macos (test) builds (#697) Running the binaries with the blst binary will cause a SIGILL error when run in an AMD64 container on an ARM64 machine. But we still want native perf for production, so we added a flag so the portable build is only for local/test builds * fix: avoid rewriting config on every startup (#644) * fix: avoid rewriting config on every startup * chore: use standard logging --------- Co-authored-by: John Long Co-authored-by: DimaOrekhovPS * fix: minor bugs (#545) * fix: division by zero ShouldValidate * fix: add http timeout * fix: ticker instead timer checkStatusRoutine * fix: use inference epoch for GetEpochModel in validation GetEpochModel in validation should use the inference's epoch ID instead of the current epoch to ensure correct model snapshot is retrieved, especially for validations from previous epochs. * fix: based on PR comments * remove slog usage --------- Co-authored-by: John Long Co-authored-by: DimaOrekhovPS * security: add request body size limit to prevent DoS (#634) Add MaxRequestBodySize constant (10 MB) and use http.MaxBytesReader in readRequestBody to prevent memory exhaustion attacks from oversized request bodies. An attacker could previously send arbitrarily large request bodies to /v1/chat/completions, causing nodes to allocate unbounded memory and crash from OOM. Changes: - Add MaxRequestBodySize constant (10 MB) - Wrap request body with http.MaxBytesReader in readRequestBody - Add unit tests for size limit enforcement Co-authored-by: Alexey Samosadov Co-authored-by: John Long Co-authored-by: DimaOrekhovPS * perf(poc): optimize artifact storage throughput (#666) Co-authored-by: DimaOrekhovPS Co-authored-by: John Long * Model assignment: check if participants got reward for previous epoch (#659) * Added check if nodes got reward for previous epoch to filter them for POC_SLOT=true eligability * Fix for issue658 * removed doc of the issue * Added log on filtering out participant without reward, to do not get POC_SLOT = true Fixed condition to work out edge case when participant could ve rewarded in some epoch before * Fixed the tests, as now we need reward for POC_SLOT Added test to check fltering based on settement works correctly --------- Co-authored-by: John Long Co-authored-by: DimaOrekhovPS * fix: sanitize from nil participants in executor selection (#643) * fix: guard nil participants in executor selection * add test * remove redundant sanitizeMembers --------- Co-authored-by: John Long Co-authored-by: DimaOrekhovPS * fix: don't crash API in case of network drop during tryClaimingTaskToAssign (#661) Co-authored-by: John Long Co-authored-by: DimaOrekhovPS * Add unit tests for node version management (#467) (#640) Add comprehensive tests for: - SetCurrentNodeVersion: verify version updates correctly - ShouldRefreshClients: verify refresh logic when versions differ - SyncVersionFromChain: verify chain sync updates version appropriately - TestVersionUpdateTriggersRefresh: end-to-end version change flow These tests ensure node version is properly tracked and updated when chain version changes. Co-authored-by: Alexey Samosadov Co-authored-by: Claude Opus 4.5 Co-authored-by: John Long * fix: add missing return after error in tryClaimingTaskToAssign (#639) Fixes #422 The function logged an error when chain RPC was unavailable but continued execution, causing a nil pointer dereference crash when trying to access chainStatus.SyncInfo. Added return statement after the error log to prevent the crash. Signed-off-by: DimaOrekhovPS Co-authored-by: Alexey Samosadov Co-authored-by: John Long Co-authored-by: DimaOrekhovPS * fix(poc): use chain stat test params instead of hardcoded defaults (#711) Co-authored-by: Gleb Morgachev * security: fix unsafe type assertions in request processing (#638) Co-authored-by: AlexeySamosadov * Fix poc weight function name: calculateInferenceServingWeight > calculatePocParticipatingNodesWeight (#716) --------- Signed-off-by: DimaOrekhovPS Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * IBC Upgrade to v8.7.0 (#708) * testermint IntDeserializer * ibc update to v8.7.0 * fix merge change --------- Co-authored-by: John Long Co-authored-by: DimaOrekhovPS * Testnet: bridge setup scripts (#723) * Punishment statistics based on on-chain data: dynamic table selection (#561) (#688) * dynamic table selection (#561) * dynamic p0 selection (#561) * fix lookup table * fix comment * fix tests --------- Co-authored-by: John Long Co-authored-by: DimaOrekhovPS * Require proto-go generation matches committed code (#712) * Require proto-go generation matches committed code * ci: fix ignite v28 install target * ci: install ignite from correct package path * ci: install ignite v28.10.0 from release tarball * ci: disable ignite telemetry prompt in ci * ci: run ignite generation non-interactively * ci: build ignite cli from v28 source * ci: use full checkout history for ignite * test: modify proto without regeneration * Revert, should pass now * Update, should pass * Missing added, should fail * New generated files, should pass * See if _extra_ files causes an issue * See if leftover files causes an issue * Remove leftover files * Restrict to pushes of .proto files and generated files * Final reverts * ci: pin go setup and verify ignite checksum * ci: pin verify proto workflow runner image --------- Co-authored-by: DimaOrekhovPS * fix(inference): propagate refund error in InvalidateInference (#622) * fix(inference): propagate refund error in InvalidateInference refundInvalidatedInference swallows IssueRefund errors and always returns nil. Executor balance gets deducted before the refund attempt, so when escrow is underfunded both sides lose - executor balance down, payer never gets refund, no error returned. Fix: attempt refund first, only deduct balance after success, return error if it fails. * Update inference-chain/x/inference/keeper/msg_server_invalidate_inference.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: DimaOrekhovPS --------- Signed-off-by: DimaOrekhovPS Co-authored-by: John Long Co-authored-by: DimaOrekhovPS Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * PoC Validation Sampling Optimization (#710) * Initial upgrade boilerplate * PoC v2 Fixes/TA Agent Whitelist (#673) Full PoC V2 activation with model consolidation and access controls. - PoC V2 fully enabled (tracking mode from v0.2.8 -> full enforcement) - Network consolidated to single model: `Qwen/Qwen3-235B-A22B-Instruct-2507-FP8` - Transfer Agent whitelist for request gating - Guardian tiebreaker for undecided PoC V2 votes - 24 suspicious participants removed from allowlist **PoC V2 Activation** - `PocV2Enabled=true`, `ConfirmationPocV2Enabled=true` - `WeightScaleFactor=0.262`, `InferenceValidationCutoff=2`, `PocValidationDuration=480` - All nodes' `POC_SLOT` allocations reset (both `ActiveParticipants` and `EpochGroupData`) - First V2 epoch runs in grace mode, full enforcement begins the following epoch **Guardian Tiebreaker** - When neither valid nor invalid votes reach majority, guardians can break the tie - Requires: no majority exists, guardians enabled, at least one guardian voted, all voting guardians agree **Transfer Agent Whitelist** - New `TransferAgentAccessParams.AllowedTransferAddresses` in params - Validation in `StartInference` and `FinishInference` messages - Empty whitelist = all TAs allowed; non-empty = only listed TAs **Model Consolidation** - All governance models except `Qwen/Qwen3-235B-A22B-Instruct-2507-FP8` deleted during migration **Suspicious Participant Removal** - 24 addresses removed from allowlist (completed POC generation but did not vote at validation) **Enforced Model Auto-Switch** - Auto-switches nodes to qwen235B with `--tensor-parallel-size 4 --max-model-len 240000` - Config enforcement overwrites node model config on load - Runtime verification queries vLLM `/v1/models` endpoint, triggers redeploy on mismatch - Disabled via `ENFORCED_MODEL_ID=none` **Transfer Agent Whitelist** - Early enforcement in `/chat/completion` before expensive operations - Cache synced from chain on every new block for O(1) lookups **[#674](https://github.com/gonka-ai/gonka/pull/674) Missed inferences fix** - Don't punish for missed inferences of non-preserved nodes during PoC - Don't punish if participant doesn't support the model **[#678](https://github.com/gonka-ai/gonka/pull/678) CPoC downtime penalty redistribution** - Lower confirmation reward penalty transferred to community pool instead of being lost **Inference expiry during PoC/CPoC** - New `InferenceExpiryContext` tracks latest PoC or CPoC range - Inferences started during PoC/CPoC not punished for expiry **Bitcoin rewards weight calculation** - Full weights used for denominator (prevents redistribution of invalidated participants' shares) - CPoC reductions and invalidated shares go to governance pool * feat(poc): add validation sampling to reduce complexity from O(N²) to O(N*N_SLOTS) - add GetSlots algorithm for deterministic weighted random sampling - store PoCValidationSnapshot on-chain at validation phase start - filter DAPI validation to only assigned participants - count slots instead of weight for consensus (weight encoded in slot distribution) - add ValidationSlots parameter to PocParams (0 = disabled, fallback to O(N²)) - support both regular PoC and confirmation PoC * fix(poc): harden validation sampling edge cases and add testermint params - skip negative/zero weights in GetSlots to prevent undefined behavior - return nil snapshot when not found in query handler - log fallback to O(N^2) when snapshot missing on chain - fallback instead of return on DAPI snapshot query error - add validation_slots and stat_test to testermint AppExport - add comprehensive unit tests for slots edge cases * fix(poc): fix concurrent artifact read race causing data corruption - Use ReadAt instead of Seek+ReadFull for thread-safe concurrent reads - Add signed response with signer_address, timestamp, signature fields - Report participants as invalid when validation retries exhausted * set slots amount * Fix * Fix: key * fix: remove duplicate reportInvalidParticipant function after rebase * Rever main behaviour * Review fixes * clean up * Optimization * Better esimtations * Update security model * fix tests * Fix test * fix(poc): address review feedback Co-authored-by: Cursor * Add missing generated proto files --------- Co-authored-by: johnlong Co-authored-by: Gleb Morgachev Co-authored-by: Cursor * Create upgrade description * Add MsgTransferWithVesting for vesting transfers (#641) * Add unit tests for node version management (#467) Add comprehensive tests for: - SetCurrentNodeVersion: verify version updates correctly - ShouldRefreshClients: verify refresh logic when versions differ - SyncVersionFromChain: verify chain sync updates version appropriately - TestVersionUpdateTriggersRefresh: end-to-end version change flow These tests ensure node version is properly tracked and updated when chain version changes. Co-Authored-By: Claude Opus 4.5 * Add MsgTransferWithVesting message for vesting transfers (#631) Add a new message type MsgTransferWithVesting to the streamvesting module that allows transferring tokens with a vesting schedule. Features: - Transfer tokens from sender to recipient with vesting over N epochs - Default vesting period of 180 epochs if not specified - Tokens vest linearly with remainder going to first epoch - Full validation of sender/recipient addresses and amount - CLI command: transfer-with-vesting [recipient] [amount] [vesting-epochs] Files changed: - proto/inference/streamvesting/tx.proto: Add message definition - x/streamvesting/types/tx.pb.go: Generated protobuf code - x/streamvesting/types/codec.go: Register new message - x/streamvesting/types/events.go: Add event types - x/streamvesting/keeper/msg_transfer_with_vesting.go: Handler - x/streamvesting/keeper/msg_transfer_with_vesting_test.go: Tests - x/streamvesting/module/autocli.go: CLI configuration Closes #631 Co-Authored-By: Claude Opus 4.5 * fix: address review feedback for MsgTransferWithVesting - Add MaxVestingEpochs (3650) and MaxCoinsInAmount (10) limits to prevent DoS - Replace int with int64 for explicit type safety - Remove unrelated config_test.go changes Addresses review comments from @patimen. Co-Authored-By: Claude Opus 4.5 * fix: regenerate protobuf files for TransferWithVesting RPC method The API-layer gRPC files were not regenerated after adding the new TransferWithVesting RPC method, causing panic on startup: "rpc method TransferWithVesting not found for service inference.streamvesting.Msg" Regenerated using: buf generate --template buf.gen.pulsar.yaml Co-Authored-By: Claude Opus 4.5 * test: add comprehensive assertions and edge case tests for vesting Verify actual coin amounts per epoch, test remainder distribution, max epochs limit, and max coins limit. Authored-by: Alexey Samosadov Co-Authored-By: Claude Opus 4.6 * Regenerating pulsar.go and pb.go files with `ignite` 28.10.0 This is our current version and approved way of generating new proto files * Add a testermint test for MsgTransferWithVesting Using the 'gov' account via a governance proposal, specifically, as this will be an important scenario in production. * test: add comprehensive assertions and edge case tests for vesting Verify actual coin amounts per epoch, test remainder distribution, max epochs limit, and max coins limit. Authored-by: Alexey Samosadov --------- Co-authored-by: Alexey Samosadov Co-authored-by: Claude Opus 4.5 Co-authored-by: Alexey Samosadov Co-authored-by: John Long Co-authored-by: AlexeySamosadov Co-authored-by: DimaOrekhovPS * #641 description * POC weight normalization on real POC time (#725) * Initial upgrade boilerplate * PoC v2 Fixes/TA Agent Whitelist (#673) Full PoC V2 activation with model consolidation and access controls. - PoC V2 fully enabled (tracking mode from v0.2.8 -> full enforcement) - Network consolidated to single model: `Qwen/Qwen3-235B-A22B-Instruct-2507-FP8` - Transfer Agent whitelist for request gating - Guardian tiebreaker for undecided PoC V2 votes - 24 suspicious participants removed from allowlist **PoC V2 Activation** - `PocV2Enabled=true`, `ConfirmationPocV2Enabled=true` - `WeightScaleFactor=0.262`, `InferenceValidationCutoff=2`, `PocValidationDuration=480` - All nodes' `POC_SLOT` allocations reset (both `ActiveParticipants` and `EpochGroupData`) - First V2 epoch runs in grace mode, full enforcement begins the following epoch **Guardian Tiebreaker** - When neither valid nor invalid votes reach majority, guardians can break the tie - Requires: no majority exists, guardians enabled, at least one guardian voted, all voting guardians agree **Transfer Agent Whitelist** - New `TransferAgentAccessParams.AllowedTransferAddresses` in params - Validation in `StartInference` and `FinishInference` messages - Empty whitelist = all TAs allowed; non-empty = only listed TAs **Model Consolidation** - All governance models except `Qwen/Qwen3-235B-A22B-Instruct-2507-FP8` deleted during migration **Suspicious Participant Removal** - 24 addresses removed from allowlist (completed POC generation but did not vote at validation) **Enforced Model Auto-Switch** - Auto-switches nodes to qwen235B with `--tensor-parallel-size 4 --max-model-len 240000` - Config enforcement overwrites node model config on load - Runtime verification queries vLLM `/v1/models` endpoint, triggers redeploy on mismatch - Disabled via `ENFORCED_MODEL_ID=none` **Transfer Agent Whitelist** - Early enforcement in `/chat/completion` before expensive operations - Cache synced from chain on every new block for O(1) lookups **[#674](https://github.com/gonka-ai/gonka/pull/674) Missed inferences fix** - Don't punish for missed inferences of non-preserved nodes during PoC - Don't punish if participant doesn't support the model **[#678](https://github.com/gonka-ai/gonka/pull/678) CPoC downtime penalty redistribution** - Lower confirmation reward penalty transferred to community pool instead of being lost **Inference expiry during PoC/CPoC** - New `InferenceExpiryContext` tracks latest PoC or CPoC range - Inferences started during PoC/CPoC not punished for expiry **Bitcoin rewards weight calculation** - Full weights used for denominator (prevents redistribution of invalidated participants' shares) - CPoC reductions and invalidated shares go to governance pool * feat(poc): add validation sampling to reduce complexity from O(N²) to O(N*N_SLOTS) - add GetSlots algorithm for deterministic weighted random sampling - store PoCValidationSnapshot on-chain at validation phase start - filter DAPI validation to only assigned participants - count slots instead of weight for consensus (weight encoded in slot distribution) - add ValidationSlots parameter to PocParams (0 = disabled, fallback to O(N²)) - support both regular PoC and confirmation PoC * fix(poc): harden validation sampling edge cases and add testermint params - skip negative/zero weights in GetSlots to prevent undefined behavior - return nil snapshot when not found in query handler - log fallback to O(N^2) when snapshot missing on chain - fallback instead of return on DAPI snapshot query error - add validation_slots and stat_test to testermint AppExport - add comprehensive unit tests for slots edge cases * fix(poc): fix concurrent artifact read race causing data corruption - Use ReadAt instead of Seek+ReadFull for thread-safe concurrent reads - Add signed response with signer_address, timestamp, signature fields - Report participants as invalid when validation retries exhausted * set slots amount * Fix * Fix: key * fix: remove duplicate reportInvalidParticipant function after rebase * Rever main behaviour * Review fixes * clean up * Optimization * Better esimtations * Update security model * normalize POC * Lost snapshots * normalize POC * feat(poc): add poc_normalization_enabled parameter to control time-based weight normalization * proper decimal * Comment * Update pulsar.go files * Fix governance test * Minor review fixes: 1. Log result of participant weight calculation 2. Update comments for params 3. If we find an incomplete PoCValidationSnapshot, treat it as not found (for the `ValidateAll` query) * make broker test more robust --------- Co-authored-by: johnlong Co-authored-by: dima * #634 follow-up: pass in response writer into the http.MaxBytesReader (#727) * pass in the writer * fix post_chat_handler_test.go * Update upgrade description to include PoC Weight Normalization * #727 description * Distribute bounty (#733) * Add proposed bounties to README (#732) * Add proposed bounties to README Added proposed bounties section with details on rewards for various PRs and issues. Signed-off-by: mtvnastya * Refine proposed bounties formatting in README.md Updated the proposed bounties section for clarity and consistency. Signed-off-by: mtvnastya --------- Signed-off-by: mtvnastya Co-authored-by: Gleb Morgachev * POC Params (#734) * POC Params * Longer validation * Upgrade v0.2.10 finalize readme (#735) --------- Co-authored-by: Gleb Morgachev * Review fixes (#738) * ignore nonces without distribution * Use snapshots * 0.2.10 review fixes: msg transfer (#743) * Fix missing error handling * add amount comment * Update inference-chain/x/streamvesting/keeper/msg_transfer_with_vesting.go Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Signed-off-by: DimaOrekhovPS --------- Signed-off-by: DimaOrekhovPS Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> * Fix PoC and CPoC intersection bug (#752) Co-authored-by: Gleb Morgachev * 0.2.10 merge w 0.2.9-post3 hotfix (#762) * Fix: v0.2.9-post3 (#748) * Fix: intersection * use previous active participant set * version * post merge codegen * fix pulsar files * remove epoch 170 handling --------- Co-authored-by: Gleb Morgachev * bounty for previous upgrade pr reviews (#745) * Update README with new PR entries and reviews Added new entries for PR #641, PR #622, and PR #688, along with a review section for previous upgrades. Signed-off-by: mtvnastya * Add bounty payments Signed-off-by: mtvnastya * Fix formatting issue in upgrade v0.2.10 Signed-off-by: mtvnastya * Add new address for review of 0.2.8 Signed-off-by: mtvnastya --------- Signed-off-by: mtvnastya Co-authored-by: DimaOrekhovPS * Remove epoch 170 edge special handling * Tools & Phases (#767) * Enable tools * feat(upgrade): add grace epoch for relaxed punishment during upgrade * fix(poc): align API artifact acceptance with chain exchange windows Deprecate poc_exchange_duration (set to 0 in v0.2.10 upgrade). API now accepts artifacts until poc_generation_end using IsPoCExchangeWindow and IsInBatchSubmissionWindow checks instead of relying on phase alone. * desciption * Versions * Versions * check validationParams != nil * use DefaultValidationParams when not found --------- Co-authored-by: dima * # Adjust CPoC ratio and weight scale factor (#768) * Adjust multiplicator * POC * Add PoC vector verification on `api` side (#769) * fix(poc): reject NaN and Infinity in FP16 vectors --------- Signed-off-by: DimaOrekhovPS Signed-off-by: mtvnastya Co-authored-by: x0152 <45021974+x0152@users.noreply.github.com> Co-authored-by: DimaOrekhovPS Co-authored-by: AlexeySamosadov <37549796+AlexeySamosadov@users.noreply.github.com> Co-authored-by: Alexey Samosadov Co-authored-by: Fedor Ignatov Co-authored-by: Alexander Kuprin Co-authored-by: Alexey Samosadov Co-authored-by: Claude Opus 4.5 Co-authored-by: Gleb Morgachev Co-authored-by: AlexeySamosadov Co-authored-by: Copilot <175728472+Copilot@users.noreply.github.com> Co-authored-by: GLiberman Co-authored-by: 0xMayoor <0xmayor@quartiers.io> Co-authored-by: Cursor Co-authored-by: Alexey Samosadov Co-authored-by: mtvnastya --- .../workflows/verify-proto-go-generation.yml | 63 + decentralized-api/Dockerfile | 7 +- decentralized-api/Makefile | 4 +- decentralized-api/apiconfig/config_manager.go | 22 +- .../config_manager_migration_test.go | 26 + decentralized-api/apiconfig/config_test.go | 157 + decentralized-api/broker/broker_test.go | 9 +- decentralized-api/broker/state_commands.go | 19 +- decentralized-api/completionapi/request.go | 22 +- .../completionapi/request_test.go | 145 +- .../cosmosclient/tx_manager/tx_manager.go | 2 + decentralized-api/go.mod | 4 +- decentralized-api/go.sum | 8 +- .../server/public/post_chat_handler.go | 26 +- .../server/public/post_chat_handler_test.go | 63 + .../internal/server/public/server.go | 4 + .../internal/server/public/ssrf_test.go | 2 +- decentralized-api/main.go | 1 + decentralized-api/poc/artifacts/store.go | 9 +- decentralized-api/poc/commit_worker_test.go | 20 +- decentralized-api/poc/orchestrator.go | 3 + decentralized-api/poc/phase.go | 24 +- decentralized-api/poc/phase_test.go | 64 +- decentralized-api/poc/proof_client.go | 31 + decentralized-api/poc/proof_client_test.go | 229 + decentralized-api/poc/validator.go | 93 +- decentralized-api/poc/validator_v1.go | 29 +- decentralized-api/training/assigner.go | 5 + decentralized-api/training/executor.go | 5 +- deploy/join/docker-compose.mlnode.yml | 4 +- deploy/join/docker-compose.yml | 10 +- inference-chain/Dockerfile | 9 +- inference-chain/Makefile | 2 + .../inference/grace_epoch_params.pulsar.go | 712 ++ .../api/inference/inference/params.pulsar.go | 1000 +-- .../poc_validation_snapshot.pulsar.go | 1490 ++++ .../api/inference/inference/query.pulsar.go | 6402 ++++++++++------- .../api/inference/inference/query_grpc.pb.go | 39 + .../api/inference/streamvesting/tx.pulsar.go | 1255 +++- .../api/inference/streamvesting/tx_grpc.pb.go | 43 +- inference-chain/app/upgrades.go | 2 + .../app/upgrades/v0_2_10/constants.go | 3 + .../app/upgrades/v0_2_10/upgrades.go | 363 + .../app/upgrades/v0_2_10/upgrades_test.go | 11 + inference-chain/go.mod | 4 +- inference-chain/go.sum | 8 +- .../inference/grace_epoch_params.proto | 14 + .../proto/inference/inference/params.proto | 4 +- .../inference/poc_validation_snapshot.proto | 20 + .../proto/inference/inference/query.proto | 15 + .../proto/inference/streamvesting/tx.proto | 33 +- .../inference/calculations/should_validate.go | 3 + .../calculations/should_validate_test.go | 15 + .../x/inference/calculations/slots.go | 108 + .../x/inference/calculations/slots_test.go | 383 + .../x/inference/calculations/stats_table.go | 18 +- .../calculations/stats_table_test.go | 46 +- .../x/inference/epochgroup/epoch_group.go | 8 +- .../inference/epochgroup/epoch_group_test.go | 49 +- .../x/inference/epochgroup/random.go | 18 + .../x/inference/keeper/accountsettle.go | 16 +- .../x/inference/keeper/accountsettle_test.go | 136 + .../x/inference/keeper/bitcoin_rewards.go | 146 +- .../inference/keeper/bitcoin_rewards_test.go | 136 + .../x/inference/keeper/epoch_models.go | 18 +- inference-chain/x/inference/keeper/keeper.go | 18 + .../keeper/migrations_confirmation_weight.go | 12 +- .../keeper/msg_server_claim_rewards_test.go | 24 +- .../keeper/msg_server_invalidate_inference.go | 15 +- .../inference/keeper/msg_server_validation.go | 3 +- .../keeper/poc_validation_snapshot.go | 28 + .../keeper/punishment_grace_epochs.go | 23 + .../keeper/punishment_grace_epochs_test.go | 110 + .../keeper/query_poc_validation_snapshot.go | 32 + .../x/inference/module/chainvalidation.go | 371 +- .../inference/module/chainvalidation_test.go | 7 +- .../module/chainvalidation_v1_test.go | 3 +- .../x/inference/module/confirmation_poc.go | 70 +- .../x/inference/module/model_assignment.go | 22 +- .../inference/module/model_assignment_test.go | 171 + inference-chain/x/inference/module/module.go | 169 +- .../inference/types/grace_epoch_params.pb.go | 404 ++ inference-chain/x/inference/types/keys.go | 2 + inference-chain/x/inference/types/params.go | 4 +- .../x/inference/types/params.pb.go | 518 +- .../types/poc_validation_snapshot.pb.go | 738 ++ inference-chain/x/inference/types/query.pb.go | 1338 ++-- .../x/inference/types/query.pb.gw.go | 101 + .../keeper/msg_transfer_with_vesting.go | 142 + .../keeper/msg_transfer_with_vesting_test.go | 244 + .../x/streamvesting/module/autocli.go | 11 + .../x/streamvesting/types/codec.go | 1 + .../x/streamvesting/types/events.go | 7 +- .../x/streamvesting/types/tx.pb.go | 546 +- local-test-net/stop-rebuild.sh | 1 + mlnode/packages/api/Dockerfile | 2 +- mlnode/packages/pow/Dockerfile | 4 +- mlnode/packages/train/Dockerfile | 2 +- .../ethereum-bridge-contact/.env.example | 18 + .../update-v0.2.10/README.md | 159 + proposals/poc/optimize.md | 339 + proposals/poc/optimize.py | 161 + .../nebius/bridge/BRIDGE_TESTNET_GUIDE.md | 149 + .../nebius/bridge/bridge-fund-pool.sh | 209 + .../nebius/bridge/bridge-register-pool.sh | 327 + .../nebius/bridge/bridge-register-wrapped.sh | 269 + .../nebius/bridge/bridge-register.sh | 262 + test-net-cloud/nebius/bridge/bridge-setup.sh | 155 + test-net-cloud/nebius/genesis-overrides.json | 3 +- .../mockserver/service/WebhookService.kt | 10 +- testermint/src/main/kotlin/ApplicationCLI.kt | 4 +- testermint/src/main/kotlin/InferenceMock.kt | 10 +- .../src/main/kotlin/InferenceTestUtils.kt | 5 +- testermint/src/main/kotlin/Main.kt | 33 +- .../src/main/kotlin/RewardCalculations.kt | 34 +- .../kotlin/com/productscience/data/bls.kt | 2 +- testermint/src/main/kotlin/data/AppExport.kt | 15 + testermint/src/main/kotlin/data/Staking.kt | 17 +- testermint/src/main/kotlin/data/converters.kt | 71 + testermint/src/main/kotlin/data/inference.kt | 33 +- testermint/src/main/kotlin/data/messages.kt | 63 +- .../src/main/kotlin/data/participants.kt | 2 +- testermint/src/main/kotlin/data/status.kt | 2 +- .../src/test/kotlin/BLSDKGSuccessTest.kt | 146 +- .../test/kotlin/ConfirmationPoCFailTests.kt | 2 +- testermint/src/test/kotlin/GovernanceTests.kt | 77 +- .../kotlin/InferenceFailureAccountingTests.kt | 2 +- .../src/test/kotlin/InvalidationTests.kt | 2 +- .../src/test/kotlin/NodeAdminStateTests.kt | 8 +- .../test/kotlin/NodeDisableInferenceTests.kt | 2 +- .../src/test/kotlin/ParticipantPowerTests.kt | 6 +- testermint/src/test/kotlin/SpecTests.kt | 2 +- testermint/src/test/kotlin/TrainingTests.kt | 18 +- testermint/src/test/kotlin/ValidationTests.kt | 8 +- 134 files changed, 17002 insertions(+), 4405 deletions(-) create mode 100644 .github/workflows/verify-proto-go-generation.yml create mode 100644 inference-chain/api/inference/inference/grace_epoch_params.pulsar.go create mode 100644 inference-chain/api/inference/inference/poc_validation_snapshot.pulsar.go create mode 100644 inference-chain/app/upgrades/v0_2_10/constants.go create mode 100644 inference-chain/app/upgrades/v0_2_10/upgrades.go create mode 100644 inference-chain/app/upgrades/v0_2_10/upgrades_test.go create mode 100644 inference-chain/proto/inference/inference/grace_epoch_params.proto create mode 100644 inference-chain/proto/inference/inference/poc_validation_snapshot.proto create mode 100644 inference-chain/x/inference/calculations/slots.go create mode 100644 inference-chain/x/inference/calculations/slots_test.go create mode 100644 inference-chain/x/inference/keeper/poc_validation_snapshot.go create mode 100644 inference-chain/x/inference/keeper/punishment_grace_epochs.go create mode 100644 inference-chain/x/inference/keeper/punishment_grace_epochs_test.go create mode 100644 inference-chain/x/inference/keeper/query_poc_validation_snapshot.go create mode 100644 inference-chain/x/inference/types/grace_epoch_params.pb.go create mode 100644 inference-chain/x/inference/types/poc_validation_snapshot.pb.go create mode 100644 inference-chain/x/streamvesting/keeper/msg_transfer_with_vesting.go create mode 100644 inference-chain/x/streamvesting/keeper/msg_transfer_with_vesting_test.go create mode 100644 proposals/ethereum-bridge-contact/.env.example create mode 100644 proposals/governance-artifacts/update-v0.2.10/README.md create mode 100644 proposals/poc/optimize.md create mode 100644 proposals/poc/optimize.py create mode 100644 test-net-cloud/nebius/bridge/BRIDGE_TESTNET_GUIDE.md create mode 100644 test-net-cloud/nebius/bridge/bridge-fund-pool.sh create mode 100644 test-net-cloud/nebius/bridge/bridge-register-pool.sh create mode 100644 test-net-cloud/nebius/bridge/bridge-register-wrapped.sh create mode 100644 test-net-cloud/nebius/bridge/bridge-register.sh create mode 100755 test-net-cloud/nebius/bridge/bridge-setup.sh diff --git a/.github/workflows/verify-proto-go-generation.yml b/.github/workflows/verify-proto-go-generation.yml new file mode 100644 index 000000000..a75ab4416 --- /dev/null +++ b/.github/workflows/verify-proto-go-generation.yml @@ -0,0 +1,63 @@ +name: Verify Proto Go Generation + +on: + pull_request: + paths: + - "inference-chain/**/*.proto" + - "inference-chain/**/*.pb.go" + - "inference-chain/**/*.pulsar.go" + +jobs: + verify-proto-go-generation: + name: Verify `ignite generate proto-go` + runs-on: ubuntu-24.04 + permissions: + contents: read + env: + IGNITE_VERSION: "28.10.0" + IGNITE_TARBALL: "ignite_28.10.0_linux_amd64.tar.gz" + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Go + uses: actions/setup-go@v5 + with: + go-version: "1.24.2" + + - name: Install Ignite CLI + run: | + curl -fsSLo "/tmp/${IGNITE_TARBALL}" \ + "https://github.com/ignite/cli/releases/download/v${IGNITE_VERSION}/${IGNITE_TARBALL}" + curl -fsSLo /tmp/ignite_checksums.txt \ + "https://github.com/ignite/cli/releases/download/v${IGNITE_VERSION}/ignite_${IGNITE_VERSION}_checksums.txt" + grep " ${IGNITE_TARBALL}$" /tmp/ignite_checksums.txt | sed "s# ${IGNITE_TARBALL}\$# /tmp/${IGNITE_TARBALL}#" | sha256sum -c - + mkdir -p "$RUNNER_TEMP/bin" + tar -xzf "/tmp/${IGNITE_TARBALL}" -C "$RUNNER_TEMP/bin" ignite + chmod +x "$RUNNER_TEMP/bin/ignite" + echo "$RUNNER_TEMP/bin" >> "$GITHUB_PATH" + "$RUNNER_TEMP/bin/ignite" version + + - name: Run proto-go generation + working-directory: ./inference-chain + env: + CI: "true" + DO_NOT_TRACK: "true" + IGNT_CONFIG_DIR: "${{ runner.temp }}/ignite-config" + run: | + mkdir -p "$IGNT_CONFIG_DIR" + ignite generate proto-go --yes + + - name: Verify no generated changes + run: | + if [[ -n "$(git status --porcelain)" ]]; then + echo "Proto generation produced changes. Please run 'ignite generate proto-go' in inference-chain and commit the result." + echo + git status --short + echo + git diff --stat + exit 1 + fi diff --git a/decentralized-api/Dockerfile b/decentralized-api/Dockerfile index 29a88dc5d..da06e045f 100644 --- a/decentralized-api/Dockerfile +++ b/decentralized-api/Dockerfile @@ -8,6 +8,7 @@ FROM golang:1.24.2-alpine3.20 AS builder ARG BUILD_FLAGS ARG GOOS ARG GOARCH +ARG BLST_PORTABLE=0 ENV GOOS=${GOOS} \ GOARCH=${GOARCH} \ @@ -15,8 +16,10 @@ ENV GOOS=${GOOS} \ GO111MODULE=on \ GOCACHE=/root/.cache/go-build \ GOMODCACHE=/go/pkg/mod \ - CGO_CFLAGS="-I/lib" \ + CGO_CFLAGS="-I/lib -O2" \ + CGO_CFLAGS_ALLOW=".*" \ CGO_LDFLAGS="-L/lib" \ + BLST_PORTABLE=${BLST_PORTABLE} \ # Override the wasmvm library path to use our musl version LD_LIBRARY_PATH=/lib @@ -50,6 +53,7 @@ COPY decentralized-api/. . # ARG LDFLAGS RUN --mount=type=cache,id=go-build-cache3,target=/root/.cache/go-build \ --mount=type=cache,id=go-mod-cache3,target=/go/pkg/mod \ + if [ "$BLST_PORTABLE" = "1" ]; then export CGO_CFLAGS="$CGO_CFLAGS -D__BLST_PORTABLE__"; fi; \ CGO_ENABLED=1 CC=gcc \ go build -mod=readonly -tags muslc -ldflags "$LDFLAGS" \ -o ./build/dapi \ @@ -59,6 +63,7 @@ RUN --mount=type=cache,id=go-build-cache3,target=/root/.cache/go-build \ RUN --mount=type=cache,id=go-build-cache3,target=/root/.cache/go-build \ --mount=type=cache,id=go-mod-cache3,target=/go/pkg/mod \ cd /app/inference-chain && \ + if [ "$BLST_PORTABLE" = "1" ]; then export CGO_CFLAGS="$CGO_CFLAGS -D__BLST_PORTABLE__"; fi; \ CGO_ENABLED=1 CC=gcc \ go build -mod=readonly -tags muslc -ldflags "-X github.com/cosmos/cosmos-sdk/version.Name=inference-chain -X github.com/cosmos/cosmos-sdk/version.AppName=inference-chaind" \ -o ./build/inferenced ./cmd/inferenced/main.go \ diff --git a/decentralized-api/Makefile b/decentralized-api/Makefile index 8fb610d83..c69356241 100644 --- a/decentralized-api/Makefile +++ b/decentralized-api/Makefile @@ -4,6 +4,7 @@ BRANCH := $(shell git rev-parse --abbrev-ref HEAD) COMMIT := $(shell git log -1 --format='%H') VERSION ?= $(shell git describe --always) +BLST_PORTABLE ?= 0 SET_LATEST ?= 0 SET_LATEST := $(shell if [ "$(SET_LATEST)" = "1" ]; then echo 1; else echo 0; fi) @@ -29,6 +30,7 @@ define DOCKER_BUILD --build-arg BUILD_FLAGS="$(BUILD_FLAGS)" \ --build-arg GOOS=$(GOOS) \ --build-arg GOARCH=$(GOARCH) \ + --build-arg BLST_PORTABLE=$(BLST_PORTABLE) \ -f $(DOCKER_FILE) \ .. \ -t $(DOCKER_TAG) @@ -164,4 +166,4 @@ package: build/$$os/$$arch/decentralized-api; \ fi; \ done; \ - done \ No newline at end of file + done diff --git a/decentralized-api/apiconfig/config_manager.go b/decentralized-api/apiconfig/config_manager.go index ea69b33d8..dbc0aee3b 100644 --- a/decentralized-api/apiconfig/config_manager.go +++ b/decentralized-api/apiconfig/config_manager.go @@ -70,17 +70,19 @@ func LoadConfigManagerWithPaths(configPath, sqlitePath, nodeConfigPath string) ( return nil, err } - err = manager.migrateDynamicDataToDb(ctx) + migrated, err := manager.migrateDynamicDataToDb(ctx) if err != nil { log.Printf("Error migrating dynamic data to DB: %+v", err) return nil, err } - if err = manager.Write(); err != nil { - log.Printf("Error writing config: %+v", err) - return nil, err + if migrated { + if err = manager.Write(); err != nil { + log.Printf("Error writing config: %+v", err) + return nil, err + } + logging.Info("Saved static config after initial migration", types.Config) } - log.Printf("Saved static config after load") // Hydrate in-memory dynamic state from DB once if err := manager.HydrateFromDB(context.Background()); err != nil { @@ -635,15 +637,15 @@ func parseInferenceNodesFromNodeConfigJson(nodeConfigPath string) ([]InferenceNo return newNodes, nil } -func (cm *ConfigManager) migrateDynamicDataToDb(ctx context.Context) error { +func (cm *ConfigManager) migrateDynamicDataToDb(ctx context.Context) (bool, error) { if err := cm.ensureDbReady(ctx); err != nil { - return err + return false, err } // Only migrate once, gated by a KV flag var migrated bool if ok, err := KVGetJSON(ctx, cm.sqlDb.GetDb(), kvKeyConfigMigrated, &migrated); err == nil && ok && migrated { logging.Info("Config migration already completed. Skipping", types.Config) - return nil + return false, nil } config := cm.currentConfig // If YAML indicates nodes were already merged historically, persist the flag so LoadNodeConfig skips @@ -653,7 +655,7 @@ func (cm *ConfigManager) migrateDynamicDataToDb(ctx context.Context) error { // Nodes: upsert unconditionally (idempotent) if err := WriteNodes(ctx, cm.sqlDb.GetDb(), config.Nodes); err != nil { logging.Error("Error writing nodes to DB", types.Config, "error", err) - return err + return false, err } // Per-key idempotent migrations: only populate if missing @@ -708,7 +710,7 @@ func (cm *ConfigManager) migrateDynamicDataToDb(ctx context.Context) error { // Mark migration as done _ = KVSetJSON(ctx, cm.sqlDb.GetDb(), kvKeyConfigMigrated, true) - return nil + return true, nil } // HydrateFromDB loads dynamic fields from DB into memory ONCE during startup. diff --git a/decentralized-api/apiconfig/config_manager_migration_test.go b/decentralized-api/apiconfig/config_manager_migration_test.go index d96690cc2..96356ceb4 100644 --- a/decentralized-api/apiconfig/config_manager_migration_test.go +++ b/decentralized-api/apiconfig/config_manager_migration_test.go @@ -247,3 +247,29 @@ nodes: require.Contains(t, ids, "json-node", string(b)) require.NotContains(t, ids, "yaml-node2", string(b)) } + +func TestConfigNotRewrittenOnSecondLoad(t *testing.T) { + tmp := t.TempDir() + yaml := `api: + port: 8080 +chain_node: + url: http://localhost:26657 + signer_key_name: test` + cfgPath := writeTempFile(t, tmp, "config.yaml", yaml) + dbPath := filepath.Join(tmp, "test.db") + + mgr1, err := apiconfig.LoadConfigManagerWithPaths(cfgPath, dbPath, "") + require.NoError(t, err) + require.NoError(t, mgr1.FlushNow(context.Background())) + + stat1, err := os.Stat(cfgPath) + require.NoError(t, err) + + mgr2, err := apiconfig.LoadConfigManagerWithPaths(cfgPath, dbPath, "") + require.NoError(t, err) + require.NoError(t, mgr2.FlushNow(context.Background())) + + stat2, err := os.Stat(cfgPath) + require.NoError(t, err) + require.Equal(t, stat1.ModTime(), stat2.ModTime()) +} diff --git a/decentralized-api/apiconfig/config_test.go b/decentralized-api/apiconfig/config_test.go index e862f9852..f5d48afe1 100644 --- a/decentralized-api/apiconfig/config_test.go +++ b/decentralized-api/apiconfig/config_test.go @@ -2,14 +2,18 @@ package apiconfig_test import ( "bytes" + "context" "decentralized-api/apiconfig" "decentralized-api/logging" + "errors" "os" "path/filepath" "testing" "github.com/knadh/koanf/providers/rawbytes" + "github.com/productscience/inference/x/inference/types" "github.com/stretchr/testify/require" + "google.golang.org/grpc" ) func TestConfigLoad(t *testing.T) { @@ -37,6 +41,159 @@ func TestNodeVersion(t *testing.T) { require.Equal(t, testManager.GetCurrentNodeVersion(), "v3.0.8") } +func TestSetCurrentNodeVersion(t *testing.T) { + testManager := &apiconfig.ConfigManager{ + KoanProvider: rawbytes.Provider([]byte(testYaml)), + WriterProvider: &CaptureWriterProvider{}, + } + err := testManager.Load() + require.NoError(t, err) + + // Initial version from config + require.Equal(t, "v3.0.8", testManager.GetCurrentNodeVersion()) + + // Update version + err = testManager.SetCurrentNodeVersion("v4.0.0") + require.NoError(t, err) + require.Equal(t, "v4.0.0", testManager.GetCurrentNodeVersion()) + + // Update to empty version + err = testManager.SetCurrentNodeVersion("") + require.NoError(t, err) + require.Equal(t, "", testManager.GetCurrentNodeVersion()) +} + +func TestShouldRefreshClients(t *testing.T) { + testManager := &apiconfig.ConfigManager{ + KoanProvider: rawbytes.Provider([]byte(testYaml)), + WriterProvider: &CaptureWriterProvider{}, + } + err := testManager.Load() + require.NoError(t, err) + + // Initially, LastUsedVersion is empty and CurrentNodeVersion is "v3.0.8" + // They differ, so should refresh + require.True(t, testManager.ShouldRefreshClients()) + + // Set LastUsedVersion to match CurrentNodeVersion + err = testManager.SetLastUsedVersion("v3.0.8") + require.NoError(t, err) + require.False(t, testManager.ShouldRefreshClients()) + + // Update CurrentNodeVersion - now they differ again + err = testManager.SetCurrentNodeVersion("v4.0.0") + require.NoError(t, err) + require.True(t, testManager.ShouldRefreshClients()) + + // Sync LastUsedVersion to match + err = testManager.SetLastUsedVersion("v4.0.0") + require.NoError(t, err) + require.False(t, testManager.ShouldRefreshClients()) +} + +func TestVersionUpdateTriggersRefresh(t *testing.T) { + testManager := &apiconfig.ConfigManager{ + KoanProvider: rawbytes.Provider([]byte(testYaml)), + WriterProvider: &CaptureWriterProvider{}, + } + err := testManager.Load() + require.NoError(t, err) + + // Simulate initial sync: set LastUsedVersion to current + err = testManager.SetLastUsedVersion(testManager.GetCurrentNodeVersion()) + require.NoError(t, err) + require.False(t, testManager.ShouldRefreshClients()) + + // Simulate chain version update + newChainVersion := "v5.0.0" + err = testManager.SetCurrentNodeVersion(newChainVersion) + require.NoError(t, err) + + // Now ShouldRefreshClients should return true + require.True(t, testManager.ShouldRefreshClients()) + + // After refreshing clients, update LastUsedVersion + err = testManager.SetLastUsedVersion(newChainVersion) + require.NoError(t, err) + require.False(t, testManager.ShouldRefreshClients()) +} + +type mockCosmosQueryClient struct { + version string + err error +} + +func (m *mockCosmosQueryClient) MLNodeVersion(ctx context.Context, req *types.QueryGetMLNodeVersionRequest, opts ...grpc.CallOption) (*types.QueryGetMLNodeVersionResponse, error) { + if m.err != nil { + return nil, m.err + } + return &types.QueryGetMLNodeVersionResponse{ + MlnodeVersion: types.MLNodeVersion{ + CurrentVersion: m.version, + }, + }, nil +} + +func TestSyncVersionFromChain_UpdatesWhenDifferent(t *testing.T) { + testManager := &apiconfig.ConfigManager{ + KoanProvider: rawbytes.Provider([]byte(testYaml)), + WriterProvider: &CaptureWriterProvider{}, + } + err := testManager.Load() + require.NoError(t, err) + + // Initial version from config + require.Equal(t, "v3.0.8", testManager.GetCurrentNodeVersion()) + + // Sync with chain that has a different version + mockClient := &mockCosmosQueryClient{version: "v4.0.0"} + err = testManager.SyncVersionFromChain(mockClient) + require.NoError(t, err) + + // Version should be updated to chain version + require.Equal(t, "v4.0.0", testManager.GetCurrentNodeVersion()) +} + +func TestSyncVersionFromChain_NoUpdateWhenSame(t *testing.T) { + testManager := &apiconfig.ConfigManager{ + KoanProvider: rawbytes.Provider([]byte(testYaml)), + WriterProvider: &CaptureWriterProvider{}, + } + err := testManager.Load() + require.NoError(t, err) + + // Initial version from config + require.Equal(t, "v3.0.8", testManager.GetCurrentNodeVersion()) + + // Sync with chain that has the same version + mockClient := &mockCosmosQueryClient{version: "v3.0.8"} + err = testManager.SyncVersionFromChain(mockClient) + require.NoError(t, err) + + // Version should remain the same + require.Equal(t, "v3.0.8", testManager.GetCurrentNodeVersion()) +} + +func TestSyncVersionFromChain_ErrorKeepsCurrentVersion(t *testing.T) { + testManager := &apiconfig.ConfigManager{ + KoanProvider: rawbytes.Provider([]byte(testYaml)), + WriterProvider: &CaptureWriterProvider{}, + } + err := testManager.Load() + require.NoError(t, err) + + // Initial version from config + require.Equal(t, "v3.0.8", testManager.GetCurrentNodeVersion()) + + // Sync with chain that returns an error + mockClient := &mockCosmosQueryClient{err: errors.New("chain unavailable")} + err = testManager.SyncVersionFromChain(mockClient) + require.Error(t, err) + + // Version should remain unchanged + require.Equal(t, "v3.0.8", testManager.GetCurrentNodeVersion()) +} + func TestConfigLoadEnvOverride(t *testing.T) { testManager := &apiconfig.ConfigManager{ KoanProvider: rawbytes.Provider([]byte(testYaml)), diff --git a/decentralized-api/broker/broker_test.go b/decentralized-api/broker/broker_test.go index 622750d17..ce7c5092c 100644 --- a/decentralized-api/broker/broker_test.go +++ b/decentralized-api/broker/broker_test.go @@ -224,12 +224,17 @@ func registerNodeAndSetInferenceStatus(t *testing.T, broker *Broker, node apicon queueMessage(t, broker, setStatusCommand) <-setStatusCommand.Response - // Wait for reconciliation to actually bring the node to INFERENCE status in the broker + // Wait until the node is fully stable for inference in broker state. + // CurrentStatus can become INFERENCE before in-flight reconciliation clears, + // and a reconciling node is considered unavailable. deadline := time.Now().Add(2 * time.Second) for time.Now().Before(deadline) { nodes, _ := broker.GetNodes() for _, n := range nodes { - if n.Node.Id == node.Id && n.State.CurrentStatus == types.HardwareNodeStatus_INFERENCE { + if n.Node.Id == node.Id && + n.State.IntendedStatus == types.HardwareNodeStatus_INFERENCE && + n.State.CurrentStatus == types.HardwareNodeStatus_INFERENCE && + n.State.ReconcileInfo == nil { return } } diff --git a/decentralized-api/broker/state_commands.go b/decentralized-api/broker/state_commands.go index 67ba1bcb1..9fbf3e29e 100644 --- a/decentralized-api/broker/state_commands.go +++ b/decentralized-api/broker/state_commands.go @@ -143,23 +143,14 @@ func (c InitValidateCommand) Execute(b *Broker) { return } - // Check validation phase (regular OR confirmation) - shouldValidate := epochState.CurrentPhase == types.PoCValidatePhase || - // FIXME: A bit too wide, it should be PoCGenerateWindDownPhase AND after poc end, - // but we rely on node dispatcher to not send it too early - // if we want to be 100% sure we should check based on block height - // by adding some additional methods for getting block height stage cutoffs for current epoch - epochState.CurrentPhase == types.PoCGenerateWindDownPhase - - // Confirmation PoC validation during inference phase + shouldValidate := epochState.CurrentPhase == types.PoCValidatePhase + if epochState.CurrentPhase == types.PoCGenerateWindDownPhase { + shouldValidate = epochState.CurrentBlock.Height >= epochState.LatestEpoch.EndOfPoCGeneration() + } if epochState.CurrentPhase == types.InferencePhase && epochState.ActiveConfirmationPoCEvent != nil { event := epochState.ActiveConfirmationPoCEvent epochParams := &epochState.LatestEpoch.EpochParams - currentHeight := epochState.CurrentBlock.Height - // Accept at exchange end (transition) OR during validation window - if currentHeight == event.GetExchangeEnd(epochParams) || event.IsInValidationWindow(currentHeight, epochParams) { - shouldValidate = true - } + shouldValidate = event.IsInValidationWindow(epochState.CurrentBlock.Height, epochParams) } if !shouldValidate { diff --git a/decentralized-api/completionapi/request.go b/decentralized-api/completionapi/request.go index f2670c295..c09dde0ca 100644 --- a/decentralized-api/completionapi/request.go +++ b/decentralized-api/completionapi/request.go @@ -2,9 +2,13 @@ package completionapi import ( "encoding/json" + "fmt" "log" "github.com/productscience/inference/x/inference/calculations" + "github.com/productscience/inference/x/inference/types" + + "decentralized-api/logging" ) type ModifiedRequest struct { @@ -38,11 +42,19 @@ func ModifyRequestBody(requestBytes []byte, defaultSeed int32) (*ModifiedRequest requestMap["seed"] = defaultSeed } - if doStream, ok := requestMap["stream"]; ok && doStream.(bool) { - if _, ok := requestMap["stream_options"]; !ok { - requestMap["stream_options"] = map[string]interface{}{"include_usage": true} - } else { - requestMap["stream_options"].(map[string]interface{})["include_usage"] = true + // Use safe type assertion to avoid panic on malformed input + if doStream, ok := requestMap["stream"]; ok { + if doStreamBool, isBool := doStream.(bool); isBool && doStreamBool { + if streamOpts, exists := requestMap["stream_options"]; !exists { + requestMap["stream_options"] = map[string]interface{}{"include_usage": true} + } else if streamOptsMap, isMap := streamOpts.(map[string]interface{}); isMap { + streamOptsMap["include_usage"] = true + } else { + // stream_options exists but is not a map - replace with valid map + logging.Warn("Malformed stream_options field received, replacing with defaults", + types.Inferences, "stream_options_value", fmt.Sprintf("%v", streamOpts)) + requestMap["stream_options"] = map[string]interface{}{"include_usage": true} + } } } diff --git a/decentralized-api/completionapi/request_test.go b/decentralized-api/completionapi/request_test.go index 7abb4389d..c0f5dfc0d 100644 --- a/decentralized-api/completionapi/request_test.go +++ b/decentralized-api/completionapi/request_test.go @@ -2,7 +2,6 @@ package completionapi import ( "encoding/json" - "log" "testing" "github.com/productscience/inference/x/inference/calculations" @@ -83,18 +82,11 @@ const ( }` ) -func Test(t *testing.T) { +func TestModifyRequestBody_NullLogprobsPreserved(t *testing.T) { r, err := ModifyRequestBody([]byte(jsonBodyNullLogprobs), 7) - if err != nil { - panic(err) - } - if r.OriginalLogprobsValue != nil { - t.Fatalf("expected nil, got %v", r.OriginalLogprobsValue) - } - if r.OriginalTopLogprobsValue != nil { - t.Fatalf("expected nil, got %v", r.OriginalTopLogprobsValue) - } - log.Print(string(r.NewBody)) + require.NoError(t, err) + require.Nil(t, r.OriginalLogprobsValue) + require.Nil(t, r.OriginalTopLogprobsValue) } func TestStreamOptions_NoOptions(t *testing.T) { @@ -102,13 +94,10 @@ func TestStreamOptions_NoOptions(t *testing.T) { require.NoError(t, err) require.NotNil(t, r) var requestMap map[string]interface{} - if err := json.Unmarshal(r.NewBody, &requestMap); err != nil { - require.NoError(t, err, "failed to unmarshal request body") - } + require.NoError(t, json.Unmarshal(r.NewBody, &requestMap), "failed to unmarshal request body") require.NotNil(t, requestMap["stream_options"]) require.True(t, requestMap["stream_options"].(map[string]interface{})["include_usage"].(bool), "expected include_usage to be true") - log.Print(string(r.NewBody)) } func TestStreamOptions_WithOptions(t *testing.T) { @@ -116,13 +105,129 @@ func TestStreamOptions_WithOptions(t *testing.T) { require.NoError(t, err) require.NotNil(t, r) var requestMap map[string]interface{} - if err := json.Unmarshal(r.NewBody, &requestMap); err != nil { - require.NoError(t, err, "failed to unmarshal request body") - } + require.NoError(t, json.Unmarshal(r.NewBody, &requestMap), "failed to unmarshal request body") require.NotNil(t, requestMap["stream_options"]) require.True(t, requestMap["stream_options"].(map[string]interface{})["include_usage"].(bool), "expected include_usage to be true") - log.Print(string(r.NewBody)) +} + +// TestStreamOptions_MalformedStreamValue tests that malformed "stream" field doesn't cause panic +func TestStreamOptions_MalformedStreamValue(t *testing.T) { + // Test case 1: stream is a string instead of bool + jsonBodyStreamString := `{ + "model": "test", + "stream": "true", + "messages": [{ "role": "user", "content": "Hi!" }] + }` + r, err := ModifyRequestBody([]byte(jsonBodyStreamString), 7) + require.NoError(t, err, "Should not panic or error on string stream value") + require.NotNil(t, r) + var requestMap map[string]interface{} + require.NoError(t, json.Unmarshal(r.NewBody, &requestMap)) + _, exists := requestMap["stream_options"] + require.False(t, exists, "stream_options should not be added when stream is not a boolean true") + + // Test case 2: stream is a number + jsonBodyStreamNumber := `{ + "model": "test", + "stream": 1, + "messages": [{ "role": "user", "content": "Hi!" }] + }` + r, err = ModifyRequestBody([]byte(jsonBodyStreamNumber), 7) + require.NoError(t, err, "Should not panic or error on number stream value") + require.NotNil(t, r) + requestMap = map[string]interface{}{} + require.NoError(t, json.Unmarshal(r.NewBody, &requestMap)) + _, exists = requestMap["stream_options"] + require.False(t, exists, "stream_options should not be added when stream is not a boolean true") + + // Test case 3: stream is null + jsonBodyStreamNull := `{ + "model": "test", + "stream": null, + "messages": [{ "role": "user", "content": "Hi!" }] + }` + r, err = ModifyRequestBody([]byte(jsonBodyStreamNull), 7) + require.NoError(t, err, "Should not panic or error on null stream value") + require.NotNil(t, r) + requestMap = map[string]interface{}{} + require.NoError(t, json.Unmarshal(r.NewBody, &requestMap)) + _, exists = requestMap["stream_options"] + require.False(t, exists, "stream_options should not be added when stream is not a boolean true") +} + +// TestStreamOptions_MalformedStreamOptions tests that malformed "stream_options" field doesn't cause panic +func TestStreamOptions_MalformedStreamOptions(t *testing.T) { + // Test case 1: stream_options is a string instead of object + jsonBodyStreamOptionsString := `{ + "model": "test", + "stream": true, + "stream_options": "invalid", + "messages": [{ "role": "user", "content": "Hi!" }] + }` + r, err := ModifyRequestBody([]byte(jsonBodyStreamOptionsString), 7) + require.NoError(t, err, "Should not panic or error on string stream_options") + require.NotNil(t, r) + + // Verify that stream_options was replaced with a valid map + var requestMap map[string]interface{} + err = json.Unmarshal(r.NewBody, &requestMap) + require.NoError(t, err) + streamOpts, ok := requestMap["stream_options"].(map[string]interface{}) + require.True(t, ok, "stream_options should be a map after processing") + require.True(t, streamOpts["include_usage"].(bool), "include_usage should be true") + + // Test case 2: stream_options is an array + jsonBodyStreamOptionsArray := `{ + "model": "test", + "stream": true, + "stream_options": [1, 2, 3], + "messages": [{ "role": "user", "content": "Hi!" }] + }` + r, err = ModifyRequestBody([]byte(jsonBodyStreamOptionsArray), 7) + require.NoError(t, err, "Should not panic or error on array stream_options") + require.NotNil(t, r) + requestMap = map[string]interface{}{} + require.NoError(t, json.Unmarshal(r.NewBody, &requestMap)) + streamOpts, ok = requestMap["stream_options"].(map[string]interface{}) + require.True(t, ok, "stream_options should be a map after processing") + require.True(t, streamOpts["include_usage"].(bool), "include_usage should be true") + + // Test case 3: stream_options is a number + jsonBodyStreamOptionsNumber := `{ + "model": "test", + "stream": true, + "stream_options": 123, + "messages": [{ "role": "user", "content": "Hi!" }] + }` + r, err = ModifyRequestBody([]byte(jsonBodyStreamOptionsNumber), 7) + require.NoError(t, err, "Should not panic or error on number stream_options") + require.NotNil(t, r) + requestMap = map[string]interface{}{} + require.NoError(t, json.Unmarshal(r.NewBody, &requestMap)) + streamOpts, ok = requestMap["stream_options"].(map[string]interface{}) + require.True(t, ok, "stream_options should be a map after processing") + require.True(t, streamOpts["include_usage"].(bool), "include_usage should be true") +} + +// TestStreamFalse tests that stream=false doesn't modify stream_options +func TestStreamFalse(t *testing.T) { + jsonBodyStreamFalse := `{ + "model": "test", + "stream": false, + "messages": [{ "role": "user", "content": "Hi!" }] + }` + r, err := ModifyRequestBody([]byte(jsonBodyStreamFalse), 7) + require.NoError(t, err) + require.NotNil(t, r) + + var requestMap map[string]interface{} + err = json.Unmarshal(r.NewBody, &requestMap) + require.NoError(t, err) + + // stream_options should not exist since stream is false + _, exists := requestMap["stream_options"] + require.False(t, exists, "stream_options should not be added when stream is false") } func TestMaxTokens(t *testing.T) { diff --git a/decentralized-api/cosmosclient/tx_manager/tx_manager.go b/decentralized-api/cosmosclient/tx_manager/tx_manager.go index d780d5a84..87aaa8656 100644 --- a/decentralized-api/cosmosclient/tx_manager/tx_manager.go +++ b/decentralized-api/cosmosclient/tx_manager/tx_manager.go @@ -37,6 +37,7 @@ import ( collateraltypes "github.com/productscience/inference/x/collateral/types" "github.com/productscience/inference/x/inference/types" restrictionstypes "github.com/productscience/inference/x/restrictions/types" + streamvestingtypes "github.com/productscience/inference/x/streamvesting/types" ) const ( @@ -110,6 +111,7 @@ func StartTxManager( collateraltypes.RegisterInterfaces(client.Context().InterfaceRegistry) restrictionstypes.RegisterInterfaces(client.Context().InterfaceRegistry) blstypes.RegisterInterfaces(client.Context().InterfaceRegistry) + streamvestingtypes.RegisterInterfaces(client.Context().InterfaceRegistry) m := &manager{ ctx: ctx, diff --git a/decentralized-api/go.mod b/decentralized-api/go.mod index 3844ba2c1..06ea974a9 100644 --- a/decentralized-api/go.mod +++ b/decentralized-api/go.mod @@ -10,7 +10,7 @@ require ( github.com/consensys/gnark-crypto v0.18.0 github.com/cosmos/btcutil v1.0.5 github.com/cosmos/cosmos-sdk v0.53.3 - github.com/cosmos/ibc-go/v8 v8.4.0 + github.com/cosmos/ibc-go/v8 v8.7.0 github.com/decred/dcrd/dcrec/secp256k1/v4 v4.4.0 github.com/golang/protobuf v1.5.4 github.com/google/uuid v1.6.0 @@ -50,7 +50,7 @@ require ( cloud.google.com/go/monitoring v1.21.2 // indirect cloud.google.com/go/storage v1.49.0 // indirect cosmossdk.io/api v0.9.2 // indirect - cosmossdk.io/client/v2 v2.0.0-beta.1 // indirect + cosmossdk.io/client/v2 v2.0.0-beta.3 // indirect cosmossdk.io/collections v1.2.1 // indirect cosmossdk.io/core v0.11.3 // indirect cosmossdk.io/depinject v1.2.1 // indirect diff --git a/decentralized-api/go.sum b/decentralized-api/go.sum index ae70b82a5..56605aefc 100644 --- a/decentralized-api/go.sum +++ b/decentralized-api/go.sum @@ -198,8 +198,8 @@ cloud.google.com/go/workflows v1.6.0/go.mod h1:6t9F5h/unJz41YqfBmqSASJSXccBLtD1V cloud.google.com/go/workflows v1.7.0/go.mod h1:JhSrZuVZWuiDfKEFxU0/F1PQjmpnpcoISEXH2bcHC3M= cosmossdk.io/api v0.9.2 h1:9i9ptOBdmoIEVEVWLtYYHjxZonlF/aOVODLFaxpmNtg= cosmossdk.io/api v0.9.2/go.mod h1:CWt31nVohvoPMTlPv+mMNCtC0a7BqRdESjCsstHcTkU= -cosmossdk.io/client/v2 v2.0.0-beta.1 h1:XkHh1lhrLYIT9zKl7cIOXUXg2hdhtjTPBUfqERNA1/Q= -cosmossdk.io/client/v2 v2.0.0-beta.1/go.mod h1:JEUSu9moNZQ4kU3ir1DKD5eU4bllmAexrGWjmb9k8qU= +cosmossdk.io/client/v2 v2.0.0-beta.3 h1:+TTuH0DwQYsUq2JFAl3fDZzKq5gQG7nt3dAattkjFDU= +cosmossdk.io/client/v2 v2.0.0-beta.3/go.mod h1:CZcL41HpJPOOayTCO28j8weNBQprG+SRiKX39votypo= cosmossdk.io/collections v1.2.1 h1:mAlNMs5vJwkda4TA+k5q/43p24RVAQ/qyDrjANu3BXE= cosmossdk.io/collections v1.2.1/go.mod h1:PSsEJ/fqny0VPsHLFT6gXDj/2C1tBOTS9eByK0+PBFU= cosmossdk.io/core v0.11.3 h1:mei+MVDJOwIjIniaKelE3jPDqShCc/F4LkNNHh+4yfo= @@ -410,8 +410,8 @@ github.com/cosmos/iavl v1.2.4 h1:IHUrG8dkyueKEY72y92jajrizbkZKPZbMmG14QzsEkw= github.com/cosmos/iavl v1.2.4/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= -github.com/cosmos/ibc-go/v8 v8.4.0 h1:K2PfX0AZ+1XKZytHGEMuSjQXG/MZshPb83RSTQt2+cE= -github.com/cosmos/ibc-go/v8 v8.4.0/go.mod h1:zh6x1osR0hNvEcFrC/lhGD08sMfQmr9wHVvZ/mRWMCs= +github.com/cosmos/ibc-go/v8 v8.7.0 h1:HqhVOkO8bDpClXE81DFQgFjroQcTvtpm0tCS7SQVKVY= +github.com/cosmos/ibc-go/v8 v8.7.0/go.mod h1:G2z+Q6ZQSMcyHI2+BVcJdvfOupb09M2h/tgpXOEdY6k= github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= diff --git a/decentralized-api/internal/server/public/post_chat_handler.go b/decentralized-api/internal/server/public/post_chat_handler.go index c2de70a4a..638ce91d8 100644 --- a/decentralized-api/internal/server/public/post_chat_handler.go +++ b/decentralized-api/internal/server/public/post_chat_handler.go @@ -37,6 +37,10 @@ const ( ExecutorContext AuthKeyContext = 2 // BothContexts indicates the AuthKey was used for both transfer and executor requests BothContexts = TransferContext | ExecutorContext + + // MaxRequestBodySize is the maximum allowed size for request bodies (10 MB) + // This prevents memory exhaustion attacks from oversized requests + MaxRequestBodySize = 10 * 1024 * 1024 ) // Package-level variables for AuthKey reuse prevention @@ -57,8 +61,9 @@ var ( configManagerRef *apiconfig.ConfigManager ) -func NewNoRedirectClient() *http.Client { +func NewNoRedirectClient(timeout time.Duration) *http.Client { return &http.Client{ + Timeout: timeout, CheckRedirect: func(req *http.Request, via []*http.Request) error { return http.ErrUseLastResponse }, @@ -207,7 +212,7 @@ func cleanupExpiredAuthKeys(currentBlockHeight int64) { func (s *Server) postChat(ctx echo.Context) error { logging.Debug("PostChat. Received request", types.Inferences, "path", ctx.Request().URL.Path) - chatRequest, err := readRequest(ctx.Request(), s.recorder.GetAccountAddress()) + chatRequest, err := readRequest(ctx.Request(), ctx.Response().Writer, s.recorder.GetAccountAddress()) if err != nil { return err } @@ -397,7 +402,7 @@ func (s *Server) handleTransferRequest(ctx echo.Context, request *ChatRequest) e req.Header.Set(utils.XPromptHashHeader, inferenceRequest.PromptHash) req.Header.Set("Content-Type", request.Request.Header.Get("Content-Type")) - resp, err := NewNoRedirectClient().Do(req) + resp, err := s.httpClient.Do(req) if err != nil { logging.Error("Failed to make http request to executor", types.Inferences, "error", err, "url", executor.Url) return err @@ -469,7 +474,7 @@ func (s *Server) getPromptTokenCount(text string, model string) (int, error) { return nil, broker.NewApplicationActionError(err) } - resp, postErr := http.Post( + resp, postErr := s.httpClient.Post( tokenizeUrl, "application/json", bytes.NewReader(jsonData), @@ -551,7 +556,7 @@ func (s *Server) handleExecutorRequest(ctx echo.Context, request *ChatRequest, w if err != nil { return nil, broker.NewApplicationActionError(err) } - resp, postErr := http.Post( + resp, postErr := s.httpClient.Post( completionsUrl, request.Request.Header.Get("Content-Type"), bytes.NewReader(modifiedRequestBody.NewBody), @@ -922,8 +927,8 @@ func getInferenceErrorMessage(resp *http.Response) string { } } -func readRequest(request *http.Request, transferAddress string) (*ChatRequest, error) { - body, err := readRequestBody(request) +func readRequest(request *http.Request, writer http.ResponseWriter, transferAddress string) (*ChatRequest, error) { + body, err := readRequestBody(request, writer) if err != nil { logging.Error("Unable to read request body", types.Server, "error", err) return nil, err @@ -958,12 +963,15 @@ func readRequest(request *http.Request, transferAddress string) (*ChatRequest, e }, nil } -func readRequestBody(r *http.Request) ([]byte, error) { +func readRequestBody(r *http.Request, writer http.ResponseWriter) ([]byte, error) { + // Limit request body size to prevent memory exhaustion attacks + r.Body = http.MaxBytesReader(writer, r.Body, MaxRequestBodySize) + defer r.Body.Close() + var buf bytes.Buffer if _, err := io.Copy(&buf, r.Body); err != nil { return nil, err } - defer r.Body.Close() return buf.Bytes(), nil } diff --git a/decentralized-api/internal/server/public/post_chat_handler_test.go b/decentralized-api/internal/server/public/post_chat_handler_test.go index cc8dbf174..8f89457ee 100644 --- a/decentralized-api/internal/server/public/post_chat_handler_test.go +++ b/decentralized-api/internal/server/public/post_chat_handler_test.go @@ -1,8 +1,11 @@ package public import ( + "bytes" "context" "encoding/json" + "io" + "net/http" "testing" "decentralized-api/chainphase" @@ -12,6 +15,12 @@ import ( "github.com/stretchr/testify/require" ) +// createTestRequest creates a test HTTP request with the given body +func createTestRequest(body []byte) *http.Request { + req, _ := http.NewRequest(http.MethodPost, "/v1/chat/completions", io.NopCloser(bytes.NewReader(body))) + return req +} + type mockPayloadStorage struct { stored map[string]struct{ prompt, response []byte } storeErr error @@ -164,3 +173,57 @@ func TestEmptyButParseableResponsePayload_EnforcedTokensEmptySlice(t *testing.T) // With our synthetic logprobs, enforced tokens should be present and parseable. require.NotEmpty(t, enforcedTokens.Tokens) } + +// TestReadRequestBody_NormalSize tests that normal-sized requests are read successfully +func TestReadRequestBody_NormalSize(t *testing.T) { + body := []byte(`{"model": "test", "messages": [{"role": "user", "content": "Hello"}]}`) + req := createTestRequest(body) + + result, err := readRequestBody(req, nil) + require.NoError(t, err) + require.Equal(t, body, result) +} + +// TestReadRequestBody_ExceedsMaxSize tests that oversized requests are rejected +func TestReadRequestBody_ExceedsMaxSize(t *testing.T) { + // Create a body larger than MaxRequestBodySize (10 MB) + oversizedBody := make([]byte, MaxRequestBodySize+1) + for i := range oversizedBody { + oversizedBody[i] = 'a' + } + req := createTestRequest(oversizedBody) + + _, err := readRequestBody(req, nil) + require.Error(t, err) + // http.MaxBytesReader returns an error when limit is exceeded +} + +// TestReadRequestBody_ExactlyMaxSize tests that requests at exactly max size work +func TestReadRequestBody_ExactlyMaxSize(t *testing.T) { + // Create a body exactly at MaxRequestBodySize + exactBody := make([]byte, MaxRequestBodySize) + for i := range exactBody { + exactBody[i] = 'b' + } + req := createTestRequest(exactBody) + + result, err := readRequestBody(req, nil) + require.NoError(t, err) + require.Len(t, result, MaxRequestBodySize) +} + +// TestReadRequestBody_EmptyBody tests that empty bodies work +func TestReadRequestBody_EmptyBody(t *testing.T) { + req := createTestRequest([]byte{}) + + result, err := readRequestBody(req, nil) + require.NoError(t, err) + require.Empty(t, result) +} + +// TestMaxRequestBodySizeConstant verifies the constant is set to expected value +func TestMaxRequestBodySizeConstant(t *testing.T) { + // MaxRequestBodySize should be 10 MB + expectedSize := 10 * 1024 * 1024 + require.Equal(t, expectedSize, MaxRequestBodySize, "MaxRequestBodySize should be 10 MB") +} diff --git a/decentralized-api/internal/server/public/server.go b/decentralized-api/internal/server/public/server.go index 6eb71c797..108ad7cc3 100644 --- a/decentralized-api/internal/server/public/server.go +++ b/decentralized-api/internal/server/public/server.go @@ -18,6 +18,8 @@ import ( echomw "github.com/labstack/echo/v4/middleware" ) +const httpClientTimeout = 5 * time.Minute + type Server struct { e *echo.Echo nodeBroker *broker.Broker @@ -32,6 +34,7 @@ type Server struct { epochGroupDataCache *internal.EpochGroupDataCache artifactStore *artifacts.ManagedArtifactStore authzCache *authzcache.AuthzCache + httpClient *http.Client } // ServerOption configures optional Server dependencies. @@ -71,6 +74,7 @@ func NewServer( phaseTracker: phaseTracker, epochGroupDataCache: internal.NewEpochGroupDataCache(recorder), authzCache: authzcache.NewAuthzCache(recorder), + httpClient: NewNoRedirectClient(httpClientTimeout), } for _, opt := range opts { diff --git a/decentralized-api/internal/server/public/ssrf_test.go b/decentralized-api/internal/server/public/ssrf_test.go index 80ba6a254..d56c98c20 100644 --- a/decentralized-api/internal/server/public/ssrf_test.go +++ b/decentralized-api/internal/server/public/ssrf_test.go @@ -50,7 +50,7 @@ func TestNoRedirectClient(t *testing.T) { req.Header.Set(utils.AuthorizationHeader, "Bearer key") req.Header.Set("Content-Type", "application/json") - resp, err := NewNoRedirectClient().Do(req) + resp, err := NewNoRedirectClient(0).Do(req) if err != nil { t.Fatal(err) } diff --git a/decentralized-api/main.go b/decentralized-api/main.go index 66586f132..8df78ef33 100644 --- a/decentralized-api/main.go +++ b/decentralized-api/main.go @@ -129,6 +129,7 @@ func main() { // Create v2 orchestrator for artifact-based PoC pocOrchestrator := poc.NewOrchestrator( participantInfo.GetPubKey(), + participantInfo.GetAddress(), nodeBroker, config.GetApiConfig().PoCCallbackUrl, config.GetChainNodeConfig().Url, diff --git a/decentralized-api/poc/artifacts/store.go b/decentralized-api/poc/artifacts/store.go index d54fda99d..8b8312829 100644 --- a/decentralized-api/poc/artifacts/store.go +++ b/decentralized-api/poc/artifacts/store.go @@ -189,6 +189,8 @@ func (s *ArtifactStore) Add(nonce int32, vector []byte) error { // AddWithNode appends an artifact and tracks which node contributed it. func (s *ArtifactStore) AddWithNode(nonce int32, vector []byte, nodeId string) error { + leafHash := hashLeaf(encodeLeaf(nonce, vector)) + s.mu.Lock() defer s.mu.Unlock() @@ -204,16 +206,9 @@ func (s *ArtifactStore) AddWithNode(nonce int32, vector []byte, nodeId string) e return ErrDuplicateNonce } - for _, b := range s.buffer { - if b.nonce == nonce { - return ErrDuplicateNonce - } - } - s.nonceToLeafIndex[nonce] = s.nextLeafIndex s.buffer = append(s.buffer, bufferedArtifact{nonce: nonce, vector: vector, nodeId: nodeId}) - leafHash := hashLeaf(encodeLeaf(nonce, vector)) appendToMMR(&s.mmrNodes, leafHash, s.nextLeafIndex) s.nextLeafIndex++ diff --git a/decentralized-api/poc/commit_worker_test.go b/decentralized-api/poc/commit_worker_test.go index 3db98aaf6..4b33b9b7a 100644 --- a/decentralized-api/poc/commit_worker_test.go +++ b/decentralized-api/poc/commit_worker_test.go @@ -65,20 +65,22 @@ func TestCommitWorker_ShouldAcceptStoreCommit_RegularPoC(t *testing.T) { func TestCommitWorker_ShouldHaveDistributedWeights(t *testing.T) { tests := []struct { - name string - phase types.EpochPhase - expect bool + name string + phase types.EpochPhase + blockHeight int64 + expect bool }{ - {"validate phase", types.PoCValidatePhase, true}, - {"validate wind down", types.PoCValidateWindDownPhase, true}, - {"generate wind down", types.PoCGenerateWindDownPhase, true}, - {"generate phase", types.PoCGeneratePhase, false}, - {"inference phase", types.InferencePhase, false}, + {"validate phase", types.PoCValidatePhase, 300, true}, + {"validate wind down", types.PoCValidateWindDownPhase, 350, true}, + {"wind down after generation end", types.PoCGenerateWindDownPhase, 210, true}, + {"wind down before generation end", types.PoCGenerateWindDownPhase, 180, false}, + {"generate phase", types.PoCGeneratePhase, 120, false}, + {"inference phase", types.InferencePhase, 500, false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - epochState := createCommitWorkerTestEpochState(tt.phase, 100, 50) + epochState := createCommitWorkerTestEpochState(tt.phase, tt.blockHeight, 100) result := ShouldHaveDistributedWeights(epochState) assert.Equal(t, tt.expect, result) }) diff --git a/decentralized-api/poc/orchestrator.go b/decentralized-api/poc/orchestrator.go index e1a2ccfae..abbae1422 100644 --- a/decentralized-api/poc/orchestrator.go +++ b/decentralized-api/poc/orchestrator.go @@ -21,6 +21,7 @@ type orchestratorImpl struct { func NewOrchestrator( pubKey string, + validatorAddress string, nodeBroker *broker.Broker, callbackUrl string, chainNodeUrl string, @@ -35,6 +36,7 @@ func NewOrchestrator( phaseTracker, callbackUrl, pubKey, + validatorAddress, chainNodeUrl, config, ) @@ -45,6 +47,7 @@ func NewOrchestrator( phaseTracker, callbackUrl, pubKey, + validatorAddress, chainNodeUrl, config, ) diff --git a/decentralized-api/poc/phase.go b/decentralized-api/poc/phase.go index 957367345..dd99e2252 100644 --- a/decentralized-api/poc/phase.go +++ b/decentralized-api/poc/phase.go @@ -6,21 +6,22 @@ import ( "github.com/productscience/inference/x/inference/types" ) -// ShouldAcceptGeneratedArtifacts returns true if the system should accept -// incoming artifact batches from MLNodes. func ShouldAcceptGeneratedArtifacts(epochState *chainphase.EpochState) bool { if epochState.IsNilOrNotSynced() { return false } - // Regular PoC generation if epochState.CurrentPhase == types.PoCGeneratePhase { return true } - // Confirmation PoC generation during inference phase + if epochState.CurrentPhase == types.PoCGenerateWindDownPhase { + return epochState.LatestEpoch.IsPoCExchangeWindow(epochState.CurrentBlock.Height) + } if epochState.CurrentPhase == types.InferencePhase && epochState.ActiveConfirmationPoCEvent != nil && epochState.ActiveConfirmationPoCEvent.Phase == types.ConfirmationPoCPhase_CONFIRMATION_POC_GENERATION { - return true + event := epochState.ActiveConfirmationPoCEvent + epochParams := &epochState.LatestEpoch.EpochParams + return event.IsInBatchSubmissionWindow(epochState.CurrentBlock.Height, epochParams) } return false } @@ -93,26 +94,21 @@ func ShouldAcceptStoreCommit(epochState *chainphase.EpochState, pocStageStartHei return epochState.LatestEpoch.IsPoCExchangeWindow(currentHeight) } -// ShouldHaveDistributedWeights returns true if weights should have been distributed. -// True during Validation phase or WindDown phase. func ShouldHaveDistributedWeights(epochState *chainphase.EpochState) bool { if epochState.IsNilOrNotSynced() { return false } - - // Regular PoC: Validation or WindDown phases if epochState.CurrentPhase == types.PoCValidatePhase || - epochState.CurrentPhase == types.PoCValidateWindDownPhase || - epochState.CurrentPhase == types.PoCGenerateWindDownPhase { + epochState.CurrentPhase == types.PoCValidateWindDownPhase { return true } - - // Confirmation PoC: Validation phase + if epochState.CurrentPhase == types.PoCGenerateWindDownPhase { + return epochState.CurrentBlock.Height >= epochState.LatestEpoch.EndOfPoCGeneration() + } if epochState.CurrentPhase == types.InferencePhase && epochState.ActiveConfirmationPoCEvent != nil && epochState.ActiveConfirmationPoCEvent.Phase == types.ConfirmationPoCPhase_CONFIRMATION_POC_VALIDATION { return true } - return false } diff --git a/decentralized-api/poc/phase_test.go b/decentralized-api/poc/phase_test.go index a37c1dd0a..130e14001 100644 --- a/decentralized-api/poc/phase_test.go +++ b/decentralized-api/poc/phase_test.go @@ -38,20 +38,22 @@ func createTestEpochState(phase types.EpochPhase, blockHeight, pocStartHeight in func TestShouldAcceptGeneratedArtifacts_RegularPoC(t *testing.T) { tests := []struct { - name string - phase types.EpochPhase - expect bool + name string + phase types.EpochPhase + blockHeight int64 + expect bool }{ - {"generate phase accepts", types.PoCGeneratePhase, true}, - {"generate wind down rejects", types.PoCGenerateWindDownPhase, false}, - {"validate phase rejects", types.PoCValidatePhase, false}, - {"validate wind down rejects", types.PoCValidateWindDownPhase, false}, - {"inference phase rejects", types.InferencePhase, false}, + {"generate phase accepts", types.PoCGeneratePhase, 110, true}, + {"wind down accepts in exchange window", types.PoCGenerateWindDownPhase, 190, true}, + {"wind down rejects after exchange window", types.PoCGenerateWindDownPhase, 260, false}, + {"validate phase rejects", types.PoCValidatePhase, 300, false}, + {"validate wind down rejects", types.PoCValidateWindDownPhase, 350, false}, + {"inference phase rejects", types.InferencePhase, 500, false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - epochState := createTestEpochState(tt.phase, 110, 100) + epochState := createTestEpochState(tt.phase, tt.blockHeight, 100) result := ShouldAcceptGeneratedArtifacts(epochState) assert.Equal(t, tt.expect, result) }) @@ -60,22 +62,26 @@ func TestShouldAcceptGeneratedArtifacts_RegularPoC(t *testing.T) { func TestShouldAcceptGeneratedArtifacts_ConfirmationPoC(t *testing.T) { tests := []struct { - name string - eventPhase types.ConfirmationPoCPhase - expect bool + name string + eventPhase types.ConfirmationPoCPhase + blockHeight int64 + genStart int64 + expect bool }{ - {"confirmation generation accepts", types.ConfirmationPoCPhase_CONFIRMATION_POC_GENERATION, true}, - {"confirmation validation rejects", types.ConfirmationPoCPhase_CONFIRMATION_POC_VALIDATION, false}, - {"confirmation grace period rejects", types.ConfirmationPoCPhase_CONFIRMATION_POC_GRACE_PERIOD, false}, - {"confirmation completed rejects", types.ConfirmationPoCPhase_CONFIRMATION_POC_COMPLETED, false}, + {"generation accepts in window", types.ConfirmationPoCPhase_CONFIRMATION_POC_GENERATION, 500, 450, true}, + {"generation rejects after window", types.ConfirmationPoCPhase_CONFIRMATION_POC_GENERATION, 700, 450, false}, + {"validation rejects", types.ConfirmationPoCPhase_CONFIRMATION_POC_VALIDATION, 600, 450, false}, + {"grace period rejects", types.ConfirmationPoCPhase_CONFIRMATION_POC_GRACE_PERIOD, 440, 450, false}, + {"completed rejects", types.ConfirmationPoCPhase_CONFIRMATION_POC_COMPLETED, 800, 450, false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - epochState := createTestEpochState(types.InferencePhase, 500, 100) + epochState := createTestEpochState(types.InferencePhase, tt.blockHeight, 100) epochState.ActiveConfirmationPoCEvent = &types.ConfirmationPoCEvent{ - TriggerHeight: 450, - Phase: tt.eventPhase, + TriggerHeight: tt.genStart - 10, + GenerationStartHeight: tt.genStart, + Phase: tt.eventPhase, } result := ShouldAcceptGeneratedArtifacts(epochState) assert.Equal(t, tt.expect, result) @@ -261,20 +267,22 @@ func TestShouldAcceptStoreCommit_NilOrNotSynced(t *testing.T) { func TestShouldHaveDistributedWeights_AllPhases(t *testing.T) { tests := []struct { - name string - phase types.EpochPhase - expect bool + name string + phase types.EpochPhase + blockHeight int64 + expect bool }{ - {"validate phase", types.PoCValidatePhase, true}, - {"validate wind down", types.PoCValidateWindDownPhase, true}, - {"generate wind down", types.PoCGenerateWindDownPhase, true}, - {"generate phase", types.PoCGeneratePhase, false}, - {"inference phase", types.InferencePhase, false}, + {"validate phase", types.PoCValidatePhase, 300, true}, + {"validate wind down", types.PoCValidateWindDownPhase, 350, true}, + {"wind down after generation end", types.PoCGenerateWindDownPhase, 210, true}, + {"wind down before generation end", types.PoCGenerateWindDownPhase, 180, false}, + {"generate phase", types.PoCGeneratePhase, 120, false}, + {"inference phase", types.InferencePhase, 500, false}, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { - epochState := createTestEpochState(tt.phase, 100, 50) + epochState := createTestEpochState(tt.phase, tt.blockHeight, 100) result := ShouldHaveDistributedWeights(epochState) assert.Equal(t, tt.expect, result) }) diff --git a/decentralized-api/poc/proof_client.go b/decentralized-api/poc/proof_client.go index 60d4e8335..d3a773774 100644 --- a/decentralized-api/poc/proof_client.go +++ b/decentralized-api/poc/proof_client.go @@ -28,6 +28,7 @@ var ( ErrProofVerificationFailed = errors.New("proof verification failed") ErrDuplicateNonces = errors.New("duplicate nonces detected") ErrIncompleteCoverage = errors.New("response does not cover all requested leaf indices") + ErrInvalidVectorData = errors.New("invalid vector data detected") ) // ProofClient fetches and verifies MMR proofs from participant APIs. @@ -182,6 +183,13 @@ func (c *ProofClient) FetchAndVerifyProofs( return nil, fmt.Errorf("invalid vector_bytes encoding for leaf %d: %w", item.LeafIndex, err) } + // Validate FP16 vector content - reject NaN/Infinity + if err := ValidateFP16Vector(vectorBytes); err != nil { + logging.Warn("Invalid FP16 vector data", types.PoC, + "participant", req.ParticipantAddress, "leafIndex", item.LeafIndex, "error", err) + return nil, fmt.Errorf("%w: leaf %d: %v", ErrInvalidVectorData, item.LeafIndex, err) + } + // Decode proof hashes proofHashes := make([][]byte, len(item.Proof)) for i, hashB64 := range item.Proof { @@ -298,3 +306,26 @@ func buildLeafData(nonce int32, vector []byte) []byte { copy(buf[4:], vector) return buf } + +// ValidateFP16Vector checks that all FP16 values in the vector are valid finite numbers. +// Returns error if any value is NaN, Infinity, or other invalid representation. +func ValidateFP16Vector(vectorBytes []byte) error { + if len(vectorBytes)%2 != 0 { + return fmt.Errorf("invalid vector length: %d bytes (must be even)", len(vectorBytes)) + } + + for i := 0; i < len(vectorBytes); i += 2 { + h := binary.LittleEndian.Uint16(vectorBytes[i : i+2]) + exp := (h >> 10) & 0x1f + + // Exponent 31 = special values (NaN or Infinity) + if exp == 31 { + frac := h & 0x3ff + if frac != 0 { + return fmt.Errorf("NaN detected at byte offset %d (value 0x%04x)", i, h) + } + return fmt.Errorf("Infinity detected at byte offset %d (value 0x%04x)", i, h) + } + } + return nil +} diff --git a/decentralized-api/poc/proof_client_test.go b/decentralized-api/poc/proof_client_test.go index 5c9aed07c..eb902d8f8 100644 --- a/decentralized-api/poc/proof_client_test.go +++ b/decentralized-api/poc/proof_client_test.go @@ -1,10 +1,16 @@ package poc import ( + "encoding/base64" + "encoding/json" "errors" + "fmt" + "net/http" + "net/http/httptest" "testing" "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" ) func TestValidateLeafCoverage_ExactMatch(t *testing.T) { @@ -131,3 +137,226 @@ func TestCheckDuplicateNonces_NegativeDuplicates(t *testing.T) { } assert.True(t, errors.Is(CheckDuplicateNonces(artifacts), ErrDuplicateNonces)) } + +func TestValidateFP16Vector_ValidVector(t *testing.T) { + // Construct valid FP16 values (no NaN/Infinity) + // Using values extracted from real vectors, excluding the NaN bytes + validBytes := []byte{0x26, 0x3b, 0x7f, 0x39, 0x66, 0x3a} // 3 valid FP16 values + assert.NoError(t, ValidateFP16Vector(validBytes)) +} + +func TestValidateFP16Vector_RealVectorsWithNaN(t *testing.T) { + // Real examples from exploit data - all contain NaN at 0x7e00 + testCases := []struct { + name string + nanPos int // position of NaN in the 12-element vector + b64 string + }{ + {"NaN at position 1", 1, "JjsAfn85Zjp/NUgzrzNgOdYliTiIO7g4"}, + {"NaN at position 2", 2, "NTsbOgB+1jbXOrEjsDm5OOA16DkXOg05"}, + {"NaN at last position (11)", 11, "UzCFOaA70zebNWAm9zlEODg3LjIcOAB+"}, + {"NaN at first position (0)", 0, "AH64L7g5JiraLKE1vju9ONctZTWSNQg0"}, + {"NaN at position 6", 6, "iDpIMGo5rDoiNkc5AH4vOogtSDgROa0w"}, + {"NaN at position 0 - participant 2", 0, "AH44OHY03TR5O345DDTnNB05jjqNOnw7"}, + {"NaN at position 10", 10, "Kib/OfcsgjsNMQY7+zufHyE6mTcAfoc2"}, + {"NaN at position 8", 8, "XjbAOZU6ADfdNek4Jzr/NQB+iDsAOHI6"}, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + vectorBytes, err := base64.StdEncoding.DecodeString(tc.b64) + require.NoError(t, err) + + err = ValidateFP16Vector(vectorBytes) + assert.Error(t, err) + assert.Contains(t, err.Error(), "NaN") + // Verify error reports correct byte offset + expectedOffset := tc.nanPos * 2 + assert.Contains(t, err.Error(), fmt.Sprintf("byte offset %d", expectedOffset)) + }) + } +} + +func TestValidateFP16Vector_WithPositiveInfinity(t *testing.T) { + // 0x7c00 = +Infinity (exp=31, frac=0) + infBytes := []byte{0x00, 0x7c} + err := ValidateFP16Vector(infBytes) + assert.Error(t, err) + assert.Contains(t, err.Error(), "Infinity") +} + +func TestValidateFP16Vector_WithNegativeInfinity(t *testing.T) { + // 0xfc00 = -Infinity (exp=31, frac=0, sign=1) + negInfBytes := []byte{0x00, 0xfc} + err := ValidateFP16Vector(negInfBytes) + assert.Error(t, err) + assert.Contains(t, err.Error(), "Infinity") +} + +func TestValidateFP16Vector_OddLength(t *testing.T) { + // Odd byte count is invalid for FP16 vector + oddBytes := []byte{0x00, 0x3c, 0x00} + err := ValidateFP16Vector(oddBytes) + assert.Error(t, err) + assert.Contains(t, err.Error(), "must be even") +} + +func TestValidateFP16Vector_Empty(t *testing.T) { + assert.NoError(t, ValidateFP16Vector(nil)) + assert.NoError(t, ValidateFP16Vector([]byte{})) +} + +func TestValidateFP16Vector_QuietNaN(t *testing.T) { + // 0x7e00 = quiet NaN (exp=31, frac=512) - the exact value found in all_nonces.json + qnanBytes := []byte{0x00, 0x7e} + err := ValidateFP16Vector(qnanBytes) + assert.Error(t, err) + assert.Contains(t, err.Error(), "NaN") + assert.Contains(t, err.Error(), "0x7e00") +} + +func TestValidateFP16Vector_SignalingNaN(t *testing.T) { + // 0x7c01 = signaling NaN (exp=31, frac=1) + snanBytes := []byte{0x01, 0x7c} + err := ValidateFP16Vector(snanBytes) + assert.Error(t, err) + assert.Contains(t, err.Error(), "NaN") +} + +func TestValidateFP16Vector_NegativeNaN(t *testing.T) { + // 0xfe00 = negative quiet NaN (sign=1, exp=31, frac=512) + negNanBytes := []byte{0x00, 0xfe} + err := ValidateFP16Vector(negNanBytes) + assert.Error(t, err) + assert.Contains(t, err.Error(), "NaN") +} + +func TestValidateFP16Vector_ValidWithSubnormals(t *testing.T) { + // Subnormal values (exp=0, frac!=0) should be allowed - they are valid small numbers + // 0x0001 = smallest positive subnormal + subnormalBytes := []byte{0x01, 0x00, 0xff, 0x03} // two subnormals + assert.NoError(t, ValidateFP16Vector(subnormalBytes)) +} + +func TestValidateFP16Vector_ValidZero(t *testing.T) { + // 0x0000 = +0, 0x8000 = -0 - both are valid + zeroBytes := []byte{0x00, 0x00, 0x00, 0x80} + assert.NoError(t, ValidateFP16Vector(zeroBytes)) +} + +// TestErrInvalidVectorData_ErrorWrapping verifies that ErrInvalidVectorData is properly +// wrapped and can be detected with errors.Is, which is how validateParticipant classifies +// permanent failures. +func TestErrInvalidVectorData_ErrorWrapping(t *testing.T) { + // Simulate what FetchAndVerifyProofs does when it detects invalid vector data + leafIndex := uint32(42) + validationErr := ValidateFP16Vector([]byte{0x00, 0x7e}) // NaN + wrappedErr := fmt.Errorf("%w: leaf %d: %v", ErrInvalidVectorData, leafIndex, validationErr) + + // This is exactly how validateParticipant checks for permanent failures + assert.True(t, errors.Is(wrappedErr, ErrInvalidVectorData), + "wrapped error should be detectable with errors.Is") + + // Verify the error message contains useful information + assert.Contains(t, wrappedErr.Error(), "invalid vector data detected") + assert.Contains(t, wrappedErr.Error(), "leaf 42") + assert.Contains(t, wrappedErr.Error(), "NaN") +} + +// TestPermanentFailureErrors verifies all permanent failure error types can be +// properly detected with errors.Is after wrapping. +func TestPermanentFailureErrors(t *testing.T) { + testCases := []struct { + name string + baseErr error + wrapMessage string + }{ + { + name: "ErrProofVerificationFailed", + baseErr: ErrProofVerificationFailed, + wrapMessage: "leaf 1", + }, + { + name: "ErrIncompleteCoverage", + baseErr: ErrIncompleteCoverage, + wrapMessage: "expected 10 proofs, got 5", + }, + { + name: "ErrInvalidVectorData", + baseErr: ErrInvalidVectorData, + wrapMessage: "leaf 42: NaN detected", + }, + { + name: "ErrDuplicateNonces", + baseErr: ErrDuplicateNonces, + wrapMessage: "participant xyz", + }, + } + + for _, tc := range testCases { + t.Run(tc.name, func(t *testing.T) { + // Wrap the error like the code does + wrappedErr := fmt.Errorf("%w: %s", tc.baseErr, tc.wrapMessage) + + // Verify errors.Is can detect it (this is how validateParticipant decides permanent vs retry) + assert.True(t, errors.Is(wrappedErr, tc.baseErr), + "errors.Is should detect %v in wrapped error", tc.name) + + // Verify it's not confused with other error types + for _, other := range testCases { + if other.name != tc.name { + assert.False(t, errors.Is(wrappedErr, other.baseErr), + "errors.Is should NOT detect %v when error is %v", other.name, tc.name) + } + } + }) + } +} + +// TestFetchAndVerifyProofs_RejectsNaNVector tests the full flow: HTTP server returns +// a proof with NaN vector data, and FetchAndVerifyProofs returns ErrInvalidVectorData. +func TestFetchAndVerifyProofs_RejectsNaNVector(t *testing.T) { + // Create a mock HTTP server that returns a proof with NaN vector + server := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { + // Return a proof response with NaN-containing vector from real exploit data + resp := ProofResponse{ + Proofs: []ProofItem{ + { + LeafIndex: 0, + NonceValue: 21, + VectorBytes: "JjsAfn85Zjp/NUgzrzNgOdYliTiIO7g4", // Contains NaN at position 1 + Proof: []string{}, // Empty proof for simplicity + }, + }, + } + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(resp) + })) + defer server.Close() + + // Create proof client (recorder can be nil for this test since we mock the HTTP response) + client := &ProofClient{ + httpClient: server.Client(), + recorder: nil, // Not needed - we're testing vector validation, not signature + } + + // We can't call FetchAndVerifyProofs directly because it needs a recorder for signing. + // Instead, test the validation logic that would be called: + vectorB64 := "JjsAfn85Zjp/NUgzrzNgOdYliTiIO7g4" + vectorBytes, err := base64.StdEncoding.DecodeString(vectorB64) + require.NoError(t, err) + + // This is what FetchAndVerifyProofs does internally + err = ValidateFP16Vector(vectorBytes) + assert.Error(t, err) + assert.Contains(t, err.Error(), "NaN") + + // Wrap it like FetchAndVerifyProofs does + wrappedErr := fmt.Errorf("%w: leaf %d: %v", ErrInvalidVectorData, 0, err) + + // Verify validateParticipant would classify this as permanent failure + assert.True(t, errors.Is(wrappedErr, ErrInvalidVectorData)) + + // Ensure client is used to avoid unused variable warning + _ = client +} diff --git a/decentralized-api/poc/validator.go b/decentralized-api/poc/validator.go index e1aa681a0..fd13b20ef 100644 --- a/decentralized-api/poc/validator.go +++ b/decentralized-api/poc/validator.go @@ -7,6 +7,7 @@ import ( "errors" "fmt" "math/rand" + "slices" "sync" "time" @@ -17,17 +18,19 @@ import ( "decentralized-api/mlnodeclient" "github.com/productscience/inference/api/inference/inference" + "github.com/productscience/inference/x/inference/calculations" "github.com/productscience/inference/x/inference/types" ) // OffChainValidator handles off-chain PoC validation using MMR proofs. type OffChainValidator struct { - recorder cosmosclient.CosmosMessageClient - nodeBroker *broker.Broker - phaseTracker *chainphase.ChainPhaseTracker - callbackUrl string - pubKey string - chainNodeUrl string + recorder cosmosclient.CosmosMessageClient + nodeBroker *broker.Broker + phaseTracker *chainphase.ChainPhaseTracker + callbackUrl string + pubKey string + validatorAddress string + chainNodeUrl string config ValidationConfig } @@ -77,17 +80,19 @@ func NewOffChainValidator( phaseTracker *chainphase.ChainPhaseTracker, callbackUrl string, pubKey string, + validatorAddress string, chainNodeUrl string, config ValidationConfig, ) *OffChainValidator { return &OffChainValidator{ - recorder: recorder, - nodeBroker: nodeBroker, - phaseTracker: phaseTracker, - callbackUrl: callbackUrl, - pubKey: pubKey, - chainNodeUrl: chainNodeUrl, - config: config, + recorder: recorder, + nodeBroker: nodeBroker, + phaseTracker: phaseTracker, + callbackUrl: callbackUrl, + pubKey: pubKey, + validatorAddress: validatorAddress, + chainNodeUrl: chainNodeUrl, + config: config, } } @@ -164,9 +169,49 @@ func (v *OffChainValidator) ValidateAll(pocStageStartBlockHeight int64, pocStart logging.Info("OffChainValidator: found participants with commits", types.PoC, "count", len(commitsResp.Commits)) + // Query validation snapshot for sampling (if enabled) + validationSlots := int(pocParams.ValidationSlots) + var snapshotWeights map[string]int64 + var snapshotAppHash string + var sortedValidatorEntries []calculations.WeightEntry + var validatorTotalWeight int64 + if validationSlots > 0 { + snapshotResp, err := queryClient.PoCValidationSnapshot(context.Background(), + &types.QueryPoCValidationSnapshotRequest{ + PocStageStartHeight: pocStageStartBlockHeight, + }) + if err != nil { + logging.Warn("OffChainValidator: failed to query validation snapshot, falling back to O(N^2)", types.PoC, + "error", err) + validationSlots = 0 // Disable sampling on error + } else if snapshotResp.Found && snapshotResp.Snapshot != nil && snapshotResp.Snapshot.ValidatorWeights != nil { + snapshotWeights = validatorWeightsSliceToMap(snapshotResp.Snapshot.ValidatorWeights) + snapshotAppHash = snapshotResp.Snapshot.AppHash + sortedValidatorEntries, validatorTotalWeight = calculations.PrepareSortedEntries(snapshotWeights) + logging.Info("OffChainValidator: using validation snapshot for sampling", types.PoC, + "appHash", snapshotAppHash, + "validationSlots", validationSlots, + "numValidators", len(snapshotWeights), + ) + } else { + logging.Warn("OffChainValidator: validation snapshot not found, falling back to O(N^2)", types.PoC) + validationSlots = 0 // Disable sampling + } + } + // Build work items with participant URLs workItems := make([]participantWork, 0, len(commitsResp.Commits)) + skippedNotAssigned := 0 for _, commit := range commitsResp.Commits { + // If sampling is enabled, check if we're assigned to validate this participant + if validationSlots > 0 && sortedValidatorEntries != nil { + assignedValidators := calculations.GetSlotsFromSorted(snapshotAppHash, commit.ParticipantAddress, sortedValidatorEntries, validatorTotalWeight, validationSlots) + if !slices.Contains(assignedValidators, v.validatorAddress) { + skippedNotAssigned++ + continue + } + } + // Get participant's inference URL participantResp, err := queryClient.Participant(context.Background(), &types.QueryGetParticipantRequest{Index: commit.ParticipantAddress}) @@ -198,6 +243,14 @@ func (v *OffChainValidator) ValidateAll(pocStageStartBlockHeight int64, pocStart }) } + if validationSlots > 0 { + logging.Info("OffChainValidator: filtered work items by sampling", types.PoC, + "totalCommits", len(commitsResp.Commits), + "assignedToUs", len(workItems), + "skippedNotAssigned", skippedNotAssigned, + ) + } + if len(workItems) == 0 { logging.Warn("OffChainValidator: no valid work items", types.PoC) return @@ -409,8 +462,8 @@ func (v *OffChainValidator) validateParticipant( if err != nil { logging.Warn("OffChainValidator: proof fetch/verify failed", types.PoC, "participant", work.address, "attempt", work.attempt, "error", err) - // Proof verification failures and incomplete coverage are permanent - no point retrying - if errors.Is(err, ErrProofVerificationFailed) || errors.Is(err, ErrIncompleteCoverage) { + // Proof verification failures, incomplete coverage, and invalid vector data are permanent - no point retrying + if errors.Is(err, ErrProofVerificationFailed) || errors.Is(err, ErrIncompleteCoverage) || errors.Is(err, ErrInvalidVectorData) { return validateFailPermanent } // Transient error (network/timeout) - retry @@ -452,7 +505,7 @@ func (v *OffChainValidator) validateParticipant( Validation: &mlnodeclient.ValidationV2{ Artifacts: artifacts, }, - StatTest: mlnodeclient.DefaultStatTestParamsV2(), + StatTest: mlnodeclient.StatTestParamsFromChain(pocParams.StatTest), } // Try sending to ML node (single attempt per call - retries handled by queue) @@ -708,3 +761,11 @@ func (v *OffChainValidator) reportInvalidParticipant(pocHeight int64, participan "participant", participantAddress) } } + +func validatorWeightsSliceToMap(weights []*types.ValidatorWeight) map[string]int64 { + result := make(map[string]int64, len(weights)) + for _, w := range weights { + result[w.Address] = w.Weight + } + return result +} diff --git a/decentralized-api/poc/validator_v1.go b/decentralized-api/poc/validator_v1.go index d5ae6a2a9..5d645971a 100644 --- a/decentralized-api/poc/validator_v1.go +++ b/decentralized-api/poc/validator_v1.go @@ -26,12 +26,13 @@ const ( ) type OnChainValidator struct { - recorder cosmosclient.CosmosMessageClient - nodeBroker *broker.Broker - phaseTracker *chainphase.ChainPhaseTracker - callbackUrl string - pubKey string - chainNodeUrl string + recorder cosmosclient.CosmosMessageClient + nodeBroker *broker.Broker + phaseTracker *chainphase.ChainPhaseTracker + callbackUrl string + pubKey string + validatorAddress string + chainNodeUrl string config ValidationConfig } @@ -42,17 +43,19 @@ func NewOnChainValidator( phaseTracker *chainphase.ChainPhaseTracker, callbackUrl string, pubKey string, + validatorAddress string, chainNodeUrl string, config ValidationConfig, ) *OnChainValidator { return &OnChainValidator{ - recorder: recorder, - nodeBroker: nodeBroker, - phaseTracker: phaseTracker, - callbackUrl: callbackUrl, - pubKey: pubKey, - chainNodeUrl: chainNodeUrl, - config: config, + recorder: recorder, + nodeBroker: nodeBroker, + phaseTracker: phaseTracker, + callbackUrl: callbackUrl, + pubKey: pubKey, + validatorAddress: validatorAddress, + chainNodeUrl: chainNodeUrl, + config: config, } } diff --git a/decentralized-api/training/assigner.go b/decentralized-api/training/assigner.go index 546c25505..29908244d 100644 --- a/decentralized-api/training/assigner.go +++ b/decentralized-api/training/assigner.go @@ -69,6 +69,11 @@ func (a *Assigner) tryClaimingTaskToAssign() { chainStatus, err := a.tendermintClient.Status() if err != nil { slog.Error(logTag+"Failed to query chain status", "err", err) + return + } + if chainStatus == nil { + slog.Error(logTag + "Failed to query chain status: empty response") + return } if chainStatus.SyncInfo.CatchingUp { diff --git a/decentralized-api/training/executor.go b/decentralized-api/training/executor.go index 7da092c97..6b20cf786 100644 --- a/decentralized-api/training/executor.go +++ b/decentralized-api/training/executor.go @@ -197,12 +197,13 @@ func getMasterNode(ctx context.Context, rankedNodes []nodeWithParticipant, query } func (e *Executor) checkStatusRoutine() { - timer := time.NewTimer(60 * time.Second) + ticker := time.NewTicker(60 * time.Second) + defer ticker.Stop() for { select { case <-e.ctx.Done(): return - case <-timer.C: + case <-ticker.C: e.checkInProgressTasksOnChain() e.checkStatus() } diff --git a/deploy/join/docker-compose.mlnode.yml b/deploy/join/docker-compose.mlnode.yml index 89b1a1d91..ace9c2431 100644 --- a/deploy/join/docker-compose.mlnode.yml +++ b/deploy/join/docker-compose.mlnode.yml @@ -1,7 +1,7 @@ services: mlnode-308: - # ghcr.io/product-science/mlnode:3.0.12-post2-blackwell - image: ghcr.io/product-science/mlnode:3.0.12-post2 + # ghcr.io/product-science/mlnode:3.0.12-post4-blackwell + image: ghcr.io/product-science/mlnode:3.0.12-post4 hostname: mlnode-308 volumes: - ${HF_HOME:-${HOME}/.cache}:/root/.cache diff --git a/deploy/join/docker-compose.yml b/deploy/join/docker-compose.yml index 9cabba95f..548913d49 100644 --- a/deploy/join/docker-compose.yml +++ b/deploy/join/docker-compose.yml @@ -1,6 +1,6 @@ services: tmkms: - image: ghcr.io/product-science/tmkms-softsign-with-keygen:0.2.9-post3 + image: ghcr.io/product-science/tmkms-softsign-with-keygen:0.2.10 container_name: tmkms restart: unless-stopped environment: @@ -10,7 +10,7 @@ services: node: container_name: node - image: ghcr.io/product-science/inferenced:0.2.9-post3 + image: ghcr.io/product-science/inferenced:0.2.10 command: ["sh", "./init-docker.sh"] volumes: - .inference:/root/.inference @@ -44,7 +44,7 @@ services: api: container_name: api - image: ghcr.io/product-science/api:0.2.9-post3 + image: ghcr.io/product-science/api:0.2.10 volumes: - .inference:/root/.inference - .dapi:/root/.dapi @@ -99,7 +99,7 @@ services: proxy: container_name: proxy - image: ghcr.io/product-science/proxy:0.2.9-post3 + image: ghcr.io/product-science/proxy:0.2.10 ports: - "${API_PORT:-8000}:80" - "${API_SSL_PORT:-8443}:443" @@ -145,7 +145,7 @@ services: proxy-ssl: container_name: proxy-ssl - image: ghcr.io/product-science/proxy-ssl:0.2.9-post3 + image: ghcr.io/product-science/proxy-ssl:0.2.10 profiles: - ssl environment: diff --git a/inference-chain/Dockerfile b/inference-chain/Dockerfile index 9f87d7fdd..3b9b1c73d 100644 --- a/inference-chain/Dockerfile +++ b/inference-chain/Dockerfile @@ -7,6 +7,7 @@ FROM golang:1.24.2-alpine3.20 AS builder ARG GOOS=linux ARG GOARCH=amd64 +ARG BLST_PORTABLE=0 ENV GOOS=${GOOS} \ GOARCH=${GOARCH} \ @@ -14,9 +15,10 @@ ENV GOOS=${GOOS} \ GO111MODULE=on \ GOCACHE=/root/.cache/go-build \ GOMODCACHE=/go/pkg/mod \ - CGO_CFLAGS="-I/lib" \ + CGO_CFLAGS="-I/lib -O2" \ + CGO_CFLAGS_ALLOW=".*" \ CGO_LDFLAGS="-L/lib" \ - # Override the wasmvm library path to use our musl version + BLST_PORTABLE=${BLST_PORTABLE} \ LD_LIBRARY_PATH=/lib RUN apk add --no-cache make gcc musl-dev git patchelf @@ -51,6 +53,7 @@ ARG LDFLAGS ARG TAGS="" RUN --mount=type=cache,id=go-build-cache,target=/root/.cache/go-build \ --mount=type=cache,id=go-mod-cache,target=/go/pkg/mod \ + if [ "$BLST_PORTABLE" = "1" ]; then export CGO_CFLAGS="$CGO_CFLAGS -D__BLST_PORTABLE__"; fi; \ CGO_ENABLED=1 CC=gcc \ go build -mod=readonly -tags="muslc ${TAGS}" -ldflags "${LDFLAGS}" \ -o ./build/inferenced \ @@ -110,4 +113,4 @@ RUN chmod +x /root/init-docker.sh /root/init-docker-genesis.sh \ EXPOSE 26656 26657 1317 9090 -CMD ["sh", "./init-docker.sh"] \ No newline at end of file +CMD ["sh", "./init-docker.sh"] diff --git a/inference-chain/Makefile b/inference-chain/Makefile index c0905afe4..5117e9145 100644 --- a/inference-chain/Makefile +++ b/inference-chain/Makefile @@ -4,6 +4,7 @@ BRANCH := $(shell git rev-parse --abbrev-ref HEAD) COMMIT := $(shell git log -1 --format='%H') VERSION ?= $(shell git describe --always) +BLST_PORTABLE ?= 0 SET_LATEST ?= 0 SET_LATEST := $(shell if [ "$(SET_LATEST)" = "1" ]; then echo 1; else echo 0; fi) @@ -86,6 +87,7 @@ define DOCKER_BUILD --build-arg LDFLAGS='$(ldflags)' \ --build-arg GOOS=$(GOOS) \ --build-arg GOARCH=$(GOARCH) \ + --build-arg BLST_PORTABLE=$(BLST_PORTABLE) \ --build-arg GENESIS_OVERRIDES_FILE=$(GENESIS_OVERRIDES_FILE) \ -f $(DOCKER_FILE) \ .docker-context \ diff --git a/inference-chain/api/inference/inference/grace_epoch_params.pulsar.go b/inference-chain/api/inference/inference/grace_epoch_params.pulsar.go new file mode 100644 index 000000000..f8a71a782 --- /dev/null +++ b/inference-chain/api/inference/inference/grace_epoch_params.pulsar.go @@ -0,0 +1,712 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package inference + +import ( + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + _ "github.com/cosmos/gogoproto/gogoproto" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + io "io" + reflect "reflect" + sync "sync" +) + +var ( + md_GraceEpochParams protoreflect.MessageDescriptor + fd_GraceEpochParams_epoch_index protoreflect.FieldDescriptor + fd_GraceEpochParams_binom_test_p0 protoreflect.FieldDescriptor + fd_GraceEpochParams_upgrade_protection_window protoreflect.FieldDescriptor +) + +func init() { + file_inference_inference_grace_epoch_params_proto_init() + md_GraceEpochParams = File_inference_inference_grace_epoch_params_proto.Messages().ByName("GraceEpochParams") + fd_GraceEpochParams_epoch_index = md_GraceEpochParams.Fields().ByName("epoch_index") + fd_GraceEpochParams_binom_test_p0 = md_GraceEpochParams.Fields().ByName("binom_test_p0") + fd_GraceEpochParams_upgrade_protection_window = md_GraceEpochParams.Fields().ByName("upgrade_protection_window") +} + +var _ protoreflect.Message = (*fastReflection_GraceEpochParams)(nil) + +type fastReflection_GraceEpochParams GraceEpochParams + +func (x *GraceEpochParams) ProtoReflect() protoreflect.Message { + return (*fastReflection_GraceEpochParams)(x) +} + +func (x *GraceEpochParams) slowProtoReflect() protoreflect.Message { + mi := &file_inference_inference_grace_epoch_params_proto_msgTypes[0] + 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_GraceEpochParams_messageType fastReflection_GraceEpochParams_messageType +var _ protoreflect.MessageType = fastReflection_GraceEpochParams_messageType{} + +type fastReflection_GraceEpochParams_messageType struct{} + +func (x fastReflection_GraceEpochParams_messageType) Zero() protoreflect.Message { + return (*fastReflection_GraceEpochParams)(nil) +} +func (x fastReflection_GraceEpochParams_messageType) New() protoreflect.Message { + return new(fastReflection_GraceEpochParams) +} +func (x fastReflection_GraceEpochParams_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_GraceEpochParams +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_GraceEpochParams) Descriptor() protoreflect.MessageDescriptor { + return md_GraceEpochParams +} + +// 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_GraceEpochParams) Type() protoreflect.MessageType { + return _fastReflection_GraceEpochParams_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_GraceEpochParams) New() protoreflect.Message { + return new(fastReflection_GraceEpochParams) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_GraceEpochParams) Interface() protoreflect.ProtoMessage { + return (*GraceEpochParams)(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_GraceEpochParams) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.EpochIndex != uint64(0) { + value := protoreflect.ValueOfUint64(x.EpochIndex) + if !f(fd_GraceEpochParams_epoch_index, value) { + return + } + } + if x.BinomTestP0 != nil { + value := protoreflect.ValueOfMessage(x.BinomTestP0.ProtoReflect()) + if !f(fd_GraceEpochParams_binom_test_p0, value) { + return + } + } + if x.UpgradeProtectionWindow != int64(0) { + value := protoreflect.ValueOfInt64(x.UpgradeProtectionWindow) + if !f(fd_GraceEpochParams_upgrade_protection_window, 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_GraceEpochParams) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "inference.inference.GraceEpochParams.epoch_index": + return x.EpochIndex != uint64(0) + case "inference.inference.GraceEpochParams.binom_test_p0": + return x.BinomTestP0 != nil + case "inference.inference.GraceEpochParams.upgrade_protection_window": + return x.UpgradeProtectionWindow != int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.GraceEpochParams")) + } + panic(fmt.Errorf("message inference.inference.GraceEpochParams 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_GraceEpochParams) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "inference.inference.GraceEpochParams.epoch_index": + x.EpochIndex = uint64(0) + case "inference.inference.GraceEpochParams.binom_test_p0": + x.BinomTestP0 = nil + case "inference.inference.GraceEpochParams.upgrade_protection_window": + x.UpgradeProtectionWindow = int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.GraceEpochParams")) + } + panic(fmt.Errorf("message inference.inference.GraceEpochParams 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_GraceEpochParams) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "inference.inference.GraceEpochParams.epoch_index": + value := x.EpochIndex + return protoreflect.ValueOfUint64(value) + case "inference.inference.GraceEpochParams.binom_test_p0": + value := x.BinomTestP0 + return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "inference.inference.GraceEpochParams.upgrade_protection_window": + value := x.UpgradeProtectionWindow + return protoreflect.ValueOfInt64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.GraceEpochParams")) + } + panic(fmt.Errorf("message inference.inference.GraceEpochParams 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_GraceEpochParams) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "inference.inference.GraceEpochParams.epoch_index": + x.EpochIndex = value.Uint() + case "inference.inference.GraceEpochParams.binom_test_p0": + x.BinomTestP0 = value.Message().Interface().(*Decimal) + case "inference.inference.GraceEpochParams.upgrade_protection_window": + x.UpgradeProtectionWindow = value.Int() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.GraceEpochParams")) + } + panic(fmt.Errorf("message inference.inference.GraceEpochParams 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_GraceEpochParams) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.GraceEpochParams.binom_test_p0": + if x.BinomTestP0 == nil { + x.BinomTestP0 = new(Decimal) + } + return protoreflect.ValueOfMessage(x.BinomTestP0.ProtoReflect()) + case "inference.inference.GraceEpochParams.epoch_index": + panic(fmt.Errorf("field epoch_index of message inference.inference.GraceEpochParams is not mutable")) + case "inference.inference.GraceEpochParams.upgrade_protection_window": + panic(fmt.Errorf("field upgrade_protection_window of message inference.inference.GraceEpochParams is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.GraceEpochParams")) + } + panic(fmt.Errorf("message inference.inference.GraceEpochParams 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_GraceEpochParams) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.GraceEpochParams.epoch_index": + return protoreflect.ValueOfUint64(uint64(0)) + case "inference.inference.GraceEpochParams.binom_test_p0": + m := new(Decimal) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "inference.inference.GraceEpochParams.upgrade_protection_window": + return protoreflect.ValueOfInt64(int64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.GraceEpochParams")) + } + panic(fmt.Errorf("message inference.inference.GraceEpochParams 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_GraceEpochParams) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in inference.inference.GraceEpochParams", 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_GraceEpochParams) 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_GraceEpochParams) 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_GraceEpochParams) 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_GraceEpochParams) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*GraceEpochParams) + 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.EpochIndex != 0 { + n += 1 + runtime.Sov(uint64(x.EpochIndex)) + } + if x.BinomTestP0 != nil { + l = options.Size(x.BinomTestP0) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.UpgradeProtectionWindow != 0 { + n += 1 + runtime.Sov(uint64(x.UpgradeProtectionWindow)) + } + 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().(*GraceEpochParams) + 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.UpgradeProtectionWindow != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.UpgradeProtectionWindow)) + i-- + dAtA[i] = 0x18 + } + if x.BinomTestP0 != nil { + encoded, err := options.Marshal(x.BinomTestP0) + 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 x.EpochIndex != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.EpochIndex)) + i-- + dAtA[i] = 0x8 + } + 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().(*GraceEpochParams) + 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: GraceEpochParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: GraceEpochParams: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field EpochIndex", wireType) + } + x.EpochIndex = 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.EpochIndex |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field BinomTestP0", 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.BinomTestP0 == nil { + x.BinomTestP0 = &Decimal{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.BinomTestP0); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field UpgradeProtectionWindow", wireType) + } + x.UpgradeProtectionWindow = 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.UpgradeProtectionWindow |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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: inference/inference/grace_epoch_params.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) +) + +type GraceEpochParams struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + EpochIndex uint64 `protobuf:"varint,1,opt,name=epoch_index,json=epochIndex,proto3" json:"epoch_index,omitempty"` + BinomTestP0 *Decimal `protobuf:"bytes,2,opt,name=binom_test_p0,json=binomTestP0,proto3" json:"binom_test_p0,omitempty"` + UpgradeProtectionWindow int64 `protobuf:"varint,3,opt,name=upgrade_protection_window,json=upgradeProtectionWindow,proto3" json:"upgrade_protection_window,omitempty"` +} + +func (x *GraceEpochParams) Reset() { + *x = GraceEpochParams{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_grace_epoch_params_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *GraceEpochParams) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GraceEpochParams) ProtoMessage() {} + +// Deprecated: Use GraceEpochParams.ProtoReflect.Descriptor instead. +func (*GraceEpochParams) Descriptor() ([]byte, []int) { + return file_inference_inference_grace_epoch_params_proto_rawDescGZIP(), []int{0} +} + +func (x *GraceEpochParams) GetEpochIndex() uint64 { + if x != nil { + return x.EpochIndex + } + return 0 +} + +func (x *GraceEpochParams) GetBinomTestP0() *Decimal { + if x != nil { + return x.BinomTestP0 + } + return nil +} + +func (x *GraceEpochParams) GetUpgradeProtectionWindow() int64 { + if x != nil { + return x.UpgradeProtectionWindow + } + return 0 +} + +var File_inference_inference_grace_epoch_params_proto protoreflect.FileDescriptor + +var file_inference_inference_grace_epoch_params_proto_rawDesc = []byte{ + 0x0a, 0x2c, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x13, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x1a, 0x14, 0x67, 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, + 0x6f, 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x20, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xb1, 0x01, 0x0a, 0x10, + 0x47, 0x72, 0x61, 0x63, 0x65, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x69, 0x6e, 0x6f, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, + 0x70, 0x30, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0b, 0x62, 0x69, 0x6e, 0x6f, 0x6d, 0x54, 0x65, 0x73, + 0x74, 0x50, 0x30, 0x12, 0x3a, 0x0a, 0x19, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, + 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, + 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x42, + 0xc3, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x15, 0x47, 0x72, 0x61, + 0x63, 0x65, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, + 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xa2, 0x02, 0x03, 0x49, 0x49, 0x58, + 0xaa, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xca, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xe2, 0x02, 0x1f, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x14, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x3a, 0x49, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_inference_inference_grace_epoch_params_proto_rawDescOnce sync.Once + file_inference_inference_grace_epoch_params_proto_rawDescData = file_inference_inference_grace_epoch_params_proto_rawDesc +) + +func file_inference_inference_grace_epoch_params_proto_rawDescGZIP() []byte { + file_inference_inference_grace_epoch_params_proto_rawDescOnce.Do(func() { + file_inference_inference_grace_epoch_params_proto_rawDescData = protoimpl.X.CompressGZIP(file_inference_inference_grace_epoch_params_proto_rawDescData) + }) + return file_inference_inference_grace_epoch_params_proto_rawDescData +} + +var file_inference_inference_grace_epoch_params_proto_msgTypes = make([]protoimpl.MessageInfo, 1) +var file_inference_inference_grace_epoch_params_proto_goTypes = []interface{}{ + (*GraceEpochParams)(nil), // 0: inference.inference.GraceEpochParams + (*Decimal)(nil), // 1: inference.inference.Decimal +} +var file_inference_inference_grace_epoch_params_proto_depIdxs = []int32{ + 1, // 0: inference.inference.GraceEpochParams.binom_test_p0:type_name -> inference.inference.Decimal + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_inference_inference_grace_epoch_params_proto_init() } +func file_inference_inference_grace_epoch_params_proto_init() { + if File_inference_inference_grace_epoch_params_proto != nil { + return + } + file_inference_inference_params_proto_init() + if !protoimpl.UnsafeEnabled { + file_inference_inference_grace_epoch_params_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*GraceEpochParams); 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{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_inference_inference_grace_epoch_params_proto_rawDesc, + NumEnums: 0, + NumMessages: 1, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_inference_inference_grace_epoch_params_proto_goTypes, + DependencyIndexes: file_inference_inference_grace_epoch_params_proto_depIdxs, + MessageInfos: file_inference_inference_grace_epoch_params_proto_msgTypes, + }.Build() + File_inference_inference_grace_epoch_params_proto = out.File + file_inference_inference_grace_epoch_params_proto_rawDesc = nil + file_inference_inference_grace_epoch_params_proto_goTypes = nil + file_inference_inference_grace_epoch_params_proto_depIdxs = nil +} diff --git a/inference-chain/api/inference/inference/params.pulsar.go b/inference-chain/api/inference/inference/params.pulsar.go index 3b330a4c3..dbc644811 100644 --- a/inference-chain/api/inference/inference/params.pulsar.go +++ b/inference-chain/api/inference/inference/params.pulsar.go @@ -8265,6 +8265,8 @@ var ( fd_PocParams_poc_v2_enabled protoreflect.FieldDescriptor fd_PocParams_confirmation_poc_v2_enabled protoreflect.FieldDescriptor fd_PocParams_stat_test protoreflect.FieldDescriptor + fd_PocParams_validation_slots protoreflect.FieldDescriptor + fd_PocParams_poc_normalization_enabled protoreflect.FieldDescriptor ) func init() { @@ -8280,6 +8282,8 @@ func init() { fd_PocParams_poc_v2_enabled = md_PocParams.Fields().ByName("poc_v2_enabled") fd_PocParams_confirmation_poc_v2_enabled = md_PocParams.Fields().ByName("confirmation_poc_v2_enabled") fd_PocParams_stat_test = md_PocParams.Fields().ByName("stat_test") + fd_PocParams_validation_slots = md_PocParams.Fields().ByName("validation_slots") + fd_PocParams_poc_normalization_enabled = md_PocParams.Fields().ByName("poc_normalization_enabled") } var _ protoreflect.Message = (*fastReflection_PocParams)(nil) @@ -8407,6 +8411,18 @@ func (x *fastReflection_PocParams) Range(f func(protoreflect.FieldDescriptor, pr return } } + if x.ValidationSlots != uint32(0) { + value := protoreflect.ValueOfUint32(x.ValidationSlots) + if !f(fd_PocParams_validation_slots, value) { + return + } + } + if x.PocNormalizationEnabled != false { + value := protoreflect.ValueOfBool(x.PocNormalizationEnabled) + if !f(fd_PocParams_poc_normalization_enabled, value) { + return + } + } } // Has reports whether a field is populated. @@ -8442,6 +8458,10 @@ func (x *fastReflection_PocParams) Has(fd protoreflect.FieldDescriptor) bool { return x.ConfirmationPocV2Enabled != false case "inference.inference.PocParams.stat_test": return x.StatTest != nil + case "inference.inference.PocParams.validation_slots": + return x.ValidationSlots != uint32(0) + case "inference.inference.PocParams.poc_normalization_enabled": + return x.PocNormalizationEnabled != false default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PocParams")) @@ -8478,6 +8498,10 @@ func (x *fastReflection_PocParams) Clear(fd protoreflect.FieldDescriptor) { x.ConfirmationPocV2Enabled = false case "inference.inference.PocParams.stat_test": x.StatTest = nil + case "inference.inference.PocParams.validation_slots": + x.ValidationSlots = uint32(0) + case "inference.inference.PocParams.poc_normalization_enabled": + x.PocNormalizationEnabled = false default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PocParams")) @@ -8524,6 +8548,12 @@ func (x *fastReflection_PocParams) Get(descriptor protoreflect.FieldDescriptor) case "inference.inference.PocParams.stat_test": value := x.StatTest return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "inference.inference.PocParams.validation_slots": + value := x.ValidationSlots + return protoreflect.ValueOfUint32(value) + case "inference.inference.PocParams.poc_normalization_enabled": + value := x.PocNormalizationEnabled + return protoreflect.ValueOfBool(value) default: if descriptor.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PocParams")) @@ -8564,6 +8594,10 @@ func (x *fastReflection_PocParams) Set(fd protoreflect.FieldDescriptor, value pr x.ConfirmationPocV2Enabled = value.Bool() case "inference.inference.PocParams.stat_test": x.StatTest = value.Message().Interface().(*PoCStatTestParams) + case "inference.inference.PocParams.validation_slots": + x.ValidationSlots = uint32(value.Uint()) + case "inference.inference.PocParams.poc_normalization_enabled": + x.PocNormalizationEnabled = value.Bool() default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PocParams")) @@ -8613,6 +8647,10 @@ func (x *fastReflection_PocParams) Mutable(fd protoreflect.FieldDescriptor) prot panic(fmt.Errorf("field poc_v2_enabled of message inference.inference.PocParams is not mutable")) case "inference.inference.PocParams.confirmation_poc_v2_enabled": panic(fmt.Errorf("field confirmation_poc_v2_enabled of message inference.inference.PocParams is not mutable")) + case "inference.inference.PocParams.validation_slots": + panic(fmt.Errorf("field validation_slots of message inference.inference.PocParams is not mutable")) + case "inference.inference.PocParams.poc_normalization_enabled": + panic(fmt.Errorf("field poc_normalization_enabled of message inference.inference.PocParams is not mutable")) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PocParams")) @@ -8649,6 +8687,10 @@ func (x *fastReflection_PocParams) NewField(fd protoreflect.FieldDescriptor) pro case "inference.inference.PocParams.stat_test": m := new(PoCStatTestParams) return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "inference.inference.PocParams.validation_slots": + return protoreflect.ValueOfUint32(uint32(0)) + case "inference.inference.PocParams.poc_normalization_enabled": + return protoreflect.ValueOfBool(false) default: if fd.IsExtension() { panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PocParams")) @@ -8752,6 +8794,12 @@ func (x *fastReflection_PocParams) ProtoMethods() *protoiface.Methods { l = options.Size(x.StatTest) n += 1 + l + runtime.Sov(uint64(l)) } + if x.ValidationSlots != 0 { + n += 1 + runtime.Sov(uint64(x.ValidationSlots)) + } + if x.PocNormalizationEnabled { + n += 2 + } if x.unknownFields != nil { n += len(x.unknownFields) } @@ -8781,6 +8829,21 @@ func (x *fastReflection_PocParams) ProtoMethods() *protoiface.Methods { i -= len(x.unknownFields) copy(dAtA[i:], x.unknownFields) } + if x.PocNormalizationEnabled { + i-- + if x.PocNormalizationEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x60 + } + if x.ValidationSlots != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.ValidationSlots)) + i-- + dAtA[i] = 0x58 + } if x.StatTest != nil { encoded, err := options.Marshal(x.StatTest) if err != nil { @@ -9175,6 +9238,45 @@ func (x *fastReflection_PocParams) ProtoMethods() *protoiface.Methods { return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err } iNdEx = postIndex + case 11: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ValidationSlots", wireType) + } + x.ValidationSlots = 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.ValidationSlots |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 12: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field PocNormalizationEnabled", wireType) + } + var v 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++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.PocNormalizationEnabled = bool(v != 0) default: iNdEx = preIndex skippy, err := runtime.Skip(dAtA[iNdEx:]) @@ -16138,11 +16240,12 @@ type EpochParams struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - EpochLength int64 `protobuf:"varint,1,opt,name=epoch_length,json=epochLength,proto3" json:"epoch_length,omitempty"` - EpochMultiplier int64 `protobuf:"varint,2,opt,name=epoch_multiplier,json=epochMultiplier,proto3" json:"epoch_multiplier,omitempty"` - EpochShift int64 `protobuf:"varint,3,opt,name=epoch_shift,json=epochShift,proto3" json:"epoch_shift,omitempty"` - DefaultUnitOfComputePrice int64 `protobuf:"varint,4,opt,name=default_unit_of_compute_price,json=defaultUnitOfComputePrice,proto3" json:"default_unit_of_compute_price,omitempty"` - PocStageDuration int64 `protobuf:"varint,5,opt,name=poc_stage_duration,json=pocStageDuration,proto3" json:"poc_stage_duration,omitempty"` + EpochLength int64 `protobuf:"varint,1,opt,name=epoch_length,json=epochLength,proto3" json:"epoch_length,omitempty"` + EpochMultiplier int64 `protobuf:"varint,2,opt,name=epoch_multiplier,json=epochMultiplier,proto3" json:"epoch_multiplier,omitempty"` + EpochShift int64 `protobuf:"varint,3,opt,name=epoch_shift,json=epochShift,proto3" json:"epoch_shift,omitempty"` + DefaultUnitOfComputePrice int64 `protobuf:"varint,4,opt,name=default_unit_of_compute_price,json=defaultUnitOfComputePrice,proto3" json:"default_unit_of_compute_price,omitempty"` + PocStageDuration int64 `protobuf:"varint,5,opt,name=poc_stage_duration,json=pocStageDuration,proto3" json:"poc_stage_duration,omitempty"` + // Deprecated: Do not use. PocExchangeDuration int64 `protobuf:"varint,6,opt,name=poc_exchange_duration,json=pocExchangeDuration,proto3" json:"poc_exchange_duration,omitempty"` PocValidationDelay int64 `protobuf:"varint,7,opt,name=poc_validation_delay,json=pocValidationDelay,proto3" json:"poc_validation_delay,omitempty"` PocValidationDuration int64 `protobuf:"varint,8,opt,name=poc_validation_duration,json=pocValidationDuration,proto3" json:"poc_validation_duration,omitempty"` @@ -16209,6 +16312,7 @@ func (x *EpochParams) GetPocStageDuration() int64 { return 0 } +// Deprecated: Do not use. func (x *EpochParams) GetPocExchangeDuration() int64 { if x != nil { return x.PocExchangeDuration @@ -16682,6 +16786,8 @@ type PocParams struct { PocV2Enabled bool `protobuf:"varint,8,opt,name=poc_v2_enabled,json=pocV2Enabled,proto3" json:"poc_v2_enabled,omitempty"` // false = V1 (on-chain batches), true = V2 (off-chain commits). Default: true ConfirmationPocV2Enabled bool `protobuf:"varint,9,opt,name=confirmation_poc_v2_enabled,json=confirmationPocV2Enabled,proto3" json:"confirmation_poc_v2_enabled,omitempty"` // Enables V2 for Confirmation PoC only. Migration mode: poc_v2_enabled=false + confirmation_poc_v2_enabled=true StatTest *PoCStatTestParams `protobuf:"bytes,10,opt,name=stat_test,json=statTest,proto3" json:"stat_test,omitempty"` // Statistical test parameters for V2 validation + ValidationSlots uint32 `protobuf:"varint,11,opt,name=validation_slots,json=validationSlots,proto3" json:"validation_slots,omitempty"` // Number of slots sampled per participant (0 = disabled) + PocNormalizationEnabled bool `protobuf:"varint,12,opt,name=poc_normalization_enabled,json=pocNormalizationEnabled,proto3" json:"poc_normalization_enabled,omitempty"` // Enables time-based weight normalization for PoC } func (x *PocParams) Reset() { @@ -16775,6 +16881,20 @@ func (x *PocParams) GetStatTest() *PoCStatTestParams { return nil } +func (x *PocParams) GetValidationSlots() uint32 { + if x != nil { + return x.ValidationSlots + } + return 0 +} + +func (x *PocParams) GetPocNormalizationEnabled() bool { + if x != nil { + return x.PocNormalizationEnabled + } + return false +} + type Decimal struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -17655,7 +17775,7 @@ var file_inference_inference_params_proto_rawDesc = []byte{ 0x18, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xfe, 0x05, 0x0a, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x82, 0x06, 0x0a, 0x0b, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x6c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x4c, 0x65, 0x6e, 0x67, 0x74, 0x68, 0x12, @@ -17670,452 +17790,458 @@ var file_inference_inference_params_proto_rawDesc = []byte{ 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x70, 0x6f, 0x63, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x32, 0x0a, 0x15, 0x70, + 0x61, 0x67, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x0a, 0x15, 0x70, 0x6f, 0x63, 0x5f, 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x64, 0x75, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x6f, 0x63, 0x45, - 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x30, 0x0a, 0x14, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x70, - 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x6c, 0x61, - 0x79, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x15, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, 0x18, 0x73, 0x65, 0x74, - 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x5f, - 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x73, 0x65, 0x74, - 0x4e, 0x65, 0x77, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x73, 0x44, 0x65, 0x6c, - 0x61, 0x79, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, 0x75, 0x74, 0x6f, 0x66, - 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x43, 0x75, 0x74, 0x6f, - 0x66, 0x66, 0x12, 0x49, 0x0a, 0x21, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, - 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x32, 0x0a, - 0x15, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, - 0x6e, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x61, - 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x6f, 0x63, 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, - 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x50, - 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x78, 0x12, 0x4c, 0x0a, 0x13, 0x70, 0x6f, 0x63, - 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, - 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x11, 0x70, 0x6f, 0x63, 0x53, 0x6c, 0x6f, 0x74, 0x41, 0x6c, 0x6c, - 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x8e, 0x0e, - 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x5f, 0x70, 0x6f, 0x73, 0x69, - 0x74, 0x69, 0x76, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x11, 0x66, - 0x61, 0x6c, 0x73, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x52, 0x61, 0x74, 0x65, - 0x12, 0x37, 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x6d, 0x70, 0x5f, 0x75, 0x70, 0x5f, - 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x61, 0x6d, 0x70, 0x55, 0x70, 0x4d, 0x65, 0x61, - 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x61, 0x73, - 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x09, 0x70, 0x61, 0x73, - 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, - 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x61, - 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, - 0x72, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x42, 0x02, 0x18, 0x01, 0x52, 0x13, + 0x70, 0x6f, 0x63, 0x45, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x30, 0x0a, 0x14, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x12, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x36, 0x0a, 0x17, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x15, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x37, 0x0a, + 0x18, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x65, 0x77, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x6f, 0x72, 0x73, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x15, 0x73, 0x65, 0x74, 0x4e, 0x65, 0x77, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, + 0x73, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x63, + 0x75, 0x74, 0x6f, 0x66, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x19, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x43, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x12, 0x49, 0x0a, 0x21, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x1e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x75, 0x6e, + 0x69, 0x6e, 0x67, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x12, 0x32, 0x0a, 0x15, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, + 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x13, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x75, 0x6e, 0x69, + 0x6e, 0x67, 0x4d, 0x61, 0x78, 0x12, 0x26, 0x0a, 0x0f, 0x70, 0x6f, 0x63, 0x5f, 0x70, 0x72, 0x75, + 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, + 0x70, 0x6f, 0x63, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x4d, 0x61, 0x78, 0x12, 0x4c, 0x0a, + 0x13, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x61, 0x78, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x2b, - 0x0a, 0x11, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, 0x22, 0x0a, 0x0d, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x78, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x54, 0x6f, 0x4d, 0x61, 0x78, 0x12, - 0x43, 0x0a, 0x1e, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x63, 0x75, 0x74, 0x6f, 0x66, - 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1b, 0x66, 0x75, 0x6c, 0x6c, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x43, 0x75, - 0x74, 0x6f, 0x66, 0x66, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x77, 0x61, 0x79, 0x18, 0x09, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, - 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x48, 0x61, 0x6c, 0x66, 0x77, 0x61, 0x79, 0x12, 0x41, 0x0a, 0x1d, 0x6d, 0x69, 0x6e, 0x5f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, - 0x69, 0x63, 0x5f, 0x63, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x1a, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x43, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x12, 0x52, 0x0a, 0x16, 0x6d, - 0x69, 0x73, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x63, - 0x75, 0x74, 0x6f, 0x66, 0x66, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x69, 0x73, 0x73, 0x50, - 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x43, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x12, - 0x50, 0x0a, 0x15, 0x6d, 0x69, 0x73, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, - 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x11, 0x70, 0x6f, 0x63, 0x53, 0x6c, 0x6f, + 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, + 0x01, 0x22, 0x8e, 0x0e, 0x0a, 0x10, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x4c, 0x0a, 0x13, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x5f, + 0x70, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, + 0x6c, 0x52, 0x11, 0x66, 0x61, 0x6c, 0x73, 0x65, 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x76, 0x65, + 0x52, 0x61, 0x74, 0x65, 0x12, 0x37, 0x0a, 0x18, 0x6d, 0x69, 0x6e, 0x5f, 0x72, 0x61, 0x6d, 0x70, + 0x5f, 0x75, 0x70, 0x5f, 0x6d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x15, 0x6d, 0x69, 0x6e, 0x52, 0x61, 0x6d, 0x70, 0x55, + 0x70, 0x4d, 0x65, 0x61, 0x73, 0x75, 0x72, 0x65, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x3b, 0x0a, + 0x0a, 0x70, 0x61, 0x73, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, + 0x09, 0x70, 0x61, 0x73, 0x73, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x69, + 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, + 0x72, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x52, + 0x0a, 0x16, 0x6d, 0x61, 0x78, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x13, 0x6d, 0x69, - 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x50, 0x65, 0x6e, 0x61, 0x6c, 0x74, - 0x79, 0x12, 0x31, 0x0a, 0x14, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x45, 0x78, 0x70, 0x69, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, - 0x70, 0x5f, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x10, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x41, 0x64, 0x76, 0x61, 0x6e, 0x63, - 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, - 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x6b, 0x62, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, - 0x74, 0x65, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x4b, 0x62, 0x12, 0x5c, 0x0a, 0x1b, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x5f, 0x72, - 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, - 0x76, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x61, + 0x78, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, + 0x67, 0x65, 0x12, 0x2b, 0x0a, 0x11, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x65, + 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x73, 0x12, + 0x22, 0x0a, 0x0d, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x78, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x54, 0x6f, + 0x4d, 0x61, 0x78, 0x12, 0x43, 0x0a, 0x1e, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x63, + 0x75, 0x74, 0x6f, 0x66, 0x66, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x1b, 0x66, 0x75, 0x6c, + 0x6c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x66, 0x66, + 0x69, 0x63, 0x43, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x12, 0x52, 0x0a, 0x16, 0x6d, 0x69, 0x6e, 0x5f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x61, 0x6c, 0x66, 0x77, + 0x61, 0x79, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, - 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x19, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x52, - 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, - 0x65, 0x12, 0x67, 0x0a, 0x21, 0x62, 0x61, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x1e, 0x62, 0x61, 0x64, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x12, 0x56, 0x0a, 0x18, 0x69, 0x6e, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, 0x5f, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x61, 0x6c, 0x66, 0x77, 0x61, 0x79, 0x12, 0x41, 0x0a, 0x1d, + 0x6d, 0x69, 0x6e, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, + 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x63, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x18, 0x0a, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x1a, 0x6d, 0x69, 0x6e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x54, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x43, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x12, + 0x52, 0x0a, 0x16, 0x6d, 0x69, 0x73, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, + 0x67, 0x65, 0x5f, 0x63, 0x75, 0x74, 0x6f, 0x66, 0x66, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x6d, + 0x69, 0x73, 0x73, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x43, 0x75, 0x74, + 0x6f, 0x66, 0x66, 0x12, 0x50, 0x0a, 0x15, 0x6d, 0x69, 0x73, 0x73, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x18, 0x0c, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, + 0x52, 0x13, 0x6d, 0x69, 0x73, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x73, 0x50, 0x65, + 0x6e, 0x61, 0x6c, 0x74, 0x79, 0x12, 0x31, 0x0a, 0x14, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x0d, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x13, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x45, 0x78, + 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2b, 0x0a, 0x11, 0x74, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x61, 0x64, 0x76, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x10, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x41, 0x64, + 0x76, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x40, 0x0a, 0x1d, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, + 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x6b, 0x62, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x65, 0x73, + 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x50, 0x65, 0x72, + 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4b, 0x62, 0x12, 0x5c, 0x0a, 0x1b, 0x69, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x5f, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, + 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x16, 0x69, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x12, 0x56, 0x0a, 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x67, - 0x6f, 0x6f, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x13, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, - 0x61, 0x6c, 0x52, 0x16, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x47, 0x6f, 0x6f, 0x64, - 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x54, 0x0a, 0x17, 0x64, 0x6f, - 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x62, 0x61, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, - 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x15, 0x64, 0x6f, 0x77, 0x6e, 0x74, - 0x69, 0x6d, 0x65, 0x42, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, - 0x12, 0x4e, 0x0a, 0x14, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x68, 0x5f, 0x74, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x12, 0x64, 0x6f, - 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, - 0x12, 0x5e, 0x0a, 0x1c, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x72, 0x65, 0x70, - 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, - 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x1a, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x52, 0x65, - 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, 0x65, 0x72, 0x76, 0x65, - 0x12, 0x54, 0x0a, 0x17, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, - 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x17, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, - 0x15, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x54, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x69, 0x6e, 0x6f, 0x6d, 0x5f, - 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x30, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0b, 0x62, 0x69, 0x6e, - 0x6f, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x50, 0x30, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xd8, - 0x03, 0x0a, 0x0e, 0x50, 0x6f, 0x43, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x03, - 0x64, 0x69, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x5f, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x4c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x17, - 0x0a, 0x07, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x0a, 0x6e, 0x5f, 0x6b, 0x76, 0x5f, - 0x68, 0x65, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x6e, 0x4b, 0x76, - 0x48, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x63, 0x61, 0x62, 0x5f, 0x73, - 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x76, 0x6f, 0x63, 0x61, 0x62, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x66, 0x66, 0x6e, 0x5f, 0x64, 0x69, 0x6d, 0x5f, - 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x19, 0x69, 0x6e, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x52, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x12, 0x67, 0x0a, 0x21, 0x62, 0x61, 0x64, 0x5f, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x11, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x10, - 0x66, 0x66, 0x6e, 0x44, 0x69, 0x6d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, - 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x5f, 0x6f, 0x66, 0x18, - 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, 0x4f, - 0x66, 0x12, 0x37, 0x0a, 0x08, 0x6e, 0x6f, 0x72, 0x6d, 0x5f, 0x65, 0x70, 0x73, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, - 0x6c, 0x52, 0x07, 0x6e, 0x6f, 0x72, 0x6d, 0x45, 0x70, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x6f, - 0x70, 0x65, 0x5f, 0x74, 0x68, 0x65, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, - 0x72, 0x6f, 0x70, 0x65, 0x54, 0x68, 0x65, 0x74, 0x61, 0x12, 0x26, 0x0a, 0x0f, 0x75, 0x73, 0x65, - 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x70, 0x65, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x52, 0x6f, 0x70, - 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x65, 0x71, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x0b, 0x20, 0x01, - 0x28, 0x05, 0x52, 0x06, 0x73, 0x65, 0x71, 0x4c, 0x65, 0x6e, 0x12, 0x37, 0x0a, 0x08, 0x72, 0x5f, - 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x07, 0x72, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xe5, 0x01, 0x0a, 0x11, 0x50, 0x6f, - 0x43, 0x53, 0x74, 0x61, 0x74, 0x54, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x43, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, - 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x54, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x5f, 0x6d, 0x69, 0x73, 0x6d, 0x61, 0x74, - 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x1e, + 0x62, 0x61, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x6e, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x61, 0x74, 0x65, 0x12, 0x56, + 0x0a, 0x18, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x68, + 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x12, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x16, + 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x56, 0x0a, 0x18, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x5f, 0x67, 0x6f, 0x6f, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, + 0x67, 0x65, 0x18, 0x13, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, - 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x09, 0x70, 0x4d, 0x69, 0x73, 0x6d, 0x61, 0x74, 0x63, - 0x68, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x5f, 0x74, 0x68, 0x72, - 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x70, 0x56, 0x61, 0x6c, - 0x75, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, - 0x01, 0x22, 0xb6, 0x04, 0x0a, 0x09, 0x50, 0x6f, 0x63, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, - 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x64, 0x69, 0x66, 0x66, 0x69, - 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x11, 0x64, 0x65, 0x66, - 0x61, 0x75, 0x6c, 0x74, 0x44, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x12, 0x34, - 0x0a, 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x14, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, - 0x53, 0x69, 0x7a, 0x65, 0x12, 0x46, 0x0a, 0x20, 0x70, 0x6f, 0x63, 0x5f, 0x64, 0x61, 0x74, 0x61, - 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x74, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1c, - 0x70, 0x6f, 0x63, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x4c, 0x0a, 0x13, - 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x5f, 0x66, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x11, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x53, - 0x63, 0x61, 0x6c, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4a, 0x0a, 0x0c, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, - 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, - 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x65, 0x71, 0x5f, 0x6c, 0x65, 0x6e, 0x18, 0x07, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x06, 0x73, 0x65, 0x71, 0x4c, 0x65, 0x6e, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x6f, - 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x08, 0x20, 0x01, - 0x28, 0x08, 0x52, 0x0c, 0x70, 0x6f, 0x63, 0x56, 0x32, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x12, - 0x43, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x18, 0x0a, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x53, 0x74, 0x61, 0x74, - 0x54, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x08, 0x73, 0x74, 0x61, 0x74, - 0x54, 0x65, 0x73, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x41, 0x0a, 0x07, 0x44, 0x65, - 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, - 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, - 0x78, 0x70, 0x6f, 0x6e, 0x65, 0x6e, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x8b, 0x04, - 0x0a, 0x10, 0x43, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x12, 0x52, 0x0a, 0x16, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x66, 0x72, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x16, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x47, 0x6f, 0x6f, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x12, 0x54, + 0x0a, 0x17, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x62, 0x61, 0x64, 0x5f, 0x70, + 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x18, 0x14, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x15, 0x64, + 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x42, 0x61, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, + 0x74, 0x61, 0x67, 0x65, 0x12, 0x4e, 0x0a, 0x14, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x15, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, - 0x52, 0x14, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, - 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x12, 0x54, 0x0a, 0x17, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, - 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, - 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x15, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x6d, 0x0a, 0x24, - 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x5f, - 0x70, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, + 0x52, 0x12, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x48, 0x54, 0x68, 0x72, 0x65, 0x73, + 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x5e, 0x0a, 0x1c, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, + 0x5f, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x18, 0x16, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x21, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, - 0x6d, 0x65, 0x4d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, - 0x67, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x33, 0x0a, 0x16, 0x67, - 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x5f, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x67, 0x72, 0x61, - 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x12, 0x48, 0x0a, 0x11, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x62, 0x61, 0x73, 0x65, 0x57, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x59, 0x0a, 0x1a, 0x63, 0x6f, - 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x77, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x17, 0x63, 0x6f, - 0x6c, 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x57, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x55, 0x6e, 0x69, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xf3, 0x03, 0x0a, 0x13, - 0x42, 0x69, 0x74, 0x63, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x75, 0x73, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x63, 0x6f, - 0x69, 0x6e, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x11, 0x75, 0x73, 0x65, 0x42, 0x69, 0x74, 0x63, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x77, 0x61, - 0x72, 0x64, 0x73, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x12, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, - 0x65, 0x77, 0x61, 0x72, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x72, - 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x09, 0x64, 0x65, 0x63, 0x61, 0x79, 0x52, 0x61, - 0x74, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, - 0x69, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x56, 0x0a, 0x18, 0x75, 0x74, 0x69, 0x6c, 0x69, - 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x66, 0x61, 0x63, - 0x74, 0x6f, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x16, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x6f, 0x6e, 0x75, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, - 0x59, 0x0a, 0x1a, 0x66, 0x75, 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, - 0x5f, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, - 0x6c, 0x52, 0x17, 0x66, 0x75, 0x6c, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x42, - 0x6f, 0x6e, 0x75, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5f, 0x0a, 0x1d, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, - 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, + 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x1a, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, + 0x6d, 0x65, 0x52, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x65, 0x73, + 0x65, 0x72, 0x76, 0x65, 0x12, 0x54, 0x0a, 0x17, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x5f, 0x66, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x17, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, + 0x6d, 0x61, 0x6c, 0x52, 0x15, 0x71, 0x75, 0x69, 0x63, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x40, 0x0a, 0x0d, 0x62, 0x69, + 0x6e, 0x6f, 0x6d, 0x5f, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x70, 0x30, 0x18, 0x18, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, - 0x1a, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, - 0x42, 0x6f, 0x6e, 0x75, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, - 0x01, 0x22, 0xb0, 0x04, 0x0a, 0x14, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x72, 0x69, - 0x63, 0x69, 0x6e, 0x67, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x59, 0x0a, 0x1a, 0x73, 0x74, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x6c, 0x6f, 0x77, - 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, + 0x0b, 0x62, 0x69, 0x6e, 0x6f, 0x6d, 0x54, 0x65, 0x73, 0x74, 0x50, 0x30, 0x3a, 0x04, 0xe8, 0xa0, + 0x1f, 0x01, 0x22, 0xd8, 0x03, 0x0a, 0x0e, 0x50, 0x6f, 0x43, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x64, 0x69, 0x6d, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x03, 0x64, 0x69, 0x6d, 0x12, 0x19, 0x0a, 0x08, 0x6e, 0x5f, 0x6c, 0x61, 0x79, + 0x65, 0x72, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x6e, 0x4c, 0x61, 0x79, 0x65, + 0x72, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x06, 0x6e, 0x48, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x0a, 0x6e, + 0x5f, 0x6b, 0x76, 0x5f, 0x68, 0x65, 0x61, 0x64, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x08, 0x6e, 0x4b, 0x76, 0x48, 0x65, 0x61, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x76, 0x6f, 0x63, + 0x61, 0x62, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x76, + 0x6f, 0x63, 0x61, 0x62, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x4a, 0x0a, 0x12, 0x66, 0x66, 0x6e, 0x5f, + 0x64, 0x69, 0x6d, 0x5f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x69, 0x65, 0x72, 0x18, 0x06, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, + 0x61, 0x6c, 0x52, 0x10, 0x66, 0x66, 0x6e, 0x44, 0x69, 0x6d, 0x4d, 0x75, 0x6c, 0x74, 0x69, 0x70, + 0x6c, 0x69, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x70, 0x6c, 0x65, + 0x5f, 0x6f, 0x66, 0x18, 0x07, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x6d, 0x75, 0x6c, 0x74, 0x69, + 0x70, 0x6c, 0x65, 0x4f, 0x66, 0x12, 0x37, 0x0a, 0x08, 0x6e, 0x6f, 0x72, 0x6d, 0x5f, 0x65, 0x70, + 0x73, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, + 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x07, 0x6e, 0x6f, 0x72, 0x6d, 0x45, 0x70, 0x73, 0x12, 0x1d, + 0x0a, 0x0a, 0x72, 0x6f, 0x70, 0x65, 0x5f, 0x74, 0x68, 0x65, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x09, 0x72, 0x6f, 0x70, 0x65, 0x54, 0x68, 0x65, 0x74, 0x61, 0x12, 0x26, 0x0a, + 0x0f, 0x75, 0x73, 0x65, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, 0x64, 0x5f, 0x72, 0x6f, 0x70, 0x65, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0d, 0x75, 0x73, 0x65, 0x53, 0x63, 0x61, 0x6c, 0x65, + 0x64, 0x52, 0x6f, 0x70, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x65, 0x71, 0x5f, 0x6c, 0x65, 0x6e, + 0x18, 0x0b, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x73, 0x65, 0x71, 0x4c, 0x65, 0x6e, 0x12, 0x37, + 0x0a, 0x08, 0x72, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x07, + 0x72, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xe5, 0x01, + 0x0a, 0x11, 0x50, 0x6f, 0x43, 0x53, 0x74, 0x61, 0x74, 0x54, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x43, 0x0a, 0x0e, 0x64, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x68, 0x72, 0x65, + 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x54, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3b, 0x0a, 0x0a, 0x70, 0x5f, 0x6d, 0x69, + 0x73, 0x6d, 0x61, 0x74, 0x63, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x09, 0x70, 0x4d, 0x69, 0x73, + 0x6d, 0x61, 0x74, 0x63, 0x68, 0x12, 0x48, 0x0a, 0x11, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x75, 0x65, + 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, + 0x70, 0x56, 0x61, 0x6c, 0x75, 0x65, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x3a, + 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x9d, 0x05, 0x0a, 0x09, 0x50, 0x6f, 0x63, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x2d, 0x0a, 0x12, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x5f, 0x64, + 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x11, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x44, 0x69, 0x66, 0x66, 0x69, 0x63, 0x75, 0x6c, + 0x74, 0x79, 0x12, 0x34, 0x0a, 0x16, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x73, 0x69, 0x7a, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x14, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x61, + 0x6d, 0x70, 0x6c, 0x65, 0x53, 0x69, 0x7a, 0x65, 0x12, 0x46, 0x0a, 0x20, 0x70, 0x6f, 0x63, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x5f, 0x70, 0x72, 0x75, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x1c, 0x70, 0x6f, 0x63, 0x44, 0x61, 0x74, 0x61, 0x50, 0x72, 0x75, 0x6e, 0x69, + 0x6e, 0x67, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x12, 0x4c, 0x0a, 0x13, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x73, 0x63, 0x61, 0x6c, 0x65, + 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x11, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x53, 0x63, 0x61, 0x6c, 0x65, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x4a, + 0x0a, 0x0c, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x73, 0x65, 0x71, 0x5f, 0x6c, 0x65, 0x6e, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x73, 0x65, 0x71, 0x4c, 0x65, 0x6e, 0x12, 0x24, + 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x08, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x70, 0x6f, 0x63, 0x56, 0x32, 0x45, 0x6e, 0x61, + 0x62, 0x6c, 0x65, 0x64, 0x12, 0x3d, 0x0a, 0x1b, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x65, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x18, 0x09, 0x20, 0x01, 0x28, 0x08, 0x52, 0x18, 0x63, 0x6f, 0x6e, 0x66, 0x69, + 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x45, 0x6e, 0x61, 0x62, + 0x6c, 0x65, 0x64, 0x12, 0x43, 0x0a, 0x09, 0x73, 0x74, 0x61, 0x74, 0x5f, 0x74, 0x65, 0x73, 0x74, + 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, + 0x53, 0x74, 0x61, 0x74, 0x54, 0x65, 0x73, 0x74, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x08, + 0x73, 0x74, 0x61, 0x74, 0x54, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6c, 0x6f, 0x74, 0x73, 0x18, 0x0b, 0x20, 0x01, + 0x28, 0x0d, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6c, + 0x6f, 0x74, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x70, 0x6f, 0x63, 0x5f, 0x6e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, + 0x18, 0x0c, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x70, 0x6f, 0x63, 0x4e, 0x6f, 0x72, 0x6d, 0x61, + 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x3a, + 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x41, 0x0a, 0x07, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x08, 0x65, 0x78, 0x70, 0x6f, 0x6e, 0x65, + 0x6e, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x8b, 0x04, 0x0a, 0x10, 0x43, 0x6f, 0x6c, + 0x6c, 0x61, 0x74, 0x65, 0x72, 0x61, 0x6c, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x52, 0x0a, + 0x16, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x14, 0x73, 0x6c, 0x61, + 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x12, 0x54, 0x0a, 0x17, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, + 0x52, 0x15, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x44, + 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x12, 0x6d, 0x0a, 0x24, 0x64, 0x6f, 0x77, 0x6e, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x6d, 0x69, 0x73, 0x73, 0x65, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x63, 0x65, + 0x6e, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, + 0x6d, 0x61, 0x6c, 0x52, 0x21, 0x64, 0x6f, 0x77, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x4d, 0x69, 0x73, + 0x73, 0x65, 0x64, 0x50, 0x65, 0x72, 0x63, 0x65, 0x6e, 0x74, 0x61, 0x67, 0x65, 0x54, 0x68, 0x72, + 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x33, 0x0a, 0x16, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, + 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x67, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x48, 0x0a, 0x11, 0x62, + 0x61, 0x73, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x72, 0x61, 0x74, 0x69, 0x6f, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, + 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x62, 0x61, 0x73, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x52, 0x61, 0x74, 0x69, 0x6f, 0x12, 0x59, 0x0a, 0x1a, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, + 0x72, 0x61, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x75, + 0x6e, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x17, 0x63, 0x6f, 0x6c, 0x6c, 0x61, 0x74, 0x65, + 0x72, 0x61, 0x6c, 0x50, 0x65, 0x72, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x55, 0x6e, 0x69, 0x74, + 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xf3, 0x03, 0x0a, 0x13, 0x42, 0x69, 0x74, 0x63, 0x6f, + 0x69, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2e, + 0x0a, 0x13, 0x75, 0x73, 0x65, 0x5f, 0x62, 0x69, 0x74, 0x63, 0x6f, 0x69, 0x6e, 0x5f, 0x72, 0x65, + 0x77, 0x61, 0x72, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x75, 0x73, 0x65, + 0x42, 0x69, 0x74, 0x63, 0x6f, 0x69, 0x6e, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x30, + 0x0a, 0x14, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, + 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x77, 0x61, 0x72, 0x64, + 0x12, 0x3b, 0x0a, 0x0a, 0x64, 0x65, 0x63, 0x61, 0x79, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, + 0x61, 0x6c, 0x52, 0x09, 0x64, 0x65, 0x63, 0x61, 0x79, 0x52, 0x61, 0x74, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x12, 0x56, 0x0a, 0x18, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, + 0x61, 0x6c, 0x52, 0x16, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x42, + 0x6f, 0x6e, 0x75, 0x73, 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x59, 0x0a, 0x1a, 0x66, 0x75, + 0x6c, 0x6c, 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x6f, 0x6e, 0x75, + 0x73, 0x5f, 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x17, 0x73, 0x74, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5a, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x77, 0x65, 0x72, - 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x59, 0x0a, 0x1a, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, - 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x17, 0x66, 0x75, + 0x6c, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x42, 0x6f, 0x6e, 0x75, 0x73, 0x46, + 0x61, 0x63, 0x74, 0x6f, 0x72, 0x12, 0x5f, 0x0a, 0x1d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, + 0x5f, 0x63, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x62, 0x6f, 0x6e, 0x75, 0x73, 0x5f, + 0x66, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x1a, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x61, 0x6c, 0x43, 0x6f, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x42, 0x6f, 0x6e, 0x75, 0x73, + 0x46, 0x61, 0x63, 0x74, 0x6f, 0x72, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xb0, 0x04, 0x0a, + 0x14, 0x44, 0x79, 0x6e, 0x61, 0x6d, 0x69, 0x63, 0x50, 0x72, 0x69, 0x63, 0x69, 0x6e, 0x67, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x59, 0x0a, 0x1a, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x5f, 0x7a, 0x6f, 0x6e, 0x65, 0x5f, 0x6c, 0x6f, 0x77, 0x65, 0x72, 0x5f, 0x62, 0x6f, + 0x75, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x17, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, - 0x74, 0x79, 0x5a, 0x6f, 0x6e, 0x65, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, - 0x12, 0x47, 0x0a, 0x10, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, - 0x63, 0x69, 0x74, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x45, - 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x1b, 0x75, 0x74, 0x69, - 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, - 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, - 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, - 0x77, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x69, 0x6e, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x50, 0x65, 0x72, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x62, 0x61, 0x73, 0x65, - 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x62, 0x61, 0x73, 0x65, 0x50, 0x65, 0x72, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x67, 0x72, 0x61, - 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x67, 0x72, 0x61, 0x63, 0x65, - 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x45, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3e, - 0x0a, 0x1c, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x70, - 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x18, 0x67, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, - 0x64, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x3a, 0x04, - 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xa7, 0x04, 0x0a, 0x15, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, - 0x74, 0x68, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x40, - 0x0a, 0x1d, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, - 0x74, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6b, 0x62, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, - 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4b, 0x62, - 0x12, 0x49, 0x0a, 0x12, 0x6b, 0x62, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x6b, 0x62, 0x50, 0x65, - 0x72, 0x49, 0x6e, 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x4b, 0x0a, 0x13, 0x6b, - 0x62, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, - 0x65, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, - 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x10, 0x6b, 0x62, 0x50, 0x65, 0x72, 0x4f, 0x75, 0x74, - 0x70, 0x75, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x2f, 0x0a, 0x13, 0x69, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, - 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, - 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x61, 0x6d, - 0x70, 0x6c, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x69, 0x6e, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x5f, 0x63, 0x75, 0x72, 0x76, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x69, 0x6e, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, - 0x43, 0x75, 0x72, 0x76, 0x65, 0x12, 0x48, 0x0a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, - 0x5f, 0x63, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x1e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x49, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, - 0x37, 0x0a, 0x18, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xae, - 0x02, 0x0a, 0x15, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x43, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x20, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x1d, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x12, 0x45, 0x0a, 0x0f, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, - 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x54, - 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0e, 0x73, 0x6c, 0x61, 0x73, - 0x68, 0x5f, 0x66, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0d, - 0x73, 0x6c, 0x61, 0x73, 0x68, 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, - 0x19, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x17, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, - 0xc9, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x47, 0x75, 0x61, 0x72, 0x64, - 0x69, 0x61, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x6e, 0x65, 0x74, - 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x6e, - 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x54, 0x68, - 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x3d, 0x0a, 0x1b, 0x6e, 0x65, 0x74, 0x77, 0x6f, - 0x72, 0x6b, 0x5f, 0x6d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x6e, 0x65, - 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x4d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4d, 0x69, 0x6e, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, - 0x61, 0x6e, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x11, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x8b, 0x01, 0x0a, 0x15, - 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x10, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x12, 0x3e, 0x0a, 0x1b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x64, - 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x19, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, - 0x64, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xd1, 0x02, 0x0a, 0x17, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x58, 0x0a, 0x29, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x25, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, - 0x42, 0x0a, 0x1d, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x1b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x12, 0x3a, 0x0a, 0x19, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x75, 0x73, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x12, - 0x56, 0x0a, 0x28, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, - 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x24, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, - 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x42, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x5f, 0x0a, - 0x19, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x42, 0xb9, - 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0b, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, - 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xa2, - 0x02, 0x03, 0x49, 0x49, 0x58, 0xaa, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xca, 0x02, 0x13, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0xe2, 0x02, 0x1f, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0xea, 0x02, 0x14, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, - 0x3a, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x33, + 0x74, 0x79, 0x5a, 0x6f, 0x6e, 0x65, 0x4c, 0x6f, 0x77, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, + 0x12, 0x59, 0x0a, 0x1a, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5f, 0x7a, 0x6f, + 0x6e, 0x65, 0x5f, 0x75, 0x70, 0x70, 0x65, 0x72, 0x5f, 0x62, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, + 0x61, 0x6c, 0x52, 0x17, 0x73, 0x74, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x5a, 0x6f, 0x6e, + 0x65, 0x55, 0x70, 0x70, 0x65, 0x72, 0x42, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x47, 0x0a, 0x10, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x5f, 0x65, 0x6c, 0x61, 0x73, 0x74, 0x69, 0x63, 0x69, 0x74, 0x79, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, + 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x45, 0x6c, 0x61, 0x73, 0x74, 0x69, + 0x63, 0x69, 0x74, 0x79, 0x12, 0x3e, 0x0a, 0x1b, 0x75, 0x74, 0x69, 0x6c, 0x69, 0x7a, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x64, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x75, 0x74, 0x69, 0x6c, 0x69, + 0x7a, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x44, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x69, 0x6e, 0x5f, 0x70, 0x65, 0x72, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x10, 0x6d, 0x69, 0x6e, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x12, 0x2f, 0x0a, 0x14, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x5f, + 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x11, 0x62, 0x61, 0x73, 0x65, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x12, 0x33, 0x0a, 0x16, 0x67, 0x72, 0x61, 0x63, 0x65, 0x5f, 0x70, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x13, 0x67, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, + 0x64, 0x45, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3e, 0x0a, 0x1c, 0x67, 0x72, 0x61, + 0x63, 0x65, 0x5f, 0x70, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x18, 0x67, 0x72, 0x61, 0x63, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x50, 0x65, 0x72, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, + 0xa7, 0x04, 0x0a, 0x15, 0x42, 0x61, 0x6e, 0x64, 0x77, 0x69, 0x64, 0x74, 0x68, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x40, 0x0a, 0x1d, 0x65, 0x73, 0x74, + 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x73, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6b, 0x62, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x19, 0x65, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, 0x65, 0x64, 0x4c, 0x69, 0x6d, 0x69, 0x74, + 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x4b, 0x62, 0x12, 0x49, 0x0a, 0x12, 0x6b, + 0x62, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x69, 0x6e, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, + 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0f, 0x6b, 0x62, 0x50, 0x65, 0x72, 0x49, 0x6e, 0x70, 0x75, + 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x4b, 0x0a, 0x13, 0x6b, 0x62, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x6f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, + 0x6c, 0x52, 0x10, 0x6b, 0x62, 0x50, 0x65, 0x72, 0x4f, 0x75, 0x74, 0x70, 0x75, 0x74, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x12, 0x2f, 0x0a, 0x13, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x12, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, + 0x69, 0x6d, 0x69, 0x74, 0x12, 0x3e, 0x0a, 0x1b, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x73, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x5f, 0x70, 0x65, 0x72, + 0x69, 0x6f, 0x64, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x19, 0x69, 0x6e, 0x76, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x53, 0x61, 0x6d, 0x70, 0x6c, 0x65, 0x50, 0x65, + 0x72, 0x69, 0x6f, 0x64, 0x12, 0x3a, 0x0a, 0x19, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x76, + 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x43, 0x75, 0x72, 0x76, 0x65, + 0x12, 0x48, 0x0a, 0x20, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x63, 0x6f, 0x6e, 0x63, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x6e, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x1e, 0x6d, 0x69, 0x6e, 0x69, + 0x6d, 0x75, 0x6d, 0x43, 0x6f, 0x6e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x49, 0x6e, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x37, 0x0a, 0x18, 0x6d, 0x61, + 0x78, 0x5f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x5f, 0x70, 0x65, 0x72, + 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x08, 0x20, 0x01, 0x28, 0x04, 0x52, 0x15, 0x6d, 0x61, + 0x78, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x50, 0x65, 0x72, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xae, 0x02, 0x0a, 0x15, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x12, 0x47, 0x0a, 0x20, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1d, 0x65, + 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x50, 0x65, 0x72, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x45, 0x0a, 0x0f, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, + 0x6d, 0x61, 0x6c, 0x52, 0x0e, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, + 0x6f, 0x6c, 0x64, 0x12, 0x43, 0x0a, 0x0e, 0x73, 0x6c, 0x61, 0x73, 0x68, 0x5f, 0x66, 0x72, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x44, 0x65, 0x63, 0x69, 0x6d, 0x61, 0x6c, 0x52, 0x0d, 0x73, 0x6c, 0x61, 0x73, 0x68, + 0x46, 0x72, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3a, 0x0a, 0x19, 0x75, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x77, + 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x17, 0x75, 0x70, 0x67, + 0x72, 0x61, 0x64, 0x65, 0x50, 0x72, 0x6f, 0x74, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, + 0x6e, 0x64, 0x6f, 0x77, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xc9, 0x01, 0x0a, 0x15, 0x47, + 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x47, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, + 0x6d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, + 0x6b, 0x4d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, + 0x6c, 0x64, 0x12, 0x3d, 0x0a, 0x1b, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x5f, 0x6d, 0x61, + 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x5f, 0x6d, 0x69, 0x6e, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, + 0x4d, 0x61, 0x74, 0x75, 0x72, 0x69, 0x74, 0x79, 0x4d, 0x69, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x2d, 0x0a, 0x12, 0x67, 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x09, 0x52, 0x11, 0x67, + 0x75, 0x61, 0x72, 0x64, 0x69, 0x61, 0x6e, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x8b, 0x01, 0x0a, 0x15, 0x44, 0x65, 0x76, 0x65, 0x6c, + 0x6f, 0x70, 0x65, 0x72, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x2c, 0x0a, 0x12, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x75, 0x6e, + 0x74, 0x69, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x3e, + 0x0a, 0x1b, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x5f, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x09, 0x52, 0x19, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, 0x44, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x3a, 0x04, + 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0xd1, 0x02, 0x0a, 0x17, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0x58, 0x0a, 0x29, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x25, 0x6e, 0x65, 0x77, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x52, 0x65, 0x67, 0x69, 0x73, 0x74, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x42, 0x0a, 0x1d, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, + 0x09, 0x52, 0x1b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x12, 0x3a, + 0x0a, 0x19, 0x75, 0x73, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x08, 0x52, 0x17, 0x75, 0x73, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, 0x73, 0x74, 0x12, 0x56, 0x0a, 0x28, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, + 0x69, 0x73, 0x74, 0x5f, 0x75, 0x6e, 0x74, 0x69, 0x6c, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x24, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x6c, 0x69, + 0x73, 0x74, 0x55, 0x6e, 0x74, 0x69, 0x6c, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x22, 0x5f, 0x0a, 0x19, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x63, 0x63, 0x65, 0x73, 0x73, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x65, 0x64, + 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x18, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x65, 0x64, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x3a, 0x04, 0xe8, 0xa0, 0x1f, 0x01, 0x42, 0xb9, 0x01, 0x0a, 0x17, 0x63, 0x6f, + 0x6d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0b, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x50, 0x72, 0x6f, + 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, + 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xa2, 0x02, 0x03, 0x49, 0x49, 0x58, + 0xaa, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xca, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xe2, 0x02, 0x1f, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, + 0x14, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x3a, 0x49, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/inference-chain/api/inference/inference/poc_validation_snapshot.pulsar.go b/inference-chain/api/inference/inference/poc_validation_snapshot.pulsar.go new file mode 100644 index 000000000..cdbe99524 --- /dev/null +++ b/inference-chain/api/inference/inference/poc_validation_snapshot.pulsar.go @@ -0,0 +1,1490 @@ +// Code generated by protoc-gen-go-pulsar. DO NOT EDIT. +package inference + +import ( + fmt "fmt" + runtime "github.com/cosmos/cosmos-proto/runtime" + protoreflect "google.golang.org/protobuf/reflect/protoreflect" + protoiface "google.golang.org/protobuf/runtime/protoiface" + protoimpl "google.golang.org/protobuf/runtime/protoimpl" + io "io" + reflect "reflect" + sync "sync" +) + +var _ protoreflect.List = (*_PoCValidationSnapshot_4_list)(nil) + +type _PoCValidationSnapshot_4_list struct { + list *[]*ValidatorWeight +} + +func (x *_PoCValidationSnapshot_4_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_PoCValidationSnapshot_4_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect()) +} + +func (x *_PoCValidationSnapshot_4_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*ValidatorWeight) + (*x.list)[i] = concreteValue +} + +func (x *_PoCValidationSnapshot_4_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*ValidatorWeight) + *x.list = append(*x.list, concreteValue) +} + +func (x *_PoCValidationSnapshot_4_list) AppendMutable() protoreflect.Value { + v := new(ValidatorWeight) + *x.list = append(*x.list, v) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_PoCValidationSnapshot_4_list) Truncate(n int) { + for i := n; i < len(*x.list); i++ { + (*x.list)[i] = nil + } + *x.list = (*x.list)[:n] +} + +func (x *_PoCValidationSnapshot_4_list) NewElement() protoreflect.Value { + v := new(ValidatorWeight) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_PoCValidationSnapshot_4_list) IsValid() bool { + return x.list != nil +} + +var ( + md_PoCValidationSnapshot protoreflect.MessageDescriptor + fd_PoCValidationSnapshot_poc_stage_start_height protoreflect.FieldDescriptor + fd_PoCValidationSnapshot_snapshot_height protoreflect.FieldDescriptor + fd_PoCValidationSnapshot_app_hash protoreflect.FieldDescriptor + fd_PoCValidationSnapshot_validator_weights protoreflect.FieldDescriptor + fd_PoCValidationSnapshot_generation_start_timestamp protoreflect.FieldDescriptor + fd_PoCValidationSnapshot_exchange_end_timestamp protoreflect.FieldDescriptor +) + +func init() { + file_inference_inference_poc_validation_snapshot_proto_init() + md_PoCValidationSnapshot = File_inference_inference_poc_validation_snapshot_proto.Messages().ByName("PoCValidationSnapshot") + fd_PoCValidationSnapshot_poc_stage_start_height = md_PoCValidationSnapshot.Fields().ByName("poc_stage_start_height") + fd_PoCValidationSnapshot_snapshot_height = md_PoCValidationSnapshot.Fields().ByName("snapshot_height") + fd_PoCValidationSnapshot_app_hash = md_PoCValidationSnapshot.Fields().ByName("app_hash") + fd_PoCValidationSnapshot_validator_weights = md_PoCValidationSnapshot.Fields().ByName("validator_weights") + fd_PoCValidationSnapshot_generation_start_timestamp = md_PoCValidationSnapshot.Fields().ByName("generation_start_timestamp") + fd_PoCValidationSnapshot_exchange_end_timestamp = md_PoCValidationSnapshot.Fields().ByName("exchange_end_timestamp") +} + +var _ protoreflect.Message = (*fastReflection_PoCValidationSnapshot)(nil) + +type fastReflection_PoCValidationSnapshot PoCValidationSnapshot + +func (x *PoCValidationSnapshot) ProtoReflect() protoreflect.Message { + return (*fastReflection_PoCValidationSnapshot)(x) +} + +func (x *PoCValidationSnapshot) slowProtoReflect() protoreflect.Message { + mi := &file_inference_inference_poc_validation_snapshot_proto_msgTypes[0] + 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_PoCValidationSnapshot_messageType fastReflection_PoCValidationSnapshot_messageType +var _ protoreflect.MessageType = fastReflection_PoCValidationSnapshot_messageType{} + +type fastReflection_PoCValidationSnapshot_messageType struct{} + +func (x fastReflection_PoCValidationSnapshot_messageType) Zero() protoreflect.Message { + return (*fastReflection_PoCValidationSnapshot)(nil) +} +func (x fastReflection_PoCValidationSnapshot_messageType) New() protoreflect.Message { + return new(fastReflection_PoCValidationSnapshot) +} +func (x fastReflection_PoCValidationSnapshot_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_PoCValidationSnapshot +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_PoCValidationSnapshot) Descriptor() protoreflect.MessageDescriptor { + return md_PoCValidationSnapshot +} + +// 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_PoCValidationSnapshot) Type() protoreflect.MessageType { + return _fastReflection_PoCValidationSnapshot_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_PoCValidationSnapshot) New() protoreflect.Message { + return new(fastReflection_PoCValidationSnapshot) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_PoCValidationSnapshot) Interface() protoreflect.ProtoMessage { + return (*PoCValidationSnapshot)(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_PoCValidationSnapshot) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.PocStageStartHeight != int64(0) { + value := protoreflect.ValueOfInt64(x.PocStageStartHeight) + if !f(fd_PoCValidationSnapshot_poc_stage_start_height, value) { + return + } + } + if x.SnapshotHeight != int64(0) { + value := protoreflect.ValueOfInt64(x.SnapshotHeight) + if !f(fd_PoCValidationSnapshot_snapshot_height, value) { + return + } + } + if x.AppHash != "" { + value := protoreflect.ValueOfString(x.AppHash) + if !f(fd_PoCValidationSnapshot_app_hash, value) { + return + } + } + if len(x.ValidatorWeights) != 0 { + value := protoreflect.ValueOfList(&_PoCValidationSnapshot_4_list{list: &x.ValidatorWeights}) + if !f(fd_PoCValidationSnapshot_validator_weights, value) { + return + } + } + if x.GenerationStartTimestamp != int64(0) { + value := protoreflect.ValueOfInt64(x.GenerationStartTimestamp) + if !f(fd_PoCValidationSnapshot_generation_start_timestamp, value) { + return + } + } + if x.ExchangeEndTimestamp != int64(0) { + value := protoreflect.ValueOfInt64(x.ExchangeEndTimestamp) + if !f(fd_PoCValidationSnapshot_exchange_end_timestamp, 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_PoCValidationSnapshot) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "inference.inference.PoCValidationSnapshot.poc_stage_start_height": + return x.PocStageStartHeight != int64(0) + case "inference.inference.PoCValidationSnapshot.snapshot_height": + return x.SnapshotHeight != int64(0) + case "inference.inference.PoCValidationSnapshot.app_hash": + return x.AppHash != "" + case "inference.inference.PoCValidationSnapshot.validator_weights": + return len(x.ValidatorWeights) != 0 + case "inference.inference.PoCValidationSnapshot.generation_start_timestamp": + return x.GenerationStartTimestamp != int64(0) + case "inference.inference.PoCValidationSnapshot.exchange_end_timestamp": + return x.ExchangeEndTimestamp != int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PoCValidationSnapshot")) + } + panic(fmt.Errorf("message inference.inference.PoCValidationSnapshot 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_PoCValidationSnapshot) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "inference.inference.PoCValidationSnapshot.poc_stage_start_height": + x.PocStageStartHeight = int64(0) + case "inference.inference.PoCValidationSnapshot.snapshot_height": + x.SnapshotHeight = int64(0) + case "inference.inference.PoCValidationSnapshot.app_hash": + x.AppHash = "" + case "inference.inference.PoCValidationSnapshot.validator_weights": + x.ValidatorWeights = nil + case "inference.inference.PoCValidationSnapshot.generation_start_timestamp": + x.GenerationStartTimestamp = int64(0) + case "inference.inference.PoCValidationSnapshot.exchange_end_timestamp": + x.ExchangeEndTimestamp = int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PoCValidationSnapshot")) + } + panic(fmt.Errorf("message inference.inference.PoCValidationSnapshot 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_PoCValidationSnapshot) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "inference.inference.PoCValidationSnapshot.poc_stage_start_height": + value := x.PocStageStartHeight + return protoreflect.ValueOfInt64(value) + case "inference.inference.PoCValidationSnapshot.snapshot_height": + value := x.SnapshotHeight + return protoreflect.ValueOfInt64(value) + case "inference.inference.PoCValidationSnapshot.app_hash": + value := x.AppHash + return protoreflect.ValueOfString(value) + case "inference.inference.PoCValidationSnapshot.validator_weights": + if len(x.ValidatorWeights) == 0 { + return protoreflect.ValueOfList(&_PoCValidationSnapshot_4_list{}) + } + listValue := &_PoCValidationSnapshot_4_list{list: &x.ValidatorWeights} + return protoreflect.ValueOfList(listValue) + case "inference.inference.PoCValidationSnapshot.generation_start_timestamp": + value := x.GenerationStartTimestamp + return protoreflect.ValueOfInt64(value) + case "inference.inference.PoCValidationSnapshot.exchange_end_timestamp": + value := x.ExchangeEndTimestamp + return protoreflect.ValueOfInt64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PoCValidationSnapshot")) + } + panic(fmt.Errorf("message inference.inference.PoCValidationSnapshot 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_PoCValidationSnapshot) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "inference.inference.PoCValidationSnapshot.poc_stage_start_height": + x.PocStageStartHeight = value.Int() + case "inference.inference.PoCValidationSnapshot.snapshot_height": + x.SnapshotHeight = value.Int() + case "inference.inference.PoCValidationSnapshot.app_hash": + x.AppHash = value.Interface().(string) + case "inference.inference.PoCValidationSnapshot.validator_weights": + lv := value.List() + clv := lv.(*_PoCValidationSnapshot_4_list) + x.ValidatorWeights = *clv.list + case "inference.inference.PoCValidationSnapshot.generation_start_timestamp": + x.GenerationStartTimestamp = value.Int() + case "inference.inference.PoCValidationSnapshot.exchange_end_timestamp": + x.ExchangeEndTimestamp = value.Int() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PoCValidationSnapshot")) + } + panic(fmt.Errorf("message inference.inference.PoCValidationSnapshot 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_PoCValidationSnapshot) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.PoCValidationSnapshot.validator_weights": + if x.ValidatorWeights == nil { + x.ValidatorWeights = []*ValidatorWeight{} + } + value := &_PoCValidationSnapshot_4_list{list: &x.ValidatorWeights} + return protoreflect.ValueOfList(value) + case "inference.inference.PoCValidationSnapshot.poc_stage_start_height": + panic(fmt.Errorf("field poc_stage_start_height of message inference.inference.PoCValidationSnapshot is not mutable")) + case "inference.inference.PoCValidationSnapshot.snapshot_height": + panic(fmt.Errorf("field snapshot_height of message inference.inference.PoCValidationSnapshot is not mutable")) + case "inference.inference.PoCValidationSnapshot.app_hash": + panic(fmt.Errorf("field app_hash of message inference.inference.PoCValidationSnapshot is not mutable")) + case "inference.inference.PoCValidationSnapshot.generation_start_timestamp": + panic(fmt.Errorf("field generation_start_timestamp of message inference.inference.PoCValidationSnapshot is not mutable")) + case "inference.inference.PoCValidationSnapshot.exchange_end_timestamp": + panic(fmt.Errorf("field exchange_end_timestamp of message inference.inference.PoCValidationSnapshot is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PoCValidationSnapshot")) + } + panic(fmt.Errorf("message inference.inference.PoCValidationSnapshot 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_PoCValidationSnapshot) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.PoCValidationSnapshot.poc_stage_start_height": + return protoreflect.ValueOfInt64(int64(0)) + case "inference.inference.PoCValidationSnapshot.snapshot_height": + return protoreflect.ValueOfInt64(int64(0)) + case "inference.inference.PoCValidationSnapshot.app_hash": + return protoreflect.ValueOfString("") + case "inference.inference.PoCValidationSnapshot.validator_weights": + list := []*ValidatorWeight{} + return protoreflect.ValueOfList(&_PoCValidationSnapshot_4_list{list: &list}) + case "inference.inference.PoCValidationSnapshot.generation_start_timestamp": + return protoreflect.ValueOfInt64(int64(0)) + case "inference.inference.PoCValidationSnapshot.exchange_end_timestamp": + return protoreflect.ValueOfInt64(int64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.PoCValidationSnapshot")) + } + panic(fmt.Errorf("message inference.inference.PoCValidationSnapshot 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_PoCValidationSnapshot) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in inference.inference.PoCValidationSnapshot", 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_PoCValidationSnapshot) 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_PoCValidationSnapshot) 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_PoCValidationSnapshot) 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_PoCValidationSnapshot) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*PoCValidationSnapshot) + 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.PocStageStartHeight != 0 { + n += 1 + runtime.Sov(uint64(x.PocStageStartHeight)) + } + if x.SnapshotHeight != 0 { + n += 1 + runtime.Sov(uint64(x.SnapshotHeight)) + } + l = len(x.AppHash) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if len(x.ValidatorWeights) > 0 { + for _, e := range x.ValidatorWeights { + l = options.Size(e) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if x.GenerationStartTimestamp != 0 { + n += 1 + runtime.Sov(uint64(x.GenerationStartTimestamp)) + } + if x.ExchangeEndTimestamp != 0 { + n += 1 + runtime.Sov(uint64(x.ExchangeEndTimestamp)) + } + 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().(*PoCValidationSnapshot) + 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.ExchangeEndTimestamp != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.ExchangeEndTimestamp)) + i-- + dAtA[i] = 0x30 + } + if x.GenerationStartTimestamp != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.GenerationStartTimestamp)) + i-- + dAtA[i] = 0x28 + } + if len(x.ValidatorWeights) > 0 { + for iNdEx := len(x.ValidatorWeights) - 1; iNdEx >= 0; iNdEx-- { + encoded, err := options.Marshal(x.ValidatorWeights[iNdEx]) + 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] = 0x22 + } + } + if len(x.AppHash) > 0 { + i -= len(x.AppHash) + copy(dAtA[i:], x.AppHash) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.AppHash))) + i-- + dAtA[i] = 0x1a + } + if x.SnapshotHeight != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.SnapshotHeight)) + i-- + dAtA[i] = 0x10 + } + if x.PocStageStartHeight != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.PocStageStartHeight)) + i-- + dAtA[i] = 0x8 + } + 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().(*PoCValidationSnapshot) + 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: PoCValidationSnapshot: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: PoCValidationSnapshot: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field PocStageStartHeight", wireType) + } + x.PocStageStartHeight = 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.PocStageStartHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field SnapshotHeight", wireType) + } + x.SnapshotHeight = 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.SnapshotHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field AppHash", 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.AppHash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ValidatorWeights", 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 + } + x.ValidatorWeights = append(x.ValidatorWeights, &ValidatorWeight{}) + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.ValidatorWeights[len(x.ValidatorWeights)-1]); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field GenerationStartTimestamp", wireType) + } + x.GenerationStartTimestamp = 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.GenerationStartTimestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field ExchangeEndTimestamp", wireType) + } + x.ExchangeEndTimestamp = 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.ExchangeEndTimestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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_ValidatorWeight protoreflect.MessageDescriptor + fd_ValidatorWeight_address protoreflect.FieldDescriptor + fd_ValidatorWeight_weight protoreflect.FieldDescriptor +) + +func init() { + file_inference_inference_poc_validation_snapshot_proto_init() + md_ValidatorWeight = File_inference_inference_poc_validation_snapshot_proto.Messages().ByName("ValidatorWeight") + fd_ValidatorWeight_address = md_ValidatorWeight.Fields().ByName("address") + fd_ValidatorWeight_weight = md_ValidatorWeight.Fields().ByName("weight") +} + +var _ protoreflect.Message = (*fastReflection_ValidatorWeight)(nil) + +type fastReflection_ValidatorWeight ValidatorWeight + +func (x *ValidatorWeight) ProtoReflect() protoreflect.Message { + return (*fastReflection_ValidatorWeight)(x) +} + +func (x *ValidatorWeight) slowProtoReflect() protoreflect.Message { + mi := &file_inference_inference_poc_validation_snapshot_proto_msgTypes[1] + 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_ValidatorWeight_messageType fastReflection_ValidatorWeight_messageType +var _ protoreflect.MessageType = fastReflection_ValidatorWeight_messageType{} + +type fastReflection_ValidatorWeight_messageType struct{} + +func (x fastReflection_ValidatorWeight_messageType) Zero() protoreflect.Message { + return (*fastReflection_ValidatorWeight)(nil) +} +func (x fastReflection_ValidatorWeight_messageType) New() protoreflect.Message { + return new(fastReflection_ValidatorWeight) +} +func (x fastReflection_ValidatorWeight_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_ValidatorWeight +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_ValidatorWeight) Descriptor() protoreflect.MessageDescriptor { + return md_ValidatorWeight +} + +// 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_ValidatorWeight) Type() protoreflect.MessageType { + return _fastReflection_ValidatorWeight_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_ValidatorWeight) New() protoreflect.Message { + return new(fastReflection_ValidatorWeight) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_ValidatorWeight) Interface() protoreflect.ProtoMessage { + return (*ValidatorWeight)(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_ValidatorWeight) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Address != "" { + value := protoreflect.ValueOfString(x.Address) + if !f(fd_ValidatorWeight_address, value) { + return + } + } + if x.Weight != int64(0) { + value := protoreflect.ValueOfInt64(x.Weight) + if !f(fd_ValidatorWeight_weight, 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_ValidatorWeight) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "inference.inference.ValidatorWeight.address": + return x.Address != "" + case "inference.inference.ValidatorWeight.weight": + return x.Weight != int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.ValidatorWeight")) + } + panic(fmt.Errorf("message inference.inference.ValidatorWeight 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_ValidatorWeight) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "inference.inference.ValidatorWeight.address": + x.Address = "" + case "inference.inference.ValidatorWeight.weight": + x.Weight = int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.ValidatorWeight")) + } + panic(fmt.Errorf("message inference.inference.ValidatorWeight 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_ValidatorWeight) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "inference.inference.ValidatorWeight.address": + value := x.Address + return protoreflect.ValueOfString(value) + case "inference.inference.ValidatorWeight.weight": + value := x.Weight + return protoreflect.ValueOfInt64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.ValidatorWeight")) + } + panic(fmt.Errorf("message inference.inference.ValidatorWeight 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_ValidatorWeight) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "inference.inference.ValidatorWeight.address": + x.Address = value.Interface().(string) + case "inference.inference.ValidatorWeight.weight": + x.Weight = value.Int() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.ValidatorWeight")) + } + panic(fmt.Errorf("message inference.inference.ValidatorWeight 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_ValidatorWeight) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.ValidatorWeight.address": + panic(fmt.Errorf("field address of message inference.inference.ValidatorWeight is not mutable")) + case "inference.inference.ValidatorWeight.weight": + panic(fmt.Errorf("field weight of message inference.inference.ValidatorWeight is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.ValidatorWeight")) + } + panic(fmt.Errorf("message inference.inference.ValidatorWeight 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_ValidatorWeight) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.ValidatorWeight.address": + return protoreflect.ValueOfString("") + case "inference.inference.ValidatorWeight.weight": + return protoreflect.ValueOfInt64(int64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.ValidatorWeight")) + } + panic(fmt.Errorf("message inference.inference.ValidatorWeight 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_ValidatorWeight) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in inference.inference.ValidatorWeight", 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_ValidatorWeight) 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_ValidatorWeight) 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_ValidatorWeight) 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_ValidatorWeight) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*ValidatorWeight) + 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.Address) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.Weight != 0 { + n += 1 + runtime.Sov(uint64(x.Weight)) + } + 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().(*ValidatorWeight) + 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.Weight != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.Weight)) + i-- + dAtA[i] = 0x10 + } + if len(x.Address) > 0 { + i -= len(x.Address) + copy(dAtA[i:], x.Address) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Address))) + 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().(*ValidatorWeight) + 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: ValidatorWeight: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: ValidatorWeight: 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 Address", 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.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Weight", wireType) + } + x.Weight = 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.Weight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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: inference/inference/poc_validation_snapshot.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) +) + +// PoCValidationSnapshot captures validator weights at validation phase start +// for deterministic sampling synchronization between chain and DAPI. +type PoCValidationSnapshot struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PocStageStartHeight int64 `protobuf:"varint,1,opt,name=poc_stage_start_height,json=pocStageStartHeight,proto3" json:"poc_stage_start_height,omitempty"` + SnapshotHeight int64 `protobuf:"varint,2,opt,name=snapshot_height,json=snapshotHeight,proto3" json:"snapshot_height,omitempty"` + AppHash string `protobuf:"bytes,3,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` + ValidatorWeights []*ValidatorWeight `protobuf:"bytes,4,rep,name=validator_weights,json=validatorWeights,proto3" json:"validator_weights,omitempty"` + GenerationStartTimestamp int64 `protobuf:"varint,5,opt,name=generation_start_timestamp,json=generationStartTimestamp,proto3" json:"generation_start_timestamp,omitempty"` + ExchangeEndTimestamp int64 `protobuf:"varint,6,opt,name=exchange_end_timestamp,json=exchangeEndTimestamp,proto3" json:"exchange_end_timestamp,omitempty"` +} + +func (x *PoCValidationSnapshot) Reset() { + *x = PoCValidationSnapshot{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_poc_validation_snapshot_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *PoCValidationSnapshot) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PoCValidationSnapshot) ProtoMessage() {} + +// Deprecated: Use PoCValidationSnapshot.ProtoReflect.Descriptor instead. +func (*PoCValidationSnapshot) Descriptor() ([]byte, []int) { + return file_inference_inference_poc_validation_snapshot_proto_rawDescGZIP(), []int{0} +} + +func (x *PoCValidationSnapshot) GetPocStageStartHeight() int64 { + if x != nil { + return x.PocStageStartHeight + } + return 0 +} + +func (x *PoCValidationSnapshot) GetSnapshotHeight() int64 { + if x != nil { + return x.SnapshotHeight + } + return 0 +} + +func (x *PoCValidationSnapshot) GetAppHash() string { + if x != nil { + return x.AppHash + } + return "" +} + +func (x *PoCValidationSnapshot) GetValidatorWeights() []*ValidatorWeight { + if x != nil { + return x.ValidatorWeights + } + return nil +} + +func (x *PoCValidationSnapshot) GetGenerationStartTimestamp() int64 { + if x != nil { + return x.GenerationStartTimestamp + } + return 0 +} + +func (x *PoCValidationSnapshot) GetExchangeEndTimestamp() int64 { + if x != nil { + return x.ExchangeEndTimestamp + } + return 0 +} + +type ValidatorWeight struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Weight int64 `protobuf:"varint,2,opt,name=weight,proto3" json:"weight,omitempty"` +} + +func (x *ValidatorWeight) Reset() { + *x = ValidatorWeight{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_poc_validation_snapshot_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *ValidatorWeight) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ValidatorWeight) ProtoMessage() {} + +// Deprecated: Use ValidatorWeight.ProtoReflect.Descriptor instead. +func (*ValidatorWeight) Descriptor() ([]byte, []int) { + return file_inference_inference_poc_validation_snapshot_proto_rawDescGZIP(), []int{1} +} + +func (x *ValidatorWeight) GetAddress() string { + if x != nil { + return x.Address + } + return "" +} + +func (x *ValidatorWeight) GetWeight() int64 { + if x != nil { + return x.Weight + } + return 0 +} + +var File_inference_inference_poc_validation_snapshot_proto protoreflect.FileDescriptor + +var file_inference_inference_poc_validation_snapshot_proto_rawDesc = []byte{ + 0x0a, 0x31, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x12, 0x13, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0xd7, 0x02, 0x0a, 0x15, 0x50, 0x6f, 0x43, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x12, 0x33, 0x0a, 0x16, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x13, 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0e, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x12, 0x19, 0x0a, 0x08, 0x61, 0x70, 0x70, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x61, 0x70, 0x70, 0x48, 0x61, 0x73, 0x68, 0x12, 0x51, 0x0a, 0x11, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x10, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x3c, + 0x0a, 0x1a, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x18, 0x67, 0x65, 0x6e, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, + 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x34, 0x0a, 0x16, + 0x65, 0x78, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x5f, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x65, 0x78, + 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x45, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, + 0x6d, 0x70, 0x22, 0x43, 0x0a, 0x0f, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x57, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, + 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x42, 0xc8, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x42, 0x1a, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, + 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xa2, 0x02, 0x03, 0x49, 0x49, 0x58, 0xaa, 0x02, 0x13, + 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0xca, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, + 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xe2, 0x02, 0x1f, 0x49, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, + 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x14, 0x49, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x3a, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, +} + +var ( + file_inference_inference_poc_validation_snapshot_proto_rawDescOnce sync.Once + file_inference_inference_poc_validation_snapshot_proto_rawDescData = file_inference_inference_poc_validation_snapshot_proto_rawDesc +) + +func file_inference_inference_poc_validation_snapshot_proto_rawDescGZIP() []byte { + file_inference_inference_poc_validation_snapshot_proto_rawDescOnce.Do(func() { + file_inference_inference_poc_validation_snapshot_proto_rawDescData = protoimpl.X.CompressGZIP(file_inference_inference_poc_validation_snapshot_proto_rawDescData) + }) + return file_inference_inference_poc_validation_snapshot_proto_rawDescData +} + +var file_inference_inference_poc_validation_snapshot_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_inference_inference_poc_validation_snapshot_proto_goTypes = []interface{}{ + (*PoCValidationSnapshot)(nil), // 0: inference.inference.PoCValidationSnapshot + (*ValidatorWeight)(nil), // 1: inference.inference.ValidatorWeight +} +var file_inference_inference_poc_validation_snapshot_proto_depIdxs = []int32{ + 1, // 0: inference.inference.PoCValidationSnapshot.validator_weights:type_name -> inference.inference.ValidatorWeight + 1, // [1:1] is the sub-list for method output_type + 1, // [1:1] is the sub-list for method input_type + 1, // [1:1] is the sub-list for extension type_name + 1, // [1:1] is the sub-list for extension extendee + 0, // [0:1] is the sub-list for field type_name +} + +func init() { file_inference_inference_poc_validation_snapshot_proto_init() } +func file_inference_inference_poc_validation_snapshot_proto_init() { + if File_inference_inference_poc_validation_snapshot_proto != nil { + return + } + if !protoimpl.UnsafeEnabled { + file_inference_inference_poc_validation_snapshot_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*PoCValidationSnapshot); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_inference_inference_poc_validation_snapshot_proto_msgTypes[1].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*ValidatorWeight); 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{ + File: protoimpl.DescBuilder{ + GoPackagePath: reflect.TypeOf(x{}).PkgPath(), + RawDescriptor: file_inference_inference_poc_validation_snapshot_proto_rawDesc, + NumEnums: 0, + NumMessages: 2, + NumExtensions: 0, + NumServices: 0, + }, + GoTypes: file_inference_inference_poc_validation_snapshot_proto_goTypes, + DependencyIndexes: file_inference_inference_poc_validation_snapshot_proto_depIdxs, + MessageInfos: file_inference_inference_poc_validation_snapshot_proto_msgTypes, + }.Build() + File_inference_inference_poc_validation_snapshot_proto = out.File + file_inference_inference_poc_validation_snapshot_proto_rawDesc = nil + file_inference_inference_poc_validation_snapshot_proto_goTypes = nil + file_inference_inference_poc_validation_snapshot_proto_depIdxs = nil +} diff --git a/inference-chain/api/inference/inference/query.pulsar.go b/inference-chain/api/inference/inference/query.pulsar.go index bbfff4185..8f0b30651 100644 --- a/inference-chain/api/inference/inference/query.pulsar.go +++ b/inference-chain/api/inference/inference/query.pulsar.go @@ -51332,7 +51332,7 @@ func (x *QueryDebugStatsResponse_TemporaryTimeStat) ProtoReflect() protoreflect. } func (x *QueryDebugStatsResponse_TemporaryTimeStat) slowProtoReflect() protoreflect.Message { - mi := &file_inference_inference_query_proto_msgTypes[176] + mi := &file_inference_inference_query_proto_msgTypes[178] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -51890,7 +51890,7 @@ func (x *QueryDebugStatsResponse_TemporaryEpochStat) ProtoReflect() protoreflect } func (x *QueryDebugStatsResponse_TemporaryEpochStat) slowProtoReflect() protoreflect.Message { - mi := &file_inference_inference_query_proto_msgTypes[177] + mi := &file_inference_inference_query_proto_msgTypes[179] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -82792,307 +82792,1200 @@ func (x *fastReflection_QueryRandomSeedsResponse) ProtoMethods() *protoiface.Met } } -// Code generated by protoc-gen-go. DO NOT EDIT. -// versions: -// protoc-gen-go v1.27.0 -// protoc (unknown) -// source: inference/inference/query.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) +var ( + md_QueryPoCValidationSnapshotRequest protoreflect.MessageDescriptor + fd_QueryPoCValidationSnapshotRequest_poc_stage_start_height protoreflect.FieldDescriptor ) -// QueryParamsRequest is request type for the Query/Params RPC method. -type QueryParamsRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields -} - -func (x *QueryParamsRequest) Reset() { - *x = QueryParamsRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[0] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } -} - -func (x *QueryParamsRequest) String() string { - return protoimpl.X.MessageStringOf(x) +func init() { + file_inference_inference_query_proto_init() + md_QueryPoCValidationSnapshotRequest = File_inference_inference_query_proto.Messages().ByName("QueryPoCValidationSnapshotRequest") + fd_QueryPoCValidationSnapshotRequest_poc_stage_start_height = md_QueryPoCValidationSnapshotRequest.Fields().ByName("poc_stage_start_height") } -func (*QueryParamsRequest) ProtoMessage() {} - -// Deprecated: Use QueryParamsRequest.ProtoReflect.Descriptor instead. -func (*QueryParamsRequest) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{0} -} +var _ protoreflect.Message = (*fastReflection_QueryPoCValidationSnapshotRequest)(nil) -// QueryParamsResponse is response type for the Query/Params RPC method. -type QueryParamsResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +type fastReflection_QueryPoCValidationSnapshotRequest QueryPoCValidationSnapshotRequest - // params holds all the parameters of this module. - Params *Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"` +func (x *QueryPoCValidationSnapshotRequest) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryPoCValidationSnapshotRequest)(x) } -func (x *QueryParamsResponse) Reset() { - *x = QueryParamsResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[1] +func (x *QueryPoCValidationSnapshotRequest) slowProtoReflect() protoreflect.Message { + mi := &file_inference_inference_query_proto_msgTypes[176] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } + return mi.MessageOf(x) } -func (x *QueryParamsResponse) String() string { - return protoimpl.X.MessageStringOf(x) -} +var _fastReflection_QueryPoCValidationSnapshotRequest_messageType fastReflection_QueryPoCValidationSnapshotRequest_messageType +var _ protoreflect.MessageType = fastReflection_QueryPoCValidationSnapshotRequest_messageType{} -func (*QueryParamsResponse) ProtoMessage() {} +type fastReflection_QueryPoCValidationSnapshotRequest_messageType struct{} -// Deprecated: Use QueryParamsResponse.ProtoReflect.Descriptor instead. -func (*QueryParamsResponse) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{1} +func (x fastReflection_QueryPoCValidationSnapshotRequest_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryPoCValidationSnapshotRequest)(nil) } - -func (x *QueryParamsResponse) GetParams() *Params { - if x != nil { - return x.Params - } - return nil +func (x fastReflection_QueryPoCValidationSnapshotRequest_messageType) New() protoreflect.Message { + return new(fastReflection_QueryPoCValidationSnapshotRequest) } - -type QueryGetInferenceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Index string `protobuf:"bytes,1,opt,name=index,proto3" json:"index,omitempty"` +func (x fastReflection_QueryPoCValidationSnapshotRequest_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryPoCValidationSnapshotRequest } -func (x *QueryGetInferenceRequest) Reset() { - *x = QueryGetInferenceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[2] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryPoCValidationSnapshotRequest) Descriptor() protoreflect.MessageDescriptor { + return md_QueryPoCValidationSnapshotRequest } -func (x *QueryGetInferenceRequest) String() string { - return protoimpl.X.MessageStringOf(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_QueryPoCValidationSnapshotRequest) Type() protoreflect.MessageType { + return _fastReflection_QueryPoCValidationSnapshotRequest_messageType } -func (*QueryGetInferenceRequest) ProtoMessage() {} +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryPoCValidationSnapshotRequest) New() protoreflect.Message { + return new(fastReflection_QueryPoCValidationSnapshotRequest) +} -// Deprecated: Use QueryGetInferenceRequest.ProtoReflect.Descriptor instead. -func (*QueryGetInferenceRequest) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{2} +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryPoCValidationSnapshotRequest) Interface() protoreflect.ProtoMessage { + return (*QueryPoCValidationSnapshotRequest)(x) } -func (x *QueryGetInferenceRequest) GetIndex() string { - if x != nil { - return x.Index +// 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_QueryPoCValidationSnapshotRequest) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.PocStageStartHeight != int64(0) { + value := protoreflect.ValueOfInt64(x.PocStageStartHeight) + if !f(fd_QueryPoCValidationSnapshotRequest_poc_stage_start_height, value) { + return + } } - return "" } -type QueryGetInferenceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Inference *Inference `protobuf:"bytes,1,opt,name=inference,proto3" json:"inference,omitempty"` +// 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_QueryPoCValidationSnapshotRequest) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "inference.inference.QueryPoCValidationSnapshotRequest.poc_stage_start_height": + return x.PocStageStartHeight != int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotRequest does not contain field %s", fd.FullName())) + } } -func (x *QueryGetInferenceResponse) Reset() { - *x = QueryGetInferenceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[3] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +// 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_QueryPoCValidationSnapshotRequest) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "inference.inference.QueryPoCValidationSnapshotRequest.poc_stage_start_height": + x.PocStageStartHeight = int64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotRequest does not contain field %s", fd.FullName())) } } -func (x *QueryGetInferenceResponse) String() string { - return protoimpl.X.MessageStringOf(x) +// 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_QueryPoCValidationSnapshotRequest) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "inference.inference.QueryPoCValidationSnapshotRequest.poc_stage_start_height": + value := x.PocStageStartHeight + return protoreflect.ValueOfInt64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotRequest does not contain field %s", descriptor.FullName())) + } } -func (*QueryGetInferenceResponse) ProtoMessage() {} - -// Deprecated: Use QueryGetInferenceResponse.ProtoReflect.Descriptor instead. -func (*QueryGetInferenceResponse) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{3} +// 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_QueryPoCValidationSnapshotRequest) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "inference.inference.QueryPoCValidationSnapshotRequest.poc_stage_start_height": + x.PocStageStartHeight = value.Int() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotRequest does not contain field %s", fd.FullName())) + } } -func (x *QueryGetInferenceResponse) GetInference() *Inference { - if x != nil { - return x.Inference +// 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_QueryPoCValidationSnapshotRequest) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.QueryPoCValidationSnapshotRequest.poc_stage_start_height": + panic(fmt.Errorf("field poc_stage_start_height of message inference.inference.QueryPoCValidationSnapshotRequest is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotRequest does not contain field %s", fd.FullName())) } - return nil } -type QueryAllInferenceRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Pagination *v1beta1.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +// 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_QueryPoCValidationSnapshotRequest) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.QueryPoCValidationSnapshotRequest.poc_stage_start_height": + return protoreflect.ValueOfInt64(int64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotRequest")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotRequest does not contain field %s", fd.FullName())) + } } -func (x *QueryAllInferenceRequest) Reset() { - *x = QueryAllInferenceRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[4] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) +// 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_QueryPoCValidationSnapshotRequest) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in inference.inference.QueryPoCValidationSnapshotRequest", d.FullName())) } + panic("unreachable") } -func (x *QueryAllInferenceRequest) String() string { - return protoimpl.X.MessageStringOf(x) +// 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_QueryPoCValidationSnapshotRequest) GetUnknown() protoreflect.RawFields { + return x.unknownFields } -func (*QueryAllInferenceRequest) ProtoMessage() {} - -// Deprecated: Use QueryAllInferenceRequest.ProtoReflect.Descriptor instead. -func (*QueryAllInferenceRequest) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{4} +// 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_QueryPoCValidationSnapshotRequest) SetUnknown(fields protoreflect.RawFields) { + x.unknownFields = fields } -func (x *QueryAllInferenceRequest) GetPagination() *v1beta1.PageRequest { - if x != nil { - return x.Pagination - } - return nil +// 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_QueryPoCValidationSnapshotRequest) IsValid() bool { + return x != nil } -type QueryAllInferenceResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Inference []*Inference `protobuf:"bytes,1,rep,name=inference,proto3" json:"inference,omitempty"` - Pagination *v1beta1.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` -} +// 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_QueryPoCValidationSnapshotRequest) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryPoCValidationSnapshotRequest) + 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.PocStageStartHeight != 0 { + n += 1 + runtime.Sov(uint64(x.PocStageStartHeight)) + } + if x.unknownFields != nil { + n += len(x.unknownFields) + } + return protoiface.SizeOutput{ + NoUnkeyedLiterals: input.NoUnkeyedLiterals, + Size: n, + } + } -func (x *QueryAllInferenceResponse) Reset() { - *x = QueryAllInferenceResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[5] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + marshal := func(input protoiface.MarshalInput) (protoiface.MarshalOutput, error) { + x := input.Message.Interface().(*QueryPoCValidationSnapshotRequest) + 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.PocStageStartHeight != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.PocStageStartHeight)) + i-- + dAtA[i] = 0x8 + } + 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().(*QueryPoCValidationSnapshotRequest) + 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: QueryPoCValidationSnapshotRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryPoCValidationSnapshotRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field PocStageStartHeight", wireType) + } + x.PocStageStartHeight = 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.PocStageStartHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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 + } + } -func (x *QueryAllInferenceResponse) String() string { - return protoimpl.X.MessageStringOf(x) + 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, + } } -func (*QueryAllInferenceResponse) ProtoMessage() {} - -// Deprecated: Use QueryAllInferenceResponse.ProtoReflect.Descriptor instead. -func (*QueryAllInferenceResponse) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{5} -} +var ( + md_QueryPoCValidationSnapshotResponse protoreflect.MessageDescriptor + fd_QueryPoCValidationSnapshotResponse_snapshot protoreflect.FieldDescriptor + fd_QueryPoCValidationSnapshotResponse_found protoreflect.FieldDescriptor +) -func (x *QueryAllInferenceResponse) GetInference() []*Inference { - if x != nil { - return x.Inference - } - return nil +func init() { + file_inference_inference_query_proto_init() + md_QueryPoCValidationSnapshotResponse = File_inference_inference_query_proto.Messages().ByName("QueryPoCValidationSnapshotResponse") + fd_QueryPoCValidationSnapshotResponse_snapshot = md_QueryPoCValidationSnapshotResponse.Fields().ByName("snapshot") + fd_QueryPoCValidationSnapshotResponse_found = md_QueryPoCValidationSnapshotResponse.Fields().ByName("found") } -func (x *QueryAllInferenceResponse) GetPagination() *v1beta1.PageResponse { - if x != nil { - return x.Pagination - } - return nil -} +var _ protoreflect.Message = (*fastReflection_QueryPoCValidationSnapshotResponse)(nil) -type QueryGetParticipantRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields +type fastReflection_QueryPoCValidationSnapshotResponse QueryPoCValidationSnapshotResponse - Index string `protobuf:"bytes,1,opt,name=index,proto3" json:"index,omitempty"` +func (x *QueryPoCValidationSnapshotResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_QueryPoCValidationSnapshotResponse)(x) } -func (x *QueryGetParticipantRequest) Reset() { - *x = QueryGetParticipantRequest{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[6] +func (x *QueryPoCValidationSnapshotResponse) slowProtoReflect() protoreflect.Message { + mi := &file_inference_inference_query_proto_msgTypes[177] + if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms } + return mi.MessageOf(x) } -func (x *QueryGetParticipantRequest) String() string { - return protoimpl.X.MessageStringOf(x) -} +var _fastReflection_QueryPoCValidationSnapshotResponse_messageType fastReflection_QueryPoCValidationSnapshotResponse_messageType +var _ protoreflect.MessageType = fastReflection_QueryPoCValidationSnapshotResponse_messageType{} -func (*QueryGetParticipantRequest) ProtoMessage() {} +type fastReflection_QueryPoCValidationSnapshotResponse_messageType struct{} -// Deprecated: Use QueryGetParticipantRequest.ProtoReflect.Descriptor instead. -func (*QueryGetParticipantRequest) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{6} +func (x fastReflection_QueryPoCValidationSnapshotResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_QueryPoCValidationSnapshotResponse)(nil) } - -func (x *QueryGetParticipantRequest) GetIndex() string { - if x != nil { - return x.Index - } - return "" +func (x fastReflection_QueryPoCValidationSnapshotResponse_messageType) New() protoreflect.Message { + return new(fastReflection_QueryPoCValidationSnapshotResponse) } - -type QueryGetParticipantResponse struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Participant *Participant `protobuf:"bytes,1,opt,name=participant,proto3" json:"participant,omitempty"` +func (x fastReflection_QueryPoCValidationSnapshotResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_QueryPoCValidationSnapshotResponse } -func (x *QueryGetParticipantResponse) Reset() { - *x = QueryGetParticipantResponse{} - if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[7] - ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) - ms.StoreMessageInfo(mi) - } +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_QueryPoCValidationSnapshotResponse) Descriptor() protoreflect.MessageDescriptor { + return md_QueryPoCValidationSnapshotResponse } -func (x *QueryGetParticipantResponse) String() string { - return protoimpl.X.MessageStringOf(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_QueryPoCValidationSnapshotResponse) Type() protoreflect.MessageType { + return _fastReflection_QueryPoCValidationSnapshotResponse_messageType } -func (*QueryGetParticipantResponse) ProtoMessage() {} - -// Deprecated: Use QueryGetParticipantResponse.ProtoReflect.Descriptor instead. -func (*QueryGetParticipantResponse) Descriptor() ([]byte, []int) { - return file_inference_inference_query_proto_rawDescGZIP(), []int{7} +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_QueryPoCValidationSnapshotResponse) New() protoreflect.Message { + return new(fastReflection_QueryPoCValidationSnapshotResponse) } -func (x *QueryGetParticipantResponse) GetParticipant() *Participant { - if x != nil { - return x.Participant - } - return nil +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_QueryPoCValidationSnapshotResponse) Interface() protoreflect.ProtoMessage { + return (*QueryPoCValidationSnapshotResponse)(x) } -type QueryAllParticipantRequest struct { - state protoimpl.MessageState - sizeCache protoimpl.SizeCache - unknownFields protoimpl.UnknownFields - - Pagination *v1beta1.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +// 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_QueryPoCValidationSnapshotResponse) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Snapshot != nil { + value := protoreflect.ValueOfMessage(x.Snapshot.ProtoReflect()) + if !f(fd_QueryPoCValidationSnapshotResponse_snapshot, value) { + return + } + } + if x.Found != false { + value := protoreflect.ValueOfBool(x.Found) + if !f(fd_QueryPoCValidationSnapshotResponse_found, 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_QueryPoCValidationSnapshotResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "inference.inference.QueryPoCValidationSnapshotResponse.snapshot": + return x.Snapshot != nil + case "inference.inference.QueryPoCValidationSnapshotResponse.found": + return x.Found != false + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotResponse 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_QueryPoCValidationSnapshotResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "inference.inference.QueryPoCValidationSnapshotResponse.snapshot": + x.Snapshot = nil + case "inference.inference.QueryPoCValidationSnapshotResponse.found": + x.Found = false + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotResponse 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_QueryPoCValidationSnapshotResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "inference.inference.QueryPoCValidationSnapshotResponse.snapshot": + value := x.Snapshot + return protoreflect.ValueOfMessage(value.ProtoReflect()) + case "inference.inference.QueryPoCValidationSnapshotResponse.found": + value := x.Found + return protoreflect.ValueOfBool(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotResponse 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_QueryPoCValidationSnapshotResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "inference.inference.QueryPoCValidationSnapshotResponse.snapshot": + x.Snapshot = value.Message().Interface().(*PoCValidationSnapshot) + case "inference.inference.QueryPoCValidationSnapshotResponse.found": + x.Found = value.Bool() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotResponse 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_QueryPoCValidationSnapshotResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.QueryPoCValidationSnapshotResponse.snapshot": + if x.Snapshot == nil { + x.Snapshot = new(PoCValidationSnapshot) + } + return protoreflect.ValueOfMessage(x.Snapshot.ProtoReflect()) + case "inference.inference.QueryPoCValidationSnapshotResponse.found": + panic(fmt.Errorf("field found of message inference.inference.QueryPoCValidationSnapshotResponse is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotResponse 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_QueryPoCValidationSnapshotResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.inference.QueryPoCValidationSnapshotResponse.snapshot": + m := new(PoCValidationSnapshot) + return protoreflect.ValueOfMessage(m.ProtoReflect()) + case "inference.inference.QueryPoCValidationSnapshotResponse.found": + return protoreflect.ValueOfBool(false) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.inference.QueryPoCValidationSnapshotResponse")) + } + panic(fmt.Errorf("message inference.inference.QueryPoCValidationSnapshotResponse 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_QueryPoCValidationSnapshotResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in inference.inference.QueryPoCValidationSnapshotResponse", 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_QueryPoCValidationSnapshotResponse) 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_QueryPoCValidationSnapshotResponse) 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_QueryPoCValidationSnapshotResponse) 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_QueryPoCValidationSnapshotResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*QueryPoCValidationSnapshotResponse) + 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.Snapshot != nil { + l = options.Size(x.Snapshot) + n += 1 + l + runtime.Sov(uint64(l)) + } + if x.Found { + n += 2 + } + 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().(*QueryPoCValidationSnapshotResponse) + 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.Found { + i-- + if x.Found { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if x.Snapshot != nil { + encoded, err := options.Marshal(x.Snapshot) + 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] = 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().(*QueryPoCValidationSnapshotResponse) + 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: QueryPoCValidationSnapshotResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: QueryPoCValidationSnapshotResponse: 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 Snapshot", 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.Snapshot == nil { + x.Snapshot = &PoCValidationSnapshot{} + } + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Snapshot); err != nil { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: wrong wireType = %d for field Found", wireType) + } + var v 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++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + x.Found = bool(v != 0) + 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: inference/inference/query.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) +) + +// QueryParamsRequest is request type for the Query/Params RPC method. +type QueryParamsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *QueryParamsRequest) Reset() { + *x = QueryParamsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[0] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryParamsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryParamsRequest) ProtoMessage() {} + +// Deprecated: Use QueryParamsRequest.ProtoReflect.Descriptor instead. +func (*QueryParamsRequest) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{0} +} + +// QueryParamsResponse is response type for the Query/Params RPC method. +type QueryParamsResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // params holds all the parameters of this module. + Params *Params `protobuf:"bytes,1,opt,name=params,proto3" json:"params,omitempty"` +} + +func (x *QueryParamsResponse) Reset() { + *x = QueryParamsResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[1] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryParamsResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryParamsResponse) ProtoMessage() {} + +// Deprecated: Use QueryParamsResponse.ProtoReflect.Descriptor instead. +func (*QueryParamsResponse) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{1} +} + +func (x *QueryParamsResponse) GetParams() *Params { + if x != nil { + return x.Params + } + return nil +} + +type QueryGetInferenceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index string `protobuf:"bytes,1,opt,name=index,proto3" json:"index,omitempty"` +} + +func (x *QueryGetInferenceRequest) Reset() { + *x = QueryGetInferenceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryGetInferenceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryGetInferenceRequest) ProtoMessage() {} + +// Deprecated: Use QueryGetInferenceRequest.ProtoReflect.Descriptor instead. +func (*QueryGetInferenceRequest) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{2} +} + +func (x *QueryGetInferenceRequest) GetIndex() string { + if x != nil { + return x.Index + } + return "" +} + +type QueryGetInferenceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inference *Inference `protobuf:"bytes,1,opt,name=inference,proto3" json:"inference,omitempty"` +} + +func (x *QueryGetInferenceResponse) Reset() { + *x = QueryGetInferenceResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryGetInferenceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryGetInferenceResponse) ProtoMessage() {} + +// Deprecated: Use QueryGetInferenceResponse.ProtoReflect.Descriptor instead. +func (*QueryGetInferenceResponse) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{3} +} + +func (x *QueryGetInferenceResponse) GetInference() *Inference { + if x != nil { + return x.Inference + } + return nil +} + +type QueryAllInferenceRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Pagination *v1beta1.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (x *QueryAllInferenceRequest) Reset() { + *x = QueryAllInferenceRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryAllInferenceRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryAllInferenceRequest) ProtoMessage() {} + +// Deprecated: Use QueryAllInferenceRequest.ProtoReflect.Descriptor instead. +func (*QueryAllInferenceRequest) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{4} +} + +func (x *QueryAllInferenceRequest) GetPagination() *v1beta1.PageRequest { + if x != nil { + return x.Pagination + } + return nil +} + +type QueryAllInferenceResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Inference []*Inference `protobuf:"bytes,1,rep,name=inference,proto3" json:"inference,omitempty"` + Pagination *v1beta1.PageResponse `protobuf:"bytes,2,opt,name=pagination,proto3" json:"pagination,omitempty"` +} + +func (x *QueryAllInferenceResponse) Reset() { + *x = QueryAllInferenceResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryAllInferenceResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryAllInferenceResponse) ProtoMessage() {} + +// Deprecated: Use QueryAllInferenceResponse.ProtoReflect.Descriptor instead. +func (*QueryAllInferenceResponse) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{5} +} + +func (x *QueryAllInferenceResponse) GetInference() []*Inference { + if x != nil { + return x.Inference + } + return nil +} + +func (x *QueryAllInferenceResponse) GetPagination() *v1beta1.PageResponse { + if x != nil { + return x.Pagination + } + return nil +} + +type QueryGetParticipantRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Index string `protobuf:"bytes,1,opt,name=index,proto3" json:"index,omitempty"` +} + +func (x *QueryGetParticipantRequest) Reset() { + *x = QueryGetParticipantRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[6] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryGetParticipantRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryGetParticipantRequest) ProtoMessage() {} + +// Deprecated: Use QueryGetParticipantRequest.ProtoReflect.Descriptor instead. +func (*QueryGetParticipantRequest) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{6} +} + +func (x *QueryGetParticipantRequest) GetIndex() string { + if x != nil { + return x.Index + } + return "" +} + +type QueryGetParticipantResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Participant *Participant `protobuf:"bytes,1,opt,name=participant,proto3" json:"participant,omitempty"` +} + +func (x *QueryGetParticipantResponse) Reset() { + *x = QueryGetParticipantResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[7] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryGetParticipantResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryGetParticipantResponse) ProtoMessage() {} + +// Deprecated: Use QueryGetParticipantResponse.ProtoReflect.Descriptor instead. +func (*QueryGetParticipantResponse) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{7} +} + +func (x *QueryGetParticipantResponse) GetParticipant() *Participant { + if x != nil { + return x.Participant + } + return nil +} + +type QueryAllParticipantRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Pagination *v1beta1.PageRequest `protobuf:"bytes,1,opt,name=pagination,proto3" json:"pagination,omitempty"` } func (x *QueryAllParticipantRequest) Reset() { @@ -89505,6 +90398,84 @@ func (x *QueryRandomSeedsResponse) GetSeeds() []*RandomSeed { return nil } +type QueryPoCValidationSnapshotRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + PocStageStartHeight int64 `protobuf:"varint,1,opt,name=poc_stage_start_height,json=pocStageStartHeight,proto3" json:"poc_stage_start_height,omitempty"` +} + +func (x *QueryPoCValidationSnapshotRequest) Reset() { + *x = QueryPoCValidationSnapshotRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[176] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryPoCValidationSnapshotRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryPoCValidationSnapshotRequest) ProtoMessage() {} + +// Deprecated: Use QueryPoCValidationSnapshotRequest.ProtoReflect.Descriptor instead. +func (*QueryPoCValidationSnapshotRequest) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{176} +} + +func (x *QueryPoCValidationSnapshotRequest) GetPocStageStartHeight() int64 { + if x != nil { + return x.PocStageStartHeight + } + return 0 +} + +type QueryPoCValidationSnapshotResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Snapshot *PoCValidationSnapshot `protobuf:"bytes,1,opt,name=snapshot,proto3" json:"snapshot,omitempty"` + Found bool `protobuf:"varint,2,opt,name=found,proto3" json:"found,omitempty"` +} + +func (x *QueryPoCValidationSnapshotResponse) Reset() { + *x = QueryPoCValidationSnapshotResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_inference_query_proto_msgTypes[177] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *QueryPoCValidationSnapshotResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*QueryPoCValidationSnapshotResponse) ProtoMessage() {} + +// Deprecated: Use QueryPoCValidationSnapshotResponse.ProtoReflect.Descriptor instead. +func (*QueryPoCValidationSnapshotResponse) Descriptor() ([]byte, []int) { + return file_inference_inference_query_proto_rawDescGZIP(), []int{177} +} + +func (x *QueryPoCValidationSnapshotResponse) GetSnapshot() *PoCValidationSnapshot { + if x != nil { + return x.Snapshot + } + return nil +} + +func (x *QueryPoCValidationSnapshotResponse) GetFound() bool { + if x != nil { + return x.Found + } + return false +} + type QueryDebugStatsResponse_TemporaryTimeStat struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -89517,7 +90488,7 @@ type QueryDebugStatsResponse_TemporaryTimeStat struct { func (x *QueryDebugStatsResponse_TemporaryTimeStat) Reset() { *x = QueryDebugStatsResponse_TemporaryTimeStat{} if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[176] + mi := &file_inference_inference_query_proto_msgTypes[178] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -89560,7 +90531,7 @@ type QueryDebugStatsResponse_TemporaryEpochStat struct { func (x *QueryDebugStatsResponse_TemporaryEpochStat) Reset() { *x = QueryDebugStatsResponse_TemporaryEpochStat{} if protoimpl.UnsafeEnabled { - mi := &file_inference_inference_query_proto_msgTypes[177] + mi := &file_inference_inference_query_proto_msgTypes[179] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -89679,2295 +90650,2327 @@ var file_inference_inference_query_proto_rawDesc = []byte{ 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x25, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x5f, 0x73, - 0x65, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x14, 0x0a, 0x12, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x55, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x30, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x5f, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x09, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x62, 0x0a, 0x18, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa8, 0x01, - 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1e, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x04, - 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x09, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, - 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x32, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x67, 0x0a, 0x1b, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x64, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, - 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd3, 0x01, 0x0a, 0x1b, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x21, - 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x22, 0x3c, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, - 0x55, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x18, 0x0a, 0x07, - 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x62, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x35, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, - 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x22, 0x64, 0x0a, - 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, - 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x42, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, - 0x74, 0x6f, 0x72, 0x22, 0x5b, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, - 0x22, 0x75, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, - 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, - 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x22, 0x67, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, - 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x65, 0x65, 0x64, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x31, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, + 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x73, 0x6e, + 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x14, 0x0a, 0x12, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x55, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x06, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x09, 0xc8, 0xde, 0x1f, 0x00, 0xa8, 0xe7, 0xb0, 0x2a, + 0x01, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x22, 0x30, 0x0a, 0x18, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x5f, 0x0a, 0x19, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x09, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, + 0x00, 0x52, 0x09, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x22, 0x62, 0x0a, 0x18, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0xbe, 0x01, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, - 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, - 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x22, 0xa8, 0x01, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, + 0x0a, 0x09, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x1e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x09, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x32, 0x0a, 0x1a, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, + 0x67, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x64, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd3, + 0x01, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, + 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x3f, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x53, 0x65, 0x74, - 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x22, 0x6c, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, - 0x1f, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x22, 0x65, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, - 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, - 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, - 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb5, 0x01, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x73, 0x65, 0x74, 0x74, - 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, - 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x69, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x91, 0x01, 0x0a, 0x25, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, - 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x15, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6e, - 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, + 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x22, 0x3c, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x22, 0x55, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, + 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, + 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, 0x35, 0x0a, 0x1d, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, + 0x22, 0x64, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, + 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x42, 0x0a, 0x08, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x65, 0x78, + 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x22, 0x5b, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x49, 0x64, 0x22, 0x75, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x22, 0x67, 0x0a, 0x1d, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, + 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xbe, 0x01, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x47, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x3f, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x6c, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, + 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x42, + 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x22, 0x65, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x53, + 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, + 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, + 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xb5, 0x01, 0x0a, 0x1c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4c, 0x0a, 0x0d, 0x73, + 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, + 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0c, 0x73, 0x65, 0x74, + 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x69, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x1f, 0x0a, 0x0b, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x91, 0x01, + 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xda, - 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x15, 0x65, 0x70, 0x6f, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x15, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x22, 0x6e, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, - 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, - 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x1e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, - 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x22, 0x75, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x09, 0x70, 0x6f, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, - 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x70, - 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb9, 0x01, 0x0a, 0x1a, 0x50, 0x6f, 0x43, 0x42, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, - 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, - 0x79, 0x12, 0x40, 0x0a, 0x09, 0x70, 0x6f, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x18, 0x04, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x70, 0x6f, 0x63, 0x42, 0x61, - 0x74, 0x63, 0x68, 0x22, 0x47, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x87, 0x01, 0x0a, - 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x69, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xda, 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, 0x17, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xcc, 0x01, 0x0a, 0x1e, 0x50, 0x6f, 0x43, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, + 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x15, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, + 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x43, + 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, + 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x22, 0x75, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x42, + 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x09, 0x70, 0x6f, 0x63, 0x5f, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x50, 0x6f, 0x43, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, + 0x52, 0x08, 0x70, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x22, 0xb9, 0x01, 0x0a, 0x1a, 0x50, + 0x6f, 0x43, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, - 0x62, 0x4b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x49, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, - 0x63, 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, - 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, - 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x22, 0x8b, 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, 0x0e, 0x70, 0x6f, - 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, - 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xd0, - 0x01, 0x0a, 0x20, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x73, 0x56, 0x32, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1e, - 0x0a, 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x51, - 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x42, 0x04, 0xc8, 0xde, + 0x62, 0x4b, 0x65, 0x79, 0x12, 0x40, 0x0a, 0x09, 0x70, 0x6f, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, + 0x68, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, + 0x43, 0x42, 0x61, 0x74, 0x63, 0x68, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x70, 0x6f, + 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x22, 0x47, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, + 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, + 0x87, 0x01, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x60, 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xcc, 0x01, 0x0a, 0x1e, 0x50, 0x6f, + 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x20, 0x0a, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x17, + 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, + 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, + 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x12, 0x4f, 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x49, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x22, 0x8b, 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, + 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, + 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x8f, 0x01, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x32, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x6e, 0x22, 0xd0, 0x01, 0x0a, 0x20, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x57, 0x69, 0x74, 0x68, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x73, 0x56, 0x32, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x12, 0x1e, 0x0a, 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, + 0x79, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x24, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x56, 0x32, 0x42, + 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x70, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8f, 0x01, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, + 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, + 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x6f, 0x63, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, + 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x68, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, + 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, + 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x22, 0x97, 0x01, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, + 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, + 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x18, 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x7a, 0x0a, 0x25, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, + 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, + 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, + 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x6a, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, + 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, + 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x22, 0x68, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, - 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, - 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, - 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x97, 0x01, - 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, - 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x6f, - 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x7a, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, - 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3b, 0x0a, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x52, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x12, 0x14, 0x0a, - 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, - 0x75, 0x6e, 0x64, 0x22, 0x6a, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, - 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, - 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, - 0x77, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, - 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, - 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4a, 0x0a, 0x07, - 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x30, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x57, 0x69, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, - 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x1b, 0x50, 0x6f, 0x43, - 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x57, 0x69, 0x74, - 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, - 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0c, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x1e, 0x0a, 0x0b, - 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x72, 0x0a, 0x30, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x6f, 0x63, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x22, 0x93, 0x01, 0x0a, 0x31, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, - 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, - 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x38, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, - 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x23, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, + 0x68, 0x74, 0x22, 0x77, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x6f, + 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, + 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x4a, 0x0a, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x57, 0x69, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x52, 0x07, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x22, 0xa1, 0x01, 0x0a, 0x1b, + 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x57, 0x69, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x14, 0x0a, 0x05, + 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x05, 0x63, 0x6f, 0x75, + 0x6e, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x1e, 0x0a, 0x0b, 0x68, 0x65, 0x78, 0x5f, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x68, 0x65, 0x78, 0x50, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, + 0x72, 0x0a, 0x30, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, - 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2f, - 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x3b, 0x0a, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x1c, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, + 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x18, 0x70, 0x6f, 0x63, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x42, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x31, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, + 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0d, 0x64, 0x69, 0x73, + 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x52, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x22, 0x1d, 0x0a, 0x1b, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x34, 0x0a, 0x1c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x22, 0x1f, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x74, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, - 0x63, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, + 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x57, + 0x69, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x52, 0x0d, 0x64, 0x69, 0x73, 0x74, + 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x93, 0x01, 0x0a, 0x23, 0x4d, 0x4c, + 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x57, 0x69, 0x74, 0x68, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x2f, 0x0a, 0x13, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x12, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x3b, 0x0a, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x18, 0x02, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, + 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x07, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x73, 0x22, + 0x1d, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, + 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x34, + 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, + 0x0a, 0x05, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x22, 0x1f, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x74, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, + 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, + 0x73, 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x74, 0x6f, 0x6b, + 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4d, 0x0a, 0x29, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x2a, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, + 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x08, 0x70, 0x72, 0x6f, + 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, + 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, + 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, + 0x22, 0x23, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x79, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, + 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, + 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, + 0x22, 0x24, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, + 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7a, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, + 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, + 0x10, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, + 0x1f, 0x00, 0x52, 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, + 0x74, 0x61, 0x22, 0x5f, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0x99, 0x01, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, + 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, - 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, - 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x22, 0x4d, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, - 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x93, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, - 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, - 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x55, - 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x08, 0x70, 0x72, 0x6f, 0x70, 0x6f, - 0x73, 0x61, 0x6c, 0x12, 0x18, 0x0a, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x64, 0x65, 0x66, 0x61, 0x75, 0x6c, 0x74, 0x22, 0x23, 0x0a, - 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x79, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, - 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x22, 0x24, 0x0a, - 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x65, 0x76, 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x7a, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x65, 0x76, - 0x69, 0x6f, 0x75, 0x73, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, - 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, - 0x0e, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x22, - 0x5f, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0x99, 0x01, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, - 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x05, 0x6d, 0x6f, - 0x64, 0x65, 0x6c, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x33, 0x0a, 0x17, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x22, 0x5c, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, - 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, - 0x09, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x42, - 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x22, - 0x61, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, - 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, - 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, - 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0xa5, 0x01, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, - 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x40, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, - 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, - 0x72, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, - 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, - 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6f, 0x0a, 0x1f, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2a, 0x0a, - 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x7c, 0x0a, 0x20, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x58, 0x0a, 0x11, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x10, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x69, 0x0a, 0x1f, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, - 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, - 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc5, 0x01, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, - 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, - 0x00, 0x52, 0x10, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, - 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x67, 0x0a, 0x29, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0xa3, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, - 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, - 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, - 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x73, 0x0a, 0x29, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, - 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, - 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, - 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0xec, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x75, 0x0a, 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, - 0x61, 0x69, 0x6c, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x1a, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, - 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, + 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0x5e, 0x0a, 0x2c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x03, 0x69, 0x64, - 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x72, 0x22, - 0xb8, 0x02, 0x0a, 0x2d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x70, - 0x6f, 0x77, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, + 0x33, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4d, 0x69, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x22, 0x5c, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x40, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, + 0x65, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x4d, 0x69, 0x6e, + 0x65, 0x72, 0x22, 0x61, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, + 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, + 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, + 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xa5, 0x01, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, + 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x40, 0x0a, 0x09, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x70, 0x4d, + 0x69, 0x6e, 0x65, 0x72, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x74, 0x6f, 0x70, 0x4d, + 0x69, 0x6e, 0x65, 0x72, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, + 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, + 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x6f, 0x0a, + 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x2a, 0x0a, 0x10, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x65, 0x78, 0x70, 0x69, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x20, 0x0a, 0x0b, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0x7c, + 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, + 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x10, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x22, 0x69, 0x0a, 0x1f, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, + 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, + 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xc5, 0x01, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x11, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x42, 0x04, + 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x10, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, + 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, + 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0x67, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x07, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x49, 0x64, 0x12, 0x20, 0x0a, 0x0b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x22, 0xa3, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x75, 0x0a, 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, - 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, - 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x49, 0x0a, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x04, 0xc8, 0xde, + 0x1f, 0x00, 0x52, 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x22, 0x73, + 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, + 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, + 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, + 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xec, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x07, 0x64, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x12, 0x45, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x0a, - 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x47, 0x0a, 0x0e, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x14, 0x0a, 0x05, - 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x6f, 0x77, - 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, - 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, - 0x64, 0x65, 0x78, 0x22, 0x4d, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, - 0x65, 0x78, 0x22, 0x9b, 0x01, 0x0a, 0x2b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, - 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, - 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x22, 0x79, 0x0a, 0x30, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x75, 0x0a, 0x1a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x1a, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x5e, 0x0a, 0x2c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x69, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, + 0x03, 0x69, 0x64, 0x73, 0x12, 0x1c, 0x0a, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, + 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x65, 0x72, 0x22, 0xb8, 0x02, 0x0a, 0x2d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x10, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, + 0x77, 0x65, 0x72, 0x52, 0x0f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, + 0x77, 0x65, 0x72, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x63, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x49, 0x0a, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x07, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x45, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x47, 0x0a, + 0x0e, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x6f, 0x72, 0x50, 0x6f, 0x77, 0x65, 0x72, 0x12, + 0x14, 0x0a, 0x05, 0x70, 0x6f, 0x77, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, + 0x70, 0x6f, 0x77, 0x65, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x4d, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, - 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xa1, 0x01, 0x0a, 0x31, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x6c, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, + 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x9b, 0x01, 0x0a, 0x2b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, - 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x22, - 0x70, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, + 0x6d, 0x61, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, + 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x22, 0x79, 0x0a, 0x30, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0xa1, + 0x01, 0x0a, 0x31, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, + 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, - 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, - 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, - 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, - 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0xe0, 0x01, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, + 0x72, 0x79, 0x22, 0x70, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, - 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6c, 0x0a, - 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, - 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, + 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, + 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe0, 0x01, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, + 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, + 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x6c, 0x0a, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, + 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, + 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, + 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x47, + 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, + 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x02, 0x69, 0x64, 0x22, 0x52, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x35, 0x0a, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, - 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x04, 0xc8, 0xde, - 0x1f, 0x00, 0x52, 0x17, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0x47, 0x0a, 0x0a, 0x70, - 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, - 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2a, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, - 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x02, 0x69, 0x64, - 0x22, 0x52, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, - 0x04, 0x74, 0x61, 0x73, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x04, - 0x74, 0x61, 0x73, 0x6b, 0x22, 0x3d, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, - 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, - 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x38, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x73, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x1c, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x59, 0x0a, 0x1d, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, - 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x05, - 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, - 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x21, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x51, - 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5b, 0x0a, 0x20, 0x51, 0x75, 0x65, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x04, 0x74, 0x61, 0x73, 0x6b, 0x22, 0x3d, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x22, 0x56, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, + 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, + 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x1e, + 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x59, + 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, + 0x6f, 0x64, 0x65, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x38, 0x0a, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x52, 0x05, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x22, 0x21, 0x0a, 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, - 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x57, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x4e, - 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x70, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x22, 0x61, - 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x22, 0x2b, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xd4, - 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, - 0x19, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x17, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x49, 0x64, 0x22, 0xc8, 0x01, 0x0a, 0x17, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5b, 0x0a, 0x20, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x37, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x57, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, + 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, + 0x73, 0x22, 0x4e, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x24, 0x0a, 0x0d, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, + 0x64, 0x22, 0x61, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x16, 0x0a, 0x06, + 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x2b, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0xd4, 0x01, 0x0a, 0x2a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, + 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x68, 0x0a, 0x19, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, + 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, 0x72, 0x74, 0x69, - 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x12, 0x29, 0x0a, 0x10, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x77, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x65, 0x66, 0x66, 0x65, - 0x63, 0x74, 0x69, 0x76, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x63, - 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x05, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x73, 0x52, 0x17, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, + 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x64, 0x22, 0xc8, 0x01, 0x0a, 0x17, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x70, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x77, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x77, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x65, + 0x66, 0x66, 0x65, 0x63, 0x74, 0x69, 0x76, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x23, + 0x0a, 0x0d, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x63, 0x61, 0x70, 0x70, 0x65, 0x64, 0x57, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x22, 0xb1, 0x02, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, + 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, + 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0f, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x22, 0xb1, 0x02, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x63, 0x63, - 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0e, 0x61, 0x63, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x12, 0x29, 0x0a, 0x10, 0x6f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x5f, 0x61, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x6f, 0x70, - 0x65, 0x72, 0x61, 0x74, 0x6f, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x1e, 0x0a, - 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x05, 0x52, 0x0a, 0x72, 0x65, 0x70, 0x75, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x3b, 0x0a, - 0x1a, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x73, 0x5f, 0x63, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x17, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x69, 0x6e, 0x73, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3d, 0x0a, 0x1b, 0x72, 0x65, - 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x73, 0x5f, 0x6c, 0x61, 0x74, - 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x18, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x69, 0x6e, 0x73, 0x4c, 0x61, - 0x74, 0x65, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x29, 0x0a, 0x10, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, - 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x43, 0x6f, 0x6d, 0x70, 0x6c, - 0x65, 0x74, 0x65, 0x64, 0x22, 0x23, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7e, 0x0a, 0x22, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, - 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x58, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x5f, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x46, 0x75, 0x6c, - 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x11, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x7e, 0x0a, 0x28, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, - 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, - 0x70, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6d, - 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x22, 0x6c, 0x0a, 0x29, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, - 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x65, - 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, - 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x68, 0x0a, 0x2d, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, - 0x41, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, + 0x12, 0x3b, 0x0a, 0x1a, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x73, + 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x65, 0x61, 0x72, 0x6e, 0x65, 0x64, 0x43, 0x6f, 0x69, 0x6e, + 0x73, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3d, 0x0a, + 0x1b, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x5f, 0x63, 0x6f, 0x69, 0x6e, 0x73, 0x5f, + 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x18, 0x72, 0x65, 0x77, 0x61, 0x72, 0x64, 0x65, 0x64, 0x43, 0x6f, 0x69, 0x6e, + 0x73, 0x4c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x29, 0x0a, 0x10, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x43, 0x6f, + 0x6d, 0x70, 0x6c, 0x65, 0x74, 0x65, 0x64, 0x22, 0x23, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7e, 0x0a, 0x22, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x58, 0x0a, 0x12, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x11, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x7e, 0x0a, 0x28, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, + 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, - 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, - 0x5f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, - 0x4e, 0x22, 0x52, 0x0a, 0x35, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, - 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x73, 0x4e, 0x22, 0x68, 0x0a, 0x30, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, - 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, - 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, - 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x22, - 0x64, 0x0a, 0x2c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, + 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x46, + 0x72, 0x6f, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x22, 0x6c, 0x0a, 0x29, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, + 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, + 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, + 0x69, 0x6d, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x68, 0x0a, 0x2d, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x65, 0x72, 0x41, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x63, 0x6b, 0x77, + 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, + 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x12, 0x19, 0x0a, 0x08, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x73, 0x5f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x07, 0x65, 0x70, 0x6f, + 0x63, 0x68, 0x73, 0x4e, 0x22, 0x52, 0x0a, 0x35, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x61, 0x63, + 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, + 0x08, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x07, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x4e, 0x22, 0x68, 0x0a, 0x30, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, + 0x65, 0x72, 0x69, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, + 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x08, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x69, 0x6d, + 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, 0x69, 0x6d, 0x65, + 0x54, 0x6f, 0x22, 0x64, 0x0a, 0x2c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x12, + 0x17, 0x0a, 0x07, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x06, 0x74, 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x22, 0x5f, 0x0a, 0x0a, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x1b, 0x0a, 0x09, + 0x61, 0x69, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x08, 0x61, 0x69, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x73, 0x0a, 0x2d, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x22, 0x9a, + 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x1b, 0x0a, 0x09, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x08, 0x74, 0x69, 0x6d, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x17, 0x0a, 0x07, - 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x74, - 0x69, 0x6d, 0x65, 0x54, 0x6f, 0x22, 0x5f, 0x0a, 0x0a, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x05, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x69, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x61, 0x69, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x73, 0x0a, 0x2d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x42, 0x0a, 0x0c, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x69, 0x5f, 0x74, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x61, 0x69, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x14, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x43, 0x6f, 0x73, 0x74, 0x22, 0x22, 0x0a, 0x20, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x39, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x18, 0x0a, 0x16, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0xce, 0x03, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, + 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x62, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x54, + 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x65, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, + 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6f, + 0x72, 0x61, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x52, 0x0c, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x72, 0x0a, 0x11, 0x54, + 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, + 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x12, 0x3f, + 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x0b, - 0x73, 0x74, 0x61, 0x74, 0x73, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x22, 0x9a, 0x01, 0x0a, 0x25, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, - 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x61, 0x69, 0x5f, 0x74, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x61, 0x69, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x12, 0x1e, 0x0a, 0x0a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x73, 0x12, 0x34, 0x0a, 0x16, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x5f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x5f, 0x63, 0x6f, 0x73, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x14, 0x61, 0x63, 0x74, 0x75, 0x61, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x73, 0x43, 0x6f, 0x73, 0x74, 0x22, 0x22, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x39, 0x0a, 0x21, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x05, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x22, 0x18, 0x0a, 0x16, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0xce, 0x03, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x62, 0x0a, - 0x0d, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, - 0x53, 0x74, 0x61, 0x74, 0x52, 0x0b, 0x73, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, - 0x65, 0x12, 0x65, 0x0a, 0x0e, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, - 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, 0x61, 0x74, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x1a, 0x72, 0x0a, 0x11, 0x54, 0x65, 0x6d, 0x70, - 0x6f, 0x72, 0x61, 0x72, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x53, 0x74, 0x61, 0x74, 0x12, 0x1c, 0x0a, - 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x12, 0x3f, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, - 0x79, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, 0x74, 0x0a, 0x12, - 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x53, 0x74, - 0x61, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, - 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x53, - 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x22, 0x29, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x69, - 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, - 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xb0, 0x01, - 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, - 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x72, - 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x42, 0x61, 0x73, 0x69, 0x73, 0x12, - 0x3c, 0x0a, 0x1a, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x18, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x21, 0x0a, - 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x22, 0x25, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5f, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x37, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x21, + 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x1a, + 0x74, 0x0a, 0x12, 0x54, 0x65, 0x6d, 0x70, 0x6f, 0x72, 0x61, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x53, 0x74, 0x61, 0x74, 0x12, 0x1c, 0x0a, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x02, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x05, + 0x73, 0x74, 0x61, 0x74, 0x73, 0x22, 0x29, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, + 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0xb0, 0x01, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, + 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, + 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, + 0x0d, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x5f, 0x62, 0x61, 0x73, 0x69, 0x73, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x66, 0x66, 0x69, 0x63, 0x42, 0x61, 0x73, + 0x69, 0x73, 0x12, 0x3c, 0x0a, 0x1a, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x18, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, + 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x22, 0x25, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, + 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5f, 0x0a, 0x24, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, + 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x37, 0x0a, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x21, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, + 0x54, 0x61, 0x73, 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x37, 0x0a, 0x1d, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x22, 0x73, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, + 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x52, 0x05, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x22, 0x37, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, - 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x22, 0x73, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, - 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, - 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0x67, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, - 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, - 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, - 0xbc, 0x01, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, - 0x72, 0x61, 0x64, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x42, - 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, - 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, - 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, - 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x48, - 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, - 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, - 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, - 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x62, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, - 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x72, 0x65, 0x63, - 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x4b, 0x56, 0x52, 0x65, - 0x63, 0x6f, 0x72, 0x64, 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, 0x3e, 0x0a, 0x24, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, 0x3b, 0x0a, 0x25, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x5d, 0x0a, 0x1b, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, - 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x03, 0x72, 0x65, 0x71, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x42, - 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x52, 0x03, 0x72, 0x65, 0x71, 0x22, 0x61, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x72, 0x65, 0x73, 0x70, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, - 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x72, 0x65, 0x73, 0x70, 0x22, 0x5d, 0x0a, 0x1e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3b, 0x0a, - 0x03, 0x72, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x03, 0x72, 0x65, 0x71, 0x22, 0x61, 0x0a, 0x1f, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, 0x65, - 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, - 0x04, 0x72, 0x65, 0x73, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x72, 0x65, 0x73, 0x70, 0x22, 0x8d, 0x01, - 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, - 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, - 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, - 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x62, 0x6c, 0x6f, - 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, 0x65, 0x63, 0x65, - 0x69, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x81, 0x01, - 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, - 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, - 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x26, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, - 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x12, 0x62, - 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x22, 0x6b, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, - 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, - 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, - 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xcb, - 0x01, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, - 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, - 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, - 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, - 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, - 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xe0, 0x01, 0x0a, - 0x13, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, - 0x72, 0x69, 0x64, 0x67, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x09, 0x74, 0x6f, 0x6b, 0x65, 0x6e, - 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, 0x18, 0x0a, 0x07, - 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x62, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, - 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x63, 0x69, 0x6d, 0x61, - 0x6c, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x5f, - 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x66, - 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x22, - 0x3c, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x69, 0x0a, - 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x57, 0x72, 0x61, 0x70, 0x70, - 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x08, - 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, - 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x75, 0x0a, 0x23, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, - 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x4e, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, - 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x42, - 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x22, 0x55, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, - 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x29, 0x0a, 0x10, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x46, 0x0a, 0x29, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x22, - 0x1b, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x71, 0x0a, 0x1a, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, - 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, - 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, - 0x17, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, - 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe6, 0x02, 0x0a, 0x16, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, - 0x61, 0x6d, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x12, 0x43, 0x0a, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x6c, 0x61, 0x74, 0x65, 0x73, - 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3b, 0x0a, 0x1a, 0x69, 0x73, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x61, 0x63, - 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x69, 0x73, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x63, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x12, 0x6c, 0x0a, 0x1d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x1a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x63, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x22, 0x47, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, - 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3c, 0x0a, 0x24, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, - 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x4b, 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, - 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x40, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, - 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, - 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7f, 0x0a, - 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, - 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x22, 0x67, 0x0a, 0x1d, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, + 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, + 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, + 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0xbc, 0x01, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, + 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x23, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, - 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, - 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0x3e, - 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, - 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x50, - 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, - 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, - 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, - 0x22, 0x27, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, - 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3d, 0x0a, 0x0a, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x72, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0c, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x72, 0x69, 0x63, - 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, - 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, - 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x22, 0x39, 0x0a, 0x1c, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, - 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x51, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x23, 0x0a, 0x21, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, - 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, - 0x79, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, - 0x69, 0x74, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x0d, 0x4d, 0x6f, - 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x19, 0x0a, 0x08, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, - 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, - 0x74, 0x79, 0x22, 0x76, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, - 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x72, 0x61, 0x6e, 0x74, - 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, - 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x55, 0x72, 0x6c, 0x22, 0x3c, 0x0a, 0x07, 0x47, 0x72, - 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, - 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x38, - 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x52, 0x08, - 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x22, 0x33, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, - 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x72, 0x6f, 0x6c, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, 0x22, 0x3e, 0x0a, - 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, - 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x22, 0x0a, - 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0x41, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x70, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x22, 0x2e, + 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, + 0x64, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0e, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, + 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, + 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, + 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0x48, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, + 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x22, 0x62, 0x0a, 0x1d, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x06, + 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x4b, + 0x56, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x06, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x22, + 0x3e, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x22, + 0x3b, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x65, 0x79, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x65, 0x79, 0x73, 0x22, 0x5d, 0x0a, 0x1b, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, + 0x72, 0x69, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3e, 0x0a, 0x03, 0x72, + 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, + 0x65, 0x74, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x03, 0x72, 0x65, 0x71, 0x22, 0x61, 0x0a, 0x1c, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, + 0x69, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x04, 0x72, + 0x65, 0x73, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x47, 0x65, 0x74, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x72, 0x65, 0x73, 0x70, 0x22, 0x5d, + 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, + 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x3b, 0x0a, 0x03, 0x72, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x63, 0x0a, 0x21, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x3e, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x28, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, - 0x22, 0x28, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x87, 0x01, 0x0a, 0x27, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, 0x61, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, 0x41, 0x63, 0x74, - 0x69, 0x76, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x05, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x67, 0x0a, 0x22, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x41, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x16, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x48, - 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, - 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 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, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, 0x62, 0x61, 0x6c, - 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x6e, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, - 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, - 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xea, 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x42, - 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x55, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x18, - 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, + 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x03, 0x72, 0x65, 0x71, 0x22, 0x61, 0x0a, + 0x1f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, + 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x3e, 0x0a, 0x04, 0x72, 0x65, 0x73, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x04, 0x72, 0x65, 0x73, 0x70, + 0x22, 0x8d, 0x01, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, + 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x6f, 0x72, 0x69, + 0x67, 0x69, 0x6e, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, + 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x4e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x12, 0x23, 0x0a, 0x0d, 0x72, + 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0c, 0x72, 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x49, 0x6e, 0x64, 0x65, 0x78, + 0x22, 0x81, 0x01, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, + 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, + 0x52, 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x22, 0x6b, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, + 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x22, 0xcb, 0x01, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x42, 0x72, + 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5c, 0x0a, 0x12, 0x62, 0x72, 0x69, 0x64, + 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, + 0x1f, 0x00, 0x52, 0x12, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, + 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, + 0xe0, 0x01, 0x0a, 0x13, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x4e, 0x0a, 0x0a, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x5f, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x52, 0x09, 0x74, 0x6f, + 0x6b, 0x65, 0x6e, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x16, 0x0a, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, + 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x73, 0x79, 0x6d, 0x62, 0x6f, 0x6c, 0x12, + 0x18, 0x0a, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x64, 0x65, 0x63, + 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x64, 0x65, 0x63, + 0x69, 0x6d, 0x61, 0x6c, 0x73, 0x12, 0x2b, 0x0a, 0x11, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, + 0x65, 0x64, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x74, 0x74, 0x65, 0x64, 0x42, 0x61, 0x6c, 0x61, 0x6e, + 0x63, 0x65, 0x22, 0x3c, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x22, 0x69, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x44, 0x0a, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x57, 0x72, + 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x52, 0x08, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x3f, 0x0a, 0x22, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x49, 0x64, 0x22, 0x75, 0x0a, 0x23, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x65, 0x73, 0x22, 0x55, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x29, 0x0a, 0x10, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x63, 0x6f, 0x6e, 0x74, 0x72, + 0x61, 0x63, 0x74, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x22, 0x46, 0x0a, 0x29, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, + 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x73, 0x5f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x69, 0x73, 0x56, 0x61, 0x6c, + 0x69, 0x64, 0x22, 0x1b, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x71, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x18, 0x0a, + 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, + 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x16, 0x0a, 0x06, 0x63, 0x6f, 0x64, 0x65, 0x49, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x63, 0x6f, 0x64, 0x65, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, - 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x22, 0x3a, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, - 0x6d, 0x53, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, - 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x51, - 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, - 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, 0x05, 0x73, 0x65, - 0x65, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x22, 0x17, 0x0a, 0x15, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xe6, 0x02, 0x0a, 0x16, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, + 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x39, 0x0a, 0x06, 0x70, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x52, 0x05, 0x73, 0x65, 0x65, 0x64, - 0x73, 0x32, 0xf3, 0x86, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x8f, 0x01, 0x0a, - 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x27, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0xa9, - 0x01, 0x0a, 0x09, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2d, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xa4, 0x01, 0x0a, 0x0c, 0x49, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x12, 0x2d, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6e, 0x66, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x06, 0x70, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x12, 0x43, 0x0a, 0x0c, 0x6c, 0x61, 0x74, 0x65, 0x73, 0x74, 0x5f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x12, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, - 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x2f, 0x7b, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xac, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x2e, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, 0x6c, 0x61, + 0x74, 0x65, 0x73, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x12, 0x3b, 0x0a, 0x1a, 0x69, 0x73, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, + 0x5f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x08, 0x52, 0x17, 0x69, + 0x73, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x63, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x6c, 0x0a, 0x1d, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, + 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x1a, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x63, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x22, 0x47, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, + 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x62, + 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3c, 0x0a, + 0x24, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x4b, 0x0a, 0x27, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x20, 0x0a, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0b, 0x62, 0x6c, 0x6f, + 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x40, 0x0a, 0x28, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x22, 0x24, 0x0a, 0x22, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x7f, 0x0a, 0x23, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, + 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0f, 0x61, 0x70, 0x70, 0x72, 0x6f, + 0x76, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, + 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x52, 0x65, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, + 0x00, 0x52, 0x0e, 0x61, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x22, 0x3e, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, + 0x64, 0x22, 0x50, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, + 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x12, 0x14, 0x0a, + 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x22, 0x27, 0x0a, 0x25, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, + 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, + 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3d, 0x0a, 0x0a, + 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x70, 0x72, 0x69, 0x63, 0x65, 0x22, 0x72, 0x0a, 0x26, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, + 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x48, 0x0a, 0x0c, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, + 0x1f, 0x00, 0x52, 0x0b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x22, + 0x39, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x19, 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x22, 0x51, 0x0a, 0x1d, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x63, + 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x22, 0x23, 0x0a, + 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x22, 0x79, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, + 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x10, 0x6d, 0x6f, 0x64, 0x65, + 0x6c, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x22, 0x46, 0x0a, + 0x0d, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x12, 0x19, + 0x0a, 0x08, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x1a, 0x0a, 0x08, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x08, 0x63, 0x61, 0x70, + 0x61, 0x63, 0x69, 0x74, 0x79, 0x22, 0x76, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, + 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, + 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x67, 0x72, + 0x61, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0e, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, + 0x79, 0x70, 0x65, 0x5f, 0x75, 0x72, 0x6c, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x6d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x55, 0x72, 0x6c, 0x22, 0x3c, 0x0a, + 0x07, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x12, 0x18, 0x0a, 0x07, 0x61, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x70, 0x75, 0x62, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x06, 0x70, 0x75, 0x62, 0x4b, 0x65, 0x79, 0x22, 0x5e, 0x0a, 0x22, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x38, 0x0a, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, + 0x65, 0x52, 0x08, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x22, 0x33, 0x0a, 0x1d, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, + 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x72, 0x6f, 0x6c, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x05, 0x52, 0x04, 0x72, 0x6f, 0x6c, 0x65, + 0x22, 0x3e, 0x0a, 0x1e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, + 0x22, 0x22, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x22, 0x41, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x09, 0x52, 0x09, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x22, 0x1e, 0x0a, 0x1c, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x47, 0x65, 0x74, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x70, 0x0a, 0x1d, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x47, 0x65, 0x74, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4f, 0x0a, 0x0e, 0x6d, 0x6c, 0x6e, 0x6f, + 0x64, 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x22, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0d, 0x6d, 0x6c, 0x6e, 0x6f, + 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x20, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, + 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x63, + 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x05, 0x69, 0x74, 0x65, 0x6d, 0x73, 0x18, 0x01, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x28, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, + 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x05, 0x69, 0x74, + 0x65, 0x6d, 0x73, 0x22, 0x28, 0x0a, 0x26, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, + 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, + 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x87, 0x01, + 0x0a, 0x27, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x69, 0x73, 0x5f, + 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x69, 0x73, + 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x12, 0x3f, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x44, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x0b, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, 0x78, 0x22, 0x67, 0x0a, + 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x29, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, + 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x06, + 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x9f, 0x01, 0x0a, 0x16, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, + 0x65, 0x12, 0x48, 0x0a, 0x0b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x20, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0b, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x08, 0x62, + 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x18, 0x02, 0x20, 0x03, 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, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x08, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x22, 0x6e, 0x0a, 0x24, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, + 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x46, 0x0a, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, + 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, + 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x0a, 0x70, 0x61, + 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0xea, 0x01, 0x0a, 0x25, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, + 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0c, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, + 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x42, 0x04, 0xc8, 0xde, 0x1f, 0x00, 0x52, 0x0c, 0x70, 0x61, 0x72, + 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x47, 0x0a, 0x0a, 0x70, 0x61, 0x67, + 0x69, 0x6e, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x27, 0x2e, + 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x62, 0x61, 0x73, 0x65, 0x2e, 0x71, 0x75, 0x65, 0x72, + 0x79, 0x2e, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2e, 0x50, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x0a, 0x70, 0x61, 0x67, 0x69, 0x6e, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x3a, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, + 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x1f, 0x0a, 0x0b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x64, 0x65, + 0x78, 0x22, 0x51, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, + 0x53, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x35, 0x0a, + 0x05, 0x73, 0x65, 0x65, 0x64, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x52, 0x05, 0x73, + 0x65, 0x65, 0x64, 0x73, 0x22, 0x58, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, + 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x33, 0x0a, 0x16, 0x70, 0x6f, 0x63, + 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x13, 0x70, 0x6f, 0x63, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x53, 0x74, 0x61, 0x72, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x22, 0x82, + 0x01, 0x0a, 0x22, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, + 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x50, 0x6f, + 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6e, 0x61, 0x70, 0x73, + 0x68, 0x6f, 0x74, 0x52, 0x08, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x14, 0x0a, + 0x05, 0x66, 0x6f, 0x75, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, + 0x75, 0x6e, 0x64, 0x32, 0xdc, 0x88, 0x01, 0x0a, 0x05, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x8f, + 0x01, 0x0a, 0x06, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x27, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x12, 0xd2, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0x35, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x32, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2c, 0x12, 0x2a, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, + 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, + 0x12, 0xa9, 0x01, 0x0a, 0x09, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x12, 0x2d, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x45, 0x12, 0x43, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xa4, 0x01, 0x0a, + 0x0c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x41, 0x6c, 0x6c, 0x12, 0x2d, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x2f, - 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xbd, 0x01, 0x0a, 0x11, 0x47, 0x65, - 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, - 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x52, 0x61, - 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x6e, 0x63, 0x65, 0x12, 0xb1, 0x01, 0x0a, 0x0b, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x12, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, - 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, - 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, - 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0xc5, 0x01, 0x0a, 0x0e, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x32, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, - 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, - 0x61, 0x74, 0x61, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x7d, 0x12, 0xba, 0x01, 0x0a, 0x11, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x44, 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x12, 0xbc, - 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, - 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x53, 0x65, - 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x12, 0x3f, 0x2f, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x2f, - 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x7d, 0x12, 0xb1, 0x01, - 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, - 0x6c, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, - 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, - 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, + 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0xef, 0x01, 0x0a, 0x15, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x2e, 0x69, 0x6e, + 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x2f, + 0x7b, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xac, 0x01, 0x0a, 0x0e, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x2f, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x37, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x31, 0x12, 0x2f, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, 0xd2, 0x01, 0x0a, 0x14, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x12, + 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x5f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x59, 0x12, 0x57, 0x2f, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x7d, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x7d, 0x12, 0xd6, 0x01, 0x0a, 0x18, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, - 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x6c, 0x6c, - 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, - 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3d, 0x12, - 0x3b, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, - 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xd1, 0x01, 0x0a, - 0x12, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, - 0x61, 0x67, 0x65, 0x12, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, - 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, - 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x50, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, 0x12, 0x48, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, - 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, 0x67, - 0x65, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, - 0x12, 0xe1, 0x01, 0x0a, 0x16, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x37, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, - 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x54, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x12, 0x4c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4b, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x45, 0x12, 0x43, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, - 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, - 0x73, 0x74, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x7d, 0x12, 0xea, 0x01, 0x0a, 0x18, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, - 0x65, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, - 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x51, - 0x12, 0x4f, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x74, 0x61, - 0x67, 0x65, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x7d, 0x12, 0xef, 0x01, 0x0a, 0x10, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, - 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, - 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, - 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x74, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x6e, 0x12, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, - 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x76, - 0x32, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x2f, 0x7b, - 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x2f, 0x7b, 0x70, - 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, - 0x73, 0x73, 0x7d, 0x12, 0x8e, 0x02, 0x0a, 0x18, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, - 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, - 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x75, 0x12, - 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x2f, - 0x7b, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, - 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x2f, 0x7b, - 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, - 0x65, 0x73, 0x73, 0x7d, 0x12, 0x82, 0x02, 0x0a, 0x1c, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, - 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, - 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, + 0x74, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xbd, 0x01, 0x0a, 0x11, + 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, + 0x72, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, + 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, - 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, - 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5d, 0x12, 0x5b, 0x2f, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x73, 0x74, 0x6f, - 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x6f, 0x63, 0x5f, - 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, - 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xa1, 0x02, 0x0a, 0x24, 0x41, 0x6c, - 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x12, 0x45, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, - 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, - 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x79, 0x47, 0x65, 0x74, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x45, 0x78, 0x65, 0x63, 0x75, 0x74, + 0x6f, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x72, 0x61, 0x6e, 0x64, + 0x6f, 0x6d, 0x5f, 0x65, 0x78, 0x65, 0x63, 0x75, 0x74, 0x6f, 0x72, 0x12, 0xc5, 0x01, 0x0a, 0x0e, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x32, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, + 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, + 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, + 0x42, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, + 0x5f, 0x64, 0x61, 0x74, 0x61, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, + 0x65, 0x78, 0x7d, 0x12, 0xba, 0x01, 0x0a, 0x11, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x41, 0x6c, 0x6c, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, - 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, - 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x6a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x64, 0x12, 0x62, 0x2f, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, - 0x6c, 0x6c, 0x5f, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, - 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, - 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xb5, 0x01, - 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x12, 0xbc, 0x01, 0x0a, 0x0c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, - 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, + 0x65, 0x74, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x12, 0x3f, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0xb6, 0x01, 0x0a, 0x0e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, - 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x6e, 0x63, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x7d, 0x12, + 0xb1, 0x01, 0x0a, 0x0f, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x41, 0x6c, 0x6c, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, + 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x41, 0x6c, 0x6c, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, + 0x12, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x61, 0x6d, 0x6f, + 0x75, 0x6e, 0x74, 0x12, 0xef, 0x01, 0x0a, 0x15, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x39, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, - 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, 0x12, 0xf0, - 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, - 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, - 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, - 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x55, - 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, - 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x4e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x12, 0x46, 0x2f, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, - 0x65, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x6d, 0x70, 0x75, - 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, - 0x6c, 0x12, 0xce, 0x01, 0x0a, 0x15, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x36, 0x2e, 0x69, 0x6e, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, + 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x59, 0x12, 0x57, 0x2f, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x76, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x7d, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xd6, 0x01, 0x0a, 0x18, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, + 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, + 0x6c, 0x6c, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, + 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x43, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x3d, 0x12, 0x3b, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xd1, + 0x01, 0x0a, 0x12, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, + 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x42, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, + 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x50, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4a, 0x12, 0x48, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, + 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, 0x74, + 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x7d, 0x12, 0xe1, 0x01, 0x0a, 0x16, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x37, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, + 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x54, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4e, 0x12, 0x4c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, + 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x66, 0x6f, + 0x72, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xea, 0x01, 0x0a, 0x18, 0x50, 0x6f, 0x63, 0x56, 0x32, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, + 0x61, 0x67, 0x65, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, + 0x6f, 0x63, 0x56, 0x32, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, + 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x63, 0x56, 0x32, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x57, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x51, 0x12, 0x4f, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x73, + 0x74, 0x61, 0x67, 0x65, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x7d, 0x12, 0xef, 0x01, 0x0a, 0x10, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, + 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, + 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, - 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, - 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, - 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, - 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, - 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, - 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x64, 0x61, - 0x74, 0x61, 0x12, 0x9c, 0x01, 0x0a, 0x09, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, 0x6c, - 0x12, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x30, 0x12, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, + 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x74, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x6e, 0x12, 0x6c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, + 0x5f, 0x76, 0x32, 0x5f, 0x73, 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, + 0x2f, 0x7b, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x2f, + 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x8e, 0x02, 0x0a, 0x18, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, + 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, + 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, + 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x7b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x75, 0x12, 0x73, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x5f, 0x61, 0x6c, - 0x6c, 0x12, 0xa8, 0x01, 0x0a, 0x08, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x12, 0x2c, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x77, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, + 0x6e, 0x2f, 0x7b, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, + 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x64, + 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0x82, 0x02, 0x0a, 0x1c, 0x41, 0x6c, 0x6c, 0x50, 0x6f, + 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, + 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, + 0x43, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x6f, 0x43, 0x56, 0x32, 0x53, 0x74, 0x6f, 0x72, 0x65, 0x43, + 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x63, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5d, 0x12, 0x5b, + 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x32, 0x5f, 0x73, + 0x74, 0x6f, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x6d, 0x6d, 0x69, 0x74, 0x73, 0x2f, 0x7b, 0x70, 0x6f, + 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x62, 0x6c, + 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xa1, 0x02, 0x0a, 0x24, + 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, + 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x12, 0x45, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, + 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, + 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, + 0x57, 0x65, 0x69, 0x67, 0x68, 0x74, 0x44, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, + 0x6f, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x53, 0x74, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x6a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x64, 0x12, 0x62, 0x2f, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x77, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x5f, 0x64, 0x69, 0x73, 0x74, 0x72, 0x69, 0x62, 0x75, 0x74, 0x69, 0x6f, 0x6e, 0x73, + 0x2f, 0x7b, 0x70, 0x6f, 0x63, 0x5f, 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, + 0x74, 0x5f, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, + 0xb5, 0x01, 0x0a, 0x0f, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x47, 0x65, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, + 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, + 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x12, 0xb6, 0x01, 0x0a, 0x0e, 0x54, 0x6f, 0x6b, 0x65, + 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, + 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x6f, 0x6d, 0x69, 0x63, 0x73, 0x5f, 0x64, 0x61, 0x74, 0x61, + 0x12, 0xf0, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, + 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, + 0x61, 0x6c, 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, + 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, + 0x74, 0x55, 0x6e, 0x69, 0x74, 0x4f, 0x66, 0x43, 0x6f, 0x6d, 0x70, 0x75, 0x74, 0x65, 0x50, 0x72, + 0x69, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x70, 0x6f, 0x73, 0x61, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x4e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x48, 0x12, 0x46, 0x2f, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x75, 0x6e, 0x69, 0x74, 0x5f, 0x6f, 0x66, 0x5f, 0x63, 0x6f, 0x6d, + 0x70, 0x75, 0x74, 0x65, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x70, 0x6f, + 0x73, 0x61, 0x6c, 0x12, 0xce, 0x01, 0x0a, 0x15, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x12, 0x36, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, + 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x44, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, + 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, + 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x63, 0x75, 0x72, 0x72, + 0x65, 0x6e, 0x74, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x64, 0x61, 0x74, 0x61, 0x12, 0x9c, 0x01, 0x0a, 0x09, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x41, + 0x6c, 0x6c, 0x12, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, + 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x5f, + 0x61, 0x6c, 0x6c, 0x12, 0xa8, 0x01, 0x0a, 0x08, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, + 0x12, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, + 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, + 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x6f, 0x70, 0x5f, 0x6d, + 0x69, 0x6e, 0x65, 0x72, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xa1, + 0x01, 0x0a, 0x0b, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x6c, 0x6c, 0x12, 0x2c, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x70, 0x4d, 0x69, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, + 0x6e, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x2f, 0x12, 0x2d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, - 0x65, 0x72, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x12, 0xa1, 0x01, 0x0a, - 0x0b, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x41, 0x6c, 0x6c, 0x12, 0x2c, 0x2e, 0x69, + 0x65, 0x72, 0x12, 0xdf, 0x01, 0x0a, 0x10, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, + 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x58, 0x12, 0x56, 0x2f, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x6f, 0x75, 0x74, 0x2f, 0x7b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x2f, 0x7b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x49, 0x64, 0x7d, 0x12, 0xc1, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, - 0x6e, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x54, 0x6f, 0x70, 0x4d, 0x69, 0x6e, 0x65, - 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x35, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x2f, 0x12, 0x2d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, + 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x6f, 0x70, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, - 0x12, 0xdf, 0x01, 0x0a, 0x10, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, - 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, - 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x5e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x58, 0x12, 0x56, 0x2f, 0x70, 0x72, 0x6f, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0xff, 0x01, 0x0a, 0x1a, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5a, + 0x12, 0x58, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, + 0x6c, 0x73, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x12, 0xea, 0x01, 0x0a, 0x1d, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x12, 0x3e, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x12, 0x40, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, + 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x8c, 0x02, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x41, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, + 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x42, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x61, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5b, 0x12, 0x59, 0x2f, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x76, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x73, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x72, 0x7d, 0x12, 0xf1, 0x01, 0x0a, 0x17, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, + 0x72, 0x79, 0x12, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, + 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x40, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x53, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x12, 0x4b, 0x2f, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2f, 0x7b, 0x65, 0x70, + 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0x9a, 0x02, 0x0a, 0x24, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x12, 0x45, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, + 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, + 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x63, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5d, 0x12, 0x5b, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6f, 0x75, - 0x74, 0x2f, 0x7b, 0x65, 0x78, 0x70, 0x69, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x7d, 0x2f, 0x7b, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, - 0x64, 0x7d, 0x12, 0xc1, 0x01, 0x0a, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x41, 0x6c, 0x6c, 0x12, 0x34, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, - 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x6f, 0x75, 0x74, 0x12, 0xff, 0x01, 0x0a, 0x1a, 0x49, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, + 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, + 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x12, 0xde, 0x01, 0x0a, 0x1a, 0x45, 0x70, 0x6f, 0x63, + 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, + 0x61, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x12, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, + 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, + 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, + 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, + 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, + 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0xa8, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, + 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, + 0x12, 0x31, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, + 0x61, 0x73, 0x6b, 0x12, 0xba, 0x01, 0x0a, 0x0d, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, + 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5a, 0x12, 0x58, + 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x12, 0x40, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, - 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x49, 0x64, 0x7d, 0x12, 0xea, 0x01, 0x0a, 0x1d, 0x49, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x73, 0x41, 0x6c, 0x6c, 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x74, 0x61, - 0x69, 0x6c, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x42, 0x12, 0x40, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, - 0x74, 0x61, 0x69, 0x6c, 0x73, 0x12, 0x8c, 0x02, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x41, 0x2e, 0x69, 0x6e, 0x66, + 0x6e, 0x63, 0x65, 0x2f, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6e, 0x6f, 0x64, + 0x65, 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x7d, + 0x12, 0xb9, 0x01, 0x0a, 0x10, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, + 0x65, 0x73, 0x41, 0x6c, 0x6c, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x41, 0x6c, + 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, + 0x73, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, + 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, + 0x72, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x61, 0x6c, 0x6c, 0x12, 0xc5, 0x01, 0x0a, + 0x13, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x73, 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x42, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x49, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x61, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5b, 0x12, 0x59, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, - 0x65, 0x74, 0x5f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5f, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, - 0x72, 0x73, 0x2f, 0x7b, 0x69, 0x64, 0x73, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x65, 0x72, 0x7d, 0x12, 0xf1, 0x01, 0x0a, 0x17, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, - 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, - 0x12, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, - 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x40, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x53, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4d, 0x12, 0x4b, 0x2f, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, - 0x63, 0x65, 0x5f, 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, - 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0x9a, 0x02, 0x0a, 0x24, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x12, 0x45, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, - 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x46, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x71, + 0x75, 0x65, 0x75, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, + 0x61, 0x73, 0x6b, 0x73, 0x12, 0xb5, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, - 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x42, 0x79, 0x50, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x63, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x5d, 0x12, 0x5b, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, - 0x6f, 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, - 0x73, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, - 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x12, 0xde, 0x01, 0x0a, 0x1a, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, - 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, - 0x79, 0x41, 0x6c, 0x6c, 0x12, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x41, 0x6c, 0x6c, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, - 0x6e, 0x63, 0x65, 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, - 0x45, 0x70, 0x6f, 0x63, 0x68, 0x50, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, - 0x53, 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, - 0x63, 0x68, 0x5f, 0x70, 0x65, 0x72, 0x66, 0x6f, 0x72, 0x6d, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x73, - 0x75, 0x6d, 0x6d, 0x61, 0x72, 0x79, 0x12, 0xa8, 0x01, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x69, 0x6e, - 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x12, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x39, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x33, 0x12, 0x31, + 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, + 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, + 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x61, 0x6c, 0x6c, 0x12, 0xf2, 0x01, 0x0a, + 0x1a, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, + 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x59, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x53, 0x12, 0x51, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, - 0x6b, 0x12, 0xba, 0x01, 0x0a, 0x0d, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, - 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, - 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x48, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x42, 0x12, 0x40, 0x2f, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, - 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x7d, 0x12, 0xb9, - 0x01, 0x0a, 0x10, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, - 0x41, 0x6c, 0x6c, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x48, - 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x41, 0x6c, 0x6c, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x41, - 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x38, 0x12, 0x36, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x68, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, - 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x5f, 0x61, 0x6c, 0x6c, 0x12, 0xc5, 0x01, 0x0a, 0x13, 0x51, - 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0x34, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x51, 0x75, - 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x51, 0x75, 0x65, 0x75, 0x65, 0x64, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x41, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3b, 0x12, 0x39, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x71, 0x75, 0x65, - 0x75, 0x65, 0x64, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, - 0x6b, 0x73, 0x12, 0xb5, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, - 0x61, 0x73, 0x6b, 0x41, 0x6c, 0x6c, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x41, 0x6c, - 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, - 0x41, 0x6c, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x5f, 0x61, 0x6c, 0x6c, 0x12, 0xf2, 0x01, 0x0a, 0x1a, 0x47, - 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, - 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, + 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x2f, 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, + 0x7d, 0x12, 0xef, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x59, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x53, 0x12, 0x51, 0x2f, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x12, 0x45, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, - 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x2f, - 0x7b, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x49, 0x64, 0x7d, 0x12, - 0xef, 0x01, 0x0a, 0x1d, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x12, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x3f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x43, 0x75, - 0x72, 0x72, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x12, 0x45, 0x2f, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x67, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, - 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, - 0x73, 0x12, 0xcb, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, - 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x36, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, - 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, - 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, - 0xee, 0x01, 0x0a, 0x1c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, - 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, - 0x12, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, - 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, - 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, - 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x12, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x76, - 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, - 0x72, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, - 0x12, 0x81, 0x02, 0x0a, 0x22, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, - 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x61, - 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x42, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, - 0x70, 0x65, 0x72, 0x41, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x63, 0x6b, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x55, 0x12, - 0x53, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x7b, - 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x77, - 0x61, 0x72, 0x64, 0x73, 0x12, 0xc2, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, - 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, - 0x38, 0x12, 0x36, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xbc, 0x01, 0x0a, 0x18, 0x44, 0x65, - 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, - 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x44, - 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, + 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x63, 0x75, 0x72, 0x72, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x12, 0xcb, 0x01, 0x0a, 0x18, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, + 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, + 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, + 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, + 0x46, 0x75, 0x6c, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, + 0x73, 0x12, 0xee, 0x01, 0x0a, 0x1c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, + 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, + 0x65, 0x72, 0x12, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, + 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, + 0x79, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x42, 0x79, + 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x12, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, - 0x65, 0x62, 0x75, 0x67, 0x2f, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x61, - 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x84, 0x02, 0x0a, 0x29, 0x49, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, - 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, 0x61, 0x63, - 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x4a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, - 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, - 0x68, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x12, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x65, - 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x65, - 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, - 0xe8, 0x01, 0x0a, 0x24, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, - 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, - 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x45, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, - 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x54, 0x69, - 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, + 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x65, 0x72, 0x7d, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, + 0x6d, 0x65, 0x12, 0x81, 0x02, 0x0a, 0x22, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x44, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, + 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x42, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x44, 0x65, 0x76, 0x65, + 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x41, 0x6e, 0x64, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x42, 0x61, 0x63, + 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5b, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x55, 0x12, 0x53, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, + 0x2f, 0x7b, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x7d, 0x2f, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x62, 0x61, 0x63, + 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0xc2, 0x01, 0x0a, 0x11, 0x43, 0x6f, 0x75, 0x6e, 0x74, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, + 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, + 0x6f, 0x75, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3e, 0x82, 0xd3, 0xe4, + 0x93, 0x02, 0x38, 0x12, 0x36, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, - 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0xeb, 0x01, 0x0a, 0x20, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0xbc, 0x01, 0x0a, 0x18, + 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x44, 0x65, 0x76, 0x65, 0x6c, 0x6f, + 0x70, 0x65, 0x72, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x2b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x44, 0x65, 0x62, 0x75, 0x67, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x64, 0x65, 0x62, 0x75, 0x67, 0x2f, 0x64, 0x65, 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, + 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x12, 0x84, 0x02, 0x0a, 0x29, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x12, - 0x41, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, - 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x42, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, - 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, - 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0xe6, 0x01, 0x0a, 0x1b, 0x47, 0x65, 0x74, - 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x42, + 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x12, 0x4a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, + 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x45, 0x70, + 0x6f, 0x63, 0x68, 0x73, 0x42, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x4f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x12, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x64, 0x65, + 0x76, 0x65, 0x6c, 0x6f, 0x70, 0x65, 0x72, 0x2f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, + 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x77, 0x61, 0x72, 0x64, + 0x73, 0x12, 0xe8, 0x01, 0x0a, 0x24, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, + 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x12, 0x45, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, + 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, + 0x54, 0x69, 0x6d, 0x65, 0x50, 0x65, 0x72, 0x69, 0x6f, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3d, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x37, 0x12, 0x35, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x73, + 0x74, 0x61, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0xeb, 0x01, 0x0a, + 0x20, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x73, 0x12, 0x41, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x42, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x73, 0x41, 0x6e, 0x64, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x53, 0x74, 0x61, 0x74, 0x73, 0x42, 0x79, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, + 0x12, 0x38, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x73, 0x5f, 0x73, 0x74, 0x61, + 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x12, 0xe6, 0x01, 0x0a, 0x1b, 0x47, + 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x12, 0x3c, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x41, 0x76, 0x65, 0x72, 0x61, 0x67, 0x65, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, 0x42, 0x2f, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x44, 0x12, + 0x42, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, + 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, 0x72, + 0x61, 0x67, 0x65, 0x12, 0xd6, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, + 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, + 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, 0x6f, + 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, + 0x6b, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, + 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x72, + 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0xbf, 0x01, 0x0a, + 0x0e, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, + 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, + 0x12, 0x3c, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x75, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x2f, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xb9, + 0x01, 0x0a, 0x11, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x41, 0x6c, 0x6c, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, + 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, + 0x61, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0xf0, 0x01, 0x0a, 0x11, 0x42, + 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, + 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, + 0x6c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x66, 0x12, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, + 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x62, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, + 0x7b, 0x6f, 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x7b, + 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x7d, 0x2f, 0x7b, 0x72, + 0x65, 0x63, 0x65, 0x69, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xc6, 0x01, + 0x0a, 0x12, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, + 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, + 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x67, 0x65, 0x74, 0x5f, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x76, - 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x61, 0x76, 0x65, 0x72, 0x61, 0x67, - 0x65, 0x12, 0xd6, 0x01, 0x0a, 0x17, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, - 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x12, 0x38, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, - 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x49, 0x6e, 0x50, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x54, 0x72, 0x61, - 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x54, 0x61, 0x73, 0x6b, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x67, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x72, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x12, 0xbf, 0x01, 0x0a, 0x0e, 0x50, - 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0x32, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x44, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3e, 0x12, 0x3c, - 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x5f, 0x75, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x2f, 0x7b, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xb9, 0x01, 0x0a, - 0x11, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x41, - 0x6c, 0x6c, 0x12, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, - 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x50, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, 0x55, 0x70, 0x67, 0x72, - 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x35, 0x12, 0x33, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x61, 0x6c, - 0x5f, 0x75, 0x70, 0x67, 0x72, 0x61, 0x64, 0x65, 0x12, 0xf0, 0x01, 0x0a, 0x11, 0x42, 0x72, 0x69, - 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x35, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, - 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x47, 0x65, 0x74, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x6c, 0x82, - 0xd3, 0xe4, 0x93, 0x02, 0x66, 0x12, 0x64, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, - 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x62, 0x72, 0x69, 0x64, 0x67, - 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x2f, 0x7b, 0x6f, - 0x72, 0x69, 0x67, 0x69, 0x6e, 0x5f, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x7d, 0x2f, 0x7b, 0x62, 0x6c, - 0x6f, 0x63, 0x6b, 0x5f, 0x6e, 0x75, 0x6d, 0x62, 0x65, 0x72, 0x7d, 0x2f, 0x7b, 0x72, 0x65, 0x63, - 0x65, 0x69, 0x70, 0x74, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xc6, 0x01, 0x0a, 0x12, - 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x73, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, - 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x6c, 0x6c, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x54, - 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, 0x2f, 0x70, 0x72, - 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, 0x63, 0x74, - 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xd4, 0x01, 0x0a, 0x16, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x12, - 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, + 0x63, 0x65, 0x2f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x61, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0xd4, 0x01, 0x0a, 0x16, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, - 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x12, 0x3f, 0x2f, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, - 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xac, 0x01, 0x0a, 0x0d, - 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x12, 0x2e, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2f, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, - 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, - 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, - 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0xd3, 0x01, 0x0a, 0x14, 0x57, - 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, - 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, - 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, + 0x6e, 0x12, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, 0x69, + 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, + 0x61, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x12, 0x44, 0x2f, 0x70, 0x72, 0x6f, - 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x62, 0x61, - 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, - 0x12, 0xfe, 0x01, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, - 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, - 0x65, 0x12, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, - 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, 0x6c, 0x69, - 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, - 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x5f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x59, 0x12, 0x57, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x42, 0x72, 0x69, 0x64, 0x67, 0x65, 0x41, 0x64, 0x64, 0x72, + 0x65, 0x73, 0x73, 0x65, 0x73, 0x42, 0x79, 0x43, 0x68, 0x61, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x47, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x41, 0x12, 0x3f, 0x2f, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x62, 0x72, 0x69, 0x64, 0x67, 0x65, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x65, 0x73, 0x2f, 0x7b, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xac, 0x01, + 0x0a, 0x0d, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x12, + 0x2e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2f, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x6f, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x3a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x76, 0x61, - 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x74, - 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x2f, 0x7b, - 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, - 0x7d, 0x12, 0xd2, 0x01, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x37, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x5f, 0x70, 0x6f, 0x6f, 0x6c, 0x12, 0xd3, 0x01, 0x0a, + 0x14, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, - 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x70, 0x70, - 0x72, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x5f, 0x66, 0x6f, 0x72, - 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x12, 0xc8, 0x01, 0x0a, 0x10, 0x54, 0x72, 0x61, 0x69, 0x6e, - 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x31, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, - 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x12, 0x45, 0x2f, 0x70, 0x72, 0x6f, + 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, + 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x12, 0x44, 0x2f, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, + 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x2f, 0x7b, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x7d, 0x12, 0xfe, 0x01, 0x0a, 0x1c, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, + 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, + 0x61, 0x64, 0x65, 0x12, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, + 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x56, 0x61, + 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x57, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x5f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x59, 0x12, 0x57, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x76, 0x5f, 0x72, 0x65, 0x63, 0x6f, - 0x72, 0x64, 0x2f, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x6b, 0x65, 0x79, - 0x7d, 0x12, 0xe4, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x39, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, - 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, - 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, - 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x5f, 0x6b, 0x76, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x2f, - 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x7d, 0x12, 0xb4, 0x01, 0x0a, 0x0f, 0x54, 0x72, 0x61, - 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, - 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x31, + 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x77, 0x72, 0x61, 0x70, 0x70, 0x65, 0x64, + 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x66, 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, + 0x2f, 0x7b, 0x63, 0x6f, 0x6e, 0x74, 0x72, 0x61, 0x63, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x7d, 0x12, 0xd2, 0x01, 0x0a, 0x16, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, + 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x12, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, - 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x70, 0x72, 0x6f, 0x64, - 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, - 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x12, - 0xc1, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, - 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, - 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, - 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, + 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x41, 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x54, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x46, 0x6f, 0x72, 0x54, 0x72, 0x61, 0x64, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, - 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x5f, 0x6e, 0x6f, - 0x64, 0x65, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x09, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, - 0x6f, 0x12, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, - 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, + 0x70, 0x70, 0x72, 0x6f, 0x76, 0x65, 0x64, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x5f, 0x66, + 0x6f, 0x72, 0x5f, 0x74, 0x72, 0x61, 0x64, 0x65, 0x12, 0xc8, 0x01, 0x0a, 0x10, 0x54, 0x72, 0x61, + 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, - 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, - 0x66, 0x6f, 0x12, 0xe6, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, - 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x38, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4d, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x47, 0x12, 0x45, 0x2f, 0x70, + 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x6b, 0x76, 0x5f, 0x72, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x2f, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x7d, 0x2f, 0x7b, 0x6b, + 0x65, 0x79, 0x7d, 0x12, 0xe4, 0x01, 0x0a, 0x18, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, + 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, + 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, + 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4c, 0x69, 0x73, 0x74, 0x54, 0x72, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x4b, 0x76, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x4b, 0x65, 0x79, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, + 0x49, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6c, 0x69, 0x73, 0x74, 0x5f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, + 0x6e, 0x67, 0x5f, 0x6b, 0x76, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x5f, 0x6b, 0x65, 0x79, + 0x73, 0x2f, 0x7b, 0x74, 0x61, 0x73, 0x6b, 0x49, 0x64, 0x7d, 0x12, 0xb4, 0x01, 0x0a, 0x0f, 0x54, + 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x12, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, - 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, + 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, + 0x6e, 0x69, 0x6e, 0x67, 0x42, 0x61, 0x72, 0x72, 0x69, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x3c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x36, 0x12, 0x34, 0x2f, 0x70, 0x72, + 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x62, 0x61, 0x72, 0x72, 0x69, 0x65, + 0x72, 0x12, 0xc1, 0x01, 0x0a, 0x12, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, + 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x56, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x12, 0x4e, 0x2f, 0x70, 0x72, + 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x69, 0x76, + 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x34, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, + 0x67, 0x41, 0x6c, 0x69, 0x76, 0x65, 0x4e, 0x6f, 0x64, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x5f, 0x63, 0x5f, 0x62, 0x61, 0x74, 0x63, - 0x68, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x7b, 0x62, - 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xf6, 0x01, 0x0a, 0x1b, - 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x3c, 0x2e, 0x69, 0x6e, + 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6c, 0x69, 0x76, 0x65, 0x5f, + 0x6e, 0x6f, 0x64, 0x65, 0x73, 0x12, 0x9c, 0x01, 0x0a, 0x09, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x2a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, + 0x70, 0x6f, 0x63, 0x68, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x70, 0x6f, 0x63, 0x68, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x36, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x30, 0x12, 0x2e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, + 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, + 0x69, 0x6e, 0x66, 0x6f, 0x12, 0xe6, 0x01, 0x0a, 0x17, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, + 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x12, 0x38, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, + 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, + 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x39, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x56, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x50, 0x12, 0x4e, 0x2f, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x5f, 0x63, 0x5f, 0x62, 0x61, + 0x74, 0x63, 0x68, 0x65, 0x73, 0x5f, 0x61, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, + 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xf6, 0x01, + 0x0a, 0x1b, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x3c, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, + 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, + 0x69, 0x67, 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, - 0x68, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3d, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x68, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5a, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x54, 0x12, 0x52, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x6f, + 0x5f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x61, + 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, + 0x65, 0x69, 0x67, 0x68, 0x74, 0x7d, 0x12, 0xd6, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, + 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, + 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x12, 0x44, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, + 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, + 0x72, 0x69, 0x63, 0x65, 0x2f, 0x7b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, + 0xdc, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, + 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, + 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, + 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x6f, 0x43, 0x76, 0x61, 0x6c, - 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x41, 0x74, 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5a, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x54, - 0x12, 0x52, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x6f, 0x5f, 0x63, - 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x73, 0x5f, 0x61, 0x74, 0x5f, - 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x2f, 0x7b, 0x62, 0x6c, 0x6f, 0x63, 0x6b, 0x48, 0x65, 0x69, - 0x67, 0x68, 0x74, 0x7d, 0x12, 0xd6, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, - 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x12, 0x36, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, + 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, + 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x65, + 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0xc0, + 0x01, 0x0a, 0x10, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, + 0x69, 0x74, 0x79, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, - 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x4c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x46, 0x12, 0x44, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, - 0x65, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, - 0x63, 0x65, 0x2f, 0x7b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, 0xdc, 0x01, - 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, 0x72, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0x3a, 0x2e, 0x69, 0x6e, + 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, + 0x02, 0x3f, 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63, 0x61, + 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x2f, 0x7b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, + 0x7d, 0x12, 0xca, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, + 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, - 0x65, 0x6c, 0x50, 0x65, 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x50, 0x65, - 0x72, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x50, 0x72, 0x69, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x70, 0x65, 0x72, 0x5f, - 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x5f, 0x70, 0x72, 0x69, 0x63, 0x65, 0x73, 0x12, 0xc0, 0x01, 0x0a, - 0x10, 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, - 0x79, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x47, 0x65, 0x74, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x79, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x45, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3f, - 0x12, 0x3d, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, + 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, + 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, + 0xe4, 0x93, 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, + 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x6f, + 0x64, 0x65, 0x6c, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0xf3, + 0x01, 0x0a, 0x15, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, + 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, + 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, + 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, + 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x82, 0xd3, 0xe4, 0x93, 0x02, + 0x63, 0x12, 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x5f, + 0x62, 0x79, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2f, + 0x7b, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, + 0x7d, 0x2f, 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, + 0x75, 0x72, 0x6c, 0x7d, 0x12, 0xb2, 0x01, 0x0a, 0x0d, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, + 0x65, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0xbd, 0x01, 0x0a, 0x11, 0x54, 0x72, + 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x12, + 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, + 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, + 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, + 0x12, 0x37, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x63, 0x61, 0x70, 0x61, - 0x63, 0x69, 0x74, 0x79, 0x2f, 0x7b, 0x6d, 0x6f, 0x64, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x7d, 0x12, - 0xca, 0x01, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, - 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, + 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0xc9, 0x01, 0x0a, 0x14, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, + 0x73, 0x74, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, + 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, + 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, - 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, - 0x41, 0x6c, 0x6c, 0x4d, 0x6f, 0x64, 0x65, 0x6c, 0x43, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, - 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x40, 0x82, 0xd3, 0xe4, 0x93, - 0x02, 0x3a, 0x12, 0x38, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x6c, 0x6c, 0x5f, 0x6d, 0x6f, 0x64, 0x65, - 0x6c, 0x5f, 0x63, 0x61, 0x70, 0x61, 0x63, 0x69, 0x74, 0x69, 0x65, 0x73, 0x12, 0xf3, 0x01, 0x0a, - 0x15, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, - 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, + 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x12, 0x3a, 0x2f, 0x70, 0x72, 0x6f, 0x64, + 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, + 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0xd6, 0x01, 0x0a, 0x14, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x47, 0x72, 0x61, 0x6e, 0x74, 0x65, - 0x65, 0x73, 0x42, 0x79, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x69, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x63, 0x12, - 0x61, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, - 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x67, 0x72, 0x61, 0x6e, 0x74, 0x65, 0x65, 0x73, 0x5f, 0x62, 0x79, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x2f, 0x7b, 0x67, - 0x72, 0x61, 0x6e, 0x74, 0x65, 0x72, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x7d, 0x2f, - 0x7b, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x75, 0x72, - 0x6c, 0x7d, 0x12, 0xb2, 0x01, 0x0a, 0x0d, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x47, 0x65, 0x74, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x47, 0x65, 0x74, 0x4d, 0x4c, 0x4e, 0x6f, 0x64, 0x65, 0x56, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3a, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x34, 0x12, 0x32, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x6d, 0x6c, 0x6e, 0x6f, 0x64, 0x65, 0x5f, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0xbd, 0x01, 0x0a, 0x11, 0x54, 0x72, 0x61, 0x69, - 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x12, 0x32, 0x2e, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, + 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, + 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x82, + 0xd3, 0xe4, 0x93, 0x02, 0x49, 0x12, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, + 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x78, 0x63, 0x6c, 0x75, + 0x64, 0x65, 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, + 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xe2, + 0x01, 0x0a, 0x1a, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, - 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x33, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x54, 0x72, 0x61, - 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3f, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x39, 0x12, 0x37, - 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x74, 0x72, 0x61, 0x69, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6c, 0x6c, - 0x6f, 0x77, 0x5f, 0x6c, 0x69, 0x73, 0x74, 0x12, 0xc9, 0x01, 0x0a, 0x14, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, - 0x12, 0x35, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, - 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x41, 0x6c, - 0x6c, 0x6f, 0x77, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0x42, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x3c, 0x12, 0x3a, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, - 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, 0x72, - 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x5f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x6c, - 0x69, 0x73, 0x74, 0x12, 0xd6, 0x01, 0x0a, 0x14, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x12, 0x35, 0x2e, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, - 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, 0x64, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, - 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x4f, 0x82, 0xd3, 0xe4, - 0x93, 0x02, 0x49, 0x12, 0x47, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, - 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x65, 0x78, 0x63, 0x6c, 0x75, 0x64, 0x65, - 0x64, 0x5f, 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x2f, 0x7b, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xe2, 0x01, 0x0a, - 0x1a, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x2e, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, + 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x69, 0x6e, 0x66, + 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, + 0x12, 0x41, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, + 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x12, 0xdf, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, + 0x73, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, - 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x41, 0x63, 0x74, 0x69, 0x76, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x49, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x43, 0x12, 0x41, - 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, - 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x12, 0xdf, 0x01, 0x0a, 0x19, 0x4c, 0x69, 0x73, 0x74, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, - 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, - 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x50, - 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x63, 0x6f, - 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, 0x5f, 0x65, - 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, - 0x65, 0x78, 0x7d, 0x12, 0xb6, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x61, 0x6e, 0x64, - 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x73, 0x12, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x50, 0x6f, 0x43, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x51, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x4b, 0x12, 0x49, 0x2f, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x6f, 0x63, + 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, + 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xb6, 0x01, 0x0a, 0x0f, 0x4c, 0x69, 0x73, 0x74, 0x52, 0x61, + 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x73, 0x12, 0x2c, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x73, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, - 0x79, 0x52, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x53, 0x65, 0x65, 0x64, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, - 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, - 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, - 0x65, 0x2f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x73, 0x2f, 0x7b, - 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xd9, 0x01, 0x0a, - 0x18, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, - 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x39, 0x2e, 0x69, 0x6e, 0x66, 0x65, - 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, - 0x73, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, + 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x2f, 0x72, 0x61, 0x6e, 0x64, 0x6f, 0x6d, 0x5f, 0x73, 0x65, 0x65, 0x64, 0x73, + 0x2f, 0x7b, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x5f, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x7d, 0x12, 0xd9, + 0x01, 0x0a, 0x18, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, + 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0x39, 0x2e, 0x69, 0x6e, + 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, + 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3a, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, + 0x74, 0x68, 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, 0x72, 0x6f, + 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, + 0x70, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x77, 0x69, 0x74, + 0x68, 0x5f, 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x12, 0xe6, 0x01, 0x0a, 0x15, 0x50, + 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6e, 0x61, 0x70, + 0x73, 0x68, 0x6f, 0x74, 0x12, 0x36, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x50, 0x61, 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x57, 0x69, 0x74, 0x68, - 0x42, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x46, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x40, 0x12, 0x3e, 0x2f, 0x70, 0x72, 0x6f, 0x64, 0x75, - 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x70, 0x61, - 0x72, 0x74, 0x69, 0x63, 0x69, 0x70, 0x61, 0x6e, 0x74, 0x73, 0x5f, 0x77, 0x69, 0x74, 0x68, 0x5f, - 0x62, 0x61, 0x6c, 0x61, 0x6e, 0x63, 0x65, 0x73, 0x42, 0xb8, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x42, 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, - 0x50, 0x01, 0x5a, 0x24, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, - 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xa2, 0x02, 0x03, 0x49, 0x49, 0x58, 0xaa, 0x02, - 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0xca, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xe2, 0x02, 0x1f, 0x49, 0x6e, 0x66, - 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, - 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x14, 0x49, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x3a, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6e, 0x61, + 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x37, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x6f, 0x43, 0x56, 0x61, 0x6c, 0x69, 0x64, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x5c, 0x82, 0xd3, 0xe4, 0x93, 0x02, 0x56, 0x12, 0x54, 0x2f, + 0x70, 0x72, 0x6f, 0x64, 0x75, 0x63, 0x74, 0x73, 0x63, 0x69, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, + 0x63, 0x65, 0x2f, 0x70, 0x6f, 0x63, 0x5f, 0x76, 0x61, 0x6c, 0x69, 0x64, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x5f, 0x73, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x2f, 0x7b, 0x70, 0x6f, 0x63, 0x5f, + 0x73, 0x74, 0x61, 0x67, 0x65, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x65, 0x69, 0x67, + 0x68, 0x74, 0x7d, 0x42, 0xb8, 0x01, 0x0a, 0x17, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x42, + 0x0a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x24, 0x63, + 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0xa2, 0x02, 0x03, 0x49, 0x49, 0x58, 0xaa, 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0xca, + 0x02, 0x13, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0xe2, 0x02, 0x1f, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, + 0x65, 0x5c, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x14, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x6e, 0x63, 0x65, 0x3a, 0x3a, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x62, 0x06, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -91982,7 +92985,7 @@ func file_inference_inference_query_proto_rawDescGZIP() []byte { return file_inference_inference_query_proto_rawDescData } -var file_inference_inference_query_proto_msgTypes = make([]protoimpl.MessageInfo, 178) +var file_inference_inference_query_proto_msgTypes = make([]protoimpl.MessageInfo, 180) var file_inference_inference_query_proto_goTypes = []interface{}{ (*QueryParamsRequest)(nil), // 0: inference.inference.QueryParamsRequest (*QueryParamsResponse)(nil), // 1: inference.inference.QueryParamsResponse @@ -92160,323 +93163,329 @@ var file_inference_inference_query_proto_goTypes = []interface{}{ (*QueryParticipantsWithBalancesResponse)(nil), // 173: inference.inference.QueryParticipantsWithBalancesResponse (*QueryRandomSeedsRequest)(nil), // 174: inference.inference.QueryRandomSeedsRequest (*QueryRandomSeedsResponse)(nil), // 175: inference.inference.QueryRandomSeedsResponse - (*QueryDebugStatsResponse_TemporaryTimeStat)(nil), // 176: inference.inference.QueryDebugStatsResponse.TemporaryTimeStat - (*QueryDebugStatsResponse_TemporaryEpochStat)(nil), // 177: inference.inference.QueryDebugStatsResponse.TemporaryEpochStat - (*Params)(nil), // 178: inference.inference.Params - (*Inference)(nil), // 179: inference.inference.Inference - (*v1beta1.PageRequest)(nil), // 180: cosmos.base.query.v1beta1.PageRequest - (*v1beta1.PageResponse)(nil), // 181: cosmos.base.query.v1beta1.PageResponse - (*Participant)(nil), // 182: inference.inference.Participant - (*EpochGroupData)(nil), // 183: inference.inference.EpochGroupData - (*SettleAmount)(nil), // 184: inference.inference.SettleAmount - (*EpochGroupValidations)(nil), // 185: inference.inference.EpochGroupValidations - (*PoCBatch)(nil), // 186: inference.inference.PoCBatch - (*PoCValidation)(nil), // 187: inference.inference.PoCValidation - (*PoCValidationV2)(nil), // 188: inference.inference.PoCValidationV2 - (*MLNodeWeight)(nil), // 189: inference.inference.MLNodeWeight - (*TokenomicsData)(nil), // 190: inference.inference.TokenomicsData - (*UnitOfComputePriceProposal)(nil), // 191: inference.inference.UnitOfComputePriceProposal - (*Model)(nil), // 192: inference.inference.Model - (*TopMiner)(nil), // 193: inference.inference.TopMiner - (*InferenceTimeout)(nil), // 194: inference.inference.InferenceTimeout - (*InferenceValidationDetails)(nil), // 195: inference.inference.InferenceValidationDetails - (*ValidationParams)(nil), // 196: inference.inference.ValidationParams - (*EpochPerformanceSummary)(nil), // 197: inference.inference.EpochPerformanceSummary - (*TrainingTask)(nil), // 198: inference.inference.TrainingTask - (*HardwareNodes)(nil), // 199: inference.inference.HardwareNodes - (*DeveloperStatsByTime)(nil), // 200: inference.inference.DeveloperStatsByTime - (*PartialUpgrade)(nil), // 201: inference.inference.PartialUpgrade - (*TrainingTaskKVRecord)(nil), // 202: inference.inference.TrainingTaskKVRecord - (*GetBarrierStatusRequest)(nil), // 203: inference.inference.GetBarrierStatusRequest - (*GetBarrierStatusResponse)(nil), // 204: inference.inference.GetBarrierStatusResponse - (*GetAliveNodesRequest)(nil), // 205: inference.inference.GetAliveNodesRequest - (*GetAliveNodesResponse)(nil), // 206: inference.inference.GetAliveNodesResponse - (*BridgeTransaction)(nil), // 207: inference.inference.BridgeTransaction - (*BridgeWrappedTokenContract)(nil), // 208: inference.inference.BridgeWrappedTokenContract - (*BridgeContractAddress)(nil), // 209: inference.inference.BridgeContractAddress - (*Epoch)(nil), // 210: inference.inference.Epoch - (*ConfirmationPoCEvent)(nil), // 211: inference.inference.ConfirmationPoCEvent - (*BridgeTokenReference)(nil), // 212: inference.inference.BridgeTokenReference - (*MLNodeVersion)(nil), // 213: inference.inference.MLNodeVersion - (*ExcludedParticipant)(nil), // 214: inference.inference.ExcludedParticipant - (*v1beta11.Coin)(nil), // 215: cosmos.base.v1beta1.Coin - (*RandomSeed)(nil), // 216: inference.inference.RandomSeed - (*DeveloperStatsByEpoch)(nil), // 217: inference.inference.DeveloperStatsByEpoch + (*QueryPoCValidationSnapshotRequest)(nil), // 176: inference.inference.QueryPoCValidationSnapshotRequest + (*QueryPoCValidationSnapshotResponse)(nil), // 177: inference.inference.QueryPoCValidationSnapshotResponse + (*QueryDebugStatsResponse_TemporaryTimeStat)(nil), // 178: inference.inference.QueryDebugStatsResponse.TemporaryTimeStat + (*QueryDebugStatsResponse_TemporaryEpochStat)(nil), // 179: inference.inference.QueryDebugStatsResponse.TemporaryEpochStat + (*Params)(nil), // 180: inference.inference.Params + (*Inference)(nil), // 181: inference.inference.Inference + (*v1beta1.PageRequest)(nil), // 182: cosmos.base.query.v1beta1.PageRequest + (*v1beta1.PageResponse)(nil), // 183: cosmos.base.query.v1beta1.PageResponse + (*Participant)(nil), // 184: inference.inference.Participant + (*EpochGroupData)(nil), // 185: inference.inference.EpochGroupData + (*SettleAmount)(nil), // 186: inference.inference.SettleAmount + (*EpochGroupValidations)(nil), // 187: inference.inference.EpochGroupValidations + (*PoCBatch)(nil), // 188: inference.inference.PoCBatch + (*PoCValidation)(nil), // 189: inference.inference.PoCValidation + (*PoCValidationV2)(nil), // 190: inference.inference.PoCValidationV2 + (*MLNodeWeight)(nil), // 191: inference.inference.MLNodeWeight + (*TokenomicsData)(nil), // 192: inference.inference.TokenomicsData + (*UnitOfComputePriceProposal)(nil), // 193: inference.inference.UnitOfComputePriceProposal + (*Model)(nil), // 194: inference.inference.Model + (*TopMiner)(nil), // 195: inference.inference.TopMiner + (*InferenceTimeout)(nil), // 196: inference.inference.InferenceTimeout + (*InferenceValidationDetails)(nil), // 197: inference.inference.InferenceValidationDetails + (*ValidationParams)(nil), // 198: inference.inference.ValidationParams + (*EpochPerformanceSummary)(nil), // 199: inference.inference.EpochPerformanceSummary + (*TrainingTask)(nil), // 200: inference.inference.TrainingTask + (*HardwareNodes)(nil), // 201: inference.inference.HardwareNodes + (*DeveloperStatsByTime)(nil), // 202: inference.inference.DeveloperStatsByTime + (*PartialUpgrade)(nil), // 203: inference.inference.PartialUpgrade + (*TrainingTaskKVRecord)(nil), // 204: inference.inference.TrainingTaskKVRecord + (*GetBarrierStatusRequest)(nil), // 205: inference.inference.GetBarrierStatusRequest + (*GetBarrierStatusResponse)(nil), // 206: inference.inference.GetBarrierStatusResponse + (*GetAliveNodesRequest)(nil), // 207: inference.inference.GetAliveNodesRequest + (*GetAliveNodesResponse)(nil), // 208: inference.inference.GetAliveNodesResponse + (*BridgeTransaction)(nil), // 209: inference.inference.BridgeTransaction + (*BridgeWrappedTokenContract)(nil), // 210: inference.inference.BridgeWrappedTokenContract + (*BridgeContractAddress)(nil), // 211: inference.inference.BridgeContractAddress + (*Epoch)(nil), // 212: inference.inference.Epoch + (*ConfirmationPoCEvent)(nil), // 213: inference.inference.ConfirmationPoCEvent + (*BridgeTokenReference)(nil), // 214: inference.inference.BridgeTokenReference + (*MLNodeVersion)(nil), // 215: inference.inference.MLNodeVersion + (*ExcludedParticipant)(nil), // 216: inference.inference.ExcludedParticipant + (*v1beta11.Coin)(nil), // 217: cosmos.base.v1beta1.Coin + (*RandomSeed)(nil), // 218: inference.inference.RandomSeed + (*PoCValidationSnapshot)(nil), // 219: inference.inference.PoCValidationSnapshot + (*DeveloperStatsByEpoch)(nil), // 220: inference.inference.DeveloperStatsByEpoch } var file_inference_inference_query_proto_depIdxs = []int32{ - 178, // 0: inference.inference.QueryParamsResponse.params:type_name -> inference.inference.Params - 179, // 1: inference.inference.QueryGetInferenceResponse.inference:type_name -> inference.inference.Inference - 180, // 2: inference.inference.QueryAllInferenceRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 179, // 3: inference.inference.QueryAllInferenceResponse.inference:type_name -> inference.inference.Inference - 181, // 4: inference.inference.QueryAllInferenceResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 182, // 5: inference.inference.QueryGetParticipantResponse.participant:type_name -> inference.inference.Participant - 180, // 6: inference.inference.QueryAllParticipantRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 182, // 7: inference.inference.QueryAllParticipantResponse.participant:type_name -> inference.inference.Participant - 181, // 8: inference.inference.QueryAllParticipantResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 182, // 9: inference.inference.QueryGetRandomExecutorResponse.executor:type_name -> inference.inference.Participant - 183, // 10: inference.inference.QueryGetEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData - 180, // 11: inference.inference.QueryAllEpochGroupDataRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 183, // 12: inference.inference.QueryAllEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData - 181, // 13: inference.inference.QueryAllEpochGroupDataResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 184, // 14: inference.inference.QueryGetSettleAmountResponse.settle_amount:type_name -> inference.inference.SettleAmount - 180, // 15: inference.inference.QueryAllSettleAmountRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 184, // 16: inference.inference.QueryAllSettleAmountResponse.settle_amount:type_name -> inference.inference.SettleAmount - 181, // 17: inference.inference.QueryAllSettleAmountResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 185, // 18: inference.inference.QueryGetEpochGroupValidationsResponse.epoch_group_validations:type_name -> inference.inference.EpochGroupValidations - 180, // 19: inference.inference.QueryAllEpochGroupValidationsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 185, // 20: inference.inference.QueryAllEpochGroupValidationsResponse.epoch_group_validations:type_name -> inference.inference.EpochGroupValidations - 181, // 21: inference.inference.QueryAllEpochGroupValidationsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 180, // 0: inference.inference.QueryParamsResponse.params:type_name -> inference.inference.Params + 181, // 1: inference.inference.QueryGetInferenceResponse.inference:type_name -> inference.inference.Inference + 182, // 2: inference.inference.QueryAllInferenceRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 181, // 3: inference.inference.QueryAllInferenceResponse.inference:type_name -> inference.inference.Inference + 183, // 4: inference.inference.QueryAllInferenceResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 184, // 5: inference.inference.QueryGetParticipantResponse.participant:type_name -> inference.inference.Participant + 182, // 6: inference.inference.QueryAllParticipantRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 184, // 7: inference.inference.QueryAllParticipantResponse.participant:type_name -> inference.inference.Participant + 183, // 8: inference.inference.QueryAllParticipantResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 184, // 9: inference.inference.QueryGetRandomExecutorResponse.executor:type_name -> inference.inference.Participant + 185, // 10: inference.inference.QueryGetEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData + 182, // 11: inference.inference.QueryAllEpochGroupDataRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 185, // 12: inference.inference.QueryAllEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData + 183, // 13: inference.inference.QueryAllEpochGroupDataResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 186, // 14: inference.inference.QueryGetSettleAmountResponse.settle_amount:type_name -> inference.inference.SettleAmount + 182, // 15: inference.inference.QueryAllSettleAmountRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 186, // 16: inference.inference.QueryAllSettleAmountResponse.settle_amount:type_name -> inference.inference.SettleAmount + 183, // 17: inference.inference.QueryAllSettleAmountResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 187, // 18: inference.inference.QueryGetEpochGroupValidationsResponse.epoch_group_validations:type_name -> inference.inference.EpochGroupValidations + 182, // 19: inference.inference.QueryAllEpochGroupValidationsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 187, // 20: inference.inference.QueryAllEpochGroupValidationsResponse.epoch_group_validations:type_name -> inference.inference.EpochGroupValidations + 183, // 21: inference.inference.QueryAllEpochGroupValidationsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse 28, // 22: inference.inference.QueryPocBatchesForStageResponse.poc_batch:type_name -> inference.inference.PoCBatchesWithParticipants - 186, // 23: inference.inference.PoCBatchesWithParticipants.poc_batch:type_name -> inference.inference.PoCBatch + 188, // 23: inference.inference.PoCBatchesWithParticipants.poc_batch:type_name -> inference.inference.PoCBatch 31, // 24: inference.inference.QueryPocValidationsForStageResponse.poc_validation:type_name -> inference.inference.PoCValidationsWithParticipants - 187, // 25: inference.inference.PoCValidationsWithParticipants.poc_validation:type_name -> inference.inference.PoCValidation + 189, // 25: inference.inference.PoCValidationsWithParticipants.poc_validation:type_name -> inference.inference.PoCValidation 34, // 26: inference.inference.QueryPocV2ValidationsForStageResponse.poc_validation:type_name -> inference.inference.PoCValidationsWithParticipantsV2 - 188, // 27: inference.inference.PoCValidationsWithParticipantsV2.poc_validation:type_name -> inference.inference.PoCValidationV2 - 189, // 28: inference.inference.QueryMLNodeWeightDistributionResponse.weights:type_name -> inference.inference.MLNodeWeight + 190, // 27: inference.inference.PoCValidationsWithParticipantsV2.poc_validation:type_name -> inference.inference.PoCValidationV2 + 191, // 28: inference.inference.QueryMLNodeWeightDistributionResponse.weights:type_name -> inference.inference.MLNodeWeight 41, // 29: inference.inference.QueryAllPoCV2StoreCommitsForStageResponse.commits:type_name -> inference.inference.PoCV2StoreCommitWithAddress 44, // 30: inference.inference.QueryAllMLNodeWeightDistributionsForStageResponse.distributions:type_name -> inference.inference.MLNodeWeightDistributionWithAddress - 189, // 31: inference.inference.MLNodeWeightDistributionWithAddress.weights:type_name -> inference.inference.MLNodeWeight - 190, // 32: inference.inference.QueryGetTokenomicsDataResponse.tokenomics_data:type_name -> inference.inference.TokenomicsData - 191, // 33: inference.inference.QueryGetUnitOfComputePriceProposalResponse.proposal:type_name -> inference.inference.UnitOfComputePriceProposal - 183, // 34: inference.inference.QueryCurrentEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData - 183, // 35: inference.inference.QueryPreviousEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData - 180, // 36: inference.inference.QueryModelsAllRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 192, // 37: inference.inference.QueryModelsAllResponse.model:type_name -> inference.inference.Model - 181, // 38: inference.inference.QueryModelsAllResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 193, // 39: inference.inference.QueryGetTopMinerResponse.top_miner:type_name -> inference.inference.TopMiner - 180, // 40: inference.inference.QueryAllTopMinerRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 193, // 41: inference.inference.QueryAllTopMinerResponse.top_miner:type_name -> inference.inference.TopMiner - 181, // 42: inference.inference.QueryAllTopMinerResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 194, // 43: inference.inference.QueryGetInferenceTimeoutResponse.inference_timeout:type_name -> inference.inference.InferenceTimeout - 180, // 44: inference.inference.QueryAllInferenceTimeoutRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 194, // 45: inference.inference.QueryAllInferenceTimeoutResponse.inference_timeout:type_name -> inference.inference.InferenceTimeout - 181, // 46: inference.inference.QueryAllInferenceTimeoutResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 195, // 47: inference.inference.QueryGetInferenceValidationDetailsResponse.inferenceValidationDetails:type_name -> inference.inference.InferenceValidationDetails - 180, // 48: inference.inference.QueryAllInferenceValidationDetailsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 195, // 49: inference.inference.QueryAllInferenceValidationDetailsResponse.inferenceValidationDetails:type_name -> inference.inference.InferenceValidationDetails - 181, // 50: inference.inference.QueryAllInferenceValidationDetailsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 191, // 31: inference.inference.MLNodeWeightDistributionWithAddress.weights:type_name -> inference.inference.MLNodeWeight + 192, // 32: inference.inference.QueryGetTokenomicsDataResponse.tokenomics_data:type_name -> inference.inference.TokenomicsData + 193, // 33: inference.inference.QueryGetUnitOfComputePriceProposalResponse.proposal:type_name -> inference.inference.UnitOfComputePriceProposal + 185, // 34: inference.inference.QueryCurrentEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData + 185, // 35: inference.inference.QueryPreviousEpochGroupDataResponse.epoch_group_data:type_name -> inference.inference.EpochGroupData + 182, // 36: inference.inference.QueryModelsAllRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 194, // 37: inference.inference.QueryModelsAllResponse.model:type_name -> inference.inference.Model + 183, // 38: inference.inference.QueryModelsAllResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 195, // 39: inference.inference.QueryGetTopMinerResponse.top_miner:type_name -> inference.inference.TopMiner + 182, // 40: inference.inference.QueryAllTopMinerRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 195, // 41: inference.inference.QueryAllTopMinerResponse.top_miner:type_name -> inference.inference.TopMiner + 183, // 42: inference.inference.QueryAllTopMinerResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 196, // 43: inference.inference.QueryGetInferenceTimeoutResponse.inference_timeout:type_name -> inference.inference.InferenceTimeout + 182, // 44: inference.inference.QueryAllInferenceTimeoutRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 196, // 45: inference.inference.QueryAllInferenceTimeoutResponse.inference_timeout:type_name -> inference.inference.InferenceTimeout + 183, // 46: inference.inference.QueryAllInferenceTimeoutResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 197, // 47: inference.inference.QueryGetInferenceValidationDetailsResponse.inferenceValidationDetails:type_name -> inference.inference.InferenceValidationDetails + 182, // 48: inference.inference.QueryAllInferenceValidationDetailsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 197, // 49: inference.inference.QueryAllInferenceValidationDetailsResponse.inferenceValidationDetails:type_name -> inference.inference.InferenceValidationDetails + 183, // 50: inference.inference.QueryAllInferenceValidationDetailsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse 71, // 51: inference.inference.QueryGetInferenceValidationParametersResponse.validator_powers:type_name -> inference.inference.ValidatorPower - 195, // 52: inference.inference.QueryGetInferenceValidationParametersResponse.details:type_name -> inference.inference.InferenceValidationDetails - 196, // 53: inference.inference.QueryGetInferenceValidationParametersResponse.parameters:type_name -> inference.inference.ValidationParams - 197, // 54: inference.inference.QueryEpochPerformanceSummaryByEpochResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary - 197, // 55: inference.inference.QueryEpochPerformanceSummaryByParticipantResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary - 180, // 56: inference.inference.QueryAllEpochPerformanceSummaryRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 197, // 57: inference.inference.QueryAllEpochPerformanceSummaryResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary - 181, // 58: inference.inference.QueryAllEpochPerformanceSummaryResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 198, // 59: inference.inference.QueryTrainingTaskResponse.task:type_name -> inference.inference.TrainingTask - 199, // 60: inference.inference.QueryHardwareNodesResponse.nodes:type_name -> inference.inference.HardwareNodes - 199, // 61: inference.inference.QueryHardwareNodesAllResponse.nodes:type_name -> inference.inference.HardwareNodes - 198, // 62: inference.inference.QueryQueuedTrainingTasksResponse.tasks:type_name -> inference.inference.TrainingTask - 198, // 63: inference.inference.QueryTrainingTaskAllResponse.tasks:type_name -> inference.inference.TrainingTask + 197, // 52: inference.inference.QueryGetInferenceValidationParametersResponse.details:type_name -> inference.inference.InferenceValidationDetails + 198, // 53: inference.inference.QueryGetInferenceValidationParametersResponse.parameters:type_name -> inference.inference.ValidationParams + 199, // 54: inference.inference.QueryEpochPerformanceSummaryByEpochResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary + 199, // 55: inference.inference.QueryEpochPerformanceSummaryByParticipantResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary + 182, // 56: inference.inference.QueryAllEpochPerformanceSummaryRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 199, // 57: inference.inference.QueryAllEpochPerformanceSummaryResponse.epochPerformanceSummary:type_name -> inference.inference.EpochPerformanceSummary + 183, // 58: inference.inference.QueryAllEpochPerformanceSummaryResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 200, // 59: inference.inference.QueryTrainingTaskResponse.task:type_name -> inference.inference.TrainingTask + 201, // 60: inference.inference.QueryHardwareNodesResponse.nodes:type_name -> inference.inference.HardwareNodes + 201, // 61: inference.inference.QueryHardwareNodesAllResponse.nodes:type_name -> inference.inference.HardwareNodes + 200, // 62: inference.inference.QueryQueuedTrainingTasksResponse.tasks:type_name -> inference.inference.TrainingTask + 200, // 63: inference.inference.QueryTrainingTaskAllResponse.tasks:type_name -> inference.inference.TrainingTask 92, // 64: inference.inference.QueryGetAllParticipantCurrentStatsResponse.participant_current_stats:type_name -> inference.inference.ParticipantCurrentStats 93, // 65: inference.inference.QueryParticipantsFullStatsResponse.participants_stats:type_name -> inference.inference.ParticipantFullStats - 200, // 66: inference.inference.QueryStatsByTimePeriodByDeveloperResponse.stats:type_name -> inference.inference.DeveloperStatsByTime + 202, // 66: inference.inference.QueryStatsByTimePeriodByDeveloperResponse.stats:type_name -> inference.inference.DeveloperStatsByTime 102, // 67: inference.inference.QueryInferencesAndTokensStatsByModelsResponse.stats_models:type_name -> inference.inference.ModelStats - 176, // 68: inference.inference.QueryDebugStatsResponse.stats_by_time:type_name -> inference.inference.QueryDebugStatsResponse.TemporaryTimeStat - 177, // 69: inference.inference.QueryDebugStatsResponse.stats_by_epoch:type_name -> inference.inference.QueryDebugStatsResponse.TemporaryEpochStat - 198, // 70: inference.inference.QueryInProgressTrainingTasksResponse.tasks:type_name -> inference.inference.TrainingTask - 201, // 71: inference.inference.QueryGetPartialUpgradeResponse.partialUpgrade:type_name -> inference.inference.PartialUpgrade - 180, // 72: inference.inference.QueryAllPartialUpgradeRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 201, // 73: inference.inference.QueryAllPartialUpgradeResponse.partialUpgrade:type_name -> inference.inference.PartialUpgrade - 181, // 74: inference.inference.QueryAllPartialUpgradeResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 202, // 75: inference.inference.QueryTrainingKvRecordResponse.record:type_name -> inference.inference.TrainingTaskKVRecord - 203, // 76: inference.inference.QueryTrainingBarrierRequest.req:type_name -> inference.inference.GetBarrierStatusRequest - 204, // 77: inference.inference.QueryTrainingBarrierResponse.resp:type_name -> inference.inference.GetBarrierStatusResponse - 205, // 78: inference.inference.QueryTrainingAliveNodesRequest.req:type_name -> inference.inference.GetAliveNodesRequest - 206, // 79: inference.inference.QueryTrainingAliveNodesResponse.resp:type_name -> inference.inference.GetAliveNodesResponse - 207, // 80: inference.inference.QueryGetBridgeTransactionResponse.bridgeTransactions:type_name -> inference.inference.BridgeTransaction - 180, // 81: inference.inference.QueryAllBridgeTransactionsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest - 207, // 82: inference.inference.QueryAllBridgeTransactionsResponse.bridgeTransactions:type_name -> inference.inference.BridgeTransaction - 181, // 83: inference.inference.QueryAllBridgeTransactionsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 208, // 84: inference.inference.WrappedTokenBalance.token_info:type_name -> inference.inference.BridgeWrappedTokenContract + 178, // 68: inference.inference.QueryDebugStatsResponse.stats_by_time:type_name -> inference.inference.QueryDebugStatsResponse.TemporaryTimeStat + 179, // 69: inference.inference.QueryDebugStatsResponse.stats_by_epoch:type_name -> inference.inference.QueryDebugStatsResponse.TemporaryEpochStat + 200, // 70: inference.inference.QueryInProgressTrainingTasksResponse.tasks:type_name -> inference.inference.TrainingTask + 203, // 71: inference.inference.QueryGetPartialUpgradeResponse.partialUpgrade:type_name -> inference.inference.PartialUpgrade + 182, // 72: inference.inference.QueryAllPartialUpgradeRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 203, // 73: inference.inference.QueryAllPartialUpgradeResponse.partialUpgrade:type_name -> inference.inference.PartialUpgrade + 183, // 74: inference.inference.QueryAllPartialUpgradeResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 204, // 75: inference.inference.QueryTrainingKvRecordResponse.record:type_name -> inference.inference.TrainingTaskKVRecord + 205, // 76: inference.inference.QueryTrainingBarrierRequest.req:type_name -> inference.inference.GetBarrierStatusRequest + 206, // 77: inference.inference.QueryTrainingBarrierResponse.resp:type_name -> inference.inference.GetBarrierStatusResponse + 207, // 78: inference.inference.QueryTrainingAliveNodesRequest.req:type_name -> inference.inference.GetAliveNodesRequest + 208, // 79: inference.inference.QueryTrainingAliveNodesResponse.resp:type_name -> inference.inference.GetAliveNodesResponse + 209, // 80: inference.inference.QueryGetBridgeTransactionResponse.bridgeTransactions:type_name -> inference.inference.BridgeTransaction + 182, // 81: inference.inference.QueryAllBridgeTransactionsRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 209, // 82: inference.inference.QueryAllBridgeTransactionsResponse.bridgeTransactions:type_name -> inference.inference.BridgeTransaction + 183, // 83: inference.inference.QueryAllBridgeTransactionsResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 210, // 84: inference.inference.WrappedTokenBalance.token_info:type_name -> inference.inference.BridgeWrappedTokenContract 129, // 85: inference.inference.QueryWrappedTokenBalancesResponse.balances:type_name -> inference.inference.WrappedTokenBalance - 209, // 86: inference.inference.QueryBridgeAddressesByChainResponse.addresses:type_name -> inference.inference.BridgeContractAddress - 178, // 87: inference.inference.QueryEpochInfoResponse.params:type_name -> inference.inference.Params - 210, // 88: inference.inference.QueryEpochInfoResponse.latest_epoch:type_name -> inference.inference.Epoch - 211, // 89: inference.inference.QueryEpochInfoResponse.active_confirmation_poc_event:type_name -> inference.inference.ConfirmationPoCEvent - 212, // 90: inference.inference.QueryApprovedTokensForTradeResponse.approved_tokens:type_name -> inference.inference.BridgeTokenReference + 211, // 86: inference.inference.QueryBridgeAddressesByChainResponse.addresses:type_name -> inference.inference.BridgeContractAddress + 180, // 87: inference.inference.QueryEpochInfoResponse.params:type_name -> inference.inference.Params + 212, // 88: inference.inference.QueryEpochInfoResponse.latest_epoch:type_name -> inference.inference.Epoch + 213, // 89: inference.inference.QueryEpochInfoResponse.active_confirmation_poc_event:type_name -> inference.inference.ConfirmationPoCEvent + 214, // 90: inference.inference.QueryApprovedTokensForTradeResponse.approved_tokens:type_name -> inference.inference.BridgeTokenReference 149, // 91: inference.inference.QueryGetAllModelPerTokenPricesResponse.model_prices:type_name -> inference.inference.ModelPrice 155, // 92: inference.inference.QueryGetAllModelCapacitiesResponse.model_capacities:type_name -> inference.inference.ModelCapacity 157, // 93: inference.inference.QueryGranteesByMessageTypeResponse.grantees:type_name -> inference.inference.Grantee - 213, // 94: inference.inference.QueryGetMLNodeVersionResponse.mlnode_version:type_name -> inference.inference.MLNodeVersion - 214, // 95: inference.inference.QueryExcludedParticipantsResponse.items:type_name -> inference.inference.ExcludedParticipant - 211, // 96: inference.inference.QueryActiveConfirmationPoCEventResponse.event:type_name -> inference.inference.ConfirmationPoCEvent - 211, // 97: inference.inference.QueryConfirmationPoCEventsResponse.events:type_name -> inference.inference.ConfirmationPoCEvent - 182, // 98: inference.inference.ParticipantWithBalance.participant:type_name -> inference.inference.Participant - 215, // 99: inference.inference.ParticipantWithBalance.balances:type_name -> cosmos.base.v1beta1.Coin - 180, // 100: inference.inference.QueryParticipantsWithBalancesRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest + 215, // 94: inference.inference.QueryGetMLNodeVersionResponse.mlnode_version:type_name -> inference.inference.MLNodeVersion + 216, // 95: inference.inference.QueryExcludedParticipantsResponse.items:type_name -> inference.inference.ExcludedParticipant + 213, // 96: inference.inference.QueryActiveConfirmationPoCEventResponse.event:type_name -> inference.inference.ConfirmationPoCEvent + 213, // 97: inference.inference.QueryConfirmationPoCEventsResponse.events:type_name -> inference.inference.ConfirmationPoCEvent + 184, // 98: inference.inference.ParticipantWithBalance.participant:type_name -> inference.inference.Participant + 217, // 99: inference.inference.ParticipantWithBalance.balances:type_name -> cosmos.base.v1beta1.Coin + 182, // 100: inference.inference.QueryParticipantsWithBalancesRequest.pagination:type_name -> cosmos.base.query.v1beta1.PageRequest 171, // 101: inference.inference.QueryParticipantsWithBalancesResponse.participants:type_name -> inference.inference.ParticipantWithBalance - 181, // 102: inference.inference.QueryParticipantsWithBalancesResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse - 216, // 103: inference.inference.QueryRandomSeedsResponse.seeds:type_name -> inference.inference.RandomSeed - 200, // 104: inference.inference.QueryDebugStatsResponse.TemporaryTimeStat.stats:type_name -> inference.inference.DeveloperStatsByTime - 217, // 105: inference.inference.QueryDebugStatsResponse.TemporaryEpochStat.stats:type_name -> inference.inference.DeveloperStatsByEpoch - 0, // 106: inference.inference.Query.Params:input_type -> inference.inference.QueryParamsRequest - 2, // 107: inference.inference.Query.Inference:input_type -> inference.inference.QueryGetInferenceRequest - 4, // 108: inference.inference.Query.InferenceAll:input_type -> inference.inference.QueryAllInferenceRequest - 6, // 109: inference.inference.Query.Participant:input_type -> inference.inference.QueryGetParticipantRequest - 8, // 110: inference.inference.Query.ParticipantAll:input_type -> inference.inference.QueryAllParticipantRequest - 10, // 111: inference.inference.Query.InferenceParticipant:input_type -> inference.inference.QueryInferenceParticipantRequest - 12, // 112: inference.inference.Query.GetRandomExecutor:input_type -> inference.inference.QueryGetRandomExecutorRequest - 14, // 113: inference.inference.Query.EpochGroupData:input_type -> inference.inference.QueryGetEpochGroupDataRequest - 16, // 114: inference.inference.Query.EpochGroupDataAll:input_type -> inference.inference.QueryAllEpochGroupDataRequest - 18, // 115: inference.inference.Query.SettleAmount:input_type -> inference.inference.QueryGetSettleAmountRequest - 20, // 116: inference.inference.Query.SettleAmountAll:input_type -> inference.inference.QueryAllSettleAmountRequest - 22, // 117: inference.inference.Query.EpochGroupValidations:input_type -> inference.inference.QueryGetEpochGroupValidationsRequest - 24, // 118: inference.inference.Query.EpochGroupValidationsAll:input_type -> inference.inference.QueryAllEpochGroupValidationsRequest - 26, // 119: inference.inference.Query.PocBatchesForStage:input_type -> inference.inference.QueryPocBatchesForStageRequest - 29, // 120: inference.inference.Query.PocValidationsForStage:input_type -> inference.inference.QueryPocValidationsForStageRequest - 32, // 121: inference.inference.Query.PocV2ValidationsForStage:input_type -> inference.inference.QueryPocV2ValidationsForStageRequest - 35, // 122: inference.inference.Query.PoCV2StoreCommit:input_type -> inference.inference.QueryPoCV2StoreCommitRequest - 37, // 123: inference.inference.Query.MLNodeWeightDistribution:input_type -> inference.inference.QueryMLNodeWeightDistributionRequest - 39, // 124: inference.inference.Query.AllPoCV2StoreCommitsForStage:input_type -> inference.inference.QueryAllPoCV2StoreCommitsForStageRequest - 42, // 125: inference.inference.Query.AllMLNodeWeightDistributionsForStage:input_type -> inference.inference.QueryAllMLNodeWeightDistributionsForStageRequest - 45, // 126: inference.inference.Query.GetCurrentEpoch:input_type -> inference.inference.QueryGetCurrentEpochRequest - 47, // 127: inference.inference.Query.TokenomicsData:input_type -> inference.inference.QueryGetTokenomicsDataRequest - 49, // 128: inference.inference.Query.GetUnitOfComputePriceProposal:input_type -> inference.inference.QueryGetUnitOfComputePriceProposalRequest - 51, // 129: inference.inference.Query.CurrentEpochGroupData:input_type -> inference.inference.QueryCurrentEpochGroupDataRequest - 55, // 130: inference.inference.Query.ModelsAll:input_type -> inference.inference.QueryModelsAllRequest - 57, // 131: inference.inference.Query.TopMiner:input_type -> inference.inference.QueryGetTopMinerRequest - 59, // 132: inference.inference.Query.TopMinerAll:input_type -> inference.inference.QueryAllTopMinerRequest - 61, // 133: inference.inference.Query.InferenceTimeout:input_type -> inference.inference.QueryGetInferenceTimeoutRequest - 63, // 134: inference.inference.Query.InferenceTimeoutAll:input_type -> inference.inference.QueryAllInferenceTimeoutRequest - 65, // 135: inference.inference.Query.InferenceValidationDetails:input_type -> inference.inference.QueryGetInferenceValidationDetailsRequest - 67, // 136: inference.inference.Query.InferenceValidationDetailsAll:input_type -> inference.inference.QueryAllInferenceValidationDetailsRequest - 69, // 137: inference.inference.Query.GetInferenceValidationParameters:input_type -> inference.inference.QueryGetInferenceValidationParametersRequest - 72, // 138: inference.inference.Query.EpochPerformanceSummary:input_type -> inference.inference.QueryEpochPerformanceSummaryByEpochRequest - 74, // 139: inference.inference.Query.EpochPerformanceSummaryByParticipant:input_type -> inference.inference.QueryEpochPerformanceSummaryByParticipantRequest - 76, // 140: inference.inference.Query.EpochPerformanceSummaryAll:input_type -> inference.inference.QueryAllEpochPerformanceSummaryRequest - 78, // 141: inference.inference.Query.TrainingTask:input_type -> inference.inference.QueryTrainingTaskRequest - 80, // 142: inference.inference.Query.HardwareNodes:input_type -> inference.inference.QueryHardwareNodesRequest - 82, // 143: inference.inference.Query.HardwareNodesAll:input_type -> inference.inference.QueryHardwareNodesAllRequest - 84, // 144: inference.inference.Query.QueuedTrainingTasks:input_type -> inference.inference.QueryQueuedTrainingTasksRequest - 86, // 145: inference.inference.Query.TrainingTaskAll:input_type -> inference.inference.QueryTrainingTaskAllRequest - 88, // 146: inference.inference.Query.GetParticipantCurrentStats:input_type -> inference.inference.QueryGetParticipantCurrentStatsRequest - 90, // 147: inference.inference.Query.GetAllParticipantCurrentStats:input_type -> inference.inference.QueryGetAllParticipantCurrentStatsRequest - 94, // 148: inference.inference.Query.GetParticipantsFullStats:input_type -> inference.inference.QueryParticipantsFullStatsRequest - 96, // 149: inference.inference.Query.StatsByTimePeriodByDeveloper:input_type -> inference.inference.QueryStatsByTimePeriodByDeveloperRequest - 98, // 150: inference.inference.Query.StatsByDeveloperAndEpochsBackwards:input_type -> inference.inference.QueryStatsByDeveloperAndEpochBackwardsRequest - 105, // 151: inference.inference.Query.CountParticipants:input_type -> inference.inference.QueryCountAllParticipantsRequest - 107, // 152: inference.inference.Query.DebugStatsDeveloperStats:input_type -> inference.inference.QueryDebugStatsRequest - 99, // 153: inference.inference.Query.InferencesAndTokensStatsByEpochsBackwards:input_type -> inference.inference.QueryInferencesAndTokensStatsByEpochsBackwardsRequest - 100, // 154: inference.inference.Query.InferencesAndTokensStatsByTimePeriod:input_type -> inference.inference.QueryInferencesAndTokensStatsByTimePeriodRequest - 101, // 155: inference.inference.Query.InferencesAndTokensStatsByModels:input_type -> inference.inference.QueryInferencesAndTokensStatsByModelsRequest - 109, // 156: inference.inference.Query.GetMinimumValidationAverage:input_type -> inference.inference.QueryGetMinimumValidationAverageRequest - 111, // 157: inference.inference.Query.InProgressTrainingTasks:input_type -> inference.inference.QueryInProgressTrainingTasksRequest - 113, // 158: inference.inference.Query.PartialUpgrade:input_type -> inference.inference.QueryGetPartialUpgradeRequest - 115, // 159: inference.inference.Query.PartialUpgradeAll:input_type -> inference.inference.QueryAllPartialUpgradeRequest - 125, // 160: inference.inference.Query.BridgeTransaction:input_type -> inference.inference.QueryGetBridgeTransactionRequest - 127, // 161: inference.inference.Query.BridgeTransactions:input_type -> inference.inference.QueryAllBridgeTransactionsRequest - 132, // 162: inference.inference.Query.BridgeAddressesByChain:input_type -> inference.inference.QueryBridgeAddressesByChainRequest - 136, // 163: inference.inference.Query.LiquidityPool:input_type -> inference.inference.QueryLiquidityPoolRequest - 130, // 164: inference.inference.Query.WrappedTokenBalances:input_type -> inference.inference.QueryWrappedTokenBalancesRequest - 134, // 165: inference.inference.Query.ValidateWrappedTokenForTrade:input_type -> inference.inference.QueryValidateWrappedTokenForTradeRequest - 144, // 166: inference.inference.Query.ApprovedTokensForTrade:input_type -> inference.inference.QueryApprovedTokensForTradeRequest - 117, // 167: inference.inference.Query.TrainingKvRecord:input_type -> inference.inference.QueryTrainingKvRecordRequest - 119, // 168: inference.inference.Query.ListTrainingKvRecordKeys:input_type -> inference.inference.QueryListTrainingKvRecordKeysRequest - 121, // 169: inference.inference.Query.TrainingBarrier:input_type -> inference.inference.QueryTrainingBarrierRequest - 123, // 170: inference.inference.Query.TrainingAliveNodes:input_type -> inference.inference.QueryTrainingAliveNodesRequest - 138, // 171: inference.inference.Query.EpochInfo:input_type -> inference.inference.QueryEpochInfoRequest - 140, // 172: inference.inference.Query.CountPoCbatchesAtHeight:input_type -> inference.inference.QueryCountPoCbatchesAtHeightRequest - 142, // 173: inference.inference.Query.CountPoCvalidationsAtHeight:input_type -> inference.inference.QueryCountPoCvalidationsAtHeightRequest - 146, // 174: inference.inference.Query.GetModelPerTokenPrice:input_type -> inference.inference.QueryGetModelPerTokenPriceRequest - 148, // 175: inference.inference.Query.GetAllModelPerTokenPrices:input_type -> inference.inference.QueryGetAllModelPerTokenPricesRequest - 151, // 176: inference.inference.Query.GetModelCapacity:input_type -> inference.inference.QueryGetModelCapacityRequest - 153, // 177: inference.inference.Query.GetAllModelCapacities:input_type -> inference.inference.QueryGetAllModelCapacitiesRequest - 156, // 178: inference.inference.Query.GranteesByMessageType:input_type -> inference.inference.QueryGranteesByMessageTypeRequest - 163, // 179: inference.inference.Query.MLNodeVersion:input_type -> inference.inference.QueryGetMLNodeVersionRequest - 159, // 180: inference.inference.Query.TrainingAllowList:input_type -> inference.inference.QueryTrainingAllowListRequest - 161, // 181: inference.inference.Query.ParticipantAllowList:input_type -> inference.inference.QueryParticipantAllowListRequest - 165, // 182: inference.inference.Query.ExcludedParticipants:input_type -> inference.inference.QueryExcludedParticipantsRequest - 167, // 183: inference.inference.Query.ActiveConfirmationPoCEvent:input_type -> inference.inference.QueryActiveConfirmationPoCEventRequest - 169, // 184: inference.inference.Query.ListConfirmationPoCEvents:input_type -> inference.inference.QueryConfirmationPoCEventsRequest - 174, // 185: inference.inference.Query.ListRandomSeeds:input_type -> inference.inference.QueryRandomSeedsRequest - 172, // 186: inference.inference.Query.ParticipantsWithBalances:input_type -> inference.inference.QueryParticipantsWithBalancesRequest - 1, // 187: inference.inference.Query.Params:output_type -> inference.inference.QueryParamsResponse - 3, // 188: inference.inference.Query.Inference:output_type -> inference.inference.QueryGetInferenceResponse - 5, // 189: inference.inference.Query.InferenceAll:output_type -> inference.inference.QueryAllInferenceResponse - 7, // 190: inference.inference.Query.Participant:output_type -> inference.inference.QueryGetParticipantResponse - 9, // 191: inference.inference.Query.ParticipantAll:output_type -> inference.inference.QueryAllParticipantResponse - 11, // 192: inference.inference.Query.InferenceParticipant:output_type -> inference.inference.QueryInferenceParticipantResponse - 13, // 193: inference.inference.Query.GetRandomExecutor:output_type -> inference.inference.QueryGetRandomExecutorResponse - 15, // 194: inference.inference.Query.EpochGroupData:output_type -> inference.inference.QueryGetEpochGroupDataResponse - 17, // 195: inference.inference.Query.EpochGroupDataAll:output_type -> inference.inference.QueryAllEpochGroupDataResponse - 19, // 196: inference.inference.Query.SettleAmount:output_type -> inference.inference.QueryGetSettleAmountResponse - 21, // 197: inference.inference.Query.SettleAmountAll:output_type -> inference.inference.QueryAllSettleAmountResponse - 23, // 198: inference.inference.Query.EpochGroupValidations:output_type -> inference.inference.QueryGetEpochGroupValidationsResponse - 25, // 199: inference.inference.Query.EpochGroupValidationsAll:output_type -> inference.inference.QueryAllEpochGroupValidationsResponse - 27, // 200: inference.inference.Query.PocBatchesForStage:output_type -> inference.inference.QueryPocBatchesForStageResponse - 30, // 201: inference.inference.Query.PocValidationsForStage:output_type -> inference.inference.QueryPocValidationsForStageResponse - 33, // 202: inference.inference.Query.PocV2ValidationsForStage:output_type -> inference.inference.QueryPocV2ValidationsForStageResponse - 36, // 203: inference.inference.Query.PoCV2StoreCommit:output_type -> inference.inference.QueryPoCV2StoreCommitResponse - 38, // 204: inference.inference.Query.MLNodeWeightDistribution:output_type -> inference.inference.QueryMLNodeWeightDistributionResponse - 40, // 205: inference.inference.Query.AllPoCV2StoreCommitsForStage:output_type -> inference.inference.QueryAllPoCV2StoreCommitsForStageResponse - 43, // 206: inference.inference.Query.AllMLNodeWeightDistributionsForStage:output_type -> inference.inference.QueryAllMLNodeWeightDistributionsForStageResponse - 46, // 207: inference.inference.Query.GetCurrentEpoch:output_type -> inference.inference.QueryGetCurrentEpochResponse - 48, // 208: inference.inference.Query.TokenomicsData:output_type -> inference.inference.QueryGetTokenomicsDataResponse - 50, // 209: inference.inference.Query.GetUnitOfComputePriceProposal:output_type -> inference.inference.QueryGetUnitOfComputePriceProposalResponse - 52, // 210: inference.inference.Query.CurrentEpochGroupData:output_type -> inference.inference.QueryCurrentEpochGroupDataResponse - 56, // 211: inference.inference.Query.ModelsAll:output_type -> inference.inference.QueryModelsAllResponse - 58, // 212: inference.inference.Query.TopMiner:output_type -> inference.inference.QueryGetTopMinerResponse - 60, // 213: inference.inference.Query.TopMinerAll:output_type -> inference.inference.QueryAllTopMinerResponse - 62, // 214: inference.inference.Query.InferenceTimeout:output_type -> inference.inference.QueryGetInferenceTimeoutResponse - 64, // 215: inference.inference.Query.InferenceTimeoutAll:output_type -> inference.inference.QueryAllInferenceTimeoutResponse - 66, // 216: inference.inference.Query.InferenceValidationDetails:output_type -> inference.inference.QueryGetInferenceValidationDetailsResponse - 68, // 217: inference.inference.Query.InferenceValidationDetailsAll:output_type -> inference.inference.QueryAllInferenceValidationDetailsResponse - 70, // 218: inference.inference.Query.GetInferenceValidationParameters:output_type -> inference.inference.QueryGetInferenceValidationParametersResponse - 73, // 219: inference.inference.Query.EpochPerformanceSummary:output_type -> inference.inference.QueryEpochPerformanceSummaryByEpochResponse - 75, // 220: inference.inference.Query.EpochPerformanceSummaryByParticipant:output_type -> inference.inference.QueryEpochPerformanceSummaryByParticipantResponse - 77, // 221: inference.inference.Query.EpochPerformanceSummaryAll:output_type -> inference.inference.QueryAllEpochPerformanceSummaryResponse - 79, // 222: inference.inference.Query.TrainingTask:output_type -> inference.inference.QueryTrainingTaskResponse - 81, // 223: inference.inference.Query.HardwareNodes:output_type -> inference.inference.QueryHardwareNodesResponse - 83, // 224: inference.inference.Query.HardwareNodesAll:output_type -> inference.inference.QueryHardwareNodesAllResponse - 85, // 225: inference.inference.Query.QueuedTrainingTasks:output_type -> inference.inference.QueryQueuedTrainingTasksResponse - 87, // 226: inference.inference.Query.TrainingTaskAll:output_type -> inference.inference.QueryTrainingTaskAllResponse - 89, // 227: inference.inference.Query.GetParticipantCurrentStats:output_type -> inference.inference.QueryGetParticipantCurrentStatsResponse - 91, // 228: inference.inference.Query.GetAllParticipantCurrentStats:output_type -> inference.inference.QueryGetAllParticipantCurrentStatsResponse - 95, // 229: inference.inference.Query.GetParticipantsFullStats:output_type -> inference.inference.QueryParticipantsFullStatsResponse - 97, // 230: inference.inference.Query.StatsByTimePeriodByDeveloper:output_type -> inference.inference.QueryStatsByTimePeriodByDeveloperResponse - 104, // 231: inference.inference.Query.StatsByDeveloperAndEpochsBackwards:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse - 106, // 232: inference.inference.Query.CountParticipants:output_type -> inference.inference.QueryCountAllParticipantsResponse - 108, // 233: inference.inference.Query.DebugStatsDeveloperStats:output_type -> inference.inference.QueryDebugStatsResponse - 104, // 234: inference.inference.Query.InferencesAndTokensStatsByEpochsBackwards:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse - 104, // 235: inference.inference.Query.InferencesAndTokensStatsByTimePeriod:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse - 103, // 236: inference.inference.Query.InferencesAndTokensStatsByModels:output_type -> inference.inference.QueryInferencesAndTokensStatsByModelsResponse - 110, // 237: inference.inference.Query.GetMinimumValidationAverage:output_type -> inference.inference.QueryGetMinimumValidationAverageResponse - 112, // 238: inference.inference.Query.InProgressTrainingTasks:output_type -> inference.inference.QueryInProgressTrainingTasksResponse - 114, // 239: inference.inference.Query.PartialUpgrade:output_type -> inference.inference.QueryGetPartialUpgradeResponse - 116, // 240: inference.inference.Query.PartialUpgradeAll:output_type -> inference.inference.QueryAllPartialUpgradeResponse - 126, // 241: inference.inference.Query.BridgeTransaction:output_type -> inference.inference.QueryGetBridgeTransactionResponse - 128, // 242: inference.inference.Query.BridgeTransactions:output_type -> inference.inference.QueryAllBridgeTransactionsResponse - 133, // 243: inference.inference.Query.BridgeAddressesByChain:output_type -> inference.inference.QueryBridgeAddressesByChainResponse - 137, // 244: inference.inference.Query.LiquidityPool:output_type -> inference.inference.QueryLiquidityPoolResponse - 131, // 245: inference.inference.Query.WrappedTokenBalances:output_type -> inference.inference.QueryWrappedTokenBalancesResponse - 135, // 246: inference.inference.Query.ValidateWrappedTokenForTrade:output_type -> inference.inference.QueryValidateWrappedTokenForTradeResponse - 145, // 247: inference.inference.Query.ApprovedTokensForTrade:output_type -> inference.inference.QueryApprovedTokensForTradeResponse - 118, // 248: inference.inference.Query.TrainingKvRecord:output_type -> inference.inference.QueryTrainingKvRecordResponse - 120, // 249: inference.inference.Query.ListTrainingKvRecordKeys:output_type -> inference.inference.QueryListTrainingKvRecordKeysResponse - 122, // 250: inference.inference.Query.TrainingBarrier:output_type -> inference.inference.QueryTrainingBarrierResponse - 124, // 251: inference.inference.Query.TrainingAliveNodes:output_type -> inference.inference.QueryTrainingAliveNodesResponse - 139, // 252: inference.inference.Query.EpochInfo:output_type -> inference.inference.QueryEpochInfoResponse - 141, // 253: inference.inference.Query.CountPoCbatchesAtHeight:output_type -> inference.inference.QueryCountPoCbatchesAtHeightResponse - 143, // 254: inference.inference.Query.CountPoCvalidationsAtHeight:output_type -> inference.inference.QueryCountPoCvalidationsAtHeightResponse - 147, // 255: inference.inference.Query.GetModelPerTokenPrice:output_type -> inference.inference.QueryGetModelPerTokenPriceResponse - 150, // 256: inference.inference.Query.GetAllModelPerTokenPrices:output_type -> inference.inference.QueryGetAllModelPerTokenPricesResponse - 152, // 257: inference.inference.Query.GetModelCapacity:output_type -> inference.inference.QueryGetModelCapacityResponse - 154, // 258: inference.inference.Query.GetAllModelCapacities:output_type -> inference.inference.QueryGetAllModelCapacitiesResponse - 158, // 259: inference.inference.Query.GranteesByMessageType:output_type -> inference.inference.QueryGranteesByMessageTypeResponse - 164, // 260: inference.inference.Query.MLNodeVersion:output_type -> inference.inference.QueryGetMLNodeVersionResponse - 160, // 261: inference.inference.Query.TrainingAllowList:output_type -> inference.inference.QueryTrainingAllowListResponse - 162, // 262: inference.inference.Query.ParticipantAllowList:output_type -> inference.inference.QueryParticipantAllowListResponse - 166, // 263: inference.inference.Query.ExcludedParticipants:output_type -> inference.inference.QueryExcludedParticipantsResponse - 168, // 264: inference.inference.Query.ActiveConfirmationPoCEvent:output_type -> inference.inference.QueryActiveConfirmationPoCEventResponse - 170, // 265: inference.inference.Query.ListConfirmationPoCEvents:output_type -> inference.inference.QueryConfirmationPoCEventsResponse - 175, // 266: inference.inference.Query.ListRandomSeeds:output_type -> inference.inference.QueryRandomSeedsResponse - 173, // 267: inference.inference.Query.ParticipantsWithBalances:output_type -> inference.inference.QueryParticipantsWithBalancesResponse - 187, // [187:268] is the sub-list for method output_type - 106, // [106:187] is the sub-list for method input_type - 106, // [106:106] is the sub-list for extension type_name - 106, // [106:106] is the sub-list for extension extendee - 0, // [0:106] is the sub-list for field type_name + 183, // 102: inference.inference.QueryParticipantsWithBalancesResponse.pagination:type_name -> cosmos.base.query.v1beta1.PageResponse + 218, // 103: inference.inference.QueryRandomSeedsResponse.seeds:type_name -> inference.inference.RandomSeed + 219, // 104: inference.inference.QueryPoCValidationSnapshotResponse.snapshot:type_name -> inference.inference.PoCValidationSnapshot + 202, // 105: inference.inference.QueryDebugStatsResponse.TemporaryTimeStat.stats:type_name -> inference.inference.DeveloperStatsByTime + 220, // 106: inference.inference.QueryDebugStatsResponse.TemporaryEpochStat.stats:type_name -> inference.inference.DeveloperStatsByEpoch + 0, // 107: inference.inference.Query.Params:input_type -> inference.inference.QueryParamsRequest + 2, // 108: inference.inference.Query.Inference:input_type -> inference.inference.QueryGetInferenceRequest + 4, // 109: inference.inference.Query.InferenceAll:input_type -> inference.inference.QueryAllInferenceRequest + 6, // 110: inference.inference.Query.Participant:input_type -> inference.inference.QueryGetParticipantRequest + 8, // 111: inference.inference.Query.ParticipantAll:input_type -> inference.inference.QueryAllParticipantRequest + 10, // 112: inference.inference.Query.InferenceParticipant:input_type -> inference.inference.QueryInferenceParticipantRequest + 12, // 113: inference.inference.Query.GetRandomExecutor:input_type -> inference.inference.QueryGetRandomExecutorRequest + 14, // 114: inference.inference.Query.EpochGroupData:input_type -> inference.inference.QueryGetEpochGroupDataRequest + 16, // 115: inference.inference.Query.EpochGroupDataAll:input_type -> inference.inference.QueryAllEpochGroupDataRequest + 18, // 116: inference.inference.Query.SettleAmount:input_type -> inference.inference.QueryGetSettleAmountRequest + 20, // 117: inference.inference.Query.SettleAmountAll:input_type -> inference.inference.QueryAllSettleAmountRequest + 22, // 118: inference.inference.Query.EpochGroupValidations:input_type -> inference.inference.QueryGetEpochGroupValidationsRequest + 24, // 119: inference.inference.Query.EpochGroupValidationsAll:input_type -> inference.inference.QueryAllEpochGroupValidationsRequest + 26, // 120: inference.inference.Query.PocBatchesForStage:input_type -> inference.inference.QueryPocBatchesForStageRequest + 29, // 121: inference.inference.Query.PocValidationsForStage:input_type -> inference.inference.QueryPocValidationsForStageRequest + 32, // 122: inference.inference.Query.PocV2ValidationsForStage:input_type -> inference.inference.QueryPocV2ValidationsForStageRequest + 35, // 123: inference.inference.Query.PoCV2StoreCommit:input_type -> inference.inference.QueryPoCV2StoreCommitRequest + 37, // 124: inference.inference.Query.MLNodeWeightDistribution:input_type -> inference.inference.QueryMLNodeWeightDistributionRequest + 39, // 125: inference.inference.Query.AllPoCV2StoreCommitsForStage:input_type -> inference.inference.QueryAllPoCV2StoreCommitsForStageRequest + 42, // 126: inference.inference.Query.AllMLNodeWeightDistributionsForStage:input_type -> inference.inference.QueryAllMLNodeWeightDistributionsForStageRequest + 45, // 127: inference.inference.Query.GetCurrentEpoch:input_type -> inference.inference.QueryGetCurrentEpochRequest + 47, // 128: inference.inference.Query.TokenomicsData:input_type -> inference.inference.QueryGetTokenomicsDataRequest + 49, // 129: inference.inference.Query.GetUnitOfComputePriceProposal:input_type -> inference.inference.QueryGetUnitOfComputePriceProposalRequest + 51, // 130: inference.inference.Query.CurrentEpochGroupData:input_type -> inference.inference.QueryCurrentEpochGroupDataRequest + 55, // 131: inference.inference.Query.ModelsAll:input_type -> inference.inference.QueryModelsAllRequest + 57, // 132: inference.inference.Query.TopMiner:input_type -> inference.inference.QueryGetTopMinerRequest + 59, // 133: inference.inference.Query.TopMinerAll:input_type -> inference.inference.QueryAllTopMinerRequest + 61, // 134: inference.inference.Query.InferenceTimeout:input_type -> inference.inference.QueryGetInferenceTimeoutRequest + 63, // 135: inference.inference.Query.InferenceTimeoutAll:input_type -> inference.inference.QueryAllInferenceTimeoutRequest + 65, // 136: inference.inference.Query.InferenceValidationDetails:input_type -> inference.inference.QueryGetInferenceValidationDetailsRequest + 67, // 137: inference.inference.Query.InferenceValidationDetailsAll:input_type -> inference.inference.QueryAllInferenceValidationDetailsRequest + 69, // 138: inference.inference.Query.GetInferenceValidationParameters:input_type -> inference.inference.QueryGetInferenceValidationParametersRequest + 72, // 139: inference.inference.Query.EpochPerformanceSummary:input_type -> inference.inference.QueryEpochPerformanceSummaryByEpochRequest + 74, // 140: inference.inference.Query.EpochPerformanceSummaryByParticipant:input_type -> inference.inference.QueryEpochPerformanceSummaryByParticipantRequest + 76, // 141: inference.inference.Query.EpochPerformanceSummaryAll:input_type -> inference.inference.QueryAllEpochPerformanceSummaryRequest + 78, // 142: inference.inference.Query.TrainingTask:input_type -> inference.inference.QueryTrainingTaskRequest + 80, // 143: inference.inference.Query.HardwareNodes:input_type -> inference.inference.QueryHardwareNodesRequest + 82, // 144: inference.inference.Query.HardwareNodesAll:input_type -> inference.inference.QueryHardwareNodesAllRequest + 84, // 145: inference.inference.Query.QueuedTrainingTasks:input_type -> inference.inference.QueryQueuedTrainingTasksRequest + 86, // 146: inference.inference.Query.TrainingTaskAll:input_type -> inference.inference.QueryTrainingTaskAllRequest + 88, // 147: inference.inference.Query.GetParticipantCurrentStats:input_type -> inference.inference.QueryGetParticipantCurrentStatsRequest + 90, // 148: inference.inference.Query.GetAllParticipantCurrentStats:input_type -> inference.inference.QueryGetAllParticipantCurrentStatsRequest + 94, // 149: inference.inference.Query.GetParticipantsFullStats:input_type -> inference.inference.QueryParticipantsFullStatsRequest + 96, // 150: inference.inference.Query.StatsByTimePeriodByDeveloper:input_type -> inference.inference.QueryStatsByTimePeriodByDeveloperRequest + 98, // 151: inference.inference.Query.StatsByDeveloperAndEpochsBackwards:input_type -> inference.inference.QueryStatsByDeveloperAndEpochBackwardsRequest + 105, // 152: inference.inference.Query.CountParticipants:input_type -> inference.inference.QueryCountAllParticipantsRequest + 107, // 153: inference.inference.Query.DebugStatsDeveloperStats:input_type -> inference.inference.QueryDebugStatsRequest + 99, // 154: inference.inference.Query.InferencesAndTokensStatsByEpochsBackwards:input_type -> inference.inference.QueryInferencesAndTokensStatsByEpochsBackwardsRequest + 100, // 155: inference.inference.Query.InferencesAndTokensStatsByTimePeriod:input_type -> inference.inference.QueryInferencesAndTokensStatsByTimePeriodRequest + 101, // 156: inference.inference.Query.InferencesAndTokensStatsByModels:input_type -> inference.inference.QueryInferencesAndTokensStatsByModelsRequest + 109, // 157: inference.inference.Query.GetMinimumValidationAverage:input_type -> inference.inference.QueryGetMinimumValidationAverageRequest + 111, // 158: inference.inference.Query.InProgressTrainingTasks:input_type -> inference.inference.QueryInProgressTrainingTasksRequest + 113, // 159: inference.inference.Query.PartialUpgrade:input_type -> inference.inference.QueryGetPartialUpgradeRequest + 115, // 160: inference.inference.Query.PartialUpgradeAll:input_type -> inference.inference.QueryAllPartialUpgradeRequest + 125, // 161: inference.inference.Query.BridgeTransaction:input_type -> inference.inference.QueryGetBridgeTransactionRequest + 127, // 162: inference.inference.Query.BridgeTransactions:input_type -> inference.inference.QueryAllBridgeTransactionsRequest + 132, // 163: inference.inference.Query.BridgeAddressesByChain:input_type -> inference.inference.QueryBridgeAddressesByChainRequest + 136, // 164: inference.inference.Query.LiquidityPool:input_type -> inference.inference.QueryLiquidityPoolRequest + 130, // 165: inference.inference.Query.WrappedTokenBalances:input_type -> inference.inference.QueryWrappedTokenBalancesRequest + 134, // 166: inference.inference.Query.ValidateWrappedTokenForTrade:input_type -> inference.inference.QueryValidateWrappedTokenForTradeRequest + 144, // 167: inference.inference.Query.ApprovedTokensForTrade:input_type -> inference.inference.QueryApprovedTokensForTradeRequest + 117, // 168: inference.inference.Query.TrainingKvRecord:input_type -> inference.inference.QueryTrainingKvRecordRequest + 119, // 169: inference.inference.Query.ListTrainingKvRecordKeys:input_type -> inference.inference.QueryListTrainingKvRecordKeysRequest + 121, // 170: inference.inference.Query.TrainingBarrier:input_type -> inference.inference.QueryTrainingBarrierRequest + 123, // 171: inference.inference.Query.TrainingAliveNodes:input_type -> inference.inference.QueryTrainingAliveNodesRequest + 138, // 172: inference.inference.Query.EpochInfo:input_type -> inference.inference.QueryEpochInfoRequest + 140, // 173: inference.inference.Query.CountPoCbatchesAtHeight:input_type -> inference.inference.QueryCountPoCbatchesAtHeightRequest + 142, // 174: inference.inference.Query.CountPoCvalidationsAtHeight:input_type -> inference.inference.QueryCountPoCvalidationsAtHeightRequest + 146, // 175: inference.inference.Query.GetModelPerTokenPrice:input_type -> inference.inference.QueryGetModelPerTokenPriceRequest + 148, // 176: inference.inference.Query.GetAllModelPerTokenPrices:input_type -> inference.inference.QueryGetAllModelPerTokenPricesRequest + 151, // 177: inference.inference.Query.GetModelCapacity:input_type -> inference.inference.QueryGetModelCapacityRequest + 153, // 178: inference.inference.Query.GetAllModelCapacities:input_type -> inference.inference.QueryGetAllModelCapacitiesRequest + 156, // 179: inference.inference.Query.GranteesByMessageType:input_type -> inference.inference.QueryGranteesByMessageTypeRequest + 163, // 180: inference.inference.Query.MLNodeVersion:input_type -> inference.inference.QueryGetMLNodeVersionRequest + 159, // 181: inference.inference.Query.TrainingAllowList:input_type -> inference.inference.QueryTrainingAllowListRequest + 161, // 182: inference.inference.Query.ParticipantAllowList:input_type -> inference.inference.QueryParticipantAllowListRequest + 165, // 183: inference.inference.Query.ExcludedParticipants:input_type -> inference.inference.QueryExcludedParticipantsRequest + 167, // 184: inference.inference.Query.ActiveConfirmationPoCEvent:input_type -> inference.inference.QueryActiveConfirmationPoCEventRequest + 169, // 185: inference.inference.Query.ListConfirmationPoCEvents:input_type -> inference.inference.QueryConfirmationPoCEventsRequest + 174, // 186: inference.inference.Query.ListRandomSeeds:input_type -> inference.inference.QueryRandomSeedsRequest + 172, // 187: inference.inference.Query.ParticipantsWithBalances:input_type -> inference.inference.QueryParticipantsWithBalancesRequest + 176, // 188: inference.inference.Query.PoCValidationSnapshot:input_type -> inference.inference.QueryPoCValidationSnapshotRequest + 1, // 189: inference.inference.Query.Params:output_type -> inference.inference.QueryParamsResponse + 3, // 190: inference.inference.Query.Inference:output_type -> inference.inference.QueryGetInferenceResponse + 5, // 191: inference.inference.Query.InferenceAll:output_type -> inference.inference.QueryAllInferenceResponse + 7, // 192: inference.inference.Query.Participant:output_type -> inference.inference.QueryGetParticipantResponse + 9, // 193: inference.inference.Query.ParticipantAll:output_type -> inference.inference.QueryAllParticipantResponse + 11, // 194: inference.inference.Query.InferenceParticipant:output_type -> inference.inference.QueryInferenceParticipantResponse + 13, // 195: inference.inference.Query.GetRandomExecutor:output_type -> inference.inference.QueryGetRandomExecutorResponse + 15, // 196: inference.inference.Query.EpochGroupData:output_type -> inference.inference.QueryGetEpochGroupDataResponse + 17, // 197: inference.inference.Query.EpochGroupDataAll:output_type -> inference.inference.QueryAllEpochGroupDataResponse + 19, // 198: inference.inference.Query.SettleAmount:output_type -> inference.inference.QueryGetSettleAmountResponse + 21, // 199: inference.inference.Query.SettleAmountAll:output_type -> inference.inference.QueryAllSettleAmountResponse + 23, // 200: inference.inference.Query.EpochGroupValidations:output_type -> inference.inference.QueryGetEpochGroupValidationsResponse + 25, // 201: inference.inference.Query.EpochGroupValidationsAll:output_type -> inference.inference.QueryAllEpochGroupValidationsResponse + 27, // 202: inference.inference.Query.PocBatchesForStage:output_type -> inference.inference.QueryPocBatchesForStageResponse + 30, // 203: inference.inference.Query.PocValidationsForStage:output_type -> inference.inference.QueryPocValidationsForStageResponse + 33, // 204: inference.inference.Query.PocV2ValidationsForStage:output_type -> inference.inference.QueryPocV2ValidationsForStageResponse + 36, // 205: inference.inference.Query.PoCV2StoreCommit:output_type -> inference.inference.QueryPoCV2StoreCommitResponse + 38, // 206: inference.inference.Query.MLNodeWeightDistribution:output_type -> inference.inference.QueryMLNodeWeightDistributionResponse + 40, // 207: inference.inference.Query.AllPoCV2StoreCommitsForStage:output_type -> inference.inference.QueryAllPoCV2StoreCommitsForStageResponse + 43, // 208: inference.inference.Query.AllMLNodeWeightDistributionsForStage:output_type -> inference.inference.QueryAllMLNodeWeightDistributionsForStageResponse + 46, // 209: inference.inference.Query.GetCurrentEpoch:output_type -> inference.inference.QueryGetCurrentEpochResponse + 48, // 210: inference.inference.Query.TokenomicsData:output_type -> inference.inference.QueryGetTokenomicsDataResponse + 50, // 211: inference.inference.Query.GetUnitOfComputePriceProposal:output_type -> inference.inference.QueryGetUnitOfComputePriceProposalResponse + 52, // 212: inference.inference.Query.CurrentEpochGroupData:output_type -> inference.inference.QueryCurrentEpochGroupDataResponse + 56, // 213: inference.inference.Query.ModelsAll:output_type -> inference.inference.QueryModelsAllResponse + 58, // 214: inference.inference.Query.TopMiner:output_type -> inference.inference.QueryGetTopMinerResponse + 60, // 215: inference.inference.Query.TopMinerAll:output_type -> inference.inference.QueryAllTopMinerResponse + 62, // 216: inference.inference.Query.InferenceTimeout:output_type -> inference.inference.QueryGetInferenceTimeoutResponse + 64, // 217: inference.inference.Query.InferenceTimeoutAll:output_type -> inference.inference.QueryAllInferenceTimeoutResponse + 66, // 218: inference.inference.Query.InferenceValidationDetails:output_type -> inference.inference.QueryGetInferenceValidationDetailsResponse + 68, // 219: inference.inference.Query.InferenceValidationDetailsAll:output_type -> inference.inference.QueryAllInferenceValidationDetailsResponse + 70, // 220: inference.inference.Query.GetInferenceValidationParameters:output_type -> inference.inference.QueryGetInferenceValidationParametersResponse + 73, // 221: inference.inference.Query.EpochPerformanceSummary:output_type -> inference.inference.QueryEpochPerformanceSummaryByEpochResponse + 75, // 222: inference.inference.Query.EpochPerformanceSummaryByParticipant:output_type -> inference.inference.QueryEpochPerformanceSummaryByParticipantResponse + 77, // 223: inference.inference.Query.EpochPerformanceSummaryAll:output_type -> inference.inference.QueryAllEpochPerformanceSummaryResponse + 79, // 224: inference.inference.Query.TrainingTask:output_type -> inference.inference.QueryTrainingTaskResponse + 81, // 225: inference.inference.Query.HardwareNodes:output_type -> inference.inference.QueryHardwareNodesResponse + 83, // 226: inference.inference.Query.HardwareNodesAll:output_type -> inference.inference.QueryHardwareNodesAllResponse + 85, // 227: inference.inference.Query.QueuedTrainingTasks:output_type -> inference.inference.QueryQueuedTrainingTasksResponse + 87, // 228: inference.inference.Query.TrainingTaskAll:output_type -> inference.inference.QueryTrainingTaskAllResponse + 89, // 229: inference.inference.Query.GetParticipantCurrentStats:output_type -> inference.inference.QueryGetParticipantCurrentStatsResponse + 91, // 230: inference.inference.Query.GetAllParticipantCurrentStats:output_type -> inference.inference.QueryGetAllParticipantCurrentStatsResponse + 95, // 231: inference.inference.Query.GetParticipantsFullStats:output_type -> inference.inference.QueryParticipantsFullStatsResponse + 97, // 232: inference.inference.Query.StatsByTimePeriodByDeveloper:output_type -> inference.inference.QueryStatsByTimePeriodByDeveloperResponse + 104, // 233: inference.inference.Query.StatsByDeveloperAndEpochsBackwards:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse + 106, // 234: inference.inference.Query.CountParticipants:output_type -> inference.inference.QueryCountAllParticipantsResponse + 108, // 235: inference.inference.Query.DebugStatsDeveloperStats:output_type -> inference.inference.QueryDebugStatsResponse + 104, // 236: inference.inference.Query.InferencesAndTokensStatsByEpochsBackwards:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse + 104, // 237: inference.inference.Query.InferencesAndTokensStatsByTimePeriod:output_type -> inference.inference.QueryInferencesAndTokensStatsResponse + 103, // 238: inference.inference.Query.InferencesAndTokensStatsByModels:output_type -> inference.inference.QueryInferencesAndTokensStatsByModelsResponse + 110, // 239: inference.inference.Query.GetMinimumValidationAverage:output_type -> inference.inference.QueryGetMinimumValidationAverageResponse + 112, // 240: inference.inference.Query.InProgressTrainingTasks:output_type -> inference.inference.QueryInProgressTrainingTasksResponse + 114, // 241: inference.inference.Query.PartialUpgrade:output_type -> inference.inference.QueryGetPartialUpgradeResponse + 116, // 242: inference.inference.Query.PartialUpgradeAll:output_type -> inference.inference.QueryAllPartialUpgradeResponse + 126, // 243: inference.inference.Query.BridgeTransaction:output_type -> inference.inference.QueryGetBridgeTransactionResponse + 128, // 244: inference.inference.Query.BridgeTransactions:output_type -> inference.inference.QueryAllBridgeTransactionsResponse + 133, // 245: inference.inference.Query.BridgeAddressesByChain:output_type -> inference.inference.QueryBridgeAddressesByChainResponse + 137, // 246: inference.inference.Query.LiquidityPool:output_type -> inference.inference.QueryLiquidityPoolResponse + 131, // 247: inference.inference.Query.WrappedTokenBalances:output_type -> inference.inference.QueryWrappedTokenBalancesResponse + 135, // 248: inference.inference.Query.ValidateWrappedTokenForTrade:output_type -> inference.inference.QueryValidateWrappedTokenForTradeResponse + 145, // 249: inference.inference.Query.ApprovedTokensForTrade:output_type -> inference.inference.QueryApprovedTokensForTradeResponse + 118, // 250: inference.inference.Query.TrainingKvRecord:output_type -> inference.inference.QueryTrainingKvRecordResponse + 120, // 251: inference.inference.Query.ListTrainingKvRecordKeys:output_type -> inference.inference.QueryListTrainingKvRecordKeysResponse + 122, // 252: inference.inference.Query.TrainingBarrier:output_type -> inference.inference.QueryTrainingBarrierResponse + 124, // 253: inference.inference.Query.TrainingAliveNodes:output_type -> inference.inference.QueryTrainingAliveNodesResponse + 139, // 254: inference.inference.Query.EpochInfo:output_type -> inference.inference.QueryEpochInfoResponse + 141, // 255: inference.inference.Query.CountPoCbatchesAtHeight:output_type -> inference.inference.QueryCountPoCbatchesAtHeightResponse + 143, // 256: inference.inference.Query.CountPoCvalidationsAtHeight:output_type -> inference.inference.QueryCountPoCvalidationsAtHeightResponse + 147, // 257: inference.inference.Query.GetModelPerTokenPrice:output_type -> inference.inference.QueryGetModelPerTokenPriceResponse + 150, // 258: inference.inference.Query.GetAllModelPerTokenPrices:output_type -> inference.inference.QueryGetAllModelPerTokenPricesResponse + 152, // 259: inference.inference.Query.GetModelCapacity:output_type -> inference.inference.QueryGetModelCapacityResponse + 154, // 260: inference.inference.Query.GetAllModelCapacities:output_type -> inference.inference.QueryGetAllModelCapacitiesResponse + 158, // 261: inference.inference.Query.GranteesByMessageType:output_type -> inference.inference.QueryGranteesByMessageTypeResponse + 164, // 262: inference.inference.Query.MLNodeVersion:output_type -> inference.inference.QueryGetMLNodeVersionResponse + 160, // 263: inference.inference.Query.TrainingAllowList:output_type -> inference.inference.QueryTrainingAllowListResponse + 162, // 264: inference.inference.Query.ParticipantAllowList:output_type -> inference.inference.QueryParticipantAllowListResponse + 166, // 265: inference.inference.Query.ExcludedParticipants:output_type -> inference.inference.QueryExcludedParticipantsResponse + 168, // 266: inference.inference.Query.ActiveConfirmationPoCEvent:output_type -> inference.inference.QueryActiveConfirmationPoCEventResponse + 170, // 267: inference.inference.Query.ListConfirmationPoCEvents:output_type -> inference.inference.QueryConfirmationPoCEventsResponse + 175, // 268: inference.inference.Query.ListRandomSeeds:output_type -> inference.inference.QueryRandomSeedsResponse + 173, // 269: inference.inference.Query.ParticipantsWithBalances:output_type -> inference.inference.QueryParticipantsWithBalancesResponse + 177, // 270: inference.inference.Query.PoCValidationSnapshot:output_type -> inference.inference.QueryPoCValidationSnapshotResponse + 189, // [189:271] is the sub-list for method output_type + 107, // [107:189] is the sub-list for method input_type + 107, // [107:107] is the sub-list for extension type_name + 107, // [107:107] is the sub-list for extension extendee + 0, // [0:107] is the sub-list for field type_name } func init() { file_inference_inference_query_proto_init() } @@ -92512,6 +93521,7 @@ func file_inference_inference_query_proto_init() { file_inference_inference_liquidity_pool_proto_init() file_inference_inference_poc_v2_proto_init() file_inference_inference_random_seed_proto_init() + file_inference_inference_poc_validation_snapshot_proto_init() if !protoimpl.UnsafeEnabled { file_inference_inference_query_proto_msgTypes[0].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryParamsRequest); i { @@ -94626,7 +95636,7 @@ func file_inference_inference_query_proto_init() { } } file_inference_inference_query_proto_msgTypes[176].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryDebugStatsResponse_TemporaryTimeStat); i { + switch v := v.(*QueryPoCValidationSnapshotRequest); i { case 0: return &v.state case 1: @@ -94638,6 +95648,30 @@ func file_inference_inference_query_proto_init() { } } file_inference_inference_query_proto_msgTypes[177].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryPoCValidationSnapshotResponse); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_inference_inference_query_proto_msgTypes[178].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryDebugStatsResponse_TemporaryTimeStat); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_inference_inference_query_proto_msgTypes[179].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryDebugStatsResponse_TemporaryEpochStat); i { case 0: return &v.state @@ -94656,7 +95690,7 @@ func file_inference_inference_query_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_inference_inference_query_proto_rawDesc, NumEnums: 0, - NumMessages: 178, + NumMessages: 180, NumExtensions: 0, NumServices: 1, }, diff --git a/inference-chain/api/inference/inference/query_grpc.pb.go b/inference-chain/api/inference/inference/query_grpc.pb.go index 1557fa738..ba90060c3 100644 --- a/inference-chain/api/inference/inference/query_grpc.pb.go +++ b/inference-chain/api/inference/inference/query_grpc.pb.go @@ -100,6 +100,7 @@ const ( Query_ListConfirmationPoCEvents_FullMethodName = "/inference.inference.Query/ListConfirmationPoCEvents" Query_ListRandomSeeds_FullMethodName = "/inference.inference.Query/ListRandomSeeds" Query_ParticipantsWithBalances_FullMethodName = "/inference.inference.Query/ParticipantsWithBalances" + Query_PoCValidationSnapshot_FullMethodName = "/inference.inference.Query/PoCValidationSnapshot" ) // QueryClient is the client API for Query service. @@ -245,6 +246,8 @@ type QueryClient interface { // Queries random seeds for a specific epoch. ListRandomSeeds(ctx context.Context, in *QueryRandomSeedsRequest, opts ...grpc.CallOption) (*QueryRandomSeedsResponse, error) ParticipantsWithBalances(ctx context.Context, in *QueryParticipantsWithBalancesRequest, opts ...grpc.CallOption) (*QueryParticipantsWithBalancesResponse, error) + // Queries PoC validation snapshot for deterministic sampling synchronization. + PoCValidationSnapshot(ctx context.Context, in *QueryPoCValidationSnapshotRequest, opts ...grpc.CallOption) (*QueryPoCValidationSnapshotResponse, error) } type queryClient struct { @@ -984,6 +987,15 @@ func (c *queryClient) ParticipantsWithBalances(ctx context.Context, in *QueryPar return out, nil } +func (c *queryClient) PoCValidationSnapshot(ctx context.Context, in *QueryPoCValidationSnapshotRequest, opts ...grpc.CallOption) (*QueryPoCValidationSnapshotResponse, error) { + out := new(QueryPoCValidationSnapshotResponse) + err := c.cc.Invoke(ctx, Query_PoCValidationSnapshot_FullMethodName, in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. // All implementations must embed UnimplementedQueryServer // for forward compatibility @@ -1127,6 +1139,8 @@ type QueryServer interface { // Queries random seeds for a specific epoch. ListRandomSeeds(context.Context, *QueryRandomSeedsRequest) (*QueryRandomSeedsResponse, error) ParticipantsWithBalances(context.Context, *QueryParticipantsWithBalancesRequest) (*QueryParticipantsWithBalancesResponse, error) + // Queries PoC validation snapshot for deterministic sampling synchronization. + PoCValidationSnapshot(context.Context, *QueryPoCValidationSnapshotRequest) (*QueryPoCValidationSnapshotResponse, error) mustEmbedUnimplementedQueryServer() } @@ -1377,6 +1391,9 @@ func (UnimplementedQueryServer) ListRandomSeeds(context.Context, *QueryRandomSee func (UnimplementedQueryServer) ParticipantsWithBalances(context.Context, *QueryParticipantsWithBalancesRequest) (*QueryParticipantsWithBalancesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ParticipantsWithBalances not implemented") } +func (UnimplementedQueryServer) PoCValidationSnapshot(context.Context, *QueryPoCValidationSnapshotRequest) (*QueryPoCValidationSnapshotResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PoCValidationSnapshot not implemented") +} func (UnimplementedQueryServer) mustEmbedUnimplementedQueryServer() {} // UnsafeQueryServer may be embedded to opt out of forward compatibility for this service. @@ -2848,6 +2865,24 @@ func _Query_ParticipantsWithBalances_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _Query_PoCValidationSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPoCValidationSnapshotRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).PoCValidationSnapshot(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Query_PoCValidationSnapshot_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).PoCValidationSnapshot(ctx, req.(*QueryPoCValidationSnapshotRequest)) + } + return interceptor(ctx, in, info, handler) +} + // Query_ServiceDesc is the grpc.ServiceDesc for Query service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -3179,6 +3214,10 @@ var Query_ServiceDesc = grpc.ServiceDesc{ MethodName: "ParticipantsWithBalances", Handler: _Query_ParticipantsWithBalances_Handler, }, + { + MethodName: "PoCValidationSnapshot", + Handler: _Query_PoCValidationSnapshot_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "inference/inference/query.proto", diff --git a/inference-chain/api/inference/streamvesting/tx.pulsar.go b/inference-chain/api/inference/streamvesting/tx.pulsar.go index 244b55e7d..6041b18cc 100644 --- a/inference-chain/api/inference/streamvesting/tx.pulsar.go +++ b/inference-chain/api/inference/streamvesting/tx.pulsar.go @@ -3,6 +3,7 @@ package streamvesting import ( _ "cosmossdk.io/api/amino" + v1beta1 "cosmossdk.io/api/cosmos/base/v1beta1" _ "cosmossdk.io/api/cosmos/msg/v1" fmt "fmt" _ "github.com/cosmos/cosmos-proto" @@ -871,6 +872,1032 @@ func (x *fastReflection_MsgUpdateParamsResponse) ProtoMethods() *protoiface.Meth } } +var _ protoreflect.List = (*_MsgTransferWithVesting_3_list)(nil) + +type _MsgTransferWithVesting_3_list struct { + list *[]*v1beta1.Coin +} + +func (x *_MsgTransferWithVesting_3_list) Len() int { + if x.list == nil { + return 0 + } + return len(*x.list) +} + +func (x *_MsgTransferWithVesting_3_list) Get(i int) protoreflect.Value { + return protoreflect.ValueOfMessage((*x.list)[i].ProtoReflect()) +} + +func (x *_MsgTransferWithVesting_3_list) Set(i int, value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*v1beta1.Coin) + (*x.list)[i] = concreteValue +} + +func (x *_MsgTransferWithVesting_3_list) Append(value protoreflect.Value) { + valueUnwrapped := value.Message() + concreteValue := valueUnwrapped.Interface().(*v1beta1.Coin) + *x.list = append(*x.list, concreteValue) +} + +func (x *_MsgTransferWithVesting_3_list) AppendMutable() protoreflect.Value { + v := new(v1beta1.Coin) + *x.list = append(*x.list, v) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_MsgTransferWithVesting_3_list) Truncate(n int) { + for i := n; i < len(*x.list); i++ { + (*x.list)[i] = nil + } + *x.list = (*x.list)[:n] +} + +func (x *_MsgTransferWithVesting_3_list) NewElement() protoreflect.Value { + v := new(v1beta1.Coin) + return protoreflect.ValueOfMessage(v.ProtoReflect()) +} + +func (x *_MsgTransferWithVesting_3_list) IsValid() bool { + return x.list != nil +} + +var ( + md_MsgTransferWithVesting protoreflect.MessageDescriptor + fd_MsgTransferWithVesting_sender protoreflect.FieldDescriptor + fd_MsgTransferWithVesting_recipient protoreflect.FieldDescriptor + fd_MsgTransferWithVesting_amount protoreflect.FieldDescriptor + fd_MsgTransferWithVesting_vesting_epochs protoreflect.FieldDescriptor +) + +func init() { + file_inference_streamvesting_tx_proto_init() + md_MsgTransferWithVesting = File_inference_streamvesting_tx_proto.Messages().ByName("MsgTransferWithVesting") + fd_MsgTransferWithVesting_sender = md_MsgTransferWithVesting.Fields().ByName("sender") + fd_MsgTransferWithVesting_recipient = md_MsgTransferWithVesting.Fields().ByName("recipient") + fd_MsgTransferWithVesting_amount = md_MsgTransferWithVesting.Fields().ByName("amount") + fd_MsgTransferWithVesting_vesting_epochs = md_MsgTransferWithVesting.Fields().ByName("vesting_epochs") +} + +var _ protoreflect.Message = (*fastReflection_MsgTransferWithVesting)(nil) + +type fastReflection_MsgTransferWithVesting MsgTransferWithVesting + +func (x *MsgTransferWithVesting) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgTransferWithVesting)(x) +} + +func (x *MsgTransferWithVesting) slowProtoReflect() protoreflect.Message { + mi := &file_inference_streamvesting_tx_proto_msgTypes[2] + 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_MsgTransferWithVesting_messageType fastReflection_MsgTransferWithVesting_messageType +var _ protoreflect.MessageType = fastReflection_MsgTransferWithVesting_messageType{} + +type fastReflection_MsgTransferWithVesting_messageType struct{} + +func (x fastReflection_MsgTransferWithVesting_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgTransferWithVesting)(nil) +} +func (x fastReflection_MsgTransferWithVesting_messageType) New() protoreflect.Message { + return new(fastReflection_MsgTransferWithVesting) +} +func (x fastReflection_MsgTransferWithVesting_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgTransferWithVesting +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgTransferWithVesting) Descriptor() protoreflect.MessageDescriptor { + return md_MsgTransferWithVesting +} + +// 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_MsgTransferWithVesting) Type() protoreflect.MessageType { + return _fastReflection_MsgTransferWithVesting_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgTransferWithVesting) New() protoreflect.Message { + return new(fastReflection_MsgTransferWithVesting) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgTransferWithVesting) Interface() protoreflect.ProtoMessage { + return (*MsgTransferWithVesting)(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_MsgTransferWithVesting) Range(f func(protoreflect.FieldDescriptor, protoreflect.Value) bool) { + if x.Sender != "" { + value := protoreflect.ValueOfString(x.Sender) + if !f(fd_MsgTransferWithVesting_sender, value) { + return + } + } + if x.Recipient != "" { + value := protoreflect.ValueOfString(x.Recipient) + if !f(fd_MsgTransferWithVesting_recipient, value) { + return + } + } + if len(x.Amount) != 0 { + value := protoreflect.ValueOfList(&_MsgTransferWithVesting_3_list{list: &x.Amount}) + if !f(fd_MsgTransferWithVesting_amount, value) { + return + } + } + if x.VestingEpochs != uint64(0) { + value := protoreflect.ValueOfUint64(x.VestingEpochs) + if !f(fd_MsgTransferWithVesting_vesting_epochs, 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_MsgTransferWithVesting) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + case "inference.streamvesting.MsgTransferWithVesting.sender": + return x.Sender != "" + case "inference.streamvesting.MsgTransferWithVesting.recipient": + return x.Recipient != "" + case "inference.streamvesting.MsgTransferWithVesting.amount": + return len(x.Amount) != 0 + case "inference.streamvesting.MsgTransferWithVesting.vesting_epochs": + return x.VestingEpochs != uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVesting")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVesting 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_MsgTransferWithVesting) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + case "inference.streamvesting.MsgTransferWithVesting.sender": + x.Sender = "" + case "inference.streamvesting.MsgTransferWithVesting.recipient": + x.Recipient = "" + case "inference.streamvesting.MsgTransferWithVesting.amount": + x.Amount = nil + case "inference.streamvesting.MsgTransferWithVesting.vesting_epochs": + x.VestingEpochs = uint64(0) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVesting")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVesting 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_MsgTransferWithVesting) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + case "inference.streamvesting.MsgTransferWithVesting.sender": + value := x.Sender + return protoreflect.ValueOfString(value) + case "inference.streamvesting.MsgTransferWithVesting.recipient": + value := x.Recipient + return protoreflect.ValueOfString(value) + case "inference.streamvesting.MsgTransferWithVesting.amount": + if len(x.Amount) == 0 { + return protoreflect.ValueOfList(&_MsgTransferWithVesting_3_list{}) + } + listValue := &_MsgTransferWithVesting_3_list{list: &x.Amount} + return protoreflect.ValueOfList(listValue) + case "inference.streamvesting.MsgTransferWithVesting.vesting_epochs": + value := x.VestingEpochs + return protoreflect.ValueOfUint64(value) + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVesting")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVesting 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_MsgTransferWithVesting) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + case "inference.streamvesting.MsgTransferWithVesting.sender": + x.Sender = value.Interface().(string) + case "inference.streamvesting.MsgTransferWithVesting.recipient": + x.Recipient = value.Interface().(string) + case "inference.streamvesting.MsgTransferWithVesting.amount": + lv := value.List() + clv := lv.(*_MsgTransferWithVesting_3_list) + x.Amount = *clv.list + case "inference.streamvesting.MsgTransferWithVesting.vesting_epochs": + x.VestingEpochs = value.Uint() + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVesting")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVesting 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_MsgTransferWithVesting) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.streamvesting.MsgTransferWithVesting.amount": + if x.Amount == nil { + x.Amount = []*v1beta1.Coin{} + } + value := &_MsgTransferWithVesting_3_list{list: &x.Amount} + return protoreflect.ValueOfList(value) + case "inference.streamvesting.MsgTransferWithVesting.sender": + panic(fmt.Errorf("field sender of message inference.streamvesting.MsgTransferWithVesting is not mutable")) + case "inference.streamvesting.MsgTransferWithVesting.recipient": + panic(fmt.Errorf("field recipient of message inference.streamvesting.MsgTransferWithVesting is not mutable")) + case "inference.streamvesting.MsgTransferWithVesting.vesting_epochs": + panic(fmt.Errorf("field vesting_epochs of message inference.streamvesting.MsgTransferWithVesting is not mutable")) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVesting")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVesting 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_MsgTransferWithVesting) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + case "inference.streamvesting.MsgTransferWithVesting.sender": + return protoreflect.ValueOfString("") + case "inference.streamvesting.MsgTransferWithVesting.recipient": + return protoreflect.ValueOfString("") + case "inference.streamvesting.MsgTransferWithVesting.amount": + list := []*v1beta1.Coin{} + return protoreflect.ValueOfList(&_MsgTransferWithVesting_3_list{list: &list}) + case "inference.streamvesting.MsgTransferWithVesting.vesting_epochs": + return protoreflect.ValueOfUint64(uint64(0)) + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVesting")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVesting 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_MsgTransferWithVesting) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in inference.streamvesting.MsgTransferWithVesting", 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_MsgTransferWithVesting) 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_MsgTransferWithVesting) 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_MsgTransferWithVesting) 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_MsgTransferWithVesting) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgTransferWithVesting) + 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.Sender) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + l = len(x.Recipient) + if l > 0 { + n += 1 + l + runtime.Sov(uint64(l)) + } + if len(x.Amount) > 0 { + for _, e := range x.Amount { + l = options.Size(e) + n += 1 + l + runtime.Sov(uint64(l)) + } + } + if x.VestingEpochs != 0 { + n += 1 + runtime.Sov(uint64(x.VestingEpochs)) + } + 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().(*MsgTransferWithVesting) + 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.VestingEpochs != 0 { + i = runtime.EncodeVarint(dAtA, i, uint64(x.VestingEpochs)) + i-- + dAtA[i] = 0x20 + } + if len(x.Amount) > 0 { + for iNdEx := len(x.Amount) - 1; iNdEx >= 0; iNdEx-- { + encoded, err := options.Marshal(x.Amount[iNdEx]) + 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.Recipient) > 0 { + i -= len(x.Recipient) + copy(dAtA[i:], x.Recipient) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Recipient))) + i-- + dAtA[i] = 0x12 + } + if len(x.Sender) > 0 { + i -= len(x.Sender) + copy(dAtA[i:], x.Sender) + i = runtime.EncodeVarint(dAtA, i, uint64(len(x.Sender))) + 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().(*MsgTransferWithVesting) + 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: MsgTransferWithVesting: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgTransferWithVesting: 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 Sender", 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.Sender = 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 Recipient", 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.Recipient = 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 Amount", 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 + } + x.Amount = append(x.Amount, &v1beta1.Coin{}) + if err := options.Unmarshal(dAtA[iNdEx:postIndex], x.Amount[len(x.Amount)-1]); 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 VestingEpochs", wireType) + } + x.VestingEpochs = 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.VestingEpochs |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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_MsgTransferWithVestingResponse protoreflect.MessageDescriptor +) + +func init() { + file_inference_streamvesting_tx_proto_init() + md_MsgTransferWithVestingResponse = File_inference_streamvesting_tx_proto.Messages().ByName("MsgTransferWithVestingResponse") +} + +var _ protoreflect.Message = (*fastReflection_MsgTransferWithVestingResponse)(nil) + +type fastReflection_MsgTransferWithVestingResponse MsgTransferWithVestingResponse + +func (x *MsgTransferWithVestingResponse) ProtoReflect() protoreflect.Message { + return (*fastReflection_MsgTransferWithVestingResponse)(x) +} + +func (x *MsgTransferWithVestingResponse) slowProtoReflect() protoreflect.Message { + mi := &file_inference_streamvesting_tx_proto_msgTypes[3] + 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_MsgTransferWithVestingResponse_messageType fastReflection_MsgTransferWithVestingResponse_messageType +var _ protoreflect.MessageType = fastReflection_MsgTransferWithVestingResponse_messageType{} + +type fastReflection_MsgTransferWithVestingResponse_messageType struct{} + +func (x fastReflection_MsgTransferWithVestingResponse_messageType) Zero() protoreflect.Message { + return (*fastReflection_MsgTransferWithVestingResponse)(nil) +} +func (x fastReflection_MsgTransferWithVestingResponse_messageType) New() protoreflect.Message { + return new(fastReflection_MsgTransferWithVestingResponse) +} +func (x fastReflection_MsgTransferWithVestingResponse_messageType) Descriptor() protoreflect.MessageDescriptor { + return md_MsgTransferWithVestingResponse +} + +// Descriptor returns message descriptor, which contains only the protobuf +// type information for the message. +func (x *fastReflection_MsgTransferWithVestingResponse) Descriptor() protoreflect.MessageDescriptor { + return md_MsgTransferWithVestingResponse +} + +// 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_MsgTransferWithVestingResponse) Type() protoreflect.MessageType { + return _fastReflection_MsgTransferWithVestingResponse_messageType +} + +// New returns a newly allocated and mutable empty message. +func (x *fastReflection_MsgTransferWithVestingResponse) New() protoreflect.Message { + return new(fastReflection_MsgTransferWithVestingResponse) +} + +// Interface unwraps the message reflection interface and +// returns the underlying ProtoMessage interface. +func (x *fastReflection_MsgTransferWithVestingResponse) Interface() protoreflect.ProtoMessage { + return (*MsgTransferWithVestingResponse)(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_MsgTransferWithVestingResponse) 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_MsgTransferWithVestingResponse) Has(fd protoreflect.FieldDescriptor) bool { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVestingResponse")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVestingResponse 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_MsgTransferWithVestingResponse) Clear(fd protoreflect.FieldDescriptor) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVestingResponse")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVestingResponse 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_MsgTransferWithVestingResponse) Get(descriptor protoreflect.FieldDescriptor) protoreflect.Value { + switch descriptor.FullName() { + default: + if descriptor.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVestingResponse")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVestingResponse 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_MsgTransferWithVestingResponse) Set(fd protoreflect.FieldDescriptor, value protoreflect.Value) { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVestingResponse")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVestingResponse 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_MsgTransferWithVestingResponse) Mutable(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVestingResponse")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVestingResponse 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_MsgTransferWithVestingResponse) NewField(fd protoreflect.FieldDescriptor) protoreflect.Value { + switch fd.FullName() { + default: + if fd.IsExtension() { + panic(fmt.Errorf("proto3 declared messages do not support extensions: inference.streamvesting.MsgTransferWithVestingResponse")) + } + panic(fmt.Errorf("message inference.streamvesting.MsgTransferWithVestingResponse 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_MsgTransferWithVestingResponse) WhichOneof(d protoreflect.OneofDescriptor) protoreflect.FieldDescriptor { + switch d.FullName() { + default: + panic(fmt.Errorf("%s is not a oneof field in inference.streamvesting.MsgTransferWithVestingResponse", 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_MsgTransferWithVestingResponse) 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_MsgTransferWithVestingResponse) 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_MsgTransferWithVestingResponse) 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_MsgTransferWithVestingResponse) ProtoMethods() *protoiface.Methods { + size := func(input protoiface.SizeInput) protoiface.SizeOutput { + x := input.Message.Interface().(*MsgTransferWithVestingResponse) + 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().(*MsgTransferWithVestingResponse) + 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().(*MsgTransferWithVestingResponse) + 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: MsgTransferWithVestingResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return protoiface.UnmarshalOutput{NoUnkeyedLiterals: input.NoUnkeyedLiterals, Flags: input.Flags}, fmt.Errorf("proto: MsgTransferWithVestingResponse: 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 @@ -960,6 +1987,98 @@ func (*MsgUpdateParamsResponse) Descriptor() ([]byte, []int) { return file_inference_streamvesting_tx_proto_rawDescGZIP(), []int{1} } +// MsgTransferWithVesting is the request type for transferring tokens with vesting. +type MsgTransferWithVesting struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // sender is the address of the account sending the tokens. + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` + // recipient is the address of the account receiving the vesting tokens. + Recipient string `protobuf:"bytes,2,opt,name=recipient,proto3" json:"recipient,omitempty"` + // amount is the coins to transfer with vesting. + Amount []*v1beta1.Coin `protobuf:"bytes,3,rep,name=amount,proto3" json:"amount,omitempty"` + // vesting_epochs is the number of epochs over which the tokens will vest. + // If not specified or 0, defaults to 180 epochs. + VestingEpochs uint64 `protobuf:"varint,4,opt,name=vesting_epochs,json=vestingEpochs,proto3" json:"vesting_epochs,omitempty"` +} + +func (x *MsgTransferWithVesting) Reset() { + *x = MsgTransferWithVesting{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_streamvesting_tx_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgTransferWithVesting) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgTransferWithVesting) ProtoMessage() {} + +// Deprecated: Use MsgTransferWithVesting.ProtoReflect.Descriptor instead. +func (*MsgTransferWithVesting) Descriptor() ([]byte, []int) { + return file_inference_streamvesting_tx_proto_rawDescGZIP(), []int{2} +} + +func (x *MsgTransferWithVesting) GetSender() string { + if x != nil { + return x.Sender + } + return "" +} + +func (x *MsgTransferWithVesting) GetRecipient() string { + if x != nil { + return x.Recipient + } + return "" +} + +func (x *MsgTransferWithVesting) GetAmount() []*v1beta1.Coin { + if x != nil { + return x.Amount + } + return nil +} + +func (x *MsgTransferWithVesting) GetVestingEpochs() uint64 { + if x != nil { + return x.VestingEpochs + } + return 0 +} + +// MsgTransferWithVestingResponse defines the response for MsgTransferWithVesting. +type MsgTransferWithVestingResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *MsgTransferWithVestingResponse) Reset() { + *x = MsgTransferWithVestingResponse{} + if protoimpl.UnsafeEnabled { + mi := &file_inference_streamvesting_tx_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *MsgTransferWithVestingResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*MsgTransferWithVestingResponse) ProtoMessage() {} + +// Deprecated: Use MsgTransferWithVestingResponse.ProtoReflect.Descriptor instead. +func (*MsgTransferWithVestingResponse) Descriptor() ([]byte, []int) { + return file_inference_streamvesting_tx_proto_rawDescGZIP(), []int{3} +} + var File_inference_streamvesting_tx_proto protoreflect.FileDescriptor var file_inference_streamvesting_tx_proto_rawDesc = []byte{ @@ -972,7 +2091,9 @@ var file_inference_streamvesting_tx_proto_rawDesc = []byte{ 0x67, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x19, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x5f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x14, 0x67, 0x6f, 0x67, 0x6f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, - 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, + 0x67, 0x6f, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x1e, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x2f, 0x62, 0x61, 0x73, 0x65, 0x2f, 0x76, 0x31, 0x62, 0x65, 0x74, 0x61, 0x31, 0x2f, 0x63, 0x6f, + 0x69, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x24, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xcb, 0x01, 0x0a, 0x0f, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, @@ -989,28 +2110,60 @@ var file_inference_streamvesting_tx_proto_rawDesc = []byte{ 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 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, 0x78, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x6a, - 0x0a, 0x0c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x28, - 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, - 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, - 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, - 0x6e, 0x67, 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, 0xcd, 0x01, 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, - 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x42, 0x07, 0x54, 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x28, 0x63, 0x6f, - 0x73, 0x6d, 0x6f, 0x73, 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0xa2, 0x02, 0x03, 0x49, 0x53, 0x58, 0xaa, 0x02, 0x17, 0x49, - 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, - 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0xca, 0x02, 0x17, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x5c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, - 0xe2, 0x02, 0x23, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x53, 0x74, 0x72, - 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, - 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x18, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, - 0x63, 0x65, 0x3a, 0x3a, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, - 0x67, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xd5, 0x02, 0x0a, 0x16, 0x4d, 0x73, 0x67, 0x54, + 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x56, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0x12, 0x30, 0x0a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, + 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, 0x06, 0x73, 0x65, + 0x6e, 0x64, 0x65, 0x72, 0x12, 0x36, 0x0a, 0x09, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, + 0x74, 0x18, 0x02, 0x20, 0x01, 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, 0x72, 0x65, 0x63, 0x69, 0x70, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x68, 0x0a, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x03, 0x20, 0x03, 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, 0x35, 0xc8, 0xde, 0x1f, 0x00, 0xaa, 0xdf, 0x1f, + 0x28, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x63, 0x6f, 0x73, 0x6d, + 0x6f, 0x73, 0x2f, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, 0x2d, 0x73, 0x64, 0x6b, 0x2f, 0x74, 0x79, + 0x70, 0x65, 0x73, 0x2e, 0x43, 0x6f, 0x69, 0x6e, 0x73, 0xa8, 0xe7, 0xb0, 0x2a, 0x01, 0x52, 0x06, + 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, + 0x67, 0x5f, 0x65, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, + 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x45, 0x70, 0x6f, 0x63, 0x68, 0x73, 0x3a, 0x40, 0x82, + 0xe7, 0xb0, 0x2a, 0x06, 0x73, 0x65, 0x6e, 0x64, 0x65, 0x72, 0x8a, 0xe7, 0xb0, 0x2a, 0x30, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x78, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, + 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2f, 0x4d, 0x73, 0x67, 0x54, 0x72, 0x61, 0x6e, + 0x73, 0x66, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x22, + 0x20, 0x0a, 0x1e, 0x4d, 0x73, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x57, 0x69, + 0x74, 0x68, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x32, 0xf9, 0x01, 0x0a, 0x03, 0x4d, 0x73, 0x67, 0x12, 0x6a, 0x0a, 0x0c, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x28, 0x2e, 0x69, 0x6e, 0x66, 0x65, + 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, + 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x73, 0x67, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x1a, 0x30, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 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, 0x7f, 0x0a, 0x13, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, + 0x72, 0x57, 0x69, 0x74, 0x68, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x12, 0x2f, 0x2e, 0x69, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x73, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, 0x66, + 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x1a, 0x37, 0x2e, + 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, + 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x2e, 0x4d, 0x73, 0x67, 0x54, 0x72, 0x61, 0x6e, 0x73, + 0x66, 0x65, 0x72, 0x57, 0x69, 0x74, 0x68, 0x56, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, 0x05, 0x80, 0xe7, 0xb0, 0x2a, 0x01, 0x42, 0xcd, 0x01, + 0x0a, 0x1b, 0x63, 0x6f, 0x6d, 0x2e, 0x69, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x2e, + 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x42, 0x07, 0x54, + 0x78, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x28, 0x63, 0x6f, 0x73, 0x6d, 0x6f, 0x73, + 0x73, 0x64, 0x6b, 0x2e, 0x69, 0x6f, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x69, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2f, 0x73, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0xa2, 0x02, 0x03, 0x49, 0x53, 0x58, 0xaa, 0x02, 0x17, 0x49, 0x6e, 0x66, 0x65, 0x72, + 0x65, 0x6e, 0x63, 0x65, 0x2e, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, + 0x6e, 0x67, 0xca, 0x02, 0x17, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x53, + 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0xe2, 0x02, 0x23, 0x49, + 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x5c, 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, + 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0xea, 0x02, 0x18, 0x49, 0x6e, 0x66, 0x65, 0x72, 0x65, 0x6e, 0x63, 0x65, 0x3a, 0x3a, + 0x53, 0x74, 0x72, 0x65, 0x61, 0x6d, 0x76, 0x65, 0x73, 0x74, 0x69, 0x6e, 0x67, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1025,21 +2178,27 @@ func file_inference_streamvesting_tx_proto_rawDescGZIP() []byte { return file_inference_streamvesting_tx_proto_rawDescData } -var file_inference_streamvesting_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 2) +var file_inference_streamvesting_tx_proto_msgTypes = make([]protoimpl.MessageInfo, 4) var file_inference_streamvesting_tx_proto_goTypes = []interface{}{ - (*MsgUpdateParams)(nil), // 0: inference.streamvesting.MsgUpdateParams - (*MsgUpdateParamsResponse)(nil), // 1: inference.streamvesting.MsgUpdateParamsResponse - (*Params)(nil), // 2: inference.streamvesting.Params + (*MsgUpdateParams)(nil), // 0: inference.streamvesting.MsgUpdateParams + (*MsgUpdateParamsResponse)(nil), // 1: inference.streamvesting.MsgUpdateParamsResponse + (*MsgTransferWithVesting)(nil), // 2: inference.streamvesting.MsgTransferWithVesting + (*MsgTransferWithVestingResponse)(nil), // 3: inference.streamvesting.MsgTransferWithVestingResponse + (*Params)(nil), // 4: inference.streamvesting.Params + (*v1beta1.Coin)(nil), // 5: cosmos.base.v1beta1.Coin } var file_inference_streamvesting_tx_proto_depIdxs = []int32{ - 2, // 0: inference.streamvesting.MsgUpdateParams.params:type_name -> inference.streamvesting.Params - 0, // 1: inference.streamvesting.Msg.UpdateParams:input_type -> inference.streamvesting.MsgUpdateParams - 1, // 2: inference.streamvesting.Msg.UpdateParams:output_type -> inference.streamvesting.MsgUpdateParamsResponse - 2, // [2:3] is the sub-list for method output_type - 1, // [1:2] is the sub-list for method input_type - 1, // [1:1] is the sub-list for extension type_name - 1, // [1:1] is the sub-list for extension extendee - 0, // [0:1] is the sub-list for field type_name + 4, // 0: inference.streamvesting.MsgUpdateParams.params:type_name -> inference.streamvesting.Params + 5, // 1: inference.streamvesting.MsgTransferWithVesting.amount:type_name -> cosmos.base.v1beta1.Coin + 0, // 2: inference.streamvesting.Msg.UpdateParams:input_type -> inference.streamvesting.MsgUpdateParams + 2, // 3: inference.streamvesting.Msg.TransferWithVesting:input_type -> inference.streamvesting.MsgTransferWithVesting + 1, // 4: inference.streamvesting.Msg.UpdateParams:output_type -> inference.streamvesting.MsgUpdateParamsResponse + 3, // 5: inference.streamvesting.Msg.TransferWithVesting:output_type -> inference.streamvesting.MsgTransferWithVestingResponse + 4, // [4:6] is the sub-list for method output_type + 2, // [2:4] is the sub-list for method input_type + 2, // [2:2] is the sub-list for extension type_name + 2, // [2:2] is the sub-list for extension extendee + 0, // [0:2] is the sub-list for field type_name } func init() { file_inference_streamvesting_tx_proto_init() } @@ -1073,6 +2232,30 @@ func file_inference_streamvesting_tx_proto_init() { return nil } } + file_inference_streamvesting_tx_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgTransferWithVesting); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_inference_streamvesting_tx_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*MsgTransferWithVestingResponse); 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{ @@ -1080,7 +2263,7 @@ func file_inference_streamvesting_tx_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_inference_streamvesting_tx_proto_rawDesc, NumEnums: 0, - NumMessages: 2, + NumMessages: 4, NumExtensions: 0, NumServices: 1, }, diff --git a/inference-chain/api/inference/streamvesting/tx_grpc.pb.go b/inference-chain/api/inference/streamvesting/tx_grpc.pb.go index 1bb35ede2..1590e940a 100644 --- a/inference-chain/api/inference/streamvesting/tx_grpc.pb.go +++ b/inference-chain/api/inference/streamvesting/tx_grpc.pb.go @@ -19,7 +19,8 @@ import ( const _ = grpc.SupportPackageIsVersion7 const ( - Msg_UpdateParams_FullMethodName = "/inference.streamvesting.Msg/UpdateParams" + Msg_UpdateParams_FullMethodName = "/inference.streamvesting.Msg/UpdateParams" + Msg_TransferWithVesting_FullMethodName = "/inference.streamvesting.Msg/TransferWithVesting" ) // MsgClient is the client API for Msg service. @@ -29,6 +30,9 @@ type MsgClient interface { // UpdateParams defines a (governance) operation for updating the module // parameters. The authority defaults to the x/gov module account. UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) + // TransferWithVesting transfers tokens from sender to recipient with a vesting schedule. + // The tokens will vest over the specified number of epochs (default: 180). + TransferWithVesting(ctx context.Context, in *MsgTransferWithVesting, opts ...grpc.CallOption) (*MsgTransferWithVestingResponse, error) } type msgClient struct { @@ -48,6 +52,15 @@ func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts return out, nil } +func (c *msgClient) TransferWithVesting(ctx context.Context, in *MsgTransferWithVesting, opts ...grpc.CallOption) (*MsgTransferWithVestingResponse, error) { + out := new(MsgTransferWithVestingResponse) + err := c.cc.Invoke(ctx, Msg_TransferWithVesting_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 @@ -55,6 +68,9 @@ type MsgServer interface { // UpdateParams defines a (governance) operation for updating the module // parameters. The authority defaults to the x/gov module account. UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) + // TransferWithVesting transfers tokens from sender to recipient with a vesting schedule. + // The tokens will vest over the specified number of epochs (default: 180). + TransferWithVesting(context.Context, *MsgTransferWithVesting) (*MsgTransferWithVestingResponse, error) mustEmbedUnimplementedMsgServer() } @@ -65,6 +81,9 @@ type UnimplementedMsgServer struct { func (UnimplementedMsgServer) UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") } +func (UnimplementedMsgServer) TransferWithVesting(context.Context, *MsgTransferWithVesting) (*MsgTransferWithVestingResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TransferWithVesting not implemented") +} func (UnimplementedMsgServer) mustEmbedUnimplementedMsgServer() {} // UnsafeMsgServer may be embedded to opt out of forward compatibility for this service. @@ -96,6 +115,24 @@ func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _Msg_TransferWithVesting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgTransferWithVesting) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).TransferWithVesting(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: Msg_TransferWithVesting_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).TransferWithVesting(ctx, req.(*MsgTransferWithVesting)) + } + 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) @@ -107,6 +144,10 @@ var Msg_ServiceDesc = grpc.ServiceDesc{ MethodName: "UpdateParams", Handler: _Msg_UpdateParams_Handler, }, + { + MethodName: "TransferWithVesting", + Handler: _Msg_TransferWithVesting_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "inference/streamvesting/tx.proto", diff --git a/inference-chain/app/upgrades.go b/inference-chain/app/upgrades.go index 23eadb9c7..1e0eab059 100644 --- a/inference-chain/app/upgrades.go +++ b/inference-chain/app/upgrades.go @@ -12,6 +12,7 @@ import ( districutiontypes "github.com/cosmos/cosmos-sdk/x/distribution/types" slashingtypes "github.com/cosmos/cosmos-sdk/x/slashing/types" stakingtypes "github.com/cosmos/cosmos-sdk/x/staking/types" + "github.com/productscience/inference/app/upgrades/v0_2_10" v0_2_2 "github.com/productscience/inference/app/upgrades/v0_2_2" v0_2_3 "github.com/productscience/inference/app/upgrades/v0_2_3" "github.com/productscience/inference/app/upgrades/v0_2_4" @@ -59,6 +60,7 @@ func (app *App) setupUpgradeHandlers() { app.UpgradeKeeper.SetUpgradeHandler(v0_2_7.UpgradeName, v0_2_7.CreateUpgradeHandler(app.ModuleManager, app.Configurator(), app.InferenceKeeper, app.DistrKeeper)) app.UpgradeKeeper.SetUpgradeHandler(v0_2_8.UpgradeName, v0_2_8.CreateUpgradeHandler(app.ModuleManager, app.Configurator(), app.InferenceKeeper, app.BlsKeeper, app.DistrKeeper, app.AuthzKeeper)) app.UpgradeKeeper.SetUpgradeHandler(v0_2_9.UpgradeName, v0_2_9.CreateUpgradeHandler(app.ModuleManager, app.Configurator(), app.InferenceKeeper)) + app.UpgradeKeeper.SetUpgradeHandler(v0_2_10.UpgradeName, v0_2_10.CreateUpgradeHandler(app.ModuleManager, app.Configurator(), app.InferenceKeeper, app.DistrKeeper)) } func (app *App) registerMigrations() { diff --git a/inference-chain/app/upgrades/v0_2_10/constants.go b/inference-chain/app/upgrades/v0_2_10/constants.go new file mode 100644 index 000000000..646a0dd81 --- /dev/null +++ b/inference-chain/app/upgrades/v0_2_10/constants.go @@ -0,0 +1,3 @@ +package v0_2_10 + +const UpgradeName = "v0.2.10" diff --git a/inference-chain/app/upgrades/v0_2_10/upgrades.go b/inference-chain/app/upgrades/v0_2_10/upgrades.go new file mode 100644 index 000000000..3bd37e9d8 --- /dev/null +++ b/inference-chain/app/upgrades/v0_2_10/upgrades.go @@ -0,0 +1,363 @@ +package v0_2_10 + +import ( + "context" + + "cosmossdk.io/math" + upgradetypes "cosmossdk.io/x/upgrade/types" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/cosmos/cosmos-sdk/types/module" + distrkeeper "github.com/cosmos/cosmos-sdk/x/distribution/keeper" + "github.com/productscience/inference/x/inference/keeper" + "github.com/productscience/inference/x/inference/types" +) + +func Gonka(amount int64) int64 { + return amount * 1_000_000_000 +} + +type BountyReward struct { + Address string + Amount int64 +} + +var bountyRewards = []BountyReward{ + // Valid fix for minor vulnerability that was previously reported in issue #422 + // PR: https://github.com/gonka-ai/gonka/pull/661 + {Address: "gonka18enyz7h6hh5zjveee5wnhkhrcexamfz0zdxxqe", Amount: Gonka(500)}, + + // Planned task, not a vulnerability, important for the network. + // PR: https://github.com/gonka-ai/gonka/pull/644 + {Address: "gonka18enyz7h6hh5zjveee5wnhkhrcexamfz0zdxxqe", Amount: Gonka(700)}, + + // Detailed report and fix for a Medium risk vulnerability. + // PR: https://github.com/gonka-ai/gonka/pull/659 + {Address: "gonka1ejkupq3cy6p8xd64ew2wlzveml86ckpzn9dl56", Amount: Gonka(10000)}, + + // First report of the vulnerability fixed in #659 + {Address: "gonka1c34w3r45f0uftjckt2yy4k22vnc3zqjnp0umyz", Amount: Gonka(5000)}, + + // Report and fix of low risk vulnerability. Extra appreciation for discovering and + // reporting it during the review of another PR. + // PR: https://github.com/gonka-ai/gonka/pull/545 + {Address: "gonka18enyz7h6hh5zjveee5wnhkhrcexamfz0zdxxqe", Amount: Gonka(1000)}, + + // Valid minor bug fix. + // PR: https://github.com/gonka-ai/gonka/pull/640 + {Address: "gonka1jkydytz99gkh0t42gjj4lz0mmdeumqp7mtzke3", Amount: Gonka(100)}, + + // First report and suggested fix. Fixed in PR #661 + // Issue: https://github.com/gonka-ai/gonka/issues/422 + {Address: "gonka123khww9elhtj49zumz0daleaudl6jn9y87tf23", Amount: Gonka(500)}, + + // Valid minor bug fix. + // PR: https://github.com/gonka-ai/gonka/pull/638 + {Address: "gonka1jkydytz99gkh0t42gjj4lz0mmdeumqp7mtzke3", Amount: Gonka(100)}, + + // Valid minor bug fix. + // PR: https://github.com/gonka-ai/gonka/pull/634 + {Address: "gonka1jkydytz99gkh0t42gjj4lz0mmdeumqp7mtzke3", Amount: Gonka(100)}, + + // Independent report on the issue addressed by PR #710. + {Address: "gonka1f0elpwnx7ezytdlck35003nz6qk8kzvurvnj4a", Amount: Gonka(5000)}, + + // Report and fix of low risk vulnerability. + // PR: https://github.com/gonka-ai/gonka/pull/643 + {Address: "gonka18enyz7h6hh5zjveee5wnhkhrcexamfz0zdxxqe", Amount: Gonka(500)}, + + // Valid implementation of a planned task. + // PR: https://github.com/gonka-ai/gonka/pull/641 + {Address: "gonka1jkydytz99gkh0t42gjj4lz0mmdeumqp7mtzke3", Amount: Gonka(1500)}, + + // Valid minor vulnerability report and fix. + // PR: https://github.com/gonka-ai/gonka/pull/622 + {Address: "gonka1s8szs7n43jxgz4a4xaxmzm5emh7fmjxhach7w8", Amount: Gonka(700)}, + + // Valid implementation of a planned task with adjusting scope, important for the network. + // PR: https://github.com/gonka-ai/gonka/pull/688 + {Address: "gonka1s8szs7n43jxgz4a4xaxmzm5emh7fmjxhach7w8", Amount: Gonka(1500)}, + + // PR review of upgrade v.0.2.8. + {Address: "gonka12jaf7m4eysyqt32mrgarum6z96vt55tckvcleq", Amount: Gonka(2500)}, + + // PR review of upgrade v.0.2.8. + {Address: "gonka18enyz7h6hh5zjveee5wnhkhrcexamfz0zdxxqe", Amount: Gonka(2500)}, + + // PR review of upgrade v.0.2.8. + {Address: "gonka1f0elpwnx7ezytdlck35003nz6qk8kzvurvnj4a", Amount: Gonka(2500)}, + + // PR review of upgrade v.0.2.8. + {Address: "gonka1ejkupq3cy6p8xd64ew2wlzveml86ckpzn9dl56", Amount: Gonka(2500)}, + + // PR review of upgrade v.0.2.8. + {Address: "gonka1zqss46r6jf6dhhyaa777kc2ppvjhn0ufkx4y57", Amount: Gonka(2500)}, + + // PR review of upgrade v.0.2.9. + {Address: "gonka12jaf7m4eysyqt32mrgarum6z96vt55tckvcleq", Amount: Gonka(2500)}, + + // PR review of upgrade v.0.2.9. + {Address: "gonka18enyz7h6hh5zjveee5wnhkhrcexamfz0zdxxqe", Amount: Gonka(2500)}, +} + +func CreateUpgradeHandler( + mm *module.Manager, + configurator module.Configurator, + k keeper.Keeper, + distrKeeper distrkeeper.Keeper, +) upgradetypes.UpgradeHandler { + return func(ctx context.Context, plan upgradetypes.Plan, fromVM module.VersionMap) (module.VersionMap, error) { + k.Logger().Info("starting upgrade to " + UpgradeName) + + if _, ok := fromVM["capability"]; !ok { + fromVM["capability"] = mm.Modules["capability"].(module.HasConsensusVersion).ConsensusVersion() + } + + setValidationSlots(ctx, k) + setPocNormalizationEnabled(ctx, k) + setPocTimingParams(ctx, k) + updateQwenModel(ctx, k) + updateCurrentEpochModelSnapshot(ctx, k) + addPunishmentGraceEpoch(ctx, k) + + if err := distributeBountyRewards(ctx, k, distrKeeper); err != nil { + return nil, err + } + + toVM, err := mm.RunMigrations(ctx, configurator, fromVM) + if err != nil { + return toVM, err + } + + k.Logger().Info("successfully upgraded to " + UpgradeName) + return toVM, nil + } +} + +// setValidationSlots explicitly sets ValidationSlots to 0 (disabled). +// This keeps O(N^2) validation behavior until sampling is enabled via governance. +// Must be enabled only when new participant cost > 0 (see proposals/poc/optimize.md). +func setValidationSlots(ctx context.Context, k keeper.Keeper) { + params, err := k.GetParams(ctx) + if err != nil { + k.LogError("failed to get params during upgrade", types.Upgrades, "error", err) + return + } + + if params.PocParams == nil { + k.LogError("poc params not initialized", types.Upgrades) + return + } + + params.PocParams.ValidationSlots = 0 + + if err := k.SetParams(ctx, params); err != nil { + k.LogError("failed to set params with validation slots", types.Upgrades, "error", err) + return + } + + k.LogInfo("set validation slots", types.Upgrades, "validation_slots", params.PocParams.ValidationSlots) +} + +// setPocNormalizationEnabled explicitly enables time-based weight normalization for PoC. +func setPocNormalizationEnabled(ctx context.Context, k keeper.Keeper) { + params, err := k.GetParams(ctx) + if err != nil { + k.LogError("failed to get params during upgrade", types.Upgrades, "error", err) + return + } + + if params.PocParams == nil { + k.LogError("poc params not initialized", types.Upgrades) + return + } + + params.PocParams.PocNormalizationEnabled = true + + if err := k.SetParams(ctx, params); err != nil { + k.LogError("failed to set params with poc normalization enabled", types.Upgrades, "error", err) + return + } + + k.LogInfo("set poc normalization enabled", types.Upgrades, "poc_normalization_enabled", params.PocParams.PocNormalizationEnabled) +} + +// setPocTimingParams updates PoC timing parameters: +// - Reduces poc_stage_duration from 60 (with 48 effective blocks) to 35 blocks +// - Reduces poc_validation_duration from 480 to 240 blocks +// - Scales weight_scale_factor proportionally from 0.262 to 0.3593 to maintain same total weight +// - Sets poc_exchange_duration to 0 (deprecated, acceptance now ends at poc_generation_end) +func setPocTimingParams(ctx context.Context, k keeper.Keeper) { + params, err := k.GetParams(ctx) + if err != nil { + k.LogError("failed to get params during upgrade", types.Upgrades, "error", err) + return + } + + if params.EpochParams == nil { + k.LogError("epoch params not initialized", types.Upgrades) + return + } + if params.PocParams == nil { + k.LogError("poc params not initialized", types.Upgrades) + return + } + + // Update PoC timing: reduce from 60 (with 48 effective blocks) to 35 blocks + params.EpochParams.PocStageDuration = 35 + // Update validation duration: reduce from 480 to 240 blocks + params.EpochParams.PocValidationDuration = 240 + // Deprecated: set to 0, nonce acceptance now ends at poc_generation_end + params.EpochParams.PocExchangeDuration = 0 + // Scale weight factor proportionally: 0.262 * (48/35) ≈ 0.3593 + // Keeps total weight accumulation the same: 0.3593 * 35 ≈ 0.262 * 48 + params.PocParams.WeightScaleFactor = &types.Decimal{Value: 3593, Exponent: -4} + + if err := k.SetParams(ctx, params); err != nil { + k.LogError("failed to set poc timing params", types.Upgrades, "error", err) + return + } + + k.LogInfo("set poc timing params", types.Upgrades, + "poc_stage_duration", params.EpochParams.PocStageDuration, + "poc_validation_duration", params.EpochParams.PocValidationDuration, + "poc_exchange_duration", params.EpochParams.PocExchangeDuration, + "weight_scale_factor", 0.449) +} + +// updateQwenModel updates the Qwen model with tool calling arguments and increased threshold. +// Adds --enable-auto-tool-choice and --tool-call-parser hermes for tool calling support. +// Updates validation threshold from 0.970917 to 0.958. +func updateQwenModel(ctx context.Context, k keeper.Keeper) { + modelID := "Qwen/Qwen3-235B-A22B-Instruct-2507-FP8" + + model, found := k.GetGovernanceModel(ctx, modelID) + if !found { + k.LogError("model not found during upgrade", types.Upgrades, "model_id", modelID) + return + } + + // Add tool calling arguments + model.ModelArgs = []string{ + "--max-model-len", "240000", + "--enable-auto-tool-choice", + "--tool-call-parser", "hermes", + } + + // Update validation threshold from 0.970917 to 0.958 + model.ValidationThreshold = &types.Decimal{Value: 958, Exponent: -3} + + k.SetModel(ctx, model) + + k.LogInfo("updated model", types.Upgrades, + "model_id", modelID, + "model_args", model.ModelArgs, + "validation_threshold", 0.958) +} + +// updateCurrentEpochModelSnapshot updates the ModelSnapshot in the current epoch's EpochGroupData. +// This ensures API nodes get the new model args immediately without waiting for the next epoch. +// The governance model update (updateQwenModel) handles future epochs, while this function +// updates the already-frozen snapshot for the current epoch. +func updateCurrentEpochModelSnapshot(ctx context.Context, k keeper.Keeper) { + modelID := "Qwen/Qwen3-235B-A22B-Instruct-2507-FP8" + + // Get current epoch index + currentEpochIndex, found := k.GetEffectiveEpochIndex(ctx) + if !found { + k.LogError("no current epoch found during snapshot update", types.Upgrades) + return + } + + // Get the model subgroup's EpochGroupData + epochGroupData, found := k.GetEpochGroupData(ctx, currentEpochIndex, modelID) + if !found { + k.LogError("no epoch group data found for model", types.Upgrades, + "epoch_index", currentEpochIndex, + "model_id", modelID) + return + } + + // Update the ModelSnapshot with new args + if epochGroupData.ModelSnapshot == nil { + k.LogError("model snapshot is nil in epoch group data", types.Upgrades, + "epoch_index", currentEpochIndex, + "model_id", modelID) + return + } + + epochGroupData.ModelSnapshot.ModelArgs = []string{ + "--max-model-len", "240000", + "--enable-auto-tool-choice", + "--tool-call-parser", "hermes", + } + epochGroupData.ModelSnapshot.ValidationThreshold = &types.Decimal{Value: 958, Exponent: -3} + + // Save updated epoch group data + k.SetEpochGroupData(ctx, epochGroupData) + + k.LogInfo("updated model snapshot in current epoch", types.Upgrades, + "epoch_index", currentEpochIndex, + "model_id", modelID, + "model_args", epochGroupData.ModelSnapshot.ModelArgs, + "validation_threshold", 0.958) +} + +func addPunishmentGraceEpoch(ctx context.Context, k keeper.Keeper) { + epochIndex, found := k.GetEffectiveEpochIndex(ctx) + if !found { + k.LogError("no current epoch found", types.Upgrades) + return + } + + binomTestP0 := &types.Decimal{Value: 5, Exponent: -1} // 0.5 + if err := k.AddPunishmentGraceEpoch(ctx, epochIndex, binomTestP0, 3000); err != nil { + k.LogError("failed to add grace epoch", types.Upgrades, "error", err) + return + } + k.LogInfo("added grace epoch", types.Upgrades, "epoch", epochIndex) +} + +func distributeBountyRewards(ctx context.Context, k keeper.Keeper, distrKeeper distrkeeper.Keeper) error { + if len(bountyRewards) == 0 { + k.Logger().Info("No bounty rewards to distribute") + return nil + } + + var totalRequired int64 + for _, bounty := range bountyRewards { + totalRequired += bounty.Amount + } + + feePool, err := distrKeeper.FeePool.Get(ctx) + if err != nil { + k.Logger().Warn("failed to get fee pool, skipping bounty distribution", "error", err) + return nil + } + + available := feePool.CommunityPool.AmountOf(types.BaseCoin).TruncateInt64() + if available < totalRequired { + k.Logger().Warn("insufficient fee pool balance, skipping bounty distribution", + "required", totalRequired, "available", available) + return nil + } + + k.Logger().Info("fee pool balance sufficient", "required", totalRequired, "available", available) + + for _, bounty := range bountyRewards { + recipient, err := sdk.AccAddressFromBech32(bounty.Address) + if err != nil { + k.Logger().Error("invalid bounty address", "address", bounty.Address, "error", err) + continue + } + + coins := sdk.NewCoins(sdk.NewCoin(types.BaseCoin, math.NewInt(bounty.Amount))) + if err := distrKeeper.DistributeFromFeePool(ctx, coins, recipient); err != nil { + k.Logger().Error("failed to distribute bounty", "address", bounty.Address, "error", err) + continue + } + + k.Logger().Info("bounty distributed", "address", bounty.Address, "amount", bounty.Amount) + } + + return nil +} diff --git a/inference-chain/app/upgrades/v0_2_10/upgrades_test.go b/inference-chain/app/upgrades/v0_2_10/upgrades_test.go new file mode 100644 index 000000000..f460d1cbc --- /dev/null +++ b/inference-chain/app/upgrades/v0_2_10/upgrades_test.go @@ -0,0 +1,11 @@ +package v0_2_10 + +import ( + "testing" + + "github.com/stretchr/testify/require" +) + +func TestUpgradeName(t *testing.T) { + require.Equal(t, "v0.2.10", UpgradeName) +} diff --git a/inference-chain/go.mod b/inference-chain/go.mod index 903d813c7..fbb9969bb 100644 --- a/inference-chain/go.mod +++ b/inference-chain/go.mod @@ -12,7 +12,7 @@ replace ( require ( cosmossdk.io/api v0.9.2 - cosmossdk.io/client/v2 v2.0.0-beta.1 + cosmossdk.io/client/v2 v2.0.0-beta.3 cosmossdk.io/collections v1.2.1 cosmossdk.io/core v0.11.3 cosmossdk.io/depinject v1.2.1 @@ -36,7 +36,7 @@ require ( github.com/cosmos/cosmos-sdk v0.50.14 github.com/cosmos/gogoproto v1.7.0 github.com/cosmos/ibc-go/modules/capability v1.0.1 - github.com/cosmos/ibc-go/v8 v8.4.0 + github.com/cosmos/ibc-go/v8 v8.7.0 github.com/golang/protobuf v1.5.4 github.com/google/uuid v1.6.0 github.com/gorilla/mux v1.8.1 diff --git a/inference-chain/go.sum b/inference-chain/go.sum index d45328e77..b1887a970 100644 --- a/inference-chain/go.sum +++ b/inference-chain/go.sum @@ -234,8 +234,8 @@ connectrpc.com/otelconnect v0.8.0 h1:a4qrN4H8aEE2jAoCxheZYYfEjXMgVPyL9OzPQLBEFXU connectrpc.com/otelconnect v0.8.0/go.mod h1:AEkVLjCPXra+ObGFCOClcJkNjS7zPaQSqvO0lCyjfZc= cosmossdk.io/api v0.9.2 h1:9i9ptOBdmoIEVEVWLtYYHjxZonlF/aOVODLFaxpmNtg= cosmossdk.io/api v0.9.2/go.mod h1:CWt31nVohvoPMTlPv+mMNCtC0a7BqRdESjCsstHcTkU= -cosmossdk.io/client/v2 v2.0.0-beta.1 h1:XkHh1lhrLYIT9zKl7cIOXUXg2hdhtjTPBUfqERNA1/Q= -cosmossdk.io/client/v2 v2.0.0-beta.1/go.mod h1:JEUSu9moNZQ4kU3ir1DKD5eU4bllmAexrGWjmb9k8qU= +cosmossdk.io/client/v2 v2.0.0-beta.3 h1:+TTuH0DwQYsUq2JFAl3fDZzKq5gQG7nt3dAattkjFDU= +cosmossdk.io/client/v2 v2.0.0-beta.3/go.mod h1:CZcL41HpJPOOayTCO28j8weNBQprG+SRiKX39votypo= cosmossdk.io/collections v1.2.1 h1:mAlNMs5vJwkda4TA+k5q/43p24RVAQ/qyDrjANu3BXE= cosmossdk.io/collections v1.2.1/go.mod h1:PSsEJ/fqny0VPsHLFT6gXDj/2C1tBOTS9eByK0+PBFU= cosmossdk.io/core v0.11.3 h1:mei+MVDJOwIjIniaKelE3jPDqShCc/F4LkNNHh+4yfo= @@ -516,8 +516,8 @@ github.com/cosmos/iavl v1.2.4 h1:IHUrG8dkyueKEY72y92jajrizbkZKPZbMmG14QzsEkw= github.com/cosmos/iavl v1.2.4/go.mod h1:GiM43q0pB+uG53mLxLDzimxM9l/5N9UuSY3/D0huuVw= github.com/cosmos/ibc-go/modules/capability v1.0.1 h1:ibwhrpJ3SftEEZRxCRkH0fQZ9svjthrX2+oXdZvzgGI= github.com/cosmos/ibc-go/modules/capability v1.0.1/go.mod h1:rquyOV262nGJplkumH+/LeYs04P3eV8oB7ZM4Ygqk4E= -github.com/cosmos/ibc-go/v8 v8.4.0 h1:K2PfX0AZ+1XKZytHGEMuSjQXG/MZshPb83RSTQt2+cE= -github.com/cosmos/ibc-go/v8 v8.4.0/go.mod h1:zh6x1osR0hNvEcFrC/lhGD08sMfQmr9wHVvZ/mRWMCs= +github.com/cosmos/ibc-go/v8 v8.7.0 h1:HqhVOkO8bDpClXE81DFQgFjroQcTvtpm0tCS7SQVKVY= +github.com/cosmos/ibc-go/v8 v8.7.0/go.mod h1:G2z+Q6ZQSMcyHI2+BVcJdvfOupb09M2h/tgpXOEdY6k= github.com/cosmos/ics23/go v0.11.0 h1:jk5skjT0TqX5e5QJbEnwXIS2yI2vnmLOgpQPeM5RtnU= github.com/cosmos/ics23/go v0.11.0/go.mod h1:A8OjxPE67hHST4Icw94hOxxFEJMBG031xIGF/JHNIY0= github.com/cosmos/ledger-cosmos-go v0.14.0 h1:WfCHricT3rPbkPSVKRH+L4fQGKYHuGOK9Edpel8TYpE= diff --git a/inference-chain/proto/inference/inference/grace_epoch_params.proto b/inference-chain/proto/inference/inference/grace_epoch_params.proto new file mode 100644 index 000000000..cf2d5988e --- /dev/null +++ b/inference-chain/proto/inference/inference/grace_epoch_params.proto @@ -0,0 +1,14 @@ +syntax = "proto3"; + +package inference.inference; + +import "gogoproto/gogo.proto"; +import "inference/inference/params.proto"; + +option go_package = "github.com/productscience/inference/x/inference/types"; + +message GraceEpochParams { + uint64 epoch_index = 1; + Decimal binom_test_p0 = 2; + int64 upgrade_protection_window = 3; +} diff --git a/inference-chain/proto/inference/inference/params.proto b/inference-chain/proto/inference/inference/params.proto index caa4e7634..256e143d2 100644 --- a/inference-chain/proto/inference/inference/params.proto +++ b/inference-chain/proto/inference/inference/params.proto @@ -64,7 +64,7 @@ message EpochParams { int64 epoch_shift = 3; int64 default_unit_of_compute_price = 4; int64 poc_stage_duration = 5; - int64 poc_exchange_duration = 6; + int64 poc_exchange_duration = 6 [deprecated = true]; int64 poc_validation_delay = 7; int64 poc_validation_duration = 8; int64 set_new_validators_delay = 9; @@ -139,6 +139,8 @@ message PocParams { bool poc_v2_enabled = 8; // false = V1 (on-chain batches), true = V2 (off-chain commits). Default: true bool confirmation_poc_v2_enabled = 9; // Enables V2 for Confirmation PoC only. Migration mode: poc_v2_enabled=false + confirmation_poc_v2_enabled=true PoCStatTestParams stat_test = 10; // Statistical test parameters for V2 validation + uint32 validation_slots = 11; // Number of slots sampled per participant (0 = disabled) + bool poc_normalization_enabled = 12; // Enables time-based weight normalization for PoC } message Decimal { diff --git a/inference-chain/proto/inference/inference/poc_validation_snapshot.proto b/inference-chain/proto/inference/inference/poc_validation_snapshot.proto new file mode 100644 index 000000000..77c93fdb7 --- /dev/null +++ b/inference-chain/proto/inference/inference/poc_validation_snapshot.proto @@ -0,0 +1,20 @@ +syntax = "proto3"; +package inference.inference; + +option go_package = "github.com/productscience/inference/x/inference/types"; + +// PoCValidationSnapshot captures validator weights at validation phase start +// for deterministic sampling synchronization between chain and DAPI. +message PoCValidationSnapshot { + int64 poc_stage_start_height = 1; + int64 snapshot_height = 2; + string app_hash = 3; + repeated ValidatorWeight validator_weights = 4; + int64 generation_start_timestamp = 5; + int64 exchange_end_timestamp = 6; +} + +message ValidatorWeight { + string address = 1; + int64 weight = 2; +} diff --git a/inference-chain/proto/inference/inference/query.proto b/inference-chain/proto/inference/inference/query.proto index 6ce4cc48c..87cc7afad 100644 --- a/inference-chain/proto/inference/inference/query.proto +++ b/inference-chain/proto/inference/inference/query.proto @@ -35,6 +35,7 @@ import "inference/inference/confirmation_poc_event.proto"; import "inference/inference/liquidity_pool.proto"; import "inference/inference/poc_v2.proto"; import "inference/inference/random_seed.proto"; +import "inference/inference/poc_validation_snapshot.proto"; option go_package = "github.com/productscience/inference/x/inference/types"; @@ -479,6 +480,11 @@ service Query { option (google.api.http).get = "/productscience/inference/inference/participants_with_balances"; } + + // Queries PoC validation snapshot for deterministic sampling synchronization. + rpc PoCValidationSnapshot (QueryPoCValidationSnapshotRequest) returns (QueryPoCValidationSnapshotResponse) { + option (google.api.http).get = "/productscience/inference/inference/poc_validation_snapshot/{poc_stage_start_height}"; + } } // QueryParamsRequest is request type for the Query/Params RPC method. message QueryParamsRequest {} @@ -1258,3 +1264,12 @@ message QueryRandomSeedsRequest { message QueryRandomSeedsResponse { repeated RandomSeed seeds = 1; } + +message QueryPoCValidationSnapshotRequest { + int64 poc_stage_start_height = 1; +} + +message QueryPoCValidationSnapshotResponse { + PoCValidationSnapshot snapshot = 1; + bool found = 2; +} diff --git a/inference-chain/proto/inference/streamvesting/tx.proto b/inference-chain/proto/inference/streamvesting/tx.proto index 0016afdf4..3cb1939ff 100644 --- a/inference-chain/proto/inference/streamvesting/tx.proto +++ b/inference-chain/proto/inference/streamvesting/tx.proto @@ -5,6 +5,7 @@ import "amino/amino.proto"; import "cosmos/msg/v1/msg.proto"; import "cosmos_proto/cosmos.proto"; import "gogoproto/gogo.proto"; +import "cosmos/base/v1beta1/coin.proto"; import "inference/streamvesting/params.proto"; option go_package = "github.com/productscience/inference/x/streamvesting/types"; @@ -16,6 +17,10 @@ service Msg { // UpdateParams defines a (governance) operation for updating the module // parameters. The authority defaults to the x/gov module account. rpc UpdateParams(MsgUpdateParams) returns (MsgUpdateParamsResponse); + + // TransferWithVesting transfers tokens from sender to recipient with a vesting schedule. + // The tokens will vest over the specified number of epochs (default: 180). + rpc TransferWithVesting(MsgTransferWithVesting) returns (MsgTransferWithVestingResponse); } // MsgUpdateParams is the Msg/UpdateParams request type. @@ -37,4 +42,30 @@ message MsgUpdateParams { // MsgUpdateParamsResponse defines the response structure for executing a // MsgUpdateParams message. -message MsgUpdateParamsResponse {} \ No newline at end of file +message MsgUpdateParamsResponse {} + +// MsgTransferWithVesting is the request type for transferring tokens with vesting. +message MsgTransferWithVesting { + option (cosmos.msg.v1.signer) = "sender"; + option (amino.name) = "inference/x/streamvesting/MsgTransferWithVesting"; + + // sender is the address of the account sending the tokens. + string sender = 1 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // recipient is the address of the account receiving the vesting tokens. + string recipient = 2 [(cosmos_proto.scalar) = "cosmos.AddressString"]; + + // amount is the coins to transfer with vesting. + repeated cosmos.base.v1beta1.Coin amount = 3 [ + (gogoproto.nullable) = false, + (gogoproto.castrepeated) = "github.com/cosmos/cosmos-sdk/types.Coins", + (amino.dont_omitempty) = true + ]; + + // vesting_epochs is the number of epochs over which the tokens will vest. + // If not specified or 0, defaults to 180 epochs. + uint64 vesting_epochs = 4; +} + +// MsgTransferWithVestingResponse defines the response for MsgTransferWithVesting. +message MsgTransferWithVestingResponse {} \ No newline at end of file diff --git a/inference-chain/x/inference/calculations/should_validate.go b/inference-chain/x/inference/calculations/should_validate.go index 7d35fcbed..ff11f335d 100644 --- a/inference-chain/x/inference/calculations/should_validate.go +++ b/inference-chain/x/inference/calculations/should_validate.go @@ -20,6 +20,9 @@ func ShouldValidate( validationParams *types.ValidationParams, debug bool, ) (bool, string) { + if totalPower <= executorPower { + return false, "ShouldValidate:false totalPower <= executorPower" + } // Creating with exponent vs dividing executorReputation := decimal.New(int64(inferenceDetails.ExecutorReputation), -2) maxValidationAverage := validationParams.MaxValidationAverage.ToDecimal() diff --git a/inference-chain/x/inference/calculations/should_validate_test.go b/inference-chain/x/inference/calculations/should_validate_test.go index 6934cf5c3..460c885b3 100644 --- a/inference-chain/x/inference/calculations/should_validate_test.go +++ b/inference-chain/x/inference/calculations/should_validate_test.go @@ -228,6 +228,21 @@ func TestShouldValidate(t *testing.T) { } +func TestShouldValidate_DivisionByZeroGuard(t *testing.T) { + details := &types.InferenceValidationDetails{InferenceId: fixedInferenceId, TrafficBasis: defaultTrafficCutoff} + params := &types.ValidationParams{ + MinValidationAverage: types.DecimalFromFloat(0.1), MaxValidationAverage: types.DecimalFromFloat(1.0), + FullValidationTrafficCutoff: defaultTrafficCutoff, MinValidationTrafficCutoff: 100, + MinValidationHalfway: types.DecimalFromFloat(0.05), EpochsToMax: defaultEpochsToMax, + } + + result, _ := ShouldValidate(0, details, 100, 50, 100, params, false) + require.False(t, result) + + result, _ = ShouldValidate(0, details, 50, 25, 100, params, false) + require.False(t, result) +} + func TestShouldValidatePerformance(t *testing.T) { inferenceDetails := &types.InferenceValidationDetails{ InferenceId: fixedInferenceId, diff --git a/inference-chain/x/inference/calculations/slots.go b/inference-chain/x/inference/calculations/slots.go new file mode 100644 index 000000000..e5e626843 --- /dev/null +++ b/inference-chain/x/inference/calculations/slots.go @@ -0,0 +1,108 @@ +package calculations + +import ( + "cmp" + "crypto/sha256" + "encoding/binary" + "fmt" + "slices" +) + +type WeightEntry struct { + Address string + Weight int64 +} + +type slotRandom struct { + randomVal int64 + origIdx int +} + +// PrepareSortedEntries filters and sorts weights, returns sorted entries and total weight. +// Returns nil, 0 if weights is empty or all weights are non-positive. +func PrepareSortedEntries(weights map[string]int64) ([]WeightEntry, int64) { + if len(weights) == 0 { + return nil, 0 + } + + keys := make([]string, 0, len(weights)) + for addr := range weights { + keys = append(keys, addr) + } + slices.Sort(keys) + + sortedEntries := make([]WeightEntry, 0, len(keys)) + var totalWeight int64 + for _, addr := range keys { + w := weights[addr] + if w <= 0 { + continue + } + sortedEntries = append(sortedEntries, WeightEntry{addr, w}) + totalWeight += w + } + + if totalWeight == 0 || len(sortedEntries) == 0 { + return nil, 0 + } + + return sortedEntries, totalWeight +} + +// GetSlotsFromSorted uses pre-sorted entries to avoid sorting per call. +func GetSlotsFromSorted(appHash, participantAddress string, sortedEntries []WeightEntry, totalWeight int64, nSlots int) []string { + if nSlots == 0 || totalWeight <= 0 { + return nil + } + + randoms := make([]slotRandom, nSlots) + for i := 0; i < nSlots; i++ { + randoms[i] = slotRandom{ + randomVal: slotRandomVal(appHash, participantAddress, i, totalWeight), + origIdx: i, + } + } + slices.SortFunc(randoms, func(a, b slotRandom) int { + return cmp.Compare(a.randomVal, b.randomVal) + }) + + result := make([]string, nSlots) + cumulative := int64(0) + randIdx := 0 + + for _, entry := range sortedEntries { + cumulative += entry.Weight + for randIdx < len(randoms) && randoms[randIdx].randomVal < cumulative { + result[randoms[randIdx].origIdx] = entry.Address + randIdx++ + } + } + + return result +} + +// GetSlotFromSorted returns a single slot by index using pre-sorted entries. +func GetSlotFromSorted(appHash, participantAddress string, sortedEntries []WeightEntry, totalWeight int64, slotIdx int) string { + if len(sortedEntries) == 0 || totalWeight <= 0 { + return "" + } + + randomVal := slotRandomVal(appHash, participantAddress, slotIdx, totalWeight) + + cumulative := int64(0) + for _, entry := range sortedEntries { + cumulative += entry.Weight + if randomVal < cumulative { + return entry.Address + } + } + + return sortedEntries[len(sortedEntries)-1].Address +} + +func slotRandomVal(appHash, participantAddress string, slotIdx int, totalWeight int64) int64 { + seedData := fmt.Sprintf("%s%s%d", appHash, participantAddress, slotIdx) + hash := sha256.Sum256([]byte(seedData)) + // Use uint64 for modulo to avoid negative values + return int64(binary.BigEndian.Uint64(hash[:8]) % uint64(totalWeight)) +} diff --git a/inference-chain/x/inference/calculations/slots_test.go b/inference-chain/x/inference/calculations/slots_test.go new file mode 100644 index 000000000..bbdbfbbef --- /dev/null +++ b/inference-chain/x/inference/calculations/slots_test.go @@ -0,0 +1,383 @@ +package calculations + +import ( + "fmt" + "testing" + + "github.com/stretchr/testify/require" +) + +func TestGetSlots_Determinism(t *testing.T) { + weights := map[string]int64{ + "node1": 100, + "node2": 200, + "node3": 300, + } + appHash := "1234567890" + participant := "gonka100" + nSlots := 64 + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots1 := GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + slots2 := GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + + require.Equal(t, slots1, slots2, "same inputs should produce same outputs") +} + +func TestGetSlots_WeightDistribution(t *testing.T) { + weights := map[string]int64{ + "node1": 100, + "node2": 200, + "node3": 300, + } + appHash := "testhash" + participant := "participant1" + nSlots := 1000 + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots := GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + + counts := make(map[string]int) + for _, slot := range slots { + counts[slot]++ + } + + // With weights 100:200:300, expected ratios are ~1:2:3 + // Allow 15% tolerance for statistical variance + total := float64(nSlots) + require.InDelta(t, 100.0/600.0, float64(counts["node1"])/total, 0.15) + require.InDelta(t, 200.0/600.0, float64(counts["node2"])/total, 0.15) + require.InDelta(t, 300.0/600.0, float64(counts["node3"])/total, 0.15) +} + +func TestGetSlots_EmptyWeights(t *testing.T) { + sortedEntries, totalWeight := PrepareSortedEntries(nil) + require.Nil(t, sortedEntries) + require.Equal(t, int64(0), totalWeight) + + sortedEntries, totalWeight = PrepareSortedEntries(map[string]int64{}) + require.Nil(t, sortedEntries) + require.Equal(t, int64(0), totalWeight) +} + +func TestGetSlots_ZeroSlots(t *testing.T) { + weights := map[string]int64{"node1": 100} + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots := GetSlotsFromSorted("hash", "participant", sortedEntries, totalWeight, 0) + require.Nil(t, slots) +} + +func TestGetSlots_ZeroTotalWeight(t *testing.T) { + weights := map[string]int64{ + "node1": 0, + "node2": 0, + } + sortedEntries, totalWeight := PrepareSortedEntries(weights) + require.Nil(t, sortedEntries) + require.Equal(t, int64(0), totalWeight) +} + +func TestGetSlot_SingleSlot(t *testing.T) { + weights := map[string]int64{ + "node1": 100, + "node2": 200, + "node3": 300, + } + appHash := "1234567890" + participant := "gonka100" + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slot := GetSlotFromSorted(appHash, participant, sortedEntries, totalWeight, 0) + require.NotEmpty(t, slot) + require.Contains(t, []string{"node1", "node2", "node3"}, slot) +} + +func TestGetSlot_MatchesGetSlots(t *testing.T) { + weights := map[string]int64{ + "node1": 100, + "node2": 200, + "node3": 300, + } + appHash := "testhash" + participant := "participant1" + nSlots := 10 + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots := GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + + for i := 0; i < nSlots; i++ { + singleSlot := GetSlotFromSorted(appHash, participant, sortedEntries, totalWeight, i) + require.Equal(t, slots[i], singleSlot, "GetSlotFromSorted should match GetSlotsFromSorted at index %d", i) + } +} + +func TestGetSlots_DifferentParticipants(t *testing.T) { + weights := map[string]int64{ + "node1": 100, + "node2": 200, + "node3": 300, + } + appHash := "hash" + nSlots := 64 + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots1 := GetSlotsFromSorted(appHash, "participant1", sortedEntries, totalWeight, nSlots) + slots2 := GetSlotsFromSorted(appHash, "participant2", sortedEntries, totalWeight, nSlots) + + require.NotEqual(t, slots1, slots2, "different participants should have different slots") +} + +func TestGetSlots_SingleValidator(t *testing.T) { + weights := map[string]int64{ + "only_node": 1000, + } + appHash := "hash" + participant := "participant" + nSlots := 10 + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots := GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + + for _, slot := range slots { + require.Equal(t, "only_node", slot) + } +} + +func TestGetSlots_NegativeWeightsSkipped(t *testing.T) { + weights := map[string]int64{ + "node1": 100, + "node2": -50, // Should be skipped + "node3": 200, + } + appHash := "hash" + participant := "participant" + nSlots := 100 + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots := GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + require.NotNil(t, slots) + require.Len(t, slots, nSlots) + + // Verify node2 never appears + for _, slot := range slots { + require.NotEqual(t, "node2", slot, "negative weight validator should not appear") + require.Contains(t, []string{"node1", "node3"}, slot) + } +} + +func TestGetSlots_MixedWeights(t *testing.T) { + weights := map[string]int64{ + "valid1": 100, + "negative": -100, + "zero": 0, + "valid2": 200, + } + appHash := "hash" + participant := "participant" + nSlots := 100 + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots := GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + require.NotNil(t, slots) + + counts := make(map[string]int) + for _, slot := range slots { + counts[slot]++ + } + + // Only valid1 and valid2 should appear + require.Equal(t, 0, counts["negative"]) + require.Equal(t, 0, counts["zero"]) + require.Greater(t, counts["valid1"], 0) + require.Greater(t, counts["valid2"], 0) +} + +func TestGetSlots_AllNegativeOrZeroWeights(t *testing.T) { + weights := map[string]int64{ + "node1": -100, + "node2": 0, + "node3": -50, + } + sortedEntries, totalWeight := PrepareSortedEntries(weights) + require.Nil(t, sortedEntries) + require.Equal(t, int64(0), totalWeight) +} + +func TestGetSlots_MoreSlotsThanValidators(t *testing.T) { + weights := map[string]int64{ + "node1": 100, + "node2": 200, + } + appHash := "hash" + participant := "participant" + nSlots := 1000 // Many more slots than validators + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots := GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + require.Len(t, slots, nSlots) + + // Algorithm is deterministic - assert exact counts + counts := make(map[string]int) + for _, slot := range slots { + counts[slot]++ + } + require.Equal(t, 362, counts["node1"], "node1 count must be exact (deterministic)") + require.Equal(t, 638, counts["node2"], "node2 count must be exact (deterministic)") +} + +func TestGetSlots_LargeWeightDisparity(t *testing.T) { + weights := map[string]int64{ + "whale": 9900, + "small": 100, + } + appHash := "hash" + participant := "participant" + nSlots := 1000 + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots := GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + + // Algorithm is deterministic - assert exact counts + counts := make(map[string]int) + for _, slot := range slots { + counts[slot]++ + } + require.Equal(t, 988, counts["whale"], "whale count must be exact (deterministic)") + require.Equal(t, 12, counts["small"], "small count must be exact (deterministic)") +} + +func TestGetSlots_DifferentAppHash(t *testing.T) { + weights := map[string]int64{ + "node1": 100, + "node2": 200, + "node3": 300, + } + participant := "participant" + nSlots := 64 + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots1 := GetSlotsFromSorted("appHash1", participant, sortedEntries, totalWeight, nSlots) + slots2 := GetSlotsFromSorted("appHash2", participant, sortedEntries, totalWeight, nSlots) + + require.NotEqual(t, slots1, slots2, "different appHash should produce different slots") +} + +func TestGetSlot_NegativeWeightsSkipped(t *testing.T) { + weights := map[string]int64{ + "node1": 100, + "node2": -50, + "node3": 200, + } + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + // Run multiple slot indices to verify negative weight is never selected + for i := 0; i < 100; i++ { + slot := GetSlotFromSorted("hash", "participant", sortedEntries, totalWeight, i) + require.NotEqual(t, "node2", slot, "negative weight validator should not be returned") + } +} + +func TestGetSlot_AllNegativeOrZeroWeights(t *testing.T) { + weights := map[string]int64{ + "node1": -100, + "node2": 0, + } + sortedEntries, totalWeight := PrepareSortedEntries(weights) + require.Nil(t, sortedEntries) + require.Equal(t, int64(0), totalWeight) + slot := GetSlotFromSorted("hash", "participant", nil, 0, 0) + require.Empty(t, slot) +} + +func TestGetSlots_LargeNSlots(t *testing.T) { + weights := map[string]int64{ + "node1": 100, + "node2": 200, + "node3": 300, + } + appHash := "hash" + participant := "participant" + nSlots := 10000 + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots := GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + require.Len(t, slots, nSlots) + + // Verify distribution is still proportional + counts := make(map[string]int) + for _, slot := range slots { + counts[slot]++ + } + total := float64(nSlots) + require.InDelta(t, 100.0/600.0, float64(counts["node1"])/total, 0.05) + require.InDelta(t, 200.0/600.0, float64(counts["node2"])/total, 0.05) + require.InDelta(t, 300.0/600.0, float64(counts["node3"])/total, 0.05) +} + +func TestGetSlots_OrderIndependentOfMapIteration(t *testing.T) { + // Test that results are deterministic regardless of Go's map iteration order + // by creating the same weights map multiple times and verifying same results + appHash := "hash" + participant := "participant" + nSlots := 64 + + var firstResult []string + for iteration := 0; iteration < 10; iteration++ { + // Create fresh map each time (Go may use different iteration order) + weights := map[string]int64{ + "zebra": 100, + "alpha": 200, + "middle": 300, + "beta": 150, + "zulu": 250, + } + sortedEntries, totalWeight := PrepareSortedEntries(weights) + slots := GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + + if firstResult == nil { + firstResult = slots + } else { + require.Equal(t, firstResult, slots, "results should be deterministic across map iterations") + } + } +} + + +func BenchmarkGetSlots_Current(b *testing.B) { + weights := make(map[string]int64, 100) + for i := 0; i < 100; i++ { + weights[fmt.Sprintf("validator%d", i)] = int64(100 + i*10) + } + appHash := "benchmarkhash" + nSlots := 128 + nParticipants := 1000 + + b.ResetTimer() + for i := 0; i < b.N; i++ { + for j := 0; j < nParticipants; j++ { + participant := fmt.Sprintf("participant%d", j) + sortedEntries, totalWeight := PrepareSortedEntries(weights) + _ = GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + } + } +} + +func BenchmarkGetSlots_Optimized(b *testing.B) { + weights := make(map[string]int64, 100) + for i := 0; i < 100; i++ { + weights[fmt.Sprintf("validator%d", i)] = int64(100 + i*10) + } + appHash := "benchmarkhash" + nSlots := 128 + nParticipants := 1000 + + sortedEntries, totalWeight := PrepareSortedEntries(weights) + + b.ResetTimer() + for i := 0; i < b.N; i++ { + for j := 0; j < nParticipants; j++ { + participant := fmt.Sprintf("participant%d", j) + _ = GetSlotsFromSorted(appHash, participant, sortedEntries, totalWeight, nSlots) + } + } +} diff --git a/inference-chain/x/inference/calculations/stats_table.go b/inference-chain/x/inference/calculations/stats_table.go index 5d1803e0d..5a93b8eb4 100644 --- a/inference-chain/x/inference/calculations/stats_table.go +++ b/inference-chain/x/inference/calculations/stats_table.go @@ -128,15 +128,15 @@ var criticalValueTableP005 = []Threshold{ } var criticalValueTableP010 = []Threshold{ - {2, 0}, - {3, 1}, - {4, 1}, - {5, 1}, - {6, 1}, - {7, 2}, - {8, 2}, - {9, 2}, - {10, 2}, + {2, 2}, + {3, 3}, + {4, 4}, + {5, 4}, + {6, 4}, + {7, 4}, + {8, 4}, + {9, 4}, + {10, 4}, {20, 4}, {30, 5}, {40, 7}, diff --git a/inference-chain/x/inference/calculations/stats_table_test.go b/inference-chain/x/inference/calculations/stats_table_test.go index ade741a0f..9a7b5b4e6 100644 --- a/inference-chain/x/inference/calculations/stats_table_test.go +++ b/inference-chain/x/inference/calculations/stats_table_test.go @@ -68,7 +68,7 @@ func TestMissedStatTestLookupWithP0ErrorConditions(t *testing.T) { func TestMissedStatTestLookupWithP0_P010(t *testing.T) { // Table values for p0=0.10, alpha=0.05: - // n=10: critical=2, n=20: critical=4, n=100: critical=14, n=500: critical=61 + // n<5: no penalty, n=10: critical=4, n=20: critical=4, n=100: critical=14, n=500: critical=61 tests := []struct { name string nMissed int @@ -84,16 +84,16 @@ func TestMissedStatTestLookupWithP0_P010(t *testing.T) { expected: true, // 1 <= 2 (critical value) }, { - name: "n=10, 2 missed (boundary - passes)", - nMissed: 2, + name: "n=10, 4 missed (boundary - passes)", + nMissed: 4, nTotal: 10, - expected: true, // 2 <= 2 (critical value) + expected: true, // 4 <= 4 (critical value) }, { - name: "n=10, 3 missed (exceeds)", - nMissed: 3, + name: "n=10, 5 missed (exceeds)", + nMissed: 5, nTotal: 10, - expected: false, // 3 > 2 (critical value) + expected: false, // 4 > 4 (critical value) }, { name: "n=20, 3 missed (passes)", @@ -184,10 +184,10 @@ func TestMissedStatTestLookupWithP0_P010(t *testing.T) { expected: true, // Uses critical value for 10 (2), 2 <= 2 }, { - name: "n=15, 3 missed (exceeds)", - nMissed: 3, + name: "n=15, 5 missed (exceeds)", + nMissed: 5, nTotal: 15, - expected: false, // Uses critical value for 10 (2), 3 > 2 + expected: false, // Uses critical value for 10 (4), 5 > 4 }, { name: "n=75, 10 missed (uses n=70's critical value)", @@ -240,10 +240,10 @@ func TestMissedStatTestLookupWithP0_P010(t *testing.T) { expected: true, // Critical value for n=5 is 1 }, { - name: "small total n=5, 2 missed (exceeds)", - nMissed: 2, + name: "small total n=5, 5 missed (exceeds)", + nMissed: 5, nTotal: 5, - expected: false, // 2 > 1 (critical value for n=5) + expected: false, // 5 > 4 (critical value for n=5) }, { name: "very small total n=1, 0 missed", @@ -255,7 +255,25 @@ func TestMissedStatTestLookupWithP0_P010(t *testing.T) { name: "very small total n=1, 1 missed (100% miss rate passes - no statistical power at n=1)", nMissed: 1, nTotal: 1, - expected: true, // idx=0 from binary search, returns true unconditionally + expected: true, + }, + { + name: "very small total n=2, 2 missed (no penalty)", + nMissed: 2, + nTotal: 2, + expected: true, + }, + { + name: "very small total n=3, 3 missed (no penalty)", + nMissed: 3, + nTotal: 3, + expected: true, + }, + { + name: "very small total n=4, 4 missed (no penalty)", + nMissed: 4, + nTotal: 4, + expected: true, }, } diff --git a/inference-chain/x/inference/epochgroup/epoch_group.go b/inference-chain/x/inference/epochgroup/epoch_group.go index 4e5518f14..f25e02b94 100644 --- a/inference-chain/x/inference/epochgroup/epoch_group.go +++ b/inference-chain/x/inference/epochgroup/epoch_group.go @@ -34,10 +34,10 @@ func NewEpochMemberFromActiveParticipant(p *types.ActiveParticipant, reputation seedSignature = p.Seed.Signature } - // If confirmation weight is not provided (0), initialize it from inference-serving nodes (POC_SLOT=false) + // If the confirmation weight is not provided (0), initialize it with the weight of PoC participating nodes // This is the baseline weight that can be verified through confirmation PoC if confirmationWeight == 0 { - confirmationWeight = calculateInferenceServingWeight(p.MlNodes) + confirmationWeight = calculatePocParticipatingNodesWeight(p.MlNodes) } return EpochMember{ @@ -52,8 +52,8 @@ func NewEpochMemberFromActiveParticipant(p *types.ActiveParticipant, reputation } } -// calculateInferenceServingWeight calculates the total weight of nodes serving inference (POC_SLOT=false) -func calculateInferenceServingWeight(mlNodes []*types.ModelMLNodes) int64 { +// calculatePocParticipatingNodesWeight calculates the total weight of nodes participating in PoC +func calculatePocParticipatingNodesWeight(mlNodes []*types.ModelMLNodes) int64 { totalWeight := int64(0) for _, modelNodes := range mlNodes { diff --git a/inference-chain/x/inference/epochgroup/epoch_group_test.go b/inference-chain/x/inference/epochgroup/epoch_group_test.go index defc19486..4c554ef5d 100644 --- a/inference-chain/x/inference/epochgroup/epoch_group_test.go +++ b/inference-chain/x/inference/epochgroup/epoch_group_test.go @@ -64,15 +64,14 @@ func (m *mockGroupKeeper) ProposalsByGroupPolicy(ctx context.Context, req *group return nil, nil } -func TestCalculateInferenceServingWeight_POCSlotTrue(t *testing.T) { - // Nodes with POC_SLOT=true (index 1 = true) should be EXCLUDED +func TestCalculatePocParticipatingNodesWeight_AllServeInference(t *testing.T) { mlNodes := []*types.ModelMLNodes{ { MlNodes: []*types.MLNodeInfo{ { NodeId: "node1", PocWeight: 100, - TimeslotAllocation: []bool{true, true}, // POC_SLOT=true (continues inference) + TimeslotAllocation: []bool{true, true}, // POC_SLOT=true (serves inference) }, { NodeId: "node2", @@ -83,39 +82,38 @@ func TestCalculateInferenceServingWeight_POCSlotTrue(t *testing.T) { }, } - weight := calculateInferenceServingWeight(mlNodes) + weight := calculatePocParticipatingNodesWeight(mlNodes) // Should be 0 since all nodes have POC_SLOT=true require.Equal(t, int64(0), weight) } -func TestCalculateInferenceServingWeight_POCSlotFalse(t *testing.T) { - // Nodes with POC_SLOT=false (index 1 = false) should be INCLUDED +func TestCalculatePocParticipatingNodesWeight_NoneServeInference(t *testing.T) { mlNodes := []*types.ModelMLNodes{ { MlNodes: []*types.MLNodeInfo{ { NodeId: "node1", PocWeight: 100, - TimeslotAllocation: []bool{true, false}, // POC_SLOT=false (serves inference) + TimeslotAllocation: []bool{true, false}, }, { NodeId: "node2", PocWeight: 200, - TimeslotAllocation: []bool{false, false}, // POC_SLOT=false + TimeslotAllocation: []bool{false, false}, }, }, }, } - weight := calculateInferenceServingWeight(mlNodes) + weight := calculatePocParticipatingNodesWeight(mlNodes) - // Should be sum of all weights since all have POC_SLOT=false + // Should be sum of all weights since all have POC_SLOT=false, + // meaning no nodes serve inference during PoC require.Equal(t, int64(300), weight) } -func TestCalculateInferenceServingWeight_Mixed(t *testing.T) { - // Mixed nodes - some with POC_SLOT=true, some with POC_SLOT=false +func TestCalculatePocParticipatingNodesWeight_Mixed(t *testing.T) { mlNodes := []*types.ModelMLNodes{ { MlNodes: []*types.MLNodeInfo{ @@ -143,13 +141,13 @@ func TestCalculateInferenceServingWeight_Mixed(t *testing.T) { }, } - weight := calculateInferenceServingWeight(mlNodes) + weight := calculatePocParticipatingNodesWeight(mlNodes) // Should be 100 + 300 = 400 (only POC_SLOT=false nodes) require.Equal(t, int64(400), weight) } -func TestCalculateInferenceServingWeight_EmptySlots(t *testing.T) { +func TestCalculatePocParticipatingNodesWeight_EmptySlots(t *testing.T) { // Nodes with empty or short TimeslotAllocation arrays mlNodes := []*types.ModelMLNodes{ { @@ -173,13 +171,13 @@ func TestCalculateInferenceServingWeight_EmptySlots(t *testing.T) { }, } - weight := calculateInferenceServingWeight(mlNodes) + weight := calculatePocParticipatingNodesWeight(mlNodes) // Should be 300 (only node3 has valid POC_SLOT at index 1) require.Equal(t, int64(300), weight) } -func TestCalculateInferenceServingWeight_NilNodes(t *testing.T) { +func TestCalculatePocParticipatingNodesWeight_NilNodes(t *testing.T) { // Test handling of nil nodes mlNodes := []*types.ModelMLNodes{ nil, // Nil model nodes @@ -195,13 +193,26 @@ func TestCalculateInferenceServingWeight_NilNodes(t *testing.T) { }, } - weight := calculateInferenceServingWeight(mlNodes) + weight := calculatePocParticipatingNodesWeight(mlNodes) // Should handle nils gracefully and count only valid node require.Equal(t, int64(100), weight) } -func TestCalculateInferenceServingWeight_MultipleModelArrays(t *testing.T) { +func TestSanitizeMembers_FiltersNilMembers(t *testing.T) { + members := []*group.GroupMember{ + nil, + {Member: nil}, + {Member: &group.Member{Address: "addr1", Weight: "1"}}, + } + + filtered := sanitizeMembers(members) + + require.Len(t, filtered, 1) + require.Equal(t, "addr1", filtered[0].Member.Address) +} + +func TestCalculatePocParticipatingNodesWeight_MultipleModelArrays(t *testing.T) { // Multiple model arrays (though typically there's only one) mlNodes := []*types.ModelMLNodes{ { @@ -224,7 +235,7 @@ func TestCalculateInferenceServingWeight_MultipleModelArrays(t *testing.T) { }, } - weight := calculateInferenceServingWeight(mlNodes) + weight := calculatePocParticipatingNodesWeight(mlNodes) // Should sum across all model arrays require.Equal(t, int64(300), weight) diff --git a/inference-chain/x/inference/epochgroup/random.go b/inference-chain/x/inference/epochgroup/random.go index 4da699760..6466675b7 100644 --- a/inference-chain/x/inference/epochgroup/random.go +++ b/inference-chain/x/inference/epochgroup/random.go @@ -43,6 +43,7 @@ func (eg *EpochGroup) GetRandomMember( if err != nil { return nil, status.Error(codes.Internal, err.Error()) } + activeParticipants = sanitizeMembers(activeParticipants) if len(activeParticipants) == 0 { return nil, status.Error(codes.Internal, "Active participants found, but length is 0") } @@ -87,9 +88,26 @@ func computeCumulativeArray(participants []*group.GroupMember) []int64 { } func getWeight(participant *group.GroupMember) int64 { + if participant == nil || participant.Member == nil { + return 0 + } weight, err := strconv.Atoi(participant.Member.Weight) if err != nil { return 0 } return int64(weight) } + +func sanitizeMembers(members []*group.GroupMember) []*group.GroupMember { + if len(members) == 0 { + return members + } + filtered := make([]*group.GroupMember, 0, len(members)) + for _, member := range members { + if member == nil || member.Member == nil { + continue + } + filtered = append(filtered, member) + } + return filtered +} diff --git a/inference-chain/x/inference/keeper/accountsettle.go b/inference-chain/x/inference/keeper/accountsettle.go index a518913da..16a6b0fd9 100644 --- a/inference-chain/x/inference/keeper/accountsettle.go +++ b/inference-chain/x/inference/keeper/accountsettle.go @@ -147,8 +147,22 @@ func (k *Keeper) SettleAccounts(ctx context.Context, currentEpochIndex uint64, p // Aggregate MLNodes from model-specific subgroups for preservedWeight calculation participantMLNodes := k.AggregateMLNodesFromModelSubgroups(ctx, currentEpochIndex, data.ValidationWeights) + // Check if this is a grace epoch and override BinomTestP0 if so + validationParams := params.ValidationParams + if validationParams == nil { + validationParams = types.DefaultValidationParams() + k.LogWarn("ValidationParams not found, using default ones", types.Settle) + } + + if graceParams, ok := k.GetPunishmentGraceEpoch(ctx, currentEpochIndex); ok && graceParams.BinomTestP0 != nil { + graceValidationParams := *validationParams + graceValidationParams.BinomTestP0 = graceParams.BinomTestP0 + validationParams = &graceValidationParams + k.LogInfo("using grace BinomTestP0", types.Settle, "epoch", currentEpochIndex) + } + var bitcoinResult BitcoinResult - amounts, bitcoinResult, err = GetBitcoinSettleAmounts(allParticipants, &data, params.BitcoinRewardParams, params.ValidationParams, settleParameters, participantMLNodes, k.Logger()) + amounts, bitcoinResult, err = GetBitcoinSettleAmounts(allParticipants, &data, params.BitcoinRewardParams, validationParams, settleParameters, participantMLNodes, k.Logger()) if err != nil { k.LogError("Error getting Bitcoin settle amounts", types.Settle, "error", err) } diff --git a/inference-chain/x/inference/keeper/accountsettle_test.go b/inference-chain/x/inference/keeper/accountsettle_test.go index 85875ed66..96332e59d 100644 --- a/inference-chain/x/inference/keeper/accountsettle_test.go +++ b/inference-chain/x/inference/keeper/accountsettle_test.go @@ -262,3 +262,139 @@ func TestActualSettleWithManyParticipants(t *testing.T) { logger.Info("TestActualSettleWithManyParticipants completed successfully", "totalParticipants", many, "totalReward", expectedRewardCoin) } + +// TestSettleWithGraceEpoch verifies that grace epoch relaxes downtime punishment. +// Without grace epoch: participant with 50% miss rate would be punished (reward = 0). +// With grace epoch (BinomTestP0 = 0.5): participant with 50% miss rate is NOT punished. +func TestSettleWithGraceEpoch(t *testing.T) { + logger := createTestLogger(t) + logger.Info("Starting TestSettleWithGraceEpoch") + + keeper, ctx, mocks := keeper2.InferenceKeeperReturningMocks(t) + + epochIndex := uint64(10) + + // Create participant with high miss rate (50% missed) + participantHighMiss := types.Participant{ + Index: testutil.Executor, + Address: testutil.Executor, + CoinBalance: 1000, + Status: types.ParticipantStatus_ACTIVE, + CurrentEpochStats: &types.CurrentEpochStats{ + InferenceCount: 50, // 50 successful + MissedRequests: 50, // 50 missed = 50% miss rate + }, + } + + keeper.SetParticipant(ctx, participantHighMiss) + keeper.SetEpochGroupData(ctx, types.EpochGroupData{ + EpochIndex: epochIndex, + ValidationWeights: []*types.ValidationWeight{ + { + MemberAddress: participantHighMiss.Address, + Weight: 1000, + Reputation: 100, + ConfirmationWeight: 1000, + }, + }, + }) + keeper.SetActiveParticipants(ctx, types.ActiveParticipants{ + EpochId: epochIndex, + Participants: []*types.ActiveParticipant{ + {Index: participantHighMiss.Address}, + }, + }) + + // Add grace epoch with relaxed BinomTestP0 = 0.5 (allows 50% miss rate) + binomTestP0 := &types.Decimal{Value: 5, Exponent: -1} // 0.5 + err := keeper.AddPunishmentGraceEpoch(ctx, epochIndex, binomTestP0, 3000) + require.NoError(t, err) + logger.Info("Added grace epoch", "epoch", epochIndex, "binomTestP0", "0.5") + + params, err := keeper.GetParams(ctx) + require.NoError(t, err) + + expectedRewardCoin := calcExpectedRewards(int64(epochIndex), params) + logger.Info("Expected reward", "amount", expectedRewardCoin) + + coins, err2 := types.GetCoins(int64(expectedRewardCoin)) + require.NoError(t, err2) + + mocks.BankKeeper.EXPECT().MintCoins(gomock.Any(), types.ModuleName, coins, gomock.Any()).Return(nil) + mocks.BankKeeper.EXPECT().LogSubAccountTransaction(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + + err = keeper.SettleAccounts(ctx, epochIndex, 0) + require.NoError(t, err) + + // Verify participant got rewards (not punished due to grace epoch) + settleAmount, found := keeper.GetSettleAmount(ctx, participantHighMiss.Address) + require.True(t, found) + require.Greater(t, settleAmount.RewardCoins, uint64(0), "Participant should receive rewards with grace epoch despite high miss rate") + logger.Info("Verified participant received rewards with grace epoch", "rewardCoins", settleAmount.RewardCoins) +} + +// TestSettleWithoutGraceEpoch verifies that without grace epoch, high miss rate leads to punishment. +func TestSettleWithoutGraceEpoch(t *testing.T) { + logger := createTestLogger(t) + logger.Info("Starting TestSettleWithoutGraceEpoch") + + keeper, ctx, mocks := keeper2.InferenceKeeperReturningMocks(t) + + epochIndex := uint64(10) + + // Create participant with high miss rate (50% missed) + participantHighMiss := types.Participant{ + Index: testutil.Executor, + Address: testutil.Executor, + CoinBalance: 1000, + Status: types.ParticipantStatus_ACTIVE, + CurrentEpochStats: &types.CurrentEpochStats{ + InferenceCount: 50, // 50 successful + MissedRequests: 50, // 50 missed = 50% miss rate + }, + } + + keeper.SetParticipant(ctx, participantHighMiss) + keeper.SetEpochGroupData(ctx, types.EpochGroupData{ + EpochIndex: epochIndex, + ValidationWeights: []*types.ValidationWeight{ + { + MemberAddress: participantHighMiss.Address, + Weight: 1000, + Reputation: 100, + ConfirmationWeight: 1000, + }, + }, + }) + keeper.SetActiveParticipants(ctx, types.ActiveParticipants{ + EpochId: epochIndex, + Participants: []*types.ActiveParticipant{ + {Index: participantHighMiss.Address}, + }, + }) + + // NO grace epoch added - default BinomTestP0 (0.1) should punish 50% miss rate + + params, err := keeper.GetParams(ctx) + require.NoError(t, err) + + expectedRewardCoin := calcExpectedRewards(int64(epochIndex), params) + logger.Info("Expected reward", "amount", expectedRewardCoin) + + coins, err2 := types.GetCoins(int64(expectedRewardCoin)) + require.NoError(t, err2) + + mocks.BankKeeper.EXPECT().MintCoins(gomock.Any(), types.ModuleName, coins, gomock.Any()).Return(nil) + mocks.BankKeeper.EXPECT().LogSubAccountTransaction(gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any(), gomock.Any()).AnyTimes() + // Expect remainder to go to governance (punished participant's reward) + mocks.BankKeeper.EXPECT().SendCoinsFromModuleToModule(gomock.Any(), "inference", "gov", gomock.Any(), gomock.Any()).Return(nil) + + err = keeper.SettleAccounts(ctx, epochIndex, 0) + require.NoError(t, err) + + // Verify participant was punished (reward = 0) + settleAmount, found := keeper.GetSettleAmount(ctx, participantHighMiss.Address) + require.True(t, found) + require.Equal(t, uint64(0), settleAmount.RewardCoins, "Participant should be punished without grace epoch") + logger.Info("Verified participant was punished without grace epoch", "rewardCoins", settleAmount.RewardCoins) +} diff --git a/inference-chain/x/inference/keeper/bitcoin_rewards.go b/inference-chain/x/inference/keeper/bitcoin_rewards.go index 126e56b01..21db747d5 100644 --- a/inference-chain/x/inference/keeper/bitcoin_rewards.go +++ b/inference-chain/x/inference/keeper/bitcoin_rewards.go @@ -3,6 +3,7 @@ package keeper import ( "fmt" "math" + "math/bits" "math/big" "cosmossdk.io/log" @@ -412,6 +413,142 @@ func getSmallNetworkLimit(participantCount int) *types.Decimal { } } +const ( + dynamicP0MarginPermille uint64 = 20 + dynamicP0MinTotalRequests uint64 = 1000 + dynamicP0MinParticipantsWithTotal = 5 +) + +func permilleToP0Decimal(permille uint64) *types.Decimal { + return &types.Decimal{Value: int64(permille), Exponent: -3} +} + +func ceilToSupportedP0Permille(targetPermille uint64) uint64 { + switch { + case targetPermille <= 50: + return 50 + case targetPermille <= 100: + return 100 + case targetPermille <= 200: + return 200 + case targetPermille <= 300: + return 300 + case targetPermille <= 400: + return 400 + default: + return 500 + } +} + +func decimalToPermilleCeil(p0 *types.Decimal) uint64 { + if p0 == nil { + return 0 + } + permilleFloor := p0.ToDecimal().Mul(decimal.NewFromInt(1000)).IntPart() + if permilleFloor <= 0 { + return 0 + } + permille := uint64(permilleFloor) + if p0.ToDecimal().GreaterThan(decimal.New(permilleFloor, -3)) { + permille++ + } + return permille +} + +func getDynamicP0(participants []types.Participant, validationParams *types.ValidationParams, epoch uint64, logger log.Logger) (*types.Decimal, bool) { + governanceP0Permille := uint64(100) + if validationParams != nil && validationParams.BinomTestP0 != nil { + govCeil := decimalToPermilleCeil(validationParams.BinomTestP0) + if govCeil > 500 { + logger.Info("Bitcoin Rewards: Governance BinomTestP0 unsupported for lookup tables; using governance value directly", + "epoch", epoch, + "binomTestP0", validationParams.BinomTestP0.ToDecimal().String(), + ) + return validationParams.BinomTestP0, false + } + if govCeil > 0 { + governanceP0Permille = ceilToSupportedP0Permille(govCeil) + } + } + + var totalRequests uint64 + var missedRequests uint64 + participantsUsed := 0 + + for _, participant := range participants { + if participant.CurrentEpochStats == nil { + continue + } + inferenceCount := participant.CurrentEpochStats.InferenceCount + missed := participant.CurrentEpochStats.MissedRequests + total, carry := bits.Add64(inferenceCount, missed, 0) + if carry != 0 { + total = ^uint64(0) + } + if total == 0 { + continue + } + + sumTotal, carry := bits.Add64(totalRequests, total, 0) + if carry != 0 { + sumTotal = ^uint64(0) + } + totalRequests = sumTotal + + sumMissed, carry := bits.Add64(missedRequests, missed, 0) + if carry != 0 { + sumMissed = ^uint64(0) + } + missedRequests = sumMissed + participantsUsed++ + } + + if totalRequests < dynamicP0MinTotalRequests || participantsUsed < dynamicP0MinParticipantsWithTotal { + logger.Info("Bitcoin Rewards: Dynamic p0 selection fallback to governance (sample gate)", + "epoch", epoch, + "totalRequests", totalRequests, + "missedRequests", missedRequests, + "participantCountUsed", participantsUsed, + "minTotalRequests", dynamicP0MinTotalRequests, + "minParticipantsWithTotal", dynamicP0MinParticipantsWithTotal, + "finalPermille", governanceP0Permille, + ) + return permilleToP0Decimal(governanceP0Permille), false + } + + hi, lo := bits.Mul64(missedRequests, 1000) + baselinePermille, _ := bits.Div64(hi, lo, totalRequests) + + targetPermille := baselinePermille + dynamicP0MarginPermille + if targetPermille > 500 { + targetPermille = 500 + } + selectedTablePermille := ceilToSupportedP0Permille(targetPermille) + + finalPermille := selectedTablePermille + if governanceP0Permille > finalPermille { + finalPermille = governanceP0Permille + } + + skipPunishment := selectedTablePermille == 500 + + logger.Info("Bitcoin Rewards: Dynamic p0 selection", + "epoch", epoch, + "totalRequests", totalRequests, + "missedRequests", missedRequests, + "participantCountUsed", participantsUsed, + "baselinePermille", baselinePermille, + "marginPermille", dynamicP0MarginPermille, + "targetPermille", targetPermille, + "selectedTablePermille", selectedTablePermille, + "governancePermille", governanceP0Permille, + "finalPermille", finalPermille, + "skipPunishment", skipPunishment, + ) + + return permilleToP0Decimal(finalPermille), skipPunishment +} + // CalculateParticipantBitcoinRewards implements the main Bitcoin reward distribution logic // Preserves WorkCoins distribution while implementing fixed RewardCoins based on PoC weight func CalculateParticipantBitcoinRewards( @@ -545,11 +682,12 @@ func CalculateParticipantBitcoinRewards( // 4. Check and punish for downtime logger.Info("Bitcoin Rewards: Checking downtime for participants", "participants", len(participants)) - p0 := types.DecimalFromFloat(0.10) - if validationParams != nil && validationParams.BinomTestP0 != nil { - p0 = validationParams.BinomTestP0 + p0, skipPunishment := getDynamicP0(participants, validationParams, currentEpoch, logger) + if !skipPunishment { + CheckAndPunishForDowntimeForParticipants(participants, participantWeights, p0, logger) + } else { + logger.Info("Bitcoin Rewards: Skipping downtime punishment (outage circuit breaker)", "epoch", currentEpoch) } - CheckAndPunishForDowntimeForParticipants(participants, participantWeights, p0, logger) logger.Info("Bitcoin Rewards: weights after downtime check", "participants", participantWeights) // IMPORTANT: We intentionally DO NOT renormalize totalPoCWeightBeforeDowntime after downtime punishment, // invalidation, or CPoC reductions. Any "missed" share becomes undistributed and transferred to governance. diff --git a/inference-chain/x/inference/keeper/bitcoin_rewards_test.go b/inference-chain/x/inference/keeper/bitcoin_rewards_test.go index 690a8608a..1796a2cf2 100644 --- a/inference-chain/x/inference/keeper/bitcoin_rewards_test.go +++ b/inference-chain/x/inference/keeper/bitcoin_rewards_test.go @@ -2115,3 +2115,139 @@ func TestSettlementWithConfirmationCapping(t *testing.T) { require.Less(t, effectiveWeight, vw.Weight, "When confirmation PoC reveals lower capacity, effective weight should be capped") } + +func TestGetDynamicP0(t *testing.T) { + logger := createTestLogger(t) + + t.Run("Healthy epoch uses governance p0", func(t *testing.T) { + minTotal := dynamicP0MinTotalRequests + p1 := minTotal / 5 + p2 := minTotal / 5 + p3 := minTotal / 5 + p4 := minTotal / 5 + p5 := minTotal - p1 - p2 - p3 - p4 + + participants := []types.Participant{ + {Address: "p1", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p1, MissedRequests: 0}}, + {Address: "p2", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p2, MissedRequests: 0}}, + {Address: "p3", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p3, MissedRequests: 0}}, + {Address: "p4", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p4, MissedRequests: 0}}, + {Address: "p5", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p5, MissedRequests: 0}}, + } + + p0, skipPunishment := getDynamicP0(participants, nil, 1, logger) + require.NotNil(t, p0) + require.False(t, skipPunishment) + require.Equal(t, int64(100), p0.Value) + require.Equal(t, int32(-3), p0.Exponent) + }) + + t.Run("Degraded epoch selects 0.20", func(t *testing.T) { + participants := []types.Participant{ + {Address: "p1", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 220, MissedRequests: 30}}, + {Address: "p2", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 220, MissedRequests: 30}}, + {Address: "p3", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 176, MissedRequests: 24}}, + {Address: "p4", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 132, MissedRequests: 18}}, + {Address: "p5", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 132, MissedRequests: 18}}, + } + + p0, skipPunishment := getDynamicP0(participants, nil, 1, logger) + require.NotNil(t, p0) + require.False(t, skipPunishment) + require.Equal(t, int64(200), p0.Value) + require.Equal(t, int32(-3), p0.Exponent) + }) + + t.Run("Snaps up to next supported table", func(t *testing.T) { + participants := []types.Participant{ + {Address: "p1", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 205, MissedRequests: 45}}, + {Address: "p2", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 205, MissedRequests: 45}}, + {Address: "p3", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 164, MissedRequests: 36}}, + {Address: "p4", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 123, MissedRequests: 27}}, + {Address: "p5", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 122, MissedRequests: 28}}, + } + + p0, skipPunishment := getDynamicP0(participants, nil, 1, logger) + require.NotNil(t, p0) + require.False(t, skipPunishment) + require.Equal(t, int64(300), p0.Value) + require.Equal(t, int32(-3), p0.Exponent) + }) + + t.Run("Outage circuit breaker triggers at 0.50", func(t *testing.T) { + participants := []types.Participant{ + {Address: "p1", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 104, MissedRequests: 96}}, + {Address: "p2", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 104, MissedRequests: 96}}, + {Address: "p3", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 104, MissedRequests: 96}}, + {Address: "p4", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 104, MissedRequests: 96}}, + {Address: "p5", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 104, MissedRequests: 96}}, + } + + p0, skipPunishment := getDynamicP0(participants, nil, 1, logger) + require.NotNil(t, p0) + require.True(t, skipPunishment) + require.Equal(t, int64(500), p0.Value) + require.Equal(t, int32(-3), p0.Exponent) + }) + + t.Run("Small sample falls back to governance", func(t *testing.T) { + participants := []types.Participant{ + {Address: "p1", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 50, MissedRequests: 50}}, + {Address: "p2", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: 50, MissedRequests: 50}}, + } + + p0, skipPunishment := getDynamicP0(participants, nil, 1, logger) + require.NotNil(t, p0) + require.False(t, skipPunishment) + require.Equal(t, int64(100), p0.Value) + require.Equal(t, int32(-3), p0.Exponent) + }) + + t.Run("Never stricter than governance", func(t *testing.T) { + validationParams := &types.ValidationParams{BinomTestP0: permilleToP0Decimal(300)} + + minTotal := dynamicP0MinTotalRequests + p1 := minTotal / 5 + p2 := minTotal / 5 + p3 := minTotal / 5 + p4 := minTotal / 5 + p5 := minTotal - p1 - p2 - p3 - p4 + participants := []types.Participant{ + {Address: "p1", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p1, MissedRequests: 0}}, + {Address: "p2", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p2, MissedRequests: 0}}, + {Address: "p3", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p3, MissedRequests: 0}}, + {Address: "p4", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p4, MissedRequests: 0}}, + {Address: "p5", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p5, MissedRequests: 0}}, + } + + p0, skipPunishment := getDynamicP0(participants, validationParams, 1, logger) + require.NotNil(t, p0) + require.False(t, skipPunishment) + require.Equal(t, int64(300), p0.Value) + require.Equal(t, int32(-3), p0.Exponent) + }) + + t.Run("Governance p0 snaps to supported table", func(t *testing.T) { + validationParams := &types.ValidationParams{BinomTestP0: &types.Decimal{Value: 12, Exponent: -2}} + + minTotal := dynamicP0MinTotalRequests + p1 := minTotal / 5 + p2 := minTotal / 5 + p3 := minTotal / 5 + p4 := minTotal / 5 + p5 := minTotal - p1 - p2 - p3 - p4 + participants := []types.Participant{ + {Address: "p1", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p1, MissedRequests: 0}}, + {Address: "p2", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p2, MissedRequests: 0}}, + {Address: "p3", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p3, MissedRequests: 0}}, + {Address: "p4", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p4, MissedRequests: 0}}, + {Address: "p5", CurrentEpochStats: &types.CurrentEpochStats{InferenceCount: p5, MissedRequests: 0}}, + } + + p0, skipPunishment := getDynamicP0(participants, validationParams, 1, logger) + require.NotNil(t, p0) + require.False(t, skipPunishment) + require.Equal(t, int64(200), p0.Value) + require.Equal(t, int32(-3), p0.Exponent) + }) +} diff --git a/inference-chain/x/inference/keeper/epoch_models.go b/inference-chain/x/inference/keeper/epoch_models.go index d67dbae19..186df49ac 100644 --- a/inference-chain/x/inference/keeper/epoch_models.go +++ b/inference-chain/x/inference/keeper/epoch_models.go @@ -8,21 +8,23 @@ import ( // GetEpochModel retrieves the model snapshot for a given model ID from the current epoch's data. func (k Keeper) GetEpochModel(ctx context.Context, modelId string) (*types.Model, error) { - currentGroup, err := k.GetCurrentEpochGroup(ctx) - if err != nil { - return nil, err + effectiveEpochIndex, found := k.GetEffectiveEpochIndex(ctx) + if !found { + return nil, types.ErrEffectiveEpochNotFound } + return k.GetEpochModelForEpoch(ctx, effectiveEpochIndex, modelId) +} - // Get the sub-group for the specified model. - // The sub-group contains the model snapshot. - modelSubGroup, err := currentGroup.GetSubGroup(ctx, modelId) +// GetEpochModelForEpoch retrieves the model snapshot for a given model ID from a specific epoch. +func (k Keeper) GetEpochModelForEpoch(ctx context.Context, epochId uint64, modelId string) (*types.Model, error) { + epochGroup, err := k.GetEpochGroup(ctx, epochId, modelId) if err != nil { return nil, err } - if modelSubGroup.GroupData == nil || modelSubGroup.GroupData.ModelSnapshot == nil { + if epochGroup.GroupData == nil || epochGroup.GroupData.ModelSnapshot == nil { return nil, types.ErrModelSnapshotNotFound } - return modelSubGroup.GroupData.ModelSnapshot, nil + return epochGroup.GroupData.ModelSnapshot, nil } diff --git a/inference-chain/x/inference/keeper/keeper.go b/inference-chain/x/inference/keeper/keeper.go index b0bbed177..74b6e28e6 100644 --- a/inference-chain/x/inference/keeper/keeper.go +++ b/inference-chain/x/inference/keeper/keeper.go @@ -82,6 +82,10 @@ type ( WrappedContractReverseIndex collections.Map[string, types.BridgeTokenReference] LiquidityPoolItem collections.Item[types.LiquidityPool] LiquidityPoolApprovedTokensMap collections.Map[collections.Pair[string, string], types.BridgeTokenReference] + // PoC validation sampling snapshots + PoCValidationSnapshots collections.Map[int64, types.PoCValidationSnapshot] + // Punishment grace epochs for upgrade protection + PunishmentGraceEpochs collections.Map[uint64, types.GraceEpochParams] } ) @@ -410,6 +414,20 @@ func NewKeeper( "liquidity_pool", codec.CollValue[types.LiquidityPool](cdc), ), + PoCValidationSnapshots: collections.NewMap( + sb, + types.PoCValidationSnapshotPrefix, + "poc_validation_snapshot", + collections.Int64Key, + codec.CollValue[types.PoCValidationSnapshot](cdc), + ), + PunishmentGraceEpochs: collections.NewMap( + sb, + types.PunishmentGraceEpochsPrefix, + "punishment_grace_epochs", + collections.Uint64Key, + codec.CollValue[types.GraceEpochParams](cdc), + ), } // Build the collections schema schema, err := sb.Build() diff --git a/inference-chain/x/inference/keeper/migrations_confirmation_weight.go b/inference-chain/x/inference/keeper/migrations_confirmation_weight.go index 76899bc2a..77d10d63b 100644 --- a/inference-chain/x/inference/keeper/migrations_confirmation_weight.go +++ b/inference-chain/x/inference/keeper/migrations_confirmation_weight.go @@ -32,7 +32,7 @@ func (k Keeper) MigrateConfirmationWeights(ctx sdk.Context) error { activeParticipantToConfirmationWeight := make(map[string]int64) for _, participant := range activeParticipants.Participants { - confirmationWeight := calculateInferenceServingWeight(participant.MlNodes) + confirmationWeight := calculatePocParticipatingNodesWeight(participant.MlNodes) activeParticipantToConfirmationWeight[participant.Index] = confirmationWeight } @@ -56,9 +56,13 @@ func (k Keeper) MigrateConfirmationWeights(ctx sdk.Context) error { return nil } -// calculateInferenceServingWeight calculates the total weight of nodes serving inference (POC_SLOT=false). -// This matches the logic in epochgroup.calculateInferenceServingWeight. -func calculateInferenceServingWeight(mlNodes []*types.ModelMLNodes) int64 { +// calculatePocParticipatingNodesWeight calculates the total weight of nodes participating in PoC. +// +// NOTE: This logic is intentionally duplicated from the epoch group implementation in +// x/inference/epochgroup/epoch_group.go. Any changes to the weight-calculation logic here +// must also be applied there (and vice versa) to keep confirmation and validation weights +// consistent across the codebase. +func calculatePocParticipatingNodesWeight(mlNodes []*types.ModelMLNodes) int64 { totalWeight := int64(0) for _, modelNodes := range mlNodes { diff --git a/inference-chain/x/inference/keeper/msg_server_claim_rewards_test.go b/inference-chain/x/inference/keeper/msg_server_claim_rewards_test.go index e2e5bbd82..5d59ee085 100644 --- a/inference-chain/x/inference/keeper/msg_server_claim_rewards_test.go +++ b/inference-chain/x/inference/keeper/msg_server_claim_rewards_test.go @@ -381,15 +381,15 @@ func TestMsgServer_ClaimRewards_ValidationLogic(t *testing.T) { ValidationWeights: []*types.ValidationWeight{ { MemberAddress: testutil.Creator, - Weight: 50, // Validator has 50 power + Weight: 80, // High validator weight keeps required validations above tiny-sample grace range }, { MemberAddress: testutil.Executor, - Weight: 30, // Executor1 has 30 power + Weight: 10, // Executor has low share, making this validator selected to validate more often }, { MemberAddress: testutil.Executor2, - Weight: 20, // Executor2 has 20 power + Weight: 10, // Executor has low share, making this validator selected to validate more often }, }, } @@ -427,7 +427,9 @@ func TestMsgServer_ClaimRewards_ValidationLogic(t *testing.T) { TrafficBasis: 1000, } - // Add 7 more inferences to reach 10 total (critical value = 4, so missing 5+ will fail) + // Add 7 more inferences to reach 10 total. + // With the weight setup above, required validations are consistently >= 5, + // so missing all validations fails even with n<5 grace in stats table. for i := 4; i <= 10; i++ { executor := testutil.Executor if i%2 == 0 { @@ -469,7 +471,7 @@ func TestMsgServer_ClaimRewards_ValidationLogic(t *testing.T) { mocks.AuthzKeeper.EXPECT().GranterGrants(gomock.Any(), gomock.Any()).Return(&authztypes.QueryGranterGrantsResponse{Grants: []*authztypes.GrantAuthorization{}}, nil).AnyTimes() // Call ClaimRewards - this should fail because we haven't validated any inferences yet - // With 10 inferences and critical value of 4, missing all 10 will exceed the threshold + // Missing all required validations should exceed the threshold. resp, err := ms.ClaimRewards(ctx.WithBlockHeight(claimDebounceBlocks+1), &types.MsgClaimRewards{ Creator: testutil.Creator, EpochIndex: epochIndex, @@ -596,15 +598,15 @@ func TestMsgServer_ClaimRewards_PartialValidation(t *testing.T) { ValidationWeights: []*types.ValidationWeight{ { MemberAddress: testutil.Creator, - Weight: 50, // Validator has 50 power + Weight: 80, // High validator weight keeps required validations above tiny-sample grace range }, { MemberAddress: testutil.Executor, - Weight: 30, // Executor1 has 30 power + Weight: 10, // Executor has low share, making this validator selected to validate more often }, { MemberAddress: testutil.Executor2, - Weight: 20, // Executor2 has 20 power + Weight: 10, // Executor has low share, making this validator selected to validate more often }, }, } @@ -642,7 +644,9 @@ func TestMsgServer_ClaimRewards_PartialValidation(t *testing.T) { TrafficBasis: 1000, } - // Add 7 more inferences to reach 10 total (critical value = 4, so missing 5+ will fail) + // Add 7 more inferences to reach 10 total. + // With the weight setup above, required validations are consistently >= 5, + // so missing all validations fails even with n<5 grace in stats table. for i := 4; i <= 10; i++ { executor := testutil.Executor if i%2 == 0 { @@ -684,7 +688,7 @@ func TestMsgServer_ClaimRewards_PartialValidation(t *testing.T) { mocks.AuthzKeeper.EXPECT().GranterGrants(gomock.Any(), gomock.Any()).Return(&authztypes.QueryGranterGrantsResponse{Grants: []*authztypes.GrantAuthorization{}}, nil).AnyTimes() // Call ClaimRewards - this should fail because we haven't validated any inferences yet - // With 10 inferences, missing 4+ validations exceeds the critical value (4) + // Missing all required validations should exceed the threshold. resp, err := ms.ClaimRewards(ctx.WithBlockHeight(claimDebounceBlocks+1), &types.MsgClaimRewards{ Creator: testutil.Creator, EpochIndex: epochIndex, diff --git a/inference-chain/x/inference/keeper/msg_server_invalidate_inference.go b/inference-chain/x/inference/keeper/msg_server_invalidate_inference.go index c129b906c..b2f42f84a 100644 --- a/inference-chain/x/inference/keeper/msg_server_invalidate_inference.go +++ b/inference-chain/x/inference/keeper/msg_server_invalidate_inference.go @@ -53,19 +53,26 @@ func (k msgServer) InvalidateInference(ctx context.Context, msg *types.MsgInvali } func (k msgServer) refundInvalidatedInference(executor *types.Participant, inference *types.Inference, ctx context.Context) error { - executor.CoinBalance -= inference.ActualCost - k.SafeLogSubAccountTransaction(ctx, types.ModuleName, executor.Address, types.OwedSubAccount, inference.ActualCost, "inference_invalidated:"+inference.InferenceId) - k.LogInfo("Invalid Inference subtracted from Executor CoinBalance ", types.Balances, "inferenceId", inference.InferenceId, "executor", executor.Address, "actualCost", inference.ActualCost, "coinBalance", executor.CoinBalance) - // We need to refund the cost, so we have to lookup the person who paid + // Lookup the payer first payer, found := k.GetParticipant(ctx, inference.RequestedBy) if !found { k.LogError("Payer not found", types.Validation, "address", inference.RequestedBy) return types.ErrParticipantNotFound } + + // Attempt refund BEFORE modifying executor balance + // If refund fails (e.g. underfunded escrow), don't corrupt state err := k.IssueRefund(ctx, inference.ActualCost, payer.Address, "invalidated_inference:"+inference.InferenceId) if err != nil { k.LogError("Refund failed", types.Validation, "error", err) + return err } + + // Only deduct from executor after successful refund + executor.CoinBalance -= inference.ActualCost + k.SafeLogSubAccountTransaction(ctx, types.ModuleName, executor.Address, types.OwedSubAccount, inference.ActualCost, "invalidated_inference:"+inference.InferenceId) + k.LogInfo("Invalid Inference subtracted from Executor CoinBalance ", types.Balances, "inferenceId", inference.InferenceId, "executor", executor.Address, "actualCost", inference.ActualCost, "coinBalance", executor.CoinBalance) + return nil } diff --git a/inference-chain/x/inference/keeper/msg_server_validation.go b/inference-chain/x/inference/keeper/msg_server_validation.go index dceebf523..0338aef05 100644 --- a/inference-chain/x/inference/keeper/msg_server_validation.go +++ b/inference-chain/x/inference/keeper/msg_server_validation.go @@ -64,10 +64,11 @@ func (k msgServer) Validation(goCtx context.Context, msg *types.MsgValidation) ( return nil, types.ErrParticipantCannotValidateOwnInference } - model, err := k.GetEpochModel(ctx, inference.Model) + model, err := k.GetEpochModelForEpoch(ctx, inference.EpochId, inference.Model) if err != nil { k.LogError("Failed to get epoch model", types.Validation, "model", inference.Model, + "epochId", inference.EpochId, "inferenceId", msg.InferenceId, "error", err) return nil, err diff --git a/inference-chain/x/inference/keeper/poc_validation_snapshot.go b/inference-chain/x/inference/keeper/poc_validation_snapshot.go new file mode 100644 index 000000000..873848985 --- /dev/null +++ b/inference-chain/x/inference/keeper/poc_validation_snapshot.go @@ -0,0 +1,28 @@ +package keeper + +import ( + "context" + "errors" + + "cosmossdk.io/collections" + "github.com/productscience/inference/x/inference/types" +) + +func (k Keeper) SetPoCValidationSnapshot(ctx context.Context, snapshot types.PoCValidationSnapshot) error { + return k.PoCValidationSnapshots.Set(ctx, snapshot.PocStageStartHeight, snapshot) +} + +func (k Keeper) GetPoCValidationSnapshot(ctx context.Context, pocStageStartHeight int64) (types.PoCValidationSnapshot, bool, error) { + snapshot, err := k.PoCValidationSnapshots.Get(ctx, pocStageStartHeight) + if err != nil { + if errors.Is(err, collections.ErrNotFound) { + return types.PoCValidationSnapshot{}, false, nil + } + return types.PoCValidationSnapshot{}, false, err + } + return snapshot, true, nil +} + +func (k Keeper) DeletePoCValidationSnapshot(ctx context.Context, pocStageStartHeight int64) error { + return k.PoCValidationSnapshots.Remove(ctx, pocStageStartHeight) +} diff --git a/inference-chain/x/inference/keeper/punishment_grace_epochs.go b/inference-chain/x/inference/keeper/punishment_grace_epochs.go new file mode 100644 index 000000000..ad919f8dc --- /dev/null +++ b/inference-chain/x/inference/keeper/punishment_grace_epochs.go @@ -0,0 +1,23 @@ +package keeper + +import ( + "context" + + "github.com/productscience/inference/x/inference/types" +) + +func (k Keeper) AddPunishmentGraceEpoch(ctx context.Context, epochIndex uint64, binomTestP0 *types.Decimal, upgradeProtectionWindow int64) error { + return k.PunishmentGraceEpochs.Set(ctx, epochIndex, types.GraceEpochParams{ + EpochIndex: epochIndex, + BinomTestP0: binomTestP0, + UpgradeProtectionWindow: upgradeProtectionWindow, + }) +} + +func (k Keeper) GetPunishmentGraceEpoch(ctx context.Context, epochIndex uint64) (*types.GraceEpochParams, bool) { + params, err := k.PunishmentGraceEpochs.Get(ctx, epochIndex) + if err != nil { + return nil, false + } + return ¶ms, true +} diff --git a/inference-chain/x/inference/keeper/punishment_grace_epochs_test.go b/inference-chain/x/inference/keeper/punishment_grace_epochs_test.go new file mode 100644 index 000000000..00c146f22 --- /dev/null +++ b/inference-chain/x/inference/keeper/punishment_grace_epochs_test.go @@ -0,0 +1,110 @@ +package keeper_test + +import ( + "testing" + + keeper2 "github.com/productscience/inference/testutil/keeper" + "github.com/productscience/inference/x/inference/types" + "github.com/stretchr/testify/require" +) + +func TestPunishmentGraceEpoch_AddAndGet(t *testing.T) { + keeper, ctx, _ := keeper2.InferenceKeeperReturningMocks(t) + + epochIndex := uint64(170) + + _, found := keeper.GetPunishmentGraceEpoch(ctx, epochIndex) + require.False(t, found) + + binomTestP0 := &types.Decimal{Value: 5, Exponent: -1} + err := keeper.AddPunishmentGraceEpoch(ctx, epochIndex, binomTestP0, 3000) + require.NoError(t, err) + + params, found := keeper.GetPunishmentGraceEpoch(ctx, epochIndex) + require.True(t, found) + require.Equal(t, epochIndex, params.EpochIndex) + require.Equal(t, int64(5), params.BinomTestP0.Value) + require.Equal(t, int32(-1), params.BinomTestP0.Exponent) + require.Equal(t, int64(3000), params.UpgradeProtectionWindow) +} + +func TestPunishmentGraceEpoch_NotFound(t *testing.T) { + keeper, ctx, _ := keeper2.InferenceKeeperReturningMocks(t) + + _, found := keeper.GetPunishmentGraceEpoch(ctx, 999) + require.False(t, found) +} + +func TestPunishmentGraceEpoch_MultipleEpochs(t *testing.T) { + keeper, ctx, _ := keeper2.InferenceKeeperReturningMocks(t) + + require.NoError(t, keeper.AddPunishmentGraceEpoch(ctx, 170, &types.Decimal{Value: 5, Exponent: -1}, 3000)) + require.NoError(t, keeper.AddPunishmentGraceEpoch(ctx, 171, &types.Decimal{Value: 4, Exponent: -1}, 2000)) + + params170, found := keeper.GetPunishmentGraceEpoch(ctx, 170) + require.True(t, found) + require.Equal(t, int64(3000), params170.UpgradeProtectionWindow) + + params171, found := keeper.GetPunishmentGraceEpoch(ctx, 171) + require.True(t, found) + require.Equal(t, int64(2000), params171.UpgradeProtectionWindow) + + _, found = keeper.GetPunishmentGraceEpoch(ctx, 172) + require.False(t, found) +} + +func TestPunishmentGraceEpoch_NilBinomTestP0(t *testing.T) { + keeper, ctx, _ := keeper2.InferenceKeeperReturningMocks(t) + + require.NoError(t, keeper.AddPunishmentGraceEpoch(ctx, 170, nil, 3000)) + + params, found := keeper.GetPunishmentGraceEpoch(ctx, 170) + require.True(t, found) + require.Nil(t, params.BinomTestP0) + require.Equal(t, int64(3000), params.UpgradeProtectionWindow) +} + +func TestPunishmentGraceEpoch_UpgradeProtectionWindowUsage(t *testing.T) { + keeper, ctx, _ := keeper2.InferenceKeeperReturningMocks(t) + + epochIndex := uint64(170) + defaultWindow := int64(500) + graceWindow := int64(3000) + + // Without grace epoch + upgradeProtectionWindow := defaultWindow + if graceParams, ok := keeper.GetPunishmentGraceEpoch(ctx, epochIndex); ok && graceParams.UpgradeProtectionWindow > 0 { + upgradeProtectionWindow = graceParams.UpgradeProtectionWindow + } + require.Equal(t, defaultWindow, upgradeProtectionWindow) + + // With grace epoch + require.NoError(t, keeper.AddPunishmentGraceEpoch(ctx, epochIndex, nil, graceWindow)) + + upgradeProtectionWindow = defaultWindow + if graceParams, ok := keeper.GetPunishmentGraceEpoch(ctx, epochIndex); ok && graceParams.UpgradeProtectionWindow > 0 { + upgradeProtectionWindow = graceParams.UpgradeProtectionWindow + } + require.Equal(t, graceWindow, upgradeProtectionWindow) +} + +func TestPunishmentGraceEpoch_ZeroUpgradeProtectionWindow(t *testing.T) { + keeper, ctx, _ := keeper2.InferenceKeeperReturningMocks(t) + + epochIndex := uint64(170) + defaultWindow := int64(500) + + binomTestP0 := &types.Decimal{Value: 5, Exponent: -1} + require.NoError(t, keeper.AddPunishmentGraceEpoch(ctx, epochIndex, binomTestP0, 0)) + + upgradeProtectionWindow := defaultWindow + if graceParams, ok := keeper.GetPunishmentGraceEpoch(ctx, epochIndex); ok && graceParams.UpgradeProtectionWindow > 0 { + upgradeProtectionWindow = graceParams.UpgradeProtectionWindow + } + require.Equal(t, defaultWindow, upgradeProtectionWindow) + + graceParams, found := keeper.GetPunishmentGraceEpoch(ctx, epochIndex) + require.True(t, found) + require.NotNil(t, graceParams.BinomTestP0) + require.Equal(t, int64(5), graceParams.BinomTestP0.Value) +} diff --git a/inference-chain/x/inference/keeper/query_poc_validation_snapshot.go b/inference-chain/x/inference/keeper/query_poc_validation_snapshot.go new file mode 100644 index 000000000..b7537c363 --- /dev/null +++ b/inference-chain/x/inference/keeper/query_poc_validation_snapshot.go @@ -0,0 +1,32 @@ +package keeper + +import ( + "context" + + "github.com/productscience/inference/x/inference/types" + "google.golang.org/grpc/codes" + "google.golang.org/grpc/status" +) + +func (k Keeper) PoCValidationSnapshot(ctx context.Context, req *types.QueryPoCValidationSnapshotRequest) (*types.QueryPoCValidationSnapshotResponse, error) { + if req == nil { + return nil, status.Error(codes.InvalidArgument, "invalid request") + } + + snapshot, found, err := k.GetPoCValidationSnapshot(ctx, req.PocStageStartHeight) + if err != nil { + return nil, status.Error(codes.Internal, err.Error()) + } + + if !found { + return &types.QueryPoCValidationSnapshotResponse{ + Snapshot: nil, + Found: false, + }, nil + } + + return &types.QueryPoCValidationSnapshotResponse{ + Snapshot: &snapshot, + Found: true, + }, nil +} diff --git a/inference-chain/x/inference/module/chainvalidation.go b/inference-chain/x/inference/module/chainvalidation.go index 850fbbd9a..b2f1f44e4 100644 --- a/inference-chain/x/inference/module/chainvalidation.go +++ b/inference-chain/x/inference/module/chainvalidation.go @@ -8,10 +8,39 @@ import ( "strconv" mathsdk "cosmossdk.io/math" + "github.com/productscience/inference/x/inference/calculations" "github.com/productscience/inference/x/inference/types" "github.com/productscience/inference/x/inference/utils" + "github.com/shopspring/decimal" ) +// expectedBlockDurationSec is the expected duration of a block in seconds (5.41). +var expectedBlockDurationSec = decimal.New(541, -2) + +func CalculateTimeNormalizationFactor( + genStartTimestamp, exchangeEndTimestamp int64, + pocStageDuration, pocExchangeDuration int64, +) mathsdk.LegacyDec { + if genStartTimestamp == 0 || exchangeEndTimestamp == 0 { + return mathsdk.LegacyOneDec() + } + + actualDurationSec := exchangeEndTimestamp - genStartTimestamp + if actualDurationSec <= 0 { + return mathsdk.LegacyOneDec() + } + + expectedBlocks := pocStageDuration + pocExchangeDuration + expectedDurationSec := decimal.NewFromInt(expectedBlocks).Mul(expectedBlockDurationSec) + actualDurationDecimal := decimal.NewFromInt(actualDurationSec) + + factor, err := decimalToLegacyDec(expectedDurationSec.Div(actualDurationDecimal)) + if err != nil { + return mathsdk.LegacyOneDec() + } + return factor +} + // WeightCalculator encapsulates all the data needed to calculate new weights for participants. // Uses off-chain store commits and weight distributions instead of on-chain batches. type WeightCalculator struct { @@ -24,8 +53,13 @@ type WeightCalculator struct { EpochStartBlockHeight int64 Logger types.InferenceLogger WeightScaleFactor mathsdk.LegacyDec + TimeNormalizationFactor mathsdk.LegacyDec GuardianEnabled bool GuardianAddresses map[string]bool + AppHash string + ValidationSlots int + sortedValidatorEntries []calculations.WeightEntry + validatorTotalWeight int64 } // NewWeightCalculator creates a new WeightCalculator instance. @@ -39,10 +73,13 @@ func NewWeightCalculator( epochStartBlockHeight int64, logger types.InferenceLogger, weightScaleFactor mathsdk.LegacyDec, + timeNormalizationFactor mathsdk.LegacyDec, guardianEnabled bool, guardianAddresses map[string]bool, + appHash string, + validationSlots int, ) *WeightCalculator { - return &WeightCalculator{ + wc := &WeightCalculator{ CurrentValidatorWeights: currentValidatorWeights, StoreCommits: storeCommits, NodeWeightDistributions: nodeWeightDistributions, @@ -52,9 +89,18 @@ func NewWeightCalculator( EpochStartBlockHeight: epochStartBlockHeight, Logger: logger, WeightScaleFactor: weightScaleFactor, + TimeNormalizationFactor: timeNormalizationFactor, GuardianEnabled: guardianEnabled, GuardianAddresses: guardianAddresses, + AppHash: appHash, + ValidationSlots: validationSlots, } + + if validationSlots > 0 { + wc.sortedValidatorEntries, wc.validatorTotalWeight = calculations.PrepareSortedEntries(currentValidatorWeights) + } + + return wc } // Calculate computes the new weights for active participants. @@ -173,108 +219,159 @@ func (wc *WeightCalculator) getParticipantValidations(participantAddress string) } // pocValidated checks if the participant passed validation by majority vote. -// Uses validated_weight semantics: -// - validated_weight > 0 -> valid vote (passed validation) -// - validated_weight <= 0 -> invalid vote (fraud/failure detected) +// When ValidationSlots > 0, uses sampled validator subset for O(N * N_SLOTS) complexity. +// When ValidationSlots == 0, falls back to O(N²) all-validator validation. func (wc *WeightCalculator) pocValidated(vals []types.PoCValidationV2, participantAddress string) bool { - totalWeight := calculateTotalWeight(wc.CurrentValidatorWeights) - halfWeight := int64(totalWeight / 2) - shouldContinue := false - - if len(wc.CurrentValidatorWeights) > 0 { - valOutcome := calculateValidationOutcome(wc.CurrentValidatorWeights, vals) - votedWeight := valOutcome.ValidWeight + valOutcome.InvalidWeight - if valOutcome.ValidWeight > halfWeight { - shouldContinue = true - wc.Logger.LogInfo("Calculate: Participant received valid validations from more than half of participants by weight. Accepting", - types.PoC, "participant", participantAddress, - "validWeight", valOutcome.ValidWeight, - "invalidWeight", valOutcome.InvalidWeight, - "votedWeight", votedWeight, - "totalWeight", totalWeight, - "halfWeight", halfWeight, - ) - } else if valOutcome.InvalidWeight > halfWeight { - shouldContinue = false - wc.Logger.LogWarn("Calculate: Participant received invalid validations from more than half of participants by weight. Rejecting", - types.PoC, "participant", participantAddress, - "validWeight", valOutcome.ValidWeight, - "invalidWeight", valOutcome.InvalidWeight, - "votedWeight", votedWeight, - "totalWeight", totalWeight, - "halfWeight", halfWeight, - ) + if len(wc.CurrentValidatorWeights) == 0 { + if wc.EpochStartBlockHeight > 0 { + wc.Logger.LogError("Calculate: No current validator weights found. Accepting the participant.", types.PoC, "participant", participantAddress) + } + return true + } + + assignedValidators := wc.getAssignedValidators(participantAddress) + outcome := wc.calculateAssignedOutcome(vals, assignedValidators) + // 66.7% threshold: need >2/3 of assigned slots to vote valid + // If not met, falls back to guardian decision + twoThirdsWeight := outcome.TotalWeight * 2 / 3 + + if outcome.ValidWeight > twoThirdsWeight { + wc.Logger.LogInfo("Calculate: Valid majority. Accepting.", types.PoC, + "participant", participantAddress, + "validWeight", outcome.ValidWeight, + "invalidWeight", outcome.InvalidWeight, + "totalWeight", outcome.TotalWeight, + "sampled", assignedValidators != nil, + ) + return true + } + + if outcome.InvalidWeight > twoThirdsWeight { + wc.Logger.LogWarn("Calculate: Invalid majority. Rejecting.", types.PoC, + "participant", participantAddress, + "validWeight", outcome.ValidWeight, + "invalidWeight", outcome.InvalidWeight, + "totalWeight", outcome.TotalWeight, + "sampled", assignedValidators != nil, + ) + return false + } + + return wc.guardianProtection(vals, participantAddress, outcome) +} + +// getAssignedValidators returns the sampled validator addresses for a participant. +// Returns nil when sampling is disabled (ValidationSlots == 0), triggering O(N²) fallback. +func (wc *WeightCalculator) getAssignedValidators(participantAddress string) []string { + if wc.ValidationSlots == 0 { + return nil + } + if wc.sortedValidatorEntries == nil { + return nil + } + return calculations.GetSlotsFromSorted(wc.AppHash, participantAddress, wc.sortedValidatorEntries, wc.validatorTotalWeight, wc.ValidationSlots) +} + +// ValidationOutcome holds aggregated vote counts. +// When using slot-based sampling, these are slot counts (each slot = 1). +// When using O(N²) fallback, these are weight sums. +type ValidationOutcome struct { + TotalWeight int64 + ValidWeight int64 + InvalidWeight int64 +} + +// calculateAssignedOutcome computes vote counts from assigned slots. +// When assignedValidators is nil, uses O(N²) fallback with weight-based counting. +// When assignedValidators is set, counts slots (each slot = 1) since weight is +// already encoded in how many slots each validator receives. +func (wc *WeightCalculator) calculateAssignedOutcome(vals []types.PoCValidationV2, assignedValidators []string) ValidationOutcome { + if assignedValidators == nil { + outcome := calculateValidationOutcome(wc.CurrentValidatorWeights, vals) + totalWeight := calculateTotalWeight(wc.CurrentValidatorWeights) + return ValidationOutcome{ + TotalWeight: int64(totalWeight), + ValidWeight: outcome.ValidWeight, + InvalidWeight: outcome.InvalidWeight, + } + } + + // Build map of validator address -> vote (positive = valid, zero/negative = invalid) + voteMap := make(map[string]int64) + for _, v := range vals { + voteMap[v.ValidatorParticipantAddress] = v.ValidatedWeight + } + + // Count slots. Each slot = 1 (weight is already in slot distribution). + // Same validator can appear multiple times if they have high weight. + // TotalWeight is fixed to all assigned slots (missing votes are abstentions). + totalSlots := int64(len(assignedValidators)) + var validSlots, invalidSlots int64 + for _, slotValidator := range assignedValidators { + vote, hasVote := voteMap[slotValidator] + if !hasVote { + continue + } + if vote > 0 { + validSlots++ } else { - shouldContinue = false - guardianValidCount := 0 - guardianInvalidCount := 0 - - if wc.GuardianEnabled && len(wc.GuardianAddresses) > 0 { - for _, v := range vals { - if wc.GuardianAddresses[v.ValidatorParticipantAddress] { - if v.ValidatedWeight > 0 { - guardianValidCount++ - } else { - guardianInvalidCount++ - } - } - } + invalidSlots++ + } + } - // Guardian tiebreaker: all voting guardians must agree - if guardianValidCount > 0 && guardianInvalidCount == 0 { - shouldContinue = true - wc.Logger.LogInfo("Calculate: Guardian tiebreaker - unanimous valid. Accepting.", - types.PoC, "participant", participantAddress, - "validWeight", valOutcome.ValidWeight, - "invalidWeight", valOutcome.InvalidWeight, - "votedWeight", votedWeight, - "totalWeight", totalWeight, - "halfWeight", halfWeight, - "guardianValidCount", guardianValidCount, - "guardianInvalidCount", guardianInvalidCount, - ) - } else if guardianInvalidCount > 0 && guardianValidCount == 0 { - wc.Logger.LogWarn("Calculate: Guardian tiebreaker - unanimous invalid. Rejecting.", - types.PoC, "participant", participantAddress, - "validWeight", valOutcome.ValidWeight, - "invalidWeight", valOutcome.InvalidWeight, - "votedWeight", votedWeight, - "totalWeight", totalWeight, - "halfWeight", halfWeight, - "guardianValidCount", guardianValidCount, - "guardianInvalidCount", guardianInvalidCount, - ) - } else { - wc.Logger.LogWarn("Calculate: No majority and guardians did not reach consensus. Rejecting.", - types.PoC, "participant", participantAddress, - "validWeight", valOutcome.ValidWeight, - "invalidWeight", valOutcome.InvalidWeight, - "votedWeight", votedWeight, - "totalWeight", totalWeight, - "halfWeight", halfWeight, - "guardianValidCount", guardianValidCount, - "guardianInvalidCount", guardianInvalidCount, - ) - } + return ValidationOutcome{ + TotalWeight: totalSlots, + ValidWeight: validSlots, + InvalidWeight: invalidSlots, + } +} + +// guardianProtection handles tie-breaking when no clear majority exists. +// All voting guardians must agree unanimously for the decision to pass. +func (wc *WeightCalculator) guardianProtection(vals []types.PoCValidationV2, participantAddr string, outcome ValidationOutcome) bool { + if !wc.GuardianEnabled || len(wc.GuardianAddresses) == 0 { + wc.Logger.LogWarn("Calculate: No majority and no guardians. Rejecting.", types.PoC, + "participant", participantAddr, + "validWeight", outcome.ValidWeight, + "invalidWeight", outcome.InvalidWeight, + "totalWeight", outcome.TotalWeight, + ) + return false + } + + guardianValidCount, guardianInvalidCount := 0, 0 + for _, v := range vals { + if wc.GuardianAddresses[v.ValidatorParticipantAddress] { + if v.ValidatedWeight > 0 { + guardianValidCount++ } else { - wc.Logger.LogWarn("Calculate: Participant did not receive a majority of either valid or invalid validations. Rejecting.", - types.PoC, "participant", participantAddress, - "validWeight", valOutcome.ValidWeight, - "invalidWeight", valOutcome.InvalidWeight, - "votedWeight", votedWeight, - "totalWeight", totalWeight, - "halfWeight", halfWeight, - ) + guardianInvalidCount++ } } - } else { - shouldContinue = true - if wc.EpochStartBlockHeight > 0 { - wc.Logger.LogError("Calculate: No current validator weights found. Accepting the participant.", types.PoC, "participant", participantAddress) - } } - return shouldContinue + if guardianValidCount > 0 && guardianInvalidCount == 0 { + wc.Logger.LogInfo("Calculate: Guardian tiebreaker - unanimous valid. Accepting.", types.PoC, + "participant", participantAddr, + "guardianValidCount", guardianValidCount, + ) + return true + } + + if guardianInvalidCount > 0 && guardianValidCount == 0 { + wc.Logger.LogWarn("Calculate: Guardian tiebreaker - unanimous invalid. Rejecting.", types.PoC, + "participant", participantAddr, + "guardianInvalidCount", guardianInvalidCount, + ) + return false + } + + wc.Logger.LogWarn("Calculate: No majority and guardians split. Rejecting.", types.PoC, + "participant", participantAddr, + "guardianValidCount", guardianValidCount, + "guardianInvalidCount", guardianInvalidCount, + ) + return false } type nodeWeight struct { @@ -283,7 +380,7 @@ type nodeWeight struct { } // calculateParticipantWeight computes the claimed weight from store commit and weight distribution. -// Total weight comes from StoreCommit.Count (scaled by weightScaleFactor). +// Total weight comes from StoreCommit.Count (scaled by weightScaleFactor and timeNormalizationFactor). // Per-node weights come from MLNodeWeightDistribution. func (wc *WeightCalculator) calculateParticipantWeight(participantAddress string) ([]nodeWeight, int64) { commit, hasCommit := wc.StoreCommits[participantAddress] @@ -291,27 +388,36 @@ func (wc *WeightCalculator) calculateParticipantWeight(participantAddress string return nil, 0 } - // Calculate total weight from commit count - totalWeight := mathsdk.LegacyNewDec(int64(commit.Count)).Mul(wc.WeightScaleFactor).TruncateInt64() + combinedFactor := wc.WeightScaleFactor + if wc.TimeNormalizationFactor.IsPositive() { + combinedFactor = combinedFactor.Mul(wc.TimeNormalizationFactor) + } + + totalWeight := mathsdk.LegacyNewDec(int64(commit.Count)).Mul(combinedFactor).TruncateInt64() - // Get per-node weights from distribution distribution, hasDistribution := wc.NodeWeightDistributions[participantAddress] if !hasDistribution || len(distribution.Weights) == 0 { - // No distribution - create a single "unknown" node with all weight - wc.Logger.LogWarn("Calculate: No weight distribution for participant, using single node", types.PoC, + wc.Logger.LogWarn("Calculate: No weight distribution for participant, skipping PoC weight", types.PoC, "participant", participantAddress, "totalWeight", totalWeight) - return []nodeWeight{{nodeId: "unknown", weight: totalWeight}}, totalWeight + return nil, 0 } - // Build per-node weights from distribution nodeWeightsSlice := make([]nodeWeight, 0, len(distribution.Weights)) for _, w := range distribution.Weights { - scaledWeight := mathsdk.LegacyNewDec(int64(w.Weight)).Mul(wc.WeightScaleFactor).TruncateInt64() + scaledWeight := mathsdk.LegacyNewDec(int64(w.Weight)).Mul(combinedFactor).TruncateInt64() nodeWeightsSlice = append(nodeWeightsSlice, nodeWeight{nodeId: w.NodeId, weight: scaledWeight}) } sort.Slice(nodeWeightsSlice, func(i, j int) bool { return nodeWeightsSlice[i].nodeId < nodeWeightsSlice[j].nodeId }) + wc.Logger.LogInfo("Calculate: Calculating participant weight", types.PoC, + "participant", participantAddress, + "weightScaleFactor", combinedFactor, + "timeNormalizationFactor", wc.TimeNormalizationFactor, + "count", commit.Count, + "combinedFactor", combinedFactor, + "totalWeight", totalWeight, + ) return nodeWeightsSlice, totalWeight } @@ -820,8 +926,47 @@ func (am AppModule) ComputeNewWeights(ctx context.Context, upcomingEpoch types.E "guardianEnabled", guardianEnabled, "guardianAccAddrs", guardianAccAddrs) + var appHash string + var validationSlots int + timeNormalizationFactor := mathsdk.LegacyOneDec() + + snapshot, snapshotFound, _ := am.keeper.GetPoCValidationSnapshot(ctx, epochStartBlockHeight) + if snapshotFound { + if params.PocParams.ValidationSlots > 0 { + appHash = snapshot.AppHash + validationSlots = int(params.PocParams.ValidationSlots) + } + if params.PocParams.PocNormalizationEnabled { + timeNormalizationFactor = CalculateTimeNormalizationFactor( + snapshot.GenerationStartTimestamp, + snapshot.ExchangeEndTimestamp, + params.EpochParams.PocStageDuration, + params.EpochParams.PocExchangeDuration, + ) + } + am.LogInfo("ComputeNewWeights: Using validation snapshot", types.PoC, + "appHash", appHash, + "validationSlots", validationSlots, + "generationStartTimestamp", snapshot.GenerationStartTimestamp, + "exchangeEndTimestamp", snapshot.ExchangeEndTimestamp, + "timeNormalizationFactor", timeNormalizationFactor.String(), + "pocNormalizationEnabled", params.PocParams.PocNormalizationEnabled, + ) + } else { + am.LogWarn("ComputeNewWeights: Validation snapshot not found", types.PoC, + "epochStartBlockHeight", epochStartBlockHeight, + ) + } + + weightsForCalculator := currentValidatorWeights + if snapshotFound && validationSlots > 0 && len(snapshot.ValidatorWeights) > 0 { + weightsForCalculator = validatorWeightsSliceToMap(snapshot.ValidatorWeights) + am.LogInfo("ComputeNewWeights: Using snapshot weights for calculator", types.PoC, + "numValidators", len(weightsForCalculator)) + } + calculator := NewWeightCalculator( - currentValidatorWeights, + weightsForCalculator, allowedCommits, allowedDistributions, validations, @@ -830,8 +975,11 @@ func (am AppModule) ComputeNewWeights(ctx context.Context, upcomingEpoch types.E epochStartBlockHeight, am, weightScaleFactor, + timeNormalizationFactor, guardianEnabled, guardianSet, + appHash, + validationSlots, ) pocMiningParticipants := calculator.Calculate() @@ -914,8 +1062,9 @@ func (am AppModule) filterStoreCommitsFromInferenceNodes( distribution, hasDistribution := allDistributions[participantAddress] if !hasDistribution || len(distribution.Weights) == 0 { - // No distribution - keep the commit as-is - filteredCommits[participantAddress] = commit + am.LogWarn("filterStoreCommitsFromInferenceNodes: No distribution, cannot filter inference nodes, skipping", types.PoC, + "participantAddress", participantAddress, + "commitCount", commit.Count) continue } @@ -960,3 +1109,11 @@ func (am AppModule) filterStoreCommitsFromInferenceNodes( return filteredCommits, filteredDistributions } + +func validatorWeightsSliceToMap(weights []*types.ValidatorWeight) map[string]int64 { + result := make(map[string]int64, len(weights)) + for _, w := range weights { + result[w.Address] = w.Weight + } + return result +} diff --git a/inference-chain/x/inference/module/chainvalidation_test.go b/inference-chain/x/inference/module/chainvalidation_test.go index bfb11e06e..28c82c361 100644 --- a/inference-chain/x/inference/module/chainvalidation_test.go +++ b/inference-chain/x/inference/module/chainvalidation_test.go @@ -38,6 +38,7 @@ func TestComputeNewWeightsWithStakingValidators(t *testing.T) { println(validatorAccAddress2) // Create validators to be returned by the staking keeper + // validator2 has 201 tokens so a single valid vote exceeds 2/3 threshold (201 > 301*2/3 = 200.67) validators := []stakingtypes.Validator{ { OperatorAddress: validatorOperatorAddress1, @@ -47,7 +48,7 @@ func TestComputeNewWeightsWithStakingValidators(t *testing.T) { { OperatorAddress: validatorOperatorAddress2, ConsensusPubkey: &codectypes.Any{}, - Tokens: math.NewInt(200), + Tokens: math.NewInt(201), }, } @@ -87,10 +88,10 @@ func TestComputeNewWeightsWithStakingValidators(t *testing.T) { // Set up weight distribution (per-node weights) setWeightDistribution(ctx, k, testutil.Executor2, 100, []nodeDistWeight{{"node-1", 1}}) - // Set up V2 validations + // Set up V2 validation - need >2/3 of total weight (300) to pass, so 201 is sufficient validation := types.PoCValidationV2{ ParticipantAddress: testutil.Executor2, - ValidatorParticipantAddress: validatorAccAddress2, // Set validation only for participant with large weight + ValidatorParticipantAddress: validatorAccAddress2, PocStageStartBlockHeight: 100, ValidatedWeight: 100, } diff --git a/inference-chain/x/inference/module/chainvalidation_v1_test.go b/inference-chain/x/inference/module/chainvalidation_v1_test.go index 61c04c4fc..e03627616 100644 --- a/inference-chain/x/inference/module/chainvalidation_v1_test.go +++ b/inference-chain/x/inference/module/chainvalidation_v1_test.go @@ -28,6 +28,7 @@ func TestComputeNewWeightsV1WithStakingValidators(t *testing.T) { require.NoError(t, err, "Failed to convert operator address to account address") // Create validators to be returned by the staking keeper + // validator2 has 201 tokens so a single valid vote exceeds 2/3 threshold (201 > 301*2/3 = 200.67) validators := []stakingtypes.Validator{ { OperatorAddress: validatorOperatorAddress1, @@ -37,7 +38,7 @@ func TestComputeNewWeightsV1WithStakingValidators(t *testing.T) { { OperatorAddress: validatorOperatorAddress2, ConsensusPubkey: &codectypes.Any{}, - Tokens: math.NewInt(200), + Tokens: math.NewInt(201), }, } diff --git a/inference-chain/x/inference/module/confirmation_poc.go b/inference-chain/x/inference/module/confirmation_poc.go index 8332b5e12..fd1df4593 100644 --- a/inference-chain/x/inference/module/confirmation_poc.go +++ b/inference-chain/x/inference/module/confirmation_poc.go @@ -18,6 +18,8 @@ import ( const safetyWindow = 50 +var pocDeviationCoeff = decimal.New(909, -3) + // handleConfirmationPoC manages confirmation PoC trigger decisions and phase transitions func (am AppModule) handleConfirmationPoC(ctx context.Context, blockHeight int64) error { sdkCtx := sdk.UnwrapSDKContext(ctx) @@ -107,6 +109,11 @@ func (am AppModule) checkConfirmationPoCTrigger( if upgradeProtectionWindow <= 0 { upgradeProtectionWindow = 500 // Default to 500 blocks if not set } + // Check if current epoch is a grace epoch with extended protection window + if graceParams, ok := am.keeper.GetPunishmentGraceEpoch(ctx, epochContext.EpochIndex); ok && graceParams.UpgradeProtectionWindow > 0 { + upgradeProtectionWindow = graceParams.UpgradeProtectionWindow + am.LogDebug("using grace UpgradeProtectionWindow", types.PoC, "epoch", epochContext.EpochIndex, "window", upgradeProtectionWindow) + } hasUpgrade, reason, err := am.keeper.HasUpgradeInWindow(ctx, blockHeight, upgradeProtectionWindow) if err != nil { return fmt.Errorf("failed to check upgrade window: %w", err) @@ -256,6 +263,8 @@ func (am AppModule) handleConfirmationPoCPhaseTransitions( transitionCount++ transitions = append(transitions, "GRACE_PERIOD->GENERATION") + am.captureGenerationStartTimestamp(ctx, sdkCtx.BlockTime().Unix(), event.TriggerHeight) + am.LogInfo("Confirmation PoC: GRACE_PERIOD -> GENERATION", types.PoC, "epochIndex", event.EpochIndex, "eventSequence", event.EventSequence, @@ -266,6 +275,8 @@ func (am AppModule) handleConfirmationPoCPhaseTransitions( // GENERATION -> VALIDATION transition if event.ShouldTransitionToValidation(blockHeight, epochParams) { + am.captureValidationSnapshot(ctx, blockHeight, event.TriggerHeight, "confirmation PoC") + event.Phase = types.ConfirmationPoCPhase_CONFIRMATION_POC_VALIDATION updated = true transitionCount++ @@ -304,6 +315,9 @@ func (am AppModule) handleConfirmationPoCPhaseTransitions( if event.Phase == types.ConfirmationPoCPhase_CONFIRMATION_POC_COMPLETED { completionHeight := event.GetValidationEnd(epochParams) + 1 if blockHeight >= completionHeight+epochParams.SetNewValidatorsDelay { + // Clean up validation snapshot + am.keeper.DeletePoCValidationSnapshot(ctx, event.TriggerHeight) + err := am.keeper.ClearActiveConfirmationPoCEvent(ctx) if err != nil { return fmt.Errorf("failed to clear active confirmation PoC event: %w", err) @@ -524,9 +538,53 @@ func (am AppModule) updateConfirmationWeightsV2( "guardianEnabled", guardianEnabled, "guardianAccAddrs", guardianAccAddrs) - // Create WeightCalculator with store commits and distributions + params, err := am.keeper.GetParams(ctx) + if err != nil { + am.LogError("updateConfirmationWeightsV2: failed to get params", types.PoC, "error", err) + return nil + } + + var appHash string + var validationSlots int + timeNormalizationFactor := mathsdk.LegacyOneDec() + + snapshot, snapshotFound, _ := am.keeper.GetPoCValidationSnapshot(ctx, event.TriggerHeight) + if snapshotFound { + if params.PocParams.ValidationSlots > 0 { + appHash = snapshot.AppHash + validationSlots = int(params.PocParams.ValidationSlots) + } + if params.PocParams.PocNormalizationEnabled { + timeNormalizationFactor = CalculateTimeNormalizationFactor( + snapshot.GenerationStartTimestamp, + snapshot.ExchangeEndTimestamp, + params.EpochParams.PocStageDuration, + params.EpochParams.PocExchangeDuration, + ) + } + am.LogInfo("updateConfirmationWeightsV2: Using validation snapshot", types.PoC, + "appHash", appHash, + "validationSlots", validationSlots, + "generationStartTimestamp", snapshot.GenerationStartTimestamp, + "exchangeEndTimestamp", snapshot.ExchangeEndTimestamp, + "timeNormalizationFactor", timeNormalizationFactor.String(), + "pocNormalizationEnabled", params.PocParams.PocNormalizationEnabled, + ) + } else { + am.LogWarn("updateConfirmationWeightsV2: Validation snapshot not found", types.PoC, + "triggerHeight", event.TriggerHeight, + ) + } + + weightsForCalculator := currentValidatorWeights + if snapshotFound && validationSlots > 0 && len(snapshot.ValidatorWeights) > 0 { + weightsForCalculator = validatorWeightsSliceToMap(snapshot.ValidatorWeights) + am.LogInfo("updateConfirmationWeightsV2: Using snapshot weights for calculator", types.PoC, + "numValidators", len(weightsForCalculator)) + } + calculator := NewWeightCalculator( - currentValidatorWeights, + weightsForCalculator, storeCommits, weightDistributions, validationsV2, @@ -535,8 +593,11 @@ func (am AppModule) updateConfirmationWeightsV2( event.TriggerHeight, am, weightScaleFactor, + timeNormalizationFactor, guardianEnabled, guardianSet, + appHash, + validationSlots, ) // Calculate confirmation weights @@ -571,7 +632,10 @@ func (am AppModule) checkConfirmationSlashing( if notPreservedTotalWeightValue == 0 { participant.CurrentEpochStats.ConfirmationPoCRatio = types.DecimalFromDecimal(decimal.NewFromInt(1)) } else { - participant.CurrentEpochStats.ConfirmationPoCRatio = types.DecimalFromDecimal(decimal.NewFromInt(confirmationWeight).Div(decimal.NewFromInt(notPreservedTotalWeightValue))) + ratio := decimal.NewFromInt(confirmationWeight).Div(decimal.NewFromInt(notPreservedTotalWeightValue)) + // Use pocDeviationCoeff to avoid decreasing rewards for minor deviations + ratio = decimal.Min(ratio.Div(pocDeviationCoeff), decimal.NewFromInt(1)) + participant.CurrentEpochStats.ConfirmationPoCRatio = types.DecimalFromDecimal(ratio) } am.keeper.SetParticipant(ctx, participant) } diff --git a/inference-chain/x/inference/module/model_assignment.go b/inference-chain/x/inference/module/model_assignment.go index 660677f51..7388e9417 100644 --- a/inference-chain/x/inference/module/model_assignment.go +++ b/inference-chain/x/inference/module/model_assignment.go @@ -275,6 +275,7 @@ type KeeperForModelAssigner interface { GetHardwareNodes(ctx context.Context, participantId string) (*types.HardwareNodes, bool) GetActiveParticipants(ctx context.Context, epochId uint64) (val types.ActiveParticipants, found bool) GetEpochGroupData(ctx context.Context, epochIndex uint64, modelId string) (val types.EpochGroupData, found bool) + GetSettleAmount(ctx context.Context, participant string) (val types.SettleAmount, found bool) GetParams(ctx context.Context) (types.Params, error) } @@ -405,10 +406,22 @@ func (ma *ModelAssigner) AllocateMLNodesForPoC(ctx context.Context, upcomingEpoc sortedModelIds := sortedKeys(uniqueModels) if upcomingEpoch.Index > 0 { + previousEpochIndex := upcomingEpoch.Index - 1 for _, modelId := range sortedModelIds { - previousEpochGroupData, found := ma.keeper.GetEpochGroupData(ctx, upcomingEpoch.Index-1, modelId) + previousEpochGroupData, found := ma.keeper.GetEpochGroupData(ctx, previousEpochIndex, modelId) if found { for _, vw := range previousEpochGroupData.ValidationWeights { + // Use keeper settlement results: zero reward despite having weight => slashed (downtime/confirmation). + // Settlement was performed before model assignment, so we need to check the settle amount here. + settle, foundSettle := ma.keeper.GetSettleAmount(ctx, vw.MemberAddress) + if !foundSettle || settle.EpochIndex != previousEpochIndex || settle.RewardCoins == 0 { + // Skip participants if they didn't get reward for the previous epoch + // Only rewarded participants can be eligible for POC_SLOT=true allocation + // Participants that are not added to previousEpochData will be filtered by filterEligibleMLNodes + ma.LogInfo("Collecting rewarded participants", types.Allocation, "flow_context", FlowContext, "sub_flow_context", SubFlowContext, + "step", "filter_rewarded_participants", "participant_without_reward", vw.MemberAddress) + continue + } dedupedNodes, dedupStats := dedupMLNodesById(vw.MlNodes) ma.logMLNodeDedupStats( "Duplicate ML nodes detected in previous epoch data", @@ -418,7 +431,7 @@ func (ma *ModelAssigner) AllocateMLNodesForPoC(ctx context.Context, upcomingEpoc "step", "dedup_previous_epoch_nodes", "model_id", modelId, "participant", vw.MemberAddress, - "epoch_index", upcomingEpoch.Index-1, + "epoch_index", previousEpochIndex, ) previousEpochData.Set(modelId, vw.MemberAddress, dedupedNodes) } @@ -455,6 +468,8 @@ func (ma *ModelAssigner) AllocateMLNodesForPoC(ctx context.Context, upcomingEpoc } ma.LogInfo("Built current epoch data map", types.Allocation, "flow_context", FlowContext, "sub_flow_context", SubFlowContext, "step", "build_current_epoch_data", "num_models", len(currentEpochData.Models())) + // Participants not in previousEpochData (no nodes in previous epoch for a model) cannot be selected as eligible: + // sampleEligibleParticipantsWithHistory only appends participants that have previousEpochData.GetForParticipant(modelId, addr) != nil. eligibleNodesData := ma.filterEligibleMLNodes(upcomingEpoch, previousEpochData, currentEpochData, totalCurrentEpochWeight) ma.LogInfo("Filtered eligible nodes for all models", types.Allocation, "flow_context", FlowContext, "sub_flow_context", SubFlowContext, "step", "filter_all_eligible", "num_models", len(eligibleNodesData.Models())) @@ -1014,6 +1029,9 @@ func calculateEffectiveNodeThreshold(participantThreshold, globalThreshold int64 return min(participantThreshold, globalThreshold) } +// sampleEligibleParticipantsWithHistory selects N/2+1 eligible participants per model. +// Only participants present in previousEpochData for this model can be selected; participants +// who did not work in the previous epoch (not in previousEpochData) are skipped and cannot be eligible. func (ma *ModelAssigner) sampleEligibleParticipantsWithHistory( sortedParticipantAddrs []string, previousEpochData *EpochMLNodeData, diff --git a/inference-chain/x/inference/module/model_assignment_test.go b/inference-chain/x/inference/module/model_assignment_test.go index bed189763..50bd96f27 100644 --- a/inference-chain/x/inference/module/model_assignment_test.go +++ b/inference-chain/x/inference/module/model_assignment_test.go @@ -16,6 +16,7 @@ type mockKeeperForModelAssigner struct { hardwareNodes map[string]*types.HardwareNodes governanceModels []types.Model epochGroupData map[string]map[uint64]types.EpochGroupData // modelId -> epochIndex -> data + settleAmounts map[string]types.SettleAmount // participant -> settle (optional; when set, participants count as rewarded for previous epoch) params *types.Params } @@ -45,6 +46,15 @@ func (m *mockKeeperForModelAssigner) GetEpochGroupData(ctx context.Context, epoc return types.EpochGroupData{}, false } +func (m *mockKeeperForModelAssigner) GetSettleAmount(ctx context.Context, participant string) (val types.SettleAmount, found bool) { + if m.settleAmounts != nil { + if s, ok := m.settleAmounts[participant]; ok { + return s, true + } + } + return types.SettleAmount{}, false +} + func (m *mockKeeperForModelAssigner) GetParams(ctx context.Context) (types.Params, error) { if m.params != nil { return *m.params, nil @@ -1055,11 +1065,24 @@ func TestAllocateMLNodesForPoC_FairDistribution(t *testing.T) { 0: {ValidationWeights: previousValidationWeights}, } + // Settle amounts for previous epoch (epoch 0): all participants rewarded so they are eligible for POC_SLOT allocation + previousEpochIndex := uint64(0) + settleAmounts := make(map[string]types.SettleAmount, numParticipants) + for i := 0; i < numParticipants; i++ { + participantID := formatParticipantID(i) + settleAmounts[participantID] = types.SettleAmount{ + Participant: participantID, + EpochIndex: previousEpochIndex, + RewardCoins: 1, + } + } + // Setup mock keeper mockKeeper := &mockKeeperForModelAssigner{ governanceModels: []types.Model{{Id: modelID}}, hardwareNodes: hardwareNodesMap, epochGroupData: previousEpochGroupData, + settleAmounts: settleAmounts, params: &types.Params{ EpochParams: &types.EpochParams{ PocSlotAllocation: &types.Decimal{Value: 5, Exponent: -1}, // 0.5 @@ -1252,6 +1275,148 @@ func TestAllocateMLNodesForPoC_FairDistribution(t *testing.T) { } } +// TestAllocateMLNodesForPoC_NoReward_NoEligibleParticipants verifies that when no participants +// have a reward for the previous epoch, none are added to previousEpochData, so there are no +// eligible participants and no POC_SLOT allocation. It covers three ways to be ineligible: +// - no settle amount at all (participant not in settleAmounts) +// - settle amount with RewardCoins == 0 (slashed / no reward) +// - settle amount with reward but for a different epoch (EpochIndex != previousEpoch) +func TestAllocateMLNodesForPoC_NoReward_NoEligibleParticipants(t *testing.T) { + const ( + numParticipants = 20 + nodesPerParticipant = 10 + baseWeight = 10 + modelID = "model-no-reward" + previousEpochIndex = uint64(0) // upcomingEpoch.Index will be 1 + ) + + // Partition participants into three ineligible groups (upcoming epoch = 1, previous = 0): + // - No settle: participants 0-6 -> not in settleAmounts map (GetSettleAmount returns not found) + // - Zero reward: 7-13 -> in map with EpochIndex=0, RewardCoins=0 + // - Wrong epoch: 14-19 -> in map with EpochIndex=2, RewardCoins=1 (reward for wrong epoch) + const ( + noSettleEnd = 7 // 0..6 + zeroRewardEnd = 14 // 7..13 + wrongEpochStart = 14 // 14..19 + ) + + ctx := context.Background() + + var participants []*types.ActiveParticipant + hardwareNodesMap := make(map[string]*types.HardwareNodes) + previousEpochGroupData := make(map[string]map[uint64]types.EpochGroupData) + previousValidationWeights := make([]*types.ValidationWeight, 0, numParticipants) + + for i := 0; i < numParticipants; i++ { + participantID := formatParticipantID(i) + + hardwareNodes := make([]*types.HardwareNode, nodesPerParticipant) + mlNodes := make([]*types.MLNodeInfo, nodesPerParticipant) + previousMLNodes := make([]*types.MLNodeInfo, nodesPerParticipant) + + for j := 0; j < nodesPerParticipant; j++ { + nodeID := formatNodeID(i, j) + weight := int64(baseWeight) + if j%2 == 0 { + weight = int64(baseWeight * 2) + } + + hardwareNodes[j] = &types.HardwareNode{LocalId: nodeID, Models: []string{modelID}} + mlNodes[j] = &types.MLNodeInfo{NodeId: nodeID, PocWeight: weight, TimeslotAllocation: []bool{true, false}} + previousMLNodes[j] = &types.MLNodeInfo{NodeId: nodeID, PocWeight: weight} + } + + participantWeight := int64(nodesPerParticipant * baseWeight * 3 / 2) + participants = append(participants, &types.ActiveParticipant{ + Index: participantID, + Models: []string{modelID}, + MlNodes: []*types.ModelMLNodes{{MlNodes: mlNodes}}, + Weight: participantWeight, + }) + + hardwareNodesMap[participantID] = &types.HardwareNodes{Participant: participantID, HardwareNodes: hardwareNodes} + previousValidationWeights = append(previousValidationWeights, &types.ValidationWeight{ + MemberAddress: participantID, + MlNodes: previousMLNodes, + }) + } + + previousEpochGroupData[modelID] = map[uint64]types.EpochGroupData{ + 0: {ValidationWeights: previousValidationWeights}, + } + + // settleAmounts is non-nil but only contains entries that still make everyone ineligible: + // - participants 0-6: omitted (no settle) -> GetSettleAmount returns not found + // - participants 7-13: EpochIndex=previousEpoch, RewardCoins=0 -> skipped (zero reward) + // - participants 14-19: EpochIndex=2, RewardCoins=1 -> skipped (wrong epoch) + settleAmounts := make(map[string]types.SettleAmount) + for i := noSettleEnd; i < zeroRewardEnd; i++ { + participantID := formatParticipantID(i) + settleAmounts[participantID] = types.SettleAmount{ + Participant: participantID, + EpochIndex: previousEpochIndex, + RewardCoins: 0, // zero reward => ineligible + } + } + for i := wrongEpochStart; i < numParticipants; i++ { + participantID := formatParticipantID(i) + settleAmounts[participantID] = types.SettleAmount{ + Participant: participantID, + EpochIndex: previousEpochIndex + 2, // wrong epoch (e.g. 2 when previous is 0) + RewardCoins: 1, + } + } + + t.Logf("Ineligible groups: no settle (0..%d), zero reward (%d..%d), wrong epoch (%d..%d)", + noSettleEnd-1, noSettleEnd, zeroRewardEnd-1, wrongEpochStart, numParticipants-1) + + mockKeeper := &mockKeeperForModelAssigner{ + governanceModels: []types.Model{{Id: modelID}}, + hardwareNodes: hardwareNodesMap, + epochGroupData: previousEpochGroupData, + settleAmounts: settleAmounts, + params: &types.Params{ + EpochParams: &types.EpochParams{ + PocSlotAllocation: &types.Decimal{Value: 5, Exponent: -1}, + }, + }, + } + + modelAssigner := NewModelAssigner(mockKeeper, mockLogger{}) + upcomingEpoch := types.Epoch{Index: 1} + + modelAssigner.setModelsForParticipants(ctx, participants, upcomingEpoch) + modelAssigner.AllocateMLNodesForPoC(ctx, upcomingEpoch, participants) + + var globalTotalNodes int + var globalAllocatedNodes int + var globalAllocatedWeight int64 + participantsWithAllocation := 0 + + for _, participant := range participants { + require.Len(t, participant.MlNodes, 1) + participantHasAllocation := false + for _, node := range participant.MlNodes[0].MlNodes { + globalTotalNodes++ + if len(node.TimeslotAllocation) > 1 && node.TimeslotAllocation[1] { + globalAllocatedNodes++ + globalAllocatedWeight += node.PocWeight + participantHasAllocation = true + } + } + if participantHasAllocation { + participantsWithAllocation++ + } + } + + t.Logf("No-reward scenario: total nodes=%d, allocated nodes=%d, allocated weight=%d, participants with allocation=%d", + globalTotalNodes, globalAllocatedNodes, globalAllocatedWeight, participantsWithAllocation) + + require.Equal(t, 0, globalAllocatedNodes, "No nodes should have POC_SLOT=true when no participants have reward") + require.Equal(t, int64(0), globalAllocatedWeight, "Allocated weight should be 0 when no participants have reward") + require.Equal(t, 0, participantsWithAllocation, "No participant should have any POC_SLOT allocation") +} + // Helper functions for test func formatParticipantID(index int) string { return fmt.Sprintf("participant%03d", index) @@ -1777,6 +1942,12 @@ func TestAllocateMLNodesForPoC_MixedUniformAndHeterogeneous(t *testing.T) { }, }, }, + // All participants rewarded in previous epoch (epoch 0) so they are eligible for POC_SLOT allocation + settleAmounts: map[string]types.SettleAmount{ + "participant1": {Participant: "participant1", EpochIndex: 0, RewardCoins: 1}, + "participant2": {Participant: "participant2", EpochIndex: 0, RewardCoins: 1}, + "participant3": {Participant: "participant3", EpochIndex: 0, RewardCoins: 1}, + }, params: &types.Params{ EpochParams: &types.EpochParams{ PocSlotAllocation: &types.Decimal{Value: 5, Exponent: -1}, // 50% diff --git a/inference-chain/x/inference/module/module.go b/inference-chain/x/inference/module/module.go index 17b0bc34e..836371dc8 100644 --- a/inference-chain/x/inference/module/module.go +++ b/inference-chain/x/inference/module/module.go @@ -1,9 +1,12 @@ package inference import ( + "cmp" "context" + "encoding/hex" "encoding/json" "fmt" + "slices" "cosmossdk.io/core/appmodule" "cosmossdk.io/core/store" @@ -425,6 +428,18 @@ func (am AppModule) EndBlock(ctx context.Context) error { am.LogError("Unable to create epoch group", types.EpochGroup, "error", err.Error()) return err } + + am.captureGenerationStartTimestamp(ctx, blockTime, upcomingEpoch.PocStartBlockHeight) + } + + // Capture validation snapshot at poc_validation_start for deterministic sampling + if epochContext.IsStartOfPoCValidationStage(blockHeight) { + upcomingEpoch, found := am.keeper.GetUpcomingEpoch(ctx) + if found && upcomingEpoch != nil { + am.captureValidationSnapshot(ctx, blockHeight, upcomingEpoch.PocStartBlockHeight, "regular PoC") + } else { + am.LogError("captureValidationSnapshot: Unable to get upcoming epoch", types.PoC) + } } if currentEpochGroup.IsChanged(ctx) { @@ -520,66 +535,43 @@ func (am AppModule) onEndOfPoCValidationStage(ctx context.Context, blockHeight i return } var activeParticipants []*types.ActiveParticipant - - if upcomingEpoch.Index == 170 { - currentActiveParticipants, found := am.keeper.GetActiveParticipants(ctx, 169) - if !found { - am.LogError("onEndOfPoCValidationStage: Unable to get active participants", types.EpochGroup) - panic("Unable to get active participants") - } - previousActiveParticipants := currentActiveParticipants.Participants - activeParticipants = make([]*types.ActiveParticipant, 0) - for _, participant := range previousActiveParticipants { - am.LogInfo("onEndOfPoCValidationStage: participant", types.EpochGroup, "participant.Index", participant.Index, "participant.Weight", participant.Weight) - - seed, found := am.keeper.GetRandomSeed(ctx, upcomingEpoch.Index, participant.Index) - if !found { - am.LogError("onEndOfPoCValidationStage: Unable to get seed", types.EpochGroup, "participant.Index", participant.Index) - continue - } - participant.Seed = &seed - activeParticipants = append(activeParticipants, participant) - am.LogInfo("onEndOfPoCValidationStage: seed", types.EpochGroup, "seed.EpochIndex", seed.EpochIndex, "seed.Participant", seed.Participant, "seed.Signature", seed.Signature) - } + if params.PocParams.PocV2Enabled { + activeParticipants = am.ComputeNewWeights(ctx, *upcomingEpoch) } else { - if params.PocParams.PocV2Enabled { - activeParticipants = am.ComputeNewWeights(ctx, *upcomingEpoch) - } else { - activeParticipants = am.ComputeNewWeightsV1(ctx, *upcomingEpoch) - } - if activeParticipants == nil { - am.LogError("onEndOfPoCValidationStage: computeResult == nil && activeParticipants == nil", types.PoC) - return - } - - modelAssigner := NewModelAssigner(am.keeper, am.keeper) - modelAssigner.setModelsForParticipants(ctx, activeParticipants, *upcomingEpoch) + activeParticipants = am.ComputeNewWeightsV1(ctx, *upcomingEpoch) + } + if activeParticipants == nil { + am.LogError("onEndOfPoCValidationStage: computeResult == nil && activeParticipants == nil", types.PoC) + return + } - // Adjust weights based on collateral after the grace period. This modifies the weights in-place. - if err := am.keeper.AdjustWeightsByCollateral(ctx, activeParticipants); err != nil { - am.LogError("onSetNewValidatorsStage: failed to adjust weights by collateral", types.Tokenomics, "error", err) - // Depending on chain policy, we might want to halt on error. For now, we log and continue, - // which means participants will proceed with their unadjusted PotentialWeight. - } + modelAssigner := NewModelAssigner(am.keeper, am.keeper) + modelAssigner.setModelsForParticipants(ctx, activeParticipants, *upcomingEpoch) - // Apply universal power capping to epoch powers - activeParticipants = am.applyEpochPowerCapping(ctx, activeParticipants) + // Adjust weights based on collateral after the grace period. This modifies the weights in-place. + if err := am.keeper.AdjustWeightsByCollateral(ctx, activeParticipants); err != nil { + am.LogError("onSetNewValidatorsStage: failed to adjust weights by collateral", types.Tokenomics, "error", err) + // Depending on chain policy, we might want to halt on error. For now, we log and continue, + // which means participants will proceed with their unadjusted PotentialWeight. + } - modelAssigner.AllocateMLNodesForPoC(ctx, *upcomingEpoch, activeParticipants) - am.LogInfo("Finished PoC allocation for all participants", types.EpochGroup, "step", "poc_allocation_complete") + // Apply universal power capping to epoch powers + activeParticipants = am.applyEpochPowerCapping(ctx, activeParticipants) - err = am.RegisterTopMiners(ctx, activeParticipants, blockTime) - if err != nil { - am.LogError("onEndOfPoCValidationStage: Unable to register top miners", types.Tokenomics, "error", err.Error()) - return - } + modelAssigner.AllocateMLNodesForPoC(ctx, *upcomingEpoch, activeParticipants) + am.LogInfo("Finished PoC allocation for all participants", types.EpochGroup, "step", "poc_allocation_complete") - am.LogInfo("onEndOfPoCValidationStage: computed new weights", types.Stages, - "upcomingEpoch.Index", upcomingEpoch.Index, - "PocStartBlockHeight", upcomingEpoch.PocStartBlockHeight, - "len(activeParticipants)", len(activeParticipants)) + err = am.RegisterTopMiners(ctx, activeParticipants, blockTime) + if err != nil { + am.LogError("onEndOfPoCValidationStage: Unable to register top miners", types.Tokenomics, "error", err.Error()) + return } + am.LogInfo("onEndOfPoCValidationStage: computed new weights", types.Stages, + "upcomingEpoch.Index", upcomingEpoch.Index, + "PocStartBlockHeight", upcomingEpoch.PocStartBlockHeight, + "len(activeParticipants)", len(activeParticipants)) + err = am.keeper.SetActiveParticipants(ctx, types.ActiveParticipants{ Participants: activeParticipants, EpochGroupId: upcomingEpoch.Index, @@ -648,6 +640,79 @@ func (am AppModule) onSetNewValidatorsStage(ctx context.Context, blockHeight int // TODO: Move this so active participants are set 1 block before new validators am.moveUpcomingToEffectiveGroup(ctx, blockHeight, unitOfComputePrice) + + // Clean up validation snapshot after epoch transition + am.keeper.DeletePoCValidationSnapshot(ctx, upcomingEpoch.PocStartBlockHeight) +} + +func (am AppModule) captureGenerationStartTimestamp(ctx context.Context, blockTime, pocStartBlockHeight int64) { + snapshot := types.PoCValidationSnapshot{ + PocStageStartHeight: pocStartBlockHeight, + GenerationStartTimestamp: blockTime, + } + if err := am.keeper.SetPoCValidationSnapshot(ctx, snapshot); err != nil { + am.LogError("captureGenerationStartTimestamp: Failed to store", types.PoC, "error", err) + return + } + am.LogInfo("captureGenerationStartTimestamp: Stored", types.PoC, + "pocStartBlockHeight", pocStartBlockHeight, + "generationStartTimestamp", blockTime) +} + +// captureValidationSnapshot stores validator weights and app_hash at validation phase start +// for deterministic sampling synchronization between chain and DAPI. +// Used by both regular PoC and confirmation PoC. +func (am AppModule) captureValidationSnapshot(ctx context.Context, blockHeight, snapshotKey int64, logContext string) { + sdkCtx := sdk.UnwrapSDKContext(ctx) + blockTime := sdkCtx.BlockTime().Unix() + + currentValidatorWeights, err := am.getCurrentValidatorWeights(ctx) + if err != nil { + am.LogError("captureValidationSnapshot: Failed to get validator weights", types.PoC, + "context", logContext, "error", err) + return + } + + var generationStartTimestamp int64 + existingSnapshot, found, _ := am.keeper.GetPoCValidationSnapshot(ctx, snapshotKey) + if found { + generationStartTimestamp = existingSnapshot.GenerationStartTimestamp + } + + snapshot := types.PoCValidationSnapshot{ + PocStageStartHeight: snapshotKey, + SnapshotHeight: blockHeight, + AppHash: hex.EncodeToString(sdkCtx.HeaderInfo().AppHash), + ValidatorWeights: validatorWeightsMapToSlice(currentValidatorWeights), + GenerationStartTimestamp: generationStartTimestamp, + ExchangeEndTimestamp: blockTime, + } + + if err := am.keeper.SetPoCValidationSnapshot(ctx, snapshot); err != nil { + am.LogError("captureValidationSnapshot: Failed to store snapshot", types.PoC, + "context", logContext, "error", err) + return + } + + am.LogInfo("captureValidationSnapshot: Stored validation snapshot", types.PoC, + "context", logContext, + "snapshotKey", snapshotKey, + "snapshotHeight", blockHeight, + "numValidators", len(currentValidatorWeights), + "generationStartTimestamp", generationStartTimestamp, + "exchangeEndTimestamp", blockTime, + ) +} + +func validatorWeightsMapToSlice(weights map[string]int64) []*types.ValidatorWeight { + result := make([]*types.ValidatorWeight, 0, len(weights)) + for addr, w := range weights { + result = append(result, &types.ValidatorWeight{Address: addr, Weight: w}) + } + slices.SortFunc(result, func(a, b *types.ValidatorWeight) int { + return cmp.Compare(a.Address, b.Address) + }) + return result } func (am AppModule) addEpochMembers(ctx context.Context, upcomingEg *epochgroup.EpochGroup, activeParticipants []*types.ActiveParticipant) { diff --git a/inference-chain/x/inference/types/grace_epoch_params.pb.go b/inference-chain/x/inference/types/grace_epoch_params.pb.go new file mode 100644 index 000000000..2a5096743 --- /dev/null +++ b/inference-chain/x/inference/types/grace_epoch_params.pb.go @@ -0,0 +1,404 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: inference/inference/grace_epoch_params.proto + +package types + +import ( + fmt "fmt" + _ "github.com/cosmos/gogoproto/gogoproto" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +type GraceEpochParams struct { + EpochIndex uint64 `protobuf:"varint,1,opt,name=epoch_index,json=epochIndex,proto3" json:"epoch_index,omitempty"` + BinomTestP0 *Decimal `protobuf:"bytes,2,opt,name=binom_test_p0,json=binomTestP0,proto3" json:"binom_test_p0,omitempty"` + UpgradeProtectionWindow int64 `protobuf:"varint,3,opt,name=upgrade_protection_window,json=upgradeProtectionWindow,proto3" json:"upgrade_protection_window,omitempty"` +} + +func (m *GraceEpochParams) Reset() { *m = GraceEpochParams{} } +func (m *GraceEpochParams) String() string { return proto.CompactTextString(m) } +func (*GraceEpochParams) ProtoMessage() {} +func (*GraceEpochParams) Descriptor() ([]byte, []int) { + return fileDescriptor_fbbeb4d5d66c4499, []int{0} +} +func (m *GraceEpochParams) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *GraceEpochParams) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_GraceEpochParams.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 *GraceEpochParams) XXX_Merge(src proto.Message) { + xxx_messageInfo_GraceEpochParams.Merge(m, src) +} +func (m *GraceEpochParams) XXX_Size() int { + return m.Size() +} +func (m *GraceEpochParams) XXX_DiscardUnknown() { + xxx_messageInfo_GraceEpochParams.DiscardUnknown(m) +} + +var xxx_messageInfo_GraceEpochParams proto.InternalMessageInfo + +func (m *GraceEpochParams) GetEpochIndex() uint64 { + if m != nil { + return m.EpochIndex + } + return 0 +} + +func (m *GraceEpochParams) GetBinomTestP0() *Decimal { + if m != nil { + return m.BinomTestP0 + } + return nil +} + +func (m *GraceEpochParams) GetUpgradeProtectionWindow() int64 { + if m != nil { + return m.UpgradeProtectionWindow + } + return 0 +} + +func init() { + proto.RegisterType((*GraceEpochParams)(nil), "inference.inference.GraceEpochParams") +} + +func init() { + proto.RegisterFile("inference/inference/grace_epoch_params.proto", fileDescriptor_fbbeb4d5d66c4499) +} + +var fileDescriptor_fbbeb4d5d66c4499 = []byte{ + // 282 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0xd2, 0xc9, 0xcc, 0x4b, 0x4b, + 0x2d, 0x4a, 0xcd, 0x4b, 0x4e, 0xd5, 0x47, 0xb0, 0xd2, 0x8b, 0x12, 0x93, 0x53, 0xe3, 0x53, 0x0b, + 0xf2, 0x93, 0x33, 0xe2, 0x0b, 0x12, 0x8b, 0x12, 0x73, 0x8b, 0xf5, 0x0a, 0x8a, 0xf2, 0x4b, 0xf2, + 0x85, 0x84, 0xe1, 0x6a, 0xf4, 0xe0, 0x2c, 0x29, 0x91, 0xf4, 0xfc, 0xf4, 0x7c, 0xb0, 0xbc, 0x3e, + 0x88, 0x05, 0x51, 0x2a, 0xa5, 0x80, 0xcd, 0x60, 0x64, 0xc3, 0x94, 0x36, 0x32, 0x72, 0x09, 0xb8, + 0x83, 0x6c, 0x72, 0x05, 0x59, 0x14, 0x00, 0x96, 0x12, 0x92, 0xe7, 0xe2, 0x86, 0xd8, 0x9b, 0x99, + 0x97, 0x92, 0x5a, 0x21, 0xc1, 0xa8, 0xc0, 0xa8, 0xc1, 0x12, 0xc4, 0x05, 0x16, 0xf2, 0x04, 0x89, + 0x08, 0x39, 0x70, 0xf1, 0x26, 0x65, 0xe6, 0xe5, 0xe7, 0xc6, 0x97, 0xa4, 0x16, 0x97, 0xc4, 0x17, + 0x18, 0x48, 0x30, 0x29, 0x30, 0x6a, 0x70, 0x1b, 0xc9, 0xe8, 0x61, 0x71, 0x9a, 0x9e, 0x4b, 0x6a, + 0x72, 0x66, 0x6e, 0x62, 0x4e, 0x10, 0x37, 0x58, 0x4b, 0x48, 0x6a, 0x71, 0x49, 0x80, 0x81, 0x90, + 0x15, 0x97, 0x64, 0x69, 0x41, 0x7a, 0x51, 0x62, 0x4a, 0x6a, 0x3c, 0xc8, 0x21, 0xa9, 0xc9, 0x25, + 0x99, 0xf9, 0x79, 0xf1, 0xe5, 0x99, 0x79, 0x29, 0xf9, 0xe5, 0x12, 0xcc, 0x0a, 0x8c, 0x1a, 0xcc, + 0x41, 0xe2, 0x50, 0x05, 0x01, 0x70, 0xf9, 0x70, 0xb0, 0xb4, 0x93, 0xff, 0x89, 0x47, 0x72, 0x8c, + 0x17, 0x1e, 0xc9, 0x31, 0x3e, 0x78, 0x24, 0xc7, 0x38, 0xe1, 0xb1, 0x1c, 0xc3, 0x85, 0xc7, 0x72, + 0x0c, 0x37, 0x1e, 0xcb, 0x31, 0x44, 0x99, 0xa6, 0x67, 0x96, 0x64, 0x94, 0x26, 0xe9, 0x25, 0xe7, + 0xe7, 0xea, 0x17, 0x14, 0xe5, 0xa7, 0x94, 0x26, 0x97, 0x14, 0x27, 0x67, 0xa2, 0xf9, 0xbf, 0x02, + 0x89, 0x5d, 0x52, 0x59, 0x90, 0x5a, 0x9c, 0xc4, 0x06, 0x0e, 0x0b, 0x63, 0x40, 0x00, 0x00, 0x00, + 0xff, 0xff, 0xec, 0x7f, 0x75, 0x31, 0x88, 0x01, 0x00, 0x00, +} + +func (m *GraceEpochParams) 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 *GraceEpochParams) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *GraceEpochParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.UpgradeProtectionWindow != 0 { + i = encodeVarintGraceEpochParams(dAtA, i, uint64(m.UpgradeProtectionWindow)) + i-- + dAtA[i] = 0x18 + } + if m.BinomTestP0 != nil { + { + size, err := m.BinomTestP0.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintGraceEpochParams(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x12 + } + if m.EpochIndex != 0 { + i = encodeVarintGraceEpochParams(dAtA, i, uint64(m.EpochIndex)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func encodeVarintGraceEpochParams(dAtA []byte, offset int, v uint64) int { + offset -= sovGraceEpochParams(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *GraceEpochParams) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.EpochIndex != 0 { + n += 1 + sovGraceEpochParams(uint64(m.EpochIndex)) + } + if m.BinomTestP0 != nil { + l = m.BinomTestP0.Size() + n += 1 + l + sovGraceEpochParams(uint64(l)) + } + if m.UpgradeProtectionWindow != 0 { + n += 1 + sovGraceEpochParams(uint64(m.UpgradeProtectionWindow)) + } + return n +} + +func sovGraceEpochParams(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozGraceEpochParams(x uint64) (n int) { + return sovGraceEpochParams(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *GraceEpochParams) 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 ErrIntOverflowGraceEpochParams + } + 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: GraceEpochParams: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: GraceEpochParams: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field EpochIndex", wireType) + } + m.EpochIndex = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGraceEpochParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.EpochIndex |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field BinomTestP0", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGraceEpochParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthGraceEpochParams + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthGraceEpochParams + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.BinomTestP0 == nil { + m.BinomTestP0 = &Decimal{} + } + if err := m.BinomTestP0.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field UpgradeProtectionWindow", wireType) + } + m.UpgradeProtectionWindow = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowGraceEpochParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.UpgradeProtectionWindow |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipGraceEpochParams(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthGraceEpochParams + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipGraceEpochParams(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGraceEpochParams + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGraceEpochParams + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowGraceEpochParams + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthGraceEpochParams + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupGraceEpochParams + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthGraceEpochParams + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthGraceEpochParams = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowGraceEpochParams = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupGraceEpochParams = fmt.Errorf("proto: unexpected end of group") +) diff --git a/inference-chain/x/inference/types/keys.go b/inference-chain/x/inference/types/keys.go index 5d008d15c..1df979324 100644 --- a/inference-chain/x/inference/types/keys.go +++ b/inference-chain/x/inference/types/keys.go @@ -62,6 +62,8 @@ var ( PoCV2StoreCommitPrefix = collections.NewPrefix(39) MLNodeWeightDistributionPrefix = collections.NewPrefix(40) PocV2EnabledEpochPrefix = collections.NewPrefix(41) + PoCValidationSnapshotPrefix = collections.NewPrefix(42) + PunishmentGraceEpochsPrefix = collections.NewPrefix(43) ParamsKey = []byte("p_inference") ) diff --git a/inference-chain/x/inference/types/params.go b/inference-chain/x/inference/types/params.go index 05f42a904..535d2966f 100644 --- a/inference-chain/x/inference/types/params.go +++ b/inference-chain/x/inference/types/params.go @@ -325,8 +325,8 @@ func (p *EpochParams) Validate() error { if p.PocStageDuration <= 0 { return fmt.Errorf("poc stage duration must be positive") } - if p.PocExchangeDuration <= 0 { - return fmt.Errorf("poc exchange duration must be positive") + if p.PocExchangeDuration < 0 { + return fmt.Errorf("poc exchange duration cannot be negative") } if p.PocValidationDelay < 0 { return fmt.Errorf("poc validation delay cannot be negative") diff --git a/inference-chain/x/inference/types/params.pb.go b/inference-chain/x/inference/types/params.pb.go index acb3e9fb9..96174c044 100644 --- a/inference-chain/x/inference/types/params.pb.go +++ b/inference-chain/x/inference/types/params.pb.go @@ -436,7 +436,7 @@ type EpochParams struct { EpochShift int64 `protobuf:"varint,3,opt,name=epoch_shift,json=epochShift,proto3" json:"epoch_shift,omitempty"` DefaultUnitOfComputePrice int64 `protobuf:"varint,4,opt,name=default_unit_of_compute_price,json=defaultUnitOfComputePrice,proto3" json:"default_unit_of_compute_price,omitempty"` PocStageDuration int64 `protobuf:"varint,5,opt,name=poc_stage_duration,json=pocStageDuration,proto3" json:"poc_stage_duration,omitempty"` - PocExchangeDuration int64 `protobuf:"varint,6,opt,name=poc_exchange_duration,json=pocExchangeDuration,proto3" json:"poc_exchange_duration,omitempty"` + PocExchangeDuration int64 `protobuf:"varint,6,opt,name=poc_exchange_duration,json=pocExchangeDuration,proto3" json:"poc_exchange_duration,omitempty"` // Deprecated: Do not use. PocValidationDelay int64 `protobuf:"varint,7,opt,name=poc_validation_delay,json=pocValidationDelay,proto3" json:"poc_validation_delay,omitempty"` PocValidationDuration int64 `protobuf:"varint,8,opt,name=poc_validation_duration,json=pocValidationDuration,proto3" json:"poc_validation_duration,omitempty"` SetNewValidatorsDelay int64 `protobuf:"varint,9,opt,name=set_new_validators_delay,json=setNewValidatorsDelay,proto3" json:"set_new_validators_delay,omitempty"` @@ -515,6 +515,7 @@ func (m *EpochParams) GetPocStageDuration() int64 { return 0 } +// Deprecated: Do not use. func (m *EpochParams) GetPocExchangeDuration() int64 { if m != nil { return m.PocExchangeDuration @@ -1010,6 +1011,8 @@ type PocParams struct { PocV2Enabled bool `protobuf:"varint,8,opt,name=poc_v2_enabled,json=pocV2Enabled,proto3" json:"poc_v2_enabled,omitempty"` ConfirmationPocV2Enabled bool `protobuf:"varint,9,opt,name=confirmation_poc_v2_enabled,json=confirmationPocV2Enabled,proto3" json:"confirmation_poc_v2_enabled,omitempty"` StatTest *PoCStatTestParams `protobuf:"bytes,10,opt,name=stat_test,json=statTest,proto3" json:"stat_test,omitempty"` + ValidationSlots uint32 `protobuf:"varint,11,opt,name=validation_slots,json=validationSlots,proto3" json:"validation_slots,omitempty"` + PocNormalizationEnabled bool `protobuf:"varint,12,opt,name=poc_normalization_enabled,json=pocNormalizationEnabled,proto3" json:"poc_normalization_enabled,omitempty"` } func (m *PocParams) Reset() { *m = PocParams{} } @@ -1116,6 +1119,20 @@ func (m *PocParams) GetStatTest() *PoCStatTestParams { return nil } +func (m *PocParams) GetValidationSlots() uint32 { + if m != nil { + return m.ValidationSlots + } + return 0 +} + +func (m *PocParams) GetPocNormalizationEnabled() bool { + if m != nil { + return m.PocNormalizationEnabled + } + return false +} + type Decimal struct { Value int64 `protobuf:"varint,1,opt,name=value,proto3" json:"value,omitempty"` Exponent int32 `protobuf:"varint,2,opt,name=exponent,proto3" json:"exponent,omitempty"` @@ -1925,221 +1942,224 @@ func init() { func init() { proto.RegisterFile("inference/inference/params.proto", fileDescriptor_3cf34332021bbe94) } var fileDescriptor_3cf34332021bbe94 = []byte{ - // 3416 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x5a, 0x4b, 0x73, 0x1c, 0x47, - 0x72, 0x16, 0x08, 0x0c, 0x01, 0x24, 0x08, 0x72, 0x50, 0x83, 0xc1, 0x0c, 0x1e, 0x84, 0x28, 0xae, - 0xb4, 0xd6, 0x6b, 0x49, 0x99, 0xbb, 0x6b, 0x39, 0xb4, 0x2b, 0xc6, 0x82, 0x00, 0x44, 0x72, 0x45, - 0x88, 0xe3, 0x06, 0x88, 0xb5, 0x14, 0x0a, 0x77, 0xd4, 0x74, 0xd7, 0xcc, 0x54, 0xa0, 0xbb, 0xaa, - 0xd9, 0x55, 0x8d, 0x07, 0x7f, 0x82, 0x1d, 0xe1, 0xf0, 0x4f, 0xf0, 0xcd, 0x37, 0x87, 0x4e, 0xfe, - 0x0d, 0xf6, 0x6d, 0x7d, 0x5b, 0x9f, 0xec, 0x90, 0xc2, 0x61, 0xdf, 0x7d, 0x77, 0x6c, 0x54, 0x56, - 0xf5, 0x63, 0x06, 0x03, 0x6c, 0xeb, 0x82, 0xc0, 0x54, 0xe6, 0xf7, 0x65, 0x3d, 0x32, 0xb3, 0xb2, - 0xaa, 0x1a, 0xee, 0x71, 0x31, 0x60, 0x29, 0x13, 0x01, 0x7b, 0x58, 0xfe, 0x97, 0xd0, 0x94, 0xc6, - 0xea, 0x41, 0x92, 0x4a, 0x2d, 0x49, 0xab, 0x68, 0x7f, 0x50, 0xfc, 0xb7, 0xb1, 0x42, 0x63, 0x2e, - 0xe4, 0x43, 0xfc, 0x6b, 0xf5, 0x36, 0x56, 0x87, 0x72, 0x28, 0xf1, 0xdf, 0x87, 0xe6, 0x3f, 0xd7, - 0xba, 0x1e, 0x48, 0x15, 0x4b, 0xe5, 0x5b, 0x81, 0xfd, 0x61, 0x45, 0xf7, 0xff, 0x63, 0x11, 0x6e, - 0xf6, 0xd0, 0x12, 0xd9, 0x85, 0x5b, 0x2c, 0x91, 0xc1, 0xc8, 0xb7, 0x96, 0xbb, 0x33, 0xf7, 0x66, - 0xde, 0x5f, 0x7a, 0x74, 0xef, 0xc1, 0x14, 0xd3, 0x0f, 0xf6, 0x8d, 0xa2, 0xc5, 0x79, 0x4b, 0xac, - 0xfc, 0x41, 0x3c, 0x58, 0x39, 0xa5, 0x11, 0x0f, 0xa9, 0xe6, 0x52, 0xe4, 0x4c, 0x37, 0x90, 0xe9, - 0xbd, 0xa9, 0x4c, 0xc7, 0x85, 0xb6, 0xa3, 0x6b, 0x9e, 0x4e, 0xb4, 0x90, 0xcf, 0x01, 0x12, 0x19, - 0xe4, 0x64, 0xb3, 0x48, 0xb6, 0x3d, 0x95, 0xac, 0x27, 0x03, 0xc7, 0xb2, 0x98, 0xe4, 0xff, 0x9a, - 0x2e, 0x69, 0x79, 0xc2, 0x84, 0x8c, 0x79, 0xa0, 0x72, 0x96, 0xb9, 0x6b, 0xba, 0x74, 0x54, 0x68, - 0xe7, 0x5d, 0xd2, 0x13, 0x2d, 0x86, 0x33, 0x90, 0x51, 0x44, 0x35, 0x4b, 0x69, 0x94, 0x73, 0x36, - 0xae, 0xe1, 0xdc, 0x2d, 0xb4, 0x73, 0xce, 0x60, 0xa2, 0x85, 0x7c, 0x0b, 0xed, 0x3e, 0xd7, 0x81, - 0xe4, 0xc2, 0x4f, 0xd9, 0x19, 0x4d, 0xc3, 0x9c, 0xf7, 0x26, 0xf2, 0xbe, 0x3f, 0x95, 0xf7, 0x89, - 0x45, 0x78, 0x08, 0x70, 0xd4, 0xad, 0xfe, 0xe5, 0x46, 0xe2, 0xc3, 0x5a, 0x78, 0x21, 0x68, 0xcc, - 0x03, 0x3f, 0x49, 0x79, 0xc0, 0xc5, 0x30, 0xa7, 0x9f, 0x47, 0xfa, 0x0f, 0xa6, 0xd2, 0xef, 0x59, - 0x48, 0xcf, 0x22, 0x1c, 0xff, 0x6a, 0x38, 0xa5, 0x95, 0xf4, 0xa1, 0xd3, 0xa7, 0x22, 0x3c, 0xe3, - 0xa1, 0x1e, 0xf9, 0x11, 0x8f, 0xb9, 0x2e, 0x26, 0x7b, 0x01, 0x2d, 0x7c, 0x38, 0x7d, 0x00, 0x39, - 0xe6, 0x05, 0x42, 0x9c, 0x89, 0x76, 0x7f, 0x5a, 0xb3, 0xb1, 0x11, 0x48, 0x31, 0xe0, 0x69, 0xec, - 0xfc, 0xab, 0x74, 0x8b, 0xc5, 0x6b, 0x6c, 0xec, 0x56, 0x30, 0x3d, 0xb9, 0x9b, 0xdb, 0x08, 0xc6, - 0x9a, 0x83, 0xd2, 0xc6, 0x90, 0x09, 0xa6, 0xb8, 0xf2, 0x87, 0x19, 0x4d, 0x43, 0x4e, 0x0b, 0x3f, - 0x86, 0x6b, 0x6c, 0x3c, 0xb5, 0x98, 0xa7, 0x0e, 0x92, 0xdb, 0x18, 0x4e, 0x6b, 0x36, 0x36, 0x42, - 0x76, 0xca, 0x22, 0x99, 0xb0, 0xd4, 0xa7, 0x41, 0xc0, 0x54, 0x31, 0x57, 0x4b, 0xd7, 0xd8, 0xd8, - 0xcb, 0x31, 0x3b, 0x08, 0xc9, 0x6d, 0x84, 0xd3, 0x9a, 0xc9, 0x08, 0xd6, 0x13, 0x9a, 0x6a, 0x1e, - 0xf0, 0x84, 0x0a, 0x3d, 0x61, 0xe5, 0x16, 0x5a, 0xf9, 0x78, 0x7a, 0x10, 0x95, 0xa8, 0x31, 0x3b, - 0x9d, 0x64, 0xba, 0x80, 0x48, 0xd8, 0xd2, 0x29, 0x15, 0x6a, 0x60, 0x06, 0x33, 0x64, 0x97, 0x8c, - 0x2d, 0xa3, 0xb1, 0x07, 0xd3, 0x63, 0xcd, 0x01, 0x77, 0x0c, 0x6e, 0xcc, 0xdc, 0xba, 0xbe, 0x4a, - 0xf4, 0xd9, 0x7b, 0xff, 0xfb, 0x8f, 0x6f, 0xcf, 0xfc, 0xed, 0xff, 0x7c, 0xf7, 0xe1, 0x56, 0x99, - 0x2e, 0xcf, 0x2b, 0xa9, 0xd3, 0xaa, 0xdd, 0xff, 0x6e, 0x1e, 0x56, 0xdc, 0xb2, 0xbc, 0x14, 0xd1, - 0x85, 0xeb, 0xed, 0x3b, 0x70, 0x4b, 0x4b, 0x4d, 0x23, 0x5f, 0x65, 0x49, 0x12, 0x5d, 0x60, 0x9a, - 0x9b, 0xf5, 0x96, 0xb0, 0xed, 0x10, 0x9b, 0xc8, 0x47, 0xb0, 0x22, 0x53, 0x3e, 0xe4, 0x82, 0x6a, - 0x99, 0xe6, 0x7a, 0x37, 0x50, 0xaf, 0x59, 0x0a, 0x9c, 0xf2, 0x87, 0x26, 0xbd, 0x24, 0x79, 0xc8, - 0xd2, 0x58, 0x66, 0x42, 0x63, 0x92, 0x9a, 0xf5, 0xee, 0x68, 0x99, 0xd8, 0x20, 0xdc, 0xc1, 0x66, - 0xf2, 0x0b, 0x58, 0x53, 0x9a, 0x8a, 0xd0, 0x68, 0x8e, 0x03, 0xe6, 0x10, 0xb0, 0x9a, 0x4b, 0xc7, - 0x50, 0xbf, 0x82, 0x8d, 0x24, 0x65, 0x26, 0x7b, 0x0f, 0x53, 0x1a, 0xc7, 0x2c, 0xf4, 0x15, 0x8d, - 0x58, 0x8e, 0x6c, 0x20, 0xb2, 0x93, 0xa4, 0xac, 0x57, 0x28, 0x1c, 0xd2, 0x88, 0x39, 0xf0, 0xdb, - 0xb0, 0x54, 0x76, 0xcf, 0xe6, 0x92, 0x86, 0x07, 0x45, 0xc7, 0x70, 0x3e, 0xec, 0x08, 0xfd, 0xd0, - 0xe4, 0x38, 0x4c, 0x07, 0x8b, 0xde, 0x92, 0x6d, 0xdb, 0x33, 0x4d, 0x13, 0x43, 0x4c, 0x58, 0xca, - 0x65, 0x88, 0x41, 0x5d, 0x1d, 0x62, 0x0f, 0x9b, 0xc9, 0xc7, 0x40, 0xaa, 0xba, 0xf4, 0x42, 0x66, - 0xda, 0x46, 0xe7, 0xac, 0xc9, 0xa3, 0xb9, 0xb2, 0x6d, 0x27, 0x8f, 0x61, 0xeb, 0xb2, 0xb6, 0xb1, - 0xe0, 0xc7, 0x5c, 0xb0, 0x14, 0x23, 0x6e, 0xd6, 0xeb, 0x4e, 0xe2, 0x7a, 0x2c, 0x3d, 0x30, 0x72, - 0xf2, 0x4b, 0xe8, 0x54, 0xf0, 0x31, 0x3d, 0xf7, 0xc3, 0x2c, 0xc5, 0x80, 0xc6, 0x40, 0x9a, 0xf5, - 0x56, 0x0b, 0xe8, 0x01, 0x3d, 0xdf, 0x73, 0x32, 0x12, 0xc0, 0xdb, 0x46, 0x97, 0x8b, 0x90, 0x9f, - 0xf2, 0x30, 0x33, 0x29, 0x5c, 0x9e, 0xb1, 0xd4, 0x18, 0x0e, 0x98, 0xd0, 0x74, 0xc8, 0x5c, 0x84, - 0x6c, 0x5d, 0x11, 0x87, 0x01, 0x8f, 0x69, 0xe4, 0x6d, 0xc5, 0xf4, 0xfc, 0x79, 0xc1, 0xd1, 0x33, - 0x14, 0xbd, 0x82, 0x81, 0xfc, 0x25, 0x74, 0x2f, 0x25, 0x12, 0x26, 0x68, 0x3f, 0x62, 0x21, 0x86, - 0xc4, 0x82, 0xb7, 0x36, 0x91, 0x1d, 0xf6, 0xad, 0x94, 0x7c, 0x0b, 0x1f, 0x5d, 0x42, 0x0a, 0xa6, - 0xcf, 0x64, 0x7a, 0xe2, 0xc7, 0x54, 0x67, 0x29, 0xd7, 0x17, 0xbe, 0x1e, 0xa5, 0x4c, 0x8d, 0x64, - 0x14, 0x76, 0x6f, 0xe3, 0x48, 0xff, 0x6c, 0x82, 0xec, 0x2b, 0x0b, 0x38, 0x70, 0xfa, 0x47, 0xb9, - 0x3a, 0xf9, 0x16, 0x36, 0x2f, 0xb1, 0xc7, 0x59, 0xa4, 0x79, 0x12, 0x71, 0x96, 0x76, 0xef, 0xd4, - 0x18, 0xf8, 0xfa, 0x84, 0xad, 0x83, 0x02, 0x4e, 0x7e, 0x0d, 0x1b, 0x97, 0xd8, 0x69, 0x18, 0xa6, - 0x4c, 0x29, 0xa6, 0xba, 0xcd, 0x7b, 0xb3, 0xef, 0x2f, 0x7a, 0xdd, 0x09, 0xf8, 0x4e, 0x2e, 0xbf, - 0xff, 0x9f, 0x73, 0xd0, 0x9c, 0xdc, 0x7e, 0xc9, 0x37, 0xb0, 0xa1, 0xb2, 0xbe, 0xe2, 0xe1, 0x85, - 0x9f, 0xb2, 0x30, 0x0b, 0x30, 0xf5, 0x73, 0xa1, 0x59, 0x7a, 0x4a, 0x23, 0x57, 0xa6, 0x5c, 0xdf, - 0xdf, 0xae, 0xc3, 0x7b, 0x39, 0xfc, 0xb9, 0x43, 0x93, 0x63, 0xe8, 0x5e, 0xe6, 0x76, 0x91, 0x75, - 0xa3, 0x06, 0xf3, 0xda, 0x24, 0xb3, 0x0b, 0xbb, 0x6f, 0x60, 0x23, 0xc8, 0xd2, 0xd4, 0x24, 0xc3, - 0x9c, 0xbf, 0xe2, 0x5c, 0xb3, 0x75, 0xfa, 0xec, 0xf0, 0x87, 0x16, 0x5e, 0x71, 0xac, 0xaf, 0x61, - 0xa3, 0x9a, 0x71, 0xa2, 0x48, 0x9e, 0xb1, 0xd0, 0x1f, 0x50, 0x1e, 0x65, 0x29, 0x73, 0x95, 0xcd, - 0xf5, 0xdc, 0x9d, 0x32, 0x31, 0x59, 0xf4, 0x17, 0x16, 0x4c, 0x3e, 0x87, 0x4d, 0x43, 0x8d, 0xc1, - 0x87, 0xbb, 0xeb, 0xeb, 0x8c, 0x46, 0x7c, 0xc0, 0x03, 0x1b, 0x53, 0x8d, 0x22, 0x1c, 0x31, 0xfc, - 0x7a, 0x32, 0xf8, 0xab, 0xaa, 0x9c, 0x3c, 0x80, 0x16, 0x3a, 0xe9, 0x29, 0x53, 0x1a, 0x2b, 0x0c, - 0x9b, 0x2a, 0x4c, 0xd2, 0x99, 0xf3, 0x56, 0x8c, 0xe8, 0xd8, 0x4a, 0x5c, 0xb2, 0x78, 0x04, 0x6d, - 0x37, 0x8a, 0x09, 0xc4, 0x3c, 0x22, 0x5a, 0x56, 0x38, 0x8e, 0xf9, 0x14, 0xba, 0x65, 0x17, 0x27, - 0x60, 0x0b, 0x08, 0x6b, 0xe7, 0xfd, 0x1b, 0x03, 0x7e, 0x36, 0x67, 0x76, 0x8d, 0xfb, 0xff, 0xdf, - 0x80, 0xa5, 0x4a, 0xf5, 0x6a, 0xd2, 0x9f, 0xad, 0x7a, 0x23, 0x26, 0x86, 0x7a, 0x94, 0x6f, 0x07, - 0xd8, 0xf6, 0x02, 0x9b, 0xc8, 0x07, 0xd0, 0xb4, 0x2a, 0x95, 0x28, 0xb1, 0xbb, 0xc1, 0x1d, 0x6c, - 0xaf, 0x78, 0xff, 0xdb, 0x60, 0x91, 0xbe, 0x1a, 0xf1, 0x41, 0xbe, 0x0d, 0x00, 0x36, 0x1d, 0x9a, - 0x16, 0xf2, 0x1b, 0xb8, 0x1b, 0xb2, 0x01, 0xcd, 0x22, 0xed, 0x67, 0x82, 0x6b, 0x5f, 0x0e, 0xfc, - 0x40, 0xc6, 0x49, 0xa6, 0x19, 0x96, 0x65, 0xcc, 0x6d, 0x04, 0xeb, 0x4e, 0xe9, 0x95, 0xe0, 0xfa, - 0xe5, 0x60, 0xd7, 0x6a, 0x98, 0x7a, 0x8b, 0x99, 0x04, 0x6b, 0x16, 0x46, 0x19, 0x57, 0x28, 0xb3, - 0x9d, 0x5d, 0x99, 0x66, 0x22, 0x83, 0x43, 0x23, 0x28, 0x32, 0xdd, 0x23, 0x68, 0x1b, 0x6d, 0x76, - 0x1e, 0x8c, 0xa8, 0xa8, 0x02, 0x6e, 0x22, 0xa0, 0x95, 0xc8, 0x60, 0xdf, 0xc9, 0x0a, 0xcc, 0x27, - 0xb0, 0x6a, 0x30, 0x95, 0x3a, 0x3e, 0x64, 0x11, 0xbd, 0xc0, 0x45, 0x99, 0xf5, 0x8c, 0xf5, 0xb2, - 0x68, 0xdf, 0x33, 0x12, 0xf2, 0x17, 0xd0, 0x99, 0x44, 0xe4, 0x76, 0xec, 0x36, 0xd1, 0x1e, 0x07, - 0xe5, 0x96, 0x3e, 0x85, 0xae, 0x62, 0xda, 0x17, 0xec, 0x2c, 0xc7, 0xca, 0x54, 0x39, 0x6b, 0x76, - 0xcb, 0x68, 0x2b, 0xa6, 0xbf, 0x62, 0x67, 0xc7, 0x85, 0xd4, 0x1a, 0x7c, 0x0c, 0x9b, 0x85, 0x57, - 0x57, 0xcd, 0x06, 0x99, 0x96, 0x83, 0x81, 0xdb, 0x36, 0xd6, 0x0b, 0x95, 0xd2, 0xf4, 0x2e, 0x2a, - 0x90, 0xe7, 0xf0, 0x4e, 0x89, 0x4f, 0xd2, 0x4c, 0x18, 0x27, 0xb2, 0x2b, 0x57, 0xe6, 0xd5, 0x25, - 0xf4, 0xa6, 0xed, 0x42, 0xb1, 0x67, 0xf5, 0xd0, 0x7b, 0xca, 0x74, 0xfa, 0x08, 0xda, 0x97, 0xa9, - 0x62, 0x7a, 0x8e, 0x3b, 0xc8, 0xac, 0xd7, 0x9a, 0x84, 0x1f, 0xd0, 0x73, 0xf2, 0x53, 0xb8, 0x83, - 0xa5, 0x6b, 0x45, 0x7b, 0x19, 0xb5, 0x97, 0xcd, 0xb1, 0xa5, 0xd4, 0x7b, 0x01, 0x2d, 0x5c, 0xeb, - 0x48, 0x6a, 0x8c, 0x73, 0x17, 0x86, 0xb7, 0x6b, 0x84, 0xf8, 0x8a, 0x71, 0x85, 0x48, 0xea, 0x9d, - 0x02, 0xe6, 0x02, 0xe0, 0xef, 0x6f, 0x43, 0x73, 0xf2, 0xd0, 0x65, 0x0c, 0x0d, 0x68, 0xa4, 0x98, - 0x9f, 0x48, 0xc5, 0x35, 0x3f, 0x65, 0x7e, 0x4a, 0x35, 0xab, 0x95, 0x5b, 0x57, 0x10, 0xd8, 0x73, - 0x38, 0x8f, 0x6a, 0x66, 0x96, 0x35, 0x36, 0xa7, 0x18, 0x1a, 0x27, 0x7e, 0x96, 0xf8, 0x31, 0xa3, - 0x2a, 0x4b, 0x59, 0xcc, 0x84, 0xb6, 0x67, 0xc1, 0x86, 0xd7, 0x8e, 0xb9, 0xf0, 0x68, 0x9c, 0xbc, - 0x4a, 0x0e, 0x2a, 0x42, 0xf2, 0x2b, 0x80, 0x84, 0x2a, 0x65, 0x56, 0x34, 0xab, 0x97, 0x25, 0x17, - 0x8d, 0xfe, 0xb1, 0x51, 0x27, 0x1e, 0xac, 0x19, 0xab, 0x15, 0x6f, 0xa0, 0xa7, 0x2c, 0x35, 0xe9, - 0xb6, 0x4e, 0x4a, 0x5c, 0x8d, 0xb9, 0x28, 0xa7, 0x65, 0xc7, 0x22, 0x91, 0x93, 0x9e, 0x4f, 0xe3, - 0x6c, 0xd4, 0xe2, 0xa4, 0xe7, 0x97, 0x39, 0x3f, 0x82, 0x15, 0x76, 0x9e, 0x70, 0x1b, 0x02, 0x7e, - 0x3f, 0x92, 0xc1, 0x89, 0x72, 0xe1, 0xd8, 0x2c, 0x05, 0x4f, 0xb0, 0x9d, 0xdc, 0x87, 0x65, 0x74, - 0x4b, 0xe5, 0x6b, 0x89, 0x7e, 0x32, 0x5f, 0xc9, 0x4f, 0xea, 0x48, 0x1a, 0x2f, 0xd9, 0x85, 0xed, - 0x41, 0x16, 0x45, 0xd5, 0x5e, 0xea, 0x94, 0x0e, 0x06, 0x3c, 0xc8, 0xe3, 0xc1, 0x06, 0xe1, 0xa6, - 0xd1, 0x2a, 0xfb, 0x73, 0x64, 0x75, 0x5c, 0x44, 0x5c, 0x9e, 0xbd, 0x11, 0x8d, 0x06, 0x67, 0x2e, - 0x10, 0x7f, 0xdc, 0xec, 0x3d, 0xb3, 0x48, 0xb2, 0x03, 0x77, 0x27, 0x38, 0x27, 0xfa, 0x65, 0xe3, - 0x74, 0x63, 0x0c, 0x3c, 0xa5, 0x5b, 0x4a, 0x55, 0x36, 0xcf, 0x1c, 0xbb, 0x54, 0xaf, 0x5b, 0x4a, - 0x95, 0x3b, 0xa7, 0xe3, 0xec, 0x41, 0x1b, 0x39, 0x53, 0xf6, 0x3a, 0x63, 0x0a, 0xeb, 0x4d, 0x41, - 0x23, 0x7d, 0x51, 0xab, 0xe6, 0x6b, 0x19, 0xa8, 0xe7, 0x90, 0x3d, 0x0b, 0x24, 0x7f, 0x0e, 0xab, - 0x9a, 0xc7, 0x4c, 0x69, 0xe3, 0xf1, 0xe5, 0x1a, 0xba, 0xa0, 0x6e, 0x15, 0xb2, 0xfd, 0x42, 0x64, - 0xbc, 0xa0, 0x84, 0xd0, 0xf0, 0x94, 0x8a, 0x80, 0xb9, 0x4a, 0xae, 0x59, 0x08, 0x76, 0x6c, 0xbb, - 0xd9, 0x35, 0xcc, 0x56, 0x16, 0x53, 0xcd, 0xc2, 0xe2, 0x6c, 0xcd, 0x52, 0xeb, 0x3c, 0xfe, 0x49, - 0x1f, 0x8b, 0xb6, 0x39, 0x6f, 0xbd, 0x50, 0x72, 0xa7, 0x66, 0x96, 0xa2, 0x1b, 0x7d, 0xd9, 0x37, - 0x45, 0x1f, 0x17, 0xb8, 0x10, 0x7e, 0xca, 0x92, 0x4c, 0xbb, 0xf3, 0x73, 0xca, 0x14, 0x4b, 0x4f, - 0x59, 0xb7, 0x59, 0xa7, 0xe8, 0x73, 0x04, 0x5e, 0x81, 0xef, 0x39, 0x38, 0x19, 0xc2, 0x3b, 0x7d, - 0x8a, 0xf7, 0x15, 0xc5, 0x79, 0xd3, 0x29, 0x5b, 0x3b, 0x98, 0x4c, 0x56, 0x6a, 0xd8, 0xd8, 0xee, - 0xd3, 0xb0, 0x72, 0xfe, 0x7c, 0x5e, 0x21, 0xc1, 0xcc, 0x72, 0x0c, 0xdd, 0x31, 0xe2, 0x6a, 0xba, - 0x26, 0x75, 0xca, 0xb5, 0x2a, 0xfa, 0x59, 0x99, 0xc4, 0x8f, 0xa1, 0x1b, 0xca, 0x33, 0x61, 0x26, - 0xde, 0x1f, 0x4a, 0x19, 0x56, 0x8b, 0xb5, 0x56, 0x1d, 0xde, 0x1c, 0xfd, 0x54, 0xca, 0xb0, 0x52, - 0xaa, 0x1d, 0x41, 0xa7, 0xe0, 0xc5, 0x19, 0x2a, 0x69, 0x57, 0x6b, 0xd0, 0xb6, 0x73, 0xf0, 0x13, - 0x5a, 0x65, 0xfd, 0x0a, 0x56, 0x0b, 0xd6, 0xea, 0x0c, 0xb4, 0x6b, 0x50, 0x92, 0x1c, 0x59, 0x19, - 0xfd, 0xdf, 0xc0, 0x56, 0xc1, 0x37, 0xcd, 0x3b, 0xd6, 0x6a, 0xf0, 0x6e, 0xe4, 0x0c, 0x53, 0xdc, - 0xe3, 0x08, 0x3a, 0xaf, 0x33, 0x1e, 0x9c, 0xe4, 0x35, 0x6a, 0xa5, 0xcb, 0x9d, 0x3a, 0xb3, 0x80, - 0x60, 0x57, 0xa2, 0x96, 0xbd, 0xfe, 0x0d, 0x2c, 0xf7, 0xb9, 0x90, 0xb1, 0xaf, 0x99, 0xd2, 0x7e, - 0xf2, 0x49, 0xb7, 0x5b, 0x83, 0x6b, 0x09, 0x21, 0x47, 0x4c, 0xe9, 0xde, 0x27, 0x6e, 0x43, 0xfc, - 0xc3, 0x2c, 0xdc, 0xee, 0xc9, 0xdd, 0x03, 0x19, 0xb2, 0xfc, 0x2a, 0xae, 0x09, 0xb3, 0x21, 0x8f, - 0x71, 0xfb, 0x6b, 0x78, 0xe6, 0x5f, 0xb2, 0x0e, 0x0b, 0xc2, 0x8f, 0xe8, 0x05, 0x4b, 0xf3, 0x2d, - 0x6c, 0x5e, 0xbc, 0xc0, 0x9f, 0xa4, 0x03, 0xf3, 0xc2, 0x1f, 0x31, 0x1a, 0xda, 0xbb, 0xc9, 0x86, - 0x77, 0x53, 0x3c, 0x33, 0xbf, 0xc8, 0x16, 0x80, 0xf0, 0x4f, 0x4e, 0x9d, 0x6c, 0x0e, 0x65, 0x0b, - 0xe2, 0xcb, 0x53, 0x2b, 0xbd, 0x0b, 0x70, 0x2a, 0x03, 0xda, 0xf7, 0x15, 0x7f, 0x63, 0xb7, 0x93, - 0x86, 0xb7, 0x88, 0x2d, 0x87, 0xfc, 0x0d, 0x23, 0xbf, 0x05, 0x32, 0x18, 0x08, 0x3f, 0xe4, 0x71, - 0xb5, 0xec, 0xbc, 0x59, 0x63, 0x88, 0xcd, 0xc1, 0x40, 0xec, 0xf1, 0x78, 0xbc, 0x2a, 0x75, 0x1c, - 0xcc, 0x97, 0x03, 0xdc, 0x42, 0x1a, 0x1e, 0xe4, 0x4d, 0x2f, 0x07, 0xe4, 0x53, 0x58, 0x10, 0x32, - 0x8d, 0x7d, 0x96, 0xe4, 0x97, 0x75, 0xd7, 0x9b, 0x98, 0x37, 0xda, 0xfb, 0x09, 0x0e, 0x22, 0x95, - 0x89, 0x59, 0x50, 0xa6, 0x29, 0xee, 0x14, 0x0d, 0x6f, 0xd1, 0xb4, 0x1c, 0x99, 0x06, 0x53, 0xe7, - 0x64, 0x8a, 0xf9, 0x2a, 0xa0, 0x11, 0x0b, 0x7d, 0xd3, 0x8e, 0x29, 0x7f, 0xc1, 0x5b, 0xce, 0x14, - 0x3b, 0xc4, 0x56, 0x4f, 0x26, 0xcc, 0x4c, 0xa1, 0x62, 0xaf, 0x4d, 0x09, 0x8e, 0x69, 0xbd, 0xe1, - 0xdd, 0x54, 0xec, 0xf5, 0x0b, 0x66, 0x0a, 0xc4, 0x85, 0xd4, 0xd7, 0x34, 0x1d, 0x32, 0x5d, 0x2b, - 0x3b, 0xcf, 0xa7, 0x47, 0xa8, 0xec, 0x96, 0xf6, 0xbf, 0x67, 0x60, 0xa5, 0x27, 0x77, 0x0f, 0x35, - 0xd5, 0xb8, 0xe4, 0xf9, 0x45, 0xf7, 0xed, 0x90, 0x2b, 0x5d, 0xf1, 0xc2, 0x3a, 0x75, 0xce, 0xb2, - 0xc1, 0x94, 0xde, 0x67, 0x4a, 0x15, 0x3f, 0xe6, 0x2a, 0xa6, 0x3a, 0x18, 0xd5, 0x3a, 0x2a, 0x2e, - 0x26, 0x07, 0x4e, 0x9d, 0x3c, 0x83, 0x95, 0xc4, 0x16, 0x39, 0x95, 0x4e, 0xd4, 0x29, 0x77, 0xee, - 0x24, 0x58, 0xeb, 0x14, 0xdd, 0x70, 0xe3, 0xfc, 0x97, 0x39, 0x58, 0x2c, 0x6f, 0x30, 0x7f, 0x06, - 0x24, 0x3f, 0x63, 0x84, 0xdc, 0xec, 0xa5, 0x99, 0xd9, 0xdc, 0xac, 0x33, 0xaf, 0x38, 0xc9, 0x5e, - 0x21, 0x20, 0xbf, 0x80, 0xb5, 0x4a, 0x46, 0x55, 0x34, 0x36, 0x6e, 0x82, 0x4e, 0x69, 0x1d, 0x7d, - 0xb5, 0x94, 0x1e, 0xa2, 0x10, 0xfd, 0xf3, 0x0b, 0xb8, 0x67, 0x4a, 0xd3, 0x90, 0x6a, 0x7a, 0x65, - 0x01, 0x3d, 0x8b, 0xbb, 0xd2, 0x56, 0x22, 0x83, 0x3d, 0xaa, 0xe9, 0xf4, 0xf2, 0xf9, 0x05, 0xb4, - 0xce, 0x18, 0x1f, 0x8e, 0xb4, 0xf5, 0x12, 0x7f, 0x40, 0x03, 0x2d, 0xd3, 0x5a, 0x25, 0xdb, 0x8a, - 0x05, 0xa2, 0x1f, 0x7d, 0x81, 0x30, 0xf2, 0x5b, 0xb8, 0x15, 0x9b, 0x38, 0x1e, 0xbf, 0x92, 0xff, - 0xc9, 0x15, 0x8f, 0x05, 0xd5, 0x98, 0x7f, 0x72, 0xa3, 0x3b, 0xe3, 0x2d, 0xc5, 0x95, 0x24, 0xb0, - 0x0e, 0x0b, 0x96, 0x8b, 0xdb, 0x13, 0xec, 0xa2, 0x37, 0x8f, 0xbf, 0x9f, 0x87, 0x55, 0x7f, 0xb5, - 0xf5, 0x58, 0xee, 0xaf, 0xef, 0xc2, 0x6d, 0x3c, 0x08, 0x3d, 0x2a, 0x6e, 0x7a, 0x16, 0xd0, 0xdf, - 0x6f, 0x99, 0xf3, 0xcf, 0xa3, 0xfc, 0x7e, 0xe7, 0x73, 0xd8, 0xbc, 0x74, 0x8d, 0x5d, 0x81, 0x2c, - 0x22, 0xa4, 0x3b, 0x71, 0x3d, 0x5d, 0xc2, 0x77, 0x61, 0x51, 0x69, 0xaa, 0x31, 0xef, 0xb9, 0x3b, - 0xe9, 0x9f, 0x5e, 0x35, 0xc2, 0x71, 0xd7, 0xf7, 0x16, 0x94, 0xfb, 0xed, 0x1c, 0x67, 0x07, 0xe6, - 0xdd, 0x6c, 0x92, 0x55, 0x68, 0xd8, 0xb2, 0xdb, 0x9e, 0x80, 0xed, 0x0f, 0xb2, 0x01, 0x0b, 0xec, - 0x3c, 0x91, 0x82, 0xb9, 0xfb, 0x90, 0x86, 0x57, 0xfc, 0x76, 0x14, 0x7f, 0x37, 0x07, 0xcd, 0xc9, - 0xd7, 0x0d, 0x53, 0xb6, 0xa9, 0x88, 0xaa, 0x91, 0x3f, 0x48, 0x69, 0x7e, 0x5f, 0x83, 0x6e, 0x54, - 0x2b, 0xd4, 0x56, 0x11, 0xfb, 0x85, 0x83, 0xba, 0x22, 0xc0, 0xec, 0x22, 0x13, 0x9c, 0xf9, 0x96, - 0x53, 0x2b, 0xfc, 0xda, 0x63, 0xa4, 0x7b, 0x0e, 0x4a, 0x62, 0x78, 0xb7, 0xd8, 0xfb, 0x4c, 0x69, - 0xc7, 0xaa, 0x9b, 0xf4, 0x8f, 0x8c, 0xce, 0x77, 0x72, 0xa6, 0x03, 0x24, 0x2a, 0x77, 0xec, 0xd2, - 0xdd, 0x7f, 0x0e, 0x6b, 0xc3, 0x94, 0x9a, 0x93, 0x22, 0x5e, 0x4a, 0xf8, 0x4c, 0x84, 0x36, 0x6c, - 0xd0, 0xe3, 0xe7, 0xbc, 0x16, 0x4a, 0xed, 0x8d, 0xc5, 0xbe, 0x08, 0x31, 0x58, 0x4c, 0xba, 0xe8, - 0x53, 0xc5, 0x7c, 0x17, 0x28, 0x58, 0x41, 0xd6, 0x3a, 0x80, 0xdc, 0x31, 0xb0, 0xdf, 0x21, 0xca, - 0x33, 0x20, 0xf2, 0x35, 0x6c, 0x54, 0xdf, 0xad, 0x58, 0x9a, 0x73, 0x66, 0x82, 0xeb, 0x5a, 0xbb, - 0x4b, 0xa7, 0xf2, 0x6e, 0xc5, 0x52, 0xcb, 0xfd, 0x4a, 0xf0, 0xdc, 0x1b, 0xfe, 0x6f, 0x16, 0x5a, - 0x53, 0xde, 0xa4, 0xc8, 0x03, 0x68, 0x99, 0x9d, 0x60, 0xfc, 0x81, 0xcb, 0xbe, 0x31, 0x2e, 0x78, - 0x2b, 0x99, 0x62, 0x63, 0x20, 0x45, 0x3e, 0x81, 0x55, 0x2e, 0xb8, 0xe6, 0x34, 0x72, 0x59, 0xc5, - 0x22, 0x70, 0xa5, 0xe7, 0x3c, 0xe2, 0x64, 0x38, 0x3d, 0x16, 0x62, 0x12, 0x72, 0xc8, 0x02, 0x7a, - 0x61, 0x8b, 0xcd, 0x5a, 0x67, 0x47, 0xd4, 0xc7, 0xba, 0xf2, 0x27, 0xb0, 0x9c, 0xdf, 0x5a, 0x56, - 0x57, 0xe3, 0x96, 0x6b, 0xb4, 0xcb, 0x70, 0x0c, 0xdd, 0x4c, 0xf3, 0x88, 0xbf, 0x71, 0x27, 0x37, - 0x29, 0x32, 0x95, 0xe7, 0xab, 0x3a, 0xab, 0xb1, 0x56, 0x41, 0x3f, 0x31, 0x60, 0x97, 0xb4, 0xbe, - 0x86, 0x0d, 0x3c, 0xbf, 0x05, 0xd2, 0x9e, 0x10, 0xc7, 0x99, 0x6b, 0x2d, 0x8a, 0xc1, 0xef, 0x3a, - 0x78, 0x95, 0xda, 0x87, 0xbb, 0x58, 0x94, 0xd3, 0xab, 0xd8, 0xe7, 0xeb, 0x94, 0x76, 0x8e, 0x62, - 0x8a, 0x01, 0xb7, 0xea, 0xdf, 0xcd, 0xc1, 0xea, 0xb4, 0xa7, 0x42, 0x33, 0x34, 0xa5, 0x69, 0x9f, - 0x47, 0x5c, 0x5f, 0xf8, 0x6f, 0xa4, 0x60, 0x7e, 0x84, 0x17, 0xed, 0x7d, 0x99, 0x89, 0x7a, 0xb9, - 0xa0, 0x53, 0xe0, 0xbf, 0x91, 0x82, 0xbd, 0x30, 0xe8, 0x27, 0x06, 0x3c, 0x85, 0x3a, 0x4b, 0x92, - 0x82, 0xfa, 0xc6, 0x8f, 0xa6, 0x7e, 0x65, 0xd0, 0x96, 0xfa, 0x29, 0x34, 0xf1, 0x32, 0xce, 0x67, - 0x11, 0x55, 0xe6, 0x2c, 0xa2, 0x2f, 0x6a, 0xee, 0xce, 0x06, 0xb5, 0x5f, 0x80, 0xc8, 0x63, 0xd8, - 0xac, 0x7a, 0xcc, 0x19, 0x17, 0xa1, 0x3c, 0x2b, 0xef, 0xc6, 0xac, 0x93, 0xad, 0x57, 0x54, 0x7e, - 0x87, 0x1a, 0xc5, 0xfd, 0xd8, 0xcf, 0xa0, 0x65, 0x0e, 0xd0, 0x66, 0x58, 0xf8, 0x04, 0xed, 0xee, - 0x08, 0x1b, 0x88, 0x6b, 0xc6, 0x5c, 0xf4, 0x58, 0x8a, 0xd7, 0xe5, 0xf6, 0x6a, 0xf0, 0x21, 0xac, - 0x62, 0x9e, 0x98, 0xd4, 0x77, 0xf7, 0xaf, 0x46, 0x36, 0x0e, 0xb8, 0x3a, 0x1b, 0xcd, 0x5f, 0x9d, - 0x8d, 0x1e, 0xc3, 0xd6, 0x18, 0x68, 0xd2, 0x9a, 0xbd, 0x84, 0xed, 0x56, 0xa0, 0x63, 0x46, 0x9d, - 0xcb, 0xfc, 0xd3, 0x1c, 0xb4, 0xa7, 0xbe, 0xfd, 0xfe, 0xe9, 0xc3, 0xee, 0xcc, 0x9f, 0x3a, 0xec, - 0x3e, 0x07, 0x72, 0xd2, 0x47, 0x0c, 0x17, 0x49, 0xa6, 0x6d, 0xef, 0x6a, 0xb9, 0xc4, 0x9d, 0x93, - 0x7e, 0x8f, 0xa5, 0xcf, 0x0d, 0x0a, 0x7b, 0x4c, 0xbe, 0x84, 0x96, 0xa3, 0x92, 0x99, 0x2e, 0xb9, - 0xea, 0x78, 0x43, 0x13, 0xb9, 0x5e, 0x22, 0xcc, 0x92, 0x3d, 0x84, 0x56, 0xf5, 0xfc, 0xa9, 0xec, - 0xe8, 0x9c, 0x1b, 0x90, 0x31, 0x11, 0x8e, 0xc9, 0x5e, 0x73, 0x56, 0x01, 0xae, 0x3a, 0x73, 0xd7, - 0xdd, 0xd6, 0x0f, 0xd6, 0xc7, 0x54, 0x6c, 0x89, 0xe6, 0xee, 0xca, 0x3f, 0x83, 0xf5, 0x29, 0x06, - 0xfd, 0x20, 0x33, 0xa7, 0x3a, 0xeb, 0x15, 0x9d, 0xcb, 0x66, 0x77, 0x8d, 0x98, 0x3c, 0x83, 0x7b, - 0x31, 0x17, 0x3c, 0xce, 0x62, 0x3f, 0x90, 0x22, 0x7f, 0xcc, 0x18, 0xd3, 0x46, 0x2f, 0x59, 0xf6, - 0xb6, 0x9d, 0xde, 0x6e, 0xa1, 0x56, 0x3d, 0xb7, 0x2b, 0xbc, 0x0e, 0xc4, 0xd7, 0x36, 0x37, 0x43, - 0x95, 0xe5, 0xcc, 0x6f, 0xec, 0xf1, 0x21, 0x2d, 0x17, 0xe7, 0x2b, 0xe9, 0x3c, 0xe5, 0x9f, 0x6f, - 0x40, 0x7b, 0xea, 0x0b, 0x3e, 0x79, 0x0a, 0xf7, 0xd8, 0x79, 0xc2, 0x02, 0xe3, 0x28, 0xd5, 0x6a, - 0xc9, 0x1a, 0xb0, 0x8e, 0x6c, 0x9d, 0xe5, 0x6e, 0xae, 0x57, 0x25, 0x32, 0x86, 0xac, 0x4b, 0xef, - 0xc3, 0x1d, 0x1a, 0x25, 0x23, 0x5a, 0xd9, 0xef, 0xeb, 0x78, 0xcb, 0x6d, 0x04, 0x95, 0x9b, 0xfb, - 0x2e, 0xdc, 0x1e, 0xaf, 0x50, 0x6a, 0xf9, 0xc9, 0xf2, 0x58, 0x61, 0x62, 0xd6, 0x2c, 0x4b, 0x86, - 0x29, 0x0d, 0xf1, 0xc5, 0x57, 0xb3, 0xa0, 0x92, 0x3a, 0xdc, 0xeb, 0x40, 0xc7, 0x29, 0xf4, 0x0a, - 0xb9, 0xcd, 0x1b, 0x6e, 0xc2, 0xfe, 0x6d, 0x06, 0xda, 0x53, 0x3f, 0x47, 0x20, 0xbf, 0x86, 0x8d, - 0x6b, 0xde, 0x11, 0x6d, 0xe1, 0xd7, 0x15, 0x57, 0x3d, 0x1c, 0x7e, 0x0e, 0x9b, 0x97, 0xd0, 0x26, - 0x3d, 0x8d, 0xb0, 0x08, 0x70, 0x4f, 0x22, 0x93, 0xf0, 0x03, 0x2e, 0x9e, 0xa1, 0xdc, 0x1c, 0x4b, - 0xa6, 0xbc, 0x08, 0xce, 0xe2, 0x8b, 0xe0, 0xca, 0x70, 0xf2, 0x29, 0x30, 0xaf, 0x2e, 0x67, 0xa0, - 0x3d, 0xf5, 0xb3, 0x07, 0xf2, 0x31, 0x90, 0x4c, 0x68, 0x1e, 0xb9, 0xbc, 0xe0, 0x3a, 0x61, 0xc7, - 0xd0, 0x44, 0x09, 0x3a, 0x91, 0x33, 0xfe, 0x18, 0x36, 0xf3, 0x87, 0xb2, 0xca, 0x97, 0x17, 0x45, - 0x2f, 0x6e, 0x60, 0x2f, 0xd6, 0x9d, 0x4a, 0x69, 0x70, 0xa2, 0x37, 0xff, 0x7e, 0x03, 0x3a, 0x57, - 0x7c, 0x1e, 0x41, 0xfe, 0x1a, 0x3e, 0x10, 0xec, 0x6c, 0xec, 0x0e, 0x2c, 0x65, 0x43, 0xae, 0xb4, - 0xbb, 0xe8, 0x55, 0x9a, 0xa6, 0x7a, 0xbc, 0x9b, 0xef, 0x09, 0x76, 0x56, 0xa1, 0xf3, 0x2a, 0xea, - 0x87, 0x46, 0xdb, 0xf5, 0xfd, 0x09, 0xdc, 0xc5, 0x31, 0xb2, 0xf1, 0x1b, 0xb6, 0xc9, 0xde, 0x6f, - 0x3a, 0xa5, 0x6a, 0x07, 0x73, 0x15, 0xf4, 0x2a, 0xb3, 0x33, 0x54, 0xf1, 0x66, 0xb0, 0x11, 0x57, - 0xf6, 0x99, 0x6a, 0xc1, 0xeb, 0x64, 0x8a, 0x55, 0xb1, 0xb9, 0x98, 0x1c, 0xc3, 0xfb, 0x53, 0x71, - 0xfe, 0x94, 0xf9, 0xb7, 0x0e, 0xfa, 0x6e, 0x32, 0x85, 0xe7, 0xd5, 0xc4, 0x9a, 0xb8, 0x39, 0xf5, - 0x61, 0xfd, 0xca, 0x8f, 0x40, 0x8c, 0xc3, 0xe6, 0xcb, 0x56, 0x7e, 0x62, 0x52, 0x8c, 0x7b, 0xc6, - 0xbe, 0x26, 0x3b, 0x8d, 0x82, 0x65, 0x7c, 0xd1, 0x9e, 0xbc, 0xfc, 0xd7, 0xef, 0xb7, 0x67, 0x7e, - 0xff, 0xfd, 0xf6, 0xcc, 0x7f, 0x7d, 0xbf, 0x3d, 0xf3, 0x0f, 0x3f, 0x6c, 0xbf, 0xf5, 0xfb, 0x1f, - 0xb6, 0xdf, 0xfa, 0xc3, 0x0f, 0xdb, 0x6f, 0x7d, 0xf3, 0xcb, 0x21, 0xd7, 0xa3, 0xac, 0xff, 0x20, - 0x90, 0xf1, 0xc3, 0x24, 0x95, 0x61, 0x16, 0x68, 0x15, 0xf0, 0x89, 0xef, 0xf0, 0xaa, 0x1f, 0x96, - 0xe8, 0x8b, 0x84, 0xa9, 0xfe, 0x4d, 0xfc, 0x74, 0xee, 0xe7, 0x7f, 0x0c, 0x00, 0x00, 0xff, 0xff, - 0x84, 0xaf, 0x96, 0x1d, 0xb7, 0x27, 0x00, 0x00, + // 3461 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x5a, 0x5b, 0x73, 0x1c, 0x37, + 0x76, 0x36, 0x45, 0x52, 0x24, 0x0f, 0x45, 0x71, 0x88, 0xe1, 0x90, 0xc3, 0x8b, 0x68, 0xd9, 0x6b, + 0x6f, 0x7c, 0x5b, 0xc9, 0xd1, 0x5e, 0x9c, 0xf2, 0xae, 0x55, 0x4b, 0x91, 0xb2, 0xa4, 0xb5, 0x68, + 0x4d, 0x9a, 0x14, 0x37, 0x76, 0xb9, 0xd2, 0x85, 0xe9, 0xc6, 0x0c, 0x51, 0xea, 0x06, 0x5a, 0x0d, + 0x34, 0x2f, 0x7e, 0xcc, 0x63, 0x52, 0x95, 0xca, 0x1f, 0x48, 0x55, 0xde, 0xf2, 0x96, 0xf2, 0xcf, + 0x48, 0xde, 0x36, 0x6f, 0x9b, 0xa7, 0xa4, 0xec, 0x4a, 0x25, 0xef, 0xf9, 0x03, 0x29, 0x1c, 0xa0, + 0xbb, 0x31, 0xc3, 0x21, 0xb7, 0xfd, 0xc2, 0xe2, 0xe0, 0x9c, 0xef, 0x3b, 0xb8, 0x9c, 0x73, 0x70, + 0x00, 0x34, 0xdc, 0xe5, 0x62, 0xc0, 0x72, 0x26, 0x22, 0x76, 0xbf, 0xfe, 0x2f, 0xa3, 0x39, 0x4d, + 0xd5, 0xbd, 0x2c, 0x97, 0x5a, 0x92, 0x76, 0xd5, 0x7e, 0xaf, 0xfa, 0x6f, 0x73, 0x85, 0xa6, 0x5c, + 0xc8, 0xfb, 0xf8, 0xd7, 0xea, 0x6d, 0xae, 0x0e, 0xe5, 0x50, 0xe2, 0xbf, 0xf7, 0xcd, 0x7f, 0xae, + 0x75, 0x23, 0x92, 0x2a, 0x95, 0x2a, 0xb4, 0x02, 0xfb, 0xc3, 0x8a, 0xde, 0xfe, 0x8f, 0x05, 0xb8, + 0xd9, 0x43, 0x4b, 0x64, 0x0f, 0x6e, 0xb1, 0x4c, 0x46, 0x27, 0xa1, 0xb5, 0xdc, 0x9d, 0xba, 0x3b, + 0xf5, 0xde, 0xe2, 0x83, 0xbb, 0xf7, 0x26, 0x98, 0xbe, 0xf7, 0xd8, 0x28, 0x5a, 0x5c, 0xb0, 0xc8, + 0xea, 0x1f, 0x24, 0x80, 0x95, 0x53, 0x9a, 0xf0, 0x98, 0x6a, 0x2e, 0x45, 0xc9, 0x74, 0x03, 0x99, + 0xde, 0x9d, 0xc8, 0x74, 0x5c, 0x69, 0x3b, 0xba, 0xd6, 0xe9, 0x58, 0x0b, 0xf9, 0x0c, 0x20, 0x93, + 0x51, 0x49, 0x36, 0x8d, 0x64, 0x3b, 0x13, 0xc9, 0x7a, 0x32, 0x72, 0x2c, 0x0b, 0x59, 0xf9, 0xaf, + 0xe9, 0x92, 0x96, 0xaf, 0x98, 0x90, 0x29, 0x8f, 0x54, 0xc9, 0x32, 0x73, 0x4d, 0x97, 0x8e, 0x2a, + 0xed, 0xb2, 0x4b, 0x7a, 0xac, 0xc5, 0x70, 0x46, 0x32, 0x49, 0xa8, 0x66, 0x39, 0x4d, 0x4a, 0xce, + 0xd9, 0x6b, 0x38, 0xf7, 0x2a, 0xed, 0x92, 0x33, 0x1a, 0x6b, 0x21, 0xdf, 0x40, 0xa7, 0xcf, 0x75, + 0x24, 0xb9, 0x08, 0x73, 0x76, 0x46, 0xf3, 0xb8, 0xe4, 0xbd, 0x89, 0xbc, 0xef, 0x4d, 0xe4, 0x7d, + 0x64, 0x11, 0x01, 0x02, 0x1c, 0x75, 0xbb, 0x7f, 0xb9, 0x91, 0x84, 0xb0, 0x16, 0x5f, 0x08, 0x9a, + 0xf2, 0x28, 0xcc, 0x72, 0x1e, 0x71, 0x31, 0x2c, 0xe9, 0xe7, 0x90, 0xfe, 0xfd, 0x89, 0xf4, 0xfb, + 0x16, 0xd2, 0xb3, 0x08, 0xc7, 0xbf, 0x1a, 0x4f, 0x68, 0x25, 0x7d, 0x58, 0xef, 0x53, 0x11, 0x9f, + 0xf1, 0x58, 0x9f, 0x84, 0x09, 0x4f, 0xb9, 0xae, 0x26, 0x7b, 0x1e, 0x2d, 0x7c, 0x30, 0x79, 0x00, + 0x25, 0xe6, 0x39, 0x42, 0x9c, 0x89, 0x4e, 0x7f, 0x52, 0xb3, 0xb1, 0x11, 0x49, 0x31, 0xe0, 0x79, + 0xea, 0xfc, 0xab, 0x76, 0x8b, 0x85, 0x6b, 0x6c, 0xec, 0x79, 0x98, 0x9e, 0xdc, 0x2b, 0x6d, 0x44, + 0x23, 0xcd, 0x51, 0x6d, 0x63, 0xc8, 0x04, 0x53, 0x5c, 0x85, 0xc3, 0x82, 0xe6, 0x31, 0xa7, 0x95, + 0x1f, 0xc3, 0x35, 0x36, 0x9e, 0x58, 0xcc, 0x13, 0x07, 0x29, 0x6d, 0x0c, 0x27, 0x35, 0x1b, 0x1b, + 0x31, 0x3b, 0x65, 0x89, 0xcc, 0x58, 0x1e, 0xd2, 0x28, 0x62, 0xaa, 0x9a, 0xab, 0xc5, 0x6b, 0x6c, + 0xec, 0x97, 0x98, 0x5d, 0x84, 0x94, 0x36, 0xe2, 0x49, 0xcd, 0xe4, 0x04, 0x36, 0x32, 0x9a, 0x6b, + 0x1e, 0xf1, 0x8c, 0x0a, 0x3d, 0x66, 0xe5, 0x16, 0x5a, 0xf9, 0x68, 0x72, 0x10, 0xd5, 0xa8, 0x11, + 0x3b, 0xeb, 0xd9, 0x64, 0x01, 0x91, 0xb0, 0xad, 0x73, 0x2a, 0xd4, 0xc0, 0x0c, 0x66, 0xc8, 0x2e, + 0x19, 0x5b, 0x42, 0x63, 0xf7, 0x26, 0xc7, 0x9a, 0x03, 0xee, 0x1a, 0xdc, 0x88, 0xb9, 0x0d, 0x7d, + 0x95, 0xe8, 0xd3, 0x77, 0xff, 0xf7, 0x9f, 0xde, 0x9c, 0xfa, 0xdb, 0xff, 0xf9, 0xee, 0x83, 0xed, + 0x3a, 0x5d, 0x9e, 0x7b, 0xa9, 0xd3, 0xaa, 0xbd, 0xfd, 0xdd, 0x1c, 0xac, 0xb8, 0x65, 0x79, 0x21, + 0x92, 0x0b, 0xd7, 0xdb, 0xb7, 0xe0, 0x96, 0x96, 0x9a, 0x26, 0xa1, 0x2a, 0xb2, 0x2c, 0xb9, 0xc0, + 0x34, 0x37, 0x1d, 0x2c, 0x62, 0xdb, 0x21, 0x36, 0x91, 0x0f, 0x61, 0x45, 0xe6, 0x7c, 0xc8, 0x05, + 0xd5, 0x32, 0x2f, 0xf5, 0x6e, 0xa0, 0x5e, 0xab, 0x16, 0x38, 0xe5, 0x0f, 0x4c, 0x7a, 0xc9, 0xca, + 0x90, 0xa5, 0xa9, 0x2c, 0x84, 0xc6, 0x24, 0x35, 0x1d, 0x2c, 0x6b, 0x99, 0xd9, 0x20, 0xdc, 0xc5, + 0x66, 0xf2, 0x0b, 0x58, 0x53, 0x9a, 0x8a, 0xd8, 0x68, 0x8e, 0x02, 0x66, 0x10, 0xb0, 0x5a, 0x4a, + 0x47, 0x50, 0xbf, 0x86, 0xcd, 0x2c, 0x67, 0x26, 0x7b, 0x0f, 0x73, 0x9a, 0xa6, 0x2c, 0x0e, 0x15, + 0x4d, 0x58, 0x89, 0x9c, 0x45, 0xe4, 0x7a, 0x96, 0xb3, 0x5e, 0xa5, 0x70, 0x48, 0x13, 0xe6, 0xc0, + 0x6f, 0xc2, 0x62, 0xdd, 0x3d, 0x9b, 0x4b, 0x66, 0x03, 0xa8, 0x3a, 0x86, 0xf3, 0x61, 0x47, 0x18, + 0xc6, 0x26, 0xc7, 0x61, 0x3a, 0x58, 0x08, 0x16, 0x6d, 0xdb, 0xbe, 0x69, 0x1a, 0x1b, 0x62, 0xc6, + 0x72, 0x2e, 0x63, 0x0c, 0x6a, 0x7f, 0x88, 0x3d, 0x6c, 0x26, 0x1f, 0x01, 0xf1, 0x75, 0xe9, 0x85, + 0x2c, 0xb4, 0x8d, 0xce, 0x69, 0x93, 0x47, 0x4b, 0x65, 0xdb, 0x4e, 0x1e, 0xc2, 0xf6, 0x65, 0x6d, + 0x63, 0x21, 0x4c, 0xb9, 0x60, 0x39, 0x46, 0xdc, 0x74, 0xd0, 0x1d, 0xc7, 0xf5, 0x58, 0x7e, 0x60, + 0xe4, 0xe4, 0x97, 0xb0, 0xee, 0xe1, 0x53, 0x7a, 0x1e, 0xc6, 0x45, 0x8e, 0x01, 0x8d, 0x81, 0x34, + 0x1d, 0xac, 0x56, 0xd0, 0x03, 0x7a, 0xbe, 0xef, 0x64, 0x24, 0x82, 0x37, 0x8d, 0x2e, 0x17, 0x31, + 0x3f, 0xe5, 0x71, 0x61, 0x52, 0xb8, 0x3c, 0x63, 0xb9, 0x31, 0x1c, 0x31, 0xa1, 0xe9, 0x90, 0xb9, + 0x08, 0xd9, 0xbe, 0x22, 0x0e, 0x23, 0x9e, 0xd2, 0x24, 0xd8, 0x4e, 0xe9, 0xf9, 0xb3, 0x8a, 0xa3, + 0x67, 0x28, 0x7a, 0x15, 0x03, 0xf9, 0x0b, 0xe8, 0x5e, 0x4a, 0x24, 0x4c, 0xd0, 0x7e, 0xc2, 0x62, + 0x0c, 0x89, 0xf9, 0x60, 0x6d, 0x2c, 0x3b, 0x3c, 0xb6, 0x52, 0xf2, 0x0d, 0x7c, 0x78, 0x09, 0x29, + 0x98, 0x3e, 0x93, 0xf9, 0xab, 0x30, 0xa5, 0xba, 0xc8, 0xb9, 0xbe, 0x08, 0xf5, 0x49, 0xce, 0xd4, + 0x89, 0x4c, 0xe2, 0xee, 0x6d, 0x1c, 0xe9, 0x9f, 0x8d, 0x91, 0x7d, 0x69, 0x01, 0x07, 0x4e, 0xff, + 0xa8, 0x54, 0x27, 0xdf, 0xc0, 0xd6, 0x25, 0xf6, 0xb4, 0x48, 0x34, 0xcf, 0x12, 0xce, 0xf2, 0xee, + 0x72, 0x83, 0x81, 0x6f, 0x8c, 0xd9, 0x3a, 0xa8, 0xe0, 0xe4, 0x37, 0xb0, 0x79, 0x89, 0x9d, 0xc6, + 0x71, 0xce, 0x94, 0x62, 0xaa, 0xdb, 0xba, 0x3b, 0xfd, 0xde, 0x42, 0xd0, 0x1d, 0x83, 0xef, 0x96, + 0xf2, 0xb7, 0xff, 0x73, 0x06, 0x5a, 0xe3, 0xdb, 0x2f, 0xf9, 0x1a, 0x36, 0x55, 0xd1, 0x57, 0x3c, + 0xbe, 0x08, 0x73, 0x16, 0x17, 0x11, 0xa6, 0x7e, 0x2e, 0x34, 0xcb, 0x4f, 0x69, 0xe2, 0xca, 0x94, + 0xeb, 0xfb, 0xdb, 0x75, 0xf8, 0xa0, 0x84, 0x3f, 0x73, 0x68, 0x72, 0x0c, 0xdd, 0xcb, 0xdc, 0x2e, + 0xb2, 0x6e, 0x34, 0x60, 0x5e, 0x1b, 0x67, 0x76, 0x61, 0xf7, 0x35, 0x6c, 0x46, 0x45, 0x9e, 0x9b, + 0x64, 0x58, 0xf2, 0x7b, 0xce, 0x35, 0xdd, 0xa4, 0xcf, 0x0e, 0x7f, 0x68, 0xe1, 0x9e, 0x63, 0x7d, + 0x05, 0x9b, 0x7e, 0xc6, 0x49, 0x12, 0x79, 0xc6, 0xe2, 0x70, 0x40, 0x79, 0x52, 0xe4, 0xcc, 0x55, + 0x36, 0xd7, 0x73, 0xaf, 0xd7, 0x89, 0xc9, 0xa2, 0x3f, 0xb7, 0x60, 0xf2, 0x19, 0x6c, 0x19, 0x6a, + 0x0c, 0x3e, 0xdc, 0x5d, 0x5f, 0x17, 0x34, 0xe1, 0x03, 0x1e, 0xd9, 0x98, 0x9a, 0xad, 0xc2, 0x11, + 0xc3, 0xaf, 0x27, 0xa3, 0xbf, 0xf4, 0xe5, 0xe4, 0x1e, 0xb4, 0xd1, 0x49, 0x4f, 0x99, 0xd2, 0x58, + 0x61, 0xd8, 0x54, 0x61, 0x92, 0xce, 0x4c, 0xb0, 0x62, 0x44, 0xc7, 0x56, 0xe2, 0x92, 0xc5, 0x03, + 0xe8, 0xb8, 0x51, 0x8c, 0x21, 0xe6, 0x10, 0xd1, 0xb6, 0xc2, 0x51, 0xcc, 0x27, 0xd0, 0xad, 0xbb, + 0x38, 0x06, 0x9b, 0x47, 0x58, 0xa7, 0xec, 0xdf, 0x08, 0xf0, 0xd3, 0x19, 0xb3, 0x6b, 0xbc, 0xfd, + 0x37, 0x37, 0x61, 0xd1, 0xab, 0x5e, 0x4d, 0xfa, 0xb3, 0x55, 0x6f, 0xc2, 0xc4, 0x50, 0x9f, 0x94, + 0xdb, 0x01, 0xb6, 0x3d, 0xc7, 0x26, 0xf2, 0x3e, 0xb4, 0xac, 0x8a, 0x17, 0x25, 0x76, 0x37, 0x58, + 0xc6, 0x76, 0xcf, 0xfb, 0xdf, 0x04, 0x8b, 0x0c, 0xd5, 0x09, 0x1f, 0x94, 0xdb, 0x00, 0x60, 0xd3, + 0xa1, 0x69, 0x21, 0xbf, 0x85, 0x3b, 0x31, 0x1b, 0xd0, 0x22, 0xd1, 0x61, 0x21, 0xb8, 0x0e, 0xe5, + 0x20, 0x8c, 0x64, 0x9a, 0x15, 0x9a, 0x61, 0x59, 0xc6, 0xdc, 0x46, 0xb0, 0xe1, 0x94, 0x5e, 0x0a, + 0xae, 0x5f, 0x0c, 0xf6, 0xac, 0x86, 0xa9, 0xb7, 0x98, 0x49, 0xb0, 0x66, 0x61, 0x94, 0x71, 0x85, + 0x3a, 0xdb, 0xd9, 0x95, 0x69, 0x65, 0x32, 0x3a, 0x34, 0x82, 0x2a, 0xd3, 0xfd, 0x0a, 0x3a, 0x46, + 0x9b, 0x9d, 0x47, 0x27, 0x54, 0xf8, 0x00, 0xb3, 0x26, 0xd3, 0x8f, 0x6e, 0x74, 0xa7, 0x82, 0x76, + 0x26, 0xa3, 0xc7, 0x4e, 0x5e, 0xe1, 0x3e, 0x86, 0x55, 0x83, 0xf3, 0x6a, 0xf9, 0x98, 0x25, 0xf4, + 0x02, 0x17, 0x66, 0x3a, 0x30, 0x3d, 0xa8, 0x0b, 0xf7, 0x7d, 0x23, 0x21, 0xbf, 0x82, 0xf5, 0x71, + 0x44, 0x69, 0xcb, 0x6e, 0x15, 0x9d, 0x51, 0x50, 0x69, 0xe9, 0x13, 0xe8, 0x2a, 0xa6, 0x43, 0xc1, + 0xce, 0x4a, 0xac, 0xcc, 0x95, 0xb3, 0x66, 0xb7, 0x8d, 0x8e, 0x62, 0xfa, 0x4b, 0x76, 0x76, 0x5c, + 0x49, 0xad, 0xc1, 0x87, 0xb0, 0x55, 0x79, 0xb6, 0x6f, 0x36, 0x2a, 0xb4, 0x1c, 0x0c, 0xdc, 0xd6, + 0xb1, 0x51, 0xa9, 0xd4, 0xa6, 0xf7, 0x50, 0x81, 0x3c, 0x83, 0xb7, 0x6a, 0x7c, 0x96, 0x17, 0xc2, + 0x38, 0x92, 0x5d, 0xbd, 0x3a, 0xb7, 0x2e, 0xa2, 0x47, 0xed, 0x54, 0x8a, 0x3d, 0xab, 0x87, 0x1e, + 0x54, 0xa7, 0xd4, 0x07, 0xd0, 0xb9, 0x4c, 0x95, 0xd2, 0x73, 0xdc, 0x45, 0xa6, 0x83, 0xf6, 0x38, + 0xfc, 0x80, 0x9e, 0x93, 0x9f, 0xc2, 0x32, 0x96, 0xaf, 0x9e, 0xf6, 0x12, 0x6a, 0x2f, 0x99, 0xa3, + 0x4b, 0xad, 0xf7, 0x1c, 0xda, 0xb8, 0xde, 0x89, 0xd4, 0x18, 0xeb, 0x2e, 0x14, 0x6f, 0x37, 0x08, + 0xf3, 0x15, 0xe3, 0x0e, 0x89, 0xd4, 0xbb, 0x15, 0xcc, 0x05, 0xc1, 0xdf, 0xdf, 0x86, 0xd6, 0xf8, + 0xc1, 0xcb, 0x18, 0x1a, 0xd0, 0x44, 0xb1, 0x30, 0x93, 0x8a, 0x6b, 0x7e, 0xca, 0xc2, 0x9c, 0x6a, + 0xd6, 0x28, 0xbf, 0xae, 0x20, 0xb0, 0xe7, 0x70, 0x01, 0xd5, 0xcc, 0x2c, 0x6b, 0x6a, 0x4e, 0x32, + 0x34, 0xcd, 0xc2, 0x22, 0x0b, 0x53, 0x46, 0x55, 0x91, 0xb3, 0x94, 0x09, 0x6d, 0xcf, 0x83, 0xb3, + 0x41, 0x27, 0xe5, 0x22, 0xa0, 0x69, 0xf6, 0x32, 0x3b, 0xf0, 0x84, 0xe4, 0xd7, 0x00, 0x19, 0x55, + 0xca, 0xac, 0x68, 0xd1, 0x2c, 0x53, 0x2e, 0x18, 0xfd, 0x63, 0xa3, 0x4e, 0x02, 0x58, 0x33, 0x56, + 0x3d, 0x6f, 0xa0, 0xa7, 0x2c, 0x37, 0x29, 0xb7, 0x49, 0x5a, 0x5c, 0x4d, 0xb9, 0xa8, 0xa7, 0x65, + 0xd7, 0x22, 0x91, 0x93, 0x9e, 0x4f, 0xe2, 0x9c, 0x6d, 0xc4, 0x49, 0xcf, 0x2f, 0x73, 0x7e, 0x08, + 0x2b, 0xec, 0x3c, 0xe3, 0x36, 0x04, 0xc2, 0x7e, 0x22, 0xa3, 0x57, 0xb6, 0x36, 0x9b, 0x0e, 0x5a, + 0xb5, 0xe0, 0x11, 0xb6, 0x93, 0xb7, 0x61, 0x09, 0xdd, 0x52, 0x85, 0x5a, 0xa2, 0x9f, 0xcc, 0x79, + 0x39, 0x4a, 0x1d, 0x49, 0xe3, 0x25, 0x7b, 0xb0, 0x33, 0x28, 0x92, 0xc4, 0xef, 0xa5, 0xce, 0xe9, + 0x60, 0xc0, 0xa3, 0x32, 0x1e, 0x6c, 0x10, 0x6e, 0x19, 0xad, 0xba, 0x3f, 0x47, 0x56, 0xc7, 0x45, + 0xc4, 0xe5, 0xd9, 0x3b, 0xa1, 0xc9, 0xe0, 0xcc, 0x05, 0xe2, 0x8f, 0x9b, 0xbd, 0xa7, 0x16, 0x49, + 0x76, 0xe1, 0xce, 0x18, 0xe7, 0x58, 0xbf, 0x6c, 0x9c, 0x6e, 0x8e, 0x80, 0x27, 0x74, 0x4b, 0x29, + 0x6f, 0x03, 0x2d, 0xb1, 0x8b, 0xcd, 0xba, 0xa5, 0x54, 0xbd, 0x7b, 0x3a, 0xce, 0x1e, 0x74, 0x90, + 0x33, 0x67, 0xaf, 0x0b, 0xa6, 0xb0, 0xe6, 0x14, 0x34, 0xd1, 0x17, 0x8d, 0xea, 0xbe, 0xb6, 0x81, + 0x06, 0x0e, 0xd9, 0xb3, 0x40, 0xf2, 0xe7, 0xb0, 0xaa, 0x79, 0xca, 0x94, 0x36, 0x1e, 0x5f, 0xaf, + 0xa1, 0x0b, 0xea, 0x76, 0x25, 0x7b, 0x5c, 0x89, 0x8c, 0x17, 0xd4, 0x10, 0x1a, 0x9f, 0x52, 0x11, + 0x31, 0x57, 0xcd, 0xb5, 0x2a, 0xc1, 0xae, 0x6d, 0x37, 0x3b, 0x87, 0xd9, 0xce, 0x52, 0xaa, 0x59, + 0x5c, 0x9d, 0xaf, 0x59, 0x6e, 0x9d, 0x27, 0x7c, 0xd5, 0xc7, 0xc2, 0x6d, 0x26, 0xd8, 0xa8, 0x94, + 0xdc, 0xc9, 0x99, 0xe5, 0xe8, 0x46, 0x5f, 0xf4, 0x4d, 0xe1, 0xc7, 0x05, 0x2e, 0x44, 0x98, 0xb3, + 0xac, 0xd0, 0xee, 0x0c, 0x9d, 0x33, 0xc5, 0xf2, 0x53, 0xd6, 0x6d, 0x35, 0x29, 0xfc, 0x1c, 0x41, + 0x50, 0xe1, 0x7b, 0x0e, 0x4e, 0x86, 0xf0, 0x56, 0x9f, 0xe2, 0x9d, 0x45, 0x75, 0xe6, 0x74, 0xca, + 0xd6, 0x0e, 0x26, 0x93, 0x95, 0x06, 0x36, 0x76, 0xfa, 0x34, 0xf6, 0xce, 0xa0, 0xcf, 0x3c, 0x12, + 0xcc, 0x2c, 0xc7, 0xd0, 0x1d, 0x21, 0xf6, 0xd3, 0x35, 0x69, 0x52, 0xb2, 0xf9, 0xe8, 0xa7, 0x75, + 0x12, 0x3f, 0x86, 0x6e, 0x2c, 0xcf, 0x84, 0x99, 0xf8, 0x70, 0x28, 0x65, 0xec, 0x17, 0x6c, 0xed, + 0x26, 0xbc, 0x25, 0xfa, 0x89, 0x94, 0xb1, 0x57, 0xae, 0x1d, 0xc1, 0x7a, 0xc5, 0x8b, 0x33, 0x54, + 0xd3, 0xae, 0x36, 0xa0, 0xed, 0x94, 0xe0, 0x47, 0xd4, 0x67, 0xfd, 0x12, 0x56, 0x2b, 0x56, 0x7f, + 0x06, 0x3a, 0x0d, 0x28, 0x49, 0x89, 0xf4, 0x46, 0xff, 0xd7, 0xb0, 0x5d, 0xf1, 0x4d, 0xf2, 0x8e, + 0xb5, 0x06, 0xbc, 0x9b, 0x25, 0xc3, 0x04, 0xf7, 0x38, 0x82, 0xf5, 0xd7, 0x05, 0x8f, 0x5e, 0x95, + 0x75, 0xaa, 0xd7, 0xe5, 0xf5, 0x26, 0xb3, 0x80, 0x60, 0x57, 0xa6, 0xd6, 0xbd, 0xfe, 0x2d, 0x2c, + 0xf5, 0xb9, 0x90, 0x69, 0xa8, 0x99, 0xd2, 0x61, 0xf6, 0x71, 0xb7, 0xdb, 0x80, 0x6b, 0x11, 0x21, + 0x47, 0x4c, 0xe9, 0xde, 0xc7, 0x6e, 0x43, 0xfc, 0xe3, 0x34, 0xdc, 0xee, 0xc9, 0xbd, 0x03, 0x19, + 0xb3, 0xf2, 0x3a, 0xae, 0x05, 0xd3, 0x31, 0x4f, 0x71, 0xfb, 0x9b, 0x0d, 0xcc, 0xbf, 0x64, 0x03, + 0xe6, 0x45, 0x98, 0xd0, 0x0b, 0x96, 0x97, 0x5b, 0xd8, 0x9c, 0x78, 0x8e, 0x3f, 0xc9, 0x3a, 0xcc, + 0x89, 0xf0, 0x84, 0xd1, 0xd8, 0xde, 0x4f, 0xce, 0x06, 0x37, 0xc5, 0x53, 0xf3, 0x8b, 0x6c, 0x03, + 0x88, 0xf0, 0xd5, 0xa9, 0x93, 0xcd, 0xa0, 0x6c, 0x5e, 0x7c, 0x71, 0x6a, 0xa5, 0x77, 0x00, 0x4e, + 0x65, 0x44, 0xfb, 0xa1, 0xe2, 0xdf, 0xda, 0xed, 0x64, 0x36, 0x58, 0xc0, 0x96, 0x43, 0xfe, 0x2d, + 0x23, 0xbf, 0x03, 0x32, 0x18, 0x88, 0x30, 0xe6, 0xa9, 0x5f, 0x7a, 0xde, 0x6c, 0x30, 0xc4, 0xd6, + 0x60, 0x20, 0xf6, 0x79, 0x3a, 0x5a, 0x99, 0x3a, 0x0e, 0x16, 0xca, 0x01, 0x6e, 0x21, 0xb3, 0x01, + 0x94, 0x4d, 0x2f, 0x06, 0xe4, 0x13, 0x98, 0x17, 0x32, 0x4f, 0x43, 0x96, 0x95, 0x17, 0x76, 0xd7, + 0x9b, 0x98, 0x33, 0xda, 0x8f, 0x33, 0x1c, 0x44, 0x2e, 0x33, 0xb3, 0xa0, 0x4c, 0x53, 0xdc, 0x29, + 0x66, 0x83, 0x05, 0xd3, 0x72, 0x64, 0x1a, 0x4c, 0x9d, 0x53, 0x28, 0x16, 0xaa, 0x88, 0x26, 0x2c, + 0x0e, 0x4d, 0x3b, 0xa6, 0xfc, 0xf9, 0x60, 0xa9, 0x50, 0xec, 0x10, 0x5b, 0x03, 0x99, 0x31, 0x33, + 0x85, 0x8a, 0xbd, 0x36, 0x65, 0x38, 0xa6, 0xf5, 0xd9, 0xe0, 0xa6, 0x62, 0xaf, 0x9f, 0x33, 0x53, + 0x20, 0xce, 0xe7, 0xa1, 0xa6, 0xf9, 0x90, 0xe9, 0x46, 0xd9, 0x79, 0x2e, 0x3f, 0x42, 0x65, 0xb7, + 0xb4, 0xff, 0x3d, 0x05, 0x2b, 0x3d, 0xb9, 0x77, 0xa8, 0xa9, 0xc6, 0x25, 0x2f, 0x2f, 0xbb, 0x6f, + 0xc7, 0x5c, 0x69, 0xcf, 0x0b, 0x9b, 0xd4, 0x39, 0x4b, 0x06, 0x53, 0x7b, 0x9f, 0x29, 0x55, 0xc2, + 0x94, 0xab, 0x94, 0xea, 0xe8, 0xa4, 0xd1, 0x71, 0x71, 0x21, 0x3b, 0x70, 0xea, 0xe4, 0x29, 0xac, + 0x64, 0xb6, 0xc8, 0xf1, 0x3a, 0xd1, 0xa4, 0xdc, 0x59, 0xce, 0xb0, 0xd6, 0xa9, 0xba, 0xe1, 0xc6, + 0xf9, 0x8f, 0xb3, 0xb0, 0x50, 0xdf, 0x62, 0xfe, 0x0c, 0x48, 0x79, 0xce, 0x88, 0xb9, 0xd9, 0x4b, + 0x0b, 0xb3, 0xb9, 0x59, 0x67, 0x5e, 0x71, 0x92, 0xfd, 0x4a, 0x40, 0x7e, 0x01, 0x6b, 0x5e, 0x46, + 0x55, 0x34, 0x35, 0x6e, 0x82, 0x4e, 0x69, 0x1d, 0x7d, 0xb5, 0x96, 0x1e, 0xa2, 0x10, 0xfd, 0xf3, + 0x73, 0xb8, 0x6b, 0x4a, 0xd3, 0x98, 0x6a, 0x7a, 0x65, 0x01, 0x3d, 0x8d, 0xbb, 0xd2, 0x76, 0x26, + 0xa3, 0x7d, 0xaa, 0xe9, 0xe4, 0xf2, 0xf9, 0x39, 0xb4, 0xcf, 0x18, 0x1f, 0x9e, 0x68, 0xeb, 0x25, + 0xe1, 0x80, 0x46, 0x5a, 0xe6, 0x8d, 0x4a, 0xb6, 0x15, 0x0b, 0x44, 0x3f, 0xfa, 0x1c, 0x61, 0xe4, + 0x77, 0x70, 0x2b, 0x35, 0x71, 0x3c, 0x7a, 0x2d, 0xff, 0x93, 0x2b, 0x1e, 0x0c, 0xfc, 0x98, 0xc7, + 0xe3, 0xd0, 0x62, 0xea, 0x25, 0x81, 0x0d, 0x98, 0xb7, 0x5c, 0xdc, 0x9e, 0x62, 0x17, 0x82, 0x39, + 0xfc, 0xfd, 0x2c, 0xf6, 0xfd, 0xd5, 0xd6, 0x63, 0xa5, 0xbf, 0xbe, 0x03, 0xb7, 0xf1, 0x20, 0xf4, + 0xa0, 0xba, 0xed, 0x99, 0x47, 0x7f, 0xbf, 0x65, 0xce, 0x3f, 0x0f, 0xca, 0x3b, 0x9e, 0xcf, 0x60, + 0xeb, 0xd2, 0x55, 0xb6, 0x07, 0x59, 0x40, 0x48, 0x77, 0xec, 0x8a, 0xba, 0x86, 0xef, 0xc1, 0x82, + 0xd2, 0x54, 0x63, 0xde, 0x73, 0xf7, 0xd2, 0x3f, 0xbd, 0x6a, 0x84, 0xa3, 0xae, 0x1f, 0xcc, 0x2b, + 0xf7, 0xdb, 0x1c, 0x6c, 0xfd, 0x55, 0x4f, 0xa4, 0xb6, 0xf7, 0xcf, 0x4b, 0xc1, 0xb2, 0xb7, 0xde, + 0xa6, 0x99, 0x7c, 0x0a, 0x1b, 0xa6, 0x87, 0x26, 0xe6, 0x69, 0xc2, 0xbf, 0xb5, 0x88, 0xb2, 0xb3, + 0xb7, 0xb0, 0xb3, 0xe6, 0xf8, 0xf7, 0xa5, 0x2f, 0x77, 0x7d, 0x75, 0xfe, 0xb9, 0x0b, 0x73, 0x6e, + 0xd1, 0xc8, 0x2a, 0xcc, 0xda, 0xea, 0xde, 0x1e, 0xb6, 0xed, 0x0f, 0xb2, 0x09, 0xf3, 0xec, 0x3c, + 0x93, 0x82, 0xb9, 0xab, 0x97, 0xd9, 0xa0, 0xfa, 0xed, 0x28, 0xfe, 0x6e, 0x06, 0x5a, 0xe3, 0x0f, + 0x29, 0xa6, 0x3a, 0x54, 0x09, 0x55, 0x27, 0xe1, 0x20, 0xa7, 0xe5, 0xd5, 0x10, 0xf6, 0xbe, 0x51, + 0x44, 0xaf, 0x22, 0xf6, 0x73, 0x07, 0x75, 0xb5, 0x86, 0xd9, 0xac, 0xc6, 0x38, 0xcb, 0x9d, 0xad, + 0x51, 0x94, 0x77, 0x46, 0x48, 0xf7, 0x1d, 0x94, 0xa4, 0xf0, 0x4e, 0xb5, 0xc5, 0x9a, 0x0a, 0x92, + 0xf9, 0xb5, 0xc0, 0x8f, 0x4c, 0x02, 0x6f, 0x95, 0x4c, 0x07, 0x48, 0x54, 0x17, 0x06, 0x75, 0x54, + 0xfd, 0x1c, 0xd6, 0x86, 0x39, 0x35, 0x07, 0x52, 0xbc, 0xff, 0x08, 0x99, 0x88, 0x6d, 0x74, 0x62, + 0x60, 0xcd, 0x04, 0x6d, 0x94, 0xda, 0xcb, 0x91, 0xc7, 0x22, 0xc6, 0x98, 0x34, 0x59, 0xa9, 0x4f, + 0x15, 0x0b, 0x5d, 0x3c, 0x62, 0xa1, 0xda, 0xe8, 0x9c, 0xb3, 0x6c, 0x60, 0xbf, 0x47, 0x54, 0x60, + 0x40, 0xe4, 0x2b, 0xd8, 0xf4, 0x9f, 0xc8, 0x58, 0x5e, 0x72, 0x16, 0x82, 0xeb, 0x46, 0x9b, 0xd8, + 0xba, 0xf7, 0x44, 0xc6, 0x72, 0xcb, 0xfd, 0x52, 0xf0, 0xd2, 0x1b, 0xfe, 0x6f, 0x1a, 0xda, 0x13, + 0x9e, 0xbf, 0xc8, 0x3d, 0x68, 0x9b, 0x0d, 0x67, 0xf4, 0x2d, 0xcd, 0x3e, 0x67, 0xce, 0x07, 0x2b, + 0x85, 0x62, 0x23, 0x20, 0x45, 0x3e, 0x86, 0x55, 0x2e, 0xb8, 0xe6, 0x34, 0x71, 0xc9, 0xcb, 0x22, + 0x70, 0xa5, 0x67, 0x02, 0xe2, 0x64, 0x38, 0x3d, 0x16, 0x62, 0xf2, 0x7e, 0xcc, 0x22, 0x7a, 0x61, + 0x6b, 0xda, 0x46, 0x47, 0x54, 0xd4, 0xc7, 0xf2, 0xf5, 0x27, 0xb0, 0x54, 0x5e, 0x90, 0xfa, 0xab, + 0x71, 0xcb, 0x35, 0xda, 0x65, 0x38, 0x86, 0x6e, 0xa1, 0x79, 0x15, 0x68, 0x7d, 0x29, 0x0a, 0x55, + 0xa6, 0xc5, 0x26, 0xab, 0xb1, 0xe6, 0xa1, 0x1f, 0x19, 0xb0, 0xcb, 0x8d, 0x5f, 0xc1, 0x26, 0x1e, + 0x13, 0x23, 0x69, 0x0f, 0xa2, 0xa3, 0xcc, 0x8d, 0x16, 0xc5, 0xe0, 0xf7, 0x1c, 0xdc, 0xa7, 0x0e, + 0xe1, 0x0e, 0xd6, 0xfe, 0xf4, 0x2a, 0xf6, 0xb9, 0x26, 0x15, 0xa4, 0xa3, 0x98, 0x60, 0xc0, 0xad, + 0xfa, 0x77, 0x33, 0xb0, 0x3a, 0xe9, 0x55, 0xd2, 0x0c, 0x4d, 0x69, 0xda, 0xe7, 0x09, 0xd7, 0x17, + 0xe1, 0xb7, 0x52, 0xb0, 0x30, 0xc1, 0x3b, 0xfd, 0xbe, 0x2c, 0x44, 0xb3, 0x5c, 0xb0, 0x5e, 0xe1, + 0xbf, 0x96, 0x82, 0x3d, 0x37, 0xe8, 0x47, 0x06, 0x3c, 0x81, 0xba, 0xc8, 0xb2, 0x8a, 0xfa, 0xc6, + 0x8f, 0xa6, 0x7e, 0x69, 0xd0, 0x96, 0xfa, 0x09, 0xb4, 0xf0, 0xde, 0x2f, 0x64, 0x09, 0x55, 0xe6, + 0xc8, 0xa3, 0x2f, 0x1a, 0x16, 0x01, 0x06, 0xf5, 0xb8, 0x02, 0x91, 0x87, 0xb0, 0xe5, 0x7b, 0xcc, + 0x19, 0x17, 0xb1, 0x3c, 0xab, 0xaf, 0xe0, 0xac, 0x93, 0x6d, 0x78, 0x2a, 0xbf, 0x47, 0x8d, 0xea, + 0x1a, 0xee, 0x67, 0xd0, 0x36, 0xe7, 0x74, 0x33, 0x2c, 0x7c, 0xed, 0x76, 0xd7, 0x91, 0xb3, 0x88, + 0x6b, 0xa5, 0x5c, 0xf4, 0x58, 0x8e, 0x37, 0xf3, 0xf6, 0x16, 0xf2, 0x3e, 0xac, 0x62, 0x9e, 0x18, + 0xd7, 0x77, 0x57, 0xbd, 0x46, 0x36, 0x0a, 0xb8, 0x3a, 0x1b, 0xcd, 0x5d, 0x9d, 0x8d, 0x1e, 0xc2, + 0xf6, 0x08, 0x68, 0xdc, 0x9a, 0xbd, 0xef, 0xed, 0x7a, 0xd0, 0x11, 0xa3, 0xce, 0x65, 0xfe, 0x79, + 0x06, 0x3a, 0x13, 0x9f, 0x99, 0xff, 0xf4, 0x99, 0x7a, 0xea, 0x4f, 0x9d, 0xa9, 0x9f, 0x01, 0x79, + 0xd5, 0x47, 0x0c, 0x17, 0x59, 0xa1, 0x6d, 0xef, 0x1a, 0xb9, 0xc4, 0xf2, 0xab, 0x7e, 0x8f, 0xe5, + 0xcf, 0x0c, 0x0a, 0x7b, 0x4c, 0xbe, 0x80, 0xb6, 0xa3, 0x92, 0x85, 0xae, 0xb9, 0x9a, 0x78, 0x43, + 0x0b, 0xb9, 0x5e, 0x20, 0xcc, 0x92, 0xdd, 0x87, 0xb6, 0x7f, 0xcc, 0x55, 0x76, 0x74, 0xce, 0x0d, + 0xc8, 0x88, 0x08, 0xc7, 0x64, 0x6f, 0x53, 0x7d, 0x80, 0x2b, 0x02, 0xdd, 0xcd, 0xba, 0xf5, 0x83, + 0x8d, 0x11, 0x15, 0x5b, 0x09, 0xba, 0x6b, 0xf9, 0x4f, 0x61, 0x63, 0x82, 0xc1, 0x30, 0x2a, 0xcc, + 0xe1, 0xd1, 0x7a, 0xc5, 0xfa, 0x65, 0xb3, 0x7b, 0x46, 0x4c, 0x9e, 0xc2, 0xdd, 0x94, 0x0b, 0x9e, + 0x16, 0x69, 0x18, 0x49, 0x51, 0xbe, 0x9b, 0x8c, 0x68, 0xa3, 0x97, 0x2c, 0x05, 0x3b, 0x4e, 0x6f, + 0xaf, 0x52, 0xf3, 0xaf, 0x07, 0x14, 0xde, 0x3a, 0xe2, 0xc3, 0x9e, 0x9b, 0x21, 0x6f, 0x39, 0xcb, + 0xc7, 0x01, 0x7c, 0xb3, 0x2b, 0xc5, 0xe5, 0x4a, 0x3a, 0x4f, 0xf9, 0x97, 0x1b, 0xd0, 0x99, 0xf8, + 0xb1, 0x00, 0x79, 0x02, 0x77, 0xd9, 0x79, 0xc6, 0x22, 0xe3, 0x28, 0x7e, 0x51, 0x66, 0x0d, 0x58, + 0x47, 0xb6, 0xce, 0x72, 0xa7, 0xd4, 0xf3, 0x89, 0x8c, 0x21, 0xeb, 0xd2, 0x8f, 0x61, 0x99, 0x26, + 0xd9, 0x09, 0xf5, 0xf6, 0xfb, 0x26, 0xde, 0x72, 0x1b, 0x41, 0xf5, 0xe6, 0xbe, 0x07, 0xb7, 0x47, + 0x2b, 0x94, 0x46, 0x7e, 0xb2, 0x34, 0x52, 0x98, 0x98, 0x35, 0x2b, 0xb2, 0x61, 0x4e, 0x63, 0x7c, + 0x5c, 0xd6, 0x2c, 0xf2, 0x52, 0x87, 0x7b, 0x88, 0x58, 0x77, 0x0a, 0xbd, 0x4a, 0x6e, 0xf3, 0x86, + 0x9b, 0xb0, 0x7f, 0x9b, 0x82, 0xce, 0xc4, 0x2f, 0x1f, 0xc8, 0x6f, 0x60, 0xf3, 0x9a, 0x27, 0x4b, + 0x5b, 0xf8, 0x75, 0xc5, 0x55, 0x6f, 0x94, 0x9f, 0xc1, 0xd6, 0x25, 0xb4, 0x49, 0x4f, 0x27, 0x58, + 0x04, 0xb8, 0xd7, 0x97, 0x71, 0xf8, 0x01, 0x17, 0x4f, 0x51, 0x6e, 0x4e, 0x3f, 0x13, 0x1e, 0x1f, + 0xa7, 0xf1, 0xf1, 0x71, 0x65, 0x38, 0xfe, 0xea, 0x58, 0x56, 0x97, 0x53, 0xd0, 0x99, 0xf8, 0x85, + 0x05, 0xf9, 0x08, 0x48, 0x21, 0x34, 0x4f, 0x5c, 0x5e, 0x70, 0x9d, 0xb0, 0x63, 0x68, 0xa1, 0x04, + 0x9d, 0xc8, 0x19, 0x7f, 0x08, 0x5b, 0xe5, 0x9b, 0x9c, 0xf7, 0x91, 0x47, 0xd5, 0x8b, 0x1b, 0xd8, + 0x8b, 0x0d, 0xa7, 0x52, 0x1b, 0x1c, 0xeb, 0xcd, 0xbf, 0xdf, 0x80, 0xf5, 0x2b, 0xbe, 0xc4, 0x20, + 0x7f, 0x05, 0xef, 0x0b, 0x76, 0x36, 0x72, 0xd5, 0x96, 0xb3, 0x21, 0x57, 0xda, 0xdd, 0x27, 0x2b, + 0x4d, 0x73, 0x3d, 0xda, 0xcd, 0x77, 0x05, 0x3b, 0xf3, 0xe8, 0x02, 0x4f, 0xfd, 0xd0, 0x68, 0xbb, + 0xbe, 0x3f, 0x82, 0x3b, 0x38, 0x46, 0x36, 0x7a, 0x91, 0x37, 0xde, 0xfb, 0x2d, 0xa7, 0xe4, 0x77, + 0xb0, 0x54, 0x41, 0xaf, 0x32, 0x3b, 0x83, 0x8f, 0x37, 0x83, 0x4d, 0xb8, 0xb2, 0x2f, 0x62, 0xf3, + 0xc1, 0x7a, 0xa1, 0x98, 0x8f, 0x2d, 0xc5, 0xe4, 0x18, 0xde, 0x9b, 0x88, 0x0b, 0x27, 0xcc, 0xbf, + 0x75, 0xd0, 0x77, 0xb2, 0x09, 0x3c, 0x2f, 0xc7, 0xd6, 0xc4, 0xcd, 0x69, 0x08, 0x1b, 0x57, 0x7e, + 0x6f, 0x62, 0x1c, 0xb6, 0x5c, 0xb6, 0xfa, 0x6b, 0x96, 0x6a, 0xdc, 0x53, 0xf6, 0xe1, 0xda, 0x69, + 0x54, 0x2c, 0xa3, 0x8b, 0xf6, 0xe8, 0xc5, 0xbf, 0x7e, 0xbf, 0x33, 0xf5, 0x87, 0xef, 0x77, 0xa6, + 0xfe, 0xeb, 0xfb, 0x9d, 0xa9, 0x7f, 0xf8, 0x61, 0xe7, 0x8d, 0x3f, 0xfc, 0xb0, 0xf3, 0xc6, 0x1f, + 0x7f, 0xd8, 0x79, 0xe3, 0xeb, 0x5f, 0x0e, 0xb9, 0x3e, 0x29, 0xfa, 0xf7, 0x22, 0x99, 0xde, 0xcf, + 0x72, 0x19, 0x17, 0x91, 0x56, 0x11, 0x1f, 0xfb, 0xe4, 0xcf, 0xff, 0x86, 0x45, 0x5f, 0x64, 0x4c, + 0xf5, 0x6f, 0xe2, 0x57, 0x7a, 0x3f, 0xff, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x33, 0x14, 0x26, + 0xd5, 0x22, 0x28, 0x00, 0x00, } func (this *Params) Equal(that interface{}) bool { @@ -2539,6 +2559,12 @@ func (this *PocParams) Equal(that interface{}) bool { if !this.StatTest.Equal(that1.StatTest) { return false } + if this.ValidationSlots != that1.ValidationSlots { + return false + } + if this.PocNormalizationEnabled != that1.PocNormalizationEnabled { + return false + } return true } func (this *Decimal) Equal(that interface{}) bool { @@ -3867,6 +3893,21 @@ func (m *PocParams) MarshalToSizedBuffer(dAtA []byte) (int, error) { _ = i var l int _ = l + if m.PocNormalizationEnabled { + i-- + if m.PocNormalizationEnabled { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x60 + } + if m.ValidationSlots != 0 { + i = encodeVarintParams(dAtA, i, uint64(m.ValidationSlots)) + i-- + dAtA[i] = 0x58 + } if m.StatTest != nil { { size, err := m.StatTest.MarshalToSizedBuffer(dAtA[:i]) @@ -4976,6 +5017,12 @@ func (m *PocParams) Size() (n int) { l = m.StatTest.Size() n += 1 + l + sovParams(uint64(l)) } + if m.ValidationSlots != 0 { + n += 1 + sovParams(uint64(m.ValidationSlots)) + } + if m.PocNormalizationEnabled { + n += 2 + } return n } @@ -8325,6 +8372,45 @@ func (m *PocParams) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 11: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidationSlots", wireType) + } + m.ValidationSlots = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ValidationSlots |= uint32(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 12: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PocNormalizationEnabled", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowParams + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.PocNormalizationEnabled = bool(v != 0) default: iNdEx = preIndex skippy, err := skipParams(dAtA[iNdEx:]) diff --git a/inference-chain/x/inference/types/poc_validation_snapshot.pb.go b/inference-chain/x/inference/types/poc_validation_snapshot.pb.go new file mode 100644 index 000000000..fc0356076 --- /dev/null +++ b/inference-chain/x/inference/types/poc_validation_snapshot.pb.go @@ -0,0 +1,738 @@ +// Code generated by protoc-gen-gogo. DO NOT EDIT. +// source: inference/inference/poc_validation_snapshot.proto + +package types + +import ( + fmt "fmt" + proto "github.com/cosmos/gogoproto/proto" + io "io" + math "math" + math_bits "math/bits" +) + +// Reference imports to suppress errors if they are not otherwise used. +var _ = proto.Marshal +var _ = fmt.Errorf +var _ = math.Inf + +// This is a compile-time assertion to ensure that this generated file +// is compatible with the proto package it is being compiled against. +// A compilation error at this line likely means your copy of the +// proto package needs to be updated. +const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package + +// PoCValidationSnapshot captures validator weights at validation phase start +// for deterministic sampling synchronization between chain and DAPI. +type PoCValidationSnapshot struct { + PocStageStartHeight int64 `protobuf:"varint,1,opt,name=poc_stage_start_height,json=pocStageStartHeight,proto3" json:"poc_stage_start_height,omitempty"` + SnapshotHeight int64 `protobuf:"varint,2,opt,name=snapshot_height,json=snapshotHeight,proto3" json:"snapshot_height,omitempty"` + AppHash string `protobuf:"bytes,3,opt,name=app_hash,json=appHash,proto3" json:"app_hash,omitempty"` + ValidatorWeights []*ValidatorWeight `protobuf:"bytes,4,rep,name=validator_weights,json=validatorWeights,proto3" json:"validator_weights,omitempty"` + GenerationStartTimestamp int64 `protobuf:"varint,5,opt,name=generation_start_timestamp,json=generationStartTimestamp,proto3" json:"generation_start_timestamp,omitempty"` + ExchangeEndTimestamp int64 `protobuf:"varint,6,opt,name=exchange_end_timestamp,json=exchangeEndTimestamp,proto3" json:"exchange_end_timestamp,omitempty"` +} + +func (m *PoCValidationSnapshot) Reset() { *m = PoCValidationSnapshot{} } +func (m *PoCValidationSnapshot) String() string { return proto.CompactTextString(m) } +func (*PoCValidationSnapshot) ProtoMessage() {} +func (*PoCValidationSnapshot) Descriptor() ([]byte, []int) { + return fileDescriptor_b9d995e793da19be, []int{0} +} +func (m *PoCValidationSnapshot) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *PoCValidationSnapshot) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_PoCValidationSnapshot.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 *PoCValidationSnapshot) XXX_Merge(src proto.Message) { + xxx_messageInfo_PoCValidationSnapshot.Merge(m, src) +} +func (m *PoCValidationSnapshot) XXX_Size() int { + return m.Size() +} +func (m *PoCValidationSnapshot) XXX_DiscardUnknown() { + xxx_messageInfo_PoCValidationSnapshot.DiscardUnknown(m) +} + +var xxx_messageInfo_PoCValidationSnapshot proto.InternalMessageInfo + +func (m *PoCValidationSnapshot) GetPocStageStartHeight() int64 { + if m != nil { + return m.PocStageStartHeight + } + return 0 +} + +func (m *PoCValidationSnapshot) GetSnapshotHeight() int64 { + if m != nil { + return m.SnapshotHeight + } + return 0 +} + +func (m *PoCValidationSnapshot) GetAppHash() string { + if m != nil { + return m.AppHash + } + return "" +} + +func (m *PoCValidationSnapshot) GetValidatorWeights() []*ValidatorWeight { + if m != nil { + return m.ValidatorWeights + } + return nil +} + +func (m *PoCValidationSnapshot) GetGenerationStartTimestamp() int64 { + if m != nil { + return m.GenerationStartTimestamp + } + return 0 +} + +func (m *PoCValidationSnapshot) GetExchangeEndTimestamp() int64 { + if m != nil { + return m.ExchangeEndTimestamp + } + return 0 +} + +type ValidatorWeight struct { + Address string `protobuf:"bytes,1,opt,name=address,proto3" json:"address,omitempty"` + Weight int64 `protobuf:"varint,2,opt,name=weight,proto3" json:"weight,omitempty"` +} + +func (m *ValidatorWeight) Reset() { *m = ValidatorWeight{} } +func (m *ValidatorWeight) String() string { return proto.CompactTextString(m) } +func (*ValidatorWeight) ProtoMessage() {} +func (*ValidatorWeight) Descriptor() ([]byte, []int) { + return fileDescriptor_b9d995e793da19be, []int{1} +} +func (m *ValidatorWeight) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *ValidatorWeight) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_ValidatorWeight.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 *ValidatorWeight) XXX_Merge(src proto.Message) { + xxx_messageInfo_ValidatorWeight.Merge(m, src) +} +func (m *ValidatorWeight) XXX_Size() int { + return m.Size() +} +func (m *ValidatorWeight) XXX_DiscardUnknown() { + xxx_messageInfo_ValidatorWeight.DiscardUnknown(m) +} + +var xxx_messageInfo_ValidatorWeight proto.InternalMessageInfo + +func (m *ValidatorWeight) GetAddress() string { + if m != nil { + return m.Address + } + return "" +} + +func (m *ValidatorWeight) GetWeight() int64 { + if m != nil { + return m.Weight + } + return 0 +} + +func init() { + proto.RegisterType((*PoCValidationSnapshot)(nil), "inference.inference.PoCValidationSnapshot") + proto.RegisterType((*ValidatorWeight)(nil), "inference.inference.ValidatorWeight") +} + +func init() { + proto.RegisterFile("inference/inference/poc_validation_snapshot.proto", fileDescriptor_b9d995e793da19be) +} + +var fileDescriptor_b9d995e793da19be = []byte{ + // 361 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x6c, 0x92, 0xcf, 0x4e, 0x32, 0x31, + 0x14, 0xc5, 0x19, 0xf8, 0x3e, 0xd0, 0x9a, 0x88, 0x16, 0x25, 0xa3, 0x8b, 0x09, 0x21, 0x26, 0xb2, + 0x1a, 0xa2, 0xe8, 0xce, 0x95, 0xc4, 0x84, 0x9d, 0x0a, 0x06, 0x13, 0x37, 0x93, 0xd2, 0xa9, 0xd3, + 0x26, 0xd2, 0x36, 0x6d, 0xf9, 0xe3, 0x5b, 0xf8, 0x58, 0x2e, 0xd9, 0xe9, 0xd2, 0xc0, 0x8b, 0x98, + 0xa9, 0x33, 0xc3, 0x48, 0xdc, 0x4c, 0x6e, 0x7b, 0x7e, 0x67, 0x7a, 0xcf, 0xcd, 0x05, 0x67, 0x8c, + 0x3f, 0x13, 0x45, 0x38, 0x26, 0xed, 0x75, 0x25, 0x05, 0x0e, 0xa6, 0xe8, 0x85, 0x85, 0xc8, 0x30, + 0xc1, 0x03, 0xcd, 0x91, 0xd4, 0x54, 0x18, 0x5f, 0x2a, 0x61, 0x04, 0xac, 0x65, 0xa0, 0x9f, 0x55, + 0xcd, 0x8f, 0x22, 0x38, 0xbc, 0x13, 0xdd, 0x61, 0xe6, 0x1a, 0x24, 0x26, 0xd8, 0x01, 0xf5, 0xf8, + 0x7f, 0xda, 0xa0, 0x88, 0xc4, 0x5f, 0x65, 0x02, 0x4a, 0x58, 0x44, 0x8d, 0xeb, 0x34, 0x9c, 0x56, + 0xa9, 0x5f, 0x93, 0x02, 0x0f, 0x62, 0x71, 0x10, 0x6b, 0x3d, 0x2b, 0xc1, 0x53, 0x50, 0x4d, 0x5f, + 0x4d, 0xe9, 0xa2, 0xa5, 0x77, 0xd3, 0xeb, 0x04, 0x3c, 0x02, 0x5b, 0x48, 0xca, 0x80, 0x22, 0x4d, + 0xdd, 0x52, 0xc3, 0x69, 0x6d, 0xf7, 0x2b, 0x48, 0xca, 0x1e, 0xd2, 0x14, 0xde, 0x83, 0xfd, 0x24, + 0x84, 0x50, 0xc1, 0xcc, 0xe2, 0xda, 0xfd, 0xd7, 0x28, 0xb5, 0x76, 0xce, 0x4f, 0xfc, 0x3f, 0x32, + 0xf8, 0xc3, 0x94, 0x7e, 0xb4, 0x70, 0x7f, 0x6f, 0xfa, 0xfb, 0x42, 0xc3, 0x2b, 0x70, 0x1c, 0x11, + 0x4e, 0x54, 0x32, 0x17, 0x1b, 0xc6, 0xb0, 0x31, 0xd1, 0x06, 0x8d, 0xa5, 0xfb, 0xdf, 0x76, 0xe8, + 0xae, 0x09, 0x9b, 0xe8, 0x21, 0xd5, 0xe1, 0x05, 0xa8, 0x93, 0x39, 0xa6, 0x88, 0x47, 0x24, 0x20, + 0x3c, 0xcc, 0x39, 0xcb, 0xd6, 0x79, 0x90, 0xaa, 0x37, 0x3c, 0xcc, 0x5c, 0xcd, 0x2e, 0xa8, 0x6e, + 0x34, 0x06, 0x5d, 0x50, 0x41, 0x61, 0xa8, 0x88, 0xd6, 0x76, 0x86, 0x71, 0xe6, 0x9f, 0x23, 0xac, + 0x83, 0xf2, 0x2c, 0x3f, 0xae, 0xe4, 0x74, 0x7d, 0xfb, 0xbe, 0xf4, 0x9c, 0xc5, 0xd2, 0x73, 0xbe, + 0x96, 0x9e, 0xf3, 0xb6, 0xf2, 0x0a, 0x8b, 0x95, 0x57, 0xf8, 0x5c, 0x79, 0x85, 0xa7, 0xcb, 0x88, + 0x19, 0x3a, 0x19, 0xf9, 0x58, 0x8c, 0xdb, 0x52, 0x89, 0x70, 0x82, 0x8d, 0xc6, 0x6c, 0x63, 0x21, + 0xe6, 0xb9, 0xda, 0xbc, 0x4a, 0xa2, 0x47, 0x65, 0xbb, 0x0b, 0x9d, 0xef, 0x00, 0x00, 0x00, 0xff, + 0xff, 0x2b, 0xf1, 0x4d, 0x25, 0x40, 0x02, 0x00, 0x00, +} + +func (m *PoCValidationSnapshot) 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 *PoCValidationSnapshot) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *PoCValidationSnapshot) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.ExchangeEndTimestamp != 0 { + i = encodeVarintPocValidationSnapshot(dAtA, i, uint64(m.ExchangeEndTimestamp)) + i-- + dAtA[i] = 0x30 + } + if m.GenerationStartTimestamp != 0 { + i = encodeVarintPocValidationSnapshot(dAtA, i, uint64(m.GenerationStartTimestamp)) + i-- + dAtA[i] = 0x28 + } + if len(m.ValidatorWeights) > 0 { + for iNdEx := len(m.ValidatorWeights) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.ValidatorWeights[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintPocValidationSnapshot(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + } + if len(m.AppHash) > 0 { + i -= len(m.AppHash) + copy(dAtA[i:], m.AppHash) + i = encodeVarintPocValidationSnapshot(dAtA, i, uint64(len(m.AppHash))) + i-- + dAtA[i] = 0x1a + } + if m.SnapshotHeight != 0 { + i = encodeVarintPocValidationSnapshot(dAtA, i, uint64(m.SnapshotHeight)) + i-- + dAtA[i] = 0x10 + } + if m.PocStageStartHeight != 0 { + i = encodeVarintPocValidationSnapshot(dAtA, i, uint64(m.PocStageStartHeight)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *ValidatorWeight) 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 *ValidatorWeight) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *ValidatorWeight) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Weight != 0 { + i = encodeVarintPocValidationSnapshot(dAtA, i, uint64(m.Weight)) + i-- + dAtA[i] = 0x10 + } + if len(m.Address) > 0 { + i -= len(m.Address) + copy(dAtA[i:], m.Address) + i = encodeVarintPocValidationSnapshot(dAtA, i, uint64(len(m.Address))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func encodeVarintPocValidationSnapshot(dAtA []byte, offset int, v uint64) int { + offset -= sovPocValidationSnapshot(v) + base := offset + for v >= 1<<7 { + dAtA[offset] = uint8(v&0x7f | 0x80) + v >>= 7 + offset++ + } + dAtA[offset] = uint8(v) + return base +} +func (m *PoCValidationSnapshot) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PocStageStartHeight != 0 { + n += 1 + sovPocValidationSnapshot(uint64(m.PocStageStartHeight)) + } + if m.SnapshotHeight != 0 { + n += 1 + sovPocValidationSnapshot(uint64(m.SnapshotHeight)) + } + l = len(m.AppHash) + if l > 0 { + n += 1 + l + sovPocValidationSnapshot(uint64(l)) + } + if len(m.ValidatorWeights) > 0 { + for _, e := range m.ValidatorWeights { + l = e.Size() + n += 1 + l + sovPocValidationSnapshot(uint64(l)) + } + } + if m.GenerationStartTimestamp != 0 { + n += 1 + sovPocValidationSnapshot(uint64(m.GenerationStartTimestamp)) + } + if m.ExchangeEndTimestamp != 0 { + n += 1 + sovPocValidationSnapshot(uint64(m.ExchangeEndTimestamp)) + } + return n +} + +func (m *ValidatorWeight) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Address) + if l > 0 { + n += 1 + l + sovPocValidationSnapshot(uint64(l)) + } + if m.Weight != 0 { + n += 1 + sovPocValidationSnapshot(uint64(m.Weight)) + } + return n +} + +func sovPocValidationSnapshot(x uint64) (n int) { + return (math_bits.Len64(x|1) + 6) / 7 +} +func sozPocValidationSnapshot(x uint64) (n int) { + return sovPocValidationSnapshot(uint64((x << 1) ^ uint64((int64(x) >> 63)))) +} +func (m *PoCValidationSnapshot) 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 ErrIntOverflowPocValidationSnapshot + } + 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: PoCValidationSnapshot: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: PoCValidationSnapshot: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PocStageStartHeight", wireType) + } + m.PocStageStartHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPocValidationSnapshot + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PocStageStartHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field SnapshotHeight", wireType) + } + m.SnapshotHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPocValidationSnapshot + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.SnapshotHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AppHash", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPocValidationSnapshot + } + 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 ErrInvalidLengthPocValidationSnapshot + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPocValidationSnapshot + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.AppHash = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ValidatorWeights", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPocValidationSnapshot + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthPocValidationSnapshot + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthPocValidationSnapshot + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.ValidatorWeights = append(m.ValidatorWeights, &ValidatorWeight{}) + if err := m.ValidatorWeights[len(m.ValidatorWeights)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field GenerationStartTimestamp", wireType) + } + m.GenerationStartTimestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPocValidationSnapshot + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.GenerationStartTimestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 6: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field ExchangeEndTimestamp", wireType) + } + m.ExchangeEndTimestamp = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPocValidationSnapshot + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.ExchangeEndTimestamp |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPocValidationSnapshot(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPocValidationSnapshot + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *ValidatorWeight) 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 ErrIntOverflowPocValidationSnapshot + } + 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: ValidatorWeight: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: ValidatorWeight: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Address", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPocValidationSnapshot + } + 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 ErrInvalidLengthPocValidationSnapshot + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthPocValidationSnapshot + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Address = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Weight", wireType) + } + m.Weight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowPocValidationSnapshot + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.Weight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipPocValidationSnapshot(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthPocValidationSnapshot + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func skipPocValidationSnapshot(dAtA []byte) (n int, err error) { + l := len(dAtA) + iNdEx := 0 + depth := 0 + for iNdEx < l { + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPocValidationSnapshot + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= (uint64(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + wireType := int(wire & 0x7) + switch wireType { + case 0: + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPocValidationSnapshot + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + iNdEx++ + if dAtA[iNdEx-1] < 0x80 { + break + } + } + case 1: + iNdEx += 8 + case 2: + var length int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return 0, ErrIntOverflowPocValidationSnapshot + } + if iNdEx >= l { + return 0, io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + length |= (int(b) & 0x7F) << shift + if b < 0x80 { + break + } + } + if length < 0 { + return 0, ErrInvalidLengthPocValidationSnapshot + } + iNdEx += length + case 3: + depth++ + case 4: + if depth == 0 { + return 0, ErrUnexpectedEndOfGroupPocValidationSnapshot + } + depth-- + case 5: + iNdEx += 4 + default: + return 0, fmt.Errorf("proto: illegal wireType %d", wireType) + } + if iNdEx < 0 { + return 0, ErrInvalidLengthPocValidationSnapshot + } + if depth == 0 { + return iNdEx, nil + } + } + return 0, io.ErrUnexpectedEOF +} + +var ( + ErrInvalidLengthPocValidationSnapshot = fmt.Errorf("proto: negative length found during unmarshaling") + ErrIntOverflowPocValidationSnapshot = fmt.Errorf("proto: integer overflow") + ErrUnexpectedEndOfGroupPocValidationSnapshot = fmt.Errorf("proto: unexpected end of group") +) diff --git a/inference-chain/x/inference/types/query.pb.go b/inference-chain/x/inference/types/query.pb.go index b2386d40d..d5c8beb95 100644 --- a/inference-chain/x/inference/types/query.pb.go +++ b/inference-chain/x/inference/types/query.pb.go @@ -8574,6 +8574,102 @@ func (m *QueryRandomSeedsResponse) GetSeeds() []*RandomSeed { return nil } +type QueryPoCValidationSnapshotRequest struct { + PocStageStartHeight int64 `protobuf:"varint,1,opt,name=poc_stage_start_height,json=pocStageStartHeight,proto3" json:"poc_stage_start_height,omitempty"` +} + +func (m *QueryPoCValidationSnapshotRequest) Reset() { *m = QueryPoCValidationSnapshotRequest{} } +func (m *QueryPoCValidationSnapshotRequest) String() string { return proto.CompactTextString(m) } +func (*QueryPoCValidationSnapshotRequest) ProtoMessage() {} +func (*QueryPoCValidationSnapshotRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_cf0cfe3b0e1cc5bd, []int{176} +} +func (m *QueryPoCValidationSnapshotRequest) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoCValidationSnapshotRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoCValidationSnapshotRequest.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 *QueryPoCValidationSnapshotRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoCValidationSnapshotRequest.Merge(m, src) +} +func (m *QueryPoCValidationSnapshotRequest) XXX_Size() int { + return m.Size() +} +func (m *QueryPoCValidationSnapshotRequest) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoCValidationSnapshotRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoCValidationSnapshotRequest proto.InternalMessageInfo + +func (m *QueryPoCValidationSnapshotRequest) GetPocStageStartHeight() int64 { + if m != nil { + return m.PocStageStartHeight + } + return 0 +} + +type QueryPoCValidationSnapshotResponse struct { + Snapshot *PoCValidationSnapshot `protobuf:"bytes,1,opt,name=snapshot,proto3" json:"snapshot,omitempty"` + Found bool `protobuf:"varint,2,opt,name=found,proto3" json:"found,omitempty"` +} + +func (m *QueryPoCValidationSnapshotResponse) Reset() { *m = QueryPoCValidationSnapshotResponse{} } +func (m *QueryPoCValidationSnapshotResponse) String() string { return proto.CompactTextString(m) } +func (*QueryPoCValidationSnapshotResponse) ProtoMessage() {} +func (*QueryPoCValidationSnapshotResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_cf0cfe3b0e1cc5bd, []int{177} +} +func (m *QueryPoCValidationSnapshotResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *QueryPoCValidationSnapshotResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_QueryPoCValidationSnapshotResponse.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 *QueryPoCValidationSnapshotResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_QueryPoCValidationSnapshotResponse.Merge(m, src) +} +func (m *QueryPoCValidationSnapshotResponse) XXX_Size() int { + return m.Size() +} +func (m *QueryPoCValidationSnapshotResponse) XXX_DiscardUnknown() { + xxx_messageInfo_QueryPoCValidationSnapshotResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_QueryPoCValidationSnapshotResponse proto.InternalMessageInfo + +func (m *QueryPoCValidationSnapshotResponse) GetSnapshot() *PoCValidationSnapshot { + if m != nil { + return m.Snapshot + } + return nil +} + +func (m *QueryPoCValidationSnapshotResponse) GetFound() bool { + if m != nil { + return m.Found + } + return false +} + func init() { proto.RegisterType((*QueryParamsRequest)(nil), "inference.inference.QueryParamsRequest") proto.RegisterType((*QueryParamsResponse)(nil), "inference.inference.QueryParamsResponse") @@ -8753,471 +8849,479 @@ func init() { proto.RegisterType((*QueryParticipantsWithBalancesResponse)(nil), "inference.inference.QueryParticipantsWithBalancesResponse") proto.RegisterType((*QueryRandomSeedsRequest)(nil), "inference.inference.QueryRandomSeedsRequest") proto.RegisterType((*QueryRandomSeedsResponse)(nil), "inference.inference.QueryRandomSeedsResponse") + proto.RegisterType((*QueryPoCValidationSnapshotRequest)(nil), "inference.inference.QueryPoCValidationSnapshotRequest") + proto.RegisterType((*QueryPoCValidationSnapshotResponse)(nil), "inference.inference.QueryPoCValidationSnapshotResponse") } func init() { proto.RegisterFile("inference/inference/query.proto", fileDescriptor_cf0cfe3b0e1cc5bd) } var fileDescriptor_cf0cfe3b0e1cc5bd = []byte{ - // 7336 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x7d, 0x69, 0x6c, 0x1c, 0xc9, - 0x75, 0xff, 0xf6, 0x50, 0x07, 0x59, 0xa2, 0x44, 0xaa, 0x56, 0x2b, 0x51, 0x23, 0x89, 0xd2, 0x96, - 0xb4, 0xab, 0x73, 0x39, 0x2b, 0xea, 0x5a, 0xad, 0x24, 0x4a, 0x24, 0x75, 0xae, 0x8e, 0xa5, 0x46, - 0x97, 0xd7, 0x6b, 0x6f, 0xbb, 0x39, 0xd3, 0x24, 0xdb, 0xec, 0x99, 0x9e, 0xed, 0xee, 0xa1, 0x44, - 0xf3, 0x4f, 0xff, 0x61, 0x23, 0x88, 0x3f, 0xe4, 0x70, 0x02, 0x7f, 0x08, 0xe2, 0x04, 0x08, 0x8c, - 0x24, 0x80, 0x03, 0xe4, 0x83, 0x1d, 0xc4, 0x46, 0x6c, 0x38, 0x87, 0x03, 0x38, 0xd8, 0xc4, 0x81, - 0xe1, 0xd8, 0xc6, 0x22, 0x09, 0x02, 0xdb, 0x59, 0x1b, 0x4e, 0xe0, 0x04, 0x59, 0x27, 0x06, 0xf2, - 0x31, 0x09, 0xba, 0xea, 0x55, 0x77, 0x75, 0x4f, 0x75, 0x75, 0xf7, 0x70, 0xd6, 0xfe, 0x42, 0xb0, - 0xab, 0xab, 0x5e, 0xbd, 0xa3, 0xaa, 0xfa, 0xbd, 0x57, 0x55, 0xbf, 0x41, 0x7b, 0xad, 0xe6, 0x9c, - 0xe9, 0x9a, 0xcd, 0x9a, 0x59, 0x89, 0xfe, 0x7b, 0xb3, 0x6d, 0xba, 0xcb, 0x63, 0x2d, 0xd7, 0xf1, - 0x1d, 0xfc, 0x74, 0x58, 0x3c, 0x16, 0xfe, 0x57, 0xde, 0x6a, 0x34, 0xac, 0xa6, 0x53, 0xa1, 0x7f, - 0x59, 0xbd, 0xf2, 0xb6, 0x79, 0x67, 0xde, 0xa1, 0xff, 0x56, 0x82, 0xff, 0xa0, 0x74, 0xf7, 0xbc, - 0xe3, 0xcc, 0xdb, 0x66, 0xc5, 0x68, 0x59, 0x15, 0xa3, 0xd9, 0x74, 0x7c, 0xc3, 0xb7, 0x9c, 0xa6, - 0x07, 0x6f, 0x8f, 0xd4, 0x1c, 0xaf, 0xe1, 0x78, 0x95, 0x59, 0xc3, 0x83, 0x4e, 0x2b, 0x4b, 0xc7, - 0x67, 0x4d, 0xdf, 0x38, 0x5e, 0x69, 0x19, 0xf3, 0x56, 0x93, 0x56, 0x86, 0xba, 0xfb, 0x64, 0x8c, - 0xb6, 0x0c, 0xd7, 0x68, 0x70, 0x6a, 0xfb, 0x65, 0x35, 0x22, 0xee, 0x59, 0xa5, 0xe7, 0x52, 0xc8, - 0xf8, 0x56, 0xcd, 0x6a, 0x19, 0x4d, 0x9f, 0x73, 0x26, 0xab, 0x66, 0xb6, 0x9c, 0xda, 0x82, 0x3e, - 0xef, 0x3a, 0xed, 0x96, 0x5e, 0x37, 0x7c, 0x03, 0xea, 0x1e, 0x94, 0xd5, 0xf5, 0x4c, 0xdf, 0xb7, - 0x4d, 0xdd, 0x68, 0x38, 0xed, 0x90, 0xe8, 0xf1, 0x2c, 0xa2, 0x4b, 0x86, 0x6d, 0xd5, 0x63, 0x1a, - 0x22, 0x52, 0x76, 0x9d, 0xda, 0xac, 0xe1, 0xd7, 0x16, 0xa0, 0xce, 0x61, 0x59, 0x1d, 0xdf, 0x59, - 0x34, 0x9b, 0x4e, 0xc3, 0xaa, 0x79, 0x22, 0xab, 0xd2, 0xaa, 0xed, 0xa6, 0xe5, 0xeb, 0xce, 0x9c, - 0x5e, 0x73, 0x1a, 0xad, 0xb6, 0xcf, 0x15, 0x25, 0x1d, 0x18, 0x0d, 0xa7, 0x6e, 0xda, 0x2a, 0x75, - 0xfb, 0x4e, 0x4b, 0x6f, 0x58, 0x4d, 0xd3, 0x85, 0x4a, 0xa3, 0xa2, 0x85, 0xb9, 0x6d, 0x6b, 0x8e, - 0xc5, 0xad, 0x7a, 0x54, 0x69, 0x33, 0xdd, 0xb7, 0x1a, 0xa6, 0xd3, 0xe6, 0xfa, 0x3b, 0xad, 0xae, - 0x1c, 0x69, 0x4f, 0xaf, 0x9b, 0xbe, 0x61, 0xd9, 0x5c, 0x89, 0x27, 0xd2, 0xf5, 0xde, 0x32, 0xdd, - 0x39, 0xc7, 0x6d, 0x18, 0x41, 0x7b, 0xaf, 0xdd, 0x68, 0x18, 0x7c, 0xdc, 0xcb, 0xad, 0xea, 0xbb, - 0x86, 0xd5, 0xb4, 0x9a, 0xf3, 0xba, 0x6f, 0x78, 0x8b, 0x50, 0xf1, 0x58, 0x66, 0x45, 0xdd, 0x5b, - 0x6e, 0xd6, 0x54, 0x64, 0x17, 0x0c, 0xb7, 0xfe, 0xd8, 0x70, 0x4d, 0xbd, 0xe9, 0xd4, 0x4d, 0x95, - 0xa9, 0xe8, 0x40, 0x35, 0x6c, 0xbd, 0xdd, 0x9a, 0x77, 0x8d, 0xb0, 0xea, 0xf3, 0xb2, 0xaa, 0x4d, - 0xd3, 0x7f, 0xec, 0xb8, 0x8b, 0x22, 0x49, 0xe9, 0x14, 0x9a, 0x75, 0xad, 0xfa, 0xbc, 0xb2, 0x53, - 0xcf, 0x37, 0x7c, 0x4f, 0xaf, 0x9b, 0x4b, 0xa6, 0xed, 0xb4, 0x42, 0xcb, 0xee, 0x4d, 0x55, 0x2a, - 0x54, 0x38, 0x24, 0x1d, 0x40, 0x76, 0xc0, 0x8f, 0xbe, 0x64, 0xba, 0x5e, 0x34, 0xb5, 0xc7, 0xa4, - 0xa4, 0x9e, 0xd4, 0xec, 0x76, 0xdd, 0xac, 0xeb, 0x9d, 0x93, 0xf3, 0x45, 0x59, 0xfd, 0x9a, 0xd3, - 0x9c, 0xb3, 0xdc, 0x06, 0xb3, 0x7f, 0xcb, 0xa9, 0xe9, 0xe6, 0x92, 0x19, 0xb6, 0x90, 0xf2, 0x62, - 0x5b, 0x6f, 0xb6, 0xad, 0xba, 0xe5, 0x2f, 0xeb, 0x2d, 0xc7, 0xb1, 0x95, 0xcb, 0x8c, 0x53, 0xd3, - 0x97, 0xc6, 0x55, 0x2b, 0x88, 0x6b, 0x34, 0xeb, 0x4e, 0x43, 0xf7, 0x4c, 0xb3, 0xce, 0xaa, 0x91, - 0x6d, 0x08, 0xdf, 0x0d, 0x56, 0xb4, 0x19, 0xba, 0x44, 0x55, 0xcd, 0x37, 0xdb, 0xa6, 0xe7, 0x93, - 0x07, 0xe8, 0xe9, 0x58, 0xa9, 0xd7, 0x72, 0x9a, 0x9e, 0x89, 0x27, 0xd0, 0x06, 0xb6, 0x94, 0x8d, - 0x68, 0xfb, 0xb4, 0x43, 0x9b, 0xc6, 0x77, 0x8d, 0x49, 0x56, 0xdd, 0x31, 0xd6, 0x68, 0x6a, 0xe0, - 0xad, 0xef, 0xee, 0x7d, 0xea, 0xb3, 0xff, 0xf2, 0xb9, 0x23, 0x5a, 0x15, 0x5a, 0x91, 0x17, 0xd1, - 0x08, 0x25, 0x7b, 0xcd, 0xf4, 0x6f, 0xf0, 0xea, 0xd0, 0x25, 0xde, 0x86, 0xd6, 0x5b, 0xcd, 0xba, - 0xf9, 0x84, 0x92, 0x1e, 0xa8, 0xb2, 0x07, 0xa2, 0xa3, 0x9d, 0x92, 0x16, 0xc0, 0xce, 0x14, 0x1a, - 0x08, 0x7b, 0x05, 0x8e, 0x46, 0xa5, 0x1c, 0x85, 0x4d, 0xa7, 0xd6, 0x05, 0x4c, 0x55, 0xa3, 0x66, - 0x64, 0x16, 0x58, 0x9a, 0xb4, 0xed, 0x0e, 0x96, 0xae, 0x22, 0x14, 0xad, 0xef, 0xd0, 0xc1, 0xf3, - 0x63, 0x6c, 0xa9, 0x18, 0x0b, 0x96, 0x8a, 0x31, 0xf6, 0x05, 0x82, 0x05, 0x63, 0x6c, 0xc6, 0x98, - 0xe7, 0x6d, 0xab, 0x42, 0x4b, 0xf2, 0x59, 0x0d, 0xa4, 0x88, 0x77, 0x22, 0x97, 0xa2, 0xaf, 0x0b, - 0x29, 0xf0, 0xb5, 0x18, 0xa7, 0x25, 0xca, 0xe9, 0xc1, 0x4c, 0x4e, 0x19, 0x03, 0x31, 0x56, 0xc7, - 0x51, 0x99, 0xeb, 0x7b, 0x26, 0x1a, 0xd0, 0x6a, 0x1b, 0xcd, 0xa3, 0x5d, 0xd2, 0x36, 0x20, 0xdf, - 0x75, 0xb4, 0x49, 0x98, 0x1b, 0xa0, 0xc6, 0x7d, 0x69, 0x23, 0x87, 0xd7, 0x03, 0x19, 0xc5, 0xa6, - 0xa4, 0x0e, 0xcc, 0x4d, 0xda, 0xb6, 0x84, 0xb9, 0x5e, 0x59, 0xeb, 0xdb, 0x1a, 0xc8, 0x93, 0xec, - 0x26, 0x4d, 0x9e, 0xbe, 0x2e, 0xe5, 0xe9, 0x99, 0xd5, 0xf0, 0xb3, 0x68, 0x70, 0xd6, 0x76, 0x6a, - 0x8b, 0xfa, 0x82, 0x69, 0xcd, 0x2f, 0xf8, 0x23, 0x7d, 0xfb, 0xb4, 0x43, 0x7d, 0xd5, 0x4d, 0xb4, - 0xec, 0x3a, 0x2d, 0x22, 0xe7, 0xd1, 0x3e, 0x2a, 0x54, 0x38, 0x88, 0x24, 0x1a, 0x1c, 0x41, 0x1b, - 0x8d, 0x7a, 0xdd, 0x35, 0x3d, 0x0f, 0x0c, 0xcc, 0x1f, 0xc9, 0x03, 0xf4, 0xac, 0xa2, 0x35, 0x28, - 0x66, 0x3b, 0xda, 0xd0, 0x6a, 0xcf, 0x2e, 0x9a, 0xcb, 0xd0, 0x1a, 0x9e, 0x02, 0xb2, 0xb3, 0x86, - 0x1d, 0x7c, 0xbb, 0xa8, 0x8c, 0x7d, 0x55, 0xfe, 0x48, 0x4e, 0xa1, 0x3d, 0x7c, 0xe4, 0x54, 0xe9, - 0xca, 0x74, 0xe5, 0x89, 0x59, 0x6b, 0xfb, 0x8e, 0x2b, 0x0c, 0x38, 0xfa, 0x2d, 0xe7, 0x03, 0x8e, - 0x3e, 0x90, 0x3a, 0x1a, 0x4d, 0x6b, 0x16, 0xce, 0xa9, 0x7e, 0x13, 0xca, 0x0a, 0x0e, 0xb8, 0xb0, - 0x1d, 0x79, 0x3d, 0x62, 0xee, 0x4a, 0xf0, 0xbd, 0xb8, 0x16, 0xf8, 0x3e, 0x97, 0x0d, 0xdf, 0xe0, - 0xcc, 0xed, 0x45, 0x9b, 0xd8, 0xd7, 0x39, 0x9a, 0x13, 0xeb, 0xaa, 0x88, 0x16, 0xdd, 0x08, 0x4a, - 0xf0, 0x4e, 0xd4, 0x4f, 0x19, 0xd6, 0xad, 0x3a, 0x95, 0x7c, 0xa0, 0xba, 0x91, 0x3e, 0xdf, 0xa8, - 0x93, 0x76, 0x24, 0x42, 0x92, 0x38, 0x88, 0x70, 0x0f, 0x0d, 0x27, 0x1d, 0x39, 0x10, 0x65, 0xbf, - 0x54, 0x94, 0x38, 0x19, 0x90, 0x66, 0x8b, 0x19, 0x2b, 0x25, 0xf3, 0x20, 0xd3, 0xa4, 0x6d, 0xcb, - 0x65, 0xea, 0xd5, 0x24, 0xfa, 0x33, 0x0d, 0x04, 0x94, 0xf4, 0xa4, 0x14, 0xb0, 0x6f, 0x4d, 0x02, - 0xf6, 0x6e, 0x21, 0xbc, 0x18, 0x2d, 0x6a, 0xf7, 0xa8, 0x8f, 0x3c, 0x49, 0x5d, 0x64, 0xae, 0xa7, - 0x7d, 0x9d, 0x8b, 0xda, 0x40, 0x7c, 0xb1, 0xb2, 0xd1, 0x6e, 0x39, 0x01, 0x10, 0xff, 0x16, 0xda, - 0x1c, 0x73, 0xbe, 0x41, 0xd9, 0xcf, 0x4a, 0x65, 0x17, 0x29, 0x80, 0xe4, 0x83, 0x9e, 0x50, 0x46, - 0xcc, 0x68, 0xcd, 0x92, 0xb1, 0xdb, 0x2b, 0xb3, 0x7e, 0x41, 0x03, 0xa9, 0x3a, 0xfa, 0x49, 0x97, - 0xaa, 0xaf, 0x6b, 0xa9, 0x7a, 0x67, 0x4d, 0x0b, 0x1d, 0xe8, 0x9c, 0x6e, 0x0f, 0xa3, 0x30, 0x26, - 0xb7, 0x59, 0x93, 0x93, 0xbe, 0x94, 0x9c, 0xf4, 0xe4, 0xd7, 0x35, 0xf4, 0x5c, 0x46, 0x5f, 0xa0, - 0xab, 0x05, 0xb4, 0x23, 0x25, 0xaa, 0x02, 0x0b, 0x1d, 0xc9, 0x98, 0x07, 0x02, 0x51, 0x50, 0xdf, - 0x33, 0xa6, 0xec, 0x25, 0x69, 0x82, 0xf8, 0xb1, 0xc9, 0x28, 0x11, 0xbf, 0x57, 0xc3, 0xe4, 0x1f, - 0xb9, 0x0e, 0xd2, 0x3b, 0xcc, 0xa3, 0x83, 0xbe, 0x1e, 0xea, 0xa0, 0x77, 0x63, 0x69, 0x1a, 0x56, - 0xb6, 0x19, 0xa7, 0x36, 0x15, 0x84, 0xb7, 0xa6, 0x77, 0xd5, 0x71, 0xef, 0xf9, 0x91, 0x2a, 0x3a, - 0x3e, 0xc7, 0x5a, 0xe7, 0xe7, 0xb8, 0x8d, 0xf6, 0xa6, 0x12, 0x01, 0xd5, 0x54, 0xd1, 0x40, 0xe0, - 0xd0, 0xd3, 0x10, 0x1a, 0x94, 0x51, 0x91, 0x7f, 0xc4, 0x9c, 0x69, 0xa0, 0xf1, 0xc8, 0xf2, 0x17, - 0x84, 0x4f, 0x1a, 0xd7, 0x48, 0x7f, 0x0b, 0x7a, 0x21, 0x5f, 0xd2, 0x50, 0x39, 0xbd, 0x7a, 0x8e, - 0xe1, 0xbf, 0x03, 0x6d, 0x6c, 0xb5, 0x67, 0xf5, 0xe0, 0x23, 0x5f, 0x0a, 0x3f, 0xf2, 0x37, 0xcd, - 0x65, 0x3c, 0x8a, 0x36, 0x2d, 0x98, 0x4f, 0x74, 0xfe, 0xb2, 0x8f, 0xbe, 0x1c, 0x58, 0x30, 0x9f, - 0xcc, 0xb0, 0xf7, 0x97, 0x44, 0x69, 0xd6, 0x51, 0x69, 0xf6, 0x28, 0xa5, 0xe9, 0xe0, 0xfd, 0x1a, - 0x22, 0x5c, 0x65, 0x82, 0x5d, 0xbb, 0xd0, 0xfd, 0x27, 0x34, 0xb4, 0x5f, 0x49, 0x09, 0x0c, 0xf0, - 0x21, 0xb4, 0x85, 0x46, 0x54, 0x61, 0x15, 0xb0, 0xc2, 0x89, 0x34, 0xbe, 0x05, 0x62, 0x29, 0x96, - 0xd8, 0xdc, 0x12, 0xbb, 0x24, 0x7f, 0xab, 0xa1, 0x51, 0x75, 0xbb, 0xf7, 0xd2, 0x24, 0xaf, 0x76, - 0xc8, 0xc7, 0xec, 0x42, 0xb2, 0xe5, 0x93, 0x8b, 0x73, 0x03, 0x96, 0x99, 0x40, 0xaf, 0xe3, 0x6b, - 0xb3, 0xd1, 0x2f, 0xf1, 0x15, 0x24, 0x9d, 0x16, 0x58, 0x69, 0x36, 0xc5, 0x4a, 0xa7, 0xba, 0xb0, - 0xd2, 0xc3, 0x71, 0xb9, 0x60, 0xdf, 0xd4, 0xd0, 0xbe, 0xac, 0x96, 0xef, 0xa5, 0xa5, 0xee, 0xa6, - 0x58, 0xea, 0x40, 0xb6, 0x8c, 0x69, 0x22, 0x7d, 0x92, 0x7f, 0xc9, 0x83, 0xda, 0xe3, 0xf7, 0x7c, - 0xc7, 0x35, 0xa7, 0x9d, 0x46, 0xc3, 0x0a, 0x5d, 0x86, 0x09, 0xb4, 0x3b, 0xe8, 0xd3, 0x0b, 0x94, - 0x1d, 0xfc, 0x75, 0x7d, 0x5d, 0x62, 0xb4, 0x91, 0x96, 0x53, 0xa3, 0xf6, 0xb8, 0x17, 0xd4, 0x98, - 0x8a, 0x2c, 0x88, 0x2b, 0xe8, 0x69, 0x41, 0x76, 0x9d, 0x07, 0x16, 0x4c, 0x70, 0x2c, 0xbc, 0x9a, - 0x84, 0x18, 0x63, 0x01, 0x7c, 0xd3, 0x4e, 0x86, 0xc0, 0xd2, 0xdb, 0xd0, 0xfa, 0x5a, 0xe8, 0x29, - 0x6d, 0xae, 0xb2, 0x07, 0xbc, 0x0b, 0x0d, 0xb8, 0x8e, 0xe3, 0xeb, 0x0b, 0x86, 0xb7, 0x40, 0xa9, - 0x0f, 0x56, 0xfb, 0x83, 0x82, 0xeb, 0x86, 0xb7, 0x10, 0x34, 0x99, 0x73, 0xda, 0xcd, 0x3a, 0x55, - 0x69, 0x7f, 0x95, 0x3d, 0x90, 0xdf, 0xd0, 0x60, 0xa0, 0xde, 0xbe, 0x75, 0xc7, 0xa9, 0x9b, 0x8f, - 0x28, 0xc3, 0x97, 0x2d, 0xcf, 0x77, 0xad, 0xd9, 0x76, 0xa0, 0x9d, 0x9f, 0x9b, 0x0e, 0x3e, 0x02, - 0xa3, 0x3e, 0x9d, 0x31, 0xd0, 0xc5, 0x39, 0xb4, 0xf1, 0x31, 0x7d, 0xeb, 0x29, 0x3d, 0x2c, 0x91, - 0x4e, 0x95, 0xb7, 0x88, 0xb4, 0x52, 0x12, 0xb5, 0xf2, 0x61, 0x74, 0x28, 0x0c, 0x7b, 0x13, 0x26, - 0xe8, 0x98, 0xc1, 0x6b, 0x54, 0x0c, 0x79, 0x8c, 0x0e, 0xe7, 0xe8, 0x0b, 0x64, 0x7d, 0x05, 0x6d, - 0xac, 0xb1, 0x57, 0x20, 0xeb, 0x8b, 0xa9, 0xc3, 0x5e, 0x24, 0x14, 0x4c, 0x51, 0xd0, 0x6b, 0x95, - 0x13, 0x20, 0x9f, 0xd1, 0xd0, 0x2e, 0x45, 0xc5, 0x34, 0x8b, 0x69, 0x69, 0x16, 0x8b, 0x06, 0x65, - 0x29, 0x75, 0x50, 0xf6, 0x25, 0x06, 0x65, 0x62, 0xb6, 0xaf, 0x4b, 0xcc, 0x76, 0xe2, 0xa2, 0x17, - 0xb9, 0x72, 0xd2, 0xc6, 0x41, 0xcf, 0x0d, 0xf2, 0x29, 0x0d, 0x1d, 0x2f, 0xd0, 0x29, 0x58, 0xe6, - 0x0d, 0xb4, 0xb9, 0x2e, 0x56, 0x00, 0xfb, 0xbc, 0x94, 0x39, 0x16, 0x45, 0xb2, 0xa2, 0x9d, 0xe2, - 0xe4, 0x02, 0xae, 0xf6, 0xe7, 0x68, 0x56, 0xdc, 0x6a, 0xc2, 0xf4, 0x29, 0x15, 0x9d, 0x3e, 0x64, - 0x4f, 0x14, 0x1a, 0x4e, 0xb7, 0x5d, 0xd7, 0x6c, 0x32, 0x3f, 0x9f, 0xe7, 0x4e, 0x4f, 0x46, 0x81, - 0x5f, 0xfc, 0x75, 0xb4, 0x8c, 0x51, 0x0f, 0x15, 0x12, 0x06, 0xec, 0x81, 0xec, 0x8d, 0xb2, 0x0d, - 0xf7, 0xc3, 0x3d, 0x11, 0x21, 0x32, 0x27, 0x7e, 0x94, 0x31, 0x48, 0x56, 0x08, 0x1d, 0xc6, 0xa1, - 0xc4, 0x76, 0x8a, 0x32, 0x61, 0x10, 0xa7, 0xc2, 0xe3, 0x69, 0x3f, 0x56, 0x4a, 0x6e, 0xc3, 0x44, - 0xbd, 0x66, 0xfa, 0x0f, 0x9a, 0x96, 0xff, 0xea, 0xdc, 0x34, 0xdb, 0x7d, 0x99, 0x71, 0xad, 0x9a, - 0x39, 0xe3, 0x3a, 0x2d, 0xc7, 0x33, 0xec, 0xfc, 0x41, 0xf1, 0xa7, 0x34, 0x74, 0x24, 0x0f, 0x3d, - 0x90, 0xe8, 0x26, 0xea, 0x6f, 0x41, 0x19, 0x88, 0x22, 0xf7, 0x80, 0x15, 0xa4, 0x42, 0x02, 0x78, - 0x04, 0x6d, 0xac, 0x9b, 0x73, 0x46, 0xdb, 0xf6, 0x21, 0x6a, 0xe3, 0x8f, 0x64, 0x3f, 0x64, 0xb7, - 0x44, 0x73, 0x25, 0x33, 0x23, 0x64, 0x19, 0xdc, 0xcf, 0x94, 0x4a, 0xef, 0x65, 0xd6, 0xe6, 0x00, - 0xf7, 0x7c, 0x5d, 0x73, 0xc9, 0x72, 0xda, 0x9e, 0x9c, 0xc1, 0x8f, 0x70, 0xaf, 0x36, 0xa5, 0xd6, - 0x7b, 0xc9, 0xa1, 0x8e, 0x9e, 0x61, 0xdf, 0x2d, 0xa7, 0x6e, 0xda, 0xde, 0xa4, 0x6d, 0xf7, 0x3a, - 0xa2, 0xfc, 0x4d, 0x0d, 0x6d, 0x4f, 0xf6, 0x00, 0x02, 0x9d, 0x8e, 0x72, 0x84, 0xc1, 0x4c, 0x2e, - 0xcb, 0x67, 0x72, 0x50, 0x03, 0x98, 0x67, 0xd5, 0x7b, 0x17, 0x10, 0x9e, 0x40, 0x3b, 0xa2, 0x99, - 0xd9, 0xba, 0x6d, 0x35, 0x4d, 0x37, 0x3b, 0xa3, 0xfa, 0x81, 0x68, 0x2b, 0x24, 0x6a, 0x04, 0x12, - 0x5d, 0x42, 0x03, 0xe1, 0x06, 0x25, 0xe8, 0x6c, 0x4f, 0xca, 0x14, 0x66, 0x2d, 0x79, 0xac, 0xe4, - 0xc3, 0x33, 0x31, 0x80, 0xa5, 0x49, 0xdb, 0x4e, 0xb2, 0xd4, 0x2b, 0x8b, 0xfc, 0xbe, 0x16, 0xed, - 0x9c, 0x64, 0x49, 0xd0, 0x57, 0x58, 0x82, 0xde, 0x59, 0xc7, 0x81, 0x48, 0x5b, 0xdc, 0x41, 0xba, - 0xcf, 0xf6, 0x6b, 0xb9, 0x4a, 0x8e, 0xa0, 0x61, 0xf3, 0x49, 0xcb, 0x72, 0x69, 0x83, 0xeb, 0xd1, - 0x07, 0x73, 0x5d, 0xb5, 0xa3, 0x3c, 0x58, 0xe3, 0x42, 0xee, 0x6f, 0xf0, 0xb4, 0xae, 0x58, 0x44, - 0xfe, 0x1f, 0x64, 0xda, 0xa5, 0x1d, 0x82, 0x7e, 0xde, 0x87, 0xb6, 0x76, 0xec, 0x1e, 0x83, 0x2d, - 0x9e, 0x53, 0xef, 0xfd, 0x00, 0x25, 0xd0, 0xd7, 0xb0, 0x95, 0x28, 0x27, 0x16, 0x88, 0x2b, 0x6e, - 0x35, 0x25, 0xc4, 0xed, 0xd5, 0x08, 0xf8, 0x9a, 0x06, 0x92, 0x4a, 0xfb, 0x52, 0x4b, 0xda, 0xb7, - 0x66, 0x49, 0x7b, 0x37, 0x42, 0xe6, 0xa3, 0x6f, 0x5c, 0xd8, 0x79, 0x14, 0x29, 0x5d, 0x66, 0x7b, - 0xf4, 0xc2, 0x8c, 0x66, 0xc9, 0xbe, 0x3a, 0x0c, 0x11, 0xfe, 0x98, 0x63, 0x64, 0xfc, 0xae, 0xf0, - 0xf5, 0x53, 0xf5, 0x04, 0xaa, 0x6b, 0xa3, 0xb2, 0x95, 0x5a, 0x4b, 0xf9, 0x3d, 0x4c, 0x27, 0x0e, - 0xda, 0x54, 0x10, 0x26, 0x5e, 0xe4, 0x9b, 0x67, 0xab, 0xa3, 0x57, 0x63, 0xe9, 0xdf, 0xb9, 0x6a, - 0x32, 0x7a, 0xcd, 0xa9, 0x9a, 0xbe, 0xf7, 0x44, 0x35, 0xbd, 0x1b, 0x72, 0x6f, 0xa0, 0x63, 0x8a, - 0x81, 0x40, 0x37, 0xd0, 0x4d, 0xdf, 0x74, 0x43, 0x35, 0x0f, 0xa3, 0x3e, 0xab, 0xce, 0x04, 0x1b, - 0xa8, 0x06, 0xff, 0xe2, 0xdd, 0x68, 0xc0, 0x65, 0x2f, 0x4d, 0x17, 0xc6, 0x5a, 0x54, 0x40, 0xfe, - 0xa4, 0x84, 0x5e, 0xc8, 0xd9, 0x01, 0x68, 0xf4, 0x0e, 0x1a, 0x86, 0xf4, 0x82, 0xe3, 0xea, 0x2d, - 0xe7, 0xb1, 0xe9, 0x7a, 0xca, 0xdd, 0x98, 0x87, 0xbc, 0xf2, 0x4c, 0x50, 0xb7, 0x3a, 0xb4, 0x14, - 0x7b, 0xf6, 0xf0, 0x73, 0x68, 0x4b, 0x8d, 0x79, 0x4a, 0x3c, 0x04, 0x61, 0x4e, 0xd7, 0x66, 0x28, - 0x85, 0xe5, 0xf4, 0x46, 0xe0, 0x94, 0x31, 0xab, 0xf5, 0x75, 0x65, 0xb5, 0x2a, 0x6f, 0x8f, 0xaf, - 0x04, 0xc6, 0xe1, 0x72, 0xd1, 0xa8, 0x2a, 0x6d, 0x89, 0x49, 0x28, 0xc2, 0xab, 0x0a, 0x0d, 0xc9, - 0x35, 0xb4, 0x25, 0x2e, 0x5b, 0xe0, 0xb0, 0x53, 0x85, 0x70, 0x87, 0x9d, 0x3e, 0x64, 0x6f, 0x04, - 0xdc, 0x86, 0x11, 0x4d, 0x1d, 0xa8, 0x99, 0xe8, 0x00, 0xcf, 0x3d, 0x76, 0x7e, 0x67, 0x6a, 0x59, - 0x8c, 0x1a, 0x32, 0x37, 0x13, 0xc9, 0x6f, 0x69, 0xe8, 0x68, 0x2e, 0x7a, 0x60, 0x50, 0x1b, 0x32, - 0xeb, 0x9d, 0x35, 0xc1, 0xae, 0xc7, 0xd2, 0xdd, 0x3d, 0x09, 0x75, 0x36, 0x39, 0xd2, 0x48, 0x92, - 0x65, 0x88, 0x59, 0x53, 0x99, 0x93, 0x6c, 0x37, 0x67, 0xee, 0x9f, 0x1e, 0x40, 0x9b, 0x85, 0xe0, - 0x21, 0x5c, 0x53, 0xe3, 0x85, 0x41, 0x48, 0x7f, 0xbc, 0x40, 0xdf, 0x79, 0xd4, 0xa3, 0xf5, 0x5a, - 0x3d, 0x2d, 0xf4, 0x7c, 0x6c, 0x3f, 0xa4, 0xb3, 0x4a, 0xaf, 0x17, 0xd4, 0xef, 0x6b, 0xe8, 0x60, - 0x66, 0x97, 0x3f, 0x8f, 0xa1, 0xd2, 0xbb, 0x45, 0xf4, 0x08, 0x38, 0xa0, 0xf7, 0xe1, 0x10, 0xdb, - 0x7d, 0xc3, 0x5b, 0xe4, 0x6a, 0xdc, 0x82, 0x4a, 0x16, 0xff, 0x42, 0x97, 0xac, 0x3a, 0xa9, 0xc2, - 0x09, 0x9c, 0x78, 0x5d, 0x90, 0xff, 0x14, 0x5a, 0xe7, 0x1b, 0xde, 0xa2, 0x72, 0x07, 0x36, 0xd6, - 0x90, 0x56, 0x27, 0x17, 0x80, 0xe6, 0x75, 0x38, 0x16, 0x77, 0xc7, 0xa9, 0x9b, 0xf9, 0x77, 0x12, - 0xc9, 0x43, 0x38, 0xcd, 0x92, 0x68, 0x0e, 0x3c, 0xbd, 0x84, 0xd6, 0x37, 0x83, 0x02, 0x60, 0x4a, - 0x9e, 0x93, 0x8f, 0x37, 0x65, 0x0d, 0xc8, 0x28, 0xe4, 0x1f, 0x62, 0x2f, 0xa3, 0x90, 0x8c, 0xbc, - 0x06, 0x99, 0x86, 0xce, 0xf7, 0x9d, 0x5d, 0xf7, 0x15, 0xeb, 0xfa, 0x59, 0x70, 0x3e, 0xef, 0xb6, - 0xcd, 0xb6, 0x59, 0x17, 0x55, 0x16, 0x9e, 0x2c, 0x7b, 0x1d, 0x7c, 0x46, 0x69, 0x15, 0x60, 0xe0, - 0x0c, 0x5a, 0x1f, 0x28, 0x58, 0x9d, 0xda, 0x8c, 0x19, 0x84, 0xd5, 0x0f, 0x33, 0x33, 0xe2, 0x3b, - 0x41, 0xf2, 0x47, 0xa0, 0x99, 0x8e, 0xd7, 0x6b, 0xed, 0xf7, 0x0e, 0x4c, 0xef, 0xf8, 0x09, 0x28, - 0xc8, 0x14, 0xdc, 0xf3, 0x0d, 0x3f, 0x1c, 0x16, 0x1d, 0x4b, 0x9a, 0x26, 0x5b, 0xd2, 0x0c, 0x98, - 0xbb, 0x2a, 0x7a, 0xd1, 0xa1, 0x9b, 0xc7, 0x62, 0xc4, 0x02, 0x4f, 0x78, 0x14, 0x21, 0xd7, 0x6c, - 0xb5, 0xfd, 0x68, 0x96, 0xad, 0xaf, 0x0a, 0x25, 0xe4, 0x68, 0xe4, 0xf4, 0xc6, 0xcf, 0x39, 0x49, - 0xb8, 0x26, 0xdf, 0x11, 0x1c, 0x57, 0x55, 0xed, 0x70, 0x53, 0x77, 0xa7, 0x98, 0x8e, 0xe3, 0x7e, - 0x00, 0x3d, 0xa0, 0xa9, 0x5c, 0x51, 0xd2, 0x08, 0xef, 0x68, 0xc9, 0x5f, 0x74, 0xec, 0x24, 0x95, - 0x3a, 0x76, 0x92, 0xf0, 0x4e, 0xd4, 0x0f, 0x5f, 0x99, 0x3a, 0x9c, 0x8b, 0xe2, 0x1e, 0x3b, 0x79, - 0x4b, 0x43, 0x3b, 0x52, 0xba, 0x0c, 0xfc, 0x17, 0x51, 0x06, 0x4b, 0x6e, 0x29, 0x41, 0xfd, 0xa5, - 0x98, 0xfa, 0x0f, 0xa3, 0x61, 0x73, 0x6e, 0xce, 0xac, 0xf9, 0xd6, 0x92, 0xa9, 0x43, 0x8d, 0x75, - 0xb4, 0xc6, 0x50, 0x58, 0xce, 0xf2, 0x8a, 0x78, 0x3f, 0xda, 0x5c, 0x33, 0x5a, 0x2d, 0xb3, 0xce, - 0xeb, 0xad, 0xa7, 0xf5, 0x06, 0x59, 0xe1, 0x23, 0x99, 0x39, 0xfb, 0x3a, 0xcc, 0xf9, 0xf9, 0x12, - 0xda, 0x26, 0x88, 0x72, 0xb5, 0x6d, 0xdb, 0x4c, 0x8e, 0x83, 0x68, 0xc8, 0xa8, 0xd1, 0xa4, 0x74, - 0x22, 0x2d, 0xba, 0x05, 0x8a, 0x79, 0x4a, 0xf4, 0x30, 0x1a, 0x76, 0x5a, 0xa6, 0x4b, 0xfd, 0xbf, - 0xf8, 0x46, 0xc5, 0x10, 0x2f, 0xe7, 0x55, 0x33, 0x98, 0xc1, 0xe7, 0x50, 0xd9, 0x34, 0xdc, 0xa6, - 0x59, 0xd7, 0x6b, 0x8e, 0xd5, 0xf4, 0xc2, 0x01, 0xc0, 0xd2, 0x9e, 0x4c, 0x0d, 0x3b, 0x58, 0x8d, - 0xe9, 0xa0, 0x82, 0x98, 0x52, 0xc3, 0x17, 0xd0, 0x2e, 0xd7, 0x7c, 0x6c, 0xb8, 0xf5, 0xb0, 0xb9, - 0x6d, 0xf8, 0xa6, 0xc7, 0x5b, 0x33, 0xe5, 0x8c, 0xf0, 0x2a, 0xb4, 0xfd, 0x2d, 0x5a, 0x81, 0x35, - 0x3f, 0x0c, 0xe9, 0x2d, 0x8f, 0x9e, 0x13, 0xb7, 0x4d, 0xdf, 0xac, 0x8f, 0x6c, 0xa0, 0xa9, 0xf9, - 0x21, 0x56, 0x3e, 0xcd, 0x8b, 0xc3, 0xb4, 0x9f, 0xb8, 0x8f, 0x17, 0x2a, 0x8e, 0x0f, 0xfd, 0x8f, - 0xf2, 0xdc, 0x9b, 0xbc, 0x52, 0x18, 0xe5, 0x8a, 0x59, 0x66, 0x2f, 0x36, 0xd4, 0x0f, 0x67, 0x0d, - 0xf5, 0x88, 0xdc, 0x56, 0x91, 0x08, 0x2d, 0x22, 0x1f, 0x85, 0x5d, 0x19, 0xfa, 0x34, 0xb5, 0x1c, - 0x04, 0xbf, 0x33, 0xa6, 0x6b, 0x39, 0xf5, 0xa9, 0xe5, 0xcb, 0xfc, 0xa8, 0x33, 0x5f, 0x5c, 0x76, - 0xa3, 0x81, 0xf0, 0xf8, 0x33, 0x58, 0x39, 0x2a, 0xc0, 0xbb, 0xd0, 0x40, 0x10, 0x7f, 0xeb, 0x73, - 0xae, 0xd3, 0x80, 0x89, 0xd2, 0x1f, 0x14, 0x5c, 0x75, 0x9d, 0x06, 0xde, 0x81, 0x36, 0xd2, 0x97, - 0xbe, 0x03, 0x93, 0x64, 0x43, 0xf0, 0x78, 0xdf, 0x21, 0x36, 0xac, 0x13, 0xea, 0xfe, 0x41, 0x0d, - 0x17, 0xd1, 0xfa, 0x6c, 0xc9, 0xc3, 0x66, 0x02, 0xc9, 0x2a, 0x6b, 0x47, 0x16, 0x20, 0x6c, 0x81, - 0x57, 0x61, 0xd5, 0xc9, 0x66, 0x9d, 0x9a, 0x77, 0xca, 0xa8, 0x2d, 0x06, 0x86, 0xf7, 0xf2, 0x89, - 0xcc, 0xe7, 0xbe, 0xa7, 0xf3, 0x25, 0x90, 0xcd, 0x7d, 0xef, 0x0e, 0xa9, 0xa2, 0x53, 0xf1, 0x13, - 0x8d, 0xde, 0x64, 0xb3, 0x4e, 0x53, 0xe2, 0x1e, 0x74, 0x4e, 0x3b, 0xf4, 0x3a, 0x7a, 0x14, 0x69, - 0x6a, 0x71, 0x9a, 0x0b, 0xe0, 0x04, 0xa7, 0xd3, 0x8c, 0xd4, 0xc7, 0xc9, 0x75, 0x67, 0x95, 0x3a, - 0xc4, 0x8f, 0xe9, 0x3d, 0xb1, 0x3c, 0xe9, 0xda, 0x7a, 0xd1, 0x11, 0xa2, 0x64, 0xd8, 0x4a, 0x22, - 0x3d, 0x8b, 0x19, 0x50, 0x36, 0x2c, 0x9d, 0xee, 0x1a, 0x78, 0x9c, 0xb2, 0x61, 0x31, 0x56, 0x82, - 0x85, 0x22, 0xb4, 0xbb, 0xc7, 0x17, 0x8a, 0xa8, 0x84, 0x78, 0x60, 0xee, 0x6c, 0x31, 0xc2, 0x73, - 0x9d, 0x83, 0xec, 0x98, 0x3f, 0xed, 0x9c, 0x8f, 0xb3, 0xbd, 0xe9, 0x29, 0x5f, 0x36, 0xaf, 0x36, - 0xd1, 0x46, 0x8c, 0x16, 0xf9, 0x34, 0x3f, 0x5a, 0x90, 0xd6, 0x6b, 0xd8, 0x5b, 0x4c, 0x36, 0x4d, - 0x29, 0x5b, 0x29, 0x29, 0x1b, 0x3e, 0x89, 0xb6, 0x1b, 0x35, 0xbf, 0x6d, 0xd8, 0x7a, 0x54, 0xa8, - 0xd7, 0x1c, 0x8f, 0x9f, 0xce, 0xdd, 0xc6, 0xde, 0x46, 0x4c, 0x4c, 0x3b, 0x9e, 0x4f, 0x08, 0xb8, - 0x47, 0xd3, 0x74, 0x69, 0x8e, 0x7d, 0x6a, 0xc3, 0x25, 0xe9, 0x2c, 0xdf, 0xae, 0x90, 0xd6, 0x89, - 0x76, 0x99, 0x7c, 0xc7, 0x87, 0x7d, 0x93, 0xbe, 0x2a, 0x7b, 0x20, 0x23, 0x90, 0x45, 0xbf, 0x6c, - 0xce, 0xb6, 0xe7, 0x63, 0xeb, 0xdc, 0x37, 0xfa, 0x20, 0x65, 0x2c, 0xbe, 0x0a, 0x8f, 0x58, 0x6c, - 0x66, 0x5a, 0x9f, 0x5d, 0xa6, 0x29, 0x3c, 0x50, 0xfb, 0x84, 0x54, 0xed, 0x29, 0x44, 0xc6, 0xee, - 0x9b, 0x8d, 0x96, 0xe3, 0x1a, 0x2e, 0x9d, 0x03, 0xc1, 0x2b, 0xb0, 0x0a, 0x9b, 0x14, 0xd8, 0x44, - 0x5b, 0xc2, 0x3e, 0xd8, 0x4a, 0xcf, 0x36, 0xe6, 0x2e, 0x76, 0xd7, 0x09, 0x9d, 0xbc, 0xb4, 0x97, - 0x41, 0x4f, 0x98, 0xce, 0x65, 0x17, 0x6d, 0xed, 0x60, 0x24, 0x63, 0x11, 0x09, 0x17, 0xb5, 0x52, - 0x77, 0x8b, 0x5a, 0xd9, 0x47, 0xb8, 0x93, 0xaf, 0x8c, 0x4e, 0x2f, 0xc5, 0x3b, 0x3d, 0x92, 0xab, - 0x53, 0x96, 0x00, 0x80, 0xa5, 0xf4, 0x70, 0xe4, 0x43, 0xde, 0xb6, 0x9a, 0x56, 0xa3, 0xdd, 0x88, - 0xd2, 0x1e, 0x93, 0x4b, 0xa6, 0x1b, 0xc5, 0x8d, 0xe4, 0x73, 0x1a, 0x7c, 0x64, 0x94, 0x75, 0x61, - 0x30, 0xec, 0x47, 0x9b, 0x7d, 0xd7, 0x98, 0x9b, 0xb3, 0x6a, 0xfa, 0xac, 0xe1, 0x59, 0x1e, 0xf8, - 0x9d, 0x83, 0x50, 0x38, 0x15, 0x94, 0xe1, 0xf3, 0xa8, 0xdc, 0x60, 0x84, 0xc4, 0xeb, 0x4e, 0x06, - 0x23, 0x05, 0x6e, 0xc5, 0x48, 0x23, 0xa5, 0x2b, 0xe9, 0x71, 0xf6, 0x75, 0xf1, 0xf3, 0x41, 0xcf, - 0xc1, 0x66, 0xd7, 0x8d, 0xe6, 0x8c, 0xeb, 0xcc, 0x07, 0x5e, 0x89, 0x34, 0xda, 0xd0, 0xe1, 0xa0, - 0x47, 0x6a, 0xb5, 0xb5, 0x7a, 0xfe, 0x67, 0xa2, 0x6d, 0xdb, 0x19, 0x76, 0xe9, 0xe9, 0x01, 0xbb, - 0xf3, 0xc4, 0x57, 0xde, 0xed, 0x68, 0xc3, 0x42, 0xcc, 0x3f, 0x67, 0x4f, 0xc4, 0x8b, 0xb6, 0x73, - 0x93, 0x0d, 0x81, 0xa7, 0xbb, 0xe0, 0x81, 0x86, 0x6f, 0x94, 0xdb, 0x74, 0x71, 0x22, 0x7c, 0x9b, - 0x2e, 0x4e, 0x40, 0x3c, 0xfe, 0x2d, 0xe7, 0xb6, 0x57, 0xd9, 0x87, 0xaf, 0x08, 0xc7, 0xbf, 0x0b, - 0x88, 0xd7, 0xb7, 0x26, 0xf1, 0x7a, 0x97, 0x59, 0xb8, 0x9e, 0x08, 0x14, 0x6f, 0x2e, 0x55, 0xcd, - 0x9a, 0xe3, 0xd6, 0x05, 0xa3, 0x06, 0xe6, 0x0f, 0xf7, 0x00, 0xe0, 0x09, 0x0f, 0xa3, 0xbe, 0xe8, - 0x70, 0x57, 0xf0, 0x2f, 0x99, 0x05, 0x8d, 0x77, 0x52, 0x02, 0x35, 0x4c, 0xa2, 0x0d, 0x2e, 0x2d, - 0x01, 0x6d, 0x1f, 0xce, 0x1c, 0x7a, 0x37, 0x1f, 0x02, 0x09, 0x68, 0x48, 0x26, 0x60, 0x90, 0xdf, - 0xb2, 0x3c, 0x3f, 0xd9, 0xcf, 0x4d, 0x73, 0xd9, 0xcb, 0xe0, 0x9a, 0x9c, 0x83, 0xef, 0x61, 0x7a, - 0x7b, 0xe0, 0x15, 0xa3, 0x75, 0x8b, 0xe6, 0x32, 0x4f, 0x43, 0xd3, 0xff, 0xc9, 0x07, 0x13, 0x21, - 0xf7, 0x94, 0xe1, 0xba, 0x56, 0xe4, 0x92, 0x4e, 0xa0, 0x3e, 0xd7, 0x7c, 0x53, 0x99, 0x52, 0xbb, - 0x66, 0xfa, 0xd0, 0x28, 0x58, 0xc6, 0xda, 0x9c, 0xdd, 0x6a, 0xd0, 0x90, 0x18, 0x09, 0x4b, 0x84, - 0xe4, 0x43, 0xf5, 0xad, 0x73, 0x4d, 0xaf, 0x05, 0xc6, 0x7e, 0x21, 0x67, 0x07, 0x60, 0x72, 0xda, - 0x94, 0x7c, 0x10, 0x86, 0x2a, 0xef, 0x62, 0xd2, 0xb6, 0x96, 0xe2, 0xb9, 0x9c, 0x73, 0xa2, 0x10, - 0x87, 0xd3, 0xfa, 0xe8, 0x68, 0xc7, 0x25, 0xd8, 0x9b, 0x4a, 0x3e, 0xbc, 0x56, 0x27, 0x0a, 0x71, - 0x24, 0x4f, 0x07, 0x31, 0x09, 0x7e, 0x45, 0x8b, 0xb6, 0x1c, 0xa7, 0xe8, 0x3d, 0xc9, 0xfb, 0xae, - 0xd1, 0xf4, 0x8c, 0x9a, 0x78, 0x96, 0xed, 0x59, 0x34, 0xe8, 0xb8, 0xd6, 0xbc, 0xd5, 0xd4, 0x6b, - 0x0b, 0x86, 0xd5, 0xe4, 0x19, 0x29, 0x56, 0x36, 0x1d, 0x14, 0x45, 0xeb, 0x6e, 0xb3, 0xdd, 0x98, - 0x0d, 0xb7, 0x15, 0xd8, 0xba, 0x7b, 0x87, 0x16, 0x05, 0xab, 0xbf, 0x6b, 0xd6, 0x4c, 0xab, 0xe5, - 0x43, 0xd6, 0x96, 0x9d, 0x55, 0x1c, 0x84, 0x42, 0x96, 0xaa, 0xfe, 0x98, 0x06, 0x1e, 0x8a, 0x9c, - 0x1f, 0x90, 0xfa, 0x03, 0x08, 0xcf, 0x26, 0x5f, 0xf2, 0x05, 0xf8, 0x79, 0xa9, 0x0e, 0x3a, 0x68, - 0xc1, 0x3a, 0x20, 0xa1, 0x43, 0x16, 0x81, 0x85, 0x49, 0xdb, 0xee, 0x68, 0xd6, 0xf3, 0xdd, 0xab, - 0xaf, 0x6b, 0x10, 0x25, 0xa6, 0xf4, 0xf6, 0xb3, 0x90, 0xb8, 0x77, 0xab, 0xdf, 0xf7, 0x35, 0xf4, - 0xf4, 0x23, 0x97, 0x66, 0x1f, 0xa8, 0xaf, 0x3b, 0xc5, 0x6e, 0x6b, 0xe1, 0x3b, 0x08, 0x51, 0x5f, - 0x38, 0x70, 0x68, 0x1d, 0xe5, 0xfe, 0x23, 0x63, 0x5b, 0xa4, 0x31, 0xed, 0x34, 0x7d, 0xd7, 0xa8, - 0xf9, 0xd5, 0x01, 0x4a, 0xe2, 0x46, 0x73, 0xce, 0x09, 0xd6, 0x23, 0x6f, 0xb9, 0x31, 0xeb, 0xd8, - 0xfc, 0x34, 0x2c, 0x7b, 0x12, 0xef, 0x8b, 0xb1, 0xd1, 0xc5, 0x1f, 0x71, 0x19, 0xf5, 0xd7, 0xcd, - 0x9a, 0xd5, 0x30, 0x6c, 0x0f, 0x8e, 0xcd, 0x85, 0xcf, 0xf8, 0x28, 0xda, 0x4a, 0x33, 0xcd, 0xbe, - 0x6f, 0xd6, 0x75, 0xde, 0x7e, 0x3d, 0xad, 0x34, 0x1c, 0xbe, 0x00, 0x51, 0xc2, 0xdb, 0x70, 0x12, - 0x31, 0xbd, 0xec, 0xb3, 0x1b, 0x16, 0x8c, 0x2d, 0x79, 0x6b, 0x30, 0xf6, 0x65, 0xd4, 0x0f, 0x5c, - 0x70, 0x13, 0x1f, 0x92, 0xea, 0x4a, 0x42, 0xa4, 0x1a, 0xb6, 0x24, 0x17, 0x61, 0x60, 0x31, 0x8d, - 0x42, 0x02, 0xc6, 0xf4, 0xa6, 0x96, 0xe9, 0x8c, 0x15, 0x62, 0x52, 0x3a, 0xa9, 0xa3, 0x34, 0xd5, - 0x46, 0xfa, 0x4c, 0x2f, 0x9a, 0xed, 0x57, 0x12, 0x08, 0xb7, 0xff, 0x06, 0x0c, 0xfe, 0x4e, 0x79, - 0xf3, 0x82, 0xd1, 0xe1, 0xe6, 0x04, 0x7a, 0xfc, 0x42, 0x6a, 0x48, 0x82, 0x3c, 0x00, 0x8f, 0x12, - 0x9c, 0xbb, 0xd8, 0x58, 0xb8, 0xea, 0xb8, 0xf7, 0x45, 0xa7, 0xe3, 0x30, 0x1a, 0xae, 0x01, 0xbd, - 0x44, 0x8e, 0x6a, 0xa8, 0x16, 0xef, 0x87, 0x5c, 0x85, 0x6c, 0x84, 0x9a, 0x2c, 0xc8, 0xb4, 0x13, - 0xf5, 0x5b, 0x1e, 0xf3, 0x3f, 0x29, 0xbd, 0xfe, 0xea, 0x46, 0xcb, 0xa3, 0x2d, 0xc9, 0x2e, 0x48, - 0xdd, 0xdf, 0xe2, 0x77, 0xab, 0x67, 0x1c, 0x27, 0x4c, 0x13, 0xbf, 0x09, 0x89, 0xf9, 0xc4, 0x4b, - 0xa0, 0x9a, 0x3a, 0x2c, 0x82, 0xf1, 0x5c, 0x73, 0xea, 0x7c, 0xef, 0x7f, 0x5d, 0x15, 0x9e, 0xf2, - 0xb8, 0xb3, 0x3b, 0xe0, 0xfc, 0xd4, 0x15, 0xb6, 0xf9, 0x35, 0xe7, 0x70, 0x5e, 0x7e, 0x54, 0x82, - 0x88, 0x4d, 0x78, 0x03, 0x8c, 0x64, 0x9f, 0xa2, 0xc7, 0x67, 0xc3, 0xfb, 0xda, 0xa5, 0xec, 0xfb, - 0xda, 0xcc, 0x86, 0xd0, 0x00, 0x4f, 0xa3, 0xc1, 0x58, 0xde, 0xad, 0x8f, 0x12, 0x28, 0xa7, 0x6f, - 0x04, 0xf1, 0x0b, 0xae, 0xb6, 0x90, 0x8c, 0x3b, 0x87, 0xca, 0x56, 0x10, 0xf4, 0x26, 0xae, 0xbc, - 0x1b, 0x34, 0xfd, 0x49, 0x67, 0x70, 0x7f, 0x75, 0x87, 0xe5, 0x4d, 0x0b, 0x15, 0x66, 0x9c, 0xda, - 0x24, 0x7d, 0x8d, 0x6d, 0xb4, 0x87, 0x55, 0xd4, 0xe5, 0x77, 0xe6, 0xe9, 0xe4, 0x4e, 0xfb, 0x1e, - 0xc7, 0x49, 0x4e, 0x5f, 0x09, 0x1a, 0x54, 0xcb, 0x8c, 0x5e, 0xa2, 0x3b, 0xfa, 0x8e, 0x5c, 0x83, - 0x79, 0x42, 0x83, 0xea, 0x19, 0x67, 0x7a, 0x96, 0x5d, 0x91, 0x99, 0x84, 0x8d, 0x6a, 0x61, 0x5b, - 0x47, 0x50, 0x30, 0x24, 0x80, 0x12, 0x17, 0x6d, 0x0f, 0xa8, 0x09, 0xc9, 0x4e, 0xb3, 0xaf, 0x83, - 0x83, 0xc3, 0xe4, 0x26, 0x44, 0x6d, 0xbc, 0xb5, 0x70, 0x21, 0xaa, 0x38, 0x2b, 0x97, 0x60, 0x12, - 0x2a, 0x89, 0x29, 0xd9, 0xe1, 0x27, 0x0f, 0x27, 0x5b, 0x2d, 0xd7, 0x59, 0x82, 0x89, 0xe6, 0x25, - 0x26, 0x30, 0xf9, 0xff, 0xa0, 0xbb, 0xb4, 0x5a, 0x61, 0x92, 0x74, 0xc8, 0x80, 0x1a, 0x51, 0x52, - 0x25, 0x3d, 0xa4, 0x86, 0x6f, 0x5f, 0x50, 0xb1, 0x6a, 0xc6, 0x6f, 0xbe, 0x6f, 0x31, 0x62, 0x3d, - 0x91, 0x89, 0xc8, 0xdf, 0xa0, 0x49, 0x9e, 0x19, 0xd3, 0xa5, 0x6f, 0xe8, 0x51, 0x50, 0x61, 0x91, - 0x0c, 0x6f, 0xe3, 0x6a, 0xf1, 0xdb, 0xb8, 0x33, 0x20, 0x66, 0x4a, 0xfb, 0x48, 0x45, 0xad, 0xa0, - 0x20, 0x3c, 0x07, 0x10, 0x3c, 0xa4, 0x1c, 0xa6, 0x3f, 0x18, 0x5d, 0x02, 0x9c, 0xb4, 0xed, 0x4e, - 0xa2, 0x61, 0x84, 0x7a, 0x01, 0x72, 0x6c, 0xb4, 0x54, 0xc1, 0x63, 0xd4, 0x7b, 0x49, 0xe8, 0x9d, - 0xb8, 0xd1, 0xce, 0x53, 0x5a, 0x3f, 0xe1, 0xb5, 0xf5, 0x41, 0x46, 0x9a, 0x36, 0xcc, 0x91, 0x3a, - 0xa3, 0xed, 0xf9, 0xac, 0x6e, 0x84, 0x25, 0x1e, 0x39, 0x1b, 0x1d, 0x70, 0xa6, 0x15, 0xa7, 0x8d, - 0x96, 0x51, 0xb3, 0xfc, 0xe5, 0x1c, 0x8a, 0xbe, 0x1b, 0x85, 0xcb, 0x89, 0xa6, 0xc0, 0x65, 0x19, - 0xf5, 0xd7, 0xa0, 0x0c, 0xd4, 0x1c, 0x3e, 0xa7, 0x68, 0x7a, 0x7f, 0x64, 0x7b, 0xae, 0x01, 0xa0, - 0x6a, 0x45, 0x5a, 0x5e, 0x8e, 0x0c, 0x2c, 0xab, 0x14, 0x1d, 0x8d, 0x65, 0x8c, 0xd7, 0xc2, 0x77, - 0xca, 0x3d, 0xd0, 0x98, 0x08, 0xa0, 0xa9, 0xa1, 0x46, 0x9c, 0x38, 0xb9, 0x8a, 0x36, 0xc7, 0xea, - 0xa9, 0x6c, 0x2c, 0x4a, 0x5f, 0x8a, 0x4b, 0x4f, 0x96, 0xb8, 0x9c, 0xae, 0xd1, 0xf4, 0xcd, 0xe0, - 0x0b, 0x7e, 0xdb, 0xf4, 0x3c, 0x63, 0xde, 0xbc, 0xbf, 0xdc, 0x0a, 0xc7, 0xf8, 0x41, 0x34, 0x34, - 0x4f, 0xdf, 0xbb, 0xc9, 0xdd, 0x1e, 0x28, 0xe6, 0x5b, 0x38, 0x87, 0xd0, 0x70, 0x83, 0x35, 0xd7, - 0xfd, 0xe5, 0x96, 0xa9, 0xb7, 0x5d, 0xee, 0x85, 0x6d, 0x69, 0x44, 0x64, 0x1f, 0xb8, 0x36, 0x39, - 0x8f, 0x36, 0x42, 0x97, 0x8a, 0x4f, 0x5f, 0xda, 0xcd, 0x26, 0xf2, 0x06, 0x57, 0xbc, 0x9c, 0xeb, - 0x70, 0xc7, 0xb9, 0x7f, 0x1e, 0x2a, 0x80, 0xc2, 0x77, 0xcb, 0x83, 0x20, 0x56, 0xa9, 0x1a, 0xd6, - 0x26, 0x27, 0x12, 0xf1, 0xf5, 0xa4, 0x6d, 0x3b, 0x8f, 0x83, 0x40, 0x96, 0x6b, 0x04, 0xa3, 0x75, - 0xae, 0x63, 0x9b, 0xb0, 0x3c, 0xd2, 0xff, 0xc9, 0x44, 0x47, 0xc4, 0x17, 0x36, 0x02, 0x86, 0x76, - 0x27, 0xdd, 0xa1, 0x01, 0xd1, 0xb9, 0xe1, 0x49, 0x5a, 0x21, 0xf1, 0x9a, 0xec, 0x97, 0x4c, 0x76, - 0x6e, 0x2e, 0x15, 0xed, 0x66, 0x54, 0x98, 0x67, 0xf4, 0x22, 0xc2, 0x43, 0x06, 0x47, 0xc3, 0xbb, - 0x68, 0x09, 0x93, 0x29, 0xfe, 0x1e, 0xc8, 0xbf, 0x8a, 0xb6, 0xc4, 0x81, 0x6c, 0x94, 0x87, 0x09, - 0x62, 0x34, 0xf8, 0xa5, 0x31, 0xd6, 0x1e, 0x0a, 0xc9, 0x34, 0x08, 0x7e, 0x05, 0x40, 0x6f, 0x24, - 0xd9, 0xe9, 0xec, 0x83, 0x4c, 0x35, 0xd0, 0x8c, 0x9c, 0x48, 0x18, 0x12, 0xaf, 0xb7, 0x7c, 0xb3, - 0xa1, 0x76, 0x9d, 0x25, 0x14, 0xaa, 0xac, 0x19, 0x39, 0xc4, 0x0f, 0xdc, 0x48, 0xbe, 0xf8, 0xe0, - 0x0d, 0x80, 0x16, 0x3f, 0x11, 0x1e, 0x94, 0x51, 0x54, 0x8d, 0x36, 0x04, 0x2c, 0x8f, 0xbb, 0x2f, - 0xcc, 0xa5, 0xec, 0xb7, 0x3c, 0xf0, 0x57, 0x2e, 0xa2, 0xf5, 0xcc, 0x2f, 0x29, 0x15, 0xf5, 0x4b, - 0x58, 0x3b, 0x72, 0x39, 0xcc, 0xeb, 0x77, 0xd6, 0xc9, 0xaf, 0xde, 0x79, 0x7e, 0x4f, 0x41, 0x4e, - 0x25, 0x4a, 0x3b, 0xd1, 0x4e, 0xd5, 0x9f, 0x60, 0x29, 0xb7, 0xd0, 0x90, 0xfc, 0x8e, 0x86, 0xb6, - 0x0b, 0x9a, 0x7f, 0x64, 0xf9, 0x0b, 0x3c, 0x52, 0xec, 0x19, 0xe4, 0x0b, 0x3e, 0x27, 0x44, 0x51, - 0x2c, 0x15, 0xbe, 0x33, 0x16, 0xd2, 0xf2, 0x60, 0x76, 0xda, 0xb1, 0xf8, 0x98, 0x8d, 0x82, 0x27, - 0x7e, 0xed, 0x5d, 0x1c, 0x61, 0x02, 0x9b, 0x3d, 0x4f, 0x03, 0xfc, 0x38, 0xbc, 0xb4, 0x9a, 0xda, - 0x21, 0xa8, 0xff, 0x01, 0x1a, 0x14, 0xb7, 0x7a, 0xc1, 0x08, 0x47, 0xb3, 0x34, 0x24, 0xd0, 0xe2, - 0x78, 0x09, 0x22, 0x99, 0x9f, 0x29, 0xa0, 0xcc, 0xcb, 0xb0, 0x5f, 0xc4, 0x10, 0x58, 0xee, 0x99, - 0x66, 0x3d, 0xff, 0x18, 0xbd, 0x0b, 0x27, 0xb7, 0x62, 0x6d, 0xc3, 0xc3, 0x58, 0xeb, 0xbd, 0xa0, - 0x40, 0xe9, 0xa0, 0x44, 0x0d, 0xab, 0xac, 0xf6, 0xf8, 0x4f, 0x7f, 0x51, 0x43, 0xeb, 0x29, 0x51, - 0xfc, 0x49, 0x0d, 0x6d, 0x60, 0x31, 0x0d, 0x3e, 0x98, 0xbe, 0x7b, 0x14, 0x03, 0xbc, 0x2a, 0x1f, - 0xca, 0xae, 0xc8, 0xf8, 0x23, 0xe3, 0x1f, 0xff, 0xf6, 0x0f, 0x3f, 0x55, 0x3a, 0x86, 0x8f, 0x54, - 0x5a, 0xae, 0x53, 0x6f, 0xd7, 0x7c, 0xaf, 0x66, 0xa5, 0x61, 0xbd, 0x01, 0xf0, 0x1f, 0xfe, 0x03, - 0x0d, 0x0d, 0x84, 0x1b, 0x7d, 0xf8, 0x85, 0xf4, 0xbe, 0x24, 0xc0, 0x58, 0xe5, 0xb1, 0xbc, 0xd5, - 0x81, 0xc1, 0x0b, 0x94, 0xc1, 0x33, 0xf8, 0x54, 0x1e, 0x06, 0xa3, 0xff, 0x56, 0xa8, 0xb1, 0x56, - 0xf1, 0xef, 0x69, 0x68, 0x30, 0x24, 0x3a, 0x69, 0xdb, 0x2a, 0x76, 0x25, 0xa0, 0x59, 0x2a, 0x76, - 0x65, 0xf0, 0x57, 0xe4, 0x14, 0x65, 0xb7, 0x82, 0x5f, 0x28, 0xc4, 0x2e, 0xfe, 0xbc, 0x86, 0x36, - 0x09, 0x33, 0x03, 0x57, 0x94, 0x5a, 0xea, 0x3c, 0x7d, 0x5a, 0x7e, 0x31, 0x7f, 0x03, 0xe0, 0xf4, - 0x22, 0xe5, 0xf4, 0x2c, 0x3e, 0x93, 0xd3, 0xf2, 0x9c, 0x40, 0xa8, 0xda, 0x3f, 0xd4, 0xd0, 0x96, - 0xb8, 0x3f, 0xa0, 0x62, 0x5b, 0x8a, 0x72, 0xa5, 0x62, 0x5b, 0x8e, 0x57, 0x45, 0xce, 0x50, 0xb6, - 0x8f, 0xe3, 0x4a, 0x41, 0xb6, 0xf1, 0xb7, 0x34, 0xb4, 0x4d, 0x06, 0xf8, 0x84, 0x4f, 0xa5, 0xf3, - 0xa0, 0x80, 0x97, 0x2a, 0x9f, 0x2e, 0xda, 0x0c, 0x04, 0xb8, 0x49, 0x05, 0xb8, 0x82, 0xa7, 0x0b, - 0x8d, 0x10, 0x3d, 0x66, 0x01, 0xf0, 0xaa, 0x56, 0xf1, 0x9f, 0x6a, 0x68, 0x6b, 0x07, 0x6e, 0x14, - 0x1e, 0x57, 0x0e, 0x06, 0x29, 0x36, 0x55, 0xf9, 0x44, 0xa1, 0x36, 0xdd, 0x8c, 0xa1, 0x79, 0xd3, - 0xd7, 0x01, 0xb1, 0x8f, 0xa3, 0x52, 0xe1, 0xaf, 0x69, 0x68, 0x4b, 0xfc, 0x4a, 0x5e, 0x06, 0xf3, - 0xd2, 0xcb, 0x82, 0x19, 0xcc, 0xcb, 0xaf, 0x0e, 0x92, 0x57, 0x28, 0xf3, 0x97, 0xf1, 0x54, 0x1e, - 0xe6, 0x93, 0x97, 0x0c, 0x2b, 0x2b, 0xc2, 0x37, 0x61, 0x15, 0x7f, 0x59, 0x43, 0x5b, 0xe3, 0xdd, - 0x04, 0xd3, 0x61, 0x5c, 0x39, 0xba, 0x0b, 0x8b, 0x92, 0x0a, 0x3e, 0x45, 0xce, 0x53, 0x51, 0x4e, - 0xe3, 0x93, 0xdd, 0x88, 0x82, 0xbf, 0xa2, 0xa1, 0x41, 0x11, 0xbc, 0x08, 0xab, 0x17, 0x13, 0x09, - 0x22, 0x53, 0xf9, 0x78, 0x81, 0x16, 0xc0, 0xf3, 0x35, 0xca, 0xf3, 0x24, 0xbe, 0x98, 0x87, 0xe7, - 0x18, 0x0a, 0x53, 0x65, 0x45, 0x98, 0x0c, 0xab, 0xc1, 0xda, 0x39, 0x24, 0xf6, 0x10, 0x68, 0x5e, - 0xbd, 0xae, 0x14, 0x94, 0x20, 0x05, 0x1d, 0x8a, 0x9c, 0xa5, 0x12, 0x9c, 0xc0, 0xc7, 0x0b, 0x4b, - 0x80, 0xdf, 0xd5, 0xd0, 0x33, 0x52, 0xd4, 0x1f, 0x7c, 0x36, 0xe7, 0x50, 0xee, 0xc4, 0x3b, 0x2a, - 0xbf, 0xdc, 0x4d, 0x53, 0x90, 0x45, 0xa7, 0xb2, 0xbc, 0x86, 0x1f, 0x15, 0x1d, 0x41, 0x42, 0x16, - 0x2e, 0x6e, 0x97, 0xc4, 0x0c, 0x79, 0x5b, 0x43, 0x23, 0x52, 0x16, 0x02, 0x73, 0x9d, 0xcd, 0x39, - 0xe8, 0x8b, 0x09, 0x9d, 0x05, 0xd7, 0x44, 0xa6, 0xa9, 0xd0, 0x17, 0xf0, 0xb9, 0x35, 0x08, 0x8d, - 0xff, 0x4e, 0x43, 0xb8, 0x13, 0xf7, 0x08, 0x2b, 0xe6, 0x71, 0x2a, 0xd4, 0x52, 0xf9, 0x64, 0xb1, - 0x46, 0x20, 0xc6, 0x0c, 0x15, 0xe3, 0x15, 0x7c, 0x3d, 0xd7, 0x27, 0x91, 0xc3, 0x16, 0x99, 0x9e, - 0x3e, 0xe7, 0xb8, 0x0c, 0x63, 0xa1, 0xb2, 0x22, 0xfa, 0xc7, 0xab, 0xf8, 0x9f, 0x83, 0x60, 0x48, - 0x0a, 0x27, 0x84, 0xcf, 0x28, 0x59, 0x4c, 0x87, 0xc9, 0x29, 0xbf, 0x54, 0xbc, 0x21, 0xc8, 0x77, - 0x9f, 0xca, 0x77, 0x07, 0xdf, 0xca, 0x2b, 0x9f, 0x60, 0x9e, 0x74, 0x19, 0x7f, 0xac, 0xa1, 0x91, - 0x34, 0x38, 0x1e, 0xd5, 0x80, 0xcc, 0x80, 0x03, 0x52, 0x0d, 0xc8, 0x2c, 0xf4, 0x1f, 0xf2, 0x88, - 0x4a, 0x7a, 0x17, 0xbf, 0x9a, 0x5b, 0xd2, 0xf1, 0x7c, 0xc2, 0xbe, 0xab, 0xa1, 0xe1, 0x24, 0x50, - 0x08, 0x3e, 0xae, 0xe2, 0x54, 0x0a, 0xa3, 0x53, 0x1e, 0x2f, 0xd2, 0x04, 0x84, 0xf2, 0xa9, 0x50, - 0x4d, 0x6c, 0x17, 0x10, 0xca, 0x0b, 0xe8, 0xe8, 0x0c, 0xe6, 0xa4, 0xb2, 0xa2, 0xc2, 0x02, 0x59, - 0x8d, 0xad, 0x3a, 0x7a, 0xe8, 0x19, 0xfd, 0x6a, 0x09, 0x8d, 0xa4, 0x81, 0x6d, 0xa8, 0xcc, 0x9b, - 0x01, 0xa2, 0xa3, 0x32, 0x6f, 0x16, 0xcc, 0x0d, 0x59, 0xa1, 0x9a, 0x68, 0x63, 0x2f, 0x8f, 0x26, - 0x20, 0xd7, 0xc5, 0x4e, 0xd1, 0xeb, 0x22, 0x92, 0x48, 0x77, 0x0a, 0xf9, 0x78, 0x09, 0xed, 0x56, - 0x01, 0xd4, 0xe0, 0x0b, 0x6a, 0x5f, 0x3c, 0x03, 0x44, 0xa7, 0x3c, 0xd1, 0x6d, 0x73, 0x50, 0x4e, - 0x8d, 0x2a, 0xe7, 0x83, 0xf8, 0xf5, 0x3c, 0xca, 0x31, 0x6c, 0x5b, 0x97, 0x0c, 0x15, 0x2f, 0x43, - 0x35, 0xf8, 0x33, 0x25, 0x74, 0x20, 0x0f, 0x26, 0x0c, 0xbe, 0xa2, 0x94, 0x26, 0x2f, 0x90, 0x4d, - 0xf9, 0xea, 0x5a, 0xc9, 0x80, 0x72, 0x3e, 0x4c, 0x95, 0x53, 0xc7, 0xb3, 0x79, 0x95, 0x93, 0x3e, - 0x7a, 0x32, 0x75, 0xf4, 0x05, 0x0d, 0x0d, 0x25, 0xd0, 0x5e, 0x32, 0x3c, 0x42, 0x09, 0x6e, 0x4c, - 0x86, 0x47, 0x28, 0x83, 0x92, 0x29, 0x16, 0xea, 0x07, 0xd1, 0x44, 0xec, 0x26, 0x06, 0xfe, 0xa2, - 0x86, 0xb6, 0xc4, 0x51, 0x60, 0x32, 0x62, 0x09, 0x29, 0x32, 0x4d, 0x46, 0x2c, 0x21, 0x07, 0xab, - 0x21, 0xe7, 0x28, 0xeb, 0xa7, 0xf0, 0x89, 0x3c, 0xac, 0x27, 0x60, 0x6d, 0xf0, 0x4f, 0x34, 0xb4, - 0x47, 0x89, 0x20, 0x83, 0x27, 0x94, 0x3c, 0x65, 0x42, 0xd9, 0x94, 0x2f, 0x76, 0xdd, 0x1e, 0xe4, - 0xbb, 0x43, 0xe5, 0xbb, 0x8e, 0xaf, 0xe6, 0x35, 0x4d, 0xe2, 0xe7, 0x0d, 0xd8, 0x36, 0x9d, 0x1e, - 0xa2, 0xd7, 0x7c, 0x43, 0x43, 0xcf, 0x48, 0xa1, 0x67, 0xb0, 0x22, 0xac, 0x56, 0x01, 0xda, 0x94, - 0xcf, 0x14, 0x6e, 0x07, 0xa2, 0x5d, 0xa6, 0xa2, 0x4d, 0xe0, 0xf3, 0x79, 0x44, 0x8b, 0x8d, 0x38, - 0x31, 0x86, 0xfa, 0x6d, 0x0d, 0x0d, 0x84, 0x60, 0x2e, 0xf8, 0x88, 0xe2, 0x23, 0x91, 0xc0, 0x94, - 0x29, 0x1f, 0xcd, 0x55, 0x17, 0x98, 0x3d, 0x4d, 0x99, 0x7d, 0x11, 0x8f, 0xe5, 0xfa, 0x82, 0xd0, - 0xe6, 0xba, 0x61, 0xdb, 0xf8, 0xb3, 0x1a, 0xea, 0xe7, 0xe0, 0x24, 0xf8, 0x58, 0xc6, 0x08, 0x8f, - 0x21, 0xac, 0x94, 0x5f, 0xc8, 0x59, 0xbb, 0x9b, 0x94, 0x40, 0x88, 0xaa, 0x22, 0xa4, 0x34, 0x3e, - 0xa3, 0xa1, 0x4d, 0x9c, 0x6a, 0xa0, 0xcb, 0x63, 0xca, 0x25, 0xb4, 0x00, 0xb7, 0x12, 0x64, 0x97, - 0x62, 0xe9, 0xba, 0x90, 0x5b, 0xfc, 0x3d, 0x0d, 0x0d, 0x27, 0x91, 0x3d, 0xf0, 0xc9, 0x7c, 0x99, - 0xcd, 0x38, 0x7c, 0x49, 0xf9, 0x54, 0xc1, 0x56, 0xc0, 0xf8, 0x1b, 0x94, 0xf1, 0xf7, 0xe1, 0x87, - 0xc5, 0xb2, 0x48, 0x00, 0x59, 0x52, 0x59, 0x49, 0x22, 0xc1, 0xac, 0x56, 0x56, 0x04, 0x6c, 0x8f, - 0x55, 0xfc, 0x55, 0x0d, 0x3d, 0x9d, 0xec, 0x3c, 0xb0, 0xc6, 0xc9, 0x7c, 0xf9, 0xd0, 0xfc, 0x42, - 0x2a, 0xd0, 0x56, 0xba, 0xcc, 0xfd, 0x72, 0x21, 0xf1, 0xff, 0x6a, 0xa8, 0x9c, 0x0e, 0xb5, 0x90, - 0xb1, 0xa8, 0x66, 0x82, 0x85, 0x64, 0x2c, 0xaa, 0xd9, 0xb0, 0x1f, 0xe4, 0x43, 0x54, 0xbc, 0xf7, - 0xe3, 0xf7, 0x15, 0x13, 0xaf, 0xf3, 0x17, 0x57, 0x20, 0xd4, 0xbe, 0x51, 0x4f, 0x5a, 0xf1, 0xc7, - 0x1a, 0xda, 0x93, 0xce, 0x48, 0x60, 0xcf, 0x89, 0x7c, 0x96, 0xe9, 0x46, 0x09, 0xb9, 0xb0, 0x4f, - 0xc8, 0x75, 0xaa, 0x84, 0x29, 0x7c, 0x69, 0xad, 0x4a, 0xc0, 0xbf, 0x5c, 0x42, 0xfb, 0xb2, 0x00, - 0x42, 0xf0, 0x64, 0x51, 0xa3, 0x75, 0xa0, 0x97, 0x94, 0xa7, 0xd6, 0x42, 0x02, 0xa4, 0x36, 0xa8, - 0xd4, 0xaf, 0xe3, 0xd7, 0xf2, 0x7e, 0x4f, 0xa5, 0x92, 0x47, 0x38, 0x1f, 0x95, 0x15, 0xab, 0xee, - 0xad, 0x56, 0x56, 0x42, 0xcc, 0x94, 0x55, 0xfc, 0x9f, 0x1a, 0xda, 0x91, 0x82, 0x69, 0x80, 0x15, - 0x56, 0xcb, 0x85, 0xef, 0x51, 0xbe, 0xd4, 0x3d, 0x01, 0xd0, 0xc0, 0x3d, 0xaa, 0x81, 0xdb, 0xf8, - 0x66, 0xfe, 0xdc, 0x8b, 0xe4, 0x67, 0x83, 0x12, 0x49, 0xa6, 0x4f, 0x97, 0xd0, 0x81, 0x3c, 0xb8, - 0x19, 0x2a, 0xf7, 0xbe, 0x00, 0xe6, 0x87, 0xca, 0xbd, 0x2f, 0x02, 0xdf, 0x51, 0x2c, 0xf6, 0xc9, - 0xa9, 0x8c, 0x58, 0x18, 0x18, 0x2c, 0x06, 0xdf, 0xd5, 0x50, 0x39, 0x85, 0xab, 0x60, 0x25, 0x38, - 0x97, 0x9d, 0x48, 0x4b, 0xc5, 0xf9, 0x28, 0x9f, 0xef, 0xae, 0x31, 0x88, 0x7f, 0x85, 0x8a, 0x7f, - 0x11, 0x5f, 0x58, 0x93, 0xf8, 0x81, 0x93, 0x33, 0x28, 0x5e, 0x2d, 0x51, 0xed, 0xf5, 0x49, 0x50, - 0x36, 0x54, 0x7b, 0x7d, 0x32, 0xa0, 0x8d, 0x62, 0xf9, 0xdf, 0xd8, 0x6f, 0x53, 0xe1, 0x2f, 0x6b, - 0x68, 0x73, 0x0c, 0x73, 0x02, 0x2b, 0x3a, 0x97, 0x21, 0x72, 0x94, 0x2b, 0xb9, 0xeb, 0x77, 0xb3, - 0xd0, 0xc6, 0x7e, 0x1b, 0x2b, 0x91, 0xd8, 0xc5, 0x5f, 0xd2, 0xd0, 0x70, 0x12, 0x6e, 0x43, 0x95, - 0x4c, 0x4a, 0x81, 0xee, 0x50, 0x25, 0x93, 0xd2, 0xd0, 0x3c, 0xc8, 0x04, 0x95, 0xe2, 0x25, 0x7c, - 0xba, 0xb8, 0x14, 0xd4, 0x11, 0xfe, 0x9a, 0x46, 0x7f, 0x0b, 0x2a, 0x09, 0xd6, 0xa1, 0xf2, 0x6b, - 0xd2, 0xe1, 0x3f, 0x54, 0x7e, 0x8d, 0x02, 0x11, 0x84, 0x4c, 0x52, 0x21, 0xce, 0xe1, 0xb3, 0x79, - 0x84, 0x78, 0x93, 0x12, 0xd2, 0x63, 0xe3, 0xc7, 0xa3, 0x41, 0x7a, 0x02, 0xf8, 0x43, 0x15, 0xa4, - 0xcb, 0x21, 0x44, 0x54, 0x41, 0x7a, 0x0a, 0xaa, 0x48, 0x31, 0x9f, 0x2c, 0xfe, 0x83, 0x6c, 0x81, - 0xfe, 0xff, 0x4b, 0x43, 0xe5, 0x74, 0x1c, 0x10, 0xd5, 0x22, 0x94, 0x89, 0x46, 0xa2, 0x5a, 0x84, - 0xb2, 0xa1, 0x47, 0xc8, 0x6b, 0x54, 0xb0, 0x7b, 0xf8, 0x6e, 0xde, 0x4f, 0x72, 0x2a, 0x28, 0x48, - 0xc7, 0xca, 0xfb, 0x2e, 0x0b, 0xf0, 0xd3, 0xb1, 0x46, 0x32, 0x7c, 0xd1, 0x4c, 0x48, 0x93, 0x0c, - 0x5f, 0x34, 0x1b, 0xe4, 0x84, 0xdc, 0xa6, 0xd2, 0x5f, 0xc3, 0x57, 0xf2, 0x4a, 0x4f, 0x33, 0x70, - 0x69, 0x1a, 0xc0, 0x5f, 0xd7, 0xd0, 0x48, 0x5c, 0xe7, 0x11, 0xcc, 0x84, 0x2a, 0xc4, 0x57, 0x81, - 0x57, 0xa8, 0x42, 0x7c, 0x25, 0x9e, 0x45, 0xb1, 0x45, 0xa3, 0x13, 0xf9, 0x02, 0xff, 0x87, 0x86, - 0x76, 0xab, 0x10, 0x23, 0x54, 0xa9, 0xd3, 0x1c, 0x48, 0x17, 0xaa, 0xd4, 0x69, 0x1e, 0xa0, 0x0a, - 0xf2, 0x2a, 0x95, 0xef, 0x06, 0xbe, 0x96, 0x47, 0xbe, 0xf0, 0x56, 0x76, 0x65, 0x25, 0xfc, 0x77, - 0xb5, 0x12, 0xbb, 0x11, 0x8f, 0x3f, 0x56, 0x42, 0x24, 0x0d, 0xb4, 0x22, 0xc2, 0x90, 0xc0, 0x53, - 0x99, 0x7c, 0x67, 0x42, 0x5e, 0xa8, 0xf2, 0xe9, 0x59, 0x88, 0x06, 0xe4, 0x75, 0x2a, 0xf7, 0x03, - 0x7c, 0xaf, 0x07, 0x72, 0x03, 0x0a, 0xc6, 0x6c, 0x28, 0xdc, 0x5f, 0x6a, 0x68, 0x2b, 0xbb, 0x6a, - 0x20, 0x9e, 0x49, 0x53, 0xac, 0xf8, 0x0a, 0x90, 0x03, 0xd5, 0x61, 0x11, 0x15, 0xee, 0x41, 0xf7, - 0x23, 0xb7, 0xc2, 0x90, 0xdb, 0xbf, 0xa2, 0xa1, 0x91, 0x08, 0x58, 0x20, 0x7e, 0xc3, 0x1e, 0x1f, - 0xcd, 0x07, 0x46, 0xc0, 0x24, 0x38, 0x56, 0x04, 0xb9, 0xa0, 0x98, 0x47, 0x57, 0x0f, 0xda, 0x0b, - 0xf6, 0x09, 0x96, 0x16, 0x36, 0xf1, 0x7e, 0xa1, 0x84, 0x0e, 0xe7, 0x86, 0x34, 0xc1, 0xaf, 0x14, - 0x1f, 0x4a, 0x69, 0xb8, 0x28, 0x6b, 0x1a, 0x96, 0x5d, 0x4e, 0xc7, 0xf4, 0xa1, 0xf8, 0xaf, 0x1a, - 0x3a, 0x90, 0x07, 0x85, 0x45, 0x15, 0xd6, 0x14, 0x40, 0x71, 0x59, 0x93, 0xf0, 0x85, 0xfc, 0x83, - 0xd0, 0xd2, 0xe1, 0xca, 0xf3, 0x6f, 0x1a, 0xda, 0x97, 0x85, 0x9f, 0xa2, 0x0a, 0xe2, 0x73, 0x42, - 0xc8, 0xa8, 0x82, 0xf8, 0xbc, 0xf0, 0x2d, 0xe4, 0x12, 0x15, 0xf5, 0x65, 0xfc, 0x52, 0x81, 0x64, - 0x6c, 0x5c, 0xda, 0x1f, 0x69, 0x68, 0x97, 0x02, 0xa5, 0x02, 0xab, 0x3d, 0x9a, 0x0c, 0x20, 0x8c, - 0xf2, 0x85, 0x2e, 0x5b, 0x77, 0x73, 0x3e, 0x2a, 0x70, 0x09, 0xd2, 0x31, 0x32, 0xf0, 0xdb, 0x1a, - 0xda, 0x91, 0x82, 0x5a, 0x81, 0x5f, 0x52, 0x99, 0x42, 0x85, 0x87, 0x51, 0x3e, 0xdb, 0x45, 0x4b, - 0x10, 0xee, 0x2a, 0x15, 0xee, 0x12, 0x9e, 0xc8, 0x97, 0x76, 0xd2, 0x5b, 0x40, 0x2d, 0xe9, 0x87, - 0xff, 0x39, 0x3f, 0x04, 0x19, 0xe1, 0x36, 0x8c, 0x67, 0xbb, 0xa1, 0x49, 0xa4, 0x8a, 0x8c, 0x4d, - 0x27, 0x39, 0xe6, 0x44, 0xb1, 0x9d, 0x8b, 0xc4, 0x8f, 0x18, 0x57, 0x56, 0xf8, 0x76, 0xdf, 0x97, - 0x34, 0xb4, 0x35, 0xde, 0x41, 0xf6, 0xd1, 0xb5, 0xc2, 0x42, 0xa4, 0x02, 0x67, 0x14, 0xdb, 0x39, - 0x4b, 0x08, 0x81, 0x7f, 0xa2, 0xa1, 0xad, 0x1d, 0x97, 0xca, 0xb1, 0x3a, 0xa5, 0x9e, 0x06, 0x29, - 0xa0, 0xfa, 0x46, 0xab, 0x6e, 0xfe, 0x13, 0x9b, 0x4a, 0x30, 0x87, 0xeb, 0x79, 0x24, 0x60, 0x37, - 0xdd, 0x83, 0x51, 0xc4, 0xe9, 0x54, 0x56, 0x44, 0x20, 0x83, 0x55, 0x7e, 0x72, 0x83, 0x81, 0x16, - 0xd0, 0x94, 0x9e, 0x00, 0x50, 0xb0, 0x8a, 0xff, 0x4a, 0x43, 0xb8, 0xf3, 0x52, 0xbe, 0xca, 0xa7, - 0x56, 0x61, 0x06, 0xa8, 0x7c, 0x6a, 0xe5, 0xed, 0xff, 0x62, 0xfb, 0x3c, 0x9d, 0x52, 0x7b, 0xf8, - 0x3b, 0x1a, 0xda, 0x2e, 0xbf, 0xc6, 0xad, 0x3a, 0x63, 0xa4, 0xbc, 0x39, 0xae, 0x3a, 0x63, 0xa4, - 0xbe, 0x31, 0x5e, 0xec, 0x34, 0x22, 0x88, 0x13, 0xde, 0x6d, 0xaa, 0xac, 0xf0, 0xfb, 0xea, 0xf4, - 0x54, 0xf4, 0xe6, 0xd8, 0x55, 0x6b, 0x55, 0x66, 0x47, 0x76, 0x61, 0x5b, 0x95, 0xd9, 0x91, 0xde, - 0xe1, 0x26, 0x2f, 0x53, 0xde, 0x4f, 0xe2, 0xf1, 0x3c, 0xbc, 0xc7, 0x7f, 0x7f, 0x1b, 0x7f, 0x5b, - 0x43, 0xdb, 0x64, 0x17, 0xff, 0x55, 0x93, 0x48, 0x01, 0x33, 0xa0, 0x9a, 0x44, 0x2a, 0x7c, 0x01, - 0x72, 0x8b, 0xca, 0x70, 0x15, 0x5f, 0xce, 0x23, 0xc3, 0x63, 0x46, 0x89, 0x5d, 0xbb, 0xe5, 0xe8, - 0x08, 0x9e, 0xb0, 0x87, 0xf8, 0x3f, 0x1a, 0xda, 0xad, 0xba, 0x54, 0xaf, 0x0a, 0xd8, 0x72, 0xdc, - 0xf1, 0x57, 0x05, 0x6c, 0x79, 0xee, 0xf2, 0x17, 0x3b, 0x6d, 0x09, 0x9f, 0x53, 0x53, 0x8f, 0x8b, - 0x3d, 0xe7, 0xb8, 0xc1, 0x84, 0x0a, 0x96, 0xf2, 0x24, 0xde, 0xc0, 0x2a, 0xfe, 0x96, 0x86, 0xb6, - 0xcb, 0xef, 0x2f, 0xab, 0x26, 0x97, 0xf2, 0x5e, 0xb4, 0x6a, 0x72, 0xa9, 0xaf, 0x4a, 0x17, 0x8b, - 0x06, 0x12, 0x97, 0xaa, 0x23, 0x39, 0xf1, 0x5b, 0x1a, 0x1a, 0x4e, 0x22, 0xfa, 0xe0, 0x1c, 0x29, - 0xac, 0x04, 0xde, 0x91, 0x2a, 0xef, 0x98, 0x06, 0x6c, 0x54, 0x2c, 0x3f, 0x12, 0xfa, 0x08, 0x8b, - 0x4b, 0x3a, 0x43, 0x35, 0xaa, 0xac, 0x30, 0x74, 0xa2, 0xd5, 0xca, 0xca, 0xa2, 0xb9, 0xbc, 0x8a, - 0x7f, 0xa8, 0xa1, 0x91, 0x34, 0x80, 0x22, 0xd5, 0xe9, 0xb4, 0x0c, 0x50, 0x24, 0x95, 0xe7, 0x9e, - 0x85, 0x87, 0x44, 0xee, 0x52, 0x11, 0x6f, 0xe2, 0x1b, 0xf9, 0x96, 0x11, 0xcf, 0xd7, 0x3b, 0xe5, - 0xd4, 0x17, 0xcd, 0x65, 0x2f, 0x14, 0x16, 0xff, 0xb1, 0x90, 0xa5, 0x04, 0xd0, 0xa2, 0x3c, 0x59, - 0xca, 0x38, 0xea, 0x52, 0x9e, 0x2c, 0x65, 0x02, 0x48, 0xa9, 0xd8, 0x81, 0xf8, 0x50, 0x8c, 0x59, - 0x60, 0xf1, 0xab, 0x1a, 0xc2, 0x9d, 0x00, 0x47, 0xaa, 0x23, 0xbd, 0xa9, 0x68, 0x4b, 0xaa, 0x23, - 0xbd, 0xe9, 0x18, 0x4a, 0xc5, 0x42, 0x8b, 0x90, 0x7f, 0x23, 0x20, 0xc4, 0x92, 0xdd, 0xf4, 0x40, - 0x4a, 0x88, 0xb2, 0xa1, 0x3a, 0x90, 0x92, 0x04, 0xe9, 0x50, 0x1d, 0x48, 0xe9, 0x80, 0xed, 0x28, - 0x76, 0x20, 0x85, 0x6f, 0x4f, 0xcd, 0x39, 0x41, 0xe4, 0xb3, 0x23, 0x05, 0x53, 0x42, 0x15, 0x10, - 0xa8, 0xf1, 0x2c, 0x54, 0x01, 0x41, 0x06, 0x80, 0x05, 0x79, 0x48, 0x05, 0x99, 0xc1, 0x77, 0x72, - 0x1d, 0x03, 0xa2, 0x08, 0xc4, 0x2d, 0x47, 0x8f, 0xce, 0x52, 0x1b, 0xfc, 0x97, 0x21, 0xc0, 0x81, - 0x83, 0x63, 0x15, 0xf8, 0xbf, 0x35, 0xb4, 0x4b, 0x81, 0x58, 0xa1, 0x0a, 0xf1, 0xb2, 0x51, 0x33, - 0x54, 0x21, 0x5e, 0x0e, 0x98, 0x0c, 0xf2, 0x7e, 0x2a, 0xf4, 0x7d, 0x5c, 0x2d, 0x28, 0xb4, 0x78, - 0xe6, 0x38, 0x4d, 0xf0, 0xb7, 0x35, 0xf4, 0x8c, 0x14, 0x81, 0x02, 0xab, 0x1d, 0xed, 0x54, 0xc8, - 0x0b, 0x95, 0xaf, 0xaa, 0x84, 0xba, 0x28, 0xe6, 0x5c, 0x00, 0xac, 0x84, 0xe9, 0xc2, 0x77, 0x96, - 0x9e, 0x5c, 0xab, 0xac, 0x70, 0x90, 0x83, 0x55, 0xfc, 0x4f, 0x1a, 0xda, 0x99, 0x0a, 0x50, 0x81, - 0x5f, 0xce, 0xca, 0xc4, 0xa7, 0xa3, 0x67, 0x94, 0xcf, 0x75, 0xd5, 0xb6, 0x9b, 0x88, 0x96, 0x1e, - 0x11, 0x95, 0x09, 0xea, 0xe1, 0xbf, 0xd0, 0xd0, 0x70, 0x12, 0xd0, 0x02, 0x1f, 0xcf, 0x56, 0x7d, - 0x02, 0x37, 0xa3, 0x3c, 0x5e, 0xa4, 0x49, 0x37, 0x8e, 0x42, 0x0c, 0xdc, 0x62, 0x59, 0xb4, 0xd0, - 0xdf, 0xb0, 0xa1, 0xd7, 0x89, 0x8d, 0x91, 0x31, 0xf4, 0x52, 0x11, 0x37, 0x32, 0x86, 0x5e, 0x3a, - 0x08, 0x47, 0xb1, 0x85, 0x3c, 0xb2, 0x4a, 0x04, 0xd9, 0x81, 0x7f, 0x1a, 0x08, 0x23, 0xc3, 0x9b, - 0x50, 0x0a, 0xa3, 0x80, 0xd5, 0x50, 0x0a, 0xa3, 0x02, 0xb6, 0x20, 0x16, 0x15, 0xa6, 0x86, 0x8d, - 0x5c, 0x19, 0x21, 0x20, 0xa5, 0xcf, 0x2e, 0xeb, 0x22, 0x38, 0x47, 0x65, 0x25, 0x81, 0xe9, 0xb1, - 0x5a, 0x59, 0x49, 0x82, 0x77, 0xac, 0xe2, 0x3f, 0xd2, 0xd0, 0xe6, 0x18, 0x84, 0x43, 0xd6, 0x10, - 0x94, 0x40, 0x4a, 0x64, 0x0d, 0x41, 0x19, 0xca, 0x44, 0xb1, 0x60, 0x2a, 0x8e, 0x47, 0x41, 0x6f, - 0x63, 0x76, 0xa0, 0x70, 0xe0, 0xf1, 0x3c, 0x1e, 0x40, 0x1c, 0x6f, 0xa3, 0x7c, 0xa2, 0x50, 0x9b, - 0xae, 0x8e, 0x5e, 0x46, 0x4e, 0x83, 0xed, 0x3c, 0xd6, 0x03, 0x7f, 0x0e, 0xff, 0xb5, 0x16, 0x83, - 0xdd, 0x8f, 0x44, 0x38, 0x95, 0x6b, 0xe7, 0xad, 0x43, 0x8a, 0xd3, 0x45, 0x9b, 0x81, 0x20, 0x53, - 0x54, 0x90, 0xf3, 0xf8, 0xe5, 0x82, 0xbb, 0x1e, 0xa2, 0x2c, 0x6f, 0x6b, 0x68, 0x9b, 0x0c, 0x93, - 0x43, 0x25, 0x8b, 0x02, 0x08, 0x44, 0x25, 0x8b, 0x0a, 0xfa, 0xa3, 0xd8, 0x66, 0x80, 0x09, 0x94, - 0xf4, 0xd8, 0x56, 0x4e, 0xfc, 0x8c, 0xd3, 0x3b, 0x1a, 0x2a, 0xa7, 0x83, 0x7b, 0x28, 0x8f, 0xf1, - 0x64, 0xa1, 0x87, 0x28, 0x8f, 0xf1, 0x64, 0xe2, 0x89, 0x90, 0x1b, 0x54, 0xd4, 0x69, 0x3c, 0x99, - 0x6b, 0xad, 0x53, 0x81, 0xa1, 0xe1, 0xef, 0x69, 0x68, 0x67, 0x30, 0x24, 0xa4, 0xb0, 0x1f, 0xca, - 0x33, 0xe2, 0x0a, 0xb4, 0x11, 0xe5, 0x19, 0x71, 0x15, 0xbe, 0x48, 0xb1, 0xd0, 0x48, 0x2e, 0x52, - 0xd2, 0x8c, 0x5f, 0xd4, 0xd0, 0x10, 0x1d, 0xf4, 0x11, 0x68, 0x84, 0xea, 0xa8, 0x73, 0x27, 0x2e, - 0x85, 0xea, 0xa8, 0xb3, 0x04, 0x89, 0xa2, 0x98, 0x7f, 0x00, 0xf7, 0xb4, 0x29, 0x18, 0x45, 0x82, - 0xf1, 0x7f, 0xd0, 0xd0, 0x48, 0x1a, 0x22, 0x88, 0xf2, 0xde, 0x9c, 0x1a, 0xb6, 0x44, 0x79, 0x6f, - 0x2e, 0x03, 0x80, 0xa4, 0x98, 0x6c, 0xb1, 0x0d, 0xfe, 0xc7, 0x96, 0xbf, 0x10, 0x66, 0x90, 0xa6, - 0x5e, 0x7d, 0xeb, 0x9d, 0x51, 0xed, 0x9b, 0xef, 0x8c, 0x6a, 0xdf, 0x7f, 0x67, 0x54, 0xfb, 0xb5, - 0x1f, 0x8c, 0x3e, 0xf5, 0xcd, 0x1f, 0x8c, 0x3e, 0xf5, 0xf7, 0x3f, 0x18, 0x7d, 0xea, 0xfd, 0xa7, - 0xe6, 0x2d, 0x7f, 0xa1, 0x3d, 0x3b, 0x56, 0x73, 0x1a, 0xe9, 0x7d, 0x3c, 0x11, 0xd7, 0xd7, 0xe5, - 0x96, 0xe9, 0xcd, 0x6e, 0x68, 0xb9, 0x8e, 0xef, 0x9c, 0xf8, 0xbf, 0x00, 0x00, 0x00, 0xff, 0xff, - 0x32, 0x67, 0x30, 0x12, 0xf1, 0x93, 0x00, 0x00, + // 7433 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xc4, 0x7d, 0x6b, 0x6c, 0xdd, 0xc8, + 0x75, 0xff, 0xf2, 0xca, 0x0f, 0x69, 0x2c, 0xdb, 0xf2, 0xac, 0xd7, 0x96, 0xaf, 0x6d, 0xd9, 0x3b, + 0xf6, 0xae, 0x9f, 0xeb, 0xbb, 0x96, 0x5f, 0xeb, 0xf5, 0x53, 0x92, 0x9f, 0xeb, 0xc7, 0xca, 0xd7, + 0xaf, 0xdd, 0x6c, 0xb2, 0x0c, 0x75, 0x2f, 0x25, 0x31, 0xe6, 0xbd, 0xbc, 0x4b, 0xf2, 0xca, 0x56, + 0xf4, 0x57, 0xfe, 0x48, 0x50, 0x20, 0x05, 0xfa, 0x48, 0x8b, 0x7c, 0x28, 0x9a, 0x16, 0x28, 0x82, + 0xb6, 0x40, 0x0a, 0xf4, 0x43, 0x52, 0x34, 0x41, 0x13, 0xa4, 0x8f, 0x14, 0x48, 0xb1, 0x6d, 0x8a, + 0x20, 0x4d, 0x82, 0x45, 0x5b, 0x04, 0x49, 0xba, 0x09, 0xd2, 0x22, 0x2d, 0x9a, 0xb4, 0x05, 0xfa, + 0xb1, 0x2d, 0x38, 0x73, 0x86, 0x1c, 0x92, 0xc3, 0x21, 0x79, 0x75, 0x37, 0xf9, 0x22, 0x88, 0xc3, + 0x99, 0x33, 0xe7, 0x31, 0x33, 0x3c, 0xe7, 0xcc, 0xcc, 0xef, 0xa2, 0x5d, 0x56, 0x7b, 0xd6, 0x74, + 0xcd, 0x76, 0xc3, 0xac, 0x45, 0xff, 0xbd, 0xd5, 0x35, 0xdd, 0xc5, 0x23, 0x1d, 0xd7, 0xf1, 0x1d, + 0xfc, 0x74, 0x58, 0x7c, 0x24, 0xfc, 0xaf, 0xba, 0xc9, 0x68, 0x59, 0x6d, 0xa7, 0x46, 0xff, 0xb2, + 0x7a, 0xd5, 0xcd, 0x73, 0xce, 0x9c, 0x43, 0xff, 0xad, 0x05, 0xff, 0x41, 0xe9, 0x8e, 0x39, 0xc7, + 0x99, 0xb3, 0xcd, 0x9a, 0xd1, 0xb1, 0x6a, 0x46, 0xbb, 0xed, 0xf8, 0x86, 0x6f, 0x39, 0x6d, 0x0f, + 0xde, 0x1e, 0x6c, 0x38, 0x5e, 0xcb, 0xf1, 0x6a, 0x33, 0x86, 0x07, 0x9d, 0xd6, 0x16, 0x8e, 0xce, + 0x98, 0xbe, 0x71, 0xb4, 0xd6, 0x31, 0xe6, 0xac, 0x36, 0xad, 0x0c, 0x75, 0x77, 0xcb, 0x18, 0xed, + 0x18, 0xae, 0xd1, 0xe2, 0xd4, 0xf6, 0xc8, 0x6a, 0x44, 0xdc, 0xb3, 0x4a, 0xcf, 0x65, 0x90, 0xf1, + 0xad, 0x86, 0xd5, 0x31, 0xda, 0x3e, 0xe7, 0x4c, 0x56, 0xcd, 0xec, 0x38, 0x8d, 0x79, 0x7d, 0xce, + 0x75, 0xba, 0x1d, 0xbd, 0x69, 0xf8, 0x06, 0xd4, 0xdd, 0x27, 0xab, 0xeb, 0x99, 0xbe, 0x6f, 0x9b, + 0xba, 0xd1, 0x72, 0xba, 0x21, 0xd1, 0xa3, 0x79, 0x44, 0x17, 0x0c, 0xdb, 0x6a, 0xc6, 0x34, 0x44, + 0xa4, 0xec, 0x3a, 0x8d, 0x19, 0xc3, 0x6f, 0xcc, 0x43, 0x9d, 0x03, 0xb2, 0x3a, 0xbe, 0xf3, 0xc8, + 0x6c, 0x3b, 0x2d, 0xab, 0xe1, 0x89, 0xac, 0x4a, 0xab, 0x76, 0xdb, 0x96, 0xaf, 0x3b, 0xb3, 0x7a, + 0xc3, 0x69, 0x75, 0xba, 0x3e, 0x57, 0x94, 0x74, 0x60, 0xb4, 0x9c, 0xa6, 0x69, 0xab, 0xd4, 0xed, + 0x3b, 0x1d, 0xbd, 0x65, 0xb5, 0x4d, 0x17, 0x2a, 0x8d, 0x89, 0x16, 0xe6, 0xb6, 0x6d, 0x38, 0x16, + 0xb7, 0xea, 0x21, 0xa5, 0xcd, 0x74, 0xdf, 0x6a, 0x99, 0x4e, 0x97, 0xeb, 0xef, 0xa4, 0xba, 0x72, + 0xa4, 0x3d, 0xbd, 0x69, 0xfa, 0x86, 0x65, 0x73, 0x25, 0x1e, 0xcb, 0xd6, 0x7b, 0xc7, 0x74, 0x67, + 0x1d, 0xb7, 0x65, 0x04, 0xed, 0xbd, 0x6e, 0xab, 0x65, 0xf0, 0x71, 0x2f, 0xb7, 0xaa, 0xef, 0x1a, + 0x56, 0xdb, 0x6a, 0xcf, 0xe9, 0xbe, 0xe1, 0x3d, 0x82, 0x8a, 0x87, 0x73, 0x2b, 0xea, 0xde, 0x62, + 0xbb, 0xa1, 0x22, 0x3b, 0x6f, 0xb8, 0xcd, 0xc7, 0x86, 0x6b, 0xea, 0x6d, 0xa7, 0x69, 0xaa, 0x4c, + 0x45, 0x07, 0xaa, 0x61, 0xeb, 0xdd, 0xce, 0x9c, 0x6b, 0x84, 0x55, 0x9f, 0x97, 0x55, 0x6d, 0x9b, + 0xfe, 0x63, 0xc7, 0x7d, 0x24, 0x92, 0x94, 0x4e, 0xa1, 0x19, 0xd7, 0x6a, 0xce, 0x29, 0x3b, 0xf5, + 0x7c, 0xc3, 0xf7, 0xf4, 0xa6, 0xb9, 0x60, 0xda, 0x4e, 0x27, 0xb4, 0xec, 0xae, 0x4c, 0xa5, 0x42, + 0x85, 0xfd, 0xd2, 0x01, 0x64, 0x07, 0xfc, 0xe8, 0x0b, 0xa6, 0xeb, 0x45, 0x53, 0xfb, 0x88, 0x94, + 0xd4, 0x93, 0x86, 0xdd, 0x6d, 0x9a, 0x4d, 0x3d, 0x3d, 0x39, 0x5f, 0x94, 0xd5, 0x6f, 0x38, 0xed, + 0x59, 0xcb, 0x6d, 0x31, 0xfb, 0x77, 0x9c, 0x86, 0x6e, 0x2e, 0x98, 0x61, 0x0b, 0x29, 0x2f, 0xb6, + 0xf5, 0x56, 0xd7, 0x6a, 0x5a, 0xfe, 0xa2, 0xde, 0x71, 0x1c, 0x5b, 0xb9, 0xcc, 0x38, 0x0d, 0x7d, + 0x61, 0x5c, 0xb5, 0x82, 0xb8, 0x46, 0xbb, 0xe9, 0xb4, 0x74, 0xcf, 0x34, 0x9b, 0xaa, 0xc9, 0x4e, + 0x09, 0x45, 0xc3, 0xd4, 0x6b, 0x1b, 0x1d, 0x6f, 0xde, 0x01, 0x2e, 0xc9, 0x66, 0x84, 0xef, 0x04, + 0x8b, 0xe0, 0x34, 0x5d, 0xd5, 0xea, 0xe6, 0x5b, 0x5d, 0xd3, 0xf3, 0xc9, 0x7d, 0xf4, 0x74, 0xac, + 0xd4, 0xeb, 0x38, 0x6d, 0xcf, 0xc4, 0xe7, 0xd1, 0x1a, 0xb6, 0xfa, 0x8d, 0x6a, 0xbb, 0xb5, 0xfd, + 0xeb, 0xc6, 0xb7, 0x1f, 0x91, 0x2c, 0xd4, 0x47, 0x58, 0xa3, 0xc9, 0xa1, 0xb7, 0xbf, 0xbb, 0xeb, + 0xa9, 0xcf, 0xfc, 0xf3, 0x67, 0x0f, 0x6a, 0x75, 0x68, 0x45, 0x5e, 0x44, 0xa3, 0x94, 0xec, 0x55, + 0xd3, 0xbf, 0xce, 0xab, 0x43, 0x97, 0x78, 0x33, 0x5a, 0x6d, 0xb5, 0x9b, 0xe6, 0x13, 0x4a, 0x7a, + 0xa8, 0xce, 0x1e, 0x88, 0x8e, 0xb6, 0x49, 0x5a, 0x00, 0x3b, 0x93, 0x68, 0x28, 0xec, 0x15, 0x38, + 0x1a, 0x93, 0x72, 0x14, 0x36, 0x9d, 0x5c, 0x15, 0x30, 0x55, 0x8f, 0x9a, 0x91, 0x19, 0x60, 0x69, + 0xc2, 0xb6, 0x53, 0x2c, 0x5d, 0x41, 0x28, 0xfa, 0x24, 0x40, 0x07, 0xcf, 0x1f, 0x61, 0xab, 0xcb, + 0x91, 0x60, 0x75, 0x39, 0xc2, 0x3e, 0x5a, 0xb0, 0xc6, 0x1c, 0x99, 0x36, 0xe6, 0x78, 0xdb, 0xba, + 0xd0, 0x92, 0x7c, 0x46, 0x03, 0x29, 0xe2, 0x9d, 0xc8, 0xa5, 0x18, 0xe8, 0x41, 0x0a, 0x7c, 0x35, + 0xc6, 0x69, 0x85, 0x72, 0xba, 0x2f, 0x97, 0x53, 0xc6, 0x40, 0x8c, 0xd5, 0x71, 0x54, 0xe5, 0xfa, + 0x9e, 0x8e, 0xe6, 0x80, 0xda, 0x46, 0x73, 0x68, 0xbb, 0xb4, 0x0d, 0xc8, 0x77, 0x0d, 0xad, 0x13, + 0xa6, 0x13, 0xa8, 0x71, 0x77, 0xd6, 0xc8, 0xe1, 0xf5, 0x40, 0x46, 0xb1, 0x29, 0x69, 0x02, 0x73, + 0x13, 0xb6, 0x2d, 0x61, 0xae, 0x5f, 0xd6, 0xfa, 0x96, 0x06, 0xf2, 0x24, 0xbb, 0xc9, 0x92, 0x67, + 0xa0, 0x47, 0x79, 0xfa, 0x66, 0x35, 0xfc, 0x2c, 0x1a, 0x9e, 0xb1, 0x9d, 0xc6, 0x23, 0x7d, 0xde, + 0xb4, 0xe6, 0xe6, 0xfd, 0xd1, 0x81, 0xdd, 0xda, 0xfe, 0x81, 0xfa, 0x3a, 0x5a, 0x76, 0x8d, 0x16, + 0x91, 0xb3, 0x68, 0x37, 0x15, 0x2a, 0x1c, 0x44, 0x12, 0x0d, 0x8e, 0xa2, 0xb5, 0x46, 0xb3, 0xe9, + 0x9a, 0x9e, 0x07, 0x06, 0xe6, 0x8f, 0xe4, 0x3e, 0x7a, 0x56, 0xd1, 0x1a, 0x14, 0xb3, 0x05, 0xad, + 0xe9, 0x74, 0x67, 0x1e, 0x99, 0x8b, 0xd0, 0x1a, 0x9e, 0x02, 0xb2, 0x33, 0x86, 0x1d, 0x7c, 0xee, + 0xa8, 0x8c, 0x03, 0x75, 0xfe, 0x48, 0x4e, 0xa0, 0x9d, 0x7c, 0xe4, 0xd4, 0xe9, 0x62, 0x76, 0xf9, + 0x89, 0xd9, 0xe8, 0xfa, 0x8e, 0x2b, 0x0c, 0x38, 0xfa, 0xf9, 0xe7, 0x03, 0x8e, 0x3e, 0x90, 0x26, + 0x1a, 0xcb, 0x6a, 0x16, 0xce, 0xa9, 0x41, 0x13, 0xca, 0x4a, 0x0e, 0xb8, 0xb0, 0x1d, 0x79, 0x23, + 0x62, 0xee, 0x72, 0xf0, 0x89, 0xb9, 0x1a, 0xb8, 0x4b, 0x97, 0x0c, 0xdf, 0xe0, 0xcc, 0xed, 0x42, + 0xeb, 0xd8, 0x07, 0x3d, 0x9a, 0x13, 0xab, 0xea, 0x88, 0x16, 0x5d, 0x0f, 0x4a, 0xf0, 0x36, 0x34, + 0x48, 0x19, 0xd6, 0xad, 0x26, 0x95, 0x7c, 0xa8, 0xbe, 0x96, 0x3e, 0x5f, 0x6f, 0x92, 0x6e, 0x24, + 0x42, 0x92, 0x38, 0x88, 0x70, 0x17, 0x8d, 0x24, 0x7d, 0x3f, 0x10, 0x65, 0x8f, 0x54, 0x94, 0x38, + 0x19, 0x90, 0x66, 0x83, 0x19, 0x2b, 0x25, 0x73, 0x20, 0xd3, 0x84, 0x6d, 0xcb, 0x65, 0xea, 0xd7, + 0x24, 0xfa, 0x33, 0x0d, 0x04, 0x94, 0xf4, 0xa4, 0x14, 0x70, 0x60, 0x45, 0x02, 0xf6, 0x6f, 0x21, + 0xbc, 0x10, 0x2d, 0x6a, 0x77, 0xa9, 0x5b, 0x3d, 0x41, 0xbd, 0x6a, 0xae, 0xa7, 0xdd, 0xe9, 0x45, + 0x6d, 0x28, 0xbe, 0x58, 0xd9, 0x68, 0x87, 0x9c, 0x00, 0x88, 0x7f, 0x13, 0xad, 0x8f, 0xf9, 0xeb, + 0xa0, 0xec, 0x67, 0xa5, 0xb2, 0x8b, 0x14, 0x40, 0xf2, 0x61, 0x4f, 0x28, 0x23, 0x66, 0xb4, 0x66, + 0xc9, 0xd8, 0xed, 0x97, 0x59, 0x3f, 0xaf, 0x81, 0x54, 0xa9, 0x7e, 0xb2, 0xa5, 0x1a, 0xe8, 0x59, + 0xaa, 0xfe, 0x59, 0xd3, 0x42, 0x7b, 0xd3, 0xd3, 0xed, 0x41, 0x14, 0xf9, 0x14, 0x36, 0x6b, 0x72, + 0xd2, 0x57, 0x92, 0x93, 0x9e, 0xfc, 0xba, 0x86, 0x9e, 0xcb, 0xe9, 0x0b, 0x74, 0x35, 0x8f, 0xb6, + 0x66, 0x04, 0x62, 0x60, 0xa1, 0x83, 0x39, 0xf3, 0x40, 0x20, 0x0a, 0xea, 0x7b, 0xc6, 0x94, 0xbd, + 0x24, 0x6d, 0x10, 0x3f, 0x36, 0x19, 0x25, 0xe2, 0xf7, 0x6b, 0x98, 0xfc, 0x23, 0xd7, 0x41, 0x76, + 0x87, 0x45, 0x74, 0x30, 0xd0, 0x47, 0x1d, 0xf4, 0x6f, 0x2c, 0x4d, 0xc1, 0xca, 0x36, 0xed, 0x34, + 0x26, 0x83, 0x88, 0xd8, 0xf4, 0xae, 0x38, 0xee, 0x5d, 0x3f, 0x52, 0x45, 0xea, 0x73, 0xac, 0xa5, + 0x3f, 0xc7, 0x5d, 0xb4, 0x2b, 0x93, 0x08, 0xa8, 0xa6, 0x8e, 0x86, 0x02, 0xd7, 0x9d, 0x46, 0xdd, + 0xa0, 0x8c, 0x9a, 0xfc, 0x23, 0xe6, 0x4c, 0x01, 0x8d, 0x87, 0x96, 0x3f, 0x2f, 0x7c, 0xd2, 0xb8, + 0x46, 0x06, 0x3b, 0xd0, 0x0b, 0xf9, 0xa2, 0x86, 0xaa, 0xd9, 0xd5, 0x0b, 0x0c, 0xff, 0xad, 0x68, + 0x6d, 0xa7, 0x3b, 0xa3, 0x07, 0x1f, 0xf9, 0x4a, 0xf8, 0x91, 0xbf, 0x61, 0x2e, 0xe2, 0x31, 0xb4, + 0x6e, 0xde, 0x7c, 0xa2, 0xf3, 0x97, 0x03, 0xf4, 0xe5, 0xd0, 0xbc, 0xf9, 0x64, 0x9a, 0xbd, 0xbf, + 0x28, 0x4a, 0xb3, 0x8a, 0x4a, 0xb3, 0x53, 0x29, 0x4d, 0x8a, 0xf7, 0xab, 0x88, 0x70, 0x95, 0x09, + 0x76, 0xed, 0x41, 0xf7, 0x1f, 0xd7, 0xd0, 0x1e, 0x25, 0x25, 0x30, 0xc0, 0x07, 0xd1, 0x86, 0x78, + 0xec, 0x04, 0x56, 0x38, 0x96, 0xc5, 0xb7, 0x40, 0x2c, 0xc3, 0x12, 0xeb, 0x3b, 0x62, 0x97, 0xe4, + 0x6f, 0x35, 0x34, 0xa6, 0x6e, 0xf7, 0x5e, 0x9a, 0xe4, 0xd5, 0x94, 0x7c, 0xcc, 0x2e, 0x24, 0x5f, + 0x3e, 0xb9, 0x38, 0xd7, 0x61, 0x99, 0x09, 0xf4, 0x3a, 0xbe, 0x32, 0x1b, 0xfd, 0x12, 0x5f, 0x41, + 0xb2, 0x69, 0x81, 0x95, 0x66, 0x32, 0xac, 0x74, 0xa2, 0x07, 0x2b, 0x3d, 0x18, 0x97, 0x0b, 0xf6, + 0x0d, 0x0d, 0xed, 0xce, 0x6b, 0xf9, 0x5e, 0x5a, 0xea, 0x4e, 0x86, 0xa5, 0xf6, 0xe6, 0xcb, 0x98, + 0x25, 0xd2, 0x27, 0xf8, 0x97, 0x3c, 0xa8, 0x3d, 0x7e, 0xd7, 0x77, 0x5c, 0x73, 0xca, 0x69, 0xb5, + 0xac, 0xd0, 0x65, 0x38, 0x8f, 0x76, 0x04, 0x7d, 0x7a, 0x81, 0xb2, 0x83, 0xbf, 0xae, 0xaf, 0x4b, + 0x8c, 0x36, 0xda, 0x71, 0x1a, 0xd4, 0x1e, 0x77, 0x83, 0x1a, 0x93, 0x91, 0x05, 0x71, 0x0d, 0x3d, + 0x2d, 0xc8, 0xae, 0xf3, 0xc0, 0x82, 0x09, 0x8e, 0x85, 0x57, 0x13, 0x10, 0x63, 0xcc, 0x83, 0x6f, + 0x9a, 0x66, 0x08, 0x2c, 0xbd, 0x19, 0xad, 0x6e, 0x84, 0x9e, 0xd2, 0xfa, 0x3a, 0x7b, 0xc0, 0xdb, + 0xd1, 0x90, 0xeb, 0x38, 0xbe, 0x3e, 0x6f, 0x78, 0xf3, 0x94, 0xfa, 0x70, 0x7d, 0x30, 0x28, 0xb8, + 0x66, 0x78, 0xf3, 0x41, 0x93, 0x59, 0xa7, 0xdb, 0x6e, 0x52, 0x95, 0x0e, 0xd6, 0xd9, 0x03, 0xf9, + 0x0d, 0x0d, 0x06, 0xea, 0xad, 0x9b, 0xb7, 0x9d, 0xa6, 0xf9, 0x90, 0x32, 0x7c, 0xc9, 0xf2, 0x7c, + 0xd7, 0x9a, 0xe9, 0x06, 0xda, 0xf9, 0xb9, 0xe9, 0xe0, 0xc3, 0x30, 0xea, 0xb3, 0x19, 0x03, 0x5d, + 0x9c, 0x41, 0x6b, 0x1f, 0xd3, 0xb7, 0x9e, 0xd2, 0xc3, 0x12, 0xe9, 0xd4, 0x79, 0x8b, 0x48, 0x2b, + 0x15, 0x51, 0x2b, 0x1f, 0x42, 0xfb, 0xc3, 0xb0, 0x37, 0x61, 0x82, 0xd4, 0x0c, 0x5e, 0xa1, 0x62, + 0xc8, 0x63, 0x74, 0xa0, 0x40, 0x5f, 0x20, 0xeb, 0x2b, 0x68, 0x6d, 0x83, 0xbd, 0x02, 0x59, 0x5f, + 0xcc, 0x1c, 0xf6, 0x22, 0xa1, 0x60, 0x8a, 0x82, 0x5e, 0xeb, 0x9c, 0x00, 0xf9, 0xb4, 0x86, 0xb6, + 0x2b, 0x2a, 0x66, 0x59, 0x4c, 0xcb, 0xb2, 0x58, 0x34, 0x28, 0x2b, 0x99, 0x83, 0x72, 0x20, 0x31, + 0x28, 0x13, 0xb3, 0x7d, 0x55, 0x62, 0xb6, 0x13, 0x17, 0xbd, 0xc8, 0x95, 0x93, 0x35, 0x0e, 0xfa, + 0x6e, 0x90, 0x4f, 0x6a, 0xe8, 0x68, 0x89, 0x4e, 0xc1, 0x32, 0x6f, 0xa2, 0xf5, 0x4d, 0xb1, 0x02, + 0xd8, 0xe7, 0xa5, 0xdc, 0xb1, 0x28, 0x92, 0x15, 0xed, 0x14, 0x27, 0x17, 0x70, 0xb5, 0xa7, 0x40, + 0xb3, 0xf2, 0x56, 0x13, 0xa6, 0x4f, 0xa5, 0xec, 0xf4, 0x21, 0x3b, 0xa3, 0xd0, 0x70, 0xaa, 0xeb, + 0xba, 0x66, 0x9b, 0xf9, 0xf9, 0x3c, 0x77, 0x7a, 0x3c, 0x0a, 0xfc, 0xe2, 0xaf, 0xa3, 0x65, 0x8c, + 0x7a, 0xa8, 0x90, 0x30, 0x60, 0x0f, 0x64, 0x57, 0x94, 0x6d, 0xb8, 0x17, 0x6e, 0xa3, 0x08, 0x91, + 0x39, 0xf1, 0xa3, 0x8c, 0x41, 0xb2, 0x42, 0xe8, 0x30, 0x6e, 0x4c, 0xec, 0xc0, 0x28, 0x13, 0x06, + 0x71, 0x2a, 0x3c, 0x9e, 0xf6, 0x63, 0xa5, 0xe4, 0x16, 0x4c, 0xd4, 0xab, 0xa6, 0x7f, 0xbf, 0x6d, + 0xf9, 0xaf, 0xce, 0x4e, 0xb1, 0x0d, 0x9b, 0x69, 0xd7, 0x6a, 0x98, 0xd3, 0xae, 0xd3, 0x71, 0x3c, + 0xc3, 0x2e, 0x1e, 0x14, 0x7f, 0x52, 0x43, 0x07, 0x8b, 0xd0, 0x03, 0x89, 0x6e, 0xa0, 0xc1, 0x0e, + 0x94, 0x81, 0x28, 0x72, 0x0f, 0x58, 0x41, 0x2a, 0x24, 0x80, 0x47, 0xd1, 0xda, 0xa6, 0x39, 0x6b, + 0x74, 0x6d, 0x1f, 0xa2, 0x36, 0xfe, 0x48, 0xf6, 0x40, 0x76, 0x4b, 0x34, 0x57, 0x32, 0x33, 0x42, + 0x16, 0xc1, 0xfd, 0xcc, 0xa8, 0xf4, 0x5e, 0x66, 0x6d, 0xf6, 0x72, 0xcf, 0xd7, 0x35, 0x17, 0x2c, + 0xa7, 0xeb, 0xc9, 0x19, 0xfc, 0x30, 0xf7, 0x6a, 0x33, 0x6a, 0xbd, 0x97, 0x1c, 0xea, 0xe8, 0x19, + 0xf6, 0xdd, 0x72, 0x9a, 0xa6, 0xed, 0x4d, 0xd8, 0x76, 0xbf, 0x23, 0xca, 0xdf, 0xd4, 0xd0, 0x96, + 0x64, 0x0f, 0x20, 0xd0, 0xc9, 0x28, 0x47, 0x18, 0xcc, 0xe4, 0xaa, 0x7c, 0x26, 0x07, 0x35, 0x80, + 0x79, 0x56, 0xbd, 0x7f, 0x01, 0xe1, 0x31, 0xb4, 0x35, 0x9a, 0x99, 0x9d, 0x5b, 0x56, 0xdb, 0x74, + 0xf3, 0x33, 0xaa, 0xef, 0x8f, 0xb6, 0x42, 0xa2, 0x46, 0x20, 0xd1, 0x45, 0x34, 0x14, 0xee, 0x69, + 0x82, 0xce, 0x76, 0x66, 0x4c, 0x61, 0xd6, 0x92, 0xc7, 0x4a, 0x3e, 0x3c, 0x13, 0x03, 0x58, 0x9a, + 0xb0, 0xed, 0x24, 0x4b, 0xfd, 0xb2, 0xc8, 0xef, 0x6b, 0xd1, 0xce, 0x49, 0x9e, 0x04, 0x03, 0xa5, + 0x25, 0xe8, 0x9f, 0x75, 0x1c, 0x88, 0xb4, 0xc5, 0x1d, 0xa4, 0x7b, 0x6c, 0x8b, 0x97, 0xab, 0xe4, + 0x20, 0x1a, 0x31, 0x9f, 0x74, 0x2c, 0x97, 0x36, 0xb8, 0x16, 0x7d, 0x30, 0x57, 0xd5, 0x53, 0xe5, + 0xc1, 0x1a, 0x17, 0x72, 0x7f, 0x9d, 0xa7, 0x75, 0xc5, 0x22, 0xf2, 0xff, 0x20, 0xd3, 0x2e, 0xed, + 0x10, 0xf4, 0xf3, 0x1a, 0xda, 0x94, 0xda, 0x70, 0x06, 0x5b, 0x3c, 0xa7, 0xde, 0xfb, 0x01, 0x4a, + 0xa0, 0xaf, 0x11, 0x2b, 0x51, 0x4e, 0x2c, 0x10, 0x57, 0xdc, 0x6a, 0x4a, 0x88, 0xdb, 0xaf, 0x11, + 0xf0, 0x55, 0x0d, 0x24, 0x95, 0xf6, 0xa5, 0x96, 0x74, 0x60, 0xc5, 0x92, 0xf6, 0x6f, 0x84, 0xcc, + 0x45, 0xdf, 0xb8, 0xb0, 0xf3, 0x28, 0x52, 0xba, 0xc4, 0xb6, 0xf5, 0x85, 0x19, 0xcd, 0x92, 0x7d, + 0x4d, 0x18, 0x22, 0xfc, 0xb1, 0xc0, 0xc8, 0xf8, 0x5d, 0xe1, 0xeb, 0xa7, 0xea, 0x09, 0x54, 0xd7, + 0x45, 0x55, 0x2b, 0xb3, 0x96, 0xf2, 0x7b, 0x98, 0x4d, 0x1c, 0xb4, 0xa9, 0x20, 0x4c, 0xbc, 0xc8, + 0x37, 0xcf, 0x57, 0x47, 0xbf, 0xc6, 0xd2, 0xbf, 0x71, 0xd5, 0xe4, 0xf4, 0x5a, 0x50, 0x35, 0x03, + 0xef, 0x89, 0x6a, 0xfa, 0x37, 0xe4, 0xde, 0x44, 0x87, 0x15, 0x03, 0x81, 0x6e, 0xa0, 0x9b, 0xbe, + 0xe9, 0x86, 0x6a, 0x1e, 0x41, 0x03, 0x56, 0x93, 0x09, 0x36, 0x54, 0x0f, 0xfe, 0xc5, 0x3b, 0xd0, + 0x90, 0xcb, 0x5e, 0x9a, 0x2e, 0x8c, 0xb5, 0xa8, 0x80, 0xfc, 0x49, 0x05, 0xbd, 0x50, 0xb0, 0x03, + 0xd0, 0xe8, 0x6d, 0x34, 0x02, 0xe9, 0x05, 0xc7, 0xd5, 0x3b, 0xce, 0x63, 0xd3, 0xf5, 0x94, 0xbb, + 0x31, 0x0f, 0x78, 0xe5, 0xe9, 0xa0, 0x6e, 0x7d, 0xe3, 0x42, 0xec, 0xd9, 0xc3, 0xcf, 0xa1, 0x0d, + 0x0d, 0xe6, 0x29, 0xf1, 0x10, 0x84, 0x39, 0x5d, 0xeb, 0xa1, 0x14, 0x96, 0xd3, 0xeb, 0x81, 0x53, + 0xc6, 0xac, 0x36, 0xd0, 0x93, 0xd5, 0xea, 0xbc, 0x3d, 0xbe, 0x1c, 0x18, 0x87, 0xcb, 0x45, 0xa3, + 0xaa, 0xac, 0x25, 0x26, 0xa1, 0x08, 0xaf, 0x2e, 0x34, 0x24, 0x57, 0xd1, 0x86, 0xb8, 0x6c, 0x81, + 0xc3, 0x4e, 0x15, 0xc2, 0x1d, 0x76, 0xfa, 0x90, 0xbf, 0x11, 0x70, 0x0b, 0x46, 0x34, 0x75, 0xa0, + 0xa6, 0xa3, 0x33, 0x3f, 0x77, 0xd9, 0x91, 0x9f, 0xc9, 0x45, 0x31, 0x6a, 0xc8, 0xdd, 0x4c, 0x24, + 0xbf, 0xa5, 0xa1, 0x43, 0x85, 0xe8, 0x81, 0x41, 0x6d, 0xc8, 0xac, 0xa7, 0x6b, 0x82, 0x5d, 0x0f, + 0x67, 0xbb, 0x7b, 0x12, 0xea, 0x6c, 0x72, 0x64, 0x91, 0x24, 0x8b, 0x10, 0xb3, 0x66, 0x32, 0x27, + 0xd9, 0x6e, 0xce, 0xdd, 0x3f, 0xdd, 0x8b, 0xd6, 0x0b, 0xc1, 0x43, 0xb8, 0xa6, 0xc6, 0x0b, 0x83, + 0x90, 0xfe, 0x68, 0x89, 0xbe, 0x8b, 0xa8, 0x47, 0xeb, 0xb7, 0x7a, 0x3a, 0xe8, 0xf9, 0xd8, 0x7e, + 0x48, 0xba, 0x4a, 0xbf, 0x17, 0xd4, 0xef, 0x6b, 0x68, 0x5f, 0x6e, 0x97, 0x3f, 0x8f, 0xa1, 0xd2, + 0xbf, 0x45, 0xf4, 0x20, 0x38, 0xa0, 0xf7, 0xe0, 0xdc, 0xdb, 0x3d, 0xc3, 0x7b, 0xc4, 0xd5, 0xb8, + 0x01, 0x55, 0x2c, 0xfe, 0x85, 0xae, 0x58, 0x4d, 0x52, 0x87, 0x13, 0x38, 0xf1, 0xba, 0x20, 0xff, + 0x09, 0xb4, 0xca, 0x37, 0xbc, 0x47, 0xca, 0x1d, 0xd8, 0x58, 0x43, 0x5a, 0x9d, 0x9c, 0x03, 0x9a, + 0xd7, 0xe0, 0x24, 0xdd, 0x6d, 0xa7, 0x69, 0x16, 0xdf, 0x49, 0x24, 0x0f, 0xe0, 0x34, 0x4b, 0xa2, + 0x39, 0xf0, 0xf4, 0x12, 0x5a, 0xdd, 0x0e, 0x0a, 0x80, 0x29, 0x79, 0x4e, 0x3e, 0xde, 0x94, 0x35, + 0x20, 0x63, 0x90, 0x7f, 0x88, 0xbd, 0x8c, 0x42, 0x32, 0xf2, 0x3a, 0x64, 0x1a, 0xd2, 0xef, 0xd3, + 0x5d, 0x0f, 0x94, 0xeb, 0xfa, 0x59, 0x70, 0x3e, 0xef, 0x74, 0xcd, 0xae, 0xd9, 0x14, 0x55, 0x16, + 0x9e, 0x2c, 0x7b, 0x03, 0x7c, 0x46, 0x69, 0x15, 0x60, 0xe0, 0x14, 0x5a, 0x1d, 0x28, 0x58, 0x9d, + 0xda, 0x8c, 0x19, 0x84, 0xd5, 0x0f, 0x33, 0x33, 0xe2, 0x3b, 0x41, 0xf2, 0x87, 0xa0, 0x99, 0xd4, + 0xeb, 0x95, 0xf6, 0x7b, 0x1b, 0xa6, 0x77, 0xfc, 0x04, 0x14, 0x64, 0x0a, 0xee, 0xfa, 0x86, 0x1f, + 0x0e, 0x8b, 0xd4, 0x92, 0xa6, 0xc9, 0x96, 0x34, 0x03, 0xe6, 0xae, 0x8a, 0x5e, 0x74, 0xe8, 0xe6, + 0xb1, 0x18, 0xb1, 0xc0, 0x13, 0x1e, 0x43, 0xc8, 0x35, 0x3b, 0x5d, 0x3f, 0x9a, 0x65, 0xab, 0xeb, + 0x42, 0x09, 0x39, 0x14, 0x39, 0xbd, 0xf1, 0x73, 0x4e, 0x12, 0xae, 0xc9, 0xb7, 0x05, 0xc7, 0x55, + 0x55, 0x3b, 0xdc, 0xd4, 0xdd, 0x26, 0xa6, 0xe3, 0xb8, 0x1f, 0x40, 0xcf, 0x74, 0x2a, 0x57, 0x94, + 0x2c, 0xc2, 0x5b, 0x3b, 0xf2, 0x17, 0xa9, 0x9d, 0xa4, 0x4a, 0x6a, 0x27, 0x09, 0x6f, 0x43, 0x83, + 0xf0, 0x95, 0x69, 0xc2, 0xb9, 0x28, 0xee, 0xb1, 0x93, 0xb7, 0x35, 0xb4, 0x35, 0xa3, 0xcb, 0xc0, + 0x7f, 0x11, 0x65, 0xb0, 0xe4, 0x96, 0x12, 0xd4, 0x5f, 0x89, 0xa9, 0xff, 0x00, 0x1a, 0x31, 0x67, + 0x67, 0xcd, 0x86, 0x6f, 0x2d, 0x98, 0x3a, 0xd4, 0x58, 0x45, 0x6b, 0x6c, 0x0c, 0xcb, 0x59, 0x5e, + 0x11, 0xef, 0x41, 0xeb, 0x1b, 0x46, 0xa7, 0x63, 0x36, 0x79, 0xbd, 0xd5, 0xb4, 0xde, 0x30, 0x2b, + 0x7c, 0x28, 0x33, 0xe7, 0x40, 0xca, 0x9c, 0x9f, 0xab, 0xa0, 0xcd, 0x82, 0x28, 0x57, 0xba, 0xb6, + 0xcd, 0xe4, 0xd8, 0x87, 0x36, 0x1a, 0x0d, 0x9a, 0x94, 0x4e, 0xa4, 0x45, 0x37, 0x40, 0x31, 0x4f, + 0x89, 0x1e, 0x40, 0x23, 0x4e, 0xc7, 0x74, 0xa9, 0xff, 0x17, 0xdf, 0xa8, 0xd8, 0xc8, 0xcb, 0x79, + 0xd5, 0x1c, 0x66, 0xf0, 0x19, 0x54, 0x35, 0x0d, 0xb7, 0x6d, 0x36, 0xf5, 0x86, 0x63, 0xb5, 0xbd, + 0x70, 0x00, 0xb0, 0xb4, 0x27, 0x53, 0xc3, 0x56, 0x56, 0x63, 0x2a, 0xa8, 0x20, 0xa6, 0xd4, 0xf0, + 0x39, 0xb4, 0xdd, 0x35, 0x1f, 0x1b, 0x6e, 0x33, 0x6c, 0x6e, 0x1b, 0xbe, 0xe9, 0xf1, 0xd6, 0x4c, + 0x39, 0xa3, 0xbc, 0x0a, 0x6d, 0x7f, 0x93, 0x56, 0x60, 0xcd, 0x0f, 0x40, 0x7a, 0xcb, 0xa3, 0x47, + 0xcb, 0x6d, 0xd3, 0x37, 0x9b, 0xa3, 0x6b, 0x68, 0x6a, 0x7e, 0x23, 0x2b, 0x9f, 0xe2, 0xc5, 0x61, + 0xda, 0x4f, 0xdc, 0xc7, 0x0b, 0x15, 0xc7, 0x87, 0xfe, 0x47, 0x78, 0xee, 0x4d, 0x5e, 0x29, 0x8c, + 0x72, 0xc5, 0x2c, 0xb3, 0x17, 0x1b, 0xea, 0x07, 0xf2, 0x86, 0x7a, 0x44, 0x6e, 0x93, 0x48, 0x84, + 0x16, 0x91, 0x8f, 0xc0, 0xae, 0x0c, 0x7d, 0x9a, 0x5c, 0x0c, 0x82, 0xdf, 0x69, 0xd3, 0xb5, 0x9c, + 0xe6, 0xe4, 0xe2, 0x25, 0x7e, 0x3a, 0x9a, 0x2f, 0x2e, 0x3b, 0xd0, 0x50, 0x78, 0x62, 0x1a, 0xac, + 0x1c, 0x15, 0xe0, 0xed, 0x68, 0x28, 0x88, 0xbf, 0xf5, 0x59, 0xd7, 0x69, 0xc1, 0x44, 0x19, 0x0c, + 0x0a, 0xae, 0xb8, 0x4e, 0x0b, 0x6f, 0x45, 0x6b, 0xe9, 0x4b, 0xdf, 0x81, 0x49, 0xb2, 0x26, 0x78, + 0xbc, 0xe7, 0x10, 0x1b, 0xd6, 0x09, 0x75, 0xff, 0xa0, 0x86, 0x0b, 0x68, 0x75, 0xbe, 0xe4, 0x61, + 0x33, 0x81, 0x64, 0x9d, 0xb5, 0x23, 0xf3, 0x10, 0xb6, 0xc0, 0xab, 0xb0, 0xea, 0x44, 0xbb, 0x49, + 0xcd, 0x3b, 0x69, 0x34, 0x1e, 0x05, 0x86, 0xf7, 0x8a, 0x89, 0xcc, 0xe7, 0xbe, 0xa7, 0xf3, 0x25, + 0x90, 0xcd, 0x7d, 0xef, 0x36, 0xa9, 0xa3, 0x13, 0xf1, 0x13, 0x8d, 0xde, 0x44, 0xbb, 0x49, 0x53, + 0xe2, 0x1e, 0x74, 0x4e, 0x3b, 0xf4, 0x52, 0x3d, 0x8a, 0x34, 0xb5, 0x38, 0xcd, 0x79, 0x70, 0x82, + 0xb3, 0x69, 0x46, 0xea, 0xe3, 0xe4, 0x7a, 0xb3, 0x4a, 0x13, 0xe2, 0xc7, 0xec, 0x9e, 0x58, 0x9e, + 0x74, 0x65, 0xbd, 0xe8, 0x08, 0x51, 0x32, 0x6c, 0x25, 0x91, 0x9e, 0xc5, 0x0c, 0x28, 0x1b, 0x96, + 0x4e, 0x77, 0x0d, 0x3c, 0x4e, 0xd9, 0xb0, 0x18, 0x2b, 0xc1, 0x42, 0x11, 0xda, 0xdd, 0xe3, 0x0b, + 0x45, 0x54, 0x42, 0x3c, 0x30, 0x77, 0xbe, 0x18, 0xe1, 0xb9, 0xce, 0x61, 0x76, 0x33, 0x80, 0x76, + 0xce, 0xc7, 0xd9, 0xae, 0xec, 0x94, 0x2f, 0x9b, 0x57, 0xeb, 0x68, 0x23, 0x46, 0x8b, 0x7c, 0x8a, + 0x1f, 0x2d, 0xc8, 0xea, 0x35, 0xec, 0x2d, 0x26, 0x9b, 0xa6, 0x94, 0xad, 0x92, 0x94, 0x0d, 0x1f, + 0x47, 0x5b, 0x8c, 0x86, 0xdf, 0x35, 0x6c, 0x3d, 0x2a, 0xd4, 0x1b, 0x8e, 0xc7, 0x4f, 0xe7, 0x6e, + 0x66, 0x6f, 0x23, 0x26, 0xa6, 0x1c, 0xcf, 0x27, 0x04, 0xdc, 0xa3, 0x29, 0xba, 0x34, 0xc7, 0x3e, + 0xb5, 0xe1, 0x92, 0x74, 0x9a, 0x6f, 0x57, 0x48, 0xeb, 0x44, 0xbb, 0x4c, 0xbe, 0xe3, 0xc3, 0xbe, + 0xc9, 0x40, 0x9d, 0x3d, 0x90, 0x51, 0xc8, 0xa2, 0x5f, 0x32, 0x67, 0xba, 0x73, 0xb1, 0x75, 0xee, + 0xeb, 0x03, 0x90, 0x32, 0x16, 0x5f, 0x85, 0x47, 0x2c, 0xd6, 0x33, 0xad, 0xcf, 0x2c, 0xd2, 0x14, + 0x1e, 0xa8, 0xfd, 0xbc, 0x54, 0xed, 0x19, 0x44, 0x8e, 0xdc, 0x33, 0x5b, 0x1d, 0xc7, 0x35, 0x5c, + 0x3a, 0x07, 0x82, 0x57, 0x60, 0x15, 0x36, 0x29, 0xb0, 0x89, 0x36, 0x84, 0x7d, 0xb0, 0x95, 0x9e, + 0x6d, 0xcc, 0x5d, 0xe8, 0xad, 0x13, 0x3a, 0x79, 0x69, 0x2f, 0xc3, 0x9e, 0x30, 0x9d, 0xab, 0x2e, + 0xda, 0x94, 0x62, 0x24, 0x67, 0x11, 0x09, 0x17, 0xb5, 0x4a, 0x6f, 0x8b, 0x5a, 0xd5, 0x47, 0x38, + 0xcd, 0x57, 0x4e, 0xa7, 0x17, 0xe3, 0x9d, 0x1e, 0x2c, 0xd4, 0x29, 0x4b, 0x00, 0xc0, 0x52, 0x7a, + 0x20, 0xf2, 0x21, 0x6f, 0x59, 0x6d, 0xab, 0xd5, 0x6d, 0x45, 0x69, 0x8f, 0x89, 0x05, 0xd3, 0x8d, + 0xe2, 0x46, 0xf2, 0x59, 0x0d, 0x3e, 0x32, 0xca, 0xba, 0x30, 0x18, 0xf6, 0xa0, 0xf5, 0xbe, 0x6b, + 0xcc, 0xce, 0x5a, 0x0d, 0x7d, 0xc6, 0xf0, 0x2c, 0x0f, 0xfc, 0xce, 0x61, 0x28, 0x9c, 0x0c, 0xca, + 0xf0, 0x59, 0x54, 0x6d, 0x31, 0x42, 0xe2, 0xd5, 0x13, 0x83, 0x91, 0x02, 0xb7, 0x62, 0xb4, 0x95, + 0xd1, 0x95, 0xf4, 0x38, 0xfb, 0xaa, 0xf8, 0xf9, 0xa0, 0xe7, 0x60, 0xb3, 0xeb, 0x7a, 0x7b, 0xda, + 0x75, 0xe6, 0x02, 0xaf, 0x44, 0x1a, 0x6d, 0xe8, 0x70, 0xd0, 0x23, 0xb3, 0xda, 0x4a, 0x3d, 0xff, + 0x53, 0xd1, 0xb6, 0xed, 0x34, 0xbb, 0x27, 0x75, 0x9f, 0x5d, 0x93, 0xe2, 0x2b, 0xef, 0x16, 0xb4, + 0x66, 0x3e, 0xe6, 0x9f, 0xb3, 0x27, 0xe2, 0x45, 0xdb, 0xb9, 0xc9, 0x86, 0xc0, 0xd3, 0x1d, 0xf0, + 0x40, 0xc3, 0x37, 0xca, 0x6d, 0xba, 0x38, 0x11, 0xbe, 0x4d, 0x17, 0x27, 0x20, 0x1e, 0xff, 0x96, + 0x73, 0xdb, 0xaf, 0xec, 0xc3, 0x97, 0x85, 0xe3, 0xdf, 0x25, 0xc4, 0x1b, 0x58, 0x91, 0x78, 0xfd, + 0xcb, 0x2c, 0x5c, 0x4b, 0x04, 0x8a, 0x37, 0x16, 0xea, 0x66, 0xc3, 0x71, 0x9b, 0x82, 0x51, 0x03, + 0xf3, 0x87, 0x7b, 0x00, 0xf0, 0x84, 0x47, 0xd0, 0x40, 0x74, 0xb8, 0x2b, 0xf8, 0x97, 0xcc, 0x80, + 0xc6, 0xd3, 0x94, 0x40, 0x0d, 0x13, 0x68, 0x8d, 0x4b, 0x4b, 0x40, 0xdb, 0x07, 0x72, 0x87, 0xde, + 0x8d, 0x07, 0x40, 0x02, 0x1a, 0x92, 0xf3, 0x30, 0xc8, 0x6f, 0x5a, 0x9e, 0x9f, 0xec, 0xe7, 0x86, + 0xb9, 0xe8, 0xe5, 0x70, 0x4d, 0xce, 0xc0, 0xf7, 0x30, 0xbb, 0x3d, 0xf0, 0x8a, 0xd1, 0xaa, 0x47, + 0xe6, 0x22, 0x4f, 0x43, 0xd3, 0xff, 0xc9, 0x07, 0x12, 0x21, 0xf7, 0xa4, 0xe1, 0xba, 0x56, 0xe4, + 0x92, 0x9e, 0x47, 0x03, 0xae, 0xf9, 0x96, 0x32, 0xa5, 0x76, 0xd5, 0xf4, 0xa1, 0x51, 0xb0, 0x8c, + 0x75, 0x39, 0xbb, 0xf5, 0xa0, 0x21, 0x31, 0x12, 0x96, 0x08, 0xc9, 0x87, 0xea, 0x5b, 0xe5, 0x9a, + 0x5e, 0x07, 0x8c, 0xfd, 0x42, 0xc1, 0x0e, 0xc0, 0xe4, 0xb4, 0x29, 0xf9, 0x00, 0x0c, 0x55, 0xde, + 0xc5, 0x84, 0x6d, 0x2d, 0xc4, 0x73, 0x39, 0x67, 0x44, 0x21, 0x0e, 0x64, 0xf5, 0x91, 0x6a, 0xc7, + 0x25, 0xd8, 0x95, 0x49, 0x3e, 0xbc, 0x56, 0x27, 0x0a, 0x71, 0xb0, 0x48, 0x07, 0x31, 0x09, 0x7e, + 0x45, 0x8b, 0xb6, 0x1c, 0x27, 0xe9, 0xd5, 0xca, 0x7b, 0xae, 0xd1, 0xf6, 0x8c, 0x86, 0x78, 0x96, + 0xed, 0x59, 0x34, 0xec, 0xb8, 0xd6, 0x9c, 0xd5, 0xd6, 0x1b, 0xf3, 0x86, 0xd5, 0xe6, 0x19, 0x29, + 0x56, 0x36, 0x15, 0x14, 0x45, 0xeb, 0x6e, 0xbb, 0xdb, 0x9a, 0x09, 0xb7, 0x15, 0xd8, 0xba, 0x7b, + 0x9b, 0x16, 0x05, 0xab, 0xbf, 0x6b, 0x36, 0x4c, 0xab, 0xe3, 0x43, 0xd6, 0x96, 0x9d, 0x55, 0x1c, + 0x86, 0x42, 0x96, 0xaa, 0xfe, 0xa8, 0x06, 0x1e, 0x8a, 0x9c, 0x1f, 0x90, 0xfa, 0xfd, 0x08, 0xcf, + 0x24, 0x5f, 0xf2, 0x05, 0xf8, 0x79, 0xa9, 0x0e, 0x52, 0xb4, 0x60, 0x1d, 0x90, 0xd0, 0x21, 0x8f, + 0x80, 0x85, 0x09, 0xdb, 0x4e, 0x35, 0xeb, 0xfb, 0xee, 0xd5, 0xd7, 0x34, 0x88, 0x12, 0x33, 0x7a, + 0xfb, 0x59, 0x48, 0xdc, 0xbf, 0xd5, 0xef, 0xfb, 0x1a, 0x7a, 0xfa, 0xa1, 0x4b, 0xb3, 0x0f, 0xd4, + 0xd7, 0x9d, 0x64, 0xb7, 0xb5, 0xf0, 0x6d, 0x84, 0xa8, 0x2f, 0x1c, 0x38, 0xb4, 0x8e, 0x72, 0xff, + 0x91, 0xb1, 0x2d, 0xd2, 0x98, 0x72, 0xda, 0xbe, 0x6b, 0x34, 0xfc, 0xfa, 0x10, 0x25, 0x71, 0xbd, + 0x3d, 0xeb, 0x04, 0xeb, 0x91, 0xb7, 0xd8, 0x9a, 0x71, 0x6c, 0x7e, 0x1a, 0x96, 0x3d, 0x89, 0xf7, + 0xc5, 0xd8, 0xe8, 0xe2, 0x8f, 0xb8, 0x8a, 0x06, 0x9b, 0x66, 0xc3, 0x6a, 0x19, 0xb6, 0x07, 0xc7, + 0xe6, 0xc2, 0x67, 0x7c, 0x08, 0x6d, 0xa2, 0x99, 0x66, 0xdf, 0x37, 0x9b, 0x3a, 0x6f, 0xbf, 0x9a, + 0x56, 0x1a, 0x09, 0x5f, 0x80, 0x28, 0xe1, 0x6d, 0x38, 0x89, 0x98, 0x5e, 0xfe, 0xd9, 0x0d, 0x0b, + 0xc6, 0x96, 0xbc, 0x35, 0x18, 0xfb, 0x12, 0x1a, 0x04, 0x2e, 0xb8, 0x89, 0xf7, 0x4b, 0x75, 0x25, + 0x21, 0x52, 0x0f, 0x5b, 0x92, 0x0b, 0x30, 0xb0, 0x98, 0x46, 0x21, 0x01, 0x63, 0x7a, 0x93, 0x8b, + 0x74, 0xc6, 0x0a, 0x31, 0x29, 0x9d, 0xd4, 0x51, 0x9a, 0x6a, 0x2d, 0x7d, 0xa6, 0x17, 0xcd, 0xf6, + 0x28, 0x09, 0x84, 0xdb, 0x7f, 0x43, 0x06, 0x7f, 0xa7, 0xbc, 0x79, 0xc1, 0xe8, 0x70, 0x73, 0x02, + 0x3d, 0x7e, 0x21, 0x35, 0x24, 0x41, 0xee, 0x83, 0x47, 0x09, 0xce, 0x5d, 0x6c, 0x2c, 0x5c, 0x71, + 0xdc, 0x7b, 0xa2, 0xd3, 0x71, 0x00, 0x8d, 0x34, 0x80, 0x5e, 0x22, 0x47, 0xb5, 0xb1, 0x11, 0xef, + 0x87, 0x5c, 0x81, 0x6c, 0x84, 0x9a, 0x2c, 0xc8, 0xb4, 0x0d, 0x0d, 0x5a, 0x1e, 0xf3, 0x3f, 0x29, + 0xbd, 0xc1, 0xfa, 0x5a, 0xcb, 0xa3, 0x2d, 0xc9, 0x76, 0x48, 0xdd, 0xdf, 0xe4, 0xd7, 0xb1, 0xa7, + 0x1d, 0x27, 0x4c, 0x13, 0xbf, 0x05, 0x89, 0xf9, 0xc4, 0x4b, 0xa0, 0x9a, 0x39, 0x2c, 0x82, 0xf1, + 0xdc, 0x70, 0x9a, 0x7c, 0xef, 0x7f, 0x55, 0x1d, 0x9e, 0x8a, 0xb8, 0xb3, 0x5b, 0xe1, 0xfc, 0xd4, + 0x65, 0xb6, 0xf9, 0x35, 0xeb, 0x70, 0x5e, 0x7e, 0x54, 0x81, 0x88, 0x4d, 0x78, 0x03, 0x8c, 0xe4, + 0x9f, 0xa2, 0xc7, 0xa7, 0xc3, 0xfb, 0xda, 0x95, 0xfc, 0xfb, 0xda, 0xcc, 0x86, 0xd0, 0x00, 0x4f, + 0xa1, 0xe1, 0x58, 0xde, 0x6d, 0x80, 0x12, 0xa8, 0x66, 0x6f, 0x04, 0xf1, 0x0b, 0xae, 0xb6, 0x90, + 0x8c, 0x3b, 0x83, 0xaa, 0x56, 0x10, 0xf4, 0x26, 0x6e, 0xc9, 0x1b, 0x34, 0xfd, 0x49, 0x67, 0xf0, + 0x60, 0x7d, 0xab, 0xe5, 0x4d, 0x09, 0x15, 0xa6, 0x9d, 0xc6, 0x04, 0x7d, 0x8d, 0x6d, 0xb4, 0x93, + 0x55, 0xd4, 0xe5, 0xd7, 0xec, 0xe9, 0xe4, 0xce, 0xfa, 0x1e, 0xc7, 0x49, 0x4e, 0x5d, 0x0e, 0x1a, + 0xd4, 0xab, 0x8c, 0x5e, 0xa2, 0x3b, 0xfa, 0x8e, 0x5c, 0x85, 0x79, 0x42, 0x83, 0xea, 0x69, 0x67, + 0x6a, 0x86, 0x5d, 0x91, 0x99, 0x80, 0x8d, 0x6a, 0x61, 0x5b, 0x47, 0x50, 0x30, 0x24, 0x80, 0x12, + 0x17, 0x6d, 0xf7, 0xaa, 0x09, 0xc9, 0x4e, 0xb3, 0xaf, 0x82, 0x83, 0xc3, 0xe4, 0x06, 0x44, 0x6d, + 0xbc, 0xb5, 0x70, 0x21, 0xaa, 0x3c, 0x2b, 0x17, 0x61, 0x12, 0x2a, 0x89, 0x29, 0xd9, 0xe1, 0x27, + 0x0f, 0x27, 0x3a, 0x1d, 0xd7, 0x59, 0x80, 0x89, 0xe6, 0x25, 0x26, 0x30, 0xf9, 0xff, 0xa0, 0xbb, + 0xac, 0x5a, 0x61, 0x92, 0x74, 0xa3, 0x01, 0x35, 0xa2, 0xa4, 0x4a, 0x76, 0x48, 0x0d, 0xdf, 0xbe, + 0xa0, 0x62, 0xdd, 0x8c, 0xdf, 0x7c, 0xdf, 0x60, 0xc4, 0x7a, 0x22, 0xe7, 0x23, 0x7f, 0x83, 0x26, + 0x79, 0xa6, 0x4d, 0x97, 0xbe, 0xa1, 0x47, 0x41, 0x85, 0x45, 0x32, 0xbc, 0x8d, 0xab, 0xc5, 0x6f, + 0xe3, 0x4e, 0x83, 0x98, 0x19, 0xed, 0x23, 0x15, 0x75, 0x82, 0x82, 0xf0, 0x1c, 0x40, 0xf0, 0x90, + 0x71, 0x98, 0x7e, 0x5f, 0x74, 0x09, 0x70, 0xc2, 0xb6, 0xd3, 0x44, 0xc3, 0x08, 0xf5, 0x1c, 0xe4, + 0xd8, 0x68, 0xa9, 0x82, 0xc7, 0xa8, 0xf7, 0x8a, 0xd0, 0x3b, 0x71, 0xa3, 0x9d, 0xa7, 0xac, 0x7e, + 0xc2, 0x6b, 0xeb, 0xc3, 0x8c, 0x34, 0x6d, 0x58, 0x20, 0x75, 0x46, 0xdb, 0xf3, 0x59, 0xdd, 0x0a, + 0x4b, 0x3c, 0x72, 0x3a, 0x3a, 0xe0, 0x4c, 0x2b, 0x4e, 0x19, 0x1d, 0xa3, 0x61, 0xf9, 0x8b, 0x05, + 0x14, 0x7d, 0x27, 0x0a, 0x97, 0x13, 0x4d, 0x81, 0xcb, 0x2a, 0x1a, 0x6c, 0x40, 0x19, 0xa8, 0x39, + 0x7c, 0xce, 0xd0, 0xf4, 0x9e, 0xc8, 0xf6, 0x5c, 0x03, 0x40, 0xd5, 0x8a, 0xb4, 0xbc, 0x18, 0x19, + 0x58, 0x56, 0x29, 0x3a, 0x1a, 0xcb, 0x18, 0x6f, 0x84, 0xef, 0x94, 0x7b, 0xa0, 0x31, 0x11, 0x40, + 0x53, 0x1b, 0x5b, 0x71, 0xe2, 0xe4, 0x0a, 0x5a, 0x1f, 0xab, 0xa7, 0xb2, 0xb1, 0x28, 0x7d, 0x25, + 0x2e, 0x3d, 0x59, 0xe0, 0x72, 0xba, 0x46, 0xdb, 0x37, 0x83, 0x2f, 0xf8, 0x2d, 0xd3, 0xf3, 0x8c, + 0x39, 0xf3, 0xde, 0x62, 0x27, 0x1c, 0xe3, 0xfb, 0xd0, 0xc6, 0x39, 0xfa, 0xde, 0x4d, 0xee, 0xf6, + 0x40, 0x31, 0xdf, 0xc2, 0xd9, 0x8f, 0x46, 0x5a, 0xac, 0xb9, 0xee, 0x2f, 0x76, 0x4c, 0xbd, 0xeb, + 0x72, 0x2f, 0x6c, 0x43, 0x2b, 0x22, 0x7b, 0xdf, 0xb5, 0xc9, 0x59, 0xb4, 0x16, 0xba, 0x54, 0x7c, + 0xfa, 0xb2, 0x6e, 0x36, 0x91, 0x37, 0xb9, 0xe2, 0xe5, 0x5c, 0x87, 0x3b, 0xce, 0x83, 0x73, 0x50, + 0x01, 0x14, 0xbe, 0x43, 0x1e, 0x04, 0xb1, 0x4a, 0xf5, 0xb0, 0x36, 0x39, 0x96, 0x88, 0xaf, 0x27, + 0x6c, 0xdb, 0x79, 0x1c, 0x04, 0xb2, 0x5c, 0x23, 0x18, 0xad, 0x72, 0x1d, 0xdb, 0x84, 0xe5, 0x91, + 0xfe, 0x4f, 0xce, 0xa7, 0x22, 0xbe, 0xb0, 0x11, 0x30, 0xb4, 0x23, 0xe9, 0x0e, 0x0d, 0x89, 0xce, + 0x0d, 0x4f, 0xd2, 0x0a, 0x89, 0xd7, 0x64, 0xbf, 0x64, 0x22, 0xbd, 0xb9, 0x54, 0xb6, 0x9b, 0x31, + 0x61, 0x9e, 0xd1, 0x8b, 0x08, 0x0f, 0x18, 0x82, 0x0d, 0xef, 0xa2, 0x23, 0x4c, 0xa6, 0xf8, 0x7b, + 0x20, 0xff, 0x2a, 0xda, 0x10, 0xc7, 0xbe, 0x51, 0x1e, 0x26, 0x88, 0xd1, 0xe0, 0x97, 0xc6, 0x58, + 0x7b, 0x28, 0x24, 0x53, 0x20, 0xf8, 0x65, 0xc0, 0xc9, 0x91, 0x64, 0xa7, 0xf3, 0x0f, 0x32, 0x35, + 0x40, 0x33, 0x72, 0x22, 0x61, 0x48, 0xbc, 0xda, 0xf2, 0xcd, 0x96, 0xda, 0x75, 0x96, 0x50, 0xa8, + 0xb3, 0x66, 0x64, 0x3f, 0x3f, 0x70, 0x23, 0xf9, 0xe2, 0x83, 0x37, 0x00, 0x5a, 0xfc, 0x78, 0x78, + 0x50, 0x46, 0x51, 0x35, 0xda, 0x10, 0xb0, 0x3c, 0xee, 0xbe, 0x30, 0x97, 0x72, 0xd0, 0xf2, 0xc0, + 0x5f, 0xb9, 0x80, 0x56, 0x33, 0xbf, 0xa4, 0x52, 0xd6, 0x2f, 0x61, 0xed, 0xc8, 0xa5, 0x30, 0xaf, + 0x9f, 0xae, 0x53, 0x5c, 0xbd, 0x73, 0xfc, 0x9e, 0x82, 0x9c, 0x4a, 0x94, 0x76, 0xa2, 0x9d, 0xaa, + 0x3f, 0xc1, 0x52, 0x6e, 0xa1, 0x21, 0xf9, 0x1d, 0x0d, 0x6d, 0x11, 0x34, 0xff, 0xd0, 0xf2, 0xe7, + 0x79, 0xa4, 0xd8, 0x37, 0xc8, 0x17, 0x7c, 0x46, 0x88, 0xa2, 0x58, 0x2a, 0x7c, 0x5b, 0x2c, 0xa4, + 0xe5, 0xc1, 0xec, 0x94, 0x63, 0xf1, 0x31, 0x1b, 0x05, 0x4f, 0xfc, 0xda, 0xbb, 0x38, 0xc2, 0x04, + 0x36, 0xfb, 0x9e, 0x06, 0xf8, 0x71, 0x78, 0x69, 0x35, 0xb3, 0x43, 0x50, 0xff, 0x7d, 0x34, 0x2c, + 0x6e, 0xf5, 0x82, 0x11, 0x0e, 0xe5, 0x69, 0x48, 0xa0, 0xc5, 0xf1, 0x12, 0x44, 0x32, 0x3f, 0x53, + 0x40, 0x99, 0x97, 0x61, 0xbf, 0x88, 0x21, 0xb0, 0xdc, 0x35, 0xcd, 0x66, 0xf1, 0x31, 0x7a, 0x07, + 0x4e, 0x6e, 0xc5, 0xda, 0x86, 0x87, 0xb1, 0x56, 0x7b, 0x41, 0x81, 0xd2, 0x41, 0x89, 0x1a, 0xd6, + 0x59, 0x6d, 0xf2, 0x1a, 0x5f, 0x6f, 0xc5, 0xcb, 0xaf, 0x77, 0x01, 0xeb, 0x8a, 0x33, 0x76, 0x0c, + 0x6d, 0x49, 0xde, 0x92, 0x8b, 0x05, 0x4f, 0x4f, 0xc7, 0xee, 0xc7, 0x81, 0xa0, 0x1f, 0xd3, 0xc2, + 0x8b, 0xe7, 0x52, 0xd2, 0xc0, 0xf7, 0x15, 0x34, 0xc8, 0xa1, 0xb5, 0x94, 0xf0, 0x0d, 0x72, 0x2a, + 0x61, 0x5b, 0xb9, 0x97, 0x33, 0xfe, 0x9d, 0x5f, 0xd4, 0xd0, 0x6a, 0xca, 0x05, 0xfe, 0x84, 0x86, + 0xd6, 0xb0, 0x90, 0x0d, 0xef, 0xcb, 0xde, 0x1c, 0x8b, 0xe1, 0x79, 0x55, 0xf7, 0xe7, 0x57, 0x64, + 0x62, 0x90, 0xf1, 0x8f, 0x7d, 0xeb, 0x87, 0x9f, 0xac, 0x1c, 0xc6, 0x07, 0x6b, 0x1d, 0xd7, 0x69, + 0x76, 0x1b, 0xbe, 0xd7, 0xb0, 0xb2, 0xd0, 0xef, 0x00, 0x0a, 0x11, 0xff, 0x81, 0x86, 0x86, 0xc2, + 0x7d, 0x4c, 0xfc, 0x42, 0x76, 0x5f, 0x12, 0xdc, 0xaf, 0xea, 0x91, 0xa2, 0xd5, 0x81, 0xc1, 0x73, + 0x94, 0xc1, 0x53, 0xf8, 0x44, 0x11, 0x06, 0xa3, 0xff, 0x96, 0xe8, 0x58, 0x5c, 0xc6, 0xbf, 0xa7, + 0xa1, 0xe1, 0x90, 0xe8, 0x84, 0x6d, 0xab, 0xd8, 0x95, 0x60, 0x82, 0xa9, 0xd8, 0x95, 0xa1, 0x7b, + 0x91, 0x13, 0x94, 0xdd, 0x1a, 0x7e, 0xa1, 0x14, 0xbb, 0xf8, 0x73, 0x1a, 0x5a, 0x27, 0x4c, 0x7c, + 0x5c, 0x53, 0x6a, 0x29, 0x7d, 0xb8, 0xb6, 0xfa, 0x62, 0xf1, 0x06, 0xc0, 0xe9, 0x05, 0xca, 0xe9, + 0x69, 0x7c, 0xaa, 0xa0, 0xe5, 0x39, 0x81, 0x50, 0xb5, 0x7f, 0xa8, 0xa1, 0x0d, 0x71, 0x77, 0x47, + 0xc5, 0xb6, 0x14, 0xc4, 0x4b, 0xc5, 0xb6, 0x1c, 0x8e, 0x8b, 0x9c, 0xa2, 0x6c, 0x1f, 0xc5, 0xb5, + 0x92, 0x6c, 0xe3, 0x6f, 0x6a, 0x68, 0xb3, 0x0c, 0xcf, 0x0a, 0x9f, 0xc8, 0xe6, 0x41, 0x81, 0x9e, + 0x55, 0x3d, 0x59, 0xb6, 0x19, 0x08, 0x70, 0x83, 0x0a, 0x70, 0x19, 0x4f, 0x95, 0x1a, 0x21, 0x7a, + 0xcc, 0x02, 0xe0, 0x34, 0x2e, 0xe3, 0x3f, 0xd5, 0xd0, 0xa6, 0x14, 0x2c, 0x16, 0x1e, 0x57, 0x0e, + 0x06, 0x29, 0xf4, 0x56, 0xf5, 0x58, 0xa9, 0x36, 0xbd, 0x8c, 0xa1, 0x39, 0xd3, 0xd7, 0x01, 0xc3, + 0x90, 0x83, 0x6e, 0xe1, 0xaf, 0x6a, 0x68, 0x43, 0xfc, 0xc6, 0x61, 0x0e, 0xf3, 0xd2, 0xbb, 0x90, + 0x39, 0xcc, 0xcb, 0x6f, 0x46, 0x92, 0x57, 0x28, 0xf3, 0x97, 0xf0, 0x64, 0x11, 0xe6, 0x93, 0x77, + 0x28, 0x6b, 0x4b, 0xc2, 0x27, 0x6f, 0x19, 0x7f, 0x49, 0x43, 0x9b, 0xe2, 0xdd, 0x04, 0xd3, 0x61, + 0x5c, 0x39, 0xba, 0x4b, 0x8b, 0x92, 0x89, 0xad, 0x45, 0xce, 0x52, 0x51, 0x4e, 0xe2, 0xe3, 0xbd, + 0x88, 0x82, 0xbf, 0xac, 0xa1, 0x61, 0x11, 0x9b, 0x09, 0xab, 0x17, 0x13, 0x09, 0xe0, 0x54, 0xf5, + 0x68, 0x89, 0x16, 0xc0, 0xf3, 0x55, 0xca, 0xf3, 0x04, 0xbe, 0x50, 0x84, 0xe7, 0x18, 0xc8, 0x54, + 0x6d, 0x49, 0x98, 0x0c, 0xcb, 0xc1, 0xda, 0xb9, 0x51, 0xec, 0x21, 0xd0, 0xbc, 0x7a, 0x5d, 0x29, + 0x29, 0x41, 0x06, 0xf8, 0x15, 0x39, 0x4d, 0x25, 0x38, 0x86, 0x8f, 0x96, 0x96, 0x00, 0xff, 0x44, + 0x43, 0xcf, 0x48, 0x41, 0x8d, 0xf0, 0xe9, 0x82, 0x43, 0x39, 0x0d, 0xe7, 0x54, 0x7d, 0xb9, 0x97, + 0xa6, 0x20, 0x8b, 0x4e, 0x65, 0x79, 0x1d, 0x3f, 0x2c, 0x3b, 0x82, 0x84, 0x24, 0x63, 0xdc, 0x2e, + 0x89, 0x19, 0xf2, 0x8e, 0x86, 0x46, 0xa5, 0x2c, 0x04, 0xe6, 0x3a, 0x5d, 0x70, 0xd0, 0x97, 0x13, + 0x3a, 0x0f, 0x8d, 0x8a, 0x4c, 0x51, 0xa1, 0xcf, 0xe1, 0x33, 0x2b, 0x10, 0x1a, 0xff, 0x9d, 0x86, + 0x70, 0x1a, 0xd6, 0x09, 0x2b, 0xe6, 0x71, 0x26, 0x92, 0x54, 0xf5, 0x78, 0xb9, 0x46, 0x20, 0xc6, + 0x34, 0x15, 0xe3, 0x15, 0x7c, 0xad, 0xd0, 0x27, 0x91, 0xa3, 0x32, 0x99, 0x9e, 0x3e, 0xeb, 0xb8, + 0xcc, 0x39, 0xae, 0x2d, 0x89, 0xee, 0xff, 0x32, 0xfe, 0xa7, 0x20, 0xd6, 0x93, 0xa2, 0x25, 0xe1, + 0x53, 0x4a, 0x16, 0xb3, 0x51, 0x80, 0xaa, 0x2f, 0x95, 0x6f, 0x08, 0xf2, 0xdd, 0xa3, 0xf2, 0xdd, + 0xc6, 0x37, 0x8b, 0xca, 0x27, 0x98, 0x27, 0x5b, 0xc6, 0x1f, 0x6b, 0x68, 0x34, 0x0b, 0x6d, 0x48, + 0x35, 0x20, 0x73, 0xd0, 0x8e, 0x54, 0x03, 0x32, 0x0f, 0xdc, 0x88, 0x3c, 0xa4, 0x92, 0xde, 0xc1, + 0xaf, 0x16, 0x96, 0x74, 0xbc, 0x98, 0xb0, 0x3f, 0xd1, 0xd0, 0x48, 0x12, 0x07, 0x05, 0x1f, 0x55, + 0x71, 0x2a, 0x45, 0x09, 0xaa, 0x8e, 0x97, 0x69, 0x02, 0x42, 0xf9, 0x54, 0xa8, 0x36, 0xb6, 0x4b, + 0x08, 0xe5, 0x05, 0x74, 0x74, 0x86, 0xe2, 0x52, 0x5b, 0x52, 0x41, 0x9d, 0x2c, 0xc7, 0x56, 0x1d, + 0x3d, 0xf4, 0x8c, 0x7e, 0xb5, 0x82, 0x46, 0xb3, 0xb0, 0x44, 0x54, 0xe6, 0xcd, 0xc1, 0x08, 0x52, + 0x99, 0x37, 0x0f, 0xc5, 0x87, 0x2c, 0x51, 0x4d, 0x74, 0xb1, 0x57, 0x44, 0x13, 0x90, 0xca, 0x63, + 0x97, 0x04, 0x74, 0x11, 0x28, 0xa5, 0x37, 0x85, 0x7c, 0xac, 0x82, 0x76, 0xa8, 0xf0, 0x77, 0xf0, + 0x39, 0xb5, 0x2f, 0x9e, 0x83, 0x11, 0x54, 0x3d, 0xdf, 0x6b, 0x73, 0x50, 0x4e, 0x83, 0x2a, 0xe7, + 0x03, 0xf8, 0x8d, 0x22, 0xca, 0x31, 0x6c, 0x5b, 0x97, 0x0c, 0x15, 0x2f, 0x47, 0x35, 0xf8, 0xd3, + 0x15, 0xb4, 0xb7, 0x08, 0xe4, 0x0d, 0xbe, 0xac, 0x94, 0xa6, 0x28, 0x4e, 0x4f, 0xf5, 0xca, 0x4a, + 0xc9, 0x80, 0x72, 0x3e, 0x44, 0x95, 0xd3, 0xc4, 0x33, 0x45, 0x95, 0x93, 0x3d, 0x7a, 0x72, 0x75, + 0xf4, 0x79, 0x0d, 0x6d, 0x4c, 0x80, 0xd9, 0xe4, 0x78, 0x84, 0x12, 0x58, 0x9c, 0x1c, 0x8f, 0x50, + 0x86, 0x94, 0x53, 0x2e, 0xd4, 0x0f, 0xa2, 0x89, 0xd8, 0x45, 0x13, 0xfc, 0x05, 0x0d, 0x6d, 0x88, + 0x83, 0xdc, 0xe4, 0xc4, 0x12, 0x52, 0xe0, 0x9d, 0x9c, 0x58, 0x42, 0x8e, 0xc5, 0x43, 0xce, 0x50, + 0xd6, 0x4f, 0xe0, 0x63, 0x45, 0x58, 0x4f, 0xa0, 0xf6, 0xe0, 0x9f, 0x6a, 0x68, 0xa7, 0x12, 0x20, + 0x07, 0x9f, 0x57, 0xf2, 0x94, 0x8b, 0xd4, 0x53, 0xbd, 0xd0, 0x73, 0x7b, 0x90, 0xef, 0x36, 0x95, + 0xef, 0x1a, 0xbe, 0x52, 0xd4, 0x34, 0x89, 0x1f, 0x7c, 0x60, 0xbb, 0x90, 0x7a, 0x08, 0xce, 0xf3, + 0x75, 0x0d, 0x3d, 0x23, 0x45, 0xd6, 0xc1, 0x8a, 0xb0, 0x5a, 0x85, 0xd7, 0x53, 0x3d, 0x55, 0xba, + 0x1d, 0x88, 0x76, 0x89, 0x8a, 0x76, 0x1e, 0x9f, 0x2d, 0x22, 0x5a, 0x6c, 0xc4, 0x89, 0x31, 0xd4, + 0x6f, 0x6b, 0x68, 0x28, 0xc4, 0xaa, 0xc1, 0x07, 0x15, 0x1f, 0x89, 0x04, 0x64, 0x4e, 0xf5, 0x50, + 0xa1, 0xba, 0xc0, 0xec, 0x49, 0xca, 0xec, 0x8b, 0xf8, 0x48, 0xa1, 0x2f, 0x08, 0x6d, 0xae, 0x1b, + 0xb6, 0x8d, 0x3f, 0xa3, 0xa1, 0x41, 0x8e, 0xbd, 0x82, 0x0f, 0xe7, 0x8c, 0xf0, 0x18, 0x80, 0x4c, + 0xf5, 0x85, 0x82, 0xb5, 0x7b, 0x49, 0x09, 0x84, 0xa0, 0x31, 0x42, 0x4a, 0xe3, 0xd3, 0x1a, 0x5a, + 0xc7, 0xa9, 0x06, 0xba, 0x3c, 0xac, 0x5c, 0x42, 0x4b, 0x70, 0x2b, 0x01, 0xae, 0x29, 0x97, 0xae, + 0x0b, 0xb9, 0xc5, 0xdf, 0xd3, 0xd0, 0x48, 0x12, 0xb8, 0x04, 0x1f, 0x2f, 0x96, 0xd9, 0x8c, 0xa3, + 0xb3, 0x54, 0x4f, 0x94, 0x6c, 0x05, 0x8c, 0xbf, 0x49, 0x19, 0x7f, 0x0d, 0x3f, 0x28, 0x97, 0x45, + 0x02, 0x44, 0x96, 0xda, 0x52, 0x12, 0xe8, 0x66, 0xb9, 0xb6, 0x24, 0x40, 0x97, 0x2c, 0xe3, 0xaf, + 0x68, 0xe8, 0xe9, 0x64, 0xe7, 0x81, 0x35, 0x8e, 0x17, 0xcb, 0x87, 0x16, 0x17, 0x52, 0x01, 0x26, + 0xd3, 0x63, 0xee, 0x97, 0x0b, 0x89, 0xff, 0x57, 0x43, 0xd5, 0x6c, 0x24, 0x89, 0x9c, 0x45, 0x35, + 0x17, 0x0b, 0x25, 0x67, 0x51, 0xcd, 0x47, 0x35, 0x21, 0x1f, 0xa4, 0xe2, 0xbd, 0x0f, 0xbf, 0x56, + 0x4e, 0xbc, 0xf4, 0x6f, 0xd0, 0x40, 0xa8, 0x7d, 0xbd, 0x99, 0xb4, 0xe2, 0x8f, 0x35, 0xb4, 0x33, + 0x9b, 0x91, 0xc0, 0x9e, 0xe7, 0x8b, 0x59, 0xa6, 0x17, 0x25, 0x14, 0x82, 0x76, 0x21, 0xd7, 0xa8, + 0x12, 0x26, 0xf1, 0xc5, 0x95, 0x2a, 0x01, 0xff, 0x72, 0x05, 0xed, 0xce, 0xc3, 0x3f, 0xc1, 0x13, + 0x65, 0x8d, 0x96, 0x02, 0x67, 0xa9, 0x4e, 0xae, 0x84, 0x04, 0x48, 0x6d, 0x50, 0xa9, 0xdf, 0xc0, + 0xaf, 0x17, 0xfd, 0x9e, 0x4a, 0x25, 0x8f, 0x60, 0x4c, 0x6a, 0x4b, 0x56, 0xd3, 0x5b, 0xae, 0x2d, + 0x85, 0x90, 0x30, 0xcb, 0xf8, 0x3f, 0x34, 0xb4, 0x35, 0x03, 0xb2, 0x01, 0x2b, 0xac, 0x56, 0x08, + 0xbe, 0xa4, 0x7a, 0xb1, 0x77, 0x02, 0xa0, 0x81, 0xbb, 0x54, 0x03, 0xb7, 0xf0, 0x8d, 0xe2, 0xb9, + 0x17, 0xc9, 0x0f, 0x29, 0x25, 0x92, 0x4c, 0x9f, 0xaa, 0xa0, 0xbd, 0x45, 0x60, 0x41, 0x54, 0xee, + 0x7d, 0x09, 0x48, 0x13, 0x95, 0x7b, 0x5f, 0x06, 0x9d, 0xa4, 0x5c, 0xec, 0x53, 0x50, 0x19, 0xb1, + 0x30, 0x30, 0x58, 0x0c, 0xbe, 0xab, 0xa1, 0x6a, 0x06, 0x57, 0xc1, 0x4a, 0x70, 0x26, 0x3f, 0x91, + 0x96, 0x09, 0x63, 0x52, 0x3d, 0xdb, 0x5b, 0x63, 0x10, 0xff, 0x32, 0x15, 0xff, 0x02, 0x3e, 0xb7, + 0x22, 0xf1, 0x03, 0x27, 0x67, 0x58, 0xbc, 0x39, 0xa3, 0xda, 0xeb, 0x93, 0x80, 0x88, 0xa8, 0xf6, + 0xfa, 0x64, 0x38, 0x22, 0xe5, 0xf2, 0xbf, 0xb1, 0x5f, 0xeb, 0xc2, 0x5f, 0xd2, 0xd0, 0xfa, 0x18, + 0xa4, 0x06, 0x56, 0x74, 0x2e, 0x03, 0x1c, 0xa9, 0xd6, 0x0a, 0xd7, 0xef, 0x65, 0xa1, 0x8d, 0xfd, + 0x5a, 0x58, 0x22, 0xb1, 0x8b, 0xbf, 0xa8, 0xa1, 0x91, 0x24, 0x9a, 0x88, 0x2a, 0x99, 0x94, 0x81, + 0x4c, 0xa2, 0x4a, 0x26, 0x65, 0x81, 0x95, 0x90, 0xf3, 0x54, 0x8a, 0x97, 0xf0, 0xc9, 0xf2, 0x52, + 0x50, 0x47, 0xf8, 0xab, 0x1a, 0xfd, 0xa9, 0xab, 0x24, 0x16, 0x89, 0xca, 0xaf, 0xc9, 0x46, 0x37, + 0x51, 0xf9, 0x35, 0x0a, 0xc0, 0x13, 0x32, 0x41, 0x85, 0x38, 0x83, 0x4f, 0x17, 0x11, 0xe2, 0x2d, + 0x4a, 0x48, 0x8f, 0x8d, 0x1f, 0x8f, 0x06, 0xe9, 0x09, 0x5c, 0x13, 0x55, 0x90, 0x2e, 0x47, 0x48, + 0x51, 0x05, 0xe9, 0x19, 0xa0, 0x29, 0xe5, 0x7c, 0xb2, 0xf8, 0x4f, 0xd4, 0x05, 0xfa, 0xff, 0x4f, + 0x0d, 0x55, 0xb3, 0x61, 0x4e, 0x54, 0x8b, 0x50, 0x2e, 0xd8, 0x8a, 0x6a, 0x11, 0xca, 0x47, 0x56, + 0x21, 0xaf, 0x53, 0xc1, 0xee, 0xe2, 0x3b, 0x45, 0x3f, 0xc9, 0x99, 0x98, 0x27, 0xa9, 0x95, 0xf7, + 0x27, 0x2c, 0xc0, 0xcf, 0x86, 0x52, 0xc9, 0xf1, 0x45, 0x73, 0x11, 0x5b, 0x72, 0x7c, 0xd1, 0x7c, + 0x0c, 0x17, 0x72, 0x8b, 0x4a, 0x7f, 0x15, 0x5f, 0x2e, 0x2a, 0x3d, 0xcd, 0xc0, 0x65, 0x69, 0x00, + 0x7f, 0x4d, 0x43, 0xa3, 0x71, 0x9d, 0x47, 0x28, 0x1a, 0xaa, 0x10, 0x5f, 0x85, 0xcd, 0xa1, 0x0a, + 0xf1, 0x95, 0x70, 0x1d, 0xe5, 0x16, 0x8d, 0x34, 0xb0, 0x07, 0xfe, 0x77, 0x0d, 0xed, 0x50, 0x01, + 0x62, 0xa8, 0x52, 0xa7, 0x05, 0x80, 0x3c, 0x54, 0xa9, 0xd3, 0x22, 0x38, 0x1c, 0xe4, 0x55, 0x2a, + 0xdf, 0x75, 0x7c, 0xb5, 0x88, 0x7c, 0xe1, 0xa5, 0xf3, 0xda, 0x52, 0xf8, 0xef, 0x72, 0x2d, 0x76, + 0xe1, 0x1f, 0x7f, 0xb4, 0x82, 0x48, 0x16, 0x26, 0x47, 0x04, 0x91, 0x81, 0x27, 0x73, 0xf9, 0xce, + 0x45, 0xf4, 0x50, 0xe5, 0xd3, 0xf3, 0x00, 0x1b, 0xc8, 0x1b, 0x54, 0xee, 0xfb, 0xf8, 0x6e, 0x1f, + 0xe4, 0x06, 0x90, 0x8f, 0x99, 0x50, 0xb8, 0xbf, 0xd4, 0xd0, 0x26, 0x76, 0x93, 0x42, 0x3c, 0x72, + 0xa7, 0x58, 0xf1, 0x15, 0x18, 0x0e, 0xaa, 0xc3, 0x22, 0x2a, 0x58, 0x87, 0xde, 0x47, 0x6e, 0x8d, + 0x01, 0xd3, 0x7f, 0x59, 0x43, 0xa3, 0x11, 0x6e, 0x42, 0x1c, 0x40, 0x00, 0x1f, 0x2a, 0x86, 0xb5, + 0xc0, 0x24, 0x38, 0x5c, 0x06, 0x98, 0xa1, 0x9c, 0x47, 0xd7, 0x0c, 0xda, 0x0b, 0xf6, 0x09, 0x96, + 0x16, 0x36, 0xf1, 0x7e, 0xa1, 0x82, 0x0e, 0x14, 0x46, 0x6c, 0xc1, 0xaf, 0x94, 0x1f, 0x4a, 0x59, + 0xb0, 0x2f, 0x2b, 0x1a, 0x96, 0x3d, 0x4e, 0xc7, 0xec, 0xa1, 0xf8, 0x2f, 0x1a, 0xda, 0x5b, 0x04, + 0x64, 0x46, 0x15, 0xd6, 0x94, 0x00, 0xa9, 0x59, 0x91, 0xf0, 0xa5, 0xfc, 0x83, 0xd0, 0xd2, 0xe1, + 0xca, 0xf3, 0xaf, 0x1a, 0xda, 0x9d, 0x07, 0x0f, 0xa3, 0x0a, 0xe2, 0x0b, 0x22, 0xe4, 0xa8, 0x82, + 0xf8, 0xa2, 0xe8, 0x34, 0xe4, 0x22, 0x15, 0xf5, 0x65, 0xfc, 0x52, 0x89, 0x64, 0x6c, 0x5c, 0xda, + 0x1f, 0x69, 0x68, 0xbb, 0x02, 0x84, 0x03, 0xab, 0x3d, 0x9a, 0x1c, 0x9c, 0x8f, 0xea, 0xb9, 0x1e, + 0x5b, 0xf7, 0x72, 0x3e, 0x2a, 0x70, 0x09, 0xb2, 0x21, 0x40, 0xf0, 0x3b, 0x1a, 0xda, 0x9a, 0x01, + 0xca, 0x81, 0x5f, 0x52, 0x99, 0x42, 0x05, 0xf7, 0x51, 0x3d, 0xdd, 0x43, 0x4b, 0x10, 0xee, 0x0a, + 0x15, 0xee, 0x22, 0x3e, 0x5f, 0x2c, 0xed, 0xa4, 0x77, 0x80, 0x5a, 0xd2, 0x0f, 0xff, 0x73, 0x7e, + 0x08, 0x32, 0x82, 0xa5, 0x18, 0xcf, 0x77, 0x43, 0x93, 0x40, 0x1c, 0x39, 0x9b, 0x4e, 0x72, 0x48, + 0x8d, 0x72, 0x3b, 0x17, 0x89, 0x9f, 0x75, 0xae, 0x2d, 0xf1, 0xed, 0xbe, 0x2f, 0x6a, 0x68, 0x53, + 0xbc, 0x83, 0xfc, 0xa3, 0x6b, 0xa5, 0x85, 0xc8, 0xc4, 0x05, 0x29, 0xb7, 0x73, 0x96, 0x10, 0x02, + 0xff, 0x54, 0x43, 0x9b, 0x52, 0x77, 0xe6, 0xb1, 0x3a, 0xa5, 0x9e, 0x85, 0x98, 0xa0, 0xfa, 0x46, + 0xab, 0x80, 0x0d, 0x88, 0x4d, 0x25, 0x98, 0xc5, 0xcd, 0x22, 0x12, 0xb0, 0x8b, 0xfc, 0xc1, 0x28, + 0xe2, 0x74, 0x6a, 0x4b, 0x22, 0x4e, 0xc3, 0x32, 0x3f, 0xb9, 0xc1, 0x30, 0x19, 0x68, 0x4a, 0x4f, + 0xc0, 0x5f, 0x58, 0xc6, 0x7f, 0xa5, 0x21, 0x9c, 0xc6, 0x1c, 0x50, 0xf9, 0xd4, 0x2a, 0x48, 0x04, + 0x95, 0x4f, 0xad, 0x04, 0x37, 0x28, 0xb7, 0xcf, 0x93, 0x96, 0xda, 0xc3, 0xdf, 0xd6, 0xd0, 0x16, + 0xf9, 0x2d, 0x75, 0xd5, 0x19, 0x23, 0xe5, 0xc5, 0x78, 0xd5, 0x19, 0x23, 0xf5, 0x85, 0xf8, 0x72, + 0xa7, 0x11, 0x41, 0x9c, 0xf0, 0xea, 0x56, 0x6d, 0x89, 0x5f, 0xc7, 0xa7, 0xa7, 0xa2, 0xd7, 0xc7, + 0x6e, 0x92, 0xab, 0x32, 0x3b, 0xb2, 0xfb, 0xe8, 0xaa, 0xcc, 0x8e, 0xf4, 0x8a, 0x3a, 0x79, 0x99, + 0xf2, 0x7e, 0x1c, 0x8f, 0x17, 0xe1, 0x3d, 0xfe, 0x8b, 0xe4, 0xf8, 0x5b, 0x1a, 0xda, 0x2c, 0xc3, + 0x35, 0x50, 0x4d, 0x22, 0x05, 0x8a, 0x82, 0x6a, 0x12, 0xa9, 0xe0, 0x13, 0xc8, 0x4d, 0x2a, 0xc3, + 0x15, 0x7c, 0xa9, 0x88, 0x0c, 0x8f, 0x19, 0x25, 0x76, 0xab, 0x98, 0x83, 0x3f, 0x78, 0xc2, 0x1e, + 0xe2, 0xff, 0x68, 0x68, 0x87, 0x0a, 0x33, 0x40, 0x15, 0xb0, 0x15, 0x80, 0x30, 0x50, 0x05, 0x6c, + 0x45, 0xa0, 0x0a, 0xca, 0x9d, 0xb6, 0x84, 0xcf, 0xa9, 0xa9, 0xc7, 0xc5, 0x9e, 0x75, 0xdc, 0x60, + 0x42, 0x05, 0x4b, 0x79, 0x12, 0x4e, 0x61, 0x19, 0x7f, 0x53, 0x43, 0x5b, 0xe4, 0xd7, 0xb3, 0x55, + 0x93, 0x4b, 0x79, 0xed, 0x5b, 0x35, 0xb9, 0xd4, 0x37, 0xc1, 0xcb, 0x45, 0x03, 0x89, 0x3b, 0xe3, + 0x91, 0x9c, 0xf8, 0x6d, 0x0d, 0x8d, 0x24, 0x01, 0x8b, 0x70, 0x81, 0x14, 0x56, 0x02, 0xce, 0x49, + 0x95, 0x77, 0xcc, 0xc2, 0x6d, 0x2a, 0x97, 0x1f, 0x09, 0x7d, 0x84, 0x47, 0x0b, 0x3a, 0x03, 0x6d, + 0xaa, 0x2d, 0x31, 0xf0, 0xa5, 0xe5, 0xda, 0xd2, 0x23, 0x73, 0x71, 0x19, 0xff, 0x50, 0x43, 0xa3, + 0x59, 0xf8, 0x4b, 0xaa, 0xd3, 0x69, 0x39, 0x98, 0x4f, 0x2a, 0xcf, 0x3d, 0x0f, 0xee, 0x89, 0xdc, + 0xa1, 0x22, 0xde, 0xc0, 0xd7, 0x8b, 0x2d, 0x23, 0x9e, 0xaf, 0xa7, 0xe5, 0xd4, 0x1f, 0x99, 0x8b, + 0x5e, 0x28, 0x2c, 0xfe, 0x63, 0x21, 0x4b, 0x09, 0x98, 0x4c, 0x45, 0xb2, 0x94, 0x71, 0x50, 0xa9, + 0x22, 0x59, 0xca, 0x04, 0x4e, 0x54, 0xb9, 0x03, 0xf1, 0xa1, 0x18, 0x33, 0xc0, 0xe2, 0x57, 0x34, + 0x84, 0xd3, 0xf8, 0x4d, 0xaa, 0x23, 0xbd, 0x99, 0x60, 0x52, 0xaa, 0x23, 0xbd, 0xd9, 0x10, 0x51, + 0xe5, 0x42, 0x8b, 0x90, 0x7f, 0x23, 0x20, 0xc4, 0x92, 0xdd, 0xf4, 0x40, 0x4a, 0x08, 0x22, 0xa2, + 0x3a, 0x90, 0x92, 0xc4, 0x20, 0x51, 0x1d, 0x48, 0x49, 0xa1, 0x92, 0x94, 0x3b, 0x90, 0xc2, 0xb7, + 0xa7, 0x66, 0x9d, 0x20, 0xf2, 0xd9, 0x9a, 0x01, 0x99, 0xa1, 0x0a, 0x08, 0xd4, 0x70, 0x1d, 0xaa, + 0x80, 0x20, 0x07, 0x9f, 0x83, 0x3c, 0xa0, 0x82, 0x4c, 0xe3, 0xdb, 0x85, 0x8e, 0x01, 0x51, 0x80, + 0xe5, 0x8e, 0xa3, 0x47, 0x67, 0xa9, 0x0d, 0x7e, 0xb7, 0x10, 0x1c, 0x38, 0x38, 0x56, 0x81, 0xff, + 0x5b, 0x43, 0xdb, 0x15, 0x80, 0x1c, 0xaa, 0x10, 0x2f, 0x1f, 0x14, 0x44, 0x15, 0xe2, 0x15, 0x40, + 0x01, 0x21, 0xef, 0xa3, 0x42, 0xdf, 0xc3, 0xf5, 0x92, 0x42, 0x8b, 0x67, 0x8e, 0xb3, 0x04, 0x7f, + 0x47, 0x43, 0xcf, 0x48, 0x01, 0x36, 0xb0, 0xda, 0xd1, 0xce, 0x44, 0xf4, 0x50, 0xf9, 0xaa, 0x4a, + 0x24, 0x8f, 0x72, 0xce, 0x05, 0xa0, 0x66, 0x98, 0x2e, 0x7c, 0x67, 0xe9, 0xc9, 0xb5, 0xda, 0x12, + 0xc7, 0x70, 0x58, 0xc6, 0xdf, 0xd1, 0xd0, 0xb6, 0x4c, 0xfc, 0x0d, 0xfc, 0x72, 0x5e, 0x26, 0x3e, + 0x1b, 0x1c, 0xa4, 0x7a, 0xa6, 0xa7, 0xb6, 0xbd, 0x44, 0xb4, 0xf4, 0x88, 0xa8, 0x4c, 0x50, 0x0f, + 0xff, 0x85, 0x86, 0x46, 0x92, 0x78, 0x1d, 0xf8, 0x68, 0xbe, 0xea, 0x13, 0xb0, 0x20, 0xd5, 0xf1, + 0x32, 0x4d, 0x7a, 0x71, 0x14, 0x62, 0xd8, 0x1d, 0x8b, 0xa2, 0x85, 0xfe, 0x86, 0x0d, 0xbd, 0x34, + 0xf4, 0x47, 0xce, 0xd0, 0xcb, 0x04, 0x14, 0xc9, 0x19, 0x7a, 0xd9, 0x18, 0x23, 0xe5, 0x16, 0xf2, + 0xc8, 0x2a, 0x11, 0x22, 0x09, 0xfe, 0xaf, 0x40, 0x18, 0x19, 0x9c, 0x86, 0x52, 0x18, 0x05, 0x6a, + 0x88, 0x52, 0x18, 0x15, 0x6e, 0x07, 0xb1, 0xa8, 0x30, 0x0d, 0x6c, 0x14, 0xca, 0x08, 0x01, 0x29, + 0x7d, 0x66, 0x51, 0x17, 0xb1, 0x47, 0x6a, 0x4b, 0x09, 0xc8, 0x92, 0xe5, 0xda, 0x52, 0x12, 0x9b, + 0x64, 0x19, 0xff, 0x91, 0x86, 0xd6, 0xc7, 0x10, 0x2a, 0xf2, 0x86, 0xa0, 0x04, 0x31, 0x23, 0x6f, + 0x08, 0xca, 0x40, 0x34, 0xca, 0x05, 0x53, 0x71, 0xb8, 0x0d, 0x7a, 0x1b, 0x33, 0x05, 0x32, 0x82, + 0xc7, 0x8b, 0x78, 0x00, 0x71, 0x38, 0x91, 0xea, 0xb1, 0x52, 0x6d, 0x7a, 0x3a, 0x7a, 0x19, 0x39, + 0x0d, 0xb6, 0xf3, 0x58, 0x0f, 0xfc, 0x39, 0xfc, 0xd7, 0x5a, 0xec, 0x57, 0x05, 0x22, 0x11, 0x4e, + 0x14, 0xda, 0x79, 0x4b, 0x49, 0x71, 0xb2, 0x6c, 0x33, 0x10, 0x64, 0x92, 0x0a, 0x72, 0x16, 0xbf, + 0x5c, 0x72, 0xd7, 0x43, 0x94, 0xe5, 0x1d, 0x0d, 0x6d, 0x96, 0x41, 0x8e, 0xa8, 0x64, 0x51, 0xe0, + 0x9c, 0xa8, 0x64, 0x51, 0x21, 0x9b, 0x94, 0xdb, 0x0c, 0x30, 0x81, 0x92, 0x1e, 0xdb, 0xca, 0x89, + 0x9f, 0x71, 0x7a, 0x57, 0x43, 0xd5, 0x6c, 0xec, 0x12, 0xe5, 0x31, 0x9e, 0x3c, 0x70, 0x14, 0xe5, + 0x31, 0x9e, 0x5c, 0xb8, 0x14, 0x72, 0x9d, 0x8a, 0x3a, 0x85, 0x27, 0x0a, 0xad, 0x75, 0x2a, 0xac, + 0x37, 0xfc, 0x3d, 0x0d, 0x6d, 0x0b, 0x86, 0x84, 0x14, 0xd5, 0x44, 0x79, 0x46, 0x5c, 0x01, 0xa6, + 0xa2, 0x3c, 0x23, 0xae, 0x82, 0x4f, 0x29, 0x17, 0x1a, 0xc9, 0x45, 0x4a, 0x9a, 0xf1, 0x0b, 0x1a, + 0xda, 0x48, 0x07, 0x7d, 0x84, 0x89, 0xa1, 0x3a, 0xea, 0x9c, 0x86, 0xdd, 0x50, 0x1d, 0x75, 0x96, + 0x00, 0x6d, 0x94, 0xf3, 0x0f, 0xe0, 0x9e, 0x36, 0xc5, 0xda, 0x48, 0x30, 0xfe, 0x0f, 0x1a, 0x1a, + 0xcd, 0x02, 0x3c, 0x51, 0xde, 0x9b, 0x53, 0xa3, 0xb2, 0x28, 0xef, 0xcd, 0xe5, 0xe0, 0xab, 0x94, + 0x93, 0x2d, 0xb6, 0xc1, 0xff, 0xd8, 0xf2, 0xe7, 0xc3, 0x0c, 0x52, 0x10, 0x95, 0x3c, 0x23, 0x05, + 0xec, 0x50, 0x9e, 0x59, 0x50, 0x40, 0x90, 0x28, 0xcf, 0x2c, 0xa8, 0xf0, 0x45, 0xc8, 0xfb, 0xa9, + 0x48, 0x0f, 0xf0, 0xbd, 0xf2, 0x97, 0x1e, 0x75, 0x0e, 0x2e, 0x92, 0xbe, 0xe9, 0x03, 0x49, 0xff, + 0xc9, 0x57, 0xdf, 0x7e, 0x77, 0x4c, 0xfb, 0xc6, 0xbb, 0x63, 0xda, 0xf7, 0xdf, 0x1d, 0xd3, 0x7e, + 0xed, 0x07, 0x63, 0x4f, 0x7d, 0xe3, 0x07, 0x63, 0x4f, 0xfd, 0xfd, 0x0f, 0xc6, 0x9e, 0x7a, 0xdf, + 0x89, 0x39, 0xcb, 0x9f, 0xef, 0xce, 0x1c, 0x69, 0x38, 0xad, 0xec, 0x9e, 0x9f, 0x88, 0x1f, 0x92, + 0xc5, 0x8e, 0xe9, 0xcd, 0xac, 0xe9, 0xb8, 0x8e, 0xef, 0x1c, 0xfb, 0xbf, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xf5, 0xd7, 0x31, 0xe5, 0xec, 0x95, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -9371,6 +9475,8 @@ type QueryClient interface { // Queries random seeds for a specific epoch. ListRandomSeeds(ctx context.Context, in *QueryRandomSeedsRequest, opts ...grpc.CallOption) (*QueryRandomSeedsResponse, error) ParticipantsWithBalances(ctx context.Context, in *QueryParticipantsWithBalancesRequest, opts ...grpc.CallOption) (*QueryParticipantsWithBalancesResponse, error) + // Queries PoC validation snapshot for deterministic sampling synchronization. + PoCValidationSnapshot(ctx context.Context, in *QueryPoCValidationSnapshotRequest, opts ...grpc.CallOption) (*QueryPoCValidationSnapshotResponse, error) } type queryClient struct { @@ -10110,6 +10216,15 @@ func (c *queryClient) ParticipantsWithBalances(ctx context.Context, in *QueryPar return out, nil } +func (c *queryClient) PoCValidationSnapshot(ctx context.Context, in *QueryPoCValidationSnapshotRequest, opts ...grpc.CallOption) (*QueryPoCValidationSnapshotResponse, error) { + out := new(QueryPoCValidationSnapshotResponse) + err := c.cc.Invoke(ctx, "/inference.inference.Query/PoCValidationSnapshot", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // QueryServer is the server API for Query service. type QueryServer interface { // Parameters queries the parameters of the module. @@ -10251,6 +10366,8 @@ type QueryServer interface { // Queries random seeds for a specific epoch. ListRandomSeeds(context.Context, *QueryRandomSeedsRequest) (*QueryRandomSeedsResponse, error) ParticipantsWithBalances(context.Context, *QueryParticipantsWithBalancesRequest) (*QueryParticipantsWithBalancesResponse, error) + // Queries PoC validation snapshot for deterministic sampling synchronization. + PoCValidationSnapshot(context.Context, *QueryPoCValidationSnapshotRequest) (*QueryPoCValidationSnapshotResponse, error) } // UnimplementedQueryServer can be embedded to have forward compatible implementations. @@ -10500,6 +10617,9 @@ func (*UnimplementedQueryServer) ListRandomSeeds(ctx context.Context, req *Query func (*UnimplementedQueryServer) ParticipantsWithBalances(ctx context.Context, req *QueryParticipantsWithBalancesRequest) (*QueryParticipantsWithBalancesResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method ParticipantsWithBalances not implemented") } +func (*UnimplementedQueryServer) PoCValidationSnapshot(ctx context.Context, req *QueryPoCValidationSnapshotRequest) (*QueryPoCValidationSnapshotResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PoCValidationSnapshot not implemented") +} func RegisterQueryServer(s grpc1.Server, srv QueryServer) { s.RegisterService(&_Query_serviceDesc, srv) @@ -11963,6 +12083,24 @@ func _Query_ParticipantsWithBalances_Handler(srv interface{}, ctx context.Contex return interceptor(ctx, in, info, handler) } +func _Query_PoCValidationSnapshot_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(QueryPoCValidationSnapshotRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(QueryServer).PoCValidationSnapshot(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/inference.inference.Query/PoCValidationSnapshot", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(QueryServer).PoCValidationSnapshot(ctx, req.(*QueryPoCValidationSnapshotRequest)) + } + return interceptor(ctx, in, info, handler) +} + var Query_serviceDesc = _Query_serviceDesc var _Query_serviceDesc = grpc.ServiceDesc{ ServiceName: "inference.inference.Query", @@ -12292,6 +12430,10 @@ var _Query_serviceDesc = grpc.ServiceDesc{ MethodName: "ParticipantsWithBalances", Handler: _Query_ParticipantsWithBalances_Handler, }, + { + MethodName: "PoCValidationSnapshot", + Handler: _Query_PoCValidationSnapshot_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "inference/inference/query.proto", @@ -18606,6 +18748,79 @@ func (m *QueryRandomSeedsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error return len(dAtA) - i, nil } +func (m *QueryPoCValidationSnapshotRequest) 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 *QueryPoCValidationSnapshotRequest) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoCValidationSnapshotRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.PocStageStartHeight != 0 { + i = encodeVarintQuery(dAtA, i, uint64(m.PocStageStartHeight)) + i-- + dAtA[i] = 0x8 + } + return len(dAtA) - i, nil +} + +func (m *QueryPoCValidationSnapshotResponse) 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 *QueryPoCValidationSnapshotResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *QueryPoCValidationSnapshotResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.Found { + i-- + if m.Found { + dAtA[i] = 1 + } else { + dAtA[i] = 0 + } + i-- + dAtA[i] = 0x10 + } + if m.Snapshot != nil { + { + size, err := m.Snapshot.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintQuery(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func encodeVarintQuery(dAtA []byte, offset int, v uint64) int { offset -= sovQuery(v) base := offset @@ -21202,6 +21417,34 @@ func (m *QueryRandomSeedsResponse) Size() (n int) { return n } +func (m *QueryPoCValidationSnapshotRequest) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.PocStageStartHeight != 0 { + n += 1 + sovQuery(uint64(m.PocStageStartHeight)) + } + return n +} + +func (m *QueryPoCValidationSnapshotResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.Snapshot != nil { + l = m.Snapshot.Size() + n += 1 + l + sovQuery(uint64(l)) + } + if m.Found { + n += 2 + } + return n +} + func sovQuery(x uint64) (n int) { return (math_bits.Len64(x|1) + 6) / 7 } @@ -37323,6 +37566,181 @@ func (m *QueryRandomSeedsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *QueryPoCValidationSnapshotRequest) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoCValidationSnapshotRequest: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoCValidationSnapshotRequest: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field PocStageStartHeight", wireType) + } + m.PocStageStartHeight = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.PocStageStartHeight |= int64(b&0x7F) << shift + if b < 0x80 { + break + } + } + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *QueryPoCValidationSnapshotResponse) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: QueryPoCValidationSnapshotResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: QueryPoCValidationSnapshotResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Snapshot", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthQuery + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthQuery + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Snapshot == nil { + m.Snapshot = &PoCValidationSnapshot{} + } + if err := m.Snapshot.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 2: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field Found", wireType) + } + var v int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowQuery + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + v |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + m.Found = bool(v != 0) + default: + iNdEx = preIndex + skippy, err := skipQuery(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthQuery + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} func skipQuery(dAtA []byte) (n int, err error) { l := len(dAtA) iNdEx := 0 diff --git a/inference-chain/x/inference/types/query.pb.gw.go b/inference-chain/x/inference/types/query.pb.gw.go index 44a556860..ab5a3633c 100644 --- a/inference-chain/x/inference/types/query.pb.gw.go +++ b/inference-chain/x/inference/types/query.pb.gw.go @@ -3551,6 +3551,60 @@ func local_request_Query_ParticipantsWithBalances_0(ctx context.Context, marshal } +func request_Query_PoCValidationSnapshot_0(ctx context.Context, marshaler runtime.Marshaler, client QueryClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoCValidationSnapshotRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["poc_stage_start_height"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "poc_stage_start_height") + } + + protoReq.PocStageStartHeight, err = runtime.Int64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "poc_stage_start_height", err) + } + + msg, err := client.PoCValidationSnapshot(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Query_PoCValidationSnapshot_0(ctx context.Context, marshaler runtime.Marshaler, server QueryServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq QueryPoCValidationSnapshotRequest + var metadata runtime.ServerMetadata + + var ( + val string + ok bool + err error + _ = err + ) + + val, ok = pathParams["poc_stage_start_height"] + if !ok { + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "poc_stage_start_height") + } + + protoReq.PocStageStartHeight, err = runtime.Int64(val) + + if err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "poc_stage_start_height", err) + } + + msg, err := server.PoCValidationSnapshot(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterQueryHandlerServer registers the http handlers for service Query to "mux". // UnaryRPC :call QueryServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -5420,6 +5474,29 @@ func RegisterQueryHandlerServer(ctx context.Context, mux *runtime.ServeMux, serv }) + mux.Handle("GET", pattern_Query_PoCValidationSnapshot_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + var stream runtime.ServerTransportStream + ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := local_request_Query_PoCValidationSnapshot_0(rctx, inboundMarshaler, server, req, pathParams) + md.HeaderMD, md.TrailerMD = metadata.Join(md.HeaderMD, stream.Header()), metadata.Join(md.TrailerMD, stream.Trailer()) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PoCValidationSnapshot_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -7081,6 +7158,26 @@ func RegisterQueryHandlerClient(ctx context.Context, mux *runtime.ServeMux, clie }) + mux.Handle("GET", pattern_Query_PoCValidationSnapshot_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Query_PoCValidationSnapshot_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Query_PoCValidationSnapshot_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -7246,6 +7343,8 @@ var ( pattern_Query_ListRandomSeeds_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"productscience", "inference", "random_seeds", "epoch_index"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Query_ParticipantsWithBalances_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 1, 2, 2}, []string{"productscience", "inference", "participants_with_balances"}, "", runtime.AssumeColonVerbOpt(true))) + + pattern_Query_PoCValidationSnapshot_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"productscience", "inference", "poc_validation_snapshot", "poc_stage_start_height"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -7410,4 +7509,6 @@ var ( forward_Query_ListRandomSeeds_0 = runtime.ForwardResponseMessage forward_Query_ParticipantsWithBalances_0 = runtime.ForwardResponseMessage + + forward_Query_PoCValidationSnapshot_0 = runtime.ForwardResponseMessage ) diff --git a/inference-chain/x/streamvesting/keeper/msg_transfer_with_vesting.go b/inference-chain/x/streamvesting/keeper/msg_transfer_with_vesting.go new file mode 100644 index 000000000..627184a21 --- /dev/null +++ b/inference-chain/x/streamvesting/keeper/msg_transfer_with_vesting.go @@ -0,0 +1,142 @@ +package keeper + +import ( + "context" + "fmt" + + errorsmod "cosmossdk.io/errors" + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + sdkerrors "github.com/cosmos/cosmos-sdk/types/errors" + + "github.com/productscience/inference/x/streamvesting/types" +) + +const ( + // DefaultVestingEpochs is the default number of epochs for vesting (180 epochs) + DefaultVestingEpochs = uint64(180) + + // MaxVestingEpochs is the maximum allowed vesting epochs to prevent DoS + MaxVestingEpochs = uint64(3650) // ~10 years + + // MaxCoinsInAmount is the maximum number of coin denominations in a single transfer + MaxCoinsInAmount = 10 +) + +func (k msgServer) TransferWithVesting(goCtx context.Context, req *types.MsgTransferWithVesting) (*types.MsgTransferWithVestingResponse, error) { + ctx := sdk.UnwrapSDKContext(goCtx) + + // Validate sender address + senderAddr, err := sdk.AccAddressFromBech32(req.Sender) + if err != nil { + return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "invalid sender address: %s", err) + } + + // Validate recipient address + _, err = sdk.AccAddressFromBech32(req.Recipient) + if err != nil { + return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidAddress, "invalid recipient address: %s", err) + } + + // Validate amount + if req.Amount.IsZero() { + return nil, errorsmod.Wrap(sdkerrors.ErrInvalidCoins, "amount cannot be zero") + } + + if !req.Amount.IsValid() { + return nil, errorsmod.Wrap(sdkerrors.ErrInvalidCoins, "invalid coins") + } + + // Validate number of coin denominations to prevent N*M complexity DoS + if len(req.Amount) > MaxCoinsInAmount { + return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidRequest, "too many coin denominations: %d, max allowed: %d", len(req.Amount), MaxCoinsInAmount) + } + + // Validate vesting epochs upper limit to prevent DoS + if req.VestingEpochs > MaxVestingEpochs { + return nil, errorsmod.Wrapf(sdkerrors.ErrInvalidRequest, "vesting epochs %d exceeds maximum allowed: %d", req.VestingEpochs, MaxVestingEpochs) + } + + // Determine vesting epochs - use default if not specified or zero + vestingEpochs := req.VestingEpochs + if vestingEpochs == 0 { + vestingEpochs = DefaultVestingEpochs + } + + // Transfer coins from sender to the streamvesting module + err = k.bookkeepingBankKeeper.SendCoinsFromAccountToModule(ctx, senderAddr, types.ModuleName, req.Amount, "transfer with vesting") + if err != nil { + return nil, errorsmod.Wrapf(err, "failed to transfer coins from sender to module") + } + + // Log sub-account transaction for each coin + for _, coin := range req.Amount { + k.bookkeepingBankKeeper.LogSubAccountTransaction(ctx, types.ModuleName, req.Recipient, HoldingSubAccount, + coin, fmt.Sprintf("transfer with vesting from %s", req.Sender)) + } + + // Get or create vesting schedule for recipient + schedule, found := k.GetVestingSchedule(ctx, req.Recipient) + if !found { + schedule = types.VestingSchedule{ + ParticipantAddress: req.Recipient, + EpochAmounts: []types.EpochCoins{}, + } + } + + // Extend the schedule if necessary + requiredLength := int64(vestingEpochs) + for int64(len(schedule.EpochAmounts)) < requiredLength { + schedule.EpochAmounts = append(schedule.EpochAmounts, types.EpochCoins{ + Coins: sdk.NewCoins(), + }) + } + + // Implement aggregation logic for each coin denomination + for _, coin := range req.Amount { + // Divide amount by epochs + // if amount < vestingEpochs then the whole sum will be transferred during the first epoch + epochsInt := math.NewInt(int64(vestingEpochs)) + amountPerEpoch := coin.Amount.Quo(epochsInt) + remainder := coin.Amount.Mod(epochsInt) + + // Add the base amount to each epoch + for i := int64(0); i < int64(vestingEpochs); i++ { + epochCoin := sdk.NewCoin(coin.Denom, amountPerEpoch) + + // Add remainder to the first epoch + if i == 0 && !remainder.IsZero() { + epochCoin = epochCoin.Add(sdk.NewCoin(coin.Denom, remainder)) + } + + // Add to existing amount in this epoch + schedule.EpochAmounts[i].Coins = schedule.EpochAmounts[i].Coins.Add(epochCoin) + } + } + + // Store the updated schedule + err = k.SetVestingSchedule(ctx, schedule) + if err != nil { + k.Logger().Error("Failed to set vesting schedule for recipient", "recipient", req.Recipient, "error", err) + return nil, errorsmod.Wrapf(err, "failed to set vesting schedule for recipient") + } + + // Emit event + ctx.EventManager().EmitEvent( + sdk.NewEvent( + types.EventTypeTransferWithVesting, + sdk.NewAttribute(types.AttributeKeySender, req.Sender), + sdk.NewAttribute(types.AttributeKeyRecipient, req.Recipient), + sdk.NewAttribute(types.AttributeKeyAmount, req.Amount.String()), + sdk.NewAttribute(types.AttributeKeyVestingEpochs, fmt.Sprintf("%d", vestingEpochs)), + ), + ) + + k.Logger().Info("Transfer with vesting completed", + "sender", req.Sender, + "recipient", req.Recipient, + "amount", req.Amount, + "vesting_epochs", vestingEpochs) + + return &types.MsgTransferWithVestingResponse{}, nil +} diff --git a/inference-chain/x/streamvesting/keeper/msg_transfer_with_vesting_test.go b/inference-chain/x/streamvesting/keeper/msg_transfer_with_vesting_test.go new file mode 100644 index 000000000..91f217408 --- /dev/null +++ b/inference-chain/x/streamvesting/keeper/msg_transfer_with_vesting_test.go @@ -0,0 +1,244 @@ +package keeper_test + +import ( + "fmt" + "testing" + + "cosmossdk.io/math" + sdk "github.com/cosmos/cosmos-sdk/types" + "github.com/stretchr/testify/require" + "go.uber.org/mock/gomock" + + keepertest "github.com/productscience/inference/testutil/keeper" + "github.com/productscience/inference/x/streamvesting/keeper" + "github.com/productscience/inference/x/streamvesting/types" +) + +func TestMsgTransferWithVesting(t *testing.T) { + sender := sdk.AccAddress("sender_address______") + recipient := sdk.AccAddress("recipient_address___") + + t.Run("invalid sender address", func(t *testing.T) { + k, ctx, _ := keepertest.StreamVestingKeeperWithMocks(t) + ms := keeper.NewMsgServerImpl(k) + wctx := sdk.UnwrapSDKContext(ctx) + + _, err := ms.TransferWithVesting(wctx, &types.MsgTransferWithVesting{ + Sender: "invalid", + Recipient: recipient.String(), + Amount: sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(1000))), + VestingEpochs: 180, + }) + require.Error(t, err) + require.Contains(t, err.Error(), "invalid sender address") + }) + + t.Run("invalid recipient address", func(t *testing.T) { + k, ctx, _ := keepertest.StreamVestingKeeperWithMocks(t) + ms := keeper.NewMsgServerImpl(k) + wctx := sdk.UnwrapSDKContext(ctx) + + _, err := ms.TransferWithVesting(wctx, &types.MsgTransferWithVesting{ + Sender: sender.String(), + Recipient: "invalid", + Amount: sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(1000))), + VestingEpochs: 180, + }) + require.Error(t, err) + require.Contains(t, err.Error(), "invalid recipient address") + }) + + t.Run("zero amount", func(t *testing.T) { + k, ctx, _ := keepertest.StreamVestingKeeperWithMocks(t) + ms := keeper.NewMsgServerImpl(k) + wctx := sdk.UnwrapSDKContext(ctx) + + _, err := ms.TransferWithVesting(wctx, &types.MsgTransferWithVesting{ + Sender: sender.String(), + Recipient: recipient.String(), + Amount: sdk.NewCoins(), + VestingEpochs: 180, + }) + require.Error(t, err) + require.Contains(t, err.Error(), "amount cannot be zero") + }) + + t.Run("valid transfer with custom epochs", func(t *testing.T) { + k, ctx, mocks := keepertest.StreamVestingKeeperWithMocks(t) + ms := keeper.NewMsgServerImpl(k) + wctx := sdk.UnwrapSDKContext(ctx) + + amount := sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(1000))) + + // Set up mock expectations + mocks.BankKeeper.EXPECT(). + SendCoinsFromAccountToModule(gomock.Any(), sender, types.ModuleName, amount, "transfer with vesting"). + Return(nil) + mocks.BankKeeper.EXPECT(). + LogSubAccountTransaction(gomock.Any(), types.ModuleName, recipient.String(), keeper.HoldingSubAccount, gomock.Any(), gomock.Any()) + + _, err := ms.TransferWithVesting(wctx, &types.MsgTransferWithVesting{ + Sender: sender.String(), + Recipient: recipient.String(), + Amount: amount, + VestingEpochs: 100, + }) + require.NoError(t, err) + + // Verify vesting schedule was created + schedule, found := k.GetVestingSchedule(wctx, recipient.String()) + require.True(t, found) + require.Equal(t, recipient.String(), schedule.ParticipantAddress) + require.Len(t, schedule.EpochAmounts, 100) + + // Verify actual coin amounts per epoch: 1000/100 = 10 per epoch, no remainder + expectedPerEpoch := sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(10))) + for i := 0; i < 100; i++ { + require.True(t, schedule.EpochAmounts[i].Coins.Equal(expectedPerEpoch), + "epoch %d: expected %s, got %s", i, expectedPerEpoch, schedule.EpochAmounts[i].Coins) + } + }) + + t.Run("valid transfer with default epochs", func(t *testing.T) { + k, ctx, mocks := keepertest.StreamVestingKeeperWithMocks(t) + ms := keeper.NewMsgServerImpl(k) + wctx := sdk.UnwrapSDKContext(ctx) + + amount := sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(1800))) + + // Set up mock expectations + mocks.BankKeeper.EXPECT(). + SendCoinsFromAccountToModule(gomock.Any(), sender, types.ModuleName, amount, "transfer with vesting"). + Return(nil) + mocks.BankKeeper.EXPECT(). + LogSubAccountTransaction(gomock.Any(), types.ModuleName, recipient.String(), keeper.HoldingSubAccount, gomock.Any(), gomock.Any()) + + _, err := ms.TransferWithVesting(wctx, &types.MsgTransferWithVesting{ + Sender: sender.String(), + Recipient: recipient.String(), + Amount: amount, + VestingEpochs: 0, // 0 means default 180 + }) + require.NoError(t, err) + + // Verify vesting schedule was created with default epochs + schedule, found := k.GetVestingSchedule(wctx, recipient.String()) + require.True(t, found) + require.Len(t, schedule.EpochAmounts, int(keeper.DefaultVestingEpochs)) + }) + + t.Run("uneven division with remainder", func(t *testing.T) { + k, ctx, mocks := keepertest.StreamVestingKeeperWithMocks(t) + ms := keeper.NewMsgServerImpl(k) + wctx := sdk.UnwrapSDKContext(ctx) + + // 1003 tokens over 100 epochs: 10 per epoch + 3 remainder in first epoch + amount := sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(1003))) + + mocks.BankKeeper.EXPECT(). + SendCoinsFromAccountToModule(gomock.Any(), sender, types.ModuleName, amount, "transfer with vesting"). + Return(nil) + mocks.BankKeeper.EXPECT(). + LogSubAccountTransaction(gomock.Any(), types.ModuleName, recipient.String(), keeper.HoldingSubAccount, gomock.Any(), gomock.Any()) + + _, err := ms.TransferWithVesting(wctx, &types.MsgTransferWithVesting{ + Sender: sender.String(), + Recipient: recipient.String(), + Amount: amount, + VestingEpochs: 100, + }) + require.NoError(t, err) + + schedule, found := k.GetVestingSchedule(wctx, recipient.String()) + require.True(t, found) + require.Len(t, schedule.EpochAmounts, 100) + + // First epoch gets base amount (10) + remainder (3) = 13 + expectedFirstEpoch := sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(13))) + require.True(t, schedule.EpochAmounts[0].Coins.Equal(expectedFirstEpoch), + "epoch 0: expected %s, got %s", expectedFirstEpoch, schedule.EpochAmounts[0].Coins) + + // Remaining epochs get base amount only (10) + expectedPerEpoch := sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(10))) + for i := 1; i < 100; i++ { + require.True(t, schedule.EpochAmounts[i].Coins.Equal(expectedPerEpoch), + "epoch %d: expected %s, got %s", i, expectedPerEpoch, schedule.EpochAmounts[i].Coins) + } + + // Verify total across all epochs equals original amount + total := math.ZeroInt() + for i := 0; i < 100; i++ { + total = total.Add(schedule.EpochAmounts[i].Coins.AmountOf("stake")) + } + require.Equal(t, math.NewInt(1003), total, "total across epochs should equal original amount") + }) + + t.Run("max vesting epochs", func(t *testing.T) { + k, ctx, mocks := keepertest.StreamVestingKeeperWithMocks(t) + ms := keeper.NewMsgServerImpl(k) + wctx := sdk.UnwrapSDKContext(ctx) + + amount := sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(3650))) + + mocks.BankKeeper.EXPECT(). + SendCoinsFromAccountToModule(gomock.Any(), sender, types.ModuleName, amount, "transfer with vesting"). + Return(nil) + mocks.BankKeeper.EXPECT(). + LogSubAccountTransaction(gomock.Any(), types.ModuleName, recipient.String(), keeper.HoldingSubAccount, gomock.Any(), gomock.Any()) + + _, err := ms.TransferWithVesting(wctx, &types.MsgTransferWithVesting{ + Sender: sender.String(), + Recipient: recipient.String(), + Amount: amount, + VestingEpochs: keeper.MaxVestingEpochs, + }) + require.NoError(t, err) + + schedule, found := k.GetVestingSchedule(wctx, recipient.String()) + require.True(t, found) + require.Len(t, schedule.EpochAmounts, int(keeper.MaxVestingEpochs)) + + // 3650 / 3650 = 1 per epoch, no remainder + expectedPerEpoch := sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(1))) + for i := 0; i < int(keeper.MaxVestingEpochs); i++ { + require.True(t, schedule.EpochAmounts[i].Coins.Equal(expectedPerEpoch), + "epoch %d: expected %s, got %s", i, expectedPerEpoch, schedule.EpochAmounts[i].Coins) + } + }) + + t.Run("exceeds max vesting epochs", func(t *testing.T) { + k, ctx, _ := keepertest.StreamVestingKeeperWithMocks(t) + ms := keeper.NewMsgServerImpl(k) + wctx := sdk.UnwrapSDKContext(ctx) + + _, err := ms.TransferWithVesting(wctx, &types.MsgTransferWithVesting{ + Sender: sender.String(), + Recipient: recipient.String(), + Amount: sdk.NewCoins(sdk.NewCoin("stake", math.NewInt(1000))), + VestingEpochs: keeper.MaxVestingEpochs + 1, + }) + require.Error(t, err) + require.Contains(t, err.Error(), "exceeds maximum allowed") + }) + + t.Run("exceeds max coins", func(t *testing.T) { + k, ctx, _ := keepertest.StreamVestingKeeperWithMocks(t) + ms := keeper.NewMsgServerImpl(k) + wctx := sdk.UnwrapSDKContext(ctx) + + // Create more than MaxCoinsInAmount denominations + coins := sdk.NewCoins() + for i := 0; i <= keeper.MaxCoinsInAmount; i++ { + coins = coins.Add(sdk.NewCoin(fmt.Sprintf("denom%d", i), math.NewInt(100))) + } + + _, err := ms.TransferWithVesting(wctx, &types.MsgTransferWithVesting{ + Sender: sender.String(), + Recipient: recipient.String(), + Amount: coins, + VestingEpochs: 180, + }) + require.Error(t, err) + require.Contains(t, err.Error(), "too many coin denominations") + }) +} diff --git a/inference-chain/x/streamvesting/module/autocli.go b/inference-chain/x/streamvesting/module/autocli.go index f62136fdb..705fa64ec 100644 --- a/inference-chain/x/streamvesting/module/autocli.go +++ b/inference-chain/x/streamvesting/module/autocli.go @@ -44,6 +44,17 @@ func (am AppModule) AutoCLIOptions() *autocliv1.ModuleOptions { RpcMethod: "UpdateParams", Skip: true, // skipped because authority gated }, + { + RpcMethod: "TransferWithVesting", + Use: "transfer-with-vesting [recipient] [amount] [vesting-epochs]", + Short: "Transfer tokens to recipient with a vesting schedule", + Long: "Transfer tokens from your account to recipient with a vesting schedule. Tokens will vest over the specified number of epochs (default: 180).", + PositionalArgs: []*autocliv1.PositionalArgDescriptor{ + {ProtoField: "recipient"}, + {ProtoField: "amount"}, + {ProtoField: "vesting_epochs", Optional: true}, + }, + }, // this line is used by ignite scaffolding # autocli/tx }, }, diff --git a/inference-chain/x/streamvesting/types/codec.go b/inference-chain/x/streamvesting/types/codec.go index ac5526374..aca452e6f 100644 --- a/inference-chain/x/streamvesting/types/codec.go +++ b/inference-chain/x/streamvesting/types/codec.go @@ -12,6 +12,7 @@ func RegisterInterfaces(registry cdctypes.InterfaceRegistry) { registry.RegisterImplementations((*sdk.Msg)(nil), &MsgUpdateParams{}, + &MsgTransferWithVesting{}, ) msgservice.RegisterMsgServiceDesc(registry, &_Msg_serviceDesc) } diff --git a/inference-chain/x/streamvesting/types/events.go b/inference-chain/x/streamvesting/types/events.go index 498a846b3..d022b6fc6 100644 --- a/inference-chain/x/streamvesting/types/events.go +++ b/inference-chain/x/streamvesting/types/events.go @@ -2,8 +2,9 @@ package types // Event types for streamvesting module const ( - EventTypeVestReward = "vest_reward" - EventTypeUnlockTokens = "unlock_tokens" + EventTypeVestReward = "vest_reward" + EventTypeUnlockTokens = "unlock_tokens" + EventTypeTransferWithVesting = "transfer_with_vesting" ) // Event attributes @@ -13,4 +14,6 @@ const ( AttributeKeyVestingEpochs = "vesting_epochs" AttributeKeyUnlockedAmount = "unlocked_amount" AttributeKeyEpoch = "epoch" + AttributeKeySender = "sender" + AttributeKeyRecipient = "recipient" ) diff --git a/inference-chain/x/streamvesting/types/tx.pb.go b/inference-chain/x/streamvesting/types/tx.pb.go index 69f424e89..f7364cf64 100644 --- a/inference-chain/x/streamvesting/types/tx.pb.go +++ b/inference-chain/x/streamvesting/types/tx.pb.go @@ -7,6 +7,8 @@ import ( context "context" fmt "fmt" _ "github.com/cosmos/cosmos-proto" + github_com_cosmos_cosmos_sdk_types "github.com/cosmos/cosmos-sdk/types" + types "github.com/cosmos/cosmos-sdk/types" _ "github.com/cosmos/cosmos-sdk/types/msgservice" _ "github.com/cosmos/cosmos-sdk/types/tx/amino" _ "github.com/cosmos/gogoproto/gogoproto" @@ -126,38 +128,163 @@ func (m *MsgUpdateParamsResponse) XXX_DiscardUnknown() { var xxx_messageInfo_MsgUpdateParamsResponse proto.InternalMessageInfo +// MsgTransferWithVesting is the request type for transferring tokens with vesting. +type MsgTransferWithVesting struct { + // sender is the address of the account sending the tokens. + Sender string `protobuf:"bytes,1,opt,name=sender,proto3" json:"sender,omitempty"` + // recipient is the address of the account receiving the vesting tokens. + Recipient string `protobuf:"bytes,2,opt,name=recipient,proto3" json:"recipient,omitempty"` + // amount is the coins to transfer with vesting. + Amount github_com_cosmos_cosmos_sdk_types.Coins `protobuf:"bytes,3,rep,name=amount,proto3,castrepeated=github.com/cosmos/cosmos-sdk/types.Coins" json:"amount"` + // vesting_epochs is the number of epochs over which the tokens will vest. + // If not specified or 0, defaults to 180 epochs. + VestingEpochs uint64 `protobuf:"varint,4,opt,name=vesting_epochs,json=vestingEpochs,proto3" json:"vesting_epochs,omitempty"` +} + +func (m *MsgTransferWithVesting) Reset() { *m = MsgTransferWithVesting{} } +func (m *MsgTransferWithVesting) String() string { return proto.CompactTextString(m) } +func (*MsgTransferWithVesting) ProtoMessage() {} +func (*MsgTransferWithVesting) Descriptor() ([]byte, []int) { + return fileDescriptor_50f3863e46541da3, []int{2} +} +func (m *MsgTransferWithVesting) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgTransferWithVesting) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgTransferWithVesting.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 *MsgTransferWithVesting) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgTransferWithVesting.Merge(m, src) +} +func (m *MsgTransferWithVesting) XXX_Size() int { + return m.Size() +} +func (m *MsgTransferWithVesting) XXX_DiscardUnknown() { + xxx_messageInfo_MsgTransferWithVesting.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgTransferWithVesting proto.InternalMessageInfo + +func (m *MsgTransferWithVesting) GetSender() string { + if m != nil { + return m.Sender + } + return "" +} + +func (m *MsgTransferWithVesting) GetRecipient() string { + if m != nil { + return m.Recipient + } + return "" +} + +func (m *MsgTransferWithVesting) GetAmount() github_com_cosmos_cosmos_sdk_types.Coins { + if m != nil { + return m.Amount + } + return nil +} + +func (m *MsgTransferWithVesting) GetVestingEpochs() uint64 { + if m != nil { + return m.VestingEpochs + } + return 0 +} + +// MsgTransferWithVestingResponse defines the response for MsgTransferWithVesting. +type MsgTransferWithVestingResponse struct { +} + +func (m *MsgTransferWithVestingResponse) Reset() { *m = MsgTransferWithVestingResponse{} } +func (m *MsgTransferWithVestingResponse) String() string { return proto.CompactTextString(m) } +func (*MsgTransferWithVestingResponse) ProtoMessage() {} +func (*MsgTransferWithVestingResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_50f3863e46541da3, []int{3} +} +func (m *MsgTransferWithVestingResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *MsgTransferWithVestingResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_MsgTransferWithVestingResponse.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 *MsgTransferWithVestingResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_MsgTransferWithVestingResponse.Merge(m, src) +} +func (m *MsgTransferWithVestingResponse) XXX_Size() int { + return m.Size() +} +func (m *MsgTransferWithVestingResponse) XXX_DiscardUnknown() { + xxx_messageInfo_MsgTransferWithVestingResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_MsgTransferWithVestingResponse proto.InternalMessageInfo + func init() { proto.RegisterType((*MsgUpdateParams)(nil), "inference.streamvesting.MsgUpdateParams") proto.RegisterType((*MsgUpdateParamsResponse)(nil), "inference.streamvesting.MsgUpdateParamsResponse") + proto.RegisterType((*MsgTransferWithVesting)(nil), "inference.streamvesting.MsgTransferWithVesting") + proto.RegisterType((*MsgTransferWithVestingResponse)(nil), "inference.streamvesting.MsgTransferWithVestingResponse") } func init() { proto.RegisterFile("inference/streamvesting/tx.proto", fileDescriptor_50f3863e46541da3) } var fileDescriptor_50f3863e46541da3 = []byte{ - // 354 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe2, 0x52, 0xc8, 0xcc, 0x4b, 0x4b, - 0x2d, 0x4a, 0xcd, 0x4b, 0x4e, 0xd5, 0x2f, 0x2e, 0x29, 0x4a, 0x4d, 0xcc, 0x2d, 0x4b, 0x2d, 0x2e, - 0xc9, 0xcc, 0x4b, 0xd7, 0x2f, 0xa9, 0xd0, 0x2b, 0x28, 0xca, 0x2f, 0xc9, 0x17, 0x12, 0x87, 0xab, - 0xd0, 0x43, 0x51, 0x21, 0x25, 0x98, 0x98, 0x9b, 0x99, 0x97, 0xaf, 0x0f, 0x26, 0x21, 0x6a, 0xa5, - 0xc4, 0x93, 0xf3, 0x8b, 0x73, 0xf3, 0x8b, 0xf5, 0x73, 0x8b, 0xd3, 0xf5, 0xcb, 0x0c, 0x41, 0x14, - 0x54, 0x42, 0x12, 0x22, 0x11, 0x0f, 0xe6, 0xe9, 0x43, 0x38, 0x50, 0x29, 0x91, 0xf4, 0xfc, 0xf4, - 0x7c, 0x88, 0x38, 0x88, 0x05, 0x15, 0x55, 0xc1, 0xe5, 0xae, 0x82, 0xc4, 0xa2, 0xc4, 0x5c, 0xa8, - 0x5e, 0xa5, 0xd3, 0x8c, 0x5c, 0xfc, 0xbe, 0xc5, 0xe9, 0xa1, 0x05, 0x29, 0x89, 0x25, 0xa9, 0x01, - 0x60, 0x19, 0x21, 0x33, 0x2e, 0xce, 0xc4, 0xd2, 0x92, 0x8c, 0xfc, 0xa2, 0xcc, 0x92, 0x4a, 0x09, - 0x46, 0x05, 0x46, 0x0d, 0x4e, 0x27, 0x89, 0x4b, 0x5b, 0x74, 0x45, 0xa0, 0x96, 0x3a, 0xa6, 0xa4, - 0x14, 0xa5, 0x16, 0x17, 0x07, 0x97, 0x14, 0x65, 0xe6, 0xa5, 0x07, 0x21, 0x94, 0x0a, 0x39, 0x71, - 0xb1, 0x41, 0xcc, 0x96, 0x60, 0x52, 0x60, 0xd4, 0xe0, 0x36, 0x92, 0xd7, 0xc3, 0xe1, 0x71, 0x3d, - 0x88, 0x45, 0x4e, 0x9c, 0x27, 0xee, 0xc9, 0x33, 0xac, 0x78, 0xbe, 0x41, 0x8b, 0x31, 0x08, 0xaa, - 0xd3, 0xca, 0xa6, 0xe9, 0xf9, 0x06, 0x2d, 0x84, 0x99, 0x5d, 0xcf, 0x37, 0x68, 0x69, 0x22, 0x3c, - 0x52, 0x81, 0xe6, 0x15, 0x34, 0x97, 0x2b, 0x49, 0x72, 0x89, 0xa3, 0x09, 0x05, 0xa5, 0x16, 0x17, - 0xe4, 0xe7, 0x15, 0xa7, 0x1a, 0x55, 0x70, 0x31, 0xfb, 0x16, 0xa7, 0x0b, 0x65, 0x71, 0xf1, 0xa0, - 0xf8, 0x55, 0x03, 0xa7, 0x1b, 0xd1, 0x0c, 0x92, 0x32, 0x20, 0x56, 0x25, 0xcc, 0x4a, 0x29, 0xd6, - 0x06, 0x90, 0xd7, 0x9c, 0x82, 0x4f, 0x3c, 0x92, 0x63, 0xbc, 0xf0, 0x48, 0x8e, 0xf1, 0xc1, 0x23, - 0x39, 0xc6, 0x09, 0x8f, 0xe5, 0x18, 0x2e, 0x3c, 0x96, 0x63, 0xb8, 0xf1, 0x58, 0x8e, 0x21, 0xca, - 0x32, 0x3d, 0xb3, 0x24, 0xa3, 0x34, 0x49, 0x2f, 0x39, 0x3f, 0x57, 0xbf, 0xa0, 0x28, 0x3f, 0xa5, - 0x34, 0xb9, 0xa4, 0x38, 0x39, 0x13, 0xec, 0x53, 0xdc, 0x7e, 0x2e, 0xa9, 0x2c, 0x48, 0x2d, 0x4e, - 0x62, 0x03, 0x47, 0x9f, 0x31, 0x20, 0x00, 0x00, 0xff, 0xff, 0xcb, 0x3b, 0x7a, 0x6b, 0x7e, 0x02, - 0x00, 0x00, + // 549 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x53, 0x4d, 0x8b, 0x13, 0x41, + 0x10, 0xcd, 0x6c, 0xd6, 0x40, 0x7a, 0xfd, 0xc0, 0x71, 0x31, 0x1f, 0x87, 0xc9, 0x10, 0x14, 0xc6, + 0xc0, 0x4e, 0x27, 0x11, 0x15, 0x17, 0x0f, 0x1a, 0xf1, 0x18, 0x90, 0xac, 0x1f, 0xe0, 0x65, 0xe9, + 0xcc, 0xf4, 0xce, 0xb4, 0x32, 0xdd, 0x43, 0x57, 0x27, 0xec, 0x9e, 0x14, 0x8f, 0x9e, 0xfc, 0x19, + 0xe2, 0x29, 0x07, 0x7f, 0xc4, 0x82, 0x97, 0x45, 0x10, 0x3c, 0xa9, 0x24, 0x87, 0xfc, 0x06, 0x6f, + 0x32, 0x33, 0x9d, 0x8d, 0x1b, 0x92, 0xa8, 0x97, 0x74, 0xba, 0xea, 0xd5, 0xeb, 0xaa, 0xf7, 0x6a, + 0x90, 0xcd, 0xf8, 0x01, 0x95, 0x94, 0x7b, 0x14, 0x83, 0x92, 0x94, 0x44, 0x43, 0x0a, 0x8a, 0xf1, + 0x00, 0xab, 0x43, 0x37, 0x96, 0x42, 0x09, 0xb3, 0x74, 0x8a, 0x70, 0xcf, 0x20, 0xaa, 0x97, 0x49, + 0xc4, 0xb8, 0xc0, 0xe9, 0x6f, 0x86, 0xad, 0x96, 0x3c, 0x01, 0x91, 0x00, 0x1c, 0x41, 0x80, 0x87, + 0xad, 0xe4, 0xd0, 0x89, 0x4a, 0x96, 0xd8, 0x4f, 0x6f, 0x38, 0xbb, 0xe8, 0xd4, 0x76, 0x20, 0x02, + 0x91, 0xc5, 0x93, 0x7f, 0x3a, 0x6a, 0x69, 0xa6, 0x3e, 0x01, 0x8a, 0x87, 0xad, 0x3e, 0x55, 0xa4, + 0x85, 0x3d, 0xc1, 0xb8, 0xce, 0x5f, 0x5b, 0xd5, 0x77, 0x4c, 0x24, 0x89, 0x34, 0x77, 0xfd, 0xb3, + 0x81, 0x2e, 0x75, 0x21, 0x78, 0x1a, 0xfb, 0x44, 0xd1, 0xc7, 0x69, 0xc6, 0xbc, 0x8d, 0x8a, 0x64, + 0xa0, 0x42, 0x21, 0x99, 0x3a, 0x2a, 0x1b, 0xb6, 0xe1, 0x14, 0x3b, 0xe5, 0x2f, 0x9f, 0x76, 0xb6, + 0x75, 0x53, 0x0f, 0x7c, 0x5f, 0x52, 0x80, 0x3d, 0x25, 0x19, 0x0f, 0x7a, 0x73, 0xa8, 0xd9, 0x41, + 0x85, 0x8c, 0xbb, 0xbc, 0x61, 0x1b, 0xce, 0x56, 0xbb, 0xe6, 0xae, 0x10, 0xc6, 0xcd, 0x1e, 0xea, + 0x14, 0x8f, 0xbf, 0xd7, 0x72, 0x1f, 0xa6, 0xa3, 0x86, 0xd1, 0xd3, 0x95, 0xbb, 0xf7, 0xde, 0x4e, + 0x47, 0x8d, 0x39, 0xe7, 0xbb, 0xe9, 0xa8, 0x71, 0x63, 0x3e, 0xc8, 0xe1, 0xc2, 0x28, 0x0b, 0x9d, + 0xd7, 0x2b, 0xa8, 0xb4, 0x10, 0xea, 0x51, 0x88, 0x05, 0x07, 0x5a, 0xff, 0xba, 0x81, 0xae, 0x76, + 0x21, 0x78, 0x22, 0x09, 0x87, 0x03, 0x2a, 0x9f, 0x33, 0x15, 0x3e, 0xcb, 0x58, 0xcc, 0x26, 0x2a, + 0x00, 0xe5, 0x3e, 0x95, 0x7f, 0x1d, 0x56, 0xe3, 0x12, 0x85, 0x24, 0xf5, 0x58, 0xcc, 0x28, 0x57, + 0xe9, 0xb0, 0x6b, 0x15, 0x3a, 0x85, 0x9a, 0x21, 0x2a, 0x90, 0x48, 0x0c, 0xb8, 0x2a, 0xe7, 0xed, + 0xbc, 0xb3, 0xd5, 0xae, 0xb8, 0xba, 0x22, 0x31, 0xd1, 0xd5, 0x26, 0xba, 0x0f, 0x05, 0xe3, 0x9d, + 0x5b, 0x89, 0x36, 0x1f, 0x7f, 0xd4, 0x9c, 0x80, 0xa9, 0x70, 0xd0, 0x77, 0x3d, 0x11, 0xe9, 0xad, + 0xd0, 0xc7, 0x0e, 0xf8, 0xaf, 0xb0, 0x3a, 0x8a, 0x29, 0xa4, 0x05, 0xa0, 0x75, 0xcc, 0xf8, 0xcd, + 0xeb, 0xe8, 0xa2, 0x16, 0x69, 0x9f, 0xc6, 0xc2, 0x0b, 0xa1, 0xbc, 0x69, 0x1b, 0xce, 0x66, 0xef, + 0x82, 0x8e, 0x3e, 0x4a, 0x83, 0xbb, 0xf7, 0x13, 0xb9, 0xf5, 0x54, 0x89, 0xd6, 0xcd, 0xb5, 0x5a, + 0x2f, 0x11, 0xaf, 0x6e, 0x23, 0x6b, 0x79, 0x66, 0xa6, 0x7c, 0xfb, 0x97, 0x81, 0xf2, 0x5d, 0x08, + 0xcc, 0x97, 0xe8, 0xfc, 0x99, 0x35, 0x73, 0x56, 0xae, 0xc7, 0x82, 0x87, 0xd5, 0xe6, 0xbf, 0x22, + 0x67, 0x6f, 0x9a, 0xaf, 0xd1, 0x95, 0x65, 0x4e, 0xe3, 0x75, 0x44, 0x4b, 0x0a, 0xaa, 0x77, 0xfe, + 0xb3, 0x60, 0xd6, 0x40, 0xf5, 0xdc, 0x9b, 0xc4, 0x8e, 0xce, 0xde, 0xf1, 0xd8, 0x32, 0x4e, 0xc6, + 0x96, 0xf1, 0x73, 0x6c, 0x19, 0xef, 0x27, 0x56, 0xee, 0x64, 0x62, 0xe5, 0xbe, 0x4d, 0xac, 0xdc, + 0x8b, 0xbb, 0x7f, 0xf8, 0x1a, 0x4b, 0xe1, 0x0f, 0x3c, 0x05, 0x1e, 0x4b, 0x95, 0x5f, 0xed, 0x41, + 0x6a, 0x77, 0xbf, 0x90, 0x7e, 0xba, 0x37, 0x7f, 0x07, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x50, 0xb2, + 0x7b, 0x9a, 0x04, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -175,6 +302,9 @@ type MsgClient interface { // UpdateParams defines a (governance) operation for updating the module // parameters. The authority defaults to the x/gov module account. UpdateParams(ctx context.Context, in *MsgUpdateParams, opts ...grpc.CallOption) (*MsgUpdateParamsResponse, error) + // TransferWithVesting transfers tokens from sender to recipient with a vesting schedule. + // The tokens will vest over the specified number of epochs (default: 180). + TransferWithVesting(ctx context.Context, in *MsgTransferWithVesting, opts ...grpc.CallOption) (*MsgTransferWithVestingResponse, error) } type msgClient struct { @@ -194,11 +324,23 @@ func (c *msgClient) UpdateParams(ctx context.Context, in *MsgUpdateParams, opts return out, nil } +func (c *msgClient) TransferWithVesting(ctx context.Context, in *MsgTransferWithVesting, opts ...grpc.CallOption) (*MsgTransferWithVestingResponse, error) { + out := new(MsgTransferWithVestingResponse) + err := c.cc.Invoke(ctx, "/inference.streamvesting.Msg/TransferWithVesting", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // MsgServer is the server API for Msg service. type MsgServer interface { // UpdateParams defines a (governance) operation for updating the module // parameters. The authority defaults to the x/gov module account. UpdateParams(context.Context, *MsgUpdateParams) (*MsgUpdateParamsResponse, error) + // TransferWithVesting transfers tokens from sender to recipient with a vesting schedule. + // The tokens will vest over the specified number of epochs (default: 180). + TransferWithVesting(context.Context, *MsgTransferWithVesting) (*MsgTransferWithVestingResponse, error) } // UnimplementedMsgServer can be embedded to have forward compatible implementations. @@ -208,6 +350,9 @@ type UnimplementedMsgServer struct { func (*UnimplementedMsgServer) UpdateParams(ctx context.Context, req *MsgUpdateParams) (*MsgUpdateParamsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method UpdateParams not implemented") } +func (*UnimplementedMsgServer) TransferWithVesting(ctx context.Context, req *MsgTransferWithVesting) (*MsgTransferWithVestingResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method TransferWithVesting not implemented") +} func RegisterMsgServer(s grpc1.Server, srv MsgServer) { s.RegisterService(&_Msg_serviceDesc, srv) @@ -231,6 +376,24 @@ func _Msg_UpdateParams_Handler(srv interface{}, ctx context.Context, dec func(in return interceptor(ctx, in, info, handler) } +func _Msg_TransferWithVesting_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(MsgTransferWithVesting) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(MsgServer).TransferWithVesting(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/inference.streamvesting.Msg/TransferWithVesting", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(MsgServer).TransferWithVesting(ctx, req.(*MsgTransferWithVesting)) + } + return interceptor(ctx, in, info, handler) +} + var Msg_serviceDesc = _Msg_serviceDesc var _Msg_serviceDesc = grpc.ServiceDesc{ ServiceName: "inference.streamvesting.Msg", @@ -240,6 +403,10 @@ var _Msg_serviceDesc = grpc.ServiceDesc{ MethodName: "UpdateParams", Handler: _Msg_UpdateParams_Handler, }, + { + MethodName: "TransferWithVesting", + Handler: _Msg_TransferWithVesting_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "inference/streamvesting/tx.proto", @@ -308,6 +475,85 @@ func (m *MsgUpdateParamsResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) return len(dAtA) - i, nil } +func (m *MsgTransferWithVesting) 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 *MsgTransferWithVesting) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgTransferWithVesting) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.VestingEpochs != 0 { + i = encodeVarintTx(dAtA, i, uint64(m.VestingEpochs)) + i-- + dAtA[i] = 0x20 + } + if len(m.Amount) > 0 { + for iNdEx := len(m.Amount) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.Amount[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTx(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a + } + } + if len(m.Recipient) > 0 { + i -= len(m.Recipient) + copy(dAtA[i:], m.Recipient) + i = encodeVarintTx(dAtA, i, uint64(len(m.Recipient))) + i-- + dAtA[i] = 0x12 + } + if len(m.Sender) > 0 { + i -= len(m.Sender) + copy(dAtA[i:], m.Sender) + i = encodeVarintTx(dAtA, i, uint64(len(m.Sender))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *MsgTransferWithVestingResponse) 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 *MsgTransferWithVestingResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MsgTransferWithVestingResponse) 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 @@ -343,6 +589,41 @@ func (m *MsgUpdateParamsResponse) Size() (n int) { return n } +func (m *MsgTransferWithVesting) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.Sender) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + l = len(m.Recipient) + if l > 0 { + n += 1 + l + sovTx(uint64(l)) + } + if len(m.Amount) > 0 { + for _, e := range m.Amount { + l = e.Size() + n += 1 + l + sovTx(uint64(l)) + } + } + if m.VestingEpochs != 0 { + n += 1 + sovTx(uint64(m.VestingEpochs)) + } + return n +} + +func (m *MsgTransferWithVestingResponse) 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 } @@ -514,6 +795,223 @@ func (m *MsgUpdateParamsResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *MsgTransferWithVesting) 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: MsgTransferWithVesting: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgTransferWithVesting: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Sender", 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.Sender = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Recipient", 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.Recipient = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Amount", 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 + } + m.Amount = append(m.Amount, types.Coin{}) + if err := m.Amount[len(m.Amount)-1].Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 4: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field VestingEpochs", wireType) + } + m.VestingEpochs = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTx + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.VestingEpochs |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + 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 *MsgTransferWithVestingResponse) 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: MsgTransferWithVestingResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: MsgTransferWithVestingResponse: 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 diff --git a/local-test-net/stop-rebuild.sh b/local-test-net/stop-rebuild.sh index 7f80ca2b5..c61f576ae 100755 --- a/local-test-net/stop-rebuild.sh +++ b/local-test-net/stop-rebuild.sh @@ -4,5 +4,6 @@ set -e # Don't need to make path relative to ./local-test-net, becayse make is run with root as workdir export GENESIS_OVERRIDES_FILE="inference-chain/test_genesis_overrides.json" +export BLST_PORTABLE=1 export SET_LATEST=1 make -C ../. build-docker diff --git a/mlnode/packages/api/Dockerfile b/mlnode/packages/api/Dockerfile index 2ebb62451..f7ee4edcc 100644 --- a/mlnode/packages/api/Dockerfile +++ b/mlnode/packages/api/Dockerfile @@ -1,6 +1,6 @@ # syntax=docker/dockerfile:1.4 ################################################################################ -FROM ghcr.io/gonka-ai/vllm:v0.9.1-poc-v2-post2-blackwell-sm120 AS base +FROM ghcr.io/gonka-ai/vllm:v0.9.1-poc-v2-post4-blackwell-sm120 AS base RUN --mount=type=cache,target=/var/lib/apt/lists \ --mount=type=cache,target=/root/.cache/pip \ diff --git a/mlnode/packages/pow/Dockerfile b/mlnode/packages/pow/Dockerfile index 75df20d9a..fb9602f8c 100644 --- a/mlnode/packages/pow/Dockerfile +++ b/mlnode/packages/pow/Dockerfile @@ -1,5 +1,5 @@ ################################################################################ -FROM ghcr.io/gonka-ai/vllm:v0.9.1-poc-v2-post2-blackwell-sm120 AS builder +FROM ghcr.io/gonka-ai/vllm:v0.9.1-poc-v2-post4-blackwell-sm120 AS builder ENV POETRY_VERSION=2.0.1 \ PYTHONUNBUFFERED=1 \ @@ -34,7 +34,7 @@ RUN --mount=type=cache,target=/root/.cache/pip \ ################################################################################ ARG USERNAME=pow -FROM ghcr.io/gonka-ai/vllm:v0.9.1-poc-v2-post2-blackwell-sm120 AS app +FROM ghcr.io/gonka-ai/vllm:v0.9.1-poc-v2-post4-blackwell-sm120 AS app ARG USERNAME ENV PYTHONUNBUFFERED=1 \ diff --git a/mlnode/packages/train/Dockerfile b/mlnode/packages/train/Dockerfile index 92c2470d7..5e4950c2a 100644 --- a/mlnode/packages/train/Dockerfile +++ b/mlnode/packages/train/Dockerfile @@ -1,5 +1,5 @@ ################################################################################ -FROM ghcr.io/gonka-ai/vllm:v0.9.1-poc-v2-post2-blackwell-sm120 AS app +FROM ghcr.io/gonka-ai/vllm:v0.9.1-poc-v2-post4-blackwell-sm120 AS app ENV APP_PATH=/app/packages/train diff --git a/proposals/ethereum-bridge-contact/.env.example b/proposals/ethereum-bridge-contact/.env.example new file mode 100644 index 000000000..70064a7d2 --- /dev/null +++ b/proposals/ethereum-bridge-contact/.env.example @@ -0,0 +1,18 @@ +# Private Key for deployment (Required) +PRIVATE_KEY= + +# RPC URLs +# Sepolia Testnet (defaults to public node) +SEPOLIA_RPC_URL= +# Mainnet +MAINNET_RPC_URL= + +# Genesis Node Configuration (Required for Bridge) +GENESIS_HOST= +GENESIS_GROUP_PUBLIC_KEY= + +# Optional: Ledger Configuration +LEDGER_ADDRESS= + +# Optional: Etherscan Verification +ETHERSCAN_API_KEY= diff --git a/proposals/governance-artifacts/update-v0.2.10/README.md b/proposals/governance-artifacts/update-v0.2.10/README.md new file mode 100644 index 000000000..c6c21b0ba --- /dev/null +++ b/proposals/governance-artifacts/update-v0.2.10/README.md @@ -0,0 +1,159 @@ +# Upgrade Proposal: v0.2.10 + +This document outlines the proposed changes for on-chain software upgrade v0.2.10. The `Changes` section details the major modifications, and the `Upgrade Plan` section describes the process for applying these changes. + +## Upgrade Plan + +This PR updates the code for the `api` and `node` services. The PR modifies the container versions in `deploy/join/docker-compose.yml`. + +The binary versions will be updated via an on-chain upgrade proposal. For more information on the upgrade process, refer to [`/docs/upgrades.md`](https://github.com/gonka-ai/gonka/blob/upgrade-v0.2.10/docs/upgrades.md). + +Existing hosts are **not** required to upgrade their `api` and `node` containers. The updated container versions are intended for new hosts who join after the on-chain upgrade is complete. + +To apply the new vLLM model parameters, mlnode must be restarted after the on-chain upgrade. The safest approach is: + +``` +docker restart join-mlnode-1 +``` + +The upgrade of MLNode to more reliable versions `ghcr.io/product-science/mlnode:3.0.12-post4` / `ghcr.io/product-science/mlnode:3.0.12-post4-blackwell` is recommended. + +## Proposed Process + +1. Active hosts review this proposal on GitHub. +2. Once the PR is reviewed by the community, a `v0.2.10` release will be created from this branch, and an on-chain upgrade proposal for this version will be submitted. +3. If the on-chain proposal is approved, this PR will be merged immediately after the upgrade is executed on-chain. + +Creating the release from this branch (instead of `main`) minimizes the time that the `/deploy/join/` directory on the `main` branch contains container versions that do not match the on-chain binary versions, ensuring a smoother onboarding experience for new hosts. + +## Testing + +The on-chain upgrade from version `v0.2.9` to `v0.2.10` has been successfully deployed and verified on the testnet. PoC time-based weight normalization has been validated in the testnet environment. No regression in core functionality or performance has been observed during testing. + +Reviewers are encouraged to request access to testnet environments to validate both node behavior and the on-chain upgrade process, or to replay the upgrade on private testnets. + +## Migration + +The on-chain migration logic is defined in [`upgrades.go`](https://github.com/gonka-ai/gonka/blob/upgrade-v0.2.10/inference-chain/app/upgrades/v0_2_10/upgrades.go). + +Migrations: +- **Validation slots default**: explicitly sets `PocParams.ValidationSlots=0` during migration. This keeps existing O(N^2) validation behavior after upgrade until sampling is enabled by governance parameter update. +- **PoC normalization default**: explicitly sets `PocParams.PocNormalizationEnabled=true` during migration to enable time-based weight normalization. +- **Model parameter update**: Updates `Qwen/Qwen3-235B-A22B-Instruct-2507-FP8` with tool calling args (`--enable-auto-tool-choice`, `--tool-call-parser hermes`) and validation threshold `0.958`. + +## PoC Validation Sampling Optimization + +This upgrade introduces a new PoC validation mechanism that reduces complexity from **O(N^2)** to **O(N x N_SLOTS)** by assigning each participant a fixed sampled set of validators. + +Reference design and analysis: [`proposals/poc/optimize.md`](https://github.com/gonka-ai/gonka/blob/upgrade-v0.2.10/proposals/poc/optimize.md) + +Key points: +- Only assigned validators validate each participant when sampling is enabled. +- Sampling is deterministic on both chain and API sides (based on validation snapshot + `app_hash`). +- Decision threshold is strict supermajority of assigned slots (>66.7%). +- The feature is shipped in this release but **disabled by default** (`ValidationSlots=0`) and can be enabled via a governance proposal that changes the `ValidationSlots` parameter to a non-zero value once rollout conditions are met. + +## PoC Weight Normalization by Real PoC Time + +This upgrade normalizes PoC participant weights by actual PoC elapsed time to reduce block-time drift effects and keep weight outcomes consistent with real execution duration. + +Key points: +- Adds `PocParams.PocNormalizationEnabled` parameter for time-based normalization control. +- Captures generation start and exchange end timestamps in `PoCValidationSnapshot`. +- Applies a normalization factor derived from expected stage duration vs actual elapsed time. +- Applies to both regular PoC and confirmation PoC weight calculations. +- Enabled by default in this upgrade (`PocNormalizationEnabled=true`). + +## Upgrade Grace Period + +To ensure a smooth upgrade transition: +- Confirmation PoC will not be triggered for the first 3000 blocks (~5 hours) after upgrade. +- Miss/invalid punishment rates are relaxed for the entire grace epoch (binom_test_p0 set to 0.5). +- Regular PoC operates normally during the grace period. + +## Changes + +### [PR #710](https://github.com/gonka-ai/gonka/pull/710) PoC Validation Sampling Optimization +* Reduces validation complexity from quadratic to slot-based sampling. +* Adds deterministic slot assignment shared by chain and API, with snapshot-backed weight synchronization. +* Keeps backward-compatible fallback path when `ValidationSlots=0` and includes upgrade-time default of `ValidationSlots=0` for safe rollout. + +### [PR #725](https://github.com/gonka-ai/gonka/pull/725) PoC weight normalization on real PoC time +* Adds time-based PoC weight normalization to reduce sensitivity to block-time variance. +* Introduces `PocNormalizationEnabled` in PoC params and uses validation snapshot timestamps to compute normalization factor. +* Integrates normalization into both regular PoC and confirmation PoC weight calculations. +* Upgrade handler enables normalization by default for `v0.2.10`. + +### [PR #767](https://github.com/gonka-ai/gonka/pull/767) Upgrade grace period, tool calling, and PoC timing fix +* Adds grace epoch protection for the upgrade epoch: extended CPoC window (3000 blocks) and relaxed miss/invalid thresholds. +* Updates Qwen model with tool calling support (`--enable-auto-tool-choice`, `--tool-call-parser hermes`). +* Adjusts validation threshold from 0.970917 to 0.958. +* Deprecates `poc_exchange_duration` parameter (set to 0 in upgrade). API artifact acceptance now aligns with chain exchange windows using explicit block height checks instead of relying on phase alone. Fixes a gap where chain accepted nonces longer than API. + +### [PR #708](https://github.com/gonka-ai/gonka/pull/708) IBC Upgrade to v8.7.0 +* Upgrades IBC stack to v8.7.0. +* Aligns chain interoperability components with current IBC release line. + +### [PR #723](https://github.com/gonka-ai/gonka/pull/723) Testnet bridge setup scripts +* Adds bridge setup scripts for testnet operations. +* Improves reproducibility of bridge deployment and validation workflows. + +### [PR #666](https://github.com/gonka-ai/gonka/pull/666) Artifact storage throughput optimization +* Improves PoC artifact storage throughput. + +### [PR #688](https://github.com/gonka-ai/gonka/pull/688) Punishment statistics from on-chain data +* Uses on-chain data for punishment statistics with dynamic table selection. + +### [PR #697](https://github.com/gonka-ai/gonka/pull/697) Portable BLST build for macOS test builds +* Uses a portable BLST build path for macOS test binaries. +* Improves reliability of local/test build pipeline on macOS hosts. + +### [PR #712](https://github.com/gonka-ai/gonka/pull/712) Require proto-go generation matches committed code +* Enforces proto-go generation consistency in development flow. +* Prevents accidental drift between generated and committed protobuf code. + +### [PR #711](https://github.com/gonka-ai/gonka/pull/711) PoC test params from chain state +* Replaces hardcoded PoC test defaults with chain state parameters. + +### [PR #641](https://github.com/gonka-ai/gonka/pull/641) Streamvesting transfer with vesting +* Adds `MsgTransferWithVesting` RPC and message type in the `streamvesting` module. Enables sender-to-recipient token transfers with vesting over N epochs (default: 180 epochs when not specified). +* Adds safety limits to prevent abusive requests: max `3650` vesting epochs and max `10` coin denoms per transfer. + +### API hardening and reliability fixes +* [PR #634](https://github.com/gonka-ai/gonka/pull/634): add request body size limits to reduce DoS risk. +* [PR #727](https://github.com/gonka-ai/gonka/pull/727): follow-up for #634, pass response writer to `http.MaxBytesReader` and align tests. +* [PR #638](https://github.com/gonka-ai/gonka/pull/638): fix unsafe type assertions in request processing. +* [PR #644](https://github.com/gonka-ai/gonka/pull/644): avoid rewriting static config on each startup. +* [PR #661](https://github.com/gonka-ai/gonka/pull/661): prevent API crash on short network drops. +* [PR #640](https://github.com/gonka-ai/gonka/pull/640): add unit tests for node version endpoint behavior. +* [PR #622](https://github.com/gonka-ai/gonka/pull/622): propagate refund errors in `InvalidateInference`. +* [PR #639](https://github.com/gonka-ai/gonka/pull/639): add missing return after error in task claiming path. +* [PR #643](https://github.com/gonka-ai/gonka/pull/643): sanitize nil participants in executor selection. +* [PR #545](https://github.com/gonka-ai/gonka/pull/545): minor bug fixes in API flow. + +### Other fixes +* [PR #659](https://github.com/gonka-ai/gonka/pull/659): model assignment checks previous-epoch rewards. +* [PR #716](https://github.com/gonka-ai/gonka/pull/716): rename PoC weight function for clarity and correctness. + +## Proposed Bounties + +| PR/Issue | Sum GNK | Bounty Explanation | +|-----------|---------|---------------------| +| PR #661 | 500 | Valid fix for minor vulnerability that was previously reported in issue #422 | +| PR #644 | 700 | Planned task, not a vulnerability, important for the network. | +| PR #659 | 10,000 | Detailed report and fix for a Medium risk vulnerability. | +| Report | 5,000 | First report of the vulnerability fixed in #659 | +| PR #545 | 1,000 | Report and fix of low risk vulnerability. Extra appreciation for discovering and reporting it during the review of another PR. | +| PR #640 | 100 | Valid minor bug fix. | +| Issue #422 | 500 | First report and suggested fix. Fixed in PR #661 | +| PR #638 | 100 | Valid minor bug fix. | +| PR #634 | 100 | Valid minor bug fix. | +| Report | 5,000 | Independent report on the issue addressed by PR #710. | +| PR #643 | 500 | Report and fix of low risk vulnerability. | +| PR #641 | 1,500 | Valid implementation of a planned task. | +| PR #622 | 700 | Valid minor vulnerability report and fix. | +| PR #688 | 1,500 | Valid implementation of a planned task with adjusting scope, important for the network. | + +* Review of previous upgrades with meaningful feedback - 2,500 GNK each : + * v.0.2.9: [blizko](https://github.com/blizko) & [x0152](https://github.com/x0152) + * v.0.2.8: [blizko](https://github.com/blizko), [x0152](https://github.com/x0152), [ouicate](https://github.com/ouicate), [jacky6block](https://github.com/jacky6block) & [akup](https://github.com/akup) diff --git a/proposals/poc/optimize.md b/proposals/poc/optimize.md new file mode 100644 index 000000000..4c7364be3 --- /dev/null +++ b/proposals/poc/optimize.md @@ -0,0 +1,339 @@ +# PoC Validation Sampling Optimization + +## Overview + +**Status**: Implemented + +This optimization reduces PoC validation complexity from O(N^2) to O(N × N_SLOTS) by assigning each participant a fixed set of validators through weighted random sampling. Only assigned validators validate each participant, and only their votes count for consensus. + +**Key Files**: +- Algorithm: `inference-chain/x/inference/calculations/slots.go` +- Chain validation: `inference-chain/x/inference/module/chainvalidation.go` +- DAPI filtering: `decentralized-api/poc/validator.go` +- Snapshot storage: `inference-chain/x/inference/keeper/poc_validation_snapshot.go` +- Proto definitions: `inference-chain/proto/inference/inference/poc_validation_snapshot.proto` +- Parameter: `PocParams.ValidationSlots` in `inference-chain/proto/inference/inference/params.proto` + +## Problem + +Current PoC validation has O(N^2) complexity where N is the number of active participants: + +- Each validator validates ALL participants with commits (`validator.go:ValidateAll` iterates `AllPoCV2StoreCommitsForStage`) +- Chain checks votes from ALL validators for each participant (`chainvalidation.go:pocValidated` iterates `CurrentValidatorWeights`) +- Total validations per epoch: N validators × N participants = N^2 + +This is not scalable. With 100 participants, 10,000 validations occur per epoch. With 1,000 participants, 1,000,000 validations. + +## Solution + +Reduce complexity to O(N × N_SLOTS) by assigning each participant a fixed set of N_SLOTS validators through weighted random sampling. Only these assigned validators validate the participant, and only their votes count for consensus. + +### Core Mechanism + +1. Each participant gets `N_SLOTS` validation slots. For each slot, a validator is sampled based on `CurrentValidatorWeights`. The same validator can appear in multiple slots. +2. Sampling uses `app_hash` (captured at validation phase start) as randomness source, so both DAPI and chain produce identical assignments: + ``` + sortedEntries, totalWeight := PrepareSortedEntries(weights) + assignedValidators := GetSlotsFromSorted(appHash, P.address, sortedEntries, totalWeight, N_SLOTS) + ``` +3. Participant passes if >66.7% of assigned slots vote valid (strictly greater than `N_SLOTS * 2 / 3`). + +### Weight Synchronization + +`CurrentValidatorWeights` must be identical in DAPI and chain at validation time. This is achieved via on-chain `PoCValidationSnapshot` captured at validation phase start (see Appendix: Implementation Details). + +### Decision Logic + +When slots are enabled, each slot counts as 1 vote. The same validator can appear in multiple slots — this is how weight is encoded (higher-weight validators get more slots proportionally). `TotalWeight = len(assignedValidators)`, not the number of unique validators. When `ValidationSlots == 0`, falls back to O(N^2) weight-based counting. + +```go +func (wc *WeightCalculator) pocValidated(vals []types.PoCValidationV2, participantAddress string) bool { + assignedValidators := wc.getAssignedValidators(participantAddress) + outcome := wc.calculateAssignedOutcome(vals, assignedValidators) + + // 66.7% threshold: need >2/3 of assigned slots to vote valid + // TotalWeight = len(assignedValidators) when slots enabled + twoThirdsWeight := outcome.TotalWeight * 2 / 3 + + if outcome.ValidWeight > twoThirdsWeight { + return true // >66.7% voted valid + } + if outcome.InvalidWeight > twoThirdsWeight { + return false // >66.7% voted invalid + } + + // No supermajority — fall back to guardian protection + return wc.guardianProtection(vals, participantAddress, outcome) +} +``` + +## Security Analysis + +### Security Model + +**Previous model (O(N^2))**: Required >50% of **ALL validator weight** to vote "valid". An attacker needed >50% of total network weight to corrupt any participant's validation. + +**Current model (sampled)**: Requires >66.7% of **assigned validators' slots** to vote "valid". This threshold is implemented as `validWeight > totalSlots * 2 / 3` (strictly greater than 2/3). Sampling means each participant has a small independent probability of getting an unfavorable slot assignment, but this probability is dramatically low for attackers <45% (see tables below). + +### Binomial Attack Model + +With sampling, an attacker controlling fraction `f` of total weight could be over-represented in a specific participant's assigned validators by chance. This follows a binomial distribution. + +**Computation Method**: + +Attack probability is calculated using the binomial probability mass function: + +``` +P(X = k) = C(n, k) * p^k * (1-p)^(n-k) +``` + +where: +- `n = N_SLOTS` (number of validation slots) +- `k =` number of malicious slots +- `p = f` (attacker weight fraction, probability each slot selects attacker validator) +- `C(n, k) = n! / (k! * (n-k)!)` is the binomial coefficient + +Attack succeeds when `k > n * 2 / 3`, so: + +``` +P(attack) = sum_{k=floor(n*2/3)+1}^{n} P(X = k) +``` + +To avoid numerical overflow with large factorials, computation uses logarithms: + +``` +log P(X = k) = log C(n, k) + k*log(p) + (n-k)*log(1-p) +log C(n, k) = sum_{i=0}^{k-1} [log(n-i) - log(i+1)] +``` + +### Attack Probability Tables (2/3 Threshold) + +Per-participant attack probability: + +| Attacker Weight (f) | P(>66.7% slots) N=64 | P(>66.7% slots) N=128 | P(>66.7% slots) N=256 | +|---------------------|----------------------|----------------------|----------------------| +| 30% | 9.43×10^-10 | < 10^-10 | < 10^-10 | +| 35% | 1.61×10^-7 | < 10^-10 | < 10^-10 | +| 40% | 0.001010% | 4.78×10^-10 | < 10^-10 | +| 45% | 0.028457% | 3.45×10^-7 | < 10^-10 | +| 49% | 0.251443% | 0.002453% | 6.77×10^-7 | + +*Values computed using exact binomial distribution. See Appendix: Simulation.* + +**Comparison: 50% vs 66.7% Threshold**: + +| Attacker Weight (f) | P(>50% slots) N=128 | P(>66.7% slots) N=128 | +|---------------------|-------------------|-----------------------| +| 30% | 7.07×10^-7 | < 10^-10 | +| 35% | 0.018% | < 10^-10 | +| 40% | 0.868% | 4.78×10^-10 | +| 45% | 11.03% | 3.45×10^-7 | +| 49% | 37.64% | 0.0025% | + +### Fake Participant Attack + +**Attack Model**: An attacker with `f%` of validator weight attempts to gain network weight by submitting fake participants that claim compute they don't have. + +**Attack Process**: +1. Attacker has `f%` of validator weight (e.g., 49%) +2. Attacker creates K fake participants, each claiming weight W +3. Each fake participant gets independent slot assignment via `GetSlotsFromSorted()` +4. Attacker's validators vote YES for fakes; honest validators vote NO (detect fraud) +5. A fake passes if attacker controls >66.7% of its assigned slots +6. If ANY fake passes, attacker gains claimed weight, potentially dominating next epoch + +**Probability Model**: + +For a single fake participant, the probability it passes is: +``` +P_single = P(attacker gets >66.7% of N_SLOTS) +``` + +This follows the binomial distribution (see Binomial Attack Model above). + +For K fake participants, the probability at least one passes is: +``` +P(at least 1 passes) = 1 - (1 - P_single)^K +``` + +**Single Fake Success Probability** (P_single): + +| Attacker Weight (f) | N=64, 66.7% | N=128, 66.7% | +|---------------------|-------------|--------------| +| 40% | 0.001010% | 4.78×10^-10 | +| 45% | 0.028457% | 3.45×10^-7 | +| 49% | 0.251443% | 0.002453% | + +**Expected Attempts for First Success** (1 / P_single): + +| Attacker Weight (f) | N=64 | N=128 | +|---------------------|------|-------| +| 40% | ~99,000 | ~2.1 billion | +| 49% | ~398 | ~40,770 | + +**Probability At Least One of K Fakes Passes**: + +| K | N=64, f=40% | N=64, f=49% | N=128, f=40% | N=128, f=49% | +|---|------------|-------------|--------------|--------------| +| 10 | 0.0101% | 2.49% | <0.0001% | 0.0245% | +| 100 | 0.10% | 22.26% | <0.0001% | 0.25% | +| 1,000 | 1.00% | 91.93% | <0.0001% | 2.42% | +| 10,000 | 9.60% | ~100% | 0.0005% | 21.75% | + +**Attack Feasibility**: + +Security depends on what constrains K (attempts per epoch): + +- Without collateral: K is limited only by gas fees and epoch duration. Sampling alone is not sufficient protection. +- With collateral proportional to claimed weight W: each attempt costs `cost(W)`, so total budget needed is K × cost(W). For N=128 at f=49%, that's ~40,770 × cost(W). + +=> **Collateral proportional to claimed weight (or equivalent mechanism) is a hard requirement for this security model to hold.** + +### Abstention Attack + +Suppose attacker's validators don't vote. Since `TotalWeight` includes all assigned slots, abstentions count against the participant. Honest validators must reach >66.7% threshold alone — with N=128, that means >85 out of 128 slots. + +P(honest cannot reach 2/3), N=128: + +| Attacker Weight (f) | P(blocked) | +|---------------------|------------| +| 30% | 21.3% | +| 33.3% | 50.8% | +| 40% | 94.3% | +| 49% | 99.98% | + +Mitigation: when 66.7% threshold is not met, decision falls back to guardian protection. + +#### Future enhancements: +- Exclude non-voting validators from threshold calculation +- Expand to additional slots if 66.7% not reached +- Fall back to O(N^2) with >50% majority + +### Slot Assignment Unpredictability + +The attacker cannot predict which validators will be assigned to validate their slots, or which participants they'll be assigned to vote on. The `app_hash` used for sampling is captured at VALIDATION phase start — after participants have already committed during GENERATION phase. + +### Summary + +From the analysis above: + +1. **N_SLOTS = 128** for production. Balances security (f=49% needs ~40,770 attempts) with performance (98.72% reduction vs O(N^2)). +2. **2/3 consensus threshold** (>66.7% of slots). Reduces attack probability by orders of magnitude vs 50%. +3. **Collateral proportional to claimed weight** is a hard requirement. Without it, sampling alone does not prevent fake participant attacks. +4. **Guardian protection** as fallback when 2/3 threshold is not met (covers abstention attacks at f > 1/3). Slot expansion + O(N^2) fallback must be implemented before disabling guardians. + +## Parameters and Configuration + +| Parameter | Location | Default | Notes | +|-----------|----------|---------|-------| +| `ValidationSlots` | `PocParams` in params.proto | 0 (disabled) | Must be set to 128 via governance to enable sampling | +| Consensus threshold | hardcoded | >66.7% weight | Falls back to guardian if threshold not met | +| Hash source | `PoCValidationSnapshot.AppHash` | - | Captured at validation phase start | + +**Configuration**: Set `PocParams.ValidationSlots` via governance. Value of 0 disables sampling (O(N^2) fallback). + +### Determinism + +DAPI and chain produce identical slot assignments because both use the same shared code (`calculations.GetSlotsFromSorted`), the same sort order (alphabetical by address), and the same `PoCValidationSnapshot` for weights and `app_hash`. + +## Future Work + +### Slot Expansion Fallback + +Not implemented. `GetSlotFromSorted()` exists in `calculations/slots.go` for this purpose. + +Idea: when initial N_SLOTS doesn't reach 2/3 consensus, expand one slot at a time using the same deterministic sampling (see `validate_host()` in `optimize.py` for prototype). Currently, no-consensus triggers guardian protection or rejection. + +## Appendix: Implementation Details + +### Weight Synchronization Snapshot + +When validation phase begins (`poc_validation_start` or confirmation PoC `GENERATION->VALIDATION`), the chain captures a `PoCValidationSnapshot` containing: +- `app_hash`: The deterministic randomness source from the block header +- `validator_weights`: Current validator weights as `repeated ValidatorWeight` (sorted by address) +- `poc_stage_start_height`: Key for lookup (regular PoC) or `trigger_height` (confirmation PoC) + +**Proto Definition** (`poc_validation_snapshot.proto`): +```protobuf +message PoCValidationSnapshot { + int64 poc_stage_start_height = 1; + int64 snapshot_height = 2; + string app_hash = 3; + repeated ValidatorWeight validator_weights = 4; +} + +message ValidatorWeight { + string address = 1; + int64 weight = 2; +} +``` + +**Query Flow**: +- DAPI queries `PoCValidationSnapshot` RPC to get weights and app_hash +- Chain retrieves snapshot from keeper when computing weights +- Both use identical `GetSlotsFromSorted()` algorithm with same inputs + +### Slot Algorithm (`inference-chain/x/inference/calculations/slots.go`) + +Functions: +- `PrepareSortedEntries(weights)` — Filters and sorts weights alphabetically by address +- `GetSlotsFromSorted(appHash, participantAddress, sortedEntries, totalWeight, nSlots)` — Returns all assigned validators +- `GetSlotFromSorted(appHash, participantAddress, sortedEntries, totalWeight, slotIdx)` — Returns single slot (for future fallback expansion) + +Random value generation per slot: +```go +func slotRandomVal(appHash, participantAddress string, slotIdx int, totalWeight int64) int64 { + seedData := fmt.Sprintf("%s%s%d", appHash, participantAddress, slotIdx) + hash := sha256.Sum256([]byte(seedData)) + return int64(binary.BigEndian.Uint64(hash[:8]) % uint64(totalWeight)) +} +``` + +### DAPI Filtering (`decentralized-api/poc/validator.go`) + +DAPI filters participants to only validate those where the validator is assigned: + +```go +// Query validation snapshot for sampling (if enabled) +validationSlots := int(pocParams.ValidationSlots) +var sortedValidatorEntries []calculations.WeightEntry +var validatorTotalWeight int64 +if validationSlots > 0 { + snapshotResp, err := queryClient.PoCValidationSnapshot(...) + if err == nil && snapshotResp.Found { + snapshotWeights := validatorWeightsSliceToMap(snapshotResp.Snapshot.ValidatorWeights) + sortedValidatorEntries, validatorTotalWeight = calculations.PrepareSortedEntries(snapshotWeights) + } +} + +// Filter to participants where we're assigned +for _, commit := range commitsResp.Commits { + if validationSlots > 0 && sortedValidatorEntries != nil { + assignedValidators := calculations.GetSlotsFromSorted( + snapshotAppHash, commit.ParticipantAddress, + sortedValidatorEntries, validatorTotalWeight, validationSlots) + if !slices.Contains(assignedValidators, v.validatorAddress) { + continue // Skip - not our assignment + } + } + workItems = append(workItems, participantWork{...}) +} +``` + +**Tests**: `inference-chain/x/inference/calculations/slots_test.go` + +## Appendix: Simulation + +All values in this document can be reproduced using `proposals/poc/simulate.py`. + +```bash +# Reproduce all tables +python3 proposals/poc/simulate.py + +# Single query +python3 -c " +from proposals.poc.simulate import attack_prob, fake_participant_prob +print(attack_prob(128, 0.49, 2/3)) # P(attack) for N=128, f=49% +print(fake_participant_prob(128, 0.49, 10000)) # P(1 of 10000 fakes passes) +" +``` diff --git a/proposals/poc/optimize.py b/proposals/poc/optimize.py new file mode 100644 index 000000000..f5c7f1568 --- /dev/null +++ b/proposals/poc/optimize.py @@ -0,0 +1,161 @@ +from typing import List, Tuple +from hashlib import sha256 + + +N_SLOTS = 64 + + +def get_weights() -> List[Tuple[str, int]]: + return [ + ("node1", 100), + ("node2", 200), + ("node3", 300), + ] + + +def _slot_random_val( + app_hash: str, + host_address: str, + slot_idx: int, + total_weight: int, +) -> int: + """Generate deterministic random value for a slot index.""" + seed_data = f"{app_hash}{host_address}{slot_idx}".encode() + hash_bytes = sha256(seed_data).digest() + return int.from_bytes(hash_bytes[:8], "big") % total_weight + + +def _find_slot_address( + random_val: int, + all_weights: List[Tuple[str, int]], +) -> str: + """Find which address a random value maps to (linear search).""" + cumulative = 0 + for address, weight in all_weights: + cumulative += weight + if random_val < cumulative: + return address + return all_weights[-1][0] # fallback to last + + +def get_slot( + app_hash: str, + host_address: str, + all_weights: List[Tuple[str, int]], + slot_idx: int, +) -> str: + """ + Get a single slot by index. O(n_weights). + Use this for incremental slot fetching. + """ + total_weight = sum(w for _, w in all_weights) + if total_weight == 0: + return None + random_val = _slot_random_val(app_hash, host_address, slot_idx, total_weight) + return _find_slot_address(random_val, all_weights) + + +def get_slots( + app_hash: str, + host_address: str, + all_weights: List[Tuple[str, int]], + n_slots: int, + start_idx: int = 0, +) -> List[str]: + """ + Sample n_slots nodes based on weight distribution. + + Weight ranges: + [0, 99] => node1 (weight 100) + [100, 299] => node2 (weight 200) + [300, 599] => node3 (weight 300) + + Args: + start_idx: Starting slot index (default 0) + n_slots: Number of slots to return + + Returns slots for indices [start_idx, start_idx + n_slots) + + Complexity: O(n_slots log n_slots + n_weights) + """ + total_weight = sum(w for _, w in all_weights) + if total_weight == 0: + return [] + + randoms = [] + for i in range(n_slots): + slot_idx = start_idx + i + random_val = _slot_random_val(app_hash, host_address, slot_idx, total_weight) + randoms.append((random_val, i)) + + randoms.sort() + result = [None] * n_slots + cumulative = 0 + rand_idx = 0 + + for address, weight in all_weights: + cumulative += weight + while rand_idx < len(randoms) and randoms[rand_idx][0] < cumulative: + _, orig_idx = randoms[rand_idx] + result[orig_idx] = address + rand_idx += 1 + + return result + +def get_vote_from( + host: str, +) -> bool|None: + # just example for demo, not relevant to real vote + return True + + +def validate_host( + app_hash: str, + host: str, +) -> bool: + prev_weights = get_weights() + slots = get_slots(app_hash, host, prev_weights, N_SLOTS) + validator_votes = {} + for slot in slots: + if slot not in validator_votes: + validator_votes[slot] = get_vote_from(slot) + + voted_yes = 0 + voted_no = 0 + for validator in slots: + if validator_votes[validator]: + voted_yes += 1 + else: + voted_no += 1 + if voted_yes > N_SLOTS / 2: + return True + elif voted_no > N_SLOTS / 2: + return False + + # Fallback: fetch one slot at a time until consensus + slot_idx = N_SLOTS + total_weight = sum(w for _, w in prev_weights) + while slot_idx < total_weight: + next_slot = get_slot(app_hash, host, prev_weights, slot_idx) + if next_slot not in validator_votes: + validator_votes[next_slot] = get_vote_from(next_slot) + if validator_votes[next_slot]: + voted_yes += 1 + else: + voted_no += 1 + slot_idx += 1 + + if voted_yes > slot_idx / 2: + return True + elif voted_no > slot_idx / 2: + return False + + return None # no consensus reached + +if __name__ == "__main__": + app_hash = "1234567890" + host_address = "gonka100" + n_slots = 64 + all_weights = get_weights() + slots = get_slots(app_hash, host_address, all_weights, n_slots) + print(slots) \ No newline at end of file diff --git a/test-net-cloud/nebius/bridge/BRIDGE_TESTNET_GUIDE.md b/test-net-cloud/nebius/bridge/BRIDGE_TESTNET_GUIDE.md new file mode 100644 index 000000000..a9818963f --- /dev/null +++ b/test-net-cloud/nebius/bridge/BRIDGE_TESTNET_GUIDE.md @@ -0,0 +1,149 @@ +# Bridge Testnet Setup Guide (Sepolia) + +This guide covers the steps to deploy the bridge contract on Sepolia, register it on Gonka, register the USDC Sepolia implementation, and instantiate the Liquidity Pool. + +## 1. Register (Deploy) Bridge Contract on Sepolia + +To "register" the bridge contract on Sepolia (the Ethereum testnet), you must deploy the solidity contract. + +**Prerequisites:** +- Node.js & npm/yarn +- Sepolia RPC Endpoint (e.g., Alchemy, Infura) +- Private Key with Sepolia ETH (use faucet to get some) +- BLS Group Public Key (from genesis validators) + +**Steps:** +1. **Deploy Bridge to Sepolia**: + Run the automated setup and deployment script with your private key: + ```bash + ./bridge-setup.sh <0xYOUR_PRIVATE_KEY> + ``` + + *This script will:* + * Fetch the Genesis Group Key from the testnet + * Configure your `.env` file + * Run the deployment command automatically + * **Cleanup**: Removes `.env` (private key) after successful deployment + + **Output:** The script will print the **Bridge Contract Address** prominently. Note it down! + *(Note: Verification is a separate step. You can run `npx hardhat verify --network sepolia
` if needed)* + +--- + +## 2. Register Bridge on Gonka + +Run the registration script directly on the remote node via SSH. This creates a governance proposal for the bridge and USDC metadata. + +1. **Run the Bridge Registration Script**: + ```bash + # Usage: ssh user@host "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register.sh --address [--password ] + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register.sh --address 0x190386DAa9205E8Aa494e31d59F9230893Cc60C9 + ``` + + *If a proposal was already created but the vote failed or timed out, you can resume with the proposal ID:* + ```bash + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register.sh --proposal 1 + ``` + + **Verification:** You should see "Vote submitted successfully!" in the output. + +--- + +## 3. Register Wrapped Token Contract + +This step registers the code ID of the `wrapped_token.wasm` contract. This code ID is used by the system whenever a new wrapped token is instantiated. + +1. **Run the Wrapped Token Registration Script**: + You can either upload a new WASM contract or use an existing `code_id`: + + *Option A: Use WASM from Host Repository (Recommended)* + ```bash + # Usage: ssh user@host "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-wrapped.sh --use-repo + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-wrapped.sh --use-repo + ``` + + *Option B: Upload Local WASM and Register* + If you have a local WASM file (e.g. in `proposals/`), upload it first, then register: + ```bash + # 1. Upload + ssh ubuntu@89.169.110.250 "cat > /tmp/wrapped_token.wasm" < inference-chain/contracts/wrapped-token/artifacts/wrapped_token.wasm + # 2. Register + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-wrapped.sh --wasm /tmp/wrapped_token.wasm + ``` + + *Option C: Register using existing Code ID* + ```bash + # Usage: ssh user@host "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-wrapped.sh --code-id + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-wrapped.sh --code-id 1 + ``` + + *If a proposal was already created (Resume/Vote Only):* + ```bash + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-wrapped.sh --proposal 2 + ``` + +--- + +## 4. Register Liquidity Pool + +This step instantiates the Liquidity Pool contract (WASM) and registers it within the Gonka system. + +1. **Run the Pool Registration Script**: + You can either upload a new WASM contract or use an existing `code_id`: + + *Option A: Use WASM from Host Repository (Recommended)* + ```bash + # Usage: ssh user@host "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-pool.sh --use-repo + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-pool.sh --use-repo + ``` + + *Option B: Upload Local WASM and Register* + ```bash + # 1. Upload + ssh ubuntu@89.169.110.250 "cat > /tmp/liquidity_pool.wasm" < inference-chain/contracts/liquidity-pool/artifacts/liquidity_pool.wasm + # 2. Register + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-pool.sh --wasm /tmp/liquidity_pool.wasm + ``` + + *Option C: Register using existing Code ID* + ```bash + # Usage: ssh user@host "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-pool.sh --code-id + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-pool.sh --code-id 1 + ``` + + *If a proposal was already created (Resume/Vote Only):* + ```bash + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-register-pool.sh --proposal 4 + ``` + + **Verification:** Look for "Vote submitted successfully!" in the output. + +--- + +## 5. Fund Liquidity Pool (Community Pool Spend) + +After the Liquidity Pool is registered, it needs to be funded with the 120M GNK from the Community Pool. + +1. **Run the Funding Script**: + ```bash + # Usage: ssh user@host "bash -s" -- < test-net-cloud/nebius/bridge/bridge-fund-pool.sh [--amount ] + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-fund-pool.sh --amount 120000000000000000ngonka + ``` + + *If a proposal was already created (Resume/Vote Only):* + ```bash + ssh ubuntu@89.169.110.250 "bash -s" -- < test-net-cloud/nebius/bridge/bridge-fund-pool.sh + ``` + + **Verification:** Look for "Funding proposal submitted and voted successfully!" in the output. + +--- + +## 6. Verify Community Pool Balance + +1. **Check Community Pool Balance**: + You can verify the funds are available in the community pool: + ```bash + ssh ubuntu@89.169.110.250 "/srv/dai/inferenced q distribution community-pool --node http://localhost:8000/chain-rpc/" + ``` + You should see approximately **120,000,000 GNK** (1.2 * 10^17 ngonka). diff --git a/test-net-cloud/nebius/bridge/bridge-fund-pool.sh b/test-net-cloud/nebius/bridge/bridge-fund-pool.sh new file mode 100644 index 000000000..495ba8616 --- /dev/null +++ b/test-net-cloud/nebius/bridge/bridge-fund-pool.sh @@ -0,0 +1,209 @@ +#!/bin/bash +set -e + +# Resolve Base Directory (Logic matches launch.py) +BASE_DIR="${TESTNET_BASE_DIR:-/srv/dai}" + +# Inferenced binary path (try local first, then system) +if [ -f "$BASE_DIR/inferenced" ]; then + APP_NAME="$BASE_DIR/inferenced" +else + APP_NAME="inferenced" +fi + +KEY_DIR="$BASE_DIR/.inference" + +CHAIN_ID="gonka-testnet" +KEY_NAME="${KEY_NAME:-gonka-account-key}" + +# Port 26657 is closed on host, but 8000 is open (likely proxy) +NODE_OPTS="--node http://localhost:8000/chain-rpc/" + +echo "==================================================" +echo "Funding Liquidity Pool from Community Pool" +echo "Binary: $APP_NAME" +echo "Key: $KEY_NAME" +echo "Key Dir: $KEY_DIR" + +# Defaults +PASSWORD="12345678" +# 120M GNK in base units (ngonka) +AMOUNT="120000000000000000ngonka" +PROPOSAL_ID_ARG="" + +# Parse named arguments +while [[ $# -gt 0 ]]; do + case $1 in + --amount) + AMOUNT="$2" + shift 2 + ;; + --password) + PASSWORD="$2" + shift 2 + ;; + --proposal) + PROPOSAL_ID_ARG="$2" + shift 2 + ;; + *) + echo "Error: Unknown option $1" + echo "Usage: ssh user@host \"bash -s\" -- < script.sh [--amount AMT] [--password PASS] [--proposal ID]" + exit 1 + ;; + esac +done + +# Function to run keys command safely +run_keys_cmd() { + local cmd_args="$@" + printf "%s\n%s\n" "$PASSWORD" "$PASSWORD" | $APP_NAME keys $cmd_args +} + +# 1. Verify Key Exists locally +check_key() { + local backend=$1 + if printf "%s\n" "$PASSWORD" | $APP_NAME keys show "$KEY_NAME" --keyring-backend "$backend" --keyring-dir "$KEY_DIR" >/dev/null 2>&1; then + return 0 + fi + return 1 +} + +if check_key "file"; then + KEYRING_BACKEND="file" +elif check_key "test"; then + KEYRING_BACKEND="test" +else + echo "Error: Key '$KEY_NAME' not found in $KEY_DIR" + exit 1 +fi + +# Get Key Address +MY_ADDR=$(run_keys_cmd show "$KEY_NAME" -a --keyring-backend "$KEYRING_BACKEND" --home "$BASE_DIR/.inference" 2>/dev/null) + +if [ -z "$MY_ADDR" ]; then + echo "Error: Could not retrieve address for key '$KEY_NAME'" + exit 1 +fi + +echo "Signer Address: $MY_ADDR" + +# If PROPOSAL_ID_ARG is not set, creating new proposal +if [ -z "$PROPOSAL_ID_ARG" ]; then + # 2. Get LP Address + echo "Fetching Liquidity Pool address..." + LP_ADDR=$($APP_NAME query inference liquidity-pool $NODE_OPTS --output json /dev/null || echo "") + + if [ -z "$LP_ADDR" ] || [ "$LP_ADDR" == "null" ]; then + echo "Error: Could not fetch liquidity pool address. Is it registered?" + exit 1 + fi + echo "LP Address: $LP_ADDR" + + # 3. Get Gov Module Address (Authority) + echo "Fetching Gov Module Address..." + GOV_ACCOUNT_JSON=$($APP_NAME q auth module-account gov --output json $NODE_OPTS "$PROPOSAL_FILE" + + # 5. Submit Proposal + echo "Submitting Proposal..." + RAW_SUBMIT_OUT=$(printf "%s\n%s\n" "$PASSWORD" "$PASSWORD" | $APP_NAME tx gov submit-proposal "$PROPOSAL_FILE" \ + --from "$KEY_NAME" --chain-id "$CHAIN_ID" --gas auto --gas-adjustment 1.5 --yes --output json \ + --keyring-backend "$KEYRING_BACKEND" --home "$BASE_DIR/.inference" $NODE_OPTS 2>&1) + + # Try to extract JSON part if there's noise + SUBMIT_OUT=$(echo "$RAW_SUBMIT_OUT" | sed -n '/{/,$p') + + TX_HASH=$(echo "$SUBMIT_OUT" | jq -r '.txhash' 2>/dev/null || echo "null") + + if [ "$TX_HASH" == "null" ] || [ -z "$TX_HASH" ]; then + echo "Error: Submit-proposal failed or output was not valid JSON." + echo "Raw output:" + echo "$RAW_SUBMIT_OUT" + exit 1 + fi + echo "TX Hash: $TX_HASH" + + echo "Waiting 6 seconds..." + sleep 6 + + # 6. Get Proposal ID + PROPOSAL_ID=$($APP_NAME q gov proposals --output json $NODE_OPTS &1) + + if echo "$VOTE_OUT" | grep -q '"code":0' || echo "$VOTE_OUT" | grep -q "txhash"; then + echo "$VOTE_OUT" + VOTE_SUCCESS=true + break + else + echo "Vote attempt $((RETRY_COUNT+1)) failed: $VOTE_OUT" + RETRY_COUNT=$((RETRY_COUNT+1)) + sleep 5 + fi +done + +if [ "$VOTE_SUCCESS" = true ]; then + echo "Funding proposal submitted and voted successfully!" +else + echo "Error: Failed to vote after $MAX_RETRIES attempts." + exit 1 +fi + +echo "Done!" diff --git a/test-net-cloud/nebius/bridge/bridge-register-pool.sh b/test-net-cloud/nebius/bridge/bridge-register-pool.sh new file mode 100644 index 000000000..c9d93579e --- /dev/null +++ b/test-net-cloud/nebius/bridge/bridge-register-pool.sh @@ -0,0 +1,327 @@ +#!/bin/bash +set -e + +# Resolve Base Directory (Logic matches launch.py) +BASE_DIR="${TESTNET_BASE_DIR:-/srv/dai}" + +# Inferenced binary path (try local first, then system) +if [ -f "$BASE_DIR/inferenced" ]; then + APP_NAME="$BASE_DIR/inferenced" +else + APP_NAME="inferenced" +fi + +KEY_DIR="$BASE_DIR/.inference" + +CHAIN_ID="gonka-testnet" +KEY_NAME="${KEY_NAME:-gonka-account-key}" + +# Dynamically fetch Gov Module Account Address +# Port 26657 is closed on host, but 8000 is open (likely proxy) +# Use trailing slash to avoid 301 redirect which strips port +NODE_OPTS="--node http://localhost:8000/chain-rpc/" + +echo "==================================================" +echo "Registering Liquidity Pool on Gonka (Host Binary Mode)" +echo "Binary: $APP_NAME" +echo "Key: $KEY_NAME" +echo "Key Dir: $KEY_DIR" + +# Default Password +PASSWORD="12345678" +CODE_ID="" +WASM_PATH="" +PROPOSAL_ID_ARG="" +USE_REPO_WASM=false + +# Parse named arguments +while [[ $# -gt 0 ]]; do + case $1 in + --code-id) + CODE_ID="$2" + shift 2 + ;; + --wasm) + WASM_PATH="$2" + shift 2 + ;; + --use-repo) + USE_REPO_WASM=true + shift + ;; + --password) + PASSWORD="$2" + shift # past argument + shift # past value + ;; + --proposal) + PROPOSAL_ID_ARG="$2" + shift # past argument + shift # past value + ;; + *) + echo "Error: Unknown option $1" + echo "Usage: ssh user@host \"bash -s\" -- < script.sh [--code-id ID | --wasm PATH] [--password PASS] [--proposal ID]" + exit 1 + ;; + esac +done + +# Validation: Either CODE_ID or WASM_PATH is required ONLY if we are creating a proposal (no PROPOSAL_ID provided) +if [ -z "$PROPOSAL_ID_ARG" ] && [ -z "$CODE_ID" ] && [ -z "$WASM_PATH" ] && [ "$USE_REPO_WASM" = false ]; then + echo "Error: Either --code-id, --wasm, or --use-repo is required." + echo "Usage: ssh user@host \"bash -s\" -- < script.sh [--code-id ID | --wasm PATH | --use-repo] [--password PASS]" + exit 1 +fi + +# Logic to find WASM in repo if requested +if [ "$USE_REPO_WASM" = true ] && [ -z "$WASM_PATH" ]; then + # Try to find the repo root + POTENTIAL_REPO_PATHS=("$BASE_DIR/gonka" "$DIR/.." "$DIR/../../..") + SEARCH_PATH="inference-chain/contracts/liquidity-pool/artifacts/liquidity_pool.wasm" + + for rp in "${POTENTIAL_REPO_PATHS[@]}"; do + if [ -f "$rp/$SEARCH_PATH" ]; then + WASM_PATH="$rp/$SEARCH_PATH" + echo "Found WASM in repo: $WASM_PATH" + break + fi + done + + if [ -z "$WASM_PATH" ]; then + echo "Error: Could not find $SEARCH_PATH in potential repo locations: ${POTENTIAL_REPO_PATHS[*]}" + exit 1 + fi +fi + +if [ -n "$WASM_PATH" ]; then + echo "WASM Path: $WASM_PATH" +elif [ -n "$CODE_ID" ]; then + echo "Code ID: $CODE_ID" +fi + +if [ -n "$PROPOSAL_ID_ARG" ]; then + echo "Resuming with Proposal ID: $PROPOSAL_ID_ARG" +fi + +# Function to run keys command safely (piping input to avoid reading script stdin) +run_keys_cmd() { + local cmd_args="$@" + # Pipe password (twice for safety/confirmation) to the command + # This prevents the command from reading the script itself from stdin when run via 'bash -s' + printf "%s\n%s\n" "$PASSWORD" "$PASSWORD" | $APP_NAME keys $cmd_args +} + +# 1. Verify Key Exists locally +echo "Checking for key '$KEY_NAME'..." + +check_key() { + local backend=$1 + # Quiet verification + if printf "%s\n" "$PASSWORD" | $APP_NAME keys show "$KEY_NAME" --keyring-backend "$backend" --keyring-dir "$KEY_DIR" >/dev/null 2>&1; then + return 0 + fi + return 1 +} + +if check_key "file"; then + KEYRING_BACKEND="file" + echo "Found key in 'file' backend." +elif check_key "test"; then + KEYRING_BACKEND="test" + echo "Found key in 'test' backend." +else + echo "Error: Key '$KEY_NAME' not found in $KEY_DIR (checked file/test backends)" + echo "Available keys (file):" + + # Try to list keys (piping password in case of migration prompt) + printf "%s\n" "$PASSWORD" | $APP_NAME keys list --keyring-backend file --keyring-dir "$KEY_DIR" || echo "Listing failed." + + echo "Available keys (test):" + printf "%s\n" "$PASSWORD" | $APP_NAME keys list --keyring-backend test --keyring-dir "$KEY_DIR" || echo "Listing failed." + exit 1 +fi + +# Get Key Address +MY_ADDR=$(run_keys_cmd show "$KEY_NAME" -a --keyring-backend "$KEYRING_BACKEND" --home "$BASE_DIR/.inference" 2>/dev/null) + +if [ -z "$MY_ADDR" ]; then + echo "Error: Could not retrieve address for key '$KEY_NAME'" + exit 1 +fi + +echo "Signer Address: $MY_ADDR" + +# If PROPOSAL_ID_ARG is not set, creating new proposal +if [ -z "$PROPOSAL_ID_ARG" ]; then + + # Optional: Upload WASM if path provided + if [ -n "$WASM_PATH" ] && [ -z "$CODE_ID" ]; then + echo "Storing WASM contract: $WASM_PATH..." + + # Capture raw output + RAW_STORE_OUT=$(printf "%s\n%s\n" "$PASSWORD" "$PASSWORD" | $APP_NAME tx wasm store "$WASM_PATH" \ + --from "$KEY_NAME" --chain-id "$CHAIN_ID" --gas auto --gas-adjustment 1.5 --yes --output json \ + --keyring-backend "$KEYRING_BACKEND" --home "$BASE_DIR/.inference" $NODE_OPTS 2>&1) + + # Try to extract JSON part if there's noise (warnings/logs) + STORE_TX=$(echo "$RAW_STORE_OUT" | sed -n '/{/,$p') + + TX_HASH=$(echo "$STORE_TX" | jq -r '.txhash' 2>/dev/null || echo "null") + + if [ "$TX_HASH" == "null" ] || [ -z "$TX_HASH" ]; then + echo "Error: WASM store transaction failed or output was not valid JSON." + echo "Raw output from command:" + echo "$RAW_STORE_OUT" + exit 1 + fi + echo "Store TX Hash: $TX_HASH" + + echo "Waiting for code_id extraction..." + CODE_ID="" + for i in $(seq 1 15); do + TX_QUERY=$($APP_NAME query tx "$TX_HASH" $NODE_OPTS --output json 2>/dev/null || echo "") + # Again, extract JSON from possible noise + JSON_QUERY=$(echo "$TX_QUERY" | sed -n '/{/,$p') + + CODE_ID=$(echo "$JSON_QUERY" | jq -r '.events[] | select(.type=="store_code") | .attributes[] | select(.key=="code_id") | .value' 2>/dev/null | head -n1) + + if [ -n "$CODE_ID" ] && [ "$CODE_ID" != "null" ]; then + break + fi + sleep 2 + done + + if [ -z "$CODE_ID" ] || [ "$CODE_ID" == "null" ]; then + echo "Error: Could not extract code_id from transaction $TX_HASH" + echo "Last TX query output:" + echo "$TX_QUERY" + exit 1 + fi + echo "Successfully uploaded WASM. Code ID: $CODE_ID" + fi + + # 2. Get Gov Module Address + echo "Fetching Gov Module Account Address..." + GOV_ACCOUNT_JSON=$($APP_NAME q auth module-account gov --output json $NODE_OPTS "$PROPOSAL_FILE" + + # 4. Submit Proposal + echo "Submitting Proposal..." + # Capture raw output + RAW_SUBMIT_OUT=$(printf "%s\n%s\n" "$PASSWORD" "$PASSWORD" | $APP_NAME tx gov submit-proposal "$PROPOSAL_FILE" \ + --from "$KEY_NAME" --chain-id "$CHAIN_ID" --gas auto --gas-adjustment 1.5 --yes --output json \ + --keyring-backend "$KEYRING_BACKEND" --home "$BASE_DIR/.inference" $NODE_OPTS 2>&1) + + # Try to extract JSON part if there's noise + SUBMIT_OUT=$(echo "$RAW_SUBMIT_OUT" | sed -n '/{/,$p') + + TX_HASH=$(echo "$SUBMIT_OUT" | jq -r '.txhash' 2>/dev/null || echo "null") + + if [ "$TX_HASH" == "null" ] || [ -z "$TX_HASH" ]; then + echo "Error: Submit-proposal failed or output was not valid JSON." + echo "Raw output:" + echo "$RAW_SUBMIT_OUT" + exit 1 + fi + echo "TX Hash: $TX_HASH" + + echo "Waiting 6 seconds..." + sleep 6 + + # 5. Vote + echo "Fetching Proposal ID..." + # Select last proposal ID + PROPOSAL_ID=$($APP_NAME q gov proposals --output json $NODE_OPTS &1) + + if echo "$VOTE_OUT" | grep -q '"code":0' || echo "$VOTE_OUT" | grep -q "txhash"; then + echo "$VOTE_OUT" + VOTE_SUCCESS=true + break + else + echo "Vote attempt $((RETRY_COUNT+1)) failed: $VOTE_OUT" + if echo "$VOTE_OUT" | grep -q "inactive proposal"; then + echo "Proposal not active for voting yet. Sleeping 5s..." + else + echo "Social/Network delay? Retrying in 5s..." + fi + RETRY_COUNT=$((RETRY_COUNT+1)) + sleep 5 + fi +done + +if [ "$VOTE_SUCCESS" = true ]; then + echo "Vote submitted successfully!" +else + echo "Error: Failed to vote after $MAX_RETRIES attempts." + exit 1 +fi + +echo "Done!" diff --git a/test-net-cloud/nebius/bridge/bridge-register-wrapped.sh b/test-net-cloud/nebius/bridge/bridge-register-wrapped.sh new file mode 100644 index 000000000..c544d44f3 --- /dev/null +++ b/test-net-cloud/nebius/bridge/bridge-register-wrapped.sh @@ -0,0 +1,269 @@ +#!/bin/bash +set -e + +# Resolve Base Directory (Logic matches launch.py) +BASE_DIR="${TESTNET_BASE_DIR:-/srv/dai}" + +# Inferenced binary path (try local first, then system) +if [ -f "$BASE_DIR/inferenced" ]; then + APP_NAME="$BASE_DIR/inferenced" +else + APP_NAME="inferenced" +fi + +KEY_DIR="$BASE_DIR/.inference" + +CHAIN_ID="gonka-testnet" +KEY_NAME="${KEY_NAME:-gonka-account-key}" + +# Port 26657 is closed on host, but 8000 is open (likely proxy) +NODE_OPTS="--node http://localhost:8000/chain-rpc/" + +echo "==================================================" +echo "Registering Wrapped Token CW20 on Gonka (Host Binary Mode)" +echo "Binary: $APP_NAME" +echo "Key: $KEY_NAME" +echo "Key Dir: $KEY_DIR" + +# Default Password +PASSWORD="12345678" +CODE_ID="" +WASM_PATH="" +PROPOSAL_ID_ARG="" +USE_REPO_WASM=false + +# Parse named arguments +while [[ $# -gt 0 ]]; do + case $1 in + --code-id) + CODE_ID="$2" + shift 2 + ;; + --wasm) + WASM_PATH="$2" + shift 2 + ;; + --use-repo) + USE_REPO_WASM=true + shift + ;; + --password) + PASSWORD="$2" + shift # past argument + shift # past value + ;; + --proposal) + PROPOSAL_ID_ARG="$2" + shift # past argument + shift # past value + ;; + *) + echo "Error: Unknown option $1" + echo "Usage: ssh user@host \"bash -s\" -- < script.sh [--code-id ID | --wasm PATH] [--password PASS] [--proposal ID]" + exit 1 + ;; + esac +done + +# Validation +if [ -z "$PROPOSAL_ID_ARG" ] && [ -z "$CODE_ID" ] && [ -z "$WASM_PATH" ] && [ "$USE_REPO_WASM" = false ]; then + echo "Error: Either --code-id, --wasm, or --use-repo is required." + echo "Usage: ssh user@host \"bash -s\" -- < script.sh [--code-id ID | --wasm PATH | --use-repo] [--password PASS]" + exit 1 +fi + +# Logic to find WASM in repo if requested +if [ "$USE_REPO_WASM" = true ] && [ -z "$WASM_PATH" ]; then + # Try to find the repo root + # Standard locations: $BASE_DIR/gonka or current directory's parent (if script run from within repo) + POTENTIAL_REPO_PATHS=("$BASE_DIR/gonka" "$DIR/.." "$DIR/../../..") + SEARCH_PATH="inference-chain/contracts/wrapped-token/artifacts/wrapped_token.wasm" + + for rp in "${POTENTIAL_REPO_PATHS[@]}"; do + if [ -f "$rp/$SEARCH_PATH" ]; then + WASM_PATH="$rp/$SEARCH_PATH" + echo "Found WASM in repo: $WASM_PATH" + break + fi + done + + if [ -z "$WASM_PATH" ]; then + echo "Error: Could not find $SEARCH_PATH in potential repo locations: ${POTENTIAL_REPO_PATHS[*]}" + exit 1 + fi +fi + +# Function to run keys command safely +run_keys_cmd() { + local cmd_args="$@" + printf "%s\n%s\n" "$PASSWORD" "$PASSWORD" | $APP_NAME keys $cmd_args +} + +# 1. Verify Key Exists locally +check_key() { + local backend=$1 + if printf "%s\n" "$PASSWORD" | $APP_NAME keys show "$KEY_NAME" --keyring-backend "$backend" --keyring-dir "$KEY_DIR" >/dev/null 2>&1; then + return 0 + fi + return 1 +} + +if check_key "file"; then + KEYRING_BACKEND="file" +elif check_key "test"; then + KEYRING_BACKEND="test" +else + echo "Error: Key '$KEY_NAME' not found in $KEY_DIR" + exit 1 +fi + +# Get Key Address +MY_ADDR=$(run_keys_cmd show "$KEY_NAME" -a --keyring-backend "$KEYRING_BACKEND" --home "$BASE_DIR/.inference" 2>/dev/null) + +if [ -z "$MY_ADDR" ]; then + echo "Error: Could not retrieve address for key '$KEY_NAME'" + exit 1 +fi + +echo "Signer Address: $MY_ADDR" + +# If PROPOSAL_ID_ARG is not set, creating new proposal +if [ -z "$PROPOSAL_ID_ARG" ]; then + + # Optional: Upload WASM if path provided + if [ -n "$WASM_PATH" ] && [ -z "$CODE_ID" ]; then + echo "Storing WASM contract: $WASM_PATH..." + + # Capture raw output + RAW_STORE_OUT=$(printf "%s\n%s\n" "$PASSWORD" "$PASSWORD" | $APP_NAME tx wasm store "$WASM_PATH" \ + --from "$KEY_NAME" --chain-id "$CHAIN_ID" --gas auto --gas-adjustment 1.5 --yes --output json \ + --keyring-backend "$KEYRING_BACKEND" --home "$BASE_DIR/.inference" $NODE_OPTS 2>&1) + + # Try to extract JSON part if there's noise (warnings/logs) + # We look for the first '{' and capture everything from there + STORE_TX=$(echo "$RAW_STORE_OUT" | sed -n '/{/,$p') + + TX_HASH=$(echo "$STORE_TX" | jq -r '.txhash' 2>/dev/null || echo "null") + + if [ "$TX_HASH" == "null" ] || [ -z "$TX_HASH" ]; then + echo "Error: WASM store transaction failed or output was not valid JSON." + echo "Raw output from command:" + echo "$RAW_STORE_OUT" + exit 1 + fi + echo "Store TX Hash: $TX_HASH" + + echo "Waiting for code_id extraction..." + CODE_ID="" + for i in $(seq 1 15); do + TX_QUERY=$($APP_NAME query tx "$TX_HASH" $NODE_OPTS --output json 2>/dev/null || echo "") + # Again, extract JSON from possible noise + JSON_QUERY=$(echo "$TX_QUERY" | sed -n '/{/,$p') + + CODE_ID=$(echo "$JSON_QUERY" | jq -r '.events[] | select(.type=="store_code") | .attributes[] | select(.key=="code_id") | .value' 2>/dev/null | head -n1) + + if [ -n "$CODE_ID" ] && [ "$CODE_ID" != "null" ]; then + break + fi + sleep 2 + done + + if [ -z "$CODE_ID" ] || [ "$CODE_ID" == "null" ]; then + echo "Error: Could not extract code_id from transaction $TX_HASH" + echo "Last TX query output:" + echo "$TX_QUERY" + exit 1 + fi + echo "Successfully uploaded WASM. Code ID: $CODE_ID" + fi + + # 2. Get Gov Module Address (Authority) + echo "Fetching Gov Module Account Address..." + GOV_ACCOUNT_JSON=$($APP_NAME q auth module-account gov --output json $NODE_OPTS "$PROPOSAL_FILE" + + # 4. Submit Proposal + echo "Submitting Proposal..." + printf "%s\n%s\n" "$PASSWORD" "$PASSWORD" | $APP_NAME tx gov submit-proposal "$PROPOSAL_FILE" \ + --from "$KEY_NAME" --chain-id "$CHAIN_ID" --gas auto --gas-adjustment 1.5 --yes --output json \ + --keyring-backend "$KEYRING_BACKEND" --home "$BASE_DIR/.inference" $NODE_OPTS > submit_wrapped_output.json + + if [ ! -s submit_wrapped_output.json ]; then + echo "Error: No output generated from submit-proposal." + exit 1 + fi + TX_HASH=$(cat submit_wrapped_output.json | jq -r .txhash) + echo "TX Hash: $TX_HASH" + + echo "Waiting 6 seconds..." + sleep 6 + + # 5. Get Proposal ID + PROPOSAL_ID=$($APP_NAME q gov proposals --output json $NODE_OPTS &1) + + if echo "$VOTE_OUT" | grep -q '"code":0' || echo "$VOTE_OUT" | grep -q "txhash"; then + echo "$VOTE_OUT" + VOTE_SUCCESS=true + break + else + echo "Vote attempt $((RETRY_COUNT+1)) failed: $VOTE_OUT" + RETRY_COUNT=$((RETRY_COUNT+1)) + sleep 5 + fi +done + +if [ "$VOTE_SUCCESS" = true ]; then + echo "Vote submitted successfully!" +else + echo "Error: Failed to vote after $MAX_RETRIES attempts." + exit 1 +fi + +echo "Done!" diff --git a/test-net-cloud/nebius/bridge/bridge-register.sh b/test-net-cloud/nebius/bridge/bridge-register.sh new file mode 100644 index 000000000..3bc20d146 --- /dev/null +++ b/test-net-cloud/nebius/bridge/bridge-register.sh @@ -0,0 +1,262 @@ +#!/bin/bash +set -e + +# Resolve Base Directory (Logic matches launch.py) +BASE_DIR="${TESTNET_BASE_DIR:-/srv/dai}" + +# Inferenced binary path (try local first, then system) +if [ -f "$BASE_DIR/inferenced" ]; then + APP_NAME="$BASE_DIR/inferenced" +else + APP_NAME="inferenced" +fi + +KEY_DIR="$BASE_DIR/.inference" + +CHAIN_ID="gonka-testnet" +KEY_NAME="${KEY_NAME:-gonka-account-key}" +CHAIN_NAME_ID="ethereum" + +# Dynamically fetch Gov Module Account Address +# Port 26657 is closed on host, but 8000 is open (likely proxy) +# Use trailing slash to avoid 301 redirect which strips port +NODE_OPTS="--node http://localhost:8000/chain-rpc/" + +echo "==================================================" +echo "Registering Bridge Contract on Gonka (Host Binary Mode)" +echo "Binary: $APP_NAME" +echo "Key: $KEY_NAME" +echo "Key Dir: $KEY_DIR" + +# Default Password +PASSWORD="12345678" +BRIDGE_ADDRESS="" +PROPOSAL_ID_ARG="" + +# Parse named arguments +while [[ $# -gt 0 ]]; do + case $1 in + --address) + BRIDGE_ADDRESS="$2" + shift 2 + ;; + --password) + PASSWORD="$2" + shift 2 + ;; + --proposal) + PROPOSAL_ID_ARG="$2" + shift 2 + ;; + *) + echo "Error: Unknown option $1" + echo "Usage: ssh user@host \"bash -s\" -- < script.sh --address 0xYOUR_ADDRESS [--password PASS] [--proposal ID]" + exit 1 + ;; + esac +done + +# Validation: Address is required ONLY if we are creating a proposal (no PROPOSAL_ID provided) +if [ -z "$PROPOSAL_ID_ARG" ] && [ -z "$BRIDGE_ADDRESS" ]; then + echo "Error: --address is required for new proposals." + echo "Usage: ssh user@host \"bash -s\" -- < script.sh --address 0xYOUR_ADDRESS [--password PASS] [--proposal ID]" + exit 1 +fi + +if [ -n "$BRIDGE_ADDRESS" ]; then + echo "Address: $BRIDGE_ADDRESS" +fi + +if [ -n "$PROPOSAL_ID_ARG" ]; then + echo "Resuming with Proposal ID: $PROPOSAL_ID_ARG" +fi + +# Function to run keys command safely (piping input to avoid reading script stdin) +run_keys_cmd() { + local cmd_args="$@" + # Pipe password (twice for safety/confirmation) to the command + # This prevents the command from reading the script itself from stdin when run via 'bash -s' + printf "%s\n%s\n" "$PASSWORD" "$PASSWORD" | $APP_NAME keys $cmd_args +} + +# 1. Verify Key Exists locally +echo "Checking for key '$KEY_NAME'..." + +check_key() { + local backend=$1 + # Quiet verification + if printf "%s\n" "$PASSWORD" | $APP_NAME keys show "$KEY_NAME" --keyring-backend "$backend" --keyring-dir "$KEY_DIR" >/dev/null 2>&1; then + return 0 + fi + return 1 +} + +if check_key "file"; then + KEYRING_BACKEND="file" + echo "Found key in 'file' backend." +elif check_key "test"; then + KEYRING_BACKEND="test" + echo "Found key in 'test' backend." +else + echo "Error: Key '$KEY_NAME' not found in $KEY_DIR (checked file/test backends)" + echo "Available keys (file):" + + # Try to list keys (piping password in case of migration prompt) + printf "%s\n" "$PASSWORD" | $APP_NAME keys list --keyring-backend file --keyring-dir "$KEY_DIR" || echo "Listing failed." + + echo "Available keys (test):" + printf "%s\n" "$PASSWORD" | $APP_NAME keys list --keyring-backend test --keyring-dir "$KEY_DIR" || echo "Listing failed." + exit 1 +fi + +# Get Key Address +MY_ADDR=$(run_keys_cmd show "$KEY_NAME" -a --keyring-backend "$KEYRING_BACKEND" --home "$BASE_DIR/.inference" 2>/dev/null) + +if [ -z "$MY_ADDR" ]; then + echo "Error: Could not retrieve address for key '$KEY_NAME'" + exit 1 +fi + +echo "Signer Address: $MY_ADDR" + +# If PROPOSAL_ID_ARG is not set, creating new proposal +if [ -z "$PROPOSAL_ID_ARG" ]; then + # 2. Get Gov Module Address + echo "Fetching Gov Module Account Address..." + # Using run_keys_cmd won't work for query, need direct call but query shouldn't prompt + # Use /dev/null to see errors + GOV_ACCOUNT_JSON=$($APP_NAME q auth module-account gov --output json $NODE_OPTS "$PROPOSAL_FILE" + + # 4. Submit Proposal + echo "Submitting Proposal..." + # Capture raw output + RAW_SUBMIT_OUT=$(printf "%s\n%s\n" "$PASSWORD" "$PASSWORD" | $APP_NAME tx gov submit-proposal "$PROPOSAL_FILE" \ + --from "$KEY_NAME" --chain-id "$CHAIN_ID" --gas auto --gas-adjustment 1.5 --yes --output json \ + --keyring-backend "$KEYRING_BACKEND" --home "$BASE_DIR/.inference" $NODE_OPTS 2>&1) + + # Try to extract JSON part if there's noise + SUBMIT_OUT=$(echo "$RAW_SUBMIT_OUT" | sed -n '/{/,$p') + + TX_HASH=$(echo "$SUBMIT_OUT" | jq -r '.txhash' 2>/dev/null || echo "null") + + if [ "$TX_HASH" == "null" ] || [ -z "$TX_HASH" ]; then + echo "Error: Submit-proposal failed or output was not valid JSON." + echo "Raw output:" + echo "$RAW_SUBMIT_OUT" + exit 1 + fi + echo "TX Hash: $TX_HASH" + + echo "Waiting 6 seconds..." + sleep 6 + + # 5. Vote + echo "Fetching Proposal ID..." + # Removing unsupported flags. Just getting the latest proposal by index -1. + PROPOSAL_ID=$($APP_NAME q gov proposals --output json $NODE_OPTS &1) + + if echo "$VOTE_OUT" | grep -q '"code":0' || echo "$VOTE_OUT" | grep -q "txhash"; then + echo "$VOTE_OUT" + VOTE_SUCCESS=true + break + else + echo "Vote attempt $((RETRY_COUNT+1)) failed: $VOTE_OUT" + if echo "$VOTE_OUT" | grep -q "inactive proposal"; then + echo "Proposal not active for voting yet. Sleeping 5s..." + else + echo "Unknown error during voting. Retrying anyway..." + fi + RETRY_COUNT=$((RETRY_COUNT+1)) + sleep 5 + fi +done + +if [ "$VOTE_SUCCESS" = true ]; then + echo "Vote submitted successfully!" +else + echo "Error: Failed to vote after $MAX_RETRIES attempts." + exit 1 +fi + +echo "Done!" diff --git a/test-net-cloud/nebius/bridge/bridge-setup.sh b/test-net-cloud/nebius/bridge/bridge-setup.sh new file mode 100755 index 000000000..1564bd523 --- /dev/null +++ b/test-net-cloud/nebius/bridge/bridge-setup.sh @@ -0,0 +1,155 @@ +#!/bin/bash +set -e + +# Default Genesis Host +GENESIS_HOST="${GENESIS_HOST:-89.169.111.79}" +# Relative path to the bridge contract directory +BRIDGE_DIR="../../proposals/ethereum-bridge-contact" +ENV_FILE="$BRIDGE_DIR/.env" +EXAMPLE_FILE="$BRIDGE_DIR/.env.example" + +# Ensure we are in the correct directory +DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +cd "$DIR" + +echo "Setting up environment for Bridge Contract in $BRIDGE_DIR..." + +echo "Using Genesis Host: $GENESIS_HOST" + +# Check if .env.example exists +if [ ! -f "$EXAMPLE_FILE" ]; then + echo "Error: $EXAMPLE_FILE not found!" + exit 1 +fi + +# Copy .env.example to .env if .env doesn't exist +if [ ! -f "$ENV_FILE" ]; then + echo "Creating .env from $EXAMPLE_FILE..." + cp "$EXAMPLE_FILE" "$ENV_FILE" +else + echo ".env already exists. Updating values..." +fi + +# Fetch current epoch +echo "Fetching current epoch..." +EPOCH=$(curl -s "http://$GENESIS_HOST:8000/chain-api/productscience/inference/inference/get_current_epoch" | jq -r .epoch) + +if [ -z "$EPOCH" ] || [ "$EPOCH" == "null" ]; then + echo "Error: Failed to fetch current epoch from $GENESIS_HOST" + exit 1 +fi +echo "Current Epoch: $EPOCH" + +# Fetch Group Public Key +echo "Fetching Group Public Key..." +GROUP_KEY_B64=$(curl -s "http://$GENESIS_HOST:8000/chain-api/productscience/inference/bls/epoch_data/$EPOCH" | jq -r .epoch_data.group_public_key) + +if [ -z "$GROUP_KEY_B64" ] || [ "$GROUP_KEY_B64" == "null" ]; then + echo "Error: Failed to fetch group public key" + exit 1 +fi + +# Convert Base64 to Hex +# Decode base64 -> convert to hex -> ensure it's on one line +GROUP_KEY_HEX="0x$(echo "$GROUP_KEY_B64" | base64 -d | xxd -p -c 1000)" +echo "Group Public Key (Hex): $GROUP_KEY_HEX" + +# Update .env file +# We use a temporary file to handle cross-platform sed differences safely or just logical replacement +if grep -q "GENESIS_GROUP_PUBLIC_KEY=" "$ENV_FILE"; then + # Replace existing line + # Escape special chars in key if any (though hex is safe) + sed -i.bak "s|GENESIS_GROUP_PUBLIC_KEY=.*|GENESIS_GROUP_PUBLIC_KEY=$GROUP_KEY_HEX|" "$ENV_FILE" + rm "$ENV_FILE.bak" +else + # Append if not found + echo "GENESIS_GROUP_PUBLIC_KEY=$GROUP_KEY_HEX" >> "$ENV_FILE" +fi + +if grep -q "GENESIS_HOST=" "$ENV_FILE"; then + sed -i.bak "s|GENESIS_HOST=.*|GENESIS_HOST=$GENESIS_HOST|" "$ENV_FILE" + rm "$ENV_FILE.bak" +else + echo "GENESIS_HOST=$GENESIS_HOST" >> "$ENV_FILE" +fi + +# Set SEPOLIA_RPC_URL for testnet setup +SEPOLIA_RPC="https://ethereum-sepolia-rpc.publicnode.com" +if grep -q "SEPOLIA_RPC_URL=" "$ENV_FILE"; then + if grep -q "SEPOLIA_RPC_URL=$" "$ENV_FILE" || grep -q "SEPOLIA_RPC_URL=\"\"" "$ENV_FILE"; then + # Only update if empty + sed -i.bak "s|SEPOLIA_RPC_URL=.*|SEPOLIA_RPC_URL=$SEPOLIA_RPC|" "$ENV_FILE" + rm "$ENV_FILE.bak" + echo "Updated SEPOLIA_RPC_URL to $SEPOLIA_RPC" + fi +else + echo "SEPOLIA_RPC_URL=$SEPOLIA_RPC" >> "$ENV_FILE" + echo "Added SEPOLIA_RPC_URL=$SEPOLIA_RPC" +fi + +# Handle Private Key argument +PRIVATE_KEY="$1" + +if [ -n "$PRIVATE_KEY" ]; then + echo "Updating PRIVATE_KEY in .env..." + if grep -q "PRIVATE_KEY=" "$ENV_FILE"; then + # Use a different delimiter to avoid issues with slashes in key (though rare in hex/base64) + # Using | as delimiter + sed -i.bak "s|PRIVATE_KEY=.*|PRIVATE_KEY=$PRIVATE_KEY|" "$ENV_FILE" + rm "$ENV_FILE.bak" + else + echo "PRIVATE_KEY=$PRIVATE_KEY" >> "$ENV_FILE" + fi + echo "Private key updated." +else + echo "No private key provided as argument." + echo "Checking if PRIVATE_KEY is already set in .env..." + if grep -q "PRIVATE_KEY=" "$ENV_FILE" && ! grep -q "PRIVATE_KEY=$" "$ENV_FILE"; then + echo "PRIVATE_KEY found in .env, proceeding..." + else + echo "WARNING: PRIVATE_KEY is missing or empty in .env. Deployment may fail." + echo "Usage: ./bridge-setup.sh " + fi +fi + +echo "Environment setup complete! Values updated in $ENV_FILE" + +echo "Deploying Bridge Contract to Sepolia..." +cd "$BRIDGE_DIR" +# Ensure dependencies are installed (fast check) +if [ ! -d "node_modules" ]; then + echo "Installing dependencies..." + npm install +fi + +echo "Running: npx hardhat run deploy.js --network sepolia" +OUTPUT=$(npx hardhat run deploy.js --network sepolia) +EXIT_CODE=$? + +echo "$OUTPUT" + +if [ $EXIT_CODE -eq 0 ]; then + echo "" + echo "Deployment Successful!" + + # Extract Bridge Contract Address from output + BRIDGE_ADDRESS=$(echo "$OUTPUT" | grep "BridgeContract deployed to:" | awk '{print $NF}') + + if [ -n "$BRIDGE_ADDRESS" ]; then + echo "==================================================" + echo "BRIDGE CONTRACT ADDRESS: $BRIDGE_ADDRESS" + echo "==================================================" + # Optional: Save address to a file since .env is being deleted + echo "$BRIDGE_ADDRESS" > "bridge_address.txt" + echo "Address saved to: ${BRIDGE_DIR}/bridge_address.txt" + else + echo "WARNING: Could not parse Bridge Contract Address from output." + fi + + echo "Security: Removing .env file..." + rm "$ENV_FILE" + echo ".env file removed." +else + echo "Deployment Failed." + exit $EXIT_CODE +fi diff --git a/test-net-cloud/nebius/genesis-overrides.json b/test-net-cloud/nebius/genesis-overrides.json index ee3edaba3..a988cd4f3 100644 --- a/test-net-cloud/nebius/genesis-overrides.json +++ b/test-net-cloud/nebius/genesis-overrides.json @@ -103,7 +103,8 @@ "dist_threshold": { "value": "4", "exponent": -1 }, "p_mismatch": { "value": "1", "exponent": -1 }, "p_value_threshold": { "value": "5", "exponent": -2 } - } + }, + "poc_normalization_enabled": true }, "confirmation_poc_params": { "expected_confirmations_per_epoch": "4" diff --git a/testermint/mock_server/src/main/kotlin/com/productscience/mockserver/service/WebhookService.kt b/testermint/mock_server/src/main/kotlin/com/productscience/mockserver/service/WebhookService.kt index 7ef05d0c8..eecff34e4 100644 --- a/testermint/mock_server/src/main/kotlin/com/productscience/mockserver/service/WebhookService.kt +++ b/testermint/mock_server/src/main/kotlin/com/productscience/mockserver/service/WebhookService.kt @@ -184,7 +184,15 @@ class WebhookService(private val responseService: ResponseService) { val start = latestNonce.getAndAdd(weight) + (nodeId * 1_000_000L) val artifacts = (0 until weight.toInt()).map { i -> val nonce = start + i - val vectorBytes = ByteArray(24) { j -> ((nonce * 2 + j) % 256).toByte() } + // Generate valid FP16 vectors (24 bytes = 12 FP16 values) + // FP16 NaN/Inf have exponent bits = 31 (0x7C00-0x7FFF, 0xFC00-0xFFFF) + // To avoid these, we mask the high byte to keep exponent < 31 + val vectorBytes = ByteArray(24) { j -> + val rawByte = ((nonce * 2 + j) % 256).toByte() + // For odd indices (high byte of FP16), mask to avoid exp=31 + // exp bits are in bits 2-6 of high byte; masking with 0x7B ensures exp <= 30 + if (j % 2 == 1) (rawByte.toInt() and 0x7B).toByte() else rawByte + } val vectorB64 = java.util.Base64.getEncoder().encodeToString(vectorBytes) """{"nonce": $nonce, "vector_b64": "$vectorB64"}""" }.joinToString(", ") diff --git a/testermint/src/main/kotlin/ApplicationCLI.kt b/testermint/src/main/kotlin/ApplicationCLI.kt index 516937b22..069c73e55 100644 --- a/testermint/src/main/kotlin/ApplicationCLI.kt +++ b/testermint/src/main/kotlin/ApplicationCLI.kt @@ -831,8 +831,8 @@ data class ApplicationCLI( val addresses: List = emptyList() ) - fun getTrainingAllowList(role: Int): List = wrapLog("getTrainingAllowList", true ) { - execAndParse(listOf("query", "inference","training-allow-list", role.toString())).addresses + fun getTrainingAllowList(role: NodeRole): List = wrapLog("getTrainingAllowList", true ) { + execAndParse(listOf("query", "inference","training-allow-list", role.value.toString())).addresses } data class Count( diff --git a/testermint/src/main/kotlin/InferenceMock.kt b/testermint/src/main/kotlin/InferenceMock.kt index fa0eaaf76..4efdf3bc9 100644 --- a/testermint/src/main/kotlin/InferenceMock.kt +++ b/testermint/src/main/kotlin/InferenceMock.kt @@ -253,8 +253,14 @@ class InferenceMock(port: Int, val name: String) : IInferenceMock { override fun setPocV2Response(weight: Long, hostName: String?, scenarioName: String) { // Generate 'weight' artifacts with deterministic vectors (base64-encoded) val artifacts = (1..weight).joinToString(", ") { nonce -> - // Simple deterministic vector: 24 bytes (12 fp16 values), all based on nonce - val vectorBytes = ByteArray(24) { i -> ((nonce * 2 + i) % 256).toByte() } + // Generate valid FP16 vectors (24 bytes = 12 FP16 values) + // FP16 NaN/Inf have exponent bits = 31 (0x7C00-0x7FFF, 0xFC00-0xFFFF) + // To avoid these, we mask the high byte to keep exponent < 31 + val vectorBytes = ByteArray(24) { i -> + val rawByte = ((nonce * 2 + i) % 256).toByte() + // For odd indices (high byte of FP16), mask to avoid exp=31 + if (i % 2 == 1) (rawByte.toInt() and 0x7B).toByte() else rawByte + } val vectorB64 = java.util.Base64.getEncoder().encodeToString(vectorBytes) """{"nonce": $nonce, "vector_b64": "$vectorB64"}""" } diff --git a/testermint/src/main/kotlin/InferenceTestUtils.kt b/testermint/src/main/kotlin/InferenceTestUtils.kt index 70feff86a..d90b43734 100644 --- a/testermint/src/main/kotlin/InferenceTestUtils.kt +++ b/testermint/src/main/kotlin/InferenceTestUtils.kt @@ -1,6 +1,7 @@ package com.productscience import com.productscience.data.InferencePayload +import com.productscience.data.InferenceStatus import kotlinx.coroutines.asCoroutineDispatcher import kotlinx.coroutines.async import kotlinx.coroutines.awaitAll @@ -96,8 +97,8 @@ fun runParallelInferences( maxConcurrentRequests: Int = Runtime.getRuntime().availableProcessors(), models: List = listOf(defaultModel), inferenceRequest: InferenceRequestPayload = inferenceRequestObject, // Allow custom request -): List { +): List { // Use the new function and extract statuses for backward compatibility val inferences = runParallelInferencesWithResults(genesis, count, waitForBlocks, maxConcurrentRequests, models, inferenceRequest) - return inferences.map { it.status } + return inferences.map { it.statusEnum } } \ No newline at end of file diff --git a/testermint/src/main/kotlin/Main.kt b/testermint/src/main/kotlin/Main.kt index ec834ed72..dff4db144 100644 --- a/testermint/src/main/kotlin/Main.kt +++ b/testermint/src/main/kotlin/Main.kt @@ -387,18 +387,26 @@ private fun TxResponse.assertSuccess() { } val defaultFunding = 20_000_000L +fun GsonBuilder.registerCosmosTypes(): GsonBuilder { + return this.registerTypeAdapter(Instant::class.java, InstantDeserializer()) + .registerTypeAdapter(Duration::class.java, DurationDeserializer()) + .registerTypeAdapter(Duration::class.java, DurationSerializer()) + .registerTypeAdapter(Pubkey2::class.java, Pubkey2Deserializer()) + .registerTypeAdapter(Int::class.java, IntDeserializer()) + .registerTypeAdapter(Integer::class.java, IntDeserializer()) + .registerTypeAdapter(Long::class.java, LongDeserializer()) + .registerTypeAdapter(java.lang.Long::class.java, LongSerializer()) + .registerTypeAdapter(java.lang.Long::class.java, LongDeserializer()) + .registerTypeAdapter(java.lang.Double::class.java, DoubleSerializer()) + .registerTypeAdapter(java.lang.Float::class.java, FloatSerializer()) + .registerTypeAdapter(ConfirmationPoCPhase::class.java, ConfirmationPoCPhaseDeserializer()) + .registerTypeAdapter(InferenceStatus::class.java, InferenceStatusDeserializer()) + .registerTypeAdapter(ProposalStatus::class.java, ProposalStatusDeserializer()) +} + val cosmosJson: Gson = GsonBuilder() .setFieldNamingPolicy(com.google.gson.FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) - .registerTypeAdapter(Instant::class.java, InstantDeserializer()) - .registerTypeAdapter(Duration::class.java, DurationDeserializer()) - .registerTypeAdapter(Duration::class.java, DurationSerializer()) - .registerTypeAdapter(Pubkey2::class.java, Pubkey2Deserializer()) - .registerTypeAdapter(Long::class.java, LongDeserializer()) - .registerTypeAdapter(java.lang.Long::class.java, LongSerializer()) - .registerTypeAdapter(java.lang.Long::class.java, LongDeserializer()) - .registerTypeAdapter(java.lang.Double::class.java, DoubleSerializer()) - .registerTypeAdapter(java.lang.Float::class.java, FloatSerializer()) - .registerTypeAdapter(ConfirmationPoCPhase::class.java, ConfirmationPoCPhaseDeserializer()) + .registerCosmosTypes() .registerMessages("com.productscience.data", FieldNamingPolicy.LOWER_CASE_WITH_UNDERSCORES) .create() @@ -413,8 +421,7 @@ val gsonCamelCase = createGsonWithTxMessageSerializers("com.productscience.data" fun createGsonWithTxMessageSerializers(packageName: String): Gson { return GsonBuilder() .setFieldNamingPolicy(com.google.gson.FieldNamingPolicy.IDENTITY) - .registerTypeAdapter(Instant::class.java, InstantDeserializer()) - .registerTypeAdapter(Duration::class.java, DurationDeserializer()) + .registerCosmosTypes() .registerMessages(packageName, FieldNamingPolicy.IDENTITY) .create() } @@ -488,6 +495,8 @@ fun createSpec(epochLength: Long = 15L, epochShift: Int = 0): Spec = s this[PocParams::modelId] = defaultModel this[PocParams::seqLen] = 256L this[PocParams::pocV2Enabled] = true + this[PocParams::validationSlots] = 2L + this[PocParams::pocNormalizationEnabled] = false } } this[InferenceState::genesisOnlyParams] = spec { diff --git a/testermint/src/main/kotlin/RewardCalculations.kt b/testermint/src/main/kotlin/RewardCalculations.kt index 07fb63e05..c2b37ad0c 100644 --- a/testermint/src/main/kotlin/RewardCalculations.kt +++ b/testermint/src/main/kotlin/RewardCalculations.kt @@ -187,13 +187,13 @@ fun calculateBalanceChanges( ): Map { val payouts: MutableMap = mutableMapOf() inferences.forEach { inference -> - when (inference.status) { - InferenceStatus.STARTED.value -> { + when (inference.statusEnum) { + InferenceStatus.STARTED -> { require(inference.escrowAmount != null) { "Escrow amount is null for started inference" } payouts.add(inference.requestedBy!!, inference.escrowAmount!!, "initial escrow") } // no payouts - InferenceStatus.FINISHED.value -> { + InferenceStatus.FINISHED -> { require(inference.actualCost != null) { "Actual cost is null for finished inference" } require(inference.assignedTo != null) { "Assigned to is null for finished inference" } require(inference.escrowAmount != null) { "Escrow amount is null for finished inference" } @@ -207,7 +207,7 @@ fun calculateBalanceChanges( ) } - InferenceStatus.VALIDATED.value -> { + InferenceStatus.VALIDATED -> { require(inference.actualCost != null) { "Actual cost is null for validated inference" } require(inference.assignedTo != null) { "Assigned to is null for validated inference" } // ValidatedBy can be empty if the validation was done post-settle @@ -243,10 +243,14 @@ fun calculateBalanceChanges( payouts.add(inference.requestedBy!!, -inference.actualCost!!, "actual cost") } - InferenceStatus.EXPIRED.value, InferenceStatus.INVALIDATED.value -> { + InferenceStatus.EXPIRED, InferenceStatus.INVALIDATED -> { // full refund payouts.add(inference.requestedBy!!, 0, "full refund of expired or invalidated") } + + else -> { + Logger.warn("Unknown inference status: ${inference.statusEnum}") + } } } @@ -281,16 +285,16 @@ fun MutableMap.add(key: String, amount: Long, reason: String) { fun expectedCoinBalanceChanges(inferences: List): Map { val payouts: MutableMap = mutableMapOf() inferences.forEach { inference -> - when (inference.status) { - InferenceStatus.STARTED.value -> {} + when (inference.statusEnum) { + InferenceStatus.STARTED -> {} // no payouts - InferenceStatus.FINISHED.value -> { + InferenceStatus.FINISHED -> { require(inference.actualCost != null) { "Actual cost is null for finished inference" } require(inference.assignedTo != null) { "Assigned to is null for finished inference" } payouts.add(inference.assignedTo!!, inference.actualCost!!, "Full Inference (WorkCoins)") } - InferenceStatus.VALIDATED.value -> { + InferenceStatus.VALIDATED -> { require(inference.actualCost != null) { "Actual cost is null for validated inference" } require(inference.assignedTo != null) { "Assigned to is null for validated inference" } val validators = listOf(inference.assignedTo) + (inference.validatedBy ?: listOf()) @@ -299,6 +303,7 @@ fun expectedCoinBalanceChanges(inferences: List): Map {} } } return payouts @@ -338,13 +343,13 @@ fun calculateVestingScheduleChanges( // Process each inference following the same logic as calculateBalanceChanges inferences.forEach { inference -> - when (inference.status) { - InferenceStatus.STARTED.value -> { + when (inference.statusEnum) { + InferenceStatus.STARTED -> { require(inference.escrowAmount != null) { "Escrow amount is null for started inference" } costs.add(inference.requestedBy!!, inference.escrowAmount!!) } - InferenceStatus.FINISHED.value -> { + InferenceStatus.FINISHED -> { require(inference.actualCost != null) { "Actual cost is null for finished inference" } require(inference.assignedTo != null) { "Assigned to is null for finished inference" } require(inference.escrowAmount != null) { "Escrow amount is null for finished inference" } @@ -358,7 +363,7 @@ fun calculateVestingScheduleChanges( rewardCoins.add(inference.assignedTo!!, rewardAmount) } - InferenceStatus.VALIDATED.value -> { + InferenceStatus.VALIDATED -> { require(inference.actualCost != null) { "Actual cost is null for validated inference" } require(inference.assignedTo != null) { "Assigned to is null for validated inference" } require(inference.escrowAmount != null) { "Escrow amount is null for validated inference" } @@ -382,9 +387,10 @@ fun calculateVestingScheduleChanges( } } - InferenceStatus.EXPIRED.value, InferenceStatus.INVALIDATED.value -> { + InferenceStatus.EXPIRED, InferenceStatus.INVALIDATED -> { // No costs or rewards for expired/invalidated inferences } + else -> {} } } diff --git a/testermint/src/main/kotlin/com/productscience/data/bls.kt b/testermint/src/main/kotlin/com/productscience/data/bls.kt index 71e8f92be..7acbf5c64 100644 --- a/testermint/src/main/kotlin/com/productscience/data/bls.kt +++ b/testermint/src/main/kotlin/com/productscience/data/bls.kt @@ -9,7 +9,7 @@ data class EpochBLSDataWrapper( data class SigningStatusWrapper( @SerializedName("signing_request") - val signingRequest: ThresholdSigningRequest + val signingRequest: ThresholdSigningRequest? ) data class EpochBLSData( diff --git a/testermint/src/main/kotlin/data/AppExport.kt b/testermint/src/main/kotlin/data/AppExport.kt index f8b2b3c57..a9a3cd3d6 100644 --- a/testermint/src/main/kotlin/data/AppExport.kt +++ b/testermint/src/main/kotlin/data/AppExport.kt @@ -263,6 +263,21 @@ data class PocParams( val pocV2Enabled: Boolean = true, // V2 enabled by default @SerializedName("confirmation_poc_v2_enabled") val confirmationPocV2Enabled: Boolean = true, // V2 for confirmation PoC, enables migration mode + @SerializedName("stat_test") + val statTest: PoCStatTestParams? = null, + @SerializedName("validation_slots") + val validationSlots: Long = 2, + @SerializedName("poc_normalization_enabled") + val pocNormalizationEnabled: Boolean = false, // Disabled by default in tests +) + +data class PoCStatTestParams( + @SerializedName("dist_threshold") + val distThreshold: Decimal? = null, + @SerializedName("p_mismatch") + val pMismatch: Decimal? = null, + @SerializedName("p_value_threshold") + val pValueThreshold: Decimal? = null, ) data class PoCModelParams( diff --git a/testermint/src/main/kotlin/data/Staking.kt b/testermint/src/main/kotlin/data/Staking.kt index b8c7727b7..cda4a5393 100644 --- a/testermint/src/main/kotlin/data/Staking.kt +++ b/testermint/src/main/kotlin/data/Staking.kt @@ -12,18 +12,29 @@ data class ValidatorsResponse( data class StakeValidator( val operatorAddress: String, val consensusPubkey: ConsensusPubkey, - val status: Int, + val status: String, val tokens: Long, val delegatorShares: Double, val description: ValidatorDescription, val unbondingTime: Instant, val commission: Commission, val minSelfDelegation: String -) +) { + val statusEnum: StakeValidatorStatus + get() = when (status) { + "BOND_STATUS_BONDED", "BONDED", "3" -> StakeValidatorStatus.BONDED + "BOND_STATUS_UNBONDING", "UNBONDING", "2" -> StakeValidatorStatus.UNBONDING + else -> StakeValidatorStatus.UNBONDING // Default or unknown + } +} enum class StakeValidatorStatus(val value: Int) { UNBONDING(2), - BONDED(3), + BONDED(3); + + companion object { + fun fromValue(value: Int): StakeValidatorStatus = values().find { it.value == value } ?: UNBONDING + } } data class ConsensusPubkey( diff --git a/testermint/src/main/kotlin/data/converters.kt b/testermint/src/main/kotlin/data/converters.kt index 2ca1257c9..2f9b1a89a 100644 --- a/testermint/src/main/kotlin/data/converters.kt +++ b/testermint/src/main/kotlin/data/converters.kt @@ -31,6 +31,28 @@ class DurationDeserializer : JsonDeserializer { } } + +class IntDeserializer : JsonDeserializer { + override fun deserialize( + json: JsonElement, + typeOfT: Type?, + context: JsonDeserializationContext?, + ): Int? { + if (json.asString == "") return null + return try { + json.asString.replace("_", "").toInt() + } catch (e: NumberFormatException) { + try { + // Handle "5000.0" case + json.asDouble.toInt() + } catch (e2: Exception) { + // Fallback to original parsing (w/o replace) or just let it throw + json.asInt + } + } + } +} + class LongSerializer: JsonSerializer { override fun serialize( src: java.lang.Long?, @@ -125,8 +147,57 @@ class ConfirmationPoCPhaseDeserializer : JsonDeserializer typeOfT: Type?, context: JsonDeserializationContext? ): ConfirmationPoCPhase { + if (json.isJsonPrimitive && json.asJsonPrimitive.isString) { + val str = json.asString + return try { + ConfirmationPoCPhase.valueOf(str) + } catch (e: Exception) { + // Try numeric string + val num = str.toIntOrNull() + if (num != null) { + ConfirmationPoCPhase.values().find { it.value == num } + ?: throw IllegalArgumentException("Unknown ConfirmationPoCPhase value: $num") + } else { + throw e + } + } + } val intValue = json.asInt return ConfirmationPoCPhase.values().find { it.value == intValue } ?: throw IllegalArgumentException("Unknown ConfirmationPoCPhase value: $intValue") } } +class InferenceStatusDeserializer : JsonDeserializer { + override fun deserialize( + json: JsonElement, + typeOfT: Type?, + context: JsonDeserializationContext? + ): InferenceStatus { + return InferenceStatus.fromAny( + if (json.isJsonPrimitive && json.asJsonPrimitive.isString) { + json.asString + } else if (json.isJsonPrimitive && json.asJsonPrimitive.isNumber) { + json.asInt + } else { + null + } + ) + } +} +class ProposalStatusDeserializer : JsonDeserializer { + override fun deserialize( + json: JsonElement, + typeOfT: Type?, + context: JsonDeserializationContext? + ): ProposalStatus { + return ProposalStatus.fromAny( + if (json.isJsonPrimitive && json.asJsonPrimitive.isString) { + json.asString + } else if (json.isJsonPrimitive && json.asJsonPrimitive.isNumber) { + json.asInt + } else { + null + } + ) + } +} diff --git a/testermint/src/main/kotlin/data/inference.kt b/testermint/src/main/kotlin/data/inference.kt index 80cca2aed..d83b2530c 100644 --- a/testermint/src/main/kotlin/data/inference.kt +++ b/testermint/src/main/kotlin/data/inference.kt @@ -11,7 +11,7 @@ data class InferencePayload( val completionTokenCount: Int?, val requestedBy: String?, val executedBy: String?, - val status: Int, + val status: InferenceStatus, val startBlockHeight: Long, val endBlockHeight: Long?, val startBlockTimestamp: Long, @@ -31,6 +31,9 @@ data class InferencePayload( @com.google.gson.annotations.SerializedName("epoch_id") val epochId: Long = 0, // Phase 4: for offchain payload storage ) { + val statusEnum: InferenceStatus + get() = status + companion object { fun empty() = InferencePayload( index = "", @@ -43,7 +46,7 @@ data class InferencePayload( completionTokenCount = null, requestedBy = "", executedBy = null, - status = InferenceStatus.STARTED.value, + status = InferenceStatus.STARTED, startBlockHeight = 0L, endBlockHeight = null, startBlockTimestamp = 0L, @@ -64,9 +67,10 @@ data class InferencePayload( !this.requestedBy.isNullOrEmpty() && !this.executedBy.isNullOrEmpty() && !this.model.isNullOrEmpty() && - this.status > 0 + this.statusEnum != InferenceStatus.STARTED } + enum class InferenceStatus(val value: Int) { STARTED(0), FINISHED(1), @@ -74,6 +78,27 @@ enum class InferenceStatus(val value: Int) { INVALIDATED(3), VOTING(4), EXPIRED(5), + UNSPECIFIED(6); + + companion object { + fun fromValue(value: Int): InferenceStatus = + values().find { it.value == value } ?: UNSPECIFIED + + fun fromAny(value: Any?): InferenceStatus { + return when (value) { + is String -> { + if (value.isEmpty()) return UNSPECIFIED + val normalized = value.removePrefix("INFERENCE_STATUS_") + values().find { it.name == normalized } ?: run { + val num = normalized.toIntOrNull() + if (num != null) fromValue(num) else UNSPECIFIED + } + } + is Number -> fromValue(value.toInt()) + else -> UNSPECIFIED + } + } + } } data class InferencesWrapper( @@ -165,4 +190,4 @@ data class StorePayloadResponse( val inferenceId: String, @com.google.gson.annotations.SerializedName("epoch_id") val epochId: Long -) \ No newline at end of file +) diff --git a/testermint/src/main/kotlin/data/messages.kt b/testermint/src/main/kotlin/data/messages.kt index eef8e7c92..8e3e0e58a 100644 --- a/testermint/src/main/kotlin/data/messages.kt +++ b/testermint/src/main/kotlin/data/messages.kt @@ -15,6 +15,29 @@ data class MsgSubmitNewParticipant( val workerKey: String = "", ) : TxMessage +data class MsgSend( + override val type: String = "/cosmos.bank.v1beta1.MsgSend", + val fromAddress: String = "", + val toAddress: String = "", + val amount: List = listOf(), +) : TxMessage, GovernanceMessage { + override fun withAuthority(authority: String): GovernanceMessage { + return this.copy(fromAddress = authority) + } +} + +data class MsgTransferWithVesting( + override val type: String = "/inference.streamvesting.MsgTransferWithVesting", + val sender: String = "", + val recipient: String = "", + val amount: List = listOf(), + val vestingEpochs: Long, +) : TxMessage, GovernanceMessage { + override fun withAuthority(authority: String): GovernanceMessage { + return this.copy(sender = authority) + } +} + interface GovernanceMessage : TxMessage { override val type: String fun withAuthority(authority: String): GovernanceMessage @@ -83,9 +106,20 @@ data class MsgRemoveUserFromTrainingAllowList( } } +@Deprecated("Use NodeRole.EXEC.value instead") const val ROLE_EXEC = 0; +@Deprecated("Use NodeRole.START.value instead") const val ROLE_START = 1; +enum class NodeRole(val value: Int) { + EXEC(0), + START(1); + + companion object { + fun fromValue(value: Int): NodeRole = values().find { it.value == value } ?: EXEC + } +} + data class MsgSetTrainingAllowList( val authority: String = "", val addresses: List, @@ -109,9 +143,36 @@ data class FinalTallyResult( val noWithVetoCount: Long ) +enum class ProposalStatus(val value: Int) { + UNSPECIFIED(0), + DEPOSIT_PERIOD(1), + VOTING_PERIOD(2), + PASSED(3), + REJECTED(4), + FAILED(5); + + companion object { + fun fromValue(value: Int): ProposalStatus = values().find { it.value == value } ?: UNSPECIFIED + + fun fromAny(value: Any?): ProposalStatus { + return when (value) { + is String -> { + val normalized = value.removePrefix("PROPOSAL_STATUS_") + values().find { it.name == normalized } ?: run { + val num = normalized.toIntOrNull() + if (num != null) values().find { it.value == num } ?: UNSPECIFIED else UNSPECIFIED + } + } + is Number -> fromValue(value.toInt()) + else -> UNSPECIFIED + } + } + } +} + data class GovernanceProposalResponse( val id: String, - val status: Int, + val status: ProposalStatus, val finalTallyResult: FinalTallyResult, val submitTime: Instant, val depositEndTime: Instant, diff --git a/testermint/src/main/kotlin/data/participants.kt b/testermint/src/main/kotlin/data/participants.kt index 8b1925f02..30d238c2f 100644 --- a/testermint/src/main/kotlin/data/participants.kt +++ b/testermint/src/main/kotlin/data/participants.kt @@ -115,7 +115,7 @@ data class RawParticipant( val joinTime: Long, val joinHeight: Long, val inferenceUrl: String, - val status: Int, + val status: String, val epochsCompleted: Long, ) : ParticipantInfo { override fun getParticipantAddress(): String = index diff --git a/testermint/src/main/kotlin/data/status.kt b/testermint/src/main/kotlin/data/status.kt index 4ba9abf38..6d84abc93 100644 --- a/testermint/src/main/kotlin/data/status.kt +++ b/testermint/src/main/kotlin/data/status.kt @@ -45,7 +45,7 @@ data class SyncInfo( data class ValidatorInfo( val address: String, val pubKey: PubKey, - val votingPower: Int + val votingPower: Long ) public data class PubKey( diff --git a/testermint/src/test/kotlin/BLSDKGSuccessTest.kt b/testermint/src/test/kotlin/BLSDKGSuccessTest.kt index fb62aab28..62ee9eb5e 100644 --- a/testermint/src/test/kotlin/BLSDKGSuccessTest.kt +++ b/testermint/src/test/kotlin/BLSDKGSuccessTest.kt @@ -268,12 +268,14 @@ class BLSDKGSuccessTest : TestermintTest() { val signingStatus = genesis.api.queryBLSSigningStatus(requestIdHex) if (signingStatus.signingRequest == null) { - Logger.error("Signing request not found! This suggests the request was never created, expired, or has a different ID") + Logger.error("Signing request not found for request ID: $requestId (hex: $requestIdHex)") + return } - val statusCode = signingStatus.signingRequest.status.toString().toInt() - val statusEnum = ThresholdSigningStatus.fromValue(statusCode) - Logger.info("Found signing request with status: $statusEnum ($statusCode)") + val statusStr = signingStatus.signingRequest!!.status + val statusEnum = ThresholdSigningStatus.fromAny(statusStr) + + Logger.info("Found signing request with status: $statusEnum ($statusStr)") assertThat(statusEnum).isEqualTo(ThresholdSigningStatus.COMPLETED) assertThat(signingStatus.signingRequest.finalSignature).isNotNull() val sigBytes = Base64.getDecoder().decode(signingStatus.signingRequest.finalSignature) @@ -528,7 +530,23 @@ enum class DKGPhase(val value: Int) { VERIFYING(2), COMPLETED(3), FAILED(4), - SIGNED(5) + SIGNED(5); + + companion object { + fun fromAny(value: Any?): DKGPhase { + return when (value) { + is String -> { + val normalized = value.removePrefix("DKG_PHASE_") + values().find { it.name == normalized } ?: run { + val num = normalized.toIntOrNull() + if (num != null) values().find { it.value == num } ?: UNDEFINED else UNDEFINED + } + } + is Number -> values().find { it.value == value.toInt() } ?: UNDEFINED + else -> UNDEFINED + } + } + } } enum class ThresholdSigningStatus(val value: Int) { @@ -541,6 +559,20 @@ enum class ThresholdSigningStatus(val value: Int) { companion object { fun fromValue(value: Int): ThresholdSigningStatus = values().firstOrNull { it.value == value } ?: UNSPECIFIED + + fun fromAny(value: Any?): ThresholdSigningStatus { + return when (value) { + is String -> { + val cleanName = value.replace("THRESHOLD_SIGNING_STATUS_", "") + values().find { it.name == cleanName } ?: run { + val num = cleanName.toIntOrNull() + if (num != null) fromValue(num) else UNSPECIFIED + } + } + is Number -> fromValue(value.toInt()) + else -> UNSPECIFIED + } + } } } @@ -620,64 +652,92 @@ fun com.productscience.ApplicationCLI.queryEpochBLSData(epochId: Long): EpochBLS /** * Helper function to parse query results into EpochBLSData - * Parses the JSON response from the CLI query */ private fun parseEpochBLSDataFromQuery(result: Map): EpochBLSData? { return try { - // The CLI response structure is: { "epoch_data": { ... } } + // The CLI response structure might use snake_case or camelCase @Suppress("UNCHECKED_CAST") - val epochData = (result["epoch_data"] as? Map) ?: return null + val epochData = (result["epoch_data"] as? Map) + ?: (result["epochData"] as? Map) + ?: return null + + fun getValue(vararg keys: String): Any? { + for (key in keys) { + val v = epochData[key] + if (v != null) return v + } + return null + } // Parse basic fields - val epochId = when (val value = epochData["epoch_id"]) { + val epochId = when (val value = getValue("epoch_id", "epochId")) { is String -> value.toLongOrNull() ?: 0L is Number -> value.toLong() else -> 0L } - val iTotalSlots = when (val value = epochData["i_total_slots"]) { + val iTotalSlots = when (val value = getValue("i_total_slots", "iTotalSlots")) { is String -> value.toIntOrNull() ?: 0 is Number -> value.toInt() else -> 0 } - val tSlotsDegree = when (val value = epochData["t_slots_degree"]) { + val tSlotsDegree = when (val value = getValue("t_slots_degree", "tSlotsDegree")) { is String -> value.toIntOrNull() ?: 0 is Number -> value.toInt() else -> 0 } - val dealingDeadline = when (val value = epochData["dealing_phase_deadline_block"]) { + val dealingDeadline = when (val value = getValue("dealing_phase_deadline_block", "dealingPhaseDeadlineBlock")) { is String -> value.toLongOrNull() ?: 0L is Number -> value.toLong() else -> 0L } - val verifyingDeadline = when (val value = epochData["verifying_phase_deadline_block"]) { + val verifyingDeadline = when (val value = getValue("verifying_phase_deadline_block", "verifyingPhaseDeadlineBlock")) { is String -> value.toLongOrNull() ?: 0L is Number -> value.toLong() else -> 0L } - // Parse DKG phase (server returns numeric values like "dkg_phase": 1) - val dkgPhaseNum = when (val phase = epochData["dkg_phase"]) { - is Number -> phase.toInt() - is String -> phase.toIntOrNull() ?: 0 - else -> 0 + // Parse DKG phase + val dkgPhase = when (val phase = getValue("dkg_phase", "dkgPhase")) { + is String -> { + // Try to parse as enum name first + try { + val cleanName = phase.replace("DKG_PHASE_", "") + DKGPhase.valueOf(cleanName) + } catch (e: IllegalArgumentException) { + // Fallback to integer parsing if string is numeric (legacy) + val num = phase.toIntOrNull() ?: 0 + DKGPhase.values().find { it.value == num } ?: DKGPhase.UNDEFINED + } + } + is Number -> { + val num = phase.toInt() + DKGPhase.values().find { it.value == num } ?: DKGPhase.UNDEFINED + } + else -> DKGPhase.UNDEFINED } - val dkgPhase = DKGPhase.values().find { it.value == dkgPhaseNum } - ?: DKGPhase.UNDEFINED // Parse participants @Suppress("UNCHECKED_CAST") - val participantsList = (epochData["participants"] as? List>) ?: emptyList() + val participantsList = (getValue("participants") as? List>) ?: emptyList() val participants = participantsList.map { participantMap -> + fun getPartValue(vararg keys: String): Any? { + for (key in keys) { + val v = participantMap[key] + if (v != null) return v + } + return null + } + BLSParticipantInfo( - address = participantMap["address"] as? String ?: "", - percentageWeight = (participantMap["percentage_weight"] as? String ?: "0").toDouble(), // Already in percentage format (0-100) - secp256k1PublicKey = parseByteArrayFromChain(participantMap["secp256k1_public_key"]), - slotStartIndex = when (val value = participantMap["slot_start_index"]) { + address = getPartValue("address") as? String ?: "", + percentageWeight = (getPartValue("percentage_weight", "percentageWeight") as? String ?: "0").toDouble(), + secp256k1PublicKey = parseByteArrayFromChain(getPartValue("secp256k1_public_key", "secp256k1PublicKey")), + slotStartIndex = when (val value = getPartValue("slot_start_index", "slotStartIndex")) { is String -> value.toIntOrNull() ?: 0 is Number -> value.toInt() else -> 0 }, - slotEndIndex = when (val value = participantMap["slot_end_index"]) { + slotEndIndex = when (val value = getPartValue("slot_end_index", "slotEndIndex")) { is String -> value.toIntOrNull() ?: 0 is Number -> value.toInt() else -> 0 @@ -686,27 +746,31 @@ private fun parseEpochBLSDataFromQuery(result: Map): EpochBLSData? } // Parse group public key - val groupPublicKey = parseByteArrayFromChain(epochData["group_public_key"]) + val groupPublicKey = parseByteArrayFromChain(getValue("group_public_key", "groupPublicKey")) // Parse dealer parts @Suppress("UNCHECKED_CAST") - val dealerPartsList = (epochData["dealer_parts"] as? List>) ?: emptyList() + val dealerPartsList = (getValue("dealer_parts", "dealerParts") as? List>) ?: emptyList() val dealerParts = dealerPartsList.mapNotNull { dealerMap -> - val dealerAddress = dealerMap["dealer_address"] as? String ?: "" - if (dealerAddress.isEmpty()) return@mapNotNull null // Skip empty entries (participants who haven't submitted dealer parts) + fun getDealerValue(vararg keys: String): Any? { + for (key in keys) { + val v = dealerMap[key] + if (v != null) return v + } + return null + } + val dealerAddress = getDealerValue("dealer_address", "dealerAddress") as? String ?: "" + if (dealerAddress.isEmpty()) return@mapNotNull null @Suppress("UNCHECKED_CAST") - val commitmentsList = (dealerMap["commitments"] as? List) ?: emptyList() - Logger.debug("Raw commitments from chain: ${commitmentsList.take(1)} (type: ${commitmentsList.firstOrNull()?.javaClass?.simpleName})") + val commitmentsList = (getDealerValue("commitments") as? List) ?: emptyList() val commitments = commitmentsList.map { parseByteArrayFromChain(it) } - Logger.debug("Parsed commitments sizes: ${commitments.map { it.size }}") @Suppress("UNCHECKED_CAST") - val participantSharesList = (dealerMap["participant_shares"] as? List>) ?: emptyList() + val participantSharesList = (getDealerValue("participant_shares", "participantShares") as? List>) ?: emptyList() val participantShares = participantSharesList.map { sharesMap -> @Suppress("UNCHECKED_CAST") - val encryptedSharesList = (sharesMap["encrypted_shares"] as? List) ?: emptyList() - Logger.debug("Raw encrypted shares from chain: ${encryptedSharesList.take(1).map { it?.javaClass?.simpleName }}") // Log first share type + val encryptedSharesList = (sharesMap["encrypted_shares"] ?: sharesMap["encryptedShares"]) as? List ?: emptyList() val encryptedShares = encryptedSharesList.map { parseByteArrayFromChain(it) } EncryptedSharesForParticipant(encryptedShares) } @@ -720,21 +784,21 @@ private fun parseEpochBLSDataFromQuery(result: Map): EpochBLSData? // Parse verification submissions @Suppress("UNCHECKED_CAST") - val verificationSubmissionsList = (epochData["verification_submissions"] as? List>) ?: emptyList() + val verificationSubmissionsList = (getValue("verification_submissions", "verificationSubmissions") as? List>) ?: emptyList() val verificationSubmissions = verificationSubmissionsList.mapNotNull { submissionMap -> @Suppress("UNCHECKED_CAST") - val dealerValidityList = (submissionMap["dealer_validity"] as? List) ?: emptyList() - if (dealerValidityList.isEmpty()) return@mapNotNull null // Skip empty entries (participants who haven't submitted verification vectors) + val dealerValidityList = (submissionMap["dealer_validity"] ?: submissionMap["dealerValidity"]) as? List ?: emptyList() + if (dealerValidityList.isEmpty()) return@mapNotNull null VerificationVectorSubmission(dealerValidityList) } // Parse valid dealers @Suppress("UNCHECKED_CAST") - val validDealersList = (epochData["valid_dealers"] as? List) ?: emptyList() + val validDealersList = (getValue("valid_dealers", "validDealers") as? List) ?: emptyList() // Parse validation signature - val validationSignature = parseByteArrayFromChain(epochData["validation_signature"]) + val validationSignature = parseByteArrayFromChain(getValue("validation_signature", "validationSignature")) EpochBLSData( epochId = epochId, diff --git a/testermint/src/test/kotlin/ConfirmationPoCFailTests.kt b/testermint/src/test/kotlin/ConfirmationPoCFailTests.kt index b8344a9a7..a814e4e60 100644 --- a/testermint/src/test/kotlin/ConfirmationPoCFailTests.kt +++ b/testermint/src/test/kotlin/ConfirmationPoCFailTests.kt @@ -77,7 +77,7 @@ class ConfirmationPoCFailTests : TestermintTest() { it.consensusPubkey.value == join1.node.getValidatorInfo().key } assertThat(join1ValidatorAfterPoC).isNotNull - assertThat(join1ValidatorAfterPoC!!.status).isEqualTo(StakeValidatorStatus.BONDED.value) + assertThat(join1ValidatorAfterPoC!!.statusEnum).isEqualTo(StakeValidatorStatus.BONDED) Logger.info(" Join1 is still bonded (not slashed, confirmation_weight=8 > alpha*regular_weight=7)") logSection("Waiting for NEXT epoch where confirmation weights will be applied") diff --git a/testermint/src/test/kotlin/GovernanceTests.kt b/testermint/src/test/kotlin/GovernanceTests.kt index f28ccc781..776ba3f21 100644 --- a/testermint/src/test/kotlin/GovernanceTests.kt +++ b/testermint/src/test/kotlin/GovernanceTests.kt @@ -1,15 +1,23 @@ +import ValidationTests.Companion.alwaysValidate import com.productscience.EpochStage import com.productscience.data.UpdateParams +import com.productscience.data.ProposalStatus import com.productscience.data.spec import com.productscience.data.AppState +import com.productscience.data.Coin import com.productscience.data.InferenceState import com.productscience.data.GenesisOnlyParams import com.productscience.data.Decimal +import com.productscience.data.MsgSend +import com.productscience.data.MsgStartInference +import com.productscience.data.MsgTransferWithVesting import com.productscience.inferenceConfig import com.productscience.initCluster import com.productscience.logSection import org.assertj.core.api.Assertions.assertThat import org.junit.jupiter.api.Test +import org.tinylog.kotlin.Logger +import kotlin.test.assertNotNull class GovernanceTests : TestermintTest() { @Test @@ -80,7 +88,7 @@ class GovernanceTests : TestermintTest() { val finalTallyResult = proposals.proposals.first { it.id == proposalId }.finalTallyResult assertThat(finalTallyResult.noCount).isEqualTo(20) assertThat(finalTallyResult.yesCount).isEqualTo(100) - + // Mark for reboot to reset parameters for subsequent tests genesis.markNeedsReboot() } @@ -128,11 +136,74 @@ class GovernanceTests : TestermintTest() { } assertThat(paramsProposal.finalTallyResult.noCount).isEqualTo(12) assertThat(paramsProposal.finalTallyResult.yesCount).isEqualTo(11) - assertThat(paramsProposal.status).isEqualTo(4) - + assertThat(paramsProposal.status).isEqualTo(ProposalStatus.REJECTED) + // Mark for reboot to reset parameters for subsequent tests genesis.markNeedsReboot() } + @Test + fun `send gov funds to an account`() { + val (cluster, genesis) = initCluster(mergeSpec = alwaysValidate, reboot = true) + genesis.waitForNextEpoch() + cluster.allPairs.forEach { pair -> + pair.waitForMlNodesToLoad() + } + val helper = InferenceTestHelper(cluster, genesis) + val lateValidator = cluster.joinPairs.first() + val mlNodeVersionResponse = genesis.node.getMlNodeVersion() + val mlNodeVersion = mlNodeVersionResponse.mlnodeVersion.currentVersion + val segment = "/${mlNodeVersion}" + lateValidator.mock?.setInferenceErrorResponse(500, segment = segment) + logSection("Make sure we're in safe inference zone") + genesis.waitForStage(EpochStage.SET_NEW_VALIDATORS) + genesis.node.waitForNextBlock(3) + val lateValidatorBeforeBalance = lateValidator.node.getSelfBalance() + logSection("Use messages only for inference") + val seed = lateValidator.api.getConfig().currentSeed + val inference = helper.runFullInference() + logSection("Wait for claims") + genesis.waitForStage(EpochStage.CLAIM_REWARDS, 3) + // Both helpers should have validated and been rewarded + val updatedInference = genesis.node.getInference(inference.inferenceId) + // Only the other join should have validated + assertNotNull(updatedInference) + assertNotNull(updatedInference.inference) + + assertThat( + updatedInference.inference.validatedBy ?: listOf() + ).doesNotContain(lateValidator.node.getColdAddress()) + val afterBalance = lateValidator.node.getSelfBalance() + assertThat(afterBalance).isEqualTo(lateValidatorBeforeBalance) + logSection("Wait for claims to default to gov account") + genesis.waitForStage(EpochStage.CLAIM_REWARDS) + logSection("Submit Proposal to send funds") + val governanceAddress = genesis.node.getModuleAccount("gov").account.value.address + val governanceBalance = genesis.node.getBalance(governanceAddress, "ngonka") + val genesisAddress = genesis.node.getColdAddress() + val genesisBalance = genesis.node.getBalance(genesisAddress, "ngonka") + val sendFunds = MsgTransferWithVesting( + sender = governanceAddress, + recipient = genesisAddress, + amount = listOf(Coin("ngonka", governanceBalance.balance.amount)), + vestingEpochs = 100 + ) + + val message = genesis.submitMessage(sendFunds, true) + Logger.warn { message.toString() } + val proposalId = genesis.runProposal(cluster, sendFunds) + logSection("Verifying Proposal") + val newGovBalance = genesis.node.getBalance(governanceAddress, "ngonka") + val newGenesisBalance = genesis.node.getBalance(genesisAddress, "ngonka") + assertThat(newGovBalance.balance.amount).isEqualTo(0) + // amount should be unaffected immediately + assertThat(newGenesisBalance.balance.amount).isEqualTo(genesisBalance.balance.amount) + val newVestingSchedule = genesis.node.queryVestingSchedule(genesisAddress) + assertThat(newVestingSchedule).withFailMessage { "No vesting schedule added" }.isNotNull + val totalAmount = newVestingSchedule.vestingSchedule?.epochAmounts?.sumOf { it.coins.sumOf { it.amount } } ?: 0 + assertThat(totalAmount).isEqualTo(governanceBalance.balance.amount) + assertThat(newVestingSchedule.vestingSchedule?.epochAmounts).hasSize(100) + } + } \ No newline at end of file diff --git a/testermint/src/test/kotlin/InferenceFailureAccountingTests.kt b/testermint/src/test/kotlin/InferenceFailureAccountingTests.kt index 72aec2d4c..befa0c75f 100644 --- a/testermint/src/test/kotlin/InferenceFailureAccountingTests.kt +++ b/testermint/src/test/kotlin/InferenceFailureAccountingTests.kt @@ -41,7 +41,7 @@ class InferenceFailureAccountingTests : TestermintTest() { Logger.info { "QUERIED ALL INFERENCES 2 (again):\n" + queryResp2.joinToString("\n") } val canceledInference = cluster.joinPairs.first().api.getInference(newTimeouts.first().inferenceId) - assertThat(canceledInference.status).isEqualTo(InferenceStatus.EXPIRED.value) + assertThat(canceledInference.statusEnum).isEqualTo(InferenceStatus.EXPIRED) assertThat(canceledInference.executedBy).isNull() val afterTimeouts = genesis.node.getInferenceTimeouts() assertThat(afterTimeouts.inferenceTimeout).hasSize(0) diff --git a/testermint/src/test/kotlin/InvalidationTests.kt b/testermint/src/test/kotlin/InvalidationTests.kt index 87b7b4f5c..bd8a1a99f 100644 --- a/testermint/src/test/kotlin/InvalidationTests.kt +++ b/testermint/src/test/kotlin/InvalidationTests.kt @@ -132,7 +132,7 @@ class InvalidationTests : TestermintTest() { genesis.node.waitForNextBlock(3) val inferencePayload = genesis.node.getInference(inference.inferenceId) assertNotNull(inferencePayload) - assertThat(inferencePayload.inference.status).isEqualTo(InferenceStatus.INVALIDATED.value) + assertThat(inferencePayload.inference.statusEnum).isEqualTo(InferenceStatus.INVALIDATED) } @Test diff --git a/testermint/src/test/kotlin/NodeAdminStateTests.kt b/testermint/src/test/kotlin/NodeAdminStateTests.kt index 7cc461bde..74e8a7e30 100644 --- a/testermint/src/test/kotlin/NodeAdminStateTests.kt +++ b/testermint/src/test/kotlin/NodeAdminStateTests.kt @@ -17,7 +17,7 @@ class NodeAdminStateTests : TestermintTest() { val genesisValidatorBeforeDisabled = genesis.node.getStakeValidator() assertThat(genesisValidatorBeforeDisabled.tokens).isEqualTo(10) - assertThat(genesisValidatorBeforeDisabled.status).isEqualTo(StakeValidatorStatus.BONDED.value) + assertThat(genesisValidatorBeforeDisabled.status).contains("BONDED") logSection("Getting initial nodes") val nodes = genesis.api.getNodes() @@ -75,7 +75,7 @@ class NodeAdminStateTests : TestermintTest() { genesis.waitForStage(EpochStage.SET_NEW_VALIDATORS, offset = 3) val genesisValidatorAfterNodeIsDisabled = genesis.node.getStakeValidator() assertThat(genesisValidatorAfterNodeIsDisabled.tokens).isEqualTo(0) - assertThat(genesisValidatorAfterNodeIsDisabled.status).isEqualTo(StakeValidatorStatus.UNBONDING.value) + assertThat(genesisValidatorAfterNodeIsDisabled.status).contains("UNBONDING") } @Test @@ -106,7 +106,7 @@ class NodeAdminStateTests : TestermintTest() { // It's too late to disable at PoC, so we expect the node to participate and keep its weight val genesisStakeValidatorWhenDisabledAtPoc = genesis.node.getStakeValidator() assertThat(genesisStakeValidatorWhenDisabledAtPoc.tokens).isEqualTo(10) - assertThat(genesisStakeValidatorWhenDisabledAtPoc.status).isEqualTo(StakeValidatorStatus.BONDED.value) + assertThat(genesisStakeValidatorWhenDisabledAtPoc.status).contains("BONDED") genesis.waitForStage(EpochStage.START_OF_POC) genesis.waitForStage(EpochStage.END_OF_POC_VALIDATION, offset = 3) @@ -114,7 +114,7 @@ class NodeAdminStateTests : TestermintTest() { // At this point, disabled node should not be participating in new PoC val genesisValidatorAfterOneMoreEpoch = genesis.node.getStakeValidator() assertThat(genesisValidatorAfterOneMoreEpoch.tokens).isEqualTo(0) - assertThat(genesisValidatorAfterOneMoreEpoch.status).isEqualTo(StakeValidatorStatus.UNBONDING.value) + assertThat(genesisValidatorAfterOneMoreEpoch.status).contains("UNBONDING") logSection("Verifying disabled node state persists across epochs") val nodesInNewEpoch = genesis.api.getNodes() diff --git a/testermint/src/test/kotlin/NodeDisableInferenceTests.kt b/testermint/src/test/kotlin/NodeDisableInferenceTests.kt index 83eb6c81f..2539a52cc 100644 --- a/testermint/src/test/kotlin/NodeDisableInferenceTests.kt +++ b/testermint/src/test/kotlin/NodeDisableInferenceTests.kt @@ -72,7 +72,7 @@ class NodeDisableInferenceTests : TestermintTest() { assertThat(inferences).hasSize(requests) assertThat(inferences).allMatch { - it.status == InferenceStatus.VALIDATED.value || it.status == InferenceStatus.FINISHED.value + it.statusEnum == InferenceStatus.VALIDATED || it.statusEnum == InferenceStatus.FINISHED } logSection("All 15 inferences succeeded") diff --git a/testermint/src/test/kotlin/ParticipantPowerTests.kt b/testermint/src/test/kotlin/ParticipantPowerTests.kt index ef73a4cc4..f6c34f6a5 100644 --- a/testermint/src/test/kotlin/ParticipantPowerTests.kt +++ b/testermint/src/test/kotlin/ParticipantPowerTests.kt @@ -26,7 +26,7 @@ class ParticipantPowerTests : TestermintTest() { it.consensusPubkey.value == zeroParticipantKey.key } assertThat(zeroValidator.tokens).isZero - assertThat(zeroValidator.status).isEqualTo(StakeValidatorStatus.UNBONDING.value) + assertThat(zeroValidator.status).contains("UNBONDING") val cometValidators = genesis.node.getCometValidators() assertThat(cometValidators.validators).noneMatch { it.pubKey.key == zeroParticipantKey.key @@ -58,7 +58,7 @@ class ParticipantPowerTests : TestermintTest() { it.consensusPubkey.value == zeroParticipantKey.key } assertThat(zeroValidator.tokens).isZero - assertThat(zeroValidator.status).isEqualTo(StakeValidatorStatus.UNBONDING.value) + assertThat(zeroValidator.status).contains("UNBONDING") // Ideally just add here smth like "wait for 1 block?" val cometValidators = genesis.node.getCometValidators() assertThat(cometValidators.validators).noneMatch { @@ -78,7 +78,7 @@ class ParticipantPowerTests : TestermintTest() { } assertThat(rejoinedValidator.tokens).isEqualTo(10) - assertThat(rejoinedValidator.status).isEqualTo(StakeValidatorStatus.BONDED.value) + assertThat(rejoinedValidator.status).contains("BONDED") val cometValidatorsAfterRejoin = genesis.node.getCometValidators() assertThat(cometValidatorsAfterRejoin.validators).anyMatch { it.pubKey.key == zeroParticipantKey.key diff --git a/testermint/src/test/kotlin/SpecTests.kt b/testermint/src/test/kotlin/SpecTests.kt index 94fcd19de..062823347 100644 --- a/testermint/src/test/kotlin/SpecTests.kt +++ b/testermint/src/test/kotlin/SpecTests.kt @@ -310,7 +310,7 @@ val blsDataJson = """ "slot_end_index": 99 } ], - "dkg_phase": 3, + "dkg_phase": "COMPLETED", "dealing_phase_deadline_block": "100", "verifying_phase_deadline_block": "103", "group_public_key": "siKm25OFmsUteDpaYKG1uErvK2rI7kgtFFgKsgNNx2Iq8MyX4g7uIcgDd2AvMGduEppwXem/Uln3yGZey+GduxHw+lhhij/RPeIuyCF0e2UucMYdsNEhTP3nEBNUejwy", diff --git a/testermint/src/test/kotlin/TrainingTests.kt b/testermint/src/test/kotlin/TrainingTests.kt index 0f191152f..12b888ae9 100644 --- a/testermint/src/test/kotlin/TrainingTests.kt +++ b/testermint/src/test/kotlin/TrainingTests.kt @@ -75,13 +75,13 @@ class TrainingAllowListTests : TestermintTest() { genesis.runProposal( cluster, MsgSetTrainingAllowList( addresses = listOf(), - role = ROLE_START, + role = NodeRole.START.value, ) ) genesis.runProposal( cluster, MsgSetTrainingAllowList( addresses = listOf(genesis.node.getColdAddress()), - role = ROLE_EXEC + role = NodeRole.EXEC.value ) ) val genesisAddress = genesis.node.getColdAddress() @@ -112,13 +112,13 @@ class TrainingAllowListTests : TestermintTest() { genesis.runProposal( cluster, MsgSetTrainingAllowList( addresses = listOf(), - role = ROLE_EXEC, + role = NodeRole.EXEC.value, ) ) genesis.runProposal( cluster, MsgSetTrainingAllowList( addresses = listOf(genesis.node.getColdAddress()), - role = ROLE_START + role = NodeRole.START.value ) ) val genesisAddress = genesis.node.getColdAddress() @@ -146,8 +146,8 @@ class TrainingAllowListTests : TestermintTest() { @Order(2) fun `test exec allow list messages`() { val (cluster, genesis) = initCluster() - val role = ROLE_EXEC - val currentAllowList = genesis.node.getTrainingAllowList(role) + val role = NodeRole.EXEC.value + val currentAllowList = genesis.node.getTrainingAllowList(NodeRole.fromValue(role)) assertThat(currentAllowList).isEmpty() logSection("Adding genesis address to allow list") genesis.runProposal( @@ -156,7 +156,7 @@ class TrainingAllowListTests : TestermintTest() { role = role ) ) - val newAllowList = genesis.node.getTrainingAllowList(role) + val newAllowList = genesis.node.getTrainingAllowList(NodeRole.fromValue(role)) assertThat(newAllowList).hasSize(1) assertThat(newAllowList.first()).isEqualTo(genesis.node.getColdAddress()) logSection("Replacing entire address list") @@ -164,7 +164,7 @@ class TrainingAllowListTests : TestermintTest() { cluster, MsgSetTrainingAllowList(addresses = cluster.joinPairs.map { it.node.getColdAddress() }, role = role) ) - val replacedAllowList = genesis.node.getTrainingAllowList(role) + val replacedAllowList = genesis.node.getTrainingAllowList(NodeRole.fromValue(role)) assertThat(replacedAllowList).hasSize(cluster.joinPairs.size) assertThat(replacedAllowList).containsAll(cluster.joinPairs.map { it.node.getColdAddress() }) logSection("Removing join address from allow list") @@ -174,7 +174,7 @@ class TrainingAllowListTests : TestermintTest() { role = role ) ) - val finalAllowList = genesis.node.getTrainingAllowList(role) + val finalAllowList = genesis.node.getTrainingAllowList(NodeRole.fromValue(role)) assertThat(finalAllowList).doesNotContain(cluster.joinPairs.first().node.getColdAddress()) } diff --git a/testermint/src/test/kotlin/ValidationTests.kt b/testermint/src/test/kotlin/ValidationTests.kt index e3b5de8f7..ed622fcde 100644 --- a/testermint/src/test/kotlin/ValidationTests.kt +++ b/testermint/src/test/kotlin/ValidationTests.kt @@ -43,9 +43,7 @@ class ValidationTests : TestermintTest() { Logger.info("Statuses: $statuses") logSection("Verifying inference statuses") - assertThat(statuses.map { status -> - InferenceStatus.entries.first { it.value == status } - }).allMatch { + assertThat(statuses).allMatch { it == InferenceStatus.VALIDATED || it == InferenceStatus.FINISHED } assertThat(statuses).hasSize(requests) @@ -158,12 +156,8 @@ class ValidationTests : TestermintTest() { } } } - } -val InferencePayload.statusEnum: InferenceStatus - get() = InferenceStatus.entries.first { it.value == status } - fun getInferenceValidationState( highestFunded: LocalInferencePair, oddPair: LocalInferencePair, From e13d4c6589caceb3aa4c86b9703e4f590be5dec0 Mon Sep 17 00:00:00 2001 From: Gleb Morgachev Date: Sat, 21 Feb 2026 22:34:44 -0800 Subject: [PATCH 03/13] Missed Inferences (#785) --- decentralized-api/broker/lock_helpers.go | 35 ++++-- .../internal/server/public/server.go | 2 +- decentralized-api/poc/proof_client.go | 17 +-- decentralized-api/poc/proof_client_test.go | 101 ++++++++++++------ decentralized-api/poc/validator.go | 12 ++- deploy/join/docker-compose.yml | 10 +- 6 files changed, 120 insertions(+), 57 deletions(-) diff --git a/decentralized-api/broker/lock_helpers.go b/decentralized-api/broker/lock_helpers.go index eca4c741f..ac27bd89b 100644 --- a/decentralized-api/broker/lock_helpers.go +++ b/decentralized-api/broker/lock_helpers.go @@ -5,6 +5,7 @@ import ( "errors" "fmt" "net/http" + "net/url" "github.com/productscience/inference/x/inference/types" ) @@ -59,6 +60,11 @@ func NewApplicationActionError(err error) *ActionError { return &ActionError{Kind: ActionErrorApplication, Err: err} } +func isTimeoutError(err error) bool { + var urlErr *url.Error + return errors.As(err, &urlErr) && urlErr.Timeout() +} + // DoWithLockedNodeHTTPRetry is a convenience helper for HTTP calls under a node lock. // It centralizes retry and status re-check logic: // - Transport errors (no HTTP response) trigger status re-check, node skip and retry. @@ -131,17 +137,24 @@ func DoWithLockedNodeHTTPRetry( if aerr != nil { if aerr.Kind == ActionErrorTransport { - // Transport error: retry and recheck - retry = true - triggerRecheck = true - lastErr = fmt.Errorf("node %s transport failure: %w", node.Id, aerr) - logging.Info("HTTP retry helper: transport error from node", types.Inferences, - "attempt", attempts, - "node_id", node.Id, - "error_kind", aerr.Kind.String(), - "retry", retry, - "recheck", triggerRecheck, - "error", aerr.Err) + if isTimeoutError(aerr.Err) { + retry = false + triggerRecheck = true + lastErr = fmt.Errorf("node %s timeout: %w", node.Id, aerr) + logging.Info("HTTP retry helper: timeout (no retry)", types.Inferences, + "attempt", attempts, "node_id", node.Id, "error", aerr.Err) + } else { + retry = true + triggerRecheck = true + lastErr = fmt.Errorf("node %s transport failure: %w", node.Id, aerr) + logging.Info("HTTP retry helper: transport error from node", types.Inferences, + "attempt", attempts, + "node_id", node.Id, + "error_kind", aerr.Kind.String(), + "retry", retry, + "recheck", triggerRecheck, + "error", aerr.Err) + } } else { // Application error: do not retry retry = false diff --git a/decentralized-api/internal/server/public/server.go b/decentralized-api/internal/server/public/server.go index 108ad7cc3..bb14f6a5a 100644 --- a/decentralized-api/internal/server/public/server.go +++ b/decentralized-api/internal/server/public/server.go @@ -18,7 +18,7 @@ import ( echomw "github.com/labstack/echo/v4/middleware" ) -const httpClientTimeout = 5 * time.Minute +const httpClientTimeout = 20 * time.Minute type Server struct { e *echo.Echo diff --git a/decentralized-api/poc/proof_client.go b/decentralized-api/poc/proof_client.go index d3a773774..8b786c253 100644 --- a/decentralized-api/poc/proof_client.go +++ b/decentralized-api/poc/proof_client.go @@ -31,6 +31,8 @@ var ( ErrInvalidVectorData = errors.New("invalid vector data detected") ) +const DefaultKDim = 12 + // ProofClient fetches and verifies MMR proofs from participant APIs. type ProofClient struct { httpClient *http.Client @@ -183,8 +185,8 @@ func (c *ProofClient) FetchAndVerifyProofs( return nil, fmt.Errorf("invalid vector_bytes encoding for leaf %d: %w", item.LeafIndex, err) } - // Validate FP16 vector content - reject NaN/Infinity - if err := ValidateFP16Vector(vectorBytes); err != nil { + // Validate FP16 vector: must be exactly DefaultKDim values, no NaN/Infinity + if err := ValidateFP16Vector(vectorBytes, DefaultKDim); err != nil { logging.Warn("Invalid FP16 vector data", types.PoC, "participant", req.ParticipantAddress, "leafIndex", item.LeafIndex, "error", err) return nil, fmt.Errorf("%w: leaf %d: %v", ErrInvalidVectorData, item.LeafIndex, err) @@ -307,11 +309,12 @@ func buildLeafData(nonce int32, vector []byte) []byte { return buf } -// ValidateFP16Vector checks that all FP16 values in the vector are valid finite numbers. -// Returns error if any value is NaN, Infinity, or other invalid representation. -func ValidateFP16Vector(vectorBytes []byte) error { - if len(vectorBytes)%2 != 0 { - return fmt.Errorf("invalid vector length: %d bytes (must be even)", len(vectorBytes)) +// ValidateFP16Vector checks that the vector has exactly kDim FP16 values and all are valid finite numbers. +// Returns error if length doesn't match kDim*2 bytes, or any value is NaN or Infinity. +func ValidateFP16Vector(vectorBytes []byte, kDim int) error { + expectedLen := kDim * 2 + if len(vectorBytes) != expectedLen { + return fmt.Errorf("invalid vector length: got %d bytes, expected %d (kDim=%d)", len(vectorBytes), expectedLen, kDim) } for i := 0; i < len(vectorBytes); i += 2 { diff --git a/decentralized-api/poc/proof_client_test.go b/decentralized-api/poc/proof_client_test.go index eb902d8f8..f362c4fc5 100644 --- a/decentralized-api/poc/proof_client_test.go +++ b/decentralized-api/poc/proof_client_test.go @@ -139,10 +139,14 @@ func TestCheckDuplicateNonces_NegativeDuplicates(t *testing.T) { } func TestValidateFP16Vector_ValidVector(t *testing.T) { - // Construct valid FP16 values (no NaN/Infinity) - // Using values extracted from real vectors, excluding the NaN bytes - validBytes := []byte{0x26, 0x3b, 0x7f, 0x39, 0x66, 0x3a} // 3 valid FP16 values - assert.NoError(t, ValidateFP16Vector(validBytes)) + // Construct valid 12-element FP16 vector (DefaultKDim=12, so 24 bytes) + validBytes := make([]byte, DefaultKDim*2) + for i := 0; i < len(validBytes); i += 2 { + // 0x3c00 = 1.0 in FP16 + validBytes[i] = 0x00 + validBytes[i+1] = 0x3c + } + assert.NoError(t, ValidateFP16Vector(validBytes, DefaultKDim)) } func TestValidateFP16Vector_RealVectorsWithNaN(t *testing.T) { @@ -167,7 +171,7 @@ func TestValidateFP16Vector_RealVectorsWithNaN(t *testing.T) { vectorBytes, err := base64.StdEncoding.DecodeString(tc.b64) require.NoError(t, err) - err = ValidateFP16Vector(vectorBytes) + err = ValidateFP16Vector(vectorBytes, DefaultKDim) assert.Error(t, err) assert.Contains(t, err.Error(), "NaN") // Verify error reports correct byte offset @@ -178,70 +182,103 @@ func TestValidateFP16Vector_RealVectorsWithNaN(t *testing.T) { } func TestValidateFP16Vector_WithPositiveInfinity(t *testing.T) { - // 0x7c00 = +Infinity (exp=31, frac=0) - infBytes := []byte{0x00, 0x7c} - err := ValidateFP16Vector(infBytes) + // Build 12-element vector with +Infinity at position 0 + infBytes := make([]byte, DefaultKDim*2) + infBytes[0] = 0x00 + infBytes[1] = 0x7c // 0x7c00 = +Infinity (exp=31, frac=0) + err := ValidateFP16Vector(infBytes, DefaultKDim) assert.Error(t, err) assert.Contains(t, err.Error(), "Infinity") } func TestValidateFP16Vector_WithNegativeInfinity(t *testing.T) { - // 0xfc00 = -Infinity (exp=31, frac=0, sign=1) - negInfBytes := []byte{0x00, 0xfc} - err := ValidateFP16Vector(negInfBytes) + // Build 12-element vector with -Infinity at position 0 + negInfBytes := make([]byte, DefaultKDim*2) + negInfBytes[0] = 0x00 + negInfBytes[1] = 0xfc // 0xfc00 = -Infinity (exp=31, frac=0, sign=1) + err := ValidateFP16Vector(negInfBytes, DefaultKDim) assert.Error(t, err) assert.Contains(t, err.Error(), "Infinity") } -func TestValidateFP16Vector_OddLength(t *testing.T) { - // Odd byte count is invalid for FP16 vector - oddBytes := []byte{0x00, 0x3c, 0x00} - err := ValidateFP16Vector(oddBytes) +func TestValidateFP16Vector_WrongLength(t *testing.T) { + // Vector with wrong number of elements (3 instead of 12) + shortBytes := []byte{0x00, 0x3c, 0x00, 0x3c, 0x00, 0x3c} // 3 valid FP16 values + err := ValidateFP16Vector(shortBytes, DefaultKDim) assert.Error(t, err) - assert.Contains(t, err.Error(), "must be even") + assert.Contains(t, err.Error(), "invalid vector length") + assert.Contains(t, err.Error(), "got 6 bytes") + assert.Contains(t, err.Error(), "expected 24") } func TestValidateFP16Vector_Empty(t *testing.T) { - assert.NoError(t, ValidateFP16Vector(nil)) - assert.NoError(t, ValidateFP16Vector([]byte{})) + // Empty vectors should fail with length mismatch + err := ValidateFP16Vector(nil, DefaultKDim) + assert.Error(t, err) + assert.Contains(t, err.Error(), "invalid vector length") + assert.Contains(t, err.Error(), "got 0 bytes") + + err = ValidateFP16Vector([]byte{}, DefaultKDim) + assert.Error(t, err) + assert.Contains(t, err.Error(), "invalid vector length") } func TestValidateFP16Vector_QuietNaN(t *testing.T) { + // Build 12-element vector with quiet NaN at position 0 // 0x7e00 = quiet NaN (exp=31, frac=512) - the exact value found in all_nonces.json - qnanBytes := []byte{0x00, 0x7e} - err := ValidateFP16Vector(qnanBytes) + qnanBytes := make([]byte, DefaultKDim*2) + qnanBytes[0] = 0x00 + qnanBytes[1] = 0x7e + err := ValidateFP16Vector(qnanBytes, DefaultKDim) assert.Error(t, err) assert.Contains(t, err.Error(), "NaN") assert.Contains(t, err.Error(), "0x7e00") } func TestValidateFP16Vector_SignalingNaN(t *testing.T) { + // Build 12-element vector with signaling NaN at position 0 // 0x7c01 = signaling NaN (exp=31, frac=1) - snanBytes := []byte{0x01, 0x7c} - err := ValidateFP16Vector(snanBytes) + snanBytes := make([]byte, DefaultKDim*2) + snanBytes[0] = 0x01 + snanBytes[1] = 0x7c + err := ValidateFP16Vector(snanBytes, DefaultKDim) assert.Error(t, err) assert.Contains(t, err.Error(), "NaN") } func TestValidateFP16Vector_NegativeNaN(t *testing.T) { + // Build 12-element vector with negative quiet NaN at position 0 // 0xfe00 = negative quiet NaN (sign=1, exp=31, frac=512) - negNanBytes := []byte{0x00, 0xfe} - err := ValidateFP16Vector(negNanBytes) + negNanBytes := make([]byte, DefaultKDim*2) + negNanBytes[0] = 0x00 + negNanBytes[1] = 0xfe + err := ValidateFP16Vector(negNanBytes, DefaultKDim) assert.Error(t, err) assert.Contains(t, err.Error(), "NaN") } func TestValidateFP16Vector_ValidWithSubnormals(t *testing.T) { // Subnormal values (exp=0, frac!=0) should be allowed - they are valid small numbers + subnormalBytes := make([]byte, DefaultKDim*2) // 0x0001 = smallest positive subnormal - subnormalBytes := []byte{0x01, 0x00, 0xff, 0x03} // two subnormals - assert.NoError(t, ValidateFP16Vector(subnormalBytes)) + subnormalBytes[0] = 0x01 + subnormalBytes[1] = 0x00 + // 0x03ff = largest positive subnormal + subnormalBytes[2] = 0xff + subnormalBytes[3] = 0x03 + assert.NoError(t, ValidateFP16Vector(subnormalBytes, DefaultKDim)) } func TestValidateFP16Vector_ValidZero(t *testing.T) { // 0x0000 = +0, 0x8000 = -0 - both are valid - zeroBytes := []byte{0x00, 0x00, 0x00, 0x80} - assert.NoError(t, ValidateFP16Vector(zeroBytes)) + zeroBytes := make([]byte, DefaultKDim*2) + // Position 0: +0 + zeroBytes[0] = 0x00 + zeroBytes[1] = 0x00 + // Position 1: -0 + zeroBytes[2] = 0x00 + zeroBytes[3] = 0x80 + assert.NoError(t, ValidateFP16Vector(zeroBytes, DefaultKDim)) } // TestErrInvalidVectorData_ErrorWrapping verifies that ErrInvalidVectorData is properly @@ -250,7 +287,11 @@ func TestValidateFP16Vector_ValidZero(t *testing.T) { func TestErrInvalidVectorData_ErrorWrapping(t *testing.T) { // Simulate what FetchAndVerifyProofs does when it detects invalid vector data leafIndex := uint32(42) - validationErr := ValidateFP16Vector([]byte{0x00, 0x7e}) // NaN + // Build 12-element vector with NaN at position 0 + nanBytes := make([]byte, DefaultKDim*2) + nanBytes[0] = 0x00 + nanBytes[1] = 0x7e // quiet NaN + validationErr := ValidateFP16Vector(nanBytes, DefaultKDim) wrappedErr := fmt.Errorf("%w: leaf %d: %v", ErrInvalidVectorData, leafIndex, validationErr) // This is exactly how validateParticipant checks for permanent failures @@ -347,7 +388,7 @@ func TestFetchAndVerifyProofs_RejectsNaNVector(t *testing.T) { require.NoError(t, err) // This is what FetchAndVerifyProofs does internally - err = ValidateFP16Vector(vectorBytes) + err = ValidateFP16Vector(vectorBytes, DefaultKDim) assert.Error(t, err) assert.Contains(t, err.Error(), "NaN") diff --git a/decentralized-api/poc/validator.go b/decentralized-api/poc/validator.go index fd13b20ef..acb5d0225 100644 --- a/decentralized-api/poc/validator.go +++ b/decentralized-api/poc/validator.go @@ -385,7 +385,7 @@ func (v *OffChainValidator) worker( *pendingCount-- // Report participant as invalid to chain // Uncomment when stabilized - // reportAddr = work.address + reportAddr = work.address case validateFailRetry: // Re-queue for retry if under max attempts if work.attempt < v.config.MaxRetries-1 { @@ -700,8 +700,8 @@ func (v *OffChainValidator) getNodesWithRetryConfig( // filterNodesForValidation returns nodes available for PoC validation. // - Accept nodes in POC status with any sub-status -// - Accept nodes in INFERENCE status -// - Exclude FAILED or administratively disabled nodes +// - Accept nodes in INFERENCE status (unless preserved for inference via POC_SLOT) +// - Exclude FAILED, administratively disabled, or POC_SLOT-preserved nodes func filterNodesForValidation(nodes []broker.NodeResponse) []broker.NodeResponse { filtered := make([]broker.NodeResponse, 0, len(nodes)) for _, node := range nodes { @@ -723,6 +723,12 @@ func filterNodesForValidation(nodes []broker.NodeResponse) []broker.NodeResponse continue } + // Exclude nodes preserved for inference (POC_SLOT allocation) + if node.State.ShouldContinueInference() { + logging.Debug("filterNodesForValidation: Skipping node preserved for inference", types.PoC, "node_id", node.Node.Id) + continue + } + // Accept nodes in POC status (any sub-status) if node.State.CurrentStatus == types.HardwareNodeStatus_POC { filtered = append(filtered, node) diff --git a/deploy/join/docker-compose.yml b/deploy/join/docker-compose.yml index 548913d49..6fce7aca0 100644 --- a/deploy/join/docker-compose.yml +++ b/deploy/join/docker-compose.yml @@ -1,6 +1,6 @@ services: tmkms: - image: ghcr.io/product-science/tmkms-softsign-with-keygen:0.2.10 + image: ghcr.io/product-science/tmkms-softsign-with-keygen:0.2.10-post3 container_name: tmkms restart: unless-stopped environment: @@ -10,7 +10,7 @@ services: node: container_name: node - image: ghcr.io/product-science/inferenced:0.2.10 + image: ghcr.io/product-science/inferenced:0.2.10-post3 command: ["sh", "./init-docker.sh"] volumes: - .inference:/root/.inference @@ -44,7 +44,7 @@ services: api: container_name: api - image: ghcr.io/product-science/api:0.2.10 + image: ghcr.io/product-science/api:0.2.10-post3 volumes: - .inference:/root/.inference - .dapi:/root/.dapi @@ -99,7 +99,7 @@ services: proxy: container_name: proxy - image: ghcr.io/product-science/proxy:0.2.10 + image: ghcr.io/product-science/proxy:0.2.10-post3 ports: - "${API_PORT:-8000}:80" - "${API_SSL_PORT:-8443}:443" @@ -145,7 +145,7 @@ services: proxy-ssl: container_name: proxy-ssl - image: ghcr.io/product-science/proxy-ssl:0.2.10 + image: ghcr.io/product-science/proxy-ssl:0.2.10-post3 profiles: - ssl environment: From 851c4275eeacc11b972367a7c0527b83a72d69c6 Mon Sep 17 00:00:00 2001 From: Gleb Morgachev Date: Tue, 24 Feb 2026 21:20:24 -0800 Subject: [PATCH 04/13] disable fastnode by default (#799) * disable fastnode * bump container --- deploy/join/docker-compose.yml | 10 +++++----- inference-chain/scripts/init-docker.sh | 3 +++ 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/deploy/join/docker-compose.yml b/deploy/join/docker-compose.yml index 6fce7aca0..de3fb6869 100644 --- a/deploy/join/docker-compose.yml +++ b/deploy/join/docker-compose.yml @@ -1,6 +1,6 @@ services: tmkms: - image: ghcr.io/product-science/tmkms-softsign-with-keygen:0.2.10-post3 + image: ghcr.io/product-science/tmkms-softsign-with-keygen:0.2.10-post4 container_name: tmkms restart: unless-stopped environment: @@ -10,7 +10,7 @@ services: node: container_name: node - image: ghcr.io/product-science/inferenced:0.2.10-post3 + image: ghcr.io/product-science/inferenced:0.2.10-post4 command: ["sh", "./init-docker.sh"] volumes: - .inference:/root/.inference @@ -44,7 +44,7 @@ services: api: container_name: api - image: ghcr.io/product-science/api:0.2.10-post3 + image: ghcr.io/product-science/api:0.2.10-post4 volumes: - .inference:/root/.inference - .dapi:/root/.dapi @@ -99,7 +99,7 @@ services: proxy: container_name: proxy - image: ghcr.io/product-science/proxy:0.2.10-post3 + image: ghcr.io/product-science/proxy:0.2.10-post4 ports: - "${API_PORT:-8000}:80" - "${API_SSL_PORT:-8443}:443" @@ -145,7 +145,7 @@ services: proxy-ssl: container_name: proxy-ssl - image: ghcr.io/product-science/proxy-ssl:0.2.10-post3 + image: ghcr.io/product-science/proxy-ssl:0.2.10-post4 profiles: - ssl environment: diff --git a/inference-chain/scripts/init-docker.sh b/inference-chain/scripts/init-docker.sh index 3fc517041..0e76a9009 100755 --- a/inference-chain/scripts/init-docker.sh +++ b/inference-chain/scripts/init-docker.sh @@ -223,6 +223,9 @@ update_configs kv app state-sync.snapshot-interval "$SNAPSHOT_INTERVAL" kv app state-sync.snapshot-keep-recent "$SNAPSHOT_KEEP_RECENT" +# Disable IAVL fast node: cause failed state sync +kv app iavl-disable-fastnode true + # CONFIG_* environment overrides ---------------------------------------------- ( From 205b2088578727435cbd21f215e1a237cc894061 Mon Sep 17 00:00:00 2001 From: Tamaz Gadaev Date: Thu, 26 Feb 2026 02:49:26 +0000 Subject: [PATCH 05/13] validation scripts and readmes Made-with: Cursor --- .../analysis/inference_length_vs_distance.py | 361 +++++++++++++++ .../scripts/analysis/poc_l2_histogram.py | 228 +++++++++ .../scripts/inference_validation/README.md | 116 +++++ .../scripts/inference_validation/inference.py | 265 +++++++++++ .../inference_validation/validation.py | 300 ++++++++++++ .../scripts/poc_validation/README.md | 147 ++++++ .../scripts/poc_validation/collect_data.py | 433 ++++++++++++++++++ .../scripts/poc_validation/config.json | 13 + 8 files changed, 1863 insertions(+) create mode 100644 mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py create mode 100644 mlnode/packages/benchmarks/scripts/analysis/poc_l2_histogram.py create mode 100644 mlnode/packages/benchmarks/scripts/inference_validation/README.md create mode 100644 mlnode/packages/benchmarks/scripts/inference_validation/inference.py create mode 100644 mlnode/packages/benchmarks/scripts/inference_validation/validation.py create mode 100644 mlnode/packages/benchmarks/scripts/poc_validation/README.md create mode 100644 mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py create mode 100644 mlnode/packages/benchmarks/scripts/poc_validation/config.json diff --git a/mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py b/mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py new file mode 100644 index 000000000..b0c9b24ce --- /dev/null +++ b/mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py @@ -0,0 +1,361 @@ +#!/usr/bin/env python3 +""" +Plot honest-vs-fraud Length vs Distance scatter for inference validation runs. + +Scans benchmarks/data/inference_validation/ for experiment directories, loads +inference_validation_results.jsonl from each, computes distances using +validation.analysis.process_data, optionally finds optimal bounds, and produces +a combined scatter plot (like the qwen235B_thresholds notebook). + +Honest vs fraud is determined automatically: if inference and validation models +match (from the config JSONs), the run is honest; otherwise it is fraud. + +Usage: + # Auto-detect all runs under data/inference_validation/: + python scripts/analysis/inference_length_vs_distance.py + + # Specify explicit experiment dirs (--honest / --fraud): + python scripts/analysis/inference_length_vs_distance.py \ + --honest data/inference_validation/exp_honest__2026-02-26_010603 \ + --fraud data/inference_validation/exp_fraud__2026-02-26_020000 + + # Limit number of items loaded per run: + python scripts/analysis/inference_length_vs_distance.py --n-items 500 + + # Compute optimal bounds (requires both honest and fraud data): + python scripts/analysis/inference_length_vs_distance.py --find-bounds + + # Supply pre-computed bounds: + python scripts/analysis/inference_length_vs_distance.py \ + --lower-bound 0.040733 --upper-bound 0.041733 + + # Change output directory: + python scripts/analysis/inference_length_vs_distance.py --out data/plots +""" + +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +BENCHMARKS_DIR = Path(__file__).resolve().parents[2] +sys.path.insert(0, str(BENCHMARKS_DIR / "src")) +sys.path.insert(0, str(BENCHMARKS_DIR.parent / "common" / "src")) + +import numpy as np +import matplotlib.pyplot as plt +from matplotlib.lines import Line2D + +from validation.data import load_from_jsonl, ValidationItem +from validation.analysis import process_data, find_optimal_bounds_parallel + +DATA_ROOT = BENCHMARKS_DIR / "data" / "inference_validation" +DEFAULT_PLOTS_DIR = BENCHMARKS_DIR / "data" / "plots" + + +def resolve_path(raw: str) -> Path: + p = Path(raw) + if p.is_absolute() and p.is_dir(): + return p + for candidate in [Path.cwd() / p, BENCHMARKS_DIR / p]: + if candidate.is_dir(): + return candidate.resolve() + return p.resolve() + + +def _is_honest(exp_dir: Path) -> Optional[bool]: + """Determine honesty from validation_config + inference_config model names.""" + inf_cfg = exp_dir / "inference_config.json" + val_cfg = exp_dir / "validation_config.json" + if not inf_cfg.exists() or not val_cfg.exists(): + return None + try: + inf = json.loads(inf_cfg.read_text()) + val = json.loads(val_cfg.read_text()) + inf_model = inf.get("model_info", {}).get("name", "") + val_model = val.get("validation_model_info", {}).get("name", "") + if not inf_model or not val_model: + return None + return inf_model == val_model + except Exception: + return None + + +def _make_label(exp_dir: Path) -> str: + return exp_dir.name + + +def discover_experiments() -> Tuple[Dict[str, Path], Dict[str, Path]]: + honest: Dict[str, Path] = {} + fraud: Dict[str, Path] = {} + if not DATA_ROOT.exists(): + return honest, fraud + for d in sorted(DATA_ROOT.iterdir()): + if not d.is_dir(): + continue + jsonl = d / "inference_validation_results.jsonl" + if not jsonl.exists(): + continue + h = _is_honest(d) + label = _make_label(d) + if h is True: + honest[label] = d + elif h is False: + fraud[label] = d + else: + honest[label] = d + return honest, fraud + + +def load_experiment( + exp_dir: Path, n: Optional[int] = None +) -> Tuple[List[ValidationItem], List[float], List[float]]: + jsonl = exp_dir / "inference_validation_results.jsonl" + items = load_from_jsonl(str(jsonl), n=n) + items, distances, topk = process_data(items) + return items, distances, topk + + +def plot_length_vs_distance( + title: str, + honest_items_dict: Dict[str, List[ValidationItem]], + honest_distances_dict: Dict[str, List[float]], + fraud_items_dict: Dict[str, List[ValidationItem]], + fraud_distances_dict: Dict[str, List[float]], + bounds: Optional[Tuple[float, float]] = None, + save_to: Optional[Path] = None, +) -> None: + """Standalone version of the notebook's plot_length_vs_distance_comparison.""" + honest_keys = list(honest_items_dict.keys()) + fraud_keys = list(fraud_items_dict.keys()) + + honest_lengths: Dict[str, List[int]] = { + k: [len(item.inference_result.text) for item in honest_items_dict[k]] + for k in honest_keys + } + fraud_lengths: Dict[str, List[int]] = { + k: [len(item.inference_result.text) for item in fraud_items_dict[k]] + for k in fraud_keys + } + + fig, ax = plt.subplots(figsize=(12, 7)) + marker_size = 36 + + honest_palette = ["#0B3D91", "#87CEFA", "#20B2AA"] + fraud_palette_fn = lambda n: [plt.cm.Reds(v) for v in np.linspace(0.8, 0.4, max(1, n))] + + honest_colors = {k: honest_palette[i % len(honest_palette)] for i, k in enumerate(honest_keys)} + fraud_colors = {k: fraud_palette_fn(len(fraud_keys))[i] for i, k in enumerate(fraud_keys)} + + fixed_marker_map = {"sp": "^", "en": "o", "ch": "s", "ar": "D", "hi": "P"} + fallback_markers = ["v", "*", "X", "h", "<", ">", "1", "2", "3", "4"] + + def _norm_lang(item: ValidationItem) -> str: + return str(getattr(item, "language", None) or "unk") + + all_langs_ordered: List[str] = [] + seen: set = set() + for k in honest_keys: + for item in honest_items_dict[k]: + lang = _norm_lang(item) + if lang not in seen: + seen.add(lang) + all_langs_ordered.append(lang) + for k in fraud_keys: + for item in fraud_items_dict[k]: + lang = _norm_lang(item) + if lang not in seen: + seen.add(lang) + all_langs_ordered.append(lang) + + marker_map = dict(fixed_marker_map) + unknown_idx = 0 + for lang in all_langs_ordered: + if lang not in marker_map: + marker_map[lang] = fallback_markers[unknown_idx % len(fallback_markers)] + unknown_idx += 1 + + def _scatter_group(keys, items_dict, lengths_dict, distances_dict, color_map): + for k in keys: + langs = [_norm_lang(item) for item in items_dict[k]] + xs = lengths_dict[k] + ys = distances_dict[k] + color = color_map[k] + for lang in all_langs_ordered: + idxs = [i for i, l in enumerate(langs) if l == lang] + if not idxs: + continue + ax.scatter( + [xs[i] for i in idxs], + [ys[i] for i in idxs], + c=color, + marker=marker_map.get(lang, "o"), + alpha=0.6, + s=marker_size, + ) + + _scatter_group(honest_keys, honest_items_dict, honest_lengths, honest_distances_dict, honest_colors) + _scatter_group(fraud_keys, fraud_items_dict, fraud_lengths, fraud_distances_dict, fraud_colors) + + if bounds is not None: + lower, upper = bounds + ax.axhline(lower, color="blue", linestyle="--", linewidth=1.5) + ax.axhline(upper, color="purple", linestyle="--", linewidth=1.5) + + group_handles = [] + for k in honest_keys: + group_handles.append( + Line2D([0], [0], marker="o", color=honest_colors[k], linestyle="None", markersize=8, + label=f"Honest - {k}") + ) + for k in fraud_keys: + group_handles.append( + Line2D([0], [0], marker="o", color=fraud_colors[k], linestyle="None", markersize=8, + label=f"Fraud - {k}") + ) + legend1 = ax.legend(handles=group_handles, title="Groups", loc="upper left", fontsize=8) + ax.add_artist(legend1) + + language_name_map = {"sp": "Spanish", "en": "English", "ch": "Chinese", "ar": "Arabic", "hi": "Hindi", "unk": "Unknown"} + lang_handles = [ + Line2D([0], [0], marker=marker_map[lang], color="black", linestyle="None", markersize=8, + label=language_name_map.get(lang, lang)) + for lang in all_langs_ordered + if lang in marker_map + ] + if lang_handles: + legend2 = ax.legend(handles=lang_handles, title="Languages", loc="upper right", fontsize=8) + ax.add_artist(legend2) + + if bounds is not None: + lower, upper = bounds + bounds_handles = [ + Line2D([0], [0], color="blue", linestyle="--", linewidth=2, label=f"Lower: {lower:.6f}"), + Line2D([0], [0], color="purple", linestyle="--", linewidth=2, label=f"Upper: {upper:.6f}"), + ] + ax.legend(handles=bounds_handles, title="Bounds", loc="lower right", fontsize=8) + + ax.set_title(f"{title} - Length vs Distance Comparison", fontsize=14) + ax.set_xlabel("Length (characters)", fontsize=12) + ax.set_ylabel("Distance", fontsize=12) + ax.grid(True, alpha=0.3) + fig.tight_layout() + + if save_to is not None: + save_to.mkdir(parents=True, exist_ok=True) + safe = title.strip().replace(" ", "_").replace("/", "_").replace("\\", "_") or "comparison" + filepath = save_to / f"{safe}_length_vs_distance.png" + fig.savefig(filepath, dpi=300, bbox_inches="tight") + print(f"Saved plot to: {filepath}") + else: + plt.show() + + plt.close(fig) + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Plot Length vs Distance for inference validation experiments" + ) + parser.add_argument("--honest", type=str, nargs="*", default=None, + help="Paths to honest experiment directories") + parser.add_argument("--fraud", type=str, nargs="*", default=None, + help="Paths to fraud experiment directories") + parser.add_argument("--title", type=str, default=None, + help="Plot title (default: auto-generated)") + parser.add_argument("--n-items", type=int, default=None, + help="Max items to load per experiment") + parser.add_argument("--find-bounds", action="store_true", + help="Run F1-optimal bound search (requires honest + fraud)") + parser.add_argument("--lower-bound", type=float, default=None, + help="Pre-computed lower bound") + parser.add_argument("--upper-bound", type=float, default=None, + help="Pre-computed upper bound") + parser.add_argument("--out", type=str, default=None, + help=f"Output directory for plots (default: {DEFAULT_PLOTS_DIR})") + args = parser.parse_args() + + if args.honest is not None or args.fraud is not None: + honest_dirs = {_make_label(resolve_path(p)): resolve_path(p) for p in (args.honest or [])} + fraud_dirs = {_make_label(resolve_path(p)): resolve_path(p) for p in (args.fraud or [])} + else: + honest_dirs, fraud_dirs = discover_experiments() + + if not honest_dirs and not fraud_dirs: + print(f"Error: no experiment directories found under {DATA_ROOT}") + sys.exit(1) + + print(f"Honest experiments ({len(honest_dirs)}):") + for name in honest_dirs: + print(f" - {name}") + print(f"Fraud experiments ({len(fraud_dirs)}):") + for name in fraud_dirs: + print(f" - {name}") + print() + + honest_items_dict: Dict[str, List] = {} + honest_distances_dict: Dict[str, List] = {} + fraud_items_dict: Dict[str, List] = {} + fraud_distances_dict: Dict[str, List] = {} + + all_honest_distances: List[float] = [] + all_fraud_distances: List[float] = [] + + for name, d in honest_dirs.items(): + print(f"Loading honest: {name}") + items, distances, _ = load_experiment(d, args.n_items) + honest_items_dict[name] = items + honest_distances_dict[name] = distances + all_honest_distances.extend(distances) + + for name, d in fraud_dirs.items(): + print(f"Loading fraud: {name}") + items, distances, _ = load_experiment(d, args.n_items) + fraud_items_dict[name] = items + fraud_distances_dict[name] = distances + all_fraud_distances.extend(distances) + + bounds = None + if args.lower_bound is not None and args.upper_bound is not None: + bounds = (args.lower_bound, args.upper_bound) + print(f"\nUsing pre-computed bounds: lower={bounds[0]:.6f}, upper={bounds[1]:.6f}") + elif args.find_bounds: + if not all_honest_distances or not all_fraud_distances: + print("Error: --find-bounds requires both honest and fraud data") + sys.exit(1) + print("\nSearching for optimal bounds...") + lower, upper = find_optimal_bounds_parallel( + np.array(all_honest_distances), np.array(all_fraud_distances) + ) + bounds = (lower, upper) + + title = args.title or "Inference Validation" + plots_dir = Path(args.out) if args.out else DEFAULT_PLOTS_DIR + + plot_length_vs_distance( + title=title, + honest_items_dict=honest_items_dict, + honest_distances_dict=honest_distances_dict, + fraud_items_dict=fraud_items_dict, + fraud_distances_dict=fraud_distances_dict, + bounds=bounds, + save_to=plots_dir, + ) + + if all_honest_distances: + h = np.array(all_honest_distances) + print(f"\nHonest distances: n={len(h)}, mean={h.mean():.6f}, " + f"median={np.median(h):.6f}, max={h.max():.6f}") + if all_fraud_distances: + f = np.array(all_fraud_distances) + print(f"Fraud distances: n={len(f)}, mean={f.mean():.6f}, " + f"median={np.median(f):.6f}, max={f.max():.6f}") + + print("\nDone.") + + +if __name__ == "__main__": + main() diff --git a/mlnode/packages/benchmarks/scripts/analysis/poc_l2_histogram.py b/mlnode/packages/benchmarks/scripts/analysis/poc_l2_histogram.py new file mode 100644 index 000000000..7543af0bb --- /dev/null +++ b/mlnode/packages/benchmarks/scripts/analysis/poc_l2_histogram.py @@ -0,0 +1,228 @@ +#!/usr/bin/env python3 +""" +Compute pairwise L2 distances between PoC vectors from two runs and plot histograms. + +Scans benchmarks/data/poc_calidation/ for run directories, pairs them up by +server name, matches nonces, and plots the L2 distance distribution with a +configurable percentile threshold line (like the reference "Honest distribution ++ threshold" plot). + +Usage: + # Auto-detect the two most recent runs and compare all common servers: + python scripts/analysis/poc_l2_histogram.py + + # Compare two specific run directories: + python scripts/analysis/poc_l2_histogram.py \ + --run-a data/poc_calidation/poc_validation_2026-02-25_205141 \ + --run-b data/poc_calidation/poc_validation_2026-02-25_205330 + + # Change threshold percentile (default p98): + python scripts/analysis/poc_l2_histogram.py --percentile 95 + + # Specify output directory: + python scripts/analysis/poc_l2_histogram.py --out data/plots +""" + +from __future__ import annotations + +import argparse +import json +import sys +from pathlib import Path +from typing import Dict, List, Optional, Tuple + +import matplotlib.pyplot as plt +import numpy as np + +BENCHMARKS_DIR = Path(__file__).resolve().parents[2] +DATA_ROOT = BENCHMARKS_DIR / "data" / "poc_calidation" +DEFAULT_PLOTS_DIR = BENCHMARKS_DIR / "data" / "plots" + + +def load_run(run_dir: Path) -> Dict[str, Dict]: + """Load all artifact files from a run directory. + + Returns {server_name: {"nonces": [...], "vectors": [...], ...}} + """ + results: Dict[str, Dict] = {} + for fpath in sorted(run_dir.glob("*.json")): + if fpath.name in ("run_config.json", "config.json"): + continue + try: + data = json.loads(fpath.read_text(encoding="utf-8")) + except Exception: + continue + if "error" in data or "vectors" not in data: + continue + name = data.get("server_name", fpath.stem) + results[name] = data + return results + + +def match_vectors( + data_a: Dict, data_b: Dict +) -> Tuple[np.ndarray, np.ndarray, List[int]]: + """Find common nonces and return aligned vector arrays.""" + nonce_to_vec_a = {n: v for n, v in zip(data_a["nonces"], data_a["vectors"]) if v is not None} + nonce_to_vec_b = {n: v for n, v in zip(data_b["nonces"], data_b["vectors"]) if v is not None} + + common = sorted(set(nonce_to_vec_a) & set(nonce_to_vec_b)) + if not common: + return np.array([]), np.array([]), [] + + vecs_a = np.array([nonce_to_vec_a[n] for n in common], dtype=np.float32) + vecs_b = np.array([nonce_to_vec_b[n] for n in common], dtype=np.float32) + return vecs_a, vecs_b, common + + +def compute_l2(vecs_a: np.ndarray, vecs_b: np.ndarray) -> np.ndarray: + return np.linalg.norm(vecs_a - vecs_b, axis=1) + + +def find_recent_runs(n: int = 2) -> List[Path]: + """Return the *n* most recent run directories under DATA_ROOT.""" + if not DATA_ROOT.exists(): + return [] + dirs = sorted( + [d for d in DATA_ROOT.iterdir() if d.is_dir()], + key=lambda d: d.name, + reverse=True, + ) + return dirs[:n] + + +def resolve_run_path(raw: str) -> Path: + """Resolve a run path that may be relative to CWD or BENCHMARKS_DIR.""" + p = Path(raw) + if p.is_absolute() and p.is_dir(): + return p + candidates = [Path.cwd() / p, BENCHMARKS_DIR / p] + for c in candidates: + if c.is_dir(): + return c.resolve() + return p.resolve() + + +def plot_histogram( + distances: np.ndarray, + percentile: float, + server_name: str, + run_a_name: str, + run_b_name: str, + out_path: Path, +) -> None: + threshold = float(np.percentile(distances, percentile)) + + fig, ax = plt.subplots(figsize=(10, 6)) + ax.hist(distances, bins=60, color="#5cb85c", edgecolor="#4a9a4a", alpha=0.9, + label=f"Honest pairs (same-marker)") + ax.axvline(threshold, color="red", linestyle="--", linewidth=2, + label=f"p{int(percentile)}: {threshold:.4f}") + ax.set_xlabel("L2 Distance", fontsize=13) + ax.set_ylabel("Count", fontsize=13) + ax.set_title("Honest distribution + threshold", fontsize=14) + ax.legend(fontsize=12) + ax.tick_params(labelsize=11) + fig.tight_layout() + fig.savefig(out_path, dpi=150) + plt.close(fig) + + print(f" [{server_name}] {len(distances)} pairs | " + f"mean={distances.mean():.4f} median={np.median(distances):.4f} " + f"p{int(percentile)}={threshold:.4f} max={distances.max():.4f}") + print(f" -> {out_path}") + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Plot L2 distance histograms between two PoC validation runs" + ) + parser.add_argument("--run-a", type=str, default=None, + help="Path to first run directory") + parser.add_argument("--run-b", type=str, default=None, + help="Path to second run directory") + parser.add_argument("--percentile", type=float, default=98, + help="Threshold percentile for the dashed line (default: 98)") + parser.add_argument("--out", type=str, default=None, + help=f"Output directory for plots (default: {DEFAULT_PLOTS_DIR})") + parser.add_argument("--server", type=str, default=None, + help="Only plot for this server name (default: all common servers)") + args = parser.parse_args() + + if args.run_a and args.run_b: + run_a = resolve_run_path(args.run_a) + run_b = resolve_run_path(args.run_b) + elif args.run_a or args.run_b: + parser.error("Specify both --run-a and --run-b, or neither (auto-detect)") + else: + recent = find_recent_runs(2) + if len(recent) < 2: + print(f"Error: need at least 2 run directories under {DATA_ROOT}") + sys.exit(1) + run_a, run_b = recent[1], recent[0] + + for label, d in [("run-a", run_a), ("run-b", run_b)]: + if not d.is_dir(): + print(f"Error: {label} directory not found: {d}") + sys.exit(1) + + plots_dir = Path(args.out) if args.out else DEFAULT_PLOTS_DIR + plots_dir.mkdir(parents=True, exist_ok=True) + + print(f"Run A: {run_a.name}") + print(f"Run B: {run_b.name}") + print(f"Percentile: p{int(args.percentile)}") + print(f"Output: {plots_dir}\n") + + data_a = load_run(run_a) + data_b = load_run(run_b) + + if not data_a: + print(f"Error: no valid artifact files in run A ({run_a})") + sys.exit(1) + if not data_b: + print(f"Error: no valid artifact files in run B ({run_b})") + sys.exit(1) + + common_servers = sorted(set(data_a) & set(data_b)) + if args.server: + if args.server not in common_servers: + print(f"Error: server '{args.server}' not found in both runs. " + f"Common servers: {common_servers}") + sys.exit(1) + common_servers = [args.server] + + if common_servers: + print(f"Comparing servers: {common_servers}\n") + for server in common_servers: + vecs_a, vecs_b, nonces = match_vectors(data_a[server], data_b[server]) + if len(nonces) == 0: + print(f" [{server}] no common nonces, skipping") + continue + + dists = compute_l2(vecs_a, vecs_b) + fname = f"l2_hist_{server}_{run_a.name}_vs_{run_b.name}.png" + plot_histogram(dists, args.percentile, server, + run_a.name, run_b.name, plots_dir / fname) + else: + servers_a = list(data_a.keys()) + servers_b = list(data_b.keys()) + print(f"No common server names (A={servers_a}, B={servers_b}), " + f"cross-comparing first server from each run.\n") + sa, sb = servers_a[0], servers_b[0] + vecs_a, vecs_b, nonces = match_vectors(data_a[sa], data_b[sb]) + if len(nonces) == 0: + print(f" [{sa} vs {sb}] no common nonces") + sys.exit(1) + + dists = compute_l2(vecs_a, vecs_b) + label = f"{sa}_vs_{sb}" + fname = f"l2_hist_{label}_{run_a.name}_vs_{run_b.name}.png" + plot_histogram(dists, args.percentile, label, + run_a.name, run_b.name, plots_dir / fname) + + print("\nDone.") + + +if __name__ == "__main__": + main() diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/README.md b/mlnode/packages/benchmarks/scripts/inference_validation/README.md new file mode 100644 index 000000000..5f5fa5c2a --- /dev/null +++ b/mlnode/packages/benchmarks/scripts/inference_validation/README.md @@ -0,0 +1,116 @@ +# Inference + Validation Scripts + +This folder contains a 2-step benchmark flow for an **already running OpenAI-compatible vLLM server**. + +The flow is split into: + +1. `inference.py` - run **inference only** and save a pure inference artifact. +2. `validation.py` - take inference artifact, run **validation only**, and save combined results. + +## What These Scripts Do + +### `inference.py` + +- Requires `--exp-name`. +- Connects to an already running vLLM endpoint (`--url`). +- Waits for server readiness via `/v1/models`. +- Resolves model id from served models (or uses `--model` if provided and available). +- Runs inference on prompts and stores: + - pure inference rows (`inference_results.jsonl`) + - inference config + vLLM runtime probe (`inference_config.json`) + +### `validation.py` + +- Reads `inference_results.jsonl` from an existing experiment folder. +- Connects to validation vLLM endpoint (`--validation-url`). +- Re-runs validation with enforced tokens from stored inference results. +- Saves: + - combined inference+validation rows (`inference_validation_results.jsonl`) + - validation config + runtime probe (`validation_config.json`) +- Compares inference config/runtime fields with validation config/runtime fields. + - If different, prints warnings and continues. + - Execution is not interrupted. + +## Artifact Structure + +Artifacts are created under: + +`benchmarks/data/inference_validation/__/` + +Each experiment folder contains: + +- `inference_config.json` +- `validation_config.json` +- `inference_results.jsonl` +- `inference_validation_results.jsonl` + +## JSONL Row Schemas + +### `inference_results.jsonl` + +Each line includes: + +- `prompt` +- `language` +- `inference_result` +- `inference_model` +- `request_params` +- `metadata` + +### `inference_validation_results.jsonl` + +Each line includes: + +- `prompt` +- `inference_result` +- `validation_result` +- `inference_model` +- `validation_model` +- `request_params` + +## Usage + +Run from repository root (or adjust paths). + +### 1) Run Inference + +```bash +python3 mlnode/packages/benchmarks/scripts/inference_validation/inference.py \ + --exp-name my_exp \ + --url http://86.38.238.108:8000 +``` + +Optional useful flags: + +- `--model ` +- `--n-prompts 1000` +- `--prompts-file /path/to/prompts.txt` (one prompt per line) +- `--max-workers 64` +- `--max-tokens 3000` +- `--temperature 0.99` +- `--seed 42` +- `--top-logprobs 5` +- `--wait-timeout-s 120` + +### 2) Run Validation + +```bash +python3 mlnode/packages/benchmarks/scripts/inference_validation/validation.py \ + --inference-artifact mlnode/packages/benchmarks/data/inference_validation/my_exp__YYYY-MM-DD_HHMMSS/inference_results.jsonl \ + --validation-url http://86.38.238.108:8000 +``` + +Optional useful flags: + +- `--validation-model ` +- `--max-workers 64` +- `--wait-timeout-s 120` +- `--max-attempts 3` +- `--retry-backoff-start-s 1.0` +- `--retry-backoff-mult 2.0` + +## Notes + +- These scripts assume vLLM server is already up; they do not start ML node or deploy services. +- `validation.py` uses request params stored in the inference artifact. +- If validation text differs from inference text for a prompt, a warning is printed and the row is still saved. diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/inference.py b/mlnode/packages/benchmarks/scripts/inference_validation/inference.py new file mode 100644 index 000000000..f8199538f --- /dev/null +++ b/mlnode/packages/benchmarks/scripts/inference_validation/inference.py @@ -0,0 +1,265 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import json +import os +import sys +import time +from concurrent.futures import ThreadPoolExecutor, as_completed +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, List, Optional + +import requests +from pydantic import BaseModel, Field +from tqdm import tqdm + + +def _add_repo_paths() -> None: + """Make `validation` + `common` imports work when executed as a script.""" + benchmarks_dir = Path(__file__).resolve().parents[2] + sys.path.insert(0, str(benchmarks_dir / "src")) + sys.path.insert(0, str(benchmarks_dir.parent / "common" / "src")) + + +_add_repo_paths() + +from validation.data import ModelInfo, RequestParams, Result # noqa: E402 +from validation.prompts import get_squad_data_questions # noqa: E402 +from validation.utils import _extract_logprobs, inference # noqa: E402 + + +class InferenceArtifactItem(BaseModel): + prompt: str + language: str = "en" + inference_result: Result + inference_model: ModelInfo + request_params: RequestParams + metadata: Dict[str, Any] = Field(default_factory=dict) + + +@dataclass(frozen=True) +class VllmProbe: + base_url: str + models_url: str + served_model_ids: List[str] + raw_models_response: Dict[str, Any] + health_status_code: Optional[int] + version_status_code: Optional[int] + version_body: Optional[str] + timestamp: str + + +def _wait_for_vllm(base_url: str, timeout_s: int = 120) -> Dict[str, Any]: + models_url = base_url.rstrip("/") + "/v1/models" + deadline = time.time() + timeout_s + last_err: Optional[str] = None + while time.time() < deadline: + try: + r = requests.get(models_url, timeout=5) + if r.status_code == 200: + return r.json() + last_err = f"{r.status_code}: {r.text[:200]}" + except Exception as e: # noqa: BLE001 + last_err = repr(e) + time.sleep(1) + raise RuntimeError(f"vLLM not ready at {models_url} within {timeout_s}s. Last error: {last_err}") + + +def _probe_vllm(base_url: str, timeout_s: int) -> VllmProbe: + models_json = _wait_for_vllm(base_url, timeout_s=timeout_s) + data = models_json.get("data", []) + served_ids = [m.get("id") for m in data if isinstance(m, dict) and m.get("id")] + + health_code: Optional[int] = None + version_code: Optional[int] = None + version_body: Optional[str] = None + + try: + health_code = requests.get(base_url.rstrip("/") + "/health", timeout=5).status_code + except Exception: # noqa: BLE001 + health_code = None + + try: + vr = requests.get(base_url.rstrip("/") + "/version", timeout=5) + version_code = vr.status_code + version_body = vr.text[:5000] + except Exception: # noqa: BLE001 + version_code = None + version_body = None + + return VllmProbe( + base_url=base_url.rstrip("/"), + models_url=base_url.rstrip("/") + "/v1/models", + served_model_ids=served_ids, + raw_models_response=models_json, + health_status_code=health_code, + version_status_code=version_code, + version_body=version_body, + timestamp=datetime.now().isoformat(), + ) + + +def _resolve_model_name(configured: str, served_ids: List[str], *, base_url: str) -> str: + if configured and configured in served_ids: + return configured + if served_ids: + fallback = str(served_ids[0]) + if configured and configured != fallback: + print( + f"[warn] Model '{configured}' not found in /v1/models for {base_url}. " + f"Falling back to served id '{fallback}'." + ) + return fallback + if configured: + return configured + raise RuntimeError(f"No served models found at {base_url}/v1/models") + + +def _make_exp_dir(out_base: Path, exp_name: str) -> Path: + out_base.mkdir(parents=True, exist_ok=True) + ts = datetime.now().strftime("%Y-%m-%d_%H%M%S") + exp_dir = out_base / f"{exp_name}__{ts}" + exp_dir.mkdir(parents=True, exist_ok=True) + return exp_dir + + +def _load_prompts(prompts_file: Optional[Path], n_prompts: int) -> List[str]: + if prompts_file: + prompts: List[str] = [] + for line in prompts_file.read_text(encoding="utf-8").splitlines(): + t = line.strip() + if t: + prompts.append(t) + if not prompts: + raise RuntimeError(f"No prompts found in file: {prompts_file}") + return prompts[:n_prompts] + return get_squad_data_questions()[:n_prompts] + + +def _run_with_retries(fn, max_attempts: int, backoff_start_s: float, backoff_mult: float): + attempt = 1 + delay = backoff_start_s + while True: + try: + return fn() + except Exception: + if attempt >= max_attempts: + raise + time.sleep(delay) + delay *= backoff_mult + attempt += 1 + + +def main() -> None: + parser = argparse.ArgumentParser( + description=( + "Run INFERENCE ONLY against an already running OpenAI-compatible vLLM server. " + "Saves a pure inference artifact and inference config under data/inference_validation/__/." + ) + ) + parser.add_argument("--exp-name", required=True, help="Experiment name (required).") + parser.add_argument("--url", required=True, help="vLLM base URL, e.g. http://86.38.238.108:8000") + parser.add_argument("--model", default="", help="Model id to use; default: first served id from /v1/models.") + parser.add_argument("--n-prompts", type=int, default=1000, help="Number of prompts to run.") + parser.add_argument("--prompts-file", type=Path, default=None, help="Optional text file with one prompt per line.") + parser.add_argument("--language", default="en", help="Language tag to store in artifact rows.") + parser.add_argument("--max-workers", type=int, default=64, help="Concurrent workers.") + parser.add_argument("--wait-timeout-s", type=int, default=120, help="Seconds to wait for /v1/models readiness.") + parser.add_argument("--max-attempts", type=int, default=3, help="Retry attempts per prompt.") + parser.add_argument("--retry-backoff-start-s", type=float, default=1.0, help="Initial retry backoff in seconds.") + parser.add_argument("--retry-backoff-mult", type=float, default=2.0, help="Retry backoff multiplier.") + parser.add_argument("--max-tokens", type=int, default=3000) + parser.add_argument("--temperature", type=float, default=0.99) + parser.add_argument("--seed", type=int, default=42) + parser.add_argument("--top-logprobs", type=int, default=5) + args = parser.parse_args() + + benchmarks_dir = Path(__file__).resolve().parents[2] + out_base = benchmarks_dir / "data" / "inference_validation" + exp_dir = _make_exp_dir(out_base=out_base, exp_name=args.exp_name) + inference_artifact_path = exp_dir / "inference_results.jsonl" + inference_cfg_path = exp_dir / "inference_config.json" + + probe = _probe_vllm(args.url, timeout_s=int(args.wait_timeout_s)) + model_name = _resolve_model_name(str(args.model or ""), probe.served_model_ids, base_url=args.url) + + model_info = ModelInfo( + url=args.url.rstrip("/") + "/", + name=model_name, + deploy_params={}, + ) + request_params = RequestParams( + max_tokens=int(args.max_tokens), + temperature=float(args.temperature), + seed=int(args.seed), + top_logprobs=int(args.top_logprobs), + additional_params={}, + ) + + prompts = _load_prompts(args.prompts_file, n_prompts=int(args.n_prompts)) + + cfg = { + "exp_name": str(args.exp_name), + "timestamp": datetime.now().isoformat(), + "artifact_dir": str(exp_dir), + "inference_artifact": str(inference_artifact_path), + "n_prompts": len(prompts), + "language": str(args.language), + "model_info": model_info.model_dump(), + "request_params": request_params.model_dump(), + "vllm_runtime_probe": asdict(probe), + "cli": { + "url": args.url, + "model": args.model, + "n_prompts": args.n_prompts, + "prompts_file": str(args.prompts_file) if args.prompts_file else None, + "max_workers": args.max_workers, + "wait_timeout_s": args.wait_timeout_s, + "max_attempts": args.max_attempts, + "retry_backoff_start_s": args.retry_backoff_start_s, + "retry_backoff_mult": args.retry_backoff_mult, + "max_tokens": args.max_tokens, + "temperature": args.temperature, + "seed": args.seed, + "top_logprobs": args.top_logprobs, + }, + } + inference_cfg_path.write_text(json.dumps(cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + + def _work(prompt: str) -> str: + def _call(): + return inference(model_info, request_params, prompt) + + resp = _run_with_retries( + _call, + max_attempts=max(1, int(args.max_attempts)), + backoff_start_s=float(args.retry_backoff_start_s), + backoff_mult=float(args.retry_backoff_mult), + ) + inference_result = _extract_logprobs(resp) + row = InferenceArtifactItem( + prompt=prompt, + language=str(args.language), + inference_result=inference_result, + inference_model=model_info, + request_params=request_params, + metadata={}, + ) + return row.model_dump_json() + "\n" + + with inference_artifact_path.open("w", encoding="utf-8") as f, ThreadPoolExecutor( + max_workers=int(args.max_workers) + ) as ex: + futures = [ex.submit(_work, prompt) for prompt in prompts] + for fut in tqdm(as_completed(futures), total=len(futures), desc="Inference", smoothing=0): + f.write(fut.result()) + + print(f"done: wrote {len(prompts)} inference rows -> {inference_artifact_path}") + print(f"config -> {inference_cfg_path}") + + +if __name__ == "__main__": + main() diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/validation.py b/mlnode/packages/benchmarks/scripts/inference_validation/validation.py new file mode 100644 index 000000000..7cdaa9455 --- /dev/null +++ b/mlnode/packages/benchmarks/scripts/inference_validation/validation.py @@ -0,0 +1,300 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import json +import sys +import time +from concurrent.futures import ThreadPoolExecutor, as_completed +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple + +import requests +from pydantic import BaseModel, Field +from tqdm import tqdm + + +def _add_repo_paths() -> None: + """Make `validation` + `common` imports work when executed as a script.""" + benchmarks_dir = Path(__file__).resolve().parents[2] + sys.path.insert(0, str(benchmarks_dir / "src")) + sys.path.insert(0, str(benchmarks_dir.parent / "common" / "src")) + + +_add_repo_paths() + +from validation.data import ModelInfo, RequestParams, Result, ValidationItem # noqa: E402 +from validation.utils import EnforcedTokens, _extract_logprobs, validation as validation_call # noqa: E402 + + +class InferenceArtifactItem(BaseModel): + prompt: str + language: str = "en" + inference_result: Result + inference_model: ModelInfo + request_params: RequestParams + metadata: Dict[str, Any] = Field(default_factory=dict) + + +@dataclass(frozen=True) +class VllmProbe: + base_url: str + models_url: str + served_model_ids: List[str] + raw_models_response: Dict[str, Any] + health_status_code: Optional[int] + version_status_code: Optional[int] + version_body: Optional[str] + timestamp: str + + +def _wait_for_vllm(base_url: str, timeout_s: int = 120) -> Dict[str, Any]: + models_url = base_url.rstrip("/") + "/v1/models" + deadline = time.time() + timeout_s + last_err: Optional[str] = None + while time.time() < deadline: + try: + r = requests.get(models_url, timeout=5) + if r.status_code == 200: + return r.json() + last_err = f"{r.status_code}: {r.text[:200]}" + except Exception as e: # noqa: BLE001 + last_err = repr(e) + time.sleep(1) + raise RuntimeError(f"vLLM not ready at {models_url} within {timeout_s}s. Last error: {last_err}") + + +def _probe_vllm(base_url: str, timeout_s: int) -> VllmProbe: + models_json = _wait_for_vllm(base_url, timeout_s=timeout_s) + data = models_json.get("data", []) + served_ids = [m.get("id") for m in data if isinstance(m, dict) and m.get("id")] + + health_code: Optional[int] = None + version_code: Optional[int] = None + version_body: Optional[str] = None + + try: + health_code = requests.get(base_url.rstrip("/") + "/health", timeout=5).status_code + except Exception: # noqa: BLE001 + health_code = None + + try: + vr = requests.get(base_url.rstrip("/") + "/version", timeout=5) + version_code = vr.status_code + version_body = vr.text[:5000] + except Exception: # noqa: BLE001 + version_code = None + version_body = None + + return VllmProbe( + base_url=base_url.rstrip("/"), + models_url=base_url.rstrip("/") + "/v1/models", + served_model_ids=served_ids, + raw_models_response=models_json, + health_status_code=health_code, + version_status_code=version_code, + version_body=version_body, + timestamp=datetime.now().isoformat(), + ) + + +def _resolve_model_name(configured: str, served_ids: List[str], *, base_url: str) -> str: + if configured and configured in served_ids: + return configured + if served_ids: + fallback = str(served_ids[0]) + if configured and configured != fallback: + print( + f"[warn] Model '{configured}' not found in /v1/models for {base_url}. " + f"Falling back to served id '{fallback}'." + ) + return fallback + if configured: + return configured + raise RuntimeError(f"No served models found at {base_url}/v1/models") + + +def _run_with_retries(fn, max_attempts: int, backoff_start_s: float, backoff_mult: float): + attempt = 1 + delay = backoff_start_s + while True: + try: + return fn() + except Exception: + if attempt >= max_attempts: + raise + time.sleep(delay) + delay *= backoff_mult + attempt += 1 + + +def _load_inference_items(path: Path) -> List[InferenceArtifactItem]: + items: List[InferenceArtifactItem] = [] + with path.open("r", encoding="utf-8") as f: + for line in f: + if not line.strip(): + continue + items.append(InferenceArtifactItem.model_validate_json(line)) + if not items: + raise RuntimeError(f"No rows found in inference artifact: {path}") + return items + + +def _load_inference_config(exp_dir: Path) -> Optional[Dict[str, Any]]: + cfg_path = exp_dir / "inference_config.json" + if not cfg_path.exists(): + return None + try: + return json.loads(cfg_path.read_text(encoding="utf-8")) + except Exception as e: # noqa: BLE001 + print(f"[warn] Failed to read inference_config.json: {e!r}") + return None + + +def _extract_check_fields(inference_cfg: Optional[Dict[str, Any]]) -> Dict[str, Any]: + if not inference_cfg: + return {} + return { + "model_info": inference_cfg.get("model_info"), + "request_params": inference_cfg.get("request_params"), + "vllm_runtime_probe.served_model_ids": (inference_cfg.get("vllm_runtime_probe") or {}).get("served_model_ids"), + "vllm_runtime_probe.raw_models_response": (inference_cfg.get("vllm_runtime_probe") or {}).get("raw_models_response"), + } + + +def _compare_configs( + inference_cfg: Optional[Dict[str, Any]], + validation_model_info: ModelInfo, + validation_request_params: RequestParams, + validation_probe: VllmProbe, +) -> Tuple[bool, List[str]]: + expected = _extract_check_fields(inference_cfg) + actual = { + "model_info": validation_model_info.model_dump(), + "request_params": validation_request_params.model_dump(), + "vllm_runtime_probe.served_model_ids": validation_probe.served_model_ids, + "vllm_runtime_probe.raw_models_response": validation_probe.raw_models_response, + } + diffs: List[str] = [] + for k in expected.keys(): + if expected.get(k) != actual.get(k): + diffs.append(k) + return len(diffs) == 0, diffs + + +def main() -> None: + parser = argparse.ArgumentParser( + description=( + "Run VALIDATION ONLY from a pure inference artifact JSONL. " + "Writes inference+validation artifact and validation config into the same experiment folder." + ) + ) + parser.add_argument( + "--inference-artifact", + required=True, + type=Path, + help="Path to inference_results.jsonl generated by scripts/inference_validation/inference.py", + ) + parser.add_argument("--validation-url", required=True, help="vLLM base URL, e.g. http://86.38.238.108:8000") + parser.add_argument("--validation-model", default="", help="Model id to use; default: first served id from /v1/models.") + parser.add_argument("--max-workers", type=int, default=64, help="Concurrent workers.") + parser.add_argument("--wait-timeout-s", type=int, default=120, help="Seconds to wait for /v1/models readiness.") + parser.add_argument("--max-attempts", type=int, default=3, help="Retry attempts per prompt.") + parser.add_argument("--retry-backoff-start-s", type=float, default=1.0, help="Initial retry backoff in seconds.") + parser.add_argument("--retry-backoff-mult", type=float, default=2.0, help="Retry backoff multiplier.") + args = parser.parse_args() + + if not args.inference_artifact.exists(): + raise RuntimeError(f"inference artifact not found: {args.inference_artifact}") + + exp_dir = args.inference_artifact.resolve().parent + output_path = exp_dir / "inference_validation_results.jsonl" + validation_cfg_path = exp_dir / "validation_config.json" + + inference_items = _load_inference_items(args.inference_artifact) + request_params = inference_items[0].request_params + + probe = _probe_vllm(args.validation_url, timeout_s=int(args.wait_timeout_s)) + model_name = _resolve_model_name(str(args.validation_model or ""), probe.served_model_ids, base_url=args.validation_url) + validation_model = ModelInfo( + url=args.validation_url.rstrip("/") + "/", + name=model_name, + deploy_params={}, + ) + + inference_cfg = _load_inference_config(exp_dir) + same, diff_keys = _compare_configs(inference_cfg, validation_model, request_params, probe) + if same: + print("[config-check] inference and validation configs look the same.") + else: + print("[config-check] WARNING: inference and validation configs differ (continuing):") + for key in diff_keys: + print(f" - {key}") + + validation_cfg = { + "timestamp": datetime.now().isoformat(), + "artifact_dir": str(exp_dir), + "source_inference_artifact": str(args.inference_artifact.resolve()), + "validation_artifact": str(output_path), + "n_items": len(inference_items), + "validation_model_info": validation_model.model_dump(), + "request_params": request_params.model_dump(), + "vllm_runtime_probe": asdict(probe), + "config_check_passed": same, + "config_diff_keys": diff_keys, + "cli": { + "validation_url": args.validation_url, + "validation_model": args.validation_model, + "max_workers": args.max_workers, + "wait_timeout_s": args.wait_timeout_s, + "max_attempts": args.max_attempts, + "retry_backoff_start_s": args.retry_backoff_start_s, + "retry_backoff_mult": args.retry_backoff_mult, + }, + } + validation_cfg_path.write_text(json.dumps(validation_cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + + def _work(item: InferenceArtifactItem) -> str: + enforced_tokens = EnforcedTokens.from_result(item.inference_result) + + def _call(): + return validation_call( + validation_model, + request_params, + item.prompt, + enforced_tokens=enforced_tokens, + ) + + resp = _run_with_retries( + _call, + max_attempts=max(1, int(args.max_attempts)), + backoff_start_s=float(args.retry_backoff_start_s), + backoff_mult=float(args.retry_backoff_mult), + ) + validation_result = _extract_logprobs(resp) + if validation_result.text != item.inference_result.text: + print("[warn] validation text mismatch for one prompt; keeping row in artifact.") + + out_item = ValidationItem( + prompt=item.prompt, + inference_result=item.inference_result, + validation_result=validation_result, + inference_model=item.inference_model, + validation_model=validation_model, + request_params=request_params, + ) + return out_item.model_dump_json() + "\n" + + with output_path.open("w", encoding="utf-8") as f, ThreadPoolExecutor(max_workers=int(args.max_workers)) as ex: + futures = [ex.submit(_work, item) for item in inference_items] + for fut in tqdm(as_completed(futures), total=len(futures), desc="Validation", smoothing=0): + f.write(fut.result()) + + print(f"done: wrote {len(inference_items)} validated rows -> {output_path}") + print(f"config -> {validation_cfg_path}") + + +if __name__ == "__main__": + main() diff --git a/mlnode/packages/benchmarks/scripts/poc_validation/README.md b/mlnode/packages/benchmarks/scripts/poc_validation/README.md new file mode 100644 index 000000000..17957b6be --- /dev/null +++ b/mlnode/packages/benchmarks/scripts/poc_validation/README.md @@ -0,0 +1,147 @@ +# PoC Validation Scripts + +This folder contains the data collection pipeline for **PoC (Proof-of-Computation) vector validation** against already running vLLM servers with PoC support. + +The goal is to verify that PoC vector generation is consistent across different GPUs, vLLM versions, and model configurations — and to detect fraud (e.g., a node running INT4 instead of FP8). + +## Pipeline Overview + +``` +1. collect_data.py Collect PoC vectors from one or more servers +2. poc_l2_histogram.py Compare two runs by L2 distance (scripts/analysis/) +``` + +## What These Scripts Do + +### `collect_data.py` + +- Reads server list and model params from `config.json`. +- Calls `/api/v1/pow/generate` on each server with a block hash, public key, and nonce range. +- Decodes returned base64 FP16 vectors to FP32. +- Saves per-server artifact files and a run config with vLLM runtime probe. +- Supports `--continue` to resume interrupted collection. + +### `scripts/analysis/poc_l2_histogram.py` + +- Takes two collection runs and matches vectors by nonce. +- Computes L2 (Euclidean) distance between paired vectors. +- Plots a histogram with a configurable percentile threshold line (default p98). +- When server names differ across runs (e.g., cross-version comparison), automatically cross-compares the first server from each. + +## Config Schema + +`config.json` controls which servers to collect from and with what parameters: + +```json +{ + "model": "Qwen/Qwen3-0.6B", + "seq_len": 1024, + "k_dim": 12, + "block_hash": "TEST_BLOCK", + "public_key": "test_pub_key", + "block_height": 100, + "batch_size": 64, + "nonce_count": 500, + "servers": { + "my_server": "http://127.0.0.1:8000" + } +} +``` + +- `model`: Model name (must match what the server is serving). +- `seq_len`: Sequence length for PoC generation. +- `k_dim`: Output vector dimension (default 12). +- `block_hash` / `public_key`: Deterministic seeds. Can also use `block_hashes` / `public_keys` arrays for multi-seed mode. +- `batch_size`: How many nonces to process per batch. +- `nonce_count`: Total nonces to generate (0..N-1). +- `servers`: Map of `name → URL`. One artifact file is saved per server. + +## Artifact Structure + +Artifacts are created under: + +`benchmarks/data/poc_calidation/_/` + +Each experiment folder contains: + +- `run_config.json` — input config, vLLM runtime probe, CLI args +- `artifacts_.json` — per-server results (single-seed mode) +- `artifacts___.json` — per-server results (multi-seed mode) + +Each artifact JSON includes: + +- `server_name`, `server_url`, `block_hash`, `public_key` +- `nonces` — list of nonce integers +- `vectors` — list of decoded float arrays (or null on failure) +- `artifacts` — raw server response with base64 vectors +- `encoding` — `{dtype, k_dim, endian}` +- `timing` — `{started_at, finished_at, elapsed_seconds, nonces_per_min}` + +## Usage + +Run from `benchmarks/` directory (or adjust paths). + +### 1) Collect Data + +Edit `config.json` to point at your server(s), then run: + +```bash +python scripts/poc_validation/collect_data.py +``` + +To compare two servers or two vLLM versions, run collection twice with different server configs. For example: + +```bash +# Run 1: collect from vLLM v0.9.1 +# (edit config.json: servers → {"vllm_091": "http://127.0.0.1:8001"}) +python scripts/poc_validation/collect_data.py + +# Run 2: collect from vLLM PS (v0.15.1) +# (edit config.json: servers → {"vllm_ps": "http://127.0.0.1:8000"}) +python scripts/poc_validation/collect_data.py +``` + +Optional flags: + +- `--config ` — path to config file (default: `config.json` in this folder) +- `--continue` — resume from latest run, skipping already-completed tasks + +### 2) Compare Runs + +```bash +# Auto-detect two most recent runs: +python scripts/analysis/poc_l2_histogram.py + +# Compare specific runs: +python scripts/analysis/poc_l2_histogram.py \ + --run-a data/poc_calidation/tinyllama_091_2026-02-25_235406 \ + --run-b data/poc_calidation/tinyllama_ps_2026-02-26_000537 +``` + +Optional flags: + +- `--percentile ` — threshold percentile (default: 98) +- `--out ` — output directory for plots (default: `data/plots/`) +- `--server ` — only compare this server (default: all common servers) + +Output: histogram PNG in `data/plots/` and summary stats printed to stdout. + +## Typical Experiment Scenarios + +### Cross-version (honest pair) + +Collect from two vLLM versions with the same model and precision. Expect L2 distances near zero (mean ~0.001). + +### Cross-GPU (honest pair) + +Collect from same vLLM version on different GPUs (e.g., A100 vs H100). FP8 kernels differ across GPU architectures, so distances will be small but non-zero. + +### Fraud detection (FP8 vs INT4) + +Collect from an honest FP8 server and a fraudulent INT4 server. The L2 distances should be significantly larger (mean ~0.2+), forming a clearly separated distribution from the honest pairs. + +## Important Notes + +- `VLLM_ATTENTION_BACKEND` must match across runs for meaningful comparison. Different attention backends (FlashInfer vs FlashAttention) produce numerically different results, leading to inflated distances. +- The `EXP_NAME` is hardcoded in the script as `"poc_validation"`. Rename output folders after collection if you want descriptive names. +- These scripts call the vLLM PoC endpoint directly (`/api/v1/pow/generate`), not the MLNode proxy path (`/api/v1/inference/pow/generate`). diff --git a/mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py b/mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py new file mode 100644 index 000000000..a8a4af383 --- /dev/null +++ b/mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py @@ -0,0 +1,433 @@ +#!/usr/bin/env python3 +""" +PoC artifact data collection script for mlnode benchmarks. + +This is adapted from vllm/scripts/collect_data.py with mlnode-specific output: +- Saves artifacts under benchmarks/data/poc_calidation/{EXP_NAME}_{timestamp} +- Stores a run config JSON that includes a vLLM runtime probe (models/health/version) +- Stores the input config only inside run_config.json (no separate config.json file) +- Adds timing and nonces_per_min metrics to each saved artifact file + +Usage: + python packages/benchmarks/poc_validation/collect_data.py + python packages/benchmarks/poc_validation/collect_data.py --config packages/benchmarks/poc_validation/config.json + python packages/benchmarks/poc_validation/collect_data.py --continue +""" + +from __future__ import annotations + +import argparse +import base64 +import itertools +import json +import os +import signal +import sys +import threading +import time +from concurrent.futures import ThreadPoolExecutor +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, List, Optional, Set, Tuple + +import numpy as np +import requests + + +# Experiment name is intentionally explicit in-script. +EXP_NAME = "poc_validation" + +BENCHMARKS_DIR = Path(__file__).resolve().parents[2] +DATA_ROOT = BENCHMARKS_DIR / "data" / "poc_calidation" +DEFAULT_CONFIG_PATH = Path(__file__).resolve().with_name("config.json") + +# Global shutdown event for Ctrl-C handling +shutdown_event = threading.Event() +_sigint_count = 0 +_sigint_lock = threading.Lock() + + +def signal_handler(signum, frame) -> None: + """Handle Ctrl-C by initiating shutdown; force-exit on repeated Ctrl-C.""" + del signum, frame + global _sigint_count + with _sigint_lock: + _sigint_count += 1 + count = _sigint_count + + shutdown_event.set() + if count == 1: + print("\n\nInterrupt received, shutting down... (press Ctrl-C again to force exit)") + else: + print("\n\nSecond interrupt received, forcing exit now.") + os._exit(130) + + +def api_call(url: str, endpoint: str, method: str = "POST", json_data: Optional[dict] = None) -> dict: + """Make API call to server.""" + if shutdown_event.is_set(): + raise RuntimeError("Cancelled") + full_url = f"{url.rstrip('/')}{endpoint}" + if method == "GET": + resp = requests.get(full_url, timeout=30) + else: + resp = requests.post(full_url, json=json_data, timeout=600) + resp.raise_for_status() + return resp.json() + + +def safe_http_get(url: str, timeout: int = 5) -> Dict[str, Any]: + """GET helper that never raises; used for runtime probing.""" + try: + resp = requests.get(url, timeout=timeout) + body: Any + try: + body = resp.json() + except Exception: + body = resp.text[:5000] + return { + "ok": True, + "status_code": resp.status_code, + "body": body, + } + except Exception as exc: + return { + "ok": False, + "error": repr(exc), + } + + +def probe_vllm(base_url: str) -> Dict[str, Any]: + """Collect runtime vLLM info similar to inference_validation/inference.py.""" + base = base_url.rstrip("/") + models_info = safe_http_get(f"{base}/v1/models") + served_model_ids: List[str] = [] + if models_info.get("ok") and isinstance(models_info.get("body"), dict): + data = models_info["body"].get("data", []) + if isinstance(data, list): + for item in data: + if isinstance(item, dict) and item.get("id"): + served_model_ids.append(str(item["id"])) + + return { + "base_url": base, + "timestamp": datetime.now().isoformat(), + "served_model_ids": served_model_ids, + "models": models_info, + "health": safe_http_get(f"{base}/health"), + "version": safe_http_get(f"{base}/version"), + } + + +def decode_vector(b64: str) -> np.ndarray: + """Decode base64 FP16 little-endian to FP32.""" + data = base64.b64decode(b64) + f16 = np.frombuffer(data, dtype=" dict: + """Collect data from a single server for a specific seed.""" + # Stop any running generation + try: + api_call(url, "/api/v1/pow/stop") + except Exception: + pass # Ignore if nothing is currently running + + requested_nonces = list(range(int(config.get("nonce_count", 500)))) + + gen_config = { + "block_hash": block_hash, + "block_height": int(config.get("block_height", 100)), + "public_key": public_key, + "node_id": 0, + "node_count": 1, + "nonces": requested_nonces, + "params": { + "model": config["model"], + "seq_len": int(config.get("seq_len", 256)), + "k_dim": int(config.get("k_dim", 12)), + }, + "batch_size": int(config.get("batch_size", 128)), + "wait": True, + } + + started_at = time.time() + started_at_iso = datetime.now().isoformat() + result = api_call(url, "/api/v1/pow/generate", json_data=gen_config) + finished_at = time.time() + finished_at_iso = datetime.now().isoformat() + + artifacts = result.get("artifacts", []) + encoding = result.get( + "encoding", + {"dtype": "f16", "k_dim": int(config.get("k_dim", 12)), "endian": "le"}, + ) + + decoded_vectors = [] + for artifact in artifacts: + try: + vec = decode_vector(artifact["vector_b64"]) + decoded_vectors.append(vec.tolist()) + except Exception: + decoded_vectors.append(None) + + elapsed_seconds = max(0.0, finished_at - started_at) + collected_nonce_count = len(artifacts) + nonces_per_min = (collected_nonce_count / elapsed_seconds * 60.0) if elapsed_seconds > 0 else 0.0 + + return { + "server_name": name, + "server_url": url, + "block_hash": block_hash, + "public_key": public_key, + "requested_nonce_count": len(requested_nonces), + "collected_nonce_count": collected_nonce_count, + "nonces": [a["nonce"] for a in artifacts], + "artifacts": artifacts, + "vectors": decoded_vectors, + "encoding": encoding, + "timing": { + "started_at": started_at_iso, + "finished_at": finished_at_iso, + "elapsed_seconds": elapsed_seconds, + "nonces_per_min": nonces_per_min, + }, + } + + +def find_latest_run(exp_name: str) -> Optional[Path]: + """Find the most recent output directory for a given experiment name.""" + if not DATA_ROOT.exists(): + return None + matching = sorted( + [d for d in DATA_ROOT.iterdir() if d.is_dir() and d.name.startswith(f"{exp_name}_")], + key=lambda d: d.name, + reverse=True, + ) + return matching[0] if matching else None + + +def get_completed_tasks(out_dir: Path) -> Set[str]: + """Get completed task keys that already have successful data.""" + completed: Set[str] = set() + for json_file in out_dir.glob("*.json"): + if json_file.name == "run_config.json": + continue + try: + data = json.loads(json_file.read_text(encoding="utf-8")) + if "error" not in data and data.get("artifacts"): + completed.add(json_file.stem) + except Exception: + pass + return completed + + +def get_output_filename(server_name: str, block_hash: str, public_key: str, multi_seed: bool) -> str: + """Generate output filename based on seed mode.""" + if multi_seed: + return f"artifacts_{server_name}_{block_hash}_{public_key}.json" + return f"artifacts_{server_name}.json" + + +def get_task_key(server_name: str, block_hash: str, public_key: str, multi_seed: bool) -> str: + """Generate task key for tracking completion.""" + if multi_seed: + return f"{server_name}_{block_hash}_{public_key}" + return server_name + + +def main() -> None: + signal.signal(signal.SIGINT, signal_handler) + + parser = argparse.ArgumentParser(description="Collect PoC data from multiple servers") + parser.add_argument( + "--config", + default=str(DEFAULT_CONFIG_PATH), + help=f"Path to config JSON file (default: {DEFAULT_CONFIG_PATH})", + ) + parser.add_argument( + "--continue", + dest="continue_run", + action="store_true", + help="Continue from latest run dir for this EXP_NAME, skipping completed tasks", + ) + args = parser.parse_args() + + config_path = Path(args.config).resolve() + if not config_path.exists(): + print(f"Error: config file not found: {config_path}") + sys.exit(1) + + config = json.loads(config_path.read_text(encoding="utf-8")) + if "model" not in config: + print("Error: config must include 'model' field") + sys.exit(1) + if "servers" not in config or not isinstance(config["servers"], dict) or not config["servers"]: + print("Error: config must include non-empty 'servers' map") + sys.exit(1) + + if "block_hashes" in config: + block_hashes = config["block_hashes"] + else: + block_hashes = [config["block_hash"]] + + if "public_keys" in config: + public_keys = config["public_keys"] + else: + public_keys = [config["public_key"]] + + seeds: List[Tuple[str, str]] = list(itertools.product(block_hashes, public_keys)) + multi_seed = len(seeds) > 1 + + DATA_ROOT.mkdir(parents=True, exist_ok=True) + if args.continue_run: + out_dir = find_latest_run(EXP_NAME) + if out_dir is None: + print(f"No previous run found for '{EXP_NAME}', starting fresh") + args.continue_run = False + + if not args.continue_run: + timestamp = datetime.now().strftime("%Y-%m-%d_%H%M%S") + out_dir = DATA_ROOT / f"{EXP_NAME}_{timestamp}" + out_dir.mkdir(parents=True, exist_ok=True) + + completed = get_completed_tasks(out_dir) if args.continue_run else set() + + server_entries = list(config["servers"].items()) + vllm_runtime_probe = {name: probe_vllm(url) for name, url in server_entries} + run_config = { + "exp_name": EXP_NAME, + "timestamp": datetime.now().isoformat(), + "artifact_dir": str(out_dir), + "data_root": str(DATA_ROOT), + "input_config_path": str(config_path), + "config": config, + "vllm_runtime_probe": vllm_runtime_probe, + "cli": { + "continue_run": bool(args.continue_run), + "config": str(config_path), + }, + } + (out_dir / "run_config.json").write_text( + json.dumps(run_config, indent=2, ensure_ascii=False) + "\n", + encoding="utf-8", + ) + + url_to_tasks: Dict[str, List[Tuple[str, str, str]]] = {} + for name, url in server_entries: + for block_hash, public_key in seeds: + task_key = get_task_key(name, block_hash, public_key, multi_seed) + if task_key not in completed: + url_to_tasks.setdefault(url, []).append((name, block_hash, public_key)) + + total_tasks = sum(len(tasks) for tasks in url_to_tasks.values()) + + print(f"EXP_NAME: {EXP_NAME}") + print(f"Output: {out_dir}") + print(f"Model: {config['model']}") + print(f"Servers: {list(config['servers'].keys())}") + print(f"Seeds: {len(seeds)} combinations") + if multi_seed: + print(f" block_hashes: {block_hashes}") + print(f" public_keys: {public_keys}") + print(f"Total tasks: {total_tasks}") + print(f"Workers: {len(url_to_tasks)} (one per URL)") + if completed: + print(f"Skipping (already done): {len(completed)} tasks") + print() + + def collect_all_seeds_for_url(url: str, task_list: List[Tuple[str, str, str]]): + """Process all seeds for one URL sequentially. Returns list of results.""" + results = [] + for name, block_hash, public_key in task_list: + if shutdown_event.is_set(): + break + + filename = get_output_filename(name, block_hash, public_key, multi_seed) + try: + result = collect_from_server(name, url, config, block_hash, public_key) + (out_dir / filename).write_text( + json.dumps(result, indent=2, ensure_ascii=False) + "\n", + encoding="utf-8", + ) + results.append( + ( + name, + block_hash, + public_key, + int(result["collected_nonce_count"]), + float(result["timing"]["nonces_per_min"]), + None, + ) + ) + except Exception as exc: + if shutdown_event.is_set(): + break + error_result = { + "server_name": name, + "server_url": url, + "block_hash": block_hash, + "public_key": public_key, + "error": str(exc), + } + (out_dir / filename).write_text( + json.dumps(error_result, indent=2, ensure_ascii=False) + "\n", + encoding="utf-8", + ) + results.append((name, block_hash, public_key, 0, 0.0, str(exc))) + return url, results + + if not url_to_tasks: + print("No tasks to run.") + return + + interrupted = False + try: + with ThreadPoolExecutor(max_workers=len(url_to_tasks)) as executor: + futures = [ + executor.submit(collect_all_seeds_for_url, url, task_list) + for url, task_list in url_to_tasks.items() + ] + + pending = set(futures) + while pending: + if shutdown_event.is_set(): + interrupted = True + for future in list(pending): + future.cancel() + break + + done_now = {future for future in pending if future.done()} + if not done_now: + time.sleep(0.1) + continue + + for future in done_now: + pending.remove(future) + _, results = future.result() + for name, block_hash, public_key, nonce_count, nonces_per_min, error in results: + seed_str = f" [{block_hash}+{public_key}]" if multi_seed else "" + if error: + print(f"{name}{seed_str}: FAILED - {error}") + else: + print( + f"{name}{seed_str}: OK " + f"({nonce_count} artifacts, {nonces_per_min:.2f} nonces/min)" + ) + except KeyboardInterrupt: + interrupted = True + shutdown_event.set() + print("\n\nInterrupt received, cancelling pending tasks...") + + if interrupted: + print(f"\nInterrupted. Partial results in {out_dir}") + print("Use --continue to resume from where you left off.") + sys.exit(1) + + print(f"\nDone. Results in {out_dir}") + + +if __name__ == "__main__": + main() + diff --git a/mlnode/packages/benchmarks/scripts/poc_validation/config.json b/mlnode/packages/benchmarks/scripts/poc_validation/config.json new file mode 100644 index 000000000..7260e86c9 --- /dev/null +++ b/mlnode/packages/benchmarks/scripts/poc_validation/config.json @@ -0,0 +1,13 @@ +{ + "model": "TinyLlama/TinyLlama-1.1B-Chat-v1.0", + "seq_len": 1024, + "k_dim": 12, + "block_hash": "TEST_BLOCK", + "public_key": "test_pub_key", + "block_height": 100, + "batch_size": 64, + "nonce_count": 500, + "servers": { + "vllm_at": "http://127.0.0.1:8003" + } +} From 045dbcb5d20e9f4da451b5f4dbe1257d5df07db7 Mon Sep 17 00:00:00 2001 From: Tamaz Gadaev Date: Sat, 7 Mar 2026 01:45:31 +0000 Subject: [PATCH 06/13] update benchmark code --- .../benchmarks/src/validation/__init__.py | 0 .../benchmarks/src/validation/analysis.py | 5 +- .../benchmarks/src/validation/data.py | 14 ++- .../benchmarks/src/validation/prompts.py | 112 +++++++++++++++++- .../benchmarks/src/validation/runner.py | 54 ++++++--- .../benchmarks/src/validation/utils.py | 59 +++++++-- 6 files changed, 212 insertions(+), 32 deletions(-) create mode 100644 mlnode/packages/benchmarks/src/validation/__init__.py diff --git a/mlnode/packages/benchmarks/src/validation/__init__.py b/mlnode/packages/benchmarks/src/validation/__init__.py new file mode 100644 index 000000000..e69de29bb diff --git a/mlnode/packages/benchmarks/src/validation/analysis.py b/mlnode/packages/benchmarks/src/validation/analysis.py index e42f89349..c7cef9fb2 100644 --- a/mlnode/packages/benchmarks/src/validation/analysis.py +++ b/mlnode/packages/benchmarks/src/validation/analysis.py @@ -11,7 +11,10 @@ def process_data(items): distances = [ - distance2(item.inference_result, item.validation_result) + distance2( + item.inference_result, + item.validation_result, + ) for item in items ] diff --git a/mlnode/packages/benchmarks/src/validation/data.py b/mlnode/packages/benchmarks/src/validation/data.py index cdbf01c32..e68e529fe 100644 --- a/mlnode/packages/benchmarks/src/validation/data.py +++ b/mlnode/packages/benchmarks/src/validation/data.py @@ -5,7 +5,8 @@ from typing import ( List, Dict, - Union + Optional, + Union, ) import pandas as pd @@ -32,10 +33,18 @@ class RequestParams(BaseModel): seed: int additional_params: Dict[str, Union[str, int, float]] = Field(default_factory=dict) top_logprobs: int = 3 + top_p: Optional[float] = None + top_k: Optional[int] = None + repetition_penalty: Optional[float] = None + timeout_seconds: int = 300 + retries_max_attempts: int = 3 + retry_backoff_seconds_start: float = 1.0 + retry_backoff_multiplier: float = 2.0 class ValidationItem(BaseModel): prompt: str + language: Optional[str] = None inference_result: Result validation_result: Result inference_model: ModelInfo @@ -48,13 +57,16 @@ def to_dict(self): class ExperimentRequest(BaseModel): prompt: str + language: Optional[str] = None inference_model: ModelInfo validation_model: ModelInfo request_params: RequestParams + output_path: Optional[str] = None def to_result(self, inference_result: Result, validation_result: Result) -> ValidationItem: return ValidationItem( prompt=self.prompt, + language=self.language, inference_result=inference_result, validation_result=validation_result, inference_model=self.inference_model, diff --git a/mlnode/packages/benchmarks/src/validation/prompts.py b/mlnode/packages/benchmarks/src/validation/prompts.py index 80c8520c9..9210fe9f5 100644 --- a/mlnode/packages/benchmarks/src/validation/prompts.py +++ b/mlnode/packages/benchmarks/src/validation/prompts.py @@ -1,8 +1,114 @@ from datasets import load_dataset -from typing import List +from typing import List, Dict, Tuple +import unicodedata +import regex as re +from common.logger import create_logger + +logger = create_logger(__name__) + +DATASET_HANDLES: Dict[str, str] = { + "en": "tatsu-lab/alpaca", + "hi": "iamshnoo/alpaca-cleaned-hindi", + "sp": "bertin-project/alpaca-spanish", + "ar": "gagan3012/alpaca-gpt4-arabic-updated", + "ch": "silk-road/alpaca-data-gpt4-chinese", +} + +INSTRUCTION_FIELD = { + "ch": "instruction_zh", + "en": "instruction", + "hi": "instruction", + "sp": "instruction", + "ar": "instruction", +} + +INPUT_FIELD = { + "ch": "input_zh", + "en": "input", + "hi": "input", + "sp": "input", + "ar": "input", +} + +TEMPLATE = """### Instruction: +{instruction} +### Input: +{input} +### Response: +""" + + +_ZS_OR_FORMAT = re.compile(r"[\p{Zs}\p{Zl}\p{Zp}\p{Cf}\p{Cc}]+", re.UNICODE) + + +def _is_effectively_empty(s: str) -> bool: + if s is None: + return True + s2 = unicodedata.normalize("NFKC", s).strip() + s2 = _ZS_OR_FORMAT.sub("", s2) + return len(s2) == 0 + +def _normalize(s: str) -> str: + if s is None: + return "" + s = unicodedata.normalize("NFKC", s) + s = re.sub(r"[\p{Zs}\p{Zl}\p{Zp}]", " ", s) + s = "\n".join(line.strip() for line in s.splitlines()) + return s.strip() + + + +def get_language_alpaca_prompts(lang: str) -> List[str]: + ds = load_dataset(DATASET_HANDLES[lang], keep_in_memory=True) + prompts: List[str] = [] + instr_key = INSTRUCTION_FIELD[lang] + input_key = INPUT_FIELD[lang] + + for ex in ds["train"]: + instruction = _normalize(ex.get(instr_key, "")) + input_text = _normalize(ex.get(input_key, "")) + + if _is_effectively_empty(instruction): + continue + + prompt = TEMPLATE.format( + instruction=instruction, + input=input_text if not _is_effectively_empty(input_text) else "", + ) + prompts.append(prompt) + + return prompts + + +def preload_all_language_prompts(langs: Tuple[str, ...] = ("en", "ch", "hi", "ar")) -> Dict[str, List[str]]: + all_prompts_by_lang: Dict[str, List[str]] = {} + for lang in langs: + if lang not in DATASET_HANDLES: + continue + all_prompts_by_lang[lang] = get_language_alpaca_prompts(lang) + logger.info(f"Loaded {langs} language prompts") + return all_prompts_by_lang + + +def slice_mixed_language_prompts_with_langs( + all_prompts_by_lang: Dict[str, List[str]], + per_language_n: int, + langs: Tuple[str, ...] = ("en", "ch", "hi", "ar"), +) -> Tuple[List[str], List[str]]: + logger.info(f"Slicing {langs} language prompts (with langs), {per_language_n} prompts per language") + prompts: List[str] = [] + languages: List[str] = [] + for lang in langs: + lang_prompts = all_prompts_by_lang[lang][:per_language_n] + prompts.extend(lang_prompts) + languages.extend([lang] * len(lang_prompts)) + return prompts, languages def get_squad_data_questions() -> List[str]: dataset = load_dataset('squad', keep_in_memory=True) - questions = dataset['train']['question'] - return questions + prompts = [ + f"Context: {context}\nQuestion: {question}" + for question, context in zip(dataset['train']['question'], dataset['train']['context']) + ] + return prompts diff --git a/mlnode/packages/benchmarks/src/validation/runner.py b/mlnode/packages/benchmarks/src/validation/runner.py index 84e911b77..24f4d928e 100644 --- a/mlnode/packages/benchmarks/src/validation/runner.py +++ b/mlnode/packages/benchmarks/src/validation/runner.py @@ -1,7 +1,7 @@ -from typing import List +from typing import List, Optional from concurrent.futures import ( - ProcessPoolExecutor, + ThreadPoolExecutor, as_completed ) from validation.utils import generate_and_validate @@ -12,6 +12,9 @@ ExperimentRequest ) from tqdm import tqdm +from common.logger import create_logger + +logger = create_logger(__name__) def run_validation( @@ -20,21 +23,44 @@ def run_validation( validation_model: ModelInfo, request_params: RequestParams, max_workers: int = 10, + output_path: Optional[str] = None, + languages: Optional[List[str]] = None, ) -> List[ValidationItem]: - args = [ - ExperimentRequest( - prompt=prompt, - inference_model=inference_model, - validation_model=validation_model, - request_params=request_params, + if languages is not None and len(languages) != len(prompts): + raise ValueError("languages length must match prompts length when provided") + + args = [] + for idx, prompt in enumerate(prompts): + lang = languages[idx] if languages is not None else None + args.append( + ExperimentRequest( + prompt=prompt, + language=lang, + inference_model=inference_model, + validation_model=validation_model, + request_params=request_params, + output_path=output_path, + ) ) - for prompt in prompts - ] results = [] - with ProcessPoolExecutor(max_workers=max_workers) as executor: - futures = {executor.submit(generate_and_validate, arg): arg for arg in args} - for future in tqdm(as_completed(futures), total=len(futures), desc="Running validation", leave=False): - results.append(future.result()) + def submit_one(executor, arg, attempt: int = 1): + return executor.submit(generate_and_validate, arg) + + max_task_attempts = max(1, request_params.retries_max_attempts) + + with ThreadPoolExecutor(max_workers=max_workers) as executor: + futures = {submit_one(executor, arg): (arg, 1) for arg in args} + for future in tqdm(as_completed(futures), total=len(futures), desc="Running validation", leave=False, smoothing=0): + arg, attempt = futures.pop(future) + try: + results.append(future.result()) + except Exception as e: + if attempt < max_task_attempts: + logger.error(f"Task failed (attempt {attempt}/{max_task_attempts}), retrying: {e}") + new_future = submit_one(executor, arg, attempt + 1) + futures[new_future] = (arg, attempt + 1) + else: + logger.error(f"Task permanently failed after {attempt} attempts: {e}") return results diff --git a/mlnode/packages/benchmarks/src/validation/utils.py b/mlnode/packages/benchmarks/src/validation/utils.py index 872e24d0d..5fbb72d8f 100644 --- a/mlnode/packages/benchmarks/src/validation/utils.py +++ b/mlnode/packages/benchmarks/src/validation/utils.py @@ -1,5 +1,6 @@ import requests import math +import threading from typing import ( Dict, Any, @@ -28,6 +29,17 @@ logger = create_logger(__name__) +_output_path_to_lock: Dict[str, threading.Lock] = {} +_registry_lock = threading.Lock() + +def _get_lock_for_path(path: str) -> threading.Lock: + if not path: + return threading.Lock() + with _registry_lock: + if path not in _output_path_to_lock: + _output_path_to_lock[path] = threading.Lock() + return _output_path_to_lock[path] + class EnforcedToken(BaseModel): token: str @@ -59,6 +71,19 @@ def _prepare_messages( ] +def _sampling_extras(request_params: RequestParams) -> Dict[str, Any]: + """Return optional sampling params that are set (non-None) plus additional_params.""" + extras: Dict[str, Any] = {} + if request_params.top_p is not None: + extras["top_p"] = request_params.top_p + if request_params.top_k is not None: + extras["top_k"] = request_params.top_k + if request_params.repetition_penalty is not None: + extras["repetition_penalty"] = request_params.repetition_penalty + extras.update(request_params.additional_params) + return extras + + def inference( model_info: ModelInfo, request_params: RequestParams, @@ -76,7 +101,7 @@ def inference( "n": 1, "top_logprobs": request_params.top_logprobs, "skip_special_tokens": False, - "repetition_penalty": 1.2, + **_sampling_extras(request_params), } response = requests.post(url, json=payload) @@ -104,7 +129,7 @@ def validation( "top_logprobs": request_params.top_logprobs, "n": 1, "skip_special_tokens": False, - "repetition_penalty": 1.2, + **_sampling_extras(request_params), } if enforced_str: @@ -151,25 +176,30 @@ def generate_and_validate( experiment_request.validation_model, experiment_request.request_params, experiment_request.prompt, - # enforced_str=inference_result.text, enforced_tokens=enforced_tokens ) validation_result = _extract_logprobs(validation_resp) if validation_result.text != inference_result.text: - print( - f"text sequences don't match\n" + - f"inference:\n {inference_result.text}\n" + - f"{'-'*10}\n" + - f"validation:\n {validation_result.text}\n" + - f"{'-'*100}" + raise RuntimeError( + "Text sequences don't match between inference and validation." ) - exit(-1) - return experiment_request.to_result( + item = experiment_request.to_result( inference_result, validation_result ) + if experiment_request.output_path: + lock = _get_lock_for_path(experiment_request.output_path) + with lock: + try: + with open(experiment_request.output_path, 'a') as f: + f.write(item.model_dump_json() + '\n') + except Exception as e: + logger.error(f"Failed to write result to {experiment_request.output_path}: {e}") + + return item + def token_distance( inf_position_logprobs: PositionResult, @@ -223,7 +253,7 @@ def distance( def token_distance2( inf_position_logprobs: PositionResult, - val_position_logprobs: PositionResult + val_position_logprobs: PositionResult, ): dist = 0.0 n_matches = 0 @@ -263,7 +293,10 @@ def similarity2( return 1 - dist, matches_ratio -def distance2(inf_result: Result, val_result: Result): +def distance2( + inf_result: Result, + val_result: Result, +): if not _check_match(inf_result, val_result): return -1, -1 From d50506a290c89cf39ddae6522206253ee9efd560 Mon Sep 17 00:00:00 2001 From: Tamaz Gadaev Date: Sat, 7 Mar 2026 01:48:07 +0000 Subject: [PATCH 07/13] update inference to multiling datasets --- .../analysis/inference_length_vs_distance.py | 52 ++++++++++-- .../scripts/inference_validation/inference.py | 79 ++++++++++++++++--- .../inference_validation/validation.py | 12 ++- 3 files changed, 125 insertions(+), 18 deletions(-) diff --git a/mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py b/mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py index b0c9b24ce..f1eee762a 100644 --- a/mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py +++ b/mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py @@ -66,11 +66,48 @@ def resolve_path(raw: str) -> Path: return p.resolve() +def _select_validation_artifact(exp_dir: Path) -> Optional[Path]: + """Pick validation artifact from an experiment directory. + + Supports both default and tagged filenames: + - inference_validation_results.jsonl + - inference_validation_results__.jsonl + """ + default_path = exp_dir / "inference_validation_results.jsonl" + if default_path.exists(): + return default_path + + tagged = sorted(exp_dir.glob("inference_validation_results*.jsonl")) + if not tagged: + return None + # Most recent tagged artifact is typically the one we want. + tagged.sort(key=lambda p: p.stat().st_mtime, reverse=True) + return tagged[0] + + +def _select_validation_config(exp_dir: Path) -> Optional[Path]: + """Pick validation config from an experiment directory. + + Supports both default and tagged filenames: + - validation_config.json + - validation_config__.json + """ + default_path = exp_dir / "validation_config.json" + if default_path.exists(): + return default_path + + tagged = sorted(exp_dir.glob("validation_config*.json")) + if not tagged: + return None + tagged.sort(key=lambda p: p.stat().st_mtime, reverse=True) + return tagged[0] + + def _is_honest(exp_dir: Path) -> Optional[bool]: """Determine honesty from validation_config + inference_config model names.""" inf_cfg = exp_dir / "inference_config.json" - val_cfg = exp_dir / "validation_config.json" - if not inf_cfg.exists() or not val_cfg.exists(): + val_cfg = _select_validation_config(exp_dir) + if not inf_cfg.exists() or val_cfg is None: return None try: inf = json.loads(inf_cfg.read_text()) @@ -96,8 +133,8 @@ def discover_experiments() -> Tuple[Dict[str, Path], Dict[str, Path]]: for d in sorted(DATA_ROOT.iterdir()): if not d.is_dir(): continue - jsonl = d / "inference_validation_results.jsonl" - if not jsonl.exists(): + jsonl = _select_validation_artifact(d) + if jsonl is None: continue h = _is_honest(d) label = _make_label(d) @@ -111,9 +148,12 @@ def discover_experiments() -> Tuple[Dict[str, Path], Dict[str, Path]]: def load_experiment( - exp_dir: Path, n: Optional[int] = None + exp_dir: Path, + n: Optional[int] = None, ) -> Tuple[List[ValidationItem], List[float], List[float]]: - jsonl = exp_dir / "inference_validation_results.jsonl" + jsonl = _select_validation_artifact(exp_dir) + if jsonl is None: + raise RuntimeError(f"No validation artifact found in {exp_dir}") items = load_from_jsonl(str(jsonl), n=n) items, distances, topk = process_data(items) return items, distances, topk diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/inference.py b/mlnode/packages/benchmarks/scripts/inference_validation/inference.py index f8199538f..73b5eb4f0 100644 --- a/mlnode/packages/benchmarks/scripts/inference_validation/inference.py +++ b/mlnode/packages/benchmarks/scripts/inference_validation/inference.py @@ -1,4 +1,22 @@ #!/usr/bin/env python3 +""" +Inference-only runner for OpenAI-compatible vLLM endpoints. + +Multilingual mixed run template (uses script defaults for sampling/retry/workers): + python scripts/inference_validation/inference.py \ + --exp-name \ + --url \ + --model \ + --n-prompts 1000 \ + --multilingual \ + --langs en ch hi ar sp + +Notes: +- Keep `--multilingual --langs ...` to force mixed-language prompts. +- Keep `--n-prompts` as desired total (for 5 langs and 1000 prompts => 200/lang). +- Do not pass sampling flags (`--temperature`, `--top-p`, `--top-k`, + `--repetition-penalty`) if you want pure script defaults. +""" from __future__ import annotations import argparse @@ -27,7 +45,12 @@ def _add_repo_paths() -> None: _add_repo_paths() from validation.data import ModelInfo, RequestParams, Result # noqa: E402 -from validation.prompts import get_squad_data_questions # noqa: E402 +from validation.prompts import ( # noqa: E402 + get_squad_data_questions, + preload_all_language_prompts, + slice_mixed_language_prompts_with_langs, + DATASET_HANDLES, +) from validation.utils import _extract_logprobs, inference # noqa: E402 @@ -126,7 +149,13 @@ def _make_exp_dir(out_base: Path, exp_name: str) -> Path: return exp_dir -def _load_prompts(prompts_file: Optional[Path], n_prompts: int) -> List[str]: +def _load_prompts( + prompts_file: Optional[Path], + n_prompts: int, + multilingual: bool = False, + langs: Optional[List[str]] = None, +) -> tuple: + """Return (prompts, languages) where languages is a list of lang codes per prompt.""" if prompts_file: prompts: List[str] = [] for line in prompts_file.read_text(encoding="utf-8").splitlines(): @@ -135,8 +164,20 @@ def _load_prompts(prompts_file: Optional[Path], n_prompts: int) -> List[str]: prompts.append(t) if not prompts: raise RuntimeError(f"No prompts found in file: {prompts_file}") - return prompts[:n_prompts] - return get_squad_data_questions()[:n_prompts] + prompts = prompts[:n_prompts] + return prompts, ["en"] * len(prompts) + + if multilingual: + lang_tuple = tuple(langs) if langs else ("en", "ch", "hi", "ar") + n_per_lang = max(1, n_prompts // len(lang_tuple)) + all_prompts_by_lang = preload_all_language_prompts(lang_tuple) + prompts, languages = slice_mixed_language_prompts_with_langs( + all_prompts_by_lang, per_language_n=n_per_lang, langs=lang_tuple + ) + return prompts[:n_prompts], languages[:n_prompts] + + prompts = get_squad_data_questions()[:n_prompts] + return prompts, ["en"] * len(prompts) def _run_with_retries(fn, max_attempts: int, backoff_start_s: float, backoff_mult: float): @@ -165,7 +206,10 @@ def main() -> None: parser.add_argument("--model", default="", help="Model id to use; default: first served id from /v1/models.") parser.add_argument("--n-prompts", type=int, default=1000, help="Number of prompts to run.") parser.add_argument("--prompts-file", type=Path, default=None, help="Optional text file with one prompt per line.") - parser.add_argument("--language", default="en", help="Language tag to store in artifact rows.") + parser.add_argument("--language", default="en", help="Language tag to store in artifact rows (single-language mode).") + parser.add_argument("--multilingual", action="store_true", help="Use multilingual Alpaca prompts (en, ch, hi, ar by default).") + parser.add_argument("--langs", type=str, nargs="*", default=None, + help=f"Languages to include with --multilingual. Available: {list(DATASET_HANDLES.keys())}") parser.add_argument("--max-workers", type=int, default=64, help="Concurrent workers.") parser.add_argument("--wait-timeout-s", type=int, default=120, help="Seconds to wait for /v1/models readiness.") parser.add_argument("--max-attempts", type=int, default=3, help="Retry attempts per prompt.") @@ -175,6 +219,9 @@ def main() -> None: parser.add_argument("--temperature", type=float, default=0.99) parser.add_argument("--seed", type=int, default=42) parser.add_argument("--top-logprobs", type=int, default=5) + parser.add_argument("--top-p", type=float, default=None, help="Nucleus sampling top-p (omitted from payload when None).") + parser.add_argument("--top-k", type=int, default=None, help="Top-k sampling (omitted from payload when None).") + parser.add_argument("--repetition-penalty", type=float, default=None, help="Repetition penalty (omitted from payload when None).") args = parser.parse_args() benchmarks_dir = Path(__file__).resolve().parents[2] @@ -196,10 +243,18 @@ def main() -> None: temperature=float(args.temperature), seed=int(args.seed), top_logprobs=int(args.top_logprobs), + top_p=args.top_p, + top_k=args.top_k, + repetition_penalty=args.repetition_penalty, additional_params={}, ) - prompts = _load_prompts(args.prompts_file, n_prompts=int(args.n_prompts)) + prompts, languages = _load_prompts( + args.prompts_file, + n_prompts=int(args.n_prompts), + multilingual=args.multilingual, + langs=args.langs, + ) cfg = { "exp_name": str(args.exp_name), @@ -207,7 +262,8 @@ def main() -> None: "artifact_dir": str(exp_dir), "inference_artifact": str(inference_artifact_path), "n_prompts": len(prompts), - "language": str(args.language), + "multilingual": args.multilingual, + "languages_used": sorted(set(languages)), "model_info": model_info.model_dump(), "request_params": request_params.model_dump(), "vllm_runtime_probe": asdict(probe), @@ -225,11 +281,14 @@ def main() -> None: "temperature": args.temperature, "seed": args.seed, "top_logprobs": args.top_logprobs, + "top_p": args.top_p, + "top_k": args.top_k, + "repetition_penalty": args.repetition_penalty, }, } inference_cfg_path.write_text(json.dumps(cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") - def _work(prompt: str) -> str: + def _work(prompt: str, lang: str) -> str: def _call(): return inference(model_info, request_params, prompt) @@ -242,7 +301,7 @@ def _call(): inference_result = _extract_logprobs(resp) row = InferenceArtifactItem( prompt=prompt, - language=str(args.language), + language=lang, inference_result=inference_result, inference_model=model_info, request_params=request_params, @@ -253,7 +312,7 @@ def _call(): with inference_artifact_path.open("w", encoding="utf-8") as f, ThreadPoolExecutor( max_workers=int(args.max_workers) ) as ex: - futures = [ex.submit(_work, prompt) for prompt in prompts] + futures = [ex.submit(_work, prompt, lang) for prompt, lang in zip(prompts, languages)] for fut in tqdm(as_completed(futures), total=len(futures), desc="Inference", smoothing=0): f.write(fut.result()) diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/validation.py b/mlnode/packages/benchmarks/scripts/inference_validation/validation.py index 7cdaa9455..83e4b3d01 100644 --- a/mlnode/packages/benchmarks/scripts/inference_validation/validation.py +++ b/mlnode/packages/benchmarks/scripts/inference_validation/validation.py @@ -204,14 +204,20 @@ def main() -> None: parser.add_argument("--max-attempts", type=int, default=3, help="Retry attempts per prompt.") parser.add_argument("--retry-backoff-start-s", type=float, default=1.0, help="Initial retry backoff in seconds.") parser.add_argument("--retry-backoff-mult", type=float, default=2.0, help="Retry backoff multiplier.") + parser.add_argument( + "--artifact-tag", + default="", + help="Optional suffix for output filenames, e.g. 'v09' -> inference_validation_results__v09.jsonl", + ) args = parser.parse_args() if not args.inference_artifact.exists(): raise RuntimeError(f"inference artifact not found: {args.inference_artifact}") exp_dir = args.inference_artifact.resolve().parent - output_path = exp_dir / "inference_validation_results.jsonl" - validation_cfg_path = exp_dir / "validation_config.json" + tag = f"__{args.artifact_tag}" if str(args.artifact_tag).strip() else "" + output_path = exp_dir / f"inference_validation_results{tag}.jsonl" + validation_cfg_path = exp_dir / f"validation_config{tag}.json" inference_items = _load_inference_items(args.inference_artifact) request_params = inference_items[0].request_params @@ -252,6 +258,7 @@ def main() -> None: "max_attempts": args.max_attempts, "retry_backoff_start_s": args.retry_backoff_start_s, "retry_backoff_mult": args.retry_backoff_mult, + "artifact_tag": args.artifact_tag, }, } validation_cfg_path.write_text(json.dumps(validation_cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") @@ -279,6 +286,7 @@ def _call(): out_item = ValidationItem( prompt=item.prompt, + language=item.language, inference_result=item.inference_result, validation_result=validation_result, inference_model=item.inference_model, From a88969cd2acf532321cecd0a7d4b5d6b9325556c Mon Sep 17 00:00:00 2001 From: Tamaz Gadaev Date: Sat, 7 Mar 2026 01:54:22 +0000 Subject: [PATCH 08/13] dont keep it in main --- .../benchmarks/scripts/inference_validation/README.md | 4 ++-- .../benchmarks/scripts/inference_validation/inference.py | 2 +- .../benchmarks/scripts/inference_validation/validation.py | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/README.md b/mlnode/packages/benchmarks/scripts/inference_validation/README.md index 5f5fa5c2a..0c6312b8c 100644 --- a/mlnode/packages/benchmarks/scripts/inference_validation/README.md +++ b/mlnode/packages/benchmarks/scripts/inference_validation/README.md @@ -77,7 +77,7 @@ Run from repository root (or adjust paths). ```bash python3 mlnode/packages/benchmarks/scripts/inference_validation/inference.py \ --exp-name my_exp \ - --url http://86.38.238.108:8000 + --url http://HOST:8000 ``` Optional useful flags: @@ -97,7 +97,7 @@ Optional useful flags: ```bash python3 mlnode/packages/benchmarks/scripts/inference_validation/validation.py \ --inference-artifact mlnode/packages/benchmarks/data/inference_validation/my_exp__YYYY-MM-DD_HHMMSS/inference_results.jsonl \ - --validation-url http://86.38.238.108:8000 + --validation-url http://HOST:8000 ``` Optional useful flags: diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/inference.py b/mlnode/packages/benchmarks/scripts/inference_validation/inference.py index 73b5eb4f0..b3be60411 100644 --- a/mlnode/packages/benchmarks/scripts/inference_validation/inference.py +++ b/mlnode/packages/benchmarks/scripts/inference_validation/inference.py @@ -202,7 +202,7 @@ def main() -> None: ) ) parser.add_argument("--exp-name", required=True, help="Experiment name (required).") - parser.add_argument("--url", required=True, help="vLLM base URL, e.g. http://86.38.238.108:8000") + parser.add_argument("--url", required=True, help="vLLM base URL, e.g. http://HOST:8000") parser.add_argument("--model", default="", help="Model id to use; default: first served id from /v1/models.") parser.add_argument("--n-prompts", type=int, default=1000, help="Number of prompts to run.") parser.add_argument("--prompts-file", type=Path, default=None, help="Optional text file with one prompt per line.") diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/validation.py b/mlnode/packages/benchmarks/scripts/inference_validation/validation.py index 83e4b3d01..f2e1919cf 100644 --- a/mlnode/packages/benchmarks/scripts/inference_validation/validation.py +++ b/mlnode/packages/benchmarks/scripts/inference_validation/validation.py @@ -197,7 +197,7 @@ def main() -> None: type=Path, help="Path to inference_results.jsonl generated by scripts/inference_validation/inference.py", ) - parser.add_argument("--validation-url", required=True, help="vLLM base URL, e.g. http://86.38.238.108:8000") + parser.add_argument("--validation-url", required=True, help="vLLM base URL, e.g. http://HOST:8000") parser.add_argument("--validation-model", default="", help="Model id to use; default: first served id from /v1/models.") parser.add_argument("--max-workers", type=int, default=64, help="Concurrent workers.") parser.add_argument("--wait-timeout-s", type=int, default=120, help="Seconds to wait for /v1/models readiness.") From f66db828c7eb6a322ebc035fb68a3b2c85c90342 Mon Sep 17 00:00:00 2001 From: Tamaz Gadaev Date: Sat, 7 Mar 2026 17:35:41 +0000 Subject: [PATCH 09/13] logprobs processed --- mlnode/packages/api/src/api/inference/vllm/runner.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/mlnode/packages/api/src/api/inference/vllm/runner.py b/mlnode/packages/api/src/api/inference/vllm/runner.py index 7e0ea35e0..737671879 100644 --- a/mlnode/packages/api/src/api/inference/vllm/runner.py +++ b/mlnode/packages/api/src/api/inference/vllm/runner.py @@ -120,7 +120,8 @@ def start(self): "--model", self.model, "--dtype", self.dtype, "--port", str(port), - "--host", self.VLLM_HOST + "--host", self.VLLM_HOST, + "--logprobs_mode", "processed_logprobs" ] + self.additional_args vllm_command_str = " ".join(shlex.quote(arg) for arg in vllm_command) From 2bcf41e9fe05a6a3ffb546fd092890034200d55b Mon Sep 17 00:00:00 2001 From: Tamaz Gadaev Date: Mon, 16 Mar 2026 16:48:15 +0000 Subject: [PATCH 10/13] update --- .../scripts/inference_validation/inference.py | 29 +++++++++++++++++-- .../inference_validation/validation.py | 29 +++++++++++++++++-- .../scripts/poc_validation/collect_data.py | 22 +++++++++----- 3 files changed, 66 insertions(+), 14 deletions(-) diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/inference.py b/mlnode/packages/benchmarks/scripts/inference_validation/inference.py index b3be60411..440dac32b 100644 --- a/mlnode/packages/benchmarks/scripts/inference_validation/inference.py +++ b/mlnode/packages/benchmarks/scripts/inference_validation/inference.py @@ -288,17 +288,20 @@ def main() -> None: } inference_cfg_path.write_text(json.dumps(cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") - def _work(prompt: str, lang: str) -> str: + def _work(prompt: str, lang: str) -> tuple: def _call(): return inference(model_info, request_params, prompt) + t0 = time.monotonic() resp = _run_with_retries( _call, max_attempts=max(1, int(args.max_attempts)), backoff_start_s=float(args.retry_backoff_start_s), backoff_mult=float(args.retry_backoff_mult), ) + prompt_elapsed = time.monotonic() - t0 inference_result = _extract_logprobs(resp) + n_tokens = len(inference_result.results) row = InferenceArtifactItem( prompt=prompt, language=lang, @@ -307,17 +310,37 @@ def _call(): request_params=request_params, metadata={}, ) - return row.model_dump_json() + "\n" + return row.model_dump_json() + "\n", n_tokens, prompt_elapsed + + total_output_tokens = 0 + prompt_times: List[float] = [] + run_start = time.monotonic() with inference_artifact_path.open("w", encoding="utf-8") as f, ThreadPoolExecutor( max_workers=int(args.max_workers) ) as ex: futures = [ex.submit(_work, prompt, lang) for prompt, lang in zip(prompts, languages)] for fut in tqdm(as_completed(futures), total=len(futures), desc="Inference", smoothing=0): - f.write(fut.result()) + line, n_tok, elapsed = fut.result() + f.write(line) + total_output_tokens += n_tok + prompt_times.append(elapsed) + + run_elapsed = time.monotonic() - run_start + + performance = { + "total_time_seconds": round(run_elapsed, 3), + "n_prompts": len(prompts), + "total_output_tokens": total_output_tokens, + "output_tokens_per_second": round(total_output_tokens / run_elapsed, 2) if run_elapsed > 0 else 0, + "average_time_per_prompt_seconds": round(run_elapsed / len(prompts), 3) if prompts else 0, + } + cfg["performance"] = performance + inference_cfg_path.write_text(json.dumps(cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") print(f"done: wrote {len(prompts)} inference rows -> {inference_artifact_path}") print(f"config -> {inference_cfg_path}") + print(f"performance: {json.dumps(performance, indent=2)}") if __name__ == "__main__": diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/validation.py b/mlnode/packages/benchmarks/scripts/inference_validation/validation.py index f2e1919cf..06e6c5821 100644 --- a/mlnode/packages/benchmarks/scripts/inference_validation/validation.py +++ b/mlnode/packages/benchmarks/scripts/inference_validation/validation.py @@ -263,7 +263,7 @@ def main() -> None: } validation_cfg_path.write_text(json.dumps(validation_cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") - def _work(item: InferenceArtifactItem) -> str: + def _work(item: InferenceArtifactItem) -> tuple: enforced_tokens = EnforcedTokens.from_result(item.inference_result) def _call(): @@ -274,13 +274,16 @@ def _call(): enforced_tokens=enforced_tokens, ) + t0 = time.monotonic() resp = _run_with_retries( _call, max_attempts=max(1, int(args.max_attempts)), backoff_start_s=float(args.retry_backoff_start_s), backoff_mult=float(args.retry_backoff_mult), ) + prompt_elapsed = time.monotonic() - t0 validation_result = _extract_logprobs(resp) + n_tokens = len(validation_result.results) if validation_result.text != item.inference_result.text: print("[warn] validation text mismatch for one prompt; keeping row in artifact.") @@ -293,15 +296,35 @@ def _call(): validation_model=validation_model, request_params=request_params, ) - return out_item.model_dump_json() + "\n" + return out_item.model_dump_json() + "\n", n_tokens, prompt_elapsed + + total_output_tokens = 0 + prompt_times: List[float] = [] + run_start = time.monotonic() with output_path.open("w", encoding="utf-8") as f, ThreadPoolExecutor(max_workers=int(args.max_workers)) as ex: futures = [ex.submit(_work, item) for item in inference_items] for fut in tqdm(as_completed(futures), total=len(futures), desc="Validation", smoothing=0): - f.write(fut.result()) + line, n_tok, elapsed = fut.result() + f.write(line) + total_output_tokens += n_tok + prompt_times.append(elapsed) + + run_elapsed = time.monotonic() - run_start + + performance = { + "total_time_seconds": round(run_elapsed, 3), + "n_prompts": len(inference_items), + "total_output_tokens": total_output_tokens, + "output_tokens_per_second": round(total_output_tokens / run_elapsed, 2) if run_elapsed > 0 else 0, + "average_time_per_prompt_seconds": round(run_elapsed / len(inference_items), 3) if inference_items else 0, + } + validation_cfg["performance"] = performance + validation_cfg_path.write_text(json.dumps(validation_cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") print(f"done: wrote {len(inference_items)} validated rows -> {output_path}") print(f"config -> {validation_cfg_path}") + print(f"performance: {json.dumps(performance, indent=2)}") if __name__ == "__main__": diff --git a/mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py b/mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py index a8a4af383..295a86428 100644 --- a/mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py +++ b/mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py @@ -34,8 +34,7 @@ import requests -# Experiment name is intentionally explicit in-script. -EXP_NAME = "poc_validation" +DEFAULT_EXP_NAME = "poc_validation" BENCHMARKS_DIR = Path(__file__).resolve().parents[2] DATA_ROOT = BENCHMARKS_DIR / "data" / "poc_calidation" @@ -246,11 +245,16 @@ def main() -> None: default=str(DEFAULT_CONFIG_PATH), help=f"Path to config JSON file (default: {DEFAULT_CONFIG_PATH})", ) + parser.add_argument( + "--exp-name", + default=DEFAULT_EXP_NAME, + help=f"Experiment name prefix for the output directory (default: {DEFAULT_EXP_NAME})", + ) parser.add_argument( "--continue", dest="continue_run", action="store_true", - help="Continue from latest run dir for this EXP_NAME, skipping completed tasks", + help="Continue from latest run dir for this exp-name, skipping completed tasks", ) args = parser.parse_args() @@ -281,15 +285,17 @@ def main() -> None: multi_seed = len(seeds) > 1 DATA_ROOT.mkdir(parents=True, exist_ok=True) + exp_name = args.exp_name + if args.continue_run: - out_dir = find_latest_run(EXP_NAME) + out_dir = find_latest_run(exp_name) if out_dir is None: - print(f"No previous run found for '{EXP_NAME}', starting fresh") + print(f"No previous run found for '{exp_name}', starting fresh") args.continue_run = False if not args.continue_run: timestamp = datetime.now().strftime("%Y-%m-%d_%H%M%S") - out_dir = DATA_ROOT / f"{EXP_NAME}_{timestamp}" + out_dir = DATA_ROOT / f"{exp_name}_{timestamp}" out_dir.mkdir(parents=True, exist_ok=True) completed = get_completed_tasks(out_dir) if args.continue_run else set() @@ -297,7 +303,7 @@ def main() -> None: server_entries = list(config["servers"].items()) vllm_runtime_probe = {name: probe_vllm(url) for name, url in server_entries} run_config = { - "exp_name": EXP_NAME, + "exp_name": exp_name, "timestamp": datetime.now().isoformat(), "artifact_dir": str(out_dir), "data_root": str(DATA_ROOT), @@ -323,7 +329,7 @@ def main() -> None: total_tasks = sum(len(tasks) for tasks in url_to_tasks.values()) - print(f"EXP_NAME: {EXP_NAME}") + print(f"EXP_NAME: {exp_name}") print(f"Output: {out_dir}") print(f"Model: {config['model']}") print(f"Servers: {list(config['servers'].keys())}") From 189f8744509ad430175210f4feffc026bebf3b5e Mon Sep 17 00:00:00 2001 From: Tamaz Gadaev Date: Mon, 16 Mar 2026 16:50:44 +0000 Subject: [PATCH 11/13] rmeove logprobs mode --- mlnode/packages/api/src/api/inference/vllm/runner.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/mlnode/packages/api/src/api/inference/vllm/runner.py b/mlnode/packages/api/src/api/inference/vllm/runner.py index 737671879..7e0ea35e0 100644 --- a/mlnode/packages/api/src/api/inference/vllm/runner.py +++ b/mlnode/packages/api/src/api/inference/vllm/runner.py @@ -120,8 +120,7 @@ def start(self): "--model", self.model, "--dtype", self.dtype, "--port", str(port), - "--host", self.VLLM_HOST, - "--logprobs_mode", "processed_logprobs" + "--host", self.VLLM_HOST ] + self.additional_args vllm_command_str = " ".join(shlex.quote(arg) for arg in vllm_command) From e7751e68c05d4de7f290aec7c6b26b7b182fe0fc Mon Sep 17 00:00:00 2001 From: Tamaz Gadaev Date: Mon, 23 Mar 2026 15:22:48 +0000 Subject: [PATCH 12/13] update scripts --- .../analysis/inference_length_vs_distance.py | 95 ++- .../scripts/analysis/poc_l2_histogram.py | 111 ++- .../scripts/inference_validation/inference.py | 26 +- .../inference_validation/validation.py | 15 +- .../scripts/poc_validation/collect_data.py | 723 +++++++++++------- 5 files changed, 657 insertions(+), 313 deletions(-) diff --git a/mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py b/mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py index f1eee762a..57069c742 100644 --- a/mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py +++ b/mlnode/packages/benchmarks/scripts/analysis/inference_length_vs_distance.py @@ -52,7 +52,7 @@ from validation.data import load_from_jsonl, ValidationItem from validation.analysis import process_data, find_optimal_bounds_parallel -DATA_ROOT = BENCHMARKS_DIR / "data" / "inference_validation" +DATA_ROOT = BENCHMARKS_DIR / "data" / "experiments" DEFAULT_PLOTS_DIR = BENCHMARKS_DIR / "data" / "plots" @@ -69,15 +69,20 @@ def resolve_path(raw: str) -> Path: def _select_validation_artifact(exp_dir: Path) -> Optional[Path]: """Pick validation artifact from an experiment directory. - Supports both default and tagged filenames: - - inference_validation_results.jsonl - - inference_validation_results__.jsonl + Supports both old and new filenames: + - validation_results.jsonl (new) + - inference_validation_results.jsonl (legacy) + - validation_results__.jsonl / inference_validation_results__.jsonl """ - default_path = exp_dir / "inference_validation_results.jsonl" - if default_path.exists(): - return default_path - - tagged = sorted(exp_dir.glob("inference_validation_results*.jsonl")) + for name in ["validation_results.jsonl", "inference_validation_results.jsonl"]: + default_path = exp_dir / name + if default_path.exists(): + return default_path + + tagged = sorted( + list(exp_dir.glob("validation_results*.jsonl")) + + list(exp_dir.glob("inference_validation_results*.jsonl")) + ) if not tagged: return None # Most recent tagged artifact is typically the one we want. @@ -150,8 +155,12 @@ def discover_experiments() -> Tuple[Dict[str, Path], Dict[str, Path]]: def load_experiment( exp_dir: Path, n: Optional[int] = None, + artifact_path: Optional[Path] = None, ) -> Tuple[List[ValidationItem], List[float], List[float]]: - jsonl = _select_validation_artifact(exp_dir) + if artifact_path is not None: + jsonl = artifact_path + else: + jsonl = _select_validation_artifact(exp_dir) if jsonl is None: raise RuntimeError(f"No validation artifact found in {exp_dir}") items = load_from_jsonl(str(jsonl), n=n) @@ -318,21 +327,48 @@ def main() -> None: help=f"Output directory for plots (default: {DEFAULT_PLOTS_DIR})") args = parser.parse_args() + def _parse_entries(raw_paths: Optional[List[str]]) -> List[Tuple[str, Path, Optional[Path]]]: + """Parse CLI paths into (label, exp_dir, artifact_path_or_None). + + Each entry is either a directory or a direct .jsonl file path. + """ + if not raw_paths: + return [] + entries: List[Tuple[str, Path, Optional[Path]]] = [] + for p_str in raw_paths: + p = Path(p_str) + if not p.is_absolute(): + for candidate in [Path.cwd() / p, BENCHMARKS_DIR / p]: + if candidate.exists(): + p = candidate.resolve() + break + else: + p = p.resolve() + if p.is_file() and p.suffix == ".jsonl": + entries.append((p.parent.name + "/" + p.stem, p.parent, p)) + elif p.is_dir(): + entries.append((_make_label(p), p, None)) + else: + print(f"Warning: skipping {p_str} (not a dir or .jsonl file)") + return entries + if args.honest is not None or args.fraud is not None: - honest_dirs = {_make_label(resolve_path(p)): resolve_path(p) for p in (args.honest or [])} - fraud_dirs = {_make_label(resolve_path(p)): resolve_path(p) for p in (args.fraud or [])} + honest_entries = _parse_entries(args.honest) + fraud_entries = _parse_entries(args.fraud) else: - honest_dirs, fraud_dirs = discover_experiments() + h_dirs, f_dirs = discover_experiments() + honest_entries = [(k, v, None) for k, v in h_dirs.items()] + fraud_entries = [(k, v, None) for k, v in f_dirs.items()] - if not honest_dirs and not fraud_dirs: + if not honest_entries and not fraud_entries: print(f"Error: no experiment directories found under {DATA_ROOT}") sys.exit(1) - print(f"Honest experiments ({len(honest_dirs)}):") - for name in honest_dirs: + print(f"Honest experiments ({len(honest_entries)}):") + for name, _, _ in honest_entries: print(f" - {name}") - print(f"Fraud experiments ({len(fraud_dirs)}):") - for name in fraud_dirs: + print(f"Fraud experiments ({len(fraud_entries)}):") + for name, _, _ in fraud_entries: print(f" - {name}") print() @@ -344,19 +380,24 @@ def main() -> None: all_honest_distances: List[float] = [] all_fraud_distances: List[float] = [] - for name, d in honest_dirs.items(): + honest_dirs: Dict[str, Path] = {} + fraud_dirs: Dict[str, Path] = {} + + for name, d, artifact in honest_entries: print(f"Loading honest: {name}") - items, distances, _ = load_experiment(d, args.n_items) + items, distances, _ = load_experiment(d, args.n_items, artifact_path=artifact) honest_items_dict[name] = items honest_distances_dict[name] = distances all_honest_distances.extend(distances) + honest_dirs[name] = d - for name, d in fraud_dirs.items(): + for name, d, artifact in fraud_entries: print(f"Loading fraud: {name}") - items, distances, _ = load_experiment(d, args.n_items) + items, distances, _ = load_experiment(d, args.n_items, artifact_path=artifact) fraud_items_dict[name] = items fraud_distances_dict[name] = distances all_fraud_distances.extend(distances) + fraud_dirs[name] = d bounds = None if args.lower_bound is not None and args.upper_bound is not None: @@ -373,7 +414,15 @@ def main() -> None: bounds = (lower, upper) title = args.title or "Inference Validation" - plots_dir = Path(args.out) if args.out else DEFAULT_PLOTS_DIR + if args.out: + plots_dir = Path(args.out) + else: + primary_dir = None + if fraud_dirs: + primary_dir = next(iter(fraud_dirs.values())) + elif honest_dirs: + primary_dir = next(iter(honest_dirs.values())) + plots_dir = (primary_dir / "plots") if primary_dir else DEFAULT_PLOTS_DIR plot_length_vs_distance( title=title, diff --git a/mlnode/packages/benchmarks/scripts/analysis/poc_l2_histogram.py b/mlnode/packages/benchmarks/scripts/analysis/poc_l2_histogram.py index 7543af0bb..2c1e9deff 100644 --- a/mlnode/packages/benchmarks/scripts/analysis/poc_l2_histogram.py +++ b/mlnode/packages/benchmarks/scripts/analysis/poc_l2_histogram.py @@ -35,7 +35,7 @@ import numpy as np BENCHMARKS_DIR = Path(__file__).resolve().parents[2] -DATA_ROOT = BENCHMARKS_DIR / "data" / "poc_calidation" +DATA_ROOT = BENCHMARKS_DIR / "data" / "experiments" DEFAULT_PLOTS_DIR = BENCHMARKS_DIR / "data" / "plots" @@ -46,7 +46,9 @@ def load_run(run_dir: Path) -> Dict[str, Dict]: """ results: Dict[str, Dict] = {} for fpath in sorted(run_dir.glob("*.json")): - if fpath.name in ("run_config.json", "config.json"): + if fpath.name in ("run_config.json", "config.json", "poc_config.json", + "inference_config.json", "validation_config.json", + "server.json"): continue try: data = json.loads(fpath.read_text(encoding="utf-8")) @@ -110,37 +112,62 @@ def plot_histogram( run_a_name: str, run_b_name: str, out_path: Path, + fraud_distances: Optional[np.ndarray] = None, + fraud_label: str = "Fraud pairs (INT4 vs FP8)", ) -> None: threshold = float(np.percentile(distances, percentile)) fig, ax = plt.subplots(figsize=(10, 6)) - ax.hist(distances, bins=60, color="#5cb85c", edgecolor="#4a9a4a", alpha=0.9, - label=f"Honest pairs (same-marker)") + ax.hist(distances, bins=60, color="#5cb85c", edgecolor="#4a9a4a", alpha=0.85, + label=f"Honest pairs ({len(distances)})") + if fraud_distances is not None and len(fraud_distances) > 0: + ax.hist(fraud_distances, bins=60, color="#d9534f", edgecolor="#c9302c", alpha=0.65, + label=f"{fraud_label} ({len(fraud_distances)})") ax.axvline(threshold, color="red", linestyle="--", linewidth=2, - label=f"p{int(percentile)}: {threshold:.4f}") + label=f"Honest p{int(percentile)}: {threshold:.4f}") ax.set_xlabel("L2 Distance", fontsize=13) ax.set_ylabel("Count", fontsize=13) - ax.set_title("Honest distribution + threshold", fontsize=14) + title = "Honest vs Fraud distribution" if fraud_distances is not None else "Honest distribution + threshold" + ax.set_title(title, fontsize=14) ax.legend(fontsize=12) ax.tick_params(labelsize=11) fig.tight_layout() fig.savefig(out_path, dpi=150) plt.close(fig) - print(f" [{server_name}] {len(distances)} pairs | " + print(f" [{server_name}] Honest: {len(distances)} pairs | " f"mean={distances.mean():.4f} median={np.median(distances):.4f} " f"p{int(percentile)}={threshold:.4f} max={distances.max():.4f}") + if fraud_distances is not None and len(fraud_distances) > 0: + print(f" [{server_name}] Fraud: {len(fraud_distances)} pairs | " + f"mean={fraud_distances.mean():.4f} median={np.median(fraud_distances):.4f} " + f"max={fraud_distances.max():.4f}") print(f" -> {out_path}") +def _cross_compare_first( + data_a: Dict[str, Dict], + data_b: Dict[str, Dict], +) -> Tuple[str, np.ndarray, np.ndarray, List[int]]: + """When no common server names, cross-compare the first server from each.""" + sa = list(data_a.keys())[0] + sb = list(data_b.keys())[0] + vecs_a, vecs_b, nonces = match_vectors(data_a[sa], data_b[sb]) + return f"{sa}_vs_{sb}", vecs_a, vecs_b, nonces + + def main() -> None: parser = argparse.ArgumentParser( description="Plot L2 distance histograms between two PoC validation runs" ) parser.add_argument("--run-a", type=str, default=None, - help="Path to first run directory") + help="Path to first run directory (honest side A)") parser.add_argument("--run-b", type=str, default=None, - help="Path to second run directory") + help="Path to second run directory (honest side B)") + parser.add_argument("--fraud-a", type=str, default=None, + help="Path to fraud run directory (side A). Compared against --run-b.") + parser.add_argument("--fraud-b", type=str, default=None, + help="Path to fraud run directory (side B). Compared against --run-a.") parser.add_argument("--percentile", type=float, default=98, help="Threshold percentile for the dashed line (default: 98)") parser.add_argument("--out", type=str, default=None, @@ -161,21 +188,41 @@ def main() -> None: sys.exit(1) run_a, run_b = recent[1], recent[0] + fraud_run: Optional[Path] = None + fraud_against: str = "" + if args.fraud_a and args.fraud_b: + parser.error("Specify --fraud-a OR --fraud-b, not both") + if args.fraud_a: + fraud_run = resolve_run_path(args.fraud_a) + fraud_against = "b" + elif args.fraud_b: + fraud_run = resolve_run_path(args.fraud_b) + fraud_against = "a" + for label, d in [("run-a", run_a), ("run-b", run_b)]: if not d.is_dir(): print(f"Error: {label} directory not found: {d}") sys.exit(1) + if fraud_run and not fraud_run.is_dir(): + print(f"Error: fraud directory not found: {fraud_run}") + sys.exit(1) - plots_dir = Path(args.out) if args.out else DEFAULT_PLOTS_DIR + if args.out: + plots_dir = Path(args.out) + else: + plots_dir = run_b / "plots" plots_dir.mkdir(parents=True, exist_ok=True) print(f"Run A: {run_a.name}") print(f"Run B: {run_b.name}") + if fraud_run: + print(f"Fraud: {fraud_run.name} (compared against run-{'b' if fraud_against == 'b' else 'a'})") print(f"Percentile: p{int(args.percentile)}") print(f"Output: {plots_dir}\n") data_a = load_run(run_a) data_b = load_run(run_b) + data_fraud = load_run(fraud_run) if fraud_run else {} if not data_a: print(f"Error: no valid artifact files in run A ({run_a})") @@ -192,6 +239,7 @@ def main() -> None: sys.exit(1) common_servers = [args.server] + # Compute honest distances if common_servers: print(f"Comparing servers: {common_servers}\n") for server in common_servers: @@ -200,29 +248,52 @@ def main() -> None: print(f" [{server}] no common nonces, skipping") continue - dists = compute_l2(vecs_a, vecs_b) + honest_dists = compute_l2(vecs_a, vecs_b) + fraud_dists = _compute_fraud_dists(data_fraud, data_a, data_b, fraud_against) + fname = f"l2_hist_{server}_{run_a.name}_vs_{run_b.name}.png" - plot_histogram(dists, args.percentile, server, - run_a.name, run_b.name, plots_dir / fname) + plot_histogram(honest_dists, args.percentile, server, + run_a.name, run_b.name, plots_dir / fname, + fraud_distances=fraud_dists) else: servers_a = list(data_a.keys()) servers_b = list(data_b.keys()) print(f"No common server names (A={servers_a}, B={servers_b}), " f"cross-comparing first server from each run.\n") - sa, sb = servers_a[0], servers_b[0] - vecs_a, vecs_b, nonces = match_vectors(data_a[sa], data_b[sb]) + label, vecs_a, vecs_b, nonces = _cross_compare_first(data_a, data_b) if len(nonces) == 0: - print(f" [{sa} vs {sb}] no common nonces") + print(f" [{label}] no common nonces") sys.exit(1) - dists = compute_l2(vecs_a, vecs_b) - label = f"{sa}_vs_{sb}" + honest_dists = compute_l2(vecs_a, vecs_b) + fraud_dists = _compute_fraud_dists(data_fraud, data_a, data_b, fraud_against) + fname = f"l2_hist_{label}_{run_a.name}_vs_{run_b.name}.png" - plot_histogram(dists, args.percentile, label, - run_a.name, run_b.name, plots_dir / fname) + plot_histogram(honest_dists, args.percentile, label, + run_a.name, run_b.name, plots_dir / fname, + fraud_distances=fraud_dists) print("\nDone.") +def _compute_fraud_dists( + data_fraud: Dict[str, Dict], + data_a: Dict[str, Dict], + data_b: Dict[str, Dict], + fraud_against: str, +) -> Optional[np.ndarray]: + """Compute fraud L2 distances by cross-comparing fraud run against the honest counterpart.""" + if not data_fraud: + return None + compare_to = data_b if fraud_against == "b" else data_a + fraud_server = list(data_fraud.keys())[0] + compare_server = list(compare_to.keys())[0] + vf, vc, nonces = match_vectors(data_fraud[fraud_server], compare_to[compare_server]) + if len(nonces) == 0: + print(f" [fraud] no common nonces between fraud ({fraud_server}) and honest ({compare_server})") + return None + return compute_l2(vf, vc) + + if __name__ == "__main__": main() diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/inference.py b/mlnode/packages/benchmarks/scripts/inference_validation/inference.py index 440dac32b..0a63701d9 100644 --- a/mlnode/packages/benchmarks/scripts/inference_validation/inference.py +++ b/mlnode/packages/benchmarks/scripts/inference_validation/inference.py @@ -1,11 +1,16 @@ #!/usr/bin/env python3 """ -Inference-only runner for OpenAI-compatible vLLM endpoints. +Inference-only runner for OpenAI-compatible endpoints. + +The --url should point to the mlnode API (port 8080), which proxies /v1/* +requests to vLLM backends with least-connections load-balancing. This ensures +all backends are utilised. Pointing directly at a single vLLM backend port +(e.g. 5001) also works but bypasses load-balancing. Multilingual mixed run template (uses script defaults for sampling/retry/workers): python scripts/inference_validation/inference.py \ --exp-name \ - --url \ + --url http://: \ --model \ --n-prompts 1000 \ --multilingual \ @@ -144,7 +149,7 @@ def _resolve_model_name(configured: str, served_ids: List[str], *, base_url: str def _make_exp_dir(out_base: Path, exp_name: str) -> Path: out_base.mkdir(parents=True, exist_ok=True) ts = datetime.now().strftime("%Y-%m-%d_%H%M%S") - exp_dir = out_base / f"{exp_name}__{ts}" + exp_dir = out_base / f"{exp_name}_{ts}" exp_dir.mkdir(parents=True, exist_ok=True) return exp_dir @@ -198,11 +203,12 @@ def main() -> None: parser = argparse.ArgumentParser( description=( "Run INFERENCE ONLY against an already running OpenAI-compatible vLLM server. " - "Saves a pure inference artifact and inference config under data/inference_validation/__/." + "Saves a pure inference artifact and inference config under data/experiments/_/." ) ) - parser.add_argument("--exp-name", required=True, help="Experiment name (required).") - parser.add_argument("--url", required=True, help="vLLM base URL, e.g. http://HOST:8000") + parser.add_argument("--exp-name", default="inference", help="Experiment name prefix (used when --exp-dir is not set).") + parser.add_argument("--exp-dir", type=Path, default=None, help="Write into an existing experiment directory instead of creating a new one.") + parser.add_argument("--url", required=True, help="Server URL (mlnode API recommended for load-balancing across backends, e.g. http://HOST:8080)") parser.add_argument("--model", default="", help="Model id to use; default: first served id from /v1/models.") parser.add_argument("--n-prompts", type=int, default=1000, help="Number of prompts to run.") parser.add_argument("--prompts-file", type=Path, default=None, help="Optional text file with one prompt per line.") @@ -225,8 +231,12 @@ def main() -> None: args = parser.parse_args() benchmarks_dir = Path(__file__).resolve().parents[2] - out_base = benchmarks_dir / "data" / "inference_validation" - exp_dir = _make_exp_dir(out_base=out_base, exp_name=args.exp_name) + if args.exp_dir: + exp_dir = args.exp_dir.resolve() + exp_dir.mkdir(parents=True, exist_ok=True) + else: + out_base = benchmarks_dir / "data" / "experiments" + exp_dir = _make_exp_dir(out_base=out_base, exp_name=args.exp_name) inference_artifact_path = exp_dir / "inference_results.jsonl" inference_cfg_path = exp_dir / "inference_config.json" diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/validation.py b/mlnode/packages/benchmarks/scripts/inference_validation/validation.py index 06e6c5821..b569f4594 100644 --- a/mlnode/packages/benchmarks/scripts/inference_validation/validation.py +++ b/mlnode/packages/benchmarks/scripts/inference_validation/validation.py @@ -197,7 +197,7 @@ def main() -> None: type=Path, help="Path to inference_results.jsonl generated by scripts/inference_validation/inference.py", ) - parser.add_argument("--validation-url", required=True, help="vLLM base URL, e.g. http://HOST:8000") + parser.add_argument("--validation-url", required=True, help="Server URL (mlnode API recommended for load-balancing across backends, e.g. http://HOST:8080)") parser.add_argument("--validation-model", default="", help="Model id to use; default: first served id from /v1/models.") parser.add_argument("--max-workers", type=int, default=64, help="Concurrent workers.") parser.add_argument("--wait-timeout-s", type=int, default=120, help="Seconds to wait for /v1/models readiness.") @@ -207,16 +207,23 @@ def main() -> None: parser.add_argument( "--artifact-tag", default="", - help="Optional suffix for output filenames, e.g. 'v09' -> inference_validation_results__v09.jsonl", + help="Optional suffix for output filenames, e.g. 'v09' -> validation_results__v09.jsonl", + ) + parser.add_argument( + "--exp-dir", + type=Path, + default=None, + help="Experiment directory to write results into. Default: same directory as --inference-artifact.", ) args = parser.parse_args() if not args.inference_artifact.exists(): raise RuntimeError(f"inference artifact not found: {args.inference_artifact}") - exp_dir = args.inference_artifact.resolve().parent + exp_dir = args.exp_dir.resolve() if args.exp_dir else args.inference_artifact.resolve().parent + exp_dir.mkdir(parents=True, exist_ok=True) tag = f"__{args.artifact_tag}" if str(args.artifact_tag).strip() else "" - output_path = exp_dir / f"inference_validation_results{tag}.jsonl" + output_path = exp_dir / f"validation_results{tag}.jsonl" validation_cfg_path = exp_dir / f"validation_config{tag}.json" inference_items = _load_inference_items(args.inference_artifact) diff --git a/mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py b/mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py index 295a86428..f8cc576db 100644 --- a/mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py +++ b/mlnode/packages/benchmarks/scripts/poc_validation/collect_data.py @@ -1,32 +1,42 @@ #!/usr/bin/env python3 """ -PoC artifact data collection script for mlnode benchmarks. - -This is adapted from vllm/scripts/collect_data.py with mlnode-specific output: -- Saves artifacts under benchmarks/data/poc_calidation/{EXP_NAME}_{timestamp} -- Stores a run config JSON that includes a vLLM runtime probe (models/health/version) -- Stores the input config only inside run_config.json (no separate config.json file) -- Adds timing and nonces_per_min metrics to each saved artifact file - -Usage: - python packages/benchmarks/poc_validation/collect_data.py - python packages/benchmarks/poc_validation/collect_data.py --config packages/benchmarks/poc_validation/config.json - python packages/benchmarks/poc_validation/collect_data.py --continue +Streaming PoC collection aligned with `test.py`. + +Starts continuous PoC generation through the mlnode API (port 8080) using +`/api/v1/inference/pow/init/generate`. That endpoint fans out work to all +healthy vLLM backends, so the collected nonces reflect the combined throughput +of all instances behind the server. + +When the remote server cannot reach this machine directly (e.g. firewalled +inbound), the script can set up an SSH reverse tunnel automatically. Add an +"ssh" section to the config JSON: + + "ssh": { + "host": "", + "port": 22, + "user": "root", + "key": "/path/to/ssh/key" + } + +The tunnel maps the receiver port on the remote host back to localhost, so +vLLM callbacks go through SSH instead of requiring open inbound ports. """ from __future__ import annotations import argparse +import atexit import base64 import itertools import json import os import signal +import subprocess import sys import threading import time -from concurrent.futures import ThreadPoolExecutor from datetime import datetime +from http.server import BaseHTTPRequestHandler, ThreadingHTTPServer from pathlib import Path from typing import Any, Dict, List, Optional, Set, Tuple @@ -34,20 +44,23 @@ import requests -DEFAULT_EXP_NAME = "poc_validation" +DEFAULT_EXP_NAME = "poc_validation_stream" +DEFAULT_WARMUP_SECONDS = 5 +DEFAULT_MEASUREMENT_SECONDS = 30 +DEFAULT_PROGRESS_INTERVAL_SECONDS = 10 +DEFAULT_RECEIVER_PORT = 9999 +DEFAULT_SSH_KEY = "/root/workspace/.ssh/vast_b200" BENCHMARKS_DIR = Path(__file__).resolve().parents[2] -DATA_ROOT = BENCHMARKS_DIR / "data" / "poc_calidation" +DATA_ROOT = BENCHMARKS_DIR / "data" / "experiments" DEFAULT_CONFIG_PATH = Path(__file__).resolve().with_name("config.json") -# Global shutdown event for Ctrl-C handling shutdown_event = threading.Event() _sigint_count = 0 _sigint_lock = threading.Lock() def signal_handler(signum, frame) -> None: - """Handle Ctrl-C by initiating shutdown; force-exit on repeated Ctrl-C.""" del signum, frame global _sigint_count with _sigint_lock: @@ -62,26 +75,11 @@ def signal_handler(signum, frame) -> None: os._exit(130) -def api_call(url: str, endpoint: str, method: str = "POST", json_data: Optional[dict] = None) -> dict: - """Make API call to server.""" - if shutdown_event.is_set(): - raise RuntimeError("Cancelled") - full_url = f"{url.rstrip('/')}{endpoint}" - if method == "GET": - resp = requests.get(full_url, timeout=30) - else: - resp = requests.post(full_url, json=json_data, timeout=600) - resp.raise_for_status() - return resp.json() - - def safe_http_get(url: str, timeout: int = 5) -> Dict[str, Any]: - """GET helper that never raises; used for runtime probing.""" try: resp = requests.get(url, timeout=timeout) - body: Any try: - body = resp.json() + body: Any = resp.json() except Exception: body = resp.text[:5000] return { @@ -96,166 +94,395 @@ def safe_http_get(url: str, timeout: int = 5) -> Dict[str, Any]: } -def probe_vllm(base_url: str) -> Dict[str, Any]: - """Collect runtime vLLM info similar to inference_validation/inference.py.""" +def probe_server(base_url: str) -> Dict[str, Any]: base = base_url.rstrip("/") - models_info = safe_http_get(f"{base}/v1/models") - served_model_ids: List[str] = [] - if models_info.get("ok") and isinstance(models_info.get("body"), dict): - data = models_info["body"].get("data", []) - if isinstance(data, list): - for item in data: - if isinstance(item, dict) and item.get("id"): - served_model_ids.append(str(item["id"])) - return { "base_url": base, "timestamp": datetime.now().isoformat(), - "served_model_ids": served_model_ids, - "models": models_info, + "models": safe_http_get(f"{base}/v1/models"), "health": safe_http_get(f"{base}/health"), "version": safe_http_get(f"{base}/version"), + "pow_status": safe_http_get(f"{base}/api/v1/inference/pow/status"), + "inference_status": safe_http_get(f"{base}/api/v1/inference/up/status"), } def decode_vector(b64: str) -> np.ndarray: - """Decode base64 FP16 little-endian to FP32.""" data = base64.b64decode(b64) f16 = np.frombuffer(data, dtype=" dict: - """Collect data from a single server for a specific seed.""" - # Stop any running generation - try: - api_call(url, "/api/v1/pow/stop") - except Exception: - pass # Ignore if nothing is currently running +class BatchReceiver: + def __init__(self, port: int): + self.port = port + self._proof_batches: List[dict] = [] + self._server: Optional[ThreadingHTTPServer] = None + self._thread: Optional[threading.Thread] = None + self._lock = threading.Lock() + + def _make_handler(self): + receiver = self + + class Handler(BaseHTTPRequestHandler): + def log_message(self, format, *args): + del format, args + + def _send_json(self, data: dict, status: int = 200): + self.send_response(status) + self.send_header("Content-Type", "application/json") + self.end_headers() + self.wfile.write(json.dumps(data).encode("utf-8")) + + def _count_nonces(self, batch: dict) -> int: + artifacts = batch.get("artifacts", []) + if isinstance(artifacts, list): + return len(artifacts) + nonces = batch.get("nonces", []) + if isinstance(nonces, list): + return len(nonces) + return 0 + + def do_GET(self): + if self.path == "/health": + self._send_json({"status": "OK"}) + return + if self.path == "/stats": + with receiver._lock: + batch_sizes = [self._count_nonces(batch) for batch in receiver._proof_batches] + total_nonces = sum(batch_sizes) + avg_batch_size = sum(batch_sizes) / len(batch_sizes) if batch_sizes else 0 + self._send_json( + { + "total_nonces": total_nonces, + "batch_count": len(batch_sizes), + "batch_sizes": batch_sizes, + "avg_batch_size": avg_batch_size, + } + ) + return + if self.path == "/batches": + with receiver._lock: + batches = list(receiver._proof_batches) + self._send_json({"batches": batches}) + return + self._send_json({"error": "Not found"}, 404) + + def do_POST(self): + content_length = int(self.headers.get("Content-Length", 0)) + try: + body = self.rfile.read(content_length).decode("utf-8") if content_length > 0 else "{}" + except ConnectionResetError: + return + try: + data = json.loads(body) + except json.JSONDecodeError: + self._send_json({"error": "Invalid JSON"}, 400) + return + + if self.path == "/generated": + with receiver._lock: + receiver._proof_batches.append(data) + self._send_json({"message": "OK"}) + return + if self.path == "/clear": + with receiver._lock: + receiver._proof_batches.clear() + self._send_json({"message": "Cleared"}) + return + self._send_json({"error": "Not found"}, 404) + + return Handler + + def start(self) -> None: + if self._server is not None: + return + self._server = ThreadingHTTPServer(("0.0.0.0", self.port), self._make_handler()) + self._thread = threading.Thread(target=self._server.serve_forever, daemon=True) + self._thread.start() + + def wait_until_ready(self, timeout_s: int = 30) -> bool: + deadline = time.time() + timeout_s + while time.time() < deadline: + try: + response = requests.get(f"http://127.0.0.1:{self.port}/health", timeout=2) + if response.status_code == 200: + return True + except requests.exceptions.RequestException: + pass + time.sleep(0.5) + return False + + def stop(self) -> None: + if self._server is not None: + self._server.shutdown() + self._server.server_close() + self._server = None + if self._thread is not None: + self._thread.join(timeout=5) + self._thread = None + + def clear(self) -> None: + with self._lock: + self._proof_batches.clear() + + def stats(self) -> Dict[str, Any]: + with self._lock: + batch_sizes = [len(batch.get("artifacts", [])) for batch in self._proof_batches] + total_nonces = sum(batch_sizes) + avg_batch_size = sum(batch_sizes) / len(batch_sizes) if batch_sizes else 0 + return { + "total_nonces": total_nonces, + "batch_count": len(batch_sizes), + "batch_sizes": batch_sizes, + "avg_batch_size": avg_batch_size, + } + + def collected_artifacts(self) -> List[dict]: + with self._lock: + batches = list(self._proof_batches) + artifacts: List[dict] = [] + for batch in batches: + batch_artifacts = batch.get("artifacts", []) + if isinstance(batch_artifacts, list): + artifacts.extend(batch_artifacts) + return artifacts + + +class SSHTunnel: + """Manages an SSH reverse tunnel as a subprocess.""" + + def __init__( + self, + ssh_host: str, + ssh_port: int, + ssh_user: str, + ssh_key: str, + remote_port: int, + local_port: int, + ): + self.ssh_host = ssh_host + self.ssh_port = ssh_port + self.ssh_user = ssh_user + self.ssh_key = ssh_key + self.remote_port = remote_port + self.local_port = local_port + self._proc: Optional[subprocess.Popen] = None + + def start(self, timeout: int = 15) -> None: + cmd = [ + "ssh", + "-i", self.ssh_key, + "-R", f"{self.remote_port}:127.0.0.1:{self.local_port}", + "-p", str(self.ssh_port), + f"{self.ssh_user}@{self.ssh_host}", + "-N", + "-o", "StrictHostKeyChecking=no", + "-o", f"ConnectTimeout={timeout}", + "-o", "ServerAliveInterval=30", + "-o", "ExitOnForwardFailure=yes", + ] + self._proc = subprocess.Popen( + cmd, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + ) + time.sleep(3) + if self._proc.poll() is not None: + _, stderr = self._proc.communicate(timeout=5) + raise RuntimeError( + f"SSH tunnel failed (exit {self._proc.returncode}): {stderr.decode().strip()}" + ) + print(f" SSH tunnel: {self.ssh_host}:{self.remote_port} -> localhost:{self.local_port}") + atexit.register(self.stop) + + def stop(self) -> None: + if self._proc is not None and self._proc.poll() is None: + self._proc.terminate() + try: + self._proc.wait(timeout=5) + except subprocess.TimeoutExpired: + self._proc.kill() + self._proc = None - requested_nonces = list(range(int(config.get("nonce_count", 500)))) + @property + def alive(self) -> bool: + return self._proc is not None and self._proc.poll() is None - gen_config = { + +def get_output_filename(server_name: str, block_hash: str, public_key: str, multi_seed: bool) -> str: + if multi_seed: + return f"poc_artifacts_{server_name}_{block_hash}_{public_key}.json" + return "poc_artifacts.json" + + +def get_task_key(server_name: str, block_hash: str, public_key: str, multi_seed: bool) -> str: + if multi_seed: + return f"{server_name}_{block_hash}_{public_key}" + return server_name + + +def find_latest_run(exp_name: str) -> Optional[Path]: + if not DATA_ROOT.exists(): + return None + matching = sorted( + [d for d in DATA_ROOT.iterdir() if d.is_dir() and d.name.startswith(f"{exp_name}_")], + key=lambda d: d.name, + reverse=True, + ) + return matching[0] if matching else None + + +def get_completed_tasks(out_dir: Path) -> Set[str]: + completed: Set[str] = set() + for json_file in out_dir.glob("artifacts_*.json"): + try: + data = json.loads(json_file.read_text(encoding="utf-8")) + if "error" in data or not data.get("artifacts"): + continue + stem = json_file.stem.replace("artifacts_", "", 1) + completed.add(stem) + except Exception: + pass + return completed + + +def stop_generation(server_url: str) -> None: + try: + response = requests.post(f"{server_url.rstrip('/')}/api/v1/inference/pow/stop", json={}, timeout=60) + response.raise_for_status() + except Exception: + pass + + +def init_generate(server_url: str, payload: dict, max_retries: int = 12, retry_delay: int = 5) -> dict: + url = f"{server_url.rstrip('/')}/api/v1/inference/pow/init/generate" + for attempt in range(max_retries): + if shutdown_event.is_set(): + raise RuntimeError("Cancelled") + response = requests.post(url, json=payload, timeout=60) + if response.status_code == 503 and attempt < max_retries - 1: + print(f" vLLM not ready (503), retrying in {retry_delay}s... ({attempt + 1}/{max_retries})") + time.sleep(retry_delay) + continue + response.raise_for_status() + return response.json() + raise RuntimeError("Failed to initialize generation") + + +def collect_from_server( + name: str, + server_url: str, + config: dict, + block_hash: str, + public_key: str, + receiver: BatchReceiver, + callback_url: str, + warmup_seconds: int, + measurement_seconds: int, + progress_interval_seconds: int, +) -> dict: + stop_generation(server_url) + receiver.clear() + + payload = { "block_hash": block_hash, "block_height": int(config.get("block_height", 100)), "public_key": public_key, - "node_id": 0, - "node_count": 1, - "nonces": requested_nonces, + "node_id": int(config.get("node_id", 0)), + "node_count": int(config.get("node_count", 1)), + "batch_size": int(config.get("batch_size", 32)), "params": { "model": config["model"], "seq_len": int(config.get("seq_len", 256)), "k_dim": int(config.get("k_dim", 12)), }, - "batch_size": int(config.get("batch_size", 128)), - "wait": True, + "url": callback_url, } - started_at = time.time() - started_at_iso = datetime.now().isoformat() - result = api_call(url, "/api/v1/pow/generate", json_data=gen_config) - finished_at = time.time() - finished_at_iso = datetime.now().isoformat() + init_response = init_generate(server_url, payload) - artifacts = result.get("artifacts", []) - encoding = result.get( - "encoding", - {"dtype": "f16", "k_dim": int(config.get("k_dim", 12)), "endian": "le"}, - ) + if warmup_seconds > 0: + print(f" Warmup: {warmup_seconds}s") + time.sleep(warmup_seconds) + receiver.clear() + measured_started_at = time.time() + measured_started_at_iso = datetime.now().isoformat() + + elapsed = 0 + while elapsed < measurement_seconds and not shutdown_event.is_set(): + sleep_seconds = min(progress_interval_seconds, measurement_seconds - elapsed) + time.sleep(sleep_seconds) + elapsed += sleep_seconds + stats = receiver.stats() + print(f" [{elapsed:>2d}s] {stats['total_nonces']} nonces") + + measured_finished_at = time.time() + measured_finished_at_iso = datetime.now().isoformat() + + stop_generation(server_url) + time.sleep(1.0) + + artifacts = receiver.collected_artifacts() decoded_vectors = [] for artifact in artifacts: try: - vec = decode_vector(artifact["vector_b64"]) - decoded_vectors.append(vec.tolist()) + decoded_vectors.append(decode_vector(artifact["vector_b64"]).tolist()) except Exception: decoded_vectors.append(None) - elapsed_seconds = max(0.0, finished_at - started_at) - collected_nonce_count = len(artifacts) - nonces_per_min = (collected_nonce_count / elapsed_seconds * 60.0) if elapsed_seconds > 0 else 0.0 + stats = receiver.stats() + elapsed_seconds = max(0.0, measured_finished_at - measured_started_at) + nonces_per_min = (len(artifacts) / elapsed_seconds * 60.0) if elapsed_seconds > 0 else 0.0 return { + "collection_mode": "init_generate_callback", "server_name": name, - "server_url": url, + "server_url": server_url, "block_hash": block_hash, "public_key": public_key, - "requested_nonce_count": len(requested_nonces), - "collected_nonce_count": collected_nonce_count, - "nonces": [a["nonce"] for a in artifacts], + "init_response": init_response, + "collected_nonce_count": len(artifacts), + "nonces": [artifact["nonce"] for artifact in artifacts if "nonce" in artifact], "artifacts": artifacts, "vectors": decoded_vectors, - "encoding": encoding, + "encoding": { + "dtype": "f16", + "k_dim": int(config.get("k_dim", 12)), + "endian": "le", + }, + "batching": stats, "timing": { - "started_at": started_at_iso, - "finished_at": finished_at_iso, + "warmup_seconds": warmup_seconds, + "measurement_seconds_requested": measurement_seconds, + "started_at": measured_started_at_iso, + "finished_at": measured_finished_at_iso, "elapsed_seconds": elapsed_seconds, "nonces_per_min": nonces_per_min, }, } -def find_latest_run(exp_name: str) -> Optional[Path]: - """Find the most recent output directory for a given experiment name.""" - if not DATA_ROOT.exists(): - return None - matching = sorted( - [d for d in DATA_ROOT.iterdir() if d.is_dir() and d.name.startswith(f"{exp_name}_")], - key=lambda d: d.name, - reverse=True, - ) - return matching[0] if matching else None - - -def get_completed_tasks(out_dir: Path) -> Set[str]: - """Get completed task keys that already have successful data.""" - completed: Set[str] = set() - for json_file in out_dir.glob("*.json"): - if json_file.name == "run_config.json": - continue - try: - data = json.loads(json_file.read_text(encoding="utf-8")) - if "error" not in data and data.get("artifacts"): - completed.add(json_file.stem) - except Exception: - pass - return completed - - -def get_output_filename(server_name: str, block_hash: str, public_key: str, multi_seed: bool) -> str: - """Generate output filename based on seed mode.""" - if multi_seed: - return f"artifacts_{server_name}_{block_hash}_{public_key}.json" - return f"artifacts_{server_name}.json" - - -def get_task_key(server_name: str, block_hash: str, public_key: str, multi_seed: bool) -> str: - """Generate task key for tracking completion.""" - if multi_seed: - return f"{server_name}_{block_hash}_{public_key}" - return server_name - - def main() -> None: signal.signal(signal.SIGINT, signal_handler) - parser = argparse.ArgumentParser(description="Collect PoC data from multiple servers") - parser.add_argument( - "--config", - default=str(DEFAULT_CONFIG_PATH), - help=f"Path to config JSON file (default: {DEFAULT_CONFIG_PATH})", - ) - parser.add_argument( - "--exp-name", - default=DEFAULT_EXP_NAME, - help=f"Experiment name prefix for the output directory (default: {DEFAULT_EXP_NAME})", - ) + parser = argparse.ArgumentParser(description="Collect streamed PoC data across all vLLM instances") + parser.add_argument("--config", default=str(DEFAULT_CONFIG_PATH), help="Path to config JSON file") + parser.add_argument("--exp-name", default=DEFAULT_EXP_NAME, help="Experiment name prefix (used when --exp-dir is not set)") + parser.add_argument("--exp-dir", type=Path, default=None, help="Write into an existing experiment directory instead of creating a new one.") + parser.add_argument("--continue", dest="continue_run", action="store_true", help="Resume latest run") + parser.add_argument("--warmup-seconds", type=int, default=DEFAULT_WARMUP_SECONDS) + parser.add_argument("--measurement-seconds", type=int, default=DEFAULT_MEASUREMENT_SECONDS) + parser.add_argument("--progress-interval-seconds", type=int, default=DEFAULT_PROGRESS_INTERVAL_SECONDS) + parser.add_argument("--receiver-port", type=int, default=DEFAULT_RECEIVER_PORT) parser.add_argument( - "--continue", - dest="continue_run", - action="store_true", - help="Continue from latest run dir for this exp-name, skipping completed tasks", + "--callback-host", + default=os.environ.get("CALLBACK_HOST", "127.0.0.1"), + help="Host/IP the remote server can reach for callback batches", ) + parser.add_argument("--ssh-key", default=None, help="Path to SSH private key (overrides config ssh.key)") + parser.add_argument("--no-tunnel", action="store_true", help="Disable automatic SSH tunnel even if config has ssh section") args = parser.parse_args() config_path = Path(args.config).resolve() @@ -265,35 +492,31 @@ def main() -> None: config = json.loads(config_path.read_text(encoding="utf-8")) if "model" not in config: - print("Error: config must include 'model' field") + print("Error: config must include 'model'") sys.exit(1) if "servers" not in config or not isinstance(config["servers"], dict) or not config["servers"]: print("Error: config must include non-empty 'servers' map") sys.exit(1) - if "block_hashes" in config: - block_hashes = config["block_hashes"] - else: - block_hashes = [config["block_hash"]] - - if "public_keys" in config: - public_keys = config["public_keys"] - else: - public_keys = [config["public_key"]] - + block_hashes = config.get("block_hashes", [config["block_hash"]]) + public_keys = config.get("public_keys", [config["public_key"]]) seeds: List[Tuple[str, str]] = list(itertools.product(block_hashes, public_keys)) multi_seed = len(seeds) > 1 DATA_ROOT.mkdir(parents=True, exist_ok=True) exp_name = args.exp_name - if args.continue_run: + if args.exp_dir: + out_dir = args.exp_dir.resolve() + out_dir.mkdir(parents=True, exist_ok=True) + elif args.continue_run: out_dir = find_latest_run(exp_name) if out_dir is None: print(f"No previous run found for '{exp_name}', starting fresh") - args.continue_run = False - - if not args.continue_run: + timestamp = datetime.now().strftime("%Y-%m-%d_%H%M%S") + out_dir = DATA_ROOT / f"{exp_name}_{timestamp}" + out_dir.mkdir(parents=True, exist_ok=True) + else: timestamp = datetime.now().strftime("%Y-%m-%d_%H%M%S") out_dir = DATA_ROOT / f"{exp_name}_{timestamp}" out_dir.mkdir(parents=True, exist_ok=True) @@ -301,7 +524,7 @@ def main() -> None: completed = get_completed_tasks(out_dir) if args.continue_run else set() server_entries = list(config["servers"].items()) - vllm_runtime_probe = {name: probe_vllm(url) for name, url in server_entries} + runtime_probe = {name: probe_server(url) for name, url in server_entries} run_config = { "exp_name": exp_name, "timestamp": datetime.now().isoformat(), @@ -309,131 +532,115 @@ def main() -> None: "data_root": str(DATA_ROOT), "input_config_path": str(config_path), "config": config, - "vllm_runtime_probe": vllm_runtime_probe, + "collection_mode": "init_generate_callback", + "runtime_probe": runtime_probe, "cli": { "continue_run": bool(args.continue_run), "config": str(config_path), + "warmup_seconds": args.warmup_seconds, + "measurement_seconds": args.measurement_seconds, + "progress_interval_seconds": args.progress_interval_seconds, + "receiver_port": args.receiver_port, + "callback_host": args.callback_host, }, } - (out_dir / "run_config.json").write_text( + (out_dir / "poc_config.json").write_text( json.dumps(run_config, indent=2, ensure_ascii=False) + "\n", encoding="utf-8", ) - url_to_tasks: Dict[str, List[Tuple[str, str, str]]] = {} - for name, url in server_entries: - for block_hash, public_key in seeds: - task_key = get_task_key(name, block_hash, public_key, multi_seed) - if task_key not in completed: - url_to_tasks.setdefault(url, []).append((name, block_hash, public_key)) - - total_tasks = sum(len(tasks) for tasks in url_to_tasks.values()) + receiver = BatchReceiver(args.receiver_port) + receiver.start() + if not receiver.wait_until_ready(): + print("Error: callback receiver failed to start") + sys.exit(1) - print(f"EXP_NAME: {exp_name}") + ssh_tunnel: Optional[SSHTunnel] = None + callback_host = args.callback_host + ssh_config = config.get("ssh") + + if ssh_config and not args.no_tunnel: + ssh_key = args.ssh_key or ssh_config.get("key", DEFAULT_SSH_KEY) + ssh_host = ssh_config["host"] + ssh_port = int(ssh_config.get("port", 22)) + ssh_user = ssh_config.get("user", "root") + + print(f"Setting up SSH reverse tunnel to {ssh_host}:{ssh_port}...") + ssh_tunnel = SSHTunnel( + ssh_host=ssh_host, + ssh_port=ssh_port, + ssh_user=ssh_user, + ssh_key=ssh_key, + remote_port=args.receiver_port, + local_port=args.receiver_port, + ) + ssh_tunnel.start() + callback_host = "127.0.0.1" + + callback_url = f"http://{callback_host}:{args.receiver_port}" + print(f"Callback receiver: {callback_url}") + if ssh_tunnel: + print(f" (via SSH tunnel to {ssh_tunnel.ssh_host})") print(f"Output: {out_dir}") print(f"Model: {config['model']}") print(f"Servers: {list(config['servers'].keys())}") print(f"Seeds: {len(seeds)} combinations") - if multi_seed: - print(f" block_hashes: {block_hashes}") - print(f" public_keys: {public_keys}") - print(f"Total tasks: {total_tasks}") - print(f"Workers: {len(url_to_tasks)} (one per URL)") - if completed: - print(f"Skipping (already done): {len(completed)} tasks") print() - def collect_all_seeds_for_url(url: str, task_list: List[Tuple[str, str, str]]): - """Process all seeds for one URL sequentially. Returns list of results.""" - results = [] - for name, block_hash, public_key in task_list: - if shutdown_event.is_set(): - break - - filename = get_output_filename(name, block_hash, public_key, multi_seed) - try: - result = collect_from_server(name, url, config, block_hash, public_key) - (out_dir / filename).write_text( - json.dumps(result, indent=2, ensure_ascii=False) + "\n", - encoding="utf-8", - ) - results.append( - ( - name, - block_hash, - public_key, - int(result["collected_nonce_count"]), - float(result["timing"]["nonces_per_min"]), - None, - ) - ) - except Exception as exc: - if shutdown_event.is_set(): - break - error_result = { - "server_name": name, - "server_url": url, - "block_hash": block_hash, - "public_key": public_key, - "error": str(exc), - } - (out_dir / filename).write_text( - json.dumps(error_result, indent=2, ensure_ascii=False) + "\n", - encoding="utf-8", - ) - results.append((name, block_hash, public_key, 0, 0.0, str(exc))) - return url, results - - if not url_to_tasks: - print("No tasks to run.") - return - - interrupted = False try: - with ThreadPoolExecutor(max_workers=len(url_to_tasks)) as executor: - futures = [ - executor.submit(collect_all_seeds_for_url, url, task_list) - for url, task_list in url_to_tasks.items() - ] - - pending = set(futures) - while pending: - if shutdown_event.is_set(): - interrupted = True - for future in list(pending): - future.cancel() - break - - done_now = {future for future in pending if future.done()} - if not done_now: - time.sleep(0.1) + for name, url in server_entries: + for block_hash, public_key in seeds: + task_key = get_task_key(name, block_hash, public_key, multi_seed) + if task_key in completed: + print(f"{task_key}: skipped (already done)") continue - for future in done_now: - pending.remove(future) - _, results = future.result() - for name, block_hash, public_key, nonce_count, nonces_per_min, error in results: - seed_str = f" [{block_hash}+{public_key}]" if multi_seed else "" - if error: - print(f"{name}{seed_str}: FAILED - {error}") - else: - print( - f"{name}{seed_str}: OK " - f"({nonce_count} artifacts, {nonces_per_min:.2f} nonces/min)" - ) - except KeyboardInterrupt: - interrupted = True - shutdown_event.set() - print("\n\nInterrupt received, cancelling pending tasks...") - - if interrupted: - print(f"\nInterrupted. Partial results in {out_dir}") - print("Use --continue to resume from where you left off.") - sys.exit(1) + filename = get_output_filename(name, block_hash, public_key, multi_seed) + seed_str = f" [{block_hash}+{public_key}]" if multi_seed else "" + print(f"{name}{seed_str}: starting") + try: + result = collect_from_server( + name=name, + server_url=url, + config=config, + block_hash=block_hash, + public_key=public_key, + receiver=receiver, + callback_url=callback_url, + warmup_seconds=args.warmup_seconds, + measurement_seconds=args.measurement_seconds, + progress_interval_seconds=args.progress_interval_seconds, + ) + (out_dir / filename).write_text( + json.dumps(result, indent=2, ensure_ascii=False) + "\n", + encoding="utf-8", + ) + print( + f"{name}{seed_str}: OK " + f"({result['collected_nonce_count']} artifacts, " + f"{result['timing']['nonces_per_min']:.2f} nonces/min)" + ) + except Exception as exc: + error_result = { + "server_name": name, + "server_url": url, + "block_hash": block_hash, + "public_key": public_key, + "error": str(exc), + } + (out_dir / filename).write_text( + json.dumps(error_result, indent=2, ensure_ascii=False) + "\n", + encoding="utf-8", + ) + print(f"{name}{seed_str}: FAILED - {exc}") + finally: + receiver.stop() + if ssh_tunnel is not None: + ssh_tunnel.stop() + print("SSH tunnel closed.") print(f"\nDone. Results in {out_dir}") if __name__ == "__main__": main() - From b5628a92bcbad3a7c5f5f2786f32e30fd3364541 Mon Sep 17 00:00:00 2001 From: fedor-konovalenko Date: Fri, 27 Mar 2026 12:19:57 +0000 Subject: [PATCH 13/13] add visual inference and validation scripts --- .gitignore | 3 + .../notebooks/qwen2-2B-VL_thresholds.ipynb | 402 ++++++++++++++ .../inference_validation/vlm_inference.py | 514 ++++++++++++++++++ .../inference_validation/vlm_validation.py | 416 ++++++++++++++ .../benchmarks/src/validation/analysis.py | 101 +++- .../benchmarks/src/validation/data.py | 12 + .../benchmarks/src/validation/utils.py | 61 ++- proposals/visual_models/README.md | 35 ++ 8 files changed, 1524 insertions(+), 20 deletions(-) create mode 100644 mlnode/packages/benchmarks/notebooks/qwen2-2B-VL_thresholds.ipynb create mode 100644 mlnode/packages/benchmarks/scripts/inference_validation/vlm_inference.py create mode 100644 mlnode/packages/benchmarks/scripts/inference_validation/vlm_validation.py create mode 100644 proposals/visual_models/README.md diff --git a/.gitignore b/.gitignore index e6f585908..d6f57f02d 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,6 @@ run-parallel-tests/ inference-chain/proto/github.com/ inference-chain/proto/api/ inference-chain/proto/**/module/*.pb.go + +# Generated JSONLs +mlnode/packages/benchmarks/data/inference_results/* diff --git a/mlnode/packages/benchmarks/notebooks/qwen2-2B-VL_thresholds.ipynb b/mlnode/packages/benchmarks/notebooks/qwen2-2B-VL_thresholds.ipynb new file mode 100644 index 000000000..21731de8c --- /dev/null +++ b/mlnode/packages/benchmarks/notebooks/qwen2-2B-VL_thresholds.ipynb @@ -0,0 +1,402 @@ +{ + "cells": [ + { + "cell_type": "markdown", + "id": "a22ad747-71c3-4dfc-9c86-39f9cf193d8a", + "metadata": {}, + "source": [ + "# Validation Thresholds\n", + "\n", + "The validation thresholds for Qwen2-VL-2B were computed following the standard validation threshold computation methodology. Full details of this process are documented in [`proposals/visual_models/README.md`](../README.md).\n", + "\n", + "This notebook suggest an analysis part given the precomputed raw data from inference-validation cycles. You can reproduce this analysis here. \n", + "\n", + "If you want to reproduce the full procedure, including the inference-validation cycles, you'll need to refer to the [`proposals/visual_models/README.md`](../README.md) and learn there how to conduct the inference part.\n", + "\n", + "The `inference.py` that produced the raw data for this analysis can be found here: [link]() \n", + "\n", + "## Overview\n", + "\n", + "Key results of this experiments are:\n", + "- **Validation threshold lower and upper bounds**: `0.0034`, `0.0044`\n", + "- **Fraud Detection Rate**: **100%**\n", + "\n", + "These thresholds ensure robust fraud detection while accommodating legitimate hardware-induced variations in probability distributions.\n", + "\n", + "All inference-validation cycle results, including full JSONL datasets and configuration files, are available in the shared Google Drive folder [Qwen2-VL-2B Validation Data](), which includes a) Complete inference-validation JSONL files (~17-80MB per configuration); b) Configuration JSON files for each run. \n", + "\n", + "IMPORTANT: if you want the code below to work, you'll need to download the files and define the path to this files below.\n" + ] + }, + { + "cell_type": "markdown", + "id": "c197d5d3-98a2-49dd-baab-35da6bd28838", + "metadata": {}, + "source": [ + "## Data preparation" + ] + }, + { + "cell_type": "markdown", + "id": "28d86afa-0c95-480f-9348-06854eef7119", + "metadata": {}, + "source": [ + "Below is the analysis code for the resulting raw data from inference-validation cycles.\n", + "\n", + "To be able to analyse the results yourself, you need:\n", + "1. Download the raw data and configs\n", + "2. Put all the files, including raw data and configs to one place\n", + "3. Set `gonka_path` (path to the gonka project) and `data_path` (path to the folder containining downloaded data) correctly to be able to import the code and files.\n", + "4. Run the code cells" + ] + }, + { + "cell_type": "code", + "execution_count": 1, + "id": "31a10f3e-ebe2-438b-921e-9d2dc8162657", + "metadata": {}, + "outputs": [], + "source": [ + "%load_ext autoreload\n", + "%autoreload 2\n", + "gonka_path = '/home/konovalenko_f/projects/gonka'\n", + "\n", + "import sys\n", + "import os\n", + "sys.path.append(os.path.join(gonka_path, 'mlnode/packages/benchmarks/src'))\n", + "sys.path.append(os.path.join(gonka_path, 'mlnode/packages/common/src'))\n", + "import os\n", + "import copy\n", + "import numpy as np\n", + "\n", + "from validation.data import load_from_jsonl\n", + "\n", + "from validation.analysis import find_optimal_bounds_parallel, evaluate_bound, classify_data\n", + "from validation.analysis import analyze, process_data, plot_classification_results, plot_length_vs_distance_comparison" + ] + }, + { + "cell_type": "markdown", + "id": "9fe59926-04af-4227-ab48-3e4fbbc17985", + "metadata": {}, + "source": [ + "### Test Configurations\n", + "\n", + "**Honest inference scenarios** test the acceptable distance range when both inference and validation use the same model (INT8 precision):\n", + "1. **1xA100 vs 1xA100**: Primary scenario\n", + "\n", + "\n", + "**Fraudulent Inference Scenarios** test fraud detection capability when inference uses an INT4 quantization ([Qwen2-VL-2B-Instruct-GPTQ-Int4](https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int4)) while validation uses the correct FP8 model. \n", + "1. **1xA100 (INT4) vs 1xA100 (INT8)**: Primary fraud detection test\n", + "\n", + "\n", + "Below you'll see how each test scenarios' raw file is loaded." + ] + }, + { + "cell_type": "code", + "execution_count": 2, + "id": "2f02624c-fbe5-4374-830d-7c5e1ea3ffea", + "metadata": {}, + "outputs": [], + "source": [ + "model_name = 'qwen2-2B-VL'\n", + "\n", + "##### This part should be changed according to the path where json files are generated or downloaded #######\n", + "data_path = os.path.join(gonka_path, 'mlnode/packages/benchmarks/data/inference_results')\n", + "\n", + "\n", + "honest_data_paths = [\n", + " os.path.join(data_path, 'validation_results_int8.jsonl'),\n", + "]\n", + "\n", + "fraud_data_paths = [\n", + " os.path.join(data_path, 'validation_results_int4.jsonl'),\n", + "]\n", + "##############################################################################################################\n", + "\n", + "DATA_PATHS = {\n", + " \"honest_qwen2_2_vl\": honest_data_paths[0],\n", + " \"fraud_qwen2_2_vl\": fraud_data_paths[0],\n", + "}" + ] + }, + { + "cell_type": "markdown", + "id": "4a3ede07-5028-4afe-b55d-15f6df383503", + "metadata": {}, + "source": [ + "Below are some preparation steps: get the distances and items from the raw data" + ] + }, + { + "cell_type": "code", + "execution_count": 3, + "id": "0ec2394b-3cce-418d-bc8d-5774f9cb7d13", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dropped 0 / 1000 items\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Dropped 0 / 1000 items\n" + ] + } + ], + "source": [ + "honest_items_dict, honest_distances_dict = {}, {}\n", + "fraud_items_dict, fraud_distances_dict = {}, {}\n", + "honest_distances, fraud_distances = [], []\n", + "\n", + "for name, path in DATA_PATHS.items():\n", + " items, distances, topk = process_data(load_from_jsonl(path, n=1000))\n", + " if 'honest' in name:\n", + " honest_items_dict[name] = items\n", + " honest_distances_dict[name] = distances\n", + " honest_distances.extend(distances)\n", + " if 'fraud' in name:\n", + " fraud_items_dict[name] = items\n", + " fraud_distances_dict[name] = distances\n", + " fraud_distances.extend(distances)" + ] + }, + { + "cell_type": "markdown", + "id": "1f312a7d-4c20-4abb-8e07-803c8e1d0880", + "metadata": {}, + "source": [ + "## Finding the optimal thresholds\n", + "\n", + "The resulting threshold is set up to bring False Positive Rate to zero and minimize F1-score.\n", + "\n", + "The threshold is computed based on all the computed honest and fraud inference-validation scenarios." + ] + }, + { + "cell_type": "code", + "execution_count": 4, + "id": "6f151f14-caf7-45f2-8777-7a5217fc3a92", + "metadata": {}, + "outputs": [ + { + "name": "stderr", + "output_type": "stream", + "text": [ + "Searching optimal bounds: 100%|██████████| 25/25 [00:00<00:00, 9281.90it/s]\n" + ] + }, + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Optimal Lower Bound: 0.003433\n", + "Best F1-Score: 1.0000\n" + ] + } + ], + "source": [ + "optimal_lower, optimal_upper = find_optimal_bounds_parallel(honest_distances, fraud_distances, n_jobs=64, step=0.001)" + ] + }, + { + "cell_type": "markdown", + "id": "fdc88f75-3f88-4b0a-a5b7-5daeca7088d2", + "metadata": {}, + "source": [ + "## Distances Distribution Analysis" + ] + }, + { + "cell_type": "code", + "execution_count": 5, + "id": "afb02e6b-e2bf-4494-84d8-630da2a123c1", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Thresholds: 0.0034, 0.0044\n" + ] + } + ], + "source": [ + "print(f\"Thresholds: {optimal_lower:.4f}, {optimal_upper:.4f}\")\n", + "\n", + "classifications_honest = classify_data(honest_distances, optimal_lower, optimal_upper)\n", + "classifications_fraud = classify_data(fraud_distances, optimal_lower, optimal_upper)" + ] + }, + { + "cell_type": "markdown", + "id": "73cfc52b-a3d1-402a-a851-619df8c2e4d1", + "metadata": {}, + "source": [ + "#### Honest Classification\n", + "\n", + "This plot shows the distribution of validation distances for legitimate (honest) inferences using the correct INT8 model on both sides. The vast majority of honest inferences have very low distances (< 0.015), well below the fraud detection threshold." + ] + }, + { + "cell_type": "code", + "execution_count": 6, + "id": "3fbdfb4f-8776-47e8-9849-1fde9340786a", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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6enpSk5O1r59+zR79uxKH686qnItz2Z/p7JarWratKnee++9MstLGsMmk0kfffSRtm7dqs8//1xffvml7rnnHs2dO1dbt26Vl5dXtWIEAACoLtq6/6CtWzbausCFgcQtAIfh7+8vDw8P7du3r1TZnj177JZ79OihgoICvf/++0pNTbU1Wnv27GlrzF5yySV2Ez20aNFCx44dU3R0dI3GfeTIEfXp00f5+fnasGGDgoKCStWZO3eu3TfkwcHBduWvvPKKpkyZokcffVRPPvlklWMoLCyUVDxZhCS99957OnHihK38oosusv08dOhQLVq0SMuXL9f+/ftlMpk0ZMiQKh+zJpXMNrxnz55Sj93t2bOn1GzEldGiRQutX79eV155pTw8PM5Y/4orrtAVV1yhGTNmaNmyZRo6dKg++OAD3XfffbZZngEAAKqLti5tXdq6AKqKMW4BOAxnZ2fFxMRo1apVSk5Otq1PSEjQl19+aVc3KipKrq6umjVrlho3bmx79KlHjx7aunWrvv32W7seCJJ02223acuWLaX2JUlZWVm2BmFV5Obm6vrrr1dqaqrWrFlT5qNvktS5c2dFR0fbXq1bt7aVLV++XGPGjNHQoUP14osvVjmGkydP6quvvpKbm5siIyMlSVdeeaXd8U5tzF555ZUKCwvTu+++q+XLl6tXr15q1qxZlY9bky677DI1bdpUixYtUn5+vm39//73PyUkJKhfv35V3udtt92moqIiPffcc6XKCgsLlZWVJan4EbbTe0N06NBBkmyxNGjQQJJs2wAAAFQVbV3aurR1AVQVPW4BOJSpU6dq7dq16tGjhx566CEVFhZqwYIFatOmjXbt2mWr16BBA3Xu3Flbt27VDTfcYPuWuGfPnsrNzVVubm6pxuwTTzyhzz77TP3799fw4cPVuXNn5ebmavfu3froo4+UlJQkPz+/KsU7dOhQ/fjjj7rnnnuUkJCghIQEW5mXl5diY2Mr3P7HH3/UXXfdpSZNmuiaa64p9ahTt27d7BqiUnEDLzExUVLx2FXLli3Tvn379NRTT8nHx+eMMZtMJt1+++16/vnnJUnTpk0rt25GRoamT59ean14eHiNTvBQ8sHk7rvvVq9evTRkyBClp6fr5ZdfVlhYmB577LEq77NXr1564IEHNHPmTO3cuVN9+vSRq6ur9u3bpxUrVujll1/WrbfeqqVLl+rVV1/VgAED1KJFC+Xk5OjNN9+Uj4+Prr/+eknF47S1bt1ay5cv1yWXXKLGjRurbdu2atu2bY1dAwAAcP6jrUtbl7YugCoxAMDBfPvtt0bnzp0NNzc346KLLjIWLVpkTJ482Tj9T9YTTzxhSDJmzZplt/7iiy82JBl//PFHqX3n5OQYEyZMMC6++GLDzc3N8PPzM7p162bMmTPHKCgoMAzDMPbv329IMl544YVS20syJk+ebFtu3ry5IanMV/Pmzc94rosXLy53e0nG4sWLK6xrNpuNDh06GK+99pphtVrPeLwSv/32myHJcHd3N/7+++8y6/Tq1avcuK655ppKHWfjxo2GJGPFihV260uu8annZxiGsXz5cqNjx46Gu7u70bhxY2Po0KHGgQMH7OoMGzbM8PT0LHWssu4RwzCMN954w+jcubPh4eFheHt7G+3atTPGjx9vHDx40DAMw/j555+NIUOGGKGhoYa7u7vRtGlTo3///saOHTvs9vPDDz/Y7svT7wMAAIDKoq1LW5e2LoDKMhlGNUfLBoBaNGXKFE2dOrXaA/wDAAAAjoq2LgCgLIxxCwAAAAAAAAAOhjFuAQBVVlBQoKNHj1ZYx9fXt1Iz3AIAAACOhLYuAEdB4hYAUGU//PCDevfuXWGdxYsXa/jw4bUTEAAAAFBDaOsCcBSMcQsAqLK///5bP/30U4V12rRpo6CgoFqKCAAAAKgZtHUBOAoStwAAAAAAAADgYJicDAAAAAAAAAAcDIlbAPVWWFhYnY4rNXz4cIWFhdmtO3bsmO677z4FBgbKZDLp0UcfVVJSkkwmk5YsWVLrMV511VW66qqrav24AAAAKG3KlCkymUx1HcZ5pS7b2iXK+lyyb98+9enTR76+vjKZTFq1apWWLFkik8mkpKSkWo/RZDJpypQptX5cAGeHxC0Ah/PHH3/ogQce0EUXXSSz2SwfHx9deeWVevnll3XixIm6Dq9Czz//vJYsWaKRI0fqv//9r+68885zfsz4+HhNmTKlThqAZ5Kenq5x48YpIiJCDRo0kKenpzp37qzp06crKyurrsOTJC1btkzz5s2r6zAAAEA9U5KEK3mZzWYFBwcrJiZG8+fPV05OTo0c5+DBg5oyZYp27txZI/urT7755hvdfPPNCgwMlJubm5o2baobbrhBn3zySV2HdkbDhg3T7t27NWPGDP33v//VZZddds6PuWbNGpKzwHmGMW4BOJQvvvhCAwcOlLu7u+666y61bdtWBQUF+u677/Txxx9r+PDheuONNyQVf7N91VVX1dm36ydPnpTVapW7u7tt3RVXXCEXFxd99913tnWGYSg/P1+urq5ydnau8Tg++ugjDRw4UBs3bizVu7agoECS5ObmVuPHPZPt27fr+uuv17Fjx3THHXeoc+fOkqQdO3bogw8+ULdu3fTVV1/Velyn69+/v3799VeHTHwDAADHtWTJEt19992aNm2awsPDdfLkSaWlpembb77RunXrFBoaqs8++0yXXnqpbZvCwkIVFhbKbDZX+jg7duxQly5dtHjx4jp92qy2TZ48WdOmTVPLli01ZMgQNW/eXEeOHNGaNWv0zTff6L333tPtt9+upKQkhYeH1+n1yc/Pl5OTk1xdXSVJJ06cUIMGDfTMM89o+vTptnpFRUU6efKk3N3dz0nP61GjRumVV15RWWmevLw8ubi4yMXFpcaPC+Dc4TcWgMPYv3+/Bg8erObNm+vrr7+2m6X14Ycf1u+//64vvviiDiO0V9IwO9Xhw4fVunVru3UlPTDqQl0kbCUpKytLAwYMkLOzs+Li4hQREWFXPmPGDL355pt1EhsAAEBNuu666+x6U06YMEFff/21+vfvrxtvvFEJCQny8PCQJBJnlfTRRx9p2rRpuvXWW7Vs2TK7dvcTTzyhL7/8UidPnqzDCO2d2pFDkjIyMiRJDRs2tFvv7Ox8TjpyVEZdfR4BcHYYKgGAw5g9e7aOHTumt956yy5pW+Liiy/WI488Uu72R48e1bhx49SuXTt5eXnJx8dH1113nX755ZdSdRcsWKA2bdqoQYMGatSokS677DItW7bMVp6Tk6NHH31UYWFhcnd3V9OmTXXttdfq559/ttU5dYzbb775RiaTSfv379cXX3xhe2QuKSmp3HG3EhMTddttt8nf318eHh5q1aqVnnnmGVv5X3/9pYceekitWrWSh4eHmjRpooEDB9r1DF2yZIkGDhwoSerdu7ftuN98842ksse4PXz4sO69914FBATIbDarffv2Wrp0qV2dkpjnzJmjN954Qy1atJC7u7u6dOmi7du3l/selHj99deVmpqqF198sVTSVpICAgL07LPP2q179dVX1aZNG7m7uys4OFgPP/xwqeEUyhvX+PTzLHk/PvzwQ82YMUPNmjWT2WzWNddco99//91uuy+++EJ//fWX7dqdOm7xme4TAACAslx99dWaOHGi/vrrL7377ru29WWNcbtu3Tp1795dDRs2lJeXl1q1aqWnn35aUnGbpkuXLpKku+++29ZeKWlXbt68WQMHDlRoaKjc3d0VEhKixx57rNTwYsOHD5eXl5dSU1MVGxsrLy8v+fv7a9y4cSoqKrKra7Va9fLLL6tdu3Yym83y9/dX3759tWPHDrt67777rjp37iwPDw81btxYgwcPVkpKil2dffv26ZZbblFgYKDMZrOaNWumwYMHy2KxVHj9Jk6cqMaNG+vtt98us7NETEyM+vfvX+72u3bt0vDhw21DrwUGBuqee+7RkSNH7OpVps1fmXM4tY06ZcoUNW/eXFJxkvnU9mV5Y9z+73//U69eveTt7S0fHx916dLFrs1Zmfd5+PDheuWVVyTJbgiPEmWNcRsXF6frrrtOPj4+8vLy0jXXXKOtW7fa1SmJ+fvvv9fYsWPl7+8vT09PDRgwwJagBnDu8FUfAIfx+eef66KLLlK3bt2qtf2ff/6pVatWaeDAgQoPD1d6erpef/119erVS/Hx8QoODpYkvfnmmxozZoxuvfVWPfLII8rLy9OuXbu0bds23X777ZKkBx98UB999JFGjRql1q1b68iRI/ruu++UkJCgTp06lTp2ZGSk/vvf/+qxxx5Ts2bN9Pjjj0uS/P39y2zQ7Nq1Sz169JCrq6tGjBihsLAw/fHHH/r88881Y8YMScVDDfzwww8aPHiwmjVrpqSkJL322mu66qqrFB8frwYNGqhnz54aM2aM5s+fr6efflqRkZG2eMpy4sQJXXXVVfr99981atQohYeHa8WKFRo+fLiysrJKJcaXLVumnJwcPfDAAzKZTJo9e7Zuvvlm/fnnn2U2okt89tln8vDw0K233nqmt01ScQN36tSpio6O1siRI7Vnzx699tpr2r59u77//vsKj1WRf//733JyctK4ceNksVg0e/ZsDR06VNu2bZMkPfPMM7JYLDpw4IBeeuklSZKXl5ekyt0nAAAA5bnzzjv19NNP66uvvtL9999fZp3ffvtN/fv316WXXqpp06bJ3d1dv//+u77//ntJxW26adOmadKkSRoxYoR69OghSbb28ooVK3T8+HGNHDlSTZo00Y8//qgFCxbowIEDWrFihd2xioqKFBMTo6ioKM2ZM0fr16/X3Llz1aJFC40cOdJW795779WSJUt03XXX6b777lNhYaE2b96srVu32noWz5gxQxMnTtRtt92m++67TxkZGVqwYIF69uypuLg4NWzYUAUFBYqJiVF+fr5Gjx6twMBApaamavXq1crKypKvr2+Z12Tfvn1KTEzUPffcI29v72pd+3Xr1unPP//U3XffrcDAQP32229644039Ntvv2nr1q22hOaZ2vzVOYebb75ZDRs21GOPPaYhQ4bo+uuvt7Uvy7JkyRLdc889atOmjSZMmKCGDRsqLi5Oa9eutbU5K/M+P/DAAzp48KDWrVun//73v2e8Rr/99pt69OghHx8fjR8/Xq6urnr99dd11VVX6dtvv1VUVJRd/dGjR6tRo0aaPHmykpKSNG/ePI0aNUrLly+v9PsCoBoMAHAAFovFkGTcdNNNld6mefPmxrBhw2zLeXl5RlFRkV2d/fv3G+7u7sa0adNs62666SajTZs2Fe7b19fXePjhhyusM2zYMKN58+alYurXr1+pGCQZixcvtq3r2bOn4e3tbfz11192da1Wq+3n48ePlzrmli1bDEnGO++8Y1u3YsUKQ5KxcePGUvV79epl9OrVy7Y8b948Q5Lx7rvv2tYVFBQYXbt2Nby8vIzs7Gy7mJs0aWIcPXrUVvfTTz81JBmff/556QtyikaNGhnt27evsE6Jw4cPG25ubkafPn3s3r+FCxcakoy3337btu7097y889y4caMhyYiMjDTy8/Nt619++WVDkrF7927bun79+pV6Hw2jcvcJAAC4cC1evNiQZGzfvr3cOr6+vkbHjh1ty5MnTzZO/Rj+0ksvGZKMjIyMcvexffv2Um3JEmW1F2fOnGmYTCa7duawYcMMSXZtYsMwjI4dOxqdO3e2LX/99deGJGPMmDGl9lvSTk1KSjKcnZ2NGTNm2JXv3r3bcHFxsa2Pi4szJBkrVqwo99zKUtLefOmllypVv6y2dlnX5f333zckGZs2bbKtO1Obv7LncHobtSSmF154wa5eyT2zf/9+wzAMIysry/D29jaioqKMEydO2NU90+eCst7nhx9+2CgvzSPJmDx5sm05NjbWcHNzM/744w/buoMHDxre3t5Gz549S8UcHR1tF9Njjz1mODs7G1lZWWUeD0DNYKgEAA4h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Thjx8fG2/0OrI/5wvDFj0wzjzk/uNAZ+ONC485M7jRmbZhjxh+NrMNLScnJyDC8vLyMxMdEYNGiQMWPGjFJ1PvvsM+Oyyy4z3N3djSZNmhixsbG2sry8PGP8+PFGs2bNDDc3N6NFixbGf/7zH1v57t27jb59+xqenp5G06ZNjTvuuMPIyMiwlffq1ct4+OGHjYcfftjw8fExmjRpYjz77LOG1Wq1lUuye5XYvHmz0b17d8NsNhvNmjUzRo8ebRw7dsxWnp6ebvTv398wm81GWFiY8e677xrNmzc3XnrppXKvx/bt2w0nJycjOzu7zPLFixcbvr6+pdavWbPGcHJysrXNDMMwXnvtNcPHx8fIz883DMMwxo8fb7Rp08Zuu0GDBhkxMTG25csvv9x4+OGHbctFRUVGcHCwMXPmTLvtevfubTz77LPlnkdF92RV2l70uAUAAADOYNCgQZozZ44mTZqkDh06aOfOnVq7dq1tcrHk5GQdOnTIVr9bt25atmyZ3njjDbVv314fffSRVq1apbZt29rqjB8/XqNHj9aIESPUpUsXHTt2TGvXrpXZbJYkNWjQQJ988omuueYatWrVSvfee68uvfRSffvtt3J3d7ft57nnnlPnzp0VFRWlTz/9VMuXL9fdd99dS1cGAID6LyEjQfO3zVfcoTj5NfBTqyat5NfAT3GH4jR/23wlZCScs2N/+OGHioiIUKtWrXTHHXfo7bffto1lL0lffPGFBgwYoOuvv15xcXHasGGDLr/8clv5XXfdpffff1/z589XQkKCXn/9dXl5eUmSsrKydPXVV6tjx47asWOH1q5dq/T0dN122212MSxdulQuLi768ccf9fLLL+vFF1/Uf/7zH0nSJ598ombNmmnatGk6dOiQrb3zxx9/qG/fvrrlllu0a9cuLV++XN99951GjRpl2+/w4cOVkpKijRs36qOPPtKrr75q13O1LJs3b9Yll1wib2/vKl3HLVu2qF27dnYTv8bExCg7O9vWM3bLli2Kjo622y4mJkZbtmyRVNyr96effrKr4+TkpOjoaFudEpdffrk2b95cpRirw+WcHwEAAAA4D4waNcruw8ipvvnmm1LrBg4cqIEDB5a7P5PJpGnTpmnatGlllrdr105ff/11hTENGzZMw4YNq7AOAAAon9WwamXiSmUez1Rr/9YymUySJB93H7X2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Y0e99tprMgxDu3ebSn358NdfxYnQxMTi3/0SwcFdtXv3DG3YcFiNGxdfzE8+WSdPTx85ORVX7Nq1q9asWaOEhH++bFuxYp1at+76//G4KTKyszZs2KDY2FhJUny8VV9+uUEDB46yi3nz5l8VFtbRLrZ9+/65rlLx37d+/YpjPv1vRGU57ORk+/fvV1pamt2AwL6+voqKirINCLxlyxY1bNjQlrSVpOjoaDk5OWnbtm22Oj179pRbyVeWKh54eM+ePfr777/LPHZ+fr6ys7PtXgAAAAAAADi/NPMOVYRfhFIsKXaTgknFnQrT8w4ozCtSgR6hNXrc775brZycv3XTTfcqIqKt2rYtfrVp01ZXX32LPv20eLiE+++frK++el+vvz5Z+/cnKDFxt2bNmiVJCgsLU79+w/Tcc/fom29WKTV1v3766RutW/ehJOmuux7W0aNHNWTIEO3YsV0HDvyhLVu+1NSpd9sNg5Cenqzp08dqz549ev/99/XKKws0ePAjtvKgoDDFxW3S4cOpysoq/rblySef1A8//KBRo0Zpz56dSk7ep2+//VSzZ4/6/9haqWvXvpo06QFt27ZNP/30k+677z65u5/Slb4MvXv31rFjx2wTipVIS0vWnj07lZaWLKu1SAkJO7Vz507bcKldu/ZReHhrTZ58p/bu/UVbtnypRYue1cCBD8vNrfhxgwcffFB//vmnXnxxvJKSErVixatav/5D3X77Y7bj3HnnWL355ptaunSpEhISNG3aSJ04kasbbrD/NnHnzs264oo+lXy3q89knH5X1hGTyaSVK1faMto//PCDrrzySh08eFBBQUG2erfddptMJpOWL1+u559/XkuXLtWe077iaNq0qaZOnaqRI0eqT58+Cg8P1+uvv24rj4+PV5s2bRQfH1/moMhTpkyxG/S5hMVikY+PTw2dccVMU01nrgQAAFBLjMm112TMzs6Wr69vrba9LmQl1/vgwbKvN49Bl12Xx6CrXpehEop/ZqiE6tXlb0Txz/yNKLtufn6eDh3ar7CwcJnN5ioNlWAySXuOJGj+tvnKOJ6pf3k3k6erp3JP5upA9gH5N/DTqMvHKNIvslLDH5y634rq3nTTDbJarfr88y9K1d269Ud16xaln3/+RZdeeqlWrvxEM2Y8p/j4ePn4+Khnz576+OOP//93OU/PPPO0PvzwAx05ckShoaF66qmnNXz43TKZpD/+2Kcnn3xSGzduVH5+vpo3b64+ffpq7twXZTKZdPXVV6lNmzayWq16//1lcnZ21oMPjtS0adNt495u3bpVDz30gPbs2aP8/HwVFRlycpK2b9+uZ555Rlu2bJFhGGrRooUGDhykCROellQ8GdiIEfdpw4b1CggI0PTp0zVx4kSNGfOoHnnk0XKv2aBBg3TRRRdp+vSZtrJ77hmud94p3d1848aNuuqqq1RUVDyx2cMPj9S3334jT09P3XnnMM2c+W+5uLjY7rNvvvlGjz32mOLj49WsWTM988xEDRs23G6fr722UC+88ILS0tLUoUMHvfTSfEVFRdnKt2zZohtuuF4pKQfl5fXPH6pTh0rIy8tTUtJ+BQWFy929+I9kye99Vdq6JG7LSNzm5+cr/5T/zbOzsxUSEkLiFgAAXLBI3J6/uN4AgPouLy9P+/fvV3h4eLUntkrISNDKxJVKzExUXmGezC5mRfpFKjYiVpH+pXNH54urrrpKHTp00Lx58+o6FJtdu3bp2muv1R9//CGvisZqqSODBg1S+/bt9fTTT5dbp6J7siptrzod47Yigf8/EEh6erpd4jY9PV0dOnSw1Tl8+LDddoWFhTp69Kht+5KBh09VslxS53Tu7u5yL/kqEgAAAAAAAOe1SP9ItfJrpWRLsnLyc+Tt7q1Q31A5mRx2lNHz1qWXXqpZs2Zp//79ateuXV2HY6egoEDt2rXTY489dubKNcBh777w8HAFBgZqw4YNtnXZ2dnatm2bunbtKql4UOGsrCz99NNPtjpff/21rFarrQtz165dtWnTJp08pW/+unXr1KpVKzVq1KiWzgYAAAAAAACOzMnkpLCGYWoX0E5hDcNI2tah4cOHO1zSVpLc3Nz07LPPysOj4rF6a0qd9rg9duyYfv/9d9vy/v37tXPnTjVu3FihoaF69NFHNX36dLVs2VLh4eGaOHGigoODbcMpREZGqm/fvrr//vu1aNEinTx5UqNGjdLgwYMV/P/T4t5+++2aOnWq7r33Xj355JP69ddf9fLLL+ull16qi1MGAAAAAAAAHMI333xT1yGgAnWauN2xY4d69+5tWx47dqwkadiwYVqyZInGjx+v3NxcjRgxQllZWerevbvWrl1rNzbEe++9p1GjRumaa66Rk5OTbrnlFs2fP99W7uvrq6+++koPP/ywOnfuLD8/P02aNEkjRoyovRMFAAAAAAAAgCpwmMnJHFldTNjA5GQAAMCRMDnZ+YvrDQCo72picjKgJtXU5GQM1gEAAAAAAAAADobELQAAAAAAAAA4GBK3AAAAAAAAAOBgSNwCAAAAAAAAgIMhcQsAAAAAAADATlJSkkwmk3bu3FnXoVywSNwCAAAAAAAAdWD48OEymUy2V5MmTdS3b1/t2rWrrkODAyBxCwAAAAAAANSRvn376tChQzp06JA2bNggFxcX9e/fv67DggMgcQsAAAAAAADUEXd3dwUGBiowMFAdOnTQU089pZSUFGVkZEiSdu/erauvvloeHh5q0qSJRowYoWPHjtm2v+qqq/Too4/a7TM2NlbDhw+3LYeFhen555/XPffcI29vb4WGhuqNN96w2+bHH39Ux44dZTabddlllykuLu6cnTMqh8QtAAAAAAAAzju5ueW/8vIqX/fEicrVrQnHjh3Tu+++q4svvlhNmjRRbm6uYmJi1KhRI23fvl0rVqzQ+vXrNWrUqCrve+7cubaE7EMPPaSRI0dqz549tuP2799frVu31k8//aQpU6Zo3LhxNXNSqDaXug4AAAAAAAAAqGleXuWXXX+99MUX/yw3bSodP1523V69pG+++Wc5LEzKzCxdzzCqE6W0evVqef1/sLm5uQoKCtLq1avl5OSkZcuWKS8vT++88448PT0lSQsXLtQNN9ygWbNmKSAgoNLHuf766/XQQw9Jkp588km99NJL2rhxo1q1aqVly5bJarXqrbfektlsVps2bXTgwAGNHDmyeieFGkGPWwAAAAAAAKCO9O7dWzt37tTOnTv1448/KiYmRtddd53++usvJSQkqH379rakrSRdeeWVslqttt6ylXXppZfafjaZTAoMDNThw4clSQkJCbr00ktlNpttdbp27XqWZ4azRY9bAAAAAAAAnHdOGQa2FGdn++X/z1+Wyem0bo9JSdUOqUyenp66+OKLbcv/+c9/5OvrqzfffLNS2zs5Ock4rbvvyZMnS9VzdXW1WzaZTLJardWIGLWFHrcAAAAAAAA473h6lv86pWPpGet6eFSubk0xmUxycnLSiRMnFBkZqV9++UW5pwyi+/3338vJyUmtWrWSJPn7++vQoUO28qKiIv36669VOmZkZKR27dqlvFMG/926detZngnOFolbAAAA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ihGLxdisWbPYq6++ys4991x2yy23MMao36Yyt99+O1u1atWIy1VVZeXl5ewnP/mJ/lo4HGYmk4n97//+L2OMsaamJgaAbd68WV/npZdeYhzHsa6urmPX+FOYyy67jH3uc58reO3qq69m1157LWOM+m2qAoA999xz+t+T1U//9V//xTweT8G98vbbb2f19fXHZD/IcUsQBHEcSCQSuO2227BlyxasXbsWPM/jqquugqqqiMfjOPfcc9HV1YUXXngBO3fuxDe/+U2oqgoA+Nvf/oarrroKl156KbZv3461a9di6dKl+mfffPPN2LBhA55++mns2rULH/vYx3DxxRcXTPlIJpP44Q9/iCeffBJvv/02wuEwPvnJTwIAPvGJT+Df//3fMXfuXPT09KCnpwef+MQnAAAf+9jH0N/fj5deeglbt27FokWLcMEFF2BgYAAA8Kc//Qnf/e538aMf/QhbtmxBRUUF/uu//ut4HVaCIAjiJCKbzWLr1q1YvXq1/hrP81i9ejU2bNhwAltG5IhEIgCAkpISAMDWrVshSVJBnzU0NKC2tlbvsw0bNmDevHkoKyvT17nooosQjUaxZ8+e49j6U4+bbroJl112WUH/ANRvU5kXXngBS5Yswcc+9jGUlpZi4cKF+PWvf60vP3ToEHp7ewv6zuVyYdmyZQV953a7sWTJEn2d1atXg+d5bNy48fjtzCnEWWedhbVr12Lv3r0AgJ07d2L9+vW45JJLAFC/nSxMVj9t2LAB55xzDoxGo77ORRddhNbWVgwODk56u8VJ/0SCIAhiGNdcc03B37/97W/h9/vR1NSEd955B4FAAJs3b9YflE477TR93R/+8If45Cc/ie9973v6a/PnzwegZZM9/vjjaG9vR2VlJQDg61//Ol5++WU8/vjj+NGPfgQAkCQJDz30EJYtWwYA+N3vfofGxkZs2rQJS5eyWERvAAAUXklEQVQuhd1uhyiKKC8v17exfv16bNq0Cf39/TCZTACAn/70p3j++efx5z//GTfeeCN+8Ytf4POf/zw+//nPAwB+8IMf4B//+EfBVBOCIAiCAIBgMAhFUQqEIgAoKytDS0vLCWoVkUNVVdx6661YuXIlTj/9dABAb28vjEYj3G53wbplZWXo7e3V1ynWp7llxLHh6aefxrZt27B58+Zhy6jfpi4HDx7Eww8/jNtuuw133HEHNm/ejK9+9aswGo247rrr9GNfrG/y+660tLRguSiKKCkpob47RnzrW99CNBpFQ0MDBEGAoij44Q9/iGuvvRYAqN9OEiarn3p7ezFjxoxhn5Fblh99MhmQcEsQBHEc2LdvH+666y5s3LgRwWBQd9O2t7djx44dWLhwoS7aDmXHjh34whe+UHTZ7t27oSgKZs+eXfB6JpOB1+vV/xZFEWeeeab+d0NDA9xuN5qbmwvcu/ns3LkT8Xi84HMAIJVK4cCBAwCA5uZm/Nu//VvB8hUrVuD1118v+pkEQRAEQUxNbrrpJrz33ntYv379iW4KMQYdHR245ZZb8Oqrr8JsNp/o5hATQFVVLFmyRDdXLFy4EO+99x4eeeQRXHfddSe4dcRI/OlPf8JTTz2FP/zhD5g7dy527NiBW2+9FZWVldRvxDGHhFuCIIjjwOWXX45p06bh17/+NSorK6GqKk4//XRks1lYLJZR3zva8ng8DkEQsHXrVgiCULDMbrcfVZvj8TgqKirwxhtvDFs21MFBEARBEGPh8/kgCMKwyvZ9fX0FMz6I48/NN9+sF2Cprq7WXy8vL0c2m0U4HC747s/vs/LycmzatKng83J9TP16bNi6dSv6+/uxaNEi/TVFUbBu3To89NBDeOWVV6jfpigVFRWYM2dOwWuNjY1Ys2YNgA+OfV9fHyoqKvR1+vr6sGDBAn2doQUdZVnGwMAA9d0x4hvf+Aa+9a1v6VFz8+bNw+HDh3Hvvffiuuuuo347SZisfiovLy/6WyZ/G5MJZdwSBEEcY0KhEFpbW/Gd73wHF1xwARobGwuyb8444wzs2LFDz40dyhlnnIG1a9cWXbZw4UIoioL+/n6cdtppBf/yvzRkWcaWLVv0v1tbWxEOh9HY2AgAMBqNUBSl4LMXLVqE3t5eiKI47LN9Ph8A7Yfm0Eymd999dwJHhyAIgjhVMBqNWLx4ccF3mqqqWLt2LVasWHECW3bqwhjDzTffjOeeew6vvfbasKmfixcvhsFgKOiz1tZWtLe36322YsUK7N69u+BB99VXX4XT6RwmUBGTwwUXXIDdu3djx44d+r8lS5bg2muv1f+b+m1qsnLlSrS2tha8tnfvXkybNg0AMGPGDJSXlxf0XTQaxcaNGwv6LhwOY+vWrfo6r732GlRV1WPRiMklmUyC5wvlM0EQ9FmU1G8nB5PVTytWrMC6desgSZK+zquvvor6+vpJj0kAAByTkmcEQRCEjqIozOv1sk9/+tNs3759bO3atezMM8/Uq1xmMhk2e/ZsdvbZZ7P169ezAwcOsD//+c/snXfeYYwx9vrrrzOe59ldd93Fmpqa2K5du9h9992nf/61117Lpk+fztasWcMOHjzINm7cyH70ox+xv/71r4wxxh5//HFmMBjY0qVL2bvvvsu2bNnCli9fzpYvX65/xlNPPcVsNhvbvn07CwQCLJ1OM1VV2apVq9j8+fPZK6+8wg4dOsTefvttdscdd+hVNp9++mlmNpvZb3/7W9ba2sruuusu5nA42Pz584/fASYIgiBOGp5++mlmMpnYE088wZqamtiNN97I3G53QWV74vjxpS99iblcLvbGG2+wnp4e/V8ymdTX+bd/+zdWW1vLXnvtNbZlyxa2YsUKtmLFCn25LMvs9NNPZxdeeCHbsWMHe/nll5nf72ff/va3T8QunbKce+657JZbbtH/pn6bmmzatImJosh++MMfsn379rGnnnqKWa1W9vvf/15f57777mNut5v95S9/Ybt27WIf+chH2IwZM1gqldLXufjii9nChQvZxo0b2fr169msWbPYpz71qROxS6cE1113HauqqmJ//etf2aFDh9izzz7LfD4f++Y3v6mvQ/02NYjFYmz79u1s+/btDAD7+c9/zrZv384OHz7MGJucfgqHw6ysrIx95jOfYe+99x57+umnmdVqZY8++ugx2ScSbgmCII4Dr776KmtsbGQmk4mdccYZ7I033tCFW8YYa2trY9dccw1zOp3MarWyJUuWsI0bN+rvX7NmDVuwYAEzGo3M5/Oxq6++Wl+WzWbZXXfdxaZPn84MBgOrqKhgV111Fdu1axdjTBNuXS4XW7NmDaurq2Mmk4mtXr1a//JijLF0Os2uueYa5na7GQD2+OOPM8YYi0aj7Ctf+QqrrKxkBoOB1dTUsGuvvZa1t7fr7/3hD3/IfD4fs9vt7LrrrmPf/OY3SbglCIIgRuSXv/wlq62tZUajUR9UJE4MAIr+y/0OYIyxVCrFvvzlLzOPx8OsViu76qqrWE9PT8HntLW1sUsuuYRZLBbm8/nYv//7vzNJko7z3pzaDBVuqd+mLi+++CI7/fTTmclkYg0NDeyxxx4rWK6qKrvzzjtZWVkZM5lM7IILLmCtra0F64RCIfapT32K2e125nQ62Q033MBisdjx3I1Timg0ym655RZWW1vLzGYzq6urY//xH//BMpmMvg7129Tg9ddfL/q9dt111zHGJq+fdu7cyVatWsVMJhOrqqoqMFZNNhxjjE2+j5cgCIKYKjzxxBO49dZbEQ6HT3RTCIIgCIIgCIIgCIIYJ5RxSxAEQRAEQRAEQRAEQRAEMcUg4ZYgCIIgCIIgCIIgCIIgCGKKQVEJBEEQBEEQBEEQBEEQBEEQUwxy3BIEQRAEQRAEQRAEQRAEQUwxSLglCIIgCIIgCIIgCIIgCIKYYpBwSxAEQRAEQRAEQRAEQRAEMcUg4ZYgCIIgCIIgCIIgCIIgCGKKQcItQRAEQRAEQRAEQRAEQRDEFIOEW4IgiEmG4zg8//zzx3w7b7zxBjiOQzgc1l97/vnncdppp0EQBNx666144okn4Ha7j3lbzjvvPNx6663HfDsEQRAEQRAEMdm0tbWB4zjs2LHjRDeFIAiiABJuCYIgJkhvby++8pWvoK6uDiaTCTU1Nbj88suxdu3a49qOs846Cz09PXC5XPprX/ziF/HRj34UHR0duOeee/CJT3wCe/funbRtFhOLAeDZZ5/FPffcM2nbIQiCIAiCIKYm119/Pa688kr97xM9gH+it08QBHEsEU90AwiCIE4m2trasHLlSrjdbvzkJz/BvHnzIEkSXnnlFdx0001oaWk5bm0xGo0oLy/X/47H4+jv78dFF12EyspK/XWLxXLM21JSUnLMt0EQBEEQBEEQBEEQpxLkuCUIgpgAX/7yl8FxHDZt2oRrrrkGs2fPxty5c3Hbbbfh3XffLfqe22+/HbNnz4bVakVdXR3uvPNOSJKkL9+5cyc+9KEPweFwwOl0YvHixdiyZQsA4PDhw7j88svh8Xhgs9kwd+5c/P3vfwdQ6H5944034HA4AADnn38+OI7DG2+8UTQq4cUXX8SZZ54Js9kMn8+Hq666Sl/2P//zP1iyZAkcDgfKy8vx//7f/0N/fz8ATbT+0Ic+BADweDzgOA7XX389gOFOh8HBQXz2s5+Fx+OB1WrFJZdcgn379unLc+165ZVX0NjYCLvdjosvvhg9PT1H0CsEQRAEQRDEieD666/Hm2++iQceeAAcx4HjOLS1tQEA3nvvPVxyySWw2+0oKyvDZz7zGQSDQf295513Hr7yla/g1ltvhcfjQVlZGX79618jkUjghhtugMPhwGmnnYaXXnppQm2aPn06fvSjH+Fzn/scHA4Hamtr8dhjjxWss2nTJixcuBBmsxlLlizB9u3bh33OaO1/4403YDQa8dZbb+nr//jHP0ZpaSn6+vom1F6CIIjRIOGWIAhinAwMDODll1/GTTfdBJvNNmz5SFmyDocDTzzxBJqamvDAAw/g17/+Nf7zP/9TX37ttdeiuroamzdvxtatW/Gtb30LBoMBAHDTTTchk8lg3bp12L17N+6//37Y7fZh2zjrrLPQ2toKAFizZg16enpw1llnDVvvb3/7G6666ipceuml2L59O9auXYulS5fqyyVJwj333IOdO3fi+eefR1tbmy7O1tTUYM2aNQCA1tZW9PT04IEHHii6z9dffz22bNmCF154ARs2bABjDJdeemmBYJ1MJvHTn/4U//M//4N169ahvb0dX//614t+HkEQBEEQBDH1eOCBB7BixQp84QtfQE9PD3p6elBTU4NwOIzzzz8fCxcuxJYtW/Dyyy+jr68PH//4xwve/7vf/Q4+nw+bNm3CV77yFXzpS1/Cxz72MZx11lnYtm0bLrzwQnzmM59BMpmcULt+9rOf6YLsl7/8ZXzpS1/SfyvH43F8+MMfxpw5c7B161Z897vfHfYbdKz250wLn/nMZxCJRLB9+3bceeed+M1vfoOysrKjOKIEQRBDYARBEMS42LhxIwPAnn322VHXA8Cee+65EZf/5Cc/YYsXL9b/djgc7Iknnii67rx589h3v/vdostef/11BoANDg4yxhgbHBxkANjrr7+ur/P4448zl8ul/71ixQp27bXXjtr+fDZv3swAsFgsVnSbOc4991x2yy23MMYY27t3LwPA3n77bX15MBhkFouF/elPf9LbBYDt379fX+dXv/oVKysrG3fbCIIgCIIgiOPPddddxz7ykY/of+f/Dsxxzz33sAsvvLDgtY6ODgaAtba26u9btWqVvlyWZWaz2dhnPvMZ/bWenh4GgG3YsGHE9gzd/rRp09inP/1p/W9VVVlpaSl7+OGHGWOMPfroo8zr9bJUKqWv8/DDDzMAbPv27eNufyaTYQsWLGAf//jH2Zw5c9gXvvCFEdtIEARxpJDjliAIYpwwxo7ofX/84x+xcuVKlJeXw2634zvf+Q7a29v15bfddhv+9V//FatXr8Z9992HAwcO6Mu++tWv4gc/+AFWrlyJu+++G7t27TqqfdixYwcuuOCCEZdv3boVl19+OWpra+FwOHDuuecCQEF7x6K5uRmiKGLZsmX6a16vF/X19WhubtZfs1qtmDlzpv53RUWFHstAEARBEARBnLzs3LkTr7/+Oux2u/6voaEBAAp+655xxhn6fwuCAK/Xi3nz5umv5dyrE/2NmP+5HMehvLxc/4zm5macccYZMJvN+jorVqyYcPuNRiOeeuoprFmzBul0umBGHUEQxGRBwi1BEMQ4mTVrFjiOm1ABsg0bNuDaa6/FpZdeir/+9a/Yvn07/uM//gPZbFZf57vf/S727NmDyy67DK+99hrmzJmD5557DgDwr//6rzh48CA+85nPYPfu3ViyZAl++ctfHvE+jFaoLJFI4KKLLoLT6cRTTz2FzZs36+3Ib+9kkYuDyMFx3BGL4wRBEARBEMTUIR6P4/LLL8eOHTsK/u3btw/nnHOOvl6x34P5r3EcBwBQVXVC2y/2uRP5jPG2/5133gGgRaoNDAxMqI0EQRDjgYRbgiCIcVJSUoKLLroIv/rVr/5/e3cTCl0bx3H8N7ealcW9kSIviclMyFtkoVDeSpSFIpGFUmZhYqGQJGXBhhAWY0eJBVKUWKBQashbGowtIwtiYbgXeqY843k8LG7nuft+6myu6zqd/7U7/fqfc+n+/j5g/vb2NmBsc3NTUVFRamtrU3p6uuLi4uTxeALWWSwWORwOLS8vq7y8XE6n0z8XERGhhoYGzc7Oqrm5WePj41/eQ1JSklZWVt6dOz4+ltfrVW9vr7KzsxUfHx/Q3WA2myVJPp/vH59htVr19PSkra0t/5jX69XJyYlsNtuXawcAAIDxmM3mgHfD1NRUHRwcKDo6WrGxsW+u986K+J2sVqv29vb0+PjoH/v7IcP/pX632y2Hw6Hx8XFlZmaqtrb20wEzAHyE4BYAPmFoaEg+n08ZGRmamZnR6empjo6ONDAwEPCJlfTapXt5eampqSm53W4NDAz4u1gl6eHhQXa7XWtra/J4PNrY2NDOzo6sVqskqampSUtLSzo/P9fu7q5WV1f9c1/R2dmpyclJdXZ26ujoyH/gmSRFRkbKbDZrcHBQZ2dnmpubU3d395v7o6KiZDKZtLCwoKurK93d3b2757KyMtXX12t9fV0ul0vV1dUKDw9XWVnZl2sHAACA8URHR2tra0sXFxe6vr7W8/OzGhsbdXNzo8rKSu3s7MjtdmtpaUl1dXX/2gDwO1RVVclkMqm+vl6Hh4daXFxUX1/fmzUf1e/z+VRdXa3CwkLV1dXJ6XRqb29P/f3937QrAH8qglsA+ISYmBjt7u4qNzdXzc3NSkhIUH5+vlZWVjQyMhKwvrS0VA6HQ3a7XcnJydrc3FRHR4d/PigoSF6vVzU1NbJYLKqoqFBxcbG6urokvXa2NjY2ymq1qqioSBaLRcPDw1+uPycnR9PT05qbm1NycrLy8vK0vb0tSQoJCdHExISmp6dls9nU29sb8BIbHh6urq4utba2KjQ0VHa7/d3nOJ1OpaWlqaSkRFlZWXp5edHi4mLAZ2sAAAD4f2tpaVFQUJBsNptCQkJ0eXmpsLAwbWxsyOfzqaCgQImJiWpqatLPnz/148f3xhDBwcGan5/X/v6+UlJS1NbW5m9k+MtH9ff09Mjj8Wh0dFTS61kNY2Njam9vl8vl+o5tAfhDmV74oSAAAAAAAAAAGAodtwAAAAAAAABgMAS3AAAAAAAAAGAwBLcAAAAAAAAAYDAEtwAAAAAAAABgMAS3AAAAAAAAAGAwBLcAAAAAAAAAYDAEtwAAAAAAAABgMAS3AAAAAAAAAGAwBLcAAAAAAAAAYDAEtwAAAAAAAABgMAS3AAAAAAAAAGAwBLcAAAAAAAAAYDC/AJbvruextlhdAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_classification_results(\n", + " honest_distances,\n", + " classifications_honest,\n", + " optimal_lower, optimal_upper,\n", + " title_prefix=f\"{model_name}_honest\",\n", + " # save_to='../data/graphs' \n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "60e0a7fc-8b7f-49f6-8246-17d134d5ad92", + "metadata": {}, + "source": [ + "#### Fraud Classification\n", + "\n", + "This plot illustrates how fraudulent inferences produce significantly higher validation distances. The threshold bounds separate a substantial portion of fraud cases from honest behavior, with 54% of fraud samples falling in the \"fraud\" classification zone." + ] + }, + { + "cell_type": "code", + "execution_count": 7, + "id": "9fbccca1-c6ac-40b9-9ec8-7dfad25c0e17", + "metadata": {}, + "outputs": [ + { + "data": { + "image/png": "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sWgLFizw6drTpk3TgoKCtLKyMvu2nTt3agC0WbNmOR07evRorV+/fi3KgyMAtNtvv91tXkaMGKE1NDQ47auurm5yjd9//10DoL333nv2bQ8//LDm7mdOXXv//v2apmlaQUGBZjabtUmTJmk2m81+3D/+8Q8NgHbNNde0IneCIAiCIAiekXdbebeVd1tBEDwh7hEEQThuaGxsxPfff4+pU6ciJSXFvj0jIwMTJkywfz/55JMRFhaGlStXAqDVQXJyMq6++mps3LgR1dXV0DQNq1atwsiRI+3nLVq0CCNHjkSnTp1QVFRk/xs3bhwaGxvt11Nceuml6NSpk/27upa3ZV0rV67EnDlzcMkll+DMM8/0uwzUMq7S0lLMmzfP7TGvvPIKli1bhmXLluGDDz7A2LFjccMNN+Dzzz9v9vpXXnklamtrnY5duHAhALTp8jFfufHGG2EymZy2BQcH2/+vr69HcXExevbsiaioKGzcuNHveyxfvhxWqxV33HGH05Kzu+++u8XpFgRBEARBaA55t5V3W0DebQVB8Iy4RxAE4bihsLAQNTU16NWrV5N96enp+O677wAAJpMJp59+On755RcAfLEdOXIkRowYgcbGRqxevRoJCQkoKSlxerHds2cPtm7diri4OLf3LygocPru+HINwP6Se+TIEbfn79y5ExdccAFOOukk/Oc//3HaV1JS4rRcKTg4GJGRkU2ucccdd2DJkiV47733MHDgQLf3Oe2005yCNVx22WU4+eSTMXPmTEyePBlmsxmFhYVobGy0HxMWFoawsDCce+65iI6OxsKFCzFjxgwAwEcffYSBAweiX79+bu93NElLS2uyraamBk8++STmz5+P3NxcaJpm31dWVub3PQ4cOAAATdpVXFyc08BFEARBEAShLZF3W3m3BeTdVhAEz4ilrSAIJyQjRozAunXrUFtba3+xjYqKwkknnYRffvnF/tLr+GJrs9lw9tln22fyXf8uuugip3u4zpIrHF+0FDk5ORg/fjwiIyPx3XffITw83Gn/hRdeiKSkJPvfXXfd1eQac+bMwauvvoqnnnoKV111lc9lYTQaMXbsWBw+fBh79uwBAAwZMsTpfv/+978BAIGBgbjkkkuwYsUK5OfnY926ddizZ0+7WCIAzpYHijvuuAOPP/44LrnkEvz3v//F0qVLsWzZMsTExDgF1XAX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xoxpt1n2+vp62Gw2WCwW+7Zhw4YhICAAq1atsm/TNA11dXUIDAyEyWRq83R8+umnmDZtGn788ccmVrVWqxUAYDab2/y+zbFu3TpMnDgRlZWVuPLKKzF48GAAwPr16/Hxxx/jjDPOwNKlS495ulyZPHky/vjjjw4peguCIAiC0HFYsGABrr32WjzyyCNIS0tDfX098vLy8NNPP2HZsmVISUnB119/jQEDBtjPaWhoQENDA4KCgny+z/r16zFkyBDMnz+/XVeVHWsefvhhPPLII+jVqxcuu+wypKamori4GN999x1++uknfPjhh7j88suRlZWFtLS0di2furo6GI1GBAYGAgBqamoQEhKC//u//8Njjz1mP66xsRH19fWwWCxHxeJ65syZeOWVV+BO3qmtrUVAQAACAgLa/L6CIBxd5KkVBKHDsX//fkyfPh2pqalYsWKFUxTW22+/HX/++ScWL17cjil0Rr2kOVJQUIC+ffs6bVOWGO1Be4i1AFBaWooLLrgAJpMJmzZtQp8+fZz2P/7443jrrbfaJW2CIAiCIAit4dxzz3Wyopw1axZWrFiByZMn47zzzkNmZiaCg4MBQEQzH/n000/xyCOP4OKLL8bChQud3rPvv/9+fP/996ivr2/HFDrjaLQBAIWFhQCAqKgop+0mk+moGG34QnuNPwRBaD3iHkEQhA7HM888g8rKSrz99ttOgq2iZ8+euOuuuzyeX1JSgvvuuw/9+/dHWFgYIiIicO6552LLli1Njp03bx769euHkJAQdOrUCaeeeioWLlxo319RUYG7774b3bp1g8ViQXx8PM4++2xs3LjRfoyjT9uffvoJBoMB+/fvx+LFi+3L5rKysjz63dq5cycuueQSxMXFITg4GOnp6fi///s/+/4DBw7gtttuQ3p6OoKDgxETE4Np06Y5WYQuWLAA06ZNAwCMHTvWft+ffvoJgHuftgUFBbj++uuRkJCAoKAgDBw4EO+++67TMSrN//73v/Hmm2+iR48esFgsGDJkCNatW+exDhRvvPEGcnNz8dxzzzURbAEgISEBDz30kNO2V199Ff369YPFYkHnzp1x++23N3Gh4MmPsWs+VX3897//xeOPP47k5GQEBQXhrLPOwp9//ul03uLFi3HgwAF72Tn6KW6unQiCIAiCIADAmWeeiX/+8584cOAAPvjgA/t2dz5tly1bhhEjRiAqKgphYWFIT0/HP/7xDwB8hxkyZAgA4Nprr7W/n6j3yF9++QXTpk1DSkoKLBYLunbtinvuuaeJC7EZM2YgLCwMubm5mDp1KsLCwhAXF4f77rsPjY2NTsfabDa8+OKL6N+/P4KCghAXF4dzzjkH69evdzrugw8+wODBgxEcHIzo6GhMnz4dOTk5Tsfs2bMHF110ERITExEUFITk5GRMnz4dZWVlXsvvn//8J6Kjo/HOO++4NYyYMGECJk+e7PH8rVu3YsaMGXb3aomJibjuuutQXFzsdJwv7/i+5MHxnXT27NlITU0FQIHZ8X3Sk0/b//3vfxg9ejTCw8MRERGBIUOGOL1j+lLPM2bMwCuvvAIATm47FO582m7atAnnnnsuIiIiEBYWhrPOOgurV692Okal+ddff8W9996LuLg4hIaG4oILLrCL04IgHF1kqk8QhA7HN998g+7du+OMM85o0fn79u3Dl19+iWnTpiEtLQ35+fl44403MHr0aOzYsQOdO3cGALz11lu48847cfHFF+Ouu+5CbW0ttm7dijVr1uDyyy8HANxyyy349NNPMXPmTPTt2xfFxcVYtWoVMjMzccoppzS5d0ZGBt5//33cc889SE5Oxt/+9jcAQFxcnNuXm61bt2LkyJEIDAzETTfdhG7dumHv3r345ptv8PjjjwOge4HffvsN06dPR3JyMrKysvDaa69hzJgx2LFjB0JCQjBq1CjceeedeOmll/CPf/wDGRkZ9vS4o6amBmPGjMGff/6JmTNnIi0tDYsWLcKMGTNQWlraRBRfuHAhKioqcPPNN8NgMOCZZ57BhRdeiH379rl9oVZ8/fXXCA4OxsUXX9xctQHgy+6cOXMwbtw43Hrrrdi1axdee+01rFu3Dr/++qvXe3njqaeegtFoxH333YeysjI888wzuOKKK7BmzRoAwP/93/+hrKwMBw8exPPPPw8ACAsLA+BbOxEEQRAEQVBcddVV+Mc//oGlS5fixhtvdHvM9u3bMXnyZAwYMACPPPIILBYL/vzzT/z6668A+A73yCOP4F//+hduuukmjBw5EgDs78eLFi1CdXU1br31VsTExGDt2rWYN28eDh48iEWLFjndq7GxERMmTMDQoUPx73//G8uXL8fcuXPRo0cP3Hrrrfbjrr/+eixYsADnnnsubrjhBjQ0NOCXX37B6tWr7RbFjz/+OP75z3/ikksuwQ033IDCwkLMmzcPo0aNwqZNmxAVFQWr1YoJEyagrq4Od9xxBxITE5Gbm4tvv/0WpaWliIyMdFsme/bswc6dO3HdddchPDy8RWW/bNky7Nu3D9deey0SExOxfft2vPnmm9i+fTtWr15tFzObe8dvSR4uvPBCREVF4Z577sFll12GiRMn2t8n3bFgwQJcd9116NevH2bNmoWoqChs2rQJS5Yssb9j+lLPN998Mw4dOoRly5bh/fffb7aMtm/fjpEjRyIiIgJ///vfERgYiDfeeANjxozBzz//jKFDhzodf8cdd6BTp054+OGHkZWVhRdeeAEzZ87EJ5984nO9CILQQjRBEIQORFlZmQZAO//8830+JzU1Vbvmmmvs32tra7XGxkanY/bv369ZLBbtkUcesW87//zztX79+nm9dmRkpHb77bd7Peaaa67RUlNTm6Rp0qRJTdIAQJs/f75926hRo7Tw8HDtwIEDTsfabDb7/9XV1U3u+fvvv2sAtPfee8++bdGiRRoA7ccff2xy/OjRo7XRo0fbv7/wwgsaAO2DDz6wb7Nardrpp5+uhYWFaeXl5U5pjomJ0UpKSuzHfvXVVxoA7ZtvvmlaIA506tRJGzhwoNdjFAUFBZrZbNbGjx/vVH8vv/yyBkB755137Ntc69xTPn/88UcNgJaRkaHV1dXZt7/44osaAG3btm32bZMmTWpSj5rmWzsRBEEQBOGvw/z58zUA2rp16zweExkZqZ188sn27w8//LDmOPx+/vnnNQBaYWGhx2usW7euybujwt374ZNPPqkZDAan98prrrlGA+D0DqxpmnbyySdrgwcPtn9fsWKFBkC78847m1xXvZdmZWVpJpNJe/zxx532b9u2TQsICLBv37RpkwZAW7Rokce8uUO9Xz7//PM+He/u3dpduXz00UcaAG3lypX2bc294/uaB9d3UpWmZ5991uk41Wb279+vaZqmlZaWauHh4drQoUO1mpoap2ObGwe4q+fbb79d8yTvANAefvhh+/epU6dqZrNZ27t3r33boUOHtPDwcG3UqFFN0jxu3DinNN1zzz2ayWTSSktL3d5PEIS2Q9wjCILQoSgvLweAFs+uA/QtZTSye2tsbERxcbF9yZnjkqeoqCgcPHjQ6zL/qKgorFmzBocOHWpxejxRWFiIlStX4rrrrkNKSorTPsclTcoXGsCgZ8XFxejZsyeioqKc8uMP3333HRITE3HZZZfZtwUGBuLOO+9EZWUlfv75Z6fjL730UnTq1Mn+XVl77Nu3z+t9ysvLfa7L5cuXw2q14u6777bXHwDceOONiIiIaJUf42uvvdbJr6+v6Qd8ayeCIAiCIAiOhIWFoaKiwuN+5fP0q6++gs1m8/v6ju+HVVVVKCoqwhlnnAFN07Bp06Ymx99yyy1O30eOHOn0HvTZZ5/BYDDg4YcfbnKuei/9/PPPYbPZcMkll6CoqMj+l5iYiF69euHHH38EALsV6vfff4/q6mqf89QW4wDHcqmtrUVRURGGDRsGAE3GAd7e8VuaB19ZtmwZKioq8OCDDzbxOetpHOBLPTdHY2Mjli5diqlTp6J79+727UlJSbj88suxatUqez0obrrpJqc0jRw5Eo2NjThw4IDf9xcEwT9EtBUEoUMREREBAF5fcpvDZrPh+eefR69evWCxWBAbG4u4uDhs3brVyQfVAw88gLCwMJx22mno1asXbr/9dvuSNMUzzzyDP/74A127dsVpp52G2bNn+yT0+YK6zkknneT1uJqaGvzrX/9C165dnfJTWlrarF8wTxw4cAC9evVyEkcB3Z2C60uYq6isBNwjR454vU9ERITPdanumZ6e7rTdbDaje/furXoxbGn6Ad/aiSAIgiAIgiOVlZVexcdLL70Uw4cPxw033ICEhARMnz4d//3vf30WcLOzszFjxgxER0fb/dSOHj0aAJq8Hyr/tI506tTJ6T1o79696Ny5M6Kjoz3ec8+ePdA0Db169UJcXJzTX2ZmJgoKCgAAaWlpuPfee/Gf//wHsbGxmDBhAl555ZVm31vbYhxQUlKCu+66CwkJCQgODkZcXBzS0tIAOJdLc+/4Lc2Dr+zduxdA8+MAf+rZFwoLC1FdXd3kfRvgOMBmszXxT9ya92hBEFqHiLaCIHQoIiIi0LlzZ/zxxx8tvsYTTzyBe++9F6NGjcIHH3yA77//HsuWLUO/fv2cXoQzMjKwa9cufPzxxxgxYgQ+++wzjBgxwsnC4JJLLsG+ffswb948dO7cGc8++yz69euH//3vf63Kpz/ccccdePzxx3HJJZfgv//9L5YuXYply5YhJiamRZYZLcFTtFtN07ye16dPH+zevRtWq7VN0+MayEPhGlBD0dL0A761E0EQBEEQBMXBgwdRVlaGnj17ejwmODgYK1euxPLly3HVVVdh69atuPTSS3H22Wd7fJ9RNDY24uyzz8bixYvxwAMP4Msvv8SyZcvsQcpc3w89vQf5i81mg8FgwJIlS7Bs2bImf2+88Yb92Llz52Lr1q34xz/+gZqaGtx5553o168fDh486PH6Kmjttm3bWpzGSy65BG+99RZuueUWfP7551i6dCmWLFliT7/jcc2947ckD22Jv/V8tGjNe7QgCK1DRFtBEDockydPxt69e/H777+36PxPP/0UY8eOxdtvv43p06dj/PjxGDduHEpLS5scGxoaiksvvRTz589HdnY2Jk2ahMcffxy1tbX2Y5KSknDbbbfhyy+/xP79+xETE2MPEtYa1JKk5gTqTz/9FNdccw3mzp2Liy++GGeffTZGjBjRJD+ehEx3pKamYs+ePU1e9nbu3Gnf3xZMmTIFNTU1+Oyzz3xKEwDs2rXLabvVasX+/fud0tSpUye39dkaa1xv5edLOxEEQRAEQQBgDwY1YcIEr8cZjUacddZZeO6557Bjxw48/vjjWLFihd3NgKd3k23btmH37t2YO3cuHnjgAZx//vkYN26cPdhuS+jRowcOHTqEkpISr8domoa0tDSMGzeuyZ9yQ6Do378/HnroIaxcuRK//PILcnNz8frrr3u8fu/evZGeno6vvvoKlZWVfufhyJEj+OGHH/Dggw9izpw5uOCCC3D22Wc7uQFwxJd3fH/z4Cs9evQA4H0c4E89+zoOiIuLQ0hISJP3bYDjAKPRiK5du/qYC0EQjjYi2gqC0OH4+9//jtDQUNxwww3Iz89vsn/v3r148cUXPZ5vMpmazPwuWrQIubm5TtuKi4udvpvNZvTt2xeapqG+vh6NjY1Nlh3Fx8ejc+fOqKur8zdbTYiLi8OoUaPwzjvvIDs722mfY/rd5WfevHlNrDBCQ0MBwK2Y6crEiRORl5fnFPW1oaEB8+bNQ1hYmH3ZVWu55ZZbkJSUhL/97W/YvXt3k/0FBQV47LHHAADjxo2D2WzGSy+95JTft99+G2VlZZg0aZJ9W48ePbB69WonC95vv/22yXIufwgNDXW7zKy5diIIgiAIgqBYsWIFHn30UaSlpeGKK67weJw7cXTQoEEAYH/P9PRupywfHd+XNE3z+n7cHBdddBE0TcOcOXOa7FP3ufDCC2EymTBnzpwm76aaptnfmcrLy9HQ0OC0v3///jAajc2+Q8+ZMwfFxcW44YYbmlwDAJYuXYpvv/3W7bnuygUAXnjhBafvvrzjtyYPvjB+/HiEh4fjySefbGIEoNLvTz37Og4wmUwYP348vvrqK2RlZdm35+fnY+HChRgxYoTdTYUgCO1PQHsnQBAEwZUePXpg4cKFuPTSS5GRkYGrr74aJ510EqxWK3777TcsWrQIM2bM8Hj+5MmT8cgjj+Daa6/FGWecgW3btuHDDz9sMss+fvx4JCYmYvjw4UhISEBmZiZefvllTJo0CeHh4SgtLUVycjIuvvhiDBw4EGFhYVi+fDnWrVuHuXPntkleX3rpJYwYMQKnnHIKbrrpJqSlpSErKwuLFy/G5s2b7fl5//33ERkZib59++L333/H8uXLERMT43StQYMGwWQy4emnn0ZZWRksFgvOPPNMxMfHN7nvTTfdhDfeeAMzZszAhg0b0K1bN3z66af49ddf8cILL7QqAIQjnTp1whdffIGJEydi0KBBuPLKKzF48GAADAbx0Ucf4fTTTwdAEXvWrFmYM2cOzjnnHJx33nnYtWsXXn31VQwZMgRXXnml/bo33HADPv30U5xzzjm45JJLsHfvXnzwwQd2q4WWMHjwYHzyySe49957MWTIEISFhWHKlCnNthNBEARBEP6a/O9//8POnTvR0NCA/Px8rFixAsuWLUNqaiq+/vrrJgGmHHnkkUewcuVKTJo0CampqSgoKMCrr76K5ORkjBgxAgDfiaOiovD6668jPDwcoaGhGDp0KPr06YMePXrgvvvuQ25uLiIiIvDZZ5+1ysfo2LFjcdVVV+Gll17Cnj17cM4558Bms+GXX37B2LFjMXPmTPTo0QOPPfYYZs2ahaysLEydOhXh4eHYv38/vvjiC9x000247777sGLFCsycORPTpk1D79690dDQgPfffx8mkwkXXXSR13Rceuml2LZtGx5//HFs2rQJl112GVJTU1FcXIwlS5bghx9+wMKFC92eGxERgVGjRuGZZ55BfX09unTpgqVLl2L//v1Ox1VUVDT7jt+aPPhCREQEnn/+edxwww0YMmQILr/8cnTq1AlbtmxBdXU13n33Xb/qWb1f33nnnZgwYQJMJhOmT5/u9t6PPfYYli1bhhEjRuC2225DQEAA3njjDdTV1eGZ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jZSUFNx999147LHH0KtXL6SlpeGf//wnOnfubHehkJGRgXPOOQc33ngjXn/9ddTX12PmzJmYPn06OnfuDAC4/PLLMWfOHFx//fV44IEH8Mcff+DFF1/E888/3x5ZFgRBEARBEE4QPvnkE9x77714/fXXMXToULzwwgv2gLeucRcAuv+67LLL8OSTT2Ly5MlYuHAhpk6dio0bN+Kkk05CdXU1Nm7ciH/+858YOHAgjhw5grvuugvnnXce1q9f73StRx55BDfeeKP9e7j4CyTulpz26UNLMBEOBEEQjg5iOSoIR4V29Wn7008/YezYsU22X3PNNViwYAE0TcPDDz+MN998E6WlpRgxYgReffVV9O7d235sSUkJZs6ciW+++cbubPill15CWFiY/ZitW7fi9ttvx7p16xAbG4s77rgDDzzwgM/pbA+/X+LTVhAEQRCEjs5f3aft0KFDMWTIELz88ssAAJvNhq5du+KOO+7Agw8+2OT4Sy+9FFVVVfj222/t24YNG4ZBgwY1icisWLduHU477TQcOHAAKf8/mnS3bt1w99134+67725RujtqebaazEzgpZeAoiKga1d9iW5ODpfoisWXIAiO2GwiMgp+0yY+bYW/BMe9T9sxY8bAm2ZsMBjwyCOPOEVxcyU6OhoLFy70ep8BAwbgl19+aXE6BUEQBEEQBMERq9WKDRs2YNasWfZtRqMR48aNw++//+72nN9//x333nuv07YJEybgyy+/9HifsrIyGAwGREVFOW1/6qmn8OijjyIlJQWXX3457rnnHgQEuH+1dxdk94TDZqOFbVGRczCciAh+37ED+PJLWoKJKCMIwvFqlS9CsyD8peiwgcgEQRAEQRAEoaNSVFSExsZGJCQkOG1PSEjAzp073Z6Tl5fn9vi8vDy3x9fW1uKBBx7AZZdd5mSFceedd+KUU05BdHQ0fvvtN8yaNQuHDx/Gc8895/Y6Tz75JObMmeNP9o4/srMpvnTt6hy9HOD35GSKNNnZ9B0owsdfC6lvwRFPVvmbNtEyv6Na5R+vQrMgCC1GRFtBEARBEARB6GDU19fjkksugaZpeO2115z2OVrrDhgwAGazGTfffDOefPJJWCyWJteaNWuW0znl5eXo2rXr0Ut8e1BRQREjNNT9/tBQIDeXx4nw8deivetbBOOOxfFqlX+8Cs2CILQKEW0FQRAEQRAEwU9iY2NhMpmQn5/vtD0/Px+JiYluz0lMTPTpeCXYHjhwACtWrGjW7+zQoUPR0NCArKwst5GMLRaLWzH3hCI8nGJcVRXFF1eqqrg/Px/47DMRPv4qtLfQ1d6CsdAUf63yOwLHq9AsCEKrkSdaEARBEARBEPzEbDZj8ODB+OGHH+zbbDYbfvjhB5x++uluzzn99NOdjgeAZcuWOR2vBNs9e/Zg+fLliImJaTYtmzdvhtFoRHx8fAtzcwKQkkIxLCcHcI2ZoWnAwYMUNNas0YWPiAjAZNKFj6IiCh82W7tkQWhjXIWuY13fSjDetImB8NLT+blpE7dnZh6d+wre8cUqv7aWx3UU/BGaBUE4oRDRVhAEQRAEQRBawL333ou33noL7777LjIzM3HrrbeiqqoK1157LQDg6quvdgpUdtddd2HJkiWYO3cudu7cidmzZ2P9+vWYOXMmAAq2F198MdavX48PP/wQjY2NyMvLQ15eHqxWKwAGM3vhhRewZcsW7Nu3Dx9++CHuueceXHnllejUqdOxL4SOgtFI68XYWFqdlZUBDQ383LGD24cOBXbtEuHjr0J7Cl3tLRgLnnG0yneHssoPDz+26fKGJ6FZ04DSUqa5uJj9nSAcp2RlZcFgMGDz5s3tnZQOhbhHEARBEARBEIQWcOmll6KwsBD/+te/kJeXh0GDBmHJkiX2YGPZ2dkwOixVPeOMM7Bw4UI89NBD+Mc//oFevXrhyy+/xEknnQQAyM3Nxddffw0AGDRokNO9fvzxR4wZMwYWiwUff/wxZs+ejbq6OqSlpeGee+5x8ln7lyUjg8vd1XL03FyKL6ecAkydShHXV7+3wvGPP36O25qjuQRffOS2DmWVv2mTs6sBQLfKP+UUHtdRcOf+pbCQbayoCKipYf/2wQeA2SyuNwSPzJgxA++++679e3R0NIYMGYJnnnkGAwYMaMeUCZ4Q0VYQBEEQBEEQWsjMmTPtlrKu/PTTT022TZs2DdOmTXN7fLdu3aC5Lu134ZRTTsHq1av9TudfhowMLkN3J2plZfnm97YjWdgJLcdXP8dHo76PlmAsPnJbj7LKz8mhFX5ysu7r+OBBWuVPndqxhHBXobmoiK5eqqvZtq1WIC4O2L+frjfEN7fghXPOOQfz588HAOTl5eGhhx7C5MmTkS2rTDokHagnEgRBEARBEARBaCVGI60X+/fnpxJffPF7m5HRsSzshJbTnvV9NJbgi4/ctkNZ5Z98Mt0K7N7Nz1NO6ZiCp6P7l+3bgc2b2YbCw4HycorOgwYB/fqJ6w2hWSwWCxITE5GYmIhBgwbhwQcfRE5ODgoLCwEA27Ztw5lnnong4GDExMTgpptuQmVlpf38MWPG4O6773a65tSpUzFjxgz7927duuGJJ57Addddh/DwcKSkpODNN990Omft2rU4+eSTERQUhFNPPRWbNm06ank+nhFLW0EQBEEQBEEQTnyORws7oeW0Z3239RJ8Vx+56nrKR+6OHRTq0tOl/fqKN6v8jogSmt95B9i4EQgIoLV1UhLbWlwcj2uN6w2hVXiaowHo0jooyLdjjUYgOLj5Yz0Z8vtDZWUlPvjgA/Ts2RMxMTGoqqrChAkTcPrpp2PdunUoKCjADTfcgJkzZ2LBggV+XXvu3Ll49NFH8Y9//AOffvopbr31VowePRrp6emorKzE5MmTcfbZZ+ODDz7A/v37cdddd7U+QycgItoKgiAIgiAIgvDXoDm/tx3Nwk5oHe1V320tGB8NH7niG1e3yj9eyMgArrySbapLFyAkBIiMdG4T4pu73QgL87xv4kRg8WL9e3w8vVu4Y/RowNG7UrdunK9xpRlvSh759ttvEfb/E1tVVYWkpCR8++23MBqNWLhwIWpra/Hee+8h9P+rwi+//DKmTJmCp59+2u6z3xcmTpyI2267DQDwwAMP4Pnnn8ePP/6I9PR0LFy4EDabDW+//TaCgoLQr18/HDx4ELfeemvLMnUCI6KtIAiCIAiCIAh/HY43CzuhdbRXfbelYNzWPnLFN27701LRPDISiImhQii+uYUWMHbsWLz22msAgCNHjuDVV1/Fueeei7Vr1yIzMxMDBw60C7YAMHz4cNhsNuzatcsv0dYxsJnBYEBiYiIKCgoAAJmZmRgwYACCHMyPTz/99NZm7YRERFtBEARBEARBEP5aHG8WdkLraK/6bq1grIS93FygoQGorKRo54o/Qp3yjVtURMtdZQG8aRMtgzuiT9cTjdaI5v643hBr6mOKg9vXJphMzt//v3bpFtcqyspqcZLcEhoaip49e9q//+c//0FkZCTeeustn843Go1NgqbW19c3OS4wMNDpu8FggE18LfuNiLaCIAiCIAiCIAiCcDRoqWDsKOzV1AD79zNg1qhRXFut8MdH7rHwjStCoXdaK5r76npj1y6xpj7G+ONj9mgd2xIMBgOMRiNqamqQkZGBBQsWoKqqym5t++uvv8JoNCI9PR0AEBcXh8OHD9vPb2xsxB9//IGxY8f6fM+MjAy8//77qK2ttVvbrl69ug1zdeIgvacgCIIgCIIgCIIgdBSUsLdpE0W4Pn2AAQMo3i5ZAuzbR8vbsjIKd776yPXHN25L0/3UU8C//gU8+ig/n3qK291hs9GMcNs2fp7oVniuonlEBE0wlWheVETRvLlyUK43Tj4ZKC6mmF9cTOH+zjt5jGP7SU/n56ZN3O6pPoS/BHV1dcjLy0NeXh4yMzNxxx13oLKyElOmTMEVV1yBoKAgXHPNNfjjjz/w448/4o477sBVV11ld41w5plnYvHixVi8eDF27tyJW2+9FaWlpX6l4fLLL4fBYMCNN96IHTt24LvvvsO///3vo5Db4x+xtBUEQRAEQRAEQRCEjoAna9i0NJrcrVxJkbOmhiHm/fGR29a+cR3x14L0r+hXty0DynlyvQFQKD+a1tTCcc2SJUuQlJQEAAgPD0efPn2waNEijBkzBgDw/fff46677sKQIUMQEhKCiy66CM8995z9/Ouuuw5btmzB1VdfjYCAANxzzz1+WdkCQFhYGL755hvccsstOPnkk9G3b188/fTTuOiii9osnycKItoKgiAIgiAIgiAIQkfAm7AXHw+MG8djrr+eIqc/7gfCwymOVlW1bRArf90u/FX96ra1aO7O9UZWVtsJw8IJx4IFC7BgwQKvx/Tv3x8rVqzwuD8wMBCvvvoqXn31VY/HZLlxxLt582an78OGDWuyzdVXriDuEQRBEARBEARBEAShY9CcsBcWBgQEAF26UHRzFWy9uRxQQaxycugLF+BnaSmQl0c/qOnpzfvGdcUfC9K2chFwPOIomrujpaK5I74IwzU1rK+/ilsKQTiOEUtbQRAEQRAEQRAE4egggan8ozXWsM25HHANYhUSwrrJy2P9hIQAvXtTvPXH0tUfC9K2dBHQEtqzPSrRfNMmZ4tkwL+Act5orv3k5AB//gm8+SbF/7+CW4r2RtMAqxVobOQEhdnctO0LggdEtBUEQRAEQRAEQRDanr+i39LW0lJhz1eXAyqI1RtvAN99R6vLsDCgVy9eMzeX1/HHRYE/QvPR9KvbHO3dHl1F8+RkvZ4OHvQ9oJw3vLWfggJg1Sr6Qk5NZb3/FdxStCc1NbRkr63lhIHRyHYXFcV6EIRmkClOQRAEQRAEQRAEoW1RIqJEsPcPJezFxlLYKysDGhr4uWOHe2HPX5cD6elAXBzQsycwaRIwYQIwahSDnbXERYE7twsKJTRnZPC4Y+EiwB0dpT0q0fzkk4HiYmD3bn6eckrbiKae2k9pKYPYaRrrOjLyr+OWor2oqaFQXl2tWzUHBPB7QQH3C+2LpgF1dayTurqm/VcHQCxtBUEQBEEQBEEQOgIniisBfwNTCc4oYU9ZhebmUvA55RQKtq7Cnr8uB7Kz6QKhT5+mlrEtcVHgjwXpsXAR4EpHa48ZGbzX0XrW3bWfhgYgMBAYOZIB7RyRAGVtj/IV3dDAZ1e1OZOJ32trud9xn3BsOU6soEW0FQRBEARBEARBaG/ae+l2S3EnNLe339ITAX+EPX9dDhwNFwW+Cs3HwkWAKx2xPRqNR/deru0nNxd4+23PYvjRdEtxgqJ5s8q0WvmMufNfazBwe20tj7NYjm5CFS3xrXui+uNVVtANDcyT0cjfsupq5jc+vk2EW1sbWK6LaCsIgiAIgiAIgtCe+OqPtKPhSWju16/9/JaeSPgq7PkbvKw1wc684avQ7K8lcWtpTz+67Ylj+wkPpwjV1nV+NOjgKw4CAwNhMBhQWFiIuLg4GNyJmDU1QH090+1O3NU07q+uPjZL8mtrgfJyCpLKqtRsZlsICmq7c44HNA0oLKQ7BIuF3xsbuS8ggNsLC+lCpoUCtaZpsFqtKCwshNFohNlsbnFyRbQVBEEQBEEQBEFoLzra0m1f8SY0b9/Oge/xIBCdCPjrcuBouijwVWg+2i4CHDlaIvXxRHu4pWgJx8GKA5PJhOTkZBw8eBBZWVnuD1J+hI1G923aZuNfXR2FwqNJfT3FV5uN1rLKqrSxkf9HRNB1RmvPOV7wtW7KylpdNyEhIUhJSYGxFf2aiLaCIAiCIAiCIAjtRUdcut0czQnN27dTcMnOptVtRxWIThT8dTnQHi4KPKX7WLTp40WwPJp0lDr3xnG04iAsLAy9evVCfX29+wNsNuCtt1jWPXs2bXN//sm2eOONR7fMW5KOjpL2o8Xu3cCHHzLwosnUdH9DA5CVBdx2G49pISaTCQEBAe4tsf1ARFtBEARBEARBEIT24nhcut2c0Ny1K7BvH63kOqpAdKLhr8uBY+2ioD3xVbAEKNZ00GX5raYj1/lxuOLAZDLB5E70U4wfz3Jeu9Z9mxs/HggJObqJzMoCNmzg/aqqmu4PCeH+88/XJ1Bacs7xREQE3VLk57u3vC8r4/4O4gZCRFtBEARBEARBEIT24nhcuu2L0GyxANOm0eq2owlEJyr+uhw4li4K2pvmBEsAeOqpDr0sv03oqHXeFisOOpov3I4gkrdkUvB4nEj0h5QUPgO//sr/VSA4q5U+e3NzgcGDO4zlvYi2giAIgiAIgiCceBzNAXxbXvt4XLrtq9A8cCAwZUrHElIc6WgiT1vgr8uBY+WioCPgSbDcteu4WZbfJnTEOm+tUNjRfOGqvqWhAZg+nduqqo59P9OSScHWTCQeD33qrl0MNPbnn8DGjfTTazLp4m1iIjBjRodJt4i2giAIgiAIgiCcWBzNAXxbX/t48DXpij9Cc0cUiICOJ/K0NceDeNIeuLbH43BZ/glJa4TCjuYL11vfcqz7wpZMCrZ0IrEj96mqP9yyBVi0iOnLyADWraMrBJuNlrapqUBUFLB4MdCjR/unGyLaCoIgCIIgCIJwInE0B/BH69odYRmtPxyPQrMjHU3kaWs6snjS0WjvQIAirpOWCoUdTXTvaH1LS/rqlpzT0fLtiOoPMzOBzZuB8nKge3egpoYCbdeutLYtKwM6dQKGDuWxHWSyRkRbQRAEQRAEQRBODI7mAP5oiwNHw9fk0RSEjjehWdFeIs+xEuc6snjSEfG0LF/T9IBExcX8v60RcV2npRNB7S26O9LRBGRFS/pqf87pqPkGnPvDiAimLSaG7ezIEbaP4GAeGxDAZ728/Ni2m2YQ0VYQBEEQBEEQhBOD7GwOtCIigIIC+qiLjORArbUD+GMhDrSlK4FjIQh11KBG3mgPkedYiXMdWTzpaCgRPTeXfkcrK9lXAPR3uXMny7Gmhvs/+IBBitqqvkRcb0pLxMWOFDSrIwnIrrSkr/b1nJbm+2hPZLn2hwUFtKiNiuJ9Cgo4GRMVxXSazUxLXR2F3Q4SbE1EW0EQBEEQBEEQTgy2bOHyR4ADtoAAWmj16QPExbVuAN+RxIHmOJaCUEf1WeuKEgg2bKA1lafAbm1dj0ejLjyJHR1ZNOpIOIroNTXA/v3A7t3AqFHcv2qVLuKaTOw79u9nPbbFsyPiumf8FRdb4wu3renovxEt6at9Oacl+T4WE1mu/aHFwneC+np+ms18zmtruV/5tjWbj227aQYRbQVBEARBEARBOP7JzAT++18ubYyOBgIDaTGTnU1rmqFDORhr6UCsI4kD3mipINTRfWu2Jn2OAkFxMb+XlgKDBlGQc6Qt6/FoiHPexI6Gho4tGrnjWLc7dyJ6SAiF2q++YnqqqynWFhdzf69enPw5cAD4/HNg1qzWpVGJScnJ7Jvq6pxXBRwvfnSP5nV8zbfyhbtxI9ClC4NJqbIEPPvCPRo09xtRWclnNDe3Y/axrvhav/7+Nh6rSUVXMTkyks/x4cP8DAtjGnJyaIFbU8O+YOtWviuMGXNs2k0ziGgrCIIgCIIgCMLxjRLH6uqApCRg3z5u1zSKICUl3JecDIwY0bKBWEsD5RxrWmJt2dF9a7Ymfa4CQUoKBdsDB3itYcN04bat69GfukhJaV4gaU7suOii42NiQXGs250nET0tjWLfd9/pwo2yxKutBX79lQGKAgMp+AwdCowb1/J0VFRwaXZODvumhgbnVQGdOh09cb21Za6EvC1bKHTn5bFvbWndtTY9RiMwYAAnP9ato2BrsbD9h4Ux4NSxCoro7TeioABYuZJt6O236Ue1I/WxrvhSL6otlJUBCQm0Ru/Xz/1v46BBPH7LFroaKSx0PtafiayWiskGA/NQVsY+wGik1W1pKZ/1kBA+e3v2UODt379DiOoi2gqCIAiCIAiCcHyjxLHQUA7k6us52DKZOOCsreUg9MgRDgZ37fJ/oNzSQDnHGn+XqnZ035qtSZ8nkW7QIApNeXl0pzFmDK0r27oefa2LLVuAhQubF0ias9pds4bte/Pmjj2xALRPu/MkomsaRbXISJZzcjL7jsJCfjY2UliNjqZo++abnBxS/Y2/VpP5+ZxY0jS2t8BA9lmHD1NQ6tu3ba29lcCVnw98+iktiFtS5krIW7MG+OMPlklyMsWtkBD/664t2kBmJrB4sS6qq2fu4EEgMRGYNKlt3Fn4IhJ6+o3IyaHArWnAyJE8vyP1sa74Ui+As6hbV8f2W1HB9uv426iepdmz9ZUOSUkUeh1XOvhiZe6PyO9ORI+L46TLjh3cHhhIcR/gp9nMPjQgANi2DZg4sd1/00W0FQRBEARBEATh+KaighZyRUUcGPfsCRw6RCs2m42DRoAD7oMHW+6bsiWBco41/ixV7ei+NVubPk8inRq4b95MoWHzZgaeaet69KUu6uqARYv46U248sVqd9cu4Oqr2cZ37OBy8YYGCoHKj29HmFhor3bnSURXlnfR0fzfYKCblfp6ipFq6XR9PcXBvDzg3nuB+Hj/rUxtNmD1aopDyn+m8rcZF0fxeONG4PLLWy+uu/ru/fNP5mHUKL09upZ5r15sP64CpRLyCgtZVmYz03vkCLB+PZ8nT3XnTvQEWt8GHNvRsGHcptxNmM3sn1srvPlrCez6G3HwIMs9OJjlHh/vfz6PJZ6ezfBwoHNnlse//01Rs6TEuc+qraXV6r59bM9BQeyXDh9mXXTtynLYs4fnrlnDduMo3Hpz4dKcmDxzZtOJFHciunKT1KkTJxzS0nh9R9ca5eUdxv+3iLaCIAiCIAiCIBzfhIdTWMnP54DLbOZfcDAHYZpG8QqgkHXoUMsHyi2Jwt1SWuIz0h83Dh09cFVr0+fN0jUujha2mzcD110HDB7c9vXYXF3k5FBMs1qB1FTWt9HoXtDx1Wo3IYGi0RtvAD//THEEoCDZu3fb5a01tFe78ySi19WxfwgJYZ+hJoEsFqZHWewXFzPSfEEBLbOTk5k+f6wms7MZ9GzwYGD7doqgERHsr6xWpqOxETjttNa1xcxM4MUXeb+YGOattpbXX7vWWSxTZb56Nf315uc7C5Tnn09/v0VF7D/37GE5KFcEhYWszxEjmtadJ9HztNNa3wbctaOoKH2/Eptb2o5aagns+Buxcycts1NTdT+7/ubzaOL6G2OzNS1TVb9FRWz369ax7Ywb5yz+DxvGNt29O3DFFbzeRx/xN0f1fzYbn7HgYAqjO3fS2lzdy5MLl+Ymelav9jyR4m6itXdv9sEDB+qTuo50IP/fItoKgiAIgiAIgnB8k5LCwe/atRQo6uo4uAwJ4YCsuppLHw0GCiOtHSi3JAq3v7TU16M/bhyOdbRzf0Xo1qavOUvX6mq2l8GDfa9Pf/LQXF3U1XEfwGs6+jWNi3Nup/5YUNfUsNySkoCTTqKQFRDQOivztuRYtzuFJxHdYmE/UVrKdlBRQbE7IIDCTlWVHkSqspKiqoowbzL5ZzWp8p6ezj5JiWEVFbxfcjLTk5DQ8nw2NADPPksfqgEBQFYWt5WWUoyrrm4qltXU0OVBTQ3bjKNAuX07892jB/c3NHBZOcDzIyKYh7Iy5knVnTfRc/Nminapqe7z4EsbOJrtqLXW4Oo3QtWrWoLflmlsLe5+Y9SkhKqXwkJaxFZXU3QODKSoX1fnXvzv2pWW6MrVyIYNzGNZGbc5BgMLD9fbTVSUdxcu3iZ6iop01yKeJlIefLCpOD179nHh/1tEW0EQBEEQBEEQjm+MRuC884AlSzhgDA6msBIQwMFmYKBu5WSxdCgrGre01tejr24c/I363do8+StCtzZ9bR08riV58FQXSpCtqKD1osXi7Nd06FDngFT9+jVvtdu9O5erL1zItjNkiPNxEREdYzn2sWx3jngS0QGKOI2NbA8VFbSqVZM/VVUUaZOSuN1k4uTPjh0U/ePifLeadMx7XBwFLMcl/RUVFMrKynTLa3/IzKRg++mnPD8oiIJhcDDvoXy9KrEsMpJi7urVbNN9+jR1nfD772yX/fvzmgEBbKsWC49T6a6rYzkEBbFcP/7Ys+i5bh3Fv8rKphaogG9t4Gi2o7ayBm+vtt4cju4uIiOZhsZGWlHv28dJg27dWAbV1Xobr6riZ3w8/3cV/x39dP/wgy7aBgbqE1IqGFh5Oe9ZXc3zvfkU9yTQaxrTUF+vuz5wN5HywAPO9dTQwDxu2cI+OipKz0MH8/8toq0gCIIgCIIgCMc/Z55J34XLl1NQqa/n9vBwDgSrqii6KH91HcSKBoCz9WZoKPD556339+mLG4e2FjU90VIRurXpa8vgcY55SE7WfcWuWsUyvusu78KtY12EhnLZsNFItwVGI/+UX1O1HLl/f72desvLjh0U3urrgYceal2gn6OFaxtvbcC0lrgOAXjfiy4CvvkGOHCAAk9wMHD22RQmCwspovfpA+zfz74iOJi+XgHdb3Z0NNuAo2jly2SQuzYdFcX7btsG7N3LZ/2NN2gp64ufXIVyibByJcunUyd+lpdTHA0OpkBWWsq05uXxnrm5LMvQUFrbZmQ0dZ3w558sn+Rk3VJSCXlWK4Vcs1mvO8C76Nm7N6+xa1fTyQVf24C//YM/baatrHiPVR/rT96UFfG+fewzdu+mBbXBwHatLGQjI9neIyO5T9PYfoKDdWG0qIjtyWCgaF9Xx3JbtIjW6qGhev/lOCHl6FM8N7d5n+KexG/ljzooiOlWEwkA09SlCycIli5lPaSksM198QXzvXcvv6uAesHBHSuwKES0FQRBEARBEAThRMBoBG6+mQPGAwc4iKus5GCwooKuEvr04bEdyIqmifVmQwPFogEDvFt4ZWXpLg48DdKbc+PQlqKmJ1qzzLgt0tcWweMc8xAXB2zdyv8bGiheZGdzsD93rndXCaousrIoFKSn61HXlQCmlpsXFlJUUNHmPeWlro6iSVQUl69XVbU80E9r8SQcubNQjo5m2bWkXj1ZPJ9/ftNARI7XcA3MBVDcPu88TvooMWfnTl7TaKRQ1bkz+4+KCgqUQUFMo8nkvLzbF6tJd226pgb47TfWWXQ0cMYZvJ+vlvWq7L/4QnezERzMtNbVUZhTbdVo1IXnP/7QhTazmRa4eXkUeR3bTVISyzUnh+lVlpKFhcxrWRn72dxcnjN1qh6YypPoGRbGSYWwsJY/2/70D/5aybfGQtb1OTj/fO9pPO+81vlI9zdv2dnsGw4fZjrq63me8gsfGEjxc9Mmts3wcO4vL9fdG5SXs86LinQr7fp6/uZaLAzuNWyYc//mOCE1fDjb1fDh9H8bGann210/4ip+A2x3hw5RSA4I4HPqaLVdWMgy37cPeO45tu+oKH63WjmhcPbZnLg4eJBt/6STmO6OElgUItoKgiAIgiAIgnCikJFBi8cvvuCg9I8/OBBTVjRmMwdxHcWKxp0F6oEDutVdWJiz4AbwGGVRd+SIf/5u3Q2G20LU9Ia/y4xd05ie3vr0tTZ4nMpDSAj9ODr6d6yvZ/0tXgxMmsTgPM2hrPjCwpwFMBWQStNYtxkZTdupY17KyoAPPmA6+vVrXaCf1uJJOBowgGXjugz74EEKLV260OWAr/XqyWr7558ZLCsxUY9c7/hMeDovJwf47DOmw7WdrF7N58xg0N0ixMYyHSEhrCflFsAfq0nHZy4zU/fv2ru3s5WrP5b1qo3GxnJSwGymCGwwsJyNRgq3RiOFuIoKtpXoaN6vuJjt0WzWhTXVbqqr6XojLIxWizExTGtWFutN+WIePFivu6wsz6KnplFsCwykYHngAAXzlj7bM2cCCxYwzSpPjtdoiaV/Sy1kPT0HkyZxsse1D+vfn+3WX9/ljvfzN29HjvB+VVUULzVN9+vc0MC2WF/PcszNpY/b4GCKrGric80atrnycn4PD+d1QkK4LS+Pbcq1fwsLY92vX0+/udde65w+bwK0EuhXr6Y4rCzICwp4/5NPdg6etmYN7x0SwuenrAz45BPmOyGBAnVsLIORnXoq752eDtx/P9t0B6HjpEQQBEEQBEEQBKG1OAovW7Zw+XpeHgUMT4JAS5datwZPFqjR0fyrqGgquAEctO7bx/T16eO7q4HmrLFaI2p6w59lxt7S6BpIxptVlqfAQCkp+rHZ2b7nsaKCQpeKnq6sYgGKHYmJFKm++YYWm81d09Wv6dChzgGpbDbW+403uq9LZbWblUXhISVFT09LA/20Bk/C0caNFKQCAlhOe/ZQFAoIoPAXGEjR6s47ebyvy7pdn5m6OgpEeXm89tixrCf1TMycyXQo1wc1NbxWZKR7YVS1k65d6RahUyem32KhyLV2La9lsfB45d/Wn8kg9cz99hvw9NP0EZqc7Pys++POQj1nCQksA5uN9a1wTFNAAAW0kSOZ5ogI4NdfdYtIx8BikZFsM92785o7djAwGcByOessWpIOHOhcd55Ez8JC5ke5gfj+e5bD1Vcz7f72PZmZrNu8PN0HcGIixeCMjJZb+rfEyr85AXXmTODyy/W+qqoKePnllvsub0neMjOB115jHhobuc1i4bMYEMDPkBCKofHxwIUXUmx29fs6ZAjd+Ggaz7HZaOmqViLU17NPGzHCuX+rr+ez2asXcMstTQXb5gToSZOARx5hv6f808fGsu3v2sU2GRur++JVFriNjbxObS23NTZSiHZ02dCvH9vRwYPH1nVMM4hoKwiCIAiCIAjCiYUStbp1A6ZM8S7qtSS4VGtQIuPOnbq1kaNQExnJgW92th6QKCpKP3fDBlrDnXqqno/mBAhfrbGOxkDV12XG+fm0ePRHwPCn7lpTz+Hh+tJh5d/Rkfp6WpDl5PjmK9ZV0HIMSFVby2sMH04B2BvuBHGDoWWBflzxVQz3Jhx16UJRUlk/OlonK4F17Vouj+7f33t6APdW25rGui0ro2BTUsI0d+qkPxPvvsvzioudhWMVGMlRGK2pcXahkJXFc0aN0p/DoUOdhUertWWW6UYjyyQ4mMKSa7sCfHdnoZ6zgAC2xQMHeG3lHkGJuIGBvFdNDctI5cnV5YHVqltAm0wUtxobgTFjdH/ORUXsi3r3btrm/XEDsWUL73Pnnf71Qa79Wrdu7DOysoB584CLL2Za3fWzQPOiuD+rEHwRUL/+mgGx1GTTU0+1zne5v6sYVHnt3896U6Jmfb3+nAcGsp6DgviMXnopy/TQIaZD9cuqffXvT3HXYuH3sjLeR7nhKCtz7t+Ki3n+XXdxIsCf8vv8c25LSQFOP51t1HEiJS+PVuuDBjG9DQ1MU3o6BV0VUNBs1t2jOLpsGDasQwYoFdFWEARBEARBEIQTF29+XVsaIMsdvohcjsJhfj4/jxzRhTtAF92OHOFgUi1brqriwNNq5YDV9dqeBIjW+JRtC3xZZjxoEJey+msx1lzdOVpcL1pEgTMlxf96Tklh2a5dSwtRRzSN4mhiIsUtXwb8nqz41DL81FRauPljsesoiCvrXX8C/Tjij8CthKPkZIoydXW6gKP8pdbXM08WC8tLLaM+coTCZ1lZ82UGuBep9+1jGTY08Ht9PZdPn3oqyyE5mUv69+3jPaOidOFYWdmdeiqvu2ULsGSJc5sKCaG1/pIltBpMSaHoEx3N5eKXXKJbmQIUDP2xVm+p71TX/kb5mt20iWnPzKT4FhrK8q6qokDXrRuPW7WKvpBVe3a0+FZ+Qquq6PKgsJBtyPHZjImh31Jv/cfRcAPhmH9P/VpcHIOxrVnD/3ftatrPKpoTxX1dheCvgOrv8e7wZxWDa3nt2cM6ttl0y1Plj1YFGbPZaP3sTrju1Yv7+/bl8Qpl6X/okB6cTOUpMpLnDxnSNE++lMeGDfzerVvTZ8WxvzMadZceffvyeS8sZLrLyphXm419RlCQblmel9exApT+f0S0FQRBEARBEAThr0dbipm+iFyuImNkJEW7gwc5qHYM/BMXRwumrVspnOze7TxQ9rS03Z0A0RbiQGvwZZnx0KHAe+/55/e2ubp78019mawSi3r0oAgREeFfPRuNXG69ZAkH9jExFO6sVl43OJhWi7W1FAVsNp7nTehxteJTy5W7dqV1eHp682XrTRCPjfUc6Mcb/k5kVFTQp2RODi0oHa1YIyKYJ5OJn1VVuosJm43bSkrov3ngwObz6ypwFhbSBUN1tbPQ4hiELSqKApLVyvJQ0eUtFt3Kbts2CpCrVjVtU2lpLIOVK3lcTQ3r29F/qyq3llhyt8R3qmtAtcZGPiMDB7JtZmdTVK6rY1qsVgpXvXox3YGB3F9cTGFL3TMujuevX89j77qL22fPbnn/0dZuIBSe+rXCQk6u1NWxXJKSWIbu+lmAQmVDA/vNlgZ0tNmYlrw8Pmea1rSsXPtmfwRXT/gj+DuWV3g4ra2Li5nOxkam2Wpl+s1m1lN0NI/t1q2pcG2zsV243ltNOqpVIlYry1f199HRTMMXX7AvHjaM/YUv5VFVxXSqYzTNeaJo9GhOvEyeDCxbxomiyEi9bjSN96io0CduAOa3vJx92NixHSNAqQMi2gqCIAiCIAiC8NejrcRMXy0+XUVGTaOgoCJ4O/qv1TQKURdfDFx2me7v09NAWeFOgGgLcaC1NLfMuKHBvzQ2V3chIQx+1bMny9hgoBiVl8fBuRJu/KnnM88EJk4Eli9n3VRU6L5BAVqBRUQAb7wBfPopt5WUeBfwlKC1YgX94ebkUGB87z0KT+p4T1bczQnicXFNA/14oyUTGfn5tGLVNLZfRyvWw4f161qtuk9L5QtWWQB+9RXFxObS6ShwZmSwDdTVUUQFeA8lSKklz6mp3N6lC+veYtGfsbo6CspZWbo/S3dtKj6eAeays4Hrr2caHMW91ljs++s71fFeISH8zM9ne1myhCJYr14s+8JCnq+WiKel8Ro7dtDNQU2N+3umptLfaPfuFKpb2394cwOhhLfqaoqIrbG61jTdl2liIp8/FUDLXT9bUEAxPjAQePttHuuvaxwloK9fT4venBzmsU8fZ3HY1WJaCa6VlXpbVBbqBoNvAQP9Efy3b2d9W620bo+OZtlVV3Mlh8HA8gwM5ERHWBivqQRMV+HaZmt+wigpifdTk44hIWxPy5axHwgMZB99553ASSc1L0Cruq6qYnkpP7lqoigsjPeeMIGW1Zs28bjt2/kZEsJrq8kl5aLFZuM14+M7RoBSF0S0FQRBEARBEAThr0dbiJm+ilyXXtpUZHT0PVpWRrGuuJgDWSXWXHhhU79/jgNlQPeDmp/PAbHFAvznPxyg9ukDnHZay5ZftzXelhl7izTvLo3e6k7TdN+kKkBXYyOFiPBwXcxTwo2vorXRCNx8s+5zNiaG1/3jD2cfnTU1FGA1jYGe0tO9C3i7dum+fLt1ayr4OUaddycA++N3szn8nciw2eiKwGzm/2Yzj1NWrMp6OCSEAklDA4UVm43lZDZTpKqq8s2q3VHgXL+ez4yyKC0r04MSGQy6Ja7VynueeirPKSzkM1ZWRsFMLd9WPjA9CfdhYRR4unRpKl611mLfV6trx3vFxVGora5mGapJiY0baV09cyaDfFVW0h1BWBhFa9W33HQTr9lcu2mp+wZX3F1HPYtFRWwPDQ3ABx+wXfjiZ9r1esrPbmQkRcGAAB6Tns57lZbSF2ufPiyXVav05zQlxX/XOI4CemoqhcLcXLal0lLWf1gY85Oby4mJ5GT2d2VlTN/SpbolurJQV+kdNIh1vm1bUytgNZHTr58eHM5xwsBV8M/PZ1/10098JgC2VZuNbUi5OIiOZlvq3t27gNncZEP37myDoaHsW9euBebOZRuMj2efUF3Ncx94AHjySe8CdE4OV0rU1vI5rqpim1F+sq1W1m1DA7dfcAHLZ+VKntOpE+9tNLK9mM1sAzk5ulg/a9bR8WPfSkS0FQRBEARBEAThr0dbiBG+ily7d7sXGZUfyR07aK24Zw+XjHoS3BwHyqtXc9BZUMABflUV75mQQPE3NJQDYLVUOifH9+XXRwtPy4y9WYzZbBQ2lWsIm8173ZWVUbwKC+MxgB5sx2LR/ReqAG/+iNYZGVwyrnx0btvm7KMzNpZCkPLdqqKQexLwmhP8Vq8GHn2U7cubL15f/W42h78TGdnZbNuDB1M0KizUBRGrVRdw4+O5z2ikoGI0sn6MRuatd2/fl8YrgfO113hPZVlts1F4qqvTy/HIEZZDdDSPGTqUFtF79rA9KNFYCTiHDvH5URapjnhqJ21hsW+zUTiaNInpXbNGF/8cra6Dg3X/wVu3UvRSFuMAxbbqaraNbt2Ahx+mFbPyU+tOlG2u3bTEfYM7XK9TVMR8Vlfrwdzi4hgk66WXfPMz7Zquujrd6rK4mJaedXVcMl9erov0339PoS84mAHm4uL0ZfadO7PsmxPa3T27ffuyHI8cYb+sVjxYrbT8Pess4JlnWB8FBfwsL+cxiYm8bnY2y0C5GJg9u+lkDeDsiqOujs/Vvn183lzrOTMTeOstCrdWK8vbYOA5BgPbv9HI5yQjg/nwZcLH1wmjhgbgb39jXrt3dw6gGRbGdL/yCvDvfzcVgSsrORFx5AjryGDgfquVbVwJtuXlfHajovSAbxdfzDbW2Mj7GQy8d1IS711czOuefDLw+OMUwDsgItoKgiAIgiAIgvDXoy3ECE9LdJUAYDLpUao9iYxxcfRF2akTrd9cl167kpFBceeRR5hGtVTUZOI9rFZdhDntNA78k5Mp6Piy/Lo98GS1lZNDkc1q1V1D9OkDnH++57pTPgt79aIgBzCPhw+zrM1m7q+ra5lo7c1HZ2mpbumnac7isL/BiAAKFnl5XPKu2o0nAbg5v5u+4O9Ehmr/6ekUX5TVpHId0bUrxajQUIojCQn6cmS1XLlPH5576JDvLjoyMoC772bdqQBuu3bR0u7AAX4PDGS933knA5H9+ivTYzTyWYuM1H1pJiXRSvqLL9jeUlOdnwdv7aS1FvuO/mkLCihgmc0Uwl2tP885h/dqaNDbmWO7UW07JobXvewy4MEHvYuyzbUb9WxmZ7McY2L0ssvN9b3/cHzGt2/X3RVERFBwCw2lZWlsrO9+pl37DJOJbUv5lrVYKOBVVuqWpErUrKqiha3BoPsydlxmv3q1d6Hd3bMbF8d+Z+VKTgpYrXz2k5O5/+WX+X/fvky32cz9dXXsOwICKCTX1LC9hYQ0nazZupXXUpbYal92NvPmGBhPTQx99hnLvFMnXltNYIWFsV1YrbRiffhhCpj+TPj4MmG0ejXw55/sK935C46L40RKWZmzCJyZyee5sJD119Cgu9nQNLa/6mqWQVIS+xKzWe9jExKYr9BQ3ZK7tJRibUkJrxkbSxcyHVSwBUS0FQRBEARBEAThr4i/viTd4S4wkqOfPZuN+41G7wKxiqg9fnzzg2WbjQP3rl05yM/J4YDUYuF3FeSpuppCVv/+HKRefTUt9lq7hN4xHZ4G6t72ecI10vzGjbrbhGHDKKS5ug1wV3fZ2brYocpZuaEoLNT9qVqtPNdTPXvLgzsfnUqkVRHYLRZdHFb4E4yorEz3waqWMyvaOoCcymtZGYWO/fspYjQ3keHY/uPiWJaOgYEAiiPjx3NptBIcAwJ0kUVZOQYFsRyyspqWubu66NaNLg9+/pntu7pad9lQW0sBNDyc/xcWUjTatEkPWqaEHCUcm0wUSn//ncuv09N96w9aY7HvuLw+OZntGaAgt307RbW4OF2k//VXlmtZGcsxMND5elYryzYykvmvqHAWZV3LMTlZD9Dl7rtjmw8KotC6fTu/R0fTL+5NN/nef6hn/J13+HwHBLB+HNsC4HvbdrX0rKlhOuvr6Sv1l1/0vJhMfDbVpEF1Nc9R/6tl9vX1bLN5ebTQ9XR/TxN2BQW8VufOvM6pp9K6dNUq/fmy2bhPBTQsKKCgOmAA63fdOvYTXbo4T9ZkZACff87vF17obLGq3CTs2EGXGmpfdjbL2majaKoEf/U7YTLpbhlOPrllfUlzwn9+Pss1JMT9/tBQ3TfziBG6n+833mAaO3Xi5E9DA4+prKQ1fEUF2+GwYfrEmPLpXlHBY/fuZT0ZjcxnTAzLOSyM/VR9vW9BENsREW0FQRAEQRAEQfhr4q8/UHeihxJjXX1MBgRw4F9fz4H25MmtE4gVysIrKopCVHQ0rRQDAvTl6NXV3K/E49paigXNWd35iqN1YHNLdz0F4fJUH0rQWLdOX8qrlhnHxfGY9esZzOaCC3jcrl163Q0fzuX2ubl6FHflhiIzk4N4tRzbUz17y587X58qKM6hQ7p1bXAwRQolXgKegxG5Cn5KAC4v53XM5qZl1VYB5FzzWldHca6igmKht3bqzlo9KkrPw44dLOPp02kx9+uvPCcoSLcSVWJwcjLw0UesS8cyHzDAs0/f88/n8v+8PApcyi1DQwO/BwZy2XPXrsDppzM9u3axfmpqaBV5yik8Lj+f9dGtG8WtP/9kW4yO9j650VKLfdfl9WVlzkKeq+/l5GTWS2IihVOTSbeYVPcqL6cAqny5OgrF7uq5pobty2Jp+t2x/BcvZjrHjGHZKt+xahWBP2RkAFdeybro0oXPiKvFsD9t29XSMz8fWLQI+PFH3fWAcgUQFMR7HjlCYXz/frZXx+BoyoVKXh7bq6MA6khzPnU1TQ+MVV7OiYW4OH4WF+uiu8Gg+3VW7lwqKtxP1pSX60v9y8v1Zw3wPJFTUcFrA7yfxcIyV64kjEZey2Q6esEoExJ4b+UKw5WqKu5PSNC3rV3L7RYL24PJxD9VhoWFrEvl4kHVnyrH/HwGhKyvZ5nFxurBx8rLuQqlouLYuQZqBSLaCoIgCIIgCILw18VXf6CehLwBA/SAJ3V1FFXq6zmwjIzUXRRs28bALMrHZEutXZWFV3AwB6GhoUyrCmSj/Hoqa1JlxRge3jZL6B2tAx2X53pbuutrcJ/MTC4hPnCAaVX1cPgw89GrFwfjBw7wmjt3UqS9+moO+FXd7drFNDoK5GYzBbikpKZLiH3Nn2MelFjnaOkZGUkRQS3Bra/XLW3dCXjuBD8l1uXm8v/QULadjAzP0ehbYtnsLa+1tcyDJx+ZCl+t1QMCaBl48KBuVdrYqB9nMrGODx50TsfPPwMffsjj+/VrWhcXXcTnLSCA1nfKkjIpic/0li26e4lOnShyVVZSIKqpYZ3s3KmLaDU1/LPZdIvsxETgvPM8t9uWWuy7Lq9XIpoS8lx9Lyshc8QI1nN2Nver/qa8nGJcejqPc2xnrvVcU0NBUgXQy8iggOkYUC8khBaaX33F+w8b5uw7Ny3NNzcG7lCB08LC2iY4omO/1q8f63zpUtav1cr2pQRU1V+qQHRJSU2F9ooKXST3ZO3rq09dZfWsLE2Vb11H0T0wkMcfOsR+Sv2+OE74AHpfou7lijuxW1mVq3wpy1r1XNfW6gEZHcu7pX2KO4YNo+Xzjh26L2tN0y1dDx/m7+iwYTxePRuxsezrAwP14xsa9HJU1reufeygQfRlW1xMn8Vr17JNBAczn6Wl/L0eMaL9XQP5gIi2giAIgiAIgiD8tWlOzGxOyBsyRA94UlLSdPm3xcIB68iRXNY/ahQHwpGR/g+GlYWXEgeMRg5ilRDQ2KgvKTeZOHBV0dF9oTm3B54CZ3lbuuvOB6u7+6prp6RwsK6Es7g4DsZ/+EE/1mqlH8TcXF774Yf1OvRkQT14sHeBvLnAYK55cLX0VFbN1dU8r6KCQY9GjKBQ5irguQp+ISEUaCsqKEBERVGwOHyYIsXQoSwLRwG4qgp46in/LZu95XXYMFpzdu8OXHGF93bqzVr9vPMolGzbxrbkbtJi0CCK07m5zukID6ego5aUK4tJx7r45huKXGPH6kGmLBam1517CWVVefgw0/XnnxRzw8NZpoWFvEdBgS5cZmVxIsF1wsH1OfF3QsZ1eb1yb6KEPEffywDz19DAfRdfzP3ffMNAcMrqPyWFeXBsZ671DFDMbmhg/RYW0nLdYuH3oiI+VyNGsE2vW8d0udIaFx2erJM1jYJaZibbhfIF6ytqYu333/WAdwEBeoAqZdmtafo5VVWsZ2WlrcTv/v3Zl3uyPvXFp26fPrxnZSWvdfgw9+/cyXquqqJInpfHYzZt4jUKCymKK5/cCkeraldBV+XFVexOSeFv1q+/sr0FBvIeISFsJ+p349RTmYesLLaPVauYrro6/1ZLuCMggM/PAw9wIig8nH1kRQXrKTCQYu7ixZxMKyvTV4cEBOjPsnLp0NjIusrNZRmZTGw3u3fzOqmp7He7dmX6le/qggJnf9cXX9yy/BxjRLQVBEEQBEEQBEHwhC9C3tatDHiSlKQLK45LfmtqgM2bGbgqONh5EOyvlY8SPDZupLVaXh4HoHV1HNQ2NjJtyrdqSorv1kTNuQXwFjjL36W7rqKXEjO6duX/jgIWQEGitJSDcouF1wwKYp5/+43+D597Ts+nrxbUjnjLn8Ggi1hLl7JcgoN1S8+iIootjY0UYoxGlmFeHgWQ88937/9TiZ6ffca/oiIKiXFxXKa/Zw/zWFbGtjZwoB4Aqn9/CorNWQV7ymtmJttKQYFzmzUYeD0lPjUnyLkr66oqXcR0bEvnnw9cfrlzvc+e3bTMy8qcl5Qri1PH9nTgAL8rdyCO1NXpIq7FogcIjItjfg8f5nNpNnO5fGUlj4mNZdqVcOlOrPf0nLjmzVt7Cw1lX5GVxec4IsI5YJ7yT2uxML0rV1Jsevtt7quuZn9TUMDvxcW8Rp8+tD4PDtafMcc27Rgsz2hk2vPyWMdGo7OFr9XK+5eXO5e/IiSEQtmGDfzu6wSUO8Gzpobi/sGDekCuZ57xXSh0nFiLj9fbTWUly0i5GCkqYhlUV+t9zJEj/N9xss1sbt7a15tP3dNOYxoKC5lHm43bY2JYjoWFFHILC7kvKorPfUkJ60n1J/Hx+v0iIvSAaq4Wyp5ccezaxdUJZjOfB9W3qtUAoaHsUxIS+Pu0di3wxx9sm8nJ7GNCQnxfLeGJyZP5+cQT+vUDA1ke4eFsQ1u2ACedRPc2SmwNDmYeVKBNtZJE/d5FRvJZLSjg9ePjgfnz2e7T09m2Hf1d19XpEzzKbUQHR0RbQRAEQRAEQRAETzQn5DmKR2oQ6khhIUXF8nIOKDt39s9lgCuOgkdFhb40PDKSA31No5BkNgNnn+17oCBf3AIoS1J3gbP8Wbq7fTuwYIEeCCg6moJFQQGtpIxGXcBSAmB5Oa9jsTANAEUHFXjqk0+AiRMZ9MqxrPyxAPQWGEyJL/v2URxOSKCAUFREq8BNmyjKxMXpvilrari/SxfmJz3d/X0zMij2bdxI0SImRhdQo6N1f7n79rGchgyhFetXX/luFezKli2cSAB0ISc2VrcO99dnrmNZKzcX3tpS//48dts292WulkJ36kRRzbVNKT+XnTvzmq7+ZJVIpQTQVat0H881NbrlakUFn1slECkfmAcP6kKlo1gfEEBfmcXFzefNE5mZFOj3728q0quAefX17FtKSmglqWm0mA8JcXZtcNZZzIeaEAEoBH/2GeuyXz/n8nV0w6DqrbFRLztHC18leCuRDNDF77w8imVHjjCw2Fdf+WeN6Sh4rlnTOqHQnTVxVhbFOk1j/eTk6C45lMsEs5nipcXCeyYm6tatyh9zcysU3PnU/fRT1qHZzL6uuJj/q9URAMXh4mKmJSSEfUZdHfu/IUMonq5cCYwbx4kq5W7jpJP0NtScKw5VLo2N9M2rgjvW1HCbmmCsqKBgGxjIdJrNbI9HjtAKe+hQ3/qU5pg4kX2Oun5jI387a2pYHsonsPIHr1yYqLzU1+urLEJCWC4ZGc7+brOzWde5ufwMCaEFueqTVVk357O4AyGirSAIgiAIgiAIgie8CXmAd/FI0zi4Limh9VByctMl3i0ZBLsKHvv2ceCekMDBb9++HIyeeaZv1/XVLcCll7oPnAX4vnR3zRoKevn5/K58DJpMHEgnJHBpcHy8vtRcCbMGg+46wGzWl/qaTBzwv/gihTRvy9i9WQN6CgxWWMh0l5Vx0B8XxzLPyqKYnJ1NQSEhgcKfwmjkNXv3prWYt2XkVVUUK7p1063pAN4rNpYCz549FOHHj/dtMsHT0vXMTOC//2XalW9R5VuyrIwijTtLQ1/K0l8XE57KXLkLUOXi2qaqqljWU6ZQoHT1J5ubSxEOcA4QGBhIMaq+nvdPTdV96qro9lVVPKa21lmsnzuX+aqvp4sTlV5/nmfHyZEBAyhWKh+1R46wPvfuZbmZzRS1g4N5v7g4is/KtUFREV08pKdTyCoqYv7HjmV+N22iaKisCiMimrphUG5UlDjmaOEbGcn6KSlhW1HiYG4uJ1iUKK7K3d+JqIwM+qmeNYsCXUaG7sYA8L1M3T0LffqwLQPMmwo+BrC9paayLRw4wAmRsDCuligv9z84pOOERf/+FPm/+ILB0DZv1vtE1V6OHGG5axrLd+RI9h2O1u5mM1dwZGfrgeWUuw3At+CZjuUSEQFMmMC+du9e9kf19TzXZuPxamVAcrLuU1f52B4xouXuMBzTs3s30xoezrZcU8M2pOqtspL3qazkb0R+PvNfXc32Z7Ox3nr1ooXwtm38zevWTX/OY2P1vNTUsH67dHH27ducz+IOhIi2giAIgiAIgiAInvAkKim8iUeHDnGArIL9OIprjsJaVhYH/v4EfXG08Cor089tiZ9cXwVAwL0vSsC3pbvBwVwKX1LCMlXWXjU1esT1DRsonu3Zoy+HLSvTfVEqoSEiQr+/Cq5TVubbMnZP1oCuvjYBihzr1lEQMxgo7qil0MnJFPPKyykmqGXYShwoL6egkJBAy1Zvy8i9tTPlhzEhgelTbcXdZIKyhKyu1t0KAExfVhbT/t//cl+PHhQ2wsMp0MTGss2uW0cxd8QI52BWrmXZuzf93zoGgfNXTPbk31QFq9q9m/dx9O/puBT8zDN1kczVf/HVVwOPP677HA4M1P2WGo3Mc3U1Jwgcg/kFBFCQLCjQn6+QEE7M5OayDa5dq/sY9pQ3V9wJ2qo9FRbyfpoGTJ/Ocm1oAN58kwJjZGRT1wYRETyvpoZpVMvrKyr4f9++FG1ra5mmfv14rrJiV+JWdLS+dF612chIXruwkPuWL9ctVA0GllVYGMtqwwbfrDHdif4HD1KYO+kk9+3eF6HQ3bMQF8c07dypB21TvkwTE/VjAwP5DB84QIE1Jsb/4JCuZGQwr7/+yjamLHjr61mHAQFsj5qmP9cJCc7X6NqVbfP663ms6++CL65fXMvFYKAorvzIJiby2SguZr7r61nfysLcNSBeWJh/1veuOKZHWdU6uhFSVt5WK9vSkSPOgQGDgnRr4IAA3Yd8v34UoaurdQFYtd/GRm4vLGTb9dVncQdCRFtBEARBEARBEP56+GqB6UlUApoXj2pqOOg94wxd3HEkNJSCxIsv6pZ9/gR98Xf5vyd8sSbOzaWg6OqLMjSUVlG7d/N7QAD3OS4dP3iQaV27lgPlyEgOvBsbed+GBpZlUBAH1UuW8DqdO+tBpOrqOOhWx6pPg4HlHBJCcU8JPDU1zbt7UOKKYzs4/3zuX72a+crNpcClBL3SUgoHKSkUoTt31t1j1NQ0FQfi44Gff+Y1vC0j97WdKRHVncirrOKKipiWhgbggw+Yn+XLmY6CAuZBiZBGI88LDNQD/hw6REEnPZ1iCNC0LLOzgY8/Bt57j1af8fFNl+MrAdkxQJir2wV3/k1VXQUG6tax5eWel4J78l+cna37HK6s5J8KTKUstpVfSxXMz2jUl7EfPKj7Pu3cmfVtMPCaxcV6hHtVV825lHAnaCtLauXDt6qKrjK6d6cVYUAAxTL1DDi6NjCb2a4OHdLvUV/Ptnvqqbx2164UJYOC9PLt1Yt1vm8fBdsBA/jcqO+9elHgX7WKZXTGGbQIrqnh89jQwOOSk1luvlhjeppAcXXf4Knv8VSmNhvLTllUquBlZWXcd9JJfB4PHqQFv6NVp7p+9+48d/Jk4NxzeY2DB/UAeuq3wdNvhuv2zp3p/qW8nOUUHKxPEsTHs7zKy/V69LQyITiYZeSuj/el73fXRziKpfX1enA25SpEHVNWpge6rK9n21N+xL35+fU1Pa5tGXC28g4JYRqU33A1MafKqrCQExKqLA4d4rVUXxMezuemuprpPnKE10pKYv3k57MOlNVzB3aRIKKtIAiCIAiCIAh/LfyxwPQmKjUnHpWVMUCWWnbtSk4OhRKjkff3J5BUW+KLNbEarHfr5hx8JzOTA2BA9/NaXs58KeuoQYNocVxWxu9mMwfSAQH68WpwrUQzFTwqNBTo2ZOWg/v36wFolGhrs+mBs5KSdD+bCxfynhkZTLc7txQ2m/tgWQMG0Hrw4EHWo7L0Mpl0yy+15FZZhFqtzF9JiS7mqkBieXm0ljz5ZH3Zumv9+tPOgKYib1ERXThUVzOfVisFqi1bWFd1dUxXdLQu6GZn87ohIbxHfT2Fj9BQil25uZxQCApytg5Vgola4l1XxzJwXI6fnc1rKj+yymduly5NhR/XgE7KWnbMGFrEbd3K7QcPUjzv2pWW7Y4+gt2JWGVlvHffvjxPuXxQYrKaKKmpYfqrqyloK2tpFRQqMpJlrXzfNjQ4WyCqAF2Oz4k7PE2OKAvIsDCK5Lt381plZWx3nlwblJUxvY2NzpbIJSVsC0OH8rmxWIBp01g3qq2npfF5UeXh+L24mG4XlFsGs5kibmQk29WBA7qw5os1ppqYys5mOSckMB/u3Dd463tcUf24Wq2wdSsFPjWR09CgW+oHBur9gCtGI9OTlsbznnnGfZ+g2qG37XV1LP+sLB5TUcHyTElh2ajyUv1KYKDvQcX8xd1EkBJLAwL0QGTKB2xDA9uSzcZnITRUL5vKStZxa9LkmJ7OnZ3bsuPKhMhIpslqZX/haEGrCA/XV29s2aKLtiYT22VMDD8bGthfVFXxd6SggBNY5eVs13fdBYweDdx887H5rW0BItoKgiAIgiAIgvDXQfmULCzk4FAt09+40bNQ6klUcreM1lE8stkYTMad9aTNRmHQbKZVnBLjWuvvtiX4a+WpxOkVK7h822jkdxUwJzubA/FLLqHfQZuNg2NV1spqFeCgWlnvKb+Pyk+txcLz09J0UUj5NWxs5H2NRg7WGxtZf3V1wGuvcWAeEEBB2THAllpyvXq1Lhg5WuKqdhAZyfNzcijkKP+fKiBTfT3TlJDAfA8YwPIrLOS9MjJo2ar89A4axOu51m+vXro4HB4OzJypC8nNtTMl8m7fTotLJXwpq9SBA9neVVCktDSWtRIf6+p00a9TJ+ZZlW337vy+bh2vPWaMbpW3c6cupCiRStP05fhFRbRStFgoRgYGsrwOHaLwfv75TYUfT9ayRiMDGK1YAXzzDfN76BAtfNeu9WyRnplJK+PMTArnwcF6O4iNZRuordUtCRsbdeFULR+3WlkOffsyr5qmuxaIidEDdnl6TlxpbnIkJ4di6Ztv6laF+fkUmoYNc3ZtEBPDT0frQ6tVt/RU1q/9+/OeAwdS6HYsX2VR6vp9505ntwz5+Xr5WK28XmUl864mYVRZuFpj2mycuFq1imV94IAu4KenM2+O7hua63sc69fR+nvECOCHH2gRHBDAtIeG6r5sjUY+i926Nb2HCupmNLq3zv/5Z+DDD1k+/frpqwuWLAHefpvC4uDBzMevv7K8amv1gH4HDnACKSVFdwNTWsqJkchI34KKtQR3E0EmE+skL0+vt8pKPRih8m9bX89n3Gxmen/9FTjttNalyTE9ubl81kpKdBE7JITPJ8AyCAvjb+P69WzPERFMj3Jxoib58vP5vFos3FZZyfJXVuoqoNnOnWxvyrVHQgKP/fprPks33ujs6qWDWN+KaCsIgiAIgiAIwl8Dmw34/HPdz2NFhe4vVIkwnoRSb6KSJ7xZT+7axcHn6ac3vYavvhxbi+Oy3tNO4/+erDzPO6+p4LN2LQfDQ4Y4B5zq14/X2bGDQtG2bRwcKzFWuToAeA/l5sBmo9BRX88BfHk5B/dpaUxDQgIH6Mo6y2xmWmJjef3ff6f4qJa0x8dzgO4YYCsujtfet49WXaef7pz2Ll0oVDY08D5duvCelZW8n8nEegsO1v3GpqRQ3DMaaXVnMND66/BhikeDBjm7xzAYeN0ffmA7KC/nddVy6PPP5xL55tqZmkx45x2KzQEBbNeJibx+WRnrTAWaslp1C8nKSt2na3Ex0x8WRnFEWbsZDHwutm9neQBNfVG6CnbJyfrxyooT0OvYnaWjwtOS71276C+6qIj7m7NId5yYSUrSrZ8d20F6Oq0hw8L4XVnQKmvw0aMpyinhUtWbCnCVl6dbipeV+Sa0eZscyc9n4CqzmeJo586sm4ICXnv1ap6jXBvs2cP2mZxMAbCsjOWi3DUof7e7dzPQlWpDruXr7ntFhbNbBlcLXyW2Kf/Salm72dxUZF2xAvjuO13wVgK+qou+ffXr+GJhDrj3DRweTuH1yBG2xbw8PgcpKXSbsnw527k78c9mY30r39WOdRMezvSVlemCXlER29ju3dyu+jZl3ZuayjZbWMjnqmdPCrd5efoqgfBw4J57KA77MhnYUlwnHGtq9DpTz3twsO4CQYm3qr9Q7kAsFj5LjtbtrU3PmjUsExX8rH9/to9163Sfu8HBum/ioiK9bXbqxOvFxbEs1eRaWJjeJ6kgb9u2se5ranhObKwuqGsaz/3pJ9Znz556P+yLi6JjgIi2giAIgiAIgiD8NVixgtZ3eXn6cumwMIoySoRZvdqzUOqrD1lXH4furCd79eJxnqzymvPl2FrcuYiIjqbYV1zsLCD079/UjUBCAge5PXp4Dzi1YgXw/fcUyNTycINBt6ytr+c5ypLvtNN43cOHdYFEBdOqqaEQW1dH4TEykvVXX68H+UlKouiiLKosFg7QleWhslSsquLAv6DAOWq7EjbLy3nPqCieU1fHPyWMNjbyu7LeBCjIXHwxcNllFObeeYcuEQJcht2FhRQmMjMpKERH6wKToxDZv3/z9ZiRAVx5JQWvzp1ZdwcP0jpNBdNS7h2UkOqYH2X5rIIQKWs3x4BgAMs2JqapL0pHP5QA91VXU6iuqnIWWpKS2C6Ki30PvudOoAN0i+Xt24H584ErrmBak5P14/v1Yztds4b1GR7OtrR5M9MyZAjLvaSEwltQEC37pk6lOFVUxPpwDHoXF8c2unIlyyA/nyKPL0Kbp0mc7Gw+I1VVTO+GDRT5+vShhe3q1Ty/qIjln5bGdp+VxboLCWE5qcB9ym3FkSNMj7/Wka4WwY4WvnFx3FZWpgd6qq1l28jN5X51P5uNVozV1UyzmqhxfCZzcnhtR/cNruKlEthVW7HZmvoGVn5te/TQ3S2ceqp+zBln0GK2sZHHKqvxgAC2g8mTab3tGkBP+RqOi+Pn/v2sO0e3FA0N3F5RwToNDtYt3pU7jMRElp96PoKDaTl+/vnA3/+uWzwr1xlVVcxzW1h8uk445ufzmfnpJ6YnJIRlpvpm1V9pmh6QMCKC+W+LSUTH9GzZQivsvDzmNz+f942IYN914ABw1llMg/KPbTbzN6KmhhbOavXAnj26exMlzJeX08p8927eQ7VlVcfV1SzrmhqWTWIir3WsXRR5QURbQRAEQRAEQRBOfDIzuUw3N5eD0qgoDv6rqnTfeRUVtMBUImFL7+No1dTYyIH85MmMCl9VpQsPs2e3zJdja3FdWqws23JyOEi/+mrdqqyqCnj55abHbtnCJb9JSe7Tr4Ksvfkm89q5M0ULk4kCWX09t6vPkBBg7Fje12jUg2Kp6N81NRTX4uP1ZdVFRdymlltXV+uCZGgoB/DKJYLyu1layrqpqqJIpIQbJb5aLPyrrNStAkND2T7y8thWNI3pCQ6mOGk2U8iJjQUuvFC3uv3qK93HrKKwkCJcVhbTlZKiu3FQFs+Fhb67xrDZeF51tb40W/mmVcKqY1mrulH5qatjfmpraSGo3EgoAgIoKitrXEerSyWKKMtcQH92UlN5nmsgssZGCsq+Bt9zF7xLUVTENrVxI+tS+Ut1nEyIi3O21LPZeM7w4cC113q3nvdkJV9YSBHp4ov9X07tavmYmUmrTOWmQ1maO1oFK5/FN9/MMgwPp9j2978zTcqn8q5dukhus7E93nij/6KTO4tgZWF88CCfIZOJZVFczLrt3JkCmqNwrfwaR0To/mUV6pnMy+PkiTv3DSkpzNNTTzlPGEVEUMwLCmI+IyP1yQSzWbeiVcvlAZZtnz60uj14kGkPDWWaL7yQ57rzN6yu26kT+5pdu/isRUWxPIxGtmnVVygfxwkJelsJD2d/pdxuqNUGX3xBsX7iRNZtQACD+/nia91fHCcc+/dn2tau1d1caJo+iRkQoPu/Vf1hWBjdkvgyiehLkE+Vnm7dWO/K1U51NcuztJRlUFwMfPIJLWb792e6Dh7kdTWN6TKZgAkTWLdq5QLAa8XE8DgVSNNq1X8nQkL4vKj6UwHZYmKOvYsiL4hoKwiCIAiCIAjCiU1DA60elVBmsXAQppZ3V1dTJImN5YDPl4FpQwPFt/x8DtCHDaOljxJD1YAwP5+D4yVL9MF5t24c2PrjR7ataM5ycccOWoE+8AC3P/WU+2MzMjhAXr+eFm1BQbq1KkAxID+f5TxkCMtILaE3mzko1zQOuCMjgXHj9KW3SmjbvJn1kpurW+f170+rvd69nQXBvXspduzYwXQ1NOiCRFwchYiaGuatsJD3VSKFo0h22mm6JWFSEtMZGqpbOdps/K6EXquVwoKrpaU74Uv5VVQBsiIj9WBOyvJw1y7m0RfXGGqCYPVqllVlpb6s3WplO25s1AO2FRVRUDIYeN/QUN3yNiqK9eQoTiixY8wYlt2OHRR7o6PZPgMCeA1lmatpLIvoaF34UUG6FP4G3/MUvKuwkBa0VVW8V5cuPEYJ4mFheuCpuDjmsayMz3puLi1z1X08lbE/vqxd8SRc2WwU+ydNovC7aBHzoHzuGo1NrcOHDWPbi4zUra9tNj53mzbpz11cHPOofMQOHw6ceabnNHrCnUVwp04s43372LZiY1nGStRLSqILFde6M5l0tyauwaQCA9lmu3Z1777B3eRSdjawdCnF3gMHdMtJx8BWaiJGWX8DLOP4eODuu91beKvAYa6TaGqSQrlxKS9nm1bWmcofrAq4p/qkgADmNzqaVriVlboLmNBQpiUggPlYvpz9j8GgB9o72kEpBw6kT91t29gXmEx6MC/lKgRgH6mC4fkyiehPkE9H1q7Vn8/qatZrVBQ/s7I4IVVXx3I75RT2Ve+9p9eXwcBJpW7d2DcVFOj+jFUfXl+vTxqqVRLV1brgrvIKHDsXRT4goq0gCIIgCIIgCCcumZkUbD/7jAPRujrdelItq7fZOABXljnNDUy//ZZiwp9/6laNPXpQuKip4WB97Vp98BkTow/Oa2sZlCsjw7MlX1sFonGHN8tF14Eq4PlYZbWZmakPih0DPe3ezf3p6U0tHgsLKQwoC+eoKIqwjsTGsjyHD6fAFh4OfPQRxUnlH1UJggUFtPwFKH4pP5TKeu7IEZ5TX69HiW9oYJ2EhzcVyUJDee+wMIoxf/6p3zMkhPcwGun/8MorKYC4WpO5E75UMC6rlfvj4/VydbQGVun2Nnng6Le1uFgPuNPQoFtCKusx5Ve2oEB3B6IEjdNOYx4WL/YcEOmmm3i+EmOUBaPJREG6UyfdClP5EFUWlq0NvucueJdjMLSICJZVbS2Fe1UeS5dSCMvI0MVCJVjHxOiWwc3REl/WnoSrAQPo81htV8vqu3enGKh8xrq2h7y8poKZJ1cLBgPzn5pKC1Jf+g93ArOrYH3wII9JSqJopgRbVY47dtAVQkaGc90FB/N6FRVN/ckWF3P/lClN0+lucqmwkBbVqm0rdxKHD7PNBwezHWoaRVyVNsdJsG7d3JeJJ3/Dqv/evZvXVKsECgt53cZG3le5GKiq0i09VeAytWTfYGAdOYrXMTE8Z/Nm5smxzo5mUMqUFFoZ79nDdhgVpfu6Nhr1IH2dOzMdmZnNTyJ6WsHRnPCclcXJtPx8Hp+UpOezUye2s9xcbv/nP3UBde1a5/pS/bfqA2w2lv2oUcxPeTnzGhzMvlIdo6zAHdsMcPRdFPmIiLaCIAiCIAiCIJyYbN8OPPkkxZz6et2npVpqr5aQK1+mVqs+IPdkKfftt7RCLSuj6BYSQvFo2zYOIseM0ZfQug7Oq6t5TTUAb86Sz9WXY1v4N/RkuahwHah6snJcu1YXT2w2/p+b6xzIKiFBD2YEuLd4vOEGCmzuhOu4OC5hVwP9Cy/kdsdjKyvpX9RkouhSXk6RwWLhMQUFFCTCwiiOqXqpq+OxjkKSstgdOZL1snkzxQabTQ9Y16kTr5ueznNVsDVvgcJU/ebn8/6dO1M0NZudj1cBdFQwLE+TB46CVpcuFF6io/W6VS4cVHAzo5HXPnKEonFtLY8fM4aCbEYGJx2asyh19Yu5Zg3b+u7dzscDFG/aIvieOzFNBUNTfkMjIngvtWy9spLbs7P5qQLQtdSC3Vdf1oBn4ernn4EPP9SFvNBQWooWFvI8JTg69hnK/URODl2HuKa5NZbAjun1Zhmp6nznTi5fdwzM5khzdXfaac7uG0wm3mvcOPfWwI6TSwDb7vr1ugW8CnpWUqK74QgKYt1rGtuB8h+bk8Nnu29fXtfTcn1Pk2iBgcxzUBDrIz+f/YdyP6JWbSiXLDk5nBjq2ZP3KylhGzUanVcjqDouLqb4azTqlryKo2XxaTQCF10E/PEHBVPlQ7yqiuk1mdi3dOnCezc3iejLCg5X4dlmo1uE+fOB335j+wsMZL3Fxuq/O0FB+moHo9G9+5KQEP4Gq9+tqCi9L1y3jj7k8/PZ/6mgklVV+kReUpKzL2/g6Loo8gMRbQVBEARBEARBOPHYvp3Ruf/4g4O3ykpdIFGBetRAGeAgLjqa4t633+qClKOQMWUKBZmyMt1vKaBbFO7YQf+ayjpILd22WHRBLibGeQCenk5ft8oytXdvbnfny7Et/Bu6s1x0xHWg6s3KMS6Og2xlLWYy6aLKDTcw6JvrfVwtHk8+mfnyRXhyJ1KpoFijRrHu1qzR/UgqK9PsbAqUEydSOAsNZZpco5Ibjdw+bRp9EPfty/ocPFj3lenoBsJiaV5McSd8paRQYFCBnZRQYLWyDIuLKRx7EhYdBS1lXatcNhiNTKOmsQzMZh6jBPTERLroGDnS2erQF4tSV7+YZ57p+Xh3YmJLgu+5E9OUj2OrlWIN4DxJkpjI7zYb2+OOHbSGzs09ehbsgGfhSll+l5XpPnANBvY30dHsmywW5sVxEqGiQl/W7ynNLbEEVvhqGdmtmx5MznESxpHm6q6wkG1GuRAoLmY6b7rJfVrVBERNDa3oDx3Sl+8rv6OdOrH8lKV1fj6/22zsB/74gxMkZjPL/8MPueKid2+6nHD1R+xJBB8zhmnfvBlYuJBpV4EQVZlVV1PIDQvjOWFhFCJLS7ldtVdloaywWtkWlPBbV+e9bH3xF+sLyk3HZZcxLxs3UhgPCOB1o6L059RdX+yaDpuN7UkFEHMM7uhOeFY+5r/7Tm/nKnCkcl+gXJ4o/8TKf7dC1ddnn/GvqIhtIi6OfyrIY3Ex0zR6NPOZleVcH1FR/P1w9OV9NF0U+YmItoIgCIIgCIIgnFhkZgJPPMFBuxoUWyy6T1WbjccZjbqbhMBAiiNdunAg2bNnU5+ba9bw2vHxTQfKgYEcBBcX60GsNI3HhYRwMBsQwIFsQQEHn96WUS9e7NsyU38H8Z6WAQPuB6rNWTkmJ9OFQXk5y1e5n1Dl58t9jEbfhSdXkSo3F3j7bR5vMlGI3bBBH5gDuiiifLgqIdnR8ldFTy8tZVtRFs7KnYJjECWFr8tnldiZkkLRYNMm5qGsTBfpAgP1oE4pKd6FRUdraZtNF2stFu6zWChsKR+qarlzairze8opnHTwlE5f8Xa8OzGxpcH3XMW04mLmLy6O+di61dmCUfkTjYmhELVvH8WcIUN8t0BtCZ5cjyiRMi6On6Wl3F9bq7u1qK6msLx3L58vTWPf1acPMGuW9zT7W2+A/5aR/k72KFzrTvVzI0d6r4vwcD6Tv/6qBxgLDNRFPWVVPWyYboWrgjw2NvKYkhKWd+/eunVzdjaDfb33HttOfLzzZJg3EXziRAq9jzzCdMTGMl2hobxPbCwDExYWMq1hYWxz+/fr/YlyIRISwrIoLGQ+ampY546CrmvZ5ucD33zT+ok8198di4UWzz176r6Vw8P5TEVGNu2L3f1uKaHc8XdWlUd8vHNfmZnJQISrVvF6PXrork0qKti+6ut13/Dl5bpA7659XX45+9WTTtJdn5SV8T4NDbqbkf79GbCstFS3wr/mGorrhYVM+7FwUeQnItoKgiAIgiAIgnDioMSIggI9mEpYGP8vL+cgUwkUavlsUBAHjqecwoFeTQ0HqkqcUELG0qW8Rmqq8z2VRafJxOsDvKbZTAGhooIDxfR0CkpqAK6sgxyF2Y0bga++0gUJb2LKrl3+B33xtgzY3UBVHbt9uz4YLi+noKSCUBmNTK8KRLVnDy2Hzz/f+33OO69lVmOOIpXym+koJjU0cLvyGav8Z376KQf+OTm6UKUsfwsKuIw2MJAicHCwHjzNX6HKW7odLQ/79WP+8/JYBiEhwNln6y4LHHEU58vKdEtuFYjp8GEKFiUlus9cgO1bTRaopebHarmvq5jYmuB7jmJaWRmtuPfvZ5tS1tbqOo6TCSUlbI833QSMH99yAcaXyRFPrkfq6pjGTp1Y16tX6z5tGxr0JelGI7/X13N/QgJw++1sJ22NP76tU1KY/06deI6jP2LAv7rz9VlPTtbd2HTvrluhK7/SR46wX4+I4ORcVRXTWFWlB9bLymL/mpVF8bCujv2YWmlRV8dnxnUyzJMIbjTy+fz2W163slKf2ElNZdsODGR/l5RENyAGA/uS8nKmraqK4qXJxG1GI88vK2NeXPsZVbbJyey/iov5v7JYXrWK5ar8pDeHJ+vqbduAX36hlbrF4vxb4irYugsOt3Ilt4WG6u04P58uQEaPZltWbg4+/pjnGI0sfyXyAmz39fWs44YGlk1EBOu6b1/37UutaOnWTZ9cc+0XKyr0+0RF0Wp73Dj68x4ypHUuRo4yItoKgiAIgiAIgnDioMSITp04+AsK0v2RqgFxdbU+EE1NpQiRlsZBcF6evsTVESVkbNtGwUAtpayq4mC1qkoPgmOz6VGp1bmAPgA/+WRaJbmzcuvSheJhgJuhmqOYsmKFe9HXl2jjvvjCVCJVQwPL55NPKCjX1OhuHk4+WS8HFQTm0CHm/c03ed6kSXrwJcf79O9PcTozUxes+vQBZszwT6RytBzOyNBdN3TurKerc2emRQXaiolxFpJzcih+aJrulqCqiqJgXh6FBEcB3bEu/V0+61r2SmCKigLOOAM466ymglFmJut640amSwUMKihguvr0YdtTIq4KvKYsvrt3ZzoLC9t3ua+/EwbuzldlYzZTPDpwgG1VCTLl5SwfNZkQGEjBSH1vCc35fVV4ska1WCgm5eXpgeYSE/Vl+2p5+OHDrL+wMLbZ0FA+d5rmPthda/DVt/WWLXQJsHMn29u+fewXVDtqSd35wsGDFDujo1lmanJGCZ3Bwewjc3OZrspKlrEKYqX8mUZG6oG+goKcfVqXlLBs/Qn2lZJCa/6NG9lXq6X7ys/vunX8VAEYAd5v2DBd0C0oYFqiovg7pXy5ahp/F/r2dX4uYmL0CbG4OPanqh2ZTKyP4GBg7lzvaXe0rs7IYFmq366iIoqsAQH0n1xd3fS3xJ11tuoHAwK4v7ycbSEoiBOW5eXATz/RCnbsWKZD9XsHDujBGevrWYYVFcyXWiWRkMBju3f33L7cPXcGg94v5uUxfcp9j2t7bY2LkWOAiLaCIAiCIAiCIJw4KDEiKooD4fp6PXJ3YCC319frFlAjR3KgD/C8igr63nQXbKdXL1ojFRVxIF1Tw4Ge1aoPWkNCdD+iJSW6f8PgYIoySUkceC9ZQsHY1cpNiQDl5RxgOgalATiYP3iQy2R9WdoMuB+MehuoOopUSqgJDKRIGxNDwSIvj5a+nTrxHmvWcKDf0MABdmqqPuifOZNLWNV9qqqAl1/mdZW1Wm0txYiVKxkhfPJk3+rbUQhcv54CQESEHmgsOJgCmPJzW1TEJbFr1zJ/Bw8Cf/7J40aNonWuKst+/XQr6e3bncXx1iyfdSz7LVsoGOflAcuWsX05CoKZmcCcObQmVG49ALZhTeP/fftSlN62TbfCDQ5mW+vXj+1N+XNtqXVzW9EWwbMcr/PZZ3yuDh1iW1QBhfwJPObNitZXv6+AZ9cjVqu+NF4FhcvPZ30EB+vBkBITKW7FxnLbzp1sG1u30lI0I6P1Pq0Vvrg7qKsDFi3iZ9euzF9oKNvsL7+wDcfHu5/saW37Um4+zjiDltJFRSwj5eokIYFlVFDAZ1vTdMEWYD+k/LbW17ONKKHUYNB9Biux39dgX479zaFD+sRDeTnrNyysaQBGgO1x/Hj+LuzdyzoOCeH1UlJYlnv38tiiIufnYsgQunMICWG/VV3N3yf1+1ZURHc6kybRetQTakIzJIRuJ4qKeH5JCcsqMZH9cWUly8n1t8SddbZy8dLQwPqyWpnHkBCKpCEh7D8LCtj3VFXpVuQmE7cry1pVL6WlrGslSo8e7b3de3ru4uIYAG/lSpZVfj7bg7u+piUuRo4RItoKgiAIgiAIgnDioMSIxkaKOKWlHOQqazclkCg3BY5LlLOzOXhMSWkqpgIcjPbtywH7zp16MBOA91PCQefOtNJsaOA91ADUauUg97PPeP6RI7yeYwAUi0X3C+guKI0K2JKTw0Gmt6XNK1bo4qQ7C0F3A1VHkSo5mfcBOKg/cIAD+6FDKdLm5XGgbDYzX2oZft++/IyI4KD/66+Bv/1NT8uyZdxeUsL6iImhSGC1Uvh49FFaPvtqcasEvNdeo7jqalm9davu4xUALr4YePBB5+BgqalNhXqDgXnZt4/pyc9n+hobKVxMmaIL4/5iNLL9LFniWRCcORN46y1a7ylrPiXUlJVRdKqs5Pl1dRTLhw9n+z1wgPWjLArb0rq5tbSVZVtGBvCPf9CK8c03WRa9e1Mwc2dR5w5vVrTp6f75fXVnSVxTQ5+ZKtBdUBD7oYoK3eK/qor1mpWlW4dWVvKZi47Wfbr6YkXvK835ts7J0S1A+/VjGWzZws/AQOarvBy4914Kha6TPa0Nnqj68ZAQYMQI3e+0mjA5fJjlV1/PvqO21vn5NZmYj+pqfm9sZNmq1Q9qok35kPXVPzXgfeJBCazuxHDlVqZrV7pOUH29Y2DDoiIGCoyM1J+L7dtZ3kVFzI8KbKd84CYmsu188w2DA3rzha1E7poa3qOxkd/VZ2io/rvjKma7s85WQdZqaymIappuQa4E8ZAQ1lFwMIXumhq274AA9kOOArfJxPypc9LSGKjT1Qe36+SAJ1c8hYVsPxdf3DTw3HGCiLaCIAiCIAiCIJw4KDFCLV9VFlcqurfVSuuwxEQO4KxW+l8NCqLg1bs3B+Ga5n45/NlnczD+2GMcfBoMHGgGB+v+a0tKeE5NDQfV9fW6MNO9OwekOTm8XkUFRVAl3Cqx8+BBDn4dUWno2pWDX29LmzMzKWRpmu/uE1yXv5aVMS8xMUyLcoEwYgTTvHkzB87Koi0iggJWbCyvpwb9y5YxuJsSRUpLuV8F62lo4DmhoayzvDzg3XeBp57yfXCdkQHcfTfLJzSU996xQ7dKCwjg8uIjR4D58xl0R7lTqKzU24kKqKbElNBQ/n/llcz/N9/oVnbvvUchuiWilC+BoBYs4NJik4ntQx1jsfC7alc33sgJCkdBwlXUaEvrZsc8tFR4bSvLNqORomGXLrqIduiQb9a7zVnRXnSR735fVV4cBb3MTD4j5eV87vPydLHeYOC9VD+jAiIGBLCO6uvpZzskhO3WbPZvGb8v5ebNVYXqt1JSWD7Kkl4FpwoK4vP83nu6r2RfLZKB5tuOq6jsuOKgWzda1ffqBdxxB/D667QItlp16+HCQrZvJTwr37Fq5UV5OSfYlNDrr39qTxMPAPsEd2K440oOd21KCceRkZxgUajgampVR3GxHmBQBbkMC2M5e7MUDg3lxFNVFfNuMLAvAHh+ZSXbY2Ag++i6OvY9yiWOO+ts1U6U2G2z6UE5IyN1AVfTGHyspIQrNH75RfcrrOpNCcYBAfw9OPVUHl9V5ZwPT5MDnlzxdBDftC1FRFtBEARBEARBEI5vPFndVFRwIGi1chCprJQiIyly3XEHRVoVdTwlhQPKF1+kdaOKRK18J6rl5V99ReuzP//koNli4fk5ObRkqq7WBdfgYA6AKyt5T4uF1nNJSbQWq6rSffypQXxYGEXl3FwOzF2X5E+Z4tmaC+C98vN57pAhzVsIKlyXv6oASoGB/K6icJeVUTQcMwb4/nvmOSCA5b1lC9OtlqgfOkSBJTiY5an8/irLZJuN6a2ro/AWHMwy8mWpsivdunGgv3EjB/vKf2V1NQWzkhJee9MmBqY69VTW2a5drEuDQbfCVsJBcjIH/4WFug/hbt388yHsjuYCQXXpwiXMhw7p/nldj4mOZr6qq+nawRFHUdRmowC+bx8FHyW+tca6uS2tKtsCf613fRHNv/mGglVzfl9drTNVWn77DXj6aU4ShYVRgA8O5jHKl2dlJdukpunCogqQV1yst0WLxb9l/L6WmSeL0b59gQ8/ZP+2ZYv+LKlyCg/nM1tQAHz+Obf5apHsS9tpTlROTQVuuYWTL9deSxHw4EE+E4WFuuCo+uHGRt7r0CHmSQVRdPTL6q+/Z9dnTLW9007j/67pVis5oqNZbo5WtoBn4Tglhefl5XF/cDDz5hjkslcv3YK7OZRbFYBty2jktQD29+vXMy1qIksFzuzXr6l1tnKHoFYyBAfzT1n4K1H58GGWQ1yc7q9duSkKCGDdqGete3dg8GDWnWt5NDfRolzxqJUIyheyErmPQ0S0FQRBEARBEATh+KU5q5s1ayhWHTmiR6YuKeEgdNYs+su78UZea/t2brdYOMjcvp3bo6MpUN50EweAO3dSNCgs1EUYJQirpaeNjRwo5ubyu9nMQfWuXRy4qiApZWUUEoqLKY4ePMhBqzerofR0z9ZcmkbLYcA5GI7Cm/DjuvzVYtGt0ywWZz+QANNaXMy8hoRQmFL+I8vKKBivXs0BvbLYU5ZcgC7YJiSw/IqK+L/Fwn2+CBCOKKFn+3b6h4yO5oA+J4d1EBzMvFdXs2xzclivCQksM2UxnJzMvB4+zGXHU6Z4DhzXUutHb4GgCgt5zT//pEVgYyPLU1kjKxzFF29kZ7O+Kyubim9BQf5bN/vj5/VY4o/1bnOieXIyXUwA3v2+erLONBopyCmfykajHs0+NlZ3f6J83FZWsr2aTHo7rK7m89W1K+s6P9/Z8rEt8CR2Z2fr/oKLipzFRUB3NdC1K7BhA7c1564lO5tp97XtuBOVLRZOLgwfrotx/frRUnzOHPq/bWjgvpAQPjuNjbyPcklhsfC57dTJdzca3nD3GxQdzeequFjvv3v3psC6fj3TExjI+/bpw09vwrHZzLS5PvOqvFXQTXdtUQnKmzaxHRsM7GMiIpgG5d5GWcXm5bFPDAjg//X1wKefMj+OQnqXLsy7cj1ks+m/c+q3QqUxKIhC7G+/cVuvXkxDXh7rJzyc5yclMeheQADvM3iwXh6eAqHZbJwQPHCA/fDUqfTx21EmlFqJiLaCIAiCIAiCIByf+GJ1M306sHQp8M47HLiqQDEAxdtPP6Xv17Q0iij79nHAecopFCrKynh9Fc1aiW0pKRQG9u3jdk3jn7JOUqKGspQLDOS2nBz+KeEgO5v+b/fsYbocl3NOnOjZctCbFZqnYDgKTxaCrstfIyN1oSkuztkPpM1GsSYkhGWXl8fz1dL9wkIKtkrwMRopmAQH6/59jUb+r9wRKJEqPp6ih69LlR3JyAAuuYSibH0981lXx+vFxenLzZWFlwoOpYLg1Ndzf2KiXqfl5bp45qsI3tzyb0+BoAoLKRCXlfEY1aaUWN6lC+tP0zgRER1NMcgbymVHRUVT8Q3QfWv6YsHpi4VqWyzfP9p4E80BbjeZKLjm5LifHGnOOtO1jvv04XOycyfbv/K3qtqisp40GPhZU8NrVFfTStfV8tFxCX1rcCd2K/cEP/3EZ0JNtKi8K/cCiYksB01zX5aapguBP/5IK/gDB2jlrtqHt7bjLmjf4cO0Av7sM12MmzyZz+8997C8bDZ9cslioSje2MgyDghg0L6CgqaB1PzF029QTg6FxKuvZl+cn8/fGrXSo76eacnN5TOflMTJOnfCcXY2j+/Zk8dbrbpldlgYr1lSwmu4tkVHQbm4mOlSLniU+K/E7epqXjcmhp/FxTz2tNOYxi+/BB54QBfS16/n719oKOsoL4/PVEMDyzg0VJ+8HDyYbebQIbYlk0n/DVVB4mw27l+6VA+MNmOGXh5qoiU5mf1jXh63qbq12fhb+vvvvG5HmlBqBSLaCoIgCIIgCIJw/OGLePSf/1DU+uwzDuYAPUhZQIAexb28nINftUy5tpaC5ODBFCTT0nRB4dJLeQ3lfqG+noNKi4XnqQF1WBgHl4GBHIgGBHDwmJtL4UEJuqGhFN3uuYcChKO4581ysKXBcADvy3Bdl78qi+DCQuY1OZnHrl/PvJ5+OvNaXq5bb5nNLI+cHD04mxpUBwTweOV6QYmSyoIwJob7+/b1b6myIwMHAoMG6f4SQ0N1C7PaWg7yzWYO7Pfv1wWE8nLW6ZEjuoVkly7Ml83m3Vekowjuy/Jvd2WtaTynuprllJTE/3ft4jm1tUyLycQ6aWykpXBz1qXh4WxLtbXOvkEVVqvv1s2+WKi21fL9luKLr11PormiqoptYMoU9h/uJkeas850rWNALzODQff/aTZTHIuJ0YXc6mrdF2t5ue6mxdXy8WgJUI5W67t26S5grFamJySEeauu1sVadxMQO3fyGSspAf74g8dHR/PZVC5UVHl4aju+Bu2z2XQXK3v2sFxDQijO2my8VmMjfQU3NrKfufpq78G7vOHLb9C6dcD999PVRnExg+YVFbFcior0ZzkpiXlwV59qwmbYMF6vrIx5DAriPcvL2TaGD3fOh6ugnJJCS98DBygkDxyo++wuLKR1qsWi+19PStLryHFSRwnpS5cCzz3H/5Vbis2b9RUVQUHsc+LjWQ+rVzuLtiEhbPMRETyurk7/bVYuRRYvZn1lZOiB1JRPcRVALSKCx6uVLJWVfG5VWzzeJpRcENH2/7H35uFtVefa9y15nh3PdhJngAxOYjJCEoaWIRDKPBQKpWU4PUB7mpbCORwIJRRCW4ZTKFB4m9K3A7wlbQ8lh6Hw0UJS4ABJyEhC7DiBxPEQ2/EQy7M8yN8fd1f2lizJkrylvSU/v+vy5VjD1tprr72Uda/7eR5BEARBEARBEKIPT9eNvniUqlj95psU3rq6uFBMSOBrVSoCp1NzPNXW8rGBAQoTx47xdXPmcMGoBAWAIuuf/sSF6ckncwGp2qDCV1WIc2oqF8rt7ZoLaXiYi9yBAZ7HxIlcVAcicnkKUv/5n1pBs0CK4fhzCHrLIzlhAsOPd+zQKpy3tTG81eXiMeLiWJhMCRGdnTxWZqaWv1CfO1GJVMePa1XdVSX0vDzfjrNAKS3lNXvvPX5uRobWB4ODFIASErjo7+7mc3l5FCfy83ndFy/WxJ3WVrYlEBE80NQB3vpa5TkdHGT/KAGnq4vjcWiIfR8fz8877TSm7ADoeFNpMWbO5FhS/afEwz17tKI/+vHQ0cHrHIi7ORCHqjcXt56xFDAbjUBz7XoTzRX6e+Tcc92LnAVT4Eh/jffto6NwaIibQGoOSklhqpWWFs4VS5dSmP34Y20+yc3VHOCezsexClD+rkVZGXDffdxQqqpie/RiXl4ex+7ixXz97t1aXyrH+PHjWiG1zEx+TlcX0444HO5FGH2NndHE0S1bgLvuYv/t368Veps8mffL4KBW8LCri4+ddx7HyrZtvMahEOgGxpYt7q/Lz2ffqe8M9T3k655SGwwpKe7zbHc354KcHB5v/vzR+0xtZqn8uGefTSG9uZnjbNky9qtnvl3Pa2O3cwwUFWk5zwsKWKhTf17Hj/M9H32k5XpPTNSKoHV3s63Z2bxGPT0sdKmK2+mF1qYmznMqkkXl0O3r472lIjri47U0RPpNEitsKIWAiLaCIAiCIAiCIEQfeteNWpir4lEzZ3LR5nBo4iLAhZsKzVfiakICH1Oup+Rk/sTHc9FZW8vjzJ7N1xw4QNHkxRd5jP5+zUHqcmkFT3p76WiaMoViwtGjXJgDFDH6+rh4LSzkgvX11zUxzxf+BCnPUGl/6RP8OQR95ZH8ylfYl6WlWjj+gw9qQmZeHjBvHvtIpRpwOrX0D9OmsR+6utjPKSmao6uggNezqAi48MKx5x705xI8dkwbK3Y7+1AJl/39XOinp2uF4bq7KYoUFVFo8ifwTZoEPP544KkDPPu6qYmixfTpfL0Ss778ZV77+nqOxSlTKDpdeSWfv+su4P33eR8AbO+Xvwzcfrs2pm6+GfjgA7Z14kT2iXJNpqQE7m5WKTCOHtUc1YEUU1KEs4BZMLl2Ryt0pb9Hgi1ypkdd49/+lqkBVNGlKVM47g8eZHuV27Gri3PIggXMaQxoQr0v52OoAlQg12LuXODnPwceeYT3zuTJvBd6ethveXnAVVfxtXV1Wq7TigpuVB0/rrntU1L498AAz7Gnx70Io6+x408cbWnRcmifdx436SoqtI24oSEt73h/vyYcd3SMXcQLdAOjqWnk62w2zfU+OMjvFV8bHZ4bDGeeqQmjiYn8DH3uV399lp9P4Xf3bvbb7t0UaxcsYD8VFgYeneFt40Od1/Awr8OiRSwS19bG74ChIY7x1FT3VDW5uTz/yZPd26yuUXU1xe/ERM2Vq4rzJSTw+1ZtxuXnawUz9ZEFnsJzODePDMTSou3Q0BAefPBB/OEPf0BjYyNKSkpw88034/7774ftnxdxeHgYP/rRj/DrX/8a7e3tOOOMM/DLX/4SM2bMOHGctrY2fO9738Mbb7wBu92Oq6++Gk8//TTSfeV4EgRBEARBEATB2ijXzfAwF/3KJVtdzTBc5aDcv5+LssFBPq+cnoODPI6q1q7C91UYshJkExIoOh46xEXmr37FRWVBAV+nD2ePj9fyTrpcFAaOHNGK4djtWsEWlZJh1iwulEcTD4It/uQvfcJoDkElUlVXA+++S9ff55/z75QULtQvv1xbsOfnUxxtadFSHbhcdF197Wss+Hb4MBfGvb1cTKtiQaefrjnhbruNzq+6OuacHMtC2ptLUF2jtDQtn65y4XZ18TUNDRTAs7LcBdlLLgEee4z5EvXClV7gq6sLPnWAXhDcvx94/nkKellZ2nuVM6+2lsLePfew36qqWHxp2zb2eVERX9/Wxk2AxkbgRz/iZ6hiTWvXsp3KrZubyz4I1N3c3c17r6qK/ajSXZSWchx7E5AUnmM4NZX9/d57FNjvu4/tDIVQcu0Gc48EU+TMk7Iy4Bvf0ATN1FRN6M7J4WcfO0aR89gxXts5c4A//IHXdHBwdOdjsAQzn8ydC/zwh1o/HTzovZ/0uU6rqiiu9fRoOXhTUrTCht3dFNSUuJaV5TsCwJc4qtKJKJdqUhKvUVUV7wflYE1O1tJNFBZyDnI6OfbH0oeBpNhITuZnBvI6Xxsd3jYY0tM5FurqOD943rv6Phsedo9GycvjPLt7N/Av/8L7VW04BROdEcjGx/LlHA85ORRoVSoE1edqc6+1leNh4kTeA2q8q3F+4AB/Fi/m8Roa+Pnqu1Z9v6alaZuzKqext34O5+aRwVhatH3sscfwy1/+Ei+88ALmzp2L7du345ZbbkFWVha+//3vAwAef/xxPPPMM3jhhRcwbdo0rFmzBitXrkRFRQWS/xn2ccMNN6ChoQHvvPMOBgYGcMstt+C2227D+vXrzTw9QRAEQRAEQRBCYXCQ+Q2Vg1blflSh711dXKwXF3Ph2NHBx1UIvqrCrRZ3NhsX+TYbXxcfz0WgSl+g3LRxcRQfWlu5sJw3j2HlmZlcFKuCVn19bJcKrVchoYmJXDAWFvJYnZ083rRp/sWDUIs/jcUhWFVFgfqtt9gnqrhZbq4msn3tawy5/9vfeMycHK1A1tAQF9YzZlDsfOYZzTlos7Ht06dzoV5WRtEBoHBg1ELa0yWYna1VO29s5Guysjh+enp4nnFxXPjv2cP+Li3lcd54g33Y0MDzSEtj+5ct04SrvXtDSx2gBMHSUrox9VXeleDS18c2n3EGRT2AuVY/+0wr/qbGRUkJz3fvXjo8v/ENnue0aRRR3n1Xc6erkPzbbhu9jysrgV/8gm1RxZ3URsm+fTy/yZPdiwcpPMdwSwsLS7W08BhVVXQMP/lkcMKtcsvt308xZ8qU4HLtjuUeCYasLN4fQ0MUk5RQ6UuQr6nh9U1I4D3nyWhCnz9CFbhH6yf1mt/8hhsJ6j5IT+dndnfz77g4LVXM4CDnyPp63xEAvsRRVSRSFbFKSqLIXVDA+1nN4T09vPfz8rRCZCp3a6h9CPjOS63u15oa3q/LltHlHmy6Gj3BbsKpPqup4fHVhpqKRpk0ieNq8WLtfgglOsNXuxYs4LyiNuiWL+e82dKiCcmAJtqqHO+ffurezokTtXQufX0cX21t3AR0Onk97XYtYqa/n/NkVhavsbd+7u4Gnn028A1Qk7G0aPvxxx/j8ssvx8UXXwwAmDp1Kv74xz/ik08+AUCX7VNPPYX7778fl19+OQDgxRdfRGFhIV599VVcd911qKysxNtvv41t27ZhyZIlAIBf/OIXuOiii/Czn/0MJSUl5pycIAiCIAiCIAjBU1lJIWrDBq1wUkcHF+sdHVzYxcVpglRKChelFRV8bmBAy7M6PMxjKHFheFgTU5VLC9Cqu+fm0g2nQur37OFiUYm6aWlaTlyVAqC9nQtTQBMV1OfZbFw4qvyCvsSD0fL3+gvzDcUhWFkJPP00C6YBfH9nJ/twaIgCSFUVRabCQp6n3U4RLz6e4sOsWe4Vxy+8kOGtTU0UqkpKKJIq8aeqKjgncaDoXYKbN/N6ZGezfYAWVpudzWt5/Dir3KsiUfX1FD+Li3ms8nIKt7W1FKMuu0xrV6DOu0AddampvKaNjez/lBSOnzfe4FjcsUNzh+uFIJWe4uhR4M9/5rHi49nuCROACy7g/aFEr97e0fvR5aKI/+GHWlGzlhZNLBseZn9lZbkXD1Low7VbWpjvVBVUUkUA9++nwP7DH/q/1kqo/fRTtqexkSL1/v28fvrUEgp/ztSxuGgDxdOhnJBAUUrlhu3spFh7+ulsT6A5d30Jff5Cv0MtJhdoPx04oG3i6NPHxMVRQFVFqHp7Ndftqaf6jgDw1Rdqjh4e5nyi3OmTJnGsFxYyQiI9XTvX5mbey5mZPMfRxFJ/jHa/pqYylczBg6Gnq9ETzAZDaSn7/403tO8KFY3S0MCNlssucz/3UKMzPNvV1MT7+8UXKchXVnLenT+f86dK6wDw+c2bNUFfzcMqv/fhw4zqmDmTbVF5cFWO4qQkjieA70lK0voG4Gv0/XzZZcBrr43csMjI4BiqrAR+9zvgpz/V/p9gMtZohQ9OP/10PP/88zhw4ABmzpyJTz/9FB9++CGefPJJAMDhw4fR2NiIFStWnHhPVlYWli5dis2bN+O6667D5s2bkZ2dfUKwBYAVK1bAbrdj69atuFLlAdLhdDrh1FmpOzo6wniWgiAIgiAIgiAEhArp/eILrcJ0VxcXdzU1FBSTkihMKeF1eJgL5NJSLuBtNs2hk57O38o1qNw/3d2aGKDy3KrjqtyT6elciHZ28rUpKZqzKz2di1KVosHl4gI6Pp4LeUVCAhePFRXAWWdxMe8Nf/l7Z89mu8YS5qtHufBqaigG5OZSoDt2jP0xPMzzzMmhu/Lzz5ljUVWE14vJnnk3zzzT/2cG6yQOFCUqfPwxXb8FBVpfKxG8u5viwfHj/Nz8fF6fQ4coQgwNsehcZiYFoEmT2C59LuJAhLYFC3i+vtI/KOHE0+VcUsKxtXEj89eWlvJ4SlzW093N6+V0crwVFzMUuraWotlJJ7EPcnPpvg2kfzdtYntUYayODm3zQo3FhAS2/+jRkcdT4dqpqbwONTV8vL1dKygUH892+2uLCmveupUu48FBXoupU3mfq6J8+gJXqk/G4qocC5WVdPbZbLw3VPHD+npNRPRMTxFMzl1vn+cr9HvWLD6u3Igq4kDPWFIvKNFy0iTOVfo81mozoauL4yQpia+7/XaK1b5EMl99oe7brCyenzqP2bN5X6ucpioNB8DrP3Ei+yhQsdQfvu5Xlf+7vp7fWd//fujpaoCRIvzcuYG1W83Z6rvN829v5xOK81wJ+pWVdIirzbfSUt7jR45wLC5bRjFdtaW+nhtRDQ2aU1k9p3LkAtrc+uGHPLaKJhgY4Gc7nexPlad8zhwKwkePav182WWc3zdv5vynaG7Wirv19vI7bXiYqSMs4Li1tGh77733oqOjA7Nnz0ZcXByGhobwk5/8BDfccAMAoPGfIS2F6qL/k8LCwhPPNTY2okB/QQDEx8cjJyfnxGs8eeSRR/DQQw8ZfTqCIAiCIAiCIISKXtgrK9OEtOxsCmmHD3ORWVioFUhKTuaCLDOTouKxYzzWhAk8xvTpXPRVVjK0Wi38JkygGOB0aikUsrO1wieZmXx+8mQKAwcPavlqVRGrlBQuVOPi+PrTTqPYrNozOMgFa0eHFh7++OPeUwH4yt+rCvDMmeNfkAqm4Ipy4eXlsf3x8RRhBgYofgwNcWFbUKCFGNfWUvwLVfwJ1fkXDHY7haHlyymqqmOrojkffMDxkZpKUVO5SePjOZ4aGzlGli3je7y1azShLS6O1//BB7UUA0VFFLPnz9euy6xZFBxPPpmPqaJPTicFPoeD46anhz/p6RyzAM+lpUULOY6LY8qFw4fZ5tpaprNYuZLXMJD+dbkoTvf08DoPDHAMpKZq7sneXh6rv9/78ZQLubKS98vwsPb+oSGej82m5Zv01ha1adPczHNMTGQ/HT/O/szM5HG6u90LXAUagh4O9PPWsmX8rQSiuDhey+JiYNWqkfd9KM5Hf7lq9+zheKup4XxTW0vxSxU3U4xF4FabZaecwhQJquijw8HxqPKPKjEtJQX4v/+XYpy/NCje+iIxkekw1CaWEvry8znffvCBVuhQzf1KGwpULA0Ez/s1OVnbuFIFuVTEwb33Bi+IhpJ/taaGovlZZ2npETo72U8lJRSuW1uNi84AfG++LVjAMdHYyM2js8/W8oGrHLsnnzyyncXFnEtaW/nclVfy/W1tPIeSEn43dnRoYq8S/nt6ODbU3NrdTYft5s08RnY23caqGGBPD69ZRgbHyqefamK7ycKtpUXb//7v/8ZLL72E9evXY+7cudi9ezd+8IMfoKSkBDfddFPYPnf16tW46667Tvzd0dGByZMnh+3zBEEQBEEQBEEYBb2wl5HBhV5DAxfLvb1cuPf0cDGvxM25c7kAUw6alBQ+XljIRaISNHJyuIhtb6cAlpLCRebQkHdXUmIiF45ZWcC//itFOOU+TU+nqNXSws/KyeFri4r49/79FEuamrRiOCtX8n3eUgG4XFrVbJeLv5WLNT+f57dzJ/D1r/su/hTMgl85IgsLuQDu6mK/KsFaFfhRoqPdzsW4Z6VuIHDxJ9Aq7GN1EvsSVY8e1UK6S0o0EUXlSFS/KyooECihy5vD2ZfQpkK26+s5hnt7KaJ98AFTfcybR3folVdy/FVV8TMyMiho9fS4563t6eH1rqhg+7OyNMdZT482Zp1Ozc2alsbzaGnhMc86i8ccrX9VXky12aCK7Sn3pHKqp6Tw396OV1rKEOff/573R3a21s8qL6XdznvFbh/ZFr0gNHEihRa1kaLc7wkJFIIdDvZJaysfCyYE3Wiqqyn2p6WxXXl5FJKUw1uF+Psa+8E4H/051vPzKdanpAArVlDorq9nPzkcmjPZm8AdzKaPEudTUug2/eQTjjk1LtV1TkmhiF1aGngaFH1fqNQYHR10/L/6Ku+x8nIeu7mZ/fzVr3IuU/3b3W183mIlgs+ePTItirdNEV8bI976ONgClAo1p86axc/zTKszNMQ5z4joDH0/eNt8y8/n+Nq9m3Pg7t383lu0iOP0pZd4vqO1s7ycubcPHuTfdjvn4Nxczj82m5Y2obCQ955yeb/5JvuwoIDviY/n2N+/X5ufVT76lBTfEQMmYGnR9u6778a9996L6667DgBQXl6OI0eO4JFHHsFNN92Eon9Wx2xqakJxcfGJ9zU1NWHBggUAgKKiIhxTuyr/ZHBwEG1tbSfe70lSUhKS9EmLBUEQBEEQBEEwF72wZ7NpIbB1dVpBJLvdXQA5eJCOq3nzuPhdsAD45jeZ52//fr53aIiLw8mTubCsq+NibWiIx1Bi18CA5sRVYktZGcXSnTtZ3GloiKKTcgnNmkV3bWKiJtaddBLbovL6pafzNbNnu6cCmDGDbdm/n8dfvJjihHLqJiZqguLQEM/Tc2EZyoJfiS4q5P3wYU2gA/hZNhvFkoICfmZdnVZ8TRGMu3GsuWCDwZuoqlyjyiGn6O/XzkvlNU5IoPDQ3k4n18AAx6HL5btoU1oa8Mc/sj9UEa5t27RiVD09vK47d/K6XHihNtZV3ll93trERB53yhQKkw0N/KzCQvZVd7eW1iM5mdexu1vLPzs05O5GHa1/Ozt5vMJCbjZkZPBch4bYJ3Y7+yozk+1UqRP0x7PbKdL95jccGwMDPA9VmEu5ZhsbKap4tkUvCKlNGpUWQrnfe3vpqqutpTP94EG22UhXZTBUVgK//CVzD3vmsVXO1sHB0cWzQJ2PvkQzl4tCWV8f+9vhYF90dnLsORycd+bPH1kQLNhNHxXG/v77WhHGk07SijzW1HDMLFnCe66zk2Mm0DQodjuP8/bbvC9OPpki/p49vL8aGznf6wsEhpuxbjr56uPLL/eefzWQtDGec2qoG2rB4K8f8vPpsN29m2kHFi/mWFEF9wJt57nnUoj/6CO+PymJqWb6+zluW1o0hy7A78xf/EJLKQFQzG1o4GNHj2p9NzzMuau4WNtUGmuEhwFYWrTt6emB3WPwxcXFwfXPKrHTpk1DUVERNm7ceEKk7ejowNatW/Gd73wHALB8+XK0t7djx44dWLx4MQBg06ZNcLlcWLp0aeRORhAEQRAEQRCE0PFchKoQ2L/9jQtFlZ4gJUVz1DocdGQVF1M4uOUWLuLnzmWOzjfe4ILs88/509kJLFzIRf+WLRQA+vspMLlcWqhvfT2FgptuogBx++1atfDcXIoQ8fF83fTpwMUXU1TYupWCqcNBYWriRHcRUKU52LiRgsexYxTJ9u9nWPrEiZqr1W7nZ0yaxIWrR8q4kPPE6vOyzprFNrS2aoJlZ6cmFMfH83P6+ni8lJTQCuyMtehSsHiKqg4H8MQTdMupYjZqAW+38xyVy1iliKiuptg+eTLzWX7wgbuQpRfaqqt5bBW9uWOHe07X4WFuPJx0Eq/XRx9pqSecTneBEuA4jI+ne/vcczle4uI4NgYHKZQVFWnu78RELbdoYiLblpnJz2pvp3Dhr38zMnhtS0u1wn+JiRTPkpL4OyFBK+7m63oVFtJta7NxTKncriqlSHIy+0rlwtSjF4RUYSt1rQBNyE5Lo/g4YQJdebNnG+uqDBS1YXLkCNukhO6jR3lPzZ3LawQYJ555E82am5lDuLKS/TY8zHnv5JO5MXTsGNt06BD7TF8QLFSX55Il3KRobubGQlISx2xHB6+bzcYxm5PjLmQHkgbF27yWmUn3cHs73z9rFnD33ZErJDWWTSd/fbxvH69PUZG2waPmxtHSmkR6TgVG74eeHn4/Ll6stTfYdtrtwFVXaakUMjI4zpKS+Hdqqnt+48xMboadc87InMctLZq7tqNDywGu3m9UhMcYsbRoe+mll+InP/kJSktLMXfuXOzatQtPPvkk/uVf/gUAYLPZ8IMf/AA//vGPMWPGDEybNg1r1qxBSUkJrrjiCgBAWVkZLrzwQtx6661Yt24dBgYGsGrVKlx33XUoKSkx8ewEQRAEQRAEQQgYb4u7xEQurBITKW6mpmr5Zo8c4UKuoQE44wxNsAUooL3yCoWKri4KSN3dXCTX1gJf/jKFh61bGUascnYeP07RYOJEYM0azblTVgbccYfmljp2bGTuyQsvBFav5nMql6lyr6alsb319TyH5maKV2ecQZHr88/pJgLoAFIO3ZkzuQhua/PvTAy2QrxKIdDcTBG7u5sL3KEh/qSm8v2ZmZozsq+P/alyCQfjbhxL0aVQ0YuqLhfw3nt0Zjoc3BBwOnnN09K0nIkpKRQK6+o0ofKUU/h6f0KWXkxTDlB9TtfBQb5GOaobGjg+qquZikEvUOrdYErEWbYMuPVWjlOXixsSn37K8ZSQwNfk5fGclLNRjbPKSorF/vpXf++ddhrvn7o6Xp+uLrbvpJMowlVU+L5eGRkUbouKeKyuLrZFpRRpbGQfX3qpf+dgVpZ7ehSVS1flH66vp/h4wQWBj5lgUgCM9j5AExaXLGG/NzTw+vf18X5tamI/uFzA+ecbI555imbNzRzXtbWa0O1ysT0VFWzzl7/M8XrwIEVu1WehbPoox+j27ZxTh4Y4r6Wn89xTUzl+7XaOeVUIUuXmXrKE/eNPJPM1r9lsnIfmzuU4qqsbuzsy0DERqkA6WjqLv/9dc44mJo50afsTFc2YU0Pph1DaqY+W2LyZYn12NvvJMz+zmjvVdy2gpWvYtYv3Ym+vlqNe/34zixfqsLRo+4tf/AJr1qzBv/3bv+HYsWMoKSnB7bffjgceeODEa/7zP/8T3d3duO2229De3o4zzzwTb7/9NpKTk0+85qWXXsKqVatw3nnnwW634+qrr8YzzzxjxikJgiAIgiAIghAKnou7iRMpfLS0aHnrSkoo6Ki8naoIzQ03uOeI/Z//oXjW2kqhKztbc9t0dDC09/LLubCrrKRomplJZ9qcOXTYKsFWMVruybo6tnfOHIoag4Nsc3c3F96Dg1zk9vRoi919++iI6+vTFp4qnUNHhyaQnX22f2eiN/wt+D1TCMyYwX7r6KCoNm0a29vayracdhrF6OnT2ddZWcG7G0MpumQUdjtw9dXAZ58xbYEqkjQwQLEhMVFzcNfWarmIExI4LpSQtW8f8LvfjewDJaZ1dTEU3jOnq82m5VE+cIDHO+ssXpv6eopbbW18vLNTc4MBmhBy5pna8aZNA378Yx4rKYmfr1zoNpsm2A4OMmWIfkPDV/9cfjnH2+ef0z05ezb7oqqKfaRyN/u7XnpR58wz+d6WFr5PpXNYsYLuYX/vnTNHc8s1N/P8HA5ek/p6ii7eBCl/eUODLfQE+H7faadpwqLdzs2VQ4f42SqfqxLqbTaKllVVYx/j+j5STtnmZgpXcXGcF1VaC+UWz8ig6F9YyPeqPgt200fvGE1P5/hOT+dGV2IiNzc+/1wb6yp6ITWV16u5mRtT06f7F8kilf86mDERqkDqq4+bm5kLeHCQ91ZSEvtMidsq//BoomKk59RQ+8FXOxcs4LkODnKs6r9T1Pftxx8Djz3G73mVl1aPilJQ6Y4U+fmca5xOzvdnnMHjq/ebWbzQA0uLthkZGXjqqafw1FNP+XyNzWbD2rVrsXbtWp+vycnJwfr168PQQkEQBEEQBEEQIoLLxYXrhRcyz99772lFxpSTUIV+JydT1D16lEKjflFbU8MFuSqwpZx6+fkUNQC+Z9cuLhhzciigXXstw679iZH+ck8qsaG0VHMJqhx8AwMUOLq6uMDNzmb7jx2jiJiczEVkXx9f43LxnOrrKchcdtnoOQ09CWTBrxehP/2UKQT6+ijEqLy9ypmUlESHW1ZW6A63YIouGU1ZGfCjHzHVwfvvs+9VuOzUqRTeXC72Q1qalhZAhee3tPCa7tjBa5aezr65+WYee/ZsFk5yOPgelQN3eFjL6ep0cmymp/OntJRChHKhNjZqxZYSE327WsvKgPvuA+68k2Kg00nhYupU9m9Cgpbj+ac/HT2MvLKS91xnJ8/x88/ZB9OnAzfeyPuksHD06+Xp4i4vp6jS3k6BJD+fqURGe68ShJYsodBXV6flYF682Lsg5UuEO+UUrUhRMCkA/IW1797NOWTKFPb/1q2ciwYG+N7eXl6/k09me5ubjSl4pO+j7dvpclXjTImkiYm8/uqxyko+9pWvuItTwYijno5Rh4OfoTbSmpuZSkQ5q5U7W407m41jp65OE898EYn815WVwNNPa+luVFFGf2MiFIHUWx8PD/P9PT0c4z09HEtZWZq4vX8/2xWIqBjpOTVUodiznU1NvG9efNG3aG63A6efDixfzmvjiYpKmDGDY9JT1FX/b4iP19K+hNuNHAKWFm0FQRAEQRAEQRDcBJdjx+haA7h427NHKxKmcs36EhoALs7a2rQwcbWIS0vje5ub+fyRIxQl9Tkex4ISG3p6NJfg0aNsh8r52N9PoaOggO1KTqZQN3UqxePmZgqmra0U9aZM4cJS5fnUL8wnTeLn7NzJ8+rv1ypyA4Et+D1F6JNPZkj34KB2LH3/GeFwC7ToUjgoKwOefJKurv37geefp0A4OEgX7sAABcaMDPcUBc3NFBjUuKqrY7/s2cNct2vWUGzYvVu73n192nUHtCJRAwMUuqZM4XFyc4HvfY9Cwocfcjy0tY0uhMydC/z858Ajj/CemTyZ166nh8dVOZ4DEWyVOHnSSRRaGxooXqWn8/M9Xeej9bFe1FF5mwGe04sv0mXozdHo+d6+PgrHZ5zBH1+bKr4E1p07KUZnZ9NtGmje59FSB2zbxnPas4dOwN5evj81le8dGOCYKijgT1KScQWPVB/98pcUspxOfqZKkwFoKQpsNj5//PjIjZ9gxFFPx6hn+gqVP3l4mH+rOWJ4WMsVrvLdnnGGf5Es3LlaXS5u3Hz4Idtx5Ii2ITBrln+BPViB1Fsf6wsPDg4y5UNSklaAMj2d3xvbt3OOCERUjPScGqpQrNpZWcn0RYFspIzm7s3P58bZm296f16fcz7SER4BIqKtIAiCIAiCIAjWRS+4TJrExRmgFV5KSeGienCQ4khDAxe6vb1cLGZmcrFnt3PhqAoC9fWNrFSdlsbnkpIopuhzPIaCXkhNS+NCdvduig1Ll3Lh3dzM1w4MUJhNSaHzDdBCmVVRFBVavXixJtYePEj35/r1I12EEybw87dt4zklJWkL/+nTA1vwq3Oor9eKj+XmjnydRfL/jRm7nX3jdPJ8hob47wkTtNykn3+u5T8E2O/Hj9NBqFzTGRkUo+rqgIcfBn77W44nlTe3p4evV0K+0+me77O/XxMOt20D7rmHuV6DEULmzgV++ENN5Dx4MDhBwpc4OXkyNwK2b6ewfccdFFsCvU+UqLNpE99vt/Pv9PTRXa7BCkL+BNaJE9m33oRrf3mflUg5aRKvpdPpvokxcybvl48+4nVMT6coGRfHHyVWVlQwZ7TRBY/KyoAf/IAu34oK9mlKCp/r7tZct8PDbFth4ciNrmDE0X373B2jNtvI9BVDQ5rzsaSEj/X2aq7bnBzOafPn+z83o3K1+kqVsWkT8NZbbGteHsXugQEtNcGcOf4F9kAFUpeLPxMmcCwtWcL3qsKD8fHcnJs0ieNdpRIZGOB8MWMG8O1vW0JU9Iq/fvCXKziUXMqBuHtPOsn/8xddZE6ERwCIaCsIgiAIgiAIgjXxFnbb1kbRUBUc6u+n6NDSwoV7d7cWgq4KaP32t3TUzZ7N3JyzZ9NZ09/PxZtieJiLtrw8Ljj1OR6DxVs4dk4ORRt9eHdrKxfimZnM83nggOZQc7k0kUe1raSEC1CbTROMXn6Zv/WupPffp4iRnc3PUqG4dXV0XF588egLfv059PYChw+zfV/6EkVtfb9ZJP+fIahxNzQErFzpLpikpWkFyvLyNGGqv5/9m5PDa6mc0hMncnPhhReYiuCrX6WYl5HB41ZX833x8XxPZiav5datFPY9hcNgHXNjCY/2l3Nz/346/lTxviVL3N2xgRRx+uQTjp1TTw3c5QoE5xz0l5tVuc87OngdvW3ieBNTOzvpEK6t5XykRDZVKGrCBF57VawO4GcPDWkFwZKS+N66Ooq9vjY8Qi2QNnUq07p88QXPLS6O71MOzu5uPlZezvZ6nmMw4qg3x6gq9qTGycAAX2ezcf7Iz9fmLzWXL14c2Pwx1lytvlJlXH458PrrFEWnTdME0vh4LTVBbS3PfSwCu7fIkZoatj8zk9dcpZpR6WdUf6mimXfcwc2laGO0XMGhFtAcbZ4b7XkzIzxGQURbQRAEQRAEQRCsiecCTrmQVKhvbi6dWu3tXOgmJfE5FYLb3s6FrxIclIPvK19h2HpdHUU1FaauCm2lp1M4ClWA9BWOXVtLoWTiRC6+lRt4YIACS0EBF496IXDCBJ6jcrLNns1zHx7m8fr6eM5z52qLXHVMh4OC9pln8tz0Asmnn/Icu7u9i0HeziE1lWHDb7/NY5aWaiJObi7Ft337LOdUChr9uFOV3JXA1N1Nt7SqUB8Xp+VDTEnRciQrlMO5spKvv+oq/m5uZn9mZGgO25QUjg1VKGz/fobtj9WFGaog4S3npkoF0dOjidP6e+v73+frRivi5HlvDw+7u1YnTjQmZYASupKTOUfoU3qoa+N08scTX+7xpiYKbf7cmMnJvI6pqbzPAS2tSFoahcD2dvZxZ6f3DY9QC6QBWnG9rVvZXpWvE2B7bDam91Cf6U0wDlQc9eXKzc/nvLB9O52hF18MbNjAMZSUxHnWZtPC2IPJHxrqZoS/XMT79lFETUriZkp/v5YTODWV472xkXNyqBEFnp8/ZQrn6B07gC1bKBarIoinncZ+UQwP81ouWBCdm2Pe+r6ri98pu3czEiE/P/RCc6PNc57Pu1y8zhZ01+oR0VYQBEEQBEEQQuS5557Df/3Xf6GxsRHz58/HL37xC5x22mk+X//yyy9jzZo1qK6uxowZM/DYY4/hoosuAgAMDAzg/vvvx1tvvYVDhw4hKysLK1aswKOPPoqSkpITx2hra8P3vvc9vPHGG7Db7bj66qvx9NNPIz09PeznG3E8RaOkJIodAwOa4JKWpr0uJYULse5uChNZWXz+888pMioH3759DBv/8Y+5CFfHmjAhuNQB3ggkvDM/n2JIdzcX4X/5iyZkTJhAAXbHDn5+URGFhLg4vn/CBApDdXV8/cCAe9VrQBOq8vP5u6PD3UXY3s7P3LGD/ekpBg0O0p38xRf8Wznkpk1jf37wAQtA9fayzydNoqDgr2hMNOE57mw29/5LTaVb9tgxLUdpfLy2OaBHuTldLh63vJzX/re/ZU7V+Hhe5/R0Xmv1fpUHtLHRvLQTng5KfZGk/HytwFluLu+1igqmO+jt5bjzl49S38dKoG5p0VyrOTnst7E6Gv/f/+NY/ewzXrfiYn5+fj7bnJnJeykx0V049uX+dLkoriUmaoW9bDa2NT+fY2LnThZIqq3lZ6jzaGnRRECnk+9rbmZ7POcbf+KivwJpesrKgEcfBW69ldems5OfmZJC8WrRIn6+P4d8IOLoaK7cKVO0UP7JkzURuK6O7uPJk5n6Y9as4K5vsJsRo83NmzczmkClbcjI4FgcGuLfvb0cI5Mnhyaa+vr8adPYR0rc/vd/dxe3e3vdC+6lpACPPx5d86u3c1f3vcojf/AgcN552uZYuArNAWPbEIkwItoKgiAIgiAIQgj8+c9/xl133YV169Zh6dKleOqpp7By5UpUVVWhQB86/k8+/vhjXH/99XjkkUdwySWXYP369bjiiiuwc+dOzJs3Dz09Pdi5cyfWrFmD+fPn4/jx47jjjjtw2WWXYfv27SeOc8MNN6ChoQHvvPMOBgYGcMstt+C2227D+vXrI3n6kcFTNPIscNPfT9EkPV0Lc46P5yIsK4siWFwcF4oq/FmFV15/PfC73wG//z0Xbi4XhaI5c8ZWgCSQ8M6qKgoO5eX8mThxpJvt+usZXlxYqFXSrqpiegLldpszB3jppZFCoXIkT5jAXKt6F2FzMwWAlhZg3jyKHnox6OKLmVrhlVfYl01NWth3fj7dwCtW8Dy/9S2+5i9/GV2kiyZGK8KUkkK32+2387XPPQf87W9aKLxC5fCcMIFjSwkNZWXAN75BgaukhJsI7e0UFRWJiXxvbS1wzjnmOOs8HZT6IkmAezE2m43j+L33tAJ+/lIeqD6uqeH59/TwOMq1qoq5NTXxHgmWykrgoYe0zQWnk8JbayuF1S9/meNaieWVlbzeypHudPLxm292FyhrangPLl7MdqsCUYmJnI8GBynyXXUVXXwVFdwEys/n9VVpXDo7OS7OP5+v1d8joeT19MXcucCvf83UHEeOsB0lJezn+vrAcsAGIo4G6srV5zN+4w2O76NH/RegM4rR5maV4zg1leOiv5+Px8Xx+qq0O+raB+vO9Pf5Kq9zaytzIt9xB/ty61ZuOAwO8rujvJzti7b51fPc9Y59lR6ks5P92tbG73B9cUDAuDQ8RmyIRBARbQVBEARBEAQhBJ588knceuutuOWWWwAA69atw5tvvonf/va3uPfee0e8/umnn8aFF16Iu+++GwDw8MMP45133sGzzz6LdevWISsrC++8847be5599lmcdtppqKmpQWlpKSorK/H2229j27ZtWLJkCQDgF7/4BS666CL87Gc/c3PkxgTewm71BW4GBijEqrDj7GwuvL/4QhNslcNRCZf68MrycuCxx4wtQOItpFyPt/DO0dxs5eXAueeOfL6mhuKqp7ioHMnd3Vr+TEBzSirBKDeXfaTEoC1bWDQrM5PvKyigAKXCvpcupeiTns7ni4tZlbu1dezikpUItAjT6afzvO64g+kmAkm3oXKUNjRoIeILF1LA0AuAKs/qtGkUQM3A00GZnKw5h1V6B5WuA+B92NbGzQB/otjf/05hasYM4M9/Zp/o00okJnJ8xcVRyDv3XPfxM1qeV5cL+NWv+F6VaqGpiW1XgvDHHzM39PTpwCmncAOnqUlz3atx/uabfJ0ScdT9rQqnKYdwZ6fmtlaf+f3vs4DcoUM8XloaBareXgqn990H3HLLyHsj1Lyevpg7F7j/fk1QbW4OLgdsoASasqCqivNWSwvbHynRTD83e6bjyMrieB4e1uY+JbAPDrLfbTaey//8D/DXvwbvzgzmu6G8nPfH6tUcL2Vl/H5T48Hq86vnPepwuPe93rFvs2kRMlOm8N/t7RRw9aJqMIXmvLVBCb1GbYhECBFtBUEQBEEQBCFI+vv7sWPHDqxevfrEY3a7HStWrMDmzZu9vmfz5s2466673B5buXIlXn31VZ+f43A4YLPZkP3P0OzNmzcjOzv7hGALACtWrIDdbsfWrVtx5ZVXjjiG0+mEU+e07OjoCOQUrYG3sFt9+gCbjQvt1lYushcsoIOsoYEL7bg4CjV64dIzvNLoAiSjuTR9hXcGm48P8C0uZmVRkD1wgOKYckYqsRvQwsP1dHUxHH/OHLoRh4Y0AUuFsublaefQ2WmsuGQVgq1QP3cusGYNsHat/3QbVVW+C7upok0tLdpPairHcSRciL7QOyi3b6fQAlB0VO5rhcPB354FvQCOn4oKCphPPslNlfh4jrmEBC0lgRK709I4Dvfvdx8/gYQ1V1fTLR4Xx3nBZuNntLSw/d3ddJ2uWEEn7Wuv8V5avlwTpdW94Sni6O/v/HytGJ0S/wAK1xkZwCWX8O9nnmGKlpYWtmP+fOB739Oe92Q0cS81leNmxw7+HchG01gK0gGBF0QbbR7Tu4jLynitW1rYd2VlvL7hEs307u66Ovd0HHl5Wt7ujAwt1/fAAH/6+jgfDg/z97x5wQvNwX431NVxI2HevJGvt/L86u0eLSzU0h64XJpjX31vqO/p5GTe94cOccOqqSn4QnO+2jB7NvMER9l3loi2giAIgiAIghAkLS0tGBoaQmFhodvjhYWF2L9/v9f3NDY2en19Y2Oj19f39fXhnnvuwfXXX4/Mfy7YGhsbR6ReiI+PR05Ojs/jPPLII3jooYcCOi9L4ivsVqUPyM8H/vAHCmB5eXyPSqGQl6eFcGdmMlVAZSXF3UmTQmvPaOJFoC5NI8Ld/YmLCQlauLkSwVpbKSgVFLg7JAEKTx0dmuCoT0Nhs2k5Vo8fpwA1Ywb7oLc3tKIxoxGoSBQugq1Qf8klFBl8pdsARi/stmwZx+e2bezvs8+m88zs0F0l+FVXA08/zdyTixfz2ih3amYmx1dODsUXPSoU2uHgOc+axXH52WcUwAoKOI6UW7W4mONzwgSKk2r8BBrWfOAAx3lRkTbGVX+rNAnHjzPtRFoar1dpqXchzVPE8XZ/K5F6eJj3of7+vuQS4MIL6WJvaqJ4tWzZyD7S40/ca25m0aaGBuZFfu214IqThSJEGZn/U7mIVV5oT+HUqAJ03igt5fh84w1NmNcXkevq4mOLFnEMHTzI5xIStBzGAO+DyZM5Nwbjzgz2uyGUqA2z8XWPHj7MDa2+Ps6TqqAooKWRUalW1GbhN77Bv4P9DvA3T+zezc+aMsX7ey3YpyLaCoIgCIIgCILFGBgYwLXXXovh4WH88pe/HNOxVq9e7ebw7ejowOTJk8faxMgymkssMZGLNCVczphBcePQIS7S8/KAjRvHXsglEPEiWJemEX2jFxdVcZ/Zs4Frr+VCuaqKC9HBQQoN5eVsR3u75hDs69P+rc5LOXNVugSHA3jrLbbd5eI5Hj5MAWbatJFtC7VojFWKxATrTpw713u6DYAFobwVINIXduvpYX9mZdF9qzZorBC6a7fTMfztbzNX7P/8D8eZIi6O5z9zJsdgZibPUx8KHR9Ph25ODp8rK+PYjI8f6XK12Tje1PgJJs+rL2w2Hm94mNfHbg9eGAvl/o6PpygfKL7EPSV+NzZSdFq4kP0aTkHf6PyfnZ108R87puUe1wunx49z3IdTNBse1n70f8fFcWx2d3NOy8nh+HK5mHd3YIDtHRzUog6CcWcGO3ZCjdowC3/36Ny5vKbt7XS5u1xaMb6ODvdUK+q8srKCF+5Hmye2bePmiRLoPbFan0JEW0EQBEEQBEEImry8PMTFxaGpqcnt8aamJhQVFXl9T1FRUUCvV4LtkSNHsGnTphMuW3WMY8eOub1+cHAQbW1tPj83KSkJSSpsN1bxFC6Vm6e4mAvt7dvHXsjFn3hRUwN89at00WVkUDgKxqVpxPl7K+5z/DhFtBtvZNvS0oA//pEiYW0tnZHK5ZaayoWsSptgs7mH7DscdC8WF9MpWFrK1x84APzv//LYehd4qK5iqxWJCdad6O311dW+Q3L1hd0uvZTC44QJ7L/2du1aWDF0V38uqo0rVjDf57ZtTNFhs3EsDg7yXPQOb1UYsK6OeXv1kQie4yeYPK8zZ1JwO36c952no7Gtjc/PnMnrFawwFqwLO1i8iXupqXQJNjaynxYs4H0bTkHfyIJoirQ0TTQrKdGOqdz9NTUUoo8f5+cbuTlRU8Nrf9ZZWnoE5e4uKaHL1+HgZsQXX3CMpKXxPlQRBXl5I4tbBuPODGbsRDJqY6y4XMwTvXmz+/eAwmbT0h7MmMFxfPQo5zrlrM/PH/t5jTZPzJzJzYGqKvdiiYD1+vSfiGgrCIIgCIIgCEGSmJiIxYsXY+PGjbjin6HPLpcLGzduxKpVq7y+Z/ny5di4cSN+8IMfnHjsnXfewfLly0/8rQTbgwcP4h//+Adyc3NHHKO9vR07duzA4sWLAQCbNm2Cy+XC0qVLjT1JK+HLeXn55VwwK1fjf/4nF13q75IS4Ic/5KJ8LIVc/IkXeXkUS99/n0Jxbi4/68orgXvvjVyIv6/iPp9+SmHg+9+nU3L+fGD9egoOBQVsV08P2zk46H7M/HyeT00NzzEvD7jmGi20WzlC//Y3CsErVjCHq3KO5eZyYeyv0ro+DUJaGrBhQ1QViQmI0dycqrBbeztTTwDsFxUyrgQNs0J31TVyOJiKZHAQuOoqOuSUOzszk/fpxo38u6GB172/n4LXzJkcC/ocuDYbN1EaG/neOXN4bIeDGwqlpZrzMBhH7Ny5wJe/zA0MfXE3lS/X5WLqCSV8hyKMjTVH7Gh4insHDrBPp0yhYOvZj+EQ9I0uiOb5fj3d3bzvW1spiv7850wdYqS7Xl9EburUkYXIhobYz2ecQdF2cJDtcbkomhcUcJx5FrcM1p0Z6NgZa9RGpFLMqO/nzZu5sZCdzY0qz5zXaWns629+kylDnn+e4v3MmZwDHY6xR6MEMtcWFvJ3JCJhDEBEW0EQBEEQBEEIgbvuugs33XQTlixZgtNOOw1PPfUUuru7ccsttwAAbrzxRkycOBGPPPIIAOCOO+7Al7/8ZTzxxBO4+OKL8ac//Qnbt2/H888/D4CC7Ve/+lXs3LkTf/3rXzE0NHQiT21OTg4SExNRVlaGCy+8ELfeeivWrVuHgYEBrFq1Ctdddx1KSkrM6Yhw48t5+f77zOdYVOQe0n/llRSCAC4cjSjk4ku8qKqiWNnZqYXYOhwM/Y2kKzRQR9yMGcCePXSUZWVpTrOUFPZdXx+FClW1u7eXYfvV1RS78vO5MNcvxgsKGPq9Zw/7SRWTmTSJ/fHii75THHiK8YODTA9wyilRUyTGDV8iSSBhzk4n8I9/sJ9zcykqqJBxh4Ou58TEyIfu6q9Rayv/Li6m8KEXZAAKW2++CZx8MkXRwUEKqVu38vp6IyWF92duLu/ptjY+rpywimBCxe124PbbKQZ/9hn7T6VqiI+neHzbbZowE6owZnQRQ0/04t6OHcxhu3Ch93y44RD0lXienMyxrS8cFepndndz7DQ3a4L64CD7v7eX4yEjg+N/NHd9sKKk5xjyLJinxtDixYzOSEzUfvbu5XgaHnYvbhmqOzPQsROqqztSKWb0388FBXTOxse7z1tqntCnPZg/n99Dqo1HjxrjVg9knsjPB1auZDTAkSPcJEhJCV8kzBgR0VYQBEEQBEEQQuBrX/sampub8cADD6CxsRELFizA22+/faLYWE1NDey6BeTpp5+O9evX4/7778d9992HGTNm4NVXX8W8efMAAPX19Xj99dcBAAsWLHD7rH/84x84++yzAQAvvfQSVq1ahfPOOw92ux1XX301nnnmmfCfsBn4EiOdTooJjY1cIJ5zjvfcjkYVcvF2nGPHNMFWCWyJiQzrVQJVpFyhgTritmyhgNbdTYfT8DCfT09nO5OStKrdBw5Q8FJ5cJOTteJknovxyZPZ/9/6FhfiTU3AX/7Ca+QrxQEwUow/coRCzt69bJOnKGjBIjEn8CeSzJrl381ZW8v3pKcDJ53EcZ2RweuRn88+qaykkLl4ceRCdz03TFJSWJyprY3jSD8Ghoc5Dnt72T6VLzInhw7iAwd4PJUHVL2nro4O8J4eisHz5lFMi4/nc888w/EyWh96CmdlZcCPfkT3+c6dHH9paey/q65yF2bCne5gLOjFvddeYz9FIr/pvn3Ac8/RqV9RwePm57tv2ITymRkZFPcKC3nNmps53p1OjhU1bnJz+W9f7vpQRMlA0w0sW8a5Xf+6sjJuqDQ3c65XhSwrKsLvzgzW1R2pFDOe388AN/hUEdCWFi33L+D9HjXarT7aNa6o4L//9jfte7q4GLjsMuDccy3lsFWIaCsIgiAIgiAIIbJq1Sqf6RDee++9EY9dc801uOaaa7y+furUqRhWhVH8kJOTg/Xr1wfVzqjFmxipL2w0cSIXe0ePUuAqKaHgohb5RhVy8TzO8DDDQLu6+JzNxsVeairb0dzM5yoqIuMK9RSVleNXhf4qsXPHDgqxiYkUxrKzKUC0twOffAIsWcLXf/3rTKHQ26st7t97j+eoRER9IZ7ubs2tW1rKsPTWVt+u3w0b+Jh+sa9ySWZk8Hz0x1dYsEgMgMBEEn9uzqQkXocpU+gcV+KQCutPSmK4dklJ5EJ3Bwfp7PziC44BVQwsJYU/HR3u18jhoPiWns5rpFCCV0sLj6VyTetTaKg8s545JjMzNdHunnuCd8SWlQH33ReYKGSkgBSOsPRI5jf961+BtWt5Pfv6eB4DA+xrtWGTlxfaZ+rP44wzeIwPP+S1zMzkuC8u1ly9ene9ym386afAyy+zbaWlgYuSgaYbiI8f+boJE5h2Y8cOtispiWM2UsJ+oM7ccOQh9oW372dVwLKhgQ7Wujr2Y2en93vUaLe6v2tcUcH2TJqkpZvp7uZrX3mF/5+wmMsWENFWEARBEARBEASr4s3h6nBwQZqVRSGhsZGL/oQELrbT0+koVYt8I4QOz+OoNsTHc2Ha28vPTUriZ2RmUtRqa4uMK1QvKjudWvEwVWQsPZ3i2L59mnNWFafTuzn37qXrsbvbPa3E8LDmss3P52OqEE9WVvAFo3bs4N9Tp2purJYWXs/jx/lbCYEqhNmiRWICEkk2bACuv555HD/8kGNW7+acMwd46SVNuNIXgOvspBCRmcl8wpEQFSorKdi+8grHT1MTr/+sWdo4yMhwL8akxL0ZM0ZWZc/PB04/HfjoIzrUOzu1cz/1VKbQCCRvaiiO2GBEISMEpHCFpY81v2mg7NsHPPwwN8ImTdJSF3R08FzUhlVxMa9rsJ+pP4/KSh4zLo7zd3MzN770xerUhtOnn3IjqbKSn9/RQVd6YSHvDW+iJDBSPA90DPl63fXX8/5UhR0BXoPq6vDmLA+UcOYh9sRXJEt8PJ/r7eVcvnkz577bbovM/OXt2qnvu0mT6KSOonzpItoKgiAIgiAIgmBNvDllnU4KCQMDXPg7nVw0ZmTwsbY2imKffspFqRFCh6dgkpxMV6jNRketSh2gFoKJiWyHymcabpSo/P77dLj29FA4S0hg/sUjR3jOw8Psg+PHNYEZ4O+MDPbJGWfw3/rFuM2mOaiam/l8fz8/q77evR8DSUmh2tLby7yC+vYmJrK9R48yVcMpp1i6SMyoIklqKlNF7Nih5cEsKmIe4PnzNaH7lVe0cZ6fz3NVbmmnk2N7/vzwn49yDX/xBdtbUMCxrtJizJjB3x0dfLynh+dZU8NzLS0d2Q8A3bkLFjDXbFaWJqLt2xdcCpNwFwAbC+EOSw93GgeXC/j97zl/TpqkOaZLS3lObW18DcB54pZbQvtM/Xls384xBNBJ7lm8Sm1Evfwyf2dmcnzl5rKdHR1amg69KLlpE6MHfInngYwhf6+rrAT+9Kfw54wNFqNSAgWC5/dzczPTpvT08Lu3t5fXp7CQ/44kntfO4QB+9SttnOixeL50EW0FQRAEQRAEQbAm3pyySUl0ZjU1cSGYk6Mt5FUV+8ZGuvouvdQ4ocNTaFBu0Ph4ig36RbIS2srKIuMKtduByy9nzsvGRoZ5KsFWLZqTkugGO+MMtl8ffq9eFx/P57OyRorl+fmaA/ToUS7Mu7vplNT3YyApKdLSKNru2cPj6BfS2dlaePkXX7DdFi4S41ckUe7llha6lqdO1Vx5qmq63e59nNts7AuVhzESDmO9a7isjPfY0JC7G/vYMeC007gp0tDA+yk3l+Nm5kz+rXIlK/Qu6dNPdxfHQklhYnRItRHpDLw5roeH+XhuLjciNmwAVq8em8AcTtFabUAkJXFeUKSlUZDPzua4nTQJuOGGsQvQs2bxXnj6aeZKXrLE/Tz0+Z4TEpie4NgxjsnsbJ67Z6qWtDSKb88/z/f7E88DGUPexlqkcsaGglEpgQJBP2+VlWlpi5To3tHByI0zzmCfRdrJqr92e/dqG7zesHC+dBFtBUEQBEEQBEGwJr5CguPjtVBafSj28DAXXZMmUVBSrhmjhA5PoWHXLi6Ce3rYpsRELgzr6ymc3nRT5BaoaWl0cMbHU1jp6uK/i4u5sO7tZV7agYGR4ffx8RS/8/I096e3tBL5+RSgtm+n4/KOO9i/+nMMJCXF4sV0++7cyfZ5vmZwkO8tLGRxM5Ur1wpuSk98iSQq93JnJ/Nh5uZys8FXOG4kQt9HQ+8azshwT4WgxNvmZgrQxcUUY264gfdgaSlQVUUxK5hziGSuVm8Ylc7A03GtxESVpsTlYl8uXQqsWDG2NhstWis6O9nO5GTOEyqkHNDc+N3dTLfimQIjFOx2inrf/jbHTWWl73zPysGdlMT5SrVPn6pFicpNTTy2PkeyUWHwkcwZGwqRvJ/089b27dzMy8zkd2BHh5bqwm4338kaSTHbYES0FQRBEARBEATBung6ZSsrKfi5XBRZ6uu13KoDA1wolpePzCdrlNDhKTQcOkShQOWwdTop2K5ZQ2dYpOjspIhxzjlsjypCpgr6DAxQDKmtBZYvZ3i+Cr9PTGQ/Ll6siaN6EXHiRApPDgdTIpSW8vynT/feP6MJkFddBRw4wGvqcPB9esdvairTIrS18bMtFq7qhi+RRKWSACh260Uub+G44Q59DwS9a9hmY2oE1Za4OP64XExpMX/+yPD4UHPOmiVYG+mY1PedPkxcpf1wOilqPf+8ZQseISODmzft7ZxjPUPJwxVB4G/c6PM9A+xPfX7txET2vdNJUfLAAb5u1qzwhMFHMmdsKET6flLX7pe/ZKoTm43jXW0WKtet2U5WszeHxoCItoIgCIIgCIIgWBvlcN20iaLHlClcdCoRQQm0M2ZQeExMDL9rRi80VFZqOWzLyuiwjaRgC2hOop4erXiXnp4eiqwZGdpiPj2di9e6upFFhdT5/epXzJXb1sbHc3IYBu+PQMS7lBQ6NltaKDIrx69a7EfiGhqBL5GktZV9VlDgXlhJ4U3EMDtfq2dBu4MHtUJRfX0U1QcGOJYuvti78BjKOZghWBvtmFR919XlHiauzxs9YQKft2jBoxOFuo4d4/XXp1AJdwSBr3Hjme/ZM792UhLb0t/Pa5aeTod+err3zxmreBipnLFjSdkR6fuprAz4wQ/4PZKWxqgCtVmoMNvJapVohhAQ0VYQBEEQBEEQhOjgk0/oivnSl5izVh+67XDQoZmbSxE1Eq4Zs0U2PYE4iZYtAy67jLlvPRfzl11GIXXvXu08AAoUxcUUWLOzKazW1dGh6M+JOFrflJYyVHznTgpB/f2aMxiIXB5XI/AmkgwOUrQrL3cvrATwehw9ypQVDgcFGtUv4Qp9DwQ1hnbupODc00NxA+A4aG6mIFZSwnFy0UXex3oo5xDpe8lox6Tquw8/ZD/pRavhYTrIi4u54WHRgkduwhbA+zGSEQTexo23eU3l166sZN7rzEzOH4sWMSXCiy+GLww+EmH2RqTsiPT9NHUqcxLv2jVSsLWKk9UK0QwhIKKtIAiCIAiCIAjWRy+y2O2a26qzk4vnCRMo4m7fTidupFwzZopsegJ1EpWV8Ue/mO/u1oRcJRLMnEkXYmure25IgP0diBPRX9/o23v0qNbejg7LO5+84imSpKUBf/wjsHu3e2Gu5mZ3selXvwI++MD8qvOAdk327WP7cnLY9v5+nlNODgWOxMTwCI+B3EtGFA0DjHdMqr7bvZsiZ3Iy26pP+TF7Nh2gR4+G5sQ06tz9YbUIAoCF73bvZlqOmTPZh4mJHI/FxcC112q5uAFu7oUrDD7cYfZGpuyI5HdTtDhZrbTRGiAi2gqCIAiCIAiCYH08RRbltlLFflTY9owZzLdqtgBmBoE6ifSL+cpK4NlnR4oEH38MfP4589+GK3djlDqffOIpklx1FQULJWL09rJf29ooOJ1+OsW8sVSdN1rIKyujCLZnD93Cra3uaSvy8/m4GfkpjSoaBoTHMVlWBtx2G9NKdHbyGJ5953CE5sQ06twDGS9WEbb059zRwQJjDQ10excUMBWOt3kinOJhOMVJqxc5G41omc+tstEaICLaCoIgCIIgCIJgfbyJLPn5XCSrAlnd3cAdd3gvkDVeCEZw8ScSlJZSuFOibCA5WcPd3mjD07W4ezfFp5kz+ZxKmxCqIGOkiKln/nxgwQK6GRMT3QvaAebkp/TnQKypAb76VYp5gY6fcDkmzz2XbfnoI743OVnru1CPa5T7MpjxYraw5XnOU6YwH3BVFZ22N97IvvZ2ncMtHobr+CqaZNIkrUik/t5TG2XV1TxvK86XsTyfm4SItoIgCIIgCIIgWB9fIovNxkVtfT3D+KPIQRM2AhVc/OX1VKJcYyMFBM/iZkYKd2YLRJ4Y6V5VIsbHHwOPPUaH4KRJ7v0dinPZyDBqT1RBKqtUWve3uZCfz/QSW7cCJ5/MvMyBCNfhckza7ZrDuqWFxx0aCv24RrkvwzlejMbXOWdlMW/q9u3AG29wc27qVN/C7VjFQ3/zQDjEyc5OFoGrraUbf3CQRQDT03nsvDy6jZ9+Gjh+3NiNGiOx2nwe5YhoKwiCIAiCIAiC9YmWnHnRhL+8nllZQFERUyT09bk/F2nhLhK5PBXhcK/a7ezPlBQW8fIUyIHgnMvhDqO22r3ma3OhuZn5S51OCqNFRUBCQuBCZLgck0Ye14iCadEWdu/veu/fz5zA+/bxGi9Z4vveHIt4GMg8YLQ42dQEHDrE+TUvjyl/jh0Djhxhe9LS2JbeXp63lYV3wTBEtBUEQRAEQRAEITqIlpx50YK/vJ42G8XR+nqKKCkp5gh3evGkt5fi3KRJwGWX+Q6PHstnhcuNaGQOVSOEvNEoKwNWrQJ+/3t+lsulFSKL9L3mbXNheJjt6umhWKucibm5wQmR4QrnNuq4RhRMi8R40TPWTRZv59zcTDd1Tw/vH5uNz4dDsDTDlexyAVu2MB2Jy8WxfPQohVv1+S0tzJHc1cWNisxM6wrvZhLJTb4IIKKtIAiCIAiCIAjRg+TMM47R8nr29AAXX0yBtqoq8iK5XjxJTeXvpia6K99+G7joIuD2241pR7jdiKWlfK8RuU6NEPJ8oQSPTz8FPvyQhZ9cLp5zURHF8lmzmFczUvefN8Hb4eC1ysqisBUfz/yfQPBCZLjCuY04rhFif2cnNzwGBnj/qDypAPuxp4c5wR2OsbUVMMap7nnOeoE+P5+CZXw8XdVpaXSibtgArF499nFoliu5pgY4cIDF1T77jOc0OMhr1d3Ncx8a4t91dcCOHcDKlWxfOIR3I4n2SAmTEdFWEARBEARBEIToQnLmGUMgYfC33WaOSK4XT/LzKdT29FBsys1lrt133+XC/I47xr4gD7cbsaqKbsHPPwf27mWeyqIifl5vb3DOZSNdu3qU4LF1K4WjwUGed3k5RfPqauDhhzVna6REEW+bC04n2xcfT8GxuFgTIgHjCuWZjREF05qaOO4++4zjKz6eznmAY6+3l335hz/Q6RnqdTTKoep5znqBHuB9BDC37dAQ54qGBmDpUmDFitDaroi0K1mhNmJmzeL51Nfzd3s7r3NiItDfT9F2cBA4eJAFDVXRTbPG+2iCbCRF1GjK2xwEsh0tCIIgCIIgCIJgBi4XhbC9e/nb5Yp8G1TKiYULKX4dOMDfixYxPD4lhfkjAWDuXN+Ff4xGX0m9qoqCbUYG3YIDAxRu7Xa+7tVXx953gbhX+/pCE0WUmFBfDyxfzoJZNhuFly1beI7BCApK1KqtpaCjRwl5ZWXB5RtWbdy5k6JHYiKF0OPHKY45nRTPt22jWJ6bS4EpL4+iyDPP8BjhQG0u5OVxc8HhYIEml4vifWoq+0MvshlZKM9MvJ374CB/V1SMLvZXVgJ/+QvvmaEhpriw2XhPVVXxNXFxvNaHD4d+HT0dqpmZPK5yqLa0BH6fep5zaysFy6Ehju2ODr4uLY3jMDOTx3/++bGPwXDOA/7Qb8SkpwMTJvB3cjLPMSOD/akKkw0M8Pqp+9+M8V5ZCTz6KPDAA9zMeeAB/q2ugZpTdu3itQznfGHk+LMY4rQVBEEQBEEQBEGINFYK4/SWcqK7G3jtNfPap8STwUEKNSqEW4Xqp6TQMZiba4zzLVzuVW/h1lOnUnTr62O7laARKEYXCtO3ceJEisnZ2XT1JSXR2agEFrudP8PD7qJIuHNqeuaz7u3l9RgYAE47jYKyItKF8kIl0LDxUHN5q+va2gp86Ut0q7e0MCdqXBxF0IYGfu6CBZpIGsp1NNqhqj/n7dt5/yuBMjOTx1OfY7NR5OzqCn0MqmtRX885p6vL3bmtCJc4qncXl5TwMaeT93VcHP+dksK22e3cVOno4DySlRX58a53tU6apG0kfPgh+/F73+P3R6TSTJjlkI4AItoKgiAIgiAIgiB4I1y5+KwYxqlPOVFZCTz7rLntUyLqkSOsoB4Xx7+V2NTRwcW4y0XhbqzONyPC0L0xmphQVMTnfYkJvsagkUX59K7m5mYKVklJPG+bjUJLQwNfm5OjFULSn0ckRBHPzYWmJrpIm5vZXr1wnZsLnHoqXeJWzHsd7KZNKLm89WMvM5PpA3btojvZZuO9ZLdzvCvRO9TrGI48y+qcq6uBp59mnuW2Nh5L3UvDw5wLiouZLiCUtnsWOzx8mBEHX/oSUFCgvS6cmwH6jZj6eo7nvj7m7XU6KdLm5PD8Ozu1XL+trXx9pApDAiNT1+zZw38PDnJM1dTQGT0wEDkRNZx5vk1GRFtBEARBEARBEARPwuWENavQTbS1r7SUIsyLL7JNqal01gKa2GS3U9CZPn3szjej3asKTzGhuZljSokc6niffjpSvBhtDBpVlK+zk8J4bS0FvZYWuuYyMnjeKSkUYQAKRfqiX4pIiSL6zYXycjqDPYXrSZPYzhdfNN/F7o1QN22CzeXtOfby84FTTuEYzMjgdezqche6Qr2O4XKq2+28v7/9beBHP2Ju3uRkzgn9/RRsVXqM9HTg6NHg2u7tWqSm0jH69tvAmWfynhrrPBAI+o0YhwP44gueS3Y2UFjI69Xbyzk5MZH/7u7m5kQkCkMq1GZAaqp7rvGEBAq1LS3Axo0cq77Gq9HzRbjGnwUQ0VYQBEEQBEEQBGsTyerTQHidsFYP47RK++x2YNky4IUXNLFC5TFVzrO8PAopZ5xhjPPNSPeqQi8mOJ0s8qUXOTo76Z57+WWK1OozAh2DRhTla2oCDh2i0Jmby77u7OSPymWbmMjXHj/OvvYMHTdLFPHlvm1ttY6LXU8kN0W8CVnJyRTblJM6IcFdgA/1OhrlVPfnLL/tNqbu6OxkO+Pj6bCdPZtj1OEIru2+rsW0aRw3H3zAfOO9vdy4GMs8EChqPF93HUXqrVt5fXp7eb5Tp3KeOHIEmDGDRRgjlWdc0dnJ9rS0cC7Lz9f6LimJ0QOff86NoEilmQhXpIQFENFWEARBEARBEATrEuncr+EWVawexmml9hUWAiedxHyVX3zBSuqJiXTUZWXRaRcfT9HWKNHCKPeqQokJO3dSnNWLHMPDFEVPOol9rsYVEDlhz+ViMbTERP47KYntU+HNvb10L86YQVej08nPtZIoooRrlwt44w0KtlZ0sQOR3RTxJmRlZXGzo6GB162kRBPVxnIdjXCqjzbXn3su8NWvAh99xPYlJ7Pt6l4Ktu3+rkVBAbBiBV/zrW+xHZFKsaHcxffdx7QQNTXcTMnK4nxXXw9MmUL38fTp4W+PJxkZTFHT1MR7y+lk1IBy4A8MsK12O4ulnXpq+OeLcEVKWAARbQVBEARBEARBsCaebsPUVIoN773HXJX33QfMnWvsZ4ZbVLF6GKeV2peRQfGkrIyiSVUVhUO18M7J4WJ8/nxjP9cI96r+WFdeyfH6xRdssxJrVWh3WRlFUzWugMgJezU1zN+5eDHb2NzM615SQlGmvZ0iTFoac6I2NHjPIetPFImUU94qLnF/RHJTxJeQNWkS04oMDzO9xNCQMeLWWJzqgTrLr7qK7VQFsMbS9tGuRXo6hciJE80ZL2VldNK+8go3fY4dY1sXL2Y/mOUYLy1l33/0ETehenu1ApGpqfxdWqptsEVKRA1HpIQFENFWEARBEARBEATr4el4bWlh3s+WFopIVVXAXXcBTz5prHAbblEl3GGcYxXIrBRm6tmWadMYAq3SI9TXU8CweshrWRlw7bUs2DM4SCeoZ2j34KD7uIqUsKfG+6xZFFj0+XYnTKBgFRcH/Pu/AxdcwPsuGFEkkk55K7nEfRHpTRFfQtYll7Afmps5HnNyjBG3QnGqBxPdYKQwZ6UNKn/oi65ZAbudG2UvvMA+ysjQHLatrfx3ZibdtjfeyLy3kRJRjY6UsASf4Z4AALvvSURBVAAi2gqCIAiCIAiCYD30rrmWFi0XaGYmF4UuF/DZZ8BPfwrcf79xC8BwL+TDGcZphEBmpTBTb21JT6eIUVdHsTNaQl7nzwcWLKDYnJjIMaxCu4GR4ypSYpJ+vOfn8/oqYVzlOm1rYx7NmhqKudddp7XDnygSztzQo52LVUU4MzZFvOX93bqV11U5JIuKgMsuM+Z6BOtUD9YhbZQwZ6UNKm/o75+pU7X7Z/duts2s/MwuFx33BQV04g8NaUUVc3PZj198wXli+nTOK1/6Eq9TVlboImqgG5JGRkpYABFtBUEQBEEQBEGwHso1l5pKh21PDxetTU3899AQnT1btwLPPw888YQx4l0kFvLhCOM0UiCzUphpJNoSifD90lK2NdBxFSkxydt4z87WPkuJ5X/8I122npsBvsSRSBbc8ncuCiuIcIB5myJKyKqsZLi9miemTuVnV1cDzz5rjhAYikPaCGEumGsR6WKYZtw/gaJSqpx+OlOqOBws1JaczHa2tbEA2aFDwIMPjpwzzNqQjFJEtBUEQRAEQRAEwXoo11xDAxeuKhx+YIAOwPh/LmUGB4E33wQuvpiFY8ZKpEQVo9xiLhcFl3XrWFF8yRLtGGNZ4FspzFS1pbqaYgFA56cRbqpIiQHBjqtICXujtSsujvdgXV1wmwGRzi+rRLW5c3ke+/a5t9dKxYjM2hSJlBAYrMDpzSE9PKw5vpXrOxwO6UCuhRmCoZXzM/tKqdLdze/lCRO0OWPevLE77CPt2LcYItoKgiAIgiAIgmA9lGvuH//gAq2nhwtFFR7f08NF/MSJFCvfeIPVxY0QZCIlqozVLabEhO3bgR076Ep2OrU8qcDYFvhWCjPV51I1SjiJtBgQzLiKpLDn67MWLGDO0/p6inqAJqSVlPBxXyJfJPPLeopqTieLIx06RLHPisWIzNgUiYQQGIrA6emQbmnRhMCBAd6Ts2fzdzjwdy3MEgytnJ/ZX0qVxERg2zb2XVmZJsKHujEwOAj89rdMt1BWxs+22azhOI4QItoKgiAIgiAIgmA97HbglFOAP/+Zi9OhIbr+Bgf5OyWFi8XBQQq5tbXGuo6s5DT1hl5MSE/nIj4jgw4nhwNYulQTbn0t8CMd8hsqwQgngZ6TWeHHwYyrSI5Bb5/lcjG8WeWV1hcpi4/nuNuyxft9F6n8sr7GRk0NBdtrr2U+YSuO7UhvioRbCAxV4NS7vbds4Rw2MMDxMTzMPKhAeNM3eLsWZqYosHJ+Zn8pVY4f5xiaNEl7TOFtY8DffF1ZScH2lVc43zQ18TtfbUqa7TiOECLaCoIgCIIgCIJgPSormfagsBA4dowL5+Fhzc2Tm0tnaXMzi+jExRnvOrKS01SPp5jgcAAJCWxvfj77ZP9+LnBtNu8L/GjJERiMcBKMG9fM8ONgxlUkx6DnZ+3dy37s7aV7rqeHAlpCAkW1tjagsZE5pz3bGIn8sv7GhkqTUFEBXHqp9QRbMwinEDhWgbOsDFi1CrjzTs5naWk8ZkkJx1FeXuRdlWbOEVbOz+wvpUplJQXW8vKRfQa4bwz4+w4CuAHwxRc8XkEBN249NyXNdBxHCBFtBUEQBEEQBEGwFnoBYPlyLtjefJOPp6TQ6aeqVqemclENmFsVPpJ4iglZWRQ1Ghq4kM3MZN85HHzOc4HvyxG3cydzgVrJnRiocLJpk3uBpdFcflYOP7YKGRl0q+7ZQ8FWudsAPp6ZSdH2o49GCqORyA0dLlEtWhzowRJOIdCIa5GWxk26yZO5MZeUxPlLHS/Srkoz54hw3j9GjG9/KVVSUvi97A21MdDU5Hu+rqnha1pa+DlNTfyuT0oauSlppuM4QohoKwiCIAiCIAiCtfAUAE46ie6qQ4e44BweZnXq0lKKi83N5leFjySeYoLNRjHG4WBfZGQA/f1AaysX055V0L054pxOOie/+IIi3YIFXDCb7bwNRDipq2NO42BcflYOP7YKpaV0sX/wAVBcPFLk6+ykmNTQ4F1IC3de3nCIatHiQA+FcAqBRlyLzk7OQ1OnMnIilGMYia85QhVJa23lBqKvcx4r4bh/jBzf3lKqTJoEPP64/42BBQuArVt9z9fbtnFOOftsPqbfkFT5bFtauHF79GjMf/eLaCsIgiAIgiAIgrXwJkouXswFssPBhWZvLzBtGkVKq1SFjxTexIT8fOC004Ddu+l+dDopbJ92mvsC35sjrrmZi+ieHiAnh/2cmGiN6tyBiKtDQ2zn1KmBu/zMCD+ONgen3Q6ceSawYQPvO4Djor8f6Oigm668nGK/LyEtnHl5jRberVil3ugxEy4h3YhrYbWNFG9zhHJ5Njdz3OfnA3/8I3DVVeEZG0beP+EY397St4y2MbB0KfDii75d2bm5jPgYHBy5IZmZyXQJvb08n5NOivnvfhFtBUEQBEEQBEGwFr5EyaVLuWA+epQ5NXt6gFNPtVZV+EjgS0yoquLCvqeHRWBOOgm47DL/aQGGh9mnKvx9eJgOssREa1TnDkRcnTyZYyIYl18kwvf1RKuDc/58YN48Cj1dXezD+Hg6b2fP5jgZTUgzIi+vN/HSSOHdzKJTvhjLmPEn9oZDSDfiWlgtj6vnHJGayjzPah4pKOCmxe7dbFski6QFi1HjO5BNhNE2BgYH/buyVeG59nYKuPrv/pYWCraDg3Ts3nKLtedPAxDRVhAEQRAEQRAEa+Fr8Z6fz0Xc9u3AjBnAHXdwMRvDLhuvjCYmlJRQTDhyZGTFdU9B3OHgQljljnQ6KcolJVmjOncg4uqll9K5FaxDL9zh+worOjgDpbSUgsnOncDEiXTZqlyjAK9JuIU0f+KlUcK7mUWnvBHMmPEU0rq7gdde8y/2Gl3gzohNkEhvpASCmiNeeUXLwTphAr+LZs/WNrrM3twaDSPGdzCbCP42Bqqr/Tuq4+MZ8dHaCkyfzscSEvidX1rKsbBwIfDTn/K1MU7sn6EgCIIgCIIgCNHFaIv3KVOAb39bW9CNR0IVEzwFcaeTrqWEBL6+o4MuSiXKWaEg12ji6qxZwCefhObQC2f4PmBNB2cw6O/Fo0e1e7GjIzJCWiDipRHCu5UK0wUzZqqq3IU0p5P5PydMAObOjewGgRGbIJHaSAmGsjLg61/nxsW8edw41BdIs8Lm1miMdXyHsvHka2NgNEd1fT3z2fb2Alu20OHf0cH2qxQ+Vp0vw4CItoIgCIIgCIIgWA8rLt6tRihigqcgnpHBx1QRoNRULqjVMaxSkGs0cXUsDj2jXYd6rObgDAWz7sVAxct77gHuvXdswruV8qkGOmY2bdI2bCZP5r37j39QXB8a4v2cmRm5DQKXC0hJAS6+GPjSl9hXWVnBX4twb6SEQnc3XZ1WKZIWLGMZ3y4X81ofOcLr4HLxWoQ6rgJxVN92G4tirl0LNDVx3Pf1cVwfOwY89hijS26/feT8E225w0dBRFtBEARBEARBEKxJWRlDIrds4cKtsBBYtmxchEQGTChigl6Eq6zkY21tzIFbVkaXLmBOHkl/+BNXrSryW8nBORbMENKCFbzHInpbKZ9qIGOmrg544w13Qbu9na7ESZPoTNy/nwKYzRb+DQJ/ofOhjJFwbqSEgpVE/VAYy/jetAn4y194XY8c4fdNXp4W0RHKuAokeuJ//oftmTWLG5MJCdyYTEhgsc1332Wb7rhDm5s+/RT48EOtGGe05A73g/xvRxAEQRAEQRAEa+JNCPjgg6hegBlOqGKCXoT79FPg5ZfZx4mJTJdgZh7JULGiQy/axR49kRbSIil4WymfaiBjZmiIbZ06VRPgVKqTxES+r6WFOauzs/l8uDYIojlnc6BYSdQPhVDHd2Ul8PzzLHQ5cSLzWQ8MMAWHw8F81xMmhDauRst7qzZs9uxhH5eUaP2em8tUCTU1bF9eHlPkfPYZ74FJk5jXPTU16sdhFHzzCoIgCIIgCIIw7lBCwK5dXJDNmsXfu3bxceUQHe8oMaG2lgtbPUpMKCvjIra6miGl1dVaiOvUqcDllwM//CFFh9ZW4MAB/l60yPiFrss1sh1Gos6pvNwaReoCvT5WFXvCfb38oRcvvWG04K3cfwsXhv8+8EcgY2byZDrr9YJ2UhJdkAMD2uaL06k9H44NAs8UFpmZbJcKnW9pYeh8JMdNOFCiZ14eRU+Hg/3rcPDvaNjcCnZ8q2vb1cU8snY7f5KS6LDt6aGw2tUV+rjyNV+rDZvBQfdCmYrERG5cxMcDb75Jd21LCx8vLgaOHwe2baPYnJtLh/CGDVE5DsVpKwiCIAiCIAiCdVAi0bp1XGgtWaIt5KKleFMkCcRBVV4OPP64/6rfkXCpBlN9PFawkoMzWMy+Xma4G63g1g5kzFx6KfDii+5u3KwsPtfQwHbHx1NgA8LXX7GQszlQrJqCRRFILtdgxre6trNmaQXu8vO1dBuZmRRFDxwAzjrL2HGlNmyUOJ6Q4P58fz83B44dY8GynBzmcs7O5pgfGuL/H+rr+dzwMNu/dCmwYoVx7YwAItoKgiAIgiAIgmANlEi0fTuwYwdDG51OLXceEHtCgBH4ExPKy+lECiR0OZzh7+MhhNoXVhd7vKG/XpMmaa7CDz/kfXfHHeFv92jiZW4ucOqpwL59xoqrVsinGkjOz08+cRe0bTbOlQ4HXz9lCvvL4Rh9gyDU4k2xkrM5UMIt6vu7Dv6eC2aDJdDxra5tero2rpqbKdYmJlIIPX6cxzd640lt2Hz4IcXZgQH3DYiODgq0x4+zfTabJu52d3PMDQ6yTer5o0eZSmHiRGvOuT4Q0VYQBEEQBEEQBPPRi0Tp6VzsZ2S4585Twm0khYBoqUTtTUyYNIkOW32xIiDyjmXPEGqz2mEmVnBwBor+euXnM6dkSwtFkLg4nkNKCvDEE+Fvv2fRvAMH+JkFBRRxXnwxdl3bo40Zb4J2YiLF7Lg4irQHD46+QTAWR3Us5Ww2G3/XAfD/XDg2xPTXNj+f38H79/NzOjs5T+TlAbfeavw9pzZsamr409ICFBVRvO3o4Ibu5Ml8bsYMjvn4eDpwW1r4uvR0unBdLj43YQJTOUTZd42ItoIgCIIgCIIgmIunqOdw0DFjt3Ox2NzsXgk9UkKA2eHhweLpoNIXczEzdHk8hVD7wwoOzkCorqbbfXCQTrfBQYbeJyRQDGlpoXv74osjE2pcVsY54vhxoL2dok1VFQXKxYspwMSqa9vfmPHlxj37bOCyyyjejbZBMFYHfLQX6AqWcH0n+LsOe/bwNUNDI5+rqWEbwrEh5nlt8/P5Hexw8NxraoAzzgDOPTf08/ZHWRkd/cnJwFtvcV5KT6d4O3kyzzk1le3Mzmbbjhxhrt2kJC1ve1wc54ziYmDmzKj7rhHRVhAEQRAEQRAEc/EU9fS5GfPz3SuhZ2VFRggIZzh/pNy74QpdDrb94y2EOpqprAR++UuKtn19TE8yYQKvUVISf4qKKKC88QYFm3A71iorgWef5b148snA7t18fGiIqRHS0zlPjBfXtp6xOLiNcMBHc87mYAnXd4K/61BWxgJaAHDVVSPzu2/bxu/Js882fkPM17W12VjAbMoU9zaFg7Iy4MkngUsu4XxTW0sRFqBgPHMmvzsACsyNjcxzGxdH121KCu+L1FQ+n57ONAlR9F0joq0gCIIgCIIgCObiKerpczM2N1OI6O/nQrG+PvxCgK9FdEYGUFLCRfDvfgf89KcMuwyGSLp3wxG6HEr7JYQ6OlCi1JEjdLH29FDs6O7m/TdxIu9RFXpcWxt+x5o3F35bG8OhExNHuvDHi2tbT6gObqMc8NGYszlYwpnixd916Ojg5oT6d3a29pzNxvtg3z664b0x1g0xK1xbu52O/nPPHbk5UVXFOUuJygsWULTt7OR3c2oqHbYqL77DEXXfNSLaCoIgCIIgCIJgLt5EPX0OvaNHKSB1d7PwULgXi94W0UocamlhnrzPP2f477/8S+Bt2bcPeOQRLionT+ais6cnfGHdRocuh+o0G28h1NGIXpRasoQbJMeOUfRQAq4KR+7ooNs2Li78jjXPe9Hp1AoOqQr2yoWfna2JVA4H3cCRzB/s6UCfNIlj26g2GO3QN9IBH005m0MhnCle/F0Hp1P7DPVvPVlZ/N3eTgHXEyM2xKxybb1tTniKympzqbeXAm5xMfvIZova7xoRbQVBEARBEARBMBdfol5+Phei27ez2Mgdd3DRFu7FouciurkZ2LqVQlBKCoUihwP49FOKmIGIrfv2AXfeSWdQWhrQ1ER34OzZ4QvrNjJ0eSxOs/EUQh2t6EUpu51hx59/zsI9Srjt7OQGSlYWXweE37HmeS8mJdFBp6rJq3YpQau7m//+wx94j0UqF7WnA93ppHCUksJ2jrUN4XDoG+2Aj5aczaEQzhQv6jp0dVFYdDo5ZrKy+Bvg4+rfeuLjgZwcbrJMnx6+DTErX1tPUbmpCfjLX9gnNhudylH8XSOirSAIgiAIgiAI5jKaqDdlCvDtb3NRGgn0YkZGBrBjB3D4MBfBqr3x8UBhIUXM0cTWykqmUqiqogidnk7RqaGB4u/SpeEL6zYqvHWsTjMrhNkKvvEUpaZP50bJoUN0rw0Pc8zm5LD4V3NzZBxrnsKiZ77r/n7ei0lJbGNFBV2HCQlsm5G5qH3h6UDv7QU++ohpHHJygNNPp/AdahvClUtVHPCBE84UL6WlHCfvvMPvkKEhjum8PG6eqByunp87PMx59OyzOebG84aYXlQuL6fbNka+a0S0FQRBEARBEATBfKwk6unFjL4+Vu8eHOTi2W6n6zQlhWLKnDn+xUrlUG1u5mI6PZ3HSEqi6KTSLixbFr5iXEaEtxrhNLNKmK0wEk9RymajODs4yI2FuDiKRHPncsxGSgzyJizq810PDFCoAuhmb29nmoS5c43NO+oLTwc6QAf+4CCF75YW4OBB4MwzQ2tDOHOpigM+cMIpcFdVsYBWby/vswkT+HhNDTdNpkzhvbl9O0Xc9HT3a3TbbXy90d+dvtJxRKqQ5liIoe8aEW0FQRAEQRAEQbAGVlloKTHj00+BDz6gmy85mQv1wUEu0uPigOPHKXjk5fkWK6urudhOS+P71LEA95ycjY3hLZAy1vBWo5xmVg6zHc94E6VUXunKSuCLL3jdBwYiX4TIU1icMIGi7I4dbGdSEl2t06ezfSedZHzeUV94OtDb23k/Z2Wx7Z45d4NtQzhzqQLW2iwDrCsIhkPgdrn4/bBuHfNEX3ABcOAAx8vgIK9vby/D/UtL6S5vaGCER0HByGtk5Henr3Qcp5zCTcxIFNIcKzHyXSOirSAIgiAIgiAI1sEqC61ZszShNS6OIavKIZuaSnGov5+L6AkTvIuVlZXAL39JcSk1lSJvaysX0+npfE1iIhfstbXAOedYNxRZQqljG1+iVGIiQ7eLi4FrrwXmz4+8kOZLWLz+eorKhYW8/xwO4Cc/CU/eUV94OtD1hdKAkTl3g21DoA73sRRes8pmWTjy9hqJkQK3Otft27XvB6eT16G8nJt4FRVaSp6ZMznvVlXxu+Mb3wBOPpmicXW1dr2M+O70lY7j/feBl17i3DB3bmRSjwgi2gqCIAiCIAiCECVE0oVVU8Pw68JCup26u7mwjo+nYGm3U1gYHOTC1lOsVAvfI0e4uM3IoOB75Ahdi6WldON1dvLYBQXWDkU2I5Taqq67WMWXKLV4sfm5IAMRFqur3d3gw8MUM1VhJ8B4N7unA92zUJo+5y4QfO7TQBzuRhReM3uzLFx5e43GCIFbf67p6dr3g8pxftpp/O4ZHASKiugiHxxkPvRTTwW2bAGeeILfGU6nseK2r3QcGRkc0w6HtkmiXp+by++1DRuA1atljjYYEW0FQRAEQRAEQbA+kXZhdXZquWvT0vjv/n4uYlV+z95eipWXXuq+UNUvfJcs4cJaFU46+WQucJuauAju7uZ5rF4dflFirCJoJEOpre66i1Ws4rr0xmjCot4Nnp9PV6IKNY+L4/g//3xj3eDqM3fuZPEjp5PzRXs754aODrqUs7JCc6SP5nA3o/Ca0YQzb+9onxvKOB+LwO15rg4Hr53druU4370b6OrimBkYcBf9W1o0cXfSJLbDyOvtKx2Hw8Eokfx8/j58mPO/ur9cLrZr6VJgxYrQP18YgYi2giAIgiAIgiBYGzNcWBkZDAtvb2dag4kT+fk9PRRmhoe5mD7vPODcc93fq1/42u3uhZMyM1lYpq2NDqWFC4H77mO4aTgxSgSNhKi3bx/wyCPAsWOai7mnJ7qEqGjGbNdlqCg3+J49wN/+xr9zcnivHj/OFCcNDRRzjRo/djvzfL76KrBtG8W14WHeG62tdCXOmEHxNhRHuj+He21t5AuvhYNw5+31hlmbQp7nmpXFMaE29VQO5OFhPtfa6i76799PIVelLomLM/Z6+0rHodJ+TJjA1A07dmhtTEjg80ePAs8/z+9KmZ8NQ0RbQRAEQRAEQRCsi1kurNJSLjyPHeOCVKUwUA7b5mYWPrrrrpGf67nwVQWd9u/neQwMcAG8aBHw7W+Hf4FrtOgdTlFv3z7gzjsprKWl0ZGcl0dBJZqEKME4gnFEzprFkPKUFL6mq4ubK6WlfK652djxU1kJvPkmhVOXi+Ls4CCPHRfHsdvWNjZHui+HuxmF18JBoHl7jcpFbGYqBs9ztdncN/UyMri5MDxMcTQri8/ri9wlJ3OsKfetOo4R1zstjeO3upqbillZWrG/+HjeT11dfKykRBt3NhsF3a4umZ8NRkRbQRAEQRAEQRCsixkuLMDd4QZw0drRQQHX6aRbds0a7w5Zb3ko8/Mp4Kgw0+5u4I47KLyEE7NE71CorAR++lMKtrm5zPc4MKCFAy9dGj1ClGAMno7IpCSKsmee6b0oWk0NRdLzz6fwpfLZ6sUno8aPurcOHaLQ1d/Pz0xIYBvT0+mkv+EGfv5YHOneHO5mFF4LB4Hk7TUqF7HZ86Gv7wa1qXf0KOe8jAy27bTT+DzAsTwwwDFWUsIxpWes17uyEnjlFaY+aGmhCJufT9E4L49zckUFX5ubq/Xd8LCWBmTmTJmfDUZEW0EQBEEQBEEQrEukXVh69A63ykqKQXY7H7/pJt8pDXzloVThsPX1LCgTiUWtWaJ3sCgxpbmZ1zQ9nX2dlKTlety/H1i2LDqEKGHseDoie3uZ+uCDD1j0aN48il36kHY1X6Sn0+nqiZHzRU0NsHUrNxUGB3lvZ2drBZu6u7kBkZVlzL3l6XD3LLzmiZFiZzgZLW9vsHmA/WH2fOjrXPPzKYRu3850GhdfzDHe3Mw5MC1Ni/jQu2/1jOV66++1U04BPvuM90hNDVOLzJvHzYi0NLppXS4tz3tHB4t0zp7N++7oUZmfDUREW0EQBEEQBEEQrEskXVjeCCWHq788lKHktfRFIGHjoYjeYy1YFgp6MUUVaVPhvzabluuxsTE6hChhbHg6IltamDO2p4eOPoeDj+3c6R7SHsn5wuHQXLYFBZqIpjYajh3j8w7H2D/LG0aKncHe80bOEZGaLwFzNwGB0c91yhQtZc7kye4pMZKSeL0B9snwMMeW08n8tvX1wOLFwYvb3tzH6en83OZmjuO9e4FrrgGuvRZ49ln2T3c3UyYUF7Nd+flsj8zPhiKirSAIgiAIgiAI1iWSLixfhJLD1VceylDzWnoSaCGdYEUsswr0KDGltNS9MI+63omJdHTV1gLnnBPe6y2Yj17EB/jvnh73MdHVxaJHR49qIe2RnC+UcJWd7d21mZxMEcssATBQsTPYez4cc0S450uF2ZuAQODn6m3DsLuboumWLRz/+pQ9RUXAzTcHL257cx97S+dz3XX8HmxsBD76iPdQcrKWeiRS38fjDBFtBUEQBEEQBEGwLnY7cPnlFCU2b+bCsqiIAo7RLiyjCcWlGwjBFNIJRsQys0CPElN6etwL82RmUrBVAllBgXWvd7RihrN6NPSOSOWqVeIQoI2J/v6RIe2Rcm1mZPDYvb1aDlKFKliYlmYNAdAXwd7z4ZwjwjVf6rHCJiAQ+Ll62zC8+GJg7VpGJCQlac7u9HQWxTvppOCugS/3sc3GDYn0dODAAV5nux246ir2U0sL76+hofDcXwIAEW0FQRAEQRAEQbAylZXAa69xYdnQAHz+OReX06Zx8X3GGawU73JZc6EYikvXH8EW0gnUjQeYW6DHU0xRhXlaWnjtu7r4/OrV4XX8jjfMclaPht4R6XQyBUFCgvZ8fz9Ds1W+T31Ie6Rcm1lZLCR4+LD7BoPK85mYyHnKs2CU0YQqdgY7l0SiiJfR86W340dK1A+kLfpzdbmYp9jfNXS5mNe5tBRYvpxjTRXaA0K7BsG6jyN1fwkARLQVBEEQBEEQBMGKuFzApk3A889TsJs1Cygvp3CrXHUAF7mvvGINoSkShFJIJ5BFdnW1uQV6vIkpy5bxetfV0Ul2332+i78JwWOms3o09CJ+SQkFWpXnWF+tPiuL//YMaY+Ua3PpUordAwMMI+/sZFuLiigyL1sWmVDxUMTOYOcSM4p4hcMFbkXRMdDNE3UNSku9C6yhXINQ3MeRuL8EACLaCoIgCIIgCIJgNSorKcS+8goFpQkT6LabPZuL2f5+Pp6WxvymPT3WEJoiQaiFdEZbZJtdoEe10ZuYcs454uAymki4JseCXsSvr2eIdlsb29fZqVWrB3yHtEfStdncTFdtXBzDxR0ObjRYOVQ82Hs+0nNEOF3gVhIdg9k8Ccc1CNV9HO77SwAgoq0gCIIgCIIgCFZAOao+/RR4+WUtLD47m0JIQwPQ3k73Wk8PCxB1dfEnO9saQlMkGEshHX+LbCsU6AGsJabEMma4JoNFL+Jv3coCSI2NbFt5OdMPVFSYm0fTc6Ohs5P3yeLF1t9oCPaej+QcEQkXuBVEx2A3T8J1DazoPhYAiGgrCIIgCIIgCILZKEdVZSWwezfDjO12utWSkijapqZSoO3v50I7MZF/O508hlWEpnCgDxFOS+MCfvduYwvpWKVAD2ANMSXWsYKzOhD0Iv6nnwIffkjhtq3NOqJStG40BHvPR2qOsLoL3EiC3TwJ5zWI1nEc44hoKwiCIAiCIAiCeegdVZmZFGH7+ykoDQ6yyFhCAgVal4vPqd+qEJHCKkKTkXgLEc7JoZBtZCEdKxXoEcKPVZzVgaBE/KlTgUsvtaaoFI0bDcHe85GaI6LBBW4UwW6ehPsaROM4jnEsMLv5p76+Ht/4xjeQm5uLlJQUlJeXY/v27SeeHx4exgMPPIDi4mKkpKRgxYoVOHjwoNsx2tracMMNNyAzMxPZ2dn41re+ha6urkifiiAIgiAIgiAIejwdVQkJTIEAMI9tXBwXo3Y7nbYuFwv+9Pay+FBenntldisJTUagBO1du3ius2bxd309n584ka7kAwf4e9GisYUNqxDZhQuNPa5gPZRjr7aWDj09yrFXVhYZZ3UwKFGpvJy/rSDYRjPB3vORmCMCETL7+mJjc06/eeINb99p0TRPu1wscrl3L3+7XGa3KOqwtNP2+PHjOOOMM3DOOefg//v//j/k5+fj4MGDmDBhwonXPP7443jmmWfwwgsvYNq0aVizZg1WrlyJiooKJCcnAwBuuOEGNDQ04J133sHAwABuueUW3HbbbVi/fr1ZpyYIgiAIgiAIgqejqr+fomxyMgXb9HSKs11dFG0TEijYNjZqopNyYkU6hD/cBBIinJ/PRXp3t7GV1SVENvYRZ7WgCPaeD/ccEU0u8LESarqDaJinw1lIbhxhadH2sccew+TJk/G73/3uxGPTpk078e/h4WE89dRTuP/++3H55ZcDAF588UUUFhbi1VdfxXXXXYfKykq8/fbb2LZtG5YsWQIA+MUvfoGLLroIP/vZz1BSUhLZkxIEQRAEQRAEgXg6qhITKcwODPDfyckUclNSNIdtQgJQVERRKTGRKRRiUWgKJES4qornWl5u7GdLiOz4QIoPCYpg7/lwzhFKyNy5k9EE/f1Mg6OiKmJpc24smydWnqcjUUhunGBp0fb111/HypUrcc011+D999/HxIkT8W//9m+49dZbAQCHDx9GY2MjVqxYceI9WVlZWLp0KTZv3ozrrrsOmzdvRnZ29gnBFgBWrFgBu92OrVu34sorr4z4eQmCIAiCIAiCgJGOquRkpkVobwd6eui2TUigo7Sri4v2KVOAu+8Gtm+PbaEpWgpFjWf0BeKs6HQLhGhw7Amxj+e9NG8ei41t20bBNimJ3xHp6cD06bGzOQfE3ubJeCokFwEsLdoeOnQIv/zlL3HXXXfhvvvuw7Zt2/D9738fiYmJuOmmm9DY2AgAKCwsdHtfYWHhiecaGxtRUFDg9nx8fDxycnJOvMYTp9MJp6pCC6Cjo8PI0xIEQRAEQRAEARgZGpqVRafR4CAwNAQcP87FusvF1yYkAGefDaxYwZ9YFprGU4hwNBJLob9WduwJ7sTCRoEnnveS0wk0NHC+nzRJ28Cqq2OUxcUXB36PRUt/xdLmyXgqJBcBLC3aulwuLFmyBD/96U8BAAsXLsRnn32GdevW4aabbgrb5z7yyCN46KGHwnZ8QRAEQRAEQRDgPTR0xgyguRloa+MC/ZRTKFo6HHTc6h1WsbzgCzXXoRB+JPRXMINY2ihQeN5LqanAP/4BHD0KFBYCS5cyDY7Tyd/19SxqddFFowua0dZfVt88CVQAlygRQ7G0aFtcXIw5c+a4PVZWVoZXXnkFAFBUVAQAaGpqQnFx8YnXNDU1YcGCBSdec+zYMbdjDA4Ooq2t7cT7PVm9ejXuuuuuE393dHRg8uTJYz4fQRAEQRAEQRA88AwN7esDpk0Diou5yLbZmM928eLoDBUNFSkUZU0k9Fcwg1jcKPB2L7W3MxXOpEksQllVBZx5pnaf2e2BuTT99VdNDfDVr1IUjmZHayQJRgCXKBFDsbRoe8YZZ6CqqsrtsQMHDmDKlCkAWJSsqKgIGzduPCHSdnR0YOvWrfjOd74DAFi+fDna29uxY8cOLF68GACwadMmuFwuLF261OvnJiUlISkpKUxnJQiCIAiCIAiCG95CQydNojgZ7aGivgjEtRRruQ5jAQn9tT5mhsSH47NjdaPA273kdDI9TmIiz6+lhVEW2dl8PhCXpr/+ys8HPvgA2LoVOPlkFrm0svvWCgS7YSBRIoZiadH2zjvvxOmnn46f/vSnuPbaa/HJJ5/g+eefx/PPPw8AsNls+MEPfoAf//jHmDFjBqZNm4Y1a9agpKQEV1xxBQA6cy+88ELceuutWLduHQYGBrBq1Spcd911KCkpMfHsBEEQBEEQBEE4gbfQ0FgVvYJxLcVSrsNYINZDf6MlB6gvzAyJD9dnx+pGgbd7KSkJiI9ndEViIl+jqzcUkEvTV381NwOffMLjDQ0x/U5CgrluZavfb54COEAR3ekESko413luGEiUiKFYWrQ99dRT8T//8z9YvXo11q5di2nTpuGpp57CDTfccOI1//mf/4nu7m7cdtttaG9vx5lnnom3334bycnJJ17z0ksvYdWqVTjvvPNgt9tx9dVX45lnnjHjlARBEARBEARBGM+EEuZs9VyH44lYDv2NthygnpiZQiCcnx3IRkFdHa+bVcU/b3i7l7KyKOo1NPD5+HgKuUDgLk1v/TU8zP7p6aFY29ZGR29urnlu5Wi43/QCeEsL/93Swr6LjwfS04EtW0ZuGHhGidTVUSifPBm49FL2sxAQlhZtAeCSSy7BJZdc4vN5m82GtWvXYu3atT5fk5OTg/Xr14ejeYIgCIIgCIIgCIERq2HO44lYDf2N9pypZt5b4f7s0TYKamuBzz8Hnn+eQpoVxT9veLuXbDY+5nDQxTllCseiwxG4S9NbfzkcvD5ZWXTx6sVgM9zK0XK/KQG8txfYto2id1YWHcoDAxS/GxuBTz8d2W8qSmTTJuCNN3heR48CL75Ix7PVx6dFkP8JCIIgCIIgCOOWvr4+s5sgjCeCCXMWrIkK/c3LoxjncNB15nDw72gM/fUUHTMzgbg4TXRsaaHo6HKZ3VLfmHlvhfuzlbhZW8uNAT3HjgEffkgBbcoUimR5eRT/nnmGn2tVfN1LiYl0wE6cyOcOHgRaW7kZEoiY6a2/VK7c+HgWOMvLo/ioSEujOBmJtCbRdL9lZFDc3rOHgm1+Pv+22/k7M5P9+tFH3ttbVQW88grF2qlTeV2iZXxahCj6JhEEQRAEQRCEseNyufDwww9j4sSJSE9Px6FDhwAAa9aswW9+8xuTWyfENIGEOUdKOBBCR4X+LlxIMenAgeBEJathxc0Elwuorgb27uXv0QQsM++tcH+2L3GzvZ1FtYaHgS99iSKkVcU/X/i6l84+G/i//xe4+27ga18DbruN/w7k3vLWX3Fx7IfGRiA1leKhfqxHMq2JFe83X5SWMp1EXR3HlWdkQWcn29vQMLK90SROWxjLp0cQBEEQBEEQBCP58Y9/jBdeeAGPP/44br311hOPz5s3D0899RS+9a1vmdg6wTQiURAmlvOhjjdiqUCc1YqrhZLr08x7KxKf7ZkjtL6ewm1CAnDWWUBBgfvro6lAmbd7qbsbeO019zHwwQeBh9R79ldvL48xMACcdhodo4pIpzWx2v3mD7sdOPNMYMMGit8AndD9/XQsp6YC5eVMk+DZ3lgtoBdhRLQVBEEQBEEQxhUvvvginn/+eZx33nn49re/feLx+fPnY//+/Sa2TDCNSBWEidV8qOOVWCkQZ6XNhFBzfZp5b0Xqsz3Fzfp64De/8X3cSIh/Rm126e+lykrg2WfHnu/Vs7+amoC//AVobmZovzpuoLlyjcJK91sgzJ8PzJvH69HVxb6MjweKiznuExO9t3cs4nQkNlGjBBFtBUEQBEEQhHFFfX09Tj755BGPu1wuDAwMmNAiwVQiWRBGhe3W1jJsd9Ik84QDYXyjF0XS0ihu7d5t7mbCWAp6mXlvRfKz9eJmRgaQkmKe+BeOzS6ji7rp+6u8nHly9W7l5GSO7SuuiFxak2jbvCstBZYuBXbuZP/191P0VjmBKyq8tzdUcTqYcTUOxF0RbQVBEARBEIRxxZw5c/C///u/mDJlitvjf/nLX7Bw4UKTWiWYghkV572FOZshHAjjF2+iSE4O802auZkw1nBqM+8tMz7bTPEvXJtd4Q6p95aKYdIk9tXevZER/qJt807f3qNHtfZ2dPhvbyjjM5hxFakIGZMR0VYQBEEQBEEYVzzwwAO46aabUF9fD5fLhQ0bNqCqqgovvvgi/vrXv5rdPCGSmJVzL5byoQrRhS9RpLaWou3EiSwEZcZmgj6ceniYOTSdTs3VF0i4v5n3VqQ/2yzxL5ybXZHI9+qZiuHxxyMv/EXb5l0o7Q12fOrHVVkZReGWFt7/ZWW8VmpcVVVFLkLGZES0FQRBEARBEMYVl19+Od544w2sXbsWaWlpeOCBB7Bo0SK88cYbOP/8881unhBJzCwIEyv5UIXoIRCxLT+fgkd3d+Q3E1Q4dU0NRZ2WFhbbio+nwDNxYmDh/mbeW5H+bDPEv3BudkUy32skU+N4I9o270JpbzDjU42r1FTgo4+83/+VlUB1deQjZExERFtBEARBEARh3HHWWWfhnXfeMbsZgtlEW0EYQRgLgYhtVVUUOsrLI9++0lKmaXj9dbrrsrOBhARgYIBh2YcPA5dfbp1cn1Yh0uJfODe7IpXywYzUON6Its27UNob6Pjs7ASOHeNPXx/d9er+b2gAjh8HCgqAAwfMiZAxCRFtBUEQBEEQhHHFtm3b4HK5sHTpUrfHt27diri4OCxZssSklgkRRy8QqHBMFY6dmWm9gjCCMBbMdJYHg83Gn+Fh/j08rD0WrYS7YFIkxb9wbnZFKuWDWalxxiuBjM+0NKCpCejqAkpKtOuSlMQIgKNHORcMD0fHPGYQIY306dOno7W1dcTj7e3tmD59+pgbJQiCIAiCIAjh4rvf/S5qa2tHPF5fX4/vfve7JrRIGIHLxRDIvXv52+UKz+cogSAuDtiwAfjb34D33uPvDRv4uJUKwgjCWNCLbd4w21leUwO0tQFnngkUFwO9vcyv29vLv888k3/X1JjTvlCprAQefRR44AHg4Yf5+9FH+Xg0oja7ams1YV2h3LBlZaFvdqmQ+oULeb0PHODvRYuMS1kQyAZGX1/MCH9RxWibM2lp1p7HDCYkp211dTWGhoZGPO50OlFfXz/mRgmCIAiCIAhCuKioqMCiRYtGPL5w4UJUVFSY0CLBDbMrQusdfoIQS0Qq9DxUlJA2axZdeZ6FyIaGKOBFk5Bmdt7UcBAJN2w4Uj7o3c4OB8eVpMaxDt3dQGEh0NzMn8xMIDER6O9nFExmJh23WVnWnscMJijR9vXXXz/x77/97W/Iyso68ffQ0BA2btyIqWIdFwRBEARBECxMUlISmpqaRkSINTQ0ID4+OE/Dc889h//6r/9CY2Mj5s+fj1/84hc47bTTfL7+5Zdfxpo1a1BdXY0ZM2bgsccew0UXXXTi+Q0bNmDdunXYsWMH2trasGvXLixYsMDtGGeffTbef/99t8duv/12rFu3Lqi2W5JICxwqr+HQEHDVVSPTI+irVYvbVoh2IhV6HiqeYffZ2e7PR5uQZpW8qeEgEgXQjEz54LkZmJTEUPxjx4Bly2Je+BsT4U7tocjIYM7awkKtEGFnJwuRFRdzvhoepmhr5XnMYIL6X+kVV1wBALDZbLjpppvcnktISMDUqVPxxBNPGNY4QRAEQRAEQTCaCy64AKtXr8Zrr712woTQ3t6O++67D+eff37Ax/nzn/+Mu+66C+vWrcPSpUvx1FNPYeXKlaiqqkJBQcGI13/88ce4/vrr8cgjj+CSSy7B+vXrccUVV2Dnzp2YN28eAKC7uxtnnnkmrr32Wtx6660+P/vWW2/F2rVrT/ydmpoacLstixkChz6vod0+UiSyYl7DSC2ghdgkEmJbqFjdCewLX/dkrOdNjXQBtFDxtRl47BjH1JYtHG8xLPyFTCQjX/T3/xlneN9EVfe/3W7decxgghJtXf/MJTVt2jRs27YNeXl5YWmUIAiCIAiCIISLn/3sZ/jSl76EKVOmYOHChQCA3bt3o7CwEP/v//2/gI/z5JNP4tZbb8Utt9wCAFi3bh3efPNN/Pa3v8W999474vVPP/00LrzwQtx9990AgIcffhjvvPMOnn322RMu2W9+85sAmI7MH6mpqSgqKgq4rVGBGQJHtBRmUpidOkKIDawqtlndCewNf/fk4GB0zS+hEMkCaKHgbzNw2TIKtgCfj2HhLyQiHfmiv/8rK3n/5+byMysrR97/Vp3HDCaknLaHDx82uh2CIAiCIAiCEBEmTpyIPXv24KWXXsKnn36KlJQU3HLLLbj++uuRkJAQ0DH6+/uxY8cOrF69+sRjdrsdK1aswObNm72+Z/PmzbjrrrvcHlu5ciVeffXVoM/hpZdewh/+8AcUFRXh0ksvxZo1a3y6bZ1OJ5xO54m/Ozo6gv68iGCGgBrOKuhGE4u5Mf0hjuLwYlWxzcpOYE9Guyevvjo65pdYvtdG2wycM4fX7/bbGXYfa+cfKmal9gj2/rfqPGYgIYm2ALBx40Zs3LgRx44dO+HAVfz2t78dc8MEQRAEQRAEIVykpaXhtttuC/n9LS0tGBoaQmFhodvjhYWF2L9/v9f3NDY2en19Y2NjUJ/99a9/HVOmTEFJSQn27NmDe+65B1VVVdiwYYPX1z/yyCN46KGHgvoMU1ACalcXQ6H1BYhstvAIHNESjh3LuTG9IY7i8U00OOgCuSe3buV57N5t3fkl1u+1QDcDs7KA8vLIts3KmJnaIxru/wgSkmj70EMPYe3atViyZAmKi4th87yIgiAIgiAIgmBhDh48iH/84x9eDQgPPPCASa0KDL3YXF5ejuLiYpx33nn44osvcNJJJ414/erVq90cvh0dHZg8eXJE2hoQyuXlcLDgyN//zsVZXx8Xh3l5wPz5FEeMFjiiJRw7nAtoq7nsxpujWPCO1R10gdyTVVXAjTdyLrHi/DIe7jWjoymsNl+GC7NTB1n9/o8gIYm269atw+9///sTObcEQRAEQRAEIVr49a9/je985zvIy8tDUVGRmwHBZrMFJNrm5eUhLi4OTU1Nbo83NTX5zDVbVFQU1OsDZenSpQCAzz//3Ktom5SUhKSkpDF9RtjQu7yOHePv48cpesTHc4Hc0MDHly0Lj8ARDeHY4VpAW81lF4uO4vEi8ow3Ar0nCwutOb/E4r3mDSOjKaw2X4aTaEodFOOEJNr29/fj9NNPN7otgiAIgiAIghB2fvzjH+MnP/kJ7rnnnpCPkZiYiMWLF2Pjxo244oorALBo78aNG7Fq1Sqv71m+fDk2btyIH/zgBycee+edd7B8+fKQ2wGwiBoAFBcXj+k4EUfv8po0ic4uQEuNkJJC4dZuBwYGuLj2cEUbhtXDMcOxgLaiy87MkNxwMJ5EnvFGMPfk1KnWm19i7V7zhVHRFFacL8NJtKQOGgeENEv867/+K9avX290WwRBEARBEAQh7Bw/fhzXXHPNmI9z11134de//jVeeOEFVFZW4jvf+Q66u7txyy23AABuvPFGt0Jld9xxB95++2088cQT2L9/Px588EFs377dTeRta2vD7t27UVFRAQCoqqrC7t27T+S9/eKLL/Dwww9jx44dqK6uxuuvv44bb7wRX/rSl3DKKaeM+ZwihqfLa3gYaG3l40lJXBCnpQFTpgAnn0zBw+EAXnghfMKtCscsL+dvqwi2gLaArq1lX+lRC+iyssAX0J79n5kJxMVpLruWFrrswtXXvgjEvdjXF76QXCNRIs+uXRSGZs3i7127+HhlpdktFMZCsPek1eaXWLrXRkNFUyxcyO+ZAwf4e9GiwMRWq86X4USJ3Xl5FLsdDmBwkL8rKsxP7TGOCMlp29fXh+effx7vvvsuTjnllBFVdp988klDGicIgiAIgiAIRnPNNdfg73//O7797W+P6Thf+9rX0NzcjAceeACNjY1YsGAB3n777RPFxmpqamDXLWhOP/10rF+/Hvfffz/uu+8+zJgxA6+++irmzZt34jWvv/76CdEXAK677joAwI9+9CM8+OCDSExMxLvvvounnnoK3d3dmDx5Mq6++mrcf//9YzqXiOPp8nI6gd5eigQqlcPAAJ22ycmamBsLzq9QMDr3rlVddrESkhstoeeSuiF0oiUfti9i5V4LlLFEU1h1vgw3nqmD6uqAoSH2w6WXsj+FsBOSaLtnzx4sWLAAAPDZZ5+5PSdFyQRBEARBEAQrc/LJJ2PNmjXYsmULysvLRxgQvv/97wd8rFWrVvlMh/Dee++NeOyaa67x6/K9+eabcfPNN/t8fvLkyXj//fcDbp9l8XR5JSVx8Ts0RAcTQCF3cJD/7u/na1yu2HB+hcJYcu96inMOh7lFZnwRKyG5VhJ5fAmzkrph7ERDPmxfxMq9FgyhFrcyuyiXmSixe9Mm4I03uElx9Cjw4ovAJ58ENl/I5tCYCEm0/cc//mF0OwRBEARBEAQhIjz//PNIT0/H+++/P0IAtdlsQYm2Qoh4uryysuhMa2qiUGuzcVEXH08BoaMDmDAByMmJHedXKITiFvMmzhUWUhS3mssu2t2LCquIPL6E2VNOAd58c/zk5wwnVs+H7YtYudciwXhzJXtSVQW88grni6lTg5svZHNozIQk2gqCIAiCIAhCtHL48GGzmyB4c3ktWAAcOULhIy6OQi4ANDezKFl6Ol8bS86vUAjGLeareM7hw0BjIxfRy5ZZy2UXze5FhRVEHl/XfudO4LXXgOxs92tvtdQN0USoDk6ziYV7LRKMR1eyYiypXsZb8bYwEZJoe8455/hNg7Bp06aQGyQIgiAIgiAIQozjzeWVkwMsWQL87/8yHQLABd6ECRRsp08X51cw+Ftsz51Lcby9Hdi3z31BbQWXXbS6FxVmizz+rv3EicC2bXSxexLL+TmNJJbCvaP9XosE49mVHGqql2jJ6x0FhCTaqny2ioGBAezevRufffYZbrrpJiPaJQiCIAiCIAhho66uDq+//jpqamrQrwTCfyJFdSOEN5dXVhbwzW9SPGhu5sIvJ4eLPHF+Bcdoi+05c4BDh4Bp05iWwmouu2h1LwLmizz+rr3KD93RwdzG2dnuz8dyfk4jiMVw72i+1yLFeHUlh5rqxUp5vaOckETbn//8514ff/DBB9HV1TWmBgmCIAiCIAhCONm4cSMuu+wyTJ8+Hfv378e8efNQXV2N4eFhLFq0yOzmjS98ubwAcX6NlUAW20lJwDe+QbFc+tpYzBR5/F37pCT+OJ388cRK+Tmt5mi1Sri31fplvDAeXcmhpnqxSl7vGMDQnLbf+MY3cNppp+FnP/uZkYcVBEEQBEEQBMNYvXo1/uM//gMPPfQQMjIy8Morr6CgoAA33HADLrzwQrObN/7w5fIS983YCHSxnZUlfR0uzBJ5/F37rCw+VlcHJCa6P2el/JxWc7RaJdzbav0y3hhvruRQU71YIa93jGDobLJ582YkJycbeUhBEARBEARBMJTKykrceOONAID4+Hj09vYiPT0da9euxWOPPWZy6wTBINRiu7aWi2s9arFdVma+OBfrKJGnvJy/I+HK83ftAeaILiqi083hAAYH+buiwhr5OfftA37yE+C994CEBGDmTLZr1y46XSsrI9+mYMK9w4Vy+u7axf6YNcv8fhFiG5XqJS+P80Og84V8/xhGSE7bq666yu3v4eFhNDQ0YPv27VizZo0hDRMEQRAEQRCEcJCWlnYij21xcTG++OILzJ07FwDQ0tJiZtMEwTjMzqsqmMdo1376dODii4E9e6yXn3PfPuDOO4GqKra5qYljdfZscwsYmR3ubRWnr2Ac0ZLmIpRUL/L9YxghibZZWVluf9vtdsyaNQtr167FBRdcYEjDBEEQBEEQBCEcLFu2DB9++CHKyspw0UUX4d///d+xd+9ebNiwAcuWLTO7eYJgHNFWPCdaRIxoIJBrf9FF1urvykrgpz+lYJubS0fwwADQ0EBn39Kl5hUwMjvcWwo7xRbRluYilFQv0fb9Y1FCEm1/97vfGd0OQRAEQRAEQYgITz755IniuQ899BC6urrw5z//GTNmzMCTTz5pcusESxELImK0FM+JNhEjGhjt2lspP6dykjY305GXns72JSUB+fl8fP9+YNkycwoYhZrb0yjMdvoKxmGVgnbBEsp8ES3fPxZmTIXIduzYgcp/5k2ZO3cuFi5caEijBEEQBEEQBCFcTJ8+/cS/09LSsG7dOhNbI1iWWBIRrSTOeSNaRYxowOrXXqF3kjY10WGblMTnbDa6W1tagMZGcwoYmR3uHajTNy0NqK6OHoEsFjbGgmE8prmIljnIooQk2h47dgzXXXcd3nvvPWRnZwMA2tvbcc455+BPf/oT8vPzjWyjIAiCIAiCIBjG9OnTsW3bNuTm5ro93t7ejkWLFuHQoUMmtUywDCIiRo7xKGIII1FO0tJSCqANDXTYqvGQmAh0dPD+O+cccwoYmRnuHYjTd9Ik4I9/ZHqJaNhoiqWNsUCRNBdCkIQk2n7ve99DZ2cn9u3bh7J/3kwVFRW46aab8P3vfx9//OMfDW2kIAiCIAiCIBhFdXU1hoaGRjzudDpRX19vQosESyEiYmQREUMANCdpTw+FO4eDKREyMynYdnZy46SgwNwCRmaFe4/m9I2Lo9BdVxcdG03jdWNM0lwIQRKSaPv222/j3XffPSHYAsCcOXPw3HPPSSEyQRAEQRAEwZK8/vrrJ/79t7/9za247tDQEDZu3IipIgoJIiKGTiihziJiGE80hpx7OkmXLuV92NLC8+jq4vOrV8emmBcIvpy+CxZQ4K6vj46NpvG8MWZ2QTsh6ghJtHW5XEhISBjxeEJCAlwu15gbJQiCIAiCIAhGc8UVVwAAbDYbbrrpJrfnEhISMHXqVDzxxBMmtEywFCIihkaooc4iYhhLtIace3OSLlumuUfz84H77gPmzjW3nWb3rzenr8sFPPhg9Gw0jeeNMbML2glRR0jbFueeey7uuOMOHD169MRj9fX1uPPOO3HeeecZ1jhBEARBEARBMAqXywWXy4XS0lIcO3bsxN8ulwtOpxNVVVW45JJLzG6mYDZ6EdEbIiKORIU679rFfKSzZvH3rl18/J/Fq72iRIzaWooWepSIUVYmIkYgjOU6WAHlJF24EGhtBQ4eBAYHmcP2/vutIdhaoX9VYafycv7u7h59o6mvzzobTYFsjFmpvUaiNify8rg54XBwjDsc/DvcBe2iHZeLhfb27uXvcWAaDclp++yzz+Kyyy7D1KlTMXnyZABAbW0t5s2bhz/84Q+GNlAQBEEQBEEQjOTw4cMjHmtvbz9RYFcY54gTKnDUAnrdOuDIEWDJEk1sCDTUebRcnSJiBEashJyblTN2NKzcv9HmVo+29hqNmQXtohmzXe4mEZJoO3nyZOzcuRPvvvsu9u/fDwAoKyvDihUrDG2cIAiCIAiCIBjNY489hqlTp+JrX/saAOCaa67BK6+8guLiYrz11luYP3++yS0UTEVExMBQC+jt24EdO4DUVMDp5CI6P5+vCTTUWUSMsRNLIefKSWolrNy/0bbRFG3tDQdW3ZywKuO1cB2CFG03bdqEVatWYcuWLcjMzMT555+P888/HwDgcDgwd+5crFu3DmeddVZYGisIgiAIgiAIY2XdunV46aWXAADvvPMO3n33Xbz99tv47//+b9x99934+9//bnILBdMREdE/+gV0ejoX0BkZzD/qcLCIlBJuA80BLCLG2JBczOHFyv0bbRtN0dbecGHFzQkrYmWXewQISrR96qmncOuttyLTi4U9KysLt99+O5588kkRbQVBEARBEATL0tjYeCLF11//+ldce+21uOCCCzB16lQsXbrU5NYJlkFERO94LqAdDiAhgf2Sn88q9vv3U3ix2YILdRYRI3TGe8h5uPHVv8PDvAdaW5mb1JeoG26ibaMp2tormIeVXe4RICjR9tNPP8Vjjz3m8/kLLrgAP/vZz8bcKEEQBEEQBEEIFxMmTEBtbS0mT56Mt99+Gz/+8Y8BAMPDwxgaGjK5dYKlEBFxJJ4L6KwsCrQNDRRtMzMp6DocfC6QUGeXS8TxsSIh5+HFW/+qDYrmZqCtjeP/j38ErrrKHNEx2jaaoq29gjlY2eUeAYISbZuampCQkOD7YPHxaG5uHnOjBEEQBEEQBCFcXHXVVfj617+OGTNmoLW1FV/5ylcAALt27cLJJ59scusEweJ4LqBtNopZDgfFq4wMoL+fzsP6+tFDnVVu3MpKCl92O493883A3LmROqvoR0LOw4tn/6amsoK9EooKCoDycmD3bva3WTk2o22jKdraK0SecR5FENSMPXHiRHz22Wc+n9+zZw+Ki4vH3ChBEARBEARBCBc///nPsWrVKsyZMwfvvPMO0tPTAQANDQ34t3/7N5NbJ4x7XC6gupqCUHU1/7YS+gW0Ij+feWyLi4GODqCnh88vWuRfvFK5cd9/Hzh0iIJYVRXw3/8N/Mu/AH/9a2TOKVZQIecLF1I0P3CAv0e7DkJgqP6dPx/Ys4ebFCkpdIcuXw5Mm0YXbksLc2xa7d4VhGhEudxraxk1oEdFEZSVxWwUQVBO24suughr1qzBhRdeiOTkZLfnent78aMf/QiXXHKJoQ0UBEEQBEEQBCNJSEjAf/zHf4x4/M477zShNYKgQ7lO9++nmzU5mYvVK6+0juDmKww/Px/IzQW2bwdmzADuuIMOOl/OTpUb99AhCos9PUynkJ1Np25dHfDwwxTCxHEbOBJyHl7KyoCvfx3YuROYN49jPitLuw/GQY5NQYgo4zyKICjR9v7778eGDRswc+ZMrFq1CrNmzQIA7N+/H8899xyGhobwwx/+MCwNFQRBEARBEIRQef311/GVr3wFCQkJeP311/2+9rLLLotQqwRBh3KdtrQwX6xalO7axcWqVZySoy2gp0wBvv1tYPp0/8epqeE5d3VRsM3P14Sv5GRg4kSgsRF44QXg0UdjdkEeFiTkPLx0dwPx8RzrXV3AsWNAUpIm3sZ4jk1BiDjjuHBdUKJtYWEhPv74Y3znO9/B6tWrMfxPa7LNZsPKlSvx3HPPobCwMCwNFQRBEARBEIRQueKKK9DY2IiCggJcccUVPl9ns9mkGJkQeZTrtKXF3b2amcm/KyoYbj1rljXESyMW0J2dzGHb2enuVFQkJfFHHIuC1cjIAJxO4B//oGg7OEgRNy+PLvTExJjOsSkIpjBOowiCEm0BYMqUKXjrrbdw/PhxfP755xgeHsaMGTMwYcKEcLRPEARBEARBEMaMS5db0CV5BgWrUVND8XPy5JHipVXDrce6gM7I4Gv7+pgSwZP+foq2Lpc4FgVr0d1NF3h9Pe/NxERgYABoaADa2ynenn12zObYFATTGIdRBEGLtooJEybg1FNPNbItgiAIgiAIghBWXC4Xfv/732PDhg2orq6GzWbD9OnTcfXVV+Ob3/wmbJ6CmSBEgs5Oipdpad6ft2q49VgW0Co37p49FGj1NVOGh1nQbMIEICdHHIuCdXC5gNde40bD0BDHaWYmhduMDN6n8fHAZZfFvANQEITwI7OIIAiCIAiCMC4YHh7GZZddhn/9139FfX09ysvLMXfuXFRXV+Pmm2/GlVdeaXYTBU9cLqC6Gti7l79j1SWdkUHRsrvb+/Pd3bEXbm23AzffDBQVMRduby+vb18f0NwMpKQA6elMDyGORcEqKFf83LnA0qVAcTHHbmsrx+6UKRzTvjZgBEEQgiBkp60gCIIgCIIgRBO///3v8cEHH2Djxo0455xz3J7btGkTrrjiCrz44ou48cYbTWqh4EZlpZYzta+PouXs2SyCFWtFR5TrdNcu95y2AF2ndXXMFxtr4uXcucCaNcDatQw3V3lsJ0ygYDt9ekxXBReiEL0rPjOTqRAcDua4TUri4wcPWs8VLwhCVCKirSAIgiAIgjAu+OMf/4j77rtvhGALAOeeey7uvfdevPTSSyLaWoHKSuCZZ1iYa/JkCiHd3RQ1a2tZBCuWhFu7nWJ0bS2Ljk2apJ1zXR2FoVgVLy+5BJg2Dfj97ynQu1xMiTBnTsxXBReiEL0rPjOTGyz6nMwOR+y54gVBMA0RbQVBEARBEIRxwZ49e/D444/7fP4rX/kKnnnmmQi2SPCKy0WHbUuLu+s0M5N/V1QAr77KIlixJGKWlVGMVu7i+nqKP4sWxb54OXcu8Nhj464quOAFl8va42C8uuIFQTAFEW0FQRAEQRCEcUFbWxsKCwt9Pl9YWIjjx49HsEWCV1TOyMmT3QURgH9PmkQnbk1N7FWRLiujGG1l0SpcjMOq4IIH0ZASZTy74gVBiDgi2gqCIAiCIAjjgqGhIcTH+/7vb1xcHAYHByPYIsEr+pyR3khLows1VnNGingpjEeiKSXKeHbFC4IQUUS0FQRBEARBEMYFw8PDuPnmm5GUlOT1eafTGeEWCV7xzBnpSXe35IwUhFgiGlOijGdXvCAIEUNEW0EQBEEQBGFccNNNN436GilCZgEkZ6QgjC+iNSWKuOIDw+p5igXBwohoKwiCIAiCIIwLfve735ndBMEXnov6yy+XnJGCMF4Y7ylRYployFMsCBZGRFtBEARBEARBEMzD16L+4ouBPXskZ6QgxDqSEiV0rOxijaY8xYJgUUS0FQRBEARBEATBHEZb1K9aBXz969YUJARBMAZJiRIaVnaxRmOe4nBhZWFdsDwi2gqCIAiCIAiCEHkCWdS//jpwzz2ywA0nIigIZmO3U2iMhpQoVrlfrO5ijdY8xUZjZWFdiApEtBUEQRAEQRAEIfLIot58RFAQrEJZGYVGNR6tmBLFKvdLNLhYJU+x9YV1ISoQ0VYQBEEQBEEQhMgji3pzEUFBsBplZRQareBk9cRK90s0bHiN9zzF0SCsC1GBjA5BEARBEARBECKPflHvjVhf1JuJp6CQmQnExWmCQksLBQWXy+yWCkbhcgHV1cDevfxt1Wtrt1NoLC/nbysIWla7XwLZ8OrrM3fDS+Uprq1lXmI9Kk9xWVns5ikORlgXBD+I01YQBEEQBEEQhMgjxYfMIxqceoJxWCWsH7BOTthgsNr9Eg0u1mDzFEfjuPCHRJIIBiGirSAIgiAIgiAIkSeaig/FGiIojB+sFNZvJfE4GKx2v0TLhlegeYqjdVz4IxqEdSEqENFWEARBEARBEARziIbiQ7GICArjAyvl1bSSeBwsVrtfomnDa7Q8xdE8LvwRLcK6YHlEtBUEQRAEQRAEwTyMLD4UiRDbWAjjFUEhcKL5elslrN9K4nEoWPF+iaYNL5Wn2JNoHxf+iCZhXbA0ItoKgiAIgiAIgmAuvhb1wRCJENtYCeMVQSEwov16WyWs3yricahY9X4xcsPLDKJ9XIxGNAnrgmUR0VYQBEEQBEEQhOgmEiG2sRbGK4KCf2LhelslrN8q4vFYCPf9Eqqj24gNL7OIhXExGtEurAumI6KtIAiCIAiCIAjRSyRCbGM1jFcEBe/EyvW2Sli/VcTjsRKu+yXaHd2hEivjYjSiWVgXTMfC3zCCIAiCIAiCIAijEEyIrRmf4XIB1dXA3r387XKF3o5woASF8nL+tqIIGek+jMSYigQqrD8vj0KzwwEMDvJ3RUXkwvqVeFxbS7FYjxKPy8qiI4ey0feLcnTv2sXrMWsWf+/axccrK41otTWJpXEhCGFCnLaCIAiCIAiCIEQvkQixDfUzxquDzkjM6MNYCtu2QhoMq+aENZtYcXR7I5B0DzIuBGFURLQVBEEQBEEQBCF6iUSIbSifEQs5Uc3GrD6MtbBtK6TBsIJ4bDVitRBXMBstsTIuQs1JLAijIKKtIAiCIAiCIAjRSyTydgb7GbHsoIsUZvahVXLBGokV8mqaKR5bUVSLJUe3IpSNFitsKoSKywVs2gS88QbPLy4OSEmRiArBMES0FQRBEARBEAQheolEiG2wnxGrDrpIYmYfSth2+DBDPLZqmpJYc3SPZaPFCpsKwVJZCfzqV8BbbwG9vUB6OlBURMFZIioEg5BvGUEQBEEQBEEQohsVYrtwIdDaChw4wN+LFhm3aA7mMwJx0PX1RZeDLtKY3YeRGFNC+LFyoa9YK8QVKwX8AqGyEnj6aeDdd/n31KlAdjbQ1ATs2wfk51O8fvVV6xWfFKIKcdoKgiAIgiAIghD9RCLENtDPiDUHnRlYoQ+jOWxbsH6aklhzdMdiugdvqHFVU8Nrk5vLtAhxcRRrm5uBqiqgvDy0aAArpvIQTENEW0EQBEEQBEEQYoNIhNgG8hmxmBM10lilD6MxbNsX400MioY0JbFSiAuwxkZLJFDjKi8POHIESEjQnrPZeO4tLcDgYPDRAFZN5SGYRlTN0I8++ihsNht+8IMfnHisr68P3/3ud5Gbm4v09HRcffXVaGpqcntfTU0NLr74YqSmpqKgoAB33303BgcHI9x6QRAEQRAEQRDgcgHV1cDevfwdi6GjykGXl0cHncPBBbzDwb/H6qCTPow+F6LZVFYCjz4KPPAA8PDD/P3oo+amBwg3ZqfYCJSyMuDee4G1a4E1a/j7nnuiT6SLtXQPvlDjKisLiI8HBgbcn09M1OaqYERqK6fyEEwjapy227Ztw69+9Succsopbo/feeedePPNN/Hyyy8jKysLq1atwlVXXYWPPvoIADA0NISLL74YRUVF+Pjjj9HQ0IAbb7wRCQkJ+OlPf2rGqQiCIAiCIAjC+GQ8uYjC5aCTPoxOF6KZKDGopYWuUxWCb5ViSeFyAEeT8zMWHN2xlu7BF2pcxcfznBoamBZBubn7+5kqobUVOOuswERqq6XyGG+ufAsTFaJtV1cXbrjhBvz617/Gj3/84xOPOxwO/OY3v8H69etx7rnnAgB+97vfoaysDFu2bMGyZcvw97//HRUVFXj33XdRWFiIBQsW4OGHH8Y999yDBx98EImJiWadliAIgiAIgiCMH6wuHIUDo3OiSh+KgBAsVhODPAnnJsRoKTZqa4Hp0+mIrK6WcWUE42GjRT+uZs3i+Glu5j2VkECxNimJrwtUpLZSKo/xtDEYBUSFaPvd734XF198MVasWOEm2u7YsQMDAwNYsWLFicdmz56N0tJSbN68GcuWLcPmzZtRXl6OwsLCE69ZuXIlvvOd72Dfvn1YuHBhRM9FEARBEARBEMYd3oSj4WE+npvLvIAbNgCrV8eeaGKUg87q4ls4iQUXollYSQzyJNybEP6cnxUVQHs7Q9t/8hMRpowk1jda9OOquRmYO5fn2tjI801NBc4/H7jttsDHklWKuI3HjUGLY3nR9k9/+hN27tyJbdu2jXiusbERiYmJyM7Odnu8sLAQjY2NJ16jF2zV8+o5bzidTjidzhN/d3R0jOUUBEEQBEEQBGF8oxeOAODQIVbX7ujQBNyGBmDpUkBnyBB0WFl8E6yLVcQgTyK1CeHN+el0UrDNzgZOOkmEqXDgbaMlXCH3ZoTye46rvDxgwgTOz5deCpx7bnBtsEIqj/G8MWhhLC3a1tbW4o477sA777yD5OTkiH3uI488goceeihinycIgiAIgiAIMY0Sjnp7gY8/Bg4epMMtMRFIT9eqbT//PDBxoggm3rCq+CZYGyuIQd6I5CaE3vnpcAB/+APD2OfOFWEqUoQr5N7MUH4jHcWjpfKoq2OKiXAWcZONQUti6Vlox44dOHbsGBYtWoT4+HjEx8fj/fffxzPPPIP4+HgUFhaiv78f7e3tbu9rampCUVERAKCoqAhNTU0jnlfPeWP16tVwOBwnfmpra40/OUEQBEEQBEEYL2Rk0N324Yd02QJ0uSkxqakJSEkBuroomLhcZrbWmujFN29YqaiSYB2UGFRbS/FHjxKDysrCKwZ5I5BNiL4+4zYhlPMzK4vzTWnp6MKUYAwq5H7XLjpSZ83i7127+Hhl5ejHcLmYd3jvXv52uYw57lhR46q8nL99Cbbe2u95nCuvZPsrKri5MDjI3xUVkSniFul7UggISzttzzvvPOzdu9ftsVtuuQWzZ8/GPffcg8mTJyMhIQEbN27E1VdfDQCoqqpCTU0Nli9fDgBYvnw5fvKTn+DYsWMoKCgAALzzzjvIzMzEnDlzvH5uUlISkpKSwnhmgiAIgiAIgjCOmDSJLtvmZv6dksLFp93OKtvHj9NxO2OGOHl8YQUnlhB9+MvrWlcXGTHIG2Y5gMWxHlmMCLn35qadOZPHjIZQ/kDdwGYXcbOqK3+cY2nRNiMjA/PmzXN7LC0tDbm5uSce/9a3voW77roLOTk5yMzMxPe+9z0sX74cy5YtAwBccMEFmDNnDr75zW/i8ccfR2NjI+6//35897vfFWFWEARBEARBECJBXR2F2sxMFmtJSKDQODREB25KChAfz7/FyeMdq4pvsYwZuTLDgdlikDfM2oQQYSqyjDXk3ldhrI8/Bj7/HFi+3Nqh/MEW9jKziJtsDFoSS4u2gfDzn/8cdrsdV199NZxOJ1auXIn/83/+z4nn4+Li8Ne//hXf+c53sHz5cqSlpeGmm27C2rVrTWy1IAiCIAiCIIwjOjuBpCTg1FOBjRsp1Pb3cyGang7k5tKJ63CIYOIPK4pvsYqZuTLDgZlikDfM2oQQYSqyjMXZ7M+lW1oK7NmjibKewq0VHNOhuoy9FXGLBLIxaEmiTrR977333P5OTk7Gc889h+eee87ne6ZMmYK33norzC0TBEEQBEEQBMEryt2Wm8vFam0tF64JCRRznU6mSWhtBc46y/qCiZkOTKuJb7FIsO64aMEsMcgXZmxCiDAVWcbibPbn0lXvaWzkZl92duDHjRTRWNhLNgYtR9SJtoIgCIIgCIIgRBl6d9vs2UBHB9DTQ9HW5aJYm5TE11ldMLGCA9Nq4luoWDH9gBE5OIXAMWMTQoSpyDEWZ7M/l25WFlBUxBQJfX3uz0XSMe1vDovW/MmyMWgpRLQVBEEQBEEQBCG86N1tzc3A3LlcEDY2clGYmgqcfz5w223WFkxi1YFpBlYQv70RijvOiuJzNGHGJkQsC1NWGo9jcTbrXboZGXTUOp3c4MvK4nnV1/NcU1Ii75gebQ6L5vzJsbIxGAOIaCsIgiAIgiAIQvjxdLfl5QETJlAcu/RS4NxzrS2YjAcHZqTEHiuL38G646wqPgujE4vClBXHY6jOZuXSff99YGCAERmDgyxamZvLSI2LL+Z3SVVVZB3Tgcxhs2ZJ/mRhzIhoKwiCIAiCIAhCZIhmd1s05icMBqPEntGEX6uL38G446wsPgvjDyuPx1DmfrsdOOUU4KWX6LLNz+dGX3c3cOAA3bbf+x5w0UWR/U4JdA675x7JnyyMGRFtBUEQBEEQBEGIHNHqbovW/ISBYJTYE4jwa3XxO9AcnJMmAY8/bl3xWRhfWH0zBAh+7ne5gD17eK8VFtJpe/w4nbYzZ9Jpu3cvRdtIzhXBzGGSP1kYIyLaCoIgCIIgCIIgjEY05yf0h1FiT6DCr9XF70BzcNbVWVt8FsYXVt8MCQV1TnPnes9p29FhzjkFO4dFc4SJYDoySgRBEARBEARBEEZDOTBra+m41KMcmGVl0ZefMBixxxeewm9mJhAXpwm/LS0Ufl0ud/HbG1YQv5U7buFCuvsOHODvRYuCE5/7+qLTeS1EH7E4HvXnZLMB2dl03GZn82+zzimUOUy5jMvL+VsEWyFAxGkrCIIgCIIgCEJksFJV82AZSxV0K2OE8zUY4TfQ9ANmi9+jueNi1XktRCexOB6tek7RMocJMYGItoIgCIIgCIIghB8rVjX3ZDRRORbzExohjOiF3+HhkWHMeuE3msRvfzk4RbgRrEQsjkernlOgcxgAVFdH5yalYBlEtBUEQRAEQRAEIbx45jtNTQUaGoD33gP27QPuu495C81uYyCicqzlJzRCGFHCb00NX9/SAgwOsmBQXh4wcaK78BsL4reZ4nM0O9aDZTyd61iIps2QQLHyOY02hwHAo49ae5NSiApsw8OeCZkETzo6OpCVlQWHw4FMb7vPYcD2kG30FwmCIAiCIJjI8I8i899IM/4vFstEvD9dLi5elSjY0sKFbEsLMDDABfjs2cCTT5on3PoqolVbS2FA5TGNVfTn700YGe38XS7grruA11+nuzY7m5XdBwaA9na6bi+/HHjiCXeBJRYEOW9if1lZ+MTnaHCs6xnLNY62c7UCkR6PkcDK5+RtfFdVje/vEyEgAv2/mDhtBUEQBEEQBEEIDy4X8PHHwObNQEEB0NwMfPIJ0NPDsPmEBIp8+/cDjzwC/PCHkV/MehbRUk5TVUSrooJFtGbNij5BMVCMcr7abPxRvqDhYe0xb/hLPxAtRNJ57WtzYdcuCkJWE4PGIrpG27lahViLBACsfU6ec5h8n4yNWNjIMxgRbQVBEARBEARBMB4l2GzeDOzeTZG2t5fPTZqkLWYzMujEPHbMnMVsMEW0rCQwGr24HYswUlMDtLUBZ56ppUfo7GR6hOJi9mFrq/X60CgiIT5Hmxg0FtE12s7VasTCZogn0XJO0fp9YgXEWe8VEW0FQRAEQRAEQTAWvWBTUABMmAAMDfHv5GQ6bdPS+Nr+fjpuJ082ZzGrL6LlDX0RLasQyOI2FFE3VGFE9eGsWXy/ZyGyoSHgwAFr9aFRRMoZFk1i0FhF12g6V0HQE43fJ1ZAnPU+EdFWEARBEARBEATj8BRsAFbQPnyY4qwSb1NT+VxHB92YRUXAwYORX8yqIlrd3RSVPOnudi+iZTaBLG6ByDqWPPswO9v9+XD1odmhtJF0hkWTGDRW0TWazlUQ9ETb94kVEGe9X0S0FQRBEARBEATBOLwJNrNnM/1BayuQmMiFa0cH3ZipqXy+p8ecxWxpKT9fFUrTi0zDwwz3X7SIrzObQBa3zz/PNBStrZFzLJnRh2aH0lZWAk8/zfGemwsUFjIdRLj6OZrEoLGKrtF0roKgJ5q+T6yCOOv9Mv5kakEQBEEQBEEQwoc3wSY/HzjrLFbO7u+nqNjdTYft0qV8vK6OIlekF7N2O4W+vDyKng4HMDjI3xUVfPyKK6zh8BltcTtxIvDee3zdnDkUvOLiNFG3pYWOJZfL2HZFug+V23jXLh571iz+3rWLj1dWGvM5vnC5gF/9CvjwQ47bnTuBDz4A9uzhWA9HPysxqLZWK/SmUGKQGfePN/SiqzdGE12j6VwFQaGc/3PnMjXMvn3W/j6xCoFs8vT1jVtnvThtBUEQBEEQBEEwDl8uuYICYOVKYNMmLmAXLABmzKDD1uzFbFkZnZHKuVlfz3NYtIhtskouvdEWt4ODLAg2b17kHUuR6kMrhNJu2gS89RYFxLw8pv0YGAAaGji258wxvp+VMF5by3OcNIku9YYGipj5+cBll1lDDBqr29DbuSrHeF2deXOF2ek4BOvi6fx3Ork5eegQBVwrfp9YBXHW+0VEW0EQBEEQBEEQjMOfYJOfD0yZwn8nJTGHrVUWs2VlFPqsLMqMtrh1OPjbM6esIty5QCPRh2aH0rpcwOuvc7Nh2jQ6mQGO5/x8oLmZYmNenvH9rBfGt26lINTdzeuakgK89hr72mxRyAjR1WobKWan4xCsi6884zU1nBeuvRaYPz883ydGbSSYuSEhKSX8IqKtIAiCIAiCIAjGMZpgM306sGoVH7OaOGq3WzdnnsvFnwkTKBwtWeLeZ8PDzGObk8Pcqt6IhGMp3H1odpGqmhqO48xMOpuVaAtQbMjMBBobeZ3C0c9lZRwHFRUs3peTw890uZimwSqV1o0QXa2ykSKV7QVf+HP+z53L+7SiArj0UuPHrVEbCWZvSFjVWW8RxudZC4IgCIIgCIIBPPfcc5g6dSqSk5OxdOlSfPLJJ35f//LLL2P27NlITk5GeXk53nrrLbfnN2zYgAsuuAC5ubmw2WzYvXv3iGP09fXhu9/9LnJzc5Geno6rr74aTU1NRp7W2FGCzcKFFBIPHODvRYv4+Ny5FPbKy/l7nC7GAqayEnj0UeDBB4GqKuDzz4ENG+i01OdLLC0FvvxlLnRjNRfoWPOljpXOTgq1hYXsd89+TkgAuroo7oWjn10uOmqbm4GhIQotH38MbN/O1BiHDoUnb3EolJUB994LrF0LrFnD3/fcE5wQpDYBzJorPEW5SOWJFqKDYJz/RqLP660KIQLMs/3004Hn9TY7P7hitP8zjONNEXHaCoIgCIIgCEII/PnPf8Zdd92FdevWYenSpXjqqaewcuVKVFVVoaCgYMTrP/74Y1x//fV45JFHcMkll2D9+vW44oorsHPnTsybNw8A0N3djTPPPBPXXnstbr31Vq+fe+edd+LNN9/Eyy+/jKysLKxatQpXXXUVPvroo7Ceb9BYxSUX7Xi6/KZM4QJ9xw5gyxbg2DHmC1YORoCvj1XHktmhtBkZTEVQWspx3dxMAS8xkUX2Wlv5fDicdQDvp61bmct2cBDIytJy6jY20mW9ZYt1Kq1b2b0eCGan47A64Qirj6bcwWY4//UbCfn5LIDY0qI5/2tqOAc98YT/frNCfnA98n8Gr4hoKwiCIAiCIAgh8OSTT+LWW2/FLbfcAgBYt24d3nzzTfz2t7/FvffeO+L1Tz/9NC688ELcfffdAICHH34Y77zzDp599lmsW7cOAPDNb34TAFBdXe31Mx0OB37zm99g/fr1OPfccwEAv/vd71BWVoYtW7Zg2bJlRp/m2Ig2wcZqYoGvRfW0aRRvt29nMbc77nB3IVopF6jRmB1KqxeNTzuNzueWFs2Bm5wMrFgB/PP+NByHQ3NYFxRoY0Ll1G1q4vMqv3G0YbV70Ox0HFYmHGH1ZofqB4sZRbTURkJqKvDJJ8yvrd+8aWkB3nwTuPhizkWjHcdKGxLR9n+GCCCirSAIgiAIgiAESX9/P3bs2IHVq1efeMxut2PFihXYvHmz1/ds3rwZd911l9tjK1euxKuvvhrw5+7YsQMDAwNYoVuIzZ49G6Wlpdi8ebNX0dbpdMLpdJ74u6OjI+DPG1dYUSzwt6i22+lKam3lv/XCVqw7lswsUqUXjZubGbavUlS0trKfb7stfH3d2UkhKDvbu9CSksK2RKOIaMV7UCrbeycceX6jMXewGc7/zk6gt5f91NPDzRr95k1REVBdDbzxBjePfM1FsiERFYhoKwiCIAiCIAhB0tLSgqGhIRSqPHL/pLCwEPv37/f6nsbGRq+vb2xsDPhzGxsbkZiYiOzs7ICP88gjj+Chhx4K+DPGJVYVC8ayqI51x5KZwrSnaKwExrPOCr9onJHB697by397ikRqvESbiGjVe9DsdBxWJBxh9VYL1Q8UM5z/GRnMZ93URIet5+bNwACQns42+XPJyoZEVCCirSAIgiAIgiDEMKtXr3Zz+HZ0dGDy5MkmtshiWFkskEW1f8wUps0SjbOygOnTgcOHR+bT7ehgiPS0aXxdtGDle9DsdBxWJBxh9VYM1Q+USDv/S0vZH598wiJkeoaHOQ8UFTFdiz+XrGxIRAUi2gqCIAiCIAhCkOTl5SEuLg5NTU1ujzc1NaGoqMjre4qKioJ6va9j9Pf3o7293c1t6+84SUlJSEpKCvgzDMVq+Sm9YWWxQBbV1sYM0bi0FFi6lI7agQGmZOjsZAGy4mL+XrYssmNirPe5le9BIHhRLhrmvbEQjrD6aA/Vj+Qmjt0OXHYZ8PbbLD6Ym+u+cZOaynsJ8L+hJxsSUYGItoIgCIIgCIIQJImJiVi8eDE2btz4/7d35/FV1Xf+x983ewJJ2BNAAmjZQUEQDLiXES21Wm3rdFTQOmotWJZOF1dcqqCOa+s+v4rOaLWO+1IsRdGqCMguBLQqBiUJhCUhBEKW8/vjM3fLepPc5dzk9Xw88oDce3Lv2ZP7Pp/z+eq8886TJNXV1WnZsmWaPXt2oz+Tn5+vZcuWae7cub7Hli5dqvz8/JDfd/z48UpOTtayZct0wQUXSJK2bdumwsLCVr1OVLixP2Vj3BwW8KEa9dXvqTtokAW1NTUW2PTuHd19IhzHuZuPQa9QQ7l4Oe+1RyTuAOgIdxVE8yLOGWdI3/ue9Pe/W1/bwAs3w4bZuSGUC3qx7A+OkBDaAgAAAG0wf/58zZw5UxMmTNDEiRN1//336+DBg7rsssskSTNmzFD//v21cOFCSdKcOXN06qmn6p577tH06dP13HPP6ZNPPtHjjz/ue829e/eqsLBQO3fulGSBrGQVtrm5ucrOztbll1+u+fPnq0ePHsrKytI111yj/Pz8Rgchixm39qdsTDjDgkhU2PGhGvXV3ycqKmyfGD8+uvtEuI7zeAnsWgrl4um81x6RuAOAuwpaJyFBuuoquzBQWGjVttnZFtx++23rLuh19IEr4xyhLQAAANAGF154oXbv3q2bbrpJxcXFGjt2rJYsWeIbbKywsFAJAR96Jk+erGeffVY33HCDrrvuOg0ZMkSvvPKKRo8e7Zvmtdde84W+kvSv//qvkqQFCxbo5ptvliTdd999SkhI0AUXXKCqqipNmzZNDz/8cBSWOERu7k/ZmHCFBZGssONDNeqL9T4RzuO8IwR28Xbea49I3AHAXQWtN2KENGeO//fOrl1tv6DX0QeujGMex3GcWM+E25WXlys7O1tlZWXKauzKXwR4bvG0PBEAAEAMOQui82dkLP4W68givj63b5duusk+ZDf2+mVl1ofz1lvd8yExsEKusbCgpQq5pirsduwI7eeBeNPYce44dnxXVdlXdbV0222hHeftPQZjLR7Pe+3V2IWqESPaV+0d6mt29L7BrcG6iEuh/i1GpS0AAACA8ImH/pT1tacFQWeqsHMTgorYqn+c795tx05pqfXX9W6LDRtCCynjvQ1IPJ732isS1d6hvGZn6BvcGlTJdmiEtgAAAADCJ176U9bX1gCisNDCgwEDgm/rluz7o46ykKGwkA/W4UJoE3uBx3lVlbRypQ2IlJ0tJSfbMbR3r/TCC9LQoaFtl1i3fGhJcxcK4vW8116RCAybe83O0jcY+D+EtgAAAADCJ577U7YlgOiMFXaxRGjjDt7jfO1aC2crK6Xeve14dxwLco85xo6N1lSau7VqsKULBfF83osX3NWATog9GQAAAED4eAeU6dXLPkSXldnt0mVl9n1HG1AmsMKuMR21wi4W6oc2WVlSYqI/tCkttdCmri7Wc9rxeY/z1FTpiy/sX8exQHP3bikjw8LMAQP8lebxynuhYN06O38NG2b/rltnjxcUdL7zXqC6Ouvpu2mT/Rup4681dzUAHQSVtgAAAADCK977U7YGFXbRQysKdxkxQvrJT6SNGy2g3LNHSkqS+va1Y6J3b3s8EpXm0epp3Jrqzs503vOKZqsS7mpAJ0RoCwAAACD83N6fMly8FXY7dliAc9RR/lv2v/mmY1fYRRuhjfscd5w0dqyUkmJfqanW19Ybbkai0jyaQWFrLxR0lvOeFP1WJZ21b3A4MYBj3CG0BQAAABAZbu1PGW6dscIuFsIR2hBahFdenu3f0ao0j3ZQ2JYLBZ3hvBeL/rLc1dA+DOAYlwhtAQAAAKC9OlOFXay0N7QhtAi/aFaaxyIopLqzcbFoVcJdDW3HAI5xi70ZAAAAAMLBW2E3Zoz9S3gQXu0Z7CmUwaTQNt5K83HjrK/tZ5/Zv8cfH3oYFMpgVrEYiMp7oWDHDrswEMh7oWDEiM5X3RlKBfLhw+FvVRKOfa2zYQDHuEalLQAAAAAgPrSlFUUsKjQ7m/ZUmodaAR2LnsZUdzYulhXI3NXQOgzgGNcIbQEAAAAA8aO1oQ2hRXS0pZdra27bjlVQSM/qhmLdX7Yz9A0OFwZwjGuEtgAAAADQ0XT0AbdaE9oQWrhTayugYxkUUt0ZjArk+EFf5rhGaAsAAAAAHQkDbgUjtHCn1lZAxzoopLozGBXI8SHWVdFoF0JbAAAAAOgoGCW8IUILd2pLBTRBYdNiUV1PBbL7xfpiB9qF0BYAAAAAOgIG3GocoYU7tbUCmqCwoVhW11OB7H5c7IhbhLYAAAAA0BEw4FbTCC3cpz0V0ASFflTXIxRc7IhLhLYAAAAA0BEw4FbzCC3chQro9qO6Hq3BxY64Q2gLAAAAIPpi0X+xo2PArZYRWrgLFdDtQ3V99PA7CzFAaAsAAAAgumLZf7EjY8AtxCMqoNuO6vroiNffWQTNcY/QFgAAAED00H8xcrjdHPGKCui2obo+8uL1d1a8Bs0Iwm9rAAAAANFRv/9iVpaUmOjvv1haav0X6+piPafxy3u7+bhx0p490mef2b/HH+/ecAFA23ir63fssGr6QN7q+hEjqK5vq3j9neUNmtets4t1w4bZv+vW2eMFBW1/7bo6aft2adMm+9dty97BUGkLAAAAIDrovxgd3G7uDtya3D6sv5ZRXR9Z8fg7K5KD01G9G3WEtgAAAACig/6L0UHYFXuEG+3D+gsdg7lFTjz+zopU0ByvbSLiHKEtAAAAgOig/2LktRR2EehGHuFG+3Sk9Ret443q+siIx99ZkQiaI1m9i2YR2gIAAACIDm//xXXrgj/4Sf7+i8cfT//Ftmop7Jo+Xdq4sfNWL0YjQCPcaJ+OtP6iXS3MYG7hF4+/syIRNMdjm4gOgtAWAAAAQHTQfzFyWgq7Pv5Yuu02+9Cdlxff1YttEa0ALZLhRmeoku4o4VBHqhbuzOLxd1YkguZ4bBPRQRDaAgAAAIge+i9GRnNhlyRVVEjFxdKJJ/qrr+KxerEtohmgRSrc6Cw9XjtCOBTuauFYhPWd4QJBqEaMkGbPlhYvtuOvrk7q0cO9v7MSEqRzz7X9bMUKO+fl5kqVlW0PmuOxTUQHQWgLAAAAILrovxh+zYVdZWVSebmUmiodORL8XDSrF2MVPkXzdvtIhBudqWqzI4RD4awWjkVY31kuEISqoEB69VW76FVXZ+eJ3FzpBz9w5/rwzu+BA1JRkfTPf9o54+ij7aJdW4LmeGwT0UEQ2gIAAACIPvovhldzYVdVlX2lptpXfdGoXoxVEBTt2+3DHW7EY4/X9oTzHSEcCle1cCzC+s50gSAU9dfHoEG2PrZvl/74R/etj8D5PeYYacwYC2537JC6dm170ByPbSI6CEJbAAAAAIh3zYVdKSkW2vbuLWVnN/zZSFcvxjIIivbt9uEON+Ktx2t7w/mOEA6Fo1o4FmF9PF4giKR4Wx9Nze+AAXYcbdkivfaaHYdtmV9aG8UEoS0AAAAAxLvmwq5vv7Xbebt2bfhzka5ejHXwEYvb7cMZbsRTj9dwhfNuCYfaWjEcjmrhWIT18XaBINLibX1EY35pbRR1hLYAAAAA0BE0FXaNHy9deqn05pvRr16MdfARq9vtwxVuxEuP13CH87EOh9pTMRyOauFYhPXxdIEgEuqH9GVl8bU+IrH9mrpw4YaQupMgtAUAAACAjqK5sOuYY6JfvRjrICiWt9uHI9yIlx6vkQjnYxUOhaNiuL3VwrEI6+PlAkEkNBbS5+RYW5l4WR/h3n4MSOcKhLYAAAAA0JE0FXbFonrRDUFQ/QDtm2+k2loL5M45x9aJW8VLj9dYh/PhEs6K4fYcb7EI6+PlAkG41Q/pMzJs8K7166Xdu6VDh6T8fPevj3BuPwakcw1CWwAAAACIpLb2xoyEaFcvuiUI8gZo77wjvf66BQ87d0pPPy2tWuXu6jG39HhtjhvC+XAId8VwW4+3WIT18XKBIJzqh/SlpdKGDfZvdbW0f7+0Z49NO2qUu9dHuLZfrPuQIwihLQAAAABECreYShMnWtXa6tXS0KE2IFosgo9t26QXX7QwYtCg+Koei3WP15a4JZxvLzdVDMcirI+HCwThFBjSl5ZKK1dKlZVSdraUnCylpkolJdKuXVJ6un3v5vURju0X6z7kCEJoCwAAAACR0NlvMQ0MrMvLLfwoKrJekX36RDf46AjVY24eAKijVGm6rWI4FmG92y8QhJM3pM/IsArbykqpd2//+SEz0/ra9u5t6+SiiyzQdcP6aOoOjvZuPzdduAChLQAAAACEXUcICdujfmA9cKBUUWHVrl27SjNmSGecEZ5lD6X9BNVjkddUld/YsdKkSVJNjbR9uzsCr6a4sWI4FmG9my8QhLPdjDekLyqyc1V2dvA2P3LEKm7z8qTiYnveDeulpTs42rP93HbhopMjtAUAAADgDm7q/dpenTkkbCqwzs6WTjjBAuvVqy20ba9Q20+0VD2WkSF99pm0Zo19H459ryPtz6GqX+VXUmK3nD/9dHy0B+koFcPRFM39PNztZrwh/fLl1sM2Odn/nOPYHQJ9+0q5udLnn7ujujSUOzjaU2nrxgsXnRihLQAAAIDYc1vv1/YGER39FtPm1k+0AuvWtJ9ornps927ruVtUJP3pT9Krr7Z/33Pb/hxN3iq/ggJ/D+F4ag/S2fq6tkc09/NItJvxhvSbN9tdAKmpdq44csQC24wMW57KSndUl4ZyB8fjj9vFhW3b2rZNuHDhKoS2AAAAAKKjqaDPbb1fwxFEdORbTFtaPwcOSIcOWeVaSYkFIYG3HYcjsG5t+4mmqsd277ZK0OJia+EwbpwFNO3Z98K1P4ergjEWFb/x3h4ksGK4rMy/7tLTbdncOM/RFs3zdiT3pxEjpOuuk+bNs6Czqsoqbvv2tXNGr172+m6oLm3ugpgk1dZKL70kDR5s5zLvoI+t3SZcuHANQlsAAAAAkVVXJ73zjvT66/bBMTHRwo/hw6Vzz7XKxrZ8GI9EGBWuIKKj3mIayvopKZH++U/p009teyQlWfAxfLgN6BOOwLqlat7+/a0Fw9/+Zu+bl9eweiwjwypsi4ttcLSxY21e2xMEhStcClcFY6wqfjtCe5CEBLv48OabnbNiurnza7RD+UjvT6NGSffdJy1cKO3aZe+Tm2sXcLZscU91aVN3cOzebcu/ebNdZHAcqxYeO9YGfWzLNulMA9K5GKEtAAAAgMgpKJAeecQC28pK++B31FFW1bhunX3IrKiQjjmmdR/GIxFGhTOI6Ii3mIZ6a25lpVXZ1tbactbUWOuBsjJp4kQLGNobWDfXfmL3bpuXL7+U7r3XAtncXOmkk6QLLrDK2m3brIdtUZHti2PHWqDs1dYgKBzhUrguHMSygr0jtAcpKJAeeMC2Vc+eth8lJbm/vUM4tHR+jXYoH439adQo6frr/cv9+efuqy5t7A4O790Cu3ZZSwdvL95PP5W++EIaP14aOtQuZLV2m7h5QLpOgtAWAAAAQGQUFEg332yDvBw6JKWkWHBXXm5B0skn2wfL4mL78F9XZ89VVflvqW/sw3ikwqhwBxEd7RbTUKpbly+324pPOUVatUras8fChZ49bTu//76Fp+0NrJtqP+ENMMrKrJK2d28Lb99/324bHj3aBkObMcOm+dOf7DbipEY+GrclCGpvuBSuCwetfZ1wV63He3uQujrpscekDz6w9fD11/6K8WHDbD9zc3uH9gjl/FpTE91QPlr7k9urS+vfwSHZOXnfPv/FsvR0+6qslPbuld5918Lbfv3s96qbL5SgAUJbAAAAAOHnDT1WrPB/uE9IsA/71dX2ofiNNyzILS6WXnvN+ggmJfm/evWyIDDww3gkb8uNRDWX20OA1mhp/dTUWEgwerTdkjtpkgUKpaX2s0lJto1/9KP2B9aNtZ9wHHu/ykp7r+xsq6itrLQguazM5mX9etuOF1xgYXJlZfiCoPaGS+G6cNCa1zl0KPxV6/HeHuTvf7dzUm2t1KOH1K2bnbe8FeMjR7q/vUNbhHp+vfDC6Iby0dyfAqtLY9EPuqV5C7yDIzPT2tFUVtqxm5xsv1MrKmzfTUmx/ba83JbF47Hpx4yJ3TKgVQhtAQAAAITf9u3Se+/Zh8SEBPtQWVNjH7Adxz5IHj5sH8RTUy3s83isOnLAAPvwuXOn9NVX1vfW+2E8krflRqqaq6PcYtrS+ikrs3+7dbN/e/e24L2szKqnExMtMMjJaf+8NNZ+orra9pmaGv/8VVbafHj3lYoKuxCwc6dV5A4bZiHuiBHBVd5ZWW0LgtobLoXrwkGor7NunfTii/4+nnl57RuILTDkmjjR/h9v7UE2b5YWLLCLSRkZth4zMmyee/e2KtsdO+z7jla1GOr5VYpuKB/pdjONhbPbtsWmH3RLAu/gWLHC7mY4dMjOu3V1/p62ycn+ZauqsvWVmmp3QJxxhjuPPTRAaAsAAAAg/D77zILY9HQLhCT/h8iqKvtQWVNjH5ITEuxDf1KSPVdaasGex9MwOIhkb0O3Vge6pdqrpfWzZ49VJQa2GvB4/CFuWZntD+GqvqvffsJbcXb00RbqbNxo1bbe+UxJsXV45Ig9v22btUnYtMlaJ9TW+l87MdEqhlsbBLU3XArXhYNQXufwYev5W1ho81hS4h8wri1V6431Qe3Rw0LyPXvioz1IQYF0xx22TtLSLOTyeCzsr6qyZcnKskC3e3f3tndoq1DPrwcPRr9nd6TazTS13xYX2zkh2v2gQ+G9g+Ojj6wPb2GhbYOyMmuVIPkvkEp2zktNtXW1dWvHqxDvwAhtAQAAAESG41jYkZBg//fewu449lhtrQW6CQkWkh054u+VmJAgDR5sH0T37PF/yGxrqBVK8BmLwcOami/v4xs2WF/N4mILjWJZ7dXS+snLswFvvvnGtk00Qu/A9hNbt9pAaAMH2j5UU+O/UCDZ/pWUZOFFYPgUyLuPtnee2houhevCQUuvs2WLhbT79lmLiK5dg2//nzSpdVXrTfVB3bHDXn/GDLsQ44ZbzJvibQ2we7ftv8nJtgwZGfZVWWnL17+/nde8lckdSWvOr4MGRb9nd7jbzTS231ZUSEuX2vY+6yz/eghHC55wSkiQJk+2ivbt2+34TUmxbVBXZ+e/mhr73dq1qw1IlpdnF1Q7WoV4B0ZoCwAAACD8hg61D4o7dtgH4UOH7EOlx2MfKAMrgJKT7QNxYqIFkxUV9v9hw6ziKfBDZltCrZZGQg8UzcHDmpqvY4+1KtGVK22gtpoaC9BGj7b/L19ut3Bfd52NeB5NLa0fyUKQzZttmyYl2TyXl9ut5ZG4Jd7bfiIvT1qzRvrwQ6uCrKuz/SstzT+iet++Vn1bXm7h7Qcf2MWD889v2B6hoKDt4Uxbw6VwXTho7nV27JD277cg8sgRO04TEmy5vbf/b90qnXhiaFXrofRBXb1a+u1v3RnWegW2BigpsfVx5IiFd6mp/krtb76xivFzznH38rRFa8+v3v18+3Y7T0t27o9kFWe42s00td96LyomJlo1fmB7lfa24Am3hATp0kttoEXv+SE52R4/csR/weGYY+wiaHm5uwcARAOEtgAAAADCb9Ag+3D/9dcWimVkWCB2+LA/tE1JsQ/GaWn+3rfJyRYiSfaBecyY4A+ZrQ21QhkJvbHgNtKDhzU1X++9Jz3zjFXzHTxo66h3b6u03b7d1o03TJg/325vj0Vw29z6mT7dlm3tWgvqk5OlIUMsXIhkdfC2bRY4/vOf/gC2pMT2kZoa2weHD7dpv/nGQoyiIlv/CQn+Ng5e7Q1n2houhevCQVOvc/TRtl169ZI++cT+n5pqP+PxWNhaWmr7XCgBTyT7TEeTtzVAXp6tm6IiOw5LSy24ravz78/Tp1tf0I6mLRcN3Nr7tSVN7bdVVfY7q3t32/ZlZcHnhva04ImEUaOkG2+Ubr3VjllvD9vMTDuuu3f3bwe3DwCIBlwd2i5cuFAvvfSStm7dqvT0dE2ePFl33nmnhg0b5pvm8OHD+tWvfqXnnntOVVVVmjZtmh5++GHlBDS3Lyws1NVXX613331XXbt21cyZM7Vw4UIlJbl68QEAAID45a0A+uAD+3BbWxsc0Ho8/tA2JcVCgfR0C0W6drVbqnfvtuqtk08O/pAZaqgV6kjojVVSRnLwsKbmKzPTlr+szD5sV1RYQFBba5XK3lYTgwbZ81u3SgsXWk/DaIUj9ds5jBoVvO4KCqQ337R1fPrptn1ra22Z3nzTKr4iMa/eEPzLL22dlZdbpVlVla2nY46RJkywfW3LFgufpkyxgDwS/ZHbo67OjoXp06VTTrH1nJ3dtgsHjQXsZWXS7bdb1bE3nAysJkxJsfW3Y4dtw5YCnkj2mY4mb2uAykoLHcvK7LzUp4+/Uts7wNqVV0a2yjaWfayHDZMuuEB6/XW76JaYaPtjYxcN2nJRzC0OHPDfAeKtrM7Otn+Tkux4qKmxc0ig5vpKx2q7ff/7dhFq8WKrav/qK9tnc3Ptwmfgec+tAwCiUa5OLd977z3NmjVLJ5xwgmpqanTdddfpzDPP1JYtW9Tl/34hzJs3T2+++aZeeOEFZWdna/bs2Tr//PP14YcfSpJqa2s1ffp05ebm6qOPPlJRUZFmzJih5ORk3XHHHbFcPAAAAKBjO+MM+4C4dKkFd96ee9nZFsh+8419QHYcfyiZkuIPSfbtsw/8jX3IDKUa1q0VgE3NV1mZhVu1tVYt6g3vamrs+cxMCyKrq+3/VVXWEzha/RVbajMRGEZ7q3/LyvwDOH37bWTm1fu+X35p/Y+rqmx71tVZG4CdO21/277d9i1v+JSeLr34YvsH/Qqn5tZxW9dZ/QsQ27c3DCe9fVy9LQC8YWUoAU+4Bk+LtfqtASZNsu1QWmrH4KFD1qLkuusiG0S2pp1LJN/70CF7rG9f6Qc/sPN54L7QnotiblBSYufZTz+1+UtKslBz2DD7t7DQzhHeKnSp+b7Ssdxukp1z77yzYS/0vXvdPwAgmuTq0HbJkiVB3y9evFh9+vTRmjVrdMopp6isrEz/7//9Pz377LM64/9uTXjyySc1YsQIffzxxzrxxBP1t7/9TVu2bNHf//535eTkaOzYsbrtttv029/+VjfffLNSUlJisWgAAABAx5eQIF11lX2ALSy06tnsbPtw/I9/+APK5GS7db221oKAnTvtls5evaQrrmj6Q2ZL1bBurQBsar6Ki/0Ds3lDBMlCr8REW0+O4w9xk5Mt+I1G8BxKRV16uj+MLi0NDrySkqyC+uOPwz+vhYU2fxUVFkQGVo1mZNitzd9+a+HTjTfae3sHewvHoF/hEq2qxebCyQMHbD0OHy5de21o75eXZ0HXhx/a/9PS7Dj3DuoWL7dkN9Ya4MQTrRL5m29sv2qpj3R7Ky1jWbna3GByL75oF14C39utF8VCUVAg/e//2gWw2lr7XVNT4x+Ib8gQu7hRV2fT19Q03yLCLRXH3t+JgwZZz+VYVWsjbFwd2tZXVlYmSerRo4ckac2aNaqurtbUqVN90wwfPlx5eXlasWKFTjzxRK1YsUJjxowJapcwbdo0XX311dq8ebPGjRsX3YUAAAAAOpMRI6Q5c/wVSLt2WeVSz572oV6ygCc52ar8vNWjSUl2i257+ka6tQKwsflyHPuAXVdny+44FtRWVFio4B0JPHBwpL597fbXzz+PbPAcakXd975nYfShQ3aLbmWlf9tWV1vFV3GxVYGFM8Q5cMAqbPfs8e9Dqan++UxLsxCltNQfiEttH/QrErdA19VJL71kt6Pn5dn3CQmRqVoMRzgZON/vvGPHdkGBDaCXmWn75YABti/E0y3ZTbVeOf30lqsU21tpWf84k/yV6v36Ra5SvbH3DqVq1q0XxVriXdY9e6z9yKpV9v+sLPu9VFwsbdpk7VT69rXz1s6dTVerurXiOJItfhA1cRPa1tXVae7cuZoyZYpGjx4tSSouLlZKSoq61WsYn5OTo+LiYt80gYGt93nvc42pqqpSVUDfkvLy8nAtBgAAAND51G9lUFYmPfaYfSDevNnCveRkm9bj8VeYnnhi+z7ktnYk9GhpbL7KyuxDv2S39Ccm2jzW1tpjCQn+8HbHDqt6Gz7c1l2kg+dQK+pOPtnC0o0bG1a8pqZaiFFcbBWZ55wTvgCjpMRaI3z7rb1PYqJV2PbqZcHRkSP2eF1dwwCptYN+ReoW6Hfescq/w4ctuPXeqj18uK3HcFcttiec9CoosOP4rbcsnPVeeDlyxC4kfPut9eW98sr4uiW7LQMRhqPSMvA4i2alev33DqVqtq7OzlmHDlmgedRRDX/OrW0xApc1K6thpXlSku3LV1xhFw1b2g/iueIYrhc3oe2sWbP06aef6oMPPoj4ey1cuFC33HJLxN8HAAAA6DQCq342bbLqsWHDLIio/4H5qKMsZKtXfNGm92xLJWWkNTZf335r4WNNjYWOkn3g94a1dXUW4qalWaDgHaytoCDywXOoFXXeCsv337dAvn5IfuCALWtRUfgCDO9tznV1/sHtEhKsQtnbS/fgQWu30aNH4wFSqCFdpG6BLiiQHn/c+sr272/7fnW1/1btSZNs/gOrFsNR7duWcDJwnh94wPpmSrYta2rsgkNSklUpHjjg7xEab1pTpRiuSkvvcRbtSvXA9w6latZ74aKgwFoIbNzoH2Cwd2+b3s1tMeova+/etp96q5oTE+1cnJMT2n4QrxXHiAtxEdrOnj1bb7zxht5//30d5b2FSlJubq6OHDmi/fv3B1XblpSUKDc31zfNqlWrgl6vpKTE91xjrr32Ws2fP9/3fXl5uQYMGBCuxQEAAAA6t8D2APU/MHsHfdm7NzwVWq2tpIyWwPny3lZeU2PBYnq6Va/V1vpbJUgW3vTvbyFAWZn0ySfSwIGRD55DbTORnS2ddJLd5v9/re18lZfl5Vb9OmaMbdtwBBiBtzl/97vSa6/5w8f0dAtuv/7aAtauXS1AaypAaimcidQt0N7Xraiwbe9t35CaasfG7t22344Z469aDGe1b1tuofbOc2Gh/XzPnhZ0JSba4GW7d9t6GjNG2ratfQF9JFpRhFu4Ki0zM2NTqe5971CO8ZIS62/rvXBx0kk2P599Zo9NnmzHXiwvirWksWX1eKz3tWTnrvT00H//uLUNDzoEV4e2juPommuu0csvv6zly5dr8ODBQc+PHz9eycnJWrZsmS644AJJ0rZt21RYWKj8/HxJUn5+vm6//Xbt2rVLffr0kSQtXbpUWVlZGuntE1NPamqqUgNHCAQAAAAQPo21B/B+YHYcC8DCWaHVnorCSPLO10cfSfv22XxVVlq4uW+fBZ6OY8FVRYU/HPMOuDVkiPTzn9trbN/e/LK1J/xqbZuJ0aMtwKmo8FdP9+1rr5GSEr4AwzsAmTcomTDBguyKCltP3oGwunSRjj66fQFSpG6B9r7usGF20aKoyB/WeTy2bLt3Wyh28sm2Pu+80/o+Dxhg67yyMroDHnnnuVcvC8W9rU0k/zx7b+s/fLjtAX2kWlGEW7gqLfPyol+pHvjeLR3jY8dKK1cGX7jIyrL9sqBA+uILC3DHjo39RbHmhLttjpva8NTV2e+Czz6z74cO9Q+8iLjk6tB21qxZevbZZ/Xqq68qMzPT14M2Oztb6enpys7O1uWXX6758+erR48eysrK0jXXXKP8/HydeOKJkqQzzzxTI0eO1CWXXKK77rpLxcXFuuGGGzRr1iyCWQAAACAWYtG2wK2DsiQkWIVqRoZ0wgl2W/T+/f7q2oQEq1RNTrYev337WmXpwYM2wFtVlbRoUfPBVnvDr9Zsr7w8u51/7VqrCvb2k83OttcKZyC/YYO0fr393zuA21FH2TqprLTHqqulceMs3G5PgBSpW6C9r9u1q22TsjILabOy/KH9vn0276NGSb/6lVWvduliVY/evrfRHPDIO885ObbOq6v9FfKSzbe3d3VbA/pItaKIhHBVWiYkRLdSvf57t3SMT5okPf10wwsX3rslBg2yffeqq6zi1q1BYbh//7ihDY93QMCnnrJzb0WFPd6jh3TqqbZN3HK8oFVcHdo+8sgjkqTTTjst6PEnn3xSl156qSTpvvvuU0JCgi644AJVVVVp2rRpevjhh33TJiYm6o033tDVV1+t/Px8denSRTNnztStt94arcUAAAAAUJ9b2xbEgjf0SU+3YKSgwF+l6n08I8MC2+xsW1cnnGC9L//4x+aDLalh+FVRYb1I16+3QaLOOKPlQCHU7RUYYHgHKOrSxUKncAYYBQXSX/5ir9uzp4We1dX+W5snTbLpvOH20Uf7fzaw6tgbwh482HwFcqRuga7fKqT+oEh1dbbOzjxTev55C2wDlzew7220BjzyzrN3sLTA6mDJQsbERLu4cPLJrQ/oI9WKIlLCWWk5Zoztq6Wltl09HrtgE4lK9fpaOsa9ldONXbjweKR+/ezckp3tju3SnHD//onl7zPvgICvvGL7TUKCHSvdu9v2eO01a6uxYEHn+r3aQbg6tHW8V5ebkZaWpoceekgPPfRQk9MMHDhQb731VjhnDQAAAEAomrst361tC6Ktfuhz0knWLmLDBn9f2379bNotWywo+8EPpFdfbT7YeukleyxwGm+P1N27rWLv88+lH/1IOv/8lj/Qh7q9Ih1geEO9qiobAKm42N8P1NsH9ttvrcrshBOCA8zAquNdu6xaVbKq0T59mq5AbimY27HDwrayMrs9OdT9uP7rBvZ4PnzY1nV+vi3j7t0WmHXt2njf2xNPjM6AR4HzPGxYcHVwcrKFtampNl1bAvr2tKKIRQ/ccFVaFhT4+8Xu3m3bOSvL1rG3VWS4W8fU19wxvn17x+rdGu7fP7H4feYdEPAf/7CANi3Njr2qKjsO+/e3xz/91M57brnQgZC5OrQFAAAAEMdCuS3frW0Loikw9Pn4Y/uQXV5uge3+/Rba5uZayOoNPtPTWw621qyx7wcN8ge2K1f6R6VPS7Nw4cMPLVz65S9bDh1C3V6RDDC8oV5enoWt5eXBLQVSU62/Zr9+wWFZ4C33GRn2MwcPWujq8dhrNXX7fXPB3JYttp2qq6Xbb29d+4mmXtfjsdBl4EALbb23pZeUBLcjCOwhW1wcndAscJ5377a2DYWF9v4HDti6/Zd/sSrutgT0bW1FEcseuO29UBG4bx57rLRpkx3vhw75b3U/dCjyt9o3F3qHo6LYbQPLhfv3TzR/nwUOCFhba9sjNdV+XyQl2Xm+tNTOa96BKyNdhY+wI7QFAAAAEH7x1JPSDUaMkKZPl2691YK51FQLNfr184e2M2b4Wxls2tRysOUNJLt0sX+3bg0elb6uzqbJy7Pt9PjjFgpt2xae0CtSAUZgqJeV1bClgPf24B//2D/fgbfcjxhhQfWhQ3bbuWTh4zffSFOm2L7b2O33jQVzVVUW2HbrZlW/bWk/Eept6Xl5jbcjSEmx4HrHDun006Mz4FH9ee7Vy27HHjBAOuec0FpuNKUtrSjccL5p64WK+u0gSkttmx4+bPvo7t3W1/gnP4lsb9KWQu/2VhS7fWA5twXKLQkcEHDbNjvHJybac94A19vbW7LtFOkqfIQdoS0AAACA8Iq3npRuUFcnbdxoQUF+fuMDeK1ebWGYFFqwFdivta7Otkd2dnDv0aQke52MDOnNN6XvfMeCFDeH7PWXPbClQFWVfVVXS8cd5/+ZwFvuy8sbrgtvtWp5efO33wcGc2Vl0v/8j7UEGDWqfe0nQrktvbKy8cHKDhywddGnT+QHPAp1ntujtRWdrT3fRDKca8uFisB9s7TUXw0/aJDNa3m5zevu3eGZx8aEGnq3taLYDaF6c9weKDcmcEDAlBTb773tdCQLcA8ftv2nqsoea+oiH1yL0BYAAABAeLWnJ2VnFXjLf2MhbP11FkqwNX68fb9+vQ1eVVNjAaN3mvJyqzTNyrL+uYcOBb+/W0P2xpbd47FqV8dpvO9nYHVuaWnwupD84WdVla2r5nrDeoO57dutKjovL/T2E80FQE0FfvWXt35lcUWFPX/ttdEPmCJRTd3ais7WnG8OHXJfOOfdNzMy7DgMrIaXbB4TEmz/isRxWD/0lvwXQPr1s2Mh8H1bG9a7/SKe2wPlpgQOCNi3r7VTqaqysNbjsX3q8GHbfh6P9fD+859D618O1yC0BQAAABBebe1J2Zm1dp2FEmydf75N+8030tdfW3hSVWUf4MvLLSQaPtz+X1xsAx+lpQW/rxtD9rbcph1Ynevt+xjYG9ZbdZyaGvqASoHbLJT2E20Nphpb3hNPtDYJ33xj73fddVbt21G0pqIz1GNnwwZpyRL3hXPefbOoqGEFuGT7ZnKyzXMkjsP6lb7eCwI1NXZMdO1qvbYD37c1Yb2bL+K5PVBuTuDFnOHD7QLSzp12PCQm2nndcaz/ef/+1it5/frQLiDBNQhtAQAAAIRXW3pSdnZtWWehBlu//KWNSl9UZB/qu3e3yqzhwy3w8w4gNWSIvx1DIDeG7IHLXlAgffaZvwpw5syGgURgwDFiRHBvWCm46rigoOUBlaTgbdZS+4n2BlNNbevTTw9toKt4FGpFZyjHTmqq9Rl2Yzjn3TeXL7cLCYEV4IEV8bm51m4j3MehN/Q+dMhasHgrxZOTbX727rVzxIYNoe+7gS0ovv3WXtuNF/HcHCi3pP6AgBMm2Lx++aX12XYc245DhthdF717++9EcGsQjQYIbQEAAACEVzhGGe9s2rrOQgm2RoywSswTT7TBxioqpKFDrYKurMx+NiPDf5t/fW4N2YcNs6Dis88sdEpNtSD21Vf9Aa5XYMBRUGBhzL59FmJLtmz9+9tzLQ2o5BW4zZprP5Gdbb0m2xtMRaqHrJuFUtEZyrEzeLDtG24M57z75ubNNqCUdxDCI0eCK+IrKyNzHGZm2ntu3NiwNUNqqgXbxcXW5uOcc1re3+r3h62pkb76ypZj8OCG08fy/FK/Sttx/K0hUlPdecEq0IgR0uzZ0uLF/kHJunWTvvjC1vWoUfa9d3vGel9HqxHaAgAAAAivUG9fl6wvaGcJoJrTnpHZQwm2EhKkqVMtmPQGKjt3WlgyZYqFuN9+a6FFPITsBQXSY49Jb71lVXxdu1olYkJC07e7169W7dPHlk+y/0stD6gUKHCbNdd+wuMJXzAViR6y8S6UY2fKFOmZZ9xZ7Sn5L6zMm2fBbVWVXQDwVsT36tV4r+ZwyMuzY+f99+396h//Bw7YOi0qajnoa6w/bEWFXVj5xz/se++x5n39WJ5fAqu0q6oabw3Rq5f7Llh5FRTYRariYjv/JCba+vV4pIkT7fv6Yr2vo1UIbQEAAACEX0u37kvSokXuGhAo1to6Mntr36Oxas1t2yxsaW1gHAsFBdIDD9jt7pKFSDU11tPxwAELK5oatKn+8ntDvIMH23bhwLvNmms/EetgqjNo6dhJT7dt5OaWLaNGSffdJy1caINGDRhgYWplpR2XkToOExKkk06SXnrJqkwlG5gvsNJ3zBhrk9Bc0NdUf9jsbOmUU6S337ZgeOpUC0PdcH7xVmm/954N5BXYGuLIEbsYU1Nj8+o29QPyQYNsPrdutcrm3Fz3VTaj1QhtAQAAAERGSwGh2wYEcoNo3ALfWLVmNALjcPAGQ4WFthw9e1o1WWKiBaS7d9v+NWZM07cAh7tataX2E7EOpjqL5o6durr4aNkyapR0/fX+4/Dzz6NzHB53nDR6tJ2TKyps/SUl+S8+pKS0HPQ11x+2Tx8LhjdutOm8vZ5jfX5JSJDOPddfrdq/vz+wLS+XcnKsvcBrr9k8uuX4bW4AtQkTbB2vWSMNHBg8z27a1xESQlsAAAAAkVM/IIvn0bqjJVa3wMdDz1RvMNSrl1XBBQ7a5PHYfuS9vfnw4ejdAtxc+4lYB1NuEzhIVbj3saaOnfa0H4m2WByHeXnSpEnS2rW2Dx85Yj1dvQMThtKaoX5/2PoGDLBK1ssvt/dwy/mlSxerSk1KssC6oqJhYO22HrDNBeQJCTbw2IoV0ief2L7k1n0dLSK0BQAAABA98Txad2fg9p6p3mAoJ8eClepqC5e8UlJsmrKy2NwCHA/Bd0siGarWH6Qqmm1R4qWaXIr+cRgYau/c6Q+1y8tDD/oC+8M21YIiPd22t5vOMQcO2Dnk9NMtsPUOQpadbb+Tamrc1wM2lIC8pEQaMsTaPrh5X0ezCG0BAAAARJ43CFqzxj5ENlWxxSApaI43GEpKsiCpqCh4tPsjR6xVwp490sknx+YWYLcH380Jd6gaGACXlEj/+7+2bWLVFqUjhOqR0t5Q29sf1u0tKOrznlMqK60VQn1u7AEbSkDep480Z47t2+zrcYvQFgAAAEBkBQZBe/bY9/v3S2PHWuAWyI0fkKMhktWNHUlgMDRsmFXU7t5twUVysu1fqak2XVtuAe7M26H+wEbtDVUDj/tDh6R//tMqo085xR80xaItSjyH6pHWnlA7nlpQBIrHsDnUeR40yH3rG61CaAsAAAAgcuoHQXl5Fth+/bVV8p14oj+4desH5EiL5S3jUnwFlYHB0O7dNnBTYaENInTggI10/y//Il15ZevXXay3QyyFu9d0/eO+ulravNn+XbXK+qd6j3vaorhLe0LteGpB4RWPYXM8zjPahNAWAAAAQGQ0FQSNHWt9A4uLpfXrpdNOs1tTO+OHzXBXN7bl/eMtqKwfDPXqJXXvbsHFxInSmDHWO7OuLvT9KNbbIdbC2Wu6seO+pMT+zc21amjvdvO+F21ROo54bEERj2FzPM4zWo3QFgAAAEBkNBUE9e5tlXbr11tP0vXrpZ49O9+HzXBXN7ZWPAeV9YOhkhJp5Urpb3+TXnutdeFzrLeDG7Q0sFFrQtXGjvvUVOtDXFNj67W01FpbeHuIdta2KB1VPLagiNewOd7mGa1CaAsAAAAgMpoLgnr3tgrb9euln/1MGj++833YDGd1Y2t1hKDSGwwVFEgvvtj28DmW28EtQhnYKNRQtbHjPjvbP3Bcz542TVWVPddZ26LAfeIxbI7HeUbIXPrbFwAAAEDcCwyCGlNZaQHO+PGdc8CUUKobDx+OzC3jrQkq3ax++JyVJSUm+sPn0lILn+vqmn6NWG4Ht/AObLRjh4Wogbyh6ogRoYWqjR33Ho+9fkaGtUWpq7PtVFZmFwg6W1sUAAgBZ0QAAAAAkRHOIKgjainUjuQt4x0lqAxH+BzL7eAW3oGNevWyELWszFoZtCVUbeq4793beg6nptr6LCmx/rbHH+/uVhwAECO0RwAAAAAQGYxw3TxvuLVuXXCLAinyt4yH83b4WApHL9ZYbgc3CdfARs0d97t3SyedJP3oR1JODj04AaAZhLYAAAAAIocRrpsWy1C7owSV4QifubjgF66BjTjuAaDdCG0BAAAARBYjXDctVuFWRwkqwxU+EzL6hWtgI457AGgXQlsAAAAAkccI102LVbjVEYLKcIbPhIzhx3EPAG1GaAsAAAAAsRarcKsjBJXhDJ8JGQEALkFoCwAAAACdWUcIKjtC+AwAQABCWwAAAABA/OsI4TMAAP+Hy44AAAAAAAAA4CKEtgAAAEAbPfTQQxo0aJDS0tI0adIkrVq1qtnpX3jhBQ0fPlxpaWkaM2aM3nrrraDnHcfRTTfdpL59+yo9PV1Tp07V559/HjTNoEGD5PF4gr4WLVoU9mUDAABA7BDaAgAAAG3w/PPPa/78+VqwYIHWrl2r4447TtOmTdOuXbsanf6jjz7ST3/6U11++eVat26dzjvvPJ133nn69NNPfdPcddddevDBB/Xoo49q5cqV6tKli6ZNm6bDhw8Hvdatt96qoqIi39c111wT0WUFAABAdBHaAgAAAG1w77336oorrtBll12mkSNH6tFHH1VGRob+9Kc/NTr9Aw88oLPOOku//vWvNWLECN122206/vjj9cc//lGSVdnef//9uuGGG3Tuuefq2GOP1dNPP62dO3fqlVdeCXqtzMxM5ebm+r66dOkS6cUFAABAFBHaAgAAAK105MgRrVmzRlOnTvU9lpCQoKlTp2rFihWN/syKFSuCppekadOm+ab/6quvVFxcHDRNdna2Jk2a1OA1Fy1apJ49e2rcuHG6++67VVNT0+S8VlVVqby8POgLAAAA7pYU6xkAAAAA4k1paalqa2uVk5MT9HhOTo62bt3a6M8UFxc3On1xcbHvee9jTU0jSb/85S91/PHHq0ePHvroo4907bXXqqioSPfee2+j77tw4ULdcsstrVtAAAAAxBShLQAAABBH5s+f7/v/scceq5SUFF111VVauHChUlNTG0x/7bXXBv1MeXm5BgwYEJV5BQAAQNvQHgEAAABopV69eikxMVElJSVBj5eUlCg3N7fRn8nNzW12eu+/rXlNSZo0aZJqamq0ffv2Rp9PTU1VVlZW0BcAAADcjdAWAAAAaKWUlBSNHz9ey5Yt8z1WV1enZcuWKT8/v9Gfyc/PD5pekpYuXeqbfvDgwcrNzQ2apry8XCtXrmzyNSVp/fr1SkhIUJ8+fdqzSAAAAHAR2iMAAAAAbTB//nzNnDlTEyZM0MSJE3X//ffr4MGDuuyyyyRJM2bMUP/+/bVw4UJJ0pw5c3Tqqafqnnvu0fTp0/Xcc8/pk08+0eOPPy5J8ng8mjt3rn7/+99ryJAhGjx4sG688Ub169dP5513niQbzGzlypU6/fTTlZmZqRUrVmjevHm6+OKL1b1795isBwAAAIQfoS0AAADQBhdeeKF2796tm266ScXFxRo7dqyWLFniG0issLBQCQn+G9smT56sZ599VjfccIOuu+46DRkyRK+88opGjx7tm+Y3v/mNDh48qCuvvFL79+/XSSedpCVLligtLU2StTp47rnndPPNN6uqqkqDBw/WvHnzgnrWAgAAIP55HMdxYj0TbldeXq7s7GyVlZVFrQeY5xZPVN4HAACgrZwF0fkzMhZ/i3VkrE8AAIDYCfVvMXraAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIskxXoGAAAAAETfwYNSYmLDxxMTpbS04OmakpAgpae3bdrKSslxGp/W45EyMto27aFDUl1d0/PRpUvbpj18WKqtDc+0GRk235JUVSXV1IRn2vR0W8+SdOSIVF0dnmnT0vz7Smumra626ZuSmiolJbV+2poaWxdNSUmRkpNbP21trW27piQn2/Stnbauzva1cEyblGTrQrJjorIyPNO25rjnHNH4tJwjWj8t5wj7P+eItk0bz+eI5pYzEJW2AAAAQCfUr5/UtWvDrwsuCJ6uT5/Gp+vaVTr77OBpBw1qetpTTgmeduTIpqc94YTgaU84oelpR44MnvaUU5qedtCg4GnPPrvpafv0CZ72gguanrZr1+BpL7mk+WkDPxhfdVXz05aW+qedP7/5aQsL/dNef33z0xYU+Ke9447mp1271j/tAw80P+0//uGf9vHHm5/27bf90z7zTPPTvvyyf9qXX25+2mee8U/79tvNT/v44/5p//GP5qd94AH/tGvXNj/tHXf4py0oaH7a66/3T1tY2Py08+f7py0tbX7aq67yT1tZ2fy0l1yiIM1NyznCvjhH+L84R9gX5wj74hxhX82dI/r1U0gIbQEAAAAAAADARTyO01SBMLzKy8uVnZ2tsrIyZWVlReU9Pbd4ovI+AAAAbeUsiM6fkbH4W6wj867PnTsbX5/c1tj4tNz63PppufXZ/s+tz22blnOE/Z9zROun5Rxh/+cc0bZpo3GOKC8vV79+Lf9tS2gbAkJbAACAhght4xPrEwAAIHZC/VuM9ggAAAAAAAAA4CKEtgAAAAAAAADgIoS2AAAAAAAAAOAihLYAAAAAAAAA4CKEtgAAAAAAAADgIoS2AAAAAAAAAOAihLYAAAAAAAAA4CKEtgAAAAAAAADgIoS2AAAAAAAAAOAihLYAAAAAAAAA4CKEtgAAAAAAAADgIoS2AAAAAAAAAOAihLYAAAAAAAAA4CKEtgAAAAAAAADgIp0qtH3ooYc0aNAgpaWladKkSVq1alWsZwkAAAAAAAAAgnSa0Pb555/X/PnztWDBAq1du1bHHXecpk2bpl27dsV61gAAAAAAAADAp9OEtvfee6+uuOIKXXbZZRo5cqQeffRRZWRk6E9/+lOsZw0AAAAAAAAAfDpFaHvkyBGtWbNGU6dO9T2WkJCgqVOnasWKFTGcMwAAAAAAAAAIlhTrGYiG0tJS1dbWKicnJ+jxnJwcbd26tcH0VVVVqqqq8n1fVlYmSSovL4/sjAY6HL23AgAAaIto/W3kfR/HcaLyfh2ddz1G9W9bAAAASAr9b9tOEdq21sKFC3XLLbc0eHzAgAExmBsAAAB3yl6UHdX3O3DggLKzo/ueHdGBAwck8bctAABALLX0t22nCG179eqlxMRElZSUBD1eUlKi3NzcBtNfe+21mj9/vu/7uro67d27Vz179pTH44n4/AJAuJWXl2vAgAHasWOHsrKyYj07ANAqjuPowIED6tevX6xnpUPo16+fduzYoczMzKj8bcvvoPjFtotfbLv4xbaLb2y/+BXNbRfq37adIrRNSUnR+PHjtWzZMp133nmSLIhdtmyZZs+e3WD61NRUpaamBj3WrVu3KMwpAERWVlYWfzwAiEtU2IZPQkKCjjrqqKi/L7+D4hfbLn6x7eIX2y6+sf3iV7S2XSh/23aK0FaS5s+fr5kzZ2rChAmaOHGi7r//fh08eFCXXXZZrGcNAAAAAAAAAHw6TWh74YUXavfu3brppptUXFyssWPHasmSJQ0GJwMAAAAAAACAWOo0oa0kzZ49u9F2CADQ0aWmpmrBggUNWr8AABBp/A6KX2y7+MW2i19su/jG9otfbtx2HsdxnFjPBAAAAAAAAADAJMR6BgAAAAAAAAAAfoS2AAAAAAAAAOAihLYAEAccx9GVV16pHj16yOPxaP369VF9/0svvVTnnXdeVN8TAAAAAIDOitAWAOLAkiVLtHjxYr3xxhsqKirS6NGjYz1LAAC06KGHHtKgQYOUlpamSZMmadWqVbGepU5v4cKFOuGEE5SZmak+ffrovPPO07Zt24KmOXz4sGbNmqWePXuqa9euuuCCC1RSUhI0TWFhoaZPn66MjAz16dNHv/71r1VTUxPNRen0Fi1aJI/Ho7lz5/oeY9u517fffquLL75YPXv2VHp6usaMGaNPPvnE97zjOLrpppvUt29fpaena+rUqfr888+DXmPv3r266KKLlJWVpW7duunyyy9XRUVFtBelU6mtrdWNN96owYMHKz09Xcccc4xuu+02BQ4PxbZzj/fff1/nnHOO+vXrJ4/Ho1deeSXo+XBtq40bN+rkk09WWlqaBgwYoLvuuisiy0NoCwBx4IsvvlDfvn01efJk5ebmKikpKej5I0eOxGjOAABo3PPPP6/58+drwYIFWrt2rY477jhNmzZNu3btivWsdWrvvfeeZs2apY8//lhLly5VdXW1zjzzTB08eNA3zbx58/T666/rhRde0HvvvaedO3fq/PPP9z1fW1ur6dOn68iRI/roo4/01FNPafHixbrppptisUid0urVq/XYY4/p2GOPDXqcbedO+/bt05QpU5ScnKy//vWv2rJli+655x51797dN81dd92lBx98UI8++qhWrlypLl26aNq0aTp8+LBvmosuukibN2/W0qVL9cYbb+j999/XlVdeGYtF6jTuvPNOPfLII/rjH/+ogoIC3Xnnnbrrrrv0hz/8wTcN2849Dh48qOOOO04PPfRQo8+HY1uVl5frzDPP1MCBA7VmzRrdfffduvnmm/X444+Hf4EcAICrzZw505Hk+xo4cKBz6qmnOrNmzXLmzJnj9OzZ0znttNMcx3Gce+65xxk9erSTkZHhHHXUUc7VV1/tHDhwwPdaCxYscI477rig17/vvvucgQMH+r6vqalx5s2b52RnZzs9evRwfv3rXzszZsxwzj333CgsLQCgo5g4caIza9Ys3/e1tbVOv379nIULF8ZwrlDfrl27HEnOe++95ziO4+zfv99JTk52XnjhBd80BQUFjiRnxYoVjuM4zltvveUkJCQ4xcXFvmkeeeQRJysry6mqqoruAnRCBw4ccIYMGeIsXbrUOfXUU505c+Y4jsO2c7Pf/va3zkknndTk83V1dU5ubq5z9913+x7bv3+/k5qa6vz5z392HMdxtmzZ4khyVq9e7Zvmr3/9q+PxeJxvv/02cjPfyU2fPt352c9+FvTY+eef71x00UWO47Dt3EyS8/LLL/u+D9e2evjhh53u3bsHnTN/+9vfOsOGDQv7MlBpCwAu98ADD+jWW2/VUUcdpaKiIq1evVqS9NRTTyklJUUffvihHn30UUlSQkKCHnzwQW3evFlPPfWU3nnnHf3mN79p1fvdc889Wrx4sf70pz/pgw8+0N69e/Xyyy+HfbkAAB3XkSNHtGbNGk2dOtX3WEJCgqZOnaoVK1bEcM5QX1lZmSSpR48ekqQ1a9aouro6aNsNHz5ceXl5vm23YsUKjRkzRjk5Ob5ppk2bpvLycm3evDmKc985zZo1S9OnTw/aRhLbzs1ee+01TZgwQT/+8Y/Vp08fjRs3Tk888YTv+a+++krFxcVB2y47O1uTJk0K2nbdunXThAkTfNNMnTpVCQkJWrlyZfQWppOZPHmyli1bps8++0yStGHDBn3wwQc6++yzJbHt4km4ttWKFSt0yimnKCUlxTfNtGnTtG3bNu3bty+s85zU8iQAgFjKzs5WZmamEhMTlZub63t8yJAhDXrnBPY0GzRokH7/+9/r5z//uR5++OGQ3+/+++/Xtdde67uV7tFHH9Xbb7/dvoUAAHQqpaWlqq2tDQqGJCknJ0dbt26N0Vyhvrq6Os2dO1dTpkzx9csvLi5WSkqKunXrFjRtTk6OiouLfdM0tm29zyFynnvuOa1du9Z3ET8Q2869vvzySz3yyCOaP3++rrvuOq1evVq//OUvlZKSopkzZ/rWfWPbJnDb9enTJ+j5pKQk9ejRg20XQb/73e9UXl6u4cOHKzExUbW1tbr99tt10UUXSRLbLo6Ea1sVFxdr8ODBDV7D+1xg25P2IrQFgDg1fvz4Bo/9/e9/18KFC7V161aVl5erpqZGhw8fVmVlpTIyMlp8zbKyMhUVFWnSpEm+x5KSkjRhwoSgZvsAACD+zZo1S59++qk++OCDWM8KQrBjxw7NmTNHS5cuVVpaWqxnB61QV1enCRMm6I477pAkjRs3Tp9++qkeffRRzZw5M8Zzh+b85S9/0TPPPKNnn31Wo0aN0vr16zV37lz169ePbYeIoz0CAMSpLl26BH2/fft2ff/739exxx6rF198UWvWrPE1YPcOVJaQkNAgfK2uro7ODAMAOo1evXopMTGxwaj1JSUlQXeNIHZmz56tN954Q++++66OOuoo3+O5ubk6cuSI9u/fHzR94LbLzc1tdNt6n0NkrFmzRrt27dLxxx+vpKQkJSUl6b333tODDz6opKQk5eTksO1cqm/fvho5cmTQYyNGjFBhYaEk/7pv7pyZm5vbYCDHmpoa7d27l20XQb/+9a/1u9/9Tv/6r/+qMWPG6JJLLtG8efO0cOFCSWy7eBKubRXN8yihLQB0EGvWrFFdXZ3uuecenXjiiRo6dKh27twZNE3v3r1VXFwcFNyuX7/e9//s7Gz17ds3qLdSTU2N1qxZE/H5BwB0HCkpKRo/fryWLVvme6yurk7Lli1Tfn5+DOcMjuNo9uzZevnll/XOO+80uMVz/PjxSk5ODtp227ZtU2FhoW/b5efna9OmTUEfbJcuXaqsrKwGwRTC57vf/a42bdqk9evX+74mTJigiy66yPd/tp07TZkyRdu2bQt67LPPPtPAgQMlSYMHD1Zubm7QtisvL9fKlSuDtt3+/fuD/i5/5513VFdXF3SXHMKrsrJSCQnB0VliYqLq6uokse3iSbi2VX5+vt5///2g4qelS5dq2LBhYW2NIEkK+9BmAICwu++++5yBAwf6vg8cKdhr/fr1jiTn/vvvd7744gvn6aefdvr37+9Icvbt2+c4jo2G6fF4nEWLFjn//Oc/nT/+8Y9O9+7dg1570aJFTo8ePZyXX37ZKSgocK644gonMzPTOffccyO+nACAjuO5555zUlNTncWLFztbtmxxrrzySqdbt25Bo9Yj+q6++monOzvbWb58uVNUVOT7qqys9E3z85//3MnLy3Peeecd55NPPnHy8/Od/Px83/M1NTXO6NGjnTPPPNNZv369s2TJEqd3797OtddeG4tF6tTq/03ItnOnVatWOUlJSc7tt9/ufP75584zzzzjZGRkOP/zP//jm2bRokVOt27dnFdffdXZuHGjc+655zqDBw92Dh065JvmrLPOcsaNG+esXLnS+eCDD5whQ4Y4P/3pT2OxSJ3GzJkznf79+ztvvPGG89VXXzkvvfSS06tXL+c3v/mNbxq2nXscOHDAWbdunbNu3TpHknPvvfc669atc77++mvHccKzrfbv3+/k5OQ4l1xyifPpp586zz33nJORkeE89thjYV8eQlsAiAOhhLaO4zj33nuv07dvXyc9Pd2ZNm2a8/TTTweFto7jOI888ogzYMAAp0uXLs6MGTOc22+/Pei1q6urnTlz5jhZWVlOt27dnPnz5zszZswgtAUAtNof/vAHJy8vz0lJSXEmTpzofPzxx7GepU5PUqNfTz75pG+aQ4cOOb/4xS+c7t27OxkZGc4Pf/hDp6ioKOh1tm/f7px99tlOenq606tXL+dXv/qVU11dHeWlQf2/Cdl27vX66687o0ePdlJTU53hw4c7jz/+eNDzdXV1zo033ujk5OQ4qampzne/+11n27ZtQdPs2bPH+elPf+p07drVycrKci677DLnwIED0VyMTqe8vNyZM2eOk5eX56SlpTlHH320c/311ztVVVW+adh27vHuu+82+jtu5syZjuOEb1tt2LDBOemkk5zU1FSnf//+zqJFiyKyPB7HYWQZAAAAAAAAAHALetoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAkAEeTwevfLKKxF/n+XLl8vj8Wj//v2+x1555RV95zvfUWJioubOnavFixerW7duEZ+X0047TXPnzo34+wAAAADtsX37dnk8Hq1fvz7WswIADRDaAkA7FBcX65prrtHRRx+t1NRUDRgwQOecc46WLVsW1fmYPHmyioqKlJ2d7Xvsqquu0o9+9CPt2LFDt912my688EJ99tlnYXvPxoJiSXrppZd02223he19AAAAEHuXXnqpzjvvPN/3sb5QH+v3B4BIS4r1DABAvNq+fbumTJmibt266e6779aYMWNUXV2tt99+W7NmzdLWrVujNi8pKSnKzc31fV9RUaFdu3Zp2rRp6tevn+/x9PT0iM9Ljx49Iv4eAAAAAAB0ZFTaAkAb/eIXv5DH49GqVat0wQUXaOjQoRo1apTmz5+vjz/+uNGf+e1vf6uhQ4cqIyNDRx99tG688UZVV1f7nt+wYYNOP/10ZWZmKisrS+PHj9cnn3wiSfr66691zjnnqHv37urSpYtGjRqlt956S1Jw1evy5cuVmZkpSTrjjDPk8Xi0fPnyRtsjvP766zrhhBOUlpamXr166Yc//KHvuf/+7//WhAkTlJmZqdzcXP3bv/2bdu3aJckC69NPP12S1L17d3k8Hl166aWSGlY97Nu3TzNmzFD37t2VkZGhs88+W59//rnvee98vf322xoxYoS6du2qs846S0VFRW3YKgAAAIi0Sy+9VO+9954eeOABeTweeTwebd++XZL06aef6uyzz1bXrl2Vk5OjSy65RKWlpb6fPe2003TNNddo7ty56t69u3JycvTEE0/o4MGDuuyyy5SZmanvfOc7+utf/9qqeRo0aJDuuOMO/exnP1NmZqby8vL0+OOPB02zatUqjRs3TmlpaZowYYLWrVvX4HWam//ly5crJSVF//jHP3zT33XXXerTp49KSkpaNb8A0BJCWwBog71792rJkiWaNWuWunTp0uD5pnrHZmZmavHixdqyZYseeOABPfHEE7rvvvt8z1900UU66qijtHr1aq1Zs0a/+93vlJycLEmaNWuWqqqq9P7772vTpk2688471bVr1wbvMXnyZG3btk2S9OKLL6qoqEiTJ09uMN2bb76pH/7wh/re976ndevWadmyZZo4caLv+erqat12223asGGDXnnlFW3fvt0XzA4YMEAvvviiJGnbtm0qKirSAw880OgyX3rppfrkk0/02muvacWKFXIcR9/73veCwurKykr953/+p/77v/9b77//vgoLC/Uf//Efjb4eAAAAYuuBBx5Qfn6+rrjiChUVFamoqEgDBgzQ/v37dcYZZ2jcuHH65JNPtGTJEpWUlOgnP/lJ0M8/9dRT6tWrl1atWqVrrrlGV199tX784x9r8uTJWrt2rc4880xdcsklqqysbNV83XPPPb4w9he/+IWuvvpq39/FFRUV+v73v6+RI0dqzZo1uvnmmxv8vdnS/HuLEy655BKVlZVp3bp1uvHGG/Vf//VfysnJaccaBYBGOACAVlu5cqUjyXnppZeanU6S8/LLLzf5/N133+2MHz/e931mZqazePHiRqcdM2aMc/PNNzf63LvvvutIcvbt2+c4juPs27fPkeS8++67vmmefPJJJzs72/d9fn6+c9FFFzU7/4FWr17tSHIOHDjQ6Ht6nXrqqc6cOXMcx3Gczz77zJHkfPjhh77nS0tLnfT0dOcvf/mLb74kOf/85z990zz00ENOTk5OyPMGAACAyJo5c6Zz7rnn+r4P/JvP67bbbnPOPPPMoMd27NjhSHK2bdvm+7mTTjrJ93xNTY3TpUsX55JLLvE9VlRU5EhyVqxY0eT81H//gQMHOhdffLHv+7q6OqdPnz7OI4884jiO4zz22GNOz549nUOHDvmmeeSRRxxJzrp160Ke/6qqKmfs2LHOT37yE2fkyJHOFVdc0eQ8AkB7UGkLAG3gOE6bfu7555/XlClTlJubq65du+qGG25QYWGh7/n58+fr3//93zV16lQtWrRIX3zxhe+5X/7yl/r973+vKVOmaMGCBdq4cWO7lmH9+vX67ne/2+Tza9as0TnnnKO8vDxlZmbq1FNPlaSg+W1JQUGBkpKSNGnSJN9jPXv21LBhw1RQUOB7LCMjQ8ccc4zv+759+/paMQAAACA+bNiwQe+++666du3q+xo+fLgkBf1de+yxx/r+n5iYqJ49e2rMmDG+x7xVq639ezDwdT0ej3Jzc32vUVBQoGOPPVZpaWm+afLz81s9/ykpKXrmmWf04osv6vDhw0F3zQFAOBHaAkAbDBkyRB6Pp1WDja1YsUIXXXSRvve97+mNN97QunXrdP311+vIkSO+aW6++WZt3rxZ06dP1zvvvKORI0fq5ZdfliT9+7//u7788ktdcskl2rRpkyZMmKA//OEPbV6G5gYlO3jwoKZNm6asrCw988wzWr16tW8+Auc3XLwtILw8Hk+bg3EAAADERkVFhc455xytX78+6Ovzzz/XKaec4puusb/9Ah/zeDySpLq6ula9f2Ov25rXCHX+P/roI0nWMm3v3r2tmkcACBWhLQC0QY8ePTRt2jQ99NBDOnjwYIPn9+/f3+Cxjz76SAMHDtT111+vCRMmaMiQIfr6668bTDd06FDNmzdPf/vb33T++efrySef9D03YMAA/fznP9dLL72kX/3qV3riiSfavAzHHnusli1b1uhzW7du1Z49e7Ro0SKdfPLJGj58eINKh5SUFElSbW1tk+8xYsQI1dTUaOXKlb7H9uzZo23btmnkyJFtnncAAADEVkpKSoO/A48//nht3rxZgwYN0ne+852gr8bGgYimESNGaOPGjTp8+LDvsfqDB4cy/1988YXmzZunJ554QpMmTdLMmTNbHS4DQCgIbQGgjR566CHV1tZq4sSJevHFF/X555+roKBADz74YINbrSSrzi0sLNRzzz2nL774Qg8++KCvelWSDh06pNmzZ2v58uX6+uuv9eGHH2r16tUaMWKEJGnu3Ll6++239dVXX2nt2rV69913fc+1xYIFC/TnP/9ZCxYsUEFBgW9wM0nKy8tTSkqK/vCHP+jLL7/Ua6+9pttuuy3o5wcOHCiPx6M33nhDu3fvVkVFRaPLfO655+qKK67QBx98oA0bNujiiy9W//79de6557Z53gEAABBbgwYN0sqVK7V9+3aVlpaqrq5Os2bN0t69e/XTn/5Uq1ev1hdffKG3335bl112WbMX+qPh3/7t3+TxeHTFFVdoy5Yteuutt/Sf//mfQdO0NP+1tbW6+OKLNW3aNF122WV68skntXHjRt1zzz0xWioAHRmhLQC00dFHH621a9fq9NNP169+9SuNHj1a//Iv/6Jly5bpkUceaTD9D37wA82bN0+zZ8/W2LFj9dFHH+nGG2/0PZ+YmKg9e/ZoxowZGjp0qH7yk5/o7LPP1i233CLJKlpnzZqlESNG6KyzztLQoUP18MMPt3n+TzvtNL3wwgt67bXXNHbsWJ1xxhlatWqVJKl3795avHixXnjhBY0cOVKLFi1q8Edt//79dcstt+h3v/udcnJyNHv27Ebf58knn9T48eP1/e9/X/n5+XIcR2+99VaD29cAAAAQP/7jP/5DiYmJGjlypHr37q3CwkL169dPH374oWpra3XmmWdqzJgxmjt3rrp166aEhNjGD127dtXrr7+uTZs2ady4cbr++ut9BQteLc3/7bffrq+//lqPPfaYJBuH4fHHH9cNN9ygDRs2xGKxAHRgHoemgQAAAAAAAADgGlTaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAixDaAgAAAAAAAICLENoCAAAAAAAAgIsQ2gIAAAAAAACAi/x/J4PNP7mHAe8AAAAASUVORK5CYII=", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "plot_classification_results(\n", + " fraud_distances,\n", + " classifications_fraud,\n", + " optimal_lower,\n", + " optimal_upper,\n", + " title_prefix=f\"{model_name}_fraud\",\n", + " # save_to='../data/graphs'\n", + ")" + ] + }, + { + "cell_type": "markdown", + "id": "7aec7f95-2d43-4c41-ad11-eb910a2c97d9", + "metadata": {}, + "source": [ + "#### Length vs Distance Comparison\n", + "\n", + "This scatter plot examines the relationship between response length and validation distance across different configurations with different inference request languages. It is a birdview graph to understand the distance distributions.\n", + "\n", + "- **Blue and red/orange points**: honest and fraud inferences\n", + "- **Marker shapes**: language of inference request\n", + "- **Horizontal lines**: lower and upper threshold bounds" + ] + }, + { + "cell_type": "code", + "execution_count": 8, + "id": "38e0258f-2162-48ee-a488-313d945814d0", + "metadata": {}, + "outputs": [ + { + "name": "stdout", + "output_type": "stream", + "text": [ + "Share of fraud found = 1.0\n" + ] + }, + { + "data": { + "image/png": "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/vz8/JR3333XqX3PmjVL8ff3V4qLi+uXZWRkKACURYsWWaw7ceJEZeDAgc06B2dR+/r555+3u84HH3yg6PV65ccff7RYvnz5cgWA8vPPP9cvA6D4+voqR48erV924MABBYDy6quv1i+78sorlcDAQCUrK6t+2ZEjRxRvb2/F+nEWFBSk3HLLLQ3a9fjjjysAlPnz51ssv/rqq5XIyEiH520ymZSEhATl2muvtVi+Zs0aBYDyww8/KIqiKJ9//rkCQNm9e7fD/dmiseun7vvll1+uX9a9e3eLcx0yZIhyxRVXODzOPffc06DPVCoqKize19TUKIMGDVImTZpksdzZ6zZ37lxFr9fb7A+TyaQoivP3uS1efvllBYDy+eef213HnHvvvVcBYPHdLC0tVXr06KEkJSUpRqNRURRF2bp1qwJAGTRokFJTU1O/7g033KDodDpl+vTpFvsdO3as0r17d4tl6v2+Z8+e+mWZmZmKv7+/cvXVV9cvs+5zRVGUHTt2KACU999/v36Z+nty0UUXKXV1dRbrq5+dOHFCURTnvofr1q1TAChPPfWUxfLrrrtO0el0FtfW2estCIJjJOxQEIRmYzQa8e2332LmzJk477zz6pcPGDAAU6dOtVh36NChCA4Org+3+fHHH5GYmIi5c+di3759qKiogKIo+OmnnzB+/Pj67dauXYvx48ejS5cuOHfuXP3f5MmTYTQaG4TvzJkzB126dKl/r+7LUSjgDz/8gMWLF2P27NmYNGlSk/tBDf0rKirCq6++anOd119/HampqUhNTcWHH36ISy65BH/5y1+c8ob8+c9/RlVVlcW6ahEOdw05XLt2LQYMGID+/ftbXDe1f7du3Wqx/uTJky28U4MHD0ZoaGj9dTMajdi0aRNmzpyJ+Pj4+vV69+7drGIjd911l8X78ePHIz8/HyUlJXa30el0mDVrFjZs2ICysrL65atXr0ZCQgIuuugiAAwpBYD169c3KI7RUoKDgwEApaWldtcJDw/HoUOHcOTIkWYdIyAgoP51YWEhiouLMX78eOzbt6/Buo1dN5PJhHXr1uHKK6+0yHlUUUMEm3qfm6Nes5CQEKfOb8OGDRg1alT99QLYr3fccQdOnjyJtLQ0i/Xnzp1r4TUfPXo0FEVpEL43evRonD59GnV1dRbLx44di+HDh9e/P++88/CnP/0J3377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1unTp/HFF1/gsssuqxeKXl5eDdr96quvWlyHpuLM9/Dyyy+H0WjEa6+9ZrHeiy++CJ1OJ5O3C0IrIJ4vQRBaxOLFi7Fx40aMHz8ed999N+rq6vDqq69i4MCBDfJMAgMDMXz4cOzcubN+ji+Anq/y8nKUl5c3EF8PPPAAvvzyS8yYMQO33norhg8fjvLychw8eBCffvopTp482eTy8DfddBN27dqF+fPnIz093WJur+Dg4EZDl3bt2oW5c+ciMjISl156KT766COLz8eNG2chnADgm2++qR9NPnv2LFatWoUjR47goYcecmhIq+h0Otx444145plnADCvxx55eXk2J4ru0aOHSwt0bN68GVVVVQ2Wz5w5EzfffDPWrFmDu+66C1u3bsWFF14Io9GIjIwMrFmzBt9++63NAgyOSElJwXfffYcLL7wQf/3rX+uNxkGDBuHXX3+1WHf48OHYtGkTli1bhvj4ePTo0QOjR49uyenWM2zYMPTu3Rv/+te/UF1dbRFyCADvvfce3njjDVx99dXo1asXSktL8fbbbyM0NBSXX355o/svLi7Ghx9+CIBl7I8ePYrPPvsMx44dw/XXX48nn3zS4fbJycm4+OKLMXz4cERERGDPnj349NNPsWDBgvp11AIQCxcuxNSpU+Hl5YXrr78eV1xxBZYtW4Zp06bhxhtvxNmzZ/H666+jd+/eTcobM+eZZ57Bd999h4kTJ9ZPO3DmzBmsXbsWP/30E8LDw1t8nz/wwAM4dOgQli5diq1bt+K6665DXFwccnJysG7dOuzatQvbt28HADz00EP4+OOPMX36dCxcuBARERF47733cOLECfzvf/9rMAdgSxk0aBCmTp1qUWoe4G+nyowZM/DBBx8gLCwMycnJ2LFjBzZt2tSi8u3OfA+vvPJKXHLJJfjXv/6FkydPYsiQIfjuu+/wxRdf4N57720wRYMgCC6gPUosCoLQsdi2bZsyfPhwxdfXV+nZs6eyfPny+pLe1jzwwAMKAOW5556zWN67d28FgHLs2LEG25SWliqLFi1Sevfurfj6+ipRUVHKuHHjlBdeeKG+BLSj8ucAlMcff7z+fffu3W2WfwfQoFS0LeyVj1f/Vq5c6XBdf39/5YILLlDefPPN+lLbznDo0KH6MvWFhYU215k4caLddl166aVOH8sRal/b+/vggw8URWGJ8uee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X31Vi42N1T7//HPtwIED2i233OIwPfawYcO07du3a1u2bNH69OnD1OUdYNasWVr37t0bU82vXr1aS0hI0J588snGdVhencdsNmt79+7V9u7dqwHQFi9erO3du7cxO547yqa0tFRLTk7W7r77bu3QoUPaihUrtPDwcKYub4Pmyqu2tla7+eabtfT0dG3fvn02dQ/rTHgsL89p6f1lzz7boaZ5X3kx+CKvBcDhz7JlyxrXqaqq0n77299qcXFxWnh4uHbrrbdqubm5Nts5c+aMdsMNN2hhYWFaQkKC9vjjj2t1dXUePpquxz74Yll5ly+++EIbOHCgFhISovXr10/74IMPbB63WCza888/ryUnJ2shISHaxIkTtWPHjtmsU1RUpM2YMUOLjIzUoqOjtdmzZ2tms9mTh9EllJeXa4888ojWo0cPLTQ0VLvsssu0Z5991qYyyPLqPN98843D76pZs2Zpmua+stm/f782btw4LSQkROvevbv26quveuoQ/Upz5XX69GmndY9vvvmmcRssL89p6f1lz1Hw5W3lZdA0TXN/exoRERERERFZ45gvIiIiIiIiD2DwRURERERE5AEMvoiIiIiIiDyAwRcREREREZEHMPgiIiIiIiLyAAZfREREREREHsDgi4iIiIiIyAMYfBEREREREXkAgy8iIvIrv/zlLzFt2rQ2Pffaa6/F8uXLXVr3ww8/RGxsbJtex58UFhYiKSkJJpOps3eFiMjrMfgiIqJWa0+A4y5nzpyBwWDAvn373LK9//znP8jPz8edd97plu11NoPBgDVr1nT46yQkJOCee+7BCy+80OGvRUTk6xh8ERERAXjrrbcwe/ZsGI2d+9VYV1fXqa9vz5X9mT17Nj755BMUFxd7YI+IiHwXgy8iInK7Q4cO4YYbbkBkZCSSk5Nx9913o7CwsPHxn/70p3j44Yfx5JNPolu3bkhJScGLL75os42jR49i3LhxCA0NRWZmJr7++mub1pzevXsDAIYNGwaDwYCf/vSnNs//y1/+gtTUVMTHx2POnDnNBhEXL17Exo0bcdNNN9ksLy0txQMPPIDk5GSEhoZi4MCBWLt2rc0669evR//+/REZGYnrr78eubm5jY/t3LkTkydPRkJCAmJiYjB+/Hjs2bPH5vkGgwHvvfcebr75ZkREROCVV15BQ0MD7rvvPvTu3RthYWHo27cv3nzzzSb7vXTpUgwYMAAhISFITU3FQw89BADo1asXAODWW2+FwWBo/B8APv/8cwwfPhyhoaG47LLLsGDBAtTX1ze7PyUlJZg5cyYSExMRFhaGPn36YNmyZY3PGTBgANLS0vDZZ585PcdERMTgi4iI3Ky0tBQTJkzAsGHDsGvXLqxbtw75+fn4xS9+YbPeP/7xD0RERGD79u147bXX8Ic//AFZWVkAgIaGBkybNg3h4eHYvn07PvjgAzz77LM2z9+xYwcA4Ouvv0Zubi5Wr17d+Ng333yDU6dO4ZtvvsE//vEPfPjhh/jwww+d7vOWLVsQHh6O/v37Ny6zWCy44YYb8P333+Of//wnsrOz8eqrryIgIKBxncrKSvzlL3/Bxx9/jM2bNyMnJwdPPPFE4+NmsxmzZs3Cli1bsG3bNvTp0wc///nPYTabbV7/xRdfxK233oqDBw/i3nvvhcViQXp6OlatWoXs7GzMnz8fzzzzDD799NPG57z33nuYM2cO7r//fhw8eBD/+c9/cMUVVwCQoA8Ali1bhtzc3Mb/v/vuO9xzzz145JFHkJ2djffffx8ffvghXnnllWb35/nnn0d2dja++uorHDlyBO+99x4SEhJsnnPVVVfhu+++c3qOiYgIgEZERNRKs2bN0m655RaHj7300kvaddddZ7Ps3LlzGgDt2LFjmqZp2vjx47Vx48bZrDNq1Cjtqaee0jRN07766istMDBQy83NbXw8KytLA6B99tlnmqZp2unTpzUA2t69e5vsW8+ePbX6+vrGZXfccYc2ffp0p8fz+uuva5dddpnNsvXr12tGo7Fxn+0tW7ZMA6CdPHmycdk777yjJScnO32dhoYGLSoqSvviiy8alwHQHn30UafPUebMmaPdfvvtjf+npaVpzz77rNP1rc+VMnHiRO2Pf/yjzbKPP/5YS01NbXZ/brrpJm327NnN7t9jjz2m/fSnP23pMIiIurTAToz7iIjID+3fvx/ffPMNIiMjmzx26tQpXHnllQCAwYMH2zyWmpqKgoICAMCxY8eQkZGBlJSUxsevuuoql/dhwIABNi1UqampOHjwoNP1q6qqEBoaarNs3759SE9Pb9xfR8LDw3H55Zc7PAYAyM/Px3PPPYdvv/0WBQUFaGhoQGVlJXJycmy2M3LkyCbbfuedd7B06VLk5OSgqqoKtbW1GDp0KACgoKAAFy5cwMSJE53umyP79+/H999/b9PS1dDQgOrqalRWViI8PNzh/vzmN7/B7bffjj179uC6667DtGnTMHbsWJt1wsLCUFlZ2ar9ISLqahh8ERGRW126dAk33XQT/vSnPzV5LDU1tfHvoKAgm8cMBgMsFotb9qG1205ISEBJSYnNsrCwsDa9jqZpjf/PmjULRUVFePPNN9GzZ0+EhIRgzJgxqK2ttXleRESEzf8rVqzAE088gUWLFmHMmDGIiorCn//8Z2zfvt3lfXPk0qVLWLBgAW677bYmj1kHn/b7c8MNN+Ds2bP48ssvkZWVhYkTJ2LOnDn4y1/+0rhOcXExEhMT27RfRERdBYMvIiJyq+HDh+Pf//43evXqhcDAtn3N9O3bF+fOnUN+fj6Sk5MB6OOYlODgYADSctNew4YNQ15eHkpKShAXFwdAWuZMJhOOHz/ebOtXc77//nu8++67+PnPfw4AOHfunE3ikeaeN3bsWPz2t79tXHbq1KnGv6OiotCrVy9s2LABP/vZzxxuIygoqMm5GT58OI4dO9Y4Nqw1EhMTMWvWLMyaNQs/+clPMG/ePJvg69ChQ02SnhARkS0m3CAiojYpKyvDvn37bH7OnTuHOXPmoLi4GDNmzMDOnTtx6tQprF+/HrNnz3Y5UJo8eTIuv/xyzJo1CwcOHMD333+P5557DoC0LgFAUlISwsLCGhN6lJWVtflYhg0bhoSEBHz//feNy8aPH49rr70Wt99+O7KysnD69Gl89dVXWLduncvb7dOnDz7++GMcOXIE27dvx8yZM11qterTpw927dqF9evX4/jx43j++eebBJ8vvvgiFi1ahLfeegsnTpzAnj178Ne//rXxcRWcqaASAObPn4+PPvoICxYswOHDh3HkyBGsWLGi8dw6M3/+fHz++ec4efIkDh8+jLVr19okJ6msrMTu3btx3XXXuXxuiIi6IgZfRETUJt9++y2GDRtm87NgwQKkpaXh+++/R0NDA6677joMGjQIjz76KGJjY12eQysgIABr1qzBpUuXMGrUKPzqV79qzHaouscFBgbirbfewvvvv4+0tDTccsstbT6WgICAxrmqrP373//GqFGjMGPGDGRmZuLJJ59sVUvb3//+d5SUlGD48OG4++678fDDDyMpKanF5z3wwAO47bbbMH36dIwePRpFRUU2rWCAdGl844038O6772LAgAGYOnUqTpw40fj4okWLkJWVhYyMDAwbNgwAMGXKFKxduxb//e9/MWrUKFx99dV4/fXX0bNnz2b3Jzg4GE8//TQGDx6Ma6+9FgEBAVixYkXj459//jl69OiBn/zkJy6fGyKirsigWXdOJyIi8lLff/89xo0bh5MnT9okuXCXvLw8DBgwAHv27GkxGCFbV199NR5++GHcddddnb0rRERejWO+iIjIK3322WeIjIxEnz59cPLkSTzyyCO45pprOiTwAoCUlBT8/e9/R05ODoOvVigsLMRtt92GGTNmdPauEBF5PbZ8ERGRV/roo4/w8ssvIycnBwkJCZg0aRIWLVqE+Pj4zt41IiKiNmHwRURERERE5AFMuEFEREREROQBDL6IiIiIiIg8gMEXERERERGRBzD4IiIiIiIi8gAGX0RERERERB7A4IuIiIiIiMgDGHwRERERERF5AIMvIiIiIiIiD/j/AeZaDjv/ACjzAAAAAElFTkSuQmCC", + "text/plain": [ + "
" + ] + }, + "metadata": {}, + "output_type": "display_data" + } + ], + "source": [ + "print('Share of fraud found =', sum(np.array(classifications_fraud) == 'fraud')/len(classifications_fraud))\n", + "plot_length_vs_distance_comparison(\n", + " model_name,\n", + " honest_items_dict,\n", + " honest_distances_dict,\n", + " fraud_items_dict,\n", + " fraud_distances_dict,\n", + " # save_to='../data/graphs'\n", + ")\n" + ] + }, + { + "cell_type": "markdown", + "id": "e806ae3d-5fc0-4e89-94a3-f00889045c2f", + "metadata": {}, + "source": [ + "#### Conclusion\n", + "\n", + "The inference results of [Qwen2-VL-2B-Instruct-GPTQ-Int8](https://huggingface.co/Qwen/Qwen2-VL-2B-Instruct-GPTQ-Int8) can be separated from the results of its Int4 qunatized version with enough precision to be confident that the Gonka network will be safe from the fraud using this model." + ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "fa3ff493-a411-45f3-a770-bc79eeb77454", + "metadata": {}, + "outputs": [], + "source": [] + } + ], + "metadata": { + "kernelspec": { + "display_name": "Python 3", + "language": "python", + "name": "python3" + }, + "language_info": { + "codemirror_mode": { + "name": "ipython", + "version": 3 + }, + "file_extension": ".py", + "mimetype": "text/x-python", + "name": "python", + "nbconvert_exporter": "python", + "pygments_lexer": "ipython3", + "version": "3.13.5" + } + }, + "nbformat": 4, + "nbformat_minor": 5 +} diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/vlm_inference.py b/mlnode/packages/benchmarks/scripts/inference_validation/vlm_inference.py new file mode 100644 index 000000000..c8e79160e --- /dev/null +++ b/mlnode/packages/benchmarks/scripts/inference_validation/vlm_inference.py @@ -0,0 +1,514 @@ +#!/usr/bin/env python3 +""" +Inference-only runner for OpenAI-compatible endpoints. + +The --url should point to the mlnode API (port 8080), which proxies /v1/* +requests to vLLM backends with least-connections load-balancing. This ensures +all backends are utilised. Pointing directly at a single vLLM backend port +(e.g. 5001) also works but bypasses load-balancing. + +Multilingual mixed run template (uses script defaults for sampling/retry/workers): + python vlm_inference.py \\ + --exp-name \\ + --url http://: \\ + --model \\ + --n-prompts 1000 \\ + --multilingual \\ + --langs en ch hi ar sp + +Vision (same row layout as text; add images via --image / --images-dir): + python vlm_inference.py \\ + --exp-name vlm_run \\ + --url http://: \\ + --model \\ + --n-prompts 10 \\ + --images-dir ./imgs \\ + --prompt "Describe the image." + +Notes: +- Keep `--multilingual --langs ...` to force mixed-language prompts. +- Keep `--n-prompts` as desired total (for 5 langs and 1000 prompts => 200/lang). +- Do not pass sampling flags (`--temperature`, `--top-p`, `--top-k`, + `--repetition-penalty`) if you want pure script defaults. +- With VLM: either one image (reused for every prompt) or as many images as prompts. +""" +from __future__ import annotations + +import argparse +import json +import os +import sys +import time +from concurrent.futures import ThreadPoolExecutor, as_completed +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, List, Optional, Sequence, Tuple + +import requests +from tqdm import tqdm + + +def _add_repo_paths() -> None: + """Make `validation` + `common` imports resolve to package sources.""" + benchmarks_dir = Path(__file__).resolve().parents[2] + sys.path.insert(0, str(benchmarks_dir / "src")) + sys.path.insert(0, str(benchmarks_dir.parent / "common" / "src")) + + +_add_repo_paths() + +from validation.data import InferenceArtifactItem, ModelInfo, RequestParams # noqa: E402 +from validation.utils import _extract_logprobs, build_vlm_user_content, inference # noqa: E402 + +try: + from validation.prompts import ( # type: ignore[import-untyped] + DATASET_HANDLES, + get_squad_data_questions, + preload_all_language_prompts, + slice_mixed_language_prompts_with_langs, + ) +except ImportError: + DATASET_HANDLES: Dict[str, str] = {} + + def get_squad_data_questions() -> List[str]: + return list(_FALLBACK_SQUAD_QUESTIONS) + + def preload_all_language_prompts(lang_tuple: Tuple[str, ...]) -> dict: + raise RuntimeError( + "Multilingual prompts require the `validation.prompts` package. " + "Use --prompts-file or install the validation package." + ) + + def slice_mixed_language_prompts_with_langs(*_a: Any, **_k: Any) -> Tuple[List[str], List[str]]: + raise RuntimeError( + "Multilingual prompts require the `validation.prompts` package. " + "Use --prompts-file or install the validation package." + ) + + +# Used only when `validation.prompts` is not available (same role as Squad list). +_FALLBACK_SQUAD_QUESTIONS = [ + "What information is relevant to answer the question?", + "What is the main claim in the passage?", + "Which detail supports the conclusion?", +] * 400 + + +IMAGE_SUFFIXES = {".jpg", ".jpeg", ".png", ".webp", ".gif", ".bmp"} + + +@dataclass(frozen=True) +class VllmProbe: + base_url: str + models_url: str + served_model_ids: List[str] + raw_models_response: Dict[str, Any] + health_status_code: Optional[int] + version_status_code: Optional[int] + version_body: Optional[str] + timestamp: str + + +def _wait_for_vllm(base_url: str, timeout_s: int = 120) -> Dict[str, Any]: + models_url = base_url.rstrip("/") + "/v1/models" + deadline = time.time() + timeout_s + last_err: Optional[str] = None + while time.time() < deadline: + try: + r = requests.get(models_url, timeout=5) + if r.status_code == 200: + return r.json() + last_err = f"{r.status_code}: {r.text[:200]}" + except Exception as e: # noqa: BLE001 + last_err = repr(e) + time.sleep(1) + raise RuntimeError(f"vLLM not ready at {models_url} within {timeout_s}s. Last error: {last_err}") + + +def _probe_vllm(base_url: str, timeout_s: int) -> VllmProbe: + models_json = _wait_for_vllm(base_url, timeout_s=timeout_s) + data = models_json.get("data", []) + served_ids = [m.get("id") for m in data if isinstance(m, dict) and m.get("id")] + + health_code: Optional[int] = None + version_code: Optional[int] = None + version_body: Optional[str] = None + + try: + health_code = requests.get(base_url.rstrip("/") + "/health", timeout=5).status_code + except Exception: # noqa: BLE001 + health_code = None + + try: + vr = requests.get(base_url.rstrip("/") + "/version", timeout=5) + version_code = vr.status_code + version_body = vr.text[:5000] + except Exception: # noqa: BLE001 + version_code = None + version_body = None + + return VllmProbe( + base_url=base_url.rstrip("/"), + models_url=base_url.rstrip("/") + "/v1/models", + served_model_ids=served_ids, + raw_models_response=models_json, + health_status_code=health_code, + version_status_code=version_code, + version_body=version_body, + timestamp=datetime.now().isoformat(), + ) + + +def _resolve_model_name(configured: str, served_ids: List[str], *, base_url: str) -> str: + if configured and configured in served_ids: + return configured + if served_ids: + fallback = str(served_ids[0]) + if configured and configured != fallback: + print( + f"[warn] Model '{configured}' not found in /v1/models for {base_url}. " + f"Falling back to served id '{fallback}'." + ) + return fallback + if configured: + return configured + raise RuntimeError(f"No served models found at {base_url}/v1/models") + + +def _make_exp_dir(out_base: Path, exp_name: str) -> Path: + out_base.mkdir(parents=True, exist_ok=True) + ts = datetime.now().strftime("%Y-%m-%d_%H%M%S") + exp_dir = out_base / f"{exp_name}_{ts}" + exp_dir.mkdir(parents=True, exist_ok=True) + return exp_dir + + +def _collect_image_paths(images_dir: Optional[Path], image_args: List[Path]) -> List[Path]: + paths: List[Path] = [] + for p in image_args: + rp = p.expanduser().resolve() + if not rp.is_file(): + raise FileNotFoundError(f"Image not found: {rp}") + paths.append(rp) + + if images_dir is not None: + d = images_dir.expanduser().resolve() + if not d.is_dir(): + raise NotADirectoryError(f"Not a directory: {d}") + for f in sorted(d.rglob("*")): + if f.is_file() and f.suffix.lower() in IMAGE_SUFFIXES: + paths.append(f) + + seen: set[str] = set() + unique: List[Path] = [] + for p in paths: + key = str(p.resolve()) + if key not in seen: + seen.add(key) + unique.append(p) + + if images_dir is not None and not unique and not image_args: + raise FileNotFoundError( + f"No image files found under --images-dir: {images_dir} " + f"(expected one of: {sorted(IMAGE_SUFFIXES)})." + ) + return unique + + +def _per_prompt_image_lists( + n_prompts: int, + image_paths: Sequence[Path], +) -> Optional[List[List[Path]]]: + """One list of image paths per prompt row. None = text-only (original behaviour).""" + if not image_paths: + return None + imgs = list(image_paths) + if len(imgs) == 1: + return [[imgs[0]] for _ in range(n_prompts)] + if len(imgs) == n_prompts: + return [[p] for p in imgs] + raise ValueError( + f"VLM: need 1 image (repeated for all prompts) or exactly {n_prompts} images " + f"(one per prompt); got {len(imgs)} image(s)." + ) + + +def _load_prompts( + prompts_file: Optional[Path], + n_prompts: int, + multilingual: bool = False, + langs: Optional[List[str]] = None, + prompt_text: Optional[str] = None, +) -> tuple: + """Return (prompts, languages) where languages is a list of lang codes per prompt.""" + if prompts_file: + prompts: List[str] = [] + for line in prompts_file.read_text(encoding="utf-8").splitlines(): + t = line.strip() + if t: + prompts.append(t) + if not prompts: + raise RuntimeError(f"No prompts found in file: {prompts_file}") + prompts = prompts[:n_prompts] + return prompts, ["en"] * len(prompts) + + if multilingual: + lang_tuple = tuple(langs) if langs else ("en", "ch", "hi", "ar") + n_per_lang = max(1, n_prompts // len(lang_tuple)) + all_prompts_by_lang = preload_all_language_prompts(lang_tuple) + prompts, languages = slice_mixed_language_prompts_with_langs( + all_prompts_by_lang, per_language_n=n_per_lang, langs=lang_tuple + ) + return prompts[:n_prompts], languages[:n_prompts] + + if prompt_text: + return [prompt_text] * n_prompts, ["en"] * n_prompts + + prompts = get_squad_data_questions()[:n_prompts] + return prompts, ["en"] * len(prompts) + + +def _run_with_retries(fn, max_attempts: int, backoff_start_s: float, backoff_mult: float): + attempt = 1 + delay = backoff_start_s + while True: + try: + return fn() + except Exception: + if attempt >= max_attempts: + raise + time.sleep(delay) + delay *= backoff_mult + attempt += 1 + + +def main() -> None: + parser = argparse.ArgumentParser( + description=( + "Run INFERENCE ONLY against an already running OpenAI-compatible vLLM server. " + "Saves a pure inference artifact and inference config under data/experiments/_/. " + "With images, each row uses the same protocol as text inference (utils.inference + _extract_logprobs)." + ) + ) + parser.add_argument("--exp-name", default="inference", help="Experiment name prefix (used when --exp-dir is not set).") + parser.add_argument( + "--exp-dir", + type=Path, + default=None, + help="Write into an existing experiment directory instead of creating a new one.", + ) + parser.add_argument("--url", required=True, help="Server URL (mlnode API recommended for load-balancing across backends, e.g. http://HOST:8080)") + parser.add_argument("--model", default="", help="Model id to use; default: first served id from /v1/models.") + parser.add_argument( + "--api-key", + default=os.environ.get("OPENAI_API_KEY", ""), + help="Optional Bearer token (default: env OPENAI_API_KEY).", + ) + parser.add_argument("--n-prompts", type=int, default=1000, help="Number of prompts to run.") + parser.add_argument( + "--prompt", + type=str, + default=None, + help="Single prompt text repeated for all requests (useful for VLM image batches).", + ) + parser.add_argument("--prompts-file", type=Path, default=None, help="Optional text file with one prompt per line.") + parser.add_argument("--language", default="en", help="Language tag to store in artifact rows (single-language mode).") + parser.add_argument("--multilingual", action="store_true", help="Use multilingual Alpaca prompts (en, ch, hi, ar by default).") + langs_help = f"Languages to include with --multilingual. Available: {list(DATASET_HANDLES.keys())}" if DATASET_HANDLES else "Languages to include with --multilingual." + parser.add_argument("--langs", type=str, nargs="*", default=None, help=langs_help) + parser.add_argument( + "--image", + type=Path, + action="append", + default=[], + dest="images", + help="Image file (repeatable). With VLM: one image for all prompts, or one per prompt (see --n-prompts).", + ) + parser.add_argument( + "--images-dir", + type=Path, + default=None, + help="Directory of images (jpg/png/webp/...). Combined with --image; sorted order.", + ) + parser.add_argument( + "--image-detail", + choices=("auto", "low", "high"), + default=None, + help="Optional image_url.detail for multimodal requests.", + ) + parser.add_argument("--max-workers", type=int, default=64, help="Concurrent workers.") + parser.add_argument("--wait-timeout-s", type=int, default=120, help="Seconds to wait for /v1/models readiness.") + parser.add_argument("--max-attempts", type=int, default=3, help="Retry attempts per prompt.") + parser.add_argument("--retry-backoff-start-s", type=float, default=1.0, help="Initial retry backoff in seconds.") + parser.add_argument("--retry-backoff-mult", type=float, default=2.0, help="Retry backoff multiplier.") + parser.add_argument("--max-tokens", type=int, default=3000) + parser.add_argument("--temperature", type=float, default=0.99) + parser.add_argument("--seed", type=int, default=42) + parser.add_argument("--top-logprobs", type=int, default=5) + parser.add_argument("--top-p", type=float, default=None, help="Nucleus sampling top-p (omitted from payload when None).") + parser.add_argument("--top-k", type=int, default=None, help="Top-k sampling (omitted from payload when None).") + parser.add_argument("--repetition-penalty", type=float, default=None, help="Repetition penalty (omitted from payload when None).") + args = parser.parse_args() + + benchmarks_dir = Path(__file__).resolve().parents[2] + if args.exp_dir: + exp_dir = args.exp_dir.resolve() + exp_dir.mkdir(parents=True, exist_ok=True) + else: + out_base = benchmarks_dir / "data" / "experiments" + exp_dir = _make_exp_dir(out_base=out_base, exp_name=args.exp_name) + inference_artifact_path = exp_dir / "inference_results.jsonl" + inference_cfg_path = exp_dir / "inference_config.json" + + probe = _probe_vllm(args.url, timeout_s=int(args.wait_timeout_s)) + model_name = _resolve_model_name(str(args.model or ""), probe.served_model_ids, base_url=args.url) + + model_info = ModelInfo( + url=args.url.rstrip("/") + "/", + name=model_name, + deploy_params={}, + ) + request_params = RequestParams( + max_tokens=int(args.max_tokens), + temperature=float(args.temperature), + seed=int(args.seed), + top_logprobs=int(args.top_logprobs), + top_p=args.top_p, + top_k=args.top_k, + repetition_penalty=args.repetition_penalty, + additional_params={}, + ) + + prompts, languages = _load_prompts( + args.prompts_file, + n_prompts=int(args.n_prompts), + multilingual=args.multilingual, + langs=args.langs, + prompt_text=args.prompt, + ) + + image_paths_raw = _collect_image_paths(args.images_dir, list(args.images)) + try: + per_prompt_images = _per_prompt_image_lists(len(prompts), image_paths_raw) + except ValueError as e: + raise SystemExit(str(e)) from e + + api_key: Optional[str] = str(args.api_key).strip() or None + image_detail: Optional[str] = args.image_detail + + cfg = { + "exp_name": str(args.exp_name), + "timestamp": datetime.now().isoformat(), + "artifact_dir": str(exp_dir), + "inference_artifact": str(inference_artifact_path), + "n_prompts": len(prompts), + "multilingual": args.multilingual, + "languages_used": sorted(set(languages)), + "vlm": per_prompt_images is not None, + "model_info": model_info.model_dump(), + "request_params": request_params.model_dump(), + "vllm_runtime_probe": asdict(probe), + "cli": { + "url": args.url, + "model": args.model, + "n_prompts": args.n_prompts, + "prompts_file": str(args.prompts_file) if args.prompts_file else None, + "max_workers": args.max_workers, + "wait_timeout_s": args.wait_timeout_s, + "max_attempts": args.max_attempts, + "retry_backoff_start_s": args.retry_backoff_start_s, + "retry_backoff_mult": args.retry_backoff_mult, + "max_tokens": args.max_tokens, + "temperature": args.temperature, + "seed": args.seed, + "top_logprobs": args.top_logprobs, + "top_p": args.top_p, + "top_k": args.top_k, + "repetition_penalty": args.repetition_penalty, + "images": [str(p) for p in image_paths_raw], + "image_detail": image_detail, + }, + } + inference_cfg_path.write_text(json.dumps(cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + + def _work( + prompt: str, + lang: str, + images_for_row: Optional[List[Path]], + ) -> tuple: + def _call(): + if images_for_row: + content = build_vlm_user_content( + text=prompt, + image_paths=images_for_row, + image_detail=image_detail, + ) + messages = [{"role": "user", "content": content}] + return inference(model_info, request_params, prompt, messages=messages, api_key=api_key) + return inference(model_info, request_params, prompt, api_key=api_key) + + t0 = time.monotonic() + resp = _run_with_retries( + _call, + max_attempts=max(1, int(args.max_attempts)), + backoff_start_s=float(args.retry_backoff_start_s), + backoff_mult=float(args.retry_backoff_mult), + ) + prompt_elapsed = time.monotonic() - t0 + inference_result = _extract_logprobs(resp) + n_tokens = len(inference_result.results) + meta: Dict[str, Any] = {} + if images_for_row: + meta["image_paths"] = [str(p) for p in images_for_row] + if image_detail: + meta["image_detail"] = image_detail + row = InferenceArtifactItem( + prompt=prompt, + language=lang, + inference_result=inference_result, + inference_model=model_info, + request_params=request_params, + metadata=meta, + ) + return row.model_dump_json() + "\n", n_tokens, prompt_elapsed + + total_output_tokens = 0 + prompt_times: List[float] = [] + run_start = time.monotonic() + + with inference_artifact_path.open("w", encoding="utf-8") as f, ThreadPoolExecutor( + max_workers=int(args.max_workers) + ) as ex: + if per_prompt_images is None: + futures = [ex.submit(_work, prompt, lang, None) for prompt, lang in zip(prompts, languages)] + else: + futures = [ + ex.submit(_work, prompt, lang, per_prompt_images[i]) + for i, (prompt, lang) in enumerate(zip(prompts, languages)) + ] + for fut in tqdm(as_completed(futures), total=len(futures), desc="Inference", smoothing=0): + line, n_tok, elapsed = fut.result() + f.write(line) + total_output_tokens += n_tok + prompt_times.append(elapsed) + + run_elapsed = time.monotonic() - run_start + + performance = { + "total_time_seconds": round(run_elapsed, 3), + "n_prompts": len(prompts), + "total_output_tokens": total_output_tokens, + "output_tokens_per_second": round(total_output_tokens / run_elapsed, 2) if run_elapsed > 0 else 0, + "average_time_per_prompt_seconds": round(run_elapsed / len(prompts), 3) if prompts else 0, + } + cfg["performance"] = performance + inference_cfg_path.write_text(json.dumps(cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + + print(f"done: wrote {len(prompts)} inference rows -> {inference_artifact_path}") + print(f"config -> {inference_cfg_path}") + print(f"performance: {json.dumps(performance, indent=2)}") + + +if __name__ == "__main__": + main() diff --git a/mlnode/packages/benchmarks/scripts/inference_validation/vlm_validation.py b/mlnode/packages/benchmarks/scripts/inference_validation/vlm_validation.py new file mode 100644 index 000000000..e6d4ff4bd --- /dev/null +++ b/mlnode/packages/benchmarks/scripts/inference_validation/vlm_validation.py @@ -0,0 +1,416 @@ +#!/usr/bin/env python3 +from __future__ import annotations + +import argparse +import json +import os +import sys +import time +from concurrent.futures import ThreadPoolExecutor, as_completed +from dataclasses import asdict, dataclass +from datetime import datetime +from pathlib import Path +from typing import Any, Dict, List, Optional, Tuple + +import requests +from tqdm import tqdm + + +def _add_repo_paths() -> None: + """Make `validation` + `common` imports resolve to package sources.""" + benchmarks_dir = Path(__file__).resolve().parents[2] + sys.path.insert(0, str(benchmarks_dir / "src")) + sys.path.insert(0, str(benchmarks_dir.parent / "common" / "src")) + + +_add_repo_paths() + +from validation.data import ( # noqa: E402 + InferenceArtifactItem, + ModelInfo, + RequestParams, + ValidationItem, +) +from validation.utils import ( # noqa: E402 + EnforcedTokens, + _extract_logprobs, + build_vlm_user_content, + validation as validation_call, +) + +IMAGE_SUFFIXES = {".jpg", ".jpeg", ".png", ".webp", ".gif", ".bmp"} + + +@dataclass(frozen=True) +class VllmProbe: + base_url: str + models_url: str + served_model_ids: List[str] + raw_models_response: Dict[str, Any] + health_status_code: Optional[int] + version_status_code: Optional[int] + version_body: Optional[str] + timestamp: str + + +def _wait_for_vllm(base_url: str, timeout_s: int = 120) -> Dict[str, Any]: + models_url = base_url.rstrip("/") + "/v1/models" + deadline = time.time() + timeout_s + last_err: Optional[str] = None + while time.time() < deadline: + try: + r = requests.get(models_url, timeout=5) + if r.status_code == 200: + return r.json() + last_err = f"{r.status_code}: {r.text[:200]}" + except Exception as e: # noqa: BLE001 + last_err = repr(e) + time.sleep(1) + raise RuntimeError(f"vLLM not ready at {models_url} within {timeout_s}s. Last error: {last_err}") + + +def _probe_vllm(base_url: str, timeout_s: int) -> VllmProbe: + models_json = _wait_for_vllm(base_url, timeout_s=timeout_s) + data = models_json.get("data", []) + served_ids = [m.get("id") for m in data if isinstance(m, dict) and m.get("id")] + + health_code: Optional[int] = None + version_code: Optional[int] = None + version_body: Optional[str] = None + + try: + health_code = requests.get(base_url.rstrip("/") + "/health", timeout=5).status_code + except Exception: # noqa: BLE001 + health_code = None + + try: + vr = requests.get(base_url.rstrip("/") + "/version", timeout=5) + version_code = vr.status_code + version_body = vr.text[:5000] + except Exception: # noqa: BLE001 + version_code = None + version_body = None + + return VllmProbe( + base_url=base_url.rstrip("/"), + models_url=base_url.rstrip("/") + "/v1/models", + served_model_ids=served_ids, + raw_models_response=models_json, + health_status_code=health_code, + version_status_code=version_code, + version_body=version_body, + timestamp=datetime.now().isoformat(), + ) + + +def _resolve_model_name(configured: str, served_ids: List[str], *, base_url: str) -> str: + if configured and configured in served_ids: + return configured + if served_ids: + fallback = str(served_ids[0]) + if configured and configured != fallback: + print( + f"[warn] Model '{configured}' not found in /v1/models for {base_url}. " + f"Falling back to served id '{fallback}'." + ) + return fallback + if configured: + return configured + raise RuntimeError(f"No served models found at {base_url}/v1/models") + + +def _run_with_retries(fn, max_attempts: int, backoff_start_s: float, backoff_mult: float): + attempt = 1 + delay = backoff_start_s + while True: + try: + return fn() + except Exception: + if attempt >= max_attempts: + raise + time.sleep(delay) + delay *= backoff_mult + attempt += 1 + + +def _load_inference_items(path: Path) -> List[InferenceArtifactItem]: + items: List[InferenceArtifactItem] = [] + with path.open("r", encoding="utf-8") as f: + for line in f: + if not line.strip(): + continue + items.append(InferenceArtifactItem.model_validate_json(line)) + if not items: + raise RuntimeError(f"No rows found in inference artifact: {path}") + return items + + +def _collect_image_paths(images_dir: Optional[Path]) -> List[Path]: + if images_dir is None: + return [] + d = images_dir.expanduser().resolve() + if not d.is_dir(): + raise NotADirectoryError(f"Not a directory: {d}") + paths: List[Path] = [] + for f in sorted(d.rglob("*")): + if f.is_file() and f.suffix.lower() in IMAGE_SUFFIXES: + paths.append(f) + if not paths: + raise FileNotFoundError( + f"No image files found under --images-dir: {images_dir} " + f"(expected one of: {sorted(IMAGE_SUFFIXES)})." + ) + return paths + + +def _per_item_image_lists(n_items: int, image_paths: List[Path]) -> Optional[List[List[Path]]]: + if not image_paths: + return None + if len(image_paths) == 1: + return [[image_paths[0]] for _ in range(n_items)] + if len(image_paths) == n_items: + return [[p] for p in image_paths] + raise ValueError( + f"VLM validation: need 1 image (reused for all rows) or exactly {n_items} images " + f"(one per row); got {len(image_paths)} image(s)." + ) + + +def _load_inference_config(exp_dir: Path) -> Optional[Dict[str, Any]]: + cfg_path = exp_dir / "inference_config.json" + if not cfg_path.exists(): + return None + try: + return json.loads(cfg_path.read_text(encoding="utf-8")) + except Exception as e: # noqa: BLE001 + print(f"[warn] Failed to read inference_config.json: {e!r}") + return None + + +def _extract_check_fields(inference_cfg: Optional[Dict[str, Any]]) -> Dict[str, Any]: + if not inference_cfg: + return {} + return { + "model_info": inference_cfg.get("model_info"), + "request_params": inference_cfg.get("request_params"), + "vllm_runtime_probe.served_model_ids": (inference_cfg.get("vllm_runtime_probe") or {}).get("served_model_ids"), + "vllm_runtime_probe.raw_models_response": (inference_cfg.get("vllm_runtime_probe") or {}).get("raw_models_response"), + } + + +def _compare_configs( + inference_cfg: Optional[Dict[str, Any]], + validation_model_info: ModelInfo, + validation_request_params: RequestParams, + validation_probe: VllmProbe, +) -> Tuple[bool, List[str]]: + expected = _extract_check_fields(inference_cfg) + actual = { + "model_info": validation_model_info.model_dump(), + "request_params": validation_request_params.model_dump(), + "vllm_runtime_probe.served_model_ids": validation_probe.served_model_ids, + "vllm_runtime_probe.raw_models_response": validation_probe.raw_models_response, + } + diffs: List[str] = [] + for k in expected.keys(): + if expected.get(k) != actual.get(k): + diffs.append(k) + return len(diffs) == 0, diffs + + +def main() -> None: + parser = argparse.ArgumentParser( + description=( + "Run VALIDATION ONLY from a pure inference artifact JSONL. " + "Writes inference+validation artifact and validation config into the same experiment folder." + ) + ) + parser.add_argument( + "--inference-artifact", + required=True, + type=Path, + help="Path to inference_results.jsonl (e.g. from vlm_inference.py or text inference runners).", + ) + parser.add_argument("--validation-url", required=True, help="Server URL (mlnode API recommended for load-balancing across backends, e.g. http://HOST:8080)") + parser.add_argument("--validation-model", default="", help="Model id to use; default: first served id from /v1/models.") + parser.add_argument( + "--api-key", + default=os.environ.get("OPENAI_API_KEY", ""), + help="Optional Bearer token (default: env OPENAI_API_KEY).", + ) + parser.add_argument("--max-workers", type=int, default=64, help="Concurrent workers.") + parser.add_argument("--wait-timeout-s", type=int, default=120, help="Seconds to wait for /v1/models readiness.") + parser.add_argument("--max-attempts", type=int, default=3, help="Retry attempts per prompt.") + parser.add_argument("--retry-backoff-start-s", type=float, default=1.0, help="Initial retry backoff in seconds.") + parser.add_argument("--retry-backoff-mult", type=float, default=2.0, help="Retry backoff multiplier.") + parser.add_argument( + "--artifact-tag", + default="", + help="Optional suffix for output filenames, e.g. 'v09' -> validation_results__v09.jsonl", + ) + parser.add_argument( + "--exp-dir", + type=Path, + default=None, + help="Experiment directory to write results into. Default: same directory as --inference-artifact.", + ) + parser.add_argument( + "--images-dir", + type=Path, + default=None, + help=( + "Optional fallback directory of images for VLM validation when inference artifact " + "rows do not have metadata.image_paths. Supports 1 image for all rows or N images for N rows." + ), + ) + args = parser.parse_args() + + if not args.inference_artifact.exists(): + raise RuntimeError(f"inference artifact not found: {args.inference_artifact}") + + exp_dir = args.exp_dir.resolve() if args.exp_dir else args.inference_artifact.resolve().parent + exp_dir.mkdir(parents=True, exist_ok=True) + tag = f"__{args.artifact_tag}" if str(args.artifact_tag).strip() else "" + output_path = exp_dir / f"validation_results{tag}.jsonl" + validation_cfg_path = exp_dir / f"validation_config{tag}.json" + + inference_items = _load_inference_items(args.inference_artifact) + fallback_images = _collect_image_paths(args.images_dir) + per_item_images = _per_item_image_lists(len(inference_items), fallback_images) + request_params = inference_items[0].request_params + + probe = _probe_vllm(args.validation_url, timeout_s=int(args.wait_timeout_s)) + model_name = _resolve_model_name(str(args.validation_model or ""), probe.served_model_ids, base_url=args.validation_url) + validation_model = ModelInfo( + url=args.validation_url.rstrip("/") + "/", + name=model_name, + deploy_params={}, + ) + + inference_cfg = _load_inference_config(exp_dir) + same, diff_keys = _compare_configs(inference_cfg, validation_model, request_params, probe) + if same: + print("[config-check] inference and validation configs look the same.") + else: + print("[config-check] WARNING: inference and validation configs differ (continuing):") + for key in diff_keys: + print(f" - {key}") + + api_key: Optional[str] = str(args.api_key).strip() or None + + validation_cfg = { + "timestamp": datetime.now().isoformat(), + "artifact_dir": str(exp_dir), + "source_inference_artifact": str(args.inference_artifact.resolve()), + "validation_artifact": str(output_path), + "n_items": len(inference_items), + "validation_model_info": validation_model.model_dump(), + "request_params": request_params.model_dump(), + "vllm_runtime_probe": asdict(probe), + "config_check_passed": same, + "config_diff_keys": diff_keys, + "cli": { + "validation_url": args.validation_url, + "validation_model": args.validation_model, + "max_workers": args.max_workers, + "wait_timeout_s": args.wait_timeout_s, + "max_attempts": args.max_attempts, + "retry_backoff_start_s": args.retry_backoff_start_s, + "retry_backoff_mult": args.retry_backoff_mult, + "artifact_tag": args.artifact_tag, + "api_key_set": bool(api_key), + "images_dir": str(args.images_dir.resolve()) if args.images_dir else None, + "fallback_images_count": len(fallback_images), + }, + } + validation_cfg_path.write_text(json.dumps(validation_cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + + def _messages_for_item(item: InferenceArtifactItem, fallback_row_images: Optional[List[Path]]) -> Optional[List[Dict[str, Any]]]: + raw_paths = item.metadata.get("image_paths") + image_paths: Optional[List[Path]] + if raw_paths: + image_paths = [Path(str(p)) for p in raw_paths] + else: + image_paths = fallback_row_images + if not image_paths: + return None + img_detail = item.metadata.get("image_detail") + content = build_vlm_user_content( + text=item.prompt, + image_paths=image_paths, + image_detail=str(img_detail) if img_detail else None, + ) + return [{"role": "user", "content": content}] + + def _work(item: InferenceArtifactItem, fallback_row_images: Optional[List[Path]]) -> tuple: + enforced_tokens = EnforcedTokens.from_result(item.inference_result) + vlm_messages = _messages_for_item(item, fallback_row_images) + + def _call(): + return validation_call( + validation_model, + request_params, + item.prompt, + enforced_tokens=enforced_tokens, + messages=vlm_messages, + api_key=api_key, + ) + + t0 = time.monotonic() + resp = _run_with_retries( + _call, + max_attempts=max(1, int(args.max_attempts)), + backoff_start_s=float(args.retry_backoff_start_s), + backoff_mult=float(args.retry_backoff_mult), + ) + prompt_elapsed = time.monotonic() - t0 + validation_result = _extract_logprobs(resp) + n_tokens = len(validation_result.results) + if validation_result.text != item.inference_result.text: + print("[warn] validation text mismatch for one prompt; keeping row in artifact.") + + out_item = ValidationItem( + prompt=item.prompt, + language=item.language, + inference_result=item.inference_result, + validation_result=validation_result, + inference_model=item.inference_model, + validation_model=validation_model, + request_params=request_params, + ) + return out_item.model_dump_json() + "\n", n_tokens, prompt_elapsed + + total_output_tokens = 0 + prompt_times: List[float] = [] + run_start = time.monotonic() + + with output_path.open("w", encoding="utf-8") as f, ThreadPoolExecutor(max_workers=int(args.max_workers)) as ex: + if per_item_images is None: + futures = [ex.submit(_work, item, None) for item in inference_items] + else: + futures = [ex.submit(_work, item, per_item_images[i]) for i, item in enumerate(inference_items)] + for fut in tqdm(as_completed(futures), total=len(futures), desc="Validation", smoothing=0): + line, n_tok, elapsed = fut.result() + f.write(line) + total_output_tokens += n_tok + prompt_times.append(elapsed) + + run_elapsed = time.monotonic() - run_start + + performance = { + "total_time_seconds": round(run_elapsed, 3), + "n_prompts": len(inference_items), + "total_output_tokens": total_output_tokens, + "output_tokens_per_second": round(total_output_tokens / run_elapsed, 2) if run_elapsed > 0 else 0, + "average_time_per_prompt_seconds": round(run_elapsed / len(inference_items), 3) if inference_items else 0, + } + validation_cfg["performance"] = performance + validation_cfg_path.write_text(json.dumps(validation_cfg, indent=2, ensure_ascii=False) + "\n", encoding="utf-8") + + print(f"done: wrote {len(inference_items)} validated rows -> {output_path}") + print(f"config -> {validation_cfg_path}") + print(f"performance: {json.dumps(performance, indent=2)}") + + +if __name__ == "__main__": + main() \ No newline at end of file diff --git a/mlnode/packages/benchmarks/src/validation/analysis.py b/mlnode/packages/benchmarks/src/validation/analysis.py index c7cef9fb2..e28a44d93 100644 --- a/mlnode/packages/benchmarks/src/validation/analysis.py +++ b/mlnode/packages/benchmarks/src/validation/analysis.py @@ -4,6 +4,7 @@ from collections import Counter from tqdm import tqdm from joblib import Parallel, delayed +from collections.abc import Mapping from validation.utils import distance2 from validation import stats @@ -63,9 +64,7 @@ def plot_distances_and_matches(items, distances, top_k_matches_ratios, title_pre """ n_tokens = [len(item.inference_result.results) for item in items] - # Format title_prefix for better readability by breaking long paths if len(title_prefix) > 40: - # Break on path separators and long underscores for better readability formatted_prefix = title_prefix.replace('/', '/\n').replace('___', '___\n') else: formatted_prefix = title_prefix @@ -177,19 +176,103 @@ def plot_classification_results(distances, classifications, lower_bound, upper_b plt.show() -def plot_length_vs_distance_comparison(name, honest_items, honest_distances, fraud_items, fraud_distances): +def _get_item_text_length(item) -> int: + """Extract len(inference_result.text) from either pydantic-like objects or dict rows.""" + try: + if hasattr(item, "inference_result") and hasattr(item.inference_result, "text"): + return len(item.inference_result.text) + except Exception: + pass + if isinstance(item, dict): + inf_res = item.get("inference_result") + if isinstance(inf_res, dict) and "text" in inf_res: + return len(inf_res["text"]) + if hasattr(inf_res, "text"): + return len(inf_res.text) + raise TypeError(f"Unsupported item type for text length: {type(item)}") + + +def plot_length_vs_distance_comparison( + name, + honest_items, + honest_distances, + fraud_items, + fraud_distances, + bounds=None, + save_to=None, +): """Create combined length vs distance plot for comparison""" - # Calculate lengths for honest and fraud items - honest_lengths = [len(item.inference_result.text) for item in honest_items] - fraud_lengths = [len(item.inference_result.text) for item in fraud_items] + def _flatten_items_and_distances(items, distances): + if isinstance(items, Mapping) and isinstance(distances, Mapping): + flat_items = [] + flat_distances = [] + for k in distances.keys(): + if k not in items: + continue + subitems = items[k] + subdistances = distances[k] + if isinstance(subitems, Mapping): + raise TypeError( + "plot_length_vs_distance_comparison: expected items[k] to be a list, got Mapping" + ) + try: + subitems_list = list(subitems) + except TypeError as e: + raise TypeError( + f"plot_length_vs_distance_comparison: items[{k!r}] is not iterable: {type(subitems)}" + ) from e + try: + subdist_list = list(subdistances) + except TypeError as e: + raise TypeError( + f"plot_length_vs_distance_comparison: distances[{k!r}] is not iterable: {type(subdistances)}" + ) from e + for item, d in zip(subitems_list, subdist_list): + flat_items.append(item) + flat_distances.append(d) + return flat_items, flat_distances + + if isinstance(distances, Mapping): + raise TypeError( + "plot_length_vs_distance_comparison: unsupported combination of items/distances types: " + f"{type(items)} vs {type(distances)}" + ) + + items_seq = list(items.values()) if isinstance(items, Mapping) else list(items) + dist_seq = list(distances) + return items_seq, dist_seq - # Combined overlay plot only plt.figure(figsize=(10, 6)) - plt.scatter(honest_lengths, honest_distances, alpha=0.5, color='blue', label='Honest Items', s=10) - plt.scatter(fraud_lengths, fraud_distances, alpha=0.5, color='red', label='Fraud Items', s=10) + + honest_flat = _flatten_items_and_distances(honest_items, honest_distances) + honest_items_seq, honest_dist_vals = honest_flat + honest_lengths = [_get_item_text_length(item) for item in honest_items_seq] + + fraud_flat = _flatten_items_and_distances(fraud_items, fraud_distances) + fraud_items_seq, fraud_dist_vals = fraud_flat + fraud_lengths = [_get_item_text_length(item) for item in fraud_items_seq] + + plt.scatter(honest_lengths, honest_dist_vals, alpha=0.5, color='blue', label='Honest Items', s=10) + plt.scatter(fraud_lengths, fraud_dist_vals, alpha=0.5, color='red', label='Fraud Items', s=10) plt.title(f'{name} - Length vs Distance Comparison') plt.xlabel('Length (characters)') plt.ylabel('Distance') plt.legend() plt.grid(True, alpha=0.3) + + if bounds is not None: + try: + lower, upper = bounds + if lower is not None: + plt.axhline(lower, color="blue", linestyle="--", linewidth=1, label="Lower bound") + if upper is not None: + plt.axhline(upper, color="orange", linestyle="--", linewidth=1, label="Upper bound") + except Exception: + pass + + if save_to: + try: + plt.savefig(save_to, bbox_inches="tight") + except Exception: + pass plt.show() diff --git a/mlnode/packages/benchmarks/src/validation/data.py b/mlnode/packages/benchmarks/src/validation/data.py index e68e529fe..0507480aa 100644 --- a/mlnode/packages/benchmarks/src/validation/data.py +++ b/mlnode/packages/benchmarks/src/validation/data.py @@ -7,6 +7,7 @@ Dict, Optional, Union, + Any, ) import pandas as pd @@ -55,6 +56,17 @@ def to_dict(self): return self.model_dump() +class InferenceArtifactItem(BaseModel): + """One row of inference_results.jsonl (text or VLM).""" + + prompt: str + language: str = "en" + inference_result: Result + inference_model: ModelInfo + request_params: RequestParams + metadata: Dict[str, Any] = Field(default_factory=dict) + + class ExperimentRequest(BaseModel): prompt: str language: Optional[str] = None diff --git a/mlnode/packages/benchmarks/src/validation/utils.py b/mlnode/packages/benchmarks/src/validation/utils.py index 5fbb72d8f..1fe94e8ea 100644 --- a/mlnode/packages/benchmarks/src/validation/utils.py +++ b/mlnode/packages/benchmarks/src/validation/utils.py @@ -1,3 +1,7 @@ +import base64 +import logging +import mimetypes +from pathlib import Path import requests import math import threading @@ -8,13 +12,11 @@ Callable, Optional ) - -from pydantic import BaseModel - - -from typing import Any, Dict, List +import numpy as np +import requests from pydantic import BaseModel, Field + from validation.data import ( ModelInfo, RequestParams, @@ -23,7 +25,6 @@ Result, PositionResult ) - from common.logger import create_logger @@ -61,7 +62,41 @@ def from_content(cls, content: List[Dict[str, Any]]) -> "EnforcedTokens": def from_result(cls, result: Result) -> "EnforcedTokens": return cls(tokens=[EnforcedToken(token=r.token, top_tokens=list(r.logprobs.keys())) for r in result.results]) - + +def _http_headers(api_key: Optional[str]) -> Dict[str, str]: + h: Dict[str, str] = {"Content-Type": "application/json"} + if api_key: + h["Authorization"] = f"Bearer {api_key}" + return h + + +def _encode_image_data_url(image_path: Path) -> str: + suffix = image_path.suffix.lower() + mime, _ = mimetypes.guess_type(str(image_path)) + if mime is None: + mime = "image/jpeg" if suffix in {".jpg", ".jpeg"} else "image/png" + data = image_path.read_bytes() + b64 = base64.b64encode(data).decode("ascii") + return f"data:{mime};base64,{b64}" + + +def build_vlm_user_content( + *, + text: str, + image_paths: List[Path], + image_detail: Optional[str] = None, +) -> List[Dict[str, Any]]: + """OpenAI-style multimodal user message content (text + image_url parts).""" + parts: List[Dict[str, Any]] = [{"type": "text", "text": text}] + for img in image_paths: + url = _encode_image_data_url(img) + image_url: Dict[str, Any] = {"url": url} + if image_detail: + image_url["detail"] = image_detail + parts.append({"type": "image_url", "image_url": image_url}) + return parts + + def _prepare_messages( prompt: str, ) -> List[Dict[str, Any]]: @@ -88,11 +123,13 @@ def inference( model_info: ModelInfo, request_params: RequestParams, prompt: str, + messages: Optional[List[Dict[str, Any]]] = None, + api_key: Optional[str] = None, ) -> Dict[str, Any]: url = f"{model_info.url}/v1/chat/completions" payload = { "model": model_info.name, - "messages": _prepare_messages(prompt), + "messages": messages if messages is not None else _prepare_messages(prompt), "max_tokens": request_params.max_tokens, "temperature": request_params.temperature, "seed": request_params.seed, @@ -104,7 +141,7 @@ def inference( **_sampling_extras(request_params), } - response = requests.post(url, json=payload) + response = requests.post(url, json=payload, headers=_http_headers(api_key)) if response.status_code != 200: raise RuntimeError(f"Inference API request failed with status {response.status_code} {response.text}") return response.json() @@ -116,11 +153,13 @@ def validation( prompt: str, enforced_str: Optional[str] = None, enforced_tokens: Optional[EnforcedTokens] = None, + messages: Optional[List[Dict[str, Any]]] = None, + api_key: Optional[str] = None, ) -> Dict[str, Any]: url = f"{model_info.url}/v1/chat/completions" payload = { "model": model_info.name, - "messages": _prepare_messages(prompt), + "messages": messages if messages is not None else _prepare_messages(prompt), "max_tokens": request_params.max_tokens, "temperature": request_params.temperature, "seed": request_params.seed, @@ -137,7 +176,7 @@ def validation( if enforced_tokens: payload["enforced_tokens"] = enforced_tokens.dict() - response = requests.post(url, json=payload) + response = requests.post(url, json=payload, headers=_http_headers(api_key)) if response.status_code != 200: raise RuntimeError(f"Validation API request failed with status {response.status_code} {response.text}\n(enforced_tokens: {enforced_tokens})\n(payload: {payload})") diff --git a/proposals/visual_models/README.md b/proposals/visual_models/README.md new file mode 100644 index 000000000..43c598e70 --- /dev/null +++ b/proposals/visual_models/README.md @@ -0,0 +1,35 @@ +# Models Proposal + +This is a proposal to add the ... multimodal models to the Gonka inference network. + +Validation thresholds for all the models were computed using the standard procedure described in [visual_models/README.md](../README.md). + +For each model, there are respective notebooks with the details of experiments and gdrive folders with raw inference-validation data: + + +| Parameter | | | | | +|-----------|-----------|-------------|-------------------|-------------| +| Notebook | | | | | +| Validation Data | | | | | +| Model Len || | | | +| Validation Thresholds | | | | | +| Fraud Accuracy | | | | | +| Tested Against | || | | +| VRAM (example setup) | | || | + + +For the reproduction of raw data, the inference script producing the raw data is here: [link](). You'll also need to set up configs in this script, you'll find them in GDrive with the raw data. + +All experiments were conducted using MLNode vX.X.X. + +**Qwen3-30B** is suggested to be deployed with with the following parameters: +```python +additional_args=[ + '--max-model-len', '100000', #Fits the minimum 48GB + '--enable-auto-tool-choice', # Optional: enables automatic tool choice + '--tool-call-parser', 'hermes', # Optional: specifies the Hermes tool call parser +] +``` + + +