Merge pull request #3054 from joostjager/remove-k-shortest

lnrpc+routing: remove k shortest path finding
This commit is contained in:
Olaoluwa Osuntokun 2019-05-10 15:51:01 -07:00 committed by GitHub
commit f8c824fb1d
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
13 changed files with 714 additions and 1228 deletions

View File

@ -2977,11 +2977,6 @@ var queryRoutesCommand = cli.Command{
Usage: "percentage of the payment's amount used as the " +
"maximum fee allowed when sending the payment",
},
cli.Int64Flag{
Name: "num_max_routes",
Usage: "the max number of routes to be returned",
Value: 10,
},
cli.Int64Flag{
Name: "final_cltv_delta",
Usage: "(optional) number of blocks the last hop has to reveal " +
@ -3035,7 +3030,6 @@ func queryRoutes(ctx *cli.Context) error {
PubKey: dest,
Amt: amt,
FeeLimit: feeLimit,
NumRoutes: int32(ctx.Int("num_max_routes")),
FinalCltvDelta: int32(ctx.Int("final_cltv_delta")),
}

View File

@ -1460,7 +1460,6 @@ func testUpdateChannelPolicy(net *lntest.NetworkHarness, t *harnessTest) {
routesReq := &lnrpc.QueryRoutesRequest{
PubKey: carol.PubKeyStr,
Amt: int64(payAmt),
NumRoutes: 1,
FinalCltvDelta: defaultTimeLockDelta,
}
@ -4270,7 +4269,6 @@ func testSingleHopSendToRoute(net *lntest.NetworkHarness, t *harnessTest) {
routesReq := &lnrpc.QueryRoutesRequest{
PubKey: net.Bob.PubKeyStr,
Amt: paymentAmt,
NumRoutes: 1,
FinalCltvDelta: defaultBitcoinTimeLockDelta,
}
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
@ -4442,7 +4440,6 @@ func testMultiHopSendToRoute(net *lntest.NetworkHarness, t *harnessTest) {
routesReq := &lnrpc.QueryRoutesRequest{
PubKey: carol.PubKeyStr,
Amt: paymentAmt,
NumRoutes: 1,
FinalCltvDelta: defaultBitcoinTimeLockDelta,
}
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
@ -4603,9 +4600,8 @@ func testSendToRouteErrorPropagation(net *lntest.NetworkHarness, t *harnessTest)
// Query routes from Carol to Charlie which will be an invalid route
// for Alice -> Bob.
fakeReq := &lnrpc.QueryRoutesRequest{
PubKey: charlie.PubKeyStr,
Amt: int64(1),
NumRoutes: 1,
PubKey: charlie.PubKeyStr,
Amt: int64(1),
}
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
fakeRoute, err := carol.QueryRoutes(ctxt, fakeReq)
@ -12342,9 +12338,8 @@ func testQueryRoutes(net *lntest.NetworkHarness, t *harnessTest) {
// Query for routes to pay from Alice to Dave.
const paymentAmt = 1000
routesReq := &lnrpc.QueryRoutesRequest{
PubKey: dave.PubKeyStr,
Amt: paymentAmt,
NumRoutes: 1,
PubKey: dave.PubKeyStr,
Amt: paymentAmt,
}
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
routesRes, err := net.Alice.QueryRoutes(ctxt, routesReq)
@ -12646,10 +12641,9 @@ func testRouteFeeCutoff(net *lntest.NetworkHarness, t *harnessTest) {
// payments.
testFeeCutoff := func(feeLimit *lnrpc.FeeLimit) {
queryRoutesReq := &lnrpc.QueryRoutesRequest{
PubKey: dave.PubKeyStr,
Amt: paymentAmt,
FeeLimit: feeLimit,
NumRoutes: 2,
PubKey: dave.PubKeyStr,
Amt: paymentAmt,
FeeLimit: feeLimit,
}
ctxt, _ = context.WithTimeout(ctxb, defaultTimeout)
routesResp, err := net.Alice.QueryRoutes(ctxt, queryRoutesReq)
@ -12657,11 +12651,6 @@ func testRouteFeeCutoff(net *lntest.NetworkHarness, t *harnessTest) {
t.Fatalf("unable to get routes: %v", err)
}
if len(routesResp.Routes) != 1 {
t.Fatalf("expected one route, got %d",
len(routesResp.Routes))
}
checkRoute(routesResp.Routes[0])
invoice := &lnrpc.Invoice{Value: paymentAmt}

View File

@ -28,10 +28,9 @@ type RouterBackend struct {
// FindRoutes is a closure that abstracts away how we locate/query for
// routes.
FindRoutes func(source, target route.Vertex,
FindRoute func(source, target route.Vertex,
amt lnwire.MilliSatoshi, restrictions *routing.RestrictParams,
numPaths uint32, finalExpiry ...uint16) (
[]*route.Route, error)
finalExpiry ...uint16) (*route.Route, error)
}
// QueryRoutes attempts to query the daemons' Channel Router for a possible
@ -122,53 +121,35 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
IgnoredEdges: ignoredEdges,
}
// numRoutes will default to 10 if not specified explicitly.
numRoutesIn := uint32(in.NumRoutes)
if numRoutesIn == 0 {
numRoutesIn = 10
}
// Query the channel router for a possible path to the destination that
// can carry `in.Amt` satoshis _including_ the total fee required on
// the route.
var (
routes []*route.Route
route *route.Route
findErr error
)
if in.FinalCltvDelta == 0 {
routes, findErr = r.FindRoutes(
route, findErr = r.FindRoute(
sourcePubKey, targetPubKey, amtMSat, restrictions,
numRoutesIn,
)
} else {
routes, findErr = r.FindRoutes(
route, findErr = r.FindRoute(
sourcePubKey, targetPubKey, amtMSat, restrictions,
numRoutesIn, uint16(in.FinalCltvDelta),
uint16(in.FinalCltvDelta),
)
}
if findErr != nil {
return nil, findErr
}
// As the number of returned routes can be less than the number of
// requested routes, we'll clamp down the length of the response to the
// minimum of the two.
numRoutes := uint32(len(routes))
if numRoutesIn < numRoutes {
numRoutes = numRoutesIn
}
// For each valid route, we'll convert the result into the format
// required by the RPC system.
rpcRoute := r.MarshallRoute(route)
routeResp := &lnrpc.QueryRoutesResponse{
Routes: make([]*lnrpc.Route, 0, in.NumRoutes),
}
for i := uint32(0); i < numRoutes; i++ {
routeResp.Routes = append(
routeResp.Routes,
r.MarshallRoute(routes[i]),
)
Routes: []*lnrpc.Route{rpcRoute},
}
return routeResp, nil

View File

@ -42,7 +42,6 @@ func TestQueryRoutes(t *testing.T) {
request := &lnrpc.QueryRoutesRequest{
PubKey: destKey,
Amt: 100000,
NumRoutes: 1,
FinalCltvDelta: 100,
FeeLimit: &lnrpc.FeeLimit{
Limit: &lnrpc.FeeLimit_Fixed{
@ -58,19 +57,14 @@ func TestQueryRoutes(t *testing.T) {
rt := &route.Route{}
findRoutes := func(source, target route.Vertex,
findRoute := func(source, target route.Vertex,
amt lnwire.MilliSatoshi, restrictions *routing.RestrictParams,
numPaths uint32, finalExpiry ...uint16) (
[]*route.Route, error) {
finalExpiry ...uint16) (*route.Route, error) {
if int64(amt) != request.Amt*1000 {
t.Fatal("unexpected amount")
}
if numPaths != 1 {
t.Fatal("unexpected number of routes")
}
if source != sourceKey {
t.Fatal("unexpected source key")
}
@ -101,14 +95,12 @@ func TestQueryRoutes(t *testing.T) {
t.Fatal("unexpected ignored node")
}
return []*route.Route{
rt,
}, nil
return rt, nil
}
backend := &RouterBackend{
MaxPaymentMSat: lnwire.NewMSatFromSatoshis(1000000),
FindRoutes: findRoutes,
FindRoute: findRoute,
SelfNode: route.Vertex{1, 2, 3},
FetchChannelCapacity: func(chanID uint64) (
btcutil.Amount, error) {

View File

@ -247,22 +247,18 @@ func (s *Server) EstimateRouteFee(ctx context.Context,
// Finally, we'll query for a route to the destination that can carry
// that target amount, we'll only request a single route.
routes, err := s.cfg.Router.FindRoutes(
route, err := s.cfg.Router.FindRoute(
s.cfg.RouterBackend.SelfNode, destNode, amtMsat,
&routing.RestrictParams{
FeeLimit: feeLimit,
}, 1,
},
)
if err != nil {
return nil, err
}
if len(routes) == 0 {
return nil, fmt.Errorf("unable to find route to dest: %v", err)
}
return &RouteFeeResponse{
RoutingFeeMsat: int64(routes[0].TotalFees),
TimeLockDelay: int64(routes[0].TotalTimeLock),
RoutingFeeMsat: int64(route.TotalFees),
TimeLockDelay: int64(route.TotalTimeLock),
}, nil
}

View File

@ -55,7 +55,7 @@ func (x AddressType) String() string {
return proto.EnumName(AddressType_name, int32(x))
}
func (AddressType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{0}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{0}
}
type ChannelCloseSummary_ClosureType int32
@ -90,7 +90,7 @@ func (x ChannelCloseSummary_ClosureType) String() string {
return proto.EnumName(ChannelCloseSummary_ClosureType_name, int32(x))
}
func (ChannelCloseSummary_ClosureType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{41, 0}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{41, 0}
}
type Peer_SyncType int32
@ -122,7 +122,7 @@ func (x Peer_SyncType) String() string {
return proto.EnumName(Peer_SyncType_name, int32(x))
}
func (Peer_SyncType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{44, 0}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{44, 0}
}
type ChannelEventUpdate_UpdateType int32
@ -151,7 +151,7 @@ func (x ChannelEventUpdate_UpdateType) String() string {
return proto.EnumName(ChannelEventUpdate_UpdateType_name, int32(x))
}
func (ChannelEventUpdate_UpdateType) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{62, 0}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{62, 0}
}
type Invoice_InvoiceState int32
@ -180,7 +180,7 @@ func (x Invoice_InvoiceState) String() string {
return proto.EnumName(Invoice_InvoiceState_name, int32(x))
}
func (Invoice_InvoiceState) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{92, 0}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{92, 0}
}
type GenSeedRequest struct {
@ -201,7 +201,7 @@ func (m *GenSeedRequest) Reset() { *m = GenSeedRequest{} }
func (m *GenSeedRequest) String() string { return proto.CompactTextString(m) }
func (*GenSeedRequest) ProtoMessage() {}
func (*GenSeedRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{0}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{0}
}
func (m *GenSeedRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GenSeedRequest.Unmarshal(m, b)
@ -256,7 +256,7 @@ func (m *GenSeedResponse) Reset() { *m = GenSeedResponse{} }
func (m *GenSeedResponse) String() string { return proto.CompactTextString(m) }
func (*GenSeedResponse) ProtoMessage() {}
func (*GenSeedResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{1}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{1}
}
func (m *GenSeedResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GenSeedResponse.Unmarshal(m, b)
@ -329,7 +329,7 @@ func (m *InitWalletRequest) Reset() { *m = InitWalletRequest{} }
func (m *InitWalletRequest) String() string { return proto.CompactTextString(m) }
func (*InitWalletRequest) ProtoMessage() {}
func (*InitWalletRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{2}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{2}
}
func (m *InitWalletRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InitWalletRequest.Unmarshal(m, b)
@ -394,7 +394,7 @@ func (m *InitWalletResponse) Reset() { *m = InitWalletResponse{} }
func (m *InitWalletResponse) String() string { return proto.CompactTextString(m) }
func (*InitWalletResponse) ProtoMessage() {}
func (*InitWalletResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{3}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{3}
}
func (m *InitWalletResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InitWalletResponse.Unmarshal(m, b)
@ -444,7 +444,7 @@ func (m *UnlockWalletRequest) Reset() { *m = UnlockWalletRequest{} }
func (m *UnlockWalletRequest) String() string { return proto.CompactTextString(m) }
func (*UnlockWalletRequest) ProtoMessage() {}
func (*UnlockWalletRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{4}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{4}
}
func (m *UnlockWalletRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UnlockWalletRequest.Unmarshal(m, b)
@ -495,7 +495,7 @@ func (m *UnlockWalletResponse) Reset() { *m = UnlockWalletResponse{} }
func (m *UnlockWalletResponse) String() string { return proto.CompactTextString(m) }
func (*UnlockWalletResponse) ProtoMessage() {}
func (*UnlockWalletResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{5}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{5}
}
func (m *UnlockWalletResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_UnlockWalletResponse.Unmarshal(m, b)
@ -533,7 +533,7 @@ func (m *ChangePasswordRequest) Reset() { *m = ChangePasswordRequest{} }
func (m *ChangePasswordRequest) String() string { return proto.CompactTextString(m) }
func (*ChangePasswordRequest) ProtoMessage() {}
func (*ChangePasswordRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{6}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{6}
}
func (m *ChangePasswordRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChangePasswordRequest.Unmarshal(m, b)
@ -577,7 +577,7 @@ func (m *ChangePasswordResponse) Reset() { *m = ChangePasswordResponse{}
func (m *ChangePasswordResponse) String() string { return proto.CompactTextString(m) }
func (*ChangePasswordResponse) ProtoMessage() {}
func (*ChangePasswordResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{7}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{7}
}
func (m *ChangePasswordResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChangePasswordResponse.Unmarshal(m, b)
@ -619,7 +619,7 @@ func (m *Utxo) Reset() { *m = Utxo{} }
func (m *Utxo) String() string { return proto.CompactTextString(m) }
func (*Utxo) ProtoMessage() {}
func (*Utxo) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{8}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{8}
}
func (m *Utxo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Utxo.Unmarshal(m, b)
@ -707,7 +707,7 @@ func (m *Transaction) Reset() { *m = Transaction{} }
func (m *Transaction) String() string { return proto.CompactTextString(m) }
func (*Transaction) ProtoMessage() {}
func (*Transaction) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{9}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{9}
}
func (m *Transaction) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Transaction.Unmarshal(m, b)
@ -793,7 +793,7 @@ func (m *GetTransactionsRequest) Reset() { *m = GetTransactionsRequest{}
func (m *GetTransactionsRequest) String() string { return proto.CompactTextString(m) }
func (*GetTransactionsRequest) ProtoMessage() {}
func (*GetTransactionsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{10}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{10}
}
func (m *GetTransactionsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetTransactionsRequest.Unmarshal(m, b)
@ -825,7 +825,7 @@ func (m *TransactionDetails) Reset() { *m = TransactionDetails{} }
func (m *TransactionDetails) String() string { return proto.CompactTextString(m) }
func (*TransactionDetails) ProtoMessage() {}
func (*TransactionDetails) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{11}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{11}
}
func (m *TransactionDetails) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_TransactionDetails.Unmarshal(m, b)
@ -866,7 +866,7 @@ func (m *FeeLimit) Reset() { *m = FeeLimit{} }
func (m *FeeLimit) String() string { return proto.CompactTextString(m) }
func (*FeeLimit) ProtoMessage() {}
func (*FeeLimit) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{12}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{12}
}
func (m *FeeLimit) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FeeLimit.Unmarshal(m, b)
@ -1030,7 +1030,7 @@ func (m *SendRequest) Reset() { *m = SendRequest{} }
func (m *SendRequest) String() string { return proto.CompactTextString(m) }
func (*SendRequest) ProtoMessage() {}
func (*SendRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{13}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{13}
}
func (m *SendRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendRequest.Unmarshal(m, b)
@ -1134,7 +1134,7 @@ func (m *SendResponse) Reset() { *m = SendResponse{} }
func (m *SendResponse) String() string { return proto.CompactTextString(m) }
func (*SendResponse) ProtoMessage() {}
func (*SendResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{14}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{14}
}
func (m *SendResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendResponse.Unmarshal(m, b)
@ -1204,7 +1204,7 @@ func (m *SendToRouteRequest) Reset() { *m = SendToRouteRequest{} }
func (m *SendToRouteRequest) String() string { return proto.CompactTextString(m) }
func (*SendToRouteRequest) ProtoMessage() {}
func (*SendToRouteRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{15}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{15}
}
func (m *SendToRouteRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendToRouteRequest.Unmarshal(m, b)
@ -1269,7 +1269,7 @@ func (m *ChannelPoint) Reset() { *m = ChannelPoint{} }
func (m *ChannelPoint) String() string { return proto.CompactTextString(m) }
func (*ChannelPoint) ProtoMessage() {}
func (*ChannelPoint) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{16}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{16}
}
func (m *ChannelPoint) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelPoint.Unmarshal(m, b)
@ -1415,7 +1415,7 @@ func (m *OutPoint) Reset() { *m = OutPoint{} }
func (m *OutPoint) String() string { return proto.CompactTextString(m) }
func (*OutPoint) ProtoMessage() {}
func (*OutPoint) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{17}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{17}
}
func (m *OutPoint) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OutPoint.Unmarshal(m, b)
@ -1470,7 +1470,7 @@ func (m *LightningAddress) Reset() { *m = LightningAddress{} }
func (m *LightningAddress) String() string { return proto.CompactTextString(m) }
func (*LightningAddress) ProtoMessage() {}
func (*LightningAddress) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{18}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{18}
}
func (m *LightningAddress) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LightningAddress.Unmarshal(m, b)
@ -1518,7 +1518,7 @@ func (m *EstimateFeeRequest) Reset() { *m = EstimateFeeRequest{} }
func (m *EstimateFeeRequest) String() string { return proto.CompactTextString(m) }
func (*EstimateFeeRequest) ProtoMessage() {}
func (*EstimateFeeRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{19}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{19}
}
func (m *EstimateFeeRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EstimateFeeRequest.Unmarshal(m, b)
@ -1566,7 +1566,7 @@ func (m *EstimateFeeResponse) Reset() { *m = EstimateFeeResponse{} }
func (m *EstimateFeeResponse) String() string { return proto.CompactTextString(m) }
func (*EstimateFeeResponse) ProtoMessage() {}
func (*EstimateFeeResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{20}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{20}
}
func (m *EstimateFeeResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EstimateFeeResponse.Unmarshal(m, b)
@ -1616,7 +1616,7 @@ func (m *SendManyRequest) Reset() { *m = SendManyRequest{} }
func (m *SendManyRequest) String() string { return proto.CompactTextString(m) }
func (*SendManyRequest) ProtoMessage() {}
func (*SendManyRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{21}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{21}
}
func (m *SendManyRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendManyRequest.Unmarshal(m, b)
@ -1669,7 +1669,7 @@ func (m *SendManyResponse) Reset() { *m = SendManyResponse{} }
func (m *SendManyResponse) String() string { return proto.CompactTextString(m) }
func (*SendManyResponse) ProtoMessage() {}
func (*SendManyResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{22}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{22}
}
func (m *SendManyResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendManyResponse.Unmarshal(m, b)
@ -1719,7 +1719,7 @@ func (m *SendCoinsRequest) Reset() { *m = SendCoinsRequest{} }
func (m *SendCoinsRequest) String() string { return proto.CompactTextString(m) }
func (*SendCoinsRequest) ProtoMessage() {}
func (*SendCoinsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{23}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{23}
}
func (m *SendCoinsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendCoinsRequest.Unmarshal(m, b)
@ -1786,7 +1786,7 @@ func (m *SendCoinsResponse) Reset() { *m = SendCoinsResponse{} }
func (m *SendCoinsResponse) String() string { return proto.CompactTextString(m) }
func (*SendCoinsResponse) ProtoMessage() {}
func (*SendCoinsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{24}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{24}
}
func (m *SendCoinsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SendCoinsResponse.Unmarshal(m, b)
@ -1827,7 +1827,7 @@ func (m *ListUnspentRequest) Reset() { *m = ListUnspentRequest{} }
func (m *ListUnspentRequest) String() string { return proto.CompactTextString(m) }
func (*ListUnspentRequest) ProtoMessage() {}
func (*ListUnspentRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{25}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{25}
}
func (m *ListUnspentRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListUnspentRequest.Unmarshal(m, b)
@ -1873,7 +1873,7 @@ func (m *ListUnspentResponse) Reset() { *m = ListUnspentResponse{} }
func (m *ListUnspentResponse) String() string { return proto.CompactTextString(m) }
func (*ListUnspentResponse) ProtoMessage() {}
func (*ListUnspentResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{26}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{26}
}
func (m *ListUnspentResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListUnspentResponse.Unmarshal(m, b)
@ -1912,7 +1912,7 @@ func (m *NewAddressRequest) Reset() { *m = NewAddressRequest{} }
func (m *NewAddressRequest) String() string { return proto.CompactTextString(m) }
func (*NewAddressRequest) ProtoMessage() {}
func (*NewAddressRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{27}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{27}
}
func (m *NewAddressRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NewAddressRequest.Unmarshal(m, b)
@ -1951,7 +1951,7 @@ func (m *NewAddressResponse) Reset() { *m = NewAddressResponse{} }
func (m *NewAddressResponse) String() string { return proto.CompactTextString(m) }
func (*NewAddressResponse) ProtoMessage() {}
func (*NewAddressResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{28}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{28}
}
func (m *NewAddressResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NewAddressResponse.Unmarshal(m, b)
@ -1990,7 +1990,7 @@ func (m *SignMessageRequest) Reset() { *m = SignMessageRequest{} }
func (m *SignMessageRequest) String() string { return proto.CompactTextString(m) }
func (*SignMessageRequest) ProtoMessage() {}
func (*SignMessageRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{29}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{29}
}
func (m *SignMessageRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignMessageRequest.Unmarshal(m, b)
@ -2029,7 +2029,7 @@ func (m *SignMessageResponse) Reset() { *m = SignMessageResponse{} }
func (m *SignMessageResponse) String() string { return proto.CompactTextString(m) }
func (*SignMessageResponse) ProtoMessage() {}
func (*SignMessageResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{30}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{30}
}
func (m *SignMessageResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_SignMessageResponse.Unmarshal(m, b)
@ -2070,7 +2070,7 @@ func (m *VerifyMessageRequest) Reset() { *m = VerifyMessageRequest{} }
func (m *VerifyMessageRequest) String() string { return proto.CompactTextString(m) }
func (*VerifyMessageRequest) ProtoMessage() {}
func (*VerifyMessageRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{31}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{31}
}
func (m *VerifyMessageRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VerifyMessageRequest.Unmarshal(m, b)
@ -2118,7 +2118,7 @@ func (m *VerifyMessageResponse) Reset() { *m = VerifyMessageResponse{} }
func (m *VerifyMessageResponse) String() string { return proto.CompactTextString(m) }
func (*VerifyMessageResponse) ProtoMessage() {}
func (*VerifyMessageResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{32}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{32}
}
func (m *VerifyMessageResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VerifyMessageResponse.Unmarshal(m, b)
@ -2167,7 +2167,7 @@ func (m *ConnectPeerRequest) Reset() { *m = ConnectPeerRequest{} }
func (m *ConnectPeerRequest) String() string { return proto.CompactTextString(m) }
func (*ConnectPeerRequest) ProtoMessage() {}
func (*ConnectPeerRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{33}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{33}
}
func (m *ConnectPeerRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ConnectPeerRequest.Unmarshal(m, b)
@ -2211,7 +2211,7 @@ func (m *ConnectPeerResponse) Reset() { *m = ConnectPeerResponse{} }
func (m *ConnectPeerResponse) String() string { return proto.CompactTextString(m) }
func (*ConnectPeerResponse) ProtoMessage() {}
func (*ConnectPeerResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{34}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{34}
}
func (m *ConnectPeerResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ConnectPeerResponse.Unmarshal(m, b)
@ -2243,7 +2243,7 @@ func (m *DisconnectPeerRequest) Reset() { *m = DisconnectPeerRequest{} }
func (m *DisconnectPeerRequest) String() string { return proto.CompactTextString(m) }
func (*DisconnectPeerRequest) ProtoMessage() {}
func (*DisconnectPeerRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{35}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{35}
}
func (m *DisconnectPeerRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectPeerRequest.Unmarshal(m, b)
@ -2280,7 +2280,7 @@ func (m *DisconnectPeerResponse) Reset() { *m = DisconnectPeerResponse{}
func (m *DisconnectPeerResponse) String() string { return proto.CompactTextString(m) }
func (*DisconnectPeerResponse) ProtoMessage() {}
func (*DisconnectPeerResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{36}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{36}
}
func (m *DisconnectPeerResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DisconnectPeerResponse.Unmarshal(m, b)
@ -2314,7 +2314,7 @@ func (m *HTLC) Reset() { *m = HTLC{} }
func (m *HTLC) String() string { return proto.CompactTextString(m) }
func (*HTLC) ProtoMessage() {}
func (*HTLC) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{37}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{37}
}
func (m *HTLC) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HTLC.Unmarshal(m, b)
@ -2429,7 +2429,7 @@ func (m *Channel) Reset() { *m = Channel{} }
func (m *Channel) String() string { return proto.CompactTextString(m) }
func (*Channel) ProtoMessage() {}
func (*Channel) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{38}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{38}
}
func (m *Channel) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Channel.Unmarshal(m, b)
@ -2596,7 +2596,7 @@ func (m *ListChannelsRequest) Reset() { *m = ListChannelsRequest{} }
func (m *ListChannelsRequest) String() string { return proto.CompactTextString(m) }
func (*ListChannelsRequest) ProtoMessage() {}
func (*ListChannelsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{39}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{39}
}
func (m *ListChannelsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListChannelsRequest.Unmarshal(m, b)
@ -2656,7 +2656,7 @@ func (m *ListChannelsResponse) Reset() { *m = ListChannelsResponse{} }
func (m *ListChannelsResponse) String() string { return proto.CompactTextString(m) }
func (*ListChannelsResponse) ProtoMessage() {}
func (*ListChannelsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{40}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{40}
}
func (m *ListChannelsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListChannelsResponse.Unmarshal(m, b)
@ -2713,7 +2713,7 @@ func (m *ChannelCloseSummary) Reset() { *m = ChannelCloseSummary{} }
func (m *ChannelCloseSummary) String() string { return proto.CompactTextString(m) }
func (*ChannelCloseSummary) ProtoMessage() {}
func (*ChannelCloseSummary) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{41}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{41}
}
func (m *ChannelCloseSummary) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelCloseSummary.Unmarshal(m, b)
@ -2819,7 +2819,7 @@ func (m *ClosedChannelsRequest) Reset() { *m = ClosedChannelsRequest{} }
func (m *ClosedChannelsRequest) String() string { return proto.CompactTextString(m) }
func (*ClosedChannelsRequest) ProtoMessage() {}
func (*ClosedChannelsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{42}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{42}
}
func (m *ClosedChannelsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClosedChannelsRequest.Unmarshal(m, b)
@ -2892,7 +2892,7 @@ func (m *ClosedChannelsResponse) Reset() { *m = ClosedChannelsResponse{}
func (m *ClosedChannelsResponse) String() string { return proto.CompactTextString(m) }
func (*ClosedChannelsResponse) ProtoMessage() {}
func (*ClosedChannelsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{43}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{43}
}
func (m *ClosedChannelsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClosedChannelsResponse.Unmarshal(m, b)
@ -2947,7 +2947,7 @@ func (m *Peer) Reset() { *m = Peer{} }
func (m *Peer) String() string { return proto.CompactTextString(m) }
func (*Peer) ProtoMessage() {}
func (*Peer) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{44}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{44}
}
func (m *Peer) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Peer.Unmarshal(m, b)
@ -3040,7 +3040,7 @@ func (m *ListPeersRequest) Reset() { *m = ListPeersRequest{} }
func (m *ListPeersRequest) String() string { return proto.CompactTextString(m) }
func (*ListPeersRequest) ProtoMessage() {}
func (*ListPeersRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{45}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{45}
}
func (m *ListPeersRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListPeersRequest.Unmarshal(m, b)
@ -3072,7 +3072,7 @@ func (m *ListPeersResponse) Reset() { *m = ListPeersResponse{} }
func (m *ListPeersResponse) String() string { return proto.CompactTextString(m) }
func (*ListPeersResponse) ProtoMessage() {}
func (*ListPeersResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{46}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{46}
}
func (m *ListPeersResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListPeersResponse.Unmarshal(m, b)
@ -3109,7 +3109,7 @@ func (m *GetInfoRequest) Reset() { *m = GetInfoRequest{} }
func (m *GetInfoRequest) String() string { return proto.CompactTextString(m) }
func (*GetInfoRequest) ProtoMessage() {}
func (*GetInfoRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{47}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{47}
}
func (m *GetInfoRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetInfoRequest.Unmarshal(m, b)
@ -3169,7 +3169,7 @@ func (m *GetInfoResponse) Reset() { *m = GetInfoResponse{} }
func (m *GetInfoResponse) String() string { return proto.CompactTextString(m) }
func (*GetInfoResponse) ProtoMessage() {}
func (*GetInfoResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{48}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{48}
}
func (m *GetInfoResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GetInfoResponse.Unmarshal(m, b)
@ -3302,7 +3302,7 @@ func (m *Chain) Reset() { *m = Chain{} }
func (m *Chain) String() string { return proto.CompactTextString(m) }
func (*Chain) ProtoMessage() {}
func (*Chain) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{49}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{49}
}
func (m *Chain) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Chain.Unmarshal(m, b)
@ -3349,7 +3349,7 @@ func (m *ConfirmationUpdate) Reset() { *m = ConfirmationUpdate{} }
func (m *ConfirmationUpdate) String() string { return proto.CompactTextString(m) }
func (*ConfirmationUpdate) ProtoMessage() {}
func (*ConfirmationUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{50}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{50}
}
func (m *ConfirmationUpdate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ConfirmationUpdate.Unmarshal(m, b)
@ -3401,7 +3401,7 @@ func (m *ChannelOpenUpdate) Reset() { *m = ChannelOpenUpdate{} }
func (m *ChannelOpenUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelOpenUpdate) ProtoMessage() {}
func (*ChannelOpenUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{51}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{51}
}
func (m *ChannelOpenUpdate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelOpenUpdate.Unmarshal(m, b)
@ -3440,7 +3440,7 @@ func (m *ChannelCloseUpdate) Reset() { *m = ChannelCloseUpdate{} }
func (m *ChannelCloseUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelCloseUpdate) ProtoMessage() {}
func (*ChannelCloseUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{52}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{52}
}
func (m *ChannelCloseUpdate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelCloseUpdate.Unmarshal(m, b)
@ -3495,7 +3495,7 @@ func (m *CloseChannelRequest) Reset() { *m = CloseChannelRequest{} }
func (m *CloseChannelRequest) String() string { return proto.CompactTextString(m) }
func (*CloseChannelRequest) ProtoMessage() {}
func (*CloseChannelRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{53}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{53}
}
func (m *CloseChannelRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CloseChannelRequest.Unmarshal(m, b)
@ -3557,7 +3557,7 @@ func (m *CloseStatusUpdate) Reset() { *m = CloseStatusUpdate{} }
func (m *CloseStatusUpdate) String() string { return proto.CompactTextString(m) }
func (*CloseStatusUpdate) ProtoMessage() {}
func (*CloseStatusUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{54}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{54}
}
func (m *CloseStatusUpdate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_CloseStatusUpdate.Unmarshal(m, b)
@ -3700,7 +3700,7 @@ func (m *PendingUpdate) Reset() { *m = PendingUpdate{} }
func (m *PendingUpdate) String() string { return proto.CompactTextString(m) }
func (*PendingUpdate) ProtoMessage() {}
func (*PendingUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{55}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{55}
}
func (m *PendingUpdate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PendingUpdate.Unmarshal(m, b)
@ -3766,7 +3766,7 @@ func (m *OpenChannelRequest) Reset() { *m = OpenChannelRequest{} }
func (m *OpenChannelRequest) String() string { return proto.CompactTextString(m) }
func (*OpenChannelRequest) ProtoMessage() {}
func (*OpenChannelRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{56}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{56}
}
func (m *OpenChannelRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OpenChannelRequest.Unmarshal(m, b)
@ -3877,7 +3877,7 @@ func (m *OpenStatusUpdate) Reset() { *m = OpenStatusUpdate{} }
func (m *OpenStatusUpdate) String() string { return proto.CompactTextString(m) }
func (*OpenStatusUpdate) ProtoMessage() {}
func (*OpenStatusUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{57}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{57}
}
func (m *OpenStatusUpdate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_OpenStatusUpdate.Unmarshal(m, b)
@ -4033,7 +4033,7 @@ func (m *PendingHTLC) Reset() { *m = PendingHTLC{} }
func (m *PendingHTLC) String() string { return proto.CompactTextString(m) }
func (*PendingHTLC) ProtoMessage() {}
func (*PendingHTLC) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{58}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{58}
}
func (m *PendingHTLC) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PendingHTLC.Unmarshal(m, b)
@ -4105,7 +4105,7 @@ func (m *PendingChannelsRequest) Reset() { *m = PendingChannelsRequest{}
func (m *PendingChannelsRequest) String() string { return proto.CompactTextString(m) }
func (*PendingChannelsRequest) ProtoMessage() {}
func (*PendingChannelsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{59}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{59}
}
func (m *PendingChannelsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PendingChannelsRequest.Unmarshal(m, b)
@ -4145,7 +4145,7 @@ func (m *PendingChannelsResponse) Reset() { *m = PendingChannelsResponse
func (m *PendingChannelsResponse) String() string { return proto.CompactTextString(m) }
func (*PendingChannelsResponse) ProtoMessage() {}
func (*PendingChannelsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{60}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{60}
}
func (m *PendingChannelsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PendingChannelsResponse.Unmarshal(m, b)
@ -4217,7 +4217,7 @@ func (m *PendingChannelsResponse_PendingChannel) Reset() {
func (m *PendingChannelsResponse_PendingChannel) String() string { return proto.CompactTextString(m) }
func (*PendingChannelsResponse_PendingChannel) ProtoMessage() {}
func (*PendingChannelsResponse_PendingChannel) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{60, 0}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 0}
}
func (m *PendingChannelsResponse_PendingChannel) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PendingChannelsResponse_PendingChannel.Unmarshal(m, b)
@ -4304,7 +4304,7 @@ func (m *PendingChannelsResponse_PendingOpenChannel) String() string {
}
func (*PendingChannelsResponse_PendingOpenChannel) ProtoMessage() {}
func (*PendingChannelsResponse_PendingOpenChannel) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{60, 1}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 1}
}
func (m *PendingChannelsResponse_PendingOpenChannel) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PendingChannelsResponse_PendingOpenChannel.Unmarshal(m, b)
@ -4377,7 +4377,7 @@ func (m *PendingChannelsResponse_WaitingCloseChannel) String() string {
}
func (*PendingChannelsResponse_WaitingCloseChannel) ProtoMessage() {}
func (*PendingChannelsResponse_WaitingCloseChannel) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{60, 2}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 2}
}
func (m *PendingChannelsResponse_WaitingCloseChannel) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PendingChannelsResponse_WaitingCloseChannel.Unmarshal(m, b)
@ -4425,7 +4425,7 @@ func (m *PendingChannelsResponse_ClosedChannel) Reset() { *m = PendingCh
func (m *PendingChannelsResponse_ClosedChannel) String() string { return proto.CompactTextString(m) }
func (*PendingChannelsResponse_ClosedChannel) ProtoMessage() {}
func (*PendingChannelsResponse_ClosedChannel) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{60, 3}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 3}
}
func (m *PendingChannelsResponse_ClosedChannel) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PendingChannelsResponse_ClosedChannel.Unmarshal(m, b)
@ -4489,7 +4489,7 @@ func (m *PendingChannelsResponse_ForceClosedChannel) String() string {
}
func (*PendingChannelsResponse_ForceClosedChannel) ProtoMessage() {}
func (*PendingChannelsResponse_ForceClosedChannel) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{60, 4}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{60, 4}
}
func (m *PendingChannelsResponse_ForceClosedChannel) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PendingChannelsResponse_ForceClosedChannel.Unmarshal(m, b)
@ -4568,7 +4568,7 @@ func (m *ChannelEventSubscription) Reset() { *m = ChannelEventSubscripti
func (m *ChannelEventSubscription) String() string { return proto.CompactTextString(m) }
func (*ChannelEventSubscription) ProtoMessage() {}
func (*ChannelEventSubscription) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{61}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{61}
}
func (m *ChannelEventSubscription) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelEventSubscription.Unmarshal(m, b)
@ -4605,7 +4605,7 @@ func (m *ChannelEventUpdate) Reset() { *m = ChannelEventUpdate{} }
func (m *ChannelEventUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelEventUpdate) ProtoMessage() {}
func (*ChannelEventUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{62}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{62}
}
func (m *ChannelEventUpdate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelEventUpdate.Unmarshal(m, b)
@ -4817,7 +4817,7 @@ func (m *WalletBalanceRequest) Reset() { *m = WalletBalanceRequest{} }
func (m *WalletBalanceRequest) String() string { return proto.CompactTextString(m) }
func (*WalletBalanceRequest) ProtoMessage() {}
func (*WalletBalanceRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{63}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{63}
}
func (m *WalletBalanceRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WalletBalanceRequest.Unmarshal(m, b)
@ -4853,7 +4853,7 @@ func (m *WalletBalanceResponse) Reset() { *m = WalletBalanceResponse{} }
func (m *WalletBalanceResponse) String() string { return proto.CompactTextString(m) }
func (*WalletBalanceResponse) ProtoMessage() {}
func (*WalletBalanceResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{64}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{64}
}
func (m *WalletBalanceResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_WalletBalanceResponse.Unmarshal(m, b)
@ -4904,7 +4904,7 @@ func (m *ChannelBalanceRequest) Reset() { *m = ChannelBalanceRequest{} }
func (m *ChannelBalanceRequest) String() string { return proto.CompactTextString(m) }
func (*ChannelBalanceRequest) ProtoMessage() {}
func (*ChannelBalanceRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{65}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{65}
}
func (m *ChannelBalanceRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelBalanceRequest.Unmarshal(m, b)
@ -4938,7 +4938,7 @@ func (m *ChannelBalanceResponse) Reset() { *m = ChannelBalanceResponse{}
func (m *ChannelBalanceResponse) String() string { return proto.CompactTextString(m) }
func (*ChannelBalanceResponse) ProtoMessage() {}
func (*ChannelBalanceResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{66}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{66}
}
func (m *ChannelBalanceResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelBalanceResponse.Unmarshal(m, b)
@ -4977,10 +4977,6 @@ type QueryRoutesRequest struct {
PubKey string `protobuf:"bytes,1,opt,name=pub_key,json=pubKey,proto3" json:"pub_key,omitempty"`
// / The amount to send expressed in satoshis
Amt int64 `protobuf:"varint,2,opt,name=amt,proto3" json:"amt,omitempty"`
// *
// Deprecated. The max number of routes to return. In the future, QueryRoutes
// will only return a single route.
NumRoutes int32 `protobuf:"varint,3,opt,name=num_routes,json=numRoutes,proto3" json:"num_routes,omitempty"` // Deprecated: Do not use.
// / An optional CLTV delta from the current height that should be used for the timelock of the final hop
FinalCltvDelta int32 `protobuf:"varint,4,opt,name=final_cltv_delta,json=finalCltvDelta,proto3" json:"final_cltv_delta,omitempty"`
// *
@ -5008,7 +5004,7 @@ func (m *QueryRoutesRequest) Reset() { *m = QueryRoutesRequest{} }
func (m *QueryRoutesRequest) String() string { return proto.CompactTextString(m) }
func (*QueryRoutesRequest) ProtoMessage() {}
func (*QueryRoutesRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_rpc_85b0b58f0d9865bd, []int{67}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{67}
}
func (m *QueryRoutesRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryRoutesRequest.Unmarshal(m, b)
@ -5042,14 +5038,6 @@ func (m *QueryRoutesRequest) GetAmt() int64 {
return 0
}
// Deprecated: Do not use.
func (m *QueryRoutesRequest) GetNumRoutes() int32 {
if m != nil {
return m.NumRoutes
}
return 0
}
func (m *QueryRoutesRequest) GetFinalCltvDelta() int32 {
if m != nil {
return m.FinalCltvDelta
@ -5103,7 +5091,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_rpc_85b0b58f0d9865bd, []int{68}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{68}
}
func (m *EdgeLocator) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_EdgeLocator.Unmarshal(m, b)
@ -5148,7 +5136,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_rpc_85b0b58f0d9865bd, []int{69}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{69}
}
func (m *QueryRoutesResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_QueryRoutesResponse.Unmarshal(m, b)
@ -5200,7 +5188,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_rpc_85b0b58f0d9865bd, []int{70}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{70}
}
func (m *Hop) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Hop.Unmarshal(m, b)
@ -5321,7 +5309,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_rpc_85b0b58f0d9865bd, []int{71}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{71}
}
func (m *Route) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Route.Unmarshal(m, b)
@ -5397,7 +5385,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_rpc_85b0b58f0d9865bd, []int{72}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{72}
}
func (m *NodeInfoRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NodeInfoRequest.Unmarshal(m, b)
@ -5442,7 +5430,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_rpc_85b0b58f0d9865bd, []int{73}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{73}
}
func (m *NodeInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NodeInfo.Unmarshal(m, b)
@ -5503,7 +5491,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_rpc_85b0b58f0d9865bd, []int{74}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{74}
}
func (m *LightningNode) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_LightningNode.Unmarshal(m, b)
@ -5570,7 +5558,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_rpc_85b0b58f0d9865bd, []int{75}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{75}
}
func (m *NodeAddress) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NodeAddress.Unmarshal(m, b)
@ -5620,7 +5608,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_rpc_85b0b58f0d9865bd, []int{76}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{76}
}
func (m *RoutingPolicy) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RoutingPolicy.Unmarshal(m, b)
@ -5710,7 +5698,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_rpc_85b0b58f0d9865bd, []int{77}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{77}
}
func (m *ChannelEdge) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelEdge.Unmarshal(m, b)
@ -5801,7 +5789,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_rpc_85b0b58f0d9865bd, []int{78}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{78}
}
func (m *ChannelGraphRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelGraphRequest.Unmarshal(m, b)
@ -5843,7 +5831,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_rpc_85b0b58f0d9865bd, []int{79}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{79}
}
func (m *ChannelGraph) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelGraph.Unmarshal(m, b)
@ -5892,7 +5880,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_rpc_85b0b58f0d9865bd, []int{80}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{80}
}
func (m *ChanInfoRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChanInfoRequest.Unmarshal(m, b)
@ -5929,7 +5917,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_rpc_85b0b58f0d9865bd, []int{81}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{81}
}
func (m *NetworkInfoRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NetworkInfoRequest.Unmarshal(m, b)
@ -5969,7 +5957,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_rpc_85b0b58f0d9865bd, []int{82}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{82}
}
func (m *NetworkInfo) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NetworkInfo.Unmarshal(m, b)
@ -6069,7 +6057,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_rpc_85b0b58f0d9865bd, []int{83}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{83}
}
func (m *StopRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StopRequest.Unmarshal(m, b)
@ -6099,7 +6087,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_rpc_85b0b58f0d9865bd, []int{84}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{84}
}
func (m *StopResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_StopResponse.Unmarshal(m, b)
@ -6129,7 +6117,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_rpc_85b0b58f0d9865bd, []int{85}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{85}
}
func (m *GraphTopologySubscription) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GraphTopologySubscription.Unmarshal(m, b)
@ -6162,7 +6150,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_rpc_85b0b58f0d9865bd, []int{86}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{86}
}
func (m *GraphTopologyUpdate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_GraphTopologyUpdate.Unmarshal(m, b)
@ -6217,7 +6205,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_rpc_85b0b58f0d9865bd, []int{87}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{87}
}
func (m *NodeUpdate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_NodeUpdate.Unmarshal(m, b)
@ -6285,7 +6273,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_rpc_85b0b58f0d9865bd, []int{88}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{88}
}
func (m *ChannelEdgeUpdate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelEdgeUpdate.Unmarshal(m, b)
@ -6365,7 +6353,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_rpc_85b0b58f0d9865bd, []int{89}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{89}
}
func (m *ClosedChannelUpdate) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ClosedChannelUpdate.Unmarshal(m, b)
@ -6435,7 +6423,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_rpc_85b0b58f0d9865bd, []int{90}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{90}
}
func (m *HopHint) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_HopHint.Unmarshal(m, b)
@ -6504,7 +6492,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_rpc_85b0b58f0d9865bd, []int{91}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{91}
}
func (m *RouteHint) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RouteHint.Unmarshal(m, b)
@ -6619,7 +6607,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_rpc_85b0b58f0d9865bd, []int{92}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{92}
}
func (m *Invoice) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Invoice.Unmarshal(m, b)
@ -6811,7 +6799,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_rpc_85b0b58f0d9865bd, []int{93}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{93}
}
func (m *AddInvoiceResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AddInvoiceResponse.Unmarshal(m, b)
@ -6868,7 +6856,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_rpc_85b0b58f0d9865bd, []int{94}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{94}
}
func (m *PaymentHash) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PaymentHash.Unmarshal(m, b)
@ -6924,7 +6912,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_rpc_85b0b58f0d9865bd, []int{95}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{95}
}
func (m *ListInvoiceRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListInvoiceRequest.Unmarshal(m, b)
@ -6994,7 +6982,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_rpc_85b0b58f0d9865bd, []int{96}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{96}
}
func (m *ListInvoiceResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListInvoiceResponse.Unmarshal(m, b)
@ -7057,7 +7045,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_rpc_85b0b58f0d9865bd, []int{97}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{97}
}
func (m *InvoiceSubscription) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_InvoiceSubscription.Unmarshal(m, b)
@ -7117,7 +7105,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_rpc_85b0b58f0d9865bd, []int{98}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{98}
}
func (m *Payment) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_Payment.Unmarshal(m, b)
@ -7204,7 +7192,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_rpc_85b0b58f0d9865bd, []int{99}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{99}
}
func (m *ListPaymentsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListPaymentsRequest.Unmarshal(m, b)
@ -7236,7 +7224,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_rpc_85b0b58f0d9865bd, []int{100}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{100}
}
func (m *ListPaymentsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListPaymentsResponse.Unmarshal(m, b)
@ -7273,7 +7261,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_rpc_85b0b58f0d9865bd, []int{101}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{101}
}
func (m *DeleteAllPaymentsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DeleteAllPaymentsRequest.Unmarshal(m, b)
@ -7303,7 +7291,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_rpc_85b0b58f0d9865bd, []int{102}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{102}
}
func (m *DeleteAllPaymentsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DeleteAllPaymentsResponse.Unmarshal(m, b)
@ -7334,7 +7322,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_rpc_85b0b58f0d9865bd, []int{103}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{103}
}
func (m *AbandonChannelRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AbandonChannelRequest.Unmarshal(m, b)
@ -7371,7 +7359,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_rpc_85b0b58f0d9865bd, []int{104}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{104}
}
func (m *AbandonChannelResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_AbandonChannelResponse.Unmarshal(m, b)
@ -7403,7 +7391,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_rpc_85b0b58f0d9865bd, []int{105}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{105}
}
func (m *DebugLevelRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DebugLevelRequest.Unmarshal(m, b)
@ -7448,7 +7436,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_rpc_85b0b58f0d9865bd, []int{106}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{106}
}
func (m *DebugLevelResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DebugLevelResponse.Unmarshal(m, b)
@ -7487,7 +7475,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_rpc_85b0b58f0d9865bd, []int{107}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{107}
}
func (m *PayReqString) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PayReqString.Unmarshal(m, b)
@ -7534,7 +7522,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_rpc_85b0b58f0d9865bd, []int{108}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{108}
}
func (m *PayReq) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PayReq.Unmarshal(m, b)
@ -7634,7 +7622,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_rpc_85b0b58f0d9865bd, []int{109}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{109}
}
func (m *FeeReportRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FeeReportRequest.Unmarshal(m, b)
@ -7672,7 +7660,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_rpc_85b0b58f0d9865bd, []int{110}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{110}
}
func (m *ChannelFeeReport) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelFeeReport.Unmarshal(m, b)
@ -7738,7 +7726,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_rpc_85b0b58f0d9865bd, []int{111}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{111}
}
func (m *FeeReportResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_FeeReportResponse.Unmarshal(m, b)
@ -7806,7 +7794,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_rpc_85b0b58f0d9865bd, []int{112}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{112}
}
func (m *PolicyUpdateRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PolicyUpdateRequest.Unmarshal(m, b)
@ -7967,7 +7955,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_rpc_85b0b58f0d9865bd, []int{113}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{113}
}
func (m *PolicyUpdateResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_PolicyUpdateResponse.Unmarshal(m, b)
@ -8005,7 +7993,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_rpc_85b0b58f0d9865bd, []int{114}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{114}
}
func (m *ForwardingHistoryRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ForwardingHistoryRequest.Unmarshal(m, b)
@ -8077,7 +8065,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_rpc_85b0b58f0d9865bd, []int{115}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{115}
}
func (m *ForwardingEvent) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ForwardingEvent.Unmarshal(m, b)
@ -8160,7 +8148,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_rpc_85b0b58f0d9865bd, []int{116}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{116}
}
func (m *ForwardingHistoryResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ForwardingHistoryResponse.Unmarshal(m, b)
@ -8206,7 +8194,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_rpc_85b0b58f0d9865bd, []int{117}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{117}
}
func (m *ExportChannelBackupRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ExportChannelBackupRequest.Unmarshal(m, b)
@ -8251,7 +8239,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_rpc_85b0b58f0d9865bd, []int{118}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{118}
}
func (m *ChannelBackup) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelBackup.Unmarshal(m, b)
@ -8303,7 +8291,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_rpc_85b0b58f0d9865bd, []int{119}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{119}
}
func (m *MultiChanBackup) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_MultiChanBackup.Unmarshal(m, b)
@ -8347,7 +8335,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_rpc_85b0b58f0d9865bd, []int{120}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{120}
}
func (m *ChanBackupExportRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChanBackupExportRequest.Unmarshal(m, b)
@ -8385,7 +8373,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_rpc_85b0b58f0d9865bd, []int{121}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{121}
}
func (m *ChanBackupSnapshot) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChanBackupSnapshot.Unmarshal(m, b)
@ -8432,7 +8420,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_rpc_85b0b58f0d9865bd, []int{122}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{122}
}
func (m *ChannelBackups) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelBackups.Unmarshal(m, b)
@ -8473,7 +8461,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_rpc_85b0b58f0d9865bd, []int{123}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{123}
}
func (m *RestoreChanBackupRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RestoreChanBackupRequest.Unmarshal(m, b)
@ -8610,7 +8598,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_rpc_85b0b58f0d9865bd, []int{124}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{124}
}
func (m *RestoreBackupResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_RestoreBackupResponse.Unmarshal(m, b)
@ -8640,7 +8628,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_rpc_85b0b58f0d9865bd, []int{125}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{125}
}
func (m *ChannelBackupSubscription) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ChannelBackupSubscription.Unmarshal(m, b)
@ -8670,7 +8658,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_rpc_85b0b58f0d9865bd, []int{126}
return fileDescriptor_rpc_c21d4a52f85dc337, []int{126}
}
func (m *VerifyChanBackupResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_VerifyChanBackupResponse.Unmarshal(m, b)
@ -11462,492 +11450,491 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
Metadata: "rpc.proto",
}
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_rpc_85b0b58f0d9865bd) }
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_rpc_c21d4a52f85dc337) }
var fileDescriptor_rpc_85b0b58f0d9865bd = []byte{
// 7735 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7c, 0x5b, 0x6c, 0x24, 0xd9,
0x59, 0xb0, 0xab, 0x2f, 0x76, 0xf7, 0xd7, 0x6d, 0xbb, 0x7d, 0x7c, 0xeb, 0xe9, 0x99, 0x9d, 0xf5,
0x56, 0x26, 0x33, 0x8e, 0x77, 0xff, 0xf1, 0xec, 0x24, 0xd9, 0x4c, 0x76, 0xfe, 0xfc, 0xf9, 0x7d,
0x9b, 0xf1, 0x64, 0xbd, 0x1e, 0xa7, 0x3c, 0x93, 0xf9, 0x77, 0x93, 0x5f, 0x9d, 0x72, 0xf7, 0x71,
0xbb, 0x76, 0xba, 0xab, 0x7a, 0xab, 0xaa, 0xed, 0x71, 0x96, 0x41, 0x08, 0x21, 0x40, 0x08, 0x84,
0x02, 0x02, 0x11, 0x04, 0x42, 0x4a, 0x90, 0x20, 0xe2, 0x89, 0x87, 0x20, 0x24, 0x08, 0xaf, 0x48,
0x91, 0x10, 0x42, 0x79, 0x44, 0x02, 0x21, 0x78, 0x41, 0x3c, 0x20, 0x90, 0x78, 0x44, 0x42, 0xe7,
0x3b, 0x97, 0x3a, 0xa7, 0xaa, 0x7a, 0x3c, 0x9b, 0x04, 0x9e, 0xba, 0xcf, 0x77, 0xbe, 0x3a, 0xd7,
0xef, 0x7e, 0xbe, 0x73, 0xa0, 0x1a, 0x0e, 0x3b, 0x37, 0x87, 0x61, 0x10, 0x07, 0xa4, 0xdc, 0xf7,
0xc3, 0x61, 0xa7, 0x75, 0xa5, 0x17, 0x04, 0xbd, 0x3e, 0x5d, 0x77, 0x87, 0xde, 0xba, 0xeb, 0xfb,
0x41, 0xec, 0xc6, 0x5e, 0xe0, 0x47, 0x1c, 0xc9, 0xfe, 0x3a, 0xcc, 0xdc, 0xa7, 0xfe, 0x21, 0xa5,
0x5d, 0x87, 0x7e, 0x38, 0xa2, 0x51, 0x4c, 0x5e, 0x87, 0x39, 0x97, 0x7e, 0x83, 0xd2, 0x6e, 0x7b,
0xe8, 0x46, 0xd1, 0xf0, 0x24, 0x74, 0x23, 0xda, 0xb4, 0x56, 0xac, 0xd5, 0xba, 0xd3, 0xe0, 0x15,
0x07, 0x0a, 0x4e, 0x5e, 0x83, 0x7a, 0xc4, 0x50, 0xa9, 0x1f, 0x87, 0xc1, 0xf0, 0xbc, 0x59, 0x40,
0xbc, 0x1a, 0x83, 0xed, 0x70, 0x90, 0xdd, 0x87, 0x59, 0xd5, 0x43, 0x34, 0x0c, 0xfc, 0x88, 0x92,
0x5b, 0xb0, 0xd0, 0xf1, 0x86, 0x27, 0x34, 0x6c, 0xe3, 0xc7, 0x03, 0x9f, 0x0e, 0x02, 0xdf, 0xeb,
0x34, 0xad, 0x95, 0xe2, 0x6a, 0xd5, 0x21, 0xbc, 0x8e, 0x7d, 0xf1, 0xae, 0xa8, 0x21, 0x37, 0x60,
0x96, 0xfa, 0x1c, 0x4e, 0xbb, 0xf8, 0x95, 0xe8, 0x6a, 0x26, 0x01, 0xb3, 0x0f, 0xec, 0x5f, 0x2c,
0xc0, 0xdc, 0x03, 0xdf, 0x8b, 0x9f, 0xb8, 0xfd, 0x3e, 0x8d, 0xe5, 0x9c, 0x6e, 0xc0, 0xec, 0x19,
0x02, 0x70, 0x4e, 0x67, 0x41, 0xd8, 0x15, 0x33, 0x9a, 0xe1, 0xe0, 0x03, 0x01, 0x1d, 0x3b, 0xb2,
0xc2, 0xd8, 0x91, 0xe5, 0x2e, 0x57, 0x71, 0xcc, 0x72, 0xdd, 0x80, 0xd9, 0x90, 0x76, 0x82, 0x53,
0x1a, 0x9e, 0xb7, 0xcf, 0x3c, 0xbf, 0x1b, 0x9c, 0x35, 0x4b, 0x2b, 0xd6, 0x6a, 0xd9, 0x99, 0x91,
0xe0, 0x27, 0x08, 0x25, 0x9b, 0x30, 0xdb, 0x39, 0x71, 0x7d, 0x9f, 0xf6, 0xdb, 0x47, 0x6e, 0xe7,
0xe9, 0x68, 0x18, 0x35, 0xcb, 0x2b, 0xd6, 0x6a, 0xed, 0xf6, 0xa5, 0x9b, 0xb8, 0xab, 0x37, 0xb7,
0x4e, 0x5c, 0x7f, 0x13, 0x6b, 0x0e, 0x7d, 0x77, 0x18, 0x9d, 0x04, 0xb1, 0x33, 0x23, 0xbe, 0xe0,
0xe0, 0xc8, 0x5e, 0x00, 0xa2, 0xaf, 0x04, 0x5f, 0x7b, 0xfb, 0x8f, 0x2c, 0x98, 0x7f, 0xec, 0xf7,
0x83, 0xce, 0xd3, 0x1f, 0x71, 0x89, 0x72, 0xe6, 0x50, 0x78, 0xd9, 0x39, 0x14, 0x3f, 0xee, 0x1c,
0x96, 0x60, 0xc1, 0x1c, 0xac, 0x98, 0x05, 0x85, 0x45, 0xf6, 0x75, 0x8f, 0xca, 0x61, 0xc9, 0x69,
0x7c, 0x0a, 0x1a, 0x9d, 0x51, 0x18, 0x52, 0x3f, 0x33, 0x8f, 0x59, 0x01, 0x57, 0x13, 0x79, 0x0d,
0xea, 0x3e, 0x3d, 0x4b, 0xd0, 0x04, 0xed, 0xfa, 0xf4, 0x4c, 0xa2, 0xd8, 0x4d, 0x58, 0x4a, 0x77,
0x23, 0x06, 0xf0, 0x0f, 0x16, 0x94, 0x1e, 0xc7, 0xcf, 0x02, 0x72, 0x13, 0x4a, 0xf1, 0xf9, 0x90,
0x73, 0xc8, 0xcc, 0x6d, 0x22, 0xa6, 0xb6, 0xd1, 0xed, 0x86, 0x34, 0x8a, 0x1e, 0x9d, 0x0f, 0xa9,
0x53, 0x77, 0x79, 0xa1, 0xcd, 0xf0, 0x48, 0x13, 0xa6, 0x44, 0x19, 0x3b, 0xac, 0x3a, 0xb2, 0x48,
0xae, 0x02, 0xb8, 0x83, 0x60, 0xe4, 0xc7, 0xed, 0xc8, 0x8d, 0x71, 0xa9, 0x8a, 0x8e, 0x06, 0x21,
0x57, 0xa0, 0x3a, 0x7c, 0xda, 0x8e, 0x3a, 0xa1, 0x37, 0x8c, 0x91, 0x6c, 0xaa, 0x4e, 0x02, 0x20,
0xaf, 0x43, 0x25, 0x18, 0xc5, 0xc3, 0xc0, 0xf3, 0x63, 0x41, 0x2a, 0xb3, 0x62, 0x2c, 0x0f, 0x47,
0xf1, 0x01, 0x03, 0x3b, 0x0a, 0x81, 0x5c, 0x83, 0xe9, 0x4e, 0xe0, 0x1f, 0x7b, 0xe1, 0x80, 0x0b,
0x83, 0xe6, 0x24, 0xf6, 0x66, 0x02, 0xed, 0x6f, 0x15, 0xa0, 0xf6, 0x28, 0x74, 0xfd, 0xc8, 0xed,
0x30, 0x00, 0x1b, 0x7a, 0xfc, 0xac, 0x7d, 0xe2, 0x46, 0x27, 0x38, 0xdb, 0xaa, 0x23, 0x8b, 0x64,
0x09, 0x26, 0xf9, 0x40, 0x71, 0x4e, 0x45, 0x47, 0x94, 0xc8, 0x1b, 0x30, 0xe7, 0x8f, 0x06, 0x6d,
0xb3, 0xaf, 0x22, 0x52, 0x4b, 0xb6, 0x82, 0x2d, 0xc0, 0x11, 0xdb, 0x6b, 0xde, 0x05, 0x9f, 0xa1,
0x06, 0x21, 0x36, 0xd4, 0x45, 0x89, 0x7a, 0xbd, 0x13, 0x3e, 0xcd, 0xb2, 0x63, 0xc0, 0x58, 0x1b,
0xb1, 0x37, 0xa0, 0xed, 0x28, 0x76, 0x07, 0x43, 0x31, 0x2d, 0x0d, 0x82, 0xf5, 0x41, 0xec, 0xf6,
0xdb, 0xc7, 0x94, 0x46, 0xcd, 0x29, 0x51, 0xaf, 0x20, 0xe4, 0x3a, 0xcc, 0x74, 0x69, 0x14, 0xb7,
0xc5, 0xa6, 0xd0, 0xa8, 0x59, 0x41, 0xd6, 0x4f, 0x41, 0x19, 0x65, 0xdc, 0xa7, 0xb1, 0xb6, 0x3a,
0x91, 0xa0, 0x40, 0x7b, 0x0f, 0x88, 0x06, 0xde, 0xa6, 0xb1, 0xeb, 0xf5, 0x23, 0xf2, 0x16, 0xd4,
0x63, 0x0d, 0x19, 0x45, 0x5d, 0x4d, 0x91, 0x8b, 0xf6, 0x81, 0x63, 0xe0, 0xd9, 0xf7, 0xa1, 0x72,
0x8f, 0xd2, 0x3d, 0x6f, 0xe0, 0xc5, 0x64, 0x09, 0xca, 0xc7, 0xde, 0x33, 0xca, 0x09, 0xba, 0xb8,
0x3b, 0xe1, 0xf0, 0x22, 0x69, 0xc1, 0xd4, 0x90, 0x86, 0x1d, 0x2a, 0x97, 0x7f, 0x77, 0xc2, 0x91,
0x80, 0xcd, 0x29, 0x28, 0xf7, 0xd9, 0xc7, 0xf6, 0xbf, 0x15, 0xa0, 0x76, 0x48, 0x7d, 0xc5, 0x28,
0x04, 0x4a, 0x6c, 0x4a, 0x82, 0x39, 0xf0, 0x3f, 0x79, 0x15, 0x6a, 0x38, 0xcd, 0x28, 0x0e, 0x3d,
0xbf, 0x27, 0xe8, 0x13, 0x18, 0xe8, 0x10, 0x21, 0xa4, 0x01, 0x45, 0x77, 0x20, 0x69, 0x93, 0xfd,
0x65, 0x4c, 0x34, 0x74, 0xcf, 0x07, 0x8c, 0xdf, 0xd4, 0xae, 0xd5, 0x9d, 0x9a, 0x80, 0xed, 0xb2,
0x6d, 0xbb, 0x09, 0xf3, 0x3a, 0x8a, 0x6c, 0xbd, 0x8c, 0xad, 0xcf, 0x69, 0x98, 0xa2, 0x93, 0x1b,
0x30, 0x2b, 0xf1, 0x43, 0x3e, 0x58, 0xdc, 0xc7, 0xaa, 0x33, 0x23, 0xc0, 0x72, 0x0a, 0xab, 0xd0,
0x38, 0xf6, 0x7c, 0xb7, 0xdf, 0xee, 0xf4, 0xe3, 0xd3, 0x76, 0x97, 0xf6, 0x63, 0x17, 0x77, 0xb4,
0xec, 0xcc, 0x20, 0x7c, 0xab, 0x1f, 0x9f, 0x6e, 0x33, 0x28, 0x79, 0x03, 0xaa, 0xc7, 0x94, 0xb6,
0x71, 0x25, 0x9a, 0x15, 0x83, 0x3b, 0xe4, 0xea, 0x3a, 0x95, 0x63, 0xb9, 0xce, 0xab, 0xd0, 0x08,
0x46, 0x71, 0x2f, 0xf0, 0xfc, 0x5e, 0x9b, 0xc9, 0xa3, 0xb6, 0xd7, 0x6d, 0x56, 0x57, 0xac, 0xd5,
0x92, 0x33, 0x23, 0xe1, 0x4c, 0x2a, 0x3c, 0xe8, 0x92, 0x57, 0x00, 0xb0, 0x6f, 0xde, 0x30, 0xac,
0x58, 0xab, 0xd3, 0x4e, 0x95, 0x41, 0xb0, 0x21, 0xfb, 0x4f, 0x2d, 0xa8, 0xf3, 0x35, 0x17, 0x8a,
0xef, 0x1a, 0x4c, 0xcb, 0xa9, 0xd1, 0x30, 0x0c, 0x42, 0xc1, 0x47, 0x26, 0x90, 0xac, 0x41, 0x43,
0x02, 0x86, 0x21, 0xf5, 0x06, 0x6e, 0x8f, 0x0a, 0xe1, 0x94, 0x81, 0x93, 0xdb, 0x49, 0x8b, 0x61,
0x30, 0x8a, 0xa9, 0x10, 0xb1, 0x75, 0x31, 0x3b, 0x87, 0xc1, 0x1c, 0x13, 0x85, 0xf1, 0x51, 0xce,
0x9e, 0x19, 0x30, 0xfb, 0x7b, 0x16, 0x10, 0x36, 0xf4, 0x47, 0x01, 0x6f, 0x42, 0x2c, 0x79, 0x7a,
0xbb, 0xad, 0x97, 0xde, 0xee, 0xc2, 0xb8, 0xed, 0x5e, 0x85, 0x49, 0x1c, 0x16, 0x13, 0x0c, 0xc5,
0xf4, 0xd0, 0x37, 0x0b, 0x4d, 0xcb, 0x11, 0xf5, 0xc4, 0x86, 0x32, 0x9f, 0x63, 0x29, 0x67, 0x8e,
0xbc, 0xca, 0xfe, 0xb6, 0x05, 0xf5, 0x2d, 0xae, 0x43, 0x50, 0xe8, 0x91, 0x5b, 0x40, 0x8e, 0x47,
0x7e, 0x97, 0xed, 0x65, 0xfc, 0xcc, 0xeb, 0xb6, 0x8f, 0xce, 0x59, 0x57, 0x38, 0xee, 0xdd, 0x09,
0x27, 0xa7, 0x8e, 0xbc, 0x01, 0x0d, 0x03, 0x1a, 0xc5, 0x21, 0x1f, 0xfd, 0xee, 0x84, 0x93, 0xa9,
0x61, 0x8b, 0xc9, 0xc4, 0xea, 0x28, 0x6e, 0x7b, 0x7e, 0x97, 0x3e, 0xc3, 0xf5, 0x9f, 0x76, 0x0c,
0xd8, 0xe6, 0x0c, 0xd4, 0xf5, 0xef, 0xec, 0x0f, 0xa0, 0x22, 0x85, 0x32, 0x0a, 0xa4, 0xd4, 0xb8,
0x1c, 0x0d, 0x42, 0x5a, 0x50, 0x31, 0x47, 0xe1, 0x54, 0x3e, 0x4e, 0xdf, 0xf6, 0xff, 0x81, 0xc6,
0x1e, 0x93, 0x8c, 0xbe, 0xe7, 0xf7, 0x84, 0x56, 0x62, 0xe2, 0x7a, 0x38, 0x3a, 0x7a, 0x4a, 0xcf,
0x05, 0xfd, 0x89, 0x12, 0x93, 0x09, 0x27, 0x41, 0x14, 0x8b, 0x7e, 0xf0, 0xbf, 0xfd, 0x97, 0x16,
0x90, 0x9d, 0x28, 0xf6, 0x06, 0x6e, 0x4c, 0xef, 0x51, 0x45, 0x08, 0x0f, 0xa1, 0xce, 0x5a, 0x7b,
0x14, 0x6c, 0x70, 0xb9, 0xcf, 0xe5, 0xd9, 0xeb, 0x62, 0x4b, 0xb2, 0x1f, 0xdc, 0xd4, 0xb1, 0x99,
0x69, 0x78, 0xee, 0x18, 0x0d, 0x30, 0xd9, 0x13, 0xbb, 0x61, 0x8f, 0xc6, 0xa8, 0x14, 0x84, 0x49,
0x01, 0x1c, 0xb4, 0x15, 0xf8, 0xc7, 0xad, 0x2f, 0xc2, 0x5c, 0xa6, 0x0d, 0x26, 0x90, 0x92, 0x69,
0xb0, 0xbf, 0x64, 0x01, 0xca, 0xa7, 0x6e, 0x7f, 0x44, 0x85, 0x26, 0xe2, 0x85, 0xb7, 0x0b, 0x77,
0x2c, 0xbb, 0x03, 0xf3, 0xc6, 0xb8, 0x04, 0x4f, 0x36, 0x61, 0x8a, 0xc9, 0x06, 0xa6, 0x73, 0x51,
0xae, 0x3a, 0xb2, 0x48, 0x6e, 0xc3, 0xc2, 0x31, 0xa5, 0xa1, 0x1b, 0x63, 0xb1, 0x3d, 0xa4, 0x21,
0xee, 0x89, 0x68, 0x39, 0xb7, 0xce, 0xfe, 0x47, 0x0b, 0x66, 0x19, 0xdf, 0xbc, 0xeb, 0xfa, 0xe7,
0x72, 0xad, 0xf6, 0x72, 0xd7, 0x6a, 0x55, 0xac, 0x55, 0x0a, 0xfb, 0xe3, 0x2e, 0x54, 0x31, 0xbd,
0x50, 0x64, 0x05, 0xea, 0xc6, 0x70, 0xcb, 0x5c, 0xc9, 0x45, 0x6e, 0x7c, 0x40, 0xc3, 0xcd, 0xf3,
0x98, 0xfe, 0xf8, 0x4b, 0x79, 0x1d, 0x1a, 0xc9, 0xb0, 0xc5, 0x3a, 0x12, 0x28, 0x31, 0xc2, 0x14,
0x0d, 0xe0, 0x7f, 0xfb, 0x77, 0x2c, 0x8e, 0xb8, 0x15, 0x78, 0x4a, 0x41, 0x32, 0x44, 0xa6, 0x47,
0x25, 0x22, 0xfb, 0x3f, 0xd6, 0x80, 0xf8, 0xf1, 0x27, 0x4b, 0x2e, 0x41, 0x25, 0xa2, 0x7e, 0xb7,
0xed, 0xf6, 0xfb, 0xa8, 0x47, 0x2a, 0xce, 0x14, 0x2b, 0x6f, 0xf4, 0xfb, 0xf6, 0x0d, 0x98, 0xd3,
0x46, 0xf7, 0x82, 0x79, 0xec, 0x03, 0xd9, 0xf3, 0xa2, 0xf8, 0xb1, 0x1f, 0x0d, 0x35, 0xfd, 0x73,
0x19, 0xaa, 0x03, 0xcf, 0xc7, 0x91, 0x71, 0xce, 0x2d, 0x3b, 0x95, 0x81, 0xe7, 0xb3, 0x71, 0x45,
0x58, 0xe9, 0x3e, 0x13, 0x95, 0x05, 0x51, 0xe9, 0x3e, 0xc3, 0x4a, 0xfb, 0x0e, 0xcc, 0x1b, 0xed,
0x89, 0xae, 0x5f, 0x83, 0xf2, 0x28, 0x7e, 0x16, 0x48, 0xeb, 0xa0, 0x26, 0x28, 0x84, 0xd9, 0x99,
0x0e, 0xaf, 0xb1, 0xef, 0xc2, 0xdc, 0x3e, 0x3d, 0x13, 0x8c, 0x2c, 0x07, 0x72, 0xfd, 0x42, 0x1b,
0x14, 0xeb, 0xed, 0x9b, 0x40, 0xf4, 0x8f, 0x13, 0x06, 0x90, 0x16, 0xa9, 0x65, 0x58, 0xa4, 0xf6,
0x75, 0x20, 0x87, 0x5e, 0xcf, 0x7f, 0x97, 0x46, 0x91, 0xdb, 0x53, 0xac, 0xdf, 0x80, 0xe2, 0x20,
0xea, 0x09, 0x51, 0xc5, 0xfe, 0xda, 0x9f, 0x86, 0x79, 0x03, 0x4f, 0x34, 0x7c, 0x05, 0xaa, 0x91,
0xd7, 0xf3, 0xdd, 0x78, 0x14, 0x52, 0xd1, 0x74, 0x02, 0xb0, 0xef, 0xc1, 0xc2, 0x57, 0x68, 0xe8,
0x1d, 0x9f, 0x5f, 0xd4, 0xbc, 0xd9, 0x4e, 0x21, 0xdd, 0xce, 0x0e, 0x2c, 0xa6, 0xda, 0x11, 0xdd,
0x73, 0xf2, 0x15, 0x3b, 0x59, 0x71, 0x78, 0x41, 0x93, 0x7d, 0x05, 0x5d, 0xf6, 0xd9, 0x8f, 0x81,
0x6c, 0x05, 0xbe, 0x4f, 0x3b, 0xf1, 0x01, 0xa5, 0x61, 0xe2, 0x0c, 0x27, 0xb4, 0x5a, 0xbb, 0xbd,
0x2c, 0x56, 0x36, 0x2d, 0x50, 0x05, 0x11, 0x13, 0x28, 0x0d, 0x69, 0x38, 0xc0, 0x86, 0x2b, 0x0e,
0xfe, 0xb7, 0x17, 0x61, 0xde, 0x68, 0x56, 0xb8, 0x0f, 0x6f, 0xc2, 0xe2, 0xb6, 0x17, 0x75, 0xb2,
0x1d, 0x36, 0x61, 0x6a, 0x38, 0x3a, 0x6a, 0x27, 0x9c, 0x28, 0x8b, 0xcc, 0xe2, 0x4c, 0x7f, 0x22,
0x1a, 0xfb, 0x79, 0x0b, 0x4a, 0xbb, 0x8f, 0xf6, 0xb6, 0x98, 0xae, 0xf0, 0xfc, 0x4e, 0x30, 0x60,
0xfa, 0x96, 0x4f, 0x5a, 0x95, 0xc7, 0x72, 0xd8, 0x15, 0xa8, 0xa2, 0x9a, 0x66, 0x46, 0xb4, 0xf0,
0x5b, 0x13, 0x00, 0x33, 0xe0, 0xe9, 0xb3, 0xa1, 0x17, 0xa2, 0x85, 0x2e, 0xed, 0xee, 0x12, 0xaa,
0x99, 0x6c, 0x85, 0xfd, 0x83, 0x32, 0x4c, 0x09, 0xe5, 0x8b, 0xfd, 0x75, 0x62, 0xef, 0x94, 0x8a,
0x91, 0x88, 0x12, 0x33, 0x81, 0x42, 0x3a, 0x08, 0x62, 0xda, 0x36, 0xb6, 0xc1, 0x04, 0xa2, 0x83,
0x22, 0x7c, 0x47, 0xee, 0xd2, 0x14, 0x39, 0x96, 0x01, 0x64, 0x8b, 0x25, 0xed, 0xb3, 0x12, 0xda,
0x67, 0xb2, 0xc8, 0x56, 0xa2, 0xe3, 0x0e, 0xdd, 0x8e, 0x17, 0x9f, 0x0b, 0x91, 0xa0, 0xca, 0xac,
0xed, 0x7e, 0xd0, 0x71, 0x99, 0x57, 0xda, 0x77, 0xfd, 0x0e, 0x95, 0xce, 0x8f, 0x01, 0x64, 0x8e,
0x80, 0x18, 0x92, 0x44, 0xe3, 0xce, 0x42, 0x0a, 0xca, 0xf4, 0x77, 0x27, 0x18, 0x0c, 0xbc, 0x98,
0xf9, 0x0f, 0x68, 0x5b, 0x16, 0x1d, 0x0d, 0xc2, 0x5d, 0x2d, 0x2c, 0x9d, 0xf1, 0xd5, 0xab, 0x4a,
0x57, 0x4b, 0x03, 0xb2, 0x56, 0x98, 0xd6, 0x61, 0x62, 0xec, 0xe9, 0x19, 0x1a, 0x92, 0x45, 0x47,
0x83, 0xb0, 0x7d, 0x18, 0xf9, 0x11, 0x8d, 0xe3, 0x3e, 0xed, 0xaa, 0x01, 0xd5, 0x10, 0x2d, 0x5b,
0x41, 0x6e, 0xc1, 0x3c, 0x77, 0x69, 0x22, 0x37, 0x0e, 0xa2, 0x13, 0x2f, 0x6a, 0x47, 0xcc, 0x39,
0xa8, 0x23, 0x7e, 0x5e, 0x15, 0xb9, 0x03, 0xcb, 0x29, 0x70, 0x48, 0x3b, 0xd4, 0x3b, 0xa5, 0xdd,
0xe6, 0x34, 0x7e, 0x35, 0xae, 0x9a, 0xac, 0x40, 0x8d, 0x79, 0x72, 0xa3, 0x61, 0xd7, 0x65, 0x06,
0xcc, 0x0c, 0xee, 0x83, 0x0e, 0x22, 0x6f, 0xc2, 0xf4, 0x90, 0x72, 0xeb, 0xe7, 0x24, 0xee, 0x77,
0xa2, 0xe6, 0xac, 0x21, 0xdd, 0x18, 0xe5, 0x3a, 0x26, 0x06, 0x23, 0xca, 0x4e, 0x84, 0x26, 0xbd,
0x7b, 0xde, 0x6c, 0x08, 0xb3, 0x5a, 0x02, 0x90, 0x47, 0x42, 0xef, 0xd4, 0x8d, 0x69, 0x73, 0x8e,
0x0b, 0x74, 0x51, 0x64, 0xdf, 0x79, 0xbe, 0x17, 0x7b, 0x6e, 0x1c, 0x84, 0x4d, 0x82, 0x75, 0x09,
0x80, 0x2d, 0x22, 0xd2, 0x47, 0x14, 0xbb, 0xf1, 0x28, 0x6a, 0x1f, 0xf7, 0xdd, 0x5e, 0xd4, 0x9c,
0xe7, 0x76, 0x69, 0xa6, 0xc2, 0xfe, 0x3d, 0x8b, 0x0b, 0x69, 0x41, 0xd0, 0x4a, 0xd8, 0xbe, 0x0a,
0x35, 0x4e, 0xca, 0xed, 0xc0, 0xef, 0x9f, 0x0b, 0xea, 0x06, 0x0e, 0x7a, 0xe8, 0xf7, 0xcf, 0xc9,
0x27, 0x60, 0xda, 0xf3, 0x75, 0x14, 0x2e, 0x0f, 0xea, 0x12, 0x88, 0x48, 0xaf, 0x42, 0x6d, 0x38,
0x3a, 0xea, 0x7b, 0x1d, 0x8e, 0x52, 0xe4, 0xad, 0x70, 0x10, 0x22, 0x30, 0x4b, 0x9b, 0xcf, 0x8a,
0x63, 0x94, 0x10, 0xa3, 0x26, 0x60, 0x0c, 0xc5, 0xde, 0x84, 0x05, 0x73, 0x80, 0x42, 0xf0, 0xad,
0x41, 0x45, 0xf0, 0x49, 0xd4, 0xac, 0xe1, 0x5a, 0xcf, 0x68, 0x11, 0x17, 0x9f, 0xf6, 0x1d, 0x55,
0x6f, 0xff, 0x49, 0x09, 0xe6, 0x05, 0x74, 0xab, 0x1f, 0x44, 0xf4, 0x70, 0x34, 0x18, 0xb8, 0x61,
0x0e, 0x03, 0x5a, 0x17, 0x30, 0x60, 0xc1, 0x64, 0x40, 0xc6, 0x16, 0x27, 0xae, 0xe7, 0x73, 0x37,
0x81, 0x73, 0xaf, 0x06, 0x21, 0xab, 0x30, 0xdb, 0xe9, 0x07, 0x11, 0x37, 0x89, 0x75, 0x87, 0x3f,
0x0d, 0xce, 0x0a, 0x8c, 0x72, 0x9e, 0xc0, 0xd0, 0x19, 0x7e, 0x32, 0xc5, 0xf0, 0x36, 0xd4, 0x59,
0xa3, 0x54, 0xca, 0xaf, 0x29, 0x6e, 0x26, 0xeb, 0x30, 0x36, 0x9e, 0x34, 0x7b, 0x71, 0x5e, 0x9e,
0xcd, 0x63, 0x2e, 0x6f, 0x40, 0x51, 0x3e, 0x6a, 0xd8, 0x55, 0xc1, 0x5c, 0xd9, 0x2a, 0x72, 0x8f,
0x79, 0x89, 0xac, 0x2f, 0x54, 0xd2, 0x80, 0x4a, 0xfa, 0xba, 0xb9, 0x23, 0xfa, 0xda, 0xdf, 0x64,
0x85, 0x51, 0x48, 0x51, 0x71, 0x6b, 0x5f, 0xda, 0xbf, 0x64, 0x41, 0x4d, 0xab, 0x23, 0x8b, 0x30,
0xb7, 0xf5, 0xf0, 0xe1, 0xc1, 0x8e, 0xb3, 0xf1, 0xe8, 0xc1, 0x57, 0x76, 0xda, 0x5b, 0x7b, 0x0f,
0x0f, 0x77, 0x1a, 0x13, 0x0c, 0xbc, 0xf7, 0x70, 0x6b, 0x63, 0xaf, 0x7d, 0xef, 0xa1, 0xb3, 0x25,
0xc1, 0x16, 0x59, 0x02, 0xe2, 0xec, 0xbc, 0xfb, 0xf0, 0xd1, 0x8e, 0x01, 0x2f, 0x90, 0x06, 0xd4,
0x37, 0x9d, 0x9d, 0x8d, 0xad, 0x5d, 0x01, 0x29, 0x92, 0x05, 0x68, 0xdc, 0x7b, 0xbc, 0xbf, 0xfd,
0x60, 0xff, 0x7e, 0x7b, 0x6b, 0x63, 0x7f, 0x6b, 0x67, 0x6f, 0x67, 0xbb, 0x51, 0x22, 0xd3, 0x50,
0xdd, 0xd8, 0xdc, 0xd8, 0xdf, 0x7e, 0xb8, 0xbf, 0xb3, 0xdd, 0x28, 0xdb, 0x7f, 0x67, 0xc1, 0x22,
0x8e, 0xba, 0x9b, 0x66, 0x90, 0x15, 0xa8, 0x75, 0x82, 0x60, 0xc8, 0x8c, 0xe3, 0x44, 0xfc, 0xeb,
0x20, 0x46, 0xfc, 0x5c, 0xd8, 0x1e, 0x07, 0x61, 0x87, 0x0a, 0xfe, 0x00, 0x04, 0xdd, 0x63, 0x10,
0x46, 0xfc, 0x62, 0x7b, 0x39, 0x06, 0x67, 0x8f, 0x1a, 0x87, 0x71, 0x94, 0x25, 0x98, 0x3c, 0x0a,
0xa9, 0xdb, 0x39, 0x11, 0x9c, 0x21, 0x4a, 0xe4, 0x53, 0x89, 0xf7, 0xd6, 0x61, 0xab, 0xdf, 0xa7,
0x5d, 0xa4, 0x98, 0x8a, 0x33, 0x2b, 0xe0, 0x5b, 0x02, 0xcc, 0xa4, 0x85, 0x7b, 0xe4, 0xfa, 0xdd,
0xc0, 0xa7, 0x5d, 0x61, 0x1a, 0x26, 0x00, 0xfb, 0x00, 0x96, 0xd2, 0xf3, 0x13, 0xfc, 0xf5, 0x96,
0xc6, 0x5f, 0xdc, 0x52, 0x6b, 0x8d, 0xdf, 0x4d, 0x8d, 0xd7, 0xfe, 0xbe, 0x00, 0x25, 0xa6, 0xb8,
0xc7, 0x2b, 0x79, 0xdd, 0x16, 0x2b, 0x66, 0xa2, 0x83, 0xe8, 0x10, 0x72, 0x51, 0xce, 0xd5, 0x9d,
0x06, 0x49, 0xea, 0x43, 0xda, 0x39, 0xc5, 0x19, 0xab, 0x7a, 0x06, 0x61, 0x0c, 0xc2, 0x0c, 0x65,
0xfc, 0x5a, 0x30, 0x88, 0x2c, 0xcb, 0x3a, 0xfc, 0x72, 0x2a, 0xa9, 0xc3, 0xef, 0x9a, 0x30, 0xe5,
0xf9, 0x47, 0xc1, 0xc8, 0xef, 0x22, 0x43, 0x54, 0x1c, 0x59, 0xc4, 0x78, 0x24, 0x32, 0xaa, 0x37,
0x90, 0xe4, 0x9f, 0x00, 0xc8, 0x6d, 0xa8, 0x46, 0xe7, 0x7e, 0x47, 0xa7, 0xf9, 0x05, 0xb1, 0x4a,
0x6c, 0x0d, 0x6e, 0x1e, 0x9e, 0xfb, 0x1d, 0xa4, 0xf0, 0x04, 0xcd, 0xfe, 0x22, 0x54, 0x24, 0x98,
0x91, 0xe5, 0xe3, 0xfd, 0x77, 0xf6, 0x1f, 0x3e, 0xd9, 0x6f, 0x1f, 0xbe, 0xb7, 0xbf, 0xd5, 0x98,
0x20, 0xb3, 0x50, 0xdb, 0xd8, 0x42, 0x4a, 0x47, 0x80, 0xc5, 0x50, 0x0e, 0x36, 0x0e, 0x0f, 0x15,
0xa4, 0x60, 0x13, 0xe6, 0xec, 0x46, 0x68, 0x1d, 0xa9, 0x78, 0xdc, 0x5b, 0x30, 0xa7, 0xc1, 0x12,
0x4b, 0x7b, 0xc8, 0x00, 0x29, 0x4b, 0x1b, 0xcd, 0x2a, 0x5e, 0x63, 0x37, 0x60, 0xe6, 0x3e, 0x8d,
0x1f, 0xf8, 0xc7, 0x81, 0x6c, 0xe9, 0x0f, 0x4a, 0x30, 0xab, 0x40, 0xa2, 0xa1, 0x55, 0x98, 0xf5,
0xba, 0xd4, 0x8f, 0xbd, 0xf8, 0xbc, 0x6d, 0xf8, 0xd4, 0x69, 0x30, 0x33, 0x47, 0xdd, 0xbe, 0xe7,
0xca, 0xb0, 0x2f, 0x2f, 0x30, 0x1f, 0x93, 0xe9, 0x4a, 0xa9, 0xfe, 0x14, 0x5d, 0x71, 0x57, 0x3e,
0xb7, 0x8e, 0x49, 0x20, 0x06, 0x17, 0x2a, 0x46, 0x7d, 0xc2, 0xcd, 0xb2, 0xbc, 0x2a, 0xb6, 0x55,
0xbc, 0x25, 0x36, 0xe5, 0x32, 0xd7, 0xa7, 0x0a, 0x90, 0x89, 0xab, 0x4e, 0x72, 0xf9, 0x98, 0x8e,
0xab, 0x6a, 0xb1, 0xd9, 0x4a, 0x26, 0x36, 0xcb, 0xe4, 0xe7, 0xb9, 0xdf, 0xa1, 0xdd, 0x76, 0x1c,
0xb4, 0x51, 0xce, 0x23, 0x49, 0x54, 0x9c, 0x34, 0x98, 0x5c, 0x81, 0xa9, 0x98, 0x46, 0xb1, 0x4f,
0x79, 0xc0, 0xac, 0x82, 0x21, 0x1e, 0x09, 0x62, 0x36, 0xf4, 0x28, 0xf4, 0xa2, 0x66, 0x1d, 0xa3,
0xae, 0xf8, 0x9f, 0x7c, 0x06, 0x16, 0x8f, 0x68, 0x14, 0xb7, 0x4f, 0xa8, 0xdb, 0xa5, 0x21, 0x92,
0x17, 0x0f, 0xef, 0x72, 0xd3, 0x24, 0xbf, 0x92, 0x11, 0xee, 0x29, 0x0d, 0x23, 0x2f, 0xf0, 0xd1,
0x28, 0xa9, 0x3a, 0xb2, 0xc8, 0xda, 0x63, 0x93, 0x57, 0x4a, 0x5a, 0xad, 0xe0, 0x2c, 0x4e, 0x3c,
0xbf, 0x92, 0x5c, 0x83, 0x49, 0x9c, 0x40, 0xd4, 0x6c, 0x18, 0x71, 0xaa, 0x2d, 0x06, 0x74, 0x44,
0xdd, 0x97, 0x4a, 0x95, 0x5a, 0xa3, 0x6e, 0x7f, 0x0e, 0xca, 0x08, 0x66, 0x9b, 0xce, 0x17, 0x83,
0x13, 0x05, 0x2f, 0xb0, 0xa1, 0xf9, 0x34, 0x3e, 0x0b, 0xc2, 0xa7, 0xf2, 0x0c, 0x40, 0x14, 0xed,
0x6f, 0xa0, 0x17, 0xa2, 0x62, 0xe2, 0x8f, 0xd1, 0x84, 0x62, 0xbe, 0x24, 0x5f, 0xea, 0xe8, 0xc4,
0x15, 0x8e, 0x51, 0x05, 0x01, 0x87, 0x27, 0x2e, 0x93, 0x95, 0xc6, 0xee, 0x71, 0x5f, 0xb3, 0x86,
0xb0, 0x5d, 0xbe, 0x79, 0xd7, 0x60, 0x46, 0x46, 0xdb, 0xa3, 0x76, 0x9f, 0x1e, 0xc7, 0x32, 0x52,
0xe4, 0x8f, 0x06, 0xe8, 0x90, 0xee, 0xd1, 0xe3, 0xd8, 0xde, 0x87, 0x39, 0x21, 0xbf, 0x1e, 0x0e,
0xa9, 0xec, 0xfa, 0xf3, 0x79, 0x76, 0x40, 0xed, 0xf6, 0xbc, 0x29, 0xf0, 0xf8, 0xf9, 0x82, 0x89,
0x69, 0x3b, 0x40, 0x74, 0x79, 0x28, 0x1a, 0x14, 0xca, 0x58, 0xc6, 0xc2, 0xc4, 0x74, 0x0c, 0x18,
0x5b, 0x9f, 0x68, 0xd4, 0xe9, 0xc8, 0x33, 0x12, 0xe6, 0xb1, 0xf3, 0xa2, 0xfd, 0x87, 0x16, 0xcc,
0x63, 0x6b, 0xd2, 0x92, 0x11, 0x3a, 0xe7, 0xce, 0xc7, 0x18, 0x66, 0xbd, 0xa3, 0xc7, 0x07, 0x17,
0xa0, 0xac, 0x6b, 0x21, 0x5e, 0xf8, 0xf8, 0x71, 0x87, 0x52, 0x3a, 0xee, 0x60, 0xff, 0x96, 0x05,
0x73, 0x5c, 0x11, 0xa0, 0x55, 0x29, 0xa6, 0xff, 0xbf, 0x61, 0x9a, 0x6b, 0x74, 0xc1, 0xd5, 0x62,
0xa0, 0x89, 0x68, 0x44, 0x28, 0x47, 0xde, 0x9d, 0x70, 0x4c, 0x64, 0x72, 0x17, 0xad, 0x2a, 0xbf,
0x8d, 0xd0, 0x9c, 0xd3, 0x34, 0x73, 0xad, 0x77, 0x27, 0x1c, 0x0d, 0x7d, 0xb3, 0x02, 0x93, 0xdc,
0x24, 0xb7, 0xef, 0xc3, 0xb4, 0xd1, 0x91, 0x11, 0xf3, 0xa8, 0xf3, 0x98, 0x47, 0x26, 0xb8, 0x58,
0xc8, 0x09, 0x2e, 0xfe, 0x71, 0x11, 0x08, 0x23, 0x96, 0xd4, 0x6e, 0x30, 0x9f, 0x20, 0xe8, 0x1a,
0x1e, 0x5e, 0xdd, 0xd1, 0x41, 0xe4, 0x26, 0x10, 0xad, 0x28, 0x63, 0xc4, 0x5c, 0xe5, 0xe5, 0xd4,
0x30, 0x31, 0x29, 0x2c, 0x06, 0xa1, 0xdb, 0x85, 0x2f, 0xcb, 0x97, 0x3d, 0xb7, 0x8e, 0x69, 0xb5,
0xe1, 0x28, 0x3a, 0xc1, 0xc8, 0x9e, 0xf0, 0x01, 0x65, 0x39, 0xbd, 0xbf, 0x93, 0x17, 0xee, 0xef,
0x54, 0x26, 0xae, 0xa4, 0x79, 0x21, 0x15, 0xd3, 0x0b, 0xb9, 0x06, 0xd3, 0x03, 0x66, 0xe7, 0xc6,
0xfd, 0x4e, 0x7b, 0xc0, 0x7a, 0x17, 0x2e, 0x9f, 0x01, 0x24, 0x6b, 0xd0, 0x10, 0x36, 0x4e, 0xe2,
0xea, 0xf0, 0x13, 0x84, 0x0c, 0x9c, 0xc9, 0xef, 0x24, 0xd2, 0x54, 0xc3, 0xc1, 0x26, 0x00, 0xe6,
0xd7, 0x44, 0x8c, 0x42, 0xda, 0x23, 0x5f, 0x1c, 0xa8, 0xd1, 0x2e, 0x3a, 0x7b, 0x15, 0x27, 0x5b,
0x61, 0xff, 0x9a, 0x05, 0x0d, 0xb6, 0x67, 0x06, 0x59, 0xbe, 0x0d, 0xc8, 0x15, 0x2f, 0x49, 0x95,
0x06, 0x2e, 0xb9, 0x03, 0x55, 0x2c, 0x07, 0x43, 0xea, 0x0b, 0x9a, 0x6c, 0x9a, 0x34, 0x99, 0xc8,
0x93, 0xdd, 0x09, 0x27, 0x41, 0xd6, 0x28, 0xf2, 0xaf, 0x2d, 0xa8, 0x89, 0x5e, 0x7e, 0xe4, 0x48,
0x46, 0x4b, 0x3b, 0x01, 0xe5, 0x94, 0x94, 0x1c, 0x78, 0xae, 0xc2, 0xec, 0xc0, 0x8d, 0x47, 0x21,
0xd3, 0xc7, 0x46, 0x14, 0x23, 0x0d, 0x66, 0xca, 0x15, 0x45, 0x67, 0xd4, 0x8e, 0xbd, 0x7e, 0x5b,
0xd6, 0x8a, 0xb3, 0xc6, 0xbc, 0x2a, 0x26, 0x41, 0xa2, 0xd8, 0xed, 0x51, 0xa1, 0x37, 0x79, 0xc1,
0x6e, 0xc2, 0x92, 0x98, 0x50, 0xca, 0x3e, 0xb6, 0xbf, 0x5f, 0x87, 0xe5, 0x4c, 0x95, 0xca, 0x8c,
0x10, 0xee, 0x79, 0xdf, 0x1b, 0x1c, 0x05, 0xca, 0xb9, 0xb0, 0x74, 0xcf, 0xdd, 0xa8, 0x22, 0x3d,
0x58, 0x94, 0x06, 0x02, 0x5b, 0xd3, 0x44, 0x99, 0x15, 0x50, 0x4b, 0xbd, 0x69, 0x6e, 0x61, 0xba,
0x43, 0x09, 0xd7, 0x99, 0x38, 0xbf, 0x3d, 0x72, 0x02, 0x4d, 0x65, 0x89, 0x08, 0x61, 0xad, 0x59,
0x2b, 0xac, 0xaf, 0x37, 0x2e, 0xe8, 0xcb, 0x30, 0xa7, 0x9d, 0xb1, 0xad, 0x91, 0x73, 0xb8, 0x2a,
0xeb, 0x50, 0x1a, 0x67, 0xfb, 0x2b, 0xbd, 0xd4, 0xdc, 0xd0, 0x51, 0x30, 0x3b, 0xbd, 0xa0, 0x61,
0xf2, 0x01, 0x2c, 0x9d, 0xb9, 0x5e, 0x2c, 0x87, 0xa5, 0xd9, 0x06, 0x65, 0xec, 0xf2, 0xf6, 0x05,
0x5d, 0x3e, 0xe1, 0x1f, 0x1b, 0x2a, 0x6a, 0x4c, 0x8b, 0xad, 0x1f, 0x58, 0x30, 0x63, 0xb6, 0xc3,
0xc8, 0x54, 0xf0, 0xbe, 0x94, 0x81, 0xd2, 0x9a, 0x4c, 0x81, 0xb3, 0xfe, 0x79, 0x21, 0xcf, 0x3f,
0xd7, 0xbd, 0xe2, 0xe2, 0x45, 0x61, 0xb0, 0xd2, 0xcb, 0x85, 0xc1, 0xca, 0x79, 0x61, 0xb0, 0xd6,
0x7f, 0x58, 0x40, 0xb2, 0xb4, 0x44, 0xee, 0xf3, 0x00, 0x81, 0x4f, 0xfb, 0x42, 0xa4, 0xfc, 0xaf,
0x97, 0xa3, 0x47, 0xb9, 0x76, 0xf2, 0x6b, 0xc6, 0x18, 0x7a, 0xb2, 0x80, 0x6e, 0xec, 0x4c, 0x3b,
0x79, 0x55, 0xa9, 0xc0, 0x5c, 0xe9, 0xe2, 0xc0, 0x5c, 0xf9, 0xe2, 0xc0, 0xdc, 0x64, 0x3a, 0x30,
0xd7, 0xfa, 0x39, 0x0b, 0xe6, 0x73, 0x36, 0xfd, 0x27, 0x37, 0x71, 0xb6, 0x4d, 0x86, 0x2c, 0x28,
0x88, 0x6d, 0xd2, 0x81, 0xad, 0x9f, 0x82, 0x69, 0x83, 0xd0, 0x7f, 0x72, 0xfd, 0xa7, 0xed, 0x35,
0x4e, 0x67, 0x06, 0xac, 0xf5, 0x2f, 0x05, 0x20, 0x59, 0x66, 0xfb, 0x1f, 0x1d, 0x43, 0x76, 0x9d,
0x8a, 0x39, 0xeb, 0xf4, 0xdf, 0xaa, 0x07, 0xde, 0x80, 0x39, 0x91, 0x01, 0xa5, 0x85, 0x85, 0x38,
0xc5, 0x64, 0x2b, 0x98, 0xc5, 0x6a, 0x46, 0x45, 0x2b, 0x46, 0x46, 0x88, 0xa6, 0x0c, 0x53, 0xc1,
0x51, 0xbb, 0x05, 0x4d, 0xb1, 0x42, 0x3b, 0xa7, 0xd4, 0x8f, 0x0f, 0x47, 0x47, 0x3c, 0x05, 0xc8,
0x0b, 0x7c, 0xfb, 0x7b, 0x45, 0x65, 0x74, 0x63, 0xa5, 0x50, 0xef, 0x9f, 0x81, 0xba, 0x2e, 0xcc,
0xc5, 0x76, 0xa4, 0xa2, 0x82, 0x4c, 0xb1, 0xeb, 0x58, 0x64, 0x1b, 0x66, 0x50, 0x64, 0x75, 0xd5,
0x77, 0x05, 0xfc, 0xee, 0x05, 0xd1, 0x8e, 0xdd, 0x09, 0x27, 0xf5, 0x0d, 0xf9, 0x02, 0xcc, 0x98,
0xae, 0x94, 0xb0, 0x11, 0xf2, 0x6c, 0x73, 0xf6, 0xb9, 0x89, 0x4c, 0x36, 0xa0, 0x91, 0xf6, 0xc5,
0xc4, 0xf9, 0xff, 0x98, 0x06, 0x32, 0xe8, 0xe4, 0x8e, 0x38, 0x1e, 0x2b, 0x63, 0x14, 0xe2, 0x9a,
0xf9, 0x99, 0xb6, 0x4c, 0x37, 0xf9, 0x8f, 0x76, 0x60, 0xf6, 0x35, 0x80, 0x04, 0x46, 0x1a, 0x50,
0x7f, 0x78, 0xb0, 0xb3, 0xdf, 0xde, 0xda, 0xdd, 0xd8, 0xdf, 0xdf, 0xd9, 0x6b, 0x4c, 0x10, 0x02,
0x33, 0x18, 0x34, 0xdb, 0x56, 0x30, 0x8b, 0xc1, 0x44, 0x98, 0x42, 0xc2, 0x0a, 0x64, 0x01, 0x1a,
0x0f, 0xf6, 0x53, 0xd0, 0xe2, 0x66, 0x55, 0xf1, 0x87, 0xbd, 0x04, 0x0b, 0x3c, 0xc3, 0x6d, 0x93,
0x93, 0x87, 0xb4, 0x15, 0x7e, 0xd7, 0x82, 0xc5, 0x54, 0x45, 0x92, 0x4a, 0xc2, 0xcd, 0x01, 0xd3,
0x46, 0x30, 0x81, 0x18, 0xf2, 0x96, 0x96, 0x5f, 0x4a, 0x82, 0x64, 0x2b, 0x18, 0xcd, 0x6b, 0x96,
0x62, 0x8a, 0x93, 0xf2, 0xaa, 0xec, 0x65, 0x9e, 0x87, 0x87, 0x19, 0x7b, 0xc6, 0xc0, 0x8f, 0x79,
0xe6, 0x9c, 0x5e, 0x91, 0x1c, 0x37, 0x9a, 0x43, 0x96, 0x45, 0x66, 0xe4, 0x1b, 0xa6, 0x87, 0x39,
0xde, 0xdc, 0x3a, 0xfb, 0x2f, 0x0a, 0x40, 0xbe, 0x3c, 0xa2, 0xe1, 0x39, 0x66, 0x81, 0xa8, 0x18,
0xe4, 0x72, 0x3a, 0xc2, 0x36, 0x39, 0x1c, 0x1d, 0xbd, 0x43, 0xcf, 0x65, 0x06, 0x53, 0x41, 0xcf,
0x60, 0x02, 0xe6, 0x1c, 0xab, 0x1c, 0x14, 0x6b, 0xb5, 0x8c, 0x21, 0x89, 0xaa, 0x3f, 0x1a, 0xf0,
0x46, 0x73, 0x13, 0x8d, 0x4a, 0x17, 0x27, 0x1a, 0x95, 0x2f, 0x4a, 0x34, 0xfa, 0x04, 0x4c, 0x7b,
0x3d, 0x3f, 0x60, 0x62, 0x81, 0x29, 0xf6, 0xa8, 0x39, 0xb9, 0x52, 0x64, 0xce, 0xb0, 0x00, 0xee,
0x33, 0x18, 0xf9, 0x5c, 0x82, 0x44, 0xbb, 0x3d, 0x4c, 0x5a, 0xd3, 0x05, 0xc5, 0x4e, 0xb7, 0x47,
0xf7, 0x82, 0x8e, 0x1b, 0x07, 0xa1, 0xfa, 0x90, 0xc1, 0x22, 0xe6, 0xf5, 0x47, 0xc1, 0x88, 0x99,
0x39, 0x72, 0x29, 0x78, 0xd8, 0xa6, 0xce, 0xa1, 0x07, 0xb8, 0x20, 0xf6, 0x7b, 0x50, 0xd3, 0x9a,
0xc0, 0x8c, 0x26, 0x61, 0x42, 0x08, 0x7f, 0xb0, 0xc4, 0x2d, 0x76, 0x9f, 0xf6, 0x1f, 0x74, 0xc9,
0xeb, 0x30, 0xd7, 0xf5, 0x42, 0x8a, 0xc9, 0x69, 0xed, 0x90, 0x9e, 0xd2, 0x30, 0x92, 0x9e, 0x73,
0x43, 0x55, 0x38, 0x1c, 0x6e, 0xdf, 0x85, 0x79, 0x63, 0x6b, 0x14, 0xe5, 0xca, 0x84, 0x1f, 0x2b,
0x9b, 0xf0, 0x23, 0x93, 0x7d, 0xec, 0x5f, 0x28, 0x40, 0x71, 0x37, 0x18, 0xea, 0x47, 0x0c, 0x96,
0x79, 0xc4, 0x20, 0x4c, 0xa0, 0xb6, 0xb2, 0x70, 0x84, 0x66, 0x34, 0x80, 0x64, 0x0d, 0x66, 0xdc,
0x41, 0xdc, 0x8e, 0x03, 0x66, 0xf2, 0x9d, 0xb9, 0x61, 0x97, 0x93, 0x33, 0x6e, 0x71, 0xaa, 0x86,
0x2c, 0x40, 0x51, 0xd9, 0x0a, 0x88, 0xc0, 0x8a, 0xcc, 0xdf, 0xc0, 0xa3, 0xce, 0x73, 0x11, 0x39,
0x13, 0x25, 0xc6, 0x2d, 0xe6, 0xf7, 0xdc, 0xd9, 0xe3, 0x12, 0x3f, 0xaf, 0x8a, 0x99, 0x63, 0x8c,
0x3a, 0x10, 0x4d, 0xc4, 0x59, 0x65, 0x59, 0x8f, 0x09, 0x57, 0xcc, 0x83, 0xdf, 0x7f, 0xb6, 0xa0,
0x8c, 0x6b, 0xc3, 0xb4, 0x17, 0x67, 0x6f, 0x75, 0xca, 0x80, 0x6b, 0x32, 0xed, 0xa4, 0xc1, 0xc4,
0x36, 0xd2, 0x1c, 0x0b, 0x6a, 0x42, 0x7a, 0xaa, 0xe3, 0x0a, 0x54, 0x79, 0x49, 0xa5, 0xf4, 0x71,
0xba, 0x57, 0x40, 0x72, 0x15, 0x4a, 0x27, 0xc1, 0x50, 0x9a, 0xdb, 0x20, 0x0f, 0xec, 0x82, 0xa1,
0x83, 0xf0, 0x64, 0x3c, 0xac, 0x3d, 0x3e, 0x2d, 0x6e, 0x44, 0xa5, 0xc1, 0xcc, 0x8c, 0x54, 0xcd,
0xea, 0xcb, 0x94, 0x82, 0xda, 0x6b, 0x30, 0xcb, 0xa8, 0x5e, 0x8b, 0xba, 0x8e, 0x65, 0x65, 0xfb,
0x67, 0x2c, 0xa8, 0x48, 0x64, 0xb2, 0x0a, 0x25, 0xc6, 0x42, 0x29, 0xc7, 0x55, 0x1d, 0xd4, 0x33,
0x3c, 0x07, 0x31, 0x98, 0x31, 0x81, 0xc1, 0xb0, 0xc4, 0x4f, 0x92, 0xa1, 0xb0, 0xc4, 0x0d, 0x50,
0xc3, 0x4d, 0x59, 0xcf, 0x29, 0xa8, 0xfd, 0x5d, 0x0b, 0xa6, 0x8d, 0x3e, 0xc8, 0x0a, 0xd4, 0xfa,
0x6e, 0x14, 0x8b, 0xc3, 0x4f, 0xb1, 0x3d, 0x3a, 0x48, 0xdf, 0xe8, 0x82, 0x19, 0xfc, 0x57, 0x11,
0xe2, 0xa2, 0x1e, 0x21, 0xbe, 0x05, 0xd5, 0x24, 0x19, 0xb5, 0x64, 0xf0, 0x3e, 0xeb, 0x51, 0xa6,
0x20, 0x24, 0x48, 0x18, 0x74, 0x0c, 0xfa, 0x41, 0x28, 0x4e, 0xca, 0x78, 0xc1, 0xbe, 0x0b, 0x35,
0x0d, 0x5f, 0x8f, 0x41, 0x5a, 0x46, 0x0c, 0x52, 0xe5, 0xe7, 0x14, 0x92, 0xfc, 0x1c, 0xfb, 0x5f,
0x2d, 0x98, 0x66, 0x34, 0xe8, 0xf9, 0xbd, 0x83, 0xa0, 0xef, 0x75, 0xce, 0x71, 0xef, 0x25, 0xb9,
0x09, 0x91, 0x28, 0x69, 0xd1, 0x04, 0x33, 0xaa, 0x97, 0x91, 0x0f, 0xc1, 0xa2, 0xaa, 0xcc, 0x78,
0x98, 0x71, 0xc0, 0x91, 0x1b, 0x09, 0xb6, 0x10, 0x56, 0x9b, 0x01, 0x64, 0x9c, 0xc6, 0x00, 0x98,
0x6d, 0x35, 0xf0, 0xfa, 0x7d, 0x8f, 0xe3, 0x72, 0x9b, 0x3e, 0xaf, 0x8a, 0xf5, 0xd9, 0xf5, 0x22,
0xf7, 0x28, 0x39, 0xfd, 0x51, 0x65, 0x0c, 0xcf, 0xb8, 0xcf, 0xb4, 0xf0, 0xcc, 0x24, 0xca, 0x15,
0x13, 0x68, 0xff, 0x59, 0x01, 0x6a, 0xd2, 0x44, 0xe8, 0xf6, 0xa8, 0x38, 0xd0, 0x34, 0x05, 0xa3,
0x06, 0x91, 0xf5, 0x86, 0x37, 0xa6, 0x41, 0xd2, 0x84, 0x51, 0xcc, 0x12, 0xc6, 0x15, 0xa8, 0x32,
0x02, 0x7d, 0x13, 0xdd, 0x3e, 0x91, 0xdf, 0xad, 0x00, 0xb2, 0xf6, 0x36, 0xd6, 0x96, 0x93, 0x5a,
0x04, 0xbc, 0xf0, 0xf8, 0xf3, 0x0e, 0xd4, 0x45, 0x33, 0xb8, 0x73, 0x28, 0x79, 0x12, 0x16, 0x31,
0x76, 0xd5, 0x31, 0x30, 0xe5, 0x97, 0xb7, 0xe5, 0x97, 0x95, 0x8b, 0xbe, 0x94, 0x98, 0xf6, 0x7d,
0x75, 0xaa, 0x7c, 0x3f, 0x74, 0x87, 0x27, 0x92, 0x97, 0x6f, 0xc1, 0xbc, 0xe7, 0x77, 0xfa, 0xa3,
0x2e, 0x6d, 0x8f, 0x7c, 0xd7, 0xf7, 0x83, 0x91, 0xdf, 0xa1, 0x32, 0x41, 0x27, 0xaf, 0xca, 0xee,
0xaa, 0x74, 0x4e, 0x6c, 0x88, 0xac, 0x41, 0x99, 0xab, 0x4a, 0xae, 0x3b, 0xf2, 0x19, 0x9d, 0xa3,
0x90, 0x55, 0x28, 0x73, 0x8d, 0x59, 0x30, 0xb8, 0x46, 0xdb, 0x55, 0x87, 0x23, 0x30, 0xb1, 0x83,
0x19, 0xbd, 0xa6, 0xd8, 0x31, 0xf5, 0xce, 0x64, 0x07, 0x73, 0x7e, 0xed, 0x05, 0x20, 0xfb, 0x9c,
0x53, 0xf4, 0xb3, 0xa1, 0xef, 0x17, 0xa1, 0xa6, 0x81, 0x99, 0x04, 0xe9, 0xb1, 0x01, 0xb7, 0xbb,
0x9e, 0x3b, 0xa0, 0x31, 0x0d, 0x05, 0x77, 0xa4, 0xa0, 0x0c, 0xcf, 0x3d, 0xed, 0xb5, 0x83, 0x51,
0xdc, 0xee, 0xd2, 0x5e, 0x48, 0xb9, 0x36, 0x65, 0xaa, 0xc9, 0x80, 0x32, 0x3c, 0x46, 0x9f, 0x1a,
0x1e, 0xa7, 0xa0, 0x14, 0x54, 0x9e, 0xf4, 0xf0, 0x35, 0x2a, 0x25, 0x27, 0x3d, 0x7c, 0x45, 0xd2,
0xb2, 0xaf, 0x9c, 0x23, 0xfb, 0xde, 0x82, 0x25, 0x2e, 0xe5, 0x84, 0x3c, 0x68, 0xa7, 0x08, 0x6b,
0x4c, 0x2d, 0x59, 0x83, 0x06, 0x1b, 0xb3, 0x64, 0x89, 0xc8, 0xfb, 0x06, 0x8f, 0x9a, 0x5a, 0x4e,
0x06, 0xce, 0x70, 0x31, 0x7c, 0xa9, 0xe3, 0xf2, 0xe3, 0xf6, 0x0c, 0x1c, 0x71, 0xdd, 0x67, 0x26,
0x6e, 0x55, 0xe0, 0xa6, 0xe0, 0xe4, 0x0e, 0x2c, 0x0f, 0x68, 0xd7, 0x73, 0xcd, 0x26, 0x30, 0x02,
0xcc, 0x73, 0x6a, 0xc6, 0x55, 0xdb, 0xd3, 0x50, 0x3b, 0x8c, 0x83, 0xa1, 0xdc, 0xce, 0x19, 0xa8,
0xf3, 0xa2, 0x48, 0xb1, 0xba, 0x0c, 0x97, 0x90, 0xfe, 0x1e, 0x05, 0xc3, 0xa0, 0x1f, 0xf4, 0xce,
0x0d, 0xa7, 0xeb, 0xaf, 0x2c, 0x98, 0x37, 0x6a, 0x13, 0xaf, 0x0b, 0xe3, 0x35, 0x32, 0x37, 0x86,
0x93, 0xec, 0x9c, 0x26, 0xbc, 0x39, 0x22, 0x0f, 0x8d, 0x3f, 0x16, 0xe9, 0x32, 0x1b, 0xc9, 0xb5,
0x19, 0xf9, 0x21, 0xa7, 0xdf, 0x66, 0x96, 0x7e, 0xc5, 0xf7, 0xf2, 0xd6, 0x8c, 0x6c, 0xe2, 0x0b,
0x22, 0xe1, 0x81, 0x3b, 0x61, 0x32, 0x3c, 0xa7, 0xdc, 0x36, 0xdd, 0x49, 0x97, 0x23, 0xe8, 0x28,
0x60, 0x64, 0xff, 0xb2, 0x05, 0x90, 0x8c, 0x0e, 0x8f, 0xc9, 0x95, 0x02, 0xe2, 0x57, 0xb4, 0x34,
0x65, 0xf3, 0x1a, 0xd4, 0xd5, 0x49, 0x67, 0xa2, 0xd3, 0x6a, 0x12, 0xc6, 0x6c, 0xee, 0x1b, 0x30,
0xdb, 0xeb, 0x07, 0x47, 0x68, 0x10, 0x60, 0xce, 0x5e, 0x24, 0x12, 0xcd, 0x66, 0x38, 0xf8, 0x9e,
0x80, 0x26, 0x0a, 0xb0, 0xa4, 0x29, 0x40, 0xfb, 0x57, 0x0a, 0xea, 0x60, 0x2a, 0x99, 0xf3, 0x58,
0xfe, 0x24, 0xb7, 0x33, 0x82, 0x78, 0xcc, 0x39, 0x10, 0x9a, 0xb5, 0x07, 0x17, 0xc6, 0xc9, 0xee,
0xc2, 0x4c, 0xc8, 0x25, 0x9d, 0x14, 0x83, 0xa5, 0x17, 0x88, 0xc1, 0xe9, 0xd0, 0xd0, 0x92, 0x9f,
0x82, 0x86, 0xdb, 0x3d, 0xa5, 0x61, 0xec, 0x61, 0xa4, 0x02, 0x4d, 0x14, 0x2e, 0xbc, 0x67, 0x35,
0x38, 0x5a, 0x0e, 0x37, 0x60, 0x56, 0x24, 0xf7, 0x29, 0x4c, 0x71, 0xed, 0x21, 0x01, 0x33, 0x44,
0xfb, 0x3b, 0xf2, 0x0c, 0xcc, 0xdc, 0xc3, 0xf1, 0x2b, 0xa2, 0xcf, 0xae, 0x90, 0x9a, 0xdd, 0x27,
0xc4, 0x79, 0x54, 0x57, 0x86, 0x43, 0x8a, 0x5a, 0x72, 0x4c, 0x57, 0x9c, 0x1f, 0x9a, 0x4b, 0x5a,
0x7a, 0x99, 0x25, 0xb5, 0x7f, 0x68, 0xc1, 0xd4, 0x6e, 0x30, 0xdc, 0x15, 0x69, 0x42, 0xc8, 0x08,
0x2a, 0xab, 0x56, 0x16, 0x5f, 0x90, 0x40, 0x94, 0x6b, 0x19, 0x4c, 0xa7, 0x2d, 0x83, 0xff, 0x0b,
0x97, 0x31, 0x18, 0x17, 0x06, 0xc3, 0x20, 0x64, 0xcc, 0xe8, 0xf6, 0xb9, 0x19, 0x10, 0xf8, 0xf1,
0x89, 0x14, 0x80, 0x2f, 0x42, 0x41, 0x0f, 0x99, 0x79, 0x75, 0xdc, 0xa8, 0x17, 0x96, 0x0c, 0x97,
0x8b, 0xd9, 0x0a, 0xfb, 0xf3, 0x50, 0x45, 0x53, 0x1c, 0xa7, 0xf5, 0x06, 0x54, 0x4f, 0x82, 0x61,
0xfb, 0xc4, 0xf3, 0x63, 0xc9, 0xdc, 0x33, 0x89, 0x8d, 0xbc, 0x8b, 0x0b, 0xa2, 0x10, 0xec, 0xdf,
0x98, 0x84, 0xa9, 0x07, 0xfe, 0x69, 0xe0, 0x75, 0xf0, 0xbc, 0x6d, 0x40, 0x07, 0x81, 0xcc, 0x31,
0x66, 0xff, 0xc9, 0x15, 0x98, 0xc2, 0xa4, 0xba, 0x21, 0x27, 0xda, 0x3a, 0x3f, 0x17, 0x17, 0x20,
0x66, 0x5e, 0x84, 0xc9, 0x6d, 0x10, 0xce, 0x3e, 0x1a, 0x84, 0x39, 0x29, 0xa1, 0x7e, 0x9b, 0x43,
0x94, 0x92, 0x1c, 0xee, 0xb2, 0x96, 0xc3, 0xcd, 0xfa, 0x12, 0x69, 0x4d, 0x3c, 0xef, 0x85, 0xf7,
0x25, 0x40, 0xe8, 0x58, 0x85, 0x94, 0x07, 0x53, 0xd1, 0x58, 0x99, 0x12, 0x8e, 0x95, 0x0e, 0x64,
0x06, 0x0d, 0xff, 0x80, 0xe3, 0x70, 0xf1, 0xad, 0x83, 0x98, 0x89, 0x98, 0xbe, 0xc8, 0x53, 0xe5,
0xb4, 0x9f, 0x02, 0x33, 0x19, 0xdf, 0xa5, 0x4a, 0xa0, 0xf2, 0x79, 0x00, 0xbf, 0xf1, 0x92, 0x86,
0x6b, 0xee, 0x18, 0xcf, 0x7f, 0x94, 0xee, 0x18, 0x23, 0x18, 0xb7, 0xdf, 0x3f, 0x72, 0x3b, 0x4f,
0xf1, 0x9e, 0x16, 0x9e, 0x80, 0x55, 0x1d, 0x13, 0x88, 0xc9, 0x49, 0xc9, 0xae, 0x62, 0x06, 0x41,
0xc9, 0xd1, 0x41, 0xe4, 0x36, 0xd4, 0xd0, 0x05, 0x15, 0xfb, 0x3a, 0x83, 0xfb, 0xda, 0xd0, 0x7d,
0x54, 0xdc, 0x59, 0x1d, 0x49, 0x3f, 0x0b, 0x9c, 0xcd, 0x64, 0x24, 0xba, 0xdd, 0xae, 0x38, 0x42,
0x6d, 0x70, 0x77, 0x5a, 0x01, 0x98, 0x3e, 0x16, 0x0b, 0xc6, 0x11, 0xe6, 0x10, 0xc1, 0x80, 0x91,
0xab, 0x50, 0x61, 0xee, 0xd1, 0xd0, 0xf5, 0xba, 0x98, 0xd2, 0xc8, 0xbd, 0x34, 0x05, 0x63, 0x6d,
0xc8, 0xff, 0xa8, 0xe8, 0xe6, 0x71, 0x55, 0x0c, 0x18, 0x5b, 0x1b, 0x55, 0x46, 0x66, 0x5a, 0xe0,
0x3b, 0x6a, 0x00, 0xc9, 0x9b, 0x78, 0x90, 0x15, 0xd3, 0xe6, 0x22, 0x06, 0xca, 0x2e, 0x8b, 0x39,
0x0b, 0xa2, 0x95, 0xbf, 0x87, 0x0c, 0xc5, 0xe1, 0x98, 0xf6, 0x06, 0xd4, 0x75, 0x30, 0xa9, 0x40,
0xe9, 0xe1, 0xc1, 0xce, 0x7e, 0x63, 0x82, 0xd4, 0x60, 0xea, 0x70, 0xe7, 0xd1, 0xa3, 0xbd, 0x9d,
0xed, 0x86, 0x45, 0xea, 0x50, 0x51, 0x99, 0x64, 0x05, 0x56, 0xda, 0xd8, 0xda, 0xda, 0x39, 0x78,
0xb4, 0xb3, 0xdd, 0x28, 0xda, 0x31, 0x90, 0x8d, 0x6e, 0x57, 0xb4, 0xa2, 0x82, 0x04, 0x09, 0x3d,
0x5b, 0x06, 0x3d, 0xe7, 0xd0, 0x54, 0x21, 0x9f, 0xa6, 0x5e, 0xb8, 0xf2, 0xf6, 0x0e, 0xd4, 0x0e,
0xb4, 0x4b, 0x4b, 0xc8, 0x5e, 0xf2, 0xba, 0x92, 0x60, 0x4b, 0x0d, 0xa2, 0x0d, 0xa7, 0xa0, 0x0f,
0xc7, 0xfe, 0x7d, 0x8b, 0xdf, 0x0c, 0x50, 0xc3, 0xe7, 0x7d, 0xdb, 0x50, 0x57, 0xd1, 0xaa, 0x24,
0x49, 0xd4, 0x80, 0x31, 0x1c, 0x1c, 0x4a, 0x3b, 0x38, 0x3e, 0x8e, 0xa8, 0x4c, 0xe9, 0x32, 0x60,
0x8c, 0x2f, 0x98, 0x6d, 0xc6, 0xec, 0x1c, 0x8f, 0xf7, 0x10, 0x89, 0xd4, 0xae, 0x0c, 0x9c, 0x49,
0x79, 0x11, 0x90, 0x91, 0xc9, 0x6c, 0xaa, 0xac, 0x72, 0x59, 0xd3, 0xab, 0xbc, 0x06, 0x15, 0xd5,
0xae, 0x29, 0xc0, 0x24, 0xa6, 0xaa, 0x67, 0x82, 0x12, 0xbd, 0x15, 0x63, 0xd0, 0x5c, 0x68, 0x67,
0x2b, 0xc8, 0x4d, 0x20, 0xc7, 0x5e, 0x98, 0x46, 0x2f, 0x22, 0x7a, 0x4e, 0x8d, 0xfd, 0x04, 0xe6,
0x25, 0x21, 0x69, 0xa6, 0x95, 0xb9, 0x89, 0xd6, 0x45, 0xec, 0x53, 0xc8, 0xb2, 0x8f, 0xfd, 0x9f,
0x16, 0x4c, 0x89, 0x9d, 0xce, 0x5c, 0x7c, 0xe3, 0xfb, 0x6c, 0xc0, 0x48, 0xd3, 0xb8, 0xf4, 0x82,
0xbc, 0x26, 0x84, 0x66, 0x46, 0x2c, 0x16, 0xf3, 0xc4, 0x22, 0x81, 0xd2, 0xd0, 0x8d, 0x4f, 0xd0,
0x53, 0xaf, 0x3a, 0xf8, 0x9f, 0x34, 0x78, 0x5c, 0x89, 0x8b, 0x60, 0x8c, 0x29, 0xe5, 0x5d, 0xf1,
0xe3, 0xda, 0x3e, 0x7b, 0xc5, 0xef, 0x0a, 0x54, 0x71, 0x00, 0xed, 0x24, 0x6c, 0x94, 0x00, 0x18,
0xe5, 0xf2, 0x02, 0xf2, 0xb5, 0xc8, 0x3f, 0x4f, 0x20, 0xf6, 0x22, 0xdf, 0x79, 0xb1, 0x04, 0xea,
0x10, 0x5a, 0xe4, 0x0e, 0x27, 0xe0, 0x84, 0x22, 0xc4, 0x00, 0xd2, 0x14, 0x21, 0x50, 0x1d, 0x55,
0x6f, 0xb7, 0xa0, 0xb9, 0x4d, 0xfb, 0x34, 0xa6, 0x1b, 0xfd, 0x7e, 0xba, 0xfd, 0xcb, 0x70, 0x29,
0xa7, 0x4e, 0x58, 0xd3, 0x5f, 0x86, 0xc5, 0x0d, 0x9e, 0x67, 0xf9, 0x93, 0x4a, 0xe3, 0xb1, 0x9b,
0xb0, 0x94, 0x6e, 0x52, 0x74, 0x76, 0x0f, 0xe6, 0xb6, 0xe9, 0xd1, 0xa8, 0xb7, 0x47, 0x4f, 0x93,
0x8e, 0x08, 0x94, 0xa2, 0x93, 0xe0, 0x4c, 0x30, 0x26, 0xfe, 0x27, 0xaf, 0x00, 0xf4, 0x19, 0x4e,
0x3b, 0x1a, 0xd2, 0x8e, 0xbc, 0x67, 0x82, 0x90, 0xc3, 0x21, 0xed, 0xd8, 0x6f, 0x01, 0xd1, 0xdb,
0x11, 0xeb, 0xc5, 0xb4, 0xe0, 0xe8, 0xa8, 0x1d, 0x9d, 0x47, 0x31, 0x1d, 0xc8, 0x0b, 0x34, 0x3a,
0xc8, 0xbe, 0x01, 0xf5, 0x03, 0xf7, 0xdc, 0xa1, 0x1f, 0x8a, 0xfb, 0x8e, 0xcb, 0x30, 0x35, 0x74,
0xcf, 0x99, 0x98, 0x52, 0xf1, 0x2c, 0xac, 0xb6, 0xff, 0xbd, 0x00, 0x93, 0x1c, 0x93, 0xb5, 0xda,
0xa5, 0x51, 0xec, 0xf9, 0x48, 0x58, 0xb2, 0x55, 0x0d, 0x94, 0x21, 0xe5, 0x42, 0x0e, 0x29, 0x0b,
0x6f, 0x4f, 0xe6, 0xec, 0x0b, 0x7a, 0x35, 0x60, 0x8c, 0xb8, 0x92, 0x7c, 0x3a, 0x1e, 0x50, 0x49,
0x00, 0xa9, 0xd0, 0x67, 0xa2, 0x6b, 0xf9, 0xf8, 0x24, 0x97, 0x0a, 0xca, 0xd5, 0x41, 0xb9, 0x1a,
0x7d, 0x8a, 0x13, 0x78, 0x46, 0xa3, 0x67, 0x34, 0x77, 0xe5, 0x25, 0x34, 0x37, 0x77, 0x01, 0x5f,
0xa4, 0xb9, 0xe1, 0x25, 0x34, 0xb7, 0x4d, 0xa0, 0x81, 0x97, 0x01, 0x99, 0x6d, 0x28, 0x69, 0xf7,
0x5b, 0x16, 0x34, 0x04, 0x15, 0xa9, 0x3a, 0xf2, 0x9a, 0x61, 0x03, 0xe7, 0x66, 0xc3, 0x5f, 0x83,
0x69, 0xb4, 0x4c, 0x55, 0x8c, 0x57, 0x04, 0xa4, 0x0d, 0x20, 0x9b, 0x87, 0x3c, 0x3f, 0x1e, 0x78,
0x7d, 0xb1, 0x29, 0x3a, 0x48, 0x86, 0x89, 0x43, 0x57, 0xe4, 0x95, 0x59, 0x8e, 0x2a, 0xdb, 0x7f,
0x6e, 0xc1, 0x9c, 0x36, 0x60, 0x41, 0x85, 0x77, 0x41, 0x72, 0x03, 0x0f, 0xf8, 0x72, 0xce, 0x5d,
0x36, 0xd9, 0x26, 0xf9, 0xcc, 0x40, 0xc6, 0xcd, 0x74, 0xcf, 0x71, 0x80, 0xd1, 0x68, 0x20, 0x84,
0xa8, 0x0e, 0x62, 0x84, 0x74, 0x46, 0xe9, 0x53, 0x85, 0xc2, 0xc5, 0xb8, 0x01, 0xc3, 0xa8, 0x1a,
0xb3, 0xa8, 0x15, 0x52, 0x49, 0x44, 0xd5, 0x74, 0xa0, 0xfd, 0xb7, 0x16, 0xcc, 0x73, 0xd7, 0x48,
0x38, 0x9e, 0xea, 0xda, 0xd3, 0x24, 0xf7, 0x05, 0x39, 0x47, 0xee, 0x4e, 0x38, 0xa2, 0x4c, 0x3e,
0xfb, 0x92, 0xee, 0x9c, 0x4a, 0x76, 0x1b, 0xb3, 0x17, 0xc5, 0xbc, 0xbd, 0x78, 0xc1, 0x4a, 0xe7,
0x05, 0x38, 0xcb, 0xb9, 0x01, 0xce, 0xcd, 0x29, 0x28, 0x47, 0x9d, 0x60, 0x48, 0xed, 0x25, 0x58,
0x30, 0x27, 0x27, 0x44, 0xd0, 0xb7, 0x2d, 0x68, 0xde, 0xe3, 0x07, 0x01, 0x9e, 0xdf, 0xdb, 0xf5,
0xa2, 0x38, 0x08, 0xd5, 0xed, 0xd0, 0xab, 0x00, 0x51, 0xec, 0x86, 0x31, 0xcf, 0xa3, 0x16, 0x81,
0xc5, 0x04, 0xc2, 0xc6, 0x48, 0xfd, 0x2e, 0xaf, 0xe5, 0x7b, 0xa3, 0xca, 0x19, 0x1b, 0x42, 0x38,
0x6f, 0x86, 0x26, 0xbe, 0xce, 0x93, 0x3f, 0x99, 0xad, 0x40, 0x4f, 0x51, 0xae, 0x73, 0xaf, 0x28,
0x05, 0xb5, 0xff, 0xc6, 0x82, 0xd9, 0x64, 0x90, 0x78, 0x2c, 0x6a, 0x4a, 0x07, 0xa1, 0x7e, 0x13,
0xe9, 0x20, 0x43, 0x9e, 0x1e, 0xd3, 0xc7, 0x62, 0x6c, 0x1a, 0x04, 0x39, 0x56, 0x94, 0x82, 0x91,
0x34, 0x70, 0x74, 0x10, 0x4f, 0xe5, 0x62, 0x96, 0x80, 0xb0, 0x6a, 0x44, 0x09, 0xd3, 0xe0, 0x07,
0x31, 0x7e, 0xc5, 0x83, 0xb3, 0xb2, 0x28, 0x55, 0xe9, 0x14, 0x42, 0x51, 0x95, 0xea, 0x87, 0x2a,
0x15, 0xbe, 0x3e, 0xb2, 0x6c, 0xff, 0xaa, 0x05, 0x97, 0x72, 0x16, 0x5e, 0x70, 0xcd, 0x36, 0xcc,
0x1d, 0xab, 0x4a, 0xb9, 0x38, 0x9c, 0x75, 0x96, 0xe4, 0xa1, 0x9d, 0xb9, 0x20, 0x4e, 0xf6, 0x03,
0x65, 0x17, 0xf1, 0xe5, 0x36, 0x92, 0x25, 0xb3, 0x15, 0xf6, 0x01, 0xb4, 0x76, 0x9e, 0x31, 0x26,
0xdc, 0xd2, 0x1f, 0x3a, 0x91, 0xb4, 0x70, 0x3b, 0x23, 0x64, 0x2e, 0x76, 0xb4, 0x8f, 0x61, 0xda,
0x68, 0x8b, 0x7c, 0xfa, 0x65, 0x1b, 0x49, 0x85, 0xa7, 0xb1, 0xc4, 0x5f, 0x6a, 0x91, 0x29, 0x9b,
0x1a, 0xc8, 0x3e, 0x85, 0xd9, 0x77, 0x47, 0xfd, 0xd8, 0x4b, 0x5e, 0x6d, 0x21, 0x9f, 0x15, 0x1f,
0x61, 0x13, 0x72, 0xe9, 0x72, 0xbb, 0xd2, 0xf1, 0xd8, 0x8a, 0x0d, 0x58, 0x4b, 0xed, 0x6c, 0x8f,
0xd9, 0x0a, 0xfb, 0x12, 0x2c, 0x27, 0x5d, 0xf2, 0xb5, 0x93, 0x82, 0xfa, 0x3b, 0x16, 0xcf, 0x76,
0x30, 0x1f, 0x91, 0x21, 0xf7, 0x61, 0x3e, 0xf2, 0xfc, 0x5e, 0x9f, 0xea, 0xed, 0x44, 0x62, 0x25,
0x16, 0xcd, 0xe1, 0x89, 0x87, 0x66, 0x9c, 0xbc, 0x2f, 0x18, 0x81, 0xe4, 0x0f, 0x34, 0x21, 0x90,
0xd4, 0x92, 0xe4, 0x4d, 0xe0, 0x4b, 0x30, 0x63, 0x76, 0x46, 0xee, 0x88, 0x6c, 0xcb, 0x64, 0x64,
0x7a, 0x2c, 0xdb, 0xa4, 0x0c, 0x03, 0xd3, 0xfe, 0xa6, 0x05, 0x4d, 0x87, 0x32, 0x32, 0xa6, 0x5a,
0xa7, 0x82, 0x7a, 0xee, 0x66, 0x9a, 0x1d, 0x3f, 0x61, 0x95, 0xc5, 0x29, 0xe7, 0x7a, 0x73, 0xec,
0xa6, 0xec, 0x4e, 0xe4, 0xcc, 0x6a, 0xb3, 0x02, 0x93, 0x62, 0x7e, 0xcb, 0xb0, 0x28, 0x86, 0x24,
0x87, 0x93, 0x04, 0x4d, 0x8d, 0x4e, 0x8d, 0xa0, 0x69, 0x0b, 0x9a, 0xfc, 0xda, 0xae, 0x3e, 0x0f,
0xfe, 0xe1, 0xda, 0x73, 0xa8, 0x69, 0x97, 0x97, 0xc9, 0x32, 0xcc, 0x3f, 0x79, 0xf0, 0x68, 0x7f,
0xe7, 0xf0, 0xb0, 0x7d, 0xf0, 0x78, 0xf3, 0x9d, 0x9d, 0xf7, 0xda, 0xbb, 0x1b, 0x87, 0xbb, 0x8d,
0x09, 0xb2, 0x04, 0x64, 0x7f, 0xe7, 0xf0, 0xd1, 0xce, 0xb6, 0x01, 0xb7, 0xc8, 0x55, 0x68, 0x3d,
0xde, 0x7f, 0x7c, 0xb8, 0xb3, 0xdd, 0xce, 0xfb, 0xae, 0x40, 0x5e, 0x81, 0x4b, 0xa2, 0x3e, 0xe7,
0xf3, 0xe2, 0xed, 0x6f, 0x16, 0x61, 0x86, 0x27, 0x5d, 0xf0, 0xb7, 0x87, 0x68, 0x48, 0xde, 0x85,
0x29, 0xf1, 0x88, 0x15, 0x91, 0xeb, 0x69, 0x3e, 0x9b, 0xd5, 0x5a, 0x4a, 0x83, 0xc5, 0x22, 0xcc,
0xff, 0xec, 0x0f, 0xff, 0xe9, 0xd7, 0x0b, 0xd3, 0xa4, 0xb6, 0x7e, 0xfa, 0xe6, 0x7a, 0x8f, 0xfa,
0x11, 0x6b, 0xe3, 0x6b, 0x00, 0xc9, 0xd3, 0x4c, 0xa4, 0xa9, 0x7c, 0xae, 0xd4, 0xbb, 0x55, 0xad,
0x4b, 0x39, 0x35, 0xa2, 0xdd, 0x4b, 0xd8, 0xee, 0xbc, 0x3d, 0xc3, 0xda, 0xf5, 0x7c, 0x2f, 0xe6,
0xcf, 0x34, 0xbd, 0x6d, 0xad, 0x91, 0x2e, 0xd4, 0xf5, 0x47, 0x93, 0x88, 0x0c, 0xfc, 0xe6, 0x3c,
0xfb, 0xd4, 0xba, 0x9c, 0x5b, 0x27, 0x37, 0x10, 0xfb, 0x58, 0xb4, 0x1b, 0xac, 0x8f, 0x11, 0x62,
0x24, 0xbd, 0xf4, 0x39, 0x59, 0x27, 0x6f, 0x23, 0x91, 0x2b, 0x1a, 0xa5, 0x65, 0x5e, 0x66, 0x6a,
0xbd, 0x32, 0xa6, 0x56, 0xf4, 0xf5, 0x0a, 0xf6, 0xb5, 0x6c, 0x13, 0xd6, 0x57, 0x07, 0x71, 0xe4,
0xcb, 0x4c, 0x6f, 0x5b, 0x6b, 0xb7, 0x7f, 0xf3, 0x3a, 0x54, 0xd5, 0x21, 0x0f, 0xf9, 0x00, 0xa6,
0x8d, 0xac, 0x18, 0x22, 0xa7, 0x91, 0x97, 0x44, 0xd3, 0xba, 0x92, 0x5f, 0x29, 0x3a, 0xbe, 0x8a,
0x1d, 0x37, 0xc9, 0x12, 0xeb, 0x58, 0xa4, 0x95, 0xac, 0x63, 0x7e, 0x17, 0xbf, 0xac, 0xf1, 0x54,
0x63, 0x5f, 0xde, 0xd9, 0x95, 0x34, 0x47, 0x19, 0xbd, 0xbd, 0x32, 0xa6, 0x56, 0x74, 0x77, 0x05,
0xbb, 0x5b, 0x22, 0x0b, 0x7a, 0x77, 0xea, 0xf0, 0x85, 0xe2, 0x0d, 0x23, 0xfd, 0x59, 0x21, 0xf2,
0x8a, 0x22, 0xac, 0xbc, 0xe7, 0x86, 0x14, 0x89, 0x64, 0xdf, 0x1c, 0xb2, 0x9b, 0xd8, 0x15, 0x21,
0xb8, 0x7d, 0xfa, 0xab, 0x42, 0xe4, 0x08, 0x6a, 0xda, 0x53, 0x18, 0xe4, 0xd2, 0xd8, 0x67, 0x3b,
0x5a, 0xad, 0xbc, 0xaa, 0xbc, 0xa9, 0xe8, 0xed, 0xaf, 0x33, 0xbd, 0xfc, 0x55, 0xa8, 0xaa, 0xc7,
0x15, 0xc8, 0xb2, 0xf6, 0xd8, 0x85, 0xfe, 0x18, 0x44, 0xab, 0x99, 0xad, 0xc8, 0x23, 0x3e, 0xbd,
0x75, 0x46, 0x7c, 0x4f, 0xa0, 0xa6, 0x3d, 0xa0, 0xa0, 0x26, 0x90, 0x7d, 0xa4, 0x41, 0x4d, 0x20,
0xe7, 0xbd, 0x05, 0x7b, 0x0e, 0xbb, 0xa8, 0x91, 0x2a, 0xd2, 0x77, 0xfc, 0x2c, 0x88, 0xc8, 0x1e,
0x2c, 0x0a, 0x31, 0x75, 0x44, 0x3f, 0xce, 0x36, 0xe4, 0xbc, 0xe4, 0x74, 0xcb, 0x22, 0x77, 0xa1,
0x22, 0xdf, 0xc9, 0x20, 0x4b, 0xf9, 0xef, 0x7d, 0xb4, 0x96, 0x33, 0x70, 0x61, 0x9e, 0xbc, 0x07,
0x90, 0xbc, 0xd6, 0xa0, 0x84, 0x44, 0xe6, 0xf5, 0x07, 0x45, 0x01, 0xd9, 0xa7, 0x1d, 0xec, 0x25,
0x9c, 0x60, 0x83, 0xa0, 0x90, 0xf0, 0xe9, 0x99, 0xbc, 0x4c, 0xf8, 0x75, 0xa8, 0x69, 0x0f, 0x36,
0xa8, 0xe5, 0xcb, 0x3e, 0xf6, 0xa0, 0x96, 0x2f, 0xe7, 0x7d, 0x07, 0xbb, 0x85, 0xad, 0x2f, 0xd8,
0xb3, 0xac, 0xf5, 0xc8, 0xeb, 0xf9, 0x03, 0x8e, 0xc0, 0x36, 0xe8, 0x04, 0xa6, 0x8d, 0x57, 0x19,
0x14, 0x87, 0xe6, 0xbd, 0xf9, 0xa0, 0x38, 0x34, 0xf7, 0x21, 0x07, 0x49, 0x67, 0xf6, 0x1c, 0xeb,
0xe7, 0x14, 0x51, 0xb4, 0x9e, 0xde, 0x87, 0x9a, 0xf6, 0xc2, 0x82, 0x9a, 0x4b, 0xf6, 0x31, 0x07,
0x35, 0x97, 0xbc, 0x07, 0x19, 0x16, 0xb0, 0x8f, 0x19, 0x1b, 0x49, 0x01, 0xaf, 0xc5, 0xb1, 0xb6,
0x3f, 0x80, 0x19, 0xf3, 0xcd, 0x05, 0xc5, 0xfb, 0xb9, 0xaf, 0x37, 0x28, 0xde, 0x1f, 0xf3, 0x50,
0x83, 0x20, 0xe9, 0xb5, 0x79, 0xd5, 0xc9, 0xfa, 0x47, 0x22, 0xf9, 0xe3, 0x39, 0xf9, 0x32, 0x13,
0x70, 0xe2, 0x9e, 0x22, 0x59, 0xd6, 0xa8, 0x56, 0xbf, 0xcd, 0xa8, 0xf8, 0x25, 0x73, 0xa5, 0xd1,
0x24, 0x66, 0x7e, 0xb1, 0x0f, 0xb5, 0x16, 0xde, 0x57, 0xd4, 0xb4, 0x96, 0x7e, 0xa5, 0x51, 0xd3,
0x5a, 0xc6, 0xb5, 0xc6, 0xb4, 0xd6, 0x8a, 0x3d, 0xd6, 0x86, 0x0f, 0xb3, 0xa9, 0xcc, 0x5d, 0xc5,
0x15, 0xf9, 0x57, 0x1d, 0x5a, 0x57, 0x5f, 0x9c, 0xf0, 0x6b, 0x4a, 0x10, 0x29, 0x04, 0xd7, 0xe5,
0xc5, 0x92, 0xff, 0x0f, 0x75, 0xfd, 0x7e, 0x3b, 0xd1, 0x59, 0x39, 0xdd, 0xd3, 0xe5, 0xdc, 0x3a,
0x73, 0x73, 0x49, 0x5d, 0xef, 0x86, 0x7c, 0x05, 0x96, 0x14, 0xab, 0xeb, 0xc9, 0xa0, 0x11, 0x79,
0x35, 0x27, 0x45, 0x54, 0x37, 0x5e, 0x5a, 0x97, 0xc6, 0xe6, 0x90, 0xde, 0xb2, 0x18, 0xd1, 0x98,
0x17, 0x87, 0x13, 0x85, 0x91, 0x77, 0x5f, 0x3a, 0x51, 0x18, 0xb9, 0xb7, 0x8d, 0x25, 0xd1, 0x90,
0x79, 0x63, 0x8d, 0xf8, 0xf9, 0x1c, 0x79, 0x1f, 0x66, 0xb5, 0x74, 0xfb, 0xc3, 0x73, 0xbf, 0xa3,
0x18, 0x20, 0x7b, 0x2f, 0xab, 0x95, 0x67, 0x9a, 0xdb, 0xcb, 0xd8, 0xfe, 0x9c, 0x6d, 0x2c, 0x0e,
0x23, 0xfe, 0x2d, 0xa8, 0xe9, 0xa9, 0xfc, 0x2f, 0x68, 0x77, 0x59, 0xab, 0xd2, 0xaf, 0x15, 0xdd,
0xb2, 0xc8, 0x6f, 0x5b, 0x50, 0x37, 0x12, 0xe3, 0x8d, 0x53, 0xe8, 0x54, 0x3b, 0x4d, 0xbd, 0x4e,
0x6f, 0xc8, 0x76, 0x70, 0x90, 0x7b, 0x6b, 0x5f, 0x32, 0x16, 0xe1, 0x23, 0x23, 0xfe, 0x72, 0x33,
0xfd, 0x36, 0xd7, 0xf3, 0x34, 0x82, 0x7e, 0x77, 0xed, 0xf9, 0x2d, 0x8b, 0x7c, 0xd7, 0x82, 0x19,
0x33, 0x6a, 0xa8, 0xb6, 0x2a, 0x37, 0x3e, 0xa9, 0xb6, 0x6a, 0x4c, 0xa8, 0xf1, 0x7d, 0x1c, 0xe5,
0xa3, 0x35, 0xc7, 0x18, 0xa5, 0xb8, 0x52, 0xfe, 0xe3, 0x8d, 0x96, 0xbc, 0xcd, 0x9f, 0xef, 0x93,
0xa1, 0x6c, 0xa2, 0x69, 0x8d, 0xf4, 0xf6, 0xea, 0x4f, 0xce, 0xad, 0x5a, 0xb7, 0x2c, 0xf2, 0x75,
0xfe, 0x26, 0x95, 0xf8, 0x16, 0xa9, 0xe4, 0x65, 0xbf, 0xb7, 0xaf, 0xe1, 0x9c, 0xae, 0xda, 0x97,
0x8c, 0x39, 0xa5, 0xf5, 0xf1, 0x06, 0x1f, 0x9d, 0x78, 0x2d, 0x2e, 0x51, 0x28, 0x99, 0x17, 0xe4,
0xc6, 0x0f, 0x72, 0xc0, 0x07, 0x29, 0xd0, 0x0d, 0x52, 0x7e, 0xc9, 0x66, 0xec, 0x35, 0x1c, 0xeb,
0x35, 0xfb, 0xd5, 0xb1, 0x63, 0x5d, 0xc7, 0xd8, 0x1f, 0x1b, 0xf1, 0x01, 0x40, 0x72, 0xec, 0x44,
0x52, 0xc7, 0x1e, 0x8a, 0xc1, 0xb3, 0x27, 0x53, 0x26, 0xbf, 0xc8, 0xd3, 0x11, 0xd6, 0xe2, 0x57,
0xb9, 0xb8, 0x7a, 0x20, 0x0f, 0x4c, 0x74, 0xa3, 0xc4, 0x3c, 0x1f, 0x32, 0x8c, 0x92, 0x74, 0xfb,
0x86, 0xb0, 0x52, 0xa7, 0x2f, 0x8f, 0x61, 0x7a, 0x2f, 0x08, 0x9e, 0x8e, 0x86, 0xea, 0x08, 0xd9,
0x0c, 0xcb, 0xef, 0xba, 0xd1, 0x49, 0x2b, 0x35, 0x0b, 0x7b, 0x05, 0x9b, 0x6a, 0x91, 0xa6, 0xd6,
0xd4, 0xfa, 0x47, 0xc9, 0xb1, 0xd6, 0x73, 0xe2, 0xc2, 0x9c, 0x92, 0x81, 0x6a, 0xe0, 0x2d, 0xb3,
0x19, 0x43, 0xf2, 0xa5, 0xbb, 0x30, 0xac, 0x67, 0x39, 0xda, 0xf5, 0x48, 0xb6, 0x79, 0xcb, 0x22,
0x07, 0x50, 0xdf, 0xa6, 0x9d, 0xa0, 0x4b, 0x45, 0x6c, 0x7b, 0x3e, 0x19, 0xb8, 0x0a, 0x8a, 0xb7,
0xa6, 0x0d, 0xa0, 0xa9, 0x17, 0x86, 0xee, 0x79, 0x48, 0x3f, 0x5c, 0xff, 0x48, 0x44, 0xcd, 0x9f,
0x4b, 0xbd, 0x20, 0x8f, 0x15, 0x0c, 0xbd, 0x90, 0x3a, 0x87, 0x30, 0xf4, 0x42, 0xe6, 0x1c, 0xc2,
0x58, 0x6a, 0x79, 0xac, 0x41, 0xfa, 0x30, 0x97, 0x39, 0xba, 0x50, 0x2a, 0x61, 0xdc, 0x81, 0x47,
0x6b, 0x65, 0x3c, 0x82, 0xd9, 0xdb, 0x9a, 0xd9, 0xdb, 0x21, 0x4c, 0x6f, 0x53, 0xbe, 0x58, 0x3c,
0xc3, 0x2d, 0x75, 0xbb, 0x42, 0xcf, 0x9f, 0x4b, 0x0b, 0x70, 0xac, 0x33, 0x15, 0x3f, 0xa6, 0x97,
0x91, 0xaf, 0x42, 0xed, 0x3e, 0x8d, 0x65, 0x4a, 0x9b, 0x32, 0x3d, 0x53, 0x39, 0x6e, 0xad, 0x9c,
0x8c, 0x38, 0x93, 0x66, 0xb0, 0xb5, 0x75, 0xda, 0xed, 0x51, 0x2e, 0x9c, 0xda, 0x5e, 0xf7, 0x39,
0xf9, 0x7f, 0xd8, 0xb8, 0xca, 0xbc, 0x5d, 0xd2, 0xf2, 0x99, 0xf4, 0xc6, 0x67, 0x53, 0xf0, 0xbc,
0x96, 0xfd, 0xa0, 0x4b, 0x35, 0x13, 0xc8, 0x87, 0x9a, 0x96, 0x30, 0xae, 0x18, 0x28, 0x9b, 0xdf,
0xaf, 0x18, 0x28, 0x27, 0xbf, 0xdc, 0x5e, 0xc5, 0x7e, 0x6c, 0xb2, 0x92, 0xf4, 0xc3, 0x73, 0xca,
0x93, 0x9e, 0xd6, 0x3f, 0x72, 0x07, 0xf1, 0x73, 0xf2, 0x04, 0x9f, 0x78, 0xd0, 0xd3, 0xf6, 0x12,
0x5b, 0x3a, 0x9d, 0xe1, 0xa7, 0x16, 0x4b, 0xab, 0x32, 0xed, 0x6b, 0xde, 0x15, 0x5a, 0x4a, 0x9f,
0x05, 0x38, 0x8c, 0x83, 0xe1, 0xb6, 0x4b, 0x07, 0x81, 0x9f, 0xc8, 0xda, 0x24, 0xc1, 0x2c, 0x91,
0x5f, 0x5a, 0x96, 0x19, 0x79, 0xa2, 0x39, 0x1f, 0x46, 0xd6, 0xa3, 0x24, 0xae, 0xb1, 0x39, 0x68,
0x6a, 0x41, 0x72, 0xf2, 0xd0, 0x6e, 0x59, 0x64, 0x03, 0x20, 0x39, 0xbb, 0x52, 0xae, 0x44, 0xe6,
0x58, 0x4c, 0x89, 0xbd, 0x9c, 0x83, 0xae, 0x03, 0xa8, 0x26, 0x87, 0x21, 0xcb, 0xc9, 0x9d, 0x06,
0xe3, 0xe8, 0x44, 0x69, 0xf0, 0xcc, 0x11, 0x85, 0xdd, 0xc0, 0xa5, 0x02, 0x52, 0x61, 0x4b, 0x85,
0xe7, 0x0e, 0x1e, 0xcc, 0xf3, 0x01, 0x2a, 0x73, 0x04, 0x53, 0xa6, 0xe4, 0x4c, 0x72, 0x8e, 0x09,
0x14, 0x37, 0xe7, 0x46, 0xd9, 0x8d, 0x88, 0x08, 0xa3, 0x56, 0x9e, 0xae, 0xc5, 0x44, 0xf3, 0x00,
0xe6, 0x32, 0x61, 0x60, 0xc5, 0xd2, 0xe3, 0x22, 0xf3, 0x8a, 0xa5, 0xc7, 0x46, 0x90, 0xed, 0x45,
0xec, 0x72, 0xd6, 0x06, 0xf4, 0x80, 0xce, 0xbc, 0xb8, 0x73, 0xc2, 0xba, 0xfb, 0x8e, 0x05, 0xf3,
0x39, 0x51, 0x5e, 0xf2, 0x9a, 0x74, 0xa6, 0xc7, 0x46, 0x80, 0x5b, 0xb9, 0x41, 0x40, 0xfb, 0x10,
0xfb, 0x79, 0x97, 0xbc, 0x63, 0x28, 0x36, 0x1e, 0x7f, 0x13, 0x9c, 0xf9, 0x42, 0xa3, 0x22, 0xd7,
0xa2, 0xf8, 0x10, 0x96, 0xf9, 0x40, 0x36, 0xfa, 0xfd, 0x54, 0x80, 0xf2, 0x6a, 0xe6, 0x85, 0x6e,
0x23, 0xf0, 0xda, 0x1a, 0xff, 0x82, 0xf7, 0x18, 0x73, 0x95, 0x0f, 0x95, 0x8c, 0xa0, 0x91, 0x0e,
0xfa, 0x91, 0xf1, 0x6d, 0xb5, 0x5e, 0x35, 0xdc, 0xc2, 0x6c, 0xa0, 0xd0, 0xfe, 0x24, 0x76, 0xf6,
0xaa, 0xdd, 0xca, 0x5b, 0x17, 0xee, 0x29, 0xb2, 0xfd, 0xf8, 0x69, 0x15, 0xa1, 0x4c, 0xcd, 0x53,
0x76, 0x30, 0x2e, 0xa4, 0xaa, 0x1c, 0xd3, 0xfc, 0x00, 0xe7, 0x75, 0xec, 0x7e, 0xc5, 0xbe, 0x9c,
0xd7, 0x7d, 0xc8, 0x3f, 0xe1, 0x2e, 0xea, 0x72, 0x9a, 0xaf, 0xe5, 0x08, 0x56, 0xf2, 0xf6, 0x7b,
0xac, 0xaf, 0x91, 0x5a, 0xeb, 0x89, 0x5b, 0xd6, 0xe6, 0x8d, 0xf7, 0x3f, 0xd9, 0xf3, 0xe2, 0x93,
0xd1, 0xd1, 0xcd, 0x4e, 0x30, 0x58, 0xef, 0xcb, 0x10, 0x99, 0x48, 0xcf, 0x5d, 0xef, 0xfb, 0xdd,
0x75, 0xfc, 0xfe, 0x68, 0x12, 0x1f, 0xfc, 0xff, 0xf4, 0x7f, 0x05, 0x00, 0x00, 0xff, 0xff, 0xb7,
0x24, 0x9f, 0x62, 0x22, 0x60, 0x00, 0x00,
var fileDescriptor_rpc_c21d4a52f85dc337 = []byte{
// 7726 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7c, 0x5b, 0x6c, 0x1c, 0xc9,
0x75, 0x28, 0x7b, 0x1e, 0xe4, 0xcc, 0x99, 0x21, 0x39, 0x2c, 0xbe, 0x46, 0x23, 0xad, 0x96, 0xdb,
0x96, 0x25, 0x9a, 0xbb, 0x57, 0xd4, 0xca, 0xf6, 0x5a, 0x5e, 0x5d, 0x5f, 0x5f, 0xbe, 0x24, 0x6a,
0x97, 0x4b, 0xd1, 0x4d, 0xc9, 0xba, 0xbb, 0xf6, 0xc5, 0xb8, 0x39, 0x53, 0x1c, 0xf6, 0x6a, 0xa6,
0x7b, 0xb6, 0xbb, 0x87, 0x14, 0xbd, 0x57, 0x17, 0x17, 0x17, 0x41, 0x12, 0x04, 0x09, 0x02, 0x27,
0x48, 0x10, 0x07, 0x09, 0x82, 0xd8, 0x01, 0x12, 0x23, 0x5f, 0xf9, 0x70, 0x10, 0x20, 0xf1, 0x77,
0x00, 0x03, 0x41, 0x10, 0xf8, 0x33, 0x40, 0x82, 0x20, 0xf9, 0x09, 0xf2, 0x11, 0x24, 0x40, 0x3e,
0x03, 0x04, 0x75, 0xea, 0xd1, 0x55, 0xdd, 0x3d, 0xa2, 0xd6, 0x76, 0xf2, 0x35, 0x53, 0xa7, 0x4e,
0xd7, 0xf3, 0xbc, 0xeb, 0x54, 0x41, 0x35, 0x1c, 0x76, 0x6e, 0x0e, 0xc3, 0x20, 0x0e, 0x48, 0xb9,
0xef, 0x87, 0xc3, 0x4e, 0xeb, 0x4a, 0x2f, 0x08, 0x7a, 0x7d, 0xba, 0xee, 0x0e, 0xbd, 0x75, 0xd7,
0xf7, 0x83, 0xd8, 0x8d, 0xbd, 0xc0, 0x8f, 0x38, 0x92, 0xfd, 0x0d, 0x98, 0xb9, 0x4f, 0xfd, 0x43,
0x4a, 0xbb, 0x0e, 0xfd, 0x68, 0x44, 0xa3, 0x98, 0xbc, 0x0e, 0x73, 0x2e, 0xfd, 0x26, 0xa5, 0xdd,
0xf6, 0xd0, 0x8d, 0xa2, 0xe1, 0x49, 0xe8, 0x46, 0xb4, 0x69, 0xad, 0x58, 0xab, 0x75, 0xa7, 0xc1,
0x2b, 0x0e, 0x14, 0x9c, 0xbc, 0x06, 0xf5, 0x88, 0xa1, 0x52, 0x3f, 0x0e, 0x83, 0xe1, 0x79, 0xb3,
0x80, 0x78, 0x35, 0x06, 0xdb, 0xe1, 0x20, 0xbb, 0x0f, 0xb3, 0xaa, 0x87, 0x68, 0x18, 0xf8, 0x11,
0x25, 0xb7, 0x60, 0xa1, 0xe3, 0x0d, 0x4f, 0x68, 0xd8, 0xc6, 0x8f, 0x07, 0x3e, 0x1d, 0x04, 0xbe,
0xd7, 0x69, 0x5a, 0x2b, 0xc5, 0xd5, 0xaa, 0x43, 0x78, 0x1d, 0xfb, 0xe2, 0x3d, 0x51, 0x43, 0x6e,
0xc0, 0x2c, 0xf5, 0x39, 0x9c, 0x76, 0xf1, 0x2b, 0xd1, 0xd5, 0x4c, 0x02, 0x66, 0x1f, 0xd8, 0x3f,
0x5f, 0x80, 0xb9, 0x07, 0xbe, 0x17, 0x3f, 0x71, 0xfb, 0x7d, 0x1a, 0xcb, 0x39, 0xdd, 0x80, 0xd9,
0x33, 0x04, 0xe0, 0x9c, 0xce, 0x82, 0xb0, 0x2b, 0x66, 0x34, 0xc3, 0xc1, 0x07, 0x02, 0x3a, 0x76,
0x64, 0x85, 0xb1, 0x23, 0xcb, 0x5d, 0xae, 0xe2, 0x98, 0xe5, 0xba, 0x01, 0xb3, 0x21, 0xed, 0x04,
0xa7, 0x34, 0x3c, 0x6f, 0x9f, 0x79, 0x7e, 0x37, 0x38, 0x6b, 0x96, 0x56, 0xac, 0xd5, 0xb2, 0x33,
0x23, 0xc1, 0x4f, 0x10, 0x4a, 0x36, 0x61, 0xb6, 0x73, 0xe2, 0xfa, 0x3e, 0xed, 0xb7, 0x8f, 0xdc,
0xce, 0xd3, 0xd1, 0x30, 0x6a, 0x96, 0x57, 0xac, 0xd5, 0xda, 0xed, 0x4b, 0x37, 0x71, 0x57, 0x6f,
0x6e, 0x9d, 0xb8, 0xfe, 0x26, 0xd6, 0x1c, 0xfa, 0xee, 0x30, 0x3a, 0x09, 0x62, 0x67, 0x46, 0x7c,
0xc1, 0xc1, 0x91, 0xbd, 0x00, 0x44, 0x5f, 0x09, 0xbe, 0xf6, 0xf6, 0x1f, 0x5a, 0x30, 0xff, 0xd8,
0xef, 0x07, 0x9d, 0xa7, 0x3f, 0xe6, 0x12, 0xe5, 0xcc, 0xa1, 0xf0, 0xb2, 0x73, 0x28, 0x7e, 0xd2,
0x39, 0x2c, 0xc1, 0x82, 0x39, 0x58, 0x31, 0x0b, 0x0a, 0x8b, 0xec, 0xeb, 0x1e, 0x95, 0xc3, 0x92,
0xd3, 0xf8, 0x0c, 0x34, 0x3a, 0xa3, 0x30, 0xa4, 0x7e, 0x66, 0x1e, 0xb3, 0x02, 0xae, 0x26, 0xf2,
0x1a, 0xd4, 0x7d, 0x7a, 0x96, 0xa0, 0x09, 0xda, 0xf5, 0xe9, 0x99, 0x44, 0xb1, 0x9b, 0xb0, 0x94,
0xee, 0x46, 0x0c, 0xe0, 0xef, 0x2c, 0x28, 0x3d, 0x8e, 0x9f, 0x05, 0xe4, 0x26, 0x94, 0xe2, 0xf3,
0x21, 0xe7, 0x90, 0x99, 0xdb, 0x44, 0x4c, 0x6d, 0xa3, 0xdb, 0x0d, 0x69, 0x14, 0x3d, 0x3a, 0x1f,
0x52, 0xa7, 0xee, 0xf2, 0x42, 0x9b, 0xe1, 0x91, 0x26, 0x4c, 0x89, 0x32, 0x76, 0x58, 0x75, 0x64,
0x91, 0x5c, 0x05, 0x70, 0x07, 0xc1, 0xc8, 0x8f, 0xdb, 0x91, 0x1b, 0xe3, 0x52, 0x15, 0x1d, 0x0d,
0x42, 0xae, 0x40, 0x75, 0xf8, 0xb4, 0x1d, 0x75, 0x42, 0x6f, 0x18, 0x23, 0xd9, 0x54, 0x9d, 0x04,
0x40, 0x5e, 0x87, 0x4a, 0x30, 0x8a, 0x87, 0x81, 0xe7, 0xc7, 0x82, 0x54, 0x66, 0xc5, 0x58, 0x1e,
0x8e, 0xe2, 0x03, 0x06, 0x76, 0x14, 0x02, 0xb9, 0x06, 0xd3, 0x9d, 0xc0, 0x3f, 0xf6, 0xc2, 0x01,
0x17, 0x06, 0xcd, 0x49, 0xec, 0xcd, 0x04, 0xda, 0xdf, 0x2e, 0x40, 0xed, 0x51, 0xe8, 0xfa, 0x91,
0xdb, 0x61, 0x00, 0x36, 0xf4, 0xf8, 0x59, 0xfb, 0xc4, 0x8d, 0x4e, 0x70, 0xb6, 0x55, 0x47, 0x16,
0xc9, 0x12, 0x4c, 0xf2, 0x81, 0xe2, 0x9c, 0x8a, 0x8e, 0x28, 0x91, 0x37, 0x60, 0xce, 0x1f, 0x0d,
0xda, 0x66, 0x5f, 0x45, 0xa4, 0x96, 0x6c, 0x05, 0x5b, 0x80, 0x23, 0xb6, 0xd7, 0xbc, 0x0b, 0x3e,
0x43, 0x0d, 0x42, 0x6c, 0xa8, 0x8b, 0x12, 0xf5, 0x7a, 0x27, 0x7c, 0x9a, 0x65, 0xc7, 0x80, 0xb1,
0x36, 0x62, 0x6f, 0x40, 0xdb, 0x51, 0xec, 0x0e, 0x86, 0x62, 0x5a, 0x1a, 0x04, 0xeb, 0x83, 0xd8,
0xed, 0xb7, 0x8f, 0x29, 0x8d, 0x9a, 0x53, 0xa2, 0x5e, 0x41, 0xc8, 0x75, 0x98, 0xe9, 0xd2, 0x28,
0x6e, 0x8b, 0x4d, 0xa1, 0x51, 0xb3, 0x82, 0xac, 0x9f, 0x82, 0x32, 0xca, 0xb8, 0x4f, 0x63, 0x6d,
0x75, 0x22, 0x41, 0x81, 0xf6, 0x1e, 0x10, 0x0d, 0xbc, 0x4d, 0x63, 0xd7, 0xeb, 0x47, 0xe4, 0x2d,
0xa8, 0xc7, 0x1a, 0x32, 0x8a, 0xba, 0x9a, 0x22, 0x17, 0xed, 0x03, 0xc7, 0xc0, 0xb3, 0xef, 0x43,
0xe5, 0x1e, 0xa5, 0x7b, 0xde, 0xc0, 0x8b, 0xc9, 0x12, 0x94, 0x8f, 0xbd, 0x67, 0x94, 0x13, 0x74,
0x71, 0x77, 0xc2, 0xe1, 0x45, 0xd2, 0x82, 0xa9, 0x21, 0x0d, 0x3b, 0x54, 0x2e, 0xff, 0xee, 0x84,
0x23, 0x01, 0x9b, 0x53, 0x50, 0xee, 0xb3, 0x8f, 0xed, 0x7f, 0x29, 0x40, 0xed, 0x90, 0xfa, 0x8a,
0x51, 0x08, 0x94, 0xd8, 0x94, 0x04, 0x73, 0xe0, 0x7f, 0xf2, 0x2a, 0xd4, 0x70, 0x9a, 0x51, 0x1c,
0x7a, 0x7e, 0x4f, 0xd0, 0x27, 0x30, 0xd0, 0x21, 0x42, 0x48, 0x03, 0x8a, 0xee, 0x40, 0xd2, 0x26,
0xfb, 0xcb, 0x98, 0x68, 0xe8, 0x9e, 0x0f, 0x18, 0xbf, 0xa9, 0x5d, 0xab, 0x3b, 0x35, 0x01, 0xdb,
0x65, 0xdb, 0x76, 0x13, 0xe6, 0x75, 0x14, 0xd9, 0x7a, 0x19, 0x5b, 0x9f, 0xd3, 0x30, 0x45, 0x27,
0x37, 0x60, 0x56, 0xe2, 0x87, 0x7c, 0xb0, 0xb8, 0x8f, 0x55, 0x67, 0x46, 0x80, 0xe5, 0x14, 0x56,
0xa1, 0x71, 0xec, 0xf9, 0x6e, 0xbf, 0xdd, 0xe9, 0xc7, 0xa7, 0xed, 0x2e, 0xed, 0xc7, 0x2e, 0xee,
0x68, 0xd9, 0x99, 0x41, 0xf8, 0x56, 0x3f, 0x3e, 0xdd, 0x66, 0x50, 0xf2, 0x06, 0x54, 0x8f, 0x29,
0x6d, 0xe3, 0x4a, 0x34, 0x2b, 0x06, 0x77, 0xc8, 0xd5, 0x75, 0x2a, 0xc7, 0x72, 0x9d, 0x57, 0xa1,
0x11, 0x8c, 0xe2, 0x5e, 0xe0, 0xf9, 0xbd, 0x36, 0x93, 0x47, 0x6d, 0xaf, 0xdb, 0xac, 0xae, 0x58,
0xab, 0x25, 0x67, 0x46, 0xc2, 0x99, 0x54, 0x78, 0xd0, 0x25, 0xaf, 0x00, 0x60, 0xdf, 0xbc, 0x61,
0x58, 0xb1, 0x56, 0xa7, 0x9d, 0x2a, 0x83, 0x60, 0x43, 0xf6, 0x9f, 0x58, 0x50, 0xe7, 0x6b, 0x2e,
0x14, 0xdf, 0x35, 0x98, 0x96, 0x53, 0xa3, 0x61, 0x18, 0x84, 0x82, 0x8f, 0x4c, 0x20, 0x59, 0x83,
0x86, 0x04, 0x0c, 0x43, 0xea, 0x0d, 0xdc, 0x1e, 0x15, 0xc2, 0x29, 0x03, 0x27, 0xb7, 0x93, 0x16,
0xc3, 0x60, 0x14, 0x53, 0x21, 0x62, 0xeb, 0x62, 0x76, 0x0e, 0x83, 0x39, 0x26, 0x0a, 0xe3, 0xa3,
0x9c, 0x3d, 0x33, 0x60, 0xf6, 0xf7, 0x2d, 0x20, 0x6c, 0xe8, 0x8f, 0x02, 0xde, 0x84, 0x58, 0xf2,
0xf4, 0x76, 0x5b, 0x2f, 0xbd, 0xdd, 0x85, 0x71, 0xdb, 0xbd, 0x0a, 0x93, 0x38, 0x2c, 0x26, 0x18,
0x8a, 0xe9, 0xa1, 0x6f, 0x16, 0x9a, 0x96, 0x23, 0xea, 0x89, 0x0d, 0x65, 0x3e, 0xc7, 0x52, 0xce,
0x1c, 0x79, 0x95, 0xfd, 0x1d, 0x0b, 0xea, 0x5b, 0x5c, 0x87, 0xa0, 0xd0, 0x23, 0xb7, 0x80, 0x1c,
0x8f, 0xfc, 0x2e, 0xdb, 0xcb, 0xf8, 0x99, 0xd7, 0x6d, 0x1f, 0x9d, 0xb3, 0xae, 0x70, 0xdc, 0xbb,
0x13, 0x4e, 0x4e, 0x1d, 0x79, 0x03, 0x1a, 0x06, 0x34, 0x8a, 0x43, 0x3e, 0xfa, 0xdd, 0x09, 0x27,
0x53, 0xc3, 0x16, 0x93, 0x89, 0xd5, 0x51, 0xdc, 0xf6, 0xfc, 0x2e, 0x7d, 0x86, 0xeb, 0x3f, 0xed,
0x18, 0xb0, 0xcd, 0x19, 0xa8, 0xeb, 0xdf, 0xd9, 0x1f, 0x42, 0x45, 0x0a, 0x65, 0x14, 0x48, 0xa9,
0x71, 0x39, 0x1a, 0x84, 0xb4, 0xa0, 0x62, 0x8e, 0xc2, 0xa9, 0x7c, 0x92, 0xbe, 0xed, 0xff, 0x01,
0x8d, 0x3d, 0x26, 0x19, 0x7d, 0xcf, 0xef, 0x09, 0xad, 0xc4, 0xc4, 0xf5, 0x70, 0x74, 0xf4, 0x94,
0x9e, 0x0b, 0xfa, 0x13, 0x25, 0x26, 0x13, 0x4e, 0x82, 0x28, 0x16, 0xfd, 0xe0, 0x7f, 0xfb, 0xcf,
0x2d, 0x20, 0x3b, 0x51, 0xec, 0x0d, 0xdc, 0x98, 0xde, 0xa3, 0x8a, 0x10, 0x1e, 0x42, 0x9d, 0xb5,
0xf6, 0x28, 0xd8, 0xe0, 0x72, 0x9f, 0xcb, 0xb3, 0xd7, 0xc5, 0x96, 0x64, 0x3f, 0xb8, 0xa9, 0x63,
0x33, 0xd3, 0xf0, 0xdc, 0x31, 0x1a, 0x60, 0xb2, 0x27, 0x76, 0xc3, 0x1e, 0x8d, 0x51, 0x29, 0x08,
0x93, 0x02, 0x38, 0x68, 0x2b, 0xf0, 0x8f, 0x5b, 0x5f, 0x86, 0xb9, 0x4c, 0x1b, 0x4c, 0x20, 0x25,
0xd3, 0x60, 0x7f, 0xc9, 0x02, 0x94, 0x4f, 0xdd, 0xfe, 0x88, 0x0a, 0x4d, 0xc4, 0x0b, 0x6f, 0x17,
0xee, 0x58, 0x76, 0x07, 0xe6, 0x8d, 0x71, 0x09, 0x9e, 0x6c, 0xc2, 0x14, 0x93, 0x0d, 0x4c, 0xe7,
0xa2, 0x5c, 0x75, 0x64, 0x91, 0xdc, 0x86, 0x85, 0x63, 0x4a, 0x43, 0x37, 0xc6, 0x62, 0x7b, 0x48,
0x43, 0xdc, 0x13, 0xd1, 0x72, 0x6e, 0x9d, 0xfd, 0xf7, 0x16, 0xcc, 0x32, 0xbe, 0x79, 0xcf, 0xf5,
0xcf, 0xe5, 0x5a, 0xed, 0xe5, 0xae, 0xd5, 0xaa, 0x58, 0xab, 0x14, 0xf6, 0x27, 0x5d, 0xa8, 0x62,
0x7a, 0xa1, 0xc8, 0x0a, 0xd4, 0x8d, 0xe1, 0x96, 0xb9, 0x92, 0x8b, 0xdc, 0xf8, 0x80, 0x86, 0x9b,
0xe7, 0x31, 0xfd, 0xc9, 0x97, 0xf2, 0x3a, 0x34, 0x92, 0x61, 0x8b, 0x75, 0x24, 0x50, 0x62, 0x84,
0x29, 0x1a, 0xc0, 0xff, 0xf6, 0x6f, 0x59, 0x1c, 0x71, 0x2b, 0xf0, 0x94, 0x82, 0x64, 0x88, 0x4c,
0x8f, 0x4a, 0x44, 0xf6, 0x7f, 0xac, 0x01, 0xf1, 0x93, 0x4f, 0x96, 0x5c, 0x82, 0x4a, 0x44, 0xfd,
0x6e, 0xdb, 0xed, 0xf7, 0x51, 0x8f, 0x54, 0x9c, 0x29, 0x56, 0xde, 0xe8, 0xf7, 0xed, 0x1b, 0x30,
0xa7, 0x8d, 0xee, 0x05, 0xf3, 0xd8, 0x07, 0xb2, 0xe7, 0x45, 0xf1, 0x63, 0x3f, 0x1a, 0x6a, 0xfa,
0xe7, 0x32, 0x54, 0x07, 0x9e, 0x8f, 0x23, 0xe3, 0x9c, 0x5b, 0x76, 0x2a, 0x03, 0xcf, 0x67, 0xe3,
0x8a, 0xb0, 0xd2, 0x7d, 0x26, 0x2a, 0x0b, 0xa2, 0xd2, 0x7d, 0x86, 0x95, 0xf6, 0x1d, 0x98, 0x37,
0xda, 0x13, 0x5d, 0xbf, 0x06, 0xe5, 0x51, 0xfc, 0x2c, 0x90, 0xd6, 0x41, 0x4d, 0x50, 0x08, 0xb3,
0x33, 0x1d, 0x5e, 0x63, 0xdf, 0x85, 0xb9, 0x7d, 0x7a, 0x26, 0x18, 0x59, 0x0e, 0xe4, 0xfa, 0x85,
0x36, 0x28, 0xd6, 0xdb, 0x37, 0x81, 0xe8, 0x1f, 0x27, 0x0c, 0x20, 0x2d, 0x52, 0xcb, 0xb0, 0x48,
0xed, 0xeb, 0x40, 0x0e, 0xbd, 0x9e, 0xff, 0x1e, 0x8d, 0x22, 0xb7, 0xa7, 0x58, 0xbf, 0x01, 0xc5,
0x41, 0xd4, 0x13, 0xa2, 0x8a, 0xfd, 0xb5, 0x3f, 0x0b, 0xf3, 0x06, 0x9e, 0x68, 0xf8, 0x0a, 0x54,
0x23, 0xaf, 0xe7, 0xbb, 0xf1, 0x28, 0xa4, 0xa2, 0xe9, 0x04, 0x60, 0xdf, 0x83, 0x85, 0xaf, 0xd2,
0xd0, 0x3b, 0x3e, 0xbf, 0xa8, 0x79, 0xb3, 0x9d, 0x42, 0xba, 0x9d, 0x1d, 0x58, 0x4c, 0xb5, 0x23,
0xba, 0xe7, 0xe4, 0x2b, 0x76, 0xb2, 0xe2, 0xf0, 0x82, 0x26, 0xfb, 0x0a, 0xba, 0xec, 0xb3, 0x1f,
0x03, 0xd9, 0x0a, 0x7c, 0x9f, 0x76, 0xe2, 0x03, 0x4a, 0xc3, 0xc4, 0x19, 0x4e, 0x68, 0xb5, 0x76,
0x7b, 0x59, 0xac, 0x6c, 0x5a, 0xa0, 0x0a, 0x22, 0x26, 0x50, 0x1a, 0xd2, 0x70, 0x80, 0x0d, 0x57,
0x1c, 0xfc, 0x6f, 0x2f, 0xc2, 0xbc, 0xd1, 0xac, 0x70, 0x1f, 0xde, 0x84, 0xc5, 0x6d, 0x2f, 0xea,
0x64, 0x3b, 0x6c, 0xc2, 0xd4, 0x70, 0x74, 0xd4, 0x4e, 0x38, 0x51, 0x16, 0x99, 0xc5, 0x99, 0xfe,
0x44, 0x34, 0xf6, 0xb3, 0x16, 0x94, 0x76, 0x1f, 0xed, 0x6d, 0x31, 0x5d, 0xe1, 0xf9, 0x9d, 0x60,
0xc0, 0xf4, 0x2d, 0x9f, 0xb4, 0x2a, 0x8f, 0xe5, 0xb0, 0x2b, 0x50, 0x45, 0x35, 0xcd, 0x8c, 0x68,
0xe1, 0xb7, 0x26, 0x00, 0x66, 0xc0, 0xd3, 0x67, 0x43, 0x2f, 0x44, 0x0b, 0x5d, 0xda, 0xdd, 0x25,
0x54, 0x33, 0xd9, 0x0a, 0xfb, 0x87, 0x65, 0x98, 0x12, 0xca, 0x17, 0xfb, 0xeb, 0xc4, 0xde, 0x29,
0x15, 0x23, 0x11, 0x25, 0x66, 0x02, 0x85, 0x74, 0x10, 0xc4, 0xb4, 0x6d, 0x6c, 0x83, 0x09, 0x44,
0x07, 0x45, 0xf8, 0x8e, 0xdc, 0xa5, 0x29, 0x72, 0x2c, 0x03, 0xc8, 0x16, 0x4b, 0xda, 0x67, 0x25,
0xb4, 0xcf, 0x64, 0x91, 0xad, 0x44, 0xc7, 0x1d, 0xba, 0x1d, 0x2f, 0x3e, 0x17, 0x22, 0x41, 0x95,
0x59, 0xdb, 0xfd, 0xa0, 0xe3, 0x32, 0xaf, 0xb4, 0xef, 0xfa, 0x1d, 0x2a, 0x9d, 0x1f, 0x03, 0xc8,
0x1c, 0x01, 0x31, 0x24, 0x89, 0xc6, 0x9d, 0x85, 0x14, 0x94, 0xe9, 0xef, 0x4e, 0x30, 0x18, 0x78,
0x31, 0xf3, 0x1f, 0xd0, 0xb6, 0x2c, 0x3a, 0x1a, 0x84, 0xbb, 0x5a, 0x58, 0x3a, 0xe3, 0xab, 0x57,
0x95, 0xae, 0x96, 0x06, 0x64, 0xad, 0x30, 0xad, 0xc3, 0xc4, 0xd8, 0xd3, 0x33, 0x34, 0x24, 0x8b,
0x8e, 0x06, 0x61, 0xfb, 0x30, 0xf2, 0x23, 0x1a, 0xc7, 0x7d, 0xda, 0x55, 0x03, 0xaa, 0x21, 0x5a,
0xb6, 0x82, 0xdc, 0x82, 0x79, 0xee, 0xd2, 0x44, 0x6e, 0x1c, 0x44, 0x27, 0x5e, 0xd4, 0x8e, 0x98,
0x73, 0x50, 0x47, 0xfc, 0xbc, 0x2a, 0x72, 0x07, 0x96, 0x53, 0xe0, 0x90, 0x76, 0xa8, 0x77, 0x4a,
0xbb, 0xcd, 0x69, 0xfc, 0x6a, 0x5c, 0x35, 0x59, 0x81, 0x1a, 0xf3, 0xe4, 0x46, 0xc3, 0xae, 0xcb,
0x0c, 0x98, 0x19, 0xdc, 0x07, 0x1d, 0x44, 0xde, 0x84, 0xe9, 0x21, 0xe5, 0xd6, 0xcf, 0x49, 0xdc,
0xef, 0x44, 0xcd, 0x59, 0x43, 0xba, 0x31, 0xca, 0x75, 0x4c, 0x0c, 0x46, 0x94, 0x9d, 0x08, 0x4d,
0x7a, 0xf7, 0xbc, 0xd9, 0x10, 0x66, 0xb5, 0x04, 0x20, 0x8f, 0x84, 0xde, 0xa9, 0x1b, 0xd3, 0xe6,
0x1c, 0x17, 0xe8, 0xa2, 0xc8, 0xbe, 0xf3, 0x7c, 0x2f, 0xf6, 0xdc, 0x38, 0x08, 0x9b, 0x04, 0xeb,
0x12, 0x00, 0x5b, 0x44, 0xa4, 0x8f, 0x28, 0x76, 0xe3, 0x51, 0xd4, 0x3e, 0xee, 0xbb, 0xbd, 0xa8,
0x39, 0xcf, 0xed, 0xd2, 0x4c, 0x85, 0xfd, 0x3b, 0x16, 0x17, 0xd2, 0x82, 0xa0, 0x95, 0xb0, 0x7d,
0x15, 0x6a, 0x9c, 0x94, 0xdb, 0x81, 0xdf, 0x3f, 0x17, 0xd4, 0x0d, 0x1c, 0xf4, 0xd0, 0xef, 0x9f,
0x93, 0x4f, 0xc1, 0xb4, 0xe7, 0xeb, 0x28, 0x5c, 0x1e, 0xd4, 0x25, 0x10, 0x91, 0x5e, 0x85, 0xda,
0x70, 0x74, 0xd4, 0xf7, 0x3a, 0x1c, 0xa5, 0xc8, 0x5b, 0xe1, 0x20, 0x44, 0x60, 0x96, 0x36, 0x9f,
0x15, 0xc7, 0x28, 0x21, 0x46, 0x4d, 0xc0, 0x18, 0x8a, 0xbd, 0x09, 0x0b, 0xe6, 0x00, 0x85, 0xe0,
0x5b, 0x83, 0x8a, 0xe0, 0x93, 0xa8, 0x59, 0xc3, 0xb5, 0x9e, 0xd1, 0x22, 0x2e, 0x3e, 0xed, 0x3b,
0xaa, 0xde, 0xfe, 0xe3, 0x12, 0xcc, 0x0b, 0xe8, 0x56, 0x3f, 0x88, 0xe8, 0xe1, 0x68, 0x30, 0x70,
0xc3, 0x1c, 0x06, 0xb4, 0x2e, 0x60, 0xc0, 0x82, 0xc9, 0x80, 0x8c, 0x2d, 0x4e, 0x5c, 0xcf, 0xe7,
0x6e, 0x02, 0xe7, 0x5e, 0x0d, 0x42, 0x56, 0x61, 0xb6, 0xd3, 0x0f, 0x22, 0x6e, 0x12, 0xeb, 0x0e,
0x7f, 0x1a, 0x9c, 0x15, 0x18, 0xe5, 0x3c, 0x81, 0xa1, 0x33, 0xfc, 0x64, 0x8a, 0xe1, 0x6d, 0xa8,
0xb3, 0x46, 0xa9, 0x94, 0x5f, 0x53, 0xdc, 0x4c, 0xd6, 0x61, 0x6c, 0x3c, 0x69, 0xf6, 0xe2, 0xbc,
0x3c, 0x9b, 0xc7, 0x5c, 0xde, 0x80, 0xa2, 0x7c, 0xd4, 0xb0, 0xab, 0x82, 0xb9, 0xb2, 0x55, 0xe4,
0x1e, 0xf3, 0x12, 0x59, 0x5f, 0xa8, 0xa4, 0x01, 0x95, 0xf4, 0x75, 0x73, 0x47, 0xf4, 0xb5, 0xbf,
0xc9, 0x0a, 0xa3, 0x90, 0xa2, 0xe2, 0xd6, 0xbe, 0xb4, 0x7f, 0xc1, 0x82, 0x9a, 0x56, 0x47, 0x16,
0x61, 0x6e, 0xeb, 0xe1, 0xc3, 0x83, 0x1d, 0x67, 0xe3, 0xd1, 0x83, 0xaf, 0xee, 0xb4, 0xb7, 0xf6,
0x1e, 0x1e, 0xee, 0x34, 0x26, 0x18, 0x78, 0xef, 0xe1, 0xd6, 0xc6, 0x5e, 0xfb, 0xde, 0x43, 0x67,
0x4b, 0x82, 0x2d, 0xb2, 0x04, 0xc4, 0xd9, 0x79, 0xef, 0xe1, 0xa3, 0x1d, 0x03, 0x5e, 0x20, 0x0d,
0xa8, 0x6f, 0x3a, 0x3b, 0x1b, 0x5b, 0xbb, 0x02, 0x52, 0x24, 0x0b, 0xd0, 0xb8, 0xf7, 0x78, 0x7f,
0xfb, 0xc1, 0xfe, 0xfd, 0xf6, 0xd6, 0xc6, 0xfe, 0xd6, 0xce, 0xde, 0xce, 0x76, 0xa3, 0x44, 0xa6,
0xa1, 0xba, 0xb1, 0xb9, 0xb1, 0xbf, 0xfd, 0x70, 0x7f, 0x67, 0xbb, 0x51, 0xb6, 0xff, 0xc6, 0x82,
0x45, 0x1c, 0x75, 0x37, 0xcd, 0x20, 0x2b, 0x50, 0xeb, 0x04, 0xc1, 0x90, 0x19, 0xc7, 0x89, 0xf8,
0xd7, 0x41, 0x8c, 0xf8, 0xb9, 0xb0, 0x3d, 0x0e, 0xc2, 0x0e, 0x15, 0xfc, 0x01, 0x08, 0xba, 0xc7,
0x20, 0x8c, 0xf8, 0xc5, 0xf6, 0x72, 0x0c, 0xce, 0x1e, 0x35, 0x0e, 0xe3, 0x28, 0x4b, 0x30, 0x79,
0x14, 0x52, 0xb7, 0x73, 0x22, 0x38, 0x43, 0x94, 0xc8, 0x67, 0x12, 0xef, 0xad, 0xc3, 0x56, 0xbf,
0x4f, 0xbb, 0x48, 0x31, 0x15, 0x67, 0x56, 0xc0, 0xb7, 0x04, 0x98, 0x49, 0x0b, 0xf7, 0xc8, 0xf5,
0xbb, 0x81, 0x4f, 0xbb, 0xc2, 0x34, 0x4c, 0x00, 0xf6, 0x01, 0x2c, 0xa5, 0xe7, 0x27, 0xf8, 0xeb,
0x2d, 0x8d, 0xbf, 0xb8, 0xa5, 0xd6, 0x1a, 0xbf, 0x9b, 0x1a, 0xaf, 0xfd, 0x6d, 0x01, 0x4a, 0x4c,
0x71, 0x8f, 0x57, 0xf2, 0xba, 0x2d, 0x56, 0xcc, 0x44, 0x07, 0xd1, 0x21, 0xe4, 0xa2, 0x9c, 0xab,
0x3b, 0x0d, 0x92, 0xd4, 0x87, 0xb4, 0x73, 0x8a, 0x33, 0x56, 0xf5, 0x0c, 0xc2, 0x18, 0x84, 0x19,
0xca, 0xf8, 0xb5, 0x60, 0x10, 0x59, 0x96, 0x75, 0xf8, 0xe5, 0x54, 0x52, 0x87, 0xdf, 0x35, 0x61,
0xca, 0xf3, 0x8f, 0x82, 0x91, 0xdf, 0x45, 0x86, 0xa8, 0x38, 0xb2, 0x88, 0xf1, 0x48, 0x64, 0x54,
0x6f, 0x20, 0xc9, 0x3f, 0x01, 0x90, 0xdb, 0x50, 0x8d, 0xce, 0xfd, 0x8e, 0x4e, 0xf3, 0x0b, 0x62,
0x95, 0xd8, 0x1a, 0xdc, 0x3c, 0x3c, 0xf7, 0x3b, 0x48, 0xe1, 0x09, 0x9a, 0xfd, 0x65, 0xa8, 0x48,
0x30, 0x23, 0xcb, 0xc7, 0xfb, 0xef, 0xee, 0x3f, 0x7c, 0xb2, 0xdf, 0x3e, 0x7c, 0x7f, 0x7f, 0xab,
0x31, 0x41, 0x66, 0xa1, 0xb6, 0xb1, 0x85, 0x94, 0x8e, 0x00, 0x8b, 0xa1, 0x1c, 0x6c, 0x1c, 0x1e,
0x2a, 0x48, 0xc1, 0x26, 0xcc, 0xd9, 0x8d, 0xd0, 0x3a, 0x52, 0xf1, 0xb8, 0xb7, 0x60, 0x4e, 0x83,
0x25, 0x96, 0xf6, 0x90, 0x01, 0x52, 0x96, 0x36, 0x9a, 0x55, 0xbc, 0xc6, 0x6e, 0xc0, 0xcc, 0x7d,
0x1a, 0x3f, 0xf0, 0x8f, 0x03, 0xd9, 0xd2, 0xef, 0x97, 0x60, 0x56, 0x81, 0x44, 0x43, 0xab, 0x30,
0xeb, 0x75, 0xa9, 0x1f, 0x7b, 0xf1, 0x79, 0xdb, 0xf0, 0xa9, 0xd3, 0x60, 0x66, 0x8e, 0xba, 0x7d,
0xcf, 0x95, 0x61, 0x5f, 0x5e, 0x60, 0x3e, 0x26, 0xd3, 0x95, 0x52, 0xfd, 0x29, 0xba, 0xe2, 0xae,
0x7c, 0x6e, 0x1d, 0x93, 0x40, 0x0c, 0x2e, 0x54, 0x8c, 0xfa, 0x84, 0x9b, 0x65, 0x79, 0x55, 0x6c,
0xab, 0x78, 0x4b, 0x6c, 0xca, 0x65, 0xae, 0x4f, 0x15, 0x20, 0x13, 0x57, 0x9d, 0xe4, 0xf2, 0x31,
0x1d, 0x57, 0xd5, 0x62, 0xb3, 0x95, 0x4c, 0x6c, 0x96, 0xc9, 0xcf, 0x73, 0xbf, 0x43, 0xbb, 0xed,
0x38, 0x68, 0xa3, 0x9c, 0x47, 0x92, 0xa8, 0x38, 0x69, 0x30, 0xb9, 0x02, 0x53, 0x31, 0x8d, 0x62,
0x9f, 0xf2, 0x80, 0x59, 0x05, 0x43, 0x3c, 0x12, 0xc4, 0x6c, 0xe8, 0x51, 0xe8, 0x45, 0xcd, 0x3a,
0x46, 0x5d, 0xf1, 0x3f, 0xf9, 0x1c, 0x2c, 0x1e, 0xd1, 0x28, 0x6e, 0x9f, 0x50, 0xb7, 0x4b, 0x43,
0x24, 0x2f, 0x1e, 0xde, 0xe5, 0xa6, 0x49, 0x7e, 0x25, 0x23, 0xdc, 0x53, 0x1a, 0x46, 0x5e, 0xe0,
0xa3, 0x51, 0x52, 0x75, 0x64, 0x91, 0xb5, 0xc7, 0x26, 0xaf, 0x94, 0xb4, 0x5a, 0xc1, 0x59, 0x9c,
0x78, 0x7e, 0x25, 0xb9, 0x06, 0x93, 0x38, 0x81, 0xa8, 0xd9, 0x30, 0xe2, 0x54, 0x5b, 0x0c, 0xe8,
0x88, 0xba, 0x77, 0x4a, 0x95, 0x5a, 0xa3, 0x6e, 0x7f, 0x01, 0xca, 0x08, 0x66, 0x9b, 0xce, 0x17,
0x83, 0x13, 0x05, 0x2f, 0xb0, 0xa1, 0xf9, 0x34, 0x3e, 0x0b, 0xc2, 0xa7, 0xf2, 0x0c, 0x40, 0x14,
0xed, 0x6f, 0xa2, 0x17, 0xa2, 0x62, 0xe2, 0x8f, 0xd1, 0x84, 0x62, 0xbe, 0x24, 0x5f, 0xea, 0xe8,
0xc4, 0x15, 0x8e, 0x51, 0x05, 0x01, 0x87, 0x27, 0x2e, 0x93, 0x95, 0xc6, 0xee, 0x71, 0x5f, 0xb3,
0x86, 0xb0, 0x5d, 0xbe, 0x79, 0xd7, 0x60, 0x46, 0x46, 0xdb, 0xa3, 0x76, 0x9f, 0x1e, 0xc7, 0x32,
0x52, 0xe4, 0x8f, 0x06, 0xe8, 0x90, 0xee, 0xd1, 0xe3, 0xd8, 0xde, 0x87, 0x39, 0x21, 0xbf, 0x1e,
0x0e, 0xa9, 0xec, 0xfa, 0x8b, 0x79, 0x76, 0x40, 0xed, 0xf6, 0xbc, 0x29, 0xf0, 0xf8, 0xf9, 0x82,
0x89, 0x69, 0x3b, 0x40, 0x74, 0x79, 0x28, 0x1a, 0x14, 0xca, 0x58, 0xc6, 0xc2, 0xc4, 0x74, 0x0c,
0x18, 0x5b, 0x9f, 0x68, 0xd4, 0xe9, 0xc8, 0x33, 0x12, 0xe6, 0xb1, 0xf3, 0xa2, 0xfd, 0x07, 0x16,
0xcc, 0x63, 0x6b, 0xd2, 0x92, 0x11, 0x3a, 0xe7, 0xce, 0x27, 0x18, 0x66, 0xbd, 0xa3, 0xc7, 0x07,
0x17, 0xa0, 0xac, 0x6b, 0x21, 0x5e, 0xf8, 0xe4, 0x71, 0x87, 0x52, 0x3a, 0xee, 0x60, 0xff, 0x86,
0x05, 0x73, 0x5c, 0x11, 0xa0, 0x55, 0x29, 0xa6, 0xff, 0xdf, 0x61, 0x9a, 0x6b, 0x74, 0xc1, 0xd5,
0x62, 0xa0, 0x89, 0x68, 0x44, 0x28, 0x47, 0xde, 0x9d, 0x70, 0x4c, 0x64, 0x72, 0x17, 0xad, 0x2a,
0xbf, 0x8d, 0xd0, 0x9c, 0xd3, 0x34, 0x73, 0xad, 0x77, 0x27, 0x1c, 0x0d, 0x7d, 0xb3, 0x02, 0x93,
0xdc, 0x24, 0xb7, 0xef, 0xc3, 0xb4, 0xd1, 0x91, 0x11, 0xf3, 0xa8, 0xf3, 0x98, 0x47, 0x26, 0xb8,
0x58, 0xc8, 0x09, 0x2e, 0xfe, 0x51, 0x11, 0x08, 0x23, 0x96, 0xd4, 0x6e, 0x30, 0x9f, 0x20, 0xe8,
0x1a, 0x1e, 0x5e, 0xdd, 0xd1, 0x41, 0xe4, 0x26, 0x10, 0xad, 0x28, 0x63, 0xc4, 0x5c, 0xe5, 0xe5,
0xd4, 0x30, 0x31, 0x29, 0x2c, 0x06, 0xa1, 0xdb, 0x85, 0x2f, 0xcb, 0x97, 0x3d, 0xb7, 0x8e, 0x69,
0xb5, 0xe1, 0x28, 0x3a, 0xc1, 0xc8, 0x9e, 0xf0, 0x01, 0x65, 0x39, 0xbd, 0xbf, 0x93, 0x17, 0xee,
0xef, 0x54, 0x26, 0xae, 0xa4, 0x79, 0x21, 0x15, 0xd3, 0x0b, 0xb9, 0x06, 0xd3, 0x03, 0x66, 0xe7,
0xc6, 0xfd, 0x4e, 0x7b, 0xc0, 0x7a, 0x17, 0x2e, 0x9f, 0x01, 0x24, 0x6b, 0xd0, 0x10, 0x36, 0x4e,
0xe2, 0xea, 0xf0, 0x13, 0x84, 0x0c, 0x9c, 0xc9, 0xef, 0x24, 0xd2, 0x54, 0xc3, 0xc1, 0x26, 0x00,
0xe6, 0xd7, 0x44, 0x8c, 0x42, 0xda, 0x23, 0x5f, 0x1c, 0xa8, 0xd1, 0x2e, 0x3a, 0x7b, 0x15, 0x27,
0x5b, 0x61, 0xff, 0x8a, 0x05, 0x0d, 0xb6, 0x67, 0x06, 0x59, 0xbe, 0x0d, 0xc8, 0x15, 0x2f, 0x49,
0x95, 0x06, 0x2e, 0xb9, 0x03, 0x55, 0x2c, 0x07, 0x43, 0xea, 0x0b, 0x9a, 0x6c, 0x9a, 0x34, 0x99,
0xc8, 0x93, 0xdd, 0x09, 0x27, 0x41, 0xd6, 0x28, 0xf2, 0x2f, 0x2d, 0xa8, 0x89, 0x5e, 0x7e, 0xec,
0x48, 0x46, 0x4b, 0x3b, 0x01, 0xe5, 0x94, 0x94, 0x1c, 0x78, 0xae, 0xc2, 0xec, 0xc0, 0x8d, 0x47,
0x21, 0xd3, 0xc7, 0x46, 0x14, 0x23, 0x0d, 0x66, 0xca, 0x15, 0x45, 0x67, 0xd4, 0x8e, 0xbd, 0x7e,
0x5b, 0xd6, 0x8a, 0xb3, 0xc6, 0xbc, 0x2a, 0x26, 0x41, 0xa2, 0xd8, 0xed, 0x51, 0xa1, 0x37, 0x79,
0xc1, 0x6e, 0xc2, 0x92, 0x98, 0x50, 0xca, 0x3e, 0xb6, 0x7f, 0x50, 0x87, 0xe5, 0x4c, 0x95, 0xca,
0x8c, 0x10, 0xee, 0x79, 0xdf, 0x1b, 0x1c, 0x05, 0xca, 0xb9, 0xb0, 0x74, 0xcf, 0xdd, 0xa8, 0x22,
0x3d, 0x58, 0x94, 0x06, 0x02, 0x5b, 0xd3, 0x44, 0x99, 0x15, 0x50, 0x4b, 0xbd, 0x69, 0x6e, 0x61,
0xba, 0x43, 0x09, 0xd7, 0x99, 0x38, 0xbf, 0x3d, 0x72, 0x02, 0x4d, 0x65, 0x89, 0x08, 0x61, 0xad,
0x59, 0x2b, 0xac, 0xaf, 0x37, 0x2e, 0xe8, 0xcb, 0x30, 0xa7, 0x9d, 0xb1, 0xad, 0x91, 0x73, 0xb8,
0x2a, 0xeb, 0x50, 0x1a, 0x67, 0xfb, 0x2b, 0xbd, 0xd4, 0xdc, 0xd0, 0x51, 0x30, 0x3b, 0xbd, 0xa0,
0x61, 0xf2, 0x21, 0x2c, 0x9d, 0xb9, 0x5e, 0x2c, 0x87, 0xa5, 0xd9, 0x06, 0x65, 0xec, 0xf2, 0xf6,
0x05, 0x5d, 0x3e, 0xe1, 0x1f, 0x1b, 0x2a, 0x6a, 0x4c, 0x8b, 0xad, 0x1f, 0x5a, 0x30, 0x63, 0xb6,
0xc3, 0xc8, 0x54, 0xf0, 0xbe, 0x94, 0x81, 0xd2, 0x9a, 0x4c, 0x81, 0xb3, 0xfe, 0x79, 0x21, 0xcf,
0x3f, 0xd7, 0xbd, 0xe2, 0xe2, 0x45, 0x61, 0xb0, 0xd2, 0xcb, 0x85, 0xc1, 0xca, 0x79, 0x61, 0xb0,
0xd6, 0xbf, 0x59, 0x40, 0xb2, 0xb4, 0x44, 0xee, 0xf3, 0x00, 0x81, 0x4f, 0xfb, 0x42, 0xa4, 0xfc,
0xb7, 0x97, 0xa3, 0x47, 0xb9, 0x76, 0xf2, 0x6b, 0xc6, 0x18, 0x7a, 0xb2, 0x80, 0x6e, 0xec, 0x4c,
0x3b, 0x79, 0x55, 0xa9, 0xc0, 0x5c, 0xe9, 0xe2, 0xc0, 0x5c, 0xf9, 0xe2, 0xc0, 0xdc, 0x64, 0x3a,
0x30, 0xd7, 0xfa, 0x19, 0x0b, 0xe6, 0x73, 0x36, 0xfd, 0xa7, 0x37, 0x71, 0xb6, 0x4d, 0x86, 0x2c,
0x28, 0x88, 0x6d, 0xd2, 0x81, 0xad, 0xff, 0x03, 0xd3, 0x06, 0xa1, 0xff, 0xf4, 0xfa, 0x4f, 0xdb,
0x6b, 0x9c, 0xce, 0x0c, 0x58, 0xeb, 0x9f, 0x0a, 0x40, 0xb2, 0xcc, 0xf6, 0x5f, 0x3a, 0x86, 0xec,
0x3a, 0x15, 0x73, 0xd6, 0xe9, 0x3f, 0x55, 0x0f, 0xbc, 0x01, 0x73, 0x22, 0x03, 0x4a, 0x0b, 0x0b,
0x71, 0x8a, 0xc9, 0x56, 0x30, 0x8b, 0xd5, 0x8c, 0x8a, 0x56, 0x8c, 0x8c, 0x10, 0x4d, 0x19, 0xa6,
0x82, 0xa3, 0x76, 0x0b, 0x9a, 0x62, 0x85, 0x76, 0x4e, 0xa9, 0x1f, 0x1f, 0x8e, 0x8e, 0x78, 0x0a,
0x90, 0x17, 0xf8, 0xf6, 0xf7, 0x8b, 0xca, 0xe8, 0xc6, 0x4a, 0xa1, 0xde, 0x3f, 0x07, 0x75, 0x5d,
0x98, 0x8b, 0xed, 0x48, 0x45, 0x05, 0x99, 0x62, 0xd7, 0xb1, 0xc8, 0x36, 0xcc, 0xa0, 0xc8, 0xea,
0xaa, 0xef, 0x0a, 0xf8, 0xdd, 0x0b, 0xa2, 0x1d, 0xbb, 0x13, 0x4e, 0xea, 0x1b, 0xf2, 0x25, 0x98,
0x31, 0x5d, 0x29, 0x61, 0x23, 0xe4, 0xd9, 0xe6, 0xec, 0x73, 0x13, 0x99, 0x6c, 0x40, 0x23, 0xed,
0x8b, 0x89, 0xf3, 0xff, 0x31, 0x0d, 0x64, 0xd0, 0xc9, 0x1d, 0x71, 0x3c, 0x56, 0xc6, 0x28, 0xc4,
0x35, 0xf3, 0x33, 0x6d, 0x99, 0x6e, 0xf2, 0x1f, 0xed, 0xc0, 0xec, 0xeb, 0x00, 0x09, 0x8c, 0x34,
0xa0, 0xfe, 0xf0, 0x60, 0x67, 0xbf, 0xbd, 0xb5, 0xbb, 0xb1, 0xbf, 0xbf, 0xb3, 0xd7, 0x98, 0x20,
0x04, 0x66, 0x30, 0x68, 0xb6, 0xad, 0x60, 0x16, 0x83, 0x89, 0x30, 0x85, 0x84, 0x15, 0xc8, 0x02,
0x34, 0x1e, 0xec, 0xa7, 0xa0, 0xc5, 0xcd, 0xaa, 0xe2, 0x0f, 0x7b, 0x09, 0x16, 0x78, 0x86, 0xdb,
0x26, 0x27, 0x0f, 0x69, 0x2b, 0xfc, 0xb6, 0x05, 0x8b, 0xa9, 0x8a, 0x24, 0x95, 0x84, 0x9b, 0x03,
0xa6, 0x8d, 0x60, 0x02, 0x31, 0xe4, 0x2d, 0x2d, 0xbf, 0x94, 0x04, 0xc9, 0x56, 0x30, 0x9a, 0xd7,
0x2c, 0xc5, 0x14, 0x27, 0xe5, 0x55, 0xd9, 0xcb, 0x3c, 0x0f, 0x0f, 0x33, 0xf6, 0x8c, 0x81, 0x1f,
0xf3, 0xcc, 0x39, 0xbd, 0x22, 0x39, 0x6e, 0x34, 0x87, 0x2c, 0x8b, 0xcc, 0xc8, 0x37, 0x4c, 0x0f,
0x73, 0xbc, 0xb9, 0x75, 0xf6, 0xef, 0x16, 0x80, 0x7c, 0x65, 0x44, 0xc3, 0x73, 0xcc, 0x02, 0x51,
0x31, 0xc8, 0xe5, 0x74, 0x84, 0x6d, 0x72, 0x38, 0x3a, 0x7a, 0x97, 0x9e, 0xcb, 0x0c, 0xa6, 0x42,
0x92, 0xc1, 0x94, 0x97, 0x45, 0x54, 0xba, 0x38, 0x8b, 0xa8, 0x7c, 0x51, 0x16, 0xd1, 0xa7, 0x60,
0xda, 0xeb, 0xf9, 0x01, 0xe3, 0x79, 0xa6, 0xb5, 0xa3, 0xe6, 0xe4, 0x4a, 0x91, 0x79, 0xba, 0x02,
0xb8, 0xcf, 0x60, 0xe4, 0x0b, 0x09, 0x12, 0xed, 0xf6, 0x30, 0x23, 0x4d, 0x97, 0x02, 0x3b, 0xdd,
0x1e, 0xdd, 0x0b, 0x3a, 0x6e, 0x1c, 0x84, 0xea, 0x43, 0x06, 0x8b, 0x98, 0x4b, 0x1f, 0x05, 0x23,
0x66, 0xc3, 0xc8, 0x79, 0xf2, 0x98, 0x4c, 0x9d, 0x43, 0x0f, 0x70, 0xb6, 0xef, 0x94, 0x2a, 0xc5,
0x46, 0xc9, 0x7e, 0x1f, 0x6a, 0x5a, 0x43, 0x98, 0xb4, 0x24, 0xac, 0x04, 0xe1, 0xf2, 0x95, 0xb8,
0x51, 0xee, 0xd3, 0xfe, 0x83, 0x2e, 0x79, 0x1d, 0xe6, 0xba, 0x5e, 0x48, 0x31, 0xff, 0xac, 0x1d,
0xd2, 0x53, 0x1a, 0x46, 0xd2, 0x39, 0x6e, 0xa8, 0x0a, 0x87, 0xc3, 0xed, 0xbb, 0x30, 0x6f, 0xac,
0xbe, 0x22, 0x4e, 0x99, 0xd3, 0x63, 0x65, 0x73, 0x7a, 0x64, 0x3e, 0x8f, 0xfd, 0x73, 0x05, 0x28,
0xee, 0x06, 0x43, 0xfd, 0x14, 0xc1, 0x32, 0x4f, 0x11, 0x84, 0x95, 0xd3, 0x56, 0x46, 0x8c, 0x50,
0x7e, 0x06, 0x90, 0xac, 0xc1, 0x8c, 0x3b, 0x88, 0xdb, 0x71, 0xc0, 0xac, 0xba, 0x33, 0x37, 0xec,
0x72, 0x8a, 0xc5, 0xc0, 0x52, 0xaa, 0x86, 0x2c, 0x40, 0x51, 0x99, 0x03, 0x88, 0xc0, 0x8a, 0xcc,
0xa5, 0xc0, 0xd3, 0xcc, 0x73, 0x11, 0x1c, 0x13, 0x25, 0xc6, 0x10, 0xe6, 0xf7, 0xdc, 0x9f, 0xe3,
0x42, 0x3d, 0xaf, 0x8a, 0x59, 0x5c, 0x8c, 0x46, 0x10, 0x4d, 0x84, 0x52, 0x65, 0x59, 0x0f, 0xfb,
0x56, 0xcc, 0xb3, 0xdd, 0x7f, 0xb4, 0xa0, 0x8c, 0x6b, 0xc3, 0x14, 0x14, 0xe7, 0x60, 0x75, 0x90,
0x80, 0x6b, 0x32, 0xed, 0xa4, 0xc1, 0xc4, 0x36, 0x32, 0x19, 0x0b, 0x6a, 0x42, 0x7a, 0x36, 0xe3,
0x0a, 0x54, 0x79, 0x49, 0x65, 0xed, 0x21, 0x4a, 0x02, 0x24, 0x57, 0xa1, 0x74, 0x12, 0x0c, 0xa5,
0x45, 0x0d, 0xf2, 0x4c, 0x2e, 0x18, 0x3a, 0x08, 0x4f, 0xc6, 0xc3, 0xda, 0xe3, 0xd3, 0xe2, 0x76,
0x52, 0x1a, 0xcc, 0x2c, 0x45, 0xd5, 0xac, 0xbe, 0x4c, 0x29, 0xa8, 0xbd, 0x06, 0xb3, 0x8c, 0xf6,
0xb5, 0xc0, 0xea, 0x58, 0x6e, 0xb5, 0xff, 0x9f, 0x05, 0x15, 0x89, 0x4c, 0x56, 0xa1, 0xc4, 0x18,
0x29, 0xe5, 0x9b, 0xaa, 0xb3, 0x78, 0x86, 0xe7, 0x20, 0x06, 0xb3, 0x17, 0x30, 0xde, 0x95, 0xb8,
0x42, 0x32, 0xda, 0x95, 0x58, 0xfa, 0x6a, 0xb8, 0x29, 0x03, 0x39, 0x05, 0xb5, 0xbf, 0x67, 0xc1,
0xb4, 0xd1, 0x07, 0x59, 0x81, 0x5a, 0xdf, 0x8d, 0x62, 0x71, 0xbe, 0x29, 0xb6, 0x47, 0x07, 0xe9,
0x1b, 0x5d, 0x30, 0xe3, 0xfb, 0x2a, 0x08, 0x5c, 0xd4, 0x83, 0xc0, 0xb7, 0xa0, 0x9a, 0xe4, 0x9b,
0x96, 0x0c, 0x09, 0xc0, 0x7a, 0x94, 0x59, 0x06, 0x09, 0x12, 0xc6, 0x15, 0x83, 0x7e, 0x10, 0x8a,
0xc3, 0x30, 0x5e, 0xb0, 0xef, 0x42, 0x4d, 0xc3, 0xd7, 0xc3, 0x8c, 0x96, 0x11, 0x66, 0x54, 0x29,
0x38, 0x85, 0x24, 0x05, 0xc7, 0xfe, 0x67, 0x0b, 0xa6, 0x19, 0x0d, 0x7a, 0x7e, 0xef, 0x20, 0xe8,
0x7b, 0x9d, 0x73, 0xdc, 0x7b, 0x49, 0x6e, 0x42, 0x30, 0x4a, 0x5a, 0x34, 0xc1, 0x8c, 0xea, 0x65,
0x70, 0x43, 0xb0, 0xa8, 0x2a, 0x33, 0x1e, 0x66, 0x1c, 0x70, 0xe4, 0x46, 0x82, 0x2d, 0x84, 0x61,
0x66, 0x00, 0x19, 0xa7, 0x31, 0x00, 0x26, 0x54, 0x0d, 0xbc, 0x7e, 0xdf, 0xe3, 0xb8, 0xdc, 0x6c,
0xcf, 0xab, 0x62, 0x7d, 0x76, 0xbd, 0xc8, 0x3d, 0x4a, 0x0e, 0x78, 0x54, 0x19, 0x23, 0x30, 0xee,
0x33, 0x2d, 0x02, 0x33, 0x89, 0x72, 0xc5, 0x04, 0xda, 0x7f, 0x5a, 0x80, 0x9a, 0xb4, 0x02, 0xba,
0x3d, 0x2a, 0xce, 0x2c, 0x4d, 0xc1, 0xa8, 0x41, 0x64, 0xbd, 0xe1, 0x70, 0x69, 0x90, 0x34, 0x61,
0x14, 0xb3, 0x84, 0x71, 0x05, 0xaa, 0x8c, 0x40, 0xdf, 0x44, 0xcf, 0x4e, 0xa4, 0x70, 0x2b, 0x80,
0xac, 0xbd, 0x8d, 0xb5, 0xe5, 0xa4, 0x16, 0x01, 0x2f, 0x3c, 0xe1, 0xbc, 0x03, 0x75, 0xd1, 0x0c,
0xee, 0x1c, 0x4a, 0x9e, 0x84, 0x45, 0x8c, 0x5d, 0x75, 0x0c, 0x4c, 0xf9, 0xe5, 0x6d, 0xf9, 0x65,
0xe5, 0xa2, 0x2f, 0x25, 0xa6, 0x7d, 0x5f, 0x1d, 0x1c, 0xdf, 0x0f, 0xdd, 0xe1, 0x89, 0xe4, 0xe5,
0x5b, 0x30, 0xef, 0xf9, 0x9d, 0xfe, 0xa8, 0x4b, 0xdb, 0x23, 0xdf, 0xf5, 0xfd, 0x60, 0xe4, 0x77,
0xa8, 0xcc, 0xc1, 0xc9, 0xab, 0xb2, 0xbb, 0x2a, 0x63, 0x13, 0x1b, 0x22, 0x6b, 0x50, 0xe6, 0x0a,
0x93, 0xeb, 0x8e, 0x7c, 0x46, 0xe7, 0x28, 0x64, 0x15, 0xca, 0x5c, 0x6f, 0x16, 0x0c, 0xae, 0xd1,
0x76, 0xd5, 0xe1, 0x08, 0x4c, 0xec, 0x60, 0xd2, 0xae, 0x29, 0x76, 0x4c, 0xbd, 0x33, 0xd9, 0xc1,
0xb4, 0x5e, 0x7b, 0x01, 0xc8, 0x3e, 0xe7, 0x14, 0xfd, 0xf8, 0xe7, 0x07, 0x45, 0xa8, 0x69, 0x60,
0x26, 0x41, 0x7a, 0x6c, 0xc0, 0xed, 0xae, 0xe7, 0x0e, 0x68, 0x4c, 0x43, 0xc1, 0x1d, 0x29, 0x28,
0xc3, 0x73, 0x4f, 0x7b, 0xed, 0x60, 0x14, 0xb7, 0xbb, 0xb4, 0x17, 0x52, 0xae, 0x4d, 0x99, 0x6a,
0x32, 0xa0, 0x0c, 0x8f, 0xd1, 0xa7, 0x86, 0xc7, 0x29, 0x28, 0x05, 0x95, 0x87, 0x39, 0x7c, 0x8d,
0x4a, 0xc9, 0x61, 0x0e, 0x5f, 0x91, 0xb4, 0xec, 0x2b, 0xe7, 0xc8, 0xbe, 0xb7, 0x60, 0x89, 0x4b,
0x39, 0x21, 0x0f, 0xda, 0x29, 0xc2, 0x1a, 0x53, 0x4b, 0xd6, 0xa0, 0xc1, 0xc6, 0x2c, 0x59, 0x22,
0xf2, 0xbe, 0xc9, 0x03, 0xa3, 0x96, 0x93, 0x81, 0x33, 0x5c, 0x8c, 0x50, 0xea, 0xb8, 0xfc, 0x44,
0x3d, 0x03, 0x47, 0x5c, 0xf7, 0x99, 0x89, 0x5b, 0x15, 0xb8, 0x29, 0x38, 0xb9, 0x03, 0xcb, 0x03,
0xda, 0xf5, 0x5c, 0xb3, 0x09, 0x0c, 0xf2, 0xf2, 0xb4, 0x99, 0x71, 0xd5, 0xf6, 0x34, 0xd4, 0x0e,
0xe3, 0x60, 0x28, 0xb7, 0x73, 0x06, 0xea, 0xbc, 0x28, 0xb2, 0xa8, 0x2e, 0xc3, 0x25, 0xa4, 0xbf,
0x47, 0xc1, 0x30, 0xe8, 0x07, 0xbd, 0x73, 0xc3, 0xaf, 0xfa, 0x0b, 0x0b, 0xe6, 0x8d, 0xda, 0xc4,
0xb1, 0xc2, 0x90, 0x8c, 0x4c, 0x7f, 0xe1, 0x24, 0x3b, 0xa7, 0x09, 0x6f, 0x8e, 0xc8, 0xa3, 0xdf,
0x8f, 0x45, 0x46, 0xcc, 0x46, 0x72, 0x33, 0x46, 0x7e, 0xc8, 0xe9, 0xb7, 0x99, 0xa5, 0x5f, 0xf1,
0xbd, 0xbc, 0x18, 0x23, 0x9b, 0xf8, 0x92, 0xc8, 0x69, 0xe0, 0x7e, 0x96, 0x8c, 0xc0, 0x29, 0xcf,
0x4c, 0xf7, 0xc3, 0xe5, 0x08, 0x3a, 0x0a, 0x18, 0xd9, 0xbf, 0x68, 0x01, 0x24, 0xa3, 0xc3, 0x93,
0x70, 0xa5, 0x80, 0xf8, 0x2d, 0x2c, 0x4d, 0xd9, 0xbc, 0x06, 0x75, 0x75, 0x98, 0x99, 0xe8, 0xb4,
0x9a, 0x84, 0x31, 0xb3, 0xfa, 0x06, 0xcc, 0xf6, 0xfa, 0xc1, 0x11, 0x1a, 0x04, 0x98, 0x96, 0x17,
0x89, 0x5c, 0xb2, 0x19, 0x0e, 0xbe, 0x27, 0xa0, 0x89, 0x02, 0x2c, 0x69, 0x0a, 0xd0, 0xfe, 0xa5,
0x82, 0x3a, 0x7b, 0x4a, 0xe6, 0x3c, 0x96, 0x3f, 0xc9, 0xed, 0x8c, 0x20, 0x1e, 0x73, 0xd4, 0x83,
0x66, 0xed, 0xc1, 0x85, 0xa1, 0xb0, 0xbb, 0x30, 0x13, 0x72, 0x49, 0x27, 0xc5, 0x60, 0xe9, 0x05,
0x62, 0x70, 0x3a, 0x34, 0xb4, 0xe4, 0x67, 0xa0, 0xe1, 0x76, 0x4f, 0x69, 0x18, 0x7b, 0x18, 0x8c,
0x40, 0x13, 0x85, 0x0b, 0xef, 0x59, 0x0d, 0x8e, 0x96, 0xc3, 0x0d, 0x98, 0x15, 0xf9, 0x7b, 0x0a,
0x53, 0xdc, 0x6c, 0x48, 0xc0, 0x0c, 0xd1, 0xfe, 0xae, 0x3c, 0xe6, 0x32, 0xf7, 0x70, 0xfc, 0x8a,
0xe8, 0xb3, 0x2b, 0xa4, 0x66, 0xf7, 0x29, 0x71, 0xe4, 0xd4, 0x95, 0x11, 0x8f, 0xa2, 0x96, 0xff,
0xd2, 0x15, 0x47, 0x84, 0xe6, 0x92, 0x96, 0x5e, 0x66, 0x49, 0xed, 0x1f, 0x59, 0x30, 0xb5, 0x1b,
0x0c, 0x77, 0x45, 0x26, 0x10, 0x32, 0x82, 0x4a, 0x9c, 0x95, 0xc5, 0x17, 0xe4, 0x08, 0xe5, 0x5a,
0x06, 0xd3, 0x69, 0xcb, 0xe0, 0x7f, 0xc2, 0x65, 0x8c, 0xb7, 0x85, 0xc1, 0x30, 0x08, 0x19, 0x33,
0xba, 0x7d, 0x6e, 0x06, 0x04, 0x7e, 0x7c, 0x22, 0x05, 0xe0, 0x8b, 0x50, 0xd0, 0x09, 0x66, 0xbe,
0x1d, 0x37, 0xea, 0x85, 0x25, 0xc3, 0xe5, 0x62, 0xb6, 0xc2, 0xfe, 0x22, 0x54, 0xd1, 0x14, 0xc7,
0x69, 0xbd, 0x01, 0xd5, 0x93, 0x60, 0xd8, 0x3e, 0xf1, 0xfc, 0x58, 0x32, 0xf7, 0x4c, 0x62, 0x23,
0xef, 0xe2, 0x82, 0x28, 0x04, 0xfb, 0xd7, 0x26, 0x61, 0xea, 0x81, 0x7f, 0x1a, 0x78, 0x1d, 0x3c,
0x52, 0x1b, 0xd0, 0x41, 0x20, 0xd3, 0x88, 0xd9, 0x7f, 0x72, 0x05, 0xa6, 0x30, 0x6f, 0x6e, 0xc8,
0x89, 0xb6, 0xce, 0x8f, 0xbe, 0x05, 0x88, 0x99, 0x17, 0x61, 0x72, 0xe1, 0x83, 0xb3, 0x8f, 0x06,
0x61, 0x4e, 0x4a, 0xa8, 0x5f, 0xd8, 0x10, 0xa5, 0x24, 0x4d, 0xbb, 0xac, 0xa5, 0x69, 0xb3, 0xbe,
0x44, 0xe6, 0x12, 0x4f, 0x6d, 0xe1, 0x7d, 0x09, 0x10, 0x3a, 0x56, 0x21, 0xe5, 0xf1, 0x52, 0x34,
0x56, 0xa6, 0x84, 0x63, 0xa5, 0x03, 0x99, 0x41, 0xc3, 0x3f, 0xe0, 0x38, 0x5c, 0x7c, 0xeb, 0x20,
0x66, 0x22, 0xa6, 0xef, 0xea, 0x54, 0x39, 0xed, 0xa7, 0xc0, 0x4c, 0xc6, 0x77, 0xa9, 0x12, 0xa8,
0x7c, 0x1e, 0xc0, 0x2f, 0xb5, 0xa4, 0xe1, 0x9a, 0x3b, 0xc6, 0x53, 0x1c, 0xa5, 0x3b, 0xc6, 0x08,
0xc6, 0xed, 0xf7, 0x8f, 0xdc, 0xce, 0x53, 0xbc, 0x8a, 0x85, 0x87, 0x5c, 0x55, 0xc7, 0x04, 0x62,
0xfe, 0x51, 0xb2, 0xab, 0x98, 0x24, 0x50, 0x72, 0x74, 0x10, 0xb9, 0x0d, 0x35, 0x74, 0x41, 0xc5,
0xbe, 0xce, 0xe0, 0xbe, 0x36, 0x74, 0x1f, 0x15, 0x77, 0x56, 0x47, 0xd2, 0x8f, 0xfb, 0x66, 0x33,
0x49, 0x87, 0x6e, 0xb7, 0x2b, 0x4e, 0x49, 0x1b, 0xdc, 0x9d, 0x56, 0x00, 0xa6, 0x8f, 0xc5, 0x82,
0x71, 0x84, 0x39, 0x44, 0x30, 0x60, 0xe4, 0x2a, 0x54, 0x98, 0x7b, 0x34, 0x74, 0xbd, 0x2e, 0x66,
0x2d, 0x72, 0x2f, 0x4d, 0xc1, 0x58, 0x1b, 0xf2, 0x3f, 0x2a, 0xba, 0x79, 0x5c, 0x15, 0x03, 0xc6,
0xd6, 0x46, 0x95, 0x91, 0x99, 0x16, 0xf8, 0x8e, 0x1a, 0x40, 0xf2, 0x26, 0x9e, 0x55, 0xc5, 0xb4,
0xb9, 0x88, 0xb1, 0xb0, 0xcb, 0x62, 0xce, 0x82, 0x68, 0xe5, 0xef, 0x21, 0x43, 0x71, 0x38, 0xa6,
0xbd, 0x01, 0x75, 0x1d, 0x4c, 0x2a, 0x50, 0x7a, 0x78, 0xb0, 0xb3, 0xdf, 0x98, 0x20, 0x35, 0x98,
0x3a, 0xdc, 0x79, 0xf4, 0x68, 0x6f, 0x67, 0xbb, 0x61, 0x91, 0x3a, 0x54, 0x54, 0xb2, 0x58, 0x81,
0x95, 0x36, 0xb6, 0xb6, 0x76, 0x0e, 0x1e, 0xed, 0x6c, 0x37, 0x8a, 0x76, 0x0c, 0x64, 0xa3, 0xdb,
0x15, 0xad, 0xa8, 0x20, 0x41, 0x42, 0xcf, 0x96, 0x41, 0xcf, 0x39, 0x34, 0x55, 0xc8, 0xa7, 0xa9,
0x17, 0xae, 0xbc, 0xbd, 0x03, 0xb5, 0x03, 0xed, 0x5e, 0x12, 0xb2, 0x97, 0xbc, 0x91, 0x24, 0xd8,
0x52, 0x83, 0x68, 0xc3, 0x29, 0xe8, 0xc3, 0xb1, 0x7f, 0xcf, 0xe2, 0xc9, 0xff, 0x6a, 0xf8, 0xbc,
0x6f, 0x1b, 0xea, 0x2a, 0x20, 0x95, 0xe4, 0x81, 0x1a, 0x30, 0x86, 0x83, 0x43, 0x69, 0x07, 0xc7,
0xc7, 0x11, 0x95, 0x59, 0x5b, 0x06, 0x8c, 0xf1, 0x05, 0xb3, 0xcd, 0x98, 0x9d, 0xe3, 0xf1, 0x1e,
0x22, 0x91, 0xbd, 0x95, 0x81, 0x33, 0x29, 0x2f, 0x02, 0x32, 0x32, 0x5f, 0x4d, 0x95, 0x55, 0xba,
0x6a, 0x7a, 0x95, 0xd7, 0xa0, 0xa2, 0xda, 0x35, 0x05, 0x98, 0xc4, 0x54, 0xf5, 0x4c, 0x50, 0xa2,
0xb7, 0x62, 0x0c, 0x9a, 0x0b, 0xed, 0x6c, 0x05, 0xb9, 0x09, 0xe4, 0xd8, 0x0b, 0xd3, 0xe8, 0x45,
0x44, 0xcf, 0xa9, 0xb1, 0x9f, 0xc0, 0xbc, 0x24, 0x24, 0xcd, 0xb4, 0x32, 0x37, 0xd1, 0xba, 0x88,
0x7d, 0x0a, 0x59, 0xf6, 0xb1, 0xff, 0xdd, 0x82, 0x29, 0xb1, 0xd3, 0x99, 0xbb, 0x6d, 0x7c, 0x9f,
0x0d, 0x18, 0x69, 0x1a, 0xf7, 0x5a, 0x90, 0xd7, 0x84, 0xd0, 0xcc, 0x88, 0xc5, 0x62, 0x9e, 0x58,
0x24, 0x50, 0x1a, 0xba, 0xf1, 0x09, 0x7a, 0xea, 0x55, 0x07, 0xff, 0x93, 0x06, 0x8f, 0x2b, 0x71,
0x11, 0x8c, 0x31, 0xa5, 0xbc, 0x5b, 0x7c, 0x5c, 0xdb, 0x67, 0x6f, 0xf1, 0x5d, 0x81, 0x2a, 0x0e,
0xa0, 0x9d, 0x84, 0x8d, 0x12, 0x00, 0xa3, 0x5c, 0x5e, 0x40, 0xbe, 0x16, 0x29, 0xe6, 0x09, 0xc4,
0x5e, 0xe4, 0x3b, 0x2f, 0x96, 0x40, 0x9d, 0x33, 0x8b, 0xf4, 0xe0, 0x04, 0x9c, 0x50, 0x84, 0x18,
0x40, 0x9a, 0x22, 0x04, 0xaa, 0xa3, 0xea, 0xed, 0x16, 0x34, 0xb7, 0x69, 0x9f, 0xc6, 0x74, 0xa3,
0xdf, 0x4f, 0xb7, 0x7f, 0x19, 0x2e, 0xe5, 0xd4, 0x09, 0x6b, 0xfa, 0x2b, 0xb0, 0xb8, 0xc1, 0x53,
0x29, 0x7f, 0x5a, 0x99, 0x3a, 0x76, 0x13, 0x96, 0xd2, 0x4d, 0x8a, 0xce, 0xee, 0xc1, 0xdc, 0x36,
0x3d, 0x1a, 0xf5, 0xf6, 0xe8, 0x69, 0xd2, 0x11, 0x81, 0x52, 0x74, 0x12, 0x9c, 0x09, 0xc6, 0xc4,
0xff, 0xe4, 0x15, 0x80, 0x3e, 0xc3, 0x69, 0x47, 0x43, 0xda, 0x91, 0x57, 0x49, 0x10, 0x72, 0x38,
0xa4, 0x1d, 0xfb, 0x2d, 0x20, 0x7a, 0x3b, 0x62, 0xbd, 0x98, 0x16, 0x1c, 0x1d, 0xb5, 0xa3, 0xf3,
0x28, 0xa6, 0x03, 0x79, 0x47, 0x46, 0x07, 0xd9, 0x37, 0xa0, 0x7e, 0xe0, 0x9e, 0x3b, 0xf4, 0x23,
0x71, 0xa5, 0x71, 0x19, 0xa6, 0x86, 0xee, 0x39, 0x13, 0x53, 0x2a, 0x9e, 0x85, 0xd5, 0xf6, 0xbf,
0x16, 0x60, 0x92, 0x63, 0xb2, 0x56, 0xbb, 0x34, 0x8a, 0x3d, 0x1f, 0x09, 0x4b, 0xb6, 0xaa, 0x81,
0x32, 0xa4, 0x5c, 0xc8, 0x21, 0x65, 0xe1, 0xed, 0xc9, 0xb4, 0x7c, 0x41, 0xaf, 0x06, 0x8c, 0x11,
0x57, 0x92, 0x32, 0xc7, 0x03, 0x2a, 0x09, 0x20, 0x15, 0xfa, 0x4c, 0x74, 0x2d, 0x1f, 0x9f, 0xe4,
0x52, 0x41, 0xb9, 0x3a, 0x28, 0x57, 0xa3, 0x4f, 0x71, 0x02, 0xcf, 0x68, 0xf4, 0x8c, 0xe6, 0xae,
0xbc, 0x84, 0xe6, 0xe6, 0x2e, 0xe0, 0x8b, 0x34, 0x37, 0xbc, 0x84, 0xe6, 0xb6, 0x09, 0x34, 0xf0,
0xbe, 0x1f, 0xb3, 0x0d, 0x25, 0xed, 0x7e, 0xdb, 0x82, 0x86, 0xa0, 0x22, 0x55, 0x47, 0x5e, 0x33,
0x6c, 0xe0, 0xdc, 0x84, 0xf7, 0x6b, 0x30, 0x8d, 0x96, 0xa9, 0x8a, 0xf1, 0x8a, 0x80, 0xb4, 0x01,
0x64, 0xf3, 0x90, 0x47, 0xc4, 0x03, 0xaf, 0x2f, 0x36, 0x45, 0x07, 0xc9, 0x30, 0x71, 0xe8, 0x8a,
0xd4, 0x31, 0xcb, 0x51, 0x65, 0xfb, 0xcf, 0x2c, 0x98, 0xd3, 0x06, 0x2c, 0xa8, 0xf0, 0x2e, 0x48,
0x6e, 0xe0, 0x01, 0x5f, 0xce, 0xb9, 0xcb, 0x26, 0xdb, 0x24, 0x9f, 0x19, 0xc8, 0xb8, 0x99, 0xee,
0x39, 0x0e, 0x30, 0x1a, 0x0d, 0x84, 0x10, 0xd5, 0x41, 0x8c, 0x90, 0xce, 0x28, 0x7d, 0xaa, 0x50,
0xb8, 0x18, 0x37, 0x60, 0x18, 0x55, 0x63, 0x16, 0xb5, 0x42, 0x2a, 0x89, 0xa8, 0x9a, 0x0e, 0xb4,
0xff, 0xda, 0x82, 0x79, 0xee, 0x1a, 0x09, 0xc7, 0x53, 0xdd, 0x6c, 0x9a, 0xe4, 0xbe, 0x20, 0xe7,
0xc8, 0xdd, 0x09, 0x47, 0x94, 0xc9, 0xe7, 0x5f, 0xd2, 0x9d, 0x53, 0xf9, 0x6c, 0x63, 0xf6, 0xa2,
0x98, 0xb7, 0x17, 0x2f, 0x58, 0xe9, 0xbc, 0x00, 0x67, 0x39, 0x37, 0xc0, 0xb9, 0x39, 0x05, 0xe5,
0xa8, 0x13, 0x0c, 0xa9, 0xbd, 0x04, 0x0b, 0xe6, 0xe4, 0x84, 0x08, 0xfa, 0x8e, 0x05, 0xcd, 0x7b,
0xfc, 0x20, 0xc0, 0xf3, 0x7b, 0xbb, 0x5e, 0x14, 0x07, 0xa1, 0xba, 0x00, 0x7a, 0x15, 0x20, 0x8a,
0xdd, 0x30, 0xe6, 0xa9, 0xd2, 0x22, 0xb0, 0x98, 0x40, 0xd8, 0x18, 0xa9, 0xdf, 0xe5, 0xb5, 0x7c,
0x6f, 0x54, 0x39, 0x63, 0x43, 0x08, 0xe7, 0xcd, 0xd0, 0xc4, 0xd7, 0x79, 0x7e, 0x27, 0xb3, 0x15,
0xe8, 0x29, 0xca, 0x75, 0xee, 0x15, 0xa5, 0xa0, 0xf6, 0x5f, 0x59, 0x30, 0x9b, 0x0c, 0x12, 0x4f,
0x3e, 0x4d, 0xe9, 0x20, 0xd4, 0x6f, 0x22, 0x1d, 0x64, 0xc8, 0xd3, 0x63, 0xfa, 0x58, 0x8c, 0x4d,
0x83, 0x20, 0xc7, 0x8a, 0x52, 0x30, 0x92, 0x06, 0x8e, 0x0e, 0xe2, 0xd9, 0x5a, 0xcc, 0x12, 0x10,
0x56, 0x8d, 0x28, 0x61, 0xa6, 0xfb, 0x20, 0xc6, 0xaf, 0x78, 0x70, 0x56, 0x16, 0xa5, 0x2a, 0x9d,
0x42, 0x28, 0xaa, 0x52, 0xfd, 0x50, 0xa5, 0xc2, 0xd7, 0x47, 0x96, 0xed, 0x5f, 0xb6, 0xe0, 0x52,
0xce, 0xc2, 0x0b, 0xae, 0xd9, 0x86, 0xb9, 0x63, 0x55, 0x29, 0x17, 0x87, 0xb3, 0xce, 0x92, 0x3c,
0xba, 0x33, 0x17, 0xc4, 0xc9, 0x7e, 0xa0, 0xec, 0x22, 0xbe, 0xdc, 0x46, 0x3e, 0x64, 0xb6, 0xc2,
0x3e, 0x80, 0xd6, 0xce, 0x33, 0xc6, 0x84, 0x5b, 0xfa, 0x5b, 0x26, 0x92, 0x16, 0x6e, 0x67, 0x84,
0xcc, 0xc5, 0x8e, 0xf6, 0x31, 0x4c, 0x1b, 0x6d, 0x91, 0xcf, 0xbe, 0x6c, 0x23, 0xa9, 0xf0, 0x34,
0x96, 0xf8, 0x63, 0x2c, 0x32, 0x2b, 0x53, 0x03, 0xd9, 0xa7, 0x30, 0xfb, 0xde, 0xa8, 0x1f, 0x7b,
0xc9, 0xc3, 0x2c, 0xe4, 0xf3, 0xe2, 0x23, 0x6c, 0x42, 0x2e, 0x5d, 0x6e, 0x57, 0x3a, 0x1e, 0x5b,
0xb1, 0x01, 0x6b, 0xa9, 0x9d, 0xed, 0x31, 0x5b, 0x61, 0x5f, 0x82, 0xe5, 0xa4, 0x4b, 0xbe, 0x76,
0x52, 0x50, 0x7f, 0xd7, 0xe2, 0x09, 0x0d, 0xe6, 0x3b, 0x31, 0xe4, 0x3e, 0xcc, 0x47, 0x9e, 0xdf,
0xeb, 0x53, 0xbd, 0x9d, 0x48, 0xac, 0xc4, 0xa2, 0x39, 0x3c, 0xf1, 0x96, 0x8c, 0x93, 0xf7, 0x05,
0x23, 0x90, 0xfc, 0x81, 0x26, 0x04, 0x92, 0x5a, 0x92, 0xbc, 0x09, 0xbc, 0x03, 0x33, 0x66, 0x67,
0xe4, 0x8e, 0x48, 0xa8, 0x4c, 0x46, 0xa6, 0xc7, 0xb2, 0x4d, 0xca, 0x30, 0x30, 0xed, 0x6f, 0x59,
0xd0, 0x74, 0x28, 0x23, 0x63, 0xaa, 0x75, 0x2a, 0xa8, 0xe7, 0x6e, 0xa6, 0xd9, 0xf1, 0x13, 0x56,
0x89, 0x9a, 0x72, 0xae, 0x37, 0xc7, 0x6e, 0xca, 0xee, 0x44, 0xce, 0xac, 0x36, 0x2b, 0x30, 0x29,
0xe6, 0xb7, 0x0c, 0x8b, 0x62, 0x48, 0x72, 0x38, 0x49, 0xd0, 0xd4, 0xe8, 0xd4, 0x08, 0x9a, 0xb6,
0xa0, 0xc9, 0x6f, 0xe6, 0xea, 0xf3, 0xe0, 0x1f, 0xae, 0x3d, 0x87, 0x9a, 0x76, 0x3f, 0x99, 0x2c,
0xc3, 0xfc, 0x93, 0x07, 0x8f, 0xf6, 0x77, 0x0e, 0x0f, 0xdb, 0x07, 0x8f, 0x37, 0xdf, 0xdd, 0x79,
0xbf, 0xbd, 0xbb, 0x71, 0xb8, 0xdb, 0x98, 0x20, 0x4b, 0x40, 0xf6, 0x77, 0x0e, 0x1f, 0xed, 0x6c,
0x1b, 0x70, 0x8b, 0x5c, 0x85, 0xd6, 0xe3, 0xfd, 0xc7, 0x87, 0x3b, 0xdb, 0xed, 0xbc, 0xef, 0x0a,
0xe4, 0x15, 0xb8, 0x24, 0xea, 0x73, 0x3e, 0x2f, 0xde, 0xfe, 0x56, 0x11, 0x66, 0x78, 0x5e, 0x05,
0x7f, 0x5e, 0x88, 0x86, 0xe4, 0x3d, 0x98, 0x12, 0xef, 0x54, 0x11, 0xb9, 0x9e, 0xe6, 0xcb, 0x58,
0xad, 0xa5, 0x34, 0x58, 0x2c, 0xc2, 0xfc, 0xff, 0xff, 0xd1, 0x3f, 0xfc, 0x6a, 0x61, 0x9a, 0xd4,
0xd6, 0x4f, 0xdf, 0x5c, 0xef, 0x51, 0x3f, 0x62, 0x6d, 0x7c, 0x1d, 0x20, 0x79, 0x7d, 0x89, 0x34,
0x95, 0xcf, 0x95, 0x7a, 0x9a, 0xaa, 0x75, 0x29, 0xa7, 0x46, 0xb4, 0x7b, 0x09, 0xdb, 0x9d, 0xb7,
0x67, 0x58, 0xbb, 0x9e, 0xef, 0xc5, 0xfc, 0x25, 0xa6, 0xb7, 0xad, 0x35, 0xd2, 0x85, 0xba, 0xfe,
0x2e, 0x12, 0x91, 0x81, 0xdf, 0x9c, 0x97, 0x9d, 0x5a, 0x97, 0x73, 0xeb, 0xe4, 0x06, 0x62, 0x1f,
0x8b, 0x76, 0x83, 0xf5, 0x31, 0x42, 0x8c, 0xa4, 0x97, 0x3e, 0x27, 0xeb, 0xe4, 0xf9, 0x23, 0x72,
0x45, 0xa3, 0xb4, 0xcc, 0xe3, 0x4b, 0xad, 0x57, 0xc6, 0xd4, 0x8a, 0xbe, 0x5e, 0xc1, 0xbe, 0x96,
0x6d, 0xc2, 0xfa, 0xea, 0x20, 0x8e, 0x7c, 0x7c, 0xe9, 0x6d, 0x6b, 0xed, 0xf6, 0xaf, 0x5f, 0x87,
0xaa, 0x3a, 0xe4, 0x21, 0x1f, 0xc2, 0xb4, 0x91, 0xf8, 0x42, 0xe4, 0x34, 0xf2, 0xf2, 0x64, 0x5a,
0x57, 0xf2, 0x2b, 0x45, 0xc7, 0x57, 0xb1, 0xe3, 0x26, 0x59, 0x62, 0x1d, 0x8b, 0xcc, 0x91, 0x75,
0x4c, 0xe1, 0xe2, 0xf7, 0x31, 0x9e, 0x6a, 0xec, 0xcb, 0x3b, 0xbb, 0x92, 0xe6, 0x28, 0xa3, 0xb7,
0x57, 0xc6, 0xd4, 0x8a, 0xee, 0xae, 0x60, 0x77, 0x4b, 0x64, 0x41, 0xef, 0x4e, 0x1d, 0xbe, 0x50,
0xbc, 0x44, 0xa4, 0xbf, 0x1c, 0x44, 0x5e, 0x51, 0x84, 0x95, 0xf7, 0xa2, 0x90, 0x22, 0x91, 0xec,
0xb3, 0x42, 0x76, 0x13, 0xbb, 0x22, 0x04, 0xb7, 0x4f, 0x7f, 0x38, 0x88, 0x1c, 0x41, 0x4d, 0x7b,
0xed, 0x82, 0x5c, 0x1a, 0xfb, 0x32, 0x47, 0xab, 0x95, 0x57, 0x95, 0x37, 0x15, 0xbd, 0xfd, 0x75,
0xa6, 0x97, 0xbf, 0x06, 0x55, 0xf5, 0x7e, 0x02, 0x59, 0xd6, 0xde, 0xb3, 0xd0, 0xdf, 0x7b, 0x68,
0x35, 0xb3, 0x15, 0x79, 0xc4, 0xa7, 0xb7, 0xce, 0x88, 0xef, 0x09, 0xd4, 0xb4, 0x37, 0x12, 0xd4,
0x04, 0xb2, 0xef, 0x30, 0xa8, 0x09, 0xe4, 0x3c, 0xa9, 0x60, 0xcf, 0x61, 0x17, 0x35, 0x52, 0x45,
0xfa, 0x8e, 0x9f, 0x05, 0x11, 0xd9, 0x83, 0x45, 0x21, 0xa6, 0x8e, 0xe8, 0x27, 0xd9, 0x86, 0x9c,
0xc7, 0x9a, 0x6e, 0x59, 0xe4, 0x2e, 0x54, 0xe4, 0x53, 0x18, 0x64, 0x29, 0xff, 0x49, 0x8f, 0xd6,
0x72, 0x06, 0x2e, 0xcc, 0x93, 0xf7, 0x01, 0x92, 0x07, 0x19, 0x94, 0x90, 0xc8, 0x3c, 0xf0, 0xa0,
0x28, 0x20, 0xfb, 0x7a, 0x83, 0xbd, 0x84, 0x13, 0x6c, 0x10, 0x14, 0x12, 0x3e, 0x3d, 0x93, 0xf7,
0x05, 0xbf, 0x01, 0x35, 0xed, 0x4d, 0x06, 0xb5, 0x7c, 0xd9, 0xf7, 0x1c, 0xd4, 0xf2, 0xe5, 0x3c,
0xe1, 0x60, 0xb7, 0xb0, 0xf5, 0x05, 0x7b, 0x96, 0xb5, 0x1e, 0x79, 0x3d, 0x7f, 0xc0, 0x11, 0xd8,
0x06, 0x9d, 0xc0, 0xb4, 0xf1, 0xf0, 0x82, 0xe2, 0xd0, 0xbc, 0x67, 0x1d, 0x14, 0x87, 0xe6, 0xbe,
0xd5, 0x20, 0xe9, 0xcc, 0x9e, 0x63, 0xfd, 0x9c, 0x22, 0x8a, 0xd6, 0xd3, 0x07, 0x50, 0xd3, 0x1e,
0x51, 0x50, 0x73, 0xc9, 0xbe, 0xd7, 0xa0, 0xe6, 0x92, 0xf7, 0xe6, 0xc2, 0x02, 0xf6, 0x31, 0x63,
0x23, 0x29, 0xe0, 0xcd, 0x37, 0xd6, 0xf6, 0x87, 0x30, 0x63, 0x3e, 0xab, 0xa0, 0x78, 0x3f, 0xf7,
0x81, 0x06, 0xc5, 0xfb, 0x63, 0xde, 0x62, 0x10, 0x24, 0xbd, 0x36, 0xaf, 0x3a, 0x59, 0xff, 0x58,
0x24, 0x7f, 0x3c, 0x27, 0x5f, 0x61, 0x02, 0x4e, 0x5c, 0x45, 0x24, 0xcb, 0x1a, 0xd5, 0xea, 0x17,
0x16, 0x15, 0xbf, 0x64, 0x6e, 0x2d, 0x9a, 0xc4, 0xcc, 0xef, 0xee, 0xa1, 0xd6, 0xc2, 0x2b, 0x89,
0x9a, 0xd6, 0xd2, 0x6f, 0x2d, 0x6a, 0x5a, 0xcb, 0xb8, 0xb9, 0x98, 0xd6, 0x5a, 0xb1, 0xc7, 0xda,
0xf0, 0x61, 0x36, 0x95, 0x9c, 0xab, 0xb8, 0x22, 0xff, 0x36, 0x43, 0xeb, 0xea, 0x8b, 0x73, 0x7a,
0x4d, 0x09, 0x22, 0x85, 0xe0, 0xba, 0xbc, 0x3b, 0xf2, 0xbf, 0xa1, 0xae, 0x5f, 0x61, 0x27, 0x3a,
0x2b, 0xa7, 0x7b, 0xba, 0x9c, 0x5b, 0x67, 0x6e, 0x2e, 0xa9, 0xeb, 0xdd, 0x90, 0xaf, 0xc2, 0x92,
0x62, 0x75, 0x3d, 0xdf, 0x33, 0x22, 0xaf, 0xe6, 0x64, 0x81, 0xea, 0xc6, 0x4b, 0xeb, 0xd2, 0xd8,
0x34, 0xd1, 0x5b, 0x16, 0x23, 0x1a, 0xf3, 0x6e, 0x70, 0xa2, 0x30, 0xf2, 0xae, 0x44, 0x27, 0x0a,
0x23, 0xf7, 0x42, 0xb1, 0x24, 0x1a, 0x32, 0x6f, 0xac, 0x11, 0x3f, 0x9f, 0x23, 0x1f, 0xc0, 0xac,
0x96, 0x51, 0x7f, 0x78, 0xee, 0x77, 0x14, 0x03, 0x64, 0xaf, 0x5e, 0xb5, 0xf2, 0x4c, 0x73, 0x7b,
0x19, 0xdb, 0x9f, 0xb3, 0x8d, 0xc5, 0x61, 0xc4, 0xbf, 0x05, 0x35, 0x3d, 0x5b, 0xff, 0x05, 0xed,
0x2e, 0x6b, 0x55, 0xfa, 0xcd, 0xa1, 0x5b, 0x16, 0xf9, 0x4d, 0x0b, 0xea, 0x46, 0xee, 0xbb, 0x71,
0x0a, 0x9d, 0x6a, 0xa7, 0xa9, 0xd7, 0xe9, 0x0d, 0xd9, 0x0e, 0x0e, 0x72, 0x6f, 0xed, 0x1d, 0x63,
0x11, 0x3e, 0x36, 0xe2, 0x2f, 0x37, 0xd3, 0xcf, 0x6f, 0x3d, 0x4f, 0x23, 0xe8, 0xd7, 0xd3, 0x9e,
0xdf, 0xb2, 0xc8, 0xf7, 0x2c, 0x98, 0x31, 0xa3, 0x86, 0x6a, 0xab, 0x72, 0xe3, 0x93, 0x6a, 0xab,
0xc6, 0x84, 0x1a, 0x3f, 0xc0, 0x51, 0x3e, 0x5a, 0x73, 0x8c, 0x51, 0x8a, 0x5b, 0xe3, 0x3f, 0xd9,
0x68, 0xc9, 0xdb, 0xfc, 0x85, 0x3e, 0x19, 0xca, 0x26, 0x9a, 0xd6, 0x48, 0x6f, 0xaf, 0xfe, 0xaa,
0xdc, 0xaa, 0x75, 0xcb, 0x22, 0xdf, 0xe0, 0xcf, 0x4e, 0x89, 0x6f, 0x91, 0x4a, 0x5e, 0xf6, 0x7b,
0xfb, 0x1a, 0xce, 0xe9, 0xaa, 0x7d, 0xc9, 0x98, 0x53, 0x5a, 0x1f, 0x6f, 0xf0, 0xd1, 0x89, 0x07,
0xe1, 0x12, 0x85, 0x92, 0x79, 0x24, 0x6e, 0xfc, 0x20, 0x07, 0x7c, 0x90, 0x02, 0xdd, 0x20, 0xe5,
0x97, 0x6c, 0xc6, 0x5e, 0xc3, 0xb1, 0x5e, 0xb3, 0x5f, 0x1d, 0x3b, 0xd6, 0x75, 0x8c, 0xfd, 0xb1,
0x11, 0x1f, 0x00, 0x24, 0xc7, 0x4e, 0x24, 0x75, 0xec, 0xa1, 0x18, 0x3c, 0x7b, 0x32, 0x65, 0xf2,
0x8b, 0x3c, 0x1d, 0x61, 0x2d, 0x7e, 0x8d, 0x8b, 0xab, 0x07, 0xf2, 0xc0, 0x44, 0x37, 0x4a, 0xcc,
0xf3, 0x21, 0xc3, 0x28, 0x49, 0xb7, 0x6f, 0x08, 0x2b, 0x75, 0xfa, 0xf2, 0x18, 0xa6, 0xf7, 0x82,
0xe0, 0xe9, 0x68, 0xa8, 0x8e, 0x90, 0xcd, 0xb0, 0xfc, 0xae, 0x1b, 0x9d, 0xb4, 0x52, 0xb3, 0xb0,
0x57, 0xb0, 0xa9, 0x16, 0x69, 0x6a, 0x4d, 0xad, 0x7f, 0x9c, 0x1c, 0x6b, 0x3d, 0x27, 0x2e, 0xcc,
0x29, 0x19, 0xa8, 0x06, 0xde, 0x32, 0x9b, 0x31, 0x24, 0x5f, 0xba, 0x0b, 0xc3, 0x7a, 0x96, 0xa3,
0x5d, 0x8f, 0x64, 0x9b, 0xb7, 0x2c, 0x72, 0x00, 0xf5, 0x6d, 0xda, 0x09, 0xba, 0x54, 0xc4, 0xb6,
0xe7, 0x93, 0x81, 0xab, 0xa0, 0x78, 0x6b, 0xda, 0x00, 0x9a, 0x7a, 0x61, 0xe8, 0x9e, 0x87, 0xf4,
0xa3, 0xf5, 0x8f, 0x45, 0xd4, 0xfc, 0xb9, 0xd4, 0x0b, 0xf2, 0x58, 0xc1, 0xd0, 0x0b, 0xa9, 0x73,
0x08, 0x43, 0x2f, 0x64, 0xce, 0x21, 0x8c, 0xa5, 0x96, 0xc7, 0x1a, 0xa4, 0x0f, 0x73, 0x99, 0xa3,
0x0b, 0xa5, 0x12, 0xc6, 0x1d, 0x78, 0xb4, 0x56, 0xc6, 0x23, 0x98, 0xbd, 0xad, 0x99, 0xbd, 0x1d,
0xc2, 0xf4, 0x36, 0xe5, 0x8b, 0xc5, 0x33, 0xdc, 0x52, 0x17, 0x28, 0xf4, 0xfc, 0xb9, 0xb4, 0x00,
0xc7, 0x3a, 0x53, 0xf1, 0x63, 0x7a, 0x19, 0xf9, 0x1a, 0xd4, 0xee, 0xd3, 0x58, 0xa6, 0xb4, 0x29,
0xd3, 0x33, 0x95, 0xe3, 0xd6, 0xca, 0xc9, 0x88, 0x33, 0x69, 0x06, 0x5b, 0x5b, 0xa7, 0xdd, 0x1e,
0xe5, 0xc2, 0xa9, 0xed, 0x75, 0x9f, 0x93, 0xff, 0x85, 0x8d, 0xab, 0xcc, 0xdb, 0x25, 0x2d, 0x9f,
0x49, 0x6f, 0x7c, 0x36, 0x05, 0xcf, 0x6b, 0xd9, 0x0f, 0xba, 0x54, 0x33, 0x81, 0x7c, 0xa8, 0x69,
0x09, 0xe3, 0x8a, 0x81, 0xb2, 0x29, 0xfc, 0x8a, 0x81, 0x72, 0xf2, 0xcb, 0xed, 0x55, 0xec, 0xc7,
0x26, 0x2b, 0x49, 0x3f, 0x3c, 0xa7, 0x3c, 0xe9, 0x69, 0xfd, 0x63, 0x77, 0x10, 0x3f, 0x27, 0x4f,
0xf0, 0x15, 0x07, 0x3d, 0x6d, 0x2f, 0xb1, 0xa5, 0xd3, 0x19, 0x7e, 0x6a, 0xb1, 0xb4, 0x2a, 0xd3,
0xbe, 0xe6, 0x5d, 0xa1, 0xa5, 0xf4, 0x79, 0x80, 0xc3, 0x38, 0x18, 0x6e, 0xbb, 0x74, 0x10, 0xf8,
0x89, 0xac, 0x4d, 0x12, 0xcc, 0x12, 0xf9, 0xa5, 0x65, 0x99, 0x91, 0x27, 0x9a, 0xf3, 0x61, 0x64,
0x3d, 0x4a, 0xe2, 0x1a, 0x9b, 0x83, 0xa6, 0x16, 0x24, 0x27, 0x0f, 0xed, 0x96, 0x45, 0x36, 0x00,
0x92, 0xb3, 0x2b, 0xe5, 0x4a, 0x64, 0x8e, 0xc5, 0x94, 0xd8, 0xcb, 0x39, 0xe8, 0x3a, 0x80, 0x6a,
0x72, 0x18, 0xb2, 0x9c, 0xdc, 0x6c, 0x30, 0x8e, 0x4e, 0x94, 0x06, 0xcf, 0x1c, 0x51, 0xd8, 0x0d,
0x5c, 0x2a, 0x20, 0x15, 0xb6, 0x54, 0x78, 0xee, 0xe0, 0xc1, 0x3c, 0x1f, 0xa0, 0x32, 0x47, 0x30,
0x65, 0x4a, 0xce, 0x24, 0xe7, 0x98, 0x40, 0x71, 0x73, 0x6e, 0x94, 0xdd, 0x88, 0x88, 0x30, 0x6a,
0xe5, 0xe9, 0x5a, 0x4c, 0x34, 0x0f, 0x60, 0x2e, 0x13, 0x06, 0x56, 0x2c, 0x3d, 0x2e, 0x32, 0xaf,
0x58, 0x7a, 0x6c, 0x04, 0xd9, 0x5e, 0xc4, 0x2e, 0x67, 0x6d, 0x40, 0x0f, 0xe8, 0xcc, 0x8b, 0x3b,
0x27, 0xac, 0xbb, 0xef, 0x5a, 0x30, 0x9f, 0x13, 0xe5, 0x25, 0xaf, 0x49, 0x67, 0x7a, 0x6c, 0x04,
0xb8, 0x95, 0x1b, 0x04, 0xb4, 0x0f, 0xb1, 0x9f, 0xf7, 0xc8, 0xbb, 0x86, 0x62, 0xe3, 0xf1, 0x37,
0xc1, 0x99, 0x2f, 0x34, 0x2a, 0x72, 0x2d, 0x8a, 0x8f, 0x60, 0x99, 0x0f, 0x64, 0xa3, 0xdf, 0x4f,
0x05, 0x28, 0xaf, 0x66, 0x1e, 0xe1, 0x36, 0x02, 0xaf, 0xad, 0xf1, 0x8f, 0x74, 0x8f, 0x31, 0x57,
0xf9, 0x50, 0xc9, 0x08, 0x1a, 0xe9, 0xa0, 0x1f, 0x19, 0xdf, 0x56, 0xeb, 0x55, 0xc3, 0x2d, 0xcc,
0x06, 0x0a, 0xed, 0x4f, 0x63, 0x67, 0xaf, 0xda, 0xad, 0xbc, 0x75, 0xe1, 0x9e, 0x22, 0xdb, 0x8f,
0xff, 0xab, 0x22, 0x94, 0xa9, 0x79, 0xca, 0x0e, 0xc6, 0x85, 0x54, 0x95, 0x63, 0x9a, 0x1f, 0xe0,
0xbc, 0x8e, 0xdd, 0xaf, 0xd8, 0x97, 0xf3, 0xba, 0x0f, 0xf9, 0x27, 0xdc, 0x45, 0x5d, 0x4e, 0xf3,
0xb5, 0x1c, 0xc1, 0x4a, 0xde, 0x7e, 0x8f, 0xf5, 0x35, 0x52, 0x6b, 0x3d, 0x71, 0xcb, 0xda, 0xbc,
0xf1, 0xc1, 0xa7, 0x7b, 0x5e, 0x7c, 0x32, 0x3a, 0xba, 0xd9, 0x09, 0x06, 0xeb, 0x7d, 0x19, 0x22,
0x13, 0xe9, 0xb9, 0xeb, 0x7d, 0xbf, 0xbb, 0x8e, 0xdf, 0x1f, 0x4d, 0xe2, 0x9b, 0xfe, 0x9f, 0xfd,
0x8f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x9b, 0xd8, 0x05, 0xe4, 0x05, 0x60, 0x00, 0x00,
}

View File

@ -1606,11 +1606,7 @@ message QueryRoutesRequest {
/// The amount to send expressed in satoshis
int64 amt = 2;
/**
Deprecated. The max number of routes to return. In the future, QueryRoutes
will only return a single route.
*/
int32 num_routes = 3 [deprecated = true];
reserved 3;
/// An optional CLTV delta from the current height that should be used for the timelock of the final hop
int32 final_cltv_delta = 4;

View File

@ -673,14 +673,6 @@
"type": "string",
"format": "int64"
},
{
"name": "num_routes",
"description": "*\nDeprecated. The max number of routes to return. In the future, QueryRoutes\nwill only return a single route.",
"in": "query",
"required": false,
"type": "integer",
"format": "int32"
},
{
"name": "final_cltv_delta",
"description": "/ An optional CLTV delta from the current height that should be used for the timelock of the final hop.",

View File

@ -616,180 +616,3 @@ func findPath(g *graphParams, r *RestrictParams, source, target route.Vertex,
return pathEdges, nil
}
// findPaths implements a k-shortest paths algorithm to find all the reachable
// paths between the passed source and target. The algorithm will continue to
// traverse the graph until all possible candidate paths have been depleted.
// This function implements a modified version of Yen's. To find each path
// itself, we utilize our modified version of Dijkstra's found above. When
// examining possible spur and root paths, rather than removing edges or
// Vertexes from the graph, we instead utilize a Vertex+edge black-list that
// will be ignored by our modified Dijkstra's algorithm. With this approach, we
// make our inner path finding algorithm aware of our k-shortest paths
// algorithm, rather than attempting to use an unmodified path finding
// algorithm in a block box manner.
func findPaths(tx *bbolt.Tx, graph *channeldb.ChannelGraph,
source, target route.Vertex, amt lnwire.MilliSatoshi,
restrictions *RestrictParams, numPaths uint32,
bandwidthHints map[uint64]lnwire.MilliSatoshi) (
[][]*channeldb.ChannelEdgePolicy, error) {
// TODO(roasbeef): modifying ordering within heap to eliminate final
// sorting step?
var (
shortestPaths [][]*channeldb.ChannelEdgePolicy
candidatePaths pathHeap
)
// First we'll find a single shortest path from the source (our
// selfNode) to the target destination that's capable of carrying amt
// satoshis along the path before fees are calculated.
startingPath, err := findPath(
&graphParams{
tx: tx,
graph: graph,
bandwidthHints: bandwidthHints,
},
restrictions, source, target, amt,
)
if err != nil {
log.Errorf("Unable to find path: %v", err)
return nil, err
}
// Manually insert a "self" edge emanating from ourselves. This
// self-edge is required in order for the path finding algorithm to
// function properly.
firstPath := make([]*channeldb.ChannelEdgePolicy, 0, len(startingPath)+1)
firstPath = append(firstPath, &channeldb.ChannelEdgePolicy{
Node: &channeldb.LightningNode{PubKeyBytes: source},
})
firstPath = append(firstPath, startingPath...)
shortestPaths = append(shortestPaths, firstPath)
// While we still have candidate paths to explore we'll keep exploring
// the sub-graphs created to find the next k-th shortest path.
for k := uint32(1); k < numPaths; k++ {
prevShortest := shortestPaths[k-1]
// We'll examine each edge in the previous iteration's shortest
// path in order to find path deviations from each node in the
// path.
for i := 0; i < len(prevShortest)-1; i++ {
// These two maps will mark the edges and Vertexes
// we'll exclude from the next path finding attempt.
// These are required to ensure the paths are unique
// and loopless.
ignoredEdges := make(map[EdgeLocator]struct{})
ignoredVertexes := make(map[route.Vertex]struct{})
for e := range restrictions.IgnoredEdges {
ignoredEdges[e] = struct{}{}
}
for n := range restrictions.IgnoredNodes {
ignoredVertexes[n] = struct{}{}
}
// Our spur node is the i-th node in the prior shortest
// path, and our root path will be all nodes in the
// path leading up to our spurNode.
spurNode := prevShortest[i].Node
rootPath := prevShortest[:i+1]
// Before we kickoff our next path finding iteration,
// we'll find all the edges we need to ignore in this
// next round. This ensures that we create a new unique
// path.
for _, path := range shortestPaths {
// If our current rootPath is a prefix of this
// shortest path, then we'll remove the edge
// directly _after_ our spur node from the
// graph so we don't repeat paths.
if len(path) > i+1 &&
isSamePath(rootPath, path[:i+1]) {
locator := newEdgeLocator(path[i+1])
ignoredEdges[*locator] = struct{}{}
}
}
// Next we'll remove all entries in the root path that
// aren't the current spur node from the graph. This
// ensures we don't create a path with loops.
for _, hop := range rootPath {
node := hop.Node.PubKeyBytes
if node == spurNode.PubKeyBytes {
continue
}
ignoredVertexes[route.Vertex(node)] = struct{}{}
}
// With the edges that are part of our root path, and
// the Vertexes (other than the spur path) within the
// root path removed, we'll attempt to find another
// shortest path from the spur node to the destination.
//
// TODO: Fee limit passed to spur path finding isn't
// correct, because it doesn't take into account the
// fees already paid on the root path.
//
// TODO: Outgoing channel restriction isn't obeyed for
// spur paths.
spurRestrictions := &RestrictParams{
IgnoredEdges: ignoredEdges,
IgnoredNodes: ignoredVertexes,
FeeLimit: restrictions.FeeLimit,
}
spurPath, err := findPath(
&graphParams{
tx: tx,
graph: graph,
bandwidthHints: bandwidthHints,
},
spurRestrictions, spurNode.PubKeyBytes,
target, amt,
)
// If we weren't able to find a path, we'll continue to
// the next round.
if IsError(err, ErrNoPathFound) {
continue
} else if err != nil {
return nil, err
}
// Create the new combined path by concatenating the
// rootPath to the spurPath.
newPathLen := len(rootPath) + len(spurPath)
newPath := path{
hops: make([]*channeldb.ChannelEdgePolicy, 0, newPathLen),
dist: newPathLen,
}
newPath.hops = append(newPath.hops, rootPath...)
newPath.hops = append(newPath.hops, spurPath...)
// TODO(roasbeef): add and consult path finger print
// We'll now add this newPath to the heap of candidate
// shortest paths.
heap.Push(&candidatePaths, newPath)
}
// If our min-heap of candidate paths is empty, then we can
// exit early.
if candidatePaths.Len() == 0 {
break
}
// To conclude this latest iteration, we'll take the shortest
// path in our set of candidate paths and add it to our
// shortestPaths list as the *next* shortest path.
nextShortestPath := heap.Pop(&candidatePaths).(path).hops
shortestPaths = append(shortestPaths, nextShortestPath)
}
return shortestPaths, nil
}

View File

@ -948,63 +948,6 @@ func TestPathFindingWithAdditionalEdges(t *testing.T) {
assertExpectedPath(t, graph.aliasMap, path, "songoku", "doge")
}
func TestKShortestPathFinding(t *testing.T) {
t.Parallel()
graph, err := parseTestGraph(basicGraphFilePath)
if err != nil {
t.Fatalf("unable to create graph: %v", err)
}
defer graph.cleanUp()
sourceNode, err := graph.graph.SourceNode()
if err != nil {
t.Fatalf("unable to fetch source node: %v", err)
}
// In this test we'd like to ensure that our algorithm to find the
// k-shortest paths from a given source node to any destination node
// works as expected.
// In our basic_graph.json, there exist two paths from roasbeef to luo
// ji. Our algorithm should properly find both paths, and also rank
// them in order of their total "distance".
paymentAmt := lnwire.NewMSatFromSatoshis(100)
target := graph.aliasMap["luoji"]
restrictions := &RestrictParams{
FeeLimit: noFeeLimit,
}
paths, err := findPaths(
nil, graph.graph, sourceNode.PubKeyBytes, target, paymentAmt,
restrictions, 100, nil,
)
if err != nil {
t.Fatalf("unable to find paths between roasbeef and "+
"luo ji: %v", err)
}
// The algorithm should have found two paths from roasbeef to luo ji.
if len(paths) != 2 {
t.Fatalf("two path shouldn't been found, instead %v were",
len(paths))
}
// Additionally, the total hop length of the first path returned should
// be _less_ than that of the second path returned.
if len(paths[0]) > len(paths[1]) {
t.Fatalf("paths found not ordered properly")
}
// The first route should be a direct route to luo ji.
assertExpectedPath(t, graph.aliasMap, paths[0], "roasbeef", "luoji")
// The second route should be a route to luo ji via satoshi.
assertExpectedPath(
t, graph.aliasMap, paths[1], "roasbeef", "satoshi", "luoji",
)
}
// TestNewRoute tests whether the construction of hop payloads by newRoute
// is executed correctly.
func TestNewRoute(t *testing.T) {
@ -1732,45 +1675,38 @@ func TestPathFindSpecExample(t *testing.T) {
// Query for a route of 4,999,999 mSAT to carol.
carol := ctx.aliases["C"]
const amt lnwire.MilliSatoshi = 4999999
routes, err := ctx.router.FindRoutes(
bobNode.PubKeyBytes, carol, amt, noRestrictions, 100,
route, err := ctx.router.FindRoute(
bobNode.PubKeyBytes, carol, amt, noRestrictions,
)
if err != nil {
t.Fatalf("unable to find route: %v", err)
}
// We should come back with _exactly_ two routes.
if len(routes) != 2 {
t.Fatalf("expected %v routes, instead have: %v", 2,
len(routes))
}
// Now we'll examine the first route returned for correctness.
// Now we'll examine the route returned for correctness.
//
// It should be sending the exact payment amount as there are no
// additional hops.
firstRoute := routes[0]
if firstRoute.TotalAmount != amt {
if route.TotalAmount != amt {
t.Fatalf("wrong total amount: got %v, expected %v",
firstRoute.TotalAmount, amt)
route.TotalAmount, amt)
}
if firstRoute.Hops[0].AmtToForward != amt {
if route.Hops[0].AmtToForward != amt {
t.Fatalf("wrong forward amount: got %v, expected %v",
firstRoute.Hops[0].AmtToForward, amt)
route.Hops[0].AmtToForward, amt)
}
fee := firstRoute.HopFee(0)
fee := route.HopFee(0)
if fee != 0 {
t.Fatalf("wrong hop fee: got %v, expected %v", fee, 0)
}
// The CLTV expiry should be the current height plus 9 (the expiry for
// the B -> C channel.
if firstRoute.TotalTimeLock !=
if route.TotalTimeLock !=
startingHeight+zpay32.DefaultFinalCLTVDelta {
t.Fatalf("wrong total time lock: got %v, expecting %v",
firstRoute.TotalTimeLock,
route.TotalTimeLock,
startingHeight+zpay32.DefaultFinalCLTVDelta)
}
@ -1798,48 +1734,38 @@ func TestPathFindSpecExample(t *testing.T) {
}
// We'll now request a route from A -> B -> C.
routes, err = ctx.router.FindRoutes(
source.PubKeyBytes, carol, amt, noRestrictions, 100,
route, err = ctx.router.FindRoute(
source.PubKeyBytes, carol, amt, noRestrictions,
)
if err != nil {
t.Fatalf("unable to find routes: %v", err)
}
// We should come back with _exactly_ two routes.
if len(routes) != 2 {
t.Fatalf("expected %v routes, instead have: %v", 2,
len(routes))
}
// Both routes should be two hops.
if len(routes[0].Hops) != 2 {
// The route should be two hops.
if len(route.Hops) != 2 {
t.Fatalf("route should be %v hops, is instead %v", 2,
len(routes[0].Hops))
}
if len(routes[1].Hops) != 2 {
t.Fatalf("route should be %v hops, is instead %v", 2,
len(routes[1].Hops))
len(route.Hops))
}
// The total amount should factor in a fee of 10199 and also use a CLTV
// delta total of 29 (20 + 9),
expectedAmt := lnwire.MilliSatoshi(5010198)
if routes[0].TotalAmount != expectedAmt {
if route.TotalAmount != expectedAmt {
t.Fatalf("wrong amount: got %v, expected %v",
routes[0].TotalAmount, expectedAmt)
route.TotalAmount, expectedAmt)
}
if routes[0].TotalTimeLock != startingHeight+29 {
if route.TotalTimeLock != startingHeight+29 {
t.Fatalf("wrong total time lock: got %v, expecting %v",
routes[0].TotalTimeLock, startingHeight+29)
route.TotalTimeLock, startingHeight+29)
}
// Ensure that the hops of the first route are properly crafted.
// Ensure that the hops of the route are properly crafted.
//
// After taking the fee, Bob should be forwarding the remainder which
// is the exact payment to Bob.
if routes[0].Hops[0].AmtToForward != amt {
if route.Hops[0].AmtToForward != amt {
t.Fatalf("wrong forward amount: got %v, expected %v",
routes[0].Hops[0].AmtToForward, amt)
route.Hops[0].AmtToForward, amt)
}
// We shouldn't pay any fee for the first, hop, but the fee for the
@ -1850,70 +1776,31 @@ func TestPathFindSpecExample(t *testing.T) {
//
// * 200 + 4999999 * 2000 / 1000000 = 10199
fee = routes[0].HopFee(0)
fee = route.HopFee(0)
if fee != 10199 {
t.Fatalf("wrong hop fee: got %v, expected %v", fee, 10199)
}
// While for the final hop, as there's no additional hop afterwards, we
// pay no fee.
fee = routes[0].HopFee(1)
fee = route.HopFee(1)
if fee != 0 {
t.Fatalf("wrong hop fee: got %v, expected %v", fee, 0)
}
// The outgoing CLTV value itself should be the current height plus 30
// to meet Carol's requirements.
if routes[0].Hops[0].OutgoingTimeLock !=
if route.Hops[0].OutgoingTimeLock !=
startingHeight+zpay32.DefaultFinalCLTVDelta {
t.Fatalf("wrong total time lock: got %v, expecting %v",
routes[0].Hops[0].OutgoingTimeLock,
route.Hops[0].OutgoingTimeLock,
startingHeight+zpay32.DefaultFinalCLTVDelta)
}
// For B -> C, we assert that the final hop also has the proper
// parameters.
lastHop := routes[0].Hops[1]
if lastHop.AmtToForward != amt {
t.Fatalf("wrong forward amount: got %v, expected %v",
lastHop.AmtToForward, amt)
}
if lastHop.OutgoingTimeLock !=
startingHeight+zpay32.DefaultFinalCLTVDelta {
t.Fatalf("wrong total time lock: got %v, expecting %v",
lastHop.OutgoingTimeLock,
startingHeight+zpay32.DefaultFinalCLTVDelta)
}
// We'll also make similar assertions for the second route from A to C
// via D.
secondRoute := routes[1]
expectedAmt = 5020398
if secondRoute.TotalAmount != expectedAmt {
t.Fatalf("wrong amount: got %v, expected %v",
secondRoute.TotalAmount, expectedAmt)
}
expectedTimeLock := startingHeight + daveFinalCLTV + zpay32.DefaultFinalCLTVDelta
if secondRoute.TotalTimeLock != uint32(expectedTimeLock) {
t.Fatalf("wrong total time lock: got %v, expecting %v",
secondRoute.TotalTimeLock, expectedTimeLock)
}
onionPayload := secondRoute.Hops[0]
if onionPayload.AmtToForward != amt {
t.Fatalf("wrong forward amount: got %v, expected %v",
onionPayload.AmtToForward, amt)
}
expectedTimeLock = startingHeight + zpay32.DefaultFinalCLTVDelta
if onionPayload.OutgoingTimeLock != uint32(expectedTimeLock) {
t.Fatalf("wrong outgoing time lock: got %v, expecting %v",
onionPayload.OutgoingTimeLock,
expectedTimeLock)
}
// The B -> C hop should also be identical as the prior cases.
lastHop = secondRoute.Hops[1]
lastHop := route.Hops[1]
if lastHop.AmtToForward != amt {
t.Fatalf("wrong forward amount: got %v, expected %v",
lastHop.AmtToForward, amt)

View File

@ -5,7 +5,6 @@ import (
"crypto/sha256"
"fmt"
"runtime"
"sort"
"sync"
"sync/atomic"
"time"
@ -1313,72 +1312,12 @@ type routingMsg struct {
err chan error
}
// pathsToFeeSortedRoutes takes a set of paths, and returns a corresponding set
// of routes. A route differs from a path in that it has full time-lock and
// fee information attached. The set of routes returned may be less than the
// initial set of paths as it's possible we drop a route if it can't handle the
// total payment flow after fees are calculated.
func pathsToFeeSortedRoutes(source route.Vertex, paths [][]*channeldb.ChannelEdgePolicy,
finalCLTVDelta uint16, amt lnwire.MilliSatoshi,
currentHeight uint32) ([]*route.Route, error) {
validRoutes := make([]*route.Route, 0, len(paths))
for _, path := range paths {
// Attempt to make the path into a route. We snip off the first
// hop in the path as it contains a "self-hop" that is inserted
// by our KSP algorithm.
route, err := newRoute(
amt, source, path[1:], currentHeight, finalCLTVDelta,
)
if err != nil {
// TODO(roasbeef): report straw breaking edge?
continue
}
// If the path as enough total flow to support the computed
// route, then we'll add it to our set of valid routes.
validRoutes = append(validRoutes, route)
}
// If all our perspective routes were eliminating during the transition
// from path to route, then we'll return an error to the caller
if len(validRoutes) == 0 {
return nil, newErr(ErrNoPathFound, "unable to find a path to "+
"destination")
}
// Finally, we'll sort the set of validate routes to optimize for
// lowest total fees, using the required time-lock within the route as
// a tie-breaker.
sort.Slice(validRoutes, func(i, j int) bool {
// To make this decision we first check if the total fees
// required for both routes are equal. If so, then we'll let
// the total time lock be the tie breaker. Otherwise, we'll put
// the route with the lowest total fees first.
if validRoutes[i].TotalFees == validRoutes[j].TotalFees {
timeLockI := validRoutes[i].TotalTimeLock
timeLockJ := validRoutes[j].TotalTimeLock
return timeLockI < timeLockJ
}
return validRoutes[i].TotalFees < validRoutes[j].TotalFees
})
return validRoutes, nil
}
// FindRoutes attempts to query the ChannelRouter for a bounded number
// available paths to a particular target destination which is able to send
// `amt` after factoring in channel capacities and cumulative fees along each
// route. To `numPaths eligible paths, we use a modified version of
// Yen's algorithm which itself uses a modified version of Dijkstra's algorithm
// within its inner loop. Once we have a set of candidate routes, we calculate
// the required fee and time lock values running backwards along the route. The
// route that will be ranked the highest is the one with the lowest cumulative
// fee along the route.
func (r *ChannelRouter) FindRoutes(source, target route.Vertex,
amt lnwire.MilliSatoshi, restrictions *RestrictParams, numPaths uint32,
finalExpiry ...uint16) ([]*route.Route, error) {
// FindRoute attempts to query the ChannelRouter for the optimum path to a
// particular target destination to which it is able to send `amt` after
// factoring in channel capacities and cumulative fees along the route.
func (r *ChannelRouter) FindRoute(source, target route.Vertex,
amt lnwire.MilliSatoshi, restrictions *RestrictParams,
finalExpiry ...uint16) (*route.Route, error) {
var finalCLTVDelta uint16
if len(finalExpiry) == 0 {
@ -1389,11 +1328,6 @@ func (r *ChannelRouter) FindRoutes(source, target route.Vertex,
log.Debugf("Searching for path to %x, sending %v", target, amt)
// If we don't have a set of routes cached, we'll query the graph for a
// set of potential routes to the destination node that can support our
// payment amount. If no such routes can be found then an error will be
// returned.
// We can short circuit the routing by opportunistically checking to
// see if the target vertex event exists in the current graph.
if _, exists, err := r.cfg.Graph.HasLightningNode(target); err != nil {
@ -1403,16 +1337,8 @@ func (r *ChannelRouter) FindRoutes(source, target route.Vertex,
return nil, newErrf(ErrTargetNotInNetwork, "target not found")
}
// We'll also fetch the current block height so we can properly
// calculate the required HTLC time locks within the route.
_, currentHeight, err := r.cfg.Chain.GetBestBlock()
if err != nil {
return nil, err
}
// Before we open the db transaction below, we'll attempt to obtain a
// set of bandwidth hints that can help us eliminate certain routes
// early on in the path finding process.
// We'll attempt to obtain a set of bandwidth hints that can help us
// eliminate certain routes early on in the path finding process.
bandwidthHints, err := generateBandwidthHints(
r.selfNode, r.cfg.QueryBandwidth,
)
@ -1420,47 +1346,38 @@ func (r *ChannelRouter) FindRoutes(source, target route.Vertex,
return nil, err
}
tx, err := r.cfg.Graph.Database().Begin(false)
if err != nil {
tx.Rollback()
return nil, err
}
// Now that we know the destination is reachable within the graph,
// we'll execute our KSP algorithm to find the k-shortest paths from
// our source to the destination.
shortestPaths, err := findPaths(
tx, r.cfg.Graph, source, target, amt, restrictions,
numPaths, bandwidthHints,
// Now that we know the destination is reachable within the graph, we'll
// execute our path finding algorithm.
path, err := findPath(
&graphParams{
graph: r.cfg.Graph,
bandwidthHints: bandwidthHints,
},
restrictions, source, target, amt,
)
// We'll fetch the current block height so we can properly calculate the
// required HTLC time locks within the route.
_, currentHeight, err := r.cfg.Chain.GetBestBlock()
if err != nil {
tx.Rollback()
return nil, err
}
tx.Rollback()
// Now that we have a set of paths, we'll need to turn them into
// *routes* by computing the required time-lock and fee information for
// each path. During this process, some paths may be discarded if they
// aren't able to support the total satoshis flow once fees have been
// factored in.
sourceVertex := route.Vertex(r.selfNode.PubKeyBytes)
validRoutes, err := pathsToFeeSortedRoutes(
sourceVertex, shortestPaths, finalCLTVDelta, amt,
uint32(currentHeight),
// Create the route with absolute time lock values.
route, err := newRoute(
amt, source, path, uint32(currentHeight), finalCLTVDelta,
)
if err != nil {
return nil, err
}
go log.Tracef("Obtained %v paths sending %v to %x: %v", len(validRoutes),
go log.Tracef("Obtained path to send %v to %x: %v",
amt, target, newLogClosure(func() string {
return spew.Sdump(validRoutes)
return spew.Sdump(route)
}),
)
return validRoutes, nil
return route, nil
}
// generateSphinxPacket generates then encodes a sphinx packet which encodes

View File

@ -23,10 +23,6 @@ import (
"github.com/lightningnetwork/lnd/zpay32"
)
// defaultNumRoutes is the default value for the maximum number of routes to
// be returned by FindRoutes
const defaultNumRoutes = 10
type testCtx struct {
router *ChannelRouter
@ -165,60 +161,6 @@ func createTestCtxFromFile(startingHeight uint32, testGraph string) (*testCtx, f
return createTestCtxFromGraphInstance(startingHeight, graphInstance)
}
// TestFindRoutesFeeSorting asserts that routes found by the FindRoutes method
// within the channel router are properly returned in a sorted order, with the
// lowest fee route coming first.
func TestFindRoutesFeeSorting(t *testing.T) {
t.Parallel()
const startingBlockHeight = 101
ctx, cleanUp, err := createTestCtxFromFile(startingBlockHeight, basicGraphFilePath)
if err != nil {
t.Fatalf("unable to create router: %v", err)
}
defer cleanUp()
// In this test we'd like to ensure proper integration of the various
// functions that are involved in path finding, and also route
// selection.
// Execute a query for all possible routes between roasbeef and luo ji.
paymentAmt := lnwire.NewMSatFromSatoshis(100)
target := ctx.aliases["luoji"]
routes, err := ctx.router.FindRoutes(
ctx.router.selfNode.PubKeyBytes,
target, paymentAmt, noRestrictions, defaultNumRoutes,
zpay32.DefaultFinalCLTVDelta,
)
if err != nil {
t.Fatalf("unable to find any routes: %v", err)
}
// Exactly, two such paths should be found.
if len(routes) != 2 {
t.Fatalf("2 routes should've been selected, instead %v were: %v",
len(routes), spew.Sdump(routes))
}
// We shouldn't pay a fee for the fist route, but the second route
// should have a fee intact.
if routes[0].TotalFees != 0 {
t.Fatalf("incorrect fees for first route, expected 0 got: %v",
routes[0].TotalFees)
}
if routes[1].TotalFees == 0 {
t.Fatalf("total fees not set in second route: %v",
spew.Sdump(routes[0]))
}
// The paths should properly be ranked according to their total fee
// rate.
if routes[0].TotalFees > routes[1].TotalFees {
t.Fatalf("routes not ranked by total fee: %v",
spew.Sdump(routes))
}
}
// TestFindRoutesWithFeeLimit asserts that routes found by the FindRoutes method
// within the channel router contain a total fee less than or equal to the fee
// limit.
@ -247,24 +189,20 @@ func TestFindRoutesWithFeeLimit(t *testing.T) {
FeeLimit: lnwire.NewMSatFromSatoshis(10),
}
routes, err := ctx.router.FindRoutes(
route, err := ctx.router.FindRoute(
ctx.router.selfNode.PubKeyBytes,
target, paymentAmt, restrictions, defaultNumRoutes,
target, paymentAmt, restrictions,
zpay32.DefaultFinalCLTVDelta,
)
if err != nil {
t.Fatalf("unable to find any routes: %v", err)
}
if len(routes) != 1 {
t.Fatalf("expected 1 route, got %d", len(routes))
if route.TotalFees > restrictions.FeeLimit {
t.Fatalf("route exceeded fee limit: %v", spew.Sdump(route))
}
if routes[0].TotalFees > restrictions.FeeLimit {
t.Fatalf("route exceeded fee limit: %v", spew.Sdump(routes[0]))
}
hops := routes[0].Hops
hops := route.Hops
if len(hops) != 2 {
t.Fatalf("expected 2 hops, got %d", len(hops))
}
@ -1339,22 +1277,19 @@ func TestAddEdgeUnknownVertexes(t *testing.T) {
t.Fatalf("unable to update edge policy: %v", err)
}
// We should now be able to find two routes to node 2.
// We should now be able to find a route to node 2.
paymentAmt := lnwire.NewMSatFromSatoshis(100)
targetNode := priv2.PubKey()
var targetPubKeyBytes route.Vertex
copy(targetPubKeyBytes[:], targetNode.SerializeCompressed())
routes, err := ctx.router.FindRoutes(
_, err = ctx.router.FindRoute(
ctx.router.selfNode.PubKeyBytes,
targetPubKeyBytes, paymentAmt, noRestrictions, defaultNumRoutes,
targetPubKeyBytes, paymentAmt, noRestrictions,
zpay32.DefaultFinalCLTVDelta,
)
if err != nil {
t.Fatalf("unable to find any routes: %v", err)
}
if len(routes) != 2 {
t.Fatalf("expected to find 2 route, found: %v", len(routes))
}
// Now check that we can update the node info for the partial node
// without messing up the channel graph.
@ -1388,19 +1323,16 @@ func TestAddEdgeUnknownVertexes(t *testing.T) {
t.Fatalf("could not add node: %v", err)
}
// Should still be able to find the routes, and the info should be
// Should still be able to find the route, and the info should be
// updated.
routes, err = ctx.router.FindRoutes(
_, err = ctx.router.FindRoute(
ctx.router.selfNode.PubKeyBytes,
targetPubKeyBytes, paymentAmt, noRestrictions, defaultNumRoutes,
targetPubKeyBytes, paymentAmt, noRestrictions,
zpay32.DefaultFinalCLTVDelta,
)
if err != nil {
t.Fatalf("unable to find any routes: %v", err)
}
if len(routes) != 2 {
t.Fatalf("expected to find 2 route, found: %v", len(routes))
}
copy1, err := ctx.graph.FetchLightningNode(priv1.PubKey())
if err != nil {

View File

@ -462,7 +462,7 @@ func newRPCServer(s *server, macService *macaroons.Service,
}
return info.Capacity, nil
},
FindRoutes: s.chanRouter.FindRoutes,
FindRoute: s.chanRouter.FindRoute,
}
var (