rpc: add SignMessage and VerifyMessage interface

This commit allows users to sign messages with their node's private key
with the SignMessage interface. The signatures are zbase32 encoded for
human readability/paste-ability.  Others users can verify that a message
was signed by another node in their channel database with the
VerifyMessage interface.
This commit is contained in:
Philip Hayes 2017-04-19 19:28:10 -07:00 committed by Olaoluwa Osuntokun
parent 2486097554
commit 2249215260
7 changed files with 694 additions and 333 deletions

@ -2351,6 +2351,65 @@ func testNodeAnnouncement(net *networkHarness, t *harnessTest) {
}
}
func testNodeSignVerify(net *networkHarness, t *harnessTest) {
ctxb := context.Background()
// bob should be able to verify alice's signature
aliceMsg := []byte("alice msg")
// alice: sign "alice msg"
sigReq := &lnrpc.SignMessageRequest{Msg: aliceMsg}
sigResp, err := net.Alice.SignMessage(ctxb, sigReq)
if err != nil {
t.Fatalf("SignMessage rpc call failed: %v", err)
}
aliceSig := sigResp.Signature
// bob: verify alice's signature -> should succeed
verifyReq := &lnrpc.VerifyMessageRequest{
Msg: aliceMsg, Signature: aliceSig}
verifyResp, err := net.Bob.VerifyMessage(ctxb, verifyReq)
if err != nil {
t.Fatalf("VerifyMessage failed: %v", err)
}
if !verifyResp.Valid {
t.Fatalf("alice's signature didn't validate")
}
// carol is a new node that is unconnected to alice or bob
carol, err := net.NewNode(nil)
if err != nil {
t.Fatalf("unable to create new node: %v", err)
}
carolMsg := []byte("carol msg")
// carol: sign "carol msg"
sigReq = &lnrpc.SignMessageRequest{Msg: carolMsg}
sigResp, err = carol.SignMessage(ctxb, sigReq)
if err != nil {
t.Fatalf("SignMessage rpc call failed: %v", err)
}
carolSig := sigResp.Signature
// bob: verify carol's signature -> should fail
verifyReq = &lnrpc.VerifyMessageRequest{
Msg: carolMsg, Signature: carolSig}
verifyResp, err = net.Bob.VerifyMessage(ctxb, verifyReq)
if err != nil {
t.Fatalf("VerifyMessage failed: %v", err)
}
if verifyResp.Valid {
t.Fatalf("carol's signature should not be valid")
}
}
type testCase struct {
name string
test func(net *networkHarness, t *harnessTest)
@ -2420,6 +2479,10 @@ var testsCases = []*testCase{
name: "revoked uncooperative close retribution",
test: testRevokedCloseRetribution,
},
{
name: "node sign verify",
test: testNodeSignVerify,
},
}
// TestLightningNetworkDaemon performs a series of integration tests amongst a

@ -37,6 +37,12 @@ description):
* Returns a new address, the following address types are supported:
pay-to-public-key-hash (p2pkh), pay-to-witness-key-hash (p2wkh), and
nested-pay-to-witness-key-hash (np2wkh).
* SignMessage
* Signs a message with the node's identity key and returns a
zbase32 encoded signature.
* VerifyMessage
* Verifies a signature signed by another node on a message. The other node
must be an active node in the channel database.
* ConnectPeer
* Connects to a peer identified by a public key and host.
* DisconnectPeer

@ -23,6 +23,10 @@ It has these top-level messages:
NewAddressRequest
NewWitnessAddressRequest
NewAddressResponse
SignMessageRequest
SignMessageResponse
VerifyMessageRequest
VerifyMessageResponse
ConnectPeerRequest
ConnectPeerResponse
DisconnectPeerRequest
@ -476,6 +480,78 @@ func (m *NewAddressResponse) GetAddress() string {
return ""
}
type SignMessageRequest struct {
Msg []byte `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
}
func (m *SignMessageRequest) Reset() { *m = SignMessageRequest{} }
func (m *SignMessageRequest) String() string { return proto.CompactTextString(m) }
func (*SignMessageRequest) ProtoMessage() {}
func (*SignMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (m *SignMessageRequest) GetMsg() []byte {
if m != nil {
return m.Msg
}
return nil
}
type SignMessageResponse struct {
Signature string `protobuf:"bytes,1,opt,name=signature" json:"signature,omitempty"`
}
func (m *SignMessageResponse) Reset() { *m = SignMessageResponse{} }
func (m *SignMessageResponse) String() string { return proto.CompactTextString(m) }
func (*SignMessageResponse) ProtoMessage() {}
func (*SignMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (m *SignMessageResponse) GetSignature() string {
if m != nil {
return m.Signature
}
return ""
}
type VerifyMessageRequest struct {
Msg []byte `protobuf:"bytes,1,opt,name=msg,proto3" json:"msg,omitempty"`
Signature string `protobuf:"bytes,2,opt,name=signature" json:"signature,omitempty"`
}
func (m *VerifyMessageRequest) Reset() { *m = VerifyMessageRequest{} }
func (m *VerifyMessageRequest) String() string { return proto.CompactTextString(m) }
func (*VerifyMessageRequest) ProtoMessage() {}
func (*VerifyMessageRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (m *VerifyMessageRequest) GetMsg() []byte {
if m != nil {
return m.Msg
}
return nil
}
func (m *VerifyMessageRequest) GetSignature() string {
if m != nil {
return m.Signature
}
return ""
}
type VerifyMessageResponse struct {
Valid bool `protobuf:"varint,1,opt,name=valid" json:"valid,omitempty"`
}
func (m *VerifyMessageResponse) Reset() { *m = VerifyMessageResponse{} }
func (m *VerifyMessageResponse) String() string { return proto.CompactTextString(m) }
func (*VerifyMessageResponse) ProtoMessage() {}
func (*VerifyMessageResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (m *VerifyMessageResponse) GetValid() bool {
if m != nil {
return m.Valid
}
return false
}
type ConnectPeerRequest struct {
Addr *LightningAddress `protobuf:"bytes,1,opt,name=addr" json:"addr,omitempty"`
Perm bool `protobuf:"varint,2,opt,name=perm" json:"perm,omitempty"`
@ -484,7 +560,7 @@ type ConnectPeerRequest struct {
func (m *ConnectPeerRequest) Reset() { *m = ConnectPeerRequest{} }
func (m *ConnectPeerRequest) String() string { return proto.CompactTextString(m) }
func (*ConnectPeerRequest) ProtoMessage() {}
func (*ConnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{14} }
func (*ConnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (m *ConnectPeerRequest) GetAddr() *LightningAddress {
if m != nil {
@ -507,7 +583,7 @@ type ConnectPeerResponse struct {
func (m *ConnectPeerResponse) Reset() { *m = ConnectPeerResponse{} }
func (m *ConnectPeerResponse) String() string { return proto.CompactTextString(m) }
func (*ConnectPeerResponse) ProtoMessage() {}
func (*ConnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{15} }
func (*ConnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (m *ConnectPeerResponse) GetPeerId() int32 {
if m != nil {
@ -523,7 +599,7 @@ type DisconnectPeerRequest struct {
func (m *DisconnectPeerRequest) Reset() { *m = DisconnectPeerRequest{} }
func (m *DisconnectPeerRequest) String() string { return proto.CompactTextString(m) }
func (*DisconnectPeerRequest) ProtoMessage() {}
func (*DisconnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{16} }
func (*DisconnectPeerRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (m *DisconnectPeerRequest) GetPubKey() string {
if m != nil {
@ -538,7 +614,7 @@ type DisconnectPeerResponse struct {
func (m *DisconnectPeerResponse) Reset() { *m = DisconnectPeerResponse{} }
func (m *DisconnectPeerResponse) String() string { return proto.CompactTextString(m) }
func (*DisconnectPeerResponse) ProtoMessage() {}
func (*DisconnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{17} }
func (*DisconnectPeerResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
type HTLC struct {
Incoming bool `protobuf:"varint,1,opt,name=incoming" json:"incoming,omitempty"`
@ -551,7 +627,7 @@ type HTLC struct {
func (m *HTLC) Reset() { *m = HTLC{} }
func (m *HTLC) String() string { return proto.CompactTextString(m) }
func (*HTLC) ProtoMessage() {}
func (*HTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{18} }
func (*HTLC) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (m *HTLC) GetIncoming() bool {
if m != nil {
@ -606,7 +682,7 @@ type ActiveChannel struct {
func (m *ActiveChannel) Reset() { *m = ActiveChannel{} }
func (m *ActiveChannel) String() string { return proto.CompactTextString(m) }
func (*ActiveChannel) ProtoMessage() {}
func (*ActiveChannel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{19} }
func (*ActiveChannel) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
func (m *ActiveChannel) GetActive() bool {
if m != nil {
@ -698,7 +774,7 @@ type ListChannelsRequest struct {
func (m *ListChannelsRequest) Reset() { *m = ListChannelsRequest{} }
func (m *ListChannelsRequest) String() string { return proto.CompactTextString(m) }
func (*ListChannelsRequest) ProtoMessage() {}
func (*ListChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{20} }
func (*ListChannelsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
type ListChannelsResponse struct {
Channels []*ActiveChannel `protobuf:"bytes,11,rep,name=channels" json:"channels,omitempty"`
@ -707,7 +783,7 @@ type ListChannelsResponse struct {
func (m *ListChannelsResponse) Reset() { *m = ListChannelsResponse{} }
func (m *ListChannelsResponse) String() string { return proto.CompactTextString(m) }
func (*ListChannelsResponse) ProtoMessage() {}
func (*ListChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{21} }
func (*ListChannelsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
func (m *ListChannelsResponse) GetChannels() []*ActiveChannel {
if m != nil {
@ -731,7 +807,7 @@ type Peer struct {
func (m *Peer) Reset() { *m = Peer{} }
func (m *Peer) String() string { return proto.CompactTextString(m) }
func (*Peer) ProtoMessage() {}
func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{22} }
func (*Peer) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
func (m *Peer) GetPubKey() string {
if m != nil {
@ -802,7 +878,7 @@ type ListPeersRequest struct {
func (m *ListPeersRequest) Reset() { *m = ListPeersRequest{} }
func (m *ListPeersRequest) String() string { return proto.CompactTextString(m) }
func (*ListPeersRequest) ProtoMessage() {}
func (*ListPeersRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{23} }
func (*ListPeersRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
type ListPeersResponse struct {
Peers []*Peer `protobuf:"bytes,1,rep,name=peers" json:"peers,omitempty"`
@ -811,7 +887,7 @@ type ListPeersResponse struct {
func (m *ListPeersResponse) Reset() { *m = ListPeersResponse{} }
func (m *ListPeersResponse) String() string { return proto.CompactTextString(m) }
func (*ListPeersResponse) ProtoMessage() {}
func (*ListPeersResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{24} }
func (*ListPeersResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
func (m *ListPeersResponse) GetPeers() []*Peer {
if m != nil {
@ -826,7 +902,7 @@ type GetInfoRequest struct {
func (m *GetInfoRequest) Reset() { *m = GetInfoRequest{} }
func (m *GetInfoRequest) String() string { return proto.CompactTextString(m) }
func (*GetInfoRequest) ProtoMessage() {}
func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{25} }
func (*GetInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
type GetInfoResponse struct {
IdentityPubkey string `protobuf:"bytes,1,opt,name=identity_pubkey" json:"identity_pubkey,omitempty"`
@ -844,7 +920,7 @@ type GetInfoResponse struct {
func (m *GetInfoResponse) Reset() { *m = GetInfoResponse{} }
func (m *GetInfoResponse) String() string { return proto.CompactTextString(m) }
func (*GetInfoResponse) ProtoMessage() {}
func (*GetInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{26} }
func (*GetInfoResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
func (m *GetInfoResponse) GetIdentityPubkey() string {
if m != nil {
@ -925,7 +1001,7 @@ type ConfirmationUpdate struct {
func (m *ConfirmationUpdate) Reset() { *m = ConfirmationUpdate{} }
func (m *ConfirmationUpdate) String() string { return proto.CompactTextString(m) }
func (*ConfirmationUpdate) ProtoMessage() {}
func (*ConfirmationUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{27} }
func (*ConfirmationUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
func (m *ConfirmationUpdate) GetBlockSha() []byte {
if m != nil {
@ -955,7 +1031,7 @@ type ChannelOpenUpdate struct {
func (m *ChannelOpenUpdate) Reset() { *m = ChannelOpenUpdate{} }
func (m *ChannelOpenUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelOpenUpdate) ProtoMessage() {}
func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{28} }
func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
func (m *ChannelOpenUpdate) GetChannelPoint() *ChannelPoint {
if m != nil {
@ -972,7 +1048,7 @@ type ChannelCloseUpdate struct {
func (m *ChannelCloseUpdate) Reset() { *m = ChannelCloseUpdate{} }
func (m *ChannelCloseUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelCloseUpdate) ProtoMessage() {}
func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{29} }
func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
func (m *ChannelCloseUpdate) GetClosingTxid() []byte {
if m != nil {
@ -997,7 +1073,7 @@ type CloseChannelRequest struct {
func (m *CloseChannelRequest) Reset() { *m = CloseChannelRequest{} }
func (m *CloseChannelRequest) String() string { return proto.CompactTextString(m) }
func (*CloseChannelRequest) ProtoMessage() {}
func (*CloseChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{30} }
func (*CloseChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
func (m *CloseChannelRequest) GetChannelPoint() *ChannelPoint {
if m != nil {
@ -1031,7 +1107,7 @@ type CloseStatusUpdate struct {
func (m *CloseStatusUpdate) Reset() { *m = CloseStatusUpdate{} }
func (m *CloseStatusUpdate) String() string { return proto.CompactTextString(m) }
func (*CloseStatusUpdate) ProtoMessage() {}
func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{31} }
func (*CloseStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
type isCloseStatusUpdate_Update interface {
isCloseStatusUpdate_Update()
@ -1180,7 +1256,7 @@ type PendingUpdate struct {
func (m *PendingUpdate) Reset() { *m = PendingUpdate{} }
func (m *PendingUpdate) String() string { return proto.CompactTextString(m) }
func (*PendingUpdate) ProtoMessage() {}
func (*PendingUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{32} }
func (*PendingUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
func (m *PendingUpdate) GetTxid() []byte {
if m != nil {
@ -1208,7 +1284,7 @@ type OpenChannelRequest struct {
func (m *OpenChannelRequest) Reset() { *m = OpenChannelRequest{} }
func (m *OpenChannelRequest) String() string { return proto.CompactTextString(m) }
func (*OpenChannelRequest) ProtoMessage() {}
func (*OpenChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{33} }
func (*OpenChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
func (m *OpenChannelRequest) GetTargetPeerId() int32 {
if m != nil {
@ -1263,7 +1339,7 @@ type OpenStatusUpdate struct {
func (m *OpenStatusUpdate) Reset() { *m = OpenStatusUpdate{} }
func (m *OpenStatusUpdate) String() string { return proto.CompactTextString(m) }
func (*OpenStatusUpdate) ProtoMessage() {}
func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{34} }
func (*OpenStatusUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
type isOpenStatusUpdate_Update interface {
isOpenStatusUpdate_Update()
@ -1410,7 +1486,7 @@ type PendingChannelRequest struct {
func (m *PendingChannelRequest) Reset() { *m = PendingChannelRequest{} }
func (m *PendingChannelRequest) String() string { return proto.CompactTextString(m) }
func (*PendingChannelRequest) ProtoMessage() {}
func (*PendingChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{35} }
func (*PendingChannelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
type PendingChannelResponse struct {
TotalLimboBalance int64 `protobuf:"varint,1,opt,name=total_limbo_balance" json:"total_limbo_balance,omitempty"`
@ -1422,7 +1498,7 @@ type PendingChannelResponse struct {
func (m *PendingChannelResponse) Reset() { *m = PendingChannelResponse{} }
func (m *PendingChannelResponse) String() string { return proto.CompactTextString(m) }
func (*PendingChannelResponse) ProtoMessage() {}
func (*PendingChannelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{36} }
func (*PendingChannelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
func (m *PendingChannelResponse) GetTotalLimboBalance() int64 {
if m != nil {
@ -1464,7 +1540,7 @@ func (m *PendingChannelResponse_PendingChannel) Reset() { *m = PendingCh
func (m *PendingChannelResponse_PendingChannel) String() string { return proto.CompactTextString(m) }
func (*PendingChannelResponse_PendingChannel) ProtoMessage() {}
func (*PendingChannelResponse_PendingChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{36, 0}
return fileDescriptor0, []int{40, 0}
}
func (m *PendingChannelResponse_PendingChannel) GetRemoteNodePub() string {
@ -1514,7 +1590,7 @@ func (m *PendingChannelResponse_PendingOpenChannel) Reset() {
func (m *PendingChannelResponse_PendingOpenChannel) String() string { return proto.CompactTextString(m) }
func (*PendingChannelResponse_PendingOpenChannel) ProtoMessage() {}
func (*PendingChannelResponse_PendingOpenChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{36, 1}
return fileDescriptor0, []int{40, 1}
}
func (m *PendingChannelResponse_PendingOpenChannel) GetChannel() *PendingChannelResponse_PendingChannel {
@ -1547,7 +1623,7 @@ func (m *PendingChannelResponse_ClosedChannel) Reset() { *m = PendingCha
func (m *PendingChannelResponse_ClosedChannel) String() string { return proto.CompactTextString(m) }
func (*PendingChannelResponse_ClosedChannel) ProtoMessage() {}
func (*PendingChannelResponse_ClosedChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{36, 2}
return fileDescriptor0, []int{40, 2}
}
func (m *PendingChannelResponse_ClosedChannel) GetChannel() *PendingChannelResponse_PendingChannel {
@ -1578,7 +1654,7 @@ func (m *PendingChannelResponse_ForceClosedChannel) Reset() {
func (m *PendingChannelResponse_ForceClosedChannel) String() string { return proto.CompactTextString(m) }
func (*PendingChannelResponse_ForceClosedChannel) ProtoMessage() {}
func (*PendingChannelResponse_ForceClosedChannel) Descriptor() ([]byte, []int) {
return fileDescriptor0, []int{36, 3}
return fileDescriptor0, []int{40, 3}
}
func (m *PendingChannelResponse_ForceClosedChannel) GetChannel() *PendingChannelResponse_PendingChannel {
@ -1623,7 +1699,7 @@ type WalletBalanceRequest struct {
func (m *WalletBalanceRequest) Reset() { *m = WalletBalanceRequest{} }
func (m *WalletBalanceRequest) String() string { return proto.CompactTextString(m) }
func (*WalletBalanceRequest) ProtoMessage() {}
func (*WalletBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{37} }
func (*WalletBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
func (m *WalletBalanceRequest) GetWitnessOnly() bool {
if m != nil {
@ -1639,7 +1715,7 @@ type WalletBalanceResponse struct {
func (m *WalletBalanceResponse) Reset() { *m = WalletBalanceResponse{} }
func (m *WalletBalanceResponse) String() string { return proto.CompactTextString(m) }
func (*WalletBalanceResponse) ProtoMessage() {}
func (*WalletBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{38} }
func (*WalletBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
func (m *WalletBalanceResponse) GetBalance() float64 {
if m != nil {
@ -1654,7 +1730,7 @@ type ChannelBalanceRequest struct {
func (m *ChannelBalanceRequest) Reset() { *m = ChannelBalanceRequest{} }
func (m *ChannelBalanceRequest) String() string { return proto.CompactTextString(m) }
func (*ChannelBalanceRequest) ProtoMessage() {}
func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{39} }
func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }
type ChannelBalanceResponse struct {
Balance int64 `protobuf:"varint,1,opt,name=balance" json:"balance,omitempty"`
@ -1663,7 +1739,7 @@ type ChannelBalanceResponse struct {
func (m *ChannelBalanceResponse) Reset() { *m = ChannelBalanceResponse{} }
func (m *ChannelBalanceResponse) String() string { return proto.CompactTextString(m) }
func (*ChannelBalanceResponse) ProtoMessage() {}
func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{40} }
func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
func (m *ChannelBalanceResponse) GetBalance() int64 {
if m != nil {
@ -1680,7 +1756,7 @@ type QueryRoutesRequest struct {
func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} }
func (m *QueryRoutesRequest) String() string { return proto.CompactTextString(m) }
func (*QueryRoutesRequest) ProtoMessage() {}
func (*QueryRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{41} }
func (*QueryRoutesRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
func (m *QueryRoutesRequest) GetPubKey() string {
if m != nil {
@ -1703,7 +1779,7 @@ type QueryRoutesResponse struct {
func (m *QueryRoutesResponse) Reset() { *m = QueryRoutesResponse{} }
func (m *QueryRoutesResponse) String() string { return proto.CompactTextString(m) }
func (*QueryRoutesResponse) ProtoMessage() {}
func (*QueryRoutesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{42} }
func (*QueryRoutesResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }
func (m *QueryRoutesResponse) GetRoutes() []*Route {
if m != nil {
@ -1722,7 +1798,7 @@ type Hop struct {
func (m *Hop) Reset() { *m = Hop{} }
func (m *Hop) String() string { return proto.CompactTextString(m) }
func (*Hop) ProtoMessage() {}
func (*Hop) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{43} }
func (*Hop) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
func (m *Hop) GetChanId() uint64 {
if m != nil {
@ -1762,7 +1838,7 @@ type Route struct {
func (m *Route) Reset() { *m = Route{} }
func (m *Route) String() string { return proto.CompactTextString(m) }
func (*Route) ProtoMessage() {}
func (*Route) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{44} }
func (*Route) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }
func (m *Route) GetTotalTimeLock() uint32 {
if m != nil {
@ -1799,7 +1875,7 @@ type NodeInfoRequest struct {
func (m *NodeInfoRequest) Reset() { *m = NodeInfoRequest{} }
func (m *NodeInfoRequest) String() string { return proto.CompactTextString(m) }
func (*NodeInfoRequest) ProtoMessage() {}
func (*NodeInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{45} }
func (*NodeInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }
func (m *NodeInfoRequest) GetPubKey() string {
if m != nil {
@ -1817,7 +1893,7 @@ type NodeInfo struct {
func (m *NodeInfo) Reset() { *m = NodeInfo{} }
func (m *NodeInfo) String() string { return proto.CompactTextString(m) }
func (*NodeInfo) ProtoMessage() {}
func (*NodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{46} }
func (*NodeInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
func (m *NodeInfo) GetNode() *LightningNode {
if m != nil {
@ -1850,7 +1926,7 @@ type LightningNode struct {
func (m *LightningNode) Reset() { *m = LightningNode{} }
func (m *LightningNode) String() string { return proto.CompactTextString(m) }
func (*LightningNode) ProtoMessage() {}
func (*LightningNode) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{47} }
func (*LightningNode) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} }
func (m *LightningNode) GetLastUpdate() uint32 {
if m != nil {
@ -1888,7 +1964,7 @@ type NodeAddress struct {
func (m *NodeAddress) Reset() { *m = NodeAddress{} }
func (m *NodeAddress) String() string { return proto.CompactTextString(m) }
func (*NodeAddress) ProtoMessage() {}
func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{48} }
func (*NodeAddress) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }
func (m *NodeAddress) GetNetwork() string {
if m != nil {
@ -1914,7 +1990,7 @@ type RoutingPolicy struct {
func (m *RoutingPolicy) Reset() { *m = RoutingPolicy{} }
func (m *RoutingPolicy) String() string { return proto.CompactTextString(m) }
func (*RoutingPolicy) ProtoMessage() {}
func (*RoutingPolicy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{49} }
func (*RoutingPolicy) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }
func (m *RoutingPolicy) GetTimeLockDelta() uint32 {
if m != nil {
@ -1958,7 +2034,7 @@ type ChannelEdge struct {
func (m *ChannelEdge) Reset() { *m = ChannelEdge{} }
func (m *ChannelEdge) String() string { return proto.CompactTextString(m) }
func (*ChannelEdge) ProtoMessage() {}
func (*ChannelEdge) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{50} }
func (*ChannelEdge) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} }
func (m *ChannelEdge) GetChannelId() uint64 {
if m != nil {
@ -2022,7 +2098,7 @@ type ChannelGraphRequest struct {
func (m *ChannelGraphRequest) Reset() { *m = ChannelGraphRequest{} }
func (m *ChannelGraphRequest) String() string { return proto.CompactTextString(m) }
func (*ChannelGraphRequest) ProtoMessage() {}
func (*ChannelGraphRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{51} }
func (*ChannelGraphRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} }
type ChannelGraph struct {
Nodes []*LightningNode `protobuf:"bytes,1,rep,name=nodes" json:"nodes,omitempty"`
@ -2032,7 +2108,7 @@ type ChannelGraph struct {
func (m *ChannelGraph) Reset() { *m = ChannelGraph{} }
func (m *ChannelGraph) String() string { return proto.CompactTextString(m) }
func (*ChannelGraph) ProtoMessage() {}
func (*ChannelGraph) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{52} }
func (*ChannelGraph) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} }
func (m *ChannelGraph) GetNodes() []*LightningNode {
if m != nil {
@ -2055,7 +2131,7 @@ type ChanInfoRequest struct {
func (m *ChanInfoRequest) Reset() { *m = ChanInfoRequest{} }
func (m *ChanInfoRequest) String() string { return proto.CompactTextString(m) }
func (*ChanInfoRequest) ProtoMessage() {}
func (*ChanInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{53} }
func (*ChanInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} }
func (m *ChanInfoRequest) GetChanId() uint64 {
if m != nil {
@ -2070,7 +2146,7 @@ type NetworkInfoRequest struct {
func (m *NetworkInfoRequest) Reset() { *m = NetworkInfoRequest{} }
func (m *NetworkInfoRequest) String() string { return proto.CompactTextString(m) }
func (*NetworkInfoRequest) ProtoMessage() {}
func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{54} }
func (*NetworkInfoRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} }
type NetworkInfo struct {
GraphDiameter uint32 `protobuf:"varint,1,opt,name=graph_diameter" json:"graph_diameter,omitempty"`
@ -2087,7 +2163,7 @@ type NetworkInfo struct {
func (m *NetworkInfo) Reset() { *m = NetworkInfo{} }
func (m *NetworkInfo) String() string { return proto.CompactTextString(m) }
func (*NetworkInfo) ProtoMessage() {}
func (*NetworkInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{55} }
func (*NetworkInfo) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
func (m *NetworkInfo) GetGraphDiameter() uint32 {
if m != nil {
@ -2158,7 +2234,7 @@ type StopRequest struct {
func (m *StopRequest) Reset() { *m = StopRequest{} }
func (m *StopRequest) String() string { return proto.CompactTextString(m) }
func (*StopRequest) ProtoMessage() {}
func (*StopRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} }
func (*StopRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} }
type StopResponse struct {
}
@ -2166,7 +2242,7 @@ type StopResponse struct {
func (m *StopResponse) Reset() { *m = StopResponse{} }
func (m *StopResponse) String() string { return proto.CompactTextString(m) }
func (*StopResponse) ProtoMessage() {}
func (*StopResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} }
func (*StopResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} }
type GraphTopologySubscription struct {
}
@ -2174,7 +2250,7 @@ type GraphTopologySubscription struct {
func (m *GraphTopologySubscription) Reset() { *m = GraphTopologySubscription{} }
func (m *GraphTopologySubscription) String() string { return proto.CompactTextString(m) }
func (*GraphTopologySubscription) ProtoMessage() {}
func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} }
func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} }
type GraphTopologyUpdate struct {
NodeUpdates []*NodeUpdate `protobuf:"bytes,1,rep,name=node_updates,json=nodeUpdates" json:"node_updates,omitempty"`
@ -2185,7 +2261,7 @@ type GraphTopologyUpdate struct {
func (m *GraphTopologyUpdate) Reset() { *m = GraphTopologyUpdate{} }
func (m *GraphTopologyUpdate) String() string { return proto.CompactTextString(m) }
func (*GraphTopologyUpdate) ProtoMessage() {}
func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} }
func (m *GraphTopologyUpdate) GetNodeUpdates() []*NodeUpdate {
if m != nil {
@ -2218,7 +2294,7 @@ type NodeUpdate struct {
func (m *NodeUpdate) Reset() { *m = NodeUpdate{} }
func (m *NodeUpdate) String() string { return proto.CompactTextString(m) }
func (*NodeUpdate) ProtoMessage() {}
func (*NodeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} }
func (*NodeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} }
func (m *NodeUpdate) GetAddresses() []string {
if m != nil {
@ -2260,7 +2336,7 @@ type ChannelEdgeUpdate struct {
func (m *ChannelEdgeUpdate) Reset() { *m = ChannelEdgeUpdate{} }
func (m *ChannelEdgeUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelEdgeUpdate) ProtoMessage() {}
func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} }
func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{65} }
func (m *ChannelEdgeUpdate) GetChanId() uint64 {
if m != nil {
@ -2314,7 +2390,7 @@ type ClosedChannelUpdate struct {
func (m *ClosedChannelUpdate) Reset() { *m = ClosedChannelUpdate{} }
func (m *ClosedChannelUpdate) String() string { return proto.CompactTextString(m) }
func (*ClosedChannelUpdate) ProtoMessage() {}
func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} }
func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{66} }
func (m *ClosedChannelUpdate) GetChanId() uint64 {
if m != nil {
@ -2351,7 +2427,7 @@ type SetAliasRequest struct {
func (m *SetAliasRequest) Reset() { *m = SetAliasRequest{} }
func (m *SetAliasRequest) String() string { return proto.CompactTextString(m) }
func (*SetAliasRequest) ProtoMessage() {}
func (*SetAliasRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} }
func (*SetAliasRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{67} }
func (m *SetAliasRequest) GetNewAlias() string {
if m != nil {
@ -2366,7 +2442,7 @@ type SetAliasResponse struct {
func (m *SetAliasResponse) Reset() { *m = SetAliasResponse{} }
func (m *SetAliasResponse) String() string { return proto.CompactTextString(m) }
func (*SetAliasResponse) ProtoMessage() {}
func (*SetAliasResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} }
func (*SetAliasResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} }
type Invoice struct {
Memo string `protobuf:"bytes,1,opt,name=memo" json:"memo,omitempty"`
@ -2383,7 +2459,7 @@ type Invoice struct {
func (m *Invoice) Reset() { *m = Invoice{} }
func (m *Invoice) String() string { return proto.CompactTextString(m) }
func (*Invoice) ProtoMessage() {}
func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{65} }
func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} }
func (m *Invoice) GetMemo() string {
if m != nil {
@ -2456,7 +2532,7 @@ type AddInvoiceResponse struct {
func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} }
func (m *AddInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*AddInvoiceResponse) ProtoMessage() {}
func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{66} }
func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} }
func (m *AddInvoiceResponse) GetRHash() []byte {
if m != nil {
@ -2480,7 +2556,7 @@ type PaymentHash struct {
func (m *PaymentHash) Reset() { *m = PaymentHash{} }
func (m *PaymentHash) String() string { return proto.CompactTextString(m) }
func (*PaymentHash) ProtoMessage() {}
func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{67} }
func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{71} }
func (m *PaymentHash) GetRHashStr() string {
if m != nil {
@ -2503,7 +2579,7 @@ type ListInvoiceRequest struct {
func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} }
func (m *ListInvoiceRequest) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceRequest) ProtoMessage() {}
func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} }
func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{72} }
func (m *ListInvoiceRequest) GetPendingOnly() bool {
if m != nil {
@ -2519,7 +2595,7 @@ type ListInvoiceResponse struct {
func (m *ListInvoiceResponse) Reset() { *m = ListInvoiceResponse{} }
func (m *ListInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceResponse) ProtoMessage() {}
func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} }
func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{73} }
func (m *ListInvoiceResponse) GetInvoices() []*Invoice {
if m != nil {
@ -2534,7 +2610,7 @@ type InvoiceSubscription struct {
func (m *InvoiceSubscription) Reset() { *m = InvoiceSubscription{} }
func (m *InvoiceSubscription) String() string { return proto.CompactTextString(m) }
func (*InvoiceSubscription) ProtoMessage() {}
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} }
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{74} }
type Payment struct {
PaymentHash string `protobuf:"bytes,1,opt,name=payment_hash" json:"payment_hash,omitempty"`
@ -2547,7 +2623,7 @@ type Payment struct {
func (m *Payment) Reset() { *m = Payment{} }
func (m *Payment) String() string { return proto.CompactTextString(m) }
func (*Payment) ProtoMessage() {}
func (*Payment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{71} }
func (*Payment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{75} }
func (m *Payment) GetPaymentHash() string {
if m != nil {
@ -2590,7 +2666,7 @@ type ListPaymentsRequest struct {
func (m *ListPaymentsRequest) Reset() { *m = ListPaymentsRequest{} }
func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsRequest) ProtoMessage() {}
func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{72} }
func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} }
type ListPaymentsResponse struct {
Payments []*Payment `protobuf:"bytes,1,rep,name=payments" json:"payments,omitempty"`
@ -2599,7 +2675,7 @@ type ListPaymentsResponse struct {
func (m *ListPaymentsResponse) Reset() { *m = ListPaymentsResponse{} }
func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsResponse) ProtoMessage() {}
func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{73} }
func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} }
func (m *ListPaymentsResponse) GetPayments() []*Payment {
if m != nil {
@ -2614,7 +2690,7 @@ type DeleteAllPaymentsRequest struct {
func (m *DeleteAllPaymentsRequest) Reset() { *m = DeleteAllPaymentsRequest{} }
func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsRequest) ProtoMessage() {}
func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{74} }
func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{78} }
type DeleteAllPaymentsResponse struct {
}
@ -2622,7 +2698,7 @@ type DeleteAllPaymentsResponse struct {
func (m *DeleteAllPaymentsResponse) Reset() { *m = DeleteAllPaymentsResponse{} }
func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsResponse) ProtoMessage() {}
func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{75} }
func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{79} }
type DebugLevelRequest struct {
Show bool `protobuf:"varint,1,opt,name=show" json:"show,omitempty"`
@ -2632,7 +2708,7 @@ type DebugLevelRequest struct {
func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} }
func (m *DebugLevelRequest) String() string { return proto.CompactTextString(m) }
func (*DebugLevelRequest) ProtoMessage() {}
func (*DebugLevelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} }
func (*DebugLevelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{80} }
func (m *DebugLevelRequest) GetShow() bool {
if m != nil {
@ -2655,7 +2731,7 @@ type DebugLevelResponse struct {
func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} }
func (m *DebugLevelResponse) String() string { return proto.CompactTextString(m) }
func (*DebugLevelResponse) ProtoMessage() {}
func (*DebugLevelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} }
func (*DebugLevelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{81} }
func (m *DebugLevelResponse) GetSubSystems() string {
if m != nil {
@ -2671,7 +2747,7 @@ type PayReqString struct {
func (m *PayReqString) Reset() { *m = PayReqString{} }
func (m *PayReqString) String() string { return proto.CompactTextString(m) }
func (*PayReqString) ProtoMessage() {}
func (*PayReqString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{78} }
func (*PayReqString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{82} }
func (m *PayReqString) GetPayReq() string {
if m != nil {
@ -2689,7 +2765,7 @@ type PayReq struct {
func (m *PayReq) Reset() { *m = PayReq{} }
func (m *PayReq) String() string { return proto.CompactTextString(m) }
func (*PayReq) ProtoMessage() {}
func (*PayReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{79} }
func (*PayReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{83} }
func (m *PayReq) GetDestination() string {
if m != nil {
@ -2727,6 +2803,10 @@ func init() {
proto.RegisterType((*NewAddressRequest)(nil), "lnrpc.NewAddressRequest")
proto.RegisterType((*NewWitnessAddressRequest)(nil), "lnrpc.NewWitnessAddressRequest")
proto.RegisterType((*NewAddressResponse)(nil), "lnrpc.NewAddressResponse")
proto.RegisterType((*SignMessageRequest)(nil), "lnrpc.SignMessageRequest")
proto.RegisterType((*SignMessageResponse)(nil), "lnrpc.SignMessageResponse")
proto.RegisterType((*VerifyMessageRequest)(nil), "lnrpc.VerifyMessageRequest")
proto.RegisterType((*VerifyMessageResponse)(nil), "lnrpc.VerifyMessageResponse")
proto.RegisterType((*ConnectPeerRequest)(nil), "lnrpc.ConnectPeerRequest")
proto.RegisterType((*ConnectPeerResponse)(nil), "lnrpc.ConnectPeerResponse")
proto.RegisterType((*DisconnectPeerRequest)(nil), "lnrpc.DisconnectPeerRequest")
@ -2819,6 +2899,8 @@ type LightningClient interface {
SendMany(ctx context.Context, in *SendManyRequest, opts ...grpc.CallOption) (*SendManyResponse, error)
NewAddress(ctx context.Context, in *NewAddressRequest, opts ...grpc.CallOption) (*NewAddressResponse, error)
NewWitnessAddress(ctx context.Context, in *NewWitnessAddressRequest, opts ...grpc.CallOption) (*NewAddressResponse, error)
SignMessage(ctx context.Context, in *SignMessageRequest, opts ...grpc.CallOption) (*SignMessageResponse, error)
VerifyMessage(ctx context.Context, in *VerifyMessageRequest, opts ...grpc.CallOption) (*VerifyMessageResponse, error)
ConnectPeer(ctx context.Context, in *ConnectPeerRequest, opts ...grpc.CallOption) (*ConnectPeerResponse, error)
DisconnectPeer(ctx context.Context, in *DisconnectPeerRequest, opts ...grpc.CallOption) (*DisconnectPeerResponse, error)
ListPeers(ctx context.Context, in *ListPeersRequest, opts ...grpc.CallOption) (*ListPeersResponse, error)
@ -2952,6 +3034,24 @@ func (c *lightningClient) NewWitnessAddress(ctx context.Context, in *NewWitnessA
return out, nil
}
func (c *lightningClient) SignMessage(ctx context.Context, in *SignMessageRequest, opts ...grpc.CallOption) (*SignMessageResponse, error) {
out := new(SignMessageResponse)
err := grpc.Invoke(ctx, "/lnrpc.Lightning/SignMessage", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *lightningClient) VerifyMessage(ctx context.Context, in *VerifyMessageRequest, opts ...grpc.CallOption) (*VerifyMessageResponse, error) {
out := new(VerifyMessageResponse)
err := grpc.Invoke(ctx, "/lnrpc.Lightning/VerifyMessage", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *lightningClient) ConnectPeer(ctx context.Context, in *ConnectPeerRequest, opts ...grpc.CallOption) (*ConnectPeerResponse, error) {
out := new(ConnectPeerResponse)
err := grpc.Invoke(ctx, "/lnrpc.Lightning/ConnectPeer", in, out, c.cc, opts...)
@ -3320,6 +3420,8 @@ type LightningServer interface {
SendMany(context.Context, *SendManyRequest) (*SendManyResponse, error)
NewAddress(context.Context, *NewAddressRequest) (*NewAddressResponse, error)
NewWitnessAddress(context.Context, *NewWitnessAddressRequest) (*NewAddressResponse, error)
SignMessage(context.Context, *SignMessageRequest) (*SignMessageResponse, error)
VerifyMessage(context.Context, *VerifyMessageRequest) (*VerifyMessageResponse, error)
ConnectPeer(context.Context, *ConnectPeerRequest) (*ConnectPeerResponse, error)
DisconnectPeer(context.Context, *DisconnectPeerRequest) (*DisconnectPeerResponse, error)
ListPeers(context.Context, *ListPeersRequest) (*ListPeersResponse, error)
@ -3501,6 +3603,42 @@ func _Lightning_NewWitnessAddress_Handler(srv interface{}, ctx context.Context,
return interceptor(ctx, in, info, handler)
}
func _Lightning_SignMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(SignMessageRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LightningServer).SignMessage(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/lnrpc.Lightning/SignMessage",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LightningServer).SignMessage(ctx, req.(*SignMessageRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Lightning_VerifyMessage_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(VerifyMessageRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LightningServer).VerifyMessage(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/lnrpc.Lightning/VerifyMessage",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LightningServer).VerifyMessage(ctx, req.(*VerifyMessageRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Lightning_ConnectPeer_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ConnectPeerRequest)
if err := dec(in); err != nil {
@ -4039,6 +4177,14 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
MethodName: "NewWitnessAddress",
Handler: _Lightning_NewWitnessAddress_Handler,
},
{
MethodName: "SignMessage",
Handler: _Lightning_SignMessage_Handler,
},
{
MethodName: "VerifyMessage",
Handler: _Lightning_VerifyMessage_Handler,
},
{
MethodName: "ConnectPeer",
Handler: _Lightning_ConnectPeer_Handler,
@ -4167,266 +4313,273 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{
// 4172 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0xcd, 0x6f, 0x1c, 0xc9,
0x75, 0x57, 0x0f, 0x87, 0x14, 0xe7, 0xcd, 0x0c, 0x3f, 0x8a, 0x12, 0x35, 0x1a, 0x69, 0x65, 0x6d,
0x59, 0xb0, 0x18, 0xd9, 0x20, 0xb5, 0x4c, 0xb2, 0x91, 0x57, 0x49, 0x16, 0x5c, 0x49, 0x2b, 0x2e,
0x4c, 0x6b, 0xe9, 0xa6, 0x76, 0x95, 0xd8, 0x08, 0x26, 0xcd, 0xe9, 0xe2, 0xb0, 0xad, 0x9e, 0xee,
0xde, 0xee, 0x1a, 0x4a, 0x63, 0x81, 0x48, 0xb0, 0xf1, 0x31, 0x81, 0x11, 0xf8, 0x6e, 0x24, 0xc8,
0x39, 0x97, 0x1c, 0x93, 0xff, 0x20, 0x40, 0x80, 0x00, 0x3e, 0xe5, 0x1e, 0xe4, 0x1e, 0x04, 0xb9,
0xe5, 0x10, 0xbc, 0xfa, 0xea, 0xaa, 0xee, 0xa6, 0x56, 0x41, 0x82, 0x9c, 0x38, 0xf5, 0xab, 0xd7,
0xaf, 0xaa, 0x5e, 0xbd, 0xaf, 0x7a, 0x55, 0x84, 0x4e, 0x9e, 0x8d, 0xb7, 0xb3, 0x3c, 0xe5, 0x29,
0x59, 0x8c, 0x93, 0x3c, 0x1b, 0x0f, 0x6f, 0x4e, 0xd2, 0x74, 0x12, 0xb3, 0x9d, 0x20, 0x8b, 0x76,
0x82, 0x24, 0x49, 0x79, 0xc0, 0xa3, 0x34, 0x29, 0x24, 0x11, 0xfd, 0x77, 0x0f, 0xba, 0xcf, 0xf3,
0x20, 0x29, 0x82, 0x31, 0xc2, 0x64, 0x00, 0x97, 0xf9, 0xeb, 0xd1, 0x69, 0x50, 0x9c, 0x0e, 0xbc,
0xdb, 0xde, 0x56, 0xc7, 0xd7, 0x4d, 0xb2, 0x09, 0x4b, 0xc1, 0x34, 0x9d, 0x25, 0x7c, 0xd0, 0xba,
0xed, 0x6d, 0x2d, 0xf8, 0xaa, 0x45, 0xbe, 0x07, 0xeb, 0xc9, 0x6c, 0x3a, 0x1a, 0xa7, 0xc9, 0x49,
0x94, 0x4f, 0x25, 0xf3, 0xc1, 0xc2, 0x6d, 0x6f, 0x6b, 0xd1, 0xaf, 0x77, 0x90, 0x5b, 0x00, 0xc7,
0x71, 0x3a, 0x7e, 0x29, 0x87, 0x68, 0x8b, 0x21, 0x2c, 0x84, 0x50, 0xe8, 0xa9, 0x16, 0x8b, 0x26,
0xa7, 0x7c, 0xb0, 0x28, 0x18, 0x39, 0x18, 0xf2, 0xe0, 0xd1, 0x94, 0x8d, 0x0a, 0x1e, 0x4c, 0xb3,
0xc1, 0x92, 0x98, 0x8d, 0x85, 0x88, 0xfe, 0x94, 0x07, 0xf1, 0xe8, 0x84, 0xb1, 0x62, 0x70, 0x59,
0xf5, 0x1b, 0x84, 0x0e, 0x60, 0xf3, 0x29, 0xe3, 0xd6, 0xaa, 0x0b, 0x9f, 0x7d, 0x35, 0x63, 0x05,
0xa7, 0x07, 0x40, 0x2c, 0xf8, 0x31, 0xe3, 0x41, 0x14, 0x17, 0xe4, 0x43, 0xe8, 0x71, 0x8b, 0x78,
0xe0, 0xdd, 0x5e, 0xd8, 0xea, 0xee, 0x92, 0x6d, 0x21, 0xdf, 0x6d, 0xeb, 0x03, 0xdf, 0xa1, 0xa3,
0xff, 0xec, 0x41, 0xf7, 0x88, 0x25, 0xa1, 0xe2, 0x4e, 0x08, 0xb4, 0x43, 0x56, 0x70, 0x21, 0xd8,
0x9e, 0x2f, 0x7e, 0x93, 0x6f, 0x41, 0x17, 0xff, 0x8e, 0x0a, 0x9e, 0x47, 0xc9, 0x44, 0x88, 0xb6,
0xe3, 0x03, 0x42, 0x47, 0x02, 0x21, 0x6b, 0xb0, 0x10, 0x4c, 0xb9, 0x10, 0xe8, 0x82, 0x8f, 0x3f,
0xc9, 0xfb, 0xd0, 0xcb, 0x82, 0xf9, 0x94, 0x25, 0xbc, 0x14, 0x62, 0xcf, 0xef, 0x2a, 0x6c, 0x1f,
0xa5, 0xb8, 0x0d, 0x1b, 0x36, 0x89, 0xe6, 0xbe, 0x28, 0xb8, 0xaf, 0x5b, 0x94, 0x6a, 0x90, 0xbb,
0xb0, 0xaa, 0xe9, 0x73, 0x39, 0x59, 0x21, 0xd6, 0x8e, 0xbf, 0xa2, 0x60, 0x2d, 0xa0, 0x04, 0x7a,
0x72, 0x45, 0x45, 0x96, 0x26, 0x05, 0x23, 0xf7, 0x60, 0x4d, 0x7f, 0x98, 0xe5, 0x2c, 0x9a, 0x06,
0x13, 0xa6, 0x96, 0x57, 0xc3, 0xc9, 0x2e, 0xf4, 0xcd, 0x20, 0xe9, 0x8c, 0x33, 0xb1, 0xd8, 0xee,
0x6e, 0x4f, 0xc9, 0xd1, 0x47, 0xcc, 0x77, 0x49, 0xe8, 0xd7, 0x1e, 0xf4, 0x1e, 0x9d, 0x06, 0x49,
0xc2, 0xe2, 0xc3, 0x34, 0x4a, 0x38, 0xea, 0xc7, 0xc9, 0x2c, 0x09, 0xa3, 0x64, 0x32, 0xe2, 0xaf,
0xa3, 0x50, 0x0d, 0xe6, 0x60, 0x38, 0x29, 0xbb, 0x8d, 0xab, 0x57, 0x82, 0xad, 0xe1, 0xc8, 0x2f,
0x9d, 0xf1, 0x6c, 0xc6, 0x47, 0x51, 0x12, 0xb2, 0xd7, 0x42, 0xce, 0x7d, 0xdf, 0xc1, 0xe8, 0xef,
0xc3, 0xda, 0x01, 0x2a, 0x5e, 0x12, 0x25, 0x93, 0xbd, 0x30, 0xcc, 0x59, 0x51, 0xa0, 0x35, 0x64,
0xb3, 0xe3, 0x97, 0x6c, 0xae, 0xcc, 0x44, 0xb5, 0x70, 0x8f, 0x4f, 0xd3, 0x82, 0xab, 0xf1, 0xc4,
0x6f, 0xfa, 0x57, 0x1e, 0xac, 0xa2, 0xd4, 0x7e, 0x18, 0x24, 0x73, 0xad, 0x0b, 0x07, 0xd0, 0x43,
0x56, 0xcf, 0xd3, 0x3d, 0x69, 0x53, 0x52, 0xa7, 0xb6, 0x94, 0x2c, 0x2a, 0xd4, 0xdb, 0x36, 0xe9,
0x93, 0x84, 0xe7, 0x73, 0xdf, 0xf9, 0x7a, 0xf8, 0x31, 0xac, 0xd7, 0x48, 0x50, 0x73, 0xca, 0xf9,
0xe1, 0x4f, 0x72, 0x05, 0x16, 0xcf, 0x82, 0x78, 0xc6, 0x94, 0x05, 0xcb, 0xc6, 0x47, 0xad, 0x07,
0x1e, 0xfd, 0x0e, 0xac, 0x95, 0x63, 0xaa, 0xbd, 0x25, 0xd0, 0x36, 0x22, 0xee, 0xf8, 0xe2, 0x37,
0x8a, 0x02, 0xe9, 0x1e, 0xa5, 0x91, 0x31, 0x1a, 0xa4, 0x0b, 0xc2, 0x30, 0xd7, 0x74, 0xf8, 0xfb,
0x22, 0x67, 0x41, 0xef, 0xc2, 0xba, 0xf5, 0xfd, 0x5b, 0x06, 0xfa, 0x95, 0x07, 0xeb, 0xcf, 0xd8,
0x2b, 0x25, 0x6e, 0x3d, 0xd4, 0x03, 0x68, 0xf3, 0x79, 0x26, 0x55, 0x6c, 0x65, 0xf7, 0x8e, 0x92,
0x56, 0x8d, 0x6e, 0x5b, 0x35, 0x9f, 0xcf, 0x33, 0xe6, 0x8b, 0x2f, 0xe8, 0xe7, 0xd0, 0xb5, 0x40,
0x72, 0x0d, 0x36, 0x5e, 0x7c, 0xf6, 0xfc, 0xd9, 0x93, 0xa3, 0xa3, 0xd1, 0xe1, 0x17, 0x9f, 0xfc,
0xe0, 0xc9, 0x1f, 0x8e, 0xf6, 0xf7, 0x8e, 0xf6, 0xd7, 0x2e, 0x91, 0x4d, 0x20, 0xcf, 0x9e, 0x1c,
0x3d, 0x7f, 0xf2, 0xd8, 0xc1, 0x3d, 0xb2, 0x0a, 0x5d, 0x1b, 0x68, 0xd1, 0x21, 0x0c, 0x9e, 0xb1,
0x57, 0x2f, 0x22, 0x9e, 0xb0, 0xa2, 0x70, 0x87, 0xa7, 0xdb, 0x40, 0xec, 0x39, 0xa9, 0x65, 0x0e,
0xe0, 0x72, 0x20, 0x21, 0xed, 0x5a, 0x55, 0x93, 0x7e, 0x01, 0xe4, 0x51, 0x9a, 0x24, 0x6c, 0xcc,
0x0f, 0x19, 0xcb, 0xf5, 0x62, 0xbf, 0x6b, 0xc9, 0xb5, 0xbb, 0x7b, 0x4d, 0x2d, 0xb6, 0xaa, 0x89,
0x4a, 0xe0, 0x04, 0xda, 0x19, 0xcb, 0xa7, 0x42, 0xdc, 0xcb, 0xbe, 0xf8, 0x4d, 0x77, 0x60, 0xc3,
0x61, 0x5b, 0xce, 0x23, 0x63, 0x2c, 0x1f, 0x29, 0x89, 0x2f, 0xfa, 0xba, 0x49, 0x3f, 0x80, 0xab,
0x8f, 0xa3, 0x62, 0x5c, 0x9f, 0x0a, 0x7e, 0x32, 0x3b, 0x1e, 0x95, 0xea, 0xa4, 0x9b, 0xe8, 0x4b,
0xab, 0x9f, 0xc8, 0x61, 0xe8, 0xdf, 0x79, 0xd0, 0xde, 0x7f, 0x7e, 0xf0, 0x88, 0x0c, 0x61, 0x39,
0x4a, 0xc6, 0xe9, 0x14, 0x3d, 0x90, 0x27, 0xa6, 0x67, 0xda, 0x17, 0x06, 0x95, 0x9b, 0xd0, 0x11,
0x8e, 0x0b, 0xdd, 0xbe, 0xb0, 0xc9, 0x9e, 0x5f, 0x02, 0x18, 0x72, 0xd8, 0xeb, 0x2c, 0xca, 0x45,
0x4c, 0xd1, 0x91, 0xa2, 0x2d, 0x2c, 0xb7, 0xde, 0x81, 0xee, 0x20, 0x67, 0x67, 0xe9, 0x58, 0x82,
0x21, 0x8b, 0x83, 0xb9, 0xf0, 0x84, 0x7d, 0xbf, 0x86, 0xd3, 0x7f, 0x5b, 0x80, 0xfe, 0xde, 0x98,
0x47, 0x67, 0x4c, 0x79, 0x1d, 0x31, 0x43, 0x01, 0xa8, 0xb9, 0xab, 0x16, 0xb9, 0x03, 0xfd, 0x9c,
0x4d, 0x53, 0xce, 0x46, 0xca, 0x0f, 0x48, 0x8b, 0x77, 0x41, 0xa4, 0x1a, 0x4b, 0x46, 0xa3, 0x0c,
0xfd, 0x97, 0x58, 0x4b, 0xc7, 0x77, 0x41, 0x14, 0x2f, 0x02, 0xb8, 0x23, 0xb8, 0x8a, 0xb6, 0xaf,
0x9b, 0x28, 0xbb, 0x71, 0x90, 0x05, 0xe3, 0x88, 0xcb, 0x39, 0x2f, 0xf8, 0xa6, 0x8d, 0xbc, 0xe3,
0x74, 0x1c, 0xc4, 0xa3, 0xe3, 0x20, 0x0e, 0x92, 0x31, 0x53, 0x91, 0xd0, 0x05, 0xc9, 0x77, 0x60,
0x45, 0x4d, 0x49, 0x93, 0xc9, 0x80, 0x58, 0x41, 0x51, 0xa6, 0xb3, 0xa4, 0x60, 0x9c, 0xc7, 0x2c,
0x34, 0xa4, 0xcb, 0x82, 0xb4, 0xde, 0x41, 0xee, 0xc3, 0x86, 0x0c, 0xa8, 0x45, 0xc0, 0xd3, 0xe2,
0x34, 0x2a, 0x46, 0x05, 0x4b, 0xf8, 0xa0, 0x23, 0xe8, 0x9b, 0xba, 0xc8, 0x03, 0xb8, 0x56, 0x81,
0x73, 0x36, 0x66, 0xd1, 0x19, 0x0b, 0x07, 0x20, 0xbe, 0xba, 0xa8, 0x9b, 0xdc, 0x86, 0x2e, 0xe6,
0x11, 0xb3, 0x2c, 0x0c, 0x38, 0x2b, 0x06, 0x5d, 0x21, 0x21, 0x1b, 0x22, 0x1f, 0x40, 0x3f, 0x63,
0xd2, 0xb1, 0x9f, 0xf2, 0x78, 0x5c, 0x0c, 0x7a, 0xc2, 0x9b, 0x76, 0x95, 0xc9, 0xa0, 0x16, 0xfa,
0x2e, 0x05, 0xbd, 0x0a, 0x1b, 0x07, 0x51, 0xc1, 0xd5, 0x2e, 0x1b, 0xcb, 0xdd, 0x87, 0x2b, 0x2e,
0xac, 0x6c, 0xe6, 0x3e, 0x2c, 0xab, 0x2d, 0xc3, 0x09, 0x20, 0xf3, 0x2b, 0x8a, 0xb9, 0xa3, 0x2d,
0xbe, 0xa1, 0xa2, 0x3f, 0x6f, 0x41, 0x1b, 0xed, 0xe1, 0x62, 0xdb, 0xb1, 0x0d, 0xb1, 0xe5, 0x18,
0xa2, 0xed, 0x2a, 0x16, 0x1c, 0x57, 0x21, 0xf2, 0xa7, 0x39, 0x67, 0x4a, 0xde, 0x52, 0x5b, 0x2c,
0xa4, 0xec, 0xcf, 0xd9, 0xf8, 0x4c, 0xa8, 0x8c, 0xe9, 0x47, 0x04, 0x15, 0xaa, 0x08, 0xb8, 0xfc,
0x5a, 0xea, 0x8b, 0x69, 0xeb, 0x3e, 0xf1, 0xe5, 0xe5, 0xb2, 0x4f, 0x7c, 0x37, 0x80, 0xcb, 0x51,
0x72, 0x9c, 0xce, 0x92, 0x50, 0x28, 0xc5, 0xb2, 0xaf, 0x9b, 0x68, 0xaa, 0x99, 0x08, 0xa9, 0xd1,
0x94, 0x29, 0x05, 0x28, 0x01, 0x4a, 0x30, 0x76, 0x16, 0xc2, 0x33, 0x18, 0x21, 0x7f, 0x08, 0xeb,
0x16, 0xa6, 0x24, 0xfc, 0x3e, 0x2c, 0xe2, 0xea, 0x75, 0x76, 0xa5, 0xf7, 0x4e, 0xb8, 0x14, 0xd9,
0x43, 0xd7, 0x60, 0xe5, 0x29, 0xe3, 0x9f, 0x25, 0x27, 0xa9, 0xe6, 0xf4, 0x9f, 0x2d, 0x58, 0x35,
0x90, 0x62, 0xb4, 0x05, 0xab, 0x51, 0xc8, 0x12, 0x1e, 0xf1, 0xf9, 0xc8, 0x09, 0xd1, 0x55, 0x18,
0xc3, 0x61, 0x10, 0x47, 0x41, 0xa1, 0x4c, 0x57, 0x36, 0xc8, 0x2e, 0x5c, 0x41, 0xdd, 0xd2, 0xea,
0x62, 0xb6, 0x5d, 0x66, 0x06, 0x8d, 0x7d, 0x68, 0x0e, 0x88, 0x4b, 0xd7, 0x50, 0x7e, 0x22, 0x5d,
0x52, 0x53, 0x17, 0x4a, 0x4d, 0x72, 0xc2, 0x25, 0x4b, 0x6f, 0x54, 0x02, 0xb5, 0x2c, 0x78, 0x49,
0x66, 0x25, 0xd5, 0x2c, 0xd8, 0xca, 0xa4, 0x97, 0x6b, 0x99, 0xf4, 0x16, 0xac, 0x16, 0xf3, 0x64,
0xcc, 0xc2, 0x11, 0x4f, 0x71, 0xdc, 0x28, 0x11, 0xbb, 0xb3, 0xec, 0x57, 0x61, 0x91, 0xf3, 0xb3,
0x82, 0x27, 0x8c, 0x0b, 0x53, 0x5c, 0xf6, 0x75, 0x13, 0x9d, 0x9f, 0x20, 0x91, 0x4a, 0xdf, 0xf1,
0x55, 0x8b, 0xfe, 0x4c, 0x04, 0x2c, 0x93, 0xd6, 0x7f, 0x21, 0xec, 0x90, 0xdc, 0x80, 0x8e, 0x1c,
0xbf, 0x38, 0x0d, 0x54, 0x62, 0xb6, 0x2c, 0x80, 0xa3, 0xd3, 0x00, 0xb3, 0x56, 0x67, 0x49, 0x52,
0xe3, 0xbb, 0x02, 0xdb, 0x97, 0x2b, 0xba, 0x03, 0x2b, 0xfa, 0xc0, 0x50, 0x8c, 0x62, 0x76, 0xc2,
0x75, 0x36, 0x96, 0xcc, 0xa6, 0x38, 0x5c, 0x71, 0xc0, 0x4e, 0x38, 0x7d, 0x06, 0xeb, 0xca, 0xda,
0x3e, 0xcf, 0x98, 0x1e, 0xfa, 0xfb, 0x55, 0x3f, 0x2b, 0x83, 0xe6, 0x86, 0xd2, 0x22, 0x3b, 0x85,
0xac, 0x38, 0x5f, 0xea, 0x03, 0x51, 0xdd, 0x8f, 0xe2, 0xb4, 0x60, 0x8a, 0x21, 0x85, 0xde, 0x38,
0x4e, 0x8b, 0x6a, 0x9e, 0x69, 0x63, 0x28, 0xb7, 0x62, 0x36, 0x1e, 0xa3, 0x95, 0xca, 0xb0, 0xab,
0x9b, 0xf4, 0xe7, 0x1e, 0x6c, 0x08, 0x6e, 0xda, 0x2f, 0x98, 0xfc, 0xe5, 0xdd, 0xa7, 0xd9, 0x1b,
0xdb, 0x79, 0xef, 0x7b, 0xea, 0xcc, 0x13, 0x47, 0xd3, 0x48, 0x07, 0xcb, 0x0e, 0x22, 0x07, 0x08,
0xa0, 0x2a, 0x9f, 0xa4, 0xf9, 0x98, 0x09, 0x89, 0x2d, 0xfb, 0xb2, 0x41, 0xff, 0xc5, 0x83, 0x75,
0x31, 0x8d, 0x23, 0x1e, 0xf0, 0x59, 0xa1, 0x96, 0xf6, 0xbb, 0xd0, 0xc7, 0x65, 0x30, 0xad, 0xc6,
0x6a, 0x12, 0x57, 0x8c, 0xc5, 0x09, 0x54, 0x12, 0xef, 0x5f, 0xf2, 0x5d, 0x62, 0xf2, 0x31, 0xf4,
0xec, 0x13, 0x9d, 0x4a, 0xe2, 0xaf, 0xeb, 0x15, 0xd4, 0xb4, 0x62, 0xff, 0x92, 0xef, 0x7c, 0x40,
0x1e, 0x02, 0x88, 0xe8, 0x26, 0xd8, 0x8a, 0xf9, 0x5a, 0x9f, 0xd7, 0x36, 0x62, 0xff, 0x92, 0x6f,
0x91, 0x7f, 0xb2, 0x0c, 0x4b, 0xd2, 0xe9, 0xd3, 0xa7, 0xd0, 0x77, 0x66, 0xea, 0x64, 0x91, 0x3d,
0x99, 0x45, 0xd6, 0xb2, 0xfb, 0x56, 0x43, 0x76, 0xff, 0x5f, 0x1e, 0x10, 0xd4, 0xa4, 0xca, 0x56,
0x7d, 0x07, 0x56, 0x78, 0x90, 0x4f, 0x18, 0x1f, 0xb9, 0xc9, 0x52, 0x05, 0x15, 0xd1, 0x29, 0x0d,
0x9d, 0x2c, 0xa0, 0xe7, 0xdb, 0x10, 0xd9, 0x06, 0x62, 0x35, 0xf5, 0x59, 0x4c, 0xfa, 0xf5, 0x86,
0x1e, 0x74, 0x40, 0x32, 0x84, 0xeb, 0xc3, 0x8a, 0xca, 0x90, 0xda, 0x62, 0xd3, 0x1b, 0xfb, 0xd0,
0x75, 0x67, 0x33, 0x3c, 0xe8, 0x05, 0x5c, 0xe7, 0x09, 0xba, 0xad, 0x5d, 0x8d, 0x30, 0x2b, 0xe5,
0x49, 0x4a, 0x80, 0xfe, 0xda, 0x83, 0x35, 0x5c, 0xbe, 0xa3, 0x22, 0x1f, 0x81, 0xd0, 0xbe, 0x77,
0xd4, 0x10, 0x87, 0xf6, 0x7f, 0xaf, 0x20, 0x0f, 0xa0, 0x23, 0x18, 0xa6, 0x19, 0x4b, 0x94, 0x7e,
0x0c, 0x5c, 0xfd, 0x28, 0x0d, 0x7f, 0xff, 0x92, 0x5f, 0x12, 0x5b, 0xda, 0x71, 0x0d, 0xae, 0xaa,
0x59, 0xba, 0xdb, 0x4a, 0xff, 0xba, 0x03, 0x9b, 0xd5, 0x1e, 0x13, 0xe3, 0x55, 0xe2, 0x12, 0x47,
0xd3, 0xe3, 0xd4, 0xe4, 0x40, 0x9e, 0x9d, 0xd3, 0x38, 0x5d, 0xe4, 0x04, 0xae, 0xea, 0x50, 0x80,
0xe3, 0x97, 0x8e, 0xbf, 0x25, 0x62, 0xd8, 0x7d, 0x57, 0x5e, 0x95, 0xf1, 0x34, 0x6c, 0xeb, 0x5e,
0x33, 0x3b, 0x32, 0x81, 0x81, 0x09, 0x39, 0xca, 0x01, 0x59, 0x61, 0x09, 0x87, 0xfa, 0xee, 0xdb,
0x87, 0x12, 0x06, 0x15, 0x6a, 0xf4, 0x42, 0x66, 0xe4, 0x35, 0xdc, 0xd2, 0x7d, 0xc2, 0x83, 0xd4,
0x87, 0x6b, 0xbf, 0xcb, 0xca, 0x3e, 0xc5, 0x6f, 0xdd, 0x31, 0xbf, 0x81, 0xef, 0xf0, 0x1f, 0x3d,
0x58, 0x71, 0xb9, 0x61, 0x00, 0x53, 0x39, 0xaa, 0x36, 0x12, 0x1d, 0xc8, 0x2b, 0x70, 0x3d, 0xcb,
0x6e, 0x35, 0x65, 0xd9, 0x76, 0x2e, 0xbd, 0xf0, 0x4d, 0xb9, 0x74, 0xfb, 0xdd, 0x72, 0xe9, 0xc5,
0xa6, 0x5c, 0x7a, 0xf8, 0xf7, 0x1e, 0x90, 0xfa, 0xee, 0x92, 0x4f, 0x65, 0x9a, 0x9f, 0xb0, 0x58,
0x19, 0xd4, 0xf7, 0xde, 0x49, 0x41, 0x34, 0xac, 0x3f, 0x46, 0x45, 0xb5, 0x0d, 0xc6, 0x8e, 0xa8,
0x7d, 0xbf, 0xa9, 0x0b, 0x8f, 0x40, 0x22, 0xd0, 0x16, 0x23, 0x1e, 0xc5, 0x71, 0x69, 0x59, 0x7d,
0xbf, 0x86, 0x0f, 0xdf, 0x40, 0xdf, 0xd9, 0xba, 0xff, 0xb3, 0x69, 0x57, 0x43, 0xaa, 0xdc, 0x24,
0x07, 0x1b, 0x7e, 0xdd, 0x02, 0x52, 0xd7, 0x9e, 0xff, 0xcf, 0x29, 0x08, 0x55, 0x70, 0x1c, 0xc0,
0x82, 0x52, 0x05, 0xc7, 0xf4, 0xb7, 0x60, 0x75, 0x1a, 0xf0, 0x59, 0x8e, 0xe9, 0xa4, 0x73, 0x00,
0xad, 0xc2, 0xb8, 0x5b, 0xa5, 0x8c, 0x47, 0xba, 0x57, 0xe5, 0x7c, 0x4d, 0x5d, 0xf4, 0xfb, 0x70,
0xe5, 0x45, 0x10, 0xc7, 0x8c, 0x7f, 0x22, 0x07, 0xd3, 0x21, 0xe9, 0x7d, 0xe8, 0xbd, 0x92, 0xf5,
0x86, 0x51, 0x9a, 0xc4, 0x73, 0x75, 0x20, 0xed, 0x2a, 0xec, 0xf3, 0x24, 0x9e, 0xe3, 0x09, 0xbe,
0xf2, 0x69, 0x79, 0xe8, 0xb7, 0x1d, 0x9a, 0xe7, 0xeb, 0x26, 0xba, 0x4a, 0x25, 0x27, 0x77, 0x38,
0xba, 0x0b, 0x9b, 0xd5, 0x8e, 0x66, 0x66, 0x0b, 0x25, 0xb3, 0x8f, 0x81, 0xfc, 0x68, 0xc6, 0xf2,
0xb9, 0x28, 0xe6, 0x99, 0xb2, 0xcd, 0xb5, 0xea, 0x11, 0x68, 0x29, 0x9b, 0x1d, 0xff, 0x80, 0xcd,
0x75, 0x71, 0xb3, 0x65, 0x8a, 0x9b, 0xf4, 0x21, 0x6c, 0x38, 0x0c, 0xd4, 0x88, 0x77, 0x60, 0x49,
0x14, 0x04, 0xf5, 0xf1, 0xc0, 0x2d, 0x1a, 0xaa, 0x3e, 0xfa, 0x27, 0xb0, 0xb0, 0x9f, 0x66, 0xf6,
0x71, 0xda, 0x73, 0x8f, 0xd3, 0xca, 0x51, 0x8c, 0x8c, 0x1f, 0x90, 0x23, 0xbb, 0x20, 0x9a, 0x79,
0x30, 0xe5, 0x98, 0x1f, 0x9f, 0xa4, 0xf9, 0xab, 0x20, 0x0f, 0x95, 0x0a, 0x54, 0x50, 0x9c, 0xfd,
0x09, 0xd3, 0xae, 0x02, 0x7f, 0xd2, 0x5f, 0x78, 0xb0, 0x28, 0xa6, 0x84, 0xfa, 0x21, 0x23, 0x86,
0xcc, 0xda, 0xd2, 0xf1, 0x4b, 0x31, 0x97, 0xbe, 0x5f, 0x85, 0x2b, 0xd5, 0xea, 0x56, 0xb5, 0x5a,
0x8d, 0xe1, 0x5b, 0xb6, 0xca, 0x32, 0x70, 0x09, 0x90, 0x5b, 0xd0, 0x3e, 0x4d, 0x33, 0xed, 0x97,
0x41, 0x9f, 0x78, 0xd3, 0xcc, 0x17, 0x38, 0xbd, 0x07, 0xab, 0xcf, 0xd2, 0x90, 0x59, 0x87, 0xa6,
0x0b, 0x77, 0x83, 0xfe, 0xa9, 0x07, 0xcb, 0x9a, 0x98, 0x6c, 0x41, 0x1b, 0xfd, 0x6b, 0x25, 0xf4,
0x9b, 0xea, 0x13, 0xd2, 0xf9, 0x82, 0x02, 0x8d, 0x4a, 0xa4, 0x13, 0x65, 0xf0, 0xd3, 0x49, 0x7b,
0x19, 0x58, 0x30, 0x9b, 0x12, 0x73, 0xae, 0x78, 0xe0, 0x0a, 0x4a, 0x7f, 0xe9, 0x41, 0xdf, 0x19,
0x03, 0xf3, 0xab, 0x38, 0x28, 0xb8, 0x3a, 0xeb, 0x2b, 0x21, 0xda, 0x90, 0x7d, 0xc0, 0x6e, 0xb9,
0x07, 0x6c, 0x73, 0xc0, 0x5b, 0xb0, 0x0f, 0x78, 0xf7, 0xa1, 0xa3, 0x4e, 0xd3, 0x4c, 0xcb, 0x4d,
0xd7, 0xf2, 0x71, 0x44, 0x5d, 0x57, 0x2b, 0x89, 0xe8, 0x43, 0xe8, 0x5a, 0x3d, 0x38, 0x60, 0xc2,
0xf8, 0xab, 0x34, 0x7f, 0xa9, 0x4f, 0xf4, 0xaa, 0x69, 0x4a, 0xa1, 0xad, 0xb2, 0x14, 0x4a, 0xff,
0xd6, 0x83, 0x3e, 0xea, 0x44, 0x94, 0x4c, 0x0e, 0xd3, 0x38, 0x1a, 0xcf, 0x85, 0x6e, 0xe8, 0xed,
0x1f, 0x85, 0x2c, 0xe6, 0x81, 0xd1, 0x0d, 0x17, 0xc6, 0x90, 0x35, 0x8d, 0x12, 0x51, 0xb2, 0x50,
0x9a, 0x61, 0xda, 0xa8, 0xcb, 0x27, 0x0c, 0x63, 0x4e, 0xc1, 0x46, 0x53, 0xcc, 0xfb, 0x94, 0x9f,
0x72, 0x40, 0xf4, 0x3e, 0x08, 0xe4, 0x01, 0x67, 0xa3, 0x69, 0x14, 0xc7, 0x91, 0xa4, 0x95, 0x3a,
0xdb, 0xd4, 0x45, 0xff, 0xa1, 0x05, 0x5d, 0x65, 0xf7, 0x4f, 0xc2, 0x09, 0x43, 0xfd, 0xd4, 0x71,
0xd4, 0x18, 0x94, 0x85, 0xe8, 0x7e, 0x27, 0xf2, 0x5a, 0x48, 0x75, 0x03, 0x17, 0xea, 0x1b, 0x88,
0x09, 0x6a, 0x1a, 0xb2, 0x0f, 0x44, 0x88, 0x97, 0x57, 0x42, 0x25, 0xa0, 0x7b, 0x77, 0x45, 0xef,
0x62, 0xd9, 0x2b, 0x00, 0x27, 0xa8, 0x2f, 0x55, 0x82, 0xfa, 0x03, 0xe8, 0x29, 0x36, 0x42, 0xee,
0xa2, 0xa6, 0x51, 0xaa, 0xb2, 0xb3, 0x27, 0xbe, 0x43, 0xa9, 0xbf, 0xdc, 0xd5, 0x5f, 0x2e, 0x7f,
0xd3, 0x97, 0x9a, 0x92, 0x5e, 0x85, 0x0d, 0x25, 0xbc, 0xa7, 0x79, 0x90, 0x9d, 0x6a, 0x5f, 0x1a,
0x9a, 0x6b, 0x0c, 0x01, 0x93, 0x7b, 0xb0, 0x88, 0x9f, 0x69, 0x77, 0xd6, 0x6c, 0x5e, 0x92, 0x84,
0x6c, 0xc1, 0x22, 0x0b, 0x27, 0x4c, 0x67, 0x95, 0xc4, 0xcd, 0x85, 0x71, 0x8f, 0x7c, 0x49, 0x80,
0xc6, 0x8e, 0x68, 0xc5, 0xd8, 0x5d, 0x5f, 0x88, 0x47, 0xf8, 0xe4, 0xb3, 0x90, 0x5e, 0x01, 0xf2,
0x4c, 0x6a, 0xad, 0x5d, 0x50, 0xf9, 0xb3, 0x05, 0xe8, 0x5a, 0x30, 0xda, 0xed, 0x04, 0x27, 0x3c,
0x0a, 0xa3, 0x60, 0xca, 0x38, 0xcb, 0x95, 0xa6, 0x56, 0x50, 0xe1, 0x32, 0xcf, 0x26, 0xa3, 0x74,
0xc6, 0x47, 0x21, 0x9b, 0xe4, 0x4c, 0x5e, 0x31, 0x78, 0x7e, 0x05, 0x45, 0xba, 0x69, 0xf0, 0xda,
0xa6, 0x93, 0xfa, 0x50, 0x41, 0xf5, 0x99, 0x45, 0xca, 0xa8, 0x5d, 0x9e, 0x59, 0xa4, 0x44, 0xaa,
0x1e, 0x67, 0xb1, 0xc1, 0xe3, 0x7c, 0x08, 0x9b, 0xd2, 0xb7, 0x28, 0xdb, 0x1c, 0x55, 0xd4, 0xe4,
0x82, 0x5e, 0x4c, 0x95, 0x70, 0xce, 0x5a, 0xc1, 0x8b, 0xe8, 0x67, 0xb2, 0x62, 0xea, 0xf9, 0x35,
0x1c, 0x69, 0xd1, 0x1c, 0x1d, 0x5a, 0x59, 0x32, 0xad, 0xe1, 0x82, 0x36, 0x78, 0xed, 0xd2, 0x76,
0x14, 0x6d, 0x05, 0xa7, 0x7d, 0xe8, 0x1e, 0xf1, 0x34, 0xd3, 0x9b, 0xb2, 0x02, 0x3d, 0xd9, 0x54,
0x95, 0xf5, 0x1b, 0x70, 0x5d, 0x68, 0xd1, 0xf3, 0x34, 0x4b, 0xe3, 0x74, 0x32, 0x3f, 0x9a, 0x1d,
0x17, 0xe3, 0x3c, 0xca, 0x30, 0xe3, 0xa3, 0xff, 0xe4, 0xc1, 0x86, 0xd3, 0xab, 0x8e, 0x74, 0xbf,
0x25, 0x55, 0xda, 0x94, 0x51, 0xa5, 0xe2, 0xad, 0x5b, 0x8e, 0x4f, 0x12, 0xca, 0xb3, 0xeb, 0x17,
0xaa, 0xb2, 0xba, 0x07, 0xab, 0x7a, 0x66, 0xfa, 0x43, 0xa9, 0x85, 0x83, 0xba, 0x16, 0xaa, 0xef,
0x57, 0xd4, 0x07, 0x9a, 0xc5, 0xef, 0xc9, 0x9c, 0x8b, 0x85, 0x62, 0x8d, 0xfa, 0xc0, 0x32, 0xd4,
0xdf, 0xdb, 0x79, 0x9e, 0x9e, 0xc1, 0xd8, 0x80, 0x05, 0xfd, 0x73, 0x0f, 0xa0, 0x9c, 0x1d, 0x2a,
0x46, 0xe9, 0xbc, 0x3d, 0x51, 0x94, 0x2a, 0x01, 0xcc, 0x90, 0x4c, 0x91, 0xaf, 0x8c, 0x07, 0x5d,
0x8d, 0x61, 0xca, 0x71, 0x17, 0x56, 0x27, 0x71, 0x7a, 0x2c, 0xa2, 0x2b, 0x26, 0x5c, 0xac, 0x50,
0xf7, 0x0b, 0x2b, 0x12, 0xfe, 0x54, 0xa1, 0x65, 0xf0, 0x68, 0x5b, 0xc1, 0x83, 0xfe, 0x45, 0xcb,
0x94, 0x9f, 0xca, 0x35, 0x5f, 0x68, 0x65, 0x64, 0xb7, 0xe6, 0x1c, 0x2f, 0xa8, 0xf6, 0x88, 0x53,
0xec, 0xe1, 0x37, 0x9e, 0x53, 0x1e, 0xc2, 0x4a, 0x2e, 0xbd, 0x8f, 0x76, 0x4d, 0xed, 0xb7, 0xb8,
0xa6, 0x7e, 0xee, 0xc4, 0x9d, 0xdf, 0x80, 0xb5, 0x20, 0x3c, 0x63, 0x39, 0x8f, 0x44, 0xb6, 0x2b,
0xc2, 0xbb, 0x74, 0xa8, 0xab, 0x16, 0x2e, 0xa2, 0xee, 0x5d, 0x58, 0x55, 0x77, 0x3a, 0x86, 0x52,
0x5d, 0x08, 0x97, 0x30, 0x12, 0xd2, 0xbf, 0xd1, 0x95, 0x2e, 0x77, 0x0f, 0x2f, 0x96, 0x88, 0xbd,
0xba, 0x56, 0x65, 0x75, 0xdf, 0x56, 0x95, 0xa9, 0x50, 0xa7, 0xd4, 0xaa, 0xfe, 0x27, 0x41, 0x55,
0x25, 0x74, 0x45, 0xda, 0x7e, 0x17, 0x91, 0xd2, 0x6d, 0x58, 0x3d, 0x62, 0x7c, 0x0f, 0x77, 0x50,
0x3b, 0xc6, 0x1b, 0xd0, 0x49, 0xd8, 0xab, 0x91, 0xdc, 0x62, 0x19, 0xc6, 0x97, 0x13, 0xf6, 0x4a,
0xd0, 0x50, 0x02, 0x6b, 0x25, 0xbd, 0xb2, 0xba, 0xbf, 0x6c, 0xc1, 0xe5, 0xcf, 0x92, 0xb3, 0x34,
0x1a, 0x8b, 0x5a, 0xd3, 0x94, 0x4d, 0x53, 0x7d, 0x63, 0x89, 0xbf, 0x31, 0x2b, 0x10, 0x57, 0x16,
0x19, 0x57, 0x45, 0x20, 0xdd, 0xc4, 0x08, 0x99, 0x97, 0xd7, 0xe3, 0x52, 0xdb, 0x2c, 0x84, 0x6c,
0xc2, 0x52, 0x6e, 0x5f, 0xe5, 0xab, 0x56, 0x79, 0x5d, 0xbb, 0x68, 0x5d, 0xd7, 0x8a, 0xaa, 0xa3,
0xbc, 0x8d, 0x11, 0x5b, 0xb2, 0xec, 0xeb, 0xa6, 0xc8, 0x6e, 0x73, 0xa6, 0xae, 0xb3, 0x30, 0xd6,
0x5e, 0x56, 0xd9, 0xad, 0x0d, 0x62, 0x3c, 0x96, 0x1f, 0x48, 0x1a, 0xe9, 0xaf, 0x6c, 0x08, 0xf3,
0x93, 0xea, 0x6b, 0x80, 0x8e, 0x54, 0x93, 0x0a, 0x4c, 0xbf, 0x04, 0xb2, 0x17, 0x86, 0x4a, 0x2a,
0x26, 0x59, 0x2f, 0xd7, 0xe3, 0x39, 0xeb, 0x69, 0xe0, 0xdb, 0x6a, 0xe6, 0xfb, 0x04, 0xba, 0x87,
0xd6, 0x73, 0x06, 0x21, 0x40, 0xfd, 0x90, 0x41, 0x09, 0xdd, 0x42, 0xac, 0x01, 0x5b, 0xf6, 0x80,
0xf4, 0x77, 0x80, 0x1c, 0x44, 0x05, 0x37, 0xf3, 0x33, 0xc7, 0x28, 0x53, 0x66, 0xb1, 0x8e, 0x51,
0x0a, 0x13, 0xc7, 0xa8, 0x3d, 0x79, 0x3b, 0x54, 0x5d, 0xd8, 0x3d, 0x58, 0x8e, 0x24, 0xa4, 0xfd,
0xe7, 0x8a, 0x52, 0x3c, 0x4d, 0x69, 0xfa, 0x31, 0x11, 0x50, 0xa0, 0xe3, 0x9e, 0x7f, 0xe1, 0xc1,
0x65, 0xb5, 0x34, 0x0c, 0x63, 0xce, 0x43, 0x0e, 0xb9, 0x30, 0x07, 0x6b, 0xbe, 0xb2, 0xaf, 0xef,
0xf4, 0x42, 0xd3, 0x4e, 0x13, 0x68, 0x67, 0x01, 0x3f, 0x15, 0x39, 0x6e, 0xc7, 0x17, 0xbf, 0xf5,
0x99, 0x65, 0xb1, 0x3c, 0xb3, 0xa8, 0x9b, 0x30, 0x35, 0x29, 0x73, 0x49, 0xf3, 0x89, 0xbc, 0x09,
0x2b, 0xe1, 0x52, 0x06, 0x6a, 0x82, 0x55, 0x19, 0x28, 0x52, 0xdf, 0xf4, 0xd3, 0x21, 0x0c, 0x1e,
0xb3, 0x98, 0x71, 0xb6, 0x17, 0xc7, 0x55, 0xfe, 0x37, 0xe0, 0x7a, 0x43, 0x9f, 0xb2, 0xb5, 0x4f,
0x61, 0xfd, 0x31, 0x3b, 0x9e, 0x4d, 0x0e, 0xd8, 0x59, 0x59, 0x91, 0x25, 0xd0, 0x2e, 0x4e, 0xd3,
0x57, 0x6a, 0xbf, 0xc4, 0x6f, 0xf2, 0x1e, 0x40, 0x8c, 0x34, 0xa3, 0x22, 0x63, 0x63, 0xa5, 0x4d,
0x1d, 0x81, 0x1c, 0x65, 0x6c, 0x4c, 0x3f, 0x04, 0x62, 0xf3, 0x51, 0x4b, 0x40, 0x0b, 0x98, 0x1d,
0x8f, 0x8a, 0x79, 0xc1, 0xd9, 0x54, 0x1b, 0xbf, 0x0d, 0xd1, 0xbb, 0xd0, 0x3b, 0x0c, 0xe6, 0x3e,
0xfb, 0x4a, 0xbd, 0x8f, 0xc1, 0x23, 0x53, 0x30, 0x47, 0xf5, 0x34, 0x47, 0x26, 0xd1, 0x4d, 0x73,
0x58, 0x92, 0x84, 0xc8, 0x34, 0x64, 0x05, 0x8f, 0x12, 0x59, 0xf5, 0x54, 0x4c, 0x2d, 0xa8, 0xb6,
0xdd, 0xad, 0x86, 0xed, 0x56, 0x99, 0x8d, 0xbe, 0x04, 0x55, 0xfb, 0xea, 0x60, 0xbb, 0xff, 0x31,
0x80, 0x8e, 0x49, 0x14, 0xc9, 0x4f, 0xa1, 0xef, 0x9c, 0xf8, 0xc9, 0x0d, 0xb5, 0x1d, 0x4d, 0x25,
0x84, 0xe1, 0xcd, 0xe6, 0x4e, 0x25, 0xf6, 0x5b, 0x5f, 0xff, 0xfa, 0x5f, 0x7f, 0xd9, 0x1a, 0x90,
0xcd, 0x9d, 0xb3, 0x0f, 0x76, 0xd4, 0x91, 0x7e, 0x47, 0x54, 0x28, 0xe4, 0x45, 0xd1, 0x4b, 0x58,
0x71, 0x2b, 0x02, 0xe4, 0xa6, 0xeb, 0x78, 0x2b, 0xa3, 0xbd, 0x77, 0x41, 0xaf, 0x1a, 0xee, 0xa6,
0x18, 0x6e, 0x93, 0x5c, 0xb1, 0x87, 0x33, 0x09, 0x1c, 0x13, 0x57, 0x7b, 0xf6, 0x2b, 0x2d, 0xa2,
0xf9, 0x35, 0xbf, 0xde, 0x1a, 0x5e, 0xaf, 0xbf, 0xc8, 0x52, 0x4f, 0xb8, 0xe8, 0x40, 0x0c, 0x45,
0xc8, 0x1a, 0x0e, 0x65, 0x3f, 0xd2, 0x22, 0x3f, 0x81, 0x8e, 0x79, 0x91, 0x42, 0xae, 0x59, 0xef,
0x6f, 0xec, 0x37, 0x2e, 0xc3, 0x41, 0xbd, 0x43, 0x27, 0x63, 0x82, 0xf3, 0x55, 0x5a, 0xe3, 0xfc,
0x91, 0x77, 0x8f, 0x1c, 0xc0, 0x55, 0x65, 0xfd, 0xc7, 0xec, 0x7f, 0xb2, 0x92, 0x86, 0xb7, 0x65,
0xf7, 0x3d, 0xf2, 0x10, 0x96, 0xf5, 0x23, 0x1d, 0xb2, 0xd9, 0xfc, 0x52, 0x68, 0x78, 0xad, 0x86,
0x2b, 0xa5, 0xdf, 0x03, 0x28, 0xdf, 0xa4, 0x90, 0xc1, 0x45, 0x4f, 0x67, 0x8c, 0x10, 0x1b, 0x1e,
0xb0, 0x4c, 0xc4, 0x93, 0x1c, 0xf7, 0xc9, 0x0b, 0xf9, 0x56, 0x49, 0xdf, 0xf8, 0x18, 0xe6, 0x2d,
0x0c, 0xe9, 0xa6, 0x90, 0xdd, 0x1a, 0x59, 0x41, 0xd9, 0x25, 0xec, 0x95, 0xbe, 0xe4, 0xfe, 0x31,
0x74, 0xad, 0x87, 0x2b, 0xc4, 0xba, 0x3b, 0xa8, 0x3c, 0x4c, 0x19, 0x0e, 0x9b, 0xba, 0x14, 0xf7,
0x2b, 0x82, 0xfb, 0x0a, 0xed, 0x20, 0x77, 0x71, 0xaf, 0x8a, 0x5b, 0xf2, 0x53, 0x58, 0x71, 0x1f,
0xac, 0x18, 0x1d, 0x6e, 0x7c, 0xfa, 0x62, 0x74, 0xf8, 0x82, 0x57, 0x2e, 0x6a, 0xfb, 0xef, 0x6d,
0x98, 0x41, 0x76, 0xde, 0xa8, 0xf2, 0xc3, 0x39, 0xf9, 0x11, 0x1a, 0xaa, 0xba, 0xe8, 0x26, 0xe5,
0x03, 0x1e, 0xf7, 0x3a, 0xdc, 0xe8, 0x56, 0xed, 0x4e, 0x9c, 0xae, 0x0b, 0xe6, 0x5d, 0x52, 0xae,
0x80, 0xfc, 0x10, 0x2e, 0xab, 0x0b, 0x6f, 0x72, 0xb5, 0xd4, 0x21, 0xeb, 0x08, 0x37, 0xdc, 0xac,
0xc2, 0x8a, 0xd9, 0x86, 0x60, 0xd6, 0x27, 0x5d, 0x64, 0x36, 0x61, 0x3c, 0x42, 0x1e, 0x31, 0xac,
0xba, 0xb5, 0xd2, 0xc2, 0x88, 0xa3, 0xf1, 0xfe, 0xc4, 0x88, 0xa3, 0xb9, 0xf0, 0xea, 0x9a, 0xb4,
0x36, 0xe5, 0x1d, 0x7d, 0x35, 0xf4, 0x47, 0xd0, 0xb3, 0x5f, 0x57, 0x90, 0xa1, 0xb5, 0xf2, 0xca,
0x4b, 0x8c, 0xe1, 0x8d, 0xc6, 0x3e, 0x77, 0x6b, 0x49, 0xcf, 0x1e, 0x86, 0xfc, 0x18, 0x56, 0xad,
0x72, 0xfb, 0xd1, 0x3c, 0x19, 0x1b, 0xd5, 0xa9, 0x5f, 0xf0, 0x0d, 0x9b, 0x72, 0x46, 0x7a, 0x4d,
0x30, 0x5e, 0xa7, 0x0e, 0x63, 0x54, 0x9b, 0x47, 0xd0, 0xb5, 0x4b, 0xf9, 0x6f, 0xe1, 0x7b, 0xcd,
0xea, 0xb2, 0x2f, 0xd5, 0xee, 0x7b, 0xe4, 0x57, 0x1e, 0xf4, 0xec, 0x6b, 0x61, 0xe2, 0x9c, 0x82,
0x2a, 0x7c, 0x06, 0x76, 0x9f, 0xcd, 0x88, 0x7e, 0x29, 0x26, 0x79, 0x78, 0xef, 0x99, 0x23, 0xe4,
0x37, 0xce, 0x6d, 0xc7, 0xb6, 0xfd, 0xd2, 0xf1, 0xbc, 0xda, 0x69, 0x5f, 0x80, 0x9e, 0xef, 0xbc,
0x11, 0x77, 0x32, 0xe7, 0xf7, 0x3d, 0xf2, 0x91, 0x7c, 0xb0, 0xaa, 0x13, 0x14, 0x62, 0x39, 0x93,
0xaa, 0xd8, 0xec, 0x67, 0xa0, 0x5b, 0xde, 0x7d, 0x8f, 0xfc, 0xb1, 0x7c, 0xe4, 0xa8, 0xbe, 0x15,
0xd2, 0x7f, 0xd7, 0xef, 0xe9, 0x1d, 0xb1, 0xa2, 0x5b, 0xf4, 0xba, 0xb3, 0xa2, 0xaa, 0x37, 0x3d,
0x04, 0x28, 0xb3, 0x4d, 0x52, 0x49, 0xbd, 0x8c, 0x9f, 0xa9, 0x27, 0xa4, 0xee, 0xae, 0xea, 0x0c,
0x4d, 0x3a, 0x83, 0x9e, 0x95, 0xe7, 0x15, 0x66, 0x5b, 0xeb, 0x59, 0xe3, 0x70, 0xd8, 0xd4, 0xa5,
0xf8, 0x7f, 0x5b, 0xf0, 0x7f, 0x8f, 0xdc, 0xb0, 0xf9, 0xef, 0xbc, 0xb1, 0xb3, 0xcc, 0x73, 0xf2,
0x25, 0xf4, 0x0f, 0xd2, 0xf4, 0xe5, 0x2c, 0x33, 0x87, 0x08, 0x37, 0x6f, 0xc2, 0x4c, 0x77, 0x58,
0x59, 0x14, 0x7d, 0x5f, 0x70, 0xbe, 0x41, 0xae, 0xbb, 0x9c, 0xcb, 0xdc, 0xf7, 0x9c, 0x04, 0xb0,
0x6e, 0x62, 0x8c, 0x59, 0xc8, 0xd0, 0xe5, 0x63, 0xa7, 0xa0, 0xb5, 0x31, 0x9c, 0xa8, 0x6f, 0xc6,
0x28, 0x34, 0xcf, 0xfb, 0x1e, 0x39, 0x84, 0xde, 0x63, 0x36, 0x4e, 0x43, 0xa6, 0x72, 0x9d, 0x8d,
0x72, 0xe6, 0x26, 0x47, 0x1a, 0xf6, 0x1d, 0xd0, 0xf5, 0x04, 0x59, 0x30, 0xcf, 0xd9, 0x57, 0x3b,
0x6f, 0x54, 0x12, 0x75, 0xae, 0x3d, 0x81, 0x4e, 0xfc, 0x1c, 0x4f, 0x50, 0xc9, 0x14, 0x1d, 0x4f,
0x50, 0xcb, 0x14, 0x1d, 0x4f, 0xa0, 0x13, 0x4f, 0x12, 0x63, 0xfe, 0x58, 0x49, 0x2e, 0x4d, 0xa4,
0xba, 0x28, 0x25, 0x1d, 0xde, 0xbe, 0x98, 0xc0, 0x1d, 0xed, 0x9e, 0x3b, 0xda, 0x11, 0xf4, 0x1f,
0x33, 0x29, 0x2c, 0x59, 0xdd, 0x1b, 0xba, 0xae, 0xc5, 0xae, 0x04, 0x56, 0xdd, 0x8e, 0xe8, 0x73,
0x1d, 0xbd, 0x28, 0xad, 0x91, 0x9f, 0x40, 0xf7, 0x29, 0xe3, 0xba, 0x9c, 0x67, 0xe2, 0x7d, 0xa5,
0xbe, 0x37, 0x6c, 0xa8, 0x06, 0xd2, 0xdb, 0x82, 0xdb, 0x90, 0x0c, 0x0c, 0xb7, 0x1d, 0x16, 0x4e,
0x98, 0x74, 0x02, 0xa3, 0x28, 0x3c, 0x27, 0x7f, 0x20, 0x98, 0x9b, 0x5a, 0xff, 0xa6, 0x55, 0x05,
0xb2, 0x99, 0xaf, 0x56, 0xf0, 0x26, 0xce, 0x49, 0x1a, 0x32, 0x2b, 0xe4, 0x25, 0xd0, 0xb5, 0xee,
0x6f, 0x8c, 0x41, 0xd5, 0x2f, 0x85, 0x8c, 0x41, 0x35, 0x5c, 0xf7, 0xd0, 0x2d, 0x31, 0x0e, 0x25,
0xb7, 0xcb, 0x71, 0xe4, 0x15, 0x4f, 0x39, 0xd2, 0xce, 0x9b, 0x60, 0xca, 0xcf, 0xc9, 0x0b, 0xf1,
0x26, 0xcc, 0x2e, 0x59, 0x96, 0xf9, 0x46, 0xb5, 0xba, 0x69, 0x84, 0x65, 0x75, 0xb9, 0x39, 0x88,
0x1c, 0x4a, 0x44, 0xc6, 0xdf, 0x06, 0x38, 0xe2, 0x69, 0xf6, 0x38, 0x60, 0xd3, 0x34, 0x29, 0x3d,
0x59, 0x59, 0x96, 0x2b, 0x3d, 0x99, 0x55, 0x9b, 0x23, 0x2f, 0xac, 0x8c, 0xcf, 0xa9, 0xf8, 0x6a,
0xe5, 0xba, 0xb0, 0x72, 0x67, 0x04, 0xd2, 0x50, 0xbd, 0xd3, 0xc9, 0x9f, 0x2c, 0x49, 0x58, 0xc9,
0x9f, 0x53, 0xd3, 0xb0, 0x92, 0x3f, 0xb7, 0x76, 0x81, 0xc9, 0x5f, 0x79, 0x0e, 0x32, 0xc9, 0x5f,
0xed, 0x88, 0x65, 0x7c, 0x68, 0xfd, 0xd0, 0x74, 0xbc, 0x24, 0xfe, 0x5f, 0xe4, 0x37, 0xff, 0x3b,
0x00, 0x00, 0xff, 0xff, 0x68, 0xd2, 0x00, 0x3f, 0x61, 0x32, 0x00, 0x00,
// 4280 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0xcd, 0x6f, 0x1c, 0x47,
0x76, 0x77, 0x0f, 0x87, 0x14, 0xe7, 0xcd, 0x0c, 0x3f, 0x8a, 0x14, 0x35, 0x1a, 0xc9, 0x5e, 0xb9,
0xd6, 0xb0, 0x19, 0xed, 0x86, 0x94, 0xb9, 0x89, 0xa3, 0xb5, 0x92, 0x18, 0xb4, 0xbe, 0xe8, 0x2c,
0x2d, 0x73, 0x9b, 0xb2, 0x95, 0xec, 0x22, 0x98, 0x34, 0xa7, 0x8b, 0xc3, 0x5e, 0xf5, 0x74, 0xb7,
0xbb, 0x6b, 0x28, 0xcd, 0x0a, 0x42, 0x02, 0x67, 0x73, 0x4b, 0xb0, 0x08, 0xf6, 0xbe, 0x48, 0x90,
0x73, 0x2e, 0x39, 0x26, 0xff, 0x41, 0x80, 0x00, 0x01, 0xf6, 0x94, 0x7b, 0x90, 0x7b, 0x0e, 0xb9,
0xe5, 0x10, 0xbc, 0xfa, 0xea, 0xaa, 0xee, 0xa6, 0xa4, 0x20, 0xc1, 0x9e, 0x38, 0xf5, 0xab, 0xd7,
0xaf, 0xaa, 0x5e, 0xbd, 0x7a, 0x5f, 0x55, 0x84, 0x4e, 0x9e, 0x8d, 0x77, 0xb2, 0x3c, 0xe5, 0x29,
0x59, 0x8c, 0x93, 0x3c, 0x1b, 0x0f, 0xaf, 0x4f, 0xd2, 0x74, 0x12, 0xb3, 0xdd, 0x20, 0x8b, 0x76,
0x83, 0x24, 0x49, 0x79, 0xc0, 0xa3, 0x34, 0x29, 0x24, 0x11, 0xfd, 0x4f, 0x0f, 0xba, 0x8f, 0xf3,
0x20, 0x29, 0x82, 0x31, 0xc2, 0x64, 0x00, 0x97, 0xf8, 0xf3, 0xd1, 0x59, 0x50, 0x9c, 0x0d, 0xbc,
0x1b, 0xde, 0x76, 0xc7, 0xd7, 0x4d, 0xb2, 0x05, 0x4b, 0xc1, 0x34, 0x9d, 0x25, 0x7c, 0xd0, 0xba,
0xe1, 0x6d, 0x2f, 0xf8, 0xaa, 0x45, 0xbe, 0x0b, 0xeb, 0xc9, 0x6c, 0x3a, 0x1a, 0xa7, 0xc9, 0x69,
0x94, 0x4f, 0x25, 0xf3, 0xc1, 0xc2, 0x0d, 0x6f, 0x7b, 0xd1, 0xaf, 0x77, 0x90, 0x77, 0x00, 0x4e,
0xe2, 0x74, 0xfc, 0x54, 0x0e, 0xd1, 0x16, 0x43, 0x58, 0x08, 0xa1, 0xd0, 0x53, 0x2d, 0x16, 0x4d,
0xce, 0xf8, 0x60, 0x51, 0x30, 0x72, 0x30, 0xe4, 0xc1, 0xa3, 0x29, 0x1b, 0x15, 0x3c, 0x98, 0x66,
0x83, 0x25, 0x31, 0x1b, 0x0b, 0x11, 0xfd, 0x29, 0x0f, 0xe2, 0xd1, 0x29, 0x63, 0xc5, 0xe0, 0x92,
0xea, 0x37, 0x08, 0x1d, 0xc0, 0xd6, 0x43, 0xc6, 0xad, 0x55, 0x17, 0x3e, 0xfb, 0x7a, 0xc6, 0x0a,
0x4e, 0x0f, 0x81, 0x58, 0xf0, 0x3d, 0xc6, 0x83, 0x28, 0x2e, 0xc8, 0x47, 0xd0, 0xe3, 0x16, 0xf1,
0xc0, 0xbb, 0xb1, 0xb0, 0xdd, 0xdd, 0x23, 0x3b, 0x42, 0xbe, 0x3b, 0xd6, 0x07, 0xbe, 0x43, 0x47,
0xff, 0xd5, 0x83, 0xee, 0x31, 0x4b, 0x42, 0xc5, 0x9d, 0x10, 0x68, 0x87, 0xac, 0xe0, 0x42, 0xb0,
0x3d, 0x5f, 0xfc, 0x26, 0xdf, 0x82, 0x2e, 0xfe, 0x1d, 0x15, 0x3c, 0x8f, 0x92, 0x89, 0x10, 0x6d,
0xc7, 0x07, 0x84, 0x8e, 0x05, 0x42, 0xd6, 0x60, 0x21, 0x98, 0x72, 0x21, 0xd0, 0x05, 0x1f, 0x7f,
0x92, 0x77, 0xa1, 0x97, 0x05, 0xf3, 0x29, 0x4b, 0x78, 0x29, 0xc4, 0x9e, 0xdf, 0x55, 0xd8, 0x01,
0x4a, 0x71, 0x07, 0x36, 0x6c, 0x12, 0xcd, 0x7d, 0x51, 0x70, 0x5f, 0xb7, 0x28, 0xd5, 0x20, 0x1f,
0xc0, 0xaa, 0xa6, 0xcf, 0xe5, 0x64, 0x85, 0x58, 0x3b, 0xfe, 0x8a, 0x82, 0xb5, 0x80, 0x12, 0xe8,
0xc9, 0x15, 0x15, 0x59, 0x9a, 0x14, 0x8c, 0xdc, 0x84, 0x35, 0xfd, 0x61, 0x96, 0xb3, 0x68, 0x1a,
0x4c, 0x98, 0x5a, 0x5e, 0x0d, 0x27, 0x7b, 0xd0, 0x37, 0x83, 0xa4, 0x33, 0xce, 0xc4, 0x62, 0xbb,
0x7b, 0x3d, 0x25, 0x47, 0x1f, 0x31, 0xdf, 0x25, 0xa1, 0xdf, 0x78, 0xd0, 0xbb, 0x7b, 0x16, 0x24,
0x09, 0x8b, 0x8f, 0xd2, 0x28, 0xe1, 0xa8, 0x1f, 0xa7, 0xb3, 0x24, 0x8c, 0x92, 0xc9, 0x88, 0x3f,
0x8f, 0x42, 0x35, 0x98, 0x83, 0xe1, 0xa4, 0xec, 0x36, 0xae, 0x5e, 0x09, 0xb6, 0x86, 0x23, 0xbf,
0x74, 0xc6, 0xb3, 0x19, 0x1f, 0x45, 0x49, 0xc8, 0x9e, 0x0b, 0x39, 0xf7, 0x7d, 0x07, 0xa3, 0xbf,
0x0f, 0x6b, 0x87, 0xa8, 0x78, 0x49, 0x94, 0x4c, 0xf6, 0xc3, 0x30, 0x67, 0x45, 0x81, 0xa7, 0x21,
0x9b, 0x9d, 0x3c, 0x65, 0x73, 0x75, 0x4c, 0x54, 0x0b, 0xf7, 0xf8, 0x2c, 0x2d, 0xb8, 0x1a, 0x4f,
0xfc, 0xa6, 0x7f, 0xe3, 0xc1, 0x2a, 0x4a, 0xed, 0xf3, 0x20, 0x99, 0x6b, 0x5d, 0x38, 0x84, 0x1e,
0xb2, 0x7a, 0x9c, 0xee, 0xcb, 0x33, 0x25, 0x75, 0x6a, 0x5b, 0xc9, 0xa2, 0x42, 0xbd, 0x63, 0x93,
0xde, 0x4f, 0x78, 0x3e, 0xf7, 0x9d, 0xaf, 0x87, 0x9f, 0xc0, 0x7a, 0x8d, 0x04, 0x35, 0xa7, 0x9c,
0x1f, 0xfe, 0x24, 0x9b, 0xb0, 0x78, 0x1e, 0xc4, 0x33, 0xa6, 0x4e, 0xb0, 0x6c, 0x7c, 0xdc, 0xba,
0xed, 0xd1, 0xf7, 0x61, 0xad, 0x1c, 0x53, 0xed, 0x2d, 0x81, 0xb6, 0x11, 0x71, 0xc7, 0x17, 0xbf,
0x51, 0x14, 0x48, 0x77, 0x37, 0x8d, 0xcc, 0xa1, 0x41, 0xba, 0x20, 0x0c, 0x73, 0x4d, 0x87, 0xbf,
0x2f, 0x32, 0x16, 0xf4, 0x03, 0x58, 0xb7, 0xbe, 0x7f, 0xc5, 0x40, 0xbf, 0xf4, 0x60, 0xfd, 0x11,
0x7b, 0xa6, 0xc4, 0xad, 0x87, 0xba, 0x0d, 0x6d, 0x3e, 0xcf, 0xa4, 0x8a, 0xad, 0xec, 0xbd, 0xa7,
0xa4, 0x55, 0xa3, 0xdb, 0x51, 0xcd, 0xc7, 0xf3, 0x8c, 0xf9, 0xe2, 0x0b, 0xfa, 0x05, 0x74, 0x2d,
0x90, 0x5c, 0x81, 0x8d, 0x27, 0x9f, 0x3d, 0x7e, 0x74, 0xff, 0xf8, 0x78, 0x74, 0xf4, 0xe5, 0xa7,
0x3f, 0xb8, 0xff, 0x47, 0xa3, 0x83, 0xfd, 0xe3, 0x83, 0xb5, 0xb7, 0xc8, 0x16, 0x90, 0x47, 0xf7,
0x8f, 0x1f, 0xdf, 0xbf, 0xe7, 0xe0, 0x1e, 0x59, 0x85, 0xae, 0x0d, 0xb4, 0xe8, 0x10, 0x06, 0x8f,
0xd8, 0xb3, 0x27, 0x11, 0x4f, 0x58, 0x51, 0xb8, 0xc3, 0xd3, 0x1d, 0x20, 0xf6, 0x9c, 0xd4, 0x32,
0x07, 0x70, 0x29, 0x90, 0x90, 0x36, 0xad, 0xaa, 0x49, 0xdf, 0x07, 0x72, 0x1c, 0x4d, 0x92, 0xcf,
0x59, 0x51, 0x04, 0x13, 0xa6, 0x17, 0xbb, 0x06, 0x0b, 0xd3, 0x62, 0xa2, 0x34, 0x1c, 0x7f, 0xd2,
0xef, 0xc1, 0x86, 0x43, 0xa7, 0x18, 0x5f, 0x87, 0x4e, 0x11, 0x4d, 0x92, 0x80, 0xcf, 0x72, 0xa6,
0x58, 0x97, 0x00, 0x7d, 0x00, 0x9b, 0x5f, 0xb1, 0x3c, 0x3a, 0x9d, 0xbf, 0x8e, 0xbd, 0xcb, 0xa7,
0x55, 0xe5, 0xf3, 0x9b, 0x70, 0xb9, 0xc2, 0x47, 0x0d, 0x2f, 0xb5, 0x4a, 0xed, 0xdf, 0xb2, 0x2f,
0x1b, 0xf4, 0x4b, 0x20, 0x77, 0xd3, 0x24, 0x61, 0x63, 0x7e, 0xc4, 0x58, 0xae, 0x07, 0xfd, 0x8e,
0xa5, 0x2b, 0xdd, 0xbd, 0x2b, 0x6a, 0x03, 0xab, 0xa7, 0x4b, 0x29, 0x11, 0x81, 0x76, 0xc6, 0xf2,
0xa9, 0x98, 0xca, 0xb2, 0x2f, 0x7e, 0xd3, 0x5d, 0xd8, 0x70, 0xd8, 0x96, 0xb2, 0xcd, 0x18, 0xcb,
0x47, 0x6a, 0x16, 0x8b, 0xbe, 0x6e, 0xd2, 0x0f, 0xe1, 0xf2, 0xbd, 0xa8, 0x18, 0xd7, 0xa7, 0x82,
0x9f, 0xcc, 0x4e, 0x46, 0xe5, 0x11, 0xd1, 0x4d, 0xf4, 0x0f, 0xd5, 0x4f, 0xe4, 0x30, 0xf4, 0x1f,
0x3c, 0x68, 0x1f, 0x3c, 0x3e, 0xbc, 0x4b, 0x86, 0xb0, 0x1c, 0x25, 0xe3, 0x74, 0x8a, 0x56, 0x55,
0x2e, 0xdb, 0xb4, 0x2f, 0x74, 0x94, 0xd7, 0xa1, 0x23, 0x8c, 0x31, 0xba, 0x32, 0x61, 0x67, 0x7a,
0x7e, 0x09, 0xa0, 0x1b, 0x65, 0xcf, 0xb3, 0x28, 0x17, 0x7e, 0x52, 0x7b, 0xbf, 0xb6, 0xb0, 0x46,
0xf5, 0x0e, 0x34, 0x71, 0x39, 0x3b, 0x4f, 0xc7, 0x12, 0x0c, 0x59, 0x1c, 0xcc, 0x85, 0x75, 0xef,
0xfb, 0x35, 0x9c, 0xfe, 0xc7, 0x02, 0xf4, 0xf7, 0xc7, 0x3c, 0x3a, 0x67, 0xca, 0x92, 0x8a, 0x19,
0x0a, 0x40, 0xcd, 0x5d, 0xb5, 0xc8, 0x7b, 0xd0, 0xcf, 0xd9, 0x34, 0xe5, 0x6c, 0xa4, 0x6c, 0x9b,
0x54, 0x02, 0x17, 0x44, 0xaa, 0xb1, 0x64, 0x34, 0xca, 0xd0, 0x26, 0x8b, 0xb5, 0x74, 0x7c, 0x17,
0x44, 0xf1, 0x22, 0x80, 0x3b, 0x82, 0xab, 0x68, 0xfb, 0xba, 0x89, 0xb2, 0x1b, 0x07, 0x59, 0x30,
0x8e, 0xb8, 0x9c, 0xf3, 0x82, 0x6f, 0xda, 0xc8, 0x3b, 0x4e, 0xc7, 0x41, 0x3c, 0x3a, 0x09, 0xe2,
0x20, 0x19, 0x33, 0xe5, 0xdd, 0x5d, 0x90, 0xbc, 0x0f, 0x2b, 0x6a, 0x4a, 0x9a, 0x4c, 0x3a, 0xf9,
0x0a, 0x8a, 0x32, 0x9d, 0x25, 0x05, 0xe3, 0x3c, 0x66, 0xa1, 0x21, 0x5d, 0x16, 0xa4, 0xf5, 0x0e,
0x72, 0x0b, 0x36, 0x64, 0x90, 0x50, 0x04, 0x3c, 0x2d, 0xce, 0xa2, 0x62, 0x54, 0xb0, 0x84, 0x0f,
0x3a, 0x82, 0xbe, 0xa9, 0x8b, 0xdc, 0x86, 0x2b, 0x15, 0x38, 0x67, 0x63, 0x16, 0x9d, 0xb3, 0x70,
0x00, 0xe2, 0xab, 0x8b, 0xba, 0xc9, 0x0d, 0xe8, 0x62, 0x6c, 0x34, 0xcb, 0xc2, 0x80, 0xb3, 0x62,
0xd0, 0x15, 0x12, 0xb2, 0x21, 0xf2, 0x21, 0xf4, 0x33, 0x26, 0x9d, 0xd5, 0x19, 0x8f, 0xc7, 0xc5,
0xa0, 0x27, 0x3c, 0x44, 0x57, 0x1d, 0x19, 0xd4, 0x42, 0xdf, 0xa5, 0xa0, 0x97, 0x61, 0xe3, 0x30,
0x2a, 0xb8, 0xda, 0x65, 0x63, 0x8d, 0x0e, 0x60, 0xd3, 0x85, 0xd5, 0x99, 0xb9, 0x05, 0xcb, 0x6a,
0xcb, 0x70, 0x02, 0xc8, 0x7c, 0x53, 0x31, 0x77, 0xb4, 0xc5, 0x37, 0x54, 0xf4, 0x67, 0x2d, 0x68,
0xe3, 0x79, 0xb8, 0xf8, 0xec, 0xd8, 0x07, 0xb1, 0xe5, 0x1c, 0x44, 0xdb, 0xfc, 0x2d, 0x38, 0xe6,
0x4f, 0xc4, 0x84, 0x73, 0xce, 0x94, 0xbc, 0xa5, 0xb6, 0x58, 0x48, 0xd9, 0x9f, 0xb3, 0xf1, 0xb9,
0x50, 0x19, 0xd3, 0x8f, 0x08, 0x2a, 0x54, 0x11, 0x70, 0xf9, 0xb5, 0xd4, 0x17, 0xd3, 0xd6, 0x7d,
0xe2, 0xcb, 0x4b, 0x65, 0x9f, 0xf8, 0x6e, 0x00, 0x97, 0xa2, 0xe4, 0x24, 0x9d, 0x25, 0xa1, 0x50,
0x8a, 0x65, 0x5f, 0x37, 0xf1, 0xa8, 0x66, 0x22, 0x4c, 0x88, 0xa6, 0x4c, 0x29, 0x40, 0x09, 0x50,
0x82, 0xf1, 0x40, 0x21, 0x2c, 0x83, 0x11, 0xf2, 0x47, 0xb0, 0x6e, 0x61, 0x4a, 0xc2, 0xef, 0xc2,
0x22, 0xae, 0x5e, 0x47, 0x8c, 0x7a, 0xef, 0x84, 0x49, 0x91, 0x3d, 0x74, 0x0d, 0x56, 0x1e, 0x32,
0xfe, 0x59, 0x72, 0x9a, 0x6a, 0x4e, 0xff, 0xd5, 0x82, 0x55, 0x03, 0x29, 0x46, 0xdb, 0xb0, 0x1a,
0x85, 0x2c, 0xe1, 0x11, 0x9f, 0x8f, 0x9c, 0xb0, 0xa3, 0x0a, 0xa3, 0x31, 0x0e, 0xe2, 0x28, 0x28,
0xd4, 0xd1, 0x95, 0x0d, 0xb2, 0x07, 0x9b, 0xa8, 0x5b, 0x5a, 0x5d, 0xcc, 0xb6, 0xcb, 0x68, 0xa7,
0xb1, 0x0f, 0x8f, 0x03, 0xe2, 0xd2, 0x34, 0x94, 0x9f, 0x48, 0x93, 0xd4, 0xd4, 0x85, 0x52, 0x93,
0x9c, 0x70, 0xc9, 0xd2, 0x1a, 0x95, 0x40, 0x2d, 0xb2, 0x5f, 0x92, 0x91, 0x56, 0x35, 0xb2, 0xb7,
0xb2, 0x83, 0xe5, 0x5a, 0x76, 0xb0, 0x0d, 0xab, 0xc5, 0x3c, 0x19, 0xb3, 0x70, 0xc4, 0x53, 0x1c,
0x37, 0x4a, 0xc4, 0xee, 0x2c, 0xfb, 0x55, 0x58, 0xe4, 0x31, 0xac, 0xe0, 0x09, 0xe3, 0xe2, 0x28,
0x2e, 0xfb, 0xba, 0x89, 0xc6, 0x4f, 0x90, 0x48, 0xa5, 0xef, 0xf8, 0xaa, 0x45, 0x7f, 0x2a, 0x1c,
0x96, 0x49, 0x55, 0xbe, 0x14, 0xe7, 0x90, 0x5c, 0x83, 0x8e, 0x1c, 0xbf, 0x38, 0x0b, 0x94, 0xaf,
0x5c, 0x16, 0xc0, 0xf1, 0x59, 0x80, 0x91, 0xb8, 0xb3, 0x24, 0xa9, 0xf1, 0x5d, 0x81, 0x1d, 0xc8,
0x15, 0xbd, 0x07, 0x2b, 0x3a, 0x09, 0x2a, 0x46, 0x31, 0x3b, 0xe5, 0x3a, 0xc2, 0x4c, 0x66, 0x53,
0x1c, 0xae, 0x38, 0x64, 0xa7, 0x9c, 0x3e, 0x82, 0x75, 0x75, 0xda, 0xbe, 0xc8, 0x98, 0x1e, 0xfa,
0xfb, 0x55, 0x3b, 0x2b, 0x9d, 0xe6, 0x86, 0xd2, 0x22, 0x3b, 0x2c, 0xae, 0x18, 0x5f, 0xea, 0x03,
0x51, 0xdd, 0x77, 0xe3, 0xb4, 0x60, 0x8a, 0x21, 0x85, 0xde, 0x38, 0x4e, 0x8b, 0x6a, 0xec, 0x6c,
0x63, 0x28, 0xb7, 0x62, 0x36, 0x1e, 0xe3, 0x29, 0x95, 0x6e, 0x57, 0x37, 0xe9, 0xcf, 0x3c, 0xd8,
0x10, 0xdc, 0xb4, 0x5d, 0x30, 0x31, 0xd9, 0x9b, 0x4f, 0xb3, 0x37, 0xb6, 0x63, 0xf9, 0xb7, 0x55,
0x1e, 0x17, 0x47, 0xd3, 0x48, 0x3b, 0xcb, 0x0e, 0x22, 0x87, 0x08, 0xa0, 0x2a, 0x9f, 0xa6, 0xf9,
0x98, 0x09, 0x89, 0x2d, 0xfb, 0xb2, 0x41, 0xff, 0xcd, 0x83, 0x75, 0x31, 0x8d, 0x63, 0x1e, 0xf0,
0x59, 0xa1, 0x96, 0xf6, 0xbb, 0xd0, 0xc7, 0x65, 0x30, 0xad, 0xc6, 0x6a, 0x12, 0x9b, 0xe6, 0xc4,
0x09, 0x54, 0x12, 0x1f, 0xbc, 0xe5, 0xbb, 0xc4, 0xe4, 0x13, 0xe8, 0xd9, 0x59, 0xaa, 0x4a, 0x4c,
0xae, 0xea, 0x15, 0xd4, 0xb4, 0xe2, 0xe0, 0x2d, 0xdf, 0xf9, 0x80, 0xdc, 0x01, 0x10, 0xde, 0x4d,
0xb0, 0x15, 0xf3, 0xb5, 0x3e, 0xaf, 0x6d, 0xc4, 0xc1, 0x5b, 0xbe, 0x45, 0xfe, 0xe9, 0x32, 0x2c,
0x49, 0xa3, 0x4f, 0x1f, 0x42, 0xdf, 0x99, 0xa9, 0x13, 0x19, 0xf7, 0x64, 0x64, 0x5c, 0xcb, 0x58,
0x5a, 0x0d, 0x19, 0xcb, 0x7f, 0x7b, 0x40, 0x50, 0x93, 0x2a, 0x5b, 0xf5, 0x3e, 0xac, 0xf0, 0x20,
0x9f, 0x30, 0x3e, 0x72, 0x83, 0xa5, 0x0a, 0x2a, 0xbc, 0x53, 0x1a, 0x3a, 0x51, 0x40, 0xcf, 0xb7,
0x21, 0xb2, 0x03, 0xc4, 0x6a, 0xea, 0xfc, 0x52, 0xda, 0xf5, 0x86, 0x1e, 0x34, 0x40, 0xd2, 0x85,
0xeb, 0x04, 0x4c, 0x45, 0x48, 0x6d, 0xb1, 0xe9, 0x8d, 0x7d, 0x68, 0xba, 0xb3, 0x19, 0x26, 0xaf,
0x01, 0xd7, 0x71, 0x82, 0x6e, 0x6b, 0x53, 0x23, 0x8e, 0x95, 0xb2, 0x24, 0x25, 0x40, 0x7f, 0xe5,
0xc1, 0x1a, 0x2e, 0xdf, 0x51, 0x91, 0x8f, 0x41, 0x68, 0xdf, 0x1b, 0x6a, 0x88, 0x43, 0xfb, 0x7f,
0x57, 0x90, 0xdb, 0xd0, 0x11, 0x0c, 0xd3, 0x8c, 0x25, 0x4a, 0x3f, 0x06, 0xae, 0x7e, 0x94, 0x07,
0xff, 0xe0, 0x2d, 0xbf, 0x24, 0xb6, 0xb4, 0xe3, 0x0a, 0x5c, 0x56, 0xb3, 0x74, 0xb7, 0x95, 0xfe,
0x6d, 0x07, 0xb6, 0xaa, 0x3d, 0xc6, 0xc7, 0xab, 0xc0, 0x25, 0x8e, 0xa6, 0x27, 0xa9, 0x89, 0x81,
0x3c, 0x3b, 0xa6, 0x71, 0xba, 0xc8, 0x29, 0x5c, 0xd6, 0xae, 0x00, 0xc7, 0x2f, 0x0d, 0x7f, 0x4b,
0xf8, 0xb0, 0x5b, 0xae, 0xbc, 0x2a, 0xe3, 0x69, 0xd8, 0xd6, 0xbd, 0x66, 0x76, 0x64, 0x02, 0x03,
0xe3, 0x72, 0x94, 0x01, 0xb2, 0xdc, 0x12, 0x0e, 0xf5, 0x9d, 0x57, 0x0f, 0x25, 0x0e, 0x54, 0xa8,
0xd1, 0x0b, 0x99, 0x91, 0xe7, 0xf0, 0x8e, 0xee, 0x13, 0x16, 0xa4, 0x3e, 0x5c, 0xfb, 0x4d, 0x56,
0xf6, 0x00, 0xbf, 0x75, 0xc7, 0x7c, 0x0d, 0xdf, 0xe1, 0x3f, 0x7b, 0xb0, 0xe2, 0x72, 0x43, 0x07,
0xa6, 0x62, 0x54, 0x7d, 0x48, 0xb4, 0x23, 0xaf, 0xc0, 0xf5, 0x28, 0xbb, 0xd5, 0x14, 0x65, 0xdb,
0xb1, 0xf4, 0xc2, 0xeb, 0x62, 0xe9, 0xf6, 0x9b, 0xc5, 0xd2, 0x8b, 0x4d, 0xb1, 0xf4, 0xf0, 0x1f,
0x3d, 0x20, 0xf5, 0xdd, 0x25, 0x0f, 0x64, 0x98, 0x9f, 0xb0, 0x58, 0x1d, 0xa8, 0xef, 0xbe, 0x91,
0x82, 0x68, 0x58, 0x7f, 0x8c, 0x8a, 0x6a, 0x1f, 0x18, 0xdb, 0xa3, 0xf6, 0xfd, 0xa6, 0x2e, 0x4c,
0x81, 0x84, 0xa3, 0x2d, 0x46, 0x3c, 0x8a, 0xe3, 0xf2, 0x64, 0xf5, 0xfd, 0x1a, 0x3e, 0x7c, 0x01,
0x7d, 0x67, 0xeb, 0xfe, 0xdf, 0xa6, 0x5d, 0x75, 0xa9, 0x72, 0x93, 0x1c, 0x6c, 0xf8, 0x4d, 0x0b,
0x48, 0x5d, 0x7b, 0x7e, 0x9d, 0x53, 0x10, 0xaa, 0xe0, 0x18, 0x80, 0x05, 0xa5, 0x0a, 0xce, 0xd1,
0xdf, 0x86, 0xd5, 0x29, 0xe6, 0xfa, 0x18, 0x4e, 0x3a, 0x09, 0x68, 0x15, 0xc6, 0xdd, 0x2a, 0x65,
0x3c, 0xd2, 0xbd, 0x2a, 0xe6, 0x6b, 0xea, 0xa2, 0xdf, 0x87, 0xcd, 0x27, 0x41, 0x1c, 0x33, 0xfe,
0xa9, 0x1c, 0x4c, 0xbb, 0xa4, 0x77, 0xa1, 0xf7, 0x4c, 0xd6, 0x50, 0x46, 0x69, 0x12, 0xcf, 0x55,
0x42, 0xda, 0x55, 0xd8, 0x17, 0x49, 0x3c, 0xc7, 0x0c, 0xbe, 0xf2, 0x69, 0x99, 0xf4, 0xdb, 0x06,
0xcd, 0xf3, 0x75, 0x13, 0x4d, 0xa5, 0x92, 0x93, 0x3b, 0x1c, 0xdd, 0x83, 0xad, 0x6a, 0x47, 0x33,
0xb3, 0x85, 0x92, 0xd9, 0x27, 0x40, 0x7e, 0x38, 0x63, 0xf9, 0x5c, 0x14, 0x28, 0x4d, 0x29, 0xea,
0x4a, 0x35, 0x05, 0x5a, 0xca, 0x66, 0x27, 0x3f, 0x60, 0x73, 0x5d, 0xb0, 0x6d, 0x99, 0x82, 0x2d,
0xbd, 0x03, 0x1b, 0x0e, 0x03, 0x35, 0xe2, 0x7b, 0xb0, 0x24, 0x8a, 0x9c, 0x3a, 0x3d, 0x70, 0x0b,
0xa1, 0xaa, 0x8f, 0xfe, 0x29, 0x2c, 0x1c, 0xa4, 0x99, 0x9d, 0x4e, 0x7b, 0x6e, 0x3a, 0xad, 0x0c,
0xc5, 0xc8, 0xd8, 0x01, 0x39, 0xb2, 0x0b, 0xe2, 0x31, 0x0f, 0xa6, 0x1c, 0xe3, 0xe3, 0xd3, 0x34,
0x7f, 0x16, 0xe4, 0xa1, 0x52, 0x81, 0x0a, 0x8a, 0xb3, 0x3f, 0x65, 0xda, 0x54, 0xe0, 0x4f, 0xfa,
0x73, 0x0f, 0x16, 0xc5, 0x94, 0x50, 0x3f, 0xa4, 0xc7, 0x90, 0x51, 0x5b, 0x3a, 0x7e, 0x2a, 0xe6,
0xd2, 0xf7, 0xab, 0x70, 0xa5, 0x02, 0xdf, 0xaa, 0x56, 0xe0, 0xd1, 0x7d, 0xcb, 0x56, 0x59, 0xda,
0x2e, 0x01, 0xf2, 0x0e, 0xb4, 0xcf, 0xd2, 0x4c, 0xdb, 0x65, 0xd0, 0x19, 0x6f, 0x9a, 0xf9, 0x02,
0xa7, 0x37, 0x61, 0xf5, 0x51, 0x1a, 0x32, 0x2b, 0x69, 0xba, 0x70, 0x37, 0xe8, 0x9f, 0x79, 0xb0,
0xac, 0x89, 0xc9, 0x36, 0xb4, 0xd1, 0xbe, 0x56, 0x5c, 0xbf, 0xa9, 0x3e, 0x21, 0x9d, 0x2f, 0x28,
0xf0, 0x50, 0x89, 0x70, 0xa2, 0x74, 0x7e, 0x3a, 0x68, 0x2f, 0x1d, 0x0b, 0x46, 0x53, 0x62, 0xce,
0x15, 0x0b, 0x5c, 0x41, 0xe9, 0x2f, 0x3c, 0xe8, 0x3b, 0x63, 0x60, 0x7c, 0x15, 0x07, 0x05, 0x57,
0xb9, 0xbe, 0x12, 0xa2, 0x0d, 0xd9, 0x09, 0x76, 0xcb, 0x4d, 0xb0, 0x4d, 0x82, 0xb7, 0x60, 0x27,
0x78, 0xb7, 0xa0, 0xa3, 0xb2, 0x69, 0xa6, 0xe5, 0xa6, 0xef, 0x27, 0x70, 0x44, 0x5d, 0x57, 0x2b,
0x89, 0xe8, 0x1d, 0xe8, 0x5a, 0x3d, 0x38, 0x60, 0xc2, 0xf8, 0xb3, 0x34, 0x7f, 0xaa, 0x33, 0x7a,
0xd5, 0x34, 0xe5, 0xdd, 0x56, 0x59, 0xde, 0xa5, 0x7f, 0xef, 0x41, 0x1f, 0x75, 0x22, 0x4a, 0x26,
0x47, 0x69, 0x1c, 0x8d, 0xe7, 0x42, 0x37, 0xf4, 0xf6, 0x8f, 0x42, 0x16, 0xf3, 0xc0, 0xe8, 0x86,
0x0b, 0xa3, 0xcb, 0x9a, 0x46, 0x89, 0x28, 0x59, 0x28, 0xcd, 0x30, 0x6d, 0xd4, 0xe5, 0x53, 0x86,
0x3e, 0xa7, 0x60, 0xa3, 0x29, 0xc6, 0x7d, 0xca, 0x4e, 0x39, 0x20, 0x5a, 0x1f, 0x04, 0xf2, 0x80,
0xb3, 0xd1, 0x34, 0x8a, 0xe3, 0x48, 0xd2, 0x4a, 0x9d, 0x6d, 0xea, 0xa2, 0xff, 0xd4, 0x82, 0xae,
0x3a, 0xf7, 0xf7, 0xc3, 0x09, 0x43, 0xfd, 0xd4, 0x7e, 0xd4, 0x1c, 0x28, 0x0b, 0xd1, 0xfd, 0x8e,
0xe7, 0xb5, 0x90, 0xea, 0x06, 0x2e, 0xd4, 0x37, 0x10, 0x03, 0xd4, 0x34, 0x64, 0x1f, 0x0a, 0x17,
0x2f, 0xaf, 0xb9, 0x4a, 0x40, 0xf7, 0xee, 0x89, 0xde, 0xc5, 0xb2, 0x57, 0x00, 0x8e, 0x53, 0x5f,
0xaa, 0x38, 0xf5, 0xdb, 0xd0, 0x53, 0x6c, 0x84, 0xdc, 0x45, 0x4d, 0xa3, 0x54, 0x65, 0x67, 0x4f,
0x7c, 0x87, 0x52, 0x7f, 0xb9, 0xa7, 0xbf, 0x5c, 0x7e, 0xdd, 0x97, 0x9a, 0x92, 0x5e, 0x86, 0x0d,
0x25, 0xbc, 0x87, 0x79, 0x90, 0x9d, 0x69, 0x5b, 0x1a, 0x9a, 0xab, 0x19, 0x01, 0x93, 0x9b, 0xb0,
0x88, 0x9f, 0x69, 0x73, 0xd6, 0x7c, 0xbc, 0x24, 0x09, 0xd9, 0x86, 0x45, 0x16, 0x4e, 0x98, 0x8e,
0x2a, 0x89, 0x1b, 0x0b, 0xe3, 0x1e, 0xf9, 0x92, 0x00, 0x0f, 0x3b, 0xa2, 0x95, 0xc3, 0xee, 0xda,
0x42, 0x4c, 0xe1, 0x93, 0xcf, 0x42, 0xba, 0x09, 0xe4, 0x91, 0xd4, 0x5a, 0xbb, 0xa0, 0xf2, 0xe7,
0x0b, 0xd0, 0xb5, 0x60, 0x3c, 0xb7, 0x13, 0x9c, 0xf0, 0x28, 0x8c, 0x82, 0x29, 0xe3, 0x2c, 0x57,
0x9a, 0x5a, 0x41, 0x85, 0xc9, 0x3c, 0x9f, 0x8c, 0xd2, 0x19, 0x1f, 0x85, 0x6c, 0x92, 0x33, 0x59,
0x13, 0xf7, 0xfc, 0x0a, 0x8a, 0x74, 0xd3, 0xe0, 0xb9, 0x4d, 0x27, 0xf5, 0xa1, 0x82, 0xea, 0x9c,
0x45, 0xca, 0xa8, 0x5d, 0xe6, 0x2c, 0x52, 0x22, 0x55, 0x8b, 0xb3, 0xd8, 0x60, 0x71, 0x3e, 0x82,
0x2d, 0x69, 0x5b, 0xd4, 0xd9, 0x1c, 0x55, 0xd4, 0xe4, 0x82, 0x5e, 0x0c, 0x95, 0x70, 0xce, 0x5a,
0xc1, 0x8b, 0xe8, 0xa7, 0xb2, 0x62, 0xea, 0xf9, 0x35, 0x1c, 0x69, 0xf1, 0x38, 0x3a, 0xb4, 0xb2,
0x64, 0x5a, 0xc3, 0x05, 0x6d, 0xf0, 0xdc, 0xa5, 0xed, 0x28, 0xda, 0x0a, 0x4e, 0xfb, 0xd0, 0x3d,
0xe6, 0x69, 0xa6, 0x37, 0x65, 0x05, 0x7a, 0xb2, 0xa9, 0x2a, 0xeb, 0xd7, 0xe0, 0xaa, 0xd0, 0xa2,
0xc7, 0x69, 0x96, 0xc6, 0xe9, 0x64, 0x7e, 0x3c, 0x3b, 0x29, 0xc6, 0x79, 0x94, 0x61, 0xc4, 0x47,
0xff, 0xc5, 0x83, 0x0d, 0xa7, 0x57, 0xa5, 0x74, 0xbf, 0x25, 0x55, 0xda, 0x94, 0x51, 0xa5, 0xe2,
0xad, 0x5b, 0x86, 0x4f, 0x12, 0xca, 0xdc, 0xf5, 0x4b, 0x55, 0x59, 0xdd, 0x87, 0x55, 0x3d, 0x33,
0xfd, 0xa1, 0xd4, 0xc2, 0x41, 0x5d, 0x0b, 0xd5, 0xf7, 0x2b, 0xea, 0x03, 0xcd, 0xe2, 0xf7, 0x64,
0xcc, 0xc5, 0x42, 0xb1, 0x46, 0x9d, 0xb0, 0x0c, 0xf5, 0xf7, 0x76, 0x9c, 0xa7, 0x67, 0x30, 0x36,
0x60, 0x41, 0xff, 0xd2, 0x03, 0x28, 0x67, 0x87, 0x8a, 0x51, 0x1a, 0x6f, 0x4f, 0x14, 0xa5, 0x4a,
0x00, 0x23, 0x24, 0x53, 0xe4, 0x2b, 0xfd, 0x41, 0x57, 0x63, 0x18, 0x72, 0x7c, 0x00, 0xab, 0x93,
0x38, 0x3d, 0x11, 0xde, 0x55, 0x5c, 0xd6, 0x14, 0xea, 0x7e, 0x61, 0x45, 0xc2, 0x0f, 0x14, 0x5a,
0x3a, 0x8f, 0xb6, 0xe5, 0x3c, 0xe8, 0x5f, 0xb5, 0x4c, 0xf9, 0xa9, 0x5c, 0xf3, 0x85, 0xa7, 0x8c,
0xec, 0xd5, 0x8c, 0xe3, 0x05, 0xd5, 0x1e, 0x91, 0xc5, 0x1e, 0xbd, 0x36, 0x4f, 0xb9, 0x03, 0x2b,
0xb9, 0xb4, 0x3e, 0xda, 0x34, 0xb5, 0x5f, 0x61, 0x9a, 0xfa, 0xb9, 0xe3, 0x77, 0x7e, 0x03, 0xd6,
0x82, 0xf0, 0x9c, 0xe5, 0x3c, 0x12, 0xd1, 0xae, 0x70, 0xef, 0xd2, 0xa0, 0xae, 0x5a, 0xb8, 0xf0,
0xba, 0x1f, 0xc0, 0xaa, 0xba, 0xd3, 0x31, 0x94, 0xea, 0x92, 0xbb, 0x84, 0x91, 0x90, 0xfe, 0x9d,
0xae, 0x74, 0xb9, 0x7b, 0x78, 0xb1, 0x44, 0xec, 0xd5, 0xb5, 0x2a, 0xab, 0xfb, 0xb6, 0xaa, 0x4c,
0x85, 0x3a, 0xa4, 0x56, 0xf5, 0x3f, 0x09, 0xaa, 0x2a, 0xa1, 0x2b, 0xd2, 0xf6, 0x9b, 0x88, 0x94,
0xee, 0xc0, 0xea, 0x31, 0xe3, 0xfb, 0xb8, 0x83, 0xda, 0x30, 0x5e, 0x83, 0x4e, 0xc2, 0x9e, 0x8d,
0xe4, 0x16, 0x4b, 0x37, 0xbe, 0x9c, 0xb0, 0x67, 0x82, 0x86, 0x12, 0x58, 0x2b, 0xe9, 0xd5, 0xa9,
0xfb, 0xeb, 0x16, 0x5c, 0xfa, 0x2c, 0x39, 0x4f, 0xa3, 0xb1, 0xa8, 0x35, 0x4d, 0xd9, 0x34, 0xd5,
0xb7, 0xb0, 0xf8, 0x1b, 0xa3, 0x02, 0x71, 0x65, 0x91, 0x71, 0x55, 0x04, 0xd2, 0x4d, 0xf4, 0x90,
0x79, 0x79, 0xe5, 0x2f, 0xb5, 0xcd, 0x42, 0xc8, 0x16, 0x2c, 0xe5, 0xf6, 0xf3, 0x04, 0xd5, 0x2a,
0xaf, 0xa0, 0x17, 0xad, 0x2b, 0x68, 0x51, 0x75, 0x94, 0xb7, 0x31, 0x62, 0x4b, 0x96, 0x7d, 0xdd,
0x14, 0xd1, 0x6d, 0xce, 0xd4, 0x75, 0x16, 0xfa, 0xda, 0x4b, 0x2a, 0xba, 0xb5, 0x41, 0xf4, 0xc7,
0xf2, 0x03, 0x49, 0x23, 0xed, 0x95, 0x0d, 0x61, 0x7c, 0x52, 0x7d, 0xe1, 0xd0, 0x91, 0x6a, 0x52,
0x81, 0xe9, 0x57, 0x40, 0xf6, 0xc3, 0x50, 0x49, 0xc5, 0x04, 0xeb, 0xe5, 0x7a, 0x3c, 0x67, 0x3d,
0x0d, 0x7c, 0x5b, 0xcd, 0x7c, 0xef, 0x43, 0xf7, 0xc8, 0x7a, 0xa2, 0x21, 0x04, 0xa8, 0x1f, 0x67,
0x28, 0xa1, 0x5b, 0x88, 0x35, 0x60, 0xcb, 0x1e, 0x90, 0xfe, 0x0e, 0x90, 0xc3, 0xa8, 0xe0, 0x66,
0x7e, 0x26, 0x8d, 0x32, 0x65, 0x16, 0x2b, 0x8d, 0x52, 0x98, 0x48, 0xa3, 0xf6, 0xe5, 0xed, 0x50,
0x75, 0x61, 0x37, 0x61, 0x39, 0x92, 0x90, 0xb6, 0x9f, 0x2b, 0x4a, 0xf1, 0x34, 0xa5, 0xe9, 0xc7,
0x40, 0x40, 0x81, 0x8e, 0x79, 0xfe, 0xb9, 0x07, 0x97, 0xd4, 0xd2, 0xd0, 0x8d, 0x39, 0x8f, 0x53,
0xe4, 0xc2, 0x1c, 0xac, 0xf9, 0x19, 0x42, 0x7d, 0xa7, 0x17, 0x9a, 0x76, 0x9a, 0x40, 0x3b, 0x0b,
0xf8, 0x99, 0x88, 0x71, 0x3b, 0xbe, 0xf8, 0xad, 0x73, 0x96, 0xc5, 0x32, 0x67, 0x51, 0x37, 0x61,
0x6a, 0x52, 0xe6, 0x92, 0xe6, 0x53, 0x79, 0x13, 0x56, 0xc2, 0xa5, 0x0c, 0xd4, 0x04, 0xab, 0x32,
0x50, 0xa4, 0xbe, 0xe9, 0xa7, 0x43, 0x18, 0xdc, 0x63, 0x31, 0xe3, 0x6c, 0x3f, 0x8e, 0xab, 0xfc,
0xaf, 0xc1, 0xd5, 0x86, 0x3e, 0x75, 0xd6, 0x1e, 0xc0, 0xfa, 0x3d, 0x76, 0x32, 0x9b, 0x1c, 0xb2,
0xf3, 0xb2, 0x22, 0x4b, 0xa0, 0x5d, 0x9c, 0xa5, 0xcf, 0xd4, 0x7e, 0x89, 0xdf, 0xe4, 0x6d, 0x80,
0x18, 0x69, 0x46, 0x45, 0xc6, 0xc6, 0xfa, 0x1e, 0x5e, 0x20, 0xc7, 0x19, 0x1b, 0xd3, 0x8f, 0x80,
0xd8, 0x7c, 0xd4, 0x12, 0xf0, 0x04, 0xcc, 0x4e, 0x46, 0xc5, 0xbc, 0xe0, 0x6c, 0xaa, 0x0f, 0xbf,
0x0d, 0xd1, 0x0f, 0xa0, 0x77, 0x14, 0xcc, 0x7d, 0xf6, 0xb5, 0x7a, 0xf3, 0x83, 0x29, 0x53, 0x30,
0x47, 0xf5, 0x34, 0x29, 0x93, 0xe8, 0xa6, 0x39, 0x2c, 0x49, 0x42, 0x64, 0x1a, 0xb2, 0x82, 0x47,
0x89, 0xac, 0x7a, 0x2a, 0xa6, 0x16, 0x54, 0xdb, 0xee, 0x56, 0xc3, 0x76, 0xab, 0xc8, 0x46, 0x5f,
0x82, 0xaa, 0x7d, 0x75, 0xb0, 0xbd, 0xbf, 0x18, 0x42, 0xc7, 0x04, 0x8a, 0xe4, 0x27, 0xd0, 0x77,
0x32, 0x7e, 0x72, 0x4d, 0x6d, 0x47, 0x53, 0x09, 0x61, 0x78, 0xbd, 0xb9, 0x53, 0x89, 0xfd, 0x9d,
0x6f, 0x7e, 0xf5, 0xef, 0xbf, 0x68, 0x0d, 0xc8, 0xd6, 0xee, 0xf9, 0x87, 0xbb, 0x2a, 0xa5, 0xdf,
0x15, 0x15, 0x0a, 0x79, 0x51, 0xf4, 0x14, 0x56, 0xdc, 0x8a, 0x00, 0xb9, 0xee, 0x1a, 0xde, 0xca,
0x68, 0x6f, 0x5f, 0xd0, 0xab, 0x86, 0xbb, 0x2e, 0x86, 0xdb, 0x22, 0x9b, 0xf6, 0x70, 0x26, 0x80,
0x63, 0xe2, 0x6a, 0xcf, 0x7e, 0x79, 0x46, 0x34, 0xbf, 0xe6, 0x17, 0x69, 0xc3, 0xab, 0xf5, 0x57,
0x66, 0xea, 0x59, 0x1a, 0x1d, 0x88, 0xa1, 0x08, 0x59, 0xc3, 0xa1, 0xec, 0x87, 0x67, 0xe4, 0xc7,
0xd0, 0x31, 0xaf, 0x6c, 0xc8, 0x15, 0xeb, 0x4d, 0x91, 0xfd, 0x6e, 0x67, 0x38, 0xa8, 0x77, 0xe8,
0x60, 0x4c, 0x70, 0xbe, 0x4c, 0x6b, 0x9c, 0x3f, 0xf6, 0x6e, 0x92, 0x43, 0xb8, 0xac, 0x4e, 0xff,
0x09, 0xfb, 0xdf, 0xac, 0xa4, 0xe1, 0xbd, 0xdc, 0x2d, 0x8f, 0xdc, 0x81, 0x65, 0xfd, 0xf0, 0x88,
0x6c, 0x35, 0xbf, 0x7e, 0x1a, 0x5e, 0xa9, 0xe1, 0x4a, 0xe9, 0xf7, 0x01, 0xca, 0x77, 0x36, 0x64,
0x70, 0xd1, 0x73, 0x20, 0x23, 0xc4, 0x86, 0x47, 0x39, 0x13, 0xf1, 0xcc, 0xc8, 0x7d, 0xc6, 0x43,
0xbe, 0x55, 0xd2, 0x37, 0x3e, 0xf0, 0x79, 0x05, 0x43, 0xba, 0x25, 0x64, 0xb7, 0x46, 0x56, 0x50,
0x76, 0x09, 0x7b, 0xa6, 0x2f, 0xb9, 0xef, 0x41, 0xd7, 0x7a, 0xbb, 0x43, 0x34, 0x87, 0xfa, 0xbb,
0x9f, 0xe1, 0xb0, 0xa9, 0x4b, 0x4d, 0xf7, 0x0f, 0xa0, 0xef, 0x3c, 0xc2, 0x31, 0x27, 0xa3, 0xe9,
0x89, 0x8f, 0x39, 0x19, 0xcd, 0xef, 0x76, 0x7e, 0x04, 0x5d, 0xeb, 0x29, 0x0d, 0xb1, 0x6e, 0x33,
0x2a, 0x4f, 0x65, 0xcc, 0x8c, 0x1a, 0x5e, 0xde, 0xd0, 0x4d, 0xb1, 0xde, 0x15, 0xda, 0xc1, 0xf5,
0x8a, 0x9b, 0x5e, 0x54, 0x92, 0x9f, 0xc0, 0x8a, 0xfb, 0x84, 0xc6, 0x9c, 0xaa, 0xc6, 0xc7, 0x38,
0xe6, 0x54, 0x5d, 0xf0, 0xee, 0x46, 0x29, 0xe4, 0xcd, 0x0d, 0x33, 0xc8, 0xee, 0x0b, 0x55, 0x10,
0x79, 0x49, 0x7e, 0x88, 0xa6, 0x43, 0x5d, 0xbd, 0x93, 0xf2, 0x49, 0x91, 0x7b, 0x41, 0x6f, 0xb4,
0xbd, 0x76, 0x4b, 0x4f, 0xd7, 0x05, 0xf3, 0x2e, 0x29, 0x57, 0x40, 0x3e, 0x87, 0x4b, 0xea, 0x0a,
0x9e, 0x5c, 0x2e, 0xb5, 0xda, 0x4a, 0x2a, 0x87, 0x5b, 0x55, 0x58, 0x31, 0xdb, 0x10, 0xcc, 0xfa,
0xa4, 0x8b, 0xcc, 0x26, 0x8c, 0x47, 0xc8, 0x23, 0x86, 0x55, 0xb7, 0x7a, 0x5b, 0x18, 0x71, 0x34,
0xde, 0xe8, 0x18, 0x71, 0x34, 0x97, 0x82, 0x5d, 0x23, 0xa3, 0x8d, 0xcb, 0xae, 0xbe, 0xac, 0xfa,
0x63, 0xe8, 0xd9, 0xef, 0x3d, 0xc8, 0xd0, 0x5a, 0x79, 0xe5, 0x6d, 0xc8, 0xf0, 0x5a, 0x63, 0x9f,
0xbb, 0xb5, 0xa4, 0x67, 0x0f, 0x43, 0x7e, 0x04, 0xab, 0xd6, 0x05, 0xc0, 0xf1, 0x3c, 0x19, 0x1b,
0xd5, 0xa9, 0x5f, 0x39, 0x0e, 0x9b, 0xa2, 0x58, 0x7a, 0x45, 0x30, 0x5e, 0xa7, 0x0e, 0x63, 0x54,
0x9b, 0xbb, 0xd0, 0xb5, 0x2f, 0x17, 0x5e, 0xc1, 0xf7, 0x8a, 0xd5, 0x65, 0x5f, 0xf3, 0xdd, 0xf2,
0xc8, 0x2f, 0x3d, 0xe8, 0xd9, 0x17, 0xd5, 0xc4, 0xc9, 0xcb, 0x2a, 0x7c, 0x06, 0x76, 0x9f, 0xcd,
0x88, 0x7e, 0x25, 0x26, 0x79, 0x74, 0xf3, 0x91, 0x23, 0xe4, 0x17, 0xce, 0xfd, 0xcb, 0x8e, 0xfd,
0x9e, 0xf4, 0x65, 0xb5, 0xd3, 0xbe, 0x92, 0x7d, 0xb9, 0xfb, 0x42, 0xdc, 0x12, 0xbd, 0xbc, 0xe5,
0x91, 0x8f, 0xe5, 0xb3, 0x60, 0x1d, 0x32, 0x11, 0xcb, 0xbc, 0x55, 0xc5, 0x66, 0x3f, 0xb6, 0xdd,
0xf6, 0x6e, 0x79, 0xe4, 0x4f, 0xe4, 0x53, 0x52, 0xf5, 0xad, 0x90, 0xfe, 0x9b, 0x7e, 0x4f, 0xdf,
0x13, 0x2b, 0x7a, 0x87, 0x5e, 0x75, 0x56, 0x54, 0xb5, 0xef, 0x47, 0x00, 0x65, 0xfc, 0x4b, 0x2a,
0xc1, 0xa0, 0xb1, 0x7c, 0xf5, 0x10, 0xd9, 0xdd, 0x55, 0x1d, 0x33, 0x4a, 0x63, 0xd0, 0xb3, 0x22,
0xcf, 0xc2, 0x6c, 0x6b, 0x3d, 0x8e, 0x1d, 0x0e, 0x9b, 0xba, 0x14, 0xff, 0x6f, 0x0b, 0xfe, 0x6f,
0x93, 0x6b, 0x36, 0xff, 0xdd, 0x17, 0x76, 0xdc, 0xfb, 0x92, 0x7c, 0x05, 0xfd, 0xc3, 0x34, 0x7d,
0x3a, 0xcb, 0x4c, 0x5a, 0xe3, 0x46, 0x72, 0x18, 0x7b, 0x0f, 0x2b, 0x8b, 0xa2, 0xef, 0x0a, 0xce,
0xd7, 0xc8, 0x55, 0x97, 0x73, 0x19, 0x8d, 0xbf, 0x24, 0x01, 0xac, 0x1b, 0xaf, 0x67, 0x16, 0x32,
0x74, 0xf9, 0xd8, 0x41, 0x71, 0x6d, 0x0c, 0x27, 0x0e, 0x31, 0x63, 0x14, 0x9a, 0xe7, 0x2d, 0x8f,
0x1c, 0x41, 0xef, 0x1e, 0x1b, 0xa7, 0x21, 0x53, 0xd1, 0xd7, 0x46, 0x39, 0x73, 0x13, 0xb5, 0x0d,
0xfb, 0x0e, 0xe8, 0x5a, 0x82, 0x2c, 0x98, 0xe7, 0xec, 0xeb, 0xdd, 0x17, 0x2a, 0xac, 0x7b, 0xa9,
0x2d, 0x81, 0x0e, 0x45, 0x1d, 0x4b, 0x50, 0x89, 0x5d, 0x1d, 0x4b, 0x50, 0x8b, 0x5d, 0x1d, 0x4b,
0xa0, 0x43, 0x61, 0x12, 0x63, 0x44, 0x5b, 0x09, 0x77, 0x8d, 0xef, 0xbc, 0x28, 0x48, 0x1e, 0xde,
0xb8, 0x98, 0xc0, 0x1d, 0xed, 0xa6, 0x3b, 0xda, 0x31, 0xf4, 0xef, 0x31, 0x29, 0x2c, 0x59, 0x6f,
0x1c, 0xba, 0xa6, 0xc5, 0xae, 0x4d, 0x56, 0xcd, 0x8e, 0xe8, 0x73, 0x0d, 0xbd, 0x28, 0xf6, 0x91,
0x1f, 0x43, 0xf7, 0x21, 0xe3, 0xba, 0xc0, 0x68, 0x22, 0x90, 0x4a, 0xc5, 0x71, 0xd8, 0x50, 0x9f,
0xa4, 0x37, 0x04, 0xb7, 0x21, 0x19, 0x18, 0x6e, 0xbb, 0x2c, 0x9c, 0x30, 0x69, 0x04, 0x46, 0x51,
0xf8, 0x92, 0xfc, 0xa1, 0x60, 0x6e, 0x6e, 0x1f, 0xb6, 0xac, 0xba, 0x94, 0xcd, 0x7c, 0xb5, 0x82,
0x37, 0x71, 0x4e, 0xd2, 0x90, 0x59, 0x2e, 0x2f, 0x81, 0xae, 0x75, 0xa3, 0x64, 0x0e, 0x54, 0xfd,
0x9a, 0xca, 0x1c, 0xa8, 0x86, 0x0b, 0x28, 0xba, 0x2d, 0xc6, 0xa1, 0xe4, 0x46, 0x39, 0x8e, 0xbc,
0x74, 0x2a, 0x47, 0xda, 0x7d, 0x11, 0x4c, 0xf9, 0x4b, 0xf2, 0x44, 0xbc, 0x52, 0xb3, 0x8b, 0xa8,
0x65, 0x04, 0x54, 0xad, 0xb7, 0x1a, 0x61, 0x59, 0x5d, 0x6e, 0x54, 0x24, 0x87, 0x12, 0x9e, 0xf1,
0xb7, 0x01, 0x8e, 0x79, 0x9a, 0xdd, 0x0b, 0xd8, 0x34, 0x4d, 0x4a, 0x4b, 0x56, 0x16, 0x0a, 0x4b,
0x4b, 0x66, 0x55, 0x0b, 0xc9, 0x13, 0x2b, 0x06, 0x75, 0x6a, 0xd0, 0x5a, 0xb9, 0x2e, 0xac, 0x25,
0x1a, 0x81, 0x34, 0xd4, 0x13, 0x75, 0x38, 0x2a, 0x8b, 0x24, 0x56, 0x38, 0xea, 0x54, 0x59, 0xac,
0x70, 0xd4, 0xad, 0xa6, 0x60, 0x38, 0x5a, 0x66, 0x66, 0x26, 0x1c, 0xad, 0x25, 0x7d, 0xc6, 0x86,
0xd6, 0xd3, 0xb8, 0x93, 0x25, 0xf1, 0x5f, 0x39, 0xdf, 0xfb, 0x9f, 0x00, 0x00, 0x00, 0xff, 0xff,
0x15, 0xb0, 0xd3, 0xa4, 0xc7, 0x33, 0x00, 0x00,
}

@ -38,6 +38,9 @@ service Lightning {
};
}
rpc SignMessage (SignMessageRequest) returns (SignMessageResponse);
rpc VerifyMessage (VerifyMessageRequest) returns (VerifyMessageResponse);
rpc ConnectPeer (ConnectPeerRequest) returns (ConnectPeerResponse) {
option (google.api.http) = {
post: "/v1/peers"
@ -247,6 +250,21 @@ message NewAddressResponse {
string address = 1 [json_name = "address"];
}
message SignMessageRequest {
bytes msg = 1 [ json_name = "msg" ];
}
message SignMessageResponse {
string signature = 1 [ json_name = "signature" ];
}
message VerifyMessageRequest {
bytes msg = 1 [ json_name = "msg" ];
string signature = 2 [ json_name = "signature" ];
}
message VerifyMessageResponse {
bool valid = 1 [ json_name = "valid" ];
}
message ConnectPeerRequest {
LightningAddress addr = 1;
bool perm = 2;

@ -1706,6 +1706,23 @@
"lnrpcSetAliasResponse": {
"type": "object"
},
"lnrpcSignMessageRequest": {
"type": "object",
"properties": {
"msg": {
"type": "string",
"format": "byte"
}
}
},
"lnrpcSignMessageResponse": {
"type": "object",
"properties": {
"signature": {
"type": "string"
}
}
},
"lnrpcStopRequest": {
"type": "object"
},
@ -1754,6 +1771,27 @@
}
}
},
"lnrpcVerifyMessageRequest": {
"type": "object",
"properties": {
"msg": {
"type": "string",
"format": "byte"
},
"signature": {
"type": "string"
}
}
},
"lnrpcVerifyMessageResponse": {
"type": "object",
"properties": {
"valid": {
"type": "boolean",
"format": "boolean"
}
}
},
"lnrpcWalletBalanceRequest": {
"type": "object",
"properties": {

@ -23,7 +23,7 @@ func newNodeSigner(key *btcec.PrivateKey) *nodeSigner {
}
// SignMessage signs a double-sha256 digest of the passed msg under the
// resident node private key. If the target public key is _not_ the node's
// resident node's private key. If the target public key is _not_ the node's
// private key, then an error will be returned.
func (n *nodeSigner) SignMessage(pubKey *btcec.PublicKey,
msg []byte) (*btcec.Signature, error) {
@ -44,6 +44,33 @@ func (n *nodeSigner) SignMessage(pubKey *btcec.PublicKey,
return sign, nil
}
// SignCompact signs a double-sha256 digest of the passed msg under the
// resident node's private key. If the target public key is _not_ the node's
// private key, then an error will be returned. The returned signature is a
// pubkey-recoverable signature.
func (n *nodeSigner) SignCompact(pubKey *btcec.PublicKey,
msg []byte) ([]byte, error) {
// If this isn't our identity public key, then we'll exit early with an
// error as we can't sign with this key.
if !pubKey.IsEqual(n.privKey.PubKey()) {
return nil, fmt.Errorf("unknown public key")
}
// Otherwise, we'll sign the dsha256 of the target message.
digest := chainhash.DoubleHashB(msg)
// Should the signature reference a compressed public key or not.
compressedPubKey := false
// btcec.SignCompact returns a pubkey-recoverable signature
sign, err := btcec.SignCompact(
btcec.S256(), n.privKey, digest, compressedPubKey)
if err != nil {
return nil, fmt.Errorf("can't sign the message: %v", err)
}
return sign, nil
}
// A compile time check to ensure that nodeSigner implements the MessageSigner
// interface.
var _ lnwallet.MessageSigner = (*nodeSigner)(nil)

@ -31,6 +31,7 @@ import (
"github.com/roasbeef/btcd/wire"
"github.com/roasbeef/btcutil"
"github.com/roasbeef/btcwallet/waddrmgr"
"github.com/tv42/zbase32"
"golang.org/x/net/context"
)
@ -188,6 +189,61 @@ func (r *rpcServer) NewWitnessAddress(ctx context.Context,
return &lnrpc.NewAddressResponse{Address: addr.String()}, nil
}
// SignMessage signs a message with the resident node's private key. The
// returned signature string is zbase32 encoded and pubkey recoverable,
// meaning that only the message digest and signature are needed for
// verification.
func (r *rpcServer) SignMessage(ctx context.Context,
in *lnrpc.SignMessageRequest) (*lnrpc.SignMessageResponse, error) {
if in.Msg == nil {
return nil, fmt.Errorf("need a message to sign")
}
pubkey := r.server.identityPriv.PubKey()
sigBytes, err := r.server.nodeSigner.SignCompact(pubkey, in.Msg)
if err != nil {
return nil, err
}
sig := zbase32.EncodeToString(sigBytes)
return &lnrpc.SignMessageResponse{Signature: sig}, nil
}
// VerifyMessage verifies a signature over a msg. The signature must be
// zbase32 encoded and signed by an active node in the resident node's
// channel database.
func (r *rpcServer) VerifyMessage(ctx context.Context,
in *lnrpc.VerifyMessageRequest) (*lnrpc.VerifyMessageResponse, error) {
if in.Msg == nil {
return nil, fmt.Errorf("need a message to verify")
}
// The signature should be zbase32 encoded
sig, err := zbase32.DecodeString(in.Signature)
if err != nil {
return nil, fmt.Errorf("failed to decode signature: %v", err)
}
digest := chainhash.DoubleHashB(in.Msg)
// RecoverCompact both recovers the pubkey and validates the signature.
pubKey, _, err := btcec.RecoverCompact(btcec.S256(), sig, digest)
if err != nil {
return &lnrpc.VerifyMessageResponse{Valid: false}, nil
}
graph := r.server.chanDB.ChannelGraph()
// TODO(phlip9): Require valid nodes to have capital in active channels.
_, active, err := graph.HasLightningNode(pubKey)
if err != nil {
return nil, fmt.Errorf("failed to query graph: %v", err)
}
return &lnrpc.VerifyMessageResponse{Valid: active}, nil
}
// ConnectPeer attempts to establish a connection to a remote peer.
func (r *rpcServer) ConnectPeer(ctx context.Context,
in *lnrpc.ConnectPeerRequest) (*lnrpc.ConnectPeerResponse, error) {