htlcswitch: do not consider unknown failures an error

This commit is contained in:
Joost Jager 2019-06-19 15:09:23 +02:00
parent c6f9517e48
commit 2726f50d7c
No known key found for this signature in database
GPG Key ID: A61B9D4C393C59C7
7 changed files with 186 additions and 112 deletions

@ -31,10 +31,10 @@ type ForwardingError struct {
// returned. // returned.
func (f *ForwardingError) Error() string { func (f *ForwardingError) Error() string {
if f.ExtraMsg == "" { if f.ExtraMsg == "" {
return f.FailureMessage.Error() return fmt.Sprintf("%v", f.FailureMessage)
} }
return fmt.Sprintf("%v: %v", f.FailureMessage.Error(), f.ExtraMsg) return fmt.Sprintf("%v: %v", f.FailureMessage, f.ExtraMsg)
} }
// ErrorDecrypter is an interface that is used to decrypt the onion encrypted // ErrorDecrypter is an interface that is used to decrypt the onion encrypted
@ -274,10 +274,14 @@ func (s *SphinxErrorDecrypter) DecryptError(reason lnwire.OpaqueReason) (
return nil, err return nil, err
} }
// Decode the failure. If an error occurs, we leave the failure message
// field nil.
r := bytes.NewReader(failure.Message) r := bytes.NewReader(failure.Message)
failureMsg, err := lnwire.DecodeFailure(r, 0) failureMsg, err := lnwire.DecodeFailure(r, 0)
if err != nil { if err != nil {
return nil, err return &ForwardingError{
FailureSourceIdx: failure.SenderIdx,
}, nil
} }
return &ForwardingError{ return &ForwardingError{

@ -2344,4 +2344,37 @@ func TestInvalidFailure(t *testing.T) {
case <-time.After(time.Second): case <-time.After(time.Second):
t.Fatal("err wasn't received") t.Fatal("err wasn't received")
} }
// Modify the decryption to simulate that decryption went alright, but
// the failure cannot be decoded.
deobfuscator = SphinxErrorDecrypter{
OnionErrorDecrypter: &mockOnionErrorDecryptor{
sourceIdx: 2,
message: []byte{200},
},
}
resultChan, err = s.GetPaymentResult(
paymentID, rhash, &deobfuscator,
)
if err != nil {
t.Fatal(err)
}
select {
case result := <-resultChan:
fErr, ok := result.Error.(*ForwardingError)
if !ok {
t.Fatal("expected ForwardingError")
}
if fErr.FailureSourceIdx != 2 {
t.Fatal("unexpected error source index")
}
if fErr.FailureMessage != nil {
t.Fatal("expected empty failure message")
}
case <-time.After(time.Second):
t.Fatal("err wasn't received")
}
} }

@ -104,6 +104,9 @@ const (
Failure_PERMANENT_NODE_FAILURE Failure_FailureCode = 20 Failure_PERMANENT_NODE_FAILURE Failure_FailureCode = 20
Failure_PERMANENT_CHANNEL_FAILURE Failure_FailureCode = 21 Failure_PERMANENT_CHANNEL_FAILURE Failure_FailureCode = 21
//* //*
//The error source is known, but the failure itself couldn't be decoded.
Failure_UNKNOWN_FAILURE Failure_FailureCode = 998
//*
//An unreadable failure result is returned if the received failure message //An unreadable failure result is returned if the received failure message
//cannot be decrypted. In that case the error source is unknown. //cannot be decrypted. In that case the error source is unknown.
Failure_UNREADABLE_FAILURE Failure_FailureCode = 999 Failure_UNREADABLE_FAILURE Failure_FailureCode = 999
@ -132,6 +135,7 @@ var Failure_FailureCode_name = map[int32]string{
19: "TEMPORARY_NODE_FAILURE", 19: "TEMPORARY_NODE_FAILURE",
20: "PERMANENT_NODE_FAILURE", 20: "PERMANENT_NODE_FAILURE",
21: "PERMANENT_CHANNEL_FAILURE", 21: "PERMANENT_CHANNEL_FAILURE",
998: "UNKNOWN_FAILURE",
999: "UNREADABLE_FAILURE", 999: "UNREADABLE_FAILURE",
} }
@ -158,6 +162,7 @@ var Failure_FailureCode_value = map[string]int32{
"TEMPORARY_NODE_FAILURE": 19, "TEMPORARY_NODE_FAILURE": 19,
"PERMANENT_NODE_FAILURE": 20, "PERMANENT_NODE_FAILURE": 20,
"PERMANENT_CHANNEL_FAILURE": 21, "PERMANENT_CHANNEL_FAILURE": 21,
"UNKNOWN_FAILURE": 998,
"UNREADABLE_FAILURE": 999, "UNREADABLE_FAILURE": 999,
} }
@ -1173,110 +1178,111 @@ 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{
// 1648 bytes of a gzipped FileDescriptorProto // 1659 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0x4f, 0x73, 0x22, 0xc7, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0x4f, 0x73, 0x22, 0xc7,
0x15, 0x37, 0x02, 0x84, 0x78, 0xfc, 0xd1, 0xa8, 0xa5, 0x95, 0x58, 0xb4, 0x5a, 0xcb, 0xe3, 0x64, 0x15, 0x37, 0x02, 0x84, 0x78, 0xfc, 0xd1, 0xa8, 0xa5, 0x95, 0x58, 0xb4, 0x5a, 0xcb, 0xe3, 0x64,
0xad, 0xda, 0x72, 0x24, 0x87, 0xd4, 0xba, 0x7c, 0x4a, 0x8a, 0x85, 0xc6, 0x8c, 0x17, 0x66, 0xe4, 0xad, 0xda, 0x72, 0x24, 0x87, 0xd4, 0xba, 0x7c, 0x4a, 0x8a, 0x85, 0xc6, 0x8c, 0x17, 0x66, 0xe4,
0x06, 0xd6, 0xde, 0xe4, 0xd0, 0xd5, 0x62, 0x5a, 0x30, 0x25, 0x98, 0xc1, 0x33, 0x8d, 0xb3, 0xca, 0x06, 0xd6, 0xde, 0xe4, 0xd0, 0xd5, 0x62, 0x5a, 0x30, 0x25, 0x98, 0xc1, 0x33, 0x8d, 0xb3, 0xca,
0x21, 0xb7, 0x1c, 0xf3, 0x29, 0xf2, 0x01, 0x92, 0x4f, 0x90, 0xaf, 0x93, 0x7b, 0x8e, 0x39, 0xa5, 0x21, 0xb7, 0x54, 0xe5, 0x92, 0xcf, 0x92, 0x5c, 0x73, 0xc9, 0xc7, 0x49, 0xbe, 0x43, 0x4e, 0xa9,
0xba, 0x7b, 0x80, 0x01, 0xa1, 0xf5, 0x9e, 0xc4, 0xfc, 0xde, 0xaf, 0xdf, 0xdf, 0x7e, 0xaf, 0x9f, 0xee, 0x1e, 0x60, 0x40, 0x68, 0xb3, 0x27, 0x31, 0xbf, 0xdf, 0xaf, 0xdf, 0xeb, 0x7e, 0xaf, 0xdf,
0xe0, 0x38, 0x0c, 0xe6, 0x82, 0x87, 0xe1, 0x6c, 0x78, 0xa5, 0x7f, 0x5d, 0xce, 0xc2, 0x40, 0x04, 0xeb, 0x27, 0x38, 0x0e, 0x83, 0xb9, 0xe0, 0x61, 0x38, 0x1b, 0x5e, 0xe9, 0x5f, 0x97, 0xb3, 0x30,
0x28, 0xbf, 0xc4, 0xab, 0xf9, 0x70, 0x36, 0xd4, 0xa8, 0xf9, 0xbf, 0x1d, 0x40, 0x3d, 0xee, 0xbb, 0x10, 0x01, 0xca, 0x2f, 0xf1, 0x6a, 0x3e, 0x9c, 0x0d, 0x35, 0x6a, 0xfe, 0x77, 0x07, 0x50, 0x8f,
0xd7, 0xec, 0x7e, 0xca, 0x7d, 0x41, 0xf8, 0x4f, 0x73, 0x1e, 0x09, 0x84, 0x20, 0xe3, 0xf2, 0x48, 0xfb, 0xee, 0x35, 0xbb, 0x9f, 0x72, 0x5f, 0x10, 0xfe, 0xd3, 0x9c, 0x47, 0x02, 0x21, 0xc8, 0xb8,
0x54, 0x52, 0xe7, 0xa9, 0x8b, 0x22, 0x51, 0xbf, 0x91, 0x01, 0x69, 0x36, 0x15, 0x95, 0x9d, 0xf3, 0x3c, 0x12, 0x95, 0xd4, 0x79, 0xea, 0xa2, 0x48, 0xd4, 0x6f, 0x64, 0x40, 0x9a, 0x4d, 0x45, 0x65,
0xd4, 0x45, 0x9a, 0xc8, 0x9f, 0xe8, 0x33, 0x28, 0xce, 0xf4, 0x39, 0x3a, 0x66, 0xd1, 0xb8, 0x92, 0xe7, 0x3c, 0x75, 0x91, 0x26, 0xf2, 0x27, 0xfa, 0x0c, 0x8a, 0x33, 0xbd, 0x8e, 0x8e, 0x59, 0x34,
0x56, 0xec, 0x42, 0x8c, 0xb5, 0x59, 0x34, 0x46, 0x17, 0x60, 0xdc, 0x7a, 0x3e, 0x9b, 0xd0, 0xe1, 0xae, 0xa4, 0x95, 0xba, 0x10, 0x63, 0x6d, 0x16, 0x8d, 0xd1, 0x05, 0x18, 0xb7, 0x9e, 0xcf, 0x26,
0x44, 0xfc, 0x4c, 0x5d, 0x3e, 0x11, 0xac, 0x92, 0x39, 0x4f, 0x5d, 0x64, 0x49, 0x59, 0xe1, 0x8d, 0x74, 0x38, 0x11, 0x3f, 0x53, 0x97, 0x4f, 0x04, 0xab, 0x64, 0xce, 0x53, 0x17, 0x59, 0x52, 0x56,
0x89, 0xf8, 0xb9, 0x29, 0x51, 0xf4, 0x05, 0xec, 0x2f, 0x94, 0x85, 0xda, 0x8b, 0x4a, 0xf6, 0x3c, 0x78, 0x63, 0x22, 0x7e, 0x6e, 0x4a, 0x14, 0x7d, 0x01, 0xfb, 0x0b, 0x63, 0xa1, 0xde, 0x45, 0x25,
0x75, 0x91, 0x27, 0xe5, 0xd9, 0xba, 0x6f, 0x5f, 0xc0, 0xbe, 0xf0, 0xa6, 0x3c, 0x98, 0x0b, 0x1a, 0x7b, 0x9e, 0xba, 0xc8, 0x93, 0xf2, 0x6c, 0x7d, 0x6f, 0x5f, 0xc0, 0xbe, 0xf0, 0xa6, 0x3c, 0x98,
0xf1, 0x61, 0xe0, 0xbb, 0x51, 0x65, 0x57, 0x6b, 0x8c, 0xe1, 0x9e, 0x46, 0x91, 0x09, 0xa5, 0x5b, 0x0b, 0x1a, 0xf1, 0x61, 0xe0, 0xbb, 0x51, 0x65, 0x57, 0x5b, 0x8c, 0xe1, 0x9e, 0x46, 0x91, 0x09,
0xce, 0xe9, 0xc4, 0x9b, 0x7a, 0x82, 0x46, 0x4c, 0x54, 0x72, 0xca, 0xf5, 0xc2, 0x2d, 0xe7, 0x1d, 0xa5, 0x5b, 0xce, 0xe9, 0xc4, 0x9b, 0x7a, 0x82, 0x46, 0x4c, 0x54, 0x72, 0x6a, 0xeb, 0x85, 0x5b,
0x89, 0xf5, 0x98, 0x90, 0xfe, 0x05, 0x73, 0x31, 0x0a, 0x3c, 0x7f, 0x44, 0x87, 0x63, 0xe6, 0x53, 0xce, 0x3b, 0x12, 0xeb, 0x31, 0x21, 0xf7, 0x17, 0xcc, 0xc5, 0x28, 0xf0, 0xfc, 0x11, 0x1d, 0x8e,
0xcf, 0xad, 0xec, 0x9d, 0xa7, 0x2e, 0x32, 0xa4, 0xbc, 0xc0, 0x1b, 0x63, 0xe6, 0x5b, 0x2e, 0x3a, 0x99, 0x4f, 0x3d, 0xb7, 0xb2, 0x77, 0x9e, 0xba, 0xc8, 0x90, 0xf2, 0x02, 0x6f, 0x8c, 0x99, 0x6f,
0x03, 0x50, 0x31, 0x28, 0x75, 0x95, 0xbc, 0xb2, 0x98, 0x97, 0x88, 0xd2, 0x85, 0x6a, 0x50, 0x50, 0xb9, 0xe8, 0x0c, 0x40, 0x9d, 0x41, 0x99, 0xab, 0xe4, 0x95, 0xc7, 0xbc, 0x44, 0x94, 0x2d, 0x54,
0x09, 0xa6, 0x63, 0xcf, 0x17, 0x51, 0x05, 0xce, 0xd3, 0x17, 0x85, 0x9a, 0x71, 0x39, 0xf1, 0x65, 0x83, 0x82, 0x0a, 0x30, 0x1d, 0x7b, 0xbe, 0x88, 0x2a, 0x70, 0x9e, 0xbe, 0x28, 0xd4, 0x8c, 0xcb,
0xae, 0x89, 0x94, 0xb4, 0x3d, 0x5f, 0x90, 0x24, 0xc9, 0xfc, 0x06, 0x0e, 0xfb, 0x21, 0x1b, 0xde, 0x89, 0x2f, 0x63, 0x4d, 0x24, 0xd3, 0xf6, 0x7c, 0x41, 0x92, 0x22, 0xf3, 0x1b, 0x38, 0xec, 0x87,
0x6d, 0x24, 0x7f, 0x33, 0xad, 0xa9, 0x07, 0x69, 0x35, 0xff, 0x0a, 0xa5, 0xf8, 0x50, 0x4f, 0x30, 0x6c, 0x78, 0xb7, 0x11, 0xfc, 0xcd, 0xb0, 0xa6, 0x1e, 0x84, 0xd5, 0xfc, 0x33, 0x94, 0xe2, 0x45,
0x31, 0x8f, 0xd0, 0x6f, 0x20, 0x1b, 0x09, 0x26, 0xb8, 0x22, 0x97, 0x6b, 0x27, 0x97, 0xcb, 0x6a, 0x3d, 0xc1, 0xc4, 0x3c, 0x42, 0xbf, 0x82, 0x6c, 0x24, 0x98, 0xe0, 0x4a, 0x5c, 0xae, 0x9d, 0x5c,
0x5f, 0x26, 0x88, 0x9c, 0x68, 0x16, 0xaa, 0xc2, 0xde, 0x2c, 0xe4, 0xde, 0x94, 0x8d, 0xb8, 0x2a, 0x2e, 0xb3, 0x7d, 0x99, 0x10, 0x72, 0xa2, 0x55, 0xa8, 0x0a, 0x7b, 0xb3, 0x90, 0x7b, 0x53, 0x36,
0x68, 0x91, 0x2c, 0xbf, 0x91, 0x09, 0x59, 0x75, 0x58, 0x95, 0xb3, 0x50, 0x2b, 0x26, 0x63, 0x20, 0xe2, 0x2a, 0xa1, 0x45, 0xb2, 0xfc, 0x46, 0x26, 0x64, 0xd5, 0x62, 0x95, 0xce, 0x42, 0xad, 0x98,
0x5a, 0x64, 0xfe, 0x1e, 0xf6, 0xd5, 0x77, 0x8b, 0xf3, 0x0f, 0x5d, 0x99, 0x13, 0xc8, 0xb1, 0xa9, 0x3c, 0x03, 0xd1, 0x94, 0xf9, 0x5b, 0xd8, 0x57, 0xdf, 0x2d, 0xce, 0x3f, 0x74, 0x65, 0x4e, 0x20,
0xce, 0xbd, 0xbe, 0x36, 0xbb, 0x6c, 0x2a, 0xd3, 0x6e, 0xba, 0x60, 0xac, 0xce, 0x47, 0xb3, 0xc0, 0xc7, 0xa6, 0x3a, 0xf6, 0xfa, 0xda, 0xec, 0xb2, 0xa9, 0x0c, 0xbb, 0xe9, 0x82, 0xb1, 0x5a, 0x1f,
0x8f, 0xb8, 0x2c, 0x85, 0x54, 0x2e, 0x2b, 0x21, 0xcb, 0x36, 0x95, 0xa7, 0x52, 0xea, 0x54, 0x39, 0xcd, 0x02, 0x3f, 0xe2, 0x32, 0x15, 0xd2, 0xb8, 0xcc, 0x84, 0x4c, 0xdb, 0x54, 0xae, 0x4a, 0xa9,
0xc6, 0x5b, 0x9c, 0x77, 0x23, 0x26, 0xd0, 0x0b, 0x7d, 0x03, 0xe8, 0x24, 0x18, 0xde, 0xc9, 0x3b, 0x55, 0xe5, 0x18, 0x6f, 0x71, 0xde, 0x8d, 0x98, 0x40, 0x2f, 0xf4, 0x0d, 0xa0, 0x93, 0x60, 0x78,
0xc5, 0xee, 0x63, 0xf5, 0x25, 0x09, 0x77, 0x82, 0xe1, 0x5d, 0x53, 0x82, 0xe6, 0x9f, 0xf4, 0xdd, 0x27, 0xef, 0x14, 0xbb, 0x8f, 0xcd, 0x97, 0x24, 0xdc, 0x09, 0x86, 0x77, 0x4d, 0x09, 0x9a, 0x7f,
0xee, 0x07, 0xda, 0xf7, 0x8f, 0x4e, 0xef, 0x2a, 0x05, 0x3b, 0x8f, 0xa7, 0x80, 0xc2, 0xe1, 0x9a, 0xd0, 0x77, 0xbb, 0x1f, 0xe8, 0xbd, 0x7f, 0x74, 0x78, 0x57, 0x21, 0xd8, 0x79, 0x3c, 0x04, 0x14,
0xf2, 0x38, 0x8a, 0x64, 0x66, 0x53, 0x1b, 0x99, 0xfd, 0x12, 0x72, 0xb7, 0xcc, 0x9b, 0xcc, 0xc3, 0x0e, 0xd7, 0x8c, 0xc7, 0xa7, 0x48, 0x46, 0x36, 0xb5, 0x11, 0xd9, 0x2f, 0x21, 0x77, 0xcb, 0xbc,
0x85, 0x62, 0x94, 0x28, 0x53, 0x4b, 0x4b, 0xc8, 0x82, 0x62, 0xfe, 0x23, 0x07, 0xb9, 0x18, 0x44, 0xc9, 0x3c, 0x5c, 0x18, 0x46, 0x89, 0x34, 0xb5, 0x34, 0x43, 0x16, 0x12, 0xf3, 0x9f, 0x39, 0xc8,
0x35, 0xc8, 0x0c, 0x03, 0x77, 0x51, 0xdd, 0xe7, 0x0f, 0x8f, 0x2d, 0xfe, 0x36, 0x02, 0x97, 0x13, 0xc5, 0x20, 0xaa, 0x41, 0x66, 0x18, 0xb8, 0x8b, 0xec, 0x3e, 0x7f, 0xb8, 0x6c, 0xf1, 0xb7, 0x11,
0xc5, 0x45, 0x7f, 0x80, 0xb2, 0xbc, 0xd1, 0x3e, 0x9f, 0xd0, 0xf9, 0xcc, 0x65, 0xcb, 0x82, 0x56, 0xb8, 0x9c, 0x28, 0x2d, 0xfa, 0x1d, 0x94, 0xe5, 0x8d, 0xf6, 0xf9, 0x84, 0xce, 0x67, 0x2e, 0x5b,
0x12, 0xa7, 0x1b, 0x9a, 0x30, 0x50, 0x72, 0x52, 0x1a, 0x26, 0x3f, 0xd1, 0x29, 0xe4, 0xc7, 0x62, 0x26, 0xb4, 0x92, 0x58, 0xdd, 0xd0, 0x82, 0x81, 0xe2, 0x49, 0x69, 0x98, 0xfc, 0x44, 0xa7, 0x90,
0x32, 0xd4, 0x95, 0xc8, 0xa8, 0xa6, 0xd8, 0x93, 0x80, 0xaa, 0x81, 0x09, 0xa5, 0xc0, 0xf7, 0x02, 0x1f, 0x8b, 0xc9, 0x50, 0x67, 0x22, 0xa3, 0x8a, 0x62, 0x4f, 0x02, 0x2a, 0x07, 0x26, 0x94, 0x02,
0x9f, 0x46, 0x63, 0x46, 0x6b, 0xaf, 0xbe, 0x56, 0xcd, 0x5a, 0x24, 0x05, 0x05, 0xf6, 0xc6, 0xac, 0xdf, 0x0b, 0x7c, 0x1a, 0x8d, 0x19, 0xad, 0xbd, 0xfa, 0x5a, 0x15, 0x6b, 0x91, 0x14, 0x14, 0xd8,
0xf6, 0xea, 0x6b, 0xf4, 0x29, 0x14, 0x54, 0xcb, 0xf0, 0xf7, 0x33, 0x2f, 0xbc, 0x57, 0x5d, 0x5a, 0x1b, 0xb3, 0xda, 0xab, 0xaf, 0xd1, 0xa7, 0x50, 0x50, 0x25, 0xc3, 0xdf, 0xcf, 0xbc, 0xf0, 0x5e,
0x22, 0xaa, 0x8b, 0xb0, 0x42, 0xd0, 0x11, 0x64, 0x6f, 0x27, 0x6c, 0x14, 0xa9, 0xce, 0x2c, 0x11, 0x55, 0x69, 0x89, 0xa8, 0x2a, 0xc2, 0x0a, 0x41, 0x47, 0x90, 0xbd, 0x9d, 0xb0, 0x51, 0xa4, 0x2a,
0xfd, 0x81, 0xbe, 0x82, 0xa3, 0x38, 0x07, 0x34, 0x0a, 0xe6, 0xe1, 0x90, 0x53, 0xcf, 0x77, 0xf9, 0xb3, 0x44, 0xf4, 0x07, 0xfa, 0x0a, 0x8e, 0xe2, 0x18, 0xd0, 0x28, 0x98, 0x87, 0x43, 0x4e, 0x3d,
0x7b, 0xd5, 0x97, 0x25, 0x82, 0x62, 0x59, 0x4f, 0x89, 0x2c, 0x29, 0x31, 0xff, 0x9b, 0x81, 0x42, 0xdf, 0xe5, 0xef, 0x55, 0x5d, 0x96, 0x08, 0x8a, 0xb9, 0x9e, 0xa2, 0x2c, 0xc9, 0x98, 0x7f, 0xcd,
0x22, 0x01, 0xa8, 0x08, 0x7b, 0x04, 0xf7, 0x30, 0x79, 0x8b, 0x9b, 0xc6, 0x27, 0xa8, 0x02, 0x47, 0x42, 0x21, 0x11, 0x00, 0x54, 0x84, 0x3d, 0x82, 0x7b, 0x98, 0xbc, 0xc5, 0x4d, 0xe3, 0x13, 0x54,
0x03, 0xfb, 0x8d, 0xed, 0xfc, 0x60, 0xd3, 0xeb, 0xfa, 0xbb, 0x2e, 0xb6, 0xfb, 0xb4, 0x5d, 0xef, 0x81, 0xa3, 0x81, 0xfd, 0xc6, 0x76, 0x7e, 0xb0, 0xe9, 0x75, 0xfd, 0x5d, 0x17, 0xdb, 0x7d, 0xda,
0xb5, 0x8d, 0x14, 0x7a, 0x06, 0x15, 0xcb, 0x6e, 0x38, 0x84, 0xe0, 0x46, 0x7f, 0x29, 0xab, 0x77, 0xae, 0xf7, 0xda, 0x46, 0x0a, 0x3d, 0x83, 0x8a, 0x65, 0x37, 0x1c, 0x42, 0x70, 0xa3, 0xbf, 0xe4,
0x9d, 0x81, 0xdd, 0x37, 0x76, 0xd0, 0xa7, 0x70, 0xda, 0xb2, 0xec, 0x7a, 0x87, 0xae, 0x38, 0x8d, 0xea, 0x5d, 0x67, 0x60, 0xf7, 0x8d, 0x1d, 0xf4, 0x29, 0x9c, 0xb6, 0x2c, 0xbb, 0xde, 0xa1, 0x2b,
0x4e, 0xff, 0x2d, 0xc5, 0x3f, 0x5e, 0x5b, 0xe4, 0x9d, 0x91, 0xde, 0x46, 0x68, 0xf7, 0x3b, 0x8d, 0x4d, 0xa3, 0xd3, 0x7f, 0x4b, 0xf1, 0x8f, 0xd7, 0x16, 0x79, 0x67, 0xa4, 0xb7, 0x09, 0xda, 0xfd,
0x85, 0x86, 0x0c, 0x7a, 0x0a, 0x4f, 0x34, 0x41, 0x1f, 0xa1, 0x7d, 0xc7, 0xa1, 0x3d, 0xc7, 0xb1, 0x4e, 0x63, 0x61, 0x21, 0x83, 0x9e, 0xc2, 0x13, 0x2d, 0xd0, 0x4b, 0x68, 0xdf, 0x71, 0x68, 0xcf,
0x8d, 0x2c, 0x3a, 0x80, 0x92, 0x65, 0xbf, 0xad, 0x77, 0xac, 0x26, 0x25, 0xb8, 0xde, 0xe9, 0x1a, 0x71, 0x6c, 0x23, 0x8b, 0x0e, 0xa0, 0x64, 0xd9, 0x6f, 0xeb, 0x1d, 0xab, 0x49, 0x09, 0xae, 0x77,
0xbb, 0xe8, 0x10, 0xf6, 0x37, 0x79, 0x39, 0xa9, 0x62, 0xc1, 0x73, 0x6c, 0xcb, 0xb1, 0xe9, 0x5b, 0xba, 0xc6, 0x2e, 0x3a, 0x84, 0xfd, 0x4d, 0x5d, 0x4e, 0x9a, 0x58, 0xe8, 0x1c, 0xdb, 0x72, 0x6c,
0x4c, 0x7a, 0x96, 0x63, 0x1b, 0x7b, 0xe8, 0x18, 0xd0, 0xba, 0xa8, 0xdd, 0xad, 0x37, 0x8c, 0x3c, 0xfa, 0x16, 0x93, 0x9e, 0xe5, 0xd8, 0xc6, 0x1e, 0x3a, 0x06, 0xb4, 0x4e, 0xb5, 0xbb, 0xf5, 0x86,
0x7a, 0x02, 0x07, 0xeb, 0xf8, 0x1b, 0xfc, 0xce, 0x00, 0x99, 0x06, 0xed, 0x18, 0x7d, 0x8d, 0x3b, 0x91, 0x47, 0x4f, 0xe0, 0x60, 0x1d, 0x7f, 0x83, 0xdf, 0x19, 0x20, 0xc3, 0xa0, 0x37, 0x46, 0x5f,
0xce, 0x0f, 0xb4, 0x6b, 0xd9, 0x56, 0x77, 0xd0, 0x35, 0x0a, 0xe8, 0x08, 0x8c, 0x16, 0xc6, 0xd4, 0xe3, 0x8e, 0xf3, 0x03, 0xed, 0x5a, 0xb6, 0xd5, 0x1d, 0x74, 0x8d, 0x02, 0x3a, 0x02, 0xa3, 0x85,
0xb2, 0x7b, 0x83, 0x56, 0xcb, 0x6a, 0x58, 0xd8, 0xee, 0x1b, 0x45, 0x6d, 0x79, 0x5b, 0xe0, 0x25, 0x31, 0xb5, 0xec, 0xde, 0xa0, 0xd5, 0xb2, 0x1a, 0x16, 0xb6, 0xfb, 0x46, 0x51, 0x7b, 0xde, 0x76,
0x79, 0xa0, 0xd1, 0xae, 0xdb, 0x36, 0xee, 0xd0, 0xa6, 0xd5, 0xab, 0xbf, 0xee, 0xe0, 0xa6, 0x51, 0xf0, 0x92, 0x5c, 0xd0, 0x68, 0xd7, 0x6d, 0x1b, 0x77, 0x68, 0xd3, 0xea, 0xd5, 0x5f, 0x77, 0x70,
0x46, 0x67, 0xf0, 0xb4, 0x8f, 0xbb, 0xd7, 0x0e, 0xa9, 0x93, 0x77, 0x74, 0x21, 0x6f, 0xd5, 0xad, 0xd3, 0x28, 0xa3, 0x33, 0x78, 0xda, 0xc7, 0xdd, 0x6b, 0x87, 0xd4, 0xc9, 0x3b, 0xba, 0xe0, 0x5b,
0xce, 0x80, 0x60, 0x63, 0x1f, 0x7d, 0x06, 0x67, 0x04, 0x7f, 0x3f, 0xb0, 0x08, 0x6e, 0x52, 0xdb, 0x75, 0xab, 0x33, 0x20, 0xd8, 0xd8, 0x47, 0x9f, 0xc1, 0x19, 0xc1, 0xdf, 0x0f, 0x2c, 0x82, 0x9b,
0x69, 0x62, 0xda, 0xc2, 0xf5, 0xfe, 0x80, 0x60, 0xda, 0xb5, 0x7a, 0x3d, 0xcb, 0xfe, 0xd6, 0x30, 0xd4, 0x76, 0x9a, 0x98, 0xb6, 0x70, 0xbd, 0x3f, 0x20, 0x98, 0x76, 0xad, 0x5e, 0xcf, 0xb2, 0xbf,
0xd0, 0xaf, 0xe0, 0x7c, 0x49, 0x59, 0x2a, 0xd8, 0x60, 0x1d, 0xc8, 0xf8, 0x16, 0xf5, 0xb4, 0xf1, 0x35, 0x0c, 0xf4, 0x0b, 0x38, 0x5f, 0x4a, 0x96, 0x06, 0x36, 0x54, 0x07, 0xf2, 0x7c, 0x8b, 0x7c,
0x8f, 0x7d, 0x7a, 0x8d, 0x31, 0x31, 0x10, 0xaa, 0xc2, 0xf1, 0xca, 0xbc, 0x36, 0x10, 0xdb, 0x3e, 0xda, 0xf8, 0xc7, 0x3e, 0xbd, 0xc6, 0x98, 0x18, 0x08, 0x55, 0xe1, 0x78, 0xe5, 0x5e, 0x3b, 0x88,
0x94, 0xb2, 0x6b, 0x4c, 0xba, 0x75, 0x5b, 0x16, 0x78, 0x4d, 0x76, 0x24, 0xdd, 0x5e, 0xc9, 0x36, 0x7d, 0x1f, 0x4a, 0xee, 0x1a, 0x93, 0x6e, 0xdd, 0x96, 0x09, 0x5e, 0xe3, 0x8e, 0xe4, 0xb6, 0x57,
0xdd, 0x7e, 0x82, 0x4e, 0x00, 0x0d, 0x6c, 0x82, 0xeb, 0x4d, 0x19, 0xe6, 0x12, 0xff, 0x4f, 0xee, 0xdc, 0xe6, 0xb6, 0x9f, 0xa0, 0x23, 0xd8, 0x5f, 0x78, 0x5b, 0x80, 0xff, 0xce, 0xa1, 0x13, 0x40,
0xbb, 0xcc, 0xde, 0x8e, 0x91, 0x36, 0xff, 0x99, 0x86, 0xd2, 0x5a, 0x17, 0xa1, 0x67, 0x90, 0x8f, 0x03, 0x9b, 0xe0, 0x7a, 0x53, 0x1e, 0x7e, 0x49, 0xfc, 0x27, 0xf7, 0x5d, 0x66, 0x6f, 0xc7, 0x48,
0xbc, 0x91, 0xcf, 0x84, 0xec, 0x73, 0x3d, 0x02, 0x56, 0x80, 0x7a, 0x46, 0xc6, 0xcc, 0xf3, 0xf5, 0x9b, 0x7f, 0x4f, 0x43, 0x69, 0xad, 0xb6, 0xd0, 0x33, 0xc8, 0x47, 0xde, 0xc8, 0x67, 0x42, 0x56,
0xec, 0xd1, 0xb3, 0x37, 0xaf, 0x10, 0x35, 0x79, 0x4e, 0x20, 0xb7, 0x78, 0x86, 0xd2, 0xaa, 0xe3, 0xbf, 0x6e, 0x0c, 0x2b, 0x40, 0x3d, 0x2e, 0x63, 0xe6, 0xf9, 0xba, 0x23, 0xe9, 0x8e, 0x9c, 0x57,
0x76, 0x87, 0xfa, 0xf9, 0x79, 0x06, 0x79, 0x39, 0xdc, 0x22, 0xc1, 0xa6, 0x33, 0xd5, 0x8c, 0x25, 0x88, 0xea, 0x47, 0x27, 0x90, 0x5b, 0x3c, 0x4e, 0x69, 0x55, 0x87, 0xbb, 0x43, 0xfd, 0x28, 0x3d,
0xb2, 0x02, 0xd0, 0xe7, 0x50, 0x9a, 0xf2, 0x28, 0x62, 0x23, 0x4e, 0x75, 0x43, 0x81, 0x62, 0x14, 0x83, 0xbc, 0x6c, 0x79, 0x91, 0x60, 0xd3, 0x99, 0x2a, 0xd1, 0x12, 0x59, 0x01, 0xe8, 0x73, 0x28,
0x63, 0xb0, 0xa5, 0xfa, 0xea, 0x73, 0x58, 0x34, 0x78, 0x4c, 0xca, 0x6a, 0x52, 0x0c, 0x6a, 0xd2, 0x4d, 0x79, 0x14, 0xb1, 0x11, 0xa7, 0xba, 0xcc, 0x40, 0x29, 0x8a, 0x31, 0xd8, 0x52, 0xd5, 0xf6,
0xe6, 0x6c, 0x15, 0x2c, 0xee, 0xdb, 0xe4, 0x6c, 0x15, 0x0c, 0xbd, 0x84, 0x03, 0x3d, 0x1c, 0x3c, 0x39, 0x2c, 0xca, 0x3e, 0x16, 0x65, 0xb5, 0x28, 0x06, 0xb5, 0x68, 0xb3, 0xe3, 0x0a, 0x16, 0x57,
0xdf, 0x9b, 0xce, 0xa7, 0x7a, 0x48, 0xe4, 0x94, 0xcb, 0xfb, 0x6a, 0x48, 0x68, 0x5c, 0xcd, 0x8a, 0x73, 0xb2, 0xe3, 0x0a, 0x86, 0x5e, 0xc2, 0x81, 0x6e, 0x19, 0x9e, 0xef, 0x4d, 0xe7, 0x53, 0xdd,
0xa7, 0xb0, 0x77, 0xc3, 0x22, 0x2e, 0xc7, 0x7a, 0xdc, 0xc4, 0x39, 0xf9, 0xdd, 0xe2, 0x5c, 0x8a, 0x3a, 0x72, 0x6a, 0xcb, 0xfb, 0xaa, 0x75, 0x68, 0x5c, 0x75, 0x90, 0xa7, 0xb0, 0x77, 0xc3, 0x22,
0xe4, 0xb0, 0x0f, 0xe5, 0x78, 0xca, 0x6b, 0xd1, 0x2d, 0xe7, 0x44, 0xe6, 0x71, 0x69, 0x81, 0xbd, 0x2e, 0x9b, 0x7d, 0x5c, 0xda, 0x39, 0xf9, 0xdd, 0xe2, 0x5c, 0x52, 0xf2, 0x09, 0x08, 0x65, 0xd3,
0x5f, 0x59, 0x28, 0x24, 0x2c, 0x68, 0x5c, 0x59, 0x78, 0x09, 0x07, 0xfc, 0xbd, 0x08, 0x19, 0x0d, 0xca, 0x6b, 0xea, 0x96, 0x73, 0x22, 0xe3, 0xb8, 0xf4, 0xc0, 0xde, 0xaf, 0x3c, 0x14, 0x12, 0x1e,
0x66, 0xec, 0xa7, 0x39, 0xa7, 0x2e, 0x13, 0xac, 0x52, 0x54, 0xc9, 0xdd, 0x57, 0x02, 0x47, 0xe1, 0x34, 0xae, 0x3c, 0xbc, 0x84, 0x03, 0xfe, 0x5e, 0x84, 0x8c, 0x06, 0x33, 0xf6, 0xd3, 0x9c, 0x53,
0x4d, 0x26, 0x98, 0xf9, 0x0c, 0xaa, 0x84, 0x47, 0x5c, 0x74, 0xbd, 0x28, 0xf2, 0x02, 0xbf, 0x11, 0x97, 0x09, 0x56, 0x29, 0xaa, 0xe0, 0xee, 0x2b, 0xc2, 0x51, 0x78, 0x93, 0x09, 0x66, 0x3e, 0x83,
0xf8, 0x22, 0x0c, 0x26, 0xf1, 0xeb, 0x60, 0x9e, 0xc1, 0xe9, 0x56, 0xa9, 0x1e, 0xef, 0xf2, 0xf0, 0x2a, 0xe1, 0x11, 0x17, 0x5d, 0x2f, 0x8a, 0xbc, 0xc0, 0x6f, 0x04, 0xbe, 0x08, 0x83, 0x49, 0xfc,
0xf7, 0x73, 0x1e, 0xde, 0x6f, 0x3f, 0xfc, 0x06, 0x4e, 0xb7, 0x4a, 0xe3, 0xb7, 0xe1, 0x4b, 0xc8, 0x66, 0x98, 0x67, 0x70, 0xba, 0x95, 0xd5, 0x4d, 0x5f, 0x2e, 0xfe, 0x7e, 0xce, 0xc3, 0xfb, 0xed,
0xfa, 0x81, 0xcb, 0xa3, 0x4a, 0x4a, 0x6d, 0x07, 0xc7, 0x89, 0x41, 0x6c, 0x07, 0x2e, 0x6f, 0x7b, 0x8b, 0xdf, 0xc0, 0xe9, 0x56, 0x36, 0x7e, 0x31, 0xbe, 0x84, 0xac, 0x1f, 0xb8, 0x3c, 0xaa, 0xa4,
0x91, 0x08, 0xc2, 0x7b, 0xa2, 0x49, 0xe6, 0xbf, 0x53, 0x50, 0x48, 0xc0, 0xe8, 0x18, 0x76, 0x67, 0xd4, 0xcc, 0x70, 0x9c, 0x68, 0xcf, 0x76, 0xe0, 0xf2, 0xb6, 0x17, 0x89, 0x20, 0xbc, 0x27, 0x5a,
0xf3, 0x9b, 0x3b, 0x7e, 0x1f, 0x5f, 0xaa, 0xf8, 0x0b, 0xbd, 0x80, 0xf2, 0x84, 0x45, 0x82, 0xca, 0x64, 0xfe, 0x2b, 0x05, 0x85, 0x04, 0x8c, 0x8e, 0x61, 0x77, 0x36, 0xbf, 0xb9, 0xe3, 0xf7, 0xf1,
0xb9, 0x48, 0x65, 0x91, 0xe2, 0xc7, 0x70, 0x03, 0x45, 0xdf, 0xc0, 0x49, 0x20, 0xc6, 0x3c, 0xd4, 0xa5, 0x8a, 0xbf, 0xd0, 0x0b, 0x28, 0x4f, 0x58, 0x24, 0xa8, 0xec, 0x96, 0x54, 0x26, 0x29, 0x7e,
0x7b, 0x4e, 0x34, 0x1f, 0x0e, 0x79, 0x14, 0xd1, 0x59, 0x18, 0xdc, 0xa8, 0xab, 0xb6, 0x43, 0x1e, 0x22, 0x37, 0x50, 0xf4, 0x0d, 0x9c, 0x04, 0x62, 0xcc, 0x43, 0x3d, 0xfd, 0x44, 0xf3, 0xe1, 0x90,
0x13, 0xa3, 0x57, 0xb0, 0x17, 0xdf, 0x91, 0xa8, 0x92, 0x51, 0xae, 0x3f, 0x7d, 0xf8, 0x86, 0x2c, 0x47, 0x11, 0x9d, 0x85, 0xc1, 0x8d, 0xba, 0x6a, 0x3b, 0xe4, 0x31, 0x1a, 0xbd, 0x82, 0xbd, 0xf8,
0xbc, 0x5f, 0x52, 0xcd, 0x7f, 0xa5, 0xa0, 0xbc, 0x2e, 0x44, 0xcf, 0xd5, 0xed, 0x57, 0x57, 0xd0, 0x8e, 0x44, 0x95, 0x8c, 0xda, 0xfa, 0xd3, 0x87, 0x2f, 0xcb, 0x62, 0xf7, 0x4b, 0xa9, 0xf9, 0x8f,
0x73, 0x55, 0x1c, 0x19, 0x92, 0x40, 0x3e, 0x3a, 0x96, 0x1a, 0x1c, 0x4d, 0x3d, 0x9f, 0xce, 0xb8, 0x14, 0x94, 0xd7, 0x49, 0xf4, 0x5c, 0xdd, 0x7e, 0x75, 0x05, 0x3d, 0x57, 0x9d, 0x23, 0x43, 0x12,
0xcf, 0x26, 0xde, 0x5f, 0x38, 0x5d, 0x6c, 0x19, 0x69, 0xc5, 0xde, 0x2a, 0x43, 0x26, 0x14, 0xd7, 0xc8, 0x47, 0x9f, 0xa5, 0x06, 0x47, 0x53, 0xcf, 0xa7, 0x33, 0xee, 0xb3, 0x89, 0xf7, 0x27, 0x4e,
0x82, 0xce, 0xa8, 0xa0, 0xd7, 0xb0, 0x97, 0x7f, 0x4f, 0x41, 0x31, 0xb9, 0x2f, 0xa1, 0x12, 0xe4, 0x17, 0xb3, 0x47, 0x5a, 0xa9, 0xb7, 0x72, 0xc8, 0x84, 0xe2, 0xda, 0xa1, 0x33, 0xea, 0xd0, 0x6b,
0x2d, 0x9b, 0xb6, 0x3a, 0xd6, 0xb7, 0xed, 0xbe, 0xf1, 0x89, 0xfc, 0xec, 0x0d, 0x1a, 0x0d, 0x8c, 0xd8, 0xcb, 0xbf, 0xa5, 0xa0, 0x98, 0x9c, 0xa2, 0x50, 0x09, 0xf2, 0x96, 0x4d, 0x5b, 0x1d, 0xeb,
0x9b, 0xb8, 0x69, 0xa4, 0x10, 0x82, 0xb2, 0x1c, 0x08, 0xb8, 0x49, 0xfb, 0x56, 0x17, 0x3b, 0x03, 0xdb, 0x76, 0xdf, 0xf8, 0x44, 0x7e, 0xf6, 0x06, 0x8d, 0x06, 0xc6, 0x4d, 0xdc, 0x34, 0x52, 0x08,
0xf9, 0x6a, 0x1c, 0xc2, 0x7e, 0x8c, 0xd9, 0x0e, 0x25, 0xce, 0xa0, 0x8f, 0x8d, 0x34, 0x32, 0xa0, 0x41, 0x59, 0x36, 0x04, 0xdc, 0xa4, 0x7d, 0xab, 0x8b, 0x9d, 0x81, 0x7c, 0x4b, 0x0e, 0x61, 0x3f,
0x18, 0x83, 0x98, 0x10, 0x87, 0x18, 0x19, 0x39, 0xea, 0x62, 0xe4, 0xe1, 0x0b, 0xd4, 0xc4, 0xfd, 0xc6, 0x6c, 0x87, 0x12, 0x67, 0xd0, 0xc7, 0x46, 0x1a, 0x19, 0x50, 0x8c, 0x41, 0x4c, 0x88, 0x43,
0xba, 0xd5, 0xe9, 0x19, 0xd9, 0xda, 0xdf, 0x32, 0xb0, 0xab, 0xf6, 0x8b, 0x10, 0xb5, 0xa1, 0x90, 0x8c, 0x8c, 0x6c, 0x80, 0x31, 0xf2, 0xf0, 0x5d, 0x6a, 0xe2, 0x7e, 0xdd, 0xea, 0xf4, 0x8c, 0x6c,
0x58, 0xd4, 0xd1, 0x59, 0xa2, 0x02, 0x0f, 0x17, 0xf8, 0x6a, 0x65, 0xfb, 0x02, 0x38, 0x8f, 0xbe, 0xed, 0x2f, 0x19, 0xd8, 0x55, 0x53, 0x47, 0x88, 0xda, 0x50, 0x48, 0x8c, 0xef, 0xe8, 0x2c, 0x91,
0x4a, 0xa1, 0xef, 0xa0, 0x98, 0x5c, 0x3b, 0x51, 0x72, 0x9d, 0xd8, 0xb2, 0x8f, 0x7e, 0x50, 0xd7, 0x81, 0x87, 0x63, 0x7d, 0xb5, 0xb2, 0x7d, 0x2c, 0x9c, 0x47, 0x5f, 0xa5, 0xd0, 0x77, 0x50, 0x4c,
0x1b, 0x30, 0x70, 0x24, 0xbc, 0xa9, 0x5c, 0x1f, 0xe2, 0x85, 0x0e, 0x55, 0x13, 0xfc, 0x8d, 0x2d, 0x0e, 0xa3, 0x28, 0x39, 0x64, 0x6c, 0x99, 0x52, 0x3f, 0x68, 0xeb, 0x0d, 0x18, 0x38, 0x12, 0xde,
0xb1, 0x7a, 0xba, 0x55, 0x16, 0xf7, 0x47, 0x47, 0x87, 0x18, 0xaf, 0x54, 0x0f, 0x42, 0x5c, 0xdf, 0x54, 0x0e, 0x15, 0xf1, 0x98, 0x87, 0xaa, 0x09, 0xfd, 0xc6, 0xec, 0x58, 0x3d, 0xdd, 0xca, 0xc5,
0xe3, 0xaa, 0xcf, 0x1f, 0x13, 0xc7, 0xda, 0x5c, 0x38, 0xdc, 0xd2, 0xc9, 0xe8, 0xd7, 0x49, 0x0f, 0xf5, 0xd1, 0xd1, 0x47, 0x8c, 0x07, 0xad, 0x07, 0x47, 0x5c, 0x9f, 0xee, 0xaa, 0xcf, 0x1f, 0xa3,
0x1e, 0x9d, 0x03, 0xd5, 0x17, 0xbf, 0x44, 0x5b, 0x59, 0xd9, 0xd2, 0xf2, 0x6b, 0x56, 0x1e, 0x1f, 0x63, 0x6b, 0x2e, 0x1c, 0x6e, 0xa9, 0x64, 0xf4, 0xcb, 0xe4, 0x0e, 0x1e, 0xed, 0x03, 0xd5, 0x17,
0x18, 0x6b, 0x56, 0x3e, 0x30, 0x39, 0x5e, 0xff, 0xf6, 0x8f, 0x57, 0x23, 0x4f, 0x8c, 0xe7, 0x37, 0xff, 0x4f, 0xb6, 0xf2, 0xb2, 0xa5, 0xe4, 0xd7, 0xbc, 0x3c, 0xde, 0x30, 0xd6, 0xbc, 0x7c, 0xa0,
0x97, 0xc3, 0x60, 0x7a, 0x35, 0xf1, 0x46, 0x63, 0xe1, 0x7b, 0xfe, 0xc8, 0xe7, 0xe2, 0xcf, 0x41, 0x73, 0xbc, 0xfe, 0xf5, 0xef, 0xaf, 0x46, 0x9e, 0x18, 0xcf, 0x6f, 0x2e, 0x87, 0xc1, 0xf4, 0x6a,
0x78, 0x77, 0x35, 0xf1, 0xdd, 0x2b, 0xb5, 0xa2, 0x5e, 0x2d, 0xd5, 0xdd, 0xec, 0xaa, 0x7f, 0xf0, 0xe2, 0x8d, 0xc6, 0xc2, 0xf7, 0xfc, 0x91, 0xcf, 0xc5, 0x1f, 0x83, 0xf0, 0xee, 0x6a, 0xe2, 0xbb,
0x7e, 0xf7, 0xff, 0x00, 0x00, 0x00, 0xff, 0xff, 0x7c, 0x28, 0x1a, 0x3a, 0x10, 0x0e, 0x00, 0x00, 0x57, 0x6a, 0x70, 0xbd, 0x5a, 0x9a, 0xbb, 0xd9, 0x55, 0xff, 0xf6, 0xfd, 0xe6, 0x7f, 0x01, 0x00,
0x00, 0xff, 0xff, 0xcc, 0x5a, 0xee, 0x77, 0x26, 0x0e, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -195,6 +195,11 @@ message Failure {
PERMANENT_NODE_FAILURE = 20; PERMANENT_NODE_FAILURE = 20;
PERMANENT_CHANNEL_FAILURE = 21; PERMANENT_CHANNEL_FAILURE = 21;
/**
The error source is known, but the failure itself couldn't be decoded.
*/
UNKNOWN_FAILURE = 998;
/** /**
An unreadable failure result is returned if the received failure message An unreadable failure result is returned if the received failure message
cannot be decrypted. In that case the error source is unknown. cannot be decrypted. In that case the error source is unknown.

@ -399,9 +399,8 @@ func marshallError(sendError error) (*Failure, error) {
case *lnwire.FailPermanentChannelFailure: case *lnwire.FailPermanentChannelFailure:
response.Code = Failure_PERMANENT_CHANNEL_FAILURE response.Code = Failure_PERMANENT_CHANNEL_FAILURE
default: default:
return nil, errors.New("unknown wire error") response.Code = Failure_UNKNOWN_FAILURE
} }
response.FailureSourceIndex = uint32(fErr.FailureSourceIdx) response.FailureSourceIndex = uint32(fErr.FailureSourceIdx)

@ -2076,8 +2076,10 @@ func (r *ChannelRouter) processSendError(paySession PaymentSession,
}, 0) }, 0)
return false, 0 return false, 0
// Any other failure or an empty failure will get the node pruned.
default: default:
return true, channeldb.FailureReasonError paySession.ReportVertexFailure(failureVertex)
return false, 0
} }
} }

@ -2512,6 +2512,31 @@ func TestUnknownErrorSource(t *testing.T) {
if err != nil { if err != nil {
t.Fatalf("expected payment to succeed, but got: %v", err) t.Fatalf("expected payment to succeed, but got: %v", err)
} }
// Next we modify payment result to return an unknown failure.
ctx.router.cfg.Payer.(*mockPaymentAttemptDispatcher).setPaymentResult(
func(firstHop lnwire.ShortChannelID) ([32]byte, error) {
// If channel a->b is used, simulate that the failure
// couldn't be decoded (FailureMessage is nil).
if firstHop.ToUint64() == 2 {
return [32]byte{},
&htlcswitch.ForwardingError{
FailureSourceIdx: 1,
}
}
// Otherwise the payment succeeds.
return lntypes.Preimage{}, nil
})
// Send off the payment request to the router. We expect the payment to
// fail because both routes have been pruned.
payment.PaymentHash = lntypes.Hash{1}
_, _, err = ctx.router.SendPayment(&payment)
if err == nil {
t.Fatalf("expected payment to fail")
}
} }
// assertChannelsPruned ensures that only the given channels are pruned from the // assertChannelsPruned ensures that only the given channels are pruned from the