Merge pull request #3595 from wpaulino/max-cltv-expiry-pathfinding

routing+routerrpc: take max cltv limit into account within path finding
This commit is contained in:
Olaoluwa Osuntokun 2019-10-14 17:29:45 +02:00 committed by GitHub
commit faacd8d5c4
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
16 changed files with 415 additions and 346 deletions

@ -3001,6 +3001,7 @@ var queryRoutesCommand = cli.Command{
Name: "use_mc", Name: "use_mc",
Usage: "use mission control probabilities", Usage: "use mission control probabilities",
}, },
cltvLimitFlag,
}, },
Action: actionDecorator(queryRoutes), Action: actionDecorator(queryRoutes),
} }
@ -3051,6 +3052,7 @@ func queryRoutes(ctx *cli.Context) error {
FeeLimit: feeLimit, FeeLimit: feeLimit,
FinalCltvDelta: int32(ctx.Int("final_cltv_delta")), FinalCltvDelta: int32(ctx.Int("final_cltv_delta")),
UseMissionControl: ctx.Bool("use_mc"), UseMissionControl: ctx.Bool("use_mc"),
CltvLimit: uint32(ctx.Uint64(cltvLimitFlag.Name)),
} }
route, err := client.QueryRoutes(ctxb, req) route, err := client.QueryRoutes(ctxb, req)

@ -39,11 +39,12 @@ const (
// willing to lock its own funds too, could force the funds of this node // willing to lock its own funds too, could force the funds of this node
// to be locked up for an indefinite (max int32) number of blocks. // to be locked up for an indefinite (max int32) number of blocks.
// //
// The value 1008 corresponds to on average one week worth of blocks and // The value 2016 corresponds to on average two weeks worth of blocks
// is based on the maximum number of hops (20), the default cltv delta // and is based on the maximum number of hops (20), the default CLTV
// (40) and some extra margin to account for the other lightning // delta (40), and some extra margin to account for the other lightning
// implementations. // implementations and past lnd versions which used to have a default
DefaultMaxOutgoingCltvExpiry = 1008 // CLTV delta of 144.
DefaultMaxOutgoingCltvExpiry = 2016
// DefaultMinLinkFeeUpdateTimeout represents the minimum interval in // DefaultMinLinkFeeUpdateTimeout represents the minimum interval in
// which a link should propose to update its commitment fee rate. // which a link should propose to update its commitment fee rate.

@ -212,8 +212,9 @@ type SendPaymentRequest struct {
//any channel may be used. //any channel may be used.
OutgoingChanId uint64 `protobuf:"varint,8,opt,name=outgoing_chan_id,json=outgoingChanId,proto3" json:"outgoing_chan_id,omitempty"` OutgoingChanId uint64 `protobuf:"varint,8,opt,name=outgoing_chan_id,json=outgoingChanId,proto3" json:"outgoing_chan_id,omitempty"`
//* //*
//An optional maximum total time lock for the route. If zero, there is no //An optional maximum total time lock for the route. This should not exceed
//maximum enforced. //lnd's `--max-cltv-expiry` setting. If zero, then the value of
//`--max-cltv-expiry` is enforced.
CltvLimit int32 `protobuf:"varint,9,opt,name=cltv_limit,json=cltvLimit,proto3" json:"cltv_limit,omitempty"` CltvLimit int32 `protobuf:"varint,9,opt,name=cltv_limit,json=cltvLimit,proto3" json:"cltv_limit,omitempty"`
//* //*
//Optional route hints to reach the destination through private channels. //Optional route hints to reach the destination through private channels.

@ -54,8 +54,9 @@ message SendPaymentRequest {
uint64 outgoing_chan_id = 8; uint64 outgoing_chan_id = 8;
/** /**
An optional maximum total time lock for the route. If zero, there is no An optional maximum total time lock for the route. This should not exceed
maximum enforced. lnd's `--max-cltv-expiry` setting. If zero, then the value of
`--max-cltv-expiry` is enforced.
*/ */
int32 cltv_limit = 9; int32 cltv_limit = 9;

@ -5,6 +5,7 @@ import (
"encoding/hex" "encoding/hex"
"errors" "errors"
"fmt" "fmt"
math "math"
"time" "time"
"github.com/btcsuite/btcd/btcec" "github.com/btcsuite/btcd/btcec"
@ -55,6 +56,10 @@ type RouterBackend struct {
// Tower is the ControlTower instance that is used to track pending // Tower is the ControlTower instance that is used to track pending
// payments. // payments.
Tower routing.ControlTower Tower routing.ControlTower
// MaxTotalTimelock is the maximum total time lock a route is allowed to
// have.
MaxTotalTimelock uint32
} }
// MissionControl defines the mission control dependencies of routerrpc. // MissionControl defines the mission control dependencies of routerrpc.
@ -165,6 +170,26 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
ignoredPairs[pair] = struct{}{} ignoredPairs[pair] = struct{}{}
} }
// Since QueryRoutes allows having a different source other than
// ourselves, we'll only apply our max time lock if we are the source.
maxTotalTimelock := r.MaxTotalTimelock
if sourcePubKey != r.SelfNode {
maxTotalTimelock = math.MaxUint32
}
cltvLimit, err := ValidateCLTVLimit(in.CltvLimit, maxTotalTimelock)
if err != nil {
return nil, err
}
// We need to subtract the final delta before passing it into path
// finding. The optimal path is independent of the final cltv delta and
// the path finding algorithm is unaware of this value.
finalCLTVDelta := uint16(zpay32.DefaultFinalCLTVDelta)
if in.FinalCltvDelta != 0 {
finalCLTVDelta = uint16(in.FinalCltvDelta)
}
cltvLimit -= uint32(finalCLTVDelta)
var destTLV map[uint64][]byte var destTLV map[uint64][]byte
restrictions := &routing.RestrictParams{ restrictions := &routing.RestrictParams{
FeeLimit: feeLimit, FeeLimit: feeLimit,
@ -192,6 +217,7 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
) )
}, },
DestPayloadTLV: len(destTLV) != 0, DestPayloadTLV: len(destTLV) != 0,
CltvLimit: cltvLimit,
} }
// If we have any TLV records destined for the final hop, then we'll // If we have any TLV records destined for the final hop, then we'll
@ -205,24 +231,12 @@ func (r *RouterBackend) QueryRoutes(ctx context.Context,
// Query the channel router for a possible path to the destination that // Query the channel router for a possible path to the destination that
// can carry `in.Amt` satoshis _including_ the total fee required on // can carry `in.Amt` satoshis _including_ the total fee required on
// the route. // the route.
var ( route, err := r.FindRoute(
route *route.Route
findErr error
)
if in.FinalCltvDelta == 0 {
route, findErr = r.FindRoute(
sourcePubKey, targetPubKey, amtMSat, restrictions, sourcePubKey, targetPubKey, amtMSat, restrictions,
destTlvRecords, destTlvRecords, finalCLTVDelta,
) )
} else { if err != nil {
route, findErr = r.FindRoute( return nil, err
sourcePubKey, targetPubKey, amtMSat, restrictions,
destTlvRecords, uint16(in.FinalCltvDelta),
)
}
if findErr != nil {
return nil, findErr
} }
// For each valid route, we'll convert the result into the format // For each valid route, we'll convert the result into the format
@ -471,11 +485,14 @@ func (r *RouterBackend) extractIntentFromSendRequest(
payIntent.OutgoingChannelID = &rpcPayReq.OutgoingChanId payIntent.OutgoingChannelID = &rpcPayReq.OutgoingChanId
} }
// Take cltv limit from request if set. // Take the CLTV limit from the request if set, otherwise use the max.
if rpcPayReq.CltvLimit != 0 { cltvLimit, err := ValidateCLTVLimit(
cltvLimit := uint32(rpcPayReq.CltvLimit) uint32(rpcPayReq.CltvLimit), r.MaxTotalTimelock,
payIntent.CltvLimit = &cltvLimit )
if err != nil {
return nil, err
} }
payIntent.CltvLimit = cltvLimit
// Take fee limit from request. // Take fee limit from request.
payIntent.FeeLimit = lnwire.NewMSatFromSatoshis( payIntent.FeeLimit = lnwire.NewMSatFromSatoshis(
@ -675,3 +692,18 @@ func ValidatePayReqExpiry(payReq *zpay32.Invoice) error {
return nil return nil
} }
// ValidateCLTVLimit returns a valid CLTV limit given a value and a maximum. If
// the value exceeds the maximum, then an error is returned. If the value is 0,
// then the maximum is used.
func ValidateCLTVLimit(val, max uint32) (uint32, error) {
switch {
case val == 0:
return max, nil
case val > max:
return 0, fmt.Errorf("total time lock of %v exceeds max "+
"allowed %v", val, max)
default:
return val, nil
}
}

@ -248,11 +248,14 @@ func (s *Server) EstimateRouteFee(ctx context.Context,
feeLimit := lnwire.NewMSatFromSatoshis(btcutil.SatoshiPerBitcoin) feeLimit := lnwire.NewMSatFromSatoshis(btcutil.SatoshiPerBitcoin)
// Finally, we'll query for a route to the destination that can carry // Finally, we'll query for a route to the destination that can carry
// that target amount, we'll only request a single route. // that target amount, we'll only request a single route. Set a
// restriction for the default CLTV limit, otherwise we can find a route
// that exceeds it and is useless to us.
route, err := s.cfg.Router.FindRoute( route, err := s.cfg.Router.FindRoute(
s.cfg.RouterBackend.SelfNode, destNode, amtMsat, s.cfg.RouterBackend.SelfNode, destNode, amtMsat,
&routing.RestrictParams{ &routing.RestrictParams{
FeeLimit: feeLimit, FeeLimit: feeLimit,
CltvLimit: s.cfg.RouterBackend.MaxTotalTimelock,
}, nil, }, nil,
) )
if err != nil { if err != nil {

@ -1052,8 +1052,9 @@ type SendRequest struct {
//any channel may be used. //any channel may be used.
OutgoingChanId uint64 `protobuf:"varint,9,opt,name=outgoing_chan_id,json=outgoingChanId,proto3" json:"outgoing_chan_id,omitempty"` OutgoingChanId uint64 `protobuf:"varint,9,opt,name=outgoing_chan_id,json=outgoingChanId,proto3" json:"outgoing_chan_id,omitempty"`
//* //*
//An optional maximum total time lock for the route. If zero, there is no //An optional maximum total time lock for the route. This should not exceed
//maximum enforced. //lnd's `--max-cltv-expiry` setting. If zero, then the value of
//`--max-cltv-expiry` is enforced.
CltvLimit uint32 `protobuf:"varint,10,opt,name=cltv_limit,json=cltvLimit,proto3" json:"cltv_limit,omitempty"` CltvLimit uint32 `protobuf:"varint,10,opt,name=cltv_limit,json=cltvLimit,proto3" json:"cltv_limit,omitempty"`
//* //*
//An optional field that can be used to pass an arbitrary set of TLV records //An optional field that can be used to pass an arbitrary set of TLV records
@ -5070,6 +5071,11 @@ type QueryRoutesRequest struct {
//* //*
//A list of directed node pairs that will be ignored during path finding. //A list of directed node pairs that will be ignored during path finding.
IgnoredPairs []*NodePair `protobuf:"bytes,10,rep,name=ignored_pairs,json=ignoredPairs,proto3" json:"ignored_pairs,omitempty"` IgnoredPairs []*NodePair `protobuf:"bytes,10,rep,name=ignored_pairs,json=ignoredPairs,proto3" json:"ignored_pairs,omitempty"`
//*
//An optional maximum total time lock for the route. If the source is empty or
//ourselves, this should not exceed lnd's `--max-cltv-expiry` setting. If
//zero, then the value of `--max-cltv-expiry` is used as the limit.
CltvLimit uint32 `protobuf:"varint,11,opt,name=cltv_limit,json=cltvLimit,proto3" json:"cltv_limit,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -5164,6 +5170,13 @@ func (m *QueryRoutesRequest) GetIgnoredPairs() []*NodePair {
return nil return nil
} }
func (m *QueryRoutesRequest) GetCltvLimit() uint32 {
if m != nil {
return m.CltvLimit
}
return 0
}
type NodePair struct { type NodePair struct {
/// The sending node of the pair. /// The sending node of the pair.
From []byte `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"` From []byte `protobuf:"bytes,1,opt,name=from,proto3" json:"from,omitempty"`
@ -9144,13 +9157,13 @@ func init() {
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
var fileDescriptor_77a6da22d6a3feb1 = []byte{ var fileDescriptor_77a6da22d6a3feb1 = []byte{
// 8469 bytes of a gzipped FileDescriptorProto // 8476 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5d, 0x6c, 0x1c, 0x5b, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x5d, 0x6c, 0x1c, 0x5b,
0xd2, 0x50, 0x7a, 0x7e, 0xec, 0x99, 0x9a, 0xb1, 0x3d, 0x3e, 0x76, 0xec, 0xc9, 0xdc, 0xdc, 0xdc, 0xd2, 0x50, 0x7a, 0x7e, 0xec, 0x99, 0x9a, 0xb1, 0x3d, 0x3e, 0x76, 0xec, 0xc9, 0xdc, 0xdc, 0xdc,
0xdc, 0xde, 0x7c, 0x49, 0x36, 0x7b, 0xd7, 0xc9, 0xcd, 0xee, 0x5e, 0xf2, 0xdd, 0xf0, 0xf1, 0xe1, 0xdc, 0xde, 0x7c, 0x49, 0x36, 0x7b, 0xd7, 0xc9, 0xcd, 0xee, 0x5e, 0xf2, 0xdd, 0xf0, 0xf1, 0xe1,
0xd8, 0x4e, 0x9c, 0x5d, 0x5f, 0xc7, 0xdb, 0x4e, 0x36, 0xec, 0xee, 0x87, 0x66, 0xdb, 0x33, 0xc7, 0xd8, 0x4e, 0x9c, 0x5d, 0x5f, 0xc7, 0xdb, 0x4e, 0x36, 0xec, 0xee, 0x87, 0x66, 0xdb, 0x33, 0xc7,
0x76, 0x6f, 0x66, 0xba, 0x67, 0xbb, 0x7b, 0xec, 0x78, 0x2f, 0x17, 0x09, 0x84, 0x10, 0x02, 0x21, 0x76, 0x6f, 0x66, 0xba, 0x67, 0xbb, 0x7b, 0xec, 0x78, 0x2f, 0x17, 0x09, 0x84, 0x10, 0x42, 0x42,
0xb4, 0xf0, 0x02, 0x08, 0x84, 0xb4, 0xfb, 0x3d, 0xb0, 0xe2, 0x01, 0x78, 0x00, 0x81, 0xf4, 0x49, 0x68, 0xe1, 0x05, 0x10, 0x08, 0x69, 0xf7, 0x7b, 0x60, 0xe1, 0x01, 0x78, 0x00, 0x81, 0xf4, 0x49,
0xdf, 0x23, 0x4f, 0x08, 0xa1, 0xef, 0x8d, 0x07, 0x3e, 0x21, 0x90, 0x60, 0xe1, 0x0d, 0x89, 0x77, 0xdf, 0x23, 0x4f, 0x08, 0xa1, 0xef, 0x8d, 0x07, 0x3e, 0x21, 0x90, 0x60, 0xe1, 0x0d, 0x89, 0x77,
0x54, 0x75, 0x7e, 0xfa, 0x9c, 0xee, 0x9e, 0x24, 0x77, 0x77, 0xe1, 0xc9, 0x73, 0xaa, 0xaa, 0xcf, 0x54, 0x75, 0x7e, 0xfa, 0x9c, 0xee, 0x9e, 0x24, 0x77, 0x77, 0xe1, 0xc9, 0x73, 0xaa, 0xaa, 0xcf,
0x6f, 0x55, 0x9d, 0xaa, 0x3a, 0x75, 0x8e, 0xa1, 0x19, 0x4f, 0x06, 0x1b, 0x93, 0x38, 0x4a, 0x23, 0x6f, 0x55, 0x9d, 0xaa, 0x3a, 0x75, 0x8e, 0xa1, 0x19, 0x4f, 0x06, 0x1b, 0x93, 0x38, 0x4a, 0x23,
@ -9250,7 +9263,7 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0xa4, 0x9f, 0xf9, 0xe1, 0x85, 0x9a, 0xab, 0xbd, 0xd2, 0xb9, 0xba, 0x6d, 0x6c, 0x4a, 0x06, 0xf5, 0xa4, 0x9f, 0xf9, 0xe1, 0x85, 0x9a, 0xab, 0xbd, 0xd2, 0xb9, 0xba, 0x6d, 0x6c, 0x4a, 0x06, 0xf5,
0x97, 0x9d, 0xa8, 0x6a, 0x7e, 0xa2, 0xd8, 0x75, 0x68, 0x5b, 0xdd, 0xad, 0x0b, 0x73, 0x2c, 0xf1, 0x97, 0x9d, 0xa8, 0x6a, 0x7e, 0xa2, 0xd8, 0x75, 0x68, 0x5b, 0xdd, 0xad, 0x0b, 0x73, 0x2c, 0xf1,
0xd3, 0x03, 0x1e, 0x3f, 0xba, 0x48, 0xf9, 0x6f, 0x3e, 0x95, 0x37, 0xa1, 0x93, 0x75, 0x5b, 0xce, 0xd3, 0x03, 0x1e, 0x3f, 0xba, 0x48, 0xf9, 0x6f, 0x3e, 0x95, 0x37, 0xa1, 0x93, 0x75, 0x5b, 0xce,
0x23, 0x83, 0x1a, 0x32, 0xa6, 0xac, 0x80, 0x7e, 0xbb, 0xff, 0xc8, 0x11, 0x84, 0x5b, 0x51, 0xa0, 0x23, 0x83, 0x1a, 0x32, 0xa6, 0xac, 0x80, 0x7e, 0xbb, 0xff, 0xd0, 0x11, 0x84, 0x5b, 0x51, 0xa0,
0x4d, 0x35, 0x24, 0x44, 0x8b, 0x4f, 0x11, 0xe2, 0xef, 0x99, 0xa6, 0xee, 0x6f, 0x3e, 0x58, 0xd4, 0x4d, 0x35, 0x24, 0x44, 0x8b, 0x4f, 0x11, 0xe2, 0xef, 0x99, 0xa6, 0xee, 0x6f, 0x3e, 0x58, 0xd4,
0x89, 0x09, 0x0f, 0x87, 0x7d, 0x7f, 0x34, 0x22, 0x45, 0xdc, 0xf0, 0xe6, 0xb1, 0xbc, 0x39, 0x1a, 0x89, 0x09, 0x0f, 0x87, 0x7d, 0x7f, 0x34, 0x22, 0x45, 0xdc, 0xf0, 0xe6, 0xb1, 0xbc, 0x39, 0x1a,
0xb9, 0xb7, 0x60, 0xd9, 0xe8, 0xdd, 0x1b, 0xc6, 0xb1, 0x0f, 0x6c, 0x2f, 0x48, 0xd2, 0x17, 0x61, 0xb9, 0xb7, 0x60, 0xd9, 0xe8, 0xdd, 0x1b, 0xc6, 0xb1, 0x0f, 0x6c, 0x2f, 0x48, 0xd2, 0x17, 0x61,
@ -9290,7 +9303,7 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0x5d, 0x11, 0x9e, 0x4a, 0x01, 0xc1, 0x3e, 0x81, 0x35, 0xc1, 0x11, 0x84, 0x92, 0x76, 0x37, 0x99, 0x5d, 0x11, 0x9e, 0x4a, 0x01, 0xc1, 0x3e, 0x81, 0x35, 0xc1, 0x11, 0x84, 0x92, 0x76, 0x37, 0x99,
0x09, 0xab, 0x34, 0x23, 0x33, 0xb0, 0x38, 0x95, 0x92, 0x45, 0x0a, 0x1f, 0x5e, 0x16, 0x53, 0x39, 0x09, 0xab, 0x34, 0x23, 0x33, 0xb0, 0x38, 0x95, 0x92, 0x45, 0x0a, 0x1f, 0x5e, 0x16, 0x53, 0x39,
0x03, 0x8d, 0xfd, 0xc3, 0x1e, 0x04, 0x83, 0xbe, 0xa4, 0x40, 0xf1, 0x58, 0xa3, 0x51, 0x14, 0x11, 0x03, 0x8d, 0xfd, 0xc3, 0x1e, 0x04, 0x83, 0xbe, 0xa4, 0x40, 0xf1, 0x58, 0xa3, 0x51, 0x14, 0x11,
0xee, 0x3f, 0x71, 0xc4, 0x26, 0x22, 0x05, 0x2e, 0x31, 0xdc, 0x23, 0x21, 0x6a, 0xfd, 0x28, 0x1c, 0xee, 0x3f, 0x76, 0xc4, 0x26, 0x22, 0x05, 0x2e, 0x31, 0xdc, 0x23, 0x21, 0x6a, 0xfd, 0x28, 0x1c,
0x5d, 0x48, 0xe9, 0x03, 0x01, 0x7a, 0x16, 0x8e, 0x2e, 0xd0, 0x40, 0x0f, 0x42, 0x93, 0x44, 0xe8, 0x5d, 0x48, 0xe9, 0x03, 0x01, 0x7a, 0x16, 0x8e, 0x2e, 0xd0, 0x40, 0x0f, 0x42, 0x93, 0x44, 0xe8,
0xab, 0xb6, 0x02, 0x12, 0xd1, 0x07, 0xd0, 0x9a, 0x4c, 0x8f, 0x46, 0xc1, 0x40, 0x90, 0x54, 0x45, 0xab, 0xb6, 0x02, 0x12, 0xd1, 0x07, 0xd0, 0x9a, 0x4c, 0x8f, 0x46, 0xc1, 0x40, 0x90, 0x54, 0x45,
0x2d, 0x02, 0x44, 0x04, 0xe8, 0x1b, 0x8a, 0x59, 0x17, 0x14, 0x35, 0xa2, 0x68, 0x49, 0x18, 0x92, 0x2d, 0x02, 0x44, 0x04, 0xe8, 0x1b, 0x8a, 0x59, 0x17, 0x14, 0x35, 0xa2, 0x68, 0x49, 0x18, 0x92,
@ -9348,9 +9361,9 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0x7b, 0x8f, 0x1f, 0xa7, 0xee, 0x3e, 0x2c, 0x4b, 0xfd, 0xf7, 0x6c, 0xc2, 0x55, 0xd3, 0xbf, 0x5b, 0x7b, 0x8f, 0x1f, 0xa7, 0xee, 0x3e, 0x2c, 0x4b, 0xfd, 0xf7, 0x6c, 0xc2, 0x55, 0xd3, 0xbf, 0x5b,
0x66, 0x47, 0xb4, 0xee, 0xaf, 0xd8, 0x0a, 0x53, 0x9c, 0xf4, 0xd9, 0x94, 0xae, 0x07, 0xcc, 0xd4, 0x66, 0x47, 0xb4, 0xee, 0xaf, 0xd8, 0x0a, 0x53, 0x9c, 0xf4, 0xd9, 0x94, 0xae, 0x07, 0xcc, 0xd4,
0xa7, 0xb2, 0x42, 0xb9, 0x99, 0xab, 0x58, 0x9f, 0x1c, 0x8e, 0x05, 0xc3, 0xf9, 0x49, 0xa6, 0x83, 0xa7, 0xb2, 0x42, 0xb9, 0x99, 0xab, 0x58, 0x9f, 0x1c, 0x8e, 0x05, 0xc3, 0xf9, 0x49, 0xa6, 0x83,
0x81, 0x3a, 0xad, 0x6c, 0x78, 0xaa, 0xe8, 0xfe, 0x53, 0x07, 0x56, 0xa8, 0x36, 0x65, 0x09, 0xc9, 0x81, 0x3a, 0xad, 0x6c, 0x78, 0xaa, 0xe8, 0xfe, 0x13, 0x07, 0x56, 0xa8, 0x36, 0x65, 0x09, 0xc9,
0x3d, 0xeb, 0xc1, 0x97, 0xe8, 0xa6, 0x8a, 0xb4, 0x8a, 0xf8, 0xe2, 0x2a, 0xd4, 0xcd, 0x5d, 0x4c, 0x3d, 0xeb, 0xc1, 0x97, 0xe8, 0xa6, 0x8a, 0xb4, 0x8a, 0xf8, 0xe2, 0x2a, 0xd4, 0xcd, 0x5d, 0x4c,
0x14, 0xbe, 0x7c, 0x5c, 0xa5, 0x96, 0x8f, 0xab, 0xb8, 0x7f, 0xdf, 0x81, 0x65, 0xb1, 0x91, 0x90, 0x14, 0xbe, 0x7c, 0x5c, 0xa5, 0x96, 0x8f, 0xab, 0xb8, 0x7f, 0xcf, 0x81, 0x65, 0xb1, 0x91, 0x90,
0xd5, 0x2c, 0x87, 0xff, 0x67, 0x61, 0x41, 0x58, 0x04, 0x52, 0x2b, 0xc8, 0x8e, 0x66, 0xaa, 0x95, 0xd5, 0x2c, 0x87, 0xff, 0x67, 0x61, 0x41, 0x58, 0x04, 0x52, 0x2b, 0xc8, 0x8e, 0x66, 0xaa, 0x95,
0xa0, 0x82, 0x78, 0xf7, 0x92, 0x67, 0x13, 0xb3, 0x87, 0x64, 0x95, 0x85, 0x7d, 0x82, 0x96, 0x9c, 0xa0, 0x82, 0x78, 0xf7, 0x92, 0x67, 0x13, 0xb3, 0x87, 0x64, 0x95, 0x85, 0x7d, 0x82, 0x96, 0x9c,
0x6b, 0xdb, 0x73, 0xbd, 0x7b, 0xc9, 0x33, 0xc8, 0x1f, 0x35, 0x60, 0x4e, 0xb8, 0x1c, 0xee, 0x13, 0x6b, 0xdb, 0x73, 0xbd, 0x7b, 0xc9, 0x33, 0xc8, 0x1f, 0x35, 0x60, 0x4e, 0xb8, 0x1c, 0xee, 0x13,
@ -9362,7 +9375,7 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0x0d, 0xdb, 0xcb, 0xba, 0x01, 0x0b, 0xea, 0x94, 0xa1, 0x3f, 0xc6, 0xd6, 0xa5, 0x4b, 0x6b, 0x01, 0x0d, 0xdb, 0xcb, 0xba, 0x01, 0x0b, 0xea, 0x94, 0xa1, 0x3f, 0xc6, 0xd6, 0xa5, 0x4b, 0x6b, 0x01,
0xd9, 0x1d, 0xe8, 0x28, 0x47, 0x47, 0xbb, 0x72, 0xe2, 0xac, 0xae, 0x00, 0x47, 0xfd, 0x9f, 0x45, 0xd9, 0x1d, 0xe8, 0x28, 0x47, 0x47, 0xbb, 0x72, 0xe2, 0xac, 0xae, 0x00, 0x47, 0xfd, 0x9f, 0x45,
0xd2, 0x5a, 0xd4, 0xd9, 0x0c, 0x40, 0x7e, 0x11, 0x72, 0x48, 0x7f, 0x1a, 0xca, 0xa3, 0x6d, 0x3e, 0xd2, 0x5a, 0xd4, 0xd9, 0x0c, 0x40, 0x7e, 0x11, 0x72, 0x48, 0x7f, 0x1a, 0xca, 0xa3, 0x6d, 0x3e,
0x24, 0x67, 0x16, 0xfd, 0xa2, 0x3c, 0xc2, 0xfd, 0xbb, 0x0e, 0x74, 0x70, 0xcd, 0x2c, 0xb6, 0xfc, 0x24, 0x67, 0x16, 0xfd, 0xa2, 0x3c, 0xc2, 0xfd, 0x3b, 0x0e, 0x74, 0x70, 0xcd, 0x2c, 0xb6, 0xfc,
0x14, 0x48, 0x2a, 0xde, 0x91, 0x2b, 0x2d, 0x5a, 0xf6, 0x00, 0x9a, 0x54, 0x8e, 0x26, 0x3c, 0x94, 0x14, 0x48, 0x2a, 0xde, 0x91, 0x2b, 0x2d, 0x5a, 0xf6, 0x00, 0x9a, 0x54, 0x8e, 0x26, 0x3c, 0x94,
0x3c, 0xd9, 0xb5, 0x79, 0x32, 0xd3, 0x27, 0xbb, 0x97, 0xbc, 0x8c, 0xd8, 0xe0, 0xc8, 0xff, 0xe0, 0x3c, 0xd9, 0xb5, 0x79, 0x32, 0xd3, 0x27, 0xbb, 0x97, 0xbc, 0x8c, 0xd8, 0xe0, 0xc8, 0xff, 0xe0,
0x40, 0x4b, 0xb6, 0xf2, 0x6b, 0x47, 0x6a, 0x7a, 0x46, 0x2e, 0x82, 0xe0, 0xa4, 0x2c, 0xf5, 0xe0, 0x40, 0x4b, 0xb6, 0xf2, 0x6b, 0x47, 0x6a, 0x7a, 0x46, 0x2e, 0x82, 0xe0, 0xa4, 0x2c, 0xf5, 0xe0,
@ -9397,11 +9410,11 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0x0f, 0x00, 0x32, 0x18, 0xeb, 0x40, 0xfb, 0xd9, 0xc1, 0xce, 0x7e, 0x7f, 0x6b, 0x77, 0x73, 0x7f, 0x0f, 0x00, 0x32, 0x18, 0xeb, 0x40, 0xfb, 0xd9, 0xc1, 0xce, 0x7e, 0x7f, 0x6b, 0x77, 0x73, 0x7f,
0x7f, 0x67, 0xaf, 0x73, 0x89, 0x31, 0x58, 0xa4, 0x30, 0xdf, 0xb6, 0x86, 0x39, 0x08, 0x93, 0x81, 0x7f, 0x67, 0xaf, 0x73, 0x89, 0x31, 0x58, 0xa4, 0x30, 0xdf, 0xb6, 0x86, 0x39, 0x08, 0x93, 0x81,
0x15, 0x05, 0xab, 0xb0, 0x55, 0xe8, 0x3c, 0xdd, 0xcf, 0x41, 0xab, 0x8f, 0x9a, 0x5a, 0x3e, 0xdc, 0x15, 0x05, 0xab, 0xb0, 0x55, 0xe8, 0x3c, 0xdd, 0xcf, 0x41, 0xab, 0x8f, 0x9a, 0x5a, 0x3e, 0xdc,
0x35, 0x58, 0x15, 0xd9, 0xad, 0x8f, 0x04, 0x7b, 0x28, 0xeb, 0xe4, 0x1f, 0x3b, 0x70, 0x39, 0x87, 0x35, 0x58, 0x15, 0xd9, 0xad, 0x8f, 0x04, 0x7b, 0x28, 0xeb, 0xe4, 0x1f, 0x39, 0x70, 0x39, 0x87,
0xc8, 0xd2, 0xb5, 0x84, 0x01, 0x62, 0x5b, 0x25, 0x36, 0x90, 0x0e, 0x11, 0x94, 0xad, 0x99, 0xd3, 0xc8, 0xd2, 0xb5, 0x84, 0x01, 0x62, 0x5b, 0x25, 0x36, 0x90, 0x0e, 0x11, 0x94, 0xad, 0x99, 0xd3,
0x20, 0x45, 0x04, 0xf2, 0xbc, 0x61, 0x9b, 0xe6, 0x24, 0xa9, 0x0c, 0xe5, 0xae, 0xeb, 0xcc, 0x98, 0x20, 0x45, 0x04, 0xf2, 0xbc, 0x61, 0x9b, 0xe6, 0x24, 0xa9, 0x0c, 0xe5, 0xae, 0xeb, 0xcc, 0x98,
0x5c, 0xc7, 0x8f, 0x45, 0xd6, 0xac, 0x89, 0xc8, 0x0e, 0x70, 0xed, 0x2e, 0xab, 0x22, 0xba, 0x15, 0x5c, 0xc7, 0x8f, 0x45, 0xd6, 0xac, 0x89, 0xc8, 0x0e, 0x70, 0xed, 0x2e, 0xab, 0x22, 0xba, 0x15,
0x96, 0xb1, 0x63, 0xf7, 0xb7, 0x14, 0xe7, 0xfe, 0xad, 0x2a, 0xb0, 0xef, 0x4e, 0x79, 0x7c, 0x41, 0x96, 0xb1, 0x63, 0xf7, 0xb7, 0x14, 0xe7, 0xfe, 0xd3, 0x2a, 0xb0, 0xef, 0x4e, 0x79, 0x7c, 0x41,
0x39, 0x59, 0x3a, 0x6a, 0xba, 0x9e, 0x8f, 0x09, 0xce, 0x4d, 0xa6, 0x47, 0xdf, 0xe1, 0x17, 0x2a, 0x39, 0x59, 0x3a, 0x6a, 0xba, 0x9e, 0x8f, 0x09, 0xce, 0x4d, 0xa6, 0x47, 0xdf, 0xe1, 0x17, 0x2a,
0x3b, 0xb1, 0x92, 0x65, 0x27, 0x96, 0x65, 0x08, 0xd6, 0xde, 0x9e, 0x21, 0x58, 0x7f, 0x5b, 0x86, 0x3b, 0xb1, 0x92, 0x65, 0x27, 0x96, 0x65, 0x08, 0xd6, 0xde, 0x9e, 0x21, 0x58, 0x7f, 0x5b, 0x86,
0xe0, 0x57, 0x60, 0x21, 0x38, 0x09, 0x23, 0x94, 0x79, 0xb4, 0x13, 0x92, 0xee, 0xdc, 0xf5, 0x2a, 0xe0, 0x57, 0x60, 0x21, 0x38, 0x09, 0x23, 0x94, 0x79, 0xb4, 0x13, 0x92, 0xee, 0xdc, 0xf5, 0x2a,
@ -9411,270 +9424,270 @@ var fileDescriptor_77a6da22d6a3feb1 = []byte{
0x62, 0xc4, 0x1b, 0xb0, 0x32, 0x4d, 0x78, 0x7f, 0x1c, 0x24, 0x09, 0xee, 0x8e, 0x83, 0x28, 0x4c, 0x62, 0xc4, 0x1b, 0xb0, 0x32, 0x4d, 0x78, 0x7f, 0x1c, 0x24, 0x09, 0xee, 0x8e, 0x83, 0x28, 0x4c,
0xe3, 0x68, 0x24, 0xe3, 0x49, 0xcb, 0xd3, 0x84, 0x7f, 0x26, 0x30, 0x5b, 0x02, 0xc1, 0xbe, 0x99, 0xe3, 0x68, 0x24, 0xe3, 0x49, 0xcb, 0xd3, 0x84, 0x7f, 0x26, 0x30, 0x5b, 0x02, 0xc1, 0xbe, 0x99,
0x75, 0x69, 0xe2, 0x07, 0x71, 0xd2, 0x05, 0xea, 0x92, 0x1a, 0x29, 0xf6, 0xfb, 0xc0, 0x0f, 0x62, 0x75, 0x69, 0xe2, 0x07, 0x71, 0xd2, 0x05, 0xea, 0x92, 0x1a, 0x29, 0xf6, 0xfb, 0xc0, 0x0f, 0x62,
0xdd, 0x17, 0x2c, 0x24, 0x32, 0x0b, 0x6e, 0x03, 0x1a, 0x0a, 0x8f, 0x5e, 0xec, 0x71, 0x1c, 0x8d, 0xdd, 0x17, 0x2c, 0x24, 0xb9, 0x2c, 0xc7, 0x56, 0x2e, 0xcb, 0x51, 0x26, 0xc9, 0x6d, 0x40, 0x43,
0x95, 0x17, 0x8b, 0xbf, 0xd9, 0x22, 0x54, 0xd2, 0x48, 0x7a, 0xa0, 0x95, 0x34, 0x72, 0xbf, 0x0f, 0x7d, 0x8e, 0x4e, 0xee, 0x71, 0x1c, 0x8d, 0x95, 0x93, 0x8b, 0xbf, 0xd9, 0x22, 0x54, 0xd2, 0x48,
0x2d, 0x63, 0x88, 0x32, 0x15, 0x8e, 0x2c, 0x26, 0xe9, 0xfe, 0xd6, 0x84, 0x83, 0x12, 0xf2, 0xd1, 0x3a, 0xa8, 0x95, 0x34, 0x72, 0xbf, 0x0f, 0x2d, 0x63, 0x06, 0x64, 0xa6, 0x1c, 0x19, 0x54, 0xd2,
0xd3, 0x21, 0xfb, 0x1a, 0x2c, 0x0f, 0x83, 0x98, 0x53, 0xd6, 0x6b, 0x3f, 0xe6, 0x67, 0x3c, 0x4e, 0x3b, 0xae, 0x09, 0xff, 0x25, 0xe4, 0xa3, 0xa7, 0x43, 0xf6, 0x35, 0x58, 0x1e, 0x06, 0x31, 0xa7,
0x54, 0xa0, 0xa0, 0xa3, 0x11, 0x9e, 0x80, 0xbb, 0x7d, 0x58, 0xb1, 0xf8, 0x42, 0x8b, 0xcd, 0x1c, 0xa4, 0xd8, 0x7e, 0xcc, 0xcf, 0x78, 0x9c, 0xa8, 0x38, 0x42, 0x47, 0x23, 0x3c, 0x01, 0x77, 0xfb,
0xa5, 0xed, 0xa9, 0x58, 0xa5, 0x9d, 0xd2, 0x27, 0x71, 0xb8, 0xe1, 0xc8, 0x18, 0x47, 0x7f, 0x12, 0xb0, 0x62, 0xb1, 0x8d, 0x96, 0xaa, 0x39, 0xca, 0xea, 0x53, 0xa1, 0x4c, 0x3b, 0xe3, 0x4f, 0xe2,
0x47, 0x47, 0xd4, 0x88, 0xe3, 0x59, 0x30, 0xf7, 0x97, 0x15, 0xa8, 0xee, 0x46, 0x13, 0xf3, 0xd4, 0x70, 0x3f, 0x92, 0x21, 0x90, 0xfe, 0x24, 0x8e, 0x8e, 0xa8, 0x11, 0xc7, 0xb3, 0x60, 0xee, 0x2f,
0xc6, 0xb1, 0x4f, 0x6d, 0xa4, 0x55, 0xd8, 0xd7, 0x46, 0x9f, 0xdc, 0xba, 0x2d, 0x20, 0xbb, 0x03, 0x2b, 0x50, 0xdd, 0x8d, 0x26, 0xe6, 0xa1, 0x8e, 0x63, 0x1f, 0xea, 0x48, 0xa3, 0xb1, 0xaf, 0x6d,
0x8b, 0xfe, 0x38, 0xed, 0xa7, 0x11, 0x5a, 0xc1, 0xe7, 0x7e, 0x2c, 0xf2, 0xfb, 0xaa, 0xb4, 0xde, 0x42, 0xb9, 0xb3, 0x5b, 0x40, 0x76, 0x07, 0x16, 0xfd, 0x71, 0xda, 0x4f, 0x23, 0x34, 0x92, 0xcf,
0x39, 0x0c, 0x5b, 0x85, 0xaa, 0x36, 0x66, 0x88, 0x00, 0x8b, 0xe8, 0x82, 0xd1, 0xe9, 0xf6, 0x85, 0xfd, 0x58, 0xa4, 0xff, 0x55, 0x89, 0x1d, 0x72, 0x18, 0xb6, 0x0a, 0x55, 0x6d, 0xeb, 0x10, 0x01,
0x0c, 0x46, 0xca, 0x12, 0x8a, 0xb3, 0xfd, 0xbd, 0xf0, 0x7f, 0xc5, 0x96, 0x54, 0x86, 0x42, 0x0b, 0x16, 0xd1, 0x43, 0xa3, 0xc3, 0xef, 0x0b, 0x19, 0xab, 0x94, 0x25, 0x94, 0x76, 0xfb, 0x7b, 0xe1,
0x15, 0x39, 0x7c, 0x9c, 0x19, 0x7c, 0xba, 0x6c, 0x86, 0xd9, 0x1b, 0x76, 0x98, 0xfd, 0x3a, 0xb4, 0x1e, 0x8b, 0x1d, 0xab, 0x0c, 0x85, 0x06, 0x2c, 0x0a, 0xc0, 0x38, 0xb3, 0x07, 0x75, 0xd9, 0x8c,
0xd2, 0xd1, 0x59, 0x7f, 0xe2, 0x5f, 0x8c, 0x22, 0x7f, 0x28, 0x39, 0xcb, 0x04, 0xb9, 0xbf, 0x72, 0xc2, 0x37, 0xec, 0x28, 0xfc, 0x75, 0x68, 0xa5, 0xa3, 0xb3, 0xfe, 0xc4, 0xbf, 0x18, 0x45, 0xfe,
0xa0, 0x4e, 0x33, 0x8c, 0x1b, 0xb0, 0xd0, 0x50, 0xfa, 0x68, 0x87, 0x66, 0x6d, 0xc1, 0xcb, 0x83, 0x50, 0x32, 0x9e, 0x09, 0x72, 0x7f, 0xe5, 0x40, 0x9d, 0x66, 0x18, 0xf7, 0x67, 0xa1, 0xc0, 0xf4,
0x99, 0x6b, 0x65, 0x69, 0x57, 0xf4, 0x90, 0xcd, 0x4c, 0xed, 0xeb, 0xd0, 0x14, 0x25, 0x9d, 0x71, 0xc9, 0x0f, 0xcd, 0xda, 0x82, 0x97, 0x07, 0x33, 0xd7, 0x4a, 0xe2, 0xae, 0xe8, 0x21, 0x9b, 0x89,
0x4c, 0x24, 0x19, 0x90, 0x5d, 0x83, 0xda, 0x69, 0x34, 0x51, 0x3e, 0x0a, 0xa8, 0x53, 0xdc, 0x68, 0xdc, 0xd7, 0xa1, 0x29, 0x4a, 0x3a, 0x21, 0x99, 0x48, 0x32, 0x20, 0xbb, 0x06, 0xb5, 0xd3, 0x68,
0xe2, 0x11, 0x3c, 0xeb, 0x0f, 0xd6, 0x27, 0x06, 0x2e, 0xec, 0xc0, 0x3c, 0x18, 0x6d, 0x6f, 0x5d, 0xa2, 0x5c, 0x18, 0x50, 0x87, 0xbc, 0xd1, 0xc4, 0x23, 0x78, 0xd6, 0x1f, 0xac, 0x4f, 0x0c, 0x5c,
0xad, 0x39, 0x91, 0x39, 0xa8, 0xfb, 0x02, 0x96, 0x50, 0x06, 0x8c, 0x50, 0xf7, 0x6c, 0x6d, 0xf4, 0x98, 0x89, 0x79, 0x30, 0x9a, 0xe6, 0xba, 0x5a, 0x73, 0x22, 0x73, 0x50, 0xf7, 0x05, 0x2c, 0xa1,
0x55, 0xdc, 0xdc, 0x06, 0xa3, 0xe9, 0x90, 0x9b, 0x9e, 0x22, 0x85, 0x32, 0x25, 0x5c, 0xd9, 0x48, 0x0c, 0x18, 0x91, 0xf0, 0xd9, 0xca, 0xea, 0xab, 0xb8, 0xf7, 0x0d, 0x46, 0xd3, 0x21, 0x37, 0x1d,
0xee, 0xbf, 0x70, 0x84, 0x6c, 0x61, 0xbd, 0xec, 0x36, 0xd4, 0x50, 0xa7, 0xe4, 0x02, 0x03, 0x3a, 0x49, 0x8a, 0x74, 0x4a, 0xb8, 0x32, 0xa1, 0xdc, 0x7f, 0xe1, 0x08, 0xd9, 0xc2, 0x7a, 0xd9, 0x6d,
0xd1, 0x03, 0xe9, 0x3c, 0xa2, 0x40, 0x4e, 0xa6, 0x60, 0xa3, 0x59, 0xbb, 0x08, 0x35, 0x66, 0x6e, 0xa8, 0xa1, 0xca, 0xc9, 0xc5, 0x0d, 0x74, 0x1e, 0x08, 0xd2, 0x79, 0x44, 0x81, 0x9c, 0x4c, 0xb1,
0x96, 0x1e, 0x59, 0xce, 0x3b, 0xc9, 0x41, 0xd9, 0x86, 0x71, 0x52, 0x53, 0xb3, 0xf4, 0x94, 0xda, 0x48, 0xb3, 0x76, 0x11, 0x89, 0xcc, 0xbc, 0x30, 0x3d, 0xb2, 0x9c, 0xf3, 0x92, 0x83, 0xb2, 0x0d,
0x4b, 0x87, 0x27, 0xdc, 0x38, 0xa1, 0xf9, 0xa5, 0x03, 0x0b, 0x56, 0x9f, 0x90, 0x53, 0x46, 0x7e, 0xe3, 0x20, 0xa7, 0x66, 0xa9, 0x31, 0xb5, 0xd5, 0x0e, 0x4f, 0xb8, 0x71, 0x80, 0xf3, 0x4b, 0x07,
0x92, 0xca, 0xc3, 0x76, 0xb9, 0xf2, 0x26, 0xc8, 0xe4, 0xb2, 0x8a, 0xcd, 0x65, 0x3a, 0xe2, 0x5f, 0x16, 0xac, 0x3e, 0x21, 0xa7, 0x8c, 0xfc, 0x24, 0x95, 0x67, 0xf1, 0x72, 0xe5, 0x4d, 0x90, 0xc9,
0x35, 0x23, 0xfe, 0xf7, 0xa0, 0x99, 0xa5, 0xe9, 0xdb, 0x9d, 0xc2, 0x16, 0x55, 0xca, 0x4b, 0x46, 0x65, 0x15, 0x9b, 0xcb, 0xf4, 0x81, 0x40, 0xd5, 0x3c, 0x10, 0xb8, 0x07, 0xcd, 0x2c, 0x8b, 0xdf,
0x94, 0xc5, 0x94, 0xeb, 0x46, 0x4c, 0xd9, 0x7d, 0x08, 0x2d, 0x83, 0xde, 0x8c, 0x09, 0x3b, 0x56, 0xee, 0x14, 0xb6, 0xa8, 0x32, 0x62, 0x32, 0xa2, 0x2c, 0xe4, 0x5c, 0x37, 0x42, 0xce, 0xee, 0x43,
0x4c, 0x58, 0xe7, 0x83, 0x55, 0xb2, 0x7c, 0x30, 0xf7, 0x67, 0x15, 0x58, 0x40, 0xf6, 0x0e, 0xc2, 0x68, 0x19, 0xf4, 0x66, 0xc8, 0xd8, 0xb1, 0x42, 0xc6, 0x3a, 0x5d, 0xac, 0x92, 0xa5, 0x8b, 0xb9,
0x93, 0x83, 0x68, 0x14, 0x0c, 0x2e, 0x88, 0xad, 0x14, 0x27, 0xcb, 0x3d, 0x45, 0xb1, 0xb9, 0x0d, 0x3f, 0xab, 0xc0, 0x02, 0xb2, 0x77, 0x10, 0x9e, 0x1c, 0x44, 0xa3, 0x60, 0x70, 0x41, 0x6c, 0xa5,
0x46, 0x91, 0xd3, 0x49, 0xb0, 0x42, 0x3f, 0xe8, 0x32, 0x2a, 0x10, 0x14, 0xbf, 0x23, 0x3f, 0x91, 0x38, 0x59, 0x6e, 0x39, 0x8a, 0xcd, 0x6d, 0x30, 0x8a, 0x9c, 0xce, 0x91, 0x15, 0xfa, 0x41, 0x97,
0x32, 0x29, 0x6d, 0x5a, 0x0b, 0x88, 0x62, 0x8e, 0x00, 0xca, 0xee, 0x1b, 0x07, 0xa3, 0x51, 0x20, 0x51, 0x81, 0xa0, 0xf8, 0x1d, 0xf9, 0x89, 0x94, 0x49, 0x69, 0xf2, 0x5a, 0x40, 0x14, 0x73, 0x04,
0x68, 0x85, 0xc7, 0x53, 0x86, 0xc2, 0x36, 0x87, 0x41, 0xe2, 0x1f, 0x65, 0xa7, 0x79, 0xba, 0x4c, 0x50, 0xf2, 0xdf, 0x38, 0x18, 0x8d, 0x02, 0x41, 0x2b, 0x1c, 0xa2, 0x32, 0x14, 0xb6, 0x39, 0x0c,
0xe1, 0x32, 0xff, 0xb5, 0x11, 0x2e, 0x13, 0xe9, 0xc0, 0x36, 0x30, 0xbf, 0x90, 0xf3, 0x85, 0x85, 0x12, 0xff, 0x28, 0x3b, 0xec, 0xd3, 0x65, 0x8a, 0xa6, 0xf9, 0xaf, 0x8d, 0x68, 0x9a, 0xc8, 0x16,
0x74, 0xff, 0xb8, 0x02, 0x2d, 0x83, 0x2d, 0xe4, 0x11, 0xb6, 0xad, 0xdb, 0x0d, 0x88, 0xc2, 0x5b, 0xb6, 0x81, 0xf9, 0x85, 0x9c, 0x2f, 0x2c, 0xa4, 0xfb, 0xc7, 0x15, 0x68, 0x19, 0x6c, 0x21, 0x4f,
0xfe, 0xb3, 0x01, 0x61, 0x37, 0xec, 0x16, 0x29, 0x64, 0x4e, 0xc2, 0x6e, 0xb1, 0xcf, 0x55, 0x68, 0xb8, 0x6d, 0xdd, 0x6e, 0x40, 0x14, 0xde, 0x72, 0xaf, 0x0d, 0x08, 0xbb, 0x61, 0xb7, 0x48, 0x11,
0x22, 0xdb, 0x7f, 0x4c, 0xce, 0xba, 0xbc, 0x1f, 0xa3, 0x01, 0x0a, 0x7b, 0x9f, 0xb0, 0xf5, 0x0c, 0x75, 0x12, 0x76, 0x8b, 0x7d, 0xae, 0x42, 0x13, 0xd9, 0xfe, 0x63, 0xf2, 0xe5, 0xe5, 0xf5, 0x19,
0x4b, 0x80, 0x37, 0x1e, 0x7a, 0x3f, 0x80, 0xb6, 0xac, 0x86, 0xd6, 0x97, 0x06, 0x9c, 0x09, 0x9e, 0x0d, 0x50, 0xd8, 0xfb, 0x84, 0xad, 0x67, 0x58, 0x02, 0xbc, 0xf1, 0x4c, 0xfc, 0x01, 0xb4, 0x65,
0xb5, 0xf6, 0x9e, 0x45, 0xa9, 0xbe, 0xbc, 0xaf, 0xbe, 0x6c, 0xbc, 0xed, 0x4b, 0x45, 0xe9, 0x3e, 0x35, 0xb4, 0xbe, 0x34, 0xe0, 0x4c, 0xf0, 0xac, 0xb5, 0xf7, 0x2c, 0x4a, 0xf5, 0xe5, 0x7d, 0xf5,
0xd1, 0xb9, 0x04, 0x4f, 0x62, 0x7f, 0x72, 0xaa, 0x94, 0xc9, 0x3d, 0x58, 0x51, 0x3a, 0x63, 0x1a, 0x65, 0xe3, 0x6d, 0x5f, 0x2a, 0x4a, 0xf7, 0x89, 0x4e, 0x35, 0x78, 0x12, 0xfb, 0x93, 0x53, 0xa5,
0xfa, 0x61, 0x18, 0x4d, 0xc3, 0x01, 0x57, 0x69, 0x63, 0x65, 0x28, 0x77, 0xa8, 0x93, 0x8c, 0xa9, 0x4c, 0xee, 0xc1, 0x8a, 0xd2, 0x19, 0xd3, 0xd0, 0x0f, 0xc3, 0x68, 0x1a, 0x0e, 0xb8, 0xca, 0x2a,
0x22, 0x76, 0x07, 0xea, 0xc2, 0x22, 0x11, 0x5b, 0x60, 0xb9, 0xfa, 0x10, 0x24, 0xec, 0x36, 0xd4, 0x2b, 0x43, 0xb9, 0x43, 0x9d, 0x83, 0x4c, 0x15, 0xb1, 0x3b, 0x50, 0x17, 0x06, 0x8b, 0xd8, 0x02,
0x85, 0x61, 0x52, 0x99, 0x29, 0xf0, 0x82, 0xc0, 0xbd, 0x03, 0x4b, 0x94, 0xd5, 0x6c, 0xeb, 0x3d, 0xcb, 0xd5, 0x87, 0x20, 0x61, 0xb7, 0xa1, 0x2e, 0xec, 0x96, 0xca, 0x4c, 0x81, 0x17, 0x04, 0xee,
0x7b, 0x6b, 0x9c, 0x1b, 0x88, 0xbc, 0xe7, 0x55, 0x60, 0xfb, 0x42, 0x9e, 0xcc, 0x13, 0xc1, 0x5f, 0x1d, 0x58, 0xa2, 0xa4, 0x67, 0x5b, 0xef, 0xd9, 0x5b, 0xe3, 0xdc, 0x40, 0xa4, 0x45, 0xaf, 0x02,
0x55, 0xa1, 0x65, 0x80, 0x51, 0x2f, 0xd1, 0x31, 0x4e, 0x7f, 0x18, 0xf8, 0x63, 0x9e, 0xf2, 0x58, 0xdb, 0x17, 0xf2, 0x64, 0x1e, 0x18, 0xfe, 0xaa, 0x0a, 0x2d, 0x03, 0x8c, 0x7a, 0x89, 0x4e, 0x79,
0xca, 0x50, 0x0e, 0x8a, 0x74, 0xfe, 0xd9, 0x49, 0x3f, 0x9a, 0xa6, 0xfd, 0x21, 0x3f, 0x89, 0x39, 0xfa, 0xc3, 0xc0, 0x1f, 0xf3, 0x94, 0xc7, 0x52, 0x86, 0x72, 0x50, 0xa4, 0xf3, 0xcf, 0x4e, 0xfa,
0x97, 0xfb, 0x75, 0x0e, 0x8a, 0x74, 0xc8, 0xc5, 0x06, 0x9d, 0x38, 0x78, 0xc9, 0x41, 0xd5, 0xf9, 0xd1, 0x34, 0xed, 0x0f, 0xf9, 0x49, 0xcc, 0xb9, 0xdc, 0xaf, 0x73, 0x50, 0xa4, 0x43, 0x2e, 0x36,
0x9e, 0x98, 0xa3, 0x5a, 0x76, 0xbe, 0x27, 0x66, 0x24, 0xaf, 0x51, 0xeb, 0x25, 0x1a, 0xf5, 0x13, 0xe8, 0xc4, 0xb9, 0x4c, 0x0e, 0xaa, 0x8e, 0xff, 0xc4, 0x1c, 0xd5, 0xb2, 0xe3, 0x3f, 0x31, 0x23,
0x58, 0x13, 0xba, 0x53, 0x6a, 0x8d, 0x7e, 0x8e, 0xb1, 0x66, 0x60, 0xd9, 0x1d, 0xe8, 0x60, 0x9f, 0x79, 0x8d, 0x5a, 0x2f, 0xd1, 0xa8, 0x9f, 0xc0, 0x9a, 0xd0, 0x9d, 0x52, 0x6b, 0xf4, 0x73, 0x8c,
0x95, 0x58, 0x24, 0xc1, 0x4f, 0x85, 0x6c, 0x39, 0x5e, 0x01, 0x8e, 0xb4, 0x14, 0x74, 0x36, 0x69, 0x35, 0x03, 0xcb, 0xee, 0x40, 0x07, 0xfb, 0xac, 0xc4, 0x22, 0x09, 0x7e, 0x2a, 0x64, 0xcb, 0xf1,
0x45, 0x92, 0x45, 0x01, 0x4e, 0xb4, 0xfe, 0x6b, 0x9b, 0xb6, 0x29, 0x69, 0x73, 0x70, 0xf6, 0x00, 0x0a, 0x70, 0xa4, 0xa5, 0x98, 0xb4, 0x49, 0x2b, 0x72, 0x30, 0x0a, 0x70, 0xa2, 0xf5, 0x5f, 0xdb,
0xd6, 0xc7, 0x7c, 0x18, 0xf8, 0x76, 0x15, 0x14, 0x03, 0x12, 0x99, 0x5e, 0xb3, 0xd0, 0xd8, 0x0a, 0xb4, 0x4d, 0x49, 0x9b, 0x83, 0xb3, 0x07, 0xb0, 0x3e, 0xe6, 0xc3, 0xc0, 0xb7, 0xab, 0xa0, 0x10,
0xce, 0xc2, 0x4f, 0xa3, 0xf1, 0x51, 0x20, 0x36, 0x34, 0x11, 0x1e, 0xaf, 0x79, 0x05, 0xb8, 0xbb, 0x91, 0x48, 0x04, 0x9b, 0x85, 0xc6, 0x56, 0x70, 0x16, 0x7e, 0x1a, 0x8d, 0x8f, 0x02, 0xb1, 0xa1,
0x00, 0xad, 0xc3, 0x34, 0x9a, 0xa8, 0xa5, 0x5f, 0x84, 0xb6, 0x28, 0xca, 0x24, 0xc1, 0xf7, 0xe0, 0x89, 0xe8, 0x79, 0xcd, 0x2b, 0xc0, 0xdd, 0x05, 0x68, 0x1d, 0xa6, 0xd1, 0x44, 0x2d, 0xfd, 0x22,
0x0a, 0xf1, 0xea, 0xf3, 0x68, 0x12, 0x8d, 0xa2, 0x93, 0x0b, 0xcb, 0xc9, 0xfd, 0xf7, 0x0e, 0xac, 0xb4, 0x45, 0x51, 0xe6, 0x10, 0xbe, 0x07, 0x57, 0x88, 0x57, 0x9f, 0x47, 0x93, 0x68, 0x14, 0x9d,
0x58, 0xd8, 0xcc, 0xcb, 0xa5, 0x88, 0x9c, 0xca, 0xee, 0x12, 0xec, 0xbd, 0x6c, 0x6c, 0x07, 0x82, 0x5c, 0x58, 0x3e, 0xf0, 0xbf, 0x77, 0x60, 0xc5, 0xc2, 0x66, 0x4e, 0x30, 0x05, 0xec, 0x54, 0xf2,
0x50, 0x1c, 0x7e, 0xbc, 0x90, 0x09, 0x5f, 0x9b, 0xd9, 0x75, 0x05, 0xf5, 0xa1, 0xe0, 0xf5, 0x6e, 0x97, 0x60, 0xef, 0x65, 0x63, 0x3b, 0x10, 0x84, 0xe2, 0x6c, 0xe4, 0x85, 0xcc, 0x07, 0xdb, 0xcc,
0x91, 0xd7, 0xe5, 0xf7, 0xea, 0x22, 0x83, 0xaa, 0xe2, 0xf7, 0x64, 0x4a, 0xcc, 0x50, 0x0e, 0xba, 0x6e, 0x33, 0xa8, 0x0f, 0x05, 0xaf, 0x77, 0x8b, 0xbc, 0x2e, 0xbf, 0x57, 0xf7, 0x1c, 0x54, 0x15,
0x6a, 0xa7, 0x31, 0x98, 0x41, 0x11, 0xd5, 0x83, 0x81, 0x06, 0x26, 0xee, 0xcf, 0x1d, 0x80, 0xac, 0xbf, 0x27, 0x33, 0x66, 0x86, 0x72, 0xd0, 0x55, 0x3b, 0xcb, 0xc1, 0x8c, 0x99, 0xa8, 0x1e, 0x0c,
0x77, 0x94, 0x48, 0xa1, 0xb7, 0x34, 0x71, 0x1d, 0xd6, 0xd8, 0xbe, 0x3e, 0x84, 0xb6, 0x3e, 0x0b, 0x34, 0x30, 0x71, 0x7f, 0xee, 0x00, 0x64, 0xbd, 0xa3, 0x3c, 0x0b, 0xbd, 0xa5, 0x89, 0xdb, 0xb2,
0xcf, 0x76, 0xc9, 0x96, 0x82, 0xa1, 0x55, 0x71, 0x0b, 0x96, 0x4e, 0x46, 0xd1, 0x11, 0x59, 0x2f, 0xc6, 0xf6, 0xf5, 0x21, 0xb4, 0xf5, 0x51, 0x79, 0xb6, 0x4b, 0xb6, 0x14, 0x0c, 0xad, 0x8a, 0x5b,
0x94, 0x75, 0x9a, 0xc8, 0x54, 0xc9, 0x45, 0x01, 0x7e, 0x2c, 0xa1, 0xd9, 0x96, 0x5a, 0x33, 0xb7, 0xb0, 0x74, 0x32, 0x8a, 0x8e, 0xc8, 0x7a, 0xa1, 0xa4, 0xd4, 0x44, 0x66, 0x52, 0x2e, 0x0a, 0xf0,
0xd4, 0xf2, 0x0d, 0xf2, 0x6f, 0x57, 0xf4, 0x81, 0x64, 0x36, 0x13, 0x33, 0x25, 0x9c, 0xdd, 0x2f, 0x63, 0x09, 0xcd, 0xb6, 0xd4, 0x9a, 0xb9, 0xa5, 0x96, 0x6f, 0x90, 0x7f, 0xab, 0xa2, 0xcf, 0x2b,
0xa8, 0xf3, 0x19, 0xe7, 0x7f, 0x64, 0xdf, 0x1f, 0xbc, 0x35, 0x3e, 0xfa, 0x10, 0x16, 0x63, 0xa1, 0xb3, 0x99, 0x98, 0x29, 0xe1, 0xec, 0x7e, 0x41, 0x9d, 0xcf, 0x38, 0x1e, 0x24, 0xfb, 0xfe, 0xe0,
0x2b, 0x95, 0x22, 0xad, 0xbd, 0x41, 0x91, 0x2e, 0xc4, 0xd6, 0x6e, 0xfc, 0x55, 0xe8, 0xf8, 0xc3, 0xad, 0xe1, 0xd3, 0x87, 0xb0, 0x18, 0x0b, 0x5d, 0xa9, 0x14, 0x69, 0xed, 0x0d, 0x8a, 0x74, 0x21,
0x33, 0x1e, 0xa7, 0x01, 0xc5, 0x8b, 0xc8, 0x74, 0x12, 0x83, 0x5b, 0x32, 0xe0, 0x64, 0xa1, 0xdc, 0xb6, 0x76, 0xe3, 0xaf, 0x42, 0xc7, 0x1f, 0x9e, 0xf1, 0x38, 0x0d, 0x28, 0x9c, 0x44, 0xa6, 0x93,
0x82, 0x25, 0x99, 0xb4, 0xaa, 0x29, 0xe5, 0xc5, 0xb2, 0x0c, 0x8c, 0x84, 0xee, 0x2f, 0xd4, 0xd9, 0x18, 0xdc, 0x92, 0x01, 0x27, 0x0b, 0xe5, 0x16, 0x2c, 0xc9, 0x9c, 0x56, 0x4d, 0x29, 0xef, 0x9d,
0xa7, 0xbd, 0xb2, 0xb3, 0x67, 0xc4, 0x1c, 0x5d, 0x25, 0x37, 0xba, 0xaf, 0xc8, 0x73, 0xc8, 0xa1, 0x65, 0x60, 0x24, 0x74, 0x7f, 0xa1, 0x8e, 0x46, 0xed, 0x95, 0x9d, 0x3d, 0x23, 0xe6, 0xe8, 0x2a,
0x0a, 0x4a, 0x55, 0x8d, 0xa4, 0xaa, 0xa1, 0x3c, 0x37, 0xb6, 0xa7, 0xb4, 0xf6, 0x2e, 0x53, 0xea, 0xb9, 0xd1, 0x7d, 0x45, 0x1e, 0x53, 0x0e, 0x55, 0xcc, 0xaa, 0x6a, 0xe4, 0x5c, 0x0d, 0xe5, 0xb1,
0xfe, 0x89, 0x03, 0xf3, 0xbb, 0xd1, 0x64, 0x57, 0xa6, 0x97, 0x91, 0x78, 0xe8, 0x6c, 0x71, 0x55, 0xb2, 0x3d, 0xa5, 0xb5, 0x77, 0x99, 0x52, 0xf7, 0x4f, 0x1c, 0x98, 0xdf, 0x8d, 0x26, 0xbb, 0x32,
0x7c, 0x43, 0xe2, 0x59, 0xa9, 0x05, 0xb2, 0x90, 0xb7, 0x40, 0xfe, 0x3c, 0xbc, 0x47, 0x21, 0xd1, 0xfb, 0x8c, 0xc4, 0x43, 0x27, 0x93, 0xab, 0xe2, 0x1b, 0xf2, 0xd2, 0x4a, 0x2d, 0x90, 0x85, 0xbc,
0x38, 0x9a, 0x44, 0x31, 0x8a, 0xa8, 0x3f, 0x12, 0xe6, 0x46, 0x14, 0xa6, 0xa7, 0x4a, 0x85, 0xbe, 0x05, 0xf2, 0xe7, 0xe1, 0x3d, 0x8a, 0x98, 0xc6, 0xd1, 0x24, 0x8a, 0x51, 0x44, 0xfd, 0x91, 0x30,
0x89, 0x84, 0xe2, 0x14, 0xe8, 0x7e, 0x0b, 0xcf, 0x45, 0x5a, 0x4c, 0x42, 0xb3, 0x16, 0x11, 0xee, 0x37, 0xa2, 0x30, 0x3d, 0x55, 0x2a, 0xf4, 0x4d, 0x24, 0x14, 0xc6, 0x40, 0xef, 0x52, 0x78, 0x2e,
0xef, 0x42, 0x93, 0xbc, 0x09, 0x1a, 0xd6, 0x47, 0xd0, 0x3c, 0x8d, 0x26, 0xfd, 0xd3, 0x20, 0x4c, 0xd2, 0x62, 0x12, 0x9a, 0xb5, 0x88, 0x70, 0x7f, 0x17, 0x9a, 0xe4, 0x4d, 0xd0, 0xb0, 0x3e, 0x82,
0x95, 0xc8, 0x2f, 0x66, 0x66, 0xfe, 0x2e, 0x4d, 0x88, 0x26, 0x70, 0xff, 0x78, 0x0e, 0xe6, 0x9f, 0xe6, 0x69, 0x34, 0xe9, 0x9f, 0x06, 0x61, 0xaa, 0x44, 0x7e, 0x31, 0x33, 0xf3, 0x77, 0x69, 0x42,
0x86, 0x67, 0x51, 0x30, 0xa0, 0x73, 0xd6, 0x31, 0x1f, 0x47, 0x2a, 0x77, 0x1e, 0x7f, 0xb3, 0xab, 0x34, 0x81, 0xfb, 0xc7, 0x73, 0x30, 0xff, 0x34, 0x3c, 0x8b, 0x82, 0x01, 0x1d, 0xc3, 0x8e, 0xf9,
0x30, 0x4f, 0xc9, 0xa2, 0x13, 0xc1, 0xb4, 0x6d, 0x91, 0x4f, 0x21, 0x41, 0x74, 0xe3, 0x33, 0xbb, 0x38, 0x52, 0xa9, 0xf5, 0xf8, 0x9b, 0x5d, 0x85, 0x79, 0xca, 0x25, 0x9d, 0x08, 0xa6, 0x6d, 0x8b,
0xf7, 0x26, 0x84, 0xca, 0x80, 0xa0, 0x27, 0x16, 0x9b, 0xf7, 0xd6, 0x64, 0x29, 0xbb, 0x9b, 0x50, 0x74, 0x0b, 0x09, 0xa2, 0x0b, 0xa1, 0xd9, 0xb5, 0x38, 0x21, 0x54, 0x06, 0x04, 0x3d, 0xb1, 0xd8,
0x37, 0xee, 0x26, 0x60, 0x5b, 0x32, 0x1d, 0x4e, 0xe4, 0x4b, 0x89, 0xb6, 0x24, 0x88, 0xbc, 0xc7, 0xbc, 0xd6, 0x26, 0x4b, 0xd9, 0xd5, 0x85, 0xba, 0x71, 0x75, 0x01, 0xdb, 0x92, 0xd9, 0x72, 0x22,
0x98, 0x8b, 0x90, 0xb6, 0x36, 0xb2, 0xd0, 0x7b, 0x34, 0x81, 0x68, 0x88, 0x89, 0x0f, 0x04, 0x8d, 0x9d, 0x4a, 0xb4, 0x25, 0x41, 0xe4, 0x3d, 0xc6, 0x5c, 0x44, 0xbc, 0xb5, 0x91, 0x85, 0xde, 0xa3,
0xd8, 0x00, 0x4c, 0x10, 0x9a, 0xa2, 0xf9, 0xab, 0x92, 0xe2, 0xaa, 0x6a, 0x1e, 0x8c, 0xfa, 0x7b, 0x09, 0x44, 0x43, 0x4c, 0x7c, 0x20, 0x68, 0xc4, 0x06, 0x60, 0x82, 0xd0, 0x14, 0xcd, 0xdf, 0xa4,
0xc8, 0xb5, 0x9a, 0x15, 0xe3, 0x00, 0x71, 0xb7, 0x2f, 0x0f, 0x37, 0x7c, 0x4e, 0x91, 0xd7, 0xab, 0x14, 0x37, 0x59, 0xf3, 0x60, 0xd4, 0xdf, 0x43, 0xae, 0xd5, 0xac, 0x18, 0x07, 0x88, 0xab, 0x7f,
0x7c, 0x4e, 0x64, 0x18, 0x7f, 0x34, 0x3a, 0xf2, 0x07, 0xaf, 0xe8, 0xa6, 0x2c, 0x9d, 0x7c, 0x36, 0x79, 0xb8, 0xe1, 0x73, 0x8a, 0xb4, 0x5f, 0xe5, 0x73, 0x22, 0xc3, 0xf8, 0xa3, 0xd1, 0x91, 0x3f,
0x3d, 0x1b, 0x48, 0x49, 0x6d, 0xd9, 0xaa, 0x52, 0xe6, 0x49, 0xcd, 0x33, 0x41, 0xec, 0x3e, 0xb4, 0x78, 0x45, 0x17, 0x69, 0xe9, 0x60, 0xb4, 0xe9, 0xd9, 0x40, 0xca, 0x79, 0xcb, 0x56, 0x95, 0x12,
0xc8, 0x17, 0x97, 0xeb, 0xba, 0x48, 0xeb, 0xda, 0x31, 0x9d, 0x75, 0x5a, 0x59, 0x93, 0xc8, 0x3c, 0x53, 0x6a, 0x9e, 0x09, 0x62, 0xf7, 0xa1, 0x45, 0xbe, 0xb8, 0x5c, 0xd7, 0x45, 0x5a, 0xd7, 0x8e,
0x03, 0x5e, 0x2a, 0x64, 0xda, 0xfa, 0xc3, 0xa1, 0x3c, 0x3a, 0xef, 0x88, 0xb8, 0x82, 0x06, 0x90, 0xe9, 0xac, 0xd3, 0xca, 0x9a, 0x44, 0xe6, 0x11, 0xf1, 0x52, 0x21, 0x11, 0xd7, 0x1f, 0x0e, 0xe5,
0xb7, 0x2f, 0x26, 0x4c, 0x10, 0x2c, 0x13, 0x81, 0x05, 0x63, 0xd7, 0xa0, 0x81, 0x1e, 0xde, 0xc4, 0xc9, 0x7a, 0x47, 0xc4, 0x15, 0x34, 0x80, 0xbc, 0x7d, 0x31, 0x61, 0x82, 0x60, 0x99, 0x08, 0x2c,
0x0f, 0x86, 0x94, 0x6c, 0x22, 0x1c, 0x4d, 0x0d, 0xc3, 0x3a, 0xd4, 0x6f, 0xda, 0x2a, 0x57, 0x68, 0x18, 0xbb, 0x06, 0x0d, 0xf4, 0xf0, 0x26, 0x7e, 0x30, 0xa4, 0x5c, 0x14, 0xe1, 0x68, 0x6a, 0x18,
0x56, 0x2c, 0x18, 0xce, 0x8d, 0x2e, 0x8f, 0xb3, 0xd4, 0x5c, 0x1b, 0xc8, 0x3e, 0xa6, 0x03, 0xcc, 0xd6, 0xa1, 0x7e, 0xd3, 0x56, 0xb9, 0x42, 0xb3, 0x62, 0xc1, 0x70, 0x6e, 0x74, 0x79, 0x9c, 0x65,
0x94, 0x53, 0xfe, 0xed, 0xe2, 0xfd, 0xf7, 0xe4, 0x98, 0x25, 0xd3, 0xaa, 0xbf, 0x87, 0x48, 0xe2, 0xee, 0xda, 0x40, 0xf6, 0x31, 0x9d, 0x6f, 0xa6, 0x9c, 0xd2, 0x73, 0x17, 0xef, 0xbf, 0x27, 0xc7,
0x09, 0x4a, 0x34, 0xd2, 0x44, 0x0c, 0x79, 0xcd, 0x32, 0xd2, 0x24, 0x29, 0xc5, 0x90, 0x05, 0x81, 0x2c, 0x99, 0x56, 0xfd, 0x3d, 0x44, 0x12, 0x4f, 0x50, 0xa2, 0x91, 0x26, 0x42, 0xcc, 0x6b, 0x96,
0xbb, 0x09, 0x6d, 0xb3, 0x02, 0xd6, 0x80, 0xda, 0xb3, 0x83, 0x9d, 0xfd, 0xce, 0x25, 0xd6, 0x82, 0x91, 0x26, 0x49, 0x29, 0xc4, 0x2c, 0x08, 0xdc, 0x4d, 0x68, 0x9b, 0x15, 0xb0, 0x06, 0xd4, 0x9e,
0xf9, 0xc3, 0x9d, 0xe7, 0xcf, 0xf7, 0x76, 0xb6, 0x3b, 0x0e, 0x6b, 0x43, 0x43, 0xe7, 0x2a, 0x56, 0x1d, 0xec, 0xec, 0x77, 0x2e, 0xb1, 0x16, 0xcc, 0x1f, 0xee, 0x3c, 0x7f, 0xbe, 0xb7, 0xb3, 0xdd,
0xb0, 0xb4, 0xb9, 0xb5, 0xb5, 0x73, 0xf0, 0x7c, 0x67, 0xbb, 0x53, 0x75, 0xff, 0xb0, 0x02, 0x2d, 0x71, 0x58, 0x1b, 0x1a, 0x3a, 0x95, 0xb1, 0x82, 0xa5, 0xcd, 0xad, 0xad, 0x9d, 0x83, 0xe7, 0x3b,
0xa3, 0xe6, 0x37, 0xc4, 0x3f, 0xae, 0x01, 0x90, 0xc7, 0x90, 0x65, 0x2c, 0xd4, 0x3c, 0x03, 0x82, 0xdb, 0x9d, 0xaa, 0xfb, 0x87, 0x15, 0x68, 0x19, 0x35, 0xbf, 0x21, 0xfe, 0x71, 0x0d, 0x80, 0x3c,
0x1a, 0x51, 0xfb, 0xd2, 0x55, 0x71, 0xc5, 0x4f, 0x95, 0x69, 0xae, 0xe8, 0x2e, 0x9d, 0x19, 0xa6, 0x86, 0x2c, 0xa1, 0xa1, 0xe6, 0x19, 0x10, 0xd4, 0x88, 0xda, 0x97, 0xae, 0x8a, 0x1b, 0x80, 0xaa,
0xaf, 0x7b, 0x36, 0x10, 0xf9, 0x48, 0x02, 0x28, 0x6d, 0x4e, 0x48, 0x97, 0x09, 0xc2, 0x75, 0x89, 0x4c, 0x73, 0x45, 0x57, 0xed, 0xcc, 0x28, 0x7e, 0xdd, 0xb3, 0x81, 0xc8, 0x47, 0x12, 0x40, 0x59,
0x79, 0x12, 0x8d, 0xce, 0xb8, 0x20, 0x11, 0xf6, 0x97, 0x05, 0xc3, 0xb6, 0xa4, 0x7a, 0x31, 0x52, 0x75, 0x42, 0xba, 0x4c, 0x10, 0xae, 0x4b, 0xcc, 0x93, 0x68, 0x74, 0xc6, 0x05, 0x89, 0xb0, 0xbf,
0x5a, 0xeb, 0x9e, 0x0d, 0x64, 0x5f, 0x57, 0xeb, 0xd2, 0xa0, 0x75, 0x59, 0x2f, 0x4e, 0xb2, 0xb9, 0x2c, 0x18, 0xb6, 0x25, 0xd5, 0x8b, 0x91, 0xf1, 0x5a, 0xf7, 0x6c, 0x20, 0xfb, 0xba, 0x5a, 0x97,
0x26, 0x6e, 0x0a, 0x6c, 0x73, 0x38, 0x94, 0x58, 0xf3, 0xc2, 0x60, 0x6c, 0xde, 0x4e, 0x55, 0x0a, 0x06, 0xad, 0xcb, 0x7a, 0x71, 0x92, 0xcd, 0x35, 0x71, 0x53, 0x60, 0x9b, 0xc3, 0xa1, 0xc4, 0x9a,
0xa2, 0x44, 0x48, 0x2b, 0xe5, 0x42, 0xfa, 0x46, 0x56, 0x76, 0x77, 0xa0, 0x75, 0x60, 0xdc, 0x77, 0xf7, 0x09, 0x63, 0xf3, 0xf2, 0xaa, 0x52, 0x10, 0x25, 0x42, 0x5a, 0x29, 0x17, 0xd2, 0x37, 0xb2,
0x25, 0x7d, 0xa5, 0x6e, 0xba, 0x4a, 0x3d, 0x67, 0x40, 0x8c, 0xee, 0x54, 0xcc, 0xee, 0xb8, 0x7f, 0xb2, 0xbb, 0x03, 0xad, 0x03, 0xe3, 0x3a, 0x2c, 0xe9, 0x2b, 0x75, 0x11, 0x56, 0xea, 0x39, 0x03,
0xe8, 0x88, 0x2b, 0x44, 0xba, 0xfb, 0xa2, 0x6d, 0x17, 0xda, 0x3a, 0x08, 0x9b, 0x65, 0x6b, 0x5b, 0x62, 0x74, 0xa7, 0x62, 0x76, 0xc7, 0xfd, 0x43, 0x47, 0xdc, 0x30, 0xd2, 0xdd, 0x17, 0x6d, 0xbb,
0x30, 0xa4, 0xa1, 0xae, 0xf4, 0xa3, 0xe3, 0xe3, 0x84, 0xab, 0xdc, 0x4a, 0x0b, 0xa6, 0x0c, 0x45, 0xd0, 0xd6, 0x31, 0xda, 0x2c, 0x99, 0xdb, 0x82, 0x21, 0x0d, 0x75, 0xa5, 0x1f, 0x1d, 0x1f, 0x27,
0x34, 0x3d, 0x03, 0xd1, 0x42, 0x22, 0x73, 0x2c, 0x0b, 0x70, 0x64, 0x12, 0x19, 0xea, 0x53, 0x59, 0x5c, 0xa5, 0x5e, 0x5a, 0x30, 0x65, 0x28, 0xa2, 0xe9, 0x19, 0x88, 0x16, 0x12, 0x99, 0x82, 0x59,
0xa5, 0xba, 0xac, 0x93, 0xca, 0xf3, 0xb3, 0x7c, 0x07, 0x1a, 0xba, 0x5e, 0x7b, 0x47, 0x50, 0x94, 0x80, 0x23, 0x93, 0xc8, 0x50, 0x9f, 0x4a, 0x3a, 0xd5, 0x65, 0x9d, 0x73, 0x9e, 0x9f, 0xe5, 0x3b,
0x1a, 0x8f, 0x3b, 0x0f, 0x39, 0x90, 0x56, 0xa7, 0x05, 0xaf, 0x16, 0x11, 0x6c, 0x03, 0xd8, 0x71, 0xd0, 0xd0, 0xf5, 0xda, 0x3b, 0x82, 0xa2, 0xd4, 0x78, 0xdc, 0x79, 0xc8, 0x81, 0xb4, 0x3a, 0x2d,
0x10, 0xe7, 0xc9, 0x05, 0xf3, 0x96, 0x60, 0xdc, 0x97, 0xb0, 0xa2, 0xe4, 0xcd, 0xb0, 0x60, 0xed, 0x78, 0xb5, 0x88, 0x60, 0x1b, 0xc0, 0x8e, 0x83, 0x38, 0x4f, 0x2e, 0x98, 0xb7, 0x04, 0xe3, 0xbe,
0x45, 0x74, 0xde, 0xa6, 0x8f, 0x2a, 0x45, 0x7d, 0xe4, 0xfe, 0x69, 0x15, 0xe6, 0xe5, 0x4a, 0x17, 0x84, 0x15, 0x25, 0x6f, 0x86, 0x05, 0x6b, 0x2f, 0xa2, 0xf3, 0x36, 0x7d, 0x54, 0x29, 0xea, 0x23,
0xee, 0x4c, 0x8b, 0x75, 0xb6, 0x60, 0xac, 0x6b, 0xdd, 0x8e, 0x23, 0xe5, 0x25, 0x77, 0xa1, 0xc2, 0xf7, 0x4f, 0xab, 0x30, 0x2f, 0x57, 0xba, 0x70, 0xa5, 0x5a, 0xac, 0xb3, 0x05, 0x63, 0x5d, 0xeb,
0x3e, 0x53, 0x2d, 0xdb, 0x67, 0x18, 0xd4, 0x26, 0x7e, 0x7a, 0x4a, 0x21, 0x96, 0xa6, 0x47, 0xbf, 0xf2, 0x1c, 0x29, 0x2f, 0xb9, 0x0b, 0x15, 0xf6, 0x99, 0x6a, 0xd9, 0x3e, 0xc3, 0xa0, 0x36, 0xf1,
0x55, 0x34, 0xb2, 0x6e, 0x47, 0x23, 0xcb, 0x6e, 0x88, 0x0b, 0x13, 0xaa, 0x78, 0x43, 0xfc, 0x2a, 0xd3, 0x53, 0x0a, 0xb1, 0x34, 0x3d, 0xfa, 0xad, 0xa2, 0x91, 0x75, 0x3b, 0x1a, 0x59, 0x76, 0x81,
0x34, 0xc5, 0xad, 0xe2, 0x2c, 0xe0, 0x98, 0x01, 0x90, 0x7b, 0x45, 0x81, 0x34, 0x84, 0xbc, 0xac, 0x5c, 0x98, 0x50, 0xc5, 0x0b, 0xe4, 0x57, 0xa1, 0x29, 0x2e, 0x1d, 0x67, 0x01, 0xc7, 0x0c, 0x80,
0x92, 0x41, 0xbe, 0xc4, 0xce, 0xf6, 0x4d, 0x98, 0x13, 0xb7, 0x25, 0x64, 0xee, 0xec, 0x55, 0x75, 0xdc, 0x2b, 0x0a, 0xa4, 0x21, 0xe4, 0x5d, 0x96, 0x0c, 0xf2, 0x25, 0x76, 0xb6, 0x6f, 0xc2, 0x9c,
0xca, 0x26, 0xe8, 0xd4, 0x5f, 0x91, 0x84, 0xe3, 0x49, 0x5a, 0xf3, 0xae, 0x65, 0xcb, 0xbe, 0x6b, 0xb8, 0x4c, 0x21, 0x53, 0x6b, 0xaf, 0xaa, 0x43, 0x38, 0x41, 0xa7, 0xfe, 0x8a, 0x1c, 0x1d, 0x4f,
0x69, 0xc6, 0x49, 0xdb, 0x76, 0x9c, 0xd4, 0x7d, 0x0c, 0x0b, 0x56, 0x75, 0xa8, 0x59, 0x65, 0xee, 0xd2, 0x9a, 0x57, 0x31, 0x5b, 0xf6, 0x55, 0x4c, 0x33, 0x4e, 0xda, 0xb6, 0xe3, 0xa4, 0xee, 0x63,
0x6d, 0xe7, 0x12, 0x5b, 0x80, 0xe6, 0xd3, 0xfd, 0xfe, 0xe3, 0xbd, 0xa7, 0x4f, 0x76, 0x9f, 0x77, 0x58, 0xb0, 0xaa, 0x43, 0xcd, 0x2a, 0x53, 0x73, 0x3b, 0x97, 0xd8, 0x02, 0x34, 0x9f, 0xee, 0xf7,
0x1c, 0x2c, 0x1e, 0xbe, 0xd8, 0xda, 0xda, 0xd9, 0xd9, 0x26, 0x4d, 0x0b, 0x30, 0xf7, 0x78, 0xf3, 0x1f, 0xef, 0x3d, 0x7d, 0xb2, 0xfb, 0xbc, 0xe3, 0x60, 0xf1, 0xf0, 0xc5, 0xd6, 0xd6, 0xce, 0xce,
0xe9, 0x1e, 0xe9, 0xd9, 0x6d, 0xc1, 0xdb, 0xb2, 0x2e, 0x7d, 0xb2, 0xf1, 0x75, 0x60, 0xca, 0xc7, 0x36, 0x69, 0x5a, 0x80, 0xb9, 0xc7, 0x9b, 0x4f, 0xf7, 0x48, 0xcf, 0x6e, 0x0b, 0xde, 0x96, 0x75,
0xa7, 0x1c, 0x9c, 0xc9, 0x88, 0xa7, 0x2a, 0x2d, 0x7c, 0x59, 0x62, 0x9e, 0x6a, 0x84, 0xba, 0xd5, 0xe9, 0x83, 0x8f, 0xaf, 0x03, 0x53, 0x3e, 0x3e, 0xa5, 0xe8, 0x4c, 0x46, 0x3c, 0x55, 0x59, 0xe3,
0x90, 0xd5, 0x92, 0x89, 0x88, 0x9c, 0xa4, 0xbc, 0x88, 0x48, 0x52, 0x4f, 0xe3, 0xdd, 0x1e, 0x74, 0xcb, 0x12, 0xf3, 0x54, 0x23, 0xd4, 0xa5, 0x87, 0xac, 0x96, 0x4c, 0x44, 0xe4, 0x24, 0xe5, 0x45,
0xb7, 0x39, 0xd6, 0xb6, 0x39, 0x1a, 0xe5, 0xba, 0x83, 0x8e, 0x5a, 0x09, 0x4e, 0x7a, 0x71, 0xdf, 0x44, 0x92, 0x7a, 0x1a, 0xef, 0xf6, 0xa0, 0xbb, 0xcd, 0xb1, 0xb6, 0xcd, 0xd1, 0x28, 0xd7, 0x1d,
0x85, 0xcb, 0x9b, 0x22, 0x03, 0xfc, 0xb7, 0x95, 0x20, 0xe8, 0x76, 0x61, 0x2d, 0x5f, 0xa5, 0x6c, 0x74, 0xd4, 0x4a, 0x70, 0xd2, 0x8b, 0xfb, 0x2e, 0x5c, 0xde, 0x14, 0x09, 0xe2, 0xbf, 0xad, 0xfc,
0xec, 0x31, 0x2c, 0x6f, 0xf3, 0xa3, 0xe9, 0xc9, 0x1e, 0x3f, 0xcb, 0x1a, 0x62, 0x50, 0x4b, 0x4e, 0x41, 0xb7, 0x0b, 0x6b, 0xf9, 0x2a, 0x65, 0x63, 0x8f, 0x61, 0x79, 0x9b, 0x1f, 0x4d, 0x4f, 0xf6,
0xa3, 0x73, 0x39, 0x3f, 0xf4, 0x9b, 0xbd, 0x0f, 0x30, 0x42, 0x9a, 0x7e, 0x32, 0xe1, 0x03, 0x75, 0xf8, 0x59, 0xd6, 0x10, 0x83, 0x5a, 0x72, 0x1a, 0x9d, 0xcb, 0xf9, 0xa1, 0xdf, 0xec, 0x7d, 0x80,
0x43, 0x8f, 0x20, 0x87, 0x13, 0x3e, 0x70, 0x3f, 0x01, 0x66, 0xd6, 0x23, 0xe7, 0x0b, 0xed, 0xac, 0x11, 0xd2, 0xf4, 0x93, 0x09, 0x1f, 0xa8, 0x0b, 0x7c, 0x04, 0x39, 0x9c, 0xf0, 0x81, 0xfb, 0x09,
0xe9, 0x51, 0x3f, 0xb9, 0x48, 0x52, 0x3e, 0x56, 0x57, 0x0f, 0x4d, 0x90, 0x7b, 0x0b, 0xda, 0x07, 0x30, 0xb3, 0x1e, 0x39, 0x5f, 0x68, 0x67, 0x4d, 0x8f, 0xfa, 0xc9, 0x45, 0x92, 0xf2, 0xb1, 0xba,
0xfe, 0x85, 0xc7, 0x7f, 0x22, 0xdf, 0x0e, 0x58, 0x87, 0xf9, 0x89, 0x7f, 0x81, 0x2c, 0xa8, 0x83, 0x99, 0x68, 0x82, 0xdc, 0x5b, 0xd0, 0x3e, 0xf0, 0x2f, 0x3c, 0xfe, 0x13, 0xf9, 0xb4, 0xc0, 0x3a,
0xbe, 0x84, 0x76, 0xff, 0x77, 0x05, 0xe6, 0x04, 0x25, 0xd6, 0x3a, 0xe4, 0x49, 0x1a, 0x84, 0x24, 0xcc, 0x4f, 0xfc, 0x0b, 0x64, 0x41, 0x1d, 0xf4, 0x25, 0xb4, 0xfb, 0xbf, 0x2b, 0x30, 0x27, 0x28,
0x69, 0xaa, 0x56, 0x03, 0x54, 0x90, 0xed, 0x4a, 0x89, 0x6c, 0xcb, 0x88, 0x84, 0xba, 0xed, 0x24, 0xb1, 0xd6, 0x21, 0x4f, 0xd2, 0x20, 0x24, 0x49, 0x53, 0xb5, 0x1a, 0xa0, 0x82, 0x6c, 0x57, 0x4a,
0x05, 0xd8, 0x82, 0xa1, 0xa4, 0x65, 0x99, 0xbe, 0x22, 0x34, 0x98, 0x01, 0x72, 0x27, 0x08, 0x99, 0x64, 0x5b, 0x46, 0x24, 0xd4, 0x65, 0x28, 0x29, 0xc0, 0x16, 0x0c, 0x25, 0x2d, 0x4b, 0x04, 0x16,
0x35, 0x27, 0xfa, 0xa7, 0xd4, 0x96, 0x14, 0x63, 0x13, 0x54, 0x6a, 0x33, 0xce, 0x0b, 0x69, 0x2f, 0xa1, 0xc1, 0x0c, 0x90, 0x3b, 0x41, 0xc8, 0xac, 0x39, 0xd1, 0x3f, 0xa5, 0xb6, 0xa4, 0x18, 0x9b,
0xd8, 0x8c, 0x05, 0xdb, 0xb0, 0xf1, 0x0e, 0xb6, 0xa1, 0x08, 0x53, 0xbc, 0xc9, 0x36, 0x84, 0x77, 0xa0, 0x52, 0x9b, 0x71, 0x5e, 0x48, 0x7b, 0xc1, 0x66, 0x2c, 0xd8, 0x86, 0x8d, 0x77, 0xb0, 0x0d,
0xb0, 0x0d, 0x5d, 0x06, 0x1d, 0xba, 0x46, 0x8d, 0xde, 0x87, 0xe2, 0xdd, 0x7f, 0xe0, 0x40, 0x47, 0x45, 0x98, 0xe2, 0x4d, 0xb6, 0x21, 0xbc, 0x83, 0x6d, 0xe8, 0x32, 0xe8, 0xd0, 0x2d, 0x6b, 0xf4,
0x72, 0x91, 0xc6, 0xb1, 0x0f, 0x2d, 0x2f, 0xab, 0xf4, 0x9e, 0xce, 0x0d, 0x58, 0x20, 0xdf, 0x47, 0x3e, 0x14, 0xef, 0xfe, 0x7d, 0x07, 0x3a, 0x92, 0x8b, 0x34, 0x8e, 0x7d, 0x68, 0x79, 0x59, 0xa5,
0xab, 0x00, 0x79, 0xae, 0x63, 0x01, 0x71, 0x1c, 0x2a, 0x4f, 0x64, 0x1c, 0x8c, 0xe4, 0xa2, 0x98, 0xd7, 0x78, 0x6e, 0xc0, 0x02, 0xf9, 0x3e, 0x5a, 0x05, 0xc8, 0x73, 0x1d, 0x0b, 0x88, 0xe3, 0x50,
0x20, 0xa5, 0x45, 0x62, 0x5f, 0x66, 0xac, 0x3a, 0x9e, 0x2e, 0xbb, 0x7f, 0xe4, 0xc0, 0xb2, 0xd1, 0x69, 0x24, 0xe3, 0x60, 0x24, 0x17, 0xc5, 0x04, 0x29, 0x2d, 0x12, 0xfb, 0x32, 0xa1, 0xd5, 0xf1,
0x61, 0xc9, 0x85, 0x0f, 0xa1, 0xad, 0x5f, 0x2b, 0xe0, 0x7a, 0x73, 0x5b, 0xb7, 0xc5, 0x26, 0xfb, 0x74, 0xd9, 0xfd, 0x23, 0x07, 0x96, 0x8d, 0x0e, 0x4b, 0x2e, 0x7c, 0x08, 0x6d, 0xfd, 0x98, 0x01,
0xcc, 0x22, 0xa6, 0xc5, 0xf4, 0x2f, 0xa8, 0x83, 0xc9, 0x74, 0x2c, 0x77, 0x15, 0x13, 0x84, 0x8c, 0xd7, 0x9b, 0xdb, 0xba, 0x2d, 0x36, 0xd9, 0x67, 0x16, 0x31, 0x2d, 0xa6, 0x7f, 0x41, 0x1d, 0x4c,
0x74, 0xce, 0xf9, 0x2b, 0x4d, 0x22, 0xf6, 0x35, 0x0b, 0x46, 0xf1, 0x61, 0xf4, 0xd9, 0x34, 0x51, 0xa6, 0x63, 0xb9, 0xab, 0x98, 0x20, 0x64, 0xa4, 0x73, 0xce, 0x5f, 0x69, 0x12, 0xb1, 0xaf, 0x59,
0x4d, 0xc6, 0x87, 0x4d, 0xa0, 0xfb, 0x57, 0x2a, 0xb0, 0x22, 0x9c, 0x6f, 0x19, 0xf0, 0xd0, 0x17, 0x30, 0x8a, 0x0f, 0xa3, 0xcf, 0xa6, 0x89, 0x6a, 0x32, 0x3e, 0x6c, 0x02, 0xdd, 0xbf, 0x52, 0x81,
0x46, 0xe7, 0x44, 0x0c, 0x42, 0x48, 0xe4, 0xee, 0x25, 0x4f, 0x96, 0xd9, 0xb7, 0xde, 0x31, 0x60, 0x15, 0xe1, 0x7c, 0xcb, 0x80, 0x87, 0xbe, 0x4f, 0x3a, 0x27, 0x62, 0x10, 0x42, 0x22, 0x77, 0x2f,
0xa0, 0xd3, 0x68, 0x67, 0xac, 0x45, 0xb5, 0x6c, 0x2d, 0xde, 0x30, 0xd3, 0x65, 0xa1, 0xfa, 0x7a, 0x79, 0xb2, 0xcc, 0xbe, 0xf5, 0x8e, 0x01, 0x03, 0x9d, 0x65, 0x3b, 0x63, 0x2d, 0xaa, 0x65, 0x6b,
0x79, 0xa8, 0xfe, 0x9d, 0x42, 0xe3, 0x8f, 0xe6, 0xa1, 0x9e, 0x0c, 0xa2, 0x09, 0x77, 0xd7, 0x60, 0xf1, 0x86, 0x99, 0x2e, 0x0b, 0xd5, 0xd7, 0xcb, 0x43, 0xf5, 0xef, 0x14, 0x1a, 0x7f, 0x34, 0x0f,
0xd5, 0x9e, 0x02, 0xa9, 0xa8, 0x7e, 0xee, 0x40, 0xf7, 0xb1, 0x38, 0x75, 0x0b, 0xc2, 0x93, 0xdd, 0xf5, 0x64, 0x10, 0x4d, 0xb8, 0xbb, 0x06, 0xab, 0xf6, 0x14, 0x48, 0x45, 0xf5, 0x73, 0x07, 0xba,
0x20, 0x49, 0xa3, 0x58, 0xdf, 0xbe, 0xbf, 0x06, 0x90, 0xa4, 0x7e, 0x2c, 0x0d, 0x5a, 0x19, 0x26, 0x8f, 0xc5, 0xa9, 0x5b, 0x10, 0x9e, 0xec, 0x06, 0x49, 0x1a, 0xc5, 0xfa, 0x72, 0xfe, 0x35, 0x80,
0xcf, 0x20, 0x38, 0x12, 0x1e, 0x0e, 0x05, 0x56, 0xac, 0xa0, 0x2e, 0x17, 0x4c, 0x2f, 0x19, 0x44, 0x24, 0xf5, 0x63, 0x69, 0xd0, 0xca, 0x30, 0x79, 0x06, 0xc1, 0x91, 0xf0, 0x70, 0x28, 0xb0, 0x62,
0xb0, 0x0c, 0x98, 0x9b, 0x22, 0xf9, 0x1c, 0xbb, 0xcc, 0xcf, 0x48, 0xfb, 0x0b, 0xef, 0x3c, 0x07, 0x05, 0x75, 0xb9, 0x60, 0x7a, 0xc9, 0x20, 0x82, 0x65, 0xc0, 0xdc, 0x14, 0xb9, 0xe9, 0xd8, 0x65,
0x75, 0xff, 0xa3, 0x03, 0x4b, 0x59, 0x27, 0x29, 0x49, 0xc2, 0xd6, 0x21, 0xd2, 0x6a, 0xc9, 0x74, 0x7e, 0x46, 0xda, 0x5f, 0x78, 0xe7, 0x39, 0xa8, 0xfb, 0x1f, 0x1d, 0x58, 0xca, 0x3a, 0x49, 0x39,
0x88, 0x0a, 0xe0, 0x07, 0x68, 0xc6, 0x28, 0x6b, 0x3f, 0x83, 0x90, 0x5c, 0xcb, 0x52, 0x34, 0x55, 0x14, 0xb6, 0x0e, 0x91, 0x56, 0x4b, 0xa6, 0x43, 0x54, 0x00, 0x3f, 0x40, 0x33, 0x46, 0x59, 0xfb,
0x76, 0xa1, 0x09, 0x12, 0xa9, 0xa4, 0x68, 0x40, 0x49, 0x63, 0x50, 0x96, 0xe8, 0x1a, 0xcf, 0x38, 0x19, 0x84, 0xe4, 0x5a, 0x96, 0xa2, 0xa9, 0xb2, 0x0b, 0x4d, 0x90, 0xc8, 0x34, 0x45, 0x03, 0x4a,
0xa5, 0xaf, 0xc4, 0x8c, 0xab, 0x22, 0xeb, 0x08, 0x0b, 0x44, 0xbc, 0x44, 0x42, 0xd6, 0x87, 0xb9, 0x1a, 0x83, 0xb2, 0x44, 0xb7, 0x7c, 0xc6, 0x29, 0x7d, 0x25, 0x66, 0x5c, 0x15, 0x59, 0x47, 0x58,
0x33, 0x37, 0xf4, 0xb3, 0x21, 0x62, 0x67, 0xfe, 0x3b, 0x0e, 0x5c, 0x29, 0x99, 0x78, 0x29, 0x5b, 0x20, 0xe2, 0xa1, 0x12, 0xb2, 0x3e, 0xcc, 0x9d, 0xb9, 0xa1, 0x5f, 0x15, 0x11, 0x3b, 0xf3, 0xdf,
0xdb, 0xb0, 0x7c, 0xac, 0x91, 0x6a, 0x72, 0x84, 0x80, 0xad, 0xa9, 0x53, 0x7e, 0x7b, 0x42, 0xbc, 0x76, 0xe0, 0x4a, 0xc9, 0xc4, 0x4b, 0xd9, 0xda, 0x86, 0xe5, 0x63, 0x8d, 0x54, 0x93, 0x23, 0x04,
0xe2, 0x07, 0xda, 0x9c, 0x14, 0xd3, 0x6d, 0x25, 0x6b, 0x17, 0x11, 0xee, 0x01, 0xf4, 0x76, 0x5e, 0x6c, 0x4d, 0x25, 0x01, 0xd8, 0x13, 0xe2, 0x15, 0x3f, 0xd0, 0xe6, 0xa4, 0x98, 0x6e, 0x2b, 0x97,
0xa3, 0xa8, 0x6e, 0x99, 0x4f, 0x9e, 0x29, 0x5e, 0xb8, 0x5f, 0x50, 0x45, 0x6f, 0x0f, 0xf8, 0x1c, 0xbb, 0x88, 0x70, 0x0f, 0xa0, 0xb7, 0xf3, 0x1a, 0x45, 0x75, 0xcb, 0x7c, 0x11, 0x4d, 0xf1, 0xc2,
0xc3, 0x82, 0x55, 0x17, 0xfb, 0xc6, 0xbb, 0x56, 0x62, 0x4a, 0x95, 0x5a, 0x2b, 0xf1, 0x66, 0x9b, 0xfd, 0x82, 0x2a, 0x7a, 0x7b, 0xc0, 0xe7, 0x18, 0x16, 0xac, 0xba, 0xd8, 0x37, 0xde, 0xb5, 0x12,
0x4a, 0x19, 0x37, 0x40, 0xee, 0x19, 0x2c, 0x7d, 0x36, 0x1d, 0xa5, 0x41, 0xf6, 0x7e, 0x1b, 0xfb, 0x53, 0xaa, 0xd4, 0x5a, 0x89, 0x27, 0xdd, 0x54, 0x46, 0xb9, 0x01, 0x72, 0xcf, 0x60, 0xe9, 0xb3,
0x96, 0xfc, 0x88, 0xaa, 0x50, 0x53, 0x57, 0xda, 0x94, 0x49, 0x87, 0x33, 0x36, 0xc6, 0x9a, 0xfa, 0xe9, 0x28, 0x0d, 0xb2, 0xe7, 0xdd, 0xd8, 0xb7, 0xe4, 0x47, 0x54, 0x85, 0x9a, 0xba, 0xd2, 0xa6,
0xc5, 0x16, 0x8b, 0x08, 0xf7, 0x0a, 0xac, 0x67, 0x4d, 0x8a, 0xb9, 0x53, 0xea, 0xfc, 0x17, 0x8e, 0x4c, 0x3a, 0x9c, 0xb1, 0x31, 0xd6, 0xd4, 0x2f, 0xb6, 0x58, 0x44, 0xb8, 0x57, 0x60, 0x3d, 0x6b,
0xc8, 0x7d, 0xb2, 0x9f, 0x93, 0x63, 0x4f, 0x60, 0x25, 0x09, 0xc2, 0x93, 0x11, 0x37, 0xeb, 0x49, 0x52, 0xcc, 0x9d, 0x52, 0xe7, 0xbf, 0x70, 0x44, 0x6a, 0x94, 0xfd, 0xda, 0x1c, 0x7b, 0x02, 0x2b,
0xe4, 0x4c, 0x5c, 0xb6, 0xbb, 0x27, 0x9f, 0x9c, 0xf3, 0xca, 0xbe, 0x40, 0x06, 0x29, 0xef, 0x68, 0x49, 0x10, 0x9e, 0x8c, 0xb8, 0x59, 0x4f, 0x22, 0x67, 0xe2, 0xb2, 0xdd, 0x3d, 0xf9, 0x22, 0x9d,
0xc6, 0x20, 0xb9, 0x29, 0x29, 0x1b, 0xc0, 0xb7, 0x61, 0xd1, 0x6e, 0x8c, 0x3d, 0x90, 0xd9, 0xde, 0x57, 0xf6, 0x05, 0x32, 0x48, 0x79, 0x47, 0x33, 0x06, 0xc9, 0x4d, 0x49, 0xd9, 0x00, 0xbe, 0x0d,
0x59, 0xcf, 0xcc, 0x53, 0x19, 0x9b, 0x33, 0x2c, 0x4a, 0xf7, 0x67, 0x0e, 0x74, 0x3d, 0x8e, 0x6c, 0x8b, 0x76, 0x63, 0xec, 0x81, 0x4c, 0x06, 0xcf, 0x7a, 0x66, 0x9e, 0xca, 0xd8, 0x9c, 0x61, 0x51,
0xcc, 0x8d, 0x46, 0x25, 0xf7, 0x3c, 0x2c, 0x54, 0x3b, 0x7b, 0xc0, 0x3a, 0x8b, 0x5c, 0x8d, 0x75, 0xba, 0x3f, 0x73, 0xa0, 0xeb, 0x71, 0x64, 0x63, 0x6e, 0x34, 0x2a, 0xb9, 0xe7, 0x61, 0xa1, 0xda,
0x63, 0xe6, 0xa2, 0xec, 0x5e, 0x2a, 0x19, 0xd5, 0xa3, 0x06, 0xcc, 0xc9, 0xf1, 0xad, 0xc3, 0x65, 0xd9, 0x03, 0xd6, 0x49, 0xe6, 0x6a, 0xac, 0x1b, 0x33, 0x17, 0x65, 0xf7, 0x52, 0xc9, 0xa8, 0x1e,
0xd9, 0x25, 0xd5, 0x9d, 0x2c, 0xa4, 0x6f, 0x35, 0x6a, 0x85, 0xf4, 0x7b, 0xd0, 0x15, 0xcf, 0x22, 0x35, 0x60, 0x4e, 0x8e, 0x6f, 0x1d, 0x2e, 0xcb, 0x2e, 0xa9, 0xee, 0x64, 0x21, 0x7d, 0xab, 0x51,
0x98, 0xe3, 0x10, 0x1f, 0xde, 0xf9, 0x02, 0x5a, 0xc6, 0xe3, 0x10, 0x6c, 0x1d, 0x56, 0x5e, 0x3e, 0x2b, 0xa4, 0xdf, 0x83, 0xae, 0x78, 0x35, 0xc1, 0x1c, 0x87, 0xf8, 0xf0, 0xce, 0x17, 0xd0, 0x32,
0x7d, 0xbe, 0xbf, 0x73, 0x78, 0xd8, 0x3f, 0x78, 0xf1, 0xe8, 0x3b, 0x3b, 0xdf, 0xef, 0xef, 0x6e, 0xde, 0x8e, 0x60, 0xeb, 0xb0, 0xf2, 0xf2, 0xe9, 0xf3, 0xfd, 0x9d, 0xc3, 0xc3, 0xfe, 0xc1, 0x8b,
0x1e, 0xee, 0x76, 0x2e, 0xb1, 0x35, 0x60, 0xfb, 0x3b, 0x87, 0xcf, 0x77, 0xb6, 0x2d, 0xb8, 0xc3, 0x47, 0xdf, 0xd9, 0xf9, 0x7e, 0x7f, 0x77, 0xf3, 0x70, 0xb7, 0x73, 0x89, 0xad, 0x01, 0xdb, 0xdf,
0xae, 0x41, 0xef, 0xc5, 0xfe, 0x8b, 0xc3, 0x9d, 0xed, 0x7e, 0xd9, 0x77, 0x15, 0xf6, 0x3e, 0x5c, 0x39, 0x7c, 0xbe, 0xb3, 0x6d, 0xc1, 0x1d, 0x76, 0x0d, 0x7a, 0x2f, 0xf6, 0x5f, 0x1c, 0xee, 0x6c,
0x91, 0xf8, 0x92, 0xcf, 0xab, 0x77, 0x1e, 0x42, 0x27, 0xef, 0xe3, 0x5b, 0x11, 0x91, 0x37, 0x85, 0xf7, 0xcb, 0xbe, 0xab, 0xb0, 0xf7, 0xe1, 0x8a, 0xc4, 0x97, 0x7c, 0x5e, 0xbd, 0xf3, 0x10, 0x3a,
0x4e, 0xee, 0xff, 0xac, 0x0a, 0x8b, 0x22, 0x7f, 0x4b, 0x3c, 0x61, 0xc8, 0x63, 0xf6, 0x19, 0xcc, 0x79, 0x1f, 0xdf, 0x8a, 0x88, 0xbc, 0x29, 0x74, 0x72, 0xff, 0x67, 0x55, 0x58, 0x14, 0xe9, 0x5d,
0xcb, 0xb7, 0x30, 0x99, 0x5a, 0x0c, 0xfb, 0xf5, 0xcd, 0xde, 0x5a, 0x1e, 0x2c, 0x67, 0x70, 0xe5, 0xe2, 0x85, 0x43, 0x1e, 0xb3, 0xcf, 0x60, 0x5e, 0x3e, 0x95, 0xc9, 0xd4, 0x62, 0xd8, 0x8f, 0x73,
0xaf, 0xfe, 0xc9, 0x7f, 0xfb, 0x7b, 0x95, 0x05, 0xd6, 0xba, 0x7b, 0xf6, 0xf1, 0xdd, 0x13, 0x1e, 0xf6, 0xd6, 0xf2, 0x60, 0x39, 0x83, 0x2b, 0x7f, 0xf5, 0x4f, 0xfe, 0xdb, 0xdf, 0xad, 0x2c, 0xb0,
0x26, 0x58, 0xc7, 0x1f, 0x00, 0x64, 0x2f, 0x3c, 0xb2, 0xae, 0xf6, 0x73, 0x73, 0xcf, 0x5f, 0xf6, 0xd6, 0xdd, 0xb3, 0x8f, 0xef, 0x9e, 0xf0, 0x30, 0xc1, 0x3a, 0xfe, 0x00, 0x20, 0x7b, 0x00, 0x92,
0xae, 0x94, 0x60, 0x64, 0xbd, 0x57, 0xa8, 0xde, 0x15, 0x77, 0x11, 0xeb, 0x0d, 0xc2, 0x20, 0x15, 0x75, 0xb5, 0x9f, 0x9b, 0x7b, 0x1d, 0xb3, 0x77, 0xa5, 0x04, 0x23, 0xeb, 0xbd, 0x42, 0xf5, 0xae,
0xaf, 0x3d, 0x7e, 0xea, 0xdc, 0x61, 0x43, 0x68, 0x9b, 0x6f, 0x2f, 0x32, 0x75, 0xa6, 0x51, 0xf2, 0xb8, 0x8b, 0x58, 0x6f, 0x10, 0x06, 0xa9, 0x78, 0x0c, 0xf2, 0x53, 0xe7, 0x0e, 0x1b, 0x42, 0xdb,
0x7a, 0x64, 0xef, 0xbd, 0x52, 0x9c, 0x5a, 0x7d, 0x6a, 0xe3, 0xb2, 0xdb, 0xc1, 0x36, 0xa6, 0x44, 0x7c, 0x9a, 0x91, 0xa9, 0x33, 0x8d, 0x92, 0xc7, 0x25, 0x7b, 0xef, 0x95, 0xe2, 0xd4, 0xea, 0x53,
0x91, 0xb5, 0x32, 0x12, 0x32, 0x91, 0x3d, 0xb1, 0xc8, 0xae, 0x1a, 0x6c, 0x5a, 0x78, 0xe0, 0xb1, 0x1b, 0x97, 0xdd, 0x0e, 0xb6, 0x31, 0x25, 0x8a, 0xac, 0x95, 0x91, 0x90, 0x89, 0xec, 0x05, 0x46,
0xf7, 0xfe, 0x0c, 0xac, 0x6c, 0xeb, 0x7d, 0x6a, 0x6b, 0xdd, 0x65, 0xd8, 0xd6, 0x80, 0x68, 0xd4, 0x76, 0xd5, 0x60, 0xd3, 0xc2, 0xfb, 0x8f, 0xbd, 0xf7, 0x67, 0x60, 0x65, 0x5b, 0xef, 0x53, 0x5b,
0x03, 0x8f, 0x9f, 0x3a, 0x77, 0xee, 0xff, 0x8f, 0x9b, 0xd0, 0xd4, 0x67, 0x9d, 0xec, 0xc7, 0xb0, 0xeb, 0x2e, 0xc3, 0xb6, 0x06, 0x44, 0xa3, 0xde, 0x7f, 0xfc, 0xd4, 0xb9, 0x73, 0xff, 0x7f, 0xdc,
0x60, 0x25, 0xd8, 0x31, 0x35, 0x8c, 0xb2, 0x7c, 0xbc, 0xde, 0xd5, 0x72, 0xa4, 0x6c, 0xf8, 0x1a, 0x84, 0xa6, 0x3e, 0xeb, 0x64, 0x3f, 0x86, 0x05, 0x2b, 0xff, 0x8e, 0xa9, 0x61, 0x94, 0xa5, 0xeb,
0x35, 0xdc, 0x65, 0x6b, 0xd8, 0xb0, 0xcc, 0x50, 0xbb, 0x4b, 0xa9, 0xa2, 0xe2, 0xa6, 0xd9, 0x2b, 0xf5, 0xae, 0x96, 0x23, 0x65, 0xc3, 0xd7, 0xa8, 0xe1, 0x2e, 0x5b, 0xc3, 0x86, 0x65, 0x02, 0xdb,
0x43, 0xf6, 0x45, 0x63, 0x57, 0xf3, 0xe2, 0x68, 0xb5, 0xf6, 0xfe, 0x0c, 0xac, 0x6c, 0xee, 0x2a, 0x5d, 0xca, 0x24, 0x15, 0x17, 0xd1, 0x5e, 0x19, 0xb2, 0x2f, 0x1a, 0xbb, 0x9a, 0x17, 0x47, 0xab,
0x35, 0xb7, 0xc6, 0x56, 0xcd, 0xe6, 0xf4, 0x19, 0x24, 0xa7, 0xeb, 0x95, 0xe6, 0xeb, 0x83, 0xec, 0xb5, 0xf7, 0x67, 0x60, 0x65, 0x73, 0x57, 0xa9, 0xb9, 0x35, 0xb6, 0x6a, 0x36, 0xa7, 0xcf, 0x20,
0x7d, 0xcd, 0x58, 0x65, 0xaf, 0x12, 0x6a, 0x16, 0x29, 0x3e, 0x4d, 0xe8, 0x76, 0xa9, 0x29, 0xc6, 0x39, 0xdd, 0xbe, 0x34, 0x1f, 0x27, 0x64, 0xef, 0x6b, 0xc6, 0x2a, 0x7b, 0xb4, 0x50, 0xb3, 0x48,
0x68, 0xf9, 0xcc, 0xc7, 0x07, 0xd9, 0x11, 0xb4, 0x8c, 0x77, 0x8a, 0xd8, 0x95, 0x99, 0x6f, 0x2a, 0xf1, 0xe5, 0x42, 0xb7, 0x4b, 0x4d, 0x31, 0x46, 0xcb, 0x67, 0xbe, 0x4d, 0xc8, 0x8e, 0xa0, 0x65,
0xf5, 0x7a, 0x65, 0xa8, 0xb2, 0xa1, 0x98, 0xf5, 0xdf, 0xc5, 0x4d, 0xfd, 0x87, 0xd0, 0xd4, 0x2f, 0x3c, 0x63, 0xc4, 0xae, 0xcc, 0x7c, 0x72, 0xa9, 0xd7, 0x2b, 0x43, 0x95, 0x0d, 0xc5, 0xac, 0xff,
0xdf, 0xb0, 0x75, 0xe3, 0x25, 0x22, 0xf3, 0xa5, 0x9e, 0x5e, 0xb7, 0x88, 0x28, 0x63, 0x3e, 0xb3, 0x2e, 0x6e, 0xea, 0x3f, 0x84, 0xa6, 0x7e, 0x18, 0x87, 0xad, 0x1b, 0x0f, 0x15, 0x99, 0x0f, 0xf9,
0x76, 0x64, 0xbe, 0x97, 0xd0, 0x32, 0x5e, 0xb7, 0xd1, 0x03, 0x28, 0xbe, 0xa0, 0xa3, 0x07, 0x50, 0xf4, 0xba, 0x45, 0x44, 0x19, 0xf3, 0x99, 0xb5, 0x23, 0xf3, 0xbd, 0x84, 0x96, 0xf1, 0xf8, 0x8d,
0xf2, 0x18, 0x8e, 0xbb, 0x4c, 0x4d, 0xb4, 0x58, 0x93, 0xf8, 0x3b, 0x7d, 0x1d, 0x25, 0x6c, 0x0f, 0x1e, 0x40, 0xf1, 0x81, 0x1d, 0x3d, 0x80, 0x92, 0xb7, 0x72, 0xdc, 0x65, 0x6a, 0xa2, 0xc5, 0x9a,
0x2e, 0x4b, 0x1d, 0x77, 0xc4, 0xbf, 0xcc, 0x32, 0x94, 0x3c, 0xf8, 0x78, 0xcf, 0x61, 0x0f, 0xa1, 0xc4, 0xdf, 0xe9, 0xeb, 0x28, 0x61, 0x7b, 0x70, 0x59, 0xea, 0xb8, 0x23, 0xfe, 0x65, 0x96, 0xa1,
0xa1, 0x1e, 0x31, 0x62, 0x6b, 0xe5, 0x8f, 0x31, 0xf5, 0xd6, 0x0b, 0x70, 0x69, 0xdb, 0x7c, 0x1f, 0xe4, 0x3d, 0xc8, 0x7b, 0x0e, 0x7b, 0x08, 0x0d, 0xf5, 0xc6, 0x11, 0x5b, 0x2b, 0x7f, 0xab, 0xa9,
0x20, 0x7b, 0x4a, 0x47, 0x2b, 0x89, 0xc2, 0xd3, 0x3c, 0x9a, 0x03, 0x8a, 0xef, 0xee, 0xb8, 0x6b, 0xb7, 0x5e, 0x80, 0x4b, 0xdb, 0xe6, 0xfb, 0x00, 0xd9, 0x4b, 0x3b, 0x5a, 0x49, 0x14, 0x5e, 0xee,
0x34, 0xc0, 0x0e, 0x23, 0x25, 0x11, 0xf2, 0x73, 0x75, 0x93, 0xfa, 0x47, 0xd0, 0x32, 0x5e, 0xd3, 0xd1, 0x1c, 0x50, 0x7c, 0x96, 0xc7, 0x5d, 0xa3, 0x01, 0x76, 0x18, 0x29, 0x89, 0x90, 0x9f, 0xab,
0xd1, 0xd3, 0x57, 0x7c, 0x89, 0x47, 0x4f, 0x5f, 0xc9, 0xe3, 0x3b, 0x6e, 0x8f, 0x6a, 0x5f, 0x75, 0x8b, 0xd6, 0x3f, 0x82, 0x96, 0xf1, 0xd8, 0x8e, 0x9e, 0xbe, 0xe2, 0x43, 0x3d, 0x7a, 0xfa, 0x4a,
0x97, 0xb0, 0xf6, 0x24, 0x38, 0x09, 0xc7, 0x82, 0x00, 0x17, 0xe8, 0x14, 0x16, 0xac, 0x27, 0x73, 0xde, 0xe6, 0x71, 0x7b, 0x54, 0xfb, 0xaa, 0xbb, 0x84, 0xb5, 0x27, 0xc1, 0x49, 0x38, 0x16, 0x04,
0xb4, 0x84, 0x96, 0x3d, 0xc8, 0xa3, 0x25, 0xb4, 0xf4, 0x95, 0x1d, 0xc5, 0x67, 0xee, 0x32, 0xb6, 0xb8, 0x40, 0xa7, 0xb0, 0x60, 0xbd, 0xa8, 0xa3, 0x25, 0xb4, 0xec, 0xbd, 0x1e, 0x2d, 0xa1, 0xa5,
0x73, 0x46, 0x24, 0x46, 0x4b, 0x3f, 0x80, 0x96, 0xf1, 0xfc, 0x8d, 0x1e, 0x4b, 0xf1, 0xa5, 0x1d, 0x8f, 0xf0, 0x28, 0x3e, 0x73, 0x97, 0xb1, 0x9d, 0x33, 0x22, 0x31, 0x5a, 0xfa, 0x01, 0xb4, 0x8c,
0x3d, 0x96, 0xb2, 0xd7, 0x72, 0x56, 0xa9, 0x8d, 0x45, 0x97, 0x58, 0x81, 0xee, 0x04, 0x63, 0xdd, 0xd7, 0x71, 0xf4, 0x58, 0x8a, 0x0f, 0xf1, 0xe8, 0xb1, 0x94, 0x3d, 0xa6, 0xb3, 0x4a, 0x6d, 0x2c,
0x3f, 0x86, 0x45, 0xfb, 0x41, 0x1c, 0x2d, 0xfb, 0xa5, 0x4f, 0xeb, 0x68, 0xd9, 0x9f, 0xf1, 0x8a, 0xba, 0xc4, 0x0a, 0x74, 0x65, 0x18, 0xeb, 0xfe, 0x31, 0x2c, 0xda, 0xef, 0xe5, 0x68, 0xd9, 0x2f,
0x8e, 0x64, 0xe9, 0x3b, 0x2b, 0xba, 0x91, 0xbb, 0x9f, 0xcb, 0x4c, 0xa9, 0x2f, 0xd8, 0x77, 0x51, 0x7d, 0x79, 0x47, 0xcb, 0xfe, 0x8c, 0x47, 0x76, 0x24, 0x4b, 0xdf, 0x59, 0xd1, 0x8d, 0xdc, 0xfd,
0xc1, 0xc9, 0x4b, 0xda, 0x6c, 0xdd, 0xe0, 0x5a, 0xf3, 0x2a, 0xb7, 0x96, 0x97, 0xc2, 0x7d, 0x6e, 0x5c, 0x66, 0x4a, 0x7d, 0xc1, 0xbe, 0x8b, 0x0a, 0x4e, 0xde, 0xe1, 0x66, 0xeb, 0x06, 0xd7, 0x9a,
0x9b, 0x99, 0xc5, 0xad, 0x66, 0xda, 0xb5, 0xe8, 0xb2, 0xb6, 0xb1, 0x6b, 0x99, 0xf7, 0xb9, 0x8d, 0x37, 0xbd, 0xb5, 0xbc, 0x14, 0xae, 0x7b, 0xdb, 0xcc, 0x2c, 0x2e, 0x3d, 0xd3, 0xae, 0x45, 0x77,
0x5d, 0xcb, 0xba, 0xd3, 0x9d, 0xdf, 0xb5, 0xd2, 0x00, 0xeb, 0x08, 0x61, 0x29, 0x77, 0x09, 0x40, 0xb9, 0x8d, 0x5d, 0xcb, 0xbc, 0xee, 0x6d, 0xec, 0x5a, 0xd6, 0x95, 0xef, 0xfc, 0xae, 0x95, 0x06,
0x4b, 0x45, 0xf9, 0x3d, 0xad, 0xde, 0xb5, 0x37, 0xdf, 0x1d, 0xb0, 0x35, 0x88, 0x52, 0x82, 0x77, 0x58, 0x47, 0x08, 0x4b, 0xb9, 0x3b, 0x02, 0x5a, 0x2a, 0xca, 0xaf, 0x71, 0xf5, 0xae, 0xbd, 0xf9,
0xd5, 0xad, 0xb8, 0xbf, 0x08, 0x6d, 0xf3, 0x71, 0x0f, 0x66, 0x8a, 0x72, 0xbe, 0xa5, 0xf7, 0x4a, 0x6a, 0x81, 0xad, 0x41, 0x94, 0x12, 0xbc, 0xab, 0x2e, 0xcd, 0xfd, 0x45, 0x68, 0x9b, 0x6f, 0x7f,
0x71, 0xf6, 0xe2, 0xb2, 0xb6, 0xd9, 0x0c, 0xfb, 0x1e, 0xac, 0x69, 0x51, 0x37, 0xf3, 0xca, 0x13, 0x30, 0x53, 0x94, 0xf3, 0x2d, 0xbd, 0x57, 0x8a, 0xb3, 0x17, 0x97, 0xb5, 0xcd, 0x66, 0xd8, 0xf7,
0xf6, 0x41, 0x49, 0xb6, 0xb9, 0x69, 0xf9, 0xf4, 0xae, 0xcc, 0x4c, 0x47, 0xbf, 0xe7, 0x20, 0xd3, 0x60, 0x4d, 0x8b, 0xba, 0x99, 0x76, 0x9e, 0xb0, 0x0f, 0x4a, 0x92, 0xd1, 0x4d, 0xcb, 0xa7, 0x77,
0xd8, 0xaf, 0x26, 0x64, 0x1b, 0x46, 0xd9, 0x63, 0x11, 0xd9, 0x86, 0x51, 0xfa, 0xd4, 0x82, 0x62, 0x65, 0x66, 0xb6, 0xfa, 0x3d, 0x07, 0x99, 0xc6, 0x7e, 0x54, 0x21, 0xdb, 0x30, 0xca, 0xde, 0x92,
0x1a, 0xb6, 0x62, 0xcd, 0x91, 0x38, 0x64, 0x66, 0x3f, 0x80, 0x25, 0xe3, 0xe6, 0xce, 0xe1, 0x45, 0xc8, 0x36, 0x8c, 0xd2, 0x97, 0x18, 0x14, 0xd3, 0xb0, 0x15, 0x6b, 0x8e, 0xc4, 0x21, 0x33, 0xfb,
0x38, 0xd0, 0x02, 0x50, 0xbc, 0x54, 0xda, 0x2b, 0xb3, 0xeb, 0xdd, 0x75, 0xaa, 0x7f, 0xd9, 0xb5, 0x01, 0x2c, 0x19, 0x17, 0x7b, 0x0e, 0x2f, 0xc2, 0x81, 0x16, 0x80, 0xe2, 0x9d, 0xd3, 0x5e, 0x99,
0x26, 0x07, 0x99, 0x7f, 0x0b, 0x5a, 0xe6, 0xad, 0xa0, 0x37, 0xd4, 0xbb, 0x6e, 0xa0, 0xcc, 0x3b, 0x5d, 0xef, 0xae, 0x53, 0xfd, 0xcb, 0xae, 0x35, 0x39, 0xc8, 0xfc, 0x5b, 0xd0, 0x32, 0x2f, 0x0d,
0x91, 0xf7, 0x1c, 0x76, 0x20, 0x12, 0x8c, 0xf4, 0x2b, 0x8c, 0x51, 0x9c, 0xdf, 0x3e, 0xed, 0xd7, 0xbd, 0xa1, 0xde, 0x75, 0x03, 0x65, 0x5e, 0x99, 0xbc, 0xe7, 0xb0, 0x03, 0x91, 0x60, 0xa4, 0x1f,
0x19, 0xf5, 0x42, 0x96, 0xbd, 0xcb, 0x79, 0xdb, 0xb9, 0xe7, 0xb0, 0x7f, 0xe8, 0x40, 0xdb, 0xba, 0x69, 0x8c, 0xe2, 0xfc, 0xf6, 0x69, 0x3f, 0xde, 0xa8, 0x17, 0xb2, 0xec, 0xd9, 0xce, 0xdb, 0xce,
0xb5, 0x63, 0xa5, 0x6c, 0xe4, 0x7a, 0xd6, 0x35, 0x71, 0x66, 0xd7, 0x5c, 0x8f, 0x86, 0xbd, 0x77, 0x3d, 0x87, 0xfd, 0x03, 0x07, 0xda, 0xd6, 0xa5, 0x1e, 0x2b, 0x65, 0x23, 0xd7, 0xb3, 0xae, 0x89,
0xe7, 0xdb, 0xd6, 0xb4, 0x7e, 0x6e, 0x05, 0x8d, 0x36, 0xf2, 0x4f, 0x31, 0x7e, 0x91, 0x27, 0x30, 0x33, 0xbb, 0xe6, 0x7a, 0x34, 0xec, 0xbd, 0x3b, 0xdf, 0xb6, 0xa6, 0xf5, 0x73, 0x2b, 0x68, 0xb4,
0xaf, 0xf2, 0x7e, 0x71, 0xcf, 0x61, 0xbf, 0x74, 0x60, 0xd1, 0x0e, 0x75, 0xea, 0xe1, 0x96, 0x06, 0x91, 0x7f, 0xa9, 0xf1, 0x8b, 0x3c, 0x81, 0x79, 0xd3, 0xf7, 0x8b, 0x7b, 0x0e, 0xfb, 0xa5, 0x03,
0x55, 0xf5, 0xe2, 0xcf, 0x88, 0x8f, 0xfe, 0x80, 0x7a, 0xf9, 0xfc, 0x8e, 0x67, 0xf5, 0x52, 0xbe, 0x8b, 0x76, 0xa8, 0x53, 0x0f, 0xb7, 0x34, 0xa8, 0xaa, 0x17, 0x7f, 0x46, 0x7c, 0xf4, 0x07, 0xd4,
0xd0, 0xf1, 0x9b, 0xf5, 0x96, 0x7d, 0x2a, 0xde, 0x0d, 0x56, 0x07, 0x12, 0xac, 0xf8, 0x82, 0xad, 0xcb, 0xe7, 0x77, 0x3c, 0xab, 0x97, 0xf2, 0x01, 0x8f, 0xdf, 0xac, 0xb7, 0xec, 0x53, 0xf1, 0xac,
0x66, 0x18, 0xf3, 0xcd, 0x59, 0x5a, 0x84, 0x1f, 0x89, 0x27, 0x08, 0x55, 0xcc, 0x1c, 0xf9, 0xee, 0xb0, 0x3a, 0x90, 0x60, 0xc5, 0x07, 0x6e, 0x35, 0xc3, 0x98, 0x4f, 0xd2, 0xd2, 0x22, 0xfc, 0x48,
0x5d, 0xbf, 0x77, 0x6f, 0xd0, 0x98, 0xae, 0xb9, 0x57, 0xac, 0x31, 0xe5, 0x77, 0xf8, 0x4d, 0xd1, 0xbc, 0x50, 0xa8, 0x62, 0xe6, 0xc8, 0x77, 0xef, 0xfa, 0xbd, 0x7b, 0x83, 0xc6, 0x74, 0xcd, 0xbd,
0x3b, 0xf9, 0x5c, 0x6c, 0xb6, 0x45, 0x15, 0x9e, 0x90, 0x9d, 0xdd, 0xc9, 0xb1, 0xe8, 0xa4, 0x24, 0x62, 0x8d, 0x29, 0xbf, 0xc3, 0x6f, 0x8a, 0xde, 0xc9, 0xd7, 0x64, 0xb3, 0x2d, 0xaa, 0xf0, 0xc2,
0xb7, 0x84, 0xe3, 0x1d, 0xab, 0x71, 0xef, 0x50, 0x5f, 0x6f, 0xb8, 0x1f, 0xcc, 0xec, 0xeb, 0x5d, 0xec, 0xec, 0x4e, 0x8e, 0x45, 0x27, 0x25, 0xb9, 0x25, 0x1c, 0xef, 0x58, 0x8d, 0x7b, 0x87, 0xfa,
0x0a, 0x58, 0x62, 0x8f, 0x0f, 0x00, 0xb2, 0xc3, 0x43, 0x96, 0x3b, 0xbc, 0xd2, 0x2a, 0xa3, 0x78, 0x7a, 0xc3, 0xfd, 0x60, 0x66, 0x5f, 0xef, 0x52, 0xc0, 0x12, 0x7b, 0x7c, 0x00, 0x90, 0x1d, 0x1e,
0xbe, 0x68, 0x4b, 0xa0, 0x3a, 0xe3, 0xc2, 0x1a, 0x7f, 0x28, 0x14, 0xe0, 0x53, 0x75, 0xec, 0x65, 0xb2, 0xdc, 0xe1, 0x95, 0x56, 0x19, 0xc5, 0xf3, 0x45, 0x5b, 0x02, 0xd5, 0x19, 0x17, 0xd6, 0xf8,
0x9a, 0x39, 0xf6, 0x29, 0x9f, 0x65, 0xe6, 0xe4, 0xeb, 0xb7, 0xd4, 0x9f, 0x3e, 0x43, 0x7b, 0x01, 0x43, 0xa1, 0x00, 0x9f, 0xaa, 0x63, 0x2f, 0xd3, 0xcc, 0xb1, 0x4f, 0xf9, 0x2c, 0x33, 0x27, 0x5f,
0x0b, 0x7b, 0x51, 0xf4, 0x6a, 0x3a, 0xd1, 0x99, 0x15, 0xf6, 0x59, 0xc2, 0xae, 0x9f, 0x9c, 0xf6, 0xbf, 0xa5, 0xfe, 0xf4, 0x19, 0xda, 0x0b, 0x58, 0xd8, 0x8b, 0xa2, 0x57, 0xd3, 0x89, 0xce, 0xac,
0x72, 0xa3, 0x70, 0xaf, 0x53, 0x55, 0x3d, 0xd6, 0x35, 0xaa, 0xba, 0xfb, 0x79, 0x76, 0x38, 0xf9, 0xb0, 0xcf, 0x12, 0x76, 0xfd, 0xe4, 0xb4, 0x97, 0x1b, 0x85, 0x7b, 0x9d, 0xaa, 0xea, 0xb1, 0xae,
0x05, 0xf3, 0x61, 0x59, 0x6b, 0x55, 0xdd, 0xf1, 0x9e, 0x5d, 0x8d, 0xa5, 0x4b, 0xf3, 0x4d, 0x58, 0x51, 0xd5, 0xdd, 0xcf, 0xb3, 0xc3, 0xc9, 0x2f, 0x98, 0x0f, 0xcb, 0x5a, 0xab, 0xea, 0x8e, 0xf7,
0xf6, 0xb8, 0xea, 0xed, 0xdd, 0x44, 0xd5, 0x49, 0x3a, 0xa5, 0xbd, 0xcd, 0x07, 0x74, 0x65, 0x81, 0xec, 0x6a, 0x2c, 0x5d, 0x9a, 0x6f, 0xc2, 0xb2, 0xc7, 0x55, 0x6f, 0xef, 0x26, 0xaa, 0x4e, 0xd2,
0x02, 0xf2, 0x2b, 0x59, 0xc7, 0x75, 0x24, 0xbf, 0xb7, 0x60, 0x01, 0xed, 0x9d, 0x66, 0xe2, 0x5f, 0x29, 0xed, 0x6d, 0x3e, 0xa0, 0x2b, 0x0b, 0x14, 0x90, 0x5f, 0xc9, 0x3a, 0xae, 0x23, 0xf9, 0xbd,
0xc4, 0xfc, 0x27, 0x77, 0x3f, 0x97, 0xa1, 0xfe, 0x2f, 0xd4, 0x4e, 0xa3, 0xce, 0x42, 0xac, 0x9d, 0x05, 0x0b, 0x68, 0xef, 0x34, 0x13, 0xff, 0x22, 0xe6, 0x3f, 0xb9, 0xfb, 0xb9, 0x0c, 0xf5, 0x7f,
0x26, 0x77, 0x78, 0x62, 0xed, 0x34, 0x85, 0xc3, 0x13, 0x6b, 0xaa, 0xd5, 0x59, 0x0c, 0x1b, 0xc1, 0xa1, 0x76, 0x1a, 0x75, 0x16, 0x62, 0xed, 0x34, 0xb9, 0xc3, 0x13, 0x6b, 0xa7, 0x29, 0x1c, 0x9e,
0x72, 0xe1, 0xbc, 0x45, 0x6f, 0x32, 0xb3, 0x4e, 0x69, 0x7a, 0xd7, 0x67, 0x13, 0xd8, 0xad, 0xdd, 0x58, 0x53, 0xad, 0xce, 0x62, 0xd8, 0x08, 0x96, 0x0b, 0xe7, 0x2d, 0x7a, 0x93, 0x99, 0x75, 0x4a,
0xb1, 0x5b, 0x3b, 0x84, 0x85, 0x6d, 0x2e, 0x26, 0x4b, 0xa4, 0x8e, 0xe6, 0xae, 0x7e, 0x99, 0x89, 0xd3, 0xbb, 0x3e, 0x9b, 0xc0, 0x6e, 0xed, 0x8e, 0xdd, 0xda, 0x21, 0x2c, 0x6c, 0x73, 0x31, 0x59,
0xa9, 0xf9, 0x2d, 0x81, 0x70, 0xb6, 0x29, 0x41, 0x79, 0x9b, 0xec, 0x87, 0xd0, 0x7a, 0xc2, 0x53, 0x22, 0x75, 0x34, 0x77, 0x33, 0xcc, 0x4c, 0x4c, 0xcd, 0x6f, 0x09, 0x84, 0xb3, 0x4d, 0x09, 0xca,
0x95, 0x2b, 0xaa, 0x8d, 0xd9, 0x5c, 0xf2, 0x68, 0xaf, 0x24, 0xd5, 0xd4, 0xe6, 0x19, 0xaa, 0xed, 0xdb, 0x64, 0x3f, 0x84, 0xd6, 0x13, 0x9e, 0xaa, 0x5c, 0x51, 0x6d, 0xcc, 0xe6, 0x92, 0x47, 0x7b,
0x2e, 0x1f, 0x9e, 0x70, 0xa1, 0x9c, 0xfa, 0xc1, 0xf0, 0x0b, 0xf6, 0x17, 0xa8, 0x72, 0x9d, 0x28, 0x25, 0xa9, 0xa6, 0x36, 0xcf, 0x50, 0x6d, 0x77, 0xf9, 0xf0, 0x84, 0x0b, 0xe5, 0xd4, 0x0f, 0x86,
0xbf, 0x66, 0x24, 0xff, 0x99, 0x95, 0x2f, 0xe5, 0xe0, 0x65, 0x35, 0x87, 0xd1, 0x90, 0x1b, 0x46, 0x5f, 0xb0, 0xbf, 0x40, 0x95, 0xeb, 0x44, 0xf9, 0x35, 0x23, 0xf9, 0xcf, 0xac, 0x7c, 0x29, 0x07,
0x55, 0x08, 0x2d, 0xe3, 0x42, 0x89, 0x16, 0xa0, 0xe2, 0xe5, 0x23, 0x2d, 0x40, 0x25, 0xf7, 0x4f, 0x2f, 0xab, 0x39, 0x8c, 0x86, 0xdc, 0x30, 0xaa, 0x42, 0x68, 0x19, 0x17, 0x4a, 0xb4, 0x00, 0x15,
0xdc, 0xdb, 0xd4, 0x8e, 0xcb, 0xae, 0x67, 0xed, 0x88, 0x3b, 0x27, 0x59, 0x4b, 0x77, 0x3f, 0xf7, 0xef, 0x26, 0x69, 0x01, 0x2a, 0xb9, 0x7f, 0xe2, 0xde, 0xa6, 0x76, 0x5c, 0x76, 0x3d, 0x6b, 0x47,
0xc7, 0xe9, 0x17, 0xec, 0x25, 0xbd, 0x98, 0x63, 0xe6, 0xc3, 0x66, 0xd6, 0x79, 0x3e, 0x75, 0x56, 0xdc, 0x39, 0xc9, 0x5a, 0xba, 0xfb, 0xb9, 0x3f, 0x4e, 0xbf, 0x60, 0x2f, 0xe9, 0x41, 0x1d, 0x33,
0x4f, 0x96, 0x81, 0xb2, 0x2d, 0x76, 0xd1, 0x14, 0xd9, 0x5e, 0xdf, 0x02, 0x38, 0x4c, 0xa3, 0xc9, 0x1f, 0x36, 0xb3, 0xce, 0xf3, 0xa9, 0xb3, 0x7a, 0xb2, 0x0c, 0x94, 0x6d, 0xb1, 0x8b, 0xa6, 0xc8,
0xb6, 0xcf, 0xc7, 0x51, 0x98, 0xe9, 0xda, 0x2c, 0x1b, 0x33, 0xd3, 0x5f, 0x46, 0x4a, 0x26, 0x7b, 0xf6, 0xfa, 0x16, 0xc0, 0x61, 0x1a, 0x4d, 0xb6, 0x7d, 0x3e, 0x8e, 0xc2, 0x4c, 0xd7, 0x66, 0xd9,
0x69, 0xb8, 0x33, 0x56, 0x3a, 0xb1, 0x62, 0xae, 0x99, 0x09, 0x9b, 0x7a, 0x42, 0x4a, 0x92, 0x36, 0x98, 0x99, 0xfe, 0x32, 0x52, 0x32, 0xd9, 0x4b, 0xc3, 0x9d, 0xb1, 0xd2, 0x89, 0x15, 0x73, 0xcd,
0xef, 0x39, 0x6c, 0x13, 0x20, 0x3b, 0x70, 0xd3, 0xce, 0x49, 0xe1, 0x2c, 0x4f, 0xab, 0xbd, 0x92, 0x4c, 0xd8, 0xd4, 0x13, 0x52, 0x92, 0xb4, 0x79, 0xcf, 0x61, 0x9b, 0x00, 0xd9, 0x81, 0x9b, 0x76,
0xd3, 0xb9, 0x03, 0x68, 0x66, 0x27, 0x38, 0xeb, 0xd9, 0x9d, 0x2c, 0xeb, 0xbc, 0x47, 0xef, 0xe0, 0x4e, 0x0a, 0x67, 0x79, 0x5a, 0xed, 0x95, 0x9c, 0xce, 0x1d, 0x40, 0x33, 0x3b, 0xc1, 0x59, 0xcf,
0x85, 0x73, 0x15, 0xb7, 0x43, 0x53, 0x05, 0xac, 0x81, 0x53, 0x45, 0x87, 0x25, 0x01, 0xac, 0x88, 0xae, 0x6c, 0x59, 0xe7, 0x3d, 0x7a, 0x07, 0x2f, 0x9c, 0xab, 0xb8, 0x1d, 0x9a, 0x2a, 0x60, 0x0d,
0x0e, 0x6a, 0x03, 0x87, 0x32, 0x09, 0xd5, 0x48, 0x4a, 0xce, 0x36, 0xb4, 0x34, 0x97, 0x06, 0xfd, 0x9c, 0x2a, 0x3a, 0x2c, 0x09, 0x60, 0x45, 0x74, 0x50, 0x1b, 0x38, 0x94, 0x49, 0xa8, 0x46, 0x52,
0xad, 0x18, 0x0b, 0x72, 0xab, 0xc8, 0x62, 0x44, 0xd5, 0x3c, 0x86, 0xe5, 0x42, 0x54, 0x5a, 0x8b, 0x72, 0xb6, 0xa1, 0xa5, 0xb9, 0x34, 0xe8, 0x6f, 0xc5, 0x58, 0x90, 0x5b, 0x45, 0x16, 0x23, 0xaa,
0xf4, 0xac, 0x83, 0x02, 0x2d, 0xd2, 0x33, 0x03, 0xda, 0xee, 0x65, 0x6a, 0x72, 0xc9, 0x05, 0xf2, 0xe6, 0x31, 0x2c, 0x17, 0xa2, 0xd2, 0x5a, 0xa4, 0x67, 0x1d, 0x14, 0x68, 0x91, 0x9e, 0x19, 0xd0,
0xa9, 0xce, 0x83, 0x74, 0x70, 0x8a, 0xcd, 0xfd, 0xc2, 0x81, 0x95, 0x92, 0xa0, 0x33, 0xfb, 0x50, 0x76, 0x2f, 0x53, 0x93, 0x4b, 0x2e, 0x90, 0x4f, 0x75, 0x1e, 0xa4, 0x83, 0x53, 0x6c, 0xee, 0x17,
0xb9, 0xe7, 0x33, 0x03, 0xd2, 0xbd, 0xd2, 0x98, 0xa4, 0x7b, 0x48, 0xed, 0x7c, 0xc6, 0xbe, 0x63, 0x0e, 0xac, 0x94, 0x04, 0x9d, 0xd9, 0x87, 0xca, 0x3d, 0x9f, 0x19, 0x90, 0xee, 0x95, 0xc6, 0x24,
0x6d, 0x6c, 0x22, 0x1c, 0x28, 0x25, 0xf3, 0x8d, 0x46, 0x45, 0xa9, 0x45, 0xf1, 0x13, 0x58, 0x17, 0xdd, 0x43, 0x6a, 0xe7, 0x33, 0xf6, 0x1d, 0x6b, 0x63, 0x13, 0xe1, 0x40, 0x29, 0x99, 0x6f, 0x34,
0x1d, 0xd9, 0x1c, 0x8d, 0x72, 0xf1, 0xd2, 0x6b, 0x85, 0x7f, 0x1d, 0x62, 0xc5, 0x81, 0x7b, 0xb3, 0x2a, 0x4a, 0x2d, 0x8a, 0x9f, 0xc0, 0xba, 0xe8, 0xc8, 0xe6, 0x68, 0x94, 0x8b, 0x97, 0x5e, 0x2b,
0xff, 0xb5, 0xc8, 0x0c, 0x03, 0x58, 0x74, 0x95, 0x4d, 0xa1, 0x93, 0x8f, 0x41, 0xb2, 0xd9, 0x75, 0xfc, 0x67, 0x11, 0x2b, 0x0e, 0xdc, 0x9b, 0xfd, 0x9f, 0x47, 0x66, 0x18, 0xc0, 0xa2, 0xab, 0x6c,
0xf5, 0x3e, 0xb0, 0x1c, 0xcd, 0x62, 0xdc, 0xd2, 0xfd, 0x1d, 0x6a, 0xec, 0x03, 0xb7, 0x57, 0x36, 0x0a, 0x9d, 0x7c, 0x0c, 0x92, 0xcd, 0xae, 0xab, 0xf7, 0x81, 0xe5, 0x68, 0x16, 0xe3, 0x96, 0xee,
0x2f, 0xc2, 0xf7, 0xc4, 0xf5, 0xf8, 0xcb, 0x3a, 0x60, 0x9a, 0x1b, 0xa7, 0x6a, 0x60, 0x56, 0x84, 0xef, 0x50, 0x63, 0x1f, 0xb8, 0xbd, 0xb2, 0x79, 0x11, 0xbe, 0x27, 0xae, 0xc7, 0x5f, 0xd6, 0x01,
0x57, 0xbb, 0xba, 0xe5, 0xf1, 0xd6, 0x9b, 0xd4, 0xfc, 0x75, 0xf7, 0xbd, 0xb2, 0xe6, 0x63, 0xf1, 0xd3, 0xdc, 0x38, 0x55, 0x03, 0xb3, 0x22, 0xbc, 0xda, 0xd5, 0x2d, 0x8f, 0xb7, 0xde, 0xa4, 0xe6,
0x89, 0x70, 0x7a, 0xd7, 0xf3, 0x72, 0xad, 0x7a, 0x70, 0xbd, 0x6c, 0xbd, 0x67, 0x7a, 0x2f, 0xb9, 0xaf, 0xbb, 0xef, 0x95, 0x35, 0x1f, 0x8b, 0x4f, 0x84, 0xd3, 0xbb, 0x9e, 0x97, 0x6b, 0xd5, 0x83,
0xb9, 0xbe, 0x74, 0xcf, 0x79, 0x74, 0xeb, 0x07, 0xbf, 0x73, 0x12, 0xa4, 0xa7, 0xd3, 0xa3, 0x8d, 0xeb, 0x65, 0xeb, 0x3d, 0xd3, 0x7b, 0xc9, 0xcd, 0xf5, 0xa5, 0x7b, 0xce, 0xa3, 0x5b, 0x3f, 0xf8,
0x41, 0x34, 0xbe, 0x3b, 0x52, 0x41, 0x37, 0x99, 0xf7, 0x7e, 0x77, 0x14, 0x0e, 0xef, 0xd2, 0xf7, 0x9d, 0x93, 0x20, 0x3d, 0x9d, 0x1e, 0x6d, 0x0c, 0xa2, 0xf1, 0xdd, 0x91, 0x0a, 0xba, 0xc9, 0xbc,
0x47, 0x73, 0xf4, 0x9f, 0x88, 0xbe, 0xf1, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xff, 0xb9, 0x2d, 0x25, 0xf7, 0xbb, 0xa3, 0x70, 0x78, 0x97, 0xbe, 0x3f, 0x9a, 0xa3, 0x7f, 0x54, 0xf4, 0x8d, 0xff, 0x1b,
0xd5, 0xbb, 0x68, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, 0x8c, 0x9e, 0x6c, 0x70, 0xda, 0x68, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.

@ -888,8 +888,9 @@ message SendRequest {
uint64 outgoing_chan_id = 9; uint64 outgoing_chan_id = 9;
/** /**
An optional maximum total time lock for the route. If zero, there is no An optional maximum total time lock for the route. This should not exceed
maximum enforced. lnd's `--max-cltv-expiry` setting. If zero, then the value of
`--max-cltv-expiry` is enforced.
*/ */
uint32 cltv_limit = 10; uint32 cltv_limit = 10;
@ -1741,6 +1742,13 @@ message QueryRoutesRequest {
A list of directed node pairs that will be ignored during path finding. A list of directed node pairs that will be ignored during path finding.
*/ */
repeated NodePair ignored_pairs = 10; repeated NodePair ignored_pairs = 10;
/**
An optional maximum total time lock for the route. If the source is empty or
ourselves, this should not exceed lnd's `--max-cltv-expiry` setting. If
zero, then the value of `--max-cltv-expiry` is used as the limit.
*/
uint32 cltv_limit = 11;
} }
message NodePair { message NodePair {

@ -730,6 +730,14 @@
"required": false, "required": false,
"type": "boolean", "type": "boolean",
"format": "boolean" "format": "boolean"
},
{
"name": "cltv_limit",
"description": "* \nAn optional maximum total time lock for the route. If the source is empty or\nourselves, this should not exceed lnd's `--max-cltv-expiry` setting. If\nzero, then the value of `--max-cltv-expiry` is used as the limit.",
"in": "query",
"required": false,
"type": "integer",
"format": "int64"
} }
], ],
"tags": [ "tags": [
@ -3437,7 +3445,7 @@
"cltv_limit": { "cltv_limit": {
"type": "integer", "type": "integer",
"format": "int64", "format": "int64",
"description": "* \nAn optional maximum total time lock for the route. If zero, there is no\nmaximum enforced." "description": "* \nAn optional maximum total time lock for the route. This should not exceed\nlnd's `--max-cltv-expiry` setting. If zero, then the value of\n`--max-cltv-expiry` is enforced."
}, },
"dest_tlv": { "dest_tlv": {
"type": "object", "type": "object",

@ -260,7 +260,7 @@ type RestrictParams struct {
// CltvLimit is the maximum time lock of the route excluding the final // CltvLimit is the maximum time lock of the route excluding the final
// ctlv. After path finding is complete, the caller needs to increase // ctlv. After path finding is complete, the caller needs to increase
// all cltv expiry heights with the required final cltv delta. // all cltv expiry heights with the required final cltv delta.
CltvLimit *uint32 CltvLimit uint32
// DestPayloadTLV should be set to true if we need to drop off a TLV // DestPayloadTLV should be set to true if we need to drop off a TLV
// payload at the final hop in order to properly complete this payment // payload at the final hop in order to properly complete this payment
@ -495,8 +495,8 @@ func findPath(g *graphParams, r *RestrictParams, cfg *PathFindingConfig,
incomingCltv := toNodeDist.incomingCltv + incomingCltv := toNodeDist.incomingCltv +
uint32(timeLockDelta) uint32(timeLockDelta)
// Check that we have cltv limit and that we are within it. // Check that we are within our CLTV limit.
if r.CltvLimit != nil && incomingCltv > *r.CltvLimit { if incomingCltv > r.CltvLimit {
return return
} }

@ -54,6 +54,7 @@ var (
noRestrictions = &RestrictParams{ noRestrictions = &RestrictParams{
FeeLimit: noFeeLimit, FeeLimit: noFeeLimit,
ProbabilitySource: noProbabilitySource, ProbabilitySource: noProbabilitySource,
CltvLimit: math.MaxUint32,
} }
testPathFindingConfig = &PathFindingConfig{} testPathFindingConfig = &PathFindingConfig{}
@ -789,6 +790,7 @@ func testBasicGraphPathFindingCase(t *testing.T, graphInstance *testGraphInstanc
&RestrictParams{ &RestrictParams{
FeeLimit: test.feeLimit, FeeLimit: test.feeLimit,
ProbabilitySource: noProbabilitySource, ProbabilitySource: noProbabilitySource,
CltvLimit: math.MaxUint32,
}, },
testPathFindingConfig, testPathFindingConfig,
sourceNode.PubKeyBytes, target, paymentAmt, sourceNode.PubKeyBytes, target, paymentAmt,
@ -1916,6 +1918,7 @@ func TestRestrictOutgoingChannel(t *testing.T) {
FeeLimit: noFeeLimit, FeeLimit: noFeeLimit,
OutgoingChannelID: &outgoingChannelID, OutgoingChannelID: &outgoingChannelID,
ProbabilitySource: noProbabilitySource, ProbabilitySource: noProbabilitySource,
CltvLimit: math.MaxUint32,
}, },
testPathFindingConfig, testPathFindingConfig,
sourceVertex, target, paymentAmt, sourceVertex, target, paymentAmt,
@ -1942,7 +1945,7 @@ func TestRestrictOutgoingChannel(t *testing.T) {
// TestCltvLimit asserts that a cltv limit is obeyed by the path finding // TestCltvLimit asserts that a cltv limit is obeyed by the path finding
// algorithm. // algorithm.
func TestCltvLimit(t *testing.T) { func TestCltvLimit(t *testing.T) {
t.Run("no limit", func(t *testing.T) { testCltvLimit(t, 0, 1) }) t.Run("no limit", func(t *testing.T) { testCltvLimit(t, 2016, 1) })
t.Run("no path", func(t *testing.T) { testCltvLimit(t, 50, 0) }) t.Run("no path", func(t *testing.T) { testCltvLimit(t, 50, 0) })
t.Run("force high cost", func(t *testing.T) { testCltvLimit(t, 80, 3) }) t.Run("force high cost", func(t *testing.T) { testCltvLimit(t, 80, 3) })
} }
@ -1998,19 +2001,13 @@ func testCltvLimit(t *testing.T, limit uint32, expectedChannel uint64) {
paymentAmt := lnwire.NewMSatFromSatoshis(100) paymentAmt := lnwire.NewMSatFromSatoshis(100)
target := testGraphInstance.aliasMap["target"] target := testGraphInstance.aliasMap["target"]
// Find the best path given the cltv limit.
var cltvLimit *uint32
if limit != 0 {
cltvLimit = &limit
}
path, err := findPath( path, err := findPath(
&graphParams{ &graphParams{
graph: testGraphInstance.graph, graph: testGraphInstance.graph,
}, },
&RestrictParams{ &RestrictParams{
FeeLimit: noFeeLimit, FeeLimit: noFeeLimit,
CltvLimit: cltvLimit, CltvLimit: limit,
ProbabilitySource: noProbabilitySource, ProbabilitySource: noProbabilitySource,
}, },
testPathFindingConfig, testPathFindingConfig,
@ -2195,6 +2192,7 @@ func testProbabilityRouting(t *testing.T, p10, p11, p20, minProbability float64,
&RestrictParams{ &RestrictParams{
FeeLimit: noFeeLimit, FeeLimit: noFeeLimit,
ProbabilitySource: probabilitySource, ProbabilitySource: probabilitySource,
CltvLimit: math.MaxUint32,
}, },
&PathFindingConfig{ &PathFindingConfig{
PaymentAttemptPenalty: lnwire.NewMSatFromSatoshis(10), PaymentAttemptPenalty: lnwire.NewMSatFromSatoshis(10),

@ -73,15 +73,10 @@ func (p *paymentSession) RequestRoute(payment *LightningPayment,
// does not reject the HTLC if some blocks are mined while it's in-flight. // does not reject the HTLC if some blocks are mined while it's in-flight.
finalCltvDelta += BlockPadding finalCltvDelta += BlockPadding
// If a route cltv limit was specified, we need to subtract the final // We need to subtract the final delta before passing it into path
// delta before passing it into path finding. The optimal path is // finding. The optimal path is independent of the final cltv delta and
// independent of the final cltv delta and the path finding algorithm is // the path finding algorithm is unaware of this value.
// unaware of this value. cltvLimit := payment.CltvLimit - uint32(finalCltvDelta)
var cltvLimit *uint32
if payment.CltvLimit != nil {
limit := *payment.CltvLimit - uint32(finalCltvDelta)
cltvLimit = &limit
}
// TODO(roasbeef): sync logic amongst dist sys // TODO(roasbeef): sync logic amongst dist sys

@ -20,7 +20,7 @@ func TestRequestRoute(t *testing.T) {
// We expect find path to receive a cltv limit excluding the // We expect find path to receive a cltv limit excluding the
// final cltv delta (including the block padding). // final cltv delta (including the block padding).
if *r.CltvLimit != 22-uint32(BlockPadding) { if r.CltvLimit != 22-uint32(BlockPadding) {
t.Fatal("wrong cltv limit") t.Fatal("wrong cltv limit")
} }
@ -58,7 +58,7 @@ func TestRequestRoute(t *testing.T) {
finalCltvDelta := uint16(8) finalCltvDelta := uint16(8)
payment := &LightningPayment{ payment := &LightningPayment{
CltvLimit: &cltvLimit, CltvLimit: cltvLimit,
FinalCLTVDelta: finalCltvDelta, FinalCLTVDelta: finalCltvDelta,
} }

@ -1560,7 +1560,7 @@ type LightningPayment struct {
// CltvLimit is the maximum time lock that is allowed for attempts to // CltvLimit is the maximum time lock that is allowed for attempts to
// complete this payment. // complete this payment.
CltvLimit *uint32 CltvLimit uint32
// PaymentHash is the r-hash value to use within the HTLC extended to // PaymentHash is the r-hash value to use within the HTLC extended to
// the first hop. // the first hop.

@ -4,6 +4,7 @@ import (
"bytes" "bytes"
"fmt" "fmt"
"image/color" "image/color"
"math"
"math/rand" "math/rand"
"strings" "strings"
"sync/atomic" "sync/atomic"
@ -219,6 +220,7 @@ func TestFindRoutesWithFeeLimit(t *testing.T) {
restrictions := &RestrictParams{ restrictions := &RestrictParams{
FeeLimit: lnwire.NewMSatFromSatoshis(10), FeeLimit: lnwire.NewMSatFromSatoshis(10),
ProbabilitySource: noProbabilitySource, ProbabilitySource: noProbabilitySource,
CltvLimit: math.MaxUint32,
} }
route, err := ctx.router.FindRoute( route, err := ctx.router.FindRoute(

@ -505,6 +505,7 @@ func newRPCServer(s *server, macService *macaroons.Service,
MissionControl: s.missionControl, MissionControl: s.missionControl,
ActiveNetParams: activeNetParams.Params, ActiveNetParams: activeNetParams.Params,
Tower: s.controlTower, Tower: s.controlTower,
MaxTotalTimelock: cfg.MaxOutgoingCltvExpiry,
} }
var ( var (
@ -2940,7 +2941,7 @@ func (r *rpcServer) unmarshallSendToRouteRequest(
type rpcPaymentIntent struct { type rpcPaymentIntent struct {
msat lnwire.MilliSatoshi msat lnwire.MilliSatoshi
feeLimit lnwire.MilliSatoshi feeLimit lnwire.MilliSatoshi
cltvLimit *uint32 cltvLimit uint32
dest route.Vertex dest route.Vertex
rHash [32]byte rHash [32]byte
cltvDelta uint16 cltvDelta uint16
@ -2987,10 +2988,14 @@ func extractPaymentIntent(rpcPayReq *rpcPaymentRequest) (rpcPaymentIntent, error
payIntent.outgoingChannelID = &rpcPayReq.OutgoingChanId payIntent.outgoingChannelID = &rpcPayReq.OutgoingChanId
} }
// Take cltv limit from request if set. // Take the CLTV limit from the request if set, otherwise use the max.
if rpcPayReq.CltvLimit != 0 { cltvLimit, err := routerrpc.ValidateCLTVLimit(
payIntent.cltvLimit = &rpcPayReq.CltvLimit rpcPayReq.CltvLimit, cfg.MaxOutgoingCltvExpiry,
)
if err != nil {
return payIntent, err
} }
payIntent.cltvLimit = cltvLimit
if len(rpcPayReq.DestTlv) != 0 { if len(rpcPayReq.DestTlv) != 0 {
var err error var err error