diff --git a/docs/release-notes/release-notes-0.16.0.md b/docs/release-notes/release-notes-0.16.0.md index ffe969d7e..1a282ca94 100644 --- a/docs/release-notes/release-notes-0.16.0.md +++ b/docs/release-notes/release-notes-0.16.0.md @@ -23,6 +23,10 @@ transaction](https://github.com/lightningnetwork/lnd/pull/6730). * [Add list addresses RPC](https://github.com/lightningnetwork/lnd/pull/6596). +* Add [TrackPayments](https://github.com/lightningnetwork/lnd/pull/6335) + method to the RPC to allow subscribing to updates from any inflight payment. + Similar to TrackPaymentV2, but for any inflight payment. + ## Wallet * [Allows Taproot public keys and tap scripts to be imported as watch-only @@ -88,6 +92,7 @@ minimum version needed to build the project. * Elle Mouton * ErikEk * hieblmi +* Jesse de Wit * Olaoluwa Osuntokun * Oliver Gugger * Priyansh Rastogi diff --git a/lnrpc/routerrpc/router.pb.go b/lnrpc/routerrpc/router.pb.go index abce841bf..8cf6b3f27 100644 --- a/lnrpc/routerrpc/router.pb.go +++ b/lnrpc/routerrpc/router.pb.go @@ -347,7 +347,7 @@ func (x HtlcEvent_EventType) Number() protoreflect.EnumNumber { // Deprecated: Use HtlcEvent_EventType.Descriptor instead. func (HtlcEvent_EventType) EnumDescriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{24, 0} + return file_routerrpc_router_proto_rawDescGZIP(), []int{25, 0} } type SendPaymentRequest struct { @@ -699,6 +699,55 @@ func (x *TrackPaymentRequest) GetNoInflightUpdates() bool { return false } +type TrackPaymentsRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // If set, only the final payment updates are streamed back. Intermediate + // updates that show which htlcs are still in flight are suppressed. + NoInflightUpdates bool `protobuf:"varint,1,opt,name=no_inflight_updates,json=noInflightUpdates,proto3" json:"no_inflight_updates,omitempty"` +} + +func (x *TrackPaymentsRequest) Reset() { + *x = TrackPaymentsRequest{} + if protoimpl.UnsafeEnabled { + mi := &file_routerrpc_router_proto_msgTypes[2] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) + } +} + +func (x *TrackPaymentsRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*TrackPaymentsRequest) ProtoMessage() {} + +func (x *TrackPaymentsRequest) ProtoReflect() protoreflect.Message { + mi := &file_routerrpc_router_proto_msgTypes[2] + if protoimpl.UnsafeEnabled && x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use TrackPaymentsRequest.ProtoReflect.Descriptor instead. +func (*TrackPaymentsRequest) Descriptor() ([]byte, []int) { + return file_routerrpc_router_proto_rawDescGZIP(), []int{2} +} + +func (x *TrackPaymentsRequest) GetNoInflightUpdates() bool { + if x != nil { + return x.NoInflightUpdates + } + return false +} + type RouteFeeRequest struct { state protoimpl.MessageState sizeCache protoimpl.SizeCache @@ -713,7 +762,7 @@ type RouteFeeRequest struct { func (x *RouteFeeRequest) Reset() { *x = RouteFeeRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[2] + mi := &file_routerrpc_router_proto_msgTypes[3] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -726,7 +775,7 @@ func (x *RouteFeeRequest) String() string { func (*RouteFeeRequest) ProtoMessage() {} func (x *RouteFeeRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[2] + mi := &file_routerrpc_router_proto_msgTypes[3] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -739,7 +788,7 @@ func (x *RouteFeeRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use RouteFeeRequest.ProtoReflect.Descriptor instead. func (*RouteFeeRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{2} + return file_routerrpc_router_proto_rawDescGZIP(), []int{3} } func (x *RouteFeeRequest) GetDest() []byte { @@ -773,7 +822,7 @@ type RouteFeeResponse struct { func (x *RouteFeeResponse) Reset() { *x = RouteFeeResponse{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[3] + mi := &file_routerrpc_router_proto_msgTypes[4] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -786,7 +835,7 @@ func (x *RouteFeeResponse) String() string { func (*RouteFeeResponse) ProtoMessage() {} func (x *RouteFeeResponse) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[3] + mi := &file_routerrpc_router_proto_msgTypes[4] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -799,7 +848,7 @@ func (x *RouteFeeResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use RouteFeeResponse.ProtoReflect.Descriptor instead. func (*RouteFeeResponse) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{3} + return file_routerrpc_router_proto_rawDescGZIP(), []int{4} } func (x *RouteFeeResponse) GetRoutingFeeMsat() int64 { @@ -835,7 +884,7 @@ type SendToRouteRequest struct { func (x *SendToRouteRequest) Reset() { *x = SendToRouteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[4] + mi := &file_routerrpc_router_proto_msgTypes[5] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -848,7 +897,7 @@ func (x *SendToRouteRequest) String() string { func (*SendToRouteRequest) ProtoMessage() {} func (x *SendToRouteRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[4] + mi := &file_routerrpc_router_proto_msgTypes[5] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -861,7 +910,7 @@ func (x *SendToRouteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SendToRouteRequest.ProtoReflect.Descriptor instead. func (*SendToRouteRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{4} + return file_routerrpc_router_proto_rawDescGZIP(), []int{5} } func (x *SendToRouteRequest) GetPaymentHash() []byte { @@ -899,7 +948,7 @@ type SendToRouteResponse struct { func (x *SendToRouteResponse) Reset() { *x = SendToRouteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[5] + mi := &file_routerrpc_router_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -912,7 +961,7 @@ func (x *SendToRouteResponse) String() string { func (*SendToRouteResponse) ProtoMessage() {} func (x *SendToRouteResponse) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[5] + mi := &file_routerrpc_router_proto_msgTypes[6] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -925,7 +974,7 @@ func (x *SendToRouteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SendToRouteResponse.ProtoReflect.Descriptor instead. func (*SendToRouteResponse) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{5} + return file_routerrpc_router_proto_rawDescGZIP(), []int{6} } func (x *SendToRouteResponse) GetPreimage() []byte { @@ -951,7 +1000,7 @@ type ResetMissionControlRequest struct { func (x *ResetMissionControlRequest) Reset() { *x = ResetMissionControlRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[6] + mi := &file_routerrpc_router_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -964,7 +1013,7 @@ func (x *ResetMissionControlRequest) String() string { func (*ResetMissionControlRequest) ProtoMessage() {} func (x *ResetMissionControlRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[6] + mi := &file_routerrpc_router_proto_msgTypes[7] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -977,7 +1026,7 @@ func (x *ResetMissionControlRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetMissionControlRequest.ProtoReflect.Descriptor instead. func (*ResetMissionControlRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{6} + return file_routerrpc_router_proto_rawDescGZIP(), []int{7} } type ResetMissionControlResponse struct { @@ -989,7 +1038,7 @@ type ResetMissionControlResponse struct { func (x *ResetMissionControlResponse) Reset() { *x = ResetMissionControlResponse{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[7] + mi := &file_routerrpc_router_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1002,7 +1051,7 @@ func (x *ResetMissionControlResponse) String() string { func (*ResetMissionControlResponse) ProtoMessage() {} func (x *ResetMissionControlResponse) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[7] + mi := &file_routerrpc_router_proto_msgTypes[8] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1015,7 +1064,7 @@ func (x *ResetMissionControlResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ResetMissionControlResponse.ProtoReflect.Descriptor instead. func (*ResetMissionControlResponse) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{7} + return file_routerrpc_router_proto_rawDescGZIP(), []int{8} } type QueryMissionControlRequest struct { @@ -1027,7 +1076,7 @@ type QueryMissionControlRequest struct { func (x *QueryMissionControlRequest) Reset() { *x = QueryMissionControlRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[8] + mi := &file_routerrpc_router_proto_msgTypes[9] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1040,7 +1089,7 @@ func (x *QueryMissionControlRequest) String() string { func (*QueryMissionControlRequest) ProtoMessage() {} func (x *QueryMissionControlRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[8] + mi := &file_routerrpc_router_proto_msgTypes[9] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1053,7 +1102,7 @@ func (x *QueryMissionControlRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryMissionControlRequest.ProtoReflect.Descriptor instead. func (*QueryMissionControlRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{8} + return file_routerrpc_router_proto_rawDescGZIP(), []int{9} } // QueryMissionControlResponse contains mission control state. @@ -1069,7 +1118,7 @@ type QueryMissionControlResponse struct { func (x *QueryMissionControlResponse) Reset() { *x = QueryMissionControlResponse{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[9] + mi := &file_routerrpc_router_proto_msgTypes[10] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1082,7 +1131,7 @@ func (x *QueryMissionControlResponse) String() string { func (*QueryMissionControlResponse) ProtoMessage() {} func (x *QueryMissionControlResponse) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[9] + mi := &file_routerrpc_router_proto_msgTypes[10] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1095,7 +1144,7 @@ func (x *QueryMissionControlResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryMissionControlResponse.ProtoReflect.Descriptor instead. func (*QueryMissionControlResponse) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{9} + return file_routerrpc_router_proto_rawDescGZIP(), []int{10} } func (x *QueryMissionControlResponse) GetPairs() []*PairHistory { @@ -1121,7 +1170,7 @@ type XImportMissionControlRequest struct { func (x *XImportMissionControlRequest) Reset() { *x = XImportMissionControlRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[10] + mi := &file_routerrpc_router_proto_msgTypes[11] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1134,7 +1183,7 @@ func (x *XImportMissionControlRequest) String() string { func (*XImportMissionControlRequest) ProtoMessage() {} func (x *XImportMissionControlRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[10] + mi := &file_routerrpc_router_proto_msgTypes[11] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1147,7 +1196,7 @@ func (x *XImportMissionControlRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use XImportMissionControlRequest.ProtoReflect.Descriptor instead. func (*XImportMissionControlRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{10} + return file_routerrpc_router_proto_rawDescGZIP(), []int{11} } func (x *XImportMissionControlRequest) GetPairs() []*PairHistory { @@ -1173,7 +1222,7 @@ type XImportMissionControlResponse struct { func (x *XImportMissionControlResponse) Reset() { *x = XImportMissionControlResponse{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[11] + mi := &file_routerrpc_router_proto_msgTypes[12] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1186,7 +1235,7 @@ func (x *XImportMissionControlResponse) String() string { func (*XImportMissionControlResponse) ProtoMessage() {} func (x *XImportMissionControlResponse) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[11] + mi := &file_routerrpc_router_proto_msgTypes[12] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1199,7 +1248,7 @@ func (x *XImportMissionControlResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use XImportMissionControlResponse.ProtoReflect.Descriptor instead. func (*XImportMissionControlResponse) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{11} + return file_routerrpc_router_proto_rawDescGZIP(), []int{12} } // PairHistory contains the mission control state for a particular node pair. @@ -1218,7 +1267,7 @@ type PairHistory struct { func (x *PairHistory) Reset() { *x = PairHistory{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[12] + mi := &file_routerrpc_router_proto_msgTypes[13] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1231,7 +1280,7 @@ func (x *PairHistory) String() string { func (*PairHistory) ProtoMessage() {} func (x *PairHistory) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[12] + mi := &file_routerrpc_router_proto_msgTypes[13] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1244,7 +1293,7 @@ func (x *PairHistory) ProtoReflect() protoreflect.Message { // Deprecated: Use PairHistory.ProtoReflect.Descriptor instead. func (*PairHistory) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{12} + return file_routerrpc_router_proto_rawDescGZIP(), []int{13} } func (x *PairHistory) GetNodeFrom() []byte { @@ -1292,7 +1341,7 @@ type PairData struct { func (x *PairData) Reset() { *x = PairData{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[13] + mi := &file_routerrpc_router_proto_msgTypes[14] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1305,7 +1354,7 @@ func (x *PairData) String() string { func (*PairData) ProtoMessage() {} func (x *PairData) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[13] + mi := &file_routerrpc_router_proto_msgTypes[14] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1318,7 +1367,7 @@ func (x *PairData) ProtoReflect() protoreflect.Message { // Deprecated: Use PairData.ProtoReflect.Descriptor instead. func (*PairData) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{13} + return file_routerrpc_router_proto_rawDescGZIP(), []int{14} } func (x *PairData) GetFailTime() int64 { @@ -1372,7 +1421,7 @@ type GetMissionControlConfigRequest struct { func (x *GetMissionControlConfigRequest) Reset() { *x = GetMissionControlConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[14] + mi := &file_routerrpc_router_proto_msgTypes[15] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1385,7 +1434,7 @@ func (x *GetMissionControlConfigRequest) String() string { func (*GetMissionControlConfigRequest) ProtoMessage() {} func (x *GetMissionControlConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[14] + mi := &file_routerrpc_router_proto_msgTypes[15] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1398,7 +1447,7 @@ func (x *GetMissionControlConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMissionControlConfigRequest.ProtoReflect.Descriptor instead. func (*GetMissionControlConfigRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{14} + return file_routerrpc_router_proto_rawDescGZIP(), []int{15} } type GetMissionControlConfigResponse struct { @@ -1413,7 +1462,7 @@ type GetMissionControlConfigResponse struct { func (x *GetMissionControlConfigResponse) Reset() { *x = GetMissionControlConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[15] + mi := &file_routerrpc_router_proto_msgTypes[16] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1426,7 +1475,7 @@ func (x *GetMissionControlConfigResponse) String() string { func (*GetMissionControlConfigResponse) ProtoMessage() {} func (x *GetMissionControlConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[15] + mi := &file_routerrpc_router_proto_msgTypes[16] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1439,7 +1488,7 @@ func (x *GetMissionControlConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use GetMissionControlConfigResponse.ProtoReflect.Descriptor instead. func (*GetMissionControlConfigResponse) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{15} + return file_routerrpc_router_proto_rawDescGZIP(), []int{16} } func (x *GetMissionControlConfigResponse) GetConfig() *MissionControlConfig { @@ -1462,7 +1511,7 @@ type SetMissionControlConfigRequest struct { func (x *SetMissionControlConfigRequest) Reset() { *x = SetMissionControlConfigRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[16] + mi := &file_routerrpc_router_proto_msgTypes[17] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1475,7 +1524,7 @@ func (x *SetMissionControlConfigRequest) String() string { func (*SetMissionControlConfigRequest) ProtoMessage() {} func (x *SetMissionControlConfigRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[16] + mi := &file_routerrpc_router_proto_msgTypes[17] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1488,7 +1537,7 @@ func (x *SetMissionControlConfigRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SetMissionControlConfigRequest.ProtoReflect.Descriptor instead. func (*SetMissionControlConfigRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{16} + return file_routerrpc_router_proto_rawDescGZIP(), []int{17} } func (x *SetMissionControlConfigRequest) GetConfig() *MissionControlConfig { @@ -1507,7 +1556,7 @@ type SetMissionControlConfigResponse struct { func (x *SetMissionControlConfigResponse) Reset() { *x = SetMissionControlConfigResponse{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[17] + mi := &file_routerrpc_router_proto_msgTypes[18] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1520,7 +1569,7 @@ func (x *SetMissionControlConfigResponse) String() string { func (*SetMissionControlConfigResponse) ProtoMessage() {} func (x *SetMissionControlConfigResponse) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[17] + mi := &file_routerrpc_router_proto_msgTypes[18] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1533,7 +1582,7 @@ func (x *SetMissionControlConfigResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use SetMissionControlConfigResponse.ProtoReflect.Descriptor instead. func (*SetMissionControlConfigResponse) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{17} + return file_routerrpc_router_proto_rawDescGZIP(), []int{18} } type MissionControlConfig struct { @@ -1569,7 +1618,7 @@ type MissionControlConfig struct { func (x *MissionControlConfig) Reset() { *x = MissionControlConfig{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[18] + mi := &file_routerrpc_router_proto_msgTypes[19] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1582,7 +1631,7 @@ func (x *MissionControlConfig) String() string { func (*MissionControlConfig) ProtoMessage() {} func (x *MissionControlConfig) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[18] + mi := &file_routerrpc_router_proto_msgTypes[19] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1595,7 +1644,7 @@ func (x *MissionControlConfig) ProtoReflect() protoreflect.Message { // Deprecated: Use MissionControlConfig.ProtoReflect.Descriptor instead. func (*MissionControlConfig) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{18} + return file_routerrpc_router_proto_rawDescGZIP(), []int{19} } func (x *MissionControlConfig) GetHalfLifeSeconds() uint64 { @@ -1649,7 +1698,7 @@ type QueryProbabilityRequest struct { func (x *QueryProbabilityRequest) Reset() { *x = QueryProbabilityRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[19] + mi := &file_routerrpc_router_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1662,7 +1711,7 @@ func (x *QueryProbabilityRequest) String() string { func (*QueryProbabilityRequest) ProtoMessage() {} func (x *QueryProbabilityRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[19] + mi := &file_routerrpc_router_proto_msgTypes[20] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1675,7 +1724,7 @@ func (x *QueryProbabilityRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryProbabilityRequest.ProtoReflect.Descriptor instead. func (*QueryProbabilityRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{19} + return file_routerrpc_router_proto_rawDescGZIP(), []int{20} } func (x *QueryProbabilityRequest) GetFromNode() []byte { @@ -1713,7 +1762,7 @@ type QueryProbabilityResponse struct { func (x *QueryProbabilityResponse) Reset() { *x = QueryProbabilityResponse{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[20] + mi := &file_routerrpc_router_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1726,7 +1775,7 @@ func (x *QueryProbabilityResponse) String() string { func (*QueryProbabilityResponse) ProtoMessage() {} func (x *QueryProbabilityResponse) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[20] + mi := &file_routerrpc_router_proto_msgTypes[21] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1739,7 +1788,7 @@ func (x *QueryProbabilityResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use QueryProbabilityResponse.ProtoReflect.Descriptor instead. func (*QueryProbabilityResponse) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{20} + return file_routerrpc_router_proto_rawDescGZIP(), []int{21} } func (x *QueryProbabilityResponse) GetProbability() float64 { @@ -1780,7 +1829,7 @@ type BuildRouteRequest struct { func (x *BuildRouteRequest) Reset() { *x = BuildRouteRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[21] + mi := &file_routerrpc_router_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1793,7 +1842,7 @@ func (x *BuildRouteRequest) String() string { func (*BuildRouteRequest) ProtoMessage() {} func (x *BuildRouteRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[21] + mi := &file_routerrpc_router_proto_msgTypes[22] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1806,7 +1855,7 @@ func (x *BuildRouteRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use BuildRouteRequest.ProtoReflect.Descriptor instead. func (*BuildRouteRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{21} + return file_routerrpc_router_proto_rawDescGZIP(), []int{22} } func (x *BuildRouteRequest) GetAmtMsat() int64 { @@ -1856,7 +1905,7 @@ type BuildRouteResponse struct { func (x *BuildRouteResponse) Reset() { *x = BuildRouteResponse{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[22] + mi := &file_routerrpc_router_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1869,7 +1918,7 @@ func (x *BuildRouteResponse) String() string { func (*BuildRouteResponse) ProtoMessage() {} func (x *BuildRouteResponse) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[22] + mi := &file_routerrpc_router_proto_msgTypes[23] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1882,7 +1931,7 @@ func (x *BuildRouteResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use BuildRouteResponse.ProtoReflect.Descriptor instead. func (*BuildRouteResponse) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{22} + return file_routerrpc_router_proto_rawDescGZIP(), []int{23} } func (x *BuildRouteResponse) GetRoute() *lnrpc.Route { @@ -1901,7 +1950,7 @@ type SubscribeHtlcEventsRequest struct { func (x *SubscribeHtlcEventsRequest) Reset() { *x = SubscribeHtlcEventsRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[23] + mi := &file_routerrpc_router_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1914,7 +1963,7 @@ func (x *SubscribeHtlcEventsRequest) String() string { func (*SubscribeHtlcEventsRequest) ProtoMessage() {} func (x *SubscribeHtlcEventsRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[23] + mi := &file_routerrpc_router_proto_msgTypes[24] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1927,7 +1976,7 @@ func (x *SubscribeHtlcEventsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use SubscribeHtlcEventsRequest.ProtoReflect.Descriptor instead. func (*SubscribeHtlcEventsRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{23} + return file_routerrpc_router_proto_rawDescGZIP(), []int{24} } // HtlcEvent contains the htlc event that was processed. These are served on a @@ -1970,7 +2019,7 @@ type HtlcEvent struct { func (x *HtlcEvent) Reset() { *x = HtlcEvent{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[24] + mi := &file_routerrpc_router_proto_msgTypes[25] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -1983,7 +2032,7 @@ func (x *HtlcEvent) String() string { func (*HtlcEvent) ProtoMessage() {} func (x *HtlcEvent) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[24] + mi := &file_routerrpc_router_proto_msgTypes[25] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -1996,7 +2045,7 @@ func (x *HtlcEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use HtlcEvent.ProtoReflect.Descriptor instead. func (*HtlcEvent) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{24} + return file_routerrpc_router_proto_rawDescGZIP(), []int{25} } func (x *HtlcEvent) GetIncomingChannelId() uint64 { @@ -2122,7 +2171,7 @@ type HtlcInfo struct { func (x *HtlcInfo) Reset() { *x = HtlcInfo{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[25] + mi := &file_routerrpc_router_proto_msgTypes[26] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2135,7 +2184,7 @@ func (x *HtlcInfo) String() string { func (*HtlcInfo) ProtoMessage() {} func (x *HtlcInfo) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[25] + mi := &file_routerrpc_router_proto_msgTypes[26] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2148,7 +2197,7 @@ func (x *HtlcInfo) ProtoReflect() protoreflect.Message { // Deprecated: Use HtlcInfo.ProtoReflect.Descriptor instead. func (*HtlcInfo) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{25} + return file_routerrpc_router_proto_rawDescGZIP(), []int{26} } func (x *HtlcInfo) GetIncomingTimelock() uint32 { @@ -2191,7 +2240,7 @@ type ForwardEvent struct { func (x *ForwardEvent) Reset() { *x = ForwardEvent{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[26] + mi := &file_routerrpc_router_proto_msgTypes[27] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2204,7 +2253,7 @@ func (x *ForwardEvent) String() string { func (*ForwardEvent) ProtoMessage() {} func (x *ForwardEvent) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[26] + mi := &file_routerrpc_router_proto_msgTypes[27] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2217,7 +2266,7 @@ func (x *ForwardEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ForwardEvent.ProtoReflect.Descriptor instead. func (*ForwardEvent) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{26} + return file_routerrpc_router_proto_rawDescGZIP(), []int{27} } func (x *ForwardEvent) GetInfo() *HtlcInfo { @@ -2236,7 +2285,7 @@ type ForwardFailEvent struct { func (x *ForwardFailEvent) Reset() { *x = ForwardFailEvent{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[27] + mi := &file_routerrpc_router_proto_msgTypes[28] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2249,7 +2298,7 @@ func (x *ForwardFailEvent) String() string { func (*ForwardFailEvent) ProtoMessage() {} func (x *ForwardFailEvent) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[27] + mi := &file_routerrpc_router_proto_msgTypes[28] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2262,7 +2311,7 @@ func (x *ForwardFailEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use ForwardFailEvent.ProtoReflect.Descriptor instead. func (*ForwardFailEvent) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{27} + return file_routerrpc_router_proto_rawDescGZIP(), []int{28} } type SettleEvent struct { @@ -2277,7 +2326,7 @@ type SettleEvent struct { func (x *SettleEvent) Reset() { *x = SettleEvent{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[28] + mi := &file_routerrpc_router_proto_msgTypes[29] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2290,7 +2339,7 @@ func (x *SettleEvent) String() string { func (*SettleEvent) ProtoMessage() {} func (x *SettleEvent) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[28] + mi := &file_routerrpc_router_proto_msgTypes[29] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2303,7 +2352,7 @@ func (x *SettleEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use SettleEvent.ProtoReflect.Descriptor instead. func (*SettleEvent) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{28} + return file_routerrpc_router_proto_rawDescGZIP(), []int{29} } func (x *SettleEvent) GetPreimage() []byte { @@ -2333,7 +2382,7 @@ type LinkFailEvent struct { func (x *LinkFailEvent) Reset() { *x = LinkFailEvent{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[29] + mi := &file_routerrpc_router_proto_msgTypes[30] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2346,7 +2395,7 @@ func (x *LinkFailEvent) String() string { func (*LinkFailEvent) ProtoMessage() {} func (x *LinkFailEvent) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[29] + mi := &file_routerrpc_router_proto_msgTypes[30] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2359,7 +2408,7 @@ func (x *LinkFailEvent) ProtoReflect() protoreflect.Message { // Deprecated: Use LinkFailEvent.ProtoReflect.Descriptor instead. func (*LinkFailEvent) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{29} + return file_routerrpc_router_proto_rawDescGZIP(), []int{30} } func (x *LinkFailEvent) GetInfo() *HtlcInfo { @@ -2406,7 +2455,7 @@ type PaymentStatus struct { func (x *PaymentStatus) Reset() { *x = PaymentStatus{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[30] + mi := &file_routerrpc_router_proto_msgTypes[31] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2419,7 +2468,7 @@ func (x *PaymentStatus) String() string { func (*PaymentStatus) ProtoMessage() {} func (x *PaymentStatus) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[30] + mi := &file_routerrpc_router_proto_msgTypes[31] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2432,7 +2481,7 @@ func (x *PaymentStatus) ProtoReflect() protoreflect.Message { // Deprecated: Use PaymentStatus.ProtoReflect.Descriptor instead. func (*PaymentStatus) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{30} + return file_routerrpc_router_proto_rawDescGZIP(), []int{31} } func (x *PaymentStatus) GetState() PaymentState { @@ -2470,7 +2519,7 @@ type CircuitKey struct { func (x *CircuitKey) Reset() { *x = CircuitKey{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[31] + mi := &file_routerrpc_router_proto_msgTypes[32] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2483,7 +2532,7 @@ func (x *CircuitKey) String() string { func (*CircuitKey) ProtoMessage() {} func (x *CircuitKey) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[31] + mi := &file_routerrpc_router_proto_msgTypes[32] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2496,7 +2545,7 @@ func (x *CircuitKey) ProtoReflect() protoreflect.Message { // Deprecated: Use CircuitKey.ProtoReflect.Descriptor instead. func (*CircuitKey) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{31} + return file_routerrpc_router_proto_rawDescGZIP(), []int{32} } func (x *CircuitKey) GetChanId() uint64 { @@ -2546,7 +2595,7 @@ type ForwardHtlcInterceptRequest struct { func (x *ForwardHtlcInterceptRequest) Reset() { *x = ForwardHtlcInterceptRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[32] + mi := &file_routerrpc_router_proto_msgTypes[33] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2559,7 +2608,7 @@ func (x *ForwardHtlcInterceptRequest) String() string { func (*ForwardHtlcInterceptRequest) ProtoMessage() {} func (x *ForwardHtlcInterceptRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[32] + mi := &file_routerrpc_router_proto_msgTypes[33] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2572,7 +2621,7 @@ func (x *ForwardHtlcInterceptRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use ForwardHtlcInterceptRequest.ProtoReflect.Descriptor instead. func (*ForwardHtlcInterceptRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{32} + return file_routerrpc_router_proto_rawDescGZIP(), []int{33} } func (x *ForwardHtlcInterceptRequest) GetIncomingCircuitKey() *CircuitKey { @@ -2675,7 +2724,7 @@ type ForwardHtlcInterceptResponse struct { func (x *ForwardHtlcInterceptResponse) Reset() { *x = ForwardHtlcInterceptResponse{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[33] + mi := &file_routerrpc_router_proto_msgTypes[34] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2688,7 +2737,7 @@ func (x *ForwardHtlcInterceptResponse) String() string { func (*ForwardHtlcInterceptResponse) ProtoMessage() {} func (x *ForwardHtlcInterceptResponse) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[33] + mi := &file_routerrpc_router_proto_msgTypes[34] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2701,7 +2750,7 @@ func (x *ForwardHtlcInterceptResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use ForwardHtlcInterceptResponse.ProtoReflect.Descriptor instead. func (*ForwardHtlcInterceptResponse) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{33} + return file_routerrpc_router_proto_rawDescGZIP(), []int{34} } func (x *ForwardHtlcInterceptResponse) GetIncomingCircuitKey() *CircuitKey { @@ -2751,7 +2800,7 @@ type UpdateChanStatusRequest struct { func (x *UpdateChanStatusRequest) Reset() { *x = UpdateChanStatusRequest{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[34] + mi := &file_routerrpc_router_proto_msgTypes[35] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2764,7 +2813,7 @@ func (x *UpdateChanStatusRequest) String() string { func (*UpdateChanStatusRequest) ProtoMessage() {} func (x *UpdateChanStatusRequest) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[34] + mi := &file_routerrpc_router_proto_msgTypes[35] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2777,7 +2826,7 @@ func (x *UpdateChanStatusRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateChanStatusRequest.ProtoReflect.Descriptor instead. func (*UpdateChanStatusRequest) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{34} + return file_routerrpc_router_proto_rawDescGZIP(), []int{35} } func (x *UpdateChanStatusRequest) GetChanPoint() *lnrpc.ChannelPoint { @@ -2803,7 +2852,7 @@ type UpdateChanStatusResponse struct { func (x *UpdateChanStatusResponse) Reset() { *x = UpdateChanStatusResponse{} if protoimpl.UnsafeEnabled { - mi := &file_routerrpc_router_proto_msgTypes[35] + mi := &file_routerrpc_router_proto_msgTypes[36] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -2816,7 +2865,7 @@ func (x *UpdateChanStatusResponse) String() string { func (*UpdateChanStatusResponse) ProtoMessage() {} func (x *UpdateChanStatusResponse) ProtoReflect() protoreflect.Message { - mi := &file_routerrpc_router_proto_msgTypes[35] + mi := &file_routerrpc_router_proto_msgTypes[36] if protoimpl.UnsafeEnabled && x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -2829,7 +2878,7 @@ func (x *UpdateChanStatusResponse) ProtoReflect() protoreflect.Message { // Deprecated: Use UpdateChanStatusResponse.ProtoReflect.Descriptor instead. func (*UpdateChanStatusResponse) Descriptor() ([]byte, []int) { - return file_routerrpc_router_proto_rawDescGZIP(), []int{35} + return file_routerrpc_router_proto_rawDescGZIP(), []int{36} } var File_routerrpc_router_proto protoreflect.FileDescriptor @@ -2908,438 +2957,447 @@ var file_routerrpc_router_proto_rawDesc = []byte{ 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x13, 0x6e, 0x6f, 0x5f, 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x6e, 0x6f, 0x49, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x3e, 0x0a, 0x0f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x46, 0x65, - 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, 0x64, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, - 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, - 0x6d, 0x74, 0x53, 0x61, 0x74, 0x22, 0x64, 0x0a, 0x10, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x46, 0x65, - 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x6f, 0x75, - 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x65, 0x65, 0x4d, - 0x73, 0x61, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, - 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, - 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x44, 0x65, 0x6c, 0x61, 0x79, 0x22, 0x7f, 0x0a, 0x12, 0x53, - 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, - 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x52, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x6b, 0x69, 0x70, - 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x65, 0x72, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, - 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x6d, 0x70, 0x45, 0x72, 0x72, 0x22, 0x5b, 0x0a, 0x13, - 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, - 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, - 0x28, 0x0a, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, - 0x32, 0x0e, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, - 0x52, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x73, - 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, - 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0x51, 0x0a, 0x1b, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x05, 0x70, 0x61, 0x69, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x50, - 0x61, 0x69, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x05, 0x70, 0x61, 0x69, 0x72, - 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, 0x62, 0x0a, 0x1c, 0x58, 0x49, 0x6d, 0x70, 0x6f, - 0x72, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2c, 0x0a, 0x05, 0x70, 0x61, 0x69, 0x72, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, - 0x70, 0x63, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x05, - 0x70, 0x61, 0x69, 0x72, 0x73, 0x12, 0x14, 0x0a, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x58, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8a, 0x01, 0x0a, - 0x0b, 0x50, 0x61, 0x69, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, - 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x72, 0x6f, 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, - 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x72, 0x6f, 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, - 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, - 0x54, 0x6f, 0x12, 0x2d, 0x0a, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, - 0x50, 0x61, 0x69, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, - 0x79, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, - 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, 0x07, 0x22, 0xe8, 0x01, 0x0a, 0x08, 0x50, 0x61, - 0x69, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x61, 0x69, 0x6c, 0x5f, 0x74, - 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x66, 0x61, 0x69, 0x6c, 0x54, - 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x6d, 0x74, 0x5f, - 0x73, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x66, 0x61, 0x69, 0x6c, 0x41, - 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x22, 0x0a, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x6d, - 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x66, 0x61, - 0x69, 0x6c, 0x41, 0x6d, 0x74, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x75, 0x63, - 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, - 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x41, 0x6d, - 0x74, 0x53, 0x61, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, - 0x61, 0x6d, 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, - 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x41, 0x6d, 0x74, 0x4d, 0x73, 0x61, 0x74, 0x4a, 0x04, - 0x08, 0x03, 0x10, 0x04, 0x22, 0x20, 0x0a, 0x1e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5a, 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x63, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x6f, 0x75, 0x74, - 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x22, 0x59, 0x0a, 0x1e, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, - 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, - 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, - 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x21, 0x0a, - 0x1f, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x22, 0x80, 0x02, 0x0a, 0x14, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, - 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x2a, 0x0a, 0x11, 0x68, 0x61, 0x6c, - 0x66, 0x5f, 0x6c, 0x69, 0x66, 0x65, 0x5f, 0x73, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x68, 0x61, 0x6c, 0x66, 0x4c, 0x69, 0x66, 0x65, 0x53, 0x65, - 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x27, 0x0a, 0x0f, 0x68, 0x6f, 0x70, 0x5f, 0x70, 0x72, 0x6f, - 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, - 0x68, 0x6f, 0x70, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x16, - 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, - 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x36, 0x0a, 0x17, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, - 0x6d, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, - 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x15, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, - 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x43, - 0x0a, 0x1e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, - 0x65, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, - 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1b, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x46, - 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x6c, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x76, 0x61, 0x6c, 0x22, 0x6a, 0x0a, 0x17, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x62, - 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, - 0x0a, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, - 0x6f, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x6f, - 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x6d, 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x61, 0x6d, 0x74, 0x4d, 0x73, 0x61, 0x74, 0x22, - 0x6b, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, - 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, - 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, - 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x2d, 0x0a, - 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, - 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x44, - 0x61, 0x74, 0x61, 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x22, 0xca, 0x01, 0x0a, - 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x6d, 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x61, 0x6d, 0x74, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x28, 0x0a, - 0x10, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x63, 0x6c, 0x74, 0x76, 0x5f, 0x64, 0x65, 0x6c, 0x74, - 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x43, 0x6c, - 0x74, 0x76, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x2c, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x67, 0x6f, - 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, - 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x43, - 0x68, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, 0x0b, 0x68, 0x6f, 0x70, 0x5f, 0x70, 0x75, 0x62, - 0x6b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0c, 0x52, 0x0a, 0x68, 0x6f, 0x70, 0x50, - 0x75, 0x62, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, - 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x61, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, 0x72, 0x22, 0x38, 0x0a, 0x12, 0x42, 0x75, 0x69, - 0x6c, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x22, 0x0a, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, - 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x05, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, - 0x48, 0x74, 0x6c, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x22, 0xf6, 0x04, 0x0a, 0x09, 0x48, 0x74, 0x6c, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x69, 0x6e, - 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, - 0x2e, 0x0a, 0x13, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x6e, - 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x6f, 0x75, - 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, - 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x74, 0x6c, 0x63, - 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6f, 0x6d, - 0x69, 0x6e, 0x67, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x75, 0x74, - 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x48, 0x74, 0x6c, - 0x63, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, - 0x5f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, - 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x73, 0x12, 0x3d, 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x72, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x74, 0x6c, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, - 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, 0x0d, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, - 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0c, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4b, 0x0a, 0x12, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, - 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x6f, - 0x72, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, - 0x52, 0x10, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0c, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, - 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, - 0x42, 0x0a, 0x0f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x5f, 0x65, 0x76, 0x65, - 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x18, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x72, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x6e, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x45, 0x76, 0x65, - 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x6c, 0x69, 0x6e, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x22, 0x3c, 0x0a, 0x09, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, - 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, - 0x04, 0x53, 0x45, 0x4e, 0x44, 0x10, 0x01, 0x12, 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x43, 0x45, 0x49, - 0x56, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x10, - 0x03, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x22, 0xbc, 0x01, 0x0a, 0x08, 0x48, - 0x74, 0x6c, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6f, 0x6d, - 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0d, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, - 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, - 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x10, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x6f, 0x63, - 0x6b, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6d, - 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x69, 0x6e, - 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x74, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x2a, 0x0a, - 0x11, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x6d, 0x73, - 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, - 0x6e, 0x67, 0x41, 0x6d, 0x74, 0x4d, 0x73, 0x61, 0x74, 0x22, 0x37, 0x0a, 0x0c, 0x46, 0x6f, 0x72, - 0x77, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x6e, 0x66, - 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, - 0x72, 0x70, 0x63, 0x2e, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, - 0x66, 0x6f, 0x22, 0x12, 0x0a, 0x10, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x69, - 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x29, 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, - 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x0d, 0x4c, 0x69, 0x6e, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x74, - 0x6c, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0c, - 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, - 0x72, 0x65, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0b, - 0x77, 0x69, 0x72, 0x65, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x66, - 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x64, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, - 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x0d, 0x66, - 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x25, 0x0a, 0x0e, - 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x53, 0x74, 0x72, - 0x69, 0x6e, 0x67, 0x22, 0x8a, 0x01, 0x0a, 0x0d, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, - 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, - 0x12, 0x28, 0x0a, 0x05, 0x68, 0x74, 0x6c, 0x63, 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x54, 0x4c, 0x43, 0x41, 0x74, 0x74, 0x65, - 0x6d, 0x70, 0x74, 0x52, 0x05, 0x68, 0x74, 0x6c, 0x63, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, - 0x22, 0x3e, 0x0a, 0x0a, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x17, - 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, - 0x06, 0x63, 0x68, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x17, 0x0a, 0x07, 0x68, 0x74, 0x6c, 0x63, 0x5f, - 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x68, 0x74, 0x6c, 0x63, 0x49, 0x64, - 0x22, 0xbf, 0x04, 0x0a, 0x1b, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x48, 0x74, 0x6c, 0x63, - 0x49, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x12, 0x47, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x69, 0x72, - 0x63, 0x75, 0x69, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, - 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x69, 0x72, 0x63, 0x75, - 0x69, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, - 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, - 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x73, 0x61, - 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, - 0x67, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x69, - 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x06, - 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x45, 0x78, - 0x70, 0x69, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, - 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x61, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x3b, 0x0a, 0x1a, 0x6f, 0x75, 0x74, 0x67, 0x6f, - 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x68, - 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x6f, 0x75, 0x74, - 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x68, - 0x61, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, - 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x12, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x6f, 0x75, - 0x6e, 0x74, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, - 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, - 0x0e, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, - 0x60, 0x0a, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, - 0x72, 0x70, 0x63, 0x2e, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x48, 0x74, 0x6c, 0x63, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, - 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, - 0x72, 0x79, 0x52, 0x0d, 0x63, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x6e, 0x69, 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, - 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6f, 0x6e, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x62, - 0x1a, 0x40, 0x0a, 0x12, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, - 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, - 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, - 0x38, 0x01, 0x22, 0xa8, 0x02, 0x0a, 0x1c, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x48, 0x74, - 0x6c, 0x63, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, - 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x5f, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x69, - 0x72, 0x63, 0x75, 0x69, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x12, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, - 0x6e, 0x67, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x06, - 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x72, - 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, - 0x48, 0x6f, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, - 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x65, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x72, 0x65, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, - 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, - 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x4d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, - 0x0a, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x61, 0x69, - 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x64, 0x65, - 0x52, 0x0b, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x82, 0x01, - 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x74, - 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x32, 0x0a, 0x0a, 0x63, 0x68, 0x61, - 0x6e, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, - 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f, 0x69, - 0x6e, 0x74, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x33, 0x0a, - 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, - 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x81, - 0x04, 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, - 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, - 0x09, 0x4e, 0x4f, 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, - 0x4f, 0x4e, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, 0x43, 0x4f, 0x44, 0x45, 0x10, 0x02, 0x12, 0x15, - 0x0a, 0x11, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x45, 0x4c, 0x49, 0x47, 0x49, - 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, 0x10, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x49, - 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x48, - 0x54, 0x4c, 0x43, 0x5f, 0x45, 0x58, 0x43, 0x45, 0x45, 0x44, 0x53, 0x5f, 0x4d, 0x41, 0x58, 0x10, - 0x05, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, - 0x54, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x49, - 0x4e, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, - 0x44, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x48, 0x54, 0x4c, 0x43, 0x5f, 0x41, 0x44, 0x44, 0x5f, - 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x08, 0x12, 0x15, 0x0a, 0x11, 0x46, 0x4f, 0x52, 0x57, - 0x41, 0x52, 0x44, 0x53, 0x5f, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x09, 0x12, - 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, - 0x4c, 0x45, 0x44, 0x10, 0x0a, 0x12, 0x15, 0x0a, 0x11, 0x49, 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, - 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x52, 0x50, 0x41, 0x49, 0x44, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, - 0x49, 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x5f, 0x54, - 0x4f, 0x4f, 0x5f, 0x53, 0x4f, 0x4f, 0x4e, 0x10, 0x0c, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, - 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x0d, 0x12, - 0x17, 0x0a, 0x13, 0x4d, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x54, - 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x0e, 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44, 0x44, 0x52, - 0x45, 0x53, 0x53, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x0f, 0x12, 0x16, - 0x0a, 0x12, 0x53, 0x45, 0x54, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x4d, 0x49, 0x53, 0x4d, - 0x41, 0x54, 0x43, 0x48, 0x10, 0x10, 0x12, 0x15, 0x0a, 0x11, 0x53, 0x45, 0x54, 0x5f, 0x54, 0x4f, - 0x54, 0x41, 0x4c, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x4c, 0x4f, 0x57, 0x10, 0x11, 0x12, 0x10, 0x0a, - 0x0c, 0x53, 0x45, 0x54, 0x5f, 0x4f, 0x56, 0x45, 0x52, 0x50, 0x41, 0x49, 0x44, 0x10, 0x12, 0x12, - 0x13, 0x0a, 0x0f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x5f, 0x49, 0x4e, 0x56, 0x4f, 0x49, - 0x43, 0x45, 0x10, 0x13, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, - 0x4b, 0x45, 0x59, 0x53, 0x45, 0x4e, 0x44, 0x10, 0x14, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x50, 0x50, - 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, 0x52, 0x45, 0x53, 0x53, 0x10, 0x15, 0x12, 0x12, - 0x0a, 0x0e, 0x43, 0x49, 0x52, 0x43, 0x55, 0x4c, 0x41, 0x52, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x45, - 0x10, 0x16, 0x2a, 0xae, 0x01, 0x0a, 0x0c, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, - 0x61, 0x74, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x5f, 0x46, 0x4c, 0x49, 0x47, 0x48, 0x54, - 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, - 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x54, 0x49, 0x4d, 0x45, - 0x4f, 0x55, 0x54, 0x10, 0x02, 0x12, 0x13, 0x0a, 0x0f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, - 0x4e, 0x4f, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x45, 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x41, - 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x45, 0x52, 0x52, 0x4f, 0x52, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, - 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, - 0x5f, 0x50, 0x41, 0x59, 0x4d, 0x45, 0x4e, 0x54, 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x53, - 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x53, - 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, - 0x45, 0x10, 0x06, 0x2a, 0x3c, 0x0a, 0x18, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x48, 0x6f, - 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x0a, 0x0a, 0x06, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, - 0x41, 0x49, 0x4c, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x52, 0x45, 0x53, 0x55, 0x4d, 0x45, 0x10, - 0x02, 0x2a, 0x35, 0x0a, 0x10, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x41, - 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x49, 0x53, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, - 0x0a, 0x04, 0x41, 0x55, 0x54, 0x4f, 0x10, 0x02, 0x32, 0xf1, 0x0b, 0x0a, 0x06, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x50, 0x61, 0x79, 0x6d, 0x65, - 0x6e, 0x74, 0x56, 0x32, 0x12, 0x1d, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, - 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x79, 0x6d, - 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x0e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x61, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32, 0x12, 0x1e, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, - 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, - 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x4b, 0x0a, 0x10, 0x45, 0x73, 0x74, - 0x69, 0x6d, 0x61, 0x74, 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x46, 0x65, 0x65, 0x12, 0x1a, 0x2e, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x46, - 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x6f, 0x75, 0x74, - 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, - 0x52, 0x6f, 0x75, 0x74, 0x65, 0x12, 0x1d, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, - 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1e, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, - 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x53, 0x65, 0x6e, - 0x64, 0x54, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x56, 0x32, 0x12, 0x1d, 0x2e, 0x72, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x52, 0x6f, 0x75, - 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6c, 0x6e, 0x72, 0x70, - 0x63, 0x2e, 0x48, 0x54, 0x4c, 0x43, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x64, 0x0a, - 0x13, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x25, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, - 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4d, 0x69, 0x73, - 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x25, 0x2e, 0x72, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, - 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x15, 0x58, 0x49, 0x6d, - 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, - 0x6f, 0x6c, 0x12, 0x27, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x58, - 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, - 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x58, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, - 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, - 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x12, 0x29, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, - 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x6f, - 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, - 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x4d, 0x69, + 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x46, 0x0a, 0x14, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x61, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x2e, 0x0a, + 0x13, 0x6e, 0x6f, 0x5f, 0x69, 0x6e, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x5f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x11, 0x6e, 0x6f, 0x49, 0x6e, + 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x73, 0x22, 0x3e, 0x0a, + 0x0f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x12, 0x12, 0x0a, 0x04, 0x64, 0x65, 0x73, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x04, + 0x64, 0x65, 0x73, 0x74, 0x12, 0x17, 0x0a, 0x07, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x06, 0x61, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x22, 0x64, 0x0a, + 0x10, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x65, 0x65, + 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x72, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x46, 0x65, 0x65, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x74, + 0x69, 0x6d, 0x65, 0x5f, 0x6c, 0x6f, 0x63, 0x6b, 0x5f, 0x64, 0x65, 0x6c, 0x61, 0x79, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x74, 0x69, 0x6d, 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x44, 0x65, + 0x6c, 0x61, 0x79, 0x22, 0x7f, 0x0a, 0x12, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x52, 0x6f, 0x75, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x61, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x0b, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, 0x22, 0x0a, 0x05, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6c, 0x6e, + 0x72, 0x70, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x12, 0x22, 0x0a, 0x0d, 0x73, 0x6b, 0x69, 0x70, 0x5f, 0x74, 0x65, 0x6d, 0x70, 0x5f, 0x65, 0x72, + 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x73, 0x6b, 0x69, 0x70, 0x54, 0x65, 0x6d, + 0x70, 0x45, 0x72, 0x72, 0x22, 0x5b, 0x0a, 0x13, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x52, 0x6f, + 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x70, + 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, + 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0e, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, + 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x07, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, + 0x1d, 0x0a, 0x1b, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x1c, + 0x0a, 0x1a, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x51, 0x0a, 0x1b, + 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2c, 0x0a, 0x05, 0x70, + 0x61, 0x69, 0x72, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x75, + 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x48, 0x69, 0x73, 0x74, 0x6f, + 0x72, 0x79, 0x52, 0x05, 0x70, 0x61, 0x69, 0x72, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x22, + 0x62, 0x0a, 0x1c, 0x58, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x2c, 0x0a, 0x05, 0x70, 0x61, 0x69, 0x72, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, + 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x48, + 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x52, 0x05, 0x70, 0x61, 0x69, 0x72, 0x73, 0x12, 0x14, 0x0a, + 0x05, 0x66, 0x6f, 0x72, 0x63, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x05, 0x66, 0x6f, + 0x72, 0x63, 0x65, 0x22, 0x1f, 0x0a, 0x1d, 0x58, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x8a, 0x01, 0x0a, 0x0b, 0x50, 0x61, 0x69, 0x72, 0x48, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x12, 0x1b, 0x0a, 0x09, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x66, 0x72, 0x6f, + 0x6d, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x6e, 0x6f, 0x64, 0x65, 0x46, 0x72, 0x6f, + 0x6d, 0x12, 0x17, 0x0a, 0x07, 0x6e, 0x6f, 0x64, 0x65, 0x5f, 0x74, 0x6f, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x06, 0x6e, 0x6f, 0x64, 0x65, 0x54, 0x6f, 0x12, 0x2d, 0x0a, 0x07, 0x68, 0x69, + 0x73, 0x74, 0x6f, 0x72, 0x79, 0x18, 0x07, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x44, 0x61, 0x74, 0x61, + 0x52, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, + 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x4a, 0x04, 0x08, 0x06, 0x10, + 0x07, 0x22, 0xe8, 0x01, 0x0a, 0x08, 0x50, 0x61, 0x69, 0x72, 0x44, 0x61, 0x74, 0x61, 0x12, 0x1b, + 0x0a, 0x09, 0x66, 0x61, 0x69, 0x6c, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x08, 0x66, 0x61, 0x69, 0x6c, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x66, + 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x03, 0x52, 0x0a, 0x66, 0x61, 0x69, 0x6c, 0x41, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x22, 0x0a, + 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x66, 0x61, 0x69, 0x6c, 0x41, 0x6d, 0x74, 0x4d, 0x73, 0x61, + 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x74, 0x69, 0x6d, + 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, + 0x54, 0x69, 0x6d, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, + 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x73, + 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x41, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x28, 0x0a, 0x10, + 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, + 0x18, 0x07, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x73, 0x75, 0x63, 0x63, 0x65, 0x73, 0x73, 0x41, + 0x6d, 0x74, 0x4d, 0x73, 0x61, 0x74, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x20, 0x0a, 0x1e, + 0x47, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, + 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x5a, + 0x0a, 0x1f, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, + 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x37, 0x0a, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1f, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x29, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, - 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, - 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, - 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x73, + 0x69, 0x67, 0x52, 0x06, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x59, 0x0a, 0x1e, 0x53, 0x65, + 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x37, 0x0a, 0x06, + 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1f, 0x2e, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x06, 0x63, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x22, 0x21, 0x0a, 0x1f, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x80, 0x02, 0x0a, 0x14, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, - 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x10, 0x51, 0x75, 0x65, - 0x72, 0x79, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, + 0x67, 0x12, 0x2a, 0x0a, 0x11, 0x68, 0x61, 0x6c, 0x66, 0x5f, 0x6c, 0x69, 0x66, 0x65, 0x5f, 0x73, + 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x68, 0x61, + 0x6c, 0x66, 0x4c, 0x69, 0x66, 0x65, 0x53, 0x65, 0x63, 0x6f, 0x6e, 0x64, 0x73, 0x12, 0x27, 0x0a, + 0x0f, 0x68, 0x6f, 0x70, 0x5f, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x02, 0x52, 0x0e, 0x68, 0x6f, 0x70, 0x50, 0x72, 0x6f, 0x62, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x16, 0x0a, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x02, 0x52, 0x06, 0x77, 0x65, 0x69, 0x67, 0x68, 0x74, 0x12, 0x36, + 0x0a, 0x17, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x5f, 0x72, 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, + 0x15, 0x6d, 0x61, 0x78, 0x69, 0x6d, 0x75, 0x6d, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x73, 0x75, 0x6c, 0x74, 0x73, 0x12, 0x43, 0x0a, 0x1e, 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, + 0x6d, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x6c, 0x61, 0x78, 0x5f, + 0x69, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x1b, + 0x6d, 0x69, 0x6e, 0x69, 0x6d, 0x75, 0x6d, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, + 0x6c, 0x61, 0x78, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x76, 0x61, 0x6c, 0x22, 0x6a, 0x0a, 0x17, 0x51, + 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x1b, 0x0a, 0x09, 0x66, 0x72, 0x6f, 0x6d, 0x5f, 0x6e, + 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, 0x66, 0x72, 0x6f, 0x6d, 0x4e, + 0x6f, 0x64, 0x65, 0x12, 0x17, 0x0a, 0x07, 0x74, 0x6f, 0x5f, 0x6e, 0x6f, 0x64, 0x65, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x74, 0x6f, 0x4e, 0x6f, 0x64, 0x65, 0x12, 0x19, 0x0a, 0x08, + 0x61, 0x6d, 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, + 0x61, 0x6d, 0x74, 0x4d, 0x73, 0x61, 0x74, 0x22, 0x6b, 0x0a, 0x18, 0x51, 0x75, 0x65, 0x72, 0x79, + 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, + 0x74, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x01, 0x52, 0x0b, 0x70, 0x72, 0x6f, 0x62, 0x61, 0x62, + 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x2d, 0x0a, 0x07, 0x68, 0x69, 0x73, 0x74, 0x6f, 0x72, 0x79, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, + 0x70, 0x63, 0x2e, 0x50, 0x61, 0x69, 0x72, 0x44, 0x61, 0x74, 0x61, 0x52, 0x07, 0x68, 0x69, 0x73, + 0x74, 0x6f, 0x72, 0x79, 0x22, 0xca, 0x01, 0x0a, 0x11, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, + 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x61, 0x6d, + 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x07, 0x61, 0x6d, + 0x74, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x5f, 0x63, + 0x6c, 0x74, 0x76, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0e, 0x66, 0x69, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x74, 0x76, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, + 0x2c, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x6e, + 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x42, 0x02, 0x30, 0x01, 0x52, 0x0e, 0x6f, + 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x1f, 0x0a, + 0x0b, 0x68, 0x6f, 0x70, 0x5f, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x73, 0x18, 0x04, 0x20, 0x03, + 0x28, 0x0c, 0x52, 0x0a, 0x68, 0x6f, 0x70, 0x50, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x73, 0x12, 0x21, + 0x0a, 0x0c, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x41, 0x64, 0x64, + 0x72, 0x22, 0x38, 0x0a, 0x12, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x22, 0x0a, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x0c, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x52, 0x05, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x22, 0x1c, 0x0a, 0x1a, 0x53, + 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x48, 0x74, 0x6c, 0x63, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xf6, 0x04, 0x0a, 0x09, 0x48, 0x74, + 0x6c, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x69, 0x6e, 0x63, 0x6f, 0x6d, + 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x13, 0x6f, 0x75, 0x74, 0x67, 0x6f, + 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x28, 0x0a, 0x10, 0x69, 0x6e, 0x63, 0x6f, 0x6d, + 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0e, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x48, 0x74, 0x6c, 0x63, 0x49, + 0x64, 0x12, 0x28, 0x0a, 0x10, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x68, 0x74, + 0x6c, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6f, 0x75, 0x74, + 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x74, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x5f, 0x6e, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x4e, 0x73, 0x12, 0x3d, + 0x0a, 0x0a, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x0e, 0x32, 0x1e, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x48, + 0x74, 0x6c, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x2e, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, + 0x70, 0x65, 0x52, 0x09, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3e, 0x0a, + 0x0d, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x07, + 0x20, 0x01, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, + 0x2e, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, + 0x0c, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x4b, 0x0a, + 0x12, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x5f, 0x66, 0x61, 0x69, 0x6c, 0x5f, 0x65, 0x76, + 0x65, 0x6e, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1b, 0x2e, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x69, + 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x10, 0x66, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x46, 0x61, 0x69, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x3b, 0x0a, 0x0c, 0x73, 0x65, + 0x74, 0x74, 0x6c, 0x65, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x16, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, + 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0b, 0x73, 0x65, 0x74, 0x74, + 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x42, 0x0a, 0x0f, 0x6c, 0x69, 0x6e, 0x6b, 0x5f, + 0x66, 0x61, 0x69, 0x6c, 0x5f, 0x65, 0x76, 0x65, 0x6e, 0x74, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x18, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x6e, + 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x48, 0x00, 0x52, 0x0d, 0x6c, 0x69, + 0x6e, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x3c, 0x0a, 0x09, 0x45, + 0x76, 0x65, 0x6e, 0x74, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x53, 0x45, 0x4e, 0x44, 0x10, 0x01, 0x12, + 0x0b, 0x0a, 0x07, 0x52, 0x45, 0x43, 0x45, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, + 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x10, 0x03, 0x42, 0x07, 0x0a, 0x05, 0x65, 0x76, 0x65, + 0x6e, 0x74, 0x22, 0xbc, 0x01, 0x0a, 0x08, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x12, + 0x2b, 0x0a, 0x11, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, + 0x6c, 0x6f, 0x63, 0x6b, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x69, 0x6e, 0x63, 0x6f, + 0x6d, 0x69, 0x6e, 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2b, 0x0a, 0x11, + 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x6c, 0x6f, 0x63, + 0x6b, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x10, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, + 0x67, 0x54, 0x69, 0x6d, 0x65, 0x6c, 0x6f, 0x63, 0x6b, 0x12, 0x2a, 0x0a, 0x11, 0x69, 0x6e, 0x63, + 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x41, 0x6d, + 0x74, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, + 0x67, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0f, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x74, 0x4d, 0x73, 0x61, + 0x74, 0x22, 0x37, 0x0a, 0x0c, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x13, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x74, 0x6c, 0x63, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, 0x69, 0x6e, 0x66, 0x6f, 0x22, 0x12, 0x0a, 0x10, 0x46, 0x6f, + 0x72, 0x77, 0x61, 0x72, 0x64, 0x46, 0x61, 0x69, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x22, 0x29, + 0x0a, 0x0b, 0x53, 0x65, 0x74, 0x74, 0x6c, 0x65, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x1a, 0x0a, + 0x08, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x08, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x22, 0xdf, 0x01, 0x0a, 0x0d, 0x4c, 0x69, + 0x6e, 0x6b, 0x46, 0x61, 0x69, 0x6c, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x27, 0x0a, 0x04, 0x69, + 0x6e, 0x66, 0x6f, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x04, + 0x69, 0x6e, 0x66, 0x6f, 0x12, 0x3d, 0x0a, 0x0c, 0x77, 0x69, 0x72, 0x65, 0x5f, 0x66, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6c, 0x6e, 0x72, + 0x70, 0x63, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x77, 0x69, 0x72, 0x65, 0x46, 0x61, 0x69, 0x6c, + 0x75, 0x72, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x64, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x18, 0x2e, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, + 0x65, 0x74, 0x61, 0x69, 0x6c, 0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x44, 0x65, + 0x74, 0x61, 0x69, 0x6c, 0x12, 0x25, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, + 0x73, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x66, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x53, 0x74, 0x72, 0x69, 0x6e, 0x67, 0x22, 0x8a, 0x01, 0x0a, 0x0d, + 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, + 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x17, 0x2e, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x08, + 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x68, 0x74, 0x6c, 0x63, + 0x73, 0x18, 0x04, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, + 0x48, 0x54, 0x4c, 0x43, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x52, 0x05, 0x68, 0x74, 0x6c, + 0x63, 0x73, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x22, 0x3e, 0x0a, 0x0a, 0x43, 0x69, 0x72, 0x63, + 0x75, 0x69, 0x74, 0x4b, 0x65, 0x79, 0x12, 0x17, 0x0a, 0x07, 0x63, 0x68, 0x61, 0x6e, 0x5f, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x63, 0x68, 0x61, 0x6e, 0x49, 0x64, 0x12, + 0x17, 0x0a, 0x07, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x06, 0x68, 0x74, 0x6c, 0x63, 0x49, 0x64, 0x22, 0xbf, 0x04, 0x0a, 0x1b, 0x46, 0x6f, 0x72, + 0x77, 0x61, 0x72, 0x64, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x47, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x6f, + 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x5f, 0x6b, 0x65, 0x79, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, + 0x70, 0x63, 0x2e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x4b, 0x65, 0x79, 0x52, 0x12, 0x69, + 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x4b, 0x65, + 0x79, 0x12, 0x30, 0x0a, 0x14, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x12, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4d, + 0x73, 0x61, 0x74, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, + 0x65, 0x78, 0x70, 0x69, 0x72, 0x79, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x69, 0x6e, + 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x21, 0x0a, 0x0c, + 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x68, 0x61, 0x73, 0x68, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0c, 0x52, 0x0b, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x48, 0x61, 0x73, 0x68, 0x12, + 0x3b, 0x0a, 0x1a, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x72, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x65, 0x64, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x5f, 0x69, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x17, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x65, 0x64, 0x43, 0x68, 0x61, 0x6e, 0x49, 0x64, 0x12, 0x30, 0x0a, 0x14, + 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, + 0x6d, 0x73, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x12, 0x6f, 0x75, 0x74, 0x67, + 0x6f, 0x69, 0x6e, 0x67, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x27, + 0x0a, 0x0f, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x65, 0x78, 0x70, 0x69, 0x72, + 0x79, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x0e, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, + 0x67, 0x45, 0x78, 0x70, 0x69, 0x72, 0x79, 0x12, 0x60, 0x0a, 0x0e, 0x63, 0x75, 0x73, 0x74, 0x6f, + 0x6d, 0x5f, 0x72, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x18, 0x08, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x39, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x2e, 0x43, 0x75, 0x73, 0x74, 0x6f, 0x6d, 0x52, 0x65, + 0x63, 0x6f, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x52, 0x0d, 0x63, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x6f, 0x6e, 0x69, + 0x6f, 0x6e, 0x5f, 0x62, 0x6c, 0x6f, 0x62, 0x18, 0x09, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x09, 0x6f, + 0x6e, 0x69, 0x6f, 0x6e, 0x42, 0x6c, 0x6f, 0x62, 0x1a, 0x40, 0x0a, 0x12, 0x43, 0x75, 0x73, 0x74, + 0x6f, 0x6d, 0x52, 0x65, 0x63, 0x6f, 0x72, 0x64, 0x73, 0x45, 0x6e, 0x74, 0x72, 0x79, 0x12, 0x10, + 0x0a, 0x03, 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x03, 0x6b, 0x65, 0x79, + 0x12, 0x14, 0x0a, 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x05, 0x76, 0x61, 0x6c, 0x75, 0x65, 0x3a, 0x02, 0x38, 0x01, 0x22, 0xa8, 0x02, 0x0a, 0x1c, 0x46, + 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x63, + 0x65, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x47, 0x0a, 0x14, 0x69, + 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x5f, + 0x6b, 0x65, 0x79, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, 0x74, 0x4b, 0x65, 0x79, + 0x52, 0x12, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x43, 0x69, 0x72, 0x63, 0x75, 0x69, + 0x74, 0x4b, 0x65, 0x79, 0x12, 0x3b, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x02, + 0x20, 0x01, 0x28, 0x0e, 0x32, 0x23, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, + 0x2e, 0x52, 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x48, 0x6f, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x08, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x27, 0x0a, + 0x0f, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x4d, + 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x12, 0x3d, 0x0a, 0x0c, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6c, + 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x2e, 0x46, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x43, 0x6f, 0x64, 0x65, 0x52, 0x0b, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x82, 0x01, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x68, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x12, 0x32, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x5f, 0x70, 0x6f, 0x69, 0x6e, 0x74, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x43, 0x68, + 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, + 0x50, 0x6f, 0x69, 0x6e, 0x74, 0x12, 0x33, 0x0a, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1b, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, + 0x63, 0x2e, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x41, 0x63, 0x74, 0x69, + 0x6f, 0x6e, 0x52, 0x06, 0x61, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x22, 0x1a, 0x0a, 0x18, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x2a, 0x81, 0x04, 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x75, + 0x72, 0x65, 0x44, 0x65, 0x74, 0x61, 0x69, 0x6c, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, + 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x4e, 0x4f, 0x5f, 0x44, 0x45, 0x54, 0x41, + 0x49, 0x4c, 0x10, 0x01, 0x12, 0x10, 0x0a, 0x0c, 0x4f, 0x4e, 0x49, 0x4f, 0x4e, 0x5f, 0x44, 0x45, + 0x43, 0x4f, 0x44, 0x45, 0x10, 0x02, 0x12, 0x15, 0x0a, 0x11, 0x4c, 0x49, 0x4e, 0x4b, 0x5f, 0x4e, + 0x4f, 0x54, 0x5f, 0x45, 0x4c, 0x49, 0x47, 0x49, 0x42, 0x4c, 0x45, 0x10, 0x03, 0x12, 0x14, 0x0a, + 0x10, 0x4f, 0x4e, 0x5f, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, + 0x54, 0x10, 0x04, 0x12, 0x14, 0x0a, 0x10, 0x48, 0x54, 0x4c, 0x43, 0x5f, 0x45, 0x58, 0x43, 0x45, + 0x45, 0x44, 0x53, 0x5f, 0x4d, 0x41, 0x58, 0x10, 0x05, 0x12, 0x18, 0x0a, 0x14, 0x49, 0x4e, 0x53, + 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, + 0x45, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x49, 0x4e, 0x43, 0x4f, 0x4d, 0x50, 0x4c, 0x45, 0x54, + 0x45, 0x5f, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x10, 0x07, 0x12, 0x13, 0x0a, 0x0f, 0x48, + 0x54, 0x4c, 0x43, 0x5f, 0x41, 0x44, 0x44, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x08, + 0x12, 0x15, 0x0a, 0x11, 0x46, 0x4f, 0x52, 0x57, 0x41, 0x52, 0x44, 0x53, 0x5f, 0x44, 0x49, 0x53, + 0x41, 0x42, 0x4c, 0x45, 0x44, 0x10, 0x09, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x4f, 0x49, + 0x43, 0x45, 0x5f, 0x43, 0x41, 0x4e, 0x43, 0x45, 0x4c, 0x45, 0x44, 0x10, 0x0a, 0x12, 0x15, 0x0a, + 0x11, 0x49, 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x55, 0x4e, 0x44, 0x45, 0x52, 0x50, 0x41, + 0x49, 0x44, 0x10, 0x0b, 0x12, 0x1b, 0x0a, 0x17, 0x49, 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x5f, + 0x45, 0x58, 0x50, 0x49, 0x52, 0x59, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, 0x53, 0x4f, 0x4f, 0x4e, 0x10, + 0x0c, 0x12, 0x14, 0x0a, 0x10, 0x49, 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x4e, 0x4f, 0x54, + 0x5f, 0x4f, 0x50, 0x45, 0x4e, 0x10, 0x0d, 0x12, 0x17, 0x0a, 0x13, 0x4d, 0x50, 0x50, 0x5f, 0x49, + 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x0e, + 0x12, 0x14, 0x0a, 0x10, 0x41, 0x44, 0x44, 0x52, 0x45, 0x53, 0x53, 0x5f, 0x4d, 0x49, 0x53, 0x4d, + 0x41, 0x54, 0x43, 0x48, 0x10, 0x0f, 0x12, 0x16, 0x0a, 0x12, 0x53, 0x45, 0x54, 0x5f, 0x54, 0x4f, + 0x54, 0x41, 0x4c, 0x5f, 0x4d, 0x49, 0x53, 0x4d, 0x41, 0x54, 0x43, 0x48, 0x10, 0x10, 0x12, 0x15, + 0x0a, 0x11, 0x53, 0x45, 0x54, 0x5f, 0x54, 0x4f, 0x54, 0x41, 0x4c, 0x5f, 0x54, 0x4f, 0x4f, 0x5f, + 0x4c, 0x4f, 0x57, 0x10, 0x11, 0x12, 0x10, 0x0a, 0x0c, 0x53, 0x45, 0x54, 0x5f, 0x4f, 0x56, 0x45, + 0x52, 0x50, 0x41, 0x49, 0x44, 0x10, 0x12, 0x12, 0x13, 0x0a, 0x0f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, + 0x57, 0x4e, 0x5f, 0x49, 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x10, 0x13, 0x12, 0x13, 0x0a, 0x0f, + 0x49, 0x4e, 0x56, 0x41, 0x4c, 0x49, 0x44, 0x5f, 0x4b, 0x45, 0x59, 0x53, 0x45, 0x4e, 0x44, 0x10, + 0x14, 0x12, 0x13, 0x0a, 0x0f, 0x4d, 0x50, 0x50, 0x5f, 0x49, 0x4e, 0x5f, 0x50, 0x52, 0x4f, 0x47, + 0x52, 0x45, 0x53, 0x53, 0x10, 0x15, 0x12, 0x12, 0x0a, 0x0e, 0x43, 0x49, 0x52, 0x43, 0x55, 0x4c, + 0x41, 0x52, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x45, 0x10, 0x16, 0x2a, 0xae, 0x01, 0x0a, 0x0c, 0x50, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x49, + 0x4e, 0x5f, 0x46, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x53, 0x55, + 0x43, 0x43, 0x45, 0x45, 0x44, 0x45, 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x46, 0x41, 0x49, + 0x4c, 0x45, 0x44, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x02, 0x12, 0x13, 0x0a, + 0x0f, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x4e, 0x4f, 0x5f, 0x52, 0x4f, 0x55, 0x54, 0x45, + 0x10, 0x03, 0x12, 0x10, 0x0a, 0x0c, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x45, 0x52, 0x52, + 0x4f, 0x52, 0x10, 0x04, 0x12, 0x24, 0x0a, 0x20, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x49, + 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x50, 0x41, 0x59, 0x4d, 0x45, 0x4e, 0x54, + 0x5f, 0x44, 0x45, 0x54, 0x41, 0x49, 0x4c, 0x53, 0x10, 0x05, 0x12, 0x1f, 0x0a, 0x1b, 0x46, 0x41, + 0x49, 0x4c, 0x45, 0x44, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, + 0x54, 0x5f, 0x42, 0x41, 0x4c, 0x41, 0x4e, 0x43, 0x45, 0x10, 0x06, 0x2a, 0x3c, 0x0a, 0x18, 0x52, + 0x65, 0x73, 0x6f, 0x6c, 0x76, 0x65, 0x48, 0x6f, 0x6c, 0x64, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, + 0x64, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, 0x06, 0x53, 0x45, 0x54, 0x54, 0x4c, + 0x45, 0x10, 0x00, 0x12, 0x08, 0x0a, 0x04, 0x46, 0x41, 0x49, 0x4c, 0x10, 0x01, 0x12, 0x0a, 0x0a, + 0x06, 0x52, 0x45, 0x53, 0x55, 0x4d, 0x45, 0x10, 0x02, 0x2a, 0x35, 0x0a, 0x10, 0x43, 0x68, 0x61, + 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x41, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x0a, 0x0a, + 0x06, 0x45, 0x4e, 0x41, 0x42, 0x4c, 0x45, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x44, 0x49, 0x53, + 0x41, 0x42, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x08, 0x0a, 0x04, 0x41, 0x55, 0x54, 0x4f, 0x10, 0x02, + 0x32, 0xb5, 0x0c, 0x0a, 0x06, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x12, 0x40, 0x0a, 0x0d, 0x53, + 0x65, 0x6e, 0x64, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32, 0x12, 0x1d, 0x2e, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x50, 0x61, 0x79, + 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x6c, 0x6e, + 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x42, 0x0a, + 0x0e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x56, 0x32, 0x12, + 0x1e, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, + 0x6b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x0e, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x30, + 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, + 0x74, 0x73, 0x12, 0x1f, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x0e, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x4b, 0x0a, 0x10, 0x45, 0x73, 0x74, 0x69, 0x6d, 0x61, 0x74, + 0x65, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x46, 0x65, 0x65, 0x12, 0x1a, 0x2e, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1b, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, + 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x46, 0x65, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x51, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x12, 0x1d, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, + 0x6e, 0x64, 0x54, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x1e, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, + 0x64, 0x54, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x42, 0x0a, 0x0d, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x52, + 0x6f, 0x75, 0x74, 0x65, 0x56, 0x32, 0x12, 0x1d, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, + 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x54, 0x6f, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x12, 0x2e, 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x54, + 0x4c, 0x43, 0x41, 0x74, 0x74, 0x65, 0x6d, 0x70, 0x74, 0x12, 0x64, 0x0a, 0x13, 0x52, 0x65, 0x73, + 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x12, 0x25, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, + 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, + 0x72, 0x70, 0x63, 0x2e, 0x52, 0x65, 0x73, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x64, 0x0a, 0x13, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x25, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, + 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x26, 0x2e, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x4d, + 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x15, 0x58, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, + 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x12, 0x27, + 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x58, 0x49, 0x6d, 0x70, 0x6f, + 0x72, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, + 0x72, 0x70, 0x63, 0x2e, 0x58, 0x49, 0x6d, 0x70, 0x6f, 0x72, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, + 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x70, 0x0a, 0x17, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, + 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x29, 0x2e, 0x72, + 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, + 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, + 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, + 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, 0x70, 0x6f, + 0x6e, 0x73, 0x65, 0x12, 0x70, 0x0a, 0x17, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, + 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x29, + 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x69, + 0x73, 0x73, 0x69, 0x6f, 0x6e, 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2a, 0x2e, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x4d, 0x69, 0x73, 0x73, 0x69, 0x6f, 0x6e, + 0x43, 0x6f, 0x6e, 0x74, 0x72, 0x6f, 0x6c, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x5b, 0x0a, 0x10, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, + 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x12, 0x22, 0x2e, 0x72, 0x6f, 0x75, 0x74, + 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x62, 0x61, + 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x65, 0x72, 0x79, 0x50, - 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, - 0x65, 0x72, 0x79, 0x50, 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, - 0x6f, 0x75, 0x74, 0x65, 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, - 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x42, - 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x54, 0x0a, 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x48, 0x74, - 0x6c, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, - 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x48, 0x74, - 0x6c, 0x63, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x14, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x74, 0x6c, 0x63, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x30, 0x01, 0x12, 0x4d, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x50, - 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, - 0x70, 0x63, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, - 0x63, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, - 0x03, 0x88, 0x02, 0x01, 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, - 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, - 0x70, 0x63, 0x2e, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, - 0x70, 0x63, 0x2e, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x22, 0x03, 0x88, 0x02, 0x01, 0x30, 0x01, 0x12, 0x66, 0x0a, 0x0f, 0x48, 0x74, 0x6c, 0x63, 0x49, - 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x27, 0x2e, 0x72, 0x6f, 0x75, - 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x48, 0x74, - 0x6c, 0x63, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x1a, 0x26, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, - 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x6e, 0x74, 0x65, 0x72, - 0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x01, 0x30, 0x01, 0x12, - 0x5b, 0x0a, 0x10, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x22, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, + 0x72, 0x6f, 0x62, 0x61, 0x62, 0x69, 0x6c, 0x69, 0x74, 0x79, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x49, 0x0a, 0x0a, 0x42, 0x75, 0x69, 0x6c, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, + 0x12, 0x1c, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x69, + 0x6c, 0x64, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, + 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x42, 0x75, 0x69, 0x6c, 0x64, + 0x52, 0x6f, 0x75, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x54, 0x0a, + 0x13, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x48, 0x74, 0x6c, 0x63, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x12, 0x25, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x75, 0x62, 0x73, 0x63, 0x72, 0x69, 0x62, 0x65, 0x48, 0x74, 0x6c, 0x63, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x14, 0x2e, 0x72, 0x6f, + 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x48, 0x74, 0x6c, 0x63, 0x45, 0x76, 0x65, 0x6e, + 0x74, 0x30, 0x01, 0x12, 0x4d, 0x0a, 0x0b, 0x53, 0x65, 0x6e, 0x64, 0x50, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x1d, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x53, + 0x65, 0x6e, 0x64, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x61, + 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x03, 0x88, 0x02, 0x01, + 0x30, 0x01, 0x12, 0x4f, 0x0a, 0x0c, 0x54, 0x72, 0x61, 0x63, 0x6b, 0x50, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x12, 0x1e, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x54, + 0x72, 0x61, 0x63, 0x6b, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x50, + 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0x03, 0x88, 0x02, + 0x01, 0x30, 0x01, 0x12, 0x66, 0x0a, 0x0f, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x6e, 0x74, 0x65, 0x72, + 0x63, 0x65, 0x70, 0x74, 0x6f, 0x72, 0x12, 0x27, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, + 0x70, 0x63, 0x2e, 0x46, 0x6f, 0x72, 0x77, 0x61, 0x72, 0x64, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x6e, + 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x1a, + 0x26, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x6f, 0x72, 0x77, + 0x61, 0x72, 0x64, 0x48, 0x74, 0x6c, 0x63, 0x49, 0x6e, 0x74, 0x65, 0x72, 0x63, 0x65, 0x70, 0x74, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x28, 0x01, 0x30, 0x01, 0x12, 0x5b, 0x0a, 0x10, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, + 0x22, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, - 0x72, 0x70, 0x63, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x74, - 0x61, 0x74, 0x75, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x31, 0x5a, 0x2f, - 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, - 0x6e, 0x69, 0x6e, 0x67, 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6e, 0x64, 0x2f, - 0x6c, 0x6e, 0x72, 0x70, 0x63, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x31, 0x5a, 0x2f, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, + 0x6e, 0x65, 0x74, 0x77, 0x6f, 0x72, 0x6b, 0x2f, 0x6c, 0x6e, 0x64, 0x2f, 0x6c, 0x6e, 0x72, 0x70, + 0x63, 0x2f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x72, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x33, } var ( @@ -3355,7 +3413,7 @@ func file_routerrpc_router_proto_rawDescGZIP() []byte { } var file_routerrpc_router_proto_enumTypes = make([]protoimpl.EnumInfo, 5) -var file_routerrpc_router_proto_msgTypes = make([]protoimpl.MessageInfo, 38) +var file_routerrpc_router_proto_msgTypes = make([]protoimpl.MessageInfo, 39) var file_routerrpc_router_proto_goTypes = []interface{}{ (FailureDetail)(0), // 0: routerrpc.FailureDetail (PaymentState)(0), // 1: routerrpc.PaymentState @@ -3364,118 +3422,121 @@ var file_routerrpc_router_proto_goTypes = []interface{}{ (HtlcEvent_EventType)(0), // 4: routerrpc.HtlcEvent.EventType (*SendPaymentRequest)(nil), // 5: routerrpc.SendPaymentRequest (*TrackPaymentRequest)(nil), // 6: routerrpc.TrackPaymentRequest - (*RouteFeeRequest)(nil), // 7: routerrpc.RouteFeeRequest - (*RouteFeeResponse)(nil), // 8: routerrpc.RouteFeeResponse - (*SendToRouteRequest)(nil), // 9: routerrpc.SendToRouteRequest - (*SendToRouteResponse)(nil), // 10: routerrpc.SendToRouteResponse - (*ResetMissionControlRequest)(nil), // 11: routerrpc.ResetMissionControlRequest - (*ResetMissionControlResponse)(nil), // 12: routerrpc.ResetMissionControlResponse - (*QueryMissionControlRequest)(nil), // 13: routerrpc.QueryMissionControlRequest - (*QueryMissionControlResponse)(nil), // 14: routerrpc.QueryMissionControlResponse - (*XImportMissionControlRequest)(nil), // 15: routerrpc.XImportMissionControlRequest - (*XImportMissionControlResponse)(nil), // 16: routerrpc.XImportMissionControlResponse - (*PairHistory)(nil), // 17: routerrpc.PairHistory - (*PairData)(nil), // 18: routerrpc.PairData - (*GetMissionControlConfigRequest)(nil), // 19: routerrpc.GetMissionControlConfigRequest - (*GetMissionControlConfigResponse)(nil), // 20: routerrpc.GetMissionControlConfigResponse - (*SetMissionControlConfigRequest)(nil), // 21: routerrpc.SetMissionControlConfigRequest - (*SetMissionControlConfigResponse)(nil), // 22: routerrpc.SetMissionControlConfigResponse - (*MissionControlConfig)(nil), // 23: routerrpc.MissionControlConfig - (*QueryProbabilityRequest)(nil), // 24: routerrpc.QueryProbabilityRequest - (*QueryProbabilityResponse)(nil), // 25: routerrpc.QueryProbabilityResponse - (*BuildRouteRequest)(nil), // 26: routerrpc.BuildRouteRequest - (*BuildRouteResponse)(nil), // 27: routerrpc.BuildRouteResponse - (*SubscribeHtlcEventsRequest)(nil), // 28: routerrpc.SubscribeHtlcEventsRequest - (*HtlcEvent)(nil), // 29: routerrpc.HtlcEvent - (*HtlcInfo)(nil), // 30: routerrpc.HtlcInfo - (*ForwardEvent)(nil), // 31: routerrpc.ForwardEvent - (*ForwardFailEvent)(nil), // 32: routerrpc.ForwardFailEvent - (*SettleEvent)(nil), // 33: routerrpc.SettleEvent - (*LinkFailEvent)(nil), // 34: routerrpc.LinkFailEvent - (*PaymentStatus)(nil), // 35: routerrpc.PaymentStatus - (*CircuitKey)(nil), // 36: routerrpc.CircuitKey - (*ForwardHtlcInterceptRequest)(nil), // 37: routerrpc.ForwardHtlcInterceptRequest - (*ForwardHtlcInterceptResponse)(nil), // 38: routerrpc.ForwardHtlcInterceptResponse - (*UpdateChanStatusRequest)(nil), // 39: routerrpc.UpdateChanStatusRequest - (*UpdateChanStatusResponse)(nil), // 40: routerrpc.UpdateChanStatusResponse - nil, // 41: routerrpc.SendPaymentRequest.DestCustomRecordsEntry - nil, // 42: routerrpc.ForwardHtlcInterceptRequest.CustomRecordsEntry - (*lnrpc.RouteHint)(nil), // 43: lnrpc.RouteHint - (lnrpc.FeatureBit)(0), // 44: lnrpc.FeatureBit - (*lnrpc.Route)(nil), // 45: lnrpc.Route - (*lnrpc.Failure)(nil), // 46: lnrpc.Failure - (lnrpc.Failure_FailureCode)(0), // 47: lnrpc.Failure.FailureCode - (*lnrpc.HTLCAttempt)(nil), // 48: lnrpc.HTLCAttempt - (*lnrpc.ChannelPoint)(nil), // 49: lnrpc.ChannelPoint - (*lnrpc.Payment)(nil), // 50: lnrpc.Payment + (*TrackPaymentsRequest)(nil), // 7: routerrpc.TrackPaymentsRequest + (*RouteFeeRequest)(nil), // 8: routerrpc.RouteFeeRequest + (*RouteFeeResponse)(nil), // 9: routerrpc.RouteFeeResponse + (*SendToRouteRequest)(nil), // 10: routerrpc.SendToRouteRequest + (*SendToRouteResponse)(nil), // 11: routerrpc.SendToRouteResponse + (*ResetMissionControlRequest)(nil), // 12: routerrpc.ResetMissionControlRequest + (*ResetMissionControlResponse)(nil), // 13: routerrpc.ResetMissionControlResponse + (*QueryMissionControlRequest)(nil), // 14: routerrpc.QueryMissionControlRequest + (*QueryMissionControlResponse)(nil), // 15: routerrpc.QueryMissionControlResponse + (*XImportMissionControlRequest)(nil), // 16: routerrpc.XImportMissionControlRequest + (*XImportMissionControlResponse)(nil), // 17: routerrpc.XImportMissionControlResponse + (*PairHistory)(nil), // 18: routerrpc.PairHistory + (*PairData)(nil), // 19: routerrpc.PairData + (*GetMissionControlConfigRequest)(nil), // 20: routerrpc.GetMissionControlConfigRequest + (*GetMissionControlConfigResponse)(nil), // 21: routerrpc.GetMissionControlConfigResponse + (*SetMissionControlConfigRequest)(nil), // 22: routerrpc.SetMissionControlConfigRequest + (*SetMissionControlConfigResponse)(nil), // 23: routerrpc.SetMissionControlConfigResponse + (*MissionControlConfig)(nil), // 24: routerrpc.MissionControlConfig + (*QueryProbabilityRequest)(nil), // 25: routerrpc.QueryProbabilityRequest + (*QueryProbabilityResponse)(nil), // 26: routerrpc.QueryProbabilityResponse + (*BuildRouteRequest)(nil), // 27: routerrpc.BuildRouteRequest + (*BuildRouteResponse)(nil), // 28: routerrpc.BuildRouteResponse + (*SubscribeHtlcEventsRequest)(nil), // 29: routerrpc.SubscribeHtlcEventsRequest + (*HtlcEvent)(nil), // 30: routerrpc.HtlcEvent + (*HtlcInfo)(nil), // 31: routerrpc.HtlcInfo + (*ForwardEvent)(nil), // 32: routerrpc.ForwardEvent + (*ForwardFailEvent)(nil), // 33: routerrpc.ForwardFailEvent + (*SettleEvent)(nil), // 34: routerrpc.SettleEvent + (*LinkFailEvent)(nil), // 35: routerrpc.LinkFailEvent + (*PaymentStatus)(nil), // 36: routerrpc.PaymentStatus + (*CircuitKey)(nil), // 37: routerrpc.CircuitKey + (*ForwardHtlcInterceptRequest)(nil), // 38: routerrpc.ForwardHtlcInterceptRequest + (*ForwardHtlcInterceptResponse)(nil), // 39: routerrpc.ForwardHtlcInterceptResponse + (*UpdateChanStatusRequest)(nil), // 40: routerrpc.UpdateChanStatusRequest + (*UpdateChanStatusResponse)(nil), // 41: routerrpc.UpdateChanStatusResponse + nil, // 42: routerrpc.SendPaymentRequest.DestCustomRecordsEntry + nil, // 43: routerrpc.ForwardHtlcInterceptRequest.CustomRecordsEntry + (*lnrpc.RouteHint)(nil), // 44: lnrpc.RouteHint + (lnrpc.FeatureBit)(0), // 45: lnrpc.FeatureBit + (*lnrpc.Route)(nil), // 46: lnrpc.Route + (*lnrpc.Failure)(nil), // 47: lnrpc.Failure + (lnrpc.Failure_FailureCode)(0), // 48: lnrpc.Failure.FailureCode + (*lnrpc.HTLCAttempt)(nil), // 49: lnrpc.HTLCAttempt + (*lnrpc.ChannelPoint)(nil), // 50: lnrpc.ChannelPoint + (*lnrpc.Payment)(nil), // 51: lnrpc.Payment } var file_routerrpc_router_proto_depIdxs = []int32{ - 43, // 0: routerrpc.SendPaymentRequest.route_hints:type_name -> lnrpc.RouteHint - 41, // 1: routerrpc.SendPaymentRequest.dest_custom_records:type_name -> routerrpc.SendPaymentRequest.DestCustomRecordsEntry - 44, // 2: routerrpc.SendPaymentRequest.dest_features:type_name -> lnrpc.FeatureBit - 45, // 3: routerrpc.SendToRouteRequest.route:type_name -> lnrpc.Route - 46, // 4: routerrpc.SendToRouteResponse.failure:type_name -> lnrpc.Failure - 17, // 5: routerrpc.QueryMissionControlResponse.pairs:type_name -> routerrpc.PairHistory - 17, // 6: routerrpc.XImportMissionControlRequest.pairs:type_name -> routerrpc.PairHistory - 18, // 7: routerrpc.PairHistory.history:type_name -> routerrpc.PairData - 23, // 8: routerrpc.GetMissionControlConfigResponse.config:type_name -> routerrpc.MissionControlConfig - 23, // 9: routerrpc.SetMissionControlConfigRequest.config:type_name -> routerrpc.MissionControlConfig - 18, // 10: routerrpc.QueryProbabilityResponse.history:type_name -> routerrpc.PairData - 45, // 11: routerrpc.BuildRouteResponse.route:type_name -> lnrpc.Route + 44, // 0: routerrpc.SendPaymentRequest.route_hints:type_name -> lnrpc.RouteHint + 42, // 1: routerrpc.SendPaymentRequest.dest_custom_records:type_name -> routerrpc.SendPaymentRequest.DestCustomRecordsEntry + 45, // 2: routerrpc.SendPaymentRequest.dest_features:type_name -> lnrpc.FeatureBit + 46, // 3: routerrpc.SendToRouteRequest.route:type_name -> lnrpc.Route + 47, // 4: routerrpc.SendToRouteResponse.failure:type_name -> lnrpc.Failure + 18, // 5: routerrpc.QueryMissionControlResponse.pairs:type_name -> routerrpc.PairHistory + 18, // 6: routerrpc.XImportMissionControlRequest.pairs:type_name -> routerrpc.PairHistory + 19, // 7: routerrpc.PairHistory.history:type_name -> routerrpc.PairData + 24, // 8: routerrpc.GetMissionControlConfigResponse.config:type_name -> routerrpc.MissionControlConfig + 24, // 9: routerrpc.SetMissionControlConfigRequest.config:type_name -> routerrpc.MissionControlConfig + 19, // 10: routerrpc.QueryProbabilityResponse.history:type_name -> routerrpc.PairData + 46, // 11: routerrpc.BuildRouteResponse.route:type_name -> lnrpc.Route 4, // 12: routerrpc.HtlcEvent.event_type:type_name -> routerrpc.HtlcEvent.EventType - 31, // 13: routerrpc.HtlcEvent.forward_event:type_name -> routerrpc.ForwardEvent - 32, // 14: routerrpc.HtlcEvent.forward_fail_event:type_name -> routerrpc.ForwardFailEvent - 33, // 15: routerrpc.HtlcEvent.settle_event:type_name -> routerrpc.SettleEvent - 34, // 16: routerrpc.HtlcEvent.link_fail_event:type_name -> routerrpc.LinkFailEvent - 30, // 17: routerrpc.ForwardEvent.info:type_name -> routerrpc.HtlcInfo - 30, // 18: routerrpc.LinkFailEvent.info:type_name -> routerrpc.HtlcInfo - 47, // 19: routerrpc.LinkFailEvent.wire_failure:type_name -> lnrpc.Failure.FailureCode + 32, // 13: routerrpc.HtlcEvent.forward_event:type_name -> routerrpc.ForwardEvent + 33, // 14: routerrpc.HtlcEvent.forward_fail_event:type_name -> routerrpc.ForwardFailEvent + 34, // 15: routerrpc.HtlcEvent.settle_event:type_name -> routerrpc.SettleEvent + 35, // 16: routerrpc.HtlcEvent.link_fail_event:type_name -> routerrpc.LinkFailEvent + 31, // 17: routerrpc.ForwardEvent.info:type_name -> routerrpc.HtlcInfo + 31, // 18: routerrpc.LinkFailEvent.info:type_name -> routerrpc.HtlcInfo + 48, // 19: routerrpc.LinkFailEvent.wire_failure:type_name -> lnrpc.Failure.FailureCode 0, // 20: routerrpc.LinkFailEvent.failure_detail:type_name -> routerrpc.FailureDetail 1, // 21: routerrpc.PaymentStatus.state:type_name -> routerrpc.PaymentState - 48, // 22: routerrpc.PaymentStatus.htlcs:type_name -> lnrpc.HTLCAttempt - 36, // 23: routerrpc.ForwardHtlcInterceptRequest.incoming_circuit_key:type_name -> routerrpc.CircuitKey - 42, // 24: routerrpc.ForwardHtlcInterceptRequest.custom_records:type_name -> routerrpc.ForwardHtlcInterceptRequest.CustomRecordsEntry - 36, // 25: routerrpc.ForwardHtlcInterceptResponse.incoming_circuit_key:type_name -> routerrpc.CircuitKey + 49, // 22: routerrpc.PaymentStatus.htlcs:type_name -> lnrpc.HTLCAttempt + 37, // 23: routerrpc.ForwardHtlcInterceptRequest.incoming_circuit_key:type_name -> routerrpc.CircuitKey + 43, // 24: routerrpc.ForwardHtlcInterceptRequest.custom_records:type_name -> routerrpc.ForwardHtlcInterceptRequest.CustomRecordsEntry + 37, // 25: routerrpc.ForwardHtlcInterceptResponse.incoming_circuit_key:type_name -> routerrpc.CircuitKey 2, // 26: routerrpc.ForwardHtlcInterceptResponse.action:type_name -> routerrpc.ResolveHoldForwardAction - 47, // 27: routerrpc.ForwardHtlcInterceptResponse.failure_code:type_name -> lnrpc.Failure.FailureCode - 49, // 28: routerrpc.UpdateChanStatusRequest.chan_point:type_name -> lnrpc.ChannelPoint + 48, // 27: routerrpc.ForwardHtlcInterceptResponse.failure_code:type_name -> lnrpc.Failure.FailureCode + 50, // 28: routerrpc.UpdateChanStatusRequest.chan_point:type_name -> lnrpc.ChannelPoint 3, // 29: routerrpc.UpdateChanStatusRequest.action:type_name -> routerrpc.ChanStatusAction 5, // 30: routerrpc.Router.SendPaymentV2:input_type -> routerrpc.SendPaymentRequest 6, // 31: routerrpc.Router.TrackPaymentV2:input_type -> routerrpc.TrackPaymentRequest - 7, // 32: routerrpc.Router.EstimateRouteFee:input_type -> routerrpc.RouteFeeRequest - 9, // 33: routerrpc.Router.SendToRoute:input_type -> routerrpc.SendToRouteRequest - 9, // 34: routerrpc.Router.SendToRouteV2:input_type -> routerrpc.SendToRouteRequest - 11, // 35: routerrpc.Router.ResetMissionControl:input_type -> routerrpc.ResetMissionControlRequest - 13, // 36: routerrpc.Router.QueryMissionControl:input_type -> routerrpc.QueryMissionControlRequest - 15, // 37: routerrpc.Router.XImportMissionControl:input_type -> routerrpc.XImportMissionControlRequest - 19, // 38: routerrpc.Router.GetMissionControlConfig:input_type -> routerrpc.GetMissionControlConfigRequest - 21, // 39: routerrpc.Router.SetMissionControlConfig:input_type -> routerrpc.SetMissionControlConfigRequest - 24, // 40: routerrpc.Router.QueryProbability:input_type -> routerrpc.QueryProbabilityRequest - 26, // 41: routerrpc.Router.BuildRoute:input_type -> routerrpc.BuildRouteRequest - 28, // 42: routerrpc.Router.SubscribeHtlcEvents:input_type -> routerrpc.SubscribeHtlcEventsRequest - 5, // 43: routerrpc.Router.SendPayment:input_type -> routerrpc.SendPaymentRequest - 6, // 44: routerrpc.Router.TrackPayment:input_type -> routerrpc.TrackPaymentRequest - 38, // 45: routerrpc.Router.HtlcInterceptor:input_type -> routerrpc.ForwardHtlcInterceptResponse - 39, // 46: routerrpc.Router.UpdateChanStatus:input_type -> routerrpc.UpdateChanStatusRequest - 50, // 47: routerrpc.Router.SendPaymentV2:output_type -> lnrpc.Payment - 50, // 48: routerrpc.Router.TrackPaymentV2:output_type -> lnrpc.Payment - 8, // 49: routerrpc.Router.EstimateRouteFee:output_type -> routerrpc.RouteFeeResponse - 10, // 50: routerrpc.Router.SendToRoute:output_type -> routerrpc.SendToRouteResponse - 48, // 51: routerrpc.Router.SendToRouteV2:output_type -> lnrpc.HTLCAttempt - 12, // 52: routerrpc.Router.ResetMissionControl:output_type -> routerrpc.ResetMissionControlResponse - 14, // 53: routerrpc.Router.QueryMissionControl:output_type -> routerrpc.QueryMissionControlResponse - 16, // 54: routerrpc.Router.XImportMissionControl:output_type -> routerrpc.XImportMissionControlResponse - 20, // 55: routerrpc.Router.GetMissionControlConfig:output_type -> routerrpc.GetMissionControlConfigResponse - 22, // 56: routerrpc.Router.SetMissionControlConfig:output_type -> routerrpc.SetMissionControlConfigResponse - 25, // 57: routerrpc.Router.QueryProbability:output_type -> routerrpc.QueryProbabilityResponse - 27, // 58: routerrpc.Router.BuildRoute:output_type -> routerrpc.BuildRouteResponse - 29, // 59: routerrpc.Router.SubscribeHtlcEvents:output_type -> routerrpc.HtlcEvent - 35, // 60: routerrpc.Router.SendPayment:output_type -> routerrpc.PaymentStatus - 35, // 61: routerrpc.Router.TrackPayment:output_type -> routerrpc.PaymentStatus - 37, // 62: routerrpc.Router.HtlcInterceptor:output_type -> routerrpc.ForwardHtlcInterceptRequest - 40, // 63: routerrpc.Router.UpdateChanStatus:output_type -> routerrpc.UpdateChanStatusResponse - 47, // [47:64] is the sub-list for method output_type - 30, // [30:47] is the sub-list for method input_type + 7, // 32: routerrpc.Router.TrackPayments:input_type -> routerrpc.TrackPaymentsRequest + 8, // 33: routerrpc.Router.EstimateRouteFee:input_type -> routerrpc.RouteFeeRequest + 10, // 34: routerrpc.Router.SendToRoute:input_type -> routerrpc.SendToRouteRequest + 10, // 35: routerrpc.Router.SendToRouteV2:input_type -> routerrpc.SendToRouteRequest + 12, // 36: routerrpc.Router.ResetMissionControl:input_type -> routerrpc.ResetMissionControlRequest + 14, // 37: routerrpc.Router.QueryMissionControl:input_type -> routerrpc.QueryMissionControlRequest + 16, // 38: routerrpc.Router.XImportMissionControl:input_type -> routerrpc.XImportMissionControlRequest + 20, // 39: routerrpc.Router.GetMissionControlConfig:input_type -> routerrpc.GetMissionControlConfigRequest + 22, // 40: routerrpc.Router.SetMissionControlConfig:input_type -> routerrpc.SetMissionControlConfigRequest + 25, // 41: routerrpc.Router.QueryProbability:input_type -> routerrpc.QueryProbabilityRequest + 27, // 42: routerrpc.Router.BuildRoute:input_type -> routerrpc.BuildRouteRequest + 29, // 43: routerrpc.Router.SubscribeHtlcEvents:input_type -> routerrpc.SubscribeHtlcEventsRequest + 5, // 44: routerrpc.Router.SendPayment:input_type -> routerrpc.SendPaymentRequest + 6, // 45: routerrpc.Router.TrackPayment:input_type -> routerrpc.TrackPaymentRequest + 39, // 46: routerrpc.Router.HtlcInterceptor:input_type -> routerrpc.ForwardHtlcInterceptResponse + 40, // 47: routerrpc.Router.UpdateChanStatus:input_type -> routerrpc.UpdateChanStatusRequest + 51, // 48: routerrpc.Router.SendPaymentV2:output_type -> lnrpc.Payment + 51, // 49: routerrpc.Router.TrackPaymentV2:output_type -> lnrpc.Payment + 51, // 50: routerrpc.Router.TrackPayments:output_type -> lnrpc.Payment + 9, // 51: routerrpc.Router.EstimateRouteFee:output_type -> routerrpc.RouteFeeResponse + 11, // 52: routerrpc.Router.SendToRoute:output_type -> routerrpc.SendToRouteResponse + 49, // 53: routerrpc.Router.SendToRouteV2:output_type -> lnrpc.HTLCAttempt + 13, // 54: routerrpc.Router.ResetMissionControl:output_type -> routerrpc.ResetMissionControlResponse + 15, // 55: routerrpc.Router.QueryMissionControl:output_type -> routerrpc.QueryMissionControlResponse + 17, // 56: routerrpc.Router.XImportMissionControl:output_type -> routerrpc.XImportMissionControlResponse + 21, // 57: routerrpc.Router.GetMissionControlConfig:output_type -> routerrpc.GetMissionControlConfigResponse + 23, // 58: routerrpc.Router.SetMissionControlConfig:output_type -> routerrpc.SetMissionControlConfigResponse + 26, // 59: routerrpc.Router.QueryProbability:output_type -> routerrpc.QueryProbabilityResponse + 28, // 60: routerrpc.Router.BuildRoute:output_type -> routerrpc.BuildRouteResponse + 30, // 61: routerrpc.Router.SubscribeHtlcEvents:output_type -> routerrpc.HtlcEvent + 36, // 62: routerrpc.Router.SendPayment:output_type -> routerrpc.PaymentStatus + 36, // 63: routerrpc.Router.TrackPayment:output_type -> routerrpc.PaymentStatus + 38, // 64: routerrpc.Router.HtlcInterceptor:output_type -> routerrpc.ForwardHtlcInterceptRequest + 41, // 65: routerrpc.Router.UpdateChanStatus:output_type -> routerrpc.UpdateChanStatusResponse + 48, // [48:66] is the sub-list for method output_type + 30, // [30:48] is the sub-list for method input_type 30, // [30:30] is the sub-list for extension type_name 30, // [30:30] is the sub-list for extension extendee 0, // [0:30] is the sub-list for field type_name @@ -3512,7 +3573,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[2].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RouteFeeRequest); i { + switch v := v.(*TrackPaymentsRequest); i { case 0: return &v.state case 1: @@ -3524,7 +3585,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[3].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*RouteFeeResponse); i { + switch v := v.(*RouteFeeRequest); i { case 0: return &v.state case 1: @@ -3536,7 +3597,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[4].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendToRouteRequest); i { + switch v := v.(*RouteFeeResponse); i { case 0: return &v.state case 1: @@ -3548,7 +3609,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[5].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SendToRouteResponse); i { + switch v := v.(*SendToRouteRequest); i { case 0: return &v.state case 1: @@ -3560,7 +3621,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[6].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetMissionControlRequest); i { + switch v := v.(*SendToRouteResponse); i { case 0: return &v.state case 1: @@ -3572,7 +3633,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[7].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ResetMissionControlResponse); i { + switch v := v.(*ResetMissionControlRequest); i { case 0: return &v.state case 1: @@ -3584,7 +3645,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[8].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryMissionControlRequest); i { + switch v := v.(*ResetMissionControlResponse); i { case 0: return &v.state case 1: @@ -3596,7 +3657,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[9].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryMissionControlResponse); i { + switch v := v.(*QueryMissionControlRequest); i { case 0: return &v.state case 1: @@ -3608,7 +3669,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[10].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*XImportMissionControlRequest); i { + switch v := v.(*QueryMissionControlResponse); i { case 0: return &v.state case 1: @@ -3620,7 +3681,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[11].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*XImportMissionControlResponse); i { + switch v := v.(*XImportMissionControlRequest); i { case 0: return &v.state case 1: @@ -3632,7 +3693,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[12].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PairHistory); i { + switch v := v.(*XImportMissionControlResponse); i { case 0: return &v.state case 1: @@ -3644,7 +3705,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[13].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PairData); i { + switch v := v.(*PairHistory); i { case 0: return &v.state case 1: @@ -3656,7 +3717,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[14].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMissionControlConfigRequest); i { + switch v := v.(*PairData); i { case 0: return &v.state case 1: @@ -3668,7 +3729,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[15].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*GetMissionControlConfigResponse); i { + switch v := v.(*GetMissionControlConfigRequest); i { case 0: return &v.state case 1: @@ -3680,7 +3741,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[16].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetMissionControlConfigRequest); i { + switch v := v.(*GetMissionControlConfigResponse); i { case 0: return &v.state case 1: @@ -3692,7 +3753,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[17].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SetMissionControlConfigResponse); i { + switch v := v.(*SetMissionControlConfigRequest); i { case 0: return &v.state case 1: @@ -3704,7 +3765,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[18].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*MissionControlConfig); i { + switch v := v.(*SetMissionControlConfigResponse); i { case 0: return &v.state case 1: @@ -3716,7 +3777,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[19].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryProbabilityRequest); i { + switch v := v.(*MissionControlConfig); i { case 0: return &v.state case 1: @@ -3728,7 +3789,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[20].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*QueryProbabilityResponse); i { + switch v := v.(*QueryProbabilityRequest); i { case 0: return &v.state case 1: @@ -3740,7 +3801,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[21].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildRouteRequest); i { + switch v := v.(*QueryProbabilityResponse); i { case 0: return &v.state case 1: @@ -3752,7 +3813,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[22].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*BuildRouteResponse); i { + switch v := v.(*BuildRouteRequest); i { case 0: return &v.state case 1: @@ -3764,7 +3825,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[23].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SubscribeHtlcEventsRequest); i { + switch v := v.(*BuildRouteResponse); i { case 0: return &v.state case 1: @@ -3776,7 +3837,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[24].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HtlcEvent); i { + switch v := v.(*SubscribeHtlcEventsRequest); i { case 0: return &v.state case 1: @@ -3788,7 +3849,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[25].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*HtlcInfo); i { + switch v := v.(*HtlcEvent); i { case 0: return &v.state case 1: @@ -3800,7 +3861,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[26].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ForwardEvent); i { + switch v := v.(*HtlcInfo); i { case 0: return &v.state case 1: @@ -3812,7 +3873,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[27].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ForwardFailEvent); i { + switch v := v.(*ForwardEvent); i { case 0: return &v.state case 1: @@ -3824,7 +3885,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[28].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*SettleEvent); i { + switch v := v.(*ForwardFailEvent); i { case 0: return &v.state case 1: @@ -3836,7 +3897,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[29].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*LinkFailEvent); i { + switch v := v.(*SettleEvent); i { case 0: return &v.state case 1: @@ -3848,7 +3909,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[30].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*PaymentStatus); i { + switch v := v.(*LinkFailEvent); i { case 0: return &v.state case 1: @@ -3860,7 +3921,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[31].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*CircuitKey); i { + switch v := v.(*PaymentStatus); i { case 0: return &v.state case 1: @@ -3872,7 +3933,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[32].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ForwardHtlcInterceptRequest); i { + switch v := v.(*CircuitKey); i { case 0: return &v.state case 1: @@ -3884,7 +3945,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[33].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*ForwardHtlcInterceptResponse); i { + switch v := v.(*ForwardHtlcInterceptRequest); i { case 0: return &v.state case 1: @@ -3896,7 +3957,7 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[34].Exporter = func(v interface{}, i int) interface{} { - switch v := v.(*UpdateChanStatusRequest); i { + switch v := v.(*ForwardHtlcInterceptResponse); i { case 0: return &v.state case 1: @@ -3908,6 +3969,18 @@ func file_routerrpc_router_proto_init() { } } file_routerrpc_router_proto_msgTypes[35].Exporter = func(v interface{}, i int) interface{} { + switch v := v.(*UpdateChanStatusRequest); i { + case 0: + return &v.state + case 1: + return &v.sizeCache + case 2: + return &v.unknownFields + default: + return nil + } + } + file_routerrpc_router_proto_msgTypes[36].Exporter = func(v interface{}, i int) interface{} { switch v := v.(*UpdateChanStatusResponse); i { case 0: return &v.state @@ -3920,7 +3993,7 @@ func file_routerrpc_router_proto_init() { } } } - file_routerrpc_router_proto_msgTypes[24].OneofWrappers = []interface{}{ + file_routerrpc_router_proto_msgTypes[25].OneofWrappers = []interface{}{ (*HtlcEvent_ForwardEvent)(nil), (*HtlcEvent_ForwardFailEvent)(nil), (*HtlcEvent_SettleEvent)(nil), @@ -3932,7 +4005,7 @@ func file_routerrpc_router_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_routerrpc_router_proto_rawDesc, NumEnums: 5, - NumMessages: 38, + NumMessages: 39, NumExtensions: 0, NumServices: 1, }, diff --git a/lnrpc/routerrpc/router.pb.gw.go b/lnrpc/routerrpc/router.pb.gw.go index 43a881362..fcfc3ad82 100644 --- a/lnrpc/routerrpc/router.pb.gw.go +++ b/lnrpc/routerrpc/router.pb.gw.go @@ -101,6 +101,34 @@ func request_Router_TrackPaymentV2_0(ctx context.Context, marshaler runtime.Mars } +var ( + filter_Router_TrackPayments_0 = &utilities.DoubleArray{Encoding: map[string]int{}, Base: []int(nil), Check: []int(nil)} +) + +func request_Router_TrackPayments_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (Router_TrackPaymentsClient, runtime.ServerMetadata, error) { + var protoReq TrackPaymentsRequest + var metadata runtime.ServerMetadata + + if err := req.ParseForm(); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + if err := runtime.PopulateQueryParameters(&protoReq, req.Form, filter_Router_TrackPayments_0); err != nil { + return nil, metadata, status.Errorf(codes.InvalidArgument, "%v", err) + } + + stream, err := client.TrackPayments(ctx, &protoReq) + if err != nil { + return nil, metadata, err + } + header, err := stream.Header() + if err != nil { + return nil, metadata, err + } + metadata.HeaderMD = header + return stream, metadata, nil + +} + func request_Router_EstimateRouteFee_0(ctx context.Context, marshaler runtime.Marshaler, client RouterClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { var protoReq RouteFeeRequest var metadata runtime.ServerMetadata @@ -556,6 +584,13 @@ func RegisterRouterHandlerServer(ctx context.Context, mux *runtime.ServeMux, ser return }) + mux.Handle("GET", pattern_Router_TrackPayments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + err := status.Error(codes.Unimplemented, "streaming calls are not yet supported in the in-process transport") + _, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + }) + mux.Handle("POST", pattern_Router_EstimateRouteFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -881,6 +916,26 @@ func RegisterRouterHandlerClient(ctx context.Context, mux *runtime.ServeMux, cli }) + mux.Handle("GET", pattern_Router_TrackPayments_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { + ctx, cancel := context.WithCancel(req.Context()) + defer cancel() + inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req) + rctx, err := runtime.AnnotateContext(ctx, mux, req, "/routerrpc.Router/TrackPayments", runtime.WithHTTPPathPattern("/v2/router/payments")) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + resp, md, err := request_Router_TrackPayments_0(rctx, inboundMarshaler, client, req, pathParams) + ctx = runtime.NewServerMetadataContext(ctx, md) + if err != nil { + runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err) + return + } + + forward_Router_TrackPayments_0(ctx, mux, outboundMarshaler, w, req, func() (proto.Message, error) { return resp.Recv() }, mux.GetForwardResponseOptions()...) + + }) + mux.Handle("POST", pattern_Router_EstimateRouteFee_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) { ctx, cancel := context.WithCancel(req.Context()) defer cancel() @@ -1129,6 +1184,8 @@ var ( pattern_Router_TrackPaymentV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 1, 0, 4, 1, 5, 3}, []string{"v2", "router", "track", "payment_hash"}, "")) + pattern_Router_TrackPayments_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v2", "router", "payments"}, "")) + pattern_Router_EstimateRouteFee_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "router", "route", "estimatefee"}, "")) pattern_Router_SendToRouteV2_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v2", "router", "route", "send"}, "")) @@ -1159,6 +1216,8 @@ var ( forward_Router_TrackPaymentV2_0 = runtime.ForwardResponseStream + forward_Router_TrackPayments_0 = runtime.ForwardResponseStream + forward_Router_EstimateRouteFee_0 = runtime.ForwardResponseMessage forward_Router_SendToRouteV2_0 = runtime.ForwardResponseMessage diff --git a/lnrpc/routerrpc/router.pb.json.go b/lnrpc/routerrpc/router.pb.json.go index 15a1183cc..9b9aa92cf 100644 --- a/lnrpc/routerrpc/router.pb.json.go +++ b/lnrpc/routerrpc/router.pb.json.go @@ -107,6 +107,48 @@ func RegisterRouterJSONCallbacks(registry map[string]func(ctx context.Context, }() } + registry["routerrpc.Router.TrackPayments"] = func(ctx context.Context, + conn *grpc.ClientConn, reqJSON string, callback func(string, error)) { + + req := &TrackPaymentsRequest{} + err := marshaler.Unmarshal([]byte(reqJSON), req) + if err != nil { + callback("", err) + return + } + + client := NewRouterClient(conn) + stream, err := client.TrackPayments(ctx, req) + if err != nil { + callback("", err) + return + } + + go func() { + for { + select { + case <-stream.Context().Done(): + callback("", stream.Context().Err()) + return + default: + } + + resp, err := stream.Recv() + if err != nil { + callback("", err) + return + } + + respBytes, err := marshaler.Marshal(resp) + if err != nil { + callback("", err) + return + } + callback(string(respBytes), nil) + } + }() + } + registry["routerrpc.Router.EstimateRouteFee"] = func(ctx context.Context, conn *grpc.ClientConn, reqJSON string, callback func(string, error)) { diff --git a/lnrpc/routerrpc/router.proto b/lnrpc/routerrpc/router.proto index 04812b4d3..52b34eee5 100644 --- a/lnrpc/routerrpc/router.proto +++ b/lnrpc/routerrpc/router.proto @@ -22,6 +22,16 @@ service Router { */ rpc TrackPaymentV2 (TrackPaymentRequest) returns (stream lnrpc.Payment); + /* + TrackPayments returns an update stream for every payment that is not in a + terminal state. Note that if payments are in-flight while starting a new + subscription, the start of the payment stream could produce out-of-order + and/or duplicate events. In order to get updates for every in-flight + payment attempt make sure to subscribe to this method before initiating any + payments. + */ + rpc TrackPayments (TrackPaymentsRequest) returns (stream lnrpc.Payment); + /* EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it may cost to send an HTLC to the target end destination. @@ -303,6 +313,14 @@ message TrackPaymentRequest { bool no_inflight_updates = 2; } +message TrackPaymentsRequest { + /* + If set, only the final payment updates are streamed back. Intermediate + updates that show which htlcs are still in flight are suppressed. + */ + bool no_inflight_updates = 1; +} + message RouteFeeRequest { /* The destination once wishes to obtain a routing fee quote to. diff --git a/lnrpc/routerrpc/router.swagger.json b/lnrpc/routerrpc/router.swagger.json index aa57a2678..8cfe8c4a6 100644 --- a/lnrpc/routerrpc/router.swagger.json +++ b/lnrpc/routerrpc/router.swagger.json @@ -250,6 +250,47 @@ ] } }, + "/v2/router/payments": { + "get": { + "summary": "TrackPayments returns an update stream for every payment that is not in a\nterminal state. Note that if payments are in-flight while starting a new\nsubscription, the start of the payment stream could produce out-of-order\nand/or duplicate events. In order to get updates for every in-flight\npayment attempt make sure to subscribe to this method before initiating any\npayments.", + "operationId": "Router_TrackPayments", + "responses": { + "200": { + "description": "A successful response.(streaming responses)", + "schema": { + "type": "object", + "properties": { + "result": { + "$ref": "#/definitions/lnrpcPayment" + }, + "error": { + "$ref": "#/definitions/rpcStatus" + } + }, + "title": "Stream result of lnrpcPayment" + } + }, + "default": { + "description": "An unexpected error response.", + "schema": { + "$ref": "#/definitions/rpcStatus" + } + } + }, + "parameters": [ + { + "name": "no_inflight_updates", + "description": "If set, only the final payment updates are streamed back. Intermediate\nupdates that show which htlcs are still in flight are suppressed.", + "in": "query", + "required": false, + "type": "boolean" + } + ], + "tags": [ + "Router" + ] + } + }, "/v2/router/route": { "post": { "summary": "BuildRoute builds a fully specified route based on a list of hop public\nkeys. It retrieves the relevant channel policies from the graph in order to\ncalculate the correct fees and time locks.", diff --git a/lnrpc/routerrpc/router.yaml b/lnrpc/routerrpc/router.yaml index a3683db16..7c69376ed 100644 --- a/lnrpc/routerrpc/router.yaml +++ b/lnrpc/routerrpc/router.yaml @@ -8,6 +8,8 @@ http: body: "*" - selector: routerrpc.Router.TrackPaymentV2 get: "/v2/router/track/{payment_hash}" + - selector: routerrpc.Router.TrackPayments + get: "/v2/router/payments" - selector: routerrpc.Router.EstimateRouteFee post: "/v2/router/route/estimatefee" body: "*" diff --git a/lnrpc/routerrpc/router_grpc.pb.go b/lnrpc/routerrpc/router_grpc.pb.go index a259e399e..c16198cb7 100644 --- a/lnrpc/routerrpc/router_grpc.pb.go +++ b/lnrpc/routerrpc/router_grpc.pb.go @@ -26,6 +26,13 @@ type RouterClient interface { // TrackPaymentV2 returns an update stream for the payment identified by the // payment hash. TrackPaymentV2(ctx context.Context, in *TrackPaymentRequest, opts ...grpc.CallOption) (Router_TrackPaymentV2Client, error) + // TrackPayments returns an update stream for every payment that is not in a + // terminal state. Note that if payments are in-flight while starting a new + // subscription, the start of the payment stream could produce out-of-order + // and/or duplicate events. In order to get updates for every in-flight + // payment attempt make sure to subscribe to this method before initiating any + // payments. + TrackPayments(ctx context.Context, in *TrackPaymentsRequest, opts ...grpc.CallOption) (Router_TrackPaymentsClient, error) // EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it // may cost to send an HTLC to the target end destination. EstimateRouteFee(ctx context.Context, in *RouteFeeRequest, opts ...grpc.CallOption) (*RouteFeeResponse, error) @@ -165,6 +172,38 @@ func (x *routerTrackPaymentV2Client) Recv() (*lnrpc.Payment, error) { return m, nil } +func (c *routerClient) TrackPayments(ctx context.Context, in *TrackPaymentsRequest, opts ...grpc.CallOption) (Router_TrackPaymentsClient, error) { + stream, err := c.cc.NewStream(ctx, &Router_ServiceDesc.Streams[2], "/routerrpc.Router/TrackPayments", opts...) + if err != nil { + return nil, err + } + x := &routerTrackPaymentsClient{stream} + if err := x.ClientStream.SendMsg(in); err != nil { + return nil, err + } + if err := x.ClientStream.CloseSend(); err != nil { + return nil, err + } + return x, nil +} + +type Router_TrackPaymentsClient interface { + Recv() (*lnrpc.Payment, error) + grpc.ClientStream +} + +type routerTrackPaymentsClient struct { + grpc.ClientStream +} + +func (x *routerTrackPaymentsClient) Recv() (*lnrpc.Payment, error) { + m := new(lnrpc.Payment) + if err := x.ClientStream.RecvMsg(m); err != nil { + return nil, err + } + return m, nil +} + func (c *routerClient) EstimateRouteFee(ctx context.Context, in *RouteFeeRequest, opts ...grpc.CallOption) (*RouteFeeResponse, error) { out := new(RouteFeeResponse) err := c.cc.Invoke(ctx, "/routerrpc.Router/EstimateRouteFee", in, out, opts...) @@ -257,7 +296,7 @@ func (c *routerClient) BuildRoute(ctx context.Context, in *BuildRouteRequest, op } func (c *routerClient) SubscribeHtlcEvents(ctx context.Context, in *SubscribeHtlcEventsRequest, opts ...grpc.CallOption) (Router_SubscribeHtlcEventsClient, error) { - stream, err := c.cc.NewStream(ctx, &Router_ServiceDesc.Streams[2], "/routerrpc.Router/SubscribeHtlcEvents", opts...) + stream, err := c.cc.NewStream(ctx, &Router_ServiceDesc.Streams[3], "/routerrpc.Router/SubscribeHtlcEvents", opts...) if err != nil { return nil, err } @@ -290,7 +329,7 @@ func (x *routerSubscribeHtlcEventsClient) Recv() (*HtlcEvent, error) { // Deprecated: Do not use. func (c *routerClient) SendPayment(ctx context.Context, in *SendPaymentRequest, opts ...grpc.CallOption) (Router_SendPaymentClient, error) { - stream, err := c.cc.NewStream(ctx, &Router_ServiceDesc.Streams[3], "/routerrpc.Router/SendPayment", opts...) + stream, err := c.cc.NewStream(ctx, &Router_ServiceDesc.Streams[4], "/routerrpc.Router/SendPayment", opts...) if err != nil { return nil, err } @@ -323,7 +362,7 @@ func (x *routerSendPaymentClient) Recv() (*PaymentStatus, error) { // Deprecated: Do not use. func (c *routerClient) TrackPayment(ctx context.Context, in *TrackPaymentRequest, opts ...grpc.CallOption) (Router_TrackPaymentClient, error) { - stream, err := c.cc.NewStream(ctx, &Router_ServiceDesc.Streams[4], "/routerrpc.Router/TrackPayment", opts...) + stream, err := c.cc.NewStream(ctx, &Router_ServiceDesc.Streams[5], "/routerrpc.Router/TrackPayment", opts...) if err != nil { return nil, err } @@ -355,7 +394,7 @@ func (x *routerTrackPaymentClient) Recv() (*PaymentStatus, error) { } func (c *routerClient) HtlcInterceptor(ctx context.Context, opts ...grpc.CallOption) (Router_HtlcInterceptorClient, error) { - stream, err := c.cc.NewStream(ctx, &Router_ServiceDesc.Streams[5], "/routerrpc.Router/HtlcInterceptor", opts...) + stream, err := c.cc.NewStream(ctx, &Router_ServiceDesc.Streams[6], "/routerrpc.Router/HtlcInterceptor", opts...) if err != nil { return nil, err } @@ -405,6 +444,13 @@ type RouterServer interface { // TrackPaymentV2 returns an update stream for the payment identified by the // payment hash. TrackPaymentV2(*TrackPaymentRequest, Router_TrackPaymentV2Server) error + // TrackPayments returns an update stream for every payment that is not in a + // terminal state. Note that if payments are in-flight while starting a new + // subscription, the start of the payment stream could produce out-of-order + // and/or duplicate events. In order to get updates for every in-flight + // payment attempt make sure to subscribe to this method before initiating any + // payments. + TrackPayments(*TrackPaymentsRequest, Router_TrackPaymentsServer) error // EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it // may cost to send an HTLC to the target end destination. EstimateRouteFee(context.Context, *RouteFeeRequest) (*RouteFeeResponse, error) @@ -483,6 +529,9 @@ func (UnimplementedRouterServer) SendPaymentV2(*SendPaymentRequest, Router_SendP func (UnimplementedRouterServer) TrackPaymentV2(*TrackPaymentRequest, Router_TrackPaymentV2Server) error { return status.Errorf(codes.Unimplemented, "method TrackPaymentV2 not implemented") } +func (UnimplementedRouterServer) TrackPayments(*TrackPaymentsRequest, Router_TrackPaymentsServer) error { + return status.Errorf(codes.Unimplemented, "method TrackPayments not implemented") +} func (UnimplementedRouterServer) EstimateRouteFee(context.Context, *RouteFeeRequest) (*RouteFeeResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method EstimateRouteFee not implemented") } @@ -583,6 +632,27 @@ func (x *routerTrackPaymentV2Server) Send(m *lnrpc.Payment) error { return x.ServerStream.SendMsg(m) } +func _Router_TrackPayments_Handler(srv interface{}, stream grpc.ServerStream) error { + m := new(TrackPaymentsRequest) + if err := stream.RecvMsg(m); err != nil { + return err + } + return srv.(RouterServer).TrackPayments(m, &routerTrackPaymentsServer{stream}) +} + +type Router_TrackPaymentsServer interface { + Send(*lnrpc.Payment) error + grpc.ServerStream +} + +type routerTrackPaymentsServer struct { + grpc.ServerStream +} + +func (x *routerTrackPaymentsServer) Send(m *lnrpc.Payment) error { + return x.ServerStream.SendMsg(m) +} + func _Router_EstimateRouteFee_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(RouteFeeRequest) if err := dec(in); err != nil { @@ -933,6 +1003,11 @@ var Router_ServiceDesc = grpc.ServiceDesc{ Handler: _Router_TrackPaymentV2_Handler, ServerStreams: true, }, + { + StreamName: "TrackPayments", + Handler: _Router_TrackPayments_Handler, + ServerStreams: true, + }, { StreamName: "SubscribeHtlcEvents", Handler: _Router_SubscribeHtlcEvents_Handler, diff --git a/lnrpc/routerrpc/router_server.go b/lnrpc/routerrpc/router_server.go index 08d00e9b8..da4321eed 100644 --- a/lnrpc/routerrpc/router_server.go +++ b/lnrpc/routerrpc/router_server.go @@ -72,6 +72,10 @@ var ( Entity: "offchain", Action: "read", }}, + "/routerrpc.Router/TrackPayments": {{ + Entity: "offchain", + Action: "read", + }}, "/routerrpc.Router/EstimateRouteFee": {{ Entity: "offchain", Action: "read", @@ -737,22 +741,65 @@ func (s *Server) trackPayment(identifier lntypes.Hash, router := s.cfg.RouterBackend // Subscribe to the outcome of this payment. - subscription, err := router.Tower.SubscribePayment( - identifier, - ) + subscription, err := router.Tower.SubscribePayment(identifier) + switch { case err == channeldb.ErrPaymentNotInitiated: return status.Error(codes.NotFound, err.Error()) case err != nil: return err } + + // Stream updates to the client. + err = s.trackPaymentStream( + stream.Context(), subscription, noInflightUpdates, stream.Send, + ) + + if errors.Is(err, context.Canceled) { + log.Debugf("Payment stream %v canceled", identifier) + } + + return err +} + +// TrackPayments returns a stream of payment state updates. +func (s *Server) TrackPayments(request *TrackPaymentsRequest, + stream Router_TrackPaymentsServer) error { + + log.Debug("TrackPayments called") + + router := s.cfg.RouterBackend + + // Subscribe to payments. + subscription, err := router.Tower.SubscribeAllPayments() + if err != nil { + return err + } + + // Stream updates to the client. + err = s.trackPaymentStream( + stream.Context(), subscription, request.NoInflightUpdates, + stream.Send, + ) + + if errors.Is(err, context.Canceled) { + log.Debugf("TrackPayments payment stream canceled.") + } + + return err +} + +// trackPaymentStream streams payment updates to the client. +func (s *Server) trackPaymentStream(context context.Context, + subscription routing.ControlTowerSubscriber, noInflightUpdates bool, + send func(*lnrpc.Payment) error) error { + defer subscription.Close() - // Stream updates back to the client. The first update is always the - // current state of the payment. + // Stream updates back to the client. for { select { - case item, ok := <-subscription.Updates: + case item, ok := <-subscription.Updates(): if !ok { // No more payment updates. return nil @@ -766,13 +813,15 @@ func (s *Server) trackPayment(identifier lntypes.Hash, continue } - rpcPayment, err := router.MarshallPayment(result) + rpcPayment, err := s.cfg.RouterBackend.MarshallPayment( + result, + ) if err != nil { return err } // Send event to the client. - err = stream.Send(rpcPayment) + err = send(rpcPayment) if err != nil { return err } @@ -780,9 +829,8 @@ func (s *Server) trackPayment(identifier lntypes.Hash, case <-s.quit: return errServerShuttingDown - case <-stream.Context().Done(): - log.Debugf("Payment status stream %v canceled", identifier) - return stream.Context().Err() + case <-context.Done(): + return context.Err() } } } diff --git a/lnrpc/routerrpc/router_server_test.go b/lnrpc/routerrpc/router_server_test.go new file mode 100644 index 000000000..1cdb4b586 --- /dev/null +++ b/lnrpc/routerrpc/router_server_test.go @@ -0,0 +1,216 @@ +package routerrpc + +import ( + "context" + "testing" + "time" + + "github.com/lightningnetwork/lnd/channeldb" + "github.com/lightningnetwork/lnd/lnrpc" + "github.com/lightningnetwork/lnd/queue" + "github.com/lightningnetwork/lnd/routing" + "github.com/stretchr/testify/require" + "google.golang.org/grpc" +) + +type streamMock struct { + grpc.ServerStream + ctx context.Context + sentFromServer chan *lnrpc.Payment +} + +func makeStreamMock(ctx context.Context) *streamMock { + return &streamMock{ + ctx: ctx, + sentFromServer: make(chan *lnrpc.Payment, 10), + } +} + +func (m *streamMock) Context() context.Context { + return m.ctx +} + +func (m *streamMock) Send(p *lnrpc.Payment) error { + m.sentFromServer <- p + return nil +} + +type controlTowerSubscriberMock struct { + updates <-chan interface{} +} + +func (s controlTowerSubscriberMock) Updates() <-chan interface{} { + return s.updates +} + +func (s controlTowerSubscriberMock) Close() { +} + +type controlTowerMock struct { + queue *queue.ConcurrentQueue + routing.ControlTower +} + +func makeControlTowerMock() *controlTowerMock { + towerMock := &controlTowerMock{ + queue: queue.NewConcurrentQueue(20), + } + towerMock.queue.Start() + + return towerMock +} + +func (t *controlTowerMock) SubscribeAllPayments() ( + routing.ControlTowerSubscriber, error) { + + return &controlTowerSubscriberMock{ + updates: t.queue.ChanOut(), + }, nil +} + +// TestTrackPaymentsReturnsOnCancelContext tests whether TrackPayments returns +// when the stream context is cancelled. +func TestTrackPaymentsReturnsOnCancelContext(t *testing.T) { + // Setup mocks and request. + request := &TrackPaymentsRequest{ + NoInflightUpdates: false, + } + towerMock := makeControlTowerMock() + + streamCtx, cancelStream := context.WithCancel(context.Background()) + stream := makeStreamMock(streamCtx) + + server := &Server{ + cfg: &Config{ + RouterBackend: &RouterBackend{ + Tower: towerMock, + }, + }, + } + + // Cancel stream immediately + cancelStream() + + // Make sure the call returns. + err := server.TrackPayments(request, stream) + require.Equal(t, context.Canceled, err) +} + +// TestTrackPaymentsInflightUpdate tests whether all updates from the control +// tower are propagated to the client. +func TestTrackPaymentsInflightUpdates(t *testing.T) { + // Setup mocks and request. + request := &TrackPaymentsRequest{ + NoInflightUpdates: false, + } + towerMock := makeControlTowerMock() + + streamCtx, cancelStream := context.WithCancel(context.Background()) + stream := makeStreamMock(streamCtx) + defer cancelStream() + + server := &Server{ + cfg: &Config{ + RouterBackend: &RouterBackend{ + Tower: towerMock, + }, + }, + } + + // Listen to payment updates in a goroutine. + go func() { + err := server.TrackPayments(request, stream) + require.Equal(t, context.Canceled, err) + }() + + // Enqueue some payment updates on the mock. + towerMock.queue.ChanIn() <- &channeldb.MPPayment{ + Info: &channeldb.PaymentCreationInfo{}, + Status: channeldb.StatusInFlight, + } + towerMock.queue.ChanIn() <- &channeldb.MPPayment{ + Info: &channeldb.PaymentCreationInfo{}, + Status: channeldb.StatusSucceeded, + } + + // Wait until there's 2 updates or the deadline is exceeded. + deadline := time.Now().Add(1 * time.Second) + for { + if len(stream.sentFromServer) == 2 { + break + } + + if time.Now().After(deadline) { + require.FailNow(t, "deadline exceeded.") + } + } + + // Both updates should be sent to the client. + require.Len(t, stream.sentFromServer, 2) + + // The updates should be in the right order. + payment := <-stream.sentFromServer + require.Equal(t, lnrpc.Payment_IN_FLIGHT, payment.Status) + payment = <-stream.sentFromServer + require.Equal(t, lnrpc.Payment_SUCCEEDED, payment.Status) +} + +// TestTrackPaymentsInflightUpdate tests whether only final updates from the +// control tower are propagated to the client when noInflightUpdates = true. +func TestTrackPaymentsNoInflightUpdates(t *testing.T) { + // Setup mocks and request. + request := &TrackPaymentsRequest{ + NoInflightUpdates: true, + } + towerMock := &controlTowerMock{ + queue: queue.NewConcurrentQueue(20), + } + towerMock.queue.Start() + + streamCtx, cancelStream := context.WithCancel(context.Background()) + stream := makeStreamMock(streamCtx) + defer cancelStream() + + server := &Server{ + cfg: &Config{ + RouterBackend: &RouterBackend{ + Tower: towerMock, + }, + }, + } + + // Listen to payment updates in a goroutine. + go func() { + err := server.TrackPayments(request, stream) + require.Equal(t, context.Canceled, err) + }() + + // Enqueue some payment updates on the mock. + towerMock.queue.ChanIn() <- &channeldb.MPPayment{ + Info: &channeldb.PaymentCreationInfo{}, + Status: channeldb.StatusInFlight, + } + towerMock.queue.ChanIn() <- &channeldb.MPPayment{ + Info: &channeldb.PaymentCreationInfo{}, + Status: channeldb.StatusSucceeded, + } + + // Wait until there's 1 update or the deadline is exceeded. + deadline := time.Now().Add(1 * time.Second) + for { + if len(stream.sentFromServer) == 1 { + break + } + + if time.Now().After(deadline) { + require.FailNow(t, "deadline exceeded.") + } + } + + // Only 1 update should be sent to the client. + require.Len(t, stream.sentFromServer, 1) + + // Only the final states should be sent to the client. + payment := <-stream.sentFromServer + require.Equal(t, lnrpc.Payment_SUCCEEDED, payment.Status) +} diff --git a/lntest/itest/lnd_test_list_on_test.go b/lntest/itest/lnd_test_list_on_test.go index 0cf1c106e..ac2adad83 100644 --- a/lntest/itest/lnd_test_list_on_test.go +++ b/lntest/itest/lnd_test_list_on_test.go @@ -439,4 +439,8 @@ var allTestCases = []*testCase{ name: "taproot coop close", test: testTaprootCoopClose, }, + { + name: "trackpayments", + test: testTrackPayments, + }, } diff --git a/lntest/itest/lnd_trackpayments_test.go b/lntest/itest/lnd_trackpayments_test.go new file mode 100644 index 000000000..8819b95cc --- /dev/null +++ b/lntest/itest/lnd_trackpayments_test.go @@ -0,0 +1,102 @@ +package itest + +import ( + "context" + "encoding/hex" + + "github.com/btcsuite/btcd/btcutil" + "github.com/lightningnetwork/lnd/lnrpc" + "github.com/lightningnetwork/lnd/lnrpc/routerrpc" + "github.com/lightningnetwork/lnd/lntest" + "github.com/stretchr/testify/require" +) + +// testTrackPayments tests whether a client that calls the TrackPayments api +// receives payment updates. +func testTrackPayments(net *lntest.NetworkHarness, t *harnessTest) { + // Open a channel between alice and bob. + net.EnsureConnected(t.t, net.Alice, net.Bob) + channel := openChannelAndAssert( + t, net, net.Alice, net.Bob, + lntest.OpenChannelParams{ + Amt: btcutil.Amount(300000), + }, + ) + defer closeChannelAndAssert(t, net, net.Alice, channel, true) + + err := net.Alice.WaitForNetworkChannelOpen(channel) + require.NoError(t.t, err, "unable to wait for channel to open") + + ctxb := context.Background() + ctxt, cancelTracker := context.WithCancel(ctxb) + defer cancelTracker() + + // Call the TrackPayments api to listen for payment updates. + tracker, err := net.Alice.RouterClient.TrackPayments( + ctxt, + &routerrpc.TrackPaymentsRequest{ + NoInflightUpdates: false, + }, + ) + require.NoError(t.t, err, "failed to call TrackPayments successfully.") + + // Create an invoice from bob. + var amountMsat int64 = 1000 + invoiceResp, err := net.Bob.AddInvoice( + ctxb, + &lnrpc.Invoice{ + ValueMsat: amountMsat, + }, + ) + require.NoError(t.t, err, "unable to add invoice.") + + invoice, err := net.Bob.LookupInvoice( + ctxb, + &lnrpc.PaymentHash{ + RHashStr: hex.EncodeToString(invoiceResp.RHash), + }, + ) + require.NoError(t.t, err, "unable to find invoice.") + + // Send payment from alice to bob. + paymentClient, err := net.Alice.RouterClient.SendPaymentV2( + ctxb, + &routerrpc.SendPaymentRequest{ + PaymentRequest: invoice.PaymentRequest, + TimeoutSeconds: 60, + }, + ) + require.NoError(t.t, err, "unable to send payment.") + + // Make sure the payment doesn't error due to invalid parameters or so. + _, err = paymentClient.Recv() + require.NoError(t.t, err, "unable to get payment update.") + + // Assert the first payment update is an inflight update. + update1, err := tracker.Recv() + require.NoError(t.t, err, "unable to receive payment update 1.") + + require.Equal( + t.t, lnrpc.PaymentFailureReason_FAILURE_REASON_NONE, + update1.FailureReason, + ) + require.Equal(t.t, lnrpc.Payment_IN_FLIGHT, update1.Status) + require.Equal(t.t, invoice.PaymentRequest, update1.PaymentRequest) + require.Equal(t.t, amountMsat, update1.ValueMsat) + + // Assert the second payment update is a payment success update. + update2, err := tracker.Recv() + require.NoError(t.t, err, "unable to receive payment update 2.") + + require.Equal( + t.t, lnrpc.PaymentFailureReason_FAILURE_REASON_NONE, + update2.FailureReason, + ) + require.Equal(t.t, lnrpc.Payment_SUCCEEDED, update2.Status) + require.Equal(t.t, invoice.PaymentRequest, update2.PaymentRequest) + require.Equal(t.t, amountMsat, update2.ValueMsat) + require.Equal( + t.t, hex.EncodeToString(invoice.RPreimage), + update2.PaymentPreimage, + ) +} diff --git a/routing/control_tower.go b/routing/control_tower.go index be6e61b4e..9f95bb252 100644 --- a/routing/control_tower.go +++ b/routing/control_tower.go @@ -60,35 +60,48 @@ type ControlTower interface { // SubscribePayment subscribes to updates for the payment with the given // hash. A first update with the current state of the payment is always // sent out immediately. - SubscribePayment(paymentHash lntypes.Hash) (*ControlTowerSubscriber, + SubscribePayment(paymentHash lntypes.Hash) (ControlTowerSubscriber, error) + + // SubscribeAllPayments subscribes to updates for all payments. A first + // update with the current state of every inflight payment is always + // sent out immediately. + SubscribeAllPayments() (ControlTowerSubscriber, error) } // ControlTowerSubscriber contains the state for a payment update subscriber. -type ControlTowerSubscriber struct { +type ControlTowerSubscriber interface { // Updates is the channel over which *channeldb.MPPayment updates can be // received. - Updates <-chan interface{} + Updates() <-chan interface{} - queue *queue.ConcurrentQueue - quit chan struct{} + // Close signals that the subscriber is no longer interested in updates. + Close() +} + +// ControlTowerSubscriberImpl contains the state for a payment update +// subscriber. +type controlTowerSubscriberImpl struct { + updates <-chan interface{} + queue *queue.ConcurrentQueue + quit chan struct{} } // newControlTowerSubscriber instantiates a new subscriber state object. -func newControlTowerSubscriber() *ControlTowerSubscriber { +func newControlTowerSubscriber() *controlTowerSubscriberImpl { // Create a queue for payment updates. queue := queue.NewConcurrentQueue(20) queue.Start() - return &ControlTowerSubscriber{ - Updates: queue.ChanOut(), + return &controlTowerSubscriberImpl{ + updates: queue.ChanOut(), queue: queue, quit: make(chan struct{}), } } // Close signals that the subscriber is no longer interested in updates. -func (s *ControlTowerSubscriber) Close() { +func (s *controlTowerSubscriberImpl) Close() { // Close quit channel so that any pending writes to the queue are // cancelled. close(s.quit) @@ -97,13 +110,24 @@ func (s *ControlTowerSubscriber) Close() { s.queue.Stop() } +// Updates is the channel over which *channeldb.MPPayment updates can be +// received. +func (s *controlTowerSubscriberImpl) Updates() <-chan interface{} { + return s.updates +} + // controlTower is persistent implementation of ControlTower to restrict // double payment sending. type controlTower struct { db *channeldb.PaymentControl - subscribers map[lntypes.Hash][]*ControlTowerSubscriber - subscribersMtx sync.Mutex + // subscriberIndex is used to provide a unique id for each subscriber + // to all payments. This is used to easily remove the subscriber when + // necessary. + subscriberIndex uint64 + subscribersAllPayments map[uint64]*controlTowerSubscriberImpl + subscribers map[lntypes.Hash][]*controlTowerSubscriberImpl + subscribersMtx sync.Mutex // paymentsMtx provides synchronization on the payment level to ensure // that no race conditions occur in between updating the database and @@ -114,8 +138,11 @@ type controlTower struct { // NewControlTower creates a new instance of the controlTower. func NewControlTower(db *channeldb.PaymentControl) ControlTower { return &controlTower{ - db: db, - subscribers: make(map[lntypes.Hash][]*ControlTowerSubscriber), + db: db, + subscribersAllPayments: make( + map[uint64]*controlTowerSubscriberImpl, + ), + subscribers: make(map[lntypes.Hash][]*controlTowerSubscriberImpl), paymentsMtx: multimutex.NewHashMutex(), } } @@ -232,7 +259,7 @@ func (p *controlTower) FetchInFlightPayments() ([]*channeldb.MPPayment, error) { // first update with the current state of the payment is always sent out // immediately. func (p *controlTower) SubscribePayment(paymentHash lntypes.Hash) ( - *ControlTowerSubscriber, error) { + ControlTowerSubscriber, error) { // Take lock before querying the db to prevent missing or duplicating an // update. @@ -266,6 +293,39 @@ func (p *controlTower) SubscribePayment(paymentHash lntypes.Hash) ( return subscriber, nil } +// SubscribeAllPayments subscribes to updates for all inflight payments. A first +// update with the current state of every inflight payment is always sent out +// immediately. +// Note: If payments are in-flight while starting a new subscription, the start +// of the payment stream could produce out-of-order and/or duplicate events. In +// order to get updates for every in-flight payment attempt make sure to +// subscribe to this method before initiating any payments. +func (p *controlTower) SubscribeAllPayments() (ControlTowerSubscriber, error) { + subscriber := newControlTowerSubscriber() + + // Add the subscriber to the list before fetching in-flight payments, so + // no events are missed. If a payment attempt update occurs after + // appending and before fetching in-flight payments, an out-of-order + // duplicate may be produced, because it is then fetched in below call + // and notified through the subscription. + p.subscribersMtx.Lock() + p.subscribersAllPayments[p.subscriberIndex] = subscriber + p.subscriberIndex++ + p.subscribersMtx.Unlock() + + inflightPayments, err := p.db.FetchInFlightPayments() + if err != nil { + return nil, err + } + + for index := range inflightPayments { + // Always write current payment state to the channel. + subscriber.queue.ChanIn() <- inflightPayments[index] + } + + return subscriber, nil +} + // notifySubscribers sends a final payment event to all subscribers of this // payment. The channel will be closed after this. Note that this function must // be executed atomically (by means of a lock) with the database update to @@ -275,8 +335,9 @@ func (p *controlTower) notifySubscribers(paymentHash lntypes.Hash, // Get all subscribers for this payment. p.subscribersMtx.Lock() - list, ok := p.subscribers[paymentHash] - if !ok { + + subscribersPaymentHash, ok := p.subscribers[paymentHash] + if !ok && len(p.subscribersAllPayments) == 0 { p.subscribersMtx.Unlock() return } @@ -287,10 +348,17 @@ func (p *controlTower) notifySubscribers(paymentHash lntypes.Hash, if terminal { delete(p.subscribers, paymentHash) } + + // Copy subscribers to all payments locally while holding the lock in + // order to avoid concurrency issues while reading/writing the map. + subscribersAllPayments := make(map[uint64]*controlTowerSubscriberImpl) + for k, v := range p.subscribersAllPayments { + subscribersAllPayments[k] = v + } p.subscribersMtx.Unlock() - // Notify all subscribers of the event. - for _, subscriber := range list { + // Notify all subscribers that subscribed to the current payment hash. + for _, subscriber := range subscribersPaymentHash { select { case subscriber.queue.ChanIn() <- event: // If this event is the last, close the incoming channel @@ -305,4 +373,18 @@ func (p *controlTower) notifySubscribers(paymentHash lntypes.Hash, case <-subscriber.quit: } } + + // Notify all subscribers that subscribed to all payments. + for key, subscriber := range subscribersAllPayments { + select { + case subscriber.queue.ChanIn() <- event: + + // If subscriber disappeared, remove it from the subscribers + // list. + case <-subscriber.quit: + p.subscribersMtx.Lock() + delete(p.subscribersAllPayments, key) + p.subscribersMtx.Unlock() + } + } } diff --git a/routing/control_tower_test.go b/routing/control_tower_test.go index 80a8fbc5c..3dd2c5234 100644 --- a/routing/control_tower_test.go +++ b/routing/control_tower_test.go @@ -115,7 +115,7 @@ func TestControlTowerSubscribeSuccess(t *testing.T) { // We expect all subscribers to now report the final outcome followed by // no other events. - subscribers := []*ControlTowerSubscriber{ + subscribers := []ControlTowerSubscriber{ subscriber1, subscriber2, subscriber3, } @@ -123,7 +123,7 @@ func TestControlTowerSubscribeSuccess(t *testing.T) { var result *channeldb.MPPayment for result == nil || result.Status == channeldb.StatusInFlight { select { - case item := <-s.Updates: + case item := <-s.Updates(): result = item.(*channeldb.MPPayment) case <-time.After(testTimeout): t.Fatal("timeout waiting for payment result") @@ -149,7 +149,7 @@ func TestControlTowerSubscribeSuccess(t *testing.T) { // After the final event, we expect the channel to be closed. select { - case _, ok := <-s.Updates: + case _, ok := <-s.Updates(): if ok { t.Fatal("expected channel to be closed") } @@ -178,6 +178,236 @@ func TestPaymentControlSubscribeFail(t *testing.T) { }) } +// TestPaymentControlSubscribeAllSuccess tests that multiple payments are +// properly sent to subscribers of TrackPayments. +func TestPaymentControlSubscribeAllSuccess(t *testing.T) { + t.Parallel() + + db, err := initDB(t, true) + require.NoError(t, err, "unable to init db: %v") + + pControl := NewControlTower(channeldb.NewPaymentControl(db)) + + // Initiate a payment. + info1, attempt1, preimg1, err := genInfo() + require.NoError(t, err) + + err = pControl.InitPayment(info1.PaymentIdentifier, info1) + require.NoError(t, err) + + // Subscription should succeed and immediately report the InFlight + // status. + subscription, err := pControl.SubscribeAllPayments() + require.NoError(t, err, "expected subscribe to succeed, but got: %v") + + // Register an attempt. + err = pControl.RegisterAttempt(info1.PaymentIdentifier, attempt1) + require.NoError(t, err) + + // Initiate a second payment after the subscription is already active. + info2, attempt2, preimg2, err := genInfo() + require.NoError(t, err) + + err = pControl.InitPayment(info2.PaymentIdentifier, info2) + require.NoError(t, err) + + // Register an attempt on the second payment. + err = pControl.RegisterAttempt(info2.PaymentIdentifier, attempt2) + require.NoError(t, err) + + // Mark the first payment as successful. + settleInfo1 := channeldb.HTLCSettleInfo{ + Preimage: preimg1, + } + htlcAttempt1, err := pControl.SettleAttempt( + info1.PaymentIdentifier, attempt1.AttemptID, &settleInfo1, + ) + require.NoError(t, err) + require.Equal( + t, settleInfo1, *htlcAttempt1.Settle, + "unexpected settle info returned", + ) + + // Mark the second payment as successful. + settleInfo2 := channeldb.HTLCSettleInfo{ + Preimage: preimg2, + } + htlcAttempt2, err := pControl.SettleAttempt( + info2.PaymentIdentifier, attempt2.AttemptID, &settleInfo2, + ) + require.NoError(t, err) + require.Equal( + t, settleInfo2, *htlcAttempt2.Settle, + "unexpected fail info returned", + ) + + // The two payments will be asserted individually, store the last update + // for each payment. + results := make(map[lntypes.Hash]*channeldb.MPPayment) + + // After exactly 5 updates both payments will/should have completed. + for i := 0; i < 5; i++ { + select { + case item := <-subscription.Updates(): + id := item.(*channeldb.MPPayment).Info.PaymentIdentifier + results[id] = item.(*channeldb.MPPayment) + case <-time.After(testTimeout): + require.Fail(t, "timeout waiting for payment result") + } + } + + result1 := results[info1.PaymentIdentifier] + require.Equal( + t, channeldb.StatusSucceeded, result1.Status, + "unexpected payment state payment 1", + ) + + settle1, _ := result1.TerminalInfo() + require.Equal( + t, preimg1, settle1.Preimage, "unexpected preimage payment 1", + ) + + require.Len( + t, result1.HTLCs, 1, "expect 1 htlc for payment 1, got %d", + len(result1.HTLCs), + ) + + htlc1 := result1.HTLCs[0] + require.Equal(t, attempt1.Route, htlc1.Route, "unexpected htlc route.") + + result2 := results[info2.PaymentIdentifier] + require.Equal( + t, channeldb.StatusSucceeded, result2.Status, + "unexpected payment state payment 2", + ) + + settle2, _ := result2.TerminalInfo() + require.Equal( + t, preimg2, settle2.Preimage, "unexpected preimage payment 2", + ) + require.Len( + t, result2.HTLCs, 1, "expect 1 htlc for payment 2, got %d", + len(result2.HTLCs), + ) + + htlc2 := result2.HTLCs[0] + require.Equal(t, attempt2.Route, htlc2.Route, "unexpected htlc route.") +} + +// TestPaymentControlSubscribeAllImmediate tests whether already inflight +// payments are reported at the start of the SubscribeAllPayments subscription. +func TestPaymentControlSubscribeAllImmediate(t *testing.T) { + t.Parallel() + + db, err := initDB(t, true) + require.NoError(t, err, "unable to init db: %v") + + pControl := NewControlTower(channeldb.NewPaymentControl(db)) + + // Initiate a payment. + info, attempt, _, err := genInfo() + require.NoError(t, err) + + err = pControl.InitPayment(info.PaymentIdentifier, info) + require.NoError(t, err) + + // Register a payment update. + err = pControl.RegisterAttempt(info.PaymentIdentifier, attempt) + require.NoError(t, err) + + subscription, err := pControl.SubscribeAllPayments() + require.NoError(t, err, "expected subscribe to succeed, but got: %v") + + // Assert the new subscription receives the old update. + select { + case update := <-subscription.Updates(): + require.NotNil(t, update) + require.Equal( + t, info.PaymentIdentifier, + update.(*channeldb.MPPayment).Info.PaymentIdentifier, + ) + require.Len(t, subscription.Updates(), 0) + case <-time.After(testTimeout): + require.Fail(t, "timeout waiting for payment result") + } +} + +// TestPaymentControlUnsubscribeSuccess tests that when unsubscribed, there are +// no more notifications to that specific subscription. +func TestPaymentControlUnsubscribeSuccess(t *testing.T) { + t.Parallel() + + db, err := initDB(t, true) + require.NoError(t, err, "unable to init db: %v") + + pControl := NewControlTower(channeldb.NewPaymentControl(db)) + + subscription1, err := pControl.SubscribeAllPayments() + require.NoError(t, err, "expected subscribe to succeed, but got: %v") + + subscription2, err := pControl.SubscribeAllPayments() + require.NoError(t, err, "expected subscribe to succeed, but got: %v") + + // Initiate a payment. + info, attempt, _, err := genInfo() + require.NoError(t, err) + + err = pControl.InitPayment(info.PaymentIdentifier, info) + require.NoError(t, err) + + // Register a payment update. + err = pControl.RegisterAttempt(info.PaymentIdentifier, attempt) + require.NoError(t, err) + + // Assert all subscriptions receive the update. + select { + case update1 := <-subscription1.Updates(): + require.NotNil(t, update1) + case <-time.After(testTimeout): + require.Fail(t, "timeout waiting for payment result") + } + + select { + case update2 := <-subscription2.Updates(): + require.NotNil(t, update2) + case <-time.After(testTimeout): + require.Fail(t, "timeout waiting for payment result") + } + + // Close the first subscription. + subscription1.Close() + + // Register another update. + failInfo := channeldb.HTLCFailInfo{ + Reason: channeldb.HTLCFailInternal, + } + _, err = pControl.FailAttempt( + info.PaymentIdentifier, attempt.AttemptID, &failInfo, + ) + require.NoError(t, err, "unable to fail htlc") + + // Assert only subscription 2 receives the update. + select { + case update2 := <-subscription2.Updates(): + require.NotNil(t, update2) + case <-time.After(testTimeout): + require.Fail(t, "timeout waiting for payment result") + } + + require.Len(t, subscription1.Updates(), 0) + + // Close the second subscription. + subscription2.Close() + + // Register a last update. + err = pControl.RegisterAttempt(info.PaymentIdentifier, attempt) + require.NoError(t, err) + + // Assert no subscriptions receive the update. + require.Len(t, subscription1.Updates(), 0) + require.Len(t, subscription2.Updates(), 0) +} + func testPaymentControlSubscribeFail(t *testing.T, registerAttempt, keepFailedPaymentAttempts bool) { @@ -237,7 +467,7 @@ func testPaymentControlSubscribeFail(t *testing.T, registerAttempt, // We expect both subscribers to now report the final outcome followed // by no other events. - subscribers := []*ControlTowerSubscriber{ + subscribers := []ControlTowerSubscriber{ subscriber1, subscriber2, } @@ -245,7 +475,7 @@ func testPaymentControlSubscribeFail(t *testing.T, registerAttempt, var result *channeldb.MPPayment for result == nil || result.Status == channeldb.StatusInFlight { select { - case item := <-s.Updates: + case item := <-s.Updates(): result = item.(*channeldb.MPPayment) case <-time.After(testTimeout): t.Fatal("timeout waiting for payment result") @@ -283,7 +513,7 @@ func testPaymentControlSubscribeFail(t *testing.T, registerAttempt, // After the final event, we expect the channel to be closed. select { - case _, ok := <-s.Updates: + case _, ok := <-s.Updates(): if ok { t.Fatal("expected channel to be closed") } diff --git a/routing/mock_test.go b/routing/mock_test.go index 67f6fa432..b0a9ba4ff 100644 --- a/routing/mock_test.go +++ b/routing/mock_test.go @@ -552,7 +552,13 @@ func (m *mockControlTowerOld) FetchInFlightPayments() ( } func (m *mockControlTowerOld) SubscribePayment(paymentHash lntypes.Hash) ( - *ControlTowerSubscriber, error) { + ControlTowerSubscriber, error) { + + return nil, errors.New("not implemented") +} + +func (m *mockControlTowerOld) SubscribeAllPayments() ( + ControlTowerSubscriber, error) { return nil, errors.New("not implemented") } @@ -768,10 +774,17 @@ func (m *mockControlTower) FetchInFlightPayments() ( } func (m *mockControlTower) SubscribePayment(paymentHash lntypes.Hash) ( - *ControlTowerSubscriber, error) { + ControlTowerSubscriber, error) { args := m.Called(paymentHash) - return args.Get(0).(*ControlTowerSubscriber), args.Error(1) + return args.Get(0).(ControlTowerSubscriber), args.Error(1) +} + +func (m *mockControlTower) SubscribeAllPayments() ( + ControlTowerSubscriber, error) { + + args := m.Called() + return args.Get(0).(ControlTowerSubscriber), args.Error(1) } type mockLink struct {