From 46cefd052583e6176aee48b52233b61402422b10 Mon Sep 17 00:00:00 2001 From: George Tsagkarelis Date: Mon, 30 Oct 2023 10:48:06 +0100 Subject: [PATCH 1/6] taprpc: add pagination to AssetRoots & AssetLeafKeys --- taprpc/universerpc/universe.pb.go | 1603 ++++++++++++---------- taprpc/universerpc/universe.pb.gw.go | 76 +- taprpc/universerpc/universe.pb.json.go | 2 +- taprpc/universerpc/universe.proto | 25 +- taprpc/universerpc/universe.swagger.json | 108 +- taprpc/universerpc/universe.yaml | 4 +- taprpc/universerpc/universe_grpc.pb.go | 12 +- 7 files changed, 1026 insertions(+), 804 deletions(-) diff --git a/taprpc/universerpc/universe.pb.go b/taprpc/universerpc/universe.pb.go index a892f7b9b..ccd5d86a5 100644 --- a/taprpc/universerpc/universe.pb.go +++ b/taprpc/universerpc/universe.pb.go @@ -287,6 +287,12 @@ type AssetRootRequest struct { // If true, then the response will include the amounts for each asset ID // of grouped assets. WithAmountsById bool `protobuf:"varint,1,opt,name=with_amounts_by_id,json=withAmountsById,proto3" json:"with_amounts_by_id,omitempty"` + // The offset for the page. + Offset int32 `protobuf:"varint,2,opt,name=offset,proto3" json:"offset,omitempty"` + // The length limit for the page. + Limit int32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` + // The direction of the page. + Direction SortDirection `protobuf:"varint,4,opt,name=direction,proto3,enum=universerpc.SortDirection" json:"direction,omitempty"` } func (x *AssetRootRequest) Reset() { @@ -328,6 +334,27 @@ func (x *AssetRootRequest) GetWithAmountsById() bool { return false } +func (x *AssetRootRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *AssetRootRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *AssetRootRequest) GetDirection() SortDirection { + if x != nil { + return x.Direction + } + return SortDirection_SORT_DIRECTION_ASC +} + type MerkleSumNode struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1015,6 +1042,81 @@ func (*AssetKey_ScriptKeyBytes) isAssetKey_ScriptKey() {} func (*AssetKey_ScriptKeyStr) isAssetKey_ScriptKey() {} +type AssetLeafKeysRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // The ID of the asset to query for. + Id *ID `protobuf:"bytes,1,opt,name=id,proto3" json:"id,omitempty"` + // The offset for the page. + Offset int32 `protobuf:"varint,2,opt,name=offset,proto3" json:"offset,omitempty"` + // The length limit for the page. + Limit int32 `protobuf:"varint,3,opt,name=limit,proto3" json:"limit,omitempty"` + // The direction of the page. + Direction SortDirection `protobuf:"varint,4,opt,name=direction,proto3,enum=universerpc.SortDirection" json:"direction,omitempty"` +} + +func (x *AssetLeafKeysRequest) Reset() { + *x = AssetLeafKeysRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_universerpc_universe_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *AssetLeafKeysRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AssetLeafKeysRequest) ProtoMessage() {} + +func (x *AssetLeafKeysRequest) ProtoReflect() protoreflect.Message { + mi := &file_universerpc_universe_proto_msgTypes[11] + 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 AssetLeafKeysRequest.ProtoReflect.Descriptor instead. +func (*AssetLeafKeysRequest) Descriptor() ([]byte, []int) { + return file_universerpc_universe_proto_rawDescGZIP(), []int{11} +} + +func (x *AssetLeafKeysRequest) GetId() *ID { + if x != nil { + return x.Id + } + return nil +} + +func (x *AssetLeafKeysRequest) GetOffset() int32 { + if x != nil { + return x.Offset + } + return 0 +} + +func (x *AssetLeafKeysRequest) GetLimit() int32 { + if x != nil { + return x.Limit + } + return 0 +} + +func (x *AssetLeafKeysRequest) GetDirection() SortDirection { + if x != nil { + return x.Direction + } + return SortDirection_SORT_DIRECTION_ASC +} + type AssetLeafKeyResponse struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -1027,7 +1129,7 @@ type AssetLeafKeyResponse struct { func (x *AssetLeafKeyResponse) Reset() { *x = AssetLeafKeyResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[11] + mi := &file_universerpc_universe_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1040,7 +1142,7 @@ func (x *AssetLeafKeyResponse) String() string { func (*AssetLeafKeyResponse) ProtoMessage() {} func (x *AssetLeafKeyResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[11] + mi := &file_universerpc_universe_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1053,7 +1155,7 @@ func (x *AssetLeafKeyResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetLeafKeyResponse.ProtoReflect.Descriptor instead. func (*AssetLeafKeyResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{11} + return file_universerpc_universe_proto_rawDescGZIP(), []int{12} } func (x *AssetLeafKeyResponse) GetAssetKeys() []*AssetKey { @@ -1079,7 +1181,7 @@ type AssetLeaf struct { func (x *AssetLeaf) Reset() { *x = AssetLeaf{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[12] + mi := &file_universerpc_universe_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1092,7 +1194,7 @@ func (x *AssetLeaf) String() string { func (*AssetLeaf) ProtoMessage() {} func (x *AssetLeaf) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[12] + mi := &file_universerpc_universe_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1105,7 +1207,7 @@ func (x *AssetLeaf) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetLeaf.ProtoReflect.Descriptor instead. func (*AssetLeaf) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{12} + return file_universerpc_universe_proto_rawDescGZIP(), []int{13} } func (x *AssetLeaf) GetAsset() *taprpc.Asset { @@ -1134,7 +1236,7 @@ type AssetLeafResponse struct { func (x *AssetLeafResponse) Reset() { *x = AssetLeafResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[13] + mi := &file_universerpc_universe_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1147,7 +1249,7 @@ func (x *AssetLeafResponse) String() string { func (*AssetLeafResponse) ProtoMessage() {} func (x *AssetLeafResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[13] + mi := &file_universerpc_universe_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1160,7 +1262,7 @@ func (x *AssetLeafResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetLeafResponse.ProtoReflect.Descriptor instead. func (*AssetLeafResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{13} + return file_universerpc_universe_proto_rawDescGZIP(), []int{14} } func (x *AssetLeafResponse) GetLeaves() []*AssetLeaf { @@ -1184,7 +1286,7 @@ type UniverseKey struct { func (x *UniverseKey) Reset() { *x = UniverseKey{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[14] + mi := &file_universerpc_universe_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1197,7 +1299,7 @@ func (x *UniverseKey) String() string { func (*UniverseKey) ProtoMessage() {} func (x *UniverseKey) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[14] + mi := &file_universerpc_universe_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1210,7 +1312,7 @@ func (x *UniverseKey) ProtoReflect() protoreflect.Message { // Deprecated: Use UniverseKey.ProtoReflect.Descriptor instead. func (*UniverseKey) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{14} + return file_universerpc_universe_proto_rawDescGZIP(), []int{15} } func (x *UniverseKey) GetId() *ID { @@ -1252,7 +1354,7 @@ type AssetProofResponse struct { func (x *AssetProofResponse) Reset() { *x = AssetProofResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[15] + mi := &file_universerpc_universe_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1265,7 +1367,7 @@ func (x *AssetProofResponse) String() string { func (*AssetProofResponse) ProtoMessage() {} func (x *AssetProofResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[15] + mi := &file_universerpc_universe_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1278,7 +1380,7 @@ func (x *AssetProofResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetProofResponse.ProtoReflect.Descriptor instead. func (*AssetProofResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{15} + return file_universerpc_universe_proto_rawDescGZIP(), []int{16} } func (x *AssetProofResponse) GetReq() *UniverseKey { @@ -1337,7 +1439,7 @@ type AssetProof struct { func (x *AssetProof) Reset() { *x = AssetProof{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[16] + mi := &file_universerpc_universe_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1350,7 +1452,7 @@ func (x *AssetProof) String() string { func (*AssetProof) ProtoMessage() {} func (x *AssetProof) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[16] + mi := &file_universerpc_universe_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1363,7 +1465,7 @@ func (x *AssetProof) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetProof.ProtoReflect.Descriptor instead. func (*AssetProof) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{16} + return file_universerpc_universe_proto_rawDescGZIP(), []int{17} } func (x *AssetProof) GetKey() *UniverseKey { @@ -1389,7 +1491,7 @@ type InfoRequest struct { func (x *InfoRequest) Reset() { *x = InfoRequest{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[17] + mi := &file_universerpc_universe_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1402,7 +1504,7 @@ func (x *InfoRequest) String() string { func (*InfoRequest) ProtoMessage() {} func (x *InfoRequest) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[17] + mi := &file_universerpc_universe_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1415,7 +1517,7 @@ func (x *InfoRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use InfoRequest.ProtoReflect.Descriptor instead. func (*InfoRequest) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{17} + return file_universerpc_universe_proto_rawDescGZIP(), []int{18} } type InfoResponse struct { @@ -1434,7 +1536,7 @@ type InfoResponse struct { func (x *InfoResponse) Reset() { *x = InfoResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[18] + mi := &file_universerpc_universe_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1447,7 +1549,7 @@ func (x *InfoResponse) String() string { func (*InfoResponse) ProtoMessage() {} func (x *InfoResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[18] + mi := &file_universerpc_universe_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1460,7 +1562,7 @@ func (x *InfoResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use InfoResponse.ProtoReflect.Descriptor instead. func (*InfoResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{18} + return file_universerpc_universe_proto_rawDescGZIP(), []int{19} } func (x *InfoResponse) GetRuntimeId() int64 { @@ -1488,7 +1590,7 @@ type SyncTarget struct { func (x *SyncTarget) Reset() { *x = SyncTarget{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[19] + mi := &file_universerpc_universe_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1501,7 +1603,7 @@ func (x *SyncTarget) String() string { func (*SyncTarget) ProtoMessage() {} func (x *SyncTarget) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[19] + mi := &file_universerpc_universe_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1514,7 +1616,7 @@ func (x *SyncTarget) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncTarget.ProtoReflect.Descriptor instead. func (*SyncTarget) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{19} + return file_universerpc_universe_proto_rawDescGZIP(), []int{20} } func (x *SyncTarget) GetId() *ID { @@ -1542,7 +1644,7 @@ type SyncRequest struct { func (x *SyncRequest) Reset() { *x = SyncRequest{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[20] + mi := &file_universerpc_universe_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1555,7 +1657,7 @@ func (x *SyncRequest) String() string { func (*SyncRequest) ProtoMessage() {} func (x *SyncRequest) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[20] + mi := &file_universerpc_universe_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1568,7 +1670,7 @@ func (x *SyncRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncRequest.ProtoReflect.Descriptor instead. func (*SyncRequest) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{20} + return file_universerpc_universe_proto_rawDescGZIP(), []int{21} } func (x *SyncRequest) GetUniverseHost() string { @@ -1608,7 +1710,7 @@ type SyncedUniverse struct { func (x *SyncedUniverse) Reset() { *x = SyncedUniverse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[21] + mi := &file_universerpc_universe_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1621,7 +1723,7 @@ func (x *SyncedUniverse) String() string { func (*SyncedUniverse) ProtoMessage() {} func (x *SyncedUniverse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[21] + mi := &file_universerpc_universe_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1634,7 +1736,7 @@ func (x *SyncedUniverse) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncedUniverse.ProtoReflect.Descriptor instead. func (*SyncedUniverse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{21} + return file_universerpc_universe_proto_rawDescGZIP(), []int{22} } func (x *SyncedUniverse) GetOldAssetRoot() *UniverseRoot { @@ -1667,7 +1769,7 @@ type StatsRequest struct { func (x *StatsRequest) Reset() { *x = StatsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[22] + mi := &file_universerpc_universe_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1680,7 +1782,7 @@ func (x *StatsRequest) String() string { func (*StatsRequest) ProtoMessage() {} func (x *StatsRequest) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[22] + mi := &file_universerpc_universe_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1693,7 +1795,7 @@ func (x *StatsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use StatsRequest.ProtoReflect.Descriptor instead. func (*StatsRequest) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{22} + return file_universerpc_universe_proto_rawDescGZIP(), []int{23} } type SyncResponse struct { @@ -1708,7 +1810,7 @@ type SyncResponse struct { func (x *SyncResponse) Reset() { *x = SyncResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[23] + mi := &file_universerpc_universe_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1721,7 +1823,7 @@ func (x *SyncResponse) String() string { func (*SyncResponse) ProtoMessage() {} func (x *SyncResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[23] + mi := &file_universerpc_universe_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1734,7 +1836,7 @@ func (x *SyncResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SyncResponse.ProtoReflect.Descriptor instead. func (*SyncResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{23} + return file_universerpc_universe_proto_rawDescGZIP(), []int{24} } func (x *SyncResponse) GetSyncedUniverses() []*SyncedUniverse { @@ -1756,7 +1858,7 @@ type UniverseFederationServer struct { func (x *UniverseFederationServer) Reset() { *x = UniverseFederationServer{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[24] + mi := &file_universerpc_universe_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1769,7 +1871,7 @@ func (x *UniverseFederationServer) String() string { func (*UniverseFederationServer) ProtoMessage() {} func (x *UniverseFederationServer) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[24] + mi := &file_universerpc_universe_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1782,7 +1884,7 @@ func (x *UniverseFederationServer) ProtoReflect() protoreflect.Message { // Deprecated: Use UniverseFederationServer.ProtoReflect.Descriptor instead. func (*UniverseFederationServer) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{24} + return file_universerpc_universe_proto_rawDescGZIP(), []int{25} } func (x *UniverseFederationServer) GetHost() string { @@ -1808,7 +1910,7 @@ type ListFederationServersRequest struct { func (x *ListFederationServersRequest) Reset() { *x = ListFederationServersRequest{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[25] + mi := &file_universerpc_universe_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1821,7 +1923,7 @@ func (x *ListFederationServersRequest) String() string { func (*ListFederationServersRequest) ProtoMessage() {} func (x *ListFederationServersRequest) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[25] + mi := &file_universerpc_universe_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1834,7 +1936,7 @@ func (x *ListFederationServersRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFederationServersRequest.ProtoReflect.Descriptor instead. func (*ListFederationServersRequest) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{25} + return file_universerpc_universe_proto_rawDescGZIP(), []int{26} } type ListFederationServersResponse struct { @@ -1848,7 +1950,7 @@ type ListFederationServersResponse struct { func (x *ListFederationServersResponse) Reset() { *x = ListFederationServersResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[26] + mi := &file_universerpc_universe_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1861,7 +1963,7 @@ func (x *ListFederationServersResponse) String() string { func (*ListFederationServersResponse) ProtoMessage() {} func (x *ListFederationServersResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[26] + mi := &file_universerpc_universe_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1874,7 +1976,7 @@ func (x *ListFederationServersResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ListFederationServersResponse.ProtoReflect.Descriptor instead. func (*ListFederationServersResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{26} + return file_universerpc_universe_proto_rawDescGZIP(), []int{27} } func (x *ListFederationServersResponse) GetServers() []*UniverseFederationServer { @@ -1895,7 +1997,7 @@ type AddFederationServerRequest struct { func (x *AddFederationServerRequest) Reset() { *x = AddFederationServerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[27] + mi := &file_universerpc_universe_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1908,7 +2010,7 @@ func (x *AddFederationServerRequest) String() string { func (*AddFederationServerRequest) ProtoMessage() {} func (x *AddFederationServerRequest) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[27] + mi := &file_universerpc_universe_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1921,7 +2023,7 @@ func (x *AddFederationServerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use AddFederationServerRequest.ProtoReflect.Descriptor instead. func (*AddFederationServerRequest) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{27} + return file_universerpc_universe_proto_rawDescGZIP(), []int{28} } func (x *AddFederationServerRequest) GetServers() []*UniverseFederationServer { @@ -1940,7 +2042,7 @@ type AddFederationServerResponse struct { func (x *AddFederationServerResponse) Reset() { *x = AddFederationServerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[28] + mi := &file_universerpc_universe_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1953,7 +2055,7 @@ func (x *AddFederationServerResponse) String() string { func (*AddFederationServerResponse) ProtoMessage() {} func (x *AddFederationServerResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[28] + mi := &file_universerpc_universe_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1966,7 +2068,7 @@ func (x *AddFederationServerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use AddFederationServerResponse.ProtoReflect.Descriptor instead. func (*AddFederationServerResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{28} + return file_universerpc_universe_proto_rawDescGZIP(), []int{29} } type DeleteFederationServerRequest struct { @@ -1980,7 +2082,7 @@ type DeleteFederationServerRequest struct { func (x *DeleteFederationServerRequest) Reset() { *x = DeleteFederationServerRequest{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[29] + mi := &file_universerpc_universe_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1993,7 +2095,7 @@ func (x *DeleteFederationServerRequest) String() string { func (*DeleteFederationServerRequest) ProtoMessage() {} func (x *DeleteFederationServerRequest) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[29] + mi := &file_universerpc_universe_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2006,7 +2108,7 @@ func (x *DeleteFederationServerRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteFederationServerRequest.ProtoReflect.Descriptor instead. func (*DeleteFederationServerRequest) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{29} + return file_universerpc_universe_proto_rawDescGZIP(), []int{30} } func (x *DeleteFederationServerRequest) GetServers() []*UniverseFederationServer { @@ -2025,7 +2127,7 @@ type DeleteFederationServerResponse struct { func (x *DeleteFederationServerResponse) Reset() { *x = DeleteFederationServerResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[30] + mi := &file_universerpc_universe_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2038,7 +2140,7 @@ func (x *DeleteFederationServerResponse) String() string { func (*DeleteFederationServerResponse) ProtoMessage() {} func (x *DeleteFederationServerResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[30] + mi := &file_universerpc_universe_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2051,7 +2153,7 @@ func (x *DeleteFederationServerResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use DeleteFederationServerResponse.ProtoReflect.Descriptor instead. func (*DeleteFederationServerResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{30} + return file_universerpc_universe_proto_rawDescGZIP(), []int{31} } type StatsResponse struct { @@ -2068,7 +2170,7 @@ type StatsResponse struct { func (x *StatsResponse) Reset() { *x = StatsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[31] + mi := &file_universerpc_universe_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2081,7 +2183,7 @@ func (x *StatsResponse) String() string { func (*StatsResponse) ProtoMessage() {} func (x *StatsResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[31] + mi := &file_universerpc_universe_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2094,7 +2196,7 @@ func (x *StatsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use StatsResponse.ProtoReflect.Descriptor instead. func (*StatsResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{31} + return file_universerpc_universe_proto_rawDescGZIP(), []int{32} } func (x *StatsResponse) GetNumTotalAssets() int64 { @@ -2142,7 +2244,7 @@ type AssetStatsQuery struct { func (x *AssetStatsQuery) Reset() { *x = AssetStatsQuery{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[32] + mi := &file_universerpc_universe_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2155,7 +2257,7 @@ func (x *AssetStatsQuery) String() string { func (*AssetStatsQuery) ProtoMessage() {} func (x *AssetStatsQuery) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[32] + mi := &file_universerpc_universe_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2168,7 +2270,7 @@ func (x *AssetStatsQuery) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetStatsQuery.ProtoReflect.Descriptor instead. func (*AssetStatsQuery) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{32} + return file_universerpc_universe_proto_rawDescGZIP(), []int{33} } func (x *AssetStatsQuery) GetAssetNameFilter() string { @@ -2248,7 +2350,7 @@ type AssetStatsSnapshot struct { func (x *AssetStatsSnapshot) Reset() { *x = AssetStatsSnapshot{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[33] + mi := &file_universerpc_universe_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2261,7 +2363,7 @@ func (x *AssetStatsSnapshot) String() string { func (*AssetStatsSnapshot) ProtoMessage() {} func (x *AssetStatsSnapshot) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[33] + mi := &file_universerpc_universe_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2274,7 +2376,7 @@ func (x *AssetStatsSnapshot) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetStatsSnapshot.ProtoReflect.Descriptor instead. func (*AssetStatsSnapshot) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{33} + return file_universerpc_universe_proto_rawDescGZIP(), []int{34} } func (x *AssetStatsSnapshot) GetGroupKey() []byte { @@ -2336,7 +2438,7 @@ type AssetStatsAsset struct { func (x *AssetStatsAsset) Reset() { *x = AssetStatsAsset{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[34] + mi := &file_universerpc_universe_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2349,7 +2451,7 @@ func (x *AssetStatsAsset) String() string { func (*AssetStatsAsset) ProtoMessage() {} func (x *AssetStatsAsset) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[34] + mi := &file_universerpc_universe_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2362,7 +2464,7 @@ func (x *AssetStatsAsset) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetStatsAsset.ProtoReflect.Descriptor instead. func (*AssetStatsAsset) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{34} + return file_universerpc_universe_proto_rawDescGZIP(), []int{35} } func (x *AssetStatsAsset) GetAssetId() []byte { @@ -2425,7 +2527,7 @@ type UniverseAssetStats struct { func (x *UniverseAssetStats) Reset() { *x = UniverseAssetStats{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[35] + mi := &file_universerpc_universe_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2438,7 +2540,7 @@ func (x *UniverseAssetStats) String() string { func (*UniverseAssetStats) ProtoMessage() {} func (x *UniverseAssetStats) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[35] + mi := &file_universerpc_universe_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2451,7 +2553,7 @@ func (x *UniverseAssetStats) ProtoReflect() protoreflect.Message { // Deprecated: Use UniverseAssetStats.ProtoReflect.Descriptor instead. func (*UniverseAssetStats) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{35} + return file_universerpc_universe_proto_rawDescGZIP(), []int{36} } func (x *UniverseAssetStats) GetAssetStats() []*AssetStatsSnapshot { @@ -2473,7 +2575,7 @@ type QueryEventsRequest struct { func (x *QueryEventsRequest) Reset() { *x = QueryEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[36] + mi := &file_universerpc_universe_proto_msgTypes[37] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2486,7 +2588,7 @@ func (x *QueryEventsRequest) String() string { func (*QueryEventsRequest) ProtoMessage() {} func (x *QueryEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[36] + mi := &file_universerpc_universe_proto_msgTypes[37] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2499,7 +2601,7 @@ func (x *QueryEventsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryEventsRequest.ProtoReflect.Descriptor instead. func (*QueryEventsRequest) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{36} + return file_universerpc_universe_proto_rawDescGZIP(), []int{37} } func (x *QueryEventsRequest) GetStartTimestamp() int64 { @@ -2527,7 +2629,7 @@ type QueryEventsResponse struct { func (x *QueryEventsResponse) Reset() { *x = QueryEventsResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[37] + mi := &file_universerpc_universe_proto_msgTypes[38] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2540,7 +2642,7 @@ func (x *QueryEventsResponse) String() string { func (*QueryEventsResponse) ProtoMessage() {} func (x *QueryEventsResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[37] + mi := &file_universerpc_universe_proto_msgTypes[38] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2553,7 +2655,7 @@ func (x *QueryEventsResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryEventsResponse.ProtoReflect.Descriptor instead. func (*QueryEventsResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{37} + return file_universerpc_universe_proto_rawDescGZIP(), []int{38} } func (x *QueryEventsResponse) GetEvents() []*GroupedUniverseEvents { @@ -2577,7 +2679,7 @@ type GroupedUniverseEvents struct { func (x *GroupedUniverseEvents) Reset() { *x = GroupedUniverseEvents{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[38] + mi := &file_universerpc_universe_proto_msgTypes[39] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2590,7 +2692,7 @@ func (x *GroupedUniverseEvents) String() string { func (*GroupedUniverseEvents) ProtoMessage() {} func (x *GroupedUniverseEvents) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[38] + mi := &file_universerpc_universe_proto_msgTypes[39] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2603,7 +2705,7 @@ func (x *GroupedUniverseEvents) ProtoReflect() protoreflect.Message { // Deprecated: Use GroupedUniverseEvents.ProtoReflect.Descriptor instead. func (*GroupedUniverseEvents) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{38} + return file_universerpc_universe_proto_rawDescGZIP(), []int{39} } func (x *GroupedUniverseEvents) GetDate() string { @@ -2639,7 +2741,7 @@ type SetFederationSyncConfigRequest struct { func (x *SetFederationSyncConfigRequest) Reset() { *x = SetFederationSyncConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[39] + mi := &file_universerpc_universe_proto_msgTypes[40] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2652,7 +2754,7 @@ func (x *SetFederationSyncConfigRequest) String() string { func (*SetFederationSyncConfigRequest) ProtoMessage() {} func (x *SetFederationSyncConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[39] + mi := &file_universerpc_universe_proto_msgTypes[40] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2665,7 +2767,7 @@ func (x *SetFederationSyncConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetFederationSyncConfigRequest.ProtoReflect.Descriptor instead. func (*SetFederationSyncConfigRequest) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{39} + return file_universerpc_universe_proto_rawDescGZIP(), []int{40} } func (x *SetFederationSyncConfigRequest) GetGlobalSyncConfigs() []*GlobalFederationSyncConfig { @@ -2691,7 +2793,7 @@ type SetFederationSyncConfigResponse struct { func (x *SetFederationSyncConfigResponse) Reset() { *x = SetFederationSyncConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[40] + mi := &file_universerpc_universe_proto_msgTypes[41] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2704,7 +2806,7 @@ func (x *SetFederationSyncConfigResponse) String() string { func (*SetFederationSyncConfigResponse) ProtoMessage() {} func (x *SetFederationSyncConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[40] + mi := &file_universerpc_universe_proto_msgTypes[41] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2717,7 +2819,7 @@ func (x *SetFederationSyncConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetFederationSyncConfigResponse.ProtoReflect.Descriptor instead. func (*SetFederationSyncConfigResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{40} + return file_universerpc_universe_proto_rawDescGZIP(), []int{41} } // GlobalFederationSyncConfig is a global proof type specific configuration @@ -2742,7 +2844,7 @@ type GlobalFederationSyncConfig struct { func (x *GlobalFederationSyncConfig) Reset() { *x = GlobalFederationSyncConfig{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[41] + mi := &file_universerpc_universe_proto_msgTypes[42] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2755,7 +2857,7 @@ func (x *GlobalFederationSyncConfig) String() string { func (*GlobalFederationSyncConfig) ProtoMessage() {} func (x *GlobalFederationSyncConfig) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[41] + mi := &file_universerpc_universe_proto_msgTypes[42] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2768,7 +2870,7 @@ func (x *GlobalFederationSyncConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use GlobalFederationSyncConfig.ProtoReflect.Descriptor instead. func (*GlobalFederationSyncConfig) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{41} + return file_universerpc_universe_proto_rawDescGZIP(), []int{42} } func (x *GlobalFederationSyncConfig) GetProofType() ProofType { @@ -2814,7 +2916,7 @@ type AssetFederationSyncConfig struct { func (x *AssetFederationSyncConfig) Reset() { *x = AssetFederationSyncConfig{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[42] + mi := &file_universerpc_universe_proto_msgTypes[43] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2827,7 +2929,7 @@ func (x *AssetFederationSyncConfig) String() string { func (*AssetFederationSyncConfig) ProtoMessage() {} func (x *AssetFederationSyncConfig) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[42] + mi := &file_universerpc_universe_proto_msgTypes[43] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2840,7 +2942,7 @@ func (x *AssetFederationSyncConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use AssetFederationSyncConfig.ProtoReflect.Descriptor instead. func (*AssetFederationSyncConfig) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{42} + return file_universerpc_universe_proto_rawDescGZIP(), []int{43} } func (x *AssetFederationSyncConfig) GetId() *ID { @@ -2876,7 +2978,7 @@ type QueryFederationSyncConfigRequest struct { func (x *QueryFederationSyncConfigRequest) Reset() { *x = QueryFederationSyncConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[43] + mi := &file_universerpc_universe_proto_msgTypes[44] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2889,7 +2991,7 @@ func (x *QueryFederationSyncConfigRequest) String() string { func (*QueryFederationSyncConfigRequest) ProtoMessage() {} func (x *QueryFederationSyncConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[43] + mi := &file_universerpc_universe_proto_msgTypes[44] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2902,7 +3004,7 @@ func (x *QueryFederationSyncConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryFederationSyncConfigRequest.ProtoReflect.Descriptor instead. func (*QueryFederationSyncConfigRequest) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{43} + return file_universerpc_universe_proto_rawDescGZIP(), []int{44} } func (x *QueryFederationSyncConfigRequest) GetId() []*ID { @@ -2924,7 +3026,7 @@ type QueryFederationSyncConfigResponse struct { func (x *QueryFederationSyncConfigResponse) Reset() { *x = QueryFederationSyncConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_universerpc_universe_proto_msgTypes[44] + mi := &file_universerpc_universe_proto_msgTypes[45] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2937,7 +3039,7 @@ func (x *QueryFederationSyncConfigResponse) String() string { func (*QueryFederationSyncConfigResponse) ProtoMessage() {} func (x *QueryFederationSyncConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_universerpc_universe_proto_msgTypes[44] + mi := &file_universerpc_universe_proto_msgTypes[45] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2950,7 +3052,7 @@ func (x *QueryFederationSyncConfigResponse) ProtoReflect() protoreflect.Message // Deprecated: Use QueryFederationSyncConfigResponse.ProtoReflect.Descriptor instead. func (*QueryFederationSyncConfigResponse) Descriptor() ([]byte, []int) { - return file_universerpc_universe_proto_rawDescGZIP(), []int{44} + return file_universerpc_universe_proto_rawDescGZIP(), []int{45} } func (x *QueryFederationSyncConfigResponse) GetGlobalSyncConfigs() []*GlobalFederationSyncConfig { @@ -2973,487 +3075,504 @@ var file_universerpc_universe_proto_rawDesc = []byte{ 0x0a, 0x1a, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x0b, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x1a, 0x13, 0x74, 0x61, 0x70, 0x72, 0x6f, - 0x6f, 0x74, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0x3f, - 0x0a, 0x10, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, - 0x77, 0x69, 0x74, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x42, 0x79, 0x49, 0x64, 0x22, - 0x47, 0x0a, 0x0d, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x4e, 0x6f, 0x64, 0x65, - 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, - 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x53, 0x75, 0x6d, 0x22, 0xc7, 0x01, 0x0a, 0x02, 0x49, 0x44, 0x12, - 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, - 0x12, 0x1d, 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, - 0x24, 0x0a, 0x0d, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x74, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, - 0x65, 0x79, 0x53, 0x74, 0x72, 0x12, 0x35, 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x74, - 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x79, 0x70, - 0x65, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x79, 0x70, 0x65, 0x42, 0x04, 0x0a, 0x02, - 0x69, 0x64, 0x22, 0xae, 0x02, 0x0a, 0x0c, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, - 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x6f, 0x74, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xa7, + 0x01, 0x0a, 0x10, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x77, 0x69, 0x74, 0x68, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0f, 0x77, 0x69, 0x74, 0x68, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x42, 0x79, 0x49, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x38, + 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x53, 0x6f, 0x72, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x47, 0x0a, 0x0d, 0x4d, 0x65, 0x72, 0x6b, + 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x72, 0x6f, 0x6f, + 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x72, 0x6f, + 0x6f, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x19, 0x0a, 0x08, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x73, + 0x75, 0x6d, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x72, 0x6f, 0x6f, 0x74, 0x53, 0x75, + 0x6d, 0x22, 0xc7, 0x01, 0x0a, 0x02, 0x49, 0x44, 0x12, 0x1b, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x07, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x22, 0x0a, 0x0c, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, + 0x64, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x0a, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x53, 0x74, 0x72, 0x12, 0x1d, 0x0a, 0x09, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x00, 0x52, 0x08, + 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x24, 0x0a, 0x0d, 0x67, 0x72, 0x6f, 0x75, + 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, + 0x00, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x53, 0x74, 0x72, 0x12, 0x35, + 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, + 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, + 0x66, 0x54, 0x79, 0x70, 0x65, 0x42, 0x04, 0x0a, 0x02, 0x69, 0x64, 0x22, 0xae, 0x02, 0x0a, 0x0c, + 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1f, 0x0a, 0x02, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, + 0x0a, 0x6d, 0x73, 0x73, 0x6d, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x6d, + 0x73, 0x73, 0x6d, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5e, 0x0a, 0x13, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, + 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x2e, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x42, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, + 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x42, 0x79, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x1a, 0x43, 0x0a, 0x15, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x73, 0x42, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, + 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, + 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xca, 0x01, 0x0a, + 0x11, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x75, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, + 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x75, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x1a, 0x5b, 0x0a, 0x12, + 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x45, 0x6e, 0x74, + 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, + 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x05, + 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0x31, 0x0a, 0x0e, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x22, 0x93, 0x01, 0x0a, + 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x69, 0x73, 0x73, 0x75, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0c, 0x69, 0x73, 0x73, 0x75, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x6f, + 0x6f, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x72, + 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0c, 0x74, 0x72, 0x61, 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x6f, + 0x6f, 0x74, 0x22, 0x32, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x22, 0x14, 0x0a, 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x0a, 0x08, + 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x68, + 0x5f, 0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x68, 0x61, 0x73, 0x68, + 0x53, 0x74, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, 0x22, 0xba, 0x01, 0x0a, 0x08, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x06, 0x6f, 0x70, 0x5f, 0x73, 0x74, 0x72, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, 0x05, 0x6f, 0x70, 0x53, 0x74, 0x72, 0x12, + 0x27, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x75, 0x6e, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x48, 0x00, 0x52, 0x02, 0x6f, 0x70, 0x12, 0x2a, 0x0a, 0x10, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x0c, 0x48, 0x01, 0x52, 0x0e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x42, + 0x79, 0x74, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, + 0x65, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, + 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x53, 0x74, 0x72, 0x42, 0x0a, 0x0a, 0x08, + 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, 0x0c, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, + 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x9f, 0x01, 0x0a, 0x14, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x4c, 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, + 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, + 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x38, + 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x04, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x53, 0x6f, 0x72, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x64, + 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x4c, 0x0a, 0x14, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x4c, 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x34, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x09, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x57, 0x0a, 0x09, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, + 0x65, 0x61, 0x66, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, + 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x25, 0x0a, 0x0e, 0x69, 0x73, 0x73, 0x75, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, + 0x52, 0x0d, 0x69, 0x73, 0x73, 0x75, 0x61, 0x6e, 0x63, 0x65, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, + 0x43, 0x0a, 0x11, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x06, 0x6c, 0x65, + 0x61, 0x76, 0x65, 0x73, 0x22, 0x60, 0x0a, 0x0b, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, - 0x52, 0x02, 0x69, 0x64, 0x12, 0x39, 0x0a, 0x0a, 0x6d, 0x73, 0x73, 0x6d, 0x74, 0x5f, 0x72, 0x6f, - 0x6f, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x53, 0x75, 0x6d, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x09, 0x6d, 0x73, 0x73, 0x6d, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, - 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x5e, - 0x0a, 0x13, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x5f, 0x62, 0x79, 0x5f, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x05, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2f, 0x2e, 0x75, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x2e, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x42, 0x79, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x10, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x42, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x1a, 0x43, - 0x0a, 0x15, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x73, 0x42, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x49, 0x64, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, - 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, - 0x02, 0x38, 0x01, 0x22, 0xca, 0x01, 0x0a, 0x11, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x58, 0x0a, 0x0e, 0x75, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x31, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x45, - 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, - 0x6f, 0x74, 0x73, 0x1a, 0x5b, 0x0a, 0x12, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, - 0x6f, 0x6f, 0x74, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x2f, 0x0a, 0x05, 0x76, - 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, + 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x08, 0x6c, 0x65, 0x61, 0x66, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x07, 0x6c, + 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79, 0x22, 0xf4, 0x02, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, + 0x03, 0x72, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, - 0x22, 0x31, 0x0a, 0x0e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, - 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, - 0x02, 0x69, 0x64, 0x22, 0x93, 0x01, 0x0a, 0x11, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x6f, 0x6f, - 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x69, 0x73, 0x73, - 0x75, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, - 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0c, 0x69, 0x73, 0x73, - 0x75, 0x61, 0x6e, 0x63, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3e, 0x0a, 0x0d, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, + 0x65, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x72, 0x65, 0x71, 0x12, 0x3e, 0x0a, 0x0d, 0x75, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, - 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0c, 0x74, 0x72, 0x61, - 0x6e, 0x73, 0x66, 0x65, 0x72, 0x52, 0x6f, 0x6f, 0x74, 0x22, 0x32, 0x0a, 0x0f, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x1f, 0x0a, 0x02, - 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x22, 0x14, 0x0a, - 0x12, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x3b, 0x0a, 0x08, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x12, - 0x19, 0x0a, 0x08, 0x68, 0x61, 0x73, 0x68, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x07, 0x68, 0x61, 0x73, 0x68, 0x53, 0x74, 0x72, 0x12, 0x14, 0x0a, 0x05, 0x69, 0x6e, - 0x64, 0x65, 0x78, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x69, 0x6e, 0x64, 0x65, 0x78, - 0x22, 0xba, 0x01, 0x0a, 0x08, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, - 0x06, 0x6f, 0x70, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x48, 0x00, 0x52, - 0x05, 0x6f, 0x70, 0x53, 0x74, 0x72, 0x12, 0x27, 0x0a, 0x02, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, - 0x2e, 0x4f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x02, 0x6f, 0x70, 0x12, - 0x2a, 0x0a, 0x10, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x62, 0x79, - 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x48, 0x01, 0x52, 0x0e, 0x73, 0x63, 0x72, - 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x26, 0x0a, 0x0e, 0x73, - 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x5f, 0x73, 0x74, 0x72, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x09, 0x48, 0x01, 0x52, 0x0c, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x4b, 0x65, 0x79, - 0x53, 0x74, 0x72, 0x42, 0x0a, 0x0a, 0x08, 0x6f, 0x75, 0x74, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x42, - 0x0c, 0x0a, 0x0a, 0x73, 0x63, 0x72, 0x69, 0x70, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x22, 0x4c, 0x0a, - 0x14, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x34, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6b, - 0x65, 0x79, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x75, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4b, 0x65, 0x79, - 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4b, 0x65, 0x79, 0x73, 0x22, 0x57, 0x0a, 0x09, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x23, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0d, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x25, 0x0a, - 0x0e, 0x69, 0x73, 0x73, 0x75, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x69, 0x73, 0x73, 0x75, 0x61, 0x6e, 0x63, 0x65, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x43, 0x0a, 0x11, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, - 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2e, 0x0a, 0x06, 0x6c, 0x65, 0x61, - 0x76, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, - 0x66, 0x52, 0x06, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0x60, 0x0a, 0x0b, 0x55, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, - 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x30, 0x0a, 0x08, 0x6c, 0x65, 0x61, - 0x66, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x75, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4b, - 0x65, 0x79, 0x52, 0x07, 0x6c, 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79, 0x22, 0xf4, 0x02, 0x0a, 0x12, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x03, 0x72, 0x65, 0x71, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x72, 0x65, 0x71, 0x12, 0x3e, - 0x0a, 0x0d, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, - 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, - 0x52, 0x0c, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x38, - 0x0a, 0x18, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, - 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x16, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, - 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x35, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x75, - 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x4c, 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x12, - 0x43, 0x0a, 0x0f, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x6f, - 0x6f, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x53, 0x75, 0x6d, - 0x4e, 0x6f, 0x64, 0x65, 0x52, 0x0e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, - 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3c, 0x0a, 0x1a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, - 0x6f, 0x66, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x18, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, - 0x6f, 0x66, 0x22, 0x6f, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, - 0x12, 0x2a, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, - 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x4b, 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x0a, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, - 0x65, 0x61, 0x66, 0x22, 0x0d, 0x0a, 0x0b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x4c, 0x0a, 0x0c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, 0x64, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, - 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, - 0x22, 0x2d, 0x0a, 0x0a, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f, - 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x22, - 0xaa, 0x01, 0x0a, 0x0b, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, - 0x23, 0x0a, 0x0d, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, - 0x48, 0x6f, 0x73, 0x74, 0x12, 0x3a, 0x0a, 0x09, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x6f, 0x64, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x79, - 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, - 0x12, 0x3a, 0x0a, 0x0c, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, - 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, - 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xd4, 0x01, 0x0a, - 0x0e, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, - 0x3f, 0x0a, 0x0e, 0x6f, 0x6c, 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, - 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, - 0x6f, 0x74, 0x52, 0x0c, 0x6f, 0x6c, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, - 0x12, 0x3f, 0x0a, 0x0e, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, - 0x6f, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, - 0x6f, 0x6f, 0x74, 0x52, 0x0c, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, - 0x74, 0x12, 0x40, 0x0a, 0x10, 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, - 0x65, 0x61, 0x76, 0x65, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x75, 0x6e, + 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0c, 0x75, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x38, 0x0a, 0x18, 0x75, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x69, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, + 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x16, 0x75, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x49, 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x12, 0x35, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x65, 0x61, + 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x52, + 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x12, 0x43, 0x0a, 0x0f, 0x6d, 0x75, + 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, + 0x63, 0x2e, 0x4d, 0x65, 0x72, 0x6b, 0x6c, 0x65, 0x53, 0x75, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x52, + 0x0e, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x12, + 0x3c, 0x0a, 0x1a, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x69, 0x6e, + 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x18, 0x6d, 0x75, 0x6c, 0x74, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x49, + 0x6e, 0x63, 0x6c, 0x75, 0x73, 0x69, 0x6f, 0x6e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x22, 0x6f, 0x0a, + 0x0a, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x2a, 0x0a, 0x03, 0x6b, + 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x4b, + 0x65, 0x79, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x35, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, + 0x5f, 0x6c, 0x65, 0x61, 0x66, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, - 0x65, 0x61, 0x66, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, - 0x76, 0x65, 0x73, 0x22, 0x0e, 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x22, 0x56, 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x10, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x75, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, - 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, - 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, - 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x18, 0x55, - 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x4c, - 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x60, 0x0a, 0x1d, 0x4c, - 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x5d, 0x0a, - 0x1a, 0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x07, 0x73, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x75, - 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x1d, 0x0a, 0x1b, - 0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, - 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0x0a, 0x1d, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x07, - 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, - 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x20, 0x0a, - 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xb5, 0x01, 0x0a, 0x0d, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, - 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, - 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x47, - 0x72, 0x6f, 0x75, 0x70, 0x73, 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74, - 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, - 0x6e, 0x75, 0x6d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x73, 0x12, 0x28, 0x0a, - 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x54, 0x6f, 0x74, 0x61, - 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0xcd, 0x02, 0x0a, 0x0f, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, - 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, - 0x5f, 0x69, 0x64, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0d, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, - 0x48, 0x0a, 0x11, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x66, 0x69, - 0x6c, 0x74, 0x65, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x75, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, - 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, - 0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x6f, 0x72, - 0x74, 0x5f, 0x62, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x75, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x52, 0x06, 0x73, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x12, - 0x16, 0x0a, 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, - 0x06, 0x6f, 0x66, 0x66, 0x73, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, - 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x38, 0x0a, - 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, - 0x32, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, - 0x6f, 0x72, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x64, 0x69, - 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x8d, 0x02, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x08, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x67, - 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x3f, - 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x52, 0x0b, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, - 0x32, 0x0a, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, - 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, - 0x63, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, - 0x79, 0x6e, 0x63, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x72, - 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, - 0x6c, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x0f, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, - 0x73, 0x73, 0x65, 0x74, 0x49, 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, - 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, - 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x1d, - 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, - 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x11, 0x2e, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, - 0x25, 0x0a, 0x0e, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, - 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, - 0x48, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, - 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x10, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, - 0x61, 0x6d, 0x70, 0x22, 0x56, 0x0a, 0x12, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x61, 0x73, 0x73, - 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, - 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, - 0x0a, 0x61, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x62, 0x0a, 0x12, 0x51, - 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, - 0x74, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, - 0x64, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0c, 0x65, 0x6e, 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, - 0x51, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x22, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x73, 0x22, 0x76, 0x0a, 0x15, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x55, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, - 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, - 0x1f, 0x0a, 0x0b, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x65, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x65, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x1e, 0x53, - 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, - 0x13, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x75, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, - 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x11, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x54, 0x0a, 0x12, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, - 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, - 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x21, 0x0a, 0x1f, - 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, - 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, - 0xab, 0x01, 0x0a, 0x1a, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, - 0x0a, 0x0a, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, - 0x2e, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, - 0x66, 0x54, 0x79, 0x70, 0x65, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, - 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79, 0x6e, 0x63, 0x49, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, - 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, - 0x6c, 0x6f, 0x77, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x94, 0x01, - 0x0a, 0x19, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x02, 0x69, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x11, - 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x72, - 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79, - 0x6e, 0x63, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, - 0x77, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x78, - 0x70, 0x6f, 0x72, 0x74, 0x22, 0x43, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, + 0x65, 0x61, 0x66, 0x52, 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x22, 0x0d, + 0x0a, 0x0b, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x4c, 0x0a, + 0x0c, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1d, 0x0a, + 0x0a, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x09, 0x72, 0x75, 0x6e, 0x74, 0x69, 0x6d, 0x65, 0x49, 0x64, 0x12, 0x1d, 0x0a, 0x0a, + 0x6e, 0x75, 0x6d, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x09, 0x6e, 0x75, 0x6d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x22, 0x2d, 0x0a, 0x0a, 0x53, + 0x79, 0x6e, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x22, 0xaa, 0x01, 0x0a, 0x0b, 0x53, + 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x75, 0x6e, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x5f, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0c, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x48, 0x6f, 0x73, 0x74, 0x12, + 0x3a, 0x0a, 0x09, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1d, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, + 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, + 0x65, 0x52, 0x08, 0x73, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x3a, 0x0a, 0x0c, 0x73, + 0x79, 0x6e, 0x63, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x17, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x53, 0x79, 0x6e, 0x63, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x52, 0x0b, 0x73, 0x79, 0x6e, 0x63, + 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x73, 0x22, 0xd4, 0x01, 0x0a, 0x0e, 0x53, 0x79, 0x6e, 0x63, + 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x6f, 0x6c, + 0x64, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, + 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0c, 0x6f, + 0x6c, 0x64, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x3f, 0x0a, 0x0e, 0x6e, + 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x72, 0x6f, 0x6f, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, + 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x0c, + 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x40, 0x0a, 0x10, + 0x6e, 0x65, 0x77, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x6c, 0x65, 0x61, 0x76, 0x65, 0x73, + 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x52, 0x0e, + 0x6e, 0x65, 0x77, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x22, 0x0e, + 0x0a, 0x0c, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x56, + 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, + 0x0a, 0x10, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x5f, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x55, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x52, 0x0f, 0x73, 0x79, 0x6e, 0x63, 0x65, 0x64, 0x55, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x18, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x12, 0x12, 0x0a, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x68, 0x6f, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x02, 0x69, 0x64, 0x22, 0x1e, 0x0a, 0x1c, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x60, 0x0a, 0x1d, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3f, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x46, + 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x5d, 0x0a, 0x1a, 0x41, 0x64, 0x64, 0x46, + 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x46, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x07, + 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x1d, 0x0a, 0x1b, 0x41, 0x64, 0x64, 0x46, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x60, 0x0a, 0x1d, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3f, 0x0a, 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x25, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x46, + 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, + 0x07, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x22, 0x20, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xb5, 0x01, 0x0a, 0x0d, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x10, + 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x54, 0x6f, 0x74, 0x61, 0x6c, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x5f, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x73, + 0x12, 0x26, 0x0a, 0x0f, 0x6e, 0x75, 0x6d, 0x5f, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x79, + 0x6e, 0x63, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6e, 0x75, 0x6d, 0x54, 0x6f, + 0x74, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, 0x75, 0x6d, 0x5f, + 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, 0x04, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0e, 0x6e, 0x75, 0x6d, 0x54, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x73, 0x22, 0xcd, 0x02, 0x0a, 0x0f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x6e, 0x61, 0x6d, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x46, 0x69, 0x6c, 0x74, + 0x65, 0x72, 0x12, 0x26, 0x0a, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x69, 0x64, 0x5f, 0x66, + 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x49, 0x64, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x48, 0x0a, 0x11, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x5f, 0x66, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, + 0x74, 0x65, 0x72, 0x52, 0x0f, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, + 0x6c, 0x74, 0x65, 0x72, 0x12, 0x34, 0x0a, 0x07, 0x73, 0x6f, 0x72, 0x74, 0x5f, 0x62, 0x79, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, + 0x72, 0x74, 0x52, 0x06, 0x73, 0x6f, 0x72, 0x74, 0x42, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x6f, 0x66, + 0x66, 0x73, 0x65, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x06, 0x6f, 0x66, 0x66, 0x73, + 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x05, 0x6c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x38, 0x0a, 0x09, 0x64, 0x69, 0x72, 0x65, + 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x75, 0x6e, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x69, + 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x09, 0x64, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x22, 0x8d, 0x02, 0x0a, 0x12, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x4b, 0x65, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x5f, + 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x3f, 0x0a, 0x0c, 0x67, 0x72, 0x6f, + 0x75, 0x70, 0x5f, 0x61, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x0b, 0x67, + 0x72, 0x6f, 0x75, 0x70, 0x41, 0x6e, 0x63, 0x68, 0x6f, 0x72, 0x12, 0x32, 0x0a, 0x05, 0x61, 0x73, + 0x73, 0x65, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x05, 0x61, 0x73, 0x73, 0x65, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x73, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0a, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x73, 0x12, + 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x73, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x73, 0x22, 0x99, 0x02, 0x0a, 0x0f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, + 0x73, 0x41, 0x73, 0x73, 0x65, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, + 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x61, 0x73, 0x73, 0x65, 0x74, 0x49, + 0x64, 0x12, 0x23, 0x0a, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x70, 0x6f, 0x69, + 0x6e, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, + 0x73, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x6f, 0x74, 0x61, 0x6c, 0x5f, + 0x73, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x6f, + 0x74, 0x61, 0x6c, 0x53, 0x75, 0x70, 0x70, 0x6c, 0x79, 0x12, 0x1d, 0x0a, 0x0a, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x09, 0x61, + 0x73, 0x73, 0x65, 0x74, 0x4e, 0x61, 0x6d, 0x65, 0x12, 0x30, 0x0a, 0x0a, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x74, + 0x61, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, + 0x09, 0x61, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x25, 0x0a, 0x0e, 0x67, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x68, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x05, 0x52, 0x0d, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x48, 0x65, 0x69, 0x67, 0x68, + 0x74, 0x12, 0x2b, 0x0a, 0x11, 0x67, 0x65, 0x6e, 0x65, 0x73, 0x69, 0x73, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x10, 0x67, 0x65, + 0x6e, 0x65, 0x73, 0x69, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x56, + 0x0a, 0x12, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x40, 0x0a, 0x0b, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x74, + 0x61, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, + 0x74, 0x73, 0x53, 0x6e, 0x61, 0x70, 0x73, 0x68, 0x6f, 0x74, 0x52, 0x0a, 0x61, 0x73, 0x73, 0x65, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x22, 0x62, 0x0a, 0x12, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x27, 0x0a, 0x0f, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, + 0x73, 0x74, 0x61, 0x6d, 0x70, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x6e, 0x64, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x65, 0x6e, + 0x64, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x22, 0x51, 0x0a, 0x13, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x3a, 0x0a, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x22, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x06, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0x76, 0x0a, + 0x15, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x65, 0x64, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x74, 0x65, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x74, 0x65, 0x12, 0x1f, 0x0a, 0x0b, 0x73, 0x79, + 0x6e, 0x63, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0a, 0x73, 0x79, 0x6e, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x28, 0x0a, 0x10, 0x6e, + 0x65, 0x77, 0x5f, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6e, 0x65, 0x77, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x73, 0x22, 0xcf, 0x01, 0x0a, 0x1e, 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, - 0x70, 0x63, 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x22, 0xd2, 0x01, 0x0a, 0x21, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, - 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x57, 0x0a, 0x13, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x75, - 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, - 0x6c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x79, 0x6e, - 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x12, 0x54, 0x0a, 0x12, 0x61, 0x73, 0x73, 0x65, - 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x02, - 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x61, 0x73, - 0x73, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2a, 0x59, - 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x50, - 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x4f, 0x46, - 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x01, - 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, - 0x52, 0x41, 0x4e, 0x53, 0x46, 0x45, 0x52, 0x10, 0x02, 0x2a, 0x39, 0x0a, 0x10, 0x55, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, - 0x12, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x49, 0x53, 0x53, 0x55, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4f, - 0x4e, 0x4c, 0x59, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x46, 0x55, - 0x4c, 0x4c, 0x10, 0x01, 0x2a, 0xd1, 0x01, 0x0a, 0x0e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x53, 0x6f, 0x72, 0x74, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x4f, 0x52, 0x54, 0x5f, - 0x42, 0x59, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x52, - 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, - 0x01, 0x12, 0x14, 0x0a, 0x10, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x41, 0x53, 0x53, - 0x45, 0x54, 0x5f, 0x49, 0x44, 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x52, 0x54, 0x5f, - 0x42, 0x59, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x03, 0x12, - 0x17, 0x0a, 0x13, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, - 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x53, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x4f, 0x52, 0x54, - 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, - 0x10, 0x05, 0x12, 0x1a, 0x0a, 0x16, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x47, 0x45, - 0x4e, 0x45, 0x53, 0x49, 0x53, 0x5f, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x10, 0x06, 0x12, 0x18, - 0x0a, 0x14, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, - 0x53, 0x55, 0x50, 0x50, 0x4c, 0x59, 0x10, 0x07, 0x2a, 0x40, 0x0a, 0x0d, 0x53, 0x6f, 0x72, 0x74, - 0x44, 0x69, 0x72, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x52, - 0x54, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x53, 0x43, 0x10, - 0x00, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, - 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x53, 0x43, 0x10, 0x01, 0x2a, 0x5f, 0x0a, 0x0f, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x54, 0x79, 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x15, 0x0a, - 0x11, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x4e, 0x4f, - 0x4e, 0x45, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41, - 0x53, 0x53, 0x45, 0x54, 0x5f, 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x1c, 0x0a, - 0x18, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x43, 0x4f, - 0x4c, 0x4c, 0x45, 0x43, 0x54, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x32, 0xbd, 0x0b, 0x0a, 0x08, - 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x1d, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, - 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4e, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x73, 0x12, 0x1b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x1e, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, - 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, - 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x12, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6f, - 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x4c, 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79, 0x73, 0x12, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x1a, 0x21, 0x2e, 0x75, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, - 0x66, 0x4b, 0x65, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0b, - 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x75, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x1a, 0x1e, 0x2e, 0x75, - 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, - 0x4c, 0x65, 0x61, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0a, - 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x18, 0x2e, 0x75, 0x6e, 0x69, - 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x4b, 0x65, 0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x50, - 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x17, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, - 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x1a, 0x1f, 0x2e, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x57, 0x0a, 0x13, 0x67, 0x6c, 0x6f, 0x62, + 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x72, 0x70, 0x63, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x11, + 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x12, 0x54, 0x0a, 0x12, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x26, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, - 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, - 0x0a, 0x04, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, - 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x53, - 0x79, 0x6e, 0x63, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x75, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, - 0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x6e, 0x0a, 0x15, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, - 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, - 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x68, 0x0a, 0x13, 0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, - 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x27, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x28, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, - 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, - 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x16, 0x44, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, - 0x72, 0x76, 0x65, 0x72, 0x12, 0x2a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, - 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x2b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x44, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, - 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, - 0x0d, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x19, - 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, - 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, - 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x73, - 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, - 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, - 0x73, 0x51, 0x75, 0x65, 0x72, 0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x41, 0x73, 0x73, - 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x72, 0x79, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, - 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, - 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x53, 0x65, 0x74, - 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, - 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x2c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x61, 0x73, 0x73, 0x65, 0x74, 0x53, 0x79, 0x6e, 0x63, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x22, 0x21, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x46, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0xab, 0x01, 0x0a, 0x1a, 0x47, + 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x0a, 0x0a, 0x70, 0x72, 0x6f, + 0x6f, 0x66, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, + 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x70, 0x72, 0x6f, 0x6f, 0x66, 0x54, 0x79, 0x70, 0x65, + 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, + 0x6e, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, + 0x6f, 0x77, 0x53, 0x79, 0x6e, 0x63, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, + 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79, + 0x6e, 0x63, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, 0x94, 0x01, 0x0a, 0x19, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, + 0x2e, 0x49, 0x44, 0x52, 0x02, 0x69, 0x64, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, + 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x69, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x08, 0x52, 0x0f, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79, 0x6e, 0x63, 0x49, 0x6e, 0x73, + 0x65, 0x72, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x5f, 0x73, 0x79, 0x6e, + 0x63, 0x5f, 0x65, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0f, + 0x61, 0x6c, 0x6c, 0x6f, 0x77, 0x53, 0x79, 0x6e, 0x63, 0x45, 0x78, 0x70, 0x6f, 0x72, 0x74, 0x22, + 0x43, 0x0a, 0x20, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, + 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x1f, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, + 0x52, 0x02, 0x69, 0x64, 0x22, 0xd2, 0x01, 0x0a, 0x21, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, + 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x57, 0x0a, 0x13, 0x67, 0x6c, + 0x6f, 0x62, 0x61, 0x6c, 0x5f, 0x73, 0x79, 0x6e, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x27, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x46, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x11, 0x67, 0x6c, 0x6f, 0x62, 0x61, 0x6c, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x73, 0x12, 0x54, 0x0a, 0x12, 0x61, 0x73, 0x73, 0x65, 0x74, 0x5f, 0x73, 0x79, 0x6e, + 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x26, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, + 0x73, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, + 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x10, 0x61, 0x73, 0x73, 0x65, 0x74, 0x53, 0x79, + 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x73, 0x2a, 0x59, 0x0a, 0x09, 0x50, 0x72, 0x6f, + 0x6f, 0x66, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1a, 0x0a, 0x16, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, + 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, + 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45, + 0x5f, 0x49, 0x53, 0x53, 0x55, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x01, 0x12, 0x17, 0x0a, 0x13, 0x50, + 0x52, 0x4f, 0x4f, 0x46, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x54, 0x52, 0x41, 0x4e, 0x53, 0x46, + 0x45, 0x52, 0x10, 0x02, 0x2a, 0x39, 0x0a, 0x10, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x53, 0x79, 0x6e, 0x63, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x59, 0x4e, 0x43, + 0x5f, 0x49, 0x53, 0x53, 0x55, 0x41, 0x4e, 0x43, 0x45, 0x5f, 0x4f, 0x4e, 0x4c, 0x59, 0x10, 0x00, + 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x59, 0x4e, 0x43, 0x5f, 0x46, 0x55, 0x4c, 0x4c, 0x10, 0x01, 0x2a, + 0xd1, 0x01, 0x0a, 0x0e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, 0x53, 0x6f, + 0x72, 0x74, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x4e, 0x4f, + 0x4e, 0x45, 0x10, 0x00, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, + 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x4e, 0x41, 0x4d, 0x45, 0x10, 0x01, 0x12, 0x14, 0x0a, 0x10, + 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x49, 0x44, + 0x10, 0x02, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x41, 0x53, + 0x53, 0x45, 0x54, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x10, 0x03, 0x12, 0x17, 0x0a, 0x13, 0x53, 0x4f, + 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x59, 0x4e, 0x43, + 0x53, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x54, + 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x50, 0x52, 0x4f, 0x4f, 0x46, 0x53, 0x10, 0x05, 0x12, 0x1a, 0x0a, + 0x16, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x47, 0x45, 0x4e, 0x45, 0x53, 0x49, 0x53, + 0x5f, 0x48, 0x45, 0x49, 0x47, 0x48, 0x54, 0x10, 0x06, 0x12, 0x18, 0x0a, 0x14, 0x53, 0x4f, 0x52, + 0x54, 0x5f, 0x42, 0x59, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x53, 0x55, 0x50, 0x50, 0x4c, + 0x59, 0x10, 0x07, 0x2a, 0x40, 0x0a, 0x0d, 0x53, 0x6f, 0x72, 0x74, 0x44, 0x69, 0x72, 0x65, 0x63, + 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x44, 0x49, 0x52, + 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x41, 0x53, 0x43, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, + 0x53, 0x4f, 0x52, 0x54, 0x5f, 0x44, 0x49, 0x52, 0x45, 0x43, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x44, + 0x45, 0x53, 0x43, 0x10, 0x01, 0x2a, 0x5f, 0x0a, 0x0f, 0x41, 0x73, 0x73, 0x65, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x46, 0x69, 0x6c, 0x74, 0x65, 0x72, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x49, 0x4c, 0x54, + 0x45, 0x52, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, + 0x17, 0x0a, 0x13, 0x46, 0x49, 0x4c, 0x54, 0x45, 0x52, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, + 0x4e, 0x4f, 0x52, 0x4d, 0x41, 0x4c, 0x10, 0x01, 0x12, 0x1c, 0x0a, 0x18, 0x46, 0x49, 0x4c, 0x54, + 0x45, 0x52, 0x5f, 0x41, 0x53, 0x53, 0x45, 0x54, 0x5f, 0x43, 0x4f, 0x4c, 0x4c, 0x45, 0x43, 0x54, + 0x49, 0x42, 0x4c, 0x45, 0x10, 0x02, 0x32, 0xcf, 0x0b, 0x0a, 0x08, 0x55, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0a, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, + 0x73, 0x12, 0x1d, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, + 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x4e, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, + 0x6f, 0x74, 0x73, 0x12, 0x1b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, 0x6f, 0x6f, 0x74, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x1a, 0x1e, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x50, 0x0a, 0x0f, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x52, + 0x6f, 0x6f, 0x74, 0x12, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, + 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x51, 0x75, 0x65, 0x72, + 0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x52, 0x6f, 0x6f, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x55, 0x0a, 0x0d, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x4b, + 0x65, 0x79, 0x73, 0x12, 0x21, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x4b, 0x65, 0x79, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x21, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, 0x66, 0x4b, 0x65, + 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3e, 0x0a, 0x0b, 0x41, 0x73, 0x73, + 0x65, 0x74, 0x4c, 0x65, 0x61, 0x76, 0x65, 0x73, 0x12, 0x0f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x44, 0x1a, 0x1e, 0x2e, 0x75, 0x6e, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x4c, 0x65, 0x61, + 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0a, 0x51, 0x75, 0x65, + 0x72, 0x79, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x12, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, + 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x4b, 0x65, + 0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x47, 0x0a, 0x0b, 0x49, 0x6e, 0x73, 0x65, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x6f, + 0x66, 0x12, 0x17, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, 0x6f, 0x6f, 0x66, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, + 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x50, 0x72, + 0x6f, 0x6f, 0x66, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x3b, 0x0a, 0x04, 0x49, + 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, + 0x63, 0x2e, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, + 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x66, 0x6f, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x43, 0x0a, 0x0c, 0x53, 0x79, 0x6e, 0x63, + 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x12, 0x18, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x79, 0x6e, 0x63, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6e, 0x0a, + 0x15, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x12, 0x29, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x4c, 0x69, 0x73, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x68, 0x0a, + 0x13, 0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, + 0x72, 0x76, 0x65, 0x72, 0x12, 0x27, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, + 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, + 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x64, 0x64, 0x46, + 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x71, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, 0x65, + 0x72, 0x12, 0x2a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, + 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, + 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x65, 0x72, 0x76, + 0x65, 0x72, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x46, 0x0a, 0x0d, 0x55, 0x6e, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x19, 0x2e, 0x75, 0x6e, + 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, + 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x74, 0x61, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x50, 0x0a, 0x0f, 0x51, 0x75, 0x65, 0x72, 0x79, 0x41, 0x73, 0x73, 0x65, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x73, 0x12, 0x1c, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, + 0x72, 0x70, 0x63, 0x2e, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, 0x74, 0x61, 0x74, 0x73, 0x51, 0x75, + 0x65, 0x72, 0x79, 0x1a, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, + 0x63, 0x2e, 0x55, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x41, 0x73, 0x73, 0x65, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x73, 0x12, 0x50, 0x0a, 0x0b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, + 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x20, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, + 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x74, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x2b, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, - 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x7a, 0x0a, 0x19, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x2e, 0x75, - 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2c, + 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x75, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, - 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3c, 0x5a, 0x3a, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, - 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, - 0x61, 0x73, 0x73, 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2f, 0x75, 0x6e, - 0x69, 0x76, 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x7a, 0x0a, 0x19, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, + 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2d, 0x2e, 0x75, 0x6e, 0x69, 0x76, + 0x65, 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, + 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x75, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x46, 0x65, 0x64, 0x65, + 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x79, 0x6e, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x3c, 0x5a, 0x3a, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, + 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x6f, 0x6f, 0x74, 0x2d, 0x61, 0x73, 0x73, + 0x65, 0x74, 0x73, 0x2f, 0x74, 0x61, 0x70, 0x72, 0x70, 0x63, 0x2f, 0x75, 0x6e, 0x69, 0x76, 0x65, + 0x72, 0x73, 0x65, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -3469,7 +3588,7 @@ func file_universerpc_universe_proto_rawDescGZIP() []byte { } var file_universerpc_universe_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_universerpc_universe_proto_msgTypes = make([]protoimpl.MessageInfo, 47) +var file_universerpc_universe_proto_msgTypes = make([]protoimpl.MessageInfo, 48) var file_universerpc_universe_proto_goTypes = []interface{}{ (ProofType)(0), // 0: universerpc.ProofType (UniverseSyncMode)(0), // 1: universerpc.UniverseSyncMode @@ -3487,132 +3606,136 @@ var file_universerpc_universe_proto_goTypes = []interface{}{ (*DeleteRootResponse)(nil), // 13: universerpc.DeleteRootResponse (*Outpoint)(nil), // 14: universerpc.Outpoint (*AssetKey)(nil), // 15: universerpc.AssetKey - (*AssetLeafKeyResponse)(nil), // 16: universerpc.AssetLeafKeyResponse - (*AssetLeaf)(nil), // 17: universerpc.AssetLeaf - (*AssetLeafResponse)(nil), // 18: universerpc.AssetLeafResponse - (*UniverseKey)(nil), // 19: universerpc.UniverseKey - (*AssetProofResponse)(nil), // 20: universerpc.AssetProofResponse - (*AssetProof)(nil), // 21: universerpc.AssetProof - (*InfoRequest)(nil), // 22: universerpc.InfoRequest - (*InfoResponse)(nil), // 23: universerpc.InfoResponse - (*SyncTarget)(nil), // 24: universerpc.SyncTarget - (*SyncRequest)(nil), // 25: universerpc.SyncRequest - (*SyncedUniverse)(nil), // 26: universerpc.SyncedUniverse - (*StatsRequest)(nil), // 27: universerpc.StatsRequest - (*SyncResponse)(nil), // 28: universerpc.SyncResponse - (*UniverseFederationServer)(nil), // 29: universerpc.UniverseFederationServer - (*ListFederationServersRequest)(nil), // 30: universerpc.ListFederationServersRequest - (*ListFederationServersResponse)(nil), // 31: universerpc.ListFederationServersResponse - (*AddFederationServerRequest)(nil), // 32: universerpc.AddFederationServerRequest - (*AddFederationServerResponse)(nil), // 33: universerpc.AddFederationServerResponse - (*DeleteFederationServerRequest)(nil), // 34: universerpc.DeleteFederationServerRequest - (*DeleteFederationServerResponse)(nil), // 35: universerpc.DeleteFederationServerResponse - (*StatsResponse)(nil), // 36: universerpc.StatsResponse - (*AssetStatsQuery)(nil), // 37: universerpc.AssetStatsQuery - (*AssetStatsSnapshot)(nil), // 38: universerpc.AssetStatsSnapshot - (*AssetStatsAsset)(nil), // 39: universerpc.AssetStatsAsset - (*UniverseAssetStats)(nil), // 40: universerpc.UniverseAssetStats - (*QueryEventsRequest)(nil), // 41: universerpc.QueryEventsRequest - (*QueryEventsResponse)(nil), // 42: universerpc.QueryEventsResponse - (*GroupedUniverseEvents)(nil), // 43: universerpc.GroupedUniverseEvents - (*SetFederationSyncConfigRequest)(nil), // 44: universerpc.SetFederationSyncConfigRequest - (*SetFederationSyncConfigResponse)(nil), // 45: universerpc.SetFederationSyncConfigResponse - (*GlobalFederationSyncConfig)(nil), // 46: universerpc.GlobalFederationSyncConfig - (*AssetFederationSyncConfig)(nil), // 47: universerpc.AssetFederationSyncConfig - (*QueryFederationSyncConfigRequest)(nil), // 48: universerpc.QueryFederationSyncConfigRequest - (*QueryFederationSyncConfigResponse)(nil), // 49: universerpc.QueryFederationSyncConfigResponse - nil, // 50: universerpc.UniverseRoot.AmountsByAssetIdEntry - nil, // 51: universerpc.AssetRootResponse.UniverseRootsEntry - (*taprpc.Asset)(nil), // 52: taprpc.Asset - (taprpc.AssetType)(0), // 53: taprpc.AssetType + (*AssetLeafKeysRequest)(nil), // 16: universerpc.AssetLeafKeysRequest + (*AssetLeafKeyResponse)(nil), // 17: universerpc.AssetLeafKeyResponse + (*AssetLeaf)(nil), // 18: universerpc.AssetLeaf + (*AssetLeafResponse)(nil), // 19: universerpc.AssetLeafResponse + (*UniverseKey)(nil), // 20: universerpc.UniverseKey + (*AssetProofResponse)(nil), // 21: universerpc.AssetProofResponse + (*AssetProof)(nil), // 22: universerpc.AssetProof + (*InfoRequest)(nil), // 23: universerpc.InfoRequest + (*InfoResponse)(nil), // 24: universerpc.InfoResponse + (*SyncTarget)(nil), // 25: universerpc.SyncTarget + (*SyncRequest)(nil), // 26: universerpc.SyncRequest + (*SyncedUniverse)(nil), // 27: universerpc.SyncedUniverse + (*StatsRequest)(nil), // 28: universerpc.StatsRequest + (*SyncResponse)(nil), // 29: universerpc.SyncResponse + (*UniverseFederationServer)(nil), // 30: universerpc.UniverseFederationServer + (*ListFederationServersRequest)(nil), // 31: universerpc.ListFederationServersRequest + (*ListFederationServersResponse)(nil), // 32: universerpc.ListFederationServersResponse + (*AddFederationServerRequest)(nil), // 33: universerpc.AddFederationServerRequest + (*AddFederationServerResponse)(nil), // 34: universerpc.AddFederationServerResponse + (*DeleteFederationServerRequest)(nil), // 35: universerpc.DeleteFederationServerRequest + (*DeleteFederationServerResponse)(nil), // 36: universerpc.DeleteFederationServerResponse + (*StatsResponse)(nil), // 37: universerpc.StatsResponse + (*AssetStatsQuery)(nil), // 38: universerpc.AssetStatsQuery + (*AssetStatsSnapshot)(nil), // 39: universerpc.AssetStatsSnapshot + (*AssetStatsAsset)(nil), // 40: universerpc.AssetStatsAsset + (*UniverseAssetStats)(nil), // 41: universerpc.UniverseAssetStats + (*QueryEventsRequest)(nil), // 42: universerpc.QueryEventsRequest + (*QueryEventsResponse)(nil), // 43: universerpc.QueryEventsResponse + (*GroupedUniverseEvents)(nil), // 44: universerpc.GroupedUniverseEvents + (*SetFederationSyncConfigRequest)(nil), // 45: universerpc.SetFederationSyncConfigRequest + (*SetFederationSyncConfigResponse)(nil), // 46: universerpc.SetFederationSyncConfigResponse + (*GlobalFederationSyncConfig)(nil), // 47: universerpc.GlobalFederationSyncConfig + (*AssetFederationSyncConfig)(nil), // 48: universerpc.AssetFederationSyncConfig + (*QueryFederationSyncConfigRequest)(nil), // 49: universerpc.QueryFederationSyncConfigRequest + (*QueryFederationSyncConfigResponse)(nil), // 50: universerpc.QueryFederationSyncConfigResponse + nil, // 51: universerpc.UniverseRoot.AmountsByAssetIdEntry + nil, // 52: universerpc.AssetRootResponse.UniverseRootsEntry + (*taprpc.Asset)(nil), // 53: taprpc.Asset + (taprpc.AssetType)(0), // 54: taprpc.AssetType } var file_universerpc_universe_proto_depIdxs = []int32{ - 0, // 0: universerpc.ID.proof_type:type_name -> universerpc.ProofType - 7, // 1: universerpc.UniverseRoot.id:type_name -> universerpc.ID - 6, // 2: universerpc.UniverseRoot.mssmt_root:type_name -> universerpc.MerkleSumNode - 50, // 3: universerpc.UniverseRoot.amounts_by_asset_id:type_name -> universerpc.UniverseRoot.AmountsByAssetIdEntry - 51, // 4: universerpc.AssetRootResponse.universe_roots:type_name -> universerpc.AssetRootResponse.UniverseRootsEntry - 7, // 5: universerpc.AssetRootQuery.id:type_name -> universerpc.ID - 8, // 6: universerpc.QueryRootResponse.issuance_root:type_name -> universerpc.UniverseRoot - 8, // 7: universerpc.QueryRootResponse.transfer_root:type_name -> universerpc.UniverseRoot - 7, // 8: universerpc.DeleteRootQuery.id:type_name -> universerpc.ID - 14, // 9: universerpc.AssetKey.op:type_name -> universerpc.Outpoint - 15, // 10: universerpc.AssetLeafKeyResponse.asset_keys:type_name -> universerpc.AssetKey - 52, // 11: universerpc.AssetLeaf.asset:type_name -> taprpc.Asset - 17, // 12: universerpc.AssetLeafResponse.leaves:type_name -> universerpc.AssetLeaf - 7, // 13: universerpc.UniverseKey.id:type_name -> universerpc.ID - 15, // 14: universerpc.UniverseKey.leaf_key:type_name -> universerpc.AssetKey - 19, // 15: universerpc.AssetProofResponse.req:type_name -> universerpc.UniverseKey - 8, // 16: universerpc.AssetProofResponse.universe_root:type_name -> universerpc.UniverseRoot - 17, // 17: universerpc.AssetProofResponse.asset_leaf:type_name -> universerpc.AssetLeaf - 6, // 18: universerpc.AssetProofResponse.multiverse_root:type_name -> universerpc.MerkleSumNode - 19, // 19: universerpc.AssetProof.key:type_name -> universerpc.UniverseKey - 17, // 20: universerpc.AssetProof.asset_leaf:type_name -> universerpc.AssetLeaf - 7, // 21: universerpc.SyncTarget.id:type_name -> universerpc.ID - 1, // 22: universerpc.SyncRequest.sync_mode:type_name -> universerpc.UniverseSyncMode - 24, // 23: universerpc.SyncRequest.sync_targets:type_name -> universerpc.SyncTarget - 8, // 24: universerpc.SyncedUniverse.old_asset_root:type_name -> universerpc.UniverseRoot - 8, // 25: universerpc.SyncedUniverse.new_asset_root:type_name -> universerpc.UniverseRoot - 17, // 26: universerpc.SyncedUniverse.new_asset_leaves:type_name -> universerpc.AssetLeaf - 26, // 27: universerpc.SyncResponse.synced_universes:type_name -> universerpc.SyncedUniverse - 29, // 28: universerpc.ListFederationServersResponse.servers:type_name -> universerpc.UniverseFederationServer - 29, // 29: universerpc.AddFederationServerRequest.servers:type_name -> universerpc.UniverseFederationServer - 29, // 30: universerpc.DeleteFederationServerRequest.servers:type_name -> universerpc.UniverseFederationServer - 4, // 31: universerpc.AssetStatsQuery.asset_type_filter:type_name -> universerpc.AssetTypeFilter - 2, // 32: universerpc.AssetStatsQuery.sort_by:type_name -> universerpc.AssetQuerySort - 3, // 33: universerpc.AssetStatsQuery.direction:type_name -> universerpc.SortDirection - 39, // 34: universerpc.AssetStatsSnapshot.group_anchor:type_name -> universerpc.AssetStatsAsset - 39, // 35: universerpc.AssetStatsSnapshot.asset:type_name -> universerpc.AssetStatsAsset - 53, // 36: universerpc.AssetStatsAsset.asset_type:type_name -> taprpc.AssetType - 38, // 37: universerpc.UniverseAssetStats.asset_stats:type_name -> universerpc.AssetStatsSnapshot - 43, // 38: universerpc.QueryEventsResponse.events:type_name -> universerpc.GroupedUniverseEvents - 46, // 39: universerpc.SetFederationSyncConfigRequest.global_sync_configs:type_name -> universerpc.GlobalFederationSyncConfig - 47, // 40: universerpc.SetFederationSyncConfigRequest.asset_sync_configs:type_name -> universerpc.AssetFederationSyncConfig - 0, // 41: universerpc.GlobalFederationSyncConfig.proof_type:type_name -> universerpc.ProofType - 7, // 42: universerpc.AssetFederationSyncConfig.id:type_name -> universerpc.ID - 7, // 43: universerpc.QueryFederationSyncConfigRequest.id:type_name -> universerpc.ID - 46, // 44: universerpc.QueryFederationSyncConfigResponse.global_sync_configs:type_name -> universerpc.GlobalFederationSyncConfig - 47, // 45: universerpc.QueryFederationSyncConfigResponse.asset_sync_configs:type_name -> universerpc.AssetFederationSyncConfig - 8, // 46: universerpc.AssetRootResponse.UniverseRootsEntry.value:type_name -> universerpc.UniverseRoot - 5, // 47: universerpc.Universe.AssetRoots:input_type -> universerpc.AssetRootRequest - 10, // 48: universerpc.Universe.QueryAssetRoots:input_type -> universerpc.AssetRootQuery - 12, // 49: universerpc.Universe.DeleteAssetRoot:input_type -> universerpc.DeleteRootQuery - 7, // 50: universerpc.Universe.AssetLeafKeys:input_type -> universerpc.ID - 7, // 51: universerpc.Universe.AssetLeaves:input_type -> universerpc.ID - 19, // 52: universerpc.Universe.QueryProof:input_type -> universerpc.UniverseKey - 21, // 53: universerpc.Universe.InsertProof:input_type -> universerpc.AssetProof - 22, // 54: universerpc.Universe.Info:input_type -> universerpc.InfoRequest - 25, // 55: universerpc.Universe.SyncUniverse:input_type -> universerpc.SyncRequest - 30, // 56: universerpc.Universe.ListFederationServers:input_type -> universerpc.ListFederationServersRequest - 32, // 57: universerpc.Universe.AddFederationServer:input_type -> universerpc.AddFederationServerRequest - 34, // 58: universerpc.Universe.DeleteFederationServer:input_type -> universerpc.DeleteFederationServerRequest - 27, // 59: universerpc.Universe.UniverseStats:input_type -> universerpc.StatsRequest - 37, // 60: universerpc.Universe.QueryAssetStats:input_type -> universerpc.AssetStatsQuery - 41, // 61: universerpc.Universe.QueryEvents:input_type -> universerpc.QueryEventsRequest - 44, // 62: universerpc.Universe.SetFederationSyncConfig:input_type -> universerpc.SetFederationSyncConfigRequest - 48, // 63: universerpc.Universe.QueryFederationSyncConfig:input_type -> universerpc.QueryFederationSyncConfigRequest - 9, // 64: universerpc.Universe.AssetRoots:output_type -> universerpc.AssetRootResponse - 11, // 65: universerpc.Universe.QueryAssetRoots:output_type -> universerpc.QueryRootResponse - 13, // 66: universerpc.Universe.DeleteAssetRoot:output_type -> universerpc.DeleteRootResponse - 16, // 67: universerpc.Universe.AssetLeafKeys:output_type -> universerpc.AssetLeafKeyResponse - 18, // 68: universerpc.Universe.AssetLeaves:output_type -> universerpc.AssetLeafResponse - 20, // 69: universerpc.Universe.QueryProof:output_type -> universerpc.AssetProofResponse - 20, // 70: universerpc.Universe.InsertProof:output_type -> universerpc.AssetProofResponse - 23, // 71: universerpc.Universe.Info:output_type -> universerpc.InfoResponse - 28, // 72: universerpc.Universe.SyncUniverse:output_type -> universerpc.SyncResponse - 31, // 73: universerpc.Universe.ListFederationServers:output_type -> universerpc.ListFederationServersResponse - 33, // 74: universerpc.Universe.AddFederationServer:output_type -> universerpc.AddFederationServerResponse - 35, // 75: universerpc.Universe.DeleteFederationServer:output_type -> universerpc.DeleteFederationServerResponse - 36, // 76: universerpc.Universe.UniverseStats:output_type -> universerpc.StatsResponse - 40, // 77: universerpc.Universe.QueryAssetStats:output_type -> universerpc.UniverseAssetStats - 42, // 78: universerpc.Universe.QueryEvents:output_type -> universerpc.QueryEventsResponse - 45, // 79: universerpc.Universe.SetFederationSyncConfig:output_type -> universerpc.SetFederationSyncConfigResponse - 49, // 80: universerpc.Universe.QueryFederationSyncConfig:output_type -> universerpc.QueryFederationSyncConfigResponse - 64, // [64:81] is the sub-list for method output_type - 47, // [47:64] is the sub-list for method input_type - 47, // [47:47] is the sub-list for extension type_name - 47, // [47:47] is the sub-list for extension extendee - 0, // [0:47] is the sub-list for field type_name + 3, // 0: universerpc.AssetRootRequest.direction:type_name -> universerpc.SortDirection + 0, // 1: universerpc.ID.proof_type:type_name -> universerpc.ProofType + 7, // 2: universerpc.UniverseRoot.id:type_name -> universerpc.ID + 6, // 3: universerpc.UniverseRoot.mssmt_root:type_name -> universerpc.MerkleSumNode + 51, // 4: universerpc.UniverseRoot.amounts_by_asset_id:type_name -> universerpc.UniverseRoot.AmountsByAssetIdEntry + 52, // 5: universerpc.AssetRootResponse.universe_roots:type_name -> universerpc.AssetRootResponse.UniverseRootsEntry + 7, // 6: universerpc.AssetRootQuery.id:type_name -> universerpc.ID + 8, // 7: universerpc.QueryRootResponse.issuance_root:type_name -> universerpc.UniverseRoot + 8, // 8: universerpc.QueryRootResponse.transfer_root:type_name -> universerpc.UniverseRoot + 7, // 9: universerpc.DeleteRootQuery.id:type_name -> universerpc.ID + 14, // 10: universerpc.AssetKey.op:type_name -> universerpc.Outpoint + 7, // 11: universerpc.AssetLeafKeysRequest.id:type_name -> universerpc.ID + 3, // 12: universerpc.AssetLeafKeysRequest.direction:type_name -> universerpc.SortDirection + 15, // 13: universerpc.AssetLeafKeyResponse.asset_keys:type_name -> universerpc.AssetKey + 53, // 14: universerpc.AssetLeaf.asset:type_name -> taprpc.Asset + 18, // 15: universerpc.AssetLeafResponse.leaves:type_name -> universerpc.AssetLeaf + 7, // 16: universerpc.UniverseKey.id:type_name -> universerpc.ID + 15, // 17: universerpc.UniverseKey.leaf_key:type_name -> universerpc.AssetKey + 20, // 18: universerpc.AssetProofResponse.req:type_name -> universerpc.UniverseKey + 8, // 19: universerpc.AssetProofResponse.universe_root:type_name -> universerpc.UniverseRoot + 18, // 20: universerpc.AssetProofResponse.asset_leaf:type_name -> universerpc.AssetLeaf + 6, // 21: universerpc.AssetProofResponse.multiverse_root:type_name -> universerpc.MerkleSumNode + 20, // 22: universerpc.AssetProof.key:type_name -> universerpc.UniverseKey + 18, // 23: universerpc.AssetProof.asset_leaf:type_name -> universerpc.AssetLeaf + 7, // 24: universerpc.SyncTarget.id:type_name -> universerpc.ID + 1, // 25: universerpc.SyncRequest.sync_mode:type_name -> universerpc.UniverseSyncMode + 25, // 26: universerpc.SyncRequest.sync_targets:type_name -> universerpc.SyncTarget + 8, // 27: universerpc.SyncedUniverse.old_asset_root:type_name -> universerpc.UniverseRoot + 8, // 28: universerpc.SyncedUniverse.new_asset_root:type_name -> universerpc.UniverseRoot + 18, // 29: universerpc.SyncedUniverse.new_asset_leaves:type_name -> universerpc.AssetLeaf + 27, // 30: universerpc.SyncResponse.synced_universes:type_name -> universerpc.SyncedUniverse + 30, // 31: universerpc.ListFederationServersResponse.servers:type_name -> universerpc.UniverseFederationServer + 30, // 32: universerpc.AddFederationServerRequest.servers:type_name -> universerpc.UniverseFederationServer + 30, // 33: universerpc.DeleteFederationServerRequest.servers:type_name -> universerpc.UniverseFederationServer + 4, // 34: universerpc.AssetStatsQuery.asset_type_filter:type_name -> universerpc.AssetTypeFilter + 2, // 35: universerpc.AssetStatsQuery.sort_by:type_name -> universerpc.AssetQuerySort + 3, // 36: universerpc.AssetStatsQuery.direction:type_name -> universerpc.SortDirection + 40, // 37: universerpc.AssetStatsSnapshot.group_anchor:type_name -> universerpc.AssetStatsAsset + 40, // 38: universerpc.AssetStatsSnapshot.asset:type_name -> universerpc.AssetStatsAsset + 54, // 39: universerpc.AssetStatsAsset.asset_type:type_name -> taprpc.AssetType + 39, // 40: universerpc.UniverseAssetStats.asset_stats:type_name -> universerpc.AssetStatsSnapshot + 44, // 41: universerpc.QueryEventsResponse.events:type_name -> universerpc.GroupedUniverseEvents + 47, // 42: universerpc.SetFederationSyncConfigRequest.global_sync_configs:type_name -> universerpc.GlobalFederationSyncConfig + 48, // 43: universerpc.SetFederationSyncConfigRequest.asset_sync_configs:type_name -> universerpc.AssetFederationSyncConfig + 0, // 44: universerpc.GlobalFederationSyncConfig.proof_type:type_name -> universerpc.ProofType + 7, // 45: universerpc.AssetFederationSyncConfig.id:type_name -> universerpc.ID + 7, // 46: universerpc.QueryFederationSyncConfigRequest.id:type_name -> universerpc.ID + 47, // 47: universerpc.QueryFederationSyncConfigResponse.global_sync_configs:type_name -> universerpc.GlobalFederationSyncConfig + 48, // 48: universerpc.QueryFederationSyncConfigResponse.asset_sync_configs:type_name -> universerpc.AssetFederationSyncConfig + 8, // 49: universerpc.AssetRootResponse.UniverseRootsEntry.value:type_name -> universerpc.UniverseRoot + 5, // 50: universerpc.Universe.AssetRoots:input_type -> universerpc.AssetRootRequest + 10, // 51: universerpc.Universe.QueryAssetRoots:input_type -> universerpc.AssetRootQuery + 12, // 52: universerpc.Universe.DeleteAssetRoot:input_type -> universerpc.DeleteRootQuery + 16, // 53: universerpc.Universe.AssetLeafKeys:input_type -> universerpc.AssetLeafKeysRequest + 7, // 54: universerpc.Universe.AssetLeaves:input_type -> universerpc.ID + 20, // 55: universerpc.Universe.QueryProof:input_type -> universerpc.UniverseKey + 22, // 56: universerpc.Universe.InsertProof:input_type -> universerpc.AssetProof + 23, // 57: universerpc.Universe.Info:input_type -> universerpc.InfoRequest + 26, // 58: universerpc.Universe.SyncUniverse:input_type -> universerpc.SyncRequest + 31, // 59: universerpc.Universe.ListFederationServers:input_type -> universerpc.ListFederationServersRequest + 33, // 60: universerpc.Universe.AddFederationServer:input_type -> universerpc.AddFederationServerRequest + 35, // 61: universerpc.Universe.DeleteFederationServer:input_type -> universerpc.DeleteFederationServerRequest + 28, // 62: universerpc.Universe.UniverseStats:input_type -> universerpc.StatsRequest + 38, // 63: universerpc.Universe.QueryAssetStats:input_type -> universerpc.AssetStatsQuery + 42, // 64: universerpc.Universe.QueryEvents:input_type -> universerpc.QueryEventsRequest + 45, // 65: universerpc.Universe.SetFederationSyncConfig:input_type -> universerpc.SetFederationSyncConfigRequest + 49, // 66: universerpc.Universe.QueryFederationSyncConfig:input_type -> universerpc.QueryFederationSyncConfigRequest + 9, // 67: universerpc.Universe.AssetRoots:output_type -> universerpc.AssetRootResponse + 11, // 68: universerpc.Universe.QueryAssetRoots:output_type -> universerpc.QueryRootResponse + 13, // 69: universerpc.Universe.DeleteAssetRoot:output_type -> universerpc.DeleteRootResponse + 17, // 70: universerpc.Universe.AssetLeafKeys:output_type -> universerpc.AssetLeafKeyResponse + 19, // 71: universerpc.Universe.AssetLeaves:output_type -> universerpc.AssetLeafResponse + 21, // 72: universerpc.Universe.QueryProof:output_type -> universerpc.AssetProofResponse + 21, // 73: universerpc.Universe.InsertProof:output_type -> universerpc.AssetProofResponse + 24, // 74: universerpc.Universe.Info:output_type -> universerpc.InfoResponse + 29, // 75: universerpc.Universe.SyncUniverse:output_type -> universerpc.SyncResponse + 32, // 76: universerpc.Universe.ListFederationServers:output_type -> universerpc.ListFederationServersResponse + 34, // 77: universerpc.Universe.AddFederationServer:output_type -> universerpc.AddFederationServerResponse + 36, // 78: universerpc.Universe.DeleteFederationServer:output_type -> universerpc.DeleteFederationServerResponse + 37, // 79: universerpc.Universe.UniverseStats:output_type -> universerpc.StatsResponse + 41, // 80: universerpc.Universe.QueryAssetStats:output_type -> universerpc.UniverseAssetStats + 43, // 81: universerpc.Universe.QueryEvents:output_type -> universerpc.QueryEventsResponse + 46, // 82: universerpc.Universe.SetFederationSyncConfig:output_type -> universerpc.SetFederationSyncConfigResponse + 50, // 83: universerpc.Universe.QueryFederationSyncConfig:output_type -> universerpc.QueryFederationSyncConfigResponse + 67, // [67:84] is the sub-list for method output_type + 50, // [50:67] is the sub-list for method input_type + 50, // [50:50] is the sub-list for extension type_name + 50, // [50:50] is the sub-list for extension extendee + 0, // [0:50] is the sub-list for field type_name } func init() { file_universerpc_universe_proto_init() } @@ -3754,7 +3877,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssetLeafKeyResponse); i { + switch v := v.(*AssetLeafKeysRequest); i { case 0: return &v.state case 1: @@ -3766,7 +3889,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssetLeaf); i { + switch v := v.(*AssetLeafKeyResponse); i { case 0: return &v.state case 1: @@ -3778,7 +3901,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssetLeafResponse); i { + switch v := v.(*AssetLeaf); i { case 0: return &v.state case 1: @@ -3790,7 +3913,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UniverseKey); i { + switch v := v.(*AssetLeafResponse); i { case 0: return &v.state case 1: @@ -3802,7 +3925,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssetProofResponse); i { + switch v := v.(*UniverseKey); i { case 0: return &v.state case 1: @@ -3814,7 +3937,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssetProof); i { + switch v := v.(*AssetProofResponse); i { case 0: return &v.state case 1: @@ -3826,7 +3949,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InfoRequest); i { + switch v := v.(*AssetProof); i { case 0: return &v.state case 1: @@ -3838,7 +3961,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*InfoResponse); i { + switch v := v.(*InfoRequest); i { case 0: return &v.state case 1: @@ -3850,7 +3973,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncTarget); i { + switch v := v.(*InfoResponse); i { case 0: return &v.state case 1: @@ -3862,7 +3985,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncRequest); i { + switch v := v.(*SyncTarget); i { case 0: return &v.state case 1: @@ -3874,7 +3997,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncedUniverse); i { + switch v := v.(*SyncRequest); i { case 0: return &v.state case 1: @@ -3886,7 +4009,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatsRequest); i { + switch v := v.(*SyncedUniverse); i { case 0: return &v.state case 1: @@ -3898,7 +4021,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SyncResponse); i { + switch v := v.(*StatsRequest); i { case 0: return &v.state case 1: @@ -3910,7 +4033,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UniverseFederationServer); i { + switch v := v.(*SyncResponse); i { case 0: return &v.state case 1: @@ -3922,7 +4045,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFederationServersRequest); i { + switch v := v.(*UniverseFederationServer); i { case 0: return &v.state case 1: @@ -3934,7 +4057,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ListFederationServersResponse); i { + switch v := v.(*ListFederationServersRequest); i { case 0: return &v.state case 1: @@ -3946,7 +4069,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddFederationServerRequest); i { + switch v := v.(*ListFederationServersResponse); i { case 0: return &v.state case 1: @@ -3958,7 +4081,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AddFederationServerResponse); i { + switch v := v.(*AddFederationServerRequest); i { case 0: return &v.state case 1: @@ -3970,7 +4093,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteFederationServerRequest); i { + switch v := v.(*AddFederationServerResponse); i { case 0: return &v.state case 1: @@ -3982,7 +4105,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*DeleteFederationServerResponse); i { + switch v := v.(*DeleteFederationServerRequest); i { case 0: return &v.state case 1: @@ -3994,7 +4117,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*StatsResponse); i { + switch v := v.(*DeleteFederationServerResponse); i { case 0: return &v.state case 1: @@ -4006,7 +4129,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssetStatsQuery); i { + switch v := v.(*StatsResponse); i { case 0: return &v.state case 1: @@ -4018,7 +4141,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssetStatsSnapshot); i { + switch v := v.(*AssetStatsQuery); i { case 0: return &v.state case 1: @@ -4030,7 +4153,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssetStatsAsset); i { + switch v := v.(*AssetStatsSnapshot); i { case 0: return &v.state case 1: @@ -4042,7 +4165,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UniverseAssetStats); i { + switch v := v.(*AssetStatsAsset); i { case 0: return &v.state case 1: @@ -4054,7 +4177,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryEventsRequest); i { + switch v := v.(*UniverseAssetStats); i { case 0: return &v.state case 1: @@ -4066,7 +4189,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[37].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryEventsResponse); i { + switch v := v.(*QueryEventsRequest); i { case 0: return &v.state case 1: @@ -4078,7 +4201,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[38].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GroupedUniverseEvents); i { + switch v := v.(*QueryEventsResponse); i { case 0: return &v.state case 1: @@ -4090,7 +4213,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[39].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetFederationSyncConfigRequest); i { + switch v := v.(*GroupedUniverseEvents); i { case 0: return &v.state case 1: @@ -4102,7 +4225,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[40].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetFederationSyncConfigResponse); i { + switch v := v.(*SetFederationSyncConfigRequest); i { case 0: return &v.state case 1: @@ -4114,7 +4237,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[41].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GlobalFederationSyncConfig); i { + switch v := v.(*SetFederationSyncConfigResponse); i { case 0: return &v.state case 1: @@ -4126,7 +4249,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[42].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*AssetFederationSyncConfig); i { + switch v := v.(*GlobalFederationSyncConfig); i { case 0: return &v.state case 1: @@ -4138,7 +4261,7 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[43].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryFederationSyncConfigRequest); i { + switch v := v.(*AssetFederationSyncConfig); i { case 0: return &v.state case 1: @@ -4150,6 +4273,18 @@ func file_universerpc_universe_proto_init() { } } file_universerpc_universe_proto_msgTypes[44].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*QueryFederationSyncConfigRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_universerpc_universe_proto_msgTypes[45].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*QueryFederationSyncConfigResponse); i { case 0: return &v.state @@ -4180,7 +4315,7 @@ func file_universerpc_universe_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_universerpc_universe_proto_rawDesc, NumEnums: 5, - NumMessages: 47, + NumMessages: 48, NumExtensions: 0, NumServices: 1, }, diff --git a/taprpc/universerpc/universe.pb.gw.go b/taprpc/universerpc/universe.pb.gw.go index 77ee2f0df..3f41d1066 100644 --- a/taprpc/universerpc/universe.pb.gw.go +++ b/taprpc/universerpc/universe.pb.gw.go @@ -244,11 +244,11 @@ func local_request_Universe_DeleteAssetRoot_0(ctx context.Context, marshaler run } var ( - filter_Universe_AssetLeafKeys_0 = &utilities.DoubleArray{Encoding: map[string]int{"asset_id_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Universe_AssetLeafKeys_0 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "asset_id_str": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} ) func request_Universe_AssetLeafKeys_0(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ID + var protoReq AssetLeafKeysRequest var metadata runtime.ServerMetadata var ( @@ -258,19 +258,14 @@ func request_Universe_AssetLeafKeys_0(ctx context.Context, marshaler runtime.Mar _ = err ) - val, ok = pathParams["asset_id_str"] + val, ok = pathParams["id.asset_id_str"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "asset_id_str") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id.asset_id_str") } - if protoReq.Id == nil { - protoReq.Id = &ID_AssetIdStr{} - } else if _, ok := protoReq.Id.(*ID_AssetIdStr); !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "expect type: *ID_AssetIdStr, but: %t\n", protoReq.Id) - } - protoReq.Id.(*ID_AssetIdStr).AssetIdStr, err = runtime.String(val) + err = runtime.PopulateFieldFromPath(&protoReq, "id.asset_id_str", val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "asset_id_str", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id.asset_id_str", err) } if err := req.ParseForm(); err != nil { @@ -286,7 +281,7 @@ func request_Universe_AssetLeafKeys_0(ctx context.Context, marshaler runtime.Mar } func local_request_Universe_AssetLeafKeys_0(ctx context.Context, marshaler runtime.Marshaler, server UniverseServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ID + var protoReq AssetLeafKeysRequest var metadata runtime.ServerMetadata var ( @@ -296,19 +291,14 @@ func local_request_Universe_AssetLeafKeys_0(ctx context.Context, marshaler runti _ = err ) - val, ok = pathParams["asset_id_str"] + val, ok = pathParams["id.asset_id_str"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "asset_id_str") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id.asset_id_str") } - if protoReq.Id == nil { - protoReq.Id = &ID_AssetIdStr{} - } else if _, ok := protoReq.Id.(*ID_AssetIdStr); !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "expect type: *ID_AssetIdStr, but: %t\n", protoReq.Id) - } - protoReq.Id.(*ID_AssetIdStr).AssetIdStr, err = runtime.String(val) + err = runtime.PopulateFieldFromPath(&protoReq, "id.asset_id_str", val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "asset_id_str", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id.asset_id_str", err) } if err := req.ParseForm(); err != nil { @@ -324,11 +314,11 @@ func local_request_Universe_AssetLeafKeys_0(ctx context.Context, marshaler runti } var ( - filter_Universe_AssetLeafKeys_1 = &utilities.DoubleArray{Encoding: map[string]int{"group_key_str": 0}, Base: []int{1, 1, 0}, Check: []int{0, 1, 2}} + filter_Universe_AssetLeafKeys_1 = &utilities.DoubleArray{Encoding: map[string]int{"id": 0, "group_key_str": 1}, Base: []int{1, 1, 1, 0}, Check: []int{0, 1, 2, 3}} ) func request_Universe_AssetLeafKeys_1(ctx context.Context, marshaler runtime.Marshaler, client UniverseClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ID + var protoReq AssetLeafKeysRequest var metadata runtime.ServerMetadata var ( @@ -338,19 +328,14 @@ func request_Universe_AssetLeafKeys_1(ctx context.Context, marshaler runtime.Mar _ = err ) - val, ok = pathParams["group_key_str"] + val, ok = pathParams["id.group_key_str"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_key_str") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id.group_key_str") } - if protoReq.Id == nil { - protoReq.Id = &ID_GroupKeyStr{} - } else if _, ok := protoReq.Id.(*ID_GroupKeyStr); !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "expect type: *ID_GroupKeyStr, but: %t\n", protoReq.Id) - } - protoReq.Id.(*ID_GroupKeyStr).GroupKeyStr, err = runtime.String(val) + err = runtime.PopulateFieldFromPath(&protoReq, "id.group_key_str", val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_key_str", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id.group_key_str", err) } if err := req.ParseForm(); err != nil { @@ -366,7 +351,7 @@ func request_Universe_AssetLeafKeys_1(ctx context.Context, marshaler runtime.Mar } func local_request_Universe_AssetLeafKeys_1(ctx context.Context, marshaler runtime.Marshaler, server UniverseServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { - var protoReq ID + var protoReq AssetLeafKeysRequest var metadata runtime.ServerMetadata var ( @@ -376,19 +361,14 @@ func local_request_Universe_AssetLeafKeys_1(ctx context.Context, marshaler runti _ = err ) - val, ok = pathParams["group_key_str"] + val, ok = pathParams["id.group_key_str"] if !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "group_key_str") + return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "id.group_key_str") } - if protoReq.Id == nil { - protoReq.Id = &ID_GroupKeyStr{} - } else if _, ok := protoReq.Id.(*ID_GroupKeyStr); !ok { - return nil, metadata, status.Errorf(codes.InvalidArgument, "expect type: *ID_GroupKeyStr, but: %t\n", protoReq.Id) - } - protoReq.Id.(*ID_GroupKeyStr).GroupKeyStr, err = runtime.String(val) + err = runtime.PopulateFieldFromPath(&protoReq, "id.group_key_str", val) if err != nil { - return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "group_key_str", err) + return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "id.group_key_str", err) } if err := req.ParseForm(); err != nil { @@ -1483,7 +1463,7 @@ func RegisterUniverseHandlerServer(ctx context.Context, mux *runtime.ServeMux, s var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/universerpc.Universe/AssetLeafKeys", runtime.WithHTTPPathPattern("/v1/taproot-assets/universe/keys/asset-id/{asset_id_str}")) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/universerpc.Universe/AssetLeafKeys", runtime.WithHTTPPathPattern("/v1/taproot-assets/universe/keys/asset-id/{id.asset_id_str}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -1506,7 +1486,7 @@ func RegisterUniverseHandlerServer(ctx context.Context, mux *runtime.ServeMux, s var stream runtime.ServerTransportStream ctx = grpc.NewContextWithServerTransportStream(ctx, &stream) inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/universerpc.Universe/AssetLeafKeys", runtime.WithHTTPPathPattern("/v1/taproot-assets/universe/keys/group-key/{group_key_str}")) + rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req, "/universerpc.Universe/AssetLeafKeys", runtime.WithHTTPPathPattern("/v1/taproot-assets/universe/keys/group-key/{id.group_key_str}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -2016,7 +1996,7 @@ func RegisterUniverseHandlerClient(ctx context.Context, mux *runtime.ServeMux, c ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req, "/universerpc.Universe/AssetLeafKeys", runtime.WithHTTPPathPattern("/v1/taproot-assets/universe/keys/asset-id/{asset_id_str}")) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/universerpc.Universe/AssetLeafKeys", runtime.WithHTTPPathPattern("/v1/taproot-assets/universe/keys/asset-id/{id.asset_id_str}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -2036,7 +2016,7 @@ func RegisterUniverseHandlerClient(ctx context.Context, mux *runtime.ServeMux, c ctx, cancel := context.WithCancel(req.Context()) defer cancel() inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) - rctx, err := runtime.AnnotateContext(ctx, mux, req, "/universerpc.Universe/AssetLeafKeys", runtime.WithHTTPPathPattern("/v1/taproot-assets/universe/keys/group-key/{group_key_str}")) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/universerpc.Universe/AssetLeafKeys", runtime.WithHTTPPathPattern("/v1/taproot-assets/universe/keys/group-key/{id.group_key_str}")) if err != nil { runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) return @@ -2384,9 +2364,9 @@ var ( pattern_Universe_DeleteAssetRoot_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "taproot-assets", "universe", "delete"}, "")) - pattern_Universe_AssetLeafKeys_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v1", "taproot-assets", "universe", "keys", "asset-id", "asset_id_str"}, "")) + pattern_Universe_AssetLeafKeys_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v1", "taproot-assets", "universe", "keys", "asset-id", "id.asset_id_str"}, "")) - pattern_Universe_AssetLeafKeys_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v1", "taproot-assets", "universe", "keys", "group-key", "group_key_str"}, "")) + pattern_Universe_AssetLeafKeys_1 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v1", "taproot-assets", "universe", "keys", "group-key", "id.group_key_str"}, "")) pattern_Universe_AssetLeaves_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3, 2, 4, 1, 0, 4, 1, 5, 5}, []string{"v1", "taproot-assets", "universe", "leaves", "asset-id", "asset_id_str"}, "")) diff --git a/taprpc/universerpc/universe.pb.json.go b/taprpc/universerpc/universe.pb.json.go index 86ef5f693..fdf0442db 100644 --- a/taprpc/universerpc/universe.pb.json.go +++ b/taprpc/universerpc/universe.pb.json.go @@ -99,7 +99,7 @@ func RegisterUniverseJSONCallbacks(registry map[string]func(ctx context.Context, registry["universerpc.Universe.AssetLeafKeys"] = func(ctx context.Context, conn *grpc.ClientConn, reqJSON string, callback func(string, error)) { - req := &ID{} + req := &AssetLeafKeysRequest{} err := marshaler.Unmarshal([]byte(reqJSON), req) if err != nil { callback("", err) diff --git a/taprpc/universerpc/universe.proto b/taprpc/universerpc/universe.proto index c6f8b0471..05bf9a45f 100644 --- a/taprpc/universerpc/universe.proto +++ b/taprpc/universerpc/universe.proto @@ -33,7 +33,7 @@ service Universe { the asset within the Taproot Asset commitment for the given asset_id or group_key. */ - rpc AssetLeafKeys (ID) returns (AssetLeafKeyResponse); + rpc AssetLeafKeys (AssetLeafKeysRequest) returns (AssetLeafKeyResponse); /* tapcli: `universe leaves` AssetLeaves queries for the set of asset leaves (the values in the Universe @@ -147,6 +147,15 @@ message AssetRootRequest { // of grouped assets. bool with_amounts_by_id = 1; + // The offset for the page. + int32 offset = 2; + + // The length limit for the page. + int32 limit = 3; + + // The direction of the page. + SortDirection direction = 4; + // TODO(roasbeef): filter by asset ID, etc? } @@ -260,6 +269,20 @@ message AssetKey { } } +message AssetLeafKeysRequest { + // The ID of the asset to query for. + ID id = 1; + + // The offset for the page. + int32 offset = 2; + + // The length limit for the page. + int32 limit = 3; + + // The direction of the page. + SortDirection direction = 4; +} + message AssetLeafKeyResponse { // The set of asset leaf keys for the given asset ID or group key. repeated AssetKey asset_keys = 1; diff --git a/taprpc/universerpc/universe.swagger.json b/taprpc/universerpc/universe.swagger.json index 78077d911..222916c85 100644 --- a/taprpc/universerpc/universe.swagger.json +++ b/taprpc/universerpc/universe.swagger.json @@ -181,7 +181,7 @@ ] } }, - "/v1/taproot-assets/universe/keys/asset-id/{asset_id_str}": { + "/v1/taproot-assets/universe/keys/asset-id/{id.asset_id_str}": { "get": { "summary": "tapcli: `universe keys`\nAssetLeafKeys queries for the set of Universe keys associated with a given\nasset_id or group_key. Each key takes the form: (outpoint, script_key),\nwhere outpoint is an outpoint in the Bitcoin blockcahin that anchors a\nvalid Taproot Asset commitment, and script_key is the script_key of\nthe asset within the Taproot Asset commitment for the given asset_id or\ngroup_key.", "operationId": "Universe_AssetLeafKeys", @@ -201,14 +201,14 @@ }, "parameters": [ { - "name": "asset_id_str", + "name": "id.asset_id_str", "description": "The 32-byte asset ID encoded as a hex string (use this for REST).", "in": "path", "required": true, "type": "string" }, { - "name": "asset_id", + "name": "id.asset_id", "description": "The 32-byte asset ID specified as raw bytes (gRPC only).", "in": "query", "required": false, @@ -216,7 +216,7 @@ "format": "byte" }, { - "name": "group_key", + "name": "id.group_key", "description": "The 32-byte asset group key specified as raw bytes (gRPC only).", "in": "query", "required": false, @@ -224,14 +224,14 @@ "format": "byte" }, { - "name": "group_key_str", + "name": "id.group_key_str", "description": "The 32-byte asset group key encoded as hex string (use this for\nREST).", "in": "query", "required": false, "type": "string" }, { - "name": "proof_type", + "name": "id.proof_type", "in": "query", "required": false, "type": "string", @@ -241,6 +241,34 @@ "PROOF_TYPE_TRANSFER" ], "default": "PROOF_TYPE_UNSPECIFIED" + }, + { + "name": "offset", + "description": "The offset for the page.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "limit", + "description": "The length limit for the page.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "direction", + "description": "The direction of the page.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "SORT_DIRECTION_ASC", + "SORT_DIRECTION_DESC" + ], + "default": "SORT_DIRECTION_ASC" } ], "tags": [ @@ -248,7 +276,7 @@ ] } }, - "/v1/taproot-assets/universe/keys/group-key/{group_key_str}": { + "/v1/taproot-assets/universe/keys/group-key/{id.group_key_str}": { "get": { "summary": "tapcli: `universe keys`\nAssetLeafKeys queries for the set of Universe keys associated with a given\nasset_id or group_key. Each key takes the form: (outpoint, script_key),\nwhere outpoint is an outpoint in the Bitcoin blockcahin that anchors a\nvalid Taproot Asset commitment, and script_key is the script_key of\nthe asset within the Taproot Asset commitment for the given asset_id or\ngroup_key.", "operationId": "Universe_AssetLeafKeys2", @@ -268,14 +296,14 @@ }, "parameters": [ { - "name": "group_key_str", + "name": "id.group_key_str", "description": "The 32-byte asset group key encoded as hex string (use this for\nREST).", "in": "path", "required": true, "type": "string" }, { - "name": "asset_id", + "name": "id.asset_id", "description": "The 32-byte asset ID specified as raw bytes (gRPC only).", "in": "query", "required": false, @@ -283,14 +311,14 @@ "format": "byte" }, { - "name": "asset_id_str", + "name": "id.asset_id_str", "description": "The 32-byte asset ID encoded as a hex string (use this for REST).", "in": "query", "required": false, "type": "string" }, { - "name": "group_key", + "name": "id.group_key", "description": "The 32-byte asset group key specified as raw bytes (gRPC only).", "in": "query", "required": false, @@ -298,7 +326,7 @@ "format": "byte" }, { - "name": "proof_type", + "name": "id.proof_type", "in": "query", "required": false, "type": "string", @@ -308,6 +336,34 @@ "PROOF_TYPE_TRANSFER" ], "default": "PROOF_TYPE_UNSPECIFIED" + }, + { + "name": "offset", + "description": "The offset for the page.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "limit", + "description": "The length limit for the page.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "direction", + "description": "The direction of the page.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "SORT_DIRECTION_ASC", + "SORT_DIRECTION_DESC" + ], + "default": "SORT_DIRECTION_ASC" } ], "tags": [ @@ -798,6 +854,34 @@ "in": "query", "required": false, "type": "boolean" + }, + { + "name": "offset", + "description": "The offset for the page.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "limit", + "description": "The length limit for the page.", + "in": "query", + "required": false, + "type": "integer", + "format": "int32" + }, + { + "name": "direction", + "description": "The direction of the page.", + "in": "query", + "required": false, + "type": "string", + "enum": [ + "SORT_DIRECTION_ASC", + "SORT_DIRECTION_DESC" + ], + "default": "SORT_DIRECTION_ASC" } ], "tags": [ diff --git a/taprpc/universerpc/universe.yaml b/taprpc/universerpc/universe.yaml index e29c1e435..84c1ea3ac 100644 --- a/taprpc/universerpc/universe.yaml +++ b/taprpc/universerpc/universe.yaml @@ -12,9 +12,9 @@ http: - get: "/v1/taproot-assets/universe/roots/group-key/{id.group_key_str}" - selector: universerpc.Universe.AssetLeafKeys - get: "/v1/taproot-assets/universe/keys/asset-id/{asset_id_str}" + get: "/v1/taproot-assets/universe/keys/asset-id/{id.asset_id_str}" additional_bindings: - - get: "/v1/taproot-assets/universe/keys/group-key/{group_key_str}" + - get: "/v1/taproot-assets/universe/keys/group-key/{id.group_key_str}" - selector: universerpc.Universe.AssetLeaves get: "/v1/taproot-assets/universe/leaves/asset-id/{asset_id_str}" diff --git a/taprpc/universerpc/universe_grpc.pb.go b/taprpc/universerpc/universe_grpc.pb.go index d8783175c..02fdb62bf 100644 --- a/taprpc/universerpc/universe_grpc.pb.go +++ b/taprpc/universerpc/universe_grpc.pb.go @@ -37,7 +37,7 @@ type UniverseClient interface { // valid Taproot Asset commitment, and script_key is the script_key of // the asset within the Taproot Asset commitment for the given asset_id or // group_key. - AssetLeafKeys(ctx context.Context, in *ID, opts ...grpc.CallOption) (*AssetLeafKeyResponse, error) + AssetLeafKeys(ctx context.Context, in *AssetLeafKeysRequest, opts ...grpc.CallOption) (*AssetLeafKeyResponse, error) // tapcli: `universe leaves` // AssetLeaves queries for the set of asset leaves (the values in the Universe // MS-SMT tree) for a given asset_id or group_key. These represents either @@ -141,7 +141,7 @@ func (c *universeClient) DeleteAssetRoot(ctx context.Context, in *DeleteRootQuer return out, nil } -func (c *universeClient) AssetLeafKeys(ctx context.Context, in *ID, opts ...grpc.CallOption) (*AssetLeafKeyResponse, error) { +func (c *universeClient) AssetLeafKeys(ctx context.Context, in *AssetLeafKeysRequest, opts ...grpc.CallOption) (*AssetLeafKeyResponse, error) { out := new(AssetLeafKeyResponse) err := c.cc.Invoke(ctx, "/universerpc.Universe/AssetLeafKeys", in, out, opts...) if err != nil { @@ -290,7 +290,7 @@ type UniverseServer interface { // valid Taproot Asset commitment, and script_key is the script_key of // the asset within the Taproot Asset commitment for the given asset_id or // group_key. - AssetLeafKeys(context.Context, *ID) (*AssetLeafKeyResponse, error) + AssetLeafKeys(context.Context, *AssetLeafKeysRequest) (*AssetLeafKeyResponse, error) // tapcli: `universe leaves` // AssetLeaves queries for the set of asset leaves (the values in the Universe // MS-SMT tree) for a given asset_id or group_key. These represents either @@ -373,7 +373,7 @@ func (UnimplementedUniverseServer) QueryAssetRoots(context.Context, *AssetRootQu func (UnimplementedUniverseServer) DeleteAssetRoot(context.Context, *DeleteRootQuery) (*DeleteRootResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteAssetRoot not implemented") } -func (UnimplementedUniverseServer) AssetLeafKeys(context.Context, *ID) (*AssetLeafKeyResponse, error) { +func (UnimplementedUniverseServer) AssetLeafKeys(context.Context, *AssetLeafKeysRequest) (*AssetLeafKeyResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method AssetLeafKeys not implemented") } func (UnimplementedUniverseServer) AssetLeaves(context.Context, *ID) (*AssetLeafResponse, error) { @@ -483,7 +483,7 @@ func _Universe_DeleteAssetRoot_Handler(srv interface{}, ctx context.Context, dec } func _Universe_AssetLeafKeys_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { - in := new(ID) + in := new(AssetLeafKeysRequest) if err := dec(in); err != nil { return nil, err } @@ -495,7 +495,7 @@ func _Universe_AssetLeafKeys_Handler(srv interface{}, ctx context.Context, dec f FullMethod: "/universerpc.Universe/AssetLeafKeys", } handler := func(ctx context.Context, req interface{}) (interface{}, error) { - return srv.(UniverseServer).AssetLeafKeys(ctx, req.(*ID)) + return srv.(UniverseServer).AssetLeafKeys(ctx, req.(*AssetLeafKeysRequest)) } return interceptor(ctx, in, info, handler) } From 1692aab82d44e68b3cd1f3746465365ffea60655 Mon Sep 17 00:00:00 2001 From: George Tsagkarelis Date: Mon, 30 Oct 2023 10:49:10 +0100 Subject: [PATCH 2/6] tapdb: support pagination for asset roots & leaves --- tapdb/multiverse.go | 25 +++++++++++++++++++----- tapdb/sqlc/querier.go | 4 ++-- tapdb/sqlc/queries/universe.sql | 12 ++++++++++-- tapdb/sqlc/universe.sql.go | 34 +++++++++++++++++++++++++++++---- tapdb/universe.go | 23 +++++++++++++++++++--- tapdb/universe_stats.go | 3 +-- tapdb/universe_test.go | 20 +++++++++++++++---- universe/base.go | 14 ++++++++++++++ 8 files changed, 113 insertions(+), 22 deletions(-) diff --git a/tapdb/multiverse.go b/tapdb/multiverse.go index cc07c19e4..8da103fe9 100644 --- a/tapdb/multiverse.go +++ b/tapdb/multiverse.go @@ -24,6 +24,8 @@ const ( type ( BaseUniverseRoot = sqlc.UniverseRootsRow + + UniverseRootsParams = sqlc.UniverseRootsParams ) // BaseMultiverseStore is used to interact with a set of base universe @@ -31,7 +33,8 @@ type ( type BaseMultiverseStore interface { BaseUniverseStore - UniverseRoots(ctx context.Context) ([]BaseUniverseRoot, error) + UniverseRoots(ctx context.Context, + params UniverseRootsParams) ([]BaseUniverseRoot, error) } // BaseMultiverseOptions is the set of options for multiverse queries. @@ -133,15 +136,27 @@ func (b *MultiverseStore) RootNode(ctx context.Context, // RootNodes returns the complete set of known base universe root nodes for the // set of base universes tracked in the multiverse. func (b *MultiverseStore) RootNodes(ctx context.Context, - withAmountsById bool) ([]universe.Root, error) { + q universe.RootNodesQuery) ([]universe.Root, error) { var ( uniRoots []universe.Root readTx = NewBaseMultiverseReadTx() ) + params := sqlc.UniverseRootsParams{ + SortDirection: sqlInt16(q.SortDirection), + NumOffset: int32(q.Offset), + NumLimit: func() int32 { + if q.Limit == 0 { + return universe.MaxPageSize + } + + return int32(q.Limit) + }(), + } + dbErr := b.db.ExecTx(ctx, &readTx, func(db BaseMultiverseStore) error { - dbRoots, err := db.UniverseRoots(ctx) + dbRoots, err := db.UniverseRoots(ctx, params) if err != nil { return err } @@ -177,7 +192,7 @@ func (b *MultiverseStore) RootNodes(ctx context.Context, // We skip the grouped assets if that wasn't explicitly // requested by the user, saves us some calls for // grouped assets. - if dbRoot.GroupKey != nil && withAmountsById { + if dbRoot.GroupKey != nil && q.WithAmountsById { groupLeaves, err := db.QueryUniverseLeaves( ctx, UniverseLeafQuery{ Namespace: id.String(), @@ -195,7 +210,7 @@ func (b *MultiverseStore) RootNodes(ctx context.Context, copy(id[:], leaf.AssetID) groupedAssets[id] = uint64(leaf.SumAmt) } - } else if withAmountsById { + } else if q.WithAmountsById { // For non-grouped assets, there's exactly one // member, the asset itself. groupedAssets = map[asset.ID]uint64{ diff --git a/tapdb/sqlc/querier.go b/tapdb/sqlc/querier.go index 97a4c44a1..56b9b886e 100644 --- a/tapdb/sqlc/querier.go +++ b/tapdb/sqlc/querier.go @@ -73,7 +73,7 @@ type Querier interface { FetchSeedlingsForBatch(ctx context.Context, rawKey []byte) ([]FetchSeedlingsForBatchRow, error) FetchTransferInputs(ctx context.Context, transferID int64) ([]FetchTransferInputsRow, error) FetchTransferOutputs(ctx context.Context, transferID int64) ([]FetchTransferOutputsRow, error) - FetchUniverseKeys(ctx context.Context, namespace string) ([]FetchUniverseKeysRow, error) + FetchUniverseKeys(ctx context.Context, arg FetchUniverseKeysParams) ([]FetchUniverseKeysRow, error) FetchUniverseRoot(ctx context.Context, namespace string) (FetchUniverseRootRow, error) GenesisAssets(ctx context.Context) ([]GenesisAsset, error) GenesisPoints(ctx context.Context) ([]GenesisPoint, error) @@ -134,7 +134,7 @@ type Querier interface { SetAddrManaged(ctx context.Context, arg SetAddrManagedParams) error SetAssetSpent(ctx context.Context, arg SetAssetSpentParams) (int64, error) UniverseLeaves(ctx context.Context) ([]UniverseLeafe, error) - UniverseRoots(ctx context.Context) ([]UniverseRootsRow, error) + UniverseRoots(ctx context.Context, arg UniverseRootsParams) ([]UniverseRootsRow, error) UpdateBatchGenesisTx(ctx context.Context, arg UpdateBatchGenesisTxParams) error UpdateMintingBatchState(ctx context.Context, arg UpdateMintingBatchStateParams) error UpdateUTXOLease(ctx context.Context, arg UpdateUTXOLeaseParams) error diff --git a/tapdb/sqlc/queries/universe.sql b/tapdb/sqlc/queries/universe.sql index 1b92fbcfa..89868c5dd 100644 --- a/tapdb/sqlc/queries/universe.sql +++ b/tapdb/sqlc/queries/universe.sql @@ -73,7 +73,11 @@ WHERE leaves.leaf_node_namespace = @namespace -- name: FetchUniverseKeys :many SELECT leaves.minting_point, leaves.script_key_bytes FROM universe_leaves leaves -WHERE leaves.leaf_node_namespace = @namespace; +WHERE leaves.leaf_node_namespace = @namespace +ORDER BY + CASE WHEN sqlc.narg('sort_direction') = 0 THEN leaves.id END ASC, + CASE WHEN sqlc.narg('sort_direction') = 1 THEN leaves.id END DESC +LIMIT @num_limit OFFSET @num_offset; -- name: UniverseLeaves :many SELECT * FROM universe_leaves; @@ -89,7 +93,11 @@ JOIN mssmt_nodes ON mssmt_nodes.hash_key = mssmt_roots.root_hash AND mssmt_nodes.namespace = mssmt_roots.namespace JOIN genesis_assets - ON genesis_assets.asset_id = universe_roots.asset_id; + ON genesis_assets.asset_id = universe_roots.asset_id +ORDER BY + CASE WHEN sqlc.narg('sort_direction') = 0 THEN universe_roots.id END ASC, + CASE WHEN sqlc.narg('sort_direction') = 1 THEN universe_roots.id END DESC +LIMIT @num_limit OFFSET @num_offset; -- name: InsertUniverseServer :exec INSERT INTO universe_servers( diff --git a/tapdb/sqlc/universe.sql.go b/tapdb/sqlc/universe.sql.go index 5fedc6175..448b80127 100644 --- a/tapdb/sqlc/universe.sql.go +++ b/tapdb/sqlc/universe.sql.go @@ -65,15 +65,31 @@ const fetchUniverseKeys = `-- name: FetchUniverseKeys :many SELECT leaves.minting_point, leaves.script_key_bytes FROM universe_leaves leaves WHERE leaves.leaf_node_namespace = $1 +ORDER BY + CASE WHEN $2 = 0 THEN leaves.id END ASC, + CASE WHEN $2 = 1 THEN leaves.id END DESC +LIMIT $4 OFFSET $3 ` +type FetchUniverseKeysParams struct { + Namespace string + SortDirection interface{} + NumOffset int32 + NumLimit int32 +} + type FetchUniverseKeysRow struct { MintingPoint []byte ScriptKeyBytes []byte } -func (q *Queries) FetchUniverseKeys(ctx context.Context, namespace string) ([]FetchUniverseKeysRow, error) { - rows, err := q.db.QueryContext(ctx, fetchUniverseKeys, namespace) +func (q *Queries) FetchUniverseKeys(ctx context.Context, arg FetchUniverseKeysParams) ([]FetchUniverseKeysRow, error) { + rows, err := q.db.QueryContext(ctx, fetchUniverseKeys, + arg.Namespace, + arg.SortDirection, + arg.NumOffset, + arg.NumLimit, + ) if err != nil { return nil, err } @@ -773,8 +789,18 @@ JOIN mssmt_nodes mssmt_nodes.namespace = mssmt_roots.namespace JOIN genesis_assets ON genesis_assets.asset_id = universe_roots.asset_id +ORDER BY + CASE WHEN $1 = 0 THEN universe_roots.id END ASC, + CASE WHEN $1 = 1 THEN universe_roots.id END DESC +LIMIT $3 OFFSET $2 ` +type UniverseRootsParams struct { + SortDirection interface{} + NumOffset int32 + NumLimit int32 +} + type UniverseRootsRow struct { AssetID []byte GroupKey []byte @@ -784,8 +810,8 @@ type UniverseRootsRow struct { AssetName string } -func (q *Queries) UniverseRoots(ctx context.Context) ([]UniverseRootsRow, error) { - rows, err := q.db.QueryContext(ctx, universeRoots) +func (q *Queries) UniverseRoots(ctx context.Context, arg UniverseRootsParams) ([]UniverseRootsRow, error) { + rows, err := q.db.QueryContext(ctx, universeRoots, arg.SortDirection, arg.NumOffset, arg.NumLimit) if err != nil { return nil, err } diff --git a/tapdb/universe.go b/tapdb/universe.go index 16d6c6afa..f25cc3a05 100644 --- a/tapdb/universe.go +++ b/tapdb/universe.go @@ -38,6 +38,10 @@ type ( // UniverseLeaf is a universe leaf. UniverseLeaf = sqlc.QueryUniverseLeavesRow + + // UniverseLeafKeysQuery is used to query for the set of keys that are + // currently stored for a given namespace. + UniverseLeafKeysQuery = sqlc.FetchUniverseKeysParams ) // BaseUniverseStore is the main interface for the Taproot Asset universe store. @@ -85,7 +89,7 @@ type BaseUniverseStore interface { // FetchUniverseKeys fetches the set of keys that are currently stored // for a given namespace. FetchUniverseKeys(ctx context.Context, - namespace string) ([]UniverseKeys, error) + arg UniverseLeafKeysQuery) ([]UniverseKeys, error) } // BaseUniverseStoreOptions is the set of options for universe tree queries. @@ -612,13 +616,26 @@ func universeFetchProofLeaf(ctx context.Context, // MintingKeys returns all the keys inserted in the universe. func (b *BaseUniverseTree) MintingKeys(ctx context.Context, -) ([]universe.LeafKey, error) { + q universe.UniverseLeafKeysQuery) ([]universe.LeafKey, error) { var leafKeys []universe.LeafKey readTx := NewBaseUniverseReadTx() dbErr := b.db.ExecTx(ctx, &readTx, func(db BaseUniverseStore) error { - universeKeys, err := db.FetchUniverseKeys(ctx, b.smtNamespace) + universeKeys, err := db.FetchUniverseKeys( + ctx, UniverseLeafKeysQuery{ + Namespace: b.smtNamespace, + SortDirection: sqlInt16(q.SortDirection), + NumOffset: q.Offset, + NumLimit: func() int32 { + if q.Limit == 0 { + return universe.MaxPageSize + } + + return q.Limit + }(), + }, + ) if err != nil { return err } diff --git a/tapdb/universe_stats.go b/tapdb/universe_stats.go index 582f2e142..1fdb43223 100644 --- a/tapdb/universe_stats.go +++ b/tapdb/universe_stats.go @@ -5,7 +5,6 @@ import ( "context" "database/sql" "fmt" - "math" "github.com/btcsuite/btcd/btcec/v2" "github.com/btcsuite/btcd/btcec/v2/schnorr" @@ -421,7 +420,7 @@ func (u *UniverseStats) QuerySyncStats(ctx context.Context, NumOffset: int32(q.Offset), NumLimit: func() int32 { if q.Limit == 0 { - return int32(math.MaxInt32) + return universe.MaxPageSize } return int32(q.Limit) diff --git a/tapdb/universe_test.go b/tapdb/universe_test.go index 44db3c9b9..060b801ae 100644 --- a/tapdb/universe_test.go +++ b/tapdb/universe_test.go @@ -278,7 +278,9 @@ func TestUniverseIssuanceProofs(t *testing.T) { // Next, we'll query for all the available keys, this should match the // number of insertions we just did. - mintingKeys, err := baseUniverse.MintingKeys(ctx) + mintingKeys, err := baseUniverse.MintingKeys( + ctx, universe.UniverseLeafKeysQuery{}, + ) require.NoError(t, err) require.Equal(t, numLeaves, len(mintingKeys)) @@ -342,7 +344,9 @@ func TestUniverseIssuanceProofs(t *testing.T) { _, err = baseUniverse.DeleteUniverse(ctx) require.NoError(t, err) - mintingKeys, err = baseUniverse.MintingKeys(ctx) + mintingKeys, err = baseUniverse.MintingKeys( + ctx, universe.UniverseLeafKeysQuery{}, + ) require.NoError(t, err) require.Len(t, mintingKeys, 0) @@ -463,7 +467,11 @@ func TestUniverseTreeIsolation(t *testing.T) { ) multiverse := NewMultiverseStore(multiverseDB) - rootNodes, err := multiverse.RootNodes(ctx, true) + rootNodes, err := multiverse.RootNodes( + ctx, universe.RootNodesQuery{ + WithAmountsById: true, + }, + ) require.NoError(t, err) // We should be able to find both of the roots we've inserted above. @@ -514,7 +522,11 @@ func TestUniverseTreeIsolation(t *testing.T) { require.ErrorIs(t, err, universe.ErrNoUniverseRoot) // The deleted universe should not be present in the multiverse. - rootNodes, err = multiverse.RootNodes(ctx, true) + rootNodes, err = multiverse.RootNodes( + ctx, universe.RootNodesQuery{ + WithAmountsById: true, + }, + ) require.NoError(t, err) require.Len(t, rootNodes, 1) require.True(t, mssmt.IsEqualNode(rootNodes[0].Node, groupRoot)) diff --git a/universe/base.go b/universe/base.go index f0160424a..eb942559b 100644 --- a/universe/base.go +++ b/universe/base.go @@ -127,6 +127,13 @@ func (a *Archive) RootNode(ctx context.Context, }) } +type RootNodesQuery struct { + WithAmountsById bool + SortDirection SortDirection + Offset int32 + Limit int32 +} + // RootNodes returns the set of root nodes for all known base universes assets. func (a *Archive) RootNodes(ctx context.Context, withAmountsById bool) ([]Root, error) { @@ -546,6 +553,13 @@ func (a *Archive) FetchProofLeaf(ctx context.Context, id Identifier, return a.cfg.Multiverse.FetchProofLeaf(ctx, id, key) } +type UniverseLeafKeysQuery struct { + Id Identifier + SortDirection SortDirection + Offset int32 + Limit int32 +} + // UniverseLeafKeys returns the set of leaf keys known for the specified // universe identifier. func (a *Archive) UniverseLeafKeys(ctx context.Context, From 68d08e11b7dbe5aa51655e07c38e27e8a3b75880 Mon Sep 17 00:00:00 2001 From: George Tsagkarelis Date: Mon, 30 Oct 2023 10:56:40 +0100 Subject: [PATCH 3/6] rpcserver+universe: support pagination for asset roots & leaves --- rpcserver.go | 28 ++++++++++++++++++++++++---- universe/base.go | 17 +++++++++-------- universe/interface.go | 17 ++++++++++++----- 3 files changed, 45 insertions(+), 17 deletions(-) diff --git a/rpcserver.go b/rpcserver.go index 69a0f8cfe..4593a5f73 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -2778,7 +2778,12 @@ func (r *rpcServer) AssetRoots(ctx context.Context, // First, we'll retrieve the full set of known asset Universe roots. assetRoots, err := r.cfg.UniverseArchive.RootNodes( - ctx, req.WithAmountsById, + ctx, universe.RootNodesQuery{ + WithAmountsById: req.WithAmountsById, + SortDirection: universe.SortDirection(req.Direction), + Offset: req.Offset, + Limit: req.Limit, + }, ) if err != nil { return nil, err @@ -3058,9 +3063,13 @@ func marshalLeafKey(leafKey universe.LeafKey) *unirpc.AssetKey { // Taproot Asset commitment, and script_key is the script_key of the asset // within the Taproot Asset commitment for the given asset_id or group_key. func (r *rpcServer) AssetLeafKeys(ctx context.Context, - req *unirpc.ID) (*unirpc.AssetLeafKeyResponse, error) { + req *unirpc.AssetLeafKeysRequest) (*unirpc.AssetLeafKeyResponse, error) { - universeID, err := UnmarshalUniID(req) + if req == nil { + return nil, fmt.Errorf("request must be set") + } + + universeID, err := UnmarshalUniID(req.Id) if err != nil { return nil, err } @@ -3068,7 +3077,18 @@ func (r *rpcServer) AssetLeafKeys(ctx context.Context, // TODO(roasbeef): tell above if was tring or not, then would set // below diff - leafKeys, err := r.cfg.UniverseArchive.UniverseLeafKeys(ctx, universeID) + if req.Limit > universe.MaxPageSize || req.Limit < 0 { + return nil, fmt.Errorf("invalid request limit") + } + + leafKeys, err := r.cfg.UniverseArchive.UniverseLeafKeys( + ctx, universe.UniverseLeafKeysQuery{ + Id: universeID, + SortDirection: universe.SortDirection(req.Direction), + Offset: req.Offset, + Limit: req.Limit, + }, + ) if err != nil { return nil, err } diff --git a/universe/base.go b/universe/base.go index eb942559b..109618ac5 100644 --- a/universe/base.go +++ b/universe/base.go @@ -136,12 +136,13 @@ type RootNodesQuery struct { // RootNodes returns the set of root nodes for all known base universes assets. func (a *Archive) RootNodes(ctx context.Context, - withAmountsById bool) ([]Root, error) { + q RootNodesQuery) ([]Root, error) { - log.Debugf("Fetching all known Universe roots (with_amounts_by_id=%v)", - withAmountsById) + log.Debugf("Fetching all known Universe roots (with_amounts_by_id=%v"+ + ", sort_direction=%v, offset=%v, limit=%v)", q.WithAmountsById, + q.SortDirection, q.Offset, q.Limit) - return a.cfg.Multiverse.RootNodes(ctx, withAmountsById) + return a.cfg.Multiverse.RootNodes(ctx, q) } // UpsertProofLeaf attempts to upsert a proof for an asset issuance or transfer @@ -563,12 +564,12 @@ type UniverseLeafKeysQuery struct { // UniverseLeafKeys returns the set of leaf keys known for the specified // universe identifier. func (a *Archive) UniverseLeafKeys(ctx context.Context, - id Identifier) ([]LeafKey, error) { + q UniverseLeafKeysQuery) ([]LeafKey, error) { - log.Debugf("Retrieving all keys for Universe: id=%v", id.StringForLog()) + log.Debugf("Retrieving all keys for Universe: id=%v", q.Id.StringForLog()) - return withBaseUni(a, id, func(baseUni BaseBackend) ([]LeafKey, error) { - return baseUni.MintingKeys(ctx) + return withBaseUni(a, q.Id, func(baseUni BaseBackend) ([]LeafKey, error) { + return baseUni.MintingKeys(ctx, q) }) } diff --git a/universe/interface.go b/universe/interface.go index 2d364286b..4044d4a1b 100644 --- a/universe/interface.go +++ b/universe/interface.go @@ -35,6 +35,12 @@ var ( ErrNoUniverseProofFound = fmt.Errorf("no universe proof found") ) +const ( + // MaxPageSize is the maximum page size that can be used when querying + // for asset roots and leaves. + MaxPageSize = 512 +) + // Identifier is the identifier for a universe. type Identifier struct { // AssetID is the asset ID for the universe. @@ -237,7 +243,8 @@ type BaseBackend interface { key LeafKey) ([]*Proof, error) // MintingKeys returns all the keys inserted in the universe. - MintingKeys(ctx context.Context) ([]LeafKey, error) + MintingKeys(ctx context.Context, + q UniverseLeafKeysQuery) ([]LeafKey, error) // MintingLeaves returns all the minting leaves inserted into the // universe. @@ -282,8 +289,7 @@ type MultiverseRoot struct { type MultiverseArchive interface { // RootNodes returns the complete set of known root nodes for the set // of assets tracked in the base Universe. - RootNodes(ctx context.Context, withAmountsById bool) ([]Root, - error) + RootNodes(ctx context.Context, q RootNodesQuery) ([]Root, error) // UpsertProofLeaf upserts a proof leaf within the multiverse tree and // the universe tree that corresponds to the given key. @@ -496,10 +502,11 @@ type DiffEngine interface { RootNode(ctx context.Context, id Identifier) (Root, error) // RootNodes returns the set of root nodes for all known universes. - RootNodes(ctx context.Context, withAmountsById bool) ([]Root, error) + RootNodes(ctx context.Context, q RootNodesQuery) ([]Root, error) // UniverseLeafKeys returns all the keys inserted in the universe. - UniverseLeafKeys(ctx context.Context, id Identifier) ([]LeafKey, error) + UniverseLeafKeys(ctx context.Context, + q UniverseLeafKeysQuery) ([]LeafKey, error) // FetchProofLeaf attempts to fetch a proof leaf for the target leaf key // and given a universe identifier (assetID/groupKey). From 531ef40eb248b8dfaa19021ee7719bef14110d51 Mon Sep 17 00:00:00 2001 From: George Tsagkarelis Date: Mon, 30 Oct 2023 10:59:44 +0100 Subject: [PATCH 4/6] multi: default clients to using pagination --- cmd/tapcli/universe.go | 27 +++++++++++-- universe/syncer.go | 90 ++++++++++++++++++++++++++++++++++++++++-- universe_rpc_diff.go | 20 +++++++--- 3 files changed, 125 insertions(+), 12 deletions(-) diff --git a/cmd/tapcli/universe.go b/cmd/tapcli/universe.go index 56061b3d8..931281424 100644 --- a/cmd/tapcli/universe.go +++ b/cmd/tapcli/universe.go @@ -270,9 +270,30 @@ func universeKeys(ctx *cli.Context) error { return err } - assetKeys, err := client.AssetLeafKeys(ctxc, universeID) - if err != nil { - return err + assetKeys := &unirpc.AssetLeafKeyResponse{} + offset := 0 + + for { + tempKeys, err := client.AssetLeafKeys( + ctxc, &unirpc.AssetLeafKeysRequest{ + Id: universeID, + Offset: int32(offset), + Limit: universe.MaxPageSize, + }, + ) + + if err != nil { + return err + } + + if len(tempKeys.AssetKeys) == 0 { + break + } + + assetKeys.AssetKeys = append( + assetKeys.AssetKeys, tempKeys.AssetKeys..., + ) + offset += universe.MaxPageSize } printRespJSON(assetKeys) diff --git a/universe/syncer.go b/universe/syncer.go index 19bf5a8ed..2da7c15eb 100644 --- a/universe/syncer.go +++ b/universe/syncer.go @@ -13,6 +13,10 @@ import ( "golang.org/x/sync/errgroup" ) +const ( + defaultPageSize = int32(MaxPageSize) +) + var ( // ErrUnsupportedSync is returned when a syncer is asked to async in a // way that it does not support. @@ -116,7 +120,8 @@ func (s *SimpleSyncer) executeSync(ctx context.Context, diffEngine DiffEngine, // remote servers. case globalInsertEnabled: log.Infof("Fetching all roots for remote Universe server...") - targetRoots, err = diffEngine.RootNodes(ctx, false) + + targetRoots, err = s.fetchAllRoots(ctx, diffEngine) if err != nil { return nil, err } @@ -236,12 +241,19 @@ func (s *SimpleSyncer) syncRoot(ctx context.Context, remoteRoot Root, uniID.String()) // Otherwise, we'll need to perform a diff operation to find the set of - // keys we need to fetch. - remoteUniKeys, err := diffEngine.UniverseLeafKeys(ctx, uniID) + // keys we need to fetch. We'll start by fetching the set of keys from + // both the local and remote Universe. + var ( + remoteUniKeys []LeafKey + localUniKeys []LeafKey + ) + + remoteUniKeys, err = s.fetchAllLeafKeys(ctx, diffEngine, uniID) if err != nil { return err } - localUniKeys, err := s.cfg.LocalDiffEngine.UniverseLeafKeys(ctx, uniID) + + localUniKeys, err = s.fetchAllLeafKeys(ctx, s.cfg.LocalDiffEngine, uniID) if err != nil { return err } @@ -440,3 +452,73 @@ func (s *SimpleSyncer) SyncUniverse(ctx context.Context, host ServerAddr, // remote instance. return s.executeSync(ctx, diffEngine, syncType, syncConfigs, idsToSync) } + +// fetchAllRoots fetches all the roots from the remote Universe. This function +// is used in order to isolate any logic related to the specifics of how we +// fetch the data from the universe server. +func (s *SimpleSyncer) fetchAllRoots(ctx context.Context, diffEngine DiffEngine) ([]Root, error) { + offset := int32(0) + pageSize := defaultPageSize + roots := make([]Root, 0) + + for { + log.Debugf("Fetching roots in range: %v to %v", offset, + offset+pageSize) + tempRoots, err := diffEngine.RootNodes( + ctx, RootNodesQuery{ + WithAmountsById: false, + SortDirection: SortAscending, + Offset: offset, + Limit: pageSize, + }, + ) + + if err != nil { + return nil, err + } + + if len(tempRoots) == 0 { + break + } + + roots = append(roots, tempRoots...) + offset += pageSize + } + + return roots, nil +} + +// fetchAllLeafKeys fetches all the leaf keys from the remote Universe. This +// function is used in order to isolate any logic related to the specifics of +// how we fetch the data from the universe server. +func (s *SimpleSyncer) fetchAllLeafKeys(ctx context.Context, + diffEngine DiffEngine, uniID Identifier) ([]LeafKey, error) { + + // Initialize the offset to be used for the pages. + offset := int32(0) + pageSize := defaultPageSize + leafKeys := make([]LeafKey, 0) + + for { + tempRemoteKeys, err := diffEngine.UniverseLeafKeys( + ctx, UniverseLeafKeysQuery{ + Id: uniID, + Offset: offset, + Limit: pageSize, + SortDirection: SortAscending, + }, + ) + if err != nil { + return nil, err + } + + if len(tempRemoteKeys) == 0 { + break + } + + leafKeys = append(leafKeys, tempRemoteKeys...) + offset += pageSize + } + + return leafKeys, nil +} diff --git a/universe_rpc_diff.go b/universe_rpc_diff.go index 8f64b1530..0b169ed7e 100644 --- a/universe_rpc_diff.go +++ b/universe_rpc_diff.go @@ -77,11 +77,14 @@ func unmarshalUniverseRoots( // RootNodes returns the complete set of known root nodes for the set // of assets tracked in the universe. func (r *RpcUniverseDiff) RootNodes(ctx context.Context, - withAmountsById bool) ([]universe.Root, error) { + q universe.RootNodesQuery) ([]universe.Root, error) { universeRoots, err := r.conn.AssetRoots( ctx, &unirpc.AssetRootRequest{ - WithAmountsById: withAmountsById, + WithAmountsById: q.WithAmountsById, + Offset: int32(q.Offset), + Limit: int32(q.Limit), + Direction: unirpc.SortDirection(q.SortDirection), }, ) if err != nil { @@ -119,13 +122,20 @@ func (r *RpcUniverseDiff) RootNode(ctx context.Context, // UniverseLeafKeys returns all the keys inserted in the universe. func (r *RpcUniverseDiff) UniverseLeafKeys(ctx context.Context, - id universe.Identifier) ([]universe.LeafKey, error) { + q universe.UniverseLeafKeysQuery) ([]universe.LeafKey, error) { - uniID, err := MarshalUniID(id) + uniID, err := MarshalUniID(q.Id) if err != nil { return nil, err } - assetKeys, err := r.conn.AssetLeafKeys(ctx, uniID) + assetKeys, err := r.conn.AssetLeafKeys( + ctx, &unirpc.AssetLeafKeysRequest{ + Id: uniID, + Direction: unirpc.SortDirection(q.SortDirection), + Offset: int32(q.Offset), + Limit: int32(q.Limit), + }, + ) if err != nil { return nil, err } From 8804511eac09697eab9018bba6c2e56082563fa1 Mon Sep 17 00:00:00 2001 From: George Tsagkarelis Date: Mon, 30 Oct 2023 11:00:17 +0100 Subject: [PATCH 5/6] itest: use default pagination params in tests --- itest/assertions.go | 14 ++++++++++++-- itest/collectible_split_test.go | 6 +++++- itest/loadtest/mint_batch_test.go | 6 +++++- itest/mint_batch_stress_test.go | 6 +++++- 4 files changed, 27 insertions(+), 5 deletions(-) diff --git a/itest/assertions.go b/itest/assertions.go index 6c5c3157f..5e7fd9b20 100644 --- a/itest/assertions.go +++ b/itest/assertions.go @@ -1196,10 +1196,20 @@ func AssertUniverseKeysEqual(t *testing.T, uniIDs []*unirpc.ID, a, b unirpc.UniverseClient) { for _, uniID := range uniIDs { - aUniKeys, err := a.AssetLeafKeys(context.Background(), uniID) + aUniKeys, err := a.AssetLeafKeys( + context.Background(), + &unirpc.AssetLeafKeysRequest{ + Id: uniID, + }, + ) require.NoError(t, err) - bUniKeys, err := b.AssetLeafKeys(context.Background(), uniID) + bUniKeys, err := b.AssetLeafKeys( + context.Background(), + &unirpc.AssetLeafKeysRequest{ + Id: uniID, + }, + ) require.NoError(t, err) require.Equal( diff --git a/itest/collectible_split_test.go b/itest/collectible_split_test.go index 4617a353c..e93d7d039 100644 --- a/itest/collectible_split_test.go +++ b/itest/collectible_split_test.go @@ -316,7 +316,11 @@ func testCollectibleGroupSend(t *harnessTest) { // The universe tree should also have a key for each asset, with all // outpoints matching the chain anchor of the group anchor. mintOutpoint := collectibleAnchor.ChainAnchor.AnchorOutpoint - uniKeys, err := t.tapd.AssetLeafKeys(ctxb, &collectUniID) + uniKeys, err := t.tapd.AssetLeafKeys( + ctxb, &unirpc.AssetLeafKeysRequest{ + Id: &collectUniID, + }, + ) require.NoError(t.t, err) require.Len(t.t, uniKeys.AssetKeys, batchSize) diff --git a/itest/loadtest/mint_batch_test.go b/itest/loadtest/mint_batch_test.go index 5349a1be7..0ba55f6e5 100644 --- a/itest/loadtest/mint_batch_test.go +++ b/itest/loadtest/mint_batch_test.go @@ -151,7 +151,11 @@ func mintTest(t *testing.T, ctx context.Context, cfg *Config) { // The universe tree should also have a key for each asset, with all // outpoints matching the chain anchor of the group anchor. mintOutpoint := collectibleAnchor.ChainAnchor.AnchorOutpoint - uniKeys, err := alice.AssetLeafKeys(ctx, &collectUniID) + uniKeys, err := alice.AssetLeafKeys( + ctx, &unirpc.AssetLeafKeysRequest{ + Id: &collectUniID, + }, + ) require.NoError(t, err) require.Len(t, uniKeys.AssetKeys, batchSize) diff --git a/itest/mint_batch_stress_test.go b/itest/mint_batch_stress_test.go index 0f09341e7..c620e2d88 100644 --- a/itest/mint_batch_stress_test.go +++ b/itest/mint_batch_stress_test.go @@ -200,7 +200,11 @@ func mintBatchStressTest( // The universe tree should also have a key for each asset, with all // outpoints matching the chain anchor of the group anchor. mintOutpoint := collectibleAnchor.ChainAnchor.AnchorOutpoint - uniKeys, err := alice.AssetLeafKeys(ctx, &collectUniID) + uniKeys, err := alice.AssetLeafKeys( + ctx, &unirpc.AssetLeafKeysRequest{ + Id: &collectUniID, + }, + ) require.NoError(t, err) require.Len(t, uniKeys.AssetKeys, batchSize) From ddf7eaa73bff78d49f215acf1fdffcc5160f370c Mon Sep 17 00:00:00 2001 From: George Tsagkarelis Date: Thu, 2 Nov 2023 18:16:56 +0200 Subject: [PATCH 6/6] itest: add simple universe pagination test --- itest/assertions.go | 41 ++++- itest/mint_batch_stress_test.go | 12 +- itest/test_list_on_test.go | 4 + itest/universe_pagination_test.go | 246 ++++++++++++++++++++++++++++++ 4 files changed, 294 insertions(+), 9 deletions(-) create mode 100644 itest/universe_pagination_test.go diff --git a/itest/assertions.go b/itest/assertions.go index 5e7fd9b20..06d286f1e 100644 --- a/itest/assertions.go +++ b/itest/assertions.go @@ -21,6 +21,7 @@ import ( "github.com/lightninglabs/taproot-assets/taprpc" "github.com/lightninglabs/taproot-assets/taprpc/mintrpc" unirpc "github.com/lightninglabs/taproot-assets/taprpc/universerpc" + "github.com/lightninglabs/taproot-assets/universe" "github.com/lightningnetwork/lnd/lnrpc/chainrpc" "github.com/lightningnetwork/lnd/lntest/wait" "github.com/stretchr/testify/require" @@ -1157,10 +1158,10 @@ func AssertUniverseRootsEqual(a, b *unirpc.AssetRootResponse) bool { func AssertUniverseStateEqual(t *testing.T, a, b unirpc.UniverseClient) bool { ctxb := context.Background() - rootsA, err := a.AssetRoots(ctxb, &unirpc.AssetRootRequest{}) + rootsA, err := assetRoots(ctxb, a, universe.MaxPageSize/100) require.NoError(t, err) - rootsB, err := b.AssetRoots(ctxb, &unirpc.AssetRootRequest{}) + rootsB, err := assetRoots(ctxb, b, universe.MaxPageSize/100) require.NoError(t, err) return AssertUniverseRootsEqual(rootsA, rootsB) @@ -1516,3 +1517,39 @@ func assertGroups(t *testing.T, client taprpc.TaprootAssetsClient, equalityCheck(issuableAssets[0].Asset, groupedAssets[0]) equalityCheck(issuableAssets[1].Asset, groupedAssets[1]) } + +// assetRoots is a helper method that fetches all roots from a given universe +// rpc by scanning for all pages. +func assetRoots(ctx context.Context, + uni unirpc.UniverseClient, pageSize int32) (*unirpc.AssetRootResponse, error) { + + offset := int32(0) + roots := make(map[string]*unirpc.UniverseRoot) + + for { + res, err := uni.AssetRoots( + ctx, + &unirpc.AssetRootRequest{ + Offset: offset, + Limit: pageSize, + }, + ) + if err != nil { + return nil, err + } + + if len(res.UniverseRoots) == 0 { + break + } + + for k, v := range res.UniverseRoots { + roots[k] = v + } + + offset += pageSize + } + + return &unirpc.AssetRootResponse{ + UniverseRoots: roots, + }, nil +} diff --git a/itest/mint_batch_stress_test.go b/itest/mint_batch_stress_test.go index c620e2d88..d2324d4a5 100644 --- a/itest/mint_batch_stress_test.go +++ b/itest/mint_batch_stress_test.go @@ -200,15 +200,13 @@ func mintBatchStressTest( // The universe tree should also have a key for each asset, with all // outpoints matching the chain anchor of the group anchor. mintOutpoint := collectibleAnchor.ChainAnchor.AnchorOutpoint - uniKeys, err := alice.AssetLeafKeys( - ctx, &unirpc.AssetLeafKeysRequest{ - Id: &collectUniID, - }, - ) + + leafKeys, err := fetchAllLeafKeys(t, alice, &collectUniID) require.NoError(t, err) - require.Len(t, uniKeys.AssetKeys, batchSize) - correctOp := fn.All(uniKeys.AssetKeys, func(key *unirpc.AssetKey) bool { + require.Len(t, leafKeys, batchSize) + + correctOp := fn.All(leafKeys, func(key *unirpc.AssetKey) bool { return key.GetOpStr() == mintOutpoint }) require.True(t, correctOp) diff --git a/itest/test_list_on_test.go b/itest/test_list_on_test.go index 3db368389..b162b6a21 100644 --- a/itest/test_list_on_test.go +++ b/itest/test_list_on_test.go @@ -185,6 +185,10 @@ var testCases = []*testCase{ name: "federation sync config", test: testFederationSyncConfig, }, + { + name: "universe pagination simple", + test: testUniversePaginationSimple, + }, } var optionalTestCases = []*testCase{ diff --git a/itest/universe_pagination_test.go b/itest/universe_pagination_test.go new file mode 100644 index 000000000..8be8a9f03 --- /dev/null +++ b/itest/universe_pagination_test.go @@ -0,0 +1,246 @@ +package itest + +import ( + "context" + "encoding/binary" + "encoding/hex" + "strconv" + "testing" + "time" + + "github.com/lightninglabs/taproot-assets/fn" + "github.com/lightninglabs/taproot-assets/taprpc" + "github.com/lightninglabs/taproot-assets/taprpc/mintrpc" + unirpc "github.com/lightninglabs/taproot-assets/taprpc/universerpc" + "github.com/stretchr/testify/require" +) + +const ( + // testPageSize is the page size to use when fetching data from the + // universe rpc. We use a small page size to test pagination. + testPageSize = 42 + + // testPageSizeSmall is the page size to use when fetching data from the + // universe rpc. We use a small page size to test pagination. + testPageSizeSmall = 2 + + // testGroupSize is the size of the asset group we mint in the + // testUniversePaginationSimple test. + testGroupSize = 79 +) + +func testUniversePaginationSimple(t *harnessTest) { + mintSize := 255 + timeout := defaultWaitTimeout + + // If we create a second tapd instance and sync the universe state, + // the synced tree should match the source tree. + bob := setupTapdHarness( + t.t, t, t.lndHarness.Bob, nil, + ) + defer func() { + require.NoError(t.t, bob.stop(!*noDelete)) + }() + + mintBatches := func(reqs []*mintrpc.MintAssetRequest) []*taprpc.Asset { + return MintAssetsConfirmBatch( + t.t, t.lndHarness.Miner.Client, t.tapd, reqs, + WithMintingTimeout(timeout), + ) + } + + imageMetadataBytes := GetImageMetadataBytes(t.t, ImageMetadataFileName) + + mintBatchAssetsTest( + t.t, t.tapd, bob, t.tapd.rpcHost(), mintSize, mintBatches, + imageMetadataBytes, timeout, + ) +} + +// mintBatchAssetsTest mints many assets +func mintBatchAssetsTest( + t *testing.T, alice, bob TapdClient, aliceHost string, mintSize int, + mintAssets func([]*mintrpc.MintAssetRequest) []*taprpc.Asset, + imageMetadataBytes []byte, minterTimeout time.Duration) { + + var ( + batchReqs = make([]*mintrpc.MintAssetRequest, 0) + baseName = "jpeg" + metaPrefixSize = binary.MaxVarintLen16 + metadataPrefix = make([]byte, metaPrefixSize) + mintBatches = make(map[int][]*taprpc.Asset) + ) + + // Each asset in the batch will share a name and metdata preimage, that + // will be updated based on the asset's index in the batch. + collectibleRequestTemplate := mintrpc.MintAssetRequest{ + Asset: &mintrpc.MintAsset{ + AssetType: taprpc.AssetType_COLLECTIBLE, + Name: baseName, + AssetMeta: &taprpc.AssetMeta{ + Data: imageMetadataBytes, + Type: 0, + }, + Amount: 1, + }, + EnableEmission: false, + } + + // Update the asset name and metadata to match an index. + incrementMintAsset := func(asset *mintrpc.MintAsset, ind int) { + asset.Name = asset.Name + strconv.Itoa(ind) + binary.PutUvarint(metadataPrefix, uint64(ind)) + copy(asset.AssetMeta.Data[0:metaPrefixSize], metadataPrefix) + } + + // Use the first asset of the batch as the asset group anchor. + collectibleAnchorReq := CopyRequest(&collectibleRequestTemplate) + incrementMintAsset(collectibleAnchorReq.Asset, 0) + collectibleAnchorReq.EnableEmission = true + batchReqs = append(batchReqs, collectibleAnchorReq) + + groupSize := testGroupSize + + // Generate the rest of the batch, with each asset referencing the group + // anchor we created above. + for i := 1; i < mintSize; i++ { + groupedAsset := CopyRequest(&collectibleRequestTemplate) + + // If group size was reached mint, confirm and rotate the group + // anchor. + if i%groupSize == 0 || i == mintSize-1 { + mintBatch := mintAssets(batchReqs) + mintBatches[i] = mintBatch + + batchReqs = make([]*mintrpc.MintAssetRequest, 0) + + incrementMintAsset(groupedAsset.Asset, i) + collectibleAnchorReq = CopyRequest(groupedAsset) + groupedAsset.EnableEmission = true + } else { + groupedAsset.Asset.GroupAnchor = + collectibleAnchorReq.Asset.Name + + incrementMintAsset(groupedAsset.Asset, i) + } + + batchReqs = append(batchReqs, groupedAsset) + } + + // Since batch size is not a multiple of group size, we should have one + // last group with all the leftovers. + groupCount := mintSize/groupSize + 1 + + AssertNumGroups(t, alice, groupCount) + + for _, mintBatch := range mintBatches { + anchorAsset := taprpc.Asset{ + AssetGenesis: mintBatch[0].AssetGenesis, + AssetGroup: mintBatch[0].AssetGroup, + } + + // We can re-derive the group key to verify that the correct + // asset was used as the group anchor. + collectibleAnchor := VerifyGroupAnchor( + t, mintBatch, anchorAsset.AssetGenesis.Name, + ) + collectGroupKey := anchorAsset.AssetGroup.TweakedGroupKey + collectGroupKeyStr := hex.EncodeToString(collectGroupKey[:]) + + AssertGroupSizes( + t, alice, []string{collectGroupKeyStr}, + []int{len(mintBatch)}, + ) + AssertBalanceByGroup( + t, alice, collectGroupKeyStr, uint64(len(mintBatch)), + ) + + // The universe tree should also have a leaf for each asset + // minted. + // TODO(jhb): Resolve issue of 33-byte group key handling. + collectUniID := unirpc.ID{ + Id: &unirpc.ID_GroupKey{ + GroupKey: collectGroupKey[1:], + }, + ProofType: unirpc.ProofType_PROOF_TYPE_ISSUANCE, + } + + AssertUniverseRoot( + t, alice, len(mintBatch), nil, collectGroupKey, + ) + + ctx := context.Background() + uniLeaves, err := alice.AssetLeaves(ctx, &collectUniID) + require.NoError(t, err) + require.Len(t, uniLeaves.Leaves, len(mintBatch)) + + // The universe tree should also have a key for each asset, with + // all outpoints matching the chain anchor of the group anchor. + mintOutpoint := collectibleAnchor.ChainAnchor.AnchorOutpoint + + leafKeys, err := fetchAllLeafKeys(t, alice, &collectUniID) + require.NoError(t, err) + + require.Len(t, leafKeys, len(mintBatch)) + + correctOp := fn.All(leafKeys, func(key *unirpc.AssetKey) bool { + return key.GetOpStr() == mintOutpoint + }) + require.True(t, correctOp) + } + + // The universe tree should reflect the same properties about the batch; + // there should be one root with a group key and balance matching what + // we asserted previously. + ctx := context.Background() + uniRoots, err := assetRoots(ctx, alice, testPageSizeSmall) + require.NoError(t, err) + require.Len(t, uniRoots.UniverseRoots, groupCount) + + _, err = bob.AddFederationServer( + ctx, &unirpc.AddFederationServerRequest{ + Servers: []*unirpc.UniverseFederationServer{ + { + Host: aliceHost, + }, + }, + }, + ) + require.NoError(t, err) + + require.Eventually(t, func() bool { + return AssertUniverseStateEqual( + t, alice, bob, + ) + }, minterTimeout, time.Second) +} + +// fetchAllLeafKeys fetches all leaf keys for a given universe ID. +func fetchAllLeafKeys(t *testing.T, alice TapdClient, + id *unirpc.ID) ([]*unirpc.AssetKey, error) { + + keys := make([]*unirpc.AssetKey, 0) + offset := int32(0) + + for { + resp, err := alice.AssetLeafKeys( + context.Background(), &unirpc.AssetLeafKeysRequest{ + Id: id, + Offset: offset, + Limit: testPageSize, + }, + ) + if err != nil { + return nil, err + } + + if len(resp.AssetKeys) == 0 { + break + } + + keys = append(keys, resp.AssetKeys...) + offset += testPageSize + } + + return keys, nil +}