routing: convert to node pair based

Previously mission control tracked failures on a per node, per channel basis.
This commit changes this to tracking on the level of directed node pairs. The goal
of moving to this coarser-grained level is to reduce the number of required
payment attempts without compromising payment reliability.
This commit is contained in:
Joost Jager 2019-07-29 15:10:58 +02:00
parent 6ee2c04190
commit f1769c8c8c
No known key found for this signature in database
GPG Key ID: A61B9D4C393C59C7
17 changed files with 1133 additions and 995 deletions

@ -32,24 +32,43 @@ func queryMissionControl(ctx *cli.Context) error {
}
type displayNodeHistory struct {
Pubkey string
LastFailTime int64
OtherChanSuccessProb float32
Channels []*routerrpc.ChannelHistory
Pubkey string
LastFailTime int64
OtherSuccessProb float32
}
type displayPairHistory struct {
NodeFrom, NodeTo string
LastFailTime int64
SuccessProb float32
MinPenalizeAmtSat int64
}
displayResp := struct {
Nodes []displayNodeHistory
Pairs []displayPairHistory
}{}
for _, n := range snapshot.Nodes {
displayResp.Nodes = append(
displayResp.Nodes,
displayNodeHistory{
Pubkey: hex.EncodeToString(n.Pubkey),
LastFailTime: n.LastFailTime,
OtherChanSuccessProb: n.OtherChanSuccessProb,
Channels: n.Channels,
Pubkey: hex.EncodeToString(n.Pubkey),
LastFailTime: n.LastFailTime,
OtherSuccessProb: n.OtherSuccessProb,
},
)
}
for _, n := range snapshot.Pairs {
displayResp.Pairs = append(
displayResp.Pairs,
displayPairHistory{
NodeFrom: hex.EncodeToString(n.NodeFrom),
NodeTo: hex.EncodeToString(n.NodeTo),
LastFailTime: n.LastFailTime,
SuccessProb: n.SuccessProb,
MinPenalizeAmtSat: n.MinPenalizeAmtSat,
},
)
}

@ -979,9 +979,12 @@ func (m *QueryMissionControlRequest) XXX_DiscardUnknown() {
var xxx_messageInfo_QueryMissionControlRequest proto.InternalMessageInfo
/// QueryMissionControlResponse contains mission control state per node.
/// QueryMissionControlResponse contains mission control state.
type QueryMissionControlResponse struct {
Nodes []*NodeHistory `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"`
/// Node-level mission control state.
Nodes []*NodeHistory `protobuf:"bytes,1,rep,name=nodes,proto3" json:"nodes,omitempty"`
/// Node pair-level mission control state.
Pairs []*PairHistory `protobuf:"bytes,2,rep,name=pairs,proto3" json:"pairs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
@ -1019,19 +1022,26 @@ func (m *QueryMissionControlResponse) GetNodes() []*NodeHistory {
return nil
}
func (m *QueryMissionControlResponse) GetPairs() []*PairHistory {
if m != nil {
return m.Pairs
}
return nil
}
/// NodeHistory contains the mission control state for a particular node.
type NodeHistory struct {
/// Node pubkey
Pubkey []byte `protobuf:"bytes,1,opt,name=pubkey,proto3" json:"pubkey,omitempty"`
/// Time stamp of last failure. Set to zero if no failure happened yet.
LastFailTime int64 `protobuf:"varint,2,opt,name=last_fail_time,proto3" json:"last_fail_time,omitempty"`
/// Estimation of success probability for channels not in the channel array.
OtherChanSuccessProb float32 `protobuf:"fixed32,3,opt,name=other_chan_success_prob,proto3" json:"other_chan_success_prob,omitempty"`
/// Historical information of particular channels.
Channels []*ChannelHistory `protobuf:"bytes,4,rep,name=channels,proto3" json:"channels,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
//*
//Estimation of success probability of forwarding towards peers of this node
//for which no specific history is available.
OtherSuccessProb float32 `protobuf:"fixed32,3,opt,name=other_success_prob,proto3" json:"other_success_prob,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *NodeHistory) Reset() { *m = NodeHistory{} }
@ -1073,82 +1083,84 @@ func (m *NodeHistory) GetLastFailTime() int64 {
return 0
}
func (m *NodeHistory) GetOtherChanSuccessProb() float32 {
func (m *NodeHistory) GetOtherSuccessProb() float32 {
if m != nil {
return m.OtherChanSuccessProb
return m.OtherSuccessProb
}
return 0
}
func (m *NodeHistory) GetChannels() []*ChannelHistory {
if m != nil {
return m.Channels
}
return nil
}
/// NodeHistory contains the mission control state for a particular channel.
type ChannelHistory struct {
/// Short channel id
ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id,proto3" json:"channel_id,omitempty"`
/// PairHistory contains the mission control state for a particular node pair.
type PairHistory struct {
/// The source node pubkey of the pair.
NodeFrom []byte `protobuf:"bytes,1,opt,name=node_from,proto3" json:"node_from,omitempty"`
/// The destination node pubkey of the pair.
NodeTo []byte `protobuf:"bytes,2,opt,name=node_to,proto3" json:"node_to,omitempty"`
/// Time stamp of last failure.
LastFailTime int64 `protobuf:"varint,2,opt,name=last_fail_time,proto3" json:"last_fail_time,omitempty"`
LastFailTime int64 `protobuf:"varint,3,opt,name=last_fail_time,proto3" json:"last_fail_time,omitempty"`
/// Minimum penalization amount.
MinPenalizeAmtSat int64 `protobuf:"varint,3,opt,name=min_penalize_amt_sat,proto3" json:"min_penalize_amt_sat,omitempty"`
/// Estimation of success probability for this channel.
SuccessProb float32 `protobuf:"fixed32,4,opt,name=success_prob,proto3" json:"success_prob,omitempty"`
MinPenalizeAmtSat int64 `protobuf:"varint,4,opt,name=min_penalize_amt_sat,proto3" json:"min_penalize_amt_sat,omitempty"`
/// Estimation of success probability for this pair.
SuccessProb float32 `protobuf:"fixed32,5,opt,name=success_prob,proto3" json:"success_prob,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ChannelHistory) Reset() { *m = ChannelHistory{} }
func (m *ChannelHistory) String() string { return proto.CompactTextString(m) }
func (*ChannelHistory) ProtoMessage() {}
func (*ChannelHistory) Descriptor() ([]byte, []int) {
func (m *PairHistory) Reset() { *m = PairHistory{} }
func (m *PairHistory) String() string { return proto.CompactTextString(m) }
func (*PairHistory) ProtoMessage() {}
func (*PairHistory) Descriptor() ([]byte, []int) {
return fileDescriptor_7a0613f69d37b0a5, []int{14}
}
func (m *ChannelHistory) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelHistory.Unmarshal(m, b)
func (m *PairHistory) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PairHistory.Unmarshal(m, b)
}
func (m *ChannelHistory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ChannelHistory.Marshal(b, m, deterministic)
func (m *PairHistory) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_PairHistory.Marshal(b, m, deterministic)
}
func (m *ChannelHistory) XXX_Merge(src proto.Message) {
xxx_messageInfo_ChannelHistory.Merge(m, src)
func (m *PairHistory) XXX_Merge(src proto.Message) {
xxx_messageInfo_PairHistory.Merge(m, src)
}
func (m *ChannelHistory) XXX_Size() int {
return xxx_messageInfo_ChannelHistory.Size(m)
func (m *PairHistory) XXX_Size() int {
return xxx_messageInfo_PairHistory.Size(m)
}
func (m *ChannelHistory) XXX_DiscardUnknown() {
xxx_messageInfo_ChannelHistory.DiscardUnknown(m)
func (m *PairHistory) XXX_DiscardUnknown() {
xxx_messageInfo_PairHistory.DiscardUnknown(m)
}
var xxx_messageInfo_ChannelHistory proto.InternalMessageInfo
var xxx_messageInfo_PairHistory proto.InternalMessageInfo
func (m *ChannelHistory) GetChannelId() uint64 {
func (m *PairHistory) GetNodeFrom() []byte {
if m != nil {
return m.ChannelId
return m.NodeFrom
}
return 0
return nil
}
func (m *ChannelHistory) GetLastFailTime() int64 {
func (m *PairHistory) GetNodeTo() []byte {
if m != nil {
return m.NodeTo
}
return nil
}
func (m *PairHistory) GetLastFailTime() int64 {
if m != nil {
return m.LastFailTime
}
return 0
}
func (m *ChannelHistory) GetMinPenalizeAmtSat() int64 {
func (m *PairHistory) GetMinPenalizeAmtSat() int64 {
if m != nil {
return m.MinPenalizeAmtSat
}
return 0
}
func (m *ChannelHistory) GetSuccessProb() float32 {
func (m *PairHistory) GetSuccessProb() float32 {
if m != nil {
return m.SuccessProb
}
@ -1172,117 +1184,118 @@ func init() {
proto.RegisterType((*QueryMissionControlRequest)(nil), "routerrpc.QueryMissionControlRequest")
proto.RegisterType((*QueryMissionControlResponse)(nil), "routerrpc.QueryMissionControlResponse")
proto.RegisterType((*NodeHistory)(nil), "routerrpc.NodeHistory")
proto.RegisterType((*ChannelHistory)(nil), "routerrpc.ChannelHistory")
proto.RegisterType((*PairHistory)(nil), "routerrpc.PairHistory")
}
func init() { proto.RegisterFile("routerrpc/router.proto", fileDescriptor_7a0613f69d37b0a5) }
var fileDescriptor_7a0613f69d37b0a5 = []byte{
// 1663 bytes of a gzipped FileDescriptorProto
// 1677 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0x4f, 0x77, 0x22, 0xc7,
0x11, 0x37, 0x02, 0x84, 0x28, 0xfe, 0x8d, 0x5a, 0x5a, 0x89, 0x45, 0xab, 0xb5, 0x8c, 0x9d, 0xb5,
0xde, 0x3e, 0x47, 0x72, 0xc8, 0x5b, 0x3f, 0x9f, 0x92, 0xc7, 0x42, 0x63, 0x8d, 0x17, 0x66, 0xe4,
0x06, 0xd6, 0xde, 0xe4, 0xd0, 0xaf, 0xc5, 0xb4, 0x60, 0x9e, 0x60, 0x06, 0xcf, 0x34, 0xce, 0x2a,
0x87, 0xdc, 0x72, 0xcc, 0x3d, 0xdf, 0x22, 0xf9, 0x04, 0xb9, 0xe7, 0x8b, 0x24, 0xdf, 0x21, 0xa7,
0xbc, 0xee, 0x9e, 0x81, 0x01, 0xa1, 0xb5, 0x4f, 0x62, 0x7e, 0xbf, 0x5f, 0x57, 0x75, 0x57, 0x75,
0x55, 0x97, 0xe0, 0x28, 0xf0, 0x17, 0x82, 0x07, 0xc1, 0x7c, 0x74, 0xa9, 0x7f, 0x5d, 0xcc, 0x03,
0x5f, 0xf8, 0x28, 0xbf, 0xc4, 0x6b, 0xf9, 0x60, 0x3e, 0xd2, 0x68, 0xfd, 0x7f, 0x3b, 0x80, 0xfa,
0xdc, 0x73, 0xae, 0xd9, 0xfd, 0x8c, 0x7b, 0x82, 0xf0, 0x1f, 0x17, 0x3c, 0x14, 0x08, 0x41, 0xc6,
0xe1, 0xa1, 0xa8, 0xa6, 0xce, 0x52, 0xe7, 0x45, 0xa2, 0x7e, 0x23, 0x03, 0xd2, 0x6c, 0x26, 0xaa,
0x3b, 0x67, 0xa9, 0xf3, 0x34, 0x91, 0x3f, 0xd1, 0x27, 0x50, 0x9c, 0xeb, 0x75, 0x74, 0xc2, 0xc2,
0x49, 0x35, 0xad, 0xd4, 0x85, 0x08, 0xbb, 0x62, 0xe1, 0x04, 0x9d, 0x83, 0x71, 0xeb, 0x7a, 0x6c,
0x4a, 0x47, 0x53, 0xf1, 0x13, 0x75, 0xf8, 0x54, 0xb0, 0x6a, 0xe6, 0x2c, 0x75, 0x9e, 0x25, 0x65,
0x85, 0xb7, 0xa6, 0xe2, 0xa7, 0xb6, 0x44, 0xd1, 0xe7, 0x50, 0x89, 0x8d, 0x05, 0x7a, 0x17, 0xd5,
0xec, 0x59, 0xea, 0x3c, 0x4f, 0xca, 0xf3, 0xf5, 0xbd, 0x7d, 0x0e, 0x15, 0xe1, 0xce, 0xb8, 0xbf,
0x10, 0x34, 0xe4, 0x23, 0xdf, 0x73, 0xc2, 0xea, 0xae, 0xb6, 0x18, 0xc1, 0x7d, 0x8d, 0xa2, 0x3a,
0x94, 0x6e, 0x39, 0xa7, 0x53, 0x77, 0xe6, 0x0a, 0x1a, 0x32, 0x51, 0xcd, 0xa9, 0xad, 0x17, 0x6e,
0x39, 0xef, 0x4a, 0xac, 0xcf, 0x84, 0xdc, 0x9f, 0xbf, 0x10, 0x63, 0xdf, 0xf5, 0xc6, 0x74, 0x34,
0x61, 0x1e, 0x75, 0x9d, 0xea, 0xde, 0x59, 0xea, 0x3c, 0x43, 0xca, 0x31, 0xde, 0x9a, 0x30, 0xcf,
0x74, 0xd0, 0x29, 0x80, 0x3a, 0x83, 0x32, 0x57, 0xcd, 0x2b, 0x8f, 0x79, 0x89, 0x28, 0x5b, 0xa8,
0x01, 0x05, 0x15, 0x60, 0x3a, 0x71, 0x3d, 0x11, 0x56, 0xe1, 0x2c, 0x7d, 0x5e, 0x68, 0x18, 0x17,
0x53, 0x4f, 0xc6, 0x9a, 0x48, 0xe6, 0xca, 0xf5, 0x04, 0x49, 0x8a, 0xea, 0x5f, 0xc3, 0xc1, 0x20,
0x60, 0xa3, 0xbb, 0x8d, 0xe0, 0x6f, 0x86, 0x35, 0xf5, 0x20, 0xac, 0xf5, 0xbf, 0x40, 0x29, 0x5a,
0xd4, 0x17, 0x4c, 0x2c, 0x42, 0xf4, 0x6b, 0xc8, 0x86, 0x82, 0x09, 0xae, 0xc4, 0xe5, 0xc6, 0xf1,
0xc5, 0x32, 0xdb, 0x17, 0x09, 0x21, 0x27, 0x5a, 0x85, 0x6a, 0xb0, 0x37, 0x0f, 0xb8, 0x3b, 0x63,
0x63, 0xae, 0x12, 0x5a, 0x24, 0xcb, 0x6f, 0x54, 0x87, 0xac, 0x5a, 0xac, 0xd2, 0x59, 0x68, 0x14,
0x93, 0x67, 0x20, 0x9a, 0xaa, 0xff, 0x0e, 0x2a, 0xea, 0xbb, 0xc3, 0xf9, 0x87, 0xae, 0xcc, 0x31,
0xe4, 0xd8, 0x4c, 0xc7, 0x5e, 0x5f, 0x9b, 0x5d, 0x36, 0x93, 0x61, 0xaf, 0x3b, 0x60, 0xac, 0xd6,
0x87, 0x73, 0xdf, 0x0b, 0xb9, 0x4c, 0x85, 0x34, 0x2e, 0x33, 0x21, 0xd3, 0x36, 0x93, 0xab, 0x52,
0x6a, 0x55, 0x39, 0xc2, 0x3b, 0x9c, 0xf7, 0x42, 0x26, 0xd0, 0x0b, 0x7d, 0x03, 0xe8, 0xd4, 0x1f,
0xdd, 0xc9, 0x3b, 0xc5, 0xee, 0x23, 0xf3, 0x25, 0x09, 0x77, 0xfd, 0xd1, 0x5d, 0x5b, 0x82, 0xf5,
0x3f, 0xea, 0xbb, 0x3d, 0xf0, 0xf5, 0xde, 0x7f, 0x71, 0x78, 0x57, 0x21, 0xd8, 0x79, 0x3c, 0x04,
0x14, 0x0e, 0xd6, 0x8c, 0x47, 0xa7, 0x48, 0x46, 0x36, 0xb5, 0x11, 0xd9, 0x2f, 0x20, 0x77, 0xcb,
0xdc, 0xe9, 0x22, 0x88, 0x0d, 0xa3, 0x44, 0x9a, 0x3a, 0x9a, 0x21, 0xb1, 0xa4, 0xfe, 0xef, 0x1c,
0xe4, 0x22, 0x10, 0x35, 0x20, 0x33, 0xf2, 0x9d, 0x38, 0xbb, 0xcf, 0x1f, 0x2e, 0x8b, 0xff, 0xb6,
0x7c, 0x87, 0x13, 0xa5, 0x45, 0xbf, 0x87, 0xb2, 0xbc, 0xd1, 0x1e, 0x9f, 0xd2, 0xc5, 0xdc, 0x61,
0xcb, 0x84, 0x56, 0x13, 0xab, 0x5b, 0x5a, 0x30, 0x54, 0x3c, 0x29, 0x8d, 0x92, 0x9f, 0xe8, 0x04,
0xf2, 0x13, 0x31, 0x1d, 0xe9, 0x4c, 0x64, 0x54, 0x51, 0xec, 0x49, 0x40, 0xe5, 0xa0, 0x0e, 0x25,
0xdf, 0x73, 0x7d, 0x8f, 0x86, 0x13, 0x46, 0x1b, 0xaf, 0xbe, 0x52, 0xc5, 0x5a, 0x24, 0x05, 0x05,
0xf6, 0x27, 0xac, 0xf1, 0xea, 0x2b, 0xf4, 0x31, 0x14, 0x54, 0xc9, 0xf0, 0xf7, 0x73, 0x37, 0xb8,
0x57, 0x55, 0x5a, 0x22, 0xaa, 0x8a, 0xb0, 0x42, 0xd0, 0x21, 0x64, 0x6f, 0xa7, 0x6c, 0x1c, 0xaa,
0xca, 0x2c, 0x11, 0xfd, 0x81, 0xbe, 0x84, 0xc3, 0x28, 0x06, 0x34, 0xf4, 0x17, 0xc1, 0x88, 0x53,
0xd7, 0x73, 0xf8, 0x7b, 0x55, 0x97, 0x25, 0x82, 0x22, 0xae, 0xaf, 0x28, 0x53, 0x32, 0xf5, 0xbf,
0x67, 0xa1, 0x90, 0x08, 0x00, 0x2a, 0xc2, 0x1e, 0xc1, 0x7d, 0x4c, 0xde, 0xe2, 0xb6, 0xf1, 0x11,
0x3a, 0x87, 0xcf, 0x4c, 0xab, 0x65, 0x13, 0x82, 0x5b, 0x03, 0x6a, 0x13, 0x3a, 0xb4, 0xde, 0x58,
0xf6, 0xf7, 0x16, 0xbd, 0x6e, 0xbe, 0xeb, 0x61, 0x6b, 0x40, 0xdb, 0x78, 0xd0, 0x34, 0xbb, 0x7d,
0x23, 0x85, 0x9e, 0x41, 0x75, 0xa5, 0x8c, 0xe9, 0x66, 0xcf, 0x1e, 0x5a, 0x03, 0x63, 0x07, 0x7d,
0x0c, 0x27, 0x1d, 0xd3, 0x6a, 0x76, 0xe9, 0x4a, 0xd3, 0xea, 0x0e, 0xde, 0x52, 0xfc, 0xc3, 0xb5,
0x49, 0xde, 0x19, 0xe9, 0x6d, 0x82, 0xab, 0x41, 0xb7, 0x15, 0x5b, 0xc8, 0xa0, 0xa7, 0xf0, 0x44,
0x0b, 0xf4, 0x12, 0x3a, 0xb0, 0x6d, 0xda, 0xb7, 0x6d, 0xcb, 0xc8, 0xa2, 0x7d, 0x28, 0x99, 0xd6,
0xdb, 0x66, 0xd7, 0x6c, 0x53, 0x82, 0x9b, 0xdd, 0x9e, 0xb1, 0x8b, 0x0e, 0xa0, 0xb2, 0xa9, 0xcb,
0x49, 0x13, 0xb1, 0xce, 0xb6, 0x4c, 0xdb, 0xa2, 0x6f, 0x31, 0xe9, 0x9b, 0xb6, 0x65, 0xec, 0xa1,
0x23, 0x40, 0xeb, 0xd4, 0x55, 0xaf, 0xd9, 0x32, 0xf2, 0xe8, 0x09, 0xec, 0xaf, 0xe3, 0x6f, 0xf0,
0x3b, 0x03, 0x50, 0x15, 0x0e, 0xf5, 0xc6, 0xe8, 0x6b, 0xdc, 0xb5, 0xbf, 0xa7, 0x3d, 0xd3, 0x32,
0x7b, 0xc3, 0x9e, 0x51, 0x40, 0x87, 0x60, 0x74, 0x30, 0xa6, 0xa6, 0xd5, 0x1f, 0x76, 0x3a, 0x66,
0xcb, 0xc4, 0xd6, 0xc0, 0x28, 0x6a, 0xcf, 0xdb, 0x0e, 0x5e, 0x92, 0x0b, 0x5a, 0x57, 0x4d, 0xcb,
0xc2, 0x5d, 0xda, 0x36, 0xfb, 0xcd, 0xd7, 0x5d, 0xdc, 0x36, 0xca, 0xe8, 0x14, 0x9e, 0x0e, 0x70,
0xef, 0xda, 0x26, 0x4d, 0xf2, 0x8e, 0xc6, 0x7c, 0xa7, 0x69, 0x76, 0x87, 0x04, 0x1b, 0x15, 0xf4,
0x09, 0x9c, 0x12, 0xfc, 0xdd, 0xd0, 0x24, 0xb8, 0x4d, 0x2d, 0xbb, 0x8d, 0x69, 0x07, 0x37, 0x07,
0x43, 0x82, 0x69, 0xcf, 0xec, 0xf7, 0x4d, 0xeb, 0x1b, 0xc3, 0x40, 0x9f, 0xc1, 0xd9, 0x52, 0xb2,
0x34, 0xb0, 0xa1, 0xda, 0x97, 0xe7, 0x8b, 0x53, 0x6a, 0xe1, 0x1f, 0x06, 0xf4, 0x1a, 0x63, 0x62,
0x20, 0x54, 0x83, 0xa3, 0x95, 0x7b, 0xed, 0x20, 0xf2, 0x7d, 0x20, 0xb9, 0x6b, 0x4c, 0x7a, 0x4d,
0x4b, 0x26, 0x78, 0x8d, 0x3b, 0x94, 0xdb, 0x5e, 0x71, 0x9b, 0xdb, 0x7e, 0x82, 0x0e, 0xa1, 0x12,
0x7b, 0x8b, 0xc1, 0xff, 0xe4, 0xd0, 0x31, 0xa0, 0xa1, 0x45, 0x70, 0xb3, 0x2d, 0x0f, 0xbf, 0x24,
0xfe, 0x9b, 0xfb, 0x36, 0xb3, 0xb7, 0x63, 0xa4, 0xeb, 0xff, 0x48, 0x43, 0x69, 0xad, 0xd6, 0xd0,
0x33, 0xc8, 0x87, 0xee, 0xd8, 0x63, 0x42, 0x76, 0x03, 0xdd, 0x28, 0x56, 0x80, 0x7a, 0x6c, 0x26,
0xcc, 0xf5, 0x74, 0x87, 0xd2, 0x1d, 0x3a, 0xaf, 0x10, 0xd5, 0x9f, 0x8e, 0x21, 0x17, 0x3f, 0x56,
0x69, 0x55, 0x97, 0xbb, 0x23, 0xfd, 0x48, 0x3d, 0x83, 0xbc, 0x6c, 0x81, 0xa1, 0x60, 0xb3, 0xb9,
0x2a, 0xd9, 0x12, 0x59, 0x01, 0xe8, 0x53, 0x28, 0xcd, 0x78, 0x18, 0xb2, 0x31, 0xa7, 0xba, 0xec,
0x40, 0x29, 0x8a, 0x11, 0xd8, 0x51, 0xd5, 0xf7, 0x29, 0xc4, 0x6d, 0x20, 0x12, 0x65, 0xb5, 0x28,
0x02, 0xb5, 0x68, 0xb3, 0x03, 0x0b, 0x16, 0x55, 0x77, 0xb2, 0x03, 0x0b, 0x86, 0x5e, 0xc2, 0xbe,
0x6e, 0x21, 0xae, 0xe7, 0xce, 0x16, 0x33, 0xdd, 0x4a, 0x72, 0x6a, 0xcb, 0x15, 0xd5, 0x4a, 0x34,
0xae, 0x3a, 0xca, 0x53, 0xd8, 0xbb, 0x61, 0x21, 0x97, 0xcd, 0x3f, 0x2a, 0xf5, 0x9c, 0xfc, 0xee,
0x70, 0x2e, 0x29, 0xf9, 0x24, 0x04, 0xb2, 0x89, 0xe5, 0x35, 0x75, 0xcb, 0x39, 0x91, 0x71, 0x5c,
0x7a, 0x60, 0xef, 0x57, 0x1e, 0x0a, 0x09, 0x0f, 0x1a, 0x57, 0x1e, 0x5e, 0xc2, 0x3e, 0x7f, 0x2f,
0x02, 0x46, 0xfd, 0x39, 0xfb, 0x71, 0xc1, 0xa9, 0xc3, 0x04, 0xab, 0x16, 0x55, 0x70, 0x2b, 0x8a,
0xb0, 0x15, 0xde, 0x66, 0x82, 0xd5, 0x9f, 0x41, 0x8d, 0xf0, 0x90, 0x8b, 0x9e, 0x1b, 0x86, 0xae,
0xef, 0xb5, 0x7c, 0x4f, 0x04, 0xfe, 0x34, 0x7a, 0x43, 0xea, 0xa7, 0x70, 0xb2, 0x95, 0xd5, 0x8f,
0x80, 0x5c, 0xfc, 0xdd, 0x82, 0x07, 0xf7, 0xdb, 0x17, 0xbf, 0x81, 0x93, 0xad, 0x6c, 0xf4, 0x82,
0x7c, 0x01, 0x59, 0xcf, 0x77, 0x78, 0x58, 0x4d, 0xa9, 0x19, 0xe2, 0x28, 0xd1, 0xae, 0x2d, 0xdf,
0xe1, 0x57, 0x6e, 0x28, 0xfc, 0xe0, 0x9e, 0x68, 0x51, 0xfd, 0x5f, 0x29, 0x28, 0x24, 0x60, 0x74,
0x04, 0xbb, 0xf3, 0xc5, 0xcd, 0x1d, 0xbf, 0x8f, 0x2e, 0x55, 0xf4, 0x85, 0x5e, 0x40, 0x79, 0xca,
0x42, 0x41, 0x65, 0xf7, 0xa4, 0x32, 0x49, 0xd1, 0x93, 0xb9, 0x81, 0xa2, 0xaf, 0xe1, 0xd8, 0x17,
0x13, 0x1e, 0xe8, 0x69, 0x28, 0x5c, 0x8c, 0x46, 0x3c, 0x0c, 0xe9, 0x3c, 0xf0, 0x6f, 0xd4, 0x55,
0xdb, 0x21, 0x8f, 0xd1, 0xe8, 0x15, 0xec, 0x45, 0x77, 0x24, 0xac, 0x66, 0xd4, 0xd6, 0x9f, 0x3e,
0x7c, 0x69, 0xe2, 0xdd, 0x2f, 0xa5, 0xf5, 0x7f, 0xa6, 0xa0, 0xbc, 0x4e, 0xa2, 0xe7, 0xea, 0xf6,
0xab, 0x2b, 0xe8, 0x3a, 0xea, 0x1c, 0x19, 0x92, 0x40, 0x7e, 0xf1, 0x59, 0x1a, 0x70, 0x38, 0x73,
0x3d, 0x3a, 0xe7, 0x1e, 0x9b, 0xba, 0x7f, 0xe6, 0x34, 0x9e, 0x45, 0xd2, 0x4a, 0xbd, 0x95, 0x43,
0x75, 0x28, 0xae, 0x1d, 0x3a, 0xa3, 0x0e, 0xbd, 0x86, 0xbd, 0xfc, 0x5b, 0x0a, 0x8a, 0xc9, 0xa9,
0x0a, 0x95, 0x20, 0x6f, 0x5a, 0xb4, 0xd3, 0x35, 0xbf, 0xb9, 0x1a, 0x18, 0x1f, 0xc9, 0xcf, 0xfe,
0xb0, 0xd5, 0xc2, 0xb8, 0x8d, 0xdb, 0x46, 0x0a, 0x21, 0x28, 0xcb, 0x86, 0x80, 0xdb, 0x74, 0x60,
0xf6, 0xb0, 0x3d, 0x94, 0x6f, 0xc9, 0x01, 0x54, 0x22, 0xcc, 0xb2, 0x29, 0xb1, 0x87, 0x03, 0x6c,
0xa4, 0x91, 0x01, 0xc5, 0x08, 0xc4, 0x84, 0xd8, 0xc4, 0xc8, 0xc8, 0x06, 0x18, 0x21, 0x0f, 0xdf,
0xa5, 0xf8, 0xd9, 0xca, 0x36, 0xfe, 0x9a, 0x81, 0x5d, 0x35, 0x85, 0x04, 0xe8, 0x0a, 0x0a, 0x89,
0x71, 0x1e, 0x9d, 0x26, 0x32, 0xf0, 0x70, 0xcc, 0xaf, 0x55, 0xb7, 0x8f, 0x89, 0x8b, 0xf0, 0xcb,
0x14, 0xfa, 0x16, 0x8a, 0xc9, 0xe1, 0x14, 0x25, 0x87, 0x8e, 0x2d, 0x53, 0xeb, 0x07, 0x6d, 0xbd,
0x01, 0x03, 0x87, 0xc2, 0x9d, 0xc9, 0x21, 0x23, 0x1a, 0xfb, 0x50, 0x2d, 0xa1, 0xdf, 0x98, 0x25,
0x6b, 0x27, 0x5b, 0xb9, 0xa8, 0x3e, 0xba, 0xfa, 0x88, 0xd1, 0xe0, 0xf5, 0xe0, 0x88, 0xeb, 0xd3,
0x5e, 0xed, 0xf9, 0x63, 0x74, 0x64, 0xcd, 0x81, 0x83, 0x2d, 0x95, 0x8c, 0x7e, 0x95, 0xdc, 0xc1,
0xa3, 0x7d, 0xa0, 0xf6, 0xe2, 0xe7, 0x64, 0x2b, 0x2f, 0x5b, 0x4a, 0x7e, 0xcd, 0xcb, 0xe3, 0x0d,
0x63, 0xcd, 0xcb, 0x07, 0x3a, 0xc7, 0xeb, 0xdf, 0xfc, 0xe1, 0x72, 0xec, 0x8a, 0xc9, 0xe2, 0xe6,
0x62, 0xe4, 0xcf, 0x2e, 0xa7, 0xee, 0x78, 0x22, 0x3c, 0xd7, 0x1b, 0x7b, 0x5c, 0xfc, 0xc9, 0x0f,
0xee, 0x2e, 0xa7, 0x9e, 0x73, 0xa9, 0x06, 0xd9, 0xcb, 0xa5, 0xb9, 0x9b, 0x5d, 0xf5, 0x6f, 0xe0,
0x6f, 0xff, 0x1f, 0x00, 0x00, 0xff, 0xff, 0x58, 0x80, 0x4d, 0xdb, 0x36, 0x0e, 0x00, 0x00,
0x11, 0x37, 0x02, 0x84, 0x28, 0xfe, 0xcd, 0xb6, 0xb4, 0xda, 0x59, 0xb4, 0xb2, 0xe5, 0xb1, 0xb3,
0xd6, 0xdb, 0xe7, 0x48, 0x0e, 0x79, 0xf6, 0xcb, 0x29, 0x79, 0x2c, 0x34, 0xd6, 0xec, 0xc2, 0x8c,
0xdc, 0xc0, 0xda, 0x9b, 0x1c, 0xfa, 0xb5, 0xa0, 0x05, 0xf3, 0x04, 0x33, 0x78, 0xa6, 0x71, 0x56,
0x39, 0xe4, 0x92, 0x97, 0x63, 0xee, 0xf9, 0x16, 0xf9, 0x14, 0x39, 0xe4, 0x8b, 0x24, 0xdf, 0x21,
0xa7, 0xbc, 0xee, 0x9e, 0x81, 0x01, 0xb1, 0x1b, 0x9f, 0x98, 0xfe, 0xd5, 0xaf, 0xab, 0xaa, 0xab,
0xba, 0xaa, 0x0b, 0x38, 0x0e, 0x83, 0xa5, 0xe0, 0x61, 0xb8, 0x18, 0x5d, 0xea, 0xaf, 0x8b, 0x45,
0x18, 0x88, 0x00, 0x15, 0x57, 0x78, 0xbd, 0x18, 0x2e, 0x46, 0x1a, 0xb5, 0xfe, 0xbb, 0x07, 0xa8,
0xcf, 0xfd, 0xf1, 0x35, 0xbb, 0x9f, 0x73, 0x5f, 0x10, 0xfe, 0xe3, 0x92, 0x47, 0x02, 0x21, 0xc8,
0x8d, 0x79, 0x24, 0xcc, 0xcc, 0x59, 0xe6, 0xbc, 0x4c, 0xd4, 0x37, 0x32, 0x20, 0xcb, 0xe6, 0xc2,
0xdc, 0x3b, 0xcb, 0x9c, 0x67, 0x89, 0xfc, 0x44, 0x9f, 0x42, 0x79, 0xa1, 0xf7, 0xd1, 0x29, 0x8b,
0xa6, 0x66, 0x56, 0xb1, 0x4b, 0x31, 0x76, 0xc5, 0xa2, 0x29, 0x3a, 0x07, 0xe3, 0xd6, 0xf3, 0xd9,
0x8c, 0x8e, 0x66, 0xe2, 0x27, 0x3a, 0xe6, 0x33, 0xc1, 0xcc, 0xdc, 0x59, 0xe6, 0x3c, 0x4f, 0xaa,
0x0a, 0x6f, 0xcd, 0xc4, 0x4f, 0x6d, 0x89, 0xa2, 0x2f, 0xa0, 0x96, 0x28, 0x0b, 0xb5, 0x17, 0x66,
0xfe, 0x2c, 0x73, 0x5e, 0x24, 0xd5, 0xc5, 0xa6, 0x6f, 0x5f, 0x40, 0x4d, 0x78, 0x73, 0x1e, 0x2c,
0x05, 0x8d, 0xf8, 0x28, 0xf0, 0xc7, 0x91, 0xb9, 0xaf, 0x35, 0xc6, 0x70, 0x5f, 0xa3, 0xc8, 0x82,
0xca, 0x2d, 0xe7, 0x74, 0xe6, 0xcd, 0x3d, 0x41, 0x23, 0x26, 0xcc, 0x82, 0x72, 0xbd, 0x74, 0xcb,
0x79, 0x57, 0x62, 0x7d, 0x26, 0xa4, 0x7f, 0xc1, 0x52, 0x4c, 0x02, 0xcf, 0x9f, 0xd0, 0xd1, 0x94,
0xf9, 0xd4, 0x1b, 0x9b, 0x07, 0x67, 0x99, 0xf3, 0x1c, 0xa9, 0x26, 0x78, 0x6b, 0xca, 0x7c, 0x7b,
0x8c, 0x4e, 0x01, 0xd4, 0x19, 0x94, 0x3a, 0xb3, 0xa8, 0x2c, 0x16, 0x25, 0xa2, 0x74, 0xa1, 0x06,
0x94, 0x54, 0x80, 0xe9, 0xd4, 0xf3, 0x45, 0x64, 0xc2, 0x59, 0xf6, 0xbc, 0xd4, 0x30, 0x2e, 0x66,
0xbe, 0x8c, 0x35, 0x91, 0x92, 0x2b, 0xcf, 0x17, 0x24, 0x4d, 0xb2, 0x7e, 0x03, 0x87, 0x83, 0x90,
0x8d, 0xee, 0xb6, 0x82, 0xbf, 0x1d, 0xd6, 0xcc, 0x83, 0xb0, 0x5a, 0x7f, 0x86, 0x4a, 0xbc, 0xa9,
0x2f, 0x98, 0x58, 0x46, 0xe8, 0x97, 0x90, 0x8f, 0x04, 0x13, 0x5c, 0x91, 0xab, 0x8d, 0x27, 0x17,
0xab, 0x6c, 0x5f, 0xa4, 0x88, 0x9c, 0x68, 0x16, 0xaa, 0xc3, 0xc1, 0x22, 0xe4, 0xde, 0x9c, 0x4d,
0xb8, 0x4a, 0x68, 0x99, 0xac, 0xd6, 0xc8, 0x82, 0xbc, 0xda, 0xac, 0xd2, 0x59, 0x6a, 0x94, 0xd3,
0x67, 0x20, 0x5a, 0x64, 0xfd, 0x16, 0x6a, 0x6a, 0xdd, 0xe1, 0xfc, 0x43, 0x57, 0xe6, 0x09, 0x14,
0xd8, 0x5c, 0xc7, 0x5e, 0x5f, 0x9b, 0x7d, 0x36, 0x97, 0x61, 0xb7, 0xc6, 0x60, 0xac, 0xf7, 0x47,
0x8b, 0xc0, 0x8f, 0xb8, 0x4c, 0x85, 0x54, 0x2e, 0x33, 0x21, 0xd3, 0x36, 0x97, 0xbb, 0x32, 0x6a,
0x57, 0x35, 0xc6, 0x3b, 0x9c, 0xf7, 0x22, 0x26, 0xd0, 0x73, 0x7d, 0x03, 0xe8, 0x2c, 0x18, 0xdd,
0xc9, 0x3b, 0xc5, 0xee, 0x63, 0xf5, 0x15, 0x09, 0x77, 0x83, 0xd1, 0x5d, 0x5b, 0x82, 0xd6, 0x1f,
0xf4, 0xdd, 0x1e, 0x04, 0xda, 0xf7, 0x9f, 0x1d, 0xde, 0x75, 0x08, 0xf6, 0xde, 0x1f, 0x02, 0x0a,
0x87, 0x1b, 0xca, 0xe3, 0x53, 0xa4, 0x23, 0x9b, 0xd9, 0x8a, 0xec, 0x97, 0x50, 0xb8, 0x65, 0xde,
0x6c, 0x19, 0x26, 0x8a, 0x51, 0x2a, 0x4d, 0x1d, 0x2d, 0x21, 0x09, 0xc5, 0xfa, 0x57, 0x01, 0x0a,
0x31, 0x88, 0x1a, 0x90, 0x1b, 0x05, 0xe3, 0x24, 0xbb, 0x1f, 0x3f, 0xdc, 0x96, 0xfc, 0xb6, 0x82,
0x31, 0x27, 0x8a, 0x8b, 0x7e, 0x07, 0x55, 0x79, 0xa3, 0x7d, 0x3e, 0xa3, 0xcb, 0xc5, 0x98, 0xad,
0x12, 0x6a, 0xa6, 0x76, 0xb7, 0x34, 0x61, 0xa8, 0xe4, 0xa4, 0x32, 0x4a, 0x2f, 0xd1, 0x09, 0x14,
0xa7, 0x62, 0x36, 0xd2, 0x99, 0xc8, 0xa9, 0xa2, 0x38, 0x90, 0x80, 0xca, 0x81, 0x05, 0x95, 0xc0,
0xf7, 0x02, 0x9f, 0x46, 0x53, 0x46, 0x1b, 0x5f, 0x7f, 0xa3, 0x8a, 0xb5, 0x4c, 0x4a, 0x0a, 0xec,
0x4f, 0x59, 0xe3, 0xeb, 0x6f, 0xd0, 0x27, 0x50, 0x52, 0x25, 0xc3, 0xdf, 0x2d, 0xbc, 0xf0, 0x5e,
0x55, 0x69, 0x85, 0xa8, 0x2a, 0xc2, 0x0a, 0x41, 0x47, 0x90, 0xbf, 0x9d, 0xb1, 0x49, 0xa4, 0x2a,
0xb3, 0x42, 0xf4, 0x02, 0x7d, 0x05, 0x47, 0x71, 0x0c, 0x68, 0x14, 0x2c, 0xc3, 0x11, 0xa7, 0x9e,
0x3f, 0xe6, 0xef, 0x54, 0x5d, 0x56, 0x08, 0x8a, 0x65, 0x7d, 0x25, 0xb2, 0xa5, 0xc4, 0xfa, 0x7b,
0x1e, 0x4a, 0xa9, 0x00, 0xa0, 0x32, 0x1c, 0x10, 0xdc, 0xc7, 0xe4, 0x0d, 0x6e, 0x1b, 0x1f, 0xa1,
0x73, 0xf8, 0xdc, 0x76, 0x5a, 0x2e, 0x21, 0xb8, 0x35, 0xa0, 0x2e, 0xa1, 0x43, 0xe7, 0xb5, 0xe3,
0x7e, 0xef, 0xd0, 0xeb, 0xe6, 0xdb, 0x1e, 0x76, 0x06, 0xb4, 0x8d, 0x07, 0x4d, 0xbb, 0xdb, 0x37,
0x32, 0xe8, 0x19, 0x98, 0x6b, 0x66, 0x22, 0x6e, 0xf6, 0xdc, 0xa1, 0x33, 0x30, 0xf6, 0xd0, 0x27,
0x70, 0xd2, 0xb1, 0x9d, 0x66, 0x97, 0xae, 0x39, 0xad, 0xee, 0xe0, 0x0d, 0xc5, 0x3f, 0x5c, 0xdb,
0xe4, 0xad, 0x91, 0xdd, 0x45, 0xb8, 0x1a, 0x74, 0x5b, 0x89, 0x86, 0x1c, 0x7a, 0x0a, 0x8f, 0x35,
0x41, 0x6f, 0xa1, 0x03, 0xd7, 0xa5, 0x7d, 0xd7, 0x75, 0x8c, 0x3c, 0x7a, 0x04, 0x15, 0xdb, 0x79,
0xd3, 0xec, 0xda, 0x6d, 0x4a, 0x70, 0xb3, 0xdb, 0x33, 0xf6, 0xd1, 0x21, 0xd4, 0xb6, 0x79, 0x05,
0xa9, 0x22, 0xe1, 0xb9, 0x8e, 0xed, 0x3a, 0xf4, 0x0d, 0x26, 0x7d, 0xdb, 0x75, 0x8c, 0x03, 0x74,
0x0c, 0x68, 0x53, 0x74, 0xd5, 0x6b, 0xb6, 0x8c, 0x22, 0x7a, 0x0c, 0x8f, 0x36, 0xf1, 0xd7, 0xf8,
0xad, 0x01, 0xc8, 0x84, 0x23, 0xed, 0x18, 0x7d, 0x89, 0xbb, 0xee, 0xf7, 0xb4, 0x67, 0x3b, 0x76,
0x6f, 0xd8, 0x33, 0x4a, 0xe8, 0x08, 0x8c, 0x0e, 0xc6, 0xd4, 0x76, 0xfa, 0xc3, 0x4e, 0xc7, 0x6e,
0xd9, 0xd8, 0x19, 0x18, 0x65, 0x6d, 0x79, 0xd7, 0xc1, 0x2b, 0x72, 0x43, 0xeb, 0xaa, 0xe9, 0x38,
0xb8, 0x4b, 0xdb, 0x76, 0xbf, 0xf9, 0xb2, 0x8b, 0xdb, 0x46, 0x15, 0x9d, 0xc2, 0xd3, 0x01, 0xee,
0x5d, 0xbb, 0xa4, 0x49, 0xde, 0xd2, 0x44, 0xde, 0x69, 0xda, 0xdd, 0x21, 0xc1, 0x46, 0x0d, 0x7d,
0x0a, 0xa7, 0x04, 0x7f, 0x37, 0xb4, 0x09, 0x6e, 0x53, 0xc7, 0x6d, 0x63, 0xda, 0xc1, 0xcd, 0xc1,
0x90, 0x60, 0xda, 0xb3, 0xfb, 0x7d, 0xdb, 0xf9, 0xd6, 0x30, 0xd0, 0xe7, 0x70, 0xb6, 0xa2, 0xac,
0x14, 0x6c, 0xb1, 0x1e, 0xc9, 0xf3, 0x25, 0x29, 0x75, 0xf0, 0x0f, 0x03, 0x7a, 0x8d, 0x31, 0x31,
0x10, 0xaa, 0xc3, 0xf1, 0xda, 0xbc, 0x36, 0x10, 0xdb, 0x3e, 0x94, 0xb2, 0x6b, 0x4c, 0x7a, 0x4d,
0x47, 0x26, 0x78, 0x43, 0x76, 0x24, 0xdd, 0x5e, 0xcb, 0xb6, 0xdd, 0x7e, 0x8c, 0x8e, 0xa0, 0x96,
0x58, 0x4b, 0xc0, 0x7f, 0x17, 0xd0, 0x13, 0x40, 0x43, 0x87, 0xe0, 0x66, 0x5b, 0x1e, 0x7e, 0x25,
0xf8, 0x4f, 0xe1, 0x55, 0xee, 0x60, 0xcf, 0xc8, 0x5a, 0xff, 0xc8, 0x42, 0x65, 0xa3, 0xd6, 0xd0,
0x33, 0x28, 0x46, 0xde, 0xc4, 0x67, 0x42, 0x76, 0x03, 0xdd, 0x28, 0xd6, 0x80, 0x7a, 0x6c, 0xa6,
0xcc, 0xf3, 0x75, 0x87, 0xd2, 0x1d, 0xba, 0xa8, 0x10, 0xd5, 0x9f, 0x9e, 0x40, 0x21, 0x79, 0xac,
0xb2, 0xaa, 0x2e, 0xf7, 0x47, 0xfa, 0x91, 0x7a, 0x06, 0x45, 0xd9, 0x02, 0x23, 0xc1, 0xe6, 0x0b,
0x55, 0xb2, 0x15, 0xb2, 0x06, 0xd0, 0x67, 0x50, 0x99, 0xf3, 0x28, 0x62, 0x13, 0x4e, 0x75, 0xd9,
0x81, 0x62, 0x94, 0x63, 0xb0, 0xa3, 0xaa, 0xef, 0x33, 0x48, 0xda, 0x40, 0x4c, 0xca, 0x6b, 0x52,
0x0c, 0x6a, 0xd2, 0x76, 0x07, 0x16, 0x2c, 0xae, 0xee, 0x74, 0x07, 0x16, 0x0c, 0xbd, 0x80, 0x47,
0xba, 0x85, 0x78, 0xbe, 0x37, 0x5f, 0xce, 0x75, 0x2b, 0x29, 0x28, 0x97, 0x6b, 0xaa, 0x95, 0x68,
0x5c, 0x75, 0x94, 0xa7, 0x70, 0x70, 0xc3, 0x22, 0x2e, 0x9b, 0x7f, 0x5c, 0xea, 0x05, 0xb9, 0xee,
0x70, 0x2e, 0x45, 0xf2, 0x49, 0x08, 0x65, 0x13, 0x2b, 0x6a, 0xd1, 0x2d, 0xe7, 0x44, 0xc6, 0x71,
0x65, 0x81, 0xbd, 0x5b, 0x5b, 0x28, 0xa5, 0x2c, 0x68, 0x5c, 0x59, 0x78, 0x01, 0x8f, 0xf8, 0x3b,
0x11, 0x32, 0x1a, 0x2c, 0xd8, 0x8f, 0x4b, 0x4e, 0xc7, 0x4c, 0x30, 0xb3, 0xac, 0x82, 0x5b, 0x53,
0x02, 0x57, 0xe1, 0x6d, 0x26, 0x98, 0xf5, 0x0c, 0xea, 0x84, 0x47, 0x5c, 0xf4, 0xbc, 0x28, 0xf2,
0x02, 0xbf, 0x15, 0xf8, 0x22, 0x0c, 0x66, 0xf1, 0x1b, 0x62, 0x9d, 0xc2, 0xc9, 0x4e, 0xa9, 0x7e,
0x04, 0xe4, 0xe6, 0xef, 0x96, 0x3c, 0xbc, 0xdf, 0xbd, 0xf9, 0x1e, 0x4e, 0x76, 0x4a, 0xe3, 0x17,
0xe4, 0x4b, 0xc8, 0xfb, 0xc1, 0x98, 0x47, 0x66, 0x46, 0xcd, 0x10, 0xc7, 0xa9, 0x76, 0xed, 0x04,
0x63, 0x7e, 0xe5, 0x45, 0x22, 0x08, 0xef, 0x89, 0x26, 0x49, 0xf6, 0x82, 0x79, 0x61, 0x64, 0xee,
0x3d, 0x60, 0x5f, 0x33, 0x2f, 0x5c, 0xb1, 0x15, 0xc9, 0xfa, 0x4b, 0x06, 0x4a, 0x29, 0x25, 0xe8,
0x18, 0xf6, 0x17, 0xcb, 0x9b, 0x3b, 0x7e, 0x1f, 0x5f, 0xc1, 0x78, 0x85, 0x9e, 0x43, 0x75, 0xc6,
0x22, 0x41, 0x65, 0xaf, 0xa5, 0x32, 0xa5, 0xf1, 0x03, 0xbb, 0x85, 0xa2, 0x0b, 0x40, 0x81, 0x98,
0xf2, 0x90, 0x46, 0xcb, 0xd1, 0x88, 0x47, 0x11, 0x5d, 0x84, 0xc1, 0x8d, 0xba, 0x93, 0x7b, 0x64,
0x87, 0xe4, 0x55, 0xee, 0x20, 0x67, 0xe4, 0xad, 0x7f, 0x66, 0xa0, 0x94, 0x72, 0x4e, 0xde, 0x5a,
0x79, 0x18, 0x7a, 0x1b, 0x06, 0xf3, 0xa4, 0x16, 0x56, 0x00, 0x32, 0xa1, 0xa0, 0x16, 0x22, 0x88,
0x0b, 0x21, 0x59, 0xee, 0xf0, 0x32, 0xbb, 0xd3, 0xcb, 0x06, 0x1c, 0xcd, 0x3d, 0x9f, 0x2e, 0xb8,
0xcf, 0x66, 0xde, 0x9f, 0x38, 0x4d, 0x66, 0x92, 0x9c, 0x62, 0xef, 0x94, 0x21, 0x0b, 0xca, 0x1b,
0x67, 0xca, 0xab, 0x33, 0x6d, 0x60, 0x2f, 0xfe, 0x96, 0x81, 0x72, 0x7a, 0xba, 0x42, 0x15, 0x28,
0xda, 0x0e, 0xed, 0x74, 0xed, 0x6f, 0xaf, 0x06, 0xc6, 0x47, 0x72, 0xd9, 0x1f, 0xb6, 0x5a, 0x18,
0xb7, 0x71, 0xdb, 0xc8, 0x20, 0x04, 0x55, 0xd9, 0x18, 0x70, 0x9b, 0x0e, 0xec, 0x1e, 0x76, 0x87,
0xf2, 0x4d, 0x39, 0x84, 0x5a, 0x8c, 0x39, 0x2e, 0x25, 0xee, 0x70, 0x80, 0x8d, 0x2c, 0x32, 0xa0,
0x1c, 0x83, 0x98, 0x10, 0x97, 0x18, 0x39, 0xd9, 0x08, 0x63, 0xe4, 0xe1, 0xfb, 0x94, 0x3c, 0x5f,
0xf9, 0xc6, 0x5f, 0x73, 0xb0, 0xaf, 0xa6, 0x91, 0x10, 0x5d, 0x41, 0x29, 0x35, 0xd6, 0xa3, 0xd3,
0xd4, 0xb5, 0x78, 0x38, 0xee, 0xd7, 0xcd, 0xdd, 0xe3, 0xe2, 0x32, 0xfa, 0x2a, 0x83, 0x5e, 0x41,
0x39, 0x3d, 0xa4, 0xa2, 0xf4, 0xf0, 0xb1, 0x63, 0x7a, 0xfd, 0xa0, 0xae, 0xd7, 0x60, 0xe0, 0x48,
0x78, 0x73, 0x39, 0x6c, 0xc4, 0xe3, 0x1f, 0xaa, 0xa7, 0xf8, 0x5b, 0x33, 0x65, 0xfd, 0x64, 0xa7,
0x2c, 0xae, 0x93, 0xae, 0x3e, 0x62, 0x3c, 0x80, 0x3d, 0x38, 0xe2, 0xe6, 0xd4, 0x57, 0xff, 0xf8,
0x7d, 0xe2, 0x58, 0xdb, 0x18, 0x0e, 0x77, 0x54, 0x34, 0xfa, 0x45, 0xda, 0x83, 0xf7, 0xf6, 0x83,
0xfa, 0xf3, 0xff, 0x47, 0x5b, 0x5b, 0xd9, 0x51, 0xfa, 0x1b, 0x56, 0xde, 0xdf, 0x38, 0x36, 0xac,
0x7c, 0xa0, 0x83, 0xbc, 0xfc, 0xd5, 0xef, 0x2f, 0x27, 0x9e, 0x98, 0x2e, 0x6f, 0x2e, 0x46, 0xc1,
0xfc, 0x72, 0xe6, 0x4d, 0xa6, 0xc2, 0xf7, 0xfc, 0x89, 0xcf, 0xc5, 0x1f, 0x83, 0xf0, 0xee, 0x72,
0xe6, 0x8f, 0x2f, 0xd5, 0x40, 0x7b, 0xb9, 0x52, 0x77, 0xb3, 0xaf, 0xfe, 0x0e, 0xfe, 0xfa, 0x7f,
0x01, 0x00, 0x00, 0xff, 0xff, 0x6d, 0xa6, 0xd9, 0x94, 0x3e, 0x0e, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

@ -323,9 +323,13 @@ message ResetMissionControlResponse{}
message QueryMissionControlRequest {}
/// QueryMissionControlResponse contains mission control state per node.
/// QueryMissionControlResponse contains mission control state.
message QueryMissionControlResponse {
/// Node-level mission control state.
repeated NodeHistory nodes = 1;
/// Node pair-level mission control state.
repeated PairHistory pairs = 2;
}
/// NodeHistory contains the mission control state for a particular node.
@ -336,26 +340,31 @@ message NodeHistory {
/// Time stamp of last failure. Set to zero if no failure happened yet.
int64 last_fail_time = 2 [json_name = "last_fail_time"];
/// Estimation of success probability for channels not in the channel array.
float other_chan_success_prob = 3 [json_name = "other_chan_success_prob"];
/**
Estimation of success probability of forwarding towards peers of this node
for which no specific history is available.
**/
float other_success_prob = 3 [json_name = "other_success_prob"];
/// Historical information of particular channels.
repeated ChannelHistory channels = 4 [json_name = "channels"];
reserved 4;
}
/// NodeHistory contains the mission control state for a particular channel.
message ChannelHistory {
/// Short channel id
uint64 channel_id = 1 [json_name = "channel_id"];
/// PairHistory contains the mission control state for a particular node pair.
message PairHistory {
/// The source node pubkey of the pair.
bytes node_from = 1 [json_name="node_from"];
/// The destination node pubkey of the pair.
bytes node_to = 2 [json_name="node_to"];
/// Time stamp of last failure.
int64 last_fail_time = 2 [json_name = "last_fail_time"];
int64 last_fail_time = 3 [json_name = "last_fail_time"];
/// Minimum penalization amount.
int64 min_penalize_amt_sat = 3 [json_name = "min_penalize_amt_sat"];
int64 min_penalize_amt_sat = 4 [json_name = "min_penalize_amt_sat"];
/// Estimation of success probability for this channel.
float success_prob = 4 [json_name = "success_prob"];
/// Estimation of success probability for this pair.
float success_prob = 5 [json_name = "success_prob"];
}
service Router {

@ -57,10 +57,10 @@ type RouterBackend struct {
// MissionControl defines the mission control dependencies of routerrpc.
type MissionControl interface {
// GetEdgeProbability is expected to return the success probability of a payment
// from fromNode along edge.
GetEdgeProbability(fromNode route.Vertex,
edge routing.EdgeLocator, amt lnwire.MilliSatoshi) float64
// GetProbability is expected to return the success probability of a
// payment from fromNode to toNode.
GetProbability(fromNode, toNode route.Vertex,
amt lnwire.MilliSatoshi) float64
// ResetHistory resets the history of MissionControl returning it to a
// state as if no payment attempts have been made.
@ -133,28 +133,50 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
ignoredNodes[ignoreVertex] = struct{}{}
}
ignoredEdges := make(map[routing.EdgeLocator]struct{})
ignoredPairs := make(map[routing.DirectedNodePair]struct{})
// Convert deprecated ignoredEdges to pairs.
for _, ignoredEdge := range in.IgnoredEdges {
locator := routing.EdgeLocator{
ChannelID: ignoredEdge.ChannelId,
pair, err := r.rpcEdgeToPair(ignoredEdge)
if err != nil {
log.Warnf("Ignore channel %v skipped: %v",
ignoredEdge.ChannelId, err)
continue
}
if ignoredEdge.DirectionReverse {
locator.Direction = 1
ignoredPairs[pair] = struct{}{}
}
// Add ignored pairs to set.
for _, ignorePair := range in.IgnoredPairs {
from, err := route.NewVertexFromBytes(ignorePair.From)
if err != nil {
return nil, err
}
ignoredEdges[locator] = struct{}{}
to, err := route.NewVertexFromBytes(ignorePair.To)
if err != nil {
return nil, err
}
pair := routing.NewDirectedNodePair(from, to)
ignoredPairs[pair] = struct{}{}
}
restrictions := &routing.RestrictParams{
FeeLimit: feeLimit,
ProbabilitySource: func(node route.Vertex,
edge routing.EdgeLocator,
ProbabilitySource: func(fromNode, toNode route.Vertex,
amt lnwire.MilliSatoshi) float64 {
if _, ok := ignoredNodes[node]; ok {
if _, ok := ignoredNodes[fromNode]; ok {
return 0
}
if _, ok := ignoredEdges[edge]; ok {
pair := routing.DirectedNodePair{
From: fromNode,
To: toNode,
}
if _, ok := ignoredPairs[pair]; ok {
return 0
}
@ -162,8 +184,8 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
return 1
}
return r.MissionControl.GetEdgeProbability(
node, edge, amt,
return r.MissionControl.GetProbability(
fromNode, toNode, amt,
)
},
}
@ -202,6 +224,26 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
return routeResp, nil
}
// rpcEdgeToPair looks up the provided channel and returns the channel endpoints
// as a directed pair.
func (r *RouterBackend) rpcEdgeToPair(e *lnrpc.EdgeLocator) (
routing.DirectedNodePair, error) {
a, b, err := r.FetchChannelEndpoints(e.ChannelId)
if err != nil {
return routing.DirectedNodePair{}, err
}
var pair routing.DirectedNodePair
if e.DirectionReverse {
pair.From, pair.To = b, a
} else {
pair.From, pair.To = a, b
}
return pair, nil
}
// calculateFeeLimit returns the fee limit in millisatoshis. If a percentage
// based fee limit has been requested, we'll factor in the ratio provided with
// the amount of the payment.

@ -23,6 +23,10 @@ const (
var (
sourceKey = route.Vertex{1, 2, 3}
node1 = route.Vertex{10}
node2 = route.Vertex{11}
)
// TestQueryRoutes asserts that query routes rpc parameters are properly parsed
@ -50,11 +54,6 @@ func testQueryRoutes(t *testing.T, useMissionControl bool) {
t.Fatal(err)
}
ignoredEdge := routing.EdgeLocator{
ChannelID: 555,
Direction: 1,
}
request := &lnrpc.QueryRoutesRequest{
PubKey: destKey,
Amt: 100000,
@ -69,6 +68,10 @@ func testQueryRoutes(t *testing.T, useMissionControl bool) {
ChannelId: 555,
DirectionReverse: true,
}},
IgnoredPairs: []*lnrpc.NodePair{{
From: node1[:],
To: node2[:],
}},
UseMissionControl: useMissionControl,
}
@ -92,24 +95,28 @@ func testQueryRoutes(t *testing.T, useMissionControl bool) {
t.Fatal("unexpected fee limit")
}
if restrictions.ProbabilitySource(route.Vertex{},
ignoredEdge, 0,
if restrictions.ProbabilitySource(route.Vertex{2},
route.Vertex{1}, 0,
) != 0 {
t.Fatal("expecting 0% probability for ignored edge")
}
if restrictions.ProbabilitySource(ignoreNodeVertex,
routing.EdgeLocator{}, 0,
route.Vertex{6}, 0,
) != 0 {
t.Fatal("expecting 0% probability for ignored node")
}
if restrictions.ProbabilitySource(node1, node2, 0) != 0 {
t.Fatal("expecting 0% probability for ignored pair")
}
expectedProb := 1.0
if useMissionControl {
expectedProb = testMissionControlProb
}
if restrictions.ProbabilitySource(route.Vertex{},
routing.EdgeLocator{}, 0,
if restrictions.ProbabilitySource(route.Vertex{4},
route.Vertex{5}, 0,
) != expectedProb {
t.Fatal("expecting 100% probability")
}
@ -128,6 +135,16 @@ func testQueryRoutes(t *testing.T, useMissionControl bool) {
return 1, nil
},
MissionControl: &mockMissionControl{},
FetchChannelEndpoints: func(chanID uint64) (route.Vertex,
route.Vertex, error) {
if chanID != 555 {
t.Fatal("expected endpoints to be fetched for "+
"channel 555, but got %v instead",
chanID)
}
return route.Vertex{1}, route.Vertex{2}, nil
},
}
resp, err := backend.QueryRoutes(context.Background(), request)
@ -142,8 +159,9 @@ func testQueryRoutes(t *testing.T, useMissionControl bool) {
type mockMissionControl struct {
}
func (m *mockMissionControl) GetEdgeProbability(fromNode route.Vertex,
edge routing.EdgeLocator, amt lnwire.MilliSatoshi) float64 {
func (m *mockMissionControl) GetProbability(fromNode, toNode route.Vertex,
amt lnwire.MilliSatoshi) float64 {
return testMissionControlProb
}

@ -451,40 +451,43 @@ func (s *Server) QueryMissionControl(ctx context.Context,
snapshot := s.cfg.RouterBackend.MissionControl.GetHistorySnapshot()
rpcNodes := make([]*NodeHistory, len(snapshot.Nodes))
for i, n := range snapshot.Nodes {
rpcNodes := make([]*NodeHistory, 0, len(snapshot.Nodes))
for _, n := range snapshot.Nodes {
// Copy node struct to prevent loop variable binding bugs.
node := n
channels := make([]*ChannelHistory, len(node.Channels))
for j, channel := range node.Channels {
channels[j] = &ChannelHistory{
ChannelId: channel.ChannelID,
LastFailTime: channel.LastFail.Unix(),
MinPenalizeAmtSat: int64(
channel.MinPenalizeAmt.ToSatoshis(),
),
SuccessProb: float32(channel.SuccessProb),
}
}
var lastFail int64
if node.LastFail != nil {
lastFail = node.LastFail.Unix()
}
rpcNodes[i] = &NodeHistory{
rpcNode := NodeHistory{
Pubkey: node.Node[:],
LastFailTime: lastFail,
OtherChanSuccessProb: float32(
node.OtherChanSuccessProb,
LastFailTime: node.LastFail.Unix(),
OtherSuccessProb: float32(
node.OtherSuccessProb,
),
Channels: channels,
}
rpcNodes = append(rpcNodes, &rpcNode)
}
rpcPairs := make([]*PairHistory, 0, len(snapshot.Pairs))
for _, p := range snapshot.Pairs {
// Prevent binding to loop variable.
pair := p
rpcPair := PairHistory{
NodeFrom: pair.Pair.From[:],
NodeTo: pair.Pair.To[:],
LastFailTime: pair.LastFail.Unix(),
MinPenalizeAmtSat: int64(
pair.MinPenalizeAmt.ToSatoshis(),
),
SuccessProb: float32(pair.SuccessProb),
}
rpcPairs = append(rpcPairs, &rpcPair)
}
response := QueryMissionControlResponse{
Nodes: rpcNodes,
Pairs: rpcPairs,
}
return &response, nil

@ -189,7 +189,7 @@ func (x Invoice_InvoiceState) String() string {
}
func (Invoice_InvoiceState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{92, 0}
return fileDescriptor_77a6da22d6a3feb1, []int{93, 0}
}
type Payment_PaymentStatus int32
@ -220,7 +220,7 @@ func (x Payment_PaymentStatus) String() string {
}
func (Payment_PaymentStatus) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{98, 0}
return fileDescriptor_77a6da22d6a3feb1, []int{99, 0}
}
type GenSeedRequest struct {
@ -4805,8 +4805,8 @@ type QueryRoutesRequest struct {
//A list of nodes to ignore during path finding.
IgnoredNodes [][]byte `protobuf:"bytes,6,rep,name=ignored_nodes,json=ignoredNodes,proto3" json:"ignored_nodes,omitempty"`
//*
//A list of edges to ignore during path finding.
IgnoredEdges []*EdgeLocator `protobuf:"bytes,7,rep,name=ignored_edges,json=ignoredEdges,proto3" json:"ignored_edges,omitempty"`
//Deprecated. A list of edges to ignore during path finding.
IgnoredEdges []*EdgeLocator `protobuf:"bytes,7,rep,name=ignored_edges,json=ignoredEdges,proto3" json:"ignored_edges,omitempty"` // Deprecated: Do not use.
//*
//The source node where the request route should originated from. If empty,
//self is assumed.
@ -4814,10 +4814,13 @@ type QueryRoutesRequest struct {
//*
//If set to true, edge probabilities from mission control will be used to get
//the optimal route.
UseMissionControl bool `protobuf:"varint,9,opt,name=use_mission_control,json=useMissionControl,proto3" json:"use_mission_control,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
UseMissionControl bool `protobuf:"varint,9,opt,name=use_mission_control,json=useMissionControl,proto3" json:"use_mission_control,omitempty"`
//*
//A list of directed node pairs that will be ignored during path finding.
IgnoredPairs []*NodePair `protobuf:"bytes,10,rep,name=ignored_pairs,json=ignoredPairs,proto3" json:"ignored_pairs,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} }
@ -4880,6 +4883,7 @@ func (m *QueryRoutesRequest) GetIgnoredNodes() [][]byte {
return nil
}
// Deprecated: Do not use.
func (m *QueryRoutesRequest) GetIgnoredEdges() []*EdgeLocator {
if m != nil {
return m.IgnoredEdges
@ -4901,6 +4905,62 @@ func (m *QueryRoutesRequest) GetUseMissionControl() bool {
return false
}
func (m *QueryRoutesRequest) GetIgnoredPairs() []*NodePair {
if m != nil {
return m.IgnoredPairs
}
return nil
}
type NodePair struct {
/// The sending node of the pair.
From []byte `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"`
/// The receiving node of the pair.
To []byte `protobuf:"bytes,2,opt,name=to,proto3" json:"to,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *NodePair) Reset() { *m = NodePair{} }
func (m *NodePair) String() string { return proto.CompactTextString(m) }
func (*NodePair) ProtoMessage() {}
func (*NodePair) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{68}
}
func (m *NodePair) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NodePair.Unmarshal(m, b)
}
func (m *NodePair) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_NodePair.Marshal(b, m, deterministic)
}
func (m *NodePair) XXX_Merge(src proto.Message) {
xxx_messageInfo_NodePair.Merge(m, src)
}
func (m *NodePair) XXX_Size() int {
return xxx_messageInfo_NodePair.Size(m)
}
func (m *NodePair) XXX_DiscardUnknown() {
xxx_messageInfo_NodePair.DiscardUnknown(m)
}
var xxx_messageInfo_NodePair proto.InternalMessageInfo
func (m *NodePair) GetFrom() []byte {
if m != nil {
return m.From
}
return nil
}
func (m *NodePair) GetTo() []byte {
if m != nil {
return m.To
}
return nil
}
type EdgeLocator struct {
/// The short channel id of this edge.
ChannelId uint64 `protobuf:"varint,1,opt,name=channel_id,json=channelId,proto3" json:"channel_id,omitempty"`
@ -4919,7 +4979,7 @@ func (m *EdgeLocator) Reset() { *m = EdgeLocator{} }
func (m *EdgeLocator) String() string { return proto.CompactTextString(m) }
func (*EdgeLocator) ProtoMessage() {}
func (*EdgeLocator) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{68}
return fileDescriptor_77a6da22d6a3feb1, []int{69}
}
func (m *EdgeLocator) XXX_Unmarshal(b []byte) error {
@ -4965,7 +5025,7 @@ func (m *QueryRoutesResponse) Reset() { *m = QueryRoutesResponse{} }
func (m *QueryRoutesResponse) String() string { return proto.CompactTextString(m) }
func (*QueryRoutesResponse) ProtoMessage() {}
func (*QueryRoutesResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{69}
return fileDescriptor_77a6da22d6a3feb1, []int{70}
}
func (m *QueryRoutesResponse) XXX_Unmarshal(b []byte) error {
@ -5018,7 +5078,7 @@ func (m *Hop) Reset() { *m = Hop{} }
func (m *Hop) String() string { return proto.CompactTextString(m) }
func (*Hop) ProtoMessage() {}
func (*Hop) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{70}
return fileDescriptor_77a6da22d6a3feb1, []int{71}
}
func (m *Hop) XXX_Unmarshal(b []byte) error {
@ -5140,7 +5200,7 @@ func (m *Route) Reset() { *m = Route{} }
func (m *Route) String() string { return proto.CompactTextString(m) }
func (*Route) ProtoMessage() {}
func (*Route) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{71}
return fileDescriptor_77a6da22d6a3feb1, []int{72}
}
func (m *Route) XXX_Unmarshal(b []byte) error {
@ -5219,7 +5279,7 @@ func (m *NodeInfoRequest) Reset() { *m = NodeInfoRequest{} }
func (m *NodeInfoRequest) String() string { return proto.CompactTextString(m) }
func (*NodeInfoRequest) ProtoMessage() {}
func (*NodeInfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{72}
return fileDescriptor_77a6da22d6a3feb1, []int{73}
}
func (m *NodeInfoRequest) XXX_Unmarshal(b []byte) error {
@ -5276,7 +5336,7 @@ func (m *NodeInfo) Reset() { *m = NodeInfo{} }
func (m *NodeInfo) String() string { return proto.CompactTextString(m) }
func (*NodeInfo) ProtoMessage() {}
func (*NodeInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{73}
return fileDescriptor_77a6da22d6a3feb1, []int{74}
}
func (m *NodeInfo) XXX_Unmarshal(b []byte) error {
@ -5345,7 +5405,7 @@ func (m *LightningNode) Reset() { *m = LightningNode{} }
func (m *LightningNode) String() string { return proto.CompactTextString(m) }
func (*LightningNode) ProtoMessage() {}
func (*LightningNode) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{74}
return fileDescriptor_77a6da22d6a3feb1, []int{75}
}
func (m *LightningNode) XXX_Unmarshal(b []byte) error {
@ -5413,7 +5473,7 @@ func (m *NodeAddress) Reset() { *m = NodeAddress{} }
func (m *NodeAddress) String() string { return proto.CompactTextString(m) }
func (*NodeAddress) ProtoMessage() {}
func (*NodeAddress) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{75}
return fileDescriptor_77a6da22d6a3feb1, []int{76}
}
func (m *NodeAddress) XXX_Unmarshal(b []byte) error {
@ -5465,7 +5525,7 @@ func (m *RoutingPolicy) Reset() { *m = RoutingPolicy{} }
func (m *RoutingPolicy) String() string { return proto.CompactTextString(m) }
func (*RoutingPolicy) ProtoMessage() {}
func (*RoutingPolicy) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{76}
return fileDescriptor_77a6da22d6a3feb1, []int{77}
}
func (m *RoutingPolicy) XXX_Unmarshal(b []byte) error {
@ -5563,7 +5623,7 @@ func (m *ChannelEdge) Reset() { *m = ChannelEdge{} }
func (m *ChannelEdge) String() string { return proto.CompactTextString(m) }
func (*ChannelEdge) ProtoMessage() {}
func (*ChannelEdge) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{77}
return fileDescriptor_77a6da22d6a3feb1, []int{78}
}
func (m *ChannelEdge) XXX_Unmarshal(b []byte) error {
@ -5656,7 +5716,7 @@ func (m *ChannelGraphRequest) Reset() { *m = ChannelGraphRequest{} }
func (m *ChannelGraphRequest) String() string { return proto.CompactTextString(m) }
func (*ChannelGraphRequest) ProtoMessage() {}
func (*ChannelGraphRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{78}
return fileDescriptor_77a6da22d6a3feb1, []int{79}
}
func (m *ChannelGraphRequest) XXX_Unmarshal(b []byte) error {
@ -5699,7 +5759,7 @@ func (m *ChannelGraph) Reset() { *m = ChannelGraph{} }
func (m *ChannelGraph) String() string { return proto.CompactTextString(m) }
func (*ChannelGraph) ProtoMessage() {}
func (*ChannelGraph) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{79}
return fileDescriptor_77a6da22d6a3feb1, []int{80}
}
func (m *ChannelGraph) XXX_Unmarshal(b []byte) error {
@ -5749,7 +5809,7 @@ func (m *ChanInfoRequest) Reset() { *m = ChanInfoRequest{} }
func (m *ChanInfoRequest) String() string { return proto.CompactTextString(m) }
func (*ChanInfoRequest) ProtoMessage() {}
func (*ChanInfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{80}
return fileDescriptor_77a6da22d6a3feb1, []int{81}
}
func (m *ChanInfoRequest) XXX_Unmarshal(b []byte) error {
@ -5787,7 +5847,7 @@ func (m *NetworkInfoRequest) Reset() { *m = NetworkInfoRequest{} }
func (m *NetworkInfoRequest) String() string { return proto.CompactTextString(m) }
func (*NetworkInfoRequest) ProtoMessage() {}
func (*NetworkInfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{81}
return fileDescriptor_77a6da22d6a3feb1, []int{82}
}
func (m *NetworkInfoRequest) XXX_Unmarshal(b []byte) error {
@ -5830,7 +5890,7 @@ func (m *NetworkInfo) Reset() { *m = NetworkInfo{} }
func (m *NetworkInfo) String() string { return proto.CompactTextString(m) }
func (*NetworkInfo) ProtoMessage() {}
func (*NetworkInfo) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{82}
return fileDescriptor_77a6da22d6a3feb1, []int{83}
}
func (m *NetworkInfo) XXX_Unmarshal(b []byte) error {
@ -5938,7 +5998,7 @@ func (m *StopRequest) Reset() { *m = StopRequest{} }
func (m *StopRequest) String() string { return proto.CompactTextString(m) }
func (*StopRequest) ProtoMessage() {}
func (*StopRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{83}
return fileDescriptor_77a6da22d6a3feb1, []int{84}
}
func (m *StopRequest) XXX_Unmarshal(b []byte) error {
@ -5969,7 +6029,7 @@ func (m *StopResponse) Reset() { *m = StopResponse{} }
func (m *StopResponse) String() string { return proto.CompactTextString(m) }
func (*StopResponse) ProtoMessage() {}
func (*StopResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{84}
return fileDescriptor_77a6da22d6a3feb1, []int{85}
}
func (m *StopResponse) XXX_Unmarshal(b []byte) error {
@ -6000,7 +6060,7 @@ func (m *GraphTopologySubscription) Reset() { *m = GraphTopologySubscrip
func (m *GraphTopologySubscription) String() string { return proto.CompactTextString(m) }
func (*GraphTopologySubscription) ProtoMessage() {}
func (*GraphTopologySubscription) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{85}
return fileDescriptor_77a6da22d6a3feb1, []int{86}
}
func (m *GraphTopologySubscription) XXX_Unmarshal(b []byte) error {
@ -6034,7 +6094,7 @@ func (m *GraphTopologyUpdate) Reset() { *m = GraphTopologyUpdate{} }
func (m *GraphTopologyUpdate) String() string { return proto.CompactTextString(m) }
func (*GraphTopologyUpdate) ProtoMessage() {}
func (*GraphTopologyUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{86}
return fileDescriptor_77a6da22d6a3feb1, []int{87}
}
func (m *GraphTopologyUpdate) XXX_Unmarshal(b []byte) error {
@ -6091,7 +6151,7 @@ func (m *NodeUpdate) Reset() { *m = NodeUpdate{} }
func (m *NodeUpdate) String() string { return proto.CompactTextString(m) }
func (*NodeUpdate) ProtoMessage() {}
func (*NodeUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{87}
return fileDescriptor_77a6da22d6a3feb1, []int{88}
}
func (m *NodeUpdate) XXX_Unmarshal(b []byte) error {
@ -6167,7 +6227,7 @@ func (m *ChannelEdgeUpdate) Reset() { *m = ChannelEdgeUpdate{} }
func (m *ChannelEdgeUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelEdgeUpdate) ProtoMessage() {}
func (*ChannelEdgeUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{88}
return fileDescriptor_77a6da22d6a3feb1, []int{89}
}
func (m *ChannelEdgeUpdate) XXX_Unmarshal(b []byte) error {
@ -6248,7 +6308,7 @@ func (m *ClosedChannelUpdate) Reset() { *m = ClosedChannelUpdate{} }
func (m *ClosedChannelUpdate) String() string { return proto.CompactTextString(m) }
func (*ClosedChannelUpdate) ProtoMessage() {}
func (*ClosedChannelUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{89}
return fileDescriptor_77a6da22d6a3feb1, []int{90}
}
func (m *ClosedChannelUpdate) XXX_Unmarshal(b []byte) error {
@ -6319,7 +6379,7 @@ func (m *HopHint) Reset() { *m = HopHint{} }
func (m *HopHint) String() string { return proto.CompactTextString(m) }
func (*HopHint) ProtoMessage() {}
func (*HopHint) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{90}
return fileDescriptor_77a6da22d6a3feb1, []int{91}
}
func (m *HopHint) XXX_Unmarshal(b []byte) error {
@ -6389,7 +6449,7 @@ func (m *RouteHint) Reset() { *m = RouteHint{} }
func (m *RouteHint) String() string { return proto.CompactTextString(m) }
func (*RouteHint) ProtoMessage() {}
func (*RouteHint) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{91}
return fileDescriptor_77a6da22d6a3feb1, []int{92}
}
func (m *RouteHint) XXX_Unmarshal(b []byte) error {
@ -6505,7 +6565,7 @@ func (m *Invoice) Reset() { *m = Invoice{} }
func (m *Invoice) String() string { return proto.CompactTextString(m) }
func (*Invoice) ProtoMessage() {}
func (*Invoice) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{92}
return fileDescriptor_77a6da22d6a3feb1, []int{93}
}
func (m *Invoice) XXX_Unmarshal(b []byte) error {
@ -6698,7 +6758,7 @@ func (m *AddInvoiceResponse) Reset() { *m = AddInvoiceResponse{} }
func (m *AddInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*AddInvoiceResponse) ProtoMessage() {}
func (*AddInvoiceResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{93}
return fileDescriptor_77a6da22d6a3feb1, []int{94}
}
func (m *AddInvoiceResponse) XXX_Unmarshal(b []byte) error {
@ -6756,7 +6816,7 @@ func (m *PaymentHash) Reset() { *m = PaymentHash{} }
func (m *PaymentHash) String() string { return proto.CompactTextString(m) }
func (*PaymentHash) ProtoMessage() {}
func (*PaymentHash) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{94}
return fileDescriptor_77a6da22d6a3feb1, []int{95}
}
func (m *PaymentHash) XXX_Unmarshal(b []byte) error {
@ -6813,7 +6873,7 @@ func (m *ListInvoiceRequest) Reset() { *m = ListInvoiceRequest{} }
func (m *ListInvoiceRequest) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceRequest) ProtoMessage() {}
func (*ListInvoiceRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{95}
return fileDescriptor_77a6da22d6a3feb1, []int{96}
}
func (m *ListInvoiceRequest) XXX_Unmarshal(b []byte) error {
@ -6884,7 +6944,7 @@ func (m *ListInvoiceResponse) Reset() { *m = ListInvoiceResponse{} }
func (m *ListInvoiceResponse) String() string { return proto.CompactTextString(m) }
func (*ListInvoiceResponse) ProtoMessage() {}
func (*ListInvoiceResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{96}
return fileDescriptor_77a6da22d6a3feb1, []int{97}
}
func (m *ListInvoiceResponse) XXX_Unmarshal(b []byte) error {
@ -6948,7 +7008,7 @@ func (m *InvoiceSubscription) Reset() { *m = InvoiceSubscription{} }
func (m *InvoiceSubscription) String() string { return proto.CompactTextString(m) }
func (*InvoiceSubscription) ProtoMessage() {}
func (*InvoiceSubscription) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{97}
return fileDescriptor_77a6da22d6a3feb1, []int{98}
}
func (m *InvoiceSubscription) XXX_Unmarshal(b []byte) error {
@ -7017,7 +7077,7 @@ func (m *Payment) Reset() { *m = Payment{} }
func (m *Payment) String() string { return proto.CompactTextString(m) }
func (*Payment) ProtoMessage() {}
func (*Payment) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{98}
return fileDescriptor_77a6da22d6a3feb1, []int{99}
}
func (m *Payment) XXX_Unmarshal(b []byte) error {
@ -7139,7 +7199,7 @@ func (m *ListPaymentsRequest) Reset() { *m = ListPaymentsRequest{} }
func (m *ListPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsRequest) ProtoMessage() {}
func (*ListPaymentsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{99}
return fileDescriptor_77a6da22d6a3feb1, []int{100}
}
func (m *ListPaymentsRequest) XXX_Unmarshal(b []byte) error {
@ -7179,7 +7239,7 @@ func (m *ListPaymentsResponse) Reset() { *m = ListPaymentsResponse{} }
func (m *ListPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*ListPaymentsResponse) ProtoMessage() {}
func (*ListPaymentsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{100}
return fileDescriptor_77a6da22d6a3feb1, []int{101}
}
func (m *ListPaymentsResponse) XXX_Unmarshal(b []byte) error {
@ -7217,7 +7277,7 @@ func (m *DeleteAllPaymentsRequest) Reset() { *m = DeleteAllPaymentsReque
func (m *DeleteAllPaymentsRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsRequest) ProtoMessage() {}
func (*DeleteAllPaymentsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{101}
return fileDescriptor_77a6da22d6a3feb1, []int{102}
}
func (m *DeleteAllPaymentsRequest) XXX_Unmarshal(b []byte) error {
@ -7248,7 +7308,7 @@ func (m *DeleteAllPaymentsResponse) Reset() { *m = DeleteAllPaymentsResp
func (m *DeleteAllPaymentsResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteAllPaymentsResponse) ProtoMessage() {}
func (*DeleteAllPaymentsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{102}
return fileDescriptor_77a6da22d6a3feb1, []int{103}
}
func (m *DeleteAllPaymentsResponse) XXX_Unmarshal(b []byte) error {
@ -7280,7 +7340,7 @@ func (m *AbandonChannelRequest) Reset() { *m = AbandonChannelRequest{} }
func (m *AbandonChannelRequest) String() string { return proto.CompactTextString(m) }
func (*AbandonChannelRequest) ProtoMessage() {}
func (*AbandonChannelRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{103}
return fileDescriptor_77a6da22d6a3feb1, []int{104}
}
func (m *AbandonChannelRequest) XXX_Unmarshal(b []byte) error {
@ -7318,7 +7378,7 @@ func (m *AbandonChannelResponse) Reset() { *m = AbandonChannelResponse{}
func (m *AbandonChannelResponse) String() string { return proto.CompactTextString(m) }
func (*AbandonChannelResponse) ProtoMessage() {}
func (*AbandonChannelResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{104}
return fileDescriptor_77a6da22d6a3feb1, []int{105}
}
func (m *AbandonChannelResponse) XXX_Unmarshal(b []byte) error {
@ -7351,7 +7411,7 @@ func (m *DebugLevelRequest) Reset() { *m = DebugLevelRequest{} }
func (m *DebugLevelRequest) String() string { return proto.CompactTextString(m) }
func (*DebugLevelRequest) ProtoMessage() {}
func (*DebugLevelRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{105}
return fileDescriptor_77a6da22d6a3feb1, []int{106}
}
func (m *DebugLevelRequest) XXX_Unmarshal(b []byte) error {
@ -7397,7 +7457,7 @@ func (m *DebugLevelResponse) Reset() { *m = DebugLevelResponse{} }
func (m *DebugLevelResponse) String() string { return proto.CompactTextString(m) }
func (*DebugLevelResponse) ProtoMessage() {}
func (*DebugLevelResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{106}
return fileDescriptor_77a6da22d6a3feb1, []int{107}
}
func (m *DebugLevelResponse) XXX_Unmarshal(b []byte) error {
@ -7437,7 +7497,7 @@ func (m *PayReqString) Reset() { *m = PayReqString{} }
func (m *PayReqString) String() string { return proto.CompactTextString(m) }
func (*PayReqString) ProtoMessage() {}
func (*PayReqString) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{107}
return fileDescriptor_77a6da22d6a3feb1, []int{108}
}
func (m *PayReqString) XXX_Unmarshal(b []byte) error {
@ -7485,7 +7545,7 @@ func (m *PayReq) Reset() { *m = PayReq{} }
func (m *PayReq) String() string { return proto.CompactTextString(m) }
func (*PayReq) ProtoMessage() {}
func (*PayReq) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{108}
return fileDescriptor_77a6da22d6a3feb1, []int{109}
}
func (m *PayReq) XXX_Unmarshal(b []byte) error {
@ -7586,7 +7646,7 @@ func (m *FeeReportRequest) Reset() { *m = FeeReportRequest{} }
func (m *FeeReportRequest) String() string { return proto.CompactTextString(m) }
func (*FeeReportRequest) ProtoMessage() {}
func (*FeeReportRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{109}
return fileDescriptor_77a6da22d6a3feb1, []int{110}
}
func (m *FeeReportRequest) XXX_Unmarshal(b []byte) error {
@ -7625,7 +7685,7 @@ func (m *ChannelFeeReport) Reset() { *m = ChannelFeeReport{} }
func (m *ChannelFeeReport) String() string { return proto.CompactTextString(m) }
func (*ChannelFeeReport) ProtoMessage() {}
func (*ChannelFeeReport) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{110}
return fileDescriptor_77a6da22d6a3feb1, []int{111}
}
func (m *ChannelFeeReport) XXX_Unmarshal(b []byte) error {
@ -7692,7 +7752,7 @@ func (m *FeeReportResponse) Reset() { *m = FeeReportResponse{} }
func (m *FeeReportResponse) String() string { return proto.CompactTextString(m) }
func (*FeeReportResponse) ProtoMessage() {}
func (*FeeReportResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{111}
return fileDescriptor_77a6da22d6a3feb1, []int{112}
}
func (m *FeeReportResponse) XXX_Unmarshal(b []byte) error {
@ -7761,7 +7821,7 @@ func (m *PolicyUpdateRequest) Reset() { *m = PolicyUpdateRequest{} }
func (m *PolicyUpdateRequest) String() string { return proto.CompactTextString(m) }
func (*PolicyUpdateRequest) ProtoMessage() {}
func (*PolicyUpdateRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{112}
return fileDescriptor_77a6da22d6a3feb1, []int{113}
}
func (m *PolicyUpdateRequest) XXX_Unmarshal(b []byte) error {
@ -7858,7 +7918,7 @@ func (m *PolicyUpdateResponse) Reset() { *m = PolicyUpdateResponse{} }
func (m *PolicyUpdateResponse) String() string { return proto.CompactTextString(m) }
func (*PolicyUpdateResponse) ProtoMessage() {}
func (*PolicyUpdateResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{113}
return fileDescriptor_77a6da22d6a3feb1, []int{114}
}
func (m *PolicyUpdateResponse) XXX_Unmarshal(b []byte) error {
@ -7897,7 +7957,7 @@ func (m *ForwardingHistoryRequest) Reset() { *m = ForwardingHistoryReque
func (m *ForwardingHistoryRequest) String() string { return proto.CompactTextString(m) }
func (*ForwardingHistoryRequest) ProtoMessage() {}
func (*ForwardingHistoryRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{114}
return fileDescriptor_77a6da22d6a3feb1, []int{115}
}
func (m *ForwardingHistoryRequest) XXX_Unmarshal(b []byte) error {
@ -7970,7 +8030,7 @@ func (m *ForwardingEvent) Reset() { *m = ForwardingEvent{} }
func (m *ForwardingEvent) String() string { return proto.CompactTextString(m) }
func (*ForwardingEvent) ProtoMessage() {}
func (*ForwardingEvent) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{115}
return fileDescriptor_77a6da22d6a3feb1, []int{116}
}
func (m *ForwardingEvent) XXX_Unmarshal(b []byte) error {
@ -8054,7 +8114,7 @@ func (m *ForwardingHistoryResponse) Reset() { *m = ForwardingHistoryResp
func (m *ForwardingHistoryResponse) String() string { return proto.CompactTextString(m) }
func (*ForwardingHistoryResponse) ProtoMessage() {}
func (*ForwardingHistoryResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{116}
return fileDescriptor_77a6da22d6a3feb1, []int{117}
}
func (m *ForwardingHistoryResponse) XXX_Unmarshal(b []byte) error {
@ -8101,7 +8161,7 @@ func (m *ExportChannelBackupRequest) Reset() { *m = ExportChannelBackupR
func (m *ExportChannelBackupRequest) String() string { return proto.CompactTextString(m) }
func (*ExportChannelBackupRequest) ProtoMessage() {}
func (*ExportChannelBackupRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{117}
return fileDescriptor_77a6da22d6a3feb1, []int{118}
}
func (m *ExportChannelBackupRequest) XXX_Unmarshal(b []byte) error {
@ -8147,7 +8207,7 @@ func (m *ChannelBackup) Reset() { *m = ChannelBackup{} }
func (m *ChannelBackup) String() string { return proto.CompactTextString(m) }
func (*ChannelBackup) ProtoMessage() {}
func (*ChannelBackup) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{118}
return fileDescriptor_77a6da22d6a3feb1, []int{119}
}
func (m *ChannelBackup) XXX_Unmarshal(b []byte) error {
@ -8200,7 +8260,7 @@ func (m *MultiChanBackup) Reset() { *m = MultiChanBackup{} }
func (m *MultiChanBackup) String() string { return proto.CompactTextString(m) }
func (*MultiChanBackup) ProtoMessage() {}
func (*MultiChanBackup) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{119}
return fileDescriptor_77a6da22d6a3feb1, []int{120}
}
func (m *MultiChanBackup) XXX_Unmarshal(b []byte) error {
@ -8245,7 +8305,7 @@ func (m *ChanBackupExportRequest) Reset() { *m = ChanBackupExportRequest
func (m *ChanBackupExportRequest) String() string { return proto.CompactTextString(m) }
func (*ChanBackupExportRequest) ProtoMessage() {}
func (*ChanBackupExportRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{120}
return fileDescriptor_77a6da22d6a3feb1, []int{121}
}
func (m *ChanBackupExportRequest) XXX_Unmarshal(b []byte) error {
@ -8284,7 +8344,7 @@ func (m *ChanBackupSnapshot) Reset() { *m = ChanBackupSnapshot{} }
func (m *ChanBackupSnapshot) String() string { return proto.CompactTextString(m) }
func (*ChanBackupSnapshot) ProtoMessage() {}
func (*ChanBackupSnapshot) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{121}
return fileDescriptor_77a6da22d6a3feb1, []int{122}
}
func (m *ChanBackupSnapshot) XXX_Unmarshal(b []byte) error {
@ -8332,7 +8392,7 @@ func (m *ChannelBackups) Reset() { *m = ChannelBackups{} }
func (m *ChannelBackups) String() string { return proto.CompactTextString(m) }
func (*ChannelBackups) ProtoMessage() {}
func (*ChannelBackups) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{122}
return fileDescriptor_77a6da22d6a3feb1, []int{123}
}
func (m *ChannelBackups) XXX_Unmarshal(b []byte) error {
@ -8374,7 +8434,7 @@ func (m *RestoreChanBackupRequest) Reset() { *m = RestoreChanBackupReque
func (m *RestoreChanBackupRequest) String() string { return proto.CompactTextString(m) }
func (*RestoreChanBackupRequest) ProtoMessage() {}
func (*RestoreChanBackupRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{123}
return fileDescriptor_77a6da22d6a3feb1, []int{124}
}
func (m *RestoreChanBackupRequest) XXX_Unmarshal(b []byte) error {
@ -8450,7 +8510,7 @@ func (m *RestoreBackupResponse) Reset() { *m = RestoreBackupResponse{} }
func (m *RestoreBackupResponse) String() string { return proto.CompactTextString(m) }
func (*RestoreBackupResponse) ProtoMessage() {}
func (*RestoreBackupResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{124}
return fileDescriptor_77a6da22d6a3feb1, []int{125}
}
func (m *RestoreBackupResponse) XXX_Unmarshal(b []byte) error {
@ -8481,7 +8541,7 @@ func (m *ChannelBackupSubscription) Reset() { *m = ChannelBackupSubscrip
func (m *ChannelBackupSubscription) String() string { return proto.CompactTextString(m) }
func (*ChannelBackupSubscription) ProtoMessage() {}
func (*ChannelBackupSubscription) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{125}
return fileDescriptor_77a6da22d6a3feb1, []int{126}
}
func (m *ChannelBackupSubscription) XXX_Unmarshal(b []byte) error {
@ -8512,7 +8572,7 @@ func (m *VerifyChanBackupResponse) Reset() { *m = VerifyChanBackupRespon
func (m *VerifyChanBackupResponse) String() string { return proto.CompactTextString(m) }
func (*VerifyChanBackupResponse) ProtoMessage() {}
func (*VerifyChanBackupResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{126}
return fileDescriptor_77a6da22d6a3feb1, []int{127}
}
func (m *VerifyChanBackupResponse) XXX_Unmarshal(b []byte) error {
@ -8615,6 +8675,7 @@ func init() {
proto.RegisterType((*ChannelBalanceRequest)(nil), "lnrpc.ChannelBalanceRequest")
proto.RegisterType((*ChannelBalanceResponse)(nil), "lnrpc.ChannelBalanceResponse")
proto.RegisterType((*QueryRoutesRequest)(nil), "lnrpc.QueryRoutesRequest")
proto.RegisterType((*NodePair)(nil), "lnrpc.NodePair")
proto.RegisterType((*EdgeLocator)(nil), "lnrpc.EdgeLocator")
proto.RegisterType((*QueryRoutesResponse)(nil), "lnrpc.QueryRoutesResponse")
proto.RegisterType((*Hop)(nil), "lnrpc.Hop")
@ -8679,505 +8740,508 @@ func init() {
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
var fileDescriptor_77a6da22d6a3feb1 = []byte{
// 7964 bytes of a gzipped FileDescriptorProto
// 8015 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5d, 0x6c, 0x24, 0x49,
0xd2, 0x90, 0xab, 0x7f, 0xec, 0xee, 0xe8, 0x76, 0xbb, 0x9d, 0xfe, 0xeb, 0xe9, 0x9d, 0x9d, 0xf5,
0xd6, 0xcd, 0x37, 0x33, 0xeb, 0xdd, 0xcf, 0x9e, 0xf5, 0xdd, 0xed, 0x37, 0xdf, 0x0e, 0x1f, 0x1f,
0xfe, 0x9b, 0xf1, 0xec, 0x7a, 0x3c, 0xbe, 0xf2, 0xcc, 0x0d, 0xbb, 0x77, 0xa8, 0xaf, 0xdc, 0x9d,
0x6e, 0xd7, 0x4e, 0x77, 0x55, 0x6f, 0x55, 0xb5, 0x3d, 0xde, 0x65, 0x78, 0x40, 0x08, 0x10, 0x12,
0x42, 0x0b, 0x02, 0x01, 0x02, 0x21, 0xdd, 0xf1, 0xc0, 0x89, 0x07, 0xe0, 0x01, 0x04, 0xd2, 0x49,
0x3c, 0xf2, 0x84, 0xd0, 0xe9, 0x1e, 0x91, 0x38, 0x21, 0x90, 0xd0, 0x89, 0x27, 0x90, 0x78, 0x47,
0x19, 0xf9, 0x53, 0x99, 0x55, 0xd5, 0xe3, 0xd9, 0xbb, 0x83, 0x27, 0x77, 0x46, 0x44, 0xe5, 0x6f,
0x44, 0x64, 0x44, 0x64, 0x64, 0x1a, 0xaa, 0xe1, 0xa8, 0xbb, 0x3e, 0x0a, 0x83, 0x38, 0x20, 0xe5,
0x81, 0x1f, 0x8e, 0xba, 0xed, 0xeb, 0xfd, 0x20, 0xe8, 0x0f, 0xe8, 0x86, 0x3b, 0xf2, 0x36, 0x5c,
0xdf, 0x0f, 0x62, 0x37, 0xf6, 0x02, 0x3f, 0xe2, 0x44, 0xf6, 0x4f, 0xa0, 0xf1, 0x90, 0xfa, 0xc7,
0x94, 0xf6, 0x1c, 0xfa, 0xe5, 0x98, 0x46, 0x31, 0x79, 0x1f, 0xe6, 0x5d, 0xfa, 0x15, 0xa5, 0xbd,
0xce, 0xc8, 0x8d, 0xa2, 0xd1, 0x59, 0xe8, 0x46, 0xb4, 0x65, 0xad, 0x5a, 0x77, 0xea, 0x4e, 0x93,
0x23, 0x8e, 0x14, 0x9c, 0xbc, 0x0b, 0xf5, 0x88, 0x91, 0x52, 0x3f, 0x0e, 0x83, 0xd1, 0x65, 0xab,
0x80, 0x74, 0x35, 0x06, 0xdb, 0xe3, 0x20, 0x7b, 0x00, 0x73, 0xaa, 0x85, 0x68, 0x14, 0xf8, 0x11,
0x25, 0x77, 0x61, 0xb1, 0xeb, 0x8d, 0xce, 0x68, 0xd8, 0xc1, 0x8f, 0x87, 0x3e, 0x1d, 0x06, 0xbe,
0xd7, 0x6d, 0x59, 0xab, 0xc5, 0x3b, 0x55, 0x87, 0x70, 0x1c, 0xfb, 0xe2, 0xb1, 0xc0, 0x90, 0xdb,
0x30, 0x47, 0x7d, 0x0e, 0xa7, 0x3d, 0xfc, 0x4a, 0x34, 0xd5, 0x48, 0xc0, 0xec, 0x03, 0xfb, 0xaf,
0x17, 0x60, 0xfe, 0x91, 0xef, 0xc5, 0xcf, 0xdd, 0xc1, 0x80, 0xc6, 0x72, 0x4c, 0xb7, 0x61, 0xee,
0x02, 0x01, 0x38, 0xa6, 0x8b, 0x20, 0xec, 0x89, 0x11, 0x35, 0x38, 0xf8, 0x48, 0x40, 0x27, 0xf6,
0xac, 0x30, 0xb1, 0x67, 0xb9, 0xd3, 0x55, 0x9c, 0x30, 0x5d, 0xb7, 0x61, 0x2e, 0xa4, 0xdd, 0xe0,
0x9c, 0x86, 0x97, 0x9d, 0x0b, 0xcf, 0xef, 0x05, 0x17, 0xad, 0xd2, 0xaa, 0x75, 0xa7, 0xec, 0x34,
0x24, 0xf8, 0x39, 0x42, 0xc9, 0x36, 0xcc, 0x75, 0xcf, 0x5c, 0xdf, 0xa7, 0x83, 0xce, 0x89, 0xdb,
0x7d, 0x31, 0x1e, 0x45, 0xad, 0xf2, 0xaa, 0x75, 0xa7, 0xb6, 0x79, 0x6d, 0x1d, 0x57, 0x75, 0x7d,
0xe7, 0xcc, 0xf5, 0xb7, 0x11, 0x73, 0xec, 0xbb, 0xa3, 0xe8, 0x2c, 0x88, 0x9d, 0x86, 0xf8, 0x82,
0x83, 0x23, 0x7b, 0x11, 0x88, 0x3e, 0x13, 0x7c, 0xee, 0xed, 0x7f, 0x6e, 0xc1, 0xc2, 0x33, 0x7f,
0x10, 0x74, 0x5f, 0xfc, 0x96, 0x53, 0x94, 0x33, 0x86, 0xc2, 0x9b, 0x8e, 0xa1, 0xf8, 0x6d, 0xc7,
0xb0, 0x0c, 0x8b, 0x66, 0x67, 0xc5, 0x28, 0x28, 0x2c, 0xb1, 0xaf, 0xfb, 0x54, 0x76, 0x4b, 0x0e,
0xe3, 0x3d, 0x68, 0x76, 0xc7, 0x61, 0x48, 0xfd, 0xcc, 0x38, 0xe6, 0x04, 0x5c, 0x0d, 0xe4, 0x5d,
0xa8, 0xfb, 0xf4, 0x22, 0x21, 0x13, 0xbc, 0xeb, 0xd3, 0x0b, 0x49, 0x62, 0xb7, 0x60, 0x39, 0xdd,
0x8c, 0xe8, 0xc0, 0x7f, 0xb5, 0xa0, 0xf4, 0x2c, 0x7e, 0x19, 0x90, 0x75, 0x28, 0xc5, 0x97, 0x23,
0x2e, 0x21, 0x8d, 0x4d, 0x22, 0x86, 0xb6, 0xd5, 0xeb, 0x85, 0x34, 0x8a, 0x9e, 0x5e, 0x8e, 0xa8,
0x53, 0x77, 0x79, 0xa1, 0xc3, 0xe8, 0x48, 0x0b, 0x66, 0x44, 0x19, 0x1b, 0xac, 0x3a, 0xb2, 0x48,
0x6e, 0x00, 0xb8, 0xc3, 0x60, 0xec, 0xc7, 0x9d, 0xc8, 0x8d, 0x71, 0xaa, 0x8a, 0x8e, 0x06, 0x21,
0xd7, 0xa1, 0x3a, 0x7a, 0xd1, 0x89, 0xba, 0xa1, 0x37, 0x8a, 0x91, 0x6d, 0xaa, 0x4e, 0x02, 0x20,
0xef, 0x43, 0x25, 0x18, 0xc7, 0xa3, 0xc0, 0xf3, 0x63, 0xc1, 0x2a, 0x73, 0xa2, 0x2f, 0x4f, 0xc6,
0xf1, 0x11, 0x03, 0x3b, 0x8a, 0x80, 0xdc, 0x84, 0xd9, 0x6e, 0xe0, 0x9f, 0x7a, 0xe1, 0x90, 0x2b,
0x83, 0xd6, 0x34, 0xb6, 0x66, 0x02, 0xed, 0x7f, 0x57, 0x80, 0xda, 0xd3, 0xd0, 0xf5, 0x23, 0xb7,
0xcb, 0x00, 0xac, 0xeb, 0xf1, 0xcb, 0xce, 0x99, 0x1b, 0x9d, 0xe1, 0x68, 0xab, 0x8e, 0x2c, 0x92,
0x65, 0x98, 0xe6, 0x1d, 0xc5, 0x31, 0x15, 0x1d, 0x51, 0x22, 0x1f, 0xc0, 0xbc, 0x3f, 0x1e, 0x76,
0xcc, 0xb6, 0x8a, 0xc8, 0x2d, 0x59, 0x04, 0x9b, 0x80, 0x13, 0xb6, 0xd6, 0xbc, 0x09, 0x3e, 0x42,
0x0d, 0x42, 0x6c, 0xa8, 0x8b, 0x12, 0xf5, 0xfa, 0x67, 0x7c, 0x98, 0x65, 0xc7, 0x80, 0xb1, 0x3a,
0x62, 0x6f, 0x48, 0x3b, 0x51, 0xec, 0x0e, 0x47, 0x62, 0x58, 0x1a, 0x04, 0xf1, 0x41, 0xec, 0x0e,
0x3a, 0xa7, 0x94, 0x46, 0xad, 0x19, 0x81, 0x57, 0x10, 0x72, 0x0b, 0x1a, 0x3d, 0x1a, 0xc5, 0x1d,
0xb1, 0x28, 0x34, 0x6a, 0x55, 0x50, 0xf4, 0x53, 0x50, 0x56, 0x4f, 0xe8, 0x5e, 0x74, 0xd8, 0x04,
0xd0, 0x97, 0xad, 0x2a, 0xef, 0x6b, 0x02, 0x61, 0x9c, 0xf3, 0x90, 0xc6, 0xda, 0xec, 0x45, 0x82,
0x43, 0xed, 0x03, 0x20, 0x1a, 0x78, 0x97, 0xc6, 0xae, 0x37, 0x88, 0xc8, 0x47, 0x50, 0x8f, 0x35,
0x62, 0x54, 0x85, 0x35, 0xc5, 0x4e, 0xda, 0x07, 0x8e, 0x41, 0x67, 0x3f, 0x84, 0xca, 0x03, 0x4a,
0x0f, 0xbc, 0xa1, 0x17, 0x93, 0x65, 0x28, 0x9f, 0x7a, 0x2f, 0x29, 0x67, 0xf8, 0xe2, 0xfe, 0x94,
0xc3, 0x8b, 0xa4, 0x0d, 0x33, 0x23, 0x1a, 0x76, 0xa9, 0x5c, 0x9e, 0xfd, 0x29, 0x47, 0x02, 0xb6,
0x67, 0xa0, 0x3c, 0x60, 0x1f, 0xdb, 0xff, 0xab, 0x00, 0xb5, 0x63, 0xea, 0x2b, 0x41, 0x22, 0x50,
0x62, 0x43, 0x16, 0xc2, 0x83, 0xbf, 0xc9, 0x3b, 0x50, 0xc3, 0x69, 0x88, 0xe2, 0xd0, 0xf3, 0xfb,
0x82, 0x7f, 0x81, 0x81, 0x8e, 0x11, 0x42, 0x9a, 0x50, 0x74, 0x87, 0x92, 0x77, 0xd9, 0x4f, 0x26,
0x64, 0x23, 0xf7, 0x72, 0xc8, 0xe4, 0x51, 0xad, 0x6a, 0xdd, 0xa9, 0x09, 0xd8, 0x3e, 0x5b, 0xd6,
0x75, 0x58, 0xd0, 0x49, 0x64, 0xed, 0x65, 0xac, 0x7d, 0x5e, 0xa3, 0x14, 0x8d, 0xdc, 0x86, 0x39,
0x49, 0x1f, 0xf2, 0xce, 0xe2, 0x3a, 0x57, 0x9d, 0x86, 0x00, 0xcb, 0x21, 0xdc, 0x81, 0xe6, 0xa9,
0xe7, 0xbb, 0x83, 0x4e, 0x77, 0x10, 0x9f, 0x77, 0x7a, 0x74, 0x10, 0xbb, 0xb8, 0xe2, 0x65, 0xa7,
0x81, 0xf0, 0x9d, 0x41, 0x7c, 0xbe, 0xcb, 0xa0, 0xe4, 0x03, 0xa8, 0x9e, 0x52, 0xda, 0xc1, 0x99,
0x68, 0x55, 0x0c, 0xe9, 0x91, 0xb3, 0xeb, 0x54, 0x4e, 0xe5, 0x3c, 0xdf, 0x81, 0x66, 0x30, 0x8e,
0xfb, 0x81, 0xe7, 0xf7, 0x3b, 0x4c, 0x5f, 0x75, 0xbc, 0x1e, 0x72, 0x40, 0xc9, 0x69, 0x48, 0x38,
0xd3, 0x1a, 0x8f, 0x7a, 0xe4, 0x6d, 0x00, 0x6c, 0x9b, 0x57, 0x0c, 0xab, 0xd6, 0x9d, 0x59, 0xa7,
0xca, 0x20, 0x58, 0x91, 0xfd, 0x6f, 0x2d, 0xa8, 0xf3, 0x39, 0x17, 0x1b, 0xe3, 0x4d, 0x98, 0x95,
0x43, 0xa3, 0x61, 0x18, 0x84, 0x42, 0xce, 0x4c, 0x20, 0x59, 0x83, 0xa6, 0x04, 0x8c, 0x42, 0xea,
0x0d, 0xdd, 0x3e, 0x15, 0xca, 0x2b, 0x03, 0x27, 0x9b, 0x49, 0x8d, 0x61, 0x30, 0x8e, 0xa9, 0x50,
0xc1, 0x75, 0x31, 0x3a, 0x87, 0xc1, 0x1c, 0x93, 0x84, 0xc9, 0x59, 0xce, 0x9a, 0x19, 0x30, 0xfb,
0x1b, 0x0b, 0x08, 0xeb, 0xfa, 0xd3, 0x80, 0x57, 0x21, 0xa6, 0x3c, 0xbd, 0xdc, 0xd6, 0x1b, 0x2f,
0x77, 0x61, 0xd2, 0x72, 0xdb, 0x50, 0xe6, 0x3d, 0x2f, 0xe5, 0xf4, 0x9c, 0xa3, 0x3e, 0x29, 0x55,
0x8a, 0xcd, 0x92, 0xfd, 0x53, 0x0b, 0xea, 0x3b, 0x7c, 0xff, 0x40, 0x85, 0x47, 0xee, 0x02, 0x39,
0x1d, 0xfb, 0x3d, 0xb6, 0x4e, 0xf1, 0x4b, 0xaf, 0xd7, 0x39, 0xb9, 0x8c, 0x69, 0xc4, 0xfb, 0xb4,
0x3f, 0xe5, 0xe4, 0xe0, 0xc8, 0x07, 0xd0, 0x34, 0xa0, 0x51, 0x1c, 0xf2, 0x9e, 0xed, 0x4f, 0x39,
0x19, 0x0c, 0x9b, 0x28, 0xa6, 0x52, 0xc7, 0x71, 0xc7, 0xf3, 0x7b, 0xf4, 0x25, 0xce, 0xed, 0xac,
0x63, 0xc0, 0xb6, 0x1b, 0x50, 0xd7, 0xbf, 0xb3, 0xbf, 0x80, 0x8a, 0x54, 0xc8, 0xa8, 0x8c, 0x52,
0xfd, 0x72, 0x34, 0x08, 0x69, 0x43, 0xc5, 0xec, 0x85, 0x53, 0xf9, 0x36, 0x6d, 0xdb, 0x7f, 0x16,
0x9a, 0x07, 0x4c, 0x2b, 0xfa, 0x9e, 0xdf, 0x17, 0x3b, 0x12, 0x53, 0xd5, 0xa3, 0xf1, 0xc9, 0x0b,
0x7a, 0x29, 0x78, 0x4b, 0x94, 0x98, 0xbc, 0x9f, 0x05, 0x51, 0x2c, 0xda, 0xc1, 0xdf, 0xf6, 0x7f,
0xb0, 0x80, 0xec, 0x45, 0xb1, 0x37, 0x74, 0x63, 0xfa, 0x80, 0xaa, 0x45, 0x7e, 0x02, 0x75, 0x56,
0xdb, 0xd3, 0x60, 0x8b, 0xeb, 0x7c, 0xae, 0xab, 0xde, 0x17, 0x0b, 0x93, 0xfd, 0x60, 0x5d, 0xa7,
0x66, 0x66, 0xe1, 0xa5, 0x63, 0x54, 0xc0, 0xf4, 0x4a, 0xec, 0x86, 0x7d, 0x1a, 0xe3, 0x86, 0x20,
0xcc, 0x09, 0xe0, 0xa0, 0x9d, 0xc0, 0x3f, 0x6d, 0xff, 0x29, 0xcc, 0x67, 0xea, 0x60, 0xca, 0x26,
0x19, 0x06, 0xfb, 0x49, 0x16, 0xa1, 0x7c, 0xee, 0x0e, 0xc6, 0x54, 0xec, 0x42, 0xbc, 0xf0, 0x71,
0xe1, 0x9e, 0x65, 0x77, 0x61, 0xc1, 0xe8, 0x97, 0x90, 0xb7, 0x16, 0xcc, 0x30, 0xb9, 0x67, 0xfb,
0x2d, 0xea, 0x4c, 0x47, 0x16, 0xc9, 0x26, 0x2c, 0x9e, 0x52, 0x1a, 0xba, 0x31, 0x16, 0x3b, 0x23,
0x1a, 0xe2, 0x9a, 0x88, 0x9a, 0x73, 0x71, 0xf6, 0x7f, 0xb3, 0x60, 0x8e, 0xc9, 0xc4, 0x63, 0xd7,
0xbf, 0x94, 0x73, 0x75, 0x90, 0x3b, 0x57, 0x77, 0xc4, 0x5c, 0xa5, 0xa8, 0xbf, 0xed, 0x44, 0x15,
0xd3, 0x13, 0x45, 0x56, 0xa1, 0x6e, 0x74, 0xb7, 0xcc, 0x37, 0xb8, 0xc8, 0x8d, 0x8f, 0x68, 0xb8,
0x7d, 0x19, 0xd3, 0xdf, 0x7d, 0x2a, 0x6f, 0x41, 0x33, 0xe9, 0xb6, 0x98, 0x47, 0x02, 0x25, 0xc6,
0x98, 0xa2, 0x02, 0xfc, 0x6d, 0xff, 0x23, 0x8b, 0x13, 0xee, 0x04, 0x9e, 0xda, 0xfc, 0x18, 0x21,
0xdb, 0x43, 0x25, 0x21, 0xfb, 0x3d, 0xd1, 0x78, 0xf8, 0xdd, 0x07, 0x4b, 0xae, 0x41, 0x25, 0xa2,
0x7e, 0xaf, 0xe3, 0x0e, 0x06, 0xb8, 0x47, 0x54, 0x9c, 0x19, 0x56, 0xde, 0x1a, 0x0c, 0xec, 0xdb,
0x30, 0xaf, 0xf5, 0xee, 0x35, 0xe3, 0x38, 0x04, 0x72, 0xe0, 0x45, 0xf1, 0x33, 0x3f, 0x1a, 0x69,
0x7b, 0xcb, 0x5b, 0x50, 0x1d, 0x7a, 0x3e, 0xf6, 0x8c, 0x4b, 0x6e, 0xd9, 0xa9, 0x0c, 0x3d, 0x9f,
0xf5, 0x2b, 0x42, 0xa4, 0xfb, 0x52, 0x20, 0x0b, 0x02, 0xe9, 0xbe, 0x44, 0xa4, 0x7d, 0x0f, 0x16,
0x8c, 0xfa, 0x44, 0xd3, 0xef, 0x42, 0x79, 0x1c, 0xbf, 0x0c, 0xe4, 0xce, 0x5f, 0x13, 0x1c, 0xc2,
0x6c, 0x4c, 0x87, 0x63, 0xec, 0xfb, 0x30, 0x7f, 0x48, 0x2f, 0x84, 0x20, 0xcb, 0x8e, 0xdc, 0xba,
0xd2, 0xfe, 0x44, 0xbc, 0xbd, 0x0e, 0x44, 0xff, 0x38, 0x11, 0x00, 0x69, 0x8d, 0x5a, 0x86, 0x35,
0x6a, 0xdf, 0x02, 0x72, 0xec, 0xf5, 0xfd, 0xc7, 0x34, 0x8a, 0xdc, 0xbe, 0x12, 0xfd, 0x26, 0x14,
0x87, 0x51, 0x5f, 0xa8, 0x2a, 0xf6, 0xd3, 0xfe, 0x2e, 0x2c, 0x18, 0x74, 0xa2, 0xe2, 0xeb, 0x50,
0x8d, 0xbc, 0xbe, 0xef, 0xc6, 0xe3, 0x90, 0x8a, 0xaa, 0x13, 0x80, 0xfd, 0x00, 0x16, 0x7f, 0x48,
0x43, 0xef, 0xf4, 0xf2, 0xaa, 0xea, 0xcd, 0x7a, 0x0a, 0xe9, 0x7a, 0xf6, 0x60, 0x29, 0x55, 0x8f,
0x68, 0x9e, 0xb3, 0xaf, 0x58, 0xc9, 0x8a, 0xc3, 0x0b, 0x9a, 0xee, 0x2b, 0xe8, 0xba, 0xcf, 0x7e,
0x06, 0x64, 0x27, 0xf0, 0x7d, 0xda, 0x8d, 0x8f, 0x28, 0x0d, 0x13, 0x47, 0x38, 0xe1, 0xd5, 0xda,
0xe6, 0x8a, 0x98, 0xd9, 0xb4, 0x42, 0x15, 0x4c, 0x4c, 0xa0, 0x34, 0xa2, 0xe1, 0x10, 0x2b, 0xae,
0x38, 0xf8, 0xdb, 0x5e, 0x82, 0x05, 0xa3, 0x5a, 0xe1, 0x3a, 0x7c, 0x08, 0x4b, 0xbb, 0x5e, 0xd4,
0xcd, 0x36, 0xd8, 0x82, 0x99, 0xd1, 0xf8, 0xa4, 0x93, 0x48, 0xa2, 0x2c, 0x32, 0x6b, 0x32, 0xfd,
0x89, 0xa8, 0xec, 0xaf, 0x5a, 0x50, 0xda, 0x7f, 0x7a, 0xb0, 0xc3, 0xf6, 0x0a, 0xcf, 0xef, 0x06,
0x43, 0xb6, 0x97, 0xf2, 0x41, 0xab, 0xf2, 0x44, 0x09, 0xbb, 0x0e, 0x55, 0xdc, 0x82, 0x99, 0x01,
0x2d, 0x7c, 0xd6, 0x04, 0xc0, 0x8c, 0x77, 0xfa, 0x72, 0xe4, 0x85, 0x68, 0x9d, 0x4b, 0x9b, 0xbb,
0x84, 0xdb, 0x4c, 0x16, 0x61, 0xff, 0x62, 0x1a, 0x66, 0xc4, 0xe6, 0x8b, 0xed, 0x75, 0x63, 0xef,
0x9c, 0x8a, 0x9e, 0x88, 0x12, 0x33, 0x6f, 0x42, 0x3a, 0x0c, 0x62, 0xda, 0x31, 0x96, 0xc1, 0x04,
0xa2, 0x73, 0x22, 0xfc, 0x46, 0xee, 0xce, 0x14, 0x39, 0x95, 0x01, 0x64, 0x93, 0x25, 0x6d, 0xaf,
0x12, 0xda, 0x5e, 0xb2, 0xc8, 0x66, 0xa2, 0xeb, 0x8e, 0xdc, 0xae, 0x17, 0x5f, 0x0a, 0x95, 0xa0,
0xca, 0xac, 0xee, 0x41, 0xd0, 0x75, 0x99, 0x47, 0x3a, 0x70, 0xfd, 0x2e, 0x95, 0x8e, 0x8f, 0x01,
0x64, 0x4e, 0x80, 0xe8, 0x92, 0x24, 0xe3, 0x8e, 0x42, 0x0a, 0xca, 0xf6, 0xef, 0x6e, 0x30, 0x1c,
0x7a, 0x31, 0xf3, 0x1d, 0xd0, 0x6e, 0x2c, 0x3a, 0x1a, 0x84, 0xbb, 0x59, 0x58, 0xba, 0xe0, 0xb3,
0x57, 0x95, 0x6e, 0x96, 0x06, 0x64, 0xb5, 0xb0, 0x5d, 0x87, 0xa9, 0xb1, 0x17, 0x17, 0x68, 0x24,
0x16, 0x1d, 0x0d, 0xc2, 0xd6, 0x61, 0xec, 0x47, 0x34, 0x8e, 0x07, 0xb4, 0xa7, 0x3a, 0x54, 0x43,
0xb2, 0x2c, 0x82, 0xdc, 0x85, 0x05, 0xee, 0xce, 0x44, 0x6e, 0x1c, 0x44, 0x67, 0x5e, 0xd4, 0x89,
0x98, 0xe1, 0x5f, 0x47, 0xfa, 0x3c, 0x14, 0xb9, 0x07, 0x2b, 0x29, 0x70, 0x48, 0xbb, 0xd4, 0x3b,
0xa7, 0xbd, 0xd6, 0x2c, 0x7e, 0x35, 0x09, 0x4d, 0x56, 0xa1, 0xc6, 0xbc, 0xb8, 0xf1, 0xa8, 0xe7,
0x32, 0x03, 0xa6, 0x81, 0xeb, 0xa0, 0x83, 0xc8, 0x87, 0x30, 0x3b, 0xa2, 0xdc, 0xfa, 0x39, 0x8b,
0x07, 0xdd, 0xa8, 0x35, 0x67, 0x68, 0x37, 0xc6, 0xb9, 0x8e, 0x49, 0xc1, 0x98, 0xb2, 0x1b, 0xa1,
0xb9, 0xee, 0x5e, 0xb6, 0x9a, 0xc2, 0x64, 0x96, 0x00, 0x94, 0x91, 0xd0, 0x3b, 0x77, 0x63, 0xda,
0x9a, 0xe7, 0x0a, 0x5d, 0x14, 0xd9, 0x77, 0x9e, 0xef, 0xc5, 0x9e, 0x1b, 0x07, 0x61, 0x8b, 0x20,
0x2e, 0x01, 0xb0, 0x49, 0x44, 0xfe, 0x88, 0x62, 0x37, 0x1e, 0x47, 0x9d, 0xd3, 0x81, 0xdb, 0x8f,
0x5a, 0x0b, 0xdc, 0xe6, 0xcc, 0x20, 0xc8, 0x47, 0xb0, 0xcc, 0x39, 0x02, 0x51, 0x21, 0x8d, 0x68,
0x78, 0xce, 0xcd, 0x84, 0x45, 0x9c, 0x91, 0x09, 0x58, 0x36, 0x95, 0x82, 0x45, 0x32, 0x1f, 0x2e,
0xf1, 0xa9, 0x9c, 0x80, 0xb6, 0xff, 0x89, 0xc5, 0xb7, 0x05, 0x21, 0x42, 0x4a, 0xbd, 0xbf, 0x03,
0x35, 0x2e, 0x3c, 0x9d, 0xc0, 0x1f, 0x5c, 0x0a, 0x79, 0x02, 0x0e, 0x7a, 0xe2, 0x0f, 0x2e, 0xc9,
0x77, 0x60, 0xd6, 0xf3, 0x75, 0x12, 0xae, 0x81, 0xea, 0x12, 0x88, 0x44, 0xef, 0x40, 0x6d, 0x34,
0x3e, 0x19, 0x78, 0x5d, 0x4e, 0x52, 0xe4, 0xb5, 0x70, 0x10, 0x12, 0x30, 0xbb, 0x9d, 0xcf, 0x23,
0xa7, 0x28, 0x21, 0x45, 0x4d, 0xc0, 0x18, 0x89, 0xbd, 0x0d, 0x8b, 0x66, 0x07, 0x85, 0xaa, 0x5d,
0x83, 0x8a, 0x90, 0xcc, 0xa8, 0x55, 0xc3, 0xd5, 0x6d, 0x68, 0xf1, 0x1d, 0x9f, 0x0e, 0x1c, 0x85,
0xb7, 0xff, 0x4d, 0x09, 0x16, 0x04, 0x74, 0x67, 0x10, 0x44, 0xf4, 0x78, 0x3c, 0x1c, 0xba, 0x61,
0x8e, 0xc8, 0x5b, 0x57, 0x88, 0x7c, 0xc1, 0x14, 0x79, 0x26, 0x88, 0x67, 0xae, 0xe7, 0x73, 0xa7,
0x83, 0xeb, 0x0b, 0x0d, 0x42, 0xee, 0xc0, 0x5c, 0x77, 0x10, 0x44, 0xdc, 0x08, 0xd7, 0xc3, 0x0b,
0x69, 0x70, 0x56, 0x45, 0x95, 0xf3, 0x54, 0x94, 0xae, 0x62, 0xa6, 0x53, 0x2a, 0xc6, 0x86, 0x3a,
0xab, 0x94, 0x4a, 0x8d, 0x39, 0xc3, 0x0d, 0x73, 0x1d, 0xc6, 0xfa, 0x93, 0x16, 0x68, 0xae, 0x3d,
0xe6, 0xf2, 0xc4, 0xd9, 0x1b, 0x52, 0xd4, 0xc8, 0x1a, 0x75, 0x55, 0x88, 0x73, 0x16, 0x45, 0x1e,
0x30, 0x9f, 0x93, 0xb5, 0x85, 0x66, 0x01, 0xa0, 0x59, 0x70, 0xcb, 0x5c, 0x11, 0x7d, 0xee, 0xd7,
0x59, 0x61, 0x1c, 0x52, 0x34, 0x15, 0xb4, 0x2f, 0xed, 0xbf, 0x61, 0x41, 0x4d, 0xc3, 0x91, 0x25,
0x98, 0xdf, 0x79, 0xf2, 0xe4, 0x68, 0xcf, 0xd9, 0x7a, 0xfa, 0xe8, 0x87, 0x7b, 0x9d, 0x9d, 0x83,
0x27, 0xc7, 0x7b, 0xcd, 0x29, 0x06, 0x3e, 0x78, 0xb2, 0xb3, 0x75, 0xd0, 0x79, 0xf0, 0xc4, 0xd9,
0x91, 0x60, 0x8b, 0x2c, 0x03, 0x71, 0xf6, 0x1e, 0x3f, 0x79, 0xba, 0x67, 0xc0, 0x0b, 0xa4, 0x09,
0xf5, 0x6d, 0x67, 0x6f, 0x6b, 0x67, 0x5f, 0x40, 0x8a, 0x64, 0x11, 0x9a, 0x0f, 0x9e, 0x1d, 0xee,
0x3e, 0x3a, 0x7c, 0xd8, 0xd9, 0xd9, 0x3a, 0xdc, 0xd9, 0x3b, 0xd8, 0xdb, 0x6d, 0x96, 0xc8, 0x2c,
0x54, 0xb7, 0xb6, 0xb7, 0x0e, 0x77, 0x9f, 0x1c, 0xee, 0xed, 0x36, 0xcb, 0xf6, 0x7f, 0xb1, 0x60,
0x09, 0x7b, 0xdd, 0x4b, 0x0b, 0xc8, 0x2a, 0xd4, 0xba, 0x41, 0x30, 0x62, 0xe6, 0x78, 0xb2, 0xe1,
0xe8, 0x20, 0xc6, 0xfc, 0x5c, 0x5c, 0x4f, 0x83, 0xb0, 0x4b, 0x85, 0x7c, 0x00, 0x82, 0x1e, 0x30,
0x08, 0x63, 0x7e, 0xb1, 0xbc, 0x9c, 0x82, 0x8b, 0x47, 0x8d, 0xc3, 0x38, 0xc9, 0x32, 0x4c, 0x9f,
0x84, 0xd4, 0xed, 0x9e, 0x09, 0xc9, 0x10, 0x25, 0xf2, 0x5e, 0xe2, 0x2f, 0x76, 0xd9, 0xec, 0x0f,
0x68, 0x0f, 0x39, 0xa6, 0xe2, 0xcc, 0x09, 0xf8, 0x8e, 0x00, 0x33, 0xfd, 0xe4, 0x9e, 0xb8, 0x7e,
0x2f, 0xf0, 0x69, 0x4f, 0x18, 0xa3, 0x09, 0xc0, 0x3e, 0x82, 0xe5, 0xf4, 0xf8, 0x84, 0x7c, 0x7d,
0xa4, 0xc9, 0x17, 0xb7, 0x0d, 0xdb, 0x93, 0x57, 0x53, 0x93, 0xb5, 0x5f, 0x17, 0xa0, 0xc4, 0x4c,
0x85, 0xc9, 0x66, 0x85, 0x6e, 0xfd, 0x15, 0x33, 0xb1, 0x48, 0x74, 0x41, 0xf9, 0xe6, 0xc1, 0x37,
0x58, 0x0d, 0x92, 0xe0, 0x43, 0xda, 0x3d, 0xc7, 0x11, 0x2b, 0x3c, 0x83, 0x30, 0x01, 0x61, 0xa6,
0x39, 0x7e, 0x2d, 0x04, 0x44, 0x96, 0x25, 0x0e, 0xbf, 0x9c, 0x49, 0x70, 0xf8, 0x5d, 0x0b, 0x66,
0x3c, 0xff, 0x24, 0x18, 0xfb, 0x3d, 0x14, 0x88, 0x8a, 0x23, 0x8b, 0x18, 0xfd, 0x44, 0x41, 0xf5,
0x86, 0x92, 0xfd, 0x13, 0x00, 0xd9, 0x84, 0x6a, 0x74, 0xe9, 0x77, 0x75, 0x9e, 0x5f, 0x14, 0xb3,
0xc4, 0xe6, 0x60, 0xfd, 0xf8, 0xd2, 0xef, 0x22, 0x87, 0x27, 0x64, 0xf6, 0x9f, 0x42, 0x45, 0x82,
0x19, 0x5b, 0x3e, 0x3b, 0xfc, 0xf4, 0xf0, 0xc9, 0xf3, 0xc3, 0xce, 0xf1, 0x67, 0x87, 0x3b, 0xcd,
0x29, 0x32, 0x07, 0xb5, 0xad, 0x1d, 0xe4, 0x74, 0x04, 0x58, 0x8c, 0xe4, 0x68, 0xeb, 0xf8, 0x58,
0x41, 0x0a, 0x36, 0x61, 0xee, 0x75, 0x84, 0xf6, 0x98, 0x8a, 0xee, 0x7d, 0x04, 0xf3, 0x1a, 0x2c,
0xb1, 0xed, 0x47, 0x0c, 0x90, 0xb2, 0xed, 0xd1, 0x90, 0xe3, 0x18, 0xbb, 0x09, 0x8d, 0x87, 0x34,
0x7e, 0xe4, 0x9f, 0x06, 0xb2, 0xa6, 0xff, 0x51, 0x82, 0x39, 0x05, 0x12, 0x15, 0xdd, 0x81, 0x39,
0xaf, 0x47, 0xfd, 0xd8, 0x8b, 0x2f, 0x3b, 0x86, 0x17, 0x9f, 0x06, 0x33, 0x03, 0xd8, 0x1d, 0x78,
0xae, 0x0c, 0x32, 0xf3, 0x02, 0xf3, 0x6a, 0xd9, 0xee, 0x2c, 0x37, 0x5c, 0xc5, 0x57, 0x3c, 0x78,
0x90, 0x8b, 0x63, 0x1a, 0x88, 0xc1, 0xc5, 0x16, 0xa3, 0x3e, 0xe1, 0x86, 0x60, 0x1e, 0x8a, 0x2d,
0x15, 0xaf, 0x89, 0x0d, 0xb9, 0xcc, 0x77, 0x70, 0x05, 0xc8, 0x44, 0x71, 0xa7, 0xb9, 0x7e, 0x4c,
0x47, 0x71, 0xb5, 0x48, 0x70, 0x25, 0x13, 0x09, 0x66, 0xfa, 0xf3, 0xd2, 0xef, 0xd2, 0x5e, 0x27,
0x0e, 0x3a, 0xa8, 0xe7, 0x91, 0x25, 0x2a, 0x4e, 0x1a, 0x4c, 0xae, 0xc3, 0x4c, 0x4c, 0xa3, 0xd8,
0xa7, 0x3c, 0xfc, 0x56, 0xd9, 0x2e, 0xb4, 0x2c, 0x47, 0x82, 0x98, 0xd5, 0x3e, 0x0e, 0xbd, 0xa8,
0x55, 0xc7, 0x18, 0x2f, 0xfe, 0x26, 0xdf, 0x83, 0xa5, 0x13, 0x1a, 0xc5, 0x9d, 0x33, 0xea, 0xf6,
0x68, 0x88, 0xec, 0xc5, 0x83, 0xc9, 0xdc, 0x18, 0xca, 0x47, 0x32, 0xc6, 0x3d, 0xa7, 0x61, 0xe4,
0x05, 0x3e, 0x9a, 0x41, 0x55, 0x47, 0x16, 0x59, 0x7d, 0x6c, 0xf0, 0x6a, 0x93, 0x56, 0x33, 0x38,
0x87, 0x03, 0xcf, 0x47, 0x92, 0x9b, 0x30, 0x8d, 0x03, 0x88, 0x5a, 0x4d, 0xe4, 0x99, 0x7a, 0x22,
0xf3, 0x9e, 0xef, 0x08, 0x1c, 0x5b, 0xe5, 0x6e, 0x30, 0x08, 0x42, 0xb4, 0x85, 0xaa, 0x0e, 0x2f,
0x98, 0xb3, 0xd3, 0x0f, 0xdd, 0xd1, 0x99, 0xb0, 0x87, 0xd2, 0xe0, 0x4f, 0x4a, 0x95, 0x5a, 0xb3,
0x6e, 0xff, 0x11, 0x94, 0xb1, 0x5a, 0xac, 0x0e, 0x27, 0xd3, 0x12, 0xd5, 0x21, 0xb4, 0x05, 0x33,
0x3e, 0x8d, 0x2f, 0x82, 0xf0, 0x85, 0x3c, 0xb1, 0x10, 0x45, 0xfb, 0x2b, 0xf4, 0x9b, 0x54, 0x04,
0xff, 0x19, 0x1a, 0x7d, 0xcc, 0xfb, 0xe5, 0x4b, 0x15, 0x9d, 0xb9, 0xc2, 0x95, 0xab, 0x20, 0xe0,
0xf8, 0xcc, 0x65, 0xba, 0xd6, 0x58, 0x7d, 0xee, 0x1d, 0xd7, 0x10, 0xb6, 0xcf, 0x17, 0xff, 0x26,
0x34, 0xe4, 0xd9, 0x40, 0xd4, 0x19, 0xd0, 0xd3, 0x58, 0xc6, 0xb6, 0xfc, 0xf1, 0x10, 0x5d, 0xe8,
0x03, 0x7a, 0x1a, 0xdb, 0x87, 0x30, 0x2f, 0xf4, 0xdf, 0x93, 0x11, 0x95, 0x4d, 0xff, 0x71, 0x9e,
0x1d, 0x51, 0xdb, 0x5c, 0x30, 0x15, 0x26, 0x3f, 0x0d, 0x31, 0x29, 0x6d, 0x07, 0x88, 0xae, 0x4f,
0x45, 0x85, 0x62, 0x33, 0x97, 0xd1, 0x3b, 0x31, 0x1c, 0x03, 0xc6, 0xe6, 0x27, 0x1a, 0x77, 0xbb,
0xf2, 0x44, 0xa7, 0xe2, 0xc8, 0xa2, 0xfd, 0xcf, 0x2c, 0x58, 0xc0, 0xda, 0xa4, 0x25, 0x24, 0xf6,
0xac, 0x7b, 0xdf, 0xa2, 0x9b, 0xf5, 0xae, 0x1e, 0xd1, 0x5c, 0x84, 0xb2, 0xbe, 0x8b, 0xf1, 0xc2,
0xb7, 0x8f, 0x94, 0x94, 0xd2, 0x91, 0x12, 0xfb, 0xef, 0x5b, 0x30, 0xcf, 0x37, 0x12, 0xb4, 0x83,
0xc5, 0xf0, 0xff, 0x0c, 0xcc, 0x72, 0x8b, 0x40, 0x68, 0x05, 0xd1, 0xd1, 0x44, 0xb5, 0x22, 0x94,
0x13, 0xef, 0x4f, 0x39, 0x26, 0x31, 0xb9, 0x8f, 0x56, 0x99, 0xdf, 0x41, 0x68, 0xce, 0xd9, 0x9f,
0x39, 0xd7, 0xfb, 0x53, 0x8e, 0x46, 0xbe, 0x5d, 0x81, 0x69, 0xee, 0x44, 0xd8, 0x0f, 0x61, 0xd6,
0x68, 0xc8, 0x88, 0xd2, 0xd4, 0x79, 0x94, 0x26, 0x13, 0x0e, 0x2d, 0xe4, 0x84, 0x43, 0xff, 0x55,
0x11, 0x08, 0x63, 0x96, 0xd4, 0x6a, 0x30, 0x2f, 0x26, 0xe8, 0x19, 0x3e, 0x69, 0xdd, 0xd1, 0x41,
0x64, 0x1d, 0x88, 0x56, 0x94, 0x11, 0x6b, 0xbe, 0x65, 0xe6, 0x60, 0x98, 0x9a, 0x15, 0x16, 0x87,
0xb0, 0x0d, 0x84, 0xf7, 0xcd, 0xa7, 0x3d, 0x17, 0xc7, 0x76, 0xc5, 0xd1, 0x38, 0x3a, 0x43, 0x5f,
0x41, 0x78, 0xad, 0xb2, 0x9c, 0x5e, 0xdf, 0xe9, 0x2b, 0xd7, 0x77, 0x26, 0x13, 0x09, 0xd3, 0xfc,
0xa6, 0x8a, 0xe9, 0x37, 0xdd, 0x84, 0xd9, 0x21, 0xb3, 0x93, 0xe3, 0x41, 0xb7, 0x33, 0x64, 0xad,
0x0b, 0x27, 0xd5, 0x00, 0x92, 0x35, 0x68, 0x4a, 0xd7, 0x45, 0x39, 0x67, 0xfc, 0x3c, 0x23, 0x03,
0x67, 0xfa, 0x3f, 0x89, 0x8d, 0xd5, 0xb0, 0xb3, 0x09, 0x80, 0x79, 0x62, 0x11, 0xe3, 0x90, 0xce,
0xd8, 0x17, 0xc7, 0x7f, 0xb4, 0x87, 0xee, 0x69, 0xc5, 0xc9, 0x22, 0xec, 0xbf, 0x6d, 0x41, 0x93,
0xad, 0x99, 0xc1, 0x96, 0x1f, 0x03, 0x4a, 0xc5, 0x1b, 0x72, 0xa5, 0x41, 0x4b, 0xee, 0x41, 0x15,
0xcb, 0xc1, 0x88, 0xfa, 0x82, 0x27, 0x5b, 0x26, 0x4f, 0x26, 0xfa, 0x64, 0x7f, 0xca, 0x49, 0x88,
0x35, 0x8e, 0xfc, 0x4f, 0x16, 0xd4, 0x44, 0x2b, 0xbf, 0x75, 0xec, 0xa5, 0xad, 0x9d, 0xd7, 0x72,
0x4e, 0x4a, 0x8e, 0x67, 0xef, 0xc0, 0xdc, 0xd0, 0x8d, 0xc7, 0x21, 0xdb, 0xcf, 0x8d, 0xb8, 0x4b,
0x1a, 0xcc, 0x36, 0x67, 0x54, 0x9d, 0x51, 0x27, 0xf6, 0x06, 0x1d, 0x89, 0x15, 0x27, 0xa3, 0x79,
0x28, 0xa6, 0x41, 0xa2, 0xd8, 0xed, 0x53, 0xb1, 0xef, 0xf2, 0x82, 0xdd, 0x82, 0x65, 0x31, 0xa0,
0x94, 0x7d, 0x6d, 0xff, 0x8b, 0x59, 0x58, 0xc9, 0xa0, 0x54, 0x1e, 0x87, 0x08, 0x28, 0x0c, 0xbc,
0xe1, 0x49, 0xa0, 0x9c, 0x13, 0x4b, 0x8f, 0x35, 0x18, 0x28, 0xd2, 0x87, 0x25, 0x69, 0x60, 0xb0,
0x39, 0x4d, 0x36, 0xc3, 0x02, 0xee, 0x72, 0x1f, 0x9a, 0x4b, 0x98, 0x6e, 0x50, 0xc2, 0x75, 0x21,
0xce, 0xaf, 0x8f, 0x9c, 0x41, 0x4b, 0x59, 0x32, 0x42, 0x59, 0x6b, 0xd6, 0x0e, 0x6b, 0xeb, 0x83,
0x2b, 0xda, 0x32, 0xcc, 0x71, 0x67, 0x62, 0x6d, 0xe4, 0x12, 0x6e, 0x48, 0x1c, 0x6a, 0xe3, 0x6c,
0x7b, 0xa5, 0x37, 0x1a, 0x1b, 0x3a, 0x1a, 0x66, 0xa3, 0x57, 0x54, 0x4c, 0xbe, 0x80, 0xe5, 0x0b,
0xd7, 0x8b, 0x65, 0xb7, 0x34, 0xdb, 0xa2, 0x8c, 0x4d, 0x6e, 0x5e, 0xd1, 0xe4, 0x73, 0xfe, 0xb1,
0xb1, 0x45, 0x4d, 0xa8, 0xb1, 0xfd, 0x8b, 0x02, 0x34, 0xcc, 0x7a, 0x18, 0x9b, 0x0a, 0xd9, 0x97,
0x3a, 0x50, 0x5a, 0xa3, 0x29, 0x70, 0xd6, 0xbf, 0x2f, 0xe4, 0xf9, 0xf7, 0xba, 0x57, 0x5d, 0xbc,
0x2a, 0x70, 0x57, 0x7a, 0xb3, 0xc0, 0x5d, 0x39, 0x37, 0x70, 0x37, 0x39, 0xbe, 0x33, 0xfd, 0xdb,
0xc6, 0x77, 0x66, 0x5e, 0x1b, 0xdf, 0x69, 0xff, 0x1f, 0x0b, 0x48, 0x96, 0x7b, 0xc9, 0x43, 0x1e,
0xd2, 0xf0, 0xe9, 0x40, 0x28, 0xb1, 0x3f, 0x7c, 0x33, 0x09, 0x90, 0xab, 0x25, 0xbf, 0x66, 0xa2,
0xa8, 0x27, 0x53, 0xe8, 0xe6, 0xd5, 0xac, 0x93, 0x87, 0x4a, 0x05, 0x2f, 0x4b, 0x57, 0x07, 0x2f,
0xcb, 0x57, 0x07, 0x2f, 0xa7, 0xd3, 0xc1, 0xcb, 0xf6, 0x5f, 0xb1, 0x60, 0x21, 0x87, 0xcd, 0x7e,
0x7f, 0x03, 0x67, 0x8c, 0x61, 0x68, 0x9f, 0x82, 0x60, 0x0c, 0x1d, 0xd8, 0xfe, 0x8b, 0x30, 0x6b,
0x88, 0xd6, 0xef, 0xaf, 0xfd, 0xb4, 0x85, 0xc8, 0x39, 0xdb, 0x80, 0xb5, 0xff, 0x67, 0x01, 0x48,
0x56, 0xbc, 0xff, 0xbf, 0xf6, 0x21, 0x3b, 0x4f, 0xc5, 0x9c, 0x79, 0xfa, 0x7f, 0xba, 0xf3, 0x7c,
0x00, 0xf3, 0x22, 0x43, 0x4c, 0x0b, 0x64, 0x71, 0x8e, 0xc9, 0x22, 0x98, 0x8d, 0x6c, 0x46, 0x8e,
0x2b, 0x46, 0x46, 0x8c, 0xb6, 0xfd, 0xa6, 0x02, 0xc8, 0x76, 0x1b, 0x5a, 0x62, 0x86, 0xf6, 0xce,
0xa9, 0x1f, 0x1f, 0x8f, 0x4f, 0x78, 0x8a, 0x94, 0x17, 0xf8, 0xf6, 0xbf, 0x2e, 0x2a, 0x33, 0x1f,
0x91, 0xc2, 0xa0, 0xf8, 0x1e, 0xd4, 0xf5, 0xed, 0x43, 0x2c, 0x47, 0x2a, 0x8e, 0xc9, 0x4c, 0x09,
0x9d, 0x8a, 0xec, 0x42, 0x03, 0x95, 0x64, 0x4f, 0x7d, 0x57, 0xc0, 0xef, 0x5e, 0x13, 0x9f, 0xd9,
0x9f, 0x72, 0x52, 0xdf, 0x90, 0x3f, 0x81, 0x86, 0xe9, 0xfc, 0x09, 0xab, 0x24, 0xcf, 0x1b, 0x60,
0x9f, 0x9b, 0xc4, 0x64, 0x0b, 0x9a, 0x69, 0xef, 0x51, 0x64, 0x4a, 0x4c, 0xa8, 0x20, 0x43, 0x4e,
0xee, 0x89, 0x23, 0xc4, 0x32, 0xc6, 0x4d, 0x6e, 0x9a, 0x9f, 0x69, 0xd3, 0xb4, 0xce, 0xff, 0x68,
0x87, 0x8a, 0x3f, 0x06, 0x48, 0x60, 0xa4, 0x09, 0xf5, 0x27, 0x47, 0x7b, 0x87, 0x9d, 0x9d, 0xfd,
0xad, 0xc3, 0xc3, 0xbd, 0x83, 0xe6, 0x14, 0x21, 0xd0, 0xc0, 0x30, 0xdf, 0xae, 0x82, 0x59, 0x0c,
0x26, 0x02, 0x2b, 0x12, 0x56, 0x20, 0x8b, 0xd0, 0x7c, 0x74, 0x98, 0x82, 0x16, 0xb7, 0xab, 0x4a,
0x3e, 0xec, 0x65, 0x58, 0xe4, 0x19, 0x80, 0xdb, 0x9c, 0x3d, 0xa4, 0x75, 0xf2, 0x8f, 0x2d, 0x58,
0x4a, 0x21, 0x92, 0x54, 0x1a, 0x6e, 0x80, 0x98, 0x56, 0x89, 0x09, 0xc4, 0x63, 0x01, 0x69, 0x6b,
0xa6, 0x34, 0x48, 0x16, 0xc1, 0x78, 0x5e, 0xb3, 0x4d, 0x53, 0x92, 0x94, 0x87, 0xb2, 0x57, 0x78,
0x9e, 0x22, 0x66, 0x34, 0x1a, 0x1d, 0x3f, 0xe5, 0x99, 0x85, 0x3a, 0x22, 0x39, 0x92, 0x35, 0xbb,
0x2c, 0x8b, 0xcc, 0xad, 0x30, 0x8c, 0x1d, 0xb3, 0xbf, 0xb9, 0x38, 0xfb, 0x97, 0x05, 0x20, 0x3f,
0x18, 0xd3, 0xf0, 0x12, 0xf3, 0x65, 0x54, 0xd4, 0x74, 0x25, 0x1d, 0x13, 0x9c, 0x1e, 0x8d, 0x4f,
0x3e, 0xa5, 0x97, 0x32, 0x83, 0xab, 0x90, 0x64, 0x70, 0xe5, 0x65, 0x51, 0x95, 0xae, 0xce, 0xa2,
0x2a, 0x5f, 0x95, 0x45, 0xf5, 0x1d, 0x98, 0xf5, 0xfa, 0x7e, 0xc0, 0x64, 0x9e, 0xd9, 0x09, 0x51,
0x6b, 0x7a, 0xb5, 0xc8, 0x7c, 0x6b, 0x01, 0x3c, 0x64, 0x30, 0xf2, 0x47, 0x09, 0x11, 0xed, 0xf5,
0x31, 0x63, 0x4f, 0xd7, 0x02, 0x7b, 0xbd, 0x3e, 0x3d, 0x08, 0xba, 0x6e, 0x1c, 0x84, 0xea, 0x43,
0x06, 0x8b, 0xc8, 0x4d, 0x68, 0x44, 0xc1, 0x98, 0x59, 0x4d, 0x72, 0x9c, 0x3c, 0x8a, 0x54, 0xe7,
0xd0, 0x23, 0x3e, 0xda, 0x75, 0x58, 0x18, 0x47, 0xb4, 0x33, 0xf4, 0xa2, 0x88, 0xed, 0x8c, 0xdd,
0xc0, 0x8f, 0xc3, 0x60, 0x20, 0x62, 0x49, 0xf3, 0xe3, 0x88, 0x3e, 0xe6, 0x98, 0x1d, 0x8e, 0x10,
0x79, 0x46, 0x9f, 0x41, 0x4d, 0x6b, 0x18, 0x93, 0xbc, 0x84, 0x1d, 0x23, 0x9c, 0xd2, 0x12, 0x77,
0x1b, 0x7c, 0x3a, 0x78, 0xd4, 0x23, 0xef, 0xc3, 0x7c, 0xcf, 0x0b, 0x29, 0xe6, 0xeb, 0x75, 0x42,
0x7a, 0x4e, 0xc3, 0x48, 0xba, 0xef, 0x4d, 0x85, 0x70, 0x38, 0xdc, 0xbe, 0x0f, 0x0b, 0xc6, 0x6a,
0x29, 0x66, 0x9e, 0xc6, 0x44, 0x27, 0x19, 0x41, 0x34, 0x93, 0xa0, 0x04, 0xce, 0xfe, 0x6b, 0x05,
0x28, 0xee, 0x07, 0x23, 0xfd, 0x9c, 0xc4, 0x32, 0xcf, 0x49, 0x84, 0x1d, 0xd6, 0x51, 0x66, 0x96,
0xd8, 0x2c, 0x0d, 0x20, 0x59, 0x83, 0x86, 0x3b, 0x8c, 0x3b, 0x71, 0xc0, 0xec, 0xce, 0x0b, 0x37,
0xec, 0x71, 0x0e, 0xc7, 0xd0, 0x59, 0x0a, 0x43, 0x16, 0xa1, 0xa8, 0xcc, 0x07, 0x24, 0x60, 0x45,
0xe6, 0xf4, 0xe0, 0x09, 0xf1, 0xa5, 0x08, 0xff, 0x89, 0x12, 0x13, 0x20, 0xf3, 0x7b, 0xee, 0x71,
0xf2, 0x4d, 0x20, 0x0f, 0xc5, 0x6c, 0x42, 0xc6, 0x53, 0xc3, 0xc4, 0xc4, 0x52, 0x65, 0x3d, 0xb0,
0x5d, 0x31, 0xcf, 0xcb, 0x7f, 0x63, 0x41, 0x19, 0xe7, 0x86, 0x6d, 0x68, 0x5c, 0xe2, 0xd5, 0x51,
0x09, 0xce, 0xc9, 0xac, 0x93, 0x06, 0x13, 0xdb, 0xc8, 0x0c, 0x2d, 0xa8, 0x01, 0xe9, 0xd9, 0xa1,
0xab, 0x50, 0xe5, 0x25, 0x95, 0xe5, 0x88, 0x24, 0x09, 0x90, 0xdc, 0x80, 0xd2, 0x59, 0x30, 0x92,
0x36, 0x3f, 0xc8, 0x73, 0xce, 0x60, 0xe4, 0x20, 0x3c, 0xe9, 0x0f, 0xab, 0x8f, 0x0f, 0x8b, 0xdb,
0x55, 0x69, 0x30, 0xb3, 0x65, 0x55, 0xb5, 0xfa, 0x34, 0xa5, 0xa0, 0xf6, 0x33, 0x98, 0x63, 0xb2,
0xa2, 0x85, 0x8e, 0x27, 0x4b, 0xf7, 0x7b, 0x6c, 0xb3, 0xe8, 0x0e, 0xc6, 0x3d, 0xaa, 0x7b, 0x5e,
0x18, 0x1a, 0x14, 0x70, 0x69, 0x73, 0xd8, 0xff, 0xd2, 0x82, 0x8a, 0xac, 0x97, 0xdc, 0x81, 0x12,
0x93, 0xd1, 0x94, 0xa3, 0xad, 0x52, 0x21, 0x18, 0x9d, 0x83, 0x14, 0xcc, 0x14, 0xc1, 0xe0, 0x9d,
0x5e, 0x3b, 0x0f, 0xdd, 0x25, 0x6e, 0x8b, 0x1a, 0x59, 0xca, 0xda, 0x4f, 0x41, 0xc9, 0xba, 0x76,
0xf2, 0x51, 0x32, 0xe4, 0x5e, 0xee, 0x4d, 0xbd, 0x3e, 0xd5, 0x4e, 0x3c, 0x7e, 0x6e, 0xc1, 0xac,
0xd1, 0x27, 0xb2, 0x0a, 0xb5, 0x81, 0x1b, 0xc5, 0xe2, 0x38, 0x5a, 0xac, 0xbc, 0x0e, 0xd2, 0x79,
0xa8, 0x60, 0x1e, 0x8e, 0xa8, 0x08, 0x7a, 0x51, 0x8f, 0xa0, 0xdf, 0x85, 0x6a, 0x92, 0x1a, 0x6c,
0x76, 0x8a, 0xb5, 0x28, 0x93, 0x42, 0x12, 0xa2, 0x24, 0x46, 0x5b, 0xd6, 0x62, 0xb4, 0xf6, 0x7d,
0xa8, 0x69, 0xf4, 0x7a, 0x8c, 0xd5, 0x32, 0x62, 0xac, 0x2a, 0x63, 0xaa, 0x90, 0x64, 0x4c, 0xd9,
0xdf, 0x14, 0x60, 0x96, 0xb1, 0xb7, 0xe7, 0xf7, 0x8f, 0x82, 0x81, 0xd7, 0xbd, 0x44, 0xb6, 0x92,
0x9c, 0x2c, 0x74, 0xb4, 0x64, 0x73, 0x13, 0xcc, 0x04, 0x4a, 0x46, 0x76, 0x84, 0xf4, 0xab, 0x32,
0x53, 0x0f, 0x4c, 0xb8, 0x4e, 0xdc, 0x48, 0x48, 0x9c, 0xb0, 0x11, 0x0d, 0x20, 0x13, 0x62, 0x06,
0xc0, 0xfc, 0xb7, 0xa1, 0x37, 0x18, 0x78, 0x9c, 0x96, 0x7b, 0x10, 0x79, 0x28, 0xd6, 0x66, 0xcf,
0x8b, 0xdc, 0x93, 0xe4, 0x74, 0x4c, 0x95, 0x31, 0xfc, 0xe4, 0xbe, 0xd4, 0xc2, 0x4f, 0xd3, 0xa8,
0xb2, 0x4c, 0x60, 0x7a, 0x21, 0x67, 0x32, 0x0b, 0x69, 0xff, 0xfb, 0x02, 0xd4, 0x34, 0xb6, 0x10,
0x47, 0xc2, 0xa6, 0x56, 0xd6, 0x20, 0x12, 0x6f, 0xf8, 0xa3, 0x1a, 0x84, 0xdc, 0x34, 0x5b, 0xc4,
0x10, 0x34, 0x0a, 0xbb, 0xc1, 0x3e, 0xd7, 0xa1, 0xca, 0xd8, 0xfe, 0x43, 0x74, 0x7e, 0x45, 0x4e,
0xbe, 0x02, 0x48, 0xec, 0x26, 0x62, 0xcb, 0x09, 0x16, 0x01, 0xaf, 0x3d, 0x44, 0xbe, 0x07, 0x75,
0x51, 0x0d, 0xae, 0x2f, 0x0e, 0x38, 0x11, 0x3c, 0x63, 0xed, 0x1d, 0x83, 0x52, 0x7e, 0xb9, 0x29,
0xbf, 0xac, 0x5c, 0xf5, 0xa5, 0xa4, 0xb4, 0x1f, 0xaa, 0xb3, 0xf9, 0x87, 0xa1, 0x3b, 0x3a, 0x93,
0xca, 0xe4, 0x2e, 0x2c, 0x48, 0x9d, 0x31, 0xf6, 0x5d, 0xdf, 0x0f, 0xc6, 0x7e, 0x97, 0xca, 0xc4,
0xaa, 0x3c, 0x94, 0xdd, 0x53, 0x69, 0xb8, 0x58, 0x11, 0x59, 0x83, 0x32, 0xdf, 0xe1, 0xf9, 0xe6,
0x95, 0xaf, 0x3e, 0x38, 0x09, 0xb9, 0x03, 0x65, 0xbe, 0xd1, 0x17, 0x26, 0x0a, 0x3c, 0x27, 0xb0,
0xd7, 0x60, 0x0e, 0xb3, 0xac, 0x4d, 0xbd, 0x67, 0x6e, 0x7c, 0xd3, 0x5d, 0xcc, 0xc3, 0xb6, 0x17,
0x81, 0x1c, 0x72, 0x79, 0xd2, 0x4f, 0xd8, 0x7e, 0x53, 0x84, 0x9a, 0x06, 0x66, 0x7a, 0x09, 0x8f,
0x45, 0x3a, 0x3d, 0xcf, 0x1d, 0xd2, 0x98, 0x86, 0x42, 0x86, 0x52, 0x50, 0x46, 0xe7, 0x9e, 0xf7,
0x3b, 0xc1, 0x38, 0xee, 0xf4, 0x68, 0x3f, 0xa4, 0x7c, 0x3b, 0x67, 0x7b, 0xa3, 0x01, 0x65, 0x74,
0x8c, 0x8b, 0x35, 0x3a, 0x7e, 0x90, 0x91, 0x82, 0xca, 0xf3, 0x32, 0x3e, 0x47, 0xa5, 0xe4, 0xbc,
0x8c, 0xcf, 0x48, 0x5a, 0xa3, 0x96, 0x73, 0x34, 0xea, 0x47, 0xb0, 0xcc, 0x75, 0xa7, 0xd0, 0x1a,
0x9d, 0x14, 0x63, 0x4d, 0xc0, 0x92, 0x35, 0x68, 0xb2, 0x3e, 0x4b, 0xb1, 0x88, 0xbc, 0xaf, 0xb8,
0x6c, 0x59, 0x4e, 0x06, 0xce, 0x68, 0x31, 0x88, 0xab, 0xd3, 0xf2, 0xa4, 0x85, 0x0c, 0x1c, 0x69,
0xdd, 0x97, 0x26, 0x6d, 0x55, 0xd0, 0xa6, 0xe0, 0xe4, 0x1e, 0xac, 0x0c, 0x69, 0xcf, 0x73, 0xcd,
0x2a, 0x30, 0xa6, 0xc2, 0x73, 0xa1, 0x26, 0xa1, 0x59, 0x2b, 0x6c, 0x16, 0xbe, 0x0a, 0x86, 0x27,
0x1e, 0xdf, 0xd0, 0x78, 0xb8, 0xb9, 0xe4, 0x64, 0xe0, 0xf6, 0x2c, 0xd4, 0x8e, 0xe3, 0x60, 0x24,
0x97, 0xbe, 0x01, 0x75, 0x5e, 0x14, 0x69, 0x74, 0x6f, 0xc1, 0x35, 0xe4, 0xd5, 0xa7, 0xc1, 0x28,
0x18, 0x04, 0xfd, 0x4b, 0xc3, 0x69, 0xfc, 0x8f, 0x16, 0x2c, 0x18, 0xd8, 0xc4, 0x6b, 0xc4, 0x08,
0x97, 0xcc, 0x7f, 0xe2, 0xec, 0x3d, 0xaf, 0x6d, 0x07, 0x9c, 0x90, 0x1f, 0x26, 0x3c, 0x13, 0x29,
0x51, 0x5b, 0xc9, 0xb5, 0x28, 0xf9, 0x21, 0xe7, 0xf5, 0x56, 0x96, 0xd7, 0xc5, 0xf7, 0xf2, 0x56,
0x94, 0xac, 0xe2, 0x4f, 0x44, 0x8a, 0x49, 0x4f, 0x0c, 0xba, 0x68, 0xa6, 0x05, 0xe8, 0x41, 0x06,
0xd9, 0x83, 0xae, 0x02, 0x46, 0xf6, 0x4f, 0x2d, 0x80, 0xa4, 0x77, 0x98, 0x98, 0xa0, 0xb6, 0x34,
0x7e, 0x05, 0x4f, 0xdb, 0xbe, 0xde, 0x85, 0xba, 0x3a, 0x5b, 0x4e, 0x76, 0xc9, 0x9a, 0x84, 0x31,
0xab, 0xe2, 0x36, 0xcc, 0xf5, 0x07, 0xc1, 0x09, 0x5a, 0x2f, 0x98, 0x97, 0x19, 0x89, 0x64, 0xc2,
0x06, 0x07, 0x3f, 0x10, 0xd0, 0x64, 0x4b, 0x2d, 0xe9, 0x5b, 0x6a, 0xfe, 0x06, 0xf9, 0x37, 0x0b,
0xea, 0x80, 0x2f, 0x99, 0x89, 0x89, 0x12, 0x4e, 0x36, 0x33, 0xea, 0x7c, 0xc2, 0x79, 0x1a, 0x5a,
0xe6, 0x47, 0x57, 0xc6, 0x1b, 0xef, 0x43, 0x23, 0xe4, 0xba, 0x52, 0x2a, 0xd2, 0xd2, 0x6b, 0x14,
0xe9, 0x6c, 0x68, 0xec, 0xc6, 0xef, 0x41, 0xd3, 0xed, 0x9d, 0xd3, 0x30, 0xf6, 0x30, 0xfe, 0x82,
0xa6, 0x13, 0x1f, 0xdc, 0x9c, 0x06, 0x47, 0x0b, 0xe5, 0x36, 0xcc, 0x89, 0xb4, 0x4e, 0x45, 0x29,
0x2e, 0xb3, 0x24, 0x60, 0x46, 0x68, 0xff, 0x4c, 0x9e, 0x25, 0x9a, 0x2b, 0x3b, 0x79, 0x46, 0xf4,
0xd1, 0x15, 0x52, 0xa3, 0xfb, 0x8e, 0x38, 0xd7, 0xeb, 0xc9, 0x20, 0x4f, 0x51, 0x4b, 0x52, 0xea,
0x89, 0x73, 0x58, 0x73, 0x4a, 0x4b, 0x6f, 0x32, 0xa5, 0xf6, 0xaf, 0x2c, 0x98, 0xd9, 0x0f, 0x46,
0xfb, 0x22, 0x5d, 0x0b, 0xc5, 0x43, 0xe5, 0x53, 0xcb, 0xe2, 0x6b, 0x12, 0xb9, 0x72, 0x2d, 0x90,
0xd9, 0xb4, 0x05, 0xf2, 0xe7, 0xe0, 0x2d, 0x0c, 0x31, 0x86, 0xc1, 0x28, 0x08, 0x99, 0x88, 0xba,
0x03, 0x6e, 0x6e, 0x04, 0x7e, 0x7c, 0x26, 0x55, 0xe8, 0xeb, 0x48, 0xd0, 0xef, 0x67, 0xee, 0x2c,
0xf7, 0x4b, 0x84, 0xc5, 0xc4, 0x35, 0x6b, 0x16, 0x61, 0xff, 0x31, 0x54, 0xd1, 0x9b, 0xc0, 0x61,
0x7d, 0x00, 0xd5, 0xb3, 0x60, 0xd4, 0x39, 0xf3, 0xfc, 0x58, 0x8a, 0x7c, 0x23, 0x31, 0xf3, 0xf7,
0x71, 0x42, 0x14, 0x81, 0xfd, 0x77, 0xa7, 0x61, 0xe6, 0x91, 0x7f, 0x1e, 0x78, 0x5d, 0x3c, 0xb7,
0x1c, 0xd2, 0x61, 0x20, 0xb3, 0xcb, 0xd9, 0x6f, 0x72, 0x1d, 0x66, 0x30, 0x9d, 0x72, 0xc4, 0x99,
0xb6, 0xce, 0xf3, 0x13, 0x04, 0x08, 0x6f, 0x99, 0x25, 0x77, 0x7c, 0xb8, 0x50, 0x69, 0x10, 0xe6,
0x67, 0x85, 0xfa, 0x1d, 0x1d, 0x51, 0x4a, 0xb2, 0xf7, 0xcb, 0x5a, 0xf6, 0x3e, 0x6b, 0x4b, 0xa4,
0x97, 0xf1, 0xfc, 0x23, 0xde, 0x96, 0x00, 0xa1, 0x6f, 0x18, 0x52, 0x1e, 0x22, 0x56, 0x46, 0x16,
0xf3, 0x0d, 0x75, 0x20, 0x33, 0xc4, 0xf8, 0x07, 0x9c, 0x86, 0x6f, 0x00, 0x3a, 0x88, 0x99, 0xa2,
0xe9, 0xeb, 0x59, 0xfc, 0x7a, 0x5c, 0x1a, 0xcc, 0xf4, 0x77, 0x8f, 0x2a, 0x35, 0xcb, 0xc7, 0x01,
0xfc, 0x1e, 0x53, 0x1a, 0xae, 0x79, 0x94, 0x3c, 0xf3, 0x55, 0x7a, 0x94, 0x8c, 0x61, 0xdc, 0xc1,
0xe0, 0xc4, 0xed, 0xbe, 0xc0, 0xdb, 0x79, 0x78, 0x92, 0x58, 0x75, 0x4c, 0x20, 0x26, 0x89, 0x25,
0xab, 0x8a, 0x99, 0x1c, 0x25, 0x47, 0x07, 0x91, 0x4d, 0xa8, 0xa1, 0x17, 0x2d, 0xd6, 0xb5, 0x81,
0xeb, 0xda, 0xd4, 0xdd, 0x6c, 0x5c, 0x59, 0x9d, 0x48, 0x3f, 0x53, 0x9d, 0xcb, 0xe4, 0xa2, 0xba,
0xbd, 0x9e, 0x38, 0x8a, 0x6e, 0xf2, 0x88, 0x80, 0x02, 0xb0, 0x1d, 0x5d, 0x4c, 0x18, 0x27, 0x98,
0x47, 0x02, 0x03, 0x46, 0x6e, 0x40, 0x85, 0x79, 0x78, 0x23, 0xd7, 0xeb, 0x61, 0xf2, 0x06, 0x77,
0x34, 0x15, 0x8c, 0xd5, 0x21, 0x7f, 0xe3, 0x56, 0xb9, 0x80, 0xb3, 0x62, 0xc0, 0xd8, 0xdc, 0xa8,
0xf2, 0x30, 0x49, 0x5e, 0x35, 0x81, 0xe4, 0x43, 0x3c, 0x10, 0x8c, 0x29, 0x66, 0xa8, 0x36, 0x36,
0xdf, 0x12, 0x63, 0x16, 0x4c, 0x2b, 0xff, 0x1e, 0x33, 0x12, 0x87, 0x53, 0xda, 0x5b, 0x50, 0xd7,
0xc1, 0xa4, 0x02, 0xa5, 0x27, 0x47, 0x7b, 0x87, 0xcd, 0x29, 0x52, 0x83, 0x99, 0xe3, 0xbd, 0xa7,
0x4f, 0x0f, 0xf6, 0x76, 0x9b, 0x16, 0xa9, 0x43, 0x45, 0x65, 0xf4, 0x15, 0x58, 0x69, 0x6b, 0x67,
0x67, 0xef, 0xe8, 0xe9, 0xde, 0x6e, 0xb3, 0x68, 0xc7, 0x40, 0xb6, 0x7a, 0x3d, 0x51, 0x8b, 0x8a,
0x73, 0x24, 0xfc, 0x6c, 0x19, 0xfc, 0x9c, 0xc3, 0x53, 0x85, 0x7c, 0x9e, 0x7a, 0xed, 0xcc, 0xdb,
0x7b, 0x50, 0x3b, 0xd2, 0xae, 0xa2, 0xa1, 0x78, 0xc9, 0x4b, 0x68, 0x42, 0x2c, 0x35, 0x88, 0xd6,
0x9d, 0x82, 0xde, 0x1d, 0xfb, 0x9f, 0x5a, 0xfc, 0x4e, 0x88, 0xea, 0x3e, 0x6f, 0xdb, 0x86, 0xba,
0x8a, 0xc1, 0x25, 0xc9, 0xba, 0x06, 0x8c, 0xd1, 0x60, 0x57, 0x3a, 0xc1, 0xe9, 0x69, 0x44, 0x65,
0x6a, 0x9d, 0x01, 0x93, 0x76, 0x0d, 0xb3, 0x94, 0x3c, 0xde, 0x42, 0x24, 0x52, 0xec, 0x32, 0x70,
0xa6, 0xe5, 0x45, 0x4c, 0x49, 0x26, 0x15, 0xaa, 0xb2, 0xca, 0x29, 0x4e, 0xcf, 0xf2, 0x1a, 0x54,
0x54, 0xbd, 0xa6, 0x02, 0x93, 0x94, 0x0a, 0xcf, 0x14, 0x25, 0xfa, 0x3b, 0x46, 0xa7, 0xb9, 0xd2,
0xce, 0x22, 0xc8, 0x3a, 0x90, 0x53, 0x2f, 0x4c, 0x93, 0x17, 0x91, 0x3c, 0x07, 0x63, 0x3f, 0x87,
0x05, 0xc9, 0x48, 0x9a, 0xc1, 0x65, 0x2e, 0xa2, 0x75, 0x95, 0xf8, 0x14, 0xb2, 0xe2, 0x63, 0xff,
0xba, 0x08, 0x33, 0x62, 0xa5, 0x33, 0xd7, 0x19, 0xf9, 0x3a, 0x1b, 0x30, 0xd2, 0x32, 0xae, 0x3b,
0xa1, 0xac, 0x09, 0xa5, 0x99, 0x51, 0x8b, 0xc5, 0x3c, 0xb5, 0x48, 0xa0, 0x34, 0x72, 0xe3, 0x33,
0x8c, 0x08, 0x54, 0x1d, 0xfc, 0x2d, 0x43, 0x63, 0x65, 0x33, 0x34, 0x96, 0x77, 0x79, 0x93, 0xef,
0xf8, 0xd9, 0xcb, 0x9b, 0xd7, 0xa1, 0x8a, 0x9d, 0xd0, 0x0e, 0x18, 0x13, 0x00, 0xe3, 0x5e, 0x5e,
0x40, 0xd9, 0x16, 0xb7, 0x0f, 0x12, 0xc8, 0xb7, 0x50, 0xc4, 0xdf, 0x83, 0x69, 0x9e, 0xfe, 0x2e,
0x52, 0x27, 0xaf, 0xcb, 0x43, 0x16, 0x4e, 0x27, 0xff, 0xf2, 0x1c, 0x0c, 0x47, 0xd0, 0xea, 0x97,
0xe7, 0x6a, 0xe6, 0xe5, 0x39, 0x3d, 0x68, 0x57, 0x37, 0x83, 0x76, 0xf6, 0x03, 0x98, 0x35, 0xaa,
0x63, 0x2a, 0x43, 0xa4, 0x5e, 0x36, 0xa7, 0xc8, 0x2c, 0x54, 0x1f, 0x1d, 0x76, 0x1e, 0x1c, 0x3c,
0x7a, 0xb8, 0xff, 0xb4, 0x69, 0xb1, 0xe2, 0xf1, 0xb3, 0x9d, 0x9d, 0xbd, 0xbd, 0x5d, 0x54, 0x21,
0x00, 0xd3, 0x0f, 0xb6, 0x1e, 0x1d, 0xa0, 0x02, 0xd9, 0xe5, 0xbc, 0x2d, 0xea, 0x52, 0x81, 0xed,
0x3f, 0x04, 0x22, 0x5d, 0x52, 0x4c, 0xc1, 0x18, 0x0d, 0x68, 0x2c, 0xb3, 0x82, 0xe7, 0x05, 0xe6,
0x91, 0x42, 0xc8, 0xa4, 0xf6, 0xa4, 0x96, 0x44, 0x44, 0xc4, 0x24, 0xa5, 0x45, 0x44, 0x90, 0x3a,
0x0a, 0x6f, 0xb7, 0xa1, 0xb5, 0x4b, 0x59, 0x6d, 0x5b, 0x83, 0x41, 0xaa, 0x3b, 0xcc, 0xaf, 0xc8,
0xc1, 0x09, 0xa7, 0xe3, 0x07, 0xb0, 0xb4, 0xc5, 0x13, 0x80, 0x7f, 0x5f, 0xf9, 0x61, 0x76, 0x0b,
0x96, 0xd3, 0x55, 0x8a, 0xc6, 0x1e, 0xc0, 0xfc, 0x2e, 0x3d, 0x19, 0xf7, 0x0f, 0xe8, 0x79, 0xd2,
0x10, 0x81, 0x52, 0x74, 0x16, 0x5c, 0x88, 0xf9, 0xc1, 0xdf, 0xe4, 0x6d, 0x80, 0x01, 0xa3, 0xe9,
0x44, 0x23, 0xda, 0x95, 0x57, 0xae, 0x10, 0x72, 0x3c, 0xa2, 0x5d, 0xfb, 0x23, 0x20, 0x7a, 0x3d,
0x62, 0xbe, 0x98, 0x59, 0x30, 0x3e, 0xe9, 0x44, 0x97, 0x51, 0x4c, 0x87, 0xf2, 0x2e, 0x99, 0x0e,
0xb2, 0x6f, 0x43, 0xfd, 0xc8, 0xbd, 0x74, 0xe8, 0x97, 0xe2, 0x5a, 0xef, 0x0a, 0xcc, 0x8c, 0xdc,
0x4b, 0xc6, 0x82, 0x2a, 0x46, 0x89, 0x68, 0xfb, 0x7f, 0x17, 0x60, 0x9a, 0x53, 0xb2, 0x5a, 0x7b,
0x34, 0x8a, 0x3d, 0x1f, 0x25, 0x4d, 0xd6, 0xaa, 0x81, 0x32, 0xb2, 0x5d, 0xc8, 0x91, 0x6d, 0xe1,
0x40, 0xcb, 0xeb, 0x2b, 0x42, 0x80, 0x0d, 0x18, 0x93, 0xb4, 0x24, 0xd1, 0x93, 0x47, 0xb2, 0x12,
0x40, 0x2a, 0x9c, 0x9d, 0x18, 0x1f, 0xbc, 0x7f, 0x52, 0x6d, 0x09, 0x31, 0xd6, 0x41, 0xb9, 0x26,
0xce, 0x0c, 0x97, 0xf6, 0x8c, 0x89, 0x93, 0x31, 0x65, 0x2a, 0x6f, 0x60, 0xca, 0x70, 0xaf, 0xfa,
0x75, 0xa6, 0x0c, 0xbc, 0x81, 0x29, 0x63, 0x13, 0x68, 0xe2, 0xbd, 0x58, 0x66, 0x2c, 0x4b, 0xde,
0xfd, 0x07, 0x16, 0x34, 0x05, 0x17, 0x29, 0x1c, 0x79, 0xd7, 0x70, 0x0a, 0x72, 0xaf, 0x69, 0xdc,
0x84, 0x59, 0x34, 0xd5, 0x95, 0x0a, 0x10, 0x87, 0x0c, 0x06, 0x90, 0x8d, 0x43, 0xa6, 0x09, 0x0c,
0xbd, 0x81, 0x58, 0x14, 0x1d, 0x24, 0xb5, 0x48, 0xe8, 0x8a, 0x84, 0x45, 0xcb, 0x51, 0x65, 0xfb,
0x17, 0x16, 0xcc, 0x6b, 0x1d, 0x16, 0x5c, 0x78, 0x1f, 0xa4, 0x34, 0xf0, 0x20, 0x3e, 0x97, 0xdc,
0x15, 0x53, 0x6c, 0x92, 0xcf, 0x0c, 0x62, 0x5c, 0x4c, 0xf7, 0x12, 0x3b, 0x18, 0x8d, 0x87, 0x62,
0x57, 0xd1, 0x41, 0x8c, 0x91, 0x2e, 0x28, 0x7d, 0xa1, 0x48, 0xf8, 0xbe, 0x66, 0xc0, 0x30, 0x9c,
0xc9, 0x5c, 0x0c, 0x45, 0x54, 0x12, 0xe1, 0x4c, 0x1d, 0x68, 0xff, 0x67, 0x0b, 0x16, 0xb8, 0xaf,
0x28, 0xfc, 0x73, 0x75, 0x03, 0x70, 0x9a, 0xbb, 0xcc, 0x5c, 0x22, 0xf7, 0xa7, 0x1c, 0x51, 0x26,
0xdf, 0x7f, 0x43, 0xff, 0x56, 0x65, 0x51, 0x4e, 0x58, 0x8b, 0x62, 0xde, 0x5a, 0xbc, 0x66, 0xa6,
0xf3, 0x22, 0xcb, 0xe5, 0xdc, 0xc8, 0xf2, 0xf6, 0x0c, 0x94, 0xa3, 0x6e, 0x30, 0xa2, 0xf6, 0x32,
0x2c, 0x9a, 0x83, 0x13, 0x2a, 0xe8, 0xa7, 0x16, 0xb4, 0x1e, 0xf0, 0xc3, 0x1d, 0xcf, 0xef, 0xef,
0x7b, 0x51, 0x1c, 0x84, 0xea, 0xa2, 0xf4, 0x0d, 0x80, 0x28, 0x76, 0xc3, 0x98, 0x27, 0xf8, 0x8b,
0x78, 0x6d, 0x02, 0x61, 0x7d, 0xa4, 0x7e, 0x8f, 0x63, 0xf9, 0xda, 0xa8, 0x72, 0xc6, 0xa8, 0x12,
0xde, 0xac, 0x61, 0x9a, 0xdc, 0xe2, 0x59, 0xc5, 0xcc, 0x78, 0xa2, 0xe7, 0xa8, 0xd7, 0xb9, 0x9b,
0x98, 0x82, 0xda, 0xbf, 0xb4, 0x60, 0x2e, 0xe9, 0x24, 0x9e, 0x7e, 0x9b, 0xda, 0x41, 0xd8, 0x23,
0x89, 0x76, 0x90, 0x91, 0x64, 0x8f, 0x19, 0x28, 0xa2, 0x6f, 0x1a, 0x04, 0x25, 0x56, 0x94, 0x82,
0xb1, 0xb4, 0xf8, 0x74, 0x10, 0xcf, 0x11, 0x64, 0xa6, 0x91, 0x30, 0xf3, 0x44, 0x09, 0xef, 0x67,
0x0c, 0x63, 0xfc, 0x8a, 0x47, 0xc5, 0x65, 0x91, 0x34, 0xb9, 0x6d, 0x31, 0x83, 0x50, 0xb4, 0x2b,
0xf4, 0x3d, 0xb7, 0xc2, 0xe7, 0x47, 0xed, 0xb9, 0x7f, 0xcb, 0x82, 0x6b, 0x39, 0x13, 0x2f, 0xa4,
0x66, 0x17, 0xe6, 0x4f, 0x15, 0x52, 0x4e, 0x0e, 0x17, 0x9d, 0x65, 0x79, 0x7c, 0x6b, 0x4e, 0x88,
0x93, 0xfd, 0x40, 0x19, 0x8a, 0x7c, 0xba, 0x8d, 0x2c, 0xdc, 0x2c, 0xc2, 0x3e, 0x82, 0xf6, 0xde,
0x4b, 0x26, 0x84, 0x3b, 0xfa, 0x7b, 0x3f, 0x92, 0x17, 0x36, 0x33, 0x4a, 0xe6, 0xea, 0xc8, 0xc3,
0x29, 0xcc, 0x1a, 0x75, 0x91, 0xef, 0xbe, 0x69, 0x25, 0xba, 0xbc, 0xc8, 0xb5, 0xe2, 0x0f, 0x16,
0xc9, 0x5c, 0x60, 0x0d, 0x64, 0x9f, 0xc3, 0xdc, 0xe3, 0xf1, 0x20, 0xf6, 0x92, 0xc7, 0x8b, 0xc8,
0xf7, 0xc5, 0x47, 0x58, 0x85, 0x9c, 0xba, 0xdc, 0xa6, 0x74, 0x3a, 0x36, 0x63, 0x43, 0x56, 0x53,
0x27, 0xdb, 0x62, 0x16, 0x61, 0x5f, 0x83, 0x95, 0xa4, 0x49, 0x3e, 0x77, 0x52, 0x51, 0xff, 0xcc,
0xe2, 0x49, 0x2d, 0xe6, 0x5b, 0x4a, 0xe4, 0x21, 0x2c, 0x44, 0x9e, 0xdf, 0x1f, 0x50, 0xbd, 0x9e,
0x48, 0xcc, 0xc4, 0x92, 0xd9, 0x3d, 0xf1, 0xde, 0x92, 0x93, 0xf7, 0x05, 0x63, 0x90, 0xfc, 0x8e,
0x26, 0x0c, 0x92, 0x9a, 0x92, 0xbc, 0x01, 0x7c, 0x02, 0x0d, 0xb3, 0x31, 0x72, 0x4f, 0xa4, 0xf1,
0x26, 0x3d, 0xd3, 0x8f, 0x07, 0x4c, 0xce, 0x30, 0x28, 0xed, 0x6f, 0x2c, 0x68, 0x39, 0x94, 0xb1,
0x31, 0xd5, 0x1a, 0x15, 0xdc, 0x73, 0x3f, 0x53, 0xed, 0xe4, 0x01, 0xab, 0xf4, 0x60, 0x39, 0xd6,
0xf5, 0x89, 0x8b, 0xb2, 0x3f, 0x95, 0x33, 0xaa, 0xed, 0x0a, 0x4c, 0x8b, 0xf1, 0xad, 0xc0, 0x92,
0xe8, 0x92, 0xec, 0x4e, 0x12, 0x5b, 0x36, 0x1a, 0x35, 0x62, 0xcb, 0x6d, 0x68, 0xf1, 0x1b, 0xec,
0xfa, 0x38, 0xf8, 0x87, 0x6b, 0xaf, 0xa0, 0xa6, 0xdd, 0xe3, 0x27, 0x2b, 0xb0, 0xf0, 0xfc, 0xd1,
0xd3, 0xc3, 0xbd, 0xe3, 0xe3, 0xce, 0xd1, 0xb3, 0xed, 0x4f, 0xf7, 0x3e, 0xeb, 0xec, 0x6f, 0x1d,
0xef, 0x37, 0xa7, 0xc8, 0x32, 0x90, 0xc3, 0xbd, 0xe3, 0xa7, 0x7b, 0xbb, 0x06, 0xdc, 0x22, 0x37,
0xa0, 0xfd, 0xec, 0xf0, 0xd9, 0xf1, 0xde, 0x6e, 0x27, 0xef, 0xbb, 0x02, 0x79, 0x1b, 0xae, 0x09,
0x7c, 0xce, 0xe7, 0xc5, 0xcd, 0x6f, 0x8a, 0xd0, 0xe0, 0xb9, 0x35, 0xfc, 0x09, 0x2e, 0x1a, 0x92,
0xc7, 0x30, 0x23, 0xde, 0x72, 0x23, 0x72, 0x3e, 0xcd, 0xd7, 0xe3, 0xda, 0xcb, 0x69, 0xb0, 0x98,
0x84, 0x85, 0xbf, 0xfc, 0xab, 0xff, 0xfe, 0x77, 0x0a, 0xb3, 0xa4, 0xb6, 0x71, 0xfe, 0xe1, 0x46,
0x9f, 0xfa, 0x11, 0xab, 0xe3, 0xc7, 0x00, 0xc9, 0x0b, 0x65, 0xa4, 0xa5, 0x9c, 0xd0, 0xd4, 0xf3,
0x6d, 0xed, 0x6b, 0x39, 0x18, 0x51, 0xef, 0x35, 0xac, 0x77, 0xc1, 0x6e, 0xb0, 0x7a, 0x3d, 0xdf,
0x8b, 0xf9, 0x6b, 0x65, 0x1f, 0x5b, 0x6b, 0xa4, 0x07, 0x75, 0xfd, 0xed, 0x30, 0x22, 0xe3, 0xe3,
0x39, 0xaf, 0x9f, 0xb5, 0xdf, 0xca, 0xc5, 0xc9, 0x05, 0xc4, 0x36, 0x96, 0xec, 0x26, 0x6b, 0x63,
0x8c, 0x14, 0x49, 0x2b, 0x03, 0xce, 0xd6, 0xc9, 0x13, 0x61, 0xe4, 0xba, 0xc6, 0x69, 0x99, 0x07,
0xca, 0xda, 0x6f, 0x4f, 0xc0, 0x8a, 0xb6, 0xde, 0xc6, 0xb6, 0x56, 0x6c, 0xc2, 0xda, 0xea, 0x22,
0x8d, 0x7c, 0xa0, 0xec, 0x63, 0x6b, 0x6d, 0xf3, 0xef, 0xdd, 0x82, 0xaa, 0x3a, 0x37, 0x23, 0x5f,
0xc0, 0xac, 0x91, 0xfc, 0x44, 0xe4, 0x30, 0xf2, 0x72, 0xa5, 0xda, 0xd7, 0xf3, 0x91, 0xa2, 0xe1,
0x1b, 0xd8, 0x70, 0x8b, 0x2c, 0xb3, 0x86, 0x45, 0xf6, 0xd0, 0x06, 0xa6, 0xf1, 0xf1, 0x5b, 0x40,
0x2f, 0x34, 0xf1, 0xe5, 0x8d, 0x5d, 0x4f, 0x4b, 0x94, 0xd1, 0xda, 0xdb, 0x13, 0xb0, 0xa2, 0xb9,
0xeb, 0xd8, 0xdc, 0x32, 0x59, 0xd4, 0x9b, 0x53, 0xe7, 0x59, 0x14, 0xaf, 0xbe, 0xe9, 0xaf, 0x67,
0x91, 0xb7, 0x15, 0x63, 0xe5, 0xbd, 0xaa, 0xa5, 0x58, 0x24, 0xfb, 0xb4, 0x96, 0xdd, 0xc2, 0xa6,
0x08, 0xc1, 0xe5, 0xd3, 0x1f, 0xcf, 0x22, 0x27, 0x50, 0xd3, 0x5e, 0x85, 0x21, 0xd7, 0x26, 0xbe,
0x60, 0xd3, 0x6e, 0xe7, 0xa1, 0xf2, 0x86, 0xa2, 0xd7, 0xbf, 0xc1, 0xf6, 0xe5, 0x1f, 0x41, 0x55,
0xbd, 0x33, 0x42, 0x56, 0xb4, 0x77, 0x5f, 0xf4, 0x77, 0x51, 0xda, 0xad, 0x2c, 0x22, 0x8f, 0xf9,
0xf4, 0xda, 0x19, 0xf3, 0x3d, 0x87, 0x9a, 0xf6, 0x96, 0x88, 0x1a, 0x40, 0xf6, 0xbd, 0x12, 0x35,
0x80, 0x9c, 0xa7, 0x47, 0xec, 0x79, 0x6c, 0xa2, 0x46, 0xaa, 0xc8, 0xdf, 0xf1, 0xcb, 0x20, 0x22,
0x07, 0xb0, 0x24, 0xd4, 0xd4, 0x09, 0xfd, 0x36, 0xcb, 0x90, 0xf3, 0x60, 0xd9, 0x5d, 0x8b, 0xdc,
0x87, 0x8a, 0x7c, 0x32, 0x86, 0x2c, 0xe7, 0x3f, 0x7d, 0xd3, 0x5e, 0xc9, 0xc0, 0x85, 0x79, 0xf2,
0x19, 0x40, 0xf2, 0x70, 0x89, 0x52, 0x12, 0x99, 0x87, 0x50, 0x14, 0x07, 0x64, 0x5f, 0x39, 0xb1,
0x97, 0x71, 0x80, 0x4d, 0x82, 0x4a, 0xc2, 0xa7, 0x17, 0xf2, 0x96, 0xeb, 0x4f, 0xa0, 0xa6, 0xbd,
0x5d, 0xa2, 0xa6, 0x2f, 0xfb, 0xee, 0x89, 0x9a, 0xbe, 0x9c, 0xa7, 0x4e, 0xec, 0x36, 0xd6, 0xbe,
0x68, 0xcf, 0xb1, 0xda, 0x23, 0xaf, 0xef, 0x0f, 0x39, 0x01, 0x5b, 0xa0, 0x33, 0x98, 0x35, 0x1e,
0x28, 0x51, 0x12, 0x9a, 0xf7, 0xfc, 0x89, 0x92, 0xd0, 0xdc, 0x37, 0x4d, 0x24, 0x9f, 0xd9, 0xf3,
0xac, 0x9d, 0x73, 0x24, 0xd1, 0x5a, 0xfa, 0x1c, 0x6a, 0xda, 0x63, 0x23, 0x6a, 0x2c, 0xd9, 0x77,
0x4d, 0xd4, 0x58, 0xf2, 0xde, 0x26, 0x59, 0xc4, 0x36, 0x1a, 0x36, 0xb2, 0x02, 0xde, 0xd7, 0x64,
0x75, 0x7f, 0x01, 0x0d, 0xf3, 0xf9, 0x11, 0x25, 0xfb, 0xb9, 0x0f, 0x99, 0x28, 0xd9, 0x9f, 0xf0,
0x66, 0x89, 0x60, 0xe9, 0xb5, 0x05, 0xd5, 0xc8, 0xc6, 0xd7, 0x22, 0xeb, 0xe6, 0x15, 0xf9, 0x01,
0x53, 0x70, 0xe2, 0x02, 0x2d, 0x59, 0xd1, 0xb8, 0x56, 0xbf, 0x66, 0xab, 0xe4, 0x25, 0x73, 0xd7,
0xd6, 0x64, 0x66, 0x7e, 0xe3, 0x14, 0x77, 0x2d, 0xbc, 0x48, 0xab, 0xed, 0x5a, 0xfa, 0x5d, 0x5b,
0x6d, 0xd7, 0x32, 0xee, 0xdb, 0xa6, 0x77, 0xad, 0xd8, 0x63, 0x75, 0xf8, 0x30, 0x97, 0x4a, 0xd0,
0x56, 0x52, 0x91, 0x7f, 0x87, 0xa6, 0x7d, 0xe3, 0xf5, 0x79, 0xdd, 0xa6, 0x06, 0x91, 0x4a, 0x70,
0x43, 0xde, 0x58, 0xfa, 0x0b, 0x50, 0xd7, 0x1f, 0x5e, 0x20, 0xba, 0x28, 0xa7, 0x5b, 0x7a, 0x2b,
0x17, 0x67, 0x2e, 0x2e, 0xa9, 0xeb, 0xcd, 0x90, 0x1f, 0xc2, 0xb2, 0x12, 0x75, 0x3d, 0xe7, 0x37,
0x22, 0xef, 0xe4, 0x64, 0x02, 0xeb, 0xc6, 0x4b, 0xfb, 0xda, 0xc4, 0x54, 0xe1, 0xbb, 0x16, 0x63,
0x1a, 0xf3, 0x46, 0x7b, 0xb2, 0x61, 0xe4, 0x5d, 0xe4, 0x4f, 0x36, 0x8c, 0xdc, 0x6b, 0xf0, 0x92,
0x69, 0xc8, 0x82, 0x31, 0x47, 0xfc, 0xc0, 0x92, 0x7c, 0x0e, 0x73, 0xda, 0xad, 0x8a, 0xe3, 0x4b,
0xbf, 0xab, 0x04, 0x20, 0x7b, 0xe1, 0xaf, 0x9d, 0x67, 0x9a, 0xdb, 0x2b, 0x58, 0xff, 0xbc, 0x6d,
0x4c, 0x0e, 0x63, 0xfe, 0x1d, 0xa8, 0xe9, 0x37, 0x36, 0x5e, 0x53, 0xef, 0x8a, 0x86, 0xd2, 0xef,
0xab, 0xdd, 0xb5, 0xc8, 0x3f, 0xb4, 0xa0, 0x6e, 0xdc, 0x7f, 0x30, 0x0e, 0xeb, 0x53, 0xf5, 0xb4,
0x74, 0x9c, 0x5e, 0x91, 0xed, 0x60, 0x27, 0x0f, 0xd6, 0x3e, 0x31, 0x26, 0xe1, 0x6b, 0x23, 0xfe,
0xb2, 0x9e, 0x7e, 0xa6, 0xee, 0x55, 0x9a, 0x40, 0xbf, 0x14, 0xf9, 0xea, 0xae, 0x45, 0x7e, 0x6e,
0x41, 0xc3, 0x8c, 0x1a, 0xaa, 0xa5, 0xca, 0x8d, 0x4f, 0xaa, 0xa5, 0x9a, 0x10, 0x6a, 0xfc, 0x1c,
0x7b, 0xf9, 0x74, 0xcd, 0x31, 0x7a, 0x29, 0xde, 0x3a, 0xf8, 0xdd, 0x7a, 0x4b, 0x3e, 0xe6, 0xaf,
0x54, 0xca, 0xd8, 0x3e, 0xd1, 0x76, 0x8d, 0xf4, 0xf2, 0xea, 0x2f, 0x2b, 0xde, 0xb1, 0xee, 0x5a,
0xe4, 0x27, 0xfc, 0x79, 0x36, 0x19, 0x7e, 0x66, 0x5c, 0xf2, 0xa6, 0xdf, 0xdb, 0x37, 0x71, 0x4c,
0x37, 0xec, 0x6b, 0xc6, 0x98, 0xd2, 0xfb, 0xf1, 0x16, 0xef, 0x9d, 0x78, 0x14, 0x31, 0xd9, 0x50,
0x32, 0x0f, 0x25, 0x4e, 0xee, 0xe4, 0x90, 0x77, 0x52, 0x90, 0x1b, 0xac, 0xfc, 0x86, 0xd5, 0xd8,
0x6b, 0xd8, 0xd7, 0x9b, 0xf6, 0x3b, 0x13, 0xfb, 0xba, 0x81, 0xb1, 0x3f, 0xd6, 0xe3, 0x23, 0x80,
0xe4, 0x1c, 0x8e, 0xa4, 0xce, 0x81, 0x94, 0x80, 0x67, 0x8f, 0xea, 0x4c, 0x79, 0x91, 0xc7, 0x45,
0xac, 0xc6, 0x1f, 0x71, 0x75, 0xf5, 0x48, 0x9e, 0x20, 0xe9, 0x46, 0x89, 0x79, 0x60, 0x66, 0x18,
0x25, 0xe9, 0xfa, 0x0d, 0x65, 0xa5, 0x8e, 0xa3, 0x9e, 0xc1, 0xec, 0x41, 0x10, 0xbc, 0x18, 0x8f,
0xd4, 0x99, 0xba, 0x19, 0x96, 0xdf, 0x77, 0xa3, 0xb3, 0x76, 0x6a, 0x14, 0xf6, 0x2a, 0x56, 0xd5,
0x26, 0x2d, 0xad, 0xaa, 0x8d, 0xaf, 0x93, 0x73, 0xbe, 0x57, 0xc4, 0x85, 0x79, 0xa5, 0x03, 0x55,
0xc7, 0xdb, 0x66, 0x35, 0x86, 0xe6, 0x4b, 0x37, 0x61, 0x58, 0xcf, 0xb2, 0xb7, 0x1b, 0x91, 0xac,
0xf3, 0xae, 0x45, 0x8e, 0xa0, 0xbe, 0x4b, 0xbb, 0x41, 0x8f, 0x8a, 0xd8, 0xf6, 0x42, 0xd2, 0x71,
0x15, 0x14, 0x6f, 0xcf, 0x1a, 0x40, 0x73, 0x5f, 0x18, 0xb9, 0x97, 0x21, 0xfd, 0x72, 0xe3, 0x6b,
0x11, 0x35, 0x7f, 0x25, 0xf7, 0x05, 0x79, 0xac, 0x60, 0xec, 0x0b, 0xa9, 0x73, 0x08, 0x63, 0x5f,
0xc8, 0x9c, 0x43, 0x18, 0x53, 0x2d, 0x8f, 0x35, 0xc8, 0x00, 0xe6, 0x33, 0x47, 0x17, 0x6a, 0x4b,
0x98, 0x74, 0xe0, 0xd1, 0x5e, 0x9d, 0x4c, 0x60, 0xb6, 0xb6, 0x66, 0xb6, 0x76, 0x0c, 0xb3, 0xbb,
0x94, 0x4f, 0x16, 0x4f, 0x1a, 0x4c, 0x5d, 0xa2, 0xd1, 0x53, 0x12, 0xd3, 0x0a, 0x1c, 0x71, 0xe6,
0xc6, 0x8f, 0x19, 0x7b, 0xe4, 0x47, 0x50, 0x7b, 0x48, 0x63, 0x99, 0x25, 0xa8, 0x4c, 0xcf, 0x54,
0xda, 0x60, 0x3b, 0x27, 0xc9, 0xd0, 0xe4, 0x19, 0xac, 0x6d, 0x83, 0xf6, 0xfa, 0x94, 0x2b, 0xa7,
0x8e, 0xd7, 0x7b, 0x45, 0xfe, 0x3c, 0x56, 0xae, 0x52, 0xa4, 0x97, 0xb5, 0xb4, 0x2f, 0xbd, 0xf2,
0xb9, 0x14, 0x3c, 0xaf, 0x66, 0x3f, 0xe8, 0x51, 0xcd, 0x04, 0xf2, 0xa1, 0xa6, 0x5d, 0x02, 0x50,
0x02, 0x94, 0xbd, 0xc6, 0xa1, 0x04, 0x28, 0xe7, 0xce, 0x80, 0x7d, 0x07, 0xdb, 0xb1, 0xc9, 0x6a,
0xd2, 0x0e, 0xbf, 0x27, 0x90, 0xb4, 0xb4, 0xf1, 0xb5, 0x3b, 0x8c, 0x5f, 0x91, 0xe7, 0xf8, 0xf6,
0x88, 0x9e, 0x09, 0x99, 0xd8, 0xd2, 0xe9, 0xa4, 0x49, 0x35, 0x59, 0x1a, 0xca, 0xb4, 0xaf, 0x79,
0x53, 0x68, 0x29, 0x7d, 0x1f, 0xe0, 0x38, 0x0e, 0x46, 0xbb, 0x2e, 0x1d, 0x06, 0x7e, 0xa2, 0x6b,
0x93, 0x3c, 0xbc, 0x44, 0x7f, 0x69, 0xc9, 0x78, 0xe4, 0xb9, 0xe6, 0x7c, 0x18, 0x89, 0xa4, 0x92,
0xb9, 0x26, 0xa6, 0xea, 0xa9, 0x09, 0xc9, 0x49, 0xd7, 0xbb, 0x6b, 0x91, 0x2d, 0x80, 0xe4, 0xec,
0x4a, 0xb9, 0x12, 0x99, 0x63, 0x31, 0xa5, 0xf6, 0x72, 0x0e, 0xba, 0x8e, 0xa0, 0x9a, 0x1c, 0x86,
0xac, 0x24, 0xb7, 0x5b, 0x8c, 0xa3, 0x13, 0xb5, 0x83, 0x67, 0x8e, 0x28, 0xec, 0x26, 0x4e, 0x15,
0x90, 0x0a, 0x9b, 0x2a, 0x3c, 0x77, 0xf0, 0x60, 0x81, 0x77, 0x50, 0x99, 0x23, 0x98, 0x43, 0x26,
0x47, 0x92, 0x73, 0x4c, 0xa0, 0xa4, 0x39, 0x37, 0xca, 0x6e, 0x44, 0x44, 0x18, 0xb7, 0xf2, 0xfc,
0x35, 0xa6, 0x9a, 0x87, 0x30, 0x9f, 0x09, 0x03, 0x2b, 0x91, 0x9e, 0x14, 0x99, 0x57, 0x22, 0x3d,
0x31, 0x82, 0x6c, 0x2f, 0x61, 0x93, 0x73, 0x36, 0xa0, 0x07, 0x74, 0xe1, 0xc5, 0xdd, 0x33, 0xd6,
0xdc, 0xcf, 0x2c, 0x58, 0xc8, 0x89, 0xf2, 0x92, 0x77, 0xa5, 0x33, 0x3d, 0x31, 0x02, 0xdc, 0xce,
0x0d, 0x02, 0xda, 0xc7, 0xd8, 0xce, 0x63, 0xf2, 0xa9, 0xb1, 0xb1, 0xf1, 0xf8, 0x9b, 0x90, 0xcc,
0xd7, 0x1a, 0x15, 0xb9, 0x16, 0xc5, 0x97, 0xb0, 0xc2, 0x3b, 0xb2, 0x35, 0x18, 0xa4, 0x02, 0x94,
0x37, 0x32, 0x0f, 0xd5, 0x1b, 0x81, 0xd7, 0xf6, 0xe4, 0x87, 0xec, 0x27, 0x98, 0xab, 0xbc, 0xab,
0x64, 0x0c, 0xcd, 0x74, 0xd0, 0x8f, 0x4c, 0xae, 0xab, 0xfd, 0x8e, 0xe1, 0x16, 0x66, 0x03, 0x85,
0xf6, 0x1f, 0x60, 0x63, 0xef, 0xd8, 0xed, 0xbc, 0x79, 0xe1, 0x9e, 0x22, 0x5b, 0x8f, 0xbf, 0xa4,
0x22, 0x94, 0xa9, 0x71, 0xca, 0x06, 0x26, 0x85, 0x54, 0x95, 0x63, 0x9a, 0x1f, 0xe0, 0xbc, 0x85,
0xcd, 0xaf, 0xda, 0x6f, 0xe5, 0x35, 0x1f, 0xf2, 0x4f, 0xb8, 0x8b, 0xba, 0x92, 0x96, 0x6b, 0xd9,
0x83, 0xd5, 0xbc, 0xf5, 0x9e, 0xe8, 0x6b, 0xa4, 0xe6, 0x7a, 0xea, 0xae, 0xb5, 0x7d, 0xfb, 0xf3,
0x3f, 0xe8, 0x7b, 0xf1, 0xd9, 0xf8, 0x64, 0xbd, 0x1b, 0x0c, 0x37, 0x06, 0x32, 0x44, 0x26, 0x32,
0x9e, 0x37, 0x06, 0x7e, 0x6f, 0x03, 0xbf, 0x3f, 0x99, 0xc6, 0xff, 0x7b, 0xf1, 0xdd, 0xff, 0x1b,
0x00, 0x00, 0xff, 0xff, 0xcc, 0x41, 0x1f, 0x31, 0x29, 0x63, 0x00, 0x00,
0xd6, 0xcd, 0x37, 0x33, 0xeb, 0xdd, 0xcf, 0x9e, 0xf5, 0xed, 0x2d, 0xf3, 0xed, 0xf0, 0xf1, 0xe1,
0xbf, 0x19, 0xcf, 0xae, 0xc7, 0xe3, 0x2b, 0xcf, 0xdc, 0xb0, 0x7b, 0x1f, 0xea, 0x2b, 0x77, 0xa7,
0xdb, 0xb5, 0xd3, 0x5d, 0xd5, 0x5b, 0x55, 0x6d, 0x8f, 0x77, 0x19, 0x1e, 0x10, 0x02, 0x04, 0x42,
0x68, 0x41, 0x20, 0x40, 0x20, 0xa4, 0x3b, 0x1e, 0x38, 0xf1, 0x00, 0x3c, 0x80, 0x40, 0x3a, 0x89,
0x47, 0x9e, 0x10, 0x42, 0xf7, 0x88, 0xc4, 0x09, 0x81, 0x84, 0x4e, 0x3c, 0x81, 0xc4, 0x3b, 0xca,
0xc8, 0x9f, 0xca, 0xac, 0xaa, 0x1e, 0xcf, 0xde, 0x1d, 0xdf, 0x93, 0x3b, 0x23, 0xa2, 0xf2, 0x37,
0x22, 0x32, 0x22, 0x32, 0x32, 0x0d, 0xd5, 0x70, 0xd4, 0x5d, 0x1f, 0x85, 0x41, 0x1c, 0x90, 0xf2,
0xc0, 0x0f, 0x47, 0xdd, 0xf6, 0xf5, 0x7e, 0x10, 0xf4, 0x07, 0x74, 0xc3, 0x1d, 0x79, 0x1b, 0xae,
0xef, 0x07, 0xb1, 0x1b, 0x7b, 0x81, 0x1f, 0x71, 0x22, 0xfb, 0x27, 0xd0, 0x78, 0x48, 0xfd, 0x63,
0x4a, 0x7b, 0x0e, 0xfd, 0x6a, 0x4c, 0xa3, 0x98, 0xbc, 0x0f, 0xf3, 0x2e, 0xfd, 0x9a, 0xd2, 0x5e,
0x67, 0xe4, 0x46, 0xd1, 0xe8, 0x2c, 0x74, 0x23, 0xda, 0xb2, 0x56, 0xad, 0x3b, 0x75, 0xa7, 0xc9,
0x11, 0x47, 0x0a, 0x4e, 0xde, 0x85, 0x7a, 0xc4, 0x48, 0xa9, 0x1f, 0x87, 0xc1, 0xe8, 0xb2, 0x55,
0x40, 0xba, 0x1a, 0x83, 0xed, 0x71, 0x90, 0x3d, 0x80, 0x39, 0xd5, 0x42, 0x34, 0x0a, 0xfc, 0x88,
0x92, 0xbb, 0xb0, 0xd8, 0xf5, 0x46, 0x67, 0x34, 0xec, 0xe0, 0xc7, 0x43, 0x9f, 0x0e, 0x03, 0xdf,
0xeb, 0xb6, 0xac, 0xd5, 0xe2, 0x9d, 0xaa, 0x43, 0x38, 0x8e, 0x7d, 0xf1, 0x58, 0x60, 0xc8, 0x6d,
0x98, 0xa3, 0x3e, 0x87, 0xd3, 0x1e, 0x7e, 0x25, 0x9a, 0x6a, 0x24, 0x60, 0xf6, 0x81, 0xfd, 0xd7,
0x0a, 0x30, 0xff, 0xc8, 0xf7, 0xe2, 0xe7, 0xee, 0x60, 0x40, 0x63, 0x39, 0xa6, 0xdb, 0x30, 0x77,
0x81, 0x00, 0x1c, 0xd3, 0x45, 0x10, 0xf6, 0xc4, 0x88, 0x1a, 0x1c, 0x7c, 0x24, 0xa0, 0x13, 0x7b,
0x56, 0x98, 0xd8, 0xb3, 0xdc, 0xe9, 0x2a, 0x4e, 0x98, 0xae, 0xdb, 0x30, 0x17, 0xd2, 0x6e, 0x70,
0x4e, 0xc3, 0xcb, 0xce, 0x85, 0xe7, 0xf7, 0x82, 0x8b, 0x56, 0x69, 0xd5, 0xba, 0x53, 0x76, 0x1a,
0x12, 0xfc, 0x1c, 0xa1, 0x64, 0x1b, 0xe6, 0xba, 0x67, 0xae, 0xef, 0xd3, 0x41, 0xe7, 0xc4, 0xed,
0xbe, 0x18, 0x8f, 0xa2, 0x56, 0x79, 0xd5, 0xba, 0x53, 0xdb, 0xbc, 0xb6, 0x8e, 0xab, 0xba, 0xbe,
0x73, 0xe6, 0xfa, 0xdb, 0x88, 0x39, 0xf6, 0xdd, 0x51, 0x74, 0x16, 0xc4, 0x4e, 0x43, 0x7c, 0xc1,
0xc1, 0x91, 0xbd, 0x08, 0x44, 0x9f, 0x09, 0x3e, 0xf7, 0xf6, 0x3f, 0xb7, 0x60, 0xe1, 0x99, 0x3f,
0x08, 0xba, 0x2f, 0x7e, 0xc3, 0x29, 0xca, 0x19, 0x43, 0xe1, 0x4d, 0xc7, 0x50, 0xfc, 0xae, 0x63,
0x58, 0x86, 0x45, 0xb3, 0xb3, 0x62, 0x14, 0x14, 0x96, 0xd8, 0xd7, 0x7d, 0x2a, 0xbb, 0x25, 0x87,
0xf1, 0x1e, 0x34, 0xbb, 0xe3, 0x30, 0xa4, 0x7e, 0x66, 0x1c, 0x73, 0x02, 0xae, 0x06, 0xf2, 0x2e,
0xd4, 0x7d, 0x7a, 0x91, 0x90, 0x09, 0xde, 0xf5, 0xe9, 0x85, 0x24, 0xb1, 0x5b, 0xb0, 0x9c, 0x6e,
0x46, 0x74, 0xe0, 0xbf, 0x59, 0x50, 0x7a, 0x16, 0xbf, 0x0c, 0xc8, 0x3a, 0x94, 0xe2, 0xcb, 0x11,
0x97, 0x90, 0xc6, 0x26, 0x11, 0x43, 0xdb, 0xea, 0xf5, 0x42, 0x1a, 0x45, 0x4f, 0x2f, 0x47, 0xd4,
0xa9, 0xbb, 0xbc, 0xd0, 0x61, 0x74, 0xa4, 0x05, 0x33, 0xa2, 0x8c, 0x0d, 0x56, 0x1d, 0x59, 0x24,
0x37, 0x00, 0xdc, 0x61, 0x30, 0xf6, 0xe3, 0x4e, 0xe4, 0xc6, 0x38, 0x55, 0x45, 0x47, 0x83, 0x90,
0xeb, 0x50, 0x1d, 0xbd, 0xe8, 0x44, 0xdd, 0xd0, 0x1b, 0xc5, 0xc8, 0x36, 0x55, 0x27, 0x01, 0x90,
0xf7, 0xa1, 0x12, 0x8c, 0xe3, 0x51, 0xe0, 0xf9, 0xb1, 0x60, 0x95, 0x39, 0xd1, 0x97, 0x27, 0xe3,
0xf8, 0x88, 0x81, 0x1d, 0x45, 0x40, 0x6e, 0xc2, 0x6c, 0x37, 0xf0, 0x4f, 0xbd, 0x70, 0xc8, 0x95,
0x41, 0x6b, 0x1a, 0x5b, 0x33, 0x81, 0xf6, 0xbf, 0x2b, 0x40, 0xed, 0x69, 0xe8, 0xfa, 0x91, 0xdb,
0x65, 0x00, 0xd6, 0xf5, 0xf8, 0x65, 0xe7, 0xcc, 0x8d, 0xce, 0x70, 0xb4, 0x55, 0x47, 0x16, 0xc9,
0x32, 0x4c, 0xf3, 0x8e, 0xe2, 0x98, 0x8a, 0x8e, 0x28, 0x91, 0x0f, 0x60, 0xde, 0x1f, 0x0f, 0x3b,
0x66, 0x5b, 0x45, 0xe4, 0x96, 0x2c, 0x82, 0x4d, 0xc0, 0x09, 0x5b, 0x6b, 0xde, 0x04, 0x1f, 0xa1,
0x06, 0x21, 0x36, 0xd4, 0x45, 0x89, 0x7a, 0xfd, 0x33, 0x3e, 0xcc, 0xb2, 0x63, 0xc0, 0x58, 0x1d,
0xb1, 0x37, 0xa4, 0x9d, 0x28, 0x76, 0x87, 0x23, 0x31, 0x2c, 0x0d, 0x82, 0xf8, 0x20, 0x76, 0x07,
0x9d, 0x53, 0x4a, 0xa3, 0xd6, 0x8c, 0xc0, 0x2b, 0x08, 0xb9, 0x05, 0x8d, 0x1e, 0x8d, 0xe2, 0x8e,
0x58, 0x14, 0x1a, 0xb5, 0x2a, 0x28, 0xfa, 0x29, 0x28, 0xab, 0x27, 0x74, 0x2f, 0x3a, 0x6c, 0x02,
0xe8, 0xcb, 0x56, 0x95, 0xf7, 0x35, 0x81, 0x30, 0xce, 0x79, 0x48, 0x63, 0x6d, 0xf6, 0x22, 0xc1,
0xa1, 0xf6, 0x01, 0x10, 0x0d, 0xbc, 0x4b, 0x63, 0xd7, 0x1b, 0x44, 0xe4, 0x63, 0xa8, 0xc7, 0x1a,
0x31, 0xaa, 0xc2, 0x9a, 0x62, 0x27, 0xed, 0x03, 0xc7, 0xa0, 0xb3, 0x1f, 0x42, 0xe5, 0x01, 0xa5,
0x07, 0xde, 0xd0, 0x8b, 0xc9, 0x32, 0x94, 0x4f, 0xbd, 0x97, 0x94, 0x33, 0x7c, 0x71, 0x7f, 0xca,
0xe1, 0x45, 0xd2, 0x86, 0x99, 0x11, 0x0d, 0xbb, 0x54, 0x2e, 0xcf, 0xfe, 0x94, 0x23, 0x01, 0xdb,
0x33, 0x50, 0x1e, 0xb0, 0x8f, 0xed, 0xff, 0x5d, 0x80, 0xda, 0x31, 0xf5, 0x95, 0x20, 0x11, 0x28,
0xb1, 0x21, 0x0b, 0xe1, 0xc1, 0xdf, 0xe4, 0x1d, 0xa8, 0xe1, 0x34, 0x44, 0x71, 0xe8, 0xf9, 0x7d,
0xc1, 0xbf, 0xc0, 0x40, 0xc7, 0x08, 0x21, 0x4d, 0x28, 0xba, 0x43, 0xc9, 0xbb, 0xec, 0x27, 0x13,
0xb2, 0x91, 0x7b, 0x39, 0x64, 0xf2, 0xa8, 0x56, 0xb5, 0xee, 0xd4, 0x04, 0x6c, 0x9f, 0x2d, 0xeb,
0x3a, 0x2c, 0xe8, 0x24, 0xb2, 0xf6, 0x32, 0xd6, 0x3e, 0xaf, 0x51, 0x8a, 0x46, 0x6e, 0xc3, 0x9c,
0xa4, 0x0f, 0x79, 0x67, 0x71, 0x9d, 0xab, 0x4e, 0x43, 0x80, 0xe5, 0x10, 0xee, 0x40, 0xf3, 0xd4,
0xf3, 0xdd, 0x41, 0xa7, 0x3b, 0x88, 0xcf, 0x3b, 0x3d, 0x3a, 0x88, 0x5d, 0x5c, 0xf1, 0xb2, 0xd3,
0x40, 0xf8, 0xce, 0x20, 0x3e, 0xdf, 0x65, 0x50, 0xf2, 0x01, 0x54, 0x4f, 0x29, 0xed, 0xe0, 0x4c,
0xb4, 0x2a, 0x86, 0xf4, 0xc8, 0xd9, 0x75, 0x2a, 0xa7, 0x72, 0x9e, 0xef, 0x40, 0x33, 0x18, 0xc7,
0xfd, 0xc0, 0xf3, 0xfb, 0x1d, 0xa6, 0xaf, 0x3a, 0x5e, 0x0f, 0x39, 0xa0, 0xe4, 0x34, 0x24, 0x9c,
0x69, 0x8d, 0x47, 0x3d, 0xf2, 0x36, 0x00, 0xb6, 0xcd, 0x2b, 0x86, 0x55, 0xeb, 0xce, 0xac, 0x53,
0x65, 0x10, 0xac, 0xc8, 0xfe, 0xb7, 0x16, 0xd4, 0xf9, 0x9c, 0x8b, 0x8d, 0xf1, 0x26, 0xcc, 0xca,
0xa1, 0xd1, 0x30, 0x0c, 0x42, 0x21, 0x67, 0x26, 0x90, 0xac, 0x41, 0x53, 0x02, 0x46, 0x21, 0xf5,
0x86, 0x6e, 0x9f, 0x0a, 0xe5, 0x95, 0x81, 0x93, 0xcd, 0xa4, 0xc6, 0x30, 0x18, 0xc7, 0x54, 0xa8,
0xe0, 0xba, 0x18, 0x9d, 0xc3, 0x60, 0x8e, 0x49, 0xc2, 0xe4, 0x2c, 0x67, 0xcd, 0x0c, 0x98, 0xfd,
0xad, 0x05, 0x84, 0x75, 0xfd, 0x69, 0xc0, 0xab, 0x10, 0x53, 0x9e, 0x5e, 0x6e, 0xeb, 0x8d, 0x97,
0xbb, 0x30, 0x69, 0xb9, 0x6d, 0x28, 0xf3, 0x9e, 0x97, 0x72, 0x7a, 0xce, 0x51, 0x9f, 0x96, 0x2a,
0xc5, 0x66, 0xc9, 0xfe, 0xa9, 0x05, 0xf5, 0x1d, 0xbe, 0x7f, 0xa0, 0xc2, 0x23, 0x77, 0x81, 0x9c,
0x8e, 0xfd, 0x1e, 0x5b, 0xa7, 0xf8, 0xa5, 0xd7, 0xeb, 0x9c, 0x5c, 0xc6, 0x34, 0xe2, 0x7d, 0xda,
0x9f, 0x72, 0x72, 0x70, 0xe4, 0x03, 0x68, 0x1a, 0xd0, 0x28, 0x0e, 0x79, 0xcf, 0xf6, 0xa7, 0x9c,
0x0c, 0x86, 0x4d, 0x14, 0x53, 0xa9, 0xe3, 0xb8, 0xe3, 0xf9, 0x3d, 0xfa, 0x12, 0xe7, 0x76, 0xd6,
0x31, 0x60, 0xdb, 0x0d, 0xa8, 0xeb, 0xdf, 0xd9, 0x5f, 0x42, 0x45, 0x2a, 0x64, 0x54, 0x46, 0xa9,
0x7e, 0x39, 0x1a, 0x84, 0xb4, 0xa1, 0x62, 0xf6, 0xc2, 0xa9, 0x7c, 0x97, 0xb6, 0xed, 0x3f, 0x03,
0xcd, 0x03, 0xa6, 0x15, 0x7d, 0xcf, 0xef, 0x8b, 0x1d, 0x89, 0xa9, 0xea, 0xd1, 0xf8, 0xe4, 0x05,
0xbd, 0x14, 0xbc, 0x25, 0x4a, 0x4c, 0xde, 0xcf, 0x82, 0x28, 0x16, 0xed, 0xe0, 0x6f, 0xfb, 0x3f,
0x58, 0x40, 0xf6, 0xa2, 0xd8, 0x1b, 0xba, 0x31, 0x7d, 0x40, 0xd5, 0x22, 0x3f, 0x81, 0x3a, 0xab,
0xed, 0x69, 0xb0, 0xc5, 0x75, 0x3e, 0xd7, 0x55, 0xef, 0x8b, 0x85, 0xc9, 0x7e, 0xb0, 0xae, 0x53,
0x33, 0xb3, 0xf0, 0xd2, 0x31, 0x2a, 0x60, 0x7a, 0x25, 0x76, 0xc3, 0x3e, 0x8d, 0x71, 0x43, 0x10,
0xe6, 0x04, 0x70, 0xd0, 0x4e, 0xe0, 0x9f, 0xb6, 0xff, 0x08, 0xe6, 0x33, 0x75, 0x30, 0x65, 0x93,
0x0c, 0x83, 0xfd, 0x24, 0x8b, 0x50, 0x3e, 0x77, 0x07, 0x63, 0x2a, 0x76, 0x21, 0x5e, 0xf8, 0xa4,
0x70, 0xcf, 0xb2, 0xbb, 0xb0, 0x60, 0xf4, 0x4b, 0xc8, 0x5b, 0x0b, 0x66, 0x98, 0xdc, 0xb3, 0xfd,
0x16, 0x75, 0xa6, 0x23, 0x8b, 0x64, 0x13, 0x16, 0x4f, 0x29, 0x0d, 0xdd, 0x18, 0x8b, 0x9d, 0x11,
0x0d, 0x71, 0x4d, 0x44, 0xcd, 0xb9, 0x38, 0xfb, 0xbf, 0x5b, 0x30, 0xc7, 0x64, 0xe2, 0xb1, 0xeb,
0x5f, 0xca, 0xb9, 0x3a, 0xc8, 0x9d, 0xab, 0x3b, 0x62, 0xae, 0x52, 0xd4, 0xdf, 0x75, 0xa2, 0x8a,
0xe9, 0x89, 0x22, 0xab, 0x50, 0x37, 0xba, 0x5b, 0xe6, 0x1b, 0x5c, 0xe4, 0xc6, 0x47, 0x34, 0xdc,
0xbe, 0x8c, 0xe9, 0x6f, 0x3f, 0x95, 0xb7, 0xa0, 0x99, 0x74, 0x5b, 0xcc, 0x23, 0x81, 0x12, 0x63,
0x4c, 0x51, 0x01, 0xfe, 0xb6, 0xff, 0x91, 0xc5, 0x09, 0x77, 0x02, 0x4f, 0x6d, 0x7e, 0x8c, 0x90,
0xed, 0xa1, 0x92, 0x90, 0xfd, 0x9e, 0x68, 0x3c, 0xfc, 0xf6, 0x83, 0x25, 0xd7, 0xa0, 0x12, 0x51,
0xbf, 0xd7, 0x71, 0x07, 0x03, 0xdc, 0x23, 0x2a, 0xce, 0x0c, 0x2b, 0x6f, 0x0d, 0x06, 0xf6, 0x6d,
0x98, 0xd7, 0x7a, 0xf7, 0x9a, 0x71, 0x1c, 0x02, 0x39, 0xf0, 0xa2, 0xf8, 0x99, 0x1f, 0x8d, 0xb4,
0xbd, 0xe5, 0x2d, 0xa8, 0x0e, 0x3d, 0x1f, 0x7b, 0xc6, 0x25, 0xb7, 0xec, 0x54, 0x86, 0x9e, 0xcf,
0xfa, 0x15, 0x21, 0xd2, 0x7d, 0x29, 0x90, 0x05, 0x81, 0x74, 0x5f, 0x22, 0xd2, 0xbe, 0x07, 0x0b,
0x46, 0x7d, 0xa2, 0xe9, 0x77, 0xa1, 0x3c, 0x8e, 0x5f, 0x06, 0x72, 0xe7, 0xaf, 0x09, 0x0e, 0x61,
0x36, 0xa6, 0xc3, 0x31, 0xf6, 0x7d, 0x98, 0x3f, 0xa4, 0x17, 0x42, 0x90, 0x65, 0x47, 0x6e, 0x5d,
0x69, 0x7f, 0x22, 0xde, 0x5e, 0x07, 0xa2, 0x7f, 0x9c, 0x08, 0x80, 0xb4, 0x46, 0x2d, 0xc3, 0x1a,
0xb5, 0x6f, 0x01, 0x39, 0xf6, 0xfa, 0xfe, 0x63, 0x1a, 0x45, 0x6e, 0x5f, 0x89, 0x7e, 0x13, 0x8a,
0xc3, 0xa8, 0x2f, 0x54, 0x15, 0xfb, 0x69, 0x7f, 0x1f, 0x16, 0x0c, 0x3a, 0x51, 0xf1, 0x75, 0xa8,
0x46, 0x5e, 0xdf, 0x77, 0xe3, 0x71, 0x48, 0x45, 0xd5, 0x09, 0xc0, 0x7e, 0x00, 0x8b, 0x3f, 0xa2,
0xa1, 0x77, 0x7a, 0x79, 0x55, 0xf5, 0x66, 0x3d, 0x85, 0x74, 0x3d, 0x7b, 0xb0, 0x94, 0xaa, 0x47,
0x34, 0xcf, 0xd9, 0x57, 0xac, 0x64, 0xc5, 0xe1, 0x05, 0x4d, 0xf7, 0x15, 0x74, 0xdd, 0x67, 0x3f,
0x03, 0xb2, 0x13, 0xf8, 0x3e, 0xed, 0xc6, 0x47, 0x94, 0x86, 0x89, 0x23, 0x9c, 0xf0, 0x6a, 0x6d,
0x73, 0x45, 0xcc, 0x6c, 0x5a, 0xa1, 0x0a, 0x26, 0x26, 0x50, 0x1a, 0xd1, 0x70, 0x88, 0x15, 0x57,
0x1c, 0xfc, 0x6d, 0x2f, 0xc1, 0x82, 0x51, 0xad, 0x70, 0x1d, 0x3e, 0x84, 0xa5, 0x5d, 0x2f, 0xea,
0x66, 0x1b, 0x6c, 0xc1, 0xcc, 0x68, 0x7c, 0xd2, 0x49, 0x24, 0x51, 0x16, 0x99, 0x35, 0x99, 0xfe,
0x44, 0x54, 0xf6, 0x57, 0x2c, 0x28, 0xed, 0x3f, 0x3d, 0xd8, 0x61, 0x7b, 0x85, 0xe7, 0x77, 0x83,
0x21, 0xdb, 0x4b, 0xf9, 0xa0, 0x55, 0x79, 0xa2, 0x84, 0x5d, 0x87, 0x2a, 0x6e, 0xc1, 0xcc, 0x80,
0x16, 0x3e, 0x6b, 0x02, 0x60, 0xc6, 0x3b, 0x7d, 0x39, 0xf2, 0x42, 0xb4, 0xce, 0xa5, 0xcd, 0x5d,
0xc2, 0x6d, 0x26, 0x8b, 0xb0, 0x7f, 0x31, 0x0d, 0x33, 0x62, 0xf3, 0xc5, 0xf6, 0xba, 0xb1, 0x77,
0x4e, 0x45, 0x4f, 0x44, 0x89, 0x99, 0x37, 0x21, 0x1d, 0x06, 0x31, 0xed, 0x18, 0xcb, 0x60, 0x02,
0xd1, 0x39, 0x11, 0x7e, 0x23, 0x77, 0x67, 0x8a, 0x9c, 0xca, 0x00, 0xb2, 0xc9, 0x92, 0xb6, 0x57,
0x09, 0x6d, 0x2f, 0x59, 0x64, 0x33, 0xd1, 0x75, 0x47, 0x6e, 0xd7, 0x8b, 0x2f, 0x85, 0x4a, 0x50,
0x65, 0x56, 0xf7, 0x20, 0xe8, 0xba, 0xcc, 0x23, 0x1d, 0xb8, 0x7e, 0x97, 0x4a, 0xc7, 0xc7, 0x00,
0x32, 0x27, 0x40, 0x74, 0x49, 0x92, 0x71, 0x47, 0x21, 0x05, 0x65, 0xfb, 0x77, 0x37, 0x18, 0x0e,
0xbd, 0x98, 0xf9, 0x0e, 0x68, 0x37, 0x16, 0x1d, 0x0d, 0xc2, 0xdd, 0x2c, 0x2c, 0x5d, 0xf0, 0xd9,
0xab, 0x4a, 0x37, 0x4b, 0x03, 0xb2, 0x5a, 0xd8, 0xae, 0xc3, 0xd4, 0xd8, 0x8b, 0x0b, 0x34, 0x12,
0x8b, 0x8e, 0x06, 0x61, 0xeb, 0x30, 0xf6, 0x23, 0x1a, 0xc7, 0x03, 0xda, 0x53, 0x1d, 0xaa, 0x21,
0x59, 0x16, 0x41, 0xee, 0xc2, 0x02, 0x77, 0x67, 0x22, 0x37, 0x0e, 0xa2, 0x33, 0x2f, 0xea, 0x44,
0xcc, 0xf0, 0xaf, 0x23, 0x7d, 0x1e, 0x8a, 0xdc, 0x83, 0x95, 0x14, 0x38, 0xa4, 0x5d, 0xea, 0x9d,
0xd3, 0x5e, 0x6b, 0x16, 0xbf, 0x9a, 0x84, 0x26, 0xab, 0x50, 0x63, 0x5e, 0xdc, 0x78, 0xd4, 0x73,
0x99, 0x01, 0xd3, 0xc0, 0x75, 0xd0, 0x41, 0xe4, 0x43, 0x98, 0x1d, 0x51, 0x6e, 0xfd, 0x9c, 0xc5,
0x83, 0x6e, 0xd4, 0x9a, 0x33, 0xb4, 0x1b, 0xe3, 0x5c, 0xc7, 0xa4, 0x60, 0x4c, 0xd9, 0x8d, 0xd0,
0x5c, 0x77, 0x2f, 0x5b, 0x4d, 0x61, 0x32, 0x4b, 0x00, 0xca, 0x48, 0xe8, 0x9d, 0xbb, 0x31, 0x6d,
0xcd, 0x73, 0x85, 0x2e, 0x8a, 0xec, 0x3b, 0xcf, 0xf7, 0x62, 0xcf, 0x8d, 0x83, 0xb0, 0x45, 0x10,
0x97, 0x00, 0xd8, 0x24, 0x22, 0x7f, 0x44, 0xb1, 0x1b, 0x8f, 0xa3, 0xce, 0xe9, 0xc0, 0xed, 0x47,
0xad, 0x05, 0x6e, 0x73, 0x66, 0x10, 0xe4, 0x63, 0x58, 0xe6, 0x1c, 0x81, 0xa8, 0x90, 0x46, 0x34,
0x3c, 0xe7, 0x66, 0xc2, 0x22, 0xce, 0xc8, 0x04, 0x2c, 0x9b, 0x4a, 0xc1, 0x22, 0x99, 0x0f, 0x97,
0xf8, 0x54, 0x4e, 0x40, 0xdb, 0xff, 0xc4, 0xe2, 0xdb, 0x82, 0x10, 0x21, 0xa5, 0xde, 0xdf, 0x81,
0x1a, 0x17, 0x9e, 0x4e, 0xe0, 0x0f, 0x2e, 0x85, 0x3c, 0x01, 0x07, 0x3d, 0xf1, 0x07, 0x97, 0xe4,
0x7b, 0x30, 0xeb, 0xf9, 0x3a, 0x09, 0xd7, 0x40, 0x75, 0x09, 0x44, 0xa2, 0x77, 0xa0, 0x36, 0x1a,
0x9f, 0x0c, 0xbc, 0x2e, 0x27, 0x29, 0xf2, 0x5a, 0x38, 0x08, 0x09, 0x98, 0xdd, 0xce, 0xe7, 0x91,
0x53, 0x94, 0x90, 0xa2, 0x26, 0x60, 0x8c, 0xc4, 0xde, 0x86, 0x45, 0xb3, 0x83, 0x42, 0xd5, 0xae,
0x41, 0x45, 0x48, 0x66, 0xd4, 0xaa, 0xe1, 0xea, 0x36, 0xb4, 0xf8, 0x8e, 0x4f, 0x07, 0x8e, 0xc2,
0xdb, 0xff, 0xa6, 0x04, 0x0b, 0x02, 0xba, 0x33, 0x08, 0x22, 0x7a, 0x3c, 0x1e, 0x0e, 0xdd, 0x30,
0x47, 0xe4, 0xad, 0x2b, 0x44, 0xbe, 0x60, 0x8a, 0x3c, 0x13, 0xc4, 0x33, 0xd7, 0xf3, 0xb9, 0xd3,
0xc1, 0xf5, 0x85, 0x06, 0x21, 0x77, 0x60, 0xae, 0x3b, 0x08, 0x22, 0x6e, 0x84, 0xeb, 0xe1, 0x85,
0x34, 0x38, 0xab, 0xa2, 0xca, 0x79, 0x2a, 0x4a, 0x57, 0x31, 0xd3, 0x29, 0x15, 0x63, 0x43, 0x9d,
0x55, 0x4a, 0xa5, 0xc6, 0x9c, 0xe1, 0x86, 0xb9, 0x0e, 0x63, 0xfd, 0x49, 0x0b, 0x34, 0xd7, 0x1e,
0x73, 0x79, 0xe2, 0xec, 0x0d, 0x29, 0x6a, 0x64, 0x8d, 0xba, 0x2a, 0xc4, 0x39, 0x8b, 0x22, 0x0f,
0x98, 0xcf, 0xc9, 0xda, 0x42, 0xb3, 0x00, 0xd0, 0x2c, 0xb8, 0x65, 0xae, 0x88, 0x3e, 0xf7, 0xeb,
0xac, 0x30, 0x0e, 0x29, 0x9a, 0x0a, 0xda, 0x97, 0xf6, 0x5f, 0xb7, 0xa0, 0xa6, 0xe1, 0xc8, 0x12,
0xcc, 0xef, 0x3c, 0x79, 0x72, 0xb4, 0xe7, 0x6c, 0x3d, 0x7d, 0xf4, 0xa3, 0xbd, 0xce, 0xce, 0xc1,
0x93, 0xe3, 0xbd, 0xe6, 0x14, 0x03, 0x1f, 0x3c, 0xd9, 0xd9, 0x3a, 0xe8, 0x3c, 0x78, 0xe2, 0xec,
0x48, 0xb0, 0x45, 0x96, 0x81, 0x38, 0x7b, 0x8f, 0x9f, 0x3c, 0xdd, 0x33, 0xe0, 0x05, 0xd2, 0x84,
0xfa, 0xb6, 0xb3, 0xb7, 0xb5, 0xb3, 0x2f, 0x20, 0x45, 0xb2, 0x08, 0xcd, 0x07, 0xcf, 0x0e, 0x77,
0x1f, 0x1d, 0x3e, 0xec, 0xec, 0x6c, 0x1d, 0xee, 0xec, 0x1d, 0xec, 0xed, 0x36, 0x4b, 0x64, 0x16,
0xaa, 0x5b, 0xdb, 0x5b, 0x87, 0xbb, 0x4f, 0x0e, 0xf7, 0x76, 0x9b, 0x65, 0xfb, 0xbf, 0x5a, 0xb0,
0x84, 0xbd, 0xee, 0xa5, 0x05, 0x64, 0x15, 0x6a, 0xdd, 0x20, 0x18, 0x31, 0x73, 0x3c, 0xd9, 0x70,
0x74, 0x10, 0x63, 0x7e, 0x2e, 0xae, 0xa7, 0x41, 0xd8, 0xa5, 0x42, 0x3e, 0x00, 0x41, 0x0f, 0x18,
0x84, 0x31, 0xbf, 0x58, 0x5e, 0x4e, 0xc1, 0xc5, 0xa3, 0xc6, 0x61, 0x9c, 0x64, 0x19, 0xa6, 0x4f,
0x42, 0xea, 0x76, 0xcf, 0x84, 0x64, 0x88, 0x12, 0x79, 0x2f, 0xf1, 0x17, 0xbb, 0x6c, 0xf6, 0x07,
0xb4, 0x87, 0x1c, 0x53, 0x71, 0xe6, 0x04, 0x7c, 0x47, 0x80, 0x99, 0x7e, 0x72, 0x4f, 0x5c, 0xbf,
0x17, 0xf8, 0xb4, 0x27, 0x8c, 0xd1, 0x04, 0x60, 0x1f, 0xc1, 0x72, 0x7a, 0x7c, 0x42, 0xbe, 0x3e,
0xd6, 0xe4, 0x8b, 0xdb, 0x86, 0xed, 0xc9, 0xab, 0xa9, 0xc9, 0xda, 0xaf, 0x0a, 0x50, 0x62, 0xa6,
0xc2, 0x64, 0xb3, 0x42, 0xb7, 0xfe, 0x8a, 0x99, 0x58, 0x24, 0xba, 0xa0, 0x7c, 0xf3, 0xe0, 0x1b,
0xac, 0x06, 0x49, 0xf0, 0x21, 0xed, 0x9e, 0xe3, 0x88, 0x15, 0x9e, 0x41, 0x98, 0x80, 0x30, 0xd3,
0x1c, 0xbf, 0x16, 0x02, 0x22, 0xcb, 0x12, 0x87, 0x5f, 0xce, 0x24, 0x38, 0xfc, 0xae, 0x05, 0x33,
0x9e, 0x7f, 0x12, 0x8c, 0xfd, 0x1e, 0x0a, 0x44, 0xc5, 0x91, 0x45, 0x8c, 0x7e, 0xa2, 0xa0, 0x7a,
0x43, 0xc9, 0xfe, 0x09, 0x80, 0x6c, 0x42, 0x35, 0xba, 0xf4, 0xbb, 0x3a, 0xcf, 0x2f, 0x8a, 0x59,
0x62, 0x73, 0xb0, 0x7e, 0x7c, 0xe9, 0x77, 0x91, 0xc3, 0x13, 0x32, 0xfb, 0x8f, 0xa0, 0x22, 0xc1,
0x8c, 0x2d, 0x9f, 0x1d, 0x7e, 0x76, 0xf8, 0xe4, 0xf9, 0x61, 0xe7, 0xf8, 0xf3, 0xc3, 0x9d, 0xe6,
0x14, 0x99, 0x83, 0xda, 0xd6, 0x0e, 0x72, 0x3a, 0x02, 0x2c, 0x46, 0x72, 0xb4, 0x75, 0x7c, 0xac,
0x20, 0x05, 0x9b, 0x30, 0xf7, 0x3a, 0x42, 0x7b, 0x4c, 0x45, 0xf7, 0x3e, 0x86, 0x79, 0x0d, 0x96,
0xd8, 0xf6, 0x23, 0x06, 0x48, 0xd9, 0xf6, 0x68, 0xc8, 0x71, 0x8c, 0xdd, 0x84, 0xc6, 0x43, 0x1a,
0x3f, 0xf2, 0x4f, 0x03, 0x59, 0xd3, 0xff, 0x2c, 0xc1, 0x9c, 0x02, 0x89, 0x8a, 0xee, 0xc0, 0x9c,
0xd7, 0xa3, 0x7e, 0xec, 0xc5, 0x97, 0x1d, 0xc3, 0x8b, 0x4f, 0x83, 0x99, 0x01, 0xec, 0x0e, 0x3c,
0x57, 0x06, 0x99, 0x79, 0x81, 0x79, 0xb5, 0x6c, 0x77, 0x96, 0x1b, 0xae, 0xe2, 0x2b, 0x1e, 0x3c,
0xc8, 0xc5, 0x31, 0x0d, 0xc4, 0xe0, 0x62, 0x8b, 0x51, 0x9f, 0x70, 0x43, 0x30, 0x0f, 0xc5, 0x96,
0x8a, 0xd7, 0xc4, 0x86, 0x5c, 0xe6, 0x3b, 0xb8, 0x02, 0x64, 0xa2, 0xb8, 0xd3, 0x5c, 0x3f, 0xa6,
0xa3, 0xb8, 0x5a, 0x24, 0xb8, 0x92, 0x89, 0x04, 0x33, 0xfd, 0x79, 0xe9, 0x77, 0x69, 0xaf, 0x13,
0x07, 0x1d, 0xd4, 0xf3, 0xc8, 0x12, 0x15, 0x27, 0x0d, 0x26, 0xd7, 0x61, 0x26, 0xa6, 0x51, 0xec,
0x53, 0x1e, 0x7e, 0xab, 0x6c, 0x17, 0x5a, 0x96, 0x23, 0x41, 0xcc, 0x6a, 0x1f, 0x87, 0x5e, 0xd4,
0xaa, 0x63, 0x8c, 0x17, 0x7f, 0x93, 0x8f, 0x60, 0xe9, 0x84, 0x46, 0x71, 0xe7, 0x8c, 0xba, 0x3d,
0x1a, 0x22, 0x7b, 0xf1, 0x60, 0x32, 0x37, 0x86, 0xf2, 0x91, 0x8c, 0x71, 0xcf, 0x69, 0x18, 0x79,
0x81, 0x8f, 0x66, 0x50, 0xd5, 0x91, 0x45, 0x56, 0x1f, 0x1b, 0xbc, 0xda, 0xa4, 0xd5, 0x0c, 0xce,
0xe1, 0xc0, 0xf3, 0x91, 0xe4, 0x26, 0x4c, 0xe3, 0x00, 0xa2, 0x56, 0x13, 0x79, 0xa6, 0x9e, 0xc8,
0xbc, 0xe7, 0x3b, 0x02, 0xc7, 0x56, 0xb9, 0x1b, 0x0c, 0x82, 0x10, 0x6d, 0xa1, 0xaa, 0xc3, 0x0b,
0xe6, 0xec, 0xf4, 0x43, 0x77, 0x74, 0x26, 0xec, 0xa1, 0x34, 0xf8, 0xd3, 0x52, 0xa5, 0xd6, 0xac,
0xdb, 0x7f, 0x0a, 0xca, 0x58, 0x2d, 0x56, 0x87, 0x93, 0x69, 0x89, 0xea, 0x10, 0xda, 0x82, 0x19,
0x9f, 0xc6, 0x17, 0x41, 0xf8, 0x42, 0x9e, 0x58, 0x88, 0xa2, 0xfd, 0x35, 0xfa, 0x4d, 0x2a, 0x82,
0xff, 0x0c, 0x8d, 0x3e, 0xe6, 0xfd, 0xf2, 0xa5, 0x8a, 0xce, 0x5c, 0xe1, 0xca, 0x55, 0x10, 0x70,
0x7c, 0xe6, 0x32, 0x5d, 0x6b, 0xac, 0x3e, 0xf7, 0x8e, 0x6b, 0x08, 0xdb, 0xe7, 0x8b, 0x7f, 0x13,
0x1a, 0xf2, 0x6c, 0x20, 0xea, 0x0c, 0xe8, 0x69, 0x2c, 0x63, 0x5b, 0xfe, 0x78, 0x88, 0x2e, 0xf4,
0x01, 0x3d, 0x8d, 0xed, 0x43, 0x98, 0x17, 0xfa, 0xef, 0xc9, 0x88, 0xca, 0xa6, 0xff, 0x20, 0xcf,
0x8e, 0xa8, 0x6d, 0x2e, 0x98, 0x0a, 0x93, 0x9f, 0x86, 0x98, 0x94, 0xb6, 0x03, 0x44, 0xd7, 0xa7,
0xa2, 0x42, 0xb1, 0x99, 0xcb, 0xe8, 0x9d, 0x18, 0x8e, 0x01, 0x63, 0xf3, 0x13, 0x8d, 0xbb, 0x5d,
0x79, 0xa2, 0x53, 0x71, 0x64, 0xd1, 0xfe, 0x67, 0x16, 0x2c, 0x60, 0x6d, 0xd2, 0x12, 0x12, 0x7b,
0xd6, 0xbd, 0xef, 0xd0, 0xcd, 0x7a, 0x57, 0x8f, 0x68, 0x2e, 0x42, 0x59, 0xdf, 0xc5, 0x78, 0xe1,
0xbb, 0x47, 0x4a, 0x4a, 0xe9, 0x48, 0x89, 0xfd, 0xf7, 0x2d, 0x98, 0xe7, 0x1b, 0x09, 0xda, 0xc1,
0x62, 0xf8, 0x7f, 0x1a, 0x66, 0xb9, 0x45, 0x20, 0xb4, 0x82, 0xe8, 0x68, 0xa2, 0x5a, 0x11, 0xca,
0x89, 0xf7, 0xa7, 0x1c, 0x93, 0x98, 0xdc, 0x47, 0xab, 0xcc, 0xef, 0x20, 0x34, 0xe7, 0xec, 0xcf,
0x9c, 0xeb, 0xfd, 0x29, 0x47, 0x23, 0xdf, 0xae, 0xc0, 0x34, 0x77, 0x22, 0xec, 0x87, 0x30, 0x6b,
0x34, 0x64, 0x44, 0x69, 0xea, 0x3c, 0x4a, 0x93, 0x09, 0x87, 0x16, 0x72, 0xc2, 0xa1, 0xff, 0xaa,
0x08, 0x84, 0x31, 0x4b, 0x6a, 0x35, 0x98, 0x17, 0x13, 0xf4, 0x0c, 0x9f, 0xb4, 0xee, 0xe8, 0x20,
0xb2, 0x0e, 0x44, 0x2b, 0xca, 0x88, 0x35, 0xdf, 0x32, 0x73, 0x30, 0x4c, 0xcd, 0x0a, 0x8b, 0x43,
0xd8, 0x06, 0xc2, 0xfb, 0xe6, 0xd3, 0x9e, 0x8b, 0x63, 0xbb, 0xe2, 0x68, 0x1c, 0x9d, 0xa1, 0xaf,
0x20, 0xbc, 0x56, 0x59, 0x4e, 0xaf, 0xef, 0xf4, 0x95, 0xeb, 0x3b, 0x93, 0x89, 0x84, 0x69, 0x7e,
0x53, 0xc5, 0xf4, 0x9b, 0x6e, 0xc2, 0xec, 0x90, 0xd9, 0xc9, 0xf1, 0xa0, 0xdb, 0x19, 0xb2, 0xd6,
0x85, 0x93, 0x6a, 0x00, 0xc9, 0x1a, 0x34, 0xa5, 0xeb, 0xa2, 0x9c, 0x33, 0x7e, 0x9e, 0x91, 0x81,
0x33, 0xfd, 0x9f, 0xc4, 0xc6, 0x6a, 0xd8, 0xd9, 0x04, 0xc0, 0x3c, 0xb1, 0x88, 0x71, 0x48, 0x67,
0xec, 0x8b, 0xe3, 0x3f, 0xda, 0x43, 0xf7, 0xb4, 0xe2, 0x64, 0x11, 0xf6, 0xdf, 0xb6, 0xa0, 0xc9,
0xd6, 0xcc, 0x60, 0xcb, 0x4f, 0x00, 0xa5, 0xe2, 0x0d, 0xb9, 0xd2, 0xa0, 0x25, 0xf7, 0xa0, 0x8a,
0xe5, 0x60, 0x44, 0x7d, 0xc1, 0x93, 0x2d, 0x93, 0x27, 0x13, 0x7d, 0xb2, 0x3f, 0xe5, 0x24, 0xc4,
0x1a, 0x47, 0xfe, 0x27, 0x0b, 0x6a, 0xa2, 0x95, 0xdf, 0x38, 0xf6, 0xd2, 0xd6, 0xce, 0x6b, 0x39,
0x27, 0x25, 0xc7, 0xb3, 0x77, 0x60, 0x6e, 0xe8, 0xc6, 0xe3, 0x90, 0xed, 0xe7, 0x46, 0xdc, 0x25,
0x0d, 0x66, 0x9b, 0x33, 0xaa, 0xce, 0xa8, 0x13, 0x7b, 0x83, 0x8e, 0xc4, 0x8a, 0x93, 0xd1, 0x3c,
0x14, 0xd3, 0x20, 0x51, 0xec, 0xf6, 0xa9, 0xd8, 0x77, 0x79, 0xc1, 0x6e, 0xc1, 0xb2, 0x18, 0x50,
0xca, 0xbe, 0xb6, 0xff, 0xc5, 0x2c, 0xac, 0x64, 0x50, 0x2a, 0x8f, 0x43, 0x04, 0x14, 0x06, 0xde,
0xf0, 0x24, 0x50, 0xce, 0x89, 0xa5, 0xc7, 0x1a, 0x0c, 0x14, 0xe9, 0xc3, 0x92, 0x34, 0x30, 0xd8,
0x9c, 0x26, 0x9b, 0x61, 0x01, 0x77, 0xb9, 0x0f, 0xcd, 0x25, 0x4c, 0x37, 0x28, 0xe1, 0xba, 0x10,
0xe7, 0xd7, 0x47, 0xce, 0xa0, 0xa5, 0x2c, 0x19, 0xa1, 0xac, 0x35, 0x6b, 0x87, 0xb5, 0xf5, 0xc1,
0x15, 0x6d, 0x19, 0xe6, 0xb8, 0x33, 0xb1, 0x36, 0x72, 0x09, 0x37, 0x24, 0x0e, 0xb5, 0x71, 0xb6,
0xbd, 0xd2, 0x1b, 0x8d, 0x0d, 0x1d, 0x0d, 0xb3, 0xd1, 0x2b, 0x2a, 0x26, 0x5f, 0xc2, 0xf2, 0x85,
0xeb, 0xc5, 0xb2, 0x5b, 0x9a, 0x6d, 0x51, 0xc6, 0x26, 0x37, 0xaf, 0x68, 0xf2, 0x39, 0xff, 0xd8,
0xd8, 0xa2, 0x26, 0xd4, 0xd8, 0xfe, 0x45, 0x01, 0x1a, 0x66, 0x3d, 0x8c, 0x4d, 0x85, 0xec, 0x4b,
0x1d, 0x28, 0xad, 0xd1, 0x14, 0x38, 0xeb, 0xdf, 0x17, 0xf2, 0xfc, 0x7b, 0xdd, 0xab, 0x2e, 0x5e,
0x15, 0xb8, 0x2b, 0xbd, 0x59, 0xe0, 0xae, 0x9c, 0x1b, 0xb8, 0x9b, 0x1c, 0xdf, 0x99, 0xfe, 0x4d,
0xe3, 0x3b, 0x33, 0xaf, 0x8d, 0xef, 0xb4, 0xff, 0xaf, 0x05, 0x24, 0xcb, 0xbd, 0xe4, 0x21, 0x0f,
0x69, 0xf8, 0x74, 0x20, 0x94, 0xd8, 0xef, 0xbf, 0x99, 0x04, 0xc8, 0xd5, 0x92, 0x5f, 0x33, 0x51,
0xd4, 0x93, 0x29, 0x74, 0xf3, 0x6a, 0xd6, 0xc9, 0x43, 0xa5, 0x82, 0x97, 0xa5, 0xab, 0x83, 0x97,
0xe5, 0xab, 0x83, 0x97, 0xd3, 0xe9, 0xe0, 0x65, 0xfb, 0x2f, 0x5b, 0xb0, 0x90, 0xc3, 0x66, 0xbf,
0xbb, 0x81, 0x33, 0xc6, 0x30, 0xb4, 0x4f, 0x41, 0x30, 0x86, 0x0e, 0x6c, 0xff, 0x05, 0x98, 0x35,
0x44, 0xeb, 0x77, 0xd7, 0x7e, 0xda, 0x42, 0xe4, 0x9c, 0x6d, 0xc0, 0xda, 0xff, 0xab, 0x00, 0x24,
0x2b, 0xde, 0x7f, 0xa2, 0x7d, 0xc8, 0xce, 0x53, 0x31, 0x67, 0x9e, 0xfe, 0xbf, 0xee, 0x3c, 0x1f,
0xc0, 0xbc, 0xc8, 0x10, 0xd3, 0x02, 0x59, 0x9c, 0x63, 0xb2, 0x08, 0x66, 0x23, 0x9b, 0x91, 0xe3,
0x8a, 0x91, 0x11, 0xa3, 0x6d, 0xbf, 0xa9, 0x00, 0xb2, 0xdd, 0x86, 0x96, 0x98, 0xa1, 0xbd, 0x73,
0xea, 0xc7, 0xc7, 0xe3, 0x13, 0x9e, 0x22, 0xe5, 0x05, 0xbe, 0xfd, 0xaf, 0x8b, 0xca, 0xcc, 0x47,
0xa4, 0x30, 0x28, 0x3e, 0x82, 0xba, 0xbe, 0x7d, 0x88, 0xe5, 0x48, 0xc5, 0x31, 0x99, 0x29, 0xa1,
0x53, 0x91, 0x5d, 0x68, 0xa0, 0x92, 0xec, 0xa9, 0xef, 0x0a, 0xf8, 0xdd, 0x6b, 0xe2, 0x33, 0xfb,
0x53, 0x4e, 0xea, 0x1b, 0xf2, 0x87, 0xd0, 0x30, 0x9d, 0x3f, 0x61, 0x95, 0xe4, 0x79, 0x03, 0xec,
0x73, 0x93, 0x98, 0x6c, 0x41, 0x33, 0xed, 0x3d, 0x8a, 0x4c, 0x89, 0x09, 0x15, 0x64, 0xc8, 0xc9,
0x3d, 0x71, 0x84, 0x58, 0xc6, 0xb8, 0xc9, 0x4d, 0xf3, 0x33, 0x6d, 0x9a, 0xd6, 0xf9, 0x1f, 0xed,
0x50, 0xf1, 0x8f, 0x01, 0x12, 0x18, 0x69, 0x42, 0xfd, 0xc9, 0xd1, 0xde, 0x61, 0x67, 0x67, 0x7f,
0xeb, 0xf0, 0x70, 0xef, 0xa0, 0x39, 0x45, 0x08, 0x34, 0x30, 0xcc, 0xb7, 0xab, 0x60, 0x16, 0x83,
0x89, 0xc0, 0x8a, 0x84, 0x15, 0xc8, 0x22, 0x34, 0x1f, 0x1d, 0xa6, 0xa0, 0xc5, 0xed, 0xaa, 0x92,
0x0f, 0x7b, 0x19, 0x16, 0x79, 0x06, 0xe0, 0x36, 0x67, 0x0f, 0x69, 0x9d, 0xfc, 0x63, 0x0b, 0x96,
0x52, 0x88, 0x24, 0x95, 0x86, 0x1b, 0x20, 0xa6, 0x55, 0x62, 0x02, 0xf1, 0x58, 0x40, 0xda, 0x9a,
0x29, 0x0d, 0x92, 0x45, 0x30, 0x9e, 0xd7, 0x6c, 0xd3, 0x94, 0x24, 0xe5, 0xa1, 0xec, 0x15, 0x9e,
0xa7, 0x88, 0x19, 0x8d, 0x46, 0xc7, 0x4f, 0x79, 0x66, 0xa1, 0x8e, 0x48, 0x8e, 0x64, 0xcd, 0x2e,
0xcb, 0x22, 0x73, 0x2b, 0x0c, 0x63, 0xc7, 0xec, 0x6f, 0x2e, 0xce, 0xfe, 0x1b, 0x45, 0x20, 0x3f,
0x1c, 0xd3, 0xf0, 0x12, 0xf3, 0x65, 0x54, 0xd4, 0x74, 0x25, 0x1d, 0x13, 0x9c, 0x1e, 0x8d, 0x4f,
0x3e, 0xa3, 0x97, 0x32, 0x83, 0xab, 0x90, 0x64, 0x70, 0xe5, 0x65, 0x51, 0x95, 0xae, 0xce, 0xa2,
0x2a, 0x5f, 0x95, 0x45, 0xf5, 0x3d, 0x98, 0xf5, 0xfa, 0x7e, 0xc0, 0x64, 0x9e, 0xd9, 0x09, 0x51,
0x6b, 0x7a, 0xb5, 0xc8, 0x7c, 0x6b, 0x01, 0x3c, 0x64, 0x30, 0x72, 0x3f, 0x21, 0xa2, 0xbd, 0x3e,
0x66, 0xec, 0xe9, 0x5a, 0x60, 0xaf, 0xd7, 0xa7, 0x07, 0x41, 0xd7, 0x8d, 0x83, 0x10, 0x03, 0x3b,
0xf2, 0x63, 0x06, 0x8f, 0xc8, 0x4d, 0x68, 0x44, 0xc1, 0x98, 0x59, 0x4e, 0x72, 0xac, 0x3c, 0x92,
0x54, 0xe7, 0xd0, 0x23, 0x3e, 0xe2, 0x75, 0x58, 0x18, 0x47, 0xb4, 0x33, 0xf4, 0xa2, 0x88, 0xed,
0x8e, 0xdd, 0xc0, 0x8f, 0xc3, 0x60, 0x20, 0xe2, 0x49, 0xf3, 0xe3, 0x88, 0x3e, 0xe6, 0x98, 0x1d,
0x8e, 0x20, 0x1f, 0x25, 0x5d, 0x1a, 0xb9, 0x5e, 0x18, 0xb5, 0x00, 0xbb, 0x24, 0x47, 0xca, 0xfa,
0x7d, 0xe4, 0x7a, 0xa1, 0xea, 0x0b, 0x2b, 0x44, 0x22, 0x43, 0x69, 0x1d, 0x2a, 0x12, 0xcf, 0xbc,
0xd8, 0xd3, 0x30, 0x18, 0x4a, 0x2f, 0x96, 0xfd, 0x26, 0x0d, 0x28, 0xc4, 0x81, 0xf0, 0x40, 0x0b,
0x71, 0x60, 0x7f, 0x0e, 0x35, 0x6d, 0x88, 0x98, 0x4e, 0x26, 0x2c, 0x26, 0xe1, 0xfe, 0x96, 0xb8,
0x83, 0xe2, 0xd3, 0xc1, 0xa3, 0x1e, 0x79, 0x1f, 0xe6, 0x7b, 0x5e, 0x48, 0x31, 0x33, 0xb0, 0x13,
0xd2, 0x73, 0x1a, 0x46, 0x32, 0x50, 0xd0, 0x54, 0x08, 0x87, 0xc3, 0xed, 0xfb, 0xb0, 0x60, 0xf0,
0x85, 0x12, 0x9b, 0x69, 0x4c, 0xa9, 0x92, 0xb1, 0x4a, 0x33, 0xdd, 0x4a, 0xe0, 0xec, 0xbf, 0x5a,
0x80, 0xe2, 0x7e, 0x30, 0xd2, 0x4f, 0x64, 0x2c, 0xf3, 0x44, 0x46, 0x58, 0x7c, 0x1d, 0x65, 0xd0,
0x89, 0x6d, 0xd9, 0x00, 0x92, 0x35, 0x68, 0xb8, 0xc3, 0xb8, 0x13, 0x07, 0xcc, 0xc2, 0xbd, 0x70,
0xc3, 0x1e, 0x97, 0x25, 0x5c, 0xcb, 0x14, 0x86, 0x2c, 0x42, 0x51, 0x19, 0x2a, 0x48, 0xc0, 0x8a,
0xcc, 0xbd, 0xc2, 0xb3, 0xe8, 0x4b, 0x11, 0x68, 0x14, 0x25, 0x26, 0xaa, 0xe6, 0xf7, 0xdc, 0xb7,
0xe5, 0xdb, 0x4d, 0x1e, 0x8a, 0x59, 0x9f, 0x8c, 0x7b, 0x87, 0x89, 0x31, 0xa7, 0xca, 0x7a, 0x08,
0xbd, 0x62, 0x9e, 0xcc, 0xff, 0xda, 0x82, 0x32, 0xce, 0x0d, 0xdb, 0x3a, 0xb9, 0x6e, 0x51, 0x87,
0x32, 0x38, 0x27, 0xb3, 0x4e, 0x1a, 0x4c, 0x6c, 0x23, 0x07, 0xb5, 0xa0, 0x06, 0xa4, 0xe7, 0xa1,
0xae, 0x42, 0x95, 0x97, 0x54, 0x3e, 0x25, 0x92, 0x24, 0x40, 0x72, 0x03, 0x4a, 0x67, 0xc1, 0x48,
0x7a, 0x17, 0x20, 0x4f, 0x54, 0x83, 0x91, 0x83, 0xf0, 0xa4, 0x3f, 0xac, 0x3e, 0x3e, 0x2c, 0x6e,
0xc1, 0xa5, 0xc1, 0xcc, 0x6a, 0x56, 0xd5, 0xea, 0xd3, 0x94, 0x82, 0xda, 0xcf, 0x60, 0x8e, 0x71,
0xaf, 0x16, 0xa4, 0x9e, 0xac, 0x47, 0xde, 0x63, 0xdb, 0x52, 0x77, 0x30, 0xee, 0x51, 0xdd, 0xc7,
0xc3, 0x20, 0xa4, 0x80, 0x4b, 0xeb, 0xc6, 0xfe, 0x97, 0x16, 0x97, 0x0a, 0x56, 0x2f, 0xb9, 0x03,
0x25, 0xa6, 0x0d, 0x52, 0x2e, 0xbd, 0x4a, 0xba, 0x60, 0x74, 0x0e, 0x52, 0x30, 0xa3, 0x07, 0xc3,
0x84, 0x7a, 0xed, 0x3c, 0x48, 0x98, 0x38, 0x48, 0x6a, 0x64, 0x29, 0xbf, 0x22, 0x05, 0x25, 0xeb,
0xda, 0x19, 0x4b, 0xc9, 0xd0, 0x30, 0x72, 0x17, 0xec, 0xf5, 0xa9, 0x76, 0xb6, 0xf2, 0x73, 0x0b,
0x66, 0x8d, 0x3e, 0x91, 0x55, 0xa8, 0x0d, 0xdc, 0x28, 0x16, 0x07, 0xdf, 0x62, 0xe5, 0x75, 0x90,
0xce, 0x43, 0x05, 0xf3, 0x18, 0x46, 0xc5, 0xea, 0x8b, 0x7a, 0xac, 0xfe, 0x2e, 0x54, 0x93, 0x24,
0x64, 0xb3, 0x53, 0xac, 0x45, 0x99, 0x7e, 0x92, 0x10, 0x25, 0xd1, 0xe0, 0xb2, 0x16, 0x0d, 0xb6,
0xef, 0x43, 0x4d, 0xa3, 0xd7, 0xa3, 0xb9, 0x96, 0x11, 0xcd, 0x55, 0xb9, 0x59, 0x85, 0x24, 0x37,
0xcb, 0xfe, 0xb6, 0x00, 0xb3, 0x8c, 0xbd, 0x3d, 0xbf, 0x7f, 0x14, 0x0c, 0xbc, 0xee, 0x25, 0xb2,
0x95, 0xe4, 0x64, 0xb1, 0x1b, 0x48, 0x36, 0x37, 0xc1, 0x4c, 0xa0, 0x64, 0x0c, 0x49, 0x48, 0xbf,
0x2a, 0x33, 0xf5, 0xc0, 0x84, 0xeb, 0xc4, 0x8d, 0x84, 0xc4, 0x09, 0x6b, 0xd4, 0x00, 0x32, 0x21,
0x66, 0x00, 0xcc, 0xb4, 0x1b, 0x7a, 0x83, 0x81, 0xc7, 0x69, 0xb9, 0xaf, 0x92, 0x87, 0x62, 0x6d,
0xf6, 0xbc, 0xc8, 0x3d, 0x49, 0xce, 0xe1, 0x54, 0x19, 0x03, 0x5d, 0xee, 0x4b, 0x2d, 0xd0, 0x35,
0x8d, 0x2a, 0xcb, 0x04, 0xa6, 0x17, 0x72, 0x26, 0xb3, 0x90, 0xf6, 0xbf, 0x2f, 0x40, 0x4d, 0x63,
0x0b, 0x71, 0xf8, 0x6c, 0x6a, 0x65, 0x0d, 0x22, 0xf1, 0x86, 0xe7, 0xab, 0x41, 0xc8, 0x4d, 0xb3,
0x45, 0x0c, 0x76, 0xa3, 0xb0, 0x1b, 0xec, 0x73, 0x1d, 0xaa, 0x8c, 0xed, 0x3f, 0x44, 0x37, 0x5b,
0x64, 0xff, 0x2b, 0x80, 0xc4, 0x6e, 0x22, 0xb6, 0x9c, 0x60, 0x11, 0xf0, 0xda, 0xe3, 0xea, 0x7b,
0x50, 0x17, 0xd5, 0xe0, 0xfa, 0xe2, 0x80, 0x13, 0xc1, 0x33, 0xd6, 0xde, 0x31, 0x28, 0xe5, 0x97,
0x9b, 0xf2, 0xcb, 0xca, 0x55, 0x5f, 0x4a, 0x4a, 0xfb, 0xa1, 0xca, 0x02, 0x78, 0x18, 0xba, 0xa3,
0x33, 0xa9, 0x4c, 0xee, 0xc2, 0x82, 0xd4, 0x19, 0x63, 0xdf, 0xf5, 0xfd, 0x60, 0xec, 0x77, 0xa9,
0x4c, 0xe1, 0xca, 0x43, 0xd9, 0x3d, 0x95, 0xf0, 0x8b, 0x15, 0x91, 0x35, 0x28, 0x73, 0x5b, 0x82,
0x6f, 0x5e, 0xf9, 0xea, 0x83, 0x93, 0x90, 0x3b, 0x50, 0xe6, 0x26, 0x45, 0x61, 0xa2, 0xc0, 0x73,
0x02, 0x7b, 0x0d, 0xe6, 0x30, 0x9f, 0xdb, 0xd4, 0x7b, 0xe6, 0xc6, 0x37, 0xdd, 0xc5, 0x8c, 0x6f,
0x7b, 0x11, 0xc8, 0x21, 0x97, 0x27, 0xfd, 0x2c, 0xef, 0xd7, 0x45, 0xa8, 0x69, 0x60, 0xa6, 0x97,
0xf0, 0x00, 0xa6, 0xd3, 0xf3, 0xdc, 0x21, 0x8d, 0x69, 0x28, 0x64, 0x28, 0x05, 0x65, 0x74, 0xee,
0x79, 0xbf, 0x13, 0x8c, 0xe3, 0x4e, 0x8f, 0xf6, 0x43, 0xca, 0xb7, 0x73, 0xb6, 0x37, 0x1a, 0x50,
0x46, 0xc7, 0xb8, 0x58, 0xa3, 0xe3, 0x47, 0x26, 0x29, 0xa8, 0x3c, 0x99, 0xe3, 0x73, 0x54, 0x4a,
0x4e, 0xe6, 0xf8, 0x8c, 0xa4, 0x35, 0x6a, 0x39, 0x47, 0xa3, 0x7e, 0x0c, 0xcb, 0x5c, 0x77, 0x0a,
0xad, 0xd1, 0x49, 0x31, 0xd6, 0x04, 0x2c, 0x59, 0x83, 0x26, 0xeb, 0xb3, 0x14, 0x8b, 0xc8, 0xfb,
0x9a, 0xcb, 0x96, 0xe5, 0x64, 0xe0, 0x8c, 0x16, 0xc3, 0xc5, 0x3a, 0x2d, 0x4f, 0x8f, 0xc8, 0xc0,
0x91, 0xd6, 0x7d, 0x69, 0xd2, 0x56, 0x05, 0x6d, 0x0a, 0x4e, 0xee, 0xc1, 0xca, 0x90, 0xf6, 0x3c,
0xd7, 0xac, 0x02, 0xa3, 0x37, 0x3c, 0xeb, 0x6a, 0x12, 0x9a, 0xb5, 0xc2, 0x66, 0xe1, 0xeb, 0x60,
0x78, 0xe2, 0xf1, 0x0d, 0x8d, 0x07, 0xb6, 0x4b, 0x4e, 0x06, 0x6e, 0xcf, 0x42, 0xed, 0x38, 0x0e,
0x46, 0x72, 0xe9, 0x1b, 0x50, 0xe7, 0x45, 0x91, 0xb0, 0xf7, 0x16, 0x5c, 0x43, 0x5e, 0x7d, 0x1a,
0x8c, 0x82, 0x41, 0xd0, 0xbf, 0x34, 0xdc, 0xd3, 0xff, 0x68, 0xc1, 0x82, 0x81, 0x4d, 0xfc, 0x53,
0x8c, 0xa5, 0xc9, 0x4c, 0x2b, 0xce, 0xde, 0xf3, 0xda, 0x76, 0xc0, 0x09, 0xf9, 0xb1, 0xc5, 0x33,
0x91, 0x7c, 0xb5, 0x95, 0x5c, 0xc0, 0x92, 0x1f, 0x72, 0x5e, 0x6f, 0x65, 0x79, 0x5d, 0x7c, 0x2f,
0xef, 0x5f, 0xc9, 0x2a, 0xfe, 0x50, 0x24, 0xb3, 0xf4, 0xc4, 0xa0, 0x8b, 0x66, 0x02, 0x82, 0x1e,
0xce, 0x90, 0x3d, 0xe8, 0x2a, 0x60, 0x64, 0xff, 0xd4, 0x02, 0x48, 0x7a, 0x87, 0x29, 0x10, 0x6a,
0x4b, 0xe3, 0x97, 0xfd, 0xb4, 0xed, 0xeb, 0x5d, 0xa8, 0xab, 0x53, 0xec, 0x64, 0x97, 0xac, 0x49,
0x18, 0xb3, 0x2a, 0x6e, 0xc3, 0x5c, 0x7f, 0x10, 0x9c, 0xa0, 0xf5, 0x82, 0x19, 0xa0, 0x91, 0x48,
0x5b, 0x6c, 0x70, 0xf0, 0x03, 0x01, 0x4d, 0xb6, 0xd4, 0x92, 0xbe, 0xa5, 0xe6, 0x6f, 0x90, 0x7f,
0xb3, 0xa0, 0x8e, 0x12, 0x93, 0x99, 0x98, 0x28, 0xe1, 0x64, 0x33, 0xa3, 0xce, 0x27, 0x9c, 0xdc,
0xa1, 0x65, 0x7e, 0x74, 0x65, 0x64, 0xf3, 0x3e, 0x34, 0x42, 0xae, 0x2b, 0xa5, 0x22, 0x2d, 0xbd,
0x46, 0x91, 0xce, 0x86, 0xc6, 0x6e, 0xfc, 0x1e, 0x34, 0xdd, 0xde, 0x39, 0x0d, 0x63, 0x0f, 0x23,
0x3d, 0x68, 0x3a, 0xf1, 0xc1, 0xcd, 0x69, 0x70, 0xb4, 0x50, 0x6e, 0xc3, 0x9c, 0x48, 0x20, 0x55,
0x94, 0xe2, 0xda, 0x4c, 0x02, 0x66, 0x84, 0xf6, 0xcf, 0xe4, 0xa9, 0xa5, 0xb9, 0xb2, 0x93, 0x67,
0x44, 0x1f, 0x5d, 0x21, 0x35, 0xba, 0xef, 0x89, 0x13, 0xc4, 0x9e, 0x0c, 0x27, 0x15, 0xb5, 0x74,
0xa8, 0x9e, 0x38, 0xf1, 0x35, 0xa7, 0xb4, 0xf4, 0x26, 0x53, 0x6a, 0xff, 0xd2, 0x82, 0x99, 0xfd,
0x60, 0xb4, 0x2f, 0x12, 0xc3, 0x50, 0x3c, 0x54, 0xe6, 0xb6, 0x2c, 0xbe, 0x26, 0x65, 0x2c, 0xd7,
0x02, 0x99, 0x4d, 0x5b, 0x20, 0x7f, 0x16, 0xde, 0xc2, 0x60, 0x66, 0x18, 0x8c, 0x82, 0x90, 0x89,
0xa8, 0x3b, 0xe0, 0xe6, 0x46, 0xe0, 0xc7, 0x67, 0x52, 0x85, 0xbe, 0x8e, 0x04, 0x23, 0x0c, 0xcc,
0x71, 0xe6, 0x7e, 0x89, 0xb0, 0x98, 0xb8, 0x66, 0xcd, 0x22, 0xec, 0x3f, 0x80, 0x2a, 0x7a, 0x13,
0x38, 0xac, 0x0f, 0xa0, 0x7a, 0x16, 0x8c, 0x3a, 0x67, 0x9e, 0x1f, 0x4b, 0x91, 0x6f, 0x24, 0x66,
0xfe, 0x3e, 0x4e, 0x88, 0x22, 0xb0, 0xff, 0xee, 0x34, 0xcc, 0x3c, 0xf2, 0xcf, 0x03, 0xaf, 0x8b,
0x27, 0xa4, 0x43, 0x3a, 0x0c, 0x64, 0x1e, 0x3b, 0xfb, 0x4d, 0xae, 0xc3, 0x0c, 0x26, 0x6e, 0x8e,
0x38, 0xd3, 0xd6, 0x79, 0x26, 0x84, 0x00, 0xe1, 0x7d, 0xb6, 0xe4, 0x36, 0x11, 0x17, 0x2a, 0x0d,
0xc2, 0xfc, 0xac, 0x50, 0xbf, 0x0d, 0x24, 0x4a, 0xc9, 0x3d, 0x81, 0xb2, 0x76, 0x4f, 0x80, 0xb5,
0x25, 0x12, 0xd9, 0x78, 0xa6, 0x13, 0x6f, 0x4b, 0x80, 0xd0, 0x37, 0x0c, 0x29, 0x0f, 0x46, 0x2b,
0x23, 0x8b, 0xf9, 0x86, 0x3a, 0x90, 0x19, 0x62, 0xfc, 0x03, 0x4e, 0xc3, 0x37, 0x00, 0x1d, 0xc4,
0x4c, 0xd1, 0xf4, 0x45, 0x30, 0x7e, 0x11, 0x2f, 0x0d, 0x66, 0xfa, 0xbb, 0x47, 0x95, 0x9a, 0xe5,
0xe3, 0x00, 0x7e, 0x63, 0x2a, 0x0d, 0xd7, 0x3c, 0x4a, 0x9e, 0x63, 0x2b, 0x3d, 0x4a, 0xc6, 0x30,
0xee, 0x60, 0x70, 0xe2, 0x76, 0x5f, 0xe0, 0x3d, 0x40, 0x3c, 0xb3, 0xac, 0x3a, 0x26, 0x10, 0xd3,
0xd1, 0x92, 0x55, 0xc5, 0x9c, 0x91, 0x92, 0xa3, 0x83, 0xc8, 0x26, 0xd4, 0xd0, 0x8b, 0x16, 0xeb,
0xda, 0xc0, 0x75, 0x6d, 0xea, 0x6e, 0x36, 0xae, 0xac, 0x4e, 0xa4, 0x9f, 0xde, 0xce, 0x65, 0xb2,
0x5e, 0xdd, 0x5e, 0x4f, 0x1c, 0x7a, 0x37, 0x79, 0x44, 0x40, 0x01, 0xd8, 0x8e, 0x2e, 0x26, 0x8c,
0x13, 0xcc, 0x23, 0x81, 0x01, 0x23, 0x37, 0xa0, 0xc2, 0x3c, 0xbc, 0x91, 0xeb, 0xf5, 0x30, 0x4d,
0x84, 0x3b, 0x9a, 0x0a, 0xc6, 0xea, 0x90, 0xbf, 0x71, 0xab, 0x5c, 0xc0, 0x59, 0x31, 0x60, 0x6c,
0x6e, 0x54, 0x79, 0x98, 0xa4, 0xc9, 0x9a, 0x40, 0xf2, 0x21, 0x1e, 0x3d, 0xc6, 0x14, 0x73, 0x61,
0x1b, 0x9b, 0x6f, 0x89, 0x31, 0x0b, 0xa6, 0x95, 0x7f, 0x8f, 0x19, 0x89, 0xc3, 0x29, 0xed, 0x2d,
0xa8, 0xeb, 0x60, 0x52, 0x81, 0xd2, 0x93, 0xa3, 0xbd, 0xc3, 0xe6, 0x14, 0xa9, 0xc1, 0xcc, 0xf1,
0xde, 0xd3, 0xa7, 0x07, 0x7b, 0xbb, 0x4d, 0x8b, 0xd4, 0xa1, 0xa2, 0x72, 0x07, 0x0b, 0xac, 0xb4,
0xb5, 0xb3, 0xb3, 0x77, 0xf4, 0x74, 0x6f, 0xb7, 0x59, 0xb4, 0x63, 0x20, 0x5b, 0xbd, 0x9e, 0xa8,
0x45, 0xc5, 0x39, 0x12, 0x7e, 0xb6, 0x0c, 0x7e, 0xce, 0xe1, 0xa9, 0x42, 0x3e, 0x4f, 0xbd, 0x76,
0xe6, 0xed, 0x3d, 0xa8, 0x1d, 0x69, 0x97, 0xde, 0x50, 0xbc, 0xe4, 0x75, 0x37, 0x21, 0x96, 0x1a,
0x44, 0xeb, 0x4e, 0x41, 0xef, 0x8e, 0xfd, 0x4f, 0x2d, 0x7e, 0xfb, 0x44, 0x75, 0x9f, 0xb7, 0x6d,
0x43, 0x5d, 0x45, 0xfb, 0x92, 0xb4, 0x60, 0x03, 0xc6, 0x68, 0xb0, 0x2b, 0x9d, 0xe0, 0xf4, 0x34,
0xa2, 0x32, 0x89, 0xcf, 0x80, 0x49, 0xbb, 0x86, 0x59, 0x4a, 0x1e, 0x6f, 0x21, 0x12, 0xc9, 0x7c,
0x19, 0x38, 0xd3, 0xf2, 0x22, 0xa6, 0x24, 0xd3, 0x17, 0x55, 0x59, 0x65, 0x2f, 0xa7, 0x67, 0x79,
0x0d, 0x2a, 0xaa, 0x5e, 0x53, 0x81, 0x49, 0x4a, 0x85, 0x67, 0x8a, 0x12, 0xfd, 0x1d, 0xa3, 0xd3,
0x5c, 0x69, 0x67, 0x11, 0x64, 0x1d, 0xc8, 0xa9, 0x17, 0xa6, 0xc9, 0x8b, 0x48, 0x9e, 0x83, 0xb1,
0x9f, 0xc3, 0x82, 0x64, 0x24, 0xcd, 0xe0, 0x32, 0x17, 0xd1, 0xba, 0x4a, 0x7c, 0x0a, 0x59, 0xf1,
0xb1, 0x7f, 0x55, 0x84, 0x19, 0xb1, 0xd2, 0x99, 0x8b, 0x93, 0x7c, 0x9d, 0x0d, 0x18, 0x69, 0x19,
0x17, 0xab, 0x50, 0xd6, 0x84, 0xd2, 0xcc, 0xa8, 0xc5, 0x62, 0x9e, 0x5a, 0x24, 0x50, 0x1a, 0xb9,
0xf1, 0x19, 0x46, 0x04, 0xaa, 0x0e, 0xfe, 0x96, 0xa1, 0xb1, 0xb2, 0x19, 0x1a, 0xcb, 0xbb, 0x26,
0xca, 0x77, 0xfc, 0xec, 0x35, 0xd1, 0xeb, 0x50, 0xc5, 0x4e, 0x68, 0x47, 0x99, 0x09, 0x80, 0x71,
0x2f, 0x2f, 0xa0, 0x6c, 0x8b, 0x7b, 0x0e, 0x09, 0xe4, 0x3b, 0x28, 0xe2, 0x8f, 0x60, 0x9a, 0x27,
0xda, 0x8b, 0x24, 0xcd, 0xeb, 0xf2, 0x38, 0x87, 0xd3, 0xc9, 0xbf, 0x3c, 0xdb, 0xc3, 0x11, 0xb4,
0xfa, 0x35, 0xbd, 0x9a, 0x79, 0x4d, 0x4f, 0x0f, 0xda, 0xd5, 0xcd, 0xa0, 0x9d, 0xfd, 0x00, 0x66,
0x8d, 0xea, 0x98, 0xca, 0x10, 0x49, 0x9e, 0xcd, 0x29, 0x32, 0x0b, 0xd5, 0x47, 0x87, 0x9d, 0x07,
0x07, 0x8f, 0x1e, 0xee, 0x3f, 0x6d, 0x5a, 0xac, 0x78, 0xfc, 0x6c, 0x67, 0x67, 0x6f, 0x6f, 0x17,
0x55, 0x08, 0xc0, 0xf4, 0x83, 0xad, 0x47, 0x07, 0xa8, 0x40, 0x76, 0x39, 0x6f, 0x8b, 0xba, 0x54,
0x08, 0xfd, 0xf7, 0x81, 0x48, 0x97, 0x14, 0x93, 0x3d, 0x46, 0x03, 0x1a, 0xcb, 0xfc, 0xe3, 0x79,
0x81, 0x79, 0xa4, 0x10, 0x32, 0x7d, 0x3e, 0xa9, 0x25, 0x11, 0x11, 0x31, 0x49, 0x69, 0x11, 0x11,
0xa4, 0x8e, 0xc2, 0xdb, 0x6d, 0x68, 0xed, 0x52, 0x56, 0xdb, 0xd6, 0x60, 0x90, 0xea, 0x0e, 0xf3,
0x2b, 0x72, 0x70, 0xc2, 0xe9, 0xf8, 0x21, 0x2c, 0x6d, 0xf1, 0x54, 0xe3, 0xdf, 0x55, 0x26, 0x9a,
0xdd, 0x82, 0xe5, 0x74, 0x95, 0xa2, 0xb1, 0x07, 0x30, 0xbf, 0x4b, 0x4f, 0xc6, 0xfd, 0x03, 0x7a,
0x9e, 0x34, 0x44, 0xa0, 0x14, 0x9d, 0x05, 0x17, 0x62, 0x7e, 0xf0, 0x37, 0x79, 0x1b, 0x60, 0xc0,
0x68, 0x3a, 0xd1, 0x88, 0x76, 0xe5, 0xe5, 0x2e, 0x84, 0x1c, 0x8f, 0x68, 0xd7, 0xfe, 0x18, 0x88,
0x5e, 0x8f, 0x98, 0x2f, 0x66, 0x16, 0x8c, 0x4f, 0x3a, 0xd1, 0x65, 0x14, 0xd3, 0xa1, 0xbc, 0xb5,
0xa6, 0x83, 0xec, 0xdb, 0x50, 0x3f, 0x72, 0x2f, 0x1d, 0xfa, 0x95, 0xb8, 0x40, 0xbc, 0x02, 0x33,
0x23, 0xf7, 0x92, 0xb1, 0xa0, 0x8a, 0x51, 0x22, 0xda, 0xfe, 0x3f, 0x05, 0x98, 0xe6, 0x94, 0xac,
0xd6, 0x1e, 0x8d, 0x62, 0xcf, 0x47, 0x49, 0x93, 0xb5, 0x6a, 0xa0, 0x8c, 0x6c, 0x17, 0x72, 0x64,
0x5b, 0x38, 0xd0, 0xf2, 0xa2, 0x8c, 0x10, 0x60, 0x03, 0xc6, 0x24, 0x2d, 0x49, 0x29, 0xe5, 0x91,
0xac, 0x04, 0x90, 0x0a, 0x67, 0x27, 0xc6, 0x07, 0xef, 0x9f, 0x54, 0x5b, 0x42, 0x8c, 0x75, 0x50,
0xae, 0x89, 0x33, 0xc3, 0xa5, 0x3d, 0x63, 0xe2, 0x64, 0x4c, 0x99, 0xca, 0x1b, 0x98, 0x32, 0xdc,
0xab, 0x7e, 0x9d, 0x29, 0x03, 0x6f, 0x60, 0xca, 0xd8, 0x04, 0x9a, 0x78, 0x03, 0x97, 0x19, 0xcb,
0x92, 0x77, 0xff, 0x81, 0x05, 0x4d, 0xc1, 0x45, 0x0a, 0x47, 0xde, 0x35, 0x9c, 0x82, 0xdc, 0x0b,
0x21, 0x37, 0x61, 0x16, 0x4d, 0x75, 0xa5, 0x02, 0xc4, 0x21, 0x83, 0x01, 0x64, 0xe3, 0x90, 0x09,
0x09, 0x43, 0x6f, 0x20, 0x16, 0x45, 0x07, 0x49, 0x2d, 0x12, 0xba, 0x22, 0x35, 0xd2, 0x72, 0x54,
0xd9, 0xfe, 0x85, 0x05, 0xf3, 0x5a, 0x87, 0x05, 0x17, 0xde, 0x07, 0x29, 0x0d, 0x3c, 0x88, 0xcf,
0x25, 0x77, 0xc5, 0x14, 0x9b, 0xe4, 0x33, 0x83, 0x18, 0x17, 0xd3, 0xbd, 0xc4, 0x0e, 0x46, 0xe3,
0xa1, 0xd8, 0x55, 0x74, 0x10, 0x63, 0xa4, 0x0b, 0x4a, 0x5f, 0x28, 0x12, 0xbe, 0xaf, 0x19, 0x30,
0x0c, 0x67, 0x32, 0x17, 0x43, 0x11, 0x95, 0x44, 0x38, 0x53, 0x07, 0xda, 0xff, 0xc5, 0x82, 0x05,
0xee, 0x2b, 0x0a, 0xff, 0x5c, 0xdd, 0x35, 0x9c, 0xe6, 0x2e, 0x33, 0x97, 0xc8, 0xfd, 0x29, 0x47,
0x94, 0xc9, 0x0f, 0xde, 0xd0, 0xbf, 0x55, 0xf9, 0x9a, 0x13, 0xd6, 0xa2, 0x98, 0xb7, 0x16, 0xaf,
0x99, 0xe9, 0xbc, 0xc8, 0x72, 0x39, 0x37, 0xb2, 0xbc, 0x3d, 0x03, 0xe5, 0xa8, 0x1b, 0x8c, 0xa8,
0xbd, 0x0c, 0x8b, 0xe6, 0xe0, 0x84, 0x0a, 0xfa, 0xa9, 0x05, 0xad, 0x07, 0xfc, 0x70, 0xc7, 0xf3,
0xfb, 0xfb, 0x5e, 0x14, 0x07, 0xa1, 0xba, 0x92, 0x7d, 0x03, 0x20, 0x8a, 0xdd, 0x30, 0xe6, 0x57,
0x09, 0x44, 0xbc, 0x36, 0x81, 0xb0, 0x3e, 0x52, 0xbf, 0xc7, 0xb1, 0x7c, 0x6d, 0x54, 0x39, 0x63,
0x54, 0x09, 0x6f, 0xd6, 0x30, 0x4d, 0x6e, 0xf1, 0xfc, 0x65, 0x66, 0x3c, 0xd1, 0x73, 0xd4, 0xeb,
0xdc, 0x4d, 0x4c, 0x41, 0xed, 0xff, 0x6c, 0xc1, 0x5c, 0xd2, 0x49, 0x3c, 0x67, 0x37, 0xb5, 0x83,
0xb0, 0x47, 0x12, 0xed, 0x20, 0x23, 0xc9, 0x1e, 0x33, 0x50, 0x44, 0xdf, 0x34, 0x08, 0x4a, 0xac,
0x28, 0x05, 0x63, 0x69, 0xf1, 0xe9, 0x20, 0x9e, 0x8d, 0xc8, 0x4c, 0x23, 0x61, 0xe6, 0x89, 0x12,
0xde, 0x04, 0x19, 0xc6, 0xf8, 0x15, 0x8f, 0x8a, 0xcb, 0x22, 0x69, 0x72, 0xdb, 0x62, 0x06, 0xa1,
0x68, 0x57, 0xe8, 0x7b, 0x6e, 0x85, 0xcf, 0x8f, 0xda, 0x73, 0xff, 0x96, 0x05, 0xd7, 0x72, 0x26,
0x5e, 0x48, 0xcd, 0x2e, 0xcc, 0x9f, 0x2a, 0xa4, 0x9c, 0x1c, 0x2e, 0x3a, 0xcb, 0xf2, 0xa0, 0xd8,
0x9c, 0x10, 0x27, 0xfb, 0x81, 0x32, 0x14, 0xf9, 0x74, 0x1b, 0xf9, 0xbe, 0x59, 0x84, 0x7d, 0x04,
0xed, 0xbd, 0x97, 0x4c, 0x08, 0x77, 0xf4, 0x97, 0x85, 0x24, 0x2f, 0x6c, 0x66, 0x94, 0xcc, 0xd5,
0x91, 0x87, 0x53, 0x98, 0x35, 0xea, 0x22, 0xdf, 0x7f, 0xd3, 0x4a, 0x74, 0x79, 0x91, 0x6b, 0xc5,
0x9f, 0x46, 0x92, 0x59, 0xc7, 0x1a, 0xc8, 0x3e, 0x87, 0xb9, 0xc7, 0xe3, 0x41, 0xec, 0x25, 0xcf,
0x24, 0x91, 0x1f, 0x88, 0x8f, 0xb0, 0x0a, 0x39, 0x75, 0xb9, 0x4d, 0xe9, 0x74, 0x6c, 0xc6, 0x86,
0xac, 0xa6, 0x4e, 0xb6, 0xc5, 0x2c, 0xc2, 0xbe, 0x06, 0x2b, 0x49, 0x93, 0x7c, 0xee, 0xa4, 0xa2,
0xfe, 0x99, 0xc5, 0xd3, 0x67, 0xcc, 0x57, 0x9b, 0xc8, 0x43, 0x58, 0x88, 0x3c, 0xbf, 0x3f, 0xa0,
0x7a, 0x3d, 0x91, 0x98, 0x89, 0x25, 0xb3, 0x7b, 0xe2, 0x65, 0x27, 0x27, 0xef, 0x0b, 0xc6, 0x20,
0xf9, 0x1d, 0x4d, 0x18, 0x24, 0x35, 0x25, 0x79, 0x03, 0xf8, 0x14, 0x1a, 0x66, 0x63, 0xe4, 0x9e,
0x48, 0x18, 0x4e, 0x7a, 0xa6, 0x1f, 0x0f, 0x98, 0x9c, 0x61, 0x50, 0xda, 0xdf, 0x5a, 0xd0, 0x72,
0x28, 0x63, 0x63, 0xaa, 0x35, 0x2a, 0xb8, 0xe7, 0x7e, 0xa6, 0xda, 0xc9, 0x03, 0x56, 0x89, 0xc8,
0x72, 0xac, 0xeb, 0x13, 0x17, 0x65, 0x7f, 0x2a, 0x67, 0x54, 0xdb, 0x15, 0x98, 0x16, 0xe3, 0x5b,
0x81, 0x25, 0xd1, 0x25, 0xd9, 0x9d, 0x24, 0xb6, 0x6c, 0x34, 0x6a, 0xc4, 0x96, 0xdb, 0xd0, 0xe2,
0x77, 0xe5, 0xf5, 0x71, 0xf0, 0x0f, 0xd7, 0x5e, 0x41, 0x4d, 0x7b, 0x31, 0x80, 0xac, 0xc0, 0xc2,
0xf3, 0x47, 0x4f, 0x0f, 0xf7, 0x8e, 0x8f, 0x3b, 0x47, 0xcf, 0xb6, 0x3f, 0xdb, 0xfb, 0xbc, 0xb3,
0xbf, 0x75, 0xbc, 0xdf, 0x9c, 0x22, 0xcb, 0x40, 0x0e, 0xf7, 0x8e, 0x9f, 0xee, 0xed, 0x1a, 0x70,
0x8b, 0xdc, 0x80, 0xf6, 0xb3, 0xc3, 0x67, 0xc7, 0x7b, 0xbb, 0x9d, 0xbc, 0xef, 0x0a, 0xe4, 0x6d,
0xb8, 0x26, 0xf0, 0x39, 0x9f, 0x17, 0x37, 0xbf, 0x2d, 0x42, 0x83, 0x67, 0xf1, 0xf0, 0xc7, 0xbe,
0x68, 0x48, 0x1e, 0xc3, 0x8c, 0x78, 0x35, 0x8e, 0xc8, 0xf9, 0x34, 0xdf, 0xa9, 0x6b, 0x2f, 0xa7,
0xc1, 0x62, 0x12, 0x16, 0xfe, 0xd2, 0x2f, 0xff, 0xc7, 0xdf, 0x29, 0xcc, 0x92, 0xda, 0xc6, 0xf9,
0x87, 0x1b, 0x7d, 0xea, 0x47, 0xac, 0x8e, 0x3f, 0x06, 0x48, 0xde, 0x42, 0x23, 0x2d, 0xe5, 0x84,
0xa6, 0x1e, 0x8a, 0x6b, 0x5f, 0xcb, 0xc1, 0x88, 0x7a, 0xaf, 0x61, 0xbd, 0x0b, 0x76, 0x83, 0xd5,
0xeb, 0xf9, 0x5e, 0xcc, 0xdf, 0x45, 0xfb, 0xc4, 0x5a, 0x23, 0x3d, 0xa8, 0xeb, 0xaf, 0x94, 0x11,
0x19, 0x1f, 0xcf, 0x79, 0x67, 0xad, 0xfd, 0x56, 0x2e, 0x4e, 0x2e, 0x20, 0xb6, 0xb1, 0x64, 0x37,
0x59, 0x1b, 0x63, 0xa4, 0x48, 0x5a, 0x19, 0x70, 0xb6, 0x4e, 0x1e, 0x23, 0x23, 0xd7, 0x35, 0x4e,
0xcb, 0x3c, 0x85, 0xd6, 0x7e, 0x7b, 0x02, 0x56, 0xb4, 0xf5, 0x36, 0xb6, 0xb5, 0x62, 0x13, 0xd6,
0x56, 0x17, 0x69, 0xe4, 0x53, 0x68, 0x9f, 0x58, 0x6b, 0x9b, 0x7f, 0xef, 0x16, 0x54, 0xd5, 0xb9,
0x19, 0xf9, 0x12, 0x66, 0x8d, 0x34, 0x2b, 0x22, 0x87, 0x91, 0x97, 0x95, 0xd5, 0xbe, 0x9e, 0x8f,
0x14, 0x0d, 0xdf, 0xc0, 0x86, 0x5b, 0x64, 0x99, 0x35, 0x2c, 0xf2, 0x94, 0x36, 0x30, 0x61, 0x90,
0xdf, 0x37, 0x7a, 0xa1, 0x89, 0x2f, 0x6f, 0xec, 0x7a, 0x5a, 0xa2, 0x8c, 0xd6, 0xde, 0x9e, 0x80,
0x15, 0xcd, 0x5d, 0xc7, 0xe6, 0x96, 0xc9, 0xa2, 0xde, 0x9c, 0x3a, 0xcf, 0xa2, 0x78, 0xc9, 0x4e,
0x7f, 0xa7, 0x8b, 0xbc, 0xad, 0x18, 0x2b, 0xef, 0xfd, 0x2e, 0xc5, 0x22, 0xd9, 0x47, 0xbc, 0xec,
0x16, 0x36, 0x45, 0x08, 0x2e, 0x9f, 0xfe, 0x4c, 0x17, 0x39, 0x81, 0x9a, 0xf6, 0xfe, 0x0c, 0xb9,
0x36, 0xf1, 0xad, 0x9c, 0x76, 0x3b, 0x0f, 0x95, 0x37, 0x14, 0xbd, 0xfe, 0x0d, 0xb6, 0x2f, 0xff,
0x18, 0xaa, 0xea, 0x45, 0x13, 0xb2, 0xa2, 0xbd, 0x30, 0xa3, 0xbf, 0xc0, 0xd2, 0x6e, 0x65, 0x11,
0x79, 0xcc, 0xa7, 0xd7, 0xce, 0x98, 0xef, 0x39, 0xd4, 0xb4, 0x57, 0x4b, 0xd4, 0x00, 0xb2, 0x2f,
0xa3, 0xa8, 0x01, 0xe4, 0x3c, 0x72, 0x62, 0xcf, 0x63, 0x13, 0x35, 0x52, 0x45, 0xfe, 0x8e, 0x5f,
0x06, 0x11, 0x39, 0x80, 0x25, 0xa1, 0xa6, 0x4e, 0xe8, 0x77, 0x59, 0x86, 0x9c, 0xa7, 0xd1, 0xee,
0x5a, 0xe4, 0x3e, 0x54, 0xe4, 0xe3, 0x34, 0x64, 0x39, 0xff, 0x91, 0x9d, 0xf6, 0x4a, 0x06, 0x2e,
0xcc, 0x93, 0xcf, 0x01, 0x92, 0x27, 0x52, 0x94, 0x92, 0xc8, 0x3c, 0xb9, 0xa2, 0x38, 0x20, 0xfb,
0x9e, 0x8a, 0xbd, 0x8c, 0x03, 0x6c, 0x12, 0x54, 0x12, 0x3e, 0xbd, 0x90, 0xf7, 0x69, 0x7f, 0x02,
0x35, 0xed, 0x95, 0x14, 0x35, 0x7d, 0xd9, 0x17, 0x56, 0xd4, 0xf4, 0xe5, 0x3c, 0xaa, 0x62, 0xb7,
0xb1, 0xf6, 0x45, 0x7b, 0x8e, 0xd5, 0x1e, 0x79, 0x7d, 0x7f, 0xc8, 0x09, 0xd8, 0x02, 0x9d, 0xc1,
0xac, 0xf1, 0x14, 0x8a, 0x92, 0xd0, 0xbc, 0x87, 0x56, 0x94, 0x84, 0xe6, 0xbe, 0x9e, 0x22, 0xf9,
0xcc, 0x9e, 0x67, 0xed, 0x9c, 0x23, 0x89, 0xd6, 0xd2, 0x17, 0x50, 0xd3, 0x9e, 0x35, 0x51, 0x63,
0xc9, 0xbe, 0xa0, 0xa2, 0xc6, 0x92, 0xf7, 0x0a, 0xca, 0x22, 0xb6, 0xd1, 0xb0, 0x91, 0x15, 0xf0,
0x66, 0x28, 0xab, 0xfb, 0x4b, 0x68, 0x98, 0x0f, 0x9d, 0x28, 0xd9, 0xcf, 0x7d, 0x32, 0x45, 0xc9,
0xfe, 0x84, 0xd7, 0x51, 0x04, 0x4b, 0xaf, 0x2d, 0xa8, 0x46, 0x36, 0xbe, 0x11, 0x59, 0x37, 0xaf,
0xc8, 0x0f, 0x99, 0x82, 0x13, 0x57, 0x75, 0xc9, 0x8a, 0xc6, 0xb5, 0xfa, 0x85, 0x5e, 0x25, 0x2f,
0x99, 0x5b, 0xbd, 0x26, 0x33, 0xf3, 0xbb, 0xad, 0xb8, 0x6b, 0xe1, 0x95, 0x5d, 0x6d, 0xd7, 0xd2,
0x6f, 0xf5, 0x6a, 0xbb, 0x96, 0x71, 0xb3, 0x37, 0xbd, 0x6b, 0xc5, 0x1e, 0xab, 0xc3, 0x87, 0xb9,
0x54, 0x2a, 0xb8, 0x92, 0x8a, 0xfc, 0xdb, 0x3a, 0xed, 0x1b, 0xaf, 0xcf, 0x20, 0x37, 0x35, 0x88,
0x54, 0x82, 0x1b, 0xf2, 0x6e, 0xd4, 0x9f, 0x87, 0xba, 0xfe, 0xc4, 0x03, 0xd1, 0x45, 0x39, 0xdd,
0xd2, 0x5b, 0xb9, 0x38, 0x73, 0x71, 0x49, 0x5d, 0x6f, 0x86, 0xfc, 0x08, 0x96, 0x95, 0xa8, 0xeb,
0xd9, 0xc5, 0x11, 0x79, 0x27, 0x27, 0xe7, 0x58, 0x37, 0x5e, 0xda, 0xd7, 0x26, 0x26, 0x25, 0xdf,
0xb5, 0x18, 0xd3, 0x98, 0x77, 0xe7, 0x93, 0x0d, 0x23, 0xef, 0xc9, 0x80, 0x64, 0xc3, 0xc8, 0xbd,
0x70, 0x2f, 0x99, 0x86, 0x2c, 0x18, 0x73, 0xc4, 0x0f, 0x2c, 0xc9, 0x17, 0x30, 0xa7, 0xdd, 0xdf,
0x38, 0xbe, 0xf4, 0xbb, 0x4a, 0x00, 0xb2, 0x57, 0x0b, 0xdb, 0x79, 0xa6, 0xb9, 0xbd, 0x82, 0xf5,
0xcf, 0xdb, 0xc6, 0xe4, 0x30, 0xe6, 0xdf, 0x81, 0x9a, 0x7e, 0x37, 0xe4, 0x35, 0xf5, 0xae, 0x68,
0x28, 0xfd, 0x66, 0xdc, 0x5d, 0x8b, 0xfc, 0x43, 0x0b, 0xea, 0xc6, 0x4d, 0x0b, 0xe3, 0xb0, 0x3e,
0x55, 0x4f, 0x4b, 0xc7, 0xe9, 0x15, 0xd9, 0x0e, 0x76, 0xf2, 0x60, 0xed, 0x53, 0x63, 0x12, 0xbe,
0x31, 0xe2, 0x2f, 0xeb, 0xe9, 0x07, 0xf1, 0x5e, 0xa5, 0x09, 0xf4, 0xeb, 0x97, 0xaf, 0xee, 0x5a,
0xe4, 0xe7, 0x16, 0x34, 0xcc, 0xa8, 0xa1, 0x5a, 0xaa, 0xdc, 0xf8, 0xa4, 0x5a, 0xaa, 0x09, 0xa1,
0xc6, 0x2f, 0xb0, 0x97, 0x4f, 0xd7, 0x1c, 0xa3, 0x97, 0xe2, 0x55, 0x85, 0xdf, 0xae, 0xb7, 0xe4,
0x13, 0xfe, 0x1e, 0xa6, 0x8c, 0xed, 0x13, 0x6d, 0xd7, 0x48, 0x2f, 0xaf, 0xfe, 0x86, 0xe3, 0x1d,
0xeb, 0xae, 0x45, 0x7e, 0xc2, 0x1f, 0x82, 0x93, 0xe1, 0x67, 0xc6, 0x25, 0x6f, 0xfa, 0xbd, 0x7d,
0x13, 0xc7, 0x74, 0xc3, 0xbe, 0x66, 0x8c, 0x29, 0xbd, 0x1f, 0x6f, 0xf1, 0xde, 0x89, 0xe7, 0x17,
0x93, 0x0d, 0x25, 0xf3, 0x24, 0xe3, 0xe4, 0x4e, 0x0e, 0x79, 0x27, 0x05, 0xb9, 0xc1, 0xca, 0x6f,
0x58, 0x8d, 0xbd, 0x86, 0x7d, 0xbd, 0x69, 0xbf, 0x33, 0xb1, 0xaf, 0x1b, 0x18, 0xfb, 0x63, 0x3d,
0x3e, 0x02, 0x48, 0xce, 0xe1, 0x48, 0xea, 0x1c, 0x48, 0x09, 0x78, 0xf6, 0xa8, 0xce, 0x94, 0x17,
0x79, 0x5c, 0xc4, 0x6a, 0xfc, 0x31, 0x57, 0x57, 0x8f, 0xe4, 0x09, 0x92, 0x6e, 0x94, 0x98, 0x07,
0x66, 0x86, 0x51, 0x92, 0xae, 0xdf, 0x50, 0x56, 0xea, 0x38, 0xea, 0x19, 0xcc, 0x1e, 0x04, 0xc1,
0x8b, 0xf1, 0x48, 0x9d, 0xa9, 0x9b, 0x61, 0xf9, 0x7d, 0x37, 0x3a, 0x6b, 0xa7, 0x46, 0x61, 0xaf,
0x62, 0x55, 0x6d, 0xd2, 0xd2, 0xaa, 0xda, 0xf8, 0x26, 0x39, 0xe7, 0x7b, 0x45, 0x5c, 0x98, 0x57,
0x3a, 0x50, 0x75, 0xbc, 0x6d, 0x56, 0x63, 0x68, 0xbe, 0x74, 0x13, 0x86, 0xf5, 0x2c, 0x7b, 0xbb,
0x11, 0xc9, 0x3a, 0xef, 0x5a, 0xe4, 0x08, 0xea, 0xbb, 0xb4, 0x8b, 0x69, 0xe6, 0x18, 0xdb, 0x5e,
0x48, 0x3a, 0xae, 0x82, 0xe2, 0xed, 0x59, 0x03, 0x68, 0xee, 0x0b, 0x23, 0xf7, 0x32, 0xa4, 0x5f,
0x6d, 0x7c, 0x23, 0xa2, 0xe6, 0xaf, 0xe4, 0xbe, 0x20, 0x8f, 0x15, 0x8c, 0x7d, 0x21, 0x75, 0x0e,
0x61, 0xec, 0x0b, 0x99, 0x73, 0x08, 0x63, 0xaa, 0xe5, 0xb1, 0x06, 0x19, 0xc0, 0x7c, 0xe6, 0xe8,
0x42, 0x6d, 0x09, 0x93, 0x0e, 0x3c, 0xda, 0xab, 0x93, 0x09, 0xcc, 0xd6, 0xd6, 0xcc, 0xd6, 0x8e,
0x61, 0x76, 0x97, 0xf2, 0xc9, 0xe2, 0x49, 0x83, 0xa9, 0xeb, 0x3a, 0x7a, 0x4a, 0x62, 0x5a, 0x81,
0x23, 0xce, 0xdc, 0xf8, 0x31, 0x63, 0x8f, 0xfc, 0x18, 0x6a, 0x0f, 0x69, 0x2c, 0xb3, 0x04, 0x95,
0xe9, 0x99, 0x4a, 0x1b, 0x6c, 0xe7, 0x24, 0x19, 0x9a, 0x3c, 0x83, 0xb5, 0x6d, 0xd0, 0x5e, 0x9f,
0x72, 0xe5, 0xd4, 0xf1, 0x7a, 0xaf, 0xc8, 0x9f, 0xc3, 0xca, 0x55, 0x8a, 0xf4, 0xb2, 0x96, 0xf6,
0xa5, 0x57, 0x3e, 0x97, 0x82, 0xe7, 0xd5, 0xec, 0x07, 0x3d, 0xaa, 0x99, 0x40, 0x3e, 0xd4, 0xb4,
0x4b, 0x00, 0x4a, 0x80, 0xb2, 0x17, 0x46, 0x94, 0x00, 0xe5, 0xdc, 0x19, 0xb0, 0xef, 0x60, 0x3b,
0x36, 0x59, 0x4d, 0xda, 0xe1, 0xf7, 0x04, 0x92, 0x96, 0x36, 0xbe, 0x71, 0x87, 0xf1, 0x2b, 0xf2,
0x1c, 0x5f, 0x39, 0xd1, 0x33, 0x21, 0x13, 0x5b, 0x3a, 0x9d, 0x34, 0xa9, 0x26, 0x4b, 0x43, 0x99,
0xf6, 0x35, 0x6f, 0x0a, 0x2d, 0xa5, 0x1f, 0x00, 0x1c, 0xc7, 0xc1, 0x68, 0xd7, 0xa5, 0xc3, 0xc0,
0x4f, 0x74, 0x6d, 0x92, 0x87, 0x97, 0xe8, 0x2f, 0x2d, 0x19, 0x8f, 0x3c, 0xd7, 0x9c, 0x0f, 0x23,
0x91, 0x54, 0x32, 0xd7, 0xc4, 0x54, 0x3d, 0x35, 0x21, 0x39, 0xe9, 0x7a, 0x77, 0x2d, 0xb2, 0x05,
0x90, 0x9c, 0x5d, 0x29, 0x57, 0x22, 0x73, 0x2c, 0xa6, 0xd4, 0x5e, 0xce, 0x41, 0xd7, 0x11, 0x54,
0x93, 0xc3, 0x90, 0x95, 0xe4, 0x1e, 0x8d, 0x71, 0x74, 0xa2, 0x76, 0xf0, 0xcc, 0x11, 0x85, 0xdd,
0xc4, 0xa9, 0x02, 0x52, 0x61, 0x53, 0x85, 0xe7, 0x0e, 0x1e, 0x2c, 0xf0, 0x0e, 0x2a, 0x73, 0x04,
0x73, 0xc8, 0xe4, 0x48, 0x72, 0x8e, 0x09, 0x94, 0x34, 0xe7, 0x46, 0xd9, 0x8d, 0x88, 0x08, 0xe3,
0x56, 0x9e, 0xbf, 0xc6, 0x54, 0xf3, 0x10, 0xe6, 0x33, 0x61, 0x60, 0x25, 0xd2, 0x93, 0x22, 0xf3,
0x4a, 0xa4, 0x27, 0x46, 0x90, 0xed, 0x25, 0x6c, 0x72, 0xce, 0x06, 0xf4, 0x80, 0x2e, 0xbc, 0xb8,
0x7b, 0xc6, 0x9a, 0xfb, 0x99, 0x05, 0x0b, 0x39, 0x51, 0x5e, 0xf2, 0xae, 0x74, 0xa6, 0x27, 0x46,
0x80, 0xdb, 0xb9, 0x41, 0x40, 0xfb, 0x18, 0xdb, 0x79, 0x4c, 0x3e, 0x33, 0x36, 0x36, 0x1e, 0x7f,
0x13, 0x92, 0xf9, 0x5a, 0xa3, 0x22, 0xd7, 0xa2, 0xf8, 0x0a, 0x56, 0x78, 0x47, 0xb6, 0x06, 0x83,
0x54, 0x80, 0xf2, 0x46, 0xe6, 0x49, 0x7c, 0x23, 0xf0, 0xda, 0x9e, 0xfc, 0x64, 0xfe, 0x04, 0x73,
0x95, 0x77, 0x95, 0x8c, 0xa1, 0x99, 0x0e, 0xfa, 0x91, 0xc9, 0x75, 0xb5, 0xdf, 0x31, 0xdc, 0xc2,
0x6c, 0xa0, 0xd0, 0xfe, 0x3d, 0x6c, 0xec, 0x1d, 0xbb, 0x9d, 0x37, 0x2f, 0xdc, 0x53, 0x64, 0xeb,
0xf1, 0x17, 0x55, 0x84, 0x32, 0x35, 0x4e, 0xd9, 0xc0, 0xa4, 0x90, 0xaa, 0x72, 0x4c, 0xf3, 0x03,
0x9c, 0xb7, 0xb0, 0xf9, 0x55, 0xfb, 0xad, 0xbc, 0xe6, 0x43, 0xfe, 0x09, 0x77, 0x51, 0x57, 0xd2,
0x72, 0x2d, 0x7b, 0xb0, 0x9a, 0xb7, 0xde, 0x13, 0x7d, 0x8d, 0xd4, 0x5c, 0x4f, 0xdd, 0xb5, 0xb6,
0x6f, 0x7f, 0xf1, 0x7b, 0x7d, 0x2f, 0x3e, 0x1b, 0x9f, 0xac, 0x77, 0x83, 0xe1, 0xc6, 0x40, 0x86,
0xc8, 0x44, 0xc6, 0xf3, 0xc6, 0xc0, 0xef, 0x6d, 0xe0, 0xf7, 0x27, 0xd3, 0xf8, 0x1f, 0x36, 0xbe,
0xff, 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x82, 0x63, 0x17, 0xa9, 0x93, 0x63, 0x00, 0x00,
}
// Reference imports to suppress errors if they are not otherwise used.

@ -1645,9 +1645,9 @@ message QueryRoutesRequest {
repeated bytes ignored_nodes = 6;
/**
A list of edges to ignore during path finding.
Deprecated. A list of edges to ignore during path finding.
*/
repeated EdgeLocator ignored_edges = 7;
repeated EdgeLocator ignored_edges = 7 [deprecated = true];
/**
The source node where the request route should originated from. If empty,
@ -1660,6 +1660,19 @@ message QueryRoutesRequest {
the optimal route.
*/
bool use_mission_control = 9;
/**
A list of directed node pairs that will be ignored during path finding.
*/
repeated NodePair ignored_pairs = 10;
}
message NodePair {
/// The sending node of the pair.
bytes from = 1;
/// The receiving node of the pair.
bytes to = 2;
}
message EdgeLocator {

@ -9543,6 +9543,17 @@ func testBidirectionalAsyncPayments(net *lntest.NetworkHarness, t *harnessTest)
"timeout: %v", err)
}
// Reset mission control to prevent previous payment results from
// interfering with this test. A new channel has been opened, but
// mission control operates on node pairs.
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
_, err = net.Alice.RouterClient.ResetMissionControl(
ctxt, &routerrpc.ResetMissionControlRequest{},
)
if err != nil {
t.Fatalf("unable to reset mc for alice: %v", err)
}
// Open up a payment streams to Alice and to Bob, that we'll use to
// send payment between nodes.
ctx, cancel := context.WithTimeout(ctxb, lntest.AsyncBenchmarkTimeout)

@ -55,7 +55,11 @@ const (
// since the last failure is used to estimate a success probability that is fed
// into the path finding process for subsequent payment attempts.
type MissionControl struct {
history map[route.Vertex]*nodeHistory
// lastPairFailure tracks the last payment failure per node pair.
lastPairFailure map[DirectedNodePair]pairFailure
// lastNodeFailure tracks the last node level failure per node.
lastNodeFailure map[route.Vertex]time.Time
// lastSecondChance tracks the last time a second chance was granted for
// a directed node pair.
@ -93,22 +97,10 @@ type MissionControlConfig struct {
MaxMcHistory int
}
// nodeHistory contains a summary of payment attempt outcomes involving a
// particular node.
type nodeHistory struct {
// lastFail is the last time a node level failure occurred, if any.
lastFail *time.Time
// channelLastFail tracks history per channel, if available for that
// channel.
channelLastFail map[uint64]*channelHistory
}
// channelHistory contains a summary of payment attempt outcomes involving a
// particular channel.
type channelHistory struct {
// lastFail is the last time a channel level failure occurred.
lastFail time.Time
// pairFailure describes a payment failure for a node pair.
type pairFailure struct {
// timestamp is the time when this failure result was obtained.
timestamp time.Time
// minPenalizeAmt is the minimum amount for which to take this failure
// into account.
@ -120,6 +112,10 @@ type channelHistory struct {
type MissionControlSnapshot struct {
// Nodes contains the per node information of this snapshot.
Nodes []MissionControlNodeSnapshot
// Pairs is a list of channels for which specific information is
// logged.
Pairs []MissionControlPairSnapshot
}
// MissionControlNodeSnapshot contains a snapshot of the current node state in
@ -128,23 +124,19 @@ type MissionControlNodeSnapshot struct {
// Node pubkey.
Node route.Vertex
// Lastfail is the time of last failure, if any.
LastFail *time.Time
// LastFail is the time of last failure.
LastFail time.Time
// Channels is a list of channels for which specific information is
// logged.
Channels []MissionControlChannelSnapshot
// OtherChanSuccessProb is the success probability for channels not in
// the Channels slice.
OtherChanSuccessProb float64
// OtherSuccessProb is the success probability for pairs not in
// the Pairs slice.
OtherSuccessProb float64
}
// MissionControlChannelSnapshot contains a snapshot of the current channel
// MissionControlPairSnapshot contains a snapshot of the current node pair
// state in mission control.
type MissionControlChannelSnapshot struct {
// ChannelID is the short channel id of the snapshot.
ChannelID uint64
type MissionControlPairSnapshot struct {
// Pair is the node pair of which the state is described.
Pair DirectedNodePair
// LastFail is the time of last failure.
LastFail time.Time
@ -182,7 +174,8 @@ func NewMissionControl(db *bbolt.DB, cfg *MissionControlConfig) (
}
mc := &MissionControl{
history: make(map[route.Vertex]*nodeHistory),
lastPairFailure: make(map[DirectedNodePair]pairFailure),
lastNodeFailure: make(map[route.Vertex]time.Time),
lastSecondChance: make(map[DirectedNodePair]time.Time),
now: time.Now,
cfg: cfg,
@ -227,7 +220,8 @@ func (m *MissionControl) ResetHistory() error {
return err
}
m.history = make(map[route.Vertex]*nodeHistory)
m.lastPairFailure = make(map[DirectedNodePair]pairFailure)
m.lastNodeFailure = make(map[route.Vertex]time.Time)
m.lastSecondChance = make(map[DirectedNodePair]time.Time)
log.Debugf("Mission control history cleared")
@ -235,59 +229,24 @@ func (m *MissionControl) ResetHistory() error {
return nil
}
// GetEdgeProbability is expected to return the success probability of a payment
// GetProbability is expected to return the success probability of a payment
// from fromNode along edge.
func (m *MissionControl) GetEdgeProbability(fromNode route.Vertex,
edge EdgeLocator, amt lnwire.MilliSatoshi) float64 {
func (m *MissionControl) GetProbability(fromNode, toNode route.Vertex,
amt lnwire.MilliSatoshi) float64 {
m.Lock()
defer m.Unlock()
// Get the history for this node. If there is no history available,
// assume that it's success probability is a constant a priori
// probability. After the attempt new information becomes available to
// adjust this probability.
nodeHistory, ok := m.history[fromNode]
if !ok {
return m.cfg.AprioriHopProbability
}
return m.getEdgeProbabilityForNode(nodeHistory, edge.ChannelID, amt)
return m.getPairProbability(fromNode, toNode, amt)
}
// getEdgeProbabilityForNode estimates the probability of successfully
// traversing a channel based on the node history.
func (m *MissionControl) getEdgeProbabilityForNode(nodeHistory *nodeHistory,
channelID uint64, amt lnwire.MilliSatoshi) float64 {
// Calculate the last failure of the given edge. A node failure is
// considered a failure that would have affected every edge. Therefore
// we insert a node level failure into the history of every channel.
lastFailure := nodeHistory.lastFail
// Take into account a minimum penalize amount. For balance errors, a
// failure may be reported with such a minimum to prevent too aggresive
// penalization. We only take into account a previous failure if the
// amount that we currently get the probability for is greater or equal
// than the minPenalizeAmt of the previous failure.
channelHistory, ok := nodeHistory.channelLastFail[channelID]
if ok && channelHistory.minPenalizeAmt <= amt {
// If there is both a node level failure recorded and a channel
// level failure is applicable too, we take the most recent of
// the two.
if lastFailure == nil ||
channelHistory.lastFail.After(*lastFailure) {
lastFailure = &channelHistory.lastFail
}
}
if lastFailure == nil {
// getProbAfterFail returns a probability estimate based on a last failure time.
func (m *MissionControl) getProbAfterFail(lastFailure time.Time) float64 {
if lastFailure.IsZero() {
return m.cfg.AprioriHopProbability
}
timeSinceLastFailure := m.now().Sub(*lastFailure)
timeSinceLastFailure := m.now().Sub(lastFailure)
// Calculate success probability. It is an exponential curve that brings
// the probability down to zero when a failure occurs. From there it
@ -299,6 +258,39 @@ func (m *MissionControl) getEdgeProbabilityForNode(nodeHistory *nodeHistory,
return probability
}
// getPairProbability estimates the probability of successfully
// traversing from fromNode to toNode based on historical payment outcomes.
func (m *MissionControl) getPairProbability(fromNode,
toNode route.Vertex, amt lnwire.MilliSatoshi) float64 {
// Start by getting the last node level failure. A node failure is
// considered a failure that would have affected every edge. Therefore
// we insert a node level failure into the history of every channel. If
// there is none, lastFail will be zero.
lastFail := m.lastNodeFailure[fromNode]
// Retrieve the last pair outcome.
pair := NewDirectedNodePair(fromNode, toNode)
lastPairResult, ok := m.lastPairFailure[pair]
// Only look at the last pair outcome if it happened after the last node
// level failure. Otherwise the node level failure is the most recent
// and used as the basis for calculation of the probability.
if ok && lastPairResult.timestamp.After(lastFail) {
// Take into account a minimum penalize amount. For balance
// errors, a failure may be reported with such a minimum to
// prevent too aggresive penalization. We only take into account
// a previous failure if the amount that we currently get the
// probability for is greater or equal than the minPenalizeAmt
// of the previous failure.
if amt >= lastPairResult.minPenalizeAmt {
lastFail = lastPairResult.timestamp
}
}
return m.getProbAfterFail(lastFail)
}
// requestSecondChance checks whether the node fromNode can have a second chance
// at providing a channel update for its channel with toNode.
func (m *MissionControl) requestSecondChance(timestamp time.Time,
@ -330,21 +322,6 @@ func (m *MissionControl) requestSecondChance(timestamp time.Time,
return false
}
// createHistoryIfNotExists returns the history for the given node. If the node
// is yet unknown, it will create an empty history structure.
func (m *MissionControl) createHistoryIfNotExists(vertex route.Vertex) *nodeHistory {
if node, ok := m.history[vertex]; ok {
return node
}
node := &nodeHistory{
channelLastFail: make(map[uint64]*channelHistory),
}
m.history[vertex] = node
return node
}
// reportVertexFailure reports a node level failure.
func (m *MissionControl) reportVertexFailure(timestamp time.Time,
v route.Vertex) {
@ -354,13 +331,12 @@ func (m *MissionControl) reportVertexFailure(timestamp time.Time,
m.Lock()
defer m.Unlock()
history := m.createHistoryIfNotExists(v)
history.lastFail = &timestamp
m.lastNodeFailure[v] = timestamp
}
// reportEdgePolicyFailure reports a policy related failure.
func (m *MissionControl) reportEdgePolicyFailure(timestamp time.Time,
failedEdge edge) {
// reportPairPolicyFailure reports a policy related failure.
func (m *MissionControl) reportPairPolicyFailure(timestamp time.Time,
failedPair DirectedNodePair) {
m.Lock()
defer m.Unlock()
@ -369,31 +345,29 @@ func (m *MissionControl) reportEdgePolicyFailure(timestamp time.Time,
// immediately. If some time has passed since the last policy failure,
// we grant the node a second chance at forwarding the payment.
if m.requestSecondChance(
timestamp, failedEdge.from, failedEdge.to,
timestamp, failedPair.From, failedPair.To,
) {
return
}
history := m.createHistoryIfNotExists(failedEdge.from)
history.lastFail = &timestamp
m.lastNodeFailure[failedPair.From] = timestamp
}
// reportEdgeFailure reports a channel level failure.
// reportPairFailure reports a pair level failure.
//
// TODO(roasbeef): also add value attempted to send and capacity of channel
func (m *MissionControl) reportEdgeFailure(timestamp time.Time, failedEdge edge,
minPenalizeAmt lnwire.MilliSatoshi) {
func (m *MissionControl) reportPairFailure(timestamp time.Time,
failedPair DirectedNodePair, minPenalizeAmt lnwire.MilliSatoshi) {
log.Debugf("Reporting channel %v failure to Mission Control",
failedEdge.channel)
log.Debugf("Reporting pair %v failure to Mission Control", failedPair)
m.Lock()
defer m.Unlock()
history := m.createHistoryIfNotExists(failedEdge.from)
history.channelLastFail[failedEdge.channel] = &channelHistory{
lastFail: timestamp,
pair := NewDirectedNodePair(failedPair.From, failedPair.To)
m.lastPairFailure[pair] = pairFailure{
minPenalizeAmt: minPenalizeAmt,
timestamp: timestamp,
}
}
@ -404,46 +378,40 @@ func (m *MissionControl) GetHistorySnapshot() *MissionControlSnapshot {
defer m.Unlock()
log.Debugf("Requesting history snapshot from mission control: "+
"node_count=%v", len(m.history))
"node_failure_count=%v, pair_result_count=%v",
len(m.lastNodeFailure), len(m.lastPairFailure))
nodes := make([]MissionControlNodeSnapshot, 0, len(m.history))
nodes := make([]MissionControlNodeSnapshot, 0, len(m.lastNodeFailure))
for v, h := range m.lastNodeFailure {
otherProb := m.getPairProbability(v, route.Vertex{}, 0)
for v, h := range m.history {
channelSnapshot := make([]MissionControlChannelSnapshot, 0,
len(h.channelLastFail),
)
nodes = append(nodes, MissionControlNodeSnapshot{
Node: v,
LastFail: h,
OtherSuccessProb: otherProb,
})
}
for id, lastFail := range h.channelLastFail {
// Show probability assuming amount meets min
// penalization amount.
prob := m.getEdgeProbabilityForNode(
h, id, lastFail.minPenalizeAmt,
)
pairs := make([]MissionControlPairSnapshot, 0, len(m.lastPairFailure))
channelSnapshot = append(channelSnapshot,
MissionControlChannelSnapshot{
ChannelID: id,
LastFail: lastFail.lastFail,
MinPenalizeAmt: lastFail.minPenalizeAmt,
SuccessProb: prob,
},
)
for v, h := range m.lastPairFailure {
// Show probability assuming amount meets min
// penalization amount.
prob := m.getPairProbability(v.From, v.To, h.minPenalizeAmt)
pair := MissionControlPairSnapshot{
Pair: v,
MinPenalizeAmt: h.minPenalizeAmt,
LastFail: h.timestamp,
SuccessProb: prob,
}
otherProb := m.getEdgeProbabilityForNode(h, 0, 0)
nodes = append(nodes,
MissionControlNodeSnapshot{
Node: v,
LastFail: h.lastFail,
OtherChanSuccessProb: otherProb,
Channels: channelSnapshot,
},
)
pairs = append(pairs, pair)
}
snapshot := MissionControlSnapshot{
Nodes: nodes,
Pairs: pairs,
}
return &snapshot
@ -518,7 +486,7 @@ func (m *MissionControl) applyPaymentResult(result *paymentResult) (
// Always determine chan id ourselves, because a channel update with id
// may not be available.
failedEdge, failedAmt := getFailedEdge(
failedPair, failedAmt := getFailedPair(
result.route, failureSourceIdxInt,
)
@ -598,35 +566,35 @@ func (m *MissionControl) applyPaymentResult(result *paymentResult) (
// amount, we'll apply the new minimum amount and retry
// routing.
case *lnwire.FailAmountBelowMinimum:
m.reportEdgePolicyFailure(result.timeReply, failedEdge)
m.reportPairPolicyFailure(result.timeReply, failedPair)
return false, 0
// If we get a failure due to a fee, we'll apply the
// new fee update, and retry our attempt using the
// newly updated fees.
case *lnwire.FailFeeInsufficient:
m.reportEdgePolicyFailure(result.timeReply, failedEdge)
m.reportPairPolicyFailure(result.timeReply, failedPair)
return false, 0
// If we get the failure for an intermediate node that
// disagrees with our time lock values, then we'll
// apply the new delta value and try it once more.
case *lnwire.FailIncorrectCltvExpiry:
m.reportEdgePolicyFailure(result.timeReply, failedEdge)
m.reportPairPolicyFailure(result.timeReply, failedPair)
return false, 0
// The outgoing channel that this node was meant to
// forward one is currently disabled, so we'll apply
// the update and continue.
case *lnwire.FailChannelDisabled:
m.reportEdgeFailure(result.timeReply, failedEdge, 0)
m.reportPairFailure(result.timeReply, failedPair, 0)
return false, 0
// It's likely that the outgoing channel didn't have
// sufficient capacity, so we'll prune this edge for
// sufficient capacity, so we'll prune this pair for
// now, and continue onwards with our path finding.
case *lnwire.FailTemporaryChannelFailure:
m.reportEdgeFailure(result.timeReply, failedEdge, failedAmt)
m.reportPairFailure(result.timeReply, failedPair, failedAmt)
return false, 0
// If the send fail due to a node not having the
@ -651,7 +619,7 @@ func (m *MissionControl) applyPaymentResult(result *paymentResult) (
// returning errors in order to attempt to black list
// another node.
case *lnwire.FailUnknownNextPeer:
m.reportEdgeFailure(result.timeReply, failedEdge, 0)
m.reportPairFailure(result.timeReply, failedPair, 0)
return false, 0
// If the node wasn't able to forward for which ever
@ -682,12 +650,10 @@ func (m *MissionControl) applyPaymentResult(result *paymentResult) (
// we'll prune the channel in both directions and
// continue with the rest of the routes.
case *lnwire.FailPermanentChannelFailure:
m.reportEdgeFailure(result.timeReply, failedEdge, 0)
m.reportEdgeFailure(result.timeReply, edge{
from: failedEdge.to,
to: failedEdge.from,
channel: failedEdge.channel,
}, 0)
m.reportPairFailure(result.timeReply, failedPair, 0)
m.reportPairFailure(
result.timeReply, failedPair.Reverse(), 0,
)
return false, 0
// Any other failure or an empty failure will get the node pruned.
@ -697,11 +663,11 @@ func (m *MissionControl) applyPaymentResult(result *paymentResult) (
}
}
// getFailedEdge tries to locate the failing channel given a route and the
// pubkey of the node that sent the failure. It will assume that the failure is
// associated with the outgoing channel of the failing node. As a second result,
// it returns the amount sent over the edge.
func getFailedEdge(route *route.Route, failureSource int) (edge,
// getFailedPair tries to locate the failing pair given a route and the pubkey
// of the node that sent the failure. It will assume that the failure is
// associated with the outgoing channel set of the failing node. As a second
// result, it returns the amount sent between the pair.
func getFailedPair(route *route.Route, failureSource int) (DirectedNodePair,
lnwire.MilliSatoshi) {
// Determine if we have a failure from the final hop. If it is, we
@ -718,16 +684,14 @@ func getFailedEdge(route *route.Route, failureSource int) (edge,
// this HTLC (for w/e reason), we'll return the _outgoing_ channel that
// the source of the failure was meant to pass the HTLC along to.
if failureSource == 0 {
return edge{
from: route.SourcePubKey,
to: route.Hops[0].PubKeyBytes,
channel: route.Hops[0].ChannelID,
}, route.TotalAmount
return NewDirectedNodePair(
route.SourcePubKey,
route.Hops[0].PubKeyBytes,
), route.TotalAmount
}
return edge{
from: route.Hops[failureSource-1].PubKeyBytes,
to: route.Hops[failureSource].PubKeyBytes,
channel: route.Hops[failureSource].ChannelID,
}, route.Hops[failureSource-1].AmtToForward
return NewDirectedNodePair(
route.Hops[failureSource-1].PubKeyBytes,
route.Hops[failureSource].PubKeyBytes,
), route.Hops[failureSource-1].AmtToForward
}

@ -12,10 +12,6 @@ import (
)
var (
mcTestEdge = EdgeLocator{
ChannelID: 2,
}
mcTestRoute = &route.Route{
SourcePubKey: route.Vertex{10},
Hops: []*route.Hop{
@ -94,14 +90,13 @@ func (ctx *mcTestContext) cleanup() {
}
// Assert that mission control returns a probability for an edge.
func (ctx *mcTestContext) expectP(amt lnwire.MilliSatoshi,
expected float64) {
func (ctx *mcTestContext) expectP(amt lnwire.MilliSatoshi, expected float64) {
ctx.t.Helper()
p := ctx.mc.GetEdgeProbability(mcTestNode1, mcTestEdge, amt)
p := ctx.mc.GetProbability(mcTestNode1, mcTestNode2, amt)
if p != expected {
ctx.t.Fatalf("unexpected probability %v", p)
ctx.t.Fatalf("expected probability %v but got %v", expected, p)
}
}
@ -175,7 +170,7 @@ func TestMissionControl(t *testing.T) {
t.Fatal("unexpected number of nodes")
}
if len(history.Nodes[0].Channels) != 1 {
if len(history.Pairs) != 1 {
t.Fatal("unexpected number of channels")
}
}
@ -184,7 +179,6 @@ func TestMissionControl(t *testing.T) {
// penalizing the channel yet.
func TestMissionControlChannelUpdate(t *testing.T) {
ctx := createMcTestContext(t)
defer ctx.cleanup()
// Report a policy related failure. Because it is the first, we don't
// expect a penalty.

@ -105,7 +105,7 @@ func (m *mockMissionControl) ReportPaymentFail(paymentID uint64,
return false, 0, nil
}
func (m *mockMissionControl) GetEdgeProbability(fromNode route.Vertex, edge EdgeLocator,
func (m *mockMissionControl) GetProbability(fromNode, toNode route.Vertex,
amt lnwire.MilliSatoshi) float64 {
return 0
@ -130,12 +130,6 @@ func (m *mockPaymentSession) RequestRoute(payment *LightningPayment,
return r, nil
}
func (m *mockPaymentSession) ReportVertexFailure(v route.Vertex) {}
func (m *mockPaymentSession) ReportEdgeFailure(failedEdge edge, minPenalizeAmt lnwire.MilliSatoshi) {}
func (m *mockPaymentSession) ReportEdgePolicyFailure(failedEdge edge) {}
type mockPayer struct {
sendResult chan error
paymentResultErr chan error

@ -246,7 +246,7 @@ type graphParams struct {
type RestrictParams struct {
// ProbabilitySource is a callback that is expected to return the
// success probability of traversing the channel from the node.
ProbabilitySource func(route.Vertex, EdgeLocator,
ProbabilitySource func(route.Vertex, route.Vertex,
lnwire.MilliSatoshi) float64
// FeeLimit is a maximum fee amount allowed to be used on the path from
@ -401,14 +401,12 @@ func findPath(g *graphParams, r *RestrictParams, cfg *PathFindingConfig,
amountToSend := toNodeDist.amountToReceive
// Request the success probability for this edge.
locator := newEdgeLocator(edge)
edgeProbability := r.ProbabilitySource(
fromVertex, *locator, amountToSend,
fromVertex, toNode, amountToSend,
)
log.Tracef("path finding probability: fromnode=%v, chanid=%v, "+
"probability=%v", fromVertex, locator.ChannelID,
edgeProbability)
log.Tracef("path finding probability: fromnode=%v, tonode=%v, "+
"probability=%v", fromVertex, toNode, edgeProbability)
// If the probability is zero, there is no point in trying.
if edgeProbability == 0 {

@ -77,7 +77,7 @@ var (
// noProbabilitySource is used in testing to return the same probability 1 for
// all edges.
func noProbabilitySource(route.Vertex, EdgeLocator, lnwire.MilliSatoshi) float64 {
func noProbabilitySource(route.Vertex, route.Vertex, lnwire.MilliSatoshi) float64 {
return 1
}
@ -2156,6 +2156,8 @@ func testProbabilityRouting(t *testing.T, p10, p11, p20, minProbability float64,
}
defer testGraphInstance.cleanUp()
alias := testGraphInstance.aliasMap
sourceNode, err := testGraphInstance.graph.SourceNode()
if err != nil {
t.Fatalf("unable to fetch source node: %v", err)
@ -2166,19 +2168,19 @@ func testProbabilityRouting(t *testing.T, p10, p11, p20, minProbability float64,
target := testGraphInstance.aliasMap["target"]
// Configure a probability source with the test parameters.
probabilitySource := func(node route.Vertex, edge EdgeLocator,
probabilitySource := func(fromNode, toNode route.Vertex,
amt lnwire.MilliSatoshi) float64 {
if amt == 0 {
t.Fatal("expected non-zero amount")
}
switch edge.ChannelID {
case 10:
switch {
case fromNode == alias["a1"] && toNode == alias["a2"]:
return p10
case 11:
case fromNode == alias["a2"] && toNode == alias["target"]:
return p11
case 20:
case fromNode == alias["b"] && toNode == alias["target"]:
return p20
default:
return 1

@ -91,7 +91,7 @@ func (p *paymentSession) RequestRoute(payment *LightningPayment,
ss := p.sessionSource
restrictions := &RestrictParams{
ProbabilitySource: ss.MissionControl.GetEdgeProbability,
ProbabilitySource: ss.MissionControl.GetProbability,
FeeLimit: payment.FeeLimit,
OutgoingChannelID: payment.OutgoingChannelID,
CltvLimit: cltvLimit,

@ -182,9 +182,9 @@ type MissionController interface {
failureSourceIdx *int, failure lnwire.FailureMessage) (bool,
channeldb.FailureReason, error)
// GetEdgeProbability is expected to return the success probability of a
// GetProbability is expected to return the success probability of a
// payment from fromNode along edge.
GetEdgeProbability(fromNode route.Vertex, edge EdgeLocator,
GetProbability(fromNode, toNode route.Vertex,
amt lnwire.MilliSatoshi) float64
}
@ -350,13 +350,6 @@ func (e *EdgeLocator) String() string {
return fmt.Sprintf("%v:%v", e.ChannelID, e.Direction)
}
// edge is a combination of a channel and the node pubkeys of both of its
// endpoints.
type edge struct {
from, to route.Vertex
channel uint64
}
// ChannelRouter is the layer 3 router within the Lightning stack. Below the
// ChannelRouter is the HtlcSwitch, and below that is the Bitcoin blockchain
// itself. The primary role of the ChannelRouter is to respond to queries for

@ -2960,6 +2960,7 @@ func TestRouterPaymentStateMachine(t *testing.T) {
ChainView: chainView,
Control: control,
SessionSource: &mockPaymentSessionSource{},
MissionControl: &mockMissionControl{},
Payer: payer,
ChannelPruneExpiry: time.Hour * 24,
GraphPruneInterval: time.Hour * 2,