From 7ba67655ef9dbdaa31c4453556e519d4c48e78fe Mon Sep 17 00:00:00 2001 From: Alex Bosworth Date: Tue, 25 Oct 2022 20:21:45 -0700 Subject: [PATCH 01/14] version: bump version to v0.20.2-beta --- release_notes.md | 2 -- version.go | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/release_notes.md b/release_notes.md index 08c8c28..c71d135 100644 --- a/release_notes.md +++ b/release_notes.md @@ -19,7 +19,5 @@ This file tracks release notes for the loop client. #### Breaking Changes #### Bug Fixes -* Bump minimum LND version to v0.15.1-beta to avoid failed swaps due to the chain - backend not properly supporting taproot (fixed in: https://github.com/lightningnetwork/lnd/pull/6798). #### Maintenance diff --git a/version.go b/version.go index 56eaa19..340d635 100644 --- a/version.go +++ b/version.go @@ -27,7 +27,7 @@ const ( // Note: please update release_notes.md when you change these values. appMajor uint = 0 appMinor uint = 20 - appPatch uint = 1 + appPatch uint = 2 // appPreRelease MUST only contain characters from semanticAlphabet per // the semantic versioning spec. From b36885fb6598a45f3ac7e2770d04e1002d3a4896 Mon Sep 17 00:00:00 2001 From: Andras Banki-Horvath Date: Fri, 4 Nov 2022 10:44:16 +0100 Subject: [PATCH 02/14] loopd: correct htlc output type on view command Previously view may have set the output type wrongly for internal p2wsh and p2tr loop-in swaps which is corrected in this commit. --- loopd/view.go | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/loopd/view.go b/loopd/view.go index c13c8ba..73da8ca 100644 --- a/loopd/view.go +++ b/loopd/view.go @@ -49,12 +49,27 @@ func viewOut(swapClient *loop.Client, chainParams *chaincfg.Params) error { } for _, s := range swaps { + scriptVersion := loop.GetHtlcScriptVersion( + s.Contract.ProtocolVersion, + ) + + var outputType swap.HtlcOutputType + switch scriptVersion { + case swap.HtlcV1: + outputType = swap.HtlcNP2WSH + + case swap.HtlcV2: + outputType = swap.HtlcP2WSH + + case swap.HtlcV3: + outputType = swap.HtlcP2TR + } htlc, err := swap.NewHtlc( loop.GetHtlcScriptVersion(s.Contract.ProtocolVersion), s.Contract.CltvExpiry, s.Contract.SenderKey, s.Contract.ReceiverKey, - s.Hash, swap.HtlcP2WSH, chainParams, + s.Hash, outputType, chainParams, ) if err != nil { return err @@ -106,7 +121,7 @@ func viewIn(swapClient *loop.Client, chainParams *chaincfg.Params) error { s.Contract.CltvExpiry, s.Contract.SenderKey, s.Contract.ReceiverKey, - s.Hash, swap.HtlcNP2WSH, chainParams, + s.Hash, swap.HtlcP2WSH, chainParams, ) if err != nil { return err From 88956455b4843f3af7c88a947293a06f496abecf Mon Sep 17 00:00:00 2001 From: Andras Banki-Horvath Date: Fri, 4 Nov 2022 16:06:22 +0100 Subject: [PATCH 03/14] multi: completely remove support for NP2WSH htlcs This commit removes all code related to NP2WSH htlcs. These were historically used when segwit adoption was very sporadic and are not used anywhere anymore. Some historical swaps stored in the DB may be listed with incorrect htlc adresses from here on. --- client.go | 12 - client_test.go | 3 - cmd/loop/loopin.go | 4 - cmd/loop/main.go | 4 - interface.go | 8 - liquidity/liquidity.go | 3 +- loopd/swapclient_server.go | 63 ++- loopd/view.go | 3 - loopin.go | 25 -- loopin_test.go | 26 +- looprpc/client.pb.go | 756 +++++++++++++++++------------------- looprpc/client.proto | 15 +- looprpc/client.swagger.json | 12 +- swap.go | 12 - swap/htlc.go | 228 +---------- 15 files changed, 398 insertions(+), 776 deletions(-) diff --git a/client.go b/client.go index 5e739c0..4581f0f 100644 --- a/client.go +++ b/client.go @@ -267,16 +267,6 @@ func (s *Client) FetchSwaps() ([]*SwapInfo, error) { swapInfo.HtlcAddressP2TR = htlcP2TR.Address } else { - htlcNP2WSH, err := swap.NewHtlc( - swap.HtlcV1, swp.Contract.CltvExpiry, - swp.Contract.SenderKey, swp.Contract.ReceiverKey, - swp.Hash, swap.HtlcNP2WSH, - s.lndServices.ChainParams, - ) - if err != nil { - return nil, err - } - htlcP2WSH, err := swap.NewHtlc( swap.HtlcV2, swp.Contract.CltvExpiry, swp.Contract.SenderKey, swp.Contract.ReceiverKey, @@ -288,7 +278,6 @@ func (s *Client) FetchSwaps() ([]*SwapInfo, error) { } swapInfo.HtlcAddressP2WSH = htlcP2WSH.Address - swapInfo.HtlcAddressNP2WSH = htlcNP2WSH.Address } swaps = append(swaps, swapInfo) @@ -615,7 +604,6 @@ func (s *Client) LoopIn(globalCtx context.Context, } if loopdb.CurrentProtocolVersion() < loopdb.ProtocolVersionHtlcV3 { - swapInfo.HtlcAddressNP2WSH = swap.htlcNP2WSH.Address swapInfo.HtlcAddressP2WSH = swap.htlcP2WSH.Address } else { swapInfo.HtlcAddressP2TR = swap.htlcP2TR.Address diff --git a/client_test.go b/client_test.go index 46b5a28..7c8f88b 100644 --- a/client_test.go +++ b/client_test.go @@ -370,9 +370,6 @@ func testLoopOutSuccess(ctx *testContext, amt btcutil.Amount, hash lntypes.Hash, var preImageIndex int switch scriptVersion { - case swap.HtlcV1: - preImageIndex = 1 - case swap.HtlcV2: preImageIndex = 0 diff --git a/cmd/loop/loopin.go b/cmd/loop/loopin.go index add0cba..4c7d92e 100644 --- a/cmd/loop/loopin.go +++ b/cmd/loop/loopin.go @@ -208,10 +208,6 @@ func loopIn(ctx *cli.Context) error { if resp.HtlcAddressP2Tr != "" { fmt.Printf("HTLC address (P2TR): %v\n", resp.HtlcAddressP2Tr) } else { - if external { - fmt.Printf("HTLC address (NP2WSH): %v\n", - resp.HtlcAddressNp2Wsh) - } fmt.Printf("HTLC address (P2WSH): %v\n", resp.HtlcAddressP2Wsh) } diff --git a/cmd/loop/main.go b/cmd/loop/main.go index bca93d7..3fa2b30 100644 --- a/cmd/loop/main.go +++ b/cmd/loop/main.go @@ -350,10 +350,6 @@ func logSwap(swap *looprpc.SwapStatus) { fmt.Printf(" P2WSH: %v", swap.HtlcAddressP2Wsh) } - if swap.HtlcAddressNp2Wsh != "" { - fmt.Printf(" NP2WSH: %v", swap.HtlcAddressNp2Wsh) - } - if swap.HtlcAddressP2Tr != "" { fmt.Printf(" P2TR: %v", swap.HtlcAddressP2Tr) } diff --git a/interface.go b/interface.go index 72b3e0e..4b19329 100644 --- a/interface.go +++ b/interface.go @@ -294,10 +294,6 @@ type LoopInSwapInfo struct { // nolint // where the loop-in funds may be paid. HtlcAddressP2WSH btcutil.Address - // HtlcAddressNP2WSH contains the nested segwit swap htlc address, - // where the loop-in funds may be paid. - HtlcAddressNP2WSH btcutil.Address - // HtlcAddresP2TR contains the v3 (pay to taproot) htlc address. HtlcAddressP2TR btcutil.Address @@ -350,10 +346,6 @@ type SwapInfo struct { // swap htlc. This is used for both loop-in and loop-out. HtlcAddressP2WSH btcutil.Address - // HtlcAddressNP2WSH stores the address of the NP2WSH (nested segwit) - // swap htlc. This is only used for external loop-in. - HtlcAddressNP2WSH btcutil.Address - // HtlcAddressP2TR stores the address of the P2TR (taproot) swap htlc. // This is used for both internal and external loop-in and loop out. HtlcAddressP2TR btcutil.Address diff --git a/liquidity/liquidity.go b/liquidity/liquidity.go index 360e35c..a706358 100644 --- a/liquidity/liquidity.go +++ b/liquidity/liquidity.go @@ -406,8 +406,7 @@ func (m *Manager) autoloop(ctx context.Context) error { } log.Infof("loop in automatically dispatched: hash: %v, "+ - "address: np2wsh(%v), p2wsh(%v), p2tr(%v)", - loopIn.SwapHash, loopIn.HtlcAddressNP2WSH, + "address: p2wsh(%v), p2tr(%v)", loopIn.SwapHash, loopIn.HtlcAddressP2WSH, loopIn.HtlcAddressP2TR) } diff --git a/loopd/swapclient_server.go b/loopd/swapclient_server.go index 2b7386e..2d11cfa 100644 --- a/loopd/swapclient_server.go +++ b/loopd/swapclient_server.go @@ -230,10 +230,9 @@ func (s *swapClientServer) marshallSwap(loopSwap *loop.SwapInfo) ( var swapType clientrpc.SwapType var ( - htlcAddress string - htlcAddressP2TR string - htlcAddressP2WSH string - htlcAddressNP2WSH string + htlcAddress string + htlcAddressP2TR string + htlcAddressP2WSH string ) var outGoingChanSet []uint64 var lastHop []byte @@ -248,14 +247,7 @@ func (s *swapClientServer) marshallSwap(loopSwap *loop.SwapInfo) ( } else { htlcAddressP2WSH = loopSwap.HtlcAddressP2WSH.EncodeAddress() - - if loopSwap.ExternalHtlc { - htlcAddressNP2WSH = - loopSwap.HtlcAddressNP2WSH.EncodeAddress() - htlcAddress = htlcAddressNP2WSH - } else { - htlcAddress = htlcAddressP2WSH - } + htlcAddress = htlcAddressP2WSH } if loopSwap.LastHop != nil { @@ -279,24 +271,23 @@ func (s *swapClientServer) marshallSwap(loopSwap *loop.SwapInfo) ( } return &clientrpc.SwapStatus{ - Amt: int64(loopSwap.AmountRequested), - Id: loopSwap.SwapHash.String(), - IdBytes: loopSwap.SwapHash[:], - State: state, - FailureReason: failureReason, - InitiationTime: loopSwap.InitiationTime.UnixNano(), - LastUpdateTime: loopSwap.LastUpdate.UnixNano(), - HtlcAddress: htlcAddress, - HtlcAddressP2Tr: htlcAddressP2TR, - HtlcAddressP2Wsh: htlcAddressP2WSH, - HtlcAddressNp2Wsh: htlcAddressNP2WSH, - Type: swapType, - CostServer: int64(loopSwap.Cost.Server), - CostOnchain: int64(loopSwap.Cost.Onchain), - CostOffchain: int64(loopSwap.Cost.Offchain), - Label: loopSwap.Label, - LastHop: lastHop, - OutgoingChanSet: outGoingChanSet, + Amt: int64(loopSwap.AmountRequested), + Id: loopSwap.SwapHash.String(), + IdBytes: loopSwap.SwapHash[:], + State: state, + FailureReason: failureReason, + InitiationTime: loopSwap.InitiationTime.UnixNano(), + LastUpdateTime: loopSwap.LastUpdate.UnixNano(), + HtlcAddress: htlcAddress, + HtlcAddressP2Tr: htlcAddressP2TR, + HtlcAddressP2Wsh: htlcAddressP2WSH, + Type: swapType, + CostServer: int64(loopSwap.Cost.Server), + CostOnchain: int64(loopSwap.Cost.Onchain), + CostOffchain: int64(loopSwap.Cost.Offchain), + Label: loopSwap.Label, + LastHop: lastHop, + OutgoingChanSet: outGoingChanSet, }, nil } @@ -701,15 +692,9 @@ func (s *swapClientServer) LoopIn(ctx context.Context, } if loopdb.CurrentProtocolVersion() < loopdb.ProtocolVersionHtlcV3 { - if req.ExternalHtlc { - np2wshAddr := swapInfo.HtlcAddressNP2WSH.String() - response.HtlcAddress = np2wshAddr - response.HtlcAddressNp2Wsh = np2wshAddr - } else { - p2wshAddr := swapInfo.HtlcAddressP2WSH.String() - response.HtlcAddress = p2wshAddr - response.HtlcAddressP2Wsh = p2wshAddr - } + p2wshAddr := swapInfo.HtlcAddressP2WSH.String() + response.HtlcAddress = p2wshAddr + response.HtlcAddressP2Wsh = p2wshAddr } else { p2trAddr := swapInfo.HtlcAddressP2TR.String() response.HtlcAddress = p2trAddr diff --git a/loopd/view.go b/loopd/view.go index 73da8ca..f99fdef 100644 --- a/loopd/view.go +++ b/loopd/view.go @@ -55,9 +55,6 @@ func viewOut(swapClient *loop.Client, chainParams *chaincfg.Params) error { var outputType swap.HtlcOutputType switch scriptVersion { - case swap.HtlcV1: - outputType = swap.HtlcNP2WSH - case swap.HtlcV2: outputType = swap.HtlcP2WSH diff --git a/loopin.go b/loopin.go index f5a65e0..8b3e49b 100644 --- a/loopin.go +++ b/loopin.go @@ -61,8 +61,6 @@ type loopInSwap struct { htlcP2WSH *swap.Htlc - htlcNP2WSH *swap.Htlc - htlcP2TR *swap.Htlc // htlcTxHash is the confirmed htlc tx id. @@ -423,17 +421,9 @@ func (s *loopInSwap) initHtlcs() error { return err } - htlcNP2WSH, err := s.swapKit.getHtlc(swap.HtlcNP2WSH) - if err != nil { - return err - } - // Log htlc addresses for debugging. s.swapKit.log.Infof("Htlc address (P2WSH): %v", htlcP2WSH.Address) - s.swapKit.log.Infof("Htlc address (NP2WSH): %v", htlcNP2WSH.Address) - s.htlcP2WSH = htlcP2WSH - s.htlcNP2WSH = htlcNP2WSH return nil } @@ -447,7 +437,6 @@ func (s *loopInSwap) sendUpdate(ctx context.Context) error { info.HtlcAddressP2TR = s.htlcP2TR.Address } else { info.HtlcAddressP2WSH = s.htlcP2WSH.Address - info.HtlcAddressNP2WSH = s.htlcNP2WSH.Address } info.ExternalHtlc = s.ExternalHtlc @@ -643,11 +632,6 @@ func (s *loopInSwap) waitForHtlcConf(globalCtx context.Context) ( return nil, err } - confChanNP2WSH, confErrNP2WSH, err := notifyConfirmation(s.htlcNP2WSH) - if err != nil { - return nil, err - } - confChanP2TR, confErrP2TR, err := notifyConfirmation(s.htlcP2TR) if err != nil { return nil, err @@ -662,11 +646,6 @@ func (s *loopInSwap) waitForHtlcConf(globalCtx context.Context) ( s.htlc = s.htlcP2WSH s.log.Infof("P2WSH htlc confirmed") - // NP2WSH htlc confirmed. - case conf = <-confChanNP2WSH: - s.htlc = s.htlcNP2WSH - s.log.Infof("NP2WSH htlc confirmed") - // P2TR htlc confirmed. case conf = <-confChanP2TR: s.htlc = s.htlcP2TR @@ -676,10 +655,6 @@ func (s *loopInSwap) waitForHtlcConf(globalCtx context.Context) ( case err := <-confErrP2WSH: return nil, err - // Conf ntfn error. - case err := <-confErrNP2WSH: - return nil, err - // Conf ntfn error. case err := <-confErrP2TR: return nil, err diff --git a/loopin_test.go b/loopin_test.go index 79200f0..e4a317b 100644 --- a/loopin_test.go +++ b/loopin_test.go @@ -104,12 +104,6 @@ func testLoopInSuccess(t *testing.T) { // Expect register for htlc conf (only one, since the htlc is p2tr). <-ctx.lnd.RegisterConfChannel - // If the swap is legacy, then we'll register two confirmation - // notifications. - if !IsTaprootSwap(&inSwap.SwapContract) { - <-ctx.lnd.RegisterConfChannel - } - // Confirm htlc. ctx.lnd.ConfChannel <- &chainntnfs.TxConfirmation{ Tx: &htlcTx, @@ -266,11 +260,7 @@ func testLoopInTimeout(t *testing.T, externalValue int64) { // Create an external htlc publish tx. var pkScript []byte if !IsTaprootSwap(&inSwap.SwapContract) { - if req.ExternalHtlc { - pkScript = inSwap.htlcNP2WSH.PkScript - } else { - pkScript = inSwap.htlcP2WSH.PkScript - } + pkScript = inSwap.htlcP2WSH.PkScript } else { pkScript = inSwap.htlcP2TR.PkScript } @@ -288,12 +278,6 @@ func testLoopInTimeout(t *testing.T, externalValue int64) { // Expect register for htlc conf. <-ctx.lnd.RegisterConfChannel - // If the swap is legacy, then we'll register two confirmation - // notifications. - if !IsTaprootSwap(&inSwap.SwapContract) { - <-ctx.lnd.RegisterConfChannel - } - // Confirm htlc. ctx.lnd.ConfChannel <- &chainntnfs.TxConfirmation{ Tx: &htlcTx, @@ -473,7 +457,7 @@ func testLoopInResume(t *testing.T, state loopdb.SwapState, expired bool, scriptVersion := GetHtlcScriptVersion(storedVersion) - outputType := swap.HtlcNP2WSH + outputType := swap.HtlcP2WSH if scriptVersion == swap.HtlcV3 { outputType = swap.HtlcP2TR } @@ -571,12 +555,6 @@ func testLoopInResume(t *testing.T, state loopdb.SwapState, expired bool, // Expect register for htlc conf. <-ctx.lnd.RegisterConfChannel - // If the swap is legacy, then we'll register two confirmation - // notifications. - if !IsTaprootSwap(&inSwap.SwapContract) { - <-ctx.lnd.RegisterConfChannel - } - // Confirm htlc. ctx.lnd.ConfChannel <- &chainntnfs.TxConfirmation{ Tx: &htlcTx, diff --git a/looprpc/client.pb.go b/looprpc/client.pb.go index 5ab4186..7ebd102 100644 --- a/looprpc/client.pb.go +++ b/looprpc/client.pb.go @@ -796,18 +796,12 @@ type SwapResponse struct { //depending on the request, the semantics are different. //- For internal loop-in htlc_address contains the address of the //native segwit (P2WSH) htlc. - //- For external loop-in htlc_address contains the address of the - //nested segwit (NP2WSH) htlc. - //- For loop-out htlc_address always contains the native segwit (P2WSH) + /// - For loop-out htlc_address always contains the native segwit (P2WSH) //htlc address. // // Deprecated: Do not use. HtlcAddress string `protobuf:"bytes,2,opt,name=htlc_address,json=htlcAddress,proto3" json:"htlc_address,omitempty"` // - //The nested segwit address of the on-chain htlc. - //This field remains empty for loop-out. - HtlcAddressNp2Wsh string `protobuf:"bytes,4,opt,name=htlc_address_np2wsh,json=htlcAddressNp2wsh,proto3" json:"htlc_address_np2wsh,omitempty"` - // //The native segwit address of the on-chain htlc. //Used for both loop-in and loop-out. HtlcAddressP2Wsh string `protobuf:"bytes,5,opt,name=htlc_address_p2wsh,json=htlcAddressP2wsh,proto3" json:"htlc_address_p2wsh,omitempty"` @@ -872,13 +866,6 @@ func (x *SwapResponse) GetHtlcAddress() string { return "" } -func (x *SwapResponse) GetHtlcAddressNp2Wsh() string { - if x != nil { - return x.HtlcAddressNp2Wsh - } - return "" -} - func (x *SwapResponse) GetHtlcAddressP2Wsh() string { if x != nil { return x.HtlcAddressP2Wsh @@ -978,8 +965,6 @@ type SwapStatus struct { //DEPRECATED: This field stores the address of the onchain htlc. //- For internal loop-in htlc_address contains the address of the //native segwit (P2WSH) htlc. - //- For external loop-in htlc_address contains the nested segwit (NP2WSH) - //address. //- For loop-out htlc_address always contains the native segwit (P2WSH) //htlc address. // @@ -987,8 +972,6 @@ type SwapStatus struct { HtlcAddress string `protobuf:"bytes,7,opt,name=htlc_address,json=htlcAddress,proto3" json:"htlc_address,omitempty"` // HTLC address (native segwit), used in loop-in and loop-out swaps. HtlcAddressP2Wsh string `protobuf:"bytes,12,opt,name=htlc_address_p2wsh,json=htlcAddressP2wsh,proto3" json:"htlc_address_p2wsh,omitempty"` - // HTLC address (nested segwit), used in loop-in swaps only. - HtlcAddressNp2Wsh string `protobuf:"bytes,13,opt,name=htlc_address_np2wsh,json=htlcAddressNp2wsh,proto3" json:"htlc_address_np2wsh,omitempty"` // The address of the v3 (taproot) htlc. Used for both loop-in and loop-out. HtlcAddressP2Tr string `protobuf:"bytes,18,opt,name=htlc_address_p2tr,json=htlcAddressP2tr,proto3" json:"htlc_address_p2tr,omitempty"` // Swap server cost @@ -1109,13 +1092,6 @@ func (x *SwapStatus) GetHtlcAddressP2Wsh() string { return "" } -func (x *SwapStatus) GetHtlcAddressNp2Wsh() string { - if x != nil { - return x.HtlcAddressNp2Wsh - } - return "" -} - func (x *SwapStatus) GetHtlcAddressP2Tr() string { if x != nil { return x.HtlcAddressP2Tr @@ -2805,17 +2781,14 @@ var file_client_proto_rawDesc = []byte{ 0x32, 0x12, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x69, 0x6e, 0x74, 0x52, 0x0a, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x0a, 0x20, 0x01, 0x28, - 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0x95, 0x02, 0x0a, 0x0c, 0x53, + 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0xeb, 0x01, 0x0a, 0x0c, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x12, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x69, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x0c, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x68, 0x74, 0x6c, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x12, 0x2e, 0x0a, 0x13, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, - 0x73, 0x5f, 0x6e, 0x70, 0x32, 0x77, 0x73, 0x68, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, - 0x68, 0x74, 0x6c, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4e, 0x70, 0x32, 0x77, 0x73, - 0x68, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, + 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x32, 0x77, 0x73, 0x68, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x68, 0x74, 0x6c, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x50, 0x32, 0x77, 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, @@ -2823,371 +2796,368 @@ var file_client_proto_rawDesc = []byte{ 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x50, 0x32, 0x74, 0x72, 0x12, 0x25, 0x0a, 0x0e, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x5f, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x4d, 0x65, 0x73, 0x73, 0x61, - 0x67, 0x65, 0x22, 0x10, 0x0a, 0x0e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x22, 0xa7, 0x05, 0x0a, 0x0a, 0x53, 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, - 0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6d, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, - 0x52, 0x03, 0x61, 0x6d, 0x74, 0x12, 0x12, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x69, 0x64, 0x5f, - 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x69, 0x64, 0x42, - 0x79, 0x74, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, - 0x70, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x28, 0x0a, 0x05, 0x73, - 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x12, 0x2e, 0x6c, 0x6f, 0x6f, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, - 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0e, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, - 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, - 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0d, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, - 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x69, - 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x28, 0x0a, - 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, 0x0c, 0x68, 0x74, 0x6c, 0x63, 0x5f, - 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, - 0x01, 0x52, 0x0b, 0x68, 0x74, 0x6c, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x12, 0x2c, - 0x0a, 0x12, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, - 0x32, 0x77, 0x73, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x68, 0x74, 0x6c, 0x63, - 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x50, 0x32, 0x77, 0x73, 0x68, 0x12, 0x2e, 0x0a, 0x13, - 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x6e, 0x70, 0x32, - 0x77, 0x73, 0x68, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x09, 0x52, 0x11, 0x68, 0x74, 0x6c, 0x63, 0x41, - 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x4e, 0x70, 0x32, 0x77, 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x11, - 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x32, 0x74, - 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x68, 0x74, 0x6c, 0x63, 0x41, 0x64, 0x64, - 0x72, 0x65, 0x73, 0x73, 0x50, 0x32, 0x74, 0x72, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x74, - 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x08, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, - 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x73, - 0x74, 0x5f, 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x4f, 0x6e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x23, 0x0a, 0x0d, - 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, 0x0a, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x73, 0x74, 0x4f, 0x66, 0x66, 0x63, 0x68, 0x61, 0x69, - 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x10, 0x20, - 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x2a, 0x0a, 0x11, - 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x5f, 0x73, 0x65, - 0x74, 0x18, 0x11, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0f, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, - 0x67, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, - 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x22, 0x12, - 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, 0x05, 0x73, 0x77, 0x61, 0x70, 0x73, - 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, - 0x2e, 0x53, 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x05, 0x73, 0x77, 0x61, - 0x70, 0x73, 0x22, 0x21, 0x0a, 0x0f, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, - 0x0c, 0x52, 0x02, 0x69, 0x64, 0x22, 0x0e, 0x0a, 0x0c, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7f, 0x0a, 0x0f, 0x49, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x73, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, - 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, - 0x03, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x53, 0x77, 0x61, 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, - 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x53, 0x77, - 0x61, 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, - 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, - 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0xcc, 0x01, 0x0a, 0x10, 0x4f, 0x75, 0x74, 0x54, 0x65, - 0x72, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6d, - 0x69, 0x6e, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x53, 0x77, 0x61, 0x70, 0x41, 0x6d, 0x6f, - 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x61, - 0x78, 0x53, 0x77, 0x61, 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6d, - 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x74, 0x76, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x08, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x43, 0x6c, 0x74, 0x76, 0x44, 0x65, 0x6c, 0x74, - 0x61, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x63, 0x6c, 0x74, 0x76, 0x5f, 0x64, 0x65, - 0x6c, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x43, 0x6c, - 0x74, 0x76, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, - 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, - 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0xa8, 0x02, 0x0a, 0x0c, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6d, 0x74, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x03, 0x52, 0x03, 0x61, 0x6d, 0x74, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, - 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, - 0x6f, 0x6e, 0x66, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x74, - 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x68, 0x74, 0x6c, 0x63, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, - 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x48, 0x74, 0x6c, 0x63, 0x12, 0x3a, - 0x0a, 0x19, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, - 0x04, 0x52, 0x17, 0x73, 0x77, 0x61, 0x70, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, - 0x6f, 0x6e, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, 0x12, 0x27, 0x0a, 0x10, 0x6c, 0x6f, - 0x6f, 0x70, 0x5f, 0x69, 0x6e, 0x5f, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6c, 0x6f, 0x6f, 0x70, 0x49, 0x6e, 0x4c, 0x61, 0x73, 0x74, - 0x48, 0x6f, 0x70, 0x12, 0x41, 0x0a, 0x13, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x69, 0x6e, 0x5f, 0x72, - 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, - 0x32, 0x12, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, - 0x48, 0x69, 0x6e, 0x74, 0x52, 0x10, 0x6c, 0x6f, 0x6f, 0x70, 0x49, 0x6e, 0x52, 0x6f, 0x75, 0x74, - 0x65, 0x48, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, - 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, - 0x22, 0xb0, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x66, 0x65, 0x65, - 0x5f, 0x73, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x77, 0x61, 0x70, - 0x46, 0x65, 0x65, 0x53, 0x61, 0x74, 0x12, 0x2f, 0x0a, 0x14, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x70, - 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x68, 0x74, 0x6c, 0x63, 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, - 0x68, 0x46, 0x65, 0x65, 0x53, 0x61, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x74, 0x76, 0x5f, - 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x6c, 0x74, - 0x76, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x74, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x6f, 0x6e, - 0x66, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, - 0x04, 0x10, 0x05, 0x22, 0xf3, 0x01, 0x0a, 0x10, 0x4f, 0x75, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x65, - 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x73, 0x77, 0x61, 0x70, - 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, - 0x73, 0x77, 0x61, 0x70, 0x46, 0x65, 0x65, 0x53, 0x61, 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, - 0x65, 0x70, 0x61, 0x79, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x70, 0x61, 0x79, 0x41, 0x6d, 0x74, 0x53, 0x61, 0x74, - 0x12, 0x2b, 0x0a, 0x12, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x73, 0x77, 0x65, 0x65, 0x70, 0x5f, 0x66, - 0x65, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0f, 0x68, 0x74, - 0x6c, 0x63, 0x53, 0x77, 0x65, 0x65, 0x70, 0x46, 0x65, 0x65, 0x53, 0x61, 0x74, 0x12, 0x2a, 0x0a, - 0x11, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, - 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x73, 0x77, 0x61, 0x70, 0x50, 0x61, - 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x74, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x74, - 0x76, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, - 0x6c, 0x74, 0x76, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, - 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, - 0x6f, 0x6e, 0x66, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x70, 0x0a, 0x0c, 0x50, 0x72, 0x6f, - 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6d, 0x74, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x61, 0x6d, 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6c, - 0x61, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6c, - 0x61, 0x73, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x33, 0x0a, 0x0b, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, - 0x68, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6c, 0x6f, - 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x69, 0x6e, 0x74, 0x52, - 0x0a, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x69, 0x6e, 0x74, 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x50, - 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x0f, 0x0a, 0x0d, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3c, 0x0a, - 0x0e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x2a, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, - 0x12, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x73, 0x61, 0x74, 0x54, 0x6f, - 0x6b, 0x65, 0x6e, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x22, 0xbb, 0x02, 0x0a, 0x09, - 0x4c, 0x73, 0x61, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x73, - 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, - 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x65, - 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, 0x70, 0x61, 0x79, - 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x12, 0x28, 0x0a, 0x10, - 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x6d, 0x73, 0x61, 0x74, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, - 0x69, 0x64, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x31, 0x0a, 0x15, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, - 0x67, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x61, 0x69, 0x64, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x65, - 0x65, 0x50, 0x61, 0x69, 0x64, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, - 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, - 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, - 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, - 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, - 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, - 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, - 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, - 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8a, 0x06, 0x0a, 0x13, 0x4c, 0x69, 0x71, 0x75, 0x69, - 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x2c, - 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, - 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, - 0x66, 0x65, 0x65, 0x5f, 0x70, 0x70, 0x6d, 0x18, 0x10, 0x20, 0x01, 0x28, 0x04, 0x52, 0x06, 0x66, - 0x65, 0x65, 0x50, 0x70, 0x6d, 0x12, 0x3d, 0x0a, 0x1c, 0x73, 0x77, 0x65, 0x65, 0x70, 0x5f, 0x66, - 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, - 0x76, 0x62, 0x79, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x73, 0x77, 0x65, - 0x65, 0x70, 0x46, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x53, 0x61, 0x74, 0x50, 0x65, 0x72, 0x56, - 0x62, 0x79, 0x74, 0x65, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x77, 0x61, 0x70, - 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x70, 0x6d, 0x18, 0x03, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, - 0x6d, 0x61, 0x78, 0x53, 0x77, 0x61, 0x70, 0x46, 0x65, 0x65, 0x50, 0x70, 0x6d, 0x12, 0x2d, 0x0a, - 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x65, 0x65, - 0x5f, 0x70, 0x70, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x10, 0x6d, 0x61, 0x78, 0x52, - 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x65, 0x65, 0x50, 0x70, 0x6d, 0x12, 0x3a, 0x0a, 0x1a, - 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x65, 0x70, 0x61, 0x79, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x70, 0x6d, 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x16, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x65, 0x70, 0x61, 0x79, 0x52, 0x6f, 0x75, 0x74, 0x69, - 0x6e, 0x67, 0x46, 0x65, 0x65, 0x50, 0x70, 0x6d, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, - 0x70, 0x72, 0x65, 0x70, 0x61, 0x79, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, - 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x65, 0x70, 0x61, 0x79, 0x53, 0x61, 0x74, 0x12, 0x29, - 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x69, 0x6e, 0x65, 0x72, 0x5f, 0x66, 0x65, 0x65, 0x5f, - 0x73, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0e, 0x6d, 0x61, 0x78, 0x4d, 0x69, - 0x6e, 0x65, 0x72, 0x46, 0x65, 0x65, 0x53, 0x61, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x77, 0x65, - 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x08, - 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x73, 0x77, 0x65, 0x65, 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x54, - 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, - 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x09, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x11, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x42, 0x61, 0x63, 0x6b, 0x6f, - 0x66, 0x66, 0x53, 0x65, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x6f, - 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x6f, - 0x70, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x62, 0x75, - 0x64, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x0b, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, - 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x6f, 0x70, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x53, 0x61, - 0x74, 0x12, 0x39, 0x0a, 0x19, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x62, 0x75, - 0x64, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x73, 0x65, 0x63, 0x18, 0x0c, - 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x6f, 0x70, 0x42, 0x75, - 0x64, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, 0x65, 0x63, 0x12, 0x2b, 0x0a, 0x12, - 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x69, 0x6e, 0x5f, 0x66, 0x6c, 0x69, 0x67, - 0x68, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x4d, 0x61, - 0x78, 0x49, 0x6e, 0x46, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, - 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, - 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x53, 0x77, 0x61, 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, - 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x6d, - 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x53, - 0x77, 0x61, 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x68, 0x74, 0x6c, - 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x11, 0x20, - 0x01, 0x28, 0x05, 0x52, 0x0e, 0x68, 0x74, 0x6c, 0x63, 0x43, 0x6f, 0x6e, 0x66, 0x54, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x22, 0x84, 0x02, 0x0a, 0x0d, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, - 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, - 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, - 0x65, 0x6c, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x09, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x74, 0x79, 0x70, - 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x52, 0x08, 0x73, 0x77, 0x61, 0x70, - 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x04, - 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x1a, 0x2e, 0x6c, 0x6f, 0x6f, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, - 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x12, - 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, - 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, - 0x6e, 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x6f, - 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, - 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, - 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x22, 0x59, 0x0a, 0x19, 0x53, 0x65, - 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x6f, - 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, - 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, - 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, - 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x53, 0x77, - 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x72, 0x0a, 0x0c, 0x44, 0x69, - 0x73, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, - 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, - 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, - 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, - 0x79, 0x12, 0x2b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x0e, 0x32, 0x13, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x41, 0x75, 0x74, 0x6f, - 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xb6, - 0x01, 0x0a, 0x14, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, 0x08, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, - 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x17, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x6f, 0x70, 0x4f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x52, 0x07, 0x6c, 0x6f, 0x6f, 0x70, 0x4f, 0x75, 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x6c, - 0x6f, 0x6f, 0x70, 0x5f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, - 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x6f, 0x70, 0x49, 0x6e, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x52, 0x06, 0x6c, 0x6f, 0x6f, 0x70, 0x49, 0x6e, 0x12, 0x39, 0x0a, 0x0c, - 0x64, 0x69, 0x73, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, - 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, - 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x52, 0x0c, 0x64, 0x69, 0x73, 0x71, 0x75, - 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2a, 0x25, 0x0a, 0x08, 0x53, 0x77, 0x61, 0x70, 0x54, - 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x4c, 0x4f, 0x4f, 0x50, 0x5f, 0x4f, 0x55, 0x54, 0x10, - 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x4f, 0x4f, 0x50, 0x5f, 0x49, 0x4e, 0x10, 0x01, 0x2a, 0x73, - 0x0a, 0x09, 0x53, 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x49, - 0x4e, 0x49, 0x54, 0x49, 0x41, 0x54, 0x45, 0x44, 0x10, 0x00, 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, - 0x45, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x52, 0x45, 0x56, 0x45, 0x41, 0x4c, 0x45, 0x44, 0x10, - 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x48, 0x54, 0x4c, 0x43, 0x5f, 0x50, 0x55, 0x42, 0x4c, 0x49, 0x53, - 0x48, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, - 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, 0x45, 0x44, 0x10, 0x04, 0x12, 0x13, - 0x0a, 0x0f, 0x49, 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x5f, 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, - 0x44, 0x10, 0x05, 0x2a, 0xed, 0x01, 0x0a, 0x0d, 0x46, 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, - 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, - 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1b, - 0x0a, 0x17, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, - 0x5f, 0x4f, 0x46, 0x46, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x46, - 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x49, - 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x02, 0x12, 0x20, 0x0a, 0x1c, 0x46, 0x41, 0x49, 0x4c, 0x55, - 0x52, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x57, 0x45, 0x45, 0x50, 0x5f, - 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x03, 0x12, 0x25, 0x0a, 0x21, 0x46, 0x41, 0x49, - 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x55, - 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x56, 0x41, 0x4c, 0x55, 0x45, 0x10, 0x04, - 0x12, 0x1c, 0x0a, 0x18, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, - 0x4f, 0x4e, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x4f, 0x52, 0x41, 0x52, 0x59, 0x10, 0x05, 0x12, 0x23, - 0x0a, 0x1f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, - 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, 0x5f, 0x41, 0x4d, 0x4f, 0x55, 0x4e, - 0x54, 0x10, 0x06, 0x2a, 0x2f, 0x0a, 0x11, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, - 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, - 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, - 0x4c, 0x44, 0x10, 0x01, 0x2a, 0xa6, 0x03, 0x0a, 0x0a, 0x41, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x61, - 0x73, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, - 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, - 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, - 0x45, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, - 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, - 0x53, 0x57, 0x45, 0x45, 0x50, 0x5f, 0x46, 0x45, 0x45, 0x53, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, + 0x67, 0x65, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0x10, 0x0a, 0x0e, 0x4d, 0x6f, 0x6e, 0x69, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0xf7, 0x04, 0x0a, 0x0a, 0x53, + 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x10, 0x0a, 0x03, 0x61, 0x6d, 0x74, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x61, 0x6d, 0x74, 0x12, 0x12, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x02, 0x69, 0x64, 0x12, + 0x19, 0x0a, 0x08, 0x69, 0x64, 0x5f, 0x62, 0x79, 0x74, 0x65, 0x73, 0x18, 0x0b, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x07, 0x69, 0x64, 0x42, 0x79, 0x74, 0x65, 0x73, 0x12, 0x25, 0x0a, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, 0x70, + 0x65, 0x12, 0x28, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x12, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x3d, 0x0a, 0x0e, 0x66, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x0e, 0x20, + 0x01, 0x28, 0x0e, 0x32, 0x16, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x46, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x0d, 0x66, 0x61, 0x69, + 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x27, 0x0a, 0x0f, 0x69, 0x6e, + 0x69, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0e, 0x69, 0x6e, 0x69, 0x74, 0x69, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x54, + 0x69, 0x6d, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x6c, + 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x25, 0x0a, + 0x0c, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x09, 0x42, 0x02, 0x18, 0x01, 0x52, 0x0b, 0x68, 0x74, 0x6c, 0x63, 0x41, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x12, 0x2c, 0x0a, 0x12, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x61, 0x64, 0x64, + 0x72, 0x65, 0x73, 0x73, 0x5f, 0x70, 0x32, 0x77, 0x73, 0x68, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x10, 0x68, 0x74, 0x6c, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x50, 0x32, 0x77, + 0x73, 0x68, 0x12, 0x2a, 0x0a, 0x11, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x61, 0x64, 0x64, 0x72, 0x65, + 0x73, 0x73, 0x5f, 0x70, 0x32, 0x74, 0x72, 0x18, 0x12, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0f, 0x68, + 0x74, 0x6c, 0x63, 0x41, 0x64, 0x64, 0x72, 0x65, 0x73, 0x73, 0x50, 0x32, 0x74, 0x72, 0x12, 0x1f, + 0x0a, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x73, 0x65, 0x72, 0x76, 0x65, 0x72, 0x18, 0x08, 0x20, + 0x01, 0x28, 0x03, 0x52, 0x0a, 0x63, 0x6f, 0x73, 0x74, 0x53, 0x65, 0x72, 0x76, 0x65, 0x72, 0x12, + 0x21, 0x0a, 0x0c, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6f, 0x6e, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x18, + 0x09, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x63, 0x6f, 0x73, 0x74, 0x4f, 0x6e, 0x63, 0x68, 0x61, + 0x69, 0x6e, 0x12, 0x23, 0x0a, 0x0d, 0x63, 0x6f, 0x73, 0x74, 0x5f, 0x6f, 0x66, 0x66, 0x63, 0x68, + 0x61, 0x69, 0x6e, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x63, 0x6f, 0x73, 0x74, 0x4f, + 0x66, 0x66, 0x63, 0x68, 0x61, 0x69, 0x6e, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x5f, + 0x68, 0x6f, 0x70, 0x18, 0x10, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x48, + 0x6f, 0x70, 0x12, 0x2a, 0x0a, 0x11, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x63, + 0x68, 0x61, 0x6e, 0x5f, 0x73, 0x65, 0x74, 0x18, 0x11, 0x20, 0x03, 0x28, 0x04, 0x52, 0x0f, 0x6f, + 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x43, 0x68, 0x61, 0x6e, 0x53, 0x65, 0x74, 0x12, 0x14, + 0x0a, 0x05, 0x6c, 0x61, 0x62, 0x65, 0x6c, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x6c, + 0x61, 0x62, 0x65, 0x6c, 0x22, 0x12, 0x0a, 0x10, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, + 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x3e, 0x0a, 0x11, 0x4c, 0x69, 0x73, 0x74, + 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x29, 0x0a, + 0x05, 0x73, 0x77, 0x61, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x13, 0x2e, 0x6c, + 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x52, 0x05, 0x73, 0x77, 0x61, 0x70, 0x73, 0x22, 0x21, 0x0a, 0x0f, 0x53, 0x77, 0x61, 0x70, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x0e, 0x0a, 0x02, 0x69, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x02, 0x69, 0x64, 0x22, 0x0e, 0x0a, 0x0c, 0x54, + 0x65, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x7f, 0x0a, 0x0f, 0x49, + 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x26, + 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x53, 0x77, 0x61, 0x70, + 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x73, 0x77, + 0x61, 0x70, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, + 0x0d, 0x6d, 0x61, 0x78, 0x53, 0x77, 0x61, 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x4a, 0x04, + 0x08, 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, + 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0xcc, 0x01, 0x0a, + 0x10, 0x4f, 0x75, 0x74, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x53, + 0x77, 0x61, 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, + 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x06, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x53, 0x77, 0x61, 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, + 0x74, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x69, 0x6e, 0x5f, 0x63, 0x6c, 0x74, 0x76, 0x5f, 0x64, 0x65, + 0x6c, 0x74, 0x61, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0c, 0x6d, 0x69, 0x6e, 0x43, 0x6c, + 0x74, 0x76, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x24, 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x63, + 0x6c, 0x74, 0x76, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x09, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x0c, 0x6d, 0x61, 0x78, 0x43, 0x6c, 0x74, 0x76, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x4a, 0x04, 0x08, + 0x01, 0x10, 0x02, 0x4a, 0x04, 0x08, 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x03, 0x10, 0x04, 0x4a, + 0x04, 0x08, 0x04, 0x10, 0x05, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x22, 0xa8, 0x02, 0x0a, 0x0c, + 0x51, 0x75, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x10, 0x0a, 0x03, + 0x61, 0x6d, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x61, 0x6d, 0x74, 0x12, 0x1f, + 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, + 0x23, 0x0a, 0x0d, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x5f, 0x68, 0x74, 0x6c, 0x63, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0c, 0x65, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, + 0x48, 0x74, 0x6c, 0x63, 0x12, 0x3a, 0x0a, 0x19, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x70, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x5f, 0x64, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, + 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, 0x52, 0x17, 0x73, 0x77, 0x61, 0x70, 0x50, 0x75, 0x62, + 0x6c, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x44, 0x65, 0x61, 0x64, 0x6c, 0x69, 0x6e, 0x65, + 0x12, 0x27, 0x0a, 0x10, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x69, 0x6e, 0x5f, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0d, 0x6c, 0x6f, 0x6f, 0x70, + 0x49, 0x6e, 0x4c, 0x61, 0x73, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x41, 0x0a, 0x13, 0x6c, 0x6f, 0x6f, + 0x70, 0x5f, 0x69, 0x6e, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x73, + 0x18, 0x06, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x69, 0x6e, 0x74, 0x52, 0x10, 0x6c, 0x6f, 0x6f, 0x70, + 0x49, 0x6e, 0x52, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x69, 0x6e, 0x74, 0x73, 0x12, 0x18, 0x0a, 0x07, + 0x70, 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x18, 0x07, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x70, + 0x72, 0x69, 0x76, 0x61, 0x74, 0x65, 0x22, 0xb0, 0x01, 0x0a, 0x0f, 0x49, 0x6e, 0x51, 0x75, 0x6f, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, 0x0a, 0x0c, 0x73, 0x77, + 0x61, 0x70, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, + 0x52, 0x0a, 0x73, 0x77, 0x61, 0x70, 0x46, 0x65, 0x65, 0x53, 0x61, 0x74, 0x12, 0x2f, 0x0a, 0x14, + 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x70, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x5f, 0x66, 0x65, 0x65, + 0x5f, 0x73, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, 0x28, 0x03, 0x52, 0x11, 0x68, 0x74, 0x6c, 0x63, + 0x50, 0x75, 0x62, 0x6c, 0x69, 0x73, 0x68, 0x46, 0x65, 0x65, 0x53, 0x61, 0x74, 0x12, 0x1d, 0x0a, + 0x0a, 0x63, 0x6c, 0x74, 0x76, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x05, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x09, 0x63, 0x6c, 0x74, 0x76, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x1f, 0x0a, 0x0b, + 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x06, 0x20, 0x01, 0x28, + 0x05, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x4a, 0x04, 0x08, + 0x02, 0x10, 0x03, 0x4a, 0x04, 0x08, 0x04, 0x10, 0x05, 0x22, 0xf3, 0x01, 0x0a, 0x10, 0x4f, 0x75, + 0x74, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x20, + 0x0a, 0x0c, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x0a, 0x73, 0x77, 0x61, 0x70, 0x46, 0x65, 0x65, 0x53, 0x61, 0x74, + 0x12, 0x24, 0x0a, 0x0e, 0x70, 0x72, 0x65, 0x70, 0x61, 0x79, 0x5f, 0x61, 0x6d, 0x74, 0x5f, 0x73, + 0x61, 0x74, 0x18, 0x02, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0c, 0x70, 0x72, 0x65, 0x70, 0x61, 0x79, + 0x41, 0x6d, 0x74, 0x53, 0x61, 0x74, 0x12, 0x2b, 0x0a, 0x12, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x73, + 0x77, 0x65, 0x65, 0x70, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x03, 0x52, 0x0f, 0x68, 0x74, 0x6c, 0x63, 0x53, 0x77, 0x65, 0x65, 0x70, 0x46, 0x65, 0x65, + 0x53, 0x61, 0x74, 0x12, 0x2a, 0x0a, 0x11, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x70, 0x61, 0x79, 0x6d, + 0x65, 0x6e, 0x74, 0x5f, 0x64, 0x65, 0x73, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0f, + 0x73, 0x77, 0x61, 0x70, 0x50, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x44, 0x65, 0x73, 0x74, 0x12, + 0x1d, 0x0a, 0x0a, 0x63, 0x6c, 0x74, 0x76, 0x5f, 0x64, 0x65, 0x6c, 0x74, 0x61, 0x18, 0x05, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x09, 0x63, 0x6c, 0x74, 0x76, 0x44, 0x65, 0x6c, 0x74, 0x61, 0x12, 0x1f, + 0x0a, 0x0b, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x05, 0x52, 0x0a, 0x63, 0x6f, 0x6e, 0x66, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, + 0x70, 0x0a, 0x0c, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, + 0x10, 0x0a, 0x03, 0x61, 0x6d, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x03, 0x52, 0x03, 0x61, 0x6d, + 0x74, 0x12, 0x19, 0x0a, 0x08, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x68, 0x6f, 0x70, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0c, 0x52, 0x07, 0x6c, 0x61, 0x73, 0x74, 0x48, 0x6f, 0x70, 0x12, 0x33, 0x0a, 0x0b, + 0x72, 0x6f, 0x75, 0x74, 0x65, 0x5f, 0x68, 0x69, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x12, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x52, 0x6f, 0x75, 0x74, + 0x65, 0x48, 0x69, 0x6e, 0x74, 0x52, 0x0a, 0x72, 0x6f, 0x75, 0x74, 0x65, 0x48, 0x69, 0x6e, 0x74, + 0x73, 0x22, 0x0f, 0x0a, 0x0d, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x22, 0x0f, 0x0a, 0x0d, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x22, 0x3c, 0x0a, 0x0e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x2a, 0x0a, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x18, + 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x12, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, + 0x4c, 0x73, 0x61, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x52, 0x06, 0x74, 0x6f, 0x6b, 0x65, 0x6e, + 0x73, 0x22, 0xbb, 0x02, 0x0a, 0x09, 0x4c, 0x73, 0x61, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x12, + 0x23, 0x0a, 0x0d, 0x62, 0x61, 0x73, 0x65, 0x5f, 0x6d, 0x61, 0x63, 0x61, 0x72, 0x6f, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x0c, 0x62, 0x61, 0x73, 0x65, 0x4d, 0x61, 0x63, 0x61, + 0x72, 0x6f, 0x6f, 0x6e, 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, 0x29, 0x0a, 0x10, 0x70, 0x61, 0x79, 0x6d, 0x65, + 0x6e, 0x74, 0x5f, 0x70, 0x72, 0x65, 0x69, 0x6d, 0x61, 0x67, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0c, 0x52, 0x0f, 0x70, 0x61, 0x79, 0x6d, 0x65, 0x6e, 0x74, 0x50, 0x72, 0x65, 0x69, 0x6d, 0x61, + 0x67, 0x65, 0x12, 0x28, 0x0a, 0x10, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x5f, 0x70, 0x61, 0x69, + 0x64, 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0e, 0x61, 0x6d, + 0x6f, 0x75, 0x6e, 0x74, 0x50, 0x61, 0x69, 0x64, 0x4d, 0x73, 0x61, 0x74, 0x12, 0x31, 0x0a, 0x15, + 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x61, 0x69, 0x64, + 0x5f, 0x6d, 0x73, 0x61, 0x74, 0x18, 0x05, 0x20, 0x01, 0x28, 0x03, 0x52, 0x12, 0x72, 0x6f, 0x75, + 0x74, 0x69, 0x6e, 0x67, 0x46, 0x65, 0x65, 0x50, 0x61, 0x69, 0x64, 0x4d, 0x73, 0x61, 0x74, 0x12, + 0x21, 0x0a, 0x0c, 0x74, 0x69, 0x6d, 0x65, 0x5f, 0x63, 0x72, 0x65, 0x61, 0x74, 0x65, 0x64, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x03, 0x52, 0x0b, 0x74, 0x69, 0x6d, 0x65, 0x43, 0x72, 0x65, 0x61, 0x74, + 0x65, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x18, 0x07, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x78, 0x70, 0x69, 0x72, 0x65, 0x64, 0x12, 0x21, 0x0a, 0x0c, + 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x5f, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x08, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x0b, 0x73, 0x74, 0x6f, 0x72, 0x61, 0x67, 0x65, 0x4e, 0x61, 0x6d, 0x65, 0x22, + 0x1b, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, + 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8a, 0x06, 0x0a, + 0x13, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, + 0x74, 0x65, 0x72, 0x73, 0x12, 0x2c, 0x0a, 0x05, 0x72, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x01, 0x20, + 0x03, 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x52, 0x05, 0x72, 0x75, 0x6c, + 0x65, 0x73, 0x12, 0x17, 0x0a, 0x07, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x70, 0x6d, 0x18, 0x10, 0x20, + 0x01, 0x28, 0x04, 0x52, 0x06, 0x66, 0x65, 0x65, 0x50, 0x70, 0x6d, 0x12, 0x3d, 0x0a, 0x1c, 0x73, + 0x77, 0x65, 0x65, 0x70, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x72, 0x61, 0x74, 0x65, 0x5f, 0x73, 0x61, + 0x74, 0x5f, 0x70, 0x65, 0x72, 0x5f, 0x76, 0x62, 0x79, 0x74, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x04, 0x52, 0x17, 0x73, 0x77, 0x65, 0x65, 0x70, 0x46, 0x65, 0x65, 0x52, 0x61, 0x74, 0x65, 0x53, + 0x61, 0x74, 0x50, 0x65, 0x72, 0x56, 0x62, 0x79, 0x74, 0x65, 0x12, 0x27, 0x0a, 0x10, 0x6d, 0x61, + 0x78, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x70, 0x6d, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x53, 0x77, 0x61, 0x70, 0x46, 0x65, 0x65, + 0x50, 0x70, 0x6d, 0x12, 0x2d, 0x0a, 0x13, 0x6d, 0x61, 0x78, 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, + 0x6e, 0x67, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x70, 0x6d, 0x18, 0x04, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x10, 0x6d, 0x61, 0x78, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x65, 0x65, 0x50, + 0x70, 0x6d, 0x12, 0x3a, 0x0a, 0x1a, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x65, 0x70, 0x61, 0x79, + 0x5f, 0x72, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x70, 0x70, 0x6d, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x65, 0x70, 0x61, + 0x79, 0x52, 0x6f, 0x75, 0x74, 0x69, 0x6e, 0x67, 0x46, 0x65, 0x65, 0x50, 0x70, 0x6d, 0x12, 0x24, + 0x0a, 0x0e, 0x6d, 0x61, 0x78, 0x5f, 0x70, 0x72, 0x65, 0x70, 0x61, 0x79, 0x5f, 0x73, 0x61, 0x74, + 0x18, 0x06, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0c, 0x6d, 0x61, 0x78, 0x50, 0x72, 0x65, 0x70, 0x61, + 0x79, 0x53, 0x61, 0x74, 0x12, 0x29, 0x0a, 0x11, 0x6d, 0x61, 0x78, 0x5f, 0x6d, 0x69, 0x6e, 0x65, + 0x72, 0x5f, 0x66, 0x65, 0x65, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x07, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x0e, 0x6d, 0x61, 0x78, 0x4d, 0x69, 0x6e, 0x65, 0x72, 0x46, 0x65, 0x65, 0x53, 0x61, 0x74, 0x12, + 0x2a, 0x0a, 0x11, 0x73, 0x77, 0x65, 0x65, 0x70, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x18, 0x08, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0f, 0x73, 0x77, 0x65, 0x65, + 0x70, 0x43, 0x6f, 0x6e, 0x66, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x12, 0x2e, 0x0a, 0x13, 0x66, + 0x61, 0x69, 0x6c, 0x75, 0x72, 0x65, 0x5f, 0x62, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x5f, 0x73, + 0x65, 0x63, 0x18, 0x09, 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x66, 0x61, 0x69, 0x6c, 0x75, 0x72, + 0x65, 0x42, 0x61, 0x63, 0x6b, 0x6f, 0x66, 0x66, 0x53, 0x65, 0x63, 0x12, 0x1a, 0x0a, 0x08, 0x61, + 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x6f, 0x70, 0x18, 0x0a, 0x20, 0x01, 0x28, 0x08, 0x52, 0x08, 0x61, + 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x6f, 0x70, 0x12, 0x2e, 0x0a, 0x13, 0x61, 0x75, 0x74, 0x6f, 0x6c, + 0x6f, 0x6f, 0x70, 0x5f, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x61, 0x74, 0x18, 0x0b, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x11, 0x61, 0x75, 0x74, 0x6f, 0x6c, 0x6f, 0x6f, 0x70, 0x42, 0x75, + 0x64, 0x67, 0x65, 0x74, 0x53, 0x61, 0x74, 0x12, 0x39, 0x0a, 0x19, 0x61, 0x75, 0x74, 0x6f, 0x6c, + 0x6f, 0x6f, 0x70, 0x5f, 0x62, 0x75, 0x64, 0x67, 0x65, 0x74, 0x5f, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x73, 0x65, 0x63, 0x18, 0x0c, 0x20, 0x01, 0x28, 0x04, 0x52, 0x16, 0x61, 0x75, 0x74, 0x6f, + 0x6c, 0x6f, 0x6f, 0x70, 0x42, 0x75, 0x64, 0x67, 0x65, 0x74, 0x53, 0x74, 0x61, 0x72, 0x74, 0x53, + 0x65, 0x63, 0x12, 0x2b, 0x0a, 0x12, 0x61, 0x75, 0x74, 0x6f, 0x5f, 0x6d, 0x61, 0x78, 0x5f, 0x69, + 0x6e, 0x5f, 0x66, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x18, 0x0d, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0f, + 0x61, 0x75, 0x74, 0x6f, 0x4d, 0x61, 0x78, 0x49, 0x6e, 0x46, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x12, + 0x26, 0x0a, 0x0f, 0x6d, 0x69, 0x6e, 0x5f, 0x73, 0x77, 0x61, 0x70, 0x5f, 0x61, 0x6d, 0x6f, 0x75, + 0x6e, 0x74, 0x18, 0x0e, 0x20, 0x01, 0x28, 0x04, 0x52, 0x0d, 0x6d, 0x69, 0x6e, 0x53, 0x77, 0x61, + 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, 0x26, 0x0a, 0x0f, 0x6d, 0x61, 0x78, 0x5f, 0x73, + 0x77, 0x61, 0x70, 0x5f, 0x61, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x18, 0x0f, 0x20, 0x01, 0x28, 0x04, + 0x52, 0x0d, 0x6d, 0x61, 0x78, 0x53, 0x77, 0x61, 0x70, 0x41, 0x6d, 0x6f, 0x75, 0x6e, 0x74, 0x12, + 0x28, 0x0a, 0x10, 0x68, 0x74, 0x6c, 0x63, 0x5f, 0x63, 0x6f, 0x6e, 0x66, 0x5f, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x18, 0x11, 0x20, 0x01, 0x28, 0x05, 0x52, 0x0e, 0x68, 0x74, 0x6c, 0x63, 0x43, + 0x6f, 0x6e, 0x66, 0x54, 0x61, 0x72, 0x67, 0x65, 0x74, 0x22, 0x84, 0x02, 0x0a, 0x0d, 0x4c, 0x69, + 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x12, 0x1d, 0x0a, 0x0a, 0x63, + 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x04, 0x52, + 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, 0x2e, 0x0a, 0x09, 0x73, 0x77, + 0x61, 0x70, 0x5f, 0x74, 0x79, 0x70, 0x65, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x11, 0x2e, + 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, + 0x52, 0x08, 0x73, 0x77, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x16, 0x0a, 0x06, 0x70, 0x75, + 0x62, 0x6b, 0x65, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0c, 0x52, 0x06, 0x70, 0x75, 0x62, 0x6b, + 0x65, 0x79, 0x12, 0x2e, 0x0a, 0x04, 0x74, 0x79, 0x70, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, + 0x32, 0x1a, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x52, 0x04, 0x74, 0x79, + 0x70, 0x65, 0x12, 0x2d, 0x0a, 0x12, 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x5f, 0x74, + 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, + 0x69, 0x6e, 0x63, 0x6f, 0x6d, 0x69, 0x6e, 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, + 0x64, 0x12, 0x2d, 0x0a, 0x12, 0x6f, 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x5f, 0x74, 0x68, + 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0d, 0x52, 0x11, 0x6f, + 0x75, 0x74, 0x67, 0x6f, 0x69, 0x6e, 0x67, 0x54, 0x68, 0x72, 0x65, 0x73, 0x68, 0x6f, 0x6c, 0x64, + 0x22, 0x59, 0x0a, 0x19, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, + 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x3c, 0x0a, + 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x1c, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x71, 0x75, + 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x52, + 0x0a, 0x70, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x22, 0x1c, 0x0a, 0x1a, 0x53, + 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, + 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x15, 0x0a, 0x13, 0x53, 0x75, 0x67, + 0x67, 0x65, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x22, 0x72, 0x0a, 0x0c, 0x44, 0x69, 0x73, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, + 0x12, 0x1d, 0x0a, 0x0a, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x04, 0x52, 0x09, 0x63, 0x68, 0x61, 0x6e, 0x6e, 0x65, 0x6c, 0x49, 0x64, 0x12, + 0x16, 0x0a, 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0c, 0x52, + 0x06, 0x70, 0x75, 0x62, 0x6b, 0x65, 0x79, 0x12, 0x2b, 0x0a, 0x06, 0x72, 0x65, 0x61, 0x73, 0x6f, + 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x13, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x52, 0x06, 0x72, 0x65, + 0x61, 0x73, 0x6f, 0x6e, 0x22, 0xb6, 0x01, 0x0a, 0x14, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, + 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x32, 0x0a, + 0x08, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, + 0x17, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x6f, 0x70, 0x4f, 0x75, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x07, 0x6c, 0x6f, 0x6f, 0x70, 0x4f, 0x75, + 0x74, 0x12, 0x2f, 0x0a, 0x07, 0x6c, 0x6f, 0x6f, 0x70, 0x5f, 0x69, 0x6e, 0x18, 0x03, 0x20, 0x03, + 0x28, 0x0b, 0x32, 0x16, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x6f, + 0x70, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x52, 0x06, 0x6c, 0x6f, 0x6f, 0x70, + 0x49, 0x6e, 0x12, 0x39, 0x0a, 0x0c, 0x64, 0x69, 0x73, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, + 0x65, 0x64, 0x18, 0x02, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, + 0x70, 0x63, 0x2e, 0x44, 0x69, 0x73, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x52, + 0x0c, 0x64, 0x69, 0x73, 0x71, 0x75, 0x61, 0x6c, 0x69, 0x66, 0x69, 0x65, 0x64, 0x2a, 0x25, 0x0a, + 0x08, 0x53, 0x77, 0x61, 0x70, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0c, 0x0a, 0x08, 0x4c, 0x4f, 0x4f, + 0x50, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x00, 0x12, 0x0b, 0x0a, 0x07, 0x4c, 0x4f, 0x4f, 0x50, 0x5f, + 0x49, 0x4e, 0x10, 0x01, 0x2a, 0x73, 0x0a, 0x09, 0x53, 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, + 0x65, 0x12, 0x0d, 0x0a, 0x09, 0x49, 0x4e, 0x49, 0x54, 0x49, 0x41, 0x54, 0x45, 0x44, 0x10, 0x00, + 0x12, 0x15, 0x0a, 0x11, 0x50, 0x52, 0x45, 0x49, 0x4d, 0x41, 0x47, 0x45, 0x5f, 0x52, 0x45, 0x56, + 0x45, 0x41, 0x4c, 0x45, 0x44, 0x10, 0x01, 0x12, 0x12, 0x0a, 0x0e, 0x48, 0x54, 0x4c, 0x43, 0x5f, + 0x50, 0x55, 0x42, 0x4c, 0x49, 0x53, 0x48, 0x45, 0x44, 0x10, 0x02, 0x12, 0x0b, 0x0a, 0x07, 0x53, + 0x55, 0x43, 0x43, 0x45, 0x53, 0x53, 0x10, 0x03, 0x12, 0x0a, 0x0a, 0x06, 0x46, 0x41, 0x49, 0x4c, + 0x45, 0x44, 0x10, 0x04, 0x12, 0x13, 0x0a, 0x0f, 0x49, 0x4e, 0x56, 0x4f, 0x49, 0x43, 0x45, 0x5f, + 0x53, 0x45, 0x54, 0x54, 0x4c, 0x45, 0x44, 0x10, 0x05, 0x2a, 0xed, 0x01, 0x0a, 0x0d, 0x46, 0x61, + 0x69, 0x6c, 0x75, 0x72, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x46, + 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4e, 0x4f, + 0x4e, 0x45, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4f, 0x46, 0x46, 0x43, 0x48, 0x41, 0x49, 0x4e, 0x10, + 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x41, + 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x02, 0x12, 0x20, 0x0a, + 0x1c, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, + 0x53, 0x57, 0x45, 0x45, 0x50, 0x5f, 0x54, 0x49, 0x4d, 0x45, 0x4f, 0x55, 0x54, 0x10, 0x03, 0x12, + 0x25, 0x0a, 0x21, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x5f, 0x56, + 0x41, 0x4c, 0x55, 0x45, 0x10, 0x04, 0x12, 0x1c, 0x0a, 0x18, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, + 0x45, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x54, 0x45, 0x4d, 0x50, 0x4f, 0x52, 0x41, + 0x52, 0x59, 0x10, 0x05, 0x12, 0x23, 0x0a, 0x1f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x43, 0x4f, 0x52, 0x52, 0x45, 0x43, 0x54, + 0x5f, 0x41, 0x4d, 0x4f, 0x55, 0x4e, 0x54, 0x10, 0x06, 0x2a, 0x2f, 0x0a, 0x11, 0x4c, 0x69, 0x71, + 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x52, 0x75, 0x6c, 0x65, 0x54, 0x79, 0x70, 0x65, 0x12, 0x0b, + 0x0a, 0x07, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, 0x10, 0x00, 0x12, 0x0d, 0x0a, 0x09, 0x54, + 0x48, 0x52, 0x45, 0x53, 0x48, 0x4f, 0x4c, 0x44, 0x10, 0x01, 0x2a, 0xa6, 0x03, 0x0a, 0x0a, 0x41, + 0x75, 0x74, 0x6f, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x55, 0x54, + 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x55, 0x4e, 0x4b, 0x4e, 0x4f, 0x57, 0x4e, + 0x10, 0x00, 0x12, 0x22, 0x0a, 0x1e, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, 0x45, 0x54, 0x5f, 0x4e, 0x4f, 0x54, 0x5f, 0x53, 0x54, 0x41, + 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x1a, 0x0a, 0x16, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, + 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x57, 0x45, 0x45, 0x50, 0x5f, 0x46, 0x45, 0x45, 0x53, + 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, 0x45, 0x54, 0x5f, 0x45, 0x4c, 0x41, 0x50, 0x53, 0x45, 0x44, + 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x5f, 0x49, 0x4e, 0x5f, 0x46, 0x4c, 0x49, 0x47, 0x48, 0x54, 0x10, 0x04, 0x12, 0x18, 0x0a, + 0x14, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x57, 0x41, + 0x50, 0x5f, 0x46, 0x45, 0x45, 0x10, 0x05, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x55, 0x54, 0x4f, 0x5f, + 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4d, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, + 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, + 0x4e, 0x5f, 0x50, 0x52, 0x45, 0x50, 0x41, 0x59, 0x10, 0x07, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x55, + 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, + 0x45, 0x5f, 0x42, 0x41, 0x43, 0x4b, 0x4f, 0x46, 0x46, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x41, + 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x4f, 0x4f, 0x50, 0x5f, + 0x4f, 0x55, 0x54, 0x10, 0x09, 0x12, 0x17, 0x0a, 0x13, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, + 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x4f, 0x4f, 0x50, 0x5f, 0x49, 0x4e, 0x10, 0x0a, 0x12, 0x1c, + 0x0a, 0x18, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x49, + 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, 0x59, 0x5f, 0x4f, 0x4b, 0x10, 0x0b, 0x12, 0x23, 0x0a, 0x1f, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, - 0x45, 0x54, 0x5f, 0x45, 0x4c, 0x41, 0x50, 0x53, 0x45, 0x44, 0x10, 0x03, 0x12, 0x19, 0x0a, 0x15, - 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x49, 0x4e, 0x5f, 0x46, - 0x4c, 0x49, 0x47, 0x48, 0x54, 0x10, 0x04, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x55, 0x54, 0x4f, 0x5f, - 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x53, 0x57, 0x41, 0x50, 0x5f, 0x46, 0x45, 0x45, 0x10, - 0x05, 0x12, 0x19, 0x0a, 0x15, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, - 0x5f, 0x4d, 0x49, 0x4e, 0x45, 0x52, 0x5f, 0x46, 0x45, 0x45, 0x10, 0x06, 0x12, 0x16, 0x0a, 0x12, - 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x50, 0x52, 0x45, 0x50, - 0x41, 0x59, 0x10, 0x07, 0x12, 0x1f, 0x0a, 0x1b, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, - 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x41, 0x49, 0x4c, 0x55, 0x52, 0x45, 0x5f, 0x42, 0x41, 0x43, 0x4b, - 0x4f, 0x46, 0x46, 0x10, 0x08, 0x12, 0x18, 0x0a, 0x14, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, - 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x4f, 0x4f, 0x50, 0x5f, 0x4f, 0x55, 0x54, 0x10, 0x09, 0x12, - 0x17, 0x0a, 0x13, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, - 0x4f, 0x4f, 0x50, 0x5f, 0x49, 0x4e, 0x10, 0x0a, 0x12, 0x1c, 0x0a, 0x18, 0x41, 0x55, 0x54, 0x4f, - 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x4c, 0x49, 0x51, 0x55, 0x49, 0x44, 0x49, 0x54, - 0x59, 0x5f, 0x4f, 0x4b, 0x10, 0x0b, 0x12, 0x23, 0x0a, 0x1f, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, - 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x42, 0x55, 0x44, 0x47, 0x45, 0x54, 0x5f, 0x49, 0x4e, 0x53, - 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x10, 0x0c, 0x12, 0x20, 0x0a, 0x1c, 0x41, - 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x49, - 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x10, 0x0d, 0x32, 0xc2, 0x07, - 0x0a, 0x0a, 0x53, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x07, - 0x4c, 0x6f, 0x6f, 0x70, 0x4f, 0x75, 0x74, 0x12, 0x17, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x4c, 0x6f, 0x6f, 0x70, 0x4f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x52, - 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, 0x06, 0x4c, 0x6f, 0x6f, 0x70, 0x49, - 0x6e, 0x12, 0x16, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x6f, 0x70, - 0x49, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, - 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x39, 0x0a, 0x07, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x12, 0x17, 0x2e, 0x6c, 0x6f, - 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, - 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x30, 0x01, 0x12, 0x42, 0x0a, 0x09, 0x4c, - 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x12, 0x19, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, - 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, - 0x39, 0x0a, 0x08, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x12, 0x18, 0x2e, 0x6c, 0x6f, - 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x53, 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x40, 0x0a, 0x0c, 0x4c, 0x6f, - 0x6f, 0x70, 0x4f, 0x75, 0x74, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, - 0x74, 0x1a, 0x19, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x54, - 0x65, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0c, - 0x4c, 0x6f, 0x6f, 0x70, 0x4f, 0x75, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x6c, - 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, - 0x74, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, - 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x6f, 0x70, 0x49, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x73, + 0x45, 0x54, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, 0x54, 0x10, + 0x0c, 0x12, 0x20, 0x0a, 0x1c, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x52, 0x45, 0x41, 0x53, 0x4f, 0x4e, + 0x5f, 0x46, 0x45, 0x45, 0x5f, 0x49, 0x4e, 0x53, 0x55, 0x46, 0x46, 0x49, 0x43, 0x49, 0x45, 0x4e, + 0x54, 0x10, 0x0d, 0x32, 0xc2, 0x07, 0x0a, 0x0a, 0x53, 0x77, 0x61, 0x70, 0x43, 0x6c, 0x69, 0x65, + 0x6e, 0x74, 0x12, 0x39, 0x0a, 0x07, 0x4c, 0x6f, 0x6f, 0x70, 0x4f, 0x75, 0x74, 0x12, 0x17, 0x2e, + 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x6f, 0x6f, 0x70, 0x4f, 0x75, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x37, 0x0a, + 0x06, 0x4c, 0x6f, 0x6f, 0x70, 0x49, 0x6e, 0x12, 0x16, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x4c, 0x6f, 0x6f, 0x70, 0x49, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x07, 0x4d, 0x6f, 0x6e, 0x69, 0x74, 0x6f, + 0x72, 0x12, 0x17, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4d, 0x6f, 0x6e, 0x69, + 0x74, 0x6f, 0x72, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6c, 0x6f, 0x6f, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x30, + 0x01, 0x12, 0x42, 0x0a, 0x09, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x12, 0x19, + 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, + 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1a, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x73, + 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x39, 0x0a, 0x08, 0x53, 0x77, 0x61, 0x70, 0x49, 0x6e, 0x66, + 0x6f, 0x12, 0x18, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, + 0x49, 0x6e, 0x66, 0x6f, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x13, 0x2e, 0x6c, 0x6f, + 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x77, 0x61, 0x70, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x12, 0x40, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x70, 0x4f, 0x75, 0x74, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x73, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, - 0x63, 0x2e, 0x49, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, - 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x6f, 0x70, 0x49, 0x6e, 0x51, 0x75, - 0x6f, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, - 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, 0x6c, 0x6f, 0x6f, - 0x70, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, - 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x12, 0x15, 0x2e, - 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, - 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0d, - 0x47, 0x65, 0x74, 0x4c, 0x73, 0x61, 0x74, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x12, 0x16, 0x2e, - 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, - 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, - 0x72, 0x61, 0x6d, 0x73, 0x12, 0x22, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, - 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, - 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, - 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, - 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x5d, 0x0a, 0x12, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x71, - 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x22, 0x2e, 0x6c, - 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, - 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x23, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, 0x4c, 0x69, - 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, - 0x53, 0x77, 0x61, 0x70, 0x73, 0x12, 0x1c, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, - 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, - 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, - 0x67, 0x67, 0x65, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6c, - 0x6f, 0x6f, 0x70, 0x2f, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, + 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0c, 0x4c, 0x6f, 0x6f, 0x70, 0x4f, 0x75, 0x74, 0x51, 0x75, 0x6f, + 0x74, 0x65, 0x12, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f, + 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x19, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x4f, 0x75, 0x74, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x6f, 0x6f, 0x70, 0x49, + 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x12, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x18, 0x2e, + 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x54, 0x65, 0x72, 0x6d, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x41, 0x0a, 0x0e, 0x47, 0x65, 0x74, 0x4c, 0x6f, + 0x6f, 0x70, 0x49, 0x6e, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x12, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x51, 0x75, 0x6f, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, + 0x1a, 0x18, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x49, 0x6e, 0x51, 0x75, 0x6f, + 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x36, 0x0a, 0x05, 0x50, 0x72, + 0x6f, 0x62, 0x65, 0x12, 0x15, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, + 0x6f, 0x62, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x6c, 0x6f, 0x6f, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x50, 0x72, 0x6f, 0x62, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x40, 0x0a, 0x0d, 0x47, 0x65, 0x74, 0x4c, 0x73, 0x61, 0x74, 0x54, 0x6f, 0x6b, + 0x65, 0x6e, 0x73, 0x12, 0x16, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x6f, + 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x17, 0x2e, 0x6c, 0x6f, + 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x54, 0x6f, 0x6b, 0x65, 0x6e, 0x73, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x56, 0x0a, 0x12, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, + 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x12, 0x22, 0x2e, 0x6c, 0x6f, 0x6f, + 0x70, 0x72, 0x70, 0x63, 0x2e, 0x47, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, + 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1c, + 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, + 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x65, 0x74, 0x65, 0x72, 0x73, 0x12, 0x5d, 0x0a, 0x12, + 0x53, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, + 0x6d, 0x73, 0x12, 0x22, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x65, 0x74, + 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, 0x61, 0x6d, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, 0x63, + 0x2e, 0x53, 0x65, 0x74, 0x4c, 0x69, 0x71, 0x75, 0x69, 0x64, 0x69, 0x74, 0x79, 0x50, 0x61, 0x72, + 0x61, 0x6d, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x4b, 0x0a, 0x0c, 0x53, + 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, 0x12, 0x1c, 0x2e, 0x6c, 0x6f, + 0x6f, 0x70, 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x53, 0x77, 0x61, + 0x70, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x1d, 0x2e, 0x6c, 0x6f, 0x6f, 0x70, + 0x72, 0x70, 0x63, 0x2e, 0x53, 0x75, 0x67, 0x67, 0x65, 0x73, 0x74, 0x53, 0x77, 0x61, 0x70, 0x73, + 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x27, 0x5a, 0x25, 0x67, 0x69, 0x74, 0x68, + 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x6c, 0x69, 0x67, 0x68, 0x74, 0x6e, 0x69, 0x6e, 0x67, + 0x6c, 0x61, 0x62, 0x73, 0x2f, 0x6c, 0x6f, 0x6f, 0x70, 0x2f, 0x6c, 0x6f, 0x6f, 0x70, 0x72, 0x70, + 0x63, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/looprpc/client.proto b/looprpc/client.proto index 26d41a2..419e55d 100644 --- a/looprpc/client.proto +++ b/looprpc/client.proto @@ -298,18 +298,12 @@ message SwapResponse { depending on the request, the semantics are different. - For internal loop-in htlc_address contains the address of the native segwit (P2WSH) htlc. - - For external loop-in htlc_address contains the address of the - nested segwit (NP2WSH) htlc. - - For loop-out htlc_address always contains the native segwit (P2WSH) +/ - For loop-out htlc_address always contains the native segwit (P2WSH) htlc address. */ string htlc_address = 2 [deprecated = true]; - /* - The nested segwit address of the on-chain htlc. - This field remains empty for loop-out. - */ - string htlc_address_np2wsh = 4; + reserved 4; /* The native segwit address of the on-chain htlc. @@ -377,8 +371,6 @@ message SwapStatus { DEPRECATED: This field stores the address of the onchain htlc. - For internal loop-in htlc_address contains the address of the native segwit (P2WSH) htlc. - - For external loop-in htlc_address contains the nested segwit (NP2WSH) - address. - For loop-out htlc_address always contains the native segwit (P2WSH) htlc address. */ @@ -387,9 +379,6 @@ message SwapStatus { // HTLC address (native segwit), used in loop-in and loop-out swaps. string htlc_address_p2wsh = 12; - // HTLC address (nested segwit), used in loop-in swaps only. - string htlc_address_np2wsh = 13; - // The address of the v3 (taproot) htlc. Used for both loop-in and loop-out. string htlc_address_p2tr = 18; diff --git a/looprpc/client.swagger.json b/looprpc/client.swagger.json index 5e43d6c..11d8f90 100644 --- a/looprpc/client.swagger.json +++ b/looprpc/client.swagger.json @@ -1034,11 +1034,7 @@ }, "htlc_address": { "type": "string", - "description": "DEPRECATED. This field stores the address of the onchain htlc, but\ndepending on the request, the semantics are different.\n- For internal loop-in htlc_address contains the address of the\nnative segwit (P2WSH) htlc.\n- For external loop-in htlc_address contains the address of the\nnested segwit (NP2WSH) htlc.\n- For loop-out htlc_address always contains the native segwit (P2WSH)\nhtlc address." - }, - "htlc_address_np2wsh": { - "type": "string", - "description": "The nested segwit address of the on-chain htlc.\nThis field remains empty for loop-out." + "description": "DEPRECATED. This field stores the address of the onchain htlc, but\ndepending on the request, the semantics are different.\n- For internal loop-in htlc_address contains the address of the\nnative segwit (P2WSH) htlc.\n/ - For loop-out htlc_address always contains the native segwit (P2WSH)\nhtlc address." }, "htlc_address_p2wsh": { "type": "string", @@ -1108,16 +1104,12 @@ }, "htlc_address": { "type": "string", - "description": "DEPRECATED: This field stores the address of the onchain htlc.\n- For internal loop-in htlc_address contains the address of the\nnative segwit (P2WSH) htlc.\n- For external loop-in htlc_address contains the nested segwit (NP2WSH)\naddress.\n- For loop-out htlc_address always contains the native segwit (P2WSH)\nhtlc address." + "description": "DEPRECATED: This field stores the address of the onchain htlc.\n- For internal loop-in htlc_address contains the address of the\nnative segwit (P2WSH) htlc.\n- For loop-out htlc_address always contains the native segwit (P2WSH)\nhtlc address." }, "htlc_address_p2wsh": { "type": "string", "description": "HTLC address (native segwit), used in loop-in and loop-out swaps." }, - "htlc_address_np2wsh": { - "type": "string", - "description": "HTLC address (nested segwit), used in loop-in swaps only." - }, "htlc_address_p2tr": { "type": "string", "description": "The address of the v3 (taproot) htlc. Used for both loop-in and loop-out." diff --git a/swap.go b/swap.go index 56dc8fa..a084e95 100644 --- a/swap.go +++ b/swap.go @@ -53,18 +53,6 @@ func newSwapKit(hash lntypes.Hash, swapType swap.Type, cfg *swapConfig, func GetHtlcScriptVersion( protocolVersion loopdb.ProtocolVersion) swap.ScriptVersion { - // Unrecorded protocol version implies that there was no protocol - // version stored along side a serialized swap that we're resuming in - // which case the swap was initiated with HTLC v1 script. - if protocolVersion == loopdb.ProtocolVersionUnrecorded { - return swap.HtlcV1 - } - - // If the swap was initiated before we had our v2 script, use v1. - if protocolVersion < loopdb.ProtocolVersionHtlcV2 { - return swap.HtlcV1 - } - // If the swap was initiated before we had our v3 script, use v2. if protocolVersion < loopdb.ProtocolVersionHtlcV3 { return swap.HtlcV2 diff --git a/swap/htlc.go b/swap/htlc.go index 3fdc7c9..1e174cc 100644 --- a/swap/htlc.go +++ b/swap/htlc.go @@ -1,7 +1,6 @@ package swap import ( - "bytes" "crypto/sha256" "errors" "fmt" @@ -26,10 +25,6 @@ const ( // HtlcP2WSH is a pay-to-witness-script-hash output (segwit only) HtlcP2WSH HtlcOutputType = iota - // HtlcNP2WSH is a nested pay-to-witness-script-hash output that can be - // paid to be legacy wallets. - HtlcNP2WSH - // HtlcP2TR is a pay-to-taproot output with three separate spend paths. HtlcP2TR ) @@ -38,11 +33,8 @@ const ( type ScriptVersion uint8 const ( - // HtlcV1 refers to the original version of the HTLC script. - HtlcV1 ScriptVersion = iota - // HtlcV2 refers to the improved version of the HTLC script. - HtlcV2 + HtlcV2 ScriptVersion = iota // HtlcV3 refers to an upgraded version of HtlcV2 implemented with // tapscript. @@ -135,12 +127,12 @@ var ( ) // ErrInvalidScriptVersion is returned when an unknown htlc version - // is provided to NewHtlc. The supported version are HtlcV1, HtlcV2, - // HtlcV3 as enums. + // is provided to NewHtlc. The supported version are HtlcV2, HtlcV3 + // as enums. ErrInvalidScriptVersion = fmt.Errorf("invalid script version") // ErrInvalidOutputSelected is returned when a taproot output is - // selected for a v1 or v2 script. + // selected for a v2 script. ErrInvalidOutputSelected = fmt.Errorf("taproot output selected for " + "non taproot htlc") ) @@ -151,9 +143,6 @@ func (h HtlcOutputType) String() string { case HtlcP2WSH: return "P2WSH" - case HtlcNP2WSH: - return "NP2WSH" - case HtlcP2TR: return "P2TR" @@ -174,11 +163,6 @@ func NewHtlc(version ScriptVersion, cltvExpiry int32, ) switch version { - case HtlcV1: - htlc, err = newHTLCScriptV1( - cltvExpiry, senderKey, receiverKey, hash, - ) - case HtlcV2: htlc, err = newHTLCScriptV2( cltvExpiry, senderKey, receiverKey, hash, @@ -223,47 +207,6 @@ func segwitV0LockingConditions(outputType HtlcOutputType, []byte, []byte, error) { switch outputType { - case HtlcNP2WSH: - p2wshPkScript, err := input.WitnessScriptHash(script) - if err != nil { - return nil, nil, nil, err - } - - // Generate p2sh script for p2wsh (nested). - p2wshPkScriptHash := sha256.Sum256(p2wshPkScript) - hash160 := input.Ripemd160H(p2wshPkScriptHash[:]) - - builder := txscript.NewScriptBuilder() - - builder.AddOp(txscript.OP_HASH160) - builder.AddData(hash160) - builder.AddOp(txscript.OP_EQUAL) - - pkScript, err := builder.Script() - if err != nil { - return nil, nil, nil, err - } - - // Generate a valid sigScript that will allow us to spend the - // p2sh output. The sigScript will contain only a single push of - // the p2wsh witness program corresponding to the matching - // public key of this address. - sigScript, err := txscript.NewScriptBuilder(). - AddData(p2wshPkScript). - Script() - if err != nil { - return nil, nil, nil, err - } - - address, err := btcutil.NewAddressScriptHash( - p2wshPkScript, chainParams, - ) - if err != nil { - return nil, nil, nil, err - } - - return address, pkScript, sigScript, nil - case HtlcP2WSH: pkScript, err := input.WitnessScriptHash(script) if err != nil { @@ -324,9 +267,6 @@ func (h *Htlc) AddSuccessToEstimator(estimator *input.TxWeightEstimator) error { case HtlcP2WSH: estimator.AddWitnessInput(maxSuccessWitnessSize) - - case HtlcNP2WSH: - estimator.AddNestedP2WSHInput(maxSuccessWitnessSize) } return nil @@ -355,171 +295,11 @@ func (h *Htlc) AddTimeoutToEstimator(estimator *input.TxWeightEstimator) error { case HtlcP2WSH: estimator.AddWitnessInput(maxTimeoutWitnessSize) - - case HtlcNP2WSH: - estimator.AddNestedP2WSHInput(maxTimeoutWitnessSize) } return nil } -// HtlcScriptV1 encapsulates the htlc v1 script. -type HtlcScriptV1 struct { - script []byte -} - -// newHTLCScriptV1 constructs an HtlcScript with the HTLC V1 witness script. -// -// OP_SIZE 32 OP_EQUAL -// OP_IF -// OP_HASH160 OP_EQUALVERIFY -// -// OP_ELSE -// OP_DROP -// OP_CHECKLOCKTIMEVERIFY OP_DROP -// -// OP_ENDIF -// OP_CHECKSIG -func newHTLCScriptV1(cltvExpiry int32, senderHtlcKey, - receiverHtlcKey [33]byte, swapHash lntypes.Hash) (*HtlcScriptV1, error) { - - builder := txscript.NewScriptBuilder() - - builder.AddOp(txscript.OP_SIZE) - builder.AddInt64(32) - builder.AddOp(txscript.OP_EQUAL) - - builder.AddOp(txscript.OP_IF) - - builder.AddOp(txscript.OP_HASH160) - builder.AddData(input.Ripemd160H(swapHash[:])) - builder.AddOp(txscript.OP_EQUALVERIFY) - - builder.AddData(receiverHtlcKey[:]) - - builder.AddOp(txscript.OP_ELSE) - - builder.AddOp(txscript.OP_DROP) - - builder.AddInt64(int64(cltvExpiry)) - builder.AddOp(txscript.OP_CHECKLOCKTIMEVERIFY) - builder.AddOp(txscript.OP_DROP) - - builder.AddData(senderHtlcKey[:]) - - builder.AddOp(txscript.OP_ENDIF) - - builder.AddOp(txscript.OP_CHECKSIG) - - script, err := builder.Script() - if err != nil { - return nil, err - } - - return &HtlcScriptV1{ - script: script, - }, nil -} - -// genSuccessWitness returns the success script to spend this htlc with -// the preimage. -func (h *HtlcScriptV1) genSuccessWitness(receiverSig []byte, - preimage lntypes.Preimage) (wire.TxWitness, error) { - - witnessStack := make(wire.TxWitness, 3) - witnessStack[0] = append(receiverSig, byte(txscript.SigHashAll)) - witnessStack[1] = preimage[:] - witnessStack[2] = h.script - - return witnessStack, nil -} - -// GenTimeoutWitness returns the timeout script to spend this htlc after -// timeout. -func (h *HtlcScriptV1) GenTimeoutWitness( - senderSig []byte) (wire.TxWitness, error) { - - witnessStack := make(wire.TxWitness, 3) - witnessStack[0] = append(senderSig, byte(txscript.SigHashAll)) - witnessStack[1] = []byte{0} - witnessStack[2] = h.script - - return witnessStack, nil -} - -// IsSuccessWitness checks whether the given stack is valid for redeeming the -// htlc. -func (h *HtlcScriptV1) IsSuccessWitness(witness wire.TxWitness) bool { - if len(witness) != 3 { - return false - } - - isTimeoutTx := bytes.Equal([]byte{0}, witness[1]) - return !isTimeoutTx -} - -// TimeoutScript returns the redeem script required to unlock the htlc after -// timeout. -// -// In the case of HtlcScriptV1, this is the full segwit v0 script. -func (h *HtlcScriptV1) TimeoutScript() []byte { - return h.script -} - -// SuccessScript returns the redeem script required to unlock the htlc using -// the preimage. -// -// In the case of HtlcScriptV1, this is the full segwit v0 script. -func (h *HtlcScriptV1) SuccessScript() []byte { - return h.script -} - -// MaxSuccessWitnessSize returns the maximum success witness size. -func (h *HtlcScriptV1) MaxSuccessWitnessSize() int { - // Calculate maximum success witness size - // - // - number_of_witness_elements: 1 byte - // - receiver_sig_length: 1 byte - // - receiver_sig: 73 bytes - // - preimage_length: 1 byte - // - preimage: 32 bytes - // - witness_script_length: 1 byte - // - witness_script: len(script) bytes - return 1 + 1 + 73 + 1 + 32 + 1 + len(h.script) -} - -// MaxTimeoutWitnessSize return the maximum timeout witness size. -func (h *HtlcScriptV1) MaxTimeoutWitnessSize() int { - // Calculate maximum timeout witness size - // - // - number_of_witness_elements: 1 byte - // - sender_sig_length: 1 byte - // - sender_sig: 73 bytes - // - zero_length: 1 byte - // - zero: 1 byte - // - witness_script_length: 1 byte - // - witness_script: len(script) bytes - return 1 + 1 + 73 + 1 + 1 + 1 + len(h.script) -} - -// SuccessSequence returns the sequence to spend this htlc in the success case. -func (h *HtlcScriptV1) SuccessSequence() uint32 { - return 0 -} - -// Sighash is the signature hash to use for transactions spending from the htlc. -func (h *HtlcScriptV1) SigHash() txscript.SigHashType { - return txscript.SigHashAll -} - -// lockingConditions return the address, pkScript and sigScript (if -// required) for a htlc script. -func (h *HtlcScriptV1) lockingConditions(htlcOutputType HtlcOutputType, - params *chaincfg.Params) (btcutil.Address, []byte, []byte, error) { - - return segwitV0LockingConditions(htlcOutputType, params, h.script) -} - // HtlcScriptV2 encapsulates the htlc v2 script. type HtlcScriptV2 struct { script []byte From 7341a14280c279f7b64388c9cdd2cf9ffdd05994 Mon Sep 17 00:00:00 2001 From: Andras Banki-Horvath Date: Fri, 4 Nov 2022 16:54:03 +0100 Subject: [PATCH 04/14] docs: update release notes --- release_notes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/release_notes.md b/release_notes.md index 08c8c28..5e3346e 100644 --- a/release_notes.md +++ b/release_notes.md @@ -17,6 +17,8 @@ This file tracks release notes for the loop client. #### New Features #### Breaking Changes +* Listing loop-in swaps will not display old, nested segwit swap htlc addresses correctly anymore since + support for these htlc types is removed from the code base. #### Bug Fixes * Bump minimum LND version to v0.15.1-beta to avoid failed swaps due to the chain From 113f30bd8380de14b7b0096dd65497cea4f83452 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Fri, 18 Nov 2022 18:51:14 +0000 Subject: [PATCH 05/14] build(deps): bump github.com/lightningnetwork/lnd Bumps [github.com/lightningnetwork/lnd](https://github.com/lightningnetwork/lnd) from 0.15.3-beta to 0.15.4-beta. - [Release notes](https://github.com/lightningnetwork/lnd/releases) - [Changelog](https://github.com/lightningnetwork/lnd/blob/master/docs/release.md) - [Commits](https://github.com/lightningnetwork/lnd/compare/v0.15.3-beta...v0.15.4-beta) --- updated-dependencies: - dependency-name: github.com/lightningnetwork/lnd dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- go.mod | 4 ++-- go.sum | 8 ++++---- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/go.mod b/go.mod index e52756e..ca3b6a3 100644 --- a/go.mod +++ b/go.mod @@ -1,7 +1,7 @@ module github.com/lightninglabs/loop require ( - github.com/btcsuite/btcd v0.23.2 + github.com/btcsuite/btcd v0.23.3 github.com/btcsuite/btcd/btcec/v2 v2.2.1 github.com/btcsuite/btcd/btcutil v1.1.2 github.com/btcsuite/btcd/btcutil/psbt v1.1.5 @@ -18,7 +18,7 @@ require ( github.com/lightninglabs/lndclient v0.15.1-5 github.com/lightninglabs/loop/swapserverrpc v1.0.1 github.com/lightninglabs/protobuf-hex-display v1.4.3-hex-display - github.com/lightningnetwork/lnd v0.15.3-beta + github.com/lightningnetwork/lnd v0.15.4-beta github.com/lightningnetwork/lnd/cert v1.1.1 github.com/lightningnetwork/lnd/clock v1.1.0 github.com/lightningnetwork/lnd/queue v1.1.0 diff --git a/go.sum b/go.sum index e4492b8..b2b2c43 100644 --- a/go.sum +++ b/go.sum @@ -79,8 +79,8 @@ github.com/btcsuite/btcd v0.22.0-beta.0.20220207191057-4dc4ff7963b4/go.mod h1:7a github.com/btcsuite/btcd v0.22.0-beta.0.20220316175102-8d5c75c28923/go.mod h1:taIcYprAW2g6Z9S0gGUxyR+zDwimyDMK5ePOX+iJ2ds= github.com/btcsuite/btcd v0.23.0/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= github.com/btcsuite/btcd v0.23.1/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= -github.com/btcsuite/btcd v0.23.2 h1:/YOgUp25sdCnP5ho6Hl3s0E438zlX+Kak7E6TgBgoT0= -github.com/btcsuite/btcd v0.23.2/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= +github.com/btcsuite/btcd v0.23.3 h1:4KH/JKy9WiCd+iUS9Mu0Zp7Dnj17TGdKrg9xc/FGj24= +github.com/btcsuite/btcd v0.23.3/go.mod h1:0QJIIN1wwIXF/3G/m87gIwGniDMDQqjVn4SZgnFpsYY= github.com/btcsuite/btcd/btcec/v2 v2.1.0/go.mod h1:2VzYrv4Gm4apmbVVsSq5bqf1Ec8v56E48Vt0Y/umPgA= github.com/btcsuite/btcd/btcec/v2 v2.1.1/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= github.com/btcsuite/btcd/btcec/v2 v2.1.3/go.mod h1:ctjw4H1kknNJmRN4iP1R7bTQ+v3GJkZBd6mui8ZsAZE= @@ -529,8 +529,8 @@ github.com/lightningnetwork/lightning-onion v1.0.2-0.20220211021909-bb84a1ccb0c5 github.com/lightningnetwork/lightning-onion v1.0.2-0.20220211021909-bb84a1ccb0c5/go.mod h1:7dDx73ApjEZA0kcknI799m2O5kkpfg4/gr7N092ojNo= github.com/lightningnetwork/lnd v0.14.1-beta.0.20220324135938-0dcaa511a249/go.mod h1:Tp3ZxsfioUl6kQ30RrbMqWoZyZ4K+fv/o1lMEU8U7rA= github.com/lightningnetwork/lnd v0.15.1-beta/go.mod h1:21UpSyTj8n94nsaJ0OFRXk4yOEkE7xA9JEX5QS4oMy4= -github.com/lightningnetwork/lnd v0.15.3-beta h1:mm7fyXMgZPRyh0fFLO3tnvfvXszp/kVnGGciS76Wefs= -github.com/lightningnetwork/lnd v0.15.3-beta/go.mod h1:UaCwJBMCJbwPMsUjfTIaKPKF8K79btRPnhqfiNPyKtA= +github.com/lightningnetwork/lnd v0.15.4-beta h1:vO+UZjuA8RqJdDlfwQeS0h2PCocYwwqv5HkX2IXf5/M= +github.com/lightningnetwork/lnd v0.15.4-beta/go.mod h1:6aoOkifcI9tuk8UV5l2rVZSq0681obuP4zvfK+2ZrT0= github.com/lightningnetwork/lnd/cert v1.1.1 h1:Nsav0RlIDRbOnzz2Yu69SQlK939IKya3Q2S0mDviIN8= github.com/lightningnetwork/lnd/cert v1.1.1/go.mod h1:1P46svkkd73oSoeI4zjkVKgZNwGq8bkGuPR8z+5vQUs= github.com/lightningnetwork/lnd/clock v1.0.1/go.mod h1:KnQudQ6w0IAMZi1SgvecLZQZ43ra2vpDNj7H/aasemg= From 105d3d1ab4b04a6da206cafcb86145c8d50e7467 Mon Sep 17 00:00:00 2001 From: Andras Banki-Horvath Date: Fri, 18 Nov 2022 21:24:31 +0100 Subject: [PATCH 06/14] loopd: bump minimum lnd version to v0.15.4 --- loopd/run.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/loopd/run.go b/loopd/run.go index 4475551..06beaac 100644 --- a/loopd/run.go +++ b/loopd/run.go @@ -27,7 +27,7 @@ var ( LoopMinRequiredLndVersion = &verrpc.Version{ AppMajor: 0, AppMinor: 15, - AppPatch: 1, + AppPatch: 4, BuildTags: []string{ "signrpc", "walletrpc", "chainrpc", "invoicesrpc", }, From bdb4b773ed82599858798f40f9132d9303266a01 Mon Sep 17 00:00:00 2001 From: Andras Banki-Horvath Date: Wed, 16 Nov 2022 19:01:28 +0100 Subject: [PATCH 07/14] swap: refactor htlc construction to allow passing of internal keys This commit is a refactor of how we construct htlcs to make it possible to pass in internal keys for the sender and receiver when creating P2TR htlcs. Furthermore the commit also cleans up constructors to not pass in script versions and output types to make the code more readable. --- client.go | 64 ++++++++++---------------- client_test.go | 24 +++++++--- loopd/view.go | 35 ++++---------- loopin.go | 30 ++++++------ loopin_test.go | 35 +++++++++----- loopout.go | 25 ++++------ swap.go | 31 +++++++++---- swap/htlc.go | 113 +++++++++++++++++++++++++++++++--------------- swap/htlc_test.go | 27 ++++++----- 9 files changed, 207 insertions(+), 177 deletions(-) diff --git a/client.go b/client.go index 4581f0f..0bf6e46 100644 --- a/client.go +++ b/client.go @@ -213,29 +213,24 @@ func (s *Client) FetchSwaps() ([]*SwapInfo, error) { SwapHash: swp.Hash, LastUpdate: swp.LastUpdateTime(), } - scriptVersion := GetHtlcScriptVersion( - swp.Contract.ProtocolVersion, - ) - - outputType := swap.HtlcP2WSH - if scriptVersion == swap.HtlcV3 { - outputType = swap.HtlcP2TR - } - htlc, err := swap.NewHtlc( - scriptVersion, - swp.Contract.CltvExpiry, swp.Contract.SenderKey, - swp.Contract.ReceiverKey, swp.Hash, - outputType, s.lndServices.ChainParams, + htlc, err := GetHtlc( + swp.Hash, &swp.Contract.SwapContract, + s.lndServices.ChainParams, ) if err != nil { return nil, err } - if outputType == swap.HtlcP2TR { - swapInfo.HtlcAddressP2TR = htlc.Address - } else { + switch htlc.OutputType { + case swap.HtlcP2WSH: swapInfo.HtlcAddressP2WSH = htlc.Address + + case swap.HtlcP2TR: + swapInfo.HtlcAddressP2TR = htlc.Address + + default: + return nil, swap.ErrInvalidOutputType } swaps = append(swaps, swapInfo) @@ -250,34 +245,23 @@ func (s *Client) FetchSwaps() ([]*SwapInfo, error) { LastUpdate: swp.LastUpdateTime(), } - scriptVersion := GetHtlcScriptVersion( - swp.Contract.SwapContract.ProtocolVersion, + htlc, err := GetHtlc( + swp.Hash, &swp.Contract.SwapContract, + s.lndServices.ChainParams, ) + if err != nil { + return nil, err + } - if scriptVersion == swap.HtlcV3 { - htlcP2TR, err := swap.NewHtlc( - swap.HtlcV3, swp.Contract.CltvExpiry, - swp.Contract.SenderKey, swp.Contract.ReceiverKey, - swp.Hash, swap.HtlcP2TR, - s.lndServices.ChainParams, - ) - if err != nil { - return nil, err - } + switch htlc.OutputType { + case swap.HtlcP2WSH: + swapInfo.HtlcAddressP2WSH = htlc.Address - swapInfo.HtlcAddressP2TR = htlcP2TR.Address - } else { - htlcP2WSH, err := swap.NewHtlc( - swap.HtlcV2, swp.Contract.CltvExpiry, - swp.Contract.SenderKey, swp.Contract.ReceiverKey, - swp.Hash, swap.HtlcP2WSH, - s.lndServices.ChainParams, - ) - if err != nil { - return nil, err - } + case swap.HtlcP2TR: + swapInfo.HtlcAddressP2TR = htlc.Address - swapInfo.HtlcAddressP2WSH = htlcP2WSH.Address + default: + return nil, swap.ErrInvalidOutputType } swaps = append(swaps, swapInfo) diff --git a/client_test.go b/client_test.go index 7c8f88b..3bca073 100644 --- a/client_test.go +++ b/client_test.go @@ -284,16 +284,26 @@ func testLoopOutResume(t *testing.T, confs uint32, expired, preimageRevealed, // Assert that the loopout htlc equals to the expected one. scriptVersion := GetHtlcScriptVersion(protocolVersion) + var htlc *swap.Htlc - outputType := swap.HtlcP2TR - if scriptVersion != swap.HtlcV3 { - outputType = swap.HtlcP2WSH + switch scriptVersion { + case swap.HtlcV2: + htlc, err = swap.NewHtlcV2( + pendingSwap.Contract.CltvExpiry, senderKey, + receiverKey, hash, &chaincfg.TestNet3Params, + ) + + case swap.HtlcV3: + htlc, err = swap.NewHtlcV3( + pendingSwap.Contract.CltvExpiry, senderKey, + receiverKey, senderKey, receiverKey, hash, + &chaincfg.TestNet3Params, + ) + + default: + t.Fatalf(swap.ErrInvalidScriptVersion.Error()) } - htlc, err := swap.NewHtlc( - scriptVersion, pendingSwap.Contract.CltvExpiry, senderKey, - receiverKey, hash, outputType, &chaincfg.TestNet3Params, - ) require.NoError(t, err) require.Equal(t, htlc.PkScript, confIntent.PkScript) diff --git a/loopd/view.go b/loopd/view.go index f99fdef..3a7b600 100644 --- a/loopd/view.go +++ b/loopd/view.go @@ -7,7 +7,6 @@ import ( "github.com/lightninglabs/lndclient" "github.com/lightninglabs/loop" "github.com/lightninglabs/loop/loopdb" - "github.com/lightninglabs/loop/swap" ) // view prints all swaps currently in the database. @@ -49,24 +48,8 @@ func viewOut(swapClient *loop.Client, chainParams *chaincfg.Params) error { } for _, s := range swaps { - scriptVersion := loop.GetHtlcScriptVersion( - s.Contract.ProtocolVersion, - ) - - var outputType swap.HtlcOutputType - switch scriptVersion { - case swap.HtlcV2: - outputType = swap.HtlcP2WSH - - case swap.HtlcV3: - outputType = swap.HtlcP2TR - } - htlc, err := swap.NewHtlc( - loop.GetHtlcScriptVersion(s.Contract.ProtocolVersion), - s.Contract.CltvExpiry, - s.Contract.SenderKey, - s.Contract.ReceiverKey, - s.Hash, outputType, chainParams, + htlc, err := loop.GetHtlc( + s.Hash, &s.Contract.SwapContract, chainParams, ) if err != nil { return err @@ -77,7 +60,8 @@ func viewOut(swapClient *loop.Client, chainParams *chaincfg.Params) error { s.Contract.InitiationTime, s.Contract.InitiationHeight, ) fmt.Printf(" Preimage: %v\n", s.Contract.Preimage) - fmt.Printf(" Htlc address: %v\n", htlc.Address) + fmt.Printf(" Htlc address (%s): %v\n", htlc.OutputType, + htlc.Address) fmt.Printf(" Uncharge channels: %v\n", s.Contract.OutgoingChanSet) @@ -113,12 +97,8 @@ func viewIn(swapClient *loop.Client, chainParams *chaincfg.Params) error { } for _, s := range swaps { - htlc, err := swap.NewHtlc( - loop.GetHtlcScriptVersion(s.Contract.ProtocolVersion), - s.Contract.CltvExpiry, - s.Contract.SenderKey, - s.Contract.ReceiverKey, - s.Hash, swap.HtlcP2WSH, chainParams, + htlc, err := loop.GetHtlc( + s.Hash, &s.Contract.SwapContract, chainParams, ) if err != nil { return err @@ -129,7 +109,8 @@ func viewIn(swapClient *loop.Client, chainParams *chaincfg.Params) error { s.Contract.InitiationTime, s.Contract.InitiationHeight, ) fmt.Printf(" Preimage: %v\n", s.Contract.Preimage) - fmt.Printf(" Htlc address: %v\n", htlc.Address) + fmt.Printf(" Htlc address (%s): %v\n", htlc.OutputType, + htlc.Address) fmt.Printf(" Amt: %v, Expiry: %v\n", s.Contract.AmountRequested, s.Contract.CltvExpiry, ) diff --git a/loopin.go b/loopin.go index 8b3e49b..62d2a42 100644 --- a/loopin.go +++ b/loopin.go @@ -404,26 +404,26 @@ func validateLoopInContract(lnd *lndclient.LndServices, // initHtlcs creates and updates the native and nested segwit htlcs // of the loopInSwap. func (s *loopInSwap) initHtlcs() error { - if IsTaprootSwap(&s.SwapContract) { - htlcP2TR, err := s.swapKit.getHtlc(swap.HtlcP2TR) - if err != nil { - return err - } + htlc, err := GetHtlc( + s.hash, &s.SwapContract, s.swapKit.lnd.ChainParams, + ) + if err != nil { + return err + } - s.swapKit.log.Infof("Htlc address (P2TR): %v", htlcP2TR.Address) - s.htlcP2TR = htlcP2TR + switch htlc.OutputType { + case swap.HtlcP2WSH: + s.htlcP2WSH = htlc - return nil - } + case swap.HtlcP2TR: + s.htlcP2TR = htlc - htlcP2WSH, err := s.swapKit.getHtlc(swap.HtlcP2WSH) - if err != nil { - return err + default: + return fmt.Errorf("invalid output type") } - // Log htlc addresses for debugging. - s.swapKit.log.Infof("Htlc address (P2WSH): %v", htlcP2WSH.Address) - s.htlcP2WSH = htlcP2WSH + s.swapKit.log.Infof("Htlc address (%s): %v", htlc.OutputType, + htlc.Address) return nil } diff --git a/loopin_test.go b/loopin_test.go index e4a317b..53f2b35 100644 --- a/loopin_test.go +++ b/loopin_test.go @@ -455,21 +455,32 @@ func testLoopInResume(t *testing.T, state loopdb.SwapState, expired bool, pendSwap.Loop.Events[0].Cost = cost } - scriptVersion := GetHtlcScriptVersion(storedVersion) + var ( + htlc *swap.Htlc + err error + ) - outputType := swap.HtlcP2WSH - if scriptVersion == swap.HtlcV3 { - outputType = swap.HtlcP2TR + switch GetHtlcScriptVersion(storedVersion) { + case swap.HtlcV2: + htlc, err = swap.NewHtlcV2( + contract.CltvExpiry, contract.SenderKey, + contract.ReceiverKey, testPreimage.Hash(), + cfg.lnd.ChainParams, + ) + + case swap.HtlcV3: + htlc, err = swap.NewHtlcV3( + contract.CltvExpiry, contract.SenderKey, + contract.ReceiverKey, contract.SenderKey, + contract.ReceiverKey, testPreimage.Hash(), + cfg.lnd.ChainParams, + ) + + default: + t.Fatalf("unknown HTLC script version") } - htlc, err := swap.NewHtlc( - scriptVersion, contract.CltvExpiry, contract.SenderKey, - contract.ReceiverKey, testPreimage.Hash(), outputType, - cfg.lnd.ChainParams, - ) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) err = ctx.store.CreateLoopIn(testPreimage.Hash(), contract) if err != nil { diff --git a/loopout.go b/loopout.go index 30185e6..6b03bfd 100644 --- a/loopout.go +++ b/loopout.go @@ -201,21 +201,17 @@ func newLoopOutSwap(globalCtx context.Context, cfg *swapConfig, swapKit.lastUpdateTime = initiationTime - scriptVersion := GetHtlcScriptVersion(loopdb.CurrentProtocolVersion()) - outputType := swap.HtlcP2TR - if scriptVersion != swap.HtlcV3 { - // Default to using P2WSH for legacy htlcs. - outputType = swap.HtlcP2WSH - } - // Create the htlc. - htlc, err := swapKit.getHtlc(outputType) + htlc, err := GetHtlc( + swapKit.hash, swapKit.contract, swapKit.lnd.ChainParams, + ) if err != nil { return nil, err } // Log htlc address for debugging. - swapKit.log.Infof("Htlc address: %v", htlc.Address) + swapKit.log.Infof("Htlc address (%s): %v", htlc.OutputType, + htlc.Address) // Obtain the payment addr since we'll need it later for routing plugin // recommendation and possibly for cancel. @@ -261,15 +257,10 @@ func resumeLoopOutSwap(reqContext context.Context, cfg *swapConfig, hash, swap.TypeOut, cfg, &pend.Contract.SwapContract, ) - scriptVersion := GetHtlcScriptVersion(pend.Contract.ProtocolVersion) - outputType := swap.HtlcP2TR - if scriptVersion != swap.HtlcV3 { - // Default to using P2WSH for legacy htlcs. - outputType = swap.HtlcP2WSH - } - // Create the htlc. - htlc, err := swapKit.getHtlc(outputType) + htlc, err := GetHtlc( + swapKit.hash, swapKit.contract, swapKit.lnd.ChainParams, + ) if err != nil { return nil, err } diff --git a/swap.go b/swap.go index a084e95..764af79 100644 --- a/swap.go +++ b/swap.go @@ -4,6 +4,7 @@ import ( "context" "time" + "github.com/btcsuite/btcd/chaincfg" "github.com/lightninglabs/lndclient" "github.com/lightninglabs/loop/loopdb" "github.com/lightninglabs/loop/swap" @@ -67,14 +68,28 @@ func IsTaprootSwap(swapContract *loopdb.SwapContract) bool { return GetHtlcScriptVersion(swapContract.ProtocolVersion) == swap.HtlcV3 } -// getHtlc composes and returns the on-chain swap script. -func (s *swapKit) getHtlc(outputType swap.HtlcOutputType) (*swap.Htlc, error) { - return swap.NewHtlc( - GetHtlcScriptVersion(s.contract.ProtocolVersion), - s.contract.CltvExpiry, s.contract.SenderKey, - s.contract.ReceiverKey, s.hash, outputType, - s.swapConfig.lnd.ChainParams, - ) +// GetHtlc composes and returns the on-chain swap script. +func GetHtlc(hash lntypes.Hash, contract *loopdb.SwapContract, + chainParams *chaincfg.Params) (*swap.Htlc, error) { + + switch GetHtlcScriptVersion(contract.ProtocolVersion) { + case swap.HtlcV2: + return swap.NewHtlcV2( + contract.CltvExpiry, contract.SenderKey, + contract.ReceiverKey, hash, + chainParams, + ) + + case swap.HtlcV3: + return swap.NewHtlcV3( + contract.CltvExpiry, contract.SenderKey, + contract.ReceiverKey, contract.SenderKey, + contract.ReceiverKey, hash, + chainParams, + ) + } + + return nil, swap.ErrInvalidScriptVersion } // swapInfo constructs and returns a filled SwapInfo from diff --git a/swap/htlc.go b/swap/htlc.go index 1e174cc..8a1101a 100644 --- a/swap/htlc.go +++ b/swap/htlc.go @@ -114,16 +114,16 @@ var ( // QuoteHtlcP2WSH is a template script just used for sweep fee // estimation. - QuoteHtlcP2WSH, _ = NewHtlc( - HtlcV2, ^int32(0), dummyPubKey, dummyPubKey, quoteHash, - HtlcP2WSH, &chaincfg.MainNetParams, + QuoteHtlcP2WSH, _ = NewHtlcV2( + ^int32(0), dummyPubKey, dummyPubKey, quoteHash, + &chaincfg.MainNetParams, ) // QuoteHtlcP2TR is a template script just used for sweep fee // estimation. - QuoteHtlcP2TR, _ = NewHtlc( - HtlcV3, ^int32(0), dummyPubKey, dummyPubKey, quoteHash, - HtlcP2TR, &chaincfg.MainNetParams, + QuoteHtlcP2TR, _ = NewHtlcV3( + ^int32(0), dummyPubKey, dummyPubKey, dummyPubKey, dummyPubKey, + quoteHash, &chaincfg.MainNetParams, ) // ErrInvalidScriptVersion is returned when an unknown htlc version @@ -135,6 +135,10 @@ var ( // selected for a v2 script. ErrInvalidOutputSelected = fmt.Errorf("taproot output selected for " + "non taproot htlc") + + // ErrInvalidOutputType is returned when an unknown output type is + // associated with a certain swap htlc. + ErrInvalidOutputType = fmt.Errorf("invalid htlc output type") ) // String returns the string value of HtlcOutputType. @@ -151,38 +155,54 @@ func (h HtlcOutputType) String() string { } } -// NewHtlc returns a new instance. For v3 scripts, an internal pubkey generated -// by both participants must be provided. -func NewHtlc(version ScriptVersion, cltvExpiry int32, - senderKey, receiverKey [33]byte, hash lntypes.Hash, - outputType HtlcOutputType, chainParams *chaincfg.Params) (*Htlc, error) { +// NewHtlcV2 returns a new V2 (P2WSH) HTLC instance. +func NewHtlcV2(cltvExpiry int32, senderKey, receiverKey [33]byte, + hash lntypes.Hash, chainParams *chaincfg.Params) (*Htlc, error) { - var ( - err error - htlc HtlcScript + htlc, err := newHTLCScriptV2( + cltvExpiry, senderKey, receiverKey, hash, ) - switch version { - case HtlcV2: - htlc, err = newHTLCScriptV2( - cltvExpiry, senderKey, receiverKey, hash, - ) - - case HtlcV3: - htlc, err = newHTLCScriptV3( - cltvExpiry, senderKey, receiverKey, hash, - ) + if err != nil { + return nil, err + } - default: - return nil, ErrInvalidScriptVersion + address, pkScript, sigScript, err := htlc.lockingConditions( + HtlcP2WSH, chainParams, + ) + if err != nil { + return nil, fmt.Errorf("could not get address: %w", err) } + return &Htlc{ + HtlcScript: htlc, + Hash: hash, + Version: HtlcV2, + PkScript: pkScript, + OutputType: HtlcP2WSH, + ChainParams: chainParams, + Address: address, + SigScript: sigScript, + }, nil +} + +// NewHtlcV3 returns a new V3 HTLC (P2TR) instance. Internal pubkey generated +// by both participants must be provided. +func NewHtlcV3(cltvExpiry int32, senderInternalKey, receiverInternalKey, + senderKey, receiverKey [33]byte, hash lntypes.Hash, + chainParams *chaincfg.Params) (*Htlc, error) { + + htlc, err := newHTLCScriptV3( + cltvExpiry, senderInternalKey, receiverInternalKey, + senderKey, receiverKey, hash, + ) + if err != nil { return nil, err } address, pkScript, sigScript, err := htlc.lockingConditions( - outputType, chainParams, + HtlcP2TR, chainParams, ) if err != nil { return nil, fmt.Errorf("could not get address: %w", err) @@ -191,9 +211,9 @@ func NewHtlc(version ScriptVersion, cltvExpiry int32, return &Htlc{ HtlcScript: htlc, Hash: hash, - Version: version, + Version: HtlcV3, PkScript: pkScript, - OutputType: outputType, + OutputType: HtlcP2TR, ChainParams: chainParams, Address: address, SigScript: sigScript, @@ -481,7 +501,8 @@ type HtlcScriptV3 struct { } // newHTLCScriptV3 constructs a HtlcScipt with the HTLC V3 taproot script. -func newHTLCScriptV3(cltvExpiry int32, senderHtlcKey, receiverHtlcKey [33]byte, +func newHTLCScriptV3(cltvExpiry int32, senderInternalKey, receiverInternalKey, + senderHtlcKey, receiverHtlcKey [33]byte, swapHash lntypes.Hash) (*HtlcScriptV3, error) { senderPubKey, err := schnorr.ParsePubKey(senderHtlcKey[1:]) @@ -494,13 +515,6 @@ func newHTLCScriptV3(cltvExpiry int32, senderHtlcKey, receiverHtlcKey [33]byte, return nil, err } - aggregateKey, _, _, err := musig2.AggregateKeys( - []*btcec.PublicKey{senderPubKey, receiverPubKey}, true, - ) - if err != nil { - return nil, err - } - // Create our success path script, we'll use this separately // to generate the success path leaf. successPathScript, err := GenSuccessPathScript( @@ -527,6 +541,31 @@ func newHTLCScriptV3(cltvExpiry int32, senderHtlcKey, receiverHtlcKey [33]byte, rootHash := tree.RootNode.TapHash() + // Parse the pub keys used in the internal aggregate key. They are + // optional and may just be the same keys that are used for the script + // paths. + senderInternalPubKey, err := schnorr.ParsePubKey(senderInternalKey[1:]) + if err != nil { + return nil, err + } + + receiverInternalPubKey, err := schnorr.ParsePubKey( + receiverInternalKey[1:], + ) + if err != nil { + return nil, err + } + + // Calculate the internal aggregate key. + aggregateKey, _, _, err := musig2.AggregateKeys( + []*btcec.PublicKey{ + senderInternalPubKey, receiverInternalPubKey, + }, true, + ) + if err != nil { + return nil, err + } + // Calculate top level taproot key. taprootKey := txscript.ComputeTaprootOutputKey( aggregateKey.PreTweakedKey, rootHash[:], diff --git a/swap/htlc_test.go b/swap/htlc_test.go index 96b2f16..dd309e5 100644 --- a/swap/htlc_test.go +++ b/swap/htlc_test.go @@ -134,9 +134,9 @@ func TestHtlcV2(t *testing.T) { hash := sha256.Sum256(testPreimage[:]) // Create the htlc. - htlc, err := NewHtlc( - HtlcV2, testCltvExpiry, senderKey, receiverKey, hash, - HtlcP2WSH, &chaincfg.MainNetParams, + htlc, err := NewHtlcV2( + testCltvExpiry, senderKey, receiverKey, hash, + &chaincfg.MainNetParams, ) require.NoError(t, err) @@ -287,10 +287,9 @@ func TestHtlcV2(t *testing.T) { bogusKey := [33]byte{0xb, 0xa, 0xd} // Create the htlc with the bogus key. - htlc, err = NewHtlc( - HtlcV2, testCltvExpiry, - bogusKey, receiverKey, hash, - HtlcP2WSH, &chaincfg.MainNetParams, + htlc, err = NewHtlcV2( + testCltvExpiry, bogusKey, receiverKey, + hash, &chaincfg.MainNetParams, ) require.NoError(t, err) @@ -357,9 +356,9 @@ func TestHtlcV3(t *testing.T) { copy(receiverKey[:], receiverPubKey.SerializeCompressed()) copy(senderKey[:], senderPubKey.SerializeCompressed()) - htlc, err := NewHtlc( - HtlcV3, cltvExpiry, senderKey, receiverKey, - hashedPreimage, HtlcP2TR, &chaincfg.MainNetParams, + htlc, err := NewHtlcV3( + cltvExpiry, senderKey, receiverKey, senderKey, receiverKey, + hashedPreimage, &chaincfg.MainNetParams, ) require.NoError(t, err) @@ -540,10 +539,10 @@ func TestHtlcV3(t *testing.T) { bogusKey.SerializeCompressed(), ) - htlc, err := NewHtlc( - HtlcV3, cltvExpiry, bogusKeyBytes, - receiverKey, hashedPreimage, HtlcP2TR, - &chaincfg.MainNetParams, + htlc, err := NewHtlcV3( + cltvExpiry, senderKey, + receiverKey, bogusKeyBytes, receiverKey, + hashedPreimage, &chaincfg.MainNetParams, ) require.NoError(t, err) From 049b17ff969d4dfec2e01f2687dd4540b5a0f4b9 Mon Sep 17 00:00:00 2001 From: Andras Banki-Horvath Date: Tue, 29 Nov 2022 21:36:14 +0100 Subject: [PATCH 08/14] misc: refactor loop tests to use require where possible --- client_test.go | 30 ++++------ loopd/swapclient_server_test.go | 26 ++++----- loopin_test.go | 51 +++++------------ loopin_testcontext_test.go | 5 +- loopout_test.go | 98 ++++++++++----------------------- store_mock_test.go | 16 ++---- swap/htlc_test.go | 4 +- test/context.go | 33 +++++------ test/testutils.go | 10 ++-- testcontext_test.go | 18 ++---- 10 files changed, 99 insertions(+), 192 deletions(-) diff --git a/client_test.go b/client_test.go index 3bca073..b49e0ba 100644 --- a/client_test.go +++ b/client_test.go @@ -1,7 +1,6 @@ package loop import ( - "bytes" "context" "crypto/sha256" "errors" @@ -57,9 +56,7 @@ func TestLoopOutSuccess(t *testing.T) { // Initiate loop out. info, err := ctx.swapClient.LoopOut(context.Background(), &req) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) ctx.assertStored() ctx.assertStatus(loopdb.StateInitiated) @@ -84,9 +81,7 @@ func TestLoopOutFailOffchain(t *testing.T) { ctx := createClientTestContext(t, nil) _, err := ctx.swapClient.LoopOut(context.Background(), testRequest) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) ctx.assertStored() ctx.assertStatus(loopdb.StateInitiated) @@ -208,14 +203,10 @@ func testLoopOutResume(t *testing.T, confs uint32, expired, preimageRevealed, amt := btcutil.Amount(50000) swapPayReq, err := getInvoice(hash, amt, swapInvoiceDesc) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) prePayReq, err := getInvoice(hash, 100, prepayInvoiceDesc) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) _, senderPubKey := test.CreateKey(1) var senderKey [33]byte @@ -373,10 +364,11 @@ func testLoopOutSuccess(ctx *testContext, amt btcutil.Amount, hash lntypes.Hash, // Expect client on-chain sweep of HTLC. sweepTx := ctx.ReceiveTx() - if !bytes.Equal(sweepTx.TxIn[0].PreviousOutPoint.Hash[:], - htlcOutpoint.Hash[:]) { - ctx.T.Fatalf("client not sweeping from htlc tx") - } + require.Equal( + ctx.T, htlcOutpoint.Hash[:], + sweepTx.TxIn[0].PreviousOutPoint.Hash[:], + "client not sweeping from htlc tx", + ) var preImageIndex int switch scriptVersion { @@ -390,9 +382,7 @@ func testLoopOutSuccess(ctx *testContext, amt btcutil.Amount, hash lntypes.Hash, // Check preimage. clientPreImage := sweepTx.TxIn[0].Witness[preImageIndex] clientPreImageHash := sha256.Sum256(clientPreImage) - if clientPreImageHash != hash { - ctx.T.Fatalf("incorrect preimage") - } + require.Equal(ctx.T, hash, lntypes.Hash(clientPreImageHash)) // Since we successfully published our sweep, we expect the preimage to // have been pushed to our mock server. diff --git a/loopd/swapclient_server_test.go b/loopd/swapclient_server_test.go index 53846ba..585d87f 100644 --- a/loopd/swapclient_server_test.go +++ b/loopd/swapclient_server_test.go @@ -130,16 +130,13 @@ func TestValidateConfTarget(t *testing.T) { test.confTarget, defaultConf, ) - haveErr := err != nil - if haveErr != test.expectErr { - t.Fatalf("expected err: %v, got: %v", - test.expectErr, err) + if test.expectErr { + require.Error(t, err) + } else { + require.NoError(t, err) } - if target != test.expectedTarget { - t.Fatalf("expected: %v, got: %v", - test.expectedTarget, target) - } + require.Equal(t, test.expectedTarget, target) }) } } @@ -199,16 +196,13 @@ func TestValidateLoopInRequest(t *testing.T) { test.confTarget, external, ) - haveErr := err != nil - if haveErr != test.expectErr { - t.Fatalf("expected err: %v, got: %v", - test.expectErr, err) + if test.expectErr { + require.Error(t, err) + } else { + require.NoError(t, err) } - if conf != test.expectedTarget { - t.Fatalf("expected: %v, got: %v", - test.expectedTarget, conf) - } + require.Equal(t, test.expectedTarget, conf) }) } } diff --git a/loopin_test.go b/loopin_test.go index 53f2b35..6940b68 100644 --- a/loopin_test.go +++ b/loopin_test.go @@ -58,9 +58,8 @@ func testLoopInSuccess(t *testing.T) { context.Background(), cfg, height, req, ) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) + inSwap := initResult.swap ctx.store.assertLoopInStored() @@ -142,10 +141,7 @@ func testLoopInSuccess(t *testing.T) { ctx.assertState(loopdb.StateSuccess) ctx.store.assertLoopInState(loopdb.StateSuccess) - err = <-errChan - if err != nil { - t.Fatal(err) - } + require.NoError(t, <-errChan) } // TestLoopInTimeout tests scenarios where the server doesn't sweep the htlc @@ -215,9 +211,7 @@ func testLoopInTimeout(t *testing.T, externalValue int64) { context.Background(), cfg, height, &req, ) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) inSwap := initResult.swap ctx.store.assertLoopInStored() @@ -289,11 +283,7 @@ func testLoopInTimeout(t *testing.T, externalValue int64) { ctx.assertState(loopdb.StateFailIncorrectHtlcAmt) ctx.store.assertLoopInState(loopdb.StateFailIncorrectHtlcAmt) - err = <-errChan - if err != nil { - t.Fatal(err) - } - + require.NoError(t, <-errChan) return } @@ -308,9 +298,11 @@ func testLoopInTimeout(t *testing.T, externalValue int64) { // Expect a signing request for the htlc tx output value. signReq := <-ctx.lnd.SignOutputRawChannel - if signReq.SignDescriptors[0].Output.Value != htlcTx.TxOut[0].Value { - t.Fatal("invalid signing amount") - } + require.Equal( + t, htlcTx.TxOut[0].Value, + signReq.SignDescriptors[0].Output.Value, + "invalid signing amount", + ) // Expect timeout tx to be published. timeoutTx := <-ctx.lnd.TxPublishChannel @@ -341,10 +333,7 @@ func testLoopInTimeout(t *testing.T, externalValue int64) { state := ctx.store.assertLoopInState(loopdb.StateFailTimeout) require.Equal(t, cost, state.Cost) - err = <-errChan - if err != nil { - t.Fatal(err) - } + require.NoError(t, <-errChan) } // TestLoopInResume tests resuming swaps in various states. @@ -483,17 +472,10 @@ func testLoopInResume(t *testing.T, state loopdb.SwapState, expired bool, require.NoError(t, err) err = ctx.store.CreateLoopIn(testPreimage.Hash(), contract) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) - inSwap, err := resumeLoopInSwap( - context.Background(), cfg, - pendSwap, - ) - if err != nil { - t.Fatal(err) - } + inSwap, err := resumeLoopInSwap(context.Background(), cfg, pendSwap) + require.NoError(t, err) var height int32 if expired { @@ -512,10 +494,7 @@ func testLoopInResume(t *testing.T, state loopdb.SwapState, expired bool, }() defer func() { - err = <-errChan - if err != nil { - t.Fatal(err) - } + require.NoError(t, <-errChan) select { case <-ctx.lnd.SendPaymentChannel: diff --git a/loopin_testcontext_test.go b/loopin_testcontext_test.go index 077622e..ca6b024 100644 --- a/loopin_testcontext_test.go +++ b/loopin_testcontext_test.go @@ -63,10 +63,7 @@ func newLoopInTestContext(t *testing.T) *loopInTestContext { func (c *loopInTestContext) assertState(expectedState loopdb.SwapState) { state := <-c.statusChan - if state.State != expectedState { - c.t.Fatalf("expected state %v but got %v", expectedState, - state.State) - } + require.Equal(c.t, expectedState, state.State) } // assertSubscribeInvoice asserts that the client subscribes to invoice updates diff --git a/loopout_test.go b/loopout_test.go index ea41d10..67566e8 100644 --- a/loopout_test.go +++ b/loopout_test.go @@ -4,7 +4,6 @@ import ( "context" "errors" "math" - "reflect" "testing" "time" @@ -66,7 +65,7 @@ func testLoopOutPaymentParameters(t *testing.T) { blockEpochChan := make(chan interface{}) statusChan := make(chan SwapInfo) - const maxParts = 5 + const maxParts = uint32(5) chanSet := loopdb.ChannelSet{2, 3} @@ -77,9 +76,7 @@ func testLoopOutPaymentParameters(t *testing.T) { initResult, err := newLoopOutSwap( context.Background(), cfg, height, &req, ) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) swap := initResult.swap // Execute the swap in its own goroutine. @@ -105,9 +102,7 @@ func testLoopOutPaymentParameters(t *testing.T) { store.assertLoopOutStored() state := <-statusChan - if state.State != loopdb.StateInitiated { - t.Fatal("unexpected state") - } + require.Equal(t, loopdb.StateInitiated, state.State) // Check that the SwapInfo contains the outgoing chan set require.Equal(t, chanSet, state.OutgoingChanSet) @@ -130,18 +125,12 @@ func testLoopOutPaymentParameters(t *testing.T) { } // Assert that it is sent as a multi-part payment. - if swapPayment.MaxParts != maxParts { - t.Fatalf("Expected %v parts, but got %v", - maxParts, swapPayment.MaxParts) - } + require.Equal(t, maxParts, swapPayment.MaxParts) // Verify the outgoing channel set restriction. - if !reflect.DeepEqual( - []uint64(req.OutgoingChanSet), swapPayment.OutgoingChanIds, - ) { - - t.Fatalf("Unexpected outgoing channel set") - } + require.Equal( + t, []uint64(req.OutgoingChanSet), swapPayment.OutgoingChanIds, + ) // Swap is expected to register for confirmation of the htlc. Assert // this to prevent a blocked channel in the mock. @@ -152,10 +141,7 @@ func testLoopOutPaymentParameters(t *testing.T) { cancel() // Expect the swap to signal that it was cancelled. - err = <-errChan - if err != context.Canceled { - t.Fatal(err) - } + require.Equal(t, context.Canceled, <-errChan) } // TestLateHtlcPublish tests that the client is not revealing the preimage if @@ -198,9 +184,7 @@ func testLateHtlcPublish(t *testing.T) { initResult, err := newLoopOutSwap( context.Background(), cfg, height, testRequest, ) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) swap := initResult.swap sweeper := &sweep.Sweeper{Lnd: &lnd.LndServices} @@ -225,11 +209,8 @@ func testLateHtlcPublish(t *testing.T) { }() store.assertLoopOutStored() - - state := <-statusChan - if state.State != loopdb.StateInitiated { - t.Fatal("unexpected state") - } + status := <-statusChan + require.Equal(t, loopdb.StateInitiated, status.State) signalSwapPaymentResult := ctx.AssertPaid(swapInvoiceDesc) signalPrepaymentResult := ctx.AssertPaid(prepayInvoiceDesc) @@ -249,15 +230,9 @@ func testLateHtlcPublish(t *testing.T) { store.assertStoreFinished(loopdb.StateFailTimeout) - status := <-statusChan - if status.State != loopdb.StateFailTimeout { - t.Fatal("unexpected state") - } - - err = <-errChan - if err != nil { - t.Fatal(err) - } + status = <-statusChan + require.Equal(t, loopdb.StateFailTimeout, status.State) + require.NoError(t, <-errChan) } // TestCustomSweepConfTarget ensures we are able to sweep a Loop Out HTLC with a @@ -304,9 +279,7 @@ func testCustomSweepConfTarget(t *testing.T) { initResult, err := newLoopOutSwap( context.Background(), cfg, ctx.Lnd.Height, &testReq, ) - if err != nil { - t.Fatal(err) - } + require.NoError(t, err) swap := initResult.swap // Set up the required dependencies to execute the swap. @@ -339,9 +312,7 @@ func testCustomSweepConfTarget(t *testing.T) { // The swap should be found in its initial state. cfg.store.(*storeMock).assertLoopOutStored() state := <-statusChan - if state.State != loopdb.StateInitiated { - t.Fatal("unexpected state") - } + require.Equal(t, loopdb.StateInitiated, state.State) // We'll then pay both the swap and prepay invoice, which should trigger // the server to publish the on-chain HTLC. @@ -381,10 +352,7 @@ func testCustomSweepConfTarget(t *testing.T) { cfg.store.(*storeMock).assertLoopOutState(loopdb.StatePreimageRevealed) status := <-statusChan - if status.State != loopdb.StatePreimageRevealed { - t.Fatalf("expected state %v, got %v", - loopdb.StatePreimageRevealed, status.State) - } + require.Equal(t, loopdb.StatePreimageRevealed, status.State) // When using taproot htlcs the flow is different as we do reveal the // preimage before sweeping in order for the server to trust us with @@ -410,10 +378,10 @@ func testCustomSweepConfTarget(t *testing.T) { t.Helper() sweepTx := ctx.ReceiveTx() - if sweepTx.TxIn[0].PreviousOutPoint.Hash != htlcTx.TxHash() { - t.Fatalf("expected sweep tx to spend %v, got %v", - htlcTx.TxHash(), sweepTx.TxIn[0].PreviousOutPoint) - } + require.Equal( + t, htlcTx.TxHash(), + sweepTx.TxIn[0].PreviousOutPoint.Hash, + ) // The fee used for the sweep transaction is an estimate based // on the maximum witness size, so we should expect to see a @@ -427,16 +395,14 @@ func testCustomSweepConfTarget(t *testing.T) { feeRate, err := ctx.Lnd.WalletKit.EstimateFeeRate( context.Background(), expConfTarget, ) - if err != nil { - t.Fatalf("unable to retrieve fee estimate: %v", err) - } + require.NoError(t, err, "unable to retrieve fee estimate") + minFee := feeRate.FeeForWeight(weight) - maxFee := btcutil.Amount(float64(minFee) * 1.1) + // Just an estimate that works to sanity check fee upper bound. + maxFee := btcutil.Amount(float64(minFee) * 1.5) - if fee < minFee && fee > maxFee { - t.Fatalf("expected sweep tx to have fee between %v-%v, "+ - "got %v", minFee, maxFee, fee) - } + require.GreaterOrEqual(t, fee, minFee) + require.LessOrEqual(t, fee, maxFee) return sweepTx } @@ -479,14 +445,8 @@ func testCustomSweepConfTarget(t *testing.T) { cfg.store.(*storeMock).assertLoopOutState(loopdb.StateSuccess) status = <-statusChan - if status.State != loopdb.StateSuccess { - t.Fatalf("expected state %v, got %v", loopdb.StateSuccess, - status.State) - } - - if err := <-errChan; err != nil { - t.Fatal(err) - } + require.Equal(t, loopdb.StateSuccess, status.State) + require.NoError(t, <-errChan) } // TestPreimagePush tests or logic that decides whether to push our preimage to diff --git a/store_mock_test.go b/store_mock_test.go index a366fcd..4ec9daa 100644 --- a/store_mock_test.go +++ b/store_mock_test.go @@ -8,6 +8,7 @@ import ( "github.com/lightninglabs/loop/loopdb" "github.com/lightninglabs/loop/test" "github.com/lightningnetwork/lnd/lntypes" + "github.com/stretchr/testify/require" ) // storeMock implements a mock client swap store. @@ -239,9 +240,7 @@ func (s *storeMock) assertLoopInState( s.t.Helper() state := <-s.loopInUpdateChan - if state.State != expectedState { - s.t.Fatalf("expected state %v, got %v", expectedState, state) - } + require.Equal(s.t, expectedState, state.State) return state } @@ -252,9 +251,8 @@ func (s *storeMock) assertStorePreimageReveal() { select { case state := <-s.loopOutUpdateChan: - if state.State != loopdb.StatePreimageRevealed { - s.t.Fatalf("unexpected state") - } + require.Equal(s.t, loopdb.StatePreimageRevealed, state.State) + case <-time.After(test.Timeout): s.t.Fatalf("expected swap to be marked as preimage revealed") } @@ -265,10 +263,8 @@ func (s *storeMock) assertStoreFinished(expectedResult loopdb.SwapState) { select { case state := <-s.loopOutUpdateChan: - if state.State != expectedResult { - s.t.Fatalf("expected result %v, but got %v", - expectedResult, state) - } + require.Equal(s.t, expectedResult, state.State) + case <-time.After(test.Timeout): s.t.Fatalf("expected swap to be finished") } diff --git a/swap/htlc_test.go b/swap/htlc_test.go index dd309e5..09f9264 100644 --- a/swap/htlc_test.go +++ b/swap/htlc_test.go @@ -54,9 +54,7 @@ func assertEngineExecution(t *testing.T, valid bool, done := false for !done { dis, err := vm.DisasmPC() - if err != nil { - t.Fatalf("stepping (%v)\n", err) - } + require.NoError(t, err, "stepping") debugBuf.WriteString(fmt.Sprintf("stepping %v\n", dis)) done, err = vm.Step() diff --git a/test/context.go b/test/context.go index ca83322..e8c517c 100644 --- a/test/context.go +++ b/test/context.go @@ -86,9 +86,11 @@ func (ctx *Context) AssertRegisterSpendNtfn(script []byte) { select { case spendIntent := <-ctx.Lnd.RegisterSpendChannel: - if !bytes.Equal(spendIntent.PkScript, script) { - ctx.T.Fatalf("server not listening for published htlc script") - } + require.Equal( + ctx.T, script, spendIntent.PkScript, + "server not listening for published htlc script", + ) + case <-time.After(Timeout): DumpGoroutines() ctx.T.Fatalf("spend not subscribed to") @@ -163,10 +165,11 @@ func (ctx *Context) AssertPaid( payReq := ctx.DecodeInvoice(swapPayment.Invoice) - if _, ok := ctx.PaidInvoices[*payReq.Description]; ok { - ctx.T.Fatalf("duplicate invoice paid: %v", - *payReq.Description) - } + _, ok := ctx.PaidInvoices[*payReq.Description] + require.False( + ctx.T, ok, + "duplicate invoice paid: %v", *payReq.Description, + ) done := func(result error) { if result != nil { @@ -195,9 +198,10 @@ func (ctx *Context) AssertSettled( select { case preimage := <-ctx.Lnd.SettleInvoiceChannel: hash := sha256.Sum256(preimage[:]) - if expectedHash != hash { - ctx.T.Fatalf("server claims with wrong preimage") - } + require.Equal( + ctx.T, expectedHash, lntypes.Hash(hash), + "server claims with wrong preimage", + ) return preimage case <-time.After(Timeout): @@ -232,9 +236,8 @@ func (ctx *Context) DecodeInvoice(request string) *zpay32.Invoice { ctx.T.Helper() payReq, err := ctx.Lnd.DecodeInvoice(request) - if err != nil { - ctx.T.Fatal(err) - } + require.NoError(ctx.T, err) + return payReq } @@ -256,7 +259,5 @@ func (ctx *Context) GetOutputIndex(tx *wire.MsgTx, // waits for the notification to be processed by selecting on a // dedicated test channel. func (ctx *Context) NotifyServerHeight(height int32) { - if err := ctx.Lnd.NotifyHeight(height); err != nil { - ctx.T.Fatal(err) - } + require.NoError(ctx.T, ctx.Lnd.NotifyHeight(height)) } diff --git a/test/testutils.go b/test/testutils.go index c00ea96..6aa312e 100644 --- a/test/testutils.go +++ b/test/testutils.go @@ -14,6 +14,7 @@ import ( "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/zpay32" + "github.com/stretchr/testify/require" ) var ( @@ -29,11 +30,10 @@ var ( // GetDestAddr deterministically generates a sweep address for testing. func GetDestAddr(t *testing.T, nr byte) btcutil.Address { - destAddr, err := btcutil.NewAddressScriptHash([]byte{nr}, - &chaincfg.MainNetParams) - if err != nil { - t.Fatal(err) - } + destAddr, err := btcutil.NewAddressScriptHash( + []byte{nr}, &chaincfg.MainNetParams, + ) + require.NoError(t, err) return destAddr } diff --git a/testcontext_test.go b/testcontext_test.go index afc6a90..a221a28 100644 --- a/testcontext_test.go +++ b/testcontext_test.go @@ -140,9 +140,8 @@ func (ctx *testContext) finish() { ctx.stop() select { case err := <-ctx.runErr: - if err != nil { - ctx.T.Fatal(err) - } + require.NoError(ctx.T, err) + case <-time.After(test.Timeout): ctx.T.Fatal("client not stopping") } @@ -156,19 +155,12 @@ func (ctx *testContext) finish() { func (ctx *testContext) notifyHeight(height int32) { ctx.T.Helper() - if err := ctx.Lnd.NotifyHeight(height); err != nil { - ctx.T.Fatal(err) - } + require.NoError(ctx.T, ctx.Lnd.NotifyHeight(height)) } func (ctx *testContext) assertIsDone() { - if err := ctx.Lnd.IsDone(); err != nil { - ctx.T.Fatal(err) - } - - if err := ctx.store.isDone(); err != nil { - ctx.T.Fatal(err) - } + require.NoError(ctx.T, ctx.Lnd.IsDone()) + require.NoError(ctx.T, ctx.store.isDone()) select { case <-ctx.statusChan: From fb9e83b853270ef977b864a87827432d38aa1777 Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 7 Dec 2022 10:33:26 -0500 Subject: [PATCH 09/14] make miniums and maxiums more apparent when running loop out -h --- cmd/loop/loopout.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/loop/loopout.go b/cmd/loop/loopout.go index fd945ea..923d860 100644 --- a/cmd/loop/loopout.go +++ b/cmd/loop/loopout.go @@ -41,7 +41,7 @@ var loopOutCommand = cli.Command{ }, cli.Uint64Flag{ Name: "amt", - Usage: "the amount in satoshis to loop out", + Usage: "the amount in satoshis to loop out (default: 0, min: 250k, max: 60m)", }, cli.Uint64Flag{ Name: "htlc_confs", From a4bb589155993559fbb203aef46b5559571c6ca8 Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 7 Dec 2022 10:41:53 -0500 Subject: [PATCH 10/14] quick fix --- cmd/loop/loopout.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/loop/loopout.go b/cmd/loop/loopout.go index 923d860..dd47ba4 100644 --- a/cmd/loop/loopout.go +++ b/cmd/loop/loopout.go @@ -41,7 +41,7 @@ var loopOutCommand = cli.Command{ }, cli.Uint64Flag{ Name: "amt", - Usage: "the amount in satoshis to loop out (default: 0, min: 250k, max: 60m)", + Usage: "the amount in satoshis to loop out (min: 250k, max: 60m)", }, cli.Uint64Flag{ Name: "htlc_confs", From f0fa8068a3236de8effa13e725cf3a36c2777e3c Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 7 Dec 2022 10:59:40 -0500 Subject: [PATCH 11/14] update help --- cmd/loop/loopout.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/loop/loopout.go b/cmd/loop/loopout.go index dd47ba4..6a5e363 100644 --- a/cmd/loop/loopout.go +++ b/cmd/loop/loopout.go @@ -41,7 +41,7 @@ var loopOutCommand = cli.Command{ }, cli.Uint64Flag{ Name: "amt", - Usage: "the amount in satoshis to loop out (min: 250k, max: 60m)", + Usage: "run the command loop terms to get the minimum & maximum amount on the server. " }, cli.Uint64Flag{ Name: "htlc_confs", From d6442f9a2ff77f2f489849d34e4c6bc3cc793c84 Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 7 Dec 2022 11:17:49 -0500 Subject: [PATCH 12/14] fix travis build fail --- cmd/loop/loopout.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/loop/loopout.go b/cmd/loop/loopout.go index 6a5e363..841f067 100644 --- a/cmd/loop/loopout.go +++ b/cmd/loop/loopout.go @@ -41,7 +41,7 @@ var loopOutCommand = cli.Command{ }, cli.Uint64Flag{ Name: "amt", - Usage: "run the command loop terms to get the minimum & maximum amount on the server. " + Usage: "run the command loop terms to get the minimum & maximum amount on the server. ", }, cli.Uint64Flag{ Name: "htlc_confs", From 155ccd5ce6f72ec9085dce4742df988602f7cdc9 Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 7 Dec 2022 12:16:31 -0500 Subject: [PATCH 13/14] rephrase --- cmd/loop/loopout.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/loop/loopout.go b/cmd/loop/loopout.go index 841f067..006084b 100644 --- a/cmd/loop/loopout.go +++ b/cmd/loop/loopout.go @@ -41,7 +41,7 @@ var loopOutCommand = cli.Command{ }, cli.Uint64Flag{ Name: "amt", - Usage: "run the command loop terms to get the minimum & maximum amount on the server. ", + Usage: "the amount in satoshis to loop out, consult the loop terms command to get the minimum & maximum loop amounts supported by the server.", }, cli.Uint64Flag{ Name: "htlc_confs", From ea7574c7db12c0744308de434b4874bfaafdb4de Mon Sep 17 00:00:00 2001 From: andrew Date: Wed, 7 Dec 2022 12:16:31 -0500 Subject: [PATCH 14/14] cmd: mention loop terms in loop amt description --- cmd/loop/loopout.go | 1 + 1 file changed, 1 insertion(+) diff --git a/cmd/loop/loopout.go b/cmd/loop/loopout.go index fd945ea..a227615 100644 --- a/cmd/loop/loopout.go +++ b/cmd/loop/loopout.go @@ -42,6 +42,7 @@ var loopOutCommand = cli.Command{ cli.Uint64Flag{ Name: "amt", Usage: "the amount in satoshis to loop out", + Usage: "the amount in satoshis to loop out, consult the loop terms command to get the minimum & maximum loop amounts supported by the server.", }, cli.Uint64Flag{ Name: "htlc_confs",