routerrpc+lncli: add flag to suppress in-flight updates

This is a preparation for enabling the REST interface on routerrpc.
It provides REST clients that don't support server-side streaming
via keep-alive connections to use the streaming endpoint in the
typical request/response pattern. The url just needs to contain
?no_inflight_updates=true and only the terminal response is sent
back before the connection is closed.
This commit is contained in:
Joost Jager 2020-04-20 08:06:35 +02:00 committed by Olaoluwa Osuntokun
parent 1e51ec0a2d
commit d51bb65536
No known key found for this signature in database
GPG Key ID: BC13F65E2DC84465
4 changed files with 191 additions and 151 deletions

@ -397,7 +397,7 @@ func sendPaymentRequest(ctx *cli.Context,
req.FeeLimitSat = feeLimit req.FeeLimitSat = feeLimit
showInflight := ctx.Bool(showInflightFlag.Name) req.NoInflightUpdates = !ctx.Bool(showInflightFlag.Name)
stream, err := routerClient.SendPaymentV2(context.Background(), req) stream, err := routerClient.SendPaymentV2(context.Background(), req)
if err != nil { if err != nil {
@ -410,9 +410,9 @@ func sendPaymentRequest(ctx *cli.Context,
return err return err
} }
if status.Status != lnrpc.Payment_IN_FLIGHT { printRespJSON(status)
printRespJSON(status)
if status.Status != lnrpc.Payment_IN_FLIGHT {
// If we get a payment error back, we pass an error up // If we get a payment error back, we pass an error up
// to main which eventually calls fatal() and returns // to main which eventually calls fatal() and returns
// with a non-zero exit code. // with a non-zero exit code.
@ -422,10 +422,6 @@ func sendPaymentRequest(ctx *cli.Context,
return nil return nil
} }
if showInflight {
printRespJSON(status)
}
} }
} }

@ -281,7 +281,11 @@ type SendPaymentRequest struct {
//* //*
//The maximum number of partial payments that may be use to complete the full //The maximum number of partial payments that may be use to complete the full
//amount. //amount.
MaxShards uint32 `protobuf:"varint,17,opt,name=max_shards,json=maxShards,proto3" json:"max_shards,omitempty"` MaxShards uint32 `protobuf:"varint,17,opt,name=max_shards,json=maxShards,proto3" json:"max_shards,omitempty"`
//*
//If set, only the final payment update is streamed back. Intermediate updates
//that show which htlcs are still in flight are suppressed.
NoInflightUpdates bool `protobuf:"varint,18,opt,name=no_inflight_updates,json=noInflightUpdates,proto3" json:"no_inflight_updates,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -431,9 +435,20 @@ func (m *SendPaymentRequest) GetMaxShards() uint32 {
return 0 return 0
} }
func (m *SendPaymentRequest) GetNoInflightUpdates() bool {
if m != nil {
return m.NoInflightUpdates
}
return false
}
type TrackPaymentRequest struct { type TrackPaymentRequest struct {
/// The hash of the payment to look up. /// The hash of the payment to look up.
PaymentHash []byte `protobuf:"bytes,1,opt,name=payment_hash,json=paymentHash,proto3" json:"payment_hash,omitempty"` PaymentHash []byte `protobuf:"bytes,1,opt,name=payment_hash,json=paymentHash,proto3" json:"payment_hash,omitempty"`
//*
//If set, only the final payment update is streamed back. Intermediate updates
//that show which htlcs are still in flight are suppressed.
NoInflightUpdates bool `protobuf:"varint,2,opt,name=no_inflight_updates,json=noInflightUpdates,proto3" json:"no_inflight_updates,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -471,6 +486,13 @@ func (m *TrackPaymentRequest) GetPaymentHash() []byte {
return nil return nil
} }
func (m *TrackPaymentRequest) GetNoInflightUpdates() bool {
if m != nil {
return m.NoInflightUpdates
}
return false
}
type RouteFeeRequest struct { type RouteFeeRequest struct {
//* //*
//The destination once wishes to obtain a routing fee quote to. //The destination once wishes to obtain a routing fee quote to.
@ -1724,146 +1746,148 @@ func init() {
func init() { proto.RegisterFile("routerrpc/router.proto", fileDescriptor_7a0613f69d37b0a5) } func init() { proto.RegisterFile("routerrpc/router.proto", fileDescriptor_7a0613f69d37b0a5) }
var fileDescriptor_7a0613f69d37b0a5 = []byte{ var fileDescriptor_7a0613f69d37b0a5 = []byte{
// 2215 bytes of a gzipped FileDescriptorProto // 2247 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x58, 0x4d, 0x77, 0xdb, 0xc6, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x58, 0x4d, 0x77, 0xdb, 0xc6,
0xd5, 0x0e, 0x48, 0x50, 0x22, 0x2f, 0x3f, 0x04, 0x8d, 0x1c, 0x99, 0x2f, 0x15, 0x27, 0x0c, 0xde, 0xd5, 0x0e, 0x48, 0x50, 0x22, 0x2f, 0x3f, 0x04, 0x8d, 0x1c, 0x99, 0x2f, 0x65, 0x27, 0x0c, 0xde,
0xc4, 0xe6, 0x71, 0x1d, 0xc9, 0x51, 0x7b, 0x5a, 0x9f, 0xb6, 0x49, 0x4b, 0x91, 0x90, 0x05, 0x9b, 0xc4, 0xe6, 0x71, 0x1d, 0xc9, 0x51, 0x7b, 0xda, 0x9c, 0xb6, 0x49, 0x4b, 0x91, 0x90, 0x05, 0x9b,
0x02, 0x98, 0x21, 0x25, 0xdb, 0xf5, 0x62, 0x0e, 0x44, 0x0e, 0x45, 0x54, 0xf8, 0x60, 0x81, 0xa1, 0x02, 0x98, 0x21, 0x25, 0xdb, 0xf5, 0x62, 0x0e, 0x44, 0x0e, 0x45, 0x54, 0xf8, 0x60, 0x81, 0xa1,
0x1d, 0x2d, 0xbb, 0xeb, 0xe9, 0xb6, 0x8b, 0xfe, 0x84, 0xee, 0xfa, 0x0b, 0xfa, 0x5f, 0xba, 0xed, 0x1d, 0x2d, 0xbb, 0xeb, 0xe9, 0xb6, 0x3f, 0xa2, 0xbb, 0xfe, 0x82, 0xee, 0xfb, 0x33, 0xba, 0xed,
0x2f, 0xe8, 0xba, 0x67, 0x06, 0x03, 0x12, 0x94, 0x28, 0x3b, 0x1b, 0x9b, 0x78, 0xee, 0x33, 0x77, 0x2f, 0xe8, 0xba, 0x67, 0x06, 0x03, 0x12, 0x94, 0x28, 0xbb, 0xdd, 0xd8, 0xc4, 0x73, 0x9f, 0xb9,
0xee, 0x9d, 0xfb, 0xdc, 0xf9, 0x10, 0xec, 0x46, 0xe1, 0x9c, 0xd1, 0x28, 0x9a, 0x8d, 0x0e, 0x92, 0x73, 0xef, 0xdc, 0xe7, 0xce, 0x87, 0x60, 0x37, 0x0a, 0xe7, 0x8c, 0x46, 0xd1, 0x6c, 0x74, 0x90,
0x5f, 0xfb, 0xb3, 0x28, 0x64, 0x21, 0x2a, 0x2d, 0xf0, 0x46, 0x29, 0x9a, 0x8d, 0x12, 0x54, 0xff, 0xfc, 0xda, 0x9f, 0x45, 0x21, 0x0b, 0x51, 0x69, 0x81, 0x37, 0x4a, 0xd1, 0x6c, 0x94, 0xa0, 0xfa,
0xfb, 0x06, 0xa0, 0x01, 0x0d, 0xc6, 0x7d, 0xe7, 0xda, 0xa7, 0x01, 0xc3, 0xf4, 0x4f, 0x73, 0x1a, 0x3f, 0x36, 0x00, 0x0d, 0x68, 0x30, 0xee, 0x3b, 0xd7, 0x3e, 0x0d, 0x18, 0xa6, 0x7f, 0x98, 0xd3,
0x33, 0x84, 0x40, 0x1d, 0xd3, 0x98, 0xd5, 0x95, 0xa6, 0xd2, 0xaa, 0x60, 0xf1, 0x1b, 0x69, 0x90, 0x98, 0x21, 0x04, 0xea, 0x98, 0xc6, 0xac, 0xae, 0x34, 0x95, 0x56, 0x05, 0x8b, 0xdf, 0x48, 0x83,
0x77, 0x7c, 0x56, 0xcf, 0x35, 0x95, 0x56, 0x1e, 0xf3, 0x9f, 0xe8, 0xff, 0xa0, 0xe8, 0xf8, 0x8c, 0xbc, 0xe3, 0xb3, 0x7a, 0xae, 0xa9, 0xb4, 0xf2, 0x98, 0xff, 0x44, 0xff, 0x07, 0x45, 0xc7, 0x67,
0xf8, 0xb1, 0xc3, 0xea, 0x15, 0x01, 0x6f, 0x3a, 0x3e, 0x3b, 0x8d, 0x1d, 0x86, 0xbe, 0x84, 0xca, 0xc4, 0x8f, 0x1d, 0x56, 0xaf, 0x08, 0x78, 0xd3, 0xf1, 0xd9, 0x69, 0xec, 0x30, 0xf4, 0x05, 0x54,
0x2c, 0x71, 0x49, 0xa6, 0x4e, 0x3c, 0xad, 0xe7, 0x85, 0xa3, 0xb2, 0xc4, 0x4e, 0x9c, 0x78, 0x8a, 0x66, 0x89, 0x4b, 0x32, 0x75, 0xe2, 0x69, 0x3d, 0x2f, 0x1c, 0x95, 0x25, 0x76, 0xe2, 0xc4, 0x53,
0x5a, 0xa0, 0x4d, 0xdc, 0xc0, 0xf1, 0xc8, 0xc8, 0x63, 0xef, 0xc8, 0x98, 0x7a, 0xcc, 0xa9, 0xab, 0xd4, 0x02, 0x6d, 0xe2, 0x06, 0x8e, 0x47, 0x46, 0x1e, 0x7b, 0x47, 0xc6, 0xd4, 0x63, 0x4e, 0x5d,
0x4d, 0xa5, 0x55, 0xc0, 0x35, 0x81, 0x77, 0x3c, 0xf6, 0xae, 0xcb, 0x51, 0xf4, 0x08, 0xb6, 0x52, 0x6d, 0x2a, 0xad, 0x02, 0xae, 0x09, 0xbc, 0xe3, 0xb1, 0x77, 0x5d, 0x8e, 0xa2, 0xc7, 0xb0, 0x95,
0x67, 0x51, 0x12, 0x60, 0xbd, 0xd0, 0x54, 0x5a, 0x25, 0x5c, 0x9b, 0xad, 0x86, 0xfd, 0x08, 0xb6, 0x3a, 0x8b, 0x92, 0x00, 0xeb, 0x85, 0xa6, 0xd2, 0x2a, 0xe1, 0xda, 0x6c, 0x35, 0xec, 0xc7, 0xb0,
0x98, 0xeb, 0xd3, 0x70, 0xce, 0x48, 0x4c, 0x47, 0x61, 0x30, 0x8e, 0xeb, 0x1b, 0x89, 0x47, 0x09, 0xc5, 0x5c, 0x9f, 0x86, 0x73, 0x46, 0x62, 0x3a, 0x0a, 0x83, 0x71, 0x5c, 0xdf, 0x48, 0x3c, 0x4a,
0x0f, 0x12, 0x14, 0xe9, 0x50, 0x9d, 0x50, 0x4a, 0x3c, 0xd7, 0x77, 0x19, 0xe1, 0xe1, 0x6f, 0x8a, 0x78, 0x90, 0xa0, 0x48, 0x87, 0xea, 0x84, 0x52, 0xe2, 0xb9, 0xbe, 0xcb, 0x08, 0x0f, 0x7f, 0x53,
0xf0, 0xcb, 0x13, 0x4a, 0x7b, 0x1c, 0x1b, 0x38, 0x0c, 0x7d, 0x05, 0xb5, 0x25, 0x47, 0xe4, 0x58, 0x84, 0x5f, 0x9e, 0x50, 0xda, 0xe3, 0xd8, 0xc0, 0x61, 0xe8, 0x4b, 0xa8, 0x2d, 0x39, 0x22, 0xc7,
0x15, 0xa4, 0x4a, 0x4a, 0x12, 0x89, 0x3e, 0x01, 0x2d, 0x9c, 0xb3, 0xcb, 0xd0, 0x0d, 0x2e, 0xc9, 0xaa, 0x20, 0x55, 0x52, 0x92, 0x48, 0xf4, 0x29, 0x68, 0xe1, 0x9c, 0x5d, 0x86, 0x6e, 0x70, 0x49,
0x68, 0xea, 0x04, 0xc4, 0x1d, 0xd7, 0x8b, 0x4d, 0xa5, 0xa5, 0x1e, 0xe5, 0x9e, 0x2a, 0xb8, 0x96, 0x46, 0x53, 0x27, 0x20, 0xee, 0xb8, 0x5e, 0x6c, 0x2a, 0x2d, 0xf5, 0x28, 0xf7, 0x4c, 0xc1, 0xb5,
0xda, 0x3a, 0x53, 0x27, 0x30, 0xc7, 0xe8, 0x21, 0x6c, 0x79, 0x4e, 0xcc, 0xc8, 0x34, 0x9c, 0x91, 0xd4, 0xd6, 0x99, 0x3a, 0x81, 0x39, 0x46, 0x8f, 0x60, 0xcb, 0x73, 0x62, 0x46, 0xa6, 0xe1, 0x8c,
0xd9, 0xfc, 0xe2, 0x8a, 0x5e, 0xd7, 0x6b, 0x62, 0x65, 0xaa, 0x1c, 0x3e, 0x09, 0x67, 0x7d, 0x01, 0xcc, 0xe6, 0x17, 0x57, 0xf4, 0xba, 0x5e, 0x13, 0x2b, 0x53, 0xe5, 0xf0, 0x49, 0x38, 0xeb, 0x0b,
0xa2, 0x07, 0x00, 0x62, 0x55, 0xc4, 0xe4, 0xf5, 0x92, 0xc8, 0xa1, 0xc4, 0x11, 0x31, 0x31, 0xfa, 0x10, 0x3d, 0x04, 0x10, 0xab, 0x22, 0x26, 0xaf, 0x97, 0x44, 0x0e, 0x25, 0x8e, 0x88, 0x89, 0xd1,
0x16, 0xca, 0xa2, 0x9a, 0x64, 0xea, 0x06, 0x2c, 0xae, 0x43, 0x33, 0xdf, 0x2a, 0x1f, 0x6a, 0xfb, 0x37, 0x50, 0x16, 0xd5, 0x24, 0x53, 0x37, 0x60, 0x71, 0x1d, 0x9a, 0xf9, 0x56, 0xf9, 0x50, 0xdb,
0x5e, 0xc0, 0x0b, 0x8b, 0xb9, 0xe5, 0xc4, 0x0d, 0x18, 0x86, 0x28, 0xfd, 0x19, 0xa3, 0x31, 0xec, 0xf7, 0x02, 0x5e, 0x58, 0xcc, 0x2d, 0x27, 0x6e, 0xc0, 0x30, 0x44, 0xe9, 0xcf, 0x18, 0x8d, 0x61,
0xf0, 0x2a, 0x92, 0xd1, 0x3c, 0x66, 0xa1, 0x4f, 0x22, 0x3a, 0x0a, 0xa3, 0x71, 0x5c, 0x2f, 0x8b, 0x87, 0x57, 0x91, 0x8c, 0xe6, 0x31, 0x0b, 0x7d, 0x12, 0xd1, 0x51, 0x18, 0x8d, 0xe3, 0x7a, 0x59,
0xa1, 0xbf, 0xd8, 0x5f, 0x88, 0x63, 0xff, 0xb6, 0x1a, 0xf6, 0xbb, 0x34, 0x66, 0x1d, 0x31, 0x0e, 0x0c, 0xfd, 0xd9, 0xfe, 0x42, 0x1c, 0xfb, 0xb7, 0xd5, 0xb0, 0xdf, 0xa5, 0x31, 0xeb, 0x88, 0x71,
0x27, 0xc3, 0x8c, 0x80, 0x45, 0xd7, 0x78, 0x7b, 0x7c, 0x13, 0x47, 0x4f, 0x00, 0x39, 0x9e, 0x17, 0x38, 0x19, 0x66, 0x04, 0x2c, 0xba, 0xc6, 0xdb, 0xe3, 0x9b, 0x38, 0x7a, 0x0a, 0xc8, 0xf1, 0xbc,
0xbe, 0x27, 0x31, 0xf5, 0x26, 0x44, 0x56, 0xa7, 0xbe, 0xd5, 0x54, 0x5a, 0x45, 0xac, 0x09, 0xcb, 0xf0, 0x3d, 0x89, 0xa9, 0x37, 0x21, 0xb2, 0x3a, 0xf5, 0xad, 0xa6, 0xd2, 0x2a, 0x62, 0x4d, 0x58,
0x80, 0x7a, 0x13, 0xe9, 0x1e, 0xfd, 0x12, 0xaa, 0x22, 0xa6, 0x09, 0x75, 0xd8, 0x3c, 0xa2, 0x71, 0x06, 0xd4, 0x9b, 0x48, 0xf7, 0xe8, 0xe7, 0x50, 0x15, 0x31, 0x4d, 0xa8, 0xc3, 0xe6, 0x11, 0x8d,
0x5d, 0x6b, 0xe6, 0x5b, 0xb5, 0xc3, 0x6d, 0x99, 0xc8, 0x71, 0x02, 0x1f, 0xb9, 0x0c, 0x57, 0x38, 0xeb, 0x5a, 0x33, 0xdf, 0xaa, 0x1d, 0x6e, 0xcb, 0x44, 0x8e, 0x13, 0xf8, 0xc8, 0x65, 0xb8, 0xc2,
0x4f, 0x7e, 0xc7, 0x7c, 0x75, 0x7c, 0xe7, 0x47, 0x12, 0x4f, 0x1d, 0x9e, 0xc2, 0x76, 0x53, 0x69, 0x79, 0xf2, 0x3b, 0xe6, 0xab, 0xe3, 0x3b, 0x3f, 0x92, 0x78, 0xea, 0xf0, 0x14, 0xb6, 0x9b, 0x4a,
0x55, 0x71, 0xc9, 0x77, 0x7e, 0x1c, 0x08, 0xa0, 0xd1, 0x85, 0xdd, 0xf5, 0x11, 0x73, 0x09, 0xf3, 0xab, 0x8a, 0x4b, 0xbe, 0xf3, 0xe3, 0x40, 0x00, 0x68, 0x1f, 0x76, 0x82, 0x90, 0xb8, 0xc1, 0xc4,
0x25, 0xe7, 0xaa, 0x56, 0x31, 0xff, 0x89, 0xee, 0x41, 0xe1, 0x9d, 0xe3, 0xcd, 0xa9, 0x90, 0x75, 0x73, 0x2f, 0xa7, 0x8c, 0xcc, 0x67, 0x63, 0x87, 0xd1, 0xb8, 0x8e, 0x44, 0x14, 0xdb, 0x41, 0x68,
0x05, 0x27, 0x1f, 0xbf, 0xce, 0x3d, 0x53, 0xf4, 0x67, 0xb0, 0x33, 0x8c, 0x9c, 0xd1, 0xd5, 0x8d, 0x4a, 0xcb, 0x59, 0x62, 0x68, 0x74, 0x61, 0x77, 0x7d, 0x86, 0x5c, 0xf2, 0xbc, 0x44, 0xbc, 0x0b,
0xce, 0xb8, 0x29, 0x6c, 0xe5, 0x96, 0xb0, 0xf5, 0xef, 0x61, 0x4b, 0xd4, 0xe0, 0x98, 0xd2, 0x0f, 0x54, 0xcc, 0x7f, 0xa2, 0x7b, 0x50, 0x78, 0xe7, 0x78, 0x73, 0x2a, 0xda, 0xa0, 0x82, 0x93, 0x8f,
0xf5, 0xd3, 0x7d, 0xe0, 0xdd, 0x22, 0xd4, 0x97, 0xf4, 0xd4, 0x86, 0xe3, 0x73, 0xe1, 0xe9, 0x63, 0x5f, 0xe6, 0xbe, 0x55, 0xf4, 0x29, 0xec, 0x0c, 0x23, 0x67, 0x74, 0x75, 0xa3, 0x93, 0x6e, 0x36,
0xd0, 0x96, 0xe3, 0xe3, 0x59, 0x18, 0xc4, 0x94, 0x37, 0x0b, 0x2f, 0x11, 0x57, 0x19, 0x17, 0xa5, 0x82, 0x72, 0xbb, 0x11, 0xee, 0x88, 0x37, 0x77, 0x47, 0xbc, 0xfa, 0xf7, 0xb0, 0x25, 0x6a, 0x7c,
0x90, 0xa3, 0x22, 0x46, 0xd5, 0x24, 0x7e, 0x4c, 0xa9, 0x10, 0xe4, 0xc3, 0xa4, 0x07, 0x88, 0x17, 0x4c, 0xe9, 0x87, 0xfa, 0xf5, 0x3e, 0xf0, 0x6e, 0x14, 0xea, 0x4e, 0x7a, 0x76, 0xc3, 0xf1, 0xb9,
0x8e, 0xae, 0x78, 0x57, 0x39, 0xd7, 0xd2, 0x7d, 0x95, 0xc3, 0xbd, 0x70, 0x74, 0xd5, 0xe5, 0xa0, 0xb0, 0xf5, 0x31, 0x68, 0xcb, 0xf1, 0xf1, 0x2c, 0x0c, 0x62, 0xca, 0x9b, 0x91, 0x4b, 0x80, 0xab,
0xfe, 0x36, 0x69, 0xfc, 0x61, 0x28, 0xe6, 0xfa, 0xe9, 0xe9, 0x21, 0x1d, 0x0a, 0x42, 0x2d, 0xc2, 0x98, 0x8b, 0x5e, 0xc8, 0x5d, 0x11, 0xa3, 0x6a, 0x12, 0x3f, 0xa6, 0x54, 0x08, 0xfe, 0x51, 0xd2,
0x6d, 0xf9, 0xb0, 0x92, 0x95, 0x1d, 0x4e, 0x4c, 0xfa, 0x5b, 0xd8, 0x59, 0x71, 0x2e, 0xb3, 0x68, 0x63, 0xc4, 0x0b, 0x47, 0x57, 0xbc, 0x6b, 0x9d, 0x6b, 0xe9, 0xbe, 0xca, 0xe1, 0x5e, 0x38, 0xba,
0x40, 0x71, 0x16, 0x51, 0xd7, 0x77, 0x2e, 0xa9, 0xf4, 0xbc, 0xf8, 0x46, 0x2d, 0xd8, 0x9c, 0x38, 0xea, 0x72, 0x50, 0x7f, 0x9b, 0x6c, 0x2c, 0xc3, 0x50, 0xcc, 0xf5, 0x3f, 0x2c, 0x87, 0x0e, 0x05,
0xae, 0x37, 0x8f, 0x52, 0xc7, 0xb5, 0x54, 0x06, 0x09, 0x8a, 0x53, 0xb3, 0xfe, 0x19, 0x34, 0x30, 0xa1, 0x46, 0xe1, 0xb6, 0x7c, 0x58, 0xc9, 0xca, 0x1a, 0x27, 0x26, 0xfd, 0x2d, 0xec, 0xac, 0x38,
0x8d, 0x29, 0x3b, 0x75, 0xe3, 0xd8, 0x0d, 0x83, 0x4e, 0x18, 0xb0, 0x28, 0xf4, 0x64, 0x06, 0xfa, 0x97, 0x59, 0x34, 0xa0, 0x38, 0x8b, 0xa8, 0xeb, 0x3b, 0x97, 0x54, 0x7a, 0x5e, 0x7c, 0xa3, 0x16,
0x03, 0xd8, 0x5b, 0x6b, 0x4d, 0x42, 0xe0, 0x83, 0x7f, 0x98, 0xd3, 0xe8, 0x7a, 0xfd, 0xe0, 0x1f, 0x6c, 0x4e, 0x1c, 0xd7, 0x9b, 0x47, 0xa9, 0xe3, 0x5a, 0x2a, 0xb3, 0x04, 0xc5, 0xa9, 0x59, 0x7f,
0x60, 0x6f, 0xad, 0x55, 0xc6, 0xff, 0x04, 0x0a, 0x33, 0xc7, 0x8d, 0xe2, 0x7a, 0x4e, 0xb4, 0xcd, 0x00, 0x0d, 0x4c, 0x63, 0xca, 0x4e, 0xdd, 0x38, 0x76, 0xc3, 0xa0, 0x13, 0x06, 0x2c, 0x0a, 0x3d,
0x6e, 0xa6, 0x6d, 0xfa, 0x8e, 0x1b, 0x9d, 0xb8, 0x31, 0x0b, 0xa3, 0x6b, 0x9c, 0x90, 0x5e, 0xa8, 0x99, 0x81, 0xfe, 0x10, 0xf6, 0xd6, 0x5a, 0x93, 0x10, 0xf8, 0xe0, 0x1f, 0xe6, 0x34, 0xba, 0x5e,
0x45, 0x45, 0xcb, 0xe9, 0x7f, 0x55, 0xa0, 0x9c, 0x31, 0xa2, 0x3d, 0x28, 0x05, 0xe1, 0x98, 0x92, 0x3f, 0xf8, 0x07, 0xd8, 0x5b, 0x6b, 0x95, 0xf1, 0x3f, 0x85, 0xc2, 0xcc, 0x71, 0x23, 0x5e, 0x7b,
0x49, 0x14, 0xfa, 0xe9, 0x22, 0x70, 0xe0, 0x38, 0x0a, 0x7d, 0xae, 0x09, 0x61, 0x64, 0xa1, 0x14, 0xde, 0x96, 0xbb, 0x99, 0xb6, 0xec, 0x3b, 0x6e, 0x74, 0xe2, 0xc6, 0x2c, 0x8c, 0xae, 0x71, 0x42,
0xe4, 0x06, 0xff, 0x1c, 0x86, 0xe8, 0x1b, 0xd8, 0x9c, 0x26, 0x0e, 0xc4, 0x56, 0x55, 0x3e, 0xdc, 0x7a, 0xa1, 0x16, 0x15, 0x2d, 0xa7, 0xff, 0x59, 0x81, 0x72, 0xc6, 0x88, 0xf6, 0xa0, 0x14, 0x84,
0xb9, 0x31, 0x77, 0xd7, 0x61, 0x0e, 0x4e, 0x39, 0x2f, 0xd4, 0x62, 0x5e, 0x53, 0x5f, 0xa8, 0x45, 0x63, 0x4a, 0x26, 0x51, 0xe8, 0xa7, 0x8b, 0xc0, 0x81, 0xe3, 0x28, 0xf4, 0xb9, 0x26, 0x84, 0x91,
0x55, 0x2b, 0xbc, 0x50, 0x8b, 0x05, 0x6d, 0xe3, 0x85, 0x5a, 0xdc, 0xd0, 0x36, 0xf5, 0xff, 0x28, 0x85, 0x52, 0xc0, 0x1b, 0xfc, 0x73, 0x18, 0xa2, 0xaf, 0x61, 0x73, 0x9a, 0x38, 0x10, 0x5b, 0x61,
0x50, 0x4c, 0xd9, 0x3c, 0x12, 0xbe, 0xa4, 0x84, 0xeb, 0x42, 0x8a, 0xa9, 0xc8, 0x81, 0xa1, 0xeb, 0xf9, 0x70, 0xe7, 0xc6, 0xdc, 0x5d, 0x87, 0x39, 0x38, 0xe5, 0xbc, 0x50, 0x8b, 0x79, 0x4d, 0x7d,
0x53, 0xd4, 0x84, 0x8a, 0x30, 0xae, 0x4a, 0x14, 0x38, 0xd6, 0x16, 0x32, 0x15, 0x7b, 0x68, 0xca, 0xa1, 0x16, 0x55, 0xad, 0xf0, 0x42, 0x2d, 0x16, 0xb4, 0x8d, 0x17, 0x6a, 0x71, 0x43, 0xdb, 0xd4,
0x10, 0x7a, 0x54, 0xe5, 0x1e, 0x9a, 0x50, 0xd2, 0x63, 0x20, 0x9e, 0x8f, 0x46, 0x34, 0x8e, 0x93, 0xff, 0xa5, 0x40, 0x31, 0x65, 0xf3, 0x48, 0xf8, 0x92, 0x12, 0xae, 0x0b, 0x29, 0xa6, 0x22, 0x07,
0x59, 0x0a, 0x09, 0x45, 0x62, 0x62, 0xa2, 0x87, 0xb0, 0x95, 0x52, 0xd2, 0xb9, 0x36, 0x12, 0xbd, 0x86, 0xae, 0x4f, 0x51, 0x13, 0x2a, 0xc2, 0xb8, 0x2a, 0x51, 0xe0, 0x58, 0x5b, 0xc8, 0x54, 0xec,
0x4a, 0x58, 0x4e, 0xd7, 0x02, 0x2d, 0xcb, 0xf3, 0x97, 0xbb, 0x76, 0x6d, 0x49, 0xe4, 0x93, 0x26, 0xd1, 0x29, 0x43, 0xe8, 0x51, 0x95, 0x7b, 0x74, 0x42, 0x49, 0x8f, 0x99, 0x78, 0x3e, 0x1a, 0xd1,
0xc9, 0xeb, 0x7f, 0x84, 0xfb, 0xa2, 0x94, 0xfd, 0x28, 0xbc, 0x70, 0x2e, 0x5c, 0xcf, 0x65, 0xd7, 0x38, 0x4e, 0x66, 0x29, 0x24, 0x14, 0x89, 0x89, 0x89, 0x1e, 0xc1, 0x56, 0x4a, 0x49, 0xe7, 0xda,
0xa9, 0xc8, 0x79, 0xe2, 0x51, 0xe8, 0x13, 0xbe, 0xb6, 0x69, 0x09, 0x38, 0x60, 0x85, 0x63, 0xca, 0x48, 0xf4, 0x2a, 0x61, 0x39, 0x5d, 0x0b, 0xb4, 0x2c, 0xcf, 0x5f, 0x9e, 0x0a, 0xb5, 0x25, 0x91,
0x4b, 0xc0, 0xc2, 0xc4, 0x24, 0x4b, 0xc0, 0x42, 0x61, 0xc8, 0x9e, 0x76, 0xf9, 0x95, 0xd3, 0x4e, 0x4f, 0x9a, 0x24, 0xaf, 0xff, 0x1e, 0xee, 0x8b, 0x52, 0xf6, 0xa3, 0xf0, 0xc2, 0xb9, 0x70, 0x3d,
0xbf, 0x82, 0xfa, 0xed, 0xb9, 0xa4, 0x66, 0x9a, 0x50, 0x9e, 0x2d, 0x61, 0x31, 0x9d, 0x82, 0xb3, 0x97, 0x5d, 0xa7, 0x22, 0xe7, 0x89, 0x47, 0xa1, 0x4f, 0xf8, 0xda, 0xa6, 0x25, 0xe0, 0x80, 0x15,
0x50, 0xb6, 0xb6, 0xb9, 0x8f, 0xd7, 0x56, 0xff, 0x87, 0x02, 0xdb, 0x47, 0x73, 0xd7, 0x1b, 0xaf, 0x8e, 0x29, 0x2f, 0x01, 0x0b, 0x13, 0x93, 0x2c, 0x01, 0x0b, 0x85, 0x21, 0x7b, 0x9a, 0xe6, 0x57,
0x34, 0x6e, 0x36, 0x3a, 0x65, 0xf5, 0x2c, 0x5e, 0x77, 0xd0, 0xe6, 0xd6, 0x1e, 0xb4, 0xeb, 0x0e, 0x4e, 0x53, 0xfd, 0x0a, 0xea, 0xb7, 0xe7, 0x92, 0x9a, 0x69, 0x42, 0x79, 0xb6, 0x84, 0xc5, 0x74,
0xb3, 0xfc, 0x9d, 0x87, 0xd9, 0x17, 0x50, 0x5e, 0x9e, 0x63, 0x71, 0x5d, 0x6d, 0xe6, 0x5b, 0x15, 0x0a, 0xce, 0x42, 0xd9, 0xda, 0xe6, 0x3e, 0x5e, 0x5b, 0xfd, 0xaf, 0x0a, 0x6c, 0x1f, 0xcd, 0x5d,
0x0c, 0xd3, 0xf4, 0x10, 0x8b, 0xf5, 0x67, 0x80, 0xb2, 0x81, 0xca, 0x05, 0x59, 0xec, 0x1f, 0xca, 0x6f, 0xbc, 0xd2, 0xb8, 0xd9, 0xe8, 0x94, 0xd5, 0xb3, 0x7e, 0xdd, 0x41, 0x9e, 0x5b, 0x7b, 0x90,
0xdd, 0xfb, 0xc7, 0x67, 0xd0, 0x18, 0xcc, 0x2f, 0xe2, 0x51, 0xe4, 0x5e, 0xd0, 0x13, 0xe6, 0x8d, 0xaf, 0x3b, 0x2c, 0xf3, 0x77, 0x1e, 0x96, 0x9f, 0x43, 0x79, 0x79, 0x4e, 0xc6, 0x75, 0xb5, 0x99,
0x8c, 0x77, 0x34, 0x60, 0x71, 0xda, 0xa5, 0xff, 0x55, 0xa1, 0xb4, 0x40, 0xd1, 0x3e, 0xec, 0xb8, 0x6f, 0x55, 0x30, 0x4c, 0xd3, 0x43, 0x32, 0xd6, 0xbf, 0x05, 0x94, 0x0d, 0x54, 0x2e, 0xc8, 0x62,
0xc1, 0x28, 0xf4, 0xd3, 0xa0, 0x03, 0xea, 0xf1, 0xb8, 0x93, 0x4d, 0x7e, 0x3b, 0x35, 0x75, 0x12, 0xff, 0x50, 0xee, 0xde, 0x3f, 0x1e, 0x40, 0x63, 0x30, 0xbf, 0x88, 0x47, 0x91, 0x7b, 0x41, 0x4f,
0x8b, 0x39, 0xe6, 0xfc, 0x95, 0x24, 0x25, 0x3f, 0x97, 0xf0, 0xb3, 0x39, 0x26, 0xfc, 0x16, 0x68, 0x98, 0x37, 0x32, 0xde, 0xd1, 0x80, 0xc5, 0x69, 0x97, 0xfe, 0x5b, 0x85, 0xd2, 0x02, 0xe5, 0xdb,
0x0b, 0xff, 0x53, 0xe6, 0x8d, 0x16, 0x8b, 0x82, 0x6b, 0x29, 0xce, 0x83, 0x49, 0x98, 0x0b, 0xcf, 0xb3, 0x1b, 0x8c, 0x42, 0x3f, 0x0d, 0x3a, 0xa0, 0x1e, 0x8f, 0x3b, 0x39, 0x14, 0xb6, 0x53, 0x53,
0x29, 0x53, 0x4d, 0x98, 0x29, 0x2e, 0x99, 0x5f, 0x42, 0x85, 0xf7, 0x43, 0xcc, 0x1c, 0x7f, 0x46, 0x27, 0xb1, 0x98, 0x63, 0xce, 0x5f, 0x49, 0x52, 0xf2, 0x73, 0x09, 0x3f, 0x9b, 0x63, 0xc2, 0x6f,
0x82, 0x58, 0xf4, 0x85, 0x8a, 0xcb, 0x0b, 0xcc, 0x8a, 0xd1, 0x77, 0x00, 0x94, 0xe7, 0x47, 0xd8, 0x81, 0xb6, 0xf0, 0x3f, 0x65, 0xde, 0x68, 0xb1, 0x28, 0xb8, 0x96, 0xe2, 0x3c, 0x98, 0x84, 0xb9,
0xf5, 0x8c, 0x8a, 0x96, 0xa8, 0x1d, 0x7e, 0x9e, 0x11, 0xc6, 0x62, 0x01, 0xf6, 0xc5, 0xbf, 0xc3, 0xf0, 0x9c, 0x32, 0xd5, 0x84, 0x99, 0xe2, 0x92, 0xf9, 0x05, 0x54, 0x78, 0x3f, 0xc4, 0xcc, 0xf1,
0xeb, 0x19, 0xc5, 0x25, 0x9a, 0xfe, 0x44, 0xdf, 0x43, 0x75, 0x12, 0x46, 0xef, 0x9d, 0x68, 0x4c, 0x67, 0x24, 0x88, 0x45, 0x5f, 0xa8, 0xb8, 0xbc, 0xc0, 0xac, 0x18, 0x7d, 0x07, 0x40, 0x79, 0x7e,
0x04, 0x28, 0xb7, 0x8d, 0xfb, 0x19, 0x0f, 0xc7, 0x89, 0x5d, 0x0c, 0x3f, 0xf9, 0x04, 0x57, 0x26, 0x84, 0x5d, 0xcf, 0xa8, 0x68, 0x89, 0xda, 0xe1, 0x67, 0x19, 0x61, 0x2c, 0x16, 0x60, 0x5f, 0xfc,
0x99, 0x6f, 0xf4, 0x12, 0x50, 0x3a, 0x5e, 0x74, 0x79, 0xe2, 0xa4, 0x28, 0x9c, 0xec, 0xdd, 0x76, 0x3b, 0xbc, 0x9e, 0x51, 0x5c, 0xa2, 0xe9, 0x4f, 0xf4, 0x3d, 0x54, 0x27, 0x61, 0xf4, 0xde, 0x89,
0xc2, 0x37, 0xe9, 0xd4, 0x91, 0x36, 0xb9, 0x81, 0xa1, 0xdf, 0x40, 0x25, 0xa6, 0x8c, 0x79, 0x54, 0xc6, 0x44, 0x80, 0x72, 0xdb, 0xb8, 0x9f, 0xf1, 0x70, 0x9c, 0xd8, 0xc5, 0xf0, 0x93, 0x4f, 0x70,
0xba, 0x29, 0x09, 0x37, 0xbb, 0x2b, 0xb7, 0x0e, 0x6e, 0x4e, 0x3d, 0x94, 0xe3, 0xe5, 0x27, 0x3a, 0x65, 0x92, 0xf9, 0x46, 0x2f, 0x01, 0xa5, 0xe3, 0x45, 0x97, 0x27, 0x4e, 0x8a, 0xc2, 0xc9, 0xde,
0x82, 0x2d, 0xcf, 0x0d, 0xae, 0xb2, 0x61, 0x80, 0x18, 0x5f, 0xcf, 0x8c, 0xef, 0xb9, 0xc1, 0x55, 0x6d, 0x27, 0x7c, 0x93, 0x4e, 0x1d, 0x69, 0x93, 0x1b, 0x18, 0xfa, 0x15, 0x54, 0x62, 0xca, 0x98,
0x36, 0x86, 0xaa, 0x97, 0x05, 0xf4, 0xdf, 0x42, 0x69, 0xb1, 0x4a, 0xa8, 0x0c, 0x9b, 0x67, 0xd6, 0x47, 0xa5, 0x9b, 0x92, 0x70, 0xb3, 0xbb, 0x72, 0xab, 0xe1, 0xe6, 0xd4, 0x43, 0x39, 0x5e, 0x7e,
0x4b, 0xcb, 0x7e, 0x65, 0x69, 0x9f, 0xa0, 0x22, 0xa8, 0x03, 0xc3, 0xea, 0x6a, 0x0a, 0x87, 0xb1, 0xa2, 0x23, 0xd8, 0xf2, 0xdc, 0xe0, 0x2a, 0x1b, 0x06, 0x88, 0xf1, 0xf5, 0xcc, 0xf8, 0x9e, 0x1b,
0xd1, 0x31, 0xcc, 0x73, 0x43, 0xcb, 0xf1, 0x8f, 0x63, 0x1b, 0xbf, 0x6a, 0xe3, 0xae, 0x96, 0x3f, 0x5c, 0x65, 0x63, 0xa8, 0x7a, 0x59, 0x40, 0xff, 0x35, 0x94, 0x16, 0xab, 0x84, 0xca, 0xb0, 0x79,
0xda, 0x84, 0x82, 0x98, 0x57, 0xff, 0x97, 0x02, 0x45, 0x51, 0xc1, 0x60, 0x12, 0xa2, 0x9f, 0xc1, 0x66, 0xbd, 0xb4, 0xec, 0x57, 0x96, 0xf6, 0x09, 0x2a, 0x82, 0x3a, 0x30, 0xac, 0xae, 0xa6, 0x70,
0x42, 0x5c, 0x62, 0x73, 0xe3, 0x07, 0xae, 0x50, 0x5d, 0x15, 0x2f, 0x04, 0x33, 0x94, 0x38, 0x27, 0x18, 0x1b, 0x1d, 0xc3, 0x3c, 0x37, 0xb4, 0x1c, 0xff, 0x38, 0xb6, 0xf1, 0xab, 0x36, 0xee, 0x6a,
0x2f, 0xa4, 0xb1, 0x20, 0xe7, 0x12, 0x72, 0x6a, 0x58, 0x90, 0x1f, 0x67, 0x3c, 0xaf, 0x6c, 0x39, 0xf9, 0xa3, 0x4d, 0x28, 0x88, 0x79, 0xf5, 0xbf, 0x2b, 0x50, 0x14, 0x15, 0x0c, 0x26, 0x21, 0xfa,
0x2a, 0xde, 0x4a, 0x0d, 0xe9, 0x0e, 0xfb, 0x38, 0xe3, 0x78, 0x65, 0x27, 0x56, 0xf1, 0x56, 0x6a, 0x09, 0x2c, 0xc4, 0x25, 0x36, 0x37, 0x7e, 0xe0, 0x0a, 0xd5, 0x55, 0xf1, 0x42, 0x30, 0x43, 0x89,
0x90, 0x5c, 0xfd, 0x57, 0x50, 0xc9, 0xd6, 0x1c, 0x3d, 0x02, 0xd5, 0x0d, 0x26, 0xa1, 0x6c, 0xc4, 0x73, 0xf2, 0x42, 0x1a, 0x0b, 0x72, 0x2e, 0x21, 0xa7, 0x86, 0x05, 0xf9, 0x49, 0xc6, 0xf3, 0xca,
0x9d, 0x1b, 0xe2, 0xe2, 0x49, 0x62, 0x41, 0xd0, 0x11, 0x68, 0x37, 0xeb, 0xac, 0x57, 0xa1, 0x9c, 0x96, 0xa3, 0xe2, 0xad, 0xd4, 0x90, 0xee, 0xb0, 0x4f, 0x32, 0x8e, 0x57, 0x76, 0x62, 0x15, 0x6f,
0x29, 0x9a, 0xfe, 0x6f, 0x05, 0xaa, 0x2b, 0x45, 0xf8, 0xc9, 0xde, 0xd1, 0x77, 0x50, 0x79, 0xef, 0xa5, 0x06, 0xc9, 0xd5, 0x7f, 0x01, 0x95, 0x6c, 0xcd, 0xd1, 0x63, 0x50, 0xdd, 0x60, 0x12, 0xca,
0x46, 0x94, 0x64, 0x8f, 0xff, 0xda, 0x61, 0x63, 0xf5, 0xf8, 0x4f, 0xff, 0xef, 0x84, 0x63, 0x8a, 0x46, 0xdc, 0xb9, 0x21, 0x2e, 0x9e, 0x24, 0x16, 0x04, 0x1d, 0x81, 0x76, 0xb3, 0xce, 0x7a, 0x15,
0xcb, 0x9c, 0x2f, 0x01, 0xf4, 0x3b, 0xa8, 0xc9, 0x91, 0x64, 0x4c, 0x99, 0xe3, 0x7a, 0x62, 0xa9, 0xca, 0x99, 0xa2, 0xe9, 0xff, 0x54, 0xa0, 0xba, 0x52, 0x84, 0xff, 0xda, 0x3b, 0xfa, 0x0e, 0x2a,
0x6a, 0x2b, 0xf2, 0x90, 0xdc, 0xae, 0xb0, 0xe3, 0xea, 0x24, 0xfb, 0x89, 0xbe, 0x5e, 0x3a, 0x88, 0xef, 0xdd, 0x88, 0x92, 0xec, 0xf1, 0x5f, 0x3b, 0x6c, 0xac, 0x1e, 0xff, 0xe9, 0xff, 0x9d, 0x70,
0x59, 0xe4, 0x06, 0x97, 0x62, 0xfd, 0x4a, 0x0b, 0xda, 0x40, 0x80, 0xfc, 0x20, 0xaf, 0xca, 0xcb, 0x4c, 0x71, 0x99, 0xf3, 0x25, 0x80, 0x7e, 0x03, 0x35, 0x39, 0x92, 0x8c, 0x29, 0x73, 0x5c, 0x4f,
0xe0, 0x80, 0x39, 0x6c, 0x1e, 0xa3, 0x6f, 0xa0, 0x10, 0x33, 0x47, 0xee, 0x64, 0xb5, 0x95, 0xde, 0x2c, 0x55, 0x6d, 0x45, 0x1e, 0x92, 0xdb, 0x15, 0x76, 0x5c, 0x9d, 0x64, 0x3f, 0xd1, 0x57, 0x4b,
0xca, 0x10, 0x29, 0x4e, 0x58, 0x2b, 0xb7, 0x9f, 0xdc, 0xad, 0xdb, 0x4f, 0x81, 0xef, 0x18, 0xc9, 0x07, 0x31, 0x8b, 0xdc, 0xe0, 0x52, 0xac, 0x5f, 0x69, 0x41, 0x1b, 0x08, 0x90, 0x1f, 0xe4, 0x55,
0x2e, 0x5a, 0x3e, 0x44, 0x32, 0xf9, 0x93, 0x61, 0xaf, 0xd3, 0x66, 0x8c, 0xfa, 0x33, 0x86, 0x13, 0x79, 0x79, 0x1c, 0x30, 0x87, 0xcd, 0x63, 0xf4, 0x35, 0x14, 0x62, 0xe6, 0xc8, 0x9d, 0xac, 0xb6,
0x42, 0x72, 0xba, 0x3d, 0xfe, 0xb3, 0x0a, 0xd5, 0x95, 0xa4, 0x56, 0x55, 0x5d, 0x85, 0x92, 0x65, 0xd2, 0x5b, 0x19, 0x22, 0xc5, 0x09, 0x6b, 0xe5, 0xf6, 0x93, 0xbb, 0x75, 0xfb, 0x29, 0xf0, 0x1d,
0x93, 0xae, 0x31, 0x6c, 0x9b, 0x3d, 0x4d, 0x41, 0x1a, 0x54, 0x6c, 0xcb, 0xb4, 0x2d, 0xd2, 0x35, 0x23, 0xd9, 0x45, 0xcb, 0x87, 0x48, 0x26, 0x7f, 0x32, 0xec, 0x75, 0xda, 0x8c, 0x51, 0x7f, 0xc6,
0x3a, 0x76, 0x97, 0xeb, 0xfb, 0x53, 0xd8, 0xee, 0x99, 0xd6, 0x4b, 0x62, 0xd9, 0x43, 0x62, 0xf4, 0x70, 0x42, 0x48, 0x4e, 0xb7, 0x27, 0x7f, 0x54, 0xa1, 0xba, 0x92, 0xd4, 0xaa, 0xaa, 0xab, 0x50,
0xcc, 0xe7, 0xe6, 0x51, 0xcf, 0xd0, 0xf2, 0xe8, 0x1e, 0x68, 0xb6, 0x45, 0x3a, 0x27, 0x6d, 0xd3, 0xb2, 0x6c, 0xd2, 0x35, 0x86, 0x6d, 0xb3, 0xa7, 0x29, 0x48, 0x83, 0x8a, 0x6d, 0x99, 0xb6, 0x45,
0x22, 0x43, 0xf3, 0xd4, 0xb0, 0xcf, 0x86, 0x9a, 0xca, 0x51, 0x1e, 0x08, 0x31, 0x5e, 0x77, 0x0c, 0xba, 0x46, 0xc7, 0xee, 0x72, 0x7d, 0x7f, 0x0a, 0xdb, 0x3d, 0xd3, 0x7a, 0x49, 0x2c, 0x7b, 0x48,
0xa3, 0x3b, 0x20, 0xa7, 0xed, 0xd7, 0x5a, 0x01, 0xd5, 0xe1, 0x9e, 0x69, 0x0d, 0xce, 0x8e, 0x8f, 0x8c, 0x9e, 0xf9, 0xdc, 0x3c, 0xea, 0x19, 0x5a, 0x1e, 0xdd, 0x03, 0xcd, 0xb6, 0x48, 0xe7, 0xa4,
0xcd, 0x8e, 0x69, 0x58, 0x43, 0x72, 0xd4, 0xee, 0xb5, 0xad, 0x8e, 0xa1, 0x6d, 0xa0, 0x5d, 0x40, 0x6d, 0x5a, 0x64, 0x68, 0x9e, 0x1a, 0xf6, 0xd9, 0x50, 0x53, 0x39, 0xca, 0x03, 0x21, 0xc6, 0xeb,
0xa6, 0xd5, 0xb1, 0x4f, 0xfb, 0x3d, 0x63, 0x68, 0x90, 0xb4, 0x8f, 0x36, 0xd1, 0x0e, 0x6c, 0x09, 0x8e, 0x61, 0x74, 0x07, 0xe4, 0xb4, 0xfd, 0x5a, 0x2b, 0xa0, 0x3a, 0xdc, 0x33, 0xad, 0xc1, 0xd9,
0x3f, 0xed, 0x6e, 0x97, 0x1c, 0xb7, 0xcd, 0x9e, 0xd1, 0xd5, 0x8a, 0x3c, 0x12, 0xc9, 0x18, 0x90, 0xf1, 0xb1, 0xd9, 0x31, 0x0d, 0x6b, 0x48, 0x8e, 0xda, 0xbd, 0xb6, 0xd5, 0x31, 0xb4, 0x0d, 0xb4,
0xae, 0x39, 0x68, 0x1f, 0x71, 0xb8, 0xc4, 0xe7, 0x34, 0xad, 0x73, 0xdb, 0xec, 0x18, 0xa4, 0xc3, 0x0b, 0xc8, 0xb4, 0x3a, 0xf6, 0x69, 0xbf, 0x67, 0x0c, 0x0d, 0x92, 0xf6, 0xd1, 0x26, 0xda, 0x81,
0xdd, 0x72, 0x14, 0x38, 0x39, 0x45, 0xcf, 0xac, 0xae, 0x81, 0xfb, 0x6d, 0xb3, 0xab, 0x95, 0xd1, 0x2d, 0xe1, 0xa7, 0xdd, 0xed, 0x92, 0xe3, 0xb6, 0xd9, 0x33, 0xba, 0x5a, 0x91, 0x47, 0x22, 0x19,
0x1e, 0xdc, 0x4f, 0x61, 0xe3, 0x75, 0xdf, 0xc4, 0x6f, 0xc8, 0xd0, 0xb6, 0xc9, 0xc0, 0xb6, 0x2d, 0x03, 0xd2, 0x35, 0x07, 0xed, 0x23, 0x0e, 0x97, 0xf8, 0x9c, 0xa6, 0x75, 0x6e, 0x9b, 0x1d, 0x83,
0xad, 0x92, 0xf5, 0xc4, 0xb3, 0xb5, 0xfb, 0x86, 0xa5, 0x55, 0xd1, 0x7d, 0xd8, 0x39, 0xed, 0xf7, 0x74, 0xb8, 0x5b, 0x8e, 0x02, 0x27, 0xa7, 0xe8, 0x99, 0xd5, 0x35, 0x70, 0xbf, 0x6d, 0x76, 0xb5,
0x49, 0x6a, 0x49, 0x93, 0xad, 0x71, 0x7a, 0xbb, 0xdb, 0xc5, 0xc6, 0x60, 0x40, 0x4e, 0xcd, 0xc1, 0x32, 0xda, 0x83, 0xfb, 0x29, 0x6c, 0xbc, 0xee, 0x9b, 0xf8, 0x0d, 0x19, 0xda, 0x36, 0x19, 0xd8,
0x69, 0x7b, 0xd8, 0x39, 0xd1, 0xb6, 0x78, 0x4a, 0x03, 0x63, 0x48, 0x86, 0xf6, 0xb0, 0xdd, 0x5b, 0xb6, 0xa5, 0x55, 0xb2, 0x9e, 0x78, 0xb6, 0x76, 0xdf, 0xb0, 0xb4, 0x2a, 0xba, 0x0f, 0x3b, 0xa7,
0xe2, 0x1a, 0x0f, 0x68, 0x89, 0xf3, 0x49, 0x7b, 0xf6, 0x2b, 0x6d, 0x9b, 0x2f, 0x38, 0x87, 0xed, 0xfd, 0x3e, 0x49, 0x2d, 0x69, 0xb2, 0x35, 0x4e, 0x6f, 0x77, 0xbb, 0xd8, 0x18, 0x0c, 0xc8, 0xa9,
0x73, 0x19, 0x22, 0xe2, 0xb9, 0xcb, 0xf2, 0xa4, 0x73, 0x6a, 0x3b, 0x1c, 0x34, 0xad, 0xf3, 0x76, 0x39, 0x38, 0x6d, 0x0f, 0x3b, 0x27, 0xda, 0x16, 0x4f, 0x69, 0x60, 0x0c, 0xc9, 0xd0, 0x1e, 0xb6,
0xcf, 0xec, 0x92, 0x97, 0xc6, 0x1b, 0xb1, 0x0f, 0xdd, 0xe3, 0x60, 0x12, 0x19, 0xe9, 0x63, 0xfb, 0x7b, 0x4b, 0x5c, 0xe3, 0x01, 0x2d, 0x71, 0x3e, 0x69, 0xcf, 0x7e, 0xa5, 0x6d, 0xf3, 0x05, 0xe7,
0x39, 0x0f, 0x44, 0xfb, 0x14, 0x21, 0xa8, 0x75, 0x4c, 0xdc, 0x39, 0xeb, 0xb5, 0x31, 0xc1, 0xf6, 0xb0, 0x7d, 0x2e, 0x43, 0x44, 0x3c, 0x77, 0x59, 0x9e, 0x74, 0x4e, 0x6d, 0x87, 0x83, 0xa6, 0x75,
0xd9, 0xd0, 0xd0, 0x76, 0x1f, 0xff, 0x53, 0x81, 0x4a, 0x56, 0x67, 0xbc, 0xea, 0xa6, 0x45, 0x8e, 0xde, 0xee, 0x99, 0x5d, 0xf2, 0xd2, 0x78, 0x23, 0xf6, 0xa1, 0x7b, 0x1c, 0x4c, 0x22, 0x23, 0x7d,
0x7b, 0xe6, 0xf3, 0x93, 0x61, 0x22, 0x82, 0xc1, 0x59, 0x87, 0x97, 0xcc, 0xe0, 0xfb, 0x1b, 0x82, 0x6c, 0x3f, 0xe7, 0x81, 0x68, 0x9f, 0x22, 0x04, 0xb5, 0x8e, 0x89, 0x3b, 0x67, 0xbd, 0x36, 0x26,
0x5a, 0xb2, 0xe8, 0x8b, 0x64, 0x73, 0x7c, 0x2e, 0x89, 0x59, 0xb6, 0xf4, 0x9b, 0xe7, 0xc1, 0x4b, 0xd8, 0x3e, 0x1b, 0x1a, 0xda, 0xee, 0x93, 0xbf, 0x29, 0x50, 0xc9, 0xea, 0x8c, 0x57, 0xdd, 0xb4,
0xd0, 0xc0, 0xd8, 0xc6, 0x9a, 0x8a, 0xbe, 0x82, 0xa6, 0x44, 0x78, 0x5d, 0x31, 0x36, 0x3a, 0x43, 0xc8, 0x71, 0xcf, 0x7c, 0x7e, 0x32, 0x4c, 0x44, 0x30, 0x38, 0xeb, 0xf0, 0x92, 0x19, 0x7c, 0x7f,
0xd2, 0x6f, 0xbf, 0x39, 0xe5, 0x65, 0x4f, 0x44, 0x36, 0xd0, 0x0a, 0xe8, 0x0b, 0xd8, 0x5b, 0xb0, 0x43, 0x50, 0x4b, 0x16, 0x7d, 0x91, 0x6c, 0x8e, 0xcf, 0x25, 0x31, 0xcb, 0x96, 0x7e, 0xf3, 0x3c,
0xd6, 0xe9, 0xe2, 0xf0, 0x6f, 0x9b, 0xb0, 0x21, 0x8e, 0xf9, 0x08, 0xfd, 0x1e, 0xaa, 0x99, 0x87, 0x78, 0x09, 0x1a, 0x18, 0xdb, 0x58, 0x53, 0xd1, 0x97, 0xd0, 0x94, 0x08, 0xaf, 0x2b, 0xc6, 0x46,
0xe6, 0xf9, 0x21, 0x7a, 0xf0, 0xc1, 0x27, 0x68, 0x23, 0x7d, 0x0c, 0x48, 0xf8, 0xa9, 0x82, 0x8e, 0x67, 0x48, 0xfa, 0xed, 0x37, 0xa7, 0xbc, 0xec, 0x89, 0xc8, 0x06, 0x5a, 0x01, 0x7d, 0x0e, 0x7b,
0xa0, 0x96, 0x7d, 0x9f, 0x9d, 0x1f, 0xa2, 0xec, 0xe9, 0xb8, 0xe6, 0xe9, 0xb6, 0xc6, 0xc7, 0x4b, 0x0b, 0xd6, 0x3a, 0x5d, 0x1c, 0xfe, 0x65, 0x13, 0x36, 0xc4, 0x31, 0x1f, 0xa1, 0xdf, 0x42, 0x35,
0xd0, 0x8c, 0x98, 0xb9, 0x3e, 0x6f, 0x52, 0xf9, 0xe2, 0x42, 0x8d, 0x8c, 0x97, 0x1b, 0xcf, 0xb8, 0xf3, 0x90, 0x3d, 0x3f, 0x44, 0x0f, 0x3f, 0xf8, 0xc4, 0x6d, 0xa4, 0x8f, 0x01, 0x09, 0x3f, 0x53,
0xc6, 0xde, 0x5a, 0x9b, 0xbc, 0xd7, 0xf4, 0xf8, 0x86, 0xb8, 0x78, 0xf3, 0xdc, 0x4a, 0x68, 0xf5, 0xd0, 0x11, 0xd4, 0xb2, 0xef, 0xb9, 0xf3, 0x43, 0x94, 0x3d, 0x1d, 0xd7, 0x3c, 0xf5, 0xd6, 0xf8,
0xa1, 0xd5, 0xf8, 0xfc, 0x2e, 0xb3, 0xf4, 0x36, 0x86, 0x9d, 0x35, 0xcf, 0x18, 0xf4, 0x75, 0x36, 0x78, 0x09, 0x9a, 0x11, 0x33, 0xd7, 0xe7, 0x4d, 0x2a, 0x5f, 0x5c, 0xa8, 0x91, 0xf1, 0x72, 0xe3,
0x82, 0x3b, 0x1f, 0x41, 0x8d, 0x87, 0x1f, 0xa3, 0x2d, 0x67, 0x59, 0xf3, 0xde, 0x59, 0x99, 0xe5, 0x19, 0xd7, 0xd8, 0x5b, 0x6b, 0x93, 0xf7, 0x9a, 0x1e, 0xdf, 0x10, 0x17, 0x6f, 0x9e, 0x5b, 0x09,
0xee, 0xd7, 0xd2, 0xca, 0x2c, 0x1f, 0x7a, 0x36, 0xbd, 0x05, 0xed, 0xe6, 0xf5, 0x18, 0xe9, 0x37, 0xad, 0x3e, 0xb4, 0x1a, 0x9f, 0xdd, 0x65, 0x96, 0xde, 0xc6, 0xb0, 0xb3, 0xe6, 0x19, 0x83, 0xbe,
0xc7, 0xde, 0xbe, 0xa7, 0x37, 0xfe, 0xff, 0x83, 0x1c, 0xe9, 0xdc, 0x04, 0x58, 0x5e, 0x32, 0xd1, 0xca, 0x46, 0x70, 0xe7, 0x23, 0xa8, 0xf1, 0xe8, 0x63, 0xb4, 0xe5, 0x2c, 0x6b, 0xde, 0x3b, 0x2b,
0x67, 0x99, 0x21, 0xb7, 0x2e, 0xc9, 0x8d, 0x07, 0x77, 0x58, 0xa5, 0xab, 0x21, 0xec, 0xac, 0xb9, 0xb3, 0xdc, 0xfd, 0x5a, 0x5a, 0x99, 0xe5, 0x43, 0xcf, 0xa6, 0xb7, 0xa0, 0xdd, 0xbc, 0x1e, 0x23,
0x75, 0xae, 0xac, 0xc6, 0xdd, 0xb7, 0xd2, 0xc6, 0xbd, 0x75, 0x97, 0xb3, 0xa7, 0x0a, 0x3a, 0x4d, 0xfd, 0xe6, 0xd8, 0xdb, 0xf7, 0xf4, 0xc6, 0xff, 0x7f, 0x90, 0x23, 0x9d, 0x9b, 0x00, 0xcb, 0x4b,
0x74, 0x91, 0xfe, 0xd1, 0xe3, 0x23, 0x42, 0xaf, 0xaf, 0x3f, 0x44, 0xe6, 0xb1, 0x9e, 0xff, 0x4b, 0x26, 0x7a, 0x90, 0x19, 0x72, 0xeb, 0x92, 0xdc, 0x78, 0x78, 0x87, 0x55, 0xba, 0x1a, 0xc2, 0xce,
0x4e, 0x79, 0xaa, 0x20, 0x1b, 0x2a, 0x59, 0x71, 0x7f, 0x54, 0xf5, 0x1f, 0x73, 0x78, 0xf4, 0xed, 0x9a, 0x5b, 0xe7, 0xca, 0x6a, 0xdc, 0x7d, 0x2b, 0x6d, 0xdc, 0x5b, 0x77, 0x39, 0x7b, 0xa6, 0xa0,
0x1f, 0x0e, 0x2e, 0x5d, 0x36, 0x9d, 0x5f, 0xec, 0x8f, 0x42, 0xff, 0xc0, 0x73, 0x2f, 0xa7, 0x2c, 0xd3, 0x44, 0x17, 0xe9, 0x1f, 0x55, 0x3e, 0x22, 0xf4, 0xfa, 0xfa, 0x43, 0x64, 0x1e, 0xeb, 0xf9,
0x70, 0x83, 0xcb, 0x80, 0xb2, 0xf7, 0x61, 0x74, 0x75, 0xe0, 0x05, 0xe3, 0x03, 0xd1, 0x37, 0x07, 0x3f, 0xe5, 0x94, 0x67, 0x0a, 0xb2, 0xa1, 0x92, 0x15, 0xf7, 0x47, 0x55, 0xff, 0x31, 0x87, 0x47,
0x0b, 0x3f, 0x17, 0x1b, 0xe2, 0x8f, 0x87, 0x3f, 0xff, 0x5f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x09, 0xdf, 0xfc, 0xee, 0xe0, 0xd2, 0x65, 0xd3, 0xf9, 0xc5, 0xfe, 0x28, 0xf4, 0x0f, 0xc4, 0x5f, 0x32,
0xc8, 0xdd, 0x00, 0x6c, 0x14, 0x00, 0x00, 0x02, 0x37, 0xb8, 0x0c, 0x28, 0x7b, 0x1f, 0x46, 0x57, 0x07, 0x5e, 0x30, 0x3e, 0x10, 0x7d, 0x73,
0xb0, 0xf0, 0x73, 0xb1, 0x21, 0xfe, 0x38, 0xf9, 0xd3, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x8d,
0x86, 0x7a, 0x49, 0xcc, 0x14, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -120,11 +120,23 @@ message SendPaymentRequest {
amount. amount.
*/ */
uint32 max_shards = 17; uint32 max_shards = 17;
/**
If set, only the final payment update is streamed back. Intermediate updates
that show which htlcs are still in flight are suppressed.
*/
bool no_inflight_updates = 18;
} }
message TrackPaymentRequest { message TrackPaymentRequest {
/// The hash of the payment to look up. /// The hash of the payment to look up.
bytes payment_hash = 1; bytes payment_hash = 1;
/**
If set, only the final payment update is streamed back. Intermediate updates
that show which htlcs are still in flight are suppressed.
*/
bool no_inflight_updates = 2;
} }
message RouteFeeRequest { message RouteFeeRequest {

@ -255,7 +255,7 @@ func (s *Server) SendPaymentV2(req *SendPaymentRequest,
return err return err
} }
return s.trackPayment(payment.PaymentHash, stream) return s.trackPayment(payment.PaymentHash, stream, req.NoInflightUpdates)
} }
// EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it // EstimateRouteFee allows callers to obtain a lower bound w.r.t how much it
@ -439,12 +439,12 @@ func (s *Server) TrackPaymentV2(request *TrackPaymentRequest,
log.Debugf("TrackPayment called for payment %v", paymentHash) log.Debugf("TrackPayment called for payment %v", paymentHash)
return s.trackPayment(paymentHash, stream) return s.trackPayment(paymentHash, stream, request.NoInflightUpdates)
} }
// trackPayment writes payment status updates to the provided stream. // trackPayment writes payment status updates to the provided stream.
func (s *Server) trackPayment(paymentHash lntypes.Hash, func (s *Server) trackPayment(paymentHash lntypes.Hash,
stream Router_TrackPaymentV2Server) error { stream Router_TrackPaymentV2Server, noInflightUpdates bool) error {
router := s.cfg.RouterBackend router := s.cfg.RouterBackend
@ -470,6 +470,14 @@ func (s *Server) trackPayment(paymentHash lntypes.Hash,
return nil return nil
} }
result := item.(*channeldb.MPPayment) result := item.(*channeldb.MPPayment)
// Skip in-flight updates unless requested.
if noInflightUpdates &&
result.Status == channeldb.StatusInFlight {
continue
}
rpcPayment, err := router.MarshallPayment(result) rpcPayment, err := router.MarshallPayment(result)
if err != nil { if err != nil {
return err return err