From 10614c6c1f9e0a58b66a35633676820cdd038727 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ce=CC=81sar=20Del=20Solar?= Date: Thu, 25 Nov 2021 13:53:15 -0500 Subject: [PATCH] some changes (not yet working) to disassociate a tournament game --- api/proto/game_service/game_service.proto | 19 + .../tournament_service_pb.d.ts | 24 + .../tournament_service_pb.js | 182 ++++++ liwords-ui/src/tournament/actions_panel.tsx | 1 + liwords-ui/src/tournament/recent_games.tsx | 29 + pkg/tournament/service.go | 12 + pkg/tournament/tournament.go | 8 + .../tournament_service.pb.go | 567 ++++++++++-------- .../tournament_service.twirp.go | 502 ++++++++++++---- 9 files changed, 992 insertions(+), 352 deletions(-) diff --git a/api/proto/game_service/game_service.proto b/api/proto/game_service/game_service.proto index 52296db30..45cd75f19 100644 --- a/api/proto/game_service/game_service.proto +++ b/api/proto/game_service/game_service.proto @@ -75,10 +75,29 @@ message StreakInfoResponse { message RematchStreakRequest { string original_request_id = 1; } +message DisassociateTournamentGameRequest { + string tournament_id = 1; + string game_id = 2; +} + +message AssociateTournamentGameRequest { + string tournament_id = 1; + string game_id = 2; + string division = 3; + int32 round = 4; +} + +message Empty { + +} + service GameMetadataService { rpc GetMetadata(GameInfoRequest) returns(GameInfoResponse); rpc GetGCG(GCGRequest) returns(GCGResponse); rpc GetGameHistory(GameHistoryRequest) returns(GameHistoryResponse); rpc GetRecentGames(RecentGamesRequest) returns(GameInfoResponses); rpc GetRematchStreak(RematchStreakRequest) returns(StreakInfoResponse); + + rpc AssociateTournamentGame(AssociateTournamentGameRequest) returns(Empty); + rpc DisassociateTournamentGame(DisassociateTournamentGameRequest) returns (Empty); } \ No newline at end of file diff --git a/liwords-ui/src/gen/api/proto/tournament_service/tournament_service_pb.d.ts b/liwords-ui/src/gen/api/proto/tournament_service/tournament_service_pb.d.ts index d961e97fe..4e6fc0f8e 100644 --- a/liwords-ui/src/gen/api/proto/tournament_service/tournament_service_pb.d.ts +++ b/liwords-ui/src/gen/api/proto/tournament_service/tournament_service_pb.d.ts @@ -659,6 +659,30 @@ export namespace CheckinRequest { } } +export class DisassociateClubGameRequest extends jspb.Message { + getTournamentId(): string; + setTournamentId(value: string): void; + + getGameId(): string; + setGameId(value: string): void; + + serializeBinary(): Uint8Array; + toObject(includeInstance?: boolean): DisassociateClubGameRequest.AsObject; + static toObject(includeInstance: boolean, msg: DisassociateClubGameRequest): DisassociateClubGameRequest.AsObject; + static extensions: {[key: number]: jspb.ExtensionFieldInfo}; + static extensionsBinary: {[key: number]: jspb.ExtensionFieldBinaryInfo}; + static serializeBinaryToWriter(message: DisassociateClubGameRequest, writer: jspb.BinaryWriter): void; + static deserializeBinary(bytes: Uint8Array): DisassociateClubGameRequest; + static deserializeBinaryFromReader(message: DisassociateClubGameRequest, reader: jspb.BinaryReader): DisassociateClubGameRequest; +} + +export namespace DisassociateClubGameRequest { + export type AsObject = { + tournamentId: string, + gameId: string, + } +} + export class NewClubSessionRequest extends jspb.Message { hasDate(): boolean; clearDate(): void; diff --git a/liwords-ui/src/gen/api/proto/tournament_service/tournament_service_pb.js b/liwords-ui/src/gen/api/proto/tournament_service/tournament_service_pb.js index 49e69360e..7835fd55c 100644 --- a/liwords-ui/src/gen/api/proto/tournament_service/tournament_service_pb.js +++ b/liwords-ui/src/gen/api/proto/tournament_service/tournament_service_pb.js @@ -22,6 +22,7 @@ goog.object.extend(proto, google_protobuf_timestamp_pb); goog.exportSymbol('proto.tournament_service.CheckinRequest', null, global); goog.exportSymbol('proto.tournament_service.ClubSessionResponse', null, global); goog.exportSymbol('proto.tournament_service.ClubSessionsResponse', null, global); +goog.exportSymbol('proto.tournament_service.DisassociateClubGameRequest', null, global); goog.exportSymbol('proto.tournament_service.FinishTournamentRequest', null, global); goog.exportSymbol('proto.tournament_service.GetTournamentMetadataRequest', null, global); goog.exportSymbol('proto.tournament_service.GetTournamentRequest', null, global); @@ -508,6 +509,27 @@ if (goog.DEBUG && !COMPILED) { */ proto.tournament_service.CheckinRequest.displayName = 'proto.tournament_service.CheckinRequest'; } +/** + * Generated by JsPbCodeGenerator. + * @param {Array=} opt_data Optional initial data array, typically from a + * server response, or constructed directly in Javascript. The array is used + * in place and becomes part of the constructed object. It is not cloned. + * If no data is provided, the constructed object will be empty, but still + * valid. + * @extends {jspb.Message} + * @constructor + */ +proto.tournament_service.DisassociateClubGameRequest = function(opt_data) { + jspb.Message.initialize(this, opt_data, 0, -1, null, null); +}; +goog.inherits(proto.tournament_service.DisassociateClubGameRequest, jspb.Message); +if (goog.DEBUG && !COMPILED) { + /** + * @public + * @override + */ + proto.tournament_service.DisassociateClubGameRequest.displayName = 'proto.tournament_service.DisassociateClubGameRequest'; +} /** * Generated by JsPbCodeGenerator. * @param {Array=} opt_data Optional initial data array, typically from a @@ -5148,6 +5170,166 @@ proto.tournament_service.CheckinRequest.prototype.setId = function(value) { +if (jspb.Message.GENERATE_TO_OBJECT) { +/** + * Creates an object representation of this proto. + * Field names that are reserved in JavaScript and will be renamed to pb_name. + * Optional fields that are not set will be set to undefined. + * To access a reserved field use, foo.pb_, eg, foo.pb_default. + * For the list of reserved names please see: + * net/proto2/compiler/js/internal/generator.cc#kKeyword. + * @param {boolean=} opt_includeInstance Deprecated. whether to include the + * JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @return {!Object} + */ +proto.tournament_service.DisassociateClubGameRequest.prototype.toObject = function(opt_includeInstance) { + return proto.tournament_service.DisassociateClubGameRequest.toObject(opt_includeInstance, this); +}; + + +/** + * Static version of the {@see toObject} method. + * @param {boolean|undefined} includeInstance Deprecated. Whether to include + * the JSPB instance for transitional soy proto support: + * http://goto/soy-param-migration + * @param {!proto.tournament_service.DisassociateClubGameRequest} msg The msg instance to transform. + * @return {!Object} + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.tournament_service.DisassociateClubGameRequest.toObject = function(includeInstance, msg) { + var f, obj = { + tournamentId: jspb.Message.getFieldWithDefault(msg, 1, ""), + gameId: jspb.Message.getFieldWithDefault(msg, 2, "") + }; + + if (includeInstance) { + obj.$jspbMessageInstance = msg; + } + return obj; +}; +} + + +/** + * Deserializes binary data (in protobuf wire format). + * @param {jspb.ByteSource} bytes The bytes to deserialize. + * @return {!proto.tournament_service.DisassociateClubGameRequest} + */ +proto.tournament_service.DisassociateClubGameRequest.deserializeBinary = function(bytes) { + var reader = new jspb.BinaryReader(bytes); + var msg = new proto.tournament_service.DisassociateClubGameRequest; + return proto.tournament_service.DisassociateClubGameRequest.deserializeBinaryFromReader(msg, reader); +}; + + +/** + * Deserializes binary data (in protobuf wire format) from the + * given reader into the given message object. + * @param {!proto.tournament_service.DisassociateClubGameRequest} msg The message object to deserialize into. + * @param {!jspb.BinaryReader} reader The BinaryReader to use. + * @return {!proto.tournament_service.DisassociateClubGameRequest} + */ +proto.tournament_service.DisassociateClubGameRequest.deserializeBinaryFromReader = function(msg, reader) { + while (reader.nextField()) { + if (reader.isEndGroup()) { + break; + } + var field = reader.getFieldNumber(); + switch (field) { + case 1: + var value = /** @type {string} */ (reader.readString()); + msg.setTournamentId(value); + break; + case 2: + var value = /** @type {string} */ (reader.readString()); + msg.setGameId(value); + break; + default: + reader.skipField(); + break; + } + } + return msg; +}; + + +/** + * Serializes the message to binary data (in protobuf wire format). + * @return {!Uint8Array} + */ +proto.tournament_service.DisassociateClubGameRequest.prototype.serializeBinary = function() { + var writer = new jspb.BinaryWriter(); + proto.tournament_service.DisassociateClubGameRequest.serializeBinaryToWriter(this, writer); + return writer.getResultBuffer(); +}; + + +/** + * Serializes the given message to binary data (in protobuf wire + * format), writing to the given BinaryWriter. + * @param {!proto.tournament_service.DisassociateClubGameRequest} message + * @param {!jspb.BinaryWriter} writer + * @suppress {unusedLocalVariables} f is only used for nested messages + */ +proto.tournament_service.DisassociateClubGameRequest.serializeBinaryToWriter = function(message, writer) { + var f = undefined; + f = message.getTournamentId(); + if (f.length > 0) { + writer.writeString( + 1, + f + ); + } + f = message.getGameId(); + if (f.length > 0) { + writer.writeString( + 2, + f + ); + } +}; + + +/** + * optional string tournament_id = 1; + * @return {string} + */ +proto.tournament_service.DisassociateClubGameRequest.prototype.getTournamentId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 1, "")); +}; + + +/** + * @param {string} value + * @return {!proto.tournament_service.DisassociateClubGameRequest} returns this + */ +proto.tournament_service.DisassociateClubGameRequest.prototype.setTournamentId = function(value) { + return jspb.Message.setProto3StringField(this, 1, value); +}; + + +/** + * optional string game_id = 2; + * @return {string} + */ +proto.tournament_service.DisassociateClubGameRequest.prototype.getGameId = function() { + return /** @type {string} */ (jspb.Message.getFieldWithDefault(this, 2, "")); +}; + + +/** + * @param {string} value + * @return {!proto.tournament_service.DisassociateClubGameRequest} returns this + */ +proto.tournament_service.DisassociateClubGameRequest.prototype.setGameId = function(value) { + return jspb.Message.setProto3StringField(this, 2, value); +}; + + + + + if (jspb.Message.GENERATE_TO_OBJECT) { /** * Creates an object representation of this proto. diff --git a/liwords-ui/src/tournament/actions_panel.tsx b/liwords-ui/src/tournament/actions_panel.tsx index d0a945118..3e19f2794 100644 --- a/liwords-ui/src/tournament/actions_panel.tsx +++ b/liwords-ui/src/tournament/actions_panel.tsx @@ -287,6 +287,7 @@ export const ActionsPanel = React.memo((props: Props) => { ? undefined : fetchNext } + isDirector={isDirector} /> ); diff --git a/liwords-ui/src/tournament/recent_games.tsx b/liwords-ui/src/tournament/recent_games.tsx index 9ace9223d..f887e2b14 100644 --- a/liwords-ui/src/tournament/recent_games.tsx +++ b/liwords-ui/src/tournament/recent_games.tsx @@ -3,11 +3,13 @@ import { Link } from 'react-router-dom'; import moment from 'moment'; import { Button, Table, Tag } from 'antd'; import { RecentGame } from './recent_game'; +import { DeleteOutlined } from '@ant-design/icons'; type Props = { games: Array; fetchPrev?: () => void; fetchNext?: () => void; + isDirector: boolean; }; type playerLinkProps = { @@ -82,6 +84,24 @@ export const RecentTourneyGames = React.memo((props: Props) => { case 'STANDARD': endReason = 'Complete'; } + const delbtn = props.isDirector ? ( + + ) : null; return { game_id: item.game_id, // used by rowKey @@ -90,6 +110,7 @@ export const RecentTourneyGames = React.memo((props: Props) => { scores, endReason, when, + delbtn, }; }) .filter((item) => item !== null); @@ -122,6 +143,14 @@ export const RecentTourneyGames = React.memo((props: Props) => { key: 'when', }, ]; + if (props.isDirector) { + columns.push({ + className: 'delbtn', + dataIndex: 'delbtn', + key: 'delbtn', + title: '', + }); + } // TODO: use the normal Ant table pagination when the backend can give us a total return ( <> diff --git a/pkg/tournament/service.go b/pkg/tournament/service.go index 18b11dcfe..3dfdb6fc8 100644 --- a/pkg/tournament/service.go +++ b/pkg/tournament/service.go @@ -436,6 +436,18 @@ func (ts *TournamentService) GetRecentClubSessions(ctx context.Context, req *pb. return ts.tournamentStore.GetRecentClubSessions(ctx, req.Id, int(req.Count), int(req.Offset)) } +func (ts *TournamentService) DisassociateClubGame(ctx context.Context, req *pb.DisassociateClubGameRequest) (*pb.TournamentResponse, error) { + err := authenticateDirector(ctx, ts, req.TournamentId, false) + if err != nil { + return nil, err + } + err = DisassociateClubGame(ctx, ts.tournamentStore, req.TournamentId, req.GameId) + if err != nil { + return nil, twirp.NewError(twirp.InvalidArgument, err.Error()) + } + return &pb.TournamentResponse{}, nil +} + func sessionUser(ctx context.Context, ts *TournamentService) (*entity.User, error) { sess, err := apiserver.GetSession(ctx) if err != nil { diff --git a/pkg/tournament/tournament.go b/pkg/tournament/tournament.go index 1ae4a08e0..895b9fa39 100644 --- a/pkg/tournament/tournament.go +++ b/pkg/tournament/tournament.go @@ -1350,6 +1350,14 @@ func UncheckIn(ctx context.Context, ts TournamentStore, tid string) error { return errors.New("not implemented") } +func DisassociateClubGame(ctx context.Context, ts TournamentStore, tid, gid string) error { + t, err := ts.Get(ctx, tid) + if err != nil { + return errors.New("tournament does not exist") + } + +} + /* func CheckIn(ctx context.Context, ts TournamentStore, tid string, playerid string) error { t, err := ts.Get(ctx, tid) diff --git a/rpc/api/proto/tournament_service/tournament_service.pb.go b/rpc/api/proto/tournament_service/tournament_service.pb.go index 5a9078969..5e8a8bc86 100644 --- a/rpc/api/proto/tournament_service/tournament_service.pb.go +++ b/rpc/api/proto/tournament_service/tournament_service.pb.go @@ -1531,6 +1531,61 @@ func (x *CheckinRequest) GetId() string { return "" } +type DisassociateClubGameRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + TournamentId string `protobuf:"bytes,1,opt,name=tournament_id,json=tournamentId,proto3" json:"tournament_id,omitempty"` + GameId string `protobuf:"bytes,2,opt,name=game_id,json=gameId,proto3" json:"game_id,omitempty"` +} + +func (x *DisassociateClubGameRequest) Reset() { + *x = DisassociateClubGameRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[22] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *DisassociateClubGameRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DisassociateClubGameRequest) ProtoMessage() {} + +func (x *DisassociateClubGameRequest) ProtoReflect() protoreflect.Message { + mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[22] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DisassociateClubGameRequest.ProtoReflect.Descriptor instead. +func (*DisassociateClubGameRequest) Descriptor() ([]byte, []int) { + return file_api_proto_tournament_service_tournament_service_proto_rawDescGZIP(), []int{22} +} + +func (x *DisassociateClubGameRequest) GetTournamentId() string { + if x != nil { + return x.TournamentId + } + return "" +} + +func (x *DisassociateClubGameRequest) GetGameId() string { + if x != nil { + return x.GameId + } + return "" +} + type NewClubSessionRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1544,7 +1599,7 @@ type NewClubSessionRequest struct { func (x *NewClubSessionRequest) Reset() { *x = NewClubSessionRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[22] + mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1557,7 +1612,7 @@ func (x *NewClubSessionRequest) String() string { func (*NewClubSessionRequest) ProtoMessage() {} func (x *NewClubSessionRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[22] + mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1570,7 +1625,7 @@ func (x *NewClubSessionRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use NewClubSessionRequest.ProtoReflect.Descriptor instead. func (*NewClubSessionRequest) Descriptor() ([]byte, []int) { - return file_api_proto_tournament_service_tournament_service_proto_rawDescGZIP(), []int{22} + return file_api_proto_tournament_service_tournament_service_proto_rawDescGZIP(), []int{23} } func (x *NewClubSessionRequest) GetDate() *timestamppb.Timestamp { @@ -1603,7 +1658,7 @@ type ClubSessionResponse struct { func (x *ClubSessionResponse) Reset() { *x = ClubSessionResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[23] + mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1616,7 +1671,7 @@ func (x *ClubSessionResponse) String() string { func (*ClubSessionResponse) ProtoMessage() {} func (x *ClubSessionResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[23] + mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1629,7 +1684,7 @@ func (x *ClubSessionResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ClubSessionResponse.ProtoReflect.Descriptor instead. func (*ClubSessionResponse) Descriptor() ([]byte, []int) { - return file_api_proto_tournament_service_tournament_service_proto_rawDescGZIP(), []int{23} + return file_api_proto_tournament_service_tournament_service_proto_rawDescGZIP(), []int{24} } func (x *ClubSessionResponse) GetTournamentId() string { @@ -1660,7 +1715,7 @@ type RecentClubSessionsRequest struct { func (x *RecentClubSessionsRequest) Reset() { *x = RecentClubSessionsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[24] + mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1673,7 +1728,7 @@ func (x *RecentClubSessionsRequest) String() string { func (*RecentClubSessionsRequest) ProtoMessage() {} func (x *RecentClubSessionsRequest) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[24] + mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1686,7 +1741,7 @@ func (x *RecentClubSessionsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RecentClubSessionsRequest.ProtoReflect.Descriptor instead. func (*RecentClubSessionsRequest) Descriptor() ([]byte, []int) { - return file_api_proto_tournament_service_tournament_service_proto_rawDescGZIP(), []int{24} + return file_api_proto_tournament_service_tournament_service_proto_rawDescGZIP(), []int{25} } func (x *RecentClubSessionsRequest) GetId() string { @@ -1721,7 +1776,7 @@ type ClubSessionsResponse struct { func (x *ClubSessionsResponse) Reset() { *x = ClubSessionsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[25] + mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1734,7 +1789,7 @@ func (x *ClubSessionsResponse) String() string { func (*ClubSessionsResponse) ProtoMessage() {} func (x *ClubSessionsResponse) ProtoReflect() protoreflect.Message { - mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[25] + mi := &file_api_proto_tournament_service_tournament_service_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1747,7 +1802,7 @@ func (x *ClubSessionsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ClubSessionsResponse.ProtoReflect.Descriptor instead. func (*ClubSessionsResponse) Descriptor() ([]byte, []int) { - return file_api_proto_tournament_service_tournament_service_proto_rawDescGZIP(), []int{25} + return file_api_proto_tournament_service_tournament_service_proto_rawDescGZIP(), []int{26} } func (x *ClubSessionsResponse) GetSessions() []*ClubSessionResponse { @@ -1953,189 +2008,202 @@ var file_api_proto_tournament_service_tournament_service_proto_rawDesc = []byte{ 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x20, 0x0a, 0x0e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x60, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x43, 0x6c, 0x75, - 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x2e, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x17, 0x0a, 0x07, 0x63, 0x6c, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, - 0x52, 0x06, 0x63, 0x6c, 0x75, 0x62, 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x13, 0x43, 0x6c, 0x75, 0x62, - 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x49, 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x59, 0x0a, 0x19, 0x52, 0x65, 0x63, 0x65, - 0x6e, 0x74, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x02, 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, - 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, - 0x73, 0x65, 0x74, 0x22, 0x5b, 0x0a, 0x14, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, - 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x52, 0x08, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, - 0x2a, 0x36, 0x0a, 0x05, 0x54, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, - 0x4e, 0x44, 0x41, 0x52, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4c, 0x55, 0x42, 0x10, - 0x01, 0x12, 0x09, 0x0a, 0x05, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, - 0x4c, 0x45, 0x47, 0x41, 0x43, 0x59, 0x10, 0x03, 0x32, 0xf1, 0x12, 0x0a, 0x11, 0x54, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, - 0x0a, 0x0d, 0x4e, 0x65, 0x77, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x12, - 0x28, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, - 0x65, 0x77, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x2e, + 0x28, 0x09, 0x52, 0x02, 0x69, 0x64, 0x22, 0x5b, 0x0a, 0x1b, 0x44, 0x69, 0x73, 0x61, 0x73, 0x73, + 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x62, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, + 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x67, 0x61, + 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x67, 0x61, 0x6d, + 0x65, 0x49, 0x64, 0x22, 0x60, 0x0a, 0x15, 0x4e, 0x65, 0x77, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, 0x04, + 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x17, 0x0a, 0x07, + 0x63, 0x6c, 0x75, 0x62, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x06, 0x63, + 0x6c, 0x75, 0x62, 0x49, 0x64, 0x22, 0x4e, 0x0a, 0x13, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, + 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x23, 0x0a, 0x0d, + 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x0c, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x49, + 0x64, 0x12, 0x12, 0x0a, 0x04, 0x73, 0x6c, 0x75, 0x67, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x04, 0x73, 0x6c, 0x75, 0x67, 0x22, 0x59, 0x0a, 0x19, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x43, + 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x02, + 0x69, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x63, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, + 0x22, 0x5b, 0x0a, 0x14, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x08, 0x73, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x74, 0x6f, 0x75, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x52, 0x08, 0x73, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x2a, 0x36, 0x0a, + 0x05, 0x54, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x53, 0x54, 0x41, 0x4e, 0x44, 0x41, + 0x52, 0x44, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x43, 0x4c, 0x55, 0x42, 0x10, 0x01, 0x12, 0x09, + 0x0a, 0x05, 0x43, 0x48, 0x49, 0x4c, 0x44, 0x10, 0x02, 0x12, 0x0a, 0x0a, 0x06, 0x4c, 0x45, 0x47, + 0x41, 0x43, 0x59, 0x10, 0x03, 0x32, 0xe2, 0x13, 0x0a, 0x11, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x64, 0x0a, 0x0d, 0x4e, + 0x65, 0x77, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x2e, 0x74, + 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x4e, 0x65, 0x77, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x65, 0x77, 0x54, + 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x79, 0x0a, 0x15, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x2e, 0x74, 0x6f, 0x75, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x47, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, + 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, + 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x0d, + 0x47, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x28, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, - 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x2e, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x5b, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x28, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x47, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6c, 0x69, 0x77, - 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x6e, 0x74, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x67, 0x0a, 0x10, - 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, - 0x12, 0x2b, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x54, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x6c, 0x69, 0x77, 0x6f, 0x72, 0x64, + 0x73, 0x2e, 0x46, 0x75, 0x6c, 0x6c, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, + 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x67, 0x0a, 0x10, 0x46, 0x69, 0x6e, + 0x69, 0x73, 0x68, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2b, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, - 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x53, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, - 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x50, 0x61, 0x69, 0x72, - 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x12, 0x24, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, - 0x6f, 0x75, 0x6e, 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, + 0x63, 0x65, 0x2e, 0x46, 0x69, 0x6e, 0x69, 0x73, 0x68, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x71, 0x0a, 0x15, 0x53, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x30, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, - 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x2e, 0x2e, - 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, - 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x2e, 0x53, 0x65, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x1e, 0x2e, 0x6c, 0x69, 0x77, 0x6f, - 0x72, 0x64, 0x73, 0x2e, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x75, 0x6e, - 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, - 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x58, 0x0a, 0x13, 0x53, 0x65, 0x74, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x19, 0x2e, 0x6c, 0x69, 0x77, 0x6f, 0x72, - 0x64, 0x73, 0x2e, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x73, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0c, 0x41, - 0x64, 0x64, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1a, 0x2e, 0x6c, 0x69, - 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, - 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x55, 0x0a, 0x0f, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, - 0x72, 0x73, 0x12, 0x1a, 0x2e, 0x6c, 0x69, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x54, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x1a, 0x26, - 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x44, 0x69, 0x76, - 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, - 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x0e, - 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, - 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, - 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x50, 0x6c, 0x61, 0x79, - 0x65, 0x72, 0x73, 0x12, 0x1a, 0x2e, 0x6c, 0x69, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x54, 0x6f, - 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x1a, - 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, - 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, - 0x65, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x2e, 0x6c, 0x69, 0x77, 0x6f, 0x72, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x50, 0x61, 0x69, 0x72, 0x52, 0x6f, 0x75, + 0x6e, 0x64, 0x12, 0x24, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x52, 0x6f, 0x75, 0x6e, + 0x64, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, + 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x70, 0x0a, 0x16, 0x53, 0x65, 0x74, 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x6f, 0x75, + 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x2e, 0x2e, 0x74, 0x6f, 0x75, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x53, 0x69, 0x6e, 0x67, 0x6c, 0x65, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x6e, 0x74, 0x72, + 0x6f, 0x6c, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x5a, 0x0a, 0x10, 0x53, 0x65, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x1e, 0x2e, 0x6c, 0x69, 0x77, 0x6f, 0x72, 0x64, 0x73, + 0x2e, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, + 0x0a, 0x13, 0x53, 0x65, 0x74, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, + 0x74, 0x72, 0x6f, 0x6c, 0x73, 0x12, 0x19, 0x2e, 0x6c, 0x69, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2e, + 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x73, + 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x52, 0x0a, 0x0c, 0x41, 0x64, 0x64, 0x44, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, 0x1a, 0x2e, 0x6c, 0x69, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x0a, - 0x53, 0x65, 0x74, 0x50, 0x61, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2d, 0x2e, 0x74, 0x6f, 0x75, - 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, - 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x69, 0x72, 0x69, 0x6e, - 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, - 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x68, 0x0a, 0x09, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x33, - 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x73, 0x75, 0x6c, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x13, 0x53, - 0x74, 0x61, 0x72, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, - 0x77, 0x6e, 0x12, 0x38, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0f, + 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x6f, 0x72, 0x73, 0x12, + 0x1a, 0x2e, 0x6c, 0x69, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x1a, 0x26, 0x2e, 0x74, 0x6f, + 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x0b, 0x41, 0x64, 0x64, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, - 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, + 0x6e, 0x74, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x0e, 0x52, 0x65, 0x6d, + 0x6f, 0x76, 0x65, 0x44, 0x69, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x2d, 0x2e, 0x74, 0x6f, + 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, + 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x69, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0a, 0x41, 0x64, 0x64, 0x50, 0x6c, 0x61, 0x79, 0x65, 0x72, 0x73, + 0x12, 0x1a, 0x2e, 0x6c, 0x69, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, 0x73, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5e, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x47, 0x61, - 0x6d, 0x65, 0x73, 0x12, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x47, - 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x6f, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x53, 0x0a, 0x0d, 0x52, 0x65, 0x6d, 0x6f, 0x76, 0x65, 0x50, 0x6c, + 0x61, 0x79, 0x65, 0x72, 0x73, 0x12, 0x1a, 0x2e, 0x6c, 0x69, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2e, + 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x65, 0x72, 0x73, 0x6f, 0x6e, + 0x73, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x63, 0x0a, 0x0a, 0x53, 0x65, 0x74, + 0x50, 0x61, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x12, 0x2d, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x61, 0x69, 0x72, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, + 0x0a, 0x09, 0x53, 0x65, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x12, 0x33, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, - 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x67, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, - 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x74, 0x6f, 0x75, 0x72, - 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, - 0x65, 0x77, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, - 0x15, 0x47, 0x65, 0x74, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, - 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, - 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, - 0x6e, 0x74, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x62, 0x53, - 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x69, 0x0a, 0x11, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x2c, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, + 0x74, 0x4f, 0x76, 0x65, 0x72, 0x72, 0x69, 0x64, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x77, 0x0a, 0x13, 0x53, 0x74, 0x61, 0x72, + 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, + 0x38, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x53, + 0x74, 0x61, 0x72, 0x74, 0x52, 0x6f, 0x75, 0x6e, 0x64, 0x43, 0x6f, 0x75, 0x6e, 0x74, 0x64, 0x6f, + 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, + 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, + 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x5e, 0x0a, 0x0b, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, + 0x12, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, + 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, + 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, + 0x63, 0x65, 0x6e, 0x74, 0x47, 0x61, 0x6d, 0x65, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x67, 0x0a, 0x11, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x62, 0x53, + 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x29, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x4e, 0x65, 0x77, 0x43, + 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x27, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x15, 0x47, 0x65, + 0x74, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x73, 0x12, 0x2d, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, + 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x52, 0x65, 0x63, 0x65, 0x6e, 0x74, 0x43, + 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, + 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x6c, 0x75, 0x62, 0x53, 0x65, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x69, 0x0a, 0x11, + 0x55, 0x6e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, + 0x74, 0x12, 0x2c, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x55, 0x6e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x6f, + 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, + 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x55, 0x6e, 0x63, 0x68, 0x65, + 0x63, 0x6b, 0x49, 0x6e, 0x12, 0x24, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x55, 0x6e, 0x63, 0x68, 0x65, 0x63, + 0x6b, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, + 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, + 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x55, 0x0a, 0x07, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x12, 0x22, 0x2e, + 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, + 0x63, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, + 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6f, 0x0a, 0x14, 0x44, 0x69, 0x73, + 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x62, 0x47, 0x61, 0x6d, + 0x65, 0x12, 0x2f, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, + 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x44, 0x69, 0x73, 0x61, 0x73, 0x73, 0x6f, 0x63, 0x69, + 0x61, 0x74, 0x65, 0x43, 0x6c, 0x75, 0x62, 0x47, 0x61, 0x6d, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, - 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x59, 0x0a, 0x09, 0x55, 0x6e, - 0x63, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x12, 0x24, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x55, 0x6e, 0x63, - 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, - 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, - 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x55, 0x0a, 0x07, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x49, 0x6e, - 0x12, 0x22, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, - 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x43, 0x68, 0x65, 0x63, 0x6b, 0x69, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x2e, 0x54, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3e, 0x5a, 0x3c, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x6f, 0x6d, 0x69, 0x6e, - 0x6f, 0x31, 0x34, 0x2f, 0x6c, 0x69, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x72, 0x70, 0x63, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, - 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x33, + 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3e, 0x5a, 0x3c, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x64, 0x6f, 0x6d, 0x69, 0x6e, 0x6f, 0x31, + 0x34, 0x2f, 0x6c, 0x69, 0x77, 0x6f, 0x72, 0x64, 0x73, 0x2f, 0x72, 0x70, 0x63, 0x2f, 0x61, 0x70, + 0x69, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x74, 0x6f, 0x75, 0x72, 0x6e, 0x61, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -2151,7 +2219,7 @@ func file_api_proto_tournament_service_tournament_service_proto_rawDescGZIP() [] } var file_api_proto_tournament_service_tournament_service_proto_enumTypes = make([]protoimpl.EnumInfo, 1) -var file_api_proto_tournament_service_tournament_service_proto_msgTypes = make([]protoimpl.MessageInfo, 26) +var file_api_proto_tournament_service_tournament_service_proto_msgTypes = make([]protoimpl.MessageInfo, 27) var file_api_proto_tournament_service_tournament_service_proto_goTypes = []interface{}{ (TType)(0), // 0: tournament_service.TType (*StartRoundRequest)(nil), // 1: tournament_service.StartRoundRequest @@ -2176,36 +2244,37 @@ var file_api_proto_tournament_service_tournament_service_proto_goTypes = []inter (*UnstartTournamentRequest)(nil), // 20: tournament_service.UnstartTournamentRequest (*UncheckInRequest)(nil), // 21: tournament_service.UncheckInRequest (*CheckinRequest)(nil), // 22: tournament_service.CheckinRequest - (*NewClubSessionRequest)(nil), // 23: tournament_service.NewClubSessionRequest - (*ClubSessionResponse)(nil), // 24: tournament_service.ClubSessionResponse - (*RecentClubSessionsRequest)(nil), // 25: tournament_service.RecentClubSessionsRequest - (*ClubSessionsResponse)(nil), // 26: tournament_service.ClubSessionsResponse - (*realtime.GameRequest)(nil), // 27: liwords.GameRequest - (*realtime.RoundControl)(nil), // 28: liwords.RoundControl - (realtime.TournamentGameResult)(0), // 29: liwords.TournamentGameResult - (realtime.GameEndReason)(0), // 30: liwords.GameEndReason - (*realtime.TournamentGameEndedEvent)(nil), // 31: liwords.TournamentGameEndedEvent - (*timestamppb.Timestamp)(nil), // 32: google.protobuf.Timestamp - (*realtime.DivisionRoundControls)(nil), // 33: liwords.DivisionRoundControls - (*realtime.DivisionControls)(nil), // 34: liwords.DivisionControls - (*realtime.TournamentPersons)(nil), // 35: liwords.TournamentPersons - (*realtime.FullTournamentDivisions)(nil), // 36: liwords.FullTournamentDivisions + (*DisassociateClubGameRequest)(nil), // 23: tournament_service.DisassociateClubGameRequest + (*NewClubSessionRequest)(nil), // 24: tournament_service.NewClubSessionRequest + (*ClubSessionResponse)(nil), // 25: tournament_service.ClubSessionResponse + (*RecentClubSessionsRequest)(nil), // 26: tournament_service.RecentClubSessionsRequest + (*ClubSessionsResponse)(nil), // 27: tournament_service.ClubSessionsResponse + (*realtime.GameRequest)(nil), // 28: liwords.GameRequest + (*realtime.RoundControl)(nil), // 29: liwords.RoundControl + (realtime.TournamentGameResult)(0), // 30: liwords.TournamentGameResult + (realtime.GameEndReason)(0), // 31: liwords.GameEndReason + (*realtime.TournamentGameEndedEvent)(nil), // 32: liwords.TournamentGameEndedEvent + (*timestamppb.Timestamp)(nil), // 33: google.protobuf.Timestamp + (*realtime.DivisionRoundControls)(nil), // 34: liwords.DivisionRoundControls + (*realtime.DivisionControls)(nil), // 35: liwords.DivisionControls + (*realtime.TournamentPersons)(nil), // 36: liwords.TournamentPersons + (*realtime.FullTournamentDivisions)(nil), // 37: liwords.FullTournamentDivisions } var file_api_proto_tournament_service_tournament_service_proto_depIdxs = []int32{ 0, // 0: tournament_service.NewTournamentRequest.type:type_name -> tournament_service.TType 0, // 1: tournament_service.TournamentMetadata.type:type_name -> tournament_service.TType - 27, // 2: tournament_service.TournamentMetadata.default_club_settings:type_name -> liwords.GameRequest + 28, // 2: tournament_service.TournamentMetadata.default_club_settings:type_name -> liwords.GameRequest 3, // 3: tournament_service.SetTournamentMetadataRequest.metadata:type_name -> tournament_service.TournamentMetadata - 28, // 4: tournament_service.SingleRoundControlsRequest.round_controls:type_name -> liwords.RoundControl - 29, // 5: tournament_service.TournamentPairingRequest.self_play_result:type_name -> liwords.TournamentGameResult + 29, // 4: tournament_service.SingleRoundControlsRequest.round_controls:type_name -> liwords.RoundControl + 30, // 5: tournament_service.TournamentPairingRequest.self_play_result:type_name -> liwords.TournamentGameResult 8, // 6: tournament_service.TournamentPairingsRequest.pairings:type_name -> tournament_service.TournamentPairingRequest - 29, // 7: tournament_service.TournamentResultOverrideRequest.player_one_result:type_name -> liwords.TournamentGameResult - 29, // 8: tournament_service.TournamentResultOverrideRequest.player_two_result:type_name -> liwords.TournamentGameResult - 30, // 9: tournament_service.TournamentResultOverrideRequest.game_end_reason:type_name -> liwords.GameEndReason + 30, // 7: tournament_service.TournamentResultOverrideRequest.player_one_result:type_name -> liwords.TournamentGameResult + 30, // 8: tournament_service.TournamentResultOverrideRequest.player_two_result:type_name -> liwords.TournamentGameResult + 31, // 9: tournament_service.TournamentResultOverrideRequest.game_end_reason:type_name -> liwords.GameEndReason 3, // 10: tournament_service.TournamentMetadataResponse.metadata:type_name -> tournament_service.TournamentMetadata - 31, // 11: tournament_service.RecentGamesResponse.games:type_name -> liwords.TournamentGameEndedEvent - 32, // 12: tournament_service.NewClubSessionRequest.date:type_name -> google.protobuf.Timestamp - 24, // 13: tournament_service.ClubSessionsResponse.sessions:type_name -> tournament_service.ClubSessionResponse + 32, // 11: tournament_service.RecentGamesResponse.games:type_name -> liwords.TournamentGameEndedEvent + 33, // 12: tournament_service.NewClubSessionRequest.date:type_name -> google.protobuf.Timestamp + 25, // 13: tournament_service.ClubSessionsResponse.sessions:type_name -> tournament_service.ClubSessionResponse 2, // 14: tournament_service.TournamentService.NewTournament:input_type -> tournament_service.NewTournamentRequest 14, // 15: tournament_service.TournamentService.GetTournamentMetadata:input_type -> tournament_service.GetTournamentMetadataRequest 15, // 16: tournament_service.TournamentService.GetTournament:input_type -> tournament_service.GetTournamentRequest @@ -2213,49 +2282,51 @@ var file_api_proto_tournament_service_tournament_service_proto_depIdxs = []int32 4, // 18: tournament_service.TournamentService.SetTournamentMetadata:input_type -> tournament_service.SetTournamentMetadataRequest 6, // 19: tournament_service.TournamentService.PairRound:input_type -> tournament_service.PairRoundRequest 5, // 20: tournament_service.TournamentService.SetSingleRoundControls:input_type -> tournament_service.SingleRoundControlsRequest - 33, // 21: tournament_service.TournamentService.SetRoundControls:input_type -> liwords.DivisionRoundControls - 34, // 22: tournament_service.TournamentService.SetDivisionControls:input_type -> liwords.DivisionControls - 35, // 23: tournament_service.TournamentService.AddDirectors:input_type -> liwords.TournamentPersons - 35, // 24: tournament_service.TournamentService.RemoveDirectors:input_type -> liwords.TournamentPersons + 34, // 21: tournament_service.TournamentService.SetRoundControls:input_type -> liwords.DivisionRoundControls + 35, // 22: tournament_service.TournamentService.SetDivisionControls:input_type -> liwords.DivisionControls + 36, // 23: tournament_service.TournamentService.AddDirectors:input_type -> liwords.TournamentPersons + 36, // 24: tournament_service.TournamentService.RemoveDirectors:input_type -> liwords.TournamentPersons 7, // 25: tournament_service.TournamentService.AddDivision:input_type -> tournament_service.TournamentDivisionRequest 7, // 26: tournament_service.TournamentService.RemoveDivision:input_type -> tournament_service.TournamentDivisionRequest - 35, // 27: tournament_service.TournamentService.AddPlayers:input_type -> liwords.TournamentPersons - 35, // 28: tournament_service.TournamentService.RemovePlayers:input_type -> liwords.TournamentPersons + 36, // 27: tournament_service.TournamentService.AddPlayers:input_type -> liwords.TournamentPersons + 36, // 28: tournament_service.TournamentService.RemovePlayers:input_type -> liwords.TournamentPersons 9, // 29: tournament_service.TournamentService.SetPairing:input_type -> tournament_service.TournamentPairingsRequest 10, // 30: tournament_service.TournamentService.SetResult:input_type -> tournament_service.TournamentResultOverrideRequest 11, // 31: tournament_service.TournamentService.StartRoundCountdown:input_type -> tournament_service.TournamentStartRoundCountdownRequest 18, // 32: tournament_service.TournamentService.RecentGames:input_type -> tournament_service.RecentGamesRequest - 23, // 33: tournament_service.TournamentService.CreateClubSession:input_type -> tournament_service.NewClubSessionRequest - 25, // 34: tournament_service.TournamentService.GetRecentClubSessions:input_type -> tournament_service.RecentClubSessionsRequest + 24, // 33: tournament_service.TournamentService.CreateClubSession:input_type -> tournament_service.NewClubSessionRequest + 26, // 34: tournament_service.TournamentService.GetRecentClubSessions:input_type -> tournament_service.RecentClubSessionsRequest 20, // 35: tournament_service.TournamentService.UnstartTournament:input_type -> tournament_service.UnstartTournamentRequest 21, // 36: tournament_service.TournamentService.UncheckIn:input_type -> tournament_service.UncheckInRequest 22, // 37: tournament_service.TournamentService.CheckIn:input_type -> tournament_service.CheckinRequest - 13, // 38: tournament_service.TournamentService.NewTournament:output_type -> tournament_service.NewTournamentResponse - 17, // 39: tournament_service.TournamentService.GetTournamentMetadata:output_type -> tournament_service.TournamentMetadataResponse - 36, // 40: tournament_service.TournamentService.GetTournament:output_type -> liwords.FullTournamentDivisions - 12, // 41: tournament_service.TournamentService.FinishTournament:output_type -> tournament_service.TournamentResponse - 12, // 42: tournament_service.TournamentService.SetTournamentMetadata:output_type -> tournament_service.TournamentResponse - 12, // 43: tournament_service.TournamentService.PairRound:output_type -> tournament_service.TournamentResponse - 12, // 44: tournament_service.TournamentService.SetSingleRoundControls:output_type -> tournament_service.TournamentResponse - 12, // 45: tournament_service.TournamentService.SetRoundControls:output_type -> tournament_service.TournamentResponse - 12, // 46: tournament_service.TournamentService.SetDivisionControls:output_type -> tournament_service.TournamentResponse - 12, // 47: tournament_service.TournamentService.AddDirectors:output_type -> tournament_service.TournamentResponse - 12, // 48: tournament_service.TournamentService.RemoveDirectors:output_type -> tournament_service.TournamentResponse - 12, // 49: tournament_service.TournamentService.AddDivision:output_type -> tournament_service.TournamentResponse - 12, // 50: tournament_service.TournamentService.RemoveDivision:output_type -> tournament_service.TournamentResponse - 12, // 51: tournament_service.TournamentService.AddPlayers:output_type -> tournament_service.TournamentResponse - 12, // 52: tournament_service.TournamentService.RemovePlayers:output_type -> tournament_service.TournamentResponse - 12, // 53: tournament_service.TournamentService.SetPairing:output_type -> tournament_service.TournamentResponse - 12, // 54: tournament_service.TournamentService.SetResult:output_type -> tournament_service.TournamentResponse - 12, // 55: tournament_service.TournamentService.StartRoundCountdown:output_type -> tournament_service.TournamentResponse - 19, // 56: tournament_service.TournamentService.RecentGames:output_type -> tournament_service.RecentGamesResponse - 24, // 57: tournament_service.TournamentService.CreateClubSession:output_type -> tournament_service.ClubSessionResponse - 26, // 58: tournament_service.TournamentService.GetRecentClubSessions:output_type -> tournament_service.ClubSessionsResponse - 12, // 59: tournament_service.TournamentService.UnstartTournament:output_type -> tournament_service.TournamentResponse - 12, // 60: tournament_service.TournamentService.UncheckIn:output_type -> tournament_service.TournamentResponse - 12, // 61: tournament_service.TournamentService.CheckIn:output_type -> tournament_service.TournamentResponse - 38, // [38:62] is the sub-list for method output_type - 14, // [14:38] is the sub-list for method input_type + 23, // 38: tournament_service.TournamentService.DisassociateClubGame:input_type -> tournament_service.DisassociateClubGameRequest + 13, // 39: tournament_service.TournamentService.NewTournament:output_type -> tournament_service.NewTournamentResponse + 17, // 40: tournament_service.TournamentService.GetTournamentMetadata:output_type -> tournament_service.TournamentMetadataResponse + 37, // 41: tournament_service.TournamentService.GetTournament:output_type -> liwords.FullTournamentDivisions + 12, // 42: tournament_service.TournamentService.FinishTournament:output_type -> tournament_service.TournamentResponse + 12, // 43: tournament_service.TournamentService.SetTournamentMetadata:output_type -> tournament_service.TournamentResponse + 12, // 44: tournament_service.TournamentService.PairRound:output_type -> tournament_service.TournamentResponse + 12, // 45: tournament_service.TournamentService.SetSingleRoundControls:output_type -> tournament_service.TournamentResponse + 12, // 46: tournament_service.TournamentService.SetRoundControls:output_type -> tournament_service.TournamentResponse + 12, // 47: tournament_service.TournamentService.SetDivisionControls:output_type -> tournament_service.TournamentResponse + 12, // 48: tournament_service.TournamentService.AddDirectors:output_type -> tournament_service.TournamentResponse + 12, // 49: tournament_service.TournamentService.RemoveDirectors:output_type -> tournament_service.TournamentResponse + 12, // 50: tournament_service.TournamentService.AddDivision:output_type -> tournament_service.TournamentResponse + 12, // 51: tournament_service.TournamentService.RemoveDivision:output_type -> tournament_service.TournamentResponse + 12, // 52: tournament_service.TournamentService.AddPlayers:output_type -> tournament_service.TournamentResponse + 12, // 53: tournament_service.TournamentService.RemovePlayers:output_type -> tournament_service.TournamentResponse + 12, // 54: tournament_service.TournamentService.SetPairing:output_type -> tournament_service.TournamentResponse + 12, // 55: tournament_service.TournamentService.SetResult:output_type -> tournament_service.TournamentResponse + 12, // 56: tournament_service.TournamentService.StartRoundCountdown:output_type -> tournament_service.TournamentResponse + 19, // 57: tournament_service.TournamentService.RecentGames:output_type -> tournament_service.RecentGamesResponse + 25, // 58: tournament_service.TournamentService.CreateClubSession:output_type -> tournament_service.ClubSessionResponse + 27, // 59: tournament_service.TournamentService.GetRecentClubSessions:output_type -> tournament_service.ClubSessionsResponse + 12, // 60: tournament_service.TournamentService.UnstartTournament:output_type -> tournament_service.TournamentResponse + 12, // 61: tournament_service.TournamentService.UncheckIn:output_type -> tournament_service.TournamentResponse + 12, // 62: tournament_service.TournamentService.CheckIn:output_type -> tournament_service.TournamentResponse + 12, // 63: tournament_service.TournamentService.DisassociateClubGame:output_type -> tournament_service.TournamentResponse + 39, // [39:64] is the sub-list for method output_type + 14, // [14:39] is the sub-list for method input_type 14, // [14:14] is the sub-list for extension type_name 14, // [14:14] is the sub-list for extension extendee 0, // [0:14] is the sub-list for field type_name @@ -2532,7 +2603,7 @@ func file_api_proto_tournament_service_tournament_service_proto_init() { } } file_api_proto_tournament_service_tournament_service_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*NewClubSessionRequest); i { + switch v := v.(*DisassociateClubGameRequest); i { case 0: return &v.state case 1: @@ -2544,7 +2615,7 @@ func file_api_proto_tournament_service_tournament_service_proto_init() { } } file_api_proto_tournament_service_tournament_service_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ClubSessionResponse); i { + switch v := v.(*NewClubSessionRequest); i { case 0: return &v.state case 1: @@ -2556,7 +2627,7 @@ func file_api_proto_tournament_service_tournament_service_proto_init() { } } file_api_proto_tournament_service_tournament_service_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RecentClubSessionsRequest); i { + switch v := v.(*ClubSessionResponse); i { case 0: return &v.state case 1: @@ -2568,6 +2639,18 @@ func file_api_proto_tournament_service_tournament_service_proto_init() { } } file_api_proto_tournament_service_tournament_service_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*RecentClubSessionsRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_api_proto_tournament_service_tournament_service_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*ClubSessionsResponse); i { case 0: return &v.state @@ -2586,7 +2669,7 @@ func file_api_proto_tournament_service_tournament_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_api_proto_tournament_service_tournament_service_proto_rawDesc, NumEnums: 1, - NumMessages: 26, + NumMessages: 27, NumExtensions: 0, NumServices: 1, }, diff --git a/rpc/api/proto/tournament_service/tournament_service.twirp.go b/rpc/api/proto/tournament_service/tournament_service.twirp.go index 414cefb3e..8b622ec3c 100644 --- a/rpc/api/proto/tournament_service/tournament_service.twirp.go +++ b/rpc/api/proto/tournament_service/tournament_service.twirp.go @@ -94,6 +94,8 @@ type TournamentService interface { // CheckIn allows players to check themselves in. CheckIn(context.Context, *CheckinRequest) (*TournamentResponse, error) + + DisassociateClubGame(context.Context, *DisassociateClubGameRequest) (*TournamentResponse, error) } // ================================= @@ -102,7 +104,7 @@ type TournamentService interface { type tournamentServiceProtobufClient struct { client HTTPClient - urls [24]string + urls [25]string interceptor twirp.Interceptor opts twirp.ClientOptions } @@ -122,7 +124,7 @@ func NewTournamentServiceProtobufClient(baseURL string, client HTTPClient, opts // Build method URLs: []/./ serviceURL := sanitizeBaseURL(baseURL) serviceURL += baseServicePath(clientOpts.PathPrefix(), "tournament_service", "TournamentService") - urls := [24]string{ + urls := [25]string{ serviceURL + "NewTournament", serviceURL + "GetTournamentMetadata", serviceURL + "GetTournament", @@ -147,6 +149,7 @@ func NewTournamentServiceProtobufClient(baseURL string, client HTTPClient, opts serviceURL + "UnstartTournament", serviceURL + "UncheckIn", serviceURL + "CheckIn", + serviceURL + "DisassociateClubGame", } return &tournamentServiceProtobufClient{ @@ -1261,13 +1264,59 @@ func (c *tournamentServiceProtobufClient) callCheckIn(ctx context.Context, in *C return out, nil } +func (c *tournamentServiceProtobufClient) DisassociateClubGame(ctx context.Context, in *DisassociateClubGameRequest) (*TournamentResponse, error) { + ctx = ctxsetters.WithPackageName(ctx, "tournament_service") + ctx = ctxsetters.WithServiceName(ctx, "TournamentService") + ctx = ctxsetters.WithMethodName(ctx, "DisassociateClubGame") + caller := c.callDisassociateClubGame + if c.interceptor != nil { + caller = func(ctx context.Context, req *DisassociateClubGameRequest) (*TournamentResponse, error) { + resp, err := c.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*DisassociateClubGameRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*DisassociateClubGameRequest) when calling interceptor") + } + return c.callDisassociateClubGame(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*TournamentResponse) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*TournamentResponse) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + return caller(ctx, in) +} + +func (c *tournamentServiceProtobufClient) callDisassociateClubGame(ctx context.Context, in *DisassociateClubGameRequest) (*TournamentResponse, error) { + out := new(TournamentResponse) + ctx, err := doProtobufRequest(ctx, c.client, c.opts.Hooks, c.urls[24], in, out) + if err != nil { + twerr, ok := err.(twirp.Error) + if !ok { + twerr = twirp.InternalErrorWith(err) + } + callClientError(ctx, c.opts.Hooks, twerr) + return nil, err + } + + callClientResponseReceived(ctx, c.opts.Hooks) + + return out, nil +} + // ============================= // TournamentService JSON Client // ============================= type tournamentServiceJSONClient struct { client HTTPClient - urls [24]string + urls [25]string interceptor twirp.Interceptor opts twirp.ClientOptions } @@ -1287,7 +1336,7 @@ func NewTournamentServiceJSONClient(baseURL string, client HTTPClient, opts ...t // Build method URLs: []/./ serviceURL := sanitizeBaseURL(baseURL) serviceURL += baseServicePath(clientOpts.PathPrefix(), "tournament_service", "TournamentService") - urls := [24]string{ + urls := [25]string{ serviceURL + "NewTournament", serviceURL + "GetTournamentMetadata", serviceURL + "GetTournament", @@ -1312,6 +1361,7 @@ func NewTournamentServiceJSONClient(baseURL string, client HTTPClient, opts ...t serviceURL + "UnstartTournament", serviceURL + "UncheckIn", serviceURL + "CheckIn", + serviceURL + "DisassociateClubGame", } return &tournamentServiceJSONClient{ @@ -2426,6 +2476,52 @@ func (c *tournamentServiceJSONClient) callCheckIn(ctx context.Context, in *Check return out, nil } +func (c *tournamentServiceJSONClient) DisassociateClubGame(ctx context.Context, in *DisassociateClubGameRequest) (*TournamentResponse, error) { + ctx = ctxsetters.WithPackageName(ctx, "tournament_service") + ctx = ctxsetters.WithServiceName(ctx, "TournamentService") + ctx = ctxsetters.WithMethodName(ctx, "DisassociateClubGame") + caller := c.callDisassociateClubGame + if c.interceptor != nil { + caller = func(ctx context.Context, req *DisassociateClubGameRequest) (*TournamentResponse, error) { + resp, err := c.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*DisassociateClubGameRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*DisassociateClubGameRequest) when calling interceptor") + } + return c.callDisassociateClubGame(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*TournamentResponse) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*TournamentResponse) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + return caller(ctx, in) +} + +func (c *tournamentServiceJSONClient) callDisassociateClubGame(ctx context.Context, in *DisassociateClubGameRequest) (*TournamentResponse, error) { + out := new(TournamentResponse) + ctx, err := doJSONRequest(ctx, c.client, c.opts.Hooks, c.urls[24], in, out) + if err != nil { + twerr, ok := err.(twirp.Error) + if !ok { + twerr = twirp.InternalErrorWith(err) + } + callClientError(ctx, c.opts.Hooks, twerr) + return nil, err + } + + callClientResponseReceived(ctx, c.opts.Hooks) + + return out, nil +} + // ================================ // TournamentService Server Handler // ================================ @@ -2595,6 +2691,9 @@ func (s *tournamentServiceServer) ServeHTTP(resp http.ResponseWriter, req *http. case "CheckIn": s.serveCheckIn(ctx, resp, req) return + case "DisassociateClubGame": + s.serveDisassociateClubGame(ctx, resp, req) + return default: msg := fmt.Sprintf("no handler for path %q", req.URL.Path) s.writeError(ctx, resp, badRouteError(msg, req.Method, req.URL.Path)) @@ -6922,6 +7021,186 @@ func (s *tournamentServiceServer) serveCheckInProtobuf(ctx context.Context, resp callResponseSent(ctx, s.hooks) } +func (s *tournamentServiceServer) serveDisassociateClubGame(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + header := req.Header.Get("Content-Type") + i := strings.Index(header, ";") + if i == -1 { + i = len(header) + } + switch strings.TrimSpace(strings.ToLower(header[:i])) { + case "application/json": + s.serveDisassociateClubGameJSON(ctx, resp, req) + case "application/protobuf": + s.serveDisassociateClubGameProtobuf(ctx, resp, req) + default: + msg := fmt.Sprintf("unexpected Content-Type: %q", req.Header.Get("Content-Type")) + twerr := badRouteError(msg, req.Method, req.URL.Path) + s.writeError(ctx, resp, twerr) + } +} + +func (s *tournamentServiceServer) serveDisassociateClubGameJSON(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + var err error + ctx = ctxsetters.WithMethodName(ctx, "DisassociateClubGame") + ctx, err = callRequestRouted(ctx, s.hooks) + if err != nil { + s.writeError(ctx, resp, err) + return + } + + d := json.NewDecoder(req.Body) + rawReqBody := json.RawMessage{} + if err := d.Decode(&rawReqBody); err != nil { + s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) + return + } + reqContent := new(DisassociateClubGameRequest) + unmarshaler := protojson.UnmarshalOptions{DiscardUnknown: true} + if err = unmarshaler.Unmarshal(rawReqBody, reqContent); err != nil { + s.handleRequestBodyError(ctx, resp, "the json request could not be decoded", err) + return + } + + handler := s.TournamentService.DisassociateClubGame + if s.interceptor != nil { + handler = func(ctx context.Context, req *DisassociateClubGameRequest) (*TournamentResponse, error) { + resp, err := s.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*DisassociateClubGameRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*DisassociateClubGameRequest) when calling interceptor") + } + return s.TournamentService.DisassociateClubGame(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*TournamentResponse) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*TournamentResponse) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + + // Call service method + var respContent *TournamentResponse + func() { + defer ensurePanicResponses(ctx, resp, s.hooks) + respContent, err = handler(ctx, reqContent) + }() + + if err != nil { + s.writeError(ctx, resp, err) + return + } + if respContent == nil { + s.writeError(ctx, resp, twirp.InternalError("received a nil *TournamentResponse and nil error while calling DisassociateClubGame. nil responses are not supported")) + return + } + + ctx = callResponsePrepared(ctx, s.hooks) + + marshaler := &protojson.MarshalOptions{UseProtoNames: true, EmitUnpopulated: !s.jsonSkipDefaults} + respBytes, err := marshaler.Marshal(respContent) + if err != nil { + s.writeError(ctx, resp, wrapInternal(err, "failed to marshal json response")) + return + } + + ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) + resp.Header().Set("Content-Type", "application/json") + resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) + resp.WriteHeader(http.StatusOK) + + if n, err := resp.Write(respBytes); err != nil { + msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) + twerr := twirp.NewError(twirp.Unknown, msg) + ctx = callError(ctx, s.hooks, twerr) + } + callResponseSent(ctx, s.hooks) +} + +func (s *tournamentServiceServer) serveDisassociateClubGameProtobuf(ctx context.Context, resp http.ResponseWriter, req *http.Request) { + var err error + ctx = ctxsetters.WithMethodName(ctx, "DisassociateClubGame") + ctx, err = callRequestRouted(ctx, s.hooks) + if err != nil { + s.writeError(ctx, resp, err) + return + } + + buf, err := ioutil.ReadAll(req.Body) + if err != nil { + s.handleRequestBodyError(ctx, resp, "failed to read request body", err) + return + } + reqContent := new(DisassociateClubGameRequest) + if err = proto.Unmarshal(buf, reqContent); err != nil { + s.writeError(ctx, resp, malformedRequestError("the protobuf request could not be decoded")) + return + } + + handler := s.TournamentService.DisassociateClubGame + if s.interceptor != nil { + handler = func(ctx context.Context, req *DisassociateClubGameRequest) (*TournamentResponse, error) { + resp, err := s.interceptor( + func(ctx context.Context, req interface{}) (interface{}, error) { + typedReq, ok := req.(*DisassociateClubGameRequest) + if !ok { + return nil, twirp.InternalError("failed type assertion req.(*DisassociateClubGameRequest) when calling interceptor") + } + return s.TournamentService.DisassociateClubGame(ctx, typedReq) + }, + )(ctx, req) + if resp != nil { + typedResp, ok := resp.(*TournamentResponse) + if !ok { + return nil, twirp.InternalError("failed type assertion resp.(*TournamentResponse) when calling interceptor") + } + return typedResp, err + } + return nil, err + } + } + + // Call service method + var respContent *TournamentResponse + func() { + defer ensurePanicResponses(ctx, resp, s.hooks) + respContent, err = handler(ctx, reqContent) + }() + + if err != nil { + s.writeError(ctx, resp, err) + return + } + if respContent == nil { + s.writeError(ctx, resp, twirp.InternalError("received a nil *TournamentResponse and nil error while calling DisassociateClubGame. nil responses are not supported")) + return + } + + ctx = callResponsePrepared(ctx, s.hooks) + + respBytes, err := proto.Marshal(respContent) + if err != nil { + s.writeError(ctx, resp, wrapInternal(err, "failed to marshal proto response")) + return + } + + ctx = ctxsetters.WithStatusCode(ctx, http.StatusOK) + resp.Header().Set("Content-Type", "application/protobuf") + resp.Header().Set("Content-Length", strconv.Itoa(len(respBytes))) + resp.WriteHeader(http.StatusOK) + if n, err := resp.Write(respBytes); err != nil { + msg := fmt.Sprintf("failed to write response, %d of %d bytes written: %s", n, len(respBytes), err.Error()) + twerr := twirp.NewError(twirp.Unknown, msg) + ctx = callError(ctx, s.hooks, twerr) + } + callResponseSent(ctx, s.hooks) +} + func (s *tournamentServiceServer) ServiceDescriptor() ([]byte, int) { return twirpFileDescriptor0, 0 } @@ -7489,110 +7768,113 @@ func callClientError(ctx context.Context, h *twirp.ClientHooks, err twirp.Error) } var twirpFileDescriptor0 = []byte{ - // 1669 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x58, 0x5f, 0x73, 0x1a, 0x47, - 0x12, 0x3f, 0x04, 0x48, 0xd0, 0x08, 0x84, 0x46, 0x92, 0xbd, 0xe2, 0x64, 0x1b, 0xaf, 0x5d, 0x36, - 0xf6, 0x9d, 0xd1, 0x9d, 0x7c, 0xff, 0xaa, 0xce, 0xe5, 0x94, 0x84, 0x64, 0x59, 0x55, 0x8e, 0xac, - 0x5a, 0x50, 0x55, 0x64, 0x57, 0x65, 0xb3, 0x30, 0x03, 0xda, 0xca, 0xb2, 0x83, 0x77, 0x66, 0x45, - 0x78, 0xc9, 0x77, 0x88, 0x9f, 0xf3, 0x94, 0x0f, 0x92, 0xaa, 0x7c, 0xa4, 0x3c, 0xe6, 0x2d, 0x35, - 0xb3, 0x7f, 0x58, 0xc4, 0x82, 0x56, 0x8a, 0xf2, 0xc6, 0xf4, 0xf4, 0xfc, 0xba, 0xb7, 0xbb, 0xa7, - 0xfb, 0x37, 0xc0, 0xbf, 0x8d, 0x81, 0xb9, 0x3d, 0x70, 0x28, 0xa7, 0xdb, 0x9c, 0xba, 0x8e, 0x6d, - 0xf4, 0x89, 0xcd, 0x75, 0x46, 0x9c, 0x0b, 0xb3, 0x43, 0x62, 0x44, 0x75, 0xa9, 0x8b, 0xd0, 0xf4, - 0x4e, 0xe5, 0xe1, 0x18, 0xca, 0x21, 0x86, 0xc5, 0xcd, 0x3e, 0x09, 0x7f, 0x78, 0xc7, 0x2a, 0x0f, - 0x7a, 0x94, 0xf6, 0x2c, 0xe2, 0x69, 0xb5, 0xdd, 0xee, 0xb6, 0xd8, 0x63, 0xdc, 0xe8, 0x0f, 0x3c, - 0x05, 0xf5, 0x18, 0x56, 0x9b, 0xdc, 0x70, 0xb8, 0x46, 0x5d, 0x1b, 0x6b, 0xe4, 0x93, 0x4b, 0x18, - 0x47, 0x8f, 0xa0, 0x18, 0x31, 0x67, 0x62, 0x25, 0x55, 0x4d, 0xd5, 0xf2, 0xda, 0xf2, 0x58, 0x78, - 0x84, 0xd1, 0x3a, 0x64, 0x1d, 0x71, 0x48, 0x59, 0xa8, 0xa6, 0x6a, 0x59, 0xcd, 0x5b, 0xa8, 0x3f, - 0xa7, 0x60, 0xfd, 0x98, 0x0c, 0x5b, 0xa1, 0x66, 0x80, 0x89, 0x20, 0xc3, 0x2c, 0xb7, 0xe7, 0x43, - 0xc9, 0xdf, 0x42, 0x26, 0x94, 0x24, 0x42, 0x5e, 0x93, 0xbf, 0x51, 0x15, 0x0a, 0x98, 0xb0, 0x8e, - 0x63, 0x0e, 0xb8, 0x49, 0x6d, 0x25, 0x2d, 0xb7, 0xa2, 0x22, 0xf4, 0x02, 0x10, 0x36, 0x1d, 0xd2, - 0xe1, 0xd4, 0xd1, 0x5d, 0x46, 0xa4, 0x1d, 0xa6, 0x64, 0xaa, 0xe9, 0x5a, 0x5e, 0x5b, 0x0d, 0x76, - 0x4e, 0x83, 0x0d, 0xf4, 0x02, 0x32, 0x7c, 0x34, 0x20, 0x4a, 0xb6, 0x9a, 0xaa, 0x95, 0x76, 0x36, - 0xeb, 0x31, 0x21, 0x6e, 0xb5, 0x46, 0x03, 0xa2, 0x49, 0x35, 0xf5, 0xb7, 0x34, 0xa0, 0xb1, 0xf7, - 0x5f, 0x12, 0x6e, 0x60, 0x83, 0x1b, 0xa8, 0x04, 0x0b, 0x61, 0x1c, 0x16, 0x4c, 0x7c, 0x43, 0xd7, - 0x83, 0x20, 0x64, 0x22, 0x41, 0xb8, 0x9e, 0x7f, 0xe8, 0x3e, 0x00, 0x36, 0x59, 0xc7, 0x32, 0xcc, - 0x3e, 0x71, 0x94, 0x45, 0x09, 0x14, 0x91, 0xa0, 0x7b, 0x00, 0xdc, 0xb4, 0x88, 0xce, 0xf8, 0xc8, - 0x22, 0xca, 0x92, 0xdc, 0xcf, 0x0b, 0x49, 0x53, 0x08, 0xd0, 0x03, 0x28, 0xb4, 0xa9, 0xe1, 0x60, - 0x7f, 0x3f, 0xe7, 0x9d, 0x97, 0x22, 0x4f, 0xe1, 0x2d, 0x6c, 0x60, 0xd2, 0x35, 0x5c, 0x8b, 0xeb, - 0x1d, 0xcb, 0x6d, 0xeb, 0x8c, 0x70, 0x6e, 0xda, 0x3d, 0xa6, 0xe4, 0xab, 0xa9, 0x5a, 0x61, 0x67, - 0xbd, 0x6e, 0x99, 0x43, 0xea, 0x60, 0x56, 0x3f, 0x34, 0xfa, 0xc4, 0x4f, 0xae, 0xb6, 0xe6, 0x1f, - 0x69, 0x58, 0x6e, 0xbb, 0xe9, 0x1f, 0x40, 0x5f, 0xc0, 0x56, 0xd7, 0x21, 0xa4, 0x4b, 0x9d, 0xfe, - 0x04, 0x94, 0xde, 0x35, 0x89, 0x85, 0x99, 0x02, 0x32, 0x63, 0x9b, 0x81, 0x4e, 0xe4, 0xec, 0x1b, - 0xa9, 0x80, 0x2a, 0x90, 0x1b, 0x18, 0x8c, 0x09, 0x73, 0x4a, 0x41, 0x3a, 0x1a, 0xae, 0x45, 0x24, - 0x2d, 0xda, 0xa3, 0xca, 0xb2, 0x17, 0x49, 0xf1, 0x5b, 0x54, 0x64, 0x87, 0x5a, 0xd4, 0x51, 0x8a, - 0x52, 0xe8, 0x2d, 0xd0, 0x33, 0x28, 0x0f, 0x1c, 0xf3, 0xc2, 0xe0, 0x44, 0x37, 0x6c, 0xc3, 0x1a, - 0x31, 0x93, 0x29, 0xa5, 0x6a, 0xaa, 0x96, 0xd3, 0x56, 0x7c, 0xf9, 0xae, 0x2f, 0x56, 0xdb, 0xb0, - 0xd5, 0x24, 0x7c, 0x3a, 0xfb, 0x41, 0x0d, 0xef, 0x41, 0xae, 0xef, 0x8b, 0x64, 0x29, 0x14, 0x76, - 0x9e, 0xc4, 0xa6, 0x6b, 0x1a, 0x20, 0x3c, 0xa7, 0xfe, 0x98, 0x82, 0x4a, 0xd3, 0xb4, 0x7b, 0x16, - 0x91, 0x57, 0xae, 0x41, 0x6d, 0xee, 0x50, 0x8b, 0x05, 0x26, 0x2e, 0xd7, 0x59, 0x05, 0x72, 0xd8, - 0xbc, 0x30, 0x99, 0x28, 0x28, 0xaf, 0xd6, 0xc2, 0xf5, 0xf8, 0x06, 0xa6, 0x23, 0x37, 0x10, 0xbd, - 0x82, 0x92, 0xfc, 0xa1, 0x77, 0x7c, 0x68, 0x59, 0x6d, 0x85, 0x9d, 0x8d, 0x30, 0x73, 0x51, 0xc3, - 0x5a, 0xd1, 0x89, 0xba, 0xa1, 0xfe, 0x94, 0x82, 0xf2, 0x89, 0x61, 0x3a, 0x13, 0xfd, 0xe0, 0x8f, - 0x3b, 0xf5, 0x08, 0x8a, 0x03, 0x87, 0x88, 0x00, 0x11, 0xbd, 0x3d, 0x22, 0x9e, 0x4f, 0x39, 0x6d, - 0x39, 0x10, 0xee, 0x8d, 0x08, 0x43, 0x4f, 0x61, 0x05, 0x13, 0x8b, 0x70, 0xa2, 0x0f, 0x0c, 0xd3, - 0x91, 0x45, 0x97, 0x95, 0x6a, 0x25, 0x4f, 0x7c, 0xe2, 0x4b, 0xd5, 0x43, 0xd8, 0x1c, 0xc7, 0x78, - 0xdf, 0xb7, 0x7c, 0x03, 0x67, 0xd5, 0x5f, 0x52, 0xa0, 0x8c, 0x91, 0x7c, 0xfc, 0x00, 0x48, 0x85, - 0xe2, 0xc0, 0x32, 0x46, 0xc4, 0xd1, 0xa9, 0x4d, 0xc6, 0x5d, 0xb0, 0xe0, 0x09, 0xdf, 0xdb, 0xe4, - 0x08, 0x47, 0x74, 0xf8, 0x90, 0x0a, 0x9d, 0x85, 0xa8, 0x4e, 0x6b, 0x48, 0xa3, 0x8d, 0x72, 0x22, - 0x22, 0x87, 0x50, 0x66, 0xc4, 0xea, 0xea, 0x42, 0x53, 0x77, 0x08, 0x73, 0x2d, 0x2e, 0x83, 0x52, - 0xda, 0xb9, 0x17, 0x26, 0x6a, 0xec, 0x9a, 0x77, 0xd9, 0x84, 0x92, 0x56, 0x12, 0xc7, 0x4e, 0x2c, - 0x63, 0xe4, 0xad, 0xd5, 0x1f, 0x52, 0xd1, 0x68, 0x04, 0x31, 0xba, 0x49, 0xea, 0xde, 0x8a, 0xfb, - 0xe6, 0x07, 0x3e, 0x5d, 0x4d, 0xd7, 0x0a, 0x3b, 0x7f, 0x9f, 0x5f, 0xde, 0x93, 0x01, 0xd3, 0xc2, - 0xd3, 0xea, 0xe7, 0x0c, 0x3c, 0x88, 0x8e, 0x00, 0xe1, 0xe8, 0xfb, 0x0b, 0xe2, 0x38, 0x26, 0x26, - 0x37, 0xf1, 0x6c, 0x2a, 0x15, 0xe9, 0x04, 0xa9, 0xc8, 0xcc, 0x49, 0x45, 0x36, 0x9a, 0x8a, 0x1a, - 0x94, 0x23, 0xe8, 0xac, 0x43, 0x1d, 0x22, 0x1b, 0x6b, 0x56, 0x2b, 0x85, 0x06, 0x9a, 0x42, 0x1a, - 0xd1, 0x14, 0x36, 0x3c, 0xcd, 0xa5, 0xa8, 0x66, 0x6b, 0x48, 0x3d, 0xcd, 0x23, 0x58, 0x8d, 0x60, - 0xfa, 0xf9, 0xcd, 0x25, 0xc9, 0xef, 0x4a, 0x68, 0xd3, 0x13, 0x44, 0xa0, 0x84, 0x51, 0x1f, 0x2a, - 0x7f, 0x0d, 0xa8, 0xd6, 0x90, 0xfa, 0x50, 0xaf, 0x61, 0xa5, 0x67, 0xf4, 0x89, 0x4e, 0x6c, 0xac, - 0x3b, 0xc4, 0x60, 0xd4, 0x56, 0x40, 0x02, 0xdd, 0x99, 0x68, 0xeb, 0x07, 0xe2, 0xea, 0x8b, 0x5d, - 0xad, 0xd8, 0x8b, 0x2e, 0xd1, 0x16, 0xe4, 0x85, 0x0d, 0x2c, 0xec, 0xc8, 0x96, 0x9c, 0xd3, 0xc6, - 0x02, 0x31, 0x7a, 0x24, 0xba, 0x69, 0x63, 0xf2, 0x9d, 0xec, 0xcc, 0x59, 0x2d, 0x2f, 0x24, 0x47, - 0x42, 0xa0, 0x7e, 0x4e, 0xc1, 0xe3, 0xb1, 0x9b, 0x63, 0xd6, 0xd1, 0xa0, 0xae, 0xcd, 0x31, 0x1d, - 0xda, 0xb7, 0xd7, 0x6e, 0x6a, 0x50, 0x66, 0x02, 0x5f, 0x37, 0x2c, 0x4b, 0x97, 0xa2, 0xa0, 0xe3, - 0x94, 0xa4, 0x7c, 0xd7, 0xb2, 0xa4, 0x69, 0xa6, 0xae, 0x47, 0xa7, 0xbd, 0x46, 0xd8, 0x80, 0xda, - 0x8c, 0xa8, 0xff, 0x87, 0x8d, 0x4b, 0x24, 0xc6, 0xdb, 0x88, 0xa3, 0x01, 0x72, 0xa0, 0x2f, 0x8c, - 0x07, 0xba, 0xba, 0x07, 0x5b, 0x87, 0xf3, 0xa6, 0x48, 0x12, 0x8c, 0x27, 0xb0, 0x3e, 0x81, 0x31, - 0xe3, 0xac, 0xfa, 0x0c, 0xee, 0xbe, 0x31, 0x6d, 0x93, 0x9d, 0x5f, 0xad, 0xfa, 0x3d, 0x54, 0xe2, - 0x7c, 0xf2, 0x3f, 0xec, 0x16, 0x46, 0x9b, 0xa8, 0x8e, 0x80, 0x7e, 0x31, 0x65, 0x41, 0x4e, 0xf7, - 0xb1, 0x40, 0x3d, 0x03, 0xa4, 0x91, 0x8e, 0x5f, 0xa0, 0x33, 0xfb, 0xd3, 0x5f, 0x21, 0x6f, 0xbb, - 0x7d, 0xbd, 0x27, 0x39, 0x9d, 0xc7, 0x2c, 0x73, 0xb6, 0xdb, 0x97, 0x67, 0xd0, 0x1d, 0x58, 0xa4, - 0xdd, 0x2e, 0x23, 0xdc, 0xcf, 0xb6, 0xbf, 0x52, 0x8f, 0x61, 0x6d, 0x02, 0xda, 0xff, 0xa6, 0xff, - 0x42, 0xd6, 0xc3, 0x49, 0xc9, 0x66, 0xf6, 0x70, 0xc6, 0x65, 0x39, 0xb0, 0x31, 0xc1, 0x07, 0x17, - 0x22, 0x74, 0x9e, 0xbe, 0xfa, 0x1c, 0x94, 0x53, 0x5b, 0x16, 0xca, 0xd5, 0x61, 0x55, 0xa1, 0x7c, - 0x6a, 0x77, 0xce, 0x49, 0xe7, 0xdb, 0xa3, 0x59, 0x05, 0xac, 0x56, 0xa1, 0xd4, 0x10, 0x1a, 0xe6, - 0x4c, 0x8d, 0x6f, 0x64, 0xc1, 0x79, 0x14, 0x88, 0x45, 0xa7, 0x59, 0x1d, 0x32, 0xd8, 0xe0, 0xc4, - 0xcf, 0x49, 0xa5, 0xee, 0xf1, 0xf9, 0x7a, 0xc0, 0xe7, 0xeb, 0xad, 0x80, 0xcf, 0x6b, 0x52, 0x0f, - 0xdd, 0x85, 0x25, 0xc9, 0xb5, 0xc2, 0x51, 0xb4, 0x28, 0x96, 0x47, 0x58, 0xc4, 0x68, 0x02, 0xde, - 0x8f, 0x51, 0x22, 0xaa, 0x1f, 0x57, 0xa1, 0x67, 0xb0, 0xe9, 0xc5, 0x3c, 0x82, 0x3a, 0x33, 0xab, - 0x92, 0x99, 0xb9, 0x36, 0x0f, 0xde, 0x0a, 0x72, 0x31, 0x33, 0x9d, 0x1f, 0x61, 0x7d, 0x12, 0xd4, - 0xf7, 0xb5, 0x01, 0x39, 0xe6, 0xcb, 0xfc, 0x94, 0x3e, 0x8d, 0xab, 0xd1, 0x98, 0xcf, 0xd4, 0xc2, - 0x83, 0xcf, 0xff, 0x03, 0x59, 0x49, 0xa7, 0xd1, 0x32, 0xe4, 0x9a, 0xad, 0xdd, 0xe3, 0xfd, 0x5d, - 0x6d, 0xbf, 0xfc, 0x17, 0x94, 0x83, 0x4c, 0xe3, 0xdd, 0xe9, 0x5e, 0x39, 0x85, 0xf2, 0x90, 0x6d, - 0xbc, 0x3d, 0x7a, 0xb7, 0x5f, 0x5e, 0x40, 0x00, 0x8b, 0xef, 0x0e, 0x0e, 0x77, 0x1b, 0x67, 0xe5, - 0xf4, 0xce, 0xaf, 0x08, 0x56, 0x23, 0xdd, 0xcb, 0xb3, 0x85, 0x30, 0x14, 0x27, 0x1a, 0x05, 0xaa, - 0xc5, 0x79, 0x14, 0xf7, 0x20, 0xaa, 0x3c, 0x4b, 0xa0, 0xe9, 0x7f, 0xf8, 0x08, 0x36, 0x62, 0x3b, - 0x0a, 0xfa, 0x47, 0x1c, 0xc6, 0xbc, 0xe6, 0x53, 0xa9, 0x27, 0xbc, 0xd5, 0x81, 0xe9, 0x8f, 0x50, - 0x9c, 0xc0, 0x8b, 0xff, 0xc0, 0xb8, 0x5e, 0x55, 0xa9, 0x86, 0xf7, 0xed, 0x8d, 0x6b, 0x59, 0xd3, - 0x84, 0x8d, 0xa1, 0x1e, 0x94, 0x2f, 0x77, 0x2f, 0xf4, 0xb7, 0x38, 0xfc, 0x19, 0x3d, 0xae, 0x72, - 0x45, 0x8f, 0x0a, 0xbf, 0xe2, 0x13, 0x6c, 0x34, 0x93, 0x07, 0x70, 0xde, 0x1b, 0x20, 0xb1, 0xc9, - 0x33, 0xc8, 0x87, 0x3c, 0x1a, 0x3d, 0x8e, 0x3b, 0x74, 0x99, 0x66, 0x27, 0x86, 0x1e, 0xc0, 0x9d, - 0x26, 0xe1, 0x31, 0x8f, 0x08, 0x14, 0x9b, 0xdd, 0xd9, 0xaf, 0x8d, 0xc4, 0x16, 0x3f, 0x40, 0xb9, - 0x49, 0xf8, 0xa4, 0xad, 0xfb, 0x61, 0x7a, 0x43, 0x06, 0x1e, 0xdd, 0x4f, 0x8c, 0xfd, 0x15, 0xac, - 0x35, 0x49, 0x58, 0x14, 0x21, 0xfc, 0xe6, 0x14, 0xfc, 0xb5, 0x91, 0x35, 0x58, 0xde, 0xc5, 0x78, - 0x3f, 0x98, 0x40, 0xa8, 0x12, 0x33, 0x00, 0x4e, 0x88, 0xc3, 0xa8, 0x9d, 0x1c, 0xf3, 0x14, 0x56, - 0x34, 0xd2, 0xa7, 0x17, 0xe4, 0x76, 0x61, 0x31, 0x14, 0xa4, 0xab, 0x3e, 0xab, 0x79, 0x31, 0xff, - 0xd8, 0xa5, 0x27, 0x4f, 0x62, 0x2b, 0x3d, 0x28, 0x05, 0xce, 0xff, 0xb9, 0x86, 0x4e, 0x00, 0x76, - 0x31, 0x3e, 0x91, 0xec, 0xf3, 0x76, 0x02, 0xd4, 0x84, 0xa2, 0xe7, 0xfa, 0x6d, 0x82, 0x76, 0x00, - 0x9a, 0x24, 0x78, 0xc5, 0x5c, 0x15, 0x8b, 0x4b, 0x2f, 0xab, 0xc4, 0x46, 0xce, 0x21, 0x2f, 0xee, - 0x8e, 0x47, 0xc0, 0x5f, 0x5e, 0x79, 0x68, 0xfa, 0xa5, 0x94, 0xd8, 0xd2, 0x10, 0xd6, 0x62, 0x58, - 0x35, 0xfa, 0xdf, 0xfc, 0xe3, 0xb3, 0x89, 0x78, 0x62, 0xc3, 0x5f, 0x43, 0x21, 0xc2, 0xbf, 0x50, - 0xec, 0xb1, 0x69, 0xee, 0x57, 0x79, 0x7a, 0xa5, 0x5e, 0x58, 0xb7, 0xab, 0x0d, 0x87, 0x18, 0x9c, - 0x44, 0x46, 0x3b, 0x9a, 0x35, 0x3f, 0xa7, 0x49, 0x54, 0x25, 0x29, 0x4d, 0x40, 0x03, 0x39, 0x68, - 0xa7, 0x79, 0x4d, 0x7c, 0x6d, 0xcc, 0xe4, 0x3f, 0x95, 0xda, 0x15, 0x06, 0xc7, 0x9f, 0x66, 0xc2, - 0xea, 0x14, 0xd5, 0x44, 0xb1, 0xcf, 0xee, 0x59, 0x8c, 0xf4, 0x3a, 0x13, 0x29, 0x64, 0xaa, 0xf1, - 0x13, 0xe9, 0x32, 0x91, 0xbd, 0x46, 0x57, 0x5c, 0x6a, 0xf8, 0xc0, 0x6a, 0xec, 0xa7, 0x4f, 0xb0, - 0xdf, 0xa4, 0xb0, 0x7b, 0xaf, 0x3f, 0xbc, 0xea, 0x99, 0xfc, 0xdc, 0x6d, 0xd7, 0x3b, 0xb4, 0xbf, - 0x8d, 0x69, 0xdf, 0xb4, 0xe9, 0x3f, 0xff, 0xb5, 0xed, 0x5f, 0xfc, 0x6d, 0x67, 0xd0, 0xd9, 0x9e, - 0xf7, 0x6f, 0x7a, 0x7b, 0x51, 0xee, 0xbc, 0xfc, 0x3d, 0x00, 0x00, 0xff, 0xff, 0x17, 0x23, 0xf9, - 0xfb, 0x74, 0x17, 0x00, 0x00, + // 1714 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xb4, 0x59, 0x5f, 0x73, 0xe2, 0xc8, + 0x11, 0x0f, 0x06, 0x6c, 0x68, 0x0c, 0xc6, 0x63, 0x7b, 0x4f, 0xe6, 0x7c, 0xb7, 0x9c, 0xee, 0xea, + 0x96, 0xbd, 0x64, 0x21, 0xf1, 0xe5, 0x5f, 0x55, 0xae, 0x2e, 0x65, 0x63, 0xaf, 0xd7, 0x55, 0x1b, + 0x9f, 0x4b, 0xe0, 0xaa, 0x78, 0xb7, 0x2a, 0x8a, 0x60, 0x06, 0xac, 0x8a, 0xd0, 0xb0, 0x9a, 0x91, + 0x09, 0x2f, 0xf9, 0x0e, 0xd9, 0xe7, 0x3c, 0xe5, 0x83, 0xa4, 0x2a, 0x5f, 0x25, 0xdf, 0x22, 0x6f, + 0xa9, 0x19, 0x8d, 0x84, 0x30, 0x02, 0xcb, 0x8e, 0xef, 0x8d, 0xe9, 0xe9, 0xfe, 0x75, 0xab, 0xbb, + 0xa7, 0xe7, 0x37, 0x05, 0xfc, 0xca, 0x1a, 0xdb, 0xad, 0xb1, 0x47, 0x39, 0x6d, 0x71, 0xea, 0x7b, + 0xae, 0x35, 0x22, 0x2e, 0x37, 0x19, 0xf1, 0x6e, 0xed, 0x3e, 0x49, 0x10, 0x35, 0xa5, 0x2e, 0x42, + 0x8b, 0x3b, 0xb5, 0x2f, 0x66, 0x50, 0x1e, 0xb1, 0x1c, 0x6e, 0x8f, 0x48, 0xf4, 0x23, 0x30, 0xab, + 0x3d, 0x1f, 0x52, 0x3a, 0x74, 0x48, 0xa0, 0xd5, 0xf3, 0x07, 0x2d, 0xb1, 0xc7, 0xb8, 0x35, 0x1a, + 0x07, 0x0a, 0xfa, 0x05, 0x6c, 0x77, 0xb8, 0xe5, 0x71, 0x83, 0xfa, 0x2e, 0x36, 0xc8, 0x07, 0x9f, + 0x30, 0x8e, 0xbe, 0x84, 0x72, 0xcc, 0x9d, 0x8d, 0xb5, 0x4c, 0x3d, 0xd3, 0x28, 0x1a, 0x9b, 0x33, + 0xe1, 0x39, 0x46, 0xbb, 0x90, 0xf7, 0x84, 0x91, 0xb6, 0x56, 0xcf, 0x34, 0xf2, 0x46, 0xb0, 0xd0, + 0xff, 0x95, 0x81, 0xdd, 0x0b, 0x32, 0xe9, 0x46, 0x9a, 0x21, 0x26, 0x82, 0x1c, 0x73, 0xfc, 0xa1, + 0x82, 0x92, 0xbf, 0x85, 0x4c, 0x28, 0x49, 0x84, 0xa2, 0x21, 0x7f, 0xa3, 0x3a, 0x94, 0x30, 0x61, + 0x7d, 0xcf, 0x1e, 0x73, 0x9b, 0xba, 0x5a, 0x56, 0x6e, 0xc5, 0x45, 0xe8, 0x15, 0x20, 0x6c, 0x7b, + 0xa4, 0xcf, 0xa9, 0x67, 0xfa, 0x8c, 0x48, 0x3f, 0x4c, 0xcb, 0xd5, 0xb3, 0x8d, 0xa2, 0xb1, 0x1d, + 0xee, 0x5c, 0x85, 0x1b, 0xe8, 0x15, 0xe4, 0xf8, 0x74, 0x4c, 0xb4, 0x7c, 0x3d, 0xd3, 0xa8, 0x1c, + 0xee, 0x37, 0x13, 0x52, 0xdc, 0xed, 0x4e, 0xc7, 0xc4, 0x90, 0x6a, 0xfa, 0x7f, 0xb3, 0x80, 0x66, + 0xd1, 0xff, 0x81, 0x70, 0x0b, 0x5b, 0xdc, 0x42, 0x15, 0x58, 0x8b, 0xf2, 0xb0, 0x66, 0xe3, 0x47, + 0x86, 0x1e, 0x26, 0x21, 0x17, 0x4b, 0xc2, 0xc3, 0xe2, 0x43, 0x9f, 0x03, 0x60, 0x9b, 0xf5, 0x1d, + 0xcb, 0x1e, 0x11, 0x4f, 0x5b, 0x97, 0x40, 0x31, 0x09, 0xfa, 0x0c, 0x80, 0xdb, 0x0e, 0x31, 0x19, + 0x9f, 0x3a, 0x44, 0xdb, 0x90, 0xfb, 0x45, 0x21, 0xe9, 0x08, 0x01, 0x7a, 0x0e, 0xa5, 0x1e, 0xb5, + 0x3c, 0xac, 0xf6, 0x0b, 0x81, 0xbd, 0x14, 0x05, 0x0a, 0x6f, 0x60, 0x0f, 0x93, 0x81, 0xe5, 0x3b, + 0xdc, 0xec, 0x3b, 0x7e, 0xcf, 0x64, 0x84, 0x73, 0xdb, 0x1d, 0x32, 0xad, 0x58, 0xcf, 0x34, 0x4a, + 0x87, 0xbb, 0x4d, 0xc7, 0x9e, 0x50, 0x0f, 0xb3, 0xe6, 0x99, 0x35, 0x22, 0xaa, 0xb8, 0xc6, 0x8e, + 0x32, 0x69, 0x3b, 0x7e, 0xaf, 0xa3, 0x0c, 0xd0, 0xef, 0xe1, 0x60, 0xe0, 0x11, 0x32, 0xa0, 0xde, + 0x68, 0x0e, 0xca, 0x1c, 0xd8, 0xc4, 0xc1, 0x4c, 0x03, 0x59, 0xb1, 0xfd, 0x50, 0x27, 0x66, 0xfb, + 0x5a, 0x2a, 0xa0, 0x1a, 0x14, 0xc6, 0x16, 0x63, 0xc2, 0x9d, 0x56, 0x92, 0x81, 0x46, 0x6b, 0x91, + 0x49, 0x87, 0x0e, 0xa9, 0xb6, 0x19, 0x64, 0x52, 0xfc, 0x16, 0x1d, 0xd9, 0xa7, 0x0e, 0xf5, 0xb4, + 0xb2, 0x14, 0x06, 0x0b, 0xf4, 0x12, 0xaa, 0x63, 0xcf, 0xbe, 0xb5, 0x38, 0x31, 0x2d, 0xd7, 0x72, + 0xa6, 0xcc, 0x66, 0x5a, 0xa5, 0x9e, 0x69, 0x14, 0x8c, 0x2d, 0x25, 0x3f, 0x52, 0x62, 0xbd, 0x07, + 0x07, 0x1d, 0xc2, 0x17, 0xab, 0x1f, 0xf6, 0xf0, 0x31, 0x14, 0x46, 0x4a, 0x24, 0x5b, 0xa1, 0x74, + 0xf8, 0x75, 0x62, 0xb9, 0x16, 0x01, 0x22, 0x3b, 0xfd, 0x1f, 0x19, 0xa8, 0x75, 0x6c, 0x77, 0xe8, + 0x10, 0x79, 0xe4, 0xda, 0xd4, 0xe5, 0x1e, 0x75, 0x58, 0xe8, 0xe2, 0x6e, 0x9f, 0xd5, 0xa0, 0x80, + 0xed, 0x5b, 0x9b, 0x89, 0x86, 0x0a, 0x7a, 0x2d, 0x5a, 0xcf, 0x4e, 0x60, 0x36, 0x76, 0x02, 0xd1, + 0x77, 0x50, 0x91, 0x3f, 0xcc, 0xbe, 0x82, 0x96, 0xdd, 0x56, 0x3a, 0xdc, 0x8b, 0x2a, 0x17, 0x77, + 0x6c, 0x94, 0xbd, 0x78, 0x18, 0xfa, 0x3f, 0x33, 0x50, 0xbd, 0xb4, 0x6c, 0x6f, 0x6e, 0x1e, 0xfc, + 0xff, 0x41, 0x7d, 0x09, 0xe5, 0xb1, 0x47, 0x44, 0x82, 0x88, 0xd9, 0x9b, 0x92, 0x20, 0xa6, 0x82, + 0xb1, 0x19, 0x0a, 0x8f, 0xa7, 0x84, 0xa1, 0x17, 0xb0, 0x85, 0x89, 0x43, 0x38, 0x31, 0xc7, 0x96, + 0xed, 0xc9, 0xa6, 0xcb, 0x4b, 0xb5, 0x4a, 0x20, 0xbe, 0x54, 0x52, 0xfd, 0x0c, 0xf6, 0x67, 0x39, + 0x3e, 0x51, 0x9e, 0x1f, 0x11, 0xac, 0xfe, 0xef, 0x0c, 0x68, 0x33, 0x24, 0x85, 0x1f, 0x02, 0xe9, + 0x50, 0x1e, 0x3b, 0xd6, 0x94, 0x78, 0x26, 0x75, 0xc9, 0x6c, 0x0a, 0x96, 0x02, 0xe1, 0x0f, 0x2e, + 0x39, 0xc7, 0x31, 0x1d, 0x3e, 0xa1, 0x42, 0x67, 0x2d, 0xae, 0xd3, 0x9d, 0xd0, 0xf8, 0xa0, 0x9c, + 0xcb, 0xc8, 0x19, 0x54, 0x19, 0x71, 0x06, 0xa6, 0xd0, 0x34, 0x3d, 0xc2, 0x7c, 0x87, 0xcb, 0xa4, + 0x54, 0x0e, 0x3f, 0x8b, 0x0a, 0x35, 0x0b, 0x2d, 0x38, 0x6c, 0x42, 0xc9, 0xa8, 0x08, 0xb3, 0x4b, + 0xc7, 0x9a, 0x06, 0x6b, 0xfd, 0xef, 0x99, 0x78, 0x36, 0xc2, 0x1c, 0x3d, 0xa6, 0x74, 0x6f, 0xc4, + 0x79, 0x53, 0x89, 0xcf, 0xd6, 0xb3, 0x8d, 0xd2, 0xe1, 0xcf, 0x56, 0xb7, 0xf7, 0x7c, 0xc2, 0x8c, + 0xc8, 0x5a, 0xff, 0x98, 0x83, 0xe7, 0xf1, 0x2b, 0x40, 0x04, 0xfa, 0xc3, 0x2d, 0xf1, 0x3c, 0x1b, + 0x93, 0xc7, 0x44, 0xb6, 0x50, 0x8a, 0x6c, 0x8a, 0x52, 0xe4, 0x56, 0x94, 0x22, 0x1f, 0x2f, 0x45, + 0x03, 0xaa, 0x31, 0x74, 0xd6, 0xa7, 0x1e, 0x91, 0x83, 0x35, 0x6f, 0x54, 0x22, 0x07, 0x1d, 0x21, + 0x8d, 0x69, 0x0a, 0x1f, 0x81, 0xe6, 0x46, 0x5c, 0xb3, 0x3b, 0xa1, 0x81, 0xe6, 0x39, 0x6c, 0xc7, + 0x30, 0x55, 0x7d, 0x0b, 0x69, 0xea, 0xbb, 0x15, 0xf9, 0x0c, 0x04, 0x31, 0x28, 0xe1, 0x54, 0x41, + 0x15, 0x1f, 0x00, 0xd5, 0x9d, 0x50, 0x05, 0xf5, 0x3d, 0x6c, 0x0d, 0xad, 0x11, 0x31, 0x89, 0x8b, + 0x4d, 0x8f, 0x58, 0x8c, 0xba, 0x1a, 0x48, 0xa0, 0x67, 0x73, 0x63, 0xfd, 0x54, 0x1c, 0x7d, 0xb1, + 0x6b, 0x94, 0x87, 0xf1, 0x25, 0x3a, 0x80, 0xa2, 0xf0, 0x81, 0x85, 0x1f, 0x39, 0x92, 0x0b, 0xc6, + 0x4c, 0x20, 0xae, 0x1e, 0x89, 0x6e, 0xbb, 0x98, 0xfc, 0x55, 0x4e, 0xe6, 0xbc, 0x51, 0x14, 0x92, + 0x73, 0x21, 0xd0, 0x3f, 0x66, 0xe0, 0xab, 0x59, 0x98, 0x33, 0xd6, 0xd1, 0xa6, 0xbe, 0xcb, 0x31, + 0x9d, 0xb8, 0x4f, 0x37, 0x6e, 0x1a, 0x50, 0x65, 0x02, 0xdf, 0xb4, 0x1c, 0xc7, 0x94, 0xa2, 0x70, + 0xe2, 0x54, 0xa4, 0xfc, 0xc8, 0x71, 0xa4, 0x6b, 0xa6, 0xef, 0xc6, 0x6f, 0x7b, 0x83, 0xb0, 0x31, + 0x75, 0x19, 0xd1, 0x7f, 0x07, 0x7b, 0x77, 0x48, 0x4c, 0xb0, 0x91, 0x44, 0x03, 0xe4, 0x85, 0xbe, + 0x36, 0xbb, 0xd0, 0xf5, 0x63, 0x38, 0x38, 0x5b, 0x75, 0x8b, 0xa4, 0xc1, 0xf8, 0x1a, 0x76, 0xe7, + 0x30, 0x96, 0xd8, 0xea, 0x2f, 0xe1, 0x93, 0xd7, 0xb6, 0x6b, 0xb3, 0x9b, 0xfb, 0x55, 0xff, 0x06, + 0xb5, 0xa4, 0x98, 0xd4, 0x87, 0x3d, 0xc1, 0xd5, 0x26, 0xba, 0x23, 0xa4, 0x5f, 0x4c, 0x5b, 0x93, + 0xb7, 0xfb, 0x4c, 0xa0, 0x5f, 0x03, 0x32, 0x48, 0x5f, 0x35, 0xe8, 0xd2, 0xf9, 0xf4, 0x29, 0x14, + 0x5d, 0x7f, 0x64, 0x0e, 0x25, 0xa7, 0x0b, 0x98, 0x65, 0xc1, 0xf5, 0x47, 0xd2, 0x06, 0x3d, 0x83, + 0x75, 0x3a, 0x18, 0x30, 0xc2, 0x55, 0xb5, 0xd5, 0x4a, 0xbf, 0x80, 0x9d, 0x39, 0x68, 0xf5, 0x4d, + 0xbf, 0x81, 0x7c, 0x80, 0x93, 0x91, 0xc3, 0xec, 0x8b, 0x25, 0x87, 0xe5, 0xd4, 0xc5, 0x04, 0x9f, + 0xde, 0x8a, 0xd4, 0x05, 0xfa, 0xfa, 0x37, 0xa0, 0x5d, 0xb9, 0xb2, 0x51, 0xee, 0x4f, 0xab, 0x0e, + 0xd5, 0x2b, 0xb7, 0x7f, 0x43, 0xfa, 0x7f, 0x39, 0x5f, 0xd6, 0xc0, 0x7a, 0x1d, 0x2a, 0x6d, 0xa1, + 0x61, 0x2f, 0xd5, 0x78, 0x0f, 0x9f, 0x9e, 0xd8, 0xcc, 0x62, 0x8c, 0xf6, 0x6d, 0x8b, 0x13, 0xc1, + 0x85, 0x62, 0xfc, 0x2a, 0x1d, 0x21, 0xff, 0x04, 0x36, 0x82, 0xe3, 0x17, 0xde, 0x42, 0xeb, 0xf2, + 0xec, 0x61, 0xfd, 0xcf, 0xb2, 0x9b, 0x03, 0x7e, 0xc5, 0xe2, 0x57, 0x65, 0x13, 0x72, 0xd8, 0xe2, + 0x44, 0x15, 0xbc, 0xd6, 0x0c, 0x1e, 0x0b, 0xcd, 0xf0, 0xb1, 0xd0, 0xec, 0x86, 0x8f, 0x05, 0x43, + 0xea, 0x09, 0x0f, 0x92, 0xc8, 0xcd, 0x3c, 0x88, 0xe5, 0x39, 0x16, 0x05, 0x98, 0x83, 0x57, 0x05, + 0x48, 0x15, 0x76, 0x52, 0xfb, 0x5f, 0xc3, 0x7e, 0x50, 0xd0, 0x18, 0xea, 0xd2, 0x96, 0x91, 0xb4, + 0xcf, 0x77, 0x79, 0xf8, 0x10, 0x91, 0x8b, 0xa5, 0xbd, 0xf2, 0x1e, 0x76, 0xe7, 0x41, 0x55, 0xac, + 0x6d, 0x28, 0x30, 0x25, 0x53, 0xfd, 0xf2, 0x22, 0xe9, 0x00, 0x24, 0x7c, 0xa6, 0x11, 0x19, 0x7e, + 0xf3, 0x6b, 0xc8, 0x4b, 0xae, 0x8e, 0x36, 0xa1, 0xd0, 0xe9, 0x1e, 0x5d, 0x9c, 0x1c, 0x19, 0x27, + 0xd5, 0x9f, 0xa0, 0x02, 0xe4, 0xda, 0x6f, 0xaf, 0x8e, 0xab, 0x19, 0x54, 0x84, 0x7c, 0xfb, 0xcd, + 0xf9, 0xdb, 0x93, 0xea, 0x1a, 0x02, 0x58, 0x7f, 0x7b, 0x7a, 0x76, 0xd4, 0xbe, 0xae, 0x66, 0x0f, + 0xff, 0xb3, 0x03, 0xdb, 0xb1, 0xd1, 0x18, 0xf8, 0x42, 0x18, 0xca, 0x73, 0x53, 0x08, 0x35, 0x92, + 0x22, 0x4a, 0x7a, 0x6d, 0xd5, 0x5e, 0xa6, 0xd0, 0x54, 0x1f, 0x3e, 0x85, 0xbd, 0xc4, 0x71, 0x85, + 0x7e, 0x9e, 0x84, 0xb1, 0x6a, 0xb2, 0xd5, 0x9a, 0x29, 0x47, 0x46, 0xe8, 0xfa, 0x3d, 0x94, 0xe7, + 0xf0, 0x92, 0x3f, 0x30, 0x69, 0x10, 0xd6, 0xea, 0xd1, 0x61, 0x7e, 0xed, 0x3b, 0xce, 0x22, 0x1b, + 0x64, 0x68, 0x08, 0xd5, 0xbb, 0xa3, 0x11, 0xfd, 0x34, 0x09, 0x7f, 0xc9, 0x00, 0xad, 0xdd, 0x33, + 0x00, 0xa3, 0xaf, 0xf8, 0x00, 0x7b, 0x9d, 0xf4, 0x09, 0x5c, 0xf5, 0xc0, 0x48, 0xed, 0xf2, 0x1a, + 0x8a, 0x11, 0x49, 0x47, 0x5f, 0x25, 0x19, 0xdd, 0xe5, 0xf0, 0xa9, 0xa1, 0xc7, 0xf0, 0xac, 0x43, + 0x78, 0xc2, 0x0b, 0x05, 0x25, 0x56, 0x77, 0xf9, 0x53, 0x26, 0xb5, 0xc7, 0x77, 0x50, 0xed, 0x10, + 0x3e, 0xef, 0xeb, 0xf3, 0xa8, 0xbc, 0x11, 0xbd, 0x8f, 0xef, 0xa7, 0xc6, 0xfe, 0x23, 0xec, 0x74, + 0x48, 0xd4, 0x14, 0x11, 0xfc, 0xfe, 0x02, 0xfc, 0x83, 0x91, 0x0d, 0xd8, 0x3c, 0xc2, 0xf8, 0x24, + 0xbc, 0xde, 0x50, 0x2d, 0xe1, 0x76, 0xb9, 0x24, 0x1e, 0xa3, 0x6e, 0x7a, 0xcc, 0x2b, 0xd8, 0x32, + 0xc8, 0x88, 0xde, 0x92, 0xa7, 0x85, 0xc5, 0x50, 0x92, 0xa1, 0x2a, 0xca, 0xf4, 0x6a, 0xb5, 0xd9, + 0x9d, 0xf7, 0x54, 0x6a, 0x2f, 0x43, 0xa8, 0x84, 0xc1, 0xff, 0xb8, 0x8e, 0x2e, 0x01, 0x8e, 0x30, + 0xbe, 0x94, 0xd4, 0xf6, 0x69, 0x12, 0xd4, 0x81, 0x72, 0x10, 0xfa, 0x53, 0x82, 0xf6, 0x01, 0x3a, + 0x24, 0x7c, 0x22, 0xdd, 0x97, 0x8b, 0x3b, 0xcf, 0xb6, 0xd4, 0x4e, 0x6e, 0xa0, 0x28, 0xce, 0x4e, + 0xc0, 0xee, 0xbf, 0xbd, 0xd7, 0x68, 0xf1, 0x19, 0x96, 0xda, 0xd3, 0x04, 0x76, 0x12, 0x28, 0x3b, + 0xfa, 0xed, 0x6a, 0xf3, 0xe5, 0x2c, 0x3f, 0xb5, 0xe3, 0x3f, 0x41, 0x29, 0x46, 0xee, 0x50, 0xa2, + 0xd9, 0x22, 0xb1, 0xac, 0xbd, 0xb8, 0x57, 0x2f, 0xea, 0xdb, 0xed, 0xb6, 0x47, 0x14, 0xe9, 0x52, + 0x57, 0x3b, 0x5a, 0x76, 0x7f, 0x2e, 0x92, 0xa8, 0x5a, 0x5a, 0x9a, 0x80, 0xc6, 0xf2, 0xa2, 0x5d, + 0xe4, 0x35, 0xc9, 0xbd, 0xb1, 0x94, 0xff, 0xd4, 0x1a, 0xf7, 0x38, 0x9c, 0x7d, 0x9a, 0x0d, 0xdb, + 0x0b, 0x3c, 0x16, 0x25, 0xbe, 0xe9, 0x97, 0xd1, 0xdd, 0x87, 0xdc, 0x48, 0x11, 0x0d, 0x4e, 0xbe, + 0x91, 0xee, 0xb2, 0xe4, 0x07, 0x4c, 0xc5, 0x8d, 0xb6, 0x02, 0xd6, 0x13, 0x3f, 0x7d, 0x8e, 0x5a, + 0xa7, 0x86, 0xa5, 0xb0, 0x9b, 0x44, 0xb9, 0x51, 0x2b, 0xc9, 0x7e, 0x05, 0x39, 0x4f, 0xeb, 0xf0, + 0xf8, 0xfb, 0x77, 0xdf, 0x0d, 0x6d, 0x7e, 0xe3, 0xf7, 0x9a, 0x7d, 0x3a, 0x6a, 0x61, 0x3a, 0xb2, + 0x5d, 0xfa, 0x8b, 0x5f, 0xb6, 0xd4, 0xa4, 0x69, 0x79, 0xe3, 0x7e, 0x6b, 0xd5, 0x7f, 0x03, 0xbd, + 0x75, 0xb9, 0xf3, 0xed, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x09, 0x1b, 0x4c, 0xf9, 0x42, 0x18, + 0x00, 0x00, }