From 967b4b2dc307046f8668a5241e0739b7fa1943f5 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Wed, 19 Feb 2020 09:53:13 +0100 Subject: [PATCH 01/16] channeldb: remove redundant MPPaymentCreationInfo struct MPPaymentCreationInfo and PaymentCreationInfo are identical except for the naming of CreationTime/CreationDate. --- channeldb/mp_payment.go | 23 +++-------------------- channeldb/payment_control_test.go | 2 +- channeldb/payments.go | 12 ++++++------ channeldb/payments_test.go | 2 +- routing/control_tower_test.go | 2 +- routing/router.go | 4 ++-- 6 files changed, 14 insertions(+), 31 deletions(-) diff --git a/channeldb/mp_payment.go b/channeldb/mp_payment.go index 9a26cdbda1..bee267590a 100644 --- a/channeldb/mp_payment.go +++ b/channeldb/mp_payment.go @@ -5,26 +5,9 @@ import ( "github.com/btcsuite/btcd/btcec" "github.com/lightningnetwork/lnd/lntypes" - "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/routing/route" ) -// MPPaymentCreationInfo is the information necessary to have ready when -// initiating a payment, moving it into state InFlight. -type MPPaymentCreationInfo struct { - // PaymentHash is the hash this payment is paying to. - PaymentHash lntypes.Hash - - // Value is the amount we are paying. - Value lnwire.MilliSatoshi - - // CreatingTime is the time at which this payment was started. - CreationTime time.Time - - // PaymentRequest is the full payment request, if any. - PaymentRequest []byte -} - // HTLCAttempt contains information about a specific HTLC attempt for a given // payment. This information is used by the router to handle any errors coming // back after an attempt is made, and to query the switch about the status of a @@ -74,8 +57,8 @@ type HTLCFailInfo struct { FailTime time.Time } -// MPPayment is a wrapper around a payment's MPPaymentCreationInfo and -// HTLCAttempts. All payments will have the MPPPaymentCreationInfo set, any +// MPPayment is a wrapper around a payment's PaymentCreationInfo and +// HTLCAttempts. All payments will have the PaymentCreationInfo set, any // HTLCs made in attempts to be completed will populated in the HTLCs slice. // Each populated HTLCAttempt represents an attempted HTLC, each of which may // have the associated Settle or Fail struct populated if the HTLC is no longer @@ -87,7 +70,7 @@ type MPPayment struct { // Info holds all static information about this payment, and is // populated when the payment is initiated. - Info *MPPaymentCreationInfo + Info *PaymentCreationInfo // HTLCs holds the information about individual HTLCs that we send in // order to make the payment. diff --git a/channeldb/payment_control_test.go b/channeldb/payment_control_test.go index 7be04c6b12..bb1458aef2 100644 --- a/channeldb/payment_control_test.go +++ b/channeldb/payment_control_test.go @@ -51,7 +51,7 @@ func genInfo() (*PaymentCreationInfo, *PaymentAttemptInfo, return &PaymentCreationInfo{ PaymentHash: rhash, Value: 1, - CreationDate: time.Unix(time.Now().Unix(), 0), + CreationTime: time.Unix(time.Now().Unix(), 0), PaymentRequest: []byte("hola"), }, &PaymentAttemptInfo{ diff --git a/channeldb/payments.go b/channeldb/payments.go index a03c9e0c75..0800b99838 100644 --- a/channeldb/payments.go +++ b/channeldb/payments.go @@ -178,8 +178,8 @@ type PaymentCreationInfo struct { // Value is the amount we are paying. Value lnwire.MilliSatoshi - // CreatingDate is the time when this payment was initiated. - CreationDate time.Time + // CreationTime is the time when this payment was initiated. + CreationTime time.Time // PaymentRequest is the full payment request, if any. PaymentRequest []byte @@ -283,10 +283,10 @@ func (p *Payment) ToMPPayment() *MPPayment { return &MPPayment{ sequenceNum: p.sequenceNum, - Info: &MPPaymentCreationInfo{ + Info: &PaymentCreationInfo{ PaymentHash: p.Info.PaymentHash, Value: p.Info.Value, - CreationTime: p.Info.CreationDate, + CreationTime: p.Info.CreationTime, PaymentRequest: p.Info.PaymentRequest, }, HTLCs: htlcs, @@ -475,7 +475,7 @@ func serializePaymentCreationInfo(w io.Writer, c *PaymentCreationInfo) error { return err } - byteOrder.PutUint64(scratch[:], uint64(c.CreationDate.Unix())) + byteOrder.PutUint64(scratch[:], uint64(c.CreationTime.Unix())) if _, err := w.Write(scratch[:]); err != nil { return err } @@ -509,7 +509,7 @@ func deserializePaymentCreationInfo(r io.Reader) (*PaymentCreationInfo, error) { if _, err := io.ReadFull(r, scratch[:]); err != nil { return nil, err } - c.CreationDate = time.Unix(int64(byteOrder.Uint64(scratch[:])), 0) + c.CreationTime = time.Unix(int64(byteOrder.Uint64(scratch[:])), 0) if _, err := io.ReadFull(r, scratch[:4]); err != nil { return nil, err diff --git a/channeldb/payments_test.go b/channeldb/payments_test.go index 16e952df4f..fb3de6cea3 100644 --- a/channeldb/payments_test.go +++ b/channeldb/payments_test.go @@ -62,7 +62,7 @@ func makeFakeInfo() (*PaymentCreationInfo, *PaymentAttemptInfo) { Value: 1000, // Use single second precision to avoid false positive test // failures due to the monotonic time component. - CreationDate: time.Unix(time.Now().Unix(), 0), + CreationTime: time.Unix(time.Now().Unix(), 0), PaymentRequest: []byte(""), } diff --git a/routing/control_tower_test.go b/routing/control_tower_test.go index e326e98c07..9fa5ec5b0b 100644 --- a/routing/control_tower_test.go +++ b/routing/control_tower_test.go @@ -311,7 +311,7 @@ func genInfo() (*channeldb.PaymentCreationInfo, *channeldb.PaymentAttemptInfo, return &channeldb.PaymentCreationInfo{ PaymentHash: rhash, Value: 1, - CreationDate: time.Unix(time.Now().Unix(), 0), + CreationTime: time.Unix(time.Now().Unix(), 0), PaymentRequest: []byte("hola"), }, &channeldb.PaymentAttemptInfo{ diff --git a/routing/router.go b/routing/router.go index e42ce7a0e8..d30191b5d4 100644 --- a/routing/router.go +++ b/routing/router.go @@ -1680,7 +1680,7 @@ func (r *ChannelRouter) preparePayment(payment *LightningPayment) ( info := &channeldb.PaymentCreationInfo{ PaymentHash: payment.PaymentHash, Value: payment.Amount, - CreationDate: time.Now(), + CreationTime: time.Now(), PaymentRequest: payment.PaymentRequest, } @@ -1709,7 +1709,7 @@ func (r *ChannelRouter) SendToRoute(hash lntypes.Hash, route *route.Route) ( info := &channeldb.PaymentCreationInfo{ PaymentHash: hash, Value: amt, - CreationDate: time.Now(), + CreationTime: time.Now(), PaymentRequest: nil, } From bee2380441e4b7344c9539dce1673cab5454fa14 Mon Sep 17 00:00:00 2001 From: "Johan T. Halseth" Date: Fri, 7 Feb 2020 10:31:27 +0100 Subject: [PATCH 02/16] channeldb: rename PaymentAttemptInfo to HTLCAttemptInfo To better distinguish payments from HTLCs, we rename the attempt info struct to HTLCAttemptInfo. We also embed it into the HTLCAttempt struct, to avoid having to duplicate this information. The paymentID term is renamed to attemptID. --- channeldb/mp_payment.go | 26 +++++++++++------- channeldb/payment_control.go | 12 ++++----- channeldb/payment_control_test.go | 16 +++++------ channeldb/payments.go | 45 +++++++++---------------------- channeldb/payments_test.go | 12 ++++----- routing/control_tower.go | 8 +++--- routing/control_tower_test.go | 6 ++--- routing/mock_test.go | 4 +-- routing/payment_lifecycle.go | 34 +++++++++++------------ routing/router.go | 2 +- 10 files changed, 76 insertions(+), 89 deletions(-) diff --git a/channeldb/mp_payment.go b/channeldb/mp_payment.go index bee267590a..4220e7aab7 100644 --- a/channeldb/mp_payment.go +++ b/channeldb/mp_payment.go @@ -8,16 +8,15 @@ import ( "github.com/lightningnetwork/lnd/routing/route" ) -// HTLCAttempt contains information about a specific HTLC attempt for a given -// payment. This information is used by the router to handle any errors coming -// back after an attempt is made, and to query the switch about the status of a -// payment. For settled payment this will be the information for the succeeding -// payment attempt. -type HTLCAttempt struct { - // PaymentID is the unique ID used for this attempt. - PaymentID uint64 - - // SessionKey is the ephemeral key used for this payment attempt. +// HTLCAttemptInfo contains static information about a specific HTLC attempt +// for a payment. This information is used by the router to handle any errors +// coming back after an attempt is made, and to query the switch about the +// status of the attempt. +type HTLCAttemptInfo struct { + // AttemptID is the unique ID used for this attempt. + AttemptID uint64 + + // SessionKey is the ephemeral key used for this attempt. SessionKey *btcec.PrivateKey // Route is the route attempted to send the HTLC. @@ -25,6 +24,13 @@ type HTLCAttempt struct { // AttemptTime is the time at which this HTLC was attempted. AttemptTime time.Time +} + +// HTLCAttempt contains information about a specific HTLC attempt for a given +// payment. It contains the HTLCAttemptInfo used to send the HTLC, as well +// as a timestamp and any known outcome of the attempt. +type HTLCAttempt struct { + HTLCAttemptInfo // Settle is the preimage of a successful payment. This serves as a // proof of payment. It will only be non-nil for settled payments. diff --git a/channeldb/payment_control.go b/channeldb/payment_control.go index 63be23a2eb..b6bcd5a11d 100644 --- a/channeldb/payment_control.go +++ b/channeldb/payment_control.go @@ -143,14 +143,14 @@ func (p *PaymentControl) InitPayment(paymentHash lntypes.Hash, return updateErr } -// RegisterAttempt atomically records the provided PaymentAttemptInfo to the +// RegisterAttempt atomically records the provided HTLCAttemptInfo to the // DB. func (p *PaymentControl) RegisterAttempt(paymentHash lntypes.Hash, - attempt *PaymentAttemptInfo) error { + attempt *HTLCAttemptInfo) error { // Serialize the information before opening the db transaction. var a bytes.Buffer - if err := serializePaymentAttemptInfo(&a, attempt); err != nil { + if err := serializeHTLCAttemptInfo(&a, attempt); err != nil { return err } attemptBytes := a.Bytes() @@ -405,14 +405,14 @@ func ensureInFlight(bucket *bbolt.Bucket) error { } // fetchPaymentAttempt fetches the payment attempt from the bucket. -func fetchPaymentAttempt(bucket *bbolt.Bucket) (*PaymentAttemptInfo, error) { +func fetchPaymentAttempt(bucket *bbolt.Bucket) (*HTLCAttemptInfo, error) { attemptData := bucket.Get(paymentAttemptInfoKey) if attemptData == nil { return nil, errNoAttemptInfo } r := bytes.NewReader(attemptData) - return deserializePaymentAttemptInfo(r) + return deserializeHTLCAttemptInfo(r) } // InFlightPayment is a wrapper around a payment that has status InFlight. @@ -424,7 +424,7 @@ type InFlightPayment struct { // made to this payment hash. // // NOTE: Might be nil. - Attempt *PaymentAttemptInfo + Attempt *HTLCAttemptInfo } // FetchInFlightPayments returns all payments with status InFlight. diff --git a/channeldb/payment_control_test.go b/channeldb/payment_control_test.go index bb1458aef2..2910063101 100644 --- a/channeldb/payment_control_test.go +++ b/channeldb/payment_control_test.go @@ -38,7 +38,7 @@ func genPreimage() ([32]byte, error) { return preimage, nil } -func genInfo() (*PaymentCreationInfo, *PaymentAttemptInfo, +func genInfo() (*PaymentCreationInfo, *HTLCAttemptInfo, lntypes.Preimage, error) { preimage, err := genPreimage() @@ -54,8 +54,8 @@ func genInfo() (*PaymentCreationInfo, *PaymentAttemptInfo, CreationTime: time.Unix(time.Now().Unix(), 0), PaymentRequest: []byte("hola"), }, - &PaymentAttemptInfo{ - PaymentID: 1, + &HTLCAttemptInfo{ + AttemptID: 1, SessionKey: priv, Route: testRoute, }, preimage, nil @@ -119,7 +119,7 @@ func TestPaymentControlSwitchFail(t *testing.T) { ) // Record a new attempt. - attempt.PaymentID = 2 + attempt.AttemptID = 2 err = pControl.RegisterAttempt(info.PaymentHash, attempt) if err != nil { t.Fatalf("unable to send htlc message: %v", err) @@ -445,7 +445,7 @@ func checkPaymentCreationInfo(bucket *bbolt.Bucket, c *PaymentCreationInfo) erro return nil } -func checkPaymentAttemptInfo(bucket *bbolt.Bucket, a *PaymentAttemptInfo) error { +func checkHTLCAttemptInfo(bucket *bbolt.Bucket, a *HTLCAttemptInfo) error { b := bucket.Get(paymentAttemptInfoKey) switch { case b == nil && a == nil: @@ -457,7 +457,7 @@ func checkPaymentAttemptInfo(bucket *bbolt.Bucket, a *PaymentAttemptInfo) error } r := bytes.NewReader(b) - a2, err := deserializePaymentAttemptInfo(r) + a2, err := deserializeHTLCAttemptInfo(r) if err != nil { return err } @@ -508,7 +508,7 @@ func checkFailInfo(bucket *bbolt.Bucket, failReason *FailureReason) error { } func assertPaymentInfo(t *testing.T, db *DB, hash lntypes.Hash, - c *PaymentCreationInfo, a *PaymentAttemptInfo, s lntypes.Preimage, + c *PaymentCreationInfo, a *HTLCAttemptInfo, s lntypes.Preimage, f *FailureReason) { t.Helper() @@ -535,7 +535,7 @@ func assertPaymentInfo(t *testing.T, db *DB, hash lntypes.Hash, return err } - if err := checkPaymentAttemptInfo(bucket, a); err != nil { + if err := checkHTLCAttemptInfo(bucket, a); err != nil { return err } diff --git a/channeldb/payments.go b/channeldb/payments.go index 0800b99838..ae6d8abd17 100644 --- a/channeldb/payments.go +++ b/channeldb/payments.go @@ -8,7 +8,6 @@ import ( "sort" "time" - "github.com/btcsuite/btcd/btcec" "github.com/btcsuite/btcd/wire" "github.com/coreos/bbolt" "github.com/lightningnetwork/lnd/lntypes" @@ -185,25 +184,9 @@ type PaymentCreationInfo struct { PaymentRequest []byte } -// PaymentAttemptInfo contains information about a specific payment attempt for -// a given payment. This information is used by the router to handle any errors -// coming back after an attempt is made, and to query the switch about the -// status of a payment. For settled payment this will be the information for -// the succeeding payment attempt. -type PaymentAttemptInfo struct { - // PaymentID is the unique ID used for this attempt. - PaymentID uint64 - - // SessionKey is the ephemeral key used for this payment attempt. - SessionKey *btcec.PrivateKey - - // Route is the route attempted to send the HTLC. - Route route.Route -} - // Payment is a wrapper around a payment's PaymentCreationInfo, -// PaymentAttemptInfo, and preimage. All payments will have the -// PaymentCreationInfo set, the PaymentAttemptInfo will be set only if at least +// HTLCAttemptInfo, and preimage. All payments will have the +// PaymentCreationInfo set, the HTLCAttemptInfo will be set only if at least // one payment attempt has been made, while only completed payments will have a // non-zero payment preimage. type Payment struct { @@ -221,7 +204,7 @@ type Payment struct { // Attempt is the information about the last payment attempt made. // // NOTE: Can be nil if no attempt is yet made. - Attempt *PaymentAttemptInfo + Attempt *HTLCAttemptInfo // Preimage is the preimage of a successful payment. This serves as a // proof of payment. It will only be non-nil for settled payments. @@ -272,11 +255,9 @@ func (p *Payment) ToMPPayment() *MPPayment { // NOTE: AttemptTime is not set for legacy payments. htlcs = []HTLCAttempt{ { - PaymentID: p.Attempt.PaymentID, - SessionKey: p.Attempt.SessionKey, - Route: p.Attempt.Route, - Settle: settle, - Failure: failure, + HTLCAttemptInfo: *p.Attempt, + Settle: settle, + Failure: failure, }, } } @@ -392,11 +373,11 @@ func fetchPayment(bucket *bbolt.Bucket) (*MPPayment, error) { } - // Get the PaymentAttemptInfo. This can be unset. + // Get the HTLCAttemptInfo. This can be unset. b = bucket.Get(paymentAttemptInfoKey) if b != nil { r = bytes.NewReader(b) - p.Attempt, err = deserializePaymentAttemptInfo(r) + p.Attempt, err = deserializeHTLCAttemptInfo(r) if err != nil { return nil, err } @@ -527,8 +508,8 @@ func deserializePaymentCreationInfo(r io.Reader) (*PaymentCreationInfo, error) { return c, nil } -func serializePaymentAttemptInfo(w io.Writer, a *PaymentAttemptInfo) error { - if err := WriteElements(w, a.PaymentID, a.SessionKey); err != nil { +func serializeHTLCAttemptInfo(w io.Writer, a *HTLCAttemptInfo) error { + if err := WriteElements(w, a.AttemptID, a.SessionKey); err != nil { return err } @@ -539,9 +520,9 @@ func serializePaymentAttemptInfo(w io.Writer, a *PaymentAttemptInfo) error { return nil } -func deserializePaymentAttemptInfo(r io.Reader) (*PaymentAttemptInfo, error) { - a := &PaymentAttemptInfo{} - err := ReadElements(r, &a.PaymentID, &a.SessionKey) +func deserializeHTLCAttemptInfo(r io.Reader) (*HTLCAttemptInfo, error) { + a := &HTLCAttemptInfo{} + err := ReadElements(r, &a.AttemptID, &a.SessionKey) if err != nil { return nil, err } diff --git a/channeldb/payments_test.go b/channeldb/payments_test.go index fb3de6cea3..26148a1ecd 100644 --- a/channeldb/payments_test.go +++ b/channeldb/payments_test.go @@ -53,7 +53,7 @@ var ( } ) -func makeFakeInfo() (*PaymentCreationInfo, *PaymentAttemptInfo) { +func makeFakeInfo() (*PaymentCreationInfo, *HTLCAttemptInfo) { var preimg lntypes.Preimage copy(preimg[:], rev[:]) @@ -66,8 +66,8 @@ func makeFakeInfo() (*PaymentCreationInfo, *PaymentAttemptInfo) { PaymentRequest: []byte(""), } - a := &PaymentAttemptInfo{ - PaymentID: 44, + a := &HTLCAttemptInfo{ + AttemptID: 44, SessionKey: priv, Route: testRoute, } @@ -109,11 +109,11 @@ func TestSentPaymentSerialization(t *testing.T) { } b.Reset() - if err := serializePaymentAttemptInfo(&b, s); err != nil { + if err := serializeHTLCAttemptInfo(&b, s); err != nil { t.Fatalf("unable to serialize info: %v", err) } - newAttemptInfo, err := deserializePaymentAttemptInfo(&b) + newAttemptInfo, err := deserializeHTLCAttemptInfo(&b) if err != nil { t.Fatalf("unable to deserialize info: %v", err) } @@ -144,7 +144,7 @@ func TestSentPaymentSerialization(t *testing.T) { // they are not equal. func assertRouteEqual(a, b *route.Route) error { if !reflect.DeepEqual(a, b) { - return fmt.Errorf("PaymentAttemptInfos don't match: %v vs %v", + return fmt.Errorf("HTLCAttemptInfos don't match: %v vs %v", spew.Sdump(a), spew.Sdump(b)) } diff --git a/routing/control_tower.go b/routing/control_tower.go index 4cf6839ff1..0dffa7c633 100644 --- a/routing/control_tower.go +++ b/routing/control_tower.go @@ -19,8 +19,8 @@ type ControlTower interface { // hash. InitPayment(lntypes.Hash, *channeldb.PaymentCreationInfo) error - // RegisterAttempt atomically records the provided PaymentAttemptInfo. - RegisterAttempt(lntypes.Hash, *channeldb.PaymentAttemptInfo) error + // RegisterAttempt atomically records the provided HTLCAttemptInfo. + RegisterAttempt(lntypes.Hash, *channeldb.HTLCAttemptInfo) error // Success transitions a payment into the Succeeded state. After // invoking this method, InitPayment should always return an error to @@ -91,10 +91,10 @@ func (p *controlTower) InitPayment(paymentHash lntypes.Hash, return p.db.InitPayment(paymentHash, info) } -// RegisterAttempt atomically records the provided PaymentAttemptInfo to the +// RegisterAttempt atomically records the provided HTLCAttemptInfo to the // DB. func (p *controlTower) RegisterAttempt(paymentHash lntypes.Hash, - attempt *channeldb.PaymentAttemptInfo) error { + attempt *channeldb.HTLCAttemptInfo) error { return p.db.RegisterAttempt(paymentHash, attempt) } diff --git a/routing/control_tower_test.go b/routing/control_tower_test.go index 9fa5ec5b0b..d4399ced4f 100644 --- a/routing/control_tower_test.go +++ b/routing/control_tower_test.go @@ -298,7 +298,7 @@ func initDB() (*channeldb.DB, error) { return db, err } -func genInfo() (*channeldb.PaymentCreationInfo, *channeldb.PaymentAttemptInfo, +func genInfo() (*channeldb.PaymentCreationInfo, *channeldb.HTLCAttemptInfo, lntypes.Preimage, error) { preimage, err := genPreimage() @@ -314,8 +314,8 @@ func genInfo() (*channeldb.PaymentCreationInfo, *channeldb.PaymentAttemptInfo, CreationTime: time.Unix(time.Now().Unix(), 0), PaymentRequest: []byte("hola"), }, - &channeldb.PaymentAttemptInfo{ - PaymentID: 1, + &channeldb.HTLCAttemptInfo{ + AttemptID: 1, SessionKey: priv, Route: testRoute, }, preimage, nil diff --git a/routing/mock_test.go b/routing/mock_test.go index fac67aa9f2..a840d73861 100644 --- a/routing/mock_test.go +++ b/routing/mock_test.go @@ -178,7 +178,7 @@ type initArgs struct { } type registerArgs struct { - a *channeldb.PaymentAttemptInfo + a *channeldb.HTLCAttemptInfo } type successArgs struct { @@ -238,7 +238,7 @@ func (m *mockControlTower) InitPayment(phash lntypes.Hash, } func (m *mockControlTower) RegisterAttempt(phash lntypes.Hash, - a *channeldb.PaymentAttemptInfo) error { + a *channeldb.HTLCAttemptInfo) error { m.Lock() defer m.Unlock() diff --git a/routing/payment_lifecycle.go b/routing/payment_lifecycle.go index 2283ca057d..13d59370cd 100644 --- a/routing/payment_lifecycle.go +++ b/routing/payment_lifecycle.go @@ -35,7 +35,7 @@ type paymentLifecycle struct { timeoutChan <-chan time.Time currentHeight int32 finalCLTVDelta uint16 - attempt *channeldb.PaymentAttemptInfo + attempt *channeldb.HTLCAttemptInfo circuit *sphinx.Circuit lastError error } @@ -97,17 +97,17 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) { // Now ask the switch to return the result of the payment when // available. resultChan, err := p.router.cfg.Payer.GetPaymentResult( - p.attempt.PaymentID, p.payment.PaymentHash, errorDecryptor, + p.attempt.AttemptID, p.payment.PaymentHash, errorDecryptor, ) switch { - // If this payment ID is unknown to the Switch, it means it was + // If this attempt ID is unknown to the Switch, it means it was // never checkpointed and forwarded by the switch before a // restart. In this case we can safely send a new payment // attempt, and wait for its result to be available. case err == htlcswitch.ErrPaymentIDNotFound: log.Debugf("Payment ID %v for hash %x not found in "+ - "the Switch, retrying.", p.attempt.PaymentID, + "the Switch, retrying.", p.attempt.AttemptID, p.payment.PaymentHash) // Reset the attempt to indicate we want to make a new @@ -117,8 +117,8 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) { // A critical, unexpected error was encountered. case err != nil: - log.Errorf("Failed getting result for paymentID %d "+ - "from switch: %v", p.attempt.PaymentID, err) + log.Errorf("Failed getting result for attemptID %d "+ + "from switch: %v", p.attempt.AttemptID, err) return [32]byte{}, nil, err } @@ -161,11 +161,11 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) { // We successfully got a payment result back from the switch. log.Debugf("Payment %x succeeded with pid=%v", - p.payment.PaymentHash, p.attempt.PaymentID) + p.payment.PaymentHash, p.attempt.AttemptID) // Report success to mission control. err = p.router.cfg.MissionControl.ReportPaymentSuccess( - p.attempt.PaymentID, &p.attempt.Route, + p.attempt.AttemptID, &p.attempt.Route, ) if err != nil { log.Errorf("Error reporting payment success to mc: %v", @@ -331,21 +331,21 @@ func (p *paymentLifecycle) createNewPaymentAttempt() (lnwire.ShortChannelID, // We generate a new, unique payment ID that we will use for // this HTLC. - paymentID, err := p.router.cfg.NextPaymentID() + attemptID, err := p.router.cfg.NextPaymentID() if err != nil { return lnwire.ShortChannelID{}, nil, err } // We now have all the information needed to populate // the current attempt information. - p.attempt = &channeldb.PaymentAttemptInfo{ - PaymentID: paymentID, + p.attempt = &channeldb.HTLCAttemptInfo{ + AttemptID: attemptID, SessionKey: sessionKey, Route: *rt, } // Before sending this HTLC to the switch, we checkpoint the - // fresh paymentID and route to the DB. This lets us know on + // fresh attemptID and route to the DB. This lets us know on // startup the ID of the payment that we attempted to send, // such that we can query the Switch for its whereabouts. The // route is needed to handle the result when it eventually @@ -363,7 +363,7 @@ func (p *paymentLifecycle) sendPaymentAttempt(firstHop lnwire.ShortChannelID, htlcAdd *lnwire.UpdateAddHTLC) error { log.Tracef("Attempting to send payment %x (pid=%v), "+ - "using route: %v", p.payment.PaymentHash, p.attempt.PaymentID, + "using route: %v", p.payment.PaymentHash, p.attempt.AttemptID, newLogClosure(func() string { return spew.Sdump(p.attempt.Route) }), @@ -374,17 +374,17 @@ func (p *paymentLifecycle) sendPaymentAttempt(firstHop lnwire.ShortChannelID, // such that we can resume waiting for the result after a // restart. err := p.router.cfg.Payer.SendHTLC( - firstHop, p.attempt.PaymentID, htlcAdd, + firstHop, p.attempt.AttemptID, htlcAdd, ) if err != nil { log.Errorf("Failed sending attempt %d for payment "+ - "%x to switch: %v", p.attempt.PaymentID, + "%x to switch: %v", p.attempt.AttemptID, p.payment.PaymentHash, err) return err } log.Debugf("Payment %x (pid=%v) successfully sent to switch, route: %v", - p.payment.PaymentHash, p.attempt.PaymentID, &p.attempt.Route) + p.payment.PaymentHash, p.attempt.AttemptID, &p.attempt.Route) return nil } @@ -394,7 +394,7 @@ func (p *paymentLifecycle) sendPaymentAttempt(firstHop lnwire.ShortChannelID, func (p *paymentLifecycle) handleSendError(sendErr error) error { reason := p.router.processSendError( - p.attempt.PaymentID, &p.attempt.Route, sendErr, + p.attempt.AttemptID, &p.attempt.Route, sendErr, ) if reason == nil { // Save the forwarding error so it can be returned if diff --git a/routing/router.go b/routing/router.go index d30191b5d4..8dbb45de5a 100644 --- a/routing/router.go +++ b/routing/router.go @@ -1768,7 +1768,7 @@ func (r *ChannelRouter) SendToRoute(hash lntypes.Hash, route *route.Route) ( // router will call this method for every payment still in-flight according to // the ControlTower. func (r *ChannelRouter) sendPayment( - existingAttempt *channeldb.PaymentAttemptInfo, + existingAttempt *channeldb.HTLCAttemptInfo, payment *LightningPayment, paySession PaymentSession) ( [32]byte, *route.Route, error) { From c29b74168fafd3abce174f3cd647da78d6df104a Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 20 Feb 2020 14:43:25 +0100 Subject: [PATCH 03/16] channeldb/test: refactor payment control test Previously this was tested as a white box. Database access methods were duplicated as test code and compared to the return value of the code under test. This approaches leads to brittle test because it relies heavily on implementation details. This commit changes this and prepares for additional test coverage being added in later commits. --- channeldb/payment_control_test.go | 239 +++++++++--------------------- 1 file changed, 70 insertions(+), 169 deletions(-) diff --git a/channeldb/payment_control_test.go b/channeldb/payment_control_test.go index 2910063101..5272ec79a6 100644 --- a/channeldb/payment_control_test.go +++ b/channeldb/payment_control_test.go @@ -1,7 +1,6 @@ package channeldb import ( - "bytes" "crypto/rand" "fmt" "io" @@ -11,7 +10,6 @@ import ( "time" "github.com/btcsuite/fastsha256" - "github.com/coreos/bbolt" "github.com/davecgh/go-spew/spew" "github.com/lightningnetwork/lnd/lntypes" ) @@ -85,9 +83,9 @@ func TestPaymentControlSwitchFail(t *testing.T) { t.Fatalf("unable to send htlc message: %v", err) } - assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, db, info.PaymentHash, info, nil, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, nil, lntypes.Preimage{}, nil, ) @@ -99,9 +97,9 @@ func TestPaymentControlSwitchFail(t *testing.T) { } // Verify the status is indeed Failed. - assertPaymentStatus(t, db, info.PaymentHash, StatusFailed) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusFailed) assertPaymentInfo( - t, db, info.PaymentHash, info, nil, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, nil, lntypes.Preimage{}, &failReason, ) @@ -112,9 +110,9 @@ func TestPaymentControlSwitchFail(t *testing.T) { t.Fatalf("unable to send htlc message: %v", err) } - assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, db, info.PaymentHash, info, nil, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, nil, lntypes.Preimage{}, nil, ) @@ -124,9 +122,9 @@ func TestPaymentControlSwitchFail(t *testing.T) { if err != nil { t.Fatalf("unable to send htlc message: %v", err) } - assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, db, info.PaymentHash, info, attempt, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, attempt, lntypes.Preimage{}, nil, ) @@ -149,8 +147,8 @@ func TestPaymentControlSwitchFail(t *testing.T) { spew.Sdump(payment.HTLCs[0].Route), err) } - assertPaymentStatus(t, db, info.PaymentHash, StatusSucceeded) - assertPaymentInfo(t, db, info.PaymentHash, info, attempt, preimg, nil) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusSucceeded) + assertPaymentInfo(t, pControl, info.PaymentHash, info, attempt, preimg, nil) // Attempt a final payment, which should now fail since the prior // payment succeed. @@ -184,9 +182,9 @@ func TestPaymentControlSwitchDoubleSend(t *testing.T) { t.Fatalf("unable to send htlc message: %v", err) } - assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, db, info.PaymentHash, info, nil, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, nil, lntypes.Preimage{}, nil, ) @@ -204,9 +202,9 @@ func TestPaymentControlSwitchDoubleSend(t *testing.T) { if err != nil { t.Fatalf("unable to send htlc message: %v", err) } - assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, db, info.PaymentHash, info, attempt, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, attempt, lntypes.Preimage{}, nil, ) @@ -221,8 +219,8 @@ func TestPaymentControlSwitchDoubleSend(t *testing.T) { if _, err := pControl.Success(info.PaymentHash, preimg); err != nil { t.Fatalf("error shouldn't have been received, got: %v", err) } - assertPaymentStatus(t, db, info.PaymentHash, StatusSucceeded) - assertPaymentInfo(t, db, info.PaymentHash, info, attempt, preimg, nil) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusSucceeded) + assertPaymentInfo(t, pControl, info.PaymentHash, info, attempt, preimg, nil) err = pControl.InitPayment(info.PaymentHash, info) if err != ErrAlreadyPaid { @@ -253,11 +251,7 @@ func TestPaymentControlSuccessesWithoutInFlight(t *testing.T) { t.Fatalf("expected ErrPaymentNotInitiated, got %v", err) } - assertPaymentStatus(t, db, info.PaymentHash, StatusUnknown) - assertPaymentInfo( - t, db, info.PaymentHash, nil, nil, lntypes.Preimage{}, - nil, - ) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusUnknown) } // TestPaymentControlFailsWithoutInFlight checks that a strict payment @@ -283,10 +277,7 @@ func TestPaymentControlFailsWithoutInFlight(t *testing.T) { t.Fatalf("expected ErrPaymentNotInitiated, got %v", err) } - assertPaymentStatus(t, db, info.PaymentHash, StatusUnknown) - assertPaymentInfo( - t, db, info.PaymentHash, nil, nil, lntypes.Preimage{}, nil, - ) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusUnknown) } // TestPaymentControlDeleteNonInFlight checks that calling DeletaPayments only @@ -344,9 +335,9 @@ func TestPaymentControlDeleteNonInFligt(t *testing.T) { } // Verify the status is indeed Failed. - assertPaymentStatus(t, db, info.PaymentHash, StatusFailed) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusFailed) assertPaymentInfo( - t, db, info.PaymentHash, info, attempt, + t, pControl, info.PaymentHash, info, attempt, lntypes.Preimage{}, &failReason, ) } else if p.success { @@ -356,14 +347,14 @@ func TestPaymentControlDeleteNonInFligt(t *testing.T) { t.Fatalf("error shouldn't have been received, got: %v", err) } - assertPaymentStatus(t, db, info.PaymentHash, StatusSucceeded) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusSucceeded) assertPaymentInfo( - t, db, info.PaymentHash, info, attempt, preimg, nil, + t, pControl, info.PaymentHash, info, attempt, preimg, nil, ) } else { - assertPaymentStatus(t, db, info.PaymentHash, StatusInFlight) + assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, db, info.PaymentHash, info, attempt, + t, pControl, info.PaymentHash, info, attempt, lntypes.Preimage{}, nil, ) } @@ -390,166 +381,76 @@ func TestPaymentControlDeleteNonInFligt(t *testing.T) { } } -func assertPaymentStatus(t *testing.T, db *DB, - hash [32]byte, expStatus PaymentStatus) { +// assertPaymentStatus retrieves the status of the payment referred to by hash +// and compares it with the expected state. +func assertPaymentStatus(t *testing.T, p *PaymentControl, + hash lntypes.Hash, expStatus PaymentStatus) { t.Helper() - var paymentStatus = StatusUnknown - err := db.View(func(tx *bbolt.Tx) error { - payments := tx.Bucket(paymentsRootBucket) - if payments == nil { - return nil - } - - bucket := payments.Bucket(hash[:]) - if bucket == nil { - return nil - } - - // Get the existing status of this payment, if any. - paymentStatus = fetchPaymentStatus(bucket) - return nil - }) + payment, err := p.FetchPayment(hash) + if expStatus == StatusUnknown && err == ErrPaymentNotInitiated { + return + } if err != nil { - t.Fatalf("unable to fetch payment status: %v", err) + t.Fatal(err) } - if paymentStatus != expStatus { + if payment.Status != expStatus { t.Fatalf("payment status mismatch: expected %v, got %v", - expStatus, paymentStatus) + expStatus, payment.Status) } } -func checkPaymentCreationInfo(bucket *bbolt.Bucket, c *PaymentCreationInfo) error { - b := bucket.Get(paymentCreationInfoKey) - switch { - case b == nil && c == nil: - return nil - case b == nil: - return fmt.Errorf("expected creation info not found") - case c == nil: - return fmt.Errorf("unexpected creation info found") - } - - r := bytes.NewReader(b) - c2, err := deserializePaymentCreationInfo(r) - if err != nil { - return err - } - if !reflect.DeepEqual(c, c2) { - return fmt.Errorf("PaymentCreationInfos don't match: %v vs %v", - spew.Sdump(c), spew.Sdump(c2)) - } - - return nil -} +// assertPaymentInfo retrieves the payment referred to by hash and verifies the +// expected values. +func assertPaymentInfo(t *testing.T, p *PaymentControl, hash lntypes.Hash, + c *PaymentCreationInfo, a *HTLCAttemptInfo, s lntypes.Preimage, + f *FailureReason) { -func checkHTLCAttemptInfo(bucket *bbolt.Bucket, a *HTLCAttemptInfo) error { - b := bucket.Get(paymentAttemptInfoKey) - switch { - case b == nil && a == nil: - return nil - case b == nil: - return fmt.Errorf("expected attempt info not found") - case a == nil: - return fmt.Errorf("unexpected attempt info found") - } + t.Helper() - r := bytes.NewReader(b) - a2, err := deserializeHTLCAttemptInfo(r) + payment, err := p.FetchPayment(hash) if err != nil { - return err - } - - return assertRouteEqual(&a.Route, &a2.Route) -} - -func checkSettleInfo(bucket *bbolt.Bucket, preimg lntypes.Preimage) error { - zero := lntypes.Preimage{} - b := bucket.Get(paymentSettleInfoKey) - switch { - case b == nil && preimg == zero: - return nil - case b == nil: - return fmt.Errorf("expected preimage not found") - case preimg == zero: - return fmt.Errorf("unexpected preimage found") - } - - var pre2 lntypes.Preimage - copy(pre2[:], b[:]) - if preimg != pre2 { - return fmt.Errorf("Preimages don't match: %x vs %x", - preimg, pre2) - } - - return nil -} - -func checkFailInfo(bucket *bbolt.Bucket, failReason *FailureReason) error { - b := bucket.Get(paymentFailInfoKey) - switch { - case b == nil && failReason == nil: - return nil - case b == nil: - return fmt.Errorf("expected fail info not found") - case failReason == nil: - return fmt.Errorf("unexpected fail info found") + t.Fatal(err) } - failReason2 := FailureReason(b[0]) - if *failReason != failReason2 { - return fmt.Errorf("Failure infos don't match: %v vs %v", - *failReason, failReason2) + if !reflect.DeepEqual(payment.Info, c) { + t.Fatalf("PaymentCreationInfos don't match: %v vs %v", + spew.Sdump(payment.Info), spew.Sdump(c)) } - return nil -} - -func assertPaymentInfo(t *testing.T, db *DB, hash lntypes.Hash, - c *PaymentCreationInfo, a *HTLCAttemptInfo, s lntypes.Preimage, - f *FailureReason) { - - t.Helper() - - err := db.View(func(tx *bbolt.Tx) error { - payments := tx.Bucket(paymentsRootBucket) - if payments == nil && c == nil { - return nil - } - if payments == nil { - return fmt.Errorf("sent payments not found") - } - - bucket := payments.Bucket(hash[:]) - if bucket == nil && c == nil { - return nil + if f != nil { + if *payment.FailureReason != *f { + t.Fatal("unexpected failure reason") } - - if bucket == nil { - return fmt.Errorf("payment not found") + } else { + if payment.FailureReason != nil { + t.Fatal("unexpected failure reason") } + } - if err := checkPaymentCreationInfo(bucket, c); err != nil { - return err + if a == nil { + if len(payment.HTLCs) > 0 { + t.Fatal("expected no htlcs") } + return + } - if err := checkHTLCAttemptInfo(bucket, a); err != nil { - return err - } + htlc := payment.HTLCs[0] + if err := assertRouteEqual(&htlc.Route, &a.Route); err != nil { + t.Fatal("routes do not match") + } - if err := checkSettleInfo(bucket, s); err != nil { - return err + var zeroPreimage = lntypes.Preimage{} + if s != zeroPreimage { + if htlc.Settle.Preimage != s { + t.Fatalf("Preimages don't match: %x vs %x", + htlc.Settle.Preimage, s) } - - if err := checkFailInfo(bucket, f); err != nil { - return err + } else { + if htlc.Settle != nil { + t.Fatal("expected no settle info") } - return nil - }) - if err != nil { - t.Fatalf("assert payment info failed: %v", err) } - } From cc5e18c487a87f7be36c2303d81c9fb8c0ff4b44 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Wed, 19 Feb 2020 14:34:27 +0100 Subject: [PATCH 04/16] channeldb: isolate duplicate payments Duplicate payments is legacy that we keep alive for accounting purposes. This commit isolates the deserialization logic for duplicate payments in its own file, so that regular payment logic and db structure can evolve without needing to handle/migrate the legacy data. --- channeldb/duplicate_payments.go | 246 ++++++++++++++++++++++++++++++++ channeldb/payments.go | 33 +---- 2 files changed, 252 insertions(+), 27 deletions(-) create mode 100644 channeldb/duplicate_payments.go diff --git a/channeldb/duplicate_payments.go b/channeldb/duplicate_payments.go new file mode 100644 index 0000000000..da9e969b0f --- /dev/null +++ b/channeldb/duplicate_payments.go @@ -0,0 +1,246 @@ +package channeldb + +import ( + "bytes" + "encoding/binary" + "fmt" + "io" + "time" + + "github.com/btcsuite/btcd/btcec" + "github.com/coreos/bbolt" + "github.com/lightningnetwork/lnd/lntypes" + "github.com/lightningnetwork/lnd/lnwire" + "github.com/lightningnetwork/lnd/routing/route" +) + +var ( + // duplicatePaymentsBucket is the name of a optional sub-bucket within + // the payment hash bucket, that is used to hold duplicate payments to a + // payment hash. This is needed to support information from earlier + // versions of lnd, where it was possible to pay to a payment hash more + // than once. + duplicatePaymentsBucket = []byte("payment-duplicate-bucket") + + // duplicatePaymentSettleInfoKey is a key used in the payment's + // sub-bucket to store the settle info of the payment. + duplicatePaymentSettleInfoKey = []byte("payment-settle-info") + + // duplicatePaymentAttemptInfoKey is a key used in the payment's + // sub-bucket to store the info about the latest attempt that was done + // for the payment in question. + duplicatePaymentAttemptInfoKey = []byte("payment-attempt-info") + + // duplicatePaymentCreationInfoKey is a key used in the payment's + // sub-bucket to store the creation info of the payment. + duplicatePaymentCreationInfoKey = []byte("payment-creation-info") + + // duplicatePaymentFailInfoKey is a key used in the payment's sub-bucket + // to store information about the reason a payment failed. + duplicatePaymentFailInfoKey = []byte("payment-fail-info") + + // duplicatePaymentSequenceKey is a key used in the payment's sub-bucket + // to store the sequence number of the payment. + duplicatePaymentSequenceKey = []byte("payment-sequence-key") +) + +// duplicateHTLCAttemptInfo contains static information about a specific HTLC +// attempt for a payment. This information is used by the router to handle any +// errors coming back after an attempt is made, and to query the switch about +// the status of the attempt. +type duplicateHTLCAttemptInfo struct { + // attemptID is the unique ID used for this attempt. + attemptID uint64 + + // sessionKey is the ephemeral key used for this attempt. + sessionKey *btcec.PrivateKey + + // route is the route attempted to send the HTLC. + route route.Route +} + +// fetchDuplicatePaymentStatus fetches the payment status of the payment. If the +// payment isn't found, it will default to "StatusUnknown". +func fetchDuplicatePaymentStatus(bucket *bbolt.Bucket) PaymentStatus { + if bucket.Get(duplicatePaymentSettleInfoKey) != nil { + return StatusSucceeded + } + + if bucket.Get(duplicatePaymentFailInfoKey) != nil { + return StatusFailed + } + + if bucket.Get(duplicatePaymentCreationInfoKey) != nil { + return StatusInFlight + } + + return StatusUnknown +} + +func deserializeDuplicateHTLCAttemptInfo(r io.Reader) ( + *duplicateHTLCAttemptInfo, error) { + + a := &duplicateHTLCAttemptInfo{} + err := ReadElements(r, &a.attemptID, &a.sessionKey) + if err != nil { + return nil, err + } + a.route, err = DeserializeRoute(r) + if err != nil { + return nil, err + } + return a, nil +} + +func deserializeDuplicatePaymentCreationInfo(r io.Reader) ( + *PaymentCreationInfo, error) { + + var scratch [8]byte + + c := &PaymentCreationInfo{} + + if _, err := io.ReadFull(r, c.PaymentHash[:]); err != nil { + return nil, err + } + + if _, err := io.ReadFull(r, scratch[:]); err != nil { + return nil, err + } + c.Value = lnwire.MilliSatoshi(byteOrder.Uint64(scratch[:])) + + if _, err := io.ReadFull(r, scratch[:]); err != nil { + return nil, err + } + c.CreationTime = time.Unix(int64(byteOrder.Uint64(scratch[:])), 0) + + if _, err := io.ReadFull(r, scratch[:4]); err != nil { + return nil, err + } + + reqLen := byteOrder.Uint32(scratch[:4]) + payReq := make([]byte, reqLen) + if reqLen > 0 { + if _, err := io.ReadFull(r, payReq); err != nil { + return nil, err + } + } + c.PaymentRequest = payReq + + return c, nil +} + +func fetchDuplicatePayment(bucket *bbolt.Bucket) (*MPPayment, error) { + seqBytes := bucket.Get(duplicatePaymentSequenceKey) + if seqBytes == nil { + return nil, fmt.Errorf("sequence number not found") + } + + sequenceNum := binary.BigEndian.Uint64(seqBytes) + + // Get the payment status. + paymentStatus := fetchDuplicatePaymentStatus(bucket) + + // Get the PaymentCreationInfo. + b := bucket.Get(duplicatePaymentCreationInfoKey) + if b == nil { + return nil, fmt.Errorf("creation info not found") + } + + r := bytes.NewReader(b) + creationInfo, err := deserializeDuplicatePaymentCreationInfo(r) + if err != nil { + return nil, err + + } + + // Get failure reason if available. + var failureReason *FailureReason + b = bucket.Get(duplicatePaymentFailInfoKey) + if b != nil { + reason := FailureReason(b[0]) + failureReason = &reason + } + + payment := &MPPayment{ + sequenceNum: sequenceNum, + Info: creationInfo, + FailureReason: failureReason, + Status: paymentStatus, + } + + // Get the HTLCAttemptInfo. It can be absent. + b = bucket.Get(duplicatePaymentAttemptInfoKey) + if b != nil { + r = bytes.NewReader(b) + attempt, err := deserializeDuplicateHTLCAttemptInfo(r) + if err != nil { + return nil, err + } + + htlc := HTLCAttempt{ + HTLCAttemptInfo: HTLCAttemptInfo{ + AttemptID: attempt.attemptID, + Route: attempt.route, + SessionKey: attempt.sessionKey, + }, + } + + // Get the payment preimage. This is only found for + // successful payments. + b = bucket.Get(duplicatePaymentSettleInfoKey) + if b != nil { + var preimg lntypes.Preimage + copy(preimg[:], b) + + htlc.Settle = &HTLCSettleInfo{ + Preimage: preimg, + SettleTime: time.Time{}, + } + } else { + // Otherwise the payment must have failed. + htlc.Failure = &HTLCFailInfo{ + FailTime: time.Time{}, + } + } + + payment.HTLCs = []HTLCAttempt{htlc} + } + + return payment, nil +} + +func fetchDuplicatePayments(paymentHashBucket *bbolt.Bucket) ([]*MPPayment, + error) { + + var payments []*MPPayment + + // For older versions of lnd, duplicate payments to a payment has was + // possible. These will be found in a sub-bucket indexed by their + // sequence number if available. + dup := paymentHashBucket.Bucket(duplicatePaymentsBucket) + if dup == nil { + return nil, nil + } + + err := dup.ForEach(func(k, v []byte) error { + subBucket := dup.Bucket(k) + if subBucket == nil { + // We one bucket for each duplicate to be found. + return fmt.Errorf("non bucket element" + + "in duplicate bucket") + } + + p, err := fetchDuplicatePayment(subBucket) + if err != nil { + return err + } + + payments = append(payments, p) + return nil + }) + if err != nil { + return nil, err + } + + return payments, nil +} diff --git a/channeldb/payments.go b/channeldb/payments.go index ae6d8abd17..64f4f1c7c0 100644 --- a/channeldb/payments.go +++ b/channeldb/payments.go @@ -54,13 +54,6 @@ var ( // paymentsRootBucket = []byte("payments-root-bucket") - // paymentDublicateBucket is the name of a optional sub-bucket within - // the payment hash bucket, that is used to hold duplicate payments to - // a payment hash. This is needed to support information from earlier - // versions of lnd, where it was possible to pay to a payment hash more - // than once. - paymentDuplicateBucket = []byte("payment-duplicate-bucket") - // paymentSequenceKey is a key used in the payment's sub-bucket to // store the sequence number of the payment. paymentSequenceKey = []byte("payment-sequence-key") @@ -308,28 +301,14 @@ func (db *DB) FetchPayments() ([]*MPPayment, error) { // payment has was possible. These will be found in a // sub-bucket indexed by their sequence number if // available. - dup := bucket.Bucket(paymentDuplicateBucket) - if dup == nil { - return nil + duplicatePayments, err := fetchDuplicatePayments(bucket) + if err != nil { + return err } - return dup.ForEach(func(k, v []byte) error { - subBucket := dup.Bucket(k) - if subBucket == nil { - // We one bucket for each duplicate to - // be found. - return fmt.Errorf("non bucket element" + - "in duplicate bucket") - } - - p, err := fetchPayment(subBucket) - if err != nil { - return err - } - - payments = append(payments, p) - return nil - }) + payments = append(payments, duplicatePayments...) + + return nil }) }) if err != nil { From 6aab6c0bac14d5989b488b435a8bddae838805aa Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 13 Feb 2020 11:40:51 +0100 Subject: [PATCH 05/16] routerrpc+lnrpc: move htlc failure messages In a later commit, htlc raw failure messages will be exposed through the main rpc. This is a preparation for that. --- lnrpc/routerrpc/router.pb.go | 639 ++--------- lnrpc/routerrpc/router.proto | 160 +-- lnrpc/routerrpc/router_server.go | 58 +- lnrpc/rpc.pb.go | 1734 +++++++++++++++++++----------- lnrpc/rpc.proto | 160 +++ 5 files changed, 1374 insertions(+), 1377 deletions(-) diff --git a/lnrpc/routerrpc/router.pb.go b/lnrpc/routerrpc/router.pb.go index fe0b3bafd8..5951e4e958 100644 --- a/lnrpc/routerrpc/router.pb.go +++ b/lnrpc/routerrpc/router.pb.go @@ -79,112 +79,6 @@ func (PaymentState) EnumDescriptor() ([]byte, []int) { return fileDescriptor_7a0613f69d37b0a5, []int{0} } -type Failure_FailureCode int32 - -const ( - //* - //The numbers assigned in this enumeration match the failure codes as - //defined in BOLT #4. Because protobuf 3 requires enums to start with 0, - //a RESERVED value is added. - Failure_RESERVED Failure_FailureCode = 0 - Failure_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS Failure_FailureCode = 1 - Failure_INCORRECT_PAYMENT_AMOUNT Failure_FailureCode = 2 - Failure_FINAL_INCORRECT_CLTV_EXPIRY Failure_FailureCode = 3 - Failure_FINAL_INCORRECT_HTLC_AMOUNT Failure_FailureCode = 4 - Failure_FINAL_EXPIRY_TOO_SOON Failure_FailureCode = 5 - Failure_INVALID_REALM Failure_FailureCode = 6 - Failure_EXPIRY_TOO_SOON Failure_FailureCode = 7 - Failure_INVALID_ONION_VERSION Failure_FailureCode = 8 - Failure_INVALID_ONION_HMAC Failure_FailureCode = 9 - Failure_INVALID_ONION_KEY Failure_FailureCode = 10 - Failure_AMOUNT_BELOW_MINIMUM Failure_FailureCode = 11 - Failure_FEE_INSUFFICIENT Failure_FailureCode = 12 - Failure_INCORRECT_CLTV_EXPIRY Failure_FailureCode = 13 - Failure_CHANNEL_DISABLED Failure_FailureCode = 14 - Failure_TEMPORARY_CHANNEL_FAILURE Failure_FailureCode = 15 - Failure_REQUIRED_NODE_FEATURE_MISSING Failure_FailureCode = 16 - Failure_REQUIRED_CHANNEL_FEATURE_MISSING Failure_FailureCode = 17 - Failure_UNKNOWN_NEXT_PEER Failure_FailureCode = 18 - Failure_TEMPORARY_NODE_FAILURE Failure_FailureCode = 19 - Failure_PERMANENT_NODE_FAILURE Failure_FailureCode = 20 - Failure_PERMANENT_CHANNEL_FAILURE Failure_FailureCode = 21 - Failure_EXPIRY_TOO_FAR Failure_FailureCode = 22 - Failure_MPP_TIMEOUT Failure_FailureCode = 23 - //* - //The error source is known, but the failure itself couldn't be decoded. - Failure_UNKNOWN_FAILURE Failure_FailureCode = 998 - //* - //An unreadable failure result is returned if the received failure message - //cannot be decrypted. In that case the error source is unknown. - Failure_UNREADABLE_FAILURE Failure_FailureCode = 999 -) - -var Failure_FailureCode_name = map[int32]string{ - 0: "RESERVED", - 1: "INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS", - 2: "INCORRECT_PAYMENT_AMOUNT", - 3: "FINAL_INCORRECT_CLTV_EXPIRY", - 4: "FINAL_INCORRECT_HTLC_AMOUNT", - 5: "FINAL_EXPIRY_TOO_SOON", - 6: "INVALID_REALM", - 7: "EXPIRY_TOO_SOON", - 8: "INVALID_ONION_VERSION", - 9: "INVALID_ONION_HMAC", - 10: "INVALID_ONION_KEY", - 11: "AMOUNT_BELOW_MINIMUM", - 12: "FEE_INSUFFICIENT", - 13: "INCORRECT_CLTV_EXPIRY", - 14: "CHANNEL_DISABLED", - 15: "TEMPORARY_CHANNEL_FAILURE", - 16: "REQUIRED_NODE_FEATURE_MISSING", - 17: "REQUIRED_CHANNEL_FEATURE_MISSING", - 18: "UNKNOWN_NEXT_PEER", - 19: "TEMPORARY_NODE_FAILURE", - 20: "PERMANENT_NODE_FAILURE", - 21: "PERMANENT_CHANNEL_FAILURE", - 22: "EXPIRY_TOO_FAR", - 23: "MPP_TIMEOUT", - 998: "UNKNOWN_FAILURE", - 999: "UNREADABLE_FAILURE", -} - -var Failure_FailureCode_value = map[string]int32{ - "RESERVED": 0, - "INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS": 1, - "INCORRECT_PAYMENT_AMOUNT": 2, - "FINAL_INCORRECT_CLTV_EXPIRY": 3, - "FINAL_INCORRECT_HTLC_AMOUNT": 4, - "FINAL_EXPIRY_TOO_SOON": 5, - "INVALID_REALM": 6, - "EXPIRY_TOO_SOON": 7, - "INVALID_ONION_VERSION": 8, - "INVALID_ONION_HMAC": 9, - "INVALID_ONION_KEY": 10, - "AMOUNT_BELOW_MINIMUM": 11, - "FEE_INSUFFICIENT": 12, - "INCORRECT_CLTV_EXPIRY": 13, - "CHANNEL_DISABLED": 14, - "TEMPORARY_CHANNEL_FAILURE": 15, - "REQUIRED_NODE_FEATURE_MISSING": 16, - "REQUIRED_CHANNEL_FEATURE_MISSING": 17, - "UNKNOWN_NEXT_PEER": 18, - "TEMPORARY_NODE_FAILURE": 19, - "PERMANENT_NODE_FAILURE": 20, - "PERMANENT_CHANNEL_FAILURE": 21, - "EXPIRY_TOO_FAR": 22, - "MPP_TIMEOUT": 23, - "UNKNOWN_FAILURE": 998, - "UNREADABLE_FAILURE": 999, -} - -func (x Failure_FailureCode) String() string { - return proto.EnumName(Failure_FailureCode_name, int32(x)) -} - -func (Failure_FailureCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{7, 0} -} - type SendPaymentRequest struct { /// The identity pubkey of the payment recipient Dest []byte `protobuf:"bytes,1,opt,name=dest,proto3" json:"dest,omitempty"` @@ -675,10 +569,10 @@ type SendToRouteResponse struct { /// The preimage obtained by making the payment. Preimage []byte `protobuf:"bytes,1,opt,name=preimage,proto3" json:"preimage,omitempty"` /// The failure message in case the payment failed. - Failure *Failure `protobuf:"bytes,2,opt,name=failure,proto3" json:"failure,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Failure *lnrpc.Failure `protobuf:"bytes,2,opt,name=failure,proto3" json:"failure,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *SendToRouteResponse) Reset() { *m = SendToRouteResponse{} } @@ -713,290 +607,13 @@ func (m *SendToRouteResponse) GetPreimage() []byte { return nil } -func (m *SendToRouteResponse) GetFailure() *Failure { +func (m *SendToRouteResponse) GetFailure() *lnrpc.Failure { if m != nil { return m.Failure } return nil } -type Failure struct { - /// Failure code as defined in the Lightning spec - Code Failure_FailureCode `protobuf:"varint,1,opt,name=code,proto3,enum=routerrpc.Failure_FailureCode" json:"code,omitempty"` - /// An optional channel update message. - ChannelUpdate *ChannelUpdate `protobuf:"bytes,3,opt,name=channel_update,json=channelUpdate,proto3" json:"channel_update,omitempty"` - /// A failure type-dependent htlc value. - HtlcMsat uint64 `protobuf:"varint,4,opt,name=htlc_msat,json=htlcMsat,proto3" json:"htlc_msat,omitempty"` - /// The sha256 sum of the onion payload. - OnionSha_256 []byte `protobuf:"bytes,5,opt,name=onion_sha_256,json=onionSha256,proto3" json:"onion_sha_256,omitempty"` - /// A failure type-dependent cltv expiry value. - CltvExpiry uint32 `protobuf:"varint,6,opt,name=cltv_expiry,json=cltvExpiry,proto3" json:"cltv_expiry,omitempty"` - /// A failure type-dependent flags value. - Flags uint32 `protobuf:"varint,7,opt,name=flags,proto3" json:"flags,omitempty"` - //* - //The position in the path of the intermediate or final node that generated - //the failure message. Position zero is the sender node. - FailureSourceIndex uint32 `protobuf:"varint,8,opt,name=failure_source_index,json=failureSourceIndex,proto3" json:"failure_source_index,omitempty"` - /// A failure type-dependent block height. - Height uint32 `protobuf:"varint,9,opt,name=height,proto3" json:"height,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *Failure) Reset() { *m = Failure{} } -func (m *Failure) String() string { return proto.CompactTextString(m) } -func (*Failure) ProtoMessage() {} -func (*Failure) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{7} -} - -func (m *Failure) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_Failure.Unmarshal(m, b) -} -func (m *Failure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_Failure.Marshal(b, m, deterministic) -} -func (m *Failure) XXX_Merge(src proto.Message) { - xxx_messageInfo_Failure.Merge(m, src) -} -func (m *Failure) XXX_Size() int { - return xxx_messageInfo_Failure.Size(m) -} -func (m *Failure) XXX_DiscardUnknown() { - xxx_messageInfo_Failure.DiscardUnknown(m) -} - -var xxx_messageInfo_Failure proto.InternalMessageInfo - -func (m *Failure) GetCode() Failure_FailureCode { - if m != nil { - return m.Code - } - return Failure_RESERVED -} - -func (m *Failure) GetChannelUpdate() *ChannelUpdate { - if m != nil { - return m.ChannelUpdate - } - return nil -} - -func (m *Failure) GetHtlcMsat() uint64 { - if m != nil { - return m.HtlcMsat - } - return 0 -} - -func (m *Failure) GetOnionSha_256() []byte { - if m != nil { - return m.OnionSha_256 - } - return nil -} - -func (m *Failure) GetCltvExpiry() uint32 { - if m != nil { - return m.CltvExpiry - } - return 0 -} - -func (m *Failure) GetFlags() uint32 { - if m != nil { - return m.Flags - } - return 0 -} - -func (m *Failure) GetFailureSourceIndex() uint32 { - if m != nil { - return m.FailureSourceIndex - } - return 0 -} - -func (m *Failure) GetHeight() uint32 { - if m != nil { - return m.Height - } - return 0 -} - -type ChannelUpdate struct { - //* - //The signature that validates the announced data and proves the ownership - //of node id. - Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` - //* - //The target chain that this channel was opened within. This value - //should be the genesis hash of the target chain. Along with the short - //channel ID, this uniquely identifies the channel globally in a - //blockchain. - ChainHash []byte `protobuf:"bytes,2,opt,name=chain_hash,json=chainHash,proto3" json:"chain_hash,omitempty"` - //* - //The unique description of the funding transaction. - ChanId uint64 `protobuf:"varint,3,opt,name=chan_id,json=chanId,proto3" json:"chan_id,omitempty"` - //* - //A timestamp that allows ordering in the case of multiple announcements. - //We should ignore the message if timestamp is not greater than the - //last-received. - Timestamp uint32 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` - //* - //The bitfield that describes whether optional fields are present in this - //update. Currently, the least-significant bit must be set to 1 if the - //optional field MaxHtlc is present. - MessageFlags uint32 `protobuf:"varint,10,opt,name=message_flags,json=messageFlags,proto3" json:"message_flags,omitempty"` - //* - //The bitfield that describes additional meta-data concerning how the - //update is to be interpreted. Currently, the least-significant bit must be - //set to 0 if the creating node corresponds to the first node in the - //previously sent channel announcement and 1 otherwise. If the second bit - //is set, then the channel is set to be disabled. - ChannelFlags uint32 `protobuf:"varint,5,opt,name=channel_flags,json=channelFlags,proto3" json:"channel_flags,omitempty"` - //* - //The minimum number of blocks this node requires to be added to the expiry - //of HTLCs. This is a security parameter determined by the node operator. - //This value represents the required gap between the time locks of the - //incoming and outgoing HTLC's set to this node. - TimeLockDelta uint32 `protobuf:"varint,6,opt,name=time_lock_delta,json=timeLockDelta,proto3" json:"time_lock_delta,omitempty"` - //* - //The minimum HTLC value which will be accepted. - HtlcMinimumMsat uint64 `protobuf:"varint,7,opt,name=htlc_minimum_msat,json=htlcMinimumMsat,proto3" json:"htlc_minimum_msat,omitempty"` - //* - //The base fee that must be used for incoming HTLC's to this particular - //channel. This value will be tacked onto the required for a payment - //independent of the size of the payment. - BaseFee uint32 `protobuf:"varint,8,opt,name=base_fee,json=baseFee,proto3" json:"base_fee,omitempty"` - //* - //The fee rate that will be charged per millionth of a satoshi. - FeeRate uint32 `protobuf:"varint,9,opt,name=fee_rate,json=feeRate,proto3" json:"fee_rate,omitempty"` - //* - //The maximum HTLC value which will be accepted. - HtlcMaximumMsat uint64 `protobuf:"varint,11,opt,name=htlc_maximum_msat,json=htlcMaximumMsat,proto3" json:"htlc_maximum_msat,omitempty"` - //* - //The set of data that was appended to this message, some of which we may - //not actually know how to iterate or parse. By holding onto this data, we - //ensure that we're able to properly validate the set of signatures that - //cover these new fields, and ensure we're able to make upgrades to the - //network in a forwards compatible manner. - ExtraOpaqueData []byte `protobuf:"bytes,12,opt,name=extra_opaque_data,json=extraOpaqueData,proto3" json:"extra_opaque_data,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *ChannelUpdate) Reset() { *m = ChannelUpdate{} } -func (m *ChannelUpdate) String() string { return proto.CompactTextString(m) } -func (*ChannelUpdate) ProtoMessage() {} -func (*ChannelUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{8} -} - -func (m *ChannelUpdate) XXX_Unmarshal(b []byte) error { - return xxx_messageInfo_ChannelUpdate.Unmarshal(m, b) -} -func (m *ChannelUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - return xxx_messageInfo_ChannelUpdate.Marshal(b, m, deterministic) -} -func (m *ChannelUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_ChannelUpdate.Merge(m, src) -} -func (m *ChannelUpdate) XXX_Size() int { - return xxx_messageInfo_ChannelUpdate.Size(m) -} -func (m *ChannelUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_ChannelUpdate.DiscardUnknown(m) -} - -var xxx_messageInfo_ChannelUpdate proto.InternalMessageInfo - -func (m *ChannelUpdate) GetSignature() []byte { - if m != nil { - return m.Signature - } - return nil -} - -func (m *ChannelUpdate) GetChainHash() []byte { - if m != nil { - return m.ChainHash - } - return nil -} - -func (m *ChannelUpdate) GetChanId() uint64 { - if m != nil { - return m.ChanId - } - return 0 -} - -func (m *ChannelUpdate) GetTimestamp() uint32 { - if m != nil { - return m.Timestamp - } - return 0 -} - -func (m *ChannelUpdate) GetMessageFlags() uint32 { - if m != nil { - return m.MessageFlags - } - return 0 -} - -func (m *ChannelUpdate) GetChannelFlags() uint32 { - if m != nil { - return m.ChannelFlags - } - return 0 -} - -func (m *ChannelUpdate) GetTimeLockDelta() uint32 { - if m != nil { - return m.TimeLockDelta - } - return 0 -} - -func (m *ChannelUpdate) GetHtlcMinimumMsat() uint64 { - if m != nil { - return m.HtlcMinimumMsat - } - return 0 -} - -func (m *ChannelUpdate) GetBaseFee() uint32 { - if m != nil { - return m.BaseFee - } - return 0 -} - -func (m *ChannelUpdate) GetFeeRate() uint32 { - if m != nil { - return m.FeeRate - } - return 0 -} - -func (m *ChannelUpdate) GetHtlcMaximumMsat() uint64 { - if m != nil { - return m.HtlcMaximumMsat - } - return 0 -} - -func (m *ChannelUpdate) GetExtraOpaqueData() []byte { - if m != nil { - return m.ExtraOpaqueData - } - return nil -} - type ResetMissionControlRequest struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -1007,7 +624,7 @@ func (m *ResetMissionControlRequest) Reset() { *m = ResetMissionControlR func (m *ResetMissionControlRequest) String() string { return proto.CompactTextString(m) } func (*ResetMissionControlRequest) ProtoMessage() {} func (*ResetMissionControlRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{9} + return fileDescriptor_7a0613f69d37b0a5, []int{7} } func (m *ResetMissionControlRequest) XXX_Unmarshal(b []byte) error { @@ -1038,7 +655,7 @@ func (m *ResetMissionControlResponse) Reset() { *m = ResetMissionControl func (m *ResetMissionControlResponse) String() string { return proto.CompactTextString(m) } func (*ResetMissionControlResponse) ProtoMessage() {} func (*ResetMissionControlResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{10} + return fileDescriptor_7a0613f69d37b0a5, []int{8} } func (m *ResetMissionControlResponse) XXX_Unmarshal(b []byte) error { @@ -1069,7 +686,7 @@ func (m *QueryMissionControlRequest) Reset() { *m = QueryMissionControlR func (m *QueryMissionControlRequest) String() string { return proto.CompactTextString(m) } func (*QueryMissionControlRequest) ProtoMessage() {} func (*QueryMissionControlRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{11} + return fileDescriptor_7a0613f69d37b0a5, []int{9} } func (m *QueryMissionControlRequest) XXX_Unmarshal(b []byte) error { @@ -1103,7 +720,7 @@ func (m *QueryMissionControlResponse) Reset() { *m = QueryMissionControl func (m *QueryMissionControlResponse) String() string { return proto.CompactTextString(m) } func (*QueryMissionControlResponse) ProtoMessage() {} func (*QueryMissionControlResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{12} + return fileDescriptor_7a0613f69d37b0a5, []int{10} } func (m *QueryMissionControlResponse) XXX_Unmarshal(b []byte) error { @@ -1147,7 +764,7 @@ func (m *PairHistory) Reset() { *m = PairHistory{} } func (m *PairHistory) String() string { return proto.CompactTextString(m) } func (*PairHistory) ProtoMessage() {} func (*PairHistory) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{13} + return fileDescriptor_7a0613f69d37b0a5, []int{11} } func (m *PairHistory) XXX_Unmarshal(b []byte) error { @@ -1215,7 +832,7 @@ func (m *PairData) Reset() { *m = PairData{} } func (m *PairData) String() string { return proto.CompactTextString(m) } func (*PairData) ProtoMessage() {} func (*PairData) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{14} + return fileDescriptor_7a0613f69d37b0a5, []int{12} } func (m *PairData) XXX_Unmarshal(b []byte) error { @@ -1294,7 +911,7 @@ func (m *QueryProbabilityRequest) Reset() { *m = QueryProbabilityRequest func (m *QueryProbabilityRequest) String() string { return proto.CompactTextString(m) } func (*QueryProbabilityRequest) ProtoMessage() {} func (*QueryProbabilityRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{15} + return fileDescriptor_7a0613f69d37b0a5, []int{13} } func (m *QueryProbabilityRequest) XXX_Unmarshal(b []byte) error { @@ -1350,7 +967,7 @@ func (m *QueryProbabilityResponse) Reset() { *m = QueryProbabilityRespon func (m *QueryProbabilityResponse) String() string { return proto.CompactTextString(m) } func (*QueryProbabilityResponse) ProtoMessage() {} func (*QueryProbabilityResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{16} + return fileDescriptor_7a0613f69d37b0a5, []int{14} } func (m *QueryProbabilityResponse) XXX_Unmarshal(b []byte) error { @@ -1411,7 +1028,7 @@ func (m *BuildRouteRequest) Reset() { *m = BuildRouteRequest{} } func (m *BuildRouteRequest) String() string { return proto.CompactTextString(m) } func (*BuildRouteRequest) ProtoMessage() {} func (*BuildRouteRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{17} + return fileDescriptor_7a0613f69d37b0a5, []int{15} } func (m *BuildRouteRequest) XXX_Unmarshal(b []byte) error { @@ -1473,7 +1090,7 @@ func (m *BuildRouteResponse) Reset() { *m = BuildRouteResponse{} } func (m *BuildRouteResponse) String() string { return proto.CompactTextString(m) } func (*BuildRouteResponse) ProtoMessage() {} func (*BuildRouteResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_7a0613f69d37b0a5, []int{18} + return fileDescriptor_7a0613f69d37b0a5, []int{16} } func (m *BuildRouteResponse) XXX_Unmarshal(b []byte) error { @@ -1503,7 +1120,6 @@ func (m *BuildRouteResponse) GetRoute() *lnrpc.Route { func init() { proto.RegisterEnum("routerrpc.PaymentState", PaymentState_name, PaymentState_value) - proto.RegisterEnum("routerrpc.Failure_FailureCode", Failure_FailureCode_name, Failure_FailureCode_value) proto.RegisterType((*SendPaymentRequest)(nil), "routerrpc.SendPaymentRequest") proto.RegisterMapType((map[uint64][]byte)(nil), "routerrpc.SendPaymentRequest.DestCustomRecordsEntry") proto.RegisterType((*TrackPaymentRequest)(nil), "routerrpc.TrackPaymentRequest") @@ -1512,8 +1128,6 @@ func init() { proto.RegisterType((*RouteFeeResponse)(nil), "routerrpc.RouteFeeResponse") proto.RegisterType((*SendToRouteRequest)(nil), "routerrpc.SendToRouteRequest") proto.RegisterType((*SendToRouteResponse)(nil), "routerrpc.SendToRouteResponse") - proto.RegisterType((*Failure)(nil), "routerrpc.Failure") - proto.RegisterType((*ChannelUpdate)(nil), "routerrpc.ChannelUpdate") proto.RegisterType((*ResetMissionControlRequest)(nil), "routerrpc.ResetMissionControlRequest") proto.RegisterType((*ResetMissionControlResponse)(nil), "routerrpc.ResetMissionControlResponse") proto.RegisterType((*QueryMissionControlRequest)(nil), "routerrpc.QueryMissionControlRequest") @@ -1529,140 +1143,95 @@ func init() { func init() { proto.RegisterFile("routerrpc/router.proto", fileDescriptor_7a0613f69d37b0a5) } var fileDescriptor_7a0613f69d37b0a5 = []byte{ - // 2126 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x58, 0xcd, 0x76, 0xdb, 0xc6, - 0x15, 0x0e, 0xc4, 0x5f, 0x5d, 0xfe, 0x41, 0x23, 0x45, 0xa2, 0x29, 0x2b, 0x61, 0x10, 0xd7, 0xe1, - 0xf1, 0x71, 0x24, 0x47, 0x6d, 0x7c, 0x7c, 0xba, 0x68, 0x0f, 0x45, 0x82, 0x11, 0x64, 0x12, 0x94, - 0x87, 0xa4, 0x13, 0x37, 0x8b, 0x39, 0x10, 0x39, 0x12, 0x51, 0xe1, 0x87, 0x01, 0x86, 0x8e, 0xf5, - 0x02, 0x5d, 0xf4, 0x45, 0xda, 0x4d, 0xbb, 0xe9, 0xba, 0xaf, 0xd3, 0xf6, 0x11, 0xba, 0xec, 0x99, - 0x19, 0x80, 0x04, 0x29, 0xca, 0xe9, 0x4a, 0xc4, 0x77, 0xbf, 0xb9, 0x77, 0x66, 0xee, 0xdc, 0x3f, - 0xc1, 0x7e, 0xe0, 0xcf, 0x19, 0x0d, 0x82, 0xd9, 0xf8, 0x44, 0xfe, 0x3a, 0x9e, 0x05, 0x3e, 0xf3, - 0xd1, 0xf6, 0x02, 0xaf, 0x6d, 0x07, 0xb3, 0xb1, 0x44, 0xb5, 0xff, 0x66, 0x00, 0x0d, 0xa8, 0x37, - 0xb9, 0xb4, 0xee, 0x5c, 0xea, 0x31, 0x4c, 0x7f, 0x9a, 0xd3, 0x90, 0x21, 0x04, 0xe9, 0x09, 0x0d, - 0x59, 0x55, 0xa9, 0x2b, 0x8d, 0x22, 0x16, 0xbf, 0x91, 0x0a, 0x29, 0xcb, 0x65, 0xd5, 0xad, 0xba, - 0xd2, 0x48, 0x61, 0xfe, 0x13, 0x3d, 0x82, 0xbc, 0xe5, 0x32, 0xe2, 0x86, 0x16, 0xab, 0x16, 0x05, - 0x9c, 0xb3, 0x5c, 0xd6, 0x0b, 0x2d, 0x86, 0xbe, 0x80, 0xe2, 0x4c, 0xaa, 0x24, 0x53, 0x2b, 0x9c, - 0x56, 0x53, 0x42, 0x51, 0x21, 0xc2, 0xce, 0xad, 0x70, 0x8a, 0x1a, 0xa0, 0x5e, 0xdb, 0x9e, 0xe5, - 0x90, 0xb1, 0xc3, 0xde, 0x93, 0x09, 0x75, 0x98, 0x55, 0x4d, 0xd7, 0x95, 0x46, 0x06, 0x97, 0x05, - 0xde, 0x72, 0xd8, 0xfb, 0x36, 0x47, 0xd1, 0x57, 0x50, 0x89, 0x95, 0x05, 0x72, 0x83, 0xd5, 0x4c, - 0x5d, 0x69, 0x6c, 0xe3, 0xf2, 0x6c, 0x75, 0xdb, 0x5f, 0x41, 0x85, 0xd9, 0x2e, 0xf5, 0xe7, 0x8c, - 0x84, 0x74, 0xec, 0x7b, 0x93, 0xb0, 0x9a, 0x95, 0x1a, 0x23, 0x78, 0x20, 0x51, 0xa4, 0x41, 0xe9, - 0x9a, 0x52, 0xe2, 0xd8, 0xae, 0xcd, 0x08, 0xdf, 0x7e, 0x4e, 0x6c, 0xbf, 0x70, 0x4d, 0x69, 0x97, - 0x63, 0x03, 0x8b, 0xa1, 0x27, 0x50, 0x5e, 0x72, 0xc4, 0x19, 0x4b, 0x82, 0x54, 0x8c, 0x49, 0xe2, - 0xa0, 0xcf, 0x41, 0xf5, 0xe7, 0xec, 0xc6, 0xb7, 0xbd, 0x1b, 0x32, 0x9e, 0x5a, 0x1e, 0xb1, 0x27, - 0xd5, 0x7c, 0x5d, 0x69, 0xa4, 0xcf, 0xb6, 0x5e, 0x28, 0xb8, 0x1c, 0xcb, 0x5a, 0x53, 0xcb, 0x33, - 0x26, 0xe8, 0x29, 0x54, 0x1c, 0x2b, 0x64, 0x64, 0xea, 0xcf, 0xc8, 0x6c, 0x7e, 0x75, 0x4b, 0xef, - 0xaa, 0x65, 0x71, 0x33, 0x25, 0x0e, 0x9f, 0xfb, 0xb3, 0x4b, 0x01, 0xa2, 0x23, 0x00, 0x71, 0x2b, - 0xc2, 0x78, 0x75, 0x5b, 0x9c, 0x61, 0x9b, 0x23, 0xc2, 0x30, 0xfa, 0x06, 0x0a, 0xc2, 0x9b, 0x64, - 0x6a, 0x7b, 0x2c, 0xac, 0x42, 0x3d, 0xd5, 0x28, 0x9c, 0xaa, 0xc7, 0x8e, 0xc7, 0x1d, 0x8b, 0xb9, - 0xe4, 0xdc, 0xf6, 0x18, 0x86, 0x20, 0xfe, 0x19, 0xa2, 0x09, 0xec, 0x72, 0x2f, 0x92, 0xf1, 0x3c, - 0x64, 0xbe, 0x4b, 0x02, 0x3a, 0xf6, 0x83, 0x49, 0x58, 0x2d, 0x88, 0xa5, 0xbf, 0x39, 0x5e, 0x3c, - 0x8e, 0xe3, 0xfb, 0xaf, 0xe1, 0xb8, 0x4d, 0x43, 0xd6, 0x12, 0xeb, 0xb0, 0x5c, 0xa6, 0x7b, 0x2c, - 0xb8, 0xc3, 0x3b, 0x93, 0x75, 0x1c, 0x3d, 0x07, 0x64, 0x39, 0x8e, 0xff, 0x33, 0x09, 0xa9, 0x73, - 0x4d, 0x22, 0xef, 0x54, 0x2b, 0x75, 0xa5, 0x91, 0xc7, 0xaa, 0x90, 0x0c, 0xa8, 0x73, 0x1d, 0xa9, - 0x47, 0x2f, 0xa1, 0x24, 0xf6, 0x74, 0x4d, 0x2d, 0x36, 0x0f, 0x68, 0x58, 0x55, 0xeb, 0xa9, 0x46, - 0xf9, 0x74, 0x27, 0x3a, 0x48, 0x47, 0xc2, 0x67, 0x36, 0xc3, 0x45, 0xce, 0x8b, 0xbe, 0xc3, 0x5a, - 0x1b, 0xf6, 0x37, 0x6f, 0x89, 0xbf, 0x51, 0x7e, 0xa7, 0xfc, 0xd9, 0xa6, 0x31, 0xff, 0x89, 0xf6, - 0x20, 0xf3, 0xde, 0x72, 0xe6, 0x54, 0xbc, 0xdb, 0x22, 0x96, 0x1f, 0xbf, 0xdd, 0x7a, 0xa5, 0x68, - 0xaf, 0x60, 0x77, 0x18, 0x58, 0xe3, 0xdb, 0xb5, 0xa7, 0xbf, 0xfe, 0x72, 0x95, 0x7b, 0x2f, 0x57, - 0xfb, 0xab, 0x02, 0xa5, 0x68, 0xd5, 0x80, 0x59, 0x6c, 0x1e, 0xa2, 0xaf, 0x21, 0x13, 0x32, 0x8b, - 0x51, 0xc1, 0x2e, 0x9f, 0x1e, 0x24, 0xee, 0x33, 0x41, 0xa4, 0x58, 0xb2, 0x50, 0x0d, 0xf2, 0xb3, - 0x80, 0xda, 0xae, 0x75, 0x13, 0xef, 0x6b, 0xf1, 0x8d, 0x34, 0xc8, 0x88, 0xc5, 0x22, 0x64, 0x0a, - 0xa7, 0xc5, 0xa4, 0x57, 0xb1, 0x14, 0xa1, 0x06, 0x64, 0xa6, 0xcc, 0x19, 0x87, 0xd5, 0xb4, 0x70, - 0x1f, 0x8a, 0x38, 0xe7, 0xc3, 0x6e, 0xab, 0xc9, 0x18, 0x75, 0x67, 0x0c, 0x4b, 0x82, 0xf6, 0x3b, - 0xa8, 0x88, 0x95, 0x1d, 0x4a, 0x3f, 0x16, 0xdb, 0x07, 0xc0, 0x23, 0x57, 0x44, 0x82, 0x8c, 0xef, - 0xac, 0xe5, 0xf2, 0x20, 0xd0, 0x26, 0xa0, 0x2e, 0xd7, 0x87, 0x33, 0xdf, 0x0b, 0xb9, 0x75, 0x95, - 0x6f, 0x83, 0xbf, 0x78, 0x1e, 0x20, 0x22, 0x34, 0x14, 0xb1, 0xaa, 0x1c, 0xe1, 0x1d, 0x4a, 0x45, - 0x70, 0x3c, 0x95, 0xf1, 0x48, 0x1c, 0x7f, 0x7c, 0xcb, 0x23, 0xdc, 0xba, 0x8b, 0xd4, 0x97, 0x38, - 0xdc, 0xf5, 0xc7, 0xb7, 0x6d, 0x0e, 0x6a, 0x3f, 0xca, 0x24, 0x34, 0xf4, 0xe5, 0x29, 0xff, 0x6f, - 0x4f, 0x2c, 0x2f, 0x6b, 0xeb, 0xc1, 0xcb, 0xd2, 0x08, 0xec, 0xae, 0x28, 0x8f, 0x4e, 0x91, 0xf4, - 0x81, 0xb2, 0xe6, 0x83, 0xe7, 0x90, 0xbb, 0xb6, 0x6c, 0x67, 0x1e, 0xc4, 0x8a, 0x51, 0xc2, 0xa1, - 0x1d, 0x29, 0xc1, 0x31, 0x45, 0xfb, 0x53, 0x1e, 0x72, 0x11, 0x88, 0x4e, 0x21, 0x3d, 0xf6, 0x27, - 0xf1, 0x3b, 0xf8, 0xec, 0xfe, 0xb2, 0xf8, 0x6f, 0xcb, 0x9f, 0x50, 0x2c, 0xb8, 0xe8, 0xf7, 0x50, - 0xe6, 0x99, 0xc3, 0xa3, 0x0e, 0x99, 0xcf, 0x26, 0xd6, 0xc2, 0xf5, 0xd5, 0xc4, 0xea, 0x96, 0x24, - 0x8c, 0x84, 0x1c, 0x97, 0xc6, 0xc9, 0x4f, 0x74, 0x08, 0xdb, 0xdc, 0xdb, 0xd2, 0x13, 0x69, 0xf1, - 0xf6, 0xf3, 0x1c, 0x10, 0x3e, 0xd0, 0xa0, 0xe4, 0x7b, 0xb6, 0xef, 0x91, 0x70, 0x6a, 0x91, 0xd3, - 0x6f, 0x5f, 0x8a, 0xd4, 0x59, 0xc4, 0x05, 0x01, 0x0e, 0xa6, 0xd6, 0xe9, 0xb7, 0x2f, 0xd1, 0xe7, - 0x50, 0x10, 0xe9, 0x86, 0x7e, 0x98, 0xd9, 0xc1, 0x9d, 0xc8, 0x99, 0x25, 0x2c, 0x32, 0x90, 0x2e, - 0x10, 0x1e, 0x45, 0xd7, 0x8e, 0x75, 0x13, 0x8a, 0x3c, 0x59, 0xc2, 0xf2, 0x03, 0xbd, 0x80, 0xbd, - 0xe8, 0x0e, 0x48, 0xe8, 0xcf, 0x83, 0x31, 0x25, 0xb6, 0x37, 0xa1, 0x1f, 0x44, 0xfe, 0x2b, 0x61, - 0x14, 0xc9, 0x06, 0x42, 0x64, 0x70, 0x09, 0xda, 0x87, 0xec, 0x94, 0xda, 0x37, 0x53, 0x99, 0xd3, - 0x4a, 0x38, 0xfa, 0xd2, 0xfe, 0x99, 0x81, 0x42, 0xe2, 0x62, 0x50, 0x11, 0xf2, 0x58, 0x1f, 0xe8, - 0xf8, 0xad, 0xde, 0x56, 0x3f, 0x41, 0x0d, 0x78, 0x62, 0x98, 0xad, 0x3e, 0xc6, 0x7a, 0x6b, 0x48, - 0xfa, 0x98, 0x8c, 0xcc, 0xd7, 0x66, 0xff, 0x7b, 0x93, 0x5c, 0x36, 0xdf, 0xf5, 0x74, 0x73, 0x48, - 0xda, 0xfa, 0xb0, 0x69, 0x74, 0x07, 0xaa, 0x82, 0x1e, 0x43, 0x75, 0xc9, 0x8c, 0xc5, 0xcd, 0x5e, - 0x7f, 0x64, 0x0e, 0xd5, 0x2d, 0xf4, 0x39, 0x1c, 0x76, 0x0c, 0xb3, 0xd9, 0x25, 0x4b, 0x4e, 0xab, - 0x3b, 0x7c, 0x4b, 0xf4, 0x1f, 0x2e, 0x0d, 0xfc, 0x4e, 0x4d, 0x6d, 0x22, 0xf0, 0x98, 0x8a, 0x35, - 0xa4, 0xd1, 0x23, 0xf8, 0x54, 0x12, 0xe4, 0x12, 0x32, 0xec, 0xf7, 0xc9, 0xa0, 0xdf, 0x37, 0xd5, - 0x0c, 0xda, 0x81, 0x92, 0x61, 0xbe, 0x6d, 0x76, 0x8d, 0x36, 0xc1, 0x7a, 0xb3, 0xdb, 0x53, 0xb3, - 0x68, 0x17, 0x2a, 0xeb, 0xbc, 0x1c, 0x57, 0x11, 0xf3, 0xfa, 0xa6, 0xd1, 0x37, 0xc9, 0x5b, 0x1d, - 0x0f, 0x8c, 0xbe, 0xa9, 0xe6, 0xd1, 0x3e, 0xa0, 0x55, 0xd1, 0x79, 0xaf, 0xd9, 0x52, 0xb7, 0xd1, - 0xa7, 0xb0, 0xb3, 0x8a, 0xbf, 0xd6, 0xdf, 0xa9, 0x80, 0xaa, 0xb0, 0x27, 0x37, 0x46, 0xce, 0xf4, - 0x6e, 0xff, 0x7b, 0xd2, 0x33, 0x4c, 0xa3, 0x37, 0xea, 0xa9, 0x05, 0xb4, 0x07, 0x6a, 0x47, 0xd7, - 0x89, 0x61, 0x0e, 0x46, 0x9d, 0x8e, 0xd1, 0x32, 0x74, 0x73, 0xa8, 0x16, 0xa5, 0xe5, 0x4d, 0x07, - 0x2f, 0xf1, 0x05, 0xad, 0xf3, 0xa6, 0x69, 0xea, 0x5d, 0xd2, 0x36, 0x06, 0xcd, 0xb3, 0xae, 0xde, - 0x56, 0xcb, 0xe8, 0x08, 0x1e, 0x0d, 0xf5, 0xde, 0x65, 0x1f, 0x37, 0xf1, 0x3b, 0x12, 0xcb, 0x3b, - 0x4d, 0xa3, 0x3b, 0xc2, 0xba, 0x5a, 0x41, 0x5f, 0xc0, 0x11, 0xd6, 0xdf, 0x8c, 0x0c, 0xac, 0xb7, - 0x89, 0xd9, 0x6f, 0xeb, 0xa4, 0xa3, 0x37, 0x87, 0x23, 0xac, 0x93, 0x9e, 0x31, 0x18, 0x18, 0xe6, - 0x77, 0xaa, 0x8a, 0x9e, 0x40, 0x7d, 0x41, 0x59, 0x28, 0x58, 0x63, 0xed, 0xf0, 0xf3, 0xc5, 0x2e, - 0x35, 0xf5, 0x1f, 0x86, 0xe4, 0x52, 0xd7, 0xb1, 0x8a, 0x50, 0x0d, 0xf6, 0x97, 0xe6, 0xa5, 0x81, - 0xc8, 0xf6, 0x2e, 0x97, 0x5d, 0xea, 0xb8, 0xd7, 0x34, 0xb9, 0x83, 0x57, 0x64, 0x7b, 0x7c, 0xdb, - 0x4b, 0xd9, 0xfa, 0xb6, 0x3f, 0x45, 0x08, 0xca, 0x09, 0xaf, 0x74, 0x9a, 0x58, 0xdd, 0x47, 0x15, - 0x28, 0xf4, 0x2e, 0x2f, 0xc9, 0xd0, 0xe8, 0xe9, 0xfd, 0xd1, 0x50, 0x3d, 0x40, 0x7b, 0x50, 0x89, - 0xb7, 0x14, 0xaf, 0xfc, 0x57, 0x0e, 0x1d, 0x00, 0x1a, 0x99, 0x58, 0x6f, 0xb6, 0xf9, 0x0d, 0x2d, - 0x04, 0xff, 0xce, 0x5d, 0xa4, 0xf3, 0x5b, 0x6a, 0x4a, 0xfb, 0x47, 0x0a, 0x4a, 0x2b, 0x81, 0x8a, - 0x1e, 0xc3, 0x76, 0x68, 0xdf, 0x78, 0xa2, 0x6e, 0x45, 0x59, 0x66, 0x09, 0x88, 0x2a, 0x3f, 0xb5, - 0x6c, 0x4f, 0xa6, 0x37, 0x59, 0x08, 0xb6, 0x05, 0x22, 0x92, 0xdb, 0x21, 0xe4, 0xe2, 0x8e, 0x22, - 0xb5, 0xe8, 0x28, 0xb2, 0x63, 0xd9, 0x49, 0x3c, 0x86, 0x6d, 0x9e, 0x43, 0x43, 0x66, 0xb9, 0x33, - 0x11, 0xf3, 0x25, 0xbc, 0x04, 0xd0, 0x97, 0x50, 0x72, 0x69, 0x18, 0x5a, 0x37, 0x94, 0xc8, 0xb8, - 0x05, 0xc1, 0x28, 0x46, 0x60, 0x47, 0x84, 0xef, 0x97, 0x10, 0xe7, 0x91, 0x88, 0x94, 0x91, 0xa4, - 0x08, 0x94, 0xa4, 0xf5, 0x14, 0xce, 0xac, 0x28, 0x3d, 0x24, 0x53, 0x38, 0xb3, 0xd0, 0x33, 0xd8, - 0x91, 0x39, 0xc8, 0xf6, 0x6c, 0x77, 0xee, 0xca, 0x5c, 0x94, 0x13, 0xb9, 0xa8, 0x22, 0x72, 0x91, - 0xc4, 0x45, 0x4a, 0x7a, 0x04, 0xf9, 0x2b, 0x2b, 0xa4, 0xbc, 0x7a, 0x44, 0xb9, 0x22, 0xc7, 0xbf, - 0x3b, 0x94, 0x72, 0x11, 0xaf, 0x29, 0x01, 0xcf, 0x82, 0x32, 0x45, 0xe4, 0xae, 0x29, 0xc5, 0xfc, - 0x2e, 0x17, 0x16, 0xac, 0x0f, 0x4b, 0x0b, 0x85, 0x84, 0x05, 0x89, 0x0b, 0x0b, 0xcf, 0x60, 0x87, - 0x7e, 0x60, 0x81, 0x45, 0xfc, 0x99, 0xf5, 0xd3, 0x9c, 0x92, 0x89, 0xc5, 0x2c, 0xd1, 0xa2, 0x16, - 0x71, 0x45, 0x08, 0xfa, 0x02, 0x6f, 0x5b, 0xcc, 0xd2, 0x1e, 0x43, 0x0d, 0xd3, 0x90, 0xb2, 0x9e, - 0x1d, 0x86, 0xb6, 0xef, 0xb5, 0x7c, 0x8f, 0x05, 0xbe, 0x13, 0x15, 0x21, 0xed, 0x08, 0x0e, 0x37, - 0x4a, 0x65, 0x15, 0xe1, 0x8b, 0xdf, 0xcc, 0x69, 0x70, 0xb7, 0x79, 0xf1, 0x1b, 0x38, 0xdc, 0x28, - 0x8d, 0x4a, 0xd0, 0x73, 0xc8, 0xcc, 0x2c, 0x3b, 0x08, 0xab, 0x5b, 0xa2, 0x8c, 0xef, 0xaf, 0x74, - 0x0d, 0x76, 0x70, 0x6e, 0x87, 0xcc, 0x0f, 0xee, 0xb0, 0x24, 0x5d, 0xa4, 0xf3, 0x8a, 0xba, 0xa5, - 0xfd, 0x59, 0x81, 0x42, 0x42, 0xc8, 0x73, 0xbf, 0xe7, 0x4f, 0x28, 0xb9, 0x0e, 0x7c, 0x37, 0xae, - 0x63, 0x1c, 0xe8, 0x04, 0xbe, 0xcb, 0xcb, 0xba, 0x10, 0x32, 0x3f, 0x7a, 0x5d, 0x59, 0xfe, 0x39, - 0xf4, 0xd1, 0xd7, 0x90, 0x9b, 0x4a, 0x05, 0xc2, 0x47, 0x85, 0xd3, 0xdd, 0x35, 0xdb, 0xfc, 0x66, - 0x70, 0xcc, 0xb9, 0x48, 0xe7, 0x53, 0x6a, 0xfa, 0x22, 0x9d, 0x4f, 0xab, 0x99, 0x8b, 0x74, 0x3e, - 0xa3, 0x66, 0x2f, 0xd2, 0xf9, 0xac, 0x9a, 0xd3, 0xfe, 0xa3, 0x40, 0x3e, 0x66, 0xf3, 0x9d, 0xf0, - 0x8c, 0x4f, 0xf8, 0xbb, 0x88, 0xfa, 0x81, 0x3c, 0x07, 0x86, 0xb6, 0x4b, 0x51, 0x1d, 0x8a, 0x42, - 0xb8, 0xda, 0x65, 0x00, 0xc7, 0x9a, 0xa2, 0xd3, 0x10, 0x2d, 0x79, 0xcc, 0x58, 0x14, 0x32, 0xde, - 0x92, 0x4b, 0x4a, 0x3c, 0x55, 0x84, 0xf3, 0xf1, 0x98, 0x86, 0xa1, 0xb4, 0x92, 0x91, 0x94, 0x08, - 0x13, 0x86, 0x9e, 0x42, 0x25, 0xa6, 0xc4, 0xb6, 0xb2, 0xb2, 0xe5, 0x88, 0xe0, 0xc8, 0x5c, 0x03, - 0xd4, 0x24, 0xcf, 0x5d, 0x0e, 0x01, 0xe5, 0x25, 0x91, 0x1b, 0x95, 0x87, 0xd7, 0xfe, 0x08, 0x07, - 0xc2, 0x95, 0x97, 0x81, 0x7f, 0x65, 0x5d, 0xd9, 0x8e, 0xcd, 0xee, 0xe2, 0x3e, 0x85, 0x1f, 0x3c, - 0xf0, 0x5d, 0xe2, 0xc5, 0x85, 0xbf, 0x88, 0xf3, 0x1c, 0x30, 0x79, 0x25, 0x3b, 0x80, 0x1c, 0xf3, - 0xa5, 0x28, 0x72, 0x01, 0xf3, 0x85, 0x20, 0x39, 0x3c, 0xa5, 0x56, 0x86, 0x27, 0xed, 0x16, 0xaa, - 0xf7, 0x6d, 0x45, 0x6f, 0xa6, 0x0e, 0x85, 0xd9, 0x12, 0x16, 0xe6, 0x14, 0x9c, 0x84, 0x92, 0xbe, - 0xdd, 0xfa, 0x65, 0xdf, 0x6a, 0x7f, 0x51, 0x60, 0xe7, 0x6c, 0x6e, 0x3b, 0x93, 0x95, 0xde, 0x2b, - 0xb9, 0x3b, 0x65, 0x75, 0xb4, 0xdb, 0x34, 0xb7, 0x6d, 0x6d, 0x9c, 0xdb, 0x36, 0xcd, 0x46, 0xa9, - 0x07, 0x67, 0xa3, 0xcf, 0xa1, 0xb0, 0x1c, 0x8b, 0x64, 0x6b, 0x5b, 0xc4, 0x30, 0x8d, 0x67, 0xa2, - 0x50, 0x7b, 0x05, 0x28, 0xb9, 0xd1, 0xe8, 0x42, 0x16, 0x2d, 0xa0, 0xf2, 0x60, 0x0b, 0xf8, 0xec, - 0xef, 0x0a, 0x14, 0x93, 0x7d, 0x38, 0x2a, 0xc1, 0xb6, 0x61, 0x92, 0x4e, 0xd7, 0xf8, 0xee, 0x7c, - 0xa8, 0x7e, 0xc2, 0x3f, 0x07, 0xa3, 0x56, 0x4b, 0xd7, 0xdb, 0x7a, 0x5b, 0x55, 0x78, 0x85, 0xe0, - 0xb9, 0x5d, 0x6f, 0x2f, 0x0a, 0xc2, 0x16, 0xaf, 0xe5, 0x11, 0x66, 0xf6, 0x09, 0xee, 0x8f, 0x86, - 0xba, 0x9a, 0x42, 0x2a, 0x14, 0x23, 0x50, 0xc7, 0xb8, 0x8f, 0xd5, 0x34, 0x2f, 0x78, 0x11, 0x72, - 0xbf, 0x0f, 0x89, 0xdb, 0x94, 0x8c, 0xe8, 0x33, 0x62, 0xd6, 0xb2, 0x44, 0x93, 0xb3, 0x66, 0xb7, - 0x69, 0xb6, 0x74, 0x35, 0x7b, 0xfa, 0xb7, 0x0c, 0x64, 0xc5, 0x09, 0x02, 0x74, 0x0e, 0x85, 0xc4, - 0x48, 0x86, 0x8e, 0x3e, 0x3a, 0xaa, 0xd5, 0xaa, 0x9b, 0x27, 0x8f, 0x79, 0xf8, 0x42, 0x41, 0x17, - 0x50, 0x4c, 0x0e, 0x3c, 0x28, 0xd9, 0x9d, 0x6e, 0x98, 0x84, 0x3e, 0xaa, 0xeb, 0x35, 0xa8, 0x7a, - 0xc8, 0x6c, 0x97, 0x77, 0xa3, 0xd1, 0x7c, 0x80, 0x6a, 0x09, 0xfe, 0xda, 0xd0, 0x51, 0x3b, 0xdc, - 0x28, 0x8b, 0x5c, 0xd8, 0x95, 0x47, 0x8c, 0x3a, 0xf4, 0x7b, 0x47, 0x5c, 0x1d, 0x0b, 0x6a, 0x9f, - 0x3d, 0x24, 0x8e, 0xb4, 0x4d, 0x60, 0x77, 0x43, 0xc6, 0x46, 0xbf, 0x4a, 0xee, 0xe0, 0xc1, 0x7c, - 0x5f, 0x7b, 0xfa, 0x4b, 0xb4, 0xa5, 0x95, 0x0d, 0xa9, 0x7d, 0xc5, 0xca, 0xc3, 0x85, 0x61, 0xc5, - 0xca, 0xc7, 0x2a, 0xc4, 0x8f, 0xa0, 0xae, 0x67, 0x02, 0xa4, 0xad, 0xaf, 0xbd, 0x9f, 0x92, 0x6a, - 0x5f, 0x7e, 0x94, 0x13, 0x29, 0x37, 0x00, 0x96, 0xf1, 0x84, 0x1e, 0x27, 0x96, 0xdc, 0xcb, 0x07, - 0xb5, 0xa3, 0x07, 0xa4, 0x52, 0xd5, 0xd9, 0x37, 0x7f, 0x38, 0xb9, 0xb1, 0xd9, 0x74, 0x7e, 0x75, - 0x3c, 0xf6, 0xdd, 0x13, 0x87, 0xf7, 0xf4, 0x9e, 0xed, 0xdd, 0x78, 0x94, 0xfd, 0xec, 0x07, 0xb7, - 0x27, 0x8e, 0x37, 0x39, 0x11, 0x61, 0x79, 0xb2, 0xd0, 0x72, 0x95, 0x15, 0xff, 0x80, 0xfa, 0xf5, - 0xff, 0x02, 0x00, 0x00, 0xff, 0xff, 0x77, 0x3e, 0x21, 0x8e, 0xb0, 0x12, 0x00, 0x00, + // 1404 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x8c, 0x57, 0xdb, 0x52, 0xdb, 0xd6, + 0x1a, 0xde, 0xf2, 0x09, 0xf3, 0xdb, 0x18, 0x65, 0xb1, 0x27, 0xd1, 0x36, 0x21, 0xf1, 0xd6, 0xce, + 0x26, 0x9e, 0x4e, 0x02, 0x09, 0xed, 0x74, 0x32, 0xbd, 0xe8, 0x0c, 0xf8, 0x50, 0x4c, 0xcd, 0x21, + 0xcb, 0xe6, 0xa2, 0xcd, 0x85, 0x46, 0x58, 0xcb, 0x58, 0x45, 0xd2, 0x72, 0xb5, 0x96, 0x92, 0xe1, + 0x15, 0xfa, 0x22, 0xed, 0x4d, 0xfb, 0x5c, 0x7d, 0x84, 0x5e, 0x76, 0xd6, 0x41, 0x58, 0x36, 0x36, + 0xe9, 0x9d, 0xf5, 0xfd, 0xdf, 0x7f, 0x5a, 0xff, 0x09, 0xe0, 0x71, 0x4c, 0x13, 0x4e, 0xe2, 0x78, + 0x3a, 0xda, 0x57, 0xbf, 0xf6, 0xa6, 0x31, 0xe5, 0x14, 0xad, 0xdf, 0xe1, 0xf5, 0xf5, 0x78, 0x3a, + 0x52, 0xa8, 0xfd, 0x57, 0x11, 0xd0, 0x80, 0x44, 0xde, 0x85, 0x7b, 0x1b, 0x92, 0x88, 0x63, 0xf2, + 0x73, 0x42, 0x18, 0x47, 0x08, 0x0a, 0x1e, 0x61, 0xdc, 0x32, 0x1a, 0x46, 0xb3, 0x8a, 0xe5, 0x6f, + 0x64, 0x42, 0xde, 0x0d, 0xb9, 0x95, 0x6b, 0x18, 0xcd, 0x3c, 0x16, 0x3f, 0xd1, 0x7f, 0xa0, 0xec, + 0x86, 0xdc, 0x09, 0x99, 0xcb, 0xad, 0xaa, 0x84, 0xd7, 0xdc, 0x90, 0x9f, 0x32, 0x97, 0xa3, 0xff, + 0x42, 0x75, 0xaa, 0x4c, 0x3a, 0x13, 0x97, 0x4d, 0xac, 0xbc, 0x34, 0x54, 0xd1, 0xd8, 0xb1, 0xcb, + 0x26, 0xa8, 0x09, 0xe6, 0xd8, 0x8f, 0xdc, 0xc0, 0x19, 0x05, 0xfc, 0xa3, 0xe3, 0x91, 0x80, 0xbb, + 0x56, 0xa1, 0x61, 0x34, 0x8b, 0xb8, 0x26, 0xf1, 0x56, 0xc0, 0x3f, 0xb6, 0x05, 0x8a, 0x5e, 0xc2, + 0x66, 0x6a, 0x2c, 0x56, 0x01, 0x5a, 0xc5, 0x86, 0xd1, 0x5c, 0xc7, 0xb5, 0xe9, 0x7c, 0xd8, 0x2f, + 0x61, 0x93, 0xfb, 0x21, 0xa1, 0x09, 0x77, 0x18, 0x19, 0xd1, 0xc8, 0x63, 0x56, 0x49, 0x59, 0xd4, + 0xf0, 0x40, 0xa1, 0xc8, 0x86, 0x8d, 0x31, 0x21, 0x4e, 0xe0, 0x87, 0x3e, 0x77, 0x44, 0xf8, 0x6b, + 0x32, 0xfc, 0xca, 0x98, 0x90, 0xbe, 0xc0, 0x06, 0x2e, 0x47, 0x2f, 0xa0, 0x36, 0xe3, 0xc8, 0x1c, + 0x37, 0x24, 0xa9, 0x9a, 0x92, 0x64, 0xa2, 0xaf, 0xc0, 0xa4, 0x09, 0xbf, 0xa6, 0x7e, 0x74, 0xed, + 0x8c, 0x26, 0x6e, 0xe4, 0xf8, 0x9e, 0x55, 0x6e, 0x18, 0xcd, 0xc2, 0x51, 0xee, 0x8d, 0x81, 0x6b, + 0xa9, 0xac, 0x35, 0x71, 0xa3, 0x9e, 0x87, 0x76, 0x61, 0x33, 0x70, 0x19, 0x77, 0x26, 0x74, 0xea, + 0x4c, 0x93, 0xab, 0x1b, 0x72, 0x6b, 0xd5, 0xe4, 0xcb, 0x6c, 0x08, 0xf8, 0x98, 0x4e, 0x2f, 0x24, + 0x88, 0x76, 0x00, 0xe4, 0xab, 0x48, 0xe7, 0xd6, 0xba, 0xcc, 0x61, 0x5d, 0x20, 0xd2, 0x31, 0x7a, + 0x0b, 0x15, 0x59, 0x4d, 0x67, 0xe2, 0x47, 0x9c, 0x59, 0xd0, 0xc8, 0x37, 0x2b, 0x07, 0xe6, 0x5e, + 0x10, 0x89, 0xc2, 0x62, 0x21, 0x39, 0xf6, 0x23, 0x8e, 0x21, 0x4e, 0x7f, 0x32, 0xe4, 0xc1, 0x96, + 0xa8, 0xa2, 0x33, 0x4a, 0x18, 0xa7, 0xa1, 0x13, 0x93, 0x11, 0x8d, 0x3d, 0x66, 0x55, 0xa4, 0xea, + 0x57, 0x7b, 0x77, 0xcd, 0xb1, 0x77, 0xbf, 0x1b, 0xf6, 0xda, 0x84, 0xf1, 0x96, 0xd4, 0xc3, 0x4a, + 0xad, 0x13, 0xf1, 0xf8, 0x16, 0x3f, 0xf2, 0x16, 0x71, 0xf4, 0x0a, 0x90, 0x1b, 0x04, 0xf4, 0x93, + 0xc3, 0x48, 0x30, 0x76, 0x74, 0x75, 0xac, 0xcd, 0x86, 0xd1, 0x2c, 0x63, 0x53, 0x4a, 0x06, 0x24, + 0x18, 0x6b, 0xf3, 0xe8, 0x6b, 0xd8, 0x90, 0x31, 0x8d, 0x89, 0xcb, 0x93, 0x98, 0x30, 0xcb, 0x6c, + 0xe4, 0x9b, 0xb5, 0x83, 0x47, 0x3a, 0x91, 0xae, 0x82, 0x8f, 0x7c, 0x8e, 0xab, 0x82, 0xa7, 0xbf, + 0x59, 0xbd, 0x0d, 0x8f, 0x97, 0x87, 0x24, 0x7a, 0x54, 0xbc, 0xa9, 0x68, 0xdb, 0x02, 0x16, 0x3f, + 0xd1, 0xbf, 0xa1, 0xf8, 0xd1, 0x0d, 0x12, 0x22, 0xfb, 0xb6, 0x8a, 0xd5, 0xc7, 0x37, 0xb9, 0x77, + 0x86, 0xfd, 0x0e, 0xb6, 0x86, 0xb1, 0x3b, 0xba, 0x59, 0x68, 0xfd, 0xc5, 0xce, 0x35, 0xee, 0x75, + 0xae, 0xfd, 0x9b, 0x01, 0x1b, 0x5a, 0x6b, 0xc0, 0x5d, 0x9e, 0x30, 0xf4, 0x1a, 0x8a, 0x8c, 0xbb, + 0x9c, 0x48, 0x76, 0xed, 0xe0, 0x49, 0xe6, 0x3d, 0x33, 0x44, 0x82, 0x15, 0x0b, 0xd5, 0xa1, 0x3c, + 0x8d, 0x89, 0x1f, 0xba, 0xd7, 0x69, 0x5c, 0x77, 0xdf, 0xc8, 0x86, 0xa2, 0x54, 0x96, 0x23, 0x53, + 0x39, 0xa8, 0x66, 0xab, 0x8a, 0x95, 0x08, 0x35, 0xa1, 0x38, 0xe1, 0xc1, 0x88, 0x59, 0x05, 0x59, + 0x3e, 0xa4, 0x39, 0xc7, 0xc3, 0x7e, 0xeb, 0x90, 0x73, 0x12, 0x4e, 0x39, 0x56, 0x04, 0xfb, 0x5b, + 0xd8, 0x94, 0x9a, 0x5d, 0x42, 0x1e, 0x9a, 0xed, 0x27, 0x20, 0x26, 0x57, 0x4e, 0x82, 0x9a, 0xef, + 0x92, 0x1b, 0x8a, 0x21, 0xb0, 0x3d, 0x30, 0x67, 0xfa, 0x6c, 0x4a, 0x23, 0x26, 0xbc, 0x9b, 0x22, + 0x0c, 0xd1, 0xf1, 0x62, 0x40, 0xe4, 0x68, 0x18, 0x52, 0xab, 0xa6, 0xf1, 0x2e, 0x21, 0x72, 0x38, + 0x76, 0xd5, 0x3c, 0x3a, 0x01, 0x1d, 0xdd, 0x88, 0x09, 0x77, 0x6f, 0xb5, 0xf9, 0x0d, 0x01, 0xf7, + 0xe9, 0xe8, 0xa6, 0x2d, 0x40, 0xfb, 0x83, 0x5a, 0x42, 0x43, 0xaa, 0xb2, 0xfc, 0xc7, 0x95, 0x98, + 0x3d, 0x56, 0x6e, 0xe5, 0x63, 0xd9, 0x1f, 0x60, 0x6b, 0xce, 0xb8, 0xce, 0x22, 0x5b, 0x03, 0x63, + 0xa1, 0x06, 0x4d, 0x58, 0x1b, 0xbb, 0x7e, 0x90, 0xc4, 0xa9, 0xe1, 0x5a, 0xda, 0x92, 0x0a, 0xc5, + 0xa9, 0xd8, 0x7e, 0x0a, 0x75, 0x4c, 0x18, 0xe1, 0xa7, 0x3e, 0x63, 0x3e, 0x8d, 0x5a, 0x34, 0xe2, + 0x31, 0x0d, 0x74, 0x06, 0xf6, 0x0e, 0x6c, 0x2f, 0x95, 0xaa, 0x10, 0x84, 0xf2, 0xfb, 0x84, 0xc4, + 0xb7, 0xcb, 0x95, 0xdf, 0xc3, 0xf6, 0x52, 0xa9, 0x8e, 0xff, 0x15, 0x14, 0xa7, 0xae, 0x1f, 0x33, + 0x2b, 0x27, 0x7b, 0xe0, 0xf1, 0x5c, 0xcb, 0xf9, 0xf1, 0xb1, 0xcf, 0x38, 0x8d, 0x6f, 0xb1, 0x22, + 0x9d, 0x14, 0xca, 0x86, 0x99, 0xb3, 0x7f, 0x31, 0xa0, 0x92, 0x11, 0xa2, 0x6d, 0x58, 0x8f, 0xa8, + 0x47, 0x9c, 0x71, 0x4c, 0xc3, 0xf4, 0x11, 0x04, 0xd0, 0x8d, 0x69, 0x28, 0x7a, 0x42, 0x0a, 0x39, + 0xd5, 0x3d, 0x5a, 0x12, 0x9f, 0x43, 0x8a, 0x5e, 0xc3, 0xda, 0x44, 0x19, 0x90, 0x6b, 0xb3, 0x72, + 0xb0, 0xb5, 0xe0, 0xbb, 0xed, 0x72, 0x17, 0xa7, 0x9c, 0x93, 0x42, 0x39, 0x6f, 0x16, 0x4e, 0x0a, + 0xe5, 0x82, 0x59, 0x3c, 0x29, 0x94, 0x8b, 0x66, 0xe9, 0xa4, 0x50, 0x2e, 0x99, 0x6b, 0xf6, 0x9f, + 0x06, 0x94, 0x53, 0xb6, 0x88, 0x44, 0x3c, 0xa9, 0x23, 0xfa, 0x42, 0x37, 0x53, 0x59, 0x00, 0x43, + 0x3f, 0x24, 0xa8, 0x01, 0x55, 0x29, 0x9c, 0x6f, 0x51, 0x10, 0xd8, 0xa1, 0x6c, 0x53, 0xb9, 0xcf, + 0x53, 0x86, 0xec, 0xc7, 0x82, 0xde, 0xe7, 0x8a, 0x92, 0x9e, 0x24, 0x96, 0x8c, 0x46, 0x84, 0x31, + 0xe5, 0xa5, 0xa8, 0x28, 0x1a, 0x93, 0x8e, 0x76, 0x61, 0x33, 0xa5, 0xa4, 0xbe, 0x4a, 0xaa, 0x5f, + 0x35, 0xac, 0xdd, 0x35, 0xc1, 0xcc, 0xf2, 0xc2, 0xd9, 0x05, 0xa9, 0xcd, 0x88, 0xc2, 0xa9, 0x4a, + 0xde, 0xfe, 0x09, 0x9e, 0xc8, 0x52, 0x5e, 0xc4, 0xf4, 0xca, 0xbd, 0xf2, 0x03, 0x9f, 0xdf, 0xa6, + 0x4d, 0x2e, 0x12, 0x8f, 0x69, 0xe8, 0x88, 0xb7, 0x4d, 0x4b, 0x20, 0x80, 0x33, 0xea, 0x11, 0x51, + 0x02, 0x4e, 0x95, 0x48, 0x97, 0x80, 0x53, 0x29, 0xc8, 0x5e, 0xde, 0xfc, 0xdc, 0xe5, 0xb5, 0x6f, + 0xc0, 0xba, 0xef, 0x4b, 0xf7, 0x4c, 0x03, 0x2a, 0xd3, 0x19, 0x2c, 0xdd, 0x19, 0x38, 0x0b, 0x65, + 0x6b, 0x9b, 0xfb, 0x7c, 0x6d, 0xed, 0x5f, 0x0d, 0x78, 0x74, 0x94, 0xf8, 0x81, 0x37, 0x37, 0xb8, + 0xd9, 0xe8, 0x8c, 0xf9, 0xbf, 0x0b, 0x96, 0x1d, 0xfd, 0xdc, 0xd2, 0xa3, 0xbf, 0xec, 0xb0, 0xe6, + 0x57, 0x1e, 0xd6, 0xe7, 0x50, 0x99, 0xdd, 0x54, 0xb5, 0x17, 0xab, 0x18, 0x26, 0xe9, 0x41, 0x65, + 0xf6, 0x3b, 0x40, 0xd9, 0x40, 0xf5, 0x83, 0xdc, 0xed, 0x0f, 0x63, 0xe5, 0xfe, 0xf8, 0xe2, 0x0f, + 0x03, 0xaa, 0xd9, 0x25, 0x8e, 0x36, 0x60, 0xbd, 0x77, 0xe6, 0x74, 0xfb, 0xbd, 0xef, 0x8e, 0x87, + 0xe6, 0xbf, 0xc4, 0xe7, 0xe0, 0xb2, 0xd5, 0xea, 0x74, 0xda, 0x9d, 0xb6, 0x69, 0x20, 0x04, 0xb5, + 0xee, 0x61, 0xaf, 0xdf, 0x69, 0x3b, 0xc3, 0xde, 0x69, 0xe7, 0xfc, 0x72, 0x68, 0xe6, 0xd0, 0x16, + 0x6c, 0x6a, 0xec, 0xec, 0xdc, 0xc1, 0xe7, 0x97, 0xc3, 0x8e, 0x99, 0x47, 0x26, 0x54, 0x35, 0xd8, + 0xc1, 0xf8, 0x1c, 0x9b, 0x05, 0xf4, 0x02, 0x1a, 0x1a, 0xe9, 0x9d, 0xb5, 0xce, 0x31, 0xee, 0xb4, + 0x86, 0xce, 0xc5, 0xe1, 0x0f, 0xa7, 0x9d, 0xb3, 0xa1, 0xd3, 0xee, 0x0c, 0x0f, 0x7b, 0xfd, 0x81, + 0x59, 0x44, 0xcf, 0x61, 0xfb, 0x8e, 0x35, 0xb8, 0xec, 0x76, 0x7b, 0xad, 0x9e, 0x20, 0x1c, 0x1d, + 0xf6, 0x0f, 0xcf, 0x5a, 0x1d, 0xb3, 0x74, 0xf0, 0x7b, 0x11, 0x4a, 0x32, 0x83, 0x18, 0x1d, 0x43, + 0x25, 0x73, 0xcf, 0xd1, 0xce, 0x83, 0x77, 0xbe, 0x6e, 0x2d, 0x3f, 0x5b, 0x09, 0x7b, 0x63, 0xa0, + 0x13, 0xa8, 0x66, 0xaf, 0x25, 0x7a, 0x96, 0xe1, 0x2e, 0x39, 0xa3, 0x0f, 0xda, 0xfa, 0x1e, 0xcc, + 0x0e, 0xe3, 0x7e, 0x28, 0x2e, 0xa2, 0x3e, 0x2e, 0xa8, 0x9e, 0xe1, 0x2f, 0x5c, 0xac, 0xfa, 0xf6, + 0x52, 0x99, 0x2e, 0x61, 0x5f, 0xa5, 0xa8, 0xd7, 0xfb, 0xbd, 0x14, 0xe7, 0x6f, 0x4a, 0xfd, 0xd9, + 0x2a, 0xb1, 0xb6, 0xe6, 0xc1, 0xd6, 0x92, 0x8d, 0x8d, 0xfe, 0x9f, 0x8d, 0x60, 0xe5, 0xbe, 0xaf, + 0xef, 0x7e, 0x8e, 0x36, 0xf3, 0xb2, 0x64, 0xb5, 0xcf, 0x79, 0x59, 0x7d, 0x18, 0xe6, 0xbc, 0x3c, + 0x74, 0x21, 0x3e, 0x80, 0xb9, 0xb8, 0x09, 0x90, 0xbd, 0xa8, 0x7b, 0x7f, 0x25, 0xd5, 0xff, 0xf7, + 0x20, 0x47, 0x1b, 0xef, 0x01, 0xcc, 0xe6, 0x09, 0x3d, 0xcd, 0xa8, 0xdc, 0xdb, 0x07, 0xf5, 0x9d, + 0x15, 0x52, 0x65, 0xea, 0xe8, 0xed, 0x8f, 0xfb, 0xd7, 0x3e, 0x9f, 0x24, 0x57, 0x7b, 0x23, 0x1a, + 0xee, 0x07, 0xfe, 0xf5, 0x84, 0x47, 0x7e, 0x74, 0x1d, 0x11, 0xfe, 0x89, 0xc6, 0x37, 0xfb, 0x41, + 0xe4, 0xed, 0xcb, 0xb1, 0xdc, 0xbf, 0xb3, 0x72, 0x55, 0x92, 0xff, 0xbd, 0x7c, 0xf9, 0x77, 0x00, + 0x00, 0x00, 0xff, 0xff, 0x30, 0x2f, 0x8a, 0x5c, 0xed, 0x0c, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/lnrpc/routerrpc/router.proto b/lnrpc/routerrpc/router.proto index 2f4d4d69ea..21f6ab668e 100644 --- a/lnrpc/routerrpc/router.proto +++ b/lnrpc/routerrpc/router.proto @@ -222,167 +222,9 @@ message SendToRouteResponse { bytes preimage = 1; /// The failure message in case the payment failed. - Failure failure = 2; + lnrpc.Failure failure = 2; } -message Failure { - enum FailureCode { - /** - The numbers assigned in this enumeration match the failure codes as - defined in BOLT #4. Because protobuf 3 requires enums to start with 0, - a RESERVED value is added. - */ - RESERVED = 0; - - INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS = 1; - INCORRECT_PAYMENT_AMOUNT = 2; - FINAL_INCORRECT_CLTV_EXPIRY = 3; - FINAL_INCORRECT_HTLC_AMOUNT = 4; - FINAL_EXPIRY_TOO_SOON = 5; - INVALID_REALM = 6; - EXPIRY_TOO_SOON = 7; - INVALID_ONION_VERSION = 8; - INVALID_ONION_HMAC = 9; - INVALID_ONION_KEY = 10; - AMOUNT_BELOW_MINIMUM = 11; - FEE_INSUFFICIENT = 12; - INCORRECT_CLTV_EXPIRY = 13; - CHANNEL_DISABLED = 14; - TEMPORARY_CHANNEL_FAILURE = 15; - REQUIRED_NODE_FEATURE_MISSING = 16; - REQUIRED_CHANNEL_FEATURE_MISSING = 17; - UNKNOWN_NEXT_PEER = 18; - TEMPORARY_NODE_FAILURE = 19; - PERMANENT_NODE_FAILURE = 20; - PERMANENT_CHANNEL_FAILURE = 21; - EXPIRY_TOO_FAR = 22; - MPP_TIMEOUT = 23; - - /** - The error source is known, but the failure itself couldn't be decoded. - */ - UNKNOWN_FAILURE = 998; - - /** - An unreadable failure result is returned if the received failure message - cannot be decrypted. In that case the error source is unknown. - */ - UNREADABLE_FAILURE = 999; - } - - /// Failure code as defined in the Lightning spec - FailureCode code = 1; - - reserved 2; - - /// An optional channel update message. - ChannelUpdate channel_update = 3; - - /// A failure type-dependent htlc value. - uint64 htlc_msat = 4; - - /// The sha256 sum of the onion payload. - bytes onion_sha_256 = 5; - - /// A failure type-dependent cltv expiry value. - uint32 cltv_expiry = 6; - - /// A failure type-dependent flags value. - uint32 flags = 7; - - /** - The position in the path of the intermediate or final node that generated - the failure message. Position zero is the sender node. - **/ - uint32 failure_source_index = 8; - - /// A failure type-dependent block height. - uint32 height = 9; -} - - -message ChannelUpdate { - /** - The signature that validates the announced data and proves the ownership - of node id. - */ - bytes signature = 1; - - /** - The target chain that this channel was opened within. This value - should be the genesis hash of the target chain. Along with the short - channel ID, this uniquely identifies the channel globally in a - blockchain. - */ - bytes chain_hash = 2; - - /** - The unique description of the funding transaction. - */ - uint64 chan_id = 3 [jstype = JS_STRING]; - - /** - A timestamp that allows ordering in the case of multiple announcements. - We should ignore the message if timestamp is not greater than the - last-received. - */ - uint32 timestamp = 4; - - /** - The bitfield that describes whether optional fields are present in this - update. Currently, the least-significant bit must be set to 1 if the - optional field MaxHtlc is present. - */ - uint32 message_flags = 10; - - /** - The bitfield that describes additional meta-data concerning how the - update is to be interpreted. Currently, the least-significant bit must be - set to 0 if the creating node corresponds to the first node in the - previously sent channel announcement and 1 otherwise. If the second bit - is set, then the channel is set to be disabled. - */ - uint32 channel_flags = 5; - - /** - The minimum number of blocks this node requires to be added to the expiry - of HTLCs. This is a security parameter determined by the node operator. - This value represents the required gap between the time locks of the - incoming and outgoing HTLC's set to this node. - */ - uint32 time_lock_delta = 6; - - /** - The minimum HTLC value which will be accepted. - */ - uint64 htlc_minimum_msat = 7; - - /** - The base fee that must be used for incoming HTLC's to this particular - channel. This value will be tacked onto the required for a payment - independent of the size of the payment. - */ - uint32 base_fee = 8; - - /** - The fee rate that will be charged per millionth of a satoshi. - */ - uint32 fee_rate = 9; - - /** - The maximum HTLC value which will be accepted. - */ - uint64 htlc_maximum_msat = 11; - - /** - The set of data that was appended to this message, some of which we may - not actually know how to iterate or parse. By holding onto this data, we - ensure that we're able to properly validate the set of signatures that - cover these new fields, and ensure we're able to make upgrades to the - network in a forwards compatible manner. - */ - bytes extra_opaque_data = 12; -} message ResetMissionControlRequest { } diff --git a/lnrpc/routerrpc/router_server.go b/lnrpc/routerrpc/router_server.go index a1b7948c10..069b145c9f 100644 --- a/lnrpc/routerrpc/router_server.go +++ b/lnrpc/routerrpc/router_server.go @@ -318,11 +318,11 @@ func (s *Server) SendToRoute(ctx context.Context, // Because of difficulties with using protobuf oneof constructs in some // languages, the decision was made here to use a single message format for all // failure messages with some fields left empty depending on the failure type. -func marshallError(sendError error) (*Failure, error) { - response := &Failure{} +func marshallError(sendError error) (*lnrpc.Failure, error) { + response := &lnrpc.Failure{} if sendError == htlcswitch.ErrUnreadableFailureMessage { - response.Code = Failure_UNREADABLE_FAILURE + response.Code = lnrpc.Failure_UNREADABLE_FAILURE return response, nil } @@ -334,92 +334,92 @@ func marshallError(sendError error) (*Failure, error) { switch onionErr := rtErr.WireMessage().(type) { case *lnwire.FailIncorrectDetails: - response.Code = Failure_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS + response.Code = lnrpc.Failure_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS response.Height = onionErr.Height() case *lnwire.FailIncorrectPaymentAmount: - response.Code = Failure_INCORRECT_PAYMENT_AMOUNT + response.Code = lnrpc.Failure_INCORRECT_PAYMENT_AMOUNT case *lnwire.FailFinalIncorrectCltvExpiry: - response.Code = Failure_FINAL_INCORRECT_CLTV_EXPIRY + response.Code = lnrpc.Failure_FINAL_INCORRECT_CLTV_EXPIRY response.CltvExpiry = onionErr.CltvExpiry case *lnwire.FailFinalIncorrectHtlcAmount: - response.Code = Failure_FINAL_INCORRECT_HTLC_AMOUNT + response.Code = lnrpc.Failure_FINAL_INCORRECT_HTLC_AMOUNT response.HtlcMsat = uint64(onionErr.IncomingHTLCAmount) case *lnwire.FailFinalExpiryTooSoon: - response.Code = Failure_FINAL_EXPIRY_TOO_SOON + response.Code = lnrpc.Failure_FINAL_EXPIRY_TOO_SOON case *lnwire.FailInvalidRealm: - response.Code = Failure_INVALID_REALM + response.Code = lnrpc.Failure_INVALID_REALM case *lnwire.FailExpiryTooSoon: - response.Code = Failure_EXPIRY_TOO_SOON + response.Code = lnrpc.Failure_EXPIRY_TOO_SOON response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) case *lnwire.FailExpiryTooFar: - response.Code = Failure_EXPIRY_TOO_FAR + response.Code = lnrpc.Failure_EXPIRY_TOO_FAR case *lnwire.FailInvalidOnionVersion: - response.Code = Failure_INVALID_ONION_VERSION + response.Code = lnrpc.Failure_INVALID_ONION_VERSION response.OnionSha_256 = onionErr.OnionSHA256[:] case *lnwire.FailInvalidOnionHmac: - response.Code = Failure_INVALID_ONION_HMAC + response.Code = lnrpc.Failure_INVALID_ONION_HMAC response.OnionSha_256 = onionErr.OnionSHA256[:] case *lnwire.FailInvalidOnionKey: - response.Code = Failure_INVALID_ONION_KEY + response.Code = lnrpc.Failure_INVALID_ONION_KEY response.OnionSha_256 = onionErr.OnionSHA256[:] case *lnwire.FailAmountBelowMinimum: - response.Code = Failure_AMOUNT_BELOW_MINIMUM + response.Code = lnrpc.Failure_AMOUNT_BELOW_MINIMUM response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) response.HtlcMsat = uint64(onionErr.HtlcMsat) case *lnwire.FailFeeInsufficient: - response.Code = Failure_FEE_INSUFFICIENT + response.Code = lnrpc.Failure_FEE_INSUFFICIENT response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) response.HtlcMsat = uint64(onionErr.HtlcMsat) case *lnwire.FailIncorrectCltvExpiry: - response.Code = Failure_INCORRECT_CLTV_EXPIRY + response.Code = lnrpc.Failure_INCORRECT_CLTV_EXPIRY response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) response.CltvExpiry = onionErr.CltvExpiry case *lnwire.FailChannelDisabled: - response.Code = Failure_CHANNEL_DISABLED + response.Code = lnrpc.Failure_CHANNEL_DISABLED response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) response.Flags = uint32(onionErr.Flags) case *lnwire.FailTemporaryChannelFailure: - response.Code = Failure_TEMPORARY_CHANNEL_FAILURE + response.Code = lnrpc.Failure_TEMPORARY_CHANNEL_FAILURE response.ChannelUpdate = marshallChannelUpdate(onionErr.Update) case *lnwire.FailRequiredNodeFeatureMissing: - response.Code = Failure_REQUIRED_NODE_FEATURE_MISSING + response.Code = lnrpc.Failure_REQUIRED_NODE_FEATURE_MISSING case *lnwire.FailRequiredChannelFeatureMissing: - response.Code = Failure_REQUIRED_CHANNEL_FEATURE_MISSING + response.Code = lnrpc.Failure_REQUIRED_CHANNEL_FEATURE_MISSING case *lnwire.FailUnknownNextPeer: - response.Code = Failure_UNKNOWN_NEXT_PEER + response.Code = lnrpc.Failure_UNKNOWN_NEXT_PEER case *lnwire.FailTemporaryNodeFailure: - response.Code = Failure_TEMPORARY_NODE_FAILURE + response.Code = lnrpc.Failure_TEMPORARY_NODE_FAILURE case *lnwire.FailPermanentNodeFailure: - response.Code = Failure_PERMANENT_NODE_FAILURE + response.Code = lnrpc.Failure_PERMANENT_NODE_FAILURE case *lnwire.FailPermanentChannelFailure: - response.Code = Failure_PERMANENT_CHANNEL_FAILURE + response.Code = lnrpc.Failure_PERMANENT_CHANNEL_FAILURE case *lnwire.FailMPPTimeout: - response.Code = Failure_MPP_TIMEOUT + response.Code = lnrpc.Failure_MPP_TIMEOUT case nil: - response.Code = Failure_UNKNOWN_FAILURE + response.Code = lnrpc.Failure_UNKNOWN_FAILURE default: return nil, fmt.Errorf("cannot marshall failure %T", onionErr) @@ -441,12 +441,12 @@ func marshallError(sendError error) (*Failure, error) { // marshallChannelUpdate marshalls a channel update as received over the wire to // the router rpc format. -func marshallChannelUpdate(update *lnwire.ChannelUpdate) *ChannelUpdate { +func marshallChannelUpdate(update *lnwire.ChannelUpdate) *lnrpc.ChannelUpdate { if update == nil { return nil } - return &ChannelUpdate{ + return &lnrpc.ChannelUpdate{ Signature: update.Signature[:], ChainHash: update.ChainHash[:], ChanId: update.ShortChannelID.ToUint64(), diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index 36727add24..0da66bfdfe 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -408,6 +408,112 @@ func (HTLCAttempt_HTLCStatus) EnumDescriptor() ([]byte, []int) { return fileDescriptor_77a6da22d6a3feb1, []int{113, 0} } +type Failure_FailureCode int32 + +const ( + //* + //The numbers assigned in this enumeration match the failure codes as + //defined in BOLT #4. Because protobuf 3 requires enums to start with 0, + //a RESERVED value is added. + Failure_RESERVED Failure_FailureCode = 0 + Failure_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS Failure_FailureCode = 1 + Failure_INCORRECT_PAYMENT_AMOUNT Failure_FailureCode = 2 + Failure_FINAL_INCORRECT_CLTV_EXPIRY Failure_FailureCode = 3 + Failure_FINAL_INCORRECT_HTLC_AMOUNT Failure_FailureCode = 4 + Failure_FINAL_EXPIRY_TOO_SOON Failure_FailureCode = 5 + Failure_INVALID_REALM Failure_FailureCode = 6 + Failure_EXPIRY_TOO_SOON Failure_FailureCode = 7 + Failure_INVALID_ONION_VERSION Failure_FailureCode = 8 + Failure_INVALID_ONION_HMAC Failure_FailureCode = 9 + Failure_INVALID_ONION_KEY Failure_FailureCode = 10 + Failure_AMOUNT_BELOW_MINIMUM Failure_FailureCode = 11 + Failure_FEE_INSUFFICIENT Failure_FailureCode = 12 + Failure_INCORRECT_CLTV_EXPIRY Failure_FailureCode = 13 + Failure_CHANNEL_DISABLED Failure_FailureCode = 14 + Failure_TEMPORARY_CHANNEL_FAILURE Failure_FailureCode = 15 + Failure_REQUIRED_NODE_FEATURE_MISSING Failure_FailureCode = 16 + Failure_REQUIRED_CHANNEL_FEATURE_MISSING Failure_FailureCode = 17 + Failure_UNKNOWN_NEXT_PEER Failure_FailureCode = 18 + Failure_TEMPORARY_NODE_FAILURE Failure_FailureCode = 19 + Failure_PERMANENT_NODE_FAILURE Failure_FailureCode = 20 + Failure_PERMANENT_CHANNEL_FAILURE Failure_FailureCode = 21 + Failure_EXPIRY_TOO_FAR Failure_FailureCode = 22 + Failure_MPP_TIMEOUT Failure_FailureCode = 23 + //* + //The error source is known, but the failure itself couldn't be decoded. + Failure_UNKNOWN_FAILURE Failure_FailureCode = 998 + //* + //An unreadable failure result is returned if the received failure message + //cannot be decrypted. In that case the error source is unknown. + Failure_UNREADABLE_FAILURE Failure_FailureCode = 999 +) + +var Failure_FailureCode_name = map[int32]string{ + 0: "RESERVED", + 1: "INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS", + 2: "INCORRECT_PAYMENT_AMOUNT", + 3: "FINAL_INCORRECT_CLTV_EXPIRY", + 4: "FINAL_INCORRECT_HTLC_AMOUNT", + 5: "FINAL_EXPIRY_TOO_SOON", + 6: "INVALID_REALM", + 7: "EXPIRY_TOO_SOON", + 8: "INVALID_ONION_VERSION", + 9: "INVALID_ONION_HMAC", + 10: "INVALID_ONION_KEY", + 11: "AMOUNT_BELOW_MINIMUM", + 12: "FEE_INSUFFICIENT", + 13: "INCORRECT_CLTV_EXPIRY", + 14: "CHANNEL_DISABLED", + 15: "TEMPORARY_CHANNEL_FAILURE", + 16: "REQUIRED_NODE_FEATURE_MISSING", + 17: "REQUIRED_CHANNEL_FEATURE_MISSING", + 18: "UNKNOWN_NEXT_PEER", + 19: "TEMPORARY_NODE_FAILURE", + 20: "PERMANENT_NODE_FAILURE", + 21: "PERMANENT_CHANNEL_FAILURE", + 22: "EXPIRY_TOO_FAR", + 23: "MPP_TIMEOUT", + 998: "UNKNOWN_FAILURE", + 999: "UNREADABLE_FAILURE", +} + +var Failure_FailureCode_value = map[string]int32{ + "RESERVED": 0, + "INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS": 1, + "INCORRECT_PAYMENT_AMOUNT": 2, + "FINAL_INCORRECT_CLTV_EXPIRY": 3, + "FINAL_INCORRECT_HTLC_AMOUNT": 4, + "FINAL_EXPIRY_TOO_SOON": 5, + "INVALID_REALM": 6, + "EXPIRY_TOO_SOON": 7, + "INVALID_ONION_VERSION": 8, + "INVALID_ONION_HMAC": 9, + "INVALID_ONION_KEY": 10, + "AMOUNT_BELOW_MINIMUM": 11, + "FEE_INSUFFICIENT": 12, + "INCORRECT_CLTV_EXPIRY": 13, + "CHANNEL_DISABLED": 14, + "TEMPORARY_CHANNEL_FAILURE": 15, + "REQUIRED_NODE_FEATURE_MISSING": 16, + "REQUIRED_CHANNEL_FEATURE_MISSING": 17, + "UNKNOWN_NEXT_PEER": 18, + "TEMPORARY_NODE_FAILURE": 19, + "PERMANENT_NODE_FAILURE": 20, + "PERMANENT_CHANNEL_FAILURE": 21, + "EXPIRY_TOO_FAR": 22, + "MPP_TIMEOUT": 23, + "UNKNOWN_FAILURE": 998, + "UNREADABLE_FAILURE": 999, +} + +func (x Failure_FailureCode) String() string { + return proto.EnumName(Failure_FailureCode_name, int32(x)) +} + +func (Failure_FailureCode) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{146, 0} +} + type GenSeedRequest struct { //* //aezeed_passphrase is an optional user provided passphrase that will be used @@ -10469,6 +10575,283 @@ func (m *BakeMacaroonResponse) GetMacaroon() string { return "" } +type Failure struct { + /// Failure code as defined in the Lightning spec + Code Failure_FailureCode `protobuf:"varint,1,opt,name=code,proto3,enum=lnrpc.Failure_FailureCode" json:"code,omitempty"` + /// An optional channel update message. + ChannelUpdate *ChannelUpdate `protobuf:"bytes,3,opt,name=channel_update,json=channelUpdate,proto3" json:"channel_update,omitempty"` + /// A failure type-dependent htlc value. + HtlcMsat uint64 `protobuf:"varint,4,opt,name=htlc_msat,json=htlcMsat,proto3" json:"htlc_msat,omitempty"` + /// The sha256 sum of the onion payload. + OnionSha_256 []byte `protobuf:"bytes,5,opt,name=onion_sha_256,json=onionSha256,proto3" json:"onion_sha_256,omitempty"` + /// A failure type-dependent cltv expiry value. + CltvExpiry uint32 `protobuf:"varint,6,opt,name=cltv_expiry,json=cltvExpiry,proto3" json:"cltv_expiry,omitempty"` + /// A failure type-dependent flags value. + Flags uint32 `protobuf:"varint,7,opt,name=flags,proto3" json:"flags,omitempty"` + //* + //The position in the path of the intermediate or final node that generated + //the failure message. Position zero is the sender node. + FailureSourceIndex uint32 `protobuf:"varint,8,opt,name=failure_source_index,json=failureSourceIndex,proto3" json:"failure_source_index,omitempty"` + /// A failure type-dependent block height. + Height uint32 `protobuf:"varint,9,opt,name=height,proto3" json:"height,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *Failure) Reset() { *m = Failure{} } +func (m *Failure) String() string { return proto.CompactTextString(m) } +func (*Failure) ProtoMessage() {} +func (*Failure) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{146} +} + +func (m *Failure) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_Failure.Unmarshal(m, b) +} +func (m *Failure) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_Failure.Marshal(b, m, deterministic) +} +func (m *Failure) XXX_Merge(src proto.Message) { + xxx_messageInfo_Failure.Merge(m, src) +} +func (m *Failure) XXX_Size() int { + return xxx_messageInfo_Failure.Size(m) +} +func (m *Failure) XXX_DiscardUnknown() { + xxx_messageInfo_Failure.DiscardUnknown(m) +} + +var xxx_messageInfo_Failure proto.InternalMessageInfo + +func (m *Failure) GetCode() Failure_FailureCode { + if m != nil { + return m.Code + } + return Failure_RESERVED +} + +func (m *Failure) GetChannelUpdate() *ChannelUpdate { + if m != nil { + return m.ChannelUpdate + } + return nil +} + +func (m *Failure) GetHtlcMsat() uint64 { + if m != nil { + return m.HtlcMsat + } + return 0 +} + +func (m *Failure) GetOnionSha_256() []byte { + if m != nil { + return m.OnionSha_256 + } + return nil +} + +func (m *Failure) GetCltvExpiry() uint32 { + if m != nil { + return m.CltvExpiry + } + return 0 +} + +func (m *Failure) GetFlags() uint32 { + if m != nil { + return m.Flags + } + return 0 +} + +func (m *Failure) GetFailureSourceIndex() uint32 { + if m != nil { + return m.FailureSourceIndex + } + return 0 +} + +func (m *Failure) GetHeight() uint32 { + if m != nil { + return m.Height + } + return 0 +} + +type ChannelUpdate struct { + //* + //The signature that validates the announced data and proves the ownership + //of node id. + Signature []byte `protobuf:"bytes,1,opt,name=signature,proto3" json:"signature,omitempty"` + //* + //The target chain that this channel was opened within. This value + //should be the genesis hash of the target chain. Along with the short + //channel ID, this uniquely identifies the channel globally in a + //blockchain. + ChainHash []byte `protobuf:"bytes,2,opt,name=chain_hash,json=chainHash,proto3" json:"chain_hash,omitempty"` + //* + //The unique description of the funding transaction. + ChanId uint64 `protobuf:"varint,3,opt,name=chan_id,json=chanId,proto3" json:"chan_id,omitempty"` + //* + //A timestamp that allows ordering in the case of multiple announcements. + //We should ignore the message if timestamp is not greater than the + //last-received. + Timestamp uint32 `protobuf:"varint,4,opt,name=timestamp,proto3" json:"timestamp,omitempty"` + //* + //The bitfield that describes whether optional fields are present in this + //update. Currently, the least-significant bit must be set to 1 if the + //optional field MaxHtlc is present. + MessageFlags uint32 `protobuf:"varint,10,opt,name=message_flags,json=messageFlags,proto3" json:"message_flags,omitempty"` + //* + //The bitfield that describes additional meta-data concerning how the + //update is to be interpreted. Currently, the least-significant bit must be + //set to 0 if the creating node corresponds to the first node in the + //previously sent channel announcement and 1 otherwise. If the second bit + //is set, then the channel is set to be disabled. + ChannelFlags uint32 `protobuf:"varint,5,opt,name=channel_flags,json=channelFlags,proto3" json:"channel_flags,omitempty"` + //* + //The minimum number of blocks this node requires to be added to the expiry + //of HTLCs. This is a security parameter determined by the node operator. + //This value represents the required gap between the time locks of the + //incoming and outgoing HTLC's set to this node. + TimeLockDelta uint32 `protobuf:"varint,6,opt,name=time_lock_delta,json=timeLockDelta,proto3" json:"time_lock_delta,omitempty"` + //* + //The minimum HTLC value which will be accepted. + HtlcMinimumMsat uint64 `protobuf:"varint,7,opt,name=htlc_minimum_msat,json=htlcMinimumMsat,proto3" json:"htlc_minimum_msat,omitempty"` + //* + //The base fee that must be used for incoming HTLC's to this particular + //channel. This value will be tacked onto the required for a payment + //independent of the size of the payment. + BaseFee uint32 `protobuf:"varint,8,opt,name=base_fee,json=baseFee,proto3" json:"base_fee,omitempty"` + //* + //The fee rate that will be charged per millionth of a satoshi. + FeeRate uint32 `protobuf:"varint,9,opt,name=fee_rate,json=feeRate,proto3" json:"fee_rate,omitempty"` + //* + //The maximum HTLC value which will be accepted. + HtlcMaximumMsat uint64 `protobuf:"varint,11,opt,name=htlc_maximum_msat,json=htlcMaximumMsat,proto3" json:"htlc_maximum_msat,omitempty"` + //* + //The set of data that was appended to this message, some of which we may + //not actually know how to iterate or parse. By holding onto this data, we + //ensure that we're able to properly validate the set of signatures that + //cover these new fields, and ensure we're able to make upgrades to the + //network in a forwards compatible manner. + ExtraOpaqueData []byte `protobuf:"bytes,12,opt,name=extra_opaque_data,json=extraOpaqueData,proto3" json:"extra_opaque_data,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ChannelUpdate) Reset() { *m = ChannelUpdate{} } +func (m *ChannelUpdate) String() string { return proto.CompactTextString(m) } +func (*ChannelUpdate) ProtoMessage() {} +func (*ChannelUpdate) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{147} +} + +func (m *ChannelUpdate) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ChannelUpdate.Unmarshal(m, b) +} +func (m *ChannelUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ChannelUpdate.Marshal(b, m, deterministic) +} +func (m *ChannelUpdate) XXX_Merge(src proto.Message) { + xxx_messageInfo_ChannelUpdate.Merge(m, src) +} +func (m *ChannelUpdate) XXX_Size() int { + return xxx_messageInfo_ChannelUpdate.Size(m) +} +func (m *ChannelUpdate) XXX_DiscardUnknown() { + xxx_messageInfo_ChannelUpdate.DiscardUnknown(m) +} + +var xxx_messageInfo_ChannelUpdate proto.InternalMessageInfo + +func (m *ChannelUpdate) GetSignature() []byte { + if m != nil { + return m.Signature + } + return nil +} + +func (m *ChannelUpdate) GetChainHash() []byte { + if m != nil { + return m.ChainHash + } + return nil +} + +func (m *ChannelUpdate) GetChanId() uint64 { + if m != nil { + return m.ChanId + } + return 0 +} + +func (m *ChannelUpdate) GetTimestamp() uint32 { + if m != nil { + return m.Timestamp + } + return 0 +} + +func (m *ChannelUpdate) GetMessageFlags() uint32 { + if m != nil { + return m.MessageFlags + } + return 0 +} + +func (m *ChannelUpdate) GetChannelFlags() uint32 { + if m != nil { + return m.ChannelFlags + } + return 0 +} + +func (m *ChannelUpdate) GetTimeLockDelta() uint32 { + if m != nil { + return m.TimeLockDelta + } + return 0 +} + +func (m *ChannelUpdate) GetHtlcMinimumMsat() uint64 { + if m != nil { + return m.HtlcMinimumMsat + } + return 0 +} + +func (m *ChannelUpdate) GetBaseFee() uint32 { + if m != nil { + return m.BaseFee + } + return 0 +} + +func (m *ChannelUpdate) GetFeeRate() uint32 { + if m != nil { + return m.FeeRate + } + return 0 +} + +func (m *ChannelUpdate) GetHtlcMaximumMsat() uint64 { + if m != nil { + return m.HtlcMaximumMsat + } + return 0 +} + +func (m *ChannelUpdate) GetExtraOpaqueData() []byte { + if m != nil { + return m.ExtraOpaqueData + } + return nil +} + func init() { proto.RegisterEnum("lnrpc.AddressType", AddressType_name, AddressType_value) proto.RegisterEnum("lnrpc.InvoiceHTLCState", InvoiceHTLCState_name, InvoiceHTLCState_value) @@ -10481,6 +10864,7 @@ func init() { proto.RegisterEnum("lnrpc.Invoice_InvoiceState", Invoice_InvoiceState_name, Invoice_InvoiceState_value) proto.RegisterEnum("lnrpc.Payment_PaymentStatus", Payment_PaymentStatus_name, Payment_PaymentStatus_value) proto.RegisterEnum("lnrpc.HTLCAttempt_HTLCStatus", HTLCAttempt_HTLCStatus_name, HTLCAttempt_HTLCStatus_value) + proto.RegisterEnum("lnrpc.Failure_FailureCode", Failure_FailureCode_name, Failure_FailureCode_value) proto.RegisterType((*GenSeedRequest)(nil), "lnrpc.GenSeedRequest") proto.RegisterType((*GenSeedResponse)(nil), "lnrpc.GenSeedResponse") proto.RegisterType((*InitWalletRequest)(nil), "lnrpc.InitWalletRequest") @@ -10643,665 +11027,707 @@ func init() { proto.RegisterType((*MacaroonPermission)(nil), "lnrpc.MacaroonPermission") proto.RegisterType((*BakeMacaroonRequest)(nil), "lnrpc.BakeMacaroonRequest") proto.RegisterType((*BakeMacaroonResponse)(nil), "lnrpc.BakeMacaroonResponse") + proto.RegisterType((*Failure)(nil), "lnrpc.Failure") + proto.RegisterType((*ChannelUpdate)(nil), "lnrpc.ChannelUpdate") } func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 10447 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x5b, 0x8f, 0x24, 0x47, - 0x76, 0x18, 0x3c, 0x75, 0xeb, 0xaa, 0x3a, 0x75, 0xe9, 0xea, 0xe8, 0x9e, 0xee, 0x9a, 0x1a, 0x0e, - 0x67, 0x98, 0xe4, 0x72, 0x86, 0x43, 0x72, 0x66, 0x38, 0x4b, 0x2e, 0x29, 0xf2, 0xfb, 0x56, 0xea, - 0x2b, 0xbb, 0x77, 0xfa, 0xc6, 0xac, 0x9e, 0xa5, 0xb8, 0x6b, 0x39, 0x37, 0xbb, 0x2a, 0xba, 0x3b, - 0x35, 0x55, 0x99, 0xc5, 0xcc, 0xac, 0xbe, 0x2c, 0x41, 0x3f, 0xf8, 0x22, 0x18, 0xb6, 0x61, 0x40, - 0xb0, 0x65, 0xc0, 0xb2, 0x05, 0x1b, 0x36, 0x0c, 0xc3, 0xb0, 0x21, 0xc8, 0x58, 0x19, 0xf0, 0x83, - 0xdf, 0xf5, 0x62, 0x43, 0x0f, 0xb2, 0x5f, 0x8c, 0x85, 0x00, 0xc1, 0x82, 0x9e, 0xf5, 0x13, 0x8c, - 0x38, 0x27, 0x22, 0x32, 0xb2, 0x2a, 0x6b, 0x66, 0xc8, 0x5d, 0xef, 0xcb, 0x4c, 0xe7, 0x89, 0x13, - 0xf7, 0x13, 0x27, 0xce, 0x35, 0x0a, 0xaa, 0xe1, 0xa8, 0xf7, 0x60, 0x14, 0x06, 0x71, 0xc0, 0x4a, - 0x03, 0x3f, 0x1c, 0xf5, 0x3a, 0xaf, 0x9c, 0x06, 0xc1, 0xe9, 0x80, 0x3f, 0x74, 0x47, 0xde, 0x43, - 0xd7, 0xf7, 0x83, 0xd8, 0x8d, 0xbd, 0xc0, 0x8f, 0x08, 0xc9, 0xfa, 0x09, 0x34, 0x3f, 0xe5, 0x7e, - 0x97, 0xf3, 0xbe, 0xcd, 0xbf, 0x1c, 0xf3, 0x28, 0x66, 0x6f, 0xc3, 0x82, 0xcb, 0x7f, 0xca, 0x79, - 0xdf, 0x19, 0xb9, 0x51, 0x34, 0x3a, 0x0b, 0xdd, 0x88, 0xb7, 0x73, 0x77, 0x72, 0xf7, 0xea, 0x76, - 0x8b, 0x0a, 0x0e, 0x35, 0x9c, 0xbd, 0x06, 0xf5, 0x48, 0xa0, 0x72, 0x3f, 0x0e, 0x83, 0xd1, 0x55, - 0x3b, 0x8f, 0x78, 0x35, 0x01, 0xdb, 0x24, 0x90, 0x35, 0x80, 0x79, 0xdd, 0x43, 0x34, 0x0a, 0xfc, - 0x88, 0xb3, 0x47, 0xb0, 0xd4, 0xf3, 0x46, 0x67, 0x3c, 0x74, 0xb0, 0xf2, 0xd0, 0xe7, 0xc3, 0xc0, - 0xf7, 0x7a, 0xed, 0xdc, 0x9d, 0xc2, 0xbd, 0xaa, 0xcd, 0xa8, 0x4c, 0xd4, 0xd8, 0x93, 0x25, 0xec, - 0x2e, 0xcc, 0x73, 0x9f, 0xe0, 0xbc, 0x8f, 0xb5, 0x64, 0x57, 0xcd, 0x04, 0x2c, 0x2a, 0x58, 0x7f, - 0x3f, 0x0f, 0x0b, 0x3b, 0xbe, 0x17, 0x7f, 0xee, 0x0e, 0x06, 0x3c, 0x56, 0x73, 0xba, 0x0b, 0xf3, - 0x17, 0x08, 0xc0, 0x39, 0x5d, 0x04, 0x61, 0x5f, 0xce, 0xa8, 0x49, 0xe0, 0x43, 0x09, 0x9d, 0x39, - 0xb2, 0xfc, 0xcc, 0x91, 0x65, 0x2e, 0x57, 0x61, 0xc6, 0x72, 0xdd, 0x85, 0xf9, 0x90, 0xf7, 0x82, - 0x73, 0x1e, 0x5e, 0x39, 0x17, 0x9e, 0xdf, 0x0f, 0x2e, 0xda, 0xc5, 0x3b, 0xb9, 0x7b, 0x25, 0xbb, - 0xa9, 0xc0, 0x9f, 0x23, 0x94, 0xad, 0xc1, 0x7c, 0xef, 0xcc, 0xf5, 0x7d, 0x3e, 0x70, 0x8e, 0xdd, - 0xde, 0xb3, 0xf1, 0x28, 0x6a, 0x97, 0xee, 0xe4, 0xee, 0xd5, 0x1e, 0xdf, 0x78, 0x80, 0xbb, 0xfa, - 0x60, 0xfd, 0xcc, 0xf5, 0xd7, 0xb0, 0xa4, 0xeb, 0xbb, 0xa3, 0xe8, 0x2c, 0x88, 0xed, 0xa6, 0xac, - 0x41, 0xe0, 0xc8, 0x5a, 0x02, 0x66, 0xae, 0x04, 0xad, 0xbd, 0xf5, 0x1f, 0x73, 0xb0, 0xf8, 0xd4, - 0x1f, 0x04, 0xbd, 0x67, 0xdf, 0x72, 0x89, 0x32, 0xe6, 0x90, 0x7f, 0xd9, 0x39, 0x14, 0xbe, 0xe9, - 0x1c, 0x96, 0x61, 0x29, 0x3d, 0x58, 0x39, 0x0b, 0x0e, 0xd7, 0x45, 0xed, 0x53, 0xae, 0x86, 0xa5, - 0xa6, 0xf1, 0x16, 0xb4, 0x7a, 0xe3, 0x30, 0xe4, 0xfe, 0xd4, 0x3c, 0xe6, 0x25, 0x5c, 0x4f, 0xe4, - 0x35, 0xa8, 0xfb, 0xfc, 0x22, 0x41, 0x93, 0xb4, 0xeb, 0xf3, 0x0b, 0x85, 0x62, 0xb5, 0x61, 0x79, - 0xb2, 0x1b, 0x39, 0x80, 0xbf, 0xca, 0x41, 0xf1, 0x69, 0x7c, 0x19, 0xb0, 0x0f, 0xa0, 0xee, 0xf6, - 0xfb, 0x21, 0x8f, 0x22, 0x27, 0xbe, 0x1a, 0xd1, 0x49, 0x69, 0x3e, 0x66, 0x72, 0x8a, 0xab, 0x54, - 0x74, 0x74, 0x35, 0xe2, 0x76, 0xcd, 0x4d, 0x3e, 0x58, 0x1b, 0xca, 0xf2, 0x13, 0xfb, 0xad, 0xda, - 0xea, 0x93, 0xdd, 0x02, 0x70, 0x87, 0xc1, 0xd8, 0x8f, 0x9d, 0xc8, 0x8d, 0x71, 0xc5, 0x0a, 0x76, - 0x95, 0x20, 0x5d, 0x37, 0x66, 0x37, 0xa1, 0x3a, 0x7a, 0xe6, 0x44, 0xbd, 0xd0, 0x1b, 0xc5, 0x48, - 0x3c, 0x55, 0xbb, 0x32, 0x7a, 0xd6, 0xc5, 0x6f, 0xf6, 0x36, 0x54, 0x82, 0x71, 0x3c, 0x0a, 0x3c, - 0x3f, 0x96, 0xf4, 0x32, 0x2f, 0x07, 0x72, 0x30, 0x8e, 0x0f, 0x05, 0xd8, 0xd6, 0x08, 0xec, 0x0d, - 0x68, 0xf4, 0x02, 0xff, 0xc4, 0x0b, 0x87, 0xc4, 0x11, 0xda, 0x73, 0xd8, 0x57, 0x1a, 0x68, 0xfd, - 0x51, 0x1e, 0x6a, 0x47, 0xa1, 0xeb, 0x47, 0x6e, 0x4f, 0x00, 0xd8, 0x0a, 0x94, 0xe3, 0x4b, 0xe7, - 0xcc, 0x8d, 0xce, 0x70, 0xaa, 0x55, 0x7b, 0x2e, 0xbe, 0xdc, 0x76, 0xa3, 0x33, 0xb6, 0x0c, 0x73, - 0x34, 0x4a, 0x9c, 0x50, 0xc1, 0x96, 0x5f, 0xe2, 0x80, 0xf8, 0xe3, 0xa1, 0x93, 0xee, 0xaa, 0x80, - 0x14, 0xd3, 0xf2, 0xc7, 0xc3, 0x75, 0x13, 0x2e, 0x26, 0x7f, 0x2c, 0xb6, 0x9b, 0x3a, 0xa0, 0xe9, - 0x55, 0x11, 0x82, 0x7d, 0xbc, 0x06, 0x75, 0x59, 0xcc, 0xbd, 0xd3, 0x33, 0x9a, 0x63, 0xc9, 0xae, - 0x11, 0x02, 0x82, 0x44, 0x0b, 0xb1, 0x37, 0xe4, 0x4e, 0x14, 0xbb, 0xc3, 0x91, 0x9c, 0x52, 0x55, - 0x40, 0xba, 0x02, 0x80, 0xc5, 0x41, 0xec, 0x0e, 0x9c, 0x13, 0xce, 0xa3, 0x76, 0x59, 0x16, 0x0b, - 0xc8, 0x16, 0xe7, 0x11, 0xfb, 0x0e, 0x34, 0xfb, 0x3c, 0x8a, 0x1d, 0xb9, 0x19, 0x3c, 0x6a, 0x57, - 0xf0, 0xe4, 0x37, 0x04, 0x74, 0x55, 0x01, 0xd9, 0x2b, 0x00, 0xa1, 0x7b, 0xe1, 0x88, 0x85, 0xe0, - 0x97, 0xed, 0x2a, 0xed, 0x42, 0xe8, 0x5e, 0x1c, 0x5d, 0x6e, 0xf3, 0x4b, 0x41, 0x35, 0x9f, 0xf2, - 0xd8, 0x58, 0xb4, 0x48, 0x52, 0xa7, 0xb5, 0x0b, 0xcc, 0x00, 0x6f, 0xf0, 0xd8, 0xf5, 0x06, 0x11, - 0xfb, 0x1e, 0xd4, 0x63, 0x03, 0x19, 0xd9, 0x60, 0x4d, 0x93, 0x90, 0x51, 0xc1, 0x4e, 0xe1, 0x59, - 0x67, 0x50, 0xd9, 0xe2, 0x7c, 0xd7, 0x1b, 0x7a, 0x31, 0x5b, 0x86, 0xd2, 0x89, 0x77, 0xc9, 0x89, - 0xd8, 0x0b, 0xdb, 0xd7, 0x6c, 0xfa, 0x64, 0xb7, 0x01, 0xf0, 0x0f, 0x67, 0xa8, 0xa9, 0x69, 0xfb, - 0x9a, 0x5d, 0x45, 0xd8, 0x5e, 0xe4, 0xc6, 0xac, 0x03, 0xe5, 0x11, 0x0f, 0x7b, 0x5c, 0xed, 0xdb, - 0xf6, 0x35, 0x5b, 0x01, 0xd6, 0xca, 0x50, 0x1a, 0x88, 0xd6, 0xad, 0x3f, 0x29, 0x41, 0xad, 0xcb, - 0x7d, 0x7d, 0xca, 0x18, 0x14, 0xc5, 0x82, 0xc8, 0x93, 0x85, 0x7f, 0xb3, 0xd7, 0xa1, 0x86, 0x4b, - 0x17, 0xc5, 0xa1, 0xe7, 0x9f, 0x12, 0x55, 0xaf, 0xe5, 0xdb, 0x39, 0x1b, 0x04, 0xb8, 0x8b, 0x50, - 0xd6, 0x82, 0x82, 0x3b, 0x54, 0x54, 0x2d, 0xfe, 0x64, 0x37, 0xa0, 0xe2, 0x0e, 0x63, 0x1a, 0x5e, - 0x1d, 0xc1, 0x65, 0x77, 0x18, 0xe3, 0xd0, 0x5e, 0x83, 0xfa, 0xc8, 0xbd, 0x1a, 0x8a, 0xb3, 0xac, - 0xc9, 0xa1, 0x6e, 0xd7, 0x24, 0x0c, 0x09, 0xe2, 0x31, 0x2c, 0x9a, 0x28, 0xaa, 0xf3, 0x92, 0xee, - 0x7c, 0xc1, 0xc0, 0x96, 0x63, 0xb8, 0x0b, 0xf3, 0xaa, 0x4e, 0x48, 0xf3, 0x41, 0x32, 0xa9, 0xda, - 0x4d, 0x09, 0x56, 0xb3, 0xbc, 0x07, 0xad, 0x13, 0xcf, 0x77, 0x07, 0x4e, 0x6f, 0x10, 0x9f, 0x3b, - 0x7d, 0x3e, 0x88, 0x5d, 0xa4, 0x98, 0x92, 0xdd, 0x44, 0xf8, 0xfa, 0x20, 0x3e, 0xdf, 0x10, 0x50, - 0xf6, 0x0e, 0x54, 0x4f, 0x38, 0x77, 0x70, 0xb1, 0xda, 0x95, 0xd4, 0xc1, 0x53, 0x3b, 0x64, 0x57, - 0x4e, 0xd4, 0x5e, 0xbd, 0x03, 0xad, 0x60, 0x1c, 0x9f, 0x06, 0x9e, 0x7f, 0xea, 0x08, 0x7e, 0xe7, - 0x78, 0x7d, 0xa4, 0xa1, 0xe2, 0x5a, 0xfe, 0x51, 0xce, 0x6e, 0xaa, 0x32, 0xc1, 0x79, 0x76, 0xfa, - 0xec, 0x4d, 0x98, 0x1f, 0xb8, 0x51, 0xec, 0x9c, 0x05, 0x23, 0x67, 0x34, 0x3e, 0x7e, 0xc6, 0xaf, - 0xda, 0x0d, 0x5c, 0x88, 0x86, 0x00, 0x6f, 0x07, 0xa3, 0x43, 0x04, 0x0a, 0xca, 0xc6, 0x71, 0xd2, - 0x20, 0xe0, 0x4e, 0xee, 0x5e, 0xc3, 0xae, 0x0a, 0x08, 0x75, 0xfa, 0x05, 0x2c, 0xe2, 0xf6, 0xf4, - 0xc6, 0x51, 0x1c, 0x0c, 0x1d, 0xc1, 0xab, 0xc3, 0x7e, 0xd4, 0xae, 0x21, 0xad, 0xbd, 0x25, 0x07, - 0x6b, 0xec, 0xf1, 0x83, 0x0d, 0x1e, 0xc5, 0xeb, 0x88, 0x6c, 0x13, 0xae, 0xb8, 0xd0, 0xaf, 0xec, - 0x85, 0xfe, 0x24, 0x9c, 0xbd, 0x03, 0xcc, 0x1d, 0x0c, 0x82, 0x0b, 0x27, 0xe2, 0x83, 0x13, 0x47, - 0x2e, 0x62, 0xbb, 0x79, 0x27, 0x77, 0xaf, 0x62, 0xb7, 0xb0, 0xa4, 0xcb, 0x07, 0x27, 0x87, 0x04, - 0x67, 0xdf, 0x03, 0x3c, 0x4c, 0xce, 0x09, 0x77, 0xe3, 0x71, 0xc8, 0xa3, 0xf6, 0xfc, 0x9d, 0xc2, - 0xbd, 0xe6, 0xe3, 0x05, 0xbd, 0x5e, 0x08, 0x5e, 0xf3, 0x62, 0xbb, 0x2e, 0xf0, 0xe4, 0x77, 0xd4, - 0xd9, 0x80, 0xe5, 0xec, 0x21, 0x09, 0xa2, 0x12, 0xab, 0x22, 0x88, 0xb1, 0x68, 0x8b, 0x3f, 0xd9, - 0x12, 0x94, 0xce, 0xdd, 0xc1, 0x98, 0x4b, 0x9e, 0x4e, 0x1f, 0x1f, 0xe7, 0x3f, 0xca, 0x59, 0x7f, - 0x9c, 0x83, 0x3a, 0xcd, 0x52, 0xca, 0x22, 0xaf, 0x43, 0x43, 0x51, 0x03, 0x0f, 0xc3, 0x20, 0x94, - 0x5c, 0x4d, 0x51, 0xde, 0xa6, 0x80, 0x89, 0x5b, 0x45, 0x21, 0x8d, 0x42, 0xee, 0x0d, 0xdd, 0x53, - 0xd5, 0xb4, 0x22, 0xa5, 0x43, 0x09, 0x66, 0xef, 0x25, 0xed, 0x85, 0xc1, 0x38, 0xe6, 0xf2, 0xce, - 0xab, 0xcb, 0xe9, 0xd9, 0x02, 0xa6, 0x5b, 0xc7, 0xaf, 0x97, 0xa0, 0x73, 0xeb, 0xf7, 0x72, 0xc0, - 0xc4, 0xb0, 0x8f, 0x02, 0x6a, 0x40, 0x52, 0xe8, 0x64, 0xcd, 0xdc, 0x4b, 0x9f, 0x90, 0xfc, 0xf3, - 0x4e, 0x88, 0x05, 0x25, 0x1a, 0x7b, 0x31, 0x63, 0xec, 0x54, 0xf4, 0x83, 0x62, 0xa5, 0xd0, 0x2a, - 0x5a, 0xff, 0xbb, 0x00, 0x4b, 0xeb, 0x74, 0x65, 0xaf, 0xf6, 0x7a, 0x7c, 0xa4, 0xcf, 0xce, 0x6d, - 0xa8, 0xf9, 0x41, 0x9f, 0x2b, 0x8a, 0xa5, 0x81, 0x81, 0x00, 0x19, 0xe4, 0x7a, 0xe6, 0x7a, 0x3e, - 0x0d, 0x9c, 0x16, 0xb3, 0x8a, 0x10, 0x1c, 0xf6, 0x9b, 0x30, 0x3f, 0xe2, 0x7e, 0xdf, 0x3c, 0x22, - 0x24, 0x54, 0x35, 0x24, 0x58, 0x9e, 0x8e, 0xdb, 0x50, 0x3b, 0x19, 0x13, 0x9e, 0x60, 0x2c, 0x45, - 0xa4, 0x01, 0x90, 0xa0, 0x55, 0xe2, 0x2f, 0xa3, 0x71, 0x74, 0x86, 0xa5, 0x25, 0x2c, 0x2d, 0x8b, - 0x6f, 0x51, 0x74, 0x0b, 0xa0, 0x3f, 0x8e, 0x62, 0x79, 0x62, 0xe6, 0xb0, 0xb0, 0x2a, 0x20, 0x74, - 0x62, 0xde, 0x85, 0xc5, 0xa1, 0x7b, 0xe9, 0x20, 0xed, 0x38, 0x9e, 0xef, 0x9c, 0x0c, 0xf0, 0xce, - 0x29, 0x23, 0x5e, 0x6b, 0xe8, 0x5e, 0xfe, 0x50, 0x94, 0xec, 0xf8, 0x5b, 0x08, 0x17, 0x6c, 0x45, - 0x89, 0x3b, 0x21, 0x8f, 0x78, 0x78, 0xce, 0x91, 0x13, 0x14, 0xb5, 0x4c, 0x63, 0x13, 0x54, 0x8c, - 0x68, 0x28, 0xe6, 0x1d, 0x0f, 0x7a, 0x74, 0xec, 0xed, 0xf2, 0xd0, 0xf3, 0xb7, 0xe3, 0x41, 0x4f, - 0xdc, 0x2b, 0x82, 0x8f, 0x8c, 0x78, 0xe8, 0x3c, 0xbb, 0xc0, 0x33, 0x5c, 0x44, 0xbe, 0x71, 0xc8, - 0xc3, 0x27, 0x17, 0xe2, 0xea, 0xef, 0x45, 0xc8, 0x88, 0xdc, 0xab, 0x76, 0x0d, 0x0f, 0x78, 0xa5, - 0x17, 0x09, 0x16, 0xe4, 0x5e, 0x89, 0x43, 0x28, 0x46, 0xeb, 0xe2, 0x2e, 0xf0, 0x3e, 0x36, 0x1f, - 0x21, 0x47, 0x6d, 0xe0, 0x60, 0x57, 0x65, 0x81, 0xe8, 0x27, 0x12, 0x54, 0xaf, 0x06, 0x7b, 0x32, - 0x70, 0x4f, 0x23, 0x64, 0x29, 0x0d, 0xbb, 0x2e, 0x81, 0x5b, 0x02, 0x66, 0x7d, 0x4e, 0x42, 0x96, - 0xb1, 0xb7, 0xf2, 0xcc, 0x88, 0xab, 0x1e, 0x21, 0xb8, 0xaf, 0x15, 0x5b, 0x7e, 0x65, 0x6d, 0x5a, - 0x3e, 0x63, 0xd3, 0xac, 0x3f, 0xc8, 0x41, 0x5d, 0xb6, 0x8c, 0x42, 0x09, 0x7b, 0x00, 0x4c, 0xed, - 0x62, 0x7c, 0xe9, 0xf5, 0x9d, 0xe3, 0xab, 0x98, 0x47, 0x44, 0x34, 0xdb, 0xd7, 0xec, 0x96, 0x2c, - 0x3b, 0xba, 0xf4, 0xfa, 0x6b, 0xa2, 0x84, 0xdd, 0x87, 0x56, 0x0a, 0x3f, 0x8a, 0x43, 0xa2, 0xe8, - 0xed, 0x6b, 0x76, 0xd3, 0xc0, 0xee, 0xc6, 0xa1, 0x38, 0x23, 0x42, 0xe4, 0x19, 0xc7, 0x8e, 0xe7, - 0xf7, 0xf9, 0x25, 0x92, 0x51, 0xc3, 0xae, 0x11, 0x6c, 0x47, 0x80, 0xd6, 0x9a, 0x50, 0x37, 0x9b, - 0xb3, 0x4e, 0xa1, 0xa2, 0xe4, 0x25, 0x14, 0x18, 0x26, 0x86, 0x64, 0x57, 0x63, 0x3d, 0x92, 0x1b, - 0x50, 0x49, 0x8f, 0xc0, 0x2e, 0xc7, 0x2f, 0xdd, 0xb1, 0xf5, 0x7d, 0x68, 0xed, 0x0a, 0xe2, 0xf1, - 0x05, 0xb1, 0x4a, 0xf9, 0x6f, 0x19, 0xe6, 0x8c, 0x43, 0x53, 0xb5, 0xe5, 0x97, 0xb8, 0x73, 0xcf, - 0x82, 0x28, 0x96, 0xbd, 0xe0, 0xdf, 0xd6, 0x9f, 0xe4, 0x80, 0x6d, 0x46, 0xb1, 0x37, 0x74, 0x63, - 0xbe, 0xc5, 0x35, 0x5b, 0x38, 0x80, 0xba, 0x68, 0xed, 0x28, 0x58, 0x25, 0x81, 0x8c, 0x04, 0x8a, - 0xb7, 0xe5, 0x31, 0x9e, 0xae, 0xf0, 0xc0, 0xc4, 0x26, 0x36, 0x9f, 0x6a, 0x40, 0x9c, 0xb2, 0xd8, - 0x0d, 0x4f, 0x79, 0x8c, 0x62, 0x9c, 0x94, 0xf7, 0x81, 0x40, 0x42, 0x80, 0xeb, 0xfc, 0x3a, 0x2c, - 0x4c, 0xb5, 0x61, 0xf2, 0xe5, 0x6a, 0x06, 0x5f, 0x2e, 0x98, 0x7c, 0xd9, 0x81, 0xc5, 0xd4, 0xb8, - 0x24, 0xa5, 0xad, 0x40, 0x59, 0x1c, 0x08, 0x21, 0x1c, 0xe4, 0x48, 0xaa, 0x3c, 0xe1, 0x5c, 0x88, - 0xc1, 0x0f, 0x61, 0xe9, 0x84, 0xf3, 0xd0, 0x8d, 0xb1, 0x10, 0x4f, 0x8c, 0xd8, 0x21, 0xd9, 0xf0, - 0x82, 0x2c, 0xeb, 0xba, 0xf1, 0x21, 0x0f, 0xc5, 0x4e, 0x59, 0xff, 0x27, 0x07, 0xf3, 0x82, 0x83, - 0xee, 0xb9, 0xfe, 0x95, 0x5a, 0xa7, 0xdd, 0xcc, 0x75, 0xba, 0x67, 0x5c, 0x86, 0x06, 0xf6, 0x37, - 0x5d, 0xa4, 0xc2, 0xe4, 0x22, 0xb1, 0x3b, 0x50, 0x4f, 0x8d, 0xb5, 0x84, 0x63, 0x85, 0x48, 0x0f, - 0xf2, 0x17, 0x5f, 0xc6, 0x37, 0xa1, 0x95, 0x0c, 0x5b, 0xae, 0x21, 0x83, 0xa2, 0x20, 0x49, 0xd9, - 0x00, 0xfe, 0x6d, 0xfd, 0xcb, 0x1c, 0x21, 0xae, 0x07, 0x9e, 0x96, 0x4e, 0x05, 0xa2, 0x90, 0x7b, - 0x15, 0xa2, 0xf8, 0x7b, 0xa6, 0x54, 0xff, 0x8b, 0x4f, 0x56, 0x1c, 0x9d, 0x88, 0xfb, 0x7d, 0xc7, - 0x1d, 0x0c, 0x90, 0xf9, 0x56, 0xec, 0xb2, 0xf8, 0x5e, 0x1d, 0x0c, 0xac, 0xbb, 0xb0, 0x60, 0x8c, - 0xee, 0x39, 0xf3, 0xd8, 0x07, 0xb6, 0xeb, 0x45, 0xf1, 0x53, 0x3f, 0x1a, 0x19, 0x82, 0xdb, 0x4d, - 0xa8, 0x0a, 0x0e, 0x2b, 0x46, 0x46, 0x47, 0xb6, 0x64, 0x0b, 0x96, 0x2b, 0xc6, 0x15, 0x61, 0xa1, - 0x7b, 0x29, 0x0b, 0xf3, 0xb2, 0xd0, 0xbd, 0xc4, 0x42, 0xeb, 0x23, 0x58, 0x4c, 0xb5, 0x27, 0xbb, - 0x7e, 0x0d, 0x4a, 0xe3, 0xf8, 0x32, 0x50, 0xa2, 0x79, 0x4d, 0x52, 0x88, 0x50, 0x00, 0x6d, 0x2a, - 0xb1, 0x3e, 0x81, 0x85, 0x7d, 0x7e, 0x21, 0x0f, 0xb1, 0x1a, 0xc8, 0x9b, 0x50, 0x7c, 0x81, 0x52, - 0x88, 0xe5, 0xd6, 0x03, 0x60, 0x66, 0x65, 0xd9, 0xab, 0xa1, 0x23, 0xe6, 0x52, 0x3a, 0xa2, 0xf5, - 0x26, 0xb0, 0xae, 0x77, 0xea, 0xef, 0xf1, 0x28, 0x72, 0x4f, 0xf5, 0xb1, 0x6f, 0x41, 0x61, 0x18, - 0x9d, 0x4a, 0x1e, 0x25, 0xfe, 0xb4, 0xbe, 0x0b, 0x8b, 0x29, 0x3c, 0xd9, 0xf0, 0x2b, 0x50, 0x8d, - 0xbc, 0x53, 0x1f, 0x05, 0x2b, 0xd9, 0x74, 0x02, 0xb0, 0xb6, 0x60, 0xe9, 0x87, 0x3c, 0xf4, 0x4e, - 0xae, 0x5e, 0xd4, 0x7c, 0xba, 0x9d, 0xfc, 0x64, 0x3b, 0x9b, 0x70, 0x7d, 0xa2, 0x1d, 0xd9, 0x3d, - 0x91, 0xaf, 0xdc, 0xc9, 0x8a, 0x4d, 0x1f, 0x06, 0xdf, 0xcb, 0x9b, 0x7c, 0xcf, 0x7a, 0x0a, 0x6c, - 0x3d, 0xf0, 0x7d, 0xde, 0x8b, 0x0f, 0x39, 0x0f, 0x13, 0x2b, 0x55, 0x42, 0xab, 0xb5, 0xc7, 0x2b, - 0x72, 0x65, 0x27, 0x99, 0xa9, 0x24, 0x62, 0x06, 0xc5, 0x11, 0x0f, 0x87, 0xd8, 0x70, 0xc5, 0xc6, - 0xbf, 0xad, 0xeb, 0xb0, 0x98, 0x6a, 0x56, 0xea, 0xf5, 0x8f, 0xe0, 0xfa, 0x86, 0x17, 0xf5, 0xa6, - 0x3b, 0x5c, 0x81, 0xf2, 0x68, 0x7c, 0xec, 0xa4, 0xf9, 0xf2, 0x13, 0x7e, 0x25, 0xb4, 0xbd, 0xc9, - 0x1a, 0xb2, 0xad, 0xbf, 0x9b, 0x83, 0xe2, 0xf6, 0xd1, 0xee, 0x3a, 0xeb, 0x40, 0xc5, 0xf3, 0x7b, - 0xc1, 0x50, 0x08, 0x5e, 0x34, 0x67, 0xfd, 0x3d, 0xf3, 0x80, 0xdd, 0x84, 0x2a, 0xca, 0x6b, 0x42, - 0xb5, 0x95, 0xa2, 0x4f, 0x45, 0x00, 0x76, 0x83, 0xde, 0x33, 0xa1, 0x53, 0xf3, 0xcb, 0x91, 0x17, - 0xa2, 0xd6, 0xac, 0x94, 0xe1, 0x22, 0xdd, 0xf5, 0x49, 0x01, 0x69, 0xc4, 0xd6, 0x7f, 0x2a, 0x43, - 0x59, 0xde, 0xb6, 0x74, 0x73, 0xc7, 0xde, 0x39, 0x4f, 0x6e, 0x6e, 0xf1, 0x25, 0xe4, 0x81, 0x90, - 0x0f, 0x83, 0x58, 0x0b, 0x6c, 0xb4, 0x07, 0x75, 0x02, 0x4a, 0x91, 0xcd, 0x10, 0x1a, 0xc8, 0xc4, - 0x50, 0x20, 0xa4, 0x9e, 0x79, 0x95, 0xdf, 0x84, 0xb2, 0xba, 0xfb, 0x8b, 0x5a, 0xa7, 0x99, 0xeb, - 0x91, 0xb4, 0xd6, 0x81, 0x4a, 0xcf, 0x1d, 0xb9, 0x3d, 0x2f, 0xbe, 0x92, 0x0c, 0x41, 0x7f, 0x8b, - 0xd6, 0x07, 0x41, 0xcf, 0x1d, 0x38, 0xc7, 0xee, 0xc0, 0xf5, 0x7b, 0x5c, 0xea, 0xee, 0x75, 0x04, - 0xae, 0x11, 0x4c, 0xe8, 0xe7, 0x72, 0x9c, 0x0a, 0x8b, 0x54, 0x78, 0x39, 0x7a, 0x85, 0x26, 0x84, - 0xcb, 0x60, 0x38, 0xf4, 0x84, 0x96, 0x41, 0x62, 0x58, 0xc1, 0xae, 0x12, 0x64, 0x8b, 0xe3, 0x6c, - 0x65, 0xf1, 0x05, 0x2d, 0x5d, 0x95, 0xba, 0x22, 0xe0, 0xe7, 0x64, 0x48, 0x98, 0x96, 0xc5, 0x0a, - 0x86, 0x2c, 0xf6, 0x36, 0x2c, 0x8c, 0xfd, 0x88, 0xc7, 0xf1, 0x80, 0xf7, 0xf5, 0x58, 0x6a, 0x88, - 0xd4, 0xd2, 0x05, 0x6a, 0x38, 0x0f, 0x60, 0x91, 0x8c, 0x0e, 0x91, 0x1b, 0x07, 0xd1, 0x99, 0x17, - 0x39, 0x91, 0xd0, 0x90, 0x48, 0xdd, 0x5d, 0xc0, 0xa2, 0xae, 0x2c, 0xe9, 0x92, 0x8a, 0xb4, 0x32, - 0x81, 0x1f, 0xf2, 0x1e, 0xf7, 0xce, 0x79, 0x1f, 0xe5, 0xb4, 0x82, 0x7d, 0x3d, 0x55, 0xc7, 0x96, - 0x85, 0x28, 0x74, 0x8f, 0x87, 0xce, 0x78, 0xd4, 0x77, 0x85, 0xb0, 0xd2, 0x24, 0x61, 0xd8, 0x1f, - 0x0f, 0x9f, 0x12, 0x84, 0x3d, 0x02, 0x25, 0x89, 0x49, 0xf9, 0x70, 0x3e, 0xc5, 0xcf, 0x04, 0xb1, - 0xda, 0x75, 0x89, 0x41, 0x82, 0x62, 0x4a, 0xe6, 0x6c, 0x4d, 0xc8, 0x9c, 0x6d, 0x28, 0x8f, 0x42, - 0xef, 0xdc, 0x8d, 0x79, 0x7b, 0x81, 0x18, 0xb8, 0xfc, 0x14, 0x9c, 0xc1, 0xf3, 0xbd, 0xd8, 0x73, - 0xe3, 0x20, 0x6c, 0x33, 0x2c, 0x4b, 0x00, 0xec, 0x3e, 0x2c, 0x20, 0x8d, 0x44, 0xb1, 0x1b, 0x8f, - 0x23, 0x29, 0x81, 0x2e, 0x22, 0x31, 0xa1, 0x0c, 0xdd, 0x45, 0x38, 0x0a, 0xa1, 0xec, 0xbb, 0xb0, - 0x4c, 0x64, 0x81, 0x35, 0xa4, 0x64, 0x8d, 0x02, 0xc1, 0x12, 0x2e, 0xc5, 0x22, 0x96, 0x0a, 0xfa, - 0x96, 0xf2, 0xb5, 0x90, 0x0e, 0x3e, 0x80, 0x15, 0x49, 0x26, 0x53, 0xb5, 0xae, 0x63, 0xad, 0x25, - 0x2a, 0x9e, 0xa8, 0x76, 0x1f, 0x16, 0xc4, 0x90, 0xbc, 0x9e, 0x23, 0x6b, 0x8b, 0x93, 0xb0, 0x8c, - 0xa3, 0x9f, 0xa7, 0x02, 0x1b, 0xe1, 0x4f, 0xf8, 0x95, 0x20, 0xe5, 0x81, 0x77, 0xc2, 0x63, 0x6f, - 0xc8, 0xdb, 0x2b, 0x44, 0x1c, 0xea, 0x5b, 0x9c, 0xb2, 0xf1, 0x08, 0x4b, 0xda, 0x74, 0xa6, 0xe9, - 0x0b, 0xe9, 0x6e, 0x10, 0x44, 0x5c, 0x99, 0x97, 0xda, 0x37, 0xe4, 0x01, 0x12, 0x40, 0xc9, 0xb2, - 0xac, 0x9f, 0xe5, 0xe8, 0x0e, 0x92, 0x47, 0x36, 0x32, 0x34, 0x2a, 0x3a, 0xac, 0x4e, 0xe0, 0x0f, - 0xae, 0xe4, 0xf9, 0x05, 0x02, 0x1d, 0xf8, 0x03, 0x3c, 0x40, 0x9e, 0x6f, 0xa2, 0x10, 0xbb, 0xab, - 0x2b, 0x20, 0x22, 0xdd, 0x86, 0xda, 0x68, 0x7c, 0x3c, 0xf0, 0x7a, 0x84, 0x52, 0xa0, 0x56, 0x08, - 0x84, 0x08, 0x42, 0xa5, 0xa4, 0x4d, 0x24, 0x8c, 0x22, 0x62, 0xd4, 0x24, 0x0c, 0x51, 0x90, 0x9d, - 0xf2, 0x10, 0x4f, 0x70, 0xdd, 0xc6, 0xbf, 0xad, 0x35, 0x58, 0x4a, 0x0f, 0x5a, 0xf2, 0xfa, 0xfb, - 0x50, 0x91, 0xec, 0x41, 0xd9, 0x1a, 0x9a, 0x86, 0xf5, 0x57, 0x68, 0x45, 0xba, 0xdc, 0xfa, 0x9d, - 0x39, 0x58, 0x94, 0xd0, 0x75, 0xb1, 0x22, 0xdd, 0xf1, 0x70, 0xe8, 0x86, 0x19, 0x7c, 0x27, 0xf7, - 0x7c, 0xbe, 0x93, 0x9f, 0xe2, 0x3b, 0x69, 0x65, 0x93, 0xd8, 0x56, 0x5a, 0xd9, 0x14, 0x5b, 0x40, - 0xf2, 0xbf, 0x69, 0x7a, 0x6c, 0x48, 0xf0, 0x11, 0x99, 0x38, 0xa7, 0xb8, 0x64, 0x29, 0x83, 0x4b, - 0x9a, 0x3c, 0x6e, 0x6e, 0x82, 0xc7, 0xbd, 0x06, 0xb4, 0xd7, 0x8a, 0x65, 0x97, 0x49, 0x25, 0x40, - 0x98, 0xb4, 0x5f, 0xde, 0x85, 0xf9, 0x49, 0xb6, 0x42, 0xfc, 0xab, 0x99, 0xc1, 0x54, 0xbc, 0x21, - 0xc7, 0x0b, 0xc2, 0x40, 0xae, 0x4a, 0xa6, 0xe2, 0x0d, 0xf9, 0x2e, 0x96, 0x28, 0xfc, 0x4d, 0x00, - 0xea, 0x1b, 0x25, 0x12, 0x40, 0x89, 0xe4, 0xcd, 0xf4, 0x5e, 0x98, 0xab, 0xfe, 0x40, 0x7c, 0x8c, - 0x43, 0x8e, 0x52, 0x4a, 0x15, 0x6b, 0xa2, 0xe1, 0xfa, 0x09, 0x34, 0x83, 0x11, 0xf7, 0x9d, 0xe4, - 0x78, 0xd7, 0xb0, 0xa9, 0x37, 0x9e, 0xd3, 0xd4, 0x8e, 0xc2, 0xb5, 0x1b, 0xa2, 0xae, 0xfe, 0x64, - 0x7b, 0xb4, 0xf0, 0xdc, 0x68, 0xad, 0xfe, 0x0d, 0x5a, 0x6b, 0x62, 0x65, 0xfd, 0x6d, 0xfd, 0x83, - 0x1c, 0xd4, 0x8c, 0x61, 0xb3, 0xeb, 0xb0, 0xb0, 0x7e, 0x70, 0x70, 0xb8, 0x69, 0xaf, 0x1e, 0xed, - 0xfc, 0x70, 0xd3, 0x59, 0xdf, 0x3d, 0xe8, 0x6e, 0xb6, 0xae, 0x09, 0xf0, 0xee, 0xc1, 0xfa, 0xea, - 0xae, 0xb3, 0x75, 0x60, 0xaf, 0x2b, 0x70, 0x8e, 0x2d, 0x03, 0xb3, 0x37, 0xf7, 0x0e, 0x8e, 0x36, - 0x53, 0xf0, 0x3c, 0x6b, 0x41, 0x7d, 0xcd, 0xde, 0x5c, 0x5d, 0xdf, 0x96, 0x90, 0x02, 0x5b, 0x82, - 0xd6, 0xd6, 0xd3, 0xfd, 0x8d, 0x9d, 0xfd, 0x4f, 0x9d, 0xf5, 0xd5, 0xfd, 0xf5, 0xcd, 0xdd, 0xcd, - 0x8d, 0x56, 0x91, 0x35, 0xa0, 0xba, 0xba, 0xb6, 0xba, 0xbf, 0x71, 0xb0, 0xbf, 0xb9, 0xd1, 0x2a, - 0x59, 0xbf, 0x06, 0xd5, 0x64, 0xa2, 0x35, 0x28, 0x3f, 0xdd, 0x7f, 0xb2, 0x7f, 0xf0, 0xf9, 0x7e, - 0xeb, 0x1a, 0xab, 0x42, 0x09, 0xfb, 0x6f, 0xe5, 0x18, 0xc0, 0x1c, 0xf5, 0xd9, 0xca, 0xb3, 0x0a, - 0x14, 0xd7, 0x0e, 0x8e, 0xb6, 0x5b, 0x05, 0xeb, 0xcf, 0x73, 0x70, 0x1d, 0xa7, 0xdc, 0x9f, 0x64, - 0x02, 0x77, 0xa0, 0xd6, 0x0b, 0x82, 0x91, 0x50, 0x6e, 0x92, 0x4b, 0xdc, 0x04, 0x89, 0x03, 0x4e, - 0xfc, 0xf2, 0x24, 0x08, 0x7b, 0x5c, 0xf2, 0x00, 0x40, 0xd0, 0x96, 0x80, 0x08, 0x1a, 0x94, 0x44, - 0x4c, 0x18, 0xc4, 0x02, 0x6a, 0x04, 0x23, 0x94, 0x65, 0x98, 0x3b, 0x0e, 0xb9, 0xdb, 0x3b, 0x93, - 0xa7, 0x5f, 0x7e, 0xb1, 0xb7, 0x12, 0xb5, 0xbb, 0x27, 0x68, 0x6a, 0xc0, 0xfb, 0x78, 0x04, 0x2a, - 0xf6, 0xbc, 0x84, 0xaf, 0x4b, 0xb0, 0xb8, 0x00, 0xdc, 0x63, 0xd7, 0xef, 0x07, 0x3e, 0xef, 0x4b, - 0xe9, 0x3e, 0x01, 0x58, 0x87, 0xb0, 0x3c, 0x39, 0x3f, 0xc9, 0x2f, 0xbe, 0x67, 0xf0, 0x0b, 0x12, - 0xb6, 0x3b, 0xb3, 0x49, 0xc1, 0xe0, 0x1d, 0x3f, 0x2f, 0x40, 0x51, 0x08, 0x5f, 0x33, 0xe5, 0x34, - 0x53, 0x9a, 0x2e, 0x4c, 0x79, 0x5c, 0x50, 0xbb, 0xa7, 0x5b, 0x99, 0x4c, 0x48, 0x55, 0x84, 0xe0, - 0x6d, 0xac, 0x8b, 0x43, 0xde, 0x3b, 0x97, 0x36, 0x24, 0x2a, 0xb6, 0x79, 0xef, 0x1c, 0xd5, 0x18, - 0x37, 0xa6, 0xba, 0x74, 0xde, 0xcb, 0x91, 0x1b, 0x63, 0x4d, 0x59, 0x84, 0xf5, 0xca, 0xba, 0x08, - 0x6b, 0xb5, 0xa1, 0xec, 0xf9, 0xc7, 0xc1, 0xd8, 0xef, 0xe3, 0xf1, 0xae, 0xd8, 0xea, 0x13, 0x1d, - 0x3c, 0xc8, 0x89, 0xc4, 0xfd, 0x41, 0xa7, 0xb9, 0x22, 0x00, 0x47, 0xe2, 0x06, 0x79, 0x0f, 0xaa, - 0xd1, 0x95, 0xdf, 0x33, 0xcf, 0xf0, 0x92, 0x5c, 0x1f, 0x31, 0xfb, 0x07, 0xdd, 0x2b, 0xbf, 0x87, - 0x27, 0xb6, 0x12, 0xc9, 0xbf, 0xd8, 0x07, 0x50, 0xd1, 0xa6, 0x56, 0xe2, 0xc0, 0x37, 0xcc, 0x1a, - 0xca, 0xbe, 0x4a, 0x1a, 0xad, 0x46, 0xed, 0x3c, 0x81, 0x46, 0xaa, 0xc8, 0x54, 0x43, 0x1b, 0xa4, - 0x86, 0xbe, 0x61, 0xaa, 0xa1, 0x09, 0x63, 0x97, 0xd5, 0x4c, 0xb5, 0xf4, 0xd7, 0xa1, 0xa2, 0x46, - 0x26, 0x8e, 0x93, 0x3c, 0x0a, 0x4e, 0xf7, 0x8b, 0xfd, 0xf5, 0xd6, 0x35, 0x36, 0x0f, 0xb5, 0xd5, - 0x75, 0x3c, 0xa1, 0x08, 0xc8, 0x09, 0x94, 0xc3, 0xd5, 0x6e, 0x57, 0x43, 0xf2, 0x16, 0x83, 0x96, - 0xb8, 0x5e, 0xc4, 0x88, 0xb5, 0x33, 0xe5, 0x7b, 0xb0, 0x60, 0xc0, 0x12, 0x4d, 0x4d, 0xdc, 0x47, - 0x93, 0x9a, 0x1a, 0xca, 0xe5, 0x54, 0x62, 0xad, 0xc0, 0x75, 0xf1, 0xb9, 0x79, 0xce, 0xfd, 0xb8, - 0x3b, 0x3e, 0x26, 0x57, 0x9a, 0x17, 0xf8, 0x42, 0x5e, 0xaf, 0xea, 0x92, 0xd9, 0x84, 0xf4, 0x40, - 0x2a, 0x75, 0x79, 0x5c, 0xfe, 0x8e, 0xd1, 0x03, 0x56, 0x7c, 0x80, 0xff, 0xa6, 0x94, 0xbb, 0xaa, - 0x06, 0x89, 0xb9, 0x1e, 0x6e, 0x6e, 0xda, 0xce, 0xc1, 0xfe, 0xee, 0xce, 0xbe, 0x60, 0x46, 0x62, - 0xae, 0x08, 0xd8, 0xda, 0x42, 0x48, 0xce, 0x6a, 0x41, 0xf3, 0x53, 0x1e, 0xef, 0xf8, 0x27, 0x81, - 0x9a, 0xe9, 0x5f, 0x95, 0x60, 0x5e, 0x83, 0x12, 0xe5, 0xf0, 0x9c, 0x87, 0x91, 0x17, 0xf8, 0x28, - 0xe7, 0x55, 0x6d, 0xf5, 0x29, 0x6e, 0x10, 0xaf, 0xcf, 0xfd, 0xd8, 0x8b, 0xaf, 0x9c, 0x94, 0x25, - 0xa9, 0xa9, 0xc0, 0xf2, 0xa6, 0x5a, 0x82, 0x92, 0x3b, 0xf0, 0x5c, 0xe5, 0x81, 0xa4, 0x0f, 0x01, - 0xed, 0x05, 0x83, 0x20, 0x44, 0x91, 0xae, 0x6a, 0xd3, 0x07, 0x7b, 0x04, 0x4b, 0x42, 0xb4, 0x34, - 0xcd, 0x7b, 0x78, 0x46, 0xc9, 0xa8, 0xc5, 0xfc, 0xf1, 0xf0, 0x30, 0x31, 0xf1, 0x89, 0x12, 0x71, - 0x3f, 0x89, 0x1a, 0x52, 0x20, 0xd1, 0x15, 0x48, 0x4b, 0x59, 0xf0, 0xc7, 0xc3, 0x55, 0x2c, 0xd1, - 0xf8, 0x8f, 0xe1, 0xba, 0xc0, 0xd7, 0x22, 0x8c, 0xae, 0x31, 0x8f, 0x35, 0x44, 0x63, 0x3b, 0xb2, - 0x4c, 0xd7, 0xb9, 0x09, 0x55, 0x1a, 0x95, 0xd8, 0xf1, 0x12, 0x49, 0xa7, 0x38, 0x14, 0x1e, 0x46, - 0x53, 0xce, 0xc2, 0x39, 0xba, 0x6c, 0x27, 0x9c, 0x85, 0x86, 0xbb, 0xb1, 0x32, 0xe9, 0x6e, 0x7c, - 0x0c, 0xd7, 0x8f, 0x79, 0x14, 0x3b, 0x67, 0xdc, 0xed, 0xf3, 0x10, 0x4f, 0x24, 0xb9, 0x15, 0x49, - 0x0a, 0x5f, 0x14, 0x85, 0xdb, 0x58, 0x76, 0xa4, 0x8a, 0x84, 0x2c, 0x21, 0x8e, 0x1e, 0xef, 0x3b, - 0x71, 0xe0, 0xa0, 0x88, 0x81, 0x87, 0xb8, 0x62, 0x37, 0x08, 0x7c, 0x14, 0xac, 0x0b, 0x60, 0x1a, - 0xef, 0x34, 0x74, 0x47, 0x67, 0x52, 0x4e, 0xd6, 0x78, 0x9f, 0x0a, 0x20, 0x7b, 0x05, 0xca, 0x31, - 0x8f, 0x62, 0x9f, 0x93, 0x4f, 0xa7, 0x82, 0x36, 0x7b, 0x05, 0x62, 0x6f, 0xc0, 0x1c, 0xf6, 0x11, - 0xb5, 0x5b, 0x48, 0xef, 0xf5, 0x84, 0x59, 0x7a, 0xbe, 0x2d, 0xcb, 0x84, 0xc0, 0x36, 0x0e, 0xbd, - 0xa8, 0x5d, 0x47, 0x5f, 0x26, 0xfe, 0xcd, 0x7e, 0xc3, 0x60, 0x0b, 0x8b, 0x58, 0x57, 0xdd, 0xb9, - 0x13, 0x94, 0xf6, 0x2b, 0xe1, 0x10, 0x3f, 0x28, 0x56, 0x6a, 0xad, 0xba, 0xf5, 0x21, 0x94, 0x68, - 0x75, 0x04, 0x11, 0xe2, 0xda, 0xe5, 0x24, 0x11, 0x22, 0xb4, 0x0d, 0x65, 0x9f, 0xc7, 0x17, 0x41, - 0xf8, 0x4c, 0xd9, 0x5a, 0xe5, 0xa7, 0xf5, 0x53, 0x34, 0x12, 0x68, 0x47, 0x32, 0xe9, 0x3b, 0x82, - 0x3c, 0x68, 0x7b, 0xa3, 0x33, 0x57, 0xda, 0x2d, 0x2a, 0x08, 0xe8, 0x9e, 0xb9, 0x53, 0xe4, 0x91, - 0x9f, 0xf6, 0x25, 0xbf, 0x01, 0x4d, 0xe5, 0xba, 0x8e, 0x9c, 0x01, 0x3f, 0x89, 0x25, 0xb9, 0xd7, - 0xa5, 0xdf, 0x3a, 0xda, 0xe5, 0x27, 0xb1, 0xb5, 0x07, 0x0b, 0x92, 0x20, 0x0f, 0x46, 0x5c, 0x75, - 0xfd, 0x51, 0x96, 0xcc, 0x5a, 0x7b, 0xbc, 0x98, 0xbe, 0xcc, 0xc8, 0x25, 0x9f, 0x12, 0x64, 0xad, - 0xcf, 0x80, 0x99, 0x57, 0x9d, 0x6c, 0x4f, 0x4a, 0x8e, 0xca, 0x44, 0xad, 0x3c, 0x3d, 0x5a, 0x3e, - 0xf5, 0xfa, 0x62, 0x75, 0xa2, 0x71, 0xaf, 0xa7, 0x42, 0x0a, 0x2a, 0xb6, 0xfa, 0xb4, 0xfe, 0x2c, - 0x07, 0x8b, 0xd8, 0x98, 0x92, 0xb9, 0xa5, 0x34, 0xf1, 0xad, 0x07, 0x29, 0xf6, 0xc7, 0x94, 0x2f, - 0xe8, 0xe3, 0x9b, 0x1b, 0x05, 0x8b, 0x53, 0x46, 0xc1, 0xb7, 0xa0, 0xd5, 0xe7, 0x03, 0x0f, 0xa3, - 0x4b, 0xd4, 0x75, 0x4d, 0x52, 0xf6, 0xbc, 0x82, 0x2b, 0x45, 0xe9, 0x9f, 0xe5, 0x60, 0x81, 0xa4, - 0x01, 0x54, 0x17, 0xe5, 0x42, 0x7d, 0xa2, 0x74, 0x2c, 0xc9, 0xaa, 0xe4, 0x9c, 0x92, 0x5b, 0x12, - 0xa1, 0x84, 0xbc, 0x7d, 0x4d, 0xea, 0x5e, 0x12, 0xca, 0x3e, 0x46, 0x3d, 0xc1, 0x77, 0x10, 0x98, - 0x11, 0xad, 0x92, 0xde, 0x94, 0xed, 0x6b, 0xa8, 0x44, 0xf8, 0x08, 0x5a, 0xab, 0x08, 0xa5, 0x4f, - 0x80, 0xad, 0x2d, 0x68, 0xa4, 0xba, 0x49, 0x59, 0x2e, 0xeb, 0x64, 0xb9, 0x9c, 0xf2, 0x0e, 0xe4, - 0xa7, 0xbd, 0x03, 0x7f, 0xaf, 0x08, 0x4c, 0x90, 0xd4, 0xc4, 0xae, 0x4d, 0xb8, 0xd6, 0xf2, 0x53, - 0xae, 0xb5, 0x47, 0xc0, 0x0c, 0x04, 0xe5, 0xf1, 0x2b, 0x68, 0x8f, 0x5f, 0x2b, 0xc1, 0x95, 0x0e, - 0xbf, 0x47, 0xb0, 0x24, 0x85, 0x46, 0xed, 0x4b, 0x43, 0x93, 0x14, 0xed, 0x0f, 0x23, 0xe9, 0x51, - 0xf9, 0xd4, 0xd0, 0x3c, 0xa5, 0xdc, 0x6a, 0x42, 0xa5, 0x26, 0x4b, 0x0e, 0xba, 0xd5, 0x84, 0x16, - 0x3d, 0x41, 0x05, 0x73, 0x2f, 0xa4, 0x82, 0xf2, 0x14, 0x15, 0x18, 0x86, 0x85, 0x4a, 0xda, 0xb0, - 0x60, 0x41, 0x43, 0x39, 0xcf, 0x28, 0x66, 0x80, 0x24, 0xa4, 0x9a, 0xf4, 0xa0, 0x61, 0xdc, 0xc0, - 0x3d, 0x68, 0x29, 0xed, 0x5f, 0x9b, 0x2e, 0xc8, 0x1f, 0x2e, 0x8d, 0x47, 0xeb, 0xca, 0x80, 0x91, - 0x32, 0x14, 0xd7, 0x26, 0x0c, 0xc5, 0x6f, 0xc3, 0x42, 0x24, 0x88, 0xc8, 0x19, 0xfb, 0x32, 0x78, - 0x85, 0xf7, 0x51, 0x3d, 0xa9, 0xd8, 0x2d, 0x2c, 0x78, 0x9a, 0xc0, 0xa7, 0x55, 0xfb, 0xc6, 0xb4, - 0x6a, 0xcf, 0x3e, 0x48, 0xfc, 0x4c, 0xd1, 0x99, 0x37, 0xc4, 0x8b, 0x3b, 0x09, 0xf4, 0x90, 0x0b, - 0xdc, 0x3d, 0xf3, 0x86, 0xb6, 0x72, 0x6a, 0x8a, 0x0f, 0xeb, 0xbf, 0xe6, 0xa0, 0x25, 0xe8, 0x20, - 0x45, 0xe7, 0xbf, 0x06, 0x78, 0x22, 0x5f, 0x92, 0xcc, 0x6b, 0x02, 0x57, 0x51, 0xf9, 0x87, 0x80, - 0x64, 0xeb, 0x08, 0x5d, 0x4c, 0x12, 0x79, 0x3b, 0x4d, 0xe4, 0x09, 0x23, 0xdb, 0xbe, 0x46, 0x42, - 0xb6, 0x80, 0x64, 0xf9, 0xf7, 0x8a, 0x19, 0xfe, 0x3d, 0xe3, 0x28, 0x6c, 0x03, 0x3c, 0xe1, 0x57, - 0xbb, 0x41, 0x0f, 0xb5, 0xa0, 0x5b, 0x00, 0x82, 0x20, 0x4f, 0xdc, 0xa1, 0x27, 0x2d, 0x18, 0x25, - 0xbb, 0xfa, 0x8c, 0x5f, 0x6d, 0x21, 0x40, 0xec, 0x86, 0x28, 0x4e, 0xce, 0x43, 0xc9, 0xae, 0x3c, - 0xe3, 0x57, 0x74, 0x18, 0x1c, 0x68, 0x3c, 0xe1, 0x57, 0x1b, 0x9c, 0xc4, 0xb5, 0x20, 0x14, 0x94, - 0x10, 0xba, 0x17, 0x42, 0x3e, 0x4b, 0xf9, 0xe6, 0x6a, 0xa1, 0x7b, 0xf1, 0x84, 0x5f, 0x29, 0x3f, - 0x61, 0x59, 0x94, 0x0f, 0x82, 0x9e, 0xbc, 0x81, 0x54, 0x94, 0x41, 0x32, 0x28, 0x7b, 0xee, 0x19, - 0xfe, 0x6d, 0xfd, 0x69, 0x0e, 0x1a, 0x62, 0xfc, 0xc8, 0xe0, 0xc4, 0xba, 0xab, 0x60, 0x95, 0x5c, - 0x12, 0xac, 0xf2, 0x58, 0xf2, 0x07, 0xe2, 0x96, 0xf9, 0xd9, 0xdc, 0x12, 0x17, 0x98, 0x58, 0xe5, - 0x7b, 0x50, 0xa5, 0xb3, 0x25, 0x0e, 0x6b, 0x21, 0xb5, 0x4b, 0xa9, 0x09, 0xd9, 0x15, 0x44, 0x7b, - 0x42, 0xbe, 0x71, 0xc3, 0x00, 0x45, 0x4b, 0x5c, 0x0d, 0xb5, 0xe9, 0x29, 0x63, 0x1b, 0x4a, 0x59, - 0x6e, 0xd6, 0xa7, 0x50, 0x33, 0x68, 0x8a, 0x7d, 0x9f, 0x1c, 0xd4, 0x34, 0x78, 0x22, 0xc0, 0x34, - 0xd1, 0xa4, 0x66, 0xbf, 0x7d, 0xcd, 0x6e, 0xf4, 0x4c, 0xc0, 0xda, 0x1c, 0x14, 0x45, 0x25, 0xeb, - 0x13, 0x58, 0x30, 0x9a, 0x25, 0x8d, 0x2f, 0x6b, 0x4c, 0xb9, 0xac, 0x31, 0xfd, 0xf3, 0x1c, 0x2c, - 0xc9, 0xda, 0x18, 0xd8, 0xe4, 0x89, 0xeb, 0x7a, 0x2f, 0x3a, 0x65, 0xbf, 0x06, 0x0d, 0xd1, 0xba, - 0x13, 0xf2, 0x53, 0x2f, 0x8a, 0xb9, 0xb2, 0xec, 0x67, 0x1c, 0x0e, 0xc1, 0xb5, 0x05, 0xaa, 0x2d, - 0x31, 0xd9, 0x27, 0x50, 0xc3, 0xaa, 0xa4, 0x93, 0xca, 0x6d, 0x69, 0x4f, 0x57, 0xa4, 0xa1, 0x6e, - 0x5f, 0xb3, 0x21, 0xd2, 0x5f, 0x6b, 0x55, 0x28, 0xc7, 0xa1, 0x77, 0x7a, 0xca, 0x43, 0x6b, 0x59, - 0x0f, 0x4d, 0x9c, 0x34, 0xde, 0x8d, 0xf9, 0x48, 0x08, 0x41, 0xd6, 0x7f, 0xcf, 0x41, 0x4d, 0x9e, - 0x9d, 0x6f, 0x6d, 0xce, 0xef, 0x18, 0x91, 0x79, 0xa4, 0x7e, 0x26, 0x81, 0x78, 0x77, 0x61, 0x7e, - 0x28, 0x04, 0x22, 0x21, 0xb0, 0xa7, 0x6c, 0xf9, 0x4d, 0x05, 0x96, 0xf2, 0xc8, 0x03, 0x58, 0x44, - 0xf1, 0x24, 0x72, 0x62, 0x6f, 0xe0, 0xa8, 0x42, 0x19, 0x05, 0xb7, 0x40, 0x45, 0x47, 0xde, 0x60, - 0x4f, 0x16, 0x88, 0x5b, 0x3a, 0x8a, 0xdd, 0x53, 0x2e, 0x45, 0x5f, 0xfa, 0xb0, 0xda, 0xb0, 0x3c, - 0x21, 0xab, 0x2b, 0x3d, 0xe3, 0x1f, 0x36, 0x60, 0x65, 0xaa, 0x48, 0xea, 0x1b, 0xda, 0x86, 0x3d, - 0xf0, 0x86, 0xc7, 0x81, 0x36, 0x37, 0xe5, 0x0c, 0x1b, 0xf6, 0xae, 0x28, 0x51, 0xe6, 0x26, 0x0e, - 0xd7, 0x15, 0x41, 0xa0, 0xbd, 0x48, 0x8b, 0xf3, 0x79, 0x14, 0x36, 0xdf, 0x4b, 0x33, 0xaa, 0xc9, - 0xee, 0x14, 0xdc, 0xbc, 0xfe, 0x16, 0x47, 0x53, 0xb0, 0x88, 0x9d, 0x40, 0x5b, 0xd3, 0x9d, 0x94, - 0x8f, 0x0c, 0xdd, 0x44, 0xf4, 0xf4, 0xce, 0x0b, 0x7a, 0x4a, 0x19, 0x22, 0xec, 0x65, 0x45, 0xae, - 0xd4, 0x98, 0xee, 0xe7, 0x1c, 0x5e, 0x55, 0xfd, 0xa0, 0xac, 0x33, 0xdd, 0x5b, 0xf1, 0xa5, 0xe6, - 0x85, 0x06, 0x96, 0x74, 0x97, 0x37, 0x65, 0xc3, 0xba, 0xc8, 0xec, 0xf7, 0x0c, 0x96, 0x2f, 0x5c, - 0x2f, 0x56, 0xf3, 0x33, 0xd4, 0xa2, 0x12, 0xf6, 0xf7, 0xf8, 0x05, 0xfd, 0x7d, 0x4e, 0x95, 0x53, - 0xd2, 0xdf, 0xd2, 0xc5, 0x34, 0x30, 0xea, 0xfc, 0xe7, 0x3c, 0x34, 0xd3, 0xad, 0x88, 0x43, 0x2d, - 0xf9, 0x90, 0x92, 0x27, 0xa4, 0x3c, 0x2e, 0xcd, 0xa0, 0xfb, 0x24, 0x47, 0x4c, 0x1b, 0x68, 0xf3, - 0x19, 0x06, 0x5a, 0xd3, 0x2e, 0x5a, 0x78, 0x91, 0xef, 0xa7, 0xf8, 0x52, 0xbe, 0x9f, 0x52, 0x96, - 0xef, 0x67, 0xb6, 0xc3, 0x60, 0xee, 0x5b, 0x39, 0x0c, 0xca, 0xb3, 0x1d, 0x06, 0x9d, 0xbf, 0xce, - 0x01, 0x9b, 0xa6, 0x54, 0xf6, 0x29, 0xd9, 0xa2, 0x7d, 0x3e, 0x90, 0x5c, 0xec, 0xdd, 0x97, 0xa3, - 0x76, 0xb5, 0x41, 0xaa, 0x36, 0x7b, 0x08, 0x8b, 0x66, 0xdc, 0xac, 0xa9, 0xaa, 0x34, 0x6c, 0x66, - 0x16, 0x25, 0x0a, 0xad, 0xe1, 0xf8, 0x2a, 0xbe, 0xd0, 0xf1, 0x55, 0x7a, 0xa1, 0xe3, 0x6b, 0x2e, - 0xed, 0xf8, 0xea, 0xfc, 0x9d, 0x1c, 0x2c, 0x66, 0x10, 0xd5, 0x2f, 0x6f, 0xce, 0x82, 0x16, 0x52, - 0x2c, 0x26, 0x2f, 0x69, 0xc1, 0xe0, 0x2e, 0x9d, 0xaf, 0xa0, 0x91, 0x3a, 0x44, 0xbf, 0xbc, 0xee, - 0x27, 0x15, 0x2d, 0x22, 0x65, 0x53, 0xd1, 0xea, 0xfc, 0x65, 0x1e, 0xd8, 0xf4, 0x39, 0xfe, 0x55, - 0x0e, 0x61, 0x7a, 0x91, 0x0a, 0xd3, 0x8b, 0xf4, 0xff, 0xee, 0x5e, 0x79, 0x1b, 0x16, 0x64, 0xac, - 0xbf, 0xe1, 0x78, 0x20, 0x42, 0x69, 0xe9, 0x02, 0x35, 0x8a, 0x0f, 0x27, 0x7d, 0x8e, 0x95, 0x54, - 0x78, 0xb3, 0x71, 0xb1, 0xa6, 0x5d, 0x8f, 0x56, 0x07, 0xda, 0x72, 0x69, 0xa6, 0x4d, 0x75, 0xbf, - 0x57, 0xd4, 0x5a, 0x32, 0x16, 0x4a, 0xa1, 0xf8, 0xbb, 0x50, 0x37, 0x2f, 0x1b, 0xb9, 0x0f, 0x13, - 0x1e, 0x27, 0x21, 0x0e, 0x07, 0xc6, 0x69, 0x5d, 0x07, 0xf2, 0x23, 0xf4, 0x75, 0x35, 0x92, 0x20, - 0x9e, 0x63, 0x78, 0x46, 0xe1, 0x28, 0xb5, 0xf9, 0xff, 0x1f, 0x34, 0xd3, 0x76, 0x2b, 0x29, 0xea, - 0x65, 0x49, 0x87, 0xa2, 0x76, 0xca, 0x90, 0xc5, 0x7e, 0x03, 0x5a, 0x93, 0x76, 0x2f, 0x19, 0x7b, - 0x39, 0xa3, 0xfe, 0xbc, 0x97, 0x36, 0x85, 0xb1, 0x6d, 0x58, 0xca, 0xba, 0x6e, 0x71, 0x57, 0x66, - 0xab, 0x05, 0x6c, 0xfa, 0x4a, 0x65, 0x1f, 0x49, 0xf3, 0x66, 0x29, 0xcb, 0x11, 0x63, 0x2c, 0xf6, - 0x03, 0xfa, 0xcf, 0x30, 0x74, 0x9e, 0x03, 0x24, 0x30, 0xd6, 0x82, 0xfa, 0xc1, 0xe1, 0xe6, 0xbe, - 0xb3, 0xbe, 0xbd, 0xba, 0xbf, 0xbf, 0xb9, 0xdb, 0xba, 0xc6, 0x18, 0x34, 0xd1, 0x83, 0xb2, 0xa1, - 0x61, 0x39, 0x01, 0x93, 0xb6, 0x5f, 0x05, 0xcb, 0xb3, 0x25, 0x68, 0xed, 0xec, 0x4f, 0x40, 0x0b, - 0xac, 0x0d, 0x4b, 0x87, 0x9b, 0xe4, 0x74, 0x49, 0xb5, 0x5b, 0x14, 0x22, 0x9c, 0x9c, 0xae, 0x10, - 0xe1, 0x28, 0x53, 0x44, 0x52, 0x9f, 0x92, 0x6c, 0x7e, 0x3f, 0x07, 0xd7, 0x27, 0x0a, 0x92, 0xf8, - 0x5f, 0x92, 0x6b, 0xd2, 0x12, 0x4d, 0x1d, 0x81, 0x8a, 0x86, 0xdf, 0x86, 0x05, 0xad, 0xea, 0x4d, - 0xf0, 0xa5, 0x96, 0x2e, 0x50, 0xc8, 0x0f, 0x61, 0xd1, 0xd0, 0x18, 0x27, 0x4e, 0x28, 0x33, 0x8a, - 0x64, 0x05, 0x6b, 0x45, 0xc7, 0x59, 0x4e, 0x8c, 0xba, 0x4f, 0xe9, 0x27, 0x66, 0x41, 0x62, 0xfd, - 0x4d, 0x8f, 0x57, 0x7d, 0x0a, 0x55, 0x3e, 0x45, 0x08, 0xe9, 0xd1, 0x9a, 0x1b, 0xae, 0xba, 0xff, - 0xc3, 0x39, 0x60, 0x9f, 0x8d, 0x79, 0x78, 0x85, 0xf1, 0xbd, 0xd1, 0x8b, 0x02, 0x5e, 0x94, 0x5a, - 0x94, 0x7f, 0xa9, 0x18, 0xfe, 0xac, 0x18, 0xfa, 0xe2, 0x8b, 0x63, 0xe8, 0x4b, 0x2f, 0x8a, 0xa1, - 0x7f, 0x1d, 0x1a, 0xde, 0xa9, 0x1f, 0x08, 0x06, 0x24, 0x64, 0x93, 0xa8, 0x3d, 0x77, 0xa7, 0x70, - 0xaf, 0x6e, 0xd7, 0x25, 0x50, 0x48, 0x26, 0x11, 0xfb, 0x24, 0x41, 0xe2, 0xfd, 0x53, 0xcc, 0xf7, - 0x30, 0x59, 0xcf, 0x66, 0xff, 0x94, 0x4b, 0x2d, 0x10, 0xed, 0x22, 0xaa, 0xb2, 0x80, 0x47, 0xec, - 0x0d, 0x68, 0x46, 0xc1, 0x58, 0x88, 0x7a, 0x6a, 0x19, 0xc8, 0x3e, 0x5c, 0x27, 0xe8, 0xa1, 0x72, - 0x06, 0x2c, 0x8e, 0x23, 0xee, 0x0c, 0xbd, 0x28, 0x12, 0x17, 0x74, 0x2f, 0xf0, 0xe3, 0x30, 0x18, - 0x48, 0x93, 0xef, 0xc2, 0x38, 0xe2, 0x7b, 0x54, 0xb2, 0x4e, 0x05, 0xec, 0xfd, 0x64, 0x48, 0x23, - 0xd7, 0x0b, 0xa3, 0x36, 0xe0, 0x90, 0xd4, 0x4c, 0x51, 0xa2, 0x72, 0xbd, 0x50, 0x8f, 0x45, 0x7c, - 0x44, 0x13, 0xb1, 0xfd, 0xb5, 0xc9, 0xd8, 0xfe, 0x9f, 0x64, 0xc7, 0xf6, 0x37, 0xb0, 0xe9, 0x47, - 0xb2, 0xe9, 0xe9, 0x2d, 0xfe, 0x46, 0x21, 0xfe, 0xd3, 0x29, 0x0b, 0xcd, 0x6f, 0x92, 0xb2, 0x30, - 0x9f, 0x95, 0xb2, 0xf0, 0x1e, 0xd4, 0x30, 0x98, 0xdc, 0x39, 0xf3, 0xfc, 0x58, 0x99, 0xb0, 0x5b, - 0x66, 0xb4, 0xf9, 0xb6, 0x50, 0xa6, 0x21, 0x54, 0x7f, 0x46, 0xd3, 0xd9, 0x03, 0x0b, 0xbf, 0xc2, - 0xec, 0x01, 0x19, 0xf4, 0xfe, 0x00, 0x2a, 0x6a, 0x9f, 0x18, 0x83, 0xe2, 0x49, 0x18, 0x0c, 0x95, - 0x69, 0x4f, 0xfc, 0xcd, 0x9a, 0x90, 0x8f, 0x03, 0x59, 0x39, 0x1f, 0x07, 0xd6, 0x6f, 0x41, 0xcd, - 0x20, 0x35, 0xf6, 0x1a, 0x19, 0x11, 0x84, 0xb4, 0x2c, 0xb5, 0x64, 0x5a, 0xc5, 0xaa, 0x84, 0xee, - 0xf4, 0x05, 0xbf, 0xe9, 0x7b, 0x21, 0xc7, 0x3c, 0x1f, 0x27, 0xe4, 0xe7, 0x3c, 0x8c, 0x94, 0xa9, - 0xb5, 0xa5, 0x0b, 0x6c, 0x82, 0x5b, 0x7f, 0x13, 0x16, 0x53, 0x7b, 0x2b, 0x59, 0xc4, 0x1b, 0x30, - 0x87, 0xeb, 0xa6, 0x5c, 0x61, 0xe9, 0x28, 0x7e, 0x59, 0x86, 0x09, 0x9c, 0x64, 0x25, 0x76, 0x46, - 0x61, 0x70, 0x8c, 0x9d, 0xe4, 0xec, 0x9a, 0x84, 0x1d, 0x86, 0xc1, 0xb1, 0xf5, 0xf3, 0x02, 0x14, - 0xb6, 0x83, 0x91, 0x19, 0x61, 0x91, 0x9b, 0x8a, 0xb0, 0x90, 0x2a, 0x80, 0xa3, 0x45, 0x7c, 0x29, - 0xb5, 0xa1, 0x7d, 0x54, 0x89, 0xf9, 0xf7, 0xa0, 0x29, 0xf8, 0x44, 0x1c, 0x08, 0x1d, 0xea, 0xc2, - 0x0d, 0x29, 0xa6, 0xbf, 0x40, 0x87, 0xcf, 0x1d, 0xc6, 0x47, 0xc1, 0x16, 0xc1, 0xd9, 0x12, 0x14, - 0xb4, 0x00, 0x8b, 0xc5, 0xe2, 0x53, 0x28, 0xd7, 0x18, 0xdd, 0x76, 0x25, 0x7d, 0x3d, 0xf2, 0x8b, - 0xbd, 0x0b, 0x8b, 0xe9, 0x76, 0x89, 0x15, 0x49, 0x89, 0xc4, 0x6c, 0x18, 0x79, 0xd2, 0x0d, 0x10, - 0x7c, 0x84, 0x70, 0xa4, 0x5b, 0xf6, 0x84, 0x73, 0x2c, 0x32, 0x98, 0x5e, 0x25, 0xc5, 0xf4, 0x6e, - 0x43, 0x2d, 0x1e, 0x9c, 0x3b, 0x23, 0xf7, 0x6a, 0x10, 0xb8, 0x7d, 0x79, 0xbe, 0x21, 0x1e, 0x9c, - 0x1f, 0x12, 0x84, 0x3d, 0x04, 0x18, 0x8e, 0x46, 0xf2, 0xec, 0xa1, 0xb9, 0x31, 0x21, 0xe5, 0xbd, - 0xc3, 0x43, 0x22, 0x39, 0xbb, 0x3a, 0x1c, 0x8d, 0xe8, 0x4f, 0xb6, 0x01, 0xcd, 0xcc, 0x5c, 0x9c, - 0x5b, 0x2a, 0x18, 0x2b, 0x18, 0x3d, 0xc8, 0x38, 0x9c, 0x8d, 0x9e, 0x09, 0xeb, 0xfc, 0x06, 0xb0, - 0x5f, 0x30, 0x23, 0xe6, 0x08, 0xaa, 0x7a, 0x7c, 0x66, 0x42, 0x09, 0x86, 0x57, 0xd6, 0x52, 0x09, - 0x25, 0xab, 0xfd, 0x7e, 0x28, 0xf8, 0x22, 0x5d, 0x98, 0x9a, 0xe5, 0x83, 0x71, 0x63, 0xae, 0x12, - 0xdf, 0xb7, 0xfe, 0x22, 0x07, 0x25, 0xca, 0x6e, 0x79, 0x13, 0xe6, 0x09, 0x5f, 0x47, 0xab, 0x48, - 0x0f, 0x11, 0xdd, 0xbb, 0x47, 0x32, 0x50, 0x45, 0x1c, 0x0b, 0x23, 0x33, 0x2f, 0xaf, 0x77, 0xde, - 0xc8, 0xce, 0xbb, 0x0d, 0x55, 0xdd, 0xb5, 0x41, 0x3a, 0x15, 0xd5, 0x33, 0x7b, 0x15, 0x8a, 0x67, - 0xc1, 0x48, 0xe9, 0xe2, 0x90, 0xac, 0xa4, 0x8d, 0xf0, 0x64, 0x2c, 0xa2, 0x0f, 0x1a, 0xbc, 0xd4, - 0x21, 0x75, 0x27, 0x48, 0x06, 0xd3, 0x73, 0x9c, 0xcb, 0x98, 0xe3, 0x53, 0x98, 0x17, 0x7c, 0xc0, - 0xf0, 0xd4, 0xce, 0xbe, 0x34, 0xdf, 0x12, 0x12, 0x5e, 0x6f, 0x30, 0xee, 0x73, 0xd3, 0x12, 0x82, - 0xa1, 0x13, 0x12, 0xae, 0xd4, 0x03, 0xeb, 0x0f, 0x73, 0xc4, 0x5f, 0x44, 0xbb, 0xec, 0x1e, 0x14, - 0xc5, 0xfd, 0x36, 0x61, 0xa9, 0xd3, 0x71, 0xae, 0x02, 0xcf, 0x46, 0x0c, 0x4c, 0x67, 0x1d, 0x0f, - 0xd3, 0xad, 0x37, 0xec, 0x9a, 0x3f, 0x1e, 0x6a, 0x63, 0xc2, 0x77, 0xd4, 0xb4, 0x26, 0x14, 0x71, - 0x9a, 0xbd, 0x3e, 0xa6, 0x0f, 0x8c, 0x18, 0x8c, 0x62, 0xea, 0xc6, 0x54, 0x52, 0x60, 0xff, 0x94, - 0x1b, 0xb1, 0x17, 0x7f, 0x9c, 0x87, 0x46, 0x6a, 0x44, 0x18, 0x84, 0x22, 0x2e, 0x00, 0xb2, 0x02, - 0xcb, 0xfd, 0x06, 0x01, 0x92, 0x82, 0xba, 0xb1, 0x4e, 0xf9, 0xd4, 0x3a, 0x69, 0x9f, 0x74, 0xc1, - 0xf4, 0x49, 0x3f, 0x82, 0x6a, 0x92, 0x91, 0x99, 0x1e, 0x92, 0xe8, 0x4f, 0x45, 0xfb, 0x26, 0x48, - 0x89, 0x17, 0xbb, 0x64, 0x7a, 0xb1, 0xbf, 0x6f, 0x38, 0x3d, 0xe7, 0xb0, 0x19, 0x2b, 0x6b, 0x45, - 0x7f, 0x35, 0x41, 0x11, 0x9f, 0x40, 0xcd, 0x18, 0xbc, 0xe9, 0xdc, 0xcc, 0xa5, 0x9c, 0x9b, 0x3a, - 0x2e, 0x3f, 0x9f, 0xc4, 0xe5, 0x5b, 0xbf, 0x93, 0x87, 0x86, 0x38, 0x5f, 0x9e, 0x7f, 0x7a, 0x18, - 0x0c, 0xbc, 0x1e, 0x5a, 0x85, 0xf5, 0x09, 0x93, 0x82, 0x96, 0x3a, 0x67, 0xf2, 0x88, 0x91, 0x9c, - 0x65, 0xa6, 0x1f, 0x11, 0x93, 0xd6, 0xe9, 0x47, 0x16, 0x34, 0x04, 0x63, 0x3c, 0x76, 0x23, 0x6e, - 0xe4, 0x8b, 0xda, 0xb5, 0x13, 0xce, 0xd7, 0xdc, 0x88, 0x38, 0xe4, 0xbb, 0xb0, 0x28, 0x70, 0x30, - 0xf3, 0x62, 0xe8, 0x0d, 0x06, 0x1e, 0x61, 0x92, 0xa9, 0xa1, 0x75, 0xc2, 0xb9, 0xed, 0xc6, 0x7c, - 0x4f, 0x14, 0xc8, 0xf4, 0xd2, 0x4a, 0xdf, 0x8b, 0xdc, 0xe3, 0x24, 0x54, 0x48, 0x7f, 0xa3, 0x2f, - 0xc7, 0xbd, 0x34, 0x7c, 0x39, 0x94, 0x82, 0x55, 0x1b, 0xba, 0x97, 0xda, 0x97, 0x33, 0x41, 0x49, - 0xe5, 0x49, 0x4a, 0xb2, 0xfe, 0x5b, 0x1e, 0x6a, 0x06, 0x59, 0xbe, 0xcc, 0xed, 0x7a, 0x6b, 0xca, - 0x8a, 0x5f, 0x35, 0x0d, 0xf6, 0xaf, 0xa7, 0xbb, 0x44, 0x97, 0x2f, 0x25, 0xb2, 0x1a, 0x04, 0x7c, - 0x13, 0xaa, 0xe2, 0xd4, 0xbd, 0x87, 0x46, 0x31, 0x99, 0x86, 0x8d, 0x80, 0xc3, 0xf1, 0xb1, 0x2a, - 0x7c, 0x8c, 0x85, 0xa5, 0xa4, 0xf0, 0xb1, 0x28, 0x7c, 0x5e, 0x7c, 0xe0, 0x87, 0x50, 0x97, 0xad, - 0xe2, 0x9e, 0xe2, 0x74, 0x93, 0x53, 0x9f, 0xda, 0x6f, 0xbb, 0x46, 0xdd, 0xd1, 0xe6, 0xcb, 0x8a, - 0x8f, 0x55, 0xc5, 0xca, 0x8b, 0x2a, 0x3e, 0xa6, 0x0f, 0x6b, 0x4b, 0x87, 0x5c, 0x62, 0xb8, 0x81, - 0xe2, 0x63, 0x0f, 0x61, 0x51, 0xb1, 0xab, 0xb1, 0xef, 0xfa, 0x7e, 0x30, 0xf6, 0x7b, 0x5c, 0x05, - 0xec, 0x33, 0x59, 0xf4, 0x34, 0x29, 0xb1, 0xfa, 0x3a, 0xa3, 0x8b, 0xc2, 0x16, 0xee, 0x43, 0x89, - 0xe4, 0x72, 0x12, 0x3e, 0xb2, 0x19, 0x17, 0xa1, 0xb0, 0x7b, 0x50, 0x22, 0xf1, 0x3c, 0x3f, 0x93, - 0xd9, 0x10, 0x82, 0xf5, 0x00, 0xe6, 0x51, 0xc4, 0x34, 0x38, 0xee, 0xf3, 0xa4, 0x12, 0x6b, 0x09, - 0xd8, 0x3e, 0x1d, 0x22, 0x33, 0x9c, 0xe6, 0x7f, 0x15, 0xa0, 0x66, 0x80, 0x05, 0x5b, 0xc4, 0x00, - 0x0c, 0xa7, 0xef, 0xb9, 0x43, 0xae, 0x7c, 0x0f, 0x0d, 0xbb, 0x81, 0xd0, 0x0d, 0x09, 0x14, 0x97, - 0x82, 0x7b, 0x7e, 0xea, 0x04, 0xe3, 0xd8, 0xe9, 0xf3, 0xd3, 0x90, 0x73, 0x29, 0x2c, 0xd5, 0xdd, - 0xf3, 0xd3, 0x83, 0x71, 0xbc, 0x81, 0x30, 0x81, 0x25, 0x88, 0xda, 0xc0, 0x92, 0x31, 0x03, 0x43, - 0xf7, 0x32, 0xc1, 0x92, 0x81, 0x2b, 0xb4, 0x44, 0x45, 0x1d, 0xb8, 0x42, 0x6a, 0xcb, 0x24, 0x27, - 0x2f, 0x4d, 0x73, 0xf2, 0xf7, 0x61, 0x99, 0x38, 0xb9, 0xe4, 0x11, 0xce, 0x04, 0x49, 0x2d, 0x61, - 0xa9, 0x9c, 0xa4, 0x21, 0x7f, 0xb5, 0xc4, 0x0c, 0xd4, 0xf9, 0x88, 0xbc, 0x9f, 0xd2, 0x89, 0xca, - 0xd9, 0x62, 0x66, 0xb2, 0xf1, 0xae, 0xf7, 0x53, 0x2e, 0x30, 0xd1, 0x31, 0x6a, 0x62, 0xca, 0x30, - 0xd4, 0xa1, 0xe7, 0x4f, 0x62, 0xba, 0x97, 0x69, 0xcc, 0xaa, 0xc4, 0x74, 0x2f, 0x4d, 0xcc, 0x0f, - 0x60, 0x65, 0xc8, 0xfb, 0x9e, 0x9b, 0x6e, 0xd6, 0x49, 0x24, 0x88, 0x25, 0x2a, 0x36, 0xea, 0x74, - 0x49, 0x83, 0x14, 0xab, 0xf1, 0xd3, 0x60, 0x78, 0xec, 0xd1, 0xe5, 0x49, 0xae, 0xda, 0xa2, 0xdd, - 0xf4, 0xc7, 0xc3, 0x1f, 0x21, 0x58, 0x54, 0x89, 0xac, 0x06, 0xd4, 0xba, 0x71, 0x30, 0x52, 0xdb, - 0xdc, 0x84, 0x3a, 0x7d, 0xca, 0x74, 0x8c, 0x9b, 0x70, 0x03, 0x69, 0xf3, 0x28, 0x18, 0x05, 0x83, - 0xe0, 0xf4, 0x2a, 0x65, 0x50, 0xfa, 0x1f, 0x39, 0x58, 0x4c, 0x95, 0xca, 0x73, 0xfe, 0x3e, 0x1d, - 0x2c, 0x1d, 0x53, 0x4f, 0xe4, 0xbc, 0x60, 0x5c, 0x3e, 0x84, 0x48, 0xa7, 0x4a, 0xc5, 0xd9, 0xaf, - 0x26, 0xb9, 0xa0, 0xaa, 0x22, 0xd1, 0x76, 0x7b, 0x9a, 0xb6, 0x65, 0x7d, 0x95, 0x25, 0xaa, 0x9a, - 0xf8, 0xff, 0x65, 0xa8, 0x70, 0x5f, 0x4e, 0xb9, 0x90, 0x0e, 0x86, 0x34, 0x8d, 0x4f, 0x6a, 0x04, - 0x89, 0x45, 0x2a, 0xb2, 0xfe, 0x4d, 0x0e, 0x20, 0x19, 0x1d, 0x86, 0x63, 0xea, 0x0b, 0x94, 0x9e, - 0x59, 0x31, 0x2e, 0xcb, 0xd7, 0xa0, 0xae, 0x23, 0xc6, 0x92, 0x2b, 0xb9, 0xa6, 0x60, 0xe2, 0x5e, - 0xbe, 0x0b, 0xf3, 0xa7, 0x83, 0xe0, 0x18, 0x45, 0x27, 0x79, 0x81, 0x52, 0x52, 0x4a, 0x93, 0xc0, - 0xea, 0x5a, 0x4c, 0x2e, 0xf0, 0x62, 0x66, 0x50, 0x99, 0x79, 0x1d, 0x5b, 0xbf, 0x9b, 0xd7, 0xa1, - 0x33, 0xc9, 0x4a, 0x3c, 0x5f, 0xcf, 0xf8, 0x36, 0x1e, 0xd8, 0xe7, 0x79, 0x1e, 0x3e, 0x81, 0x66, - 0x48, 0xdc, 0x51, 0xb1, 0xce, 0xe2, 0x73, 0x58, 0x67, 0x23, 0x4c, 0x5d, 0xb9, 0x6f, 0x41, 0xcb, - 0xed, 0x9f, 0xf3, 0x30, 0xf6, 0xd0, 0x58, 0x8b, 0x82, 0x9a, 0x0c, 0x56, 0x31, 0xe0, 0x28, 0x11, - 0xdd, 0x85, 0x79, 0x99, 0x22, 0xa4, 0x31, 0xe5, 0xa3, 0x03, 0x09, 0x58, 0x20, 0x5a, 0xff, 0x5e, - 0xc5, 0xea, 0xa4, 0x77, 0xf7, 0xf9, 0xab, 0x62, 0xce, 0x30, 0x3f, 0xed, 0x5b, 0x91, 0x84, 0x24, - 0x6d, 0xc0, 0x92, 0x1f, 0x11, 0x50, 0x5a, 0x80, 0xd3, 0xcb, 0x5a, 0x7c, 0x99, 0x65, 0xb5, 0xfe, - 0x34, 0x07, 0xe5, 0xed, 0x60, 0x24, 0xf4, 0x72, 0x21, 0xcf, 0xe1, 0x31, 0xd1, 0xe9, 0x79, 0x73, - 0xe2, 0x73, 0xa7, 0xff, 0xfc, 0xb0, 0xfc, 0x4c, 0x79, 0xa3, 0x91, 0x96, 0x37, 0xbe, 0x0f, 0x37, - 0xd1, 0x1b, 0x11, 0x06, 0xa3, 0x20, 0x14, 0x47, 0xd5, 0x1d, 0x90, 0xdc, 0x11, 0xf8, 0xf1, 0x99, - 0xe2, 0x9d, 0x37, 0x4e, 0x38, 0x3f, 0x34, 0x30, 0xf6, 0x34, 0x02, 0xe6, 0x9a, 0x0c, 0xe2, 0x73, - 0x87, 0x54, 0x45, 0x29, 0x18, 0x11, 0x47, 0x9d, 0x17, 0x05, 0x9b, 0x08, 0x47, 0xd1, 0xc8, 0xfa, - 0x08, 0xaa, 0xda, 0xea, 0xc0, 0xde, 0x86, 0xea, 0x59, 0x30, 0x92, 0xa6, 0x89, 0x5c, 0x2a, 0x75, - 0x41, 0xce, 0xda, 0xae, 0x9c, 0xd1, 0x1f, 0x91, 0xf5, 0xf3, 0x32, 0x94, 0x77, 0xfc, 0xf3, 0xc0, - 0xeb, 0x61, 0xb4, 0xcf, 0x90, 0x0f, 0x03, 0x95, 0xa7, 0x28, 0xfe, 0x46, 0x8f, 0x7e, 0xf2, 0x74, - 0x40, 0x41, 0x7a, 0xf4, 0xf5, 0xa3, 0x01, 0xd7, 0x61, 0x2e, 0x34, 0x73, 0xff, 0x4b, 0x21, 0xc6, - 0x1f, 0x6a, 0xa5, 0xad, 0x64, 0xe4, 0x79, 0x8a, 0xb6, 0x28, 0x27, 0x1d, 0x97, 0x8c, 0x72, 0x4f, - 0xaa, 0x08, 0xc1, 0x05, 0x7b, 0x05, 0xca, 0x32, 0x53, 0x80, 0xe2, 0xae, 0x29, 0x60, 0x50, 0x82, - 0x90, 0x1a, 0x42, 0x4e, 0xde, 0x24, 0x2d, 0x51, 0x09, 0x3d, 0x5d, 0x02, 0x37, 0x04, 0xad, 0xdd, - 0x86, 0x1a, 0xe1, 0x13, 0x4a, 0x45, 0xc6, 0xe7, 0x20, 0x08, 0x11, 0x32, 0x9e, 0xd0, 0xa8, 0x66, - 0x3e, 0xa1, 0x81, 0xe1, 0x5c, 0x9a, 0xcb, 0xd2, 0x14, 0x81, 0x1e, 0x4e, 0x30, 0xe0, 0xea, 0xfd, - 0x18, 0xa9, 0xdc, 0x53, 0x1a, 0x95, 0x52, 0xee, 0x5f, 0x87, 0xc6, 0x89, 0x3b, 0x18, 0x1c, 0xbb, - 0xbd, 0x67, 0xa4, 0x93, 0xd6, 0xc9, 0x0c, 0xa7, 0x80, 0xa8, 0x94, 0xde, 0x86, 0x9a, 0xb1, 0xcb, - 0x18, 0x7c, 0x53, 0xb4, 0x21, 0xd9, 0xdf, 0x49, 0x53, 0x53, 0xf3, 0x25, 0x4c, 0x4d, 0x46, 0x10, - 0xd2, 0x7c, 0x3a, 0x08, 0xe9, 0x26, 0x72, 0x53, 0x19, 0xa8, 0xd2, 0xa2, 0x2c, 0x7d, 0xb7, 0xdf, - 0xc7, 0x40, 0x15, 0x7a, 0x12, 0x0b, 0x17, 0x8f, 0xca, 0x17, 0x48, 0xa8, 0x25, 0x18, 0xa1, 0xdc, - 0x22, 0x7b, 0xe9, 0xc8, 0xf5, 0xfa, 0x18, 0xf4, 0x49, 0x6a, 0x6c, 0xd9, 0x1d, 0xc6, 0x87, 0xae, - 0xd7, 0x67, 0x77, 0xa0, 0xae, 0x8a, 0xf1, 0x76, 0x5c, 0xa4, 0xf5, 0x97, 0xc5, 0xe2, 0x4e, 0xb4, - 0xa0, 0xa1, 0x31, 0x86, 0x49, 0x2e, 0x54, 0x4d, 0xa2, 0x20, 0x1d, 0xbc, 0x87, 0xce, 0xff, 0x98, - 0x63, 0xc6, 0x53, 0xf3, 0xf1, 0x4d, 0x39, 0x57, 0x49, 0xa5, 0xea, 0x7f, 0x8c, 0x74, 0xb0, 0x09, - 0x53, 0x08, 0x62, 0xe4, 0xa2, 0x59, 0x4e, 0x09, 0x62, 0x12, 0x15, 0x5d, 0x34, 0x84, 0xc0, 0x3e, - 0x32, 0x14, 0xa9, 0x36, 0x22, 0xbf, 0x32, 0xd1, 0xfe, 0x0c, 0x15, 0x4a, 0x50, 0xaf, 0x17, 0x89, - 0x5b, 0x26, 0xe2, 0x7e, 0x1f, 0x13, 0xa0, 0x2a, 0x76, 0xd5, 0x8b, 0x9e, 0x10, 0xe0, 0x97, 0xab, - 0x61, 0xad, 0x42, 0xdd, 0x9c, 0x26, 0xab, 0x40, 0xf1, 0xe0, 0x70, 0x73, 0xbf, 0x75, 0x8d, 0xd5, - 0xa0, 0xdc, 0xdd, 0x3c, 0x3a, 0xda, 0xdd, 0xdc, 0x68, 0xe5, 0x58, 0x1d, 0x2a, 0x3a, 0x8d, 0x23, - 0x2f, 0xbe, 0x56, 0xd7, 0xd7, 0x37, 0x0f, 0x8f, 0x36, 0x37, 0x5a, 0x85, 0x1f, 0x14, 0x2b, 0xf9, - 0x56, 0xc1, 0xfa, 0xf3, 0x02, 0xd4, 0x8c, 0x55, 0x78, 0x3e, 0x33, 0xbe, 0x05, 0x80, 0x2a, 0x4d, - 0x12, 0xc7, 0x54, 0xb4, 0xab, 0x02, 0x42, 0x9b, 0x6f, 0x1a, 0xcb, 0x0b, 0xf4, 0xfc, 0x83, 0x32, - 0x96, 0xbf, 0x0e, 0x0d, 0x7a, 0x49, 0xc1, 0x74, 0xd7, 0x95, 0xec, 0x3a, 0x01, 0x25, 0xab, 0xc6, - 0x3c, 0x30, 0x44, 0xc2, 0x0c, 0x01, 0x99, 0x57, 0x4d, 0x20, 0xcc, 0x11, 0xc0, 0x04, 0x8f, 0x28, - 0x18, 0x9c, 0x73, 0xc2, 0x20, 0x89, 0xb0, 0x26, 0x61, 0x47, 0x32, 0x11, 0x4d, 0xf2, 0x43, 0x23, - 0x11, 0xa9, 0x64, 0xd7, 0x09, 0x28, 0x3b, 0x7a, 0x57, 0x11, 0x50, 0x05, 0x09, 0x68, 0x65, 0x9a, - 0x1a, 0x52, 0xc4, 0xb3, 0x3b, 0x65, 0xcf, 0xaa, 0x22, 0x61, 0x7c, 0x67, 0xba, 0xde, 0x8b, 0xed, - 0x5a, 0xec, 0x6d, 0x60, 0xc3, 0xd1, 0xc8, 0xc9, 0xb0, 0x34, 0x15, 0xed, 0xf9, 0xe1, 0x68, 0x74, - 0x64, 0x18, 0x62, 0x7e, 0x09, 0x46, 0xb0, 0x2f, 0x81, 0xad, 0x8a, 0x03, 0x8c, 0x43, 0xd4, 0x26, - 0xd4, 0x84, 0x2d, 0xe7, 0x4c, 0xb6, 0x9c, 0xc1, 0xfd, 0xf2, 0x99, 0xdc, 0xef, 0x79, 0x7c, 0xc2, - 0xda, 0x82, 0xda, 0xa1, 0xf1, 0x4e, 0xcb, 0x1d, 0x71, 0x43, 0xa8, 0x17, 0x5a, 0xe8, 0xee, 0x20, - 0xe3, 0x56, 0x28, 0x1f, 0x66, 0x31, 0x46, 0x93, 0x37, 0x46, 0x63, 0xfd, 0xeb, 0x1c, 0xe5, 0xc0, - 0xeb, 0xc1, 0x27, 0x4f, 0xc3, 0x28, 0x3f, 0x50, 0x92, 0x2f, 0x58, 0x53, 0xfe, 0x1f, 0x99, 0xea, - 0x87, 0x43, 0x73, 0x82, 0x93, 0x93, 0x88, 0xab, 0xcc, 0x97, 0x1a, 0xc2, 0x0e, 0x10, 0xa4, 0x84, - 0x6f, 0x21, 0xe1, 0x7b, 0xd4, 0x7e, 0x24, 0x33, 0x60, 0x84, 0xf0, 0xbd, 0xe7, 0x5e, 0xca, 0x5e, - 0x23, 0x21, 0x82, 0x48, 0x43, 0xb5, 0xca, 0xf7, 0xd1, 0xdf, 0xd6, 0xbf, 0x90, 0x29, 0x8d, 0x93, - 0xeb, 0x7b, 0x1f, 0x2a, 0xba, 0xd5, 0xf4, 0x0d, 0xab, 0x30, 0x75, 0xb9, 0xb8, 0xc7, 0x51, 0x2b, - 0x4f, 0x8d, 0x98, 0x0e, 0x17, 0x3a, 0x1b, 0x76, 0x8c, 0x51, 0xbf, 0x03, 0xec, 0xc4, 0x0b, 0x27, - 0x91, 0xe9, 0xb0, 0xb5, 0xb0, 0xc4, 0xc0, 0xb6, 0x9e, 0xc2, 0xa2, 0xe2, 0x12, 0x86, 0x46, 0x90, - 0xde, 0xbc, 0xdc, 0x0b, 0x98, 0x7c, 0x7e, 0x8a, 0xc9, 0x5b, 0x3f, 0x2b, 0x42, 0x59, 0xbd, 0x79, - 0x94, 0xf5, 0x4e, 0x4f, 0x35, 0xfd, 0x4e, 0x4f, 0x3b, 0xf5, 0xa6, 0x03, 0x6e, 0xbd, 0xbc, 0xef, - 0xef, 0x4e, 0x5e, 0xd9, 0x86, 0xd1, 0x3c, 0x75, 0x6d, 0x2f, 0x43, 0x71, 0xe4, 0xc6, 0x67, 0x68, - 0x20, 0x23, 0xe2, 0xc1, 0x6f, 0x65, 0x4c, 0x2f, 0xa5, 0x8d, 0xe9, 0x59, 0x6f, 0x1a, 0x91, 0x48, - 0x3a, 0xf5, 0xa6, 0xd1, 0x4d, 0x20, 0xf9, 0xc2, 0x88, 0x87, 0xa9, 0x20, 0x40, 0xdc, 0x45, 0x69, - 0x71, 0xa4, 0x32, 0x29, 0x8e, 0xbc, 0xb4, 0xa8, 0xf0, 0x3e, 0xcc, 0x51, 0x3e, 0xb0, 0xcc, 0x6b, - 0x52, 0x17, 0x8a, 0x5c, 0x43, 0xf5, 0x3f, 0x05, 0xc1, 0xda, 0x12, 0xd7, 0x7c, 0x20, 0xa4, 0x96, - 0x7a, 0x20, 0xc4, 0x34, 0xf2, 0xd7, 0xd3, 0x46, 0xfe, 0x7b, 0xd0, 0xd2, 0x0b, 0x8a, 0x26, 0x33, - 0x3f, 0x92, 0x19, 0x1d, 0x4d, 0x05, 0x17, 0x5c, 0x72, 0x3f, 0x4a, 0x2e, 0xc4, 0x66, 0xea, 0x42, - 0x14, 0x3c, 0x6c, 0x35, 0x8e, 0xf9, 0x70, 0x14, 0xcb, 0x0b, 0x11, 0x63, 0xbe, 0xcd, 0x01, 0xa6, - 0x33, 0xfe, 0x1a, 0x50, 0xdd, 0xd9, 0x77, 0xb6, 0x76, 0x77, 0x3e, 0xdd, 0x3e, 0x6a, 0xe5, 0xc4, - 0x67, 0xf7, 0xe9, 0xfa, 0xfa, 0xe6, 0xe6, 0x06, 0xde, 0x38, 0x00, 0x73, 0x5b, 0xab, 0x3b, 0xe2, - 0xf6, 0x29, 0x58, 0x7f, 0x9d, 0x83, 0x9a, 0xd1, 0x3c, 0xfb, 0x40, 0xaf, 0x0a, 0xbd, 0x21, 0x71, - 0x6b, 0x7a, 0x08, 0x0f, 0x14, 0x2b, 0x36, 0x96, 0x45, 0xbf, 0xe0, 0x94, 0x9f, 0xf9, 0x82, 0x13, - 0x7b, 0x13, 0xe6, 0x5d, 0x6a, 0x41, 0xaf, 0x82, 0x34, 0x07, 0x4b, 0xb0, 0x5c, 0x04, 0x8c, 0x02, - 0x4b, 0xee, 0x13, 0x81, 0x57, 0x54, 0x81, 0x57, 0xfa, 0x4a, 0xd9, 0x8f, 0xac, 0xef, 0x01, 0x24, - 0x23, 0x49, 0x4f, 0xf9, 0x5a, 0x7a, 0xca, 0x39, 0x63, 0xca, 0x79, 0x6b, 0x83, 0x98, 0x83, 0x5c, - 0x3e, 0xed, 0x7f, 0x7e, 0x17, 0x94, 0x9d, 0xc9, 0xc1, 0xe8, 0xca, 0xd1, 0x80, 0xc7, 0x2a, 0xe3, - 0x71, 0x41, 0x96, 0xec, 0xe8, 0x02, 0x95, 0x80, 0x9c, 0xb4, 0x92, 0xf0, 0x18, 0x49, 0x68, 0x93, - 0x3c, 0x46, 0xa2, 0xda, 0xba, 0xdc, 0xea, 0x40, 0x7b, 0x83, 0x8b, 0xd6, 0x56, 0x07, 0x83, 0x89, - 0xe1, 0x58, 0x37, 0xe1, 0x46, 0x46, 0x99, 0x34, 0x2d, 0x7c, 0x06, 0xd7, 0x57, 0x29, 0xb9, 0xf1, - 0x97, 0x95, 0x61, 0x61, 0xb5, 0x61, 0x79, 0xb2, 0x49, 0xd9, 0xd9, 0x16, 0x2c, 0x6c, 0xf0, 0xe3, - 0xf1, 0xe9, 0x2e, 0x3f, 0x4f, 0x3a, 0x62, 0x50, 0x8c, 0xce, 0x82, 0x0b, 0xb9, 0x3e, 0xf8, 0xb7, - 0x38, 0x99, 0x03, 0x81, 0xe3, 0x44, 0x23, 0xde, 0x53, 0x76, 0x4e, 0x84, 0x74, 0x47, 0xbc, 0x67, - 0x7d, 0x00, 0xcc, 0x6c, 0x47, 0xae, 0x97, 0x90, 0xfd, 0xc7, 0xc7, 0x4e, 0x74, 0x15, 0xc5, 0x7c, - 0xa8, 0x1e, 0x1e, 0x81, 0x68, 0x7c, 0xdc, 0x25, 0x88, 0x75, 0x17, 0xea, 0x87, 0xee, 0x95, 0xcd, - 0xbf, 0x94, 0xb9, 0x03, 0x2b, 0x50, 0x1e, 0xb9, 0x57, 0xe2, 0x70, 0x6b, 0x97, 0x07, 0x16, 0x5b, - 0x7f, 0x54, 0x84, 0x39, 0xc2, 0x64, 0x77, 0xe8, 0x6d, 0x40, 0xcf, 0xc7, 0xc3, 0xa5, 0xd8, 0x9f, - 0x01, 0x9a, 0xe2, 0x90, 0xf9, 0x69, 0x0e, 0x29, 0xcd, 0x62, 0xea, 0x4d, 0x04, 0x65, 0x9c, 0xf6, - 0xc7, 0x43, 0xf5, 0x10, 0x02, 0x7b, 0x05, 0xaa, 0x49, 0x92, 0x56, 0x31, 0x79, 0xfb, 0x91, 0x52, - 0xb3, 0xd2, 0xee, 0xc3, 0x44, 0xc3, 0xa0, 0xd1, 0x29, 0xc6, 0x2f, 0x99, 0xa0, 0x09, 0xca, 0x54, - 0x63, 0xca, 0x2a, 0x2b, 0x25, 0xad, 0xc6, 0x4c, 0xa9, 0x2b, 0x95, 0x17, 0xab, 0x2b, 0x64, 0x2f, - 0x7b, 0x8e, 0xba, 0x02, 0x2f, 0xa1, 0xae, 0xbc, 0x84, 0xeb, 0xee, 0x06, 0x54, 0xf0, 0x36, 0x37, - 0x78, 0xa2, 0xb8, 0xc5, 0x05, 0x4f, 0xfc, 0xd0, 0x10, 0xe8, 0x29, 0x6e, 0xe0, 0x66, 0x72, 0x4c, - 0x6c, 0xfe, 0xe5, 0xaf, 0xc6, 0x25, 0xf2, 0x05, 0x94, 0x25, 0x54, 0x10, 0xb4, 0xef, 0x0e, 0xd5, - 0xb3, 0x32, 0xf8, 0xb7, 0x58, 0x36, 0x7c, 0x0b, 0xe3, 0xcb, 0xb1, 0x17, 0xf2, 0xbe, 0x7a, 0xbc, - 0xc0, 0xc3, 0x33, 0x2a, 0x20, 0x62, 0x82, 0x42, 0xb9, 0xf0, 0x83, 0x0b, 0x5f, 0xa6, 0x2e, 0x97, - 0xbd, 0xe8, 0x89, 0xf8, 0xb4, 0x18, 0xb4, 0xf0, 0x61, 0xa9, 0x51, 0x10, 0xaa, 0x2b, 0xc7, 0xfa, - 0x59, 0x0e, 0x5a, 0xf2, 0x74, 0xe9, 0x32, 0x53, 0xb6, 0x2f, 0xcd, 0x72, 0x73, 0x3f, 0xff, 0x29, - 0x02, 0x0b, 0x1a, 0x68, 0xd2, 0xd0, 0xf7, 0x0f, 0x99, 0x64, 0x6a, 0x02, 0xb8, 0x25, 0xef, 0xa0, - 0x57, 0xa1, 0xa6, 0x82, 0x2c, 0x87, 0xde, 0x40, 0x3d, 0xf3, 0x4a, 0x51, 0x96, 0x7b, 0xde, 0x40, - 0x5d, 0x5f, 0xa1, 0x2b, 0xb3, 0xa4, 0x72, 0x78, 0x7d, 0xd9, 0x6e, 0xcc, 0xad, 0xff, 0x92, 0x83, - 0x05, 0x63, 0x2a, 0xf2, 0xdc, 0x7e, 0x0c, 0x75, 0xfd, 0xa2, 0x1b, 0xd7, 0xf2, 0xd4, 0x4a, 0x9a, - 0xd1, 0x24, 0xd5, 0x6a, 0x3d, 0x0d, 0x89, 0xc4, 0x60, 0xfa, 0xee, 0x15, 0x8e, 0x37, 0x1a, 0x0f, - 0x95, 0xca, 0xd2, 0x77, 0xaf, 0xb6, 0x38, 0xef, 0x8e, 0x87, 0x42, 0x21, 0xbd, 0xe0, 0xfc, 0x99, - 0x46, 0x20, 0x49, 0x0a, 0x04, 0x4c, 0x62, 0x58, 0xd0, 0x18, 0x06, 0x7e, 0x7c, 0xa6, 0x51, 0xa4, - 0x2c, 0x89, 0x40, 0xc2, 0xb1, 0xfe, 0x67, 0x1e, 0x16, 0xc9, 0x70, 0x26, 0x0d, 0x96, 0x92, 0x75, - 0xb5, 0x61, 0x8e, 0x6c, 0x88, 0xc4, 0xbc, 0xb6, 0xaf, 0xd9, 0xf2, 0x9b, 0xbd, 0xff, 0x92, 0xc6, - 0x3e, 0x95, 0x88, 0x35, 0x63, 0xf9, 0x0b, 0xd3, 0xcb, 0x3f, 0x7b, 0x79, 0xb3, 0xfc, 0x68, 0xa5, - 0x2c, 0x3f, 0xda, 0xcb, 0x78, 0xaf, 0xa6, 0xb2, 0x95, 0xca, 0x12, 0xc7, 0xc8, 0x56, 0xfa, 0x00, - 0x56, 0x52, 0x38, 0xc8, 0xad, 0xbd, 0x13, 0x8f, 0xab, 0xcc, 0xf0, 0x25, 0x03, 0xbb, 0xab, 0xca, - 0xd6, 0xca, 0x50, 0x8a, 0x7a, 0xc1, 0x88, 0x5b, 0xcb, 0xb0, 0x94, 0x5e, 0x55, 0x79, 0x4d, 0xfc, - 0x41, 0x0e, 0xda, 0x32, 0xea, 0xc1, 0xf3, 0x4f, 0xb7, 0xbd, 0x28, 0x0e, 0x42, 0xfd, 0xf2, 0xd9, - 0x2d, 0x80, 0x28, 0x76, 0x43, 0xa9, 0x43, 0x92, 0x74, 0x5b, 0x45, 0x08, 0xea, 0x87, 0x37, 0xa0, - 0xc2, 0xfd, 0x3e, 0x15, 0x12, 0x35, 0x94, 0xb9, 0xdf, 0x57, 0xda, 0xe5, 0x94, 0x54, 0xdd, 0x48, - 0x2b, 0x0d, 0x32, 0x6d, 0x52, 0xac, 0x0e, 0x3f, 0xc7, 0x8b, 0xb7, 0xa8, 0xd3, 0x26, 0xf7, 0xdc, - 0x4b, 0x8c, 0x21, 0x8c, 0xac, 0x7f, 0x9a, 0x87, 0xf9, 0x64, 0x7c, 0x94, 0x73, 0x9d, 0xe2, 0xdf, - 0x72, 0x54, 0x09, 0xff, 0xbe, 0x23, 0xc9, 0xc1, 0x13, 0x52, 0xb9, 0x61, 0x4e, 0xac, 0xd0, 0xe1, - 0xdc, 0xf1, 0x99, 0x05, 0x35, 0x85, 0x11, 0x8c, 0x63, 0xe3, 0x01, 0xa2, 0x2a, 0xa1, 0x1c, 0x8c, - 0x63, 0xa1, 0x46, 0x09, 0x7d, 0xd2, 0xf3, 0xa5, 0x22, 0x53, 0x72, 0x87, 0xf1, 0x0e, 0xbe, 0x6b, - 0x2c, 0xc0, 0xa2, 0x1a, 0x6d, 0xa4, 0xc0, 0x12, 0xf8, 0x2d, 0x92, 0x9e, 0x69, 0xe7, 0x50, 0x72, - 0x36, 0x45, 0x4b, 0x7a, 0xe2, 0x51, 0x8b, 0x96, 0xaf, 0x42, 0x8d, 0x1a, 0x4f, 0x92, 0xd3, 0x8a, - 0x76, 0x15, 0x7b, 0xc0, 0x72, 0x69, 0xda, 0x09, 0xc6, 0x29, 0x85, 0x16, 0xa8, 0x2b, 0x0c, 0x2a, - 0xf8, 0x47, 0x39, 0xb8, 0x91, 0xb1, 0x6d, 0xf2, 0x94, 0xaf, 0xc3, 0xc2, 0x89, 0x2e, 0x54, 0xab, - 0x4b, 0x47, 0x7d, 0x59, 0xb1, 0xd5, 0xf4, 0x9a, 0xda, 0xad, 0x93, 0x34, 0x20, 0x51, 0xa5, 0x68, - 0x07, 0x53, 0xf9, 0x87, 0xa8, 0x4a, 0xd1, 0x36, 0x92, 0x16, 0x73, 0x08, 0x9d, 0xcd, 0x4b, 0xc1, - 0x31, 0xd6, 0xcd, 0x87, 0xb9, 0x15, 0x19, 0xa5, 0xcd, 0xc6, 0xb9, 0x97, 0x32, 0x1b, 0xf7, 0x29, - 0xcd, 0x4a, 0xb7, 0xf5, 0x6d, 0x1a, 0xc1, 0x0b, 0x54, 0xd4, 0xa1, 0x87, 0xc5, 0x55, 0x0e, 0x64, - 0x4f, 0x3f, 0x28, 0x6e, 0x45, 0x30, 0xbf, 0x37, 0x1e, 0xc4, 0x5e, 0xf2, 0xc6, 0x38, 0x7b, 0x5f, - 0xd6, 0xc1, 0x7e, 0xd4, 0xaa, 0x65, 0x76, 0x04, 0xba, 0x23, 0x5c, 0xac, 0xa1, 0x68, 0xc8, 0x99, - 0xee, 0x6f, 0x7e, 0x98, 0xee, 0xc1, 0xba, 0x01, 0x2b, 0xc9, 0x17, 0x2d, 0x9b, 0xba, 0x6a, 0xfe, - 0x55, 0x8e, 0x02, 0x96, 0xd3, 0xef, 0x9d, 0xb3, 0x4d, 0x58, 0x8c, 0x3c, 0xff, 0x74, 0xc0, 0xcd, - 0xe6, 0x23, 0xb9, 0x08, 0xd7, 0xd3, 0x63, 0x93, 0x6f, 0xa2, 0xdb, 0x0b, 0x54, 0x23, 0x69, 0x2d, - 0x62, 0x6b, 0xb3, 0x06, 0x99, 0x90, 0xc5, 0xc4, 0x6a, 0x4c, 0x0f, 0x7e, 0x07, 0x9a, 0xe9, 0x8e, - 0xd8, 0x87, 0x32, 0xc5, 0x30, 0x19, 0x55, 0x61, 0x22, 0x5b, 0x2c, 0x21, 0x88, 0x5a, 0xb2, 0xf6, - 0x91, 0xf5, 0x8f, 0x73, 0xd0, 0xb6, 0xb9, 0xa0, 0x5c, 0x63, 0x94, 0x8a, 0x66, 0x3e, 0x9e, 0x6a, - 0x75, 0xf6, 0x5c, 0x55, 0xe6, 0xa2, 0x1a, 0xd1, 0x3b, 0x33, 0x37, 0x63, 0xfb, 0xda, 0xd4, 0x8c, - 0xd6, 0x2a, 0x30, 0x47, 0x28, 0xd6, 0x0a, 0x5c, 0x97, 0xe3, 0x51, 0x63, 0x49, 0x7c, 0x82, 0xa9, - 0x1e, 0x53, 0x3e, 0xc1, 0x0e, 0xb4, 0xe9, 0x01, 0x3b, 0x73, 0x12, 0xb2, 0xe2, 0x06, 0xb0, 0x3d, - 0xb7, 0xe7, 0x86, 0x41, 0xe0, 0x1f, 0xf2, 0x50, 0x86, 0x7f, 0xa2, 0x84, 0x89, 0x2e, 0x33, 0x25, - 0x0a, 0xd3, 0x97, 0x7a, 0x76, 0x2d, 0xf0, 0x55, 0xb4, 0x0b, 0x7d, 0x59, 0x36, 0x2c, 0xae, 0xb9, - 0xcf, 0xb8, 0x6a, 0x49, 0x2d, 0xd1, 0x27, 0x50, 0x1b, 0xe9, 0x46, 0xd5, 0xba, 0xab, 0x3c, 0xe4, - 0xe9, 0x6e, 0x6d, 0x13, 0xdb, 0x7a, 0x0c, 0x4b, 0xe9, 0x36, 0x25, 0xeb, 0xe8, 0x40, 0x65, 0x28, - 0x61, 0x72, 0x74, 0xfa, 0xfb, 0xfe, 0xd7, 0x50, 0x33, 0x1e, 0x25, 0x64, 0x2b, 0xb0, 0xf8, 0xf9, - 0xce, 0xd1, 0xfe, 0x66, 0xb7, 0xeb, 0x1c, 0x3e, 0x5d, 0x7b, 0xb2, 0xf9, 0x85, 0xb3, 0xbd, 0xda, - 0xdd, 0x6e, 0x5d, 0x63, 0xcb, 0xc0, 0xf6, 0x37, 0xbb, 0x47, 0x9b, 0x1b, 0x29, 0x78, 0x8e, 0xbd, - 0x0a, 0x9d, 0xa7, 0xfb, 0x4f, 0xbb, 0x9b, 0x1b, 0x4e, 0x56, 0xbd, 0x3c, 0xbb, 0x05, 0x37, 0x64, - 0x79, 0x46, 0xf5, 0xc2, 0xfd, 0x4f, 0xa0, 0x35, 0x69, 0x55, 0x4c, 0x99, 0x61, 0x9f, 0x67, 0xaf, - 0xbd, 0xff, 0xef, 0x0a, 0x00, 0x49, 0xd8, 0x27, 0x6b, 0xc3, 0xd2, 0xc6, 0xea, 0xd1, 0xea, 0xee, - 0x81, 0x18, 0x84, 0x7d, 0x70, 0xb4, 0xb9, 0x7e, 0xe4, 0xd8, 0x9b, 0x9f, 0xb5, 0xae, 0x65, 0x96, - 0x1c, 0x1c, 0x0a, 0x7d, 0x7c, 0x05, 0x16, 0x77, 0xf6, 0x77, 0x8e, 0x76, 0x56, 0x77, 0x1d, 0xfb, - 0xe0, 0xe9, 0xce, 0xfe, 0xa7, 0xf4, 0xec, 0x48, 0x81, 0xdd, 0x86, 0x9b, 0x4f, 0x0f, 0xb7, 0xec, - 0x83, 0xfd, 0x23, 0xa7, 0xbb, 0xfd, 0xf4, 0x68, 0x03, 0x1f, 0x2d, 0x59, 0xb7, 0x77, 0x0e, 0xa9, - 0xcd, 0xe2, 0xf3, 0x10, 0x44, 0xd3, 0x25, 0xb1, 0x62, 0x9f, 0x1e, 0x74, 0xbb, 0x3b, 0x87, 0xce, - 0x67, 0x4f, 0x37, 0xed, 0x9d, 0xcd, 0x2e, 0x56, 0x9c, 0xcb, 0x80, 0x0b, 0xfc, 0x32, 0x5b, 0x80, - 0xc6, 0xd1, 0xee, 0x0f, 0x9d, 0x83, 0xfd, 0x9d, 0x83, 0x7d, 0x44, 0xad, 0xa4, 0x41, 0x02, 0xab, - 0xca, 0x3a, 0xb0, 0xbc, 0xf9, 0x9b, 0x47, 0x4e, 0x46, 0xcb, 0x30, 0xa3, 0x4c, 0xd4, 0xab, 0xb1, - 0x1b, 0x70, 0xbd, 0x7b, 0xb4, 0x7a, 0xb4, 0xb3, 0xee, 0xc8, 0x97, 0x8e, 0xc4, 0x26, 0x88, 0x6a, - 0xf5, 0xec, 0x22, 0x51, 0xab, 0xc1, 0x96, 0xa0, 0x75, 0xb8, 0xfa, 0xc5, 0xde, 0xe6, 0xfe, 0x91, - 0xb3, 0xba, 0xb1, 0x61, 0x63, 0x85, 0xe6, 0x14, 0x54, 0xe0, 0xce, 0x8b, 0x8d, 0xda, 0x3b, 0x3c, - 0x44, 0x94, 0x96, 0xfa, 0x10, 0x25, 0x0b, 0x8f, 0x7f, 0xb7, 0x00, 0x4d, 0x0a, 0xc1, 0xa7, 0x5f, - 0x74, 0xe0, 0x21, 0xdb, 0x83, 0xb2, 0xfc, 0x69, 0x10, 0x76, 0x5d, 0x3f, 0x3e, 0x61, 0xfe, 0x18, - 0x49, 0x67, 0x79, 0x12, 0x2c, 0x8f, 0xdf, 0xe2, 0xdf, 0xfe, 0xb3, 0xbf, 0xfc, 0x27, 0xf9, 0x06, - 0xab, 0x3d, 0x3c, 0x7f, 0xef, 0xe1, 0x29, 0xf7, 0x23, 0xd1, 0xc6, 0xdf, 0x00, 0x48, 0x7e, 0xf0, - 0x82, 0xb5, 0xb5, 0x29, 0x71, 0xe2, 0xd7, 0x40, 0x3a, 0x37, 0x32, 0x4a, 0x64, 0xbb, 0x37, 0xb0, - 0xdd, 0x45, 0xab, 0x29, 0xda, 0xf5, 0x7c, 0x2f, 0xa6, 0x1f, 0xbf, 0xf8, 0x38, 0x77, 0x9f, 0xf5, - 0xa1, 0x6e, 0xfe, 0x14, 0x05, 0x53, 0xae, 0xf8, 0x8c, 0x1f, 0xd3, 0xe8, 0xdc, 0xcc, 0x2c, 0x53, - 0x3c, 0x07, 0xfb, 0xb8, 0x6e, 0xb5, 0x44, 0x1f, 0x63, 0xc4, 0x48, 0x7a, 0x19, 0x10, 0x17, 0x4e, - 0x7e, 0x71, 0x82, 0xbd, 0x62, 0x70, 0xc6, 0xa9, 0xdf, 0xbb, 0xe8, 0xdc, 0x9a, 0x51, 0x2a, 0xfb, - 0xba, 0x85, 0x7d, 0xad, 0x58, 0x4c, 0xf4, 0xd5, 0x43, 0x1c, 0xf5, 0x7b, 0x17, 0x1f, 0xe7, 0xee, - 0x3f, 0xfe, 0x8b, 0x7b, 0x50, 0xd5, 0x21, 0x39, 0xec, 0xb7, 0xa1, 0x91, 0xca, 0x91, 0x60, 0x6a, - 0x1a, 0x59, 0x29, 0x15, 0x9d, 0x57, 0xb2, 0x0b, 0x65, 0xc7, 0xaf, 0x62, 0xc7, 0x6d, 0xb6, 0x2c, - 0x3a, 0x96, 0x39, 0x08, 0x0f, 0x31, 0x93, 0x88, 0x9e, 0xf2, 0x78, 0x66, 0xdc, 0x36, 0xd4, 0xd9, - 0x2b, 0x93, 0x37, 0x40, 0xaa, 0xb7, 0x5b, 0x33, 0x4a, 0x65, 0x77, 0xaf, 0x60, 0x77, 0xcb, 0x6c, - 0xc9, 0xec, 0x4e, 0x05, 0xd0, 0x30, 0x8e, 0xcf, 0xe7, 0x98, 0x3f, 0xc8, 0xc0, 0x6e, 0x25, 0x8f, - 0x9d, 0x64, 0xfc, 0x50, 0x83, 0x26, 0x91, 0xe9, 0x5f, 0x6b, 0xb0, 0xda, 0xd8, 0x15, 0x63, 0xb8, - 0x7d, 0xe6, 0xef, 0x31, 0xb0, 0x63, 0xa8, 0x19, 0x6f, 0x18, 0xb3, 0x1b, 0x33, 0xdf, 0x5b, 0xee, - 0x74, 0xb2, 0x8a, 0xb2, 0xa6, 0x62, 0xb6, 0xff, 0x50, 0xc8, 0x9e, 0x3f, 0x86, 0xaa, 0x7e, 0x19, - 0x97, 0xad, 0x18, 0x2f, 0x15, 0x9b, 0x2f, 0xf9, 0x76, 0xda, 0xd3, 0x05, 0x59, 0xc4, 0x67, 0xb6, - 0x2e, 0x88, 0xef, 0x73, 0xa8, 0x19, 0xaf, 0xdf, 0xea, 0x09, 0x4c, 0xbf, 0xb0, 0xab, 0x27, 0x90, - 0xf1, 0x58, 0xae, 0xb5, 0x80, 0x5d, 0xd4, 0x58, 0x15, 0xe9, 0x3b, 0xbe, 0x0c, 0x22, 0xb6, 0x0b, - 0xd7, 0xe5, 0xcd, 0x7a, 0xcc, 0xbf, 0xc9, 0x36, 0x64, 0xfc, 0x06, 0xc6, 0xa3, 0x1c, 0xfb, 0x04, - 0x2a, 0xea, 0x91, 0x63, 0xb6, 0x9c, 0xfd, 0x58, 0x73, 0x67, 0x65, 0x0a, 0x2e, 0xaf, 0xc1, 0x2f, - 0x00, 0x92, 0xa7, 0x76, 0x35, 0x93, 0x98, 0x7a, 0xba, 0x57, 0x53, 0xc0, 0xf4, 0xbb, 0xbc, 0xd6, - 0x32, 0x4e, 0xb0, 0xc5, 0x90, 0x49, 0xf8, 0xfc, 0x42, 0xbd, 0x23, 0xf6, 0x13, 0xa8, 0x19, 0xaf, - 0xed, 0xea, 0xe5, 0x9b, 0x7e, 0xa9, 0x57, 0x2f, 0x5f, 0xc6, 0xe3, 0xbc, 0x56, 0x07, 0x5b, 0x5f, - 0xb2, 0xe6, 0x45, 0xeb, 0x91, 0x77, 0xea, 0x0f, 0x09, 0x41, 0x6c, 0xd0, 0x19, 0x34, 0x52, 0x4f, - 0xea, 0xea, 0x13, 0x9a, 0xf5, 0x60, 0xaf, 0x3e, 0xa1, 0x99, 0xaf, 0xf0, 0x2a, 0x3a, 0xb3, 0x16, - 0x44, 0x3f, 0xe7, 0x88, 0x62, 0xf4, 0xf4, 0x23, 0xa8, 0x19, 0xcf, 0xe3, 0xea, 0xb9, 0x4c, 0xbf, - 0xc4, 0xab, 0xe7, 0x92, 0xf5, 0x9a, 0xee, 0x12, 0xf6, 0xd1, 0xb4, 0x90, 0x14, 0xf0, 0x95, 0x26, - 0xd1, 0xf6, 0x6f, 0x43, 0x33, 0xfd, 0x62, 0xae, 0x3e, 0xfb, 0x99, 0x4f, 0xef, 0xea, 0xb3, 0x3f, - 0xe3, 0x99, 0x5d, 0x49, 0xd2, 0xf7, 0x17, 0x75, 0x27, 0x0f, 0xbf, 0x92, 0xc1, 0xc5, 0x5f, 0xb3, - 0xcf, 0x04, 0x83, 0x93, 0x8f, 0x84, 0xb1, 0x15, 0x83, 0x6a, 0xcd, 0xa7, 0xc4, 0xf4, 0x79, 0x99, - 0x7a, 0x4f, 0x2c, 0x4d, 0xcc, 0xd8, 0x38, 0xfb, 0x14, 0x16, 0x35, 0x31, 0xeb, 0x57, 0xbf, 0x22, - 0x3d, 0x87, 0xcc, 0xb7, 0xc5, 0x3a, 0xad, 0xc9, 0xd2, 0x47, 0x39, 0xba, 0xfe, 0xf0, 0xad, 0x25, - 0xe3, 0xfa, 0x33, 0x1f, 0xfe, 0x32, 0xae, 0xbf, 0xd4, 0x93, 0x4c, 0x93, 0xd7, 0x5f, 0xec, 0x89, - 0x36, 0x7c, 0x98, 0x9f, 0x7c, 0x83, 0xeb, 0xd6, 0xac, 0x0c, 0x54, 0x6a, 0xfe, 0xd5, 0xe7, 0x27, - 0xa8, 0xa6, 0x59, 0x91, 0xe2, 0xa6, 0x0f, 0xa5, 0x0b, 0x91, 0xfd, 0x16, 0xd4, 0xcd, 0x27, 0x3f, - 0x99, 0xc9, 0x13, 0x26, 0x7b, 0xba, 0x99, 0x59, 0x96, 0xa6, 0x12, 0x56, 0x37, 0xbb, 0x61, 0x3f, - 0x84, 0x65, 0xbd, 0xcc, 0x66, 0xf6, 0x61, 0xc4, 0x6e, 0x67, 0xe4, 0x24, 0xa6, 0x16, 0xfb, 0xc6, - 0xcc, 0xa4, 0xc5, 0x47, 0x39, 0x41, 0x7d, 0xe9, 0xb7, 0x07, 0x93, 0x9b, 0x27, 0xeb, 0xc9, 0xc5, - 0xe4, 0xe6, 0xc9, 0x7c, 0xb0, 0x50, 0x51, 0x1f, 0x5b, 0x4c, 0xad, 0x11, 0x05, 0x57, 0xb1, 0x1f, - 0xc1, 0xbc, 0x91, 0x5a, 0xd9, 0xbd, 0xf2, 0x7b, 0xfa, 0x24, 0x4d, 0x3f, 0xec, 0xd3, 0xc9, 0xd2, - 0x45, 0xad, 0x15, 0x6c, 0x7f, 0xc1, 0x4a, 0x2d, 0x8e, 0x38, 0x45, 0xeb, 0x50, 0x33, 0xd3, 0x36, - 0x9f, 0xd3, 0xee, 0x8a, 0x51, 0x64, 0xbe, 0x21, 0xf3, 0x28, 0xc7, 0x76, 0xa1, 0x35, 0xf9, 0xe4, - 0x85, 0xe6, 0x29, 0x59, 0xcf, 0x74, 0x74, 0x26, 0x0a, 0x53, 0x0f, 0x65, 0xb0, 0x43, 0x0a, 0xcf, - 0xd5, 0x3f, 0x18, 0x11, 0x84, 0x93, 0xb7, 0x7a, 0xfa, 0x87, 0x24, 0x74, 0x6b, 0x59, 0x3f, 0x21, - 0x72, 0x2f, 0xf7, 0x28, 0xc7, 0x7e, 0x3f, 0x07, 0xf5, 0x54, 0x9a, 0x79, 0x2a, 0x00, 0x72, 0x62, - 0x9e, 0x6d, 0xb3, 0xcc, 0x9c, 0xa8, 0x65, 0xe3, 0x22, 0xee, 0xde, 0xff, 0x41, 0x6a, 0x93, 0xbe, - 0x4a, 0x99, 0x72, 0x1f, 0x4c, 0xfe, 0xa2, 0xc4, 0xd7, 0x93, 0x08, 0xe6, 0x7b, 0x4d, 0x5f, 0x3f, - 0xca, 0xb1, 0xff, 0x90, 0x83, 0x66, 0xda, 0x47, 0xa3, 0xa7, 0x9b, 0xe9, 0x0d, 0xd2, 0xa4, 0x34, - 0xc3, 0xb1, 0xf3, 0x23, 0x1c, 0xe5, 0xd1, 0x7d, 0x3b, 0x35, 0x4a, 0xf9, 0x6a, 0xe6, 0x2f, 0x36, - 0x5a, 0xf6, 0x31, 0xfd, 0x80, 0x93, 0x72, 0x48, 0xb3, 0xe9, 0x1f, 0xfc, 0xd1, 0xe4, 0x67, 0xfe, - 0x3c, 0x0e, 0x6e, 0xc2, 0x4f, 0xe8, 0x97, 0x13, 0x94, 0x7f, 0x53, 0x50, 0xf1, 0xcb, 0xd6, 0xb7, - 0xde, 0xc0, 0x39, 0xbd, 0x6a, 0xdd, 0x48, 0xcd, 0x69, 0x52, 0xf0, 0x58, 0xa5, 0xd1, 0xc9, 0x5f, - 0xb7, 0x49, 0x6e, 0xce, 0xa9, 0x5f, 0xbc, 0x99, 0x3d, 0xc8, 0x21, 0x0d, 0x52, 0xa2, 0xa7, 0x8e, - 0xda, 0x4b, 0x36, 0x63, 0xdd, 0xc7, 0xb1, 0xbe, 0x61, 0xdd, 0x9e, 0x39, 0xd6, 0x87, 0xe8, 0x6f, - 0x11, 0x23, 0x3e, 0x04, 0x48, 0x02, 0x46, 0xd8, 0x44, 0xd8, 0x82, 0x66, 0x40, 0xd3, 0x31, 0x25, - 0xe9, 0xf3, 0xac, 0xa2, 0x1b, 0x44, 0x8b, 0x3f, 0x26, 0x76, 0xaa, 0x03, 0x2a, 0x4c, 0xe9, 0x2b, - 0x1d, 0xdb, 0x91, 0x92, 0xbe, 0x26, 0xdb, 0x4f, 0x31, 0x53, 0x1d, 0x3d, 0xf1, 0x14, 0x1a, 0xbb, - 0x41, 0xf0, 0x6c, 0x3c, 0xd2, 0x41, 0x8a, 0x69, 0x27, 0xe8, 0xb6, 0x1b, 0x9d, 0x75, 0x26, 0x66, - 0x61, 0xdd, 0xc1, 0xa6, 0x3a, 0xac, 0x6d, 0x34, 0xf5, 0xf0, 0xab, 0x24, 0x4a, 0xe5, 0x6b, 0xe6, - 0xc2, 0x82, 0xe6, 0xd1, 0x49, 0x24, 0x48, 0xba, 0x99, 0x14, 0x67, 0x9e, 0xec, 0x22, 0xa5, 0x26, - 0xa8, 0xd1, 0x3e, 0x8c, 0x54, 0x9b, 0x8f, 0x72, 0xec, 0x10, 0xea, 0x1b, 0xbc, 0x87, 0xe9, 0x96, - 0xe8, 0x4a, 0x5c, 0x4c, 0xb9, 0xa5, 0xc8, 0x07, 0xd9, 0x69, 0xa4, 0x80, 0xe9, 0x7b, 0x6b, 0xe4, - 0x5e, 0x85, 0xfc, 0xcb, 0x87, 0x5f, 0x49, 0x27, 0xe5, 0xd7, 0xea, 0xde, 0x52, 0x4e, 0xdc, 0xd4, - 0xbd, 0x35, 0xe1, 0xf5, 0x4d, 0xdd, 0x5b, 0x53, 0x5e, 0xdf, 0xd4, 0x52, 0x2b, 0x27, 0x32, 0x1b, - 0xc0, 0xc2, 0x94, 0xa3, 0x58, 0x5f, 0x59, 0xb3, 0xdc, 0xcb, 0x9d, 0x3b, 0xb3, 0x11, 0xd2, 0xbd, - 0xdd, 0x4f, 0xf7, 0xd6, 0x85, 0x06, 0x3d, 0x21, 0x75, 0xcc, 0x29, 0xf1, 0x62, 0xe2, 0xd5, 0x02, - 0x33, 0xab, 0x63, 0xf2, 0x82, 0xc1, 0xb2, 0xb4, 0x84, 0x83, 0x19, 0x0f, 0xec, 0xc7, 0x50, 0xfb, - 0x94, 0xc7, 0x2a, 0xd3, 0x42, 0xcb, 0xd8, 0x13, 0xa9, 0x17, 0x9d, 0x8c, 0x44, 0x8d, 0x34, 0xcd, - 0x60, 0x6b, 0x0f, 0x79, 0xff, 0x94, 0x13, 0x73, 0x72, 0xbc, 0xfe, 0xd7, 0xec, 0x37, 0xb1, 0x71, - 0x9d, 0xe0, 0xb6, 0x6c, 0x84, 0xd2, 0x9b, 0x8d, 0xcf, 0x4f, 0xc0, 0xb3, 0x5a, 0xf6, 0x83, 0x3e, - 0x37, 0x64, 0x3d, 0x1f, 0x6a, 0x46, 0x22, 0xac, 0x3e, 0x40, 0xd3, 0x89, 0xcf, 0xfa, 0x00, 0x65, - 0xe4, 0xcd, 0x5a, 0xf7, 0xb0, 0x1f, 0x8b, 0xdd, 0x49, 0xfa, 0xa1, 0x5c, 0xd9, 0xa4, 0xa7, 0x87, - 0x5f, 0xb9, 0xc3, 0xf8, 0x6b, 0xf6, 0x39, 0x3e, 0xd4, 0x6a, 0x66, 0x92, 0x24, 0x4a, 0xc3, 0x64, - 0xd2, 0x89, 0x5e, 0x2c, 0xa3, 0x28, 0xad, 0x48, 0x50, 0x57, 0x28, 0xc9, 0x7d, 0x00, 0xd0, 0x8d, - 0x83, 0xd1, 0x86, 0xcb, 0x87, 0x81, 0x9f, 0xf0, 0xda, 0x24, 0xb7, 0x21, 0xe1, 0x5f, 0x46, 0x82, - 0x03, 0xfb, 0xdc, 0xd0, 0xb2, 0x52, 0xc9, 0x38, 0x8a, 0xb8, 0x66, 0xa6, 0x3f, 0xe8, 0x05, 0xc9, - 0x48, 0x81, 0x78, 0x94, 0x63, 0xab, 0x00, 0x49, 0xa4, 0x80, 0xd6, 0x99, 0xa6, 0x82, 0x10, 0x34, - 0xdb, 0xcb, 0x08, 0x2b, 0x38, 0x84, 0x6a, 0xe2, 0x62, 0x5d, 0x49, 0xf2, 0xfa, 0x53, 0x0e, 0x59, - 0x7d, 0x83, 0x4f, 0xb9, 0x37, 0xad, 0x16, 0x2e, 0x15, 0xb0, 0x8a, 0x58, 0xaa, 0x13, 0xce, 0x23, - 0xe6, 0xc1, 0x22, 0x0d, 0x50, 0x8b, 0x4b, 0x18, 0x93, 0xaf, 0xdf, 0xe3, 0x9d, 0xf6, 0x34, 0xea, - 0xd3, 0x9c, 0xe9, 0x2f, 0x4b, 0x99, 0x7e, 0x04, 0xb5, 0x52, 0x3e, 0x80, 0x60, 0xcd, 0x43, 0x58, - 0x98, 0x72, 0xc9, 0xe8, 0x23, 0x3d, 0xcb, 0xc7, 0xa6, 0x8f, 0xf4, 0x4c, 0x6f, 0x8e, 0x75, 0x1d, - 0xbb, 0x9c, 0xb7, 0x00, 0x55, 0xbd, 0x0b, 0x2f, 0xee, 0x9d, 0x89, 0xee, 0xfe, 0x6d, 0x0e, 0x16, - 0x33, 0x9c, 0x2e, 0xec, 0x35, 0x65, 0x35, 0x98, 0xe9, 0x90, 0xe9, 0x64, 0x1a, 0xe7, 0xad, 0x2e, - 0xf6, 0xb3, 0xc7, 0x9e, 0xa4, 0x2e, 0x36, 0xb2, 0x8d, 0xcb, 0x93, 0xf9, 0x5c, 0xa1, 0x22, 0x53, - 0xa2, 0xf8, 0x12, 0x56, 0x68, 0x20, 0xab, 0x83, 0xc1, 0x84, 0xe3, 0xe0, 0xd5, 0xa9, 0x1f, 0x78, - 0x4d, 0x39, 0x43, 0x3a, 0xb3, 0x7f, 0x00, 0x76, 0x86, 0x38, 0x4d, 0x43, 0x65, 0x63, 0x68, 0x4d, - 0x1a, 0xe4, 0xd9, 0xec, 0xb6, 0x3a, 0xb7, 0x53, 0xfa, 0x6f, 0x86, 0x11, 0xff, 0x3b, 0xd8, 0xd9, - 0x6d, 0xab, 0x93, 0xb5, 0x2e, 0xa4, 0x12, 0x8b, 0xfd, 0xf8, 0x5b, 0xda, 0x7b, 0x30, 0x31, 0x4f, - 0xd5, 0xc1, 0x2c, 0x5f, 0x87, 0xd6, 0xc0, 0xb3, 0x9d, 0x0f, 0x6f, 0x62, 0xf7, 0x77, 0xac, 0x9b, - 0x59, 0xdd, 0x87, 0x54, 0x85, 0x74, 0xf1, 0x95, 0xc9, 0x73, 0xad, 0x46, 0x70, 0x27, 0x6b, 0xbf, - 0x67, 0xea, 0x42, 0x13, 0x6b, 0x7d, 0x0d, 0x65, 0xbb, 0xba, 0xe9, 0x2d, 0xd0, 0xc7, 0x27, 0xc3, - 0x2d, 0xa1, 0x8f, 0x4f, 0x96, 0x7b, 0x21, 0x2d, 0xd7, 0x28, 0xc7, 0xc2, 0xc7, 0xb9, 0xfb, 0x6b, - 0x77, 0x7f, 0xf4, 0x9d, 0x53, 0x2f, 0x3e, 0x1b, 0x1f, 0x3f, 0xe8, 0x05, 0xc3, 0x87, 0x03, 0x65, - 0x6d, 0x94, 0x89, 0x6b, 0x0f, 0x07, 0x7e, 0xff, 0x21, 0x36, 0x7b, 0x3c, 0x87, 0xbf, 0x48, 0xfd, - 0xdd, 0xff, 0x1b, 0x00, 0x00, 0xff, 0xff, 0x7d, 0xa1, 0xab, 0x8e, 0xc3, 0x7a, 0x00, 0x00, + // 11084 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x6b, 0x8f, 0x1b, 0x57, + 0x96, 0x98, 0xf8, 0x6a, 0x92, 0x87, 0x8f, 0x66, 0xdf, 0x7e, 0x51, 0x2d, 0xc9, 0x92, 0xcb, 0x1e, + 0x4b, 0x96, 0x6d, 0x49, 0xd6, 0xf8, 0xb5, 0x76, 0x32, 0xbb, 0xec, 0x6e, 0xb6, 0x9a, 0xa3, 0x7e, + 0xb9, 0xc8, 0xb6, 0xc7, 0x33, 0xd9, 0xd4, 0x54, 0x93, 0xb7, 0xbb, 0x6b, 0x45, 0x56, 0xd1, 0x55, + 0xc5, 0x7e, 0x8c, 0xe1, 0x7c, 0xc8, 0x63, 0x11, 0x24, 0x41, 0x80, 0x45, 0xb2, 0x01, 0xb2, 0xc9, + 0x22, 0x41, 0x82, 0x20, 0x08, 0x12, 0x2c, 0x36, 0x98, 0x0d, 0x90, 0x0f, 0xc9, 0xe7, 0xfd, 0x92, + 0x60, 0x3f, 0x6c, 0xf2, 0x25, 0x18, 0x2c, 0xb0, 0xc8, 0x62, 0xf2, 0x75, 0x7f, 0x41, 0x10, 0xdc, + 0x73, 0xee, 0xad, 0xba, 0x45, 0x56, 0x4b, 0xb2, 0x67, 0x32, 0x5f, 0xa4, 0xae, 0x73, 0xce, 0x7d, + 0x9f, 0x7b, 0xee, 0x79, 0xdd, 0x4b, 0x28, 0xfb, 0xe3, 0xfe, 0x83, 0xb1, 0xef, 0x85, 0x1e, 0x2b, + 0x0c, 0x5d, 0x7f, 0xdc, 0x5f, 0xbb, 0x79, 0xe2, 0x79, 0x27, 0x43, 0xfe, 0xd0, 0x1e, 0x3b, 0x0f, + 0x6d, 0xd7, 0xf5, 0x42, 0x3b, 0x74, 0x3c, 0x37, 0x20, 0x22, 0xe3, 0xc7, 0x50, 0x7f, 0xc2, 0xdd, + 0x2e, 0xe7, 0x03, 0x93, 0x7f, 0x39, 0xe1, 0x41, 0xc8, 0xde, 0x82, 0x05, 0x9b, 0xff, 0x84, 0xf3, + 0x81, 0x35, 0xb6, 0x83, 0x60, 0x7c, 0xea, 0xdb, 0x01, 0x6f, 0x66, 0xee, 0x64, 0xee, 0x55, 0xcd, + 0x06, 0x21, 0x0e, 0x22, 0x38, 0x7b, 0x15, 0xaa, 0x81, 0x20, 0xe5, 0x6e, 0xe8, 0x7b, 0xe3, 0xcb, + 0x66, 0x16, 0xe9, 0x2a, 0x02, 0xd6, 0x26, 0x90, 0x31, 0x84, 0xf9, 0xa8, 0x85, 0x60, 0xec, 0xb9, + 0x01, 0x67, 0x8f, 0x60, 0xa9, 0xef, 0x8c, 0x4f, 0xb9, 0x6f, 0x61, 0xe1, 0x91, 0xcb, 0x47, 0x9e, + 0xeb, 0xf4, 0x9b, 0x99, 0x3b, 0xb9, 0x7b, 0x65, 0x93, 0x11, 0x4e, 0x94, 0xd8, 0x95, 0x18, 0x76, + 0x17, 0xe6, 0xb9, 0x4b, 0x70, 0x3e, 0xc0, 0x52, 0xb2, 0xa9, 0x7a, 0x0c, 0x16, 0x05, 0x8c, 0xbf, + 0x9b, 0x85, 0x85, 0x8e, 0xeb, 0x84, 0x9f, 0xdb, 0xc3, 0x21, 0x0f, 0xd5, 0x98, 0xee, 0xc2, 0xfc, + 0x39, 0x02, 0x70, 0x4c, 0xe7, 0x9e, 0x3f, 0x90, 0x23, 0xaa, 0x13, 0xf8, 0x40, 0x42, 0xaf, 0xec, + 0x59, 0xf6, 0xca, 0x9e, 0xa5, 0x4e, 0x57, 0xee, 0x8a, 0xe9, 0xba, 0x0b, 0xf3, 0x3e, 0xef, 0x7b, + 0x67, 0xdc, 0xbf, 0xb4, 0xce, 0x1d, 0x77, 0xe0, 0x9d, 0x37, 0xf3, 0x77, 0x32, 0xf7, 0x0a, 0x66, + 0x5d, 0x81, 0x3f, 0x47, 0x28, 0x5b, 0x87, 0xf9, 0xfe, 0xa9, 0xed, 0xba, 0x7c, 0x68, 0x1d, 0xd9, + 0xfd, 0x67, 0x93, 0x71, 0xd0, 0x2c, 0xdc, 0xc9, 0xdc, 0xab, 0x3c, 0xbe, 0xfe, 0x00, 0x57, 0xf5, + 0xc1, 0xc6, 0xa9, 0xed, 0xae, 0x23, 0xa6, 0xeb, 0xda, 0xe3, 0xe0, 0xd4, 0x0b, 0xcd, 0xba, 0x2c, + 0x41, 0xe0, 0xc0, 0x58, 0x02, 0xa6, 0xcf, 0x04, 0xcd, 0xbd, 0xf1, 0xef, 0x33, 0xb0, 0x78, 0xe8, + 0x0e, 0xbd, 0xfe, 0xb3, 0x6f, 0x39, 0x45, 0x29, 0x63, 0xc8, 0xbe, 0xec, 0x18, 0x72, 0xdf, 0x74, + 0x0c, 0x2b, 0xb0, 0x94, 0xec, 0xac, 0x1c, 0x05, 0x87, 0x65, 0x51, 0xfa, 0x84, 0xab, 0x6e, 0xa9, + 0x61, 0xbc, 0x09, 0x8d, 0xfe, 0xc4, 0xf7, 0xb9, 0x3b, 0x33, 0x8e, 0x79, 0x09, 0x8f, 0x06, 0xf2, + 0x2a, 0x54, 0x5d, 0x7e, 0x1e, 0x93, 0x49, 0xde, 0x75, 0xf9, 0xb9, 0x22, 0x31, 0x9a, 0xb0, 0x32, + 0xdd, 0x8c, 0xec, 0xc0, 0xcf, 0x33, 0x90, 0x3f, 0x0c, 0x2f, 0x3c, 0xf6, 0x3e, 0x54, 0xed, 0xc1, + 0xc0, 0xe7, 0x41, 0x60, 0x85, 0x97, 0x63, 0xda, 0x29, 0xf5, 0xc7, 0x4c, 0x0e, 0xb1, 0x45, 0xa8, + 0xde, 0xe5, 0x98, 0x9b, 0x15, 0x3b, 0xfe, 0x60, 0x4d, 0x28, 0xca, 0x4f, 0x6c, 0xb7, 0x6c, 0xaa, + 0x4f, 0x76, 0x0b, 0xc0, 0x1e, 0x79, 0x13, 0x37, 0xb4, 0x02, 0x3b, 0xc4, 0x19, 0xcb, 0x99, 0x65, + 0x82, 0x74, 0xed, 0x90, 0xdd, 0x80, 0xf2, 0xf8, 0x99, 0x15, 0xf4, 0x7d, 0x67, 0x1c, 0x22, 0xf3, + 0x94, 0xcd, 0xd2, 0xf8, 0x59, 0x17, 0xbf, 0xd9, 0x5b, 0x50, 0xf2, 0x26, 0xe1, 0xd8, 0x73, 0xdc, + 0x50, 0xf2, 0xcb, 0xbc, 0xec, 0xc8, 0xfe, 0x24, 0x3c, 0x10, 0x60, 0x33, 0x22, 0x60, 0xaf, 0x43, + 0xad, 0xef, 0xb9, 0xc7, 0x8e, 0x3f, 0x22, 0x89, 0xd0, 0x9c, 0xc3, 0xb6, 0x92, 0x40, 0xe3, 0x0f, + 0xb3, 0x50, 0xe9, 0xf9, 0xb6, 0x1b, 0xd8, 0x7d, 0x01, 0x60, 0xab, 0x50, 0x0c, 0x2f, 0xac, 0x53, + 0x3b, 0x38, 0xc5, 0xa1, 0x96, 0xcd, 0xb9, 0xf0, 0x62, 0xdb, 0x0e, 0x4e, 0xd9, 0x0a, 0xcc, 0x51, + 0x2f, 0x71, 0x40, 0x39, 0x53, 0x7e, 0x89, 0x0d, 0xe2, 0x4e, 0x46, 0x56, 0xb2, 0xa9, 0x1c, 0x72, + 0x4c, 0xc3, 0x9d, 0x8c, 0x36, 0x74, 0xb8, 0x18, 0xfc, 0x91, 0x58, 0x6e, 0x6a, 0x80, 0x86, 0x57, + 0x46, 0x08, 0xb6, 0xf1, 0x2a, 0x54, 0x25, 0x9a, 0x3b, 0x27, 0xa7, 0x34, 0xc6, 0x82, 0x59, 0x21, + 0x02, 0x04, 0x89, 0x1a, 0x42, 0x67, 0xc4, 0xad, 0x20, 0xb4, 0x47, 0x63, 0x39, 0xa4, 0xb2, 0x80, + 0x74, 0x05, 0x00, 0xd1, 0x5e, 0x68, 0x0f, 0xad, 0x63, 0xce, 0x83, 0x66, 0x51, 0xa2, 0x05, 0x64, + 0x8b, 0xf3, 0x80, 0x7d, 0x07, 0xea, 0x03, 0x1e, 0x84, 0x96, 0x5c, 0x0c, 0x1e, 0x34, 0x4b, 0xb8, + 0xf3, 0x6b, 0x02, 0xda, 0x52, 0x40, 0x76, 0x13, 0xc0, 0xb7, 0xcf, 0x2d, 0x31, 0x11, 0xfc, 0xa2, + 0x59, 0xa6, 0x55, 0xf0, 0xed, 0xf3, 0xde, 0xc5, 0x36, 0xbf, 0x10, 0x5c, 0xf3, 0x84, 0x87, 0xda, + 0xa4, 0x05, 0x92, 0x3b, 0x8d, 0x1d, 0x60, 0x1a, 0x78, 0x93, 0x87, 0xb6, 0x33, 0x0c, 0xd8, 0x07, + 0x50, 0x0d, 0x35, 0x62, 0x14, 0x83, 0x95, 0x88, 0x85, 0xb4, 0x02, 0x66, 0x82, 0xce, 0x38, 0x85, + 0xd2, 0x16, 0xe7, 0x3b, 0xce, 0xc8, 0x09, 0xd9, 0x0a, 0x14, 0x8e, 0x9d, 0x0b, 0x4e, 0xcc, 0x9e, + 0xdb, 0xbe, 0x66, 0xd2, 0x27, 0xbb, 0x0d, 0x80, 0x7f, 0x58, 0xa3, 0x88, 0x9b, 0xb6, 0xaf, 0x99, + 0x65, 0x84, 0xed, 0x06, 0x76, 0xc8, 0xd6, 0xa0, 0x38, 0xe6, 0x7e, 0x9f, 0xab, 0x75, 0xdb, 0xbe, + 0x66, 0x2a, 0xc0, 0x7a, 0x11, 0x0a, 0x43, 0x51, 0xbb, 0xf1, 0xc7, 0x05, 0xa8, 0x74, 0xb9, 0x1b, + 0xed, 0x32, 0x06, 0x79, 0x31, 0x21, 0x72, 0x67, 0xe1, 0xdf, 0xec, 0x35, 0xa8, 0xe0, 0xd4, 0x05, + 0xa1, 0xef, 0xb8, 0x27, 0xc4, 0xd5, 0xeb, 0xd9, 0x66, 0xc6, 0x04, 0x01, 0xee, 0x22, 0x94, 0x35, + 0x20, 0x67, 0x8f, 0x14, 0x57, 0x8b, 0x3f, 0xd9, 0x75, 0x28, 0xd9, 0xa3, 0x90, 0xba, 0x57, 0x45, + 0x70, 0xd1, 0x1e, 0x85, 0xd8, 0xb5, 0x57, 0xa1, 0x3a, 0xb6, 0x2f, 0x47, 0x62, 0x2f, 0x47, 0xec, + 0x50, 0x35, 0x2b, 0x12, 0x86, 0x0c, 0xf1, 0x18, 0x16, 0x75, 0x12, 0xd5, 0x78, 0x21, 0x6a, 0x7c, + 0x41, 0xa3, 0x96, 0x7d, 0xb8, 0x0b, 0xf3, 0xaa, 0x8c, 0x4f, 0xe3, 0x41, 0x36, 0x29, 0x9b, 0x75, + 0x09, 0x56, 0xa3, 0xbc, 0x07, 0x8d, 0x63, 0xc7, 0xb5, 0x87, 0x56, 0x7f, 0x18, 0x9e, 0x59, 0x03, + 0x3e, 0x0c, 0x6d, 0xe4, 0x98, 0x82, 0x59, 0x47, 0xf8, 0xc6, 0x30, 0x3c, 0xdb, 0x14, 0x50, 0xf6, + 0x36, 0x94, 0x8f, 0x39, 0xb7, 0x70, 0xb2, 0x9a, 0xa5, 0xc4, 0xc6, 0x53, 0x2b, 0x64, 0x96, 0x8e, + 0xd5, 0x5a, 0xbd, 0x0d, 0x0d, 0x6f, 0x12, 0x9e, 0x78, 0x8e, 0x7b, 0x62, 0x09, 0x79, 0x67, 0x39, + 0x03, 0xe4, 0xa1, 0xfc, 0x7a, 0xf6, 0x51, 0xc6, 0xac, 0x2b, 0x9c, 0x90, 0x3c, 0x9d, 0x01, 0x7b, + 0x03, 0xe6, 0x87, 0x76, 0x10, 0x5a, 0xa7, 0xde, 0xd8, 0x1a, 0x4f, 0x8e, 0x9e, 0xf1, 0xcb, 0x66, + 0x0d, 0x27, 0xa2, 0x26, 0xc0, 0xdb, 0xde, 0xf8, 0x00, 0x81, 0x82, 0xb3, 0xb1, 0x9f, 0xd4, 0x09, + 0xb8, 0x93, 0xb9, 0x57, 0x33, 0xcb, 0x02, 0x42, 0x8d, 0x7e, 0x01, 0x8b, 0xb8, 0x3c, 0xfd, 0x49, + 0x10, 0x7a, 0x23, 0x4b, 0xc8, 0x6a, 0x7f, 0x10, 0x34, 0x2b, 0xc8, 0x6b, 0x6f, 0xca, 0xce, 0x6a, + 0x6b, 0xfc, 0x60, 0x93, 0x07, 0xe1, 0x06, 0x12, 0x9b, 0x44, 0x2b, 0x0e, 0xf4, 0x4b, 0x73, 0x61, + 0x30, 0x0d, 0x67, 0x6f, 0x03, 0xb3, 0x87, 0x43, 0xef, 0xdc, 0x0a, 0xf8, 0xf0, 0xd8, 0x92, 0x93, + 0xd8, 0xac, 0xdf, 0xc9, 0xdc, 0x2b, 0x99, 0x0d, 0xc4, 0x74, 0xf9, 0xf0, 0xf8, 0x80, 0xe0, 0xec, + 0x03, 0xc0, 0xcd, 0x64, 0x1d, 0x73, 0x3b, 0x9c, 0xf8, 0x3c, 0x68, 0xce, 0xdf, 0xc9, 0xdd, 0xab, + 0x3f, 0x5e, 0x88, 0xe6, 0x0b, 0xc1, 0xeb, 0x4e, 0x68, 0x56, 0x05, 0x9d, 0xfc, 0x0e, 0xd6, 0x36, + 0x61, 0x25, 0xbd, 0x4b, 0x82, 0xa9, 0xc4, 0xac, 0x08, 0x66, 0xcc, 0x9b, 0xe2, 0x4f, 0xb6, 0x04, + 0x85, 0x33, 0x7b, 0x38, 0xe1, 0x52, 0xa6, 0xd3, 0xc7, 0xc7, 0xd9, 0x8f, 0x32, 0xc6, 0x1f, 0x65, + 0xa0, 0x4a, 0xa3, 0x94, 0xba, 0xc8, 0x6b, 0x50, 0x53, 0xdc, 0xc0, 0x7d, 0xdf, 0xf3, 0xa5, 0x54, + 0x53, 0x9c, 0xd7, 0x16, 0x30, 0x71, 0xaa, 0x28, 0xa2, 0xb1, 0xcf, 0x9d, 0x91, 0x7d, 0xa2, 0xaa, + 0x56, 0xac, 0x74, 0x20, 0xc1, 0xec, 0xdd, 0xb8, 0x3e, 0xdf, 0x9b, 0x84, 0x5c, 0x9e, 0x79, 0x55, + 0x39, 0x3c, 0x53, 0xc0, 0xa2, 0xda, 0xf1, 0xeb, 0x25, 0xf8, 0xdc, 0xf8, 0xdd, 0x0c, 0x30, 0xd1, + 0xed, 0x9e, 0x47, 0x15, 0x48, 0x0e, 0x9d, 0x2e, 0x99, 0x79, 0xe9, 0x1d, 0x92, 0x7d, 0xde, 0x0e, + 0x31, 0xa0, 0x40, 0x7d, 0xcf, 0xa7, 0xf4, 0x9d, 0x50, 0xdf, 0xcf, 0x97, 0x72, 0x8d, 0xbc, 0xf1, + 0xbf, 0x72, 0xb0, 0xb4, 0x41, 0x47, 0x76, 0xab, 0xdf, 0xe7, 0xe3, 0x68, 0xef, 0xdc, 0x86, 0x8a, + 0xeb, 0x0d, 0xb8, 0xe2, 0x58, 0xea, 0x18, 0x08, 0x90, 0xc6, 0xae, 0xa7, 0xb6, 0xe3, 0x52, 0xc7, + 0x69, 0x32, 0xcb, 0x08, 0xc1, 0x6e, 0xbf, 0x01, 0xf3, 0x63, 0xee, 0x0e, 0xf4, 0x2d, 0x42, 0x4a, + 0x55, 0x4d, 0x82, 0xe5, 0xee, 0xb8, 0x0d, 0x95, 0xe3, 0x09, 0xd1, 0x09, 0xc1, 0x92, 0x47, 0x1e, + 0x00, 0x09, 0x6a, 0x91, 0x7c, 0x19, 0x4f, 0x82, 0x53, 0xc4, 0x16, 0x10, 0x5b, 0x14, 0xdf, 0x02, + 0x75, 0x0b, 0x60, 0x30, 0x09, 0x42, 0xb9, 0x63, 0xe6, 0x10, 0x59, 0x16, 0x10, 0xda, 0x31, 0xef, + 0xc0, 0xe2, 0xc8, 0xbe, 0xb0, 0x90, 0x77, 0x2c, 0xc7, 0xb5, 0x8e, 0x87, 0x78, 0xe6, 0x14, 0x91, + 0xae, 0x31, 0xb2, 0x2f, 0x3e, 0x13, 0x98, 0x8e, 0xbb, 0x85, 0x70, 0x21, 0x56, 0x94, 0xba, 0xe3, + 0xf3, 0x80, 0xfb, 0x67, 0x1c, 0x25, 0x41, 0x3e, 0xd2, 0x69, 0x4c, 0x82, 0x8a, 0x1e, 0x8d, 0xc4, + 0xb8, 0xc3, 0x61, 0x9f, 0xb6, 0xbd, 0x59, 0x1c, 0x39, 0xee, 0x76, 0x38, 0xec, 0x8b, 0x73, 0x45, + 0xc8, 0x91, 0x31, 0xf7, 0xad, 0x67, 0xe7, 0xb8, 0x87, 0xf3, 0x28, 0x37, 0x0e, 0xb8, 0xff, 0xf4, + 0x5c, 0x1c, 0xfd, 0xfd, 0x00, 0x05, 0x91, 0x7d, 0xd9, 0xac, 0xe0, 0x06, 0x2f, 0xf5, 0x03, 0x21, + 0x82, 0xec, 0x4b, 0xb1, 0x09, 0x45, 0x6f, 0x6d, 0x5c, 0x05, 0x3e, 0xc0, 0xea, 0x03, 0x94, 0xa8, + 0x35, 0xec, 0x6c, 0x4b, 0x22, 0x44, 0x3b, 0x81, 0xe0, 0x7a, 0xd5, 0xd9, 0xe3, 0xa1, 0x7d, 0x12, + 0xa0, 0x48, 0xa9, 0x99, 0x55, 0x09, 0xdc, 0x12, 0x30, 0xe3, 0x73, 0x52, 0xb2, 0xb4, 0xb5, 0x95, + 0x7b, 0x46, 0x1c, 0xf5, 0x08, 0xc1, 0x75, 0x2d, 0x99, 0xf2, 0x2b, 0x6d, 0xd1, 0xb2, 0x29, 0x8b, + 0x66, 0xfc, 0x7e, 0x06, 0xaa, 0xb2, 0x66, 0x54, 0x4a, 0xd8, 0x03, 0x60, 0x6a, 0x15, 0xc3, 0x0b, + 0x67, 0x60, 0x1d, 0x5d, 0x86, 0x3c, 0x20, 0xa6, 0xd9, 0xbe, 0x66, 0x36, 0x24, 0xae, 0x77, 0xe1, + 0x0c, 0xd6, 0x05, 0x86, 0xdd, 0x87, 0x46, 0x82, 0x3e, 0x08, 0x7d, 0xe2, 0xe8, 0xed, 0x6b, 0x66, + 0x5d, 0xa3, 0xee, 0x86, 0xbe, 0xd8, 0x23, 0x42, 0xe5, 0x99, 0x84, 0x96, 0xe3, 0x0e, 0xf8, 0x05, + 0xb2, 0x51, 0xcd, 0xac, 0x10, 0xac, 0x23, 0x40, 0xeb, 0x75, 0xa8, 0xea, 0xd5, 0x19, 0x27, 0x50, + 0x52, 0xfa, 0x12, 0x2a, 0x0c, 0x53, 0x5d, 0x32, 0xcb, 0x61, 0xd4, 0x93, 0xeb, 0x50, 0x4a, 0xf6, + 0xc0, 0x2c, 0x86, 0x2f, 0xdd, 0xb0, 0xf1, 0x3d, 0x68, 0xec, 0x08, 0xe6, 0x71, 0x05, 0xb3, 0x4a, + 0xfd, 0x6f, 0x05, 0xe6, 0xb4, 0x4d, 0x53, 0x36, 0xe5, 0x97, 0x38, 0x73, 0x4f, 0xbd, 0x20, 0x94, + 0xad, 0xe0, 0xdf, 0xc6, 0x1f, 0x67, 0x80, 0xb5, 0x83, 0xd0, 0x19, 0xd9, 0x21, 0xdf, 0xe2, 0x91, + 0x58, 0xd8, 0x87, 0xaa, 0xa8, 0xad, 0xe7, 0xb5, 0x48, 0x21, 0x23, 0x85, 0xe2, 0x2d, 0xb9, 0x8d, + 0x67, 0x0b, 0x3c, 0xd0, 0xa9, 0x49, 0xcc, 0x27, 0x2a, 0x10, 0xbb, 0x2c, 0xb4, 0xfd, 0x13, 0x1e, + 0xa2, 0x1a, 0x27, 0xf5, 0x7d, 0x20, 0x90, 0x50, 0xe0, 0xd6, 0x7e, 0x1d, 0x16, 0x66, 0xea, 0xd0, + 0xe5, 0x72, 0x39, 0x45, 0x2e, 0xe7, 0x74, 0xb9, 0x6c, 0xc1, 0x62, 0xa2, 0x5f, 0x92, 0xd3, 0x56, + 0xa1, 0x28, 0x36, 0x84, 0x50, 0x0e, 0x32, 0xa4, 0x55, 0x1e, 0x73, 0x2e, 0xd4, 0xe0, 0x87, 0xb0, + 0x74, 0xcc, 0xb9, 0x6f, 0x87, 0x88, 0xc4, 0x1d, 0x23, 0x56, 0x48, 0x56, 0xbc, 0x20, 0x71, 0x5d, + 0x3b, 0x3c, 0xe0, 0xbe, 0x58, 0x29, 0xe3, 0x7f, 0x67, 0x60, 0x5e, 0x48, 0xd0, 0x5d, 0xdb, 0xbd, + 0x54, 0xf3, 0xb4, 0x93, 0x3a, 0x4f, 0xf7, 0xb4, 0xc3, 0x50, 0xa3, 0xfe, 0xa6, 0x93, 0x94, 0x9b, + 0x9e, 0x24, 0x76, 0x07, 0xaa, 0x89, 0xbe, 0x16, 0xb0, 0xaf, 0x10, 0x44, 0x9d, 0xfc, 0xc5, 0xa7, + 0xf1, 0x0d, 0x68, 0xc4, 0xdd, 0x96, 0x73, 0xc8, 0x20, 0x2f, 0x58, 0x52, 0x56, 0x80, 0x7f, 0x1b, + 0xff, 0x3c, 0x43, 0x84, 0x1b, 0x9e, 0x13, 0x69, 0xa7, 0x82, 0x50, 0xe8, 0xbd, 0x8a, 0x50, 0xfc, + 0x7d, 0xa5, 0x56, 0xff, 0x8b, 0x0f, 0x56, 0x6c, 0x9d, 0x80, 0xbb, 0x03, 0xcb, 0x1e, 0x0e, 0x51, + 0xf8, 0x96, 0xcc, 0xa2, 0xf8, 0x6e, 0x0d, 0x87, 0xc6, 0x5d, 0x58, 0xd0, 0x7a, 0xf7, 0x9c, 0x71, + 0xec, 0x01, 0xdb, 0x71, 0x82, 0xf0, 0xd0, 0x0d, 0xc6, 0x9a, 0xe2, 0x76, 0x03, 0xca, 0x42, 0xc2, + 0x8a, 0x9e, 0xd1, 0x96, 0x2d, 0x98, 0x42, 0xe4, 0x8a, 0x7e, 0x05, 0x88, 0xb4, 0x2f, 0x24, 0x32, + 0x2b, 0x91, 0xf6, 0x05, 0x22, 0x8d, 0x8f, 0x60, 0x31, 0x51, 0x9f, 0x6c, 0xfa, 0x55, 0x28, 0x4c, + 0xc2, 0x0b, 0x4f, 0xa9, 0xe6, 0x15, 0xc9, 0x21, 0xc2, 0x00, 0x34, 0x09, 0x63, 0x7c, 0x02, 0x0b, + 0x7b, 0xfc, 0x5c, 0x6e, 0x62, 0xd5, 0x91, 0x37, 0x20, 0xff, 0x02, 0xa3, 0x10, 0xf1, 0xc6, 0x03, + 0x60, 0x7a, 0x61, 0xd9, 0xaa, 0x66, 0x23, 0x66, 0x12, 0x36, 0xa2, 0xf1, 0x06, 0xb0, 0xae, 0x73, + 0xe2, 0xee, 0xf2, 0x20, 0xb0, 0x4f, 0xa2, 0x6d, 0xdf, 0x80, 0xdc, 0x28, 0x38, 0x91, 0x32, 0x4a, + 0xfc, 0x69, 0x7c, 0x17, 0x16, 0x13, 0x74, 0xb2, 0xe2, 0x9b, 0x50, 0x0e, 0x9c, 0x13, 0x17, 0x15, + 0x2b, 0x59, 0x75, 0x0c, 0x30, 0xb6, 0x60, 0xe9, 0x33, 0xee, 0x3b, 0xc7, 0x97, 0x2f, 0xaa, 0x3e, + 0x59, 0x4f, 0x76, 0xba, 0x9e, 0x36, 0x2c, 0x4f, 0xd5, 0x23, 0x9b, 0x27, 0xf6, 0x95, 0x2b, 0x59, + 0x32, 0xe9, 0x43, 0x93, 0x7b, 0x59, 0x5d, 0xee, 0x19, 0x87, 0xc0, 0x36, 0x3c, 0xd7, 0xe5, 0xfd, + 0xf0, 0x80, 0x73, 0x3f, 0xf6, 0x52, 0xc5, 0xbc, 0x5a, 0x79, 0xbc, 0x2a, 0x67, 0x76, 0x5a, 0x98, + 0x4a, 0x26, 0x66, 0x90, 0x1f, 0x73, 0x7f, 0x84, 0x15, 0x97, 0x4c, 0xfc, 0xdb, 0x58, 0x86, 0xc5, + 0x44, 0xb5, 0xd2, 0xae, 0x7f, 0x04, 0xcb, 0x9b, 0x4e, 0xd0, 0x9f, 0x6d, 0x70, 0x15, 0x8a, 0xe3, + 0xc9, 0x91, 0x95, 0x94, 0xcb, 0x4f, 0xf9, 0xa5, 0xb0, 0xf6, 0xa6, 0x4b, 0xc8, 0xba, 0xfe, 0x76, + 0x06, 0xf2, 0xdb, 0xbd, 0x9d, 0x0d, 0xb6, 0x06, 0x25, 0xc7, 0xed, 0x7b, 0x23, 0xa1, 0x78, 0xd1, + 0x98, 0xa3, 0xef, 0x2b, 0x37, 0xd8, 0x0d, 0x28, 0xa3, 0xbe, 0x26, 0x4c, 0x5b, 0xa9, 0xfa, 0x94, + 0x04, 0x60, 0xc7, 0xeb, 0x3f, 0x13, 0x36, 0x35, 0xbf, 0x18, 0x3b, 0x3e, 0x5a, 0xcd, 0xca, 0x18, + 0xce, 0xd3, 0x59, 0x1f, 0x23, 0xc8, 0x22, 0x36, 0xfe, 0x43, 0x11, 0x8a, 0xf2, 0xb4, 0xa5, 0x93, + 0x3b, 0x74, 0xce, 0x78, 0x7c, 0x72, 0x8b, 0x2f, 0xa1, 0x0f, 0xf8, 0x7c, 0xe4, 0x85, 0x91, 0xc2, + 0x46, 0x6b, 0x50, 0x25, 0xa0, 0x54, 0xd9, 0x34, 0xa5, 0x81, 0x5c, 0x0c, 0x39, 0x22, 0xea, 0xeb, + 0x47, 0xf9, 0x0d, 0x28, 0xaa, 0xb3, 0x3f, 0x1f, 0xd9, 0x34, 0x73, 0x7d, 0xd2, 0xd6, 0xd6, 0xa0, + 0xd4, 0xb7, 0xc7, 0x76, 0xdf, 0x09, 0x2f, 0xa5, 0x40, 0x88, 0xbe, 0x45, 0xed, 0x43, 0xaf, 0x6f, + 0x0f, 0xad, 0x23, 0x7b, 0x68, 0xbb, 0x7d, 0x2e, 0x6d, 0xf7, 0x2a, 0x02, 0xd7, 0x09, 0x26, 0xec, + 0x73, 0xd9, 0x4f, 0x45, 0x45, 0x26, 0xbc, 0xec, 0xbd, 0x22, 0x13, 0xca, 0xa5, 0x37, 0x1a, 0x39, + 0xc2, 0xca, 0x20, 0x35, 0x2c, 0x67, 0x96, 0x09, 0xb2, 0xc5, 0x71, 0xb4, 0x12, 0x7d, 0x4e, 0x53, + 0x57, 0xa6, 0xa6, 0x08, 0xf8, 0x39, 0x39, 0x12, 0x66, 0x75, 0xb1, 0x9c, 0xa6, 0x8b, 0xbd, 0x05, + 0x0b, 0x13, 0x37, 0xe0, 0x61, 0x38, 0xe4, 0x83, 0xa8, 0x2f, 0x15, 0x24, 0x6a, 0x44, 0x08, 0xd5, + 0x9d, 0x07, 0xb0, 0x48, 0x4e, 0x87, 0xc0, 0x0e, 0xbd, 0xe0, 0xd4, 0x09, 0xac, 0x40, 0x58, 0x48, + 0x64, 0xee, 0x2e, 0x20, 0xaa, 0x2b, 0x31, 0x5d, 0x32, 0x91, 0x56, 0xa7, 0xe8, 0x7d, 0xde, 0xe7, + 0xce, 0x19, 0x1f, 0xa0, 0x9e, 0x96, 0x33, 0x97, 0x13, 0x65, 0x4c, 0x89, 0x44, 0xa5, 0x7b, 0x32, + 0xb2, 0x26, 0xe3, 0x81, 0x2d, 0x94, 0x95, 0x3a, 0x29, 0xc3, 0xee, 0x64, 0x74, 0x48, 0x10, 0xf6, + 0x08, 0x94, 0x26, 0x26, 0xf5, 0xc3, 0xf9, 0x84, 0x3c, 0x13, 0xcc, 0x6a, 0x56, 0x25, 0x05, 0x29, + 0x8a, 0x09, 0x9d, 0xb3, 0x31, 0xa5, 0x73, 0x36, 0xa1, 0x38, 0xf6, 0x9d, 0x33, 0x3b, 0xe4, 0xcd, + 0x05, 0x12, 0xe0, 0xf2, 0x53, 0x48, 0x06, 0xc7, 0x75, 0x42, 0xc7, 0x0e, 0x3d, 0xbf, 0xc9, 0x10, + 0x17, 0x03, 0xd8, 0x7d, 0x58, 0x40, 0x1e, 0x09, 0x42, 0x3b, 0x9c, 0x04, 0x52, 0x03, 0x5d, 0x44, + 0x66, 0x42, 0x1d, 0xba, 0x8b, 0x70, 0x54, 0x42, 0xd9, 0x77, 0x61, 0x85, 0xd8, 0x02, 0x4b, 0x48, + 0xcd, 0x1a, 0x15, 0x82, 0x25, 0x9c, 0x8a, 0x45, 0xc4, 0x0a, 0xfe, 0x96, 0xfa, 0xb5, 0xd0, 0x0e, + 0xde, 0x87, 0x55, 0xc9, 0x26, 0x33, 0xa5, 0x96, 0xb1, 0xd4, 0x12, 0xa1, 0xa7, 0x8a, 0xdd, 0x87, + 0x05, 0xd1, 0x25, 0xa7, 0x6f, 0xc9, 0xd2, 0x62, 0x27, 0xac, 0x60, 0xef, 0xe7, 0x09, 0x61, 0x22, + 0xfc, 0x29, 0xbf, 0x14, 0xac, 0x3c, 0x74, 0x8e, 0x79, 0xe8, 0x8c, 0x78, 0x73, 0x95, 0x98, 0x43, + 0x7d, 0x8b, 0x5d, 0x36, 0x19, 0x23, 0xa6, 0x49, 0x7b, 0x9a, 0xbe, 0x90, 0xef, 0x86, 0x5e, 0xc0, + 0x95, 0x7b, 0xa9, 0x79, 0x5d, 0x6e, 0x20, 0x01, 0x94, 0x22, 0xcb, 0xf8, 0x69, 0x86, 0xce, 0x20, + 0xb9, 0x65, 0x03, 0xcd, 0xa2, 0xa2, 0xcd, 0x6a, 0x79, 0xee, 0xf0, 0x52, 0xee, 0x5f, 0x20, 0xd0, + 0xbe, 0x3b, 0xc4, 0x0d, 0xe4, 0xb8, 0x3a, 0x09, 0x89, 0xbb, 0xaa, 0x02, 0x22, 0xd1, 0x6d, 0xa8, + 0x8c, 0x27, 0x47, 0x43, 0xa7, 0x4f, 0x24, 0x39, 0xaa, 0x85, 0x40, 0x48, 0x20, 0x4c, 0x4a, 0x5a, + 0x44, 0xa2, 0xc8, 0x23, 0x45, 0x45, 0xc2, 0x90, 0x04, 0xc5, 0x29, 0xf7, 0x71, 0x07, 0x57, 0x4d, + 0xfc, 0xdb, 0x58, 0x87, 0xa5, 0x64, 0xa7, 0xa5, 0xac, 0xbf, 0x0f, 0x25, 0x29, 0x1e, 0x94, 0xaf, + 0xa1, 0xae, 0x79, 0x7f, 0x85, 0x55, 0x14, 0xe1, 0x8d, 0xdf, 0x9e, 0x83, 0x45, 0x09, 0xdd, 0x10, + 0x33, 0xd2, 0x9d, 0x8c, 0x46, 0xb6, 0x9f, 0x22, 0x77, 0x32, 0xcf, 0x97, 0x3b, 0xd9, 0x19, 0xb9, + 0x93, 0x34, 0x36, 0x49, 0x6c, 0x25, 0x8d, 0x4d, 0xb1, 0x04, 0xa4, 0xff, 0xeb, 0xae, 0xc7, 0x9a, + 0x04, 0xf7, 0xc8, 0xc5, 0x39, 0x23, 0x25, 0x0b, 0x29, 0x52, 0x52, 0x97, 0x71, 0x73, 0x53, 0x32, + 0xee, 0x55, 0xa0, 0xb5, 0x56, 0x22, 0xbb, 0x48, 0x26, 0x01, 0xc2, 0xa4, 0xff, 0xf2, 0x2e, 0xcc, + 0x4f, 0x8b, 0x15, 0x92, 0x5f, 0xf5, 0x14, 0xa1, 0xe2, 0x8c, 0x38, 0x1e, 0x10, 0x1a, 0x71, 0x59, + 0x0a, 0x15, 0x67, 0xc4, 0x77, 0x10, 0xa3, 0xe8, 0xdb, 0x00, 0xd4, 0x36, 0x6a, 0x24, 0x80, 0x1a, + 0xc9, 0x1b, 0xc9, 0xb5, 0xd0, 0x67, 0xfd, 0x81, 0xf8, 0x98, 0xf8, 0x1c, 0xb5, 0x94, 0x32, 0x96, + 0x44, 0xc7, 0xf5, 0x53, 0xa8, 0x7b, 0x63, 0xee, 0x5a, 0xf1, 0xf6, 0xae, 0x60, 0x55, 0xaf, 0x3f, + 0xa7, 0xaa, 0x8e, 0xa2, 0x35, 0x6b, 0xa2, 0x6c, 0xf4, 0xc9, 0x76, 0x69, 0xe2, 0xb9, 0x56, 0x5b, + 0xf5, 0x1b, 0xd4, 0x56, 0xc7, 0xc2, 0xd1, 0xb7, 0xf1, 0xf7, 0x32, 0x50, 0xd1, 0xba, 0xcd, 0x96, + 0x61, 0x61, 0x63, 0x7f, 0xff, 0xa0, 0x6d, 0xb6, 0x7a, 0x9d, 0xcf, 0xda, 0xd6, 0xc6, 0xce, 0x7e, + 0xb7, 0xdd, 0xb8, 0x26, 0xc0, 0x3b, 0xfb, 0x1b, 0xad, 0x1d, 0x6b, 0x6b, 0xdf, 0xdc, 0x50, 0xe0, + 0x0c, 0x5b, 0x01, 0x66, 0xb6, 0x77, 0xf7, 0x7b, 0xed, 0x04, 0x3c, 0xcb, 0x1a, 0x50, 0x5d, 0x37, + 0xdb, 0xad, 0x8d, 0x6d, 0x09, 0xc9, 0xb1, 0x25, 0x68, 0x6c, 0x1d, 0xee, 0x6d, 0x76, 0xf6, 0x9e, + 0x58, 0x1b, 0xad, 0xbd, 0x8d, 0xf6, 0x4e, 0x7b, 0xb3, 0x91, 0x67, 0x35, 0x28, 0xb7, 0xd6, 0x5b, + 0x7b, 0x9b, 0xfb, 0x7b, 0xed, 0xcd, 0x46, 0xc1, 0xf8, 0x35, 0x28, 0xc7, 0x03, 0xad, 0x40, 0xf1, + 0x70, 0xef, 0xe9, 0xde, 0xfe, 0xe7, 0x7b, 0x8d, 0x6b, 0xac, 0x0c, 0x05, 0x6c, 0xbf, 0x91, 0x61, + 0x00, 0x73, 0xd4, 0x66, 0x23, 0xcb, 0x4a, 0x90, 0x5f, 0xdf, 0xef, 0x6d, 0x37, 0x72, 0xc6, 0x9f, + 0x65, 0x60, 0x19, 0x87, 0x3c, 0x98, 0x16, 0x02, 0x77, 0xa0, 0xd2, 0xf7, 0xbc, 0xb1, 0x30, 0x6e, + 0xe2, 0x43, 0x5c, 0x07, 0x89, 0x0d, 0x4e, 0xf2, 0xf2, 0xd8, 0xf3, 0xfb, 0x5c, 0xca, 0x00, 0x40, + 0xd0, 0x96, 0x80, 0x08, 0x1e, 0x94, 0x4c, 0x4c, 0x14, 0x24, 0x02, 0x2a, 0x04, 0x23, 0x92, 0x15, + 0x98, 0x3b, 0xf2, 0xb9, 0xdd, 0x3f, 0x95, 0xbb, 0x5f, 0x7e, 0xb1, 0x37, 0x63, 0xb3, 0xbb, 0x2f, + 0x78, 0x6a, 0xc8, 0x07, 0xb8, 0x05, 0x4a, 0xe6, 0xbc, 0x84, 0x6f, 0x48, 0xb0, 0x38, 0x00, 0xec, + 0x23, 0xdb, 0x1d, 0x78, 0x2e, 0x1f, 0x48, 0xed, 0x3e, 0x06, 0x18, 0x07, 0xb0, 0x32, 0x3d, 0x3e, + 0x29, 0x2f, 0x3e, 0xd0, 0xe4, 0x05, 0x29, 0xdb, 0x6b, 0x57, 0xb3, 0x82, 0x26, 0x3b, 0x7e, 0x96, + 0x83, 0xbc, 0x50, 0xbe, 0xae, 0xd4, 0xd3, 0x74, 0x6d, 0x3a, 0x37, 0x13, 0x71, 0x41, 0xeb, 0x9e, + 0x4e, 0x65, 0x72, 0x21, 0x95, 0x11, 0x82, 0xa7, 0x71, 0x84, 0xf6, 0x79, 0xff, 0x4c, 0xfa, 0x90, + 0x08, 0x6d, 0xf2, 0xfe, 0x19, 0x9a, 0x31, 0x76, 0x48, 0x65, 0x69, 0xbf, 0x17, 0x03, 0x3b, 0xc4, + 0x92, 0x12, 0x85, 0xe5, 0x8a, 0x11, 0x0a, 0x4b, 0x35, 0xa1, 0xe8, 0xb8, 0x47, 0xde, 0xc4, 0x1d, + 0xe0, 0xf6, 0x2e, 0x99, 0xea, 0x13, 0x03, 0x3c, 0x28, 0x89, 0xc4, 0xf9, 0x41, 0xbb, 0xb9, 0x24, + 0x00, 0x3d, 0x71, 0x82, 0xbc, 0x0b, 0xe5, 0xe0, 0xd2, 0xed, 0xeb, 0x7b, 0x78, 0x49, 0xce, 0x8f, + 0x18, 0xfd, 0x83, 0xee, 0xa5, 0xdb, 0xc7, 0x1d, 0x5b, 0x0a, 0xe4, 0x5f, 0xec, 0x7d, 0x28, 0x45, + 0xae, 0x56, 0x92, 0xc0, 0xd7, 0xf5, 0x12, 0xca, 0xbf, 0x4a, 0x16, 0x6d, 0x44, 0xba, 0xf6, 0x14, + 0x6a, 0x09, 0x94, 0x6e, 0x86, 0xd6, 0xc8, 0x0c, 0x7d, 0x5d, 0x37, 0x43, 0x63, 0xc1, 0x2e, 0x8b, + 0xe9, 0x66, 0xe9, 0xaf, 0x43, 0x49, 0xf5, 0x4c, 0x6c, 0x27, 0xb9, 0x15, 0xac, 0xee, 0x17, 0x7b, + 0x1b, 0x8d, 0x6b, 0x6c, 0x1e, 0x2a, 0xad, 0x0d, 0xdc, 0xa1, 0x08, 0xc8, 0x08, 0x92, 0x83, 0x56, + 0xb7, 0x1b, 0x41, 0xb2, 0x06, 0x83, 0x86, 0x38, 0x5e, 0x44, 0x8f, 0xa3, 0x60, 0xca, 0x07, 0xb0, + 0xa0, 0xc1, 0x62, 0x4b, 0x4d, 0x9c, 0x47, 0xd3, 0x96, 0x1a, 0xea, 0xe5, 0x84, 0x31, 0x56, 0x61, + 0x59, 0x7c, 0xb6, 0xcf, 0xb8, 0x1b, 0x76, 0x27, 0x47, 0x14, 0x4a, 0x73, 0x3c, 0x57, 0xe8, 0xeb, + 0xe5, 0x08, 0x73, 0x35, 0x23, 0x3d, 0x90, 0x46, 0x5d, 0x16, 0xa7, 0x7f, 0x4d, 0x6b, 0x01, 0x0b, + 0x3e, 0xc0, 0x7f, 0x13, 0xc6, 0x5d, 0x39, 0x02, 0x89, 0xb1, 0x1e, 0xb4, 0xdb, 0xa6, 0xb5, 0xbf, + 0xb7, 0xd3, 0xd9, 0x13, 0xc2, 0x48, 0x8c, 0x15, 0x01, 0x5b, 0x5b, 0x08, 0xc9, 0x18, 0x0d, 0xa8, + 0x3f, 0xe1, 0x61, 0xc7, 0x3d, 0xf6, 0xd4, 0x48, 0x7f, 0x5e, 0x80, 0xf9, 0x08, 0x14, 0x1b, 0x87, + 0x67, 0xdc, 0x0f, 0x1c, 0xcf, 0x45, 0x3d, 0xaf, 0x6c, 0xaa, 0x4f, 0x71, 0x82, 0x38, 0x03, 0xee, + 0x86, 0x4e, 0x78, 0x69, 0x25, 0x3c, 0x49, 0x75, 0x05, 0x96, 0x27, 0xd5, 0x12, 0x14, 0xec, 0xa1, + 0x63, 0xab, 0x08, 0x24, 0x7d, 0x08, 0x68, 0xdf, 0x1b, 0x7a, 0x3e, 0xaa, 0x74, 0x65, 0x93, 0x3e, + 0xd8, 0x23, 0x58, 0x12, 0xaa, 0xa5, 0xee, 0xde, 0xc3, 0x3d, 0x4a, 0x4e, 0x2d, 0xe6, 0x4e, 0x46, + 0x07, 0xb1, 0x8b, 0x4f, 0x60, 0xc4, 0xf9, 0x24, 0x4a, 0x48, 0x85, 0x24, 0x2a, 0x40, 0x56, 0xca, + 0x82, 0x3b, 0x19, 0xb5, 0x10, 0x13, 0xd1, 0x3f, 0x86, 0x65, 0x41, 0x1f, 0xa9, 0x30, 0x51, 0x89, + 0x79, 0x2c, 0x21, 0x2a, 0xeb, 0x48, 0x5c, 0x54, 0xe6, 0x06, 0x94, 0xa9, 0x57, 0x62, 0xc5, 0x0b, + 0xa4, 0x9d, 0x62, 0x57, 0xb8, 0x1f, 0xcc, 0x04, 0x0b, 0xe7, 0xe8, 0xb0, 0x9d, 0x0a, 0x16, 0x6a, + 0xe1, 0xc6, 0xd2, 0x74, 0xb8, 0xf1, 0x31, 0x2c, 0x1f, 0xf1, 0x20, 0xb4, 0x4e, 0xb9, 0x3d, 0xe0, + 0x3e, 0xee, 0x48, 0x0a, 0x2b, 0x92, 0x16, 0xbe, 0x28, 0x90, 0xdb, 0x88, 0xeb, 0x29, 0x94, 0xd0, + 0x25, 0xc4, 0xd6, 0xe3, 0x03, 0x2b, 0xf4, 0x2c, 0x54, 0x31, 0x70, 0x13, 0x97, 0xcc, 0x1a, 0x81, + 0x7b, 0xde, 0x86, 0x00, 0x26, 0xe9, 0x4e, 0x7c, 0x7b, 0x7c, 0x2a, 0xf5, 0xe4, 0x88, 0xee, 0x89, + 0x00, 0xb2, 0x9b, 0x50, 0x0c, 0x79, 0x10, 0xba, 0x9c, 0x62, 0x3a, 0x25, 0xf4, 0xd9, 0x2b, 0x10, + 0x7b, 0x1d, 0xe6, 0xb0, 0x8d, 0xa0, 0xd9, 0x40, 0x7e, 0xaf, 0xc6, 0xc2, 0xd2, 0x71, 0x4d, 0x89, + 0x13, 0x0a, 0xdb, 0xc4, 0x77, 0x82, 0x66, 0x15, 0x63, 0x99, 0xf8, 0x37, 0xfb, 0x0d, 0x4d, 0x2c, + 0x2c, 0x62, 0x59, 0x75, 0xe6, 0x4e, 0x71, 0xda, 0xaf, 0x44, 0x42, 0x7c, 0x3f, 0x5f, 0xaa, 0x34, + 0xaa, 0xc6, 0x87, 0x50, 0xa0, 0xd9, 0x11, 0x4c, 0x88, 0x73, 0x97, 0x91, 0x4c, 0x88, 0xd0, 0x26, + 0x14, 0x5d, 0x1e, 0x9e, 0x7b, 0xfe, 0x33, 0xe5, 0x6b, 0x95, 0x9f, 0xc6, 0x4f, 0xd0, 0x49, 0x10, + 0x05, 0x92, 0xc9, 0xde, 0x11, 0xec, 0x41, 0xcb, 0x1b, 0x9c, 0xda, 0xd2, 0x6f, 0x51, 0x42, 0x40, + 0xf7, 0xd4, 0x9e, 0x61, 0x8f, 0xec, 0x6c, 0x2c, 0xf9, 0x75, 0xa8, 0xab, 0xd0, 0x75, 0x60, 0x0d, + 0xf9, 0x71, 0x28, 0xd9, 0xbd, 0x2a, 0xe3, 0xd6, 0xc1, 0x0e, 0x3f, 0x0e, 0x8d, 0x5d, 0x58, 0x90, + 0x0c, 0xb9, 0x3f, 0xe6, 0xaa, 0xe9, 0x8f, 0xd2, 0x74, 0xd6, 0xca, 0xe3, 0xc5, 0xe4, 0x61, 0x46, + 0x21, 0xf9, 0x84, 0x22, 0x6b, 0x7c, 0x0a, 0x4c, 0x3f, 0xea, 0x64, 0x7d, 0x52, 0x73, 0x54, 0x2e, + 0x6a, 0x15, 0xe9, 0x89, 0xf4, 0x53, 0x67, 0x20, 0x66, 0x27, 0x98, 0xf4, 0xfb, 0x2a, 0xa5, 0xa0, + 0x64, 0xaa, 0x4f, 0xe3, 0x4f, 0x33, 0xb0, 0x88, 0x95, 0x29, 0x9d, 0x5b, 0x6a, 0x13, 0xdf, 0xba, + 0x93, 0x62, 0x7d, 0x74, 0xfd, 0x82, 0x3e, 0xbe, 0xb9, 0x53, 0x30, 0x3f, 0xe3, 0x14, 0x7c, 0x13, + 0x1a, 0x03, 0x3e, 0x74, 0x30, 0xbb, 0x44, 0x1d, 0xd7, 0xa4, 0x65, 0xcf, 0x2b, 0xb8, 0x32, 0x94, + 0xfe, 0x49, 0x06, 0x16, 0x48, 0x1b, 0x40, 0x73, 0x51, 0x4e, 0xd4, 0x27, 0xca, 0xc6, 0x92, 0xa2, + 0x4a, 0x8e, 0x29, 0x3e, 0x25, 0x11, 0x4a, 0xc4, 0xdb, 0xd7, 0xa4, 0xed, 0x25, 0xa1, 0xec, 0x63, + 0xb4, 0x13, 0x5c, 0x0b, 0x81, 0x29, 0xd9, 0x2a, 0xc9, 0x45, 0xd9, 0xbe, 0x86, 0x46, 0x84, 0x8b, + 0xa0, 0xf5, 0x92, 0x30, 0xfa, 0x04, 0xd8, 0xd8, 0x82, 0x5a, 0xa2, 0x99, 0x84, 0xe7, 0xb2, 0x4a, + 0x9e, 0xcb, 0x99, 0xe8, 0x40, 0x76, 0x36, 0x3a, 0xf0, 0x77, 0xf2, 0xc0, 0x04, 0x4b, 0x4d, 0xad, + 0xda, 0x54, 0x68, 0x2d, 0x3b, 0x13, 0x5a, 0x7b, 0x04, 0x4c, 0x23, 0x50, 0x11, 0xbf, 0x5c, 0x14, + 0xf1, 0x6b, 0xc4, 0xb4, 0x32, 0xe0, 0xf7, 0x08, 0x96, 0xa4, 0xd2, 0x18, 0xc5, 0xd2, 0xd0, 0x25, + 0x45, 0xeb, 0xc3, 0x48, 0x7b, 0x54, 0x31, 0x35, 0x74, 0x4f, 0xa9, 0xb0, 0x9a, 0x30, 0xa9, 0xc9, + 0x93, 0x83, 0x61, 0x35, 0x61, 0x45, 0x4f, 0x71, 0xc1, 0xdc, 0x0b, 0xb9, 0xa0, 0x38, 0xc3, 0x05, + 0x9a, 0x63, 0xa1, 0x94, 0x74, 0x2c, 0x18, 0x50, 0x53, 0xc1, 0x33, 0xca, 0x19, 0x20, 0x0d, 0xa9, + 0x22, 0x23, 0x68, 0x98, 0x37, 0x70, 0x0f, 0x1a, 0xca, 0xfa, 0x8f, 0x5c, 0x17, 0x14, 0x0f, 0x97, + 0xce, 0xa3, 0x0d, 0xe5, 0xc0, 0x48, 0x38, 0x8a, 0x2b, 0x53, 0x8e, 0xe2, 0xb7, 0x60, 0x21, 0x10, + 0x4c, 0x64, 0x4d, 0x5c, 0x99, 0xbc, 0xc2, 0x07, 0x68, 0x9e, 0x94, 0xcc, 0x06, 0x22, 0x0e, 0x63, + 0xf8, 0xac, 0x69, 0x5f, 0x9b, 0x35, 0xed, 0xd9, 0xfb, 0x71, 0x9c, 0x29, 0x38, 0x75, 0x46, 0x78, + 0x70, 0xc7, 0x89, 0x1e, 0x72, 0x82, 0xbb, 0xa7, 0xce, 0xc8, 0x54, 0x41, 0x4d, 0xf1, 0x61, 0xfc, + 0xe7, 0x0c, 0x34, 0x04, 0x1f, 0x24, 0xf8, 0xfc, 0xd7, 0x00, 0x77, 0xe4, 0x4b, 0xb2, 0x79, 0x45, + 0xd0, 0x2a, 0x2e, 0xff, 0x10, 0x90, 0x6d, 0x2d, 0x61, 0x8b, 0x49, 0x26, 0x6f, 0x26, 0x99, 0x3c, + 0x16, 0x64, 0xdb, 0xd7, 0x48, 0xc9, 0x16, 0x90, 0xb4, 0xf8, 0x5e, 0x3e, 0x25, 0xbe, 0xa7, 0x6d, + 0x85, 0x6d, 0x80, 0xa7, 0xfc, 0x72, 0xc7, 0xeb, 0xa3, 0x15, 0x74, 0x0b, 0x40, 0x30, 0xe4, 0xb1, + 0x3d, 0x72, 0xa4, 0x07, 0xa3, 0x60, 0x96, 0x9f, 0xf1, 0xcb, 0x2d, 0x04, 0x88, 0xd5, 0x10, 0xe8, + 0x78, 0x3f, 0x14, 0xcc, 0xd2, 0x33, 0x7e, 0x49, 0x9b, 0xc1, 0x82, 0xda, 0x53, 0x7e, 0xb9, 0xc9, + 0x49, 0x5d, 0xf3, 0x7c, 0xc1, 0x09, 0xbe, 0x7d, 0x2e, 0xf4, 0xb3, 0x44, 0x6c, 0xae, 0xe2, 0xdb, + 0xe7, 0x4f, 0xf9, 0xa5, 0x8a, 0x13, 0x16, 0x05, 0x7e, 0xe8, 0xf5, 0xe5, 0x09, 0xa4, 0xb2, 0x0c, + 0xe2, 0x4e, 0x99, 0x73, 0xcf, 0xf0, 0x6f, 0xe3, 0x4f, 0x32, 0x50, 0x13, 0xfd, 0x47, 0x01, 0x27, + 0xe6, 0x5d, 0x25, 0xab, 0x64, 0xe2, 0x64, 0x95, 0xc7, 0x52, 0x3e, 0x90, 0xb4, 0xcc, 0x5e, 0x2d, + 0x2d, 0x71, 0x82, 0x49, 0x54, 0xbe, 0x0b, 0x65, 0xda, 0x5b, 0x62, 0xb3, 0xe6, 0x12, 0xab, 0x94, + 0x18, 0x90, 0x59, 0x42, 0xb2, 0xa7, 0x14, 0x1b, 0xd7, 0x1c, 0x50, 0x34, 0xc5, 0x65, 0x3f, 0x72, + 0x3d, 0xa5, 0x2c, 0x43, 0x21, 0x2d, 0xcc, 0x7a, 0x08, 0x15, 0x8d, 0xa7, 0xd8, 0xf7, 0x28, 0x40, + 0x4d, 0x9d, 0x27, 0x06, 0x4c, 0x32, 0x4d, 0x62, 0xf4, 0xdb, 0xd7, 0xcc, 0x5a, 0x5f, 0x07, 0xac, + 0xcf, 0x41, 0x5e, 0x14, 0x32, 0x3e, 0x81, 0x05, 0xad, 0x5a, 0xb2, 0xf8, 0xd2, 0xfa, 0x94, 0x49, + 0xeb, 0xd3, 0x3f, 0xcd, 0xc0, 0x92, 0x2c, 0x8d, 0x89, 0x4d, 0x8e, 0x38, 0xae, 0x77, 0x83, 0x13, + 0xf6, 0x6b, 0x50, 0x13, 0xb5, 0x5b, 0x3e, 0x3f, 0x71, 0x82, 0x90, 0x2b, 0xcf, 0x7e, 0xca, 0xe6, + 0x10, 0x52, 0x5b, 0x90, 0x9a, 0x92, 0x92, 0x7d, 0x02, 0x15, 0x2c, 0x4a, 0x36, 0xa9, 0x5c, 0x96, + 0xe6, 0x6c, 0x41, 0xea, 0xea, 0xf6, 0x35, 0x13, 0x82, 0xe8, 0x6b, 0xbd, 0x0c, 0xc5, 0xd0, 0x77, + 0x4e, 0x4e, 0xb8, 0x6f, 0xac, 0x44, 0x5d, 0x13, 0x3b, 0x8d, 0x77, 0x43, 0x3e, 0x16, 0x4a, 0x90, + 0xf1, 0xdf, 0x32, 0x50, 0x91, 0x7b, 0xe7, 0x5b, 0xbb, 0xf3, 0xd7, 0xb4, 0xcc, 0x3c, 0x32, 0x3f, + 0xe3, 0x44, 0xbc, 0xbb, 0x30, 0x3f, 0x12, 0x0a, 0x91, 0x50, 0xd8, 0x13, 0xbe, 0xfc, 0xba, 0x02, + 0x4b, 0x7d, 0xe4, 0x01, 0x2c, 0xa2, 0x7a, 0x12, 0x58, 0xa1, 0x33, 0xb4, 0x14, 0x52, 0x66, 0xc1, + 0x2d, 0x10, 0xaa, 0xe7, 0x0c, 0x77, 0x25, 0x42, 0x9c, 0xd2, 0x41, 0x68, 0x9f, 0x70, 0xa9, 0xfa, + 0xd2, 0x87, 0xd1, 0x84, 0x95, 0x29, 0x5d, 0x5d, 0xd9, 0x19, 0x7f, 0xbf, 0x06, 0xab, 0x33, 0x28, + 0x69, 0x6f, 0x44, 0x3e, 0xec, 0xa1, 0x33, 0x3a, 0xf2, 0x22, 0x77, 0x53, 0x46, 0xf3, 0x61, 0xef, + 0x08, 0x8c, 0x72, 0x37, 0x71, 0x58, 0x56, 0x0c, 0x81, 0xfe, 0xa2, 0x48, 0x9d, 0xcf, 0xa2, 0xb2, + 0xf9, 0x6e, 0x52, 0x50, 0x4d, 0x37, 0xa7, 0xe0, 0xfa, 0xf1, 0xb7, 0x38, 0x9e, 0x81, 0x05, 0xec, + 0x18, 0x9a, 0x11, 0xdf, 0x49, 0xfd, 0x48, 0xb3, 0x4d, 0x44, 0x4b, 0x6f, 0xbf, 0xa0, 0xa5, 0x84, + 0x23, 0xc2, 0x5c, 0x51, 0xec, 0x4a, 0x95, 0x45, 0xed, 0x9c, 0xc1, 0x2b, 0xaa, 0x1d, 0xd4, 0x75, + 0x66, 0x5b, 0xcb, 0xbf, 0xd4, 0xb8, 0xd0, 0xc1, 0x92, 0x6c, 0xf2, 0x86, 0xac, 0x38, 0x42, 0xe9, + 0xed, 0x9e, 0xc2, 0xca, 0xb9, 0xed, 0x84, 0x6a, 0x7c, 0x9a, 0x59, 0x54, 0xc0, 0xf6, 0x1e, 0xbf, + 0xa0, 0xbd, 0xcf, 0xa9, 0x70, 0x42, 0xfb, 0x5b, 0x3a, 0x9f, 0x05, 0x06, 0x6b, 0xff, 0x31, 0x0b, + 0xf5, 0x64, 0x2d, 0x62, 0x53, 0x4b, 0x39, 0xa4, 0xf4, 0x09, 0xa9, 0x8f, 0x4b, 0x37, 0xe8, 0x1e, + 0xe9, 0x11, 0xb3, 0x0e, 0xda, 0x6c, 0x8a, 0x83, 0x56, 0xf7, 0x8b, 0xe6, 0x5e, 0x14, 0xfb, 0xc9, + 0xbf, 0x54, 0xec, 0xa7, 0x90, 0x16, 0xfb, 0xb9, 0x3a, 0x60, 0x30, 0xf7, 0xad, 0x02, 0x06, 0xc5, + 0xab, 0x03, 0x06, 0x6b, 0x7f, 0x99, 0x01, 0x36, 0xcb, 0xa9, 0xec, 0x09, 0xf9, 0xa2, 0x5d, 0x3e, + 0x94, 0x52, 0xec, 0x9d, 0x97, 0xe3, 0x76, 0xb5, 0x40, 0xaa, 0x34, 0x7b, 0x08, 0x8b, 0x7a, 0xde, + 0xac, 0x6e, 0xaa, 0xd4, 0x4c, 0xa6, 0xa3, 0x62, 0x83, 0x56, 0x0b, 0x7c, 0xe5, 0x5f, 0x18, 0xf8, + 0x2a, 0xbc, 0x30, 0xf0, 0x35, 0x97, 0x0c, 0x7c, 0xad, 0xfd, 0xad, 0x0c, 0x2c, 0xa6, 0x30, 0xd5, + 0x2f, 0x6f, 0xcc, 0x82, 0x17, 0x12, 0x22, 0x26, 0x2b, 0x79, 0x41, 0x93, 0x2e, 0x6b, 0x5f, 0x41, + 0x2d, 0xb1, 0x89, 0x7e, 0x79, 0xcd, 0x4f, 0x1b, 0x5a, 0xc4, 0xca, 0xba, 0xa1, 0xb5, 0xf6, 0x17, + 0x59, 0x60, 0xb3, 0xfb, 0xf8, 0x57, 0xd9, 0x85, 0xd9, 0x49, 0xca, 0xcd, 0x4e, 0xd2, 0xff, 0xbf, + 0x73, 0xe5, 0x2d, 0x58, 0x90, 0xb9, 0xfe, 0x5a, 0xe0, 0x81, 0x18, 0xa5, 0x11, 0x21, 0x54, 0x2f, + 0x3e, 0x9c, 0x8e, 0x39, 0x96, 0x12, 0xe9, 0xcd, 0xda, 0xc1, 0x9a, 0x0c, 0x3d, 0x1a, 0x6b, 0xd0, + 0x94, 0x53, 0x33, 0xeb, 0xaa, 0xfb, 0xdd, 0x7c, 0x64, 0x25, 0x23, 0x52, 0x2a, 0xc5, 0xdf, 0x85, + 0xaa, 0x7e, 0xd8, 0xc8, 0x75, 0x98, 0x8a, 0x38, 0x09, 0x75, 0xd8, 0xd3, 0x76, 0xeb, 0x06, 0x50, + 0x1c, 0x61, 0x10, 0x15, 0x23, 0x0d, 0xe2, 0x39, 0x8e, 0x67, 0x54, 0x8e, 0x12, 0x8b, 0xff, 0x57, + 0xa0, 0x9e, 0xf4, 0x5b, 0x49, 0x55, 0x2f, 0x4d, 0x3b, 0x14, 0xa5, 0x13, 0x8e, 0x2c, 0xf6, 0x1b, + 0xd0, 0x98, 0xf6, 0x7b, 0xc9, 0xdc, 0xcb, 0x2b, 0xca, 0xcf, 0x3b, 0x49, 0x57, 0x18, 0xdb, 0x86, + 0xa5, 0xb4, 0xe3, 0x16, 0x57, 0xe5, 0x6a, 0xb3, 0x80, 0xcd, 0x1e, 0xa9, 0xec, 0x23, 0xe9, 0xde, + 0x2c, 0xa4, 0x05, 0x62, 0xb4, 0xc9, 0x7e, 0x40, 0xff, 0x69, 0x8e, 0xce, 0x33, 0x80, 0x18, 0xc6, + 0x1a, 0x50, 0xdd, 0x3f, 0x68, 0xef, 0x59, 0x1b, 0xdb, 0xad, 0xbd, 0xbd, 0xf6, 0x4e, 0xe3, 0x1a, + 0x63, 0x50, 0xc7, 0x08, 0xca, 0x66, 0x04, 0xcb, 0x08, 0x98, 0xf4, 0xfd, 0x2a, 0x58, 0x96, 0x2d, + 0x41, 0xa3, 0xb3, 0x37, 0x05, 0xcd, 0xb1, 0x26, 0x2c, 0x1d, 0xb4, 0x29, 0xe8, 0x92, 0xa8, 0x37, + 0x2f, 0x54, 0x38, 0x39, 0x5c, 0xa1, 0xc2, 0xd1, 0x4d, 0x11, 0xc9, 0x7d, 0x4a, 0xb3, 0xf9, 0xbd, + 0x0c, 0x2c, 0x4f, 0x21, 0xe2, 0xfc, 0x5f, 0xd2, 0x6b, 0x92, 0x1a, 0x4d, 0x15, 0x81, 0x8a, 0x87, + 0xdf, 0x82, 0x85, 0xc8, 0xd4, 0x9b, 0x92, 0x4b, 0x8d, 0x08, 0xa1, 0x88, 0x1f, 0xc2, 0xa2, 0x66, + 0x31, 0x4e, 0xed, 0x50, 0xa6, 0xa1, 0x64, 0x01, 0x63, 0x35, 0xca, 0xb3, 0x9c, 0xea, 0xf5, 0x80, + 0xae, 0x9f, 0xe8, 0x88, 0xd8, 0xfb, 0x9b, 0xec, 0xaf, 0xfa, 0x14, 0xa6, 0x7c, 0x82, 0x11, 0x92, + 0xbd, 0xd5, 0x17, 0x5c, 0x35, 0xff, 0x07, 0x73, 0xc0, 0x3e, 0x9d, 0x70, 0xff, 0x12, 0xf3, 0x7b, + 0x83, 0x17, 0x25, 0xbc, 0x28, 0xb3, 0x28, 0xfb, 0x52, 0x39, 0xfc, 0x69, 0x39, 0xf4, 0xf9, 0x17, + 0xe7, 0xd0, 0x17, 0x5e, 0x94, 0x43, 0xff, 0x1a, 0xd4, 0x9c, 0x13, 0xd7, 0x13, 0x02, 0x48, 0xe8, + 0x26, 0x41, 0x73, 0xee, 0x4e, 0xee, 0x5e, 0xd5, 0xac, 0x4a, 0xa0, 0xd0, 0x4c, 0x02, 0xf6, 0x49, + 0x4c, 0xc4, 0x07, 0x27, 0x78, 0xdf, 0x43, 0x17, 0x3d, 0xed, 0xc1, 0x09, 0x97, 0x56, 0x20, 0xfa, + 0x45, 0x54, 0x61, 0x01, 0x0f, 0xd8, 0xeb, 0x50, 0x0f, 0xbc, 0x89, 0x50, 0xf5, 0xd4, 0x34, 0x90, + 0x7f, 0xb8, 0x4a, 0xd0, 0x03, 0x15, 0x0c, 0x58, 0x9c, 0x04, 0xdc, 0x1a, 0x39, 0x41, 0x20, 0x0e, + 0xe8, 0xbe, 0xe7, 0x86, 0xbe, 0x37, 0x94, 0x2e, 0xdf, 0x85, 0x49, 0xc0, 0x77, 0x09, 0xb3, 0x41, + 0x08, 0xf6, 0x5e, 0xdc, 0xa5, 0xb1, 0xed, 0xf8, 0x41, 0x13, 0xb0, 0x4b, 0x6a, 0xa4, 0xa8, 0x51, + 0xd9, 0x8e, 0x1f, 0xf5, 0x45, 0x7c, 0x04, 0x53, 0xb9, 0xfd, 0x95, 0xe9, 0xdc, 0xfe, 0x1f, 0xa7, + 0xe7, 0xf6, 0xd7, 0xb0, 0xea, 0x47, 0xb2, 0xea, 0xd9, 0x25, 0xfe, 0x46, 0x29, 0xfe, 0xb3, 0x57, + 0x16, 0xea, 0xdf, 0xe4, 0xca, 0xc2, 0x7c, 0xda, 0x95, 0x85, 0x77, 0xa1, 0x82, 0xc9, 0xe4, 0xd6, + 0xa9, 0xe3, 0x86, 0xca, 0x85, 0xdd, 0xd0, 0xb3, 0xcd, 0xb7, 0x85, 0x31, 0x0d, 0xbe, 0xfa, 0x33, + 0x98, 0xbd, 0x3d, 0xb0, 0xf0, 0x2b, 0xbc, 0x3d, 0x20, 0x93, 0xde, 0x1f, 0x40, 0x49, 0xad, 0x13, + 0x63, 0x90, 0x3f, 0xf6, 0xbd, 0x91, 0x72, 0xed, 0x89, 0xbf, 0x59, 0x1d, 0xb2, 0xa1, 0x27, 0x0b, + 0x67, 0x43, 0xcf, 0xf8, 0x4d, 0xa8, 0x68, 0xac, 0xc6, 0x5e, 0x25, 0x27, 0x82, 0xd0, 0x96, 0xa5, + 0x95, 0x4c, 0xb3, 0x58, 0x96, 0xd0, 0xce, 0x40, 0xc8, 0x9b, 0x81, 0xe3, 0x73, 0xbc, 0xe7, 0x63, + 0xf9, 0xfc, 0x8c, 0xfb, 0x81, 0x72, 0xb5, 0x36, 0x22, 0x84, 0x49, 0x70, 0xe3, 0xaf, 0xc3, 0x62, + 0x62, 0x6d, 0xa5, 0x88, 0x78, 0x1d, 0xe6, 0x70, 0xde, 0x54, 0x28, 0x2c, 0x99, 0xc5, 0x2f, 0x71, + 0x78, 0x81, 0x93, 0xbc, 0xc4, 0xd6, 0xd8, 0xf7, 0x8e, 0xb0, 0x91, 0x8c, 0x59, 0x91, 0xb0, 0x03, + 0xdf, 0x3b, 0x32, 0x7e, 0x96, 0x83, 0xdc, 0xb6, 0x37, 0xd6, 0x33, 0x2c, 0x32, 0x33, 0x19, 0x16, + 0xd2, 0x04, 0xb0, 0x22, 0x15, 0x5f, 0x6a, 0x6d, 0xe8, 0x1f, 0x55, 0x6a, 0xfe, 0x3d, 0xa8, 0x0b, + 0x39, 0x11, 0x7a, 0xc2, 0x86, 0x3a, 0xb7, 0x7d, 0xca, 0xe9, 0xcf, 0xd1, 0xe6, 0xb3, 0x47, 0x61, + 0xcf, 0xdb, 0x22, 0x38, 0x5b, 0x82, 0x5c, 0xa4, 0xc0, 0x22, 0x5a, 0x7c, 0x0a, 0xe3, 0x1a, 0xb3, + 0xdb, 0x2e, 0x65, 0xac, 0x47, 0x7e, 0xb1, 0x77, 0x60, 0x31, 0x59, 0x2f, 0x89, 0x22, 0xa9, 0x91, + 0xe8, 0x15, 0xa3, 0x4c, 0xba, 0x0e, 0x42, 0x8e, 0x10, 0x8d, 0x0c, 0xcb, 0x1e, 0x73, 0x8e, 0x28, + 0x4d, 0xe8, 0x95, 0x12, 0x42, 0xef, 0x36, 0x54, 0xc2, 0xe1, 0x99, 0x35, 0xb6, 0x2f, 0x87, 0x9e, + 0x3d, 0x90, 0xfb, 0x1b, 0xc2, 0xe1, 0xd9, 0x01, 0x41, 0xd8, 0x43, 0x80, 0xd1, 0x78, 0x2c, 0xf7, + 0x1e, 0xba, 0x1b, 0x63, 0x56, 0xde, 0x3d, 0x38, 0x20, 0x96, 0x33, 0xcb, 0xa3, 0xf1, 0x98, 0xfe, + 0x64, 0x9b, 0x50, 0x4f, 0xbd, 0x8b, 0x73, 0x4b, 0x25, 0x63, 0x79, 0xe3, 0x07, 0x29, 0x9b, 0xb3, + 0xd6, 0xd7, 0x61, 0x6b, 0xbf, 0x01, 0xec, 0x17, 0xbc, 0x11, 0xd3, 0x83, 0x72, 0xd4, 0x3f, 0xfd, + 0x42, 0x09, 0xa6, 0x57, 0x56, 0x12, 0x17, 0x4a, 0x5a, 0x83, 0x81, 0x2f, 0xe4, 0x22, 0x1d, 0x98, + 0x91, 0xc8, 0x07, 0xed, 0xc4, 0x6c, 0x91, 0xdc, 0x37, 0xfe, 0x3c, 0x03, 0x05, 0xba, 0xdd, 0xf2, + 0x06, 0xcc, 0x13, 0x7d, 0x94, 0xad, 0x22, 0x23, 0x44, 0x74, 0xee, 0xf6, 0x64, 0xa2, 0x8a, 0xd8, + 0x16, 0xda, 0xcd, 0xbc, 0x6c, 0xb4, 0xf2, 0xda, 0xed, 0xbc, 0xdb, 0x50, 0x8e, 0x9a, 0xd6, 0x58, + 0xa7, 0xa4, 0x5a, 0x66, 0xaf, 0x40, 0xfe, 0xd4, 0x1b, 0x2b, 0x5b, 0x1c, 0xe2, 0x99, 0x34, 0x11, + 0x1e, 0xf7, 0x45, 0xb4, 0x41, 0x9d, 0x97, 0x36, 0x64, 0xd4, 0x08, 0xb2, 0xc1, 0xec, 0x18, 0xe7, + 0x52, 0xc6, 0x78, 0x08, 0xf3, 0x42, 0x0e, 0x68, 0x91, 0xda, 0xab, 0x0f, 0xcd, 0x37, 0x85, 0x86, + 0xd7, 0x1f, 0x4e, 0x06, 0x5c, 0xf7, 0x84, 0x60, 0xea, 0x84, 0x84, 0x2b, 0xf3, 0xc0, 0xf8, 0x83, + 0x0c, 0xc9, 0x17, 0x51, 0x2f, 0xbb, 0x07, 0x79, 0x71, 0xbe, 0x4d, 0x79, 0xea, 0xa2, 0x3c, 0x57, + 0x41, 0x67, 0x22, 0x05, 0x5e, 0x67, 0x9d, 0x8c, 0x92, 0xb5, 0xd7, 0xcc, 0x8a, 0x3b, 0x19, 0x45, + 0xce, 0x84, 0xef, 0xa8, 0x61, 0x4d, 0x19, 0xe2, 0x34, 0xfa, 0x68, 0x9b, 0x3e, 0xd0, 0x72, 0x30, + 0xf2, 0x89, 0x13, 0x53, 0x69, 0x81, 0x83, 0x13, 0xae, 0xe5, 0x5e, 0xfc, 0x51, 0x16, 0x6a, 0x89, + 0x1e, 0x61, 0x12, 0x8a, 0x38, 0x00, 0xc8, 0x0b, 0x2c, 0xd7, 0x1b, 0x04, 0x48, 0x2a, 0xea, 0xda, + 0x3c, 0x65, 0x13, 0xf3, 0x14, 0xc5, 0xa4, 0x73, 0x7a, 0x4c, 0xfa, 0x11, 0x94, 0xe3, 0x1b, 0x99, + 0xc9, 0x2e, 0x89, 0xf6, 0x54, 0xb6, 0x6f, 0x4c, 0x14, 0x47, 0xb1, 0x0b, 0x7a, 0x14, 0xfb, 0x7b, + 0x5a, 0xd0, 0x73, 0x0e, 0xab, 0x31, 0xd2, 0x66, 0xf4, 0x57, 0x93, 0x14, 0xf1, 0x09, 0x54, 0xb4, + 0xce, 0xeb, 0xc1, 0xcd, 0x4c, 0x22, 0xb8, 0x19, 0xe5, 0xe5, 0x67, 0xe3, 0xbc, 0x7c, 0xe3, 0xb7, + 0xb3, 0x50, 0x13, 0xfb, 0xcb, 0x71, 0x4f, 0x0e, 0xbc, 0xa1, 0xd3, 0x47, 0xaf, 0x70, 0xb4, 0xc3, + 0xa4, 0xa2, 0xa5, 0xf6, 0x99, 0xdc, 0x62, 0xa4, 0x67, 0xe9, 0xd7, 0x8f, 0x48, 0x48, 0x47, 0xd7, + 0x8f, 0x0c, 0xa8, 0x09, 0xc1, 0x78, 0x64, 0x07, 0x5c, 0xbb, 0x2f, 0x6a, 0x56, 0x8e, 0x39, 0x5f, + 0xb7, 0x03, 0x92, 0x90, 0xef, 0xc0, 0xa2, 0xa0, 0xc1, 0x9b, 0x17, 0x23, 0x67, 0x38, 0x74, 0x88, + 0x92, 0x5c, 0x0d, 0x8d, 0x63, 0xce, 0x4d, 0x3b, 0xe4, 0xbb, 0x02, 0x21, 0xaf, 0x97, 0x96, 0x06, + 0x4e, 0x60, 0x1f, 0xc5, 0xa9, 0x42, 0xd1, 0x37, 0xc6, 0x72, 0xec, 0x0b, 0x2d, 0x96, 0x43, 0x57, + 0xb0, 0x2a, 0x23, 0xfb, 0x22, 0x8a, 0xe5, 0x4c, 0x71, 0x52, 0x71, 0x9a, 0x93, 0x8c, 0xff, 0x92, + 0x85, 0x8a, 0xc6, 0x96, 0x2f, 0x73, 0xba, 0xde, 0x9a, 0xf1, 0xe2, 0x97, 0x75, 0x87, 0xfd, 0x6b, + 0xc9, 0x26, 0x31, 0xe4, 0x4b, 0x17, 0x59, 0x35, 0x06, 0xbe, 0x01, 0x65, 0xb1, 0xeb, 0xde, 0x45, + 0xa7, 0x98, 0xbc, 0x86, 0x8d, 0x80, 0x83, 0xc9, 0x91, 0x42, 0x3e, 0x46, 0x64, 0x21, 0x46, 0x3e, + 0x16, 0xc8, 0xe7, 0xe5, 0x07, 0x7e, 0x08, 0x55, 0x59, 0x2b, 0xae, 0x29, 0x0e, 0x37, 0xde, 0xf5, + 0x89, 0xf5, 0x36, 0x2b, 0xd4, 0x1c, 0x2d, 0xbe, 0x2c, 0xf8, 0x58, 0x15, 0x2c, 0xbd, 0xa8, 0xe0, + 0x63, 0xfa, 0x30, 0xb6, 0xa2, 0x94, 0x4b, 0x4c, 0x37, 0x50, 0x72, 0xec, 0x21, 0x2c, 0x2a, 0x71, + 0x35, 0x71, 0x6d, 0xd7, 0xf5, 0x26, 0x6e, 0x9f, 0xab, 0x84, 0x7d, 0x26, 0x51, 0x87, 0x31, 0xc6, + 0x18, 0x44, 0x37, 0xba, 0x28, 0x6d, 0xe1, 0x3e, 0x14, 0x48, 0x2f, 0x27, 0xe5, 0x23, 0x5d, 0x70, + 0x11, 0x09, 0xbb, 0x07, 0x05, 0x52, 0xcf, 0xb3, 0x57, 0x0a, 0x1b, 0x22, 0x30, 0x1e, 0xc0, 0x3c, + 0xaa, 0x98, 0x9a, 0xc4, 0x7d, 0x9e, 0x56, 0x62, 0x2c, 0x01, 0xdb, 0xa3, 0x4d, 0xa4, 0xa7, 0xd3, + 0xfc, 0xcf, 0x1c, 0x54, 0x34, 0xb0, 0x10, 0x8b, 0x98, 0x80, 0x61, 0x0d, 0x1c, 0x7b, 0xc4, 0x55, + 0xec, 0xa1, 0x66, 0xd6, 0x10, 0xba, 0x29, 0x81, 0xe2, 0x50, 0xb0, 0xcf, 0x4e, 0x2c, 0x6f, 0x12, + 0x5a, 0x03, 0x7e, 0xe2, 0x73, 0x2e, 0x95, 0xa5, 0xaa, 0x7d, 0x76, 0xb2, 0x3f, 0x09, 0x37, 0x11, + 0x26, 0xa8, 0x04, 0x53, 0x6b, 0x54, 0x32, 0x67, 0x60, 0x64, 0x5f, 0xc4, 0x54, 0x32, 0x71, 0x85, + 0xa6, 0x28, 0x1f, 0x25, 0xae, 0x90, 0xd9, 0x32, 0x2d, 0xc9, 0x0b, 0xb3, 0x92, 0xfc, 0x3d, 0x58, + 0x21, 0x49, 0x2e, 0x65, 0x84, 0x35, 0xc5, 0x52, 0x4b, 0x88, 0x95, 0x83, 0xd4, 0xf4, 0xaf, 0x86, + 0x18, 0x81, 0xda, 0x1f, 0x81, 0xf3, 0x13, 0xda, 0x51, 0x19, 0x53, 0x8c, 0x4c, 0x56, 0xde, 0x75, + 0x7e, 0xc2, 0x05, 0x25, 0x06, 0x46, 0x75, 0x4a, 0x99, 0x86, 0x3a, 0x72, 0xdc, 0x69, 0x4a, 0xfb, + 0x22, 0x49, 0x59, 0x96, 0x94, 0xf6, 0x85, 0x4e, 0xf9, 0x3e, 0xac, 0x8e, 0xf8, 0xc0, 0xb1, 0x93, + 0xd5, 0x5a, 0xb1, 0x06, 0xb1, 0x44, 0x68, 0xad, 0x4c, 0x97, 0x2c, 0x48, 0x31, 0x1b, 0x3f, 0xf1, + 0x46, 0x47, 0x0e, 0x1d, 0x9e, 0x14, 0xaa, 0xcd, 0x9b, 0x75, 0x77, 0x32, 0xfa, 0x21, 0x82, 0x45, + 0x91, 0xc0, 0xa8, 0x41, 0xa5, 0x1b, 0x7a, 0x63, 0xb5, 0xcc, 0x75, 0xa8, 0xd2, 0xa7, 0xbc, 0x8e, + 0x71, 0x03, 0xae, 0x23, 0x6f, 0xf6, 0xbc, 0xb1, 0x37, 0xf4, 0x4e, 0x2e, 0x13, 0x0e, 0xa5, 0xff, + 0x9e, 0x81, 0xc5, 0x04, 0x56, 0xee, 0xf3, 0xf7, 0x68, 0x63, 0x45, 0x39, 0xf5, 0xc4, 0xce, 0x0b, + 0xda, 0xe1, 0x43, 0x84, 0xb4, 0xab, 0x54, 0x9e, 0x7d, 0x2b, 0xbe, 0x0b, 0xaa, 0x0a, 0x12, 0x6f, + 0x37, 0x67, 0x79, 0x5b, 0x96, 0x57, 0xb7, 0x44, 0x55, 0x15, 0x7f, 0x55, 0xa6, 0x0a, 0x0f, 0xe4, + 0x90, 0x73, 0xc9, 0x64, 0x48, 0xdd, 0xf9, 0xa4, 0x7a, 0x10, 0x7b, 0xa4, 0x02, 0xe3, 0x5f, 0x65, + 0x00, 0xe2, 0xde, 0x61, 0x3a, 0x66, 0x74, 0x80, 0xd2, 0x33, 0x2b, 0xda, 0x61, 0xf9, 0x2a, 0x54, + 0xa3, 0x8c, 0xb1, 0xf8, 0x48, 0xae, 0x28, 0x98, 0x38, 0x97, 0xef, 0xc2, 0xfc, 0xc9, 0xd0, 0x3b, + 0x42, 0xd5, 0x49, 0x1e, 0xa0, 0x74, 0x29, 0xa5, 0x4e, 0x60, 0x75, 0x2c, 0xc6, 0x07, 0x78, 0x3e, + 0x35, 0xa9, 0x4c, 0x3f, 0x8e, 0x8d, 0xdf, 0xc9, 0x46, 0xa9, 0x33, 0xf1, 0x4c, 0x3c, 0xdf, 0xce, + 0xf8, 0x36, 0x11, 0xd8, 0xe7, 0x45, 0x1e, 0x3e, 0x81, 0xba, 0x4f, 0xd2, 0x51, 0x89, 0xce, 0xfc, + 0x73, 0x44, 0x67, 0xcd, 0x4f, 0x1c, 0xb9, 0x6f, 0x42, 0xc3, 0x1e, 0x9c, 0x71, 0x3f, 0x74, 0xd0, + 0x59, 0x8b, 0x8a, 0x9a, 0x4c, 0x56, 0xd1, 0xe0, 0xa8, 0x11, 0xdd, 0x85, 0x79, 0x79, 0x45, 0x28, + 0xa2, 0x94, 0x8f, 0x0e, 0xc4, 0x60, 0x41, 0x68, 0xfc, 0x5b, 0x95, 0xab, 0x93, 0x5c, 0xdd, 0xe7, + 0xcf, 0x8a, 0x3e, 0xc2, 0xec, 0x6c, 0x6c, 0x45, 0x32, 0x92, 0xf4, 0x01, 0x4b, 0x79, 0x44, 0x40, + 0xe9, 0x01, 0x4e, 0x4e, 0x6b, 0xfe, 0x65, 0xa6, 0xd5, 0xf8, 0x93, 0x0c, 0x14, 0xb7, 0xbd, 0xb1, + 0xb0, 0xcb, 0x85, 0x3e, 0x87, 0xdb, 0x24, 0xba, 0x9e, 0x37, 0x27, 0x3e, 0x3b, 0x83, 0xe7, 0xa7, + 0xe5, 0xa7, 0xea, 0x1b, 0xb5, 0xa4, 0xbe, 0xf1, 0x3d, 0xb8, 0x81, 0xd1, 0x08, 0xdf, 0x1b, 0x7b, + 0xbe, 0xd8, 0xaa, 0xf6, 0x90, 0xf4, 0x0e, 0xcf, 0x0d, 0x4f, 0x95, 0xec, 0xbc, 0x7e, 0xcc, 0xf9, + 0x81, 0x46, 0xb1, 0x1b, 0x11, 0xe0, 0x5d, 0x93, 0x61, 0x78, 0x66, 0x91, 0xa9, 0x28, 0x15, 0x23, + 0x92, 0xa8, 0xf3, 0x02, 0xd1, 0x46, 0x38, 0xaa, 0x46, 0xc6, 0x47, 0x50, 0x8e, 0xbc, 0x0e, 0xec, + 0x2d, 0x28, 0x9f, 0x7a, 0x63, 0xe9, 0x9a, 0xc8, 0x24, 0xae, 0x2e, 0xc8, 0x51, 0x9b, 0xa5, 0x53, + 0xfa, 0x23, 0x30, 0x7e, 0x56, 0x84, 0x62, 0xc7, 0x3d, 0xf3, 0x9c, 0x3e, 0x66, 0xfb, 0x8c, 0xf8, + 0xc8, 0x53, 0xf7, 0x14, 0xc5, 0xdf, 0x18, 0xd1, 0x8f, 0x9f, 0x0e, 0xc8, 0xc9, 0x88, 0x7e, 0xf4, + 0x68, 0xc0, 0x32, 0xcc, 0xf9, 0xfa, 0xdd, 0xff, 0x82, 0x8f, 0xf9, 0x87, 0x91, 0xd1, 0x56, 0xd0, + 0xee, 0x79, 0x8a, 0xba, 0xe8, 0x4e, 0x3a, 0x4e, 0x19, 0xdd, 0x3d, 0x29, 0x23, 0x04, 0x27, 0xec, + 0x26, 0x14, 0xe5, 0x4d, 0x01, 0xca, 0xbb, 0xa6, 0x84, 0x41, 0x09, 0x42, 0x6e, 0xf0, 0x39, 0x45, + 0x93, 0x22, 0x8d, 0x4a, 0xd8, 0xe9, 0x12, 0xb8, 0x29, 0x78, 0xed, 0x36, 0x54, 0x88, 0x9e, 0x48, + 0x4a, 0x32, 0x3f, 0x07, 0x41, 0x48, 0x90, 0xf2, 0x84, 0x46, 0x39, 0xf5, 0x09, 0x0d, 0x4c, 0xe7, + 0x8a, 0xa4, 0x2c, 0x0d, 0x11, 0xe8, 0xe1, 0x04, 0x0d, 0xae, 0xde, 0x8f, 0x91, 0xc6, 0x3d, 0x5d, + 0xa3, 0x52, 0xc6, 0xfd, 0x6b, 0x50, 0x3b, 0xb6, 0x87, 0xc3, 0x23, 0xbb, 0xff, 0x8c, 0x6c, 0xd2, + 0x2a, 0xb9, 0xe1, 0x14, 0x10, 0x8d, 0xd2, 0xdb, 0x50, 0xd1, 0x56, 0x19, 0x93, 0x6f, 0xf2, 0x26, + 0xc4, 0xeb, 0x3b, 0xed, 0x6a, 0xaa, 0xbf, 0x84, 0xab, 0x49, 0x4b, 0x42, 0x9a, 0x4f, 0x26, 0x21, + 0xdd, 0x40, 0x69, 0x2a, 0x13, 0x55, 0x1a, 0x74, 0x4b, 0xdf, 0x1e, 0x0c, 0x30, 0x51, 0x85, 0x9e, + 0xc4, 0xc2, 0xc9, 0x23, 0xfc, 0x02, 0x29, 0xb5, 0x04, 0x23, 0x92, 0x5b, 0xe4, 0x2f, 0x1d, 0xdb, + 0xce, 0x00, 0x93, 0x3e, 0xc9, 0x8c, 0x2d, 0xda, 0xa3, 0xf0, 0xc0, 0x76, 0x06, 0xec, 0x0e, 0x54, + 0x15, 0x1a, 0x4f, 0xc7, 0x45, 0x9a, 0x7f, 0x89, 0x16, 0x67, 0xa2, 0x01, 0xb5, 0x88, 0x62, 0x14, + 0xdf, 0x85, 0xaa, 0x48, 0x12, 0xe4, 0x83, 0x77, 0x31, 0xf8, 0x1f, 0x72, 0xbc, 0xf1, 0x54, 0x7f, + 0x7c, 0x43, 0x8e, 0x55, 0x72, 0xa9, 0xfa, 0x1f, 0x33, 0x1d, 0x4c, 0xa2, 0x14, 0x8a, 0x18, 0x85, + 0x68, 0x56, 0x12, 0x8a, 0x98, 0x24, 0xc5, 0x10, 0x0d, 0x11, 0xb0, 0x8f, 0x34, 0x43, 0xaa, 0x89, + 0xc4, 0x37, 0xa7, 0xea, 0xbf, 0xc2, 0x84, 0x12, 0xdc, 0xeb, 0x04, 0xe2, 0x94, 0x09, 0xb8, 0x3b, + 0xc0, 0x0b, 0x50, 0x25, 0xb3, 0xec, 0x04, 0x4f, 0x09, 0xf0, 0xcb, 0xb5, 0xb0, 0x5a, 0x50, 0xd5, + 0x87, 0xc9, 0x4a, 0x90, 0xdf, 0x3f, 0x68, 0xef, 0x35, 0xae, 0xb1, 0x0a, 0x14, 0xbb, 0xed, 0x5e, + 0x6f, 0xa7, 0xbd, 0xd9, 0xc8, 0xb0, 0x2a, 0x94, 0xa2, 0x6b, 0x1c, 0x59, 0xf1, 0xd5, 0xda, 0xd8, + 0x68, 0x1f, 0xf4, 0xda, 0x9b, 0x8d, 0xdc, 0xf7, 0xf3, 0xa5, 0x6c, 0x23, 0x67, 0xfc, 0x59, 0x0e, + 0x2a, 0xda, 0x2c, 0x3c, 0x5f, 0x18, 0xdf, 0x02, 0x40, 0x93, 0x26, 0xce, 0x63, 0xca, 0x9b, 0x65, + 0x01, 0xa1, 0xc5, 0xd7, 0x9d, 0xe5, 0x39, 0x7a, 0xfe, 0x41, 0x39, 0xcb, 0x5f, 0x83, 0x1a, 0xbd, + 0xa4, 0xa0, 0x87, 0xeb, 0x0a, 0x66, 0x95, 0x80, 0x52, 0x54, 0xe3, 0x3d, 0x30, 0x24, 0xc2, 0x1b, + 0x02, 0xf2, 0x5e, 0x35, 0x81, 0xf0, 0x8e, 0x00, 0x5e, 0xf0, 0x08, 0xbc, 0xe1, 0x19, 0x27, 0x0a, + 0xd2, 0x08, 0x2b, 0x12, 0xd6, 0x93, 0x17, 0xd1, 0xa4, 0x3c, 0xd4, 0x2e, 0x22, 0x15, 0xcc, 0x2a, + 0x01, 0x65, 0x43, 0xef, 0x28, 0x06, 0x2a, 0x21, 0x03, 0xad, 0xce, 0x72, 0x43, 0x82, 0x79, 0x76, + 0x66, 0xfc, 0x59, 0x65, 0x64, 0x8c, 0xef, 0xcc, 0x96, 0x7b, 0xb1, 0x5f, 0x8b, 0xbd, 0x05, 0x6c, + 0x34, 0x1e, 0x5b, 0x29, 0x9e, 0xa6, 0xbc, 0x39, 0x3f, 0x1a, 0x8f, 0x7b, 0x9a, 0x23, 0xe6, 0x97, + 0xe0, 0x04, 0xfb, 0x12, 0x58, 0x4b, 0x6c, 0x60, 0xec, 0x62, 0xe4, 0x42, 0x8d, 0xc5, 0x72, 0x46, + 0x17, 0xcb, 0x29, 0xd2, 0x2f, 0x9b, 0x2a, 0xfd, 0x9e, 0x27, 0x27, 0x8c, 0x2d, 0xa8, 0x1c, 0x68, + 0xef, 0xb4, 0xdc, 0x11, 0x27, 0x84, 0x7a, 0xa1, 0x85, 0xce, 0x0e, 0x72, 0x6e, 0xf9, 0xf2, 0x61, + 0x16, 0xad, 0x37, 0x59, 0xad, 0x37, 0xc6, 0xbf, 0xcc, 0xd0, 0x1d, 0xf8, 0xa8, 0xf3, 0xf1, 0xd3, + 0x30, 0x2a, 0x0e, 0x14, 0xdf, 0x17, 0xac, 0xa8, 0xf8, 0x8f, 0xbc, 0xea, 0x87, 0x5d, 0xb3, 0xbc, + 0xe3, 0xe3, 0x80, 0xab, 0x9b, 0x2f, 0x15, 0x84, 0xed, 0x23, 0x48, 0x29, 0xdf, 0x42, 0xc3, 0x77, + 0xa8, 0xfe, 0x40, 0xde, 0x80, 0x11, 0xca, 0xf7, 0xae, 0x7d, 0x21, 0x5b, 0x0d, 0x84, 0x0a, 0x22, + 0x1d, 0xd5, 0xea, 0xbe, 0x4f, 0xf4, 0x6d, 0xfc, 0x33, 0x79, 0xa5, 0x71, 0x7a, 0x7e, 0xef, 0x43, + 0x29, 0xaa, 0x35, 0x79, 0xc2, 0x2a, 0xca, 0x08, 0x2f, 0xce, 0x71, 0xb4, 0xca, 0x13, 0x3d, 0xa6, + 0xcd, 0x85, 0xc1, 0x86, 0x8e, 0xd6, 0xeb, 0xb7, 0x81, 0x1d, 0x3b, 0xfe, 0x34, 0x31, 0x6d, 0xb6, + 0x06, 0x62, 0x34, 0x6a, 0xe3, 0x10, 0x16, 0x95, 0x94, 0xd0, 0x2c, 0x82, 0xe4, 0xe2, 0x65, 0x5e, + 0x20, 0xe4, 0xb3, 0x33, 0x42, 0xde, 0xf8, 0x69, 0x1e, 0x8a, 0xea, 0xcd, 0xa3, 0xb4, 0x77, 0x7a, + 0xca, 0xc9, 0x77, 0x7a, 0x9a, 0x89, 0x37, 0x1d, 0x70, 0xe9, 0xe5, 0x79, 0x7f, 0x77, 0xfa, 0xc8, + 0xd6, 0x9c, 0xe6, 0x89, 0x63, 0x7b, 0x05, 0xf2, 0x63, 0x3b, 0x3c, 0x45, 0x07, 0x19, 0x31, 0x0f, + 0x7e, 0x2b, 0x67, 0x7a, 0x21, 0xe9, 0x4c, 0x4f, 0x7b, 0xd3, 0x88, 0x54, 0xd2, 0x99, 0x37, 0x8d, + 0x6e, 0x00, 0xe9, 0x17, 0x5a, 0x3e, 0x4c, 0x09, 0x01, 0xe2, 0x2c, 0x4a, 0xaa, 0x23, 0xa5, 0x69, + 0x75, 0xe4, 0xa5, 0x55, 0x85, 0xf7, 0x60, 0x8e, 0xee, 0x03, 0xcb, 0x7b, 0x4d, 0xea, 0x40, 0x91, + 0x73, 0xa8, 0xfe, 0xa7, 0x24, 0x58, 0x53, 0xd2, 0xea, 0x0f, 0x84, 0x54, 0x12, 0x0f, 0x84, 0xe8, + 0x4e, 0xfe, 0x6a, 0xd2, 0xc9, 0x7f, 0x0f, 0x1a, 0xd1, 0x84, 0xa2, 0xcb, 0xcc, 0x0d, 0xe4, 0x8d, + 0x8e, 0xba, 0x82, 0x0b, 0x29, 0xb9, 0x17, 0xc4, 0x07, 0x62, 0x3d, 0x71, 0x20, 0x0a, 0x19, 0xd6, + 0x0a, 0x43, 0x3e, 0x1a, 0x87, 0xf2, 0x40, 0xc4, 0x9c, 0x6f, 0xbd, 0x83, 0xc9, 0x1b, 0x7f, 0x35, + 0x28, 0x77, 0xf6, 0xac, 0xad, 0x9d, 0xce, 0x93, 0xed, 0x5e, 0x23, 0x23, 0x3e, 0xbb, 0x87, 0x1b, + 0x1b, 0xed, 0xf6, 0x26, 0x9e, 0x38, 0x00, 0x73, 0x5b, 0xad, 0x8e, 0x38, 0x7d, 0x72, 0xc6, 0x5f, + 0x66, 0xa0, 0xa2, 0x55, 0xcf, 0xde, 0x8f, 0x66, 0x85, 0xde, 0x90, 0xb8, 0x35, 0xdb, 0x85, 0x07, + 0x4a, 0x14, 0x6b, 0xd3, 0x12, 0xbd, 0xe0, 0x94, 0xbd, 0xf2, 0x05, 0x27, 0xf6, 0x06, 0xcc, 0xdb, + 0x54, 0x43, 0x34, 0x0b, 0xd2, 0x1d, 0x2c, 0xc1, 0x72, 0x12, 0x30, 0x0b, 0x2c, 0x3e, 0x4f, 0x04, + 0x5d, 0x5e, 0x25, 0x5e, 0x45, 0x47, 0xca, 0x5e, 0x60, 0x7c, 0x00, 0x10, 0xf7, 0x24, 0x39, 0xe4, + 0x6b, 0xc9, 0x21, 0x67, 0xb4, 0x21, 0x67, 0x8d, 0x4d, 0x12, 0x0e, 0x72, 0xfa, 0xa2, 0xf8, 0xf3, + 0x3b, 0xa0, 0xfc, 0x4c, 0x16, 0x66, 0x57, 0x8e, 0x87, 0x3c, 0x54, 0x37, 0x1e, 0x17, 0x24, 0xa6, + 0x13, 0x21, 0xd4, 0x05, 0xe4, 0xb8, 0x96, 0x58, 0xc6, 0x48, 0x46, 0x9b, 0x96, 0x31, 0x92, 0xd4, + 0x8c, 0xf0, 0xc6, 0x1a, 0x34, 0x37, 0xb9, 0xa8, 0xad, 0x35, 0x1c, 0x4e, 0x75, 0xc7, 0xb8, 0x01, + 0xd7, 0x53, 0x70, 0xd2, 0xb5, 0xf0, 0x29, 0x2c, 0xb7, 0xe8, 0x72, 0xe3, 0x2f, 0xeb, 0x86, 0x85, + 0xd1, 0x84, 0x95, 0xe9, 0x2a, 0x65, 0x63, 0x5b, 0xb0, 0xb0, 0xc9, 0x8f, 0x26, 0x27, 0x3b, 0xfc, + 0x2c, 0x6e, 0x88, 0x41, 0x3e, 0x38, 0xf5, 0xce, 0xe5, 0xfc, 0xe0, 0xdf, 0x62, 0x67, 0x0e, 0x05, + 0x8d, 0x15, 0x8c, 0x79, 0x5f, 0xf9, 0x39, 0x11, 0xd2, 0x1d, 0xf3, 0xbe, 0xf1, 0x3e, 0x30, 0xbd, + 0x1e, 0x39, 0x5f, 0x42, 0xf7, 0x9f, 0x1c, 0x59, 0xc1, 0x65, 0x10, 0xf2, 0x91, 0x7a, 0x78, 0x04, + 0x82, 0xc9, 0x51, 0x97, 0x20, 0xc6, 0x5d, 0xa8, 0x1e, 0xd8, 0x97, 0x26, 0xff, 0x52, 0xde, 0x1d, + 0x58, 0x85, 0xe2, 0xd8, 0xbe, 0x14, 0x9b, 0x3b, 0x0a, 0x79, 0x20, 0xda, 0xf8, 0xc3, 0x3c, 0xcc, + 0x11, 0x25, 0xbb, 0x43, 0x6f, 0x03, 0x3a, 0x2e, 0x6e, 0x2e, 0x25, 0xfe, 0x34, 0xd0, 0x8c, 0x84, + 0xcc, 0xce, 0x4a, 0x48, 0xe9, 0x16, 0x53, 0x6f, 0x22, 0x28, 0xe7, 0xb4, 0x3b, 0x19, 0xa9, 0x87, + 0x10, 0xd8, 0x4d, 0x28, 0xc7, 0x97, 0xb4, 0xf2, 0xf1, 0xdb, 0x8f, 0x74, 0x35, 0x2b, 0x19, 0x3e, + 0x8c, 0x2d, 0x0c, 0xea, 0x9d, 0x12, 0xfc, 0x52, 0x08, 0xea, 0xa0, 0x54, 0x33, 0xa6, 0xa8, 0x6e, + 0xa5, 0x24, 0xcd, 0x98, 0x19, 0x73, 0xa5, 0xf4, 0x62, 0x73, 0x85, 0xfc, 0x65, 0xcf, 0x31, 0x57, + 0xe0, 0x25, 0xcc, 0x95, 0x97, 0x08, 0xdd, 0x5d, 0x87, 0x12, 0x9e, 0xe6, 0x9a, 0x4c, 0x14, 0xa7, + 0xb8, 0x90, 0x89, 0x1f, 0x6a, 0x0a, 0x3d, 0xe5, 0x0d, 0xdc, 0x88, 0xb7, 0x89, 0xc9, 0xbf, 0xfc, + 0xd5, 0x84, 0x44, 0xbe, 0x80, 0xa2, 0x84, 0x0a, 0x86, 0x76, 0xed, 0x91, 0x7a, 0x56, 0x06, 0xff, + 0x16, 0xd3, 0x86, 0x6f, 0x61, 0x7c, 0x39, 0x71, 0x7c, 0x3e, 0x50, 0x8f, 0x17, 0x38, 0xb8, 0x47, + 0x05, 0x44, 0x0c, 0x50, 0x18, 0x17, 0xae, 0x77, 0xee, 0xca, 0xab, 0xcb, 0x45, 0x27, 0x78, 0x2a, + 0x3e, 0x0d, 0x06, 0x0d, 0x7c, 0x58, 0x6a, 0xec, 0xf9, 0xea, 0xc8, 0x31, 0x7e, 0x9a, 0x81, 0x86, + 0xdc, 0x5d, 0x11, 0x4e, 0xd7, 0xed, 0x0b, 0x57, 0x85, 0xb9, 0x9f, 0xff, 0x14, 0x81, 0x01, 0x35, + 0x74, 0x69, 0x44, 0xe7, 0x0f, 0xb9, 0x64, 0x2a, 0x02, 0xb8, 0x25, 0xcf, 0xa0, 0x57, 0xa0, 0xa2, + 0x92, 0x2c, 0x47, 0xce, 0x50, 0x3d, 0xf3, 0x4a, 0x59, 0x96, 0xbb, 0xce, 0x50, 0x1d, 0x5f, 0xbe, + 0x2d, 0x6f, 0x49, 0x65, 0xf0, 0xf8, 0x32, 0xed, 0x90, 0x1b, 0xff, 0x29, 0x03, 0x0b, 0xda, 0x50, + 0xe4, 0xbe, 0xfd, 0x18, 0xaa, 0xd1, 0x8b, 0x6e, 0x3c, 0xd2, 0xa7, 0x56, 0x93, 0x82, 0x26, 0x2e, + 0x56, 0xe9, 0x47, 0x90, 0x40, 0x74, 0x66, 0x60, 0x5f, 0x62, 0x7f, 0x83, 0xc9, 0x48, 0x99, 0x2c, + 0x03, 0xfb, 0x72, 0x8b, 0xf3, 0xee, 0x64, 0x24, 0x0c, 0xd2, 0x73, 0xce, 0x9f, 0x45, 0x04, 0xa4, + 0x49, 0x81, 0x80, 0x49, 0x0a, 0x03, 0x6a, 0x23, 0xcf, 0x0d, 0x4f, 0x23, 0x12, 0xa9, 0x4b, 0x22, + 0x90, 0x68, 0x8c, 0xff, 0x91, 0x85, 0x45, 0x72, 0x9c, 0x49, 0x87, 0xa5, 0x14, 0x5d, 0x4d, 0x98, + 0x23, 0x1f, 0x22, 0x09, 0xaf, 0xed, 0x6b, 0xa6, 0xfc, 0x66, 0xef, 0xbd, 0xa4, 0xb3, 0x4f, 0x5d, + 0xc4, 0xba, 0x62, 0xfa, 0x73, 0xb3, 0xd3, 0x7f, 0xf5, 0xf4, 0xa6, 0xc5, 0xd1, 0x0a, 0x69, 0x71, + 0xb4, 0x97, 0x89, 0x5e, 0xcd, 0xdc, 0x56, 0x2a, 0x4a, 0x1a, 0xed, 0xb6, 0xd2, 0xfb, 0xb0, 0x9a, + 0xa0, 0x41, 0x69, 0xed, 0x1c, 0x3b, 0x5c, 0xdd, 0x0c, 0x5f, 0xd2, 0xa8, 0xbb, 0x0a, 0xb7, 0x5e, + 0x84, 0x42, 0xd0, 0xf7, 0xc6, 0xdc, 0x58, 0x81, 0xa5, 0xe4, 0xac, 0xca, 0x63, 0xe2, 0xf7, 0x33, + 0xd0, 0x94, 0x59, 0x0f, 0x8e, 0x7b, 0xb2, 0xed, 0x04, 0xa1, 0xe7, 0x47, 0x2f, 0x9f, 0xdd, 0x02, + 0x08, 0x42, 0xdb, 0x97, 0x36, 0x24, 0x69, 0xb7, 0x65, 0x84, 0xa0, 0x7d, 0x78, 0x1d, 0x4a, 0xdc, + 0x1d, 0x10, 0x92, 0xb8, 0xa1, 0xc8, 0xdd, 0x81, 0xb2, 0x2e, 0x67, 0xb4, 0xea, 0x5a, 0xd2, 0x68, + 0x90, 0xd7, 0x26, 0xc5, 0xec, 0xf0, 0x33, 0x3c, 0x78, 0xf3, 0xd1, 0xb5, 0xc9, 0x5d, 0xfb, 0x02, + 0x73, 0x08, 0x03, 0xe3, 0x1f, 0x67, 0x61, 0x3e, 0xee, 0x1f, 0xdd, 0xb9, 0x4e, 0xc8, 0x6f, 0xd9, + 0xab, 0x58, 0x7e, 0xdf, 0x91, 0xec, 0xe0, 0x08, 0xad, 0x5c, 0x73, 0x27, 0x96, 0x68, 0x73, 0x76, + 0x5c, 0x66, 0x40, 0x45, 0x51, 0x78, 0x93, 0x50, 0x7b, 0x80, 0xa8, 0x4c, 0x24, 0xfb, 0x93, 0x50, + 0x98, 0x51, 0xc2, 0x9e, 0x74, 0x5c, 0x69, 0xc8, 0x14, 0xec, 0x51, 0xd8, 0xc1, 0x77, 0x8d, 0x05, + 0x58, 0x14, 0xa3, 0x85, 0x14, 0x54, 0x82, 0xbe, 0x41, 0xda, 0x33, 0xad, 0x1c, 0x6a, 0xce, 0xba, + 0x6a, 0x49, 0x4f, 0x3c, 0x46, 0xaa, 0xe5, 0x2b, 0x50, 0xa1, 0xca, 0xe3, 0xcb, 0x69, 0x79, 0xb3, + 0x8c, 0x2d, 0x20, 0x5e, 0xba, 0x76, 0xbc, 0x49, 0xc2, 0xa0, 0x05, 0x6a, 0x0a, 0x93, 0x0a, 0xfe, + 0x41, 0x06, 0xae, 0xa7, 0x2c, 0x9b, 0xdc, 0xe5, 0x1b, 0xb0, 0x70, 0x1c, 0x21, 0xd5, 0xec, 0xd2, + 0x56, 0x5f, 0x51, 0x62, 0x35, 0x39, 0xa7, 0x66, 0xe3, 0x38, 0x09, 0x88, 0x4d, 0x29, 0x5a, 0xc1, + 0xc4, 0xfd, 0x43, 0x34, 0xa5, 0x68, 0x19, 0xc9, 0x8a, 0x39, 0x80, 0xb5, 0xf6, 0x85, 0x90, 0x18, + 0x1b, 0xfa, 0xc3, 0xdc, 0x8a, 0x8d, 0x92, 0x6e, 0xe3, 0xcc, 0x4b, 0xb9, 0x8d, 0x07, 0x74, 0xcd, + 0x2a, 0xaa, 0xeb, 0xdb, 0x54, 0x82, 0x07, 0xa8, 0x28, 0x43, 0x0f, 0x8b, 0xab, 0x3b, 0x90, 0xfd, + 0xe8, 0x41, 0x71, 0x23, 0x80, 0xf9, 0xdd, 0xc9, 0x30, 0x74, 0xe2, 0x37, 0xc6, 0xd9, 0x7b, 0xb2, + 0x0c, 0xb6, 0xa3, 0x66, 0x2d, 0xb5, 0x21, 0x88, 0x1a, 0xc2, 0xc9, 0x1a, 0x89, 0x8a, 0xac, 0xd9, + 0xf6, 0xe6, 0x47, 0xc9, 0x16, 0x8c, 0xeb, 0xb0, 0x1a, 0x7f, 0xd1, 0xb4, 0xa9, 0xa3, 0xe6, 0x5f, + 0x64, 0x28, 0x61, 0x39, 0xf9, 0xde, 0x39, 0x6b, 0xc3, 0x62, 0xe0, 0xb8, 0x27, 0x43, 0xae, 0x57, + 0x1f, 0xc8, 0x49, 0x58, 0x4e, 0xf6, 0x4d, 0xbe, 0x89, 0x6e, 0x2e, 0x50, 0x89, 0xb8, 0xb6, 0x80, + 0xad, 0x5f, 0xd5, 0xc9, 0x98, 0x2d, 0xa6, 0x66, 0x63, 0xb6, 0xf3, 0x1d, 0xa8, 0x27, 0x1b, 0x62, + 0x1f, 0xca, 0x2b, 0x86, 0x71, 0xaf, 0x72, 0x53, 0xb7, 0xc5, 0x62, 0x86, 0xa8, 0xc4, 0x73, 0x1f, + 0x18, 0xff, 0x30, 0x03, 0x4d, 0x93, 0x0b, 0xce, 0xd5, 0x7a, 0xa9, 0x78, 0xe6, 0xe3, 0x99, 0x5a, + 0xaf, 0x1e, 0xab, 0xba, 0xb9, 0xa8, 0x7a, 0xf4, 0xf6, 0x95, 0x8b, 0xb1, 0x7d, 0x6d, 0x66, 0x44, + 0xeb, 0x25, 0x98, 0x23, 0x12, 0x63, 0x15, 0x96, 0x65, 0x7f, 0x54, 0x5f, 0xe2, 0x98, 0x60, 0xa2, + 0xc5, 0x44, 0x4c, 0x70, 0x0d, 0x9a, 0xf4, 0x80, 0x9d, 0x3e, 0x08, 0x59, 0x70, 0x13, 0xd8, 0xae, + 0xdd, 0xb7, 0x7d, 0xcf, 0x73, 0x0f, 0xb8, 0x2f, 0xd3, 0x3f, 0x51, 0xc3, 0xc4, 0x90, 0x99, 0x52, + 0x85, 0xe9, 0x4b, 0x3d, 0xbb, 0xe6, 0xb9, 0x2a, 0xdb, 0x85, 0xbe, 0x0c, 0x13, 0x16, 0xd7, 0xed, + 0x67, 0x5c, 0xd5, 0xa4, 0xa6, 0xe8, 0x13, 0xa8, 0x8c, 0xa3, 0x4a, 0xd5, 0xbc, 0xab, 0x7b, 0xc8, + 0xb3, 0xcd, 0x9a, 0x3a, 0xb5, 0xf1, 0x18, 0x96, 0x92, 0x75, 0x4a, 0xd1, 0xb1, 0x06, 0xa5, 0x91, + 0x84, 0xc9, 0xde, 0x45, 0xdf, 0xc6, 0xff, 0x2d, 0x42, 0x71, 0xcb, 0x76, 0x86, 0x42, 0xf1, 0x7a, + 0x00, 0xf9, 0xbe, 0xca, 0x38, 0x8a, 0x9f, 0xb7, 0x90, 0x58, 0xf5, 0xff, 0x06, 0xe6, 0x1d, 0x09, + 0x3a, 0xf6, 0x09, 0xd4, 0x93, 0xb1, 0xce, 0xa9, 0x4b, 0x8e, 0xc9, 0x20, 0x65, 0xad, 0x3f, 0x15, + 0xd5, 0x2a, 0xc7, 0x87, 0x23, 0xe9, 0x0c, 0xa5, 0x53, 0xed, 0xf4, 0xf4, 0x5c, 0xa1, 0x6f, 0x07, + 0xa7, 0xb6, 0xf5, 0xf8, 0xfd, 0x0f, 0xe4, 0x2d, 0xc7, 0x0a, 0x02, 0xbb, 0xa7, 0xf6, 0xe3, 0xf7, + 0x3f, 0x98, 0xd6, 0xa4, 0xe9, 0xa2, 0x9b, 0xae, 0x49, 0x2f, 0x41, 0x81, 0xde, 0x17, 0xa3, 0xd4, + 0x11, 0xfa, 0x60, 0x8f, 0x60, 0xe9, 0x98, 0x46, 0x62, 0xc9, 0x24, 0x5f, 0x92, 0x82, 0x25, 0xba, + 0x59, 0x23, 0x71, 0x5d, 0x44, 0x91, 0xc7, 0x67, 0x05, 0xe6, 0x4e, 0xe3, 0xc7, 0xe2, 0x6a, 0xa6, + 0xfc, 0x32, 0xfe, 0x6b, 0x01, 0x2a, 0xda, 0xa4, 0xb0, 0x2a, 0x94, 0xcc, 0x76, 0xb7, 0x6d, 0x7e, + 0xd6, 0xde, 0x6c, 0x5c, 0x63, 0xf7, 0xe0, 0xf5, 0xce, 0xde, 0xc6, 0xbe, 0x69, 0xb6, 0x37, 0x7a, + 0xd6, 0xbe, 0x69, 0xa9, 0x97, 0x4f, 0x0e, 0x5a, 0x5f, 0xec, 0xb6, 0xf7, 0x7a, 0xd6, 0x66, 0xbb, + 0xd7, 0xea, 0xec, 0x74, 0x1b, 0x19, 0x76, 0x13, 0x9a, 0x31, 0xa5, 0x42, 0xb7, 0x76, 0xf7, 0x0f, + 0xf7, 0x7a, 0x8d, 0x2c, 0xbb, 0x0d, 0x37, 0xb6, 0x3a, 0x7b, 0xad, 0x1d, 0x2b, 0xa6, 0xd9, 0xd8, + 0xe9, 0x7d, 0x66, 0xb5, 0x7f, 0x70, 0xd0, 0x31, 0xbf, 0x68, 0xe4, 0xd2, 0x08, 0x84, 0x31, 0xae, + 0x6a, 0xc8, 0xb3, 0xeb, 0xb0, 0x4c, 0x04, 0x54, 0xc4, 0xea, 0xed, 0xef, 0x5b, 0xdd, 0xfd, 0xfd, + 0xbd, 0x46, 0x81, 0x2d, 0x40, 0xad, 0xb3, 0xf7, 0x59, 0x6b, 0xa7, 0xb3, 0x69, 0x99, 0xed, 0xd6, + 0xce, 0x6e, 0x63, 0x8e, 0x2d, 0xc2, 0xfc, 0x34, 0x5d, 0x51, 0x54, 0xa1, 0xe8, 0xf6, 0xf7, 0x3a, + 0xfb, 0x7b, 0xd6, 0x67, 0x6d, 0xb3, 0xdb, 0xd9, 0xdf, 0x6b, 0x94, 0xd8, 0x0a, 0xb0, 0x24, 0x6a, + 0x7b, 0xb7, 0xb5, 0xd1, 0x28, 0xb3, 0x65, 0x58, 0x48, 0xc2, 0x9f, 0xb6, 0xbf, 0x68, 0x00, 0x6b, + 0xc2, 0x12, 0x75, 0xcc, 0x5a, 0x6f, 0xef, 0xec, 0x7f, 0x6e, 0xed, 0x76, 0xf6, 0x3a, 0xbb, 0x87, + 0xbb, 0x8d, 0x0a, 0x3e, 0xad, 0xd4, 0x6e, 0x5b, 0x9d, 0xbd, 0xee, 0xe1, 0xd6, 0x56, 0x67, 0xa3, + 0xd3, 0xde, 0xeb, 0x35, 0xaa, 0xd4, 0x72, 0xda, 0xc0, 0x6b, 0xa2, 0x80, 0xbc, 0x09, 0x60, 0x6d, + 0x76, 0xba, 0xad, 0xf5, 0x9d, 0xf6, 0x66, 0xa3, 0xce, 0x6e, 0xc1, 0xf5, 0x5e, 0x7b, 0xf7, 0x60, + 0xdf, 0x6c, 0x99, 0x5f, 0xa8, 0x9b, 0x02, 0xd6, 0x56, 0xab, 0xb3, 0x73, 0x68, 0xb6, 0x1b, 0xf3, + 0xec, 0x55, 0xb8, 0x65, 0xb6, 0x3f, 0x3d, 0xec, 0x98, 0xed, 0x4d, 0x6b, 0x6f, 0x7f, 0xb3, 0x6d, + 0x6d, 0xb5, 0x5b, 0xbd, 0x43, 0xb3, 0x6d, 0xed, 0x76, 0xba, 0xdd, 0xce, 0xde, 0x93, 0x46, 0x83, + 0xbd, 0x0e, 0x77, 0x22, 0x92, 0xa8, 0x82, 0x29, 0xaa, 0x05, 0x31, 0x3e, 0xb5, 0xa4, 0x7b, 0xed, + 0x1f, 0xf4, 0xac, 0x83, 0x76, 0xdb, 0x6c, 0x30, 0xb6, 0x06, 0x2b, 0x71, 0xf3, 0xd4, 0x80, 0x6c, + 0x7b, 0x51, 0xe0, 0x0e, 0xda, 0xe6, 0x6e, 0x6b, 0x4f, 0x2c, 0x70, 0x02, 0xb7, 0x24, 0xba, 0x1d, + 0xe3, 0xa6, 0xbb, 0xbd, 0xcc, 0x18, 0xd4, 0xb5, 0x55, 0xd9, 0x6a, 0x99, 0x8d, 0x15, 0x36, 0x0f, + 0x95, 0xdd, 0x83, 0x03, 0xab, 0xd7, 0xd9, 0x6d, 0xef, 0x1f, 0xf6, 0x1a, 0xab, 0x6c, 0x09, 0xe6, + 0x55, 0x97, 0x54, 0xc9, 0x9f, 0x17, 0xd9, 0x2a, 0xb0, 0xc3, 0x3d, 0xb3, 0xdd, 0xda, 0x14, 0x33, + 0x14, 0x21, 0xfe, 0x4f, 0x51, 0x06, 0x38, 0x7e, 0x9a, 0x8b, 0x4e, 0xe5, 0x38, 0x63, 0x20, 0xf9, + 0x46, 0x68, 0x55, 0x7b, 0xdb, 0xf3, 0x45, 0xaf, 0x77, 0x6b, 0x36, 0x54, 0x6e, 0xc6, 0x86, 0x9a, + 0x31, 0xd2, 0x6b, 0xba, 0x92, 0xf7, 0x1a, 0xd4, 0x46, 0xf4, 0x5e, 0xa8, 0x7c, 0x17, 0x10, 0x64, + 0xfa, 0x0c, 0x01, 0xe9, 0x51, 0xc0, 0x99, 0xe7, 0xab, 0x0b, 0xb3, 0xcf, 0x57, 0xa7, 0x29, 0xf2, + 0x73, 0x69, 0x8a, 0xfc, 0x7d, 0x58, 0x20, 0x19, 0xe4, 0xb8, 0xce, 0x48, 0x99, 0xc7, 0xa4, 0xee, + 0xcd, 0xa3, 0x2c, 0x22, 0xb8, 0xb2, 0x1b, 0x94, 0x6d, 0x21, 0x65, 0x45, 0x51, 0x9a, 0x15, 0x09, + 0x93, 0x82, 0x44, 0x44, 0x64, 0x52, 0x44, 0x2d, 0xd8, 0x17, 0x71, 0x0b, 0x15, 0xad, 0x05, 0x82, + 0x63, 0x0b, 0xf7, 0x61, 0x81, 0x5f, 0x84, 0xbe, 0x6d, 0x79, 0x63, 0xfb, 0xcb, 0x09, 0x46, 0x60, + 0x6d, 0x34, 0xd6, 0xab, 0xe6, 0x3c, 0x22, 0xf6, 0x11, 0xbe, 0x69, 0x87, 0xf6, 0xfd, 0xaf, 0xa1, + 0xa2, 0xbd, 0x25, 0xcb, 0x56, 0x61, 0xf1, 0xf3, 0x4e, 0x6f, 0xaf, 0xdd, 0xed, 0x5a, 0x07, 0x87, + 0xeb, 0x4f, 0xdb, 0x5f, 0x58, 0xdb, 0xad, 0xee, 0x76, 0xe3, 0x9a, 0xd8, 0x9d, 0x7b, 0xed, 0x6e, + 0xaf, 0xbd, 0x99, 0x80, 0x67, 0xd8, 0x2b, 0xb0, 0x76, 0xb8, 0x77, 0xd8, 0x6d, 0x6f, 0x5a, 0x69, + 0xe5, 0xb2, 0x82, 0x1d, 0x25, 0x3e, 0xa5, 0x78, 0xee, 0xfe, 0x27, 0xd0, 0x98, 0x0e, 0x06, 0x25, + 0xa2, 0x67, 0xcf, 0x0b, 0xb3, 0xdd, 0xff, 0x37, 0x39, 0x80, 0x38, 0x5b, 0x5f, 0x48, 0x84, 0xcd, + 0x56, 0xaf, 0xb5, 0xb3, 0x2f, 0x3a, 0x61, 0xee, 0xf7, 0xc4, 0x46, 0x37, 0xdb, 0x9f, 0x36, 0xae, + 0xa5, 0x62, 0xf6, 0x0f, 0x7a, 0x8d, 0x8c, 0x18, 0x6f, 0x67, 0xaf, 0xd3, 0xeb, 0xb4, 0x76, 0x2c, + 0x73, 0xff, 0xb0, 0xb3, 0xf7, 0x84, 0x5e, 0x8b, 0x42, 0x61, 0x78, 0x78, 0xb0, 0x65, 0xee, 0xef, + 0xf5, 0xac, 0xee, 0xf6, 0x61, 0x6f, 0x13, 0xdf, 0x9a, 0xda, 0x30, 0x3b, 0x07, 0x54, 0x67, 0xfe, + 0x79, 0x04, 0xa2, 0xea, 0x82, 0x98, 0xb1, 0x27, 0xfb, 0xdd, 0x6e, 0xe7, 0xc0, 0xfa, 0xf4, 0xb0, + 0x6d, 0x76, 0xda, 0x5d, 0x2c, 0x38, 0x97, 0x02, 0x17, 0xf4, 0x45, 0x21, 0x42, 0x7b, 0x3b, 0x9f, + 0x49, 0x19, 0x27, 0x48, 0x4b, 0x49, 0x90, 0xa0, 0x2a, 0x8b, 0xad, 0x2f, 0x84, 0x44, 0x4a, 0xcd, + 0x70, 0x05, 0x4e, 0x94, 0xab, 0x08, 0xf1, 0xd7, 0xed, 0xb5, 0x7a, 0x9d, 0x0d, 0x4b, 0x3e, 0x50, + 0x27, 0x16, 0x41, 0x14, 0xab, 0xa6, 0xa3, 0x44, 0x29, 0x94, 0x8c, 0xd1, 0x39, 0xb2, 0xb9, 0x69, + 0x62, 0x81, 0xfa, 0x0c, 0x54, 0xd0, 0xce, 0x8b, 0x85, 0x12, 0x52, 0x44, 0x90, 0x34, 0xd4, 0x87, + 0xc0, 0x2c, 0x3c, 0xfe, 0x9d, 0x1c, 0xd4, 0xe9, 0xe6, 0x14, 0xfd, 0x10, 0x0f, 0xf7, 0xd9, 0x2e, + 0x14, 0xe5, 0x2f, 0x3a, 0xb1, 0xe5, 0xe8, 0xcd, 0x20, 0xfd, 0x37, 0xa4, 0xd6, 0x56, 0xa6, 0xc1, + 0x52, 0x6b, 0x5a, 0xfc, 0x9b, 0x7f, 0xfa, 0x17, 0xff, 0x28, 0x5b, 0x63, 0x95, 0x87, 0x67, 0xef, + 0x3e, 0x3c, 0xe1, 0x6e, 0x20, 0xea, 0xf8, 0x6b, 0x00, 0xf1, 0xef, 0x14, 0xb1, 0x66, 0x14, 0x01, + 0x9a, 0xfa, 0x11, 0xa7, 0xb5, 0xeb, 0x29, 0x18, 0x59, 0xef, 0x75, 0xac, 0x77, 0xd1, 0xa8, 0x8b, + 0x7a, 0x1d, 0xd7, 0x09, 0xe9, 0x37, 0x8b, 0x3e, 0xce, 0xdc, 0x67, 0x03, 0xa8, 0xea, 0xbf, 0x20, + 0xc4, 0x94, 0x42, 0x93, 0xf2, 0x1b, 0x48, 0x6b, 0x37, 0x52, 0x71, 0x4a, 0x55, 0xc4, 0x36, 0x96, + 0x8d, 0x86, 0x68, 0x63, 0x82, 0x14, 0x71, 0x2b, 0x43, 0x52, 0x9e, 0xe3, 0x1f, 0x0a, 0x62, 0x37, + 0x35, 0xf5, 0x67, 0xe6, 0x67, 0x8a, 0xd6, 0x6e, 0x5d, 0x81, 0x95, 0x6d, 0xdd, 0xc2, 0xb6, 0x56, + 0x0d, 0x26, 0xda, 0xea, 0x23, 0x8d, 0xfa, 0x99, 0xa2, 0x8f, 0x33, 0xf7, 0x1f, 0xff, 0xf9, 0x3d, + 0x28, 0x47, 0x99, 0x94, 0xec, 0xb7, 0xa0, 0x96, 0xb8, 0xda, 0xc6, 0xd4, 0x30, 0xd2, 0x6e, 0xc2, + 0xad, 0xdd, 0x4c, 0x47, 0xca, 0x86, 0x5f, 0xc1, 0x86, 0x9b, 0x6c, 0x45, 0x34, 0x2c, 0xaf, 0x8e, + 0x3d, 0xc4, 0x0b, 0xa0, 0xf4, 0x02, 0xd3, 0x33, 0xcd, 0x48, 0xa0, 0xc6, 0x6e, 0x4e, 0x2b, 0xee, + 0x89, 0xd6, 0x6e, 0x5d, 0x81, 0x95, 0xcd, 0xdd, 0xc4, 0xe6, 0x56, 0xd8, 0x92, 0xde, 0x9c, 0xca, + 0x7b, 0x64, 0x1c, 0x5f, 0x3d, 0xd3, 0x7f, 0x47, 0x87, 0xdd, 0x8a, 0xdf, 0xa8, 0x4a, 0xf9, 0x7d, + 0x9d, 0x88, 0x45, 0x66, 0x7f, 0x64, 0xc7, 0x68, 0x62, 0x53, 0x8c, 0xe1, 0xf2, 0xe9, 0x3f, 0xa3, + 0xc3, 0x8e, 0xa0, 0xa2, 0x3d, 0x3d, 0xcf, 0xae, 0x5f, 0xf9, 0x4c, 0xfe, 0xda, 0x5a, 0x1a, 0x2a, + 0x6d, 0x28, 0x7a, 0xfd, 0x0f, 0x8f, 0x39, 0x67, 0x3f, 0x82, 0x72, 0xf4, 0xa0, 0x39, 0x5b, 0xd5, + 0x1e, 0x98, 0xd7, 0x1f, 0x60, 0x5f, 0x6b, 0xce, 0x22, 0xd2, 0x98, 0x4f, 0xaf, 0x5d, 0x30, 0xdf, + 0xe7, 0x50, 0xd1, 0x1e, 0x2d, 0x8f, 0x06, 0x30, 0xfb, 0x30, 0x7a, 0x34, 0x80, 0x94, 0x37, 0xce, + 0x8d, 0x05, 0x6c, 0xa2, 0xc2, 0xca, 0xc8, 0xdf, 0xe1, 0x85, 0x17, 0xb0, 0x1d, 0x58, 0x96, 0x06, + 0xd1, 0x11, 0xff, 0x26, 0xcb, 0x90, 0xf2, 0xd3, 0x45, 0x8f, 0x32, 0xec, 0x13, 0x28, 0xa9, 0xb7, + 0xe9, 0xd9, 0x4a, 0xfa, 0x1b, 0xfb, 0x6b, 0xab, 0x33, 0x70, 0x69, 0xbd, 0x7c, 0x01, 0x10, 0xbf, + 0x90, 0x1e, 0x09, 0x89, 0x99, 0x17, 0xd7, 0x23, 0x0e, 0x98, 0x7d, 0x4e, 0xdd, 0x58, 0xc1, 0x01, + 0x36, 0x18, 0x0a, 0x09, 0x97, 0x9f, 0xab, 0xe7, 0x1f, 0x7f, 0x0c, 0x15, 0xed, 0x91, 0xf4, 0x68, + 0xfa, 0x66, 0x1f, 0x58, 0x8f, 0xa6, 0x2f, 0xe5, 0x4d, 0x75, 0x63, 0x0d, 0x6b, 0x5f, 0x32, 0xe6, + 0x45, 0xed, 0x42, 0x51, 0x92, 0x0a, 0x8b, 0x58, 0xa0, 0x53, 0xa8, 0x25, 0x5e, 0x42, 0x8f, 0x76, + 0x68, 0xda, 0x3b, 0xeb, 0xd1, 0x0e, 0x4d, 0x7d, 0x3c, 0x5d, 0xf1, 0x99, 0xb1, 0x20, 0xda, 0x39, + 0x43, 0x12, 0xad, 0xa5, 0x1f, 0x42, 0x45, 0x7b, 0xd5, 0x3c, 0x1a, 0xcb, 0xec, 0x03, 0xea, 0xd1, + 0x58, 0xd2, 0x1e, 0x41, 0x5f, 0xc2, 0x36, 0xea, 0x06, 0xb2, 0x02, 0x3e, 0xae, 0x27, 0xea, 0xfe, + 0x2d, 0xa8, 0x27, 0x1f, 0x3a, 0x8f, 0xf6, 0x7e, 0xea, 0x8b, 0xe9, 0xd1, 0xde, 0xbf, 0xe2, 0x75, + 0x74, 0xc9, 0xd2, 0xf7, 0x17, 0xa3, 0x46, 0x1e, 0x7e, 0x25, 0xef, 0x84, 0x7c, 0xcd, 0x3e, 0x15, + 0x02, 0x4e, 0xbe, 0xed, 0xc8, 0x56, 0x35, 0xae, 0xd5, 0x5f, 0x80, 0x8c, 0xf6, 0xcb, 0xcc, 0x33, + 0x90, 0x49, 0x66, 0xc6, 0xca, 0xd9, 0x13, 0x58, 0x8c, 0x98, 0x39, 0x7a, 0xac, 0x31, 0x88, 0xc6, + 0x90, 0xfa, 0x24, 0xe4, 0x5a, 0x63, 0x1a, 0xfb, 0x28, 0x43, 0xc7, 0x1f, 0x3e, 0x91, 0xa7, 0x1d, + 0x7f, 0xfa, 0x7b, 0x8d, 0xda, 0xf1, 0x97, 0x78, 0x49, 0x6f, 0xfa, 0xf8, 0x0b, 0x1d, 0x51, 0x87, + 0x0b, 0xf3, 0xd3, 0x4f, 0x27, 0xde, 0xba, 0xea, 0xe1, 0x00, 0xaa, 0xfe, 0x95, 0xe7, 0xbf, 0x2b, + 0x90, 0x14, 0x45, 0x4a, 0x9a, 0x3e, 0x94, 0x99, 0x1f, 0xec, 0x37, 0xa1, 0xaa, 0xbf, 0xd4, 0xcc, + 0x74, 0x99, 0x30, 0xdd, 0xd2, 0x8d, 0x54, 0x5c, 0x92, 0x4b, 0x58, 0x55, 0x6f, 0x86, 0x7d, 0x06, + 0x2b, 0xd1, 0x34, 0xeb, 0x97, 0xc6, 0x03, 0x76, 0x3b, 0xe5, 0x2a, 0x79, 0x62, 0xb2, 0xaf, 0x5f, + 0x79, 0xd7, 0xfc, 0x51, 0x46, 0x70, 0x5f, 0xf2, 0xc9, 0xd8, 0xf8, 0xe4, 0x49, 0x7b, 0x29, 0x37, + 0x3e, 0x79, 0x52, 0xdf, 0x99, 0x55, 0xdc, 0xc7, 0x16, 0x13, 0x73, 0x44, 0x39, 0xb1, 0xec, 0x87, + 0x30, 0xaf, 0xdd, 0x88, 0xef, 0x5e, 0xba, 0xfd, 0x68, 0x27, 0xcd, 0xbe, 0xc7, 0xb6, 0x96, 0xe6, + 0x42, 0x34, 0x56, 0xb1, 0xfe, 0x05, 0x23, 0x31, 0x39, 0x62, 0x17, 0x6d, 0x40, 0x45, 0xbf, 0x6d, + 0xff, 0x9c, 0x7a, 0x57, 0x35, 0x94, 0xfe, 0xf4, 0xd7, 0xa3, 0x0c, 0xdb, 0x81, 0xc6, 0xf4, 0x4b, + 0x45, 0x91, 0x4c, 0x49, 0x7b, 0x5d, 0x69, 0x6d, 0x0a, 0x99, 0x78, 0xdf, 0x88, 0x1d, 0xd0, 0xad, + 0x8a, 0xe8, 0x77, 0x7e, 0x3c, 0x7f, 0xfa, 0x54, 0x4f, 0xfe, 0xfe, 0x4f, 0x54, 0x5b, 0xda, 0x2f, + 0x3f, 0xdd, 0xcb, 0x3c, 0xca, 0xb0, 0xdf, 0xcb, 0x40, 0x35, 0xf1, 0x3a, 0x48, 0x22, 0x6f, 0x7d, + 0x6a, 0x9c, 0x4d, 0x1d, 0xa7, 0x0f, 0xd4, 0x30, 0x71, 0x12, 0x77, 0xee, 0x7f, 0x3f, 0xb1, 0x48, + 0x5f, 0x25, 0x22, 0x70, 0x0f, 0xa6, 0x7f, 0x08, 0xe8, 0xeb, 0x69, 0x02, 0xfd, 0x99, 0xbd, 0xaf, + 0x1f, 0x65, 0xd8, 0xbf, 0xcb, 0x40, 0x3d, 0x19, 0x5a, 0x8f, 0x86, 0x9b, 0x1a, 0xc4, 0x8f, 0x58, + 0xe9, 0x8a, 0x78, 0xfc, 0x0f, 0xb1, 0x97, 0xbd, 0xfb, 0x66, 0xa2, 0x97, 0xf2, 0xb1, 0xe3, 0x5f, + 0xac, 0xb7, 0xec, 0x63, 0xfa, 0xdd, 0x3d, 0x95, 0x47, 0xc4, 0x66, 0x7f, 0xa7, 0x2d, 0x62, 0x3f, + 0xfd, 0x57, 0xcd, 0x70, 0x11, 0x7e, 0x4c, 0x3f, 0x78, 0xa3, 0xd2, 0x52, 0x04, 0x17, 0xbf, 0x6c, + 0x79, 0xe3, 0x75, 0x1c, 0xd3, 0x2b, 0xc6, 0xf5, 0xc4, 0x98, 0xa6, 0x15, 0x8f, 0x16, 0xf5, 0x4e, + 0xfe, 0x28, 0x59, 0x7c, 0x72, 0xce, 0xfc, 0x50, 0xd9, 0xd5, 0x9d, 0x1c, 0x51, 0x27, 0x25, 0x79, + 0x62, 0xab, 0xbd, 0x64, 0x35, 0xc6, 0x7d, 0xec, 0xeb, 0xeb, 0xc6, 0xed, 0x2b, 0xfb, 0xfa, 0x10, + 0xc3, 0xe4, 0xa2, 0xc7, 0x07, 0x00, 0x71, 0x9e, 0x1f, 0x9b, 0xca, 0x36, 0x8b, 0x04, 0xd0, 0x6c, + 0x2a, 0x60, 0x72, 0x3f, 0xab, 0xa4, 0x34, 0x51, 0xe3, 0x8f, 0x48, 0x9c, 0x46, 0x79, 0x70, 0xba, + 0xf6, 0x95, 0x4c, 0xc9, 0x4b, 0x68, 0x5f, 0xd3, 0xf5, 0x27, 0x84, 0x69, 0x94, 0xf4, 0x76, 0x08, + 0xb5, 0x1d, 0xcf, 0x7b, 0x36, 0x19, 0x47, 0xb9, 0xe5, 0xc9, 0xdc, 0x95, 0x6d, 0x3b, 0x38, 0x5d, + 0x9b, 0x1a, 0x85, 0x71, 0x07, 0xab, 0x5a, 0x63, 0x4d, 0xad, 0xaa, 0x87, 0x5f, 0xc5, 0xc9, 0x85, + 0x5f, 0x33, 0x1b, 0x16, 0x22, 0x19, 0x1d, 0x27, 0xf0, 0x25, 0xab, 0x49, 0x48, 0xe6, 0xe9, 0x26, + 0x12, 0x66, 0x82, 0xea, 0xed, 0xc3, 0x40, 0xd5, 0xf9, 0x28, 0xc3, 0x0e, 0xa0, 0xba, 0xc9, 0xfb, + 0x78, 0x4b, 0x1e, 0x33, 0x40, 0x16, 0x13, 0xd9, 0x04, 0x94, 0x3a, 0xb2, 0x56, 0x4b, 0x00, 0x93, + 0xe7, 0xd6, 0xd8, 0xbe, 0xf4, 0xf9, 0x97, 0x0f, 0xbf, 0x92, 0xb9, 0x25, 0x5f, 0xab, 0x73, 0x4b, + 0xe5, 0xde, 0x24, 0xce, 0xad, 0xa9, 0x64, 0x9d, 0xc4, 0xb9, 0x35, 0x93, 0xac, 0x93, 0x98, 0x6a, + 0x95, 0xfb, 0xc3, 0x86, 0xb0, 0x30, 0x93, 0xdf, 0x13, 0x1d, 0x59, 0x57, 0x65, 0x05, 0xad, 0xdd, + 0xb9, 0x9a, 0x20, 0xd9, 0xda, 0xfd, 0x64, 0x6b, 0x5d, 0xa8, 0xd1, 0xcb, 0x7f, 0x47, 0x9c, 0xee, + 0xcb, 0x4d, 0x3d, 0x36, 0xa3, 0x5f, 0xc6, 0x9b, 0x3e, 0x60, 0x10, 0x97, 0xd4, 0x70, 0xf0, 0xa2, + 0x1a, 0xfb, 0x11, 0x54, 0x9e, 0xf0, 0x50, 0x5d, 0x90, 0x8b, 0x74, 0xec, 0xa9, 0x1b, 0x73, 0x6b, + 0x29, 0xf7, 0xeb, 0x92, 0x3c, 0x83, 0xb5, 0x3d, 0xe4, 0x83, 0x13, 0x4e, 0xc2, 0xc9, 0x72, 0x06, + 0x5f, 0xb3, 0x1f, 0x60, 0xe5, 0xd1, 0xbd, 0xe4, 0x15, 0xed, 0x06, 0x94, 0x5e, 0xf9, 0xfc, 0x14, + 0x3c, 0xad, 0x66, 0xd7, 0x1b, 0x70, 0x4d, 0xd7, 0x73, 0xa1, 0xa2, 0xbd, 0x5f, 0x10, 0x6d, 0xa0, + 0xd9, 0xf7, 0x2a, 0xa2, 0x0d, 0x94, 0xf2, 0xdc, 0x81, 0x71, 0x0f, 0xdb, 0x31, 0xd8, 0x9d, 0xb8, + 0x1d, 0x7a, 0xe2, 0x20, 0x6e, 0xe9, 0xe1, 0x57, 0xf6, 0x28, 0xfc, 0x9a, 0x7d, 0x8e, 0xef, 0x6b, + 0xeb, 0x17, 0x00, 0x63, 0xa3, 0x61, 0xfa, 0xae, 0x60, 0x34, 0x59, 0x1a, 0x2a, 0x69, 0x48, 0x50, + 0x53, 0xa8, 0xc9, 0xbd, 0x0f, 0xd0, 0x0d, 0xbd, 0xf1, 0xa6, 0xcd, 0x47, 0x9e, 0x1b, 0xcb, 0xda, + 0xf8, 0x4a, 0x5a, 0x2c, 0xbf, 0xb4, 0x7b, 0x69, 0xec, 0x73, 0xcd, 0xca, 0x4a, 0xdc, 0xa1, 0x54, + 0xcc, 0x75, 0xe5, 0xad, 0xb5, 0x68, 0x42, 0x52, 0x6e, 0xae, 0x3d, 0xca, 0xb0, 0x16, 0x40, 0x9c, + 0xe0, 0x15, 0xd9, 0x4c, 0x33, 0xb9, 0x63, 0x91, 0xd8, 0x4b, 0xc9, 0x06, 0x3b, 0x80, 0x72, 0x9c, + 0x19, 0xb3, 0x1a, 0x3f, 0xc7, 0x92, 0xc8, 0xa3, 0x89, 0x4e, 0xf0, 0x99, 0xac, 0x14, 0xa3, 0x81, + 0x53, 0x05, 0xac, 0x24, 0xa6, 0xea, 0x98, 0xf3, 0x80, 0x39, 0xb0, 0x48, 0x1d, 0x8c, 0xd4, 0x25, + 0xbc, 0x4a, 0x15, 0x3d, 0xa3, 0x3e, 0x9b, 0x20, 0x12, 0xed, 0xe6, 0xd4, 0x34, 0x87, 0x84, 0xeb, + 0x47, 0x70, 0x2b, 0x5d, 0xe3, 0x12, 0xa2, 0x79, 0x04, 0x0b, 0x33, 0x91, 0xf4, 0x68, 0x4b, 0x5f, + 0x95, 0x1a, 0x11, 0x6d, 0xe9, 0x2b, 0x83, 0xf0, 0xc6, 0x32, 0x36, 0x39, 0x6f, 0x00, 0x9a, 0x7a, + 0xe7, 0x4e, 0xd8, 0x3f, 0x15, 0xcd, 0xfd, 0xeb, 0x0c, 0x2c, 0xa6, 0xc4, 0xca, 0xd9, 0xab, 0xca, + 0x6b, 0x70, 0x65, 0x1c, 0x7d, 0x2d, 0x35, 0xa6, 0x6a, 0x74, 0xb1, 0x9d, 0x5d, 0xf6, 0x34, 0x71, + 0xb0, 0x51, 0x48, 0x53, 0xee, 0xcc, 0xe7, 0x2a, 0x15, 0xa9, 0x1a, 0xc5, 0x97, 0xb0, 0x4a, 0x1d, + 0x69, 0x0d, 0x87, 0x53, 0xf1, 0xde, 0x57, 0x66, 0x7e, 0x97, 0x3b, 0x11, 0xc3, 0x5e, 0xbb, 0xfa, + 0x77, 0xbb, 0xaf, 0x50, 0xa7, 0xa9, 0xab, 0x6c, 0x02, 0x8d, 0xe9, 0x38, 0x2a, 0xbb, 0xba, 0xae, + 0xb5, 0xdb, 0x09, 0xfb, 0x37, 0x25, 0xf6, 0xfa, 0x1d, 0x6c, 0xec, 0xb6, 0xb1, 0x96, 0x36, 0x2f, + 0x64, 0x12, 0x8b, 0xf5, 0xf8, 0x1b, 0x51, 0xd0, 0x77, 0x6a, 0x9c, 0xaa, 0x81, 0xab, 0x42, 0xd4, + 0x91, 0x05, 0x9e, 0x1e, 0x33, 0x7e, 0x03, 0x9b, 0xbf, 0x63, 0xdc, 0x48, 0x6b, 0xde, 0xa7, 0x22, + 0x64, 0x8b, 0xaf, 0x4e, 0xef, 0x6b, 0xd5, 0x83, 0x3b, 0x69, 0xeb, 0x7d, 0xa5, 0x2d, 0x34, 0x35, + 0xd7, 0xd7, 0x50, 0xb7, 0xab, 0xea, 0x41, 0xde, 0x68, 0xfb, 0xa4, 0x44, 0x93, 0xa3, 0xed, 0x93, + 0x16, 0x15, 0x4e, 0xea, 0x35, 0x2a, 0x1e, 0xfc, 0x71, 0xe6, 0xfe, 0xfa, 0xdd, 0x1f, 0x7e, 0xe7, + 0xc4, 0x09, 0x4f, 0x27, 0x47, 0x0f, 0xfa, 0xde, 0xe8, 0xe1, 0x50, 0x79, 0x1b, 0xe5, 0x7d, 0xe3, + 0x87, 0x43, 0x77, 0xf0, 0x10, 0xab, 0x3d, 0x9a, 0x1b, 0xfb, 0x5e, 0xe8, 0x7d, 0xf7, 0xff, 0x05, + 0x00, 0x00, 0xff, 0xff, 0x41, 0x79, 0x30, 0x63, 0x7a, 0x80, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index 6965d3ee82..b5b3ebb01b 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -3114,3 +3114,163 @@ message BakeMacaroonResponse { /// The hex encoded macaroon, serialized in binary format. string macaroon = 1; } + + +message Failure { + enum FailureCode { + /** + The numbers assigned in this enumeration match the failure codes as + defined in BOLT #4. Because protobuf 3 requires enums to start with 0, + a RESERVED value is added. + */ + RESERVED = 0; + + INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS = 1; + INCORRECT_PAYMENT_AMOUNT = 2; + FINAL_INCORRECT_CLTV_EXPIRY = 3; + FINAL_INCORRECT_HTLC_AMOUNT = 4; + FINAL_EXPIRY_TOO_SOON = 5; + INVALID_REALM = 6; + EXPIRY_TOO_SOON = 7; + INVALID_ONION_VERSION = 8; + INVALID_ONION_HMAC = 9; + INVALID_ONION_KEY = 10; + AMOUNT_BELOW_MINIMUM = 11; + FEE_INSUFFICIENT = 12; + INCORRECT_CLTV_EXPIRY = 13; + CHANNEL_DISABLED = 14; + TEMPORARY_CHANNEL_FAILURE = 15; + REQUIRED_NODE_FEATURE_MISSING = 16; + REQUIRED_CHANNEL_FEATURE_MISSING = 17; + UNKNOWN_NEXT_PEER = 18; + TEMPORARY_NODE_FAILURE = 19; + PERMANENT_NODE_FAILURE = 20; + PERMANENT_CHANNEL_FAILURE = 21; + EXPIRY_TOO_FAR = 22; + MPP_TIMEOUT = 23; + + /** + The error source is known, but the failure itself couldn't be decoded. + */ + UNKNOWN_FAILURE = 998; + + /** + An unreadable failure result is returned if the received failure message + cannot be decrypted. In that case the error source is unknown. + */ + UNREADABLE_FAILURE = 999; + } + + /// Failure code as defined in the Lightning spec + FailureCode code = 1; + + reserved 2; + + /// An optional channel update message. + ChannelUpdate channel_update = 3; + + /// A failure type-dependent htlc value. + uint64 htlc_msat = 4; + + /// The sha256 sum of the onion payload. + bytes onion_sha_256 = 5; + + /// A failure type-dependent cltv expiry value. + uint32 cltv_expiry = 6; + + /// A failure type-dependent flags value. + uint32 flags = 7; + + /** + The position in the path of the intermediate or final node that generated + the failure message. Position zero is the sender node. + **/ + uint32 failure_source_index = 8; + + /// A failure type-dependent block height. + uint32 height = 9; +} + + +message ChannelUpdate { + /** + The signature that validates the announced data and proves the ownership + of node id. + */ + bytes signature = 1; + + /** + The target chain that this channel was opened within. This value + should be the genesis hash of the target chain. Along with the short + channel ID, this uniquely identifies the channel globally in a + blockchain. + */ + bytes chain_hash = 2; + + /** + The unique description of the funding transaction. + */ + uint64 chan_id = 3 [jstype = JS_STRING]; + + /** + A timestamp that allows ordering in the case of multiple announcements. + We should ignore the message if timestamp is not greater than the + last-received. + */ + uint32 timestamp = 4; + + /** + The bitfield that describes whether optional fields are present in this + update. Currently, the least-significant bit must be set to 1 if the + optional field MaxHtlc is present. + */ + uint32 message_flags = 10; + + /** + The bitfield that describes additional meta-data concerning how the + update is to be interpreted. Currently, the least-significant bit must be + set to 0 if the creating node corresponds to the first node in the + previously sent channel announcement and 1 otherwise. If the second bit + is set, then the channel is set to be disabled. + */ + uint32 channel_flags = 5; + + /** + The minimum number of blocks this node requires to be added to the expiry + of HTLCs. This is a security parameter determined by the node operator. + This value represents the required gap between the time locks of the + incoming and outgoing HTLC's set to this node. + */ + uint32 time_lock_delta = 6; + + /** + The minimum HTLC value which will be accepted. + */ + uint64 htlc_minimum_msat = 7; + + /** + The base fee that must be used for incoming HTLC's to this particular + channel. This value will be tacked onto the required for a payment + independent of the size of the payment. + */ + uint32 base_fee = 8; + + /** + The fee rate that will be charged per millionth of a satoshi. + */ + uint32 fee_rate = 9; + + /** + The maximum HTLC value which will be accepted. + */ + uint64 htlc_maximum_msat = 11; + + /** + The set of data that was appended to this message, some of which we may + not actually know how to iterate or parse. By holding onto this data, we + ensure that we're able to properly validate the set of signatures that + cover these new fields, and ensure we're able to make upgrades to the + network in a forwards compatible manner. + */ + bytes extra_opaque_data = 12; +} \ No newline at end of file From 3f5ba35deab4412000649231f4e6489f35e7a02b Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 20 Feb 2020 10:45:17 +0100 Subject: [PATCH 06/16] routerrpc: move marshall functions out of conditionally compiled file These functions will (indirectly) be called by the main rpc server and can no longer stay conditionally compiled. --- lnrpc/routerrpc/router_backend.go | 151 ++++++++++++++++++++++++++++++ lnrpc/routerrpc/router_server.go | 151 ------------------------------ 2 files changed, 151 insertions(+), 151 deletions(-) diff --git a/lnrpc/routerrpc/router_backend.go b/lnrpc/routerrpc/router_backend.go index 4802902e36..5e9f8f6dd7 100644 --- a/lnrpc/routerrpc/router_backend.go +++ b/lnrpc/routerrpc/router_backend.go @@ -13,6 +13,7 @@ import ( "github.com/btcsuite/btcd/chaincfg" "github.com/btcsuite/btcutil" "github.com/lightningnetwork/lnd/channeldb" + "github.com/lightningnetwork/lnd/htlcswitch" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwire" @@ -883,3 +884,153 @@ func MarshalTimeNano(t time.Time) int64 { } return t.UnixNano() } + +// marshallError marshall an error as received from the switch to rpc structs +// suitable for returning to the caller of an rpc method. +// +// Because of difficulties with using protobuf oneof constructs in some +// languages, the decision was made here to use a single message format for all +// failure messages with some fields left empty depending on the failure type. +func marshallError(sendError error) (*lnrpc.Failure, error) { + response := &lnrpc.Failure{} + + if sendError == htlcswitch.ErrUnreadableFailureMessage { + response.Code = lnrpc.Failure_UNREADABLE_FAILURE + return response, nil + } + + rtErr, ok := sendError.(htlcswitch.ClearTextError) + if !ok { + return nil, sendError + } + + switch onionErr := rtErr.WireMessage().(type) { + + case *lnwire.FailIncorrectDetails: + response.Code = lnrpc.Failure_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS + response.Height = onionErr.Height() + + case *lnwire.FailIncorrectPaymentAmount: + response.Code = lnrpc.Failure_INCORRECT_PAYMENT_AMOUNT + + case *lnwire.FailFinalIncorrectCltvExpiry: + response.Code = lnrpc.Failure_FINAL_INCORRECT_CLTV_EXPIRY + response.CltvExpiry = onionErr.CltvExpiry + + case *lnwire.FailFinalIncorrectHtlcAmount: + response.Code = lnrpc.Failure_FINAL_INCORRECT_HTLC_AMOUNT + response.HtlcMsat = uint64(onionErr.IncomingHTLCAmount) + + case *lnwire.FailFinalExpiryTooSoon: + response.Code = lnrpc.Failure_FINAL_EXPIRY_TOO_SOON + + case *lnwire.FailInvalidRealm: + response.Code = lnrpc.Failure_INVALID_REALM + + case *lnwire.FailExpiryTooSoon: + response.Code = lnrpc.Failure_EXPIRY_TOO_SOON + response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) + + case *lnwire.FailExpiryTooFar: + response.Code = lnrpc.Failure_EXPIRY_TOO_FAR + + case *lnwire.FailInvalidOnionVersion: + response.Code = lnrpc.Failure_INVALID_ONION_VERSION + response.OnionSha_256 = onionErr.OnionSHA256[:] + + case *lnwire.FailInvalidOnionHmac: + response.Code = lnrpc.Failure_INVALID_ONION_HMAC + response.OnionSha_256 = onionErr.OnionSHA256[:] + + case *lnwire.FailInvalidOnionKey: + response.Code = lnrpc.Failure_INVALID_ONION_KEY + response.OnionSha_256 = onionErr.OnionSHA256[:] + + case *lnwire.FailAmountBelowMinimum: + response.Code = lnrpc.Failure_AMOUNT_BELOW_MINIMUM + response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) + response.HtlcMsat = uint64(onionErr.HtlcMsat) + + case *lnwire.FailFeeInsufficient: + response.Code = lnrpc.Failure_FEE_INSUFFICIENT + response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) + response.HtlcMsat = uint64(onionErr.HtlcMsat) + + case *lnwire.FailIncorrectCltvExpiry: + response.Code = lnrpc.Failure_INCORRECT_CLTV_EXPIRY + response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) + response.CltvExpiry = onionErr.CltvExpiry + + case *lnwire.FailChannelDisabled: + response.Code = lnrpc.Failure_CHANNEL_DISABLED + response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) + response.Flags = uint32(onionErr.Flags) + + case *lnwire.FailTemporaryChannelFailure: + response.Code = lnrpc.Failure_TEMPORARY_CHANNEL_FAILURE + response.ChannelUpdate = marshallChannelUpdate(onionErr.Update) + + case *lnwire.FailRequiredNodeFeatureMissing: + response.Code = lnrpc.Failure_REQUIRED_NODE_FEATURE_MISSING + + case *lnwire.FailRequiredChannelFeatureMissing: + response.Code = lnrpc.Failure_REQUIRED_CHANNEL_FEATURE_MISSING + + case *lnwire.FailUnknownNextPeer: + response.Code = lnrpc.Failure_UNKNOWN_NEXT_PEER + + case *lnwire.FailTemporaryNodeFailure: + response.Code = lnrpc.Failure_TEMPORARY_NODE_FAILURE + + case *lnwire.FailPermanentNodeFailure: + response.Code = lnrpc.Failure_PERMANENT_NODE_FAILURE + + case *lnwire.FailPermanentChannelFailure: + response.Code = lnrpc.Failure_PERMANENT_CHANNEL_FAILURE + + case *lnwire.FailMPPTimeout: + response.Code = lnrpc.Failure_MPP_TIMEOUT + + case nil: + response.Code = lnrpc.Failure_UNKNOWN_FAILURE + + default: + return nil, fmt.Errorf("cannot marshall failure %T", onionErr) + } + + // If the ClearTextError received is a ForwardingError, the error + // originated from a node along the route, not locally on our outgoing + // link. We set failureSourceIdx to the index of the node where the + // failure occurred. If the error is not a ForwardingError, the failure + // occurred at our node, so we leave the index as 0 to indicate that + // we failed locally. + fErr, ok := rtErr.(*htlcswitch.ForwardingError) + if ok { + response.FailureSourceIndex = uint32(fErr.FailureSourceIdx) + } + + return response, nil +} + +// marshallChannelUpdate marshalls a channel update as received over the wire to +// the router rpc format. +func marshallChannelUpdate(update *lnwire.ChannelUpdate) *lnrpc.ChannelUpdate { + if update == nil { + return nil + } + + return &lnrpc.ChannelUpdate{ + Signature: update.Signature[:], + ChainHash: update.ChainHash[:], + ChanId: update.ShortChannelID.ToUint64(), + Timestamp: update.Timestamp, + MessageFlags: uint32(update.MessageFlags), + ChannelFlags: uint32(update.ChannelFlags), + TimeLockDelta: uint32(update.TimeLockDelta), + HtlcMinimumMsat: uint64(update.HtlcMinimumMsat), + BaseFee: update.BaseFee, + FeeRate: update.FeeRate, + HtlcMaximumMsat: uint64(update.HtlcMaximumMsat), + ExtraOpaqueData: update.ExtraOpaqueData, + } +} diff --git a/lnrpc/routerrpc/router_server.go b/lnrpc/routerrpc/router_server.go index 069b145c9f..ed02a6fcd0 100644 --- a/lnrpc/routerrpc/router_server.go +++ b/lnrpc/routerrpc/router_server.go @@ -12,7 +12,6 @@ import ( "github.com/btcsuite/btcutil" "github.com/lightningnetwork/lnd/channeldb" - "github.com/lightningnetwork/lnd/htlcswitch" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwire" @@ -312,156 +311,6 @@ func (s *Server) SendToRoute(ctx context.Context, }, nil } -// marshallError marshall an error as received from the switch to rpc structs -// suitable for returning to the caller of an rpc method. -// -// Because of difficulties with using protobuf oneof constructs in some -// languages, the decision was made here to use a single message format for all -// failure messages with some fields left empty depending on the failure type. -func marshallError(sendError error) (*lnrpc.Failure, error) { - response := &lnrpc.Failure{} - - if sendError == htlcswitch.ErrUnreadableFailureMessage { - response.Code = lnrpc.Failure_UNREADABLE_FAILURE - return response, nil - } - - rtErr, ok := sendError.(htlcswitch.ClearTextError) - if !ok { - return nil, sendError - } - - switch onionErr := rtErr.WireMessage().(type) { - - case *lnwire.FailIncorrectDetails: - response.Code = lnrpc.Failure_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS - response.Height = onionErr.Height() - - case *lnwire.FailIncorrectPaymentAmount: - response.Code = lnrpc.Failure_INCORRECT_PAYMENT_AMOUNT - - case *lnwire.FailFinalIncorrectCltvExpiry: - response.Code = lnrpc.Failure_FINAL_INCORRECT_CLTV_EXPIRY - response.CltvExpiry = onionErr.CltvExpiry - - case *lnwire.FailFinalIncorrectHtlcAmount: - response.Code = lnrpc.Failure_FINAL_INCORRECT_HTLC_AMOUNT - response.HtlcMsat = uint64(onionErr.IncomingHTLCAmount) - - case *lnwire.FailFinalExpiryTooSoon: - response.Code = lnrpc.Failure_FINAL_EXPIRY_TOO_SOON - - case *lnwire.FailInvalidRealm: - response.Code = lnrpc.Failure_INVALID_REALM - - case *lnwire.FailExpiryTooSoon: - response.Code = lnrpc.Failure_EXPIRY_TOO_SOON - response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) - - case *lnwire.FailExpiryTooFar: - response.Code = lnrpc.Failure_EXPIRY_TOO_FAR - - case *lnwire.FailInvalidOnionVersion: - response.Code = lnrpc.Failure_INVALID_ONION_VERSION - response.OnionSha_256 = onionErr.OnionSHA256[:] - - case *lnwire.FailInvalidOnionHmac: - response.Code = lnrpc.Failure_INVALID_ONION_HMAC - response.OnionSha_256 = onionErr.OnionSHA256[:] - - case *lnwire.FailInvalidOnionKey: - response.Code = lnrpc.Failure_INVALID_ONION_KEY - response.OnionSha_256 = onionErr.OnionSHA256[:] - - case *lnwire.FailAmountBelowMinimum: - response.Code = lnrpc.Failure_AMOUNT_BELOW_MINIMUM - response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) - response.HtlcMsat = uint64(onionErr.HtlcMsat) - - case *lnwire.FailFeeInsufficient: - response.Code = lnrpc.Failure_FEE_INSUFFICIENT - response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) - response.HtlcMsat = uint64(onionErr.HtlcMsat) - - case *lnwire.FailIncorrectCltvExpiry: - response.Code = lnrpc.Failure_INCORRECT_CLTV_EXPIRY - response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) - response.CltvExpiry = onionErr.CltvExpiry - - case *lnwire.FailChannelDisabled: - response.Code = lnrpc.Failure_CHANNEL_DISABLED - response.ChannelUpdate = marshallChannelUpdate(&onionErr.Update) - response.Flags = uint32(onionErr.Flags) - - case *lnwire.FailTemporaryChannelFailure: - response.Code = lnrpc.Failure_TEMPORARY_CHANNEL_FAILURE - response.ChannelUpdate = marshallChannelUpdate(onionErr.Update) - - case *lnwire.FailRequiredNodeFeatureMissing: - response.Code = lnrpc.Failure_REQUIRED_NODE_FEATURE_MISSING - - case *lnwire.FailRequiredChannelFeatureMissing: - response.Code = lnrpc.Failure_REQUIRED_CHANNEL_FEATURE_MISSING - - case *lnwire.FailUnknownNextPeer: - response.Code = lnrpc.Failure_UNKNOWN_NEXT_PEER - - case *lnwire.FailTemporaryNodeFailure: - response.Code = lnrpc.Failure_TEMPORARY_NODE_FAILURE - - case *lnwire.FailPermanentNodeFailure: - response.Code = lnrpc.Failure_PERMANENT_NODE_FAILURE - - case *lnwire.FailPermanentChannelFailure: - response.Code = lnrpc.Failure_PERMANENT_CHANNEL_FAILURE - - case *lnwire.FailMPPTimeout: - response.Code = lnrpc.Failure_MPP_TIMEOUT - - case nil: - response.Code = lnrpc.Failure_UNKNOWN_FAILURE - - default: - return nil, fmt.Errorf("cannot marshall failure %T", onionErr) - } - - // If the ClearTextError received is a ForwardingError, the error - // originated from a node along the route, not locally on our outgoing - // link. We set failureSourceIdx to the index of the node where the - // failure occurred. If the error is not a ForwardingError, the failure - // occurred at our node, so we leave the index as 0 to indicate that - // we failed locally. - fErr, ok := rtErr.(*htlcswitch.ForwardingError) - if ok { - response.FailureSourceIndex = uint32(fErr.FailureSourceIdx) - } - - return response, nil -} - -// marshallChannelUpdate marshalls a channel update as received over the wire to -// the router rpc format. -func marshallChannelUpdate(update *lnwire.ChannelUpdate) *lnrpc.ChannelUpdate { - if update == nil { - return nil - } - - return &lnrpc.ChannelUpdate{ - Signature: update.Signature[:], - ChainHash: update.ChainHash[:], - ChanId: update.ShortChannelID.ToUint64(), - Timestamp: update.Timestamp, - MessageFlags: uint32(update.MessageFlags), - ChannelFlags: uint32(update.ChannelFlags), - TimeLockDelta: uint32(update.TimeLockDelta), - HtlcMinimumMsat: uint64(update.HtlcMinimumMsat), - BaseFee: update.BaseFee, - FeeRate: update.FeeRate, - HtlcMaximumMsat: uint64(update.HtlcMaximumMsat), - ExtraOpaqueData: update.ExtraOpaqueData, - } -} - // ResetMissionControl clears all mission control state and starts with a clean // slate. func (s *Server) ResetMissionControl(ctx context.Context, From e6e9e44e6f63ea9c7910a7a606931bba223cb3ae Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Wed, 19 Feb 2020 17:20:43 +0100 Subject: [PATCH 07/16] routerrpc: extract wire error marshalling Preparation for marshalling wire errors as part of rpc payment lookups. --- lnrpc/routerrpc/router_backend.go | 45 +++++++++++++++++++++---------- 1 file changed, 31 insertions(+), 14 deletions(-) diff --git a/lnrpc/routerrpc/router_backend.go b/lnrpc/routerrpc/router_backend.go index 5e9f8f6dd7..e8957afa9a 100644 --- a/lnrpc/routerrpc/router_backend.go +++ b/lnrpc/routerrpc/router_backend.go @@ -904,7 +904,35 @@ func marshallError(sendError error) (*lnrpc.Failure, error) { return nil, sendError } - switch onionErr := rtErr.WireMessage().(type) { + err := marshallWireError(rtErr.WireMessage(), response) + if err != nil { + return nil, err + } + + // If the ClearTextError received is a ForwardingError, the error + // originated from a node along the route, not locally on our outgoing + // link. We set failureSourceIdx to the index of the node where the + // failure occurred. If the error is not a ForwardingError, the failure + // occurred at our node, so we leave the index as 0 to indicate that + // we failed locally. + fErr, ok := rtErr.(*htlcswitch.ForwardingError) + if ok { + response.FailureSourceIndex = uint32(fErr.FailureSourceIdx) + } + + return response, nil +} + +// marshallError marshall an error as received from the switch to rpc structs +// suitable for returning to the caller of an rpc method. +// +// Because of difficulties with using protobuf oneof constructs in some +// languages, the decision was made here to use a single message format for all +// failure messages with some fields left empty depending on the failure type. +func marshallWireError(msg lnwire.FailureMessage, + response *lnrpc.Failure) error { + + switch onionErr := msg.(type) { case *lnwire.FailIncorrectDetails: response.Code = lnrpc.Failure_INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS @@ -995,21 +1023,10 @@ func marshallError(sendError error) (*lnrpc.Failure, error) { response.Code = lnrpc.Failure_UNKNOWN_FAILURE default: - return nil, fmt.Errorf("cannot marshall failure %T", onionErr) + return fmt.Errorf("cannot marshall failure %T", onionErr) } - // If the ClearTextError received is a ForwardingError, the error - // originated from a node along the route, not locally on our outgoing - // link. We set failureSourceIdx to the index of the node where the - // failure occurred. If the error is not a ForwardingError, the failure - // occurred at our node, so we leave the index as 0 to indicate that - // we failed locally. - fErr, ok := rtErr.(*htlcswitch.ForwardingError) - if ok { - response.FailureSourceIndex = uint32(fErr.FailureSourceIdx) - } - - return response, nil + return nil } // marshallChannelUpdate marshalls a channel update as received over the wire to From fa3a762a2ce090b623d4f96955557ad45f59f580 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 20 Feb 2020 10:13:23 +0100 Subject: [PATCH 08/16] channeldb: add error return value to fetchPaymentStatus Preparation for when we need to return errors in a next commit. --- channeldb/payment_control.go | 31 +++++++++++++++++++------------ channeldb/payments.go | 11 +++++++++-- 2 files changed, 28 insertions(+), 14 deletions(-) diff --git a/channeldb/payment_control.go b/channeldb/payment_control.go index b6bcd5a11d..72c5c1993c 100644 --- a/channeldb/payment_control.go +++ b/channeldb/payment_control.go @@ -76,7 +76,10 @@ func (p *PaymentControl) InitPayment(paymentHash lntypes.Hash, } // Get the existing status of this payment, if any. - paymentStatus := fetchPaymentStatus(bucket) + paymentStatus, err := fetchPaymentStatus(bucket) + if err != nil { + return err + } switch paymentStatus { @@ -358,27 +361,30 @@ func nextPaymentSequence(tx *bbolt.Tx) ([]byte, error) { // fetchPaymentStatus fetches the payment status of the payment. If the payment // isn't found, it will default to "StatusUnknown". -func fetchPaymentStatus(bucket *bbolt.Bucket) PaymentStatus { +func fetchPaymentStatus(bucket *bbolt.Bucket) (PaymentStatus, error) { if bucket.Get(paymentSettleInfoKey) != nil { - return StatusSucceeded + return StatusSucceeded, nil } if bucket.Get(paymentFailInfoKey) != nil { - return StatusFailed + return StatusFailed, nil } if bucket.Get(paymentCreationInfoKey) != nil { - return StatusInFlight + return StatusInFlight, nil } - return StatusUnknown + return StatusUnknown, nil } // ensureInFlight checks whether the payment found in the given bucket has // status InFlight, and returns an error otherwise. This should be used to // ensure we only mark in-flight payments as succeeded or failed. func ensureInFlight(bucket *bbolt.Bucket) error { - paymentStatus := fetchPaymentStatus(bucket) + paymentStatus, err := fetchPaymentStatus(bucket) + if err != nil { + return err + } switch { @@ -443,15 +449,16 @@ func (p *PaymentControl) FetchInFlightPayments() ([]*InFlightPayment, error) { } // If the status is not InFlight, we can return early. - paymentStatus := fetchPaymentStatus(bucket) + paymentStatus, err := fetchPaymentStatus(bucket) + if err != nil { + return err + } + if paymentStatus != StatusInFlight { return nil } - var ( - inFlight = &InFlightPayment{} - err error - ) + inFlight := &InFlightPayment{} // Get the CreationInfo. b := bucket.Get(paymentCreationInfoKey) diff --git a/channeldb/payments.go b/channeldb/payments.go index 64f4f1c7c0..fc5e38bc20 100644 --- a/channeldb/payments.go +++ b/channeldb/payments.go @@ -337,7 +337,10 @@ func fetchPayment(bucket *bbolt.Bucket) (*MPPayment, error) { p.sequenceNum = binary.BigEndian.Uint64(seqBytes) // Get the payment status. - p.Status = fetchPaymentStatus(bucket) + p.Status, err = fetchPaymentStatus(bucket) + if err != nil { + return nil, err + } // Get the PaymentCreationInfo. b := bucket.Get(paymentCreationInfoKey) @@ -401,7 +404,11 @@ func (db *DB) DeletePayments() error { // If the status is InFlight, we cannot safely delete // the payment information, so we return early. - paymentStatus := fetchPaymentStatus(bucket) + paymentStatus, err := fetchPaymentStatus(bucket) + if err != nil { + return err + } + if paymentStatus == StatusInFlight { return nil } From 4c74c0817e7a3e75f8f3de02bd790c7f0854cb6b Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 20 Feb 2020 14:56:24 +0100 Subject: [PATCH 09/16] channeldb/test: extend payment control test with failed attempt --- channeldb/payment_control_test.go | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/channeldb/payment_control_test.go b/channeldb/payment_control_test.go index 5272ec79a6..063a2e6f5b 100644 --- a/channeldb/payment_control_test.go +++ b/channeldb/payment_control_test.go @@ -116,9 +116,18 @@ func TestPaymentControlSwitchFail(t *testing.T) { nil, ) - // Record a new attempt. + // Record a new attempt. In this test scenario, the attempt fails. + // However, this is not communicated to control tower in the current + // implementation. It only registers the initiation of the attempt. attempt.AttemptID = 2 err = pControl.RegisterAttempt(info.PaymentHash, attempt) + if err != nil { + t.Fatalf("unable to register attempt: %v", err) + } + + // Record another attempt. + attempt.AttemptID = 3 + err = pControl.RegisterAttempt(info.PaymentHash, attempt) if err != nil { t.Fatalf("unable to send htlc message: %v", err) } @@ -128,7 +137,7 @@ func TestPaymentControlSwitchFail(t *testing.T) { nil, ) - // Verifies that status was changed to StatusSucceeded. + // Settle the attempt and verify that status was changed to StatusSucceeded. var payment *MPPayment payment, err = pControl.Success(info.PaymentHash, preimg) if err != nil { From c357511051d23eb47befe2be0f563acdac39f971 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Fri, 21 Feb 2020 14:13:40 +0100 Subject: [PATCH 10/16] channeldb/migtest: remove channeldb dependency Removes this unnecessary dependency allowing migration code to use utility functions from channeldb/migtest. --- channeldb/migtest/migtest.go | 18 ++++++++---------- 1 file changed, 8 insertions(+), 10 deletions(-) diff --git a/channeldb/migtest/migtest.go b/channeldb/migtest/migtest.go index b6ecbafade..b2200ebf71 100644 --- a/channeldb/migtest/migtest.go +++ b/channeldb/migtest/migtest.go @@ -7,32 +7,30 @@ import ( "testing" "github.com/coreos/bbolt" - "github.com/lightningnetwork/lnd/channeldb" ) // MakeDB creates a new instance of the ChannelDB for testing purposes. A // callback which cleans up the created temporary directories is also returned // and intended to be executed after the test completes. -func MakeDB() (*channeldb.DB, func(), error) { - // First, create a temporary directory to be used for the duration of - // this test. - tempDirName, err := ioutil.TempDir("", "channeldb") +func MakeDB() (*bbolt.DB, func(), error) { + // Create temporary database for mission control. + file, err := ioutil.TempFile("", "*.db") if err != nil { return nil, nil, err } - // Next, create channeldb for the first time. - cdb, err := channeldb.Open(tempDirName) + dbPath := file.Name() + db, err := bbolt.Open(dbPath, 0600, nil) if err != nil { return nil, nil, err } cleanUp := func() { - cdb.Close() - os.RemoveAll(tempDirName) + db.Close() + os.RemoveAll(dbPath) } - return cdb, cleanUp, nil + return db, cleanUp, nil } // ApplyMigration is a helper test function that encapsulates the general steps From 8558534417add16c4496c8ea759f7984cfa3dfc0 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 5 Mar 2020 13:54:03 +0100 Subject: [PATCH 11/16] routing: add clock to router config --- routing/router.go | 8 ++++++-- routing/router_test.go | 3 +++ server.go | 1 + 3 files changed, 10 insertions(+), 2 deletions(-) diff --git a/routing/router.go b/routing/router.go index 8dbb45de5a..a4b264e1bb 100644 --- a/routing/router.go +++ b/routing/router.go @@ -17,6 +17,7 @@ import ( sphinx "github.com/lightningnetwork/lightning-onion" "github.com/lightningnetwork/lnd/channeldb" + "github.com/lightningnetwork/lnd/clock" "github.com/lightningnetwork/lnd/htlcswitch" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/lntypes" @@ -302,6 +303,9 @@ type Config struct { // PathFindingConfig defines global path finding parameters. PathFindingConfig PathFindingConfig + + // Clock is mockable time provider. + Clock clock.Clock } // EdgeLocator is a struct used to identify a specific edge. @@ -1680,7 +1684,7 @@ func (r *ChannelRouter) preparePayment(payment *LightningPayment) ( info := &channeldb.PaymentCreationInfo{ PaymentHash: payment.PaymentHash, Value: payment.Amount, - CreationTime: time.Now(), + CreationTime: r.cfg.Clock.Now(), PaymentRequest: payment.PaymentRequest, } @@ -1709,7 +1713,7 @@ func (r *ChannelRouter) SendToRoute(hash lntypes.Hash, route *route.Route) ( info := &channeldb.PaymentCreationInfo{ PaymentHash: hash, Value: amt, - CreationTime: time.Now(), + CreationTime: r.cfg.Clock.Now(), PaymentRequest: nil, } diff --git a/routing/router_test.go b/routing/router_test.go index b3470d1c34..dd8908c4dd 100644 --- a/routing/router_test.go +++ b/routing/router_test.go @@ -19,6 +19,7 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/lightningnetwork/lnd/channeldb" + "github.com/lightningnetwork/lnd/clock" "github.com/lightningnetwork/lnd/htlcswitch" "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwire" @@ -131,6 +132,7 @@ func createTestCtxFromGraphInstance(startingHeight uint32, graphInstance *testGr return next, nil }, PathFindingConfig: pathFindingConfig, + Clock: clock.NewTestClock(time.Unix(1, 0)), }) if err != nil { return nil, nil, fmt.Errorf("unable to create router %v", err) @@ -2967,6 +2969,7 @@ func TestRouterPaymentStateMachine(t *testing.T) { next := atomic.AddUint64(&uniquePaymentID, 1) return next, nil }, + Clock: clock.NewTestClock(time.Unix(1, 0)), }) if err != nil { t.Fatalf("unable to create router %v", err) diff --git a/server.go b/server.go index bde65671ad..fd0de26664 100644 --- a/server.go +++ b/server.go @@ -740,6 +740,7 @@ func newServer(listenAddrs []net.Addr, chanDB *channeldb.DB, AssumeChannelValid: cfg.Routing.UseAssumeChannelValid(), NextPaymentID: sequencer.NextID, PathFindingConfig: pathFindingConfig, + Clock: clock.NewDefaultClock(), }) if err != nil { return nil, fmt.Errorf("can't create router: %v", err) From 48c0e42c26331526731553587808c7f031e04ac9 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 20 Feb 2020 18:08:01 +0100 Subject: [PATCH 12/16] channeldb+routing: store all payment htlcs This commit converts the database structure of a payment so that it can not just store the last htlc attempt, but all attempts that have been made. This is a preparation for mpp sending. In addition to that, we now also persist the fail time of an htlc. In a later commit, the full failure reason will be added as well. A key change is made to the control tower interface. Previously the control tower wasn't aware of individual htlc outcomes. The payment remained in-flight with the latest attempt recorded, but an outcome was only set when the payment finished. With this commit, the outcome of every htlc is expected by the control tower and recorded in the database. Co-authored-by: Johan T. Halseth --- channeldb/mp_payment.go | 86 ++++++++++ channeldb/payment_control.go | 210 +++++++++++++++-------- channeldb/payment_control_test.go | 75 +++++--- channeldb/payments.go | 272 +++++++++++++++--------------- channeldb/payments_test.go | 20 ++- routing/control_tower.go | 47 ++++-- routing/control_tower_test.go | 20 ++- routing/mock_test.go | 17 +- routing/payment_lifecycle.go | 44 ++++- routing/router.go | 9 +- 10 files changed, 538 insertions(+), 262 deletions(-) diff --git a/channeldb/mp_payment.go b/channeldb/mp_payment.go index 4220e7aab7..7c5d97aee1 100644 --- a/channeldb/mp_payment.go +++ b/channeldb/mp_payment.go @@ -1,6 +1,7 @@ package channeldb import ( + "io" "time" "github.com/btcsuite/btcd/btcec" @@ -92,3 +93,88 @@ type MPPayment struct { // Status is the current PaymentStatus of this payment. Status PaymentStatus } + +// serializeHTLCSettleInfo serializes the details of a settled htlc. +func serializeHTLCSettleInfo(w io.Writer, s *HTLCSettleInfo) error { + if _, err := w.Write(s.Preimage[:]); err != nil { + return err + } + + if err := serializeTime(w, s.SettleTime); err != nil { + return err + } + + return nil +} + +// deserializeHTLCSettleInfo deserializes the details of a settled htlc. +func deserializeHTLCSettleInfo(r io.Reader) (*HTLCSettleInfo, error) { + s := &HTLCSettleInfo{} + if _, err := io.ReadFull(r, s.Preimage[:]); err != nil { + return nil, err + } + + var err error + s.SettleTime, err = deserializeTime(r) + if err != nil { + return nil, err + } + + return s, nil +} + +// serializeHTLCFailInfo serializes the details of a failed htlc including the +// wire failure. +func serializeHTLCFailInfo(w io.Writer, f *HTLCFailInfo) error { + if err := serializeTime(w, f.FailTime); err != nil { + return err + } + + return nil +} + +// deserializeHTLCFailInfo deserializes the details of a failed htlc including +// the wire failure. +func deserializeHTLCFailInfo(r io.Reader) (*HTLCFailInfo, error) { + f := &HTLCFailInfo{} + var err error + f.FailTime, err = deserializeTime(r) + if err != nil { + return nil, err + } + + return f, nil +} + +// deserializeTime deserializes time as unix nanoseconds. +func deserializeTime(r io.Reader) (time.Time, error) { + var scratch [8]byte + if _, err := io.ReadFull(r, scratch[:]); err != nil { + return time.Time{}, err + } + + // Convert to time.Time. Interpret unix nano time zero as a zero + // time.Time value. + unixNano := byteOrder.Uint64(scratch[:]) + if unixNano == 0 { + return time.Time{}, nil + } + + return time.Unix(0, int64(unixNano)), nil +} + +// serializeTime serializes time as unix nanoseconds. +func serializeTime(w io.Writer, t time.Time) error { + var scratch [8]byte + + // Convert to unix nano seconds, but only if time is non-zero. Calling + // UnixNano() on a zero time yields an undefined result. + var unixNano int64 + if !t.IsZero() { + unixNano = t.UnixNano() + } + + byteOrder.PutUint64(scratch[:], uint64(unixNano)) + _, err := w.Write(scratch[:]) + return err +} diff --git a/channeldb/payment_control.go b/channeldb/payment_control.go index 72c5c1993c..1b65f4bf65 100644 --- a/channeldb/payment_control.go +++ b/channeldb/payment_control.go @@ -127,11 +127,11 @@ func (p *PaymentControl) InitPayment(paymentHash lntypes.Hash, return err } - // We'll delete any lingering attempt info to start with, in - // case we are initializing a payment that was attempted - // earlier, but left in a state where we could retry. - err = bucket.Delete(paymentAttemptInfoKey) - if err != nil { + // We'll delete any lingering HTLCs to start with, in case we + // are initializing a payment that was attempted earlier, but + // left in a state where we could retry. + err = bucket.DeleteBucket(paymentHtlcsBucket) + if err != nil && err != bbolt.ErrBucketNotFound { return err } @@ -153,76 +153,113 @@ func (p *PaymentControl) RegisterAttempt(paymentHash lntypes.Hash, // Serialize the information before opening the db transaction. var a bytes.Buffer - if err := serializeHTLCAttemptInfo(&a, attempt); err != nil { + err := serializeHTLCAttemptInfo(&a, attempt) + if err != nil { return err } - attemptBytes := a.Bytes() + htlcInfoBytes := a.Bytes() - var updateErr error - err := p.db.Batch(func(tx *bbolt.Tx) error { - // Reset the update error, to avoid carrying over an error - // from a previous execution of the batched db transaction. - updateErr = nil + htlcIDBytes := make([]byte, 8) + binary.BigEndian.PutUint64(htlcIDBytes, attempt.AttemptID) + return p.db.Update(func(tx *bbolt.Tx) error { + // Get the payment bucket to register this new attempt in. bucket, err := fetchPaymentBucket(tx, paymentHash) - if err == ErrPaymentNotInitiated { - updateErr = ErrPaymentNotInitiated - return nil - } else if err != nil { + if err != nil { return err } // We can only register attempts for payments that are // in-flight. if err := ensureInFlight(bucket); err != nil { - updateErr = err - return nil + return err } - // Add the payment attempt to the payments bucket. - return bucket.Put(paymentAttemptInfoKey, attemptBytes) + htlcsBucket, err := bucket.CreateBucketIfNotExists( + paymentHtlcsBucket, + ) + if err != nil { + return err + } + + // Create bucket for this attempt. Fail if the bucket already + // exists. + htlcBucket, err := htlcsBucket.CreateBucket(htlcIDBytes) + if err != nil { + return err + } + + return htlcBucket.Put(htlcAttemptInfoKey, htlcInfoBytes) }) - if err != nil { +} + +// SettleAttempt marks the given attempt settled with the preimage. If this is +// a multi shard payment, this might implicitly mean that the full payment +// succeeded. +// +// After invoking this method, InitPayment should always return an error to +// prevent us from making duplicate payments to the same payment hash. The +// provided preimage is atomically saved to the DB for record keeping. +func (p *PaymentControl) SettleAttempt(hash lntypes.Hash, + attemptID uint64, settleInfo *HTLCSettleInfo) (*MPPayment, error) { + + var b bytes.Buffer + if err := serializeHTLCSettleInfo(&b, settleInfo); err != nil { + return nil, err + } + settleBytes := b.Bytes() + + return p.updateHtlcKey(hash, attemptID, htlcSettleInfoKey, settleBytes) +} + +// FailAttempt marks the given payment attempt failed. +func (p *PaymentControl) FailAttempt(hash lntypes.Hash, + attemptID uint64, failInfo *HTLCFailInfo) error { + + var b bytes.Buffer + if err := serializeHTLCFailInfo(&b, failInfo); err != nil { return err } + failBytes := b.Bytes() - return updateErr + _, err := p.updateHtlcKey(hash, attemptID, htlcFailInfoKey, failBytes) + return err } -// Success transitions a payment into the Succeeded state. After invoking this -// method, InitPayment should always return an error to prevent us from making -// duplicate payments to the same payment hash. The provided preimage is -// atomically saved to the DB for record keeping. -func (p *PaymentControl) Success(paymentHash lntypes.Hash, - preimage lntypes.Preimage) (*MPPayment, error) { +// updateHtlcKey updates a database key for the specified htlc. +func (p *PaymentControl) updateHtlcKey(paymentHash lntypes.Hash, + attemptID uint64, key, value []byte) (*MPPayment, error) { - var ( - updateErr error - payment *MPPayment - ) - err := p.db.Batch(func(tx *bbolt.Tx) error { - // Reset the update error, to avoid carrying over an error - // from a previous execution of the batched db transaction. - updateErr = nil - payment = nil + htlcIDBytes := make([]byte, 8) + binary.BigEndian.PutUint64(htlcIDBytes, attemptID) + var payment *MPPayment + err := p.db.Batch(func(tx *bbolt.Tx) error { + // Fetch bucket that contains all information for the payment + // with this hash. bucket, err := fetchPaymentBucket(tx, paymentHash) - if err == ErrPaymentNotInitiated { - updateErr = ErrPaymentNotInitiated - return nil - } else if err != nil { + if err != nil { return err } - // We can only mark in-flight payments as succeeded. + // We can only update keys of in-flight payments. if err := ensureInFlight(bucket); err != nil { - updateErr = err - return nil + return err + } + + htlcsBucket := bucket.Bucket(paymentHtlcsBucket) + if htlcsBucket == nil { + return fmt.Errorf("htlcs bucket not found") } - // Record the successful payment info atomically to the - // payments record. - err = bucket.Put(paymentSettleInfoKey, preimage[:]) + htlcBucket := htlcsBucket.Bucket(htlcIDBytes) + if htlcBucket == nil { + return fmt.Errorf("HTLC with ID %v not registered", + attemptID) + } + + // Add or update the key for this htlc. + err = htlcBucket.Put(key, value) if err != nil { return err } @@ -235,7 +272,7 @@ func (p *PaymentControl) Success(paymentHash lntypes.Hash, return nil, err } - return payment, updateErr + return payment, err } // Fail transitions a payment into the Failed state, and records the reason the @@ -278,7 +315,19 @@ func (p *PaymentControl) Fail(paymentHash lntypes.Hash, // Retrieve attempt info for the notification, if available. payment, err = fetchPayment(bucket) - return err + if err != nil { + return err + } + + // Final sanity check to see if there are no in-flight htlcs. + for _, htlc := range payment.HTLCs { + if htlc.Settle == nil && htlc.Failure == nil { + return errors.New("payment failed with " + + "in-flight htlc(s)") + } + } + + return nil }) if err != nil { return nil, err @@ -338,7 +387,6 @@ func fetchPaymentBucket(tx *bbolt.Tx, paymentHash lntypes.Hash) ( } return bucket, nil - } // nextPaymentSequence returns the next sequence number to store for a new @@ -362,8 +410,21 @@ func nextPaymentSequence(tx *bbolt.Tx) ([]byte, error) { // fetchPaymentStatus fetches the payment status of the payment. If the payment // isn't found, it will default to "StatusUnknown". func fetchPaymentStatus(bucket *bbolt.Bucket) (PaymentStatus, error) { - if bucket.Get(paymentSettleInfoKey) != nil { - return StatusSucceeded, nil + htlcsBucket := bucket.Bucket(paymentHtlcsBucket) + if htlcsBucket != nil { + htlcs, err := fetchHtlcAttempts(htlcsBucket) + if err != nil { + return 0, err + } + + // Go through all HTLCs, and return StatusSucceeded if any of + // them did succeed. + for _, h := range htlcs { + if h.Settle != nil { + return StatusSucceeded, nil + } + } + } if bucket.Get(paymentFailInfoKey) != nil { @@ -410,27 +471,16 @@ func ensureInFlight(bucket *bbolt.Bucket) error { } } -// fetchPaymentAttempt fetches the payment attempt from the bucket. -func fetchPaymentAttempt(bucket *bbolt.Bucket) (*HTLCAttemptInfo, error) { - attemptData := bucket.Get(paymentAttemptInfoKey) - if attemptData == nil { - return nil, errNoAttemptInfo - } - - r := bytes.NewReader(attemptData) - return deserializeHTLCAttemptInfo(r) -} - // InFlightPayment is a wrapper around a payment that has status InFlight. type InFlightPayment struct { // Info is the PaymentCreationInfo of the in-flight payment. Info *PaymentCreationInfo - // Attempt contains information about the last payment attempt that was - // made to this payment hash. + // Attempts is the set of payment attempts that was made to this + // payment hash. // - // NOTE: Might be nil. - Attempt *HTLCAttemptInfo + // NOTE: Might be empty. + Attempts []HTLCAttemptInfo } // FetchInFlightPayments returns all payments with status InFlight. @@ -473,13 +523,31 @@ func (p *PaymentControl) FetchInFlightPayments() ([]*InFlightPayment, error) { return err } - // Now get the attempt info. It could be that there is - // no attempt info yet. - inFlight.Attempt, err = fetchPaymentAttempt(bucket) - if err != nil && err != errNoAttemptInfo { + htlcsBucket := bucket.Bucket(paymentHtlcsBucket) + if htlcsBucket == nil { + return nil + } + + // Fetch all HTLCs attempted for this payment. + htlcs, err := fetchHtlcAttempts(htlcsBucket) + if err != nil { return err } + // We only care about the static info for the HTLCs + // still in flight, so convert the result to a slice of + // HTLCAttemptInfos. + for _, h := range htlcs { + // Skip HTLCs not in flight. + if h.Settle != nil || h.Failure != nil { + continue + } + + inFlight.Attempts = append( + inFlight.Attempts, h.HTLCAttemptInfo, + ) + } + inFlights = append(inFlights, inFlight) return nil }) diff --git a/channeldb/payment_control_test.go b/channeldb/payment_control_test.go index 063a2e6f5b..7856cc1ac1 100644 --- a/channeldb/payment_control_test.go +++ b/channeldb/payment_control_test.go @@ -85,7 +85,7 @@ func TestPaymentControlSwitchFail(t *testing.T) { assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, pControl, info.PaymentHash, info, nil, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, 0, nil, lntypes.Preimage{}, nil, ) @@ -99,7 +99,7 @@ func TestPaymentControlSwitchFail(t *testing.T) { // Verify the status is indeed Failed. assertPaymentStatus(t, pControl, info.PaymentHash, StatusFailed) assertPaymentInfo( - t, pControl, info.PaymentHash, info, nil, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, 0, nil, lntypes.Preimage{}, &failReason, ) @@ -112,7 +112,7 @@ func TestPaymentControlSwitchFail(t *testing.T) { assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, pControl, info.PaymentHash, info, nil, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, 0, nil, lntypes.Preimage{}, nil, ) @@ -125,6 +125,13 @@ func TestPaymentControlSwitchFail(t *testing.T) { t.Fatalf("unable to register attempt: %v", err) } + err = pControl.FailAttempt( + info.PaymentHash, 2, &HTLCFailInfo{}, + ) + if err != nil { + t.Fatal(err) + } + // Record another attempt. attempt.AttemptID = 3 err = pControl.RegisterAttempt(info.PaymentHash, attempt) @@ -133,19 +140,24 @@ func TestPaymentControlSwitchFail(t *testing.T) { } assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, pControl, info.PaymentHash, info, attempt, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, 0, attempt, lntypes.Preimage{}, nil, ) // Settle the attempt and verify that status was changed to StatusSucceeded. var payment *MPPayment - payment, err = pControl.Success(info.PaymentHash, preimg) + payment, err = pControl.SettleAttempt( + info.PaymentHash, 3, + &HTLCSettleInfo{ + Preimage: preimg, + }, + ) if err != nil { t.Fatalf("error shouldn't have been received, got: %v", err) } - if len(payment.HTLCs) != 1 { - t.Fatalf("payment should have one htlc, got: %d", + if len(payment.HTLCs) != 2 { + t.Fatalf("payment should have two htlcs, got: %d", len(payment.HTLCs)) } @@ -157,7 +169,7 @@ func TestPaymentControlSwitchFail(t *testing.T) { } assertPaymentStatus(t, pControl, info.PaymentHash, StatusSucceeded) - assertPaymentInfo(t, pControl, info.PaymentHash, info, attempt, preimg, nil) + assertPaymentInfo(t, pControl, info.PaymentHash, info, 1, attempt, preimg, nil) // Attempt a final payment, which should now fail since the prior // payment succeed. @@ -193,7 +205,7 @@ func TestPaymentControlSwitchDoubleSend(t *testing.T) { assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, pControl, info.PaymentHash, info, nil, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, 0, nil, lntypes.Preimage{}, nil, ) @@ -213,7 +225,7 @@ func TestPaymentControlSwitchDoubleSend(t *testing.T) { } assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, pControl, info.PaymentHash, info, attempt, lntypes.Preimage{}, + t, pControl, info.PaymentHash, info, 0, attempt, lntypes.Preimage{}, nil, ) @@ -225,11 +237,17 @@ func TestPaymentControlSwitchDoubleSend(t *testing.T) { } // After settling, the error should be ErrAlreadyPaid. - if _, err := pControl.Success(info.PaymentHash, preimg); err != nil { + _, err = pControl.SettleAttempt( + info.PaymentHash, 1, + &HTLCSettleInfo{ + Preimage: preimg, + }, + ) + if err != nil { t.Fatalf("error shouldn't have been received, got: %v", err) } assertPaymentStatus(t, pControl, info.PaymentHash, StatusSucceeded) - assertPaymentInfo(t, pControl, info.PaymentHash, info, attempt, preimg, nil) + assertPaymentInfo(t, pControl, info.PaymentHash, info, 0, attempt, preimg, nil) err = pControl.InitPayment(info.PaymentHash, info) if err != ErrAlreadyPaid { @@ -255,7 +273,12 @@ func TestPaymentControlSuccessesWithoutInFlight(t *testing.T) { } // Attempt to complete the payment should fail. - _, err = pControl.Success(info.PaymentHash, preimg) + _, err = pControl.SettleAttempt( + info.PaymentHash, 0, + &HTLCSettleInfo{ + Preimage: preimg, + }, + ) if err != ErrPaymentNotInitiated { t.Fatalf("expected ErrPaymentNotInitiated, got %v", err) } @@ -336,6 +359,15 @@ func TestPaymentControlDeleteNonInFligt(t *testing.T) { } if p.failed { + // Fail the payment attempt. + err := pControl.FailAttempt( + info.PaymentHash, attempt.AttemptID, + &HTLCFailInfo{}, + ) + if err != nil { + t.Fatalf("unable to fail htlc: %v", err) + } + // Fail the payment, which should moved it to Failed. failReason := FailureReasonNoRoute _, err = pControl.Fail(info.PaymentHash, failReason) @@ -346,24 +378,29 @@ func TestPaymentControlDeleteNonInFligt(t *testing.T) { // Verify the status is indeed Failed. assertPaymentStatus(t, pControl, info.PaymentHash, StatusFailed) assertPaymentInfo( - t, pControl, info.PaymentHash, info, attempt, + t, pControl, info.PaymentHash, info, 0, attempt, lntypes.Preimage{}, &failReason, ) } else if p.success { // Verifies that status was changed to StatusSucceeded. - _, err := pControl.Success(info.PaymentHash, preimg) + _, err := pControl.SettleAttempt( + info.PaymentHash, 1, + &HTLCSettleInfo{ + Preimage: preimg, + }, + ) if err != nil { t.Fatalf("error shouldn't have been received, got: %v", err) } assertPaymentStatus(t, pControl, info.PaymentHash, StatusSucceeded) assertPaymentInfo( - t, pControl, info.PaymentHash, info, attempt, preimg, nil, + t, pControl, info.PaymentHash, info, 0, attempt, preimg, nil, ) } else { assertPaymentStatus(t, pControl, info.PaymentHash, StatusInFlight) assertPaymentInfo( - t, pControl, info.PaymentHash, info, attempt, + t, pControl, info.PaymentHash, info, 0, attempt, lntypes.Preimage{}, nil, ) } @@ -414,7 +451,7 @@ func assertPaymentStatus(t *testing.T, p *PaymentControl, // assertPaymentInfo retrieves the payment referred to by hash and verifies the // expected values. func assertPaymentInfo(t *testing.T, p *PaymentControl, hash lntypes.Hash, - c *PaymentCreationInfo, a *HTLCAttemptInfo, s lntypes.Preimage, + c *PaymentCreationInfo, aIdx int, a *HTLCAttemptInfo, s lntypes.Preimage, f *FailureReason) { t.Helper() @@ -446,7 +483,7 @@ func assertPaymentInfo(t *testing.T, p *PaymentControl, hash lntypes.Hash, return } - htlc := payment.HTLCs[0] + htlc := payment.HTLCs[aIdx] if err := assertRouteEqual(&htlc.Route, &a.Route); err != nil { t.Fatal("routes do not match") } diff --git a/channeldb/payments.go b/channeldb/payments.go index fc5e38bc20..96fab0a716 100644 --- a/channeldb/payments.go +++ b/channeldb/payments.go @@ -30,9 +30,19 @@ var ( // |-- // | |--sequence-key: // | |--creation-info-key: - // | |--attempt-info-key: - // | |--settle-info-key: - // | |--fail-info-key: + // | |--fail-info-key: <(optional) fail info> + // | | + // | |--payment-htlcs-bucket (shard-bucket) + // | | | + // | | |-- + // | | | |--htlc-attempt-info-key: + // | | | |--htlc-settle-info-key: <(optional) settle info> + // | | | |--htlc-fail-info-key: <(optional) fail info> + // | | | + // | | |-- + // | | | | + // | | ... ... + // | | // | | // | |--duplicate-bucket (only for old, completed payments) // | | @@ -62,14 +72,21 @@ var ( // store the creation info of the payment. paymentCreationInfoKey = []byte("payment-creation-info") - // paymentAttemptInfoKey is a key used in the payment's sub-bucket to - // store the info about the latest attempt that was done for the - // payment in question. - paymentAttemptInfoKey = []byte("payment-attempt-info") + // paymentHtlcsBucket is a bucket where we'll store the information + // about the HTLCs that were attempted for a payment. + paymentHtlcsBucket = []byte("payment-htlcs-bucket") + + // htlcAttemptInfoKey is a key used in a HTLC's sub-bucket to store the + // info about the attempt that was done for the HTLC in question. + htlcAttemptInfoKey = []byte("htlc-attempt-info") - // paymentSettleInfoKey is a key used in the payment's sub-bucket to - // store the settle info of the payment. - paymentSettleInfoKey = []byte("payment-settle-info") + // htlcSettleInfoKey is a key used in a HTLC's sub-bucket to store the + // settle info, if any. + htlcSettleInfoKey = []byte("htlc-settle-info") + + // htlcFailInfoKey is a key used in a HTLC's sub-bucket to store + // failure information, if any. + htlcFailInfoKey = []byte("htlc-fail-info") // paymentFailInfoKey is a key used in the payment's sub-bucket to // store information about the reason a payment failed. @@ -177,98 +194,6 @@ type PaymentCreationInfo struct { PaymentRequest []byte } -// Payment is a wrapper around a payment's PaymentCreationInfo, -// HTLCAttemptInfo, and preimage. All payments will have the -// PaymentCreationInfo set, the HTLCAttemptInfo will be set only if at least -// one payment attempt has been made, while only completed payments will have a -// non-zero payment preimage. -type Payment struct { - // sequenceNum is a unique identifier used to sort the payments in - // order of creation. - sequenceNum uint64 - - // Status is the current PaymentStatus of this payment. - Status PaymentStatus - - // Info holds all static information about this payment, and is - // populated when the payment is initiated. - Info *PaymentCreationInfo - - // Attempt is the information about the last payment attempt made. - // - // NOTE: Can be nil if no attempt is yet made. - Attempt *HTLCAttemptInfo - - // Preimage is the preimage of a successful payment. This serves as a - // proof of payment. It will only be non-nil for settled payments. - // - // NOTE: Can be nil if payment is not settled. - Preimage *lntypes.Preimage - - // Failure is a failure reason code indicating the reason the payment - // failed. It is only non-nil for failed payments. - // - // NOTE: Can be nil if payment is not failed. - Failure *FailureReason -} - -// ToMPPayment converts a legacy payment into an MPPayment. -func (p *Payment) ToMPPayment() *MPPayment { - var ( - htlcs []HTLCAttempt - reason *FailureReason - settle *HTLCSettleInfo - failure *HTLCFailInfo - ) - - // Promote the payment failure to a proper fail struct, if it exists. - if p.Failure != nil { - // NOTE: FailTime is not set for legacy payments. - failure = &HTLCFailInfo{} - reason = p.Failure - } - - // Promote the payment preimage to proper settle struct, if it exists. - if p.Preimage != nil { - // NOTE: SettleTime is not set for legacy payments. - settle = &HTLCSettleInfo{ - Preimage: *p.Preimage, - } - } - - // Either a settle or a failure may be set, but not both. - if settle != nil && failure != nil { - panic("htlc attempt has both settle and failure info") - } - - // Populate a single HTLC on the MPPayment if an attempt exists on the - // legacy payment. If none exists we will leave the attempt info blank - // since we cannot recover it. - if p.Attempt != nil { - // NOTE: AttemptTime is not set for legacy payments. - htlcs = []HTLCAttempt{ - { - HTLCAttemptInfo: *p.Attempt, - Settle: settle, - Failure: failure, - }, - } - } - - return &MPPayment{ - sequenceNum: p.sequenceNum, - Info: &PaymentCreationInfo{ - PaymentHash: p.Info.PaymentHash, - Value: p.Info.Value, - CreationTime: p.Info.CreationTime, - PaymentRequest: p.Info.PaymentRequest, - }, - HTLCs: htlcs, - FailureReason: reason, - Status: p.Status, - } -} - // FetchPayments returns all sent payments found in the DB. // // nolint: dupl @@ -324,20 +249,15 @@ func (db *DB) FetchPayments() ([]*MPPayment, error) { } func fetchPayment(bucket *bbolt.Bucket) (*MPPayment, error) { - var ( - err error - p = &Payment{} - ) - seqBytes := bucket.Get(paymentSequenceKey) if seqBytes == nil { return nil, fmt.Errorf("sequence number not found") } - p.sequenceNum = binary.BigEndian.Uint64(seqBytes) + sequenceNum := binary.BigEndian.Uint64(seqBytes) // Get the payment status. - p.Status, err = fetchPaymentStatus(bucket) + paymentStatus, err := fetchPaymentStatus(bucket) if err != nil { return nil, err } @@ -349,39 +269,118 @@ func fetchPayment(bucket *bbolt.Bucket) (*MPPayment, error) { } r := bytes.NewReader(b) - p.Info, err = deserializePaymentCreationInfo(r) + creationInfo, err := deserializePaymentCreationInfo(r) if err != nil { return nil, err } - // Get the HTLCAttemptInfo. This can be unset. - b = bucket.Get(paymentAttemptInfoKey) - if b != nil { - r = bytes.NewReader(b) - p.Attempt, err = deserializeHTLCAttemptInfo(r) + var htlcs []HTLCAttempt + htlcsBucket := bucket.Bucket(paymentHtlcsBucket) + if htlcsBucket != nil { + // Get the payment attempts. This can be empty. + htlcs, err = fetchHtlcAttempts(htlcsBucket) if err != nil { return nil, err } } - // Get the payment preimage. This is only found for - // completed payments. - b = bucket.Get(paymentSettleInfoKey) - if b != nil { - var preimg lntypes.Preimage - copy(preimg[:], b[:]) - p.Preimage = &preimg - } - // Get failure reason if available. + var failureReason *FailureReason b = bucket.Get(paymentFailInfoKey) if b != nil { reason := FailureReason(b[0]) - p.Failure = &reason + failureReason = &reason } - return p.ToMPPayment(), nil + return &MPPayment{ + sequenceNum: sequenceNum, + Info: creationInfo, + HTLCs: htlcs, + FailureReason: failureReason, + Status: paymentStatus, + }, nil +} + +// fetchHtlcAttempts retrives all htlc attempts made for the payment found in +// the given bucket. +func fetchHtlcAttempts(bucket *bbolt.Bucket) ([]HTLCAttempt, error) { + htlcs := make([]HTLCAttempt, 0) + + err := bucket.ForEach(func(k, _ []byte) error { + aid := byteOrder.Uint64(k) + htlcBucket := bucket.Bucket(k) + + attemptInfo, err := fetchHtlcAttemptInfo( + htlcBucket, + ) + if err != nil { + return err + } + attemptInfo.AttemptID = aid + + htlc := HTLCAttempt{ + HTLCAttemptInfo: *attemptInfo, + } + + // Settle info might be nil. + htlc.Settle, err = fetchHtlcSettleInfo(htlcBucket) + if err != nil { + return err + } + + // Failure info might be nil. + htlc.Failure, err = fetchHtlcFailInfo(htlcBucket) + if err != nil { + return err + } + + htlcs = append(htlcs, htlc) + return nil + }) + if err != nil { + return nil, err + } + + return htlcs, nil +} + +// fetchHtlcAttemptInfo fetches the payment attempt info for this htlc from the +// bucket. +func fetchHtlcAttemptInfo(bucket *bbolt.Bucket) (*HTLCAttemptInfo, error) { + b := bucket.Get(htlcAttemptInfoKey) + if b == nil { + return nil, errNoAttemptInfo + } + + r := bytes.NewReader(b) + return deserializeHTLCAttemptInfo(r) +} + +// fetchHtlcSettleInfo retrieves the settle info for the htlc. If the htlc isn't +// settled, nil is returned. +func fetchHtlcSettleInfo(bucket *bbolt.Bucket) (*HTLCSettleInfo, error) { + b := bucket.Get(htlcSettleInfoKey) + if b == nil { + // Settle info is optional. + return nil, nil + } + + r := bytes.NewReader(b) + return deserializeHTLCSettleInfo(r) +} + +// fetchHtlcFailInfo retrieves the failure info for the htlc. If the htlc hasn't +// failed, nil is returned. +func fetchHtlcFailInfo(bucket *bbolt.Bucket) (*HTLCFailInfo, error) { + b := bucket.Get(htlcFailInfoKey) + if b == nil { + // Fail info is optional. + return nil, nil + } + + r := bytes.NewReader(b) + return deserializeHTLCFailInfo(r) } // DeletePayments deletes all completed and failed payments from the DB. @@ -430,6 +429,7 @@ func (db *DB) DeletePayments() error { }) } +// nolint: dupl func serializePaymentCreationInfo(w io.Writer, c *PaymentCreationInfo) error { var scratch [8]byte @@ -442,8 +442,7 @@ func serializePaymentCreationInfo(w io.Writer, c *PaymentCreationInfo) error { return err } - byteOrder.PutUint64(scratch[:], uint64(c.CreationTime.Unix())) - if _, err := w.Write(scratch[:]); err != nil { + if err := serializeTime(w, c.CreationTime); err != nil { return err } @@ -473,10 +472,11 @@ func deserializePaymentCreationInfo(r io.Reader) (*PaymentCreationInfo, error) { } c.Value = lnwire.MilliSatoshi(byteOrder.Uint64(scratch[:])) - if _, err := io.ReadFull(r, scratch[:]); err != nil { + creationTime, err := deserializeTime(r) + if err != nil { return nil, err } - c.CreationTime = time.Unix(int64(byteOrder.Uint64(scratch[:])), 0) + c.CreationTime = creationTime if _, err := io.ReadFull(r, scratch[:4]); err != nil { return nil, err @@ -495,7 +495,7 @@ func deserializePaymentCreationInfo(r io.Reader) (*PaymentCreationInfo, error) { } func serializeHTLCAttemptInfo(w io.Writer, a *HTLCAttemptInfo) error { - if err := WriteElements(w, a.AttemptID, a.SessionKey); err != nil { + if err := WriteElements(w, a.SessionKey); err != nil { return err } @@ -503,12 +503,12 @@ func serializeHTLCAttemptInfo(w io.Writer, a *HTLCAttemptInfo) error { return err } - return nil + return serializeTime(w, a.AttemptTime) } func deserializeHTLCAttemptInfo(r io.Reader) (*HTLCAttemptInfo, error) { a := &HTLCAttemptInfo{} - err := ReadElements(r, &a.AttemptID, &a.SessionKey) + err := ReadElements(r, &a.SessionKey) if err != nil { return nil, err } @@ -516,6 +516,12 @@ func deserializeHTLCAttemptInfo(r io.Reader) (*HTLCAttemptInfo, error) { if err != nil { return nil, err } + + a.AttemptTime, err = deserializeTime(r) + if err != nil { + return nil, err + } + return a, nil } diff --git a/channeldb/payments_test.go b/channeldb/payments_test.go index 26148a1ecd..3cf3a4bab3 100644 --- a/channeldb/payments_test.go +++ b/channeldb/payments_test.go @@ -67,9 +67,10 @@ func makeFakeInfo() (*PaymentCreationInfo, *HTLCAttemptInfo) { } a := &HTLCAttemptInfo{ - AttemptID: 44, - SessionKey: priv, - Route: testRoute, + AttemptID: 44, + SessionKey: priv, + Route: testRoute, + AttemptTime: time.Unix(100, 0), } return c, a } @@ -113,29 +114,30 @@ func TestSentPaymentSerialization(t *testing.T) { t.Fatalf("unable to serialize info: %v", err) } - newAttemptInfo, err := deserializeHTLCAttemptInfo(&b) + newWireInfo, err := deserializeHTLCAttemptInfo(&b) if err != nil { t.Fatalf("unable to deserialize info: %v", err) } + newWireInfo.AttemptID = s.AttemptID // First we verify all the records match up porperly, as they aren't // able to be properly compared using reflect.DeepEqual. - err = assertRouteEqual(&s.Route, &newAttemptInfo.Route) + err = assertRouteEqual(&s.Route, &newWireInfo.Route) if err != nil { t.Fatalf("Routes do not match after "+ "serialization/deserialization: %v", err) } // Clear routes to allow DeepEqual to compare the remaining fields. - newAttemptInfo.Route = route.Route{} + newWireInfo.Route = route.Route{} s.Route = route.Route{} - if !reflect.DeepEqual(s, newAttemptInfo) { + if !reflect.DeepEqual(s, newWireInfo) { s.SessionKey.Curve = nil - newAttemptInfo.SessionKey.Curve = nil + newWireInfo.SessionKey.Curve = nil t.Fatalf("Payments do not match after "+ "serialization/deserialization %v vs %v", - spew.Sdump(s), spew.Sdump(newAttemptInfo), + spew.Sdump(s), spew.Sdump(newWireInfo), ) } } diff --git a/routing/control_tower.go b/routing/control_tower.go index 0dffa7c633..5ade611cc8 100644 --- a/routing/control_tower.go +++ b/routing/control_tower.go @@ -14,7 +14,6 @@ import ( // restarts. Payments are transitioned through various payment states, and the // ControlTower interface provides access to driving the state transitions. type ControlTower interface { - // InitPayment atomically moves the payment into the InFlight state. // This method checks that no suceeded payment exist for this payment // hash. InitPayment(lntypes.Hash, *channeldb.PaymentCreationInfo) error @@ -22,17 +21,25 @@ type ControlTower interface { // RegisterAttempt atomically records the provided HTLCAttemptInfo. RegisterAttempt(lntypes.Hash, *channeldb.HTLCAttemptInfo) error - // Success transitions a payment into the Succeeded state. After - // invoking this method, InitPayment should always return an error to - // prevent us from making duplicate payments to the same payment hash. - // The provided preimage is atomically saved to the DB for record - // keeping. - Success(lntypes.Hash, lntypes.Preimage) error + // SettleAttempt marks the given attempt settled with the preimage. If + // this is a multi shard payment, this might implicitly mean the the + // full payment succeeded. + // + // After invoking this method, InitPayment should always return an + // error to prevent us from making duplicate payments to the same + // payment hash. The provided preimage is atomically saved to the DB + // for record keeping. + SettleAttempt(lntypes.Hash, uint64, *channeldb.HTLCSettleInfo) error + + // FailAttempt marks the given payment attempt failed. + FailAttempt(lntypes.Hash, uint64, *channeldb.HTLCFailInfo) error // Fail transitions a payment into the Failed state, and records the - // reason the payment failed. After invoking this method, InitPayment - // should return nil on its next call for this payment hash, allowing - // the switch to make a subsequent payment. + // ultimate reason the payment failed. Note that this should only be + // called when all active active attempts are already failed. After + // invoking this method, InitPayment should return nil on its next call + // for this payment hash, allowing the user to make a subsequent + // payment. Fail(lntypes.Hash, channeldb.FailureReason) error // FetchInFlightPayments returns all payments with status InFlight. @@ -99,14 +106,13 @@ func (p *controlTower) RegisterAttempt(paymentHash lntypes.Hash, return p.db.RegisterAttempt(paymentHash, attempt) } -// Success transitions a payment into the Succeeded state. After invoking this -// method, InitPayment should always return an error to prevent us from making -// duplicate payments to the same payment hash. The provided preimage is -// atomically saved to the DB for record keeping. -func (p *controlTower) Success(paymentHash lntypes.Hash, - preimage lntypes.Preimage) error { +// SettleAttempt marks the given attempt settled with the preimage. If +// this is a multi shard payment, this might implicitly mean the the +// full payment succeeded. +func (p *controlTower) SettleAttempt(paymentHash lntypes.Hash, + attemptID uint64, settleInfo *channeldb.HTLCSettleInfo) error { - payment, err := p.db.Success(paymentHash, preimage) + payment, err := p.db.SettleAttempt(paymentHash, attemptID, settleInfo) if err != nil { return err } @@ -119,6 +125,13 @@ func (p *controlTower) Success(paymentHash lntypes.Hash, return nil } +// FailAttempt marks the given payment attempt failed. +func (p *controlTower) FailAttempt(paymentHash lntypes.Hash, + attemptID uint64, failInfo *channeldb.HTLCFailInfo) error { + + return p.db.FailAttempt(paymentHash, attemptID, failInfo) +} + // createSuccessResult creates a success result to send to subscribers. func createSuccessResult(htlcs []channeldb.HTLCAttempt) *PaymentResult { // Extract any preimage from the list of HTLCs. diff --git a/routing/control_tower_test.go b/routing/control_tower_test.go index d4399ced4f..6bc8ffd7d9 100644 --- a/routing/control_tower_test.go +++ b/routing/control_tower_test.go @@ -13,9 +13,8 @@ import ( "github.com/btcsuite/btcd/btcec" "github.com/davecgh/go-spew/spew" "github.com/lightningnetwork/lnd/channeldb" - "github.com/lightningnetwork/lnd/routing/route" - "github.com/lightningnetwork/lnd/lntypes" + "github.com/lightningnetwork/lnd/routing/route" ) var ( @@ -111,7 +110,13 @@ func TestControlTowerSubscribeSuccess(t *testing.T) { } // Mark the payment as successful. - if err := pControl.Success(info.PaymentHash, preimg); err != nil { + err = pControl.SettleAttempt( + info.PaymentHash, attempt.AttemptID, + &channeldb.HTLCSettleInfo{ + Preimage: preimg, + }, + ) + if err != nil { t.Fatal(err) } @@ -213,6 +218,15 @@ func testPaymentControlSubscribeFail(t *testing.T, registerAttempt bool) { if err != nil { t.Fatal(err) } + + // Fail the payment attempt. + err := pControl.FailAttempt( + info.PaymentHash, attempt.AttemptID, + &channeldb.HTLCFailInfo{}, + ) + if err != nil { + t.Fatalf("unable to fail htlc: %v", err) + } } // Mark the payment as failed. diff --git a/routing/mock_test.go b/routing/mock_test.go index a840d73861..6332bea8f6 100644 --- a/routing/mock_test.go +++ b/routing/mock_test.go @@ -231,7 +231,8 @@ func (m *mockControlTower) InitPayment(phash lntypes.Hash, } m.inflights[phash] = channeldb.InFlightPayment{ - Info: c, + Info: c, + Attempts: make([]channeldb.HTLCAttemptInfo, 0), } return nil @@ -252,20 +253,20 @@ func (m *mockControlTower) RegisterAttempt(phash lntypes.Hash, return fmt.Errorf("not in flight") } - p.Attempt = a + p.Attempts = append(p.Attempts, *a) m.inflights[phash] = p return nil } -func (m *mockControlTower) Success(phash lntypes.Hash, - preimg lntypes.Preimage) error { +func (m *mockControlTower) SettleAttempt(phash lntypes.Hash, + pid uint64, settleInfo *channeldb.HTLCSettleInfo) error { m.Lock() defer m.Unlock() if m.success != nil { - m.success <- successArgs{preimg} + m.success <- successArgs{settleInfo.Preimage} } delete(m.inflights, phash) @@ -310,3 +311,9 @@ func (m *mockControlTower) SubscribePayment(paymentHash lntypes.Hash) ( return false, nil, errors.New("not implemented") } + +func (m *mockControlTower) FailAttempt(hash lntypes.Hash, pid uint64, + failInfo *channeldb.HTLCFailInfo) error { + + return nil +} diff --git a/routing/payment_lifecycle.go b/routing/payment_lifecycle.go index 13d59370cd..565262edd2 100644 --- a/routing/payment_lifecycle.go +++ b/routing/payment_lifecycle.go @@ -58,6 +58,13 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) { // the DB, we send it. sendErr := p.sendPaymentAttempt(firstHop, htlcAdd) if sendErr != nil { + // TODO(joostjager): Distinguish unexpected + // internal errors from real send errors. + err = p.failAttempt() + if err != nil { + return [32]byte{}, nil, err + } + // We must inspect the error to know whether it // was critical or not, to decide whether we // should continue trying. @@ -110,6 +117,11 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) { "the Switch, retrying.", p.attempt.AttemptID, p.payment.PaymentHash) + err = p.failAttempt() + if err != nil { + return [32]byte{}, nil, err + } + // Reset the attempt to indicate we want to make a new // attempt. p.attempt = nil @@ -146,6 +158,11 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) { log.Errorf("Attempt to send payment %x failed: %v", p.payment.PaymentHash, result.Error) + err = p.failAttempt() + if err != nil { + return [32]byte{}, nil, err + } + // We must inspect the error to know whether it was // critical or not, to decide whether we should // continue trying. @@ -174,7 +191,13 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) { // In case of success we atomically store the db payment and // move the payment to the success state. - err = p.router.cfg.Control.Success(p.payment.PaymentHash, result.Preimage) + err = p.router.cfg.Control.SettleAttempt( + p.payment.PaymentHash, p.attempt.AttemptID, + &channeldb.HTLCSettleInfo{ + Preimage: result.Preimage, + SettleTime: p.router.cfg.Clock.Now(), + }, + ) if err != nil { log.Errorf("Unable to succeed payment "+ "attempt: %v", err) @@ -339,9 +362,10 @@ func (p *paymentLifecycle) createNewPaymentAttempt() (lnwire.ShortChannelID, // We now have all the information needed to populate // the current attempt information. p.attempt = &channeldb.HTLCAttemptInfo{ - AttemptID: attemptID, - SessionKey: sessionKey, - Route: *rt, + AttemptID: attemptID, + AttemptTime: p.router.cfg.Clock.Now(), + SessionKey: sessionKey, + Route: *rt, } // Before sending this HTLC to the switch, we checkpoint the @@ -421,3 +445,15 @@ func (p *paymentLifecycle) handleSendError(sendErr error) error { // Terminal state, return the error we encountered. return sendErr } + +// failAttempt calls control tower to fail the current payment attempt. +func (p *paymentLifecycle) failAttempt() error { + failInfo := &channeldb.HTLCFailInfo{ + FailTime: p.router.cfg.Clock.Now(), + } + + return p.router.cfg.Control.FailAttempt( + p.payment.PaymentHash, p.attempt.AttemptID, + failInfo, + ) +} diff --git a/routing/router.go b/routing/router.go index a4b264e1bb..6751bfaea3 100644 --- a/routing/router.go +++ b/routing/router.go @@ -541,7 +541,14 @@ func (r *ChannelRouter) Start() error { PaymentHash: payment.Info.PaymentHash, } - _, _, err := r.sendPayment(payment.Attempt, lPayment, paySession) + // TODO(joostjager): For mpp, possibly relaunch multiple + // in-flight htlcs here. + var attempt *channeldb.HTLCAttemptInfo + if len(payment.Attempts) > 0 { + attempt = &payment.Attempts[0] + } + + _, _, err := r.sendPayment(attempt, lPayment, paySession) if err != nil { log.Errorf("Resuming payment with hash %v "+ "failed: %v.", payment.Info.PaymentHash, err) From f86e68a1a234c4456a29a3901b37ade6872e7654 Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 20 Feb 2020 18:08:01 +0100 Subject: [PATCH 13/16] channeldb+routing: store full htlc failure reason This commit extends the htlc fail info with the full failure reason that was received over the wire. In a later commit, this info will also be exposed on the rpc interface. Furthermore it serves as a building block to make SendToRoute reliable across restarts. --- channeldb/mp_payment.go | 75 ++++++++++++++++++++++++++++++- channeldb/payment_control_test.go | 8 +++- routing/payment_lifecycle.go | 61 ++++++++++++++++++++++--- 3 files changed, 134 insertions(+), 10 deletions(-) diff --git a/channeldb/mp_payment.go b/channeldb/mp_payment.go index 7c5d97aee1..d46e590913 100644 --- a/channeldb/mp_payment.go +++ b/channeldb/mp_payment.go @@ -1,11 +1,14 @@ package channeldb import ( + "bytes" "io" "time" "github.com/btcsuite/btcd/btcec" + "github.com/btcsuite/btcd/wire" "github.com/lightningnetwork/lnd/lntypes" + "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/routing/route" ) @@ -57,11 +60,45 @@ type HTLCSettleInfo struct { SettleTime time.Time } +// HTLCFailReason is the reason an htlc failed. +type HTLCFailReason byte + +const ( + // HTLCFailUnknown is recorded for htlcs that failed with an unknown + // reason. + HTLCFailUnknown HTLCFailReason = 0 + + // HTLCFailUnknown is recorded for htlcs that had a failure message that + // couldn't be decrypted. + HTLCFailUnreadable HTLCFailReason = 1 + + // HTLCFailInternal is recorded for htlcs that failed because of an + // internal error. + HTLCFailInternal HTLCFailReason = 2 + + // HTLCFailMessage is recorded for htlcs that failed with a network + // failure message. + HTLCFailMessage HTLCFailReason = 3 +) + // HTLCFailInfo encapsulates the information that augments an HTLCAttempt in the // event that the HTLC fails. type HTLCFailInfo struct { // FailTime is the time at which this HTLC was failed. FailTime time.Time + + // Message is the wire message that failed this HTLC. This field will be + // populated when the failure reason is HTLCFailMessage. + Message lnwire.FailureMessage + + // Reason is the failure reason for this HTLC. + Reason HTLCFailReason + + // The position in the path of the intermediate or final node that + // generated the failure message. Position zero is the sender node. This + // field will be populated when the failure reason is either + // HTLCFailMessage or HTLCFailUnknown. + FailureSourceIndex uint32 } // MPPayment is a wrapper around a payment's PaymentCreationInfo and @@ -130,7 +167,20 @@ func serializeHTLCFailInfo(w io.Writer, f *HTLCFailInfo) error { return err } - return nil + // Write failure. If there is no failure message, write an empty + // byte slice. + var messageBytes bytes.Buffer + if f.Message != nil { + err := lnwire.EncodeFailureMessage(&messageBytes, f.Message, 0) + if err != nil { + return err + } + } + if err := wire.WriteVarBytes(w, 0, messageBytes.Bytes()); err != nil { + return err + } + + return WriteElements(w, byte(f.Reason), f.FailureSourceIndex) } // deserializeHTLCFailInfo deserializes the details of a failed htlc including @@ -143,6 +193,29 @@ func deserializeHTLCFailInfo(r io.Reader) (*HTLCFailInfo, error) { return nil, err } + // Read failure. + failureBytes, err := wire.ReadVarBytes( + r, 0, lnwire.FailureMessageLength, "failure", + ) + if err != nil { + return nil, err + } + if len(failureBytes) > 0 { + f.Message, err = lnwire.DecodeFailureMessage( + bytes.NewReader(failureBytes), 0, + ) + if err != nil { + return nil, err + } + } + + var reason byte + err = ReadElements(r, &reason, &f.FailureSourceIndex) + if err != nil { + return nil, err + } + f.Reason = HTLCFailReason(reason) + return f, nil } diff --git a/channeldb/payment_control_test.go b/channeldb/payment_control_test.go index 7856cc1ac1..272de68c9b 100644 --- a/channeldb/payment_control_test.go +++ b/channeldb/payment_control_test.go @@ -126,7 +126,9 @@ func TestPaymentControlSwitchFail(t *testing.T) { } err = pControl.FailAttempt( - info.PaymentHash, 2, &HTLCFailInfo{}, + info.PaymentHash, 2, &HTLCFailInfo{ + Reason: HTLCFailUnreadable, + }, ) if err != nil { t.Fatal(err) @@ -362,7 +364,9 @@ func TestPaymentControlDeleteNonInFligt(t *testing.T) { // Fail the payment attempt. err := pControl.FailAttempt( info.PaymentHash, attempt.AttemptID, - &HTLCFailInfo{}, + &HTLCFailInfo{ + Reason: HTLCFailUnreadable, + }, ) if err != nil { t.Fatalf("unable to fail htlc: %v", err) diff --git a/routing/payment_lifecycle.go b/routing/payment_lifecycle.go index 565262edd2..96441d179d 100644 --- a/routing/payment_lifecycle.go +++ b/routing/payment_lifecycle.go @@ -60,7 +60,7 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) { if sendErr != nil { // TODO(joostjager): Distinguish unexpected // internal errors from real send errors. - err = p.failAttempt() + err = p.failAttempt(sendErr) if err != nil { return [32]byte{}, nil, err } @@ -117,7 +117,7 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) { "the Switch, retrying.", p.attempt.AttemptID, p.payment.PaymentHash) - err = p.failAttempt() + err = p.failAttempt(err) if err != nil { return [32]byte{}, nil, err } @@ -158,7 +158,7 @@ func (p *paymentLifecycle) resumePayment() ([32]byte, *route.Route, error) { log.Errorf("Attempt to send payment %x failed: %v", p.payment.PaymentHash, result.Error) - err = p.failAttempt() + err = p.failAttempt(result.Error) if err != nil { return [32]byte{}, nil, err } @@ -447,13 +447,60 @@ func (p *paymentLifecycle) handleSendError(sendErr error) error { } // failAttempt calls control tower to fail the current payment attempt. -func (p *paymentLifecycle) failAttempt() error { - failInfo := &channeldb.HTLCFailInfo{ - FailTime: p.router.cfg.Clock.Now(), - } +func (p *paymentLifecycle) failAttempt(sendError error) error { + failInfo := marshallError( + sendError, + p.router.cfg.Clock.Now(), + ) return p.router.cfg.Control.FailAttempt( p.payment.PaymentHash, p.attempt.AttemptID, failInfo, ) } + +// marshallError marshall an error as received from the switch to a structure +// that is suitable for database storage. +func marshallError(sendError error, time time.Time) *channeldb.HTLCFailInfo { + response := &channeldb.HTLCFailInfo{ + FailTime: time, + } + + switch sendError { + + case htlcswitch.ErrPaymentIDNotFound: + response.Reason = channeldb.HTLCFailInternal + return response + + case htlcswitch.ErrUnreadableFailureMessage: + response.Reason = channeldb.HTLCFailUnreadable + return response + } + + rtErr, ok := sendError.(htlcswitch.ClearTextError) + if !ok { + response.Reason = channeldb.HTLCFailInternal + return response + } + + message := rtErr.WireMessage() + if message != nil { + response.Reason = channeldb.HTLCFailMessage + response.Message = message + } else { + response.Reason = channeldb.HTLCFailUnknown + } + + // If the ClearTextError received is a ForwardingError, the error + // originated from a node along the route, not locally on our outgoing + // link. We set failureSourceIdx to the index of the node where the + // failure occurred. If the error is not a ForwardingError, the failure + // occurred at our node, so we leave the index as 0 to indicate that + // we failed locally. + fErr, ok := rtErr.(*htlcswitch.ForwardingError) + if ok { + response.FailureSourceIndex = uint32(fErr.FailureSourceIdx) + } + + return response +} From 4cea2d5213d301e3f51f4b831f9f8b1dbe2031cb Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Mon, 24 Feb 2020 16:27:21 +0100 Subject: [PATCH 14/16] channeldb/migtest: add migration test tools This commit adds test helper code to dump, restore and verify the low-level bbolt database structure. --- channeldb/migtest/raw_db.go | 187 ++++++++++++++++++++++++++++++++++++ 1 file changed, 187 insertions(+) create mode 100644 channeldb/migtest/raw_db.go diff --git a/channeldb/migtest/raw_db.go b/channeldb/migtest/raw_db.go new file mode 100644 index 0000000000..46dc417a85 --- /dev/null +++ b/channeldb/migtest/raw_db.go @@ -0,0 +1,187 @@ +package migtest + +import ( + "bytes" + "encoding/hex" + "errors" + "fmt" + "strings" + + "github.com/coreos/bbolt" +) + +// DumpDB dumps go code describing the contents of the database to stdout. This +// function is only intended for use during development. +// +// Example output: +// +// map[string]interface{}{ +// hex("1234"): map[string]interface{}{ +// "human-readable": hex("102030"), +// hex("1111"): hex("5783492373"), +// }, +// } +func DumpDB(tx *bbolt.Tx, rootKey []byte) error { + bucket := tx.Bucket(rootKey) + if bucket == nil { + return fmt.Errorf("bucket %v not found", string(rootKey)) + } + + return dumpBucket(bucket) +} + +func dumpBucket(bucket *bbolt.Bucket) error { + fmt.Printf("map[string]interface{} {\n") + err := bucket.ForEach(func(k, v []byte) error { + key := toString(k) + fmt.Printf("%v: ", key) + + subBucket := bucket.Bucket(k) + if subBucket != nil { + err := dumpBucket(subBucket) + if err != nil { + return err + } + } else { + fmt.Print(toHex(v)) + } + fmt.Printf(",\n") + + return nil + }) + if err != nil { + return err + } + fmt.Printf("}") + + return nil +} + +// RestoreDB primes the database with the given data set. +func RestoreDB(tx *bbolt.Tx, rootKey []byte, data map[string]interface{}) error { + bucket, err := tx.CreateBucket(rootKey) + if err != nil { + return err + } + + return restoreDB(bucket, data) +} + +func restoreDB(bucket *bbolt.Bucket, data map[string]interface{}) error { + for k, v := range data { + key := []byte(k) + + switch value := v.(type) { + + // Key contains value. + case string: + err := bucket.Put(key, []byte(value)) + if err != nil { + return err + } + + // Key contains a sub-bucket. + case map[string]interface{}: + subBucket, err := bucket.CreateBucket(key) + if err != nil { + return err + } + + if err := restoreDB(subBucket, value); err != nil { + return err + } + + default: + return errors.New("invalid type") + } + } + + return nil +} + +// VerifyDB verifies the database against the given data set. +func VerifyDB(tx *bbolt.Tx, rootKey []byte, data map[string]interface{}) error { + bucket := tx.Bucket(rootKey) + if bucket == nil { + return fmt.Errorf("bucket %v not found", string(rootKey)) + } + + return verifyDB(bucket, data) +} + +func verifyDB(bucket *bbolt.Bucket, data map[string]interface{}) error { + for k, v := range data { + key := []byte(k) + + switch value := v.(type) { + + // Key contains value. + case string: + expectedValue := []byte(value) + dbValue := bucket.Get(key) + + if !bytes.Equal(dbValue, expectedValue) { + return errors.New("value mismatch") + } + + // Key contains a sub-bucket. + case map[string]interface{}: + subBucket := bucket.Bucket(key) + if subBucket == nil { + return fmt.Errorf("bucket %v not found", k) + } + + err := verifyDB(subBucket, value) + if err != nil { + return err + } + + default: + return errors.New("invalid type") + } + } + + keyCount := 0 + err := bucket.ForEach(func(k, v []byte) error { + keyCount++ + return nil + }) + if err != nil { + return err + } + if keyCount != len(data) { + return errors.New("unexpected keys in database") + } + + return nil +} + +func toHex(v []byte) string { + if len(v) == 0 { + return "nil" + } + + return "hex(\"" + hex.EncodeToString(v) + "\")" +} + +func toString(v []byte) string { + readableChars := "abcdefghijklmnopqrstuvwxyz0123456789-" + + for _, c := range v { + if !strings.Contains(readableChars, string(c)) { + return toHex(v) + } + } + + return "\"" + string(v) + "\"" +} + +// Hex is a test helper function to convert readable hex arrays to raw byte +// strings. +func Hex(value string) string { + b, err := hex.DecodeString(value) + if err != nil { + panic(err) + } + return string(b) +} From 866623e84b24efe96664ad549723fa736227ac7b Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Thu, 20 Feb 2020 18:08:01 +0100 Subject: [PATCH 15/16] channeldb/migration13: migrate to mpp structure This commit migrates the payments in the database to a new structure that allows for multiple htlcs per payments. The migration introduces a new sub-bucket that contains a list of htlcs and moves the old single htlc into that. --- channeldb/db.go | 6 + channeldb/log.go | 2 + channeldb/migration13/log.go | 14 ++ channeldb/migration13/migration.go | 202 ++++++++++++++++++++++++ channeldb/migration13/migration_test.go | 123 +++++++++++++++ 5 files changed, 347 insertions(+) create mode 100644 channeldb/migration13/log.go create mode 100644 channeldb/migration13/migration.go create mode 100644 channeldb/migration13/migration_test.go diff --git a/channeldb/db.go b/channeldb/db.go index c1cf46ba80..cd4cd7568d 100644 --- a/channeldb/db.go +++ b/channeldb/db.go @@ -14,6 +14,7 @@ import ( "github.com/coreos/bbolt" "github.com/go-errors/errors" "github.com/lightningnetwork/lnd/channeldb/migration12" + "github.com/lightningnetwork/lnd/channeldb/migration13" "github.com/lightningnetwork/lnd/channeldb/migration_01_to_11" "github.com/lightningnetwork/lnd/clock" "github.com/lightningnetwork/lnd/lnwire" @@ -124,6 +125,11 @@ var ( number: 12, migration: migration12.MigrateInvoiceTLV, }, + { + // Migrate to multi-path payments. + number: 13, + migration: migration13.MigrateMPP, + }, } // Big endian is the preferred byte order, due to cursor scans over diff --git a/channeldb/log.go b/channeldb/log.go index 5229edbfbf..7490c6bf5f 100644 --- a/channeldb/log.go +++ b/channeldb/log.go @@ -4,6 +4,7 @@ import ( "github.com/btcsuite/btclog" "github.com/lightningnetwork/lnd/build" "github.com/lightningnetwork/lnd/channeldb/migration12" + "github.com/lightningnetwork/lnd/channeldb/migration13" "github.com/lightningnetwork/lnd/channeldb/migration_01_to_11" ) @@ -29,4 +30,5 @@ func UseLogger(logger btclog.Logger) { log = logger migration_01_to_11.UseLogger(logger) migration12.UseLogger(logger) + migration13.UseLogger(logger) } diff --git a/channeldb/migration13/log.go b/channeldb/migration13/log.go new file mode 100644 index 0000000000..33ec1812af --- /dev/null +++ b/channeldb/migration13/log.go @@ -0,0 +1,14 @@ +package migration13 + +import ( + "github.com/btcsuite/btclog" +) + +// log is a logger that is initialized as disabled. This means the package will +// not perform any logging by default until a logger is set. +var log = btclog.Disabled + +// UseLogger uses a specified Logger to output package logging info. +func UseLogger(logger btclog.Logger) { + log = logger +} diff --git a/channeldb/migration13/migration.go b/channeldb/migration13/migration.go new file mode 100644 index 0000000000..56fced62de --- /dev/null +++ b/channeldb/migration13/migration.go @@ -0,0 +1,202 @@ +package migration13 + +import ( + "encoding/binary" + "fmt" + + "github.com/coreos/bbolt" +) + +var ( + paymentsRootBucket = []byte("payments-root-bucket") + + // paymentCreationInfoKey is a key used in the payment's sub-bucket to + // store the creation info of the payment. + paymentCreationInfoKey = []byte("payment-creation-info") + + // paymentFailInfoKey is a key used in the payment's sub-bucket to + // store information about the reason a payment failed. + paymentFailInfoKey = []byte("payment-fail-info") + + // paymentAttemptInfoKey is a key used in the payment's sub-bucket to + // store the info about the latest attempt that was done for the + // payment in question. + paymentAttemptInfoKey = []byte("payment-attempt-info") + + // paymentSettleInfoKey is a key used in the payment's sub-bucket to + // store the settle info of the payment. + paymentSettleInfoKey = []byte("payment-settle-info") + + // paymentHtlcsBucket is a bucket where we'll store the information + // about the HTLCs that were attempted for a payment. + paymentHtlcsBucket = []byte("payment-htlcs-bucket") + + // htlcAttemptInfoKey is a key used in a HTLC's sub-bucket to store the + // info about the attempt that was done for the HTLC in question. + htlcAttemptInfoKey = []byte("htlc-attempt-info") + + // htlcSettleInfoKey is a key used in a HTLC's sub-bucket to store the + // settle info, if any. + htlcSettleInfoKey = []byte("htlc-settle-info") + + // htlcFailInfoKey is a key used in a HTLC's sub-bucket to store + // failure information, if any. + htlcFailInfoKey = []byte("htlc-fail-info") + + byteOrder = binary.BigEndian +) + +// MigrateMPP migrates the payments to a new structure that accommodates for mpp +// payments. +func MigrateMPP(tx *bbolt.Tx) error { + log.Infof("Migrating payments to mpp structure") + + // Iterate over all payments and store their indexing keys. This is + // needed, because no modifications are allowed inside a Bucket.ForEach + // loop. + paymentsBucket := tx.Bucket(paymentsRootBucket) + if paymentsBucket == nil { + return nil + } + + var paymentKeys [][]byte + err := paymentsBucket.ForEach(func(k, v []byte) error { + paymentKeys = append(paymentKeys, k) + return nil + }) + if err != nil { + return err + } + + // With all keys retrieved, start the migration. + for _, k := range paymentKeys { + bucket := paymentsBucket.Bucket(k) + + // We only expect sub-buckets to be found in + // this top-level bucket. + if bucket == nil { + return fmt.Errorf("non bucket element in " + + "payments bucket") + } + + // Fetch old format creation info. + creationInfo := bucket.Get(paymentCreationInfoKey) + if creationInfo == nil { + return fmt.Errorf("creation info not found") + } + + // Make a copy because bbolt doesn't allow this value to be + // changed in-place. + newCreationInfo := make([]byte, len(creationInfo)) + copy(newCreationInfo, creationInfo) + + // Convert to nano seconds. + timeBytes := newCreationInfo[32+8 : 32+8+8] + time := byteOrder.Uint64(timeBytes) + timeNs := time * 1000000000 + byteOrder.PutUint64(timeBytes, timeNs) + + // Write back new format creation info. + err := bucket.Put(paymentCreationInfoKey, newCreationInfo) + if err != nil { + return err + } + + // No migration needed if there is no attempt stored. + attemptInfo := bucket.Get(paymentAttemptInfoKey) + if attemptInfo == nil { + continue + } + + // Delete attempt info on the payment level. + if err := bucket.Delete(paymentAttemptInfoKey); err != nil { + return err + } + + // Save attempt id for later use. + attemptID := attemptInfo[:8] + + // Discard attempt id. It will become a bucket key in the new + // structure. + attemptInfo = attemptInfo[8:] + + // Append unknown (zero) attempt time. + var zero [8]byte + attemptInfo = append(attemptInfo, zero[:]...) + + // Create bucket that contains all htlcs. + htlcsBucket, err := bucket.CreateBucket(paymentHtlcsBucket) + if err != nil { + return err + } + + // Create an htlc for this attempt. + htlcBucket, err := htlcsBucket.CreateBucket(attemptID) + if err != nil { + return err + } + + // Save migrated attempt info. + err = htlcBucket.Put(htlcAttemptInfoKey, attemptInfo) + if err != nil { + return err + } + + // Migrate settle info. + settleInfo := bucket.Get(paymentSettleInfoKey) + if settleInfo != nil { + // Payment-level settle info can be deleted. + err := bucket.Delete(paymentSettleInfoKey) + if err != nil { + return err + } + + // Append unknown (zero) settle time. + settleInfo = append(settleInfo, zero[:]...) + + // Save settle info. + err = htlcBucket.Put(htlcSettleInfoKey, settleInfo) + if err != nil { + return err + } + + // Migration for settled htlc completed. + continue + } + + // If there is no payment-level failure reason, the payment is + // still in flight and nothing else needs to be migrated. + // Otherwise the payment-level failure reason can remain + // unchanged. + inFlight := bucket.Get(paymentFailInfoKey) == nil + if inFlight { + continue + } + + // The htlc failed. Add htlc fail info with reason unknown. We + // don't have access to the original failure reason anymore. + failInfo := []byte{ + // Fail time unknown. + 0, 0, 0, 0, 0, 0, 0, 0, + + // Zero length wire message. + 0, + + // Failure reason unknown. + 0, + + // Failure source index zero. + 0, 0, 0, 0, + } + + // Save fail info. + err = htlcBucket.Put(htlcFailInfoKey, failInfo) + if err != nil { + return err + } + } + + log.Infof("Migration of payments to mpp structure complete!") + + return nil +} diff --git a/channeldb/migration13/migration_test.go b/channeldb/migration13/migration_test.go new file mode 100644 index 0000000000..4b3e4f2c75 --- /dev/null +++ b/channeldb/migration13/migration_test.go @@ -0,0 +1,123 @@ +package migration13 + +import ( + "testing" + + "github.com/coreos/bbolt" + "github.com/lightningnetwork/lnd/channeldb/migtest" +) + +var ( + hex = migtest.Hex + + zeroTime = hex("0000000000000000") + noFailureMessage = hex("00") + failureReasonUnknown = hex("00") + zeroFailureSourceIdx = hex("00000000") + + hash1 = hex("02acee76ebd53d00824410cf6adecad4f50334dac702bd5a2d3ba01b91709f0e") + creationInfoAmt1 = hex("00000000004c4b40") + creationInfoTime1 = hex("000000005e4fb7ab") // 1582282667 (decimal) + creationInfoTimeNano1 = hex("15f565b3cccaee00") // 1582282667000000000 (decimal) + creationInfoPayReq1 = hex("00000000") + attemptInfo1 = hex("2997a72e129fc9d638ef2fa4e233567d808d4f18a4f087637582427962eb3bf800005ce600000000004c4b402102ec12e83eafe27ce6d03bbe0c0de4b79fe2b9934615c8aa7693f73d2e41b089700000000121028c2dd128c7a6c1a0fceb3e3eb5ed55e0a0ae1a939eb786b097322d830d47db75005ca4000001000000005ce600000000004c4b400000000000") + attemptID1 = hex("0000000000000001") + paymentID1 = hex("0000000000000001") + + hash2 = hex("62eb3f0a48f954e495d0c14ac63df04a67cefa59dafdbcd3d5046d1f5647840c") + preimage2 = hex("479593b7d3cbb45beb22d448451a2f3619b2095adfb38f4d92e9886e96534368") + attemptID2 = hex("00000000000003e8") + paymentID2 = hex("0000000000000002") + attemptInfo2 = hex("8de663f9bb4b8d1ebdb496d22dc1cb657a346215607308549f41b01e2adf2ce900005ce600000000005b8d802102ec12e83eafe27ce6d03bbe0c0de4b79fe2b9934615c8aa7693f73d2e41b089700000000121028c2dd128c7a6c1a0fceb3e3eb5ed55e0a0ae1a939eb786b097322d830d47db75005ca4000001000000005ce600000000005b8d8000000000010000000000000008233d281e2cbe01f0b82dd6750967c9233426b98ae6549c696365f57f86f942a3795b8d80") + creationInfoAmt2 = hex("00000000005b8d80") + creationInfoTime2 = hex("000000005e4fb97f") // 1582283135 (decimal) + creationInfoTimeNano2 = hex("15F56620C3C43600") // 1582283135000000000 (decimal) + creationInfoPayReq2 = hex("000000fc6c6e62637274363075317030796c7774367070357674346e377a6a676c39327766397773633939767630307366666e7561376a656d74376d6535373471336b3337346a387373787164717163717a70677370353835357075743937713863747374776b7735796b306a667278736e746e7a6878326a77786a636d3937346c636437327a3564757339717939717371653872336b3578733379367868667366366d6a6e706d717172306661797a677a63336a6b663571787a6c376866787a6666763578667a7679647564327275767974706571787072376868796830726a747574373033333274737774686661616e303773766b6667716b7174667275") + + hash3 = hex("62eb3f0a48f954e495d0c14ac63df04a67cefa59dafdbcd3d5046d1f5647840d") + attemptInfo3 = hex("53ce0a4c1507cc5ea00ec88b76bd43a3978ac13605497030b821af6ce9c110f300005ce600000000006acfc02102ec12e83eafe27ce6d03bbe0c0de4b79fe2b9934615c8aa7693f73d2e41b089700000000121028c2dd128c7a6c1a0fceb3e3eb5ed55e0a0ae1a939eb786b097322d830d47db75005ca4000001000000005ce600000000006acfc000000000010000000000000008233044f235354472318b381fad3e21eb5a58f5099918868b0610e7b7bcb7a4adc96acfc0") + attemptID3 = hex("00000000000003e9") + paymentID3 = hex("0000000000000003") + creationInfoAmt3 = hex("00000000006acfc0") + creationInfoTime3 = hex("000000005e4fb98d") // 1582283149 + creationInfoTimeNano3 = hex("15F56624063B4200") // 1582283149000000000 (decimal) + creationInfoPayReq3 = hex("000000fc6c6e62637274373075317030796c7776327070357674346e377a6a676c39327766397773633939767630307366666e7561376a656d74376d6535373471336b3337346a387373787364717163717a706773703578707a307964663467336572727a656372376b6e7567307474667630327a7665727a72676b70737375376d6d6564617934687973397179397173717774656479336e666c323534787a36787a75763974746767757a647473356e617a7461616a6735667772686438396b336d70753971726d7a6c3779637a306e30666e6e763077753032726632706e64636c393761646c667636376a7a6e7063677477356434366771323571326e32") + + // pre is the data in the payments root bucket in database version 12 format. + pre = map[string]interface{}{ + // A failed payment. + hash1: map[string]interface{}{ + "payment-attempt-info": attemptID1 + attemptInfo1, + "payment-creation-info": hash1 + creationInfoAmt1 + creationInfoTime1 + creationInfoPayReq1, + "payment-fail-info": hex("03"), + "payment-sequence-key": paymentID1, + }, + + // A settled payment. + hash2: map[string]interface{}{ + "payment-attempt-info": attemptID2 + attemptInfo2, + "payment-creation-info": hash2 + creationInfoAmt2 + creationInfoTime2 + creationInfoPayReq2, + "payment-sequence-key": paymentID2, + "payment-settle-info": preimage2, + }, + + // An in-flight payment. + hash3: map[string]interface{}{ + "payment-attempt-info": attemptID3 + attemptInfo3, + "payment-creation-info": hash3 + creationInfoAmt3 + creationInfoTime3 + creationInfoPayReq3, + "payment-sequence-key": paymentID3, + }, + } + + // post is the expected data after migration. + post = map[string]interface{}{ + hash1: map[string]interface{}{ + "payment-creation-info": hash1 + creationInfoAmt1 + creationInfoTimeNano1 + creationInfoPayReq1, + "payment-fail-info": hex("03"), + "payment-htlcs-bucket": map[string]interface{}{ + attemptID1: map[string]interface{}{ + "htlc-attempt-info": attemptInfo1 + zeroTime, + "htlc-fail-info": zeroTime + noFailureMessage + failureReasonUnknown + zeroFailureSourceIdx, + }, + }, + "payment-sequence-key": paymentID1, + }, + hash2: map[string]interface{}{ + "payment-creation-info": hash2 + creationInfoAmt2 + creationInfoTimeNano2 + creationInfoPayReq2, + "payment-htlcs-bucket": map[string]interface{}{ + attemptID2: map[string]interface{}{ + "htlc-attempt-info": attemptInfo2 + zeroTime, + "htlc-settle-info": preimage2 + zeroTime, + }, + }, + "payment-sequence-key": paymentID2, + }, + hash3: map[string]interface{}{ + "payment-creation-info": hash3 + creationInfoAmt3 + creationInfoTimeNano3 + creationInfoPayReq3, + "payment-htlcs-bucket": map[string]interface{}{ + attemptID3: map[string]interface{}{ + "htlc-attempt-info": attemptInfo3 + zeroTime, + }, + }, + "payment-sequence-key": paymentID3, + }, + } +) + +// TestMigrateMpp asserts that the database is properly migrated to the mpp +// payment structure. +func TestMigrateMpp(t *testing.T) { + var paymentsRootBucket = []byte("payments-root-bucket") + + migtest.ApplyMigration( + t, + func(tx *bbolt.Tx) error { + return migtest.RestoreDB(tx, paymentsRootBucket, pre) + }, + func(tx *bbolt.Tx) error { + return migtest.VerifyDB(tx, paymentsRootBucket, post) + }, + MigrateMPP, + false, + ) +} From c0cb05d7b45034ce3cbb485c935e020e9ec9ce9a Mon Sep 17 00:00:00 2001 From: Joost Jager Date: Wed, 19 Feb 2020 17:21:03 +0100 Subject: [PATCH 16/16] lnrpc: expose raw htlc failure Adds a new rpc field to the payment htlc proto message and populates it with data that is now stored in the db. --- lnrpc/routerrpc/router_backend.go | 73 +- lnrpc/rpc.pb.go | 1406 +++++++++++++++-------------- lnrpc/rpc.proto | 8 + lnrpc/rpc.swagger.json | 146 +++ 4 files changed, 920 insertions(+), 713 deletions(-) diff --git a/lnrpc/routerrpc/router_backend.go b/lnrpc/routerrpc/router_backend.go index e8957afa9a..120211b1ed 100644 --- a/lnrpc/routerrpc/router_backend.go +++ b/lnrpc/routerrpc/router_backend.go @@ -844,35 +844,72 @@ func UnmarshalMPP(reqMPP *lnrpc.MPPRecord) (*record.MPP, error) { func (r *RouterBackend) MarshalHTLCAttempt( htlc channeldb.HTLCAttempt) (*lnrpc.HTLCAttempt, error) { - var ( - status lnrpc.HTLCAttempt_HTLCStatus - resolveTime int64 - ) + route, err := r.MarshallRoute(&htlc.Route) + if err != nil { + return nil, err + } + + rpcAttempt := &lnrpc.HTLCAttempt{ + AttemptTimeNs: MarshalTimeNano(htlc.AttemptTime), + Route: route, + } switch { case htlc.Settle != nil: - status = lnrpc.HTLCAttempt_SUCCEEDED - resolveTime = MarshalTimeNano(htlc.Settle.SettleTime) + rpcAttempt.Status = lnrpc.HTLCAttempt_SUCCEEDED + rpcAttempt.ResolveTimeNs = MarshalTimeNano( + htlc.Settle.SettleTime, + ) case htlc.Failure != nil: - status = lnrpc.HTLCAttempt_FAILED - resolveTime = MarshalTimeNano(htlc.Failure.FailTime) + rpcAttempt.Status = lnrpc.HTLCAttempt_FAILED + rpcAttempt.ResolveTimeNs = MarshalTimeNano( + htlc.Failure.FailTime, + ) + var err error + rpcAttempt.Failure, err = marshallHtlcFailure(htlc.Failure) + if err != nil { + return nil, err + } default: - status = lnrpc.HTLCAttempt_IN_FLIGHT + rpcAttempt.Status = lnrpc.HTLCAttempt_IN_FLIGHT } - route, err := r.MarshallRoute(&htlc.Route) - if err != nil { - return nil, err + return rpcAttempt, nil +} + +// marshallHtlcFailure marshalls htlc fail info from the database to its rpc +// representation. +func marshallHtlcFailure(failure *channeldb.HTLCFailInfo) (*lnrpc.Failure, + error) { + + rpcFailure := &lnrpc.Failure{ + FailureSourceIndex: failure.FailureSourceIndex, } - return &lnrpc.HTLCAttempt{ - Status: status, - Route: route, - AttemptTimeNs: MarshalTimeNano(htlc.AttemptTime), - ResolveTimeNs: resolveTime, - }, nil + switch failure.Reason { + + case channeldb.HTLCFailUnknown: + rpcFailure.Code = lnrpc.Failure_UNKNOWN_FAILURE + + case channeldb.HTLCFailUnreadable: + rpcFailure.Code = lnrpc.Failure_UNREADABLE_FAILURE + + case channeldb.HTLCFailInternal: + rpcFailure.Code = lnrpc.Failure_INTERNAL_FAILURE + + case channeldb.HTLCFailMessage: + err := marshallWireError(failure.Message, rpcFailure) + if err != nil { + return nil, err + } + + default: + return nil, errors.New("unknown htlc failure reason") + } + + return rpcFailure, nil } // MarshalTimeNano converts a time.Time into its nanosecond representation. If diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index 0da66bfdfe..905f465a5e 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -440,6 +440,9 @@ const ( Failure_EXPIRY_TOO_FAR Failure_FailureCode = 22 Failure_MPP_TIMEOUT Failure_FailureCode = 23 //* + //An internal error occurred. + Failure_INTERNAL_FAILURE Failure_FailureCode = 997 + //* //The error source is known, but the failure itself couldn't be decoded. Failure_UNKNOWN_FAILURE Failure_FailureCode = 998 //* @@ -473,6 +476,7 @@ var Failure_FailureCode_name = map[int32]string{ 21: "PERMANENT_CHANNEL_FAILURE", 22: "EXPIRY_TOO_FAR", 23: "MPP_TIMEOUT", + 997: "INTERNAL_FAILURE", 998: "UNKNOWN_FAILURE", 999: "UNREADABLE_FAILURE", } @@ -502,6 +506,7 @@ var Failure_FailureCode_value = map[string]int32{ "PERMANENT_CHANNEL_FAILURE": 21, "EXPIRY_TOO_FAR": 22, "MPP_TIMEOUT": 23, + "INTERNAL_FAILURE": 997, "UNKNOWN_FAILURE": 998, "UNREADABLE_FAILURE": 999, } @@ -8843,7 +8848,9 @@ type HTLCAttempt struct { //* //The time in UNIX nanoseconds at which this HTLC was settled or failed. //This value will not be set if the HTLC is still IN_FLIGHT. - ResolveTimeNs int64 `protobuf:"varint,4,opt,name=resolve_time_ns,json=resolveTimeNs,proto3" json:"resolve_time_ns,omitempty"` + ResolveTimeNs int64 `protobuf:"varint,4,opt,name=resolve_time_ns,json=resolveTimeNs,proto3" json:"resolve_time_ns,omitempty"` + // Detailed htlc failure info. + Failure *Failure `protobuf:"bytes,5,opt,name=failure,proto3" json:"failure,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -8902,6 +8909,13 @@ func (m *HTLCAttempt) GetResolveTimeNs() int64 { return 0 } +func (m *HTLCAttempt) GetFailure() *Failure { + if m != nil { + return m.Failure + } + return nil +} + type ListPaymentsRequest struct { //* //If true, then return payments that have not yet fully completed. This means @@ -11034,700 +11048,702 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 11084 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x6b, 0x8f, 0x1b, 0x57, - 0x96, 0x98, 0xf8, 0x6a, 0x92, 0x87, 0x8f, 0x66, 0xdf, 0x7e, 0x51, 0x2d, 0xc9, 0x92, 0xcb, 0x1e, - 0x4b, 0x96, 0x6d, 0x49, 0xd6, 0xf8, 0xb5, 0x76, 0x32, 0xbb, 0xec, 0x6e, 0xb6, 0x9a, 0xa3, 0x7e, - 0xb9, 0xc8, 0xb6, 0xc7, 0x33, 0xd9, 0xd4, 0x54, 0x93, 0xb7, 0xbb, 0x6b, 0x45, 0x56, 0xd1, 0x55, - 0xc5, 0x7e, 0x8c, 0xe1, 0x7c, 0xc8, 0x63, 0x11, 0x24, 0x41, 0x80, 0x45, 0xb2, 0x01, 0xb2, 0xc9, - 0x22, 0x41, 0x82, 0x20, 0x08, 0x12, 0x2c, 0x36, 0x98, 0x0d, 0x90, 0x0f, 0xc9, 0xe7, 0xfd, 0x92, - 0x60, 0x3f, 0x6c, 0xf2, 0x25, 0x18, 0x2c, 0xb0, 0xc8, 0x62, 0xf2, 0x75, 0x7f, 0x41, 0x10, 0xdc, - 0x73, 0xee, 0xad, 0xba, 0x45, 0x56, 0x4b, 0xb2, 0x67, 0x32, 0x5f, 0xa4, 0xae, 0x73, 0xce, 0x7d, - 0x9f, 0x7b, 0xee, 0x79, 0xdd, 0x4b, 0x28, 0xfb, 0xe3, 0xfe, 0x83, 0xb1, 0xef, 0x85, 0x1e, 0x2b, - 0x0c, 0x5d, 0x7f, 0xdc, 0x5f, 0xbb, 0x79, 0xe2, 0x79, 0x27, 0x43, 0xfe, 0xd0, 0x1e, 0x3b, 0x0f, - 0x6d, 0xd7, 0xf5, 0x42, 0x3b, 0x74, 0x3c, 0x37, 0x20, 0x22, 0xe3, 0xc7, 0x50, 0x7f, 0xc2, 0xdd, - 0x2e, 0xe7, 0x03, 0x93, 0x7f, 0x39, 0xe1, 0x41, 0xc8, 0xde, 0x82, 0x05, 0x9b, 0xff, 0x84, 0xf3, - 0x81, 0x35, 0xb6, 0x83, 0x60, 0x7c, 0xea, 0xdb, 0x01, 0x6f, 0x66, 0xee, 0x64, 0xee, 0x55, 0xcd, - 0x06, 0x21, 0x0e, 0x22, 0x38, 0x7b, 0x15, 0xaa, 0x81, 0x20, 0xe5, 0x6e, 0xe8, 0x7b, 0xe3, 0xcb, - 0x66, 0x16, 0xe9, 0x2a, 0x02, 0xd6, 0x26, 0x90, 0x31, 0x84, 0xf9, 0xa8, 0x85, 0x60, 0xec, 0xb9, - 0x01, 0x67, 0x8f, 0x60, 0xa9, 0xef, 0x8c, 0x4f, 0xb9, 0x6f, 0x61, 0xe1, 0x91, 0xcb, 0x47, 0x9e, - 0xeb, 0xf4, 0x9b, 0x99, 0x3b, 0xb9, 0x7b, 0x65, 0x93, 0x11, 0x4e, 0x94, 0xd8, 0x95, 0x18, 0x76, - 0x17, 0xe6, 0xb9, 0x4b, 0x70, 0x3e, 0xc0, 0x52, 0xb2, 0xa9, 0x7a, 0x0c, 0x16, 0x05, 0x8c, 0xbf, - 0x9b, 0x85, 0x85, 0x8e, 0xeb, 0x84, 0x9f, 0xdb, 0xc3, 0x21, 0x0f, 0xd5, 0x98, 0xee, 0xc2, 0xfc, - 0x39, 0x02, 0x70, 0x4c, 0xe7, 0x9e, 0x3f, 0x90, 0x23, 0xaa, 0x13, 0xf8, 0x40, 0x42, 0xaf, 0xec, - 0x59, 0xf6, 0xca, 0x9e, 0xa5, 0x4e, 0x57, 0xee, 0x8a, 0xe9, 0xba, 0x0b, 0xf3, 0x3e, 0xef, 0x7b, - 0x67, 0xdc, 0xbf, 0xb4, 0xce, 0x1d, 0x77, 0xe0, 0x9d, 0x37, 0xf3, 0x77, 0x32, 0xf7, 0x0a, 0x66, - 0x5d, 0x81, 0x3f, 0x47, 0x28, 0x5b, 0x87, 0xf9, 0xfe, 0xa9, 0xed, 0xba, 0x7c, 0x68, 0x1d, 0xd9, - 0xfd, 0x67, 0x93, 0x71, 0xd0, 0x2c, 0xdc, 0xc9, 0xdc, 0xab, 0x3c, 0xbe, 0xfe, 0x00, 0x57, 0xf5, - 0xc1, 0xc6, 0xa9, 0xed, 0xae, 0x23, 0xa6, 0xeb, 0xda, 0xe3, 0xe0, 0xd4, 0x0b, 0xcd, 0xba, 0x2c, - 0x41, 0xe0, 0xc0, 0x58, 0x02, 0xa6, 0xcf, 0x04, 0xcd, 0xbd, 0xf1, 0xef, 0x33, 0xb0, 0x78, 0xe8, - 0x0e, 0xbd, 0xfe, 0xb3, 0x6f, 0x39, 0x45, 0x29, 0x63, 0xc8, 0xbe, 0xec, 0x18, 0x72, 0xdf, 0x74, - 0x0c, 0x2b, 0xb0, 0x94, 0xec, 0xac, 0x1c, 0x05, 0x87, 0x65, 0x51, 0xfa, 0x84, 0xab, 0x6e, 0xa9, - 0x61, 0xbc, 0x09, 0x8d, 0xfe, 0xc4, 0xf7, 0xb9, 0x3b, 0x33, 0x8e, 0x79, 0x09, 0x8f, 0x06, 0xf2, - 0x2a, 0x54, 0x5d, 0x7e, 0x1e, 0x93, 0x49, 0xde, 0x75, 0xf9, 0xb9, 0x22, 0x31, 0x9a, 0xb0, 0x32, - 0xdd, 0x8c, 0xec, 0xc0, 0xcf, 0x33, 0x90, 0x3f, 0x0c, 0x2f, 0x3c, 0xf6, 0x3e, 0x54, 0xed, 0xc1, - 0xc0, 0xe7, 0x41, 0x60, 0x85, 0x97, 0x63, 0xda, 0x29, 0xf5, 0xc7, 0x4c, 0x0e, 0xb1, 0x45, 0xa8, - 0xde, 0xe5, 0x98, 0x9b, 0x15, 0x3b, 0xfe, 0x60, 0x4d, 0x28, 0xca, 0x4f, 0x6c, 0xb7, 0x6c, 0xaa, - 0x4f, 0x76, 0x0b, 0xc0, 0x1e, 0x79, 0x13, 0x37, 0xb4, 0x02, 0x3b, 0xc4, 0x19, 0xcb, 0x99, 0x65, - 0x82, 0x74, 0xed, 0x90, 0xdd, 0x80, 0xf2, 0xf8, 0x99, 0x15, 0xf4, 0x7d, 0x67, 0x1c, 0x22, 0xf3, - 0x94, 0xcd, 0xd2, 0xf8, 0x59, 0x17, 0xbf, 0xd9, 0x5b, 0x50, 0xf2, 0x26, 0xe1, 0xd8, 0x73, 0xdc, - 0x50, 0xf2, 0xcb, 0xbc, 0xec, 0xc8, 0xfe, 0x24, 0x3c, 0x10, 0x60, 0x33, 0x22, 0x60, 0xaf, 0x43, - 0xad, 0xef, 0xb9, 0xc7, 0x8e, 0x3f, 0x22, 0x89, 0xd0, 0x9c, 0xc3, 0xb6, 0x92, 0x40, 0xe3, 0x0f, - 0xb3, 0x50, 0xe9, 0xf9, 0xb6, 0x1b, 0xd8, 0x7d, 0x01, 0x60, 0xab, 0x50, 0x0c, 0x2f, 0xac, 0x53, - 0x3b, 0x38, 0xc5, 0xa1, 0x96, 0xcd, 0xb9, 0xf0, 0x62, 0xdb, 0x0e, 0x4e, 0xd9, 0x0a, 0xcc, 0x51, - 0x2f, 0x71, 0x40, 0x39, 0x53, 0x7e, 0x89, 0x0d, 0xe2, 0x4e, 0x46, 0x56, 0xb2, 0xa9, 0x1c, 0x72, - 0x4c, 0xc3, 0x9d, 0x8c, 0x36, 0x74, 0xb8, 0x18, 0xfc, 0x91, 0x58, 0x6e, 0x6a, 0x80, 0x86, 0x57, - 0x46, 0x08, 0xb6, 0xf1, 0x2a, 0x54, 0x25, 0x9a, 0x3b, 0x27, 0xa7, 0x34, 0xc6, 0x82, 0x59, 0x21, - 0x02, 0x04, 0x89, 0x1a, 0x42, 0x67, 0xc4, 0xad, 0x20, 0xb4, 0x47, 0x63, 0x39, 0xa4, 0xb2, 0x80, - 0x74, 0x05, 0x00, 0xd1, 0x5e, 0x68, 0x0f, 0xad, 0x63, 0xce, 0x83, 0x66, 0x51, 0xa2, 0x05, 0x64, - 0x8b, 0xf3, 0x80, 0x7d, 0x07, 0xea, 0x03, 0x1e, 0x84, 0x96, 0x5c, 0x0c, 0x1e, 0x34, 0x4b, 0xb8, - 0xf3, 0x6b, 0x02, 0xda, 0x52, 0x40, 0x76, 0x13, 0xc0, 0xb7, 0xcf, 0x2d, 0x31, 0x11, 0xfc, 0xa2, - 0x59, 0xa6, 0x55, 0xf0, 0xed, 0xf3, 0xde, 0xc5, 0x36, 0xbf, 0x10, 0x5c, 0xf3, 0x84, 0x87, 0xda, - 0xa4, 0x05, 0x92, 0x3b, 0x8d, 0x1d, 0x60, 0x1a, 0x78, 0x93, 0x87, 0xb6, 0x33, 0x0c, 0xd8, 0x07, - 0x50, 0x0d, 0x35, 0x62, 0x14, 0x83, 0x95, 0x88, 0x85, 0xb4, 0x02, 0x66, 0x82, 0xce, 0x38, 0x85, - 0xd2, 0x16, 0xe7, 0x3b, 0xce, 0xc8, 0x09, 0xd9, 0x0a, 0x14, 0x8e, 0x9d, 0x0b, 0x4e, 0xcc, 0x9e, - 0xdb, 0xbe, 0x66, 0xd2, 0x27, 0xbb, 0x0d, 0x80, 0x7f, 0x58, 0xa3, 0x88, 0x9b, 0xb6, 0xaf, 0x99, - 0x65, 0x84, 0xed, 0x06, 0x76, 0xc8, 0xd6, 0xa0, 0x38, 0xe6, 0x7e, 0x9f, 0xab, 0x75, 0xdb, 0xbe, - 0x66, 0x2a, 0xc0, 0x7a, 0x11, 0x0a, 0x43, 0x51, 0xbb, 0xf1, 0xc7, 0x05, 0xa8, 0x74, 0xb9, 0x1b, - 0xed, 0x32, 0x06, 0x79, 0x31, 0x21, 0x72, 0x67, 0xe1, 0xdf, 0xec, 0x35, 0xa8, 0xe0, 0xd4, 0x05, - 0xa1, 0xef, 0xb8, 0x27, 0xc4, 0xd5, 0xeb, 0xd9, 0x66, 0xc6, 0x04, 0x01, 0xee, 0x22, 0x94, 0x35, - 0x20, 0x67, 0x8f, 0x14, 0x57, 0x8b, 0x3f, 0xd9, 0x75, 0x28, 0xd9, 0xa3, 0x90, 0xba, 0x57, 0x45, - 0x70, 0xd1, 0x1e, 0x85, 0xd8, 0xb5, 0x57, 0xa1, 0x3a, 0xb6, 0x2f, 0x47, 0x62, 0x2f, 0x47, 0xec, - 0x50, 0x35, 0x2b, 0x12, 0x86, 0x0c, 0xf1, 0x18, 0x16, 0x75, 0x12, 0xd5, 0x78, 0x21, 0x6a, 0x7c, - 0x41, 0xa3, 0x96, 0x7d, 0xb8, 0x0b, 0xf3, 0xaa, 0x8c, 0x4f, 0xe3, 0x41, 0x36, 0x29, 0x9b, 0x75, - 0x09, 0x56, 0xa3, 0xbc, 0x07, 0x8d, 0x63, 0xc7, 0xb5, 0x87, 0x56, 0x7f, 0x18, 0x9e, 0x59, 0x03, - 0x3e, 0x0c, 0x6d, 0xe4, 0x98, 0x82, 0x59, 0x47, 0xf8, 0xc6, 0x30, 0x3c, 0xdb, 0x14, 0x50, 0xf6, - 0x36, 0x94, 0x8f, 0x39, 0xb7, 0x70, 0xb2, 0x9a, 0xa5, 0xc4, 0xc6, 0x53, 0x2b, 0x64, 0x96, 0x8e, - 0xd5, 0x5a, 0xbd, 0x0d, 0x0d, 0x6f, 0x12, 0x9e, 0x78, 0x8e, 0x7b, 0x62, 0x09, 0x79, 0x67, 0x39, - 0x03, 0xe4, 0xa1, 0xfc, 0x7a, 0xf6, 0x51, 0xc6, 0xac, 0x2b, 0x9c, 0x90, 0x3c, 0x9d, 0x01, 0x7b, - 0x03, 0xe6, 0x87, 0x76, 0x10, 0x5a, 0xa7, 0xde, 0xd8, 0x1a, 0x4f, 0x8e, 0x9e, 0xf1, 0xcb, 0x66, - 0x0d, 0x27, 0xa2, 0x26, 0xc0, 0xdb, 0xde, 0xf8, 0x00, 0x81, 0x82, 0xb3, 0xb1, 0x9f, 0xd4, 0x09, - 0xb8, 0x93, 0xb9, 0x57, 0x33, 0xcb, 0x02, 0x42, 0x8d, 0x7e, 0x01, 0x8b, 0xb8, 0x3c, 0xfd, 0x49, - 0x10, 0x7a, 0x23, 0x4b, 0xc8, 0x6a, 0x7f, 0x10, 0x34, 0x2b, 0xc8, 0x6b, 0x6f, 0xca, 0xce, 0x6a, - 0x6b, 0xfc, 0x60, 0x93, 0x07, 0xe1, 0x06, 0x12, 0x9b, 0x44, 0x2b, 0x0e, 0xf4, 0x4b, 0x73, 0x61, - 0x30, 0x0d, 0x67, 0x6f, 0x03, 0xb3, 0x87, 0x43, 0xef, 0xdc, 0x0a, 0xf8, 0xf0, 0xd8, 0x92, 0x93, - 0xd8, 0xac, 0xdf, 0xc9, 0xdc, 0x2b, 0x99, 0x0d, 0xc4, 0x74, 0xf9, 0xf0, 0xf8, 0x80, 0xe0, 0xec, - 0x03, 0xc0, 0xcd, 0x64, 0x1d, 0x73, 0x3b, 0x9c, 0xf8, 0x3c, 0x68, 0xce, 0xdf, 0xc9, 0xdd, 0xab, - 0x3f, 0x5e, 0x88, 0xe6, 0x0b, 0xc1, 0xeb, 0x4e, 0x68, 0x56, 0x05, 0x9d, 0xfc, 0x0e, 0xd6, 0x36, - 0x61, 0x25, 0xbd, 0x4b, 0x82, 0xa9, 0xc4, 0xac, 0x08, 0x66, 0xcc, 0x9b, 0xe2, 0x4f, 0xb6, 0x04, - 0x85, 0x33, 0x7b, 0x38, 0xe1, 0x52, 0xa6, 0xd3, 0xc7, 0xc7, 0xd9, 0x8f, 0x32, 0xc6, 0x1f, 0x65, - 0xa0, 0x4a, 0xa3, 0x94, 0xba, 0xc8, 0x6b, 0x50, 0x53, 0xdc, 0xc0, 0x7d, 0xdf, 0xf3, 0xa5, 0x54, - 0x53, 0x9c, 0xd7, 0x16, 0x30, 0x71, 0xaa, 0x28, 0xa2, 0xb1, 0xcf, 0x9d, 0x91, 0x7d, 0xa2, 0xaa, - 0x56, 0xac, 0x74, 0x20, 0xc1, 0xec, 0xdd, 0xb8, 0x3e, 0xdf, 0x9b, 0x84, 0x5c, 0x9e, 0x79, 0x55, - 0x39, 0x3c, 0x53, 0xc0, 0xa2, 0xda, 0xf1, 0xeb, 0x25, 0xf8, 0xdc, 0xf8, 0xdd, 0x0c, 0x30, 0xd1, - 0xed, 0x9e, 0x47, 0x15, 0x48, 0x0e, 0x9d, 0x2e, 0x99, 0x79, 0xe9, 0x1d, 0x92, 0x7d, 0xde, 0x0e, - 0x31, 0xa0, 0x40, 0x7d, 0xcf, 0xa7, 0xf4, 0x9d, 0x50, 0xdf, 0xcf, 0x97, 0x72, 0x8d, 0xbc, 0xf1, - 0xbf, 0x72, 0xb0, 0xb4, 0x41, 0x47, 0x76, 0xab, 0xdf, 0xe7, 0xe3, 0x68, 0xef, 0xdc, 0x86, 0x8a, - 0xeb, 0x0d, 0xb8, 0xe2, 0x58, 0xea, 0x18, 0x08, 0x90, 0xc6, 0xae, 0xa7, 0xb6, 0xe3, 0x52, 0xc7, - 0x69, 0x32, 0xcb, 0x08, 0xc1, 0x6e, 0xbf, 0x01, 0xf3, 0x63, 0xee, 0x0e, 0xf4, 0x2d, 0x42, 0x4a, - 0x55, 0x4d, 0x82, 0xe5, 0xee, 0xb8, 0x0d, 0x95, 0xe3, 0x09, 0xd1, 0x09, 0xc1, 0x92, 0x47, 0x1e, - 0x00, 0x09, 0x6a, 0x91, 0x7c, 0x19, 0x4f, 0x82, 0x53, 0xc4, 0x16, 0x10, 0x5b, 0x14, 0xdf, 0x02, - 0x75, 0x0b, 0x60, 0x30, 0x09, 0x42, 0xb9, 0x63, 0xe6, 0x10, 0x59, 0x16, 0x10, 0xda, 0x31, 0xef, - 0xc0, 0xe2, 0xc8, 0xbe, 0xb0, 0x90, 0x77, 0x2c, 0xc7, 0xb5, 0x8e, 0x87, 0x78, 0xe6, 0x14, 0x91, - 0xae, 0x31, 0xb2, 0x2f, 0x3e, 0x13, 0x98, 0x8e, 0xbb, 0x85, 0x70, 0x21, 0x56, 0x94, 0xba, 0xe3, - 0xf3, 0x80, 0xfb, 0x67, 0x1c, 0x25, 0x41, 0x3e, 0xd2, 0x69, 0x4c, 0x82, 0x8a, 0x1e, 0x8d, 0xc4, - 0xb8, 0xc3, 0x61, 0x9f, 0xb6, 0xbd, 0x59, 0x1c, 0x39, 0xee, 0x76, 0x38, 0xec, 0x8b, 0x73, 0x45, - 0xc8, 0x91, 0x31, 0xf7, 0xad, 0x67, 0xe7, 0xb8, 0x87, 0xf3, 0x28, 0x37, 0x0e, 0xb8, 0xff, 0xf4, - 0x5c, 0x1c, 0xfd, 0xfd, 0x00, 0x05, 0x91, 0x7d, 0xd9, 0xac, 0xe0, 0x06, 0x2f, 0xf5, 0x03, 0x21, - 0x82, 0xec, 0x4b, 0xb1, 0x09, 0x45, 0x6f, 0x6d, 0x5c, 0x05, 0x3e, 0xc0, 0xea, 0x03, 0x94, 0xa8, - 0x35, 0xec, 0x6c, 0x4b, 0x22, 0x44, 0x3b, 0x81, 0xe0, 0x7a, 0xd5, 0xd9, 0xe3, 0xa1, 0x7d, 0x12, - 0xa0, 0x48, 0xa9, 0x99, 0x55, 0x09, 0xdc, 0x12, 0x30, 0xe3, 0x73, 0x52, 0xb2, 0xb4, 0xb5, 0x95, - 0x7b, 0x46, 0x1c, 0xf5, 0x08, 0xc1, 0x75, 0x2d, 0x99, 0xf2, 0x2b, 0x6d, 0xd1, 0xb2, 0x29, 0x8b, - 0x66, 0xfc, 0x7e, 0x06, 0xaa, 0xb2, 0x66, 0x54, 0x4a, 0xd8, 0x03, 0x60, 0x6a, 0x15, 0xc3, 0x0b, - 0x67, 0x60, 0x1d, 0x5d, 0x86, 0x3c, 0x20, 0xa6, 0xd9, 0xbe, 0x66, 0x36, 0x24, 0xae, 0x77, 0xe1, - 0x0c, 0xd6, 0x05, 0x86, 0xdd, 0x87, 0x46, 0x82, 0x3e, 0x08, 0x7d, 0xe2, 0xe8, 0xed, 0x6b, 0x66, - 0x5d, 0xa3, 0xee, 0x86, 0xbe, 0xd8, 0x23, 0x42, 0xe5, 0x99, 0x84, 0x96, 0xe3, 0x0e, 0xf8, 0x05, - 0xb2, 0x51, 0xcd, 0xac, 0x10, 0xac, 0x23, 0x40, 0xeb, 0x75, 0xa8, 0xea, 0xd5, 0x19, 0x27, 0x50, - 0x52, 0xfa, 0x12, 0x2a, 0x0c, 0x53, 0x5d, 0x32, 0xcb, 0x61, 0xd4, 0x93, 0xeb, 0x50, 0x4a, 0xf6, - 0xc0, 0x2c, 0x86, 0x2f, 0xdd, 0xb0, 0xf1, 0x3d, 0x68, 0xec, 0x08, 0xe6, 0x71, 0x05, 0xb3, 0x4a, - 0xfd, 0x6f, 0x05, 0xe6, 0xb4, 0x4d, 0x53, 0x36, 0xe5, 0x97, 0x38, 0x73, 0x4f, 0xbd, 0x20, 0x94, - 0xad, 0xe0, 0xdf, 0xc6, 0x1f, 0x67, 0x80, 0xb5, 0x83, 0xd0, 0x19, 0xd9, 0x21, 0xdf, 0xe2, 0x91, - 0x58, 0xd8, 0x87, 0xaa, 0xa8, 0xad, 0xe7, 0xb5, 0x48, 0x21, 0x23, 0x85, 0xe2, 0x2d, 0xb9, 0x8d, - 0x67, 0x0b, 0x3c, 0xd0, 0xa9, 0x49, 0xcc, 0x27, 0x2a, 0x10, 0xbb, 0x2c, 0xb4, 0xfd, 0x13, 0x1e, - 0xa2, 0x1a, 0x27, 0xf5, 0x7d, 0x20, 0x90, 0x50, 0xe0, 0xd6, 0x7e, 0x1d, 0x16, 0x66, 0xea, 0xd0, - 0xe5, 0x72, 0x39, 0x45, 0x2e, 0xe7, 0x74, 0xb9, 0x6c, 0xc1, 0x62, 0xa2, 0x5f, 0x92, 0xd3, 0x56, - 0xa1, 0x28, 0x36, 0x84, 0x50, 0x0e, 0x32, 0xa4, 0x55, 0x1e, 0x73, 0x2e, 0xd4, 0xe0, 0x87, 0xb0, - 0x74, 0xcc, 0xb9, 0x6f, 0x87, 0x88, 0xc4, 0x1d, 0x23, 0x56, 0x48, 0x56, 0xbc, 0x20, 0x71, 0x5d, - 0x3b, 0x3c, 0xe0, 0xbe, 0x58, 0x29, 0xe3, 0x7f, 0x67, 0x60, 0x5e, 0x48, 0xd0, 0x5d, 0xdb, 0xbd, - 0x54, 0xf3, 0xb4, 0x93, 0x3a, 0x4f, 0xf7, 0xb4, 0xc3, 0x50, 0xa3, 0xfe, 0xa6, 0x93, 0x94, 0x9b, - 0x9e, 0x24, 0x76, 0x07, 0xaa, 0x89, 0xbe, 0x16, 0xb0, 0xaf, 0x10, 0x44, 0x9d, 0xfc, 0xc5, 0xa7, - 0xf1, 0x0d, 0x68, 0xc4, 0xdd, 0x96, 0x73, 0xc8, 0x20, 0x2f, 0x58, 0x52, 0x56, 0x80, 0x7f, 0x1b, - 0xff, 0x3c, 0x43, 0x84, 0x1b, 0x9e, 0x13, 0x69, 0xa7, 0x82, 0x50, 0xe8, 0xbd, 0x8a, 0x50, 0xfc, - 0x7d, 0xa5, 0x56, 0xff, 0x8b, 0x0f, 0x56, 0x6c, 0x9d, 0x80, 0xbb, 0x03, 0xcb, 0x1e, 0x0e, 0x51, - 0xf8, 0x96, 0xcc, 0xa2, 0xf8, 0x6e, 0x0d, 0x87, 0xc6, 0x5d, 0x58, 0xd0, 0x7a, 0xf7, 0x9c, 0x71, - 0xec, 0x01, 0xdb, 0x71, 0x82, 0xf0, 0xd0, 0x0d, 0xc6, 0x9a, 0xe2, 0x76, 0x03, 0xca, 0x42, 0xc2, - 0x8a, 0x9e, 0xd1, 0x96, 0x2d, 0x98, 0x42, 0xe4, 0x8a, 0x7e, 0x05, 0x88, 0xb4, 0x2f, 0x24, 0x32, - 0x2b, 0x91, 0xf6, 0x05, 0x22, 0x8d, 0x8f, 0x60, 0x31, 0x51, 0x9f, 0x6c, 0xfa, 0x55, 0x28, 0x4c, - 0xc2, 0x0b, 0x4f, 0xa9, 0xe6, 0x15, 0xc9, 0x21, 0xc2, 0x00, 0x34, 0x09, 0x63, 0x7c, 0x02, 0x0b, - 0x7b, 0xfc, 0x5c, 0x6e, 0x62, 0xd5, 0x91, 0x37, 0x20, 0xff, 0x02, 0xa3, 0x10, 0xf1, 0xc6, 0x03, - 0x60, 0x7a, 0x61, 0xd9, 0xaa, 0x66, 0x23, 0x66, 0x12, 0x36, 0xa2, 0xf1, 0x06, 0xb0, 0xae, 0x73, - 0xe2, 0xee, 0xf2, 0x20, 0xb0, 0x4f, 0xa2, 0x6d, 0xdf, 0x80, 0xdc, 0x28, 0x38, 0x91, 0x32, 0x4a, - 0xfc, 0x69, 0x7c, 0x17, 0x16, 0x13, 0x74, 0xb2, 0xe2, 0x9b, 0x50, 0x0e, 0x9c, 0x13, 0x17, 0x15, - 0x2b, 0x59, 0x75, 0x0c, 0x30, 0xb6, 0x60, 0xe9, 0x33, 0xee, 0x3b, 0xc7, 0x97, 0x2f, 0xaa, 0x3e, - 0x59, 0x4f, 0x76, 0xba, 0x9e, 0x36, 0x2c, 0x4f, 0xd5, 0x23, 0x9b, 0x27, 0xf6, 0x95, 0x2b, 0x59, - 0x32, 0xe9, 0x43, 0x93, 0x7b, 0x59, 0x5d, 0xee, 0x19, 0x87, 0xc0, 0x36, 0x3c, 0xd7, 0xe5, 0xfd, - 0xf0, 0x80, 0x73, 0x3f, 0xf6, 0x52, 0xc5, 0xbc, 0x5a, 0x79, 0xbc, 0x2a, 0x67, 0x76, 0x5a, 0x98, - 0x4a, 0x26, 0x66, 0x90, 0x1f, 0x73, 0x7f, 0x84, 0x15, 0x97, 0x4c, 0xfc, 0xdb, 0x58, 0x86, 0xc5, - 0x44, 0xb5, 0xd2, 0xae, 0x7f, 0x04, 0xcb, 0x9b, 0x4e, 0xd0, 0x9f, 0x6d, 0x70, 0x15, 0x8a, 0xe3, - 0xc9, 0x91, 0x95, 0x94, 0xcb, 0x4f, 0xf9, 0xa5, 0xb0, 0xf6, 0xa6, 0x4b, 0xc8, 0xba, 0xfe, 0x76, - 0x06, 0xf2, 0xdb, 0xbd, 0x9d, 0x0d, 0xb6, 0x06, 0x25, 0xc7, 0xed, 0x7b, 0x23, 0xa1, 0x78, 0xd1, - 0x98, 0xa3, 0xef, 0x2b, 0x37, 0xd8, 0x0d, 0x28, 0xa3, 0xbe, 0x26, 0x4c, 0x5b, 0xa9, 0xfa, 0x94, - 0x04, 0x60, 0xc7, 0xeb, 0x3f, 0x13, 0x36, 0x35, 0xbf, 0x18, 0x3b, 0x3e, 0x5a, 0xcd, 0xca, 0x18, - 0xce, 0xd3, 0x59, 0x1f, 0x23, 0xc8, 0x22, 0x36, 0xfe, 0x43, 0x11, 0x8a, 0xf2, 0xb4, 0xa5, 0x93, - 0x3b, 0x74, 0xce, 0x78, 0x7c, 0x72, 0x8b, 0x2f, 0xa1, 0x0f, 0xf8, 0x7c, 0xe4, 0x85, 0x91, 0xc2, - 0x46, 0x6b, 0x50, 0x25, 0xa0, 0x54, 0xd9, 0x34, 0xa5, 0x81, 0x5c, 0x0c, 0x39, 0x22, 0xea, 0xeb, - 0x47, 0xf9, 0x0d, 0x28, 0xaa, 0xb3, 0x3f, 0x1f, 0xd9, 0x34, 0x73, 0x7d, 0xd2, 0xd6, 0xd6, 0xa0, - 0xd4, 0xb7, 0xc7, 0x76, 0xdf, 0x09, 0x2f, 0xa5, 0x40, 0x88, 0xbe, 0x45, 0xed, 0x43, 0xaf, 0x6f, - 0x0f, 0xad, 0x23, 0x7b, 0x68, 0xbb, 0x7d, 0x2e, 0x6d, 0xf7, 0x2a, 0x02, 0xd7, 0x09, 0x26, 0xec, - 0x73, 0xd9, 0x4f, 0x45, 0x45, 0x26, 0xbc, 0xec, 0xbd, 0x22, 0x13, 0xca, 0xa5, 0x37, 0x1a, 0x39, - 0xc2, 0xca, 0x20, 0x35, 0x2c, 0x67, 0x96, 0x09, 0xb2, 0xc5, 0x71, 0xb4, 0x12, 0x7d, 0x4e, 0x53, - 0x57, 0xa6, 0xa6, 0x08, 0xf8, 0x39, 0x39, 0x12, 0x66, 0x75, 0xb1, 0x9c, 0xa6, 0x8b, 0xbd, 0x05, - 0x0b, 0x13, 0x37, 0xe0, 0x61, 0x38, 0xe4, 0x83, 0xa8, 0x2f, 0x15, 0x24, 0x6a, 0x44, 0x08, 0xd5, - 0x9d, 0x07, 0xb0, 0x48, 0x4e, 0x87, 0xc0, 0x0e, 0xbd, 0xe0, 0xd4, 0x09, 0xac, 0x40, 0x58, 0x48, - 0x64, 0xee, 0x2e, 0x20, 0xaa, 0x2b, 0x31, 0x5d, 0x32, 0x91, 0x56, 0xa7, 0xe8, 0x7d, 0xde, 0xe7, - 0xce, 0x19, 0x1f, 0xa0, 0x9e, 0x96, 0x33, 0x97, 0x13, 0x65, 0x4c, 0x89, 0x44, 0xa5, 0x7b, 0x32, - 0xb2, 0x26, 0xe3, 0x81, 0x2d, 0x94, 0x95, 0x3a, 0x29, 0xc3, 0xee, 0x64, 0x74, 0x48, 0x10, 0xf6, - 0x08, 0x94, 0x26, 0x26, 0xf5, 0xc3, 0xf9, 0x84, 0x3c, 0x13, 0xcc, 0x6a, 0x56, 0x25, 0x05, 0x29, - 0x8a, 0x09, 0x9d, 0xb3, 0x31, 0xa5, 0x73, 0x36, 0xa1, 0x38, 0xf6, 0x9d, 0x33, 0x3b, 0xe4, 0xcd, - 0x05, 0x12, 0xe0, 0xf2, 0x53, 0x48, 0x06, 0xc7, 0x75, 0x42, 0xc7, 0x0e, 0x3d, 0xbf, 0xc9, 0x10, - 0x17, 0x03, 0xd8, 0x7d, 0x58, 0x40, 0x1e, 0x09, 0x42, 0x3b, 0x9c, 0x04, 0x52, 0x03, 0x5d, 0x44, - 0x66, 0x42, 0x1d, 0xba, 0x8b, 0x70, 0x54, 0x42, 0xd9, 0x77, 0x61, 0x85, 0xd8, 0x02, 0x4b, 0x48, - 0xcd, 0x1a, 0x15, 0x82, 0x25, 0x9c, 0x8a, 0x45, 0xc4, 0x0a, 0xfe, 0x96, 0xfa, 0xb5, 0xd0, 0x0e, - 0xde, 0x87, 0x55, 0xc9, 0x26, 0x33, 0xa5, 0x96, 0xb1, 0xd4, 0x12, 0xa1, 0xa7, 0x8a, 0xdd, 0x87, - 0x05, 0xd1, 0x25, 0xa7, 0x6f, 0xc9, 0xd2, 0x62, 0x27, 0xac, 0x60, 0xef, 0xe7, 0x09, 0x61, 0x22, - 0xfc, 0x29, 0xbf, 0x14, 0xac, 0x3c, 0x74, 0x8e, 0x79, 0xe8, 0x8c, 0x78, 0x73, 0x95, 0x98, 0x43, - 0x7d, 0x8b, 0x5d, 0x36, 0x19, 0x23, 0xa6, 0x49, 0x7b, 0x9a, 0xbe, 0x90, 0xef, 0x86, 0x5e, 0xc0, - 0x95, 0x7b, 0xa9, 0x79, 0x5d, 0x6e, 0x20, 0x01, 0x94, 0x22, 0xcb, 0xf8, 0x69, 0x86, 0xce, 0x20, - 0xb9, 0x65, 0x03, 0xcd, 0xa2, 0xa2, 0xcd, 0x6a, 0x79, 0xee, 0xf0, 0x52, 0xee, 0x5f, 0x20, 0xd0, - 0xbe, 0x3b, 0xc4, 0x0d, 0xe4, 0xb8, 0x3a, 0x09, 0x89, 0xbb, 0xaa, 0x02, 0x22, 0xd1, 0x6d, 0xa8, - 0x8c, 0x27, 0x47, 0x43, 0xa7, 0x4f, 0x24, 0x39, 0xaa, 0x85, 0x40, 0x48, 0x20, 0x4c, 0x4a, 0x5a, - 0x44, 0xa2, 0xc8, 0x23, 0x45, 0x45, 0xc2, 0x90, 0x04, 0xc5, 0x29, 0xf7, 0x71, 0x07, 0x57, 0x4d, - 0xfc, 0xdb, 0x58, 0x87, 0xa5, 0x64, 0xa7, 0xa5, 0xac, 0xbf, 0x0f, 0x25, 0x29, 0x1e, 0x94, 0xaf, - 0xa1, 0xae, 0x79, 0x7f, 0x85, 0x55, 0x14, 0xe1, 0x8d, 0xdf, 0x9e, 0x83, 0x45, 0x09, 0xdd, 0x10, - 0x33, 0xd2, 0x9d, 0x8c, 0x46, 0xb6, 0x9f, 0x22, 0x77, 0x32, 0xcf, 0x97, 0x3b, 0xd9, 0x19, 0xb9, - 0x93, 0x34, 0x36, 0x49, 0x6c, 0x25, 0x8d, 0x4d, 0xb1, 0x04, 0xa4, 0xff, 0xeb, 0xae, 0xc7, 0x9a, - 0x04, 0xf7, 0xc8, 0xc5, 0x39, 0x23, 0x25, 0x0b, 0x29, 0x52, 0x52, 0x97, 0x71, 0x73, 0x53, 0x32, - 0xee, 0x55, 0xa0, 0xb5, 0x56, 0x22, 0xbb, 0x48, 0x26, 0x01, 0xc2, 0xa4, 0xff, 0xf2, 0x2e, 0xcc, - 0x4f, 0x8b, 0x15, 0x92, 0x5f, 0xf5, 0x14, 0xa1, 0xe2, 0x8c, 0x38, 0x1e, 0x10, 0x1a, 0x71, 0x59, - 0x0a, 0x15, 0x67, 0xc4, 0x77, 0x10, 0xa3, 0xe8, 0xdb, 0x00, 0xd4, 0x36, 0x6a, 0x24, 0x80, 0x1a, - 0xc9, 0x1b, 0xc9, 0xb5, 0xd0, 0x67, 0xfd, 0x81, 0xf8, 0x98, 0xf8, 0x1c, 0xb5, 0x94, 0x32, 0x96, - 0x44, 0xc7, 0xf5, 0x53, 0xa8, 0x7b, 0x63, 0xee, 0x5a, 0xf1, 0xf6, 0xae, 0x60, 0x55, 0xaf, 0x3f, - 0xa7, 0xaa, 0x8e, 0xa2, 0x35, 0x6b, 0xa2, 0x6c, 0xf4, 0xc9, 0x76, 0x69, 0xe2, 0xb9, 0x56, 0x5b, - 0xf5, 0x1b, 0xd4, 0x56, 0xc7, 0xc2, 0xd1, 0xb7, 0xf1, 0xf7, 0x32, 0x50, 0xd1, 0xba, 0xcd, 0x96, - 0x61, 0x61, 0x63, 0x7f, 0xff, 0xa0, 0x6d, 0xb6, 0x7a, 0x9d, 0xcf, 0xda, 0xd6, 0xc6, 0xce, 0x7e, - 0xb7, 0xdd, 0xb8, 0x26, 0xc0, 0x3b, 0xfb, 0x1b, 0xad, 0x1d, 0x6b, 0x6b, 0xdf, 0xdc, 0x50, 0xe0, - 0x0c, 0x5b, 0x01, 0x66, 0xb6, 0x77, 0xf7, 0x7b, 0xed, 0x04, 0x3c, 0xcb, 0x1a, 0x50, 0x5d, 0x37, - 0xdb, 0xad, 0x8d, 0x6d, 0x09, 0xc9, 0xb1, 0x25, 0x68, 0x6c, 0x1d, 0xee, 0x6d, 0x76, 0xf6, 0x9e, - 0x58, 0x1b, 0xad, 0xbd, 0x8d, 0xf6, 0x4e, 0x7b, 0xb3, 0x91, 0x67, 0x35, 0x28, 0xb7, 0xd6, 0x5b, - 0x7b, 0x9b, 0xfb, 0x7b, 0xed, 0xcd, 0x46, 0xc1, 0xf8, 0x35, 0x28, 0xc7, 0x03, 0xad, 0x40, 0xf1, - 0x70, 0xef, 0xe9, 0xde, 0xfe, 0xe7, 0x7b, 0x8d, 0x6b, 0xac, 0x0c, 0x05, 0x6c, 0xbf, 0x91, 0x61, - 0x00, 0x73, 0xd4, 0x66, 0x23, 0xcb, 0x4a, 0x90, 0x5f, 0xdf, 0xef, 0x6d, 0x37, 0x72, 0xc6, 0x9f, - 0x65, 0x60, 0x19, 0x87, 0x3c, 0x98, 0x16, 0x02, 0x77, 0xa0, 0xd2, 0xf7, 0xbc, 0xb1, 0x30, 0x6e, - 0xe2, 0x43, 0x5c, 0x07, 0x89, 0x0d, 0x4e, 0xf2, 0xf2, 0xd8, 0xf3, 0xfb, 0x5c, 0xca, 0x00, 0x40, - 0xd0, 0x96, 0x80, 0x08, 0x1e, 0x94, 0x4c, 0x4c, 0x14, 0x24, 0x02, 0x2a, 0x04, 0x23, 0x92, 0x15, - 0x98, 0x3b, 0xf2, 0xb9, 0xdd, 0x3f, 0x95, 0xbb, 0x5f, 0x7e, 0xb1, 0x37, 0x63, 0xb3, 0xbb, 0x2f, - 0x78, 0x6a, 0xc8, 0x07, 0xb8, 0x05, 0x4a, 0xe6, 0xbc, 0x84, 0x6f, 0x48, 0xb0, 0x38, 0x00, 0xec, - 0x23, 0xdb, 0x1d, 0x78, 0x2e, 0x1f, 0x48, 0xed, 0x3e, 0x06, 0x18, 0x07, 0xb0, 0x32, 0x3d, 0x3e, - 0x29, 0x2f, 0x3e, 0xd0, 0xe4, 0x05, 0x29, 0xdb, 0x6b, 0x57, 0xb3, 0x82, 0x26, 0x3b, 0x7e, 0x96, - 0x83, 0xbc, 0x50, 0xbe, 0xae, 0xd4, 0xd3, 0x74, 0x6d, 0x3a, 0x37, 0x13, 0x71, 0x41, 0xeb, 0x9e, - 0x4e, 0x65, 0x72, 0x21, 0x95, 0x11, 0x82, 0xa7, 0x71, 0x84, 0xf6, 0x79, 0xff, 0x4c, 0xfa, 0x90, - 0x08, 0x6d, 0xf2, 0xfe, 0x19, 0x9a, 0x31, 0x76, 0x48, 0x65, 0x69, 0xbf, 0x17, 0x03, 0x3b, 0xc4, - 0x92, 0x12, 0x85, 0xe5, 0x8a, 0x11, 0x0a, 0x4b, 0x35, 0xa1, 0xe8, 0xb8, 0x47, 0xde, 0xc4, 0x1d, - 0xe0, 0xf6, 0x2e, 0x99, 0xea, 0x13, 0x03, 0x3c, 0x28, 0x89, 0xc4, 0xf9, 0x41, 0xbb, 0xb9, 0x24, - 0x00, 0x3d, 0x71, 0x82, 0xbc, 0x0b, 0xe5, 0xe0, 0xd2, 0xed, 0xeb, 0x7b, 0x78, 0x49, 0xce, 0x8f, - 0x18, 0xfd, 0x83, 0xee, 0xa5, 0xdb, 0xc7, 0x1d, 0x5b, 0x0a, 0xe4, 0x5f, 0xec, 0x7d, 0x28, 0x45, - 0xae, 0x56, 0x92, 0xc0, 0xd7, 0xf5, 0x12, 0xca, 0xbf, 0x4a, 0x16, 0x6d, 0x44, 0xba, 0xf6, 0x14, - 0x6a, 0x09, 0x94, 0x6e, 0x86, 0xd6, 0xc8, 0x0c, 0x7d, 0x5d, 0x37, 0x43, 0x63, 0xc1, 0x2e, 0x8b, - 0xe9, 0x66, 0xe9, 0xaf, 0x43, 0x49, 0xf5, 0x4c, 0x6c, 0x27, 0xb9, 0x15, 0xac, 0xee, 0x17, 0x7b, - 0x1b, 0x8d, 0x6b, 0x6c, 0x1e, 0x2a, 0xad, 0x0d, 0xdc, 0xa1, 0x08, 0xc8, 0x08, 0x92, 0x83, 0x56, - 0xb7, 0x1b, 0x41, 0xb2, 0x06, 0x83, 0x86, 0x38, 0x5e, 0x44, 0x8f, 0xa3, 0x60, 0xca, 0x07, 0xb0, - 0xa0, 0xc1, 0x62, 0x4b, 0x4d, 0x9c, 0x47, 0xd3, 0x96, 0x1a, 0xea, 0xe5, 0x84, 0x31, 0x56, 0x61, - 0x59, 0x7c, 0xb6, 0xcf, 0xb8, 0x1b, 0x76, 0x27, 0x47, 0x14, 0x4a, 0x73, 0x3c, 0x57, 0xe8, 0xeb, - 0xe5, 0x08, 0x73, 0x35, 0x23, 0x3d, 0x90, 0x46, 0x5d, 0x16, 0xa7, 0x7f, 0x4d, 0x6b, 0x01, 0x0b, - 0x3e, 0xc0, 0x7f, 0x13, 0xc6, 0x5d, 0x39, 0x02, 0x89, 0xb1, 0x1e, 0xb4, 0xdb, 0xa6, 0xb5, 0xbf, - 0xb7, 0xd3, 0xd9, 0x13, 0xc2, 0x48, 0x8c, 0x15, 0x01, 0x5b, 0x5b, 0x08, 0xc9, 0x18, 0x0d, 0xa8, - 0x3f, 0xe1, 0x61, 0xc7, 0x3d, 0xf6, 0xd4, 0x48, 0x7f, 0x5e, 0x80, 0xf9, 0x08, 0x14, 0x1b, 0x87, - 0x67, 0xdc, 0x0f, 0x1c, 0xcf, 0x45, 0x3d, 0xaf, 0x6c, 0xaa, 0x4f, 0x71, 0x82, 0x38, 0x03, 0xee, - 0x86, 0x4e, 0x78, 0x69, 0x25, 0x3c, 0x49, 0x75, 0x05, 0x96, 0x27, 0xd5, 0x12, 0x14, 0xec, 0xa1, - 0x63, 0xab, 0x08, 0x24, 0x7d, 0x08, 0x68, 0xdf, 0x1b, 0x7a, 0x3e, 0xaa, 0x74, 0x65, 0x93, 0x3e, - 0xd8, 0x23, 0x58, 0x12, 0xaa, 0xa5, 0xee, 0xde, 0xc3, 0x3d, 0x4a, 0x4e, 0x2d, 0xe6, 0x4e, 0x46, - 0x07, 0xb1, 0x8b, 0x4f, 0x60, 0xc4, 0xf9, 0x24, 0x4a, 0x48, 0x85, 0x24, 0x2a, 0x40, 0x56, 0xca, - 0x82, 0x3b, 0x19, 0xb5, 0x10, 0x13, 0xd1, 0x3f, 0x86, 0x65, 0x41, 0x1f, 0xa9, 0x30, 0x51, 0x89, - 0x79, 0x2c, 0x21, 0x2a, 0xeb, 0x48, 0x5c, 0x54, 0xe6, 0x06, 0x94, 0xa9, 0x57, 0x62, 0xc5, 0x0b, - 0xa4, 0x9d, 0x62, 0x57, 0xb8, 0x1f, 0xcc, 0x04, 0x0b, 0xe7, 0xe8, 0xb0, 0x9d, 0x0a, 0x16, 0x6a, - 0xe1, 0xc6, 0xd2, 0x74, 0xb8, 0xf1, 0x31, 0x2c, 0x1f, 0xf1, 0x20, 0xb4, 0x4e, 0xb9, 0x3d, 0xe0, - 0x3e, 0xee, 0x48, 0x0a, 0x2b, 0x92, 0x16, 0xbe, 0x28, 0x90, 0xdb, 0x88, 0xeb, 0x29, 0x94, 0xd0, - 0x25, 0xc4, 0xd6, 0xe3, 0x03, 0x2b, 0xf4, 0x2c, 0x54, 0x31, 0x70, 0x13, 0x97, 0xcc, 0x1a, 0x81, - 0x7b, 0xde, 0x86, 0x00, 0x26, 0xe9, 0x4e, 0x7c, 0x7b, 0x7c, 0x2a, 0xf5, 0xe4, 0x88, 0xee, 0x89, - 0x00, 0xb2, 0x9b, 0x50, 0x0c, 0x79, 0x10, 0xba, 0x9c, 0x62, 0x3a, 0x25, 0xf4, 0xd9, 0x2b, 0x10, - 0x7b, 0x1d, 0xe6, 0xb0, 0x8d, 0xa0, 0xd9, 0x40, 0x7e, 0xaf, 0xc6, 0xc2, 0xd2, 0x71, 0x4d, 0x89, - 0x13, 0x0a, 0xdb, 0xc4, 0x77, 0x82, 0x66, 0x15, 0x63, 0x99, 0xf8, 0x37, 0xfb, 0x0d, 0x4d, 0x2c, - 0x2c, 0x62, 0x59, 0x75, 0xe6, 0x4e, 0x71, 0xda, 0xaf, 0x44, 0x42, 0x7c, 0x3f, 0x5f, 0xaa, 0x34, - 0xaa, 0xc6, 0x87, 0x50, 0xa0, 0xd9, 0x11, 0x4c, 0x88, 0x73, 0x97, 0x91, 0x4c, 0x88, 0xd0, 0x26, - 0x14, 0x5d, 0x1e, 0x9e, 0x7b, 0xfe, 0x33, 0xe5, 0x6b, 0x95, 0x9f, 0xc6, 0x4f, 0xd0, 0x49, 0x10, - 0x05, 0x92, 0xc9, 0xde, 0x11, 0xec, 0x41, 0xcb, 0x1b, 0x9c, 0xda, 0xd2, 0x6f, 0x51, 0x42, 0x40, - 0xf7, 0xd4, 0x9e, 0x61, 0x8f, 0xec, 0x6c, 0x2c, 0xf9, 0x75, 0xa8, 0xab, 0xd0, 0x75, 0x60, 0x0d, - 0xf9, 0x71, 0x28, 0xd9, 0xbd, 0x2a, 0xe3, 0xd6, 0xc1, 0x0e, 0x3f, 0x0e, 0x8d, 0x5d, 0x58, 0x90, - 0x0c, 0xb9, 0x3f, 0xe6, 0xaa, 0xe9, 0x8f, 0xd2, 0x74, 0xd6, 0xca, 0xe3, 0xc5, 0xe4, 0x61, 0x46, - 0x21, 0xf9, 0x84, 0x22, 0x6b, 0x7c, 0x0a, 0x4c, 0x3f, 0xea, 0x64, 0x7d, 0x52, 0x73, 0x54, 0x2e, - 0x6a, 0x15, 0xe9, 0x89, 0xf4, 0x53, 0x67, 0x20, 0x66, 0x27, 0x98, 0xf4, 0xfb, 0x2a, 0xa5, 0xa0, - 0x64, 0xaa, 0x4f, 0xe3, 0x4f, 0x33, 0xb0, 0x88, 0x95, 0x29, 0x9d, 0x5b, 0x6a, 0x13, 0xdf, 0xba, - 0x93, 0x62, 0x7d, 0x74, 0xfd, 0x82, 0x3e, 0xbe, 0xb9, 0x53, 0x30, 0x3f, 0xe3, 0x14, 0x7c, 0x13, - 0x1a, 0x03, 0x3e, 0x74, 0x30, 0xbb, 0x44, 0x1d, 0xd7, 0xa4, 0x65, 0xcf, 0x2b, 0xb8, 0x32, 0x94, - 0xfe, 0x49, 0x06, 0x16, 0x48, 0x1b, 0x40, 0x73, 0x51, 0x4e, 0xd4, 0x27, 0xca, 0xc6, 0x92, 0xa2, - 0x4a, 0x8e, 0x29, 0x3e, 0x25, 0x11, 0x4a, 0xc4, 0xdb, 0xd7, 0xa4, 0xed, 0x25, 0xa1, 0xec, 0x63, - 0xb4, 0x13, 0x5c, 0x0b, 0x81, 0x29, 0xd9, 0x2a, 0xc9, 0x45, 0xd9, 0xbe, 0x86, 0x46, 0x84, 0x8b, - 0xa0, 0xf5, 0x92, 0x30, 0xfa, 0x04, 0xd8, 0xd8, 0x82, 0x5a, 0xa2, 0x99, 0x84, 0xe7, 0xb2, 0x4a, - 0x9e, 0xcb, 0x99, 0xe8, 0x40, 0x76, 0x36, 0x3a, 0xf0, 0x77, 0xf2, 0xc0, 0x04, 0x4b, 0x4d, 0xad, - 0xda, 0x54, 0x68, 0x2d, 0x3b, 0x13, 0x5a, 0x7b, 0x04, 0x4c, 0x23, 0x50, 0x11, 0xbf, 0x5c, 0x14, - 0xf1, 0x6b, 0xc4, 0xb4, 0x32, 0xe0, 0xf7, 0x08, 0x96, 0xa4, 0xd2, 0x18, 0xc5, 0xd2, 0xd0, 0x25, - 0x45, 0xeb, 0xc3, 0x48, 0x7b, 0x54, 0x31, 0x35, 0x74, 0x4f, 0xa9, 0xb0, 0x9a, 0x30, 0xa9, 0xc9, - 0x93, 0x83, 0x61, 0x35, 0x61, 0x45, 0x4f, 0x71, 0xc1, 0xdc, 0x0b, 0xb9, 0xa0, 0x38, 0xc3, 0x05, - 0x9a, 0x63, 0xa1, 0x94, 0x74, 0x2c, 0x18, 0x50, 0x53, 0xc1, 0x33, 0xca, 0x19, 0x20, 0x0d, 0xa9, - 0x22, 0x23, 0x68, 0x98, 0x37, 0x70, 0x0f, 0x1a, 0xca, 0xfa, 0x8f, 0x5c, 0x17, 0x14, 0x0f, 0x97, - 0xce, 0xa3, 0x0d, 0xe5, 0xc0, 0x48, 0x38, 0x8a, 0x2b, 0x53, 0x8e, 0xe2, 0xb7, 0x60, 0x21, 0x10, - 0x4c, 0x64, 0x4d, 0x5c, 0x99, 0xbc, 0xc2, 0x07, 0x68, 0x9e, 0x94, 0xcc, 0x06, 0x22, 0x0e, 0x63, - 0xf8, 0xac, 0x69, 0x5f, 0x9b, 0x35, 0xed, 0xd9, 0xfb, 0x71, 0x9c, 0x29, 0x38, 0x75, 0x46, 0x78, - 0x70, 0xc7, 0x89, 0x1e, 0x72, 0x82, 0xbb, 0xa7, 0xce, 0xc8, 0x54, 0x41, 0x4d, 0xf1, 0x61, 0xfc, - 0xe7, 0x0c, 0x34, 0x04, 0x1f, 0x24, 0xf8, 0xfc, 0xd7, 0x00, 0x77, 0xe4, 0x4b, 0xb2, 0x79, 0x45, - 0xd0, 0x2a, 0x2e, 0xff, 0x10, 0x90, 0x6d, 0x2d, 0x61, 0x8b, 0x49, 0x26, 0x6f, 0x26, 0x99, 0x3c, - 0x16, 0x64, 0xdb, 0xd7, 0x48, 0xc9, 0x16, 0x90, 0xb4, 0xf8, 0x5e, 0x3e, 0x25, 0xbe, 0xa7, 0x6d, - 0x85, 0x6d, 0x80, 0xa7, 0xfc, 0x72, 0xc7, 0xeb, 0xa3, 0x15, 0x74, 0x0b, 0x40, 0x30, 0xe4, 0xb1, - 0x3d, 0x72, 0xa4, 0x07, 0xa3, 0x60, 0x96, 0x9f, 0xf1, 0xcb, 0x2d, 0x04, 0x88, 0xd5, 0x10, 0xe8, - 0x78, 0x3f, 0x14, 0xcc, 0xd2, 0x33, 0x7e, 0x49, 0x9b, 0xc1, 0x82, 0xda, 0x53, 0x7e, 0xb9, 0xc9, - 0x49, 0x5d, 0xf3, 0x7c, 0xc1, 0x09, 0xbe, 0x7d, 0x2e, 0xf4, 0xb3, 0x44, 0x6c, 0xae, 0xe2, 0xdb, - 0xe7, 0x4f, 0xf9, 0xa5, 0x8a, 0x13, 0x16, 0x05, 0x7e, 0xe8, 0xf5, 0xe5, 0x09, 0xa4, 0xb2, 0x0c, - 0xe2, 0x4e, 0x99, 0x73, 0xcf, 0xf0, 0x6f, 0xe3, 0x4f, 0x32, 0x50, 0x13, 0xfd, 0x47, 0x01, 0x27, - 0xe6, 0x5d, 0x25, 0xab, 0x64, 0xe2, 0x64, 0x95, 0xc7, 0x52, 0x3e, 0x90, 0xb4, 0xcc, 0x5e, 0x2d, - 0x2d, 0x71, 0x82, 0x49, 0x54, 0xbe, 0x0b, 0x65, 0xda, 0x5b, 0x62, 0xb3, 0xe6, 0x12, 0xab, 0x94, - 0x18, 0x90, 0x59, 0x42, 0xb2, 0xa7, 0x14, 0x1b, 0xd7, 0x1c, 0x50, 0x34, 0xc5, 0x65, 0x3f, 0x72, - 0x3d, 0xa5, 0x2c, 0x43, 0x21, 0x2d, 0xcc, 0x7a, 0x08, 0x15, 0x8d, 0xa7, 0xd8, 0xf7, 0x28, 0x40, - 0x4d, 0x9d, 0x27, 0x06, 0x4c, 0x32, 0x4d, 0x62, 0xf4, 0xdb, 0xd7, 0xcc, 0x5a, 0x5f, 0x07, 0xac, - 0xcf, 0x41, 0x5e, 0x14, 0x32, 0x3e, 0x81, 0x05, 0xad, 0x5a, 0xb2, 0xf8, 0xd2, 0xfa, 0x94, 0x49, - 0xeb, 0xd3, 0x3f, 0xcd, 0xc0, 0x92, 0x2c, 0x8d, 0x89, 0x4d, 0x8e, 0x38, 0xae, 0x77, 0x83, 0x13, - 0xf6, 0x6b, 0x50, 0x13, 0xb5, 0x5b, 0x3e, 0x3f, 0x71, 0x82, 0x90, 0x2b, 0xcf, 0x7e, 0xca, 0xe6, - 0x10, 0x52, 0x5b, 0x90, 0x9a, 0x92, 0x92, 0x7d, 0x02, 0x15, 0x2c, 0x4a, 0x36, 0xa9, 0x5c, 0x96, - 0xe6, 0x6c, 0x41, 0xea, 0xea, 0xf6, 0x35, 0x13, 0x82, 0xe8, 0x6b, 0xbd, 0x0c, 0xc5, 0xd0, 0x77, - 0x4e, 0x4e, 0xb8, 0x6f, 0xac, 0x44, 0x5d, 0x13, 0x3b, 0x8d, 0x77, 0x43, 0x3e, 0x16, 0x4a, 0x90, - 0xf1, 0xdf, 0x32, 0x50, 0x91, 0x7b, 0xe7, 0x5b, 0xbb, 0xf3, 0xd7, 0xb4, 0xcc, 0x3c, 0x32, 0x3f, - 0xe3, 0x44, 0xbc, 0xbb, 0x30, 0x3f, 0x12, 0x0a, 0x91, 0x50, 0xd8, 0x13, 0xbe, 0xfc, 0xba, 0x02, - 0x4b, 0x7d, 0xe4, 0x01, 0x2c, 0xa2, 0x7a, 0x12, 0x58, 0xa1, 0x33, 0xb4, 0x14, 0x52, 0x66, 0xc1, - 0x2d, 0x10, 0xaa, 0xe7, 0x0c, 0x77, 0x25, 0x42, 0x9c, 0xd2, 0x41, 0x68, 0x9f, 0x70, 0xa9, 0xfa, - 0xd2, 0x87, 0xd1, 0x84, 0x95, 0x29, 0x5d, 0x5d, 0xd9, 0x19, 0x7f, 0xbf, 0x06, 0xab, 0x33, 0x28, - 0x69, 0x6f, 0x44, 0x3e, 0xec, 0xa1, 0x33, 0x3a, 0xf2, 0x22, 0x77, 0x53, 0x46, 0xf3, 0x61, 0xef, - 0x08, 0x8c, 0x72, 0x37, 0x71, 0x58, 0x56, 0x0c, 0x81, 0xfe, 0xa2, 0x48, 0x9d, 0xcf, 0xa2, 0xb2, - 0xf9, 0x6e, 0x52, 0x50, 0x4d, 0x37, 0xa7, 0xe0, 0xfa, 0xf1, 0xb7, 0x38, 0x9e, 0x81, 0x05, 0xec, - 0x18, 0x9a, 0x11, 0xdf, 0x49, 0xfd, 0x48, 0xb3, 0x4d, 0x44, 0x4b, 0x6f, 0xbf, 0xa0, 0xa5, 0x84, - 0x23, 0xc2, 0x5c, 0x51, 0xec, 0x4a, 0x95, 0x45, 0xed, 0x9c, 0xc1, 0x2b, 0xaa, 0x1d, 0xd4, 0x75, - 0x66, 0x5b, 0xcb, 0xbf, 0xd4, 0xb8, 0xd0, 0xc1, 0x92, 0x6c, 0xf2, 0x86, 0xac, 0x38, 0x42, 0xe9, - 0xed, 0x9e, 0xc2, 0xca, 0xb9, 0xed, 0x84, 0x6a, 0x7c, 0x9a, 0x59, 0x54, 0xc0, 0xf6, 0x1e, 0xbf, - 0xa0, 0xbd, 0xcf, 0xa9, 0x70, 0x42, 0xfb, 0x5b, 0x3a, 0x9f, 0x05, 0x06, 0x6b, 0xff, 0x31, 0x0b, - 0xf5, 0x64, 0x2d, 0x62, 0x53, 0x4b, 0x39, 0xa4, 0xf4, 0x09, 0xa9, 0x8f, 0x4b, 0x37, 0xe8, 0x1e, - 0xe9, 0x11, 0xb3, 0x0e, 0xda, 0x6c, 0x8a, 0x83, 0x56, 0xf7, 0x8b, 0xe6, 0x5e, 0x14, 0xfb, 0xc9, - 0xbf, 0x54, 0xec, 0xa7, 0x90, 0x16, 0xfb, 0xb9, 0x3a, 0x60, 0x30, 0xf7, 0xad, 0x02, 0x06, 0xc5, - 0xab, 0x03, 0x06, 0x6b, 0x7f, 0x99, 0x01, 0x36, 0xcb, 0xa9, 0xec, 0x09, 0xf9, 0xa2, 0x5d, 0x3e, - 0x94, 0x52, 0xec, 0x9d, 0x97, 0xe3, 0x76, 0xb5, 0x40, 0xaa, 0x34, 0x7b, 0x08, 0x8b, 0x7a, 0xde, - 0xac, 0x6e, 0xaa, 0xd4, 0x4c, 0xa6, 0xa3, 0x62, 0x83, 0x56, 0x0b, 0x7c, 0xe5, 0x5f, 0x18, 0xf8, - 0x2a, 0xbc, 0x30, 0xf0, 0x35, 0x97, 0x0c, 0x7c, 0xad, 0xfd, 0xad, 0x0c, 0x2c, 0xa6, 0x30, 0xd5, - 0x2f, 0x6f, 0xcc, 0x82, 0x17, 0x12, 0x22, 0x26, 0x2b, 0x79, 0x41, 0x93, 0x2e, 0x6b, 0x5f, 0x41, - 0x2d, 0xb1, 0x89, 0x7e, 0x79, 0xcd, 0x4f, 0x1b, 0x5a, 0xc4, 0xca, 0xba, 0xa1, 0xb5, 0xf6, 0x17, - 0x59, 0x60, 0xb3, 0xfb, 0xf8, 0x57, 0xd9, 0x85, 0xd9, 0x49, 0xca, 0xcd, 0x4e, 0xd2, 0xff, 0xbf, - 0x73, 0xe5, 0x2d, 0x58, 0x90, 0xb9, 0xfe, 0x5a, 0xe0, 0x81, 0x18, 0xa5, 0x11, 0x21, 0x54, 0x2f, - 0x3e, 0x9c, 0x8e, 0x39, 0x96, 0x12, 0xe9, 0xcd, 0xda, 0xc1, 0x9a, 0x0c, 0x3d, 0x1a, 0x6b, 0xd0, - 0x94, 0x53, 0x33, 0xeb, 0xaa, 0xfb, 0xdd, 0x7c, 0x64, 0x25, 0x23, 0x52, 0x2a, 0xc5, 0xdf, 0x85, - 0xaa, 0x7e, 0xd8, 0xc8, 0x75, 0x98, 0x8a, 0x38, 0x09, 0x75, 0xd8, 0xd3, 0x76, 0xeb, 0x06, 0x50, - 0x1c, 0x61, 0x10, 0x15, 0x23, 0x0d, 0xe2, 0x39, 0x8e, 0x67, 0x54, 0x8e, 0x12, 0x8b, 0xff, 0x57, - 0xa0, 0x9e, 0xf4, 0x5b, 0x49, 0x55, 0x2f, 0x4d, 0x3b, 0x14, 0xa5, 0x13, 0x8e, 0x2c, 0xf6, 0x1b, - 0xd0, 0x98, 0xf6, 0x7b, 0xc9, 0xdc, 0xcb, 0x2b, 0xca, 0xcf, 0x3b, 0x49, 0x57, 0x18, 0xdb, 0x86, - 0xa5, 0xb4, 0xe3, 0x16, 0x57, 0xe5, 0x6a, 0xb3, 0x80, 0xcd, 0x1e, 0xa9, 0xec, 0x23, 0xe9, 0xde, - 0x2c, 0xa4, 0x05, 0x62, 0xb4, 0xc9, 0x7e, 0x40, 0xff, 0x69, 0x8e, 0xce, 0x33, 0x80, 0x18, 0xc6, - 0x1a, 0x50, 0xdd, 0x3f, 0x68, 0xef, 0x59, 0x1b, 0xdb, 0xad, 0xbd, 0xbd, 0xf6, 0x4e, 0xe3, 0x1a, - 0x63, 0x50, 0xc7, 0x08, 0xca, 0x66, 0x04, 0xcb, 0x08, 0x98, 0xf4, 0xfd, 0x2a, 0x58, 0x96, 0x2d, - 0x41, 0xa3, 0xb3, 0x37, 0x05, 0xcd, 0xb1, 0x26, 0x2c, 0x1d, 0xb4, 0x29, 0xe8, 0x92, 0xa8, 0x37, - 0x2f, 0x54, 0x38, 0x39, 0x5c, 0xa1, 0xc2, 0xd1, 0x4d, 0x11, 0xc9, 0x7d, 0x4a, 0xb3, 0xf9, 0xbd, - 0x0c, 0x2c, 0x4f, 0x21, 0xe2, 0xfc, 0x5f, 0xd2, 0x6b, 0x92, 0x1a, 0x4d, 0x15, 0x81, 0x8a, 0x87, - 0xdf, 0x82, 0x85, 0xc8, 0xd4, 0x9b, 0x92, 0x4b, 0x8d, 0x08, 0xa1, 0x88, 0x1f, 0xc2, 0xa2, 0x66, - 0x31, 0x4e, 0xed, 0x50, 0xa6, 0xa1, 0x64, 0x01, 0x63, 0x35, 0xca, 0xb3, 0x9c, 0xea, 0xf5, 0x80, - 0xae, 0x9f, 0xe8, 0x88, 0xd8, 0xfb, 0x9b, 0xec, 0xaf, 0xfa, 0x14, 0xa6, 0x7c, 0x82, 0x11, 0x92, - 0xbd, 0xd5, 0x17, 0x5c, 0x35, 0xff, 0x07, 0x73, 0xc0, 0x3e, 0x9d, 0x70, 0xff, 0x12, 0xf3, 0x7b, - 0x83, 0x17, 0x25, 0xbc, 0x28, 0xb3, 0x28, 0xfb, 0x52, 0x39, 0xfc, 0x69, 0x39, 0xf4, 0xf9, 0x17, - 0xe7, 0xd0, 0x17, 0x5e, 0x94, 0x43, 0xff, 0x1a, 0xd4, 0x9c, 0x13, 0xd7, 0x13, 0x02, 0x48, 0xe8, - 0x26, 0x41, 0x73, 0xee, 0x4e, 0xee, 0x5e, 0xd5, 0xac, 0x4a, 0xa0, 0xd0, 0x4c, 0x02, 0xf6, 0x49, - 0x4c, 0xc4, 0x07, 0x27, 0x78, 0xdf, 0x43, 0x17, 0x3d, 0xed, 0xc1, 0x09, 0x97, 0x56, 0x20, 0xfa, - 0x45, 0x54, 0x61, 0x01, 0x0f, 0xd8, 0xeb, 0x50, 0x0f, 0xbc, 0x89, 0x50, 0xf5, 0xd4, 0x34, 0x90, - 0x7f, 0xb8, 0x4a, 0xd0, 0x03, 0x15, 0x0c, 0x58, 0x9c, 0x04, 0xdc, 0x1a, 0x39, 0x41, 0x20, 0x0e, - 0xe8, 0xbe, 0xe7, 0x86, 0xbe, 0x37, 0x94, 0x2e, 0xdf, 0x85, 0x49, 0xc0, 0x77, 0x09, 0xb3, 0x41, - 0x08, 0xf6, 0x5e, 0xdc, 0xa5, 0xb1, 0xed, 0xf8, 0x41, 0x13, 0xb0, 0x4b, 0x6a, 0xa4, 0xa8, 0x51, - 0xd9, 0x8e, 0x1f, 0xf5, 0x45, 0x7c, 0x04, 0x53, 0xb9, 0xfd, 0x95, 0xe9, 0xdc, 0xfe, 0x1f, 0xa7, - 0xe7, 0xf6, 0xd7, 0xb0, 0xea, 0x47, 0xb2, 0xea, 0xd9, 0x25, 0xfe, 0x46, 0x29, 0xfe, 0xb3, 0x57, - 0x16, 0xea, 0xdf, 0xe4, 0xca, 0xc2, 0x7c, 0xda, 0x95, 0x85, 0x77, 0xa1, 0x82, 0xc9, 0xe4, 0xd6, - 0xa9, 0xe3, 0x86, 0xca, 0x85, 0xdd, 0xd0, 0xb3, 0xcd, 0xb7, 0x85, 0x31, 0x0d, 0xbe, 0xfa, 0x33, - 0x98, 0xbd, 0x3d, 0xb0, 0xf0, 0x2b, 0xbc, 0x3d, 0x20, 0x93, 0xde, 0x1f, 0x40, 0x49, 0xad, 0x13, - 0x63, 0x90, 0x3f, 0xf6, 0xbd, 0x91, 0x72, 0xed, 0x89, 0xbf, 0x59, 0x1d, 0xb2, 0xa1, 0x27, 0x0b, - 0x67, 0x43, 0xcf, 0xf8, 0x4d, 0xa8, 0x68, 0xac, 0xc6, 0x5e, 0x25, 0x27, 0x82, 0xd0, 0x96, 0xa5, - 0x95, 0x4c, 0xb3, 0x58, 0x96, 0xd0, 0xce, 0x40, 0xc8, 0x9b, 0x81, 0xe3, 0x73, 0xbc, 0xe7, 0x63, - 0xf9, 0xfc, 0x8c, 0xfb, 0x81, 0x72, 0xb5, 0x36, 0x22, 0x84, 0x49, 0x70, 0xe3, 0xaf, 0xc3, 0x62, - 0x62, 0x6d, 0xa5, 0x88, 0x78, 0x1d, 0xe6, 0x70, 0xde, 0x54, 0x28, 0x2c, 0x99, 0xc5, 0x2f, 0x71, - 0x78, 0x81, 0x93, 0xbc, 0xc4, 0xd6, 0xd8, 0xf7, 0x8e, 0xb0, 0x91, 0x8c, 0x59, 0x91, 0xb0, 0x03, - 0xdf, 0x3b, 0x32, 0x7e, 0x96, 0x83, 0xdc, 0xb6, 0x37, 0xd6, 0x33, 0x2c, 0x32, 0x33, 0x19, 0x16, - 0xd2, 0x04, 0xb0, 0x22, 0x15, 0x5f, 0x6a, 0x6d, 0xe8, 0x1f, 0x55, 0x6a, 0xfe, 0x3d, 0xa8, 0x0b, - 0x39, 0x11, 0x7a, 0xc2, 0x86, 0x3a, 0xb7, 0x7d, 0xca, 0xe9, 0xcf, 0xd1, 0xe6, 0xb3, 0x47, 0x61, - 0xcf, 0xdb, 0x22, 0x38, 0x5b, 0x82, 0x5c, 0xa4, 0xc0, 0x22, 0x5a, 0x7c, 0x0a, 0xe3, 0x1a, 0xb3, - 0xdb, 0x2e, 0x65, 0xac, 0x47, 0x7e, 0xb1, 0x77, 0x60, 0x31, 0x59, 0x2f, 0x89, 0x22, 0xa9, 0x91, - 0xe8, 0x15, 0xa3, 0x4c, 0xba, 0x0e, 0x42, 0x8e, 0x10, 0x8d, 0x0c, 0xcb, 0x1e, 0x73, 0x8e, 0x28, - 0x4d, 0xe8, 0x95, 0x12, 0x42, 0xef, 0x36, 0x54, 0xc2, 0xe1, 0x99, 0x35, 0xb6, 0x2f, 0x87, 0x9e, - 0x3d, 0x90, 0xfb, 0x1b, 0xc2, 0xe1, 0xd9, 0x01, 0x41, 0xd8, 0x43, 0x80, 0xd1, 0x78, 0x2c, 0xf7, - 0x1e, 0xba, 0x1b, 0x63, 0x56, 0xde, 0x3d, 0x38, 0x20, 0x96, 0x33, 0xcb, 0xa3, 0xf1, 0x98, 0xfe, - 0x64, 0x9b, 0x50, 0x4f, 0xbd, 0x8b, 0x73, 0x4b, 0x25, 0x63, 0x79, 0xe3, 0x07, 0x29, 0x9b, 0xb3, - 0xd6, 0xd7, 0x61, 0x6b, 0xbf, 0x01, 0xec, 0x17, 0xbc, 0x11, 0xd3, 0x83, 0x72, 0xd4, 0x3f, 0xfd, - 0x42, 0x09, 0xa6, 0x57, 0x56, 0x12, 0x17, 0x4a, 0x5a, 0x83, 0x81, 0x2f, 0xe4, 0x22, 0x1d, 0x98, - 0x91, 0xc8, 0x07, 0xed, 0xc4, 0x6c, 0x91, 0xdc, 0x37, 0xfe, 0x3c, 0x03, 0x05, 0xba, 0xdd, 0xf2, - 0x06, 0xcc, 0x13, 0x7d, 0x94, 0xad, 0x22, 0x23, 0x44, 0x74, 0xee, 0xf6, 0x64, 0xa2, 0x8a, 0xd8, - 0x16, 0xda, 0xcd, 0xbc, 0x6c, 0xb4, 0xf2, 0xda, 0xed, 0xbc, 0xdb, 0x50, 0x8e, 0x9a, 0xd6, 0x58, - 0xa7, 0xa4, 0x5a, 0x66, 0xaf, 0x40, 0xfe, 0xd4, 0x1b, 0x2b, 0x5b, 0x1c, 0xe2, 0x99, 0x34, 0x11, - 0x1e, 0xf7, 0x45, 0xb4, 0x41, 0x9d, 0x97, 0x36, 0x64, 0xd4, 0x08, 0xb2, 0xc1, 0xec, 0x18, 0xe7, - 0x52, 0xc6, 0x78, 0x08, 0xf3, 0x42, 0x0e, 0x68, 0x91, 0xda, 0xab, 0x0f, 0xcd, 0x37, 0x85, 0x86, - 0xd7, 0x1f, 0x4e, 0x06, 0x5c, 0xf7, 0x84, 0x60, 0xea, 0x84, 0x84, 0x2b, 0xf3, 0xc0, 0xf8, 0x83, - 0x0c, 0xc9, 0x17, 0x51, 0x2f, 0xbb, 0x07, 0x79, 0x71, 0xbe, 0x4d, 0x79, 0xea, 0xa2, 0x3c, 0x57, - 0x41, 0x67, 0x22, 0x05, 0x5e, 0x67, 0x9d, 0x8c, 0x92, 0xb5, 0xd7, 0xcc, 0x8a, 0x3b, 0x19, 0x45, - 0xce, 0x84, 0xef, 0xa8, 0x61, 0x4d, 0x19, 0xe2, 0x34, 0xfa, 0x68, 0x9b, 0x3e, 0xd0, 0x72, 0x30, - 0xf2, 0x89, 0x13, 0x53, 0x69, 0x81, 0x83, 0x13, 0xae, 0xe5, 0x5e, 0xfc, 0x51, 0x16, 0x6a, 0x89, - 0x1e, 0x61, 0x12, 0x8a, 0x38, 0x00, 0xc8, 0x0b, 0x2c, 0xd7, 0x1b, 0x04, 0x48, 0x2a, 0xea, 0xda, - 0x3c, 0x65, 0x13, 0xf3, 0x14, 0xc5, 0xa4, 0x73, 0x7a, 0x4c, 0xfa, 0x11, 0x94, 0xe3, 0x1b, 0x99, - 0xc9, 0x2e, 0x89, 0xf6, 0x54, 0xb6, 0x6f, 0x4c, 0x14, 0x47, 0xb1, 0x0b, 0x7a, 0x14, 0xfb, 0x7b, - 0x5a, 0xd0, 0x73, 0x0e, 0xab, 0x31, 0xd2, 0x66, 0xf4, 0x57, 0x93, 0x14, 0xf1, 0x09, 0x54, 0xb4, - 0xce, 0xeb, 0xc1, 0xcd, 0x4c, 0x22, 0xb8, 0x19, 0xe5, 0xe5, 0x67, 0xe3, 0xbc, 0x7c, 0xe3, 0xb7, - 0xb3, 0x50, 0x13, 0xfb, 0xcb, 0x71, 0x4f, 0x0e, 0xbc, 0xa1, 0xd3, 0x47, 0xaf, 0x70, 0xb4, 0xc3, - 0xa4, 0xa2, 0xa5, 0xf6, 0x99, 0xdc, 0x62, 0xa4, 0x67, 0xe9, 0xd7, 0x8f, 0x48, 0x48, 0x47, 0xd7, - 0x8f, 0x0c, 0xa8, 0x09, 0xc1, 0x78, 0x64, 0x07, 0x5c, 0xbb, 0x2f, 0x6a, 0x56, 0x8e, 0x39, 0x5f, - 0xb7, 0x03, 0x92, 0x90, 0xef, 0xc0, 0xa2, 0xa0, 0xc1, 0x9b, 0x17, 0x23, 0x67, 0x38, 0x74, 0x88, - 0x92, 0x5c, 0x0d, 0x8d, 0x63, 0xce, 0x4d, 0x3b, 0xe4, 0xbb, 0x02, 0x21, 0xaf, 0x97, 0x96, 0x06, - 0x4e, 0x60, 0x1f, 0xc5, 0xa9, 0x42, 0xd1, 0x37, 0xc6, 0x72, 0xec, 0x0b, 0x2d, 0x96, 0x43, 0x57, - 0xb0, 0x2a, 0x23, 0xfb, 0x22, 0x8a, 0xe5, 0x4c, 0x71, 0x52, 0x71, 0x9a, 0x93, 0x8c, 0xff, 0x92, - 0x85, 0x8a, 0xc6, 0x96, 0x2f, 0x73, 0xba, 0xde, 0x9a, 0xf1, 0xe2, 0x97, 0x75, 0x87, 0xfd, 0x6b, - 0xc9, 0x26, 0x31, 0xe4, 0x4b, 0x17, 0x59, 0x35, 0x06, 0xbe, 0x01, 0x65, 0xb1, 0xeb, 0xde, 0x45, - 0xa7, 0x98, 0xbc, 0x86, 0x8d, 0x80, 0x83, 0xc9, 0x91, 0x42, 0x3e, 0x46, 0x64, 0x21, 0x46, 0x3e, - 0x16, 0xc8, 0xe7, 0xe5, 0x07, 0x7e, 0x08, 0x55, 0x59, 0x2b, 0xae, 0x29, 0x0e, 0x37, 0xde, 0xf5, - 0x89, 0xf5, 0x36, 0x2b, 0xd4, 0x1c, 0x2d, 0xbe, 0x2c, 0xf8, 0x58, 0x15, 0x2c, 0xbd, 0xa8, 0xe0, - 0x63, 0xfa, 0x30, 0xb6, 0xa2, 0x94, 0x4b, 0x4c, 0x37, 0x50, 0x72, 0xec, 0x21, 0x2c, 0x2a, 0x71, - 0x35, 0x71, 0x6d, 0xd7, 0xf5, 0x26, 0x6e, 0x9f, 0xab, 0x84, 0x7d, 0x26, 0x51, 0x87, 0x31, 0xc6, - 0x18, 0x44, 0x37, 0xba, 0x28, 0x6d, 0xe1, 0x3e, 0x14, 0x48, 0x2f, 0x27, 0xe5, 0x23, 0x5d, 0x70, - 0x11, 0x09, 0xbb, 0x07, 0x05, 0x52, 0xcf, 0xb3, 0x57, 0x0a, 0x1b, 0x22, 0x30, 0x1e, 0xc0, 0x3c, - 0xaa, 0x98, 0x9a, 0xc4, 0x7d, 0x9e, 0x56, 0x62, 0x2c, 0x01, 0xdb, 0xa3, 0x4d, 0xa4, 0xa7, 0xd3, - 0xfc, 0xcf, 0x1c, 0x54, 0x34, 0xb0, 0x10, 0x8b, 0x98, 0x80, 0x61, 0x0d, 0x1c, 0x7b, 0xc4, 0x55, - 0xec, 0xa1, 0x66, 0xd6, 0x10, 0xba, 0x29, 0x81, 0xe2, 0x50, 0xb0, 0xcf, 0x4e, 0x2c, 0x6f, 0x12, - 0x5a, 0x03, 0x7e, 0xe2, 0x73, 0x2e, 0x95, 0xa5, 0xaa, 0x7d, 0x76, 0xb2, 0x3f, 0x09, 0x37, 0x11, - 0x26, 0xa8, 0x04, 0x53, 0x6b, 0x54, 0x32, 0x67, 0x60, 0x64, 0x5f, 0xc4, 0x54, 0x32, 0x71, 0x85, - 0xa6, 0x28, 0x1f, 0x25, 0xae, 0x90, 0xd9, 0x32, 0x2d, 0xc9, 0x0b, 0xb3, 0x92, 0xfc, 0x3d, 0x58, - 0x21, 0x49, 0x2e, 0x65, 0x84, 0x35, 0xc5, 0x52, 0x4b, 0x88, 0x95, 0x83, 0xd4, 0xf4, 0xaf, 0x86, - 0x18, 0x81, 0xda, 0x1f, 0x81, 0xf3, 0x13, 0xda, 0x51, 0x19, 0x53, 0x8c, 0x4c, 0x56, 0xde, 0x75, - 0x7e, 0xc2, 0x05, 0x25, 0x06, 0x46, 0x75, 0x4a, 0x99, 0x86, 0x3a, 0x72, 0xdc, 0x69, 0x4a, 0xfb, - 0x22, 0x49, 0x59, 0x96, 0x94, 0xf6, 0x85, 0x4e, 0xf9, 0x3e, 0xac, 0x8e, 0xf8, 0xc0, 0xb1, 0x93, - 0xd5, 0x5a, 0xb1, 0x06, 0xb1, 0x44, 0x68, 0xad, 0x4c, 0x97, 0x2c, 0x48, 0x31, 0x1b, 0x3f, 0xf1, - 0x46, 0x47, 0x0e, 0x1d, 0x9e, 0x14, 0xaa, 0xcd, 0x9b, 0x75, 0x77, 0x32, 0xfa, 0x21, 0x82, 0x45, - 0x91, 0xc0, 0xa8, 0x41, 0xa5, 0x1b, 0x7a, 0x63, 0xb5, 0xcc, 0x75, 0xa8, 0xd2, 0xa7, 0xbc, 0x8e, - 0x71, 0x03, 0xae, 0x23, 0x6f, 0xf6, 0xbc, 0xb1, 0x37, 0xf4, 0x4e, 0x2e, 0x13, 0x0e, 0xa5, 0xff, - 0x9e, 0x81, 0xc5, 0x04, 0x56, 0xee, 0xf3, 0xf7, 0x68, 0x63, 0x45, 0x39, 0xf5, 0xc4, 0xce, 0x0b, - 0xda, 0xe1, 0x43, 0x84, 0xb4, 0xab, 0x54, 0x9e, 0x7d, 0x2b, 0xbe, 0x0b, 0xaa, 0x0a, 0x12, 0x6f, - 0x37, 0x67, 0x79, 0x5b, 0x96, 0x57, 0xb7, 0x44, 0x55, 0x15, 0x7f, 0x55, 0xa6, 0x0a, 0x0f, 0xe4, - 0x90, 0x73, 0xc9, 0x64, 0x48, 0xdd, 0xf9, 0xa4, 0x7a, 0x10, 0x7b, 0xa4, 0x02, 0xe3, 0x5f, 0x65, - 0x00, 0xe2, 0xde, 0x61, 0x3a, 0x66, 0x74, 0x80, 0xd2, 0x33, 0x2b, 0xda, 0x61, 0xf9, 0x2a, 0x54, - 0xa3, 0x8c, 0xb1, 0xf8, 0x48, 0xae, 0x28, 0x98, 0x38, 0x97, 0xef, 0xc2, 0xfc, 0xc9, 0xd0, 0x3b, - 0x42, 0xd5, 0x49, 0x1e, 0xa0, 0x74, 0x29, 0xa5, 0x4e, 0x60, 0x75, 0x2c, 0xc6, 0x07, 0x78, 0x3e, - 0x35, 0xa9, 0x4c, 0x3f, 0x8e, 0x8d, 0xdf, 0xc9, 0x46, 0xa9, 0x33, 0xf1, 0x4c, 0x3c, 0xdf, 0xce, - 0xf8, 0x36, 0x11, 0xd8, 0xe7, 0x45, 0x1e, 0x3e, 0x81, 0xba, 0x4f, 0xd2, 0x51, 0x89, 0xce, 0xfc, - 0x73, 0x44, 0x67, 0xcd, 0x4f, 0x1c, 0xb9, 0x6f, 0x42, 0xc3, 0x1e, 0x9c, 0x71, 0x3f, 0x74, 0xd0, - 0x59, 0x8b, 0x8a, 0x9a, 0x4c, 0x56, 0xd1, 0xe0, 0xa8, 0x11, 0xdd, 0x85, 0x79, 0x79, 0x45, 0x28, - 0xa2, 0x94, 0x8f, 0x0e, 0xc4, 0x60, 0x41, 0x68, 0xfc, 0x5b, 0x95, 0xab, 0x93, 0x5c, 0xdd, 0xe7, - 0xcf, 0x8a, 0x3e, 0xc2, 0xec, 0x6c, 0x6c, 0x45, 0x32, 0x92, 0xf4, 0x01, 0x4b, 0x79, 0x44, 0x40, - 0xe9, 0x01, 0x4e, 0x4e, 0x6b, 0xfe, 0x65, 0xa6, 0xd5, 0xf8, 0x93, 0x0c, 0x14, 0xb7, 0xbd, 0xb1, - 0xb0, 0xcb, 0x85, 0x3e, 0x87, 0xdb, 0x24, 0xba, 0x9e, 0x37, 0x27, 0x3e, 0x3b, 0x83, 0xe7, 0xa7, - 0xe5, 0xa7, 0xea, 0x1b, 0xb5, 0xa4, 0xbe, 0xf1, 0x3d, 0xb8, 0x81, 0xd1, 0x08, 0xdf, 0x1b, 0x7b, - 0xbe, 0xd8, 0xaa, 0xf6, 0x90, 0xf4, 0x0e, 0xcf, 0x0d, 0x4f, 0x95, 0xec, 0xbc, 0x7e, 0xcc, 0xf9, - 0x81, 0x46, 0xb1, 0x1b, 0x11, 0xe0, 0x5d, 0x93, 0x61, 0x78, 0x66, 0x91, 0xa9, 0x28, 0x15, 0x23, - 0x92, 0xa8, 0xf3, 0x02, 0xd1, 0x46, 0x38, 0xaa, 0x46, 0xc6, 0x47, 0x50, 0x8e, 0xbc, 0x0e, 0xec, - 0x2d, 0x28, 0x9f, 0x7a, 0x63, 0xe9, 0x9a, 0xc8, 0x24, 0xae, 0x2e, 0xc8, 0x51, 0x9b, 0xa5, 0x53, - 0xfa, 0x23, 0x30, 0x7e, 0x56, 0x84, 0x62, 0xc7, 0x3d, 0xf3, 0x9c, 0x3e, 0x66, 0xfb, 0x8c, 0xf8, - 0xc8, 0x53, 0xf7, 0x14, 0xc5, 0xdf, 0x18, 0xd1, 0x8f, 0x9f, 0x0e, 0xc8, 0xc9, 0x88, 0x7e, 0xf4, - 0x68, 0xc0, 0x32, 0xcc, 0xf9, 0xfa, 0xdd, 0xff, 0x82, 0x8f, 0xf9, 0x87, 0x91, 0xd1, 0x56, 0xd0, - 0xee, 0x79, 0x8a, 0xba, 0xe8, 0x4e, 0x3a, 0x4e, 0x19, 0xdd, 0x3d, 0x29, 0x23, 0x04, 0x27, 0xec, - 0x26, 0x14, 0xe5, 0x4d, 0x01, 0xca, 0xbb, 0xa6, 0x84, 0x41, 0x09, 0x42, 0x6e, 0xf0, 0x39, 0x45, - 0x93, 0x22, 0x8d, 0x4a, 0xd8, 0xe9, 0x12, 0xb8, 0x29, 0x78, 0xed, 0x36, 0x54, 0x88, 0x9e, 0x48, - 0x4a, 0x32, 0x3f, 0x07, 0x41, 0x48, 0x90, 0xf2, 0x84, 0x46, 0x39, 0xf5, 0x09, 0x0d, 0x4c, 0xe7, - 0x8a, 0xa4, 0x2c, 0x0d, 0x11, 0xe8, 0xe1, 0x04, 0x0d, 0xae, 0xde, 0x8f, 0x91, 0xc6, 0x3d, 0x5d, - 0xa3, 0x52, 0xc6, 0xfd, 0x6b, 0x50, 0x3b, 0xb6, 0x87, 0xc3, 0x23, 0xbb, 0xff, 0x8c, 0x6c, 0xd2, - 0x2a, 0xb9, 0xe1, 0x14, 0x10, 0x8d, 0xd2, 0xdb, 0x50, 0xd1, 0x56, 0x19, 0x93, 0x6f, 0xf2, 0x26, - 0xc4, 0xeb, 0x3b, 0xed, 0x6a, 0xaa, 0xbf, 0x84, 0xab, 0x49, 0x4b, 0x42, 0x9a, 0x4f, 0x26, 0x21, - 0xdd, 0x40, 0x69, 0x2a, 0x13, 0x55, 0x1a, 0x74, 0x4b, 0xdf, 0x1e, 0x0c, 0x30, 0x51, 0x85, 0x9e, - 0xc4, 0xc2, 0xc9, 0x23, 0xfc, 0x02, 0x29, 0xb5, 0x04, 0x23, 0x92, 0x5b, 0xe4, 0x2f, 0x1d, 0xdb, - 0xce, 0x00, 0x93, 0x3e, 0xc9, 0x8c, 0x2d, 0xda, 0xa3, 0xf0, 0xc0, 0x76, 0x06, 0xec, 0x0e, 0x54, - 0x15, 0x1a, 0x4f, 0xc7, 0x45, 0x9a, 0x7f, 0x89, 0x16, 0x67, 0xa2, 0x01, 0xb5, 0x88, 0x62, 0x14, - 0xdf, 0x85, 0xaa, 0x48, 0x12, 0xe4, 0x83, 0x77, 0x31, 0xf8, 0x1f, 0x72, 0xbc, 0xf1, 0x54, 0x7f, - 0x7c, 0x43, 0x8e, 0x55, 0x72, 0xa9, 0xfa, 0x1f, 0x33, 0x1d, 0x4c, 0xa2, 0x14, 0x8a, 0x18, 0x85, - 0x68, 0x56, 0x12, 0x8a, 0x98, 0x24, 0xc5, 0x10, 0x0d, 0x11, 0xb0, 0x8f, 0x34, 0x43, 0xaa, 0x89, - 0xc4, 0x37, 0xa7, 0xea, 0xbf, 0xc2, 0x84, 0x12, 0xdc, 0xeb, 0x04, 0xe2, 0x94, 0x09, 0xb8, 0x3b, - 0xc0, 0x0b, 0x50, 0x25, 0xb3, 0xec, 0x04, 0x4f, 0x09, 0xf0, 0xcb, 0xb5, 0xb0, 0x5a, 0x50, 0xd5, - 0x87, 0xc9, 0x4a, 0x90, 0xdf, 0x3f, 0x68, 0xef, 0x35, 0xae, 0xb1, 0x0a, 0x14, 0xbb, 0xed, 0x5e, - 0x6f, 0xa7, 0xbd, 0xd9, 0xc8, 0xb0, 0x2a, 0x94, 0xa2, 0x6b, 0x1c, 0x59, 0xf1, 0xd5, 0xda, 0xd8, - 0x68, 0x1f, 0xf4, 0xda, 0x9b, 0x8d, 0xdc, 0xf7, 0xf3, 0xa5, 0x6c, 0x23, 0x67, 0xfc, 0x59, 0x0e, - 0x2a, 0xda, 0x2c, 0x3c, 0x5f, 0x18, 0xdf, 0x02, 0x40, 0x93, 0x26, 0xce, 0x63, 0xca, 0x9b, 0x65, - 0x01, 0xa1, 0xc5, 0xd7, 0x9d, 0xe5, 0x39, 0x7a, 0xfe, 0x41, 0x39, 0xcb, 0x5f, 0x83, 0x1a, 0xbd, - 0xa4, 0xa0, 0x87, 0xeb, 0x0a, 0x66, 0x95, 0x80, 0x52, 0x54, 0xe3, 0x3d, 0x30, 0x24, 0xc2, 0x1b, - 0x02, 0xf2, 0x5e, 0x35, 0x81, 0xf0, 0x8e, 0x00, 0x5e, 0xf0, 0x08, 0xbc, 0xe1, 0x19, 0x27, 0x0a, - 0xd2, 0x08, 0x2b, 0x12, 0xd6, 0x93, 0x17, 0xd1, 0xa4, 0x3c, 0xd4, 0x2e, 0x22, 0x15, 0xcc, 0x2a, - 0x01, 0x65, 0x43, 0xef, 0x28, 0x06, 0x2a, 0x21, 0x03, 0xad, 0xce, 0x72, 0x43, 0x82, 0x79, 0x76, - 0x66, 0xfc, 0x59, 0x65, 0x64, 0x8c, 0xef, 0xcc, 0x96, 0x7b, 0xb1, 0x5f, 0x8b, 0xbd, 0x05, 0x6c, - 0x34, 0x1e, 0x5b, 0x29, 0x9e, 0xa6, 0xbc, 0x39, 0x3f, 0x1a, 0x8f, 0x7b, 0x9a, 0x23, 0xe6, 0x97, - 0xe0, 0x04, 0xfb, 0x12, 0x58, 0x4b, 0x6c, 0x60, 0xec, 0x62, 0xe4, 0x42, 0x8d, 0xc5, 0x72, 0x46, - 0x17, 0xcb, 0x29, 0xd2, 0x2f, 0x9b, 0x2a, 0xfd, 0x9e, 0x27, 0x27, 0x8c, 0x2d, 0xa8, 0x1c, 0x68, - 0xef, 0xb4, 0xdc, 0x11, 0x27, 0x84, 0x7a, 0xa1, 0x85, 0xce, 0x0e, 0x72, 0x6e, 0xf9, 0xf2, 0x61, - 0x16, 0xad, 0x37, 0x59, 0xad, 0x37, 0xc6, 0xbf, 0xcc, 0xd0, 0x1d, 0xf8, 0xa8, 0xf3, 0xf1, 0xd3, - 0x30, 0x2a, 0x0e, 0x14, 0xdf, 0x17, 0xac, 0xa8, 0xf8, 0x8f, 0xbc, 0xea, 0x87, 0x5d, 0xb3, 0xbc, - 0xe3, 0xe3, 0x80, 0xab, 0x9b, 0x2f, 0x15, 0x84, 0xed, 0x23, 0x48, 0x29, 0xdf, 0x42, 0xc3, 0x77, - 0xa8, 0xfe, 0x40, 0xde, 0x80, 0x11, 0xca, 0xf7, 0xae, 0x7d, 0x21, 0x5b, 0x0d, 0x84, 0x0a, 0x22, - 0x1d, 0xd5, 0xea, 0xbe, 0x4f, 0xf4, 0x6d, 0xfc, 0x33, 0x79, 0xa5, 0x71, 0x7a, 0x7e, 0xef, 0x43, - 0x29, 0xaa, 0x35, 0x79, 0xc2, 0x2a, 0xca, 0x08, 0x2f, 0xce, 0x71, 0xb4, 0xca, 0x13, 0x3d, 0xa6, - 0xcd, 0x85, 0xc1, 0x86, 0x8e, 0xd6, 0xeb, 0xb7, 0x81, 0x1d, 0x3b, 0xfe, 0x34, 0x31, 0x6d, 0xb6, - 0x06, 0x62, 0x34, 0x6a, 0xe3, 0x10, 0x16, 0x95, 0x94, 0xd0, 0x2c, 0x82, 0xe4, 0xe2, 0x65, 0x5e, - 0x20, 0xe4, 0xb3, 0x33, 0x42, 0xde, 0xf8, 0x69, 0x1e, 0x8a, 0xea, 0xcd, 0xa3, 0xb4, 0x77, 0x7a, - 0xca, 0xc9, 0x77, 0x7a, 0x9a, 0x89, 0x37, 0x1d, 0x70, 0xe9, 0xe5, 0x79, 0x7f, 0x77, 0xfa, 0xc8, - 0xd6, 0x9c, 0xe6, 0x89, 0x63, 0x7b, 0x05, 0xf2, 0x63, 0x3b, 0x3c, 0x45, 0x07, 0x19, 0x31, 0x0f, - 0x7e, 0x2b, 0x67, 0x7a, 0x21, 0xe9, 0x4c, 0x4f, 0x7b, 0xd3, 0x88, 0x54, 0xd2, 0x99, 0x37, 0x8d, - 0x6e, 0x00, 0xe9, 0x17, 0x5a, 0x3e, 0x4c, 0x09, 0x01, 0xe2, 0x2c, 0x4a, 0xaa, 0x23, 0xa5, 0x69, - 0x75, 0xe4, 0xa5, 0x55, 0x85, 0xf7, 0x60, 0x8e, 0xee, 0x03, 0xcb, 0x7b, 0x4d, 0xea, 0x40, 0x91, - 0x73, 0xa8, 0xfe, 0xa7, 0x24, 0x58, 0x53, 0xd2, 0xea, 0x0f, 0x84, 0x54, 0x12, 0x0f, 0x84, 0xe8, - 0x4e, 0xfe, 0x6a, 0xd2, 0xc9, 0x7f, 0x0f, 0x1a, 0xd1, 0x84, 0xa2, 0xcb, 0xcc, 0x0d, 0xe4, 0x8d, - 0x8e, 0xba, 0x82, 0x0b, 0x29, 0xb9, 0x17, 0xc4, 0x07, 0x62, 0x3d, 0x71, 0x20, 0x0a, 0x19, 0xd6, - 0x0a, 0x43, 0x3e, 0x1a, 0x87, 0xf2, 0x40, 0xc4, 0x9c, 0x6f, 0xbd, 0x83, 0xc9, 0x1b, 0x7f, 0x35, - 0x28, 0x77, 0xf6, 0xac, 0xad, 0x9d, 0xce, 0x93, 0xed, 0x5e, 0x23, 0x23, 0x3e, 0xbb, 0x87, 0x1b, - 0x1b, 0xed, 0xf6, 0x26, 0x9e, 0x38, 0x00, 0x73, 0x5b, 0xad, 0x8e, 0x38, 0x7d, 0x72, 0xc6, 0x5f, - 0x66, 0xa0, 0xa2, 0x55, 0xcf, 0xde, 0x8f, 0x66, 0x85, 0xde, 0x90, 0xb8, 0x35, 0xdb, 0x85, 0x07, - 0x4a, 0x14, 0x6b, 0xd3, 0x12, 0xbd, 0xe0, 0x94, 0xbd, 0xf2, 0x05, 0x27, 0xf6, 0x06, 0xcc, 0xdb, - 0x54, 0x43, 0x34, 0x0b, 0xd2, 0x1d, 0x2c, 0xc1, 0x72, 0x12, 0x30, 0x0b, 0x2c, 0x3e, 0x4f, 0x04, - 0x5d, 0x5e, 0x25, 0x5e, 0x45, 0x47, 0xca, 0x5e, 0x60, 0x7c, 0x00, 0x10, 0xf7, 0x24, 0x39, 0xe4, - 0x6b, 0xc9, 0x21, 0x67, 0xb4, 0x21, 0x67, 0x8d, 0x4d, 0x12, 0x0e, 0x72, 0xfa, 0xa2, 0xf8, 0xf3, - 0x3b, 0xa0, 0xfc, 0x4c, 0x16, 0x66, 0x57, 0x8e, 0x87, 0x3c, 0x54, 0x37, 0x1e, 0x17, 0x24, 0xa6, - 0x13, 0x21, 0xd4, 0x05, 0xe4, 0xb8, 0x96, 0x58, 0xc6, 0x48, 0x46, 0x9b, 0x96, 0x31, 0x92, 0xd4, - 0x8c, 0xf0, 0xc6, 0x1a, 0x34, 0x37, 0xb9, 0xa8, 0xad, 0x35, 0x1c, 0x4e, 0x75, 0xc7, 0xb8, 0x01, - 0xd7, 0x53, 0x70, 0xd2, 0xb5, 0xf0, 0x29, 0x2c, 0xb7, 0xe8, 0x72, 0xe3, 0x2f, 0xeb, 0x86, 0x85, - 0xd1, 0x84, 0x95, 0xe9, 0x2a, 0x65, 0x63, 0x5b, 0xb0, 0xb0, 0xc9, 0x8f, 0x26, 0x27, 0x3b, 0xfc, - 0x2c, 0x6e, 0x88, 0x41, 0x3e, 0x38, 0xf5, 0xce, 0xe5, 0xfc, 0xe0, 0xdf, 0x62, 0x67, 0x0e, 0x05, - 0x8d, 0x15, 0x8c, 0x79, 0x5f, 0xf9, 0x39, 0x11, 0xd2, 0x1d, 0xf3, 0xbe, 0xf1, 0x3e, 0x30, 0xbd, - 0x1e, 0x39, 0x5f, 0x42, 0xf7, 0x9f, 0x1c, 0x59, 0xc1, 0x65, 0x10, 0xf2, 0x91, 0x7a, 0x78, 0x04, - 0x82, 0xc9, 0x51, 0x97, 0x20, 0xc6, 0x5d, 0xa8, 0x1e, 0xd8, 0x97, 0x26, 0xff, 0x52, 0xde, 0x1d, - 0x58, 0x85, 0xe2, 0xd8, 0xbe, 0x14, 0x9b, 0x3b, 0x0a, 0x79, 0x20, 0xda, 0xf8, 0xc3, 0x3c, 0xcc, - 0x11, 0x25, 0xbb, 0x43, 0x6f, 0x03, 0x3a, 0x2e, 0x6e, 0x2e, 0x25, 0xfe, 0x34, 0xd0, 0x8c, 0x84, - 0xcc, 0xce, 0x4a, 0x48, 0xe9, 0x16, 0x53, 0x6f, 0x22, 0x28, 0xe7, 0xb4, 0x3b, 0x19, 0xa9, 0x87, - 0x10, 0xd8, 0x4d, 0x28, 0xc7, 0x97, 0xb4, 0xf2, 0xf1, 0xdb, 0x8f, 0x74, 0x35, 0x2b, 0x19, 0x3e, - 0x8c, 0x2d, 0x0c, 0xea, 0x9d, 0x12, 0xfc, 0x52, 0x08, 0xea, 0xa0, 0x54, 0x33, 0xa6, 0xa8, 0x6e, - 0xa5, 0x24, 0xcd, 0x98, 0x19, 0x73, 0xa5, 0xf4, 0x62, 0x73, 0x85, 0xfc, 0x65, 0xcf, 0x31, 0x57, - 0xe0, 0x25, 0xcc, 0x95, 0x97, 0x08, 0xdd, 0x5d, 0x87, 0x12, 0x9e, 0xe6, 0x9a, 0x4c, 0x14, 0xa7, - 0xb8, 0x90, 0x89, 0x1f, 0x6a, 0x0a, 0x3d, 0xe5, 0x0d, 0xdc, 0x88, 0xb7, 0x89, 0xc9, 0xbf, 0xfc, - 0xd5, 0x84, 0x44, 0xbe, 0x80, 0xa2, 0x84, 0x0a, 0x86, 0x76, 0xed, 0x91, 0x7a, 0x56, 0x06, 0xff, - 0x16, 0xd3, 0x86, 0x6f, 0x61, 0x7c, 0x39, 0x71, 0x7c, 0x3e, 0x50, 0x8f, 0x17, 0x38, 0xb8, 0x47, - 0x05, 0x44, 0x0c, 0x50, 0x18, 0x17, 0xae, 0x77, 0xee, 0xca, 0xab, 0xcb, 0x45, 0x27, 0x78, 0x2a, - 0x3e, 0x0d, 0x06, 0x0d, 0x7c, 0x58, 0x6a, 0xec, 0xf9, 0xea, 0xc8, 0x31, 0x7e, 0x9a, 0x81, 0x86, - 0xdc, 0x5d, 0x11, 0x4e, 0xd7, 0xed, 0x0b, 0x57, 0x85, 0xb9, 0x9f, 0xff, 0x14, 0x81, 0x01, 0x35, - 0x74, 0x69, 0x44, 0xe7, 0x0f, 0xb9, 0x64, 0x2a, 0x02, 0xb8, 0x25, 0xcf, 0xa0, 0x57, 0xa0, 0xa2, - 0x92, 0x2c, 0x47, 0xce, 0x50, 0x3d, 0xf3, 0x4a, 0x59, 0x96, 0xbb, 0xce, 0x50, 0x1d, 0x5f, 0xbe, - 0x2d, 0x6f, 0x49, 0x65, 0xf0, 0xf8, 0x32, 0xed, 0x90, 0x1b, 0xff, 0x29, 0x03, 0x0b, 0xda, 0x50, - 0xe4, 0xbe, 0xfd, 0x18, 0xaa, 0xd1, 0x8b, 0x6e, 0x3c, 0xd2, 0xa7, 0x56, 0x93, 0x82, 0x26, 0x2e, - 0x56, 0xe9, 0x47, 0x90, 0x40, 0x74, 0x66, 0x60, 0x5f, 0x62, 0x7f, 0x83, 0xc9, 0x48, 0x99, 0x2c, - 0x03, 0xfb, 0x72, 0x8b, 0xf3, 0xee, 0x64, 0x24, 0x0c, 0xd2, 0x73, 0xce, 0x9f, 0x45, 0x04, 0xa4, - 0x49, 0x81, 0x80, 0x49, 0x0a, 0x03, 0x6a, 0x23, 0xcf, 0x0d, 0x4f, 0x23, 0x12, 0xa9, 0x4b, 0x22, - 0x90, 0x68, 0x8c, 0xff, 0x91, 0x85, 0x45, 0x72, 0x9c, 0x49, 0x87, 0xa5, 0x14, 0x5d, 0x4d, 0x98, - 0x23, 0x1f, 0x22, 0x09, 0xaf, 0xed, 0x6b, 0xa6, 0xfc, 0x66, 0xef, 0xbd, 0xa4, 0xb3, 0x4f, 0x5d, - 0xc4, 0xba, 0x62, 0xfa, 0x73, 0xb3, 0xd3, 0x7f, 0xf5, 0xf4, 0xa6, 0xc5, 0xd1, 0x0a, 0x69, 0x71, - 0xb4, 0x97, 0x89, 0x5e, 0xcd, 0xdc, 0x56, 0x2a, 0x4a, 0x1a, 0xed, 0xb6, 0xd2, 0xfb, 0xb0, 0x9a, - 0xa0, 0x41, 0x69, 0xed, 0x1c, 0x3b, 0x5c, 0xdd, 0x0c, 0x5f, 0xd2, 0xa8, 0xbb, 0x0a, 0xb7, 0x5e, - 0x84, 0x42, 0xd0, 0xf7, 0xc6, 0xdc, 0x58, 0x81, 0xa5, 0xe4, 0xac, 0xca, 0x63, 0xe2, 0xf7, 0x33, - 0xd0, 0x94, 0x59, 0x0f, 0x8e, 0x7b, 0xb2, 0xed, 0x04, 0xa1, 0xe7, 0x47, 0x2f, 0x9f, 0xdd, 0x02, - 0x08, 0x42, 0xdb, 0x97, 0x36, 0x24, 0x69, 0xb7, 0x65, 0x84, 0xa0, 0x7d, 0x78, 0x1d, 0x4a, 0xdc, - 0x1d, 0x10, 0x92, 0xb8, 0xa1, 0xc8, 0xdd, 0x81, 0xb2, 0x2e, 0x67, 0xb4, 0xea, 0x5a, 0xd2, 0x68, - 0x90, 0xd7, 0x26, 0xc5, 0xec, 0xf0, 0x33, 0x3c, 0x78, 0xf3, 0xd1, 0xb5, 0xc9, 0x5d, 0xfb, 0x02, - 0x73, 0x08, 0x03, 0xe3, 0x1f, 0x67, 0x61, 0x3e, 0xee, 0x1f, 0xdd, 0xb9, 0x4e, 0xc8, 0x6f, 0xd9, - 0xab, 0x58, 0x7e, 0xdf, 0x91, 0xec, 0xe0, 0x08, 0xad, 0x5c, 0x73, 0x27, 0x96, 0x68, 0x73, 0x76, - 0x5c, 0x66, 0x40, 0x45, 0x51, 0x78, 0x93, 0x50, 0x7b, 0x80, 0xa8, 0x4c, 0x24, 0xfb, 0x93, 0x50, - 0x98, 0x51, 0xc2, 0x9e, 0x74, 0x5c, 0x69, 0xc8, 0x14, 0xec, 0x51, 0xd8, 0xc1, 0x77, 0x8d, 0x05, - 0x58, 0x14, 0xa3, 0x85, 0x14, 0x54, 0x82, 0xbe, 0x41, 0xda, 0x33, 0xad, 0x1c, 0x6a, 0xce, 0xba, - 0x6a, 0x49, 0x4f, 0x3c, 0x46, 0xaa, 0xe5, 0x2b, 0x50, 0xa1, 0xca, 0xe3, 0xcb, 0x69, 0x79, 0xb3, - 0x8c, 0x2d, 0x20, 0x5e, 0xba, 0x76, 0xbc, 0x49, 0xc2, 0xa0, 0x05, 0x6a, 0x0a, 0x93, 0x0a, 0xfe, - 0x41, 0x06, 0xae, 0xa7, 0x2c, 0x9b, 0xdc, 0xe5, 0x1b, 0xb0, 0x70, 0x1c, 0x21, 0xd5, 0xec, 0xd2, - 0x56, 0x5f, 0x51, 0x62, 0x35, 0x39, 0xa7, 0x66, 0xe3, 0x38, 0x09, 0x88, 0x4d, 0x29, 0x5a, 0xc1, - 0xc4, 0xfd, 0x43, 0x34, 0xa5, 0x68, 0x19, 0xc9, 0x8a, 0x39, 0x80, 0xb5, 0xf6, 0x85, 0x90, 0x18, - 0x1b, 0xfa, 0xc3, 0xdc, 0x8a, 0x8d, 0x92, 0x6e, 0xe3, 0xcc, 0x4b, 0xb9, 0x8d, 0x07, 0x74, 0xcd, - 0x2a, 0xaa, 0xeb, 0xdb, 0x54, 0x82, 0x07, 0xa8, 0x28, 0x43, 0x0f, 0x8b, 0xab, 0x3b, 0x90, 0xfd, - 0xe8, 0x41, 0x71, 0x23, 0x80, 0xf9, 0xdd, 0xc9, 0x30, 0x74, 0xe2, 0x37, 0xc6, 0xd9, 0x7b, 0xb2, - 0x0c, 0xb6, 0xa3, 0x66, 0x2d, 0xb5, 0x21, 0x88, 0x1a, 0xc2, 0xc9, 0x1a, 0x89, 0x8a, 0xac, 0xd9, - 0xf6, 0xe6, 0x47, 0xc9, 0x16, 0x8c, 0xeb, 0xb0, 0x1a, 0x7f, 0xd1, 0xb4, 0xa9, 0xa3, 0xe6, 0x5f, - 0x64, 0x28, 0x61, 0x39, 0xf9, 0xde, 0x39, 0x6b, 0xc3, 0x62, 0xe0, 0xb8, 0x27, 0x43, 0xae, 0x57, - 0x1f, 0xc8, 0x49, 0x58, 0x4e, 0xf6, 0x4d, 0xbe, 0x89, 0x6e, 0x2e, 0x50, 0x89, 0xb8, 0xb6, 0x80, - 0xad, 0x5f, 0xd5, 0xc9, 0x98, 0x2d, 0xa6, 0x66, 0x63, 0xb6, 0xf3, 0x1d, 0xa8, 0x27, 0x1b, 0x62, - 0x1f, 0xca, 0x2b, 0x86, 0x71, 0xaf, 0x72, 0x53, 0xb7, 0xc5, 0x62, 0x86, 0xa8, 0xc4, 0x73, 0x1f, - 0x18, 0xff, 0x30, 0x03, 0x4d, 0x93, 0x0b, 0xce, 0xd5, 0x7a, 0xa9, 0x78, 0xe6, 0xe3, 0x99, 0x5a, - 0xaf, 0x1e, 0xab, 0xba, 0xb9, 0xa8, 0x7a, 0xf4, 0xf6, 0x95, 0x8b, 0xb1, 0x7d, 0x6d, 0x66, 0x44, - 0xeb, 0x25, 0x98, 0x23, 0x12, 0x63, 0x15, 0x96, 0x65, 0x7f, 0x54, 0x5f, 0xe2, 0x98, 0x60, 0xa2, - 0xc5, 0x44, 0x4c, 0x70, 0x0d, 0x9a, 0xf4, 0x80, 0x9d, 0x3e, 0x08, 0x59, 0x70, 0x13, 0xd8, 0xae, - 0xdd, 0xb7, 0x7d, 0xcf, 0x73, 0x0f, 0xb8, 0x2f, 0xd3, 0x3f, 0x51, 0xc3, 0xc4, 0x90, 0x99, 0x52, - 0x85, 0xe9, 0x4b, 0x3d, 0xbb, 0xe6, 0xb9, 0x2a, 0xdb, 0x85, 0xbe, 0x0c, 0x13, 0x16, 0xd7, 0xed, - 0x67, 0x5c, 0xd5, 0xa4, 0xa6, 0xe8, 0x13, 0xa8, 0x8c, 0xa3, 0x4a, 0xd5, 0xbc, 0xab, 0x7b, 0xc8, - 0xb3, 0xcd, 0x9a, 0x3a, 0xb5, 0xf1, 0x18, 0x96, 0x92, 0x75, 0x4a, 0xd1, 0xb1, 0x06, 0xa5, 0x91, - 0x84, 0xc9, 0xde, 0x45, 0xdf, 0xc6, 0xff, 0x2d, 0x42, 0x71, 0xcb, 0x76, 0x86, 0x42, 0xf1, 0x7a, - 0x00, 0xf9, 0xbe, 0xca, 0x38, 0x8a, 0x9f, 0xb7, 0x90, 0x58, 0xf5, 0xff, 0x06, 0xe6, 0x1d, 0x09, - 0x3a, 0xf6, 0x09, 0xd4, 0x93, 0xb1, 0xce, 0xa9, 0x4b, 0x8e, 0xc9, 0x20, 0x65, 0xad, 0x3f, 0x15, - 0xd5, 0x2a, 0xc7, 0x87, 0x23, 0xe9, 0x0c, 0xa5, 0x53, 0xed, 0xf4, 0xf4, 0x5c, 0xa1, 0x6f, 0x07, - 0xa7, 0xb6, 0xf5, 0xf8, 0xfd, 0x0f, 0xe4, 0x2d, 0xc7, 0x0a, 0x02, 0xbb, 0xa7, 0xf6, 0xe3, 0xf7, - 0x3f, 0x98, 0xd6, 0xa4, 0xe9, 0xa2, 0x9b, 0xae, 0x49, 0x2f, 0x41, 0x81, 0xde, 0x17, 0xa3, 0xd4, - 0x11, 0xfa, 0x60, 0x8f, 0x60, 0xe9, 0x98, 0x46, 0x62, 0xc9, 0x24, 0x5f, 0x92, 0x82, 0x25, 0xba, - 0x59, 0x23, 0x71, 0x5d, 0x44, 0x91, 0xc7, 0x67, 0x05, 0xe6, 0x4e, 0xe3, 0xc7, 0xe2, 0x6a, 0xa6, - 0xfc, 0x32, 0xfe, 0x6b, 0x01, 0x2a, 0xda, 0xa4, 0xb0, 0x2a, 0x94, 0xcc, 0x76, 0xb7, 0x6d, 0x7e, - 0xd6, 0xde, 0x6c, 0x5c, 0x63, 0xf7, 0xe0, 0xf5, 0xce, 0xde, 0xc6, 0xbe, 0x69, 0xb6, 0x37, 0x7a, - 0xd6, 0xbe, 0x69, 0xa9, 0x97, 0x4f, 0x0e, 0x5a, 0x5f, 0xec, 0xb6, 0xf7, 0x7a, 0xd6, 0x66, 0xbb, - 0xd7, 0xea, 0xec, 0x74, 0x1b, 0x19, 0x76, 0x13, 0x9a, 0x31, 0xa5, 0x42, 0xb7, 0x76, 0xf7, 0x0f, - 0xf7, 0x7a, 0x8d, 0x2c, 0xbb, 0x0d, 0x37, 0xb6, 0x3a, 0x7b, 0xad, 0x1d, 0x2b, 0xa6, 0xd9, 0xd8, - 0xe9, 0x7d, 0x66, 0xb5, 0x7f, 0x70, 0xd0, 0x31, 0xbf, 0x68, 0xe4, 0xd2, 0x08, 0x84, 0x31, 0xae, - 0x6a, 0xc8, 0xb3, 0xeb, 0xb0, 0x4c, 0x04, 0x54, 0xc4, 0xea, 0xed, 0xef, 0x5b, 0xdd, 0xfd, 0xfd, - 0xbd, 0x46, 0x81, 0x2d, 0x40, 0xad, 0xb3, 0xf7, 0x59, 0x6b, 0xa7, 0xb3, 0x69, 0x99, 0xed, 0xd6, - 0xce, 0x6e, 0x63, 0x8e, 0x2d, 0xc2, 0xfc, 0x34, 0x5d, 0x51, 0x54, 0xa1, 0xe8, 0xf6, 0xf7, 0x3a, - 0xfb, 0x7b, 0xd6, 0x67, 0x6d, 0xb3, 0xdb, 0xd9, 0xdf, 0x6b, 0x94, 0xd8, 0x0a, 0xb0, 0x24, 0x6a, - 0x7b, 0xb7, 0xb5, 0xd1, 0x28, 0xb3, 0x65, 0x58, 0x48, 0xc2, 0x9f, 0xb6, 0xbf, 0x68, 0x00, 0x6b, - 0xc2, 0x12, 0x75, 0xcc, 0x5a, 0x6f, 0xef, 0xec, 0x7f, 0x6e, 0xed, 0x76, 0xf6, 0x3a, 0xbb, 0x87, - 0xbb, 0x8d, 0x0a, 0x3e, 0xad, 0xd4, 0x6e, 0x5b, 0x9d, 0xbd, 0xee, 0xe1, 0xd6, 0x56, 0x67, 0xa3, - 0xd3, 0xde, 0xeb, 0x35, 0xaa, 0xd4, 0x72, 0xda, 0xc0, 0x6b, 0xa2, 0x80, 0xbc, 0x09, 0x60, 0x6d, - 0x76, 0xba, 0xad, 0xf5, 0x9d, 0xf6, 0x66, 0xa3, 0xce, 0x6e, 0xc1, 0xf5, 0x5e, 0x7b, 0xf7, 0x60, - 0xdf, 0x6c, 0x99, 0x5f, 0xa8, 0x9b, 0x02, 0xd6, 0x56, 0xab, 0xb3, 0x73, 0x68, 0xb6, 0x1b, 0xf3, - 0xec, 0x55, 0xb8, 0x65, 0xb6, 0x3f, 0x3d, 0xec, 0x98, 0xed, 0x4d, 0x6b, 0x6f, 0x7f, 0xb3, 0x6d, - 0x6d, 0xb5, 0x5b, 0xbd, 0x43, 0xb3, 0x6d, 0xed, 0x76, 0xba, 0xdd, 0xce, 0xde, 0x93, 0x46, 0x83, - 0xbd, 0x0e, 0x77, 0x22, 0x92, 0xa8, 0x82, 0x29, 0xaa, 0x05, 0x31, 0x3e, 0xb5, 0xa4, 0x7b, 0xed, - 0x1f, 0xf4, 0xac, 0x83, 0x76, 0xdb, 0x6c, 0x30, 0xb6, 0x06, 0x2b, 0x71, 0xf3, 0xd4, 0x80, 0x6c, - 0x7b, 0x51, 0xe0, 0x0e, 0xda, 0xe6, 0x6e, 0x6b, 0x4f, 0x2c, 0x70, 0x02, 0xb7, 0x24, 0xba, 0x1d, - 0xe3, 0xa6, 0xbb, 0xbd, 0xcc, 0x18, 0xd4, 0xb5, 0x55, 0xd9, 0x6a, 0x99, 0x8d, 0x15, 0x36, 0x0f, - 0x95, 0xdd, 0x83, 0x03, 0xab, 0xd7, 0xd9, 0x6d, 0xef, 0x1f, 0xf6, 0x1a, 0xab, 0x6c, 0x09, 0xe6, - 0x55, 0x97, 0x54, 0xc9, 0x9f, 0x17, 0xd9, 0x2a, 0xb0, 0xc3, 0x3d, 0xb3, 0xdd, 0xda, 0x14, 0x33, - 0x14, 0x21, 0xfe, 0x4f, 0x51, 0x06, 0x38, 0x7e, 0x9a, 0x8b, 0x4e, 0xe5, 0x38, 0x63, 0x20, 0xf9, - 0x46, 0x68, 0x55, 0x7b, 0xdb, 0xf3, 0x45, 0xaf, 0x77, 0x6b, 0x36, 0x54, 0x6e, 0xc6, 0x86, 0x9a, - 0x31, 0xd2, 0x6b, 0xba, 0x92, 0xf7, 0x1a, 0xd4, 0x46, 0xf4, 0x5e, 0xa8, 0x7c, 0x17, 0x10, 0x64, - 0xfa, 0x0c, 0x01, 0xe9, 0x51, 0xc0, 0x99, 0xe7, 0xab, 0x0b, 0xb3, 0xcf, 0x57, 0xa7, 0x29, 0xf2, - 0x73, 0x69, 0x8a, 0xfc, 0x7d, 0x58, 0x20, 0x19, 0xe4, 0xb8, 0xce, 0x48, 0x99, 0xc7, 0xa4, 0xee, - 0xcd, 0xa3, 0x2c, 0x22, 0xb8, 0xb2, 0x1b, 0x94, 0x6d, 0x21, 0x65, 0x45, 0x51, 0x9a, 0x15, 0x09, - 0x93, 0x82, 0x44, 0x44, 0x64, 0x52, 0x44, 0x2d, 0xd8, 0x17, 0x71, 0x0b, 0x15, 0xad, 0x05, 0x82, - 0x63, 0x0b, 0xf7, 0x61, 0x81, 0x5f, 0x84, 0xbe, 0x6d, 0x79, 0x63, 0xfb, 0xcb, 0x09, 0x46, 0x60, - 0x6d, 0x34, 0xd6, 0xab, 0xe6, 0x3c, 0x22, 0xf6, 0x11, 0xbe, 0x69, 0x87, 0xf6, 0xfd, 0xaf, 0xa1, - 0xa2, 0xbd, 0x25, 0xcb, 0x56, 0x61, 0xf1, 0xf3, 0x4e, 0x6f, 0xaf, 0xdd, 0xed, 0x5a, 0x07, 0x87, - 0xeb, 0x4f, 0xdb, 0x5f, 0x58, 0xdb, 0xad, 0xee, 0x76, 0xe3, 0x9a, 0xd8, 0x9d, 0x7b, 0xed, 0x6e, - 0xaf, 0xbd, 0x99, 0x80, 0x67, 0xd8, 0x2b, 0xb0, 0x76, 0xb8, 0x77, 0xd8, 0x6d, 0x6f, 0x5a, 0x69, - 0xe5, 0xb2, 0x82, 0x1d, 0x25, 0x3e, 0xa5, 0x78, 0xee, 0xfe, 0x27, 0xd0, 0x98, 0x0e, 0x06, 0x25, - 0xa2, 0x67, 0xcf, 0x0b, 0xb3, 0xdd, 0xff, 0x37, 0x39, 0x80, 0x38, 0x5b, 0x5f, 0x48, 0x84, 0xcd, - 0x56, 0xaf, 0xb5, 0xb3, 0x2f, 0x3a, 0x61, 0xee, 0xf7, 0xc4, 0x46, 0x37, 0xdb, 0x9f, 0x36, 0xae, - 0xa5, 0x62, 0xf6, 0x0f, 0x7a, 0x8d, 0x8c, 0x18, 0x6f, 0x67, 0xaf, 0xd3, 0xeb, 0xb4, 0x76, 0x2c, - 0x73, 0xff, 0xb0, 0xb3, 0xf7, 0x84, 0x5e, 0x8b, 0x42, 0x61, 0x78, 0x78, 0xb0, 0x65, 0xee, 0xef, - 0xf5, 0xac, 0xee, 0xf6, 0x61, 0x6f, 0x13, 0xdf, 0x9a, 0xda, 0x30, 0x3b, 0x07, 0x54, 0x67, 0xfe, - 0x79, 0x04, 0xa2, 0xea, 0x82, 0x98, 0xb1, 0x27, 0xfb, 0xdd, 0x6e, 0xe7, 0xc0, 0xfa, 0xf4, 0xb0, - 0x6d, 0x76, 0xda, 0x5d, 0x2c, 0x38, 0x97, 0x02, 0x17, 0xf4, 0x45, 0x21, 0x42, 0x7b, 0x3b, 0x9f, - 0x49, 0x19, 0x27, 0x48, 0x4b, 0x49, 0x90, 0xa0, 0x2a, 0x8b, 0xad, 0x2f, 0x84, 0x44, 0x4a, 0xcd, - 0x70, 0x05, 0x4e, 0x94, 0xab, 0x08, 0xf1, 0xd7, 0xed, 0xb5, 0x7a, 0x9d, 0x0d, 0x4b, 0x3e, 0x50, - 0x27, 0x16, 0x41, 0x14, 0xab, 0xa6, 0xa3, 0x44, 0x29, 0x94, 0x8c, 0xd1, 0x39, 0xb2, 0xb9, 0x69, - 0x62, 0x81, 0xfa, 0x0c, 0x54, 0xd0, 0xce, 0x8b, 0x85, 0x12, 0x52, 0x44, 0x90, 0x34, 0xd4, 0x87, - 0xc0, 0x2c, 0x3c, 0xfe, 0x9d, 0x1c, 0xd4, 0xe9, 0xe6, 0x14, 0xfd, 0x10, 0x0f, 0xf7, 0xd9, 0x2e, - 0x14, 0xe5, 0x2f, 0x3a, 0xb1, 0xe5, 0xe8, 0xcd, 0x20, 0xfd, 0x37, 0xa4, 0xd6, 0x56, 0xa6, 0xc1, - 0x52, 0x6b, 0x5a, 0xfc, 0x9b, 0x7f, 0xfa, 0x17, 0xff, 0x28, 0x5b, 0x63, 0x95, 0x87, 0x67, 0xef, - 0x3e, 0x3c, 0xe1, 0x6e, 0x20, 0xea, 0xf8, 0x6b, 0x00, 0xf1, 0xef, 0x14, 0xb1, 0x66, 0x14, 0x01, - 0x9a, 0xfa, 0x11, 0xa7, 0xb5, 0xeb, 0x29, 0x18, 0x59, 0xef, 0x75, 0xac, 0x77, 0xd1, 0xa8, 0x8b, - 0x7a, 0x1d, 0xd7, 0x09, 0xe9, 0x37, 0x8b, 0x3e, 0xce, 0xdc, 0x67, 0x03, 0xa8, 0xea, 0xbf, 0x20, - 0xc4, 0x94, 0x42, 0x93, 0xf2, 0x1b, 0x48, 0x6b, 0x37, 0x52, 0x71, 0x4a, 0x55, 0xc4, 0x36, 0x96, - 0x8d, 0x86, 0x68, 0x63, 0x82, 0x14, 0x71, 0x2b, 0x43, 0x52, 0x9e, 0xe3, 0x1f, 0x0a, 0x62, 0x37, - 0x35, 0xf5, 0x67, 0xe6, 0x67, 0x8a, 0xd6, 0x6e, 0x5d, 0x81, 0x95, 0x6d, 0xdd, 0xc2, 0xb6, 0x56, - 0x0d, 0x26, 0xda, 0xea, 0x23, 0x8d, 0xfa, 0x99, 0xa2, 0x8f, 0x33, 0xf7, 0x1f, 0xff, 0xf9, 0x3d, - 0x28, 0x47, 0x99, 0x94, 0xec, 0xb7, 0xa0, 0x96, 0xb8, 0xda, 0xc6, 0xd4, 0x30, 0xd2, 0x6e, 0xc2, - 0xad, 0xdd, 0x4c, 0x47, 0xca, 0x86, 0x5f, 0xc1, 0x86, 0x9b, 0x6c, 0x45, 0x34, 0x2c, 0xaf, 0x8e, - 0x3d, 0xc4, 0x0b, 0xa0, 0xf4, 0x02, 0xd3, 0x33, 0xcd, 0x48, 0xa0, 0xc6, 0x6e, 0x4e, 0x2b, 0xee, - 0x89, 0xd6, 0x6e, 0x5d, 0x81, 0x95, 0xcd, 0xdd, 0xc4, 0xe6, 0x56, 0xd8, 0x92, 0xde, 0x9c, 0xca, - 0x7b, 0x64, 0x1c, 0x5f, 0x3d, 0xd3, 0x7f, 0x47, 0x87, 0xdd, 0x8a, 0xdf, 0xa8, 0x4a, 0xf9, 0x7d, - 0x9d, 0x88, 0x45, 0x66, 0x7f, 0x64, 0xc7, 0x68, 0x62, 0x53, 0x8c, 0xe1, 0xf2, 0xe9, 0x3f, 0xa3, - 0xc3, 0x8e, 0xa0, 0xa2, 0x3d, 0x3d, 0xcf, 0xae, 0x5f, 0xf9, 0x4c, 0xfe, 0xda, 0x5a, 0x1a, 0x2a, - 0x6d, 0x28, 0x7a, 0xfd, 0x0f, 0x8f, 0x39, 0x67, 0x3f, 0x82, 0x72, 0xf4, 0xa0, 0x39, 0x5b, 0xd5, - 0x1e, 0x98, 0xd7, 0x1f, 0x60, 0x5f, 0x6b, 0xce, 0x22, 0xd2, 0x98, 0x4f, 0xaf, 0x5d, 0x30, 0xdf, - 0xe7, 0x50, 0xd1, 0x1e, 0x2d, 0x8f, 0x06, 0x30, 0xfb, 0x30, 0x7a, 0x34, 0x80, 0x94, 0x37, 0xce, - 0x8d, 0x05, 0x6c, 0xa2, 0xc2, 0xca, 0xc8, 0xdf, 0xe1, 0x85, 0x17, 0xb0, 0x1d, 0x58, 0x96, 0x06, - 0xd1, 0x11, 0xff, 0x26, 0xcb, 0x90, 0xf2, 0xd3, 0x45, 0x8f, 0x32, 0xec, 0x13, 0x28, 0xa9, 0xb7, - 0xe9, 0xd9, 0x4a, 0xfa, 0x1b, 0xfb, 0x6b, 0xab, 0x33, 0x70, 0x69, 0xbd, 0x7c, 0x01, 0x10, 0xbf, - 0x90, 0x1e, 0x09, 0x89, 0x99, 0x17, 0xd7, 0x23, 0x0e, 0x98, 0x7d, 0x4e, 0xdd, 0x58, 0xc1, 0x01, - 0x36, 0x18, 0x0a, 0x09, 0x97, 0x9f, 0xab, 0xe7, 0x1f, 0x7f, 0x0c, 0x15, 0xed, 0x91, 0xf4, 0x68, - 0xfa, 0x66, 0x1f, 0x58, 0x8f, 0xa6, 0x2f, 0xe5, 0x4d, 0x75, 0x63, 0x0d, 0x6b, 0x5f, 0x32, 0xe6, - 0x45, 0xed, 0x42, 0x51, 0x92, 0x0a, 0x8b, 0x58, 0xa0, 0x53, 0xa8, 0x25, 0x5e, 0x42, 0x8f, 0x76, - 0x68, 0xda, 0x3b, 0xeb, 0xd1, 0x0e, 0x4d, 0x7d, 0x3c, 0x5d, 0xf1, 0x99, 0xb1, 0x20, 0xda, 0x39, - 0x43, 0x12, 0xad, 0xa5, 0x1f, 0x42, 0x45, 0x7b, 0xd5, 0x3c, 0x1a, 0xcb, 0xec, 0x03, 0xea, 0xd1, - 0x58, 0xd2, 0x1e, 0x41, 0x5f, 0xc2, 0x36, 0xea, 0x06, 0xb2, 0x02, 0x3e, 0xae, 0x27, 0xea, 0xfe, - 0x2d, 0xa8, 0x27, 0x1f, 0x3a, 0x8f, 0xf6, 0x7e, 0xea, 0x8b, 0xe9, 0xd1, 0xde, 0xbf, 0xe2, 0x75, - 0x74, 0xc9, 0xd2, 0xf7, 0x17, 0xa3, 0x46, 0x1e, 0x7e, 0x25, 0xef, 0x84, 0x7c, 0xcd, 0x3e, 0x15, - 0x02, 0x4e, 0xbe, 0xed, 0xc8, 0x56, 0x35, 0xae, 0xd5, 0x5f, 0x80, 0x8c, 0xf6, 0xcb, 0xcc, 0x33, - 0x90, 0x49, 0x66, 0xc6, 0xca, 0xd9, 0x13, 0x58, 0x8c, 0x98, 0x39, 0x7a, 0xac, 0x31, 0x88, 0xc6, - 0x90, 0xfa, 0x24, 0xe4, 0x5a, 0x63, 0x1a, 0xfb, 0x28, 0x43, 0xc7, 0x1f, 0x3e, 0x91, 0xa7, 0x1d, - 0x7f, 0xfa, 0x7b, 0x8d, 0xda, 0xf1, 0x97, 0x78, 0x49, 0x6f, 0xfa, 0xf8, 0x0b, 0x1d, 0x51, 0x87, - 0x0b, 0xf3, 0xd3, 0x4f, 0x27, 0xde, 0xba, 0xea, 0xe1, 0x00, 0xaa, 0xfe, 0x95, 0xe7, 0xbf, 0x2b, - 0x90, 0x14, 0x45, 0x4a, 0x9a, 0x3e, 0x94, 0x99, 0x1f, 0xec, 0x37, 0xa1, 0xaa, 0xbf, 0xd4, 0xcc, - 0x74, 0x99, 0x30, 0xdd, 0xd2, 0x8d, 0x54, 0x5c, 0x92, 0x4b, 0x58, 0x55, 0x6f, 0x86, 0x7d, 0x06, - 0x2b, 0xd1, 0x34, 0xeb, 0x97, 0xc6, 0x03, 0x76, 0x3b, 0xe5, 0x2a, 0x79, 0x62, 0xb2, 0xaf, 0x5f, - 0x79, 0xd7, 0xfc, 0x51, 0x46, 0x70, 0x5f, 0xf2, 0xc9, 0xd8, 0xf8, 0xe4, 0x49, 0x7b, 0x29, 0x37, - 0x3e, 0x79, 0x52, 0xdf, 0x99, 0x55, 0xdc, 0xc7, 0x16, 0x13, 0x73, 0x44, 0x39, 0xb1, 0xec, 0x87, - 0x30, 0xaf, 0xdd, 0x88, 0xef, 0x5e, 0xba, 0xfd, 0x68, 0x27, 0xcd, 0xbe, 0xc7, 0xb6, 0x96, 0xe6, - 0x42, 0x34, 0x56, 0xb1, 0xfe, 0x05, 0x23, 0x31, 0x39, 0x62, 0x17, 0x6d, 0x40, 0x45, 0xbf, 0x6d, - 0xff, 0x9c, 0x7a, 0x57, 0x35, 0x94, 0xfe, 0xf4, 0xd7, 0xa3, 0x0c, 0xdb, 0x81, 0xc6, 0xf4, 0x4b, - 0x45, 0x91, 0x4c, 0x49, 0x7b, 0x5d, 0x69, 0x6d, 0x0a, 0x99, 0x78, 0xdf, 0x88, 0x1d, 0xd0, 0xad, - 0x8a, 0xe8, 0x77, 0x7e, 0x3c, 0x7f, 0xfa, 0x54, 0x4f, 0xfe, 0xfe, 0x4f, 0x54, 0x5b, 0xda, 0x2f, - 0x3f, 0xdd, 0xcb, 0x3c, 0xca, 0xb0, 0xdf, 0xcb, 0x40, 0x35, 0xf1, 0x3a, 0x48, 0x22, 0x6f, 0x7d, - 0x6a, 0x9c, 0x4d, 0x1d, 0xa7, 0x0f, 0xd4, 0x30, 0x71, 0x12, 0x77, 0xee, 0x7f, 0x3f, 0xb1, 0x48, - 0x5f, 0x25, 0x22, 0x70, 0x0f, 0xa6, 0x7f, 0x08, 0xe8, 0xeb, 0x69, 0x02, 0xfd, 0x99, 0xbd, 0xaf, - 0x1f, 0x65, 0xd8, 0xbf, 0xcb, 0x40, 0x3d, 0x19, 0x5a, 0x8f, 0x86, 0x9b, 0x1a, 0xc4, 0x8f, 0x58, - 0xe9, 0x8a, 0x78, 0xfc, 0x0f, 0xb1, 0x97, 0xbd, 0xfb, 0x66, 0xa2, 0x97, 0xf2, 0xb1, 0xe3, 0x5f, - 0xac, 0xb7, 0xec, 0x63, 0xfa, 0xdd, 0x3d, 0x95, 0x47, 0xc4, 0x66, 0x7f, 0xa7, 0x2d, 0x62, 0x3f, - 0xfd, 0x57, 0xcd, 0x70, 0x11, 0x7e, 0x4c, 0x3f, 0x78, 0xa3, 0xd2, 0x52, 0x04, 0x17, 0xbf, 0x6c, - 0x79, 0xe3, 0x75, 0x1c, 0xd3, 0x2b, 0xc6, 0xf5, 0xc4, 0x98, 0xa6, 0x15, 0x8f, 0x16, 0xf5, 0x4e, - 0xfe, 0x28, 0x59, 0x7c, 0x72, 0xce, 0xfc, 0x50, 0xd9, 0xd5, 0x9d, 0x1c, 0x51, 0x27, 0x25, 0x79, - 0x62, 0xab, 0xbd, 0x64, 0x35, 0xc6, 0x7d, 0xec, 0xeb, 0xeb, 0xc6, 0xed, 0x2b, 0xfb, 0xfa, 0x10, - 0xc3, 0xe4, 0xa2, 0xc7, 0x07, 0x00, 0x71, 0x9e, 0x1f, 0x9b, 0xca, 0x36, 0x8b, 0x04, 0xd0, 0x6c, - 0x2a, 0x60, 0x72, 0x3f, 0xab, 0xa4, 0x34, 0x51, 0xe3, 0x8f, 0x48, 0x9c, 0x46, 0x79, 0x70, 0xba, - 0xf6, 0x95, 0x4c, 0xc9, 0x4b, 0x68, 0x5f, 0xd3, 0xf5, 0x27, 0x84, 0x69, 0x94, 0xf4, 0x76, 0x08, - 0xb5, 0x1d, 0xcf, 0x7b, 0x36, 0x19, 0x47, 0xb9, 0xe5, 0xc9, 0xdc, 0x95, 0x6d, 0x3b, 0x38, 0x5d, - 0x9b, 0x1a, 0x85, 0x71, 0x07, 0xab, 0x5a, 0x63, 0x4d, 0xad, 0xaa, 0x87, 0x5f, 0xc5, 0xc9, 0x85, - 0x5f, 0x33, 0x1b, 0x16, 0x22, 0x19, 0x1d, 0x27, 0xf0, 0x25, 0xab, 0x49, 0x48, 0xe6, 0xe9, 0x26, - 0x12, 0x66, 0x82, 0xea, 0xed, 0xc3, 0x40, 0xd5, 0xf9, 0x28, 0xc3, 0x0e, 0xa0, 0xba, 0xc9, 0xfb, - 0x78, 0x4b, 0x1e, 0x33, 0x40, 0x16, 0x13, 0xd9, 0x04, 0x94, 0x3a, 0xb2, 0x56, 0x4b, 0x00, 0x93, - 0xe7, 0xd6, 0xd8, 0xbe, 0xf4, 0xf9, 0x97, 0x0f, 0xbf, 0x92, 0xb9, 0x25, 0x5f, 0xab, 0x73, 0x4b, - 0xe5, 0xde, 0x24, 0xce, 0xad, 0xa9, 0x64, 0x9d, 0xc4, 0xb9, 0x35, 0x93, 0xac, 0x93, 0x98, 0x6a, - 0x95, 0xfb, 0xc3, 0x86, 0xb0, 0x30, 0x93, 0xdf, 0x13, 0x1d, 0x59, 0x57, 0x65, 0x05, 0xad, 0xdd, - 0xb9, 0x9a, 0x20, 0xd9, 0xda, 0xfd, 0x64, 0x6b, 0x5d, 0xa8, 0xd1, 0xcb, 0x7f, 0x47, 0x9c, 0xee, - 0xcb, 0x4d, 0x3d, 0x36, 0xa3, 0x5f, 0xc6, 0x9b, 0x3e, 0x60, 0x10, 0x97, 0xd4, 0x70, 0xf0, 0xa2, - 0x1a, 0xfb, 0x11, 0x54, 0x9e, 0xf0, 0x50, 0x5d, 0x90, 0x8b, 0x74, 0xec, 0xa9, 0x1b, 0x73, 0x6b, - 0x29, 0xf7, 0xeb, 0x92, 0x3c, 0x83, 0xb5, 0x3d, 0xe4, 0x83, 0x13, 0x4e, 0xc2, 0xc9, 0x72, 0x06, - 0x5f, 0xb3, 0x1f, 0x60, 0xe5, 0xd1, 0xbd, 0xe4, 0x15, 0xed, 0x06, 0x94, 0x5e, 0xf9, 0xfc, 0x14, - 0x3c, 0xad, 0x66, 0xd7, 0x1b, 0x70, 0x4d, 0xd7, 0x73, 0xa1, 0xa2, 0xbd, 0x5f, 0x10, 0x6d, 0xa0, - 0xd9, 0xf7, 0x2a, 0xa2, 0x0d, 0x94, 0xf2, 0xdc, 0x81, 0x71, 0x0f, 0xdb, 0x31, 0xd8, 0x9d, 0xb8, - 0x1d, 0x7a, 0xe2, 0x20, 0x6e, 0xe9, 0xe1, 0x57, 0xf6, 0x28, 0xfc, 0x9a, 0x7d, 0x8e, 0xef, 0x6b, - 0xeb, 0x17, 0x00, 0x63, 0xa3, 0x61, 0xfa, 0xae, 0x60, 0x34, 0x59, 0x1a, 0x2a, 0x69, 0x48, 0x50, - 0x53, 0xa8, 0xc9, 0xbd, 0x0f, 0xd0, 0x0d, 0xbd, 0xf1, 0xa6, 0xcd, 0x47, 0x9e, 0x1b, 0xcb, 0xda, - 0xf8, 0x4a, 0x5a, 0x2c, 0xbf, 0xb4, 0x7b, 0x69, 0xec, 0x73, 0xcd, 0xca, 0x4a, 0xdc, 0xa1, 0x54, - 0xcc, 0x75, 0xe5, 0xad, 0xb5, 0x68, 0x42, 0x52, 0x6e, 0xae, 0x3d, 0xca, 0xb0, 0x16, 0x40, 0x9c, - 0xe0, 0x15, 0xd9, 0x4c, 0x33, 0xb9, 0x63, 0x91, 0xd8, 0x4b, 0xc9, 0x06, 0x3b, 0x80, 0x72, 0x9c, - 0x19, 0xb3, 0x1a, 0x3f, 0xc7, 0x92, 0xc8, 0xa3, 0x89, 0x4e, 0xf0, 0x99, 0xac, 0x14, 0xa3, 0x81, - 0x53, 0x05, 0xac, 0x24, 0xa6, 0xea, 0x98, 0xf3, 0x80, 0x39, 0xb0, 0x48, 0x1d, 0x8c, 0xd4, 0x25, - 0xbc, 0x4a, 0x15, 0x3d, 0xa3, 0x3e, 0x9b, 0x20, 0x12, 0xed, 0xe6, 0xd4, 0x34, 0x87, 0x84, 0xeb, - 0x47, 0x70, 0x2b, 0x5d, 0xe3, 0x12, 0xa2, 0x79, 0x04, 0x0b, 0x33, 0x91, 0xf4, 0x68, 0x4b, 0x5f, - 0x95, 0x1a, 0x11, 0x6d, 0xe9, 0x2b, 0x83, 0xf0, 0xc6, 0x32, 0x36, 0x39, 0x6f, 0x00, 0x9a, 0x7a, - 0xe7, 0x4e, 0xd8, 0x3f, 0x15, 0xcd, 0xfd, 0xeb, 0x0c, 0x2c, 0xa6, 0xc4, 0xca, 0xd9, 0xab, 0xca, - 0x6b, 0x70, 0x65, 0x1c, 0x7d, 0x2d, 0x35, 0xa6, 0x6a, 0x74, 0xb1, 0x9d, 0x5d, 0xf6, 0x34, 0x71, - 0xb0, 0x51, 0x48, 0x53, 0xee, 0xcc, 0xe7, 0x2a, 0x15, 0xa9, 0x1a, 0xc5, 0x97, 0xb0, 0x4a, 0x1d, - 0x69, 0x0d, 0x87, 0x53, 0xf1, 0xde, 0x57, 0x66, 0x7e, 0x97, 0x3b, 0x11, 0xc3, 0x5e, 0xbb, 0xfa, - 0x77, 0xbb, 0xaf, 0x50, 0xa7, 0xa9, 0xab, 0x6c, 0x02, 0x8d, 0xe9, 0x38, 0x2a, 0xbb, 0xba, 0xae, - 0xb5, 0xdb, 0x09, 0xfb, 0x37, 0x25, 0xf6, 0xfa, 0x1d, 0x6c, 0xec, 0xb6, 0xb1, 0x96, 0x36, 0x2f, - 0x64, 0x12, 0x8b, 0xf5, 0xf8, 0x1b, 0x51, 0xd0, 0x77, 0x6a, 0x9c, 0xaa, 0x81, 0xab, 0x42, 0xd4, - 0x91, 0x05, 0x9e, 0x1e, 0x33, 0x7e, 0x03, 0x9b, 0xbf, 0x63, 0xdc, 0x48, 0x6b, 0xde, 0xa7, 0x22, - 0x64, 0x8b, 0xaf, 0x4e, 0xef, 0x6b, 0xd5, 0x83, 0x3b, 0x69, 0xeb, 0x7d, 0xa5, 0x2d, 0x34, 0x35, - 0xd7, 0xd7, 0x50, 0xb7, 0xab, 0xea, 0x41, 0xde, 0x68, 0xfb, 0xa4, 0x44, 0x93, 0xa3, 0xed, 0x93, - 0x16, 0x15, 0x4e, 0xea, 0x35, 0x2a, 0x1e, 0xfc, 0x71, 0xe6, 0xfe, 0xfa, 0xdd, 0x1f, 0x7e, 0xe7, - 0xc4, 0x09, 0x4f, 0x27, 0x47, 0x0f, 0xfa, 0xde, 0xe8, 0xe1, 0x50, 0x79, 0x1b, 0xe5, 0x7d, 0xe3, - 0x87, 0x43, 0x77, 0xf0, 0x10, 0xab, 0x3d, 0x9a, 0x1b, 0xfb, 0x5e, 0xe8, 0x7d, 0xf7, 0xff, 0x05, - 0x00, 0x00, 0xff, 0xff, 0x41, 0x79, 0x30, 0x63, 0x7a, 0x80, 0x00, 0x00, + // 11110 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x5b, 0x8f, 0x1c, 0x47, + 0x96, 0x18, 0xcc, 0xba, 0x75, 0x55, 0x9d, 0xba, 0x74, 0x75, 0xf4, 0xad, 0xd8, 0x24, 0x45, 0x2a, + 0xa5, 0x11, 0x29, 0x4a, 0x22, 0x29, 0x8e, 0x6e, 0x2b, 0x7d, 0xdf, 0xec, 0x56, 0x77, 0x57, 0xb3, + 0x6b, 0xd8, 0x37, 0x65, 0x55, 0x4b, 0xab, 0x19, 0xaf, 0x73, 0xb2, 0xab, 0xa2, 0xbb, 0x73, 0x59, + 0x95, 0x59, 0xca, 0xcc, 0xea, 0xcb, 0x08, 0xf2, 0x83, 0x2f, 0x0b, 0xc3, 0x36, 0x0c, 0x2c, 0xec, + 0x31, 0xe0, 0xb1, 0x17, 0x36, 0x6c, 0x18, 0x86, 0x61, 0x63, 0xb1, 0xc6, 0xac, 0x01, 0x3f, 0xf8, + 0x7d, 0x5f, 0x6c, 0xec, 0xc3, 0xae, 0x5f, 0x8c, 0xc1, 0x02, 0x0b, 0xaf, 0xc7, 0xaf, 0xfe, 0x09, + 0x46, 0x9c, 0x13, 0x91, 0x19, 0x59, 0x95, 0x4d, 0x52, 0x9a, 0xf1, 0xbc, 0x90, 0x9d, 0xe7, 0x9c, + 0xb8, 0x9f, 0x38, 0x71, 0x6e, 0x11, 0x05, 0x65, 0x7f, 0xdc, 0x7f, 0x30, 0xf6, 0xbd, 0xd0, 0x63, + 0x85, 0xa1, 0xeb, 0x8f, 0xfb, 0x6b, 0x37, 0x4f, 0x3c, 0xef, 0x64, 0xc8, 0x1f, 0xda, 0x63, 0xe7, + 0xa1, 0xed, 0xba, 0x5e, 0x68, 0x87, 0x8e, 0xe7, 0x06, 0x44, 0x64, 0xfc, 0x08, 0xea, 0x4f, 0xb8, + 0xdb, 0xe5, 0x7c, 0x60, 0xf2, 0x2f, 0x27, 0x3c, 0x08, 0xd9, 0x5b, 0xb0, 0x60, 0xf3, 0x1f, 0x73, + 0x3e, 0xb0, 0xc6, 0x76, 0x10, 0x8c, 0x4f, 0x7d, 0x3b, 0xe0, 0xcd, 0xcc, 0x9d, 0xcc, 0xbd, 0xaa, + 0xd9, 0x20, 0xc4, 0x41, 0x04, 0x67, 0xaf, 0x42, 0x35, 0x10, 0xa4, 0xdc, 0x0d, 0x7d, 0x6f, 0x7c, + 0xd9, 0xcc, 0x22, 0x5d, 0x45, 0xc0, 0xda, 0x04, 0x32, 0x86, 0x30, 0x1f, 0xb5, 0x10, 0x8c, 0x3d, + 0x37, 0xe0, 0xec, 0x11, 0x2c, 0xf5, 0x9d, 0xf1, 0x29, 0xf7, 0x2d, 0x2c, 0x3c, 0x72, 0xf9, 0xc8, + 0x73, 0x9d, 0x7e, 0x33, 0x73, 0x27, 0x77, 0xaf, 0x6c, 0x32, 0xc2, 0x89, 0x12, 0xbb, 0x12, 0xc3, + 0xee, 0xc2, 0x3c, 0x77, 0x09, 0xce, 0x07, 0x58, 0x4a, 0x36, 0x55, 0x8f, 0xc1, 0xa2, 0x80, 0xf1, + 0x77, 0xb3, 0xb0, 0xd0, 0x71, 0x9d, 0xf0, 0x73, 0x7b, 0x38, 0xe4, 0xa1, 0x1a, 0xd3, 0x5d, 0x98, + 0x3f, 0x47, 0x00, 0x8e, 0xe9, 0xdc, 0xf3, 0x07, 0x72, 0x44, 0x75, 0x02, 0x1f, 0x48, 0xe8, 0x95, + 0x3d, 0xcb, 0x5e, 0xd9, 0xb3, 0xd4, 0xe9, 0xca, 0x5d, 0x31, 0x5d, 0x77, 0x61, 0xde, 0xe7, 0x7d, + 0xef, 0x8c, 0xfb, 0x97, 0xd6, 0xb9, 0xe3, 0x0e, 0xbc, 0xf3, 0x66, 0xfe, 0x4e, 0xe6, 0x5e, 0xc1, + 0xac, 0x2b, 0xf0, 0xe7, 0x08, 0x65, 0xeb, 0x30, 0xdf, 0x3f, 0xb5, 0x5d, 0x97, 0x0f, 0xad, 0x23, + 0xbb, 0xff, 0x6c, 0x32, 0x0e, 0x9a, 0x85, 0x3b, 0x99, 0x7b, 0x95, 0xc7, 0xd7, 0x1f, 0xe0, 0xaa, + 0x3e, 0xd8, 0x38, 0xb5, 0xdd, 0x75, 0xc4, 0x74, 0x5d, 0x7b, 0x1c, 0x9c, 0x7a, 0xa1, 0x59, 0x97, + 0x25, 0x08, 0x1c, 0x18, 0x4b, 0xc0, 0xf4, 0x99, 0xa0, 0xb9, 0x37, 0xfe, 0x7d, 0x06, 0x16, 0x0f, + 0xdd, 0xa1, 0xd7, 0x7f, 0xf6, 0x2d, 0xa7, 0x28, 0x65, 0x0c, 0xd9, 0x97, 0x1d, 0x43, 0xee, 0x9b, + 0x8e, 0x61, 0x05, 0x96, 0x92, 0x9d, 0x95, 0xa3, 0xe0, 0xb0, 0x2c, 0x4a, 0x9f, 0x70, 0xd5, 0x2d, + 0x35, 0x8c, 0x37, 0xa1, 0xd1, 0x9f, 0xf8, 0x3e, 0x77, 0x67, 0xc6, 0x31, 0x2f, 0xe1, 0xd1, 0x40, + 0x5e, 0x85, 0xaa, 0xcb, 0xcf, 0x63, 0x32, 0xc9, 0xbb, 0x2e, 0x3f, 0x57, 0x24, 0x46, 0x13, 0x56, + 0xa6, 0x9b, 0x91, 0x1d, 0xf8, 0x45, 0x06, 0xf2, 0x87, 0xe1, 0x85, 0xc7, 0xde, 0x87, 0xaa, 0x3d, + 0x18, 0xf8, 0x3c, 0x08, 0xac, 0xf0, 0x72, 0x4c, 0x3b, 0xa5, 0xfe, 0x98, 0xc9, 0x21, 0xb6, 0x08, + 0xd5, 0xbb, 0x1c, 0x73, 0xb3, 0x62, 0xc7, 0x1f, 0xac, 0x09, 0x45, 0xf9, 0x89, 0xed, 0x96, 0x4d, + 0xf5, 0xc9, 0x6e, 0x01, 0xd8, 0x23, 0x6f, 0xe2, 0x86, 0x56, 0x60, 0x87, 0x38, 0x63, 0x39, 0xb3, + 0x4c, 0x90, 0xae, 0x1d, 0xb2, 0x1b, 0x50, 0x1e, 0x3f, 0xb3, 0x82, 0xbe, 0xef, 0x8c, 0x43, 0x64, + 0x9e, 0xb2, 0x59, 0x1a, 0x3f, 0xeb, 0xe2, 0x37, 0x7b, 0x0b, 0x4a, 0xde, 0x24, 0x1c, 0x7b, 0x8e, + 0x1b, 0x4a, 0x7e, 0x99, 0x97, 0x1d, 0xd9, 0x9f, 0x84, 0x07, 0x02, 0x6c, 0x46, 0x04, 0xec, 0x75, + 0xa8, 0xf5, 0x3d, 0xf7, 0xd8, 0xf1, 0x47, 0x24, 0x11, 0x9a, 0x73, 0xd8, 0x56, 0x12, 0x68, 0xfc, + 0x51, 0x16, 0x2a, 0x3d, 0xdf, 0x76, 0x03, 0xbb, 0x2f, 0x00, 0x6c, 0x15, 0x8a, 0xe1, 0x85, 0x75, + 0x6a, 0x07, 0xa7, 0x38, 0xd4, 0xb2, 0x39, 0x17, 0x5e, 0x6c, 0xdb, 0xc1, 0x29, 0x5b, 0x81, 0x39, + 0xea, 0x25, 0x0e, 0x28, 0x67, 0xca, 0x2f, 0xb1, 0x41, 0xdc, 0xc9, 0xc8, 0x4a, 0x36, 0x95, 0x43, + 0x8e, 0x69, 0xb8, 0x93, 0xd1, 0x86, 0x0e, 0x17, 0x83, 0x3f, 0x12, 0xcb, 0x4d, 0x0d, 0xd0, 0xf0, + 0xca, 0x08, 0xc1, 0x36, 0x5e, 0x85, 0xaa, 0x44, 0x73, 0xe7, 0xe4, 0x94, 0xc6, 0x58, 0x30, 0x2b, + 0x44, 0x80, 0x20, 0x51, 0x43, 0xe8, 0x8c, 0xb8, 0x15, 0x84, 0xf6, 0x68, 0x2c, 0x87, 0x54, 0x16, + 0x90, 0xae, 0x00, 0x20, 0xda, 0x0b, 0xed, 0xa1, 0x75, 0xcc, 0x79, 0xd0, 0x2c, 0x4a, 0xb4, 0x80, + 0x6c, 0x71, 0x1e, 0xb0, 0xef, 0x40, 0x7d, 0xc0, 0x83, 0xd0, 0x92, 0x8b, 0xc1, 0x83, 0x66, 0x09, + 0x77, 0x7e, 0x4d, 0x40, 0x5b, 0x0a, 0xc8, 0x6e, 0x02, 0xf8, 0xf6, 0xb9, 0x25, 0x26, 0x82, 0x5f, + 0x34, 0xcb, 0xb4, 0x0a, 0xbe, 0x7d, 0xde, 0xbb, 0xd8, 0xe6, 0x17, 0x82, 0x6b, 0x9e, 0xf0, 0x50, + 0x9b, 0xb4, 0x40, 0x72, 0xa7, 0xb1, 0x03, 0x4c, 0x03, 0x6f, 0xf2, 0xd0, 0x76, 0x86, 0x01, 0xfb, + 0x00, 0xaa, 0xa1, 0x46, 0x8c, 0x62, 0xb0, 0x12, 0xb1, 0x90, 0x56, 0xc0, 0x4c, 0xd0, 0x19, 0xa7, + 0x50, 0xda, 0xe2, 0x7c, 0xc7, 0x19, 0x39, 0x21, 0x5b, 0x81, 0xc2, 0xb1, 0x73, 0xc1, 0x89, 0xd9, + 0x73, 0xdb, 0xd7, 0x4c, 0xfa, 0x64, 0xb7, 0x01, 0xf0, 0x0f, 0x6b, 0x14, 0x71, 0xd3, 0xf6, 0x35, + 0xb3, 0x8c, 0xb0, 0xdd, 0xc0, 0x0e, 0xd9, 0x1a, 0x14, 0xc7, 0xdc, 0xef, 0x73, 0xb5, 0x6e, 0xdb, + 0xd7, 0x4c, 0x05, 0x58, 0x2f, 0x42, 0x61, 0x28, 0x6a, 0x37, 0xfe, 0xa4, 0x00, 0x95, 0x2e, 0x77, + 0xa3, 0x5d, 0xc6, 0x20, 0x2f, 0x26, 0x44, 0xee, 0x2c, 0xfc, 0x9b, 0xbd, 0x06, 0x15, 0x9c, 0xba, + 0x20, 0xf4, 0x1d, 0xf7, 0x84, 0xb8, 0x7a, 0x3d, 0xdb, 0xcc, 0x98, 0x20, 0xc0, 0x5d, 0x84, 0xb2, + 0x06, 0xe4, 0xec, 0x91, 0xe2, 0x6a, 0xf1, 0x27, 0xbb, 0x0e, 0x25, 0x7b, 0x14, 0x52, 0xf7, 0xaa, + 0x08, 0x2e, 0xda, 0xa3, 0x10, 0xbb, 0xf6, 0x2a, 0x54, 0xc7, 0xf6, 0xe5, 0x48, 0xec, 0xe5, 0x88, + 0x1d, 0xaa, 0x66, 0x45, 0xc2, 0x90, 0x21, 0x1e, 0xc3, 0xa2, 0x4e, 0xa2, 0x1a, 0x2f, 0x44, 0x8d, + 0x2f, 0x68, 0xd4, 0xb2, 0x0f, 0x77, 0x61, 0x5e, 0x95, 0xf1, 0x69, 0x3c, 0xc8, 0x26, 0x65, 0xb3, + 0x2e, 0xc1, 0x6a, 0x94, 0xf7, 0xa0, 0x71, 0xec, 0xb8, 0xf6, 0xd0, 0xea, 0x0f, 0xc3, 0x33, 0x6b, + 0xc0, 0x87, 0xa1, 0x8d, 0x1c, 0x53, 0x30, 0xeb, 0x08, 0xdf, 0x18, 0x86, 0x67, 0x9b, 0x02, 0xca, + 0xde, 0x86, 0xf2, 0x31, 0xe7, 0x16, 0x4e, 0x56, 0xb3, 0x94, 0xd8, 0x78, 0x6a, 0x85, 0xcc, 0xd2, + 0xb1, 0x5a, 0xab, 0xb7, 0xa1, 0xe1, 0x4d, 0xc2, 0x13, 0xcf, 0x71, 0x4f, 0x2c, 0x21, 0xef, 0x2c, + 0x67, 0x80, 0x3c, 0x94, 0x5f, 0xcf, 0x3e, 0xca, 0x98, 0x75, 0x85, 0x13, 0x92, 0xa7, 0x33, 0x60, + 0x6f, 0xc0, 0xfc, 0xd0, 0x0e, 0x42, 0xeb, 0xd4, 0x1b, 0x5b, 0xe3, 0xc9, 0xd1, 0x33, 0x7e, 0xd9, + 0xac, 0xe1, 0x44, 0xd4, 0x04, 0x78, 0xdb, 0x1b, 0x1f, 0x20, 0x50, 0x70, 0x36, 0xf6, 0x93, 0x3a, + 0x01, 0x77, 0x32, 0xf7, 0x6a, 0x66, 0x59, 0x40, 0xa8, 0xd1, 0x2f, 0x60, 0x11, 0x97, 0xa7, 0x3f, + 0x09, 0x42, 0x6f, 0x64, 0x09, 0x59, 0xed, 0x0f, 0x82, 0x66, 0x05, 0x79, 0xed, 0x4d, 0xd9, 0x59, + 0x6d, 0x8d, 0x1f, 0x6c, 0xf2, 0x20, 0xdc, 0x40, 0x62, 0x93, 0x68, 0xc5, 0x81, 0x7e, 0x69, 0x2e, + 0x0c, 0xa6, 0xe1, 0xec, 0x6d, 0x60, 0xf6, 0x70, 0xe8, 0x9d, 0x5b, 0x01, 0x1f, 0x1e, 0x5b, 0x72, + 0x12, 0x9b, 0xf5, 0x3b, 0x99, 0x7b, 0x25, 0xb3, 0x81, 0x98, 0x2e, 0x1f, 0x1e, 0x1f, 0x10, 0x9c, + 0x7d, 0x00, 0xb8, 0x99, 0xac, 0x63, 0x6e, 0x87, 0x13, 0x9f, 0x07, 0xcd, 0xf9, 0x3b, 0xb9, 0x7b, + 0xf5, 0xc7, 0x0b, 0xd1, 0x7c, 0x21, 0x78, 0xdd, 0x09, 0xcd, 0xaa, 0xa0, 0x93, 0xdf, 0xc1, 0xda, + 0x26, 0xac, 0xa4, 0x77, 0x49, 0x30, 0x95, 0x98, 0x15, 0xc1, 0x8c, 0x79, 0x53, 0xfc, 0xc9, 0x96, + 0xa0, 0x70, 0x66, 0x0f, 0x27, 0x5c, 0xca, 0x74, 0xfa, 0xf8, 0x38, 0xfb, 0x51, 0xc6, 0xf8, 0xe3, + 0x0c, 0x54, 0x69, 0x94, 0x52, 0x17, 0x79, 0x0d, 0x6a, 0x8a, 0x1b, 0xb8, 0xef, 0x7b, 0xbe, 0x94, + 0x6a, 0x8a, 0xf3, 0xda, 0x02, 0x26, 0x4e, 0x15, 0x45, 0x34, 0xf6, 0xb9, 0x33, 0xb2, 0x4f, 0x54, + 0xd5, 0x8a, 0x95, 0x0e, 0x24, 0x98, 0xbd, 0x1b, 0xd7, 0xe7, 0x7b, 0x93, 0x90, 0xcb, 0x33, 0xaf, + 0x2a, 0x87, 0x67, 0x0a, 0x58, 0x54, 0x3b, 0x7e, 0xbd, 0x04, 0x9f, 0x1b, 0x3f, 0xc9, 0x00, 0x13, + 0xdd, 0xee, 0x79, 0x54, 0x81, 0xe4, 0xd0, 0xe9, 0x92, 0x99, 0x97, 0xde, 0x21, 0xd9, 0xe7, 0xed, + 0x10, 0x03, 0x0a, 0xd4, 0xf7, 0x7c, 0x4a, 0xdf, 0x09, 0xf5, 0xfd, 0x7c, 0x29, 0xd7, 0xc8, 0x1b, + 0xff, 0x23, 0x07, 0x4b, 0x1b, 0x74, 0x64, 0xb7, 0xfa, 0x7d, 0x3e, 0x8e, 0xf6, 0xce, 0x6d, 0xa8, + 0xb8, 0xde, 0x80, 0x2b, 0x8e, 0xa5, 0x8e, 0x81, 0x00, 0x69, 0xec, 0x7a, 0x6a, 0x3b, 0x2e, 0x75, + 0x9c, 0x26, 0xb3, 0x8c, 0x10, 0xec, 0xf6, 0x1b, 0x30, 0x3f, 0xe6, 0xee, 0x40, 0xdf, 0x22, 0xa4, + 0x54, 0xd5, 0x24, 0x58, 0xee, 0x8e, 0xdb, 0x50, 0x39, 0x9e, 0x10, 0x9d, 0x10, 0x2c, 0x79, 0xe4, + 0x01, 0x90, 0xa0, 0x16, 0xc9, 0x97, 0xf1, 0x24, 0x38, 0x45, 0x6c, 0x01, 0xb1, 0x45, 0xf1, 0x2d, + 0x50, 0xb7, 0x00, 0x06, 0x93, 0x20, 0x94, 0x3b, 0x66, 0x0e, 0x91, 0x65, 0x01, 0xa1, 0x1d, 0xf3, + 0x0e, 0x2c, 0x8e, 0xec, 0x0b, 0x0b, 0x79, 0xc7, 0x72, 0x5c, 0xeb, 0x78, 0x88, 0x67, 0x4e, 0x11, + 0xe9, 0x1a, 0x23, 0xfb, 0xe2, 0x33, 0x81, 0xe9, 0xb8, 0x5b, 0x08, 0x17, 0x62, 0x45, 0xa9, 0x3b, + 0x3e, 0x0f, 0xb8, 0x7f, 0xc6, 0x51, 0x12, 0xe4, 0x23, 0x9d, 0xc6, 0x24, 0xa8, 0xe8, 0xd1, 0x48, + 0x8c, 0x3b, 0x1c, 0xf6, 0x69, 0xdb, 0x9b, 0xc5, 0x91, 0xe3, 0x6e, 0x87, 0xc3, 0xbe, 0x38, 0x57, + 0x84, 0x1c, 0x19, 0x73, 0xdf, 0x7a, 0x76, 0x8e, 0x7b, 0x38, 0x8f, 0x72, 0xe3, 0x80, 0xfb, 0x4f, + 0xcf, 0xc5, 0xd1, 0xdf, 0x0f, 0x50, 0x10, 0xd9, 0x97, 0xcd, 0x0a, 0x6e, 0xf0, 0x52, 0x3f, 0x10, + 0x22, 0xc8, 0xbe, 0x14, 0x9b, 0x50, 0xf4, 0xd6, 0xc6, 0x55, 0xe0, 0x03, 0xac, 0x3e, 0x40, 0x89, + 0x5a, 0xc3, 0xce, 0xb6, 0x24, 0x42, 0xb4, 0x13, 0x08, 0xae, 0x57, 0x9d, 0x3d, 0x1e, 0xda, 0x27, + 0x01, 0x8a, 0x94, 0x9a, 0x59, 0x95, 0xc0, 0x2d, 0x01, 0x33, 0x3e, 0x27, 0x25, 0x4b, 0x5b, 0x5b, + 0xb9, 0x67, 0xc4, 0x51, 0x8f, 0x10, 0x5c, 0xd7, 0x92, 0x29, 0xbf, 0xd2, 0x16, 0x2d, 0x9b, 0xb2, + 0x68, 0xc6, 0x1f, 0x64, 0xa0, 0x2a, 0x6b, 0x46, 0xa5, 0x84, 0x3d, 0x00, 0xa6, 0x56, 0x31, 0xbc, + 0x70, 0x06, 0xd6, 0xd1, 0x65, 0xc8, 0x03, 0x62, 0x9a, 0xed, 0x6b, 0x66, 0x43, 0xe2, 0x7a, 0x17, + 0xce, 0x60, 0x5d, 0x60, 0xd8, 0x7d, 0x68, 0x24, 0xe8, 0x83, 0xd0, 0x27, 0x8e, 0xde, 0xbe, 0x66, + 0xd6, 0x35, 0xea, 0x6e, 0xe8, 0x8b, 0x3d, 0x22, 0x54, 0x9e, 0x49, 0x68, 0x39, 0xee, 0x80, 0x5f, + 0x20, 0x1b, 0xd5, 0xcc, 0x0a, 0xc1, 0x3a, 0x02, 0xb4, 0x5e, 0x87, 0xaa, 0x5e, 0x9d, 0x71, 0x02, + 0x25, 0xa5, 0x2f, 0xa1, 0xc2, 0x30, 0xd5, 0x25, 0xb3, 0x1c, 0x46, 0x3d, 0xb9, 0x0e, 0xa5, 0x64, + 0x0f, 0xcc, 0x62, 0xf8, 0xd2, 0x0d, 0x1b, 0xdf, 0x83, 0xc6, 0x8e, 0x60, 0x1e, 0x57, 0x30, 0xab, + 0xd4, 0xff, 0x56, 0x60, 0x4e, 0xdb, 0x34, 0x65, 0x53, 0x7e, 0x89, 0x33, 0xf7, 0xd4, 0x0b, 0x42, + 0xd9, 0x0a, 0xfe, 0x6d, 0xfc, 0x49, 0x06, 0x58, 0x3b, 0x08, 0x9d, 0x91, 0x1d, 0xf2, 0x2d, 0x1e, + 0x89, 0x85, 0x7d, 0xa8, 0x8a, 0xda, 0x7a, 0x5e, 0x8b, 0x14, 0x32, 0x52, 0x28, 0xde, 0x92, 0xdb, + 0x78, 0xb6, 0xc0, 0x03, 0x9d, 0x9a, 0xc4, 0x7c, 0xa2, 0x02, 0xb1, 0xcb, 0x42, 0xdb, 0x3f, 0xe1, + 0x21, 0xaa, 0x71, 0x52, 0xdf, 0x07, 0x02, 0x09, 0x05, 0x6e, 0xed, 0x37, 0x61, 0x61, 0xa6, 0x0e, + 0x5d, 0x2e, 0x97, 0x53, 0xe4, 0x72, 0x4e, 0x97, 0xcb, 0x16, 0x2c, 0x26, 0xfa, 0x25, 0x39, 0x6d, + 0x15, 0x8a, 0x62, 0x43, 0x08, 0xe5, 0x20, 0x43, 0x5a, 0xe5, 0x31, 0xe7, 0x42, 0x0d, 0x7e, 0x08, + 0x4b, 0xc7, 0x9c, 0xfb, 0x76, 0x88, 0x48, 0xdc, 0x31, 0x62, 0x85, 0x64, 0xc5, 0x0b, 0x12, 0xd7, + 0xb5, 0xc3, 0x03, 0xee, 0x8b, 0x95, 0x32, 0xfe, 0x67, 0x06, 0xe6, 0x85, 0x04, 0xdd, 0xb5, 0xdd, + 0x4b, 0x35, 0x4f, 0x3b, 0xa9, 0xf3, 0x74, 0x4f, 0x3b, 0x0c, 0x35, 0xea, 0x6f, 0x3a, 0x49, 0xb9, + 0xe9, 0x49, 0x62, 0x77, 0xa0, 0x9a, 0xe8, 0x6b, 0x01, 0xfb, 0x0a, 0x41, 0xd4, 0xc9, 0x5f, 0x7e, + 0x1a, 0xdf, 0x80, 0x46, 0xdc, 0x6d, 0x39, 0x87, 0x0c, 0xf2, 0x82, 0x25, 0x65, 0x05, 0xf8, 0xb7, + 0xf1, 0xcf, 0x33, 0x44, 0xb8, 0xe1, 0x39, 0x91, 0x76, 0x2a, 0x08, 0x85, 0xde, 0xab, 0x08, 0xc5, + 0xdf, 0x57, 0x6a, 0xf5, 0xbf, 0xfc, 0x60, 0xc5, 0xd6, 0x09, 0xb8, 0x3b, 0xb0, 0xec, 0xe1, 0x10, + 0x85, 0x6f, 0xc9, 0x2c, 0x8a, 0xef, 0xd6, 0x70, 0x68, 0xdc, 0x85, 0x05, 0xad, 0x77, 0xcf, 0x19, + 0xc7, 0x1e, 0xb0, 0x1d, 0x27, 0x08, 0x0f, 0xdd, 0x60, 0xac, 0x29, 0x6e, 0x37, 0xa0, 0x2c, 0x24, + 0xac, 0xe8, 0x19, 0x6d, 0xd9, 0x82, 0x29, 0x44, 0xae, 0xe8, 0x57, 0x80, 0x48, 0xfb, 0x42, 0x22, + 0xb3, 0x12, 0x69, 0x5f, 0x20, 0xd2, 0xf8, 0x08, 0x16, 0x13, 0xf5, 0xc9, 0xa6, 0x5f, 0x85, 0xc2, + 0x24, 0xbc, 0xf0, 0x94, 0x6a, 0x5e, 0x91, 0x1c, 0x22, 0x0c, 0x40, 0x93, 0x30, 0xc6, 0x27, 0xb0, + 0xb0, 0xc7, 0xcf, 0xe5, 0x26, 0x56, 0x1d, 0x79, 0x03, 0xf2, 0x2f, 0x30, 0x0a, 0x11, 0x6f, 0x3c, + 0x00, 0xa6, 0x17, 0x96, 0xad, 0x6a, 0x36, 0x62, 0x26, 0x61, 0x23, 0x1a, 0x6f, 0x00, 0xeb, 0x3a, + 0x27, 0xee, 0x2e, 0x0f, 0x02, 0xfb, 0x24, 0xda, 0xf6, 0x0d, 0xc8, 0x8d, 0x82, 0x13, 0x29, 0xa3, + 0xc4, 0x9f, 0xc6, 0x77, 0x61, 0x31, 0x41, 0x27, 0x2b, 0xbe, 0x09, 0xe5, 0xc0, 0x39, 0x71, 0x51, + 0xb1, 0x92, 0x55, 0xc7, 0x00, 0x63, 0x0b, 0x96, 0x3e, 0xe3, 0xbe, 0x73, 0x7c, 0xf9, 0xa2, 0xea, + 0x93, 0xf5, 0x64, 0xa7, 0xeb, 0x69, 0xc3, 0xf2, 0x54, 0x3d, 0xb2, 0x79, 0x62, 0x5f, 0xb9, 0x92, + 0x25, 0x93, 0x3e, 0x34, 0xb9, 0x97, 0xd5, 0xe5, 0x9e, 0x71, 0x08, 0x6c, 0xc3, 0x73, 0x5d, 0xde, + 0x0f, 0x0f, 0x38, 0xf7, 0x63, 0x2f, 0x55, 0xcc, 0xab, 0x95, 0xc7, 0xab, 0x72, 0x66, 0xa7, 0x85, + 0xa9, 0x64, 0x62, 0x06, 0xf9, 0x31, 0xf7, 0x47, 0x58, 0x71, 0xc9, 0xc4, 0xbf, 0x8d, 0x65, 0x58, + 0x4c, 0x54, 0x2b, 0xed, 0xfa, 0x47, 0xb0, 0xbc, 0xe9, 0x04, 0xfd, 0xd9, 0x06, 0x57, 0xa1, 0x38, + 0x9e, 0x1c, 0x59, 0x49, 0xb9, 0xfc, 0x94, 0x5f, 0x0a, 0x6b, 0x6f, 0xba, 0x84, 0xac, 0xeb, 0x6f, + 0x67, 0x20, 0xbf, 0xdd, 0xdb, 0xd9, 0x60, 0x6b, 0x50, 0x72, 0xdc, 0xbe, 0x37, 0x12, 0x8a, 0x17, + 0x8d, 0x39, 0xfa, 0xbe, 0x72, 0x83, 0xdd, 0x80, 0x32, 0xea, 0x6b, 0xc2, 0xb4, 0x95, 0xaa, 0x4f, + 0x49, 0x00, 0x76, 0xbc, 0xfe, 0x33, 0x61, 0x53, 0xf3, 0x8b, 0xb1, 0xe3, 0xa3, 0xd5, 0xac, 0x8c, + 0xe1, 0x3c, 0x9d, 0xf5, 0x31, 0x82, 0x2c, 0x62, 0xe3, 0x3f, 0x14, 0xa1, 0x28, 0x4f, 0x5b, 0x3a, + 0xb9, 0x43, 0xe7, 0x8c, 0xc7, 0x27, 0xb7, 0xf8, 0x12, 0xfa, 0x80, 0xcf, 0x47, 0x5e, 0x18, 0x29, + 0x6c, 0xb4, 0x06, 0x55, 0x02, 0x4a, 0x95, 0x4d, 0x53, 0x1a, 0xc8, 0xc5, 0x90, 0x23, 0xa2, 0xbe, + 0x7e, 0x94, 0xdf, 0x80, 0xa2, 0x3a, 0xfb, 0xf3, 0x91, 0x4d, 0x33, 0xd7, 0x27, 0x6d, 0x6d, 0x0d, + 0x4a, 0x7d, 0x7b, 0x6c, 0xf7, 0x9d, 0xf0, 0x52, 0x0a, 0x84, 0xe8, 0x5b, 0xd4, 0x3e, 0xf4, 0xfa, + 0xf6, 0xd0, 0x3a, 0xb2, 0x87, 0xb6, 0xdb, 0xe7, 0xd2, 0x76, 0xaf, 0x22, 0x70, 0x9d, 0x60, 0xc2, + 0x3e, 0x97, 0xfd, 0x54, 0x54, 0x64, 0xc2, 0xcb, 0xde, 0x2b, 0x32, 0xa1, 0x5c, 0x7a, 0xa3, 0x91, + 0x23, 0xac, 0x0c, 0x52, 0xc3, 0x72, 0x66, 0x99, 0x20, 0x5b, 0x1c, 0x47, 0x2b, 0xd1, 0xe7, 0x34, + 0x75, 0x65, 0x6a, 0x8a, 0x80, 0x9f, 0x93, 0x23, 0x61, 0x56, 0x17, 0xcb, 0x69, 0xba, 0xd8, 0x5b, + 0xb0, 0x30, 0x71, 0x03, 0x1e, 0x86, 0x43, 0x3e, 0x88, 0xfa, 0x52, 0x41, 0xa2, 0x46, 0x84, 0x50, + 0xdd, 0x79, 0x00, 0x8b, 0xe4, 0x74, 0x08, 0xec, 0xd0, 0x0b, 0x4e, 0x9d, 0xc0, 0x0a, 0x84, 0x85, + 0x44, 0xe6, 0xee, 0x02, 0xa2, 0xba, 0x12, 0xd3, 0x25, 0x13, 0x69, 0x75, 0x8a, 0xde, 0xe7, 0x7d, + 0xee, 0x9c, 0xf1, 0x01, 0xea, 0x69, 0x39, 0x73, 0x39, 0x51, 0xc6, 0x94, 0x48, 0x54, 0xba, 0x27, + 0x23, 0x6b, 0x32, 0x1e, 0xd8, 0x42, 0x59, 0xa9, 0x93, 0x32, 0xec, 0x4e, 0x46, 0x87, 0x04, 0x61, + 0x8f, 0x40, 0x69, 0x62, 0x52, 0x3f, 0x9c, 0x4f, 0xc8, 0x33, 0xc1, 0xac, 0x66, 0x55, 0x52, 0x90, + 0xa2, 0x98, 0xd0, 0x39, 0x1b, 0x53, 0x3a, 0x67, 0x13, 0x8a, 0x63, 0xdf, 0x39, 0xb3, 0x43, 0xde, + 0x5c, 0x20, 0x01, 0x2e, 0x3f, 0x85, 0x64, 0x70, 0x5c, 0x27, 0x74, 0xec, 0xd0, 0xf3, 0x9b, 0x0c, + 0x71, 0x31, 0x80, 0xdd, 0x87, 0x05, 0xe4, 0x91, 0x20, 0xb4, 0xc3, 0x49, 0x20, 0x35, 0xd0, 0x45, + 0x64, 0x26, 0xd4, 0xa1, 0xbb, 0x08, 0x47, 0x25, 0x94, 0x7d, 0x17, 0x56, 0x88, 0x2d, 0xb0, 0x84, + 0xd4, 0xac, 0x51, 0x21, 0x58, 0xc2, 0xa9, 0x58, 0x44, 0xac, 0xe0, 0x6f, 0xa9, 0x5f, 0x0b, 0xed, + 0xe0, 0x7d, 0x58, 0x95, 0x6c, 0x32, 0x53, 0x6a, 0x19, 0x4b, 0x2d, 0x11, 0x7a, 0xaa, 0xd8, 0x7d, + 0x58, 0x10, 0x5d, 0x72, 0xfa, 0x96, 0x2c, 0x2d, 0x76, 0xc2, 0x0a, 0xf6, 0x7e, 0x9e, 0x10, 0x26, + 0xc2, 0x9f, 0xf2, 0x4b, 0xc1, 0xca, 0x43, 0xe7, 0x98, 0x87, 0xce, 0x88, 0x37, 0x57, 0x89, 0x39, + 0xd4, 0xb7, 0xd8, 0x65, 0x93, 0x31, 0x62, 0x9a, 0xb4, 0xa7, 0xe9, 0x0b, 0xf9, 0x6e, 0xe8, 0x05, + 0x5c, 0xb9, 0x97, 0x9a, 0xd7, 0xe5, 0x06, 0x12, 0x40, 0x29, 0xb2, 0x8c, 0x9f, 0x65, 0xe8, 0x0c, + 0x92, 0x5b, 0x36, 0xd0, 0x2c, 0x2a, 0xda, 0xac, 0x96, 0xe7, 0x0e, 0x2f, 0xe5, 0xfe, 0x05, 0x02, + 0xed, 0xbb, 0x43, 0xdc, 0x40, 0x8e, 0xab, 0x93, 0x90, 0xb8, 0xab, 0x2a, 0x20, 0x12, 0xdd, 0x86, + 0xca, 0x78, 0x72, 0x34, 0x74, 0xfa, 0x44, 0x92, 0xa3, 0x5a, 0x08, 0x84, 0x04, 0xc2, 0xa4, 0xa4, + 0x45, 0x24, 0x8a, 0x3c, 0x52, 0x54, 0x24, 0x0c, 0x49, 0x50, 0x9c, 0x72, 0x1f, 0x77, 0x70, 0xd5, + 0xc4, 0xbf, 0x8d, 0x75, 0x58, 0x4a, 0x76, 0x5a, 0xca, 0xfa, 0xfb, 0x50, 0x92, 0xe2, 0x41, 0xf9, + 0x1a, 0xea, 0x9a, 0xf7, 0x57, 0x58, 0x45, 0x11, 0xde, 0xf8, 0xbd, 0x39, 0x58, 0x94, 0xd0, 0x0d, + 0x31, 0x23, 0xdd, 0xc9, 0x68, 0x64, 0xfb, 0x29, 0x72, 0x27, 0xf3, 0x7c, 0xb9, 0x93, 0x9d, 0x91, + 0x3b, 0x49, 0x63, 0x93, 0xc4, 0x56, 0xd2, 0xd8, 0x14, 0x4b, 0x40, 0xfa, 0xbf, 0xee, 0x7a, 0xac, + 0x49, 0x70, 0x8f, 0x5c, 0x9c, 0x33, 0x52, 0xb2, 0x90, 0x22, 0x25, 0x75, 0x19, 0x37, 0x37, 0x25, + 0xe3, 0x5e, 0x05, 0x5a, 0x6b, 0x25, 0xb2, 0x8b, 0x64, 0x12, 0x20, 0x4c, 0xfa, 0x2f, 0xef, 0xc2, + 0xfc, 0xb4, 0x58, 0x21, 0xf9, 0x55, 0x4f, 0x11, 0x2a, 0xce, 0x88, 0xe3, 0x01, 0xa1, 0x11, 0x97, + 0xa5, 0x50, 0x71, 0x46, 0x7c, 0x07, 0x31, 0x8a, 0xbe, 0x0d, 0x40, 0x6d, 0xa3, 0x46, 0x02, 0xa8, + 0x91, 0xbc, 0x91, 0x5c, 0x0b, 0x7d, 0xd6, 0x1f, 0x88, 0x8f, 0x89, 0xcf, 0x51, 0x4b, 0x29, 0x63, + 0x49, 0x74, 0x5c, 0x3f, 0x85, 0xba, 0x37, 0xe6, 0xae, 0x15, 0x6f, 0xef, 0x0a, 0x56, 0xf5, 0xfa, + 0x73, 0xaa, 0xea, 0x28, 0x5a, 0xb3, 0x26, 0xca, 0x46, 0x9f, 0x6c, 0x97, 0x26, 0x9e, 0x6b, 0xb5, + 0x55, 0xbf, 0x41, 0x6d, 0x75, 0x2c, 0x1c, 0x7d, 0x1b, 0x7f, 0x2f, 0x03, 0x15, 0xad, 0xdb, 0x6c, + 0x19, 0x16, 0x36, 0xf6, 0xf7, 0x0f, 0xda, 0x66, 0xab, 0xd7, 0xf9, 0xac, 0x6d, 0x6d, 0xec, 0xec, + 0x77, 0xdb, 0x8d, 0x6b, 0x02, 0xbc, 0xb3, 0xbf, 0xd1, 0xda, 0xb1, 0xb6, 0xf6, 0xcd, 0x0d, 0x05, + 0xce, 0xb0, 0x15, 0x60, 0x66, 0x7b, 0x77, 0xbf, 0xd7, 0x4e, 0xc0, 0xb3, 0xac, 0x01, 0xd5, 0x75, + 0xb3, 0xdd, 0xda, 0xd8, 0x96, 0x90, 0x1c, 0x5b, 0x82, 0xc6, 0xd6, 0xe1, 0xde, 0x66, 0x67, 0xef, + 0x89, 0xb5, 0xd1, 0xda, 0xdb, 0x68, 0xef, 0xb4, 0x37, 0x1b, 0x79, 0x56, 0x83, 0x72, 0x6b, 0xbd, + 0xb5, 0xb7, 0xb9, 0xbf, 0xd7, 0xde, 0x6c, 0x14, 0x8c, 0xdf, 0x80, 0x72, 0x3c, 0xd0, 0x0a, 0x14, + 0x0f, 0xf7, 0x9e, 0xee, 0xed, 0x7f, 0xbe, 0xd7, 0xb8, 0xc6, 0xca, 0x50, 0xc0, 0xf6, 0x1b, 0x19, + 0x06, 0x30, 0x47, 0x6d, 0x36, 0xb2, 0xac, 0x04, 0xf9, 0xf5, 0xfd, 0xde, 0x76, 0x23, 0x67, 0xfc, + 0x45, 0x06, 0x96, 0x71, 0xc8, 0x83, 0x69, 0x21, 0x70, 0x07, 0x2a, 0x7d, 0xcf, 0x1b, 0x0b, 0xe3, + 0x26, 0x3e, 0xc4, 0x75, 0x90, 0xd8, 0xe0, 0x24, 0x2f, 0x8f, 0x3d, 0xbf, 0xcf, 0xa5, 0x0c, 0x00, + 0x04, 0x6d, 0x09, 0x88, 0xe0, 0x41, 0xc9, 0xc4, 0x44, 0x41, 0x22, 0xa0, 0x42, 0x30, 0x22, 0x59, + 0x81, 0xb9, 0x23, 0x9f, 0xdb, 0xfd, 0x53, 0xb9, 0xfb, 0xe5, 0x17, 0x7b, 0x33, 0x36, 0xbb, 0xfb, + 0x82, 0xa7, 0x86, 0x7c, 0x80, 0x5b, 0xa0, 0x64, 0xce, 0x4b, 0xf8, 0x86, 0x04, 0x8b, 0x03, 0xc0, + 0x3e, 0xb2, 0xdd, 0x81, 0xe7, 0xf2, 0x81, 0xd4, 0xee, 0x63, 0x80, 0x71, 0x00, 0x2b, 0xd3, 0xe3, + 0x93, 0xf2, 0xe2, 0x03, 0x4d, 0x5e, 0x90, 0xb2, 0xbd, 0x76, 0x35, 0x2b, 0x68, 0xb2, 0xe3, 0xe7, + 0x39, 0xc8, 0x0b, 0xe5, 0xeb, 0x4a, 0x3d, 0x4d, 0xd7, 0xa6, 0x73, 0x33, 0x11, 0x17, 0xb4, 0xee, + 0xe9, 0x54, 0x26, 0x17, 0x52, 0x19, 0x21, 0x78, 0x1a, 0x47, 0x68, 0x9f, 0xf7, 0xcf, 0xa4, 0x0f, + 0x89, 0xd0, 0x26, 0xef, 0x9f, 0xa1, 0x19, 0x63, 0x87, 0x54, 0x96, 0xf6, 0x7b, 0x31, 0xb0, 0x43, + 0x2c, 0x29, 0x51, 0x58, 0xae, 0x18, 0xa1, 0xb0, 0x54, 0x13, 0x8a, 0x8e, 0x7b, 0xe4, 0x4d, 0xdc, + 0x01, 0x6e, 0xef, 0x92, 0xa9, 0x3e, 0x31, 0xc0, 0x83, 0x92, 0x48, 0x9c, 0x1f, 0xb4, 0x9b, 0x4b, + 0x02, 0xd0, 0x13, 0x27, 0xc8, 0xbb, 0x50, 0x0e, 0x2e, 0xdd, 0xbe, 0xbe, 0x87, 0x97, 0xe4, 0xfc, + 0x88, 0xd1, 0x3f, 0xe8, 0x5e, 0xba, 0x7d, 0xdc, 0xb1, 0xa5, 0x40, 0xfe, 0xc5, 0xde, 0x87, 0x52, + 0xe4, 0x6a, 0x25, 0x09, 0x7c, 0x5d, 0x2f, 0xa1, 0xfc, 0xab, 0x64, 0xd1, 0x46, 0xa4, 0x6b, 0x4f, + 0xa1, 0x96, 0x40, 0xe9, 0x66, 0x68, 0x8d, 0xcc, 0xd0, 0xd7, 0x75, 0x33, 0x34, 0x16, 0xec, 0xb2, + 0x98, 0x6e, 0x96, 0xfe, 0x26, 0x94, 0x54, 0xcf, 0xc4, 0x76, 0x92, 0x5b, 0xc1, 0xea, 0x7e, 0xb1, + 0xb7, 0xd1, 0xb8, 0xc6, 0xe6, 0xa1, 0xd2, 0xda, 0xc0, 0x1d, 0x8a, 0x80, 0x8c, 0x20, 0x39, 0x68, + 0x75, 0xbb, 0x11, 0x24, 0x6b, 0x30, 0x68, 0x88, 0xe3, 0x45, 0xf4, 0x38, 0x0a, 0xa6, 0x7c, 0x00, + 0x0b, 0x1a, 0x2c, 0xb6, 0xd4, 0xc4, 0x79, 0x34, 0x6d, 0xa9, 0xa1, 0x5e, 0x4e, 0x18, 0x63, 0x15, + 0x96, 0xc5, 0x67, 0xfb, 0x8c, 0xbb, 0x61, 0x77, 0x72, 0x44, 0xa1, 0x34, 0xc7, 0x73, 0x85, 0xbe, + 0x5e, 0x8e, 0x30, 0x57, 0x33, 0xd2, 0x03, 0x69, 0xd4, 0x65, 0x71, 0xfa, 0xd7, 0xb4, 0x16, 0xb0, + 0xe0, 0x03, 0xfc, 0x37, 0x61, 0xdc, 0x95, 0x23, 0x90, 0x18, 0xeb, 0x41, 0xbb, 0x6d, 0x5a, 0xfb, + 0x7b, 0x3b, 0x9d, 0x3d, 0x21, 0x8c, 0xc4, 0x58, 0x11, 0xb0, 0xb5, 0x85, 0x90, 0x8c, 0xd1, 0x80, + 0xfa, 0x13, 0x1e, 0x76, 0xdc, 0x63, 0x4f, 0x8d, 0xf4, 0x17, 0x05, 0x98, 0x8f, 0x40, 0xb1, 0x71, + 0x78, 0xc6, 0xfd, 0xc0, 0xf1, 0x5c, 0xd4, 0xf3, 0xca, 0xa6, 0xfa, 0x14, 0x27, 0x88, 0x33, 0xe0, + 0x6e, 0xe8, 0x84, 0x97, 0x56, 0xc2, 0x93, 0x54, 0x57, 0x60, 0x79, 0x52, 0x2d, 0x41, 0xc1, 0x1e, + 0x3a, 0xb6, 0x8a, 0x40, 0xd2, 0x87, 0x80, 0xf6, 0xbd, 0xa1, 0xe7, 0xa3, 0x4a, 0x57, 0x36, 0xe9, + 0x83, 0x3d, 0x82, 0x25, 0xa1, 0x5a, 0xea, 0xee, 0x3d, 0xdc, 0xa3, 0xe4, 0xd4, 0x62, 0xee, 0x64, + 0x74, 0x10, 0xbb, 0xf8, 0x04, 0x46, 0x9c, 0x4f, 0xa2, 0x84, 0x54, 0x48, 0xa2, 0x02, 0x64, 0xa5, + 0x2c, 0xb8, 0x93, 0x51, 0x0b, 0x31, 0x11, 0xfd, 0x63, 0x58, 0x16, 0xf4, 0x91, 0x0a, 0x13, 0x95, + 0x98, 0xc7, 0x12, 0xa2, 0xb2, 0x8e, 0xc4, 0x45, 0x65, 0x6e, 0x40, 0x99, 0x7a, 0x25, 0x56, 0xbc, + 0x40, 0xda, 0x29, 0x76, 0x85, 0xfb, 0xc1, 0x4c, 0xb0, 0x70, 0x8e, 0x0e, 0xdb, 0xa9, 0x60, 0xa1, + 0x16, 0x6e, 0x2c, 0x4d, 0x87, 0x1b, 0x1f, 0xc3, 0xf2, 0x11, 0x0f, 0x42, 0xeb, 0x94, 0xdb, 0x03, + 0xee, 0xe3, 0x8e, 0xa4, 0xb0, 0x22, 0x69, 0xe1, 0x8b, 0x02, 0xb9, 0x8d, 0xb8, 0x9e, 0x42, 0x09, + 0x5d, 0x42, 0x6c, 0x3d, 0x3e, 0xb0, 0x42, 0xcf, 0x42, 0x15, 0x03, 0x37, 0x71, 0xc9, 0xac, 0x11, + 0xb8, 0xe7, 0x6d, 0x08, 0x60, 0x92, 0xee, 0xc4, 0xb7, 0xc7, 0xa7, 0x52, 0x4f, 0x8e, 0xe8, 0x9e, + 0x08, 0x20, 0xbb, 0x09, 0xc5, 0x90, 0x07, 0xa1, 0xcb, 0x29, 0xa6, 0x53, 0x42, 0x9f, 0xbd, 0x02, + 0xb1, 0xd7, 0x61, 0x0e, 0xdb, 0x08, 0x9a, 0x0d, 0xe4, 0xf7, 0x6a, 0x2c, 0x2c, 0x1d, 0xd7, 0x94, + 0x38, 0xa1, 0xb0, 0x4d, 0x7c, 0x27, 0x68, 0x56, 0x31, 0x96, 0x89, 0x7f, 0xb3, 0xdf, 0xd2, 0xc4, + 0xc2, 0x22, 0x96, 0x55, 0x67, 0xee, 0x14, 0xa7, 0xfd, 0x5a, 0x24, 0xc4, 0xf7, 0xf3, 0xa5, 0x4a, + 0xa3, 0x6a, 0x7c, 0x08, 0x05, 0x9a, 0x1d, 0xc1, 0x84, 0x38, 0x77, 0x19, 0xc9, 0x84, 0x08, 0x6d, + 0x42, 0xd1, 0xe5, 0xe1, 0xb9, 0xe7, 0x3f, 0x53, 0xbe, 0x56, 0xf9, 0x69, 0xfc, 0x18, 0x9d, 0x04, + 0x51, 0x20, 0x99, 0xec, 0x1d, 0xc1, 0x1e, 0xb4, 0xbc, 0xc1, 0xa9, 0x2d, 0xfd, 0x16, 0x25, 0x04, + 0x74, 0x4f, 0xed, 0x19, 0xf6, 0xc8, 0xce, 0xc6, 0x92, 0x5f, 0x87, 0xba, 0x0a, 0x5d, 0x07, 0xd6, + 0x90, 0x1f, 0x87, 0x92, 0xdd, 0xab, 0x32, 0x6e, 0x1d, 0xec, 0xf0, 0xe3, 0xd0, 0xd8, 0x85, 0x05, + 0xc9, 0x90, 0xfb, 0x63, 0xae, 0x9a, 0xfe, 0x28, 0x4d, 0x67, 0xad, 0x3c, 0x5e, 0x4c, 0x1e, 0x66, + 0x14, 0x92, 0x4f, 0x28, 0xb2, 0xc6, 0xa7, 0xc0, 0xf4, 0xa3, 0x4e, 0xd6, 0x27, 0x35, 0x47, 0xe5, + 0xa2, 0x56, 0x91, 0x9e, 0x48, 0x3f, 0x75, 0x06, 0x62, 0x76, 0x82, 0x49, 0xbf, 0xaf, 0x52, 0x0a, + 0x4a, 0xa6, 0xfa, 0x34, 0xfe, 0x2c, 0x03, 0x8b, 0x58, 0x99, 0xd2, 0xb9, 0xa5, 0x36, 0xf1, 0xad, + 0x3b, 0x29, 0xd6, 0x47, 0xd7, 0x2f, 0xe8, 0xe3, 0x9b, 0x3b, 0x05, 0xf3, 0x33, 0x4e, 0xc1, 0x37, + 0xa1, 0x31, 0xe0, 0x43, 0x07, 0xb3, 0x4b, 0xd4, 0x71, 0x4d, 0x5a, 0xf6, 0xbc, 0x82, 0x2b, 0x43, + 0xe9, 0x9f, 0x64, 0x60, 0x81, 0xb4, 0x01, 0x34, 0x17, 0xe5, 0x44, 0x7d, 0xa2, 0x6c, 0x2c, 0x29, + 0xaa, 0xe4, 0x98, 0xe2, 0x53, 0x12, 0xa1, 0x44, 0xbc, 0x7d, 0x4d, 0xda, 0x5e, 0x12, 0xca, 0x3e, + 0x46, 0x3b, 0xc1, 0xb5, 0x10, 0x98, 0x92, 0xad, 0x92, 0x5c, 0x94, 0xed, 0x6b, 0x68, 0x44, 0xb8, + 0x08, 0x5a, 0x2f, 0x09, 0xa3, 0x4f, 0x80, 0x8d, 0x2d, 0xa8, 0x25, 0x9a, 0x49, 0x78, 0x2e, 0xab, + 0xe4, 0xb9, 0x9c, 0x89, 0x0e, 0x64, 0x67, 0xa3, 0x03, 0x7f, 0x27, 0x0f, 0x4c, 0xb0, 0xd4, 0xd4, + 0xaa, 0x4d, 0x85, 0xd6, 0xb2, 0x33, 0xa1, 0xb5, 0x47, 0xc0, 0x34, 0x02, 0x15, 0xf1, 0xcb, 0x45, + 0x11, 0xbf, 0x46, 0x4c, 0x2b, 0x03, 0x7e, 0x8f, 0x60, 0x49, 0x2a, 0x8d, 0x51, 0x2c, 0x0d, 0x5d, + 0x52, 0xb4, 0x3e, 0x8c, 0xb4, 0x47, 0x15, 0x53, 0x43, 0xf7, 0x94, 0x0a, 0xab, 0x09, 0x93, 0x9a, + 0x3c, 0x39, 0x18, 0x56, 0x13, 0x56, 0xf4, 0x14, 0x17, 0xcc, 0xbd, 0x90, 0x0b, 0x8a, 0x33, 0x5c, + 0xa0, 0x39, 0x16, 0x4a, 0x49, 0xc7, 0x82, 0x01, 0x35, 0x15, 0x3c, 0xa3, 0x9c, 0x01, 0xd2, 0x90, + 0x2a, 0x32, 0x82, 0x86, 0x79, 0x03, 0xf7, 0xa0, 0xa1, 0xac, 0xff, 0xc8, 0x75, 0x41, 0xf1, 0x70, + 0xe9, 0x3c, 0xda, 0x50, 0x0e, 0x8c, 0x84, 0xa3, 0xb8, 0x32, 0xe5, 0x28, 0x7e, 0x0b, 0x16, 0x02, + 0xc1, 0x44, 0xd6, 0xc4, 0x95, 0xc9, 0x2b, 0x7c, 0x80, 0xe6, 0x49, 0xc9, 0x6c, 0x20, 0xe2, 0x30, + 0x86, 0xcf, 0x9a, 0xf6, 0xb5, 0x59, 0xd3, 0x9e, 0xbd, 0x1f, 0xc7, 0x99, 0x82, 0x53, 0x67, 0x84, + 0x07, 0x77, 0x9c, 0xe8, 0x21, 0x27, 0xb8, 0x7b, 0xea, 0x8c, 0x4c, 0x15, 0xd4, 0x14, 0x1f, 0xc6, + 0x7f, 0xce, 0x40, 0x43, 0xf0, 0x41, 0x82, 0xcf, 0x7f, 0x03, 0x70, 0x47, 0xbe, 0x24, 0x9b, 0x57, + 0x04, 0xad, 0xe2, 0xf2, 0x0f, 0x01, 0xd9, 0xd6, 0x12, 0xb6, 0x98, 0x64, 0xf2, 0x66, 0x92, 0xc9, + 0x63, 0x41, 0xb6, 0x7d, 0x8d, 0x94, 0x6c, 0x01, 0x49, 0x8b, 0xef, 0xe5, 0x53, 0xe2, 0x7b, 0xda, + 0x56, 0xd8, 0x06, 0x78, 0xca, 0x2f, 0x77, 0xbc, 0x3e, 0x5a, 0x41, 0xb7, 0x00, 0x04, 0x43, 0x1e, + 0xdb, 0x23, 0x47, 0x7a, 0x30, 0x0a, 0x66, 0xf9, 0x19, 0xbf, 0xdc, 0x42, 0x80, 0x58, 0x0d, 0x81, + 0x8e, 0xf7, 0x43, 0xc1, 0x2c, 0x3d, 0xe3, 0x97, 0xb4, 0x19, 0x2c, 0xa8, 0x3d, 0xe5, 0x97, 0x9b, + 0x9c, 0xd4, 0x35, 0xcf, 0x17, 0x9c, 0xe0, 0xdb, 0xe7, 0x42, 0x3f, 0x4b, 0xc4, 0xe6, 0x2a, 0xbe, + 0x7d, 0xfe, 0x94, 0x5f, 0xaa, 0x38, 0x61, 0x51, 0xe0, 0x87, 0x5e, 0x5f, 0x9e, 0x40, 0x2a, 0xcb, + 0x20, 0xee, 0x94, 0x39, 0xf7, 0x0c, 0xff, 0x36, 0xfe, 0x34, 0x03, 0x35, 0xd1, 0x7f, 0x14, 0x70, + 0x62, 0xde, 0x55, 0xb2, 0x4a, 0x26, 0x4e, 0x56, 0x79, 0x2c, 0xe5, 0x03, 0x49, 0xcb, 0xec, 0xd5, + 0xd2, 0x12, 0x27, 0x98, 0x44, 0xe5, 0xbb, 0x50, 0xa6, 0xbd, 0x25, 0x36, 0x6b, 0x2e, 0xb1, 0x4a, + 0x89, 0x01, 0x99, 0x25, 0x24, 0x7b, 0x4a, 0xb1, 0x71, 0xcd, 0x01, 0x45, 0x53, 0x5c, 0xf6, 0x23, + 0xd7, 0x53, 0xca, 0x32, 0x14, 0xd2, 0xc2, 0xac, 0x87, 0x50, 0xd1, 0x78, 0x8a, 0x7d, 0x8f, 0x02, + 0xd4, 0xd4, 0x79, 0x62, 0xc0, 0x24, 0xd3, 0x24, 0x46, 0xbf, 0x7d, 0xcd, 0xac, 0xf5, 0x75, 0xc0, + 0xfa, 0x1c, 0xe4, 0x45, 0x21, 0xe3, 0x13, 0x58, 0xd0, 0xaa, 0x25, 0x8b, 0x2f, 0xad, 0x4f, 0x99, + 0xb4, 0x3e, 0xfd, 0xd3, 0x0c, 0x2c, 0xc9, 0xd2, 0x98, 0xd8, 0xe4, 0x88, 0xe3, 0x7a, 0x37, 0x38, + 0x61, 0xbf, 0x01, 0x35, 0x51, 0xbb, 0xe5, 0xf3, 0x13, 0x27, 0x08, 0xb9, 0xf2, 0xec, 0xa7, 0x6c, + 0x0e, 0x21, 0xb5, 0x05, 0xa9, 0x29, 0x29, 0xd9, 0x27, 0x50, 0xc1, 0xa2, 0x64, 0x93, 0xca, 0x65, + 0x69, 0xce, 0x16, 0xa4, 0xae, 0x6e, 0x5f, 0x33, 0x21, 0x88, 0xbe, 0xd6, 0xcb, 0x50, 0x0c, 0x7d, + 0xe7, 0xe4, 0x84, 0xfb, 0xc6, 0x4a, 0xd4, 0x35, 0xb1, 0xd3, 0x78, 0x37, 0xe4, 0x63, 0xa1, 0x04, + 0x19, 0xff, 0x35, 0x03, 0x15, 0xb9, 0x77, 0xbe, 0xb5, 0x3b, 0x7f, 0x4d, 0xcb, 0xcc, 0x23, 0xf3, + 0x33, 0x4e, 0xc4, 0xbb, 0x0b, 0xf3, 0x23, 0xa1, 0x10, 0x09, 0x85, 0x3d, 0xe1, 0xcb, 0xaf, 0x2b, + 0xb0, 0xd4, 0x47, 0x1e, 0xc0, 0x22, 0xaa, 0x27, 0x81, 0x15, 0x3a, 0x43, 0x4b, 0x21, 0x65, 0x16, + 0xdc, 0x02, 0xa1, 0x7a, 0xce, 0x70, 0x57, 0x22, 0xc4, 0x29, 0x1d, 0x84, 0xf6, 0x09, 0x97, 0xaa, + 0x2f, 0x7d, 0x18, 0x4d, 0x58, 0x99, 0xd2, 0xd5, 0x95, 0x9d, 0xf1, 0xf7, 0x6b, 0xb0, 0x3a, 0x83, + 0x92, 0xf6, 0x46, 0xe4, 0xc3, 0x1e, 0x3a, 0xa3, 0x23, 0x2f, 0x72, 0x37, 0x65, 0x34, 0x1f, 0xf6, + 0x8e, 0xc0, 0x28, 0x77, 0x13, 0x87, 0x65, 0xc5, 0x10, 0xe8, 0x2f, 0x8a, 0xd4, 0xf9, 0x2c, 0x2a, + 0x9b, 0xef, 0x26, 0x05, 0xd5, 0x74, 0x73, 0x0a, 0xae, 0x1f, 0x7f, 0x8b, 0xe3, 0x19, 0x58, 0xc0, + 0x8e, 0xa1, 0x19, 0xf1, 0x9d, 0xd4, 0x8f, 0x34, 0xdb, 0x44, 0xb4, 0xf4, 0xf6, 0x0b, 0x5a, 0x4a, + 0x38, 0x22, 0xcc, 0x15, 0xc5, 0xae, 0x54, 0x59, 0xd4, 0xce, 0x19, 0xbc, 0xa2, 0xda, 0x41, 0x5d, + 0x67, 0xb6, 0xb5, 0xfc, 0x4b, 0x8d, 0x0b, 0x1d, 0x2c, 0xc9, 0x26, 0x6f, 0xc8, 0x8a, 0x23, 0x94, + 0xde, 0xee, 0x29, 0xac, 0x9c, 0xdb, 0x4e, 0xa8, 0xc6, 0xa7, 0x99, 0x45, 0x05, 0x6c, 0xef, 0xf1, + 0x0b, 0xda, 0xfb, 0x9c, 0x0a, 0x27, 0xb4, 0xbf, 0xa5, 0xf3, 0x59, 0x60, 0xb0, 0xf6, 0x1f, 0xb3, + 0x50, 0x4f, 0xd6, 0x22, 0x36, 0xb5, 0x94, 0x43, 0x4a, 0x9f, 0x90, 0xfa, 0xb8, 0x74, 0x83, 0xee, + 0x91, 0x1e, 0x31, 0xeb, 0xa0, 0xcd, 0xa6, 0x38, 0x68, 0x75, 0xbf, 0x68, 0xee, 0x45, 0xb1, 0x9f, + 0xfc, 0x4b, 0xc5, 0x7e, 0x0a, 0x69, 0xb1, 0x9f, 0xab, 0x03, 0x06, 0x73, 0xdf, 0x2a, 0x60, 0x50, + 0xbc, 0x3a, 0x60, 0xb0, 0xf6, 0x7f, 0x32, 0xc0, 0x66, 0x39, 0x95, 0x3d, 0x21, 0x5f, 0xb4, 0xcb, + 0x87, 0x52, 0x8a, 0xbd, 0xf3, 0x72, 0xdc, 0xae, 0x16, 0x48, 0x95, 0x66, 0x0f, 0x61, 0x51, 0xcf, + 0x9b, 0xd5, 0x4d, 0x95, 0x9a, 0xc9, 0x74, 0x54, 0x6c, 0xd0, 0x6a, 0x81, 0xaf, 0xfc, 0x0b, 0x03, + 0x5f, 0x85, 0x17, 0x06, 0xbe, 0xe6, 0x92, 0x81, 0xaf, 0xb5, 0xbf, 0x95, 0x81, 0xc5, 0x14, 0xa6, + 0xfa, 0xd5, 0x8d, 0x59, 0xf0, 0x42, 0x42, 0xc4, 0x64, 0x25, 0x2f, 0x68, 0xd2, 0x65, 0xed, 0x2b, + 0xa8, 0x25, 0x36, 0xd1, 0xaf, 0xae, 0xf9, 0x69, 0x43, 0x8b, 0x58, 0x59, 0x37, 0xb4, 0xd6, 0xfe, + 0x2a, 0x0b, 0x6c, 0x76, 0x1f, 0xff, 0x3a, 0xbb, 0x30, 0x3b, 0x49, 0xb9, 0xd9, 0x49, 0xfa, 0x7f, + 0x77, 0xae, 0xbc, 0x05, 0x0b, 0x32, 0xd7, 0x5f, 0x0b, 0x3c, 0x10, 0xa3, 0x34, 0x22, 0x84, 0xea, + 0xc5, 0x87, 0xd3, 0x31, 0xc7, 0x52, 0x22, 0xbd, 0x59, 0x3b, 0x58, 0x93, 0xa1, 0x47, 0x63, 0x0d, + 0x9a, 0x72, 0x6a, 0x66, 0x5d, 0x75, 0x3f, 0xc9, 0x47, 0x56, 0x32, 0x22, 0xa5, 0x52, 0xfc, 0x5d, + 0xa8, 0xea, 0x87, 0x8d, 0x5c, 0x87, 0xa9, 0x88, 0x93, 0x50, 0x87, 0x3d, 0x6d, 0xb7, 0x6e, 0x00, + 0xc5, 0x11, 0x06, 0x51, 0x31, 0xd2, 0x20, 0x9e, 0xe3, 0x78, 0x46, 0xe5, 0x28, 0xb1, 0xf8, 0xff, + 0x1f, 0xd4, 0x93, 0x7e, 0x2b, 0xa9, 0xea, 0xa5, 0x69, 0x87, 0xa2, 0x74, 0xc2, 0x91, 0xc5, 0x7e, + 0x0b, 0x1a, 0xd3, 0x7e, 0x2f, 0x99, 0x7b, 0x79, 0x45, 0xf9, 0x79, 0x27, 0xe9, 0x0a, 0x63, 0xdb, + 0xb0, 0x94, 0x76, 0xdc, 0xe2, 0xaa, 0x5c, 0x6d, 0x16, 0xb0, 0xd9, 0x23, 0x95, 0x7d, 0x24, 0xdd, + 0x9b, 0x85, 0xb4, 0x40, 0x8c, 0x36, 0xd9, 0x0f, 0xe8, 0x3f, 0xcd, 0xd1, 0x79, 0x06, 0x10, 0xc3, + 0x58, 0x03, 0xaa, 0xfb, 0x07, 0xed, 0x3d, 0x6b, 0x63, 0xbb, 0xb5, 0xb7, 0xd7, 0xde, 0x69, 0x5c, + 0x63, 0x0c, 0xea, 0x18, 0x41, 0xd9, 0x8c, 0x60, 0x19, 0x01, 0x93, 0xbe, 0x5f, 0x05, 0xcb, 0xb2, + 0x25, 0x68, 0x74, 0xf6, 0xa6, 0xa0, 0x39, 0xd6, 0x84, 0xa5, 0x83, 0x36, 0x05, 0x5d, 0x12, 0xf5, + 0xe6, 0x85, 0x0a, 0x27, 0x87, 0x2b, 0x54, 0x38, 0xba, 0x29, 0x22, 0xb9, 0x4f, 0x69, 0x36, 0x3f, + 0xcd, 0xc0, 0xf2, 0x14, 0x22, 0xce, 0xff, 0x25, 0xbd, 0x26, 0xa9, 0xd1, 0x54, 0x11, 0xa8, 0x78, + 0xf8, 0x2d, 0x58, 0x88, 0x4c, 0xbd, 0x29, 0xb9, 0xd4, 0x88, 0x10, 0x8a, 0xf8, 0x21, 0x2c, 0x6a, + 0x16, 0xe3, 0xd4, 0x0e, 0x65, 0x1a, 0x4a, 0x16, 0x30, 0x56, 0xa3, 0x3c, 0xcb, 0xa9, 0x5e, 0x0f, + 0xe8, 0xfa, 0x89, 0x8e, 0x88, 0xbd, 0xbf, 0xc9, 0xfe, 0xaa, 0x4f, 0x61, 0xca, 0x27, 0x18, 0x21, + 0xd9, 0x5b, 0x7d, 0xc1, 0x55, 0xf3, 0x7f, 0x38, 0x07, 0xec, 0xd3, 0x09, 0xf7, 0x2f, 0x31, 0xbf, + 0x37, 0x78, 0x51, 0xc2, 0x8b, 0x32, 0x8b, 0xb2, 0x2f, 0x95, 0xc3, 0x9f, 0x96, 0x43, 0x9f, 0x7f, + 0x71, 0x0e, 0x7d, 0xe1, 0x45, 0x39, 0xf4, 0xaf, 0x41, 0xcd, 0x39, 0x71, 0x3d, 0x21, 0x80, 0x84, + 0x6e, 0x12, 0x34, 0xe7, 0xee, 0xe4, 0xee, 0x55, 0xcd, 0xaa, 0x04, 0x0a, 0xcd, 0x24, 0x60, 0x9f, + 0xc4, 0x44, 0x7c, 0x70, 0x82, 0xf7, 0x3d, 0x74, 0xd1, 0xd3, 0x1e, 0x9c, 0x70, 0x69, 0x05, 0xa2, + 0x5f, 0x44, 0x15, 0x16, 0xf0, 0x80, 0xbd, 0x0e, 0xf5, 0xc0, 0x9b, 0x08, 0x55, 0x4f, 0x4d, 0x03, + 0xf9, 0x87, 0xab, 0x04, 0x3d, 0x50, 0xc1, 0x80, 0xc5, 0x49, 0xc0, 0xad, 0x91, 0x13, 0x04, 0xe2, + 0x80, 0xee, 0x7b, 0x6e, 0xe8, 0x7b, 0x43, 0xe9, 0xf2, 0x5d, 0x98, 0x04, 0x7c, 0x97, 0x30, 0x1b, + 0x84, 0x60, 0xef, 0xc5, 0x5d, 0x1a, 0xdb, 0x8e, 0x1f, 0x34, 0x01, 0xbb, 0xa4, 0x46, 0x8a, 0x1a, + 0x95, 0xed, 0xf8, 0x51, 0x5f, 0xc4, 0x47, 0x30, 0x95, 0xdb, 0x5f, 0x99, 0xce, 0xed, 0xff, 0x51, + 0x7a, 0x6e, 0x7f, 0x0d, 0xab, 0x7e, 0x24, 0xab, 0x9e, 0x5d, 0xe2, 0x6f, 0x94, 0xe2, 0x3f, 0x7b, + 0x65, 0xa1, 0xfe, 0x4d, 0xae, 0x2c, 0xcc, 0xa7, 0x5d, 0x59, 0x78, 0x17, 0x2a, 0x98, 0x4c, 0x6e, + 0x9d, 0x3a, 0x6e, 0xa8, 0x5c, 0xd8, 0x0d, 0x3d, 0xdb, 0x7c, 0x5b, 0x18, 0xd3, 0xe0, 0xab, 0x3f, + 0x83, 0xd9, 0xdb, 0x03, 0x0b, 0xbf, 0xc6, 0xdb, 0x03, 0x32, 0xe9, 0xfd, 0x01, 0x94, 0xd4, 0x3a, + 0x31, 0x06, 0xf9, 0x63, 0xdf, 0x1b, 0x29, 0xd7, 0x9e, 0xf8, 0x9b, 0xd5, 0x21, 0x1b, 0x7a, 0xb2, + 0x70, 0x36, 0xf4, 0x8c, 0xdf, 0x81, 0x8a, 0xc6, 0x6a, 0xec, 0x55, 0x72, 0x22, 0x08, 0x6d, 0x59, + 0x5a, 0xc9, 0x34, 0x8b, 0x65, 0x09, 0xed, 0x0c, 0x84, 0xbc, 0x19, 0x38, 0x3e, 0xc7, 0x7b, 0x3e, + 0x96, 0xcf, 0xcf, 0xb8, 0x1f, 0x28, 0x57, 0x6b, 0x23, 0x42, 0x98, 0x04, 0x37, 0xfe, 0x3a, 0x2c, + 0x26, 0xd6, 0x56, 0x8a, 0x88, 0xd7, 0x61, 0x0e, 0xe7, 0x4d, 0x85, 0xc2, 0x92, 0x59, 0xfc, 0x12, + 0x87, 0x17, 0x38, 0xc9, 0x4b, 0x6c, 0x8d, 0x7d, 0xef, 0x08, 0x1b, 0xc9, 0x98, 0x15, 0x09, 0x3b, + 0xf0, 0xbd, 0x23, 0xe3, 0xe7, 0x39, 0xc8, 0x6d, 0x7b, 0x63, 0x3d, 0xc3, 0x22, 0x33, 0x93, 0x61, + 0x21, 0x4d, 0x00, 0x2b, 0x52, 0xf1, 0xa5, 0xd6, 0x86, 0xfe, 0x51, 0xa5, 0xe6, 0xdf, 0x83, 0xba, + 0x90, 0x13, 0xa1, 0x27, 0x6c, 0xa8, 0x73, 0xdb, 0xa7, 0x9c, 0xfe, 0x1c, 0x6d, 0x3e, 0x7b, 0x14, + 0xf6, 0xbc, 0x2d, 0x82, 0xb3, 0x25, 0xc8, 0x45, 0x0a, 0x2c, 0xa2, 0xc5, 0xa7, 0x30, 0xae, 0x31, + 0xbb, 0xed, 0x52, 0xc6, 0x7a, 0xe4, 0x17, 0x7b, 0x07, 0x16, 0x93, 0xf5, 0x92, 0x28, 0x92, 0x1a, + 0x89, 0x5e, 0x31, 0xca, 0xa4, 0xeb, 0x20, 0xe4, 0x08, 0xd1, 0xc8, 0xb0, 0xec, 0x31, 0xe7, 0x88, + 0xd2, 0x84, 0x5e, 0x29, 0x21, 0xf4, 0x6e, 0x43, 0x25, 0x1c, 0x9e, 0x59, 0x63, 0xfb, 0x72, 0xe8, + 0xd9, 0x03, 0xb9, 0xbf, 0x21, 0x1c, 0x9e, 0x1d, 0x10, 0x84, 0x3d, 0x04, 0x18, 0x8d, 0xc7, 0x72, + 0xef, 0xa1, 0xbb, 0x31, 0x66, 0xe5, 0xdd, 0x83, 0x03, 0x62, 0x39, 0xb3, 0x3c, 0x1a, 0x8f, 0xe9, + 0x4f, 0xb6, 0x09, 0xf5, 0xd4, 0xbb, 0x38, 0xb7, 0x54, 0x32, 0x96, 0x37, 0x7e, 0x90, 0xb2, 0x39, + 0x6b, 0x7d, 0x1d, 0xb6, 0xf6, 0x5b, 0xc0, 0x7e, 0xc9, 0x1b, 0x31, 0x3d, 0x28, 0x47, 0xfd, 0xd3, + 0x2f, 0x94, 0x60, 0x7a, 0x65, 0x25, 0x71, 0xa1, 0xa4, 0x35, 0x18, 0xf8, 0x42, 0x2e, 0xd2, 0x81, + 0x19, 0x89, 0x7c, 0xd0, 0x4e, 0xcc, 0x16, 0xc9, 0x7d, 0xe3, 0x2f, 0x33, 0x50, 0xa0, 0xdb, 0x2d, + 0x6f, 0xc0, 0x3c, 0xd1, 0x47, 0xd9, 0x2a, 0x32, 0x42, 0x44, 0xe7, 0x6e, 0x4f, 0x26, 0xaa, 0x88, + 0x6d, 0xa1, 0xdd, 0xcc, 0xcb, 0x46, 0x2b, 0xaf, 0xdd, 0xce, 0xbb, 0x0d, 0xe5, 0xa8, 0x69, 0x8d, + 0x75, 0x4a, 0xaa, 0x65, 0xf6, 0x0a, 0xe4, 0x4f, 0xbd, 0xb1, 0xb2, 0xc5, 0x21, 0x9e, 0x49, 0x13, + 0xe1, 0x71, 0x5f, 0x44, 0x1b, 0xd4, 0x79, 0x69, 0x43, 0x46, 0x8d, 0x20, 0x1b, 0xcc, 0x8e, 0x71, + 0x2e, 0x65, 0x8c, 0x87, 0x30, 0x2f, 0xe4, 0x80, 0x16, 0xa9, 0xbd, 0xfa, 0xd0, 0x7c, 0x53, 0x68, + 0x78, 0xfd, 0xe1, 0x64, 0xc0, 0x75, 0x4f, 0x08, 0xa6, 0x4e, 0x48, 0xb8, 0x32, 0x0f, 0x8c, 0x3f, + 0xcc, 0x90, 0x7c, 0x11, 0xf5, 0xb2, 0x7b, 0x90, 0x17, 0xe7, 0xdb, 0x94, 0xa7, 0x2e, 0xca, 0x73, + 0x15, 0x74, 0x26, 0x52, 0xe0, 0x75, 0xd6, 0xc9, 0x28, 0x59, 0x7b, 0xcd, 0xac, 0xb8, 0x93, 0x51, + 0xe4, 0x4c, 0xf8, 0x8e, 0x1a, 0xd6, 0x94, 0x21, 0x4e, 0xa3, 0x8f, 0xb6, 0xe9, 0x03, 0x2d, 0x07, + 0x23, 0x9f, 0x38, 0x31, 0x95, 0x16, 0x38, 0x38, 0xe1, 0x5a, 0xee, 0xc5, 0x1f, 0x67, 0xa1, 0x96, + 0xe8, 0x11, 0x26, 0xa1, 0x88, 0x03, 0x80, 0xbc, 0xc0, 0x72, 0xbd, 0x41, 0x80, 0xa4, 0xa2, 0xae, + 0xcd, 0x53, 0x36, 0x31, 0x4f, 0x51, 0x4c, 0x3a, 0xa7, 0xc7, 0xa4, 0x1f, 0x41, 0x39, 0xbe, 0x91, + 0x99, 0xec, 0x92, 0x68, 0x4f, 0x65, 0xfb, 0xc6, 0x44, 0x71, 0x14, 0xbb, 0xa0, 0x47, 0xb1, 0xbf, + 0xa7, 0x05, 0x3d, 0xe7, 0xb0, 0x1a, 0x23, 0x6d, 0x46, 0x7f, 0x3d, 0x49, 0x11, 0x9f, 0x40, 0x45, + 0xeb, 0xbc, 0x1e, 0xdc, 0xcc, 0x24, 0x82, 0x9b, 0x51, 0x5e, 0x7e, 0x36, 0xce, 0xcb, 0x37, 0x7e, + 0x2f, 0x0b, 0x35, 0xb1, 0xbf, 0x1c, 0xf7, 0xe4, 0xc0, 0x1b, 0x3a, 0x7d, 0xf4, 0x0a, 0x47, 0x3b, + 0x4c, 0x2a, 0x5a, 0x6a, 0x9f, 0xc9, 0x2d, 0x46, 0x7a, 0x96, 0x7e, 0xfd, 0x88, 0x84, 0x74, 0x74, + 0xfd, 0xc8, 0x80, 0x9a, 0x10, 0x8c, 0x47, 0x76, 0xc0, 0xb5, 0xfb, 0xa2, 0x66, 0xe5, 0x98, 0xf3, + 0x75, 0x3b, 0x20, 0x09, 0xf9, 0x0e, 0x2c, 0x0a, 0x1a, 0xbc, 0x79, 0x31, 0x72, 0x86, 0x43, 0x87, + 0x28, 0xc9, 0xd5, 0xd0, 0x38, 0xe6, 0xdc, 0xb4, 0x43, 0xbe, 0x2b, 0x10, 0xf2, 0x7a, 0x69, 0x69, + 0xe0, 0x04, 0xf6, 0x51, 0x9c, 0x2a, 0x14, 0x7d, 0x63, 0x2c, 0xc7, 0xbe, 0xd0, 0x62, 0x39, 0x74, + 0x05, 0xab, 0x32, 0xb2, 0x2f, 0xa2, 0x58, 0xce, 0x14, 0x27, 0x15, 0xa7, 0x39, 0xc9, 0xf8, 0x2f, + 0x59, 0xa8, 0x68, 0x6c, 0xf9, 0x32, 0xa7, 0xeb, 0xad, 0x19, 0x2f, 0x7e, 0x59, 0x77, 0xd8, 0xbf, + 0x96, 0x6c, 0x12, 0x43, 0xbe, 0x74, 0x91, 0x55, 0x63, 0xe0, 0x1b, 0x50, 0x16, 0xbb, 0xee, 0x5d, + 0x74, 0x8a, 0xc9, 0x6b, 0xd8, 0x08, 0x38, 0x98, 0x1c, 0x29, 0xe4, 0x63, 0x44, 0x16, 0x62, 0xe4, + 0x63, 0x81, 0x7c, 0x5e, 0x7e, 0xe0, 0x87, 0x50, 0x95, 0xb5, 0xe2, 0x9a, 0xe2, 0x70, 0xe3, 0x5d, + 0x9f, 0x58, 0x6f, 0xb3, 0x42, 0xcd, 0xd1, 0xe2, 0xcb, 0x82, 0x8f, 0x55, 0xc1, 0xd2, 0x8b, 0x0a, + 0x3e, 0xa6, 0x0f, 0x63, 0x2b, 0x4a, 0xb9, 0xc4, 0x74, 0x03, 0x25, 0xc7, 0x1e, 0xc2, 0xa2, 0x12, + 0x57, 0x13, 0xd7, 0x76, 0x5d, 0x6f, 0xe2, 0xf6, 0xb9, 0x4a, 0xd8, 0x67, 0x12, 0x75, 0x18, 0x63, + 0x8c, 0x41, 0x74, 0xa3, 0x8b, 0xd2, 0x16, 0xee, 0x43, 0x81, 0xf4, 0x72, 0x52, 0x3e, 0xd2, 0x05, + 0x17, 0x91, 0xb0, 0x7b, 0x50, 0x20, 0xf5, 0x3c, 0x7b, 0xa5, 0xb0, 0x21, 0x02, 0xe3, 0x01, 0xcc, + 0xa3, 0x8a, 0xa9, 0x49, 0xdc, 0xe7, 0x69, 0x25, 0xc6, 0x12, 0xb0, 0x3d, 0xda, 0x44, 0x7a, 0x3a, + 0xcd, 0x7f, 0xcf, 0x41, 0x45, 0x03, 0x0b, 0xb1, 0x88, 0x09, 0x18, 0xd6, 0xc0, 0xb1, 0x47, 0x5c, + 0xc5, 0x1e, 0x6a, 0x66, 0x0d, 0xa1, 0x9b, 0x12, 0x28, 0x0e, 0x05, 0xfb, 0xec, 0xc4, 0xf2, 0x26, + 0xa1, 0x35, 0xe0, 0x27, 0x3e, 0xe7, 0x52, 0x59, 0xaa, 0xda, 0x67, 0x27, 0xfb, 0x93, 0x70, 0x13, + 0x61, 0x82, 0x4a, 0x30, 0xb5, 0x46, 0x25, 0x73, 0x06, 0x46, 0xf6, 0x45, 0x4c, 0x25, 0x13, 0x57, + 0x68, 0x8a, 0xf2, 0x51, 0xe2, 0x0a, 0x99, 0x2d, 0xd3, 0x92, 0xbc, 0x30, 0x2b, 0xc9, 0xdf, 0x83, + 0x15, 0x92, 0xe4, 0x52, 0x46, 0x58, 0x53, 0x2c, 0xb5, 0x84, 0x58, 0x39, 0x48, 0x4d, 0xff, 0x6a, + 0x88, 0x11, 0xa8, 0xfd, 0x11, 0x38, 0x3f, 0xa6, 0x1d, 0x95, 0x31, 0xc5, 0xc8, 0x64, 0xe5, 0x5d, + 0xe7, 0xc7, 0x5c, 0x50, 0x62, 0x60, 0x54, 0xa7, 0x94, 0x69, 0xa8, 0x23, 0xc7, 0x9d, 0xa6, 0xb4, + 0x2f, 0x92, 0x94, 0x65, 0x49, 0x69, 0x5f, 0xe8, 0x94, 0xef, 0xc3, 0xea, 0x88, 0x0f, 0x1c, 0x3b, + 0x59, 0xad, 0x15, 0x6b, 0x10, 0x4b, 0x84, 0xd6, 0xca, 0x74, 0xc9, 0x82, 0x14, 0xb3, 0xf1, 0x63, + 0x6f, 0x74, 0xe4, 0xd0, 0xe1, 0x49, 0xa1, 0xda, 0xbc, 0x59, 0x77, 0x27, 0xa3, 0x1f, 0x20, 0x58, + 0x14, 0x09, 0x8c, 0x1a, 0x54, 0xba, 0xa1, 0x37, 0x56, 0xcb, 0x5c, 0x87, 0x2a, 0x7d, 0xca, 0xeb, + 0x18, 0x37, 0xe0, 0x3a, 0xf2, 0x66, 0xcf, 0x1b, 0x7b, 0x43, 0xef, 0xe4, 0x32, 0xe1, 0x50, 0xfa, + 0x6f, 0x19, 0x58, 0x4c, 0x60, 0xe5, 0x3e, 0x7f, 0x8f, 0x36, 0x56, 0x94, 0x53, 0x4f, 0xec, 0xbc, + 0xa0, 0x1d, 0x3e, 0x44, 0x48, 0xbb, 0x4a, 0xe5, 0xd9, 0xb7, 0xe2, 0xbb, 0xa0, 0xaa, 0x20, 0xf1, + 0x76, 0x73, 0x96, 0xb7, 0x65, 0x79, 0x75, 0x4b, 0x54, 0x55, 0xf1, 0xff, 0xcb, 0x54, 0xe1, 0x81, + 0x1c, 0x72, 0x2e, 0x99, 0x0c, 0xa9, 0x3b, 0x9f, 0x54, 0x0f, 0x62, 0x8f, 0x54, 0x60, 0xfc, 0xab, + 0x0c, 0x40, 0xdc, 0x3b, 0x4c, 0xc7, 0x8c, 0x0e, 0x50, 0x7a, 0x66, 0x45, 0x3b, 0x2c, 0x5f, 0x85, + 0x6a, 0x94, 0x31, 0x16, 0x1f, 0xc9, 0x15, 0x05, 0x13, 0xe7, 0xf2, 0x5d, 0x98, 0x3f, 0x19, 0x7a, + 0x47, 0xa8, 0x3a, 0xc9, 0x03, 0x94, 0x2e, 0xa5, 0xd4, 0x09, 0xac, 0x8e, 0xc5, 0xf8, 0x00, 0xcf, + 0xa7, 0x26, 0x95, 0xe9, 0xc7, 0xb1, 0xf1, 0xfb, 0xd9, 0x28, 0x75, 0x26, 0x9e, 0x89, 0xe7, 0xdb, + 0x19, 0xdf, 0x26, 0x02, 0xfb, 0xbc, 0xc8, 0xc3, 0x27, 0x50, 0xf7, 0x49, 0x3a, 0x2a, 0xd1, 0x99, + 0x7f, 0x8e, 0xe8, 0xac, 0xf9, 0x89, 0x23, 0xf7, 0x4d, 0x68, 0xd8, 0x83, 0x33, 0xee, 0x87, 0x0e, + 0x3a, 0x6b, 0x51, 0x51, 0x93, 0xc9, 0x2a, 0x1a, 0x1c, 0x35, 0xa2, 0xbb, 0x30, 0x2f, 0xaf, 0x08, + 0x45, 0x94, 0xf2, 0xd1, 0x81, 0x18, 0x2c, 0x08, 0x8d, 0x7f, 0xab, 0x72, 0x75, 0x92, 0xab, 0xfb, + 0xfc, 0x59, 0xd1, 0x47, 0x98, 0x9d, 0x8d, 0xad, 0x48, 0x46, 0x92, 0x3e, 0x60, 0x29, 0x8f, 0x08, + 0x28, 0x3d, 0xc0, 0xc9, 0x69, 0xcd, 0xbf, 0xcc, 0xb4, 0x1a, 0x7f, 0x9a, 0x81, 0xe2, 0xb6, 0x37, + 0x16, 0x76, 0xb9, 0xd0, 0xe7, 0x70, 0x9b, 0x44, 0xd7, 0xf3, 0xe6, 0xc4, 0x67, 0x67, 0xf0, 0xfc, + 0xb4, 0xfc, 0x54, 0x7d, 0xa3, 0x96, 0xd4, 0x37, 0xbe, 0x07, 0x37, 0x30, 0x1a, 0xe1, 0x7b, 0x63, + 0xcf, 0x17, 0x5b, 0xd5, 0x1e, 0x92, 0xde, 0xe1, 0xb9, 0xe1, 0xa9, 0x92, 0x9d, 0xd7, 0x8f, 0x39, + 0x3f, 0xd0, 0x28, 0x76, 0x23, 0x02, 0xbc, 0x6b, 0x32, 0x0c, 0xcf, 0x2c, 0x32, 0x15, 0xa5, 0x62, + 0x44, 0x12, 0x75, 0x5e, 0x20, 0xda, 0x08, 0x47, 0xd5, 0xc8, 0xf8, 0x08, 0xca, 0x91, 0xd7, 0x81, + 0xbd, 0x05, 0xe5, 0x53, 0x6f, 0x2c, 0x5d, 0x13, 0x99, 0xc4, 0xd5, 0x05, 0x39, 0x6a, 0xb3, 0x74, + 0x4a, 0x7f, 0x04, 0xc6, 0xcf, 0x8b, 0x50, 0xec, 0xb8, 0x67, 0x9e, 0xd3, 0xc7, 0x6c, 0x9f, 0x11, + 0x1f, 0x79, 0xea, 0x9e, 0xa2, 0xf8, 0x1b, 0x23, 0xfa, 0xf1, 0xd3, 0x01, 0x39, 0x19, 0xd1, 0x8f, + 0x1e, 0x0d, 0x58, 0x86, 0x39, 0x5f, 0xbf, 0xfb, 0x5f, 0xf0, 0x31, 0xff, 0x30, 0x32, 0xda, 0x0a, + 0xda, 0x3d, 0x4f, 0x51, 0x17, 0xdd, 0x49, 0xc7, 0x29, 0xa3, 0xbb, 0x27, 0x65, 0x84, 0xe0, 0x84, + 0xdd, 0x84, 0xa2, 0xbc, 0x29, 0x40, 0x79, 0xd7, 0x94, 0x30, 0x28, 0x41, 0xc8, 0x0d, 0x3e, 0xa7, + 0x68, 0x52, 0xa4, 0x51, 0x09, 0x3b, 0x5d, 0x02, 0x37, 0x05, 0xaf, 0xdd, 0x86, 0x0a, 0xd1, 0x13, + 0x49, 0x49, 0xe6, 0xe7, 0x20, 0x08, 0x09, 0x52, 0x9e, 0xd0, 0x28, 0xa7, 0x3e, 0xa1, 0x81, 0xe9, + 0x5c, 0x91, 0x94, 0xa5, 0x21, 0x02, 0x3d, 0x9c, 0xa0, 0xc1, 0xd5, 0xfb, 0x31, 0xd2, 0xb8, 0xa7, + 0x6b, 0x54, 0xca, 0xb8, 0x7f, 0x0d, 0x6a, 0xc7, 0xf6, 0x70, 0x78, 0x64, 0xf7, 0x9f, 0x91, 0x4d, + 0x5a, 0x25, 0x37, 0x9c, 0x02, 0xa2, 0x51, 0x7a, 0x1b, 0x2a, 0xda, 0x2a, 0x63, 0xf2, 0x4d, 0xde, + 0x84, 0x78, 0x7d, 0xa7, 0x5d, 0x4d, 0xf5, 0x97, 0x70, 0x35, 0x69, 0x49, 0x48, 0xf3, 0xc9, 0x24, + 0xa4, 0x1b, 0x28, 0x4d, 0x65, 0xa2, 0x4a, 0x83, 0x6e, 0xe9, 0xdb, 0x83, 0x01, 0x26, 0xaa, 0xd0, + 0x93, 0x58, 0x38, 0x79, 0x84, 0x5f, 0x20, 0xa5, 0x96, 0x60, 0x44, 0x72, 0x8b, 0xfc, 0xa5, 0x63, + 0xdb, 0x19, 0x60, 0xd2, 0x27, 0x99, 0xb1, 0x45, 0x7b, 0x14, 0x1e, 0xd8, 0xce, 0x80, 0xdd, 0x81, + 0xaa, 0x42, 0xe3, 0xe9, 0xb8, 0x48, 0xf3, 0x2f, 0xd1, 0xe2, 0x4c, 0x34, 0xa0, 0x16, 0x51, 0x8c, + 0xe2, 0xbb, 0x50, 0x15, 0x49, 0x82, 0x7c, 0xf0, 0x2e, 0x06, 0xff, 0x43, 0x8e, 0x37, 0x9e, 0xea, + 0x8f, 0x6f, 0xc8, 0xb1, 0x4a, 0x2e, 0x55, 0xff, 0x63, 0xa6, 0x83, 0x49, 0x94, 0x42, 0x11, 0xa3, + 0x10, 0xcd, 0x4a, 0x42, 0x11, 0x93, 0xa4, 0x18, 0xa2, 0x21, 0x02, 0xf6, 0x91, 0x66, 0x48, 0x35, + 0x91, 0xf8, 0xe6, 0x54, 0xfd, 0x57, 0x98, 0x50, 0x82, 0x7b, 0x9d, 0x40, 0x9c, 0x32, 0x01, 0x77, + 0x07, 0x78, 0x01, 0xaa, 0x64, 0x96, 0x9d, 0xe0, 0x29, 0x01, 0x7e, 0xb5, 0x16, 0x56, 0x0b, 0xaa, + 0xfa, 0x30, 0x59, 0x09, 0xf2, 0xfb, 0x07, 0xed, 0xbd, 0xc6, 0x35, 0x56, 0x81, 0x62, 0xb7, 0xdd, + 0xeb, 0xed, 0xb4, 0x37, 0x1b, 0x19, 0x56, 0x85, 0x52, 0x74, 0x8d, 0x23, 0x2b, 0xbe, 0x5a, 0x1b, + 0x1b, 0xed, 0x83, 0x5e, 0x7b, 0xb3, 0x91, 0xfb, 0x7e, 0xbe, 0x94, 0x6d, 0xe4, 0x8c, 0xbf, 0xc8, + 0x41, 0x45, 0x9b, 0x85, 0xe7, 0x0b, 0xe3, 0x5b, 0x00, 0x68, 0xd2, 0xc4, 0x79, 0x4c, 0x79, 0xb3, + 0x2c, 0x20, 0xb4, 0xf8, 0xba, 0xb3, 0x3c, 0x47, 0xcf, 0x3f, 0x28, 0x67, 0xf9, 0x6b, 0x50, 0xa3, + 0x97, 0x14, 0xf4, 0x70, 0x5d, 0xc1, 0xac, 0x12, 0x50, 0x8a, 0x6a, 0xbc, 0x07, 0x86, 0x44, 0x78, + 0x43, 0x40, 0xde, 0xab, 0x26, 0x10, 0xde, 0x11, 0xc0, 0x0b, 0x1e, 0x81, 0x37, 0x3c, 0xe3, 0x44, + 0x41, 0x1a, 0x61, 0x45, 0xc2, 0x7a, 0xf2, 0x22, 0x9a, 0x94, 0x87, 0xda, 0x45, 0xa4, 0x82, 0x59, + 0x25, 0xa0, 0x6c, 0xe8, 0x1d, 0xc5, 0x40, 0x25, 0x64, 0xa0, 0xd5, 0x59, 0x6e, 0x48, 0x30, 0xcf, + 0xce, 0x8c, 0x3f, 0xab, 0x8c, 0x8c, 0xf1, 0x9d, 0xd9, 0x72, 0x2f, 0xf6, 0x6b, 0xb1, 0xb7, 0x80, + 0x8d, 0xc6, 0x63, 0x2b, 0xc5, 0xd3, 0x94, 0x37, 0xe7, 0x47, 0xe3, 0x71, 0x4f, 0x73, 0xc4, 0xfc, + 0x0a, 0x9c, 0x60, 0x5f, 0x02, 0x6b, 0x89, 0x0d, 0x8c, 0x5d, 0x8c, 0x5c, 0xa8, 0xb1, 0x58, 0xce, + 0xe8, 0x62, 0x39, 0x45, 0xfa, 0x65, 0x53, 0xa5, 0xdf, 0xf3, 0xe4, 0x84, 0xb1, 0x05, 0x95, 0x03, + 0xed, 0x9d, 0x96, 0x3b, 0xe2, 0x84, 0x50, 0x2f, 0xb4, 0xd0, 0xd9, 0x41, 0xce, 0x2d, 0x5f, 0x3e, + 0xcc, 0xa2, 0xf5, 0x26, 0xab, 0xf5, 0xc6, 0xf8, 0x97, 0x19, 0xba, 0x03, 0x1f, 0x75, 0x3e, 0x7e, + 0x1a, 0x46, 0xc5, 0x81, 0xe2, 0xfb, 0x82, 0x15, 0x15, 0xff, 0x91, 0x57, 0xfd, 0xb0, 0x6b, 0x96, + 0x77, 0x7c, 0x1c, 0x70, 0x75, 0xf3, 0xa5, 0x82, 0xb0, 0x7d, 0x04, 0x29, 0xe5, 0x5b, 0x68, 0xf8, + 0x0e, 0xd5, 0x1f, 0xc8, 0x1b, 0x30, 0x42, 0xf9, 0xde, 0xb5, 0x2f, 0x64, 0xab, 0x81, 0x50, 0x41, + 0xa4, 0xa3, 0x5a, 0xdd, 0xf7, 0x89, 0xbe, 0x8d, 0x7f, 0x26, 0xaf, 0x34, 0x4e, 0xcf, 0xef, 0x7d, + 0x28, 0x45, 0xb5, 0x26, 0x4f, 0x58, 0x45, 0x19, 0xe1, 0xc5, 0x39, 0x8e, 0x56, 0x79, 0xa2, 0xc7, + 0xb4, 0xb9, 0x30, 0xd8, 0xd0, 0xd1, 0x7a, 0xfd, 0x36, 0xb0, 0x63, 0xc7, 0x9f, 0x26, 0xa6, 0xcd, + 0xd6, 0x40, 0x8c, 0x46, 0x6d, 0x1c, 0xc2, 0xa2, 0x92, 0x12, 0x9a, 0x45, 0x90, 0x5c, 0xbc, 0xcc, + 0x0b, 0x84, 0x7c, 0x76, 0x46, 0xc8, 0x1b, 0x3f, 0xcb, 0x43, 0x51, 0xbd, 0x79, 0x94, 0xf6, 0x4e, + 0x4f, 0x39, 0xf9, 0x4e, 0x4f, 0x33, 0xf1, 0xa6, 0x03, 0x2e, 0xbd, 0x3c, 0xef, 0xef, 0x4e, 0x1f, + 0xd9, 0x9a, 0xd3, 0x3c, 0x71, 0x6c, 0xaf, 0x40, 0x7e, 0x6c, 0x87, 0xa7, 0xe8, 0x20, 0x23, 0xe6, + 0xc1, 0x6f, 0xe5, 0x4c, 0x2f, 0x24, 0x9d, 0xe9, 0x69, 0x6f, 0x1a, 0x91, 0x4a, 0x3a, 0xf3, 0xa6, + 0xd1, 0x0d, 0x20, 0xfd, 0x42, 0xcb, 0x87, 0x29, 0x21, 0x40, 0x9c, 0x45, 0x49, 0x75, 0xa4, 0x34, + 0xad, 0x8e, 0xbc, 0xb4, 0xaa, 0xf0, 0x1e, 0xcc, 0xd1, 0x7d, 0x60, 0x79, 0xaf, 0x49, 0x1d, 0x28, + 0x72, 0x0e, 0xd5, 0xff, 0x94, 0x04, 0x6b, 0x4a, 0x5a, 0xfd, 0x81, 0x90, 0x4a, 0xe2, 0x81, 0x10, + 0xdd, 0xc9, 0x5f, 0x4d, 0x3a, 0xf9, 0xef, 0x41, 0x23, 0x9a, 0x50, 0x74, 0x99, 0xb9, 0x81, 0xbc, + 0xd1, 0x51, 0x57, 0x70, 0x21, 0x25, 0xf7, 0x82, 0xf8, 0x40, 0xac, 0x27, 0x0e, 0x44, 0x21, 0xc3, + 0x5a, 0x61, 0xc8, 0x47, 0xe3, 0x50, 0x1e, 0x88, 0x98, 0xf3, 0xad, 0x77, 0x30, 0x79, 0xe3, 0xaf, + 0x06, 0xe5, 0xce, 0x9e, 0xb5, 0xb5, 0xd3, 0x79, 0xb2, 0xdd, 0x6b, 0x64, 0xc4, 0x67, 0xf7, 0x70, + 0x63, 0xa3, 0xdd, 0xde, 0xc4, 0x13, 0x07, 0x60, 0x6e, 0xab, 0xd5, 0x11, 0xa7, 0x4f, 0xce, 0xf8, + 0x69, 0x16, 0x2a, 0x5a, 0xf5, 0xec, 0xfd, 0x68, 0x56, 0xe8, 0x0d, 0x89, 0x5b, 0xb3, 0x5d, 0x78, + 0xa0, 0x44, 0xb1, 0x36, 0x2d, 0xd1, 0x0b, 0x4e, 0xd9, 0x2b, 0x5f, 0x70, 0x62, 0x6f, 0xc0, 0xbc, + 0x4d, 0x35, 0x44, 0xb3, 0x20, 0xdd, 0xc1, 0x12, 0x2c, 0x27, 0x01, 0xb3, 0xc0, 0xe2, 0xf3, 0x44, + 0xd0, 0xe5, 0x55, 0xe2, 0x55, 0x74, 0xa4, 0xe0, 0x64, 0x15, 0x8f, 0x6d, 0x67, 0x38, 0xf1, 0xb9, + 0x0c, 0xdf, 0x46, 0x27, 0x33, 0x41, 0x4d, 0x85, 0x36, 0x3e, 0x00, 0x88, 0xfb, 0x9c, 0x9c, 0x9c, + 0x6b, 0xc9, 0xc9, 0xc9, 0x68, 0x93, 0x93, 0x35, 0x36, 0x49, 0x8c, 0xc8, 0x89, 0x8e, 0x22, 0xd5, + 0xef, 0x80, 0xf2, 0x48, 0x59, 0x98, 0x87, 0x39, 0x1e, 0xf2, 0x50, 0xdd, 0x8d, 0x5c, 0x90, 0x98, + 0x4e, 0x84, 0x50, 0x57, 0x95, 0xe3, 0x5a, 0x62, 0x69, 0x24, 0x59, 0x72, 0x5a, 0x1a, 0x49, 0x52, + 0x33, 0xc2, 0x1b, 0x6b, 0xd0, 0xdc, 0xe4, 0xa2, 0xb6, 0xd6, 0x70, 0x38, 0xd5, 0x1d, 0xe3, 0x06, + 0x5c, 0x4f, 0xc1, 0x49, 0x27, 0xc4, 0xa7, 0xb0, 0xdc, 0xa2, 0x6b, 0x90, 0xbf, 0xaa, 0xbb, 0x18, + 0x46, 0x13, 0x56, 0xa6, 0xab, 0x94, 0x8d, 0x6d, 0xc1, 0xc2, 0x26, 0x3f, 0x9a, 0x9c, 0xec, 0xf0, + 0xb3, 0xb8, 0x21, 0x06, 0xf9, 0xe0, 0xd4, 0x3b, 0x97, 0xf3, 0x83, 0x7f, 0x8b, 0x3d, 0x3c, 0x14, + 0x34, 0x56, 0x30, 0xe6, 0x7d, 0xe5, 0x11, 0x45, 0x48, 0x77, 0xcc, 0xfb, 0xc6, 0xfb, 0xc0, 0xf4, + 0x7a, 0xe4, 0x7c, 0x09, 0x2b, 0x61, 0x72, 0x64, 0x05, 0x97, 0x41, 0xc8, 0x47, 0xea, 0x89, 0x12, + 0x08, 0x26, 0x47, 0x5d, 0x82, 0x18, 0x77, 0xa1, 0x7a, 0x60, 0x5f, 0x9a, 0xfc, 0x4b, 0x79, 0xcb, + 0x60, 0x15, 0x8a, 0x63, 0xfb, 0x52, 0x88, 0x81, 0x28, 0x38, 0x82, 0x68, 0xe3, 0x8f, 0xf2, 0x30, + 0x47, 0x94, 0xec, 0x0e, 0xbd, 0x22, 0xe8, 0xb8, 0xb8, 0x0d, 0x95, 0xa0, 0xd4, 0x40, 0x33, 0xb2, + 0x34, 0x3b, 0x2b, 0x4b, 0xa5, 0x03, 0x4d, 0xbd, 0x9e, 0xa0, 0xdc, 0xd8, 0xee, 0x64, 0xa4, 0x9e, + 0x4c, 0x60, 0x37, 0xa1, 0x1c, 0x5f, 0xe7, 0xca, 0xc7, 0xaf, 0x44, 0xd2, 0x25, 0xae, 0x64, 0xa0, + 0x31, 0xb6, 0x45, 0xa8, 0x77, 0xea, 0x88, 0x90, 0xe2, 0x52, 0x07, 0xa5, 0x1a, 0x3c, 0x45, 0x75, + 0x7f, 0x25, 0x69, 0xf0, 0xcc, 0x18, 0x36, 0xa5, 0x17, 0x1b, 0x36, 0xe4, 0x59, 0x7b, 0x8e, 0x61, + 0x03, 0x2f, 0x61, 0xd8, 0xbc, 0x44, 0x90, 0xef, 0x3a, 0x94, 0xf0, 0xdc, 0xd7, 0xa4, 0xa7, 0x38, + 0xef, 0x85, 0xf4, 0xfc, 0x50, 0x53, 0xfd, 0x29, 0xc3, 0xe0, 0x46, 0xbc, 0x4d, 0x4c, 0xfe, 0xe5, + 0xaf, 0x27, 0x78, 0xf2, 0x05, 0x14, 0x25, 0x54, 0x30, 0xb4, 0x6b, 0x8f, 0xd4, 0x03, 0x34, 0xf8, + 0xb7, 0x98, 0x36, 0x7c, 0x35, 0xe3, 0xcb, 0x89, 0xe3, 0xf3, 0x81, 0x7a, 0xe6, 0xc0, 0xc1, 0x3d, + 0x2a, 0x20, 0x62, 0x80, 0xc2, 0x0c, 0x71, 0xbd, 0x73, 0x57, 0x5e, 0x72, 0x2e, 0x3a, 0xc1, 0x53, + 0xf1, 0x69, 0x30, 0x68, 0xe0, 0x13, 0x54, 0x63, 0xcf, 0x57, 0x87, 0x93, 0xf1, 0xb3, 0x0c, 0x34, + 0xe4, 0xee, 0x8a, 0x70, 0xba, 0x15, 0x50, 0xb8, 0x2a, 0x20, 0xfe, 0xfc, 0x47, 0x0b, 0x0c, 0xa8, + 0xa1, 0xf3, 0x23, 0x3a, 0xa9, 0xc8, 0x79, 0x53, 0x11, 0xc0, 0x2d, 0x79, 0x5a, 0xbd, 0x02, 0x15, + 0x95, 0x8e, 0x39, 0x72, 0x86, 0xea, 0x41, 0x58, 0xca, 0xc7, 0xdc, 0x75, 0x86, 0xea, 0xa0, 0xf3, + 0x6d, 0x79, 0x9f, 0x2a, 0x83, 0x07, 0x9d, 0x69, 0x87, 0xdc, 0xf8, 0x4f, 0x19, 0x58, 0xd0, 0x86, + 0x22, 0xf7, 0xed, 0xc7, 0x50, 0x8d, 0xde, 0x7e, 0xe3, 0x91, 0xe6, 0xb5, 0x9a, 0x14, 0x34, 0x71, + 0xb1, 0x4a, 0x3f, 0x82, 0x04, 0xa2, 0x33, 0x03, 0xfb, 0x12, 0xfb, 0x1b, 0x4c, 0x46, 0xca, 0xb8, + 0x19, 0xd8, 0x97, 0x5b, 0x9c, 0x77, 0x27, 0x23, 0x61, 0xba, 0x9e, 0x73, 0xfe, 0x2c, 0x22, 0x20, + 0x9d, 0x0b, 0x04, 0x4c, 0x52, 0x18, 0x50, 0x1b, 0x79, 0x6e, 0x78, 0x1a, 0x91, 0x48, 0xad, 0x13, + 0x81, 0x44, 0x63, 0xfc, 0x79, 0x16, 0x16, 0xc9, 0xc5, 0x26, 0x5d, 0x9b, 0x52, 0x74, 0x35, 0x61, + 0x8e, 0xbc, 0x8d, 0x24, 0xbc, 0xb6, 0xaf, 0x99, 0xf2, 0x9b, 0xbd, 0xf7, 0x92, 0x6e, 0x41, 0x75, + 0x65, 0xeb, 0x8a, 0xe9, 0xcf, 0xcd, 0x4e, 0xff, 0xd5, 0xd3, 0x9b, 0x16, 0x71, 0x2b, 0xa4, 0x45, + 0xdc, 0x5e, 0x26, 0xce, 0x35, 0x73, 0xaf, 0xa9, 0x28, 0x69, 0xb4, 0x7b, 0x4d, 0xef, 0xc3, 0x6a, + 0x82, 0x06, 0xa5, 0xb5, 0x73, 0xec, 0x70, 0x75, 0x87, 0x7c, 0x49, 0xa3, 0xee, 0x2a, 0xdc, 0x7a, + 0x11, 0x0a, 0x41, 0xdf, 0x1b, 0x73, 0x63, 0x05, 0x96, 0x92, 0xb3, 0x2a, 0x8f, 0x89, 0x3f, 0xc8, + 0x40, 0x53, 0xe6, 0x47, 0x38, 0xee, 0xc9, 0xb6, 0x13, 0x84, 0x9e, 0x1f, 0xbd, 0x91, 0x76, 0x0b, + 0x20, 0x08, 0x6d, 0x5f, 0x5a, 0x9b, 0xa4, 0x07, 0x97, 0x11, 0x82, 0x96, 0xe4, 0x75, 0x28, 0x71, + 0x77, 0x40, 0x48, 0xe2, 0x86, 0x22, 0x77, 0x07, 0xca, 0x0e, 0x9d, 0xd1, 0xbf, 0x6b, 0x49, 0xf3, + 0x42, 0x5e, 0xb0, 0x14, 0xb3, 0xc3, 0xcf, 0xf0, 0xe0, 0xcd, 0x47, 0x17, 0x2c, 0x77, 0xed, 0x0b, + 0xcc, 0x36, 0x0c, 0x8c, 0x7f, 0x9c, 0x85, 0xf9, 0xb8, 0x7f, 0x74, 0x3b, 0x3b, 0x21, 0xbf, 0x65, + 0xaf, 0x62, 0xf9, 0x7d, 0x47, 0xb2, 0x83, 0x23, 0xf4, 0x77, 0xcd, 0xf1, 0x58, 0xa2, 0xcd, 0xd9, + 0x71, 0x99, 0x01, 0x15, 0x45, 0xe1, 0x4d, 0x42, 0xed, 0xa9, 0xa2, 0x32, 0x91, 0xec, 0x4f, 0x42, + 0x61, 0x70, 0x09, 0xcb, 0xd3, 0x71, 0xa5, 0xc9, 0x53, 0xb0, 0x47, 0x61, 0x07, 0x5f, 0x40, 0x16, + 0x60, 0x51, 0x8c, 0x16, 0x52, 0x50, 0x09, 0xfa, 0x06, 0xe9, 0xd9, 0xb4, 0x72, 0xa8, 0x63, 0xeb, + 0x4a, 0x28, 0x3d, 0x06, 0x19, 0x29, 0xa1, 0xaf, 0x40, 0x85, 0x2a, 0x8f, 0xaf, 0xb1, 0xe5, 0xcd, + 0x32, 0xb6, 0x80, 0x78, 0xe9, 0x04, 0xf2, 0x26, 0x09, 0xd3, 0x17, 0xa8, 0x29, 0x4c, 0x3f, 0xf8, + 0x07, 0x19, 0xb8, 0x9e, 0xb2, 0x6c, 0x72, 0x97, 0x6f, 0xc0, 0xc2, 0x71, 0x84, 0x54, 0xb3, 0x4b, + 0x5b, 0x7d, 0x45, 0x89, 0xd5, 0xe4, 0x9c, 0x9a, 0x8d, 0xe3, 0x24, 0x20, 0x36, 0xba, 0x68, 0x05, + 0x13, 0x37, 0x15, 0xd1, 0xe8, 0xa2, 0x65, 0x24, 0x7b, 0xe7, 0x00, 0xd6, 0xda, 0x17, 0x42, 0x62, + 0x6c, 0xe8, 0x4f, 0x78, 0x2b, 0x36, 0x4a, 0x3a, 0x98, 0x33, 0x2f, 0xe5, 0x60, 0x1e, 0xd0, 0x85, + 0xac, 0xa8, 0xae, 0x6f, 0x53, 0x09, 0x1e, 0xa0, 0xa2, 0x0c, 0x3d, 0x41, 0xae, 0x6e, 0x4b, 0xf6, + 0xa3, 0xa7, 0xc7, 0x8d, 0x00, 0xe6, 0x77, 0x27, 0xc3, 0xd0, 0x89, 0x5f, 0x23, 0x67, 0xef, 0xc9, + 0x32, 0xd8, 0x8e, 0x9a, 0xb5, 0xd4, 0x86, 0x20, 0x6a, 0x08, 0x27, 0x6b, 0x24, 0x2a, 0xb2, 0x66, + 0xdb, 0x9b, 0x1f, 0x25, 0x5b, 0x30, 0xae, 0xc3, 0x6a, 0xfc, 0x45, 0xd3, 0xa6, 0x8e, 0x9a, 0x7f, + 0x91, 0xa1, 0xd4, 0xe6, 0xe4, 0xcb, 0xe8, 0xac, 0x0d, 0x8b, 0x81, 0xe3, 0x9e, 0x0c, 0xb9, 0x5e, + 0x7d, 0x20, 0x27, 0x61, 0x39, 0xd9, 0x37, 0xf9, 0x7a, 0xba, 0xb9, 0x40, 0x25, 0xe2, 0xda, 0x02, + 0xb6, 0x7e, 0x55, 0x27, 0x63, 0xb6, 0x98, 0x9a, 0x8d, 0xd9, 0xce, 0x77, 0xa0, 0x9e, 0x6c, 0x88, + 0x7d, 0x28, 0x2f, 0x23, 0xc6, 0xbd, 0xca, 0x4d, 0xdd, 0x2b, 0x8b, 0x19, 0xa2, 0x12, 0xcf, 0x7d, + 0x60, 0xfc, 0xc3, 0x0c, 0x34, 0x4d, 0x2e, 0x38, 0x57, 0xeb, 0xa5, 0xe2, 0x99, 0x8f, 0x67, 0x6a, + 0xbd, 0x7a, 0xac, 0xea, 0x8e, 0xa3, 0xea, 0xd1, 0xdb, 0x57, 0x2e, 0xc6, 0xf6, 0xb5, 0x99, 0x11, + 0xad, 0x97, 0x60, 0x8e, 0x48, 0x8c, 0x55, 0x58, 0x96, 0xfd, 0x51, 0x7d, 0x89, 0xa3, 0x87, 0x89, + 0x16, 0x13, 0xd1, 0xc3, 0x35, 0x68, 0xd2, 0x53, 0x77, 0xfa, 0x20, 0x64, 0xc1, 0x4d, 0x60, 0xbb, + 0x76, 0xdf, 0xf6, 0x3d, 0xcf, 0x3d, 0xe0, 0xbe, 0x4c, 0x14, 0x45, 0x0d, 0x13, 0x83, 0x6b, 0x4a, + 0x15, 0xa6, 0x2f, 0xf5, 0x40, 0x9b, 0xe7, 0xaa, 0xbc, 0x18, 0xfa, 0x32, 0x4c, 0x58, 0x5c, 0xb7, + 0x9f, 0x71, 0x55, 0x93, 0x9a, 0xa2, 0x4f, 0xa0, 0x32, 0x8e, 0x2a, 0x55, 0xf3, 0xae, 0x6e, 0x2c, + 0xcf, 0x36, 0x6b, 0xea, 0xd4, 0xc6, 0x63, 0x58, 0x4a, 0xd6, 0x29, 0x45, 0xc7, 0x1a, 0x94, 0x46, + 0x12, 0x26, 0x7b, 0x17, 0x7d, 0x1b, 0x3f, 0x29, 0x41, 0x51, 0xda, 0x73, 0xec, 0x01, 0xe4, 0xfb, + 0x2a, 0x37, 0x29, 0x7e, 0x08, 0x43, 0x62, 0xd5, 0xff, 0x1b, 0x98, 0xa1, 0x24, 0xe8, 0xd8, 0x27, + 0x50, 0x4f, 0x46, 0x45, 0xa7, 0xae, 0x43, 0x26, 0xc3, 0x99, 0xb5, 0xfe, 0x54, 0xfc, 0xab, 0x1c, + 0x1f, 0x8e, 0xa4, 0x33, 0x94, 0x4e, 0xb5, 0xd3, 0xd3, 0x73, 0x85, 0xbe, 0x1d, 0x9c, 0xda, 0xd6, + 0xe3, 0xf7, 0x3f, 0x90, 0xf7, 0x21, 0x2b, 0x08, 0xec, 0x9e, 0xda, 0x8f, 0xdf, 0xff, 0x60, 0x5a, + 0x93, 0xa6, 0x2b, 0x71, 0xba, 0x26, 0xbd, 0x04, 0x05, 0x7a, 0x89, 0x8c, 0x92, 0x4c, 0xe8, 0x83, + 0x3d, 0x82, 0x25, 0x69, 0xb6, 0x5a, 0x32, 0x1d, 0x98, 0xa4, 0x60, 0x89, 0xee, 0xe0, 0x48, 0x5c, + 0x17, 0x51, 0xe4, 0x1b, 0x5a, 0x81, 0xb9, 0xd3, 0xf8, 0x59, 0xb9, 0x9a, 0x29, 0xbf, 0x8c, 0x3f, + 0x2f, 0x40, 0x45, 0x9b, 0x14, 0x56, 0x85, 0x92, 0xd9, 0xee, 0xb6, 0xcd, 0xcf, 0xda, 0x9b, 0x8d, + 0x6b, 0xec, 0x1e, 0xbc, 0xde, 0xd9, 0xdb, 0xd8, 0x37, 0xcd, 0xf6, 0x46, 0xcf, 0xda, 0x37, 0x2d, + 0xf5, 0x46, 0xca, 0x41, 0xeb, 0x8b, 0xdd, 0xf6, 0x5e, 0xcf, 0xda, 0x6c, 0xf7, 0x5a, 0x9d, 0x9d, + 0x6e, 0x23, 0xc3, 0x6e, 0x42, 0x33, 0xa6, 0x54, 0xe8, 0xd6, 0xee, 0xfe, 0xe1, 0x5e, 0xaf, 0x91, + 0x65, 0xb7, 0xe1, 0xc6, 0x56, 0x67, 0xaf, 0xb5, 0x63, 0xc5, 0x34, 0x1b, 0x3b, 0xbd, 0xcf, 0xac, + 0xf6, 0x6f, 0x1f, 0x74, 0xcc, 0x2f, 0x1a, 0xb9, 0x34, 0x02, 0x61, 0x8c, 0xab, 0x1a, 0xf2, 0xec, + 0x3a, 0x2c, 0x13, 0x01, 0x15, 0xb1, 0x7a, 0xfb, 0xfb, 0x56, 0x77, 0x7f, 0x7f, 0xaf, 0x51, 0x60, + 0x0b, 0x50, 0xeb, 0xec, 0x7d, 0xd6, 0xda, 0xe9, 0x6c, 0x5a, 0x66, 0xbb, 0xb5, 0xb3, 0xdb, 0x98, + 0x63, 0x8b, 0x30, 0x3f, 0x4d, 0x57, 0x14, 0x55, 0x28, 0xba, 0xfd, 0xbd, 0xce, 0xfe, 0x9e, 0xf5, + 0x59, 0xdb, 0xec, 0x76, 0xf6, 0xf7, 0x1a, 0x25, 0xb6, 0x02, 0x2c, 0x89, 0xda, 0xde, 0x6d, 0x6d, + 0x34, 0xca, 0x6c, 0x19, 0x16, 0x92, 0xf0, 0xa7, 0xed, 0x2f, 0x1a, 0xc0, 0x9a, 0xb0, 0x44, 0x1d, + 0xb3, 0xd6, 0xdb, 0x3b, 0xfb, 0x9f, 0x5b, 0xbb, 0x9d, 0xbd, 0xce, 0xee, 0xe1, 0x6e, 0xa3, 0x82, + 0x8f, 0x30, 0xb5, 0xdb, 0x56, 0x67, 0xaf, 0x7b, 0xb8, 0xb5, 0xd5, 0xd9, 0xe8, 0xb4, 0xf7, 0x7a, + 0x8d, 0x2a, 0xb5, 0x9c, 0x36, 0xf0, 0x9a, 0x28, 0x20, 0xef, 0x0c, 0x58, 0x9b, 0x9d, 0x6e, 0x6b, + 0x7d, 0xa7, 0xbd, 0xd9, 0xa8, 0xb3, 0x5b, 0x70, 0xbd, 0xd7, 0xde, 0x3d, 0xd8, 0x37, 0x5b, 0xe6, + 0x17, 0xea, 0x4e, 0x81, 0xb5, 0xd5, 0xea, 0xec, 0x1c, 0x9a, 0xed, 0xc6, 0x3c, 0x7b, 0x15, 0x6e, + 0x99, 0xed, 0x4f, 0x0f, 0x3b, 0x66, 0x7b, 0xd3, 0xda, 0xdb, 0xdf, 0x6c, 0x5b, 0x5b, 0xed, 0x56, + 0xef, 0xd0, 0x6c, 0x5b, 0xbb, 0x9d, 0x6e, 0xb7, 0xb3, 0xf7, 0xa4, 0xd1, 0x60, 0xaf, 0xc3, 0x9d, + 0x88, 0x24, 0xaa, 0x60, 0x8a, 0x6a, 0x41, 0x8c, 0x4f, 0x2d, 0xe9, 0x5e, 0xfb, 0xb7, 0x7b, 0xd6, + 0x41, 0xbb, 0x6d, 0x36, 0x18, 0x5b, 0x83, 0x95, 0xb8, 0x79, 0x6a, 0x40, 0xb6, 0xbd, 0x28, 0x70, + 0x07, 0x6d, 0x73, 0xb7, 0xb5, 0x27, 0x16, 0x38, 0x81, 0x5b, 0x12, 0xdd, 0x8e, 0x71, 0xd3, 0xdd, + 0x5e, 0x66, 0x0c, 0xea, 0xda, 0xaa, 0x6c, 0xb5, 0xcc, 0xc6, 0x0a, 0x9b, 0x87, 0xca, 0xee, 0xc1, + 0x81, 0xd5, 0xeb, 0xec, 0xb6, 0xf7, 0x0f, 0x7b, 0x8d, 0x55, 0xb6, 0x0c, 0x8d, 0xce, 0x5e, 0xaf, + 0x6d, 0x8a, 0xb5, 0x56, 0x45, 0xff, 0x57, 0x91, 0x2d, 0xc1, 0xbc, 0xea, 0xa9, 0x82, 0xfe, 0xa2, + 0xc8, 0x56, 0x81, 0x1d, 0xee, 0x99, 0xed, 0xd6, 0xa6, 0x98, 0xb8, 0x08, 0xf1, 0xbf, 0x8b, 0x32, + 0x42, 0xf2, 0xb3, 0x5c, 0x74, 0x58, 0xc7, 0x29, 0x07, 0xc9, 0x47, 0x46, 0xab, 0xda, 0xe3, 0xa0, + 0x2f, 0x7a, 0xfe, 0x5b, 0x33, 0xad, 0x72, 0x33, 0xa6, 0xd5, 0x8c, 0xed, 0x5e, 0xd3, 0x75, 0xbf, + 0xd7, 0xa0, 0x36, 0xa2, 0x07, 0x47, 0xe5, 0xc3, 0x82, 0x20, 0xf3, 0x6f, 0x08, 0x48, 0xaf, 0x0a, + 0xce, 0xbc, 0x7f, 0x5d, 0x98, 0x7d, 0xff, 0x3a, 0x4d, 0xbf, 0x9f, 0x4b, 0xd3, 0xef, 0xef, 0xc3, + 0x02, 0x89, 0x26, 0xc7, 0x75, 0x46, 0xca, 0x6a, 0x26, 0x2d, 0x70, 0x1e, 0x45, 0x14, 0xc1, 0x95, + 0x39, 0xa1, 0x4c, 0x0e, 0x29, 0x42, 0x8a, 0xd2, 0xda, 0x48, 0x58, 0x1a, 0x24, 0x39, 0x22, 0x4b, + 0x23, 0x6a, 0xc1, 0xbe, 0x88, 0x5b, 0xa8, 0x68, 0x2d, 0x10, 0x1c, 0x5b, 0xb8, 0x0f, 0x0b, 0xfc, + 0x22, 0xf4, 0x6d, 0xcb, 0x1b, 0xdb, 0x5f, 0x4e, 0x30, 0x84, 0x6b, 0xa3, 0x0d, 0x5f, 0x35, 0xe7, + 0x11, 0xb1, 0x8f, 0xf0, 0x4d, 0x3b, 0xb4, 0xef, 0x7f, 0x0d, 0x15, 0xed, 0x31, 0x5a, 0xb6, 0x0a, + 0x8b, 0x9f, 0x77, 0x7a, 0x7b, 0xed, 0x6e, 0xd7, 0x3a, 0x38, 0x5c, 0x7f, 0xda, 0xfe, 0xc2, 0xda, + 0x6e, 0x75, 0xb7, 0x1b, 0xd7, 0xc4, 0xa6, 0xdd, 0x6b, 0x77, 0x7b, 0xed, 0xcd, 0x04, 0x3c, 0xc3, + 0x5e, 0x81, 0xb5, 0xc3, 0xbd, 0xc3, 0x6e, 0x7b, 0xd3, 0x4a, 0x2b, 0x97, 0x15, 0x5c, 0x2a, 0xf1, + 0x29, 0xc5, 0x73, 0xf7, 0x3f, 0x81, 0xc6, 0x74, 0x34, 0x29, 0x11, 0x7e, 0x7b, 0x5e, 0x9c, 0xee, + 0xfe, 0xbf, 0xc9, 0x01, 0xc4, 0xe9, 0xfe, 0x42, 0x50, 0x6c, 0xb6, 0x7a, 0xad, 0x9d, 0x7d, 0xd1, + 0x09, 0x73, 0xbf, 0x27, 0xf6, 0xbf, 0xd9, 0xfe, 0xb4, 0x71, 0x2d, 0x15, 0xb3, 0x7f, 0xd0, 0x6b, + 0x64, 0xc4, 0x78, 0x3b, 0x7b, 0x9d, 0x5e, 0xa7, 0xb5, 0x63, 0x99, 0xfb, 0x87, 0x9d, 0xbd, 0x27, + 0xf4, 0xdc, 0x14, 0xca, 0xc8, 0xc3, 0x83, 0x2d, 0x73, 0x7f, 0xaf, 0x67, 0x75, 0xb7, 0x0f, 0x7b, + 0x9b, 0xf8, 0x58, 0xd5, 0x86, 0xd9, 0x39, 0xa0, 0x3a, 0xf3, 0xcf, 0x23, 0x10, 0x55, 0x17, 0xc4, + 0x8c, 0x3d, 0xd9, 0xef, 0x76, 0x3b, 0x07, 0xd6, 0xa7, 0x87, 0x6d, 0xb3, 0xd3, 0xee, 0x62, 0xc1, + 0xb9, 0x14, 0xb8, 0xa0, 0x2f, 0x0a, 0xc9, 0xda, 0xdb, 0xf9, 0x4c, 0x8a, 0x3e, 0x41, 0x5a, 0x4a, + 0x82, 0x04, 0x55, 0x59, 0x48, 0x04, 0x21, 0x3b, 0x52, 0x6a, 0x86, 0x2b, 0x70, 0xa2, 0x5c, 0x45, + 0x48, 0xc5, 0x6e, 0xaf, 0xd5, 0xeb, 0x6c, 0x58, 0xf2, 0x85, 0x3b, 0xb1, 0x08, 0xa2, 0x58, 0x35, + 0x1d, 0x25, 0x4a, 0xa1, 0xc0, 0x8c, 0x8e, 0x97, 0xcd, 0x4d, 0x13, 0x0b, 0xd4, 0x67, 0xa0, 0x82, + 0x76, 0x5e, 0x2c, 0x94, 0x10, 0x2e, 0x82, 0xa4, 0xa1, 0x3e, 0x04, 0x66, 0xe1, 0xf1, 0xef, 0xe7, + 0xa0, 0x4e, 0x57, 0xaf, 0xe8, 0x97, 0x7c, 0xb8, 0xcf, 0x76, 0xa1, 0x28, 0x7f, 0x12, 0x8a, 0x2d, + 0x47, 0x8f, 0x0e, 0xe9, 0x3f, 0x42, 0xb5, 0xb6, 0x32, 0x0d, 0x96, 0xca, 0xd4, 0xe2, 0xdf, 0xfc, + 0xb3, 0xbf, 0xfa, 0x47, 0xd9, 0x1a, 0xab, 0x3c, 0x3c, 0x7b, 0xf7, 0xe1, 0x09, 0x77, 0x03, 0x51, + 0xc7, 0x5f, 0x03, 0x88, 0x7f, 0xe8, 0x88, 0x35, 0xa3, 0x10, 0xd2, 0xd4, 0xaf, 0x40, 0xad, 0x5d, + 0x4f, 0xc1, 0xc8, 0x7a, 0xaf, 0x63, 0xbd, 0x8b, 0x46, 0x5d, 0xd4, 0xeb, 0xb8, 0x4e, 0x48, 0x3f, + 0x7a, 0xf4, 0x71, 0xe6, 0x3e, 0x1b, 0x40, 0x55, 0xff, 0x09, 0x22, 0xa6, 0xf4, 0x9c, 0x94, 0x1f, + 0x51, 0x5a, 0xbb, 0x91, 0x8a, 0x53, 0x1a, 0x24, 0xb6, 0xb1, 0x6c, 0x34, 0x44, 0x1b, 0x13, 0xa4, + 0x88, 0x5b, 0x19, 0x92, 0x4e, 0x1d, 0xff, 0xd2, 0x10, 0xbb, 0xa9, 0x69, 0x45, 0x33, 0xbf, 0x73, + 0xb4, 0x76, 0xeb, 0x0a, 0xac, 0x6c, 0xeb, 0x16, 0xb6, 0xb5, 0x6a, 0x30, 0xd1, 0x56, 0x1f, 0x69, + 0xd4, 0xef, 0x1c, 0x7d, 0x9c, 0xb9, 0xff, 0xf8, 0x2f, 0xef, 0x41, 0x39, 0x4a, 0xc5, 0x64, 0xbf, + 0x0b, 0xb5, 0xc4, 0xdd, 0x38, 0xa6, 0x86, 0x91, 0x76, 0x95, 0x6e, 0xed, 0x66, 0x3a, 0x52, 0x36, + 0xfc, 0x0a, 0x36, 0xdc, 0x64, 0x2b, 0xa2, 0x61, 0x79, 0xf7, 0xec, 0x21, 0xde, 0x20, 0xa5, 0x27, + 0x9c, 0x9e, 0x69, 0xb6, 0x03, 0x35, 0x76, 0x73, 0x5a, 0x9f, 0x4f, 0xb4, 0x76, 0xeb, 0x0a, 0xac, + 0x6c, 0xee, 0x26, 0x36, 0xb7, 0xc2, 0x96, 0xf4, 0xe6, 0x54, 0xe2, 0x24, 0xe3, 0xf8, 0x6c, 0x9a, + 0xfe, 0x43, 0x3c, 0xec, 0x56, 0xfc, 0xc8, 0x55, 0xca, 0x0f, 0xf4, 0x44, 0x2c, 0x32, 0xfb, 0x2b, + 0x3d, 0x46, 0x13, 0x9b, 0x62, 0x0c, 0x97, 0x4f, 0xff, 0x1d, 0x1e, 0x76, 0x04, 0x15, 0xed, 0xed, + 0x7a, 0x76, 0xfd, 0xca, 0x77, 0xf6, 0xd7, 0xd6, 0xd2, 0x50, 0x69, 0x43, 0xd1, 0xeb, 0x7f, 0x78, + 0xcc, 0x39, 0xfb, 0x21, 0x94, 0xa3, 0x17, 0xd1, 0xd9, 0xaa, 0xf6, 0x42, 0xbd, 0xfe, 0x82, 0xfb, + 0x5a, 0x73, 0x16, 0x91, 0xc6, 0x7c, 0x7a, 0xed, 0x82, 0xf9, 0x3e, 0x87, 0x8a, 0xf6, 0xea, 0x79, + 0x34, 0x80, 0xd9, 0x97, 0xd5, 0xa3, 0x01, 0xa4, 0x3c, 0x92, 0x6e, 0x2c, 0x60, 0x13, 0x15, 0x56, + 0x46, 0xfe, 0x0e, 0x2f, 0xbc, 0x80, 0xed, 0xc0, 0xb2, 0xb4, 0x93, 0x8e, 0xf8, 0x37, 0x59, 0x86, + 0x94, 0xdf, 0x3e, 0x7a, 0x94, 0x61, 0x9f, 0x40, 0x49, 0x3d, 0x6e, 0xcf, 0x56, 0xd2, 0x1f, 0xe9, + 0x5f, 0x5b, 0x9d, 0x81, 0x4b, 0xa3, 0xe6, 0x0b, 0x80, 0xf8, 0x89, 0xf5, 0x48, 0x48, 0xcc, 0x3c, + 0xd9, 0x1e, 0x71, 0xc0, 0xec, 0x7b, 0xec, 0xc6, 0x0a, 0x0e, 0xb0, 0xc1, 0x50, 0x48, 0xb8, 0xfc, + 0x5c, 0xbd, 0x1f, 0xf9, 0x23, 0xa8, 0x68, 0xaf, 0xac, 0x47, 0xd3, 0x37, 0xfb, 0x42, 0x7b, 0x34, + 0x7d, 0x29, 0x8f, 0xb2, 0x1b, 0x6b, 0x58, 0xfb, 0x92, 0x31, 0x2f, 0x6a, 0x17, 0x8a, 0x92, 0x54, + 0x58, 0xc4, 0x02, 0x9d, 0x42, 0x2d, 0xf1, 0x94, 0x7a, 0xb4, 0x43, 0xd3, 0x1e, 0x6a, 0x8f, 0x76, + 0x68, 0xea, 0xeb, 0xeb, 0x8a, 0xcf, 0x8c, 0x05, 0xd1, 0xce, 0x19, 0x92, 0x68, 0x2d, 0xfd, 0x00, + 0x2a, 0xda, 0xb3, 0xe8, 0xd1, 0x58, 0x66, 0x5f, 0x60, 0x8f, 0xc6, 0x92, 0xf6, 0x8a, 0xfa, 0x12, + 0xb6, 0x51, 0x37, 0x90, 0x15, 0xf0, 0x75, 0x3e, 0x51, 0xf7, 0xef, 0x42, 0x3d, 0xf9, 0x52, 0x7a, + 0xb4, 0xf7, 0x53, 0x9f, 0x5c, 0x8f, 0xf6, 0xfe, 0x15, 0xcf, 0xab, 0x4b, 0x96, 0xbe, 0xbf, 0x18, + 0x35, 0xf2, 0xf0, 0x2b, 0x79, 0xa9, 0xe4, 0x6b, 0xf6, 0xa9, 0x10, 0x70, 0xf2, 0x71, 0x48, 0xb6, + 0xaa, 0x71, 0xad, 0xfe, 0x84, 0x64, 0xb4, 0x5f, 0x66, 0xde, 0x91, 0x4c, 0x32, 0x33, 0x56, 0xce, + 0x9e, 0xc0, 0x62, 0xc4, 0xcc, 0xd1, 0x6b, 0x8f, 0x41, 0x34, 0x86, 0xd4, 0x37, 0x25, 0xd7, 0x1a, + 0xd3, 0xd8, 0x47, 0x19, 0x3a, 0xfe, 0xf0, 0x8d, 0x3d, 0xed, 0xf8, 0xd3, 0x1f, 0x7c, 0xd4, 0x8e, + 0xbf, 0xc4, 0x53, 0x7c, 0xd3, 0xc7, 0x5f, 0xe8, 0x88, 0x3a, 0x5c, 0x98, 0x9f, 0x7e, 0x7b, 0xf1, + 0xd6, 0x55, 0x2f, 0x0f, 0x50, 0xf5, 0xaf, 0x3c, 0xff, 0x61, 0x82, 0xa4, 0x28, 0x52, 0xd2, 0xf4, + 0xa1, 0x4c, 0x1d, 0x61, 0xbf, 0x03, 0x55, 0xfd, 0xa9, 0x67, 0xa6, 0xcb, 0x84, 0xe9, 0x96, 0x6e, + 0xa4, 0xe2, 0x92, 0x5c, 0xc2, 0xaa, 0x7a, 0x33, 0xec, 0x33, 0x58, 0x89, 0xa6, 0x59, 0xbf, 0x75, + 0x1e, 0xb0, 0xdb, 0x29, 0x77, 0xd1, 0x13, 0x93, 0x7d, 0xfd, 0xca, 0xcb, 0xea, 0x8f, 0x32, 0x82, + 0xfb, 0x92, 0x6f, 0xce, 0xc6, 0x27, 0x4f, 0xda, 0x53, 0xbb, 0xf1, 0xc9, 0x93, 0xfa, 0x50, 0xad, + 0xe2, 0x3e, 0xb6, 0x98, 0x98, 0x23, 0x4a, 0xaa, 0x65, 0x3f, 0x80, 0x79, 0xed, 0x4a, 0x7d, 0xf7, + 0xd2, 0xed, 0x47, 0x3b, 0x69, 0xf6, 0x41, 0xb7, 0xb5, 0x34, 0xcf, 0xa2, 0xb1, 0x8a, 0xf5, 0x2f, + 0x18, 0x89, 0xc9, 0x11, 0xbb, 0x68, 0x03, 0x2a, 0xfa, 0x75, 0xfd, 0xe7, 0xd4, 0xbb, 0xaa, 0xa1, + 0xf4, 0xb7, 0xc3, 0x1e, 0x65, 0xd8, 0x0e, 0x34, 0xa6, 0x9f, 0x3a, 0x8a, 0x64, 0x4a, 0xda, 0xf3, + 0x4c, 0x6b, 0x53, 0xc8, 0xc4, 0x03, 0x49, 0xec, 0x80, 0xae, 0x65, 0x44, 0x3f, 0x14, 0xe4, 0xf9, + 0xd3, 0xa7, 0x7a, 0xf2, 0x07, 0x84, 0xa2, 0xda, 0xd2, 0x7e, 0x3a, 0xea, 0x5e, 0xe6, 0x51, 0x86, + 0xfd, 0x34, 0x03, 0xd5, 0xc4, 0xf3, 0x22, 0x89, 0xc4, 0xf7, 0xa9, 0x71, 0x36, 0x75, 0x9c, 0x3e, + 0x50, 0xc3, 0xc4, 0x49, 0xdc, 0xb9, 0xff, 0xfd, 0xc4, 0x22, 0x7d, 0x95, 0x08, 0xcc, 0x3d, 0x98, + 0xfe, 0x25, 0xa1, 0xaf, 0xa7, 0x09, 0xf4, 0x77, 0xfa, 0xbe, 0x7e, 0x94, 0x61, 0xff, 0x2e, 0x03, + 0xf5, 0x64, 0xc4, 0x3d, 0x1a, 0x6e, 0x6a, 0x6c, 0x3f, 0x62, 0xa5, 0x2b, 0xc2, 0xf4, 0x3f, 0xc0, + 0x5e, 0xf6, 0xee, 0x9b, 0x89, 0x5e, 0xca, 0xd7, 0x92, 0x7f, 0xb9, 0xde, 0xb2, 0x8f, 0xe9, 0x87, + 0xfb, 0x54, 0x22, 0x12, 0x9b, 0xfd, 0xa1, 0xb7, 0x88, 0xfd, 0xf4, 0x9f, 0x45, 0xc3, 0x45, 0xf8, + 0x11, 0xfd, 0x62, 0x8e, 0xca, 0x6b, 0x11, 0x5c, 0xfc, 0xb2, 0xe5, 0x8d, 0xd7, 0x71, 0x4c, 0xaf, + 0x18, 0xd7, 0x13, 0x63, 0x9a, 0x56, 0x3c, 0x5a, 0xd4, 0x3b, 0xf9, 0xab, 0x66, 0xf1, 0xc9, 0x39, + 0xf3, 0x4b, 0x67, 0x57, 0x77, 0x72, 0x44, 0x9d, 0x94, 0xe4, 0x89, 0xad, 0xf6, 0x92, 0xd5, 0x18, + 0xf7, 0xb1, 0xaf, 0xaf, 0x1b, 0xb7, 0xaf, 0xec, 0xeb, 0x43, 0x8c, 0x9e, 0x8b, 0x1e, 0x1f, 0x00, + 0xc4, 0x89, 0x82, 0x6c, 0x2a, 0x5d, 0x2d, 0x12, 0x40, 0xb3, 0xb9, 0x84, 0xc9, 0xfd, 0xac, 0xb2, + 0xda, 0x44, 0x8d, 0x3f, 0x24, 0x71, 0x1a, 0x25, 0xd2, 0xe9, 0xda, 0x57, 0x32, 0xa7, 0x2f, 0xa1, + 0x7d, 0x4d, 0xd7, 0x9f, 0x10, 0xa6, 0x51, 0xd6, 0xdc, 0x21, 0xd4, 0x76, 0x3c, 0xef, 0xd9, 0x64, + 0x1c, 0x25, 0xa7, 0x27, 0x53, 0x5a, 0xb6, 0xed, 0xe0, 0x74, 0x6d, 0x6a, 0x14, 0xc6, 0x1d, 0xac, + 0x6a, 0x8d, 0x35, 0xb5, 0xaa, 0x1e, 0x7e, 0x15, 0x67, 0x27, 0x7e, 0xcd, 0x6c, 0x58, 0x88, 0x64, + 0x74, 0x9c, 0x01, 0x98, 0xac, 0x26, 0x21, 0x99, 0xa7, 0x9b, 0x48, 0x98, 0x09, 0xaa, 0xb7, 0x0f, + 0x03, 0x55, 0xe7, 0xa3, 0x0c, 0x3b, 0x80, 0xea, 0x26, 0xef, 0xe3, 0x35, 0x7b, 0x4c, 0x0c, 0x59, + 0x4c, 0x24, 0x19, 0x50, 0x46, 0xc9, 0x5a, 0x2d, 0x01, 0x4c, 0x9e, 0x5b, 0x63, 0xfb, 0xd2, 0xe7, + 0x5f, 0x3e, 0xfc, 0x4a, 0xa6, 0x9c, 0x7c, 0xad, 0xce, 0x2d, 0x95, 0x92, 0x93, 0x38, 0xb7, 0xa6, + 0x72, 0x78, 0x12, 0xe7, 0xd6, 0x4c, 0x0e, 0x4f, 0x62, 0xaa, 0x55, 0x4a, 0x10, 0x1b, 0xc2, 0xc2, + 0x4c, 0xda, 0x4f, 0x74, 0x64, 0x5d, 0x95, 0x2c, 0xb4, 0x76, 0xe7, 0x6a, 0x82, 0x64, 0x6b, 0xf7, + 0x93, 0xad, 0x75, 0xa1, 0x46, 0x4f, 0x07, 0x1e, 0x71, 0xba, 0x70, 0x37, 0xf5, 0x5a, 0x8d, 0x7e, + 0x9b, 0x6f, 0xfa, 0x80, 0x41, 0x5c, 0x52, 0xc3, 0xc1, 0x9b, 0x6e, 0xec, 0x87, 0x50, 0x79, 0xc2, + 0x43, 0x75, 0xc3, 0x2e, 0xd2, 0xb1, 0xa7, 0xae, 0xdc, 0xad, 0xa5, 0x5c, 0xd0, 0x4b, 0xf2, 0x0c, + 0xd6, 0xf6, 0x90, 0x0f, 0x4e, 0x38, 0x09, 0x27, 0xcb, 0x19, 0x7c, 0xcd, 0x7e, 0x1b, 0x2b, 0x8f, + 0x2e, 0x36, 0xaf, 0x68, 0x57, 0xa8, 0xf4, 0xca, 0xe7, 0xa7, 0xe0, 0x69, 0x35, 0xbb, 0xde, 0x80, + 0x6b, 0xba, 0x9e, 0x0b, 0x15, 0xed, 0x01, 0x84, 0x68, 0x03, 0xcd, 0x3e, 0x78, 0x11, 0x6d, 0xa0, + 0x94, 0xf7, 0x12, 0x8c, 0x7b, 0xd8, 0x8e, 0xc1, 0xee, 0xc4, 0xed, 0xd0, 0x1b, 0x09, 0x71, 0x4b, + 0x0f, 0xbf, 0xb2, 0x47, 0xe1, 0xd7, 0xec, 0x73, 0x7c, 0xa0, 0x5b, 0xbf, 0x41, 0x18, 0x1b, 0x0d, + 0xd3, 0x97, 0x0d, 0xa3, 0xc9, 0xd2, 0x50, 0x49, 0x43, 0x82, 0x9a, 0x42, 0x4d, 0xee, 0x7d, 0x80, + 0x6e, 0xe8, 0x8d, 0x37, 0x6d, 0x3e, 0xf2, 0xdc, 0x58, 0xd6, 0xc6, 0x77, 0xda, 0x62, 0xf9, 0xa5, + 0x5d, 0x6c, 0x63, 0x9f, 0x6b, 0x56, 0x56, 0xe2, 0x12, 0xa6, 0x62, 0xae, 0x2b, 0xaf, 0xbd, 0x45, + 0x13, 0x92, 0x72, 0xf5, 0xed, 0x51, 0x86, 0xb5, 0x00, 0xe2, 0xbc, 0xaf, 0xc8, 0x66, 0x9a, 0x49, + 0x29, 0x8b, 0xc4, 0x5e, 0x4a, 0x92, 0xd8, 0x01, 0x94, 0xe3, 0x84, 0x99, 0xd5, 0xf8, 0x3d, 0x97, + 0x44, 0x7a, 0x4d, 0x74, 0x82, 0xcf, 0x24, 0xab, 0x18, 0x0d, 0x9c, 0x2a, 0x60, 0x25, 0x31, 0x55, + 0xc7, 0x9c, 0x07, 0xcc, 0x81, 0x45, 0xea, 0x60, 0xa4, 0x2e, 0xe1, 0x5d, 0xac, 0xe8, 0x1d, 0xf6, + 0xd9, 0xbc, 0x91, 0x68, 0x37, 0xa7, 0x66, 0x3f, 0x24, 0x5c, 0x3f, 0x82, 0x5b, 0xe9, 0x1e, 0x98, + 0x10, 0xcd, 0x23, 0x58, 0x98, 0x09, 0xb0, 0x47, 0x5b, 0xfa, 0xaa, 0x8c, 0x89, 0x68, 0x4b, 0x5f, + 0x19, 0x9b, 0x37, 0x96, 0xb1, 0xc9, 0x79, 0x03, 0xd0, 0xd4, 0x3b, 0x77, 0xc2, 0xfe, 0xa9, 0x68, + 0xee, 0x5f, 0x67, 0x60, 0x31, 0x25, 0x84, 0xce, 0x5e, 0x55, 0x5e, 0x83, 0x2b, 0xc3, 0xeb, 0x6b, + 0xa9, 0xa1, 0x56, 0xa3, 0x8b, 0xed, 0xec, 0xb2, 0xa7, 0x89, 0x83, 0x8d, 0x22, 0x9d, 0x72, 0x67, + 0x3e, 0x57, 0xa9, 0x48, 0xd5, 0x28, 0xbe, 0x84, 0x55, 0xea, 0x48, 0x6b, 0x38, 0x9c, 0x0a, 0x03, + 0xbf, 0x32, 0xf3, 0xc3, 0xde, 0x89, 0xd0, 0xf6, 0xda, 0xd5, 0x3f, 0xfc, 0x7d, 0x85, 0x3a, 0x4d, + 0x5d, 0x65, 0x13, 0x68, 0x4c, 0x87, 0x57, 0xd9, 0xd5, 0x75, 0xad, 0xdd, 0x4e, 0xd8, 0xbf, 0x29, + 0x21, 0xd9, 0xef, 0x60, 0x63, 0xb7, 0x8d, 0xb5, 0xb4, 0x79, 0x21, 0x93, 0x58, 0xac, 0xc7, 0xdf, + 0x88, 0x62, 0xc1, 0x53, 0xe3, 0x54, 0x0d, 0x5c, 0x15, 0xb9, 0x8e, 0x2c, 0xf0, 0xf4, 0x50, 0xf2, + 0x1b, 0xd8, 0xfc, 0x1d, 0xe3, 0x46, 0x5a, 0xf3, 0x3e, 0x15, 0x21, 0x5b, 0x7c, 0x75, 0x7a, 0x5f, + 0xab, 0x1e, 0xdc, 0x49, 0x5b, 0xef, 0x2b, 0x6d, 0xa1, 0xa9, 0xb9, 0xbe, 0x86, 0xba, 0x5d, 0x55, + 0x8f, 0xfd, 0x46, 0xdb, 0x27, 0x25, 0xc8, 0x1c, 0x6d, 0x9f, 0xb4, 0x60, 0x71, 0x52, 0xaf, 0x51, + 0x61, 0xe2, 0x8f, 0x33, 0xf7, 0xd7, 0xef, 0xfe, 0xe0, 0x3b, 0x27, 0x4e, 0x78, 0x3a, 0x39, 0x7a, + 0xd0, 0xf7, 0x46, 0x0f, 0x87, 0xca, 0xdb, 0x28, 0x2f, 0x2c, 0x3f, 0x1c, 0xba, 0x83, 0x87, 0x58, + 0xed, 0xd1, 0xdc, 0xd8, 0xf7, 0x42, 0xef, 0xbb, 0xff, 0x37, 0x00, 0x00, 0xff, 0xff, 0x26, 0x2b, + 0x1e, 0xcb, 0xbb, 0x80, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index b5b3ebb01b..ae6affc5dd 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -2819,6 +2819,9 @@ message HTLCAttempt { This value will not be set if the HTLC is still IN_FLIGHT. */ int64 resolve_time_ns = 4; + + // Detailed htlc failure info. + Failure failure = 5; } message ListPaymentsRequest { @@ -3149,6 +3152,11 @@ message Failure { EXPIRY_TOO_FAR = 22; MPP_TIMEOUT = 23; + /** + An internal error occurred. + */ + INTERNAL_FAILURE = 997; + /** The error source is known, but the failure itself couldn't be decoded. */ diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 8bffa4a8c1..66621d03c2 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -1490,6 +1490,40 @@ ], "default": "OPEN_CHANNEL" }, + "FailureFailureCode": { + "type": "string", + "enum": [ + "RESERVED", + "INCORRECT_OR_UNKNOWN_PAYMENT_DETAILS", + "INCORRECT_PAYMENT_AMOUNT", + "FINAL_INCORRECT_CLTV_EXPIRY", + "FINAL_INCORRECT_HTLC_AMOUNT", + "FINAL_EXPIRY_TOO_SOON", + "INVALID_REALM", + "EXPIRY_TOO_SOON", + "INVALID_ONION_VERSION", + "INVALID_ONION_HMAC", + "INVALID_ONION_KEY", + "AMOUNT_BELOW_MINIMUM", + "FEE_INSUFFICIENT", + "INCORRECT_CLTV_EXPIRY", + "CHANNEL_DISABLED", + "TEMPORARY_CHANNEL_FAILURE", + "REQUIRED_NODE_FEATURE_MISSING", + "REQUIRED_CHANNEL_FEATURE_MISSING", + "UNKNOWN_NEXT_PEER", + "TEMPORARY_NODE_FAILURE", + "PERMANENT_NODE_FAILURE", + "PERMANENT_CHANNEL_FAILURE", + "EXPIRY_TOO_FAR", + "MPP_TIMEOUT", + "INTERNAL_FAILURE", + "UNKNOWN_FAILURE", + "UNREADABLE_FAILURE" + ], + "default": "RESERVED", + "description": " - RESERVED: *\nThe numbers assigned in this enumeration match the failure codes as\ndefined in BOLT #4. Because protobuf 3 requires enums to start with 0,\na RESERVED value is added.\n - INTERNAL_FAILURE: *\nAn internal error occurred.\n - UNKNOWN_FAILURE: *\nThe error source is known, but the failure itself couldn't be decoded.\n - UNREADABLE_FAILURE: *\nAn unreadable failure result is returned if the received failure message\ncannot be decrypted. In that case the error source is unknown." + }, "HTLCAttemptHTLCStatus": { "type": "string", "enum": [ @@ -2260,6 +2294,71 @@ } } }, + "lnrpcChannelUpdate": { + "type": "object", + "properties": { + "signature": { + "type": "string", + "format": "byte", + "description": "*\nThe signature that validates the announced data and proves the ownership\nof node id." + }, + "chain_hash": { + "type": "string", + "format": "byte", + "description": "*\nThe target chain that this channel was opened within. This value\nshould be the genesis hash of the target chain. Along with the short\nchannel ID, this uniquely identifies the channel globally in a\nblockchain." + }, + "chan_id": { + "type": "string", + "format": "uint64", + "description": "*\nThe unique description of the funding transaction." + }, + "timestamp": { + "type": "integer", + "format": "int64", + "description": "*\nA timestamp that allows ordering in the case of multiple announcements.\nWe should ignore the message if timestamp is not greater than the\nlast-received." + }, + "message_flags": { + "type": "integer", + "format": "int64", + "description": "*\nThe bitfield that describes whether optional fields are present in this\nupdate. Currently, the least-significant bit must be set to 1 if the\noptional field MaxHtlc is present." + }, + "channel_flags": { + "type": "integer", + "format": "int64", + "description": "*\nThe bitfield that describes additional meta-data concerning how the\nupdate is to be interpreted. Currently, the least-significant bit must be\nset to 0 if the creating node corresponds to the first node in the\npreviously sent channel announcement and 1 otherwise. If the second bit\nis set, then the channel is set to be disabled." + }, + "time_lock_delta": { + "type": "integer", + "format": "int64", + "description": "*\nThe minimum number of blocks this node requires to be added to the expiry\nof HTLCs. This is a security parameter determined by the node operator.\nThis value represents the required gap between the time locks of the\nincoming and outgoing HTLC's set to this node." + }, + "htlc_minimum_msat": { + "type": "string", + "format": "uint64", + "description": "*\nThe minimum HTLC value which will be accepted." + }, + "base_fee": { + "type": "integer", + "format": "int64", + "description": "*\nThe base fee that must be used for incoming HTLC's to this particular\nchannel. This value will be tacked onto the required for a payment\nindependent of the size of the payment." + }, + "fee_rate": { + "type": "integer", + "format": "int64", + "description": "*\nThe fee rate that will be charged per millionth of a satoshi." + }, + "htlc_maximum_msat": { + "type": "string", + "format": "uint64", + "description": "*\nThe maximum HTLC value which will be accepted." + }, + "extra_opaque_data": { + "type": "string", + "format": "byte", + "description": "*\nThe set of data that was appended to this message, some of which we may\nnot actually know how to iterate or parse. By holding onto this data, we\nensure that we're able to properly validate the set of signatures that\ncover these new fields, and ensure we're able to make upgrades to the\nnetwork in a forwards compatible manner." + } + } + }, "lnrpcCloseStatusUpdate": { "type": "object", "properties": { @@ -2364,6 +2463,49 @@ } } }, + "lnrpcFailure": { + "type": "object", + "properties": { + "code": { + "$ref": "#/definitions/FailureFailureCode", + "title": "/ Failure code as defined in the Lightning spec" + }, + "channel_update": { + "$ref": "#/definitions/lnrpcChannelUpdate", + "description": "/ An optional channel update message." + }, + "htlc_msat": { + "type": "string", + "format": "uint64", + "description": "/ A failure type-dependent htlc value." + }, + "onion_sha_256": { + "type": "string", + "format": "byte", + "description": "/ The sha256 sum of the onion payload." + }, + "cltv_expiry": { + "type": "integer", + "format": "int64", + "description": "/ A failure type-dependent cltv expiry value." + }, + "flags": { + "type": "integer", + "format": "int64", + "description": "/ A failure type-dependent flags value." + }, + "failure_source_index": { + "type": "integer", + "format": "int64", + "description": "*\nThe position in the path of the intermediate or final node that generated\nthe failure message. Position zero is the sender node." + }, + "height": { + "type": "integer", + "format": "int64", + "description": "/ A failure type-dependent block height." + } + } + }, "lnrpcFeature": { "type": "object", "properties": { @@ -2735,6 +2877,10 @@ "type": "string", "format": "int64", "description": "*\nThe time in UNIX nanoseconds at which this HTLC was settled or failed.\nThis value will not be set if the HTLC is still IN_FLIGHT." + }, + "failure": { + "$ref": "#/definitions/lnrpcFailure", + "description": "Detailed htlc failure info." } } },