diff --git a/cmd/lncli/walletrpc_active.go b/cmd/lncli/walletrpc_active.go index 31b14b764f1..c1849e1bb74 100644 --- a/cmd/lncli/walletrpc_active.go +++ b/cmd/lncli/walletrpc_active.go @@ -4,8 +4,12 @@ package main import ( "context" + "errors" + "fmt" "sort" + "github.com/btcsuite/btcd/chaincfg/chainhash" + "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc/walletrpc" "github.com/urfave/cli" ) @@ -22,6 +26,7 @@ func walletCommands() []cli.Command { Subcommands: []cli.Command{ pendingSweepsCommand, bumpFeeCommand, + bumpCloseFeeCommand, }, }, } @@ -168,3 +173,130 @@ func bumpFee(ctx *cli.Context) error { return nil } + +var bumpCloseFeeCommand = cli.Command{ + Name: "bumpclosefee", + Usage: "Bumps the fee of a channel closing transaction.", + ArgsUsage: "channel_point", + Description: ` + This command allows the fee of a channel closing transaction to be + increased by using the child-pays-for-parent mechanism. It will instruct + the sweeper to sweep the anchor outputs of transactions in the set + of valid commitments for the specified channel at the requested fee + rate or confirmation target. + `, + Flags: []cli.Flag{ + cli.Uint64Flag{ + Name: "conf_target", + Usage: "the number of blocks that the output should " + + "be swept on-chain within", + }, + cli.Uint64Flag{ + Name: "sat_per_byte", + Usage: "a manual fee expressed in sat/byte that " + + "should be used when sweeping the output", + }, + }, + Action: actionDecorator(bumpCloseFee), +} + +func bumpCloseFee(ctx *cli.Context) error { + // Display the command's help message if we do not have the expected + // number of arguments/flags. + if ctx.NArg() != 1 { + return cli.ShowCommandHelp(ctx, "bumpclosefee") + } + + // Validate the channel point. + channelPoint := ctx.Args().Get(0) + _, err := NewProtoOutPoint(channelPoint) + if err != nil { + return err + } + + // Fetch all waiting close channels. + client, cleanUp := getClient(ctx) + defer cleanUp() + + // Fetch waiting close channel commitments. + commitments, err := getWaitingCloseCommitments(client, channelPoint) + if err != nil { + return err + } + + // Retrieve pending sweeps. + walletClient, cleanUp := getWalletClient(ctx) + defer cleanUp() + + ctxb := context.Background() + sweeps, err := walletClient.PendingSweeps( + ctxb, &walletrpc.PendingSweepsRequest{}, + ) + if err != nil { + return err + } + + // Match pending sweeps with commitments of the channel for which a bump + // is requested and bump their fees. + commitSet := map[string]struct{}{ + commitments.LocalTxid: {}, + commitments.RemoteTxid: {}, + } + if commitments.RemotePendingTxid != "" { + commitSet[commitments.RemotePendingTxid] = struct{}{} + } + + for _, sweep := range sweeps.PendingSweeps { + // Only bump anchor sweeps. + if sweep.WitnessType != walletrpc.WitnessType_COMMITMENT_ANCHOR { + continue + } + + // Skip unrelated sweeps. + sweepTxID, err := chainhash.NewHash(sweep.Outpoint.TxidBytes) + if err != nil { + return err + } + if _, match := commitSet[sweepTxID.String()]; !match { + continue + } + + // Bump fee of the anchor sweep. + fmt.Printf("Bumping fee of %v:%v\n", + sweepTxID, sweep.Outpoint.OutputIndex) + + _, err = walletClient.BumpFee(ctxb, &walletrpc.BumpFeeRequest{ + Outpoint: sweep.Outpoint, + TargetConf: uint32(ctx.Uint64("conf_target")), + SatPerByte: uint32(ctx.Uint64("sat_per_byte")), + Force: true, + }) + if err != nil { + return err + } + } + + return nil +} + +func getWaitingCloseCommitments(client lnrpc.LightningClient, + channelPoint string) (*lnrpc.PendingChannelsResponse_Commitments, + error) { + + ctxb := context.Background() + + req := &lnrpc.PendingChannelsRequest{} + resp, err := client.PendingChannels(ctxb, req) + if err != nil { + return nil, err + } + + // Lookup the channel commit tx hashes. + for _, channel := range resp.WaitingCloseChannels { + if channel.Channel.ChannelPoint == channelPoint { + return channel.Commitments, nil + } + } + + return nil, errors.New("channel not found") +} diff --git a/contractcourt/anchor_resolver.go b/contractcourt/anchor_resolver.go new file mode 100644 index 00000000000..1cf7a820ade --- /dev/null +++ b/contractcourt/anchor_resolver.go @@ -0,0 +1,205 @@ +package contractcourt + +import ( + "errors" + "io" + "sync" + + "github.com/btcsuite/btcd/wire" + "github.com/btcsuite/btcutil" + "github.com/lightningnetwork/lnd/input" + "github.com/lightningnetwork/lnd/lnwallet" + "github.com/lightningnetwork/lnd/sweep" +) + +// anchorResolver is a resolver that will attempt to sweep our anchor output. +type anchorResolver struct { + // anchorSignDescriptor contains the information that is required to + // sweep the anchor. + anchorSignDescriptor input.SignDescriptor + + // anchor is the outpoint on the commitment transaction. + anchor wire.OutPoint + + // resolved reflects if the contract has been fully resolved or not. + resolved bool + + // broadcastHeight is the height that the original contract was + // broadcast to the main-chain at. We'll use this value to bound any + // historical queries to the chain for spends/confirmations. + broadcastHeight uint32 + + // chanPoint is the channel point of the original contract. + chanPoint wire.OutPoint + + // currentReport stores the current state of the resolver for reporting + // over the rpc interface. + currentReport ContractReport + + // reportLock prevents concurrent access to the resolver report. + reportLock sync.Mutex + + contractResolverKit +} + +// newAnchorResolver instantiates a new anchor resolver. +func newAnchorResolver(anchorSignDescriptor input.SignDescriptor, + anchor wire.OutPoint, broadcastHeight uint32, + chanPoint wire.OutPoint, resCfg ResolverConfig) *anchorResolver { + + amt := btcutil.Amount(anchorSignDescriptor.Output.Value) + + report := ContractReport{ + Outpoint: anchor, + Type: ReportOutputAnchor, + Amount: amt, + LimboBalance: amt, + RecoveredBalance: 0, + } + + r := &anchorResolver{ + contractResolverKit: *newContractResolverKit(resCfg), + anchorSignDescriptor: anchorSignDescriptor, + anchor: anchor, + broadcastHeight: broadcastHeight, + chanPoint: chanPoint, + currentReport: report, + } + + r.initLogger(r) + + return r +} + +// ResolverKey returns an identifier which should be globally unique for this +// particular resolver within the chain the original contract resides within. +func (c *anchorResolver) ResolverKey() []byte { + // The anchor resolver is stateless and doesn't need a database key. + return nil +} + +// Resolve offers the anchor output to the sweeper and waits for it to be swept. +func (c *anchorResolver) Resolve() (ContractResolver, error) { + // Attempt to update the sweep parameters to the post-confirmation + // situation. We don't want to force sweep anymore, because the anchor + // lost its special purpose to get the commitment confirmed. It is just + // an output that we want to sweep only if it is economical to do so. + relayFeeRate := c.Sweeper.RelayFeePerKW() + + resultChan, err := c.Sweeper.UpdateParams( + c.anchor, + sweep.ParamsUpdate{ + Fee: sweep.FeePreference{ + FeeRate: relayFeeRate, + }, + Force: false, + }, + ) + + // After a restart or when the remote force closes, the sweeper is not + // yet aware of the anchor. In that case, offer it as a new input to the + // sweeper. An exclusive group is not necessary anymore, because we know + // that this is the only anchor that can be swept. + if err == lnwallet.ErrNotMine { + anchorInput := input.MakeBaseInput( + &c.anchor, + input.CommitmentAnchor, + &c.anchorSignDescriptor, + c.broadcastHeight, + ) + + resultChan, err = c.Sweeper.SweepInput( + &anchorInput, + sweep.Params{ + Fee: sweep.FeePreference{ + FeeRate: relayFeeRate, + }, + }, + ) + if err != nil { + return nil, err + } + } + + var anchorRecovered bool + select { + case sweepRes := <-resultChan: + switch sweepRes.Err { + + // Anchor was swept successfully. + case nil: + c.log.Debugf("anchor swept by tx %v", + sweepRes.Tx.TxHash()) + + anchorRecovered = true + + // Anchor was swept by someone else. This is possible after the + // 16 block csv lock. + case sweep.ErrRemoteSpend: + c.log.Warnf("our anchor spent by someone else") + + // The sweeper gave up on sweeping the anchor. This happens + // after the maximum number of sweep attempts has been reached. + // See sweep.DefaultMaxSweepAttempts. Sweep attempts are + // interspaced with random delays picked from a range that + // increases exponentially. + // + // We consider the anchor as being lost. + case sweep.ErrTooManyAttempts: + c.log.Warnf("anchor sweep abandoned") + + // An unexpected error occurred. + default: + c.log.Errorf("unable to sweep anchor: %v", sweepRes.Err) + + return nil, sweepRes.Err + } + + case <-c.quit: + return nil, errResolverShuttingDown + } + + // Update report to reflect that funds are no longer in limbo. + c.reportLock.Lock() + if anchorRecovered { + c.currentReport.RecoveredBalance = c.currentReport.LimboBalance + } + c.currentReport.LimboBalance = 0 + c.reportLock.Unlock() + + c.resolved = true + return nil, nil +} + +// Stop signals the resolver to cancel any current resolution processes, and +// suspend. +// +// NOTE: Part of the ContractResolver interface. +func (c *anchorResolver) Stop() { + close(c.quit) +} + +// IsResolved returns true if the stored state in the resolve is fully +// resolved. In this case the target output can be forgotten. +// +// NOTE: Part of the ContractResolver interface. +func (c *anchorResolver) IsResolved() bool { + return c.resolved +} + +// report returns a report on the resolution state of the contract. +func (c *anchorResolver) report() *ContractReport { + c.reportLock.Lock() + defer c.reportLock.Unlock() + + reportCopy := c.currentReport + return &reportCopy +} + +func (c *anchorResolver) Encode(w io.Writer) error { + return errors.New("serialization not supported") +} + +// A compile time assertion to ensure anchorResolver meets the +// ContractResolver interface. +var _ ContractResolver = (*anchorResolver)(nil) diff --git a/contractcourt/briefcase.go b/contractcourt/briefcase.go index 22adcbdc1da..1114f6db50e 100644 --- a/contractcourt/briefcase.go +++ b/contractcourt/briefcase.go @@ -29,6 +29,11 @@ type ContractResolutions struct { // HtlcResolutions contains all data required to fully resolve any // incoming+outgoing HTLC's present within the commitment transaction. HtlcResolutions lnwallet.HtlcResolutions + + // AnchorResolution contains the data required to sweep the anchor + // output. If the channel type doesn't include anchors, the value of + // this field will be nil. + AnchorResolution *lnwallet.AnchorResolution } // IsEmpty returns true if the set of resolutions is "empty". A resolution is @@ -37,7 +42,8 @@ type ContractResolutions struct { func (c *ContractResolutions) IsEmpty() bool { return c.CommitResolution == nil && len(c.HtlcResolutions.IncomingHTLCs) == 0 && - len(c.HtlcResolutions.OutgoingHTLCs) == 0 + len(c.HtlcResolutions.OutgoingHTLCs) == 0 && + c.AnchorResolution == nil } // ArbitratorLog is the primary source of persistent storage for the @@ -263,6 +269,10 @@ var ( // the full set of resolutions for a channel. resolutionsKey = []byte("resolutions") + // anchorResolutionKey is the key under the logScope that we'll use to + // store the anchor resolution, if any. + anchorResolutionKey = []byte("anchor-resolution") + // actionsBucketKey is the key under the logScope that we'll use to // store all chain actions once they're determined. actionsBucketKey = []byte("chain-actions") @@ -362,6 +372,13 @@ func fetchContractWriteBucket(tx *bbolt.Tx, scopeKey []byte) (*bbolt.Bucket, err func (b *boltArbitratorLog) writeResolver(contractBucket *bbolt.Bucket, res ContractResolver) error { + // Only persist resolvers that are stateful. Stateless resolvers don't + // expose a resolver key. + resKey := res.ResolverKey() + if resKey == nil { + return nil + } + // First, we'll write to the buffer the type of this resolver. Using // this byte, we can later properly deserialize the resolver properly. var ( @@ -390,8 +407,6 @@ func (b *boltArbitratorLog) writeResolver(contractBucket *bbolt.Bucket, return err } - resKey := res.ResolverKey() - return contractBucket.Put(resKey, buf.Bytes()) } @@ -630,7 +645,26 @@ func (b *boltArbitratorLog) LogContractResolutions(c *ContractResolutions) error } } - return scopeBucket.Put(resolutionsKey, b.Bytes()) + err = scopeBucket.Put(resolutionsKey, b.Bytes()) + if err != nil { + return err + } + + // Write out the anchor resolution if present. + if c.AnchorResolution != nil { + var b bytes.Buffer + err := encodeAnchorResolution(&b, c.AnchorResolution) + if err != nil { + return err + } + + err = scopeBucket.Put(anchorResolutionKey, b.Bytes()) + if err != nil { + return err + } + } + + return nil }) } @@ -710,6 +744,18 @@ func (b *boltArbitratorLog) FetchContractResolutions() (*ContractResolutions, er } } + anchorResBytes := scopeBucket.Get(anchorResolutionKey) + if anchorResBytes != nil { + c.AnchorResolution = &lnwallet.AnchorResolution{} + resReader := bytes.NewReader(anchorResBytes) + err := decodeAnchorResolution( + resReader, c.AnchorResolution, + ) + if err != nil { + return err + } + } + return nil }) if err != nil { @@ -1045,6 +1091,35 @@ func decodeCommitResolution(r io.Reader, return binary.Read(r, endian, &c.MaturityDelay) } +func encodeAnchorResolution(w io.Writer, + a *lnwallet.AnchorResolution) error { + + if _, err := w.Write(a.CommitAnchor.Hash[:]); err != nil { + return err + } + err := binary.Write(w, endian, a.CommitAnchor.Index) + if err != nil { + return err + } + + return input.WriteSignDescriptor(w, &a.AnchorSignDescriptor) +} + +func decodeAnchorResolution(r io.Reader, + a *lnwallet.AnchorResolution) error { + + _, err := io.ReadFull(r, a.CommitAnchor.Hash[:]) + if err != nil { + return err + } + err = binary.Read(r, endian, &a.CommitAnchor.Index) + if err != nil { + return err + } + + return input.ReadSignDescriptor(r, &a.AnchorSignDescriptor) +} + func encodeHtlcSetKey(w io.Writer, h *HtlcSetKey) error { err := binary.Write(w, endian, h.IsRemote) if err != nil { diff --git a/contractcourt/briefcase_test.go b/contractcourt/briefcase_test.go index 0cccd5a6cb1..3408b2c65f7 100644 --- a/contractcourt/briefcase_test.go +++ b/contractcourt/briefcase_test.go @@ -46,6 +46,15 @@ var ( Index: 2, } + testChanPoint3 = wire.OutPoint{ + Hash: chainhash.Hash{ + 0x48, 0x59, 0xe6, 0x96, 0x31, 0x13, 0xa1, 0x17, + 0x51, 0xb6, 0x37, 0xd8, 0xfc, 0xd2, 0xc6, 0xda, + 0x2d, 0xe7, 0x93, 0xe4, + }, + Index: 3, + } + testPreimage = [32]byte{ 0x52, 0xb6, 0x37, 0xd8, 0xfc, 0xd2, 0xc6, 0xda, 0x48, 0x59, 0xe6, 0x96, 0x31, 0x13, 0xa1, 0x17, @@ -540,6 +549,10 @@ func TestContractResolutionsStorage(t *testing.T) { }, }, }, + AnchorResolution: &lnwallet.AnchorResolution{ + CommitAnchor: testChanPoint3, + AnchorSignDescriptor: testSignDesc, + }, } // First make sure that fetching unlogged contract resolutions will diff --git a/contractcourt/chain_arbitrator.go b/contractcourt/chain_arbitrator.go index 7a9cb3095c8..a9dde5421ee 100644 --- a/contractcourt/chain_arbitrator.go +++ b/contractcourt/chain_arbitrator.go @@ -220,6 +220,88 @@ func NewChainArbitrator(cfg ChainArbitratorConfig, } } +// arbChannel is a wrapper around an open channel that channel arbitrators +// interact with. +type arbChannel struct { + // channel is the in-memory channel state. + channel *channeldb.OpenChannel + + // c references the chain arbitrator and is used by arbChannel + // internally. + c *ChainArbitrator +} + +// NewAnchorResolutions returns the anchor resolutions for currently valid +// commitment transactions. +// +// NOTE: Part of the ArbChannel interface. +func (a *arbChannel) NewAnchorResolutions() ([]*lnwallet.AnchorResolution, + error) { + + // Get a fresh copy of the database state to base the anchor resolutions + // on. Unfortunately the channel instance that we have here isn't the + // same instance that is used by the link. + chanPoint := a.channel.FundingOutpoint + + channel, err := a.c.chanSource.FetchChannel(chanPoint) + if err != nil { + return nil, err + } + + chanMachine, err := lnwallet.NewLightningChannel( + a.c.cfg.Signer, channel, nil, + ) + if err != nil { + return nil, err + } + + return chanMachine.NewAnchorResolutions() +} + +// ForceCloseChan should force close the contract that this attendant is +// watching over. We'll use this when we decide that we need to go to chain. It +// should in addition tell the switch to remove the corresponding link, such +// that we won't accept any new updates. The returned summary contains all items +// needed to eventually resolve all outputs on chain. +// +// NOTE: Part of the ArbChannel interface. +func (a *arbChannel) ForceCloseChan() (*lnwallet.LocalForceCloseSummary, error) { + // First, we mark the channel as borked, this ensure + // that no new state transitions can happen, and also + // that the link won't be loaded into the switch. + if err := a.channel.MarkBorked(); err != nil { + return nil, err + } + + // With the channel marked as borked, we'll now remove + // the link from the switch if its there. If the link + // is active, then this method will block until it + // exits. + chanPoint := a.channel.FundingOutpoint + + if err := a.c.cfg.MarkLinkInactive(chanPoint); err != nil { + log.Errorf("unable to mark link inactive: %v", err) + } + + // Now that we know the link can't mutate the channel + // state, we'll read the channel from disk the target + // channel according to its channel point. + channel, err := a.c.chanSource.FetchChannel(chanPoint) + if err != nil { + return nil, err + } + + // Finally, we'll force close the channel completing + // the force close workflow. + chanMachine, err := lnwallet.NewLightningChannel( + a.c.cfg.Signer, channel, nil, + ) + if err != nil { + return nil, err + } + return chanMachine.ForceClose() +} + // newActiveChannelArbitrator creates a new instance of an active channel // arbitrator given the state of the target channel. func newActiveChannelArbitrator(channel *channeldb.OpenChannel, @@ -247,42 +329,10 @@ func newActiveChannelArbitrator(channel *channeldb.OpenChannel, // all interfaces and methods the arbitrator needs to do its job. arbCfg := ChannelArbitratorConfig{ ChanPoint: chanPoint, + Channel: c.getArbChannel(channel), ShortChanID: channel.ShortChanID(), BlockEpochs: blockEpoch, - ForceCloseChan: func() (*lnwallet.LocalForceCloseSummary, error) { - // First, we mark the channel as borked, this ensure - // that no new state transitions can happen, and also - // that the link won't be loaded into the switch. - if err := channel.MarkBorked(); err != nil { - return nil, err - } - // With the channel marked as borked, we'll now remove - // the link from the switch if its there. If the link - // is active, then this method will block until it - // exits. - if err := c.cfg.MarkLinkInactive(chanPoint); err != nil { - log.Errorf("unable to mark link inactive: %v", err) - } - - // Now that we know the link can't mutate the channel - // state, we'll read the channel from disk the target - // channel according to its channel point. - channel, err := c.chanSource.FetchChannel(chanPoint) - if err != nil { - return nil, err - } - - // Finally, we'll force close the channel completing - // the force close workflow. - chanMachine, err := lnwallet.NewLightningChannel( - c.cfg.Signer, channel, nil, - ) - if err != nil { - return nil, err - } - return chanMachine.ForceClose() - }, MarkCommitmentBroadcasted: channel.MarkCommitmentBroadcasted, MarkChannelClosed: func(summary *channeldb.ChannelCloseSummary, statuses ...channeldb.ChannelStatus) error { @@ -339,6 +389,16 @@ func newActiveChannelArbitrator(channel *channeldb.OpenChannel, ), nil } +// getArbChannel returns an open channel wrapper for use by channel arbitrators. +func (c *ChainArbitrator) getArbChannel( + channel *channeldb.OpenChannel) *arbChannel { + + return &arbChannel{ + channel: channel, + c: c, + } +} + // ResolveContract marks a contract as fully resolved within the database. // This is only to be done once all contracts which were live on the channel // before hitting the chain have been resolved. diff --git a/contractcourt/chain_arbitrator_test.go b/contractcourt/chain_arbitrator_test.go index 0ac7484a50e..2692e29753f 100644 --- a/contractcourt/chain_arbitrator_test.go +++ b/contractcourt/chain_arbitrator_test.go @@ -35,7 +35,9 @@ func TestChainArbitratorRepublishCloses(t *testing.T) { const numChans = 10 var channels []*channeldb.OpenChannel for i := 0; i < numChans; i++ { - lChannel, _, cleanup, err := lnwallet.CreateTestChannels(true) + lChannel, _, cleanup, err := lnwallet.CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatal(err) } @@ -149,7 +151,9 @@ func TestResolveContract(t *testing.T) { // With the DB created, we'll make a new channel, and mark it as // pending open within the database. - newChannel, _, cleanup, err := lnwallet.CreateTestChannels(true) + newChannel, _, cleanup, err := lnwallet.CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to make new test channel: %v", err) } diff --git a/contractcourt/chain_watcher_test.go b/contractcourt/chain_watcher_test.go index 466662c1395..6dc47f530f1 100644 --- a/contractcourt/chain_watcher_test.go +++ b/contractcourt/chain_watcher_test.go @@ -63,7 +63,9 @@ func TestChainWatcherRemoteUnilateralClose(t *testing.T) { // First, we'll create two channels which already have established a // commitment contract between themselves. - aliceChannel, bobChannel, cleanUp, err := lnwallet.CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := lnwallet.CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -150,7 +152,9 @@ func TestChainWatcherRemoteUnilateralClosePendingCommit(t *testing.T) { // First, we'll create two channels which already have established a // commitment contract between themselves. - aliceChannel, bobChannel, cleanUp, err := lnwallet.CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := lnwallet.CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -274,7 +278,7 @@ func TestChainWatcherDataLossProtect(t *testing.T) { // First, we'll create two channels which already have // established a commitment contract between themselves. aliceChannel, bobChannel, cleanUp, err := lnwallet.CreateTestChannels( - false, + channeldb.SingleFunderBit, ) if err != nil { t.Fatalf("unable to create test channels: %v", err) @@ -443,7 +447,7 @@ func TestChainWatcherLocalForceCloseDetect(t *testing.T) { // First, we'll create two channels which already have // established a commitment contract between themselves. aliceChannel, bobChannel, cleanUp, err := lnwallet.CreateTestChannels( - false, + channeldb.SingleFunderBit, ) if err != nil { t.Fatalf("unable to create test channels: %v", err) diff --git a/contractcourt/channel_arbitrator.go b/contractcourt/channel_arbitrator.go index 2a58ea523ed..46aab0d0227 100644 --- a/contractcourt/channel_arbitrator.go +++ b/contractcourt/channel_arbitrator.go @@ -13,9 +13,11 @@ import ( "github.com/davecgh/go-spew/spew" "github.com/lightningnetwork/lnd/chainntnfs" "github.com/lightningnetwork/lnd/channeldb" + "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lnwallet" "github.com/lightningnetwork/lnd/lnwire" + "github.com/lightningnetwork/lnd/sweep" ) var ( @@ -64,6 +66,22 @@ type WitnessBeacon interface { AddPreimages(preimages ...lntypes.Preimage) error } +// ArbChannel is an abstraction that allows the channel arbitrator to interact +// with an open channel. +type ArbChannel interface { + // ForceCloseChan should force close the contract that this attendant + // is watching over. We'll use this when we decide that we need to go + // to chain. It should in addition tell the switch to remove the + // corresponding link, such that we won't accept any new updates. The + // returned summary contains all items needed to eventually resolve all + // outputs on chain. + ForceCloseChan() (*lnwallet.LocalForceCloseSummary, error) + + // NewAnchorResolutions returns the anchor resolutions for currently + // valid commitment transactions. + NewAnchorResolutions() ([]*lnwallet.AnchorResolution, error) +} + // ChannelArbitratorConfig contains all the functionality that the // ChannelArbitrator needs in order to properly arbitrate any contract dispute // on chain. @@ -72,6 +90,10 @@ type ChannelArbitratorConfig struct { // channel. ChanPoint wire.OutPoint + // Channel is the full channel data structure. For legacy channels, this + // field may not always be set after a restart. + Channel ArbChannel + // ShortChanID describes the exact location of the channel within the // chain. We'll use this to address any messages that we need to send // to the switch during contract resolution. @@ -88,14 +110,6 @@ type ChannelArbitratorConfig struct { // channel. ChainEvents *ChainEventSubscription - // ForceCloseChan should force close the contract that this attendant - // is watching over. We'll use this when we decide that we need to go - // to chain. It should in addition tell the switch to remove the - // corresponding link, such that we won't accept any new updates. The - // returned summary contains all items needed to eventually resolve all - // outputs on chain. - ForceCloseChan func() (*lnwallet.LocalForceCloseSummary, error) - // MarkCommitmentBroadcasted should mark the channel as the commitment // being broadcast, and we are waiting for the commitment to confirm. MarkCommitmentBroadcasted func(*wire.MsgTx, bool) error @@ -148,6 +162,9 @@ const ( // ReportOutputUnencumbered is an uncontested output on the commitment // transaction paying to us directly. ReportOutputUnencumbered + + // ReportOutputAnchor is an anchor output on the commitment tx. + ReportOutputAnchor ) // ContractReport provides a summary of a commitment tx output. @@ -354,9 +371,6 @@ func (c *ChannelArbitrator) Start() error { return err } - log.Infof("ChannelArbitrator(%v): starting state=%v", c.cfg.ChanPoint, - c.state) - _, bestHeight, err := c.cfg.ChainIO.GetBestBlock() if err != nil { c.cfg.BlockEpochs.Cancel() @@ -391,14 +405,19 @@ func (c *ChannelArbitrator) Start() error { case channeldb.RemoteForceClose: trigger = remoteCloseTrigger } - triggerHeight = c.cfg.ClosingHeight log.Warnf("ChannelArbitrator(%v): detected stalled "+ - "state=%v for closed channel, using "+ - "trigger=%v", c.cfg.ChanPoint, c.state, trigger) + "state=%v for closed channel", + c.cfg.ChanPoint, c.state) } + + triggerHeight = c.cfg.ClosingHeight } + log.Infof("ChannelArbitrator(%v): starting state=%v, trigger=%v, "+ + "triggerHeight=%v", c.cfg.ChanPoint, c.state, trigger, + triggerHeight) + // Next we'll fetch our confirmed commitment set. This will only exist // if the channel has been closed out on chain for modern nodes. For // older nodes, this won't be found at all, and will rely on the @@ -451,7 +470,7 @@ func (c *ChannelArbitrator) Start() error { // receive a chain event from the chain watcher than the // commitment has been confirmed on chain, and before we // advance our state step, we call InsertConfirmedCommitSet. - if err := c.relaunchResolvers(commitSet); err != nil { + if err := c.relaunchResolvers(commitSet, triggerHeight); err != nil { c.cfg.BlockEpochs.Cancel() return err } @@ -467,7 +486,9 @@ func (c *ChannelArbitrator) Start() error { // starting the ChannelArbitrator. This information should ideally be stored in // the database, so this only serves as a intermediate work-around to prevent a // migration. -func (c *ChannelArbitrator) relaunchResolvers(commitSet *CommitSet) error { +func (c *ChannelArbitrator) relaunchResolvers(commitSet *CommitSet, + heightHint uint32) error { + // We'll now query our log to see if there are any active unresolved // contracts. If this is the case, then we'll relaunch all contract // resolvers. @@ -542,6 +563,19 @@ func (c *ChannelArbitrator) relaunchResolvers(commitSet *CommitSet) error { htlcResolver.Supplement(*htlc) } + // The anchor resolver is stateless and can always be re-instantiated. + if contractResolutions.AnchorResolution != nil { + anchorResolver := newAnchorResolver( + contractResolutions.AnchorResolution.AnchorSignDescriptor, + contractResolutions.AnchorResolution.CommitAnchor, + heightHint, c.cfg.ChanPoint, + ResolverConfig{ + ChannelArbitratorConfig: c.cfg, + }, + ) + unresolvedContracts = append(unresolvedContracts, anchorResolver) + } + c.launchResolvers(unresolvedContracts) return nil @@ -559,10 +593,6 @@ func (c *ChannelArbitrator) Report() []*ContractReport { continue } - if r.IsResolved() { - continue - } - report := r.report() if report == nil { continue @@ -789,7 +819,7 @@ func (c *ChannelArbitrator) stateStep( // We'll tell the switch that it should remove the link for // this channel, in addition to fetching the force close // summary needed to close this channel on chain. - closeSummary, err := c.cfg.ForceCloseChan() + closeSummary, err := c.cfg.Channel.ForceCloseChan() if err != nil { log.Errorf("ChannelArbitrator(%v): unable to "+ "force close: %v", c.cfg.ChanPoint, err) @@ -837,31 +867,49 @@ func (c *ChannelArbitrator) stateStep( // to be confirmed. case StateCommitmentBroadcasted: switch trigger { - // We are waiting for a commitment to be confirmed, so any - // other trigger will be ignored. + + // We are waiting for a commitment to be confirmed. case chainTrigger, userTrigger: - log.Infof("ChannelArbitrator(%v): noop trigger %v", - c.cfg.ChanPoint, trigger) + // The commitment transaction has been broadcast, but it + // doesn't necessarily need to be the commitment + // transaction version that is going to be confirmed. To + // be sure that any of those versions can be anchored + // down, we now submit all anchor resolutions to the + // sweeper. The sweeper will keep trying to sweep all of + // them. + // + // Note that the sweeper is idempotent. If we ever + // happen to end up at this point in the code again, no + // harm is done by re-offering the anchors to the + // sweeper. + anchors, err := c.cfg.Channel.NewAnchorResolutions() + if err != nil { + return StateError, closeTx, err + } + + err = c.sweepAnchors(anchors, triggerHeight) + if err != nil { + return StateError, closeTx, err + } + nextState = StateCommitmentBroadcasted // If this state advance was triggered by any of the // commitments being confirmed, then we'll jump to the state // where the contract has been closed. case localCloseTrigger, remoteCloseTrigger: - log.Infof("ChannelArbitrator(%v): trigger %v, "+ - " going to StateContractClosed", - c.cfg.ChanPoint, trigger) nextState = StateContractClosed // If a coop close or breach was confirmed, jump straight to // the fully resolved state. case coopCloseTrigger, breachCloseTrigger: - log.Infof("ChannelArbitrator(%v): trigger %v, "+ - " going to StateFullyResolved", - c.cfg.ChanPoint, trigger) nextState = StateFullyResolved } + log.Infof("ChannelArbitrator(%v): trigger %v moving from "+ + "state %v to %v", c.cfg.ChanPoint, trigger, c.state, + nextState) + // If we're in this state, then the contract has been fully closed to // outside sub-systems, so we'll process the prior set of on-chain // contract actions and launch a set of resolvers. @@ -973,6 +1021,54 @@ func (c *ChannelArbitrator) stateStep( return nextState, closeTx, nil } +// sweepAnchors offers all given anchor resolutions to the sweeper. It requests +// sweeping at the minimum fee rate. This fee rate can be upped manually by the +// user via the BumpFee rpc. +func (c *ChannelArbitrator) sweepAnchors(anchors []*lnwallet.AnchorResolution, + heightHint uint32) error { + + // Use the chan id as the exclusive group. This prevents any of the + // anchors from being batched together. + exclusiveGroup := c.cfg.ShortChanID.ToUint64() + + // Retrieve the current minimum fee rate from the sweeper. + minFeeRate := c.cfg.Sweeper.RelayFeePerKW() + + for _, anchor := range anchors { + log.Debugf("ChannelArbitrator(%v): pre-confirmation sweep of "+ + "anchor of tx %v", c.cfg.ChanPoint, anchor.CommitAnchor) + + // Prepare anchor output for sweeping. + anchorInput := input.MakeBaseInput( + &anchor.CommitAnchor, + input.CommitmentAnchor, + &anchor.AnchorSignDescriptor, + heightHint, + ) + + // Sweep anchor output with the minimum fee rate. This usually + // (up to a min relay fee of 3 sat/b) means that the anchor + // sweep will be economical. Also signal that this is a force + // sweep. If the user decides to bump the fee on the anchor + // sweep, it will be swept even if it isn't economical. + _, err := c.cfg.Sweeper.SweepInput( + &anchorInput, + sweep.Params{ + Fee: sweep.FeePreference{ + FeeRate: minFeeRate, + }, + Force: true, + ExclusiveGroup: &exclusiveGroup, + }, + ) + if err != nil { + return err + } + } + + return nil +} + // launchResolvers updates the activeResolvers list and starts the resolvers. func (c *ChannelArbitrator) launchResolvers(resolvers []ContractResolver) { c.activeResolversLock.Lock() @@ -1778,8 +1874,8 @@ func (c *ChannelArbitrator) prepContractResolutions( } } - // Finally, if this is was a unilateral closure, then we'll also create - // a resolver to sweep our commitment output (but only if it wasn't + // If this is was an unilateral closure, then we'll also create a + // resolver to sweep our commitment output (but only if it wasn't // trimmed). if contractResolutions.CommitResolution != nil { resolver := newCommitSweepResolver( @@ -1789,6 +1885,17 @@ func (c *ChannelArbitrator) prepContractResolutions( htlcResolvers = append(htlcResolvers, resolver) } + // We instantiate an anchor resolver if the commitmentment tx has an + // anchor. + if contractResolutions.AnchorResolution != nil { + anchorResolver := newAnchorResolver( + contractResolutions.AnchorResolution.AnchorSignDescriptor, + contractResolutions.AnchorResolution.CommitAnchor, + height, c.cfg.ChanPoint, resolverCfg, + ) + htlcResolvers = append(htlcResolvers, anchorResolver) + } + return htlcResolvers, msgsToSend, nil } @@ -2080,6 +2187,7 @@ func (c *ChannelArbitrator) channelAttendant(bestHeight int32) { CommitHash: closeTx.TxHash(), CommitResolution: closeInfo.CommitResolution, HtlcResolutions: *closeInfo.HtlcResolutions, + AnchorResolution: closeInfo.AnchorResolution, } // When processing a unilateral close event, we'll @@ -2146,6 +2254,7 @@ func (c *ChannelArbitrator) channelAttendant(bestHeight int32) { CommitHash: *uniClosure.SpenderTxHash, CommitResolution: uniClosure.CommitResolution, HtlcResolutions: *uniClosure.HtlcResolutions, + AnchorResolution: uniClosure.AnchorResolution, } // When processing a unilateral close event, we'll diff --git a/contractcourt/channel_arbitrator_test.go b/contractcourt/channel_arbitrator_test.go index 0a73cd5e90e..bbe1c51f52a 100644 --- a/contractcourt/channel_arbitrator_test.go +++ b/contractcourt/channel_arbitrator_test.go @@ -83,6 +83,11 @@ func (b *mockArbitratorLog) InsertUnresolvedContracts( b.Lock() for _, resolver := range resolvers { + resKey := resolver.ResolverKey() + if resKey == nil { + continue + } + b.resolvers[resolver] = struct{}{} } b.Unlock() @@ -197,6 +202,8 @@ type chanArbTestCtx struct { resolutions chan []ResolutionMsg log ArbitratorLog + + sweeper *mockSweeper } func (c *chanArbTestCtx) CleanUp() { @@ -314,6 +321,7 @@ func createTestChannelArbitrator(t *testing.T, log ArbitratorLog, incubateChan := make(chan struct{}) chainIO := &mockChainIO{} + mockSweeper := newMockSweeper() chainArbCfg := ChainArbitratorConfig{ ChainIO: chainIO, PublishTx: func(*wire.MsgTx) error { @@ -343,7 +351,8 @@ func createTestChannelArbitrator(t *testing.T, log ArbitratorLog, return true }, - Clock: clock.NewDefaultClock(), + Clock: clock.NewDefaultClock(), + Sweeper: mockSweeper, } // We'll use the resolvedChan to synchronize on call to @@ -360,13 +369,7 @@ func createTestChannelArbitrator(t *testing.T, log ArbitratorLog, resolvedChan <- struct{}{} return nil }, - ForceCloseChan: func() (*lnwallet.LocalForceCloseSummary, error) { - summary := &lnwallet.LocalForceCloseSummary{ - CloseTx: &wire.MsgTx{}, - HtlcResolutions: &lnwallet.HtlcResolutions{}, - } - return summary, nil - }, + Channel: &mockChannel{}, MarkCommitmentBroadcasted: func(_ *wire.MsgTx, _ bool) error { return nil }, @@ -426,6 +429,7 @@ func createTestChannelArbitrator(t *testing.T, log ArbitratorLog, blockEpochs: blockEpochs, log: log, incubationRequests: incubateChan, + sweeper: mockSweeper, }, nil } @@ -2005,7 +2009,7 @@ func TestRemoteCloseInitiator(t *testing.T) { // First, create alice's channel. alice, _, cleanUp, err := lnwallet.CreateTestChannels( - true, + channeldb.SingleFunderTweaklessBit, ) if err != nil { t.Fatalf("unable to create test channels: %v", @@ -2088,3 +2092,161 @@ func TestRemoteCloseInitiator(t *testing.T) { }) } } + +// TestChannelArbitratorAnchors asserts that the commitment tx anchor is swept. +func TestChannelArbitratorAnchors(t *testing.T) { + log := &mockArbitratorLog{ + state: StateDefault, + newStates: make(chan ArbitratorState, 5), + } + + chanArbCtx, err := createTestChannelArbitrator(t, log) + if err != nil { + t.Fatalf("unable to create ChannelArbitrator: %v", err) + } + chanArb := chanArbCtx.chanArb + chanArb.cfg.PreimageDB = newMockWitnessBeacon() + chanArb.cfg.Registry = &mockRegistry{} + + // Setup two pre-confirmation anchor resolutions on the mock channel. + chanArb.cfg.Channel.(*mockChannel).anchorResolutions = + []*lnwallet.AnchorResolution{ + {}, {}, + } + + if err := chanArb.Start(); err != nil { + t.Fatalf("unable to start ChannelArbitrator: %v", err) + } + defer func() { + if err := chanArb.Stop(); err != nil { + t.Fatal(err) + } + }() + + // Create htlcUpdates channel. + htlcUpdates := make(chan *ContractUpdate) + + signals := &ContractSignals{ + HtlcUpdates: htlcUpdates, + ShortChanID: lnwire.ShortChannelID{}, + } + chanArb.UpdateContractSignals(signals) + + errChan := make(chan error, 1) + respChan := make(chan *wire.MsgTx, 1) + + // With the channel found, and the request crafted, we'll send over a + // force close request to the arbitrator that watches this channel. + chanArb.forceCloseReqs <- &forceCloseReq{ + errResp: errChan, + closeTx: respChan, + } + + // The force close request should trigger broadcast of the commitment + // transaction. + chanArbCtx.AssertStateTransitions( + StateBroadcastCommit, + StateCommitmentBroadcasted, + ) + + // With the commitment tx still unconfirmed, we expect sweep attempts + // for all three versions of the commitment transaction. + <-chanArbCtx.sweeper.sweptInputs + <-chanArbCtx.sweeper.sweptInputs + + select { + case <-respChan: + case <-time.After(5 * time.Second): + t.Fatalf("no response received") + } + + select { + case err := <-errChan: + if err != nil { + t.Fatalf("error force closing channel: %v", err) + } + case <-time.After(5 * time.Second): + t.Fatalf("no response received") + } + + // Now notify about the local force close getting confirmed. + closeTx := &wire.MsgTx{ + TxIn: []*wire.TxIn{ + { + PreviousOutPoint: wire.OutPoint{}, + Witness: [][]byte{ + {0x1}, + {0x2}, + }, + }, + }, + } + + chanArb.cfg.ChainEvents.LocalUnilateralClosure <- &LocalUnilateralCloseInfo{ + SpendDetail: &chainntnfs.SpendDetail{}, + LocalForceCloseSummary: &lnwallet.LocalForceCloseSummary{ + CloseTx: closeTx, + HtlcResolutions: &lnwallet.HtlcResolutions{}, + AnchorResolution: &lnwallet.AnchorResolution{ + AnchorSignDescriptor: input.SignDescriptor{ + Output: &wire.TxOut{ + Value: 1, + }, + }, + }, + }, + ChannelCloseSummary: &channeldb.ChannelCloseSummary{}, + CommitSet: CommitSet{ + ConfCommitKey: &LocalHtlcSet, + HtlcSets: map[HtlcSetKey][]channeldb.HTLC{}, + }, + } + + chanArbCtx.AssertStateTransitions( + StateContractClosed, + StateWaitingFullResolution, + ) + + // We expect to only have the anchor resolver active. + if len(chanArb.activeResolvers) != 1 { + t.Fatalf("expected single resolver, instead got: %v", + len(chanArb.activeResolvers)) + } + + resolver := chanArb.activeResolvers[0] + _, ok := resolver.(*anchorResolver) + if !ok { + t.Fatalf("expected anchor resolver, got %T", resolver) + } + + // The anchor resolver is expected to offer the anchor input to the + // sweeper. + <-chanArbCtx.sweeper.updatedInputs + + // The mock sweeper immediately signals success for that input. This + // should transition the channel to the resolved state. + chanArbCtx.AssertStateTransitions(StateFullyResolved) + select { + case <-chanArbCtx.resolvedChan: + case <-time.After(5 * time.Second): + t.Fatalf("contract was not resolved") + } +} + +type mockChannel struct { + anchorResolutions []*lnwallet.AnchorResolution +} + +func (m *mockChannel) NewAnchorResolutions() ([]*lnwallet.AnchorResolution, + error) { + + return m.anchorResolutions, nil +} + +func (m *mockChannel) ForceCloseChan() (*lnwallet.LocalForceCloseSummary, error) { + summary := &lnwallet.LocalForceCloseSummary{ + CloseTx: &wire.MsgTx{}, + HtlcResolutions: &lnwallet.HtlcResolutions{}, + } + return summary, nil +} diff --git a/contractcourt/commit_sweep_resolver_test.go b/contractcourt/commit_sweep_resolver_test.go index c142167e177..279cc6e8466 100644 --- a/contractcourt/commit_sweep_resolver_test.go +++ b/contractcourt/commit_sweep_resolver_test.go @@ -10,6 +10,7 @@ import ( "github.com/lightningnetwork/lnd/chainntnfs" "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/lnwallet" + "github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/sweep" ) @@ -93,12 +94,14 @@ func (i *commitSweepResolverTestContext) waitForResult() { } type mockSweeper struct { - sweptInputs chan input.Input + sweptInputs chan input.Input + updatedInputs chan wire.OutPoint } func newMockSweeper() *mockSweeper { return &mockSweeper{ - sweptInputs: make(chan input.Input), + sweptInputs: make(chan input.Input), + updatedInputs: make(chan wire.OutPoint), } } @@ -120,6 +123,22 @@ func (s *mockSweeper) CreateSweepTx(inputs []input.Input, feePref sweep.FeePrefe return nil, nil } +func (s *mockSweeper) RelayFeePerKW() chainfee.SatPerKWeight { + return 253 +} + +func (s *mockSweeper) UpdateParams(input wire.OutPoint, + params sweep.ParamsUpdate) (chan sweep.Result, error) { + + s.updatedInputs <- input + + result := make(chan sweep.Result, 1) + result <- sweep.Result{ + Tx: &wire.MsgTx{}, + } + return result, nil +} + var _ UtxoSweeper = &mockSweeper{} // TestCommitSweepResolverNoDelay tests resolution of a direct commitment output diff --git a/contractcourt/interfaces.go b/contractcourt/interfaces.go index 18dfbc0e86e..ded07f32768 100644 --- a/contractcourt/interfaces.go +++ b/contractcourt/interfaces.go @@ -9,6 +9,7 @@ import ( "github.com/lightningnetwork/lnd/input" "github.com/lightningnetwork/lnd/invoices" "github.com/lightningnetwork/lnd/lntypes" + "github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/sweep" ) @@ -51,4 +52,16 @@ type UtxoSweeper interface { // estimate before generating the required witnesses. CreateSweepTx(inputs []input.Input, feePref sweep.FeePreference, currentBlockHeight uint32) (*wire.MsgTx, error) + + // RelayFeePerKW returns the minimum fee rate required for transactions + // to be relayed. + RelayFeePerKW() chainfee.SatPerKWeight + + // UpdateParams allows updating the sweep parameters of a pending input + // in the UtxoSweeper. This function can be used to provide an updated + // fee preference that will be used for a new sweep transaction of the + // input that will act as a replacement transaction (RBF) of the + // original sweeping transaction, if any. + UpdateParams(input wire.OutPoint, params sweep.ParamsUpdate) ( + chan sweep.Result, error) } diff --git a/input/size.go b/input/size.go index 3db21fbbc34..32a89bcda37 100644 --- a/input/size.go +++ b/input/size.go @@ -1,8 +1,12 @@ package input import ( + "math/big" + "github.com/btcsuite/btcd/blockchain" + "github.com/btcsuite/btcd/btcec" "github.com/btcsuite/btcd/wire" + "github.com/lightningnetwork/lnd/keychain" ) const ( @@ -406,6 +410,47 @@ const ( OfferedHtlcPenaltyWitnessSize = 1 + 1 + 73 + 1 + 33 + 1 + OfferedHtlcScriptSize ) +// dummySigner is a fake signer used for size (upper bound) calculations. +type dummySigner struct { + Signer +} + +// SignOutputRaw generates a signature for the passed transaction according to +// the data within the passed SignDescriptor. +func (s *dummySigner) SignOutputRaw(tx *wire.MsgTx, signDesc *SignDescriptor) ( + []byte, error) { + + // Always return worst-case signature length, excluding the one byte + // sighash flag. + return make([]byte, 73-1), nil +} + +var ( + // dummyPubKey is a pubkey used in script size calculation. + dummyPubKey = btcec.PublicKey{ + X: &big.Int{}, + Y: &big.Int{}, + } + + // dummyAnchorScript is a script used for size calculation. + dummyAnchorScript, _ = CommitScriptAnchor(&dummyPubKey) + + // dummyAnchorWitness is a witness used for size calculation. + dummyAnchorWitness, _ = CommitSpendAnchor( + &dummySigner{}, + &SignDescriptor{ + KeyDesc: keychain.KeyDescriptor{ + PubKey: &dummyPubKey, + }, + WitnessScript: dummyAnchorScript, + }, + nil, + ) + + // AnchorWitnessSize 116 bytes + AnchorWitnessSize = dummyAnchorWitness.SerializeSize() +) + // EstimateCommitTxWeight estimate commitment transaction weight depending on // the precalculated weight of base transaction, witness data, which is needed // for paying for funding tx, and htlc weight multiplied by their count. diff --git a/input/size_test.go b/input/size_test.go index 91643402253..fb57427c3bf 100644 --- a/input/size_test.go +++ b/input/size_test.go @@ -280,3 +280,11 @@ func TestTxWeightEstimator(t *testing.T) { } } } + +// TestSizes guards calculated constants to make sure their values remain +// unchanged. +func TestSizes(t *testing.T) { + if input.AnchorWitnessSize != 116 { + t.Fatal("unexpected anchor witness size") + } +} diff --git a/input/witnessgen.go b/input/witnessgen.go index 7fc509cb618..1a1fba6ea9e 100644 --- a/input/witnessgen.go +++ b/input/witnessgen.go @@ -125,6 +125,10 @@ const ( // output on the counterparty's commitment transaction after a // confirmation. CommitmentToRemoteConfirmed StandardWitnessType = 13 + + // CommitmentAnchor is a witness that allows us to spend our anchor on + // the commitment transaction. + CommitmentAnchor StandardWitnessType = 14 ) // String returns a human readable version of the target WitnessType. @@ -138,6 +142,9 @@ func (wt StandardWitnessType) String() string { case CommitmentToRemoteConfirmed: return "CommitmentToRemoteConfirmed" + case CommitmentAnchor: + return "CommitmentAnchor" + case CommitmentNoDelay: return "CommitmentNoDelay" @@ -218,6 +225,16 @@ func (wt StandardWitnessType) WitnessGenerator(signer Signer, Witness: witness, }, nil + case CommitmentAnchor: + witness, err := CommitSpendAnchor(signer, desc, tx) + if err != nil { + return nil, err + } + + return &Script{ + Witness: witness, + }, nil + case CommitmentNoDelay: witness, err := CommitSpendNoDelay(signer, desc, tx, false) if err != nil { @@ -348,6 +365,10 @@ func (wt StandardWitnessType) SizeUpperBound() (int, bool, error) { case CommitmentToRemoteConfirmed: return ToRemoteConfirmedWitnessSize, false, nil + // Anchor output on the commitment transaction. + case CommitmentAnchor: + return AnchorWitnessSize, false, nil + // Outgoing second layer HTLC's that have confirmed within the // chain, and the output they produced is now mature enough to // sweep. diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index e8637661a47..40348321384 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -324,6 +324,34 @@ func (PeerEvent_EventType) EnumDescriptor() ([]byte, []int) { return fileDescriptor_77a6da22d6a3feb1, []int{51, 0} } +type PendingChannelsResponse_ForceClosedChannel_AnchorState int32 + +const ( + PendingChannelsResponse_ForceClosedChannel_LIMBO PendingChannelsResponse_ForceClosedChannel_AnchorState = 0 + PendingChannelsResponse_ForceClosedChannel_RECOVERED PendingChannelsResponse_ForceClosedChannel_AnchorState = 1 + PendingChannelsResponse_ForceClosedChannel_LOST PendingChannelsResponse_ForceClosedChannel_AnchorState = 2 +) + +var PendingChannelsResponse_ForceClosedChannel_AnchorState_name = map[int32]string{ + 0: "LIMBO", + 1: "RECOVERED", + 2: "LOST", +} + +var PendingChannelsResponse_ForceClosedChannel_AnchorState_value = map[string]int32{ + "LIMBO": 0, + "RECOVERED": 1, + "LOST": 2, +} + +func (x PendingChannelsResponse_ForceClosedChannel_AnchorState) String() string { + return proto.EnumName(PendingChannelsResponse_ForceClosedChannel_AnchorState_name, int32(x)) +} + +func (PendingChannelsResponse_ForceClosedChannel_AnchorState) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{72, 5, 0} +} + type ChannelEventUpdate_UpdateType int32 const ( @@ -5657,10 +5685,14 @@ type PendingChannelsResponse_WaitingCloseChannel struct { /// The pending channel waiting for closing tx to confirm Channel *PendingChannelsResponse_PendingChannel `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"` /// The balance in satoshis encumbered in this channel - LimboBalance int64 `protobuf:"varint,2,opt,name=limbo_balance,json=limboBalance,proto3" json:"limbo_balance,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + LimboBalance int64 `protobuf:"varint,2,opt,name=limbo_balance,json=limboBalance,proto3" json:"limbo_balance,omitempty"` + //* + //A list of valid commitment transactions. Any of these can confirm at + //this point. + Commitments *PendingChannelsResponse_Commitments `protobuf:"bytes,3,opt,name=commitments,proto3" json:"commitments,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *PendingChannelsResponse_WaitingCloseChannel) Reset() { @@ -5706,6 +5738,71 @@ func (m *PendingChannelsResponse_WaitingCloseChannel) GetLimboBalance() int64 { return 0 } +func (m *PendingChannelsResponse_WaitingCloseChannel) GetCommitments() *PendingChannelsResponse_Commitments { + if m != nil { + return m.Commitments + } + return nil +} + +type PendingChannelsResponse_Commitments struct { + /// Hash of the local version of the commitment tx. + LocalTxid string `protobuf:"bytes,1,opt,name=local_txid,json=localTxid,proto3" json:"local_txid,omitempty"` + /// Hash of the remote version of the commitment tx. + RemoteTxid string `protobuf:"bytes,2,opt,name=remote_txid,json=remoteTxid,proto3" json:"remote_txid,omitempty"` + /// Hash of the remote pending version of the commitment tx. + RemotePendingTxid string `protobuf:"bytes,3,opt,name=remote_pending_txid,json=remotePendingTxid,proto3" json:"remote_pending_txid,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *PendingChannelsResponse_Commitments) Reset() { *m = PendingChannelsResponse_Commitments{} } +func (m *PendingChannelsResponse_Commitments) String() string { return proto.CompactTextString(m) } +func (*PendingChannelsResponse_Commitments) ProtoMessage() {} +func (*PendingChannelsResponse_Commitments) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{72, 3} +} + +func (m *PendingChannelsResponse_Commitments) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_PendingChannelsResponse_Commitments.Unmarshal(m, b) +} +func (m *PendingChannelsResponse_Commitments) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_PendingChannelsResponse_Commitments.Marshal(b, m, deterministic) +} +func (m *PendingChannelsResponse_Commitments) XXX_Merge(src proto.Message) { + xxx_messageInfo_PendingChannelsResponse_Commitments.Merge(m, src) +} +func (m *PendingChannelsResponse_Commitments) XXX_Size() int { + return xxx_messageInfo_PendingChannelsResponse_Commitments.Size(m) +} +func (m *PendingChannelsResponse_Commitments) XXX_DiscardUnknown() { + xxx_messageInfo_PendingChannelsResponse_Commitments.DiscardUnknown(m) +} + +var xxx_messageInfo_PendingChannelsResponse_Commitments proto.InternalMessageInfo + +func (m *PendingChannelsResponse_Commitments) GetLocalTxid() string { + if m != nil { + return m.LocalTxid + } + return "" +} + +func (m *PendingChannelsResponse_Commitments) GetRemoteTxid() string { + if m != nil { + return m.RemoteTxid + } + return "" +} + +func (m *PendingChannelsResponse_Commitments) GetRemotePendingTxid() string { + if m != nil { + return m.RemotePendingTxid + } + return "" +} + type PendingChannelsResponse_ClosedChannel struct { /// The pending channel to be closed Channel *PendingChannelsResponse_PendingChannel `protobuf:"bytes,1,opt,name=channel,proto3" json:"channel,omitempty"` @@ -5720,7 +5817,7 @@ func (m *PendingChannelsResponse_ClosedChannel) Reset() { *m = PendingCh func (m *PendingChannelsResponse_ClosedChannel) String() string { return proto.CompactTextString(m) } func (*PendingChannelsResponse_ClosedChannel) ProtoMessage() {} func (*PendingChannelsResponse_ClosedChannel) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{72, 3} + return fileDescriptor_77a6da22d6a3feb1, []int{72, 4} } func (m *PendingChannelsResponse_ClosedChannel) XXX_Unmarshal(b []byte) error { @@ -5770,11 +5867,12 @@ type PendingChannelsResponse_ForceClosedChannel struct { //mature. BlocksTilMaturity int32 `protobuf:"varint,5,opt,name=blocks_til_maturity,json=blocksTilMaturity,proto3" json:"blocks_til_maturity,omitempty"` /// The total value of funds successfully recovered from this channel - RecoveredBalance int64 `protobuf:"varint,6,opt,name=recovered_balance,json=recoveredBalance,proto3" json:"recovered_balance,omitempty"` - PendingHtlcs []*PendingHTLC `protobuf:"bytes,8,rep,name=pending_htlcs,json=pendingHtlcs,proto3" json:"pending_htlcs,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + RecoveredBalance int64 `protobuf:"varint,6,opt,name=recovered_balance,json=recoveredBalance,proto3" json:"recovered_balance,omitempty"` + PendingHtlcs []*PendingHTLC `protobuf:"bytes,8,rep,name=pending_htlcs,json=pendingHtlcs,proto3" json:"pending_htlcs,omitempty"` + Anchor PendingChannelsResponse_ForceClosedChannel_AnchorState `protobuf:"varint,9,opt,name=anchor,proto3,enum=lnrpc.PendingChannelsResponse_ForceClosedChannel_AnchorState" json:"anchor,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *PendingChannelsResponse_ForceClosedChannel) Reset() { @@ -5785,7 +5883,7 @@ func (m *PendingChannelsResponse_ForceClosedChannel) String() string { } func (*PendingChannelsResponse_ForceClosedChannel) ProtoMessage() {} func (*PendingChannelsResponse_ForceClosedChannel) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{72, 4} + return fileDescriptor_77a6da22d6a3feb1, []int{72, 5} } func (m *PendingChannelsResponse_ForceClosedChannel) XXX_Unmarshal(b []byte) error { @@ -5855,6 +5953,13 @@ func (m *PendingChannelsResponse_ForceClosedChannel) GetPendingHtlcs() []*Pendin return nil } +func (m *PendingChannelsResponse_ForceClosedChannel) GetAnchor() PendingChannelsResponse_ForceClosedChannel_AnchorState { + if m != nil { + return m.Anchor + } + return PendingChannelsResponse_ForceClosedChannel_LIMBO +} + type ChannelEventSubscription struct { XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -11043,6 +11148,7 @@ func init() { proto.RegisterEnum("lnrpc.ChannelCloseSummary_Initiator", ChannelCloseSummary_Initiator_name, ChannelCloseSummary_Initiator_value) proto.RegisterEnum("lnrpc.Peer_SyncType", Peer_SyncType_name, Peer_SyncType_value) proto.RegisterEnum("lnrpc.PeerEvent_EventType", PeerEvent_EventType_name, PeerEvent_EventType_value) + proto.RegisterEnum("lnrpc.PendingChannelsResponse_ForceClosedChannel_AnchorState", PendingChannelsResponse_ForceClosedChannel_AnchorState_name, PendingChannelsResponse_ForceClosedChannel_AnchorState_value) proto.RegisterEnum("lnrpc.ChannelEventUpdate_UpdateType", ChannelEventUpdate_UpdateType_name, ChannelEventUpdate_UpdateType_value) proto.RegisterEnum("lnrpc.Invoice_InvoiceState", Invoice_InvoiceState_name, Invoice_InvoiceState_value) proto.RegisterEnum("lnrpc.Payment_PaymentStatus", Payment_PaymentStatus_name, Payment_PaymentStatus_value) @@ -11129,6 +11235,7 @@ func init() { proto.RegisterType((*PendingChannelsResponse_PendingChannel)(nil), "lnrpc.PendingChannelsResponse.PendingChannel") proto.RegisterType((*PendingChannelsResponse_PendingOpenChannel)(nil), "lnrpc.PendingChannelsResponse.PendingOpenChannel") proto.RegisterType((*PendingChannelsResponse_WaitingCloseChannel)(nil), "lnrpc.PendingChannelsResponse.WaitingCloseChannel") + proto.RegisterType((*PendingChannelsResponse_Commitments)(nil), "lnrpc.PendingChannelsResponse.Commitments") proto.RegisterType((*PendingChannelsResponse_ClosedChannel)(nil), "lnrpc.PendingChannelsResponse.ClosedChannel") proto.RegisterType((*PendingChannelsResponse_ForceClosedChannel)(nil), "lnrpc.PendingChannelsResponse.ForceClosedChannel") proto.RegisterType((*ChannelEventSubscription)(nil), "lnrpc.ChannelEventSubscription") @@ -11218,709 +11325,717 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 11219 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x6b, 0x8f, 0x1c, 0x49, - 0x72, 0x18, 0xfb, 0x35, 0xdd, 0x1d, 0xfd, 0x9c, 0x9c, 0x57, 0x73, 0xb8, 0x5c, 0x72, 0x6b, 0xf7, - 0x96, 0x3c, 0xee, 0x1d, 0xc9, 0xe5, 0x1d, 0xf7, 0x4e, 0xbb, 0xf6, 0xe9, 0x7a, 0x66, 0x7a, 0x38, - 0x7d, 0x9c, 0xd7, 0x56, 0xf7, 0xec, 0x6a, 0x4f, 0x96, 0xeb, 0x6a, 0xba, 0x73, 0x66, 0x4a, 0xec, - 0xae, 0xea, 0xad, 0xaa, 0x9e, 0xc7, 0x1d, 0xd6, 0x1f, 0xfc, 0x10, 0x0c, 0xbf, 0x00, 0xc1, 0x96, - 0x01, 0xcb, 0x16, 0x6c, 0xd8, 0x30, 0x0c, 0xc3, 0x80, 0x20, 0xe3, 0x64, 0xc0, 0x1f, 0xfc, 0x5d, - 0x5f, 0x6c, 0xe8, 0x83, 0xe4, 0x2f, 0x86, 0x20, 0x40, 0xb0, 0x7c, 0xfe, 0xaa, 0x9f, 0x60, 0x64, - 0x44, 0x66, 0x55, 0x56, 0x77, 0x0d, 0xc9, 0xbd, 0x5b, 0xdf, 0x17, 0x72, 0x2a, 0x32, 0xf2, 0x1d, - 0x19, 0x19, 0x8f, 0x8c, 0x68, 0x28, 0xfb, 0x93, 0xc1, 0xc3, 0x89, 0xef, 0x85, 0x1e, 0x2b, 0x8c, - 0x5c, 0x7f, 0x32, 0x58, 0x7f, 0xe3, 0xd4, 0xf3, 0x4e, 0x47, 0xfc, 0x91, 0x3d, 0x71, 0x1e, 0xd9, - 0xae, 0xeb, 0x85, 0x76, 0xe8, 0x78, 0x6e, 0x40, 0x48, 0xc6, 0x8f, 0xa0, 0xfe, 0x8c, 0xbb, 0x3d, - 0xce, 0x87, 0x26, 0xff, 0x7c, 0xca, 0x83, 0x90, 0xbd, 0x07, 0x8b, 0x36, 0xff, 0x31, 0xe7, 0x43, - 0x6b, 0x62, 0x07, 0xc1, 0xe4, 0xcc, 0xb7, 0x03, 0xde, 0xca, 0xdc, 0xcd, 0xdc, 0xaf, 0x9a, 0x4d, - 0x2a, 0x38, 0x8c, 0xe0, 0xec, 0x2d, 0xa8, 0x06, 0x02, 0x95, 0xbb, 0xa1, 0xef, 0x4d, 0xae, 0x5a, - 0x59, 0xc4, 0xab, 0x08, 0x58, 0x87, 0x40, 0xc6, 0x08, 0x1a, 0x51, 0x0f, 0xc1, 0xc4, 0x73, 0x03, - 0xce, 0x1e, 0xc3, 0xf2, 0xc0, 0x99, 0x9c, 0x71, 0xdf, 0xc2, 0xca, 0x63, 0x97, 0x8f, 0x3d, 0xd7, - 0x19, 0xb4, 0x32, 0x77, 0x73, 0xf7, 0xcb, 0x26, 0xa3, 0x32, 0x51, 0x63, 0x4f, 0x96, 0xb0, 0x7b, - 0xd0, 0xe0, 0x2e, 0xc1, 0xf9, 0x10, 0x6b, 0xc9, 0xae, 0xea, 0x31, 0x58, 0x54, 0x30, 0xfe, 0x7e, - 0x16, 0x16, 0xbb, 0xae, 0x13, 0x7e, 0x6a, 0x8f, 0x46, 0x3c, 0x54, 0x73, 0xba, 0x07, 0x8d, 0x0b, - 0x04, 0xe0, 0x9c, 0x2e, 0x3c, 0x7f, 0x28, 0x67, 0x54, 0x27, 0xf0, 0xa1, 0x84, 0x5e, 0x3b, 0xb2, - 0xec, 0xb5, 0x23, 0x4b, 0x5d, 0xae, 0xdc, 0x35, 0xcb, 0x75, 0x0f, 0x1a, 0x3e, 0x1f, 0x78, 0xe7, - 0xdc, 0xbf, 0xb2, 0x2e, 0x1c, 0x77, 0xe8, 0x5d, 0xb4, 0xf2, 0x77, 0x33, 0xf7, 0x0b, 0x66, 0x5d, - 0x81, 0x3f, 0x45, 0x28, 0xdb, 0x80, 0xc6, 0xe0, 0xcc, 0x76, 0x5d, 0x3e, 0xb2, 0x8e, 0xed, 0xc1, - 0x8b, 0xe9, 0x24, 0x68, 0x15, 0xee, 0x66, 0xee, 0x57, 0x9e, 0xdc, 0x7c, 0x88, 0xbb, 0xfa, 0x70, - 0xf3, 0xcc, 0x76, 0x37, 0xb0, 0xa4, 0xe7, 0xda, 0x93, 0xe0, 0xcc, 0x0b, 0xcd, 0xba, 0xac, 0x41, - 0xe0, 0xc0, 0x58, 0x06, 0xa6, 0xaf, 0x04, 0xad, 0xbd, 0xf1, 0x9f, 0x32, 0xb0, 0x74, 0xe4, 0x8e, - 0xbc, 0xc1, 0x8b, 0x9f, 0x73, 0x89, 0x52, 0xe6, 0x90, 0x7d, 0xdd, 0x39, 0xe4, 0xbe, 0xec, 0x1c, - 0x56, 0x61, 0x39, 0x39, 0x58, 0x39, 0x0b, 0x0e, 0x2b, 0xa2, 0xf6, 0x29, 0x57, 0xc3, 0x52, 0xd3, - 0xf8, 0x3a, 0x34, 0x07, 0x53, 0xdf, 0xe7, 0xee, 0xdc, 0x3c, 0x1a, 0x12, 0x1e, 0x4d, 0xe4, 0x2d, - 0xa8, 0xba, 0xfc, 0x22, 0x46, 0x93, 0xb4, 0xeb, 0xf2, 0x0b, 0x85, 0x62, 0xb4, 0x60, 0x75, 0xb6, - 0x1b, 0x39, 0x80, 0x9f, 0x65, 0x20, 0x7f, 0x14, 0x5e, 0x7a, 0xec, 0x29, 0x54, 0xed, 0xe1, 0xd0, - 0xe7, 0x41, 0x60, 0x85, 0x57, 0x13, 0x3a, 0x29, 0xf5, 0x27, 0x4c, 0x4e, 0xb1, 0x4d, 0x45, 0xfd, - 0xab, 0x09, 0x37, 0x2b, 0x76, 0xfc, 0xc1, 0x5a, 0x50, 0x94, 0x9f, 0xd8, 0x6f, 0xd9, 0x54, 0x9f, - 0xec, 0x36, 0x80, 0x3d, 0xf6, 0xa6, 0x6e, 0x68, 0x05, 0x76, 0x88, 0x2b, 0x96, 0x33, 0xcb, 0x04, - 0xe9, 0xd9, 0x21, 0xbb, 0x05, 0xe5, 0xc9, 0x0b, 0x2b, 0x18, 0xf8, 0xce, 0x24, 0x44, 0xe2, 0x29, - 0x9b, 0xa5, 0xc9, 0x8b, 0x1e, 0x7e, 0xb3, 0xf7, 0xa0, 0xe4, 0x4d, 0xc3, 0x89, 0xe7, 0xb8, 0xa1, - 0xa4, 0x97, 0x86, 0x1c, 0xc8, 0xc1, 0x34, 0x3c, 0x14, 0x60, 0x33, 0x42, 0x60, 0xef, 0x40, 0x6d, - 0xe0, 0xb9, 0x27, 0x8e, 0x3f, 0x26, 0x8e, 0xd0, 0x5a, 0xc0, 0xbe, 0x92, 0x40, 0xe3, 0x0f, 0xb2, - 0x50, 0xe9, 0xfb, 0xb6, 0x1b, 0xd8, 0x03, 0x01, 0x60, 0x6b, 0x50, 0x0c, 0x2f, 0xad, 0x33, 0x3b, - 0x38, 0xc3, 0xa9, 0x96, 0xcd, 0x85, 0xf0, 0x72, 0xc7, 0x0e, 0xce, 0xd8, 0x2a, 0x2c, 0xd0, 0x28, - 0x71, 0x42, 0x39, 0x53, 0x7e, 0x89, 0x03, 0xe2, 0x4e, 0xc7, 0x56, 0xb2, 0xab, 0x1c, 0x52, 0x4c, - 0xd3, 0x9d, 0x8e, 0x37, 0x75, 0xb8, 0x98, 0xfc, 0xb1, 0xd8, 0x6e, 0xea, 0x80, 0xa6, 0x57, 0x46, - 0x08, 0xf6, 0xf1, 0x16, 0x54, 0x65, 0x31, 0x77, 0x4e, 0xcf, 0x68, 0x8e, 0x05, 0xb3, 0x42, 0x08, - 0x08, 0x12, 0x2d, 0x84, 0xce, 0x98, 0x5b, 0x41, 0x68, 0x8f, 0x27, 0x72, 0x4a, 0x65, 0x01, 0xe9, - 0x09, 0x00, 0x16, 0x7b, 0xa1, 0x3d, 0xb2, 0x4e, 0x38, 0x0f, 0x5a, 0x45, 0x59, 0x2c, 0x20, 0xdb, - 0x9c, 0x07, 0xec, 0x6b, 0x50, 0x1f, 0xf2, 0x20, 0xb4, 0xe4, 0x66, 0xf0, 0xa0, 0x55, 0xc2, 0x93, - 0x5f, 0x13, 0xd0, 0xb6, 0x02, 0xb2, 0x37, 0x00, 0x7c, 0xfb, 0xc2, 0x12, 0x0b, 0xc1, 0x2f, 0x5b, - 0x65, 0xda, 0x05, 0xdf, 0xbe, 0xe8, 0x5f, 0xee, 0xf0, 0x4b, 0x41, 0x35, 0xcf, 0x78, 0xa8, 0x2d, - 0x5a, 0x20, 0xa9, 0xd3, 0xd8, 0x05, 0xa6, 0x81, 0xb7, 0x78, 0x68, 0x3b, 0xa3, 0x80, 0x7d, 0x00, - 0xd5, 0x50, 0x43, 0x46, 0x36, 0x58, 0x89, 0x48, 0x48, 0xab, 0x60, 0x26, 0xf0, 0x8c, 0x33, 0x28, - 0x6d, 0x73, 0xbe, 0xeb, 0x8c, 0x9d, 0x90, 0xad, 0x42, 0xe1, 0xc4, 0xb9, 0xe4, 0x44, 0xec, 0xb9, - 0x9d, 0x1b, 0x26, 0x7d, 0xb2, 0x3b, 0x00, 0xf8, 0x87, 0x35, 0x8e, 0xa8, 0x69, 0xe7, 0x86, 0x59, - 0x46, 0xd8, 0x5e, 0x60, 0x87, 0x6c, 0x1d, 0x8a, 0x13, 0xee, 0x0f, 0xb8, 0xda, 0xb7, 0x9d, 0x1b, - 0xa6, 0x02, 0x6c, 0x14, 0xa1, 0x30, 0x12, 0xad, 0x1b, 0x7f, 0x54, 0x80, 0x4a, 0x8f, 0xbb, 0xd1, - 0x29, 0x63, 0x90, 0x17, 0x0b, 0x22, 0x4f, 0x16, 0xfe, 0xcd, 0xde, 0x86, 0x0a, 0x2e, 0x5d, 0x10, - 0xfa, 0x8e, 0x7b, 0x4a, 0x54, 0xbd, 0x91, 0x6d, 0x65, 0x4c, 0x10, 0xe0, 0x1e, 0x42, 0x59, 0x13, - 0x72, 0xf6, 0x58, 0x51, 0xb5, 0xf8, 0x93, 0xdd, 0x84, 0x92, 0x3d, 0x0e, 0x69, 0x78, 0x55, 0x04, - 0x17, 0xed, 0x71, 0x88, 0x43, 0x7b, 0x0b, 0xaa, 0x13, 0xfb, 0x6a, 0x2c, 0xce, 0x72, 0x44, 0x0e, - 0x55, 0xb3, 0x22, 0x61, 0x48, 0x10, 0x4f, 0x60, 0x49, 0x47, 0x51, 0x9d, 0x17, 0xa2, 0xce, 0x17, - 0x35, 0x6c, 0x39, 0x86, 0x7b, 0xd0, 0x50, 0x75, 0x7c, 0x9a, 0x0f, 0x92, 0x49, 0xd9, 0xac, 0x4b, - 0xb0, 0x9a, 0xe5, 0x7d, 0x68, 0x9e, 0x38, 0xae, 0x3d, 0xb2, 0x06, 0xa3, 0xf0, 0xdc, 0x1a, 0xf2, - 0x51, 0x68, 0x23, 0xc5, 0x14, 0xcc, 0x3a, 0xc2, 0x37, 0x47, 0xe1, 0xf9, 0x96, 0x80, 0xb2, 0x6f, - 0x40, 0xf9, 0x84, 0x73, 0x0b, 0x17, 0xab, 0x55, 0x4a, 0x1c, 0x3c, 0xb5, 0x43, 0x66, 0xe9, 0x44, - 0xed, 0xd5, 0x37, 0xa0, 0xe9, 0x4d, 0xc3, 0x53, 0xcf, 0x71, 0x4f, 0x2d, 0xc1, 0xef, 0x2c, 0x67, - 0x88, 0x34, 0x94, 0xdf, 0xc8, 0x3e, 0xce, 0x98, 0x75, 0x55, 0x26, 0x38, 0x4f, 0x77, 0xc8, 0xde, - 0x85, 0xc6, 0xc8, 0x0e, 0x42, 0xeb, 0xcc, 0x9b, 0x58, 0x93, 0xe9, 0xf1, 0x0b, 0x7e, 0xd5, 0xaa, - 0xe1, 0x42, 0xd4, 0x04, 0x78, 0xc7, 0x9b, 0x1c, 0x22, 0x50, 0x50, 0x36, 0x8e, 0x93, 0x06, 0x01, - 0x77, 0x33, 0xf7, 0x6b, 0x66, 0x59, 0x40, 0xa8, 0xd3, 0xcf, 0x60, 0x09, 0xb7, 0x67, 0x30, 0x0d, - 0x42, 0x6f, 0x6c, 0x09, 0x5e, 0xed, 0x0f, 0x83, 0x56, 0x05, 0x69, 0xed, 0xeb, 0x72, 0xb0, 0xda, - 0x1e, 0x3f, 0xdc, 0xe2, 0x41, 0xb8, 0x89, 0xc8, 0x26, 0xe1, 0x8a, 0x0b, 0xfd, 0xca, 0x5c, 0x1c, - 0xce, 0xc2, 0xd9, 0x37, 0x80, 0xd9, 0xa3, 0x91, 0x77, 0x61, 0x05, 0x7c, 0x74, 0x62, 0xc9, 0x45, - 0x6c, 0xd5, 0xef, 0x66, 0xee, 0x97, 0xcc, 0x26, 0x96, 0xf4, 0xf8, 0xe8, 0xe4, 0x90, 0xe0, 0xec, - 0x03, 0xc0, 0xc3, 0x64, 0x9d, 0x70, 0x3b, 0x9c, 0xfa, 0x3c, 0x68, 0x35, 0xee, 0xe6, 0xee, 0xd7, - 0x9f, 0x2c, 0x46, 0xeb, 0x85, 0xe0, 0x0d, 0x27, 0x34, 0xab, 0x02, 0x4f, 0x7e, 0x07, 0xeb, 0x5b, - 0xb0, 0x9a, 0x3e, 0x24, 0x41, 0x54, 0x62, 0x55, 0x04, 0x31, 0xe6, 0x4d, 0xf1, 0x27, 0x5b, 0x86, - 0xc2, 0xb9, 0x3d, 0x9a, 0x72, 0xc9, 0xd3, 0xe9, 0xe3, 0xc3, 0xec, 0x77, 0x33, 0xc6, 0x1f, 0x66, - 0xa0, 0x4a, 0xb3, 0x94, 0xb2, 0xc8, 0xdb, 0x50, 0x53, 0xd4, 0xc0, 0x7d, 0xdf, 0xf3, 0x25, 0x57, - 0x53, 0x94, 0xd7, 0x11, 0x30, 0x71, 0xab, 0x28, 0xa4, 0x89, 0xcf, 0x9d, 0xb1, 0x7d, 0xaa, 0x9a, - 0x56, 0xa4, 0x74, 0x28, 0xc1, 0xec, 0xfd, 0xb8, 0x3d, 0xdf, 0x9b, 0x86, 0x5c, 0xde, 0x79, 0x55, - 0x39, 0x3d, 0x53, 0xc0, 0xa2, 0xd6, 0xf1, 0xeb, 0x35, 0xe8, 0xdc, 0xf8, 0x9d, 0x0c, 0x30, 0x31, - 0xec, 0xbe, 0x47, 0x0d, 0x48, 0x0a, 0x9d, 0xad, 0x99, 0x79, 0xed, 0x13, 0x92, 0x7d, 0xd9, 0x09, - 0x31, 0xa0, 0x40, 0x63, 0xcf, 0xa7, 0x8c, 0x9d, 0x8a, 0x7e, 0x90, 0x2f, 0xe5, 0x9a, 0x79, 0xe3, - 0x7f, 0xe5, 0x60, 0x79, 0x93, 0xae, 0xec, 0xf6, 0x60, 0xc0, 0x27, 0xd1, 0xd9, 0xb9, 0x03, 0x15, - 0xd7, 0x1b, 0x72, 0x45, 0xb1, 0x34, 0x30, 0x10, 0x20, 0x8d, 0x5c, 0xcf, 0x6c, 0xc7, 0xa5, 0x81, - 0xd3, 0x62, 0x96, 0x11, 0x82, 0xc3, 0x7e, 0x17, 0x1a, 0x13, 0xee, 0x0e, 0xf5, 0x23, 0x42, 0x42, - 0x55, 0x4d, 0x82, 0xe5, 0xe9, 0xb8, 0x03, 0x95, 0x93, 0x29, 0xe1, 0x09, 0xc6, 0x92, 0x47, 0x1a, - 0x00, 0x09, 0x6a, 0x13, 0x7f, 0x99, 0x4c, 0x83, 0x33, 0x2c, 0x2d, 0x60, 0x69, 0x51, 0x7c, 0x8b, - 0xa2, 0xdb, 0x00, 0xc3, 0x69, 0x10, 0xca, 0x13, 0xb3, 0x80, 0x85, 0x65, 0x01, 0xa1, 0x13, 0xf3, - 0x4d, 0x58, 0x1a, 0xdb, 0x97, 0x16, 0xd2, 0x8e, 0xe5, 0xb8, 0xd6, 0xc9, 0x08, 0xef, 0x9c, 0x22, - 0xe2, 0x35, 0xc7, 0xf6, 0xe5, 0x27, 0xa2, 0xa4, 0xeb, 0x6e, 0x23, 0x5c, 0xb0, 0x15, 0x25, 0xee, - 0xf8, 0x3c, 0xe0, 0xfe, 0x39, 0x47, 0x4e, 0x90, 0x8f, 0x64, 0x1a, 0x93, 0xa0, 0x62, 0x44, 0x63, - 0x31, 0xef, 0x70, 0x34, 0xa0, 0x63, 0x6f, 0x16, 0xc7, 0x8e, 0xbb, 0x13, 0x8e, 0x06, 0xe2, 0x5e, - 0x11, 0x7c, 0x64, 0xc2, 0x7d, 0xeb, 0xc5, 0x05, 0x9e, 0xe1, 0x3c, 0xf2, 0x8d, 0x43, 0xee, 0x3f, - 0xbf, 0x10, 0x57, 0xff, 0x20, 0x40, 0x46, 0x64, 0x5f, 0xb5, 0x2a, 0x78, 0xc0, 0x4b, 0x83, 0x40, - 0xb0, 0x20, 0xfb, 0x4a, 0x1c, 0x42, 0x31, 0x5a, 0x1b, 0x77, 0x81, 0x0f, 0xb1, 0xf9, 0x00, 0x39, - 0x6a, 0x0d, 0x07, 0xdb, 0x96, 0x05, 0xa2, 0x9f, 0x40, 0x50, 0xbd, 0x1a, 0xec, 0xc9, 0xc8, 0x3e, - 0x0d, 0x90, 0xa5, 0xd4, 0xcc, 0xaa, 0x04, 0x6e, 0x0b, 0x98, 0xf1, 0x29, 0x09, 0x59, 0xda, 0xde, - 0xca, 0x33, 0x23, 0xae, 0x7a, 0x84, 0xe0, 0xbe, 0x96, 0x4c, 0xf9, 0x95, 0xb6, 0x69, 0xd9, 0x94, - 0x4d, 0x33, 0x7e, 0x2f, 0x03, 0x55, 0xd9, 0x32, 0x0a, 0x25, 0xec, 0x21, 0x30, 0xb5, 0x8b, 0xe1, - 0xa5, 0x33, 0xb4, 0x8e, 0xaf, 0x42, 0x1e, 0x10, 0xd1, 0xec, 0xdc, 0x30, 0x9b, 0xb2, 0xac, 0x7f, - 0xe9, 0x0c, 0x37, 0x44, 0x09, 0x7b, 0x00, 0xcd, 0x04, 0x7e, 0x10, 0xfa, 0x44, 0xd1, 0x3b, 0x37, - 0xcc, 0xba, 0x86, 0xdd, 0x0b, 0x7d, 0x71, 0x46, 0x84, 0xc8, 0x33, 0x0d, 0x2d, 0xc7, 0x1d, 0xf2, - 0x4b, 0x24, 0xa3, 0x9a, 0x59, 0x21, 0x58, 0x57, 0x80, 0x36, 0xea, 0x50, 0xd5, 0x9b, 0x33, 0x4e, - 0xa1, 0xa4, 0xe4, 0x25, 0x14, 0x18, 0x66, 0x86, 0x64, 0x96, 0xc3, 0x68, 0x24, 0x37, 0xa1, 0x94, - 0x1c, 0x81, 0x59, 0x0c, 0x5f, 0xbb, 0x63, 0xe3, 0x7b, 0xd0, 0xdc, 0x15, 0xc4, 0xe3, 0x0a, 0x62, - 0x95, 0xf2, 0xdf, 0x2a, 0x2c, 0x68, 0x87, 0xa6, 0x6c, 0xca, 0x2f, 0x71, 0xe7, 0x9e, 0x79, 0x41, - 0x28, 0x7b, 0xc1, 0xbf, 0x8d, 0x3f, 0xca, 0x00, 0xeb, 0x04, 0xa1, 0x33, 0xb6, 0x43, 0xbe, 0xcd, - 0x23, 0xb6, 0x70, 0x00, 0x55, 0xd1, 0x5a, 0xdf, 0x6b, 0x93, 0x40, 0x46, 0x02, 0xc5, 0x7b, 0xf2, - 0x18, 0xcf, 0x57, 0x78, 0xa8, 0x63, 0x13, 0x9b, 0x4f, 0x34, 0x20, 0x4e, 0x59, 0x68, 0xfb, 0xa7, - 0x3c, 0x44, 0x31, 0x4e, 0xca, 0xfb, 0x40, 0x20, 0x21, 0xc0, 0xad, 0xff, 0x2a, 0x2c, 0xce, 0xb5, - 0xa1, 0xf3, 0xe5, 0x72, 0x0a, 0x5f, 0xce, 0xe9, 0x7c, 0xd9, 0x82, 0xa5, 0xc4, 0xb8, 0x24, 0xa5, - 0xad, 0x41, 0x51, 0x1c, 0x08, 0x21, 0x1c, 0x64, 0x48, 0xaa, 0x3c, 0xe1, 0x5c, 0x88, 0xc1, 0x8f, - 0x60, 0xf9, 0x84, 0x73, 0xdf, 0x0e, 0xb1, 0x10, 0x4f, 0x8c, 0xd8, 0x21, 0xd9, 0xf0, 0xa2, 0x2c, - 0xeb, 0xd9, 0xe1, 0x21, 0xf7, 0xc5, 0x4e, 0x19, 0xff, 0x3b, 0x03, 0x0d, 0xc1, 0x41, 0xf7, 0x6c, - 0xf7, 0x4a, 0xad, 0xd3, 0x6e, 0xea, 0x3a, 0xdd, 0xd7, 0x2e, 0x43, 0x0d, 0xfb, 0xcb, 0x2e, 0x52, - 0x6e, 0x76, 0x91, 0xd8, 0x5d, 0xa8, 0x26, 0xc6, 0x5a, 0xc0, 0xb1, 0x42, 0x10, 0x0d, 0xf2, 0x17, - 0x5f, 0xc6, 0x77, 0xa1, 0x19, 0x0f, 0x5b, 0xae, 0x21, 0x83, 0xbc, 0x20, 0x49, 0xd9, 0x00, 0xfe, - 0x6d, 0xfc, 0xab, 0x0c, 0x21, 0x6e, 0x7a, 0x4e, 0x24, 0x9d, 0x0a, 0x44, 0x21, 0xf7, 0x2a, 0x44, - 0xf1, 0xf7, 0xb5, 0x52, 0xfd, 0x2f, 0x3e, 0x59, 0x71, 0x74, 0x02, 0xee, 0x0e, 0x2d, 0x7b, 0x34, - 0x42, 0xe6, 0x5b, 0x32, 0x8b, 0xe2, 0xbb, 0x3d, 0x1a, 0x19, 0xf7, 0x60, 0x51, 0x1b, 0xdd, 0x4b, - 0xe6, 0xb1, 0x0f, 0x6c, 0xd7, 0x09, 0xc2, 0x23, 0x37, 0x98, 0x68, 0x82, 0xdb, 0x2d, 0x28, 0x0b, - 0x0e, 0x2b, 0x46, 0x46, 0x47, 0xb6, 0x60, 0x0a, 0x96, 0x2b, 0xc6, 0x15, 0x60, 0xa1, 0x7d, 0x29, - 0x0b, 0xb3, 0xb2, 0xd0, 0xbe, 0xc4, 0x42, 0xe3, 0xbb, 0xb0, 0x94, 0x68, 0x4f, 0x76, 0xfd, 0x16, - 0x14, 0xa6, 0xe1, 0xa5, 0xa7, 0x44, 0xf3, 0x8a, 0xa4, 0x10, 0xa1, 0x00, 0x9a, 0x54, 0x62, 0x7c, - 0x04, 0x8b, 0xfb, 0xfc, 0x42, 0x1e, 0x62, 0x35, 0x90, 0x77, 0x21, 0xff, 0x0a, 0xa5, 0x10, 0xcb, - 0x8d, 0x87, 0xc0, 0xf4, 0xca, 0xb2, 0x57, 0x4d, 0x47, 0xcc, 0x24, 0x74, 0x44, 0xe3, 0x5d, 0x60, - 0x3d, 0xe7, 0xd4, 0xdd, 0xe3, 0x41, 0x60, 0x9f, 0x46, 0xc7, 0xbe, 0x09, 0xb9, 0x71, 0x70, 0x2a, - 0x79, 0x94, 0xf8, 0xd3, 0xf8, 0x16, 0x2c, 0x25, 0xf0, 0x64, 0xc3, 0x6f, 0x40, 0x39, 0x70, 0x4e, - 0x5d, 0x14, 0xac, 0x64, 0xd3, 0x31, 0xc0, 0xd8, 0x86, 0xe5, 0x4f, 0xb8, 0xef, 0x9c, 0x5c, 0xbd, - 0xaa, 0xf9, 0x64, 0x3b, 0xd9, 0xd9, 0x76, 0x3a, 0xb0, 0x32, 0xd3, 0x8e, 0xec, 0x9e, 0xc8, 0x57, - 0xee, 0x64, 0xc9, 0xa4, 0x0f, 0x8d, 0xef, 0x65, 0x75, 0xbe, 0x67, 0x1c, 0x01, 0xdb, 0xf4, 0x5c, - 0x97, 0x0f, 0xc2, 0x43, 0xce, 0xfd, 0xd8, 0x4a, 0x15, 0xd3, 0x6a, 0xe5, 0xc9, 0x9a, 0x5c, 0xd9, - 0x59, 0x66, 0x2a, 0x89, 0x98, 0x41, 0x7e, 0xc2, 0xfd, 0x31, 0x36, 0x5c, 0x32, 0xf1, 0x6f, 0x63, - 0x05, 0x96, 0x12, 0xcd, 0x4a, 0xbd, 0xfe, 0x31, 0xac, 0x6c, 0x39, 0xc1, 0x60, 0xbe, 0xc3, 0x35, - 0x28, 0x4e, 0xa6, 0xc7, 0x56, 0x92, 0x2f, 0x3f, 0xe7, 0x57, 0x42, 0xdb, 0x9b, 0xad, 0x21, 0xdb, - 0xfa, 0xbb, 0x19, 0xc8, 0xef, 0xf4, 0x77, 0x37, 0xd9, 0x3a, 0x94, 0x1c, 0x77, 0xe0, 0x8d, 0x85, - 0xe0, 0x45, 0x73, 0x8e, 0xbe, 0xaf, 0x3d, 0x60, 0xb7, 0xa0, 0x8c, 0xf2, 0x9a, 0x50, 0x6d, 0xa5, - 0xe8, 0x53, 0x12, 0x80, 0x5d, 0x6f, 0xf0, 0x42, 0xe8, 0xd4, 0xfc, 0x72, 0xe2, 0xf8, 0xa8, 0x35, - 0x2b, 0x65, 0x38, 0x4f, 0x77, 0x7d, 0x5c, 0x40, 0x1a, 0xb1, 0xf1, 0x57, 0x45, 0x28, 0xca, 0xdb, - 0x96, 0x6e, 0xee, 0xd0, 0x39, 0xe7, 0xf1, 0xcd, 0x2d, 0xbe, 0x84, 0x3c, 0xe0, 0xf3, 0xb1, 0x17, - 0x46, 0x02, 0x1b, 0xed, 0x41, 0x95, 0x80, 0x52, 0x64, 0xd3, 0x84, 0x06, 0x32, 0x31, 0xe4, 0x08, - 0x69, 0xa0, 0x5f, 0xe5, 0xb7, 0xa0, 0xa8, 0xee, 0xfe, 0x7c, 0xa4, 0xd3, 0x2c, 0x0c, 0x48, 0x5a, - 0x5b, 0x87, 0xd2, 0xc0, 0x9e, 0xd8, 0x03, 0x27, 0xbc, 0x92, 0x0c, 0x21, 0xfa, 0x16, 0xad, 0x8f, - 0xbc, 0x81, 0x3d, 0xb2, 0x8e, 0xed, 0x91, 0xed, 0x0e, 0xb8, 0xd4, 0xdd, 0xab, 0x08, 0xdc, 0x20, - 0x98, 0xd0, 0xcf, 0xe5, 0x38, 0x15, 0x16, 0xa9, 0xf0, 0x72, 0xf4, 0x0a, 0x4d, 0x08, 0x97, 0xde, - 0x78, 0xec, 0x08, 0x2d, 0x83, 0xc4, 0xb0, 0x9c, 0x59, 0x26, 0xc8, 0x36, 0xc7, 0xd9, 0xca, 0xe2, - 0x0b, 0x5a, 0xba, 0x32, 0x75, 0x45, 0xc0, 0x4f, 0xc9, 0x90, 0x30, 0x2f, 0x8b, 0xe5, 0x34, 0x59, - 0xec, 0x3d, 0x58, 0x9c, 0xba, 0x01, 0x0f, 0xc3, 0x11, 0x1f, 0x46, 0x63, 0xa9, 0x20, 0x52, 0x33, - 0x2a, 0x50, 0xc3, 0x79, 0x08, 0x4b, 0x64, 0x74, 0x08, 0xec, 0xd0, 0x0b, 0xce, 0x9c, 0xc0, 0x0a, - 0x84, 0x86, 0x44, 0xea, 0xee, 0x22, 0x16, 0xf5, 0x64, 0x49, 0x8f, 0x54, 0xa4, 0xb5, 0x19, 0x7c, - 0x9f, 0x0f, 0xb8, 0x73, 0xce, 0x87, 0x28, 0xa7, 0xe5, 0xcc, 0x95, 0x44, 0x1d, 0x53, 0x16, 0xa2, - 0xd0, 0x3d, 0x1d, 0x5b, 0xd3, 0xc9, 0xd0, 0x16, 0xc2, 0x4a, 0x9d, 0x84, 0x61, 0x77, 0x3a, 0x3e, - 0x22, 0x08, 0x7b, 0x0c, 0x4a, 0x12, 0x93, 0xf2, 0x61, 0x23, 0xc1, 0xcf, 0x04, 0xb1, 0x9a, 0x55, - 0x89, 0x41, 0x82, 0x62, 0x42, 0xe6, 0x6c, 0xce, 0xc8, 0x9c, 0x2d, 0x28, 0x4e, 0x7c, 0xe7, 0xdc, - 0x0e, 0x79, 0x6b, 0x91, 0x18, 0xb8, 0xfc, 0x14, 0x9c, 0xc1, 0x71, 0x9d, 0xd0, 0xb1, 0x43, 0xcf, - 0x6f, 0x31, 0x2c, 0x8b, 0x01, 0xec, 0x01, 0x2c, 0x22, 0x8d, 0x04, 0xa1, 0x1d, 0x4e, 0x03, 0x29, - 0x81, 0x2e, 0x21, 0x31, 0xa1, 0x0c, 0xdd, 0x43, 0x38, 0x0a, 0xa1, 0xec, 0x5b, 0xb0, 0x4a, 0x64, - 0x81, 0x35, 0xa4, 0x64, 0x8d, 0x02, 0xc1, 0x32, 0x2e, 0xc5, 0x12, 0x96, 0x0a, 0xfa, 0x96, 0xf2, - 0xb5, 0x90, 0x0e, 0x9e, 0xc2, 0x9a, 0x24, 0x93, 0xb9, 0x5a, 0x2b, 0x58, 0x6b, 0x99, 0x8a, 0x67, - 0xaa, 0x3d, 0x84, 0x45, 0x31, 0x24, 0x67, 0x60, 0xc9, 0xda, 0xe2, 0x24, 0xac, 0x8a, 0xd1, 0xa3, - 0xa6, 0xd4, 0xa0, 0x42, 0x13, 0xcb, 0x9e, 0xf3, 0x2b, 0xf6, 0x3d, 0x68, 0x10, 0xc9, 0xa0, 0x7a, - 0x85, 0x9c, 0x7e, 0x1d, 0x39, 0xfd, 0x8a, 0xb2, 0x70, 0x46, 0xa5, 0xc8, 0xec, 0xeb, 0x83, 0xc4, - 0xb7, 0x38, 0x0e, 0x23, 0xe7, 0x84, 0x87, 0xce, 0x98, 0xb7, 0xd6, 0x88, 0xc0, 0xd4, 0xb7, 0x38, - 0xa9, 0xd3, 0x09, 0x96, 0xb4, 0x88, 0x2f, 0xd0, 0x17, 0xd2, 0xee, 0xc8, 0x0b, 0xb8, 0x32, 0x51, - 0xb5, 0x6e, 0xca, 0x43, 0x28, 0x80, 0x92, 0xed, 0x19, 0x3f, 0xcd, 0xd0, 0x3d, 0x26, 0x8f, 0x7d, - 0xa0, 0x69, 0x65, 0x74, 0xe0, 0x2d, 0xcf, 0x1d, 0x5d, 0x49, 0x1e, 0x00, 0x04, 0x3a, 0x70, 0x47, - 0x78, 0x08, 0x1d, 0x57, 0x47, 0x21, 0x96, 0x59, 0x55, 0x40, 0x44, 0xba, 0x03, 0x95, 0xc9, 0xf4, - 0x78, 0xe4, 0x0c, 0x08, 0x25, 0x47, 0xad, 0x10, 0x08, 0x11, 0x84, 0x5a, 0x4a, 0x84, 0x40, 0x18, - 0x79, 0xc4, 0xa8, 0x48, 0x18, 0xa2, 0x20, 0x4b, 0xe6, 0x3e, 0x72, 0x81, 0xaa, 0x89, 0x7f, 0x1b, - 0x1b, 0xb0, 0x9c, 0x1c, 0xb4, 0xbc, 0x2f, 0x1e, 0x40, 0x49, 0xb2, 0x18, 0x65, 0xaf, 0xa8, 0x6b, - 0x16, 0x64, 0xa1, 0x59, 0x45, 0xe5, 0xc6, 0x6f, 0x2d, 0xc0, 0x92, 0x84, 0x6e, 0x8a, 0x15, 0xe9, - 0x4d, 0xc7, 0x63, 0xdb, 0x4f, 0xe1, 0x5d, 0x99, 0x97, 0xf3, 0xae, 0xec, 0x1c, 0xef, 0x4a, 0x2a, - 0xac, 0xc4, 0xfa, 0x92, 0x0a, 0xab, 0xd8, 0x02, 0xd2, 0x21, 0x74, 0xf3, 0x65, 0x4d, 0x82, 0xfb, - 0x64, 0x26, 0x9d, 0xe3, 0xb4, 0x85, 0x14, 0x4e, 0xab, 0xf3, 0xc9, 0x85, 0x19, 0x3e, 0xf9, 0x16, - 0xd0, 0x5e, 0x2b, 0xb6, 0x5f, 0x24, 0xb5, 0x02, 0x61, 0xd2, 0x06, 0x7a, 0x0f, 0x1a, 0xb3, 0xac, - 0x89, 0x78, 0x60, 0x3d, 0x85, 0x31, 0x39, 0x63, 0x8e, 0x97, 0x8c, 0x86, 0x5c, 0x96, 0x8c, 0xc9, - 0x19, 0xf3, 0x5d, 0x2c, 0x51, 0xf8, 0x1d, 0x00, 0xea, 0x1b, 0x69, 0x1d, 0x90, 0xd6, 0xdf, 0x4d, - 0xee, 0x85, 0xbe, 0xea, 0x0f, 0xc5, 0xc7, 0xd4, 0xe7, 0x48, 0xfc, 0x65, 0xac, 0x89, 0x74, 0xff, - 0x1c, 0xea, 0xde, 0x84, 0xbb, 0x56, 0xcc, 0x22, 0x2a, 0xd8, 0xd4, 0x3b, 0x2f, 0x69, 0xaa, 0xab, - 0x70, 0xcd, 0x9a, 0xa8, 0x1b, 0x7d, 0xb2, 0x3d, 0x5a, 0x78, 0xae, 0xb5, 0x56, 0xfd, 0x12, 0xad, - 0xd5, 0xb1, 0x72, 0xf4, 0x6d, 0xfc, 0x83, 0x0c, 0x54, 0xb4, 0x61, 0xb3, 0x15, 0x58, 0xdc, 0x3c, - 0x38, 0x38, 0xec, 0x98, 0xed, 0x7e, 0xf7, 0x93, 0x8e, 0xb5, 0xb9, 0x7b, 0xd0, 0xeb, 0x34, 0x6f, - 0x08, 0xf0, 0xee, 0xc1, 0x66, 0x7b, 0xd7, 0xda, 0x3e, 0x30, 0x37, 0x15, 0x38, 0xc3, 0x56, 0x81, - 0x99, 0x9d, 0xbd, 0x83, 0x7e, 0x27, 0x01, 0xcf, 0xb2, 0x26, 0x54, 0x37, 0xcc, 0x4e, 0x7b, 0x73, - 0x47, 0x42, 0x72, 0x6c, 0x19, 0x9a, 0xdb, 0x47, 0xfb, 0x5b, 0xdd, 0xfd, 0x67, 0xd6, 0x66, 0x7b, - 0x7f, 0xb3, 0xb3, 0xdb, 0xd9, 0x6a, 0xe6, 0x59, 0x0d, 0xca, 0xed, 0x8d, 0xf6, 0xfe, 0xd6, 0xc1, - 0x7e, 0x67, 0xab, 0x59, 0x30, 0x7e, 0x05, 0xca, 0xf1, 0x44, 0x2b, 0x50, 0x3c, 0xda, 0x7f, 0xbe, - 0x7f, 0xf0, 0xe9, 0x7e, 0xf3, 0x06, 0x2b, 0x43, 0x01, 0xfb, 0x6f, 0x66, 0x18, 0xc0, 0x02, 0xf5, - 0xd9, 0xcc, 0xb2, 0x12, 0xe4, 0x37, 0x0e, 0xfa, 0x3b, 0xcd, 0x9c, 0xf1, 0xe7, 0x19, 0x58, 0xc1, - 0x29, 0x0f, 0x67, 0x99, 0xc0, 0x5d, 0xa8, 0x0c, 0x3c, 0x6f, 0x22, 0x14, 0xa4, 0x58, 0x10, 0xd0, - 0x41, 0xe2, 0x80, 0x13, 0xcf, 0x3d, 0xf1, 0xfc, 0x01, 0x97, 0x3c, 0x00, 0x10, 0xb4, 0x2d, 0x20, - 0x82, 0x06, 0x25, 0x11, 0x13, 0x06, 0xb1, 0x80, 0x0a, 0xc1, 0x08, 0x65, 0x15, 0x16, 0x8e, 0x7d, - 0x6e, 0x0f, 0xce, 0xe4, 0xe9, 0x97, 0x5f, 0xec, 0xeb, 0xb1, 0xea, 0x3e, 0x10, 0x34, 0x35, 0xe2, - 0x43, 0x3c, 0x02, 0x25, 0xb3, 0x21, 0xe1, 0x9b, 0x12, 0x2c, 0x2e, 0x11, 0xfb, 0xd8, 0x76, 0x87, - 0x9e, 0xcb, 0x87, 0x52, 0x43, 0x88, 0x01, 0xc6, 0x21, 0xac, 0xce, 0xce, 0x4f, 0xf2, 0x8b, 0x0f, - 0x34, 0x7e, 0x41, 0x02, 0xfb, 0xfa, 0xf5, 0xa4, 0xa0, 0xf1, 0x8e, 0x7f, 0x9c, 0x87, 0xbc, 0x10, - 0xe0, 0xae, 0x95, 0xf5, 0x74, 0x89, 0x3c, 0x37, 0xe7, 0xb5, 0x41, 0x0b, 0x01, 0xdd, 0xec, 0x64, - 0x86, 0x2a, 0x23, 0x04, 0x6f, 0xf4, 0xa8, 0xd8, 0xe7, 0x83, 0x73, 0x69, 0x87, 0xa2, 0x62, 0x93, - 0x0f, 0xce, 0x51, 0x15, 0xb2, 0x43, 0xaa, 0x4b, 0xe7, 0xbd, 0x18, 0xd8, 0x21, 0xd6, 0x94, 0x45, - 0x58, 0xaf, 0x18, 0x15, 0x61, 0xad, 0x16, 0x14, 0x1d, 0xf7, 0xd8, 0x9b, 0xba, 0x43, 0x3c, 0xde, - 0x25, 0x53, 0x7d, 0xa2, 0x93, 0x08, 0x39, 0x91, 0xb8, 0x3f, 0xe8, 0x34, 0x97, 0x04, 0xa0, 0x2f, - 0x6e, 0x90, 0xf7, 0xa1, 0x1c, 0x5c, 0xb9, 0x03, 0xfd, 0x0c, 0x2f, 0xcb, 0xf5, 0x11, 0xb3, 0x7f, - 0xd8, 0xbb, 0x72, 0x07, 0x78, 0x62, 0x4b, 0x81, 0xfc, 0x8b, 0x3d, 0x85, 0x52, 0x64, 0xae, 0x25, - 0x0e, 0x7c, 0x53, 0xaf, 0xa1, 0x6c, 0xb4, 0xa4, 0x15, 0x47, 0xa8, 0xec, 0x11, 0x2c, 0xa0, 0x4d, - 0x35, 0x68, 0x55, 0xb1, 0x92, 0x12, 0xd3, 0xc5, 0x30, 0xd0, 0x3f, 0xc3, 0x87, 0x68, 0x5f, 0x35, - 0x25, 0xda, 0xfa, 0x73, 0xa8, 0x25, 0xda, 0xd2, 0x75, 0xdf, 0x1a, 0xe9, 0xbe, 0xef, 0xe8, 0xba, - 0x6f, 0x7c, 0x13, 0xc8, 0x6a, 0xba, 0x2e, 0xfc, 0xab, 0x50, 0x52, 0x53, 0x11, 0xe7, 0x4f, 0x9e, - 0x1d, 0xab, 0xf7, 0xd9, 0xfe, 0x66, 0xf3, 0x06, 0x6b, 0x40, 0xa5, 0xbd, 0x89, 0x47, 0x1a, 0x01, - 0x19, 0x81, 0x72, 0xd8, 0xee, 0xf5, 0x22, 0x48, 0xd6, 0xd8, 0x86, 0xe6, 0xec, 0x48, 0x05, 0x4d, - 0x86, 0x0a, 0x26, 0x2d, 0xce, 0x31, 0x40, 0x68, 0x36, 0x64, 0x44, 0x26, 0xf1, 0x99, 0x3e, 0x8c, - 0xa7, 0xd0, 0x14, 0xf7, 0x9a, 0x58, 0xaa, 0x40, 0xb3, 0xdc, 0x8e, 0x84, 0x48, 0xa6, 0x5b, 0x9d, - 0x4b, 0x66, 0x85, 0x60, 0xd8, 0x95, 0xf1, 0x01, 0x2c, 0x6a, 0xd5, 0x62, 0x4d, 0x54, 0xdc, 0x95, - 0xb3, 0x9a, 0x28, 0xea, 0x1d, 0x54, 0x62, 0xac, 0xc1, 0x8a, 0xf8, 0xec, 0x9c, 0x73, 0x37, 0xec, - 0x4d, 0x8f, 0xc9, 0x55, 0xe8, 0x78, 0xae, 0xd0, 0x47, 0xca, 0x51, 0xc9, 0xf5, 0x44, 0xfe, 0x50, - 0x2a, 0xad, 0x59, 0x24, 0x8d, 0x75, 0xad, 0x07, 0xac, 0xf8, 0x10, 0xff, 0x4d, 0x28, 0xaf, 0xe5, - 0x08, 0x24, 0x96, 0xf5, 0xb0, 0xd3, 0x31, 0xad, 0x83, 0xfd, 0xdd, 0xee, 0xbe, 0x60, 0x94, 0x62, - 0x59, 0x11, 0xb0, 0xbd, 0x8d, 0x90, 0x8c, 0xd1, 0x84, 0xfa, 0x33, 0x1e, 0x76, 0xdd, 0x13, 0x4f, - 0xb9, 0xc5, 0x7e, 0x56, 0x80, 0x46, 0x04, 0x8a, 0x95, 0xdf, 0x73, 0xee, 0x07, 0x8e, 0xe7, 0xa2, - 0x1c, 0x5b, 0x36, 0xd5, 0xa7, 0xb8, 0xdd, 0x9c, 0x21, 0x77, 0x43, 0x27, 0xbc, 0xb2, 0x12, 0x96, - 0xb2, 0xba, 0x02, 0xcb, 0x5b, 0x74, 0x19, 0x0a, 0xf6, 0xc8, 0xb1, 0x95, 0x87, 0x95, 0x3e, 0x04, - 0x74, 0xe0, 0x8d, 0x3c, 0x1f, 0x45, 0xd6, 0xb2, 0x49, 0x1f, 0xec, 0x31, 0x2c, 0x0b, 0xd1, 0x59, - 0x37, 0x5f, 0x22, 0xff, 0x20, 0xa3, 0x1d, 0x73, 0xa7, 0xe3, 0xc3, 0xd8, 0x84, 0x29, 0x4a, 0xc4, - 0xdd, 0x29, 0x6a, 0x48, 0x61, 0x29, 0xaa, 0x40, 0x5a, 0xd8, 0xa2, 0x3b, 0x1d, 0xb7, 0xb1, 0x24, - 0xc2, 0x7f, 0x02, 0x2b, 0x02, 0x3f, 0x12, 0xaf, 0xa2, 0x1a, 0x0d, 0xac, 0x21, 0x1a, 0xeb, 0xca, - 0xb2, 0xa8, 0xce, 0x2d, 0x28, 0xd3, 0xa8, 0xc4, 0x8e, 0x17, 0x48, 0xfa, 0xc6, 0xa1, 0x70, 0x3f, - 0x98, 0x73, 0x86, 0x2e, 0x90, 0x20, 0x30, 0xe3, 0x0c, 0xd5, 0xdc, 0xa9, 0xa5, 0x59, 0x77, 0xea, - 0x13, 0x58, 0x39, 0x16, 0x24, 0x78, 0xc6, 0xed, 0x21, 0xf7, 0xad, 0x98, 0xb0, 0x49, 0xcb, 0x58, - 0x12, 0x85, 0x3b, 0x58, 0x16, 0x9d, 0x03, 0x21, 0xe7, 0x08, 0xb6, 0xc0, 0x87, 0x56, 0xe8, 0x59, - 0x28, 0xfe, 0x20, 0x83, 0x29, 0x99, 0x35, 0x02, 0xf7, 0xbd, 0x4d, 0x01, 0x4c, 0xe2, 0x9d, 0xfa, - 0xf6, 0xe4, 0x4c, 0xea, 0x01, 0x11, 0xde, 0x33, 0x01, 0x64, 0x6f, 0x40, 0x51, 0x90, 0xbc, 0xcb, - 0xc9, 0x67, 0x45, 0x92, 0xb6, 0x02, 0xb1, 0x77, 0x60, 0x01, 0xfb, 0x08, 0x5a, 0x4d, 0xa4, 0xf7, - 0x6a, 0xcc, 0xc8, 0x1d, 0xd7, 0x94, 0x65, 0x42, 0x98, 0x9c, 0xfa, 0x0e, 0x71, 0x99, 0xb2, 0x89, - 0x7f, 0xb3, 0xef, 0x6b, 0x2c, 0x6b, 0x09, 0xeb, 0x2a, 0x79, 0x60, 0x86, 0xd2, 0xae, 0xe3, 0x5e, - 0x5f, 0x29, 0x33, 0xfa, 0x41, 0xbe, 0x54, 0x69, 0x56, 0x8d, 0xef, 0x40, 0x81, 0x56, 0x47, 0x10, - 0x21, 0xae, 0x5d, 0x46, 0x12, 0x21, 0x42, 0x5b, 0x50, 0x74, 0x79, 0x78, 0xe1, 0xf9, 0x2f, 0x94, - 0x2d, 0x59, 0x7e, 0x1a, 0x3f, 0x46, 0x23, 0x48, 0xe4, 0x28, 0x27, 0x7d, 0x4e, 0x90, 0x07, 0x6d, - 0x6f, 0x70, 0x66, 0x4b, 0xbb, 0x4c, 0x09, 0x01, 0xbd, 0x33, 0x7b, 0x8e, 0x3c, 0xb2, 0xf3, 0xbe, - 0xf2, 0x77, 0xa0, 0xae, 0x5c, 0xf3, 0x81, 0x35, 0xe2, 0x27, 0xa1, 0x24, 0xf7, 0xaa, 0xf4, 0xcb, - 0x07, 0xbb, 0xfc, 0x24, 0x34, 0xf6, 0x60, 0x51, 0x12, 0xe4, 0xc1, 0x84, 0xab, 0xae, 0xbf, 0x9b, - 0x26, 0x4f, 0x57, 0x9e, 0x2c, 0x25, 0x2f, 0x5a, 0x7a, 0x72, 0x90, 0x10, 0xb2, 0x8d, 0x8f, 0x81, - 0xe9, 0xd7, 0xb0, 0x6c, 0x4f, 0x4a, 0xb5, 0xca, 0x04, 0xaf, 0x3c, 0x59, 0x91, 0xec, 0xec, 0x0c, - 0xc5, 0xea, 0x04, 0xd3, 0xc1, 0x40, 0x3d, 0x99, 0x28, 0x99, 0xea, 0xd3, 0xf8, 0x93, 0x0c, 0x2c, - 0x61, 0x63, 0x4a, 0x1f, 0x90, 0x4c, 0xf6, 0xe7, 0x1e, 0xa4, 0xd8, 0x1f, 0x5d, 0xf6, 0xa1, 0x8f, - 0x2f, 0x6f, 0xf4, 0xcc, 0xcf, 0x19, 0x3d, 0xbf, 0x0e, 0xcd, 0x21, 0x1f, 0x39, 0xf8, 0x7a, 0x46, - 0x89, 0x12, 0xa4, 0x01, 0x34, 0x14, 0x5c, 0x29, 0x71, 0xff, 0x3c, 0x03, 0x8b, 0x24, 0xa9, 0xa0, - 0x3a, 0x2c, 0x17, 0xea, 0x23, 0xa5, 0xff, 0x49, 0x56, 0x25, 0xe7, 0x14, 0xdf, 0xe0, 0x08, 0x25, - 0xe4, 0x9d, 0x1b, 0x52, 0x2f, 0x94, 0x50, 0xf6, 0x21, 0xea, 0x30, 0xae, 0x85, 0xc0, 0x94, 0xd7, - 0x38, 0xc9, 0x4d, 0xd9, 0xb9, 0x81, 0x0a, 0x8e, 0x8b, 0xa0, 0x8d, 0x92, 0x50, 0x48, 0x05, 0xd8, - 0xd8, 0x86, 0x5a, 0xa2, 0x9b, 0x84, 0x65, 0xb6, 0x4a, 0x96, 0xd9, 0x39, 0xef, 0x47, 0x76, 0xde, - 0xfb, 0xf1, 0xf7, 0xf2, 0xc0, 0x04, 0x49, 0xcd, 0xec, 0xda, 0x8c, 0xeb, 0x30, 0x3b, 0xe7, 0x3a, - 0x7c, 0x0c, 0x4c, 0x43, 0x50, 0x1e, 0xcd, 0x5c, 0xe4, 0xd1, 0x6c, 0xc6, 0xb8, 0xd2, 0xa1, 0xf9, - 0x18, 0x96, 0xa5, 0x40, 0x1b, 0xf9, 0x0a, 0xd1, 0xe4, 0x46, 0xfb, 0xc3, 0x48, 0xb2, 0x55, 0x3e, - 0x43, 0x34, 0xbf, 0x29, 0xb7, 0x61, 0x60, 0x87, 0xd2, 0x52, 0x85, 0x6e, 0xc3, 0x9e, 0x3d, 0x67, - 0xfa, 0x5e, 0x78, 0x25, 0x15, 0x14, 0xe7, 0xa8, 0x40, 0x33, 0x9c, 0x94, 0x92, 0x86, 0x13, 0x03, - 0x6a, 0xca, 0x39, 0x48, 0x6f, 0x22, 0x48, 0x7a, 0xab, 0x48, 0x0f, 0x21, 0xbe, 0x8b, 0xb8, 0x0f, - 0x4d, 0x65, 0xdd, 0x88, 0x4c, 0x33, 0xe4, 0xef, 0x97, 0xc6, 0xb1, 0x4d, 0x65, 0xa0, 0x49, 0x18, - 0xc2, 0x2b, 0x33, 0x86, 0xf0, 0xf7, 0x60, 0x31, 0x10, 0x44, 0x64, 0x4d, 0x5d, 0xf9, 0x38, 0x87, - 0x0f, 0x51, 0x75, 0x2a, 0x99, 0x4d, 0x2c, 0x38, 0x8a, 0xe1, 0xf3, 0x66, 0x87, 0xda, 0xbc, 0xd9, - 0x81, 0x3d, 0x8d, 0xfd, 0x68, 0xc1, 0x99, 0x33, 0xc6, 0x8b, 0x3b, 0x7e, 0xc8, 0x22, 0x17, 0xb8, - 0x77, 0xe6, 0x8c, 0x4d, 0xe5, 0xb4, 0x15, 0x1f, 0xc6, 0x7f, 0xcd, 0x40, 0x53, 0xd0, 0x41, 0x82, - 0xce, 0x7f, 0x05, 0xf0, 0x44, 0xbe, 0x26, 0x99, 0x57, 0x04, 0xae, 0xa2, 0xf2, 0xef, 0x00, 0x92, - 0xad, 0x25, 0xf4, 0x44, 0x49, 0xe4, 0xad, 0x24, 0x91, 0xc7, 0x8c, 0x6c, 0xe7, 0x06, 0x29, 0x00, - 0x02, 0x92, 0xe6, 0xbf, 0xcc, 0xa7, 0xf8, 0x2f, 0xb5, 0xa3, 0xb0, 0x03, 0xf0, 0x9c, 0x5f, 0xed, - 0x7a, 0x03, 0xd4, 0xd0, 0x6e, 0x03, 0x08, 0x82, 0x3c, 0xb1, 0xc7, 0x8e, 0xb4, 0xae, 0x14, 0xcc, - 0xf2, 0x0b, 0x7e, 0xb5, 0x8d, 0x00, 0xb1, 0x1b, 0xa2, 0x38, 0x3e, 0x0f, 0x05, 0xb3, 0xf4, 0x82, - 0x5f, 0xd1, 0x61, 0xb0, 0xa0, 0xf6, 0x9c, 0x5f, 0x6d, 0x71, 0x12, 0xd7, 0x3c, 0x5f, 0x50, 0x82, - 0x6f, 0x5f, 0x08, 0xf9, 0x2c, 0xe1, 0x7b, 0xac, 0xf8, 0xf6, 0xc5, 0x73, 0x7e, 0xa5, 0xfc, 0xa0, - 0x45, 0x51, 0x3e, 0xf2, 0x06, 0xf2, 0x06, 0x52, 0xaf, 0x28, 0xe2, 0x41, 0x99, 0x0b, 0x2f, 0xf0, - 0x6f, 0xe3, 0x8f, 0x33, 0x50, 0x13, 0xe3, 0x47, 0x06, 0x27, 0xd6, 0x5d, 0x3d, 0xc6, 0xc9, 0xc4, - 0x8f, 0x71, 0x9e, 0x48, 0xfe, 0x40, 0xdc, 0x32, 0x7b, 0x3d, 0xb7, 0xc4, 0x05, 0x26, 0x56, 0xf9, - 0x3e, 0x94, 0xe9, 0x6c, 0x89, 0xc3, 0x9a, 0x4b, 0xec, 0x52, 0x62, 0x42, 0x66, 0x09, 0xd1, 0x9e, - 0x93, 0xef, 0x5f, 0x33, 0xb0, 0xd1, 0x12, 0x97, 0xfd, 0xc8, 0xac, 0x96, 0xb2, 0x0d, 0x85, 0x34, - 0x37, 0xf2, 0x11, 0x54, 0x34, 0x9a, 0x42, 0x6b, 0x5c, 0x34, 0x78, 0x22, 0xc0, 0x24, 0xd1, 0x24, - 0x66, 0xbf, 0x73, 0xc3, 0xac, 0x0d, 0x74, 0xc0, 0xc6, 0x02, 0xe4, 0x45, 0x25, 0xe3, 0x23, 0x58, - 0xd4, 0x9a, 0x25, 0x6d, 0x34, 0x6d, 0x4c, 0x99, 0xb4, 0x31, 0xfd, 0x8b, 0x0c, 0x2c, 0xcb, 0xda, - 0xf8, 0x70, 0xcb, 0x11, 0xd7, 0xf5, 0x5e, 0x70, 0xca, 0x7e, 0x05, 0x6a, 0xa2, 0x75, 0xcb, 0xe7, - 0xa7, 0x4e, 0x10, 0x72, 0xe5, 0xb9, 0x48, 0x39, 0x1c, 0x82, 0x6b, 0x0b, 0x54, 0x53, 0x62, 0xb2, - 0x8f, 0xa0, 0x82, 0x55, 0x49, 0x5f, 0x96, 0xdb, 0xd2, 0x9a, 0xaf, 0x48, 0x43, 0xdd, 0xb9, 0x61, - 0x42, 0x10, 0x7d, 0x6d, 0x94, 0xa1, 0x18, 0xfa, 0xce, 0xe9, 0x29, 0xf7, 0x8d, 0xd5, 0x68, 0x68, - 0xe2, 0xa4, 0xf1, 0x5e, 0xc8, 0x27, 0x42, 0x08, 0x32, 0xfe, 0x7b, 0x06, 0x2a, 0xf2, 0xec, 0xfc, - 0xdc, 0xee, 0x8a, 0x75, 0xed, 0xe5, 0x21, 0xa9, 0xc6, 0xf1, 0x43, 0xc3, 0x7b, 0xd0, 0x18, 0x0b, - 0x81, 0x48, 0x08, 0xec, 0x09, 0x5f, 0x45, 0x5d, 0x81, 0xa5, 0x3c, 0xf2, 0x10, 0x96, 0x50, 0x3c, - 0x09, 0xac, 0xd0, 0x19, 0x59, 0xaa, 0x50, 0xbe, 0xf2, 0x5b, 0xa4, 0xa2, 0xbe, 0x33, 0xda, 0x93, - 0x05, 0xe2, 0x96, 0x0e, 0x42, 0xfb, 0x94, 0x4b, 0xd1, 0x97, 0x3e, 0x8c, 0x16, 0xac, 0xce, 0xc8, - 0xea, 0x4a, 0xcf, 0xf8, 0x87, 0x35, 0x58, 0x9b, 0x2b, 0x92, 0xfa, 0x46, 0x64, 0xa3, 0x1f, 0x39, - 0xe3, 0x63, 0x2f, 0x32, 0x85, 0x65, 0x34, 0x1b, 0xfd, 0xae, 0x28, 0x51, 0xa6, 0x30, 0x0e, 0x2b, - 0x8a, 0x20, 0xd0, 0x96, 0x15, 0x89, 0xf3, 0x59, 0x14, 0x36, 0xdf, 0x4f, 0x32, 0xaa, 0xd9, 0xee, - 0x14, 0x5c, 0xbf, 0xfe, 0x96, 0x26, 0x73, 0xb0, 0x80, 0x9d, 0x40, 0x2b, 0xa2, 0x3b, 0x29, 0x1f, - 0x69, 0xba, 0x89, 0xe8, 0xe9, 0x1b, 0xaf, 0xe8, 0x29, 0x61, 0x24, 0x31, 0x57, 0x15, 0xb9, 0x52, - 0x63, 0x51, 0x3f, 0xe7, 0xf0, 0xa6, 0xea, 0x07, 0x65, 0x9d, 0xf9, 0xde, 0xf2, 0xaf, 0x35, 0x2f, - 0x34, 0xfe, 0x24, 0xbb, 0xbc, 0x25, 0x1b, 0x8e, 0x8a, 0xf4, 0x7e, 0xcf, 0x60, 0xf5, 0xc2, 0x76, - 0x42, 0x35, 0x3f, 0x4d, 0x2d, 0x2a, 0x60, 0x7f, 0x4f, 0x5e, 0xd1, 0xdf, 0xa7, 0x54, 0x39, 0x21, - 0xfd, 0x2d, 0x5f, 0xcc, 0x03, 0x83, 0xf5, 0xff, 0x9c, 0x85, 0x7a, 0xb2, 0x15, 0x71, 0xa8, 0x25, - 0x1f, 0x52, 0xf2, 0x84, 0x94, 0xc7, 0xa5, 0x89, 0x76, 0x9f, 0xe4, 0x88, 0x79, 0xe3, 0x71, 0x36, - 0xc5, 0x78, 0xac, 0xdb, 0x6c, 0x73, 0xaf, 0xf2, 0x6d, 0xe5, 0x5f, 0xcb, 0xb7, 0x55, 0x48, 0xf3, - 0x6d, 0x5d, 0xef, 0x10, 0x59, 0xf8, 0xb9, 0x1c, 0x22, 0xc5, 0xeb, 0x1d, 0x22, 0xeb, 0x7f, 0x95, - 0x01, 0x36, 0x4f, 0xa9, 0xec, 0x19, 0xd9, 0xc9, 0x5d, 0x3e, 0x92, 0x5c, 0xec, 0x9b, 0xaf, 0x47, - 0xed, 0x6a, 0x83, 0x54, 0x6d, 0xf6, 0x08, 0x96, 0xf4, 0x77, 0xc1, 0xba, 0xaa, 0x52, 0x33, 0x99, - 0x5e, 0x14, 0x2b, 0xb4, 0x9a, 0x63, 0x2f, 0xff, 0x4a, 0xc7, 0x5e, 0xe1, 0x95, 0x8e, 0xbd, 0x85, - 0xa4, 0x63, 0x6f, 0xfd, 0xef, 0x64, 0x60, 0x29, 0x85, 0xa8, 0xbe, 0xba, 0x39, 0x0b, 0x5a, 0x48, - 0xb0, 0x98, 0xac, 0xa4, 0x05, 0x8d, 0xbb, 0xac, 0xff, 0x04, 0x6a, 0x89, 0x43, 0xf4, 0xd5, 0x75, - 0x3f, 0xab, 0x68, 0x11, 0x29, 0xeb, 0x8a, 0xd6, 0xfa, 0x5f, 0x66, 0x81, 0xcd, 0x9f, 0xe3, 0x5f, - 0xe6, 0x10, 0xe6, 0x17, 0x29, 0x37, 0xbf, 0x48, 0xff, 0xff, 0xee, 0x95, 0xf7, 0x60, 0x51, 0xc6, - 0x32, 0x68, 0x4e, 0x11, 0x22, 0x94, 0x66, 0x54, 0xa0, 0x46, 0xf1, 0x9d, 0x59, 0x9f, 0x6a, 0x29, - 0xf1, 0x7c, 0x5b, 0xbb, 0x58, 0x93, 0xae, 0x55, 0x63, 0x1d, 0x5a, 0x72, 0x69, 0xe6, 0x4d, 0x75, - 0xbf, 0x93, 0x8f, 0xb4, 0x64, 0x2c, 0x94, 0x42, 0xf1, 0xb7, 0xa0, 0xaa, 0x5f, 0x36, 0x72, 0x1f, - 0x66, 0xbc, 0x61, 0x42, 0x1c, 0xf6, 0xb4, 0xd3, 0xba, 0x09, 0xe4, 0xe3, 0x18, 0x46, 0xd5, 0x48, - 0x82, 0x78, 0x89, 0x51, 0x1c, 0x85, 0xa3, 0xc4, 0xe6, 0xff, 0x35, 0xa8, 0x27, 0xed, 0x56, 0x52, - 0xd4, 0x4b, 0x93, 0x0e, 0x45, 0xed, 0x84, 0x21, 0x8b, 0x7d, 0x1f, 0x9a, 0xb3, 0x76, 0x2f, 0xf9, - 0xb6, 0xf4, 0x9a, 0xfa, 0x0d, 0x27, 0x69, 0x0a, 0x63, 0x3b, 0xb0, 0x9c, 0x76, 0xdd, 0xe2, 0xae, - 0x5c, 0xaf, 0x16, 0xb0, 0xf9, 0x2b, 0x95, 0x7d, 0x57, 0x9a, 0x37, 0x0b, 0x69, 0x4e, 0x22, 0x6d, - 0xb1, 0x1f, 0xd2, 0x7f, 0x9a, 0xa1, 0xf3, 0x1c, 0x20, 0x86, 0xb1, 0x26, 0x54, 0x0f, 0x0e, 0x3b, - 0xfb, 0xd6, 0xe6, 0x4e, 0x7b, 0x7f, 0xbf, 0xb3, 0xdb, 0xbc, 0xc1, 0x18, 0xd4, 0xd1, 0xbb, 0xb3, - 0x15, 0xc1, 0x32, 0x02, 0x26, 0xcd, 0xcc, 0x0a, 0x96, 0x65, 0xcb, 0xd0, 0xec, 0xee, 0xcf, 0x40, - 0x73, 0xac, 0x05, 0xcb, 0x87, 0x1d, 0x72, 0x08, 0x25, 0xda, 0xcd, 0x0b, 0x11, 0x4e, 0x4e, 0x57, - 0x88, 0x70, 0x14, 0x09, 0x23, 0xa9, 0x4f, 0x49, 0x36, 0xbf, 0x9b, 0x81, 0x95, 0x99, 0x82, 0xf8, - 0x7d, 0x33, 0xc9, 0x35, 0x49, 0x89, 0xa6, 0x8a, 0x40, 0x45, 0xc3, 0xef, 0xc1, 0x62, 0xa4, 0xea, - 0xcd, 0xf0, 0xa5, 0x66, 0x54, 0xa0, 0x90, 0x1f, 0xc1, 0x92, 0xa6, 0x31, 0xce, 0x9c, 0x50, 0xa6, - 0x15, 0xc9, 0x0a, 0xc6, 0x5a, 0xf4, 0x8e, 0x74, 0x66, 0xd4, 0x43, 0x0a, 0xaf, 0xd1, 0x0b, 0x62, - 0xeb, 0x6f, 0x72, 0xbc, 0xea, 0x53, 0xa8, 0xf2, 0x09, 0x42, 0x48, 0x8e, 0x56, 0xdf, 0x70, 0xd5, - 0xfd, 0xef, 0x2f, 0x00, 0xfb, 0x78, 0xca, 0xfd, 0x2b, 0x7c, 0xbf, 0x1c, 0xbc, 0xea, 0x41, 0x8f, - 0x52, 0x8b, 0xb2, 0xaf, 0x15, 0xa3, 0x90, 0x16, 0x23, 0x90, 0x7f, 0x75, 0x8c, 0x40, 0xe1, 0x55, - 0x31, 0x02, 0x6f, 0x43, 0xcd, 0x39, 0x75, 0x3d, 0xc1, 0x80, 0x84, 0x6c, 0x12, 0xb4, 0x16, 0xee, - 0xe6, 0xee, 0x57, 0xcd, 0xaa, 0x04, 0x0a, 0xc9, 0x24, 0x60, 0x1f, 0xc5, 0x48, 0x7c, 0x78, 0x8a, - 0xf1, 0x2c, 0x3a, 0xeb, 0xe9, 0x0c, 0x4f, 0xb9, 0xd4, 0x02, 0xd1, 0x2e, 0xa2, 0x2a, 0x0b, 0x78, - 0xc0, 0xde, 0x81, 0x7a, 0xe0, 0x4d, 0x85, 0xa8, 0xa7, 0x96, 0x81, 0xec, 0xc3, 0x55, 0x82, 0x1e, - 0x2a, 0x67, 0xc0, 0xd2, 0x34, 0xe0, 0xd6, 0xd8, 0x09, 0x02, 0x71, 0x41, 0x0f, 0x3c, 0x37, 0xf4, - 0xbd, 0x91, 0x34, 0xf9, 0x2e, 0x4e, 0x03, 0xbe, 0x47, 0x25, 0x9b, 0x54, 0xc0, 0xbe, 0x1d, 0x0f, - 0x69, 0x62, 0x3b, 0x7e, 0xd0, 0x02, 0x1c, 0x92, 0x9a, 0x29, 0x4a, 0x54, 0xb6, 0xe3, 0x47, 0x63, - 0x11, 0x1f, 0xc1, 0x4c, 0xec, 0x42, 0x65, 0x36, 0x76, 0xe1, 0x47, 0xe9, 0xb1, 0x0b, 0x35, 0x6c, - 0xfa, 0xb1, 0x6c, 0x7a, 0x7e, 0x8b, 0xbf, 0x54, 0x08, 0xc3, 0x7c, 0x48, 0x46, 0xfd, 0xcb, 0x84, - 0x64, 0x34, 0xd2, 0x42, 0x32, 0xde, 0x87, 0x0a, 0x3e, 0x96, 0xb7, 0xce, 0x1c, 0x37, 0x54, 0x26, - 0xec, 0xa6, 0xfe, 0x9a, 0x7e, 0x47, 0x28, 0xd3, 0xe0, 0xab, 0x3f, 0x83, 0xf9, 0xe8, 0x88, 0xc5, - 0x5f, 0x62, 0x74, 0x84, 0x7c, 0xd4, 0xff, 0x10, 0x4a, 0x6a, 0x9f, 0x18, 0x83, 0xfc, 0x89, 0xef, - 0x8d, 0x95, 0x69, 0x4f, 0xfc, 0xcd, 0xea, 0x90, 0x0d, 0x3d, 0x59, 0x39, 0x1b, 0x7a, 0xc6, 0x6f, - 0x40, 0x45, 0x23, 0x35, 0xf6, 0x16, 0x19, 0x11, 0x84, 0xb4, 0x2c, 0xb5, 0x64, 0x5a, 0xc5, 0xb2, - 0x84, 0x76, 0x87, 0x82, 0xdf, 0x0c, 0x1d, 0x9f, 0x63, 0x1c, 0x93, 0xe5, 0xf3, 0x73, 0xee, 0x07, - 0xca, 0xd4, 0xda, 0x8c, 0x0a, 0x4c, 0x82, 0x1b, 0x7f, 0x13, 0x96, 0x12, 0x7b, 0x2b, 0x59, 0xc4, - 0x3b, 0xb0, 0x80, 0xeb, 0xa6, 0x5c, 0x61, 0xc9, 0x28, 0x05, 0x59, 0x86, 0x01, 0xaa, 0x64, 0x25, - 0xb6, 0x26, 0xbe, 0x77, 0x8c, 0x9d, 0x64, 0xcc, 0x8a, 0x84, 0x1d, 0xfa, 0xde, 0xb1, 0xf1, 0x67, - 0x39, 0xc8, 0xed, 0x78, 0x13, 0xfd, 0xf5, 0x47, 0x66, 0xee, 0xf5, 0x87, 0x54, 0x01, 0xac, 0x48, - 0xc4, 0x97, 0x52, 0x1b, 0xda, 0x47, 0x95, 0x98, 0x7f, 0x1f, 0xea, 0x82, 0x4f, 0x84, 0x9e, 0xd0, - 0xa1, 0x2e, 0x6c, 0x9f, 0x62, 0x16, 0x72, 0x74, 0xf8, 0xec, 0x71, 0xd8, 0xf7, 0xb6, 0x09, 0xce, - 0x96, 0x21, 0x17, 0x09, 0xb0, 0x58, 0x2c, 0x3e, 0x85, 0x72, 0x8d, 0xaf, 0xf7, 0xae, 0xa4, 0xaf, - 0x47, 0x7e, 0xb1, 0x6f, 0xc2, 0x52, 0xb2, 0x5d, 0x62, 0x45, 0x52, 0x22, 0xd1, 0x1b, 0x46, 0x9e, - 0x74, 0x13, 0x04, 0x1f, 0x21, 0x1c, 0xe9, 0x32, 0x3e, 0xe1, 0x1c, 0x8b, 0x34, 0xa6, 0x57, 0x4a, - 0x30, 0xbd, 0x3b, 0x50, 0x09, 0x47, 0xe7, 0xd6, 0xc4, 0xbe, 0x1a, 0x79, 0xf6, 0x50, 0x9e, 0x6f, - 0x08, 0x47, 0xe7, 0x87, 0x04, 0x61, 0x8f, 0x00, 0xc6, 0x93, 0x89, 0x3c, 0x7b, 0x68, 0x6e, 0x8c, - 0x49, 0x79, 0xef, 0xf0, 0x90, 0x48, 0xce, 0x2c, 0x8f, 0x27, 0x13, 0xfa, 0x93, 0x6d, 0x41, 0x3d, - 0x35, 0xd6, 0xe8, 0xb6, 0x7a, 0x6c, 0xe6, 0x4d, 0x1e, 0xa6, 0x1c, 0xce, 0xda, 0x40, 0x87, 0xad, - 0x7f, 0x1f, 0xd8, 0x2f, 0x18, 0xf1, 0xd3, 0x87, 0x72, 0x34, 0x3e, 0x3d, 0x60, 0x06, 0x9f, 0x8f, - 0x56, 0x12, 0x01, 0x33, 0xed, 0xe1, 0xd0, 0x17, 0x7c, 0x91, 0x2e, 0xcc, 0x88, 0xe5, 0x83, 0x76, - 0x63, 0xb6, 0x89, 0xef, 0x1b, 0x7f, 0x91, 0x81, 0x02, 0x45, 0xef, 0xbc, 0x0b, 0x0d, 0xc2, 0x8f, - 0x5e, 0xd2, 0x48, 0x0f, 0x11, 0xdd, 0xbb, 0x7d, 0xf9, 0x88, 0x46, 0x1c, 0x0b, 0x2d, 0xf2, 0x30, - 0x1b, 0xed, 0xbc, 0x16, 0x7d, 0x78, 0x07, 0xca, 0x51, 0xd7, 0x1a, 0xe9, 0x94, 0x54, 0xcf, 0xec, - 0x4d, 0xc8, 0x9f, 0x79, 0x13, 0xa5, 0x8b, 0x43, 0xbc, 0x92, 0x26, 0xc2, 0xe3, 0xb1, 0x88, 0x3e, - 0x68, 0xf0, 0x52, 0x87, 0x8c, 0x3a, 0x41, 0x32, 0x98, 0x9f, 0xe3, 0x42, 0xca, 0x1c, 0x8f, 0xa0, - 0x21, 0xf8, 0x80, 0xe6, 0xa9, 0xbd, 0xfe, 0xd2, 0xfc, 0xba, 0x90, 0xf0, 0x06, 0xa3, 0xe9, 0x90, - 0xeb, 0x96, 0x10, 0x7c, 0xd6, 0x21, 0xe1, 0x4a, 0x3d, 0x30, 0x7e, 0x3f, 0x43, 0xfc, 0x45, 0xb4, - 0xcb, 0xee, 0x43, 0x5e, 0xdc, 0x6f, 0x33, 0x96, 0xba, 0xe8, 0x1d, 0xaf, 0xc0, 0x33, 0x11, 0x03, - 0xc3, 0x75, 0xa7, 0xe3, 0x64, 0xeb, 0x35, 0xb3, 0xe2, 0x4e, 0xc7, 0x91, 0x31, 0xe1, 0x6b, 0x6a, - 0x5a, 0x33, 0x8a, 0x38, 0xcd, 0x3e, 0x3a, 0xa6, 0x0f, 0xb5, 0xf7, 0x21, 0xf9, 0xc4, 0x8d, 0xa9, - 0xa4, 0xc0, 0xe1, 0x29, 0xd7, 0xde, 0x85, 0xfc, 0x61, 0x16, 0x6a, 0x89, 0x11, 0xe1, 0x03, 0x19, - 0x71, 0x01, 0x90, 0x15, 0x58, 0xee, 0x37, 0x08, 0x90, 0x14, 0xd4, 0xb5, 0x75, 0xca, 0x26, 0xd6, - 0x29, 0xf2, 0x49, 0xe7, 0x74, 0x9f, 0xf4, 0x63, 0x28, 0xc7, 0x11, 0xa7, 0xc9, 0x21, 0x89, 0xfe, - 0xd4, 0x6b, 0xe6, 0x18, 0x29, 0xf6, 0x62, 0x17, 0x74, 0x2f, 0xf6, 0xf7, 0x34, 0xa7, 0xe7, 0x02, - 0x36, 0x63, 0xa4, 0xad, 0xe8, 0x2f, 0xc5, 0xe5, 0x69, 0x7c, 0x04, 0x15, 0x6d, 0xf0, 0xba, 0x73, - 0x33, 0x93, 0x70, 0x6e, 0x46, 0x71, 0x07, 0xd9, 0x38, 0xee, 0xc0, 0xf8, 0xad, 0x2c, 0xd4, 0xc4, - 0xf9, 0x72, 0xdc, 0xd3, 0x43, 0x6f, 0xe4, 0x0c, 0xd0, 0x2a, 0x1c, 0x9d, 0x30, 0x29, 0x68, 0xa9, - 0x73, 0x26, 0x8f, 0x18, 0xc9, 0x59, 0x7a, 0x78, 0x15, 0x31, 0xe9, 0x28, 0xbc, 0xca, 0x80, 0x9a, - 0x60, 0x8c, 0xc7, 0x76, 0xc0, 0xb5, 0x78, 0x58, 0xb3, 0x72, 0xc2, 0xf9, 0x86, 0x1d, 0x10, 0x87, - 0xfc, 0x26, 0x2c, 0x09, 0x1c, 0x8c, 0x2c, 0x19, 0x3b, 0xa3, 0x91, 0x43, 0x98, 0x64, 0x6a, 0x68, - 0x9e, 0x70, 0x6e, 0xda, 0x21, 0xdf, 0x13, 0x05, 0x32, 0x7c, 0xb6, 0x34, 0x74, 0x02, 0xfb, 0x38, - 0x7e, 0xc6, 0x14, 0x7d, 0xa3, 0x2f, 0xc7, 0xbe, 0xd4, 0x7c, 0x39, 0x14, 0x62, 0x56, 0x19, 0xdb, - 0x97, 0x91, 0x2f, 0x67, 0x86, 0x92, 0x8a, 0xb3, 0x94, 0x64, 0xfc, 0xb7, 0x2c, 0x54, 0x34, 0xb2, - 0x7c, 0x9d, 0xdb, 0xf5, 0xf6, 0x9c, 0x15, 0xbf, 0xac, 0x1b, 0xec, 0xdf, 0x4e, 0x76, 0x89, 0x2e, - 0x5f, 0x0a, 0xd4, 0xd5, 0x08, 0xf8, 0x16, 0x94, 0xc5, 0xa9, 0x7b, 0x1f, 0x8d, 0x62, 0x32, 0xcc, - 0x1c, 0x01, 0x87, 0xd3, 0x63, 0x55, 0xf8, 0x04, 0x0b, 0x0b, 0x71, 0xe1, 0x13, 0x51, 0xf8, 0xb2, - 0xb7, 0x8b, 0xdf, 0x81, 0xaa, 0x6c, 0x15, 0xf7, 0x14, 0xa7, 0x1b, 0x9f, 0xfa, 0xc4, 0x7e, 0x9b, - 0x15, 0xea, 0x8e, 0x36, 0x5f, 0x56, 0x7c, 0xa2, 0x2a, 0x96, 0x5e, 0x55, 0xf1, 0x09, 0x7d, 0x18, - 0xdb, 0xd1, 0x73, 0x50, 0x7c, 0x6e, 0xa0, 0xf8, 0xd8, 0x23, 0x58, 0x52, 0xec, 0x6a, 0xea, 0xda, - 0xae, 0xeb, 0x4d, 0xdd, 0x01, 0x57, 0x01, 0x09, 0x4c, 0x16, 0x1d, 0xc5, 0x25, 0xc6, 0x30, 0x8a, - 0x58, 0xa3, 0x67, 0x0b, 0x0f, 0xa0, 0x40, 0x72, 0x39, 0x09, 0x1f, 0xe9, 0x8c, 0x8b, 0x50, 0xd8, - 0x7d, 0x28, 0x90, 0x78, 0x9e, 0xbd, 0x96, 0xd9, 0x10, 0x82, 0xf1, 0x10, 0x1a, 0x28, 0x62, 0x6a, - 0x1c, 0xf7, 0x65, 0x52, 0x89, 0xb1, 0x0c, 0x6c, 0x9f, 0x0e, 0x91, 0xfe, 0x9c, 0xe6, 0x7f, 0xe6, - 0xa0, 0xa2, 0x81, 0x05, 0x5b, 0xc4, 0x07, 0x18, 0xd6, 0xd0, 0xb1, 0xc7, 0x5c, 0xf9, 0x1e, 0x6a, - 0x66, 0x0d, 0xa1, 0x5b, 0x12, 0x28, 0x2e, 0x05, 0xfb, 0xfc, 0xd4, 0xf2, 0xa6, 0xa1, 0x35, 0xe4, - 0xa7, 0x3e, 0xe7, 0x52, 0x58, 0xaa, 0xda, 0xe7, 0xa7, 0x07, 0xd3, 0x70, 0x0b, 0x61, 0x02, 0x4b, - 0x10, 0xb5, 0x86, 0x25, 0xdf, 0x0c, 0x8c, 0xed, 0xcb, 0x18, 0x4b, 0x3e, 0x5c, 0xa1, 0x25, 0xca, - 0x47, 0x0f, 0x57, 0x48, 0x6d, 0x99, 0xe5, 0xe4, 0x85, 0x79, 0x4e, 0xfe, 0x6d, 0x58, 0x25, 0x4e, - 0x2e, 0x79, 0x84, 0x35, 0x43, 0x52, 0xcb, 0x58, 0x2a, 0x27, 0xa9, 0xc9, 0x5f, 0x4d, 0x31, 0x03, - 0x75, 0x3e, 0x02, 0xe7, 0xc7, 0x74, 0xa2, 0x32, 0xa6, 0x98, 0x99, 0x6c, 0xbc, 0xe7, 0xfc, 0x98, - 0x0b, 0x4c, 0x74, 0x8c, 0xea, 0x98, 0xf2, 0x89, 0xec, 0xd8, 0x71, 0x67, 0x31, 0xed, 0xcb, 0x24, - 0x66, 0x59, 0x62, 0xda, 0x97, 0x3a, 0xe6, 0x53, 0x58, 0x1b, 0xf3, 0xa1, 0x63, 0x27, 0x9b, 0xb5, - 0x62, 0x09, 0x62, 0x99, 0x8a, 0xb5, 0x3a, 0x3d, 0xd2, 0x20, 0xc5, 0x6a, 0xfc, 0xd8, 0x1b, 0x1f, - 0x3b, 0x74, 0x79, 0x92, 0xab, 0x36, 0x6f, 0xd6, 0xdd, 0xe9, 0xf8, 0x87, 0x08, 0x16, 0x55, 0x02, - 0xa3, 0x06, 0x95, 0x5e, 0xe8, 0x4d, 0xd4, 0x36, 0xd7, 0xa1, 0x4a, 0x9f, 0x32, 0xdc, 0xe4, 0x16, - 0xdc, 0x44, 0xda, 0xec, 0x7b, 0x13, 0x6f, 0xe4, 0x9d, 0x5e, 0x25, 0x0c, 0x4a, 0xff, 0x23, 0x03, - 0x4b, 0x89, 0x52, 0x79, 0xce, 0xbf, 0x4d, 0x07, 0x2b, 0x8a, 0x19, 0x20, 0x72, 0x5e, 0xd4, 0x2e, - 0x1f, 0x42, 0xa4, 0x53, 0xa5, 0xe2, 0x08, 0xda, 0x71, 0xac, 0xab, 0xaa, 0x48, 0xb4, 0xdd, 0x9a, - 0xa7, 0x6d, 0x59, 0x5f, 0x45, 0xc1, 0xaa, 0x26, 0xfe, 0xba, 0x7c, 0xc6, 0x3c, 0x94, 0x53, 0xce, - 0x25, 0x1f, 0x6a, 0xea, 0xc6, 0x27, 0x35, 0x82, 0xd8, 0x22, 0x15, 0x18, 0xff, 0x36, 0x03, 0x10, - 0x8f, 0x0e, 0x9f, 0x8a, 0x46, 0x17, 0x28, 0xa5, 0x91, 0xd1, 0x2e, 0xcb, 0xb7, 0xa0, 0x1a, 0xbd, - 0x18, 0x8b, 0xaf, 0xe4, 0x8a, 0x82, 0x89, 0x7b, 0xf9, 0x1e, 0x34, 0x4e, 0x47, 0xde, 0x31, 0x8a, - 0x4e, 0xf2, 0x02, 0xa5, 0xa0, 0x9b, 0x3a, 0x81, 0xd5, 0xb5, 0x18, 0x5f, 0xe0, 0xf9, 0xd4, 0x47, - 0x65, 0xfa, 0x75, 0x6c, 0xfc, 0x76, 0x36, 0x7a, 0x3a, 0x13, 0xaf, 0xc4, 0xcb, 0xf5, 0x8c, 0x9f, - 0xc7, 0x03, 0xfb, 0x32, 0xcf, 0xc3, 0x47, 0x50, 0xf7, 0x89, 0x3b, 0x2a, 0xd6, 0x99, 0x7f, 0x09, - 0xeb, 0xac, 0xf9, 0x89, 0x2b, 0xf7, 0xeb, 0xd0, 0xb4, 0x87, 0xe7, 0xdc, 0x0f, 0x1d, 0x34, 0xd6, - 0xa2, 0xa0, 0x26, 0x1f, 0xab, 0x68, 0x70, 0x94, 0x88, 0xee, 0x41, 0x43, 0x86, 0x40, 0x45, 0x98, - 0x32, 0xa9, 0x42, 0x0c, 0x16, 0x88, 0xc6, 0x7f, 0x50, 0x6f, 0x75, 0x92, 0xbb, 0xfb, 0xf2, 0x55, - 0xd1, 0x67, 0x98, 0x9d, 0xf7, 0xad, 0x48, 0x42, 0x92, 0x36, 0x60, 0xc9, 0x8f, 0x08, 0x28, 0x2d, - 0xc0, 0xc9, 0x65, 0xcd, 0xbf, 0xce, 0xb2, 0x1a, 0x7f, 0x9c, 0x81, 0xe2, 0x8e, 0x37, 0x11, 0x7a, - 0xb9, 0x90, 0xe7, 0xf0, 0x98, 0x44, 0xe1, 0x87, 0x0b, 0xe2, 0xb3, 0x3b, 0x7c, 0x79, 0xc8, 0x40, - 0xaa, 0xbc, 0x51, 0x4b, 0xca, 0x1b, 0xdf, 0x83, 0x5b, 0xe8, 0x8d, 0xf0, 0xbd, 0x89, 0xe7, 0x8b, - 0xa3, 0x6a, 0x8f, 0x48, 0xee, 0xf0, 0xdc, 0xf0, 0x4c, 0xf1, 0xce, 0x9b, 0x27, 0x9c, 0x1f, 0x6a, - 0x18, 0x7b, 0x11, 0x02, 0xc6, 0xd2, 0x8c, 0xc2, 0x73, 0x8b, 0x54, 0x45, 0x29, 0x18, 0x11, 0x47, - 0x6d, 0x88, 0x82, 0x0e, 0xc2, 0x51, 0x34, 0x32, 0xbe, 0x0b, 0xe5, 0xc8, 0xea, 0xc0, 0xde, 0x83, - 0xf2, 0x99, 0x37, 0x91, 0xa6, 0x89, 0x4c, 0x22, 0xac, 0x42, 0xce, 0xda, 0x2c, 0x9d, 0xd1, 0x1f, - 0x81, 0xf1, 0x67, 0x45, 0x28, 0x76, 0xdd, 0x73, 0xcf, 0x19, 0xe0, 0x6b, 0x9f, 0x31, 0x1f, 0x7b, - 0x2a, 0x0e, 0x53, 0xfc, 0x8d, 0x1e, 0xfd, 0x38, 0x35, 0x42, 0x4e, 0x7a, 0xf4, 0xa3, 0xa4, 0x08, - 0x2b, 0xb0, 0xe0, 0xeb, 0xb9, 0x0d, 0x0a, 0x3e, 0xbe, 0x3f, 0x8c, 0x94, 0xb6, 0x82, 0x16, 0xc7, - 0x2a, 0xda, 0xa2, 0x98, 0x7b, 0x5c, 0x32, 0x8a, 0x8b, 0x29, 0x23, 0x04, 0x17, 0xec, 0x0d, 0x28, - 0xca, 0x28, 0x06, 0x7a, 0x13, 0x4e, 0x0f, 0x06, 0x25, 0x08, 0xa9, 0xc1, 0xe7, 0xe4, 0x4d, 0x8a, - 0x24, 0x2a, 0xa1, 0xa7, 0x4b, 0xe0, 0x96, 0xa0, 0xb5, 0x3b, 0x50, 0x21, 0x7c, 0x42, 0x29, 0xc9, - 0xf7, 0x39, 0x08, 0x42, 0x84, 0x94, 0x14, 0x21, 0xe5, 0xd4, 0x14, 0x21, 0xf8, 0x9c, 0x2b, 0xe2, - 0xb2, 0x34, 0x45, 0xa0, 0xc4, 0x10, 0x1a, 0x5c, 0xe5, 0xc7, 0x91, 0xca, 0x3d, 0x85, 0x89, 0x29, - 0xe5, 0xfe, 0x6d, 0xa8, 0x9d, 0xd8, 0xa3, 0xd1, 0xb1, 0x3d, 0x78, 0x41, 0x3a, 0x69, 0x95, 0xcc, - 0x70, 0x0a, 0x88, 0x4a, 0xe9, 0x1d, 0xa8, 0x68, 0xbb, 0x8c, 0x8f, 0x6f, 0xf2, 0x26, 0xc4, 0xfb, - 0x3b, 0x6b, 0x6a, 0xaa, 0xbf, 0x86, 0xa9, 0x49, 0x7b, 0x84, 0xd4, 0x48, 0x3e, 0x42, 0xba, 0x85, - 0xdc, 0x54, 0x3e, 0x54, 0x69, 0x52, 0x16, 0x02, 0x7b, 0x38, 0xc4, 0x87, 0x2a, 0x94, 0xf2, 0x0b, - 0x17, 0x8f, 0xca, 0x17, 0x49, 0xa8, 0x25, 0x18, 0xa1, 0xdc, 0x26, 0x7b, 0xe9, 0xc4, 0x76, 0x86, - 0xf8, 0xe8, 0x93, 0xd4, 0xd8, 0xa2, 0x3d, 0x0e, 0x0f, 0x6d, 0x67, 0xc8, 0xee, 0x42, 0x55, 0x15, - 0xe3, 0xed, 0xb8, 0x44, 0xeb, 0x2f, 0x8b, 0xc5, 0x9d, 0x68, 0x40, 0x2d, 0xc2, 0x18, 0xc7, 0xb1, - 0x5e, 0x15, 0x89, 0x82, 0x74, 0xf0, 0x3e, 0x3a, 0xff, 0x43, 0x8e, 0x11, 0x5d, 0xf5, 0x27, 0xb7, - 0xe4, 0x5c, 0x25, 0x95, 0xaa, 0xff, 0xf1, 0xa5, 0x83, 0x49, 0x98, 0x42, 0x10, 0x23, 0x17, 0xcd, - 0x6a, 0x42, 0x10, 0x93, 0xa8, 0xe8, 0xa2, 0x21, 0x04, 0xf6, 0x5d, 0x4d, 0x91, 0x6a, 0x21, 0xf2, - 0x1b, 0x33, 0xed, 0x5f, 0xf7, 0xe6, 0xfd, 0x36, 0x80, 0x13, 0x88, 0x5b, 0x26, 0xe0, 0xee, 0x10, - 0x83, 0xb3, 0x4a, 0x66, 0xd9, 0x09, 0x9e, 0x13, 0xe0, 0xab, 0xd5, 0xb0, 0xda, 0x50, 0xd5, 0xa7, - 0xc9, 0x4a, 0x90, 0x3f, 0x38, 0xec, 0xec, 0x37, 0x6f, 0xb0, 0x0a, 0x14, 0x7b, 0x9d, 0x7e, 0x7f, - 0xb7, 0xb3, 0xd5, 0xcc, 0xb0, 0x2a, 0x94, 0xa2, 0x10, 0x93, 0xac, 0xf8, 0x6a, 0x6f, 0x6e, 0x76, - 0x0e, 0xfb, 0x9d, 0xad, 0x66, 0xee, 0x07, 0xf9, 0x52, 0xb6, 0x99, 0x33, 0xfe, 0x3c, 0x07, 0x15, - 0x6d, 0x15, 0x5e, 0xce, 0x8c, 0x6f, 0x03, 0xa0, 0x4a, 0x13, 0xbf, 0x63, 0xca, 0x9b, 0x65, 0x01, - 0xa1, 0xcd, 0xd7, 0x8d, 0xe5, 0x39, 0x4a, 0x6f, 0xa1, 0x8c, 0xe5, 0x6f, 0x43, 0x8d, 0x32, 0x45, - 0xe8, 0xee, 0xba, 0x82, 0x59, 0x25, 0xa0, 0x64, 0xd5, 0x18, 0xa3, 0x86, 0x48, 0x18, 0xbd, 0x20, - 0xe3, 0xc6, 0x09, 0x84, 0xf1, 0x0b, 0x18, 0x7c, 0x12, 0x78, 0xa3, 0x73, 0x4e, 0x18, 0x24, 0x11, - 0x56, 0x24, 0xac, 0x2f, 0x83, 0xe4, 0x24, 0x3f, 0xd4, 0x82, 0xa4, 0x0a, 0x66, 0x95, 0x80, 0xb2, - 0xa3, 0x6f, 0x2a, 0x02, 0x2a, 0x21, 0x01, 0xad, 0xcd, 0x53, 0x43, 0x82, 0x78, 0x76, 0xe7, 0xec, - 0x59, 0x65, 0x24, 0x8c, 0xaf, 0xcd, 0xd7, 0x7b, 0xb5, 0x5d, 0x8b, 0xbd, 0x07, 0x6c, 0x3c, 0x99, - 0x58, 0x29, 0x96, 0xa6, 0xbc, 0xd9, 0x18, 0x4f, 0x26, 0x7d, 0xcd, 0x10, 0xf3, 0x15, 0x18, 0xc1, - 0x3e, 0x07, 0xd6, 0x16, 0x07, 0x18, 0x87, 0x18, 0x99, 0x50, 0x63, 0xb6, 0x9c, 0xd1, 0xd9, 0x72, - 0x0a, 0xf7, 0xcb, 0xa6, 0x72, 0xbf, 0x97, 0xf1, 0x09, 0x63, 0x1b, 0x2a, 0x87, 0x5a, 0x1e, 0x9a, - 0xbb, 0xe2, 0x86, 0x50, 0x19, 0x68, 0xe8, 0xee, 0x20, 0xe3, 0x96, 0x2f, 0x13, 0xcf, 0x68, 0xa3, - 0xc9, 0x6a, 0xa3, 0x31, 0xfe, 0x4d, 0x86, 0x62, 0xfc, 0xa3, 0xc1, 0xc7, 0xa9, 0x6f, 0x94, 0x1f, - 0x28, 0x8e, 0x65, 0xac, 0x28, 0xff, 0x8f, 0x0c, 0x43, 0xc4, 0xa1, 0x59, 0xde, 0xc9, 0x49, 0xc0, - 0x55, 0x54, 0x4e, 0x05, 0x61, 0x07, 0x08, 0x52, 0xc2, 0xb7, 0x90, 0xf0, 0x1d, 0x6a, 0x3f, 0x90, - 0xd1, 0x39, 0x42, 0xf8, 0xde, 0xb3, 0x2f, 0x65, 0xaf, 0x81, 0x10, 0x41, 0xa4, 0xa1, 0x5a, 0xc5, - 0x22, 0x45, 0xdf, 0xc6, 0xbf, 0x94, 0xe1, 0x96, 0xb3, 0xeb, 0xfb, 0x00, 0x4a, 0x51, 0xab, 0xc9, - 0x1b, 0x56, 0x61, 0x46, 0xe5, 0xe2, 0x1e, 0x47, 0xad, 0x3c, 0x31, 0x62, 0x3a, 0x5c, 0xe8, 0x6c, - 0xe8, 0x6a, 0xa3, 0xfe, 0x06, 0xb0, 0x13, 0xc7, 0x9f, 0x45, 0xa6, 0xc3, 0xd6, 0xc4, 0x12, 0x0d, - 0xdb, 0x38, 0x82, 0x25, 0xc5, 0x25, 0x34, 0x8d, 0x20, 0xb9, 0x79, 0x99, 0x57, 0x30, 0xf9, 0xec, - 0x1c, 0x93, 0x37, 0x7e, 0x9a, 0x87, 0xa2, 0xca, 0xe9, 0x94, 0x96, 0x87, 0xa8, 0x9c, 0xcc, 0x43, - 0xd4, 0x4a, 0xe4, 0xac, 0xc0, 0xad, 0x97, 0xf7, 0xfd, 0xbd, 0xd9, 0x2b, 0x5b, 0x33, 0x9a, 0x27, - 0xae, 0xed, 0x55, 0xc8, 0x4f, 0xec, 0xf0, 0x0c, 0x0d, 0x64, 0x44, 0x3c, 0xf8, 0xad, 0x8c, 0xe9, - 0x85, 0xa4, 0x31, 0x3d, 0x2d, 0x67, 0x13, 0x89, 0xa4, 0x73, 0x39, 0x9b, 0x6e, 0x01, 0xc9, 0x17, - 0xda, 0x7b, 0x98, 0x12, 0x02, 0xc4, 0x5d, 0x94, 0x14, 0x47, 0x4a, 0xb3, 0xe2, 0xc8, 0x6b, 0x8b, - 0x0a, 0xdf, 0x86, 0x05, 0x8a, 0x77, 0x96, 0x31, 0x57, 0xea, 0x42, 0x91, 0x6b, 0xa8, 0xfe, 0xa7, - 0x47, 0xb0, 0xa6, 0xc4, 0xd5, 0x13, 0xa0, 0x54, 0x12, 0x09, 0x50, 0x74, 0x23, 0x7f, 0x35, 0x69, - 0xe4, 0xbf, 0x0f, 0xcd, 0x68, 0x41, 0xd1, 0x64, 0xe6, 0x06, 0x32, 0xa2, 0xa3, 0xae, 0xe0, 0x82, - 0x4b, 0xee, 0x07, 0xf1, 0x85, 0x58, 0x4f, 0x5c, 0x88, 0x82, 0x87, 0xb5, 0xc3, 0x90, 0x8f, 0x27, - 0xa1, 0xbc, 0x10, 0xf1, 0xcd, 0xb7, 0x3e, 0xc0, 0x64, 0x34, 0x62, 0x0d, 0xca, 0xdd, 0x7d, 0x6b, - 0x7b, 0xb7, 0xfb, 0x6c, 0xa7, 0xdf, 0xcc, 0x88, 0xcf, 0xde, 0xd1, 0xe6, 0x66, 0xa7, 0xb3, 0x85, - 0x37, 0x0e, 0xc0, 0xc2, 0x76, 0xbb, 0x2b, 0x6e, 0x9f, 0x9c, 0xf1, 0xbb, 0x59, 0xa8, 0x68, 0xcd, - 0xb3, 0xa7, 0xd1, 0xaa, 0x50, 0x8e, 0x8c, 0xdb, 0xf3, 0x43, 0x78, 0xa8, 0x58, 0xb1, 0xb6, 0x2c, - 0x51, 0x86, 0xaa, 0xec, 0xb5, 0x19, 0xaa, 0xd8, 0xbb, 0xd0, 0xb0, 0xa9, 0x85, 0x68, 0x15, 0xa4, - 0x39, 0x58, 0x82, 0xe5, 0x22, 0xe0, 0x2b, 0xb0, 0xf8, 0x3e, 0x11, 0x78, 0x79, 0xf5, 0xf0, 0x2a, - 0xba, 0x52, 0x70, 0xb1, 0x8a, 0x27, 0xb6, 0x33, 0x9a, 0xfa, 0x5c, 0xba, 0x6f, 0xa3, 0x9b, 0x99, - 0xa0, 0xa6, 0x2a, 0x36, 0x3e, 0x00, 0x88, 0xc7, 0x9c, 0x5c, 0x9c, 0x1b, 0xc9, 0xc5, 0xc9, 0x68, - 0x8b, 0x93, 0x35, 0xb6, 0x88, 0x8d, 0xc8, 0x85, 0x8e, 0x3c, 0xd5, 0xdf, 0x04, 0x65, 0x91, 0xb2, - 0xf0, 0x1d, 0xe6, 0x64, 0xc4, 0x43, 0x15, 0xb7, 0xb9, 0x28, 0x4b, 0xba, 0x51, 0x81, 0x0a, 0xa3, - 0x8e, 0x5b, 0x89, 0xb9, 0x91, 0x24, 0xc9, 0x59, 0x6e, 0x24, 0x51, 0xcd, 0xa8, 0xdc, 0x58, 0x87, - 0xd6, 0x16, 0x17, 0xad, 0xb5, 0x47, 0xa3, 0x99, 0xe1, 0x18, 0xb7, 0xe0, 0x66, 0x4a, 0x99, 0x34, - 0x42, 0x7c, 0x0c, 0x2b, 0x6d, 0x0a, 0xd1, 0xfc, 0xaa, 0x62, 0x31, 0x8c, 0x16, 0xac, 0xce, 0x36, - 0x29, 0x3b, 0xdb, 0x86, 0xc5, 0x2d, 0x7e, 0x3c, 0x3d, 0xdd, 0xe5, 0xe7, 0x71, 0x47, 0x0c, 0xf2, - 0xc1, 0x99, 0x77, 0x21, 0xd7, 0x07, 0xff, 0x16, 0x67, 0x78, 0x24, 0x70, 0xac, 0x60, 0xc2, 0x07, - 0xca, 0x22, 0x8a, 0x90, 0xde, 0x84, 0x0f, 0x8c, 0xa7, 0xc0, 0xf4, 0x76, 0xe4, 0x7a, 0x09, 0x2d, - 0x61, 0x7a, 0x6c, 0x05, 0x57, 0x41, 0xc8, 0xc7, 0x2a, 0x05, 0x0b, 0x04, 0xd3, 0xe3, 0x1e, 0x41, - 0x8c, 0x7b, 0x50, 0x3d, 0xb4, 0xaf, 0x4c, 0xfe, 0xb9, 0x8c, 0x32, 0x58, 0x83, 0xe2, 0xc4, 0xbe, - 0x12, 0x6c, 0x20, 0x72, 0x8e, 0x60, 0xb1, 0xf1, 0x07, 0x79, 0x58, 0x20, 0x4c, 0x76, 0x97, 0xb2, - 0x24, 0x3a, 0x2e, 0x1e, 0x43, 0xc5, 0x28, 0x35, 0xd0, 0x1c, 0x2f, 0xcd, 0xce, 0xf3, 0x52, 0x69, - 0x40, 0x53, 0xd9, 0x21, 0x94, 0x19, 0xdb, 0x9d, 0x8e, 0x55, 0x4a, 0x88, 0x64, 0x9c, 0x62, 0x3e, - 0xce, 0x82, 0x49, 0x41, 0x5c, 0x49, 0x47, 0x63, 0xac, 0x8b, 0xd0, 0xe8, 0xd4, 0x15, 0x21, 0xd9, - 0xa5, 0x0e, 0x4a, 0x55, 0x78, 0x8a, 0x2a, 0x7e, 0x25, 0xa9, 0xf0, 0xcc, 0x29, 0x36, 0xa5, 0x57, - 0x2b, 0x36, 0x64, 0x59, 0x7b, 0x89, 0x62, 0x03, 0xaf, 0xa1, 0xd8, 0xbc, 0x86, 0x93, 0xef, 0x26, - 0x94, 0xf0, 0xde, 0xd7, 0xb8, 0xa7, 0xb8, 0xef, 0x05, 0xf7, 0xfc, 0x8e, 0x26, 0xfa, 0xd3, 0x0b, - 0x83, 0x5b, 0xf1, 0x31, 0x31, 0xf9, 0xe7, 0xbf, 0x1c, 0xe7, 0xc9, 0x67, 0x50, 0x94, 0x50, 0x41, - 0xd0, 0xae, 0x3d, 0x56, 0x09, 0x76, 0xf0, 0x6f, 0xb1, 0x6c, 0x98, 0x15, 0xe4, 0xf3, 0xa9, 0xe3, - 0xf3, 0xa1, 0x4a, 0xc1, 0xe0, 0xe0, 0x19, 0x15, 0x10, 0x31, 0x41, 0xa1, 0x86, 0xb8, 0xde, 0x85, - 0x2b, 0x03, 0xb0, 0x8b, 0x4e, 0xf0, 0x5c, 0x7c, 0x1a, 0x0c, 0x9a, 0x98, 0x62, 0x6b, 0xe2, 0xf9, - 0xea, 0x72, 0x32, 0x7e, 0x9a, 0x81, 0xa6, 0x3c, 0x5d, 0x51, 0x99, 0xae, 0x05, 0x14, 0xae, 0x73, - 0x88, 0xbf, 0x3c, 0xa1, 0x82, 0x01, 0x35, 0x34, 0x7e, 0x44, 0x37, 0x15, 0x19, 0x6f, 0x2a, 0x02, - 0xb8, 0x2d, 0x6f, 0xab, 0x37, 0xa1, 0xa2, 0x9e, 0x63, 0x8e, 0x9d, 0x91, 0x4a, 0x78, 0x4b, 0xef, - 0x31, 0xf7, 0x9c, 0x91, 0xba, 0xe8, 0x7c, 0x5b, 0xc6, 0x53, 0x65, 0xf0, 0xa2, 0x33, 0xed, 0x90, - 0x1b, 0xff, 0x25, 0x03, 0x8b, 0xda, 0x54, 0xe4, 0xb9, 0xfd, 0x10, 0xaa, 0x51, 0x6e, 0x3b, 0x1e, - 0x49, 0x5e, 0x6b, 0x49, 0x46, 0x13, 0x57, 0xab, 0x0c, 0x22, 0x48, 0x20, 0x06, 0x33, 0xb4, 0xaf, - 0x70, 0xbc, 0xc1, 0x74, 0xac, 0x94, 0x9b, 0xa1, 0x7d, 0xb5, 0xcd, 0x79, 0x6f, 0x3a, 0x16, 0xaa, - 0xeb, 0x05, 0xe7, 0x2f, 0x22, 0x04, 0x92, 0xb9, 0x40, 0xc0, 0x24, 0x86, 0x01, 0xb5, 0xb1, 0xe7, - 0x86, 0x67, 0x11, 0x8a, 0x94, 0x3a, 0x11, 0x48, 0x38, 0xc6, 0x9f, 0x66, 0x61, 0x89, 0x4c, 0x6c, - 0xd2, 0xb4, 0x29, 0x59, 0x57, 0x0b, 0x16, 0xc8, 0xda, 0x48, 0xcc, 0x6b, 0xe7, 0x86, 0x29, 0xbf, - 0xd9, 0xb7, 0x5f, 0xd3, 0x2c, 0xa8, 0x42, 0xb6, 0xae, 0x59, 0xfe, 0xdc, 0xfc, 0xf2, 0x5f, 0xbf, - 0xbc, 0x69, 0x1e, 0xb7, 0x42, 0x9a, 0xc7, 0xed, 0x75, 0xfc, 0x5c, 0x73, 0x71, 0x4d, 0x45, 0x89, - 0xa3, 0xc5, 0x35, 0x3d, 0x85, 0xb5, 0x04, 0x0e, 0x72, 0x6b, 0xe7, 0xc4, 0xe1, 0x2a, 0xbe, 0x7d, - 0x59, 0xc3, 0xee, 0xa9, 0xb2, 0x8d, 0x22, 0x14, 0x82, 0x81, 0x37, 0xe1, 0xc6, 0x2a, 0x2c, 0x27, - 0x57, 0x55, 0x5e, 0x13, 0xbf, 0x97, 0x81, 0x96, 0x7c, 0x1f, 0xe1, 0xb8, 0xa7, 0x3b, 0x4e, 0x10, - 0x7a, 0x7e, 0x94, 0x03, 0xee, 0x36, 0x40, 0x10, 0xda, 0xbe, 0xd4, 0x36, 0x65, 0x44, 0x37, 0x42, - 0x50, 0x93, 0xbc, 0x09, 0x25, 0xee, 0x0e, 0xa9, 0x90, 0xa8, 0xa1, 0xc8, 0xdd, 0xa1, 0xd2, 0x43, - 0xe7, 0xe4, 0xef, 0x5a, 0x52, 0xbd, 0x90, 0x01, 0x96, 0x62, 0x75, 0xf8, 0x39, 0x5e, 0xbc, 0xf9, - 0x28, 0xc0, 0x72, 0xcf, 0xbe, 0xc4, 0xd7, 0x86, 0x81, 0xf1, 0xcf, 0xb2, 0xd0, 0x88, 0xc7, 0x47, - 0xd1, 0xd9, 0x2f, 0x8f, 0x33, 0xbf, 0x2b, 0xc9, 0xc1, 0x11, 0xf2, 0xbb, 0x66, 0x78, 0x2c, 0xd1, - 0xe1, 0xec, 0xba, 0xcc, 0x80, 0x8a, 0xc2, 0xf0, 0xa6, 0xa1, 0x96, 0x8a, 0xa9, 0x4c, 0x28, 0x07, - 0xd3, 0x50, 0x28, 0x5c, 0x42, 0xf3, 0x74, 0x5c, 0xa9, 0xf2, 0x14, 0xec, 0x71, 0xd8, 0xc5, 0x0c, - 0xcf, 0x02, 0x2c, 0xaa, 0xd1, 0x46, 0x0a, 0x2c, 0x81, 0xdf, 0x24, 0x39, 0x9b, 0x76, 0x0e, 0x65, - 0x6c, 0x5d, 0x08, 0xa5, 0x64, 0x97, 0x91, 0x10, 0xfa, 0x26, 0x54, 0xa8, 0xf1, 0x38, 0x8c, 0x2d, - 0x6f, 0x96, 0xb1, 0x07, 0x2c, 0x97, 0x46, 0x20, 0x6f, 0x9a, 0x50, 0x7d, 0x81, 0xba, 0xc2, 0xe7, - 0x07, 0xff, 0x28, 0x03, 0x37, 0x53, 0xb6, 0x4d, 0x9e, 0xf2, 0x4d, 0x58, 0x3c, 0x89, 0x0a, 0xd5, - 0xea, 0xd2, 0x51, 0x5f, 0x55, 0x6c, 0x35, 0xb9, 0xa6, 0x66, 0xf3, 0x24, 0x09, 0x88, 0x95, 0x2e, - 0xda, 0xc1, 0x44, 0xa4, 0x22, 0x2a, 0x5d, 0xb4, 0x8d, 0xa4, 0xef, 0x1c, 0xc2, 0x7a, 0xe7, 0x52, - 0x70, 0x8c, 0x4d, 0x3d, 0x45, 0xb9, 0x22, 0xa3, 0xa4, 0x81, 0x39, 0xf3, 0x5a, 0x06, 0xe6, 0x21, - 0x05, 0x64, 0x45, 0x6d, 0xfd, 0x3c, 0x8d, 0xe0, 0x05, 0x2a, 0xea, 0x50, 0x8a, 0x75, 0x15, 0x2d, - 0x39, 0x88, 0x52, 0xab, 0x1b, 0x01, 0x34, 0xf6, 0xa6, 0xa3, 0xd0, 0x89, 0xb3, 0xad, 0xb3, 0x6f, - 0xcb, 0x3a, 0xd8, 0x8f, 0x5a, 0xb5, 0xd4, 0x8e, 0x20, 0xea, 0x08, 0x17, 0x6b, 0x2c, 0x1a, 0xb2, - 0xe6, 0xfb, 0x6b, 0x8c, 0x93, 0x3d, 0x18, 0x37, 0x61, 0x2d, 0xfe, 0xa2, 0x65, 0x53, 0x57, 0xcd, - 0xbf, 0xce, 0xd0, 0xd3, 0xe6, 0x64, 0xe6, 0x77, 0xd6, 0x81, 0xa5, 0xc0, 0x71, 0x4f, 0x47, 0x5c, - 0x6f, 0x3e, 0x90, 0x8b, 0xb0, 0x92, 0x1c, 0x9b, 0xcc, 0x0e, 0x6f, 0x2e, 0x52, 0x8d, 0xb8, 0xb5, - 0x80, 0x6d, 0x5c, 0x37, 0xc8, 0x98, 0x2c, 0x66, 0x56, 0x63, 0x7e, 0xf0, 0x5d, 0xa8, 0x27, 0x3b, - 0x62, 0xdf, 0x91, 0xc1, 0x88, 0xf1, 0xa8, 0x72, 0x33, 0x71, 0x65, 0x31, 0x41, 0x54, 0xe2, 0xb5, - 0x0f, 0x8c, 0x7f, 0x92, 0x81, 0x96, 0xc9, 0x05, 0xe5, 0x6a, 0xa3, 0x54, 0x34, 0xf3, 0xe1, 0x5c, - 0xab, 0xd7, 0xcf, 0x55, 0xc5, 0x38, 0xaa, 0x11, 0x7d, 0xe3, 0xda, 0xcd, 0xd8, 0xb9, 0x31, 0x37, - 0xa3, 0x8d, 0x12, 0x2c, 0x10, 0x8a, 0xb1, 0x06, 0x2b, 0x72, 0x3c, 0x6a, 0x2c, 0xb1, 0xf7, 0x30, - 0xd1, 0x63, 0xc2, 0x7b, 0xb8, 0x0e, 0x2d, 0x4a, 0xe5, 0xa7, 0x4f, 0x42, 0x56, 0xdc, 0x02, 0xb6, - 0x67, 0x0f, 0x6c, 0xdf, 0xf3, 0xdc, 0x43, 0xee, 0xcb, 0x87, 0xa2, 0x28, 0x61, 0xa2, 0x73, 0x4d, - 0x89, 0xc2, 0xf4, 0xa5, 0x12, 0xd0, 0x79, 0xae, 0x7a, 0x17, 0x43, 0x5f, 0x86, 0x09, 0x4b, 0x1b, - 0xf6, 0x0b, 0xae, 0x5a, 0x52, 0x4b, 0xf4, 0x11, 0x54, 0x26, 0x51, 0xa3, 0x6a, 0xdd, 0x55, 0xc4, - 0xf2, 0x7c, 0xb7, 0xa6, 0x8e, 0x6d, 0x3c, 0x81, 0xe5, 0x64, 0x9b, 0x92, 0x75, 0xac, 0x43, 0x69, - 0x2c, 0x61, 0x72, 0x74, 0xd1, 0xb7, 0xf1, 0x3b, 0x25, 0x28, 0x4a, 0x7d, 0x8e, 0x3d, 0x84, 0xfc, - 0x40, 0xbd, 0x4d, 0x8a, 0x13, 0x61, 0xc8, 0x52, 0xf5, 0xff, 0x26, 0xbe, 0x50, 0x12, 0x78, 0xec, - 0x23, 0xa8, 0x27, 0xbd, 0xa2, 0x33, 0xe1, 0x90, 0x49, 0x77, 0x66, 0x6d, 0x30, 0xe3, 0xff, 0x2a, - 0xc7, 0x97, 0x23, 0xc9, 0x0c, 0xa5, 0x33, 0xed, 0xf6, 0xf4, 0x5c, 0x21, 0x6f, 0x07, 0x67, 0xb6, - 0xf5, 0xe4, 0xe9, 0x07, 0x32, 0x1e, 0xb2, 0x82, 0xc0, 0xde, 0x99, 0xfd, 0xe4, 0xe9, 0x07, 0xb3, - 0x92, 0x34, 0x85, 0xc4, 0xe9, 0x92, 0xf4, 0x32, 0x14, 0x28, 0xd3, 0x1a, 0x3d, 0x32, 0xa1, 0x0f, - 0xf6, 0x18, 0x96, 0xa5, 0xda, 0x6a, 0xc9, 0xe7, 0xc0, 0xc4, 0x05, 0x4b, 0x14, 0x83, 0x23, 0xcb, - 0x7a, 0x58, 0x44, 0xb6, 0xa1, 0x55, 0x58, 0x38, 0x8b, 0xd3, 0xe6, 0xd5, 0x4c, 0xf9, 0x65, 0xfc, - 0x69, 0x01, 0x2a, 0xda, 0xa2, 0xb0, 0x2a, 0x94, 0xcc, 0x4e, 0xaf, 0x63, 0x7e, 0xd2, 0xd9, 0x6a, - 0xde, 0x60, 0xf7, 0xe1, 0x9d, 0xee, 0xfe, 0xe6, 0x81, 0x69, 0x76, 0x36, 0xfb, 0xd6, 0x81, 0x69, - 0xa9, 0x74, 0x2c, 0x87, 0xed, 0xcf, 0xf6, 0x3a, 0xfb, 0x7d, 0x6b, 0xab, 0xd3, 0x6f, 0x77, 0x77, - 0x7b, 0xcd, 0x0c, 0x7b, 0x03, 0x5a, 0x31, 0xa6, 0x2a, 0x6e, 0xef, 0x1d, 0x1c, 0xed, 0xf7, 0x9b, - 0x59, 0x76, 0x07, 0x6e, 0x6d, 0x77, 0xf7, 0xdb, 0xbb, 0x56, 0x8c, 0xb3, 0xb9, 0xdb, 0xff, 0xc4, - 0xea, 0xfc, 0xda, 0x61, 0xd7, 0xfc, 0xac, 0x99, 0x4b, 0x43, 0x10, 0xca, 0xb8, 0x6a, 0x21, 0xcf, - 0x6e, 0xc2, 0x0a, 0x21, 0x50, 0x15, 0xab, 0x7f, 0x70, 0x60, 0xf5, 0x0e, 0x0e, 0xf6, 0x9b, 0x05, - 0xb6, 0x08, 0xb5, 0xee, 0xfe, 0x27, 0xed, 0xdd, 0xee, 0x96, 0x65, 0x76, 0xda, 0xbb, 0x7b, 0xcd, - 0x05, 0xb6, 0x04, 0x8d, 0x59, 0xbc, 0xa2, 0x68, 0x42, 0xe1, 0x1d, 0xec, 0x77, 0x0f, 0xf6, 0xad, - 0x4f, 0x3a, 0x66, 0xaf, 0x7b, 0xb0, 0xdf, 0x2c, 0xb1, 0x55, 0x60, 0xc9, 0xa2, 0x9d, 0xbd, 0xf6, - 0x66, 0xb3, 0xcc, 0x56, 0x60, 0x31, 0x09, 0x7f, 0xde, 0xf9, 0xac, 0x09, 0xac, 0x05, 0xcb, 0x34, - 0x30, 0x6b, 0xa3, 0xb3, 0x7b, 0xf0, 0xa9, 0xb5, 0xd7, 0xdd, 0xef, 0xee, 0x1d, 0xed, 0x35, 0x2b, - 0x98, 0x20, 0xaa, 0xd3, 0xb1, 0xba, 0xfb, 0xbd, 0xa3, 0xed, 0xed, 0xee, 0x66, 0xb7, 0xb3, 0xdf, - 0x6f, 0x56, 0xa9, 0xe7, 0xb4, 0x89, 0xd7, 0x44, 0x05, 0x19, 0x33, 0x60, 0x6d, 0x75, 0x7b, 0xed, - 0x8d, 0xdd, 0xce, 0x56, 0xb3, 0xce, 0x6e, 0xc3, 0xcd, 0x7e, 0x67, 0xef, 0xf0, 0xc0, 0x6c, 0x9b, - 0x9f, 0xa9, 0x98, 0x02, 0x6b, 0xbb, 0xdd, 0xdd, 0x3d, 0x32, 0x3b, 0xcd, 0x06, 0x7b, 0x0b, 0x6e, - 0x9b, 0x9d, 0x8f, 0x8f, 0xba, 0x66, 0x67, 0xcb, 0xda, 0x3f, 0xd8, 0xea, 0x58, 0xdb, 0x9d, 0x76, - 0xff, 0xc8, 0xec, 0x58, 0x7b, 0xdd, 0x5e, 0xaf, 0xbb, 0xff, 0xac, 0xd9, 0x64, 0xef, 0xc0, 0xdd, - 0x08, 0x25, 0x6a, 0x60, 0x06, 0x6b, 0x51, 0xcc, 0x4f, 0x6d, 0xe9, 0x7e, 0xe7, 0xd7, 0xfa, 0xd6, - 0x61, 0xa7, 0x63, 0x36, 0x19, 0x5b, 0x87, 0xd5, 0xb8, 0x7b, 0xea, 0x40, 0xf6, 0xbd, 0x24, 0xca, - 0x0e, 0x3b, 0xe6, 0x5e, 0x7b, 0x5f, 0x6c, 0x70, 0xa2, 0x6c, 0x59, 0x0c, 0x3b, 0x2e, 0x9b, 0x1d, - 0xf6, 0x0a, 0x63, 0x50, 0xd7, 0x76, 0x65, 0xbb, 0x6d, 0x36, 0x57, 0x59, 0x03, 0x2a, 0x7b, 0x87, - 0x87, 0x56, 0xbf, 0xbb, 0xd7, 0x39, 0x38, 0xea, 0x37, 0xd7, 0xd8, 0x0a, 0x34, 0xbb, 0xfb, 0xfd, - 0x8e, 0x29, 0xf6, 0x5a, 0x55, 0xfd, 0x3f, 0x45, 0xb6, 0x0c, 0x0d, 0x35, 0x52, 0x05, 0xfd, 0x59, - 0x91, 0xad, 0x01, 0x3b, 0xda, 0x37, 0x3b, 0xed, 0x2d, 0xb1, 0x70, 0x51, 0xc1, 0xff, 0x2d, 0x4a, - 0x0f, 0xc9, 0x4f, 0x73, 0xd1, 0x65, 0x1d, 0x3f, 0x39, 0x48, 0x26, 0x51, 0xad, 0x6a, 0xc9, 0x4f, - 0x5f, 0x95, 0xde, 0x5c, 0x53, 0xad, 0x72, 0x73, 0xaa, 0xd5, 0x9c, 0xee, 0x5e, 0xd3, 0x65, 0xbf, - 0xb7, 0xa1, 0x36, 0xa6, 0x84, 0xaa, 0x32, 0x71, 0x22, 0xc8, 0xf7, 0x37, 0x04, 0xa4, 0xac, 0x89, - 0x73, 0xf9, 0xbd, 0x0b, 0xf3, 0xf9, 0xbd, 0xd3, 0xe4, 0xfb, 0x85, 0x34, 0xf9, 0xfe, 0x01, 0x2c, - 0x12, 0x6b, 0x72, 0x5c, 0x67, 0xac, 0xb4, 0x66, 0x92, 0x02, 0x1b, 0xc8, 0xa2, 0x08, 0xae, 0xd4, - 0x09, 0xa5, 0x72, 0x48, 0x16, 0x52, 0x94, 0xda, 0x46, 0x42, 0xd3, 0x20, 0xce, 0x11, 0x69, 0x1a, - 0x51, 0x0f, 0xf6, 0x65, 0xdc, 0x43, 0x45, 0xeb, 0x81, 0xe0, 0xd8, 0xc3, 0x03, 0x58, 0xe4, 0x97, - 0xa1, 0x6f, 0x5b, 0xde, 0xc4, 0xfe, 0x7c, 0x8a, 0x2e, 0x5c, 0x1b, 0x75, 0xf8, 0xaa, 0xd9, 0xc0, - 0x82, 0x03, 0x84, 0x6f, 0xd9, 0xa1, 0xfd, 0xe0, 0x0b, 0xa8, 0x68, 0xc9, 0x76, 0xd9, 0x1a, 0x2c, - 0x7d, 0xda, 0xed, 0xef, 0x77, 0x7a, 0x3d, 0xeb, 0xf0, 0x68, 0xe3, 0x79, 0xe7, 0x33, 0x6b, 0xa7, - 0xdd, 0xdb, 0x69, 0xde, 0x10, 0x87, 0x76, 0xbf, 0xd3, 0xeb, 0x77, 0xb6, 0x12, 0xf0, 0x0c, 0x7b, - 0x13, 0xd6, 0x8f, 0xf6, 0x8f, 0x7a, 0x9d, 0x2d, 0x2b, 0xad, 0x5e, 0x56, 0x50, 0xa9, 0x2c, 0x4f, - 0xa9, 0x9e, 0x7b, 0xf0, 0x7d, 0xa8, 0x27, 0x33, 0x40, 0x32, 0x80, 0x85, 0xdd, 0xce, 0xb3, 0xf6, - 0xe6, 0x67, 0x94, 0x42, 0xae, 0xd7, 0x6f, 0xf7, 0xbb, 0x9b, 0x96, 0x4c, 0x19, 0x27, 0x38, 0x42, - 0x86, 0x55, 0xa0, 0xd8, 0xde, 0xdf, 0xdc, 0x39, 0x30, 0x7b, 0xcd, 0xec, 0x83, 0x8f, 0xa0, 0x39, - 0xeb, 0x8f, 0x4a, 0x38, 0xf0, 0x5e, 0xe6, 0xe9, 0x7b, 0xf0, 0xef, 0x73, 0x00, 0x71, 0xc0, 0x80, - 0x60, 0x35, 0x5b, 0xed, 0x7e, 0x7b, 0xf7, 0x40, 0x4c, 0xc3, 0x3c, 0xe8, 0x0b, 0x0e, 0x62, 0x76, - 0x3e, 0x6e, 0xde, 0x48, 0x2d, 0x39, 0x38, 0xec, 0x37, 0x33, 0x62, 0xc5, 0xba, 0xfb, 0xdd, 0x7e, - 0xb7, 0xbd, 0x6b, 0x99, 0x07, 0x47, 0xdd, 0xfd, 0x67, 0x94, 0x1b, 0x0b, 0xb9, 0xec, 0xd1, 0xe1, - 0xb6, 0x79, 0xb0, 0xdf, 0xb7, 0x7a, 0x3b, 0x47, 0xfd, 0x2d, 0xcc, 0xac, 0xb5, 0x69, 0x76, 0x0f, - 0xa9, 0xcd, 0xfc, 0xcb, 0x10, 0x44, 0xd3, 0x05, 0xb1, 0xe6, 0xcf, 0x0e, 0x7a, 0xbd, 0xee, 0xa1, - 0xf5, 0xf1, 0x51, 0xc7, 0xec, 0x76, 0x7a, 0x58, 0x71, 0x21, 0x05, 0x2e, 0xf0, 0x8b, 0x82, 0x37, - 0xf7, 0x77, 0x3f, 0x91, 0xcc, 0x53, 0xa0, 0x96, 0x92, 0x20, 0x81, 0x55, 0x16, 0x3c, 0x45, 0x70, - 0x9f, 0x94, 0x96, 0xe1, 0x9a, 0x32, 0x51, 0xaf, 0x22, 0xf8, 0xea, 0xdc, 0x66, 0x60, 0xb5, 0x6a, - 0x7a, 0x91, 0xa8, 0x85, 0x2c, 0x37, 0xba, 0xa0, 0xb6, 0xb6, 0x4c, 0xac, 0x50, 0x9f, 0x83, 0x0a, - 0xdc, 0x86, 0xd8, 0x28, 0xc1, 0x9e, 0x04, 0x4a, 0x53, 0x7d, 0x88, 0x92, 0xc5, 0x27, 0xbf, 0x9d, - 0x83, 0x3a, 0x05, 0x6f, 0xd1, 0x6f, 0x1d, 0x71, 0x9f, 0xed, 0x41, 0x51, 0xfe, 0x68, 0x16, 0x5b, - 0x89, 0xd2, 0x16, 0xe9, 0x3f, 0xd3, 0xb5, 0xbe, 0x3a, 0x0b, 0x96, 0xe2, 0xd8, 0xd2, 0xdf, 0xfe, - 0x93, 0xbf, 0xfc, 0xa7, 0xd9, 0x1a, 0xab, 0x3c, 0x3a, 0x7f, 0xff, 0xd1, 0x29, 0x77, 0x03, 0xd1, - 0xc6, 0xdf, 0x00, 0x88, 0x7f, 0x0a, 0x8a, 0xb5, 0x22, 0x27, 0xd4, 0xcc, 0xef, 0x64, 0xad, 0xdf, - 0x4c, 0x29, 0x91, 0xed, 0xde, 0xc4, 0x76, 0x97, 0x8c, 0xba, 0x68, 0xd7, 0x71, 0x9d, 0x90, 0x7e, - 0x16, 0xea, 0xc3, 0xcc, 0x03, 0x36, 0x84, 0xaa, 0xfe, 0x23, 0x4d, 0x4c, 0x49, 0x4a, 0x29, 0x3f, - 0x33, 0xb5, 0x7e, 0x2b, 0xb5, 0x4c, 0xc9, 0xa0, 0xd8, 0xc7, 0x8a, 0xd1, 0x14, 0x7d, 0x4c, 0x11, - 0x23, 0xee, 0x65, 0x44, 0x52, 0x79, 0xfc, 0x5b, 0x4c, 0xec, 0x0d, 0x4d, 0xae, 0x9a, 0xfb, 0x25, - 0xa8, 0xf5, 0xdb, 0xd7, 0x94, 0xca, 0xbe, 0x6e, 0x63, 0x5f, 0x6b, 0x06, 0x13, 0x7d, 0x0d, 0x10, - 0x47, 0xfd, 0x12, 0xd4, 0x87, 0x99, 0x07, 0x4f, 0xfe, 0xe2, 0x3e, 0x94, 0xa3, 0xc7, 0x9c, 0xec, - 0x37, 0xa1, 0x96, 0x88, 0xae, 0x63, 0x6a, 0x1a, 0x69, 0xc1, 0x78, 0xeb, 0x6f, 0xa4, 0x17, 0xca, - 0x8e, 0xdf, 0xc4, 0x8e, 0x5b, 0x6c, 0x55, 0x74, 0x2c, 0xa3, 0xd7, 0x1e, 0x61, 0x0c, 0x2a, 0x25, - 0x81, 0x7a, 0xa1, 0x69, 0x1f, 0xd4, 0xd9, 0x1b, 0xb3, 0x1a, 0x41, 0xa2, 0xb7, 0xdb, 0xd7, 0x94, - 0xca, 0xee, 0xde, 0xc0, 0xee, 0x56, 0xd9, 0xb2, 0xde, 0x9d, 0x7a, 0x7a, 0xc9, 0x38, 0x26, 0x5e, - 0xd3, 0x7f, 0xaa, 0x88, 0xdd, 0x8e, 0xd3, 0x64, 0xa5, 0xfc, 0x84, 0x51, 0x44, 0x22, 0xf3, 0xbf, - 0x63, 0x64, 0xb4, 0xb0, 0x2b, 0xc6, 0x70, 0xfb, 0xf4, 0x5f, 0x2a, 0x62, 0xc7, 0x50, 0xd1, 0xb2, - 0xfb, 0xb3, 0x9b, 0xd7, 0xfe, 0x12, 0xc1, 0xfa, 0x7a, 0x5a, 0x51, 0xda, 0x54, 0xf4, 0xf6, 0x1f, - 0x9d, 0x70, 0xce, 0x7e, 0x1d, 0xca, 0x51, 0xce, 0x78, 0xb6, 0xa6, 0xe5, 0xf0, 0xd7, 0x73, 0xdc, - 0xaf, 0xb7, 0xe6, 0x0b, 0xd2, 0x88, 0x4f, 0x6f, 0x5d, 0x10, 0xdf, 0xa7, 0x50, 0xd1, 0xf2, 0xc2, - 0x47, 0x13, 0x98, 0xcf, 0x3d, 0x1f, 0x4d, 0x20, 0x25, 0x8d, 0xbc, 0xb1, 0x88, 0x5d, 0x54, 0x58, - 0x19, 0xe9, 0x3b, 0xbc, 0xf4, 0x02, 0xb6, 0x0b, 0x2b, 0x52, 0xd3, 0x3a, 0xe6, 0x5f, 0x66, 0x1b, - 0x52, 0x7e, 0x1d, 0xea, 0x71, 0x86, 0x7d, 0x04, 0x25, 0x95, 0xfe, 0x9f, 0xad, 0xa6, 0xff, 0x8c, - 0xc1, 0xfa, 0xda, 0x1c, 0x5c, 0xaa, 0x45, 0x9f, 0x01, 0xc4, 0x49, 0xe8, 0x23, 0x26, 0x31, 0x97, - 0xd4, 0x3e, 0xa2, 0x80, 0xf9, 0x8c, 0xf5, 0xc6, 0x2a, 0x4e, 0xb0, 0xc9, 0x90, 0x49, 0xb8, 0xfc, - 0x42, 0x65, 0xc7, 0xfc, 0x11, 0x54, 0xb4, 0x3c, 0xf4, 0xd1, 0xf2, 0xcd, 0xe7, 0xb0, 0x8f, 0x96, - 0x2f, 0x25, 0x6d, 0xbd, 0xb1, 0x8e, 0xad, 0x2f, 0x1b, 0x0d, 0xd1, 0xba, 0x10, 0xb5, 0xa4, 0xc8, - 0x23, 0x36, 0xe8, 0x0c, 0x6a, 0x89, 0x64, 0xf3, 0xd1, 0x09, 0x4d, 0x4b, 0x65, 0x1f, 0x9d, 0xd0, - 0xd4, 0xfc, 0xf4, 0x8a, 0xce, 0x8c, 0x45, 0xd1, 0xcf, 0x39, 0xa2, 0x68, 0x3d, 0xfd, 0x10, 0x2a, - 0x5a, 0xe2, 0xf8, 0x68, 0x2e, 0xf3, 0x39, 0xea, 0xa3, 0xb9, 0xa4, 0xe5, 0x99, 0x5f, 0xc6, 0x3e, - 0xea, 0x06, 0x92, 0x02, 0xe6, 0xf7, 0x13, 0x6d, 0xff, 0x26, 0xd4, 0x93, 0xb9, 0xe4, 0xa3, 0xb3, - 0x9f, 0x9a, 0x94, 0x3e, 0x3a, 0xfb, 0xd7, 0x24, 0xa0, 0x97, 0x24, 0xfd, 0x60, 0x29, 0xea, 0xe4, - 0xd1, 0x4f, 0x64, 0x58, 0xca, 0x17, 0xec, 0x63, 0xc1, 0xe0, 0x64, 0x7a, 0x49, 0xb6, 0xa6, 0x51, - 0xad, 0x9e, 0xa7, 0x32, 0x3a, 0x2f, 0x73, 0x99, 0x28, 0x93, 0xc4, 0x8c, 0x8d, 0xb3, 0x67, 0xb0, - 0x14, 0x11, 0x73, 0x94, 0x2f, 0x32, 0x88, 0xe6, 0x90, 0x9a, 0x95, 0x72, 0xbd, 0x39, 0x5b, 0xfa, - 0x38, 0x43, 0xd7, 0x1f, 0x66, 0xe9, 0xd3, 0xae, 0x3f, 0x3d, 0x65, 0xa4, 0x76, 0xfd, 0x25, 0x92, - 0xf9, 0xcd, 0x5e, 0x7f, 0xa1, 0x23, 0xda, 0x70, 0xa1, 0x31, 0x9b, 0xbd, 0xf1, 0xf6, 0x75, 0xb9, - 0x0b, 0xa8, 0xf9, 0x37, 0x5f, 0x9e, 0xda, 0x20, 0xc9, 0x8a, 0x14, 0x37, 0x7d, 0x24, 0x1f, 0x9f, - 0xb0, 0xdf, 0x80, 0xaa, 0x9e, 0xc8, 0x9a, 0xe9, 0x3c, 0x61, 0xb6, 0xa7, 0x5b, 0xa9, 0x65, 0x49, - 0x2a, 0x61, 0x55, 0xbd, 0x1b, 0xf6, 0x09, 0xac, 0x46, 0xcb, 0xac, 0xc7, 0xad, 0x07, 0xec, 0x4e, - 0x4a, 0x34, 0x7b, 0x62, 0xb1, 0x6f, 0x5e, 0x1b, 0xee, 0xfe, 0x38, 0x23, 0xa8, 0x2f, 0x99, 0x51, - 0x37, 0xbe, 0x79, 0xd2, 0x12, 0x09, 0xc7, 0x37, 0x4f, 0x6a, 0x1a, 0x5e, 0x45, 0x7d, 0x6c, 0x29, - 0xb1, 0x46, 0xf4, 0x2c, 0x97, 0xfd, 0x10, 0x1a, 0x5a, 0x50, 0x7e, 0xef, 0xca, 0x1d, 0x44, 0x27, - 0x69, 0x3e, 0x25, 0xdc, 0x7a, 0x9a, 0x6d, 0xd2, 0x58, 0xc3, 0xf6, 0x17, 0x8d, 0xc4, 0xe2, 0x88, - 0x53, 0xb4, 0x09, 0x15, 0x3d, 0xe0, 0xff, 0x25, 0xed, 0xae, 0x69, 0x45, 0x7a, 0xf6, 0xb1, 0xc7, - 0x19, 0xb6, 0x0b, 0xcd, 0xd9, 0x64, 0x49, 0x11, 0x4f, 0x49, 0x4b, 0xf0, 0xb4, 0x3e, 0x53, 0x98, - 0x48, 0xb1, 0xc4, 0x0e, 0x29, 0xb0, 0x23, 0xfa, 0x29, 0x25, 0xcf, 0x9f, 0xbd, 0xd5, 0x93, 0x3f, - 0xb1, 0x14, 0xb5, 0x96, 0xf6, 0xe3, 0x5a, 0xf7, 0x33, 0x8f, 0x33, 0xec, 0x77, 0x33, 0x50, 0x4d, - 0x24, 0x28, 0x49, 0x3c, 0x9d, 0x9f, 0x99, 0x67, 0x4b, 0x2f, 0xd3, 0x27, 0x6a, 0x98, 0xb8, 0x88, - 0xbb, 0x0f, 0x7e, 0x90, 0xd8, 0xa4, 0x9f, 0x24, 0x5c, 0x7b, 0x0f, 0x67, 0x7f, 0x6b, 0xe9, 0x8b, - 0x59, 0x04, 0x3d, 0xd3, 0xdf, 0x17, 0x8f, 0x33, 0xec, 0x3f, 0x66, 0xa0, 0x9e, 0xf4, 0xd9, 0x47, - 0xd3, 0x4d, 0x7d, 0x1d, 0x10, 0x91, 0xd2, 0x35, 0x8e, 0xfe, 0x1f, 0xe2, 0x28, 0xfb, 0x0f, 0xcc, - 0xc4, 0x28, 0x65, 0x2e, 0xe8, 0x5f, 0x6c, 0xb4, 0xec, 0x43, 0xfa, 0x69, 0x43, 0xf5, 0x94, 0x89, - 0xcd, 0xff, 0x14, 0x5e, 0x44, 0x7e, 0xfa, 0x0f, 0xc7, 0xe1, 0x26, 0xfc, 0x88, 0x7e, 0x53, 0x48, - 0xbd, 0x8c, 0x11, 0x54, 0xfc, 0xba, 0xf5, 0x8d, 0x77, 0x70, 0x4e, 0x6f, 0x1a, 0x37, 0x13, 0x73, - 0x9a, 0x15, 0x3c, 0xda, 0x34, 0x3a, 0xf9, 0xbb, 0x6f, 0xf1, 0xcd, 0x39, 0xf7, 0x5b, 0x70, 0xd7, - 0x0f, 0x72, 0x4c, 0x83, 0x94, 0xe8, 0x89, 0xa3, 0xf6, 0x9a, 0xcd, 0x18, 0x0f, 0x70, 0xac, 0xef, - 0x18, 0x77, 0xae, 0x1d, 0xeb, 0x23, 0xf4, 0xbf, 0x8b, 0x11, 0x1f, 0x02, 0xc4, 0x4f, 0x0d, 0xd9, - 0xcc, 0x83, 0xb7, 0x88, 0x01, 0xcd, 0xbf, 0x46, 0x4c, 0x9e, 0x67, 0xf5, 0x2e, 0x4e, 0xb4, 0xf8, - 0xeb, 0xc4, 0x4e, 0xa3, 0xa7, 0x78, 0xba, 0xf4, 0x95, 0x7c, 0x15, 0x98, 0x90, 0xbe, 0x66, 0xdb, - 0x4f, 0x30, 0xd3, 0xe8, 0xdd, 0xdd, 0x11, 0xd4, 0x76, 0x3d, 0xef, 0xc5, 0x74, 0x12, 0x3d, 0x6f, - 0x4f, 0x3e, 0x8a, 0xd9, 0xb1, 0x83, 0xb3, 0xf5, 0x99, 0x59, 0x18, 0x77, 0xb1, 0xa9, 0x75, 0xd6, - 0xd2, 0x9a, 0x7a, 0xf4, 0x93, 0xf8, 0x7d, 0xe3, 0x17, 0xcc, 0x86, 0xc5, 0x88, 0x47, 0xc7, 0x6f, - 0x08, 0x93, 0xcd, 0x24, 0x38, 0xf3, 0x6c, 0x17, 0x09, 0x35, 0x41, 0x8d, 0xf6, 0x51, 0xa0, 0xda, - 0x7c, 0x9c, 0x61, 0x87, 0x50, 0xdd, 0xe2, 0x03, 0x0c, 0xd4, 0xc7, 0xa7, 0x25, 0x4b, 0x89, 0x67, - 0x0a, 0xf4, 0x26, 0x65, 0xbd, 0x96, 0x00, 0x26, 0xef, 0xad, 0x89, 0x7d, 0xe5, 0xf3, 0xcf, 0x1f, - 0xfd, 0x44, 0x3e, 0x5a, 0xf9, 0x42, 0xdd, 0x5b, 0xea, 0x51, 0x4f, 0xe2, 0xde, 0x9a, 0x79, 0x05, - 0x94, 0xb8, 0xb7, 0xe6, 0x5e, 0x01, 0x25, 0x96, 0x5a, 0x3d, 0x2a, 0x62, 0x23, 0x58, 0x9c, 0x7b, - 0x38, 0x14, 0x5d, 0x59, 0xd7, 0x3d, 0x37, 0x5a, 0xbf, 0x7b, 0x3d, 0x42, 0xb2, 0xb7, 0x07, 0xc9, - 0xde, 0x7a, 0x50, 0xa3, 0xe4, 0x83, 0xc7, 0x9c, 0x42, 0xf6, 0x66, 0xf2, 0xdd, 0xe8, 0xf1, 0x80, - 0xb3, 0x17, 0x0c, 0x96, 0x25, 0x25, 0x1c, 0x8c, 0x95, 0x63, 0xbf, 0x0e, 0x95, 0x67, 0x3c, 0x54, - 0x31, 0x7a, 0x91, 0x8c, 0x3d, 0x13, 0xb4, 0xb7, 0x9e, 0x12, 0xe2, 0x97, 0xa4, 0x19, 0x6c, 0xed, - 0x11, 0x1f, 0x9e, 0x72, 0x62, 0x4e, 0x96, 0x33, 0xfc, 0x82, 0xfd, 0x1a, 0x36, 0x1e, 0x85, 0x46, - 0xaf, 0x6a, 0x41, 0x58, 0x7a, 0xe3, 0x8d, 0x19, 0x78, 0x5a, 0xcb, 0xae, 0x37, 0xe4, 0x9a, 0xac, - 0xe7, 0x42, 0x45, 0x4b, 0xa1, 0x10, 0x1d, 0xa0, 0xf9, 0x94, 0x19, 0xd1, 0x01, 0x4a, 0xc9, 0xb8, - 0x60, 0xdc, 0xc7, 0x7e, 0x0c, 0x76, 0x37, 0xee, 0x87, 0xb2, 0x2c, 0xc4, 0x3d, 0x3d, 0xfa, 0x89, - 0x3d, 0x0e, 0xbf, 0x60, 0x9f, 0x62, 0x8a, 0x6f, 0x3d, 0x06, 0x31, 0x56, 0x1a, 0x66, 0xc3, 0x15, - 0xa3, 0xc5, 0xd2, 0x8a, 0x92, 0x8a, 0x04, 0x75, 0x85, 0x92, 0xdc, 0x53, 0x80, 0x5e, 0xe8, 0x4d, - 0xb6, 0x6c, 0x3e, 0xf6, 0xdc, 0x98, 0xd7, 0xc6, 0x51, 0x71, 0x31, 0xff, 0xd2, 0x42, 0xe3, 0xd8, - 0xa7, 0x9a, 0x96, 0x95, 0x08, 0xe3, 0x54, 0xc4, 0x75, 0x6d, 0xe0, 0x5c, 0xb4, 0x20, 0x29, 0xc1, - 0x73, 0x8f, 0x33, 0xac, 0x0d, 0x10, 0xbf, 0x1c, 0x8b, 0x74, 0xa6, 0xb9, 0x47, 0x69, 0x11, 0xdb, - 0x4b, 0x79, 0x66, 0x76, 0x08, 0xe5, 0xf8, 0xc9, 0xcd, 0x5a, 0x9c, 0x11, 0x26, 0xf1, 0x40, 0x27, - 0xba, 0xc1, 0xe7, 0x9e, 0xbb, 0x18, 0x4d, 0x5c, 0x2a, 0x60, 0x25, 0xb1, 0x54, 0x27, 0x9c, 0x07, - 0xcc, 0x81, 0x25, 0x1a, 0x60, 0x24, 0x2e, 0x61, 0x34, 0x57, 0x94, 0xc9, 0x7d, 0xfe, 0xe5, 0x49, - 0x74, 0x9a, 0x53, 0xdf, 0x4f, 0x24, 0x4c, 0x3f, 0x82, 0x5a, 0x29, 0x92, 0x4c, 0xb0, 0xe6, 0x31, - 0x2c, 0xce, 0xb9, 0xe8, 0xa3, 0x23, 0x7d, 0xdd, 0x9b, 0x8b, 0xe8, 0x48, 0x5f, 0xeb, 0xdd, 0x37, - 0x56, 0xb0, 0xcb, 0x86, 0x01, 0xa8, 0xea, 0x5d, 0x38, 0xe1, 0xe0, 0x4c, 0x74, 0xf7, 0xef, 0x32, - 0xb0, 0x94, 0xe2, 0x84, 0x67, 0x6f, 0x29, 0xab, 0xc1, 0xb5, 0x0e, 0xfa, 0xf5, 0x54, 0x67, 0xad, - 0xd1, 0xc3, 0x7e, 0xf6, 0xd8, 0xf3, 0xc4, 0xc5, 0x46, 0xbe, 0x52, 0x79, 0x32, 0x5f, 0x2a, 0x54, - 0xa4, 0x4a, 0x14, 0x9f, 0xc3, 0x1a, 0x0d, 0xa4, 0x3d, 0x1a, 0xcd, 0x38, 0x92, 0xdf, 0x9c, 0xfb, - 0xe9, 0xf3, 0x84, 0x73, 0x7c, 0xfd, 0xfa, 0x9f, 0x46, 0xbf, 0x46, 0x9c, 0xa6, 0xa1, 0xb2, 0x29, - 0x34, 0x67, 0x1d, 0xb4, 0xec, 0xfa, 0xb6, 0xd6, 0xef, 0x24, 0xf4, 0xdf, 0x14, 0xa7, 0xee, 0xd7, - 0xb0, 0xb3, 0x3b, 0xc6, 0x7a, 0xda, 0xba, 0x90, 0x4a, 0x2c, 0xf6, 0xe3, 0x6f, 0x45, 0xde, 0xe4, - 0x99, 0x79, 0xaa, 0x0e, 0xae, 0xf3, 0x7d, 0x47, 0x1a, 0x78, 0xba, 0x33, 0xfa, 0x5d, 0xec, 0xfe, - 0xae, 0x71, 0x2b, 0xad, 0x7b, 0x9f, 0xaa, 0x90, 0x2e, 0xbe, 0x36, 0x7b, 0xae, 0xd5, 0x08, 0xee, - 0xa6, 0xed, 0xf7, 0xb5, 0xba, 0xd0, 0xcc, 0x5a, 0xdf, 0x40, 0xd9, 0xae, 0xaa, 0x7b, 0x8f, 0xa3, - 0xe3, 0x93, 0xe2, 0xa6, 0x8e, 0x8e, 0x4f, 0x9a, 0xbb, 0x39, 0x29, 0xd7, 0x28, 0x47, 0xf3, 0x87, - 0x99, 0x07, 0x1b, 0xf7, 0x7e, 0xf8, 0xb5, 0x53, 0x27, 0x3c, 0x9b, 0x1e, 0x3f, 0x1c, 0x78, 0xe3, - 0x47, 0x23, 0x65, 0x6d, 0x94, 0x21, 0xcf, 0x8f, 0x46, 0xee, 0xf0, 0x11, 0x36, 0x7b, 0xbc, 0x30, - 0xf1, 0xbd, 0xd0, 0xfb, 0xd6, 0xff, 0x0b, 0x00, 0x00, 0xff, 0xff, 0x0d, 0x5f, 0xbc, 0x91, 0xdd, - 0x81, 0x00, 0x00, + // 11345 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, 0xed, 0xe8, 0x5b, 0x4d, 0x0f, 0x87, 0x33, 0x4c, + 0x72, 0xc9, 0xd9, 0xe1, 0x6e, 0xcf, 0x70, 0x76, 0xc9, 0x5d, 0x91, 0x9f, 0x56, 0x5b, 0xdd, 0x5d, + 0x3d, 0x5d, 0x3b, 0x7d, 0x63, 0x56, 0x35, 0x29, 0xae, 0x3e, 0x39, 0x37, 0xbb, 0x2a, 0xba, 0x3b, + 0x35, 0x55, 0x99, 0xc5, 0xcc, 0xac, 0xbe, 0xec, 0x82, 0x7e, 0x30, 0x6c, 0xc1, 0x30, 0x6c, 0x03, + 0x82, 0x2d, 0x03, 0x96, 0x2d, 0xd8, 0xb0, 0x61, 0x18, 0x86, 0x01, 0x41, 0xc6, 0xca, 0x80, 0x1f, + 0xfc, 0xae, 0x17, 0x1b, 0x82, 0x21, 0xf9, 0xc5, 0x10, 0x04, 0xc8, 0x97, 0xf5, 0x9b, 0xa1, 0x9f, + 0x60, 0xc4, 0x39, 0x11, 0x99, 0x91, 0x55, 0xd9, 0x33, 0xc3, 0x5d, 0x7a, 0x5f, 0x66, 0x3a, 0x4f, + 0x9c, 0xb8, 0x9f, 0x38, 0x71, 0xae, 0x51, 0x50, 0xf6, 0x27, 0x83, 0x8d, 0x89, 0xef, 0x85, 0x1e, + 0x2b, 0x8c, 0x5c, 0x7f, 0x32, 0x58, 0x7f, 0xed, 0xcc, 0xf3, 0xce, 0x46, 0xfc, 0x91, 0x3d, 0x71, + 0x1e, 0xd9, 0xae, 0xeb, 0x85, 0x76, 0xe8, 0x78, 0x6e, 0x40, 0x48, 0xc6, 0x8f, 0xa0, 0xfe, 0x94, + 0xbb, 0x3d, 0xce, 0x87, 0x26, 0xff, 0x7c, 0xca, 0x83, 0x90, 0xbd, 0x0b, 0x8b, 0x36, 0xff, 0x31, + 0xe7, 0x43, 0x6b, 0x62, 0x07, 0xc1, 0xe4, 0xdc, 0xb7, 0x03, 0xde, 0xca, 0xdc, 0xcf, 0x3c, 0xa8, + 0x9a, 0x4d, 0x2a, 0x38, 0x8a, 0xe0, 0xec, 0x0d, 0xa8, 0x06, 0x02, 0x95, 0xbb, 0xa1, 0xef, 0x4d, + 0xae, 0x5b, 0x59, 0xc4, 0xab, 0x08, 0x58, 0x87, 0x40, 0xc6, 0x08, 0x1a, 0x51, 0x0f, 0xc1, 0xc4, + 0x73, 0x03, 0xce, 0x1e, 0xc3, 0xf2, 0xc0, 0x99, 0x9c, 0x73, 0xdf, 0xc2, 0xca, 0x63, 0x97, 0x8f, + 0x3d, 0xd7, 0x19, 0xb4, 0x32, 0xf7, 0x73, 0x0f, 0xca, 0x26, 0xa3, 0x32, 0x51, 0x63, 0x5f, 0x96, + 0xb0, 0x77, 0xa0, 0xc1, 0x5d, 0x82, 0xf3, 0x21, 0xd6, 0x92, 0x5d, 0xd5, 0x63, 0xb0, 0xa8, 0x60, + 0xfc, 0xed, 0x2c, 0x2c, 0x76, 0x5d, 0x27, 0xfc, 0xd4, 0x1e, 0x8d, 0x78, 0xa8, 0xe6, 0xf4, 0x0e, + 0x34, 0x2e, 0x11, 0x80, 0x73, 0xba, 0xf4, 0xfc, 0xa1, 0x9c, 0x51, 0x9d, 0xc0, 0x47, 0x12, 0x7a, + 0xe3, 0xc8, 0xb2, 0x37, 0x8e, 0x2c, 0x75, 0xb9, 0x72, 0x37, 0x2c, 0xd7, 0x3b, 0xd0, 0xf0, 0xf9, + 0xc0, 0xbb, 0xe0, 0xfe, 0xb5, 0x75, 0xe9, 0xb8, 0x43, 0xef, 0xb2, 0x95, 0xbf, 0x9f, 0x79, 0x50, + 0x30, 0xeb, 0x0a, 0xfc, 0x29, 0x42, 0xd9, 0x26, 0x34, 0x06, 0xe7, 0xb6, 0xeb, 0xf2, 0x91, 0x75, + 0x62, 0x0f, 0x9e, 0x4f, 0x27, 0x41, 0xab, 0x70, 0x3f, 0xf3, 0xa0, 0xf2, 0xe4, 0xf6, 0x06, 0xee, + 0xea, 0xc6, 0xd6, 0xb9, 0xed, 0x6e, 0x62, 0x49, 0xcf, 0xb5, 0x27, 0xc1, 0xb9, 0x17, 0x9a, 0x75, + 0x59, 0x83, 0xc0, 0x81, 0xb1, 0x0c, 0x4c, 0x5f, 0x09, 0x5a, 0x7b, 0xe3, 0xdf, 0x66, 0x60, 0xe9, + 0xd8, 0x1d, 0x79, 0x83, 0xe7, 0x3f, 0xe7, 0x12, 0xa5, 0xcc, 0x21, 0xfb, 0xaa, 0x73, 0xc8, 0x7d, + 0xd9, 0x39, 0xac, 0xc2, 0x72, 0x72, 0xb0, 0x72, 0x16, 0x1c, 0x56, 0x44, 0xed, 0x33, 0xae, 0x86, + 0xa5, 0xa6, 0xf1, 0x75, 0x68, 0x0e, 0xa6, 0xbe, 0xcf, 0xdd, 0xb9, 0x79, 0x34, 0x24, 0x3c, 0x9a, + 0xc8, 0x1b, 0x50, 0x75, 0xf9, 0x65, 0x8c, 0x26, 0x69, 0xd7, 0xe5, 0x97, 0x0a, 0xc5, 0x68, 0xc1, + 0xea, 0x6c, 0x37, 0x72, 0x00, 0x3f, 0xcb, 0x40, 0xfe, 0x38, 0xbc, 0xf2, 0xd8, 0xfb, 0x50, 0xb5, + 0x87, 0x43, 0x9f, 0x07, 0x81, 0x15, 0x5e, 0x4f, 0xe8, 0xa4, 0xd4, 0x9f, 0x30, 0x39, 0xc5, 0x36, + 0x15, 0xf5, 0xaf, 0x27, 0xdc, 0xac, 0xd8, 0xf1, 0x07, 0x6b, 0x41, 0x51, 0x7e, 0x62, 0xbf, 0x65, + 0x53, 0x7d, 0xb2, 0xbb, 0x00, 0xf6, 0xd8, 0x9b, 0xba, 0xa1, 0x15, 0xd8, 0x21, 0xae, 0x58, 0xce, + 0x2c, 0x13, 0xa4, 0x67, 0x87, 0xec, 0x0e, 0x94, 0x27, 0xcf, 0xad, 0x60, 0xe0, 0x3b, 0x93, 0x10, + 0x89, 0xa7, 0x6c, 0x96, 0x26, 0xcf, 0x7b, 0xf8, 0xcd, 0xde, 0x85, 0x92, 0x37, 0x0d, 0x27, 0x9e, + 0xe3, 0x86, 0x92, 0x5e, 0x1a, 0x72, 0x20, 0x87, 0xd3, 0xf0, 0x48, 0x80, 0xcd, 0x08, 0x81, 0xbd, + 0x05, 0xb5, 0x81, 0xe7, 0x9e, 0x3a, 0xfe, 0x98, 0x38, 0x42, 0x6b, 0x01, 0xfb, 0x4a, 0x02, 0x8d, + 0x3f, 0xcc, 0x42, 0xa5, 0xef, 0xdb, 0x6e, 0x60, 0x0f, 0x04, 0x80, 0xad, 0x41, 0x31, 0xbc, 0xb2, + 0xce, 0xed, 0xe0, 0x1c, 0xa7, 0x5a, 0x36, 0x17, 0xc2, 0xab, 0x5d, 0x3b, 0x38, 0x67, 0xab, 0xb0, + 0x40, 0xa3, 0xc4, 0x09, 0xe5, 0x4c, 0xf9, 0x25, 0x0e, 0x88, 0x3b, 0x1d, 0x5b, 0xc9, 0xae, 0x72, + 0x48, 0x31, 0x4d, 0x77, 0x3a, 0xde, 0xd2, 0xe1, 0x62, 0xf2, 0x27, 0x62, 0xbb, 0xa9, 0x03, 0x9a, + 0x5e, 0x19, 0x21, 0xd8, 0xc7, 0x1b, 0x50, 0x95, 0xc5, 0xdc, 0x39, 0x3b, 0xa7, 0x39, 0x16, 0xcc, + 0x0a, 0x21, 0x20, 0x48, 0xb4, 0x10, 0x3a, 0x63, 0x6e, 0x05, 0xa1, 0x3d, 0x9e, 0xc8, 0x29, 0x95, + 0x05, 0xa4, 0x27, 0x00, 0x58, 0xec, 0x85, 0xf6, 0xc8, 0x3a, 0xe5, 0x3c, 0x68, 0x15, 0x65, 0xb1, + 0x80, 0xec, 0x70, 0x1e, 0xb0, 0xaf, 0x41, 0x7d, 0xc8, 0x83, 0xd0, 0x92, 0x9b, 0xc1, 0x83, 0x56, + 0x09, 0x4f, 0x7e, 0x4d, 0x40, 0xdb, 0x0a, 0xc8, 0x5e, 0x03, 0xf0, 0xed, 0x4b, 0x4b, 0x2c, 0x04, + 0xbf, 0x6a, 0x95, 0x69, 0x17, 0x7c, 0xfb, 0xb2, 0x7f, 0xb5, 0xcb, 0xaf, 0x04, 0xd5, 0x3c, 0xe5, + 0xa1, 0xb6, 0x68, 0x81, 0xa4, 0x4e, 0x63, 0x0f, 0x98, 0x06, 0xde, 0xe6, 0xa1, 0xed, 0x8c, 0x02, + 0xf6, 0x01, 0x54, 0x43, 0x0d, 0x19, 0xd9, 0x60, 0x25, 0x22, 0x21, 0xad, 0x82, 0x99, 0xc0, 0x33, + 0xce, 0xa1, 0xb4, 0xc3, 0xf9, 0x9e, 0x33, 0x76, 0x42, 0xb6, 0x0a, 0x85, 0x53, 0xe7, 0x8a, 0x13, + 0xb1, 0xe7, 0x76, 0x6f, 0x99, 0xf4, 0xc9, 0xee, 0x01, 0xe0, 0x1f, 0xd6, 0x38, 0xa2, 0xa6, 0xdd, + 0x5b, 0x66, 0x19, 0x61, 0xfb, 0x81, 0x1d, 0xb2, 0x75, 0x28, 0x4e, 0xb8, 0x3f, 0xe0, 0x6a, 0xdf, + 0x76, 0x6f, 0x99, 0x0a, 0xb0, 0x59, 0x84, 0xc2, 0x48, 0xb4, 0x6e, 0xfc, 0x71, 0x01, 0x2a, 0x3d, + 0xee, 0x46, 0xa7, 0x8c, 0x41, 0x5e, 0x2c, 0x88, 0x3c, 0x59, 0xf8, 0x37, 0x7b, 0x13, 0x2a, 0xb8, + 0x74, 0x41, 0xe8, 0x3b, 0xee, 0x19, 0x51, 0xf5, 0x66, 0xb6, 0x95, 0x31, 0x41, 0x80, 0x7b, 0x08, + 0x65, 0x4d, 0xc8, 0xd9, 0x63, 0x45, 0xd5, 0xe2, 0x4f, 0x76, 0x1b, 0x4a, 0xf6, 0x38, 0xa4, 0xe1, + 0x55, 0x11, 0x5c, 0xb4, 0xc7, 0x21, 0x0e, 0xed, 0x0d, 0xa8, 0x4e, 0xec, 0xeb, 0xb1, 0x38, 0xcb, + 0x11, 0x39, 0x54, 0xcd, 0x8a, 0x84, 0x21, 0x41, 0x3c, 0x81, 0x25, 0x1d, 0x45, 0x75, 0x5e, 0x88, + 0x3a, 0x5f, 0xd4, 0xb0, 0xe5, 0x18, 0xde, 0x81, 0x86, 0xaa, 0xe3, 0xd3, 0x7c, 0x90, 0x4c, 0xca, + 0x66, 0x5d, 0x82, 0xd5, 0x2c, 0x1f, 0x40, 0xf3, 0xd4, 0x71, 0xed, 0x91, 0x35, 0x18, 0x85, 0x17, + 0xd6, 0x90, 0x8f, 0x42, 0x1b, 0x29, 0xa6, 0x60, 0xd6, 0x11, 0xbe, 0x35, 0x0a, 0x2f, 0xb6, 0x05, + 0x94, 0x7d, 0x03, 0xca, 0xa7, 0x9c, 0x5b, 0xb8, 0x58, 0xad, 0x52, 0xe2, 0xe0, 0xa9, 0x1d, 0x32, + 0x4b, 0xa7, 0x6a, 0xaf, 0xbe, 0x01, 0x4d, 0x6f, 0x1a, 0x9e, 0x79, 0x8e, 0x7b, 0x66, 0x09, 0x7e, + 0x67, 0x39, 0x43, 0xa4, 0xa1, 0xfc, 0x66, 0xf6, 0x71, 0xc6, 0xac, 0xab, 0x32, 0xc1, 0x79, 0xba, + 0x43, 0xf6, 0x36, 0x34, 0x46, 0x76, 0x10, 0x5a, 0xe7, 0xde, 0xc4, 0x9a, 0x4c, 0x4f, 0x9e, 0xf3, + 0xeb, 0x56, 0x0d, 0x17, 0xa2, 0x26, 0xc0, 0xbb, 0xde, 0xe4, 0x08, 0x81, 0x82, 0xb2, 0x71, 0x9c, + 0x34, 0x08, 0xb8, 0x9f, 0x79, 0x50, 0x33, 0xcb, 0x02, 0x42, 0x9d, 0x7e, 0x06, 0x4b, 0xb8, 0x3d, + 0x83, 0x69, 0x10, 0x7a, 0x63, 0x4b, 0xf0, 0x6a, 0x7f, 0x18, 0xb4, 0x2a, 0x48, 0x6b, 0x5f, 0x97, + 0x83, 0xd5, 0xf6, 0x78, 0x63, 0x9b, 0x07, 0xe1, 0x16, 0x22, 0x9b, 0x84, 0x2b, 0x2e, 0xf4, 0x6b, + 0x73, 0x71, 0x38, 0x0b, 0x67, 0xdf, 0x00, 0x66, 0x8f, 0x46, 0xde, 0xa5, 0x15, 0xf0, 0xd1, 0xa9, + 0x25, 0x17, 0xb1, 0x55, 0xbf, 0x9f, 0x79, 0x50, 0x32, 0x9b, 0x58, 0xd2, 0xe3, 0xa3, 0xd3, 0x23, + 0x82, 0xb3, 0x0f, 0x00, 0x0f, 0x93, 0x75, 0xca, 0xed, 0x70, 0xea, 0xf3, 0xa0, 0xd5, 0xb8, 0x9f, + 0x7b, 0x50, 0x7f, 0xb2, 0x18, 0xad, 0x17, 0x82, 0x37, 0x9d, 0xd0, 0xac, 0x0a, 0x3c, 0xf9, 0x1d, + 0xac, 0x6f, 0xc3, 0x6a, 0xfa, 0x90, 0x04, 0x51, 0x89, 0x55, 0x11, 0xc4, 0x98, 0x37, 0xc5, 0x9f, + 0x6c, 0x19, 0x0a, 0x17, 0xf6, 0x68, 0xca, 0x25, 0x4f, 0xa7, 0x8f, 0x0f, 0xb3, 0xdf, 0xcd, 0x18, + 0x7f, 0x94, 0x81, 0x2a, 0xcd, 0x52, 0xca, 0x22, 0x6f, 0x42, 0x4d, 0x51, 0x03, 0xf7, 0x7d, 0xcf, + 0x97, 0x5c, 0x4d, 0x51, 0x5e, 0x47, 0xc0, 0xc4, 0xad, 0xa2, 0x90, 0x26, 0x3e, 0x77, 0xc6, 0xf6, + 0x99, 0x6a, 0x5a, 0x91, 0xd2, 0x91, 0x04, 0xb3, 0xf7, 0xe2, 0xf6, 0x7c, 0x6f, 0x1a, 0x72, 0x79, + 0xe7, 0x55, 0xe5, 0xf4, 0x4c, 0x01, 0x8b, 0x5a, 0xc7, 0xaf, 0x57, 0xa0, 0x73, 0xe3, 0x77, 0x33, + 0xc0, 0xc4, 0xb0, 0xfb, 0x1e, 0x35, 0x20, 0x29, 0x74, 0xb6, 0x66, 0xe6, 0x95, 0x4f, 0x48, 0xf6, + 0x45, 0x27, 0xc4, 0x80, 0x02, 0x8d, 0x3d, 0x9f, 0x32, 0x76, 0x2a, 0xfa, 0x41, 0xbe, 0x94, 0x6b, + 0xe6, 0x8d, 0xff, 0x96, 0x83, 0xe5, 0x2d, 0xba, 0xb2, 0xdb, 0x83, 0x01, 0x9f, 0x44, 0x67, 0xe7, + 0x1e, 0x54, 0x5c, 0x6f, 0xc8, 0x15, 0xc5, 0xd2, 0xc0, 0x40, 0x80, 0x34, 0x72, 0x3d, 0xb7, 0x1d, + 0x97, 0x06, 0x4e, 0x8b, 0x59, 0x46, 0x08, 0x0e, 0xfb, 0x6d, 0x68, 0x4c, 0xb8, 0x3b, 0xd4, 0x8f, + 0x08, 0x09, 0x55, 0x35, 0x09, 0x96, 0xa7, 0xe3, 0x1e, 0x54, 0x4e, 0xa7, 0x84, 0x27, 0x18, 0x4b, + 0x1e, 0x69, 0x00, 0x24, 0xa8, 0x4d, 0xfc, 0x65, 0x32, 0x0d, 0xce, 0xb1, 0xb4, 0x80, 0xa5, 0x45, + 0xf1, 0x2d, 0x8a, 0xee, 0x02, 0x0c, 0xa7, 0x41, 0x28, 0x4f, 0xcc, 0x02, 0x16, 0x96, 0x05, 0x84, + 0x4e, 0xcc, 0x37, 0x61, 0x69, 0x6c, 0x5f, 0x59, 0x48, 0x3b, 0x96, 0xe3, 0x5a, 0xa7, 0x23, 0xbc, + 0x73, 0x8a, 0x88, 0xd7, 0x1c, 0xdb, 0x57, 0x9f, 0x88, 0x92, 0xae, 0xbb, 0x83, 0x70, 0xc1, 0x56, + 0x94, 0xb8, 0xe3, 0xf3, 0x80, 0xfb, 0x17, 0x1c, 0x39, 0x41, 0x3e, 0x92, 0x69, 0x4c, 0x82, 0x8a, + 0x11, 0x8d, 0xc5, 0xbc, 0xc3, 0xd1, 0x80, 0x8e, 0xbd, 0x59, 0x1c, 0x3b, 0xee, 0x6e, 0x38, 0x1a, + 0x88, 0x7b, 0x45, 0xf0, 0x91, 0x09, 0xf7, 0xad, 0xe7, 0x97, 0x78, 0x86, 0xf3, 0xc8, 0x37, 0x8e, + 0xb8, 0xff, 0xec, 0x52, 0x5c, 0xfd, 0x83, 0x00, 0x19, 0x91, 0x7d, 0xdd, 0xaa, 0xe0, 0x01, 0x2f, + 0x0d, 0x02, 0xc1, 0x82, 0xec, 0x6b, 0x71, 0x08, 0xc5, 0x68, 0x6d, 0xdc, 0x05, 0x3e, 0xc4, 0xe6, + 0x03, 0xe4, 0xa8, 0x35, 0x1c, 0x6c, 0x5b, 0x16, 0x88, 0x7e, 0x02, 0x41, 0xf5, 0x6a, 0xb0, 0xa7, + 0x23, 0xfb, 0x2c, 0x40, 0x96, 0x52, 0x33, 0xab, 0x12, 0xb8, 0x23, 0x60, 0xc6, 0xa7, 0x24, 0x64, + 0x69, 0x7b, 0x2b, 0xcf, 0x8c, 0xb8, 0xea, 0x11, 0x82, 0xfb, 0x5a, 0x32, 0xe5, 0x57, 0xda, 0xa6, + 0x65, 0x53, 0x36, 0xcd, 0xf8, 0xfd, 0x0c, 0x54, 0x65, 0xcb, 0x28, 0x94, 0xb0, 0x0d, 0x60, 0x6a, + 0x17, 0xc3, 0x2b, 0x67, 0x68, 0x9d, 0x5c, 0x87, 0x3c, 0x20, 0xa2, 0xd9, 0xbd, 0x65, 0x36, 0x65, + 0x59, 0xff, 0xca, 0x19, 0x6e, 0x8a, 0x12, 0xf6, 0x10, 0x9a, 0x09, 0xfc, 0x20, 0xf4, 0x89, 0xa2, + 0x77, 0x6f, 0x99, 0x75, 0x0d, 0xbb, 0x17, 0xfa, 0xe2, 0x8c, 0x08, 0x91, 0x67, 0x1a, 0x5a, 0x8e, + 0x3b, 0xe4, 0x57, 0x48, 0x46, 0x35, 0xb3, 0x42, 0xb0, 0xae, 0x00, 0x6d, 0xd6, 0xa1, 0xaa, 0x37, + 0x67, 0x9c, 0x41, 0x49, 0xc9, 0x4b, 0x28, 0x30, 0xcc, 0x0c, 0xc9, 0x2c, 0x87, 0xd1, 0x48, 0x6e, + 0x43, 0x29, 0x39, 0x02, 0xb3, 0x18, 0xbe, 0x72, 0xc7, 0xc6, 0xf7, 0xa0, 0xb9, 0x27, 0x88, 0xc7, + 0x15, 0xc4, 0x2a, 0xe5, 0xbf, 0x55, 0x58, 0xd0, 0x0e, 0x4d, 0xd9, 0x94, 0x5f, 0xe2, 0xce, 0x3d, + 0xf7, 0x82, 0x50, 0xf6, 0x82, 0x7f, 0x1b, 0x7f, 0x9c, 0x01, 0xd6, 0x09, 0x42, 0x67, 0x6c, 0x87, + 0x7c, 0x87, 0x47, 0x6c, 0xe1, 0x10, 0xaa, 0xa2, 0xb5, 0xbe, 0xd7, 0x26, 0x81, 0x8c, 0x04, 0x8a, + 0x77, 0xe5, 0x31, 0x9e, 0xaf, 0xb0, 0xa1, 0x63, 0x13, 0x9b, 0x4f, 0x34, 0x20, 0x4e, 0x59, 0x68, + 0xfb, 0x67, 0x3c, 0x44, 0x31, 0x4e, 0xca, 0xfb, 0x40, 0x20, 0x21, 0xc0, 0xad, 0xff, 0x1a, 0x2c, + 0xce, 0xb5, 0xa1, 0xf3, 0xe5, 0x72, 0x0a, 0x5f, 0xce, 0xe9, 0x7c, 0xd9, 0x82, 0xa5, 0xc4, 0xb8, + 0x24, 0xa5, 0xad, 0x41, 0x51, 0x1c, 0x08, 0x21, 0x1c, 0x64, 0x48, 0xaa, 0x3c, 0xe5, 0x5c, 0x88, + 0xc1, 0x8f, 0x60, 0xf9, 0x94, 0x73, 0xdf, 0x0e, 0xb1, 0x10, 0x4f, 0x8c, 0xd8, 0x21, 0xd9, 0xf0, + 0xa2, 0x2c, 0xeb, 0xd9, 0xe1, 0x11, 0xf7, 0xc5, 0x4e, 0x19, 0xff, 0x23, 0x03, 0x0d, 0xc1, 0x41, + 0xf7, 0x6d, 0xf7, 0x5a, 0xad, 0xd3, 0x5e, 0xea, 0x3a, 0x3d, 0xd0, 0x2e, 0x43, 0x0d, 0xfb, 0xcb, + 0x2e, 0x52, 0x6e, 0x76, 0x91, 0xd8, 0x7d, 0xa8, 0x26, 0xc6, 0x5a, 0xc0, 0xb1, 0x42, 0x10, 0x0d, + 0xf2, 0x17, 0x5f, 0xc6, 0xb7, 0xa1, 0x19, 0x0f, 0x5b, 0xae, 0x21, 0x83, 0xbc, 0x20, 0x49, 0xd9, + 0x00, 0xfe, 0x6d, 0xfc, 0xd3, 0x0c, 0x21, 0x6e, 0x79, 0x4e, 0x24, 0x9d, 0x0a, 0x44, 0x21, 0xf7, + 0x2a, 0x44, 0xf1, 0xf7, 0x8d, 0x52, 0xfd, 0x2f, 0x3e, 0x59, 0x71, 0x74, 0x02, 0xee, 0x0e, 0x2d, + 0x7b, 0x34, 0x42, 0xe6, 0x5b, 0x32, 0x8b, 0xe2, 0xbb, 0x3d, 0x1a, 0x19, 0xef, 0xc0, 0xa2, 0x36, + 0xba, 0x17, 0xcc, 0xe3, 0x00, 0xd8, 0x9e, 0x13, 0x84, 0xc7, 0x6e, 0x30, 0xd1, 0x04, 0xb7, 0x3b, + 0x50, 0x16, 0x1c, 0x56, 0x8c, 0x8c, 0x8e, 0x6c, 0xc1, 0x14, 0x2c, 0x57, 0x8c, 0x2b, 0xc0, 0x42, + 0xfb, 0x4a, 0x16, 0x66, 0x65, 0xa1, 0x7d, 0x85, 0x85, 0xc6, 0x77, 0x61, 0x29, 0xd1, 0x9e, 0xec, + 0xfa, 0x0d, 0x28, 0x4c, 0xc3, 0x2b, 0x4f, 0x89, 0xe6, 0x15, 0x49, 0x21, 0x42, 0x01, 0x34, 0xa9, + 0xc4, 0xf8, 0x08, 0x16, 0x0f, 0xf8, 0xa5, 0x3c, 0xc4, 0x6a, 0x20, 0x6f, 0x43, 0xfe, 0x25, 0x4a, + 0x21, 0x96, 0x1b, 0x1b, 0xc0, 0xf4, 0xca, 0xb2, 0x57, 0x4d, 0x47, 0xcc, 0x24, 0x74, 0x44, 0xe3, + 0x6d, 0x60, 0x3d, 0xe7, 0xcc, 0xdd, 0xe7, 0x41, 0x60, 0x9f, 0x45, 0xc7, 0xbe, 0x09, 0xb9, 0x71, + 0x70, 0x26, 0x79, 0x94, 0xf8, 0xd3, 0xf8, 0x16, 0x2c, 0x25, 0xf0, 0x64, 0xc3, 0xaf, 0x41, 0x39, + 0x70, 0xce, 0x5c, 0x14, 0xac, 0x64, 0xd3, 0x31, 0xc0, 0xd8, 0x81, 0xe5, 0x4f, 0xb8, 0xef, 0x9c, + 0x5e, 0xbf, 0xac, 0xf9, 0x64, 0x3b, 0xd9, 0xd9, 0x76, 0x3a, 0xb0, 0x32, 0xd3, 0x8e, 0xec, 0x9e, + 0xc8, 0x57, 0xee, 0x64, 0xc9, 0xa4, 0x0f, 0x8d, 0xef, 0x65, 0x75, 0xbe, 0x67, 0x1c, 0x03, 0xdb, + 0xf2, 0x5c, 0x97, 0x0f, 0xc2, 0x23, 0xce, 0xfd, 0xd8, 0x4a, 0x15, 0xd3, 0x6a, 0xe5, 0xc9, 0x9a, + 0x5c, 0xd9, 0x59, 0x66, 0x2a, 0x89, 0x98, 0x41, 0x7e, 0xc2, 0xfd, 0x31, 0x36, 0x5c, 0x32, 0xf1, + 0x6f, 0x63, 0x05, 0x96, 0x12, 0xcd, 0x4a, 0xbd, 0xfe, 0x31, 0xac, 0x6c, 0x3b, 0xc1, 0x60, 0xbe, + 0xc3, 0x35, 0x28, 0x4e, 0xa6, 0x27, 0x56, 0x92, 0x2f, 0x3f, 0xe3, 0xd7, 0x42, 0xdb, 0x9b, 0xad, + 0x21, 0xdb, 0xfa, 0x9b, 0x19, 0xc8, 0xef, 0xf6, 0xf7, 0xb6, 0xd8, 0x3a, 0x94, 0x1c, 0x77, 0xe0, + 0x8d, 0x85, 0xe0, 0x45, 0x73, 0x8e, 0xbe, 0x6f, 0x3c, 0x60, 0x77, 0xa0, 0x8c, 0xf2, 0x9a, 0x50, + 0x6d, 0xa5, 0xe8, 0x53, 0x12, 0x80, 0x3d, 0x6f, 0xf0, 0x5c, 0xe8, 0xd4, 0xfc, 0x6a, 0xe2, 0xf8, + 0xa8, 0x35, 0x2b, 0x65, 0x38, 0x4f, 0x77, 0x7d, 0x5c, 0x40, 0x1a, 0xb1, 0xf1, 0x57, 0x45, 0x28, + 0xca, 0xdb, 0x96, 0x6e, 0xee, 0xd0, 0xb9, 0xe0, 0xf1, 0xcd, 0x2d, 0xbe, 0x84, 0x3c, 0xe0, 0xf3, + 0xb1, 0x17, 0x46, 0x02, 0x1b, 0xed, 0x41, 0x95, 0x80, 0x52, 0x64, 0xd3, 0x84, 0x06, 0x32, 0x31, + 0xe4, 0x08, 0x69, 0xa0, 0x5f, 0xe5, 0x77, 0xa0, 0xa8, 0xee, 0xfe, 0x7c, 0xa4, 0xd3, 0x2c, 0x0c, + 0x48, 0x5a, 0x5b, 0x87, 0xd2, 0xc0, 0x9e, 0xd8, 0x03, 0x27, 0xbc, 0x96, 0x0c, 0x21, 0xfa, 0x16, + 0xad, 0x8f, 0xbc, 0x81, 0x3d, 0xb2, 0x4e, 0xec, 0x91, 0xed, 0x0e, 0xb8, 0xd4, 0xdd, 0xab, 0x08, + 0xdc, 0x24, 0x98, 0xd0, 0xcf, 0xe5, 0x38, 0x15, 0x16, 0xa9, 0xf0, 0x72, 0xf4, 0x0a, 0x4d, 0x08, + 0x97, 0xde, 0x78, 0xec, 0x08, 0x2d, 0x83, 0xc4, 0xb0, 0x9c, 0x59, 0x26, 0xc8, 0x0e, 0xc7, 0xd9, + 0xca, 0xe2, 0x4b, 0x5a, 0xba, 0x32, 0x75, 0x45, 0xc0, 0x4f, 0xc9, 0x90, 0x30, 0x2f, 0x8b, 0xe5, + 0x34, 0x59, 0xec, 0x5d, 0x58, 0x9c, 0xba, 0x01, 0x0f, 0xc3, 0x11, 0x1f, 0x46, 0x63, 0xa9, 0x20, + 0x52, 0x33, 0x2a, 0x50, 0xc3, 0xd9, 0x80, 0x25, 0x32, 0x3a, 0x04, 0x76, 0xe8, 0x05, 0xe7, 0x4e, + 0x60, 0x05, 0x42, 0x43, 0x22, 0x75, 0x77, 0x11, 0x8b, 0x7a, 0xb2, 0xa4, 0x47, 0x2a, 0xd2, 0xda, + 0x0c, 0xbe, 0xcf, 0x07, 0xdc, 0xb9, 0xe0, 0x43, 0x94, 0xd3, 0x72, 0xe6, 0x4a, 0xa2, 0x8e, 0x29, + 0x0b, 0x51, 0xe8, 0x9e, 0x8e, 0xad, 0xe9, 0x64, 0x68, 0x0b, 0x61, 0xa5, 0x4e, 0xc2, 0xb0, 0x3b, + 0x1d, 0x1f, 0x13, 0x84, 0x3d, 0x06, 0x25, 0x89, 0x49, 0xf9, 0xb0, 0x91, 0xe0, 0x67, 0x82, 0x58, + 0xcd, 0xaa, 0xc4, 0x20, 0x41, 0x31, 0x21, 0x73, 0x36, 0x67, 0x64, 0xce, 0x16, 0x14, 0x27, 0xbe, + 0x73, 0x61, 0x87, 0xbc, 0xb5, 0x48, 0x0c, 0x5c, 0x7e, 0x0a, 0xce, 0xe0, 0xb8, 0x4e, 0xe8, 0xd8, + 0xa1, 0xe7, 0xb7, 0x18, 0x96, 0xc5, 0x00, 0xf6, 0x10, 0x16, 0x91, 0x46, 0x82, 0xd0, 0x0e, 0xa7, + 0x81, 0x94, 0x40, 0x97, 0x90, 0x98, 0x50, 0x86, 0xee, 0x21, 0x1c, 0x85, 0x50, 0xf6, 0x2d, 0x58, + 0x25, 0xb2, 0xc0, 0x1a, 0x52, 0xb2, 0x46, 0x81, 0x60, 0x19, 0x97, 0x62, 0x09, 0x4b, 0x05, 0x7d, + 0x4b, 0xf9, 0x5a, 0x48, 0x07, 0xef, 0xc3, 0x9a, 0x24, 0x93, 0xb9, 0x5a, 0x2b, 0x58, 0x6b, 0x99, + 0x8a, 0x67, 0xaa, 0x6d, 0xc0, 0xa2, 0x18, 0x92, 0x33, 0xb0, 0x64, 0x6d, 0x71, 0x12, 0x56, 0xc5, + 0xe8, 0x51, 0x53, 0x6a, 0x50, 0xa1, 0x89, 0x65, 0xcf, 0xf8, 0x35, 0xfb, 0x1e, 0x34, 0x88, 0x64, + 0x50, 0xbd, 0x42, 0x4e, 0xbf, 0x8e, 0x9c, 0x7e, 0x45, 0x59, 0x38, 0xa3, 0x52, 0x64, 0xf6, 0xf5, + 0x41, 0xe2, 0x5b, 0x1c, 0x87, 0x91, 0x73, 0xca, 0x43, 0x67, 0xcc, 0x5b, 0x6b, 0x44, 0x60, 0xea, + 0x5b, 0x9c, 0xd4, 0xe9, 0x04, 0x4b, 0x5a, 0xc4, 0x17, 0xe8, 0x0b, 0x69, 0x77, 0xe4, 0x05, 0x5c, + 0x99, 0xa8, 0x5a, 0xb7, 0xe5, 0x21, 0x14, 0x40, 0xc9, 0xf6, 0x8c, 0x9f, 0x66, 0xe8, 0x1e, 0x93, + 0xc7, 0x3e, 0xd0, 0xb4, 0x32, 0x3a, 0xf0, 0x96, 0xe7, 0x8e, 0xae, 0x25, 0x0f, 0x00, 0x02, 0x1d, + 0xba, 0x23, 0x3c, 0x84, 0x8e, 0xab, 0xa3, 0x10, 0xcb, 0xac, 0x2a, 0x20, 0x22, 0xdd, 0x83, 0xca, + 0x64, 0x7a, 0x32, 0x72, 0x06, 0x84, 0x92, 0xa3, 0x56, 0x08, 0x84, 0x08, 0x42, 0x2d, 0x25, 0x42, + 0x20, 0x8c, 0x3c, 0x62, 0x54, 0x24, 0x0c, 0x51, 0x90, 0x25, 0x73, 0x1f, 0xb9, 0x40, 0xd5, 0xc4, + 0xbf, 0x8d, 0x4d, 0x58, 0x4e, 0x0e, 0x5a, 0xde, 0x17, 0x0f, 0xa1, 0x24, 0x59, 0x8c, 0xb2, 0x57, + 0xd4, 0x35, 0x0b, 0xb2, 0xd0, 0xac, 0xa2, 0x72, 0xe3, 0xb7, 0x17, 0x60, 0x49, 0x42, 0xb7, 0xc4, + 0x8a, 0xf4, 0xa6, 0xe3, 0xb1, 0xed, 0xa7, 0xf0, 0xae, 0xcc, 0x8b, 0x79, 0x57, 0x76, 0x8e, 0x77, + 0x25, 0x15, 0x56, 0x62, 0x7d, 0x49, 0x85, 0x55, 0x6c, 0x01, 0xe9, 0x10, 0xba, 0xf9, 0xb2, 0x26, + 0xc1, 0x7d, 0x32, 0x93, 0xce, 0x71, 0xda, 0x42, 0x0a, 0xa7, 0xd5, 0xf9, 0xe4, 0xc2, 0x0c, 0x9f, + 0x7c, 0x03, 0x68, 0xaf, 0x15, 0xdb, 0x2f, 0x92, 0x5a, 0x81, 0x30, 0x69, 0x03, 0x7d, 0x07, 0x1a, + 0xb3, 0xac, 0x89, 0x78, 0x60, 0x3d, 0x85, 0x31, 0x39, 0x63, 0x8e, 0x97, 0x8c, 0x86, 0x5c, 0x96, + 0x8c, 0xc9, 0x19, 0xf3, 0x3d, 0x2c, 0x51, 0xf8, 0x1d, 0x00, 0xea, 0x1b, 0x69, 0x1d, 0x90, 0xd6, + 0xdf, 0x4e, 0xee, 0x85, 0xbe, 0xea, 0x1b, 0xe2, 0x63, 0xea, 0x73, 0x24, 0xfe, 0x32, 0xd6, 0x44, + 0xba, 0x7f, 0x06, 0x75, 0x6f, 0xc2, 0x5d, 0x2b, 0x66, 0x11, 0x15, 0x6c, 0xea, 0xad, 0x17, 0x34, + 0xd5, 0x55, 0xb8, 0x66, 0x4d, 0xd4, 0x8d, 0x3e, 0xd9, 0x3e, 0x2d, 0x3c, 0xd7, 0x5a, 0xab, 0x7e, + 0x89, 0xd6, 0xea, 0x58, 0x39, 0xfa, 0x36, 0xfe, 0x4e, 0x06, 0x2a, 0xda, 0xb0, 0xd9, 0x0a, 0x2c, + 0x6e, 0x1d, 0x1e, 0x1e, 0x75, 0xcc, 0x76, 0xbf, 0xfb, 0x49, 0xc7, 0xda, 0xda, 0x3b, 0xec, 0x75, + 0x9a, 0xb7, 0x04, 0x78, 0xef, 0x70, 0xab, 0xbd, 0x67, 0xed, 0x1c, 0x9a, 0x5b, 0x0a, 0x9c, 0x61, + 0xab, 0xc0, 0xcc, 0xce, 0xfe, 0x61, 0xbf, 0x93, 0x80, 0x67, 0x59, 0x13, 0xaa, 0x9b, 0x66, 0xa7, + 0xbd, 0xb5, 0x2b, 0x21, 0x39, 0xb6, 0x0c, 0xcd, 0x9d, 0xe3, 0x83, 0xed, 0xee, 0xc1, 0x53, 0x6b, + 0xab, 0x7d, 0xb0, 0xd5, 0xd9, 0xeb, 0x6c, 0x37, 0xf3, 0xac, 0x06, 0xe5, 0xf6, 0x66, 0xfb, 0x60, + 0xfb, 0xf0, 0xa0, 0xb3, 0xdd, 0x2c, 0x18, 0xbf, 0x02, 0xe5, 0x78, 0xa2, 0x15, 0x28, 0x1e, 0x1f, + 0x3c, 0x3b, 0x38, 0xfc, 0xf4, 0xa0, 0x79, 0x8b, 0x95, 0xa1, 0x80, 0xfd, 0x37, 0x33, 0x0c, 0x60, + 0x81, 0xfa, 0x6c, 0x66, 0x59, 0x09, 0xf2, 0x9b, 0x87, 0xfd, 0xdd, 0x66, 0xce, 0xf8, 0x8b, 0x0c, + 0xac, 0xe0, 0x94, 0x87, 0xb3, 0x4c, 0xe0, 0x3e, 0x54, 0x06, 0x9e, 0x37, 0x11, 0x0a, 0x52, 0x2c, + 0x08, 0xe8, 0x20, 0x71, 0xc0, 0x89, 0xe7, 0x9e, 0x7a, 0xfe, 0x80, 0x4b, 0x1e, 0x00, 0x08, 0xda, + 0x11, 0x10, 0x41, 0x83, 0x92, 0x88, 0x09, 0x83, 0x58, 0x40, 0x85, 0x60, 0x84, 0xb2, 0x0a, 0x0b, + 0x27, 0x3e, 0xb7, 0x07, 0xe7, 0xf2, 0xf4, 0xcb, 0x2f, 0xf6, 0xf5, 0x58, 0x75, 0x1f, 0x08, 0x9a, + 0x1a, 0xf1, 0x21, 0x1e, 0x81, 0x92, 0xd9, 0x90, 0xf0, 0x2d, 0x09, 0x16, 0x97, 0x88, 0x7d, 0x62, + 0xbb, 0x43, 0xcf, 0xe5, 0x43, 0xa9, 0x21, 0xc4, 0x00, 0xe3, 0x08, 0x56, 0x67, 0xe7, 0x27, 0xf9, + 0xc5, 0x07, 0x1a, 0xbf, 0x20, 0x81, 0x7d, 0xfd, 0x66, 0x52, 0xd0, 0x78, 0xc7, 0xdf, 0xcb, 0x43, + 0x5e, 0x08, 0x70, 0x37, 0xca, 0x7a, 0xba, 0x44, 0x9e, 0x9b, 0xf3, 0xda, 0xa0, 0x85, 0x80, 0x6e, + 0x76, 0x32, 0x43, 0x95, 0x11, 0x82, 0x37, 0x7a, 0x54, 0xec, 0xf3, 0xc1, 0x85, 0xb4, 0x43, 0x51, + 0xb1, 0xc9, 0x07, 0x17, 0xa8, 0x0a, 0xd9, 0x21, 0xd5, 0xa5, 0xf3, 0x5e, 0x0c, 0xec, 0x10, 0x6b, + 0xca, 0x22, 0xac, 0x57, 0x8c, 0x8a, 0xb0, 0x56, 0x0b, 0x8a, 0x8e, 0x7b, 0xe2, 0x4d, 0xdd, 0x21, + 0x1e, 0xef, 0x92, 0xa9, 0x3e, 0xd1, 0x49, 0x84, 0x9c, 0x48, 0xdc, 0x1f, 0x74, 0x9a, 0x4b, 0x02, + 0xd0, 0x17, 0x37, 0xc8, 0x7b, 0x50, 0x0e, 0xae, 0xdd, 0x81, 0x7e, 0x86, 0x97, 0xe5, 0xfa, 0x88, + 0xd9, 0x6f, 0xf4, 0xae, 0xdd, 0x01, 0x9e, 0xd8, 0x52, 0x20, 0xff, 0x62, 0xef, 0x43, 0x29, 0x32, + 0xd7, 0x12, 0x07, 0xbe, 0xad, 0xd7, 0x50, 0x36, 0x5a, 0xd2, 0x8a, 0x23, 0x54, 0xf6, 0x08, 0x16, + 0xd0, 0xa6, 0x1a, 0xb4, 0xaa, 0x58, 0x49, 0x89, 0xe9, 0x62, 0x18, 0xe8, 0x9f, 0xe1, 0x43, 0xb4, + 0xaf, 0x9a, 0x12, 0x6d, 0xfd, 0x19, 0xd4, 0x12, 0x6d, 0xe9, 0xba, 0x6f, 0x8d, 0x74, 0xdf, 0xb7, + 0x74, 0xdd, 0x37, 0xbe, 0x09, 0x64, 0x35, 0x5d, 0x17, 0xfe, 0x35, 0x28, 0xa9, 0xa9, 0x88, 0xf3, + 0x27, 0xcf, 0x8e, 0xd5, 0xfb, 0xec, 0x60, 0xab, 0x79, 0x8b, 0x35, 0xa0, 0xd2, 0xde, 0xc2, 0x23, + 0x8d, 0x80, 0x8c, 0x40, 0x39, 0x6a, 0xf7, 0x7a, 0x11, 0x24, 0x6b, 0xec, 0x40, 0x73, 0x76, 0xa4, + 0x82, 0x26, 0x43, 0x05, 0x93, 0x16, 0xe7, 0x18, 0x20, 0x34, 0x1b, 0x32, 0x22, 0x93, 0xf8, 0x4c, + 0x1f, 0xc6, 0xfb, 0xd0, 0x14, 0xf7, 0x9a, 0x58, 0xaa, 0x40, 0xb3, 0xdc, 0x8e, 0x84, 0x48, 0xa6, + 0x5b, 0x9d, 0x4b, 0x66, 0x85, 0x60, 0xd8, 0x95, 0xf1, 0x01, 0x2c, 0x6a, 0xd5, 0x62, 0x4d, 0x54, + 0xdc, 0x95, 0xb3, 0x9a, 0x28, 0xea, 0x1d, 0x54, 0x62, 0xac, 0xc1, 0x8a, 0xf8, 0xec, 0x5c, 0x70, + 0x37, 0xec, 0x4d, 0x4f, 0xc8, 0x55, 0xe8, 0x78, 0xae, 0xd0, 0x47, 0xca, 0x51, 0xc9, 0xcd, 0x44, + 0xbe, 0x21, 0x95, 0xd6, 0x2c, 0x92, 0xc6, 0xba, 0xd6, 0x03, 0x56, 0xdc, 0xc0, 0x7f, 0x13, 0xca, + 0x6b, 0x39, 0x02, 0x89, 0x65, 0x3d, 0xea, 0x74, 0x4c, 0xeb, 0xf0, 0x60, 0xaf, 0x7b, 0x20, 0x18, + 0xa5, 0x58, 0x56, 0x04, 0xec, 0xec, 0x20, 0x24, 0x63, 0x34, 0xa1, 0xfe, 0x94, 0x87, 0x5d, 0xf7, + 0xd4, 0x53, 0x6e, 0xb1, 0x9f, 0x15, 0xa0, 0x11, 0x81, 0x62, 0xe5, 0xf7, 0x82, 0xfb, 0x81, 0xe3, + 0xb9, 0x28, 0xc7, 0x96, 0x4d, 0xf5, 0x29, 0x6e, 0x37, 0x67, 0xc8, 0xdd, 0xd0, 0x09, 0xaf, 0xad, + 0x84, 0xa5, 0xac, 0xae, 0xc0, 0xf2, 0x16, 0x5d, 0x86, 0x82, 0x3d, 0x72, 0x6c, 0xe5, 0x61, 0xa5, + 0x0f, 0x01, 0x1d, 0x78, 0x23, 0xcf, 0x47, 0x91, 0xb5, 0x6c, 0xd2, 0x07, 0x7b, 0x0c, 0xcb, 0x42, + 0x74, 0xd6, 0xcd, 0x97, 0xc8, 0x3f, 0xc8, 0x68, 0xc7, 0xdc, 0xe9, 0xf8, 0x28, 0x36, 0x61, 0x8a, + 0x12, 0x71, 0x77, 0x8a, 0x1a, 0x52, 0x58, 0x8a, 0x2a, 0x90, 0x16, 0xb6, 0xe8, 0x4e, 0xc7, 0x6d, + 0x2c, 0x89, 0xf0, 0x9f, 0xc0, 0x8a, 0xc0, 0x8f, 0xc4, 0xab, 0xa8, 0x46, 0x03, 0x6b, 0x88, 0xc6, + 0xba, 0xb2, 0x2c, 0xaa, 0x73, 0x07, 0xca, 0x34, 0x2a, 0xb1, 0xe3, 0x05, 0x92, 0xbe, 0x71, 0x28, + 0xdc, 0x0f, 0xe6, 0x9c, 0xa1, 0x0b, 0x24, 0x08, 0xcc, 0x38, 0x43, 0x35, 0x77, 0x6a, 0x69, 0xd6, + 0x9d, 0xfa, 0x04, 0x56, 0x4e, 0x04, 0x09, 0x9e, 0x73, 0x7b, 0xc8, 0x7d, 0x2b, 0x26, 0x6c, 0xd2, + 0x32, 0x96, 0x44, 0xe1, 0x2e, 0x96, 0x45, 0xe7, 0x40, 0xc8, 0x39, 0x82, 0x2d, 0xf0, 0xa1, 0x15, + 0x7a, 0x16, 0x8a, 0x3f, 0xc8, 0x60, 0x4a, 0x66, 0x8d, 0xc0, 0x7d, 0x6f, 0x4b, 0x00, 0x93, 0x78, + 0x67, 0xbe, 0x3d, 0x39, 0x97, 0x7a, 0x40, 0x84, 0xf7, 0x54, 0x00, 0xd9, 0x6b, 0x50, 0x14, 0x24, + 0xef, 0x72, 0xf2, 0x59, 0x91, 0xa4, 0xad, 0x40, 0xec, 0x2d, 0x58, 0xc0, 0x3e, 0x82, 0x56, 0x13, + 0xe9, 0xbd, 0x1a, 0x33, 0x72, 0xc7, 0x35, 0x65, 0x99, 0x10, 0x26, 0xa7, 0xbe, 0x43, 0x5c, 0xa6, + 0x6c, 0xe2, 0xdf, 0xec, 0xfb, 0x1a, 0xcb, 0x5a, 0xc2, 0xba, 0x4a, 0x1e, 0x98, 0xa1, 0xb4, 0x9b, + 0xb8, 0xd7, 0x57, 0xca, 0x8c, 0x7e, 0x90, 0x2f, 0x55, 0x9a, 0x55, 0xe3, 0x3b, 0x50, 0xa0, 0xd5, + 0x11, 0x44, 0x88, 0x6b, 0x97, 0x91, 0x44, 0x88, 0xd0, 0x16, 0x14, 0x5d, 0x1e, 0x5e, 0x7a, 0xfe, + 0x73, 0x65, 0x4b, 0x96, 0x9f, 0xc6, 0x8f, 0xd1, 0x08, 0x12, 0x39, 0xca, 0x49, 0x9f, 0x13, 0xe4, + 0x41, 0xdb, 0x1b, 0x9c, 0xdb, 0xd2, 0x2e, 0x53, 0x42, 0x40, 0xef, 0xdc, 0x9e, 0x23, 0x8f, 0xec, + 0xbc, 0xaf, 0xfc, 0x2d, 0xa8, 0x2b, 0xd7, 0x7c, 0x60, 0x8d, 0xf8, 0x69, 0x28, 0xc9, 0xbd, 0x2a, + 0xfd, 0xf2, 0xc1, 0x1e, 0x3f, 0x0d, 0x8d, 0x7d, 0x58, 0x94, 0x04, 0x79, 0x38, 0xe1, 0xaa, 0xeb, + 0xef, 0xa6, 0xc9, 0xd3, 0x95, 0x27, 0x4b, 0xc9, 0x8b, 0x96, 0x42, 0x0e, 0x12, 0x42, 0xb6, 0xf1, + 0x31, 0x30, 0xfd, 0x1a, 0x96, 0xed, 0x49, 0xa9, 0x56, 0x99, 0xe0, 0x95, 0x27, 0x2b, 0x92, 0x9d, + 0x9d, 0xa1, 0x58, 0x9d, 0x60, 0x3a, 0x18, 0xa8, 0x90, 0x89, 0x92, 0xa9, 0x3e, 0x8d, 0x3f, 0xcd, + 0xc0, 0x12, 0x36, 0xa6, 0xf4, 0x01, 0xc9, 0x64, 0x7f, 0xee, 0x41, 0x8a, 0xfd, 0xd1, 0x65, 0x1f, + 0xfa, 0xf8, 0xf2, 0x46, 0xcf, 0xfc, 0x9c, 0xd1, 0xf3, 0xeb, 0xd0, 0x1c, 0xf2, 0x91, 0x83, 0xd1, + 0x33, 0x4a, 0x94, 0x20, 0x0d, 0xa0, 0xa1, 0xe0, 0x4a, 0x89, 0xfb, 0x47, 0x19, 0x58, 0x24, 0x49, + 0x05, 0xd5, 0x61, 0xb9, 0x50, 0x1f, 0x29, 0xfd, 0x4f, 0xb2, 0x2a, 0x39, 0xa7, 0xf8, 0x06, 0x47, + 0x28, 0x21, 0xef, 0xde, 0x92, 0x7a, 0xa1, 0x84, 0xb2, 0x0f, 0x51, 0x87, 0x71, 0x2d, 0x04, 0xa6, + 0x44, 0xe3, 0x24, 0x37, 0x65, 0xf7, 0x16, 0x2a, 0x38, 0x2e, 0x82, 0x36, 0x4b, 0x42, 0x21, 0x15, + 0x60, 0x63, 0x07, 0x6a, 0x89, 0x6e, 0x12, 0x96, 0xd9, 0x2a, 0x59, 0x66, 0xe7, 0xbc, 0x1f, 0xd9, + 0x79, 0xef, 0xc7, 0xdf, 0xca, 0x03, 0x13, 0x24, 0x35, 0xb3, 0x6b, 0x33, 0xae, 0xc3, 0xec, 0x9c, + 0xeb, 0xf0, 0x31, 0x30, 0x0d, 0x41, 0x79, 0x34, 0x73, 0x91, 0x47, 0xb3, 0x19, 0xe3, 0x4a, 0x87, + 0xe6, 0x63, 0x58, 0x96, 0x02, 0x6d, 0xe4, 0x2b, 0x44, 0x93, 0x1b, 0xed, 0x0f, 0x23, 0xc9, 0x56, + 0xf9, 0x0c, 0xd1, 0xfc, 0xa6, 0xdc, 0x86, 0x81, 0x1d, 0x4a, 0x4b, 0x15, 0xba, 0x0d, 0x7b, 0xf6, + 0x9c, 0xe9, 0x7b, 0xe1, 0xa5, 0x54, 0x50, 0x9c, 0xa3, 0x02, 0xcd, 0x70, 0x52, 0x4a, 0x1a, 0x4e, + 0x0c, 0xa8, 0x29, 0xe7, 0x20, 0xc5, 0x44, 0x90, 0xf4, 0x56, 0x91, 0x1e, 0x42, 0x8c, 0x8b, 0x78, + 0x00, 0x4d, 0x65, 0xdd, 0x88, 0x4c, 0x33, 0xe4, 0xef, 0x97, 0xc6, 0xb1, 0x2d, 0x65, 0xa0, 0x49, + 0x18, 0xc2, 0x2b, 0x33, 0x86, 0xf0, 0x77, 0x61, 0x31, 0x10, 0x44, 0x64, 0x4d, 0x5d, 0x19, 0x9c, + 0xc3, 0x87, 0xa8, 0x3a, 0x95, 0xcc, 0x26, 0x16, 0x1c, 0xc7, 0xf0, 0x79, 0xb3, 0x43, 0x6d, 0xde, + 0xec, 0xc0, 0xde, 0x8f, 0xfd, 0x68, 0xc1, 0xb9, 0x33, 0xc6, 0x8b, 0x3b, 0x0e, 0x64, 0x91, 0x0b, + 0xdc, 0x3b, 0x77, 0xc6, 0xa6, 0x72, 0xda, 0x8a, 0x0f, 0xe3, 0x3f, 0x64, 0xa0, 0x29, 0xe8, 0x20, + 0x41, 0xe7, 0xbf, 0x02, 0x78, 0x22, 0x5f, 0x91, 0xcc, 0x2b, 0x02, 0x57, 0x51, 0xf9, 0x77, 0x00, + 0xc9, 0xd6, 0x12, 0x7a, 0xa2, 0x24, 0xf2, 0x56, 0x92, 0xc8, 0x63, 0x46, 0xb6, 0x7b, 0x8b, 0x14, + 0x00, 0x01, 0x49, 0xf3, 0x5f, 0xe6, 0x53, 0xfc, 0x97, 0xda, 0x51, 0xd8, 0x05, 0x78, 0xc6, 0xaf, + 0xf7, 0xbc, 0x01, 0x6a, 0x68, 0x77, 0x01, 0x04, 0x41, 0x9e, 0xda, 0x63, 0x47, 0x5a, 0x57, 0x0a, + 0x66, 0xf9, 0x39, 0xbf, 0xde, 0x41, 0x80, 0xd8, 0x0d, 0x51, 0x1c, 0x9f, 0x87, 0x82, 0x59, 0x7a, + 0xce, 0xaf, 0xe9, 0x30, 0x58, 0x50, 0x7b, 0xc6, 0xaf, 0xb7, 0x39, 0x89, 0x6b, 0x9e, 0x2f, 0x28, + 0xc1, 0xb7, 0x2f, 0x85, 0x7c, 0x96, 0xf0, 0x3d, 0x56, 0x7c, 0xfb, 0xf2, 0x19, 0xbf, 0x56, 0x7e, + 0xd0, 0xa2, 0x28, 0x1f, 0x79, 0x03, 0x79, 0x03, 0xa9, 0x28, 0x8a, 0x78, 0x50, 0xe6, 0xc2, 0x73, + 0xfc, 0xdb, 0xf8, 0x93, 0x0c, 0xd4, 0xc4, 0xf8, 0x91, 0xc1, 0x89, 0x75, 0x57, 0xc1, 0x38, 0x99, + 0x38, 0x18, 0xe7, 0x89, 0xe4, 0x0f, 0xc4, 0x2d, 0xb3, 0x37, 0x73, 0x4b, 0x5c, 0x60, 0x62, 0x95, + 0xef, 0x41, 0x99, 0xce, 0x96, 0x38, 0xac, 0xb9, 0xc4, 0x2e, 0x25, 0x26, 0x64, 0x96, 0x10, 0xed, + 0x19, 0xf9, 0xfe, 0x35, 0x03, 0x1b, 0x2d, 0x71, 0xd9, 0x8f, 0xcc, 0x6a, 0x29, 0xdb, 0x50, 0x48, + 0x73, 0x23, 0x1f, 0x43, 0x45, 0xa3, 0x29, 0xb4, 0xc6, 0x45, 0x83, 0x27, 0x02, 0x4c, 0x12, 0x4d, + 0x62, 0xf6, 0xbb, 0xb7, 0xcc, 0xda, 0x40, 0x07, 0x6c, 0x2e, 0x40, 0x5e, 0x54, 0x32, 0x3e, 0x82, + 0x45, 0xad, 0x59, 0xd2, 0x46, 0xd3, 0xc6, 0x94, 0x49, 0x1b, 0xd3, 0x3f, 0xce, 0xc0, 0xb2, 0xac, + 0x8d, 0x81, 0x5b, 0x8e, 0xb8, 0xae, 0xf7, 0x83, 0x33, 0xf6, 0x2b, 0x50, 0x13, 0xad, 0x5b, 0x3e, + 0x3f, 0x73, 0x82, 0x90, 0x2b, 0xcf, 0x45, 0xca, 0xe1, 0x10, 0x5c, 0x5b, 0xa0, 0x9a, 0x12, 0x93, + 0x7d, 0x04, 0x15, 0xac, 0x4a, 0xfa, 0xb2, 0xdc, 0x96, 0xd6, 0x7c, 0x45, 0x1a, 0xea, 0xee, 0x2d, + 0x13, 0x82, 0xe8, 0x6b, 0xb3, 0x0c, 0xc5, 0xd0, 0x77, 0xce, 0xce, 0xb8, 0x6f, 0xac, 0x46, 0x43, + 0x13, 0x27, 0x8d, 0xf7, 0x42, 0x3e, 0x11, 0x42, 0x90, 0xf1, 0x9f, 0x32, 0x50, 0x91, 0x67, 0xe7, + 0xe7, 0x76, 0x57, 0xac, 0x6b, 0x91, 0x87, 0xa4, 0x1a, 0xc7, 0x81, 0x86, 0xef, 0x40, 0x63, 0x2c, + 0x04, 0x22, 0x21, 0xb0, 0x27, 0x7c, 0x15, 0x75, 0x05, 0x96, 0xf2, 0xc8, 0x06, 0x2c, 0xa1, 0x78, + 0x12, 0x58, 0xa1, 0x33, 0xb2, 0x54, 0xa1, 0x8c, 0xf2, 0x5b, 0xa4, 0xa2, 0xbe, 0x33, 0xda, 0x97, + 0x05, 0xe2, 0x96, 0x0e, 0x42, 0xfb, 0x8c, 0x4b, 0xd1, 0x97, 0x3e, 0x8c, 0x16, 0xac, 0xce, 0xc8, + 0xea, 0x4a, 0xcf, 0xf8, 0xef, 0x0d, 0x58, 0x9b, 0x2b, 0x92, 0xfa, 0x46, 0x64, 0xa3, 0x1f, 0x39, + 0xe3, 0x13, 0x2f, 0x32, 0x85, 0x65, 0x34, 0x1b, 0xfd, 0x9e, 0x28, 0x51, 0xa6, 0x30, 0x0e, 0x2b, + 0x8a, 0x20, 0xd0, 0x96, 0x15, 0x89, 0xf3, 0x59, 0x14, 0x36, 0xdf, 0x4b, 0x32, 0xaa, 0xd9, 0xee, + 0x14, 0x5c, 0xbf, 0xfe, 0x96, 0x26, 0x73, 0xb0, 0x80, 0x9d, 0x42, 0x2b, 0xa2, 0x3b, 0x29, 0x1f, + 0x69, 0xba, 0x89, 0xe8, 0xe9, 0x1b, 0x2f, 0xe9, 0x29, 0x61, 0x24, 0x31, 0x57, 0x15, 0xb9, 0x52, + 0x63, 0x51, 0x3f, 0x17, 0xf0, 0xba, 0xea, 0x07, 0x65, 0x9d, 0xf9, 0xde, 0xf2, 0xaf, 0x34, 0x2f, + 0x34, 0xfe, 0x24, 0xbb, 0xbc, 0x23, 0x1b, 0x8e, 0x8a, 0xf4, 0x7e, 0xcf, 0x61, 0xf5, 0xd2, 0x76, + 0x42, 0x35, 0x3f, 0x4d, 0x2d, 0x2a, 0x60, 0x7f, 0x4f, 0x5e, 0xd2, 0xdf, 0xa7, 0x54, 0x39, 0x21, + 0xfd, 0x2d, 0x5f, 0xce, 0x03, 0x83, 0xf5, 0x7f, 0x97, 0x85, 0x7a, 0xb2, 0x15, 0x71, 0xa8, 0x25, + 0x1f, 0x52, 0xf2, 0x84, 0x94, 0xc7, 0xa5, 0x89, 0xf6, 0x80, 0xe4, 0x88, 0x79, 0xe3, 0x71, 0x36, + 0xc5, 0x78, 0xac, 0xdb, 0x6c, 0x73, 0x2f, 0xf3, 0x6d, 0xe5, 0x5f, 0xc9, 0xb7, 0x55, 0x48, 0xf3, + 0x6d, 0xdd, 0xec, 0x10, 0x59, 0xf8, 0xb9, 0x1c, 0x22, 0xc5, 0x9b, 0x1d, 0x22, 0xeb, 0x7f, 0x95, + 0x01, 0x36, 0x4f, 0xa9, 0xec, 0x29, 0xd9, 0xc9, 0x5d, 0x3e, 0x92, 0x5c, 0xec, 0x9b, 0xaf, 0x46, + 0xed, 0x6a, 0x83, 0x54, 0x6d, 0xf6, 0x08, 0x96, 0xf4, 0xb8, 0x60, 0x5d, 0x55, 0xa9, 0x99, 0x4c, + 0x2f, 0x8a, 0x15, 0x5a, 0xcd, 0xb1, 0x97, 0x7f, 0xa9, 0x63, 0xaf, 0xf0, 0x52, 0xc7, 0xde, 0x42, + 0xd2, 0xb1, 0xb7, 0xfe, 0x5f, 0x32, 0xb0, 0x94, 0x42, 0x54, 0x5f, 0xdd, 0x9c, 0x05, 0x2d, 0x24, + 0x58, 0x4c, 0x56, 0xd2, 0x82, 0xce, 0x5d, 0xf6, 0xa0, 0x12, 0xfb, 0x8a, 0x54, 0xdc, 0xfc, 0xc3, + 0x97, 0x9d, 0xf4, 0xb8, 0x86, 0xa9, 0x57, 0x5f, 0xff, 0x02, 0x2a, 0x5a, 0x99, 0x58, 0x44, 0xa2, + 0x20, 0x2d, 0x9c, 0x82, 0xee, 0x70, 0xd4, 0xb3, 0xee, 0x81, 0x34, 0xe4, 0x52, 0x39, 0xd1, 0xba, + 0xbc, 0xb0, 0x11, 0x61, 0x03, 0x96, 0x94, 0x0b, 0x83, 0xc7, 0x51, 0x53, 0x92, 0xed, 0x2f, 0x4a, + 0x47, 0x06, 0x8f, 0x82, 0xb0, 0xd6, 0x7f, 0x02, 0xb5, 0x04, 0x47, 0xf8, 0xea, 0xd6, 0x72, 0x56, + 0x6b, 0xa4, 0xb1, 0xea, 0x5a, 0xe3, 0xfa, 0xff, 0xc9, 0x01, 0x9b, 0x67, 0x4a, 0xbf, 0xcc, 0x21, + 0xcc, 0xef, 0x78, 0x2e, 0x65, 0xc7, 0xff, 0x9f, 0x5d, 0x92, 0xef, 0xc2, 0xa2, 0x4c, 0xcc, 0xd0, + 0x3c, 0x3c, 0x44, 0xf5, 0xcd, 0xa8, 0x40, 0x8d, 0xe2, 0x3b, 0xb3, 0x0e, 0xe2, 0x52, 0x22, 0x16, + 0x5d, 0x93, 0x12, 0x66, 0xfc, 0xc4, 0xc7, 0xb0, 0x60, 0xbb, 0x83, 0x73, 0xcf, 0x47, 0x85, 0xa5, + 0xfe, 0xe4, 0x57, 0xbf, 0xf4, 0x3d, 0xb1, 0xd1, 0xc6, 0xfa, 0x28, 0x9a, 0x98, 0xb2, 0x31, 0xe3, + 0x3d, 0xa8, 0x68, 0x60, 0xf4, 0x7a, 0x74, 0xf7, 0x37, 0x0f, 0x9b, 0xb7, 0x58, 0x0d, 0xca, 0x66, + 0x67, 0xeb, 0xf0, 0x93, 0x8e, 0xd9, 0xd9, 0x6e, 0x66, 0x58, 0x09, 0xf2, 0x7b, 0x87, 0xbd, 0x7e, + 0x33, 0x6b, 0xac, 0x43, 0x4b, 0xb6, 0x38, 0x6f, 0x01, 0xfd, 0xdd, 0x7c, 0x64, 0x7c, 0xc0, 0x42, + 0xa9, 0x6b, 0x7c, 0x0b, 0xaa, 0xfa, 0x1d, 0x2e, 0x29, 0x62, 0xc6, 0xc9, 0x28, 0xb4, 0x0c, 0x4f, + 0x63, 0x82, 0x5b, 0x40, 0xae, 0xa3, 0x61, 0x54, 0x8d, 0x04, 0xb3, 0x17, 0xf8, 0x1a, 0x50, 0xe6, + 0x4c, 0x90, 0xe1, 0xff, 0x07, 0xf5, 0xa4, 0x39, 0x50, 0x1e, 0xf5, 0x34, 0xa1, 0x5b, 0xd4, 0x4e, + 0xd8, 0x07, 0xd9, 0xf7, 0xa1, 0x39, 0x6b, 0x4e, 0x94, 0x21, 0xbb, 0x37, 0xd4, 0x6f, 0x38, 0x49, + 0x0b, 0x23, 0xdb, 0x85, 0xe5, 0x34, 0x29, 0x06, 0xe9, 0xe3, 0x66, 0x6d, 0x8b, 0xcd, 0x4b, 0x2a, + 0xec, 0xbb, 0xd2, 0x6a, 0x5c, 0x48, 0xf3, 0xbd, 0x69, 0x8b, 0xbd, 0x41, 0xff, 0x69, 0xf6, 0xe3, + 0x0b, 0x80, 0x18, 0xc6, 0x9a, 0x50, 0x3d, 0x3c, 0xea, 0x1c, 0x58, 0x5b, 0xbb, 0xed, 0x83, 0x83, + 0xce, 0x5e, 0xf3, 0x16, 0x63, 0x50, 0x47, 0xa7, 0xd9, 0x76, 0x04, 0xcb, 0x08, 0x98, 0xb4, 0xde, + 0x2b, 0x58, 0x96, 0x2d, 0x43, 0xb3, 0x7b, 0x30, 0x03, 0xcd, 0xb1, 0x16, 0x2c, 0x1f, 0x75, 0xc8, + 0xcf, 0x96, 0x68, 0x37, 0x2f, 0x24, 0x63, 0x39, 0x5d, 0x21, 0x19, 0x53, 0x82, 0x91, 0x3c, 0x07, + 0x4a, 0x60, 0xfc, 0xbd, 0x0c, 0xac, 0xcc, 0x14, 0xc4, 0x61, 0xe3, 0x24, 0x2e, 0x26, 0x05, 0xc5, + 0x2a, 0x02, 0xd5, 0x69, 0x7a, 0x17, 0x16, 0x23, 0x0d, 0x7a, 0x86, 0xdd, 0x37, 0xa3, 0x02, 0x85, + 0xfc, 0x08, 0x96, 0x34, 0x45, 0x7c, 0x86, 0x57, 0x30, 0xad, 0x48, 0x56, 0x30, 0xd6, 0xa2, 0xf0, + 0xdc, 0x99, 0x51, 0x0f, 0x29, 0x6b, 0x49, 0x2f, 0x88, 0x8d, 0xea, 0xc9, 0xf1, 0xaa, 0x4f, 0xf6, + 0x78, 0x86, 0x10, 0x92, 0xa3, 0xd5, 0x37, 0x5c, 0x75, 0xff, 0x07, 0x0b, 0xc0, 0x3e, 0x9e, 0x72, + 0xff, 0x1a, 0xc3, 0xc2, 0x83, 0x97, 0xc5, 0x49, 0x29, 0x6d, 0x33, 0xfb, 0x4a, 0xa9, 0x1f, 0x69, + 0xa9, 0x17, 0xf9, 0x97, 0xa7, 0x5e, 0x14, 0x5e, 0x96, 0x7a, 0xf1, 0x26, 0xd4, 0x9c, 0x33, 0xd7, + 0x13, 0xac, 0x50, 0x88, 0x7c, 0x41, 0x6b, 0xe1, 0x7e, 0xee, 0x41, 0xd5, 0xac, 0x4a, 0xa0, 0x10, + 0xf8, 0x02, 0xf6, 0x51, 0x8c, 0xc4, 0x87, 0x67, 0x98, 0x26, 0xa4, 0x33, 0xc1, 0xce, 0xf0, 0x8c, + 0x4b, 0xe5, 0x1a, 0xcd, 0x4d, 0xaa, 0xb2, 0x80, 0x07, 0xec, 0x2d, 0xa8, 0x07, 0xde, 0x54, 0x48, + 0xd0, 0x6a, 0x19, 0xc8, 0xec, 0x5e, 0x25, 0xe8, 0x91, 0xf2, 0xb1, 0x2c, 0x4d, 0x03, 0x6e, 0x8d, + 0x9d, 0x20, 0x10, 0x72, 0xcf, 0xc0, 0x73, 0x43, 0xdf, 0x1b, 0x49, 0x4b, 0xfa, 0xe2, 0x34, 0xe0, + 0xfb, 0x54, 0xb2, 0x45, 0x05, 0xec, 0xdb, 0xf1, 0x90, 0x26, 0xb6, 0xe3, 0x07, 0x2d, 0xc0, 0x21, + 0xa9, 0x99, 0xa2, 0xa0, 0x6a, 0x3b, 0x7e, 0x34, 0x16, 0xf1, 0x11, 0xcc, 0xa4, 0x84, 0x54, 0x66, + 0x53, 0x42, 0x7e, 0x94, 0x9e, 0x12, 0x52, 0xc3, 0xa6, 0x1f, 0xcb, 0xa6, 0xe7, 0xb7, 0xf8, 0x4b, + 0x65, 0x86, 0xcc, 0x67, 0xba, 0xd4, 0xbf, 0x4c, 0xa6, 0x4b, 0x23, 0x2d, 0xd3, 0xe5, 0x3d, 0xa8, + 0x60, 0x0e, 0x82, 0x75, 0xee, 0x08, 0xe1, 0x88, 0x3c, 0x03, 0x4d, 0x3d, 0x49, 0x61, 0xd7, 0x71, + 0x43, 0x13, 0x7c, 0xf5, 0x67, 0x30, 0x9f, 0x74, 0xb2, 0xf8, 0x4b, 0x4c, 0x3a, 0x91, 0xb9, 0x12, + 0x1b, 0x50, 0x52, 0xfb, 0xc4, 0x18, 0xe4, 0x4f, 0x7d, 0x6f, 0xac, 0x2c, 0xa6, 0xe2, 0x6f, 0x56, + 0x87, 0x6c, 0xe8, 0xc9, 0xca, 0xd9, 0xd0, 0x33, 0x7e, 0x13, 0x2a, 0x1a, 0xa9, 0xb1, 0x37, 0xc8, + 0x36, 0x23, 0x94, 0x10, 0x29, 0xb5, 0xd1, 0x2a, 0x96, 0x25, 0xb4, 0x3b, 0x14, 0xfc, 0x66, 0xe8, + 0xf8, 0x1c, 0xd3, 0xc3, 0x2c, 0x9f, 0x5f, 0x70, 0x3f, 0x50, 0x16, 0xec, 0x66, 0x54, 0x60, 0x12, + 0xdc, 0xf8, 0x6b, 0xb0, 0x94, 0xd8, 0x5b, 0xc9, 0x22, 0xde, 0x82, 0x05, 0x5c, 0x37, 0xe5, 0x61, + 0x4c, 0x26, 0x7f, 0xc8, 0x32, 0xcc, 0xfb, 0x25, 0xe3, 0xbb, 0x35, 0xf1, 0xbd, 0x13, 0xec, 0x24, + 0x63, 0x56, 0x24, 0xec, 0xc8, 0xf7, 0x4e, 0x8c, 0x3f, 0xcf, 0x41, 0x6e, 0xd7, 0x9b, 0xe8, 0x41, + 0x35, 0x99, 0xb9, 0xa0, 0x1a, 0xa9, 0x59, 0x59, 0x91, 0xe6, 0x24, 0x85, 0x61, 0x34, 0x3b, 0x2b, + 0xed, 0xe9, 0x01, 0xd4, 0x05, 0x9f, 0x08, 0x3d, 0xa1, 0x9a, 0x5e, 0xda, 0x3e, 0x89, 0x9a, 0x39, + 0x3a, 0x7c, 0xf6, 0x38, 0xec, 0x7b, 0x3b, 0x04, 0x67, 0xcb, 0x90, 0x8b, 0xf4, 0x02, 0x2c, 0x16, + 0x9f, 0x6c, 0x15, 0x16, 0x30, 0x28, 0xf2, 0x5a, 0xba, 0xd0, 0xe4, 0x17, 0xfb, 0x26, 0x2c, 0x25, + 0xdb, 0x25, 0x56, 0x24, 0x65, 0x23, 0xbd, 0x61, 0xe4, 0x49, 0xb7, 0x41, 0xf0, 0x11, 0xc2, 0x91, + 0x9e, 0xf8, 0x53, 0xce, 0xb1, 0x48, 0x63, 0x7a, 0xa5, 0x04, 0xd3, 0xbb, 0x07, 0x95, 0x70, 0x74, + 0x61, 0x4d, 0xec, 0xeb, 0x91, 0x67, 0x0f, 0xe5, 0xf9, 0x86, 0x70, 0x74, 0x71, 0x44, 0x10, 0xf6, + 0x08, 0x60, 0x3c, 0x99, 0xc8, 0xb3, 0x87, 0x56, 0xdc, 0x98, 0x94, 0xf7, 0x8f, 0x8e, 0x88, 0xe4, + 0xcc, 0xf2, 0x78, 0x32, 0xa1, 0x3f, 0xd9, 0x36, 0xd4, 0x53, 0x53, 0xb8, 0xee, 0xaa, 0x18, 0x3e, + 0x6f, 0xb2, 0x91, 0x72, 0x38, 0x6b, 0x03, 0x1d, 0xb6, 0xfe, 0x7d, 0x60, 0xbf, 0x60, 0x22, 0x55, + 0x1f, 0xca, 0xd1, 0xf8, 0xf4, 0x3c, 0x24, 0x8c, 0xca, 0xad, 0x24, 0xf2, 0x90, 0xda, 0xc3, 0xa1, + 0x2f, 0xf8, 0x22, 0x5d, 0x98, 0x11, 0xcb, 0x07, 0xed, 0xc6, 0x6c, 0x13, 0xdf, 0x37, 0xfe, 0x32, + 0x03, 0x05, 0x4a, 0x8a, 0x7a, 0x1b, 0x1a, 0x84, 0x1f, 0x05, 0x28, 0x49, 0xc7, 0x1b, 0xdd, 0xbb, + 0x7d, 0x19, 0x9b, 0x24, 0x8e, 0x85, 0x96, 0xd0, 0x99, 0x8d, 0x76, 0x5e, 0x4b, 0xea, 0xbc, 0x07, + 0xe5, 0xa8, 0x6b, 0x8d, 0x74, 0x4a, 0xaa, 0x67, 0xf6, 0x3a, 0xe4, 0xcf, 0xbd, 0x89, 0x32, 0x71, + 0x40, 0xbc, 0x92, 0x26, 0xc2, 0xe3, 0xb1, 0x88, 0x3e, 0x68, 0xf0, 0x52, 0x35, 0x8f, 0x3a, 0x41, + 0x32, 0x98, 0x9f, 0xe3, 0x42, 0xca, 0x1c, 0x8f, 0xa1, 0x21, 0xf8, 0x80, 0xe6, 0x00, 0xbf, 0xf9, + 0xd2, 0xfc, 0xba, 0x90, 0xf0, 0x06, 0xa3, 0xe9, 0x90, 0xeb, 0x06, 0x26, 0x8c, 0x96, 0x91, 0x70, + 0x25, 0x59, 0x1b, 0x7f, 0x90, 0x21, 0xfe, 0x22, 0xda, 0x65, 0x0f, 0x20, 0x2f, 0xee, 0xb7, 0x19, + 0x03, 0x68, 0x14, 0x1e, 0x2d, 0xf0, 0x4c, 0xc4, 0xc0, 0x2c, 0xe8, 0xe9, 0x38, 0xd9, 0x7a, 0xcd, + 0xac, 0xb8, 0xd3, 0x71, 0x64, 0xa3, 0xf9, 0x9a, 0x9a, 0xd6, 0x8c, 0x7d, 0x83, 0x66, 0x1f, 0x1d, + 0xd3, 0x0d, 0x2d, 0xec, 0x26, 0x9f, 0xb8, 0x31, 0x95, 0x14, 0x38, 0x3c, 0xe3, 0x5a, 0xb8, 0xcd, + 0x1f, 0x65, 0xa1, 0x96, 0x18, 0x11, 0xc6, 0x1d, 0x89, 0x0b, 0x80, 0x8c, 0xeb, 0x72, 0xbf, 0x41, + 0x80, 0xa4, 0xa0, 0xae, 0xad, 0x53, 0x36, 0xb1, 0x4e, 0x91, 0xab, 0x3f, 0xa7, 0xbb, 0xfa, 0x1f, + 0x43, 0x39, 0x4e, 0xe4, 0x4d, 0x0e, 0x49, 0xf4, 0xa7, 0x82, 0xc4, 0x63, 0xa4, 0x38, 0x38, 0xa0, + 0xa0, 0x07, 0x07, 0x7c, 0x4f, 0xf3, 0x25, 0x2f, 0x60, 0x33, 0x46, 0xda, 0x8a, 0xfe, 0x52, 0x3c, + 0xc9, 0xc6, 0x47, 0x50, 0xd1, 0x06, 0xaf, 0xfb, 0x8c, 0x33, 0x09, 0x9f, 0x71, 0x94, 0xce, 0x91, + 0x8d, 0xd3, 0x39, 0x8c, 0xdf, 0xce, 0x42, 0x4d, 0x9c, 0x2f, 0xc7, 0x3d, 0x3b, 0xf2, 0x46, 0xce, + 0x00, 0x8d, 0xed, 0xd1, 0x09, 0x93, 0x82, 0x96, 0x3a, 0x67, 0xf2, 0x88, 0x91, 0x9c, 0xa5, 0x67, + 0xad, 0x11, 0x93, 0x8e, 0xb2, 0xd6, 0x0c, 0xa8, 0x09, 0xc6, 0x78, 0x62, 0x07, 0x5c, 0x4b, 0x33, + 0x36, 0x2b, 0xa7, 0x9c, 0x6f, 0xda, 0x01, 0x71, 0xc8, 0x6f, 0xc2, 0x92, 0xc0, 0xc1, 0x84, 0x9d, + 0xb1, 0x33, 0x1a, 0x39, 0x84, 0x49, 0x16, 0x9c, 0xe6, 0x29, 0xe7, 0xa6, 0x1d, 0xf2, 0x7d, 0x51, + 0x20, 0xb3, 0x92, 0x4b, 0x43, 0x27, 0xb0, 0x4f, 0xe2, 0xe8, 0xb0, 0xe8, 0x1b, 0x5d, 0x64, 0xf6, + 0x95, 0xe6, 0x22, 0xa3, 0xcc, 0xbd, 0xca, 0xd8, 0xbe, 0x8a, 0x5c, 0x64, 0x33, 0x94, 0x54, 0x9c, + 0xa5, 0x24, 0xe3, 0x3f, 0x66, 0xa1, 0xa2, 0x91, 0xe5, 0xab, 0xdc, 0xae, 0x77, 0xe7, 0x9c, 0x23, + 0x65, 0xdd, 0x0f, 0xf2, 0x66, 0xb2, 0x4b, 0xf4, 0xa4, 0x53, 0xfe, 0xb3, 0x46, 0xc0, 0x77, 0xa0, + 0x2c, 0x4e, 0xdd, 0x7b, 0x68, 0x6b, 0x94, 0xd9, 0xfb, 0x08, 0x38, 0x9a, 0x9e, 0xa8, 0xc2, 0x27, + 0x58, 0x58, 0x88, 0x0b, 0x9f, 0x88, 0xc2, 0x17, 0x85, 0x84, 0x7e, 0x07, 0xaa, 0xb2, 0x55, 0xdc, + 0x53, 0x9c, 0x6e, 0x7c, 0xea, 0x13, 0xfb, 0x6d, 0x56, 0xa8, 0x3b, 0xda, 0x7c, 0x59, 0xf1, 0x89, + 0xaa, 0x58, 0x7a, 0x59, 0xc5, 0x27, 0xf4, 0x61, 0xec, 0x44, 0x51, 0xb6, 0x18, 0xc5, 0xa1, 0xf8, + 0xd8, 0x23, 0x58, 0x52, 0xec, 0x6a, 0xea, 0xda, 0xae, 0xeb, 0x4d, 0xdd, 0x01, 0x57, 0x79, 0x1e, + 0x4c, 0x16, 0x1d, 0xc7, 0x25, 0xc6, 0x30, 0x4a, 0x04, 0xa4, 0x68, 0x90, 0x87, 0x50, 0x20, 0xb9, + 0x9c, 0x84, 0x8f, 0x74, 0xc6, 0x45, 0x28, 0xec, 0x01, 0x14, 0x48, 0x3c, 0xcf, 0xde, 0xc8, 0x6c, + 0x08, 0xc1, 0xd8, 0x80, 0x06, 0x8a, 0x98, 0x1a, 0xc7, 0x7d, 0x91, 0x54, 0x62, 0x2c, 0x03, 0x3b, + 0xa0, 0x43, 0xa4, 0x47, 0x29, 0xfd, 0xd7, 0x1c, 0x54, 0x34, 0xb0, 0x60, 0x8b, 0x18, 0xd7, 0x62, + 0x0d, 0x1d, 0x7b, 0xcc, 0x95, 0x4b, 0xa7, 0x66, 0xd6, 0x10, 0xba, 0x2d, 0x81, 0xe2, 0x52, 0xb0, + 0x2f, 0xce, 0x2c, 0x6f, 0x1a, 0x5a, 0x43, 0x7e, 0xe6, 0x73, 0x2e, 0x85, 0xa5, 0xaa, 0x7d, 0x71, + 0x76, 0x38, 0x0d, 0xb7, 0x11, 0x26, 0xb0, 0x04, 0x51, 0x6b, 0x58, 0x32, 0x14, 0x63, 0x6c, 0x5f, + 0xc5, 0x58, 0x32, 0x1e, 0x88, 0x96, 0x28, 0x1f, 0xc5, 0x03, 0x91, 0xda, 0x32, 0xcb, 0xc9, 0x0b, + 0xf3, 0x9c, 0xfc, 0xdb, 0xb0, 0x4a, 0x9c, 0x5c, 0xf2, 0x08, 0x6b, 0x86, 0xa4, 0x96, 0xb1, 0x54, + 0x4e, 0x52, 0x93, 0xbf, 0x9a, 0x62, 0x06, 0xea, 0x7c, 0x04, 0xce, 0x8f, 0xe9, 0x44, 0x65, 0x4c, + 0x31, 0x33, 0xd9, 0x78, 0xcf, 0xf9, 0x31, 0x17, 0x98, 0xe8, 0x6f, 0xd6, 0x31, 0x65, 0xe4, 0xf1, + 0xd8, 0x71, 0x67, 0x31, 0xed, 0xab, 0x24, 0x66, 0x59, 0x62, 0xda, 0x57, 0x3a, 0xe6, 0xfb, 0xb0, + 0x36, 0xe6, 0x43, 0xc7, 0x4e, 0x36, 0x6b, 0xc5, 0x12, 0xc4, 0x32, 0x15, 0x6b, 0x75, 0x7a, 0xa4, + 0x41, 0x8a, 0xd5, 0xf8, 0xb1, 0x37, 0x3e, 0x71, 0xe8, 0xf2, 0x24, 0x0f, 0x78, 0xde, 0xac, 0xbb, + 0xd3, 0xf1, 0x0f, 0x11, 0x2c, 0xaa, 0x04, 0x46, 0x0d, 0x2a, 0xbd, 0xd0, 0x9b, 0xa8, 0x6d, 0xae, + 0x43, 0x95, 0x3e, 0x65, 0x16, 0xcf, 0x1d, 0xb8, 0x8d, 0xb4, 0xd9, 0xf7, 0x26, 0xde, 0xc8, 0x3b, + 0xbb, 0x4e, 0x18, 0x94, 0xfe, 0x73, 0x06, 0x96, 0x12, 0xa5, 0xf2, 0x9c, 0x7f, 0x9b, 0x0e, 0x56, + 0x94, 0x8a, 0x41, 0xe4, 0xbc, 0xa8, 0x5d, 0x3e, 0x84, 0x48, 0xa7, 0x4a, 0xa5, 0x67, 0xb4, 0xe3, + 0x14, 0x62, 0x55, 0x91, 0x68, 0xbb, 0x35, 0x4f, 0xdb, 0xb2, 0xbe, 0x4a, 0x2e, 0x56, 0x4d, 0xfc, + 0xaa, 0x8c, 0x0e, 0x1f, 0xca, 0x29, 0xe7, 0x92, 0xf1, 0xaf, 0xba, 0xf1, 0x49, 0x8d, 0x20, 0xb6, + 0x48, 0x05, 0xc6, 0xbf, 0xc8, 0x00, 0xc4, 0xa3, 0xc3, 0x08, 0xdc, 0xe8, 0x02, 0xa5, 0xd7, 0x79, + 0xb4, 0xcb, 0xf2, 0x0d, 0xa8, 0x46, 0x81, 0x78, 0xf1, 0x95, 0x5c, 0x51, 0x30, 0x71, 0x2f, 0xbf, + 0x03, 0x8d, 0xb3, 0x91, 0x77, 0x82, 0xa2, 0x93, 0xbc, 0x40, 0x29, 0x97, 0xa9, 0x4e, 0x60, 0x75, + 0x2d, 0xc6, 0x17, 0x78, 0x3e, 0x35, 0x56, 0x4f, 0xbf, 0x8e, 0x8d, 0xdf, 0xc9, 0x46, 0x11, 0x49, + 0xf1, 0x4a, 0xbc, 0x58, 0xcf, 0xf8, 0x79, 0x1c, 0xdb, 0x2f, 0x72, 0xe8, 0x7c, 0x04, 0x75, 0x9f, + 0xb8, 0xa3, 0x62, 0x9d, 0xf9, 0x17, 0xb0, 0xce, 0x9a, 0x9f, 0xb8, 0x72, 0xbf, 0x0e, 0x4d, 0x7b, + 0x78, 0xc1, 0xfd, 0xd0, 0x41, 0xb3, 0x31, 0x0a, 0x6a, 0x32, 0x06, 0x48, 0x83, 0xa3, 0x44, 0xf4, + 0x0e, 0x34, 0x64, 0x66, 0x59, 0x84, 0x29, 0xdf, 0xaa, 0x88, 0xc1, 0x02, 0xd1, 0xf8, 0xd7, 0x2a, + 0x04, 0x2a, 0xb9, 0xbb, 0x2f, 0x5e, 0x15, 0x7d, 0x86, 0xd9, 0x79, 0x97, 0x95, 0x24, 0x24, 0x69, + 0x8d, 0x96, 0xfc, 0x88, 0x80, 0xd2, 0x16, 0x9d, 0x5c, 0xd6, 0xfc, 0xab, 0x2c, 0xab, 0xf1, 0x27, + 0x19, 0x28, 0xee, 0x7a, 0x13, 0xa1, 0x97, 0x0b, 0x79, 0x0e, 0x8f, 0x49, 0xe4, 0x86, 0x58, 0x10, + 0x9f, 0xdd, 0xe1, 0x8b, 0x33, 0x31, 0x52, 0xe5, 0x8d, 0x5a, 0x52, 0xde, 0xf8, 0x1e, 0xdc, 0x41, + 0x27, 0x8f, 0xef, 0x4d, 0x3c, 0x5f, 0x1c, 0x55, 0x7b, 0x44, 0x72, 0x87, 0xe7, 0x86, 0xe7, 0x8a, + 0x77, 0xde, 0x3e, 0xe5, 0xfc, 0x48, 0xc3, 0xd8, 0x8f, 0x10, 0x30, 0x45, 0x69, 0x14, 0x5e, 0x58, + 0xa4, 0x2a, 0x4a, 0xc1, 0x88, 0x38, 0x6a, 0x43, 0x14, 0x74, 0x10, 0x8e, 0xa2, 0x91, 0xf1, 0x5d, + 0x28, 0x47, 0x56, 0x07, 0xf6, 0x2e, 0x94, 0xcf, 0xbd, 0x89, 0x34, 0x4d, 0x64, 0x12, 0xd9, 0x2a, + 0x72, 0xd6, 0x66, 0xe9, 0x9c, 0xfe, 0x08, 0x8c, 0x3f, 0x2f, 0x42, 0xb1, 0xeb, 0x5e, 0x78, 0xce, + 0x00, 0x83, 0xa8, 0xc6, 0x7c, 0xec, 0xa9, 0xf4, 0x56, 0xf1, 0x37, 0x06, 0x4a, 0xc4, 0x2f, 0x4e, + 0xe4, 0x64, 0xa0, 0x44, 0xf4, 0xd6, 0xc4, 0x0a, 0x2c, 0xf8, 0xfa, 0x93, 0x11, 0x05, 0x1f, 0xc3, + 0x3a, 0x23, 0xa5, 0xad, 0xa0, 0xa5, 0x07, 0x8b, 0xb6, 0xe8, 0x29, 0x03, 0x5c, 0x32, 0x4a, 0x37, + 0x2a, 0x23, 0x04, 0x17, 0xec, 0x35, 0x28, 0xca, 0xe4, 0x10, 0x0a, 0xb5, 0xa7, 0x38, 0x4c, 0x09, + 0x42, 0x6a, 0xf0, 0x39, 0x39, 0xe9, 0x22, 0x89, 0x4a, 0xe8, 0xe9, 0x12, 0xb8, 0x2d, 0x68, 0xed, + 0x1e, 0x54, 0x08, 0x9f, 0x50, 0x4a, 0x32, 0xec, 0x09, 0x41, 0x88, 0x90, 0xf2, 0xf2, 0x4a, 0x39, + 0xf5, 0xe5, 0x15, 0x8c, 0x92, 0x8b, 0xb8, 0x2c, 0x4d, 0x11, 0xe8, 0xbd, 0x0d, 0x0d, 0xae, 0x9e, + 0x1d, 0x92, 0xca, 0x3d, 0x65, 0xdf, 0x29, 0xe5, 0xfe, 0x4d, 0xa8, 0x9d, 0xda, 0xa3, 0xd1, 0x89, + 0x3d, 0x78, 0x4e, 0x3a, 0x69, 0x95, 0xcc, 0x70, 0x0a, 0x88, 0x4a, 0xe9, 0x3d, 0xa8, 0x68, 0xbb, + 0x8c, 0x31, 0x4d, 0x79, 0x13, 0xe2, 0xfd, 0x9d, 0x35, 0x35, 0xd5, 0x5f, 0xc1, 0xd4, 0xa4, 0xc5, + 0x76, 0x35, 0x92, 0xb1, 0x5d, 0x77, 0x90, 0x9b, 0xca, 0xf8, 0x9f, 0x26, 0x3d, 0xee, 0x60, 0x0f, + 0x87, 0x18, 0xff, 0x43, 0x2f, 0xa9, 0xe1, 0xe2, 0x51, 0xf9, 0x22, 0x09, 0xb5, 0x04, 0x23, 0x94, + 0xbb, 0x64, 0x2f, 0x9d, 0xd8, 0xce, 0x10, 0x63, 0x69, 0x49, 0x8d, 0x2d, 0xda, 0xe3, 0xf0, 0xc8, + 0x76, 0x86, 0xec, 0x3e, 0x54, 0x55, 0x31, 0xde, 0x8e, 0x4b, 0xb4, 0xfe, 0xb2, 0x58, 0xdc, 0x89, + 0x06, 0xd4, 0x22, 0x8c, 0x71, 0x9c, 0x42, 0x57, 0x91, 0x28, 0x48, 0x07, 0xef, 0x61, 0x4c, 0x45, + 0xc8, 0x31, 0x51, 0xae, 0xfe, 0xe4, 0x8e, 0x9c, 0xab, 0xa4, 0x52, 0xf5, 0x3f, 0x79, 0x69, 0x08, + 0x53, 0x08, 0x62, 0xe4, 0x2c, 0x5a, 0x4d, 0x08, 0x62, 0x12, 0x15, 0x9d, 0x45, 0x84, 0xc0, 0xbe, + 0xab, 0x29, 0x52, 0x2d, 0x44, 0x7e, 0x6d, 0xa6, 0xfd, 0x9b, 0x52, 0x09, 0xee, 0x02, 0x38, 0x81, + 0xb8, 0x65, 0x02, 0xee, 0x0e, 0x31, 0xe7, 0xad, 0x64, 0x96, 0x9d, 0xe0, 0x19, 0x01, 0xbe, 0x5a, + 0x0d, 0xab, 0x0d, 0x55, 0x7d, 0x9a, 0xac, 0x04, 0xf9, 0xc3, 0xa3, 0xce, 0x41, 0xf3, 0x16, 0xab, + 0x40, 0xb1, 0xd7, 0xe9, 0xf7, 0xf7, 0xd0, 0xe5, 0x54, 0x85, 0x52, 0x94, 0xb9, 0x93, 0x15, 0x5f, + 0xed, 0xad, 0xad, 0xce, 0x51, 0xbf, 0xb3, 0xdd, 0xcc, 0xfd, 0x20, 0x5f, 0xca, 0x36, 0x73, 0xc6, + 0x5f, 0xe4, 0xa0, 0xa2, 0xad, 0xc2, 0x8b, 0x99, 0xf1, 0x5d, 0x00, 0x54, 0x69, 0xe2, 0xf0, 0xb0, + 0xbc, 0x59, 0x16, 0x10, 0xda, 0x7c, 0xdd, 0x58, 0x9e, 0xa3, 0x57, 0x43, 0x94, 0xb1, 0xfc, 0x4d, + 0xa8, 0xd1, 0x03, 0x1c, 0xba, 0xe3, 0xb0, 0x60, 0x56, 0x09, 0x28, 0x59, 0x35, 0xa6, 0xfe, 0x21, + 0x12, 0x26, 0x85, 0xc8, 0x74, 0x7c, 0x02, 0x61, 0x5a, 0x08, 0xe6, 0xf4, 0x04, 0xde, 0xe8, 0x82, + 0x13, 0x06, 0x49, 0x84, 0x15, 0x09, 0xeb, 0xcb, 0xdc, 0x43, 0xc9, 0x0f, 0xb5, 0xdc, 0xb3, 0x82, + 0x59, 0x25, 0xa0, 0xec, 0xe8, 0x9b, 0x8a, 0x80, 0x4a, 0x48, 0x40, 0x6b, 0xf3, 0xd4, 0x90, 0x20, + 0x9e, 0xbd, 0x39, 0x7b, 0x56, 0x19, 0x09, 0xe3, 0x6b, 0xf3, 0xf5, 0x5e, 0x6e, 0xd7, 0x62, 0xef, + 0x02, 0x1b, 0x4f, 0x26, 0x56, 0x8a, 0xa5, 0x29, 0x6f, 0x36, 0xc6, 0x93, 0x49, 0x5f, 0x33, 0xc4, + 0x7c, 0x05, 0x46, 0xb0, 0xcf, 0x81, 0xb5, 0xc5, 0x01, 0xc6, 0x21, 0x46, 0x26, 0xd4, 0x98, 0x2d, + 0x67, 0x74, 0xb6, 0x9c, 0xc2, 0xfd, 0xb2, 0xa9, 0xdc, 0xef, 0x45, 0x7c, 0xc2, 0xd8, 0x81, 0xca, + 0x91, 0xf6, 0xbc, 0xcf, 0x7d, 0x71, 0x43, 0xa8, 0x87, 0x7d, 0xe8, 0xee, 0x20, 0xe3, 0x96, 0x2f, + 0xdf, 0xf3, 0xd1, 0x46, 0x93, 0xd5, 0x46, 0x63, 0xfc, 0xf3, 0x0c, 0x3d, 0x9d, 0x10, 0x0d, 0x3e, + 0x7e, 0x51, 0x48, 0xf9, 0x81, 0xe2, 0x14, 0xd1, 0x8a, 0xf2, 0xff, 0xc8, 0xec, 0x4e, 0x1c, 0x9a, + 0xe5, 0x9d, 0x9e, 0x06, 0x5c, 0x25, 0x3b, 0x55, 0x10, 0x76, 0x88, 0x20, 0x25, 0x7c, 0x0b, 0x09, + 0xdf, 0xa1, 0xf6, 0x03, 0x99, 0xf4, 0x24, 0x84, 0xef, 0x7d, 0xfb, 0x4a, 0xf6, 0x1a, 0x08, 0x11, + 0x44, 0x1a, 0xaa, 0x55, 0x8a, 0x57, 0xf4, 0x6d, 0xfc, 0x13, 0x99, 0xc5, 0x3a, 0xbb, 0xbe, 0x0f, + 0xa1, 0x14, 0xb5, 0x9a, 0xbc, 0x61, 0x15, 0x66, 0x54, 0x2e, 0xee, 0x71, 0xd4, 0xca, 0x13, 0x23, + 0xa6, 0xc3, 0x85, 0xce, 0x86, 0xae, 0x36, 0xea, 0x6f, 0x00, 0x3b, 0x75, 0xfc, 0x59, 0x64, 0x3a, + 0x6c, 0x4d, 0x2c, 0xd1, 0xb0, 0x8d, 0x63, 0x58, 0x52, 0x5c, 0x42, 0xd3, 0x08, 0x92, 0x9b, 0x97, + 0x79, 0x09, 0x93, 0xcf, 0xce, 0x31, 0x79, 0xe3, 0xa7, 0x79, 0x28, 0xaa, 0xa7, 0xb2, 0xd2, 0x9e, + 0x77, 0x2a, 0x27, 0x9f, 0x77, 0x6a, 0x25, 0x9e, 0x02, 0xc1, 0xad, 0x97, 0xf7, 0xfd, 0x3b, 0xb3, + 0x57, 0xb6, 0x66, 0x34, 0x4f, 0x5c, 0xdb, 0xab, 0x90, 0x9f, 0xd8, 0xe1, 0x39, 0x1a, 0xc8, 0x88, + 0x78, 0xf0, 0x5b, 0x19, 0xd3, 0x0b, 0x49, 0x63, 0x7a, 0xda, 0x53, 0x58, 0x24, 0x92, 0xce, 0x3d, + 0x85, 0x75, 0x07, 0x48, 0xbe, 0xd0, 0xc2, 0x8c, 0x4a, 0x08, 0x10, 0x77, 0x51, 0x52, 0x1c, 0x29, + 0xcd, 0x8a, 0x23, 0xaf, 0x2c, 0x2a, 0x7c, 0x1b, 0x16, 0x28, 0x8d, 0x5c, 0xa6, 0xb2, 0xa9, 0x0b, + 0x45, 0xae, 0xa1, 0xfa, 0x9f, 0x62, 0x8b, 0x4d, 0x89, 0xab, 0xbf, 0x2b, 0x53, 0x49, 0xbc, 0x2b, + 0xa3, 0x1b, 0xf9, 0xab, 0x49, 0x23, 0xff, 0x03, 0x68, 0x46, 0x0b, 0x8a, 0x26, 0x33, 0x37, 0x90, + 0x89, 0x32, 0x75, 0x05, 0x17, 0x5c, 0xf2, 0x20, 0x88, 0x2f, 0xc4, 0x7a, 0xe2, 0x42, 0x14, 0x3c, + 0xac, 0x1d, 0x86, 0x7c, 0x3c, 0x09, 0xe5, 0x85, 0x88, 0xa1, 0xf4, 0xfa, 0x00, 0x93, 0x49, 0x9e, + 0x35, 0x28, 0x77, 0x0f, 0xac, 0x9d, 0xbd, 0xee, 0xd3, 0xdd, 0x7e, 0x33, 0x23, 0x3e, 0x7b, 0xc7, + 0x5b, 0x5b, 0x9d, 0xce, 0x36, 0xde, 0x38, 0x00, 0x0b, 0x3b, 0xed, 0xae, 0xb8, 0x7d, 0x72, 0xc6, + 0xef, 0x65, 0xa1, 0xa2, 0x35, 0xcf, 0xde, 0x8f, 0x56, 0x85, 0x9e, 0x1e, 0xb9, 0x3b, 0x3f, 0x84, + 0x0d, 0xc5, 0x8a, 0xb5, 0x65, 0x89, 0x1e, 0xfe, 0xca, 0xde, 0xf8, 0xf0, 0x17, 0x7b, 0x1b, 0x1a, + 0x36, 0xb5, 0x10, 0xad, 0x82, 0x34, 0x07, 0x4b, 0xb0, 0x5c, 0x04, 0x0c, 0xae, 0x8b, 0xef, 0x13, + 0x81, 0x97, 0x57, 0xf1, 0x6c, 0xd1, 0x95, 0x82, 0x8b, 0x55, 0x3c, 0xb5, 0x9d, 0xd1, 0xd4, 0xe7, + 0xd2, 0x7d, 0x1b, 0xdd, 0xcc, 0x04, 0x35, 0x55, 0xb1, 0xf1, 0x01, 0x40, 0x3c, 0xe6, 0xe4, 0xe2, + 0xdc, 0x4a, 0x2e, 0x4e, 0x46, 0x5b, 0x9c, 0xac, 0xb1, 0x4d, 0x6c, 0x44, 0x2e, 0x74, 0xe4, 0xa9, + 0xfe, 0x26, 0x28, 0x8b, 0x94, 0x85, 0xe1, 0xad, 0x93, 0x11, 0x0f, 0x55, 0x3a, 0xec, 0xa2, 0x2c, + 0xe9, 0x46, 0x05, 0x2a, 0x3b, 0x3d, 0x6e, 0x25, 0xe6, 0x46, 0x92, 0x24, 0x67, 0xb9, 0x91, 0x44, + 0x35, 0xa3, 0x72, 0x63, 0x1d, 0x5a, 0xdb, 0x5c, 0xb4, 0xd6, 0x1e, 0x8d, 0x66, 0x86, 0x63, 0xdc, + 0x81, 0xdb, 0x29, 0x65, 0xd2, 0x08, 0xf1, 0x31, 0xac, 0xb4, 0x29, 0xf3, 0xf5, 0xab, 0x4a, 0x71, + 0x31, 0x5a, 0xb0, 0x3a, 0xdb, 0xa4, 0xec, 0x6c, 0x07, 0x16, 0xb7, 0xf9, 0xc9, 0xf4, 0x6c, 0x8f, + 0x5f, 0xc4, 0x1d, 0x31, 0xc8, 0x07, 0xe7, 0xde, 0xa5, 0x5c, 0x1f, 0xfc, 0x1b, 0x03, 0xc9, 0x04, + 0x8e, 0x15, 0x4c, 0xf8, 0x40, 0x59, 0x44, 0x11, 0xd2, 0x9b, 0xf0, 0x81, 0xf1, 0x3e, 0x30, 0xbd, + 0x1d, 0xb9, 0x5e, 0x42, 0x4b, 0x98, 0x9e, 0x58, 0xc1, 0x75, 0x10, 0xf2, 0xb1, 0x7a, 0xd9, 0x06, + 0x82, 0xe9, 0x49, 0x8f, 0x20, 0xc6, 0x3b, 0x50, 0x3d, 0xb2, 0xaf, 0x4d, 0xfe, 0xb9, 0x4c, 0xde, + 0x58, 0x83, 0xe2, 0xc4, 0xbe, 0x16, 0x6c, 0x20, 0x72, 0x8e, 0x60, 0xb1, 0xf1, 0x87, 0x79, 0x58, + 0x20, 0x4c, 0x76, 0x9f, 0x1e, 0x9f, 0x74, 0x5c, 0x3c, 0x86, 0x8a, 0x51, 0x6a, 0xa0, 0x39, 0x5e, + 0x9a, 0x9d, 0xe7, 0xa5, 0xd2, 0x80, 0xa6, 0x1e, 0xdd, 0x50, 0x66, 0x6c, 0x77, 0x3a, 0x56, 0x2f, + 0x6d, 0x24, 0xd3, 0x3f, 0xf3, 0xf1, 0xe3, 0xa2, 0x94, 0x1b, 0x97, 0x74, 0x34, 0xc6, 0xba, 0x08, + 0x8d, 0x4e, 0x5d, 0x11, 0x92, 0x5d, 0xea, 0xa0, 0x54, 0x85, 0xa7, 0xa8, 0xd2, 0x82, 0x92, 0x0a, + 0xcf, 0x9c, 0x62, 0x53, 0x7a, 0xb9, 0x62, 0x43, 0x96, 0xb5, 0x17, 0x28, 0x36, 0xf0, 0x0a, 0x8a, + 0xcd, 0x2b, 0x38, 0xf9, 0x6e, 0x43, 0x09, 0xef, 0x7d, 0x8d, 0x7b, 0x8a, 0xfb, 0x5e, 0x70, 0xcf, + 0xef, 0x68, 0xa2, 0x3f, 0x45, 0x18, 0xdc, 0x89, 0x8f, 0x89, 0xc9, 0x3f, 0xff, 0xe5, 0x38, 0x4f, + 0x3e, 0x83, 0xa2, 0x84, 0x0a, 0x82, 0x76, 0xed, 0xb1, 0x7a, 0xb7, 0x08, 0xff, 0x16, 0xcb, 0x86, + 0x8f, 0xad, 0x7c, 0x3e, 0x75, 0x7c, 0x3e, 0x54, 0x2f, 0x5b, 0x38, 0x78, 0x46, 0x05, 0x44, 0x4c, + 0x50, 0xa8, 0x21, 0xae, 0x77, 0xe9, 0xca, 0xbc, 0xf6, 0xa2, 0x13, 0x3c, 0x13, 0x9f, 0x06, 0x83, + 0x26, 0xbe, 0x5c, 0x36, 0xf1, 0x7c, 0x75, 0x39, 0x19, 0x3f, 0xcd, 0x40, 0x53, 0x9e, 0xae, 0xa8, + 0x4c, 0xd7, 0x02, 0x0a, 0x37, 0x39, 0xc4, 0x5f, 0xfc, 0x4e, 0x85, 0x01, 0x35, 0x34, 0x7e, 0x44, + 0x37, 0x15, 0x19, 0x6f, 0x2a, 0x02, 0xb8, 0x23, 0x6f, 0xab, 0xd7, 0xa1, 0xa2, 0xa2, 0x5c, 0xc7, + 0xce, 0x48, 0xbd, 0x23, 0x4c, 0x61, 0xae, 0xfb, 0xce, 0x48, 0x5d, 0x74, 0xbe, 0x2d, 0xd3, 0xd4, + 0x32, 0x78, 0xd1, 0x99, 0x76, 0xc8, 0x8d, 0x7f, 0x9f, 0x81, 0x45, 0x6d, 0x2a, 0xf2, 0xdc, 0x7e, + 0x08, 0xd5, 0xe8, 0xc9, 0x40, 0x1e, 0x49, 0x5e, 0x6b, 0x49, 0x46, 0x13, 0x57, 0xab, 0x0c, 0x22, + 0x48, 0x20, 0x06, 0x33, 0xb4, 0xaf, 0x71, 0xbc, 0xc1, 0x74, 0xac, 0x94, 0x9b, 0xa1, 0x7d, 0xbd, + 0xc3, 0x79, 0x6f, 0x3a, 0x16, 0xaa, 0xeb, 0x25, 0xe7, 0xcf, 0x23, 0x04, 0x92, 0xb9, 0x40, 0xc0, + 0x24, 0x86, 0x01, 0xb5, 0xb1, 0xe7, 0x86, 0xe7, 0x11, 0x8a, 0x94, 0x3a, 0x11, 0x48, 0x38, 0xc6, + 0x9f, 0x65, 0x61, 0x89, 0x4c, 0x6c, 0xd2, 0xb4, 0x29, 0x59, 0x57, 0x0b, 0x16, 0xc8, 0xda, 0x48, + 0xcc, 0x6b, 0xf7, 0x96, 0x29, 0xbf, 0xd9, 0xb7, 0x5f, 0xd1, 0x2c, 0xa8, 0x32, 0xe1, 0x6e, 0x58, + 0xfe, 0xdc, 0xfc, 0xf2, 0xdf, 0xbc, 0xbc, 0x69, 0x1e, 0xb7, 0x42, 0x9a, 0xc7, 0xed, 0x55, 0xfc, + 0x5c, 0x73, 0xe9, 0x62, 0x45, 0x89, 0xa3, 0xa5, 0x8b, 0xbd, 0x0f, 0x6b, 0x09, 0x1c, 0xe4, 0xd6, + 0xce, 0xa9, 0xc3, 0xd5, 0xb3, 0x01, 0xcb, 0x1a, 0x76, 0x4f, 0x95, 0x6d, 0x16, 0xa1, 0x10, 0x0c, + 0xbc, 0x09, 0x37, 0x56, 0x61, 0x39, 0xb9, 0xaa, 0xf2, 0x9a, 0xf8, 0xfd, 0x0c, 0xb4, 0x64, 0x7c, + 0x84, 0xe3, 0x9e, 0xed, 0x3a, 0x41, 0xe8, 0xf9, 0xd1, 0xd3, 0x7a, 0x77, 0x01, 0x82, 0xd0, 0xf6, + 0xa5, 0xb6, 0x29, 0x13, 0xe5, 0x11, 0x82, 0x9a, 0xe4, 0x6d, 0x28, 0x71, 0x77, 0x48, 0x85, 0x44, + 0x0d, 0x45, 0xee, 0x0e, 0x95, 0x1e, 0x3a, 0x27, 0x7f, 0xd7, 0x92, 0xea, 0x85, 0xcc, 0x5b, 0x15, + 0xab, 0xc3, 0x2f, 0xf0, 0xe2, 0xcd, 0x47, 0x79, 0xab, 0xfb, 0xf6, 0x15, 0x46, 0x1b, 0x06, 0xc6, + 0x3f, 0xcc, 0x42, 0x23, 0x1e, 0x1f, 0x25, 0xbd, 0xbf, 0x38, 0x7d, 0xff, 0xbe, 0x24, 0x07, 0x47, + 0xc8, 0xef, 0x9a, 0xe1, 0xb1, 0x44, 0x87, 0xb3, 0xeb, 0x32, 0x03, 0x2a, 0x0a, 0xc3, 0x9b, 0x86, + 0xda, 0x0b, 0x57, 0x65, 0x42, 0x39, 0x9c, 0x86, 0x42, 0xe1, 0x12, 0x9a, 0xa7, 0xe3, 0x4a, 0x95, + 0xa7, 0x60, 0x8f, 0xc3, 0x2e, 0x3e, 0x9c, 0x2d, 0xc0, 0xa2, 0x1a, 0x6d, 0xa4, 0xc0, 0x12, 0xf8, + 0x4d, 0x92, 0xb3, 0x69, 0xe7, 0x50, 0xc6, 0xd6, 0x85, 0x50, 0x7a, 0x43, 0x34, 0x12, 0x42, 0x5f, + 0x87, 0x0a, 0x35, 0x1e, 0x67, 0x07, 0xe6, 0xcd, 0x32, 0xf6, 0x80, 0xe5, 0xd2, 0x08, 0xe4, 0x4d, + 0x13, 0xaa, 0x2f, 0x50, 0x57, 0x18, 0x7e, 0xf0, 0x77, 0x33, 0x70, 0x3b, 0x65, 0xdb, 0xe4, 0x29, + 0xdf, 0x82, 0xc5, 0xd3, 0xa8, 0x50, 0xad, 0x2e, 0x1d, 0xf5, 0x55, 0xc5, 0x56, 0x93, 0x6b, 0x6a, + 0x36, 0x4f, 0x93, 0x80, 0x58, 0xe9, 0xa2, 0x1d, 0x4c, 0x24, 0x80, 0xa2, 0xd2, 0x45, 0xdb, 0x48, + 0xfa, 0xce, 0x11, 0xac, 0x77, 0xae, 0x04, 0xc7, 0xd8, 0xd2, 0x5f, 0x7e, 0x57, 0x64, 0x94, 0x34, + 0x30, 0x67, 0x5e, 0xc9, 0xc0, 0x3c, 0xa4, 0x3c, 0xb7, 0xa8, 0xad, 0x9f, 0xa7, 0x11, 0xbc, 0x40, + 0x45, 0x1d, 0x7a, 0xb9, 0x5e, 0x25, 0xa1, 0x0e, 0xa2, 0x17, 0xeb, 0x8d, 0x00, 0x1a, 0xfb, 0xd3, + 0x51, 0xe8, 0xc4, 0x8f, 0xd8, 0xb3, 0x6f, 0xcb, 0x3a, 0xd8, 0x8f, 0x5a, 0xb5, 0xd4, 0x8e, 0x20, + 0xea, 0x08, 0x17, 0x6b, 0x2c, 0x1a, 0xb2, 0xe6, 0xfb, 0x6b, 0x8c, 0x93, 0x3d, 0x18, 0xb7, 0x61, + 0x2d, 0xfe, 0xa2, 0x65, 0x53, 0x57, 0xcd, 0x3f, 0xcb, 0x50, 0x68, 0x73, 0xf2, 0x41, 0x7d, 0xd6, + 0x81, 0xa5, 0xc0, 0x71, 0xcf, 0x46, 0x5c, 0x6f, 0x3e, 0x90, 0x8b, 0xb0, 0x92, 0x1c, 0x9b, 0x7c, + 0x74, 0xdf, 0x5c, 0xa4, 0x1a, 0x71, 0x6b, 0x01, 0xdb, 0xbc, 0x69, 0x90, 0x31, 0x59, 0xcc, 0xac, + 0xc6, 0xfc, 0xe0, 0xbb, 0x50, 0x4f, 0x76, 0xc4, 0xbe, 0x23, 0x73, 0x3c, 0xe3, 0x51, 0xe5, 0x66, + 0xd2, 0xf5, 0x62, 0x82, 0xa8, 0xc4, 0x6b, 0x1f, 0x18, 0x7f, 0x3f, 0x03, 0x2d, 0x93, 0x0b, 0xca, + 0xd5, 0x46, 0xa9, 0x68, 0xe6, 0xc3, 0xb9, 0x56, 0x6f, 0x9e, 0xab, 0x4a, 0x1d, 0x55, 0x23, 0xfa, + 0xc6, 0x8d, 0x9b, 0xb1, 0x7b, 0x6b, 0x6e, 0x46, 0x9b, 0x25, 0x58, 0x20, 0x14, 0x63, 0x0d, 0x56, + 0xe4, 0x78, 0xd4, 0x58, 0x62, 0xef, 0x61, 0xa2, 0xc7, 0x84, 0xf7, 0x70, 0x1d, 0x5a, 0xf4, 0x42, + 0xa2, 0x3e, 0x09, 0x59, 0x71, 0x1b, 0xd8, 0xbe, 0x3d, 0xb0, 0x7d, 0xcf, 0x73, 0x8f, 0xb8, 0x2f, + 0x03, 0x45, 0x51, 0xc2, 0x44, 0xe7, 0x9a, 0x12, 0x85, 0xe9, 0x4b, 0xbd, 0xeb, 0xe7, 0xb9, 0x2a, + 0x2e, 0x86, 0xbe, 0x0c, 0x13, 0x96, 0x36, 0xed, 0xe7, 0x5c, 0xb5, 0xa4, 0x96, 0xe8, 0x23, 0xa8, + 0x4c, 0xa2, 0x46, 0xd5, 0xba, 0xab, 0x44, 0xf0, 0xf9, 0x6e, 0x4d, 0x1d, 0xdb, 0x78, 0x02, 0xcb, + 0xc9, 0x36, 0x25, 0xeb, 0x58, 0x87, 0xd2, 0x58, 0xc2, 0xe4, 0xe8, 0xa2, 0x6f, 0xe3, 0x77, 0x4b, + 0x50, 0x94, 0xfa, 0x1c, 0xdb, 0x80, 0xfc, 0x40, 0xc5, 0x26, 0xc5, 0xef, 0x8b, 0xc8, 0x52, 0xf5, + 0xff, 0x16, 0x46, 0x28, 0x09, 0x3c, 0xf6, 0x11, 0xd4, 0x93, 0x5e, 0xd1, 0x99, 0x2c, 0xd3, 0xa4, + 0x3b, 0xb3, 0x36, 0x98, 0xf1, 0x7f, 0x95, 0xe3, 0xcb, 0x91, 0x64, 0x86, 0xd2, 0xb9, 0x76, 0x7b, + 0x7a, 0xae, 0x90, 0xb7, 0x83, 0x73, 0xdb, 0x7a, 0xf2, 0xfe, 0x07, 0x32, 0xcd, 0xb4, 0x82, 0xc0, + 0xde, 0xb9, 0xfd, 0xe4, 0xfd, 0x0f, 0x66, 0x25, 0x69, 0xca, 0x34, 0xd4, 0x25, 0xe9, 0x65, 0x28, + 0xd0, 0x03, 0x76, 0x14, 0x64, 0x42, 0x1f, 0xec, 0x31, 0x2c, 0x4b, 0xb5, 0xd5, 0x92, 0xe1, 0xc0, + 0xc4, 0x05, 0x4b, 0x94, 0xda, 0x24, 0xcb, 0x7a, 0x58, 0x44, 0xb6, 0xa1, 0x55, 0x58, 0x38, 0x8f, + 0x5f, 0x23, 0xac, 0x99, 0xf2, 0xcb, 0xf8, 0xb3, 0x02, 0x54, 0xb4, 0x45, 0x61, 0x55, 0x28, 0x99, + 0x9d, 0x5e, 0xc7, 0xfc, 0xa4, 0xb3, 0xdd, 0xbc, 0xc5, 0x1e, 0xc0, 0x5b, 0xdd, 0x83, 0xad, 0x43, + 0xd3, 0xec, 0x6c, 0xf5, 0xad, 0x43, 0xd3, 0x52, 0xaf, 0xdc, 0x1c, 0xb5, 0x3f, 0xdb, 0xef, 0x1c, + 0xf4, 0xad, 0xed, 0x4e, 0xbf, 0xdd, 0xdd, 0xeb, 0x35, 0x33, 0xec, 0x35, 0x68, 0xc5, 0x98, 0xaa, + 0xb8, 0xbd, 0x7f, 0x78, 0x7c, 0xd0, 0x6f, 0x66, 0xd9, 0x3d, 0xb8, 0xb3, 0xd3, 0x3d, 0x68, 0xef, + 0x59, 0x31, 0xce, 0xd6, 0x5e, 0xff, 0x13, 0xab, 0xf3, 0xeb, 0x47, 0x5d, 0xf3, 0xb3, 0x66, 0x2e, + 0x0d, 0x41, 0x28, 0xe3, 0xaa, 0x85, 0x3c, 0xbb, 0x0d, 0x2b, 0x84, 0x40, 0x55, 0xac, 0xfe, 0xe1, + 0xa1, 0xd5, 0x3b, 0x3c, 0x3c, 0x68, 0x16, 0xd8, 0x22, 0xd4, 0xba, 0x07, 0x9f, 0xb4, 0xf7, 0xba, + 0xdb, 0x96, 0xd9, 0x69, 0xef, 0xed, 0x37, 0x17, 0xd8, 0x12, 0x34, 0x66, 0xf1, 0x8a, 0xa2, 0x09, + 0x85, 0x77, 0x78, 0xd0, 0x3d, 0x3c, 0xb0, 0x3e, 0xe9, 0x98, 0xbd, 0xee, 0xe1, 0x41, 0xb3, 0xc4, + 0x56, 0x81, 0x25, 0x8b, 0x76, 0xf7, 0xdb, 0x5b, 0xcd, 0x32, 0x5b, 0x81, 0xc5, 0x24, 0xfc, 0x59, + 0xe7, 0xb3, 0x26, 0xb0, 0x16, 0x2c, 0xd3, 0xc0, 0xac, 0xcd, 0xce, 0xde, 0xe1, 0xa7, 0xd6, 0x7e, + 0xf7, 0xa0, 0xbb, 0x7f, 0xbc, 0xdf, 0xac, 0xe0, 0xbb, 0x5b, 0x9d, 0x8e, 0xd5, 0x3d, 0xe8, 0x1d, + 0xef, 0xec, 0x74, 0xb7, 0xba, 0x9d, 0x83, 0x7e, 0xb3, 0x4a, 0x3d, 0xa7, 0x4d, 0xbc, 0x26, 0x2a, + 0xc8, 0x9c, 0x01, 0x6b, 0xbb, 0xdb, 0x6b, 0x6f, 0xee, 0x75, 0xb6, 0x9b, 0x75, 0x76, 0x17, 0x6e, + 0xf7, 0x3b, 0xfb, 0x47, 0x87, 0x66, 0xdb, 0xfc, 0x4c, 0xe5, 0x14, 0x58, 0x3b, 0xed, 0xee, 0xde, + 0xb1, 0xd9, 0x69, 0x36, 0xd8, 0x1b, 0x70, 0xd7, 0xec, 0x7c, 0x7c, 0xdc, 0x35, 0x3b, 0xdb, 0xd6, + 0xc1, 0xe1, 0x76, 0xc7, 0xda, 0xe9, 0xb4, 0xfb, 0xc7, 0x66, 0xc7, 0xda, 0xef, 0xf6, 0x7a, 0xdd, + 0x83, 0xa7, 0xcd, 0x26, 0x7b, 0x0b, 0xee, 0x47, 0x28, 0x51, 0x03, 0x33, 0x58, 0x8b, 0x62, 0x7e, + 0x6a, 0x4b, 0x0f, 0x3a, 0xbf, 0xde, 0xb7, 0x8e, 0x3a, 0x1d, 0xb3, 0xc9, 0xd8, 0x3a, 0xac, 0xc6, + 0xdd, 0x53, 0x07, 0xb2, 0xef, 0x25, 0x51, 0x76, 0xd4, 0x31, 0xf7, 0xdb, 0x07, 0x62, 0x83, 0x13, + 0x65, 0xcb, 0x62, 0xd8, 0x71, 0xd9, 0xec, 0xb0, 0x57, 0x18, 0x83, 0xba, 0xb6, 0x2b, 0x3b, 0x6d, + 0xb3, 0xb9, 0xca, 0x1a, 0x50, 0xd9, 0x3f, 0x3a, 0xb2, 0xfa, 0xdd, 0xfd, 0xce, 0xe1, 0x71, 0xbf, + 0xb9, 0xc6, 0x56, 0xa0, 0xd9, 0x3d, 0xe8, 0x77, 0x4c, 0xb1, 0xd7, 0xaa, 0xea, 0xff, 0x2a, 0xb2, + 0x65, 0x68, 0xa8, 0x91, 0x2a, 0xe8, 0xcf, 0x8a, 0x6c, 0x0d, 0xd8, 0xf1, 0x81, 0xd9, 0x69, 0x6f, + 0x8b, 0x85, 0x8b, 0x0a, 0xfe, 0x77, 0x51, 0x7a, 0x48, 0x7e, 0x9a, 0x8b, 0x2e, 0xeb, 0x38, 0xe4, + 0x20, 0xf9, 0x36, 0x6d, 0x55, 0x7b, 0x53, 0xf6, 0x65, 0xaf, 0xc6, 0x6b, 0xaa, 0x55, 0x6e, 0x4e, + 0xb5, 0x9a, 0xd3, 0xdd, 0x6b, 0xba, 0xec, 0xf7, 0x26, 0xd4, 0xc6, 0xf4, 0x4e, 0xad, 0x7c, 0x8f, + 0x12, 0x64, 0xfc, 0x0d, 0x01, 0xe9, 0x31, 0xca, 0xb9, 0x67, 0xd3, 0x0b, 0xf3, 0xcf, 0xa6, 0xa7, + 0xc9, 0xf7, 0x0b, 0x69, 0xf2, 0xfd, 0x43, 0x58, 0x24, 0xd6, 0xe4, 0xb8, 0xce, 0x58, 0x69, 0xcd, + 0x24, 0x05, 0x36, 0x90, 0x45, 0x11, 0x5c, 0xa9, 0x13, 0x4a, 0xe5, 0x90, 0x2c, 0xa4, 0x28, 0xb5, + 0x8d, 0x84, 0xa6, 0x41, 0x9c, 0x23, 0xd2, 0x34, 0xa2, 0x1e, 0xec, 0xab, 0xb8, 0x87, 0x8a, 0xd6, + 0x03, 0xc1, 0xb1, 0x87, 0x87, 0xb0, 0xc8, 0xaf, 0x42, 0xdf, 0xb6, 0xbc, 0x89, 0xfd, 0xf9, 0x14, + 0x5d, 0xb8, 0x36, 0xea, 0xf0, 0x55, 0xb3, 0x81, 0x05, 0x87, 0x08, 0xdf, 0xb6, 0x43, 0xfb, 0xe1, + 0x17, 0x50, 0xd1, 0xde, 0x30, 0x66, 0x6b, 0xb0, 0xf4, 0x69, 0xb7, 0x7f, 0xd0, 0xe9, 0xf5, 0xac, + 0xa3, 0xe3, 0xcd, 0x67, 0x9d, 0xcf, 0xac, 0xdd, 0x76, 0x6f, 0xb7, 0x79, 0x4b, 0x1c, 0xda, 0x83, + 0x4e, 0xaf, 0xdf, 0xd9, 0x4e, 0xc0, 0x33, 0xec, 0x75, 0x58, 0x3f, 0x3e, 0x38, 0xee, 0x75, 0xb6, + 0xad, 0xb4, 0x7a, 0x59, 0x41, 0xa5, 0xb2, 0x3c, 0xa5, 0x7a, 0xee, 0xe1, 0xf7, 0xa1, 0x9e, 0x7c, + 0x58, 0x93, 0x01, 0x2c, 0xec, 0x75, 0x9e, 0xb6, 0xb7, 0x3e, 0xa3, 0x97, 0xf9, 0x7a, 0xfd, 0x76, + 0xbf, 0xbb, 0x65, 0xc9, 0x97, 0xf8, 0x04, 0x47, 0xc8, 0xb0, 0x0a, 0x14, 0xdb, 0x07, 0x5b, 0xbb, + 0x87, 0x66, 0xaf, 0x99, 0x7d, 0xf8, 0x11, 0x34, 0x67, 0xfd, 0x51, 0x09, 0x07, 0xde, 0x8b, 0x3c, + 0x7d, 0x0f, 0xff, 0x55, 0x0e, 0x20, 0x4e, 0x18, 0x10, 0xac, 0x66, 0xbb, 0xdd, 0x6f, 0xef, 0x1d, + 0x8a, 0x69, 0x98, 0x87, 0x7d, 0xc1, 0x41, 0xcc, 0xce, 0xc7, 0xcd, 0x5b, 0xa9, 0x25, 0x87, 0x47, + 0xfd, 0x66, 0x46, 0xac, 0x58, 0xf7, 0xa0, 0xdb, 0xef, 0xb6, 0xf7, 0x2c, 0xf3, 0xf0, 0xb8, 0x7b, + 0xf0, 0x94, 0x9e, 0x1c, 0x43, 0x2e, 0x7b, 0x7c, 0xb4, 0x63, 0x1e, 0x1e, 0xf4, 0xad, 0xde, 0xee, + 0x71, 0x7f, 0x1b, 0x1f, 0x2c, 0xdb, 0x32, 0xbb, 0x47, 0xd4, 0x66, 0xfe, 0x45, 0x08, 0xa2, 0xe9, + 0x82, 0x58, 0xf3, 0xa7, 0x87, 0xbd, 0x5e, 0xf7, 0xc8, 0xfa, 0xf8, 0xb8, 0x63, 0x76, 0x3b, 0x3d, + 0xac, 0xb8, 0x90, 0x02, 0x17, 0xf8, 0x45, 0xc1, 0x9b, 0xfb, 0x7b, 0x9f, 0x48, 0xe6, 0x29, 0x50, + 0x4b, 0x49, 0x90, 0xc0, 0x2a, 0x0b, 0x9e, 0x22, 0xb8, 0x4f, 0x4a, 0xcb, 0x70, 0x43, 0x99, 0xa8, + 0x57, 0x11, 0x7c, 0x75, 0x6e, 0x33, 0xb0, 0x5a, 0x35, 0xbd, 0x48, 0xd4, 0x42, 0x96, 0x1b, 0x5d, + 0x50, 0xdb, 0xdb, 0x26, 0x56, 0xa8, 0xcf, 0x41, 0x05, 0x6e, 0x43, 0x6c, 0x94, 0x60, 0x4f, 0x02, + 0xa5, 0xa9, 0x3e, 0x44, 0xc9, 0xe2, 0x93, 0xdf, 0xc9, 0x41, 0x9d, 0x92, 0xb7, 0xe8, 0x27, 0xa4, + 0xb8, 0xcf, 0xf6, 0xa1, 0x28, 0x7f, 0x8b, 0x8c, 0xad, 0x44, 0xaf, 0x41, 0xe9, 0xbf, 0x7e, 0xb6, + 0xbe, 0x3a, 0x0b, 0x96, 0xe2, 0xd8, 0xd2, 0xdf, 0xf8, 0xd3, 0xff, 0xf9, 0x0f, 0xb2, 0x35, 0x56, + 0x79, 0x74, 0xf1, 0xde, 0xa3, 0x33, 0xee, 0x06, 0xa2, 0x8d, 0xff, 0x1f, 0x20, 0xfe, 0x85, 0x2d, + 0xd6, 0x8a, 0x9c, 0x50, 0x33, 0x3f, 0x3f, 0xb6, 0x7e, 0x3b, 0xa5, 0x44, 0xb6, 0x7b, 0x1b, 0xdb, + 0x5d, 0x32, 0xea, 0xa2, 0x5d, 0xc7, 0x75, 0x42, 0xfa, 0xb5, 0xad, 0x0f, 0x33, 0x0f, 0xd9, 0x10, + 0xaa, 0xfa, 0x6f, 0x5f, 0x31, 0x25, 0x29, 0xa5, 0xfc, 0x7a, 0xd7, 0xfa, 0x9d, 0xd4, 0x32, 0x25, + 0x83, 0x62, 0x1f, 0x2b, 0x46, 0x53, 0xf4, 0x31, 0x45, 0x8c, 0xb8, 0x97, 0x11, 0x49, 0xe5, 0xf1, + 0x4f, 0x5c, 0xb1, 0xd7, 0x34, 0xb9, 0x6a, 0xee, 0x07, 0xb6, 0xd6, 0xef, 0xde, 0x50, 0x2a, 0xfb, + 0xba, 0x8b, 0x7d, 0xad, 0x19, 0x4c, 0xf4, 0x35, 0x40, 0x1c, 0xf5, 0x03, 0x5b, 0x1f, 0x66, 0x1e, + 0x3e, 0xf9, 0xcb, 0x07, 0x50, 0x8e, 0x82, 0x39, 0xd9, 0x6f, 0x41, 0x2d, 0x91, 0x5d, 0xc7, 0xd4, + 0x34, 0xd2, 0x92, 0xf1, 0xd6, 0x5f, 0x4b, 0x2f, 0x94, 0x1d, 0xbf, 0x8e, 0x1d, 0xb7, 0xd8, 0xaa, + 0xe8, 0x58, 0x66, 0xaf, 0x3d, 0xc2, 0x6c, 0x58, 0x7a, 0x5b, 0xeb, 0xb9, 0xa6, 0x7d, 0x50, 0x67, + 0xaf, 0xcd, 0x6a, 0x04, 0x89, 0xde, 0xee, 0xde, 0x50, 0x2a, 0xbb, 0x7b, 0x0d, 0xbb, 0x5b, 0x65, + 0xcb, 0x7a, 0x77, 0x2a, 0xf4, 0x92, 0x71, 0x7c, 0xcf, 0x4e, 0xff, 0x05, 0x28, 0x76, 0x37, 0x7e, + 0x7d, 0x2c, 0xe5, 0x97, 0xa1, 0x22, 0x12, 0x99, 0xff, 0x79, 0x28, 0xa3, 0x85, 0x5d, 0x31, 0x86, + 0xdb, 0xa7, 0xff, 0x00, 0x14, 0x3b, 0x81, 0x8a, 0xf6, 0xa3, 0x09, 0xec, 0xf6, 0x8d, 0x3f, 0xf0, + 0xb0, 0xbe, 0x9e, 0x56, 0x94, 0x36, 0x15, 0xbd, 0xfd, 0x47, 0xa7, 0x9c, 0xb3, 0xdf, 0x80, 0x72, + 0xf4, 0x14, 0x3f, 0x5b, 0xd3, 0x7e, 0x1a, 0x41, 0xff, 0xe9, 0x80, 0xf5, 0xd6, 0x7c, 0x41, 0x1a, + 0xf1, 0xe9, 0xad, 0x0b, 0xe2, 0xfb, 0x14, 0x2a, 0xda, 0x73, 0xfb, 0xd1, 0x04, 0xe6, 0x9f, 0xf4, + 0x8f, 0x26, 0x90, 0xf2, 0x3a, 0xbf, 0xb1, 0x88, 0x5d, 0x54, 0x58, 0x19, 0xe9, 0x3b, 0xbc, 0xf2, + 0x02, 0xb6, 0x07, 0x2b, 0x52, 0xd3, 0x3a, 0xe1, 0x5f, 0x66, 0x1b, 0x52, 0x7e, 0x74, 0xeb, 0x71, + 0x86, 0x7d, 0x04, 0x25, 0xf5, 0xab, 0x0a, 0x6c, 0x35, 0xfd, 0xd7, 0x21, 0xd6, 0xd7, 0xe6, 0xe0, + 0x52, 0x2d, 0xfa, 0x0c, 0x20, 0x7e, 0xdb, 0x3f, 0x62, 0x12, 0x73, 0xbf, 0x15, 0x10, 0x51, 0xc0, + 0xfc, 0x0f, 0x01, 0x18, 0xab, 0x38, 0xc1, 0x26, 0x43, 0x26, 0xe1, 0xf2, 0x4b, 0xf5, 0xe8, 0xe8, + 0x8f, 0xa0, 0xa2, 0x3d, 0xef, 0x1f, 0x2d, 0xdf, 0xfc, 0x4f, 0x03, 0x44, 0xcb, 0x97, 0xf2, 0x6b, + 0x00, 0xc6, 0x3a, 0xb6, 0xbe, 0x6c, 0x34, 0x44, 0xeb, 0x42, 0xd4, 0x92, 0x22, 0x8f, 0xd8, 0xa0, + 0x73, 0xa8, 0x25, 0xde, 0xf0, 0x8f, 0x4e, 0x68, 0xda, 0x2f, 0x04, 0x44, 0x27, 0x34, 0xf5, 0xd9, + 0x7f, 0x45, 0x67, 0xc6, 0xa2, 0xe8, 0xe7, 0x02, 0x51, 0xb4, 0x9e, 0x7e, 0x08, 0x15, 0xed, 0x3d, + 0xfe, 0x68, 0x2e, 0xf3, 0x4f, 0xff, 0x47, 0x73, 0x49, 0x7b, 0xbe, 0x7f, 0x19, 0xfb, 0xa8, 0x1b, + 0x48, 0x0a, 0xf8, 0x6c, 0xa2, 0x68, 0xfb, 0xb7, 0xa0, 0x9e, 0x7c, 0xa2, 0x3f, 0x3a, 0xfb, 0xa9, + 0x6f, 0xfd, 0x47, 0x67, 0xff, 0x86, 0x77, 0xfd, 0x25, 0x49, 0x3f, 0x5c, 0x8a, 0x3a, 0x79, 0xf4, + 0x13, 0x99, 0x96, 0xf2, 0x05, 0xfb, 0x58, 0x30, 0x38, 0xf9, 0x6a, 0x27, 0x5b, 0xd3, 0xa8, 0x56, + 0x7f, 0xfe, 0x33, 0x3a, 0x2f, 0x73, 0x0f, 0x7c, 0x26, 0x89, 0x19, 0x1b, 0x67, 0x4f, 0x61, 0x29, + 0x22, 0xe6, 0xe8, 0x19, 0xce, 0x20, 0x9a, 0x43, 0xea, 0x63, 0x9f, 0xeb, 0xcd, 0xd9, 0xd2, 0xc7, + 0x19, 0xba, 0xfe, 0xf0, 0xf1, 0x43, 0xed, 0xfa, 0xd3, 0x5f, 0xe2, 0xd4, 0xae, 0xbf, 0xc4, 0x1b, + 0x89, 0xb3, 0xd7, 0x5f, 0xe8, 0x88, 0x36, 0x5c, 0x68, 0xcc, 0x3e, 0x8a, 0x79, 0xf7, 0xa6, 0xb4, + 0x7f, 0x6a, 0xfe, 0xf5, 0x17, 0xbf, 0x0a, 0x90, 0x64, 0x45, 0x8a, 0x9b, 0x3e, 0x92, 0xc1, 0x27, + 0xec, 0x37, 0xa1, 0xaa, 0xbf, 0x0f, 0xce, 0x74, 0x9e, 0x30, 0xdb, 0xd3, 0x9d, 0xd4, 0xb2, 0x24, + 0x95, 0xb0, 0xaa, 0xde, 0x0d, 0xfb, 0x04, 0x56, 0xa3, 0x65, 0xd6, 0xf3, 0xd6, 0x03, 0x76, 0x2f, + 0x25, 0x9b, 0x3d, 0xb1, 0xd8, 0xb7, 0x6f, 0x4c, 0x77, 0x7f, 0x9c, 0x11, 0xd4, 0x97, 0x7c, 0xa8, + 0x38, 0xbe, 0x79, 0xd2, 0xde, 0x67, 0x8e, 0x6f, 0x9e, 0xd4, 0xd7, 0x8d, 0x15, 0xf5, 0xb1, 0xa5, + 0xc4, 0x1a, 0x51, 0x58, 0x2e, 0xfb, 0x21, 0x34, 0xb4, 0xa4, 0xfc, 0xde, 0xb5, 0x3b, 0x88, 0x4e, + 0xd2, 0xfc, 0x4b, 0x7b, 0xeb, 0x69, 0xb6, 0x49, 0x63, 0x0d, 0xdb, 0x5f, 0x34, 0x12, 0x8b, 0x23, + 0x4e, 0xd1, 0x16, 0x54, 0xf4, 0x84, 0xff, 0x17, 0xb4, 0xbb, 0xa6, 0x15, 0xe9, 0x8f, 0xba, 0x3d, + 0xce, 0xb0, 0x3d, 0x68, 0xce, 0xbe, 0x41, 0x15, 0xf1, 0x94, 0xb4, 0x77, 0xb3, 0xd6, 0x67, 0x0a, + 0x13, 0x2f, 0x57, 0xb1, 0x23, 0x4a, 0xec, 0x88, 0x7e, 0xa1, 0xca, 0xf3, 0x67, 0x6f, 0xf5, 0xe4, + 0x2f, 0x57, 0x45, 0xad, 0xa5, 0xfd, 0x66, 0xd9, 0x83, 0xcc, 0xe3, 0x0c, 0xfb, 0xbd, 0x0c, 0x54, + 0x13, 0xef, 0xbe, 0x24, 0x42, 0xe7, 0x67, 0xe6, 0xd9, 0xd2, 0xcb, 0xf4, 0x89, 0x1a, 0x26, 0x2e, + 0xe2, 0xde, 0xc3, 0x1f, 0x24, 0x36, 0xe9, 0x27, 0x09, 0xd7, 0xde, 0xc6, 0xec, 0x4f, 0x58, 0x7d, + 0x31, 0x8b, 0xa0, 0x3f, 0xa0, 0xf8, 0xc5, 0xe3, 0x0c, 0xfb, 0x37, 0x19, 0xa8, 0x27, 0x7d, 0xf6, + 0xd1, 0x74, 0x53, 0xa3, 0x03, 0x22, 0x52, 0xba, 0xc1, 0xd1, 0xff, 0x43, 0x1c, 0x65, 0xff, 0xa1, + 0x99, 0x18, 0xa5, 0x7c, 0x62, 0xfb, 0x17, 0x1b, 0x2d, 0xfb, 0x90, 0x7e, 0x31, 0x52, 0x85, 0x32, + 0xb1, 0xf9, 0x5f, 0x18, 0x8c, 0xc8, 0x4f, 0xff, 0x3d, 0x3e, 0xdc, 0x84, 0x1f, 0xd1, 0x4f, 0x35, + 0xa9, 0xc8, 0x18, 0x41, 0xc5, 0xaf, 0x5a, 0xdf, 0x78, 0x0b, 0xe7, 0xf4, 0xba, 0x71, 0x3b, 0x31, + 0xa7, 0x59, 0xc1, 0xa3, 0x4d, 0xa3, 0x93, 0x3f, 0xa7, 0x17, 0xdf, 0x9c, 0x73, 0x3f, 0xb1, 0x77, + 0xf3, 0x20, 0xc7, 0x34, 0x48, 0x89, 0x9e, 0x38, 0x6a, 0xaf, 0xd8, 0x8c, 0xf1, 0x10, 0xc7, 0xfa, + 0x96, 0x71, 0xef, 0xc6, 0xb1, 0x3e, 0x42, 0xff, 0xbb, 0x18, 0xf1, 0x11, 0x40, 0x1c, 0x6a, 0xc8, + 0x66, 0x02, 0xde, 0x22, 0x06, 0x34, 0x1f, 0x8d, 0x98, 0x3c, 0xcf, 0x2a, 0x2e, 0x4e, 0xb4, 0xf8, + 0x1b, 0xc4, 0x4e, 0xa3, 0x50, 0x3c, 0x5d, 0xfa, 0x4a, 0x46, 0x05, 0x26, 0xa4, 0xaf, 0xd9, 0xf6, + 0x13, 0xcc, 0x34, 0x8a, 0xbb, 0x3b, 0x86, 0xda, 0x9e, 0xe7, 0x3d, 0x9f, 0x4e, 0xa2, 0xf0, 0xf6, + 0x64, 0x50, 0xcc, 0xae, 0x1d, 0x9c, 0xaf, 0xcf, 0xcc, 0xc2, 0xb8, 0x8f, 0x4d, 0xad, 0xb3, 0x96, + 0xd6, 0xd4, 0xa3, 0x9f, 0xc4, 0xf1, 0x8d, 0x5f, 0x30, 0x1b, 0x16, 0x23, 0x1e, 0x1d, 0xc7, 0x10, + 0x26, 0x9b, 0x49, 0x70, 0xe6, 0xd9, 0x2e, 0x12, 0x6a, 0x82, 0x1a, 0xed, 0xa3, 0x40, 0xb5, 0xf9, + 0x38, 0xc3, 0x8e, 0xa0, 0xba, 0xcd, 0x07, 0x98, 0xa8, 0x8f, 0xa1, 0x25, 0x4b, 0x89, 0x30, 0x05, + 0x8a, 0x49, 0x59, 0xaf, 0x25, 0x80, 0xc9, 0x7b, 0x6b, 0x62, 0x5f, 0xfb, 0xfc, 0xf3, 0x47, 0x3f, + 0x91, 0x41, 0x2b, 0x5f, 0xa8, 0x7b, 0x4b, 0x05, 0xf5, 0x24, 0xee, 0xad, 0x99, 0x28, 0xa0, 0xc4, + 0xbd, 0x35, 0x17, 0x05, 0x94, 0x58, 0x6a, 0x15, 0x54, 0xc4, 0x46, 0xb0, 0x38, 0x17, 0x38, 0x14, + 0x5d, 0x59, 0x37, 0x85, 0x1b, 0xad, 0xdf, 0xbf, 0x19, 0x21, 0xd9, 0xdb, 0xc3, 0x64, 0x6f, 0x3d, + 0xa8, 0xd1, 0x9b, 0x8e, 0x27, 0x9c, 0x52, 0xf6, 0x66, 0xde, 0xbb, 0xd1, 0xf3, 0x01, 0x67, 0x2f, + 0x18, 0x2c, 0x4b, 0x4a, 0x38, 0x98, 0x2b, 0xc7, 0x7e, 0x03, 0x2a, 0x4f, 0x79, 0xa8, 0x72, 0xf4, + 0x22, 0x19, 0x7b, 0x26, 0x69, 0x6f, 0x3d, 0x25, 0xc5, 0x2f, 0x49, 0x33, 0xd8, 0xda, 0x23, 0x3e, + 0x3c, 0xe3, 0xc4, 0x9c, 0x2c, 0x67, 0xf8, 0x05, 0xfb, 0x75, 0x6c, 0x3c, 0x4a, 0x8d, 0x5e, 0xd5, + 0x92, 0xb0, 0xf4, 0xc6, 0x1b, 0x33, 0xf0, 0xb4, 0x96, 0x5d, 0x6f, 0xc8, 0x35, 0x59, 0xcf, 0x85, + 0x8a, 0xf6, 0x84, 0x42, 0x74, 0x80, 0xe6, 0x9f, 0xcc, 0x88, 0x0e, 0x50, 0xca, 0x8b, 0x0b, 0xc6, + 0x03, 0xec, 0xc7, 0x60, 0xf7, 0xe3, 0x7e, 0xe8, 0x95, 0x85, 0xb8, 0xa7, 0x47, 0x3f, 0xb1, 0xc7, + 0xe1, 0x17, 0xec, 0x53, 0x7c, 0x39, 0x5d, 0xcf, 0x41, 0x8c, 0x95, 0x86, 0xd9, 0x74, 0xc5, 0x68, + 0xb1, 0xb4, 0xa2, 0xa4, 0x22, 0x41, 0x5d, 0xa1, 0x24, 0xf7, 0x3e, 0x40, 0x2f, 0xf4, 0x26, 0xdb, + 0x36, 0x1f, 0x7b, 0x6e, 0xcc, 0x6b, 0xe3, 0xac, 0xb8, 0x98, 0x7f, 0x69, 0xa9, 0x71, 0xec, 0x53, + 0x4d, 0xcb, 0x4a, 0xa4, 0x71, 0x2a, 0xe2, 0xba, 0x31, 0x71, 0x2e, 0x5a, 0x90, 0x94, 0xe4, 0xb9, + 0xc7, 0x19, 0xd6, 0x06, 0x88, 0x23, 0xc7, 0x22, 0x9d, 0x69, 0x2e, 0x28, 0x2d, 0x62, 0x7b, 0x29, + 0x61, 0x66, 0x47, 0x50, 0x8e, 0x43, 0x6e, 0xd6, 0xe2, 0x17, 0x61, 0x12, 0x01, 0x3a, 0xd1, 0x0d, + 0x3e, 0x17, 0xee, 0x62, 0x34, 0x71, 0xa9, 0x80, 0x95, 0xc4, 0x52, 0x9d, 0x72, 0x1e, 0x30, 0x07, + 0x96, 0x68, 0x80, 0x91, 0xb8, 0x84, 0xd9, 0x5c, 0xd1, 0x03, 0xf9, 0xf3, 0x91, 0x27, 0xd1, 0x69, + 0x4e, 0x8d, 0x9f, 0x48, 0x98, 0x7e, 0x04, 0xb5, 0x52, 0x26, 0x99, 0x60, 0xcd, 0x63, 0x58, 0x9c, + 0x73, 0xd1, 0x47, 0x47, 0xfa, 0xa6, 0x98, 0x8b, 0xe8, 0x48, 0xdf, 0xe8, 0xdd, 0x37, 0x56, 0xb0, + 0xcb, 0x86, 0x01, 0xa8, 0xea, 0x5d, 0x3a, 0xe1, 0xe0, 0x5c, 0x74, 0xf7, 0x2f, 0x33, 0xb0, 0x94, + 0xe2, 0x84, 0x67, 0x6f, 0x28, 0xab, 0xc1, 0x8d, 0x0e, 0xfa, 0xf5, 0x54, 0x67, 0xad, 0xd1, 0xc3, + 0x7e, 0xf6, 0xd9, 0xb3, 0xc4, 0xc5, 0x46, 0xbe, 0x52, 0x79, 0x32, 0x5f, 0x28, 0x54, 0xa4, 0x4a, + 0x14, 0x9f, 0xc3, 0x1a, 0x0d, 0xa4, 0x3d, 0x1a, 0xcd, 0x38, 0x92, 0x5f, 0x9f, 0xfb, 0x45, 0xf9, + 0x84, 0x73, 0x7c, 0xfd, 0xe6, 0x5f, 0x9c, 0xbf, 0x41, 0x9c, 0xa6, 0xa1, 0xb2, 0x29, 0x34, 0x67, + 0x1d, 0xb4, 0xec, 0xe6, 0xb6, 0xd6, 0xef, 0x25, 0xf4, 0xdf, 0x14, 0xa7, 0xee, 0xd7, 0xb0, 0xb3, + 0x7b, 0xc6, 0x7a, 0xda, 0xba, 0x90, 0x4a, 0x2c, 0xf6, 0xe3, 0xaf, 0x47, 0xde, 0xe4, 0x99, 0x79, + 0xaa, 0x0e, 0x6e, 0xf2, 0x7d, 0x47, 0x1a, 0x78, 0xba, 0x33, 0xfa, 0x6d, 0xec, 0xfe, 0xbe, 0x71, + 0x27, 0xad, 0x7b, 0x9f, 0xaa, 0x90, 0x2e, 0xbe, 0x36, 0x7b, 0xae, 0xd5, 0x08, 0xee, 0xa7, 0xed, + 0xf7, 0x8d, 0xba, 0xd0, 0xcc, 0x5a, 0xdf, 0x42, 0xd9, 0xae, 0xaa, 0x7b, 0x8f, 0xa3, 0xe3, 0x93, + 0xe2, 0xa6, 0x8e, 0x8e, 0x4f, 0x9a, 0xbb, 0x39, 0x29, 0xd7, 0x28, 0x47, 0xf3, 0x87, 0x99, 0x87, + 0x9b, 0xef, 0xfc, 0xf0, 0x6b, 0x67, 0x4e, 0x78, 0x3e, 0x3d, 0xd9, 0x18, 0x78, 0xe3, 0x47, 0x23, + 0x65, 0x6d, 0x94, 0x29, 0xcf, 0x8f, 0x46, 0xee, 0xf0, 0x11, 0x36, 0x7b, 0xb2, 0x30, 0xf1, 0xbd, + 0xd0, 0xfb, 0xd6, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x70, 0x9a, 0xaf, 0x28, 0x34, 0x83, 0x00, + 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index 64f7a30c533..fe5fb29f752 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -1982,6 +1982,23 @@ message PendingChannelsResponse { /// The balance in satoshis encumbered in this channel int64 limbo_balance = 2; + + /** + A list of valid commitment transactions. Any of these can confirm at + this point. + */ + Commitments commitments = 3; + } + + message Commitments { + /// Hash of the local version of the commitment tx. + string local_txid = 1; + + /// Hash of the remote version of the commitment tx. + string remote_txid = 2; + + /// Hash of the remote pending version of the commitment tx. + string remote_pending_txid = 3; } message ClosedChannel { @@ -2016,6 +2033,14 @@ message PendingChannelsResponse { int64 recovered_balance = 6; repeated PendingHTLC pending_htlcs = 8; + + enum AnchorState { + LIMBO = 0; + RECOVERED = 1; + LOST = 2; + } + + AnchorState anchor = 9; } /// The balance in satoshis encumbered in pending channels diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 73f192928ea..64b693abad2 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -1534,6 +1534,15 @@ "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." }, + "ForceClosedChannelAnchorState": { + "type": "string", + "enum": [ + "LIMBO", + "RECOVERED", + "LOST" + ], + "default": "LIMBO" + }, "HTLCAttemptHTLCStatus": { "type": "string", "enum": [ @@ -1594,6 +1603,23 @@ } } }, + "PendingChannelsResponseCommitments": { + "type": "object", + "properties": { + "local_txid": { + "type": "string", + "description": "/ Hash of the local version of the commitment tx." + }, + "remote_txid": { + "type": "string", + "description": "/ Hash of the remote version of the commitment tx." + }, + "remote_pending_txid": { + "type": "string", + "description": "/ Hash of the remote pending version of the commitment tx." + } + } + }, "PendingChannelsResponseForceClosedChannel": { "type": "object", "properties": { @@ -1630,6 +1656,9 @@ "items": { "$ref": "#/definitions/lnrpcPendingHTLC" } + }, + "anchor": { + "$ref": "#/definitions/ForceClosedChannelAnchorState" } } }, @@ -1706,6 +1735,10 @@ "type": "string", "format": "int64", "title": "/ The balance in satoshis encumbered in this channel" + }, + "commitments": { + "$ref": "#/definitions/PendingChannelsResponseCommitments", + "description": "*\nA list of valid commitment transactions. Any of these can confirm at\nthis point." } } }, diff --git a/lnrpc/walletrpc/walletkit.pb.go b/lnrpc/walletrpc/walletkit.pb.go index a8b5623679c..ce1e081375e 100644 --- a/lnrpc/walletrpc/walletkit.pb.go +++ b/lnrpc/walletrpc/walletkit.pb.go @@ -84,6 +84,10 @@ const ( //A witness type that allows us to sweep an output that sends to a nested P2SH //script that pays to a key solely under our control. WitnessType_NESTED_WITNESS_KEY_HASH WitnessType = 12 + // + //A witness type that allows us to spend our anchor on the commitment + //transaction. + WitnessType_COMMITMENT_ANCHOR WitnessType = 13 ) var WitnessType_name = map[int32]string{ @@ -100,6 +104,7 @@ var WitnessType_name = map[int32]string{ 10: "HTLC_SECOND_LEVEL_REVOKE", 11: "WITNESS_KEY_HASH", 12: "NESTED_WITNESS_KEY_HASH", + 13: "COMMITMENT_ANCHOR", } var WitnessType_value = map[string]int32{ @@ -116,6 +121,7 @@ var WitnessType_value = map[string]int32{ "HTLC_SECOND_LEVEL_REVOKE": 10, "WITNESS_KEY_HASH": 11, "NESTED_WITNESS_KEY_HASH": 12, + "COMMITMENT_ANCHOR": 13, } func (x WitnessType) String() string { @@ -828,73 +834,73 @@ func init() { func init() { proto.RegisterFile("walletrpc/walletkit.proto", fileDescriptor_6cc6942ac78249e5) } var fileDescriptor_6cc6942ac78249e5 = []byte{ - // 1047 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x6b, 0x6f, 0xea, 0x46, - 0x10, 0x2d, 0x21, 0x21, 0x30, 0x40, 0x42, 0x96, 0x3c, 0x7c, 0xb9, 0xb9, 0x0d, 0x75, 0x1f, 0x42, - 0x7d, 0x80, 0x9a, 0xa8, 0x55, 0x1f, 0x52, 0xd5, 0x84, 0x38, 0x22, 0x82, 0x60, 0x6a, 0x3b, 0x37, - 0xba, 0x55, 0xa5, 0x95, 0x03, 0x1b, 0x62, 0x01, 0xb6, 0xef, 0x7a, 0x29, 0xf8, 0x6b, 0x7f, 0x44, - 0xa5, 0xfe, 0x95, 0xfe, 0xba, 0xca, 0xeb, 0x07, 0x6b, 0x68, 0x2a, 0xf5, 0x53, 0xf0, 0x39, 0x67, - 0x8e, 0x67, 0x67, 0xc7, 0x33, 0x81, 0x57, 0x0b, 0x73, 0x3a, 0x25, 0x8c, 0xba, 0xc3, 0x56, 0xf8, - 0x6b, 0x62, 0xb1, 0xa6, 0x4b, 0x1d, 0xe6, 0xa0, 0x42, 0x42, 0xd5, 0x0a, 0xd4, 0x1d, 0x86, 0x68, - 0xed, 0xd0, 0xb3, 0xc6, 0x76, 0x20, 0x0f, 0xfe, 0x12, 0x1a, 0xa2, 0xf2, 0x2f, 0x90, 0xeb, 0x12, - 0x5f, 0x23, 0xef, 0x51, 0x03, 0x2a, 0x13, 0xe2, 0xe3, 0x27, 0xcb, 0x1e, 0x13, 0x8a, 0x5d, 0x6a, - 0xd9, 0x4c, 0xca, 0xd4, 0x33, 0x8d, 0x1d, 0x6d, 0x6f, 0x42, 0xfc, 0x1b, 0x0e, 0x0f, 0x02, 0x14, - 0xbd, 0x01, 0xe0, 0x4a, 0x73, 0x66, 0x4d, 0x7d, 0x69, 0x8b, 0x6b, 0x0a, 0x81, 0x86, 0x03, 0x72, - 0x19, 0x8a, 0x97, 0xa3, 0x11, 0xd5, 0xc8, 0xfb, 0x39, 0xf1, 0x98, 0x2c, 0x43, 0x29, 0x7c, 0xf4, - 0x5c, 0xc7, 0xf6, 0x08, 0x42, 0xb0, 0x6d, 0x8e, 0x46, 0x94, 0x7b, 0x17, 0x34, 0xfe, 0x5b, 0xfe, - 0x04, 0x8a, 0x06, 0x35, 0x6d, 0xcf, 0x1c, 0x32, 0xcb, 0xb1, 0xd1, 0x11, 0xe4, 0xd8, 0x12, 0x3f, - 0x93, 0x25, 0x17, 0x95, 0xb4, 0x1d, 0xb6, 0xec, 0x90, 0xa5, 0xfc, 0x2d, 0xec, 0x0f, 0xe6, 0x8f, - 0x53, 0xcb, 0x7b, 0x4e, 0xcc, 0x3e, 0x86, 0xb2, 0x1b, 0x42, 0x98, 0x50, 0xea, 0xc4, 0xae, 0xa5, - 0x08, 0x54, 0x02, 0x4c, 0xfe, 0x0d, 0x90, 0x4e, 0xec, 0x91, 0x3a, 0x67, 0xee, 0x9c, 0x79, 0x51, - 0x5e, 0xe8, 0x14, 0xc0, 0x33, 0x19, 0x76, 0x09, 0xc5, 0x93, 0x05, 0x8f, 0xcb, 0x6a, 0x79, 0xcf, - 0x64, 0x03, 0x42, 0xbb, 0x0b, 0xd4, 0x80, 0x5d, 0x27, 0xd4, 0x4b, 0x5b, 0xf5, 0x6c, 0xa3, 0x78, - 0xbe, 0xd7, 0x8c, 0xea, 0xd7, 0x34, 0x96, 0xea, 0x9c, 0x69, 0x31, 0x2d, 0x7f, 0x09, 0xd5, 0x94, - 0x7b, 0x94, 0xd9, 0x11, 0xe4, 0xa8, 0xb9, 0xc0, 0x2c, 0x39, 0x03, 0x35, 0x17, 0xc6, 0x52, 0xfe, - 0x06, 0x90, 0xe2, 0x31, 0x6b, 0x66, 0x32, 0x72, 0x43, 0x48, 0x9c, 0xcb, 0x19, 0x14, 0x87, 0x8e, - 0xfd, 0x84, 0x99, 0x49, 0xc7, 0x24, 0x2e, 0x3b, 0x04, 0x90, 0xc1, 0x11, 0xf9, 0x02, 0xaa, 0xa9, - 0xb0, 0xe8, 0x25, 0xff, 0x79, 0x06, 0xf9, 0xaf, 0x2c, 0x94, 0x06, 0xc4, 0x1e, 0x59, 0xf6, 0x58, - 0x5f, 0x10, 0xe2, 0xa2, 0x2f, 0x20, 0x1f, 0x64, 0xed, 0xc4, 0x57, 0x5b, 0x3c, 0xdf, 0x6f, 0x4e, - 0xf9, 0x99, 0xd4, 0x39, 0x1b, 0x04, 0xb0, 0x96, 0x08, 0xd0, 0xf7, 0x50, 0x5a, 0x58, 0xcc, 0x26, - 0x9e, 0x87, 0x99, 0xef, 0x12, 0x7e, 0xcf, 0x7b, 0xe7, 0xc7, 0xcd, 0xa4, 0xb9, 0x9a, 0x0f, 0x21, - 0x6d, 0xf8, 0x2e, 0xd1, 0x8a, 0x8b, 0xd5, 0x43, 0xd0, 0x20, 0xe6, 0xcc, 0x99, 0xdb, 0x0c, 0x7b, - 0x26, 0x93, 0xb2, 0xf5, 0x4c, 0xa3, 0xac, 0x15, 0x42, 0x44, 0x37, 0x19, 0xaa, 0x43, 0x29, 0xce, - 0xfa, 0xd1, 0x67, 0x44, 0xda, 0xe6, 0x02, 0x08, 0xf3, 0xbe, 0xf2, 0x19, 0x41, 0x5f, 0x01, 0x7a, - 0xa4, 0x8e, 0x39, 0x1a, 0x9a, 0x1e, 0xc3, 0x26, 0x63, 0x64, 0xe6, 0x32, 0x4f, 0xda, 0xe1, 0xba, - 0x83, 0x84, 0xb9, 0x8c, 0x08, 0x74, 0x0e, 0x47, 0x36, 0x59, 0x32, 0xbc, 0x8a, 0x79, 0x26, 0xd6, - 0xf8, 0x99, 0x49, 0x39, 0x1e, 0x51, 0x0d, 0xc8, 0xab, 0x98, 0xeb, 0x70, 0x2a, 0x88, 0xa1, 0x61, - 0xf5, 0xc9, 0x08, 0x8b, 0xc5, 0xcf, 0x87, 0x31, 0x09, 0xd9, 0x4e, 0x6e, 0x01, 0x5d, 0xc0, 0xf1, - 0x2a, 0x26, 0x75, 0x84, 0xc2, 0x5a, 0x90, 0xbe, 0x3a, 0xcb, 0x21, 0xec, 0x3c, 0x39, 0x74, 0x48, - 0xa4, 0xdd, 0x7a, 0xa6, 0x91, 0xd7, 0xc2, 0x07, 0xf9, 0x18, 0x0e, 0xc5, 0xab, 0x89, 0xbb, 0x52, - 0x7e, 0x80, 0xa3, 0x35, 0x3c, 0xba, 0xea, 0x9f, 0x60, 0xcf, 0x0d, 0x09, 0xec, 0x71, 0x46, 0xca, - 0xf0, 0xbe, 0x3c, 0x11, 0x2e, 0x44, 0x8c, 0xd4, 0xca, 0xae, 0xe8, 0x23, 0xff, 0x99, 0x81, 0xbd, - 0xab, 0xf9, 0xcc, 0x15, 0xba, 0xee, 0x7f, 0xb5, 0xc3, 0x19, 0x14, 0xc3, 0x02, 0xf1, 0x62, 0xf1, - 0x6e, 0x28, 0x6b, 0x10, 0x42, 0x41, 0x89, 0x36, 0x6e, 0x35, 0xbb, 0x71, 0xab, 0x49, 0x25, 0xb6, - 0xc5, 0x4a, 0x1c, 0xc0, 0x7e, 0x92, 0x57, 0x78, 0xd6, 0xcf, 0xff, 0xc8, 0x42, 0x51, 0x68, 0x2e, - 0x54, 0x85, 0xfd, 0xfb, 0x7e, 0xb7, 0xaf, 0x3e, 0xf4, 0xf1, 0xc3, 0xad, 0xd1, 0x57, 0x74, 0xbd, - 0xf2, 0x01, 0x92, 0xe0, 0xb0, 0xad, 0xde, 0xdd, 0xdd, 0x1a, 0x77, 0x4a, 0xdf, 0xc0, 0xc6, 0xed, - 0x9d, 0x82, 0x7b, 0x6a, 0xbb, 0x5b, 0xc9, 0xa0, 0x13, 0xa8, 0x0a, 0x4c, 0x5f, 0xc5, 0xd7, 0x4a, - 0xef, 0xf2, 0x5d, 0x65, 0x0b, 0x1d, 0xc1, 0x81, 0x40, 0x68, 0xca, 0x5b, 0xb5, 0xab, 0x54, 0xb2, - 0x81, 0xbe, 0x63, 0xf4, 0xda, 0x58, 0xbd, 0xb9, 0x51, 0x34, 0xe5, 0x3a, 0x26, 0xb6, 0x83, 0x57, - 0x70, 0xe2, 0xb2, 0xdd, 0x56, 0x06, 0xc6, 0x8a, 0xd9, 0x41, 0x9f, 0xc2, 0x47, 0xa9, 0x90, 0xe0, - 0xf5, 0xea, 0xbd, 0x81, 0x75, 0xa5, 0xad, 0xf6, 0xaf, 0x71, 0x4f, 0x79, 0xab, 0xf4, 0x2a, 0x39, - 0xf4, 0x19, 0xc8, 0x69, 0x03, 0xfd, 0xbe, 0xdd, 0x56, 0x74, 0x3d, 0xad, 0xdb, 0x45, 0x67, 0xf0, - 0x7a, 0x2d, 0x83, 0x3b, 0xd5, 0x50, 0x62, 0xd7, 0x4a, 0x1e, 0xd5, 0xe1, 0x74, 0x3d, 0x13, 0xae, - 0x88, 0xfc, 0x2a, 0x05, 0x74, 0x0a, 0x12, 0x57, 0x88, 0xce, 0x71, 0xbe, 0x80, 0x0e, 0xa1, 0x12, - 0x55, 0x0e, 0x77, 0x95, 0x77, 0xb8, 0x73, 0xa9, 0x77, 0x2a, 0x45, 0xf4, 0x1a, 0x4e, 0xfa, 0x8a, - 0x1e, 0xd8, 0x6d, 0x90, 0xa5, 0xf3, 0xbf, 0xb7, 0xa1, 0xf0, 0xc0, 0x5b, 0xab, 0x6b, 0x31, 0xf4, - 0x03, 0x94, 0xaf, 0x09, 0xb5, 0x7e, 0x27, 0x7d, 0xb2, 0x64, 0x5d, 0xe2, 0xa3, 0x03, 0xa1, 0xef, - 0xc2, 0x0d, 0x52, 0x3b, 0x4e, 0x46, 0x64, 0x97, 0xf8, 0xd7, 0xc4, 0x1b, 0x52, 0xcb, 0x65, 0x0e, - 0x45, 0xdf, 0x41, 0x21, 0x8c, 0x0d, 0xe2, 0xaa, 0xa2, 0xa8, 0xe7, 0x0c, 0x4d, 0xe6, 0xd0, 0x17, - 0x23, 0x7f, 0x84, 0x7c, 0xf0, 0xbe, 0x60, 0x7f, 0x20, 0x71, 0xf2, 0x08, 0xfb, 0xa5, 0x76, 0xb2, - 0x81, 0x47, 0x5f, 0x4c, 0x07, 0x50, 0xb4, 0x2e, 0xc4, 0xdd, 0x22, 0xda, 0x08, 0x78, 0xad, 0x26, - 0x7e, 0x47, 0x6b, 0x5b, 0xa6, 0x07, 0x45, 0x61, 0xc4, 0xa3, 0x37, 0x82, 0x74, 0x73, 0xb1, 0xd4, - 0x3e, 0x7c, 0x89, 0x5e, 0xb9, 0x09, 0xb3, 0x3c, 0xe5, 0xb6, 0xb9, 0x1a, 0x52, 0x6e, 0xff, 0xb6, - 0x02, 0x34, 0x28, 0xa7, 0x06, 0x06, 0x3a, 0x7b, 0x61, 0x20, 0x24, 0xf9, 0xd5, 0x5f, 0x16, 0x44, - 0x9e, 0x3f, 0xc3, 0x6e, 0xf4, 0x49, 0xa2, 0x57, 0x82, 0x38, 0x3d, 0x3e, 0x52, 0x15, 0x5b, 0xfb, - 0x82, 0xaf, 0xbe, 0xfe, 0xb5, 0x35, 0xb6, 0xd8, 0xf3, 0xfc, 0xb1, 0x39, 0x74, 0x66, 0xad, 0x69, - 0x30, 0x71, 0x6d, 0xcb, 0x1e, 0xdb, 0x84, 0x2d, 0x1c, 0x3a, 0x69, 0x4d, 0xed, 0x51, 0x8b, 0x4f, - 0x9a, 0x56, 0x62, 0xf1, 0x98, 0xe3, 0xff, 0x90, 0x5c, 0xfc, 0x13, 0x00, 0x00, 0xff, 0xff, 0x3b, - 0x08, 0xac, 0xe2, 0xd9, 0x08, 0x00, 0x00, + // 1055 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0x94, 0x56, 0x6b, 0x6f, 0xe2, 0x46, + 0x14, 0x2d, 0x21, 0x21, 0x70, 0x81, 0xc4, 0x19, 0xf2, 0xf0, 0xb2, 0xd9, 0x86, 0xba, 0x0f, 0xa1, + 0x3e, 0x40, 0x4d, 0xd4, 0xaa, 0x0f, 0xa9, 0x2a, 0x21, 0x8e, 0x88, 0x20, 0x98, 0xda, 0xce, 0x46, + 0x5b, 0x55, 0x1a, 0x39, 0x30, 0x21, 0x56, 0xc0, 0xf6, 0x8e, 0x87, 0x02, 0x7f, 0xa4, 0xd2, 0xfe, + 0x95, 0xfe, 0xba, 0xca, 0xe3, 0x07, 0x63, 0x68, 0x2a, 0xf5, 0x53, 0xf0, 0x39, 0xe7, 0x1e, 0xdf, + 0xb9, 0x73, 0x7d, 0x6f, 0xe0, 0xd5, 0xdc, 0x9a, 0x4c, 0x08, 0xa3, 0xde, 0xb0, 0x19, 0xfe, 0x7a, + 0xb6, 0x59, 0xc3, 0xa3, 0x2e, 0x73, 0x51, 0x21, 0xa1, 0xaa, 0x05, 0xea, 0x0d, 0x43, 0xb4, 0x7a, + 0xe8, 0xdb, 0x63, 0x27, 0x90, 0x07, 0x7f, 0x09, 0x0d, 0x51, 0xe5, 0x37, 0xc8, 0x75, 0xc9, 0x52, + 0x27, 0xef, 0x51, 0x1d, 0xa4, 0x67, 0xb2, 0xc4, 0x8f, 0xb6, 0x33, 0x26, 0x14, 0x7b, 0xd4, 0x76, + 0x98, 0x9c, 0xa9, 0x65, 0xea, 0x3b, 0xfa, 0xde, 0x33, 0x59, 0x5e, 0x73, 0x78, 0x10, 0xa0, 0xe8, + 0x0d, 0x00, 0x57, 0x5a, 0x53, 0x7b, 0xb2, 0x94, 0xb7, 0xb8, 0xa6, 0x10, 0x68, 0x38, 0xa0, 0x94, + 0xa1, 0xd8, 0x1a, 0x8d, 0xa8, 0x4e, 0xde, 0xcf, 0x88, 0xcf, 0x14, 0x05, 0x4a, 0xe1, 0xa3, 0xef, + 0xb9, 0x8e, 0x4f, 0x10, 0x82, 0x6d, 0x6b, 0x34, 0xa2, 0xdc, 0xbb, 0xa0, 0xf3, 0xdf, 0xca, 0x67, + 0x50, 0x34, 0xa9, 0xe5, 0xf8, 0xd6, 0x90, 0xd9, 0xae, 0x83, 0x8e, 0x20, 0xc7, 0x16, 0xf8, 0x89, + 0x2c, 0xb8, 0xa8, 0xa4, 0xef, 0xb0, 0x45, 0x87, 0x2c, 0x94, 0xef, 0x61, 0x7f, 0x30, 0x7b, 0x98, + 0xd8, 0xfe, 0x53, 0x62, 0xf6, 0x29, 0x94, 0xbd, 0x10, 0xc2, 0x84, 0x52, 0x37, 0x76, 0x2d, 0x45, + 0xa0, 0x1a, 0x60, 0xca, 0x1f, 0x80, 0x0c, 0xe2, 0x8c, 0xb4, 0x19, 0xf3, 0x66, 0xcc, 0x8f, 0xf2, + 0x42, 0xa7, 0x00, 0xbe, 0xc5, 0xb0, 0x47, 0x28, 0x7e, 0x9e, 0xf3, 0xb8, 0xac, 0x9e, 0xf7, 0x2d, + 0x36, 0x20, 0xb4, 0x3b, 0x47, 0x75, 0xd8, 0x75, 0x43, 0xbd, 0xbc, 0x55, 0xcb, 0xd6, 0x8b, 0xe7, + 0x7b, 0x8d, 0xa8, 0x7e, 0x0d, 0x73, 0xa1, 0xcd, 0x98, 0x1e, 0xd3, 0xca, 0xd7, 0x50, 0x49, 0xb9, + 0x47, 0x99, 0x1d, 0x41, 0x8e, 0x5a, 0x73, 0xcc, 0x92, 0x33, 0x50, 0x6b, 0x6e, 0x2e, 0x94, 0xef, + 0x00, 0xa9, 0x3e, 0xb3, 0xa7, 0x16, 0x23, 0xd7, 0x84, 0xc4, 0xb9, 0x9c, 0x41, 0x71, 0xe8, 0x3a, + 0x8f, 0x98, 0x59, 0x74, 0x4c, 0xe2, 0xb2, 0x43, 0x00, 0x99, 0x1c, 0x51, 0x2e, 0xa0, 0x92, 0x0a, + 0x8b, 0x5e, 0xf2, 0x9f, 0x67, 0x50, 0x3e, 0x64, 0xa1, 0x34, 0x20, 0xce, 0xc8, 0x76, 0xc6, 0xc6, + 0x9c, 0x10, 0x0f, 0x7d, 0x05, 0xf9, 0x20, 0x6b, 0x37, 0xbe, 0xda, 0xe2, 0xf9, 0x7e, 0x63, 0xc2, + 0xcf, 0xa4, 0xcd, 0xd8, 0x20, 0x80, 0xf5, 0x44, 0x80, 0x7e, 0x84, 0xd2, 0xdc, 0x66, 0x0e, 0xf1, + 0x7d, 0xcc, 0x96, 0x1e, 0xe1, 0xf7, 0xbc, 0x77, 0x7e, 0xdc, 0x48, 0x9a, 0xab, 0x71, 0x1f, 0xd2, + 0xe6, 0xd2, 0x23, 0x7a, 0x71, 0xbe, 0x7a, 0x08, 0x1a, 0xc4, 0x9a, 0xba, 0x33, 0x87, 0x61, 0xdf, + 0x62, 0x72, 0xb6, 0x96, 0xa9, 0x97, 0xf5, 0x42, 0x88, 0x18, 0x16, 0x43, 0x35, 0x28, 0xc5, 0x59, + 0x3f, 0x2c, 0x19, 0x91, 0xb7, 0xb9, 0x00, 0xc2, 0xbc, 0x2f, 0x97, 0x8c, 0xa0, 0x6f, 0x00, 0x3d, + 0x50, 0xd7, 0x1a, 0x0d, 0x2d, 0x9f, 0x61, 0x8b, 0x31, 0x32, 0xf5, 0x98, 0x2f, 0xef, 0x70, 0xdd, + 0x41, 0xc2, 0xb4, 0x22, 0x02, 0x9d, 0xc3, 0x91, 0x43, 0x16, 0x0c, 0xaf, 0x62, 0x9e, 0x88, 0x3d, + 0x7e, 0x62, 0x72, 0x8e, 0x47, 0x54, 0x02, 0xf2, 0x32, 0xe6, 0x3a, 0x9c, 0x0a, 0x62, 0x68, 0x58, + 0x7d, 0x32, 0xc2, 0x62, 0xf1, 0xf3, 0x61, 0x4c, 0x42, 0xb6, 0x93, 0x5b, 0x40, 0x17, 0x70, 0xbc, + 0x8a, 0x49, 0x1d, 0xa1, 0xb0, 0x16, 0x64, 0xac, 0xce, 0x72, 0x08, 0x3b, 0x8f, 0x2e, 0x1d, 0x12, + 0x79, 0xb7, 0x96, 0xa9, 0xe7, 0xf5, 0xf0, 0x41, 0x39, 0x86, 0x43, 0xf1, 0x6a, 0xe2, 0xae, 0x54, + 0xee, 0xe1, 0x68, 0x0d, 0x8f, 0xae, 0xfa, 0x17, 0xd8, 0xf3, 0x42, 0x02, 0xfb, 0x9c, 0x91, 0x33, + 0xbc, 0x2f, 0x4f, 0x84, 0x0b, 0x11, 0x23, 0xf5, 0xb2, 0x27, 0xfa, 0x28, 0x7f, 0x65, 0x60, 0xef, + 0x72, 0x36, 0xf5, 0x84, 0xae, 0xfb, 0x5f, 0xed, 0x70, 0x06, 0xc5, 0xb0, 0x40, 0xbc, 0x58, 0xbc, + 0x1b, 0xca, 0x3a, 0x84, 0x50, 0x50, 0xa2, 0x8d, 0x5b, 0xcd, 0x6e, 0xdc, 0x6a, 0x52, 0x89, 0x6d, + 0xb1, 0x12, 0x07, 0xb0, 0x9f, 0xe4, 0x15, 0x9e, 0xf5, 0xcb, 0x0f, 0x59, 0x28, 0x0a, 0xcd, 0x85, + 0x2a, 0xb0, 0x7f, 0xd7, 0xef, 0xf6, 0xb5, 0xfb, 0x3e, 0xbe, 0xbf, 0x31, 0xfb, 0xaa, 0x61, 0x48, + 0x1f, 0x21, 0x19, 0x0e, 0xdb, 0xda, 0xed, 0xed, 0x8d, 0x79, 0xab, 0xf6, 0x4d, 0x6c, 0xde, 0xdc, + 0xaa, 0xb8, 0xa7, 0xb5, 0xbb, 0x52, 0x06, 0x9d, 0x40, 0x45, 0x60, 0xfa, 0x1a, 0xbe, 0x52, 0x7b, + 0xad, 0x77, 0xd2, 0x16, 0x3a, 0x82, 0x03, 0x81, 0xd0, 0xd5, 0xb7, 0x5a, 0x57, 0x95, 0xb2, 0x81, + 0xbe, 0x63, 0xf6, 0xda, 0x58, 0xbb, 0xbe, 0x56, 0x75, 0xf5, 0x2a, 0x26, 0xb6, 0x83, 0x57, 0x70, + 0xa2, 0xd5, 0x6e, 0xab, 0x03, 0x73, 0xc5, 0xec, 0xa0, 0xcf, 0xe1, 0x93, 0x54, 0x48, 0xf0, 0x7a, + 0xed, 0xce, 0xc4, 0x86, 0xda, 0xd6, 0xfa, 0x57, 0xb8, 0xa7, 0xbe, 0x55, 0x7b, 0x52, 0x0e, 0x7d, + 0x01, 0x4a, 0xda, 0xc0, 0xb8, 0x6b, 0xb7, 0x55, 0xc3, 0x48, 0xeb, 0x76, 0xd1, 0x19, 0xbc, 0x5e, + 0xcb, 0xe0, 0x56, 0x33, 0xd5, 0xd8, 0x55, 0xca, 0xa3, 0x1a, 0x9c, 0xae, 0x67, 0xc2, 0x15, 0x91, + 0x9f, 0x54, 0x40, 0xa7, 0x20, 0x73, 0x85, 0xe8, 0x1c, 0xe7, 0x0b, 0xe8, 0x10, 0xa4, 0xa8, 0x72, + 0xb8, 0xab, 0xbe, 0xc3, 0x9d, 0x96, 0xd1, 0x91, 0x8a, 0xe8, 0x35, 0x9c, 0xf4, 0x55, 0x23, 0xb0, + 0xdb, 0x20, 0x4b, 0x6b, 0xc5, 0x6a, 0xf5, 0xdb, 0x1d, 0x4d, 0x97, 0xca, 0xe7, 0x7f, 0x6f, 0x43, + 0xe1, 0x9e, 0x77, 0x5c, 0xd7, 0x66, 0xe8, 0x27, 0x28, 0x5f, 0x11, 0x6a, 0xff, 0x49, 0xfa, 0x64, + 0xc1, 0xba, 0x64, 0x89, 0x0e, 0x84, 0x76, 0x0c, 0x17, 0x4b, 0xf5, 0x38, 0x99, 0x9c, 0x5d, 0xb2, + 0xbc, 0x22, 0xfe, 0x90, 0xda, 0x1e, 0x73, 0x29, 0xfa, 0x01, 0x0a, 0x61, 0x6c, 0x10, 0x57, 0x11, + 0x45, 0x3d, 0x77, 0x68, 0x31, 0x97, 0xbe, 0x18, 0xf9, 0x33, 0xe4, 0x83, 0xf7, 0x05, 0x6b, 0x05, + 0x89, 0x03, 0x49, 0x58, 0x3b, 0xd5, 0x93, 0x0d, 0x3c, 0xfa, 0x90, 0x3a, 0x80, 0xa2, 0x2d, 0x22, + 0xae, 0x1c, 0xd1, 0x46, 0xc0, 0xab, 0x55, 0xf1, 0xf3, 0x5a, 0x5b, 0x3e, 0x3d, 0x28, 0x0a, 0x93, + 0x1f, 0xbd, 0x11, 0xa4, 0x9b, 0xfb, 0xa6, 0xfa, 0xf1, 0x4b, 0xf4, 0xca, 0x4d, 0x18, 0xf1, 0x29, + 0xb7, 0xcd, 0x8d, 0x91, 0x72, 0xfb, 0xb7, 0xcd, 0xa0, 0x43, 0x39, 0x35, 0x47, 0xd0, 0xd9, 0x0b, + 0x73, 0x22, 0xc9, 0xaf, 0xf6, 0xb2, 0x20, 0xf2, 0xfc, 0x15, 0x76, 0xa3, 0x2f, 0x15, 0xbd, 0x12, + 0xc4, 0xe9, 0xa9, 0x92, 0xaa, 0xd8, 0xda, 0x87, 0x7d, 0xf9, 0xed, 0xef, 0xcd, 0xb1, 0xcd, 0x9e, + 0x66, 0x0f, 0x8d, 0xa1, 0x3b, 0x6d, 0x4e, 0x82, 0x41, 0xec, 0xd8, 0xce, 0xd8, 0x21, 0x6c, 0xee, + 0xd2, 0xe7, 0xe6, 0xc4, 0x19, 0x35, 0xf9, 0x00, 0x6a, 0x26, 0x16, 0x0f, 0x39, 0xfe, 0x7f, 0xca, + 0xc5, 0x3f, 0x01, 0x00, 0x00, 0xff, 0xff, 0xf1, 0x3f, 0xcd, 0xa5, 0xf0, 0x08, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. diff --git a/lnrpc/walletrpc/walletkit.proto b/lnrpc/walletrpc/walletkit.proto index 267af2fdafb..96f2ce06786 100644 --- a/lnrpc/walletrpc/walletkit.proto +++ b/lnrpc/walletrpc/walletkit.proto @@ -164,6 +164,12 @@ enum WitnessType { script that pays to a key solely under our control. */ NESTED_WITNESS_KEY_HASH = 12; + + /* + A witness type that allows us to spend our anchor on the commitment + transaction. + */ + COMMITMENT_ANCHOR = 13; } message PendingSweep { diff --git a/lnrpc/walletrpc/walletkit_server.go b/lnrpc/walletrpc/walletkit_server.go index 42534c653e4..edfeb35cc1a 100644 --- a/lnrpc/walletrpc/walletkit_server.go +++ b/lnrpc/walletrpc/walletkit_server.go @@ -390,6 +390,8 @@ func (w *WalletKit) PendingSweeps(ctx context.Context, witnessType = WitnessType_WITNESS_KEY_HASH case input.NestedWitnessKeyHash: witnessType = WitnessType_NESTED_WITNESS_KEY_HASH + case input.CommitmentAnchor: + witnessType = WitnessType_COMMITMENT_ANCHOR default: log.Warnf("Unhandled witness type %v for input %v", pendingInput.WitnessType, pendingInput.OutPoint) @@ -486,7 +488,7 @@ func (w *WalletKit) BumpFee(ctx context.Context, // bump its fee, which will result in a replacement transaction (RBF) // being broadcast. If it is not aware of the input however, // lnwallet.ErrNotMine is returned. - params := sweep.Params{ + params := sweep.ParamsUpdate{ Fee: feePreference, Force: in.Force, } diff --git a/lntest/itest/lnd_test.go b/lntest/itest/lnd_test.go index cc344372b7d..d84ed1148ba 100644 --- a/lntest/itest/lnd_test.go +++ b/lntest/itest/lnd_test.go @@ -8604,13 +8604,19 @@ func assertNumPendingChannels(t *harnessTest, node *lntest.HarnessNode, // on chain as he has no funds in the channel. func assertDLPExecuted(net *lntest.NetworkHarness, t *harnessTest, carol *lntest.HarnessNode, carolStartingBalance int64, - dave *lntest.HarnessNode, daveStartingBalance int64) { + dave *lntest.HarnessNode, daveStartingBalance int64, + anchors bool) { // Upon reconnection, the nodes should detect that Dave is out of sync. // Carol should force close the channel using her latest commitment. + expectedTxes := 1 + if anchors { + expectedTxes = 2 + } + ctxb := context.Background() - forceClose, err := waitForTxInMempool( - net.Miner.Node, minerMempoolTimeout, + _, err := waitForNTxsInMempool( + net.Miner.Node, expectedTxes, minerMempoolTimeout, ) if err != nil { t.Fatalf("unable to find Carol's force close tx in mempool: %v", @@ -8633,12 +8639,13 @@ func assertDLPExecuted(net *lntest.NetworkHarness, t *harnessTest, } // Generate a single block, which should confirm the closing tx. - block := mineBlocks(t, net, 1, 1)[0] - assertTxInBlock(t, block, forceClose) + block := mineBlocks(t, net, 1, expectedTxes)[0] // Dave should sweep his funds immediately, as they are not timelocked. - daveSweep, err := waitForTxInMempool( - net.Miner.Node, minerMempoolTimeout, + // We also expect Dave to sweep his anchor, if present. + + _, err = waitForNTxsInMempool( + net.Miner.Node, expectedTxes, minerMempoolTimeout, ) if err != nil { t.Fatalf("unable to find Dave's sweep tx in mempool: %v", err) @@ -8653,8 +8660,7 @@ func assertDLPExecuted(net *lntest.NetworkHarness, t *harnessTest, assertNumPendingChannels(t, carol, 0, 1) // Mine the sweep tx. - block = mineBlocks(t, net, 1, 1)[0] - assertTxInBlock(t, block, daveSweep) + block = mineBlocks(t, net, 1, expectedTxes)[0] // Now Dave should consider the channel fully closed. assertNumPendingChannels(t, dave, 0, 0) @@ -8925,6 +8931,7 @@ func testDataLossProtection(net *lntest.NetworkHarness, t *harnessTest) { // on chain, and both of them properly carry out the DLP protocol. assertDLPExecuted( net, t, carol, carolStartingBalance, dave, daveStartingBalance, + false, ) // As a second part of this test, we will test the scenario where a @@ -14048,9 +14055,14 @@ func testChanRestoreScenario(t *harnessTest, net *lntest.NetworkHarness, } defer shutdownAndAssert(net, t, carol) - // Now that our new node is created, we'll give him some coins it can - // use to open channels with Carol. + // Now that our new nodes are created, we'll give them some coins for + // channel opening and anchor sweeping. ctxt, _ := context.WithTimeout(ctxb, defaultTimeout) + err = net.SendCoins(ctxt, btcutil.SatoshiPerBitcoin, carol) + if err != nil { + t.Fatalf("unable to send coins to dave: %v", err) + } + ctxt, _ = context.WithTimeout(ctxb, defaultTimeout) err = net.SendCoins(ctxt, btcutil.SatoshiPerBitcoin, dave) if err != nil { t.Fatalf("unable to send coins to dave: %v", err) @@ -14216,6 +14228,7 @@ func testChanRestoreScenario(t *harnessTest, net *lntest.NetworkHarness, // end of the protocol. assertDLPExecuted( net, t, carol, carolStartingBalance, dave, daveStartingBalance, + testCase.anchorCommit, ) } diff --git a/lnwallet/channel.go b/lnwallet/channel.go index aca93b99330..6f64d34d5e0 100644 --- a/lnwallet/channel.go +++ b/lnwallet/channel.go @@ -5115,6 +5115,11 @@ type UnilateralCloseSummary struct { // RemoteCommit is the exact commitment state that the remote party // broadcast. RemoteCommit channeldb.ChannelCommitment + + // AnchorResolution contains the data required to sweep our anchor + // output. If the channel type doesn't include anchors, the value of + // this field will be nil. + AnchorResolution *AnchorResolution } // NewUnilateralCloseSummary creates a new summary that provides the caller @@ -5229,12 +5234,20 @@ func NewUnilateralCloseSummary(chanState *channeldb.OpenChannel, signer input.Si closeSummary.LastChanSyncMsg = chanSync } + anchorResolution, err := NewAnchorResolution( + chanState, commitTxBroadcast, + ) + if err != nil { + return nil, err + } + return &UnilateralCloseSummary{ SpendDetail: commitSpend, ChannelCloseSummary: closeSummary, CommitResolution: commitResolution, HtlcResolutions: htlcResolutions, RemoteCommit: remoteCommit, + AnchorResolution: anchorResolution, }, nil } @@ -5685,6 +5698,16 @@ func extractHtlcResolutions(feePerKw chainfee.SatPerKWeight, ourCommit bool, }, nil } +// AnchorResolution holds the information necessary to spend our commitment tx +// anchor. +type AnchorResolution struct { + // AnchorSignDescriptor is the sign descriptor for our anchor. + AnchorSignDescriptor input.SignDescriptor + + // CommitAnchor is the anchor outpoint on the commit tx. + CommitAnchor wire.OutPoint +} + // LocalForceCloseSummary describes the final commitment state before the // channel is locked-down to initiate a force closure by broadcasting the // latest state on-chain. If we intend to broadcast this this state, the @@ -5717,6 +5740,11 @@ type LocalForceCloseSummary struct { // ChanSnapshot is a snapshot of the final state of the channel at the // time the summary was created. ChanSnapshot channeldb.ChannelSnapshot + + // AnchorResolution contains the data required to sweep the anchor + // output. If the channel type doesn't include anchors, the value of + // this field will be nil. + AnchorResolution *AnchorResolution } // ForceClose executes a unilateral closure of the transaction at the current @@ -5855,12 +5883,20 @@ func NewLocalForceCloseSummary(chanState *channeldb.OpenChannel, signer input.Si return nil, err } + anchorResolution, err := NewAnchorResolution( + chanState, commitTx, + ) + if err != nil { + return nil, err + } + return &LocalForceCloseSummary{ ChanPoint: chanState.FundingOutpoint, CloseTx: commitTx, CommitResolution: commitResolution, HtlcResolutions: htlcResolutions, ChanSnapshot: *chanState.Snapshot(), + AnchorResolution: anchorResolution, }, nil } @@ -6019,6 +6055,109 @@ func (lc *LightningChannel) CompleteCooperativeClose(localSig, remoteSig []byte, return closeTx, ourBalance, nil } +// NewAnchorResolutions returns the anchor resolutions for all currently valid +// commitment transactions. Because we have no view on the mempool, we can only +// blindly anchor all of these txes down. +func (lc *LightningChannel) NewAnchorResolutions() ([]*AnchorResolution, + error) { + + lc.Lock() + defer lc.Unlock() + + var resolutions []*AnchorResolution + + // Add anchor for local commitment tx, if any. + localRes, err := NewAnchorResolution( + lc.channelState, lc.channelState.LocalCommitment.CommitTx, + ) + if err != nil { + return nil, err + } + if localRes != nil { + resolutions = append(resolutions, localRes) + } + + // Add anchor for remote commitment tx, if any. + remoteRes, err := NewAnchorResolution( + lc.channelState, lc.channelState.RemoteCommitment.CommitTx, + ) + if err != nil { + return nil, err + } + if remoteRes != nil { + resolutions = append(resolutions, remoteRes) + } + + // Add anchor for remote pending commitment tx, if any. + remotePendingCommit, err := lc.channelState.RemoteCommitChainTip() + if err != nil && err != channeldb.ErrNoPendingCommit { + return nil, err + } + + if remotePendingCommit != nil { + remotePendingRes, err := NewAnchorResolution( + lc.channelState, + remotePendingCommit.Commitment.CommitTx, + ) + if err != nil { + return nil, err + } + + if remotePendingRes != nil { + resolutions = append(resolutions, remotePendingRes) + } + } + + return resolutions, nil +} + +// NewAnchorResolution returns the information that is required to sweep the +// local anchor. +func NewAnchorResolution(chanState *channeldb.OpenChannel, + commitTx *wire.MsgTx) (*AnchorResolution, error) { + + // Return nil resolution if the channel has no anchors. + if !chanState.ChanType.HasAnchors() { + return nil, nil + } + + // Derive our local anchor script. + localAnchor, _, err := CommitScriptAnchors( + &chanState.LocalChanCfg, &chanState.RemoteChanCfg, + ) + if err != nil { + return nil, err + } + + // Look up the script on the commitment transaction. It may not be + // present if there is no output paying to us. + found, index := input.FindScriptOutputIndex(commitTx, localAnchor.PkScript) + if !found { + return nil, nil + } + + outPoint := &wire.OutPoint{ + Hash: commitTx.TxHash(), + Index: index, + } + + // Instantiate the sign descriptor that allows sweeping of the anchor. + signDesc := &input.SignDescriptor{ + KeyDesc: chanState.LocalChanCfg.MultiSigKey, + WitnessScript: localAnchor.WitnessScript, + Output: &wire.TxOut{ + PkScript: localAnchor.PkScript, + Value: int64(anchorSize), + }, + HashType: txscript.SigHashAll, + } + + return &AnchorResolution{ + CommitAnchor: *outPoint, + AnchorSignDescriptor: *signDesc, + }, nil +} + // AvailableBalance returns the current balance available for sending within // the channel. By available balance, we mean that if at this very instance a // new commitment were to be created which evals all the log entries, what diff --git a/lnwallet/channel_test.go b/lnwallet/channel_test.go index 511631bb6f8..47355f57068 100644 --- a/lnwallet/channel_test.go +++ b/lnwallet/channel_test.go @@ -60,7 +60,12 @@ func testAddSettleWorkflow(t *testing.T, tweakless bool) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(tweakless) + chanType := channeldb.SingleFunderTweaklessBit + if !tweakless { + chanType = channeldb.SingleFunderBit + } + + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(chanType) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -390,7 +395,9 @@ func TestCheckCommitTxSize(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -449,7 +456,9 @@ func TestCooperativeChannelClosure(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -517,12 +526,37 @@ func TestCooperativeChannelClosure(t *testing.T) { // force close generates HTLC resolutions that are capable of sweeping both // incoming and outgoing HTLC's. func TestForceClose(t *testing.T) { + t.Run("tweakless", func(t *testing.T) { + testForceClose(t, &forceCloseTestCase{ + chanType: channeldb.SingleFunderTweaklessBit, + expectedCommitWeight: input.CommitWeight, + }) + }) + t.Run("anchors", func(t *testing.T) { + testForceClose(t, &forceCloseTestCase{ + chanType: channeldb.SingleFunderTweaklessBit | + channeldb.AnchorOutputsBit, + expectedCommitWeight: input.AnchorCommitWeight, + anchorAmt: anchorSize * 2, + }) + }) +} + +type forceCloseTestCase struct { + chanType channeldb.ChannelType + expectedCommitWeight int64 + anchorAmt btcutil.Amount +} + +func testForceClose(t *testing.T, testCase *forceCloseTestCase) { t.Parallel() // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + testCase.chanType, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -583,6 +617,36 @@ func TestForceClose(t *testing.T) { 1, len(closeSummary.HtlcResolutions.IncomingHTLCs)) } + // Verify the anchor resolutions for the anchor commitment format. + if testCase.chanType.HasAnchors() { + // Check the close summary resolution. + anchorRes := closeSummary.AnchorResolution + if anchorRes == nil { + t.Fatal("expected anchor resolution") + } + if anchorRes.CommitAnchor.Hash != closeSummary.CloseTx.TxHash() { + t.Fatal("commit tx not referenced by anchor res") + } + if anchorRes.AnchorSignDescriptor.Output.Value != + int64(anchorSize) { + + t.Fatal("unexpected anchor size") + } + if anchorRes.AnchorSignDescriptor.WitnessScript == nil { + t.Fatal("expected anchor witness script") + } + + // Check the pre-confirmation resolutions. + resList, err := aliceChannel.NewAnchorResolutions() + if err != nil { + t.Fatalf("pre-confirmation resolution error: %v", err) + } + + if len(resList) != 2 { + t.Fatal("expected two resolutions") + } + } + // The SelfOutputSignDesc should be non-nil since the output to-self is // non-dust. aliceCommitResolution := closeSummary.CommitResolution @@ -601,12 +665,16 @@ func TestForceClose(t *testing.T) { // Factoring in the fee rate, Alice's amount should properly reflect // that we've added two additional HTLC to the commitment transaction. - totalCommitWeight := int64(input.CommitWeight + (input.HTLCWeight * 2)) + totalCommitWeight := testCase.expectedCommitWeight + + (input.HTLCWeight * 2) feePerKw := chainfee.SatPerKWeight( aliceChannel.channelState.LocalCommitment.FeePerKw, ) commitFee := feePerKw.FeeForWeight(totalCommitWeight) - expectedAmount := (aliceChannel.Capacity / 2) - htlcAmount.ToSatoshis() - commitFee + + expectedAmount := (aliceChannel.Capacity / 2) - + htlcAmount.ToSatoshis() - commitFee - testCase.anchorAmt + if aliceCommitResolution.SelfOutputSignDesc.Output.Value != int64(expectedAmount) { t.Fatalf("alice incorrect output value in SelfOutputSignDesc, "+ "expected %v, got %v", int64(expectedAmount), @@ -808,7 +876,9 @@ func TestForceCloseDustOutput(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -926,7 +996,9 @@ func TestDustHTLCFees(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -970,7 +1042,7 @@ func TestDustHTLCFees(t *testing.T) { // The commitment fee paid should be the same, as there have been no // new material outputs added. - defaultFee := calcStaticFee(0) + defaultFee := calcStaticFee(channeldb.SingleFunderTweaklessBit, 0) if aliceChannel.channelState.LocalCommitment.CommitFee != defaultFee { t.Fatalf("dust htlc amounts not subtracted from commitment fee "+ "expected %v, got %v", defaultFee, @@ -1003,7 +1075,9 @@ func TestHTLCDustLimit(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -1046,7 +1120,7 @@ func TestHTLCDustLimit(t *testing.T) { t.Fatalf("incorrect # of outputs: expected %v, got %v", 2, len(bobCommitment.txn.TxOut)) } - defaultFee := calcStaticFee(0) + defaultFee := calcStaticFee(channeldb.SingleFunderTweaklessBit, 0) if bobChannel.channelState.LocalCommitment.CommitFee != defaultFee { t.Fatalf("dust htlc amount was subtracted from commitment fee "+ "expected %v, got %v", defaultFee, @@ -1092,7 +1166,9 @@ func TestHTLCSigNumber(t *testing.T) { // Create a test channel funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. Alice's dustlimit is 200 sat, while // Bob has 1300 sat. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -1266,7 +1342,9 @@ func TestChannelBalanceDustLimit(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -1280,7 +1358,7 @@ func TestChannelBalanceDustLimit(t *testing.T) { // This amount should leave an amount larger than Alice's dust limit // once fees have been subtracted, but smaller than Bob's dust limit. // We account in fees for the HTLC we will be adding. - defaultFee := calcStaticFee(1) + defaultFee := calcStaticFee(channeldb.SingleFunderTweaklessBit, 1) aliceBalance := aliceChannel.channelState.LocalCommitment.LocalBalance.ToSatoshis() htlcSat := aliceBalance - defaultFee htlcSat += HtlcSuccessFee( @@ -1337,7 +1415,9 @@ func TestStateUpdatePersistence(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -1678,7 +1758,9 @@ func TestCancelHTLC(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -1711,7 +1793,7 @@ func TestCancelHTLC(t *testing.T) { // With the HTLC committed, Alice's balance should reflect the clearing // of the new HTLC. aliceExpectedBalance := btcutil.Amount(btcutil.SatoshiPerBitcoin*4) - - calcStaticFee(1) + calcStaticFee(channeldb.SingleFunderTweaklessBit, 1) if aliceChannel.channelState.LocalCommitment.LocalBalance.ToSatoshis() != aliceExpectedBalance { t.Fatalf("Alice's balance is wrong: expected %v, got %v", @@ -1756,12 +1838,13 @@ func TestCancelHTLC(t *testing.T) { } expectedBalance := btcutil.Amount(btcutil.SatoshiPerBitcoin * 5) + staticFee := calcStaticFee(channeldb.SingleFunderTweaklessBit, 0) if aliceChannel.channelState.LocalCommitment.LocalBalance.ToSatoshis() != - expectedBalance-calcStaticFee(0) { + expectedBalance-staticFee { t.Fatalf("balance is wrong: expected %v, got %v", aliceChannel.channelState.LocalCommitment.LocalBalance.ToSatoshis(), - expectedBalance-calcStaticFee(0)) + expectedBalance-staticFee) } if aliceChannel.channelState.LocalCommitment.RemoteBalance.ToSatoshis() != expectedBalance { @@ -1778,11 +1861,11 @@ func TestCancelHTLC(t *testing.T) { expectedBalance) } if bobChannel.channelState.LocalCommitment.RemoteBalance.ToSatoshis() != - expectedBalance-calcStaticFee(0) { + expectedBalance-staticFee { t.Fatalf("balance is wrong: expected %v, got %v", bobChannel.channelState.LocalCommitment.RemoteBalance.ToSatoshis(), - expectedBalance-calcStaticFee(0)) + expectedBalance-staticFee) } } @@ -1792,7 +1875,9 @@ func TestCooperativeCloseDustAdherence(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -1957,7 +2042,9 @@ func TestCooperativeCloseDustAdherence(t *testing.T) { func TestUpdateFeeAdjustments(t *testing.T) { t.Parallel() - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -2012,7 +2099,9 @@ func TestUpdateFeeAdjustments(t *testing.T) { func TestUpdateFeeFail(t *testing.T) { t.Parallel() - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -2046,7 +2135,9 @@ func TestUpdateFeeFail(t *testing.T) { func TestUpdateFeeConcurrentSig(t *testing.T) { t.Parallel() - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -2132,7 +2223,9 @@ func TestUpdateFeeSenderCommits(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -2254,7 +2347,9 @@ func TestUpdateFeeReceiverCommits(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -2403,7 +2498,9 @@ func TestUpdateFeeReceiverSendsUpdate(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -2432,7 +2529,9 @@ func TestUpdateFeeMultipleUpdates(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -2552,7 +2651,9 @@ func TestAddHTLCNegativeBalance(t *testing.T) { // We'll kick off the test by creating our channels which both are // loaded with 5 BTC each. - aliceChannel, _, cleanUp, err := CreateTestChannels(true) + aliceChannel, _, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -2633,7 +2734,9 @@ func TestChanSyncFullySynced(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -2753,7 +2856,9 @@ func TestChanSyncOweCommitment(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -3064,7 +3169,9 @@ func TestChanSyncOweCommitmentPendingRemote(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -3187,7 +3294,9 @@ func TestChanSyncOweRevocation(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -3377,7 +3486,9 @@ func TestChanSyncOweRevocationAndCommit(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -3546,7 +3657,9 @@ func TestChanSyncOweRevocationAndCommitForceTransition(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -3775,7 +3888,9 @@ func TestChanSyncFailure(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(false) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -4028,7 +4143,9 @@ func TestFeeUpdateRejectInsaneFee(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, _, cleanUp, err := CreateTestChannels(true) + aliceChannel, _, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -4056,7 +4173,9 @@ func TestChannelRetransmissionFeeUpdate(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -4245,7 +4364,9 @@ func TestFeeUpdateOldDiskFormat(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -4472,7 +4593,9 @@ func TestChanSyncUnableToSync(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(false) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -4509,7 +4632,9 @@ func TestChanSyncInvalidLastSecret(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(false) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -4599,7 +4724,9 @@ func TestChanAvailableBandwidth(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -4735,7 +4862,9 @@ func TestChanAvailableBalanceNearHtlcFee(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -4915,7 +5044,9 @@ func TestSignCommitmentFailNotLockedIn(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, _, cleanUp, err := CreateTestChannels(true) + aliceChannel, _, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -4940,7 +5071,9 @@ func TestLockedInHtlcForwardingSkipAfterRestart(t *testing.T) { t.Parallel() // First, we'll make a channel between Alice and Bob. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -5254,7 +5387,9 @@ func TestInvalidCommitSigError(t *testing.T) { t.Parallel() // First, we'll make a channel between Alice and Bob. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -5301,7 +5436,9 @@ func TestChannelUnilateralCloseHtlcResolution(t *testing.T) { // Create a test channel which will be used for the duration of this // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -5460,7 +5597,7 @@ func TestChannelUnilateralClosePendingCommit(t *testing.T) { // unittest. The channel will be funded evenly with Alice having 5 BTC, // and Bob having 5 BTC. aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( - false, + channeldb.SingleFunderBit, ) if err != nil { t.Fatalf("unable to create test channels: %v", err) @@ -5587,7 +5724,9 @@ func TestDesyncHTLCs(t *testing.T) { // We'll kick off the test by creating our channels which both are // loaded with 5 BTC each. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -5654,7 +5793,9 @@ func TestMaxAcceptedHTLCs(t *testing.T) { // We'll kick off the test by creating our channels which both are // loaded with 5 BTC each. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -5786,7 +5927,9 @@ func TestMaxAsynchronousHtlcs(t *testing.T) { // We'll kick off the test by creating our channels which both are // loaded with 5 BTC each. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -5921,7 +6064,9 @@ func TestMaxPendingAmount(t *testing.T) { // We'll kick off the test by creating our channels which both are // loaded with 5 BTC each. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -6005,7 +6150,7 @@ func TestChanReserve(t *testing.T) { // We'll kick off the test by creating our channels which both // are loaded with 5 BTC each. aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( - true, + channeldb.SingleFunderTweaklessBit, ) if err != nil { t.Fatalf("unable to create test channels: %v", err) @@ -6214,7 +6359,7 @@ func TestChanReserveRemoteInitiator(t *testing.T) { // We start out with a channel where both parties have 5 BTC. aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( - true, + channeldb.SingleFunderTweaklessBit, ) if err != nil { t.Fatal(err) @@ -6267,7 +6412,7 @@ func TestChanReserveLocalInitiatorDustHtlc(t *testing.T) { t.Parallel() aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( - true, + channeldb.SingleFunderTweaklessBit, ) if err != nil { t.Fatal(err) @@ -6313,7 +6458,9 @@ func TestMinHTLC(t *testing.T) { // We'll kick off the test by creating our channels which both are // loaded with 5 BTC each. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -6366,7 +6513,9 @@ func TestNewBreachRetributionSkipsDustHtlcs(t *testing.T) { // We'll kick off the test by creating our channels which both are // loaded with 5 BTC each. - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -6538,7 +6687,9 @@ func compareLogs(a, b *updateLog) error { func TestChannelRestoreUpdateLogs(t *testing.T) { t.Parallel() - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -6707,7 +6858,9 @@ func restoreAndAssert(t *testing.T, channel *LightningChannel, numAddsLocal, func TestChannelRestoreUpdateLogsFailedHTLC(t *testing.T) { t.Parallel() - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -6830,7 +6983,9 @@ func TestChannelRestoreUpdateLogsFailedHTLC(t *testing.T) { func TestDuplicateFailRejection(t *testing.T) { t.Parallel() - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -6908,7 +7063,9 @@ func TestDuplicateFailRejection(t *testing.T) { func TestDuplicateSettleRejection(t *testing.T) { t.Parallel() - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -6989,7 +7146,9 @@ func TestDuplicateSettleRejection(t *testing.T) { func TestChannelRestoreCommitHeight(t *testing.T) { t.Parallel() - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(true) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -7176,7 +7335,9 @@ func TestChannelRestoreCommitHeight(t *testing.T) { func TestForceCloseFailLocalDataLoss(t *testing.T) { t.Parallel() - aliceChannel, _, cleanUp, err := CreateTestChannels(false) + aliceChannel, _, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -7207,7 +7368,9 @@ func TestForceCloseFailLocalDataLoss(t *testing.T) { func TestForceCloseBorkedState(t *testing.T) { t.Parallel() - aliceChannel, bobChannel, cleanUp, err := CreateTestChannels(false) + aliceChannel, bobChannel, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } @@ -7284,7 +7447,9 @@ func TestForceCloseBorkedState(t *testing.T) { func TestChannelMaxFeeRate(t *testing.T) { t.Parallel() - aliceChannel, _, cleanUp, err := CreateTestChannels(true) + aliceChannel, _, cleanUp, err := CreateTestChannels( + channeldb.SingleFunderTweaklessBit, + ) if err != nil { t.Fatalf("unable to create test channels: %v", err) } diff --git a/lnwallet/test_utils.go b/lnwallet/test_utils.go index 5253acddae5..cbe1b2b3e36 100644 --- a/lnwallet/test_utils.go +++ b/lnwallet/test_utils.go @@ -91,7 +91,7 @@ var ( // the test has been finalized. The clean up function will remote all temporary // files created. If tweaklessCommits is true, then the commits within the // channels will use the new format, otherwise the legacy format. -func CreateTestChannels(tweaklessCommits bool) ( +func CreateTestChannels(chanType channeldb.ChannelType) ( *LightningChannel, *LightningChannel, func(), error) { channelCapacity, err := btcutil.NewAmount(10) @@ -206,11 +206,6 @@ func CreateTestChannels(tweaklessCommits bool) ( } aliceCommitPoint := input.ComputeCommitmentPoint(aliceFirstRevoke[:]) - chanType := channeldb.SingleFunderTweaklessBit - if !tweaklessCommits { - chanType = channeldb.SingleFunderBit - } - aliceCommitTx, bobCommitTx, err := CreateCommitmentTxns( channelBal, channelBal, &aliceCfg, &bobCfg, aliceCommitPoint, bobCommitPoint, *fundingTxIn, chanType, @@ -244,12 +239,21 @@ func CreateTestChannels(tweaklessCommits bool) ( if err != nil { return nil, nil, nil, err } - commitFee := calcStaticFee(0) + commitFee := calcStaticFee(chanType, 0) + var anchorAmt btcutil.Amount + if chanType.HasAnchors() { + anchorAmt += 2 * anchorSize + } + + aliceBalance := lnwire.NewMSatFromSatoshis( + channelBal - commitFee - anchorAmt, + ) + bobBalance := lnwire.NewMSatFromSatoshis(channelBal) aliceCommit := channeldb.ChannelCommitment{ CommitHeight: 0, - LocalBalance: lnwire.NewMSatFromSatoshis(channelBal - commitFee), - RemoteBalance: lnwire.NewMSatFromSatoshis(channelBal), + LocalBalance: aliceBalance, + RemoteBalance: bobBalance, CommitFee: commitFee, FeePerKw: btcutil.Amount(feePerKw), CommitTx: aliceCommitTx, @@ -257,8 +261,8 @@ func CreateTestChannels(tweaklessCommits bool) ( } bobCommit := channeldb.ChannelCommitment{ CommitHeight: 0, - LocalBalance: lnwire.NewMSatFromSatoshis(channelBal), - RemoteBalance: lnwire.NewMSatFromSatoshis(channelBal - commitFee), + LocalBalance: bobBalance, + RemoteBalance: aliceBalance, CommitFee: commitFee, FeePerKw: btcutil.Amount(feePerKw), CommitTx: bobCommitTx, @@ -449,14 +453,14 @@ func txFromHex(txHex string) (*btcutil.Tx, error) { // calculations into account. // // TODO(bvu): Refactor when dynamic fee estimation is added. -func calcStaticFee(numHTLCs int) btcutil.Amount { +func calcStaticFee(chanType channeldb.ChannelType, numHTLCs int) btcutil.Amount { const ( - commitWeight = btcutil.Amount(724) - htlcWeight = 172 - feePerKw = btcutil.Amount(24/4) * 1000 + htlcWeight = 172 + feePerKw = btcutil.Amount(24/4) * 1000 ) - return feePerKw * (commitWeight + - btcutil.Amount(htlcWeight*numHTLCs)) / 1000 + return feePerKw * + (btcutil.Amount(CommitWeight(chanType) + + htlcWeight*int64(numHTLCs))) / 1000 } // ForceStateTransition executes the necessary interaction between the two diff --git a/rpcserver.go b/rpcserver.go index 841520a39d8..9613da4fd07 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -2756,6 +2756,43 @@ func (r *rpcServer) PendingChannels(ctx context.Context, for _, waitingClose := range waitingCloseChans { pub := waitingClose.IdentityPub.SerializeCompressed() chanPoint := waitingClose.FundingOutpoint + + var commitments lnrpc.PendingChannelsResponse_Commitments + + // Report local commit. May not be present when DLP is active. + if waitingClose.LocalCommitment.CommitTx != nil { + commitments.LocalTxid = + waitingClose.LocalCommitment.CommitTx.TxHash(). + String() + } + + // Report remote commit. May not be present when DLP is active. + if waitingClose.RemoteCommitment.CommitTx != nil { + commitments.RemoteTxid = + waitingClose.RemoteCommitment.CommitTx.TxHash(). + String() + } + + // Report the remote pending commit if any. + remoteCommitDiff, err := waitingClose.RemoteCommitChainTip() + + switch { + + // Don't set hash if there is no pending remote commit. + case err == channeldb.ErrNoPendingCommit: + + // An unexpected error occurred. + case err != nil: + return nil, err + + // There is a pending remote commit. Set its hash in the + // response. + default: + hash := remoteCommitDiff.Commitment.CommitTx.TxHash() + commitments.RemotePendingTxid = hash.String() + + } + channel := &lnrpc.PendingChannelsResponse_PendingChannel{ RemoteNodePub: hex.EncodeToString(pub), ChannelPoint: chanPoint.String(), @@ -2766,14 +2803,16 @@ func (r *rpcServer) PendingChannels(ctx context.Context, RemoteChanReserveSat: int64(waitingClose.RemoteChanCfg.ChanReserve), } + waitingCloseResp := &lnrpc.PendingChannelsResponse_WaitingCloseChannel{ + Channel: channel, + LimboBalance: channel.LocalBalance, + Commitments: &commitments, + } + // A close tx has been broadcasted, all our balance will be in // limbo until it confirms. resp.WaitingCloseChannels = append( - resp.WaitingCloseChannels, - &lnrpc.PendingChannelsResponse_WaitingCloseChannel{ - Channel: channel, - LimboBalance: channel.LocalBalance, - }, + resp.WaitingCloseChannels, waitingCloseResp, ) resp.TotalLimboBalance += channel.LocalBalance @@ -2817,6 +2856,12 @@ func (r *rpcServer) arbitratorPopulateForceCloseResp(chanPoint *wire.OutPoint, case contractcourt.ReportOutputIncomingHtlc, contractcourt.ReportOutputOutgoingHtlc: + // Don't report details on htlcs that are no longer in + // limbo. + if report.LimboBalance == 0 { + break + } + incoming := report.Type == contractcourt.ReportOutputIncomingHtlc htlc := &lnrpc.PendingHTLC{ Incoming: incoming, @@ -2833,6 +2878,22 @@ func (r *rpcServer) arbitratorPopulateForceCloseResp(chanPoint *wire.OutPoint, forceClose.PendingHtlcs = append(forceClose.PendingHtlcs, htlc) + case contractcourt.ReportOutputAnchor: + // There are three resolution states for the anchor: + // limbo, lost and recovered. Derive the current state + // from the limbo and recovered balances. + switch { + + case report.RecoveredBalance != 0: + forceClose.Anchor = lnrpc.PendingChannelsResponse_ForceClosedChannel_RECOVERED + + case report.LimboBalance != 0: + forceClose.Anchor = lnrpc.PendingChannelsResponse_ForceClosedChannel_LIMBO + + default: + forceClose.Anchor = lnrpc.PendingChannelsResponse_ForceClosedChannel_LOST + } + default: return fmt.Errorf("unknown report output type: %v", report.Type) @@ -2840,7 +2901,6 @@ func (r *rpcServer) arbitratorPopulateForceCloseResp(chanPoint *wire.OutPoint, forceClose.LimboBalance += int64(report.LimboBalance) forceClose.RecoveredBalance += int64(report.RecoveredBalance) - } return nil diff --git a/sweep/sweeper.go b/sweep/sweeper.go index 5997149348e..3b9acebe3c7 100644 --- a/sweep/sweeper.go +++ b/sweep/sweeper.go @@ -82,6 +82,18 @@ type Params struct { ExclusiveGroup *uint64 } +// ParamsUpdate contains a new set of parameters to update a pending sweep with. +type ParamsUpdate struct { + // Fee is the fee preference of the client who requested the input to be + // swept. If a confirmation target is specified, then we'll map it into + // a fee rate whenever we attempt to cluster inputs for a sweep. + Fee FeePreference + + // Force indicates whether the input should be swept regardless of + // whether it is economical to do so. + Force bool +} + // String returns a human readable interpretation of the sweep parameters. func (p Params) String() string { return fmt.Sprintf("fee=%v, force=%v, exclusive_group=%v", @@ -174,7 +186,7 @@ type PendingInput struct { // intent to update the sweep parameters of a given input. type updateReq struct { input wire.OutPoint - params Params + params ParamsUpdate responseChan chan *updateResp } @@ -372,6 +384,12 @@ func (s *UtxoSweeper) Start() error { return nil } +// RelayFeePerKW returns the minimum fee rate required for transactions to be +// relayed. +func (s *UtxoSweeper) RelayFeePerKW() chainfee.SatPerKWeight { + return s.relayFeeRate +} + // Stop stops sweeper from listening to block epochs and constructing sweep // txes. func (s *UtxoSweeper) Stop() error { @@ -714,7 +732,15 @@ func (s *UtxoSweeper) sweepCluster(cluster inputCluster, func (s *UtxoSweeper) bucketForFeeRate( feeRate chainfee.SatPerKWeight) int { - return int(feeRate-s.relayFeeRate) / s.cfg.FeeRateBucketSize + // Create an isolated bucket for sweeps at the minimum fee rate. This is + // to prevent very small outputs (anchors) from becoming uneconomical if + // their fee rate would be averaged with higher fee rate inputs in a + // regular bucket. + if feeRate == s.relayFeeRate { + return 0 + } + + return 1 + int(feeRate-s.relayFeeRate)/s.cfg.FeeRateBucketSize } // clusterBySweepFeeRate takes the set of pending inputs within the UtxoSweeper @@ -1111,7 +1137,7 @@ func (s *UtxoSweeper) handlePendingSweepsReq( // is actually successful. The responsibility of doing so should be handled by // the caller. func (s *UtxoSweeper) UpdateParams(input wire.OutPoint, - params Params) (chan Result, error) { + params ParamsUpdate) (chan Result, error) { // Ensure the client provided a sane fee preference. if _, err := s.feeRateForPreference(params.Fee); err != nil { @@ -1161,10 +1187,16 @@ func (s *UtxoSweeper) handleUpdateReq(req *updateReq, bestHeight int32) ( return nil, lnwallet.ErrNotMine } + // Create the updated parameters struct. Leave the exclusive group + // unchanged. + newParams := pendingInput.params + newParams.Fee = req.params.Fee + newParams.Force = req.params.Force + log.Debugf("Updating sweep parameters for %v from %v to %v", req.input, - pendingInput.params, req.params) + pendingInput.params, newParams) - pendingInput.params = req.params + pendingInput.params = newParams // We'll reset the input's publish height to the current so that a new // transaction can be created that replaces the transaction currently diff --git a/sweep/sweeper_test.go b/sweep/sweeper_test.go index 85908f7e817..5fbfce4c013 100644 --- a/sweep/sweeper_test.go +++ b/sweep/sweeper_test.go @@ -1179,7 +1179,7 @@ func TestBumpFeeRBF(t *testing.T) { // We'll first try to bump the fee of an output currently unknown to the // UtxoSweeper. Doing so should result in a lnwallet.ErrNotMine error. _, err := ctx.sweeper.UpdateParams( - wire.OutPoint{}, Params{Fee: lowFeePref}, + wire.OutPoint{}, ParamsUpdate{Fee: lowFeePref}, ) if err != lnwallet.ErrNotMine { t.Fatalf("expected error lnwallet.ErrNotMine, got \"%v\"", err) @@ -1208,13 +1208,13 @@ func TestBumpFeeRBF(t *testing.T) { ctx.estimator.blocksToFee[highFeePref.ConfTarget] = highFeeRate // We should expect to see an error if a fee preference isn't provided. - _, err = ctx.sweeper.UpdateParams(*input.OutPoint(), Params{}) + _, err = ctx.sweeper.UpdateParams(*input.OutPoint(), ParamsUpdate{}) if err != ErrNoFeePreference { t.Fatalf("expected ErrNoFeePreference, got %v", err) } bumpResult, err := ctx.sweeper.UpdateParams( - *input.OutPoint(), Params{Fee: highFeePref}, + *input.OutPoint(), ParamsUpdate{Fee: highFeePref}, ) if err != nil { t.Fatalf("unable to bump input's fee: %v", err)