lnrpc+rpc+lnd: add new Stop command for gracefully shutting down lnd

This commit adds simple non-blocking stop command to lncli, with an
appropriate proto update and implementation within the rpcserver.  When
invoked the interrupt handler routine in signal.go with begin the graceful
shutdown of lnd.
This commit is contained in:
halseth 2017-05-11 22:55:56 +01:00 committed by Olaoluwa Osuntokun
parent 2a602b6d61
commit aa4e166539
7 changed files with 422 additions and 312 deletions

@ -1550,3 +1550,23 @@ func listChainTxns(ctx *cli.Context) error {
printRespJSON(resp) printRespJSON(resp)
return nil return nil
} }
var stopCommand = cli.Command{
Name: "stop",
Usage: "Stop and shutdown the daemon.",
Description: "Gracefully stop all daemon subsystems before stopping the daemon itself. This is equivalent to stopping it using CTRL-C.",
Action: stopDaemon,
}
func stopDaemon(ctx *cli.Context) error {
ctxb := context.Background()
client, cleanUp := getClient(ctx)
defer cleanUp()
_, err := client.StopDaemon(ctxb, &lnrpc.StopRequest{})
if err != nil {
return err
}
return nil
}

@ -79,6 +79,7 @@ func main() {
debugLevelCommand, debugLevelCommand,
decodePayReqComamnd, decodePayReqComamnd,
listChainTxnsCommand, listChainTxnsCommand,
stopCommand,
} }
if err := app.Run(os.Args); err != nil { if err := app.Run(os.Args); err != nil {

@ -65,6 +65,8 @@ It has these top-level messages:
ChanInfoRequest ChanInfoRequest
NetworkInfoRequest NetworkInfoRequest
NetworkInfo NetworkInfo
StopRequest
StopResponse
GraphTopologySubscription GraphTopologySubscription
GraphTopologyUpdate GraphTopologyUpdate
NodeUpdate NodeUpdate
@ -2150,13 +2152,29 @@ func (m *NetworkInfo) GetMaxChannelSize() int64 {
return 0 return 0
} }
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} }
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} }
type GraphTopologySubscription struct { type GraphTopologySubscription struct {
} }
func (m *GraphTopologySubscription) Reset() { *m = GraphTopologySubscription{} } func (m *GraphTopologySubscription) Reset() { *m = GraphTopologySubscription{} }
func (m *GraphTopologySubscription) String() string { return proto.CompactTextString(m) } func (m *GraphTopologySubscription) String() string { return proto.CompactTextString(m) }
func (*GraphTopologySubscription) ProtoMessage() {} func (*GraphTopologySubscription) ProtoMessage() {}
func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{56} } func (*GraphTopologySubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} }
type GraphTopologyUpdate struct { type GraphTopologyUpdate struct {
NodeUpdates []*NodeUpdate `protobuf:"bytes,1,rep,name=node_updates,json=nodeUpdates" json:"node_updates,omitempty"` NodeUpdates []*NodeUpdate `protobuf:"bytes,1,rep,name=node_updates,json=nodeUpdates" json:"node_updates,omitempty"`
@ -2167,7 +2185,7 @@ type GraphTopologyUpdate struct {
func (m *GraphTopologyUpdate) Reset() { *m = GraphTopologyUpdate{} } func (m *GraphTopologyUpdate) Reset() { *m = GraphTopologyUpdate{} }
func (m *GraphTopologyUpdate) String() string { return proto.CompactTextString(m) } func (m *GraphTopologyUpdate) String() string { return proto.CompactTextString(m) }
func (*GraphTopologyUpdate) ProtoMessage() {} func (*GraphTopologyUpdate) ProtoMessage() {}
func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{57} } func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} }
func (m *GraphTopologyUpdate) GetNodeUpdates() []*NodeUpdate { func (m *GraphTopologyUpdate) GetNodeUpdates() []*NodeUpdate {
if m != nil { if m != nil {
@ -2200,7 +2218,7 @@ type NodeUpdate struct {
func (m *NodeUpdate) Reset() { *m = NodeUpdate{} } func (m *NodeUpdate) Reset() { *m = NodeUpdate{} }
func (m *NodeUpdate) String() string { return proto.CompactTextString(m) } func (m *NodeUpdate) String() string { return proto.CompactTextString(m) }
func (*NodeUpdate) ProtoMessage() {} func (*NodeUpdate) ProtoMessage() {}
func (*NodeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{58} } func (*NodeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} }
func (m *NodeUpdate) GetAddresses() []string { func (m *NodeUpdate) GetAddresses() []string {
if m != nil { if m != nil {
@ -2242,7 +2260,7 @@ type ChannelEdgeUpdate struct {
func (m *ChannelEdgeUpdate) Reset() { *m = ChannelEdgeUpdate{} } func (m *ChannelEdgeUpdate) Reset() { *m = ChannelEdgeUpdate{} }
func (m *ChannelEdgeUpdate) String() string { return proto.CompactTextString(m) } func (m *ChannelEdgeUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelEdgeUpdate) ProtoMessage() {} func (*ChannelEdgeUpdate) ProtoMessage() {}
func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{59} } func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} }
func (m *ChannelEdgeUpdate) GetChanId() uint64 { func (m *ChannelEdgeUpdate) GetChanId() uint64 {
if m != nil { if m != nil {
@ -2296,7 +2314,7 @@ type ClosedChannelUpdate struct {
func (m *ClosedChannelUpdate) Reset() { *m = ClosedChannelUpdate{} } func (m *ClosedChannelUpdate) Reset() { *m = ClosedChannelUpdate{} }
func (m *ClosedChannelUpdate) String() string { return proto.CompactTextString(m) } func (m *ClosedChannelUpdate) String() string { return proto.CompactTextString(m) }
func (*ClosedChannelUpdate) ProtoMessage() {} func (*ClosedChannelUpdate) ProtoMessage() {}
func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{60} } func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} }
func (m *ClosedChannelUpdate) GetChanId() uint64 { func (m *ClosedChannelUpdate) GetChanId() uint64 {
if m != nil { if m != nil {
@ -2333,7 +2351,7 @@ type SetAliasRequest struct {
func (m *SetAliasRequest) Reset() { *m = SetAliasRequest{} } func (m *SetAliasRequest) Reset() { *m = SetAliasRequest{} }
func (m *SetAliasRequest) String() string { return proto.CompactTextString(m) } func (m *SetAliasRequest) String() string { return proto.CompactTextString(m) }
func (*SetAliasRequest) ProtoMessage() {} func (*SetAliasRequest) ProtoMessage() {}
func (*SetAliasRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{61} } func (*SetAliasRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} }
func (m *SetAliasRequest) GetNewAlias() string { func (m *SetAliasRequest) GetNewAlias() string {
if m != nil { if m != nil {
@ -2348,7 +2366,7 @@ type SetAliasResponse struct {
func (m *SetAliasResponse) Reset() { *m = SetAliasResponse{} } func (m *SetAliasResponse) Reset() { *m = SetAliasResponse{} }
func (m *SetAliasResponse) String() string { return proto.CompactTextString(m) } func (m *SetAliasResponse) String() string { return proto.CompactTextString(m) }
func (*SetAliasResponse) ProtoMessage() {} func (*SetAliasResponse) ProtoMessage() {}
func (*SetAliasResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{62} } func (*SetAliasResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} }
type Invoice struct { type Invoice struct {
Memo string `protobuf:"bytes,1,opt,name=memo" json:"memo,omitempty"` Memo string `protobuf:"bytes,1,opt,name=memo" json:"memo,omitempty"`
@ -2365,7 +2383,7 @@ type Invoice struct {
func (m *Invoice) Reset() { *m = Invoice{} } func (m *Invoice) Reset() { *m = Invoice{} }
func (m *Invoice) String() string { return proto.CompactTextString(m) } func (m *Invoice) String() string { return proto.CompactTextString(m) }
func (*Invoice) ProtoMessage() {} func (*Invoice) ProtoMessage() {}
func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{63} } func (*Invoice) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{65} }
func (m *Invoice) GetMemo() string { func (m *Invoice) GetMemo() string {
if m != nil { if m != nil {
@ -2438,7 +2456,7 @@ type AddInvoiceResponse struct {
func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} } func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} }
func (m *AddInvoiceResponse) String() string { return proto.CompactTextString(m) } func (m *AddInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*AddInvoiceResponse) ProtoMessage() {} func (*AddInvoiceResponse) ProtoMessage() {}
func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{64} } func (*AddInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{66} }
func (m *AddInvoiceResponse) GetRHash() []byte { func (m *AddInvoiceResponse) GetRHash() []byte {
if m != nil { if m != nil {
@ -2462,7 +2480,7 @@ type PaymentHash struct {
func (m *PaymentHash) Reset() { *m = PaymentHash{} } func (m *PaymentHash) Reset() { *m = PaymentHash{} }
func (m *PaymentHash) String() string { return proto.CompactTextString(m) } func (m *PaymentHash) String() string { return proto.CompactTextString(m) }
func (*PaymentHash) ProtoMessage() {} func (*PaymentHash) ProtoMessage() {}
func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{65} } func (*PaymentHash) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{67} }
func (m *PaymentHash) GetRHashStr() string { func (m *PaymentHash) GetRHashStr() string {
if m != nil { if m != nil {
@ -2485,7 +2503,7 @@ type ListInvoiceRequest struct {
func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} } func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} }
func (m *ListInvoiceRequest) String() string { return proto.CompactTextString(m) } func (m *ListInvoiceRequest) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceRequest) ProtoMessage() {} func (*ListInvoiceRequest) ProtoMessage() {}
func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{66} } func (*ListInvoiceRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} }
func (m *ListInvoiceRequest) GetPendingOnly() bool { func (m *ListInvoiceRequest) GetPendingOnly() bool {
if m != nil { if m != nil {
@ -2501,7 +2519,7 @@ type ListInvoiceResponse struct {
func (m *ListInvoiceResponse) Reset() { *m = ListInvoiceResponse{} } func (m *ListInvoiceResponse) Reset() { *m = ListInvoiceResponse{} }
func (m *ListInvoiceResponse) String() string { return proto.CompactTextString(m) } func (m *ListInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceResponse) ProtoMessage() {} func (*ListInvoiceResponse) ProtoMessage() {}
func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{67} } func (*ListInvoiceResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} }
func (m *ListInvoiceResponse) GetInvoices() []*Invoice { func (m *ListInvoiceResponse) GetInvoices() []*Invoice {
if m != nil { if m != nil {
@ -2516,7 +2534,7 @@ type InvoiceSubscription struct {
func (m *InvoiceSubscription) Reset() { *m = InvoiceSubscription{} } func (m *InvoiceSubscription) Reset() { *m = InvoiceSubscription{} }
func (m *InvoiceSubscription) String() string { return proto.CompactTextString(m) } func (m *InvoiceSubscription) String() string { return proto.CompactTextString(m) }
func (*InvoiceSubscription) ProtoMessage() {} func (*InvoiceSubscription) ProtoMessage() {}
func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{68} } func (*InvoiceSubscription) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} }
type Payment struct { type Payment struct {
PaymentHash string `protobuf:"bytes,1,opt,name=payment_hash" json:"payment_hash,omitempty"` PaymentHash string `protobuf:"bytes,1,opt,name=payment_hash" json:"payment_hash,omitempty"`
@ -2529,7 +2547,7 @@ type Payment struct {
func (m *Payment) Reset() { *m = Payment{} } func (m *Payment) Reset() { *m = Payment{} }
func (m *Payment) String() string { return proto.CompactTextString(m) } func (m *Payment) String() string { return proto.CompactTextString(m) }
func (*Payment) ProtoMessage() {} func (*Payment) ProtoMessage() {}
func (*Payment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{69} } func (*Payment) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{71} }
func (m *Payment) GetPaymentHash() string { func (m *Payment) GetPaymentHash() string {
if m != nil { if m != nil {
@ -2572,7 +2590,7 @@ type ListPaymentsRequest struct {
func (m *ListPaymentsRequest) Reset() { *m = ListPaymentsRequest{} } func (m *ListPaymentsRequest) Reset() { *m = ListPaymentsRequest{} }
func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) } func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsRequest) ProtoMessage() {} func (*ListPaymentsRequest) ProtoMessage() {}
func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{70} } func (*ListPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{72} }
type ListPaymentsResponse struct { type ListPaymentsResponse struct {
Payments []*Payment `protobuf:"bytes,1,rep,name=payments" json:"payments,omitempty"` Payments []*Payment `protobuf:"bytes,1,rep,name=payments" json:"payments,omitempty"`
@ -2581,7 +2599,7 @@ type ListPaymentsResponse struct {
func (m *ListPaymentsResponse) Reset() { *m = ListPaymentsResponse{} } func (m *ListPaymentsResponse) Reset() { *m = ListPaymentsResponse{} }
func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) } func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsResponse) ProtoMessage() {} func (*ListPaymentsResponse) ProtoMessage() {}
func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{71} } func (*ListPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{73} }
func (m *ListPaymentsResponse) GetPayments() []*Payment { func (m *ListPaymentsResponse) GetPayments() []*Payment {
if m != nil { if m != nil {
@ -2596,7 +2614,7 @@ type DeleteAllPaymentsRequest struct {
func (m *DeleteAllPaymentsRequest) Reset() { *m = DeleteAllPaymentsRequest{} } func (m *DeleteAllPaymentsRequest) Reset() { *m = DeleteAllPaymentsRequest{} }
func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) } func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsRequest) ProtoMessage() {} func (*DeleteAllPaymentsRequest) ProtoMessage() {}
func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{72} } func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{74} }
type DeleteAllPaymentsResponse struct { type DeleteAllPaymentsResponse struct {
} }
@ -2604,7 +2622,7 @@ type DeleteAllPaymentsResponse struct {
func (m *DeleteAllPaymentsResponse) Reset() { *m = DeleteAllPaymentsResponse{} } func (m *DeleteAllPaymentsResponse) Reset() { *m = DeleteAllPaymentsResponse{} }
func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) } func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsResponse) ProtoMessage() {} func (*DeleteAllPaymentsResponse) ProtoMessage() {}
func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{73} } func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{75} }
type DebugLevelRequest struct { type DebugLevelRequest struct {
Show bool `protobuf:"varint,1,opt,name=show" json:"show,omitempty"` Show bool `protobuf:"varint,1,opt,name=show" json:"show,omitempty"`
@ -2614,7 +2632,7 @@ type DebugLevelRequest struct {
func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} } func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} }
func (m *DebugLevelRequest) String() string { return proto.CompactTextString(m) } func (m *DebugLevelRequest) String() string { return proto.CompactTextString(m) }
func (*DebugLevelRequest) ProtoMessage() {} func (*DebugLevelRequest) ProtoMessage() {}
func (*DebugLevelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{74} } func (*DebugLevelRequest) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} }
func (m *DebugLevelRequest) GetShow() bool { func (m *DebugLevelRequest) GetShow() bool {
if m != nil { if m != nil {
@ -2637,7 +2655,7 @@ type DebugLevelResponse struct {
func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} } func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} }
func (m *DebugLevelResponse) String() string { return proto.CompactTextString(m) } func (m *DebugLevelResponse) String() string { return proto.CompactTextString(m) }
func (*DebugLevelResponse) ProtoMessage() {} func (*DebugLevelResponse) ProtoMessage() {}
func (*DebugLevelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{75} } func (*DebugLevelResponse) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} }
func (m *DebugLevelResponse) GetSubSystems() string { func (m *DebugLevelResponse) GetSubSystems() string {
if m != nil { if m != nil {
@ -2653,7 +2671,7 @@ type PayReqString struct {
func (m *PayReqString) Reset() { *m = PayReqString{} } func (m *PayReqString) Reset() { *m = PayReqString{} }
func (m *PayReqString) String() string { return proto.CompactTextString(m) } func (m *PayReqString) String() string { return proto.CompactTextString(m) }
func (*PayReqString) ProtoMessage() {} func (*PayReqString) ProtoMessage() {}
func (*PayReqString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{76} } func (*PayReqString) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{78} }
func (m *PayReqString) GetPayReq() string { func (m *PayReqString) GetPayReq() string {
if m != nil { if m != nil {
@ -2671,7 +2689,7 @@ type PayReq struct {
func (m *PayReq) Reset() { *m = PayReq{} } func (m *PayReq) Reset() { *m = PayReq{} }
func (m *PayReq) String() string { return proto.CompactTextString(m) } func (m *PayReq) String() string { return proto.CompactTextString(m) }
func (*PayReq) ProtoMessage() {} func (*PayReq) ProtoMessage() {}
func (*PayReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{77} } func (*PayReq) Descriptor() ([]byte, []int) { return fileDescriptor0, []int{79} }
func (m *PayReq) GetDestination() string { func (m *PayReq) GetDestination() string {
if m != nil { if m != nil {
@ -2755,6 +2773,8 @@ func init() {
proto.RegisterType((*ChanInfoRequest)(nil), "lnrpc.ChanInfoRequest") proto.RegisterType((*ChanInfoRequest)(nil), "lnrpc.ChanInfoRequest")
proto.RegisterType((*NetworkInfoRequest)(nil), "lnrpc.NetworkInfoRequest") proto.RegisterType((*NetworkInfoRequest)(nil), "lnrpc.NetworkInfoRequest")
proto.RegisterType((*NetworkInfo)(nil), "lnrpc.NetworkInfo") proto.RegisterType((*NetworkInfo)(nil), "lnrpc.NetworkInfo")
proto.RegisterType((*StopRequest)(nil), "lnrpc.StopRequest")
proto.RegisterType((*StopResponse)(nil), "lnrpc.StopResponse")
proto.RegisterType((*GraphTopologySubscription)(nil), "lnrpc.GraphTopologySubscription") proto.RegisterType((*GraphTopologySubscription)(nil), "lnrpc.GraphTopologySubscription")
proto.RegisterType((*GraphTopologyUpdate)(nil), "lnrpc.GraphTopologyUpdate") proto.RegisterType((*GraphTopologyUpdate)(nil), "lnrpc.GraphTopologyUpdate")
proto.RegisterType((*NodeUpdate)(nil), "lnrpc.NodeUpdate") proto.RegisterType((*NodeUpdate)(nil), "lnrpc.NodeUpdate")
@ -2823,6 +2843,7 @@ type LightningClient interface {
GetNodeInfo(ctx context.Context, in *NodeInfoRequest, opts ...grpc.CallOption) (*NodeInfo, error) GetNodeInfo(ctx context.Context, in *NodeInfoRequest, opts ...grpc.CallOption) (*NodeInfo, error)
QueryRoutes(ctx context.Context, in *QueryRoutesRequest, opts ...grpc.CallOption) (*QueryRoutesResponse, error) QueryRoutes(ctx context.Context, in *QueryRoutesRequest, opts ...grpc.CallOption) (*QueryRoutesResponse, error)
GetNetworkInfo(ctx context.Context, in *NetworkInfoRequest, opts ...grpc.CallOption) (*NetworkInfo, error) GetNetworkInfo(ctx context.Context, in *NetworkInfoRequest, opts ...grpc.CallOption) (*NetworkInfo, error)
StopDaemon(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StopResponse, error)
SubscribeChannelGraph(ctx context.Context, in *GraphTopologySubscription, opts ...grpc.CallOption) (Lightning_SubscribeChannelGraphClient, error) SubscribeChannelGraph(ctx context.Context, in *GraphTopologySubscription, opts ...grpc.CallOption) (Lightning_SubscribeChannelGraphClient, error)
SetAlias(ctx context.Context, in *SetAliasRequest, opts ...grpc.CallOption) (*SetAliasResponse, error) SetAlias(ctx context.Context, in *SetAliasRequest, opts ...grpc.CallOption) (*SetAliasResponse, error)
DebugLevel(ctx context.Context, in *DebugLevelRequest, opts ...grpc.CallOption) (*DebugLevelResponse, error) DebugLevel(ctx context.Context, in *DebugLevelRequest, opts ...grpc.CallOption) (*DebugLevelResponse, error)
@ -3229,6 +3250,15 @@ func (c *lightningClient) GetNetworkInfo(ctx context.Context, in *NetworkInfoReq
return out, nil return out, nil
} }
func (c *lightningClient) StopDaemon(ctx context.Context, in *StopRequest, opts ...grpc.CallOption) (*StopResponse, error) {
out := new(StopResponse)
err := grpc.Invoke(ctx, "/lnrpc.Lightning/StopDaemon", in, out, c.cc, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *lightningClient) SubscribeChannelGraph(ctx context.Context, in *GraphTopologySubscription, opts ...grpc.CallOption) (Lightning_SubscribeChannelGraphClient, error) { func (c *lightningClient) SubscribeChannelGraph(ctx context.Context, in *GraphTopologySubscription, opts ...grpc.CallOption) (Lightning_SubscribeChannelGraphClient, error) {
stream, err := grpc.NewClientStream(ctx, &_Lightning_serviceDesc.Streams[5], c.cc, "/lnrpc.Lightning/SubscribeChannelGraph", opts...) stream, err := grpc.NewClientStream(ctx, &_Lightning_serviceDesc.Streams[5], c.cc, "/lnrpc.Lightning/SubscribeChannelGraph", opts...)
if err != nil { if err != nil {
@ -3314,6 +3344,7 @@ type LightningServer interface {
GetNodeInfo(context.Context, *NodeInfoRequest) (*NodeInfo, error) GetNodeInfo(context.Context, *NodeInfoRequest) (*NodeInfo, error)
QueryRoutes(context.Context, *QueryRoutesRequest) (*QueryRoutesResponse, error) QueryRoutes(context.Context, *QueryRoutesRequest) (*QueryRoutesResponse, error)
GetNetworkInfo(context.Context, *NetworkInfoRequest) (*NetworkInfo, error) GetNetworkInfo(context.Context, *NetworkInfoRequest) (*NetworkInfo, error)
StopDaemon(context.Context, *StopRequest) (*StopResponse, error)
SubscribeChannelGraph(*GraphTopologySubscription, Lightning_SubscribeChannelGraphServer) error SubscribeChannelGraph(*GraphTopologySubscription, Lightning_SubscribeChannelGraphServer) error
SetAlias(context.Context, *SetAliasRequest) (*SetAliasResponse, error) SetAlias(context.Context, *SetAliasRequest) (*SetAliasResponse, error)
DebugLevel(context.Context, *DebugLevelRequest) (*DebugLevelResponse, error) DebugLevel(context.Context, *DebugLevelRequest) (*DebugLevelResponse, error)
@ -3901,6 +3932,24 @@ func _Lightning_GetNetworkInfo_Handler(srv interface{}, ctx context.Context, dec
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _Lightning_StopDaemon_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(StopRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LightningServer).StopDaemon(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/lnrpc.Lightning/StopDaemon",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LightningServer).StopDaemon(ctx, req.(*StopRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Lightning_SubscribeChannelGraph_Handler(srv interface{}, stream grpc.ServerStream) error { func _Lightning_SubscribeChannelGraph_Handler(srv interface{}, stream grpc.ServerStream) error {
m := new(GraphTopologySubscription) m := new(GraphTopologySubscription)
if err := stream.RecvMsg(m); err != nil { if err := stream.RecvMsg(m); err != nil {
@ -4066,6 +4115,10 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
MethodName: "GetNetworkInfo", MethodName: "GetNetworkInfo",
Handler: _Lightning_GetNetworkInfo_Handler, Handler: _Lightning_GetNetworkInfo_Handler,
}, },
{
MethodName: "StopDaemon",
Handler: _Lightning_StopDaemon_Handler,
},
{ {
MethodName: "SetAlias", MethodName: "SetAlias",
Handler: _Lightning_SetAlias_Handler, Handler: _Lightning_SetAlias_Handler,
@ -4114,264 +4167,266 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) } func init() { proto.RegisterFile("rpc.proto", fileDescriptor0) }
var fileDescriptor0 = []byte{ var fileDescriptor0 = []byte{
// 4140 bytes of a gzipped FileDescriptorProto // 4172 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7b, 0xcf, 0x6f, 0x1c, 0xc9, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x5b, 0xcd, 0x6f, 0x1c, 0xc9,
0x75, 0xbf, 0x7a, 0x38, 0xa4, 0x38, 0x6f, 0x66, 0xf8, 0xa3, 0x28, 0x51, 0xa3, 0x91, 0x56, 0xd6, 0x75, 0x57, 0x0f, 0x87, 0x14, 0xe7, 0xcd, 0x0c, 0x3f, 0x8a, 0x12, 0x35, 0x1a, 0x69, 0x65, 0x6d,
0x96, 0x85, 0x15, 0xbf, 0xb2, 0x41, 0x6a, 0xf9, 0x0d, 0x36, 0xf2, 0x2a, 0xc9, 0x82, 0x2b, 0x69, 0x59, 0xb0, 0x18, 0xd9, 0x20, 0xb5, 0x4c, 0xb2, 0x91, 0x57, 0x49, 0x16, 0x5c, 0x49, 0x2b, 0x2e,
0xc5, 0x85, 0x69, 0x2d, 0xdd, 0xd4, 0xae, 0x12, 0x1b, 0xc1, 0xa4, 0x39, 0x5d, 0x1c, 0xb6, 0xd5, 0x4c, 0x6b, 0xe9, 0xa6, 0x76, 0x95, 0xd8, 0x08, 0x26, 0xcd, 0xe9, 0xe2, 0xb0, 0xad, 0x9e, 0xee,
0xd3, 0xdd, 0xdb, 0x5d, 0x43, 0x69, 0x2c, 0x10, 0x09, 0x36, 0x3e, 0x26, 0x30, 0x02, 0xdf, 0x8d, 0xde, 0xee, 0x1a, 0x4a, 0x63, 0x81, 0x48, 0xb0, 0xf1, 0x31, 0x81, 0x11, 0xf8, 0x6e, 0x24, 0xc8,
0x04, 0x39, 0xe7, 0x92, 0x63, 0x92, 0xbf, 0x20, 0x40, 0x80, 0x00, 0x3e, 0xe5, 0x1e, 0xe4, 0x9e, 0x39, 0x97, 0x1c, 0x93, 0xff, 0x20, 0x40, 0x80, 0x00, 0x3e, 0xe5, 0x1e, 0xe4, 0x1e, 0x04, 0xb9,
0x43, 0x6e, 0x39, 0x04, 0xaf, 0x7e, 0x75, 0x55, 0x77, 0x53, 0xab, 0x20, 0x41, 0x4e, 0x9c, 0xfa, 0xe5, 0x10, 0xbc, 0xfa, 0xea, 0xaa, 0xee, 0xa6, 0x56, 0x41, 0x82, 0x9c, 0x38, 0xf5, 0xab, 0xd7,
0xd4, 0xeb, 0x57, 0x55, 0xaf, 0xde, 0xaf, 0x7a, 0x55, 0x84, 0x4e, 0x9e, 0x8d, 0xb7, 0xb3, 0x3c, 0xaf, 0xaa, 0x5e, 0xbd, 0xaf, 0x7a, 0x55, 0x84, 0x4e, 0x9e, 0x8d, 0xb7, 0xb3, 0x3c, 0xe5, 0x29,
0xe5, 0x29, 0x59, 0x8c, 0x93, 0x3c, 0x1b, 0x0f, 0x6f, 0x4e, 0xd2, 0x74, 0x12, 0xb3, 0x9d, 0x20, 0x59, 0x8c, 0x93, 0x3c, 0x1b, 0x0f, 0x6f, 0x4e, 0xd2, 0x74, 0x12, 0xb3, 0x9d, 0x20, 0x8b, 0x76,
0x8b, 0x76, 0x82, 0x24, 0x49, 0x79, 0xc0, 0xa3, 0x34, 0x29, 0x24, 0x11, 0xfd, 0x77, 0x0f, 0xba, 0x82, 0x24, 0x49, 0x79, 0xc0, 0xa3, 0x34, 0x29, 0x24, 0x11, 0xfd, 0x77, 0x0f, 0xba, 0xcf, 0xf3,
0xcf, 0xf3, 0x20, 0x29, 0x82, 0x31, 0xc2, 0x64, 0x00, 0x97, 0xf9, 0xeb, 0xd1, 0x69, 0x50, 0x9c, 0x20, 0x29, 0x82, 0x31, 0xc2, 0x64, 0x00, 0x97, 0xf9, 0xeb, 0xd1, 0x69, 0x50, 0x9c, 0x0e, 0xbc,
0x0e, 0xbc, 0xdb, 0xde, 0x56, 0xc7, 0xd7, 0x4d, 0xb2, 0x09, 0x4b, 0xc1, 0x34, 0x9d, 0x25, 0x7c, 0xdb, 0xde, 0x56, 0xc7, 0xd7, 0x4d, 0xb2, 0x09, 0x4b, 0xc1, 0x34, 0x9d, 0x25, 0x7c, 0xd0, 0xba,
0xd0, 0xba, 0xed, 0x6d, 0x2d, 0xf8, 0xaa, 0x45, 0xbe, 0x0f, 0xeb, 0xc9, 0x6c, 0x3a, 0x1a, 0xa7, 0xed, 0x6d, 0x2d, 0xf8, 0xaa, 0x45, 0xbe, 0x07, 0xeb, 0xc9, 0x6c, 0x3a, 0x1a, 0xa7, 0xc9, 0x49,
0xc9, 0x49, 0x94, 0x4f, 0x25, 0xf3, 0xc1, 0xc2, 0x6d, 0x6f, 0x6b, 0xd1, 0xaf, 0x77, 0x90, 0x5b, 0x94, 0x4f, 0x25, 0xf3, 0xc1, 0xc2, 0x6d, 0x6f, 0x6b, 0xd1, 0xaf, 0x77, 0x90, 0x5b, 0x00, 0xc7,
0x00, 0xc7, 0x71, 0x3a, 0x7e, 0x29, 0x87, 0x68, 0x8b, 0x21, 0x2c, 0x84, 0x50, 0xe8, 0xa9, 0x16, 0x71, 0x3a, 0x7e, 0x29, 0x87, 0x68, 0x8b, 0x21, 0x2c, 0x84, 0x50, 0xe8, 0xa9, 0x16, 0x8b, 0x26,
0x8b, 0x26, 0xa7, 0x7c, 0xb0, 0x28, 0x18, 0x39, 0x18, 0xf2, 0xe0, 0xd1, 0x94, 0x8d, 0x0a, 0x1e, 0xa7, 0x7c, 0xb0, 0x28, 0x18, 0x39, 0x18, 0xf2, 0xe0, 0xd1, 0x94, 0x8d, 0x0a, 0x1e, 0x4c, 0xb3,
0x4c, 0xb3, 0xc1, 0x92, 0x98, 0x8d, 0x85, 0x88, 0xfe, 0x94, 0x07, 0xf1, 0xe8, 0x84, 0xb1, 0x62, 0xc1, 0x92, 0x98, 0x8d, 0x85, 0x88, 0xfe, 0x94, 0x07, 0xf1, 0xe8, 0x84, 0xb1, 0x62, 0x70, 0x59,
0x70, 0x59, 0xf5, 0x1b, 0x84, 0x0e, 0x60, 0xf3, 0x29, 0xe3, 0xd6, 0xaa, 0x0b, 0x9f, 0x7d, 0x3d, 0xf5, 0x1b, 0x84, 0x0e, 0x60, 0xf3, 0x29, 0xe3, 0xd6, 0xaa, 0x0b, 0x9f, 0x7d, 0x35, 0x63, 0x05,
0x63, 0x05, 0xa7, 0x07, 0x40, 0x2c, 0xf8, 0x31, 0xe3, 0x41, 0x14, 0x17, 0xe4, 0x23, 0xe8, 0x71, 0xa7, 0x07, 0x40, 0x2c, 0xf8, 0x31, 0xe3, 0x41, 0x14, 0x17, 0xe4, 0x43, 0xe8, 0x71, 0x8b, 0x78,
0x8b, 0x78, 0xe0, 0xdd, 0x5e, 0xd8, 0xea, 0xee, 0x92, 0x6d, 0x21, 0xdf, 0x6d, 0xeb, 0x03, 0xdf, 0xe0, 0xdd, 0x5e, 0xd8, 0xea, 0xee, 0x92, 0x6d, 0x21, 0xdf, 0x6d, 0xeb, 0x03, 0xdf, 0xa1, 0xa3,
0xa1, 0xa3, 0xff, 0xec, 0x41, 0xf7, 0x88, 0x25, 0xa1, 0xe2, 0x4e, 0x08, 0xb4, 0x43, 0x56, 0x70, 0xff, 0xec, 0x41, 0xf7, 0x88, 0x25, 0xa1, 0xe2, 0x4e, 0x08, 0xb4, 0x43, 0x56, 0x70, 0x21, 0xd8,
0x21, 0xd8, 0x9e, 0x2f, 0x7e, 0x93, 0xef, 0x40, 0x17, 0xff, 0x8e, 0x0a, 0x9e, 0x47, 0xc9, 0x44, 0x9e, 0x2f, 0x7e, 0x93, 0x6f, 0x41, 0x17, 0xff, 0x8e, 0x0a, 0x9e, 0x47, 0xc9, 0x44, 0x88, 0xb6,
0x88, 0xb6, 0xe3, 0x03, 0x42, 0x47, 0x02, 0x21, 0x6b, 0xb0, 0x10, 0x4c, 0xb9, 0x10, 0xe8, 0x82, 0xe3, 0x03, 0x42, 0x47, 0x02, 0x21, 0x6b, 0xb0, 0x10, 0x4c, 0xb9, 0x10, 0xe8, 0x82, 0x8f, 0x3f,
0x8f, 0x3f, 0xc9, 0xfb, 0xd0, 0xcb, 0x82, 0xf9, 0x94, 0x25, 0xbc, 0x14, 0x62, 0xcf, 0xef, 0x2a, 0xc9, 0xfb, 0xd0, 0xcb, 0x82, 0xf9, 0x94, 0x25, 0xbc, 0x14, 0x62, 0xcf, 0xef, 0x2a, 0x6c, 0x1f,
0x6c, 0x1f, 0xa5, 0xb8, 0x0d, 0x1b, 0x36, 0x89, 0xe6, 0xbe, 0x28, 0xb8, 0xaf, 0x5b, 0x94, 0x6a, 0xa5, 0xb8, 0x0d, 0x1b, 0x36, 0x89, 0xe6, 0xbe, 0x28, 0xb8, 0xaf, 0x5b, 0x94, 0x6a, 0x90, 0xbb,
0x90, 0xbb, 0xb0, 0xaa, 0xe9, 0x73, 0x39, 0x59, 0x21, 0xd6, 0x8e, 0xbf, 0xa2, 0x60, 0x2d, 0xa0, 0xb0, 0xaa, 0xe9, 0x73, 0x39, 0x59, 0x21, 0xd6, 0x8e, 0xbf, 0xa2, 0x60, 0x2d, 0xa0, 0x04, 0x7a,
0x04, 0x7a, 0x72, 0x45, 0x45, 0x96, 0x26, 0x05, 0x23, 0xf7, 0x60, 0x4d, 0x7f, 0x98, 0xe5, 0x2c, 0x72, 0x45, 0x45, 0x96, 0x26, 0x05, 0x23, 0xf7, 0x60, 0x4d, 0x7f, 0x98, 0xe5, 0x2c, 0x9a, 0x06,
0x9a, 0x06, 0x13, 0xa6, 0x96, 0x57, 0xc3, 0xc9, 0x2e, 0xf4, 0xcd, 0x20, 0xe9, 0x8c, 0x33, 0xb1, 0x13, 0xa6, 0x96, 0x57, 0xc3, 0xc9, 0x2e, 0xf4, 0xcd, 0x20, 0xe9, 0x8c, 0x33, 0xb1, 0xd8, 0xee,
0xd8, 0xee, 0x6e, 0x4f, 0xc9, 0xd1, 0x47, 0xcc, 0x77, 0x49, 0xe8, 0x37, 0x1e, 0xf4, 0x1e, 0x9d, 0x6e, 0x4f, 0xc9, 0xd1, 0x47, 0xcc, 0x77, 0x49, 0xe8, 0xd7, 0x1e, 0xf4, 0x1e, 0x9d, 0x06, 0x49,
0x06, 0x49, 0xc2, 0xe2, 0xc3, 0x34, 0x4a, 0x38, 0xea, 0xc7, 0xc9, 0x2c, 0x09, 0xa3, 0x64, 0x32, 0xc2, 0xe2, 0xc3, 0x34, 0x4a, 0x38, 0xea, 0xc7, 0xc9, 0x2c, 0x09, 0xa3, 0x64, 0x32, 0xe2, 0xaf,
0xe2, 0xaf, 0xa3, 0x50, 0x0d, 0xe6, 0x60, 0x38, 0x29, 0xbb, 0x8d, 0xab, 0x57, 0x82, 0xad, 0xe1, 0xa3, 0x50, 0x0d, 0xe6, 0x60, 0x38, 0x29, 0xbb, 0x8d, 0xab, 0x57, 0x82, 0xad, 0xe1, 0xc8, 0x2f,
0xc8, 0x2f, 0x9d, 0xf1, 0x6c, 0xc6, 0x47, 0x51, 0x12, 0xb2, 0xd7, 0x42, 0xce, 0x7d, 0xdf, 0xc1, 0x9d, 0xf1, 0x6c, 0xc6, 0x47, 0x51, 0x12, 0xb2, 0xd7, 0x42, 0xce, 0x7d, 0xdf, 0xc1, 0xe8, 0xef,
0xe8, 0xef, 0xc1, 0xda, 0x01, 0x2a, 0x5e, 0x12, 0x25, 0x93, 0xbd, 0x30, 0xcc, 0x59, 0x51, 0xa0, 0xc3, 0xda, 0x01, 0x2a, 0x5e, 0x12, 0x25, 0x93, 0xbd, 0x30, 0xcc, 0x59, 0x51, 0xa0, 0x35, 0x64,
0x35, 0x64, 0xb3, 0xe3, 0x97, 0x6c, 0xae, 0xcc, 0x44, 0xb5, 0x70, 0x8f, 0x4f, 0xd3, 0x82, 0xab, 0xb3, 0xe3, 0x97, 0x6c, 0xae, 0xcc, 0x44, 0xb5, 0x70, 0x8f, 0x4f, 0xd3, 0x82, 0xab, 0xf1, 0xc4,
0xf1, 0xc4, 0x6f, 0xfa, 0x97, 0x1e, 0xac, 0xa2, 0xd4, 0x7e, 0x14, 0x24, 0x73, 0xad, 0x0b, 0x07, 0x6f, 0xfa, 0x57, 0x1e, 0xac, 0xa2, 0xd4, 0x7e, 0x18, 0x24, 0x73, 0xad, 0x0b, 0x07, 0xd0, 0x43,
0xd0, 0x43, 0x56, 0xcf, 0xd3, 0x3d, 0x69, 0x53, 0x52, 0xa7, 0xb6, 0x94, 0x2c, 0x2a, 0xd4, 0xdb, 0x56, 0xcf, 0xd3, 0x3d, 0x69, 0x53, 0x52, 0xa7, 0xb6, 0x94, 0x2c, 0x2a, 0xd4, 0xdb, 0x36, 0xe9,
0x36, 0xe9, 0x93, 0x84, 0xe7, 0x73, 0xdf, 0xf9, 0x7a, 0xf8, 0x09, 0xac, 0xd7, 0x48, 0x50, 0x73, 0x93, 0x84, 0xe7, 0x73, 0xdf, 0xf9, 0x7a, 0xf8, 0x31, 0xac, 0xd7, 0x48, 0x50, 0x73, 0xca, 0xf9,
0xca, 0xf9, 0xe1, 0x4f, 0x72, 0x05, 0x16, 0xcf, 0x82, 0x78, 0xc6, 0x94, 0x05, 0xcb, 0xc6, 0xc7, 0xe1, 0x4f, 0x72, 0x05, 0x16, 0xcf, 0x82, 0x78, 0xc6, 0x94, 0x05, 0xcb, 0xc6, 0x47, 0xad, 0x07,
0xad, 0x07, 0x1e, 0xfd, 0x00, 0xd6, 0xca, 0x31, 0xd5, 0xde, 0x12, 0x68, 0x1b, 0x11, 0x77, 0x7c, 0x1e, 0xfd, 0x0e, 0xac, 0x95, 0x63, 0xaa, 0xbd, 0x25, 0xd0, 0x36, 0x22, 0xee, 0xf8, 0xe2, 0x37,
0xf1, 0x1b, 0x45, 0x81, 0x74, 0x8f, 0xd2, 0xc8, 0x18, 0x0d, 0xd2, 0x05, 0x61, 0x98, 0x6b, 0x3a, 0x8a, 0x02, 0xe9, 0x1e, 0xa5, 0x91, 0x31, 0x1a, 0xa4, 0x0b, 0xc2, 0x30, 0xd7, 0x74, 0xf8, 0xfb,
0xfc, 0x7d, 0x91, 0xb3, 0xa0, 0x77, 0x61, 0xdd, 0xfa, 0xfe, 0x2d, 0x03, 0xfd, 0xda, 0x83, 0xf5, 0x22, 0x67, 0x41, 0xef, 0xc2, 0xba, 0xf5, 0xfd, 0x5b, 0x06, 0xfa, 0x95, 0x07, 0xeb, 0xcf, 0xd8,
0x67, 0xec, 0x95, 0x12, 0xb7, 0x1e, 0xea, 0x01, 0xb4, 0xf9, 0x3c, 0x93, 0x2a, 0xb6, 0xb2, 0x7b, 0x2b, 0x25, 0x6e, 0x3d, 0xd4, 0x03, 0x68, 0xf3, 0x79, 0x26, 0x55, 0x6c, 0x65, 0xf7, 0x8e, 0x92,
0x47, 0x49, 0xab, 0x46, 0xb7, 0xad, 0x9a, 0xcf, 0xe7, 0x19, 0xf3, 0xc5, 0x17, 0xf4, 0x0b, 0xe8, 0x56, 0x8d, 0x6e, 0x5b, 0x35, 0x9f, 0xcf, 0x33, 0xe6, 0x8b, 0x2f, 0xe8, 0xe7, 0xd0, 0xb5, 0x40,
0x5a, 0x20, 0xb9, 0x06, 0x1b, 0x2f, 0x3e, 0x7f, 0xfe, 0xec, 0xc9, 0xd1, 0xd1, 0xe8, 0xf0, 0xcb, 0x72, 0x0d, 0x36, 0x5e, 0x7c, 0xf6, 0xfc, 0xd9, 0x93, 0xa3, 0xa3, 0xd1, 0xe1, 0x17, 0x9f, 0xfc,
0x4f, 0x7f, 0xf8, 0xe4, 0x0f, 0x46, 0xfb, 0x7b, 0x47, 0xfb, 0x6b, 0x97, 0xc8, 0x26, 0x90, 0x67, 0xe0, 0xc9, 0x1f, 0x8e, 0xf6, 0xf7, 0x8e, 0xf6, 0xd7, 0x2e, 0x91, 0x4d, 0x20, 0xcf, 0x9e, 0x1c,
0x4f, 0x8e, 0x9e, 0x3f, 0x79, 0xec, 0xe0, 0x1e, 0x59, 0x85, 0xae, 0x0d, 0xb4, 0xe8, 0x10, 0x06, 0x3d, 0x7f, 0xf2, 0xd8, 0xc1, 0x3d, 0xb2, 0x0a, 0x5d, 0x1b, 0x68, 0xd1, 0x21, 0x0c, 0x9e, 0xb1,
0xcf, 0xd8, 0xab, 0x17, 0x11, 0x4f, 0x58, 0x51, 0xb8, 0xc3, 0xd3, 0x6d, 0x20, 0xf6, 0x9c, 0xd4, 0x57, 0x2f, 0x22, 0x9e, 0xb0, 0xa2, 0x70, 0x87, 0xa7, 0xdb, 0x40, 0xec, 0x39, 0xa9, 0x65, 0x0e,
0x32, 0x07, 0x70, 0x39, 0x90, 0x90, 0x76, 0xad, 0xaa, 0x49, 0xbf, 0x04, 0xf2, 0x28, 0x4d, 0x12, 0xe0, 0x72, 0x20, 0x21, 0xed, 0x5a, 0x55, 0x93, 0x7e, 0x01, 0xe4, 0x51, 0x9a, 0x24, 0x6c, 0xcc,
0x36, 0xe6, 0x87, 0x8c, 0xe5, 0x7a, 0xb1, 0xdf, 0xb3, 0xe4, 0xda, 0xdd, 0xbd, 0xa6, 0x16, 0x5b, 0x0f, 0x19, 0xcb, 0xf5, 0x62, 0xbf, 0x6b, 0xc9, 0xb5, 0xbb, 0x7b, 0x4d, 0x2d, 0xb6, 0xaa, 0x89,
0xd5, 0x44, 0x25, 0x70, 0x02, 0xed, 0x8c, 0xe5, 0x53, 0x21, 0xee, 0x65, 0x5f, 0xfc, 0xa6, 0x3b, 0x4a, 0xe0, 0x04, 0xda, 0x19, 0xcb, 0xa7, 0x42, 0xdc, 0xcb, 0xbe, 0xf8, 0x4d, 0x77, 0x60, 0xc3,
0xb0, 0xe1, 0xb0, 0x2d, 0xe7, 0x91, 0x31, 0x96, 0x8f, 0x94, 0xc4, 0x17, 0x7d, 0xdd, 0xa4, 0x1f, 0x61, 0x5b, 0xce, 0x23, 0x63, 0x2c, 0x1f, 0x29, 0x89, 0x2f, 0xfa, 0xba, 0x49, 0x3f, 0x80, 0xab,
0xc2, 0xd5, 0xc7, 0x51, 0x31, 0xae, 0x4f, 0x05, 0x3f, 0x99, 0x1d, 0x8f, 0x4a, 0x75, 0xd2, 0x4d, 0x8f, 0xa3, 0x62, 0x5c, 0x9f, 0x0a, 0x7e, 0x32, 0x3b, 0x1e, 0x95, 0xea, 0xa4, 0x9b, 0xe8, 0x4b,
0xf4, 0xa5, 0xd5, 0x4f, 0xe4, 0x30, 0xf4, 0x6f, 0x3d, 0x68, 0xef, 0x3f, 0x3f, 0x78, 0x44, 0x86, 0xab, 0x9f, 0xc8, 0x61, 0xe8, 0xdf, 0x79, 0xd0, 0xde, 0x7f, 0x7e, 0xf0, 0x88, 0x0c, 0x61, 0x39,
0xb0, 0x1c, 0x25, 0xe3, 0x74, 0x8a, 0x1e, 0xc8, 0x13, 0xd3, 0x33, 0xed, 0x0b, 0x83, 0xca, 0x4d, 0x4a, 0xc6, 0xe9, 0x14, 0x3d, 0x90, 0x27, 0xa6, 0x67, 0xda, 0x17, 0x06, 0x95, 0x9b, 0xd0, 0x11,
0xe8, 0x08, 0xc7, 0x85, 0x6e, 0x5f, 0xd8, 0x64, 0xcf, 0x2f, 0x01, 0x0c, 0x39, 0xec, 0x75, 0x16, 0x8e, 0x0b, 0xdd, 0xbe, 0xb0, 0xc9, 0x9e, 0x5f, 0x02, 0x18, 0x72, 0xd8, 0xeb, 0x2c, 0xca, 0x45,
0xe5, 0x22, 0xa6, 0xe8, 0x48, 0xd1, 0x16, 0x96, 0x5b, 0xef, 0x40, 0x77, 0x90, 0xb3, 0xb3, 0x74, 0x4c, 0xd1, 0x91, 0xa2, 0x2d, 0x2c, 0xb7, 0xde, 0x81, 0xee, 0x20, 0x67, 0x67, 0xe9, 0x58, 0x82,
0x2c, 0xc1, 0x90, 0xc5, 0xc1, 0x5c, 0x78, 0xc2, 0xbe, 0x5f, 0xc3, 0xe9, 0xbf, 0x2d, 0x40, 0x7f, 0x21, 0x8b, 0x83, 0xb9, 0xf0, 0x84, 0x7d, 0xbf, 0x86, 0xd3, 0x7f, 0x5b, 0x80, 0xfe, 0xde, 0x98,
0x6f, 0xcc, 0xa3, 0x33, 0xa6, 0xbc, 0x8e, 0x98, 0xa1, 0x00, 0xd4, 0xdc, 0x55, 0x8b, 0xdc, 0x81, 0x47, 0x67, 0x4c, 0x79, 0x1d, 0x31, 0x43, 0x01, 0xa8, 0xb9, 0xab, 0x16, 0xb9, 0x03, 0xfd, 0x9c,
0x7e, 0xce, 0xa6, 0x29, 0x67, 0x23, 0xe5, 0x07, 0xa4, 0xc5, 0xbb, 0x20, 0x52, 0x8d, 0x25, 0xa3, 0x4d, 0x53, 0xce, 0x46, 0xca, 0x0f, 0x48, 0x8b, 0x77, 0x41, 0xa4, 0x1a, 0x4b, 0x46, 0xa3, 0x0c,
0x51, 0x86, 0xfe, 0x4b, 0xac, 0xa5, 0xe3, 0xbb, 0x20, 0x8a, 0x17, 0x01, 0xdc, 0x11, 0x5c, 0x45, 0xfd, 0x97, 0x58, 0x4b, 0xc7, 0x77, 0x41, 0x14, 0x2f, 0x02, 0xb8, 0x23, 0xb8, 0x8a, 0xb6, 0xaf,
0xdb, 0xd7, 0x4d, 0x94, 0xdd, 0x38, 0xc8, 0x82, 0x71, 0xc4, 0xe5, 0x9c, 0x17, 0x7c, 0xd3, 0x46, 0x9b, 0x28, 0xbb, 0x71, 0x90, 0x05, 0xe3, 0x88, 0xcb, 0x39, 0x2f, 0xf8, 0xa6, 0x8d, 0xbc, 0xe3,
0xde, 0x71, 0x3a, 0x0e, 0xe2, 0xd1, 0x71, 0x10, 0x07, 0xc9, 0x98, 0xa9, 0x48, 0xe8, 0x82, 0xe4, 0x74, 0x1c, 0xc4, 0xa3, 0xe3, 0x20, 0x0e, 0x92, 0x31, 0x53, 0x91, 0xd0, 0x05, 0xc9, 0x77, 0x60,
0x03, 0x58, 0x51, 0x53, 0xd2, 0x64, 0x32, 0x20, 0x56, 0x50, 0x94, 0xe9, 0x2c, 0x29, 0x18, 0xe7, 0x45, 0x4d, 0x49, 0x93, 0xc9, 0x80, 0x58, 0x41, 0x51, 0xa6, 0xb3, 0xa4, 0x60, 0x9c, 0xc7, 0x2c,
0x31, 0x0b, 0x0d, 0xe9, 0xb2, 0x20, 0xad, 0x77, 0x90, 0xfb, 0xb0, 0x21, 0x03, 0x6a, 0x11, 0xf0, 0x34, 0xa4, 0xcb, 0x82, 0xb4, 0xde, 0x41, 0xee, 0xc3, 0x86, 0x0c, 0xa8, 0x45, 0xc0, 0xd3, 0xe2,
0xb4, 0x38, 0x8d, 0x8a, 0x51, 0xc1, 0x12, 0x3e, 0xe8, 0x08, 0xfa, 0xa6, 0x2e, 0xf2, 0x00, 0xae, 0x34, 0x2a, 0x46, 0x05, 0x4b, 0xf8, 0xa0, 0x23, 0xe8, 0x9b, 0xba, 0xc8, 0x03, 0xb8, 0x56, 0x81,
0x55, 0xe0, 0x9c, 0x8d, 0x59, 0x74, 0xc6, 0xc2, 0x01, 0x88, 0xaf, 0x2e, 0xea, 0x26, 0xb7, 0xa1, 0x73, 0x36, 0x66, 0xd1, 0x19, 0x0b, 0x07, 0x20, 0xbe, 0xba, 0xa8, 0x9b, 0xdc, 0x86, 0x2e, 0xe6,
0x8b, 0x79, 0xc4, 0x2c, 0x0b, 0x03, 0xce, 0x8a, 0x41, 0x57, 0x48, 0xc8, 0x86, 0xc8, 0x87, 0xd0, 0x11, 0xb3, 0x2c, 0x0c, 0x38, 0x2b, 0x06, 0x5d, 0x21, 0x21, 0x1b, 0x22, 0x1f, 0x40, 0x3f, 0x63,
0xcf, 0x98, 0x74, 0xec, 0xa7, 0x3c, 0x1e, 0x17, 0x83, 0x9e, 0xf0, 0xa6, 0x5d, 0x65, 0x32, 0xa8, 0xd2, 0xb1, 0x9f, 0xf2, 0x78, 0x5c, 0x0c, 0x7a, 0xc2, 0x9b, 0x76, 0x95, 0xc9, 0xa0, 0x16, 0xfa,
0x85, 0xbe, 0x4b, 0x41, 0xaf, 0xc2, 0xc6, 0x41, 0x54, 0x70, 0xb5, 0xcb, 0xc6, 0x72, 0xf7, 0xe1, 0x2e, 0x05, 0xbd, 0x0a, 0x1b, 0x07, 0x51, 0xc1, 0xd5, 0x2e, 0x1b, 0xcb, 0xdd, 0x87, 0x2b, 0x2e,
0x8a, 0x0b, 0x2b, 0x9b, 0xb9, 0x0f, 0xcb, 0x6a, 0xcb, 0x70, 0x02, 0xc8, 0xfc, 0x8a, 0x62, 0xee, 0xac, 0x6c, 0xe6, 0x3e, 0x2c, 0xab, 0x2d, 0xc3, 0x09, 0x20, 0xf3, 0x2b, 0x8a, 0xb9, 0xa3, 0x2d,
0x68, 0x8b, 0x6f, 0xa8, 0xe8, 0x2f, 0x5a, 0xd0, 0x46, 0x7b, 0xb8, 0xd8, 0x76, 0x6c, 0x43, 0x6c, 0xbe, 0xa1, 0xa2, 0x3f, 0x6f, 0x41, 0x1b, 0xed, 0xe1, 0x62, 0xdb, 0xb1, 0x0d, 0xb1, 0xe5, 0x18,
0x39, 0x86, 0x68, 0xbb, 0x8a, 0x05, 0xc7, 0x55, 0x88, 0xfc, 0x69, 0xce, 0x99, 0x92, 0xb7, 0xd4, 0xa2, 0xed, 0x2a, 0x16, 0x1c, 0x57, 0x21, 0xf2, 0xa7, 0x39, 0x67, 0x4a, 0xde, 0x52, 0x5b, 0x2c,
0x16, 0x0b, 0x29, 0xfb, 0x73, 0x36, 0x3e, 0x13, 0x2a, 0x63, 0xfa, 0x11, 0x41, 0x85, 0x2a, 0x02, 0xa4, 0xec, 0xcf, 0xd9, 0xf8, 0x4c, 0xa8, 0x8c, 0xe9, 0x47, 0x04, 0x15, 0xaa, 0x08, 0xb8, 0xfc,
0x2e, 0xbf, 0x96, 0xfa, 0x62, 0xda, 0xba, 0x4f, 0x7c, 0x79, 0xb9, 0xec, 0x13, 0xdf, 0x0d, 0xe0, 0x5a, 0xea, 0x8b, 0x69, 0xeb, 0x3e, 0xf1, 0xe5, 0xe5, 0xb2, 0x4f, 0x7c, 0x37, 0x80, 0xcb, 0x51,
0x72, 0x94, 0x1c, 0xa7, 0xb3, 0x24, 0x14, 0x4a, 0xb1, 0xec, 0xeb, 0x26, 0x9a, 0x6a, 0x26, 0x42, 0x72, 0x9c, 0xce, 0x92, 0x50, 0x28, 0xc5, 0xb2, 0xaf, 0x9b, 0x68, 0xaa, 0x99, 0x08, 0xa9, 0xd1,
0x6a, 0x34, 0x65, 0x4a, 0x01, 0x4a, 0x80, 0x12, 0x8c, 0x9d, 0x85, 0xf0, 0x0c, 0x46, 0xc8, 0x1f, 0x94, 0x29, 0x05, 0x28, 0x01, 0x4a, 0x30, 0x76, 0x16, 0xc2, 0x33, 0x18, 0x21, 0x7f, 0x08, 0xeb,
0xc1, 0xba, 0x85, 0x29, 0x09, 0xbf, 0x0f, 0x8b, 0xb8, 0x7a, 0x9d, 0x5d, 0xe9, 0xbd, 0x13, 0x2e, 0x16, 0xa6, 0x24, 0xfc, 0x3e, 0x2c, 0xe2, 0xea, 0x75, 0x76, 0xa5, 0xf7, 0x4e, 0xb8, 0x14, 0xd9,
0x45, 0xf6, 0xd0, 0x35, 0x58, 0x79, 0xca, 0xf8, 0xe7, 0xc9, 0x49, 0xaa, 0x39, 0xfd, 0x47, 0x0b, 0x43, 0xd7, 0x60, 0xe5, 0x29, 0xe3, 0x9f, 0x25, 0x27, 0xa9, 0xe6, 0xf4, 0x9f, 0x2d, 0x58, 0x35,
0x56, 0x0d, 0xa4, 0x18, 0x6d, 0xc1, 0x6a, 0x14, 0xb2, 0x84, 0x47, 0x7c, 0x3e, 0x72, 0x42, 0x74, 0x90, 0x62, 0xb4, 0x05, 0xab, 0x51, 0xc8, 0x12, 0x1e, 0xf1, 0xf9, 0xc8, 0x09, 0xd1, 0x55, 0x18,
0x15, 0xc6, 0x70, 0x18, 0xc4, 0x51, 0x50, 0x28, 0xd3, 0x95, 0x0d, 0xb2, 0x0b, 0x57, 0x50, 0xb7, 0xc3, 0x61, 0x10, 0x47, 0x41, 0xa1, 0x4c, 0x57, 0x36, 0xc8, 0x2e, 0x5c, 0x41, 0xdd, 0xd2, 0xea,
0xb4, 0xba, 0x98, 0x6d, 0x97, 0x99, 0x41, 0x63, 0x1f, 0x9a, 0x03, 0xe2, 0xd2, 0x35, 0x94, 0x9f, 0x62, 0xb6, 0x5d, 0x66, 0x06, 0x8d, 0x7d, 0x68, 0x0e, 0x88, 0x4b, 0xd7, 0x50, 0x7e, 0x22, 0x5d,
0x48, 0x97, 0xd4, 0xd4, 0x85, 0x52, 0x93, 0x9c, 0x70, 0xc9, 0xd2, 0x1b, 0x95, 0x40, 0x2d, 0x0b, 0x52, 0x53, 0x17, 0x4a, 0x4d, 0x72, 0xc2, 0x25, 0x4b, 0x6f, 0x54, 0x02, 0xb5, 0x2c, 0x78, 0x49,
0x5e, 0x92, 0x59, 0x49, 0x35, 0x0b, 0xb6, 0x32, 0xe9, 0xe5, 0x5a, 0x26, 0xbd, 0x05, 0xab, 0xc5, 0x66, 0x25, 0xd5, 0x2c, 0xd8, 0xca, 0xa4, 0x97, 0x6b, 0x99, 0xf4, 0x16, 0xac, 0x16, 0xf3, 0x64,
0x3c, 0x19, 0xb3, 0x70, 0xc4, 0x53, 0x1c, 0x37, 0x4a, 0xc4, 0xee, 0x2c, 0xfb, 0x55, 0x58, 0xe4, 0xcc, 0xc2, 0x11, 0x4f, 0x71, 0xdc, 0x28, 0x11, 0xbb, 0xb3, 0xec, 0x57, 0x61, 0x91, 0xf3, 0xb3,
0xfc, 0xac, 0xe0, 0x09, 0xe3, 0xc2, 0x14, 0x97, 0x7d, 0xdd, 0x44, 0xe7, 0x27, 0x48, 0xa4, 0xd2, 0x82, 0x27, 0x8c, 0x0b, 0x53, 0x5c, 0xf6, 0x75, 0x13, 0x9d, 0x9f, 0x20, 0x91, 0x4a, 0xdf, 0xf1,
0x77, 0x7c, 0xd5, 0xa2, 0x3f, 0x17, 0x01, 0xcb, 0xa4, 0xf5, 0x5f, 0x0a, 0x3b, 0x24, 0x37, 0xa0, 0x55, 0x8b, 0xfe, 0x4c, 0x04, 0x2c, 0x93, 0xd6, 0x7f, 0x21, 0xec, 0x90, 0xdc, 0x80, 0x8e, 0x1c,
0x23, 0xc7, 0x2f, 0x4e, 0x03, 0x95, 0x98, 0x2d, 0x0b, 0xe0, 0xe8, 0x34, 0xc0, 0xac, 0xd5, 0x59, 0xbf, 0x38, 0x0d, 0x54, 0x62, 0xb6, 0x2c, 0x80, 0xa3, 0xd3, 0x00, 0xb3, 0x56, 0x67, 0x49, 0x52,
0x92, 0xd4, 0xf8, 0xae, 0xc0, 0xf6, 0xe5, 0x8a, 0xee, 0xc0, 0x8a, 0x3e, 0x30, 0x14, 0xa3, 0x98, 0xe3, 0xbb, 0x02, 0xdb, 0x97, 0x2b, 0xba, 0x03, 0x2b, 0xfa, 0xc0, 0x50, 0x8c, 0x62, 0x76, 0xc2,
0x9d, 0x70, 0x9d, 0x8d, 0x25, 0xb3, 0x29, 0x0e, 0x57, 0x1c, 0xb0, 0x13, 0x4e, 0x9f, 0xc1, 0xba, 0x75, 0x36, 0x96, 0xcc, 0xa6, 0x38, 0x5c, 0x71, 0xc0, 0x4e, 0x38, 0x7d, 0x06, 0xeb, 0xca, 0xda,
0xb2, 0xb6, 0x2f, 0x32, 0xa6, 0x87, 0xfe, 0x41, 0xd5, 0xcf, 0xca, 0xa0, 0xb9, 0xa1, 0xb4, 0xc8, 0x3e, 0xcf, 0x98, 0x1e, 0xfa, 0xfb, 0x55, 0x3f, 0x2b, 0x83, 0xe6, 0x86, 0xd2, 0x22, 0x3b, 0x85,
0x4e, 0x21, 0x2b, 0xce, 0x97, 0xfa, 0x40, 0x54, 0xf7, 0xa3, 0x38, 0x2d, 0x98, 0x62, 0x48, 0xa1, 0xac, 0x38, 0x5f, 0xea, 0x03, 0x51, 0xdd, 0x8f, 0xe2, 0xb4, 0x60, 0x8a, 0x21, 0x85, 0xde, 0x38,
0x37, 0x8e, 0xd3, 0xa2, 0x9a, 0x67, 0xda, 0x18, 0xca, 0xad, 0x98, 0x8d, 0xc7, 0x68, 0xa5, 0x32, 0x4e, 0x8b, 0x6a, 0x9e, 0x69, 0x63, 0x28, 0xb7, 0x62, 0x36, 0x1e, 0xa3, 0x95, 0xca, 0xb0, 0xab,
0xec, 0xea, 0x26, 0xfd, 0x85, 0x07, 0x1b, 0x82, 0x9b, 0xf6, 0x0b, 0x26, 0x7f, 0x79, 0xf7, 0x69, 0x9b, 0xf4, 0xe7, 0x1e, 0x6c, 0x08, 0x6e, 0xda, 0x2f, 0x98, 0xfc, 0xe5, 0xdd, 0xa7, 0xd9, 0x1b,
0xf6, 0xc6, 0x76, 0xde, 0xfb, 0x9e, 0x3a, 0xf3, 0xc4, 0xd1, 0x34, 0xd2, 0xc1, 0xb2, 0x83, 0xc8, 0xdb, 0x79, 0xef, 0x7b, 0xea, 0xcc, 0x13, 0x47, 0xd3, 0x48, 0x07, 0xcb, 0x0e, 0x22, 0x07, 0x08,
0x01, 0x02, 0xa8, 0xca, 0x27, 0x69, 0x3e, 0x66, 0x42, 0x62, 0xcb, 0xbe, 0x6c, 0xd0, 0x7f, 0xf1, 0xa0, 0x2a, 0x9f, 0xa4, 0xf9, 0x98, 0x09, 0x89, 0x2d, 0xfb, 0xb2, 0x41, 0xff, 0xc5, 0x83, 0x75,
0x60, 0x5d, 0x4c, 0xe3, 0x88, 0x07, 0x7c, 0x56, 0xa8, 0xa5, 0xfd, 0x0e, 0xf4, 0x71, 0x19, 0x4c, 0x31, 0x8d, 0x23, 0x1e, 0xf0, 0x59, 0xa1, 0x96, 0xf6, 0xbb, 0xd0, 0xc7, 0x65, 0x30, 0xad, 0xc6,
0xab, 0xb1, 0x9a, 0xc4, 0x15, 0x63, 0x71, 0x02, 0x95, 0xc4, 0xfb, 0x97, 0x7c, 0x97, 0x98, 0x7c, 0x6a, 0x12, 0x57, 0x8c, 0xc5, 0x09, 0x54, 0x12, 0xef, 0x5f, 0xf2, 0x5d, 0x62, 0xf2, 0x31, 0xf4,
0x02, 0x3d, 0xfb, 0x44, 0xa7, 0x92, 0xf8, 0xeb, 0x7a, 0x05, 0x35, 0xad, 0xd8, 0xbf, 0xe4, 0x3b, 0xec, 0x13, 0x9d, 0x4a, 0xe2, 0xaf, 0xeb, 0x15, 0xd4, 0xb4, 0x62, 0xff, 0x92, 0xef, 0x7c, 0x40,
0x1f, 0x90, 0x87, 0x00, 0x22, 0xba, 0x09, 0xb6, 0x62, 0xbe, 0xd6, 0xe7, 0xb5, 0x8d, 0xd8, 0xbf, 0x1e, 0x02, 0x88, 0xe8, 0x26, 0xd8, 0x8a, 0xf9, 0x5a, 0x9f, 0xd7, 0x36, 0x62, 0xff, 0x92, 0x6f,
0xe4, 0x5b, 0xe4, 0x9f, 0x2e, 0xc3, 0x92, 0x74, 0xfa, 0xf4, 0x29, 0xf4, 0x9d, 0x99, 0x3a, 0x59, 0x91, 0x7f, 0xb2, 0x0c, 0x4b, 0xd2, 0xe9, 0xd3, 0xa7, 0xd0, 0x77, 0x66, 0xea, 0x64, 0x91, 0x3d,
0x64, 0x4f, 0x66, 0x91, 0xb5, 0xec, 0xbe, 0xd5, 0x90, 0xdd, 0xff, 0xa7, 0x07, 0x04, 0x35, 0xa9, 0x99, 0x45, 0xd6, 0xb2, 0xfb, 0x56, 0x43, 0x76, 0xff, 0x5f, 0x1e, 0x10, 0xd4, 0xa4, 0xca, 0x56,
0xb2, 0x55, 0x1f, 0xc0, 0x0a, 0x0f, 0xf2, 0x09, 0xe3, 0x23, 0x37, 0x59, 0xaa, 0xa0, 0x22, 0x3a, 0x7d, 0x07, 0x56, 0x78, 0x90, 0x4f, 0x18, 0x1f, 0xb9, 0xc9, 0x52, 0x05, 0x15, 0xd1, 0x29, 0x0d,
0xa5, 0xa1, 0x93, 0x05, 0xf4, 0x7c, 0x1b, 0x22, 0xdb, 0x40, 0xac, 0xa6, 0x3e, 0x8b, 0x49, 0xbf, 0x9d, 0x2c, 0xa0, 0xe7, 0xdb, 0x10, 0xd9, 0x06, 0x62, 0x35, 0xf5, 0x59, 0x4c, 0xfa, 0xf5, 0x86,
0xde, 0xd0, 0x83, 0x0e, 0x48, 0x86, 0x70, 0x7d, 0x58, 0x51, 0x19, 0x52, 0x5b, 0x6c, 0x7a, 0x63, 0x1e, 0x74, 0x40, 0x32, 0x84, 0xeb, 0xc3, 0x8a, 0xca, 0x90, 0xda, 0x62, 0xd3, 0x1b, 0xfb, 0xd0,
0x1f, 0xba, 0xee, 0x6c, 0x86, 0x07, 0xbd, 0x80, 0xeb, 0x3c, 0x41, 0xb7, 0xb5, 0xab, 0x11, 0x66, 0x75, 0x67, 0x33, 0x3c, 0xe8, 0x05, 0x5c, 0xe7, 0x09, 0xba, 0xad, 0x5d, 0x8d, 0x30, 0x2b, 0xe5,
0xa5, 0x3c, 0x49, 0x09, 0xd0, 0xdf, 0x78, 0xb0, 0x86, 0xcb, 0x77, 0x54, 0xe4, 0x63, 0x10, 0xda, 0x49, 0x4a, 0x80, 0xfe, 0xda, 0x83, 0x35, 0x5c, 0xbe, 0xa3, 0x22, 0x1f, 0x81, 0xd0, 0xbe, 0x77,
0xf7, 0x8e, 0x1a, 0xe2, 0xd0, 0xfe, 0xcf, 0x15, 0xe4, 0x01, 0x74, 0x04, 0xc3, 0x34, 0x63, 0x89, 0xd4, 0x10, 0x87, 0xf6, 0x7f, 0xaf, 0x20, 0x0f, 0xa0, 0x23, 0x18, 0xa6, 0x19, 0x4b, 0x94, 0x7e,
0xd2, 0x8f, 0x81, 0xab, 0x1f, 0xa5, 0xe1, 0xef, 0x5f, 0xf2, 0x4b, 0x62, 0x4b, 0x3b, 0xae, 0xc1, 0x0c, 0x5c, 0xfd, 0x28, 0x0d, 0x7f, 0xff, 0x92, 0x5f, 0x12, 0x5b, 0xda, 0x71, 0x0d, 0xae, 0xaa,
0x55, 0x35, 0x4b, 0x77, 0x5b, 0xe9, 0x5f, 0x75, 0x60, 0xb3, 0xda, 0x63, 0x62, 0xbc, 0x4a, 0x5c, 0x59, 0xba, 0xdb, 0x4a, 0xff, 0xba, 0x03, 0x9b, 0xd5, 0x1e, 0x13, 0xe3, 0x55, 0xe2, 0x12, 0x47,
0xe2, 0x68, 0x7a, 0x9c, 0x9a, 0x1c, 0xc8, 0xb3, 0x73, 0x1a, 0xa7, 0x8b, 0x9c, 0xc0, 0x55, 0x1d, 0xd3, 0xe3, 0xd4, 0xe4, 0x40, 0x9e, 0x9d, 0xd3, 0x38, 0x5d, 0xe4, 0x04, 0xae, 0xea, 0x50, 0x80,
0x0a, 0x70, 0xfc, 0xd2, 0xf1, 0xb7, 0x44, 0x0c, 0xbb, 0xef, 0xca, 0xab, 0x32, 0x9e, 0x86, 0x6d, 0xe3, 0x97, 0x8e, 0xbf, 0x25, 0x62, 0xd8, 0x7d, 0x57, 0x5e, 0x95, 0xf1, 0x34, 0x6c, 0xeb, 0x5e,
0xdd, 0x6b, 0x66, 0x47, 0x26, 0x30, 0x30, 0x21, 0x47, 0x39, 0x20, 0x2b, 0x2c, 0xe1, 0x50, 0xdf, 0x33, 0x3b, 0x32, 0x81, 0x81, 0x09, 0x39, 0xca, 0x01, 0x59, 0x61, 0x09, 0x87, 0xfa, 0xee, 0xdb,
0x7b, 0xfb, 0x50, 0xc2, 0xa0, 0x42, 0x8d, 0x5e, 0xc8, 0x8c, 0xbc, 0x86, 0x5b, 0xba, 0x4f, 0x78, 0x87, 0x12, 0x06, 0x15, 0x6a, 0xf4, 0x42, 0x66, 0xe4, 0x35, 0xdc, 0xd2, 0x7d, 0xc2, 0x83, 0xd4,
0x90, 0xfa, 0x70, 0xed, 0x77, 0x59, 0xd9, 0x67, 0xf8, 0xad, 0x3b, 0xe6, 0xb7, 0xf0, 0x1d, 0xfe, 0x87, 0x6b, 0xbf, 0xcb, 0xca, 0x3e, 0xc5, 0x6f, 0xdd, 0x31, 0xbf, 0x81, 0xef, 0xf0, 0x1f, 0x3d,
0xa3, 0x07, 0x2b, 0x2e, 0x37, 0x0c, 0x60, 0x2a, 0x47, 0xd5, 0x46, 0xa2, 0x03, 0x79, 0x05, 0xae, 0x58, 0x71, 0xb9, 0x61, 0x00, 0x53, 0x39, 0xaa, 0x36, 0x12, 0x1d, 0xc8, 0x2b, 0x70, 0x3d, 0xcb,
0x67, 0xd9, 0xad, 0xa6, 0x2c, 0xdb, 0xce, 0xa5, 0x17, 0xbe, 0x2d, 0x97, 0x6e, 0xbf, 0x5b, 0x2e, 0x6e, 0x35, 0x65, 0xd9, 0x76, 0x2e, 0xbd, 0xf0, 0x4d, 0xb9, 0x74, 0xfb, 0xdd, 0x72, 0xe9, 0xc5,
0xbd, 0xd8, 0x94, 0x4b, 0x0f, 0xff, 0xce, 0x03, 0x52, 0xdf, 0x5d, 0xf2, 0x99, 0x4c, 0xf3, 0x13, 0xa6, 0x5c, 0x7a, 0xf8, 0xf7, 0x1e, 0x90, 0xfa, 0xee, 0x92, 0x4f, 0x65, 0x9a, 0x9f, 0xb0, 0x58,
0x16, 0x2b, 0x83, 0xfa, 0xfe, 0x3b, 0x29, 0x88, 0x86, 0xf5, 0xc7, 0xa8, 0xa8, 0xb6, 0xc1, 0xd8, 0x19, 0xd4, 0xf7, 0xde, 0x49, 0x41, 0x34, 0xac, 0x3f, 0x46, 0x45, 0xb5, 0x0d, 0xc6, 0x8e, 0xa8,
0x11, 0xb5, 0xef, 0x37, 0x75, 0xe1, 0x11, 0x48, 0x04, 0xda, 0x62, 0xc4, 0xa3, 0x38, 0x2e, 0x2d, 0x7d, 0xbf, 0xa9, 0x0b, 0x8f, 0x40, 0x22, 0xd0, 0x16, 0x23, 0x1e, 0xc5, 0x71, 0x69, 0x59, 0x7d,
0xab, 0xef, 0xd7, 0xf0, 0xe1, 0x1b, 0xe8, 0x3b, 0x5b, 0xf7, 0xbf, 0x36, 0xed, 0x6a, 0x48, 0x95, 0xbf, 0x86, 0x0f, 0xdf, 0x40, 0xdf, 0xd9, 0xba, 0xff, 0xb3, 0x69, 0x57, 0x43, 0xaa, 0xdc, 0x24,
0x9b, 0xe4, 0x60, 0xc3, 0x6f, 0x5a, 0x40, 0xea, 0xda, 0xf3, 0x7f, 0x39, 0x05, 0xa1, 0x0a, 0x8e, 0x07, 0x1b, 0x7e, 0xdd, 0x02, 0x52, 0xd7, 0x9e, 0xff, 0xcf, 0x29, 0x08, 0x55, 0x70, 0x1c, 0xc0,
0x03, 0x58, 0x50, 0xaa, 0xe0, 0x98, 0xfe, 0x16, 0xac, 0x4e, 0x03, 0x3e, 0xcb, 0x31, 0x9d, 0x74, 0x82, 0x52, 0x05, 0xc7, 0xf4, 0xb7, 0x60, 0x75, 0x1a, 0xf0, 0x59, 0x8e, 0xe9, 0xa4, 0x73, 0x00,
0x0e, 0xa0, 0x55, 0x18, 0x77, 0xab, 0x94, 0xf1, 0x48, 0xf7, 0xaa, 0x9c, 0xaf, 0xa9, 0x8b, 0xfe, 0xad, 0xc2, 0xb8, 0x5b, 0xa5, 0x8c, 0x47, 0xba, 0x57, 0xe5, 0x7c, 0x4d, 0x5d, 0xf4, 0xfb, 0x70,
0x00, 0xae, 0xbc, 0x08, 0xe2, 0x98, 0xf1, 0x4f, 0xe5, 0x60, 0x3a, 0x24, 0xbd, 0x0f, 0xbd, 0x57, 0xe5, 0x45, 0x10, 0xc7, 0x8c, 0x7f, 0x22, 0x07, 0xd3, 0x21, 0xe9, 0x7d, 0xe8, 0xbd, 0x92, 0xf5,
0xb2, 0xde, 0x30, 0x4a, 0x93, 0x78, 0xae, 0x0e, 0xa4, 0x5d, 0x85, 0x7d, 0x91, 0xc4, 0x73, 0x3c, 0x86, 0x51, 0x9a, 0xc4, 0x73, 0x75, 0x20, 0xed, 0x2a, 0xec, 0xf3, 0x24, 0x9e, 0xe3, 0x09, 0xbe,
0xc1, 0x57, 0x3e, 0x2d, 0x0f, 0xfd, 0xb6, 0x43, 0xf3, 0x7c, 0xdd, 0x44, 0x57, 0xa9, 0xe4, 0xe4, 0xf2, 0x69, 0x79, 0xe8, 0xb7, 0x1d, 0x9a, 0xe7, 0xeb, 0x26, 0xba, 0x4a, 0x25, 0x27, 0x77, 0x38,
0x0e, 0x47, 0x77, 0x61, 0xb3, 0xda, 0xd1, 0xcc, 0x6c, 0xa1, 0x64, 0xf6, 0x09, 0x90, 0x1f, 0xcf, 0xba, 0x0b, 0x9b, 0xd5, 0x8e, 0x66, 0x66, 0x0b, 0x25, 0xb3, 0x8f, 0x81, 0xfc, 0x68, 0xc6, 0xf2,
0x58, 0x3e, 0x17, 0xc5, 0x3c, 0x53, 0xb6, 0xb9, 0x56, 0x3d, 0x02, 0x2d, 0x65, 0xb3, 0xe3, 0x1f, 0xb9, 0x28, 0xe6, 0x99, 0xb2, 0xcd, 0xb5, 0xea, 0x11, 0x68, 0x29, 0x9b, 0x1d, 0xff, 0x80, 0xcd,
0xb2, 0xb9, 0x2e, 0x6e, 0xb6, 0x4c, 0x71, 0x93, 0x3e, 0x84, 0x0d, 0x87, 0x81, 0x1a, 0xf1, 0x0e, 0x75, 0x71, 0xb3, 0x65, 0x8a, 0x9b, 0xf4, 0x21, 0x6c, 0x38, 0x0c, 0xd4, 0x88, 0x77, 0x60, 0x49,
0x2c, 0x89, 0x82, 0xa0, 0x3e, 0x1e, 0xb8, 0x45, 0x43, 0xd5, 0x47, 0xff, 0x18, 0x16, 0xf6, 0xd3, 0x14, 0x04, 0xf5, 0xf1, 0xc0, 0x2d, 0x1a, 0xaa, 0x3e, 0xfa, 0x27, 0xb0, 0xb0, 0x9f, 0x66, 0xf6,
0xcc, 0x3e, 0x4e, 0x7b, 0xee, 0x71, 0x5a, 0x39, 0x8a, 0x91, 0xf1, 0x03, 0x72, 0x64, 0x17, 0x44, 0x71, 0xda, 0x73, 0x8f, 0xd3, 0xca, 0x51, 0x8c, 0x8c, 0x1f, 0x90, 0x23, 0xbb, 0x20, 0x9a, 0x79,
0x33, 0x0f, 0xa6, 0x1c, 0xf3, 0xe3, 0x93, 0x34, 0x7f, 0x15, 0xe4, 0xa1, 0x52, 0x81, 0x0a, 0x8a, 0x30, 0xe5, 0x98, 0x1f, 0x9f, 0xa4, 0xf9, 0xab, 0x20, 0x0f, 0x95, 0x0a, 0x54, 0x50, 0x9c, 0xfd,
0xb3, 0x3f, 0x61, 0xda, 0x55, 0xe0, 0x4f, 0xfa, 0x4b, 0x0f, 0x16, 0xc5, 0x94, 0x50, 0x3f, 0x64, 0x09, 0xd3, 0xae, 0x02, 0x7f, 0xd2, 0x5f, 0x78, 0xb0, 0x28, 0xa6, 0x84, 0xfa, 0x21, 0x23, 0x86,
0xc4, 0x90, 0x59, 0x5b, 0x3a, 0x7e, 0x29, 0xe6, 0xd2, 0xf7, 0xab, 0x70, 0xa5, 0x5a, 0xdd, 0xaa, 0xcc, 0xda, 0xd2, 0xf1, 0x4b, 0x31, 0x97, 0xbe, 0x5f, 0x85, 0x2b, 0xd5, 0xea, 0x56, 0xb5, 0x5a,
0x56, 0xab, 0x31, 0x7c, 0xcb, 0x56, 0x59, 0x06, 0x2e, 0x01, 0x72, 0x0b, 0xda, 0xa7, 0x69, 0xa6, 0x8d, 0xe1, 0x5b, 0xb6, 0xca, 0x32, 0x70, 0x09, 0x90, 0x5b, 0xd0, 0x3e, 0x4d, 0x33, 0xed, 0x97,
0xfd, 0x32, 0xe8, 0x13, 0x6f, 0x9a, 0xf9, 0x02, 0xa7, 0xf7, 0x60, 0xf5, 0x59, 0x1a, 0x32, 0xeb, 0x41, 0x9f, 0x78, 0xd3, 0xcc, 0x17, 0x38, 0xbd, 0x07, 0xab, 0xcf, 0xd2, 0x90, 0x59, 0x87, 0xa6,
0xd0, 0x74, 0xe1, 0x6e, 0xd0, 0x3f, 0xf1, 0x60, 0x59, 0x13, 0x93, 0x2d, 0x68, 0xa3, 0x7f, 0xad, 0x0b, 0x77, 0x83, 0xfe, 0xa9, 0x07, 0xcb, 0x9a, 0x98, 0x6c, 0x41, 0x1b, 0xfd, 0x6b, 0x25, 0xf4,
0x84, 0x7e, 0x53, 0x7d, 0x42, 0x3a, 0x5f, 0x50, 0xa0, 0x51, 0x89, 0x74, 0xa2, 0x0c, 0x7e, 0x3a, 0x9b, 0xea, 0x13, 0xd2, 0xf9, 0x82, 0x02, 0x8d, 0x4a, 0xa4, 0x13, 0x65, 0xf0, 0xd3, 0x49, 0x7b,
0x69, 0x2f, 0x03, 0x0b, 0x66, 0x53, 0x62, 0xce, 0x15, 0x0f, 0x5c, 0x41, 0xe9, 0xaf, 0x3c, 0xe8, 0x19, 0x58, 0x30, 0x9b, 0x12, 0x73, 0xae, 0x78, 0xe0, 0x0a, 0x4a, 0x7f, 0xe9, 0x41, 0xdf, 0x19,
0x3b, 0x63, 0x60, 0x7e, 0x15, 0x07, 0x05, 0x57, 0x67, 0x7d, 0x25, 0x44, 0x1b, 0xb2, 0x0f, 0xd8, 0x03, 0xf3, 0xab, 0x38, 0x28, 0xb8, 0x3a, 0xeb, 0x2b, 0x21, 0xda, 0x90, 0x7d, 0xc0, 0x6e, 0xb9,
0x2d, 0xf7, 0x80, 0x6d, 0x0e, 0x78, 0x0b, 0xf6, 0x01, 0xef, 0x3e, 0x74, 0xd4, 0x69, 0x9a, 0x69, 0x07, 0x6c, 0x73, 0xc0, 0x5b, 0xb0, 0x0f, 0x78, 0xf7, 0xa1, 0xa3, 0x4e, 0xd3, 0x4c, 0xcb, 0x4d,
0xb9, 0xe9, 0x5a, 0x3e, 0x8e, 0xa8, 0xeb, 0x6a, 0x25, 0x11, 0x7d, 0x08, 0x5d, 0xab, 0x07, 0x07, 0xd7, 0xf2, 0x71, 0x44, 0x5d, 0x57, 0x2b, 0x89, 0xe8, 0x43, 0xe8, 0x5a, 0x3d, 0x38, 0x60, 0xc2,
0x4c, 0x18, 0x7f, 0x95, 0xe6, 0x2f, 0xf5, 0x89, 0x5e, 0x35, 0x4d, 0x29, 0xb4, 0x55, 0x96, 0x42, 0xf8, 0xab, 0x34, 0x7f, 0xa9, 0x4f, 0xf4, 0xaa, 0x69, 0x4a, 0xa1, 0xad, 0xb2, 0x14, 0x4a, 0xff,
0xe9, 0xdf, 0x78, 0xd0, 0x47, 0x9d, 0x88, 0x92, 0xc9, 0x61, 0x1a, 0x47, 0xe3, 0xb9, 0xd0, 0x0d, 0xd6, 0x83, 0x3e, 0xea, 0x44, 0x94, 0x4c, 0x0e, 0xd3, 0x38, 0x1a, 0xcf, 0x85, 0x6e, 0xe8, 0xed,
0xbd, 0xfd, 0xa3, 0x90, 0xc5, 0x3c, 0x30, 0xba, 0xe1, 0xc2, 0x18, 0xb2, 0xa6, 0x51, 0x22, 0x4a, 0x1f, 0x85, 0x2c, 0xe6, 0x81, 0xd1, 0x0d, 0x17, 0xc6, 0x90, 0x35, 0x8d, 0x12, 0x51, 0xb2, 0x50,
0x16, 0x4a, 0x33, 0x4c, 0x1b, 0x75, 0xf9, 0x84, 0x61, 0xcc, 0x29, 0xd8, 0x68, 0x8a, 0x79, 0x9f, 0x9a, 0x61, 0xda, 0xa8, 0xcb, 0x27, 0x0c, 0x63, 0x4e, 0xc1, 0x46, 0x53, 0xcc, 0xfb, 0x94, 0x9f,
0xf2, 0x53, 0x0e, 0x88, 0xde, 0x07, 0x81, 0x3c, 0xe0, 0x6c, 0x34, 0x8d, 0xe2, 0x38, 0x92, 0xb4, 0x72, 0x40, 0xf4, 0x3e, 0x08, 0xe4, 0x01, 0x67, 0xa3, 0x69, 0x14, 0xc7, 0x91, 0xa4, 0x95, 0x3a,
0x52, 0x67, 0x9b, 0xba, 0xe8, 0xdf, 0xb7, 0xa0, 0xab, 0xec, 0xfe, 0x49, 0x38, 0x61, 0xa8, 0x9f, 0xdb, 0xd4, 0x45, 0xff, 0xa1, 0x05, 0x5d, 0x65, 0xf7, 0x4f, 0xc2, 0x09, 0x43, 0xfd, 0xd4, 0x71,
0x3a, 0x8e, 0x1a, 0x83, 0xb2, 0x10, 0xdd, 0xef, 0x44, 0x5e, 0x0b, 0xa9, 0x6e, 0xe0, 0x42, 0x7d, 0xd4, 0x18, 0x94, 0x85, 0xe8, 0x7e, 0x27, 0xf2, 0x5a, 0x48, 0x75, 0x03, 0x17, 0xea, 0x1b, 0x88,
0x03, 0x31, 0x41, 0x4d, 0x43, 0xf6, 0xa1, 0x08, 0xf1, 0xf2, 0x4a, 0xa8, 0x04, 0x74, 0xef, 0xae, 0x09, 0x6a, 0x1a, 0xb2, 0x0f, 0x44, 0x88, 0x97, 0x57, 0x42, 0x25, 0xa0, 0x7b, 0x77, 0x45, 0xef,
0xe8, 0x5d, 0x2c, 0x7b, 0x05, 0xe0, 0x04, 0xf5, 0xa5, 0x4a, 0x50, 0x7f, 0x00, 0x3d, 0xc5, 0x46, 0x62, 0xd9, 0x2b, 0x00, 0x27, 0xa8, 0x2f, 0x55, 0x82, 0xfa, 0x03, 0xe8, 0x29, 0x36, 0x42, 0xee,
0xc8, 0x5d, 0xd4, 0x34, 0x4a, 0x55, 0x76, 0xf6, 0xc4, 0x77, 0x28, 0xf5, 0x97, 0xbb, 0xfa, 0xcb, 0xa2, 0xa6, 0x51, 0xaa, 0xb2, 0xb3, 0x27, 0xbe, 0x43, 0xa9, 0xbf, 0xdc, 0xd5, 0x5f, 0x2e, 0x7f,
0xe5, 0x6f, 0xfb, 0x52, 0x53, 0xd2, 0xab, 0xb0, 0xa1, 0x84, 0xf7, 0x34, 0x0f, 0xb2, 0x53, 0xed, 0xd3, 0x97, 0x9a, 0x92, 0x5e, 0x85, 0x0d, 0x25, 0xbc, 0xa7, 0x79, 0x90, 0x9d, 0x6a, 0x5f, 0x1a,
0x4b, 0x43, 0x73, 0x8d, 0x21, 0x60, 0x72, 0x0f, 0x16, 0xf1, 0x33, 0xed, 0xce, 0x9a, 0xcd, 0x4b, 0x9a, 0x6b, 0x0c, 0x01, 0x93, 0x7b, 0xb0, 0x88, 0x9f, 0x69, 0x77, 0xd6, 0x6c, 0x5e, 0x92, 0x84,
0x92, 0x90, 0x2d, 0x58, 0x64, 0xe1, 0x84, 0xe9, 0xac, 0x92, 0xb8, 0xb9, 0x30, 0xee, 0x91, 0x2f, 0x6c, 0xc1, 0x22, 0x0b, 0x27, 0x4c, 0x67, 0x95, 0xc4, 0xcd, 0x85, 0x71, 0x8f, 0x7c, 0x49, 0x80,
0x09, 0xd0, 0xd8, 0x11, 0xad, 0x18, 0xbb, 0xeb, 0x0b, 0xf1, 0x08, 0x9f, 0x7c, 0x1e, 0xd2, 0x2b, 0xc6, 0x8e, 0x68, 0xc5, 0xd8, 0x5d, 0x5f, 0x88, 0x47, 0xf8, 0xe4, 0xb3, 0x90, 0x5e, 0x01, 0xf2,
0x40, 0x9e, 0x49, 0xad, 0xb5, 0x0b, 0x2a, 0x7f, 0xba, 0x00, 0x5d, 0x0b, 0x46, 0xbb, 0x9d, 0xe0, 0x4c, 0x6a, 0xad, 0x5d, 0x50, 0xf9, 0xb3, 0x05, 0xe8, 0x5a, 0x30, 0xda, 0xed, 0x04, 0x27, 0x3c,
0x84, 0x47, 0x61, 0x14, 0x4c, 0x19, 0x67, 0xb9, 0xd2, 0xd4, 0x0a, 0x2a, 0x5c, 0xe6, 0xd9, 0x64, 0x0a, 0xa3, 0x60, 0xca, 0x38, 0xcb, 0x95, 0xa6, 0x56, 0x50, 0xe1, 0x32, 0xcf, 0x26, 0xa3, 0x74,
0x94, 0xce, 0xf8, 0x28, 0x64, 0x93, 0x9c, 0xc9, 0x2b, 0x06, 0xcf, 0xaf, 0xa0, 0x48, 0x37, 0x0d, 0xc6, 0x47, 0x21, 0x9b, 0xe4, 0x4c, 0x5e, 0x31, 0x78, 0x7e, 0x05, 0x45, 0xba, 0x69, 0xf0, 0xda,
0x5e, 0xdb, 0x74, 0x52, 0x1f, 0x2a, 0xa8, 0x3e, 0xb3, 0x48, 0x19, 0xb5, 0xcb, 0x33, 0x8b, 0x94, 0xa6, 0x93, 0xfa, 0x50, 0x41, 0xf5, 0x99, 0x45, 0xca, 0xa8, 0x5d, 0x9e, 0x59, 0xa4, 0x44, 0xaa,
0x48, 0xd5, 0xe3, 0x2c, 0x36, 0x78, 0x9c, 0x8f, 0x60, 0x53, 0xfa, 0x16, 0x65, 0x9b, 0xa3, 0x8a, 0x1e, 0x67, 0xb1, 0xc1, 0xe3, 0x7c, 0x08, 0x9b, 0xd2, 0xb7, 0x28, 0xdb, 0x1c, 0x55, 0xd4, 0xe4,
0x9a, 0x5c, 0xd0, 0x8b, 0xa9, 0x12, 0xce, 0x59, 0x2b, 0x78, 0x11, 0xfd, 0x5c, 0x56, 0x4c, 0x3d, 0x82, 0x5e, 0x4c, 0x95, 0x70, 0xce, 0x5a, 0xc1, 0x8b, 0xe8, 0x67, 0xb2, 0x62, 0xea, 0xf9, 0x35,
0xbf, 0x86, 0x23, 0x2d, 0x9a, 0xa3, 0x43, 0x2b, 0x4b, 0xa6, 0x35, 0x5c, 0xd0, 0x06, 0xaf, 0x5d, 0x1c, 0x69, 0xd1, 0x1c, 0x1d, 0x5a, 0x59, 0x32, 0xad, 0xe1, 0x82, 0x36, 0x78, 0xed, 0xd2, 0x76,
0xda, 0x8e, 0xa2, 0xad, 0xe0, 0xf4, 0x06, 0x5c, 0x17, 0x6a, 0xf2, 0x3c, 0xcd, 0xd2, 0x38, 0x9d, 0x14, 0x6d, 0x05, 0xa7, 0x7d, 0xe8, 0x1e, 0xf1, 0x34, 0xd3, 0x9b, 0xb2, 0x02, 0x3d, 0xd9, 0x54,
0xcc, 0x8f, 0x66, 0xc7, 0xc5, 0x38, 0x8f, 0x32, 0x4c, 0xe9, 0xe8, 0x3f, 0x79, 0xb0, 0xe1, 0xf4, 0x95, 0xf5, 0x1b, 0x70, 0x5d, 0x68, 0xd1, 0xf3, 0x34, 0x4b, 0xe3, 0x74, 0x32, 0x3f, 0x9a, 0x1d,
0xaa, 0x33, 0xdb, 0x6f, 0x49, 0x9d, 0x35, 0x75, 0x52, 0xa9, 0x59, 0xeb, 0x96, 0x67, 0x93, 0x84, 0x17, 0xe3, 0x3c, 0xca, 0x30, 0xe3, 0xa3, 0xff, 0xe4, 0xc1, 0x86, 0xd3, 0xab, 0x8e, 0x74, 0xbf,
0xf2, 0x70, 0xfa, 0xa5, 0x2a, 0x9d, 0xee, 0xc1, 0xaa, 0x1e, 0x5a, 0x7f, 0x28, 0xd5, 0x6c, 0x50, 0x25, 0x55, 0xda, 0x94, 0x51, 0xa5, 0xe2, 0xad, 0x5b, 0x8e, 0x4f, 0x12, 0xca, 0xb3, 0xeb, 0x17,
0x57, 0x33, 0xf5, 0xfd, 0x8a, 0xfa, 0x40, 0xb3, 0xf8, 0x5d, 0x99, 0x54, 0xb1, 0x50, 0x2c, 0x42, 0xaa, 0xb2, 0xba, 0x07, 0xab, 0x7a, 0x66, 0xfa, 0x43, 0xa9, 0x85, 0x83, 0xba, 0x16, 0xaa, 0xef,
0x9f, 0x48, 0x86, 0xfa, 0x7b, 0x3b, 0x91, 0xd3, 0x33, 0x18, 0x1b, 0xb0, 0xa0, 0x7f, 0xe6, 0x01, 0x57, 0xd4, 0x07, 0x9a, 0xc5, 0xef, 0xc9, 0x9c, 0x8b, 0x85, 0x62, 0x8d, 0xfa, 0xc0, 0x32, 0xd4,
0x94, 0xb3, 0xc3, 0x9d, 0x2f, 0xbd, 0xb3, 0x27, 0xaa, 0x4e, 0x25, 0x80, 0x29, 0x90, 0xa9, 0xe2, 0xdf, 0xdb, 0x79, 0x9e, 0x9e, 0xc1, 0xd8, 0x80, 0x05, 0xfd, 0x73, 0x0f, 0xa0, 0x9c, 0x1d, 0x2a,
0x95, 0x0e, 0xbf, 0xab, 0x31, 0xcc, 0x29, 0xee, 0xc2, 0xea, 0x24, 0x4e, 0x8f, 0x45, 0xf8, 0xc4, 0x46, 0xe9, 0xbc, 0x3d, 0x51, 0x94, 0x2a, 0x01, 0xcc, 0x90, 0x4c, 0x91, 0xaf, 0x8c, 0x07, 0x5d,
0x8c, 0x8a, 0x15, 0xea, 0x02, 0x61, 0x45, 0xc2, 0x9f, 0x29, 0xb4, 0x8c, 0x0e, 0x6d, 0x2b, 0x3a, 0x8d, 0x61, 0xca, 0x71, 0x17, 0x56, 0x27, 0x71, 0x7a, 0x2c, 0xa2, 0x2b, 0x26, 0x5c, 0xac, 0x50,
0xd0, 0x3f, 0x6f, 0x99, 0xfa, 0x52, 0xb9, 0xe6, 0x0b, 0xcd, 0x88, 0xec, 0xd6, 0xbc, 0xdf, 0x05, 0xf7, 0x0b, 0x2b, 0x12, 0xfe, 0x54, 0xa1, 0x65, 0xf0, 0x68, 0x5b, 0xc1, 0x83, 0xfe, 0x45, 0xcb,
0xe5, 0x1c, 0x71, 0x4c, 0x3d, 0xfc, 0xd6, 0x83, 0xc8, 0x43, 0x58, 0xc9, 0xa5, 0x7b, 0xd1, 0xbe, 0x94, 0x9f, 0xca, 0x35, 0x5f, 0x68, 0x65, 0x64, 0xb7, 0xe6, 0x1c, 0x2f, 0xa8, 0xf6, 0x88, 0x53,
0xa7, 0xfd, 0x16, 0xdf, 0xd3, 0xcf, 0x9d, 0xc0, 0xf2, 0xff, 0x60, 0x2d, 0x08, 0xcf, 0x58, 0xce, 0xec, 0xe1, 0x37, 0x9e, 0x53, 0x1e, 0xc2, 0x4a, 0x2e, 0xbd, 0x8f, 0x76, 0x4d, 0xed, 0xb7, 0xb8,
0x23, 0x91, 0xce, 0x8a, 0xf8, 0x2d, 0x3d, 0xe6, 0xaa, 0x85, 0x8b, 0xb0, 0x7a, 0x17, 0x56, 0xd5, 0xa6, 0x7e, 0xee, 0xc4, 0x9d, 0xdf, 0x80, 0xb5, 0x20, 0x3c, 0x63, 0x39, 0x8f, 0x44, 0xb6, 0x2b,
0xa5, 0x8d, 0xa1, 0x54, 0x37, 0xbe, 0x25, 0x8c, 0x84, 0xf4, 0xaf, 0x75, 0x29, 0xcb, 0xdd, 0xc3, 0xc2, 0xbb, 0x74, 0xa8, 0xab, 0x16, 0x2e, 0xa2, 0xee, 0x5d, 0x58, 0x55, 0x77, 0x3a, 0x86, 0x52,
0x8b, 0x25, 0x62, 0xaf, 0xae, 0x55, 0x59, 0xdd, 0x77, 0x55, 0xe9, 0x29, 0xd4, 0x39, 0xb3, 0x2a, 0x5d, 0x08, 0x97, 0x30, 0x12, 0xd2, 0xbf, 0xd1, 0x95, 0x2e, 0x77, 0x0f, 0x2f, 0x96, 0x88, 0xbd,
0xf0, 0x49, 0x50, 0x95, 0x01, 0x5d, 0x91, 0xb6, 0xdf, 0x45, 0xa4, 0x74, 0x1b, 0x56, 0x8f, 0x18, 0xba, 0x56, 0x65, 0x75, 0xdf, 0x56, 0x95, 0xa9, 0x50, 0xa7, 0xd4, 0xaa, 0xfe, 0x27, 0x41, 0x55,
0xdf, 0xc3, 0x1d, 0xd4, 0x9e, 0xef, 0x06, 0x74, 0x12, 0xf6, 0x6a, 0x24, 0xb7, 0x58, 0xc6, 0xe9, 0x25, 0x74, 0x45, 0xda, 0x7e, 0x17, 0x91, 0xd2, 0x6d, 0x58, 0x3d, 0x62, 0x7c, 0x0f, 0x77, 0x50,
0xe5, 0x84, 0xbd, 0x12, 0x34, 0x94, 0xc0, 0x5a, 0x49, 0xaf, 0x2e, 0xac, 0xfe, 0xa2, 0x05, 0x97, 0x3b, 0xc6, 0x1b, 0xd0, 0x49, 0xd8, 0xab, 0x91, 0xdc, 0x62, 0x19, 0xc6, 0x97, 0x13, 0xf6, 0x4a,
0x3f, 0x4f, 0xce, 0xd2, 0x68, 0x2c, 0x8a, 0x49, 0x53, 0x36, 0x4d, 0xf5, 0x95, 0x24, 0xfe, 0xc6, 0xd0, 0x50, 0x02, 0x6b, 0x25, 0xbd, 0xb2, 0xba, 0xbf, 0x6c, 0xc1, 0xe5, 0xcf, 0x92, 0xb3, 0x34,
0xb0, 0x2f, 0xee, 0x24, 0x32, 0xae, 0xaa, 0x3c, 0xba, 0x89, 0x21, 0x30, 0x2f, 0xef, 0xbf, 0xa5, 0x1a, 0x8b, 0x5a, 0xd3, 0x94, 0x4d, 0x53, 0x7d, 0x63, 0x89, 0xbf, 0x31, 0x2b, 0x10, 0x57, 0x16,
0xb6, 0x59, 0x08, 0xd9, 0x84, 0xa5, 0xdc, 0xbe, 0xab, 0x57, 0xad, 0xf2, 0x3e, 0x76, 0xd1, 0xba, 0x19, 0x57, 0x45, 0x20, 0xdd, 0xc4, 0x08, 0x99, 0x97, 0xd7, 0xe3, 0x52, 0xdb, 0x2c, 0x84, 0x6c,
0x8f, 0x15, 0x65, 0x45, 0x79, 0xdd, 0x22, 0xb6, 0x64, 0xd9, 0xd7, 0x4d, 0x91, 0xbe, 0xe6, 0x4c, 0xc2, 0x52, 0x6e, 0x5f, 0xe5, 0xab, 0x56, 0x79, 0x5d, 0xbb, 0x68, 0x5d, 0xd7, 0x8a, 0xaa, 0xa3,
0xdd, 0x57, 0x61, 0x30, 0xbd, 0xac, 0xd2, 0x57, 0x1b, 0xc4, 0x80, 0x2b, 0x3f, 0x90, 0x34, 0xd2, 0xbc, 0x8d, 0x11, 0x5b, 0xb2, 0xec, 0xeb, 0xa6, 0xc8, 0x6e, 0x73, 0xa6, 0xae, 0xb3, 0x30, 0xd6,
0x21, 0xd9, 0x10, 0x26, 0x20, 0xd5, 0xeb, 0xfe, 0x8e, 0x54, 0x93, 0x0a, 0x4c, 0xbf, 0x02, 0xb2, 0x5e, 0x56, 0xd9, 0xad, 0x0d, 0x62, 0x3c, 0x96, 0x1f, 0x48, 0x1a, 0xe9, 0xaf, 0x6c, 0x08, 0xf3,
0x17, 0x86, 0x4a, 0x2a, 0x26, 0x1b, 0x2f, 0xd7, 0xe3, 0x39, 0xeb, 0x69, 0xe0, 0xdb, 0x6a, 0xe6, 0x93, 0xea, 0x6b, 0x80, 0x8e, 0x54, 0x93, 0x0a, 0x4c, 0xbf, 0x04, 0xb2, 0x17, 0x86, 0x4a, 0x2a,
0xfb, 0x04, 0xba, 0x87, 0xd6, 0x7b, 0x05, 0x21, 0x40, 0xfd, 0x52, 0x41, 0x09, 0xdd, 0x42, 0xac, 0x26, 0x59, 0x2f, 0xd7, 0xe3, 0x39, 0xeb, 0x69, 0xe0, 0xdb, 0x6a, 0xe6, 0xfb, 0x04, 0xba, 0x87,
0x01, 0x5b, 0xf6, 0x80, 0xf4, 0xb7, 0x81, 0x1c, 0x44, 0x05, 0x37, 0xf3, 0x33, 0xe7, 0x24, 0x53, 0xd6, 0x73, 0x06, 0x21, 0x40, 0xfd, 0x90, 0x41, 0x09, 0xdd, 0x42, 0xac, 0x01, 0x5b, 0xf6, 0x80,
0x47, 0xb1, 0xce, 0x49, 0x0a, 0x13, 0xe7, 0xa4, 0x3d, 0x79, 0xfd, 0x53, 0x5d, 0xd8, 0x3d, 0x58, 0xf4, 0x77, 0x80, 0x1c, 0x44, 0x05, 0x37, 0xf3, 0x33, 0xc7, 0x28, 0x53, 0x66, 0xb1, 0x8e, 0x51,
0x8e, 0x24, 0xa4, 0xfd, 0xe7, 0x8a, 0x52, 0x3c, 0x4d, 0x69, 0xfa, 0x31, 0xd2, 0x2b, 0xd0, 0x71, 0x0a, 0x13, 0xc7, 0xa8, 0x3d, 0x79, 0x3b, 0x54, 0x5d, 0xd8, 0x3d, 0x58, 0x8e, 0x24, 0xa4, 0xfd,
0xcf, 0xbf, 0xf4, 0xe0, 0xb2, 0x5a, 0x1a, 0xc6, 0x29, 0xe7, 0xa5, 0x86, 0x5c, 0x98, 0x83, 0x35, 0xe7, 0x8a, 0x52, 0x3c, 0x4d, 0x69, 0xfa, 0x31, 0x11, 0x50, 0xa0, 0xe3, 0x9e, 0x7f, 0xe1, 0xc1,
0xdf, 0xc9, 0xd7, 0x77, 0x7a, 0xa1, 0x69, 0xa7, 0x09, 0xb4, 0xb3, 0x80, 0x9f, 0x8a, 0x24, 0xb6, 0x65, 0xb5, 0x34, 0x0c, 0x63, 0xce, 0x43, 0x0e, 0xb9, 0x30, 0x07, 0x6b, 0xbe, 0xb2, 0xaf, 0xef,
0xe3, 0x8b, 0xdf, 0xfa, 0x50, 0xb2, 0x58, 0x1e, 0x4a, 0xd4, 0x55, 0x97, 0x9a, 0x94, 0xb9, 0x85, 0xf4, 0x42, 0xd3, 0x4e, 0x13, 0x68, 0x67, 0x01, 0x3f, 0x15, 0x39, 0x6e, 0xc7, 0x17, 0xbf, 0xf5,
0xf9, 0x54, 0x5e, 0x75, 0x95, 0x70, 0x29, 0x03, 0x35, 0xc1, 0xaa, 0x0c, 0x14, 0xa9, 0x6f, 0xfa, 0x99, 0x65, 0xb1, 0x3c, 0xb3, 0xa8, 0x9b, 0x30, 0x35, 0x29, 0x73, 0x49, 0xf3, 0x89, 0xbc, 0x09,
0xe9, 0x10, 0x06, 0x8f, 0x59, 0xcc, 0x38, 0xdb, 0x8b, 0xe3, 0x2a, 0xff, 0x1b, 0x70, 0xbd, 0xa1, 0x2b, 0xe1, 0x52, 0x06, 0x6a, 0x82, 0x55, 0x19, 0x28, 0x52, 0xdf, 0xf4, 0xd3, 0x21, 0x0c, 0x1e,
0x4f, 0xd9, 0xda, 0x67, 0xb0, 0xfe, 0x98, 0x1d, 0xcf, 0x26, 0x07, 0xec, 0xac, 0x2c, 0xb9, 0x12, 0xb3, 0x98, 0x71, 0xb6, 0x17, 0xc7, 0x55, 0xfe, 0x37, 0xe0, 0x7a, 0x43, 0x9f, 0xb2, 0xb5, 0x4f,
0x68, 0x17, 0xa7, 0xe9, 0x2b, 0xb5, 0x5f, 0xe2, 0x37, 0x79, 0x0f, 0x20, 0x46, 0x9a, 0x51, 0x91, 0x61, 0xfd, 0x31, 0x3b, 0x9e, 0x4d, 0x0e, 0xd8, 0x59, 0x59, 0x91, 0x25, 0xd0, 0x2e, 0x4e, 0xd3,
0xb1, 0xb1, 0xd2, 0xa6, 0x8e, 0x40, 0x8e, 0x32, 0x36, 0xa6, 0x1f, 0x01, 0xb1, 0xf9, 0xa8, 0x25, 0x57, 0x6a, 0xbf, 0xc4, 0x6f, 0xf2, 0x1e, 0x40, 0x8c, 0x34, 0xa3, 0x22, 0x63, 0x63, 0xa5, 0x4d,
0xa0, 0x05, 0xcc, 0x8e, 0x47, 0xc5, 0xbc, 0xe0, 0x6c, 0xaa, 0x8d, 0xdf, 0x86, 0xe8, 0x5d, 0xe8, 0x1d, 0x81, 0x1c, 0x65, 0x6c, 0x4c, 0x3f, 0x04, 0x62, 0xf3, 0x51, 0x4b, 0x40, 0x0b, 0x98, 0x1d,
0x1d, 0x06, 0x73, 0x9f, 0x7d, 0xad, 0x1e, 0xc0, 0xe0, 0x99, 0x28, 0x98, 0xa3, 0x7a, 0x9a, 0x33, 0x8f, 0x8a, 0x79, 0xc1, 0xd9, 0x54, 0x1b, 0xbf, 0x0d, 0xd1, 0xbb, 0xd0, 0x3b, 0x0c, 0xe6, 0x3e,
0x91, 0xe8, 0xa6, 0x39, 0x2c, 0x49, 0x42, 0x64, 0x1a, 0xb2, 0x82, 0x47, 0x89, 0x2c, 0x6b, 0x2a, 0xfb, 0x4a, 0xbd, 0x8f, 0xc1, 0x23, 0x53, 0x30, 0x47, 0xf5, 0x34, 0x47, 0x26, 0xd1, 0x4d, 0x73,
0xa6, 0x16, 0x54, 0xdb, 0xee, 0x56, 0xc3, 0x76, 0xab, 0xd4, 0x45, 0xdf, 0x72, 0xaa, 0x7d, 0x75, 0x58, 0x92, 0x84, 0xc8, 0x34, 0x64, 0x05, 0x8f, 0x12, 0x59, 0xf5, 0x54, 0x4c, 0x2d, 0xa8, 0xb6,
0xb0, 0xdd, 0x7f, 0x18, 0x40, 0xc7, 0x64, 0x82, 0xe4, 0x67, 0xd0, 0x77, 0x8e, 0xf4, 0xe4, 0x86, 0xdd, 0xad, 0x86, 0xed, 0x56, 0x99, 0x8d, 0xbe, 0x04, 0x55, 0xfb, 0xea, 0x60, 0xbb, 0xff, 0x31,
0xda, 0x8e, 0xa6, 0x1a, 0xc1, 0xf0, 0x66, 0x73, 0xa7, 0x12, 0xfb, 0xad, 0x6f, 0x7e, 0xf3, 0xaf, 0x80, 0x8e, 0x49, 0x14, 0xc9, 0x4f, 0xa1, 0xef, 0x9c, 0xf8, 0xc9, 0x0d, 0xb5, 0x1d, 0x4d, 0x25,
0xbf, 0x6a, 0x0d, 0xc8, 0xe6, 0xce, 0xd9, 0x87, 0x3b, 0xea, 0xcc, 0xbe, 0x23, 0x4a, 0x10, 0xf2, 0x84, 0xe1, 0xcd, 0xe6, 0x4e, 0x25, 0xf6, 0x5b, 0x5f, 0xff, 0xfa, 0x5f, 0x7f, 0xd9, 0x1a, 0x90,
0x26, 0xe8, 0x25, 0xac, 0xb8, 0x47, 0x7e, 0x72, 0xd3, 0x75, 0xbc, 0x95, 0xd1, 0xde, 0xbb, 0xa0, 0xcd, 0x9d, 0xb3, 0x0f, 0x76, 0xd4, 0x91, 0x7e, 0x47, 0x54, 0x28, 0xe4, 0x45, 0xd1, 0x4b, 0x58,
0x57, 0x0d, 0x77, 0x53, 0x0c, 0xb7, 0x49, 0xae, 0xd8, 0xc3, 0x99, 0x0c, 0x8d, 0x89, 0xbb, 0x3b, 0x71, 0x2b, 0x02, 0xe4, 0xa6, 0xeb, 0x78, 0x2b, 0xa3, 0xbd, 0x77, 0x41, 0xaf, 0x1a, 0xee, 0xa6,
0xfb, 0x19, 0x16, 0xd1, 0xfc, 0x9a, 0x9f, 0x67, 0x0d, 0xaf, 0xd7, 0x9f, 0x5c, 0xa9, 0x37, 0x5a, 0x18, 0x6e, 0x93, 0x5c, 0xb1, 0x87, 0x33, 0x09, 0x1c, 0x13, 0x57, 0x7b, 0xf6, 0x2b, 0x2d, 0xa2,
0x74, 0x20, 0x86, 0x22, 0x64, 0x0d, 0x87, 0xb2, 0x5f, 0x61, 0x91, 0x9f, 0x42, 0xc7, 0x3c, 0x39, 0xf9, 0x35, 0xbf, 0xde, 0x1a, 0x5e, 0xaf, 0xbf, 0xc8, 0x52, 0x4f, 0xb8, 0xe8, 0x40, 0x0c, 0x45,
0x21, 0xd7, 0xac, 0x07, 0x36, 0xf6, 0x23, 0x96, 0xe1, 0xa0, 0xde, 0xa1, 0x16, 0x71, 0x43, 0x70, 0xc8, 0x1a, 0x0e, 0x65, 0x3f, 0xd2, 0x22, 0x3f, 0x81, 0x8e, 0x79, 0x91, 0x42, 0xae, 0x59, 0xef,
0xbe, 0x4a, 0x6b, 0x9c, 0x3f, 0xf6, 0xee, 0x91, 0x03, 0xb8, 0xaa, 0xac, 0xff, 0x98, 0xfd, 0x77, 0x6f, 0xec, 0x37, 0x2e, 0xc3, 0x41, 0xbd, 0x43, 0x27, 0x63, 0x82, 0xf3, 0x55, 0x5a, 0xe3, 0xfc,
0x56, 0xd2, 0xf0, 0x78, 0xec, 0xbe, 0x47, 0x1e, 0xc2, 0xb2, 0x7e, 0x85, 0x43, 0x36, 0x9b, 0x9f, 0x91, 0x77, 0x8f, 0x1c, 0xc0, 0x55, 0x65, 0xfd, 0xc7, 0xec, 0x7f, 0xb2, 0x92, 0x86, 0xb7, 0x65,
0x02, 0x0d, 0xaf, 0xd5, 0x70, 0xa5, 0xf4, 0x7b, 0x00, 0xe5, 0xa3, 0x13, 0x32, 0xb8, 0xe8, 0x6d, 0xf7, 0x3d, 0xf2, 0x10, 0x96, 0xf5, 0x23, 0x1d, 0xb2, 0xd9, 0xfc, 0x52, 0x68, 0x78, 0xad, 0x86,
0x8c, 0x11, 0x62, 0xc3, 0x0b, 0x95, 0x89, 0x78, 0x73, 0xe3, 0xbe, 0x69, 0x21, 0xdf, 0x29, 0xe9, 0x2b, 0xa5, 0xdf, 0x03, 0x28, 0xdf, 0xa4, 0x90, 0xc1, 0x45, 0x4f, 0x67, 0x8c, 0x10, 0x1b, 0x1e,
0x1b, 0x5f, 0xbb, 0xbc, 0x85, 0x21, 0xdd, 0x14, 0xb2, 0x5b, 0x23, 0x2b, 0x28, 0xbb, 0x84, 0xbd, 0xb0, 0x4c, 0xc4, 0x93, 0x1c, 0xf7, 0xc9, 0x0b, 0xf9, 0x56, 0x49, 0xdf, 0xf8, 0x18, 0xe6, 0x2d,
0xd2, 0xb7, 0xd8, 0x3f, 0x81, 0xae, 0xf5, 0x32, 0x85, 0x58, 0x97, 0x03, 0x95, 0x97, 0x27, 0xc3, 0x0c, 0xe9, 0xa6, 0x90, 0xdd, 0x1a, 0x59, 0x41, 0xd9, 0x25, 0xec, 0x95, 0xbe, 0xe4, 0xfe, 0x31,
0x61, 0x53, 0x97, 0xe2, 0x7e, 0x45, 0x70, 0x5f, 0xa1, 0x1d, 0xe4, 0x2e, 0x2e, 0x4e, 0x71, 0x4b, 0x74, 0xad, 0x87, 0x2b, 0xc4, 0xba, 0x3b, 0xa8, 0x3c, 0x4c, 0x19, 0x0e, 0x9b, 0xba, 0x14, 0xf7,
0x7e, 0x06, 0x2b, 0xee, 0x8b, 0x14, 0xa3, 0xc3, 0x8d, 0x6f, 0x5b, 0x8c, 0x0e, 0x5f, 0xf0, 0x8c, 0x2b, 0x82, 0xfb, 0x0a, 0xed, 0x20, 0x77, 0x71, 0xaf, 0x8a, 0x5b, 0xf2, 0x53, 0x58, 0x71, 0x1f,
0x45, 0x6d, 0xff, 0xbd, 0x0d, 0x33, 0xc8, 0xce, 0x1b, 0x55, 0x5f, 0x38, 0x27, 0x3f, 0x46, 0x43, 0xac, 0x18, 0x1d, 0x6e, 0x7c, 0xfa, 0x62, 0x74, 0xf8, 0x82, 0x57, 0x2e, 0x6a, 0xfb, 0xef, 0x6d,
0x55, 0x37, 0xd9, 0xa4, 0x7c, 0xa1, 0xe3, 0xde, 0x77, 0x1b, 0xdd, 0xaa, 0x5d, 0x7a, 0xd3, 0x75, 0x98, 0x41, 0x76, 0xde, 0xa8, 0xf2, 0xc3, 0x39, 0xf9, 0x11, 0x1a, 0xaa, 0xba, 0xe8, 0x26, 0xe5,
0xc1, 0xbc, 0x4b, 0xca, 0x15, 0x90, 0x1f, 0xc1, 0x65, 0x75, 0xa3, 0x4d, 0xae, 0x96, 0x3a, 0x64, 0x03, 0x1e, 0xf7, 0x3a, 0xdc, 0xe8, 0x56, 0xed, 0x4e, 0x9c, 0xae, 0x0b, 0xe6, 0x5d, 0x52, 0xae,
0x9d, 0xd1, 0x86, 0x9b, 0x55, 0x58, 0x31, 0xdb, 0x10, 0xcc, 0xfa, 0xa4, 0x8b, 0xcc, 0x26, 0x8c, 0x80, 0xfc, 0x10, 0x2e, 0xab, 0x0b, 0x6f, 0x72, 0xb5, 0xd4, 0x21, 0xeb, 0x08, 0x37, 0xdc, 0xac,
0x47, 0xc8, 0x23, 0x86, 0x55, 0xb7, 0x18, 0x5a, 0x18, 0x71, 0x34, 0x5e, 0x90, 0x18, 0x71, 0x34, 0xc2, 0x8a, 0xd9, 0x86, 0x60, 0xd6, 0x27, 0x5d, 0x64, 0x36, 0x61, 0x3c, 0x42, 0x1e, 0x31, 0xac,
0x57, 0x56, 0x5d, 0x93, 0xd6, 0xa6, 0xbc, 0xa3, 0xef, 0x7e, 0xfe, 0x10, 0x7a, 0xf6, 0xf3, 0x09, 0xba, 0xb5, 0xd2, 0xc2, 0x88, 0xa3, 0xf1, 0xfe, 0xc4, 0x88, 0xa3, 0xb9, 0xf0, 0xea, 0x9a, 0xb4,
0x32, 0xb4, 0x56, 0x5e, 0x79, 0x6a, 0x31, 0xbc, 0xd1, 0xd8, 0xe7, 0x6e, 0x2d, 0xe9, 0xd9, 0xc3, 0x36, 0xe5, 0x1d, 0x7d, 0x35, 0xf4, 0x47, 0xd0, 0xb3, 0x5f, 0x57, 0x90, 0xa1, 0xb5, 0xf2, 0xca,
0x90, 0x9f, 0xc0, 0xaa, 0x55, 0x4f, 0x3f, 0x9a, 0x27, 0x63, 0xa3, 0x3a, 0xf5, 0x1b, 0xbc, 0x61, 0x4b, 0x8c, 0xe1, 0x8d, 0xc6, 0x3e, 0x77, 0x6b, 0x49, 0xcf, 0x1e, 0x86, 0xfc, 0x18, 0x56, 0xad,
0x53, 0xce, 0x48, 0xaf, 0x09, 0xc6, 0xeb, 0xd4, 0x61, 0x8c, 0x6a, 0xf3, 0x08, 0xba, 0x76, 0xad, 0x72, 0xfb, 0xd1, 0x3c, 0x19, 0x1b, 0xd5, 0xa9, 0x5f, 0xf0, 0x0d, 0x9b, 0x72, 0x46, 0x7a, 0x4d,
0xfe, 0x2d, 0x7c, 0xaf, 0x59, 0x5d, 0xf6, 0xad, 0xd9, 0x7d, 0x8f, 0xfc, 0xda, 0x83, 0x9e, 0x7d, 0x30, 0x5e, 0xa7, 0x0e, 0x63, 0x54, 0x9b, 0x47, 0xd0, 0xb5, 0x4b, 0xf9, 0x6f, 0xe1, 0x7b, 0xcd,
0xef, 0x4b, 0x9c, 0x53, 0x50, 0x85, 0xcf, 0xc0, 0xee, 0xb3, 0x19, 0xd1, 0xaf, 0xc4, 0x24, 0x0f, 0xea, 0xb2, 0x2f, 0xd5, 0xee, 0x7b, 0xe4, 0x57, 0x1e, 0xf4, 0xec, 0x6b, 0x61, 0xe2, 0x9c, 0x82,
0xef, 0x3d, 0x73, 0x84, 0xfc, 0xc6, 0xb9, 0xce, 0xd8, 0xb6, 0x9f, 0x32, 0x9e, 0x57, 0x3b, 0xed, 0x2a, 0x7c, 0x06, 0x76, 0x9f, 0xcd, 0x88, 0x7e, 0x29, 0x26, 0x79, 0x78, 0xef, 0x99, 0x23, 0xe4,
0x1b, 0xce, 0xf3, 0x9d, 0x37, 0xe2, 0xd2, 0xe5, 0xfc, 0xbe, 0x47, 0x3e, 0x96, 0x2f, 0x52, 0x75, 0x37, 0xce, 0x6d, 0xc7, 0xb6, 0xfd, 0xd2, 0xf1, 0xbc, 0xda, 0x69, 0x5f, 0x80, 0x9e, 0xef, 0xbc,
0x82, 0x42, 0x2c, 0x67, 0x52, 0x15, 0x9b, 0xfd, 0xce, 0x73, 0xcb, 0xbb, 0xef, 0x91, 0x3f, 0x92, 0x11, 0x77, 0x32, 0xe7, 0xf7, 0x3d, 0xf2, 0x91, 0x7c, 0xb0, 0xaa, 0x13, 0x14, 0x62, 0x39, 0x93,
0xaf, 0x18, 0xd5, 0xb7, 0x42, 0xfa, 0xef, 0xfa, 0x3d, 0xbd, 0x23, 0x56, 0x74, 0x8b, 0x5e, 0x77, 0xaa, 0xd8, 0xec, 0x67, 0xa0, 0x5b, 0xde, 0x7d, 0x8f, 0xfc, 0xb1, 0x7c, 0xe4, 0xa8, 0xbe, 0x15,
0x56, 0x54, 0xf5, 0xa6, 0x87, 0x00, 0x65, 0xb6, 0x49, 0x2a, 0xa9, 0x97, 0xf1, 0x33, 0xf5, 0x84, 0xd2, 0x7f, 0xd7, 0xef, 0xe9, 0x1d, 0xb1, 0xa2, 0x5b, 0xf4, 0xba, 0xb3, 0xa2, 0xaa, 0x37, 0x3d,
0xd4, 0xdd, 0x55, 0x9d, 0xa1, 0x49, 0x67, 0xd0, 0xb3, 0xf2, 0xbc, 0xc2, 0x6c, 0x6b, 0x3d, 0x6b, 0x04, 0x28, 0xb3, 0x4d, 0x52, 0x49, 0xbd, 0x8c, 0x9f, 0xa9, 0x27, 0xa4, 0xee, 0xae, 0xea, 0x0c,
0x1c, 0x0e, 0x9b, 0xba, 0x14, 0xff, 0xef, 0x0a, 0xfe, 0xef, 0x91, 0x1b, 0x36, 0xff, 0x9d, 0x37, 0x4d, 0x3a, 0x83, 0x9e, 0x95, 0xe7, 0x15, 0x66, 0x5b, 0xeb, 0x59, 0xe3, 0x70, 0xd8, 0xd4, 0xa5,
0x76, 0x96, 0x79, 0x4e, 0xbe, 0x82, 0xfe, 0x41, 0x9a, 0xbe, 0x9c, 0x65, 0xe6, 0x10, 0xe1, 0xe6, 0xf8, 0x7f, 0x5b, 0xf0, 0x7f, 0x8f, 0xdc, 0xb0, 0xf9, 0xef, 0xbc, 0xb1, 0xb3, 0xcc, 0x73, 0xf2,
0x4d, 0x98, 0xe9, 0x0e, 0x2b, 0x8b, 0xa2, 0xef, 0x0b, 0xce, 0x37, 0xc8, 0x75, 0x97, 0x73, 0x99, 0x25, 0xf4, 0x0f, 0xd2, 0xf4, 0xe5, 0x2c, 0x33, 0x87, 0x08, 0x37, 0x6f, 0xc2, 0x4c, 0x77, 0x58,
0xfb, 0x9e, 0x93, 0x00, 0xd6, 0x4d, 0x8c, 0x31, 0x0b, 0x19, 0xba, 0x7c, 0xec, 0x14, 0xb4, 0x36, 0x59, 0x14, 0x7d, 0x5f, 0x70, 0xbe, 0x41, 0xae, 0xbb, 0x9c, 0xcb, 0xdc, 0xf7, 0x9c, 0x04, 0xb0,
0x86, 0x13, 0xf5, 0xcd, 0x18, 0x85, 0xe6, 0x79, 0xdf, 0x23, 0x87, 0xd0, 0x7b, 0xcc, 0xc6, 0x69, 0x6e, 0x62, 0x8c, 0x59, 0xc8, 0xd0, 0xe5, 0x63, 0xa7, 0xa0, 0xb5, 0x31, 0x9c, 0xa8, 0x6f, 0xc6,
0xc8, 0x54, 0xae, 0xb3, 0x51, 0xce, 0xdc, 0xe4, 0x48, 0xc3, 0xbe, 0x03, 0xba, 0x9e, 0x20, 0x0b, 0x28, 0x34, 0xcf, 0xfb, 0x1e, 0x39, 0x84, 0xde, 0x63, 0x36, 0x4e, 0x43, 0xa6, 0x72, 0x9d, 0x8d,
0xe6, 0x39, 0xfb, 0x7a, 0xe7, 0x8d, 0x4a, 0xa2, 0xce, 0xb5, 0x27, 0xd0, 0x89, 0x9f, 0xe3, 0x09, 0x72, 0xe6, 0x26, 0x47, 0x1a, 0xf6, 0x1d, 0xd0, 0xf5, 0x04, 0x59, 0x30, 0xcf, 0xd9, 0x57, 0x3b,
0x2a, 0x99, 0xa2, 0xe3, 0x09, 0x6a, 0x99, 0xa2, 0xe3, 0x09, 0x74, 0xe2, 0x49, 0x62, 0xcc, 0x1f, 0x6f, 0x54, 0x12, 0x75, 0xae, 0x3d, 0x81, 0x4e, 0xfc, 0x1c, 0x4f, 0x50, 0xc9, 0x14, 0x1d, 0x4f,
0x2b, 0xc9, 0xa5, 0x89, 0x54, 0x17, 0xa5, 0xa4, 0xc3, 0xdb, 0x17, 0x13, 0xb8, 0xa3, 0xdd, 0x73, 0x50, 0xcb, 0x14, 0x1d, 0x4f, 0xa0, 0x13, 0x4f, 0x12, 0x63, 0xfe, 0x58, 0x49, 0x2e, 0x4d, 0xa4,
0x47, 0x3b, 0x82, 0xfe, 0x63, 0x26, 0x85, 0x25, 0xcb, 0x77, 0x43, 0xd7, 0xb5, 0xd8, 0xa5, 0xbe, 0xba, 0x28, 0x25, 0x1d, 0xde, 0xbe, 0x98, 0xc0, 0x1d, 0xed, 0x9e, 0x3b, 0xda, 0x11, 0xf4, 0x1f,
0xaa, 0xdb, 0x11, 0x7d, 0xae, 0xa3, 0x17, 0xb5, 0x33, 0xf2, 0x53, 0xe8, 0x3e, 0x65, 0x5c, 0xd7, 0x33, 0x29, 0x2c, 0x59, 0xdd, 0x1b, 0xba, 0xae, 0xc5, 0xae, 0x04, 0x56, 0xdd, 0x8e, 0xe8, 0x73,
0xeb, 0x4c, 0xbc, 0xaf, 0x14, 0xf0, 0x86, 0x0d, 0xe5, 0x3e, 0x7a, 0x5b, 0x70, 0x1b, 0x92, 0x81, 0x1d, 0xbd, 0x28, 0xad, 0x91, 0x9f, 0x40, 0xf7, 0x29, 0xe3, 0xba, 0x9c, 0x67, 0xe2, 0x7d, 0xa5,
0xe1, 0xb6, 0xc3, 0xc2, 0x09, 0x93, 0x4e, 0x60, 0x14, 0x85, 0xe7, 0xe4, 0xf7, 0x05, 0x73, 0x53, 0xbe, 0x37, 0x6c, 0xa8, 0x06, 0xd2, 0xdb, 0x82, 0xdb, 0x90, 0x0c, 0x0c, 0xb7, 0x1d, 0x16, 0x4e,
0xcc, 0xdf, 0xb4, 0xaa, 0x40, 0x36, 0xf3, 0xd5, 0x0a, 0xde, 0xc4, 0x39, 0x49, 0x43, 0x66, 0x85, 0x98, 0x74, 0x02, 0xa3, 0x28, 0x3c, 0x27, 0x7f, 0x20, 0x98, 0x9b, 0x5a, 0xff, 0xa6, 0x55, 0x05,
0xbc, 0x04, 0xba, 0xd6, 0x05, 0x8d, 0x31, 0xa8, 0xfa, 0xad, 0x8f, 0x31, 0xa8, 0x86, 0xfb, 0x1c, 0xb2, 0x99, 0xaf, 0x56, 0xf0, 0x26, 0xce, 0x49, 0x1a, 0x32, 0x2b, 0xe4, 0x25, 0xd0, 0xb5, 0xee,
0xba, 0x25, 0xc6, 0xa1, 0xe4, 0x76, 0x39, 0x8e, 0xbc, 0xc3, 0x29, 0x47, 0xda, 0x79, 0x13, 0x4c, 0x6f, 0x8c, 0x41, 0xd5, 0x2f, 0x85, 0x8c, 0x41, 0x35, 0x5c, 0xf7, 0xd0, 0x2d, 0x31, 0x0e, 0x25,
0xf9, 0x39, 0x79, 0x21, 0x1e, 0x7d, 0xd9, 0x35, 0xc9, 0x32, 0xdf, 0xa8, 0x96, 0x2f, 0x8d, 0xb0, 0xb7, 0xcb, 0x71, 0xe4, 0x15, 0x4f, 0x39, 0xd2, 0xce, 0x9b, 0x60, 0xca, 0xcf, 0xc9, 0x0b, 0xf1,
0xac, 0x2e, 0x37, 0x07, 0x91, 0x43, 0x89, 0xc8, 0xf8, 0xc2, 0x4a, 0xdd, 0x9c, 0xda, 0xac, 0xd6, 0x26, 0xcc, 0x2e, 0x59, 0x96, 0xf9, 0x46, 0xb5, 0xba, 0x69, 0x84, 0x65, 0x75, 0xb9, 0x39, 0x88,
0x92, 0x0b, 0x4b, 0x70, 0x66, 0x65, 0x0d, 0x65, 0x38, 0x9d, 0xc5, 0xc9, 0xda, 0x82, 0x95, 0xc5, 0x1c, 0x4a, 0x44, 0xc6, 0xdf, 0x06, 0x38, 0xe2, 0x69, 0xf6, 0x38, 0x60, 0xd3, 0x34, 0x29, 0x3d,
0x39, 0xc5, 0x09, 0x2b, 0x8b, 0x73, 0x8b, 0x10, 0x98, 0xc5, 0x95, 0x07, 0x1a, 0x93, 0xc5, 0xd5, 0x59, 0x59, 0x96, 0x2b, 0x3d, 0x99, 0x55, 0x9b, 0x23, 0x2f, 0xac, 0x8c, 0xcf, 0xa9, 0xf8, 0x6a,
0xce, 0x4a, 0xc6, 0x19, 0xd6, 0x4f, 0x3f, 0xc7, 0x4b, 0xe2, 0x3f, 0x3b, 0xfe, 0xff, 0x7f, 0x05, 0xe5, 0xba, 0xb0, 0x72, 0x67, 0x04, 0xd2, 0x50, 0xbd, 0xd3, 0xc9, 0x9f, 0x2c, 0x49, 0x58, 0xc9,
0x00, 0x00, 0xff, 0xff, 0x23, 0xe3, 0x4a, 0xbc, 0x0b, 0x32, 0x00, 0x00, 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,
} }

@ -18,7 +18,7 @@ service Lightning {
rpc GetTransactions (GetTransactionsRequest) returns (TransactionDetails) { rpc GetTransactions (GetTransactionsRequest) returns (TransactionDetails) {
option (google.api.http) = { option (google.api.http) = {
get: "/v1/transactions" get: "/v1/transactions"
}; };
} }
rpc SendCoins (SendCoinsRequest) returns (SendCoinsResponse) { rpc SendCoins (SendCoinsRequest) returns (SendCoinsResponse) {
@ -166,6 +166,8 @@ service Lightning {
}; };
} }
rpc StopDaemon(StopRequest) returns (StopResponse);
rpc SubscribeChannelGraph(GraphTopologySubscription) returns (stream GraphTopologyUpdate); rpc SubscribeChannelGraph(GraphTopologySubscription) returns (stream GraphTopologyUpdate);
rpc SetAlias(SetAliasRequest) returns (SetAliasResponse); rpc SetAlias(SetAliasRequest) returns (SetAliasResponse);
@ -542,9 +544,12 @@ message NetworkInfo {
// * also additional RPC for tracking fee info once in // * also additional RPC for tracking fee info once in
} }
message StopRequest{}
message StopResponse{}
message GraphTopologySubscription {} message GraphTopologySubscription {}
message GraphTopologyUpdate { message GraphTopologyUpdate {
repeated NodeUpdate node_updates = 1; repeated NodeUpdate node_updates = 1;
repeated ChannelEdgeUpdate channel_updates = 2; repeated ChannelEdgeUpdate channel_updates = 2;
repeated ClosedChannelUpdate closed_chans = 3; repeated ClosedChannelUpdate closed_chans = 3;
} }

@ -1706,6 +1706,12 @@
"lnrpcSetAliasResponse": { "lnrpcSetAliasResponse": {
"type": "object" "type": "object"
}, },
"lnrpcStopRequest": {
"type": "object"
},
"lnrpcStopResponse": {
"type": "object"
},
"lnrpcTransaction": { "lnrpcTransaction": {
"type": "object", "type": "object",
"properties": { "properties": {

@ -1862,6 +1862,14 @@ func (r *rpcServer) GetNetworkInfo(context.Context, *lnrpc.NetworkInfoRequest) (
}, nil }, nil
} }
// StopDaemon will send a shutdown request to the interrupt handler, triggering
// a graceful shutdown of the daemon.
func (r *rpcServer) StopDaemon(context.Context, *lnrpc.StopRequest) (*lnrpc.StopResponse, error) {
shutdownRequestChannel <- struct{}{}
return &lnrpc.StopResponse{}, nil
}
// SubscribeChannelGraph launches a streaming RPC that allows the caller to // SubscribeChannelGraph launches a streaming RPC that allows the caller to
// receive notifications upon any changes the channel graph topology from the // receive notifications upon any changes the channel graph topology from the
// review of the responding node. Events notified include: new nodes coming // review of the responding node. Events notified include: new nodes coming
@ -1894,7 +1902,7 @@ func (r *rpcServer) SubscribeChannelGraph(req *lnrpc.GraphTopologySubscription,
// or the notification client was cancelled. So we'll // or the notification client was cancelled. So we'll
// exit early. // exit early.
if !ok { if !ok {
return errors.New("sever shutting down") return errors.New("server shutting down")
} }
// Convert the struct from the channel router into the // Convert the struct from the channel router into the

@ -10,16 +10,22 @@ import (
// interruptChannel is used to receive SIGINT (Ctrl+C) signals. // interruptChannel is used to receive SIGINT (Ctrl+C) signals.
var interruptChannel chan os.Signal var interruptChannel chan os.Signal
// shutdownRequestChannel is used to request the daemon to shutdown gracefully,
// similar to when receiveing SIGINT.
var shutdownRequestChannel = make(chan struct{})
// addHandlerChannel is used to add an interrupt handler to the list of handlers // addHandlerChannel is used to add an interrupt handler to the list of handlers
// to be invoked on SIGINT (Ctrl+C) signals. // to be invoked on SIGINT (Ctrl+C) signals and shutdown.
var addHandlerChannel = make(chan func()) var addHandlerChannel = make(chan func())
// mainInterruptHandler listens for SIGINT (Ctrl+C) signals on the // mainInterruptHandler listens for SIGINT (Ctrl+C) signals on the
// interruptChannel and invokes the registered interruptCallbacks accordingly. // interruptChannel and shutdown requests on the shutdownRequestChannel, and
// It also listens for callback registration. It must be run as a goroutine. // invokes the registered interruptCallbacks accordingly. It also listens for
// callback registration.
// It must be run as a goroutine.
func mainInterruptHandler() { func mainInterruptHandler() {
// interruptCallbacks is a list of callbacks to invoke when a // interruptCallbacks is a list of callbacks to invoke when a
// SIGINT (Ctrl+C) is received. // SIGINT (Ctrl+C) or a shutdown request is received.
var interruptCallbacks []func() var interruptCallbacks []func()
// isShutdown is a flag which is used to indicate whether or not // isShutdown is a flag which is used to indicate whether or not
@ -28,34 +34,43 @@ func mainInterruptHandler() {
// immediately. // immediately.
var isShutdown bool var isShutdown bool
// shutdown invokes the registered interrupt handlers, then signals the
// shutdownChannel.
shutdown := func() {
// Ignore more than one shutdown signal.
if isShutdown {
ltndLog.Infof("Already shutting down...")
return
}
isShutdown = true
ltndLog.Infof("Shutting down...")
// Run handlers in LIFO order.
for i := range interruptCallbacks {
idx := len(interruptCallbacks) - 1 - i
callback := interruptCallbacks[idx]
callback()
}
// Signal the main goroutine to shutdown.
go func() {
shutdownChannel <- struct{}{}
}()
}
for { for {
select { select {
case <-interruptChannel: case <-interruptChannel:
// Ignore more than one shutdown signal. ltndLog.Infof("Received SIGINT (Ctrl+C).")
if isShutdown { shutdown()
ltndLog.Infof("Received SIGINT (Ctrl+C). " +
"Already shutting down...")
continue
}
isShutdown = true case <-shutdownRequestChannel:
ltndLog.Infof("Received SIGINT (Ctrl+C). Shutting down...") ltndLog.Infof("Received shutdown request.")
shutdown()
// Run handlers in LIFO order.
for i := range interruptCallbacks {
idx := len(interruptCallbacks) - 1 - i
callback := interruptCallbacks[idx]
callback()
}
// Signal the main goroutine to shutdown.
go func() {
shutdownChannel <- struct{}{}
}()
case handler := <-addHandlerChannel: case handler := <-addHandlerChannel:
// The shutdown signal has already been received, so // The shutdown signal has already been received, so
// just invoke and new handlers immediately. // just invoke any new handlers immediately.
if isShutdown { if isShutdown {
handler() handler()
} }
@ -65,8 +80,8 @@ func mainInterruptHandler() {
} }
} }
// addInterruptHandler adds a handler to call when a SIGINT (Ctrl+C) is // addInterruptHandler adds a handler to call when a SIGINT (Ctrl+C) or a
// received. // shutdown request is received.
func addInterruptHandler(handler func()) { func addInterruptHandler(handler func()) {
// Create the channel and start the main interrupt handler which invokes // Create the channel and start the main interrupt handler which invokes
// all other callbacks and exits if not already done. // all other callbacks and exits if not already done.