diff --git a/cmd/lncli/cmd_query_mission_control.go b/cmd/lncli/cmd_query_mission_control.go index f1514beb..d073c5f0 100644 --- a/cmd/lncli/cmd_query_mission_control.go +++ b/cmd/lncli/cmd_query_mission_control.go @@ -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, }, ) } diff --git a/lnrpc/routerrpc/router.pb.go b/lnrpc/routerrpc/router.pb.go index 2cff06fd..0372e0ce 100644 --- a/lnrpc/routerrpc/router.pb.go +++ b/lnrpc/routerrpc/router.pb.go @@ -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. diff --git a/lnrpc/routerrpc/router.proto b/lnrpc/routerrpc/router.proto index f44da67d..6c3eaed1 100644 --- a/lnrpc/routerrpc/router.proto +++ b/lnrpc/routerrpc/router.proto @@ -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 { diff --git a/lnrpc/routerrpc/router_backend.go b/lnrpc/routerrpc/router_backend.go index d4d1d8e2..814d6bed 100644 --- a/lnrpc/routerrpc/router_backend.go +++ b/lnrpc/routerrpc/router_backend.go @@ -57,17 +57,17 @@ 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. + // ResetHistory resets the history of MissionControl returning it to a + // state as if no payment attempts have been made. ResetHistory() error - // GetHistorySnapshot takes a snapshot from the current mission control state - // and actual probability estimates. + // GetHistorySnapshot takes a snapshot from the current mission control + // state and actual probability estimates. GetHistorySnapshot() *routing.MissionControlSnapshot } @@ -89,15 +89,7 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context, return route.Vertex{}, err } - if len(pubKeyBytes) != 33 { - return route.Vertex{}, - errors.New("invalid key length") - } - - var v route.Vertex - copy(v[:], pubKeyBytes) - - return v, nil + return route.NewVertexFromBytes(pubKeyBytes) } // Parse the hex-encoded source and target public keys into full public @@ -134,36 +126,57 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context, ignoredNodes := make(map[route.Vertex]struct{}) for _, ignorePubKey := range in.IgnoredNodes { - if len(ignorePubKey) != 33 { - return nil, fmt.Errorf("invalid ignore node pubkey") + ignoreVertex, err := route.NewVertexFromBytes(ignorePubKey) + if err != nil { + return nil, err } - var ignoreVertex route.Vertex - copy(ignoreVertex[:], ignorePubKey) 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 } @@ -171,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, ) }, } @@ -211,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. @@ -484,12 +517,11 @@ func (r *RouterBackend) extractIntentFromSendRequest( // from the other fields. // Payment destination. - if len(rpcPayReq.Dest) != 33 { - return nil, errors.New("invalid key length") - + target, err := route.NewVertexFromBytes(rpcPayReq.Dest) + if err != nil { + return nil, err } - pubBytes := rpcPayReq.Dest - copy(payIntent.Target[:], pubBytes) + payIntent.Target = target // Final payment CLTV delta. if rpcPayReq.FinalCltvDelta != 0 { diff --git a/lnrpc/routerrpc/router_backend_test.go b/lnrpc/routerrpc/router_backend_test.go index 1a0ce3ee..3f20f505 100644 --- a/lnrpc/routerrpc/router_backend_test.go +++ b/lnrpc/routerrpc/router_backend_test.go @@ -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 } diff --git a/lnrpc/routerrpc/router_server.go b/lnrpc/routerrpc/router_server.go index 2ed26800..04c9f957 100644 --- a/lnrpc/routerrpc/router_server.go +++ b/lnrpc/routerrpc/router_server.go @@ -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 diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index 0654b7e4..d107cb85 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -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. diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index 3f968b29..695100a8 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -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 { diff --git a/lntest/itest/lnd_test.go b/lntest/itest/lnd_test.go index 58838abe..ea0996ab 100644 --- a/lntest/itest/lnd_test.go +++ b/lntest/itest/lnd_test.go @@ -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) diff --git a/routing/missioncontrol.go b/routing/missioncontrol.go index a14773f6..b2ea102d 100644 --- a/routing/missioncontrol.go +++ b/routing/missioncontrol.go @@ -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 = ×tamp + 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 = ×tamp + 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 } diff --git a/routing/missioncontrol_test.go b/routing/missioncontrol_test.go index 798161c9..2d8247ac 100644 --- a/routing/missioncontrol_test.go +++ b/routing/missioncontrol_test.go @@ -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. diff --git a/routing/mock_test.go b/routing/mock_test.go index 54a8011d..b58ba3d5 100644 --- a/routing/mock_test.go +++ b/routing/mock_test.go @@ -105,15 +105,7 @@ func (m *mockMissionControl) ReportPaymentFail(paymentID uint64, return false, 0, nil } -func (m *mockMissionControl) ReportEdgeFailure(failedEdge edge, - minPenalizeAmt lnwire.MilliSatoshi) { -} - -func (m *mockMissionControl) ReportEdgePolicyFailure(failedEdge edge) {} - -func (m *mockMissionControl) ReportVertexFailure(v route.Vertex) {} - -func (m *mockMissionControl) GetEdgeProbability(fromNode route.Vertex, edge EdgeLocator, +func (m *mockMissionControl) GetProbability(fromNode, toNode route.Vertex, amt lnwire.MilliSatoshi) float64 { return 0 @@ -138,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 diff --git a/routing/nodepair.go b/routing/nodepair.go index edec8e02..43128e69 100644 --- a/routing/nodepair.go +++ b/routing/nodepair.go @@ -1,6 +1,8 @@ package routing import ( + "fmt" + "github.com/lightningnetwork/lnd/routing/route" ) @@ -8,3 +10,21 @@ import ( type DirectedNodePair struct { From, To route.Vertex } + +// NewDirectedNodePair instantiates a new DirectedNodePair struct. +func NewDirectedNodePair(from, to route.Vertex) DirectedNodePair { + return DirectedNodePair{ + From: from, + To: to, + } +} + +// String converts a node pair to its human readable representation. +func (d DirectedNodePair) String() string { + return fmt.Sprintf("%v -> %v", d.From, d.To) +} + +// Reverse returns a reversed copy of the pair. +func (d DirectedNodePair) Reverse() DirectedNodePair { + return DirectedNodePair{From: d.To, To: d.From} +} diff --git a/routing/pathfind.go b/routing/pathfind.go index 91b40371..b82ef465 100644 --- a/routing/pathfind.go +++ b/routing/pathfind.go @@ -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 { diff --git a/routing/pathfind_test.go b/routing/pathfind_test.go index 352c06fa..64676c83 100644 --- a/routing/pathfind_test.go +++ b/routing/pathfind_test.go @@ -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 diff --git a/routing/payment_session.go b/routing/payment_session.go index b1d8a9b0..fe10a501 100644 --- a/routing/payment_session.go +++ b/routing/payment_session.go @@ -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, diff --git a/routing/route/route.go b/routing/route/route.go index ad639b53..50688c57 100644 --- a/routing/route/route.go +++ b/routing/route/route.go @@ -11,13 +11,16 @@ import ( "github.com/lightningnetwork/lnd/lnwire" ) +// VertexSize is the size of the array to store a vertex. +const VertexSize = 33 + // ErrNoRouteHopsProvided is returned when a caller attempts to construct a new // sphinx packet, but provides an empty set of hops for each route. var ErrNoRouteHopsProvided = fmt.Errorf("empty route hops provided") // Vertex is a simple alias for the serialization of a compressed Bitcoin // public key. -type Vertex [33]byte +type Vertex [VertexSize]byte // NewVertex returns a new Vertex given a public key. func NewVertex(pub *btcec.PublicKey) Vertex { @@ -26,6 +29,20 @@ func NewVertex(pub *btcec.PublicKey) Vertex { return v } +// NewVertexFromBytes returns a new Vertex based on a serialized pubkey in a +// byte slice. +func NewVertexFromBytes(b []byte) (Vertex, error) { + vertexLen := len(b) + if vertexLen != VertexSize { + return Vertex{}, fmt.Errorf("invalid vertex length of %v, "+ + "want %v", vertexLen, VertexSize) + } + + var v Vertex + copy(v[:], b) + return v, nil +} + // String returns a human readable version of the Vertex which is the // hex-encoding of the serialized compressed public key. func (v Vertex) String() string { diff --git a/routing/router.go b/routing/router.go index 146e06ca..6a8c0308 100644 --- a/routing/router.go +++ b/routing/router.go @@ -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 diff --git a/routing/router_test.go b/routing/router_test.go index 28ab1692..e27914e9 100644 --- a/routing/router_test.go +++ b/routing/router_test.go @@ -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,