Merge pull request #4427 from yyforyongyu/customize-root-key-id

macaroons: customize root key ID
This commit is contained in:
Olaoluwa Osuntokun 2020-08-21 19:34:15 -07:00 committed by GitHub
commit bd18f9acf5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
24 changed files with 2144 additions and 777 deletions

@ -1,11 +1,13 @@
package main package main
import ( import (
"bytes"
"context" "context"
"encoding/hex" "encoding/hex"
"fmt" "fmt"
"io/ioutil" "io/ioutil"
"net" "net"
"strconv"
"strings" "strings"
"github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc"
@ -18,7 +20,7 @@ var bakeMacaroonCommand = cli.Command{
Name: "bakemacaroon", Name: "bakemacaroon",
Category: "Macaroons", Category: "Macaroons",
Usage: "Bakes a new macaroon with the provided list of permissions " + Usage: "Bakes a new macaroon with the provided list of permissions " +
"and restrictions", "and restrictions.",
ArgsUsage: "[--save_to=] [--timeout=] [--ip_address=] permissions...", ArgsUsage: "[--save_to=] [--timeout=] [--ip_address=] permissions...",
Description: ` Description: `
Bake a new macaroon that grants the provided permissions and Bake a new macaroon that grants the provided permissions and
@ -48,6 +50,10 @@ var bakeMacaroonCommand = cli.Command{
Name: "ip_address", Name: "ip_address",
Usage: "the IP address the macaroon will be bound to", Usage: "the IP address the macaroon will be bound to",
}, },
cli.Uint64Flag{
Name: "root_key_id",
Usage: "the numerical root key ID used to create the macaroon",
},
}, },
Action: actionDecorator(bakeMacaroon), Action: actionDecorator(bakeMacaroon),
} }
@ -66,6 +72,7 @@ func bakeMacaroon(ctx *cli.Context) error {
savePath string savePath string
timeout int64 timeout int64
ipAddress net.IP ipAddress net.IP
rootKeyID uint64
parsedPermissions []*lnrpc.MacaroonPermission parsedPermissions []*lnrpc.MacaroonPermission
err error err error
) )
@ -89,6 +96,10 @@ func bakeMacaroon(ctx *cli.Context) error {
} }
} }
if ctx.IsSet("root_key_id") {
rootKeyID = ctx.Uint64("root_key_id")
}
// A command line argument can't be an empty string. So we'll check each // A command line argument can't be an empty string. So we'll check each
// entry if it's a valid entity:action tuple. The content itself is // entry if it's a valid entity:action tuple. The content itself is
// validated server side. We just make sure we can parse it correctly. // validated server side. We just make sure we can parse it correctly.
@ -122,6 +133,7 @@ func bakeMacaroon(ctx *cli.Context) error {
// RPC call. // RPC call.
req := &lnrpc.BakeMacaroonRequest{ req := &lnrpc.BakeMacaroonRequest{
Permissions: parsedPermissions, Permissions: parsedPermissions,
RootKeyId: rootKeyID,
} }
resp, err := client.BakeMacaroon(context.Background(), req) resp, err := client.BakeMacaroon(context.Background(), req)
if err != nil { if err != nil {
@ -180,3 +192,80 @@ func bakeMacaroon(ctx *cli.Context) error {
return nil return nil
} }
var listMacaroonIDsCommand = cli.Command{
Name: "listmacaroonids",
Category: "Macaroons",
Usage: "List all macaroons root key IDs in use.",
Action: actionDecorator(listMacaroonIDs),
}
func listMacaroonIDs(ctx *cli.Context) error {
client, cleanUp := getClient(ctx)
defer cleanUp()
req := &lnrpc.ListMacaroonIDsRequest{}
resp, err := client.ListMacaroonIDs(context.Background(), req)
if err != nil {
return err
}
printRespJSON(resp)
return nil
}
var deleteMacaroonIDCommand = cli.Command{
Name: "deletemacaroonid",
Category: "Macaroons",
Usage: "Delete a specific macaroon ID.",
ArgsUsage: "root_key_id",
Description: `
Remove a macaroon ID using the specified root key ID. For example:
lncli deletemacaroonid 1
WARNING
When the ID is deleted, all macaroons created from that root key will
be invalidated.
Note that the default root key ID 0 cannot be deleted.
`,
Action: actionDecorator(deleteMacaroonID),
}
func deleteMacaroonID(ctx *cli.Context) error {
client, cleanUp := getClient(ctx)
defer cleanUp()
// Validate args length. Only one argument is allowed.
if ctx.NArg() != 1 {
return cli.ShowCommandHelp(ctx, "deletemacaroonid")
}
rootKeyIDString := ctx.Args().First()
// Convert string into uint64.
rootKeyID, err := strconv.ParseUint(rootKeyIDString, 10, 64)
if err != nil {
return fmt.Errorf("root key ID must be a positive integer")
}
// Check that the value is not equal to DefaultRootKeyID. Note that the
// server also validates the root key ID when removing it. However, we check
// it here too so that we can give users a nice warning.
if bytes.Equal([]byte(rootKeyIDString), macaroons.DefaultRootKeyID) {
return fmt.Errorf("deleting the default root key ID 0 is not allowed")
}
// Make the actual RPC call.
req := &lnrpc.DeleteMacaroonIDRequest{
RootKeyId: rootKeyID,
}
resp, err := client.DeleteMacaroonID(context.Background(), req)
if err != nil {
return err
}
printRespJSON(resp)
return nil
}

@ -301,6 +301,8 @@ func main() {
verifyChanBackupCommand, verifyChanBackupCommand,
restoreChanBackupCommand, restoreChanBackupCommand,
bakeMacaroonCommand, bakeMacaroonCommand,
listMacaroonIDsCommand,
deleteMacaroonIDCommand,
trackPaymentCommand, trackPaymentCommand,
versionCommand, versionCommand,
} }

12
lnd.go

@ -863,8 +863,8 @@ func genMacaroons(ctx context.Context, svc *macaroons.Service,
// access invoice related calls. This is useful for merchants and other // access invoice related calls. This is useful for merchants and other
// services to allow an isolated instance that can only query and // services to allow an isolated instance that can only query and
// modify invoices. // modify invoices.
invoiceMac, err := svc.Oven.NewMacaroon( invoiceMac, err := svc.NewMacaroon(
ctx, bakery.LatestVersion, nil, invoicePermissions..., ctx, macaroons.DefaultRootKeyID, invoicePermissions...,
) )
if err != nil { if err != nil {
return err return err
@ -880,8 +880,8 @@ func genMacaroons(ctx context.Context, svc *macaroons.Service,
} }
// Generate the read-only macaroon and write it to a file. // Generate the read-only macaroon and write it to a file.
roMacaroon, err := svc.Oven.NewMacaroon( roMacaroon, err := svc.NewMacaroon(
ctx, bakery.LatestVersion, nil, readPermissions..., ctx, macaroons.DefaultRootKeyID, readPermissions...,
) )
if err != nil { if err != nil {
return err return err
@ -897,8 +897,8 @@ func genMacaroons(ctx context.Context, svc *macaroons.Service,
// Generate the admin macaroon and write it to a file. // Generate the admin macaroon and write it to a file.
adminPermissions := append(readPermissions, writePermissions...) adminPermissions := append(readPermissions, writePermissions...)
admMacaroon, err := svc.Oven.NewMacaroon( admMacaroon, err := svc.NewMacaroon(
ctx, bakery.LatestVersion, nil, adminPermissions..., ctx, macaroons.DefaultRootKeyID, adminPermissions...,
) )
if err != nil { if err != nil {
return err return err

@ -129,6 +129,11 @@ description):
* BakeMacaroon * BakeMacaroon
* Bakes a new macaroon with the provided list of permissions and * Bakes a new macaroon with the provided list of permissions and
restrictions restrictions
* ListMacaroonIDs
* List all the macaroon root key IDs that are in use.
* DeleteMacaroonID
* Remove a specific macaroon root key ID from the database and invalidates
all macaroons derived from the key with that ID.
## Service: WalletUnlocker ## Service: WalletUnlocker

@ -16,6 +16,7 @@ import (
"github.com/grpc-ecosystem/grpc-gateway/runtime" "github.com/grpc-ecosystem/grpc-gateway/runtime"
"github.com/lightningnetwork/lnd/chainntnfs" "github.com/lightningnetwork/lnd/chainntnfs"
"github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/macaroons"
"google.golang.org/grpc" "google.golang.org/grpc"
"gopkg.in/macaroon-bakery.v2/bakery" "gopkg.in/macaroon-bakery.v2/bakery"
) )
@ -119,8 +120,9 @@ func New(cfg *Config) (*Server, lnrpc.MacaroonPerms, error) {
// At this point, we know that the chain notifier macaroon // At this point, we know that the chain notifier macaroon
// doesn't yet, exist, so we need to create it with the help of // doesn't yet, exist, so we need to create it with the help of
// the main macaroon service. // the main macaroon service.
chainNotifierMac, err := cfg.MacService.Oven.NewMacaroon( chainNotifierMac, err := cfg.MacService.NewMacaroon(
context.Background(), bakery.LatestVersion, nil, context.Background(),
macaroons.DefaultRootKeyID,
macaroonOps..., macaroonOps...,
) )
if err != nil { if err != nil {

@ -15,6 +15,7 @@ import (
"github.com/lightningnetwork/lnd/channeldb" "github.com/lightningnetwork/lnd/channeldb"
"github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lntypes"
"github.com/lightningnetwork/lnd/macaroons"
) )
const ( const (
@ -99,8 +100,8 @@ func New(cfg *Config) (*Server, lnrpc.MacaroonPerms, error) {
// At this point, we know that the invoices macaroon doesn't // At this point, we know that the invoices macaroon doesn't
// yet, exist, so we need to create it with the help of the // yet, exist, so we need to create it with the help of the
// main macaroon service. // main macaroon service.
invoicesMac, err := cfg.MacService.Oven.NewMacaroon( invoicesMac, err := cfg.MacService.NewMacaroon(
context.Background(), bakery.LatestVersion, nil, context.Background(), macaroons.DefaultRootKeyID,
macaroonOps..., macaroonOps...,
) )
if err != nil { if err != nil {

@ -133,6 +133,10 @@ http:
- selector: lnrpc.Lightning.BakeMacaroon - selector: lnrpc.Lightning.BakeMacaroon
post: "/v1/macaroon" post: "/v1/macaroon"
body: "*" body: "*"
- selector: lnrpc.Lightning.ListMacaroonIDs
get: "/v1/macaroon/ids"
- selector: lnrpc.Lightning.DeleteMacaroonID
delete: "/v1/macaroon/{root_key_id}"
# walletunlocker.proto # walletunlocker.proto
- selector: lnrpc.WalletUnlocker.GenSeed - selector: lnrpc.WalletUnlocker.GenSeed

@ -15,6 +15,7 @@ import (
"github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lntypes" "github.com/lightningnetwork/lnd/lntypes"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/macaroons"
"github.com/lightningnetwork/lnd/routing" "github.com/lightningnetwork/lnd/routing"
"github.com/lightningnetwork/lnd/routing/route" "github.com/lightningnetwork/lnd/routing/route"
@ -164,8 +165,8 @@ func New(cfg *Config) (*Server, lnrpc.MacaroonPerms, error) {
// At this point, we know that the router macaroon doesn't yet, // At this point, we know that the router macaroon doesn't yet,
// exist, so we need to create it with the help of the main // exist, so we need to create it with the help of the main
// macaroon service. // macaroon service.
routerMac, err := cfg.MacService.Oven.NewMacaroon( routerMac, err := cfg.MacService.NewMacaroon(
context.Background(), bakery.LatestVersion, nil, context.Background(), macaroons.DefaultRootKeyID,
macaroonOps..., macaroonOps...,
) )
if err != nil { if err != nil {

@ -760,7 +760,7 @@ func (x Failure_FailureCode) String() string {
} }
func (Failure_FailureCode) EnumDescriptor() ([]byte, []int) { func (Failure_FailureCode) EnumDescriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{150, 0} return fileDescriptor_77a6da22d6a3feb1, []int{154, 0}
} }
type Utxo struct { type Utxo struct {
@ -11502,6 +11502,8 @@ func (m *MacaroonPermission) GetAction() string {
type BakeMacaroonRequest struct { type BakeMacaroonRequest struct {
// The list of permissions the new macaroon should grant. // The list of permissions the new macaroon should grant.
Permissions []*MacaroonPermission `protobuf:"bytes,1,rep,name=permissions,proto3" json:"permissions,omitempty"` Permissions []*MacaroonPermission `protobuf:"bytes,1,rep,name=permissions,proto3" json:"permissions,omitempty"`
// The root key ID used to create the macaroon, must be a positive integer.
RootKeyId uint64 `protobuf:"varint,2,opt,name=root_key_id,json=rootKeyId,proto3" json:"root_key_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"` XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"` XXX_sizecache int32 `json:"-"`
@ -11539,6 +11541,13 @@ func (m *BakeMacaroonRequest) GetPermissions() []*MacaroonPermission {
return nil return nil
} }
func (m *BakeMacaroonRequest) GetRootKeyId() uint64 {
if m != nil {
return m.RootKeyId
}
return 0
}
type BakeMacaroonResponse struct { type BakeMacaroonResponse struct {
// The hex encoded macaroon, serialized in binary format. // The hex encoded macaroon, serialized in binary format.
Macaroon string `protobuf:"bytes,1,opt,name=macaroon,proto3" json:"macaroon,omitempty"` Macaroon string `protobuf:"bytes,1,opt,name=macaroon,proto3" json:"macaroon,omitempty"`
@ -11579,6 +11588,157 @@ func (m *BakeMacaroonResponse) GetMacaroon() string {
return "" return ""
} }
type ListMacaroonIDsRequest struct {
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ListMacaroonIDsRequest) Reset() { *m = ListMacaroonIDsRequest{} }
func (m *ListMacaroonIDsRequest) String() string { return proto.CompactTextString(m) }
func (*ListMacaroonIDsRequest) ProtoMessage() {}
func (*ListMacaroonIDsRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{150}
}
func (m *ListMacaroonIDsRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListMacaroonIDsRequest.Unmarshal(m, b)
}
func (m *ListMacaroonIDsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ListMacaroonIDsRequest.Marshal(b, m, deterministic)
}
func (m *ListMacaroonIDsRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_ListMacaroonIDsRequest.Merge(m, src)
}
func (m *ListMacaroonIDsRequest) XXX_Size() int {
return xxx_messageInfo_ListMacaroonIDsRequest.Size(m)
}
func (m *ListMacaroonIDsRequest) XXX_DiscardUnknown() {
xxx_messageInfo_ListMacaroonIDsRequest.DiscardUnknown(m)
}
var xxx_messageInfo_ListMacaroonIDsRequest proto.InternalMessageInfo
type ListMacaroonIDsResponse struct {
// The list of root key IDs that are in use.
RootKeyIds []uint64 `protobuf:"varint,1,rep,packed,name=root_key_ids,json=rootKeyIds,proto3" json:"root_key_ids,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *ListMacaroonIDsResponse) Reset() { *m = ListMacaroonIDsResponse{} }
func (m *ListMacaroonIDsResponse) String() string { return proto.CompactTextString(m) }
func (*ListMacaroonIDsResponse) ProtoMessage() {}
func (*ListMacaroonIDsResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{151}
}
func (m *ListMacaroonIDsResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_ListMacaroonIDsResponse.Unmarshal(m, b)
}
func (m *ListMacaroonIDsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_ListMacaroonIDsResponse.Marshal(b, m, deterministic)
}
func (m *ListMacaroonIDsResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_ListMacaroonIDsResponse.Merge(m, src)
}
func (m *ListMacaroonIDsResponse) XXX_Size() int {
return xxx_messageInfo_ListMacaroonIDsResponse.Size(m)
}
func (m *ListMacaroonIDsResponse) XXX_DiscardUnknown() {
xxx_messageInfo_ListMacaroonIDsResponse.DiscardUnknown(m)
}
var xxx_messageInfo_ListMacaroonIDsResponse proto.InternalMessageInfo
func (m *ListMacaroonIDsResponse) GetRootKeyIds() []uint64 {
if m != nil {
return m.RootKeyIds
}
return nil
}
type DeleteMacaroonIDRequest struct {
// The root key ID to be removed.
RootKeyId uint64 `protobuf:"varint,1,opt,name=root_key_id,json=rootKeyId,proto3" json:"root_key_id,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *DeleteMacaroonIDRequest) Reset() { *m = DeleteMacaroonIDRequest{} }
func (m *DeleteMacaroonIDRequest) String() string { return proto.CompactTextString(m) }
func (*DeleteMacaroonIDRequest) ProtoMessage() {}
func (*DeleteMacaroonIDRequest) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{152}
}
func (m *DeleteMacaroonIDRequest) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DeleteMacaroonIDRequest.Unmarshal(m, b)
}
func (m *DeleteMacaroonIDRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_DeleteMacaroonIDRequest.Marshal(b, m, deterministic)
}
func (m *DeleteMacaroonIDRequest) XXX_Merge(src proto.Message) {
xxx_messageInfo_DeleteMacaroonIDRequest.Merge(m, src)
}
func (m *DeleteMacaroonIDRequest) XXX_Size() int {
return xxx_messageInfo_DeleteMacaroonIDRequest.Size(m)
}
func (m *DeleteMacaroonIDRequest) XXX_DiscardUnknown() {
xxx_messageInfo_DeleteMacaroonIDRequest.DiscardUnknown(m)
}
var xxx_messageInfo_DeleteMacaroonIDRequest proto.InternalMessageInfo
func (m *DeleteMacaroonIDRequest) GetRootKeyId() uint64 {
if m != nil {
return m.RootKeyId
}
return 0
}
type DeleteMacaroonIDResponse struct {
// A boolean indicates that the deletion is successful.
Deleted bool `protobuf:"varint,1,opt,name=deleted,proto3" json:"deleted,omitempty"`
XXX_NoUnkeyedLiteral struct{} `json:"-"`
XXX_unrecognized []byte `json:"-"`
XXX_sizecache int32 `json:"-"`
}
func (m *DeleteMacaroonIDResponse) Reset() { *m = DeleteMacaroonIDResponse{} }
func (m *DeleteMacaroonIDResponse) String() string { return proto.CompactTextString(m) }
func (*DeleteMacaroonIDResponse) ProtoMessage() {}
func (*DeleteMacaroonIDResponse) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{153}
}
func (m *DeleteMacaroonIDResponse) XXX_Unmarshal(b []byte) error {
return xxx_messageInfo_DeleteMacaroonIDResponse.Unmarshal(m, b)
}
func (m *DeleteMacaroonIDResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) {
return xxx_messageInfo_DeleteMacaroonIDResponse.Marshal(b, m, deterministic)
}
func (m *DeleteMacaroonIDResponse) XXX_Merge(src proto.Message) {
xxx_messageInfo_DeleteMacaroonIDResponse.Merge(m, src)
}
func (m *DeleteMacaroonIDResponse) XXX_Size() int {
return xxx_messageInfo_DeleteMacaroonIDResponse.Size(m)
}
func (m *DeleteMacaroonIDResponse) XXX_DiscardUnknown() {
xxx_messageInfo_DeleteMacaroonIDResponse.DiscardUnknown(m)
}
var xxx_messageInfo_DeleteMacaroonIDResponse proto.InternalMessageInfo
func (m *DeleteMacaroonIDResponse) GetDeleted() bool {
if m != nil {
return m.Deleted
}
return false
}
type Failure struct { type Failure struct {
// Failure code as defined in the Lightning spec // Failure code as defined in the Lightning spec
Code Failure_FailureCode `protobuf:"varint,1,opt,name=code,proto3,enum=lnrpc.Failure_FailureCode" json:"code,omitempty"` Code Failure_FailureCode `protobuf:"varint,1,opt,name=code,proto3,enum=lnrpc.Failure_FailureCode" json:"code,omitempty"`
@ -11607,7 +11767,7 @@ func (m *Failure) Reset() { *m = Failure{} }
func (m *Failure) String() string { return proto.CompactTextString(m) } func (m *Failure) String() string { return proto.CompactTextString(m) }
func (*Failure) ProtoMessage() {} func (*Failure) ProtoMessage() {}
func (*Failure) Descriptor() ([]byte, []int) { func (*Failure) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{150} return fileDescriptor_77a6da22d6a3feb1, []int{154}
} }
func (m *Failure) XXX_Unmarshal(b []byte) error { func (m *Failure) XXX_Unmarshal(b []byte) error {
@ -11751,7 +11911,7 @@ func (m *ChannelUpdate) Reset() { *m = ChannelUpdate{} }
func (m *ChannelUpdate) String() string { return proto.CompactTextString(m) } func (m *ChannelUpdate) String() string { return proto.CompactTextString(m) }
func (*ChannelUpdate) ProtoMessage() {} func (*ChannelUpdate) ProtoMessage() {}
func (*ChannelUpdate) Descriptor() ([]byte, []int) { func (*ChannelUpdate) Descriptor() ([]byte, []int) {
return fileDescriptor_77a6da22d6a3feb1, []int{151} return fileDescriptor_77a6da22d6a3feb1, []int{155}
} }
func (m *ChannelUpdate) XXX_Unmarshal(b []byte) error { func (m *ChannelUpdate) XXX_Unmarshal(b []byte) error {
@ -12043,6 +12203,10 @@ func init() {
proto.RegisterType((*MacaroonPermission)(nil), "lnrpc.MacaroonPermission") proto.RegisterType((*MacaroonPermission)(nil), "lnrpc.MacaroonPermission")
proto.RegisterType((*BakeMacaroonRequest)(nil), "lnrpc.BakeMacaroonRequest") proto.RegisterType((*BakeMacaroonRequest)(nil), "lnrpc.BakeMacaroonRequest")
proto.RegisterType((*BakeMacaroonResponse)(nil), "lnrpc.BakeMacaroonResponse") proto.RegisterType((*BakeMacaroonResponse)(nil), "lnrpc.BakeMacaroonResponse")
proto.RegisterType((*ListMacaroonIDsRequest)(nil), "lnrpc.ListMacaroonIDsRequest")
proto.RegisterType((*ListMacaroonIDsResponse)(nil), "lnrpc.ListMacaroonIDsResponse")
proto.RegisterType((*DeleteMacaroonIDRequest)(nil), "lnrpc.DeleteMacaroonIDRequest")
proto.RegisterType((*DeleteMacaroonIDResponse)(nil), "lnrpc.DeleteMacaroonIDResponse")
proto.RegisterType((*Failure)(nil), "lnrpc.Failure") proto.RegisterType((*Failure)(nil), "lnrpc.Failure")
proto.RegisterType((*ChannelUpdate)(nil), "lnrpc.ChannelUpdate") proto.RegisterType((*ChannelUpdate)(nil), "lnrpc.ChannelUpdate")
} }
@ -12050,735 +12214,742 @@ func init() {
func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) }
var fileDescriptor_77a6da22d6a3feb1 = []byte{ var fileDescriptor_77a6da22d6a3feb1 = []byte{
// 11641 bytes of a gzipped FileDescriptorProto // 11755 bytes of a gzipped FileDescriptorProto
0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x5b, 0x6c, 0x23, 0x49, 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x5b, 0x6c, 0x23, 0x49,
0x96, 0x18, 0x5a, 0x7c, 0x89, 0xe4, 0x21, 0x29, 0x51, 0xa1, 0x17, 0x4b, 0xd5, 0xd5, 0x55, 0x9d, 0x96, 0x18, 0x5a, 0x7c, 0x89, 0xe4, 0x21, 0x29, 0xa5, 0x42, 0x2f, 0x96, 0xaa, 0xab, 0xab, 0x3a,
0xdd, 0xd3, 0x5d, 0x53, 0xdd, 0xa3, 0xae, 0xae, 0x99, 0x7e, 0x4d, 0xdf, 0x9d, 0x19, 0x8a, 0xa2, 0xbb, 0xa7, 0xbb, 0xa6, 0xba, 0xa7, 0xba, 0xba, 0xa6, 0xab, 0x1f, 0x53, 0x77, 0x67, 0x86, 0xa2,
0x4a, 0x9c, 0x92, 0x48, 0x4d, 0x92, 0xea, 0xde, 0x5e, 0xec, 0xdd, 0xdc, 0x14, 0x19, 0x92, 0xd2, 0xa8, 0x12, 0xa7, 0x24, 0x52, 0x93, 0xa4, 0xba, 0xb7, 0x17, 0x7b, 0x37, 0x37, 0x45, 0x86, 0xa4,
0x45, 0x66, 0xb2, 0x33, 0x93, 0x2a, 0x69, 0x0c, 0xff, 0xad, 0x1f, 0x58, 0xd8, 0x06, 0x0c, 0x78, 0xbc, 0x45, 0x66, 0xb2, 0x33, 0x93, 0x2a, 0x69, 0x2e, 0xee, 0xdf, 0x5e, 0xdb, 0x58, 0xd8, 0x06,
0x0d, 0xf8, 0xb1, 0xf0, 0x0b, 0xb6, 0xff, 0x16, 0x86, 0x67, 0xed, 0x2f, 0x7f, 0x7b, 0x01, 0xc3, 0x0c, 0x78, 0x0d, 0xf8, 0xb1, 0xf0, 0x0b, 0xb6, 0xff, 0x16, 0x86, 0x77, 0xed, 0x2f, 0x7f, 0x7b,
0x86, 0x6d, 0x78, 0x0d, 0x3f, 0xb0, 0x58, 0xc0, 0x1f, 0x5e, 0x7f, 0x18, 0x30, 0x16, 0xf0, 0x97, 0x01, 0xc3, 0x86, 0x61, 0x78, 0x0d, 0x3f, 0xb0, 0x58, 0xc0, 0x1f, 0x5e, 0x7f, 0x18, 0x30, 0x16,
0x3f, 0x0c, 0x18, 0x71, 0x4e, 0x44, 0x66, 0x24, 0x99, 0xaa, 0xaa, 0x9e, 0x6d, 0xcf, 0x8f, 0xc4, 0xf0, 0x87, 0xe1, 0x0f, 0x03, 0x46, 0xc4, 0x89, 0x88, 0x8c, 0x4c, 0xa6, 0xaa, 0xaa, 0x67, 0xdb,
0x38, 0x71, 0xe2, 0x7d, 0xe2, 0xc4, 0x79, 0x45, 0x24, 0x94, 0xfd, 0xe9, 0x70, 0x67, 0xea, 0x7b, 0xf3, 0x23, 0x31, 0x4e, 0x9c, 0x78, 0x9f, 0x38, 0x71, 0x5e, 0x11, 0x09, 0xd5, 0x60, 0x36, 0x7a,
0xa1, 0xc7, 0x0a, 0x63, 0xd7, 0x9f, 0x0e, 0x8d, 0x3f, 0xca, 0x40, 0xfe, 0x24, 0xbc, 0xf2, 0xd8, 0x30, 0x0b, 0xfc, 0xc8, 0x27, 0xa5, 0x89, 0x17, 0xcc, 0x46, 0xe6, 0x1f, 0xe7, 0xa0, 0x78, 0x1c,
0x87, 0x50, 0xb5, 0x47, 0x23, 0x9f, 0x07, 0x81, 0x15, 0x5e, 0x4f, 0x79, 0x23, 0x73, 0x3f, 0xf3, 0x5d, 0xfa, 0xe4, 0x31, 0xd4, 0x9d, 0xf1, 0x38, 0xa0, 0x61, 0x68, 0x47, 0x57, 0x33, 0xda, 0xcc,
0x60, 0xf9, 0x31, 0xdb, 0x41, 0xb4, 0x9d, 0x26, 0x65, 0x0d, 0xae, 0xa7, 0xdc, 0xac, 0xd8, 0x71, 0xdd, 0xcd, 0xdd, 0x5b, 0x7e, 0x44, 0x1e, 0x70, 0xb4, 0x07, 0x2d, 0xcc, 0x1a, 0x5e, 0xcd, 0xa8,
0x82, 0x35, 0xa0, 0x28, 0x93, 0x8d, 0xec, 0xfd, 0xcc, 0x83, 0xb2, 0xa9, 0x92, 0xec, 0x2e, 0x80, 0x55, 0x73, 0xe2, 0x04, 0x69, 0x42, 0x59, 0x24, 0x9b, 0xf9, 0xbb, 0xb9, 0x7b, 0x55, 0x4b, 0x26,
0x3d, 0xf1, 0x66, 0x6e, 0x68, 0x05, 0x76, 0xd8, 0xc8, 0xdd, 0xcf, 0x3c, 0xc8, 0x99, 0x65, 0x82, 0xc9, 0x6d, 0x00, 0x67, 0xea, 0xcf, 0xbd, 0xc8, 0x0e, 0x9d, 0xa8, 0x59, 0xb8, 0x9b, 0xbb, 0x57,
0xf4, 0xed, 0x90, 0xdd, 0x81, 0xf2, 0xf4, 0x99, 0x15, 0x0c, 0x7d, 0x67, 0x1a, 0x36, 0xf2, 0x58, 0xb0, 0xaa, 0x08, 0x19, 0x38, 0x11, 0xb9, 0x05, 0xd5, 0xd9, 0x73, 0x3b, 0x1c, 0x05, 0xee, 0x2c,
0xb4, 0x34, 0x7d, 0xd6, 0xc7, 0x34, 0x7b, 0x17, 0x4a, 0xde, 0x2c, 0x9c, 0x7a, 0x8e, 0x1b, 0x36, 0x6a, 0x16, 0x79, 0xd1, 0xca, 0xec, 0xf9, 0x80, 0xa7, 0xc9, 0xfb, 0x50, 0xf1, 0xe7, 0xd1, 0xcc,
0x0a, 0xf7, 0x33, 0x0f, 0x2a, 0x8f, 0x57, 0x64, 0x47, 0x7a, 0xb3, 0xf0, 0x58, 0x80, 0xcd, 0x08, 0x77, 0xbd, 0xa8, 0x59, 0xba, 0x9b, 0xbb, 0x57, 0x7b, 0xb4, 0x22, 0x3a, 0xd2, 0x9f, 0x47, 0x47,
0x81, 0xbd, 0x05, 0xb5, 0xa1, 0xe7, 0x9e, 0x39, 0xfe, 0xc4, 0x0e, 0x1d, 0xcf, 0x0d, 0x1a, 0x4b, 0x0c, 0x6c, 0x29, 0x04, 0xf2, 0x0e, 0x34, 0x46, 0xbe, 0x77, 0xea, 0x06, 0x53, 0x27, 0x72, 0x7d,
0xd8, 0x56, 0x12, 0x68, 0xfc, 0x8b, 0x2c, 0x54, 0x06, 0xbe, 0xed, 0x06, 0xf6, 0x50, 0x00, 0xd8, 0x2f, 0x6c, 0x2e, 0xf1, 0xb6, 0x92, 0x40, 0xf3, 0x9f, 0xe5, 0xa1, 0x36, 0x0c, 0x1c, 0x2f, 0x74,
0x16, 0x14, 0xc3, 0x2b, 0xeb, 0xc2, 0x0e, 0x2e, 0x70, 0xa8, 0x65, 0x73, 0x29, 0xbc, 0x3a, 0xb0, 0x46, 0x0c, 0x40, 0xb6, 0xa0, 0x1c, 0x5d, 0xda, 0xe7, 0x4e, 0x78, 0xce, 0x87, 0x5a, 0xb5, 0x96,
0x83, 0x0b, 0xb6, 0x09, 0x4b, 0xd4, 0x4b, 0x1c, 0x50, 0xce, 0x94, 0x29, 0xf6, 0x2e, 0xac, 0xba, 0xa2, 0xcb, 0x7d, 0x27, 0x3c, 0x27, 0x9b, 0xb0, 0x84, 0xbd, 0xe4, 0x03, 0x2a, 0x58, 0x22, 0x45,
0xb3, 0x89, 0x95, 0x6c, 0x4a, 0x0c, 0xab, 0x60, 0xd6, 0xdd, 0xd9, 0xa4, 0xa5, 0xc3, 0xc5, 0xe0, 0xde, 0x87, 0x55, 0x6f, 0x3e, 0xb5, 0x93, 0x4d, 0xb1, 0x61, 0x95, 0x2c, 0xc3, 0x9b, 0x4f, 0xdb,
0x4f, 0xc7, 0xde, 0xf0, 0x19, 0x35, 0x40, 0xc3, 0x2b, 0x23, 0x04, 0xdb, 0x78, 0x03, 0xaa, 0x32, 0x3a, 0x9c, 0x0d, 0xfe, 0x64, 0xe2, 0x8f, 0x9e, 0x63, 0x03, 0x38, 0xbc, 0x2a, 0x87, 0xf0, 0x36,
0x9b, 0x3b, 0xe7, 0x17, 0x34, 0xc6, 0x82, 0x59, 0x21, 0x04, 0x04, 0x89, 0x1a, 0x42, 0x67, 0xc2, 0xde, 0x82, 0xba, 0xc8, 0xa6, 0xee, 0xd9, 0x39, 0x8e, 0xb1, 0x64, 0xd5, 0x10, 0x81, 0x83, 0x58,
0xad, 0x20, 0xb4, 0x27, 0x53, 0x39, 0xa4, 0xb2, 0x80, 0xf4, 0x05, 0x00, 0xb3, 0xbd, 0xd0, 0x1e, 0x0d, 0x91, 0x3b, 0xa5, 0x76, 0x18, 0x39, 0xd3, 0x99, 0x18, 0x52, 0x95, 0x41, 0x06, 0x0c, 0xc0,
0x5b, 0x67, 0x9c, 0x07, 0x8d, 0xa2, 0xcc, 0x16, 0x90, 0x7d, 0xce, 0x03, 0xf6, 0x2d, 0x58, 0x1e, 0xb3, 0xfd, 0xc8, 0x99, 0xd8, 0xa7, 0x94, 0x86, 0xcd, 0xb2, 0xc8, 0x66, 0x90, 0x3d, 0x4a, 0x43,
0xf1, 0x20, 0xb4, 0xe4, 0x62, 0xf0, 0xa0, 0x51, 0xba, 0x9f, 0x7b, 0x50, 0x36, 0x6b, 0x02, 0xda, 0xf2, 0x1d, 0x58, 0x1e, 0xd3, 0x30, 0xb2, 0xc5, 0x62, 0xd0, 0xb0, 0x59, 0xb9, 0x5b, 0xb8, 0x57,
0x54, 0x40, 0xf6, 0x1a, 0x80, 0x6f, 0x3f, 0xb7, 0xc4, 0x44, 0xf0, 0xab, 0x46, 0x99, 0x56, 0xc1, 0xb5, 0x1a, 0x0c, 0xda, 0x92, 0x40, 0xf2, 0x06, 0x40, 0xe0, 0xbc, 0xb0, 0xd9, 0x44, 0xd0, 0xcb,
0xb7, 0x9f, 0x0f, 0xae, 0x0e, 0xf8, 0x15, 0x5b, 0x87, 0xc2, 0xd8, 0x3e, 0xe5, 0xe3, 0x06, 0x60, 0x66, 0x15, 0x57, 0x21, 0x70, 0x5e, 0x0c, 0x2f, 0xf7, 0xe9, 0x25, 0x59, 0x87, 0xd2, 0xc4, 0x39,
0x06, 0x25, 0x8c, 0x5f, 0x81, 0xcd, 0x27, 0x3c, 0xd4, 0xa6, 0x32, 0x30, 0xf9, 0x57, 0x33, 0x1e, 0xa1, 0x93, 0x26, 0xf0, 0x0c, 0x4c, 0x98, 0xbf, 0x02, 0x9b, 0x4f, 0x69, 0xa4, 0x4d, 0x65, 0x68,
0x84, 0x62, 0x54, 0x41, 0x68, 0xfb, 0xa1, 0x1a, 0x55, 0x86, 0x46, 0x85, 0xb0, 0x78, 0x54, 0xdc, 0xd1, 0xaf, 0xe7, 0x34, 0x8c, 0xd8, 0xa8, 0xc2, 0xc8, 0x09, 0x22, 0x39, 0xaa, 0x1c, 0x8e, 0x8a,
0x1d, 0x29, 0x84, 0x2c, 0x22, 0x94, 0xb9, 0x3b, 0xa2, 0x6c, 0xe3, 0x10, 0x98, 0x56, 0xf1, 0x1e, 0xc3, 0xe2, 0x51, 0x51, 0x6f, 0x2c, 0x11, 0xf2, 0x1c, 0xa1, 0x4a, 0xbd, 0x31, 0x66, 0x9b, 0x07,
0x0f, 0x6d, 0x67, 0x1c, 0xb0, 0x8f, 0xa0, 0x1a, 0x6a, 0xcd, 0x35, 0x32, 0xf7, 0x73, 0x0f, 0x2a, 0x40, 0xb4, 0x8a, 0x77, 0x69, 0xe4, 0xb8, 0x93, 0x90, 0x7c, 0x02, 0xf5, 0x48, 0x6b, 0xae, 0x99,
0x11, 0x69, 0x6a, 0x05, 0xcc, 0x04, 0x9e, 0x71, 0x01, 0xa5, 0x7d, 0xce, 0x0f, 0x9d, 0x89, 0x13, 0xbb, 0x5b, 0xb8, 0x57, 0x53, 0xa4, 0xa9, 0x15, 0xb0, 0x12, 0x78, 0xe6, 0x39, 0x54, 0xf6, 0x28,
0xb2, 0x4d, 0x28, 0x9c, 0x39, 0x57, 0x7c, 0x84, 0x9d, 0xca, 0x1d, 0xdc, 0x32, 0x29, 0xc9, 0xee, 0x3d, 0x70, 0xa7, 0x6e, 0x44, 0x36, 0xa1, 0x74, 0xea, 0x5e, 0xd2, 0x31, 0xef, 0x54, 0x61, 0xff,
0x01, 0xe0, 0x0f, 0x6b, 0x12, 0x51, 0xe9, 0xc1, 0x2d, 0xb3, 0x8c, 0xb0, 0xa3, 0xc0, 0x0e, 0xd9, 0x86, 0x85, 0x49, 0x72, 0x07, 0x80, 0xff, 0xb0, 0xa7, 0x8a, 0x4a, 0xf7, 0x6f, 0x58, 0x55, 0x0e,
0x36, 0x14, 0xa7, 0xdc, 0x1f, 0x72, 0x45, 0x0f, 0x07, 0xb7, 0x4c, 0x05, 0xd8, 0x2d, 0x42, 0x61, 0x3b, 0x0c, 0x9d, 0x88, 0x6c, 0x43, 0x79, 0x46, 0x83, 0x11, 0x95, 0xf4, 0xb0, 0x7f, 0xc3, 0x92,
0x2c, 0x6a, 0x37, 0x7e, 0xaf, 0x00, 0x95, 0x3e, 0x77, 0x47, 0x6a, 0x26, 0x18, 0xe4, 0xc5, 0x44, 0x80, 0x9d, 0x32, 0x94, 0x26, 0xac, 0x76, 0xf3, 0xf7, 0x4b, 0x50, 0x1b, 0x50, 0x6f, 0x2c, 0x67,
0x63, 0x63, 0x55, 0x13, 0x7f, 0xb3, 0x37, 0xa1, 0x82, 0x4b, 0x12, 0x84, 0xbe, 0xe3, 0x9e, 0xd3, 0x82, 0x40, 0x91, 0x4d, 0x34, 0x6f, 0xac, 0x6e, 0xf1, 0xdf, 0xe4, 0x6d, 0xa8, 0xf1, 0x25, 0x09,
0x6e, 0xd9, 0xcd, 0x36, 0x32, 0x26, 0x08, 0x70, 0x1f, 0xa1, 0xac, 0x0e, 0x39, 0x7b, 0xa2, 0x76, 0xa3, 0xc0, 0xf5, 0xce, 0x70, 0xb7, 0xec, 0xe4, 0x9b, 0x39, 0x0b, 0x18, 0x78, 0xc0, 0xa1, 0xc4,
0x8b, 0xf8, 0xc9, 0x6e, 0x43, 0xc9, 0x9e, 0x84, 0xd4, 0xbd, 0x2a, 0x82, 0x8b, 0xf6, 0x24, 0xc4, 0x80, 0x82, 0x33, 0x95, 0xbb, 0x85, 0xfd, 0x24, 0x37, 0xa1, 0xe2, 0x4c, 0x23, 0xec, 0x5e, 0x9d,
0xae, 0xbd, 0x01, 0xd5, 0xa9, 0x7d, 0x3d, 0xe1, 0x6e, 0x18, 0x93, 0x59, 0xd5, 0xac, 0x48, 0x18, 0x83, 0xcb, 0xce, 0x34, 0xe2, 0x5d, 0x7b, 0x0b, 0xea, 0x33, 0xe7, 0x6a, 0x4a, 0xbd, 0x28, 0x26,
0x12, 0xda, 0x63, 0x58, 0xd3, 0x51, 0x54, 0xe3, 0x85, 0xa8, 0xf1, 0x55, 0x0d, 0x5b, 0xf6, 0xe1, 0xb3, 0xba, 0x55, 0x13, 0x30, 0x4e, 0x68, 0x8f, 0x60, 0x4d, 0x47, 0x91, 0x8d, 0x97, 0x54, 0xe3,
0x1d, 0x58, 0x51, 0x65, 0x7c, 0x1a, 0x0f, 0x92, 0x5f, 0xd9, 0x5c, 0x96, 0x60, 0x35, 0xca, 0x07, 0xab, 0x1a, 0xb6, 0xe8, 0xc3, 0x7b, 0xb0, 0x22, 0xcb, 0x04, 0x38, 0x1e, 0x4e, 0x7e, 0x55, 0x6b,
0x50, 0x3f, 0x73, 0x5c, 0x7b, 0x6c, 0x0d, 0xc7, 0xe1, 0xa5, 0x35, 0xe2, 0xe3, 0xd0, 0x46, 0x4a, 0x59, 0x80, 0xe5, 0x28, 0xef, 0x81, 0x71, 0xea, 0x7a, 0xce, 0xc4, 0x1e, 0x4d, 0xa2, 0x0b, 0x7b,
0x2c, 0x98, 0xcb, 0x08, 0x6f, 0x8d, 0xc3, 0xcb, 0x3d, 0x01, 0x65, 0xef, 0x41, 0xf9, 0x8c, 0x73, 0x4c, 0x27, 0x91, 0xc3, 0x29, 0xb1, 0x64, 0x2d, 0x73, 0x78, 0x7b, 0x12, 0x5d, 0xec, 0x32, 0x28,
0x0b, 0x27, 0xab, 0x51, 0x4a, 0x6c, 0x68, 0xb5, 0x42, 0x66, 0xe9, 0x4c, 0xad, 0xd5, 0x7b, 0x50, 0xf9, 0x00, 0xaa, 0xa7, 0x94, 0xda, 0x7c, 0xb2, 0x9a, 0x95, 0xc4, 0x86, 0x96, 0x2b, 0x64, 0x55,
0xf7, 0x66, 0xe1, 0xb9, 0xe7, 0xb8, 0xe7, 0xd6, 0xf0, 0xc2, 0x76, 0x2d, 0x67, 0x84, 0xb4, 0x99, 0x4e, 0xe5, 0x5a, 0x7d, 0x00, 0x86, 0x3f, 0x8f, 0xce, 0x7c, 0xd7, 0x3b, 0xb3, 0x47, 0xe7, 0x8e,
0xdf, 0xcd, 0x3e, 0xca, 0x98, 0xcb, 0x2a, 0xaf, 0x75, 0x61, 0xbb, 0x9d, 0x11, 0x7b, 0x1b, 0x56, 0x67, 0xbb, 0x63, 0x4e, 0x9b, 0xc5, 0x9d, 0xfc, 0xc3, 0x9c, 0xb5, 0x2c, 0xf3, 0xda, 0xe7, 0x8e,
0xc6, 0x76, 0x10, 0x5a, 0x17, 0xde, 0xd4, 0x9a, 0xce, 0x4e, 0x9f, 0xf1, 0xeb, 0x46, 0x0d, 0x27, 0xd7, 0x1d, 0x93, 0x77, 0x61, 0x65, 0xe2, 0x84, 0x91, 0x7d, 0xee, 0xcf, 0xec, 0xd9, 0xfc, 0xe4,
0xa2, 0x26, 0xc0, 0x07, 0xde, 0xf4, 0x18, 0x81, 0x82, 0xf4, 0xb0, 0x9f, 0xd4, 0x09, 0x41, 0xd2, 0x39, 0xbd, 0x6a, 0x36, 0xf8, 0x44, 0x34, 0x18, 0x78, 0xdf, 0x9f, 0x1d, 0x71, 0x20, 0x23, 0x3d,
0x35, 0xb3, 0x2c, 0x20, 0xd4, 0xe8, 0x97, 0xb0, 0x86, 0xcb, 0x33, 0x9c, 0x05, 0xa1, 0x37, 0xb1, 0xde, 0x4f, 0xec, 0x04, 0x23, 0xe9, 0x86, 0x55, 0x65, 0x10, 0x6c, 0xf4, 0x2b, 0x58, 0xe3, 0xcb,
0x7c, 0x3e, 0xf4, 0xfc, 0x51, 0xd0, 0xa8, 0x20, 0xad, 0x7d, 0x5b, 0x76, 0x56, 0x5b, 0xe3, 0x9d, 0x33, 0x9a, 0x87, 0x91, 0x3f, 0xb5, 0x03, 0x3a, 0xf2, 0x83, 0x71, 0xd8, 0xac, 0x71, 0x5a, 0xfb,
0x3d, 0x1e, 0x84, 0x2d, 0x44, 0x36, 0x09, 0xb7, 0xed, 0x86, 0xfe, 0xb5, 0xb9, 0x3a, 0x9a, 0x87, 0xae, 0xe8, 0xac, 0xb6, 0xc6, 0x0f, 0x76, 0x69, 0x18, 0xb5, 0x39, 0xb2, 0x85, 0xb8, 0x1d, 0x2f,
0xb3, 0xf7, 0x80, 0xd9, 0xe3, 0xb1, 0xf7, 0xdc, 0x0a, 0xf8, 0xf8, 0xcc, 0x92, 0x93, 0xd8, 0x58, 0x0a, 0xae, 0xac, 0xd5, 0x71, 0x1a, 0x4e, 0x3e, 0x00, 0xe2, 0x4c, 0x26, 0xfe, 0x0b, 0x3b, 0xa4,
0xbe, 0x9f, 0x79, 0x50, 0x32, 0xeb, 0x98, 0xd3, 0xe7, 0xe3, 0xb3, 0x63, 0x82, 0xb3, 0x8f, 0x00, 0x93, 0x53, 0x5b, 0x4c, 0x62, 0x73, 0xf9, 0x6e, 0xee, 0x5e, 0xc5, 0x32, 0x78, 0xce, 0x80, 0x4e,
0x37, 0xa9, 0x75, 0xc6, 0xed, 0x70, 0xe6, 0xf3, 0xa0, 0xb1, 0x72, 0x3f, 0xf7, 0x60, 0xf9, 0xf1, 0x4e, 0x8f, 0x10, 0x4e, 0x3e, 0x01, 0xbe, 0x49, 0xed, 0x53, 0xea, 0x44, 0xf3, 0x80, 0x86, 0xcd,
0x6a, 0x34, 0x5f, 0x08, 0xde, 0x75, 0x42, 0xb3, 0x2a, 0xf0, 0x64, 0x3a, 0xd8, 0xde, 0x83, 0xcd, 0x95, 0xbb, 0x85, 0x7b, 0xcb, 0x8f, 0x56, 0xd5, 0x7c, 0x71, 0xf0, 0x8e, 0x1b, 0x59, 0x75, 0x86,
0xf4, 0x2e, 0x09, 0xa2, 0x12, 0xb3, 0x22, 0x88, 0x31, 0x6f, 0x8a, 0x9f, 0x62, 0x67, 0x5f, 0xda, 0x27, 0xd2, 0xe1, 0xf6, 0x2e, 0x6c, 0x66, 0x77, 0x89, 0x11, 0x15, 0x9b, 0x15, 0x46, 0x8c, 0x45,
0xe3, 0x19, 0x47, 0x2a, 0xac, 0x9a, 0x94, 0xf8, 0x7e, 0xf6, 0x93, 0x8c, 0xf1, 0xbb, 0x19, 0xa8, 0x8b, 0xfd, 0x64, 0x3b, 0xfb, 0xc2, 0x99, 0xcc, 0x29, 0xa7, 0xc2, 0xba, 0x85, 0x89, 0x1f, 0xe4,
0xd2, 0x28, 0x83, 0xa9, 0xe7, 0x06, 0x9c, 0xbd, 0x09, 0x35, 0x45, 0x0d, 0xdc, 0xf7, 0x3d, 0x5f, 0x3f, 0xcb, 0x99, 0xbf, 0x97, 0x83, 0x3a, 0x8e, 0x32, 0x9c, 0xf9, 0x5e, 0x48, 0xc9, 0xdb, 0xd0,
0x72, 0x4b, 0x45, 0x79, 0x6d, 0x01, 0x63, 0xdf, 0x86, 0xba, 0x42, 0x9a, 0xfa, 0xdc, 0x99, 0xd8, 0x90, 0xd4, 0x40, 0x83, 0xc0, 0x0f, 0x04, 0xb7, 0x94, 0x94, 0xd7, 0x61, 0x30, 0xf2, 0x5d, 0x30,
0xe7, 0xaa, 0x6a, 0x45, 0x4a, 0xc7, 0x12, 0xcc, 0x3e, 0x88, 0xeb, 0xf3, 0xbd, 0x59, 0xc8, 0x91, 0x24, 0xd2, 0x2c, 0xa0, 0xee, 0xd4, 0x39, 0x93, 0x55, 0x4b, 0x52, 0x3a, 0x12, 0x60, 0xf2, 0x51,
0xd6, 0x2b, 0x8f, 0xab, 0x72, 0x78, 0xa6, 0x80, 0x45, 0xb5, 0x63, 0xea, 0x15, 0xe8, 0xdc, 0xf8, 0x5c, 0x5f, 0xe0, 0xcf, 0x23, 0xca, 0x69, 0xbd, 0xf6, 0xa8, 0x2e, 0x86, 0x67, 0x31, 0x98, 0xaa,
0xad, 0x0c, 0x30, 0xd1, 0xed, 0x81, 0x47, 0x15, 0xc4, 0x1c, 0x29, 0x51, 0x32, 0xf3, 0xca, 0x3b, 0x9d, 0xa7, 0x5e, 0x83, 0xce, 0xcd, 0xdf, 0xca, 0x01, 0x61, 0xdd, 0x1e, 0xfa, 0x58, 0x41, 0xcc,
0x24, 0xfb, 0xa2, 0x1d, 0x62, 0x40, 0x81, 0xfa, 0x9e, 0x4f, 0xe9, 0x3b, 0x65, 0xfd, 0x38, 0x5f, 0x91, 0x12, 0x25, 0x73, 0xaf, 0xbd, 0x43, 0xf2, 0x2f, 0xdb, 0x21, 0x26, 0x94, 0xb0, 0xef, 0xc5,
0xca, 0xd5, 0xf3, 0xc6, 0x7f, 0xc9, 0xc1, 0xba, 0xa0, 0x53, 0x97, 0x8f, 0x9b, 0xc3, 0x21, 0x9f, 0x8c, 0xbe, 0x63, 0xd6, 0x4f, 0x8a, 0x95, 0x82, 0x51, 0x34, 0xff, 0x63, 0x01, 0xd6, 0x19, 0x9d,
0x46, 0x7b, 0xe7, 0x1e, 0x54, 0x5c, 0x6f, 0xc4, 0x15, 0xc5, 0x52, 0xc7, 0x40, 0x80, 0x34, 0x72, 0x7a, 0x74, 0xd2, 0x1a, 0x8d, 0xe8, 0x4c, 0xed, 0x9d, 0x3b, 0x50, 0xf3, 0xfc, 0x31, 0x95, 0x14,
0xbd, 0xb0, 0x1d, 0x97, 0x3a, 0x4e, 0x93, 0x59, 0x46, 0x08, 0x76, 0xfb, 0x6d, 0x58, 0x99, 0x72, 0x8b, 0x1d, 0x03, 0x06, 0xd2, 0xc8, 0xf5, 0xdc, 0x71, 0x3d, 0xec, 0x38, 0x4e, 0x66, 0x95, 0x43,
0x77, 0xa4, 0x6f, 0x91, 0x1c, 0x51, 0xbd, 0x04, 0xcb, 0xdd, 0x71, 0x0f, 0x2a, 0x67, 0x33, 0xc2, 0x78, 0xb7, 0xdf, 0x85, 0x95, 0x19, 0xf5, 0xc6, 0xfa, 0x16, 0x29, 0x20, 0xd5, 0x0b, 0xb0, 0xd8,
0x13, 0x8c, 0x25, 0x8f, 0x34, 0x00, 0x12, 0xd4, 0x24, 0xfe, 0x32, 0x9d, 0x05, 0x17, 0x98, 0x5b, 0x1d, 0x77, 0xa0, 0x76, 0x3a, 0x47, 0x3c, 0xc6, 0x58, 0x8a, 0x9c, 0x06, 0x40, 0x80, 0x5a, 0xc8,
0xc0, 0xdc, 0xa2, 0x48, 0x8b, 0xac, 0xbb, 0x00, 0xa3, 0x59, 0x10, 0xca, 0x1d, 0xb3, 0x84, 0x99, 0x5f, 0x66, 0xf3, 0xf0, 0x9c, 0xe7, 0x96, 0x78, 0x6e, 0x99, 0xa5, 0x59, 0xd6, 0x6d, 0x80, 0xf1,
0x65, 0x01, 0xa1, 0x1d, 0xf3, 0x1d, 0x58, 0x9b, 0xd8, 0x57, 0x16, 0xd2, 0x8e, 0xe5, 0xb8, 0xd6, 0x3c, 0x8c, 0xc4, 0x8e, 0x59, 0xe2, 0x99, 0x55, 0x06, 0xc1, 0x1d, 0xf3, 0x3d, 0x58, 0x9b, 0x3a,
0xd9, 0x18, 0x99, 0x7a, 0x11, 0xf1, 0xea, 0x13, 0xfb, 0xea, 0x73, 0x91, 0xd3, 0x71, 0xf7, 0x11, 0x97, 0x36, 0xa7, 0x1d, 0xdb, 0xf5, 0xec, 0xd3, 0x09, 0x67, 0xea, 0x65, 0x8e, 0x67, 0x4c, 0x9d,
0x2e, 0xd8, 0xca, 0x90, 0x66, 0xc2, 0xf2, 0x79, 0xc0, 0xfd, 0x4b, 0x8e, 0x9c, 0x20, 0x6f, 0x2e, 0xcb, 0x2f, 0x58, 0x4e, 0xd7, 0xdb, 0xe3, 0x70, 0xc6, 0x56, 0x46, 0x38, 0x13, 0x76, 0x40, 0x43,
0x4b, 0xb0, 0x49, 0x50, 0xd1, 0xa3, 0x89, 0x18, 0x77, 0x38, 0x1e, 0xd2, 0xb6, 0x37, 0x8b, 0x13, 0x1a, 0x5c, 0x50, 0xce, 0x09, 0x8a, 0xd6, 0xb2, 0x00, 0x5b, 0x08, 0x65, 0x3d, 0x9a, 0xb2, 0x71,
0xc7, 0x3d, 0x08, 0xc7, 0x43, 0x71, 0x5e, 0x09, 0x3e, 0x32, 0xe5, 0xbe, 0xf5, 0xec, 0x39, 0xee, 0x47, 0x93, 0x11, 0x6e, 0x7b, 0xab, 0x3c, 0x75, 0xbd, 0xfd, 0x68, 0x32, 0x62, 0xe7, 0x15, 0xe3,
0xe1, 0x3c, 0xf2, 0x8d, 0x63, 0xee, 0x3f, 0x7d, 0x2e, 0x44, 0x8a, 0x61, 0x80, 0x8c, 0xc8, 0xbe, 0x23, 0x33, 0x1a, 0xd8, 0xcf, 0x5f, 0xf0, 0x3d, 0x5c, 0xe4, 0x7c, 0xe3, 0x88, 0x06, 0xcf, 0x5e,
0x6e, 0x54, 0x70, 0x83, 0x97, 0x86, 0x81, 0x60, 0x41, 0xf6, 0xb5, 0xd8, 0x84, 0xa2, 0xb7, 0x36, 0x30, 0x91, 0x62, 0x14, 0x72, 0x46, 0xe4, 0x5c, 0x35, 0x6b, 0x7c, 0x83, 0x57, 0x46, 0x21, 0x63,
0xae, 0x02, 0x1f, 0x61, 0xf5, 0x01, 0x72, 0xd4, 0x1a, 0x76, 0xb6, 0x29, 0x33, 0x44, 0x3b, 0x81, 0x41, 0xce, 0x15, 0xdb, 0x84, 0xac, 0xb7, 0x0e, 0x5f, 0x05, 0x3a, 0xe6, 0xd5, 0x87, 0x9c, 0xa3,
0xa0, 0x7a, 0xd5, 0xd9, 0xb3, 0xb1, 0x7d, 0x1e, 0x20, 0x4b, 0xa9, 0x99, 0x55, 0x09, 0xdc, 0x17, 0x36, 0x78, 0x67, 0x5b, 0x22, 0x83, 0xb5, 0x13, 0x32, 0xaa, 0x97, 0x9d, 0x3d, 0x9d, 0x38, 0x67,
0x30, 0xe3, 0x0b, 0xd8, 0x98, 0x5b, 0x5b, 0xb9, 0x67, 0x84, 0x08, 0x81, 0x10, 0x5c, 0xd7, 0x92, 0x21, 0x67, 0x29, 0x0d, 0xab, 0x2e, 0x80, 0x7b, 0x0c, 0x66, 0x7e, 0x09, 0x1b, 0xa9, 0xb5, 0x15,
0x29, 0x53, 0x69, 0x8b, 0x96, 0x4d, 0x59, 0x34, 0xe3, 0xb7, 0x33, 0x50, 0x95, 0x35, 0xa3, 0xb0, 0x7b, 0x86, 0x89, 0x10, 0x1c, 0xc2, 0xd7, 0xb5, 0x62, 0x89, 0x54, 0xd6, 0xa2, 0xe5, 0x33, 0x16,
0xc3, 0x76, 0x80, 0xa9, 0x55, 0x0c, 0xaf, 0x9c, 0x91, 0x75, 0x7a, 0x1d, 0xf2, 0x80, 0x88, 0xe6, 0xcd, 0xfc, 0xed, 0x1c, 0xd4, 0x45, 0xcd, 0x5c, 0xd8, 0x21, 0x0f, 0x80, 0xc8, 0x55, 0x8c, 0x2e,
0xe0, 0x96, 0x59, 0x97, 0x79, 0x83, 0x2b, 0x67, 0xb4, 0x2b, 0x72, 0xd8, 0x43, 0xa8, 0x27, 0xf0, 0xdd, 0xb1, 0x7d, 0x72, 0x15, 0xd1, 0x10, 0x89, 0x66, 0xff, 0x86, 0x65, 0x88, 0xbc, 0xe1, 0xa5,
0x83, 0xd0, 0x27, 0x8a, 0x3e, 0xb8, 0x65, 0x2e, 0x6b, 0xd8, 0xfd, 0xd0, 0x17, 0x7b, 0x44, 0x88, 0x3b, 0xde, 0x61, 0x39, 0xe4, 0x3e, 0x18, 0x09, 0xfc, 0x30, 0x0a, 0x90, 0xa2, 0xf7, 0x6f, 0x58,
0x52, 0xb3, 0xd0, 0x72, 0xdc, 0x11, 0xbf, 0x42, 0x32, 0xaa, 0x99, 0x15, 0x82, 0x75, 0x04, 0x68, 0xcb, 0x1a, 0xf6, 0x20, 0x0a, 0xd8, 0x1e, 0x61, 0xa2, 0xd4, 0x3c, 0xb2, 0x5d, 0x6f, 0x4c, 0x2f,
0x77, 0x19, 0xaa, 0x7a, 0x75, 0xc6, 0x39, 0x94, 0x94, 0x1c, 0x86, 0x82, 0xc8, 0x5c, 0x97, 0xcc, 0x39, 0x19, 0x35, 0xac, 0x1a, 0xc2, 0xba, 0x0c, 0xb4, 0xb3, 0x0c, 0x75, 0xbd, 0x3a, 0xf3, 0x0c,
0x72, 0x18, 0xf5, 0xe4, 0x36, 0x94, 0x92, 0x3d, 0x30, 0x8b, 0xe1, 0x2b, 0x37, 0x6c, 0xfc, 0x00, 0x2a, 0x52, 0x0e, 0xe3, 0x82, 0x48, 0xaa, 0x4b, 0x56, 0x35, 0x52, 0x3d, 0xb9, 0x09, 0x95, 0x64,
0xea, 0x87, 0x82, 0x78, 0x5c, 0x41, 0xac, 0x52, 0xae, 0xdc, 0x84, 0x25, 0x6d, 0xd3, 0x94, 0x4d, 0x0f, 0xac, 0x72, 0xf4, 0xda, 0x0d, 0x9b, 0x3f, 0x04, 0xe3, 0x80, 0x11, 0x8f, 0xc7, 0x88, 0x55,
0x99, 0x12, 0x67, 0xee, 0x85, 0x17, 0x84, 0xb2, 0x15, 0xfc, 0x6d, 0xfc, 0x5e, 0x06, 0x58, 0x3b, 0xc8, 0x95, 0x9b, 0xb0, 0xa4, 0x6d, 0x9a, 0xaa, 0x25, 0x52, 0xec, 0xcc, 0x3d, 0xf7, 0xc3, 0x48,
0x08, 0x9d, 0x89, 0x1d, 0xf2, 0x7d, 0x1e, 0xb1, 0x85, 0x1e, 0x54, 0x45, 0x6d, 0x03, 0xaf, 0x49, 0xb4, 0xc2, 0x7f, 0x9b, 0xbf, 0x9f, 0x03, 0xd2, 0x09, 0x23, 0x77, 0xea, 0x44, 0x74, 0x8f, 0x2a,
0x82, 0x1e, 0x09, 0x14, 0xef, 0xca, 0x6d, 0xbc, 0x58, 0x60, 0x47, 0xc7, 0x26, 0x36, 0x9f, 0xa8, 0xb6, 0xd0, 0x87, 0x3a, 0xab, 0x6d, 0xe8, 0xb7, 0x50, 0xd0, 0x43, 0x81, 0xe2, 0x7d, 0xb1, 0x8d,
0x40, 0xec, 0xb2, 0xd0, 0xf6, 0xcf, 0x79, 0x88, 0xe2, 0xa1, 0x94, 0x6b, 0x80, 0x40, 0x42, 0x30, 0x17, 0x0b, 0x3c, 0xd0, 0xb1, 0x91, 0xcd, 0x27, 0x2a, 0x60, 0xbb, 0x2c, 0x72, 0x82, 0x33, 0x1a,
0xdc, 0xfe, 0x21, 0xac, 0x2e, 0xd4, 0xa1, 0xf3, 0xe5, 0x72, 0x0a, 0x5f, 0xce, 0xe9, 0x7c, 0xd9, 0x71, 0xf1, 0x50, 0xc8, 0x35, 0x80, 0x20, 0x26, 0x18, 0x6e, 0xff, 0x08, 0x56, 0x17, 0xea, 0xd0,
0x82, 0xb5, 0x44, 0xbf, 0x24, 0xa5, 0x6d, 0x41, 0x51, 0x6c, 0x08, 0x21, 0x1c, 0x64, 0x48, 0x5a, 0xf9, 0x72, 0x35, 0x83, 0x2f, 0x17, 0x74, 0xbe, 0x6c, 0xc3, 0x5a, 0xa2, 0x5f, 0x82, 0xd2, 0xb6,
0x3d, 0xe3, 0x5c, 0x88, 0xd7, 0xef, 0xc3, 0xfa, 0x19, 0xe7, 0xbe, 0x1d, 0x62, 0x26, 0xee, 0x18, 0xa0, 0xcc, 0x36, 0x04, 0x13, 0x0e, 0x72, 0x28, 0xad, 0x9e, 0x52, 0xca, 0xc4, 0xeb, 0x0f, 0x61,
0xb1, 0x42, 0xb2, 0xe2, 0x55, 0x99, 0xd7, 0xb7, 0xc3, 0x63, 0xee, 0x8b, 0x95, 0x32, 0xfe, 0x77, 0xfd, 0x94, 0xd2, 0xc0, 0x89, 0x78, 0x26, 0xdf, 0x31, 0x6c, 0x85, 0x44, 0xc5, 0xab, 0x22, 0x6f,
0x06, 0x56, 0x04, 0x07, 0x3d, 0xb2, 0xdd, 0x6b, 0x35, 0x4f, 0x87, 0xa9, 0xf3, 0xf4, 0x40, 0x3b, 0xe0, 0x44, 0x47, 0x34, 0x60, 0x2b, 0x65, 0xfe, 0xcf, 0x1c, 0xac, 0x30, 0x0e, 0x7a, 0xe8, 0x78,
0x0c, 0x35, 0xec, 0xaf, 0x3b, 0x49, 0xb9, 0xf9, 0x49, 0x62, 0xf7, 0xa1, 0x9a, 0xe8, 0x6b, 0x01, 0x57, 0x72, 0x9e, 0x0e, 0x32, 0xe7, 0xe9, 0x9e, 0x76, 0x18, 0x6a, 0xd8, 0xdf, 0x74, 0x92, 0x0a,
0xfb, 0x0a, 0x41, 0xd4, 0xc9, 0x58, 0x22, 0x5d, 0xd2, 0x24, 0xd2, 0x3f, 0xf9, 0xe4, 0xbe, 0x0d, 0xe9, 0x49, 0x22, 0x77, 0xa1, 0x9e, 0xe8, 0x6b, 0x89, 0xf7, 0x15, 0x42, 0xd5, 0xc9, 0x58, 0x22,
0xf5, 0x78, 0x30, 0x72, 0x66, 0x19, 0xe4, 0x05, 0xa1, 0xca, 0x0a, 0xf0, 0xb7, 0xf1, 0x4f, 0x32, 0x5d, 0xd2, 0x24, 0xd2, 0x3f, 0xfd, 0xe4, 0xbe, 0x0b, 0x46, 0x3c, 0x18, 0x31, 0xb3, 0x04, 0x8a,
0x84, 0xd8, 0xf2, 0x9c, 0x58, 0xea, 0x65, 0x90, 0x17, 0x52, 0xb6, 0x42, 0x14, 0xbf, 0x6f, 0xd4, 0x8c, 0x50, 0x45, 0x05, 0xfc, 0xb7, 0xf9, 0x8f, 0x72, 0x88, 0xd8, 0xf6, 0xdd, 0x58, 0xea, 0x25,
0x21, 0xbe, 0x81, 0x29, 0xb8, 0x0d, 0xa5, 0x40, 0x88, 0xd0, 0xf6, 0x98, 0x66, 0xa1, 0x64, 0x16, 0x50, 0x64, 0x52, 0xb6, 0x44, 0x64, 0xbf, 0xaf, 0xd5, 0x21, 0xbe, 0x85, 0x29, 0xb8, 0x09, 0x95,
0x45, 0xba, 0x39, 0x1e, 0xc7, 0xb3, 0x53, 0xd4, 0xe5, 0xf5, 0x77, 0x60, 0x55, 0xeb, 0xf3, 0x0b, 0x90, 0x89, 0xd0, 0xce, 0x04, 0x67, 0xa1, 0x62, 0x95, 0x59, 0xba, 0x35, 0x99, 0xc4, 0xb3, 0x53,
0x46, 0xd7, 0x05, 0x76, 0xe8, 0x04, 0xe1, 0x89, 0x1b, 0x4c, 0x35, 0x21, 0xef, 0x0e, 0x94, 0x05, 0xd6, 0xe5, 0xf5, 0xf7, 0x60, 0x55, 0xeb, 0xf3, 0x4b, 0x46, 0xd7, 0x03, 0x72, 0xe0, 0x86, 0xd1,
0x37, 0x16, 0xfd, 0x0d, 0xa4, 0x44, 0x2f, 0xd8, 0xb3, 0xe8, 0x6d, 0x80, 0x99, 0xf6, 0x95, 0xcc, 0xb1, 0x17, 0xce, 0x34, 0x21, 0xef, 0x16, 0x54, 0x19, 0x37, 0x66, 0xfd, 0x0d, 0x85, 0x44, 0xcf,
0xcc, 0xca, 0x4c, 0xfb, 0x0a, 0x33, 0x8d, 0x4f, 0x60, 0x2d, 0x51, 0x9f, 0x6c, 0xfa, 0x0d, 0x28, 0xd8, 0x33, 0xeb, 0x6d, 0xc8, 0x33, 0x9d, 0x4b, 0x91, 0x99, 0x17, 0x99, 0xce, 0x25, 0xcf, 0x34,
0xcc, 0xc2, 0x2b, 0x4f, 0x89, 0xf1, 0x15, 0x49, 0x4d, 0x42, 0x09, 0x35, 0x29, 0xc7, 0xf8, 0x0c, 0x3f, 0x83, 0xb5, 0x44, 0x7d, 0xa2, 0xe9, 0xb7, 0xa0, 0x34, 0x8f, 0x2e, 0x7d, 0x29, 0xc6, 0xd7,
0x56, 0xbb, 0xfc, 0xb9, 0xdc, 0xf0, 0xaa, 0x23, 0x6f, 0x43, 0xfe, 0x25, 0x8a, 0x29, 0xe6, 0x1b, 0x04, 0x35, 0x31, 0x25, 0xd4, 0xc2, 0x1c, 0xf3, 0x09, 0xac, 0xf6, 0xe8, 0x0b, 0xb1, 0xe1, 0x65,
0x3b, 0xc0, 0xf4, 0xc2, 0xb2, 0x55, 0x4d, 0x4f, 0xcd, 0x24, 0xf4, 0x54, 0xe3, 0x6d, 0x60, 0x7d, 0x47, 0xde, 0x85, 0xe2, 0x2b, 0x14, 0x53, 0x9e, 0x6f, 0x3e, 0x00, 0xa2, 0x17, 0x16, 0xad, 0x6a,
0xe7, 0xdc, 0x3d, 0xe2, 0x41, 0x60, 0x9f, 0x47, 0x2c, 0xa2, 0x0e, 0xb9, 0x49, 0x70, 0x2e, 0xf9, 0x7a, 0x6a, 0x2e, 0xa1, 0xa7, 0x9a, 0xef, 0x02, 0x19, 0xb8, 0x67, 0xde, 0x21, 0x0d, 0x43, 0xe7,
0x99, 0xf8, 0x69, 0x7c, 0x17, 0xd6, 0x12, 0x78, 0xb2, 0xe2, 0xd7, 0xa0, 0x1c, 0x38, 0xe7, 0x2e, 0x4c, 0xb1, 0x08, 0x03, 0x0a, 0xd3, 0xf0, 0x4c, 0xf0, 0x33, 0xf6, 0xd3, 0xfc, 0x3e, 0xac, 0x25,
0x0a, 0x61, 0xb2, 0xea, 0x18, 0x60, 0xec, 0xc3, 0xfa, 0xe7, 0xdc, 0x77, 0xce, 0xae, 0x5f, 0x56, 0xf0, 0x44, 0xc5, 0x6f, 0x40, 0x35, 0x74, 0xcf, 0x3c, 0x2e, 0x84, 0x89, 0xaa, 0x63, 0x80, 0xb9,
0x7d, 0xb2, 0x9e, 0xec, 0x7c, 0x3d, 0x6d, 0xd8, 0x98, 0xab, 0x47, 0x36, 0x4f, 0x44, 0x2d, 0x57, 0x07, 0xeb, 0x5f, 0xd0, 0xc0, 0x3d, 0xbd, 0x7a, 0x55, 0xf5, 0xc9, 0x7a, 0xf2, 0xe9, 0x7a, 0x3a,
0xb2, 0x64, 0x52, 0x42, 0xe3, 0x91, 0x59, 0x9d, 0x47, 0x1a, 0x27, 0xc0, 0x5a, 0x9e, 0xeb, 0xf2, 0xb0, 0x91, 0xaa, 0x47, 0x34, 0x8f, 0x44, 0x2d, 0x56, 0xb2, 0x62, 0x61, 0x42, 0xe3, 0x91, 0x79,
0x61, 0x78, 0xcc, 0xb9, 0xaf, 0x3a, 0xf3, 0xae, 0x46, 0xc1, 0x95, 0xc7, 0x5b, 0x72, 0x66, 0xe7, 0x9d, 0x47, 0x9a, 0xc7, 0x40, 0xda, 0xbe, 0xe7, 0xd1, 0x51, 0x74, 0x44, 0x69, 0x20, 0x3b, 0xf3,
0x19, 0xaf, 0x24, 0x6d, 0x06, 0xf9, 0x29, 0xf7, 0x27, 0x58, 0x71, 0xc9, 0xc4, 0xdf, 0xc6, 0x06, 0xbe, 0x46, 0xc1, 0xb5, 0x47, 0x5b, 0x62, 0x66, 0xd3, 0x8c, 0x57, 0x90, 0x36, 0x81, 0xe2, 0x8c,
0xac, 0x25, 0xaa, 0xa5, 0xbe, 0x19, 0x8f, 0x60, 0x63, 0xcf, 0x09, 0x86, 0x8b, 0x0d, 0x6e, 0x41, 0x06, 0x53, 0x5e, 0x71, 0xc5, 0xe2, 0xbf, 0xcd, 0x0d, 0x58, 0x4b, 0x54, 0x8b, 0x7d, 0x33, 0x1f,
0x71, 0x3a, 0x3b, 0xb5, 0x92, 0x3c, 0xfc, 0x29, 0xbf, 0x36, 0x1a, 0xb0, 0x39, 0x5f, 0x42, 0xd6, 0xc2, 0xc6, 0xae, 0x1b, 0x8e, 0x16, 0x1b, 0xdc, 0x82, 0xf2, 0x6c, 0x7e, 0x62, 0x27, 0x79, 0xf8,
0xf5, 0x1b, 0x19, 0xc8, 0x1f, 0x0c, 0x0e, 0x5b, 0x6c, 0x1b, 0x4a, 0x8e, 0x3b, 0xf4, 0x26, 0x42, 0x33, 0x7a, 0x65, 0x36, 0x61, 0x33, 0x5d, 0x42, 0xd4, 0xf5, 0x1b, 0x39, 0x28, 0xee, 0x0f, 0x0f,
0x48, 0xa3, 0x31, 0x47, 0xe9, 0x1b, 0xb7, 0xdd, 0x1d, 0x28, 0xa3, 0x6c, 0x27, 0xd4, 0x6b, 0x29, 0xda, 0x64, 0x1b, 0x2a, 0xae, 0x37, 0xf2, 0xa7, 0x4c, 0x48, 0xc3, 0x31, 0xab, 0xf4, 0xb5, 0xdb,
0x26, 0x95, 0x04, 0xe0, 0xd0, 0x1b, 0x3e, 0x13, 0x7a, 0x3d, 0xbf, 0x9a, 0x3a, 0x3e, 0x6a, 0xee, 0xee, 0x16, 0x54, 0xb9, 0x6c, 0xc7, 0xd4, 0x6b, 0x21, 0x26, 0x55, 0x18, 0xe0, 0xc0, 0x1f, 0x3d,
0x4a, 0x33, 0xcd, 0x93, 0x5c, 0x10, 0x67, 0x48, 0x05, 0xf5, 0x37, 0xb2, 0xc0, 0xe4, 0xc9, 0xdc, 0x67, 0x7a, 0x3d, 0xbd, 0x9c, 0xb9, 0x01, 0xd7, 0xdc, 0xa5, 0x66, 0x5a, 0x44, 0xb9, 0x20, 0xce,
0xf2, 0xdc, 0x20, 0xf4, 0x6d, 0xc7, 0x0d, 0x83, 0xa4, 0xe4, 0x91, 0x99, 0x93, 0x3c, 0x1e, 0x40, 0x10, 0x0a, 0xea, 0x6f, 0xe4, 0x81, 0x88, 0x93, 0xb9, 0xed, 0x7b, 0x61, 0x14, 0x38, 0xae, 0x17,
0x1d, 0x4f, 0x7b, 0x29, 0xf5, 0x20, 0xb3, 0xce, 0xc6, 0x92, 0x8f, 0x14, 0x7b, 0x04, 0xd3, 0x7e, 0x85, 0x49, 0xc9, 0x23, 0x97, 0x92, 0x3c, 0xee, 0x81, 0xc1, 0x4f, 0x7b, 0x21, 0xf5, 0x70, 0x66,
0x0b, 0x96, 0x63, 0x81, 0x2b, 0x32, 0x9b, 0xe4, 0xcd, 0x6a, 0x24, 0x74, 0x49, 0xd6, 0x2e, 0x36, 0x9d, 0x8f, 0x25, 0x1f, 0x21, 0xf6, 0x30, 0xa6, 0xfd, 0x0e, 0x2c, 0xc7, 0x02, 0x97, 0x32, 0x9b,
0x9d, 0x92, 0x24, 0x22, 0xed, 0x90, 0x64, 0xbb, 0xd5, 0x89, 0x7d, 0x75, 0xcc, 0x95, 0x78, 0x87, 0x14, 0xad, 0xba, 0x12, 0xba, 0x04, 0x6b, 0x67, 0x9b, 0x4e, 0x4a, 0x12, 0x4a, 0x3b, 0x44, 0xd9,
0x7a, 0xa2, 0x01, 0x35, 0x25, 0x50, 0x11, 0x26, 0xc9, 0x79, 0x15, 0x29, 0x55, 0x21, 0x4e, 0xba, 0x6e, 0x75, 0xea, 0x5c, 0x1e, 0x51, 0x29, 0xde, 0x71, 0x3d, 0xd1, 0x84, 0x86, 0x14, 0xa8, 0x10,
0x78, 0xb4, 0x94, 0x2e, 0x1e, 0x19, 0xff, 0xb1, 0x0c, 0x45, 0x39, 0x0d, 0x24, 0xec, 0x84, 0xce, 0x13, 0xe5, 0xbc, 0x9a, 0x90, 0xaa, 0x38, 0x4e, 0xb6, 0x78, 0xb4, 0x94, 0x2d, 0x1e, 0x99, 0xff,
0x25, 0x8f, 0x85, 0x1d, 0x91, 0x12, 0x22, 0x94, 0xcf, 0x27, 0x5e, 0x18, 0xc9, 0xb8, 0x44, 0x8a, 0xae, 0x0a, 0x65, 0x31, 0x0d, 0x28, 0xec, 0x44, 0xee, 0x05, 0x8d, 0x85, 0x1d, 0x96, 0x62, 0x22,
0x55, 0x02, 0x4a, 0x29, 0x57, 0x93, 0xb3, 0xc8, 0xda, 0x93, 0x23, 0xa4, 0xa1, 0x2e, 0xfd, 0xdc, 0x54, 0x40, 0xa7, 0x7e, 0xa4, 0x64, 0x5c, 0x24, 0xc5, 0x3a, 0x02, 0x85, 0x94, 0xab, 0xc9, 0x59,
0x81, 0xa2, 0x12, 0x97, 0xf2, 0x91, 0x1a, 0xb8, 0x34, 0x24, 0x01, 0x77, 0x1b, 0x4a, 0x43, 0x7b, 0x68, 0xed, 0x29, 0x20, 0xd2, 0x48, 0x97, 0x7e, 0x6e, 0x41, 0x59, 0x8a, 0x4b, 0x45, 0xa5, 0x06,
0x6a, 0x0f, 0x9d, 0xf0, 0x5a, 0x72, 0xcb, 0x28, 0x2d, 0x6a, 0x1f, 0x7b, 0x43, 0x7b, 0x6c, 0x9d, 0x2e, 0x8d, 0x50, 0xc0, 0xdd, 0x86, 0xca, 0xc8, 0x99, 0x39, 0x23, 0x37, 0xba, 0x12, 0xdc, 0x52,
0xda, 0x63, 0xdb, 0x1d, 0x72, 0x69, 0x46, 0xa9, 0x22, 0x70, 0x97, 0x60, 0xec, 0x5b, 0xb0, 0x2c, 0xa5, 0x59, 0xed, 0x13, 0x7f, 0xe4, 0x4c, 0xec, 0x13, 0x67, 0xe2, 0x78, 0x23, 0x2a, 0xcc, 0x28,
0xfb, 0xa9, 0xb0, 0xc8, 0x9a, 0x22, 0x7b, 0xaf, 0xd0, 0x84, 0x3c, 0xee, 0x4d, 0xc4, 0xba, 0x9c, 0x75, 0x0e, 0xdc, 0x41, 0x18, 0xf9, 0x0e, 0x2c, 0x8b, 0x7e, 0x4a, 0x2c, 0xb4, 0xa6, 0x88, 0xde,
0x71, 0x92, 0x5c, 0x73, 0x66, 0x99, 0x20, 0xfb, 0x1c, 0x47, 0x2b, 0xb3, 0x9f, 0x13, 0x05, 0x95, 0x4b, 0x34, 0x26, 0x8f, 0xfb, 0x53, 0xb6, 0x2e, 0xa7, 0x14, 0x25, 0xd7, 0x82, 0x55, 0x45, 0xc8,
0xa9, 0x29, 0x02, 0x7e, 0x41, 0xd6, 0x8f, 0x45, 0xf1, 0x35, 0xa7, 0x89, 0xaf, 0xef, 0xc2, 0xea, 0x1e, 0xe5, 0xa3, 0x15, 0xd9, 0x2f, 0x90, 0x82, 0xaa, 0xd8, 0x14, 0x02, 0xbf, 0x44, 0xeb, 0xc7,
0xcc, 0x0d, 0x78, 0x18, 0x8e, 0xf9, 0x28, 0xea, 0x4b, 0x05, 0x91, 0xea, 0x51, 0x86, 0xea, 0xce, 0xa2, 0xf8, 0x5a, 0xd0, 0xc4, 0xd7, 0xf7, 0x61, 0x75, 0xee, 0x85, 0x34, 0x8a, 0x26, 0x74, 0xac,
0x0e, 0xac, 0x91, 0xfd, 0x27, 0xb0, 0x43, 0x2f, 0xb8, 0x70, 0x02, 0x2b, 0x10, 0x4a, 0x25, 0x59, 0xfa, 0x52, 0xe3, 0x48, 0x86, 0xca, 0x90, 0xdd, 0x79, 0x00, 0x6b, 0x68, 0xff, 0x09, 0x9d, 0xc8,
0x08, 0x56, 0x31, 0xab, 0x2f, 0x73, 0xfa, 0xa4, 0x55, 0x6e, 0xcd, 0xe1, 0xfb, 0x7c, 0xc8, 0x9d, 0x0f, 0xcf, 0xdd, 0xd0, 0x0e, 0x99, 0x52, 0x89, 0x16, 0x82, 0x55, 0x9e, 0x35, 0x10, 0x39, 0x03,
0x4b, 0x3e, 0x42, 0xd1, 0x36, 0x67, 0x6e, 0x24, 0xca, 0x98, 0x32, 0x13, 0xf5, 0x94, 0xd9, 0xc4, 0xd4, 0x2a, 0xb7, 0x52, 0xf8, 0x01, 0x1d, 0x51, 0xf7, 0x82, 0x8e, 0xb9, 0x68, 0x5b, 0xb0, 0x36,
0x9a, 0x4d, 0x47, 0xb6, 0x90, 0xef, 0x96, 0x49, 0x7f, 0x70, 0x67, 0x93, 0x13, 0x82, 0xb0, 0x47, 0x12, 0x65, 0x2c, 0x91, 0xc9, 0xf5, 0x94, 0xf9, 0xd4, 0x9e, 0xcf, 0xc6, 0x0e, 0x93, 0xef, 0x96,
0xa0, 0x84, 0x57, 0x49, 0x33, 0x2b, 0x09, 0xb6, 0x2e, 0xf6, 0xac, 0x59, 0x95, 0x18, 0x24, 0x5b, 0x51, 0x7f, 0xf0, 0xe6, 0xd3, 0x63, 0x84, 0x90, 0x87, 0x20, 0x85, 0x57, 0x41, 0x33, 0x2b, 0x09,
0xdf, 0xd3, 0x37, 0x4b, 0x5d, 0x50, 0x18, 0xea, 0x59, 0xf1, 0x86, 0x69, 0x40, 0x71, 0xea, 0x3b, 0xb6, 0xce, 0xf6, 0xac, 0x55, 0x17, 0x18, 0x28, 0x5b, 0xdf, 0xd1, 0x37, 0x8b, 0xc1, 0x28, 0x8c,
0x97, 0x76, 0xc8, 0x1b, 0xab, 0x74, 0xc2, 0xc9, 0xa4, 0x60, 0x92, 0x8e, 0xeb, 0x84, 0x8e, 0x1d, 0xeb, 0x59, 0xf1, 0x86, 0x69, 0x42, 0x79, 0x16, 0xb8, 0x17, 0x4e, 0x44, 0x9b, 0xab, 0x78, 0xc2,
0x7a, 0x7e, 0x83, 0x61, 0x5e, 0x0c, 0x60, 0x0f, 0x61, 0x15, 0xe9, 0x24, 0x08, 0xed, 0x70, 0x16, 0x89, 0x24, 0x63, 0x92, 0xae, 0xe7, 0x46, 0xae, 0x13, 0xf9, 0x41, 0x93, 0xf0, 0xbc, 0x18, 0x40,
0x48, 0xc1, 0x7d, 0x0d, 0x09, 0x0a, 0x55, 0x8f, 0x3e, 0xc2, 0x51, 0x76, 0x67, 0x1f, 0xc3, 0x26, 0xee, 0xc3, 0x2a, 0xa7, 0x93, 0x30, 0x72, 0xa2, 0x79, 0x28, 0x04, 0xf7, 0x35, 0x4e, 0x50, 0x5c,
0x91, 0xc6, 0xc2, 0xd6, 0x5c, 0x17, 0xd3, 0x81, 0x3d, 0x5a, 0x43, 0x8c, 0x56, 0x72, 0x8f, 0x7e, 0xf5, 0x18, 0x70, 0x38, 0x97, 0xdd, 0xc9, 0xa7, 0xb0, 0x89, 0xa4, 0xb1, 0xb0, 0x35, 0xd7, 0xd9,
0x0a, 0x5b, 0x92, 0x5c, 0x16, 0x4a, 0x6e, 0x44, 0x25, 0xd7, 0x09, 0x65, 0xae, 0xe8, 0x0e, 0xac, 0x74, 0xf0, 0x1e, 0xad, 0x71, 0x8c, 0x76, 0x72, 0x8f, 0x7e, 0x0e, 0x5b, 0x82, 0x5c, 0x16, 0x4a,
0x8a, 0xae, 0x39, 0x43, 0x4b, 0xd6, 0x20, 0x76, 0xc5, 0xa6, 0x18, 0x05, 0x16, 0x5a, 0xa1, 0x4c, 0x6e, 0xa8, 0x92, 0xeb, 0x88, 0x92, 0x2a, 0xfa, 0x00, 0x56, 0x59, 0xd7, 0xdc, 0x91, 0x2d, 0x6a,
0x13, 0xf3, 0x9e, 0xf2, 0x6b, 0xf6, 0x03, 0x58, 0x21, 0xf2, 0x41, 0xed, 0x14, 0x0f, 0xbf, 0x6d, 0x60, 0xbb, 0x62, 0x93, 0x8d, 0x82, 0x17, 0x5a, 0xc1, 0x4c, 0x8b, 0xe7, 0x3d, 0xa3, 0x57, 0xe4,
0x3c, 0xfc, 0x36, 0xe4, 0xe4, 0xb6, 0xa2, 0x5c, 0x3c, 0xff, 0x96, 0x87, 0x89, 0xb4, 0xd8, 0x1a, 0x87, 0xb0, 0x82, 0xe4, 0xc3, 0xb5, 0x53, 0x7e, 0xf8, 0x6d, 0xf3, 0xc3, 0x6f, 0x43, 0x4c, 0x6e,
0x63, 0xe7, 0x8c, 0x87, 0xce, 0x84, 0x37, 0xb6, 0x88, 0xd8, 0x54, 0x5a, 0xec, 0xda, 0xd9, 0x14, 0x5b, 0xe5, 0xf2, 0xf3, 0x6f, 0x79, 0x94, 0x48, 0xb3, 0xad, 0x31, 0x71, 0x4f, 0x69, 0xe4, 0x4e,
0x73, 0x1a, 0xc4, 0x2a, 0x29, 0x85, 0x74, 0x3c, 0xf6, 0x02, 0xae, 0x2c, 0x87, 0x8d, 0xdb, 0x72, 0x69, 0x73, 0x0b, 0x89, 0x4d, 0xa6, 0xd9, 0xae, 0x9d, 0xcf, 0x78, 0x4e, 0x13, 0x59, 0x25, 0xa6,
0x43, 0x0a, 0xa0, 0x12, 0xc1, 0x85, 0x1e, 0x43, 0x3a, 0x63, 0x64, 0xdf, 0xbd, 0x83, 0x84, 0x51, 0x38, 0x1d, 0x4f, 0xfc, 0x90, 0x4a, 0xcb, 0x61, 0xf3, 0xa6, 0xd8, 0x90, 0x0c, 0x28, 0x45, 0x70,
0x23, 0xd5, 0x51, 0xd9, 0x78, 0x85, 0xb8, 0x73, 0x61, 0x3f, 0x57, 0x4c, 0xf5, 0x35, 0xe4, 0x26, 0xa6, 0xc7, 0xa0, 0xce, 0xa8, 0xec, 0xbb, 0xb7, 0x38, 0x61, 0x34, 0x50, 0x75, 0x94, 0x36, 0x5e,
0x20, 0x40, 0xd2, 0x1c, 0xb8, 0x0f, 0xab, 0x72, 0x15, 0x62, 0x66, 0xda, 0xb8, 0x8b, 0xc7, 0xd0, 0x26, 0xee, 0x9c, 0x3b, 0x2f, 0x24, 0x53, 0x7d, 0x83, 0x73, 0x13, 0x60, 0x20, 0x61, 0x0e, 0xdc,
0x6d, 0x35, 0xc6, 0x05, 0x6e, 0x6b, 0xd6, 0x69, 0x5d, 0x34, 0xfe, 0x7b, 0x00, 0x4c, 0x2d, 0x8a, 0x83, 0x55, 0xb1, 0x0a, 0x31, 0x33, 0x6d, 0xde, 0xe6, 0xc7, 0xd0, 0x4d, 0x39, 0xc6, 0x05, 0x6e,
0x56, 0xd1, 0xeb, 0x2f, 0xab, 0x68, 0x55, 0x2e, 0x53, 0x0c, 0x32, 0x7e, 0x96, 0x21, 0xa9, 0x45, 0x6b, 0x19, 0xb8, 0x2e, 0x1a, 0xff, 0xdd, 0x07, 0x22, 0x17, 0x45, 0xab, 0xe8, 0xcd, 0x57, 0x55,
0x62, 0x07, 0x9a, 0xbe, 0x4e, 0x7c, 0xcd, 0xf2, 0xdc, 0xf1, 0xb5, 0x64, 0x75, 0x40, 0xa0, 0x9e, 0xb4, 0x2a, 0x96, 0x29, 0x06, 0x99, 0xbf, 0x9b, 0x43, 0xa9, 0x45, 0x60, 0x87, 0x9a, 0xbe, 0x8e,
0x3b, 0x46, 0x5e, 0xe3, 0xb8, 0x3a, 0x0a, 0x1d, 0x90, 0x55, 0x05, 0x44, 0xa4, 0x7b, 0x50, 0x99, 0x7c, 0xcd, 0xf6, 0xbd, 0xc9, 0x95, 0x60, 0x75, 0x80, 0xa0, 0xbe, 0x37, 0xe1, 0xbc, 0xc6, 0xf5,
0xce, 0x4e, 0xc7, 0xce, 0x90, 0x50, 0x72, 0x54, 0x0b, 0x81, 0x10, 0xe1, 0x0d, 0xa8, 0x4a, 0x5a, 0x74, 0x14, 0x3c, 0x20, 0xeb, 0x12, 0xc8, 0x91, 0xee, 0x40, 0x6d, 0x36, 0x3f, 0x99, 0xb8, 0x23,
0x27, 0x8c, 0x3c, 0x62, 0x54, 0x24, 0x0c, 0x51, 0xf0, 0x00, 0xe6, 0x3e, 0x32, 0xbb, 0xaa, 0x89, 0x44, 0x29, 0x60, 0x2d, 0x08, 0xe2, 0x08, 0x6f, 0x41, 0x5d, 0xd0, 0x3a, 0x62, 0x14, 0x39, 0x46,
0xbf, 0x8d, 0x5d, 0x58, 0x4f, 0x76, 0x5a, 0x4a, 0x07, 0x0f, 0xa1, 0x24, 0x39, 0xa9, 0xb2, 0x64, 0x4d, 0xc0, 0x38, 0x0a, 0x3f, 0x80, 0x69, 0xc0, 0x99, 0x5d, 0xdd, 0xe2, 0xbf, 0xcd, 0x1d, 0x58,
0x2d, 0x27, 0x67, 0xc3, 0x8c, 0xf2, 0x8d, 0xff, 0x54, 0x80, 0x35, 0x35, 0x47, 0x62, 0xb1, 0xfb, 0x4f, 0x76, 0x5a, 0x48, 0x07, 0xf7, 0xa1, 0x22, 0x38, 0xa9, 0xb4, 0x64, 0x2d, 0x27, 0x67, 0xc3,
0xb3, 0xc9, 0xc4, 0xf6, 0x53, 0x58, 0x74, 0xe6, 0xc5, 0x2c, 0x3a, 0xbb, 0xc0, 0xa2, 0x93, 0xa6, 0x52, 0xf9, 0xe6, 0xbf, 0x2f, 0xc1, 0x9a, 0x9c, 0x23, 0xb6, 0xd8, 0x83, 0xf9, 0x74, 0xea, 0x04,
0x0c, 0xe2, 0xf0, 0x49, 0x53, 0x86, 0xa0, 0x2e, 0xd2, 0x2e, 0x75, 0x83, 0x79, 0x4d, 0x82, 0x07, 0x19, 0x2c, 0x3a, 0xf7, 0x72, 0x16, 0x9d, 0x5f, 0x60, 0xd1, 0x49, 0x53, 0x06, 0x72, 0xf8, 0xa4,
0x64, 0x98, 0x5f, 0x38, 0x50, 0x0a, 0x29, 0x07, 0x8a, 0x7e, 0x1c, 0x2c, 0xcd, 0x1d, 0x07, 0x6f, 0x29, 0x83, 0x51, 0x17, 0x6a, 0x97, 0xba, 0xc1, 0xbc, 0x21, 0xc0, 0x43, 0x34, 0xcc, 0x2f, 0x1c,
0x00, 0x91, 0xb1, 0xa2, 0xc7, 0x22, 0x29, 0x9c, 0x08, 0x93, 0x04, 0xf9, 0x0e, 0xac, 0xcc, 0x73, 0x28, 0xa5, 0x8c, 0x03, 0x45, 0x3f, 0x0e, 0x96, 0x52, 0xc7, 0xc1, 0x5b, 0x80, 0x64, 0x2c, 0xe9,
0x60, 0x62, 0xf5, 0xcb, 0x29, 0xfc, 0xd7, 0x99, 0x70, 0x14, 0x29, 0x34, 0xe4, 0xb2, 0xe4, 0xbf, 0xb1, 0x8c, 0x0a, 0x27, 0x87, 0x09, 0x82, 0x7c, 0x0f, 0x56, 0xd2, 0x1c, 0x18, 0x59, 0xfd, 0x72,
0xce, 0x84, 0x1f, 0x62, 0x8e, 0xc2, 0x6f, 0x03, 0x50, 0xdb, 0xb8, 0x8d, 0x01, 0xb7, 0xf1, 0xdb, 0x06, 0xff, 0x75, 0xa7, 0x94, 0x8b, 0x14, 0x1a, 0x72, 0x55, 0xf0, 0x5f, 0x77, 0x4a, 0x0f, 0x78,
0x73, 0x94, 0xa9, 0xcd, 0xfa, 0x8e, 0x48, 0xcc, 0x7c, 0x8e, 0xfb, 0xba, 0x8c, 0x25, 0x71, 0x4b, 0x8e, 0xc4, 0xef, 0x00, 0x60, 0xdb, 0x7c, 0x1b, 0x03, 0xdf, 0xc6, 0xef, 0xa6, 0x28, 0x53, 0x9b,
0x7f, 0x0c, 0xcb, 0xde, 0x94, 0xbb, 0x56, 0xcc, 0x05, 0x2b, 0x58, 0x55, 0x5d, 0x56, 0xd5, 0x51, 0xf5, 0x07, 0x2c, 0x31, 0x0f, 0x28, 0xdf, 0xd7, 0x55, 0x5e, 0x92, 0x6f, 0xe9, 0x4f, 0x61, 0xd9,
0x70, 0xb3, 0x26, 0xf0, 0xa2, 0x24, 0xfb, 0x94, 0x26, 0x99, 0x6b, 0x25, 0xab, 0x37, 0x94, 0x5c, 0x9f, 0x51, 0xcf, 0x8e, 0xb9, 0x60, 0x8d, 0x57, 0x65, 0x88, 0xaa, 0xba, 0x12, 0x6e, 0x35, 0x18,
0x46, 0xc4, 0xb8, 0xe8, 0x77, 0xa1, 0xe2, 0xf3, 0xc0, 0x1b, 0xcf, 0xc8, 0xfa, 0x5e, 0x43, 0x3a, 0x9e, 0x4a, 0x92, 0xcf, 0x71, 0x92, 0xa9, 0x56, 0xb2, 0x7e, 0x4d, 0xc9, 0x65, 0x8e, 0x18, 0x17,
0x52, 0xe6, 0x48, 0x33, 0xca, 0x31, 0x75, 0x2c, 0xe3, 0x37, 0x33, 0x50, 0xd1, 0xc6, 0xc0, 0x36, 0xfd, 0x3e, 0xd4, 0x02, 0x1a, 0xfa, 0x93, 0x39, 0x5a, 0xdf, 0x1b, 0x9c, 0x8e, 0xa4, 0x39, 0xd2,
0x60, 0xb5, 0xd5, 0xeb, 0x1d, 0xb7, 0xcd, 0xe6, 0xa0, 0xf3, 0x79, 0xdb, 0x6a, 0x1d, 0xf6, 0xfa, 0x52, 0x39, 0x96, 0x8e, 0x65, 0xfe, 0x66, 0x0e, 0x6a, 0xda, 0x18, 0xc8, 0x06, 0xac, 0xb6, 0xfb,
0xed, 0xfa, 0x2d, 0x01, 0x3e, 0xec, 0xb5, 0x9a, 0x87, 0xd6, 0x7e, 0xcf, 0x6c, 0x29, 0x70, 0x86, 0xfd, 0xa3, 0x8e, 0xd5, 0x1a, 0x76, 0xbf, 0xe8, 0xd8, 0xed, 0x83, 0xfe, 0xa0, 0x63, 0xdc, 0x60,
0x6d, 0x02, 0x33, 0xdb, 0x47, 0xbd, 0x41, 0x3b, 0x01, 0xcf, 0xb2, 0x3a, 0x54, 0x77, 0xcd, 0x76, 0xe0, 0x83, 0x7e, 0xbb, 0x75, 0x60, 0xef, 0xf5, 0xad, 0xb6, 0x04, 0xe7, 0xc8, 0x26, 0x10, 0xab,
0xb3, 0x75, 0x20, 0x21, 0x39, 0xb6, 0x0e, 0xf5, 0xfd, 0x93, 0xee, 0x5e, 0xa7, 0xfb, 0xc4, 0x6a, 0x73, 0xd8, 0x1f, 0x76, 0x12, 0xf0, 0x3c, 0x31, 0xa0, 0xbe, 0x63, 0x75, 0x5a, 0xed, 0x7d, 0x01,
0x35, 0xbb, 0xad, 0xf6, 0x61, 0x7b, 0xaf, 0x9e, 0x67, 0x35, 0x28, 0x37, 0x77, 0x9b, 0xdd, 0xbd, 0x29, 0x90, 0x75, 0x30, 0xf6, 0x8e, 0x7b, 0xbb, 0xdd, 0xde, 0x53, 0xbb, 0xdd, 0xea, 0xb5, 0x3b,
0x5e, 0xb7, 0xbd, 0x57, 0x2f, 0x18, 0xff, 0x23, 0x03, 0x10, 0x77, 0x54, 0xf0, 0xd5, 0xb8, 0xab, 0x07, 0x9d, 0x5d, 0xa3, 0x48, 0x1a, 0x50, 0x6d, 0xed, 0xb4, 0x7a, 0xbb, 0xfd, 0x5e, 0x67, 0xd7,
0xba, 0xb7, 0x6b, 0x63, 0x61, 0x50, 0xc4, 0x57, 0xfd, 0x44, 0x9a, 0x3d, 0x86, 0xa2, 0x37, 0x0b, 0x28, 0x99, 0xff, 0x35, 0x07, 0x10, 0x77, 0x94, 0xf1, 0xd5, 0xb8, 0xab, 0xba, 0xb7, 0x6b, 0x63,
0x87, 0xde, 0x84, 0x04, 0xf5, 0xe5, 0xc7, 0x8d, 0x85, 0x72, 0x3d, 0xca, 0x37, 0x15, 0x62, 0xc2, 0x61, 0x50, 0xc8, 0x57, 0x83, 0x44, 0x9a, 0x3c, 0x82, 0xb2, 0x3f, 0x8f, 0x46, 0xfe, 0x14, 0x05,
0xa3, 0x95, 0x7b, 0x99, 0x47, 0x2b, 0xe9, 0x3a, 0x23, 0xb9, 0x4e, 0x73, 0x9d, 0xdd, 0x05, 0x08, 0xf5, 0xe5, 0x47, 0xcd, 0x85, 0x72, 0x7d, 0xcc, 0xb7, 0x24, 0x62, 0xc2, 0xa3, 0x55, 0x78, 0x95,
0x9e, 0x73, 0x3e, 0x45, 0x63, 0x8c, 0xdc, 0x05, 0x65, 0x84, 0x0c, 0x84, 0x1e, 0xf7, 0x87, 0x19, 0x47, 0x2b, 0xe9, 0x3a, 0x43, 0xb9, 0x4e, 0x73, 0x9d, 0xdd, 0x06, 0x08, 0x5f, 0x50, 0x3a, 0xe3,
0xd8, 0x40, 0x5a, 0x1a, 0xcd, 0x33, 0xb1, 0xfb, 0x50, 0x19, 0x7a, 0xde, 0x54, 0xa8, 0xfe, 0xb1, 0xc6, 0x18, 0xb1, 0x0b, 0xaa, 0x1c, 0x32, 0x64, 0x7a, 0xdc, 0x1f, 0xe5, 0x60, 0x83, 0xd3, 0xd2,
0xbc, 0xa6, 0x83, 0x04, 0x83, 0x22, 0x86, 0x7c, 0xe6, 0xf9, 0x43, 0x2e, 0x79, 0x18, 0x20, 0x68, 0x38, 0xcd, 0xc4, 0xee, 0x42, 0x6d, 0xe4, 0xfb, 0x33, 0xa6, 0xfa, 0xc7, 0xf2, 0x9a, 0x0e, 0x62,
0x5f, 0x40, 0xc4, 0x1e, 0x92, 0x9b, 0x90, 0x30, 0x88, 0x85, 0x55, 0x08, 0x46, 0x28, 0x9b, 0xb0, 0x0c, 0x0a, 0x19, 0xf2, 0xa9, 0x1f, 0x8c, 0xa8, 0xe0, 0x61, 0xc0, 0x41, 0x7b, 0x0c, 0xc2, 0xf6,
0x74, 0xea, 0x73, 0x7b, 0x78, 0x21, 0xb9, 0x97, 0x4c, 0xb1, 0x6f, 0xc7, 0x46, 0xa9, 0xa1, 0xd8, 0x90, 0xd8, 0x84, 0x88, 0x81, 0x2c, 0xac, 0x86, 0x30, 0x44, 0xd9, 0x84, 0xa5, 0x93, 0x80, 0x3a,
0x13, 0x63, 0x4e, 0x9d, 0x2f, 0x99, 0x2b, 0x12, 0xde, 0x92, 0x60, 0x71, 0xce, 0xdb, 0xa7, 0xb6, 0xa3, 0x73, 0xc1, 0xbd, 0x44, 0x8a, 0x7c, 0x37, 0x36, 0x4a, 0x8d, 0xd8, 0x9e, 0x98, 0x50, 0xec,
0x3b, 0xf2, 0x5c, 0x3e, 0x92, 0x5a, 0x6e, 0x0c, 0x30, 0x8e, 0x61, 0x73, 0x7e, 0x7c, 0x92, 0xdf, 0x7c, 0xc5, 0x5a, 0x11, 0xf0, 0xb6, 0x00, 0xb3, 0x73, 0xde, 0x39, 0x71, 0xbc, 0xb1, 0xef, 0xd1,
0x7d, 0xa4, 0xf1, 0x3b, 0x52, 0x2f, 0xb7, 0x6f, 0xde, 0x63, 0x1a, 0xef, 0xfb, 0x4b, 0x79, 0xc8, 0xb1, 0xd0, 0x72, 0x63, 0x80, 0x79, 0x04, 0x9b, 0xe9, 0xf1, 0x09, 0x7e, 0xf7, 0x89, 0xc6, 0xef,
0x0b, 0x75, 0xe3, 0x46, 0xcd, 0x44, 0xd7, 0x1f, 0x73, 0x0b, 0x7e, 0x4e, 0xb4, 0x7d, 0x91, 0x00, 0x50, 0xbd, 0xdc, 0xbe, 0x7e, 0x8f, 0x69, 0xbc, 0xef, 0x2f, 0x14, 0xa1, 0xc8, 0xd4, 0x8d, 0x6b,
0x26, 0x17, 0x0b, 0x21, 0x28, 0x78, 0x45, 0xd9, 0x3e, 0x1f, 0x5e, 0x4a, 0xc9, 0x9b, 0xb2, 0x4d, 0x35, 0x13, 0x5d, 0x7f, 0x2c, 0x2c, 0xf8, 0x39, 0xb9, 0xed, 0x0b, 0x05, 0x30, 0xb1, 0x58, 0x1c,
0x3e, 0xbc, 0x44, 0x75, 0xde, 0x0e, 0xa9, 0x2c, 0xf1, 0xab, 0x62, 0x60, 0x87, 0x58, 0x52, 0x66, 0xc2, 0x05, 0x2f, 0x95, 0x1d, 0xd0, 0xd1, 0x85, 0x90, 0xbc, 0x31, 0xdb, 0xa2, 0xa3, 0x0b, 0xae,
0x61, 0xb9, 0x62, 0x94, 0x85, 0xa5, 0x1a, 0x50, 0x74, 0xdc, 0x53, 0x6f, 0xe6, 0x8e, 0x90, 0x3d, 0xce, 0x3b, 0x11, 0x96, 0x45, 0x7e, 0x55, 0x0e, 0x9d, 0x88, 0x97, 0x14, 0x59, 0xbc, 0x5c, 0x59,
0x95, 0x4c, 0x95, 0x44, 0xb7, 0x2a, 0x72, 0x52, 0x71, 0xb4, 0x13, 0x37, 0x2a, 0x09, 0xc0, 0x40, 0x65, 0xf1, 0x52, 0x4d, 0x28, 0xbb, 0xde, 0x89, 0x3f, 0xf7, 0xc6, 0x9c, 0x3d, 0x55, 0x2c, 0x99,
0x1c, 0xee, 0x1f, 0x40, 0x39, 0xb8, 0x76, 0x87, 0x3a, 0x0f, 0x5a, 0x97, 0xf3, 0x23, 0x46, 0xbf, 0xe4, 0x6e, 0x55, 0xce, 0x49, 0xd9, 0xd1, 0x8e, 0xdc, 0xa8, 0xc2, 0x00, 0x43, 0x76, 0xb8, 0x7f,
0xd3, 0xbf, 0x76, 0x87, 0x48, 0xf1, 0xa5, 0x40, 0xfe, 0x62, 0x1f, 0x42, 0x29, 0x72, 0x44, 0xd0, 0x04, 0xd5, 0xf0, 0xca, 0x1b, 0xe9, 0x3c, 0x68, 0x5d, 0xcc, 0x0f, 0x1b, 0xfd, 0x83, 0xc1, 0x95,
0x09, 0x72, 0x5b, 0x2f, 0xa1, 0xbc, 0x0f, 0x64, 0xef, 0x89, 0x50, 0xd9, 0xfb, 0xb0, 0x84, 0xde, 0x37, 0xe2, 0x14, 0x5f, 0x09, 0xc5, 0x2f, 0xf2, 0x18, 0x2a, 0xca, 0x11, 0x81, 0x27, 0xc8, 0x4d,
0x82, 0xa0, 0x51, 0xc5, 0x42, 0x4a, 0xa9, 0x14, 0xdd, 0x40, 0x8f, 0x26, 0x1f, 0xa1, 0xe7, 0xc0, 0xbd, 0x84, 0xf4, 0x3e, 0xa0, 0xbd, 0x47, 0xa1, 0x92, 0x0f, 0x61, 0x89, 0x7b, 0x0b, 0xc2, 0x66,
0x94, 0x68, 0xdb, 0x4f, 0xa1, 0x96, 0xa8, 0x4b, 0xb7, 0xdf, 0xd4, 0xc8, 0x7e, 0xf3, 0x96, 0x6e, 0x9d, 0x17, 0x92, 0x4a, 0x25, 0xeb, 0x06, 0xf7, 0x68, 0xd2, 0x31, 0xf7, 0x1c, 0x58, 0x02, 0x6d,
0xbf, 0x89, 0x4f, 0x32, 0x59, 0x4c, 0xb7, 0xe7, 0xfc, 0x10, 0x4a, 0x6a, 0x28, 0x82, 0x65, 0x9c, 0xfb, 0x19, 0x34, 0x12, 0x75, 0xe9, 0xf6, 0x9b, 0x06, 0xda, 0x6f, 0xde, 0xd1, 0xed, 0x37, 0xf1,
0x74, 0x9f, 0x76, 0x7b, 0x5f, 0x74, 0xad, 0xfe, 0x97, 0xdd, 0x56, 0xfd, 0x16, 0x5b, 0x81, 0x4a, 0x49, 0x26, 0x8a, 0xe9, 0xf6, 0x9c, 0x1f, 0x41, 0x45, 0x0e, 0x85, 0xb1, 0x8c, 0xe3, 0xde, 0xb3,
0xb3, 0x85, 0x5c, 0x08, 0x01, 0x19, 0x81, 0x72, 0xdc, 0xec, 0xf7, 0x23, 0x48, 0xd6, 0xd8, 0x87, 0x5e, 0xff, 0xcb, 0x9e, 0x3d, 0xf8, 0xaa, 0xd7, 0x36, 0x6e, 0x90, 0x15, 0xa8, 0xb5, 0xda, 0x9c,
0xfa, 0x7c, 0x4f, 0x05, 0x4d, 0x86, 0x0a, 0x26, 0x7d, 0x29, 0x31, 0x40, 0xe8, 0xe1, 0xe4, 0x1e, 0x0b, 0x71, 0x40, 0x8e, 0xa1, 0x1c, 0xb5, 0x06, 0x03, 0x05, 0xc9, 0x9b, 0x7b, 0x60, 0xa4, 0x7b,
0x21, 0x2d, 0x87, 0x12, 0xc6, 0x87, 0x50, 0x17, 0xe7, 0xb2, 0x98, 0x2a, 0xdd, 0x4b, 0x3a, 0x16, 0xca, 0x68, 0x32, 0x92, 0x30, 0xe1, 0x4b, 0x89, 0x01, 0x4c, 0x0f, 0x47, 0xf7, 0x08, 0x6a, 0x39,
0x92, 0xb3, 0xee, 0x4f, 0x29, 0x99, 0x15, 0x82, 0x61, 0x53, 0xc6, 0x47, 0xb0, 0xaa, 0x15, 0x8b, 0x98, 0x30, 0x1f, 0x83, 0xc1, 0xce, 0x65, 0x36, 0x55, 0xba, 0x97, 0x74, 0xc2, 0x24, 0x67, 0xdd,
0xed, 0x26, 0xe2, 0xac, 0x9f, 0xb7, 0x9b, 0xa0, 0x96, 0x4c, 0x39, 0xc6, 0x16, 0x6c, 0x88, 0x64, 0x9f, 0x52, 0xb1, 0x6a, 0x08, 0xe3, 0x4d, 0x99, 0x9f, 0xc0, 0xaa, 0x56, 0x2c, 0xb6, 0x9b, 0xb0,
0xfb, 0x92, 0xbb, 0x61, 0x7f, 0x76, 0x4a, 0xce, 0x75, 0xc7, 0x73, 0x85, 0xf6, 0x5c, 0x8e, 0x72, 0xb3, 0x3e, 0x6d, 0x37, 0xe1, 0x5a, 0x32, 0xe6, 0x98, 0x5b, 0xb0, 0xc1, 0x92, 0x9d, 0x0b, 0xea,
0x6e, 0x26, 0xf2, 0x1d, 0x69, 0x62, 0x21, 0xae, 0xb6, 0xad, 0xb5, 0x80, 0x05, 0x77, 0xf0, 0x6f, 0x45, 0x83, 0xf9, 0x09, 0x3a, 0xd7, 0x5d, 0xdf, 0x63, 0xda, 0x73, 0x55, 0xe5, 0x5c, 0x4f, 0xe4,
0xc2, 0xd4, 0x52, 0x8e, 0x40, 0x62, 0x5a, 0x8f, 0xdb, 0x6d, 0xd3, 0xea, 0x75, 0x0f, 0x3b, 0x5d, 0x0f, 0x84, 0x89, 0x05, 0xb9, 0xda, 0xb6, 0xd6, 0x02, 0x2f, 0xf8, 0x80, 0xff, 0x4d, 0x98, 0x5a,
0xc1, 0xdb, 0xc5, 0xb4, 0x22, 0x60, 0x7f, 0x1f, 0x21, 0x19, 0xa3, 0x0e, 0xcb, 0x4f, 0x78, 0xd8, 0xaa, 0x0a, 0xc4, 0xa6, 0xf5, 0xa8, 0xd3, 0xb1, 0xec, 0x7e, 0xef, 0xa0, 0xdb, 0x63, 0xbc, 0x9d,
0x71, 0xcf, 0x3c, 0x39, 0x19, 0xc6, 0x9f, 0x5f, 0x82, 0x95, 0x08, 0x14, 0x9b, 0x6a, 0x2e, 0xb9, 0x4d, 0x2b, 0x07, 0xec, 0xed, 0x71, 0x48, 0xce, 0x34, 0x60, 0xf9, 0x29, 0x8d, 0xba, 0xde, 0xa9,
0x1f, 0x38, 0x9e, 0x8b, 0xea, 0x46, 0xd9, 0x54, 0x49, 0xc1, 0x9d, 0xa4, 0x92, 0x85, 0x52, 0xc2, 0x2f, 0x26, 0xc3, 0xfc, 0xb3, 0x4b, 0xb0, 0xa2, 0x40, 0xb1, 0xa9, 0xe6, 0x82, 0x06, 0xa1, 0xeb,
0x3a, 0xe6, 0x4a, 0xb5, 0x0c, 0x45, 0x84, 0x77, 0x60, 0xc5, 0x19, 0x71, 0x37, 0x74, 0xc2, 0x6b, 0x7b, 0x5c, 0xdd, 0xa8, 0x5a, 0x32, 0xc9, 0xb8, 0x93, 0x50, 0xb2, 0xb8, 0x94, 0xb0, 0xce, 0x73,
0x2b, 0x61, 0x24, 0x5e, 0x56, 0x60, 0x29, 0x26, 0xac, 0x43, 0xc1, 0x1e, 0x3b, 0xb6, 0x0a, 0x5a, 0x85, 0x5a, 0xc6, 0x45, 0x84, 0xf7, 0x60, 0xc5, 0x1d, 0x53, 0x2f, 0x72, 0xa3, 0x2b, 0x3b, 0x61,
0xa0, 0x84, 0x80, 0x0e, 0xbd, 0xb1, 0xe7, 0xa3, 0xda, 0x51, 0x36, 0x29, 0xc1, 0x1e, 0xc1, 0xba, 0x24, 0x5e, 0x96, 0x60, 0x21, 0x26, 0xac, 0x43, 0xc9, 0x99, 0xb8, 0x8e, 0x0c, 0x5a, 0xc0, 0x04,
0x50, 0x81, 0x74, 0xcb, 0x3d, 0x32, 0x18, 0xb2, 0x57, 0x33, 0x77, 0x36, 0x39, 0x8e, 0xad, 0xf7, 0x83, 0x8e, 0xfc, 0x89, 0x1f, 0x70, 0xb5, 0xa3, 0x6a, 0x61, 0x82, 0x3c, 0x84, 0x75, 0xa6, 0x02,
0x22, 0x47, 0x08, 0x07, 0xa2, 0x84, 0x94, 0x06, 0xa3, 0x02, 0x64, 0x54, 0x58, 0x75, 0x67, 0x93, 0xe9, 0x96, 0x7b, 0xce, 0x60, 0xd0, 0x5e, 0x4d, 0xbc, 0xf9, 0xf4, 0x28, 0xb6, 0xde, 0xb3, 0x1c,
0x26, 0xe6, 0x44, 0xf8, 0x8f, 0x61, 0x43, 0xe0, 0x47, 0xf2, 0x63, 0x54, 0x62, 0x05, 0x4b, 0x88, 0x26, 0x1c, 0xb0, 0x12, 0x42, 0x1a, 0x54, 0x05, 0xd0, 0xa8, 0xb0, 0xea, 0xcd, 0xa7, 0x2d, 0x9e,
0xca, 0x3a, 0x32, 0x2f, 0x2a, 0x73, 0x07, 0xca, 0xd4, 0x2b, 0x41, 0x12, 0x05, 0x32, 0x39, 0x60, 0xa3, 0xf0, 0x1f, 0xc1, 0x06, 0xc3, 0x57, 0xf2, 0xa3, 0x2a, 0xb1, 0xc2, 0x4b, 0xb0, 0xca, 0xba,
0x57, 0xb8, 0x1f, 0x2c, 0xc4, 0x17, 0x90, 0x1e, 0x3f, 0x1f, 0x5f, 0xa0, 0x45, 0x28, 0x94, 0xe6, 0x22, 0x4f, 0x95, 0xb9, 0x05, 0x55, 0xec, 0x15, 0x23, 0x89, 0x12, 0x9a, 0x1c, 0x78, 0x57, 0x68,
0x23, 0x14, 0x1e, 0xc3, 0xc6, 0xa9, 0xa0, 0xd1, 0x0b, 0x6e, 0x8f, 0xb8, 0x6f, 0xc5, 0x94, 0x4f, 0x10, 0x2e, 0xc4, 0x17, 0xa0, 0x1e, 0x9f, 0x8e, 0x2f, 0xd0, 0x22, 0x14, 0x2a, 0xe9, 0x08, 0x85,
0xda, 0xe2, 0x9a, 0xc8, 0x3c, 0xc0, 0xbc, 0x68, 0xa3, 0x08, 0x41, 0x4e, 0xf0, 0x0d, 0x3e, 0xb2, 0x47, 0xb0, 0x71, 0xc2, 0x68, 0xf4, 0x9c, 0x3a, 0x63, 0x1a, 0xd8, 0x31, 0xe5, 0xa3, 0xb6, 0xb8,
0x42, 0xcf, 0x42, 0xf9, 0x0e, 0x39, 0x50, 0xc9, 0xac, 0x11, 0x78, 0xe0, 0xb5, 0x04, 0x30, 0x89, 0xc6, 0x32, 0xf7, 0x79, 0x9e, 0xda, 0x28, 0x4c, 0x90, 0x63, 0x7c, 0x83, 0x8e, 0xed, 0xc8, 0xb7,
0x77, 0xee, 0xdb, 0xd3, 0x0b, 0xa9, 0xcb, 0x45, 0x78, 0x4f, 0x04, 0x90, 0xbd, 0x06, 0x45, 0xb1, 0xb9, 0x7c, 0xc7, 0x39, 0x50, 0xc5, 0x6a, 0x20, 0x78, 0xe8, 0xb7, 0x19, 0x30, 0x89, 0x77, 0x16,
0x27, 0x5c, 0x4e, 0xee, 0x5a, 0xd2, 0x92, 0x14, 0x88, 0xbd, 0x05, 0x4b, 0xd8, 0x46, 0xd0, 0xa8, 0x38, 0xb3, 0x73, 0xa1, 0xcb, 0x29, 0xbc, 0xa7, 0x0c, 0x48, 0xde, 0x80, 0x32, 0xdb, 0x13, 0x1e,
0xe3, 0x86, 0xa8, 0xc6, 0x9c, 0xde, 0x71, 0x4d, 0x99, 0x27, 0xa4, 0xe5, 0x99, 0xef, 0x10, 0x1b, 0x45, 0x77, 0x2d, 0x6a, 0x49, 0x12, 0x44, 0xde, 0x81, 0x25, 0xde, 0x46, 0xd8, 0x34, 0xf8, 0x86,
0x2a, 0x9b, 0xf8, 0x9b, 0xfd, 0x48, 0xe3, 0x69, 0x6b, 0x58, 0xf6, 0x2d, 0x59, 0x76, 0x8e, 0x14, 0xa8, 0xc7, 0x9c, 0xde, 0xf5, 0x2c, 0x91, 0xc7, 0xa4, 0xe5, 0x79, 0xe0, 0x22, 0x1b, 0xaa, 0x5a,
0x6f, 0x62, 0x6f, 0xdf, 0x28, 0xb7, 0xfa, 0x71, 0xbe, 0x54, 0xa9, 0x57, 0x8d, 0x06, 0x86, 0x55, 0xfc, 0x37, 0xf9, 0xb1, 0xc6, 0xd3, 0xd6, 0x78, 0xd9, 0x77, 0x44, 0xd9, 0x14, 0x29, 0x5e, 0xc7,
0x98, 0x7c, 0xe8, 0x5d, 0x72, 0xff, 0x3a, 0xb1, 0x47, 0x32, 0xb0, 0xb5, 0x90, 0x15, 0x7b, 0x67, 0xde, 0xbe, 0x55, 0x6e, 0xf5, 0x93, 0x62, 0xa5, 0x66, 0xd4, 0xcd, 0x26, 0x0f, 0xab, 0xb0, 0xe8,
0x7d, 0x09, 0xb7, 0x26, 0xde, 0x48, 0x9d, 0xe9, 0x55, 0x05, 0x3c, 0xf2, 0x46, 0x42, 0xf6, 0x58, 0xc8, 0xbf, 0xa0, 0xc1, 0x55, 0x62, 0x8f, 0xe4, 0x60, 0x6b, 0x21, 0x2b, 0xf6, 0xce, 0x06, 0x02,
0x8d, 0x90, 0xce, 0x1c, 0xd7, 0x09, 0x2e, 0xf8, 0x48, 0x1e, 0xed, 0x75, 0x95, 0xb1, 0x2f, 0xe1, 0x6e, 0x4f, 0xfd, 0xb1, 0x3c, 0xd3, 0xeb, 0x12, 0x78, 0xe8, 0x8f, 0x99, 0xec, 0xb1, 0xaa, 0x90,
0x42, 0x80, 0x9e, 0xfa, 0xde, 0x79, 0x74, 0xd2, 0x65, 0xcc, 0x28, 0x6d, 0x7c, 0x0c, 0x05, 0x5a, 0x4e, 0x5d, 0xcf, 0x0d, 0xcf, 0xe9, 0x58, 0x1c, 0xed, 0x86, 0xcc, 0xd8, 0x13, 0x70, 0x26, 0x40,
0x41, 0xb1, 0x51, 0x70, 0x7d, 0x33, 0x72, 0xa3, 0x20, 0xb4, 0x01, 0x45, 0x97, 0x87, 0xcf, 0x3d, 0xcf, 0x02, 0xff, 0x4c, 0x9d, 0x74, 0x39, 0x4b, 0xa5, 0xcd, 0x4f, 0xa1, 0x84, 0x2b, 0xc8, 0x36,
0xff, 0x99, 0x72, 0xf5, 0xc8, 0xa4, 0xf1, 0x53, 0xb4, 0x3b, 0x46, 0xf1, 0x31, 0x64, 0x3b, 0x10, 0x0a, 0x5f, 0xdf, 0x9c, 0xd8, 0x28, 0x1c, 0xda, 0x84, 0xb2, 0x47, 0xa3, 0x17, 0x7e, 0xf0, 0x5c,
0x24, 0x4c, 0x24, 0x18, 0x5c, 0xd8, 0xd2, 0x14, 0x5a, 0x42, 0x40, 0xff, 0xc2, 0x5e, 0x20, 0xe1, 0xba, 0x7a, 0x44, 0xd2, 0xfc, 0x19, 0xb7, 0x3b, 0xaa, 0xf8, 0x18, 0xb4, 0x1d, 0x30, 0x12, 0x46,
0xec, 0x62, 0x88, 0xcc, 0x5b, 0xb0, 0xac, 0x22, 0x72, 0x02, 0x6b, 0xcc, 0xcf, 0x42, 0xb9, 0x25, 0x12, 0x0c, 0xcf, 0x1d, 0x61, 0x0a, 0xad, 0x70, 0xc0, 0xe0, 0xdc, 0x59, 0x20, 0xe1, 0xfc, 0x62,
0xab, 0x32, 0x1c, 0x27, 0x38, 0xe4, 0x67, 0xa1, 0x71, 0x04, 0xab, 0x72, 0xd3, 0xf4, 0xa6, 0x5c, 0x88, 0xcc, 0x3b, 0xb0, 0x2c, 0x23, 0x72, 0x42, 0x7b, 0x42, 0x4f, 0x23, 0xb1, 0x25, 0xeb, 0x22,
0x35, 0xfd, 0x49, 0x9a, 0x52, 0x53, 0x79, 0xbc, 0x96, 0x94, 0x16, 0x48, 0x2e, 0x4b, 0x68, 0x3a, 0x1c, 0x27, 0x3c, 0xa0, 0xa7, 0x91, 0x79, 0x08, 0xab, 0x62, 0xd3, 0xf4, 0x67, 0x54, 0x36, 0xfd,
0xc6, 0x4f, 0x62, 0x03, 0xa0, 0x90, 0x25, 0x64, 0x7d, 0x52, 0xb5, 0x50, 0x1e, 0x32, 0xe5, 0x68, 0x59, 0x96, 0x52, 0x53, 0x7b, 0xb4, 0x96, 0x94, 0x16, 0x50, 0x2e, 0x4b, 0x68, 0x3a, 0xe6, 0x4f,
0x8e, 0x14, 0x18, 0x67, 0x24, 0x66, 0x27, 0x98, 0x0d, 0x87, 0x2a, 0x52, 0xaa, 0x64, 0xaa, 0xa4, 0x63, 0x03, 0x20, 0x93, 0x25, 0x44, 0x7d, 0x42, 0xb5, 0x90, 0x1e, 0x32, 0xe9, 0x68, 0x56, 0x0a,
0xf1, 0xef, 0x33, 0xb0, 0x86, 0x95, 0x29, 0xa5, 0x4c, 0x9e, 0x14, 0x3f, 0x77, 0x27, 0xc5, 0xfa, 0x8c, 0x3b, 0x66, 0xb3, 0x13, 0xce, 0x47, 0x23, 0x19, 0x29, 0x55, 0xb1, 0x64, 0xd2, 0xfc, 0x37,
0xe8, 0x02, 0x1c, 0x25, 0xbe, 0xbe, 0xf7, 0x21, 0xbf, 0xe0, 0x7d, 0xf8, 0x36, 0xd4, 0x47, 0x7c, 0x39, 0x58, 0xe3, 0x95, 0x49, 0xa5, 0x4c, 0x9c, 0x14, 0x3f, 0x77, 0x27, 0xd9, 0xfa, 0xe8, 0x02,
0xec, 0x20, 0x29, 0x29, 0x79, 0x88, 0x04, 0xd0, 0x15, 0x05, 0x97, 0x46, 0x02, 0xe3, 0xaf, 0x65, 0x1c, 0x26, 0xbe, 0xb9, 0xf7, 0xa1, 0xb8, 0xe0, 0x7d, 0xf8, 0x2e, 0x18, 0x63, 0x3a, 0x71, 0x39,
0x60, 0x95, 0xc4, 0x2d, 0x34, 0xbb, 0xc8, 0x89, 0xfa, 0x4c, 0xd9, 0x17, 0x24, 0x3b, 0x95, 0x63, 0x29, 0x49, 0x79, 0x08, 0x05, 0xd0, 0x15, 0x09, 0x17, 0x46, 0x02, 0xf3, 0xaf, 0xe4, 0x60, 0x15,
0x8a, 0xc5, 0x10, 0x84, 0x12, 0xf2, 0xc1, 0x2d, 0x69, 0x77, 0x90, 0x50, 0xf6, 0x7d, 0x54, 0x24, 0xc5, 0x2d, 0x6e, 0x76, 0x11, 0x13, 0xf5, 0x44, 0xda, 0x17, 0x04, 0x3b, 0x15, 0x63, 0x8a, 0xc5,
0x5d, 0x0b, 0x81, 0x52, 0x8c, 0xbe, 0x9d, 0x22, 0xe0, 0x45, 0xc5, 0x85, 0x96, 0xe9, 0x22, 0x68, 0x10, 0x0e, 0x45, 0xe4, 0xfd, 0x1b, 0xc2, 0xee, 0x20, 0xa0, 0xe4, 0x07, 0x5c, 0x91, 0xf4, 0x6c,
0xb7, 0x04, 0x4b, 0x64, 0xc4, 0x32, 0xf6, 0xa1, 0x96, 0x68, 0x26, 0xe1, 0x0c, 0xa9, 0x92, 0x33, 0x0e, 0x14, 0x62, 0xf4, 0xcd, 0x0c, 0x01, 0x4f, 0x15, 0x67, 0x5a, 0xa6, 0xc7, 0x41, 0x3b, 0x15,
0x64, 0xc1, 0x39, 0x99, 0x5d, 0x74, 0x4e, 0x5e, 0xc3, 0x9a, 0xc9, 0xed, 0xd1, 0xf5, 0xbe, 0xe7, 0x58, 0x42, 0x23, 0x96, 0xb9, 0x07, 0x8d, 0x44, 0x33, 0x09, 0x67, 0x48, 0x1d, 0x9d, 0x21, 0x0b,
0x1f, 0x07, 0xa7, 0xe1, 0x3e, 0xc9, 0xb0, 0xe2, 0x0c, 0x8a, 0x3c, 0xee, 0x09, 0x8f, 0x83, 0x72, 0xce, 0xc9, 0xfc, 0xa2, 0x73, 0xf2, 0x0a, 0xd6, 0x2c, 0xea, 0x8c, 0xaf, 0xf6, 0xfc, 0xe0, 0x28,
0xbc, 0x2a, 0x2b, 0xca, 0xb7, 0x60, 0x39, 0x76, 0xcd, 0x6b, 0x56, 0xeb, 0x5a, 0xe4, 0x9d, 0x47, 0x3c, 0x89, 0xf6, 0x50, 0x86, 0x65, 0x67, 0x90, 0xf2, 0xb8, 0x27, 0x3c, 0x0e, 0xd2, 0xf1, 0x2a,
0xe3, 0xb5, 0xd0, 0xf7, 0x83, 0xd3, 0x50, 0xda, 0xad, 0xf1, 0xb7, 0xf1, 0x2f, 0xf3, 0xc0, 0x04, 0xad, 0x28, 0xdf, 0x81, 0xe5, 0xd8, 0x35, 0xaf, 0x59, 0xad, 0x1b, 0xca, 0x3b, 0xcf, 0x8d, 0xd7,
0x35, 0xcf, 0x11, 0xcc, 0x5c, 0x50, 0x41, 0x76, 0x21, 0xa8, 0xe0, 0x11, 0x30, 0x0d, 0x41, 0xc5, 0x4c, 0xdf, 0x0f, 0x4f, 0x22, 0x61, 0xb7, 0xe6, 0xbf, 0xcd, 0x7f, 0x5e, 0x04, 0xc2, 0xa8, 0x39,
0x3a, 0xe4, 0xa2, 0x58, 0x87, 0x7a, 0x8c, 0x2b, 0x43, 0x1d, 0x1e, 0xc1, 0xba, 0x54, 0x08, 0x92, 0x45, 0x30, 0xa9, 0xa0, 0x82, 0xfc, 0x42, 0x50, 0xc1, 0x43, 0x20, 0x1a, 0x82, 0x8c, 0x75, 0x28,
0x5d, 0x25, 0xd2, 0x60, 0xa4, 0x19, 0x24, 0xfa, 0xab, 0x02, 0x0a, 0x94, 0xa1, 0x39, 0x47, 0x01, 0xa8, 0x58, 0x07, 0x23, 0xc6, 0x15, 0xa1, 0x0e, 0x0f, 0x61, 0x5d, 0x28, 0x04, 0xc9, 0xae, 0x22,
0x05, 0xca, 0x1e, 0xa4, 0x11, 0xe0, 0xd2, 0x4b, 0x09, 0xb0, 0xb8, 0x40, 0x80, 0x9a, 0x6d, 0xb0, 0x69, 0x10, 0xd4, 0x0c, 0x12, 0xfd, 0x95, 0x01, 0x05, 0xd2, 0xd0, 0x5c, 0xc0, 0x80, 0x02, 0x69,
0x94, 0xb4, 0x0d, 0x2e, 0x58, 0xb9, 0x49, 0xfa, 0x4d, 0x58, 0xb9, 0x1f, 0x40, 0x5d, 0xd9, 0x89, 0x0f, 0xd2, 0x08, 0x70, 0xe9, 0x95, 0x04, 0x58, 0x5e, 0x20, 0x40, 0xcd, 0x36, 0x58, 0x49, 0xda,
0x22, 0x0b, 0x24, 0x45, 0x02, 0x49, 0x1b, 0x70, 0x4b, 0xd9, 0x20, 0x13, 0x6e, 0xaf, 0xca, 0x9c, 0x06, 0x17, 0xac, 0xdc, 0x28, 0xfd, 0x26, 0xac, 0xdc, 0xf7, 0xc0, 0x90, 0x76, 0x22, 0x65, 0x81,
0xdb, 0xeb, 0x5d, 0x58, 0x0d, 0x04, 0xfd, 0x5a, 0x33, 0x57, 0x86, 0x03, 0xf2, 0x11, 0xaa, 0xd3, 0xc4, 0x48, 0x20, 0x61, 0x03, 0x6e, 0x4b, 0x1b, 0x64, 0xc2, 0xed, 0x55, 0x4b, 0xb9, 0xbd, 0xde,
0x25, 0xb3, 0x8e, 0x19, 0x27, 0x31, 0x7c, 0xd1, 0xa2, 0x56, 0x4b, 0xb1, 0xa8, 0x7d, 0x18, 0x7b, 0x87, 0xd5, 0x90, 0xd1, 0xaf, 0x3d, 0xf7, 0x44, 0x38, 0x20, 0x1d, 0x73, 0x75, 0xba, 0x62, 0x19,
0xd8, 0x83, 0x0b, 0x67, 0x82, 0x82, 0x4f, 0x1c, 0xe2, 0x26, 0x27, 0xb8, 0x7f, 0xe1, 0x4c, 0x4c, 0x3c, 0xe3, 0x38, 0x86, 0x2f, 0x5a, 0xd4, 0x1a, 0x19, 0x16, 0xb5, 0xc7, 0xb1, 0x87, 0x3d, 0x3c,
0x15, 0xce, 0x21, 0x12, 0xac, 0x05, 0xf7, 0xe4, 0x78, 0x52, 0x22, 0x31, 0x68, 0x16, 0x56, 0x50, 0x77, 0xa7, 0x5c, 0xf0, 0x89, 0x43, 0xdc, 0xc4, 0x04, 0x0f, 0xce, 0xdd, 0xa9, 0x25, 0xc3, 0x39,
0x52, 0xdd, 0x26, 0xb4, 0xa3, 0xb9, 0xa0, 0x0c, 0x31, 0x29, 0xc6, 0xff, 0xca, 0x40, 0x5d, 0x10, 0x58, 0x82, 0xb4, 0xe1, 0x8e, 0x18, 0x4f, 0x46, 0x24, 0x06, 0xce, 0xc2, 0x0a, 0x97, 0x54, 0xb7,
0x53, 0x62, 0x9f, 0x7e, 0x0a, 0xc8, 0x51, 0x5e, 0x71, 0x9b, 0x56, 0x04, 0xae, 0xda, 0xa5, 0x1f, 0x11, 0xed, 0x30, 0x15, 0x94, 0xc1, 0x26, 0xc5, 0xfc, 0xef, 0x39, 0x30, 0x18, 0x31, 0x25, 0xf6,
0x03, 0x6e, 0x3b, 0xcb, 0x9b, 0x72, 0x57, 0x6e, 0xd2, 0x46, 0x72, 0x93, 0xc6, 0x8c, 0xf8, 0xe0, 0xe9, 0xe7, 0xc0, 0x39, 0xca, 0x6b, 0x6e, 0xd3, 0x1a, 0xc3, 0x95, 0xbb, 0xf4, 0x53, 0xe0, 0xdb,
0x16, 0x69, 0x61, 0x02, 0xc2, 0x3e, 0x85, 0xb2, 0xa0, 0x6e, 0x24, 0x35, 0x19, 0xf6, 0xb9, 0x1d, 0xce, 0xf6, 0x67, 0xd4, 0x13, 0x9b, 0xb4, 0x99, 0xdc, 0xa4, 0x31, 0x23, 0xde, 0xbf, 0x81, 0x5a,
0x69, 0xd6, 0x0b, 0x1b, 0x4d, 0x14, 0x9d, 0xca, 0x64, 0x5a, 0x64, 0x45, 0x3e, 0x25, 0xb2, 0x42, 0x18, 0x83, 0x90, 0xcf, 0xa1, 0xca, 0xa8, 0x9b, 0x93, 0x9a, 0x08, 0xfb, 0xdc, 0x56, 0x9a, 0xf5,
0xe3, 0x02, 0x07, 0x00, 0x4f, 0xf9, 0xf5, 0xa1, 0x37, 0x44, 0x1b, 0xc7, 0x5d, 0x00, 0xb1, 0x21, 0xc2, 0x46, 0x63, 0x45, 0x67, 0x22, 0x99, 0x15, 0x59, 0x51, 0xcc, 0x88, 0xac, 0xd0, 0xb8, 0xc0,
0xce, 0xec, 0x89, 0x23, 0xad, 0x7b, 0x05, 0xb3, 0xfc, 0x8c, 0x5f, 0xef, 0x23, 0x40, 0x50, 0x83, 0x3e, 0xc0, 0x33, 0x7a, 0x75, 0xe0, 0x8f, 0xb8, 0x8d, 0xe3, 0x36, 0x00, 0xdb, 0x10, 0xa7, 0xce,
0xc8, 0x8e, 0x59, 0x41, 0xc1, 0x2c, 0x3d, 0xe3, 0xd7, 0xc4, 0x07, 0x2c, 0xa8, 0x3d, 0xe5, 0xd7, 0xd4, 0x15, 0xd6, 0xbd, 0x92, 0x55, 0x7d, 0x4e, 0xaf, 0xf6, 0x38, 0x80, 0x51, 0x03, 0xcb, 0x8e,
0x7b, 0x9c, 0xc4, 0x6d, 0xcf, 0x17, 0x94, 0xe8, 0xdb, 0xcf, 0x85, 0x7c, 0x9d, 0x88, 0x8a, 0xa8, 0x59, 0x41, 0xc9, 0xaa, 0x3c, 0xa7, 0x57, 0xc8, 0x07, 0x6c, 0x68, 0x3c, 0xa3, 0x57, 0xbb, 0x14,
0xf8, 0xf6, 0xf3, 0xa7, 0xfc, 0x5a, 0x45, 0x68, 0x14, 0x45, 0xfe, 0xd8, 0x1b, 0x4a, 0x01, 0x41, 0xc5, 0x6d, 0x3f, 0x60, 0x94, 0x18, 0x38, 0x2f, 0x98, 0x7c, 0x9d, 0x88, 0x8a, 0xa8, 0x05, 0xce,
0x19, 0x54, 0xe2, 0x4e, 0x99, 0x4b, 0xcf, 0xf0, 0xb7, 0xf1, 0xc7, 0x19, 0xa8, 0x89, 0xfe, 0x23, 0x8b, 0x67, 0xf4, 0x4a, 0x46, 0x68, 0x94, 0x59, 0xfe, 0xc4, 0x1f, 0x09, 0x01, 0x41, 0x1a, 0x54,
0x6f, 0xc7, 0x75, 0x97, 0x61, 0x82, 0x99, 0x38, 0x4c, 0xf0, 0xb1, 0x64, 0x8d, 0x74, 0x50, 0x64, 0xe2, 0x4e, 0x59, 0x4b, 0xcf, 0xf9, 0x6f, 0xf3, 0x4f, 0x72, 0xd0, 0x60, 0xfd, 0xe7, 0xbc, 0x9d,
0x6f, 0x3e, 0x28, 0x70, 0x6d, 0xe8, 0x94, 0xf8, 0x00, 0xca, 0xb4, 0xb7, 0x05, 0xb3, 0xc8, 0x25, 0xaf, 0xbb, 0x08, 0x13, 0xcc, 0xc5, 0x61, 0x82, 0x8f, 0x04, 0x6b, 0xc4, 0x83, 0x22, 0x7f, 0xfd,
0x16, 0x38, 0x31, 0x20, 0xb3, 0x84, 0x68, 0x4f, 0x29, 0x2a, 0x49, 0xb3, 0x5d, 0xd3, 0x14, 0x97, 0x41, 0xc1, 0xd7, 0x06, 0x4f, 0x89, 0x8f, 0xa0, 0x8a, 0x7b, 0x9b, 0x31, 0x8b, 0x42, 0x62, 0x81,
0xfd, 0xc8, 0x62, 0x9d, 0xb2, 0x0c, 0x85, 0x1b, 0xa2, 0x92, 0x74, 0xc3, 0xf0, 0xd2, 0xbc, 0x61, 0x13, 0x03, 0xb2, 0x2a, 0x1c, 0xed, 0x19, 0x46, 0x25, 0x69, 0xb6, 0x6b, 0x9c, 0xe2, 0x6a, 0xa0,
0xd8, 0x70, 0xa1, 0x24, 0x96, 0x1a, 0x07, 0x9b, 0x52, 0x69, 0x26, 0xad, 0x52, 0x21, 0x4e, 0xd8, 0x2c, 0xd6, 0x19, 0xcb, 0x50, 0xba, 0x26, 0x2a, 0x49, 0x37, 0x0c, 0x2f, 0xa5, 0x0d, 0xc3, 0xa6,
0xe2, 0x64, 0x11, 0xdc, 0x32, 0x2b, 0xc5, 0x09, 0x3b, 0xe0, 0xa2, 0x22, 0xd1, 0x71, 0xd7, 0xb3, 0x07, 0x15, 0xb6, 0xd4, 0x7c, 0xb0, 0x19, 0x95, 0xe6, 0xb2, 0x2a, 0x65, 0xe2, 0x84, 0xc3, 0x4e,
0xd0, 0xd2, 0x2a, 0x6d, 0x90, 0x25, 0xb3, 0xec, 0x7a, 0xc7, 0x04, 0x30, 0xfe, 0x6c, 0x06, 0x2a, 0x16, 0xc6, 0x2d, 0xf3, 0x42, 0x9c, 0x70, 0x42, 0xca, 0x2a, 0x62, 0x1d, 0xf7, 0x7c, 0x9b, 0x5b,
0xda, 0x2e, 0x43, 0xd3, 0x7b, 0x34, 0x9d, 0xb4, 0x25, 0x93, 0x3b, 0x20, 0xb1, 0x1e, 0x07, 0xb7, 0x5a, 0x85, 0x0d, 0xb2, 0x62, 0x55, 0x3d, 0xff, 0x08, 0x01, 0xe6, 0xff, 0x9f, 0x83, 0x9a, 0xb6,
0xcc, 0xda, 0x30, 0xb1, 0x40, 0x3b, 0x92, 0x94, 0xb1, 0x64, 0x36, 0x61, 0xef, 0x51, 0xe3, 0x52, 0xcb, 0xb8, 0xe9, 0x5d, 0x4d, 0x27, 0x6e, 0xc9, 0xe4, 0x0e, 0x48, 0xac, 0xc7, 0xfe, 0x0d, 0xab,
0xf4, 0x2b, 0x7e, 0xef, 0x2e, 0x41, 0x5e, 0xa0, 0x1a, 0x9f, 0xc1, 0xaa, 0xd6, 0x0d, 0xb2, 0x87, 0x31, 0x4a, 0x2c, 0xd0, 0x03, 0x41, 0xca, 0xbc, 0x64, 0x3e, 0x61, 0xef, 0x91, 0xe3, 0x92, 0xf4,
0xbc, 0xea, 0x04, 0x18, 0xbf, 0x1a, 0x15, 0x16, 0x6d, 0x90, 0xbf, 0x58, 0x05, 0x80, 0xf1, 0x11, 0xcb, 0x7e, 0xef, 0x2c, 0x41, 0x91, 0xa1, 0x9a, 0x4f, 0x60, 0x55, 0xeb, 0x06, 0xda, 0x43, 0x5e,
0xcd, 0x8b, 0x0c, 0x34, 0x23, 0x10, 0xce, 0xcc, 0xab, 0x06, 0x25, 0xfd, 0x1a, 0xac, 0x69, 0xb5, 0x77, 0x02, 0xcc, 0x5f, 0x55, 0x85, 0x59, 0x1b, 0xe8, 0x2f, 0x96, 0x01, 0x60, 0x74, 0x8c, 0xf3,
0xef, 0x3b, 0xae, 0x3d, 0x76, 0x7e, 0x8a, 0x42, 0x45, 0xe0, 0x9c, 0xbb, 0x73, 0xf5, 0x13, 0xe8, 0x22, 0x02, 0xcd, 0x10, 0xc4, 0x67, 0xe6, 0x75, 0x83, 0x92, 0x7e, 0x0d, 0xd6, 0xb4, 0xda, 0xf7,
0x6b, 0xd5, 0xff, 0xd7, 0xb3, 0xb0, 0x2e, 0x1b, 0xc0, 0x90, 0x5e, 0x47, 0x48, 0x8a, 0x47, 0xc1, 0x5c, 0xcf, 0x99, 0xb8, 0x3f, 0xe3, 0x42, 0x45, 0xe8, 0x9e, 0x79, 0xa9, 0xfa, 0x11, 0xf4, 0x8d,
0x39, 0xfb, 0x14, 0x6a, 0x62, 0x6e, 0x2c, 0x9f, 0x9f, 0x3b, 0x41, 0xc8, 0x95, 0x9f, 0x3a, 0x85, 0xea, 0xff, 0xab, 0x79, 0x58, 0x17, 0x0d, 0xf0, 0x90, 0x5e, 0x97, 0x49, 0x8a, 0x87, 0xe1, 0x19,
0x39, 0x0a, 0x81, 0x41, 0xa0, 0x9a, 0x12, 0x93, 0x7d, 0x06, 0x15, 0x2c, 0x4a, 0xf6, 0x26, 0xb9, 0xf9, 0x1c, 0x1a, 0x6c, 0x6e, 0xec, 0x80, 0x9e, 0xb9, 0x61, 0x44, 0xa5, 0x9f, 0x3a, 0x83, 0x39,
0x10, 0x8d, 0xc5, 0x82, 0x34, 0xd1, 0x07, 0xb7, 0x4c, 0x08, 0xe2, 0x69, 0xff, 0x0c, 0x2a, 0xb8, 0x32, 0x81, 0x81, 0xa1, 0x5a, 0x02, 0x93, 0x3c, 0x81, 0x1a, 0x2f, 0x8a, 0xf6, 0x26, 0xb1, 0x10,
0x86, 0x97, 0x38, 0x91, 0x73, 0x9c, 0x6c, 0x61, 0xa2, 0x45, 0xe1, 0x69, 0x3c, 0xed, 0x4d, 0xa8, 0xcd, 0xc5, 0x82, 0x38, 0xd1, 0xfb, 0x37, 0x2c, 0x08, 0xe3, 0x69, 0x7f, 0x02, 0x35, 0xbe, 0x86,
0x11, 0x2f, 0x93, 0xf3, 0x24, 0x43, 0x05, 0xb7, 0x17, 0x8b, 0xab, 0x99, 0x14, 0x9d, 0x9f, 0x6a, 0x17, 0x7c, 0x22, 0x53, 0x9c, 0x6c, 0x61, 0xa2, 0x59, 0xe1, 0x59, 0x3c, 0xed, 0x2d, 0x68, 0x20,
0xe9, 0xdd, 0x32, 0x14, 0x43, 0xdf, 0x39, 0x3f, 0xe7, 0xbe, 0xb1, 0x19, 0x4d, 0x8d, 0x60, 0xd2, 0x2f, 0x13, 0xf3, 0x24, 0x42, 0x05, 0xb7, 0x17, 0x8b, 0xcb, 0x99, 0x64, 0x9d, 0x9f, 0x69, 0xe9,
0xbc, 0x1f, 0xf2, 0xa9, 0x50, 0x01, 0x8c, 0x7f, 0x95, 0x81, 0x8a, 0x64, 0xbb, 0x3f, 0xb7, 0x73, 0x9d, 0x2a, 0x94, 0xa3, 0xc0, 0x3d, 0x3b, 0xa3, 0x81, 0xb9, 0xa9, 0xa6, 0x86, 0x31, 0x69, 0x3a,
0x7c, 0x7b, 0xce, 0x32, 0x59, 0xd6, 0x0c, 0x91, 0xef, 0xc0, 0xca, 0x44, 0xe8, 0x2b, 0x42, 0x9f, 0x88, 0xe8, 0x8c, 0xa9, 0x00, 0xe6, 0xbf, 0xc8, 0x41, 0x4d, 0xb0, 0xdd, 0x9f, 0xdb, 0x39, 0xbe,
0x4e, 0x78, 0xc6, 0x97, 0x15, 0x58, 0x8a, 0xe2, 0x3b, 0xb0, 0x86, 0x92, 0x79, 0x60, 0x85, 0xce, 0x9d, 0xb2, 0x4c, 0x56, 0x35, 0x43, 0xe4, 0x7b, 0xb0, 0x32, 0x65, 0xfa, 0x0a, 0xd3, 0xa7, 0x13,
0xd8, 0x52, 0x99, 0x32, 0xae, 0x7d, 0x95, 0xb2, 0x06, 0xce, 0xf8, 0x48, 0x66, 0x08, 0x01, 0x35, 0x9e, 0xf1, 0x65, 0x09, 0x16, 0xa2, 0xf8, 0x03, 0x58, 0xe3, 0x92, 0x79, 0x68, 0x47, 0xee, 0xc4,
0x08, 0xed, 0x73, 0x2e, 0xb7, 0x3e, 0x25, 0x84, 0x0e, 0x34, 0xa7, 0x4a, 0x2b, 0x1d, 0xe8, 0xff, 0x96, 0x99, 0x22, 0xae, 0x7d, 0x15, 0xb3, 0x86, 0xee, 0xe4, 0x50, 0x64, 0x30, 0x01, 0x35, 0x8c,
0xac, 0xc2, 0xd6, 0x42, 0x96, 0xd4, 0x81, 0x22, 0x57, 0xe8, 0xd8, 0x99, 0x9c, 0x7a, 0x91, 0x29, 0x9c, 0x33, 0x2a, 0xb6, 0x3e, 0x26, 0x98, 0x0e, 0x94, 0x52, 0xa5, 0xa5, 0x0e, 0xf4, 0xbf, 0x56,
0x3e, 0xa3, 0xb9, 0x42, 0x0f, 0x45, 0x8e, 0x32, 0xc5, 0x73, 0xd8, 0x50, 0x04, 0x89, 0xb6, 0xf4, 0x61, 0x6b, 0x21, 0x4b, 0xe8, 0x40, 0xca, 0x15, 0x3a, 0x71, 0xa7, 0x27, 0xbe, 0x32, 0xc5, 0xe7,
0x48, 0xdb, 0xce, 0xa2, 0x2e, 0xf8, 0x41, 0xf2, 0x8c, 0x9b, 0x6f, 0x4e, 0xc1, 0x75, 0xf1, 0x6b, 0x34, 0x57, 0xe8, 0x01, 0xcb, 0x91, 0xa6, 0x78, 0x0a, 0x1b, 0x92, 0x20, 0xb9, 0x2d, 0x5d, 0x69,
0x6d, 0xba, 0x00, 0x0b, 0xd8, 0x9f, 0x82, 0x46, 0x44, 0xf7, 0x52, 0x35, 0xd0, 0x4c, 0x07, 0xa2, 0xdb, 0x79, 0xae, 0x0b, 0x7e, 0x94, 0x3c, 0xe3, 0xd2, 0xcd, 0x49, 0xb8, 0x2e, 0x7e, 0xad, 0xcd,
0xa5, 0xf7, 0x5e, 0xd2, 0x52, 0xc2, 0xc8, 0x89, 0xf2, 0xd9, 0xa6, 0xda, 0x32, 0x54, 0x61, 0xd4, 0x16, 0x60, 0x21, 0xf9, 0x7f, 0xa0, 0xa9, 0xe8, 0x5e, 0xa8, 0x06, 0x9a, 0xe9, 0x80, 0xb5, 0xf4,
0xd6, 0x25, 0xbc, 0xae, 0xda, 0x42, 0x51, 0x7f, 0xb1, 0xc5, 0xfc, 0x2b, 0x8d, 0x0d, 0x0d, 0xb8, 0xc1, 0x2b, 0x5a, 0x4a, 0x18, 0x39, 0xb9, 0x7c, 0xb6, 0x29, 0xb7, 0x0c, 0x56, 0xa8, 0xda, 0xba,
0x89, 0x66, 0xcd, 0x3b, 0xb2, 0xe2, 0x28, 0x4b, 0x6f, 0xf7, 0x02, 0x36, 0x9f, 0xdb, 0x4e, 0xa8, 0x80, 0x37, 0x65, 0x5b, 0x5c, 0xd4, 0x5f, 0x6c, 0xb1, 0xf8, 0x5a, 0x63, 0xe3, 0x06, 0xdc, 0x44,
0xc6, 0xa8, 0x59, 0x2e, 0x0a, 0xd8, 0xde, 0xe3, 0x97, 0xb4, 0xf7, 0x05, 0x15, 0x4e, 0x28, 0x3f, 0xb3, 0xd6, 0x2d, 0x51, 0xb1, 0xca, 0xd2, 0xdb, 0x3d, 0x87, 0xcd, 0x17, 0x8e, 0x1b, 0xc9, 0x31,
0xeb, 0xcf, 0x17, 0x81, 0xc1, 0xf6, 0xdf, 0xcd, 0xc1, 0x72, 0xb2, 0x16, 0xc1, 0x58, 0xe4, 0x59, 0x6a, 0x96, 0x8b, 0x12, 0x6f, 0xef, 0xd1, 0x2b, 0xda, 0xfb, 0x12, 0x0b, 0x27, 0x94, 0x9f, 0xf5,
0xa4, 0x64, 0x5a, 0x29, 0x68, 0x4b, 0x37, 0x51, 0x97, 0x64, 0xd9, 0x45, 0x07, 0x56, 0x36, 0xc5, 0x17, 0x8b, 0xc0, 0x70, 0xfb, 0x6f, 0x17, 0x60, 0x39, 0x59, 0x0b, 0x63, 0x2c, 0xe2, 0x2c, 0x92,
0x81, 0xa5, 0xfb, 0x8d, 0x72, 0x2f, 0x0b, 0x23, 0xc8, 0xbf, 0x52, 0x18, 0x41, 0x21, 0x2d, 0x8c, 0x32, 0xad, 0x10, 0xb4, 0x85, 0x9b, 0xa8, 0x87, 0xb2, 0xec, 0xa2, 0x03, 0x2b, 0x9f, 0xe1, 0xc0,
0xe0, 0xbb, 0x37, 0xfa, 0x9d, 0xc9, 0xfa, 0x9b, 0xea, 0x73, 0xfe, 0xf0, 0x66, 0x9f, 0x33, 0x49, 0xd2, 0xfd, 0x46, 0x85, 0x57, 0x85, 0x11, 0x14, 0x5f, 0x2b, 0x8c, 0xa0, 0x94, 0x15, 0x46, 0xf0,
0xc8, 0x37, 0xf9, 0x9b, 0x35, 0x6f, 0x79, 0xe9, 0x06, 0x6f, 0x8f, 0xe6, 0x3f, 0x4f, 0xf1, 0x37, 0xfd, 0x6b, 0xfd, 0xce, 0x68, 0xfd, 0xcd, 0xf4, 0x39, 0x3f, 0xbe, 0xde, 0xe7, 0x8c, 0x12, 0xf2,
0x97, 0xbf, 0x86, 0xbf, 0x79, 0xfb, 0x8f, 0x33, 0xc0, 0x16, 0x77, 0x07, 0x7b, 0x42, 0xbe, 0x41, 0x75, 0xfe, 0x66, 0xcd, 0x5b, 0x5e, 0xb9, 0xc6, 0xdb, 0xa3, 0xf9, 0xcf, 0x33, 0xfc, 0xcd, 0xd5,
0x97, 0x8f, 0x25, 0xe7, 0xfe, 0xce, 0xab, 0xed, 0x30, 0x45, 0x10, 0xaa, 0x34, 0x7b, 0x1f, 0xd6, 0x6f, 0xe0, 0x6f, 0xde, 0xfe, 0x93, 0x1c, 0x90, 0xc5, 0xdd, 0x41, 0x9e, 0xa2, 0x6f, 0xd0, 0xa3,
0xf4, 0xdb, 0x37, 0xba, 0x65, 0xa0, 0x66, 0x32, 0x3d, 0x2b, 0xb6, 0x71, 0x69, 0x31, 0x1b, 0xf9, 0x13, 0xc1, 0xb9, 0xbf, 0xf7, 0x7a, 0x3b, 0x4c, 0x12, 0x84, 0x2c, 0x4d, 0x3e, 0x84, 0x35, 0xfd,
0x97, 0xc6, 0x6c, 0x14, 0x5e, 0x1a, 0xb3, 0xb1, 0x94, 0x8c, 0xd9, 0xd8, 0xfe, 0x77, 0x19, 0x58, 0xf6, 0x8d, 0x6e, 0x19, 0x68, 0x58, 0x44, 0xcf, 0x8a, 0x6d, 0x5c, 0x5a, 0xcc, 0x46, 0xf1, 0x95,
0x4b, 0x21, 0xe2, 0x6f, 0x6e, 0xcc, 0x82, 0xf6, 0x12, 0x6c, 0x2d, 0x2b, 0x69, 0x4f, 0xe7, 0x68, 0x31, 0x1b, 0xa5, 0x57, 0xc6, 0x6c, 0x2c, 0x25, 0x63, 0x36, 0xb6, 0xff, 0x75, 0x0e, 0xd6, 0x32,
0x87, 0xca, 0x2e, 0x2a, 0x96, 0x22, 0x90, 0x27, 0xd5, 0xc3, 0x97, 0x71, 0x97, 0xb8, 0x84, 0xa9, 0x88, 0xf8, 0xdb, 0x1b, 0x33, 0xa3, 0xbd, 0x04, 0x5b, 0xcb, 0x0b, 0xda, 0xd3, 0x39, 0xda, 0x81,
0x17, 0xdf, 0xfe, 0xfb, 0x59, 0xa8, 0x68, 0x99, 0x62, 0x16, 0x89, 0x64, 0xb5, 0x88, 0x41, 0x12, 0xb4, 0x8b, 0xb2, 0xa5, 0x08, 0xc5, 0x49, 0x75, 0xff, 0x55, 0xdc, 0x25, 0x2e, 0x61, 0xe9, 0xc5,
0x1c, 0xd1, 0xae, 0x71, 0x0f, 0xa4, 0xf7, 0x87, 0xf2, 0x69, 0x73, 0x49, 0x29, 0x11, 0x11, 0x76, 0xb7, 0xff, 0x6e, 0x1e, 0x6a, 0x5a, 0x26, 0x9b, 0x45, 0x24, 0x59, 0x2d, 0x62, 0x10, 0x05, 0x47,
0x60, 0x4d, 0xf9, 0x6d, 0x79, 0x1c, 0x44, 0x2c, 0xcf, 0x1a, 0xe9, 0x82, 0x97, 0x9d, 0x44, 0xfc, 0x6e, 0xd7, 0xb8, 0x03, 0xc2, 0xfb, 0x83, 0xf9, 0xb8, 0xb9, 0x84, 0x94, 0xc8, 0x11, 0x1e, 0xc0,
0xf7, 0x95, 0xca, 0x19, 0xaf, 0x9d, 0xe6, 0x07, 0x5b, 0x95, 0xce, 0x7f, 0xb9, 0x88, 0x82, 0xce, 0x9a, 0xf4, 0xdb, 0xd2, 0x38, 0x88, 0x58, 0x9c, 0x35, 0xc2, 0x05, 0x2f, 0x3a, 0xc9, 0xf1, 0x3f,
0x3f, 0x80, 0x8d, 0xc8, 0xfb, 0x9f, 0x28, 0x41, 0xde, 0x16, 0xa6, 0xbc, 0xfc, 0x5a, 0x91, 0x1f, 0x94, 0x2a, 0x67, 0xbc, 0x76, 0x9a, 0x1f, 0x6c, 0x55, 0x38, 0xff, 0xc5, 0x22, 0x32, 0x3a, 0xff,
0xc1, 0xdd, 0xb9, 0x3e, 0xcd, 0x15, 0xa5, 0x68, 0xf7, 0xdb, 0x89, 0xde, 0xe9, 0x35, 0x6c, 0xff, 0x08, 0x36, 0x94, 0xf7, 0x3f, 0x51, 0x02, 0xbd, 0x2d, 0x44, 0x7a, 0xf9, 0xb5, 0x22, 0x3f, 0x86,
0x69, 0xa8, 0x25, 0x18, 0xe5, 0x37, 0xb7, 0xe4, 0xf3, 0xb6, 0x24, 0x9a, 0x51, 0xdd, 0x96, 0xb4, 0xdb, 0xa9, 0x3e, 0xa5, 0x8a, 0x62, 0xb4, 0xfb, 0xcd, 0x44, 0xef, 0xf4, 0x1a, 0xb6, 0xff, 0x5f,
0xfd, 0x3f, 0x73, 0xc0, 0x16, 0x79, 0xf5, 0x2f, 0xb2, 0x0b, 0x8b, 0x84, 0x99, 0x4b, 0x21, 0xcc, 0x68, 0x24, 0x18, 0xe5, 0xb7, 0xb7, 0xe4, 0x69, 0x5b, 0x12, 0xce, 0xa8, 0x6e, 0x4b, 0xda, 0xfe,
0xff, 0x67, 0xf2, 0x43, 0x6c, 0xd2, 0xd4, 0x9c, 0xef, 0xb4, 0x39, 0xeb, 0x51, 0x86, 0xea, 0xc5, 0x6f, 0x05, 0x20, 0x8b, 0xbc, 0xfa, 0x17, 0xd9, 0x85, 0x45, 0xc2, 0x2c, 0x64, 0x10, 0xe6, 0xff,
0xc7, 0xf3, 0x21, 0x4a, 0xa5, 0xc4, 0x05, 0x32, 0x4d, 0x80, 0x9a, 0x8b, 0x54, 0x3a, 0x81, 0x25, 0x31, 0xf9, 0x21, 0x36, 0x69, 0x6a, 0xce, 0x77, 0xdc, 0x9c, 0x86, 0xca, 0x90, 0xbd, 0xf8, 0x34,
0xdb, 0x1d, 0x5e, 0x78, 0xbe, 0xe4, 0x83, 0xbf, 0xf4, 0xb5, 0x8f, 0xcf, 0x9d, 0x26, 0x96, 0x47, 0x1d, 0xa2, 0x54, 0x49, 0x5c, 0x20, 0xd3, 0x04, 0xa8, 0x54, 0xa4, 0xd2, 0x31, 0x2c, 0x39, 0xde,
0xa9, 0xcd, 0x94, 0x95, 0x19, 0x1f, 0x40, 0x45, 0x03, 0xb3, 0x32, 0x14, 0x0e, 0x3b, 0x47, 0xbb, 0xe8, 0xdc, 0x0f, 0x04, 0x1f, 0xfc, 0xa5, 0x6f, 0x7c, 0x7c, 0x3e, 0x68, 0xf1, 0xf2, 0x5c, 0x6a,
0xbd, 0xfa, 0x2d, 0x56, 0x83, 0xb2, 0xd9, 0x6e, 0xf5, 0x3e, 0x6f, 0x9b, 0xed, 0xbd, 0x7a, 0x86, 0xb3, 0x44, 0x65, 0xe6, 0x47, 0x50, 0xd3, 0xc0, 0xa4, 0x0a, 0xa5, 0x83, 0xee, 0xe1, 0x4e, 0xdf,
0x95, 0x20, 0x7f, 0xd8, 0xeb, 0x0f, 0xea, 0x59, 0x63, 0x1b, 0x1a, 0xb2, 0xc6, 0x45, 0xe7, 0xce, 0xb8, 0x41, 0x1a, 0x50, 0xb5, 0x3a, 0xed, 0xfe, 0x17, 0x1d, 0xab, 0xb3, 0x6b, 0xe4, 0x48, 0x05,
0x6f, 0xe5, 0x23, 0x93, 0x24, 0x66, 0x4a, 0x0d, 0xfe, 0xbb, 0x50, 0xd5, 0xc5, 0x1b, 0x49, 0x11, 0x8a, 0x07, 0xfd, 0xc1, 0xd0, 0xc8, 0x9b, 0xdb, 0xd0, 0x14, 0x35, 0x2e, 0x3a, 0x77, 0x7e, 0xab,
0x73, 0xf1, 0x1f, 0x42, 0x77, 0xf7, 0x34, 0x5e, 0xdd, 0x02, 0xf2, 0xfe, 0x8f, 0xa2, 0x62, 0xd9, 0xa8, 0x4c, 0x92, 0x3c, 0x53, 0x68, 0xf0, 0xdf, 0x87, 0xba, 0x2e, 0xde, 0x08, 0x8a, 0x48, 0xc5,
0x84, 0xdc, 0x9a, 0xe2, 0x46, 0x45, 0xe5, 0x27, 0x41, 0x86, 0xff, 0x1f, 0x2c, 0x27, 0x1d, 0x19, 0x7f, 0x30, 0xdd, 0xdd, 0xd7, 0x78, 0x75, 0x1b, 0xd0, 0xfb, 0x3f, 0x56, 0xc5, 0xf2, 0x09, 0xb9,
0x92, 0x23, 0xa5, 0xe9, 0xa3, 0xa2, 0x74, 0xc2, 0xb3, 0xc1, 0x7e, 0x04, 0xf5, 0x79, 0x47, 0x88, 0x35, 0xc3, 0x8d, 0xca, 0x95, 0x9f, 0x04, 0x19, 0xfe, 0x5f, 0xb0, 0x9c, 0x74, 0x64, 0x08, 0x8e,
0x14, 0x9e, 0x6f, 0x28, 0xbf, 0xe2, 0x24, 0x7d, 0x23, 0xec, 0x00, 0xd6, 0xd3, 0x04, 0x3c, 0xa4, 0x94, 0xa5, 0x8f, 0xb2, 0xd2, 0x09, 0xcf, 0x06, 0xf9, 0x31, 0x18, 0x69, 0x47, 0x88, 0x10, 0x9e,
0x8f, 0x9b, 0x6d, 0x18, 0x6c, 0x51, 0x88, 0x63, 0x9f, 0x48, 0x87, 0x58, 0x01, 0x97, 0xff, 0xad, 0xaf, 0x29, 0xbf, 0xe2, 0x26, 0x7d, 0x23, 0x64, 0x1f, 0xd6, 0xb3, 0x04, 0x3c, 0x4e, 0x1f, 0xd7,
0x64, 0xfb, 0xda, 0x64, 0xef, 0xd0, 0x3f, 0xcd, 0x35, 0x76, 0x09, 0x10, 0xc3, 0x58, 0x1d, 0xaa, 0xdb, 0x30, 0xc8, 0xa2, 0x10, 0x47, 0x3e, 0x13, 0x0e, 0xb1, 0x12, 0x5f, 0xfe, 0x77, 0x92, 0xed,
0xbd, 0xe3, 0x76, 0xd7, 0x6a, 0x1d, 0x34, 0xbb, 0xdd, 0xf6, 0x61, 0xfd, 0x16, 0x63, 0xb0, 0x8c, 0x6b, 0x93, 0xfd, 0x00, 0xff, 0x69, 0xae, 0xb1, 0x0b, 0x80, 0x18, 0x46, 0x0c, 0xa8, 0xf7, 0x8f,
0x21, 0x0c, 0x7b, 0x11, 0x2c, 0x23, 0x60, 0xd2, 0x31, 0xa9, 0x60, 0x59, 0xb6, 0x0e, 0xf5, 0x4e, 0x3a, 0x3d, 0xbb, 0xbd, 0xdf, 0xea, 0xf5, 0x3a, 0x07, 0xc6, 0x0d, 0x42, 0x60, 0x99, 0x87, 0x30,
0x77, 0x0e, 0x9a, 0x63, 0x0d, 0x58, 0x3f, 0x6e, 0x53, 0xd4, 0x43, 0xa2, 0xde, 0xbc, 0x50, 0x1a, 0xec, 0x2a, 0x58, 0x8e, 0xc1, 0x84, 0x63, 0x52, 0xc2, 0xf2, 0x64, 0x1d, 0x8c, 0x6e, 0x2f, 0x05,
0xe4, 0x70, 0x85, 0xd2, 0xf0, 0x85, 0x3d, 0x1e, 0xf3, 0x50, 0xee, 0x03, 0x25, 0x4b, 0xff, 0x8d, 0x2d, 0x90, 0x26, 0xac, 0x1f, 0x75, 0x30, 0xea, 0x21, 0x51, 0x6f, 0x91, 0x29, 0x0d, 0x62, 0xb8,
0x0c, 0x6c, 0xcc, 0x65, 0xc4, 0xde, 0x04, 0x92, 0xa4, 0x93, 0x32, 0x74, 0x15, 0x81, 0x6a, 0x37, 0x4c, 0x69, 0xf8, 0xd2, 0x99, 0x4c, 0x68, 0x24, 0xf6, 0x81, 0x94, 0xa5, 0xff, 0x5a, 0x0e, 0x36,
0xbd, 0x0b, 0xab, 0x91, 0x71, 0x6b, 0xee, 0x54, 0xaa, 0x47, 0x19, 0x0a, 0xf9, 0x7d, 0x58, 0xd3, 0x52, 0x19, 0xb1, 0x37, 0x01, 0x25, 0xe9, 0xa4, 0x0c, 0x5d, 0xe7, 0x40, 0xb9, 0x9b, 0xde, 0x87,
0x6c, 0x64, 0x73, 0xbc, 0x82, 0x69, 0x59, 0xb2, 0x80, 0xb1, 0x15, 0xdd, 0xa9, 0x99, 0xeb, 0xf5, 0x55, 0x65, 0xdc, 0x4a, 0x9d, 0x4a, 0x86, 0xca, 0x90, 0xc8, 0x1f, 0xc2, 0x9a, 0x66, 0x23, 0x4b,
0x08, 0x36, 0xe7, 0x33, 0x62, 0x7f, 0x61, 0xb2, 0xbf, 0x2a, 0xc9, 0x1e, 0xcd, 0x11, 0x42, 0xb2, 0xf1, 0x0a, 0xa2, 0x65, 0x89, 0x02, 0xe6, 0x96, 0xba, 0x53, 0x93, 0xea, 0xf5, 0x18, 0x36, 0xd3,
0xb7, 0xfa, 0x82, 0xab, 0xe6, 0x7f, 0x67, 0x09, 0xd8, 0x4f, 0x66, 0xdc, 0xbf, 0xc6, 0xbb, 0x5c, 0x19, 0xb1, 0xbf, 0x30, 0xd9, 0x5f, 0x99, 0x24, 0x0f, 0x53, 0x84, 0x90, 0xec, 0xad, 0xbe, 0xe0,
0xc1, 0xcb, 0x02, 0x96, 0x95, 0x21, 0x26, 0xfb, 0x4a, 0xf7, 0x35, 0xd3, 0xee, 0x4b, 0xe6, 0x5f, 0xb2, 0xf9, 0xdf, 0x59, 0x02, 0xf2, 0xd3, 0x39, 0x0d, 0xae, 0xf8, 0x5d, 0xae, 0xf0, 0x55, 0x01,
0x7e, 0x5f, 0xb2, 0xf0, 0xb2, 0xfb, 0x92, 0x6f, 0x42, 0xcd, 0x39, 0x77, 0x3d, 0xc1, 0x0a, 0x85, 0xcb, 0xd2, 0x10, 0x93, 0x7f, 0xad, 0xfb, 0x9a, 0x59, 0xf7, 0x25, 0x8b, 0xaf, 0xbe, 0x2f, 0x59,
0x24, 0x1c, 0x34, 0x96, 0xee, 0xe7, 0x1e, 0x54, 0xcd, 0xaa, 0x04, 0x0a, 0x39, 0x38, 0x60, 0x9f, 0x7a, 0xd5, 0x7d, 0xc9, 0xb7, 0xa1, 0xe1, 0x9e, 0x79, 0x3e, 0x63, 0x85, 0x4c, 0x12, 0x0e, 0x9b,
0xc5, 0x48, 0x7c, 0x74, 0x8e, 0x77, 0x86, 0x75, 0x26, 0xd8, 0x1e, 0x9d, 0x73, 0x69, 0x77, 0x42, 0x4b, 0x77, 0x0b, 0xf7, 0xea, 0x56, 0x5d, 0x00, 0x99, 0x1c, 0x1c, 0x92, 0x27, 0x31, 0x12, 0x1d,
0x4d, 0x43, 0x15, 0x16, 0xf0, 0x80, 0xbd, 0x05, 0xcb, 0x81, 0x37, 0x13, 0x8a, 0x85, 0x9a, 0x06, 0x9f, 0xf1, 0x3b, 0xc3, 0x3a, 0x13, 0xec, 0x8c, 0xcf, 0xa8, 0xb0, 0x3b, 0x71, 0x4d, 0x43, 0x16,
0x72, 0x18, 0x56, 0x09, 0x7a, 0xac, 0xdc, 0xc7, 0x6b, 0xb3, 0x80, 0x5b, 0x13, 0x27, 0x08, 0x84, 0x66, 0xf0, 0x90, 0xbc, 0x03, 0xcb, 0xa1, 0x3f, 0x67, 0x8a, 0x85, 0x9c, 0x06, 0x74, 0x18, 0xd6,
0x78, 0x36, 0xf4, 0xdc, 0xd0, 0xf7, 0xc6, 0xd2, 0x07, 0xb8, 0x3a, 0x0b, 0xf8, 0x11, 0xe5, 0xb4, 0x11, 0x7a, 0x24, 0xdd, 0xc7, 0x6b, 0xf3, 0x90, 0xda, 0x53, 0x37, 0x0c, 0x99, 0x78, 0x36, 0xf2,
0x28, 0x83, 0x7d, 0x2f, 0xee, 0xd2, 0xd4, 0x76, 0xfc, 0xa0, 0x01, 0xd8, 0x25, 0x35, 0x52, 0x94, 0xbd, 0x28, 0xf0, 0x27, 0xc2, 0x07, 0xb8, 0x3a, 0x0f, 0xe9, 0x21, 0xe6, 0xb4, 0x31, 0x83, 0x7c,
0xdf, 0x6d, 0xc7, 0x8f, 0xfa, 0x22, 0x12, 0xc1, 0xdc, 0x3d, 0xce, 0xca, 0xfc, 0x3d, 0xce, 0x5f, 0x1c, 0x77, 0x69, 0xe6, 0xb8, 0x41, 0xd8, 0x04, 0xde, 0x25, 0x39, 0x52, 0x2e, 0xbf, 0x3b, 0x6e,
0x4f, 0xbf, 0xc7, 0x49, 0x51, 0x4b, 0x8f, 0x64, 0xd5, 0x8b, 0x4b, 0xfc, 0xb5, 0xae, 0x73, 0x2e, 0xa0, 0xfa, 0xc2, 0x12, 0x61, 0xea, 0x1e, 0x67, 0x2d, 0x7d, 0x8f, 0xf3, 0xd7, 0xb3, 0xef, 0x71,
0x5e, 0x4f, 0x5d, 0xfe, 0x3a, 0xd7, 0x53, 0x57, 0xd2, 0xae, 0xa7, 0x7e, 0x00, 0x15, 0xbc, 0x38, 0x62, 0xd4, 0xd2, 0x43, 0x51, 0xf5, 0xe2, 0x12, 0x7f, 0xa3, 0xeb, 0x9c, 0x8b, 0xd7, 0x53, 0x97,
0x68, 0x5d, 0x60, 0xec, 0x22, 0xf9, 0x34, 0xeb, 0xfa, 0xcd, 0xc2, 0x03, 0xc7, 0x0d, 0x4d, 0xf0, 0xbf, 0xc9, 0xf5, 0xd4, 0x95, 0xac, 0xeb, 0xa9, 0x1f, 0x41, 0x8d, 0x5f, 0x1c, 0xb4, 0xcf, 0x79,
0xd5, 0xcf, 0x60, 0xf1, 0xa6, 0xe8, 0xea, 0x2f, 0xf0, 0xa6, 0xa8, 0xbc, 0xe0, 0xb8, 0x03, 0x25, 0xec, 0x22, 0xfa, 0x34, 0x0d, 0xfd, 0x66, 0xe1, 0xbe, 0xeb, 0x45, 0x16, 0x04, 0xf2, 0x67, 0xb8,
0xb5, 0x4e, 0x8c, 0x41, 0xfe, 0xcc, 0xf7, 0x26, 0xca, 0x8f, 0x22, 0x7e, 0xb3, 0x65, 0xc8, 0x86, 0x78, 0x53, 0x74, 0xf5, 0x17, 0x78, 0x53, 0x54, 0x5c, 0x70, 0x7c, 0x00, 0x15, 0xb9, 0x4e, 0x84,
0x9e, 0x2c, 0x9c, 0x0d, 0x3d, 0xe3, 0xff, 0x87, 0x8a, 0x46, 0x6a, 0xec, 0x0d, 0x32, 0x5b, 0x0a, 0x40, 0xf1, 0x34, 0xf0, 0xa7, 0xd2, 0x8f, 0xc2, 0x7e, 0x93, 0x65, 0xc8, 0x47, 0xbe, 0x28, 0x9c,
0xdd, 0x4c, 0xca, 0x96, 0x34, 0x8b, 0x65, 0x09, 0xed, 0x8c, 0x04, 0xbf, 0x19, 0x39, 0x3e, 0xc7, 0x8f, 0x7c, 0xf3, 0xff, 0x86, 0x9a, 0x46, 0x6a, 0xe4, 0x2d, 0x34, 0x5b, 0x32, 0xdd, 0x4c, 0xc8,
0x3b, 0xdd, 0x96, 0xcf, 0x2f, 0xb9, 0x1f, 0x28, 0xbf, 0x56, 0x3d, 0xca, 0x30, 0x09, 0x6e, 0xfc, 0x96, 0x38, 0x8b, 0x55, 0x01, 0xed, 0x8e, 0x19, 0xbf, 0x19, 0xbb, 0x01, 0xe5, 0x77, 0xba, 0xed,
0x1a, 0xac, 0x25, 0xd6, 0x56, 0xb2, 0x88, 0xb7, 0x60, 0x09, 0xe7, 0x4d, 0x05, 0x4f, 0x24, 0x6f, 0x80, 0x5e, 0xd0, 0x20, 0x94, 0x7e, 0x2d, 0x43, 0x65, 0x58, 0x08, 0x37, 0x7f, 0x0d, 0xd6, 0x12,
0x6c, 0xca, 0x3c, 0xbc, 0xbf, 0x4e, 0x2e, 0x39, 0x6b, 0xea, 0x7b, 0xa7, 0xd8, 0x48, 0xc6, 0xac, 0x6b, 0x2b, 0x58, 0xc4, 0x3b, 0xb0, 0xc4, 0xe7, 0x4d, 0x06, 0x4f, 0x24, 0x6f, 0x6c, 0x8a, 0x3c,
0x48, 0xd8, 0xb1, 0xef, 0x9d, 0x1a, 0x7f, 0x90, 0x83, 0xdc, 0x81, 0x37, 0xd5, 0xe3, 0x1d, 0x33, 0x7e, 0x7f, 0x1d, 0x5d, 0x72, 0xf6, 0x2c, 0xf0, 0x4f, 0x78, 0x23, 0x39, 0xab, 0x26, 0x60, 0x47,
0x0b, 0xf1, 0x8e, 0x52, 0xe1, 0xb4, 0x22, 0x85, 0x52, 0xca, 0xec, 0xe8, 0x8c, 0x52, 0x4a, 0xe5, 0x81, 0x7f, 0x62, 0xfe, 0x61, 0x01, 0x0a, 0xfb, 0xfe, 0x4c, 0x8f, 0x77, 0xcc, 0x2d, 0xc4, 0x3b,
0x03, 0x58, 0x16, 0x7c, 0x22, 0xf4, 0x84, 0xc6, 0xfe, 0xdc, 0xf6, 0x49, 0x20, 0xa6, 0xf0, 0xe1, 0x0a, 0x85, 0xd3, 0x56, 0x0a, 0xa5, 0x90, 0xd9, 0xb9, 0x33, 0x4a, 0x2a, 0x95, 0xf7, 0x60, 0x99,
0xaa, 0x3d, 0x09, 0x07, 0xde, 0x3e, 0xc1, 0xd9, 0x3a, 0xe4, 0x22, 0xf5, 0x05, 0xb3, 0x45, 0x92, 0xf1, 0x89, 0xc8, 0x67, 0x1a, 0xfb, 0x0b, 0x27, 0x40, 0x81, 0x18, 0xc3, 0x87, 0xeb, 0xce, 0x34,
0x6d, 0xc2, 0x12, 0xde, 0x4e, 0xb8, 0x96, 0xce, 0x7f, 0x99, 0x62, 0xdf, 0x81, 0xb5, 0x64, 0xbd, 0x1a, 0xfa, 0x7b, 0x08, 0x27, 0xeb, 0x50, 0x50, 0xea, 0x0b, 0xcf, 0x66, 0x49, 0xb2, 0x09, 0x4b,
0xc4, 0x8a, 0xa4, 0x6c, 0xa4, 0x57, 0x8c, 0x3c, 0xe9, 0x36, 0x08, 0x3e, 0x42, 0x38, 0x32, 0xc8, 0xfc, 0x76, 0xc2, 0x95, 0x70, 0xfe, 0x8b, 0x14, 0xf9, 0x1e, 0xac, 0x25, 0xeb, 0x45, 0x56, 0x24,
0xe8, 0x8c, 0x73, 0xcc, 0xd2, 0x98, 0x5e, 0x29, 0xc1, 0xf4, 0xee, 0x41, 0x25, 0x1c, 0x5f, 0x5a, 0x64, 0x23, 0xbd, 0x62, 0xce, 0x93, 0x6e, 0x02, 0xe3, 0x23, 0x88, 0x23, 0x82, 0x8c, 0x4e, 0x29,
0x53, 0xfb, 0x7a, 0xec, 0xd9, 0x23, 0xb9, 0xbf, 0x21, 0x1c, 0x5f, 0x1e, 0x13, 0x84, 0xbd, 0x0f, 0xe5, 0x59, 0x1a, 0xd3, 0xab, 0x24, 0x98, 0xde, 0x1d, 0xa8, 0x45, 0x93, 0x0b, 0x7b, 0xe6, 0x5c,
0x30, 0x99, 0x4e, 0xe5, 0xde, 0x43, 0x07, 0x4b, 0x4c, 0xca, 0x47, 0xc7, 0xc7, 0x44, 0x72, 0x66, 0x4d, 0x7c, 0x67, 0x2c, 0xf6, 0x37, 0x44, 0x93, 0x8b, 0x23, 0x84, 0x90, 0x0f, 0x01, 0xa6, 0xb3,
0x79, 0x32, 0x9d, 0xd2, 0x4f, 0xb6, 0x07, 0xcb, 0xa9, 0xf7, 0xae, 0xef, 0xaa, 0x28, 0x72, 0x6f, 0x99, 0xd8, 0x7b, 0xdc, 0xc1, 0x12, 0x93, 0xf2, 0xe1, 0xd1, 0x11, 0x92, 0x9c, 0x55, 0x9d, 0xce,
0xba, 0x93, 0xb2, 0x39, 0x6b, 0x43, 0x1d, 0xb6, 0xfd, 0x23, 0x60, 0x7f, 0xc2, 0xdb, 0xcf, 0x03, 0x66, 0xf8, 0x93, 0xec, 0xc2, 0x72, 0xe6, 0xbd, 0xeb, 0xdb, 0x32, 0x8a, 0xdc, 0x9f, 0x3d, 0xc8,
0x28, 0x47, 0xfd, 0xd3, 0x2f, 0x0f, 0xe3, 0xf5, 0x98, 0x4a, 0xe2, 0xf2, 0x70, 0x73, 0x34, 0xf2, 0xd8, 0x9c, 0x8d, 0x91, 0x0e, 0xdb, 0xfe, 0x31, 0x90, 0x3f, 0xe5, 0xed, 0xe7, 0x21, 0x54, 0x55,
0x05, 0x5f, 0xa4, 0x03, 0x33, 0x62, 0xf9, 0xa0, 0x9d, 0x98, 0xf2, 0xfe, 0x85, 0xf1, 0x5f, 0x33, 0xff, 0xf4, 0xcb, 0xc3, 0xfc, 0x7a, 0x4c, 0x2d, 0x71, 0x79, 0xb8, 0x35, 0x1e, 0x07, 0x8c, 0x2f,
0x50, 0xa0, 0x9b, 0xcc, 0x6f, 0xc3, 0x0a, 0xe1, 0x47, 0xb1, 0xa3, 0x32, 0x64, 0x80, 0xce, 0xdd, 0xe2, 0x81, 0xa9, 0x58, 0x3e, 0x68, 0x27, 0xa6, 0xb8, 0x7f, 0x61, 0xfe, 0xa7, 0x1c, 0x94, 0xf0,
0x81, 0x0c, 0x1b, 0x15, 0xdb, 0x42, 0x7b, 0xdd, 0x21, 0x1b, 0xad, 0xbc, 0xf6, 0xc2, 0xc3, 0x3d, 0x26, 0xf3, 0xbb, 0xb0, 0x82, 0xf8, 0x2a, 0x76, 0x54, 0x84, 0x0c, 0xe0, 0xb9, 0x3b, 0x14, 0x61,
0x28, 0x47, 0x4d, 0x6b, 0xa4, 0x53, 0x52, 0x2d, 0xb3, 0xd7, 0x21, 0x7f, 0xe1, 0x4d, 0x95, 0xe5, 0xa3, 0x6c, 0x5b, 0x68, 0xaf, 0x3b, 0xe4, 0xd5, 0xca, 0x6b, 0x2f, 0x3c, 0xdc, 0x81, 0xaa, 0x6a,
0x07, 0xe2, 0x99, 0x34, 0x11, 0x1e, 0xf7, 0x45, 0xb4, 0x11, 0xdf, 0x0b, 0xc9, 0xc9, 0xbe, 0x88, 0x5a, 0x23, 0x9d, 0x8a, 0x6c, 0x99, 0xbc, 0x09, 0xc5, 0x73, 0x7f, 0x26, 0x2d, 0x3f, 0x10, 0xcf,
0x46, 0x90, 0x0c, 0x16, 0xc7, 0xb8, 0x94, 0x32, 0xc6, 0x13, 0x58, 0x11, 0x7c, 0x40, 0x8b, 0x5b, 0xa4, 0xc5, 0xe1, 0x71, 0x5f, 0x58, 0x1b, 0xf1, 0xbd, 0x90, 0x82, 0xe8, 0x0b, 0x6b, 0x84, 0x93,
0xb8, 0xf9, 0xd0, 0xfc, 0xb6, 0x90, 0xf0, 0x86, 0xe3, 0xd9, 0x88, 0xeb, 0xb6, 0x37, 0x0c, 0x04, 0xc1, 0xe2, 0x18, 0x97, 0x32, 0xc6, 0x78, 0x0c, 0x2b, 0x8c, 0x0f, 0x68, 0x71, 0x0b, 0xd7, 0x1f,
0x94, 0x70, 0x25, 0x59, 0x1b, 0xbf, 0x93, 0x21, 0xfe, 0x22, 0xea, 0x65, 0x0f, 0x20, 0xef, 0xaa, 0x9a, 0xdf, 0x65, 0x12, 0xde, 0x68, 0x32, 0x1f, 0x53, 0xdd, 0xf6, 0xc6, 0x03, 0x01, 0x05, 0x5c,
0x18, 0x87, 0x58, 0x8e, 0x8b, 0xee, 0x29, 0x09, 0x3c, 0x13, 0x31, 0xc4, 0xd2, 0x61, 0x64, 0x80, 0x4a, 0xd6, 0xe6, 0xef, 0xe4, 0x90, 0xbf, 0xb0, 0x7a, 0xc9, 0x3d, 0x28, 0x7a, 0x32, 0xc6, 0x21,
0x5e, 0x7b, 0xcd, 0xac, 0xb8, 0xb3, 0x49, 0x64, 0xba, 0xfa, 0x96, 0x1a, 0xd6, 0x9c, 0xd9, 0x87, 0x96, 0xe3, 0xd4, 0x3d, 0x25, 0x86, 0x67, 0x71, 0x0c, 0xb6, 0x74, 0x3c, 0x32, 0x40, 0xaf, 0xbd,
0x46, 0x1f, 0x6d, 0xd3, 0x1d, 0x2d, 0xa2, 0x30, 0x9f, 0x38, 0x31, 0x95, 0x14, 0x38, 0x3a, 0xe7, 0x61, 0xd5, 0xbc, 0xf9, 0x54, 0x99, 0xae, 0xbe, 0x23, 0x87, 0x95, 0x32, 0xfb, 0xe0, 0xe8, 0xd5,
0x5a, 0x24, 0xe1, 0xef, 0x66, 0xa1, 0x96, 0xe8, 0x11, 0x86, 0x54, 0x8a, 0x03, 0x80, 0xfc, 0x4e, 0x36, 0x7d, 0xa0, 0x45, 0x14, 0x16, 0x13, 0x27, 0xa6, 0x94, 0x02, 0xc7, 0x67, 0x54, 0x8b, 0x24,
0x72, 0xbd, 0x41, 0x80, 0xa4, 0xa0, 0xae, 0xcd, 0x53, 0x36, 0x31, 0x4f, 0x51, 0x90, 0x52, 0x4e, 0xfc, 0xbd, 0x3c, 0x34, 0x12, 0x3d, 0xe2, 0x21, 0x95, 0xec, 0x00, 0x40, 0xbf, 0x93, 0x58, 0x6f,
0x0f, 0x52, 0x7a, 0x04, 0xe5, 0xf8, 0x55, 0x8f, 0x64, 0x97, 0x44, 0x7b, 0xea, 0xb6, 0x56, 0x8c, 0x60, 0x20, 0x21, 0xa8, 0x6b, 0xf3, 0x94, 0x4f, 0xcc, 0x93, 0x0a, 0x52, 0x2a, 0xe8, 0x41, 0x4a,
0x14, 0x87, 0x35, 0x15, 0xf4, 0xb0, 0xa6, 0x1f, 0x68, 0x51, 0x30, 0x4b, 0x58, 0x8d, 0x91, 0x36, 0x0f, 0xa1, 0x1a, 0xbf, 0xea, 0x91, 0xec, 0x12, 0x6b, 0x4f, 0xde, 0xd6, 0x8a, 0x91, 0xe2, 0xb0,
0xa3, 0xbf, 0x90, 0x18, 0x18, 0xe3, 0x33, 0xa8, 0x68, 0x9d, 0xd7, 0x23, 0x49, 0x32, 0x89, 0x48, 0xa6, 0x92, 0x1e, 0xd6, 0xf4, 0x43, 0x2d, 0x0a, 0x66, 0x89, 0x57, 0x63, 0x66, 0xcd, 0xe8, 0x2f,
0x92, 0xe8, 0xb6, 0x65, 0x36, 0xbe, 0x6d, 0x69, 0xfc, 0xb9, 0x2c, 0xd4, 0xc4, 0xfe, 0x72, 0xdc, 0x24, 0x06, 0xc6, 0x7c, 0x02, 0x35, 0xad, 0xf3, 0x7a, 0x24, 0x49, 0x2e, 0x11, 0x49, 0xa2, 0x6e,
0xf3, 0x63, 0x6f, 0xec, 0x0c, 0xd1, 0x0f, 0x15, 0xed, 0x30, 0x29, 0x68, 0xa9, 0x7d, 0x26, 0xb7, 0x5b, 0xe6, 0xe3, 0xdb, 0x96, 0xe6, 0x9f, 0xc9, 0x43, 0x83, 0xed, 0x2f, 0xd7, 0x3b, 0x3b, 0xf2,
0x18, 0xc9, 0x59, 0xfa, 0x55, 0x73, 0x62, 0xd2, 0xd1, 0x55, 0x73, 0x03, 0x6a, 0x82, 0x31, 0xa2, 0x27, 0xee, 0x88, 0xfb, 0xa1, 0xd4, 0x0e, 0x13, 0x82, 0x96, 0xdc, 0x67, 0x62, 0x8b, 0xa1, 0x9c,
0x47, 0x29, 0x7e, 0x1b, 0xc4, 0xac, 0x9c, 0x71, 0xbe, 0x6b, 0x07, 0xc4, 0x21, 0xbf, 0x03, 0x6b, 0xa5, 0x5f, 0x35, 0x47, 0x26, 0xad, 0xae, 0x9a, 0x9b, 0xd0, 0x60, 0x8c, 0x91, 0x7b, 0x94, 0xe2,
0x02, 0x07, 0x6f, 0xd9, 0x4e, 0x9c, 0xf1, 0xd8, 0x89, 0x2f, 0x62, 0xe5, 0xcc, 0xfa, 0x19, 0xe7, 0xb7, 0x41, 0xac, 0xda, 0x29, 0xa5, 0x3b, 0x4e, 0x88, 0x1c, 0xf2, 0x7b, 0xb0, 0xc6, 0x70, 0xf8,
0xa6, 0x1d, 0xf2, 0x23, 0x91, 0x21, 0x9f, 0x12, 0x29, 0x8d, 0x9c, 0xc0, 0x3e, 0x8d, 0x03, 0x5f, 0x2d, 0xdb, 0xa9, 0x3b, 0x99, 0xb8, 0xf1, 0x45, 0xac, 0x82, 0x65, 0x9c, 0x52, 0x6a, 0x39, 0x11,
0xa3, 0x34, 0x7a, 0xaf, 0xed, 0x2b, 0xcd, 0x7b, 0xbd, 0x24, 0xef, 0x68, 0xd9, 0x57, 0x91, 0xf7, 0x3d, 0x64, 0x19, 0xe2, 0x29, 0x91, 0xca, 0xd8, 0x0d, 0x9d, 0x93, 0x38, 0xf0, 0x55, 0xa5, 0xb9,
0x7a, 0x8e, 0x92, 0x8a, 0xf3, 0x94, 0x64, 0xfc, 0xf3, 0x2c, 0x54, 0x34, 0xb2, 0x7c, 0x95, 0xd3, 0xf7, 0xda, 0xb9, 0xd4, 0xbc, 0xd7, 0x4b, 0xe2, 0x8e, 0x96, 0x73, 0xa9, 0xbc, 0xd7, 0x29, 0x4a,
0xf5, 0xee, 0x82, 0xdf, 0xb0, 0xac, 0xbb, 0x08, 0xdf, 0x4c, 0x36, 0x99, 0x8b, 0x6e, 0xeb, 0xe8, 0x2a, 0xa7, 0x29, 0xc9, 0xfc, 0xa7, 0x79, 0xa8, 0x69, 0x64, 0xf9, 0x3a, 0xa7, 0xeb, 0xed, 0x05,
0x04, 0x7c, 0x07, 0xca, 0x62, 0xd7, 0x7d, 0x80, 0x26, 0x58, 0xf9, 0x94, 0x0f, 0x02, 0x8e, 0x67, 0xbf, 0x61, 0x55, 0x77, 0x11, 0xbe, 0x9d, 0x6c, 0xb2, 0xa0, 0x6e, 0xeb, 0xe8, 0x04, 0x7c, 0x0b,
0xa7, 0x2a, 0xf3, 0x31, 0x66, 0x16, 0xe2, 0xcc, 0xc7, 0x22, 0xf3, 0x45, 0xd1, 0xfa, 0x1f, 0x43, 0xaa, 0x6c, 0xd7, 0x7d, 0xc4, 0x4d, 0xb0, 0xe2, 0x29, 0x1f, 0x0e, 0x38, 0x9a, 0x9f, 0xc8, 0xcc,
0x55, 0xd6, 0x8a, 0x6b, 0x8a, 0xc3, 0x8d, 0x77, 0x7d, 0x62, 0xbd, 0xcd, 0x0a, 0x35, 0x47, 0x8b, 0x47, 0x3c, 0xb3, 0x14, 0x67, 0x3e, 0x62, 0x99, 0x2f, 0x8b, 0xd6, 0xff, 0x14, 0xea, 0xa2, 0x56,
0x2f, 0x0b, 0x3e, 0x56, 0x05, 0x4b, 0x2f, 0x2b, 0xf8, 0x98, 0x12, 0xc6, 0x7e, 0x74, 0x01, 0x02, 0xbe, 0xa6, 0x7c, 0xb8, 0xf1, 0xae, 0x4f, 0xac, 0xb7, 0x55, 0xc3, 0xe6, 0x70, 0xf1, 0x45, 0xc1,
0xe3, 0xcf, 0x14, 0x1f, 0x7b, 0x1f, 0xd6, 0x14, 0xbb, 0x9a, 0xb9, 0xb6, 0xeb, 0x7a, 0x33, 0x77, 0x47, 0xb2, 0x60, 0xe5, 0x55, 0x05, 0x1f, 0x61, 0xc2, 0xdc, 0x53, 0x17, 0x20, 0x78, 0xfc, 0x99,
0xc8, 0xd5, 0x85, 0x4b, 0x26, 0xb3, 0x4e, 0xe2, 0x1c, 0x63, 0x14, 0xdd, 0xde, 0xa7, 0x38, 0xb6, 0xe4, 0x63, 0x1f, 0xc2, 0x9a, 0x64, 0x57, 0x73, 0xcf, 0xf1, 0x3c, 0x7f, 0xee, 0x8d, 0xa8, 0xbc,
0x87, 0x50, 0x20, 0xb9, 0x9c, 0x84, 0x8f, 0x74, 0xc6, 0x45, 0x28, 0xec, 0x01, 0x14, 0x48, 0x3c, 0x70, 0x49, 0x44, 0xd6, 0x71, 0x9c, 0x63, 0x8e, 0xd5, 0xed, 0x7d, 0x8c, 0x63, 0xbb, 0x0f, 0x25,
0xcf, 0xde, 0xc8, 0x6c, 0x08, 0xc1, 0x68, 0x02, 0x13, 0x05, 0x8f, 0x78, 0xe8, 0x3b, 0xc3, 0x20, 0x94, 0xcb, 0x51, 0xf8, 0xc8, 0x66, 0x5c, 0x88, 0x42, 0xee, 0x41, 0x09, 0xc5, 0xf3, 0xfc, 0xb5,
0xbe, 0xcb, 0x59, 0x10, 0xfa, 0x27, 0xb5, 0x15, 0x5b, 0x6e, 0x63, 0x4c, 0xd4, 0x51, 0x09, 0x47, 0xcc, 0x06, 0x11, 0xcc, 0x16, 0x10, 0x56, 0xf0, 0x90, 0x46, 0x81, 0x3b, 0x0a, 0xe3, 0xbb, 0x9c,
0x1c, 0x4c, 0x6b, 0x89, 0x3a, 0xa4, 0xb8, 0x34, 0x86, 0xcd, 0x53, 0x1e, 0x3e, 0xe7, 0xdc, 0x75, 0x25, 0xa6, 0x7f, 0x62, 0x5b, 0xb1, 0xe5, 0x36, 0xc6, 0xe4, 0x3a, 0x2a, 0xe2, 0xb0, 0x83, 0x69,
0x85, 0x30, 0x34, 0xe4, 0x6e, 0xe8, 0xdb, 0x63, 0xb1, 0x48, 0x34, 0x82, 0x0f, 0x17, 0x6a, 0x8d, 0x2d, 0x51, 0x87, 0x10, 0x97, 0x26, 0xb0, 0x79, 0x42, 0xa3, 0x17, 0x94, 0x7a, 0x1e, 0x13, 0x86,
0x6d, 0x20, 0xbb, 0x71, 0xc1, 0x56, 0x54, 0x8e, 0x78, 0xc7, 0xc6, 0x69, 0x5a, 0xde, 0xf6, 0xaf, 0x46, 0xd4, 0x8b, 0x02, 0x67, 0xc2, 0x16, 0x09, 0x47, 0xf0, 0x78, 0xa1, 0xd6, 0xd8, 0x06, 0xb2,
0xc2, 0xf6, 0xcd, 0x85, 0x52, 0xee, 0x71, 0x3f, 0x48, 0x72, 0x95, 0xc8, 0x0f, 0x38, 0xf6, 0xec, 0x13, 0x17, 0x6c, 0xab, 0x72, 0xc8, 0x3b, 0x36, 0x4e, 0xb2, 0xf2, 0xb6, 0x7f, 0x15, 0xb6, 0xaf,
0x90, 0x7a, 0xa3, 0x73, 0x96, 0x2e, 0x54, 0xb4, 0x9c, 0xf8, 0xec, 0xcf, 0xa0, 0x70, 0x47, 0x09, 0x2f, 0x94, 0x71, 0x8f, 0xfb, 0x5e, 0x92, 0xab, 0x28, 0x3f, 0xe0, 0xc4, 0x77, 0x22, 0xec, 0x8d,
0x71, 0x22, 0xb9, 0x9e, 0x3f, 0x41, 0xbf, 0xdb, 0xc8, 0x8a, 0x6b, 0xcf, 0x98, 0x2b, 0x31, 0x1c, 0xce, 0x59, 0x7a, 0x50, 0xd3, 0x72, 0xe2, 0xb3, 0x3f, 0xc7, 0x85, 0x3b, 0x4c, 0xb0, 0x13, 0xc9,
0x23, 0x27, 0x8c, 0x1d, 0x58, 0x41, 0xc9, 0x5e, 0x3b, 0xe8, 0x5e, 0x24, 0x0c, 0x1a, 0xeb, 0xc0, 0xf3, 0x83, 0x29, 0xf7, 0xbb, 0x8d, 0xed, 0xb8, 0xf6, 0x9c, 0xb5, 0x12, 0xc3, 0x79, 0xe4, 0x84,
0xba, 0xc4, 0xbb, 0xf4, 0x98, 0xbe, 0xff, 0x90, 0x83, 0x8a, 0x06, 0x16, 0xa7, 0x11, 0x06, 0x42, 0xf9, 0x00, 0x56, 0xb8, 0x64, 0xaf, 0x1d, 0x74, 0x2f, 0x13, 0x06, 0xcd, 0x75, 0x20, 0x3d, 0xe4,
0x5a, 0x23, 0xc7, 0x9e, 0x70, 0xe5, 0xe4, 0xac, 0x99, 0x35, 0x84, 0xee, 0x49, 0xa0, 0x38, 0x8b, 0x5d, 0x7a, 0x4c, 0xdf, 0xbf, 0x2d, 0x40, 0x4d, 0x03, 0xb3, 0xd3, 0x88, 0x07, 0x42, 0xda, 0x63,
0xed, 0xcb, 0x73, 0xcb, 0x9b, 0x85, 0xd6, 0x88, 0x9f, 0xfb, 0x5c, 0xf5, 0xb2, 0x6a, 0x5f, 0x9e, 0xd7, 0x99, 0x52, 0xe9, 0xe4, 0x6c, 0x58, 0x0d, 0x0e, 0xdd, 0x15, 0x40, 0x76, 0x16, 0x3b, 0x17,
0xf7, 0x66, 0xe1, 0x1e, 0xc2, 0x04, 0x96, 0xe0, 0x25, 0x1a, 0x96, 0x8c, 0x8b, 0x9b, 0xd8, 0x57, 0x67, 0xb6, 0x3f, 0x8f, 0xec, 0x31, 0x3d, 0x0b, 0xa8, 0xec, 0x65, 0xdd, 0xb9, 0x38, 0xeb, 0xcf,
0x31, 0x96, 0x0c, 0x20, 0x25, 0xca, 0xcc, 0x47, 0x01, 0xa4, 0xa4, 0x2d, 0xce, 0x1f, 0xa0, 0x85, 0xa3, 0x5d, 0x0e, 0x63, 0x58, 0x8c, 0x97, 0x68, 0x58, 0x22, 0x2e, 0x6e, 0xea, 0x5c, 0xc6, 0x58,
0xc5, 0x03, 0xf4, 0x7b, 0xb0, 0x49, 0x07, 0xa8, 0x64, 0xcd, 0xd6, 0xdc, 0x4e, 0x5e, 0xc7, 0x5c, 0x22, 0x80, 0x14, 0x29, 0xb3, 0xa8, 0x02, 0x48, 0x51, 0x5b, 0x4c, 0x1f, 0xa0, 0xa5, 0xc5, 0x03,
0x39, 0x48, 0x4d, 0xec, 0xad, 0x8b, 0x11, 0x28, 0xb6, 0x14, 0x38, 0x3f, 0x25, 0x46, 0x96, 0x31, 0xf4, 0x63, 0xd8, 0xc4, 0x03, 0x54, 0xb0, 0x66, 0x3b, 0xb5, 0x93, 0xd7, 0x79, 0xae, 0x18, 0xa4,
0xc5, 0xc8, 0x64, 0xe5, 0x7d, 0xe7, 0xa7, 0x5c, 0x60, 0x62, 0x04, 0x8e, 0x8e, 0x29, 0xef, 0xe2, 0x26, 0xf6, 0x1a, 0x6c, 0x04, 0x92, 0x2d, 0x85, 0xee, 0xcf, 0x90, 0x91, 0xe5, 0x2c, 0x36, 0x32,
0x4c, 0x1c, 0x77, 0x1e, 0xd3, 0xbe, 0x4a, 0x62, 0x96, 0x25, 0xa6, 0x7d, 0xa5, 0x63, 0x7e, 0x08, 0x51, 0xf9, 0xc0, 0xfd, 0x19, 0x65, 0x98, 0x3c, 0x02, 0x47, 0xc7, 0x14, 0x77, 0x71, 0xa6, 0xae,
0x5b, 0x13, 0x3e, 0x72, 0xec, 0x64, 0xb5, 0x56, 0x2c, 0xb8, 0xad, 0x53, 0xb6, 0x56, 0xa6, 0x4f, 0x97, 0xc6, 0x74, 0x2e, 0x93, 0x98, 0x55, 0x81, 0xe9, 0x5c, 0xea, 0x98, 0x8f, 0x61, 0x6b, 0x4a,
0x8a, 0xbb, 0x98, 0x8d, 0x9f, 0x7a, 0x93, 0x53, 0x87, 0x64, 0x16, 0x8a, 0x09, 0xca, 0x9b, 0xcb, 0xc7, 0xae, 0x93, 0xac, 0xd6, 0x8e, 0x05, 0xb7, 0x75, 0xcc, 0xd6, 0xca, 0x0c, 0x50, 0x71, 0x67,
0xee, 0x6c, 0xf2, 0x2b, 0x08, 0x16, 0x45, 0x02, 0xa3, 0x06, 0x95, 0x7e, 0xe8, 0x4d, 0xd5, 0x32, 0xb3, 0xf1, 0x33, 0x7f, 0x7a, 0xe2, 0xa2, 0xcc, 0x82, 0x31, 0x41, 0x45, 0x6b, 0xd9, 0x9b, 0x4f,
0x2f, 0x43, 0x95, 0x92, 0xf2, 0x16, 0xf3, 0x1d, 0xb8, 0x8d, 0x2c, 0x61, 0xe0, 0x4d, 0xbd, 0xb1, 0x7f, 0x85, 0x83, 0x59, 0x91, 0xd0, 0x6c, 0x40, 0x6d, 0x10, 0xf9, 0x33, 0xb9, 0xcc, 0xcb, 0x50,
0x77, 0x7e, 0x9d, 0xb0, 0xe3, 0xfd, 0xeb, 0x0c, 0xac, 0x25, 0x72, 0x25, 0x7b, 0xfd, 0x1e, 0xf1, 0xc7, 0xa4, 0xb8, 0xc5, 0x7c, 0x0b, 0x6e, 0x72, 0x96, 0x30, 0xf4, 0x67, 0xfe, 0xc4, 0x3f, 0xbb,
0xb3, 0xe8, 0x0e, 0x66, 0x26, 0x71, 0x01, 0x47, 0xac, 0x17, 0x21, 0x12, 0x33, 0x53, 0xf7, 0x32, 0x4a, 0xd8, 0xf1, 0xfe, 0x65, 0x0e, 0xd6, 0x12, 0xb9, 0x82, 0xbd, 0x7e, 0x8c, 0xfc, 0x4c, 0xdd,
0x9b, 0xf1, 0x73, 0x2b, 0xaa, 0x20, 0xb1, 0x94, 0xc6, 0x22, 0x4b, 0x91, 0xe5, 0xd5, 0x43, 0x2c, 0xc1, 0xcc, 0x25, 0x2e, 0xe0, 0xb0, 0xf5, 0x42, 0x44, 0x64, 0x66, 0xf2, 0x5e, 0x66, 0x2b, 0x7e,
0xaa, 0x8a, 0x5f, 0x92, 0xf7, 0xa5, 0x46, 0x72, 0xc8, 0xb9, 0xe4, 0x8d, 0x0a, 0xdd, 0xe6, 0xa7, 0x6e, 0x45, 0x16, 0x44, 0x96, 0xd2, 0x5c, 0x64, 0x29, 0xa2, 0xbc, 0x7c, 0x88, 0x45, 0x56, 0xf1,
0x7a, 0x10, 0x1b, 0x02, 0x03, 0xe3, 0xef, 0x65, 0x00, 0xe2, 0xde, 0xe1, 0x9d, 0x8e, 0x48, 0x6e, 0x4b, 0xe2, 0xbe, 0xd4, 0x58, 0x0c, 0xb9, 0x90, 0xbc, 0x51, 0xa1, 0xdb, 0xfc, 0x64, 0x0f, 0x62,
0xc9, 0x60, 0x38, 0xae, 0x26, 0xa3, 0xbc, 0x01, 0xd5, 0x28, 0x72, 0x3b, 0x96, 0x84, 0x2a, 0x0a, 0x43, 0x60, 0x68, 0xfe, 0x9d, 0x1c, 0x40, 0xdc, 0x3b, 0x7e, 0xa7, 0x43, 0xc9, 0x2d, 0x39, 0x1e,
0x26, 0xc4, 0xa1, 0x77, 0x60, 0xe5, 0x7c, 0xec, 0x9d, 0xa2, 0xc4, 0x2a, 0xe5, 0x16, 0x8a, 0x89, 0x8e, 0xab, 0xc9, 0x28, 0x6f, 0x41, 0x5d, 0x45, 0x6e, 0xc7, 0x92, 0x50, 0x4d, 0xc2, 0x98, 0x38,
0x5b, 0x26, 0xb0, 0x92, 0x46, 0x62, 0xb9, 0x29, 0x9f, 0x1a, 0xdc, 0xad, 0x4b, 0x41, 0xc6, 0x5f, 0xf4, 0x1e, 0xac, 0x9c, 0x4d, 0xfc, 0x13, 0x2e, 0xb1, 0x0a, 0xb9, 0x05, 0x63, 0xe2, 0x96, 0x11,
0xc9, 0x46, 0xe1, 0xa1, 0xf1, 0x4c, 0xbc, 0x58, 0xbd, 0xfb, 0x79, 0x42, 0x6d, 0x5e, 0xe4, 0x5e, 0x2c, 0xa5, 0x91, 0x58, 0x6e, 0x2a, 0x66, 0x06, 0x77, 0xeb, 0x52, 0x90, 0xf9, 0x97, 0xf2, 0x2a,
0xfc, 0x0c, 0x96, 0x7d, 0x3a, 0x94, 0xd4, 0x89, 0x95, 0x7f, 0xc1, 0x89, 0x55, 0xf3, 0x13, 0x92, 0x3c, 0x34, 0x9e, 0x89, 0x97, 0xab, 0x77, 0x3f, 0x4f, 0xa8, 0xcd, 0xcb, 0xdc, 0x8b, 0x4f, 0x60,
0xce, 0xb7, 0xa1, 0x6e, 0x8f, 0x2e, 0xb9, 0x1f, 0x3a, 0x68, 0xad, 0x47, 0xf9, 0x58, 0x06, 0x64, 0x39, 0xc0, 0x43, 0x49, 0x9e, 0x58, 0xc5, 0x97, 0x9c, 0x58, 0x8d, 0x20, 0x21, 0xe9, 0x7c, 0x17,
0x6a, 0x70, 0x14, 0x44, 0xdf, 0x81, 0x15, 0x79, 0xb3, 0x3e, 0xc2, 0x94, 0xef, 0x7a, 0xc5, 0x60, 0x0c, 0x67, 0x7c, 0x41, 0x83, 0xc8, 0xe5, 0xd6, 0x7a, 0x2e, 0x1f, 0x8b, 0x80, 0x4c, 0x0d, 0xce,
0x81, 0x68, 0xfc, 0x23, 0x15, 0x8f, 0x9a, 0x5c, 0xdd, 0x17, 0xcf, 0x8a, 0x3e, 0xc2, 0xec, 0xa2, 0x05, 0xd1, 0xf7, 0x60, 0x45, 0xdc, 0xac, 0x57, 0x98, 0xe2, 0x5d, 0xaf, 0x18, 0xcc, 0x10, 0xcd,
0x03, 0x55, 0x12, 0x92, 0x74, 0x02, 0x48, 0x7e, 0x44, 0x40, 0xe9, 0x02, 0x48, 0x4e, 0x6b, 0xfe, 0x7f, 0x20, 0xe3, 0x51, 0x93, 0xab, 0xfb, 0xf2, 0x59, 0xd1, 0x47, 0x98, 0x5f, 0x74, 0xa0, 0x0a,
0x55, 0xa6, 0xd5, 0xf8, 0x37, 0x19, 0x28, 0x1e, 0x78, 0xd3, 0x03, 0x87, 0x6e, 0x35, 0xe0, 0x36, 0x42, 0x12, 0x4e, 0x00, 0xc1, 0x8f, 0x10, 0x28, 0x5c, 0x00, 0xc9, 0x69, 0x2d, 0xbe, 0xce, 0xb4,
0x89, 0x7c, 0x54, 0x4b, 0x22, 0x89, 0x71, 0x41, 0x2f, 0xb8, 0x9b, 0x98, 0x2a, 0xe6, 0xd5, 0x92, 0x9a, 0xff, 0x2a, 0x07, 0xe5, 0x7d, 0x7f, 0xb6, 0xef, 0xe2, 0xad, 0x06, 0xbe, 0x4d, 0x94, 0x8f,
0x62, 0xde, 0x0f, 0xe0, 0x0e, 0xba, 0x00, 0x7d, 0x6f, 0xea, 0xf9, 0x62, 0xab, 0xda, 0x63, 0x12, 0x6a, 0x89, 0x25, 0x79, 0x5c, 0xd0, 0x4b, 0xee, 0x26, 0x66, 0x8a, 0x79, 0x8d, 0xa4, 0x98, 0xf7,
0xf7, 0x3c, 0x37, 0xbc, 0x50, 0xbc, 0xf3, 0xf6, 0x19, 0xe7, 0xc7, 0x1a, 0xc6, 0x51, 0x84, 0x80, 0x43, 0xb8, 0xc5, 0x5d, 0x80, 0x81, 0x3f, 0xf3, 0x03, 0xb6, 0x55, 0x9d, 0x09, 0x8a, 0x7b, 0xbe,
0xf7, 0x92, 0xc7, 0xe1, 0xa5, 0x45, 0x1a, 0xba, 0x94, 0x47, 0x89, 0xa3, 0xae, 0x88, 0x8c, 0x36, 0x17, 0x9d, 0x4b, 0xde, 0x79, 0xf3, 0x94, 0xd2, 0x23, 0x0d, 0xe3, 0x50, 0x21, 0xf0, 0x7b, 0xc9,
0xc2, 0x51, 0x22, 0x35, 0x3e, 0x81, 0x72, 0x64, 0xec, 0x61, 0xef, 0x42, 0xf9, 0xc2, 0x9b, 0x4a, 0x93, 0xe8, 0xc2, 0x46, 0x0d, 0x5d, 0xc8, 0xa3, 0xc8, 0x51, 0x57, 0x58, 0x46, 0x87, 0xc3, 0xb9,
0x8b, 0x50, 0x26, 0x71, 0x7f, 0x53, 0x8e, 0xda, 0x2c, 0x5d, 0xd0, 0x8f, 0xc0, 0xf8, 0x83, 0x22, 0x44, 0x6a, 0x7e, 0x06, 0x55, 0x65, 0xec, 0x21, 0xef, 0x43, 0xf5, 0xdc, 0x9f, 0x09, 0x8b, 0x50,
0x14, 0x3b, 0xee, 0xa5, 0xe7, 0x0c, 0x31, 0xa2, 0x75, 0xc2, 0x27, 0x9e, 0x7a, 0xde, 0x43, 0xfc, 0x2e, 0x71, 0x7f, 0x53, 0x8c, 0xda, 0xaa, 0x9c, 0xe3, 0x8f, 0xd0, 0xfc, 0xc3, 0x32, 0x94, 0xbb,
0xc6, 0xd0, 0xad, 0xf8, 0x75, 0xae, 0x9c, 0x0c, 0xdd, 0x8a, 0xde, 0xe5, 0xda, 0x80, 0x25, 0x5f, 0xde, 0x85, 0xef, 0x8e, 0x78, 0x44, 0xeb, 0x94, 0x4e, 0x7d, 0xf9, 0xbc, 0x07, 0xfb, 0xcd, 0x43,
0x7f, 0x5e, 0xab, 0xe0, 0xe3, 0x3d, 0x80, 0xe8, 0xbc, 0x2c, 0x68, 0x8f, 0xa6, 0x88, 0xba, 0x28, 0xb7, 0xe2, 0xd7, 0xb9, 0x0a, 0x22, 0x74, 0x4b, 0xbd, 0xcb, 0xb5, 0x01, 0x4b, 0x81, 0xfe, 0xbc,
0xd8, 0x10, 0xa7, 0x8c, 0xee, 0x16, 0x97, 0x11, 0x82, 0x13, 0xf6, 0x1a, 0x14, 0xe5, 0x75, 0x49, 0x56, 0x29, 0xe0, 0xf7, 0x00, 0xd4, 0x79, 0x59, 0xd2, 0x1e, 0x4d, 0x61, 0x75, 0x61, 0xb0, 0x21,
0xba, 0xbc, 0x45, 0x81, 0xfb, 0x12, 0x84, 0xd4, 0xe0, 0x73, 0x72, 0xe1, 0x46, 0x82, 0x6c, 0xce, 0x9f, 0x32, 0xbc, 0x5b, 0x5c, 0xe5, 0x10, 0x3e, 0x61, 0x6f, 0x40, 0x59, 0x5c, 0x97, 0xc4, 0xcb,
0xac, 0x2a, 0xe0, 0x9e, 0xa0, 0xb5, 0x7b, 0x50, 0x21, 0x7c, 0x42, 0x29, 0xc9, 0x40, 0x50, 0x04, 0x5b, 0x18, 0xb8, 0x2f, 0x40, 0x9c, 0x1a, 0x02, 0x8a, 0x2e, 0x5c, 0x25, 0xc8, 0x16, 0xac, 0xba,
0x21, 0x42, 0xca, 0x2b, 0x75, 0xe5, 0xd4, 0x57, 0xea, 0x30, 0x64, 0x39, 0xe2, 0xb2, 0x34, 0x44, 0x04, 0xee, 0x32, 0x5a, 0xbb, 0x03, 0x35, 0xc4, 0x47, 0x94, 0x8a, 0x08, 0x04, 0xe5, 0x20, 0x8e,
0xa0, 0xb7, 0xc9, 0x34, 0xb8, 0x7a, 0xfa, 0x51, 0xda, 0x54, 0xe8, 0xda, 0xbd, 0xb2, 0xa9, 0xbc, 0x90, 0xf1, 0x4a, 0x5d, 0x35, 0xf3, 0x95, 0x3a, 0x1e, 0xb2, 0xac, 0xb8, 0x2c, 0x0e, 0x11, 0xf0,
0x09, 0xb5, 0x33, 0x7b, 0x3c, 0x3e, 0xb5, 0x87, 0xcf, 0xc8, 0x14, 0x50, 0x25, 0xeb, 0xa7, 0x02, 0x6d, 0x32, 0x0d, 0x2e, 0x9f, 0x7e, 0x14, 0x36, 0x15, 0xbc, 0x76, 0x2f, 0x6d, 0x2a, 0x6f, 0x43,
0xa2, 0x2d, 0xe0, 0x1e, 0x54, 0xb4, 0x55, 0xc6, 0x28, 0xcf, 0xbc, 0x09, 0xf1, 0xfa, 0xce, 0x5b, 0xe3, 0xd4, 0x99, 0x4c, 0x4e, 0x9c, 0xd1, 0x73, 0x34, 0x05, 0xd4, 0xd1, 0xfa, 0x29, 0x81, 0xdc,
0xf8, 0x96, 0x5f, 0xc1, 0xc2, 0xa7, 0x45, 0xbb, 0xae, 0x24, 0xa3, 0x5d, 0xef, 0x20, 0x37, 0x95, 0x16, 0x70, 0x07, 0x6a, 0xda, 0x2a, 0xf3, 0x28, 0xcf, 0xa2, 0x05, 0xf1, 0xfa, 0xa6, 0x2d, 0x7c,
0x11, 0x89, 0x75, 0x7a, 0x08, 0xcb, 0x1e, 0x8d, 0x30, 0x22, 0x11, 0x0d, 0x59, 0x34, 0x79, 0x94, 0xcb, 0xaf, 0x61, 0xe1, 0xd3, 0xa2, 0x5d, 0x57, 0x92, 0xd1, 0xae, 0xb7, 0x38, 0x37, 0x15, 0x11,
0xbf, 0x4a, 0xba, 0x04, 0xc1, 0x08, 0xe5, 0x2e, 0x99, 0xa9, 0xa7, 0xb6, 0x33, 0xc2, 0xcb, 0x17, 0x89, 0x06, 0x3e, 0x84, 0xe5, 0x8c, 0xc7, 0x3c, 0x22, 0x91, 0x1b, 0xb2, 0x70, 0xf2, 0x30, 0x7f,
0x64, 0x3d, 0x28, 0xda, 0x93, 0xf0, 0xd8, 0x76, 0x46, 0xec, 0x3e, 0x54, 0x55, 0x36, 0x9e, 0x8e, 0x15, 0x75, 0x09, 0x84, 0x21, 0xca, 0x6d, 0x34, 0x53, 0xcf, 0x1c, 0x77, 0xcc, 0x2f, 0x5f, 0xa0,
0x6b, 0x34, 0xff, 0x32, 0xbb, 0x4f, 0x8f, 0x4a, 0x44, 0x18, 0x93, 0xe8, 0xde, 0xbc, 0x59, 0x91, 0xf5, 0xa0, 0xec, 0x4c, 0xa3, 0x23, 0xc7, 0x1d, 0x93, 0xbb, 0x50, 0x97, 0xd9, 0xfc, 0x74, 0x5c,
0x28, 0x48, 0x07, 0x1f, 0x60, 0x94, 0x4f, 0xc8, 0xf1, 0x66, 0xfc, 0xf2, 0xe3, 0x3b, 0x51, 0xf0, 0xc3, 0xf9, 0x17, 0xd9, 0x03, 0x7c, 0x54, 0x42, 0x61, 0x4c, 0xd5, 0xbd, 0x79, 0xab, 0x26, 0x50,
0x01, 0x52, 0xa9, 0xfa, 0x4f, 0xce, 0x31, 0xc2, 0x14, 0xc2, 0x1d, 0xf9, 0xe8, 0x36, 0x13, 0xf2, 0x38, 0x1d, 0x7c, 0xc4, 0xa3, 0x7c, 0x22, 0xca, 0x6f, 0xc6, 0x2f, 0x3f, 0xba, 0xa5, 0x82, 0x0f,
0xaf, 0x44, 0x45, 0x1f, 0x1d, 0x21, 0xb0, 0x4f, 0x34, 0xfd, 0xb5, 0x81, 0xc8, 0xaf, 0xcd, 0xd5, 0x38, 0x95, 0xca, 0xff, 0xe8, 0x1c, 0x43, 0x4c, 0x26, 0xdc, 0xa1, 0x8f, 0x6e, 0x33, 0x21, 0xff,
0x7f, 0xd3, 0xe5, 0xb4, 0xbb, 0x00, 0x4e, 0x20, 0x4e, 0x99, 0x80, 0xbb, 0x23, 0xbc, 0xe0, 0x5e, 0x0a, 0x54, 0xee, 0xa3, 0x43, 0x04, 0xf2, 0x99, 0xa6, 0xbf, 0x36, 0x39, 0xf2, 0x1b, 0xa9, 0xfa,
0x32, 0xcb, 0x4e, 0xf0, 0x94, 0x00, 0xdf, 0xac, 0x62, 0xdb, 0x84, 0xaa, 0x3e, 0x4c, 0x56, 0x82, 0xaf, 0xbb, 0x9c, 0x76, 0x1b, 0xc0, 0x0d, 0xd9, 0x29, 0x13, 0x52, 0x6f, 0xcc, 0x2f, 0xb8, 0x57,
0x7c, 0xef, 0xb8, 0xdd, 0xad, 0xdf, 0x62, 0x15, 0x28, 0xf6, 0xdb, 0x83, 0xc1, 0x21, 0x7a, 0xfa, 0xac, 0xaa, 0x1b, 0x3e, 0x43, 0xc0, 0xb7, 0xab, 0xd8, 0xb6, 0xa0, 0xae, 0x0f, 0x93, 0x54, 0xa0,
0xaa, 0x50, 0x8a, 0xae, 0xaf, 0x66, 0x45, 0xaa, 0xd9, 0x6a, 0xb5, 0x8f, 0x07, 0xed, 0xbd, 0x7a, 0xd8, 0x3f, 0xea, 0xf4, 0x8c, 0x1b, 0xa4, 0x06, 0xe5, 0x41, 0x67, 0x38, 0x3c, 0xe0, 0x9e, 0xbe,
0xee, 0xc7, 0xf9, 0x52, 0xb6, 0x9e, 0x33, 0xfe, 0x30, 0x07, 0x15, 0x6d, 0x16, 0x5e, 0xcc, 0x8c, 0x3a, 0x54, 0xd4, 0xf5, 0xd5, 0x3c, 0x4b, 0xb5, 0xda, 0xed, 0xce, 0xd1, 0xb0, 0xb3, 0x6b, 0x14,
0xef, 0x02, 0xa0, 0x26, 0x19, 0x07, 0xac, 0xe6, 0xcd, 0xb2, 0x80, 0xd0, 0xe2, 0xeb, 0x3e, 0x0a, 0x7e, 0x52, 0xac, 0xe4, 0x8d, 0x82, 0xf9, 0x47, 0x05, 0xa8, 0x69, 0xb3, 0xf0, 0x72, 0x66, 0x7c,
0x7a, 0x61, 0x24, 0xf2, 0x51, 0xbc, 0x09, 0x35, 0x7a, 0x03, 0x44, 0xf7, 0xd7, 0x16, 0xcc, 0x2a, 0x1b, 0x80, 0x6b, 0x92, 0x71, 0xc0, 0x6a, 0xd1, 0xaa, 0x32, 0x08, 0x2e, 0xbe, 0xee, 0xa3, 0xc0,
0x01, 0x25, 0xab, 0xc6, 0xcb, 0xf0, 0x88, 0x84, 0xd7, 0x0c, 0xe5, 0x23, 0x45, 0x04, 0xc2, 0x8b, 0x17, 0x46, 0x94, 0x8f, 0xe2, 0x6d, 0x68, 0xe0, 0x1b, 0x20, 0xba, 0xbf, 0xb6, 0x64, 0xd5, 0x11,
0x86, 0x78, 0x4b, 0x34, 0xf0, 0xc6, 0x97, 0x9c, 0x30, 0x48, 0x22, 0xac, 0x48, 0xd8, 0x40, 0x3e, 0x28, 0x58, 0x35, 0xbf, 0x0c, 0xcf, 0x91, 0xf8, 0x35, 0x43, 0xf1, 0x48, 0x11, 0x82, 0xf8, 0x45,
0x34, 0x20, 0xf9, 0xa1, 0x76, 0x1b, 0xbb, 0x60, 0x56, 0x09, 0x28, 0x1b, 0xfa, 0x8e, 0x22, 0x20, 0x43, 0x7e, 0x4b, 0x34, 0xf4, 0x27, 0x17, 0x14, 0x31, 0x50, 0x22, 0xac, 0x09, 0xd8, 0x50, 0x3c,
0x8a, 0x5e, 0xd9, 0x5a, 0xa4, 0x86, 0x04, 0xf1, 0x1c, 0x2e, 0x98, 0x11, 0xcb, 0x48, 0x18, 0xdf, 0x34, 0x20, 0xf8, 0xa1, 0x76, 0x1b, 0xbb, 0x64, 0xd5, 0x11, 0x28, 0x1a, 0xfa, 0x9e, 0x24, 0x20,
0x5a, 0x2c, 0xf7, 0x72, 0x73, 0x22, 0x7b, 0x17, 0xd8, 0x64, 0x3a, 0xb5, 0x52, 0x0c, 0x7c, 0x79, 0x8c, 0x5e, 0xd9, 0x5a, 0xa4, 0x86, 0x04, 0xf1, 0x1c, 0x2c, 0x98, 0x11, 0xab, 0x9c, 0x30, 0xbe,
0x73, 0x65, 0x32, 0x9d, 0x0e, 0x34, 0xfb, 0xd7, 0x37, 0x60, 0x7b, 0xfc, 0x0a, 0x58, 0x53, 0x6c, 0xb3, 0x58, 0xee, 0xd5, 0xe6, 0x44, 0xf2, 0x3e, 0x90, 0xe9, 0x6c, 0x66, 0x67, 0x18, 0xf8, 0x8a,
0x60, 0xec, 0x62, 0xa4, 0x8a, 0xc5, 0x6c, 0x39, 0xa3, 0xb3, 0xe5, 0x14, 0xee, 0x97, 0x4d, 0xe5, 0xd6, 0xca, 0x74, 0x36, 0x1b, 0x6a, 0xf6, 0xaf, 0x6f, 0xc1, 0xf6, 0xf8, 0x35, 0x90, 0x16, 0xdb,
0x7e, 0x2f, 0xe2, 0x13, 0xc6, 0x3e, 0x54, 0x8e, 0xb5, 0xa7, 0x10, 0xef, 0x8b, 0x13, 0x42, 0x3d, 0xc0, 0xbc, 0x8b, 0x4a, 0x15, 0x8b, 0xd9, 0x72, 0x4e, 0x67, 0xcb, 0x19, 0xdc, 0x2f, 0x9f, 0xc9,
0x82, 0x48, 0x67, 0x07, 0xd9, 0x14, 0x7d, 0xf9, 0xf6, 0xa1, 0xd6, 0x9b, 0xac, 0xd6, 0x1b, 0xe3, 0xfd, 0x5e, 0xc6, 0x27, 0xcc, 0x3d, 0xa8, 0x1d, 0x69, 0x4f, 0x21, 0xde, 0x65, 0x27, 0x84, 0x7c,
0xef, 0x64, 0xe8, 0xe9, 0xa8, 0xa8, 0xf3, 0xf1, 0xeb, 0x8b, 0xca, 0xfd, 0x16, 0x3f, 0x9a, 0x50, 0x04, 0x11, 0xcf, 0x0e, 0xb4, 0x29, 0x06, 0xe2, 0xed, 0x43, 0xad, 0x37, 0x79, 0xad, 0x37, 0xe6,
0x51, 0x6e, 0x37, 0xf9, 0xde, 0x01, 0x76, 0xcd, 0xf2, 0xce, 0xce, 0x02, 0xae, 0x62, 0x3c, 0x2a, 0xdf, 0xca, 0xe1, 0xd3, 0x51, 0xaa, 0xf3, 0xf1, 0xeb, 0x8b, 0xd2, 0xfd, 0x16, 0x3f, 0x9a, 0x50,
0x08, 0xeb, 0x21, 0x48, 0x09, 0xdf, 0x42, 0xc2, 0x77, 0xa8, 0xfe, 0x40, 0x06, 0x76, 0x08, 0xe1, 0x93, 0x6e, 0x37, 0xf1, 0xde, 0x01, 0xef, 0x9a, 0xed, 0x9f, 0x9e, 0x86, 0x54, 0xc6, 0x78, 0xd4,
0xfb, 0xc8, 0xbe, 0x92, 0xad, 0x06, 0x42, 0x04, 0x91, 0xfe, 0x01, 0x75, 0x69, 0x38, 0x4a, 0x1b, 0x38, 0xac, 0xcf, 0x41, 0x52, 0xf8, 0x66, 0x12, 0xbe, 0x8b, 0xf5, 0x87, 0x22, 0xb0, 0x83, 0x09,
0x7f, 0x53, 0xbe, 0xeb, 0x30, 0x3f, 0xbf, 0x0f, 0xa1, 0x14, 0xd5, 0x9a, 0x3c, 0x61, 0x15, 0x66, 0xdf, 0x87, 0xce, 0xa5, 0x68, 0x35, 0x64, 0x22, 0x88, 0xf0, 0x0f, 0xc8, 0x4b, 0xc3, 0x2a, 0x6d,
0x94, 0x2f, 0xce, 0x71, 0x34, 0x86, 0x24, 0x7a, 0x4c, 0x9b, 0x0b, 0x7d, 0x3c, 0x1d, 0xad, 0xd7, 0xfe, 0x75, 0xf1, 0xae, 0x43, 0x7a, 0x7e, 0xef, 0x43, 0x45, 0xd5, 0x9a, 0x3c, 0x61, 0x25, 0xa6,
0xef, 0x01, 0x3b, 0x73, 0xfc, 0x79, 0x64, 0xda, 0x6c, 0x75, 0xcc, 0xd1, 0xb0, 0x8d, 0x13, 0x58, 0xca, 0x67, 0xe7, 0x38, 0x37, 0x86, 0x24, 0x7a, 0x8c, 0x9b, 0x8b, 0xfb, 0x78, 0xba, 0x5a, 0xaf,
0x53, 0x5c, 0x42, 0xd3, 0x08, 0x92, 0x8b, 0x97, 0x79, 0x09, 0x93, 0xcf, 0x2e, 0x30, 0x79, 0xe3, 0x3f, 0x00, 0x72, 0xea, 0x06, 0x69, 0x64, 0xdc, 0x6c, 0x06, 0xcf, 0xd1, 0xb0, 0xcd, 0x63, 0x58,
0x37, 0x0b, 0x50, 0x54, 0xcf, 0x8a, 0xa6, 0x3d, 0x85, 0x59, 0x4e, 0x3e, 0x85, 0xd9, 0x48, 0x3c, 0x93, 0x5c, 0x42, 0xd3, 0x08, 0x92, 0x8b, 0x97, 0x7b, 0x05, 0x93, 0xcf, 0x2f, 0x30, 0x79, 0xf3,
0x90, 0x86, 0x4b, 0x2f, 0xcf, 0xfb, 0x77, 0xe6, 0x8f, 0x6c, 0xcd, 0x57, 0x91, 0x38, 0xb6, 0xa5, 0x37, 0x4b, 0x50, 0x96, 0xcf, 0x8a, 0x66, 0x3d, 0x85, 0x59, 0x4d, 0x3e, 0x85, 0xd9, 0x4c, 0x3c,
0xaf, 0xa2, 0x90, 0xf4, 0x55, 0xa4, 0x3d, 0x0f, 0x4a, 0xa2, 0xe7, 0xc2, 0xf3, 0xa0, 0x77, 0x80, 0x90, 0xc6, 0x97, 0x5e, 0x9c, 0xf7, 0xef, 0xa5, 0x8f, 0x6c, 0xcd, 0x57, 0x91, 0x38, 0xb6, 0x85,
0xe4, 0x08, 0x2d, 0xb8, 0xad, 0x84, 0x00, 0x79, 0xf1, 0x5d, 0x13, 0x3b, 0x4a, 0xf3, 0x62, 0xc7, 0xaf, 0xa2, 0x94, 0xf4, 0x55, 0x64, 0x3d, 0x0f, 0x8a, 0xa2, 0xe7, 0xc2, 0xf3, 0xa0, 0xb7, 0x00,
0x2b, 0x8b, 0x04, 0xdf, 0x83, 0x25, 0x7a, 0x23, 0x46, 0x5e, 0x82, 0x56, 0x07, 0x87, 0x9c, 0x2b, 0xe5, 0x08, 0x2d, 0xb8, 0xad, 0xc2, 0x01, 0xe2, 0xe2, 0xbb, 0x26, 0x76, 0x54, 0xd2, 0x62, 0xc7,
0xf5, 0x9f, 0x2e, 0x44, 0x98, 0x12, 0x57, 0x7f, 0x6b, 0xaf, 0x92, 0x78, 0x6b, 0x4f, 0xf7, 0xa1, 0x6b, 0x8b, 0x04, 0x1f, 0xc3, 0x12, 0xbe, 0x11, 0x23, 0x2e, 0x41, 0xcb, 0x83, 0x43, 0xcc, 0x95,
0x54, 0x93, 0x3e, 0x94, 0x07, 0x50, 0x8f, 0x26, 0x0e, 0x2d, 0x92, 0x6e, 0x20, 0x6f, 0x50, 0x2e, 0xfc, 0x8f, 0x17, 0x22, 0x2c, 0x81, 0xab, 0xbf, 0xb5, 0x57, 0x4b, 0xbc, 0xb5, 0xa7, 0xfb, 0x50,
0x2b, 0xb8, 0xe0, 0x86, 0xdd, 0x20, 0x3e, 0xf8, 0x96, 0x13, 0x07, 0x9f, 0xe0, 0x55, 0xcd, 0x30, 0xea, 0x49, 0x1f, 0xca, 0x3d, 0x30, 0xd4, 0xc4, 0x71, 0x8b, 0xa4, 0x17, 0x8a, 0x1b, 0x94, 0xcb,
0xe4, 0x93, 0x69, 0xa8, 0x0e, 0x3e, 0xed, 0x45, 0x56, 0x5a, 0x79, 0xba, 0xe2, 0xa1, 0x96, 0x97, 0x12, 0xce, 0xb8, 0x61, 0x2f, 0x8c, 0x0f, 0xbe, 0xe5, 0xc4, 0xc1, 0xc7, 0x78, 0x55, 0x2b, 0x8a,
0xa8, 0x63, 0x17, 0x96, 0xcf, 0x6c, 0x67, 0x3c, 0xf3, 0xb9, 0xe5, 0x73, 0x3b, 0xf0, 0x5c, 0xdc, 0xe8, 0x74, 0x16, 0xc9, 0x83, 0x4f, 0x7b, 0x91, 0x15, 0x57, 0x1e, 0xaf, 0x78, 0xc8, 0xe5, 0x45,
0xfc, 0xf1, 0x19, 0x2c, 0x87, 0xb8, 0x4f, 0x38, 0x26, 0xa2, 0x98, 0xb5, 0x33, 0x3d, 0x89, 0x17, 0xea, 0xd8, 0x81, 0xe5, 0x53, 0xc7, 0x9d, 0xcc, 0x03, 0x6a, 0x07, 0xd4, 0x09, 0x7d, 0x8f, 0x6f,
0xa5, 0xf4, 0x99, 0x10, 0x47, 0x96, 0xbc, 0x4b, 0x4d, 0xb1, 0x2a, 0x9d, 0xae, 0xb5, 0x7f, 0xd8, 0xfe, 0xf8, 0x0c, 0x16, 0x43, 0xdc, 0x43, 0x1c, 0x8b, 0xa3, 0x58, 0x8d, 0x53, 0x3d, 0xc9, 0x2f,
0x79, 0x72, 0x30, 0xa8, 0x67, 0x44, 0xb2, 0x7f, 0xd2, 0x6a, 0xb5, 0xdb, 0x7b, 0x78, 0x84, 0x01, 0x4a, 0xe9, 0x33, 0xc1, 0x8e, 0x2c, 0x71, 0x97, 0x1a, 0x63, 0x55, 0xba, 0x3d, 0x7b, 0xef, 0xa0,
0x2c, 0xed, 0x37, 0x3b, 0x87, 0xf2, 0x00, 0xcb, 0xd7, 0x0b, 0xc6, 0x3f, 0xcb, 0x42, 0x45, 0x1b, 0xfb, 0x74, 0x7f, 0x68, 0xe4, 0x58, 0x72, 0x70, 0xdc, 0x6e, 0x77, 0x3a, 0xbb, 0xfc, 0x08, 0x03,
0x0d, 0xfb, 0x30, 0x5a, 0x04, 0x7a, 0x7c, 0xe1, 0xee, 0xe2, 0x88, 0x77, 0x14, 0x87, 0xd7, 0x56, 0x58, 0xda, 0x6b, 0x75, 0x0f, 0xc4, 0x01, 0x56, 0x34, 0x4a, 0xe6, 0x3f, 0xc9, 0x43, 0x4d, 0x1b,
0x21, 0x7a, 0x7b, 0x35, 0x7b, 0xe3, 0xdb, 0xab, 0xec, 0x6d, 0x58, 0xb1, 0xa9, 0x86, 0x68, 0xd2, 0x0d, 0x79, 0xac, 0x16, 0x01, 0x1f, 0x5f, 0xb8, 0xbd, 0x38, 0xe2, 0x07, 0x92, 0xc3, 0x6b, 0xab,
0xa5, 0x71, 0x5f, 0x82, 0xe5, 0x9c, 0xbf, 0x2d, 0x1f, 0x82, 0x90, 0xc7, 0x94, 0xc0, 0xcb, 0xab, 0xa0, 0xde, 0x5e, 0xcd, 0x5f, 0xfb, 0xf6, 0x2a, 0x79, 0x17, 0x56, 0x1c, 0xac, 0x41, 0x4d, 0xba,
0xa0, 0xcd, 0xe8, 0xa4, 0xc2, 0xb5, 0x29, 0xca, 0x99, 0x91, 0xce, 0xf8, 0xe8, 0xc0, 0x97, 0xf3, 0x30, 0xee, 0x0b, 0xb0, 0x98, 0xf3, 0x77, 0xc5, 0x43, 0x10, 0xe2, 0x98, 0x62, 0x78, 0x45, 0x19,
0xa5, 0xb2, 0xe9, 0xf6, 0xa4, 0x46, 0xe1, 0x55, 0x33, 0x4a, 0x1b, 0x1f, 0x01, 0xc4, 0xe3, 0x49, 0xb4, 0xa9, 0x4e, 0x2a, 0xbe, 0x36, 0x65, 0x31, 0x33, 0xc2, 0x19, 0xaf, 0x0e, 0x7c, 0x31, 0x5f,
0x4e, 0xdf, 0xad, 0xe4, 0xf4, 0x65, 0xb4, 0xe9, 0xcb, 0x1a, 0xff, 0x50, 0xb2, 0x2e, 0xb9, 0x16, 0x32, 0x1b, 0x6f, 0x4f, 0x6a, 0x14, 0x5e, 0xb7, 0x54, 0xda, 0xfc, 0x04, 0x20, 0x1e, 0x4f, 0x72,
0x91, 0xa9, 0xef, 0x3b, 0xa0, 0x8c, 0x8f, 0x16, 0x06, 0x79, 0x4f, 0xc7, 0x3c, 0x54, 0x17, 0x40, 0xfa, 0x6e, 0x24, 0xa7, 0x2f, 0xa7, 0x4d, 0x5f, 0xde, 0xfc, 0xfb, 0x82, 0x75, 0x89, 0xb5, 0x50,
0x57, 0x65, 0x4e, 0x27, 0xca, 0x58, 0x60, 0xb5, 0xd9, 0x45, 0x56, 0xfb, 0x06, 0x54, 0xf1, 0x65, 0xa6, 0xbe, 0xef, 0x81, 0x34, 0x3e, 0xda, 0x3c, 0xc8, 0x7b, 0x36, 0xa1, 0x91, 0xbc, 0x00, 0xba,
0x31, 0xd9, 0x90, 0x64, 0x57, 0x95, 0x89, 0x7d, 0xa5, 0xda, 0x4e, 0xf0, 0xd8, 0xfc, 0x1c, 0x8f, 0x2a, 0x72, 0xba, 0x2a, 0x63, 0x81, 0xd5, 0xe6, 0x17, 0x59, 0xed, 0x5b, 0x50, 0xe7, 0x2f, 0x8b,
0xfd, 0x5b, 0x19, 0x7a, 0x86, 0x26, 0xee, 0x68, 0xcc, 0x64, 0xa3, 0x3a, 0x93, 0x4c, 0x56, 0xa2, 0x89, 0x86, 0x04, 0xbb, 0xaa, 0x4d, 0x9d, 0x4b, 0xd9, 0x76, 0x82, 0xc7, 0x16, 0x53, 0x3c, 0xf6,
0x9a, 0x51, 0xfe, 0x0d, 0x8c, 0x33, 0x9b, 0xce, 0x38, 0xd3, 0x59, 0x72, 0x2e, 0x95, 0x25, 0x1b, 0x6f, 0xe4, 0xf0, 0x19, 0x9a, 0xb8, 0xa3, 0x31, 0x93, 0x55, 0x75, 0x26, 0x99, 0xac, 0x40, 0xb5,
0xdb, 0xd0, 0xd8, 0xe3, 0x62, 0x2a, 0x9a, 0xe3, 0xf1, 0xdc, 0x5c, 0x1a, 0x77, 0xe0, 0x76, 0x4a, 0x54, 0xfe, 0x35, 0x8c, 0x33, 0x9f, 0xcd, 0x38, 0xb3, 0x59, 0x72, 0x21, 0x93, 0x25, 0x9b, 0xdb,
0x9e, 0xb4, 0xda, 0xfc, 0x04, 0x36, 0x9a, 0xf4, 0xf8, 0xc4, 0x37, 0x75, 0x41, 0xd3, 0x68, 0xc0, 0xd0, 0xdc, 0xa5, 0x6c, 0x2a, 0x5a, 0x93, 0x49, 0x6a, 0x2e, 0xcd, 0x5b, 0x70, 0x33, 0x23, 0x4f,
0xe6, 0x7c, 0x95, 0xb2, 0xb1, 0x7d, 0x58, 0xdd, 0xe3, 0xa7, 0xb3, 0xf3, 0x43, 0x7e, 0x19, 0x37, 0x58, 0x6d, 0x7e, 0x0a, 0x1b, 0x2d, 0x7c, 0x7c, 0xe2, 0xdb, 0xba, 0xa0, 0x69, 0x36, 0x61, 0x33,
0xc4, 0x20, 0x1f, 0x5c, 0x78, 0xcf, 0xe5, 0xe2, 0xe2, 0x6f, 0x0c, 0xcb, 0x14, 0x38, 0x56, 0x30, 0x5d, 0xa5, 0x68, 0x6c, 0x0f, 0x56, 0x77, 0xe9, 0xc9, 0xfc, 0xec, 0x80, 0x5e, 0xc4, 0x0d, 0x11,
0xe5, 0x43, 0x65, 0xb9, 0x47, 0x48, 0x7f, 0xca, 0x87, 0xc6, 0x87, 0xc0, 0xf4, 0x7a, 0xe4, 0x4a, 0x28, 0x86, 0xe7, 0xfe, 0x0b, 0xb1, 0xb8, 0xfc, 0x37, 0x0f, 0xcb, 0x64, 0x38, 0x76, 0x38, 0xa3,
0x08, 0xb5, 0x6a, 0x76, 0x6a, 0x05, 0xd7, 0x41, 0xc8, 0x27, 0xea, 0x62, 0x22, 0x04, 0xb3, 0xd3, 0x23, 0x69, 0xb9, 0xe7, 0x90, 0xc1, 0x8c, 0x8e, 0xcc, 0xc7, 0x40, 0xf4, 0x7a, 0xc4, 0x4a, 0x30,
0x3e, 0x41, 0x8c, 0x77, 0xa0, 0x7a, 0x6c, 0x5f, 0x9b, 0xfc, 0x2b, 0x79, 0xff, 0x6f, 0x0b, 0x8a, 0xb5, 0x6a, 0x7e, 0x62, 0x87, 0x57, 0x61, 0x44, 0xa7, 0xf2, 0x62, 0x22, 0x84, 0xf3, 0x93, 0x01,
0x53, 0xfb, 0x5a, 0xf0, 0xd3, 0xc8, 0x89, 0x87, 0xd9, 0xc6, 0x3f, 0xce, 0xc3, 0x12, 0x61, 0xb2, 0x42, 0xcc, 0xf7, 0xa0, 0x7e, 0xe4, 0x5c, 0x59, 0xf4, 0x6b, 0x71, 0xff, 0x6f, 0x0b, 0xca, 0x33,
0xfb, 0xf4, 0xb2, 0xb9, 0xe3, 0x22, 0x3f, 0x53, 0x27, 0x8b, 0x06, 0x5a, 0x38, 0x7c, 0xb2, 0x8b, 0xe7, 0x8a, 0xf1, 0x53, 0xe5, 0xc4, 0xe3, 0xd9, 0xe6, 0x3f, 0x2c, 0xc2, 0x12, 0x62, 0x92, 0xbb,
0x87, 0x8f, 0xb4, 0x38, 0xaa, 0xe7, 0xc9, 0x94, 0xbb, 0xc5, 0x9d, 0x4d, 0xd4, 0x9b, 0x64, 0xc9, 0xf8, 0xb2, 0xb9, 0xeb, 0x71, 0x7e, 0x26, 0x4f, 0x16, 0x0d, 0xb4, 0x70, 0xf8, 0xe4, 0x17, 0x0f,
0x17, 0x18, 0xf2, 0xf1, 0x8b, 0xf8, 0x74, 0xfb, 0x3c, 0xe9, 0x10, 0x8f, 0x95, 0x37, 0xea, 0x9d, 0x1f, 0x61, 0x71, 0x94, 0xcf, 0x93, 0x49, 0x77, 0x8b, 0x37, 0x9f, 0xca, 0x37, 0xc9, 0x92, 0x2f,
0x3a, 0x53, 0xe5, 0xb9, 0xa3, 0x83, 0x52, 0x35, 0xc4, 0xa2, 0xba, 0xd4, 0x9a, 0xd4, 0x10, 0x17, 0x30, 0x14, 0xe3, 0x17, 0xf1, 0xf1, 0xf6, 0x79, 0xd2, 0x21, 0x1e, 0x2b, 0x6f, 0xd8, 0x3b, 0x79,
0x34, 0xc1, 0xd2, 0xcb, 0x35, 0x41, 0x32, 0x45, 0xbe, 0x40, 0x13, 0x84, 0x57, 0xd0, 0x04, 0x5f, 0xa6, 0x8a, 0x73, 0x47, 0x07, 0x65, 0x6a, 0x88, 0x65, 0x79, 0xa9, 0x35, 0xa9, 0x21, 0x2e, 0x68,
0xc1, 0x19, 0x7d, 0x1b, 0x4a, 0x28, 0x28, 0x69, 0xc7, 0x90, 0x10, 0x90, 0xc4, 0x31, 0xf4, 0xb1, 0x82, 0x95, 0x57, 0x6b, 0x82, 0x68, 0x8a, 0x7c, 0x89, 0x26, 0x08, 0xaf, 0xa1, 0x09, 0xbe, 0x86,
0xa6, 0x2b, 0x51, 0x24, 0x8c, 0x76, 0x0e, 0x98, 0xfc, 0xab, 0x5f, 0x8c, 0x93, 0xef, 0x4b, 0x28, 0x33, 0xfa, 0x26, 0x54, 0xb8, 0xa0, 0xa4, 0x1d, 0x43, 0x4c, 0x40, 0x62, 0xc7, 0xd0, 0xa7, 0x9a,
0x4a, 0xa8, 0x20, 0x68, 0xd7, 0x9e, 0xa8, 0x87, 0x2e, 0xf1, 0xb7, 0x98, 0x36, 0x7c, 0x96, 0xee, 0xae, 0x84, 0x91, 0x30, 0xda, 0x39, 0x60, 0xd1, 0xaf, 0x7f, 0x31, 0x4e, 0xbe, 0xaf, 0xa0, 0x2c,
0xab, 0x99, 0xe3, 0xf3, 0x91, 0x7a, 0x1c, 0xcb, 0xc1, 0x3d, 0x2a, 0x20, 0x62, 0x80, 0x42, 0x6f, 0xa0, 0x8c, 0xa0, 0x3d, 0x67, 0x2a, 0x1f, 0xba, 0xe4, 0xbf, 0xd9, 0xb4, 0xf1, 0x67, 0xe9, 0xbe,
0x73, 0xbd, 0xe7, 0xae, 0xe4, 0x3d, 0x45, 0x27, 0x78, 0x2a, 0x92, 0x06, 0x83, 0x3a, 0x3e, 0x8b, 0x9e, 0xbb, 0x01, 0x1d, 0xcb, 0xc7, 0xb1, 0x5c, 0xbe, 0x47, 0x19, 0x84, 0x0d, 0x90, 0xe9, 0x6d,
0x3b, 0xf5, 0x7c, 0x75, 0xca, 0x1b, 0x3f, 0xcb, 0x40, 0x5d, 0xee, 0xae, 0x28, 0x4f, 0x57, 0x9b, 0x9e, 0xff, 0xc2, 0x13, 0xbc, 0xa7, 0xec, 0x86, 0xcf, 0x58, 0xd2, 0x24, 0x60, 0xf0, 0x67, 0x71,
0x0a, 0x37, 0x05, 0x6e, 0xbc, 0xf8, 0xa9, 0x2b, 0x03, 0x6a, 0x68, 0x2d, 0x8a, 0x8e, 0x7c, 0xb2, 0x67, 0x7e, 0x20, 0x4f, 0x79, 0xf3, 0x77, 0x73, 0x60, 0x88, 0xdd, 0xa5, 0xf2, 0x74, 0xb5, 0xa9,
0x76, 0x55, 0x04, 0x70, 0x5f, 0x1e, 0xfb, 0xaf, 0x43, 0x45, 0x05, 0x8d, 0x4f, 0x9c, 0xb1, 0xfa, 0x74, 0x5d, 0xe0, 0xc6, 0xcb, 0x9f, 0xba, 0x32, 0xa1, 0xc1, 0xad, 0x45, 0xea, 0xc8, 0x47, 0x6b,
0xf8, 0x05, 0x45, 0x8d, 0x1f, 0x39, 0x63, 0x25, 0x31, 0xf8, 0xb6, 0xbc, 0x64, 0x9d, 0x41, 0x89, 0x57, 0x8d, 0x01, 0xf7, 0xc4, 0xb1, 0xff, 0x26, 0xd4, 0x64, 0xd0, 0xf8, 0xd4, 0x9d, 0xc8, 0x8f,
0xc1, 0xb4, 0x43, 0x6e, 0xfc, 0xd3, 0x0c, 0xac, 0x6a, 0x43, 0x91, 0xfb, 0xf6, 0xfb, 0x50, 0x8d, 0x5f, 0x60, 0xd4, 0xf8, 0xa1, 0x3b, 0x91, 0x12, 0x43, 0xe0, 0x88, 0x4b, 0xd6, 0x39, 0x2e, 0x31,
0xde, 0xa3, 0xe6, 0x91, 0xa8, 0xba, 0x95, 0x64, 0x34, 0x71, 0xb1, 0xca, 0x30, 0x82, 0x04, 0xa2, 0x58, 0x4e, 0x44, 0xcd, 0x7f, 0x9c, 0x83, 0x55, 0x6d, 0x28, 0x62, 0xdf, 0xfe, 0x00, 0xea, 0xea,
0x33, 0x23, 0xfb, 0x9a, 0x22, 0x9b, 0x67, 0x13, 0xa5, 0x0d, 0x8e, 0xec, 0xeb, 0x7d, 0xce, 0xfb, 0x3d, 0x6a, 0xaa, 0x44, 0xd5, 0xad, 0x24, 0xa3, 0x89, 0x8b, 0xd5, 0x46, 0x0a, 0x12, 0xb2, 0xce,
0xb3, 0x89, 0xd0, 0xf5, 0x9f, 0x73, 0xfe, 0x2c, 0x42, 0x20, 0xf6, 0x09, 0x02, 0x26, 0x31, 0x0c, 0x8c, 0x9d, 0x2b, 0x8c, 0x6c, 0x9e, 0x4f, 0xa5, 0x36, 0x38, 0x76, 0xae, 0xf6, 0x28, 0x1d, 0xcc,
0xa8, 0x4d, 0x3c, 0x37, 0xbc, 0x88, 0x50, 0xa4, 0x98, 0x8e, 0x40, 0xc2, 0x31, 0x7e, 0x3f, 0x0b, 0xa7, 0x4c, 0xd7, 0x7f, 0x41, 0xe9, 0x73, 0x85, 0x80, 0xec, 0x13, 0x18, 0x4c, 0x60, 0x98, 0xd0,
0x6b, 0x64, 0x93, 0x94, 0xb6, 0x60, 0xc9, 0xba, 0x1a, 0xb0, 0x44, 0xe6, 0x59, 0x62, 0x5e, 0x07, 0x98, 0xfa, 0x5e, 0x74, 0xae, 0x50, 0x84, 0x98, 0xce, 0x81, 0x88, 0x63, 0xfe, 0x41, 0x1e, 0xd6,
0xb7, 0x4c, 0x99, 0x66, 0xdf, 0x7b, 0x45, 0x3b, 0xaa, 0xba, 0xc7, 0x7d, 0xc3, 0xf4, 0xe7, 0x16, 0xd0, 0x26, 0x29, 0x6c, 0xc1, 0x82, 0x75, 0x35, 0x61, 0x09, 0xcd, 0xb3, 0xc8, 0xbc, 0xf6, 0x6f,
0xa7, 0xff, 0xe6, 0xe9, 0x4d, 0xf3, 0x0c, 0x17, 0xd2, 0x3c, 0xc3, 0xaf, 0xe2, 0x8f, 0x5d, 0xb8, 0x58, 0x22, 0x4d, 0x3e, 0x7e, 0x4d, 0x3b, 0xaa, 0xbc, 0xc7, 0x7d, 0xcd, 0xf4, 0x17, 0x16, 0xa7,
0x71, 0x5c, 0x5c, 0x7c, 0x57, 0xf3, 0x43, 0xd8, 0x4a, 0xe0, 0x20, 0xb7, 0x76, 0xce, 0x1c, 0xae, 0xff, 0xfa, 0xe9, 0xcd, 0xf2, 0x0c, 0x97, 0xb2, 0x3c, 0xc3, 0xaf, 0xe3, 0x8f, 0x5d, 0xb8, 0x71,
0x5e, 0xee, 0x59, 0xd7, 0xb0, 0xfb, 0x2a, 0x6f, 0xb7, 0x08, 0x85, 0x60, 0xe8, 0x4d, 0xb9, 0xb1, 0x5c, 0x5e, 0x7c, 0x57, 0xf3, 0x31, 0x6c, 0x25, 0x70, 0x38, 0xb7, 0x76, 0x4f, 0x5d, 0x2a, 0x5f,
0x09, 0xeb, 0xc9, 0x59, 0x95, 0xc7, 0xc4, 0x6f, 0x67, 0xa0, 0x21, 0xe3, 0x78, 0x1c, 0xf7, 0xfc, 0xee, 0x59, 0xd7, 0xb0, 0x07, 0x32, 0x6f, 0xa7, 0x0c, 0xa5, 0x70, 0xe4, 0xcf, 0xa8, 0xb9, 0x09,
0xc0, 0x09, 0x42, 0xcf, 0x8f, 0xde, 0x6d, 0xbe, 0x0b, 0x40, 0x1f, 0xe2, 0x40, 0xe5, 0x5b, 0xbe, 0xeb, 0xc9, 0x59, 0x15, 0xc7, 0xc4, 0x6f, 0xe7, 0xa0, 0x29, 0xe2, 0x78, 0x5c, 0xef, 0x6c, 0xdf,
0x55, 0x83, 0x10, 0x54, 0xbd, 0x6f, 0x43, 0x89, 0xbb, 0x23, 0xca, 0x24, 0x6a, 0x28, 0x72, 0x77, 0x0d, 0x23, 0x3f, 0x50, 0xef, 0x36, 0xdf, 0x06, 0xc0, 0x0f, 0x71, 0x70, 0xe5, 0x5b, 0xbc, 0x55,
0xa4, 0x14, 0xf7, 0x85, 0xa3, 0xb4, 0x96, 0x14, 0x12, 0xe4, 0xab, 0x0b, 0x62, 0x76, 0xf8, 0x25, 0xc3, 0x21, 0x5c, 0xf5, 0xbe, 0x09, 0x15, 0xea, 0x8d, 0x31, 0x13, 0xa9, 0xa1, 0x4c, 0xbd, 0xb1,
0x1e, 0xe9, 0xf9, 0xe8, 0xd5, 0x85, 0x23, 0xfb, 0x0a, 0xa3, 0x62, 0x03, 0xe3, 0xaf, 0x66, 0x61, 0x54, 0xdc, 0x17, 0x8e, 0xd2, 0x46, 0x52, 0x48, 0x10, 0xaf, 0x2e, 0xb0, 0xd9, 0xa1, 0x17, 0xfc,
0x25, 0xee, 0x1f, 0xbd, 0x3b, 0xf3, 0xe2, 0x17, 0x74, 0xee, 0x4b, 0x72, 0x70, 0x84, 0xc2, 0xa3, 0x48, 0x2f, 0xaa, 0x57, 0x17, 0x0e, 0x9d, 0x4b, 0x1e, 0x15, 0x1b, 0x9a, 0x7f, 0x39, 0x0f, 0x2b,
0x59, 0x6a, 0x4b, 0xb4, 0x39, 0x3b, 0x2e, 0x33, 0xa0, 0xa2, 0x30, 0xbc, 0x59, 0xa8, 0xbd, 0x05, 0x71, 0xff, 0xf0, 0xdd, 0x99, 0x97, 0xbf, 0xa0, 0x73, 0x57, 0x90, 0x83, 0xcb, 0x14, 0x1e, 0xcd,
0x5a, 0x26, 0x94, 0xde, 0x2c, 0x14, 0x1a, 0xaa, 0x50, 0xd5, 0x1d, 0x57, 0xea, 0x88, 0x05, 0x7b, 0x52, 0x5b, 0xc1, 0xcd, 0xd9, 0xf5, 0x88, 0x09, 0x35, 0x89, 0xe1, 0xcf, 0x23, 0xed, 0x2d, 0xd0,
0x12, 0x76, 0xf0, 0x6b, 0x2f, 0x02, 0x2c, 0x8a, 0xd1, 0x42, 0x0a, 0x2c, 0x81, 0x5f, 0x27, 0x85, 0x2a, 0xa2, 0xf4, 0xe7, 0x11, 0xd3, 0x50, 0x99, 0xaa, 0xee, 0x7a, 0x42, 0x47, 0x2c, 0x39, 0xd3,
0x85, 0x56, 0x0e, 0x95, 0x15, 0x5d, 0x9a, 0xa7, 0x07, 0xea, 0x23, 0x69, 0xfe, 0x75, 0xa8, 0x50, 0xa8, 0xcb, 0xbf, 0xf6, 0xc2, 0xc0, 0xac, 0x18, 0x2e, 0x24, 0xc3, 0x62, 0xf8, 0x06, 0x2a, 0x2c,
0xe5, 0xf1, 0x05, 0x73, 0x7c, 0x98, 0x2b, 0xec, 0xb8, 0x98, 0x2f, 0xad, 0x66, 0xde, 0x2c, 0x61, 0xb8, 0x72, 0x5c, 0x59, 0xd1, 0xa5, 0x79, 0x7c, 0xa0, 0x5e, 0x49, 0xf3, 0x6f, 0x42, 0x0d, 0x2b,
0x2b, 0x00, 0x6a, 0x0a, 0xc3, 0x64, 0xfe, 0x62, 0x06, 0x6e, 0xa7, 0x2c, 0x9b, 0xdc, 0xe5, 0x2d, 0x8f, 0x2f, 0x98, 0xf3, 0x87, 0xb9, 0xa2, 0xae, 0xc7, 0xf3, 0x85, 0xd5, 0xcc, 0x9f, 0x27, 0x6c,
0x58, 0x3d, 0x8b, 0x32, 0xd5, 0xec, 0xd2, 0x56, 0xdf, 0x54, 0x6c, 0x35, 0x39, 0xa7, 0x66, 0xfd, 0x05, 0x80, 0x4d, 0xf1, 0x30, 0x99, 0x3f, 0x9f, 0x83, 0x9b, 0x19, 0xcb, 0x26, 0x76, 0x79, 0x1b,
0x2c, 0x09, 0x88, 0xb5, 0x54, 0x5a, 0xc1, 0xc4, 0xf3, 0x05, 0x28, 0x12, 0xd1, 0x32, 0x92, 0x82, 0x56, 0x4f, 0x55, 0xa6, 0x9c, 0x5d, 0xdc, 0xea, 0x9b, 0x92, 0xad, 0x26, 0xe7, 0xd4, 0x32, 0x4e,
0x78, 0x0c, 0xdb, 0xed, 0x2b, 0xc1, 0x31, 0xa2, 0xd0, 0xda, 0xe1, 0xb3, 0x99, 0xf2, 0x5e, 0xcd, 0x93, 0x80, 0x58, 0x4b, 0xc5, 0x15, 0x4c, 0x3c, 0x5f, 0xc0, 0x45, 0x22, 0x5c, 0x46, 0x54, 0x10,
0x59, 0xe4, 0x33, 0xaf, 0x64, 0x91, 0x1f, 0xd1, 0x55, 0xe5, 0xa8, 0xae, 0x9f, 0xa7, 0x12, 0x3c, 0x8f, 0x60, 0xbb, 0x73, 0xc9, 0x38, 0x86, 0x0a, 0xad, 0x1d, 0x3d, 0x9f, 0x4b, 0xef, 0x55, 0xca,
0x40, 0x45, 0x99, 0x53, 0xac, 0x42, 0xbd, 0x63, 0x20, 0x40, 0x54, 0xa9, 0x11, 0xc0, 0xca, 0xd1, 0x22, 0x9f, 0x7b, 0x2d, 0x8b, 0xfc, 0x18, 0xaf, 0x2a, 0xab, 0xba, 0x7e, 0x9e, 0x4a, 0xf8, 0x01,
0x6c, 0x1c, 0x3a, 0xad, 0x08, 0xc4, 0xbe, 0x27, 0xcb, 0x60, 0x3b, 0x6a, 0xd6, 0x52, 0x1b, 0x82, 0xca, 0xca, 0x9c, 0xf0, 0x2a, 0xe4, 0x3b, 0x06, 0x0c, 0x84, 0x95, 0x9a, 0x21, 0xac, 0x1c, 0xce,
0xa8, 0x21, 0x9c, 0xac, 0x89, 0xa8, 0xc8, 0x5a, 0x6c, 0x6f, 0x65, 0x92, 0x6c, 0xc1, 0xb8, 0x0d, 0x27, 0x91, 0xdb, 0x56, 0x20, 0xf2, 0xb1, 0x28, 0xc3, 0xdb, 0x91, 0xb3, 0x96, 0xd9, 0x10, 0xa8,
0x5b, 0x71, 0x8a, 0xa6, 0x4d, 0x1d, 0x35, 0x7f, 0x3b, 0x43, 0x21, 0xf8, 0x94, 0xd7, 0x77, 0xed, 0x86, 0xf8, 0x64, 0x4d, 0x59, 0x45, 0xf6, 0x62, 0x7b, 0x2b, 0xd3, 0x64, 0x0b, 0xe6, 0x4d, 0xd8,
0x69, 0x70, 0xe1, 0x85, 0xac, 0x0d, 0x6b, 0x81, 0xe3, 0x9e, 0x8f, 0xb9, 0x5e, 0x7d, 0x20, 0x27, 0x8a, 0x53, 0x38, 0x6d, 0xf2, 0xa8, 0xf9, 0x9b, 0x39, 0x0c, 0xc1, 0xc7, 0xbc, 0x81, 0xe7, 0xcc,
0x61, 0x23, 0xd9, 0x37, 0x2a, 0x1a, 0x98, 0xab, 0x54, 0x22, 0xae, 0x2d, 0x60, 0xbb, 0x37, 0x75, 0xc2, 0x73, 0x3f, 0x22, 0x1d, 0x58, 0x0b, 0x5d, 0xef, 0x6c, 0x42, 0xf5, 0xea, 0x43, 0x31, 0x09,
0x32, 0x26, 0x8b, 0xb9, 0xd9, 0x58, 0xec, 0x7c, 0x07, 0x96, 0x93, 0x0d, 0xb1, 0x8f, 0xe5, 0x0d, 0x1b, 0xc9, 0xbe, 0x61, 0xd1, 0xd0, 0x5a, 0xc5, 0x12, 0x71, 0x6d, 0x21, 0xd9, 0xb9, 0xae, 0x93,
0xff, 0xb8, 0x57, 0xb9, 0xb9, 0xfb, 0xcd, 0x31, 0x41, 0x54, 0xe2, 0xb9, 0x0f, 0x8c, 0xbf, 0x9c, 0x31, 0x59, 0xa4, 0x66, 0x63, 0xb1, 0xf3, 0x5d, 0x58, 0x4e, 0x36, 0x44, 0x3e, 0x15, 0x37, 0xfc,
0x81, 0x86, 0xc9, 0x05, 0xe5, 0x6a, 0xbd, 0x54, 0x34, 0xf3, 0xfd, 0x85, 0x5a, 0x6f, 0x1e, 0xab, 0xe3, 0x5e, 0x15, 0x52, 0xf7, 0x9b, 0x63, 0x82, 0xa8, 0xc5, 0x73, 0x1f, 0x9a, 0x7f, 0x31, 0x07,
0x7a, 0x38, 0x40, 0xf5, 0xe8, 0xbd, 0x1b, 0x17, 0xe3, 0xe0, 0xd6, 0xc2, 0x88, 0x76, 0x4b, 0xb0, 0x4d, 0x8b, 0x32, 0xca, 0xd5, 0x7a, 0x29, 0x69, 0xe6, 0x07, 0x0b, 0xb5, 0x5e, 0x3f, 0x56, 0xf9,
0x44, 0x28, 0xc6, 0x16, 0x6c, 0xc8, 0xfe, 0xa8, 0xbe, 0xc4, 0xee, 0xd6, 0x44, 0x8b, 0x09, 0x77, 0x70, 0x80, 0xec, 0xd1, 0x07, 0xd7, 0x2e, 0xc6, 0xfe, 0x8d, 0x85, 0x11, 0xed, 0x54, 0x60, 0x09,
0xeb, 0x36, 0x34, 0xe8, 0xae, 0xae, 0x3e, 0x08, 0x59, 0x70, 0x0f, 0xd8, 0x91, 0x3d, 0xb4, 0x7d, 0x51, 0xcc, 0x2d, 0xd8, 0x10, 0xfd, 0x91, 0x7d, 0x89, 0xdd, 0xad, 0x89, 0x16, 0x13, 0xee, 0xd6,
0xcf, 0x73, 0x8f, 0xb9, 0x2f, 0x03, 0x9a, 0x51, 0xc2, 0x44, 0x6f, 0xa4, 0x12, 0x85, 0x29, 0xa5, 0x6d, 0x68, 0xe2, 0x5d, 0x5d, 0x7d, 0x10, 0xa2, 0xe0, 0x2e, 0x90, 0x43, 0x67, 0xe4, 0x04, 0xbe,
0x5e, 0x40, 0xf6, 0x5c, 0x15, 0xbf, 0x45, 0x29, 0xc3, 0x84, 0xb5, 0x5d, 0xfb, 0x19, 0x57, 0x35, 0xef, 0x1d, 0xd1, 0x40, 0x04, 0x34, 0x73, 0x09, 0x93, 0x7b, 0x23, 0xa5, 0x28, 0x8c, 0x29, 0xf9,
0xa9, 0x29, 0xfa, 0x0c, 0x2a, 0xd3, 0xa8, 0x52, 0x35, 0xef, 0xea, 0x19, 0x93, 0xc5, 0x66, 0x4d, 0x02, 0xb2, 0xef, 0xc9, 0xf8, 0x2d, 0x4c, 0x99, 0x01, 0xac, 0xed, 0x38, 0xcf, 0xa9, 0xac, 0x49,
0x1d, 0xdb, 0x78, 0x0c, 0xeb, 0xc9, 0x3a, 0x25, 0xeb, 0xd8, 0x86, 0xd2, 0x44, 0xc2, 0x64, 0xef, 0x4e, 0xd1, 0x13, 0xa8, 0xcd, 0x54, 0xa5, 0x72, 0xde, 0xe5, 0x33, 0x26, 0x8b, 0xcd, 0x5a, 0x3a,
0xa2, 0xb4, 0xf1, 0x5b, 0x25, 0x28, 0x4a, 0x4d, 0x95, 0xed, 0x40, 0x7e, 0xa8, 0x62, 0xe8, 0xe2, 0x36, 0x63, 0x41, 0x81, 0xef, 0x47, 0xfc, 0x71, 0x01, 0xe9, 0xd0, 0xb2, 0xaa, 0x0c, 0xf4, 0x8c,
0x27, 0xbe, 0x64, 0xae, 0xfa, 0xdf, 0xc2, 0x48, 0x3a, 0x81, 0xc7, 0x3e, 0x83, 0xe5, 0xa4, 0x1b, 0x5e, 0x75, 0xc7, 0xe6, 0x23, 0x58, 0x4f, 0xb6, 0x29, 0x58, 0xcb, 0x36, 0x54, 0xa6, 0x02, 0x26,
0x79, 0xee, 0xa1, 0x80, 0xa4, 0xff, 0xb7, 0x36, 0x9c, 0x73, 0x18, 0x96, 0xe3, 0xc3, 0x91, 0x64, 0x7a, 0xaf, 0xd2, 0x4c, 0x19, 0x61, 0x6a, 0x9b, 0x2c, 0xd3, 0xdd, 0x55, 0x6a, 0xd1, 0x13, 0xd8,
0x86, 0xd2, 0x85, 0x76, 0x7a, 0x7a, 0xae, 0x90, 0xb7, 0x83, 0x0b, 0xdb, 0x7a, 0xfc, 0xe1, 0x47, 0x5a, 0xc8, 0x11, 0x15, 0xde, 0x85, 0xba, 0xd6, 0x11, 0x1c, 0x46, 0x91, 0x89, 0xac, 0xa2, 0x27,
0xf2, 0xa5, 0x80, 0x0a, 0x02, 0xfb, 0x17, 0xf6, 0xe3, 0x0f, 0x3f, 0x9a, 0x97, 0xa4, 0xe5, 0x3b, 0xa1, 0xf9, 0x39, 0x6c, 0xa1, 0x4e, 0x15, 0x17, 0x97, 0x53, 0x90, 0x1a, 0x45, 0x2e, 0x3d, 0x8a,
0x01, 0x9a, 0x24, 0xbd, 0x0e, 0x05, 0x7a, 0xe6, 0x97, 0x82, 0xa1, 0x28, 0xc1, 0x1e, 0xc1, 0xba, 0x8f, 0xa5, 0xaa, 0xa6, 0x17, 0x8d, 0xc3, 0xfd, 0xc7, 0x3c, 0x4f, 0x86, 0xe0, 0xc8, 0xa4, 0xf9,
0x32, 0x7e, 0xc8, 0xb0, 0x75, 0xe2, 0x82, 0x25, 0xba, 0x29, 0x28, 0xf3, 0xfa, 0x98, 0x45, 0xe6, 0x5b, 0x15, 0x28, 0x0b, 0x8d, 0x9c, 0x3c, 0x80, 0xe2, 0x48, 0xc6, 0x0a, 0xc6, 0x4f, 0x99, 0x89,
0x92, 0x4d, 0x58, 0xba, 0x88, 0xdf, 0x6d, 0xae, 0x99, 0x32, 0x65, 0xfc, 0x7e, 0x01, 0x2a, 0xda, 0x5c, 0xf9, 0xbf, 0xcd, 0x23, 0x06, 0x19, 0x1e, 0x79, 0x02, 0xcb, 0x49, 0x77, 0x79, 0xea, 0x41,
0xa4, 0xb0, 0x2a, 0x94, 0xcc, 0x76, 0xbf, 0x6d, 0x7e, 0xde, 0xde, 0xab, 0xdf, 0x62, 0x0f, 0xe0, 0x84, 0xa4, 0x9f, 0xbb, 0x31, 0x4a, 0x39, 0x46, 0xab, 0xb1, 0x10, 0x80, 0xb2, 0x51, 0xe5, 0x5c,
0xad, 0x4e, 0xb7, 0xd5, 0x33, 0xcd, 0x76, 0x6b, 0x60, 0xf5, 0x4c, 0x4b, 0x3d, 0x34, 0x77, 0xdc, 0x93, 0x12, 0x7c, 0x8f, 0xe9, 0x15, 0xe1, 0xb9, 0x63, 0x3f, 0x7a, 0xfc, 0x89, 0x78, 0x11, 0xa1,
0xfc, 0xf2, 0xa8, 0xdd, 0x1d, 0x58, 0x7b, 0xed, 0x41, 0xb3, 0x73, 0xd8, 0xaf, 0x67, 0xd8, 0x6b, 0xc6, 0x81, 0x83, 0x73, 0xe7, 0xd1, 0xe3, 0x4f, 0xd2, 0x1a, 0x83, 0x78, 0x0f, 0x41, 0xd3, 0x18,
0xd0, 0x88, 0x31, 0x55, 0x76, 0xf3, 0xa8, 0x77, 0xd2, 0x1d, 0xd4, 0xb3, 0xec, 0x1e, 0xdc, 0xd9, 0xd6, 0xa1, 0x84, 0xcf, 0x19, 0x63, 0xd0, 0x17, 0x26, 0xc8, 0x43, 0x58, 0x97, 0x46, 0x1e, 0x11,
0xef, 0x74, 0x9b, 0x87, 0x56, 0x8c, 0xd3, 0x3a, 0x1c, 0x7c, 0x6e, 0xb5, 0x7f, 0xf9, 0xb8, 0x63, 0x9e, 0x8f, 0xdc, 0xbe, 0x82, 0x37, 0x22, 0x45, 0xde, 0x80, 0x67, 0xa1, 0x59, 0x68, 0x13, 0x96,
0x7e, 0x59, 0xcf, 0xa5, 0x21, 0x1c, 0x0c, 0x0e, 0x5b, 0xaa, 0x86, 0x3c, 0xbb, 0x0d, 0x1b, 0x84, 0xce, 0xe3, 0xf7, 0xa9, 0x1b, 0x96, 0x48, 0x99, 0x7f, 0x50, 0x82, 0x9a, 0x36, 0x29, 0xa4, 0x0e,
0x40, 0x45, 0xac, 0x41, 0xaf, 0x67, 0xf5, 0x7b, 0xbd, 0x6e, 0xbd, 0xc0, 0x56, 0xa1, 0xd6, 0xe9, 0x15, 0xab, 0x33, 0xe8, 0x58, 0x5f, 0x74, 0x76, 0x8d, 0x1b, 0xe4, 0x1e, 0xbc, 0xd3, 0xed, 0xb5,
0x7e, 0xde, 0x3c, 0xec, 0xec, 0x59, 0x66, 0xbb, 0x79, 0x78, 0x54, 0x5f, 0x62, 0x6b, 0xb0, 0x32, 0xfb, 0x96, 0xd5, 0x69, 0x0f, 0xed, 0xbe, 0x65, 0xcb, 0x07, 0xf5, 0x8e, 0x5a, 0x5f, 0x1d, 0x76,
0x8f, 0x57, 0x14, 0x55, 0x28, 0xbc, 0x5e, 0xb7, 0xd3, 0xeb, 0x5a, 0x9f, 0xb7, 0xcd, 0x7e, 0xa7, 0x7a, 0x43, 0x7b, 0xb7, 0x33, 0x6c, 0x75, 0x0f, 0x06, 0x46, 0x8e, 0xbc, 0x01, 0xcd, 0x18, 0x53,
0xd7, 0xad, 0x97, 0xd8, 0x26, 0xb0, 0x64, 0xd6, 0xc1, 0x51, 0xb3, 0x55, 0x2f, 0xb3, 0x0d, 0x58, 0x66, 0xb7, 0x0e, 0xfb, 0xc7, 0xbd, 0xa1, 0x91, 0x27, 0x77, 0xe0, 0xd6, 0x5e, 0xb7, 0xd7, 0x3a,
0x4d, 0xc2, 0x9f, 0xb6, 0xbf, 0xac, 0x03, 0x6b, 0xc0, 0x3a, 0x75, 0xcc, 0xda, 0x6d, 0x1f, 0xf6, 0xb0, 0x63, 0x9c, 0xf6, 0xc1, 0xf0, 0x0b, 0xbb, 0xf3, 0xcb, 0x47, 0x5d, 0xeb, 0x2b, 0xa3, 0x90,
0xbe, 0xb0, 0x8e, 0x3a, 0xdd, 0xce, 0xd1, 0xc9, 0x51, 0xbd, 0x82, 0xaf, 0x75, 0xb6, 0xdb, 0x56, 0x85, 0xb0, 0x3f, 0x3c, 0x68, 0xcb, 0x1a, 0x8a, 0xe4, 0x26, 0x6c, 0x20, 0x02, 0x16, 0xb1, 0x87,
0xa7, 0xdb, 0x3f, 0xd9, 0xdf, 0xef, 0xb4, 0x3a, 0xed, 0xee, 0xa0, 0x5e, 0xa5, 0x96, 0xd3, 0x06, 0xfd, 0xbe, 0x3d, 0xe8, 0xf7, 0x7b, 0x46, 0x89, 0xac, 0x42, 0xa3, 0xdb, 0xfb, 0xa2, 0x75, 0xd0,
0x5e, 0x13, 0x05, 0xe4, 0xdd, 0x16, 0x6b, 0xaf, 0xd3, 0x6f, 0xee, 0x1e, 0xb6, 0xf7, 0xea, 0xcb, 0xdd, 0xb5, 0xad, 0x4e, 0xeb, 0xe0, 0xd0, 0x58, 0x22, 0x6b, 0xb0, 0x92, 0xc6, 0x2b, 0xb3, 0x2a,
0xec, 0x2e, 0xdc, 0x1e, 0xb4, 0x8f, 0x8e, 0x7b, 0x66, 0xd3, 0xfc, 0x52, 0xdd, 0x7d, 0xb1, 0xf6, 0x24, 0x5e, 0xbf, 0xd7, 0xed, 0xf7, 0xec, 0x2f, 0x3a, 0xd6, 0xa0, 0xdb, 0xef, 0x19, 0x15, 0xb2,
0x9b, 0x9d, 0xc3, 0x13, 0xb3, 0x5d, 0x5f, 0x61, 0x6f, 0xc0, 0x5d, 0xb3, 0xfd, 0x93, 0x93, 0x8e, 0x09, 0x24, 0x99, 0xb5, 0x7f, 0xd8, 0x6a, 0x1b, 0x55, 0xb2, 0x01, 0xab, 0x49, 0xf8, 0xb3, 0xce,
0xd9, 0xde, 0xb3, 0xba, 0xbd, 0xbd, 0xb6, 0xb5, 0xdf, 0x6e, 0x0e, 0x4e, 0xcc, 0xb6, 0x75, 0xd4, 0x57, 0x06, 0x90, 0x26, 0xac, 0x63, 0xc7, 0xec, 0x9d, 0xce, 0x41, 0xff, 0x4b, 0xfb, 0xb0, 0xdb,
0xe9, 0xf7, 0x3b, 0xdd, 0x27, 0xf5, 0x3a, 0x7b, 0x0b, 0xee, 0x47, 0x28, 0x51, 0x05, 0x73, 0x58, 0xeb, 0x1e, 0x1e, 0x1f, 0x1a, 0x35, 0xfe, 0x2a, 0x69, 0xa7, 0x63, 0x77, 0x7b, 0x83, 0xe3, 0xbd,
0xab, 0x62, 0x7c, 0x6a, 0x49, 0xbb, 0xed, 0x5f, 0x1e, 0x58, 0xc7, 0xed, 0xb6, 0x59, 0x67, 0x6c, 0xbd, 0x6e, 0xbb, 0xdb, 0xe9, 0x0d, 0x8d, 0x3a, 0xb6, 0x9c, 0x35, 0xf0, 0x06, 0x2b, 0x20, 0xee,
0x1b, 0x36, 0xe3, 0xe6, 0xa9, 0x01, 0xd9, 0xf6, 0x9a, 0xc8, 0x3b, 0x6e, 0x9b, 0x47, 0xcd, 0xae, 0xf0, 0xd8, 0xbb, 0xdd, 0x41, 0x6b, 0xe7, 0xa0, 0xb3, 0x6b, 0x2c, 0x93, 0xdb, 0x70, 0x73, 0xd8,
0x58, 0xe0, 0x44, 0xde, 0xba, 0xe8, 0x76, 0x9c, 0x37, 0xdf, 0xed, 0x0d, 0xc6, 0x60, 0x59, 0x5b, 0x39, 0x3c, 0xea, 0x5b, 0x2d, 0xeb, 0x2b, 0x79, 0xc7, 0xc7, 0xde, 0x6b, 0x75, 0x0f, 0x8e, 0xad,
0x95, 0xfd, 0xa6, 0x59, 0xdf, 0x64, 0x2b, 0x50, 0x39, 0x3a, 0x3e, 0xb6, 0x06, 0x9d, 0xa3, 0x76, 0x8e, 0xb1, 0x42, 0xde, 0x82, 0xdb, 0x56, 0xe7, 0xa7, 0xc7, 0x5d, 0xab, 0xb3, 0x6b, 0xf7, 0xfa,
0xef, 0x64, 0x50, 0xdf, 0x62, 0x1b, 0x50, 0xef, 0x74, 0x07, 0x6d, 0x53, 0xac, 0xb5, 0x2a, 0xfa, 0xbb, 0x1d, 0x7b, 0xaf, 0xd3, 0x1a, 0x1e, 0x5b, 0x1d, 0xfb, 0xb0, 0x3b, 0x18, 0x74, 0x7b, 0x4f,
0xdf, 0x8a, 0x6c, 0x1d, 0x56, 0x54, 0x4f, 0x15, 0xf4, 0x8f, 0x8a, 0x6c, 0x0b, 0xd8, 0x49, 0xd7, 0x0d, 0x83, 0xbc, 0x03, 0x77, 0x15, 0x8a, 0xaa, 0x20, 0x85, 0xb5, 0xca, 0xc6, 0x27, 0x97, 0xb4,
0x6c, 0x37, 0xf7, 0xc4, 0xc4, 0x45, 0x19, 0xff, 0xbd, 0x28, 0x5d, 0x4a, 0x3f, 0xcb, 0x45, 0x87, 0xd7, 0xf9, 0xe5, 0xa1, 0x7d, 0xd4, 0xe9, 0x58, 0x06, 0x21, 0xdb, 0xb0, 0x19, 0x37, 0x8f, 0x0d,
0x75, 0x1c, 0xa3, 0x91, 0xfc, 0x98, 0x41, 0x55, 0xfb, 0x08, 0xc1, 0xcb, 0x3e, 0x49, 0xa4, 0xa9, 0x88, 0xb6, 0xd7, 0x58, 0xde, 0x51, 0xc7, 0x3a, 0x6c, 0xf5, 0xd8, 0x02, 0x27, 0xf2, 0xd6, 0x59,
0x56, 0xb9, 0x05, 0xd5, 0x6a, 0x41, 0x77, 0xaf, 0xe9, 0xb2, 0xdf, 0x9b, 0x50, 0x9b, 0xd0, 0x87, 0xb7, 0xe3, 0xbc, 0x74, 0xb7, 0x37, 0x08, 0x81, 0x65, 0x6d, 0x55, 0xf6, 0x5a, 0x96, 0xb1, 0x49,
0x0d, 0xe4, 0xab, 0xdd, 0x20, 0x03, 0x96, 0x08, 0x48, 0x4f, 0x76, 0x2f, 0x7c, 0x93, 0xa7, 0xb0, 0x56, 0xa0, 0x76, 0x78, 0x74, 0x64, 0x0f, 0xbb, 0x87, 0x9d, 0xfe, 0xf1, 0xd0, 0xd8, 0x22, 0x1b,
0xf8, 0x4d, 0x9e, 0x34, 0xf9, 0x7e, 0x29, 0x4d, 0xbe, 0x7f, 0x08, 0xab, 0xc4, 0x9a, 0x1c, 0xd7, 0x60, 0x74, 0x7b, 0xc3, 0x8e, 0xc5, 0xd6, 0x5a, 0x16, 0xfd, 0xcf, 0x65, 0xb2, 0x0e, 0x2b, 0xb2,
0x99, 0x28, 0xad, 0x99, 0xa4, 0xc0, 0x15, 0x64, 0x51, 0x04, 0x57, 0xea, 0x84, 0x52, 0x39, 0x24, 0xa7, 0x12, 0xfa, 0xc7, 0x65, 0xb2, 0x05, 0xe4, 0xb8, 0x67, 0x75, 0x5a, 0xbb, 0x6c, 0xe2, 0x54,
0x0b, 0x29, 0x4a, 0x6d, 0x23, 0xa1, 0x69, 0x10, 0xe7, 0x88, 0x34, 0x8d, 0xa8, 0x05, 0xfb, 0x2a, 0xc6, 0x7f, 0x29, 0x0b, 0xd7, 0xd9, 0xef, 0x16, 0x94, 0x50, 0x12, 0xc7, 0xa2, 0x24, 0x3f, 0xda,
0x6e, 0xa1, 0xa2, 0xb5, 0x40, 0x70, 0x6c, 0xe1, 0x21, 0xac, 0xf2, 0xab, 0xd0, 0xb7, 0x2d, 0x6f, 0x50, 0xd7, 0x3e, 0xb6, 0xf0, 0xaa, 0x4f, 0x2f, 0x69, 0x2a, 0x64, 0x61, 0x41, 0x85, 0x5c, 0xb0,
0x6a, 0x7f, 0x35, 0x43, 0x9f, 0xb7, 0x8d, 0x3a, 0x7c, 0xd5, 0x5c, 0xc1, 0x8c, 0x1e, 0xc2, 0xf7, 0x51, 0x34, 0x74, 0x19, 0xf7, 0x6d, 0x68, 0x4c, 0xf1, 0x03, 0x0e, 0xe2, 0x75, 0x72, 0x10, 0x81,
0xec, 0xd0, 0x7e, 0xf8, 0x67, 0xa0, 0xa2, 0x7d, 0xf4, 0x82, 0x6d, 0xc1, 0xda, 0x17, 0x9d, 0x41, 0x59, 0x08, 0xc4, 0xa7, 0xc9, 0x17, 0xbe, 0x3d, 0x54, 0x5a, 0xfc, 0xf6, 0x50, 0x96, 0x1e, 0xb3,
0xb7, 0xdd, 0xef, 0x5b, 0xc7, 0x27, 0xbb, 0x4f, 0xdb, 0x5f, 0x5a, 0x07, 0xcd, 0xfe, 0x41, 0xfd, 0x94, 0xa5, 0xc7, 0xdc, 0x87, 0x55, 0x64, 0x4d, 0xae, 0xe7, 0x4e, 0xa5, 0x75, 0x00, 0xa5, 0xdd,
0x96, 0xd8, 0xb4, 0xdd, 0x76, 0x7f, 0xd0, 0xde, 0x4b, 0xc0, 0x33, 0xec, 0x75, 0xd8, 0x3e, 0xe9, 0x15, 0xce, 0xa2, 0x10, 0x2e, 0xd5, 0x26, 0xa9, 0x5a, 0x09, 0x16, 0x52, 0x16, 0x5a, 0x55, 0x42,
0x9e, 0xf4, 0xdb, 0x7b, 0x56, 0x5a, 0xb9, 0xac, 0xa0, 0x52, 0x99, 0x9f, 0x52, 0x3c, 0xf7, 0xf0, 0xa3, 0x42, 0xce, 0xa1, 0x34, 0x2a, 0xd5, 0x82, 0x73, 0x19, 0xb7, 0x50, 0xd3, 0x5a, 0x40, 0x38,
0xd7, 0x60, 0x39, 0x79, 0x0d, 0x9c, 0x01, 0x2c, 0x1d, 0xb6, 0x9f, 0x34, 0x5b, 0x5f, 0xd2, 0x7b, 0x6f, 0xe1, 0x3e, 0xac, 0xd2, 0xcb, 0x28, 0x70, 0x6c, 0x7f, 0xe6, 0x7c, 0x3d, 0xe7, 0xbe, 0x7d,
0xbe, 0xfd, 0x41, 0x73, 0xd0, 0x69, 0x59, 0xf2, 0xfd, 0x5e, 0xc1, 0x11, 0x32, 0xac, 0x02, 0xc5, 0x87, 0xdb, 0x2a, 0xea, 0xd6, 0x0a, 0xcf, 0xe8, 0x73, 0xf8, 0xae, 0x13, 0x39, 0xf7, 0xff, 0x3f,
0x66, 0xb7, 0x75, 0xd0, 0x33, 0xfb, 0xf5, 0x2c, 0x7b, 0x0d, 0xb6, 0x14, 0xad, 0xb6, 0x7a, 0x47, 0xa8, 0x69, 0x1f, 0xf7, 0x20, 0x5b, 0xb0, 0xf6, 0x65, 0x77, 0xd8, 0xeb, 0x0c, 0x06, 0xf6, 0xd1,
0x47, 0x9d, 0x01, 0x32, 0xc3, 0xc1, 0x97, 0xc7, 0x82, 0x34, 0x1f, 0xda, 0x50, 0x8e, 0x9f, 0x1e, 0xf1, 0xce, 0xb3, 0xce, 0x57, 0xf6, 0x7e, 0x6b, 0xb0, 0x6f, 0xdc, 0x60, 0x9b, 0xb6, 0xd7, 0x19,
0x46, 0x06, 0xd3, 0x19, 0x74, 0x9a, 0x83, 0x98, 0xbb, 0xd6, 0x6f, 0x09, 0xfe, 0x15, 0x83, 0xf1, 0x0c, 0x3b, 0xbb, 0x09, 0x78, 0x8e, 0xbc, 0x09, 0xdb, 0xc7, 0xbd, 0xe3, 0x41, 0x67, 0xd7, 0xce,
0xfd, 0xe0, 0x7a, 0x86, 0x6e, 0xca, 0x29, 0x20, 0xb5, 0x5e, 0xcf, 0x8a, 0x4d, 0x15, 0x43, 0x77, 0x2a, 0x97, 0x67, 0x54, 0x2a, 0xf2, 0x33, 0x8a, 0x17, 0xee, 0xff, 0x1a, 0x2c, 0x27, 0xaf, 0xbb,
0x7b, 0x03, 0x31, 0x84, 0x5f, 0x87, 0xe5, 0xe4, 0x0b, 0xbf, 0xac, 0x0e, 0x55, 0xd1, 0xbe, 0xd6, 0x13, 0x80, 0xa5, 0x83, 0xce, 0xd3, 0x56, 0xfb, 0x2b, 0x7c, 0xb7, 0x78, 0x30, 0x6c, 0x0d, 0xbb,
0x04, 0xc0, 0x12, 0xf5, 0xb8, 0x9e, 0x21, 0x0e, 0xda, 0xea, 0x1d, 0x75, 0xba, 0x4f, 0x90, 0xed, 0x6d, 0x5b, 0xbc, 0x53, 0xcc, 0x38, 0x42, 0x8e, 0xd4, 0xa0, 0xdc, 0xea, 0xb5, 0xf7, 0xfb, 0xd6,
0xd6, 0xb3, 0x02, 0xd4, 0x3b, 0x19, 0x3c, 0xe9, 0x45, 0xa0, 0x9c, 0x28, 0x41, 0xc3, 0xa9, 0xe7, 0xc0, 0xc8, 0x93, 0x37, 0x60, 0x4b, 0xd2, 0x6a, 0xbb, 0x7f, 0x78, 0xd8, 0x1d, 0x72, 0x66, 0x38,
0x1f, 0x7e, 0x05, 0xab, 0x0b, 0x6f, 0x01, 0x8b, 0x5e, 0xf7, 0x4e, 0x06, 0xad, 0xde, 0x91, 0xde, 0xfc, 0xea, 0x88, 0x91, 0xe6, 0x7d, 0x07, 0xaa, 0xf1, 0x13, 0xcb, 0x9c, 0xc1, 0x74, 0x87, 0xdd,
0x4e, 0x05, 0x8a, 0xad, 0xc3, 0x66, 0xe7, 0x08, 0xad, 0xbe, 0x35, 0x28, 0x9f, 0x74, 0x55, 0x32, 0xd6, 0x30, 0xe6, 0xae, 0xc6, 0x0d, 0xc6, 0xbf, 0x62, 0x30, 0x7f, 0x27, 0xd9, 0xc8, 0xe1, 0x8d,
0x9b, 0x7c, 0xc5, 0x38, 0x27, 0x78, 0xc1, 0x7e, 0xc7, 0xec, 0x0f, 0xac, 0xfe, 0xa0, 0xf9, 0xa4, 0x40, 0x09, 0xc4, 0xd6, 0x8d, 0x3c, 0xdb, 0x54, 0x31, 0x74, 0xa7, 0x3f, 0x64, 0x43, 0xf8, 0x75,
0x5d, 0xcf, 0x8b, 0xb2, 0x8a, 0x31, 0x14, 0x1e, 0x7e, 0x0a, 0xcb, 0xc9, 0x20, 0xcf, 0xa4, 0xb5, 0x58, 0x4e, 0xbe, 0x64, 0x4c, 0x0c, 0xa8, 0xb3, 0xf6, 0xb5, 0x26, 0x00, 0x96, 0xb0, 0xc7, 0x46,
0x7e, 0x1b, 0x36, 0x77, 0xdb, 0x83, 0x2f, 0xda, 0xed, 0x2e, 0x2e, 0x79, 0xab, 0xdd, 0x1d, 0x98, 0x0e, 0x39, 0x68, 0xbb, 0x7f, 0xd8, 0xed, 0x3d, 0xe5, 0x6c, 0xd7, 0xc8, 0x33, 0x50, 0xff, 0x78,
0xcd, 0xc3, 0xce, 0xe0, 0xcb, 0x7a, 0xe6, 0xe1, 0x67, 0x50, 0x9f, 0xf7, 0xa8, 0x26, 0x5c, 0xd0, 0xf8, 0xb4, 0xaf, 0x40, 0x05, 0x56, 0x02, 0x87, 0x63, 0x14, 0xef, 0x7f, 0x0d, 0xab, 0x0b, 0x6f,
0x2f, 0xf2, 0x55, 0x3f, 0xfc, 0xcf, 0x19, 0x58, 0x4f, 0x73, 0x26, 0x08, 0xc2, 0x94, 0x1c, 0x47, 0x1e, 0xb3, 0x5e, 0xf7, 0x8f, 0x87, 0xed, 0xfe, 0xa1, 0xde, 0x4e, 0x0d, 0xca, 0xed, 0x83, 0x56,
0x9c, 0x3b, 0xfd, 0x5e, 0xd7, 0xea, 0xf6, 0xf0, 0x5d, 0xd0, 0x6d, 0xd8, 0x9c, 0xcb, 0x50, 0xa3, 0xf7, 0x90, 0x5b, 0xb7, 0x1b, 0x50, 0x3d, 0xee, 0xc9, 0x64, 0x3e, 0xf9, 0x5a, 0x73, 0x81, 0xf1,
0xc8, 0xb0, 0x3b, 0xb0, 0xb5, 0x50, 0xc8, 0x32, 0x7b, 0x27, 0xb8, 0x96, 0x0d, 0x58, 0x9f, 0xcb, 0x82, 0xbd, 0xae, 0x35, 0x18, 0xda, 0x83, 0x61, 0xeb, 0x69, 0xc7, 0x28, 0xb2, 0xb2, 0x92, 0x31,
0x6c, 0x9b, 0x66, 0xcf, 0xac, 0xe7, 0xd8, 0x7b, 0xf0, 0x60, 0x2e, 0x67, 0xf1, 0xb4, 0x55, 0x87, 0x94, 0xee, 0x7f, 0x0e, 0xcb, 0xc9, 0x60, 0xd6, 0xa4, 0x57, 0x62, 0x1b, 0x36, 0x77, 0x3a, 0xc3,
0x71, 0x9e, 0xbd, 0x03, 0x6f, 0x2e, 0x60, 0xc7, 0x07, 0x92, 0xb5, 0xdb, 0x3c, 0x14, 0xc3, 0xab, 0x2f, 0x3b, 0x9d, 0x1e, 0x5f, 0xf2, 0x76, 0xa7, 0x37, 0xb4, 0x5a, 0x07, 0xdd, 0xe1, 0x57, 0x46,
0x17, 0x1e, 0xfe, 0x83, 0x1c, 0x40, 0x7c, 0x8b, 0x4a, 0xb4, 0xbf, 0xd7, 0x1c, 0x34, 0x0f, 0x7b, 0xee, 0xfe, 0x13, 0x30, 0xd2, 0x9e, 0xe3, 0x84, 0xab, 0xfd, 0x65, 0x3e, 0xf9, 0xfb, 0xff, 0x21,
0x62, 0xcf, 0x98, 0xbd, 0x81, 0xa8, 0xdd, 0x6c, 0xff, 0xa4, 0x7e, 0x2b, 0x35, 0xa7, 0x77, 0x2c, 0x07, 0xeb, 0x59, 0x4e, 0x13, 0x46, 0x98, 0x82, 0xe3, 0xb0, 0x73, 0x67, 0xd0, 0xef, 0xd9, 0xbd,
0x06, 0xb4, 0x05, 0x6b, 0x44, 0x7f, 0x87, 0x62, 0x18, 0x82, 0x5c, 0xf0, 0x89, 0x59, 0x3c, 0xd2, 0x3e, 0x7f, 0xff, 0x74, 0x1b, 0x36, 0x53, 0x19, 0x72, 0x14, 0x39, 0x72, 0x0b, 0xb6, 0x16, 0x0a,
0x4f, 0x8e, 0xf7, 0xcd, 0x5e, 0x77, 0x60, 0xf5, 0x0f, 0x4e, 0x06, 0x7b, 0xf8, 0x40, 0x6d, 0xcb, 0xd9, 0x56, 0xff, 0x98, 0xaf, 0x65, 0x13, 0xd6, 0x53, 0x99, 0x1d, 0xcb, 0xea, 0x5b, 0x46, 0x81,
0xec, 0x1c, 0x53, 0x9d, 0xf9, 0x17, 0x21, 0x88, 0xaa, 0x0b, 0x62, 0x83, 0x3f, 0xe9, 0xf5, 0xfb, 0x7c, 0x00, 0xf7, 0x52, 0x39, 0x8b, 0xa7, 0xad, 0x3c, 0x8c, 0x8b, 0xe4, 0x3d, 0x78, 0x7b, 0x01,
0x9d, 0x63, 0xeb, 0x27, 0x27, 0x6d, 0xb3, 0xd3, 0xee, 0x63, 0xc1, 0xa5, 0x14, 0xb8, 0xc0, 0x2f, 0x3b, 0x3e, 0x90, 0xec, 0x9d, 0xd6, 0x01, 0x1b, 0x9e, 0x51, 0xba, 0xff, 0xf7, 0x0a, 0x00, 0xf1,
0x0a, 0x9a, 0x1d, 0x1c, 0x7e, 0x2e, 0x4f, 0x6a, 0x81, 0x5a, 0x4a, 0x82, 0x04, 0x56, 0x59, 0xac, 0x6d, 0x31, 0xd6, 0xfe, 0x6e, 0x6b, 0xd8, 0x3a, 0xe8, 0xb3, 0x3d, 0x63, 0xf5, 0x87, 0xac, 0x76,
0x8e, 0x38, 0xea, 0x52, 0x6a, 0x86, 0x1b, 0xf2, 0x44, 0xb9, 0x8a, 0x38, 0xc4, 0x17, 0x76, 0x3e, 0xab, 0xf3, 0x53, 0xe3, 0x46, 0x66, 0x4e, 0xff, 0x88, 0x0d, 0x68, 0x0b, 0xd6, 0x90, 0xfe, 0x0e,
0x16, 0xab, 0xa6, 0x67, 0x89, 0x52, 0x78, 0xbe, 0x47, 0xd2, 0xd0, 0xde, 0x9e, 0x89, 0x05, 0x96, 0xd8, 0x30, 0x18, 0xb9, 0xf0, 0xa7, 0x74, 0xf9, 0x91, 0x7e, 0x7c, 0xb4, 0x67, 0xf5, 0x7b, 0x43,
0x17, 0xa0, 0x02, 0x77, 0x45, 0x10, 0xa1, 0x38, 0x0b, 0x05, 0x4a, 0x5d, 0x25, 0x44, 0xce, 0xea, 0x7b, 0xb0, 0x7f, 0x3c, 0xdc, 0xe5, 0x0f, 0xf1, 0xb6, 0xad, 0xee, 0x11, 0xd6, 0x59, 0x7c, 0x19,
0xe3, 0x7f, 0x7b, 0x0f, 0xca, 0x51, 0x34, 0x35, 0xfb, 0x31, 0xd4, 0x12, 0xd7, 0x5b, 0x99, 0xb2, 0x02, 0xab, 0xba, 0xc4, 0x36, 0xf8, 0xd3, 0xfe, 0x60, 0xd0, 0x3d, 0xb2, 0x7f, 0x7a, 0xdc, 0xb1,
0x75, 0xa6, 0xdd, 0x86, 0xdd, 0x7e, 0x2d, 0x3d, 0x53, 0x8a, 0xd5, 0x47, 0x9a, 0xda, 0x44, 0x95, 0xba, 0x9d, 0x01, 0x2f, 0xb8, 0x94, 0x01, 0x67, 0xf8, 0x65, 0x46, 0xb3, 0xc3, 0x83, 0x2f, 0xc4,
0xbd, 0x36, 0xaf, 0xca, 0x24, 0x6a, 0xbb, 0x7b, 0x43, 0xae, 0xac, 0xee, 0x29, 0xbe, 0x76, 0xab, 0x49, 0xcd, 0x50, 0x2b, 0x49, 0x10, 0xc3, 0xaa, 0xb2, 0xd5, 0x61, 0x47, 0x5d, 0x46, 0xcd, 0x70,
0x7f, 0x3b, 0x95, 0xdd, 0x8d, 0x9f, 0x1e, 0x4d, 0xf9, 0xa6, 0xea, 0xf6, 0xed, 0xc5, 0xaf, 0x9c, 0x4d, 0x1e, 0x2b, 0x57, 0x63, 0x87, 0xf8, 0xc2, 0xce, 0xe7, 0xc5, 0xea, 0xd9, 0x59, 0xac, 0x14,
0xaa, 0xcf, 0xa2, 0xee, 0x41, 0x45, 0xfb, 0x24, 0x18, 0xbb, 0x7d, 0xe3, 0xe7, 0xcb, 0xb6, 0xb7, 0x3f, 0xdf, 0x95, 0x34, 0xb4, 0xbb, 0x6b, 0xf1, 0x02, 0xcb, 0x0b, 0x50, 0x86, 0xbb, 0xc2, 0x88,
0xd3, 0xb2, 0x64, 0x97, 0x7e, 0x00, 0xe5, 0xe8, 0xf3, 0x50, 0x6c, 0x4b, 0xfb, 0xb4, 0x97, 0xfe, 0x90, 0x9d, 0x85, 0x0c, 0xc5, 0x90, 0x09, 0x96, 0xb3, 0xfa, 0xe8, 0x7f, 0xdc, 0x85, 0xaa, 0x8a,
0x91, 0xab, 0xed, 0xc6, 0x62, 0x86, 0x2c, 0xbf, 0x07, 0x15, 0xed, 0x2b, 0x4f, 0x51, 0x2f, 0x16, 0x1a, 0x27, 0x3f, 0x81, 0x46, 0xe2, 0x1a, 0x2f, 0x91, 0x36, 0xdd, 0xac, 0x5b, 0xbf, 0xdb, 0x6f,
0xbf, 0x24, 0x15, 0xf5, 0x22, 0xed, 0xa3, 0x50, 0x87, 0xb0, 0x21, 0x95, 0xb3, 0x53, 0xfe, 0x75, 0x64, 0x67, 0x0a, 0xa1, 0xfa, 0x50, 0x53, 0x0f, 0xb1, 0xb2, 0x37, 0xd2, 0x2a, 0x5b, 0xa2, 0xb6,
0xa6, 0x27, 0xe5, 0x23, 0xb0, 0x8f, 0x32, 0xec, 0x33, 0x28, 0xa9, 0xef, 0x79, 0xb1, 0xcd, 0xf4, 0xdb, 0xd7, 0xe4, 0x8a, 0xea, 0x9e, 0xf1, 0x57, 0x7d, 0xf5, 0x6f, 0xc4, 0x92, 0xdb, 0xf1, 0x13,
0xaf, 0x95, 0x6d, 0x6f, 0x2d, 0xc0, 0x65, 0x57, 0x9a, 0x00, 0xf1, 0xf7, 0xa3, 0x98, 0x1a, 0xf8, 0xab, 0x19, 0xdf, 0x8e, 0xdd, 0xbe, 0xb9, 0xf8, 0x35, 0x57, 0xf9, 0xf9, 0xd7, 0x5d, 0xa8, 0x69,
0xc2, 0xf7, 0xa8, 0xa2, 0x95, 0x49, 0xf9, 0xd8, 0xd4, 0x1e, 0x54, 0xb4, 0x4f, 0x45, 0x45, 0x73, 0x9f, 0x3e, 0x23, 0x37, 0xaf, 0xfd, 0x4c, 0xdb, 0xf6, 0x76, 0x56, 0x96, 0xe8, 0xd2, 0x0f, 0xa1,
0xb2, 0xf8, 0x99, 0xa9, 0x68, 0x4e, 0xd2, 0xbe, 0x2c, 0xf5, 0x63, 0xa8, 0x25, 0xbe, 0xf9, 0x14, 0xaa, 0x3e, 0x83, 0x45, 0xb6, 0xb4, 0x4f, 0x98, 0xe9, 0x1f, 0xf3, 0xda, 0x6e, 0x2e, 0x66, 0x88,
0xd1, 0x71, 0xda, 0x17, 0xa5, 0x22, 0x3a, 0x4e, 0xff, 0x4c, 0xd4, 0x1e, 0x54, 0xb4, 0x2f, 0x34, 0xf2, 0xbb, 0x50, 0xd3, 0xbe, 0x66, 0xa5, 0x7a, 0xb1, 0xf8, 0xc5, 0x2c, 0xd5, 0x8b, 0xac, 0x8f,
0x45, 0x3d, 0x5a, 0xfc, 0x18, 0x54, 0xd4, 0xa3, 0x94, 0x0f, 0x3a, 0x89, 0xdd, 0x90, 0xfc, 0x3c, 0x5f, 0x1d, 0xc0, 0x86, 0x50, 0x42, 0x4f, 0xe8, 0x37, 0x99, 0x9e, 0x8c, 0x8f, 0xdd, 0x3e, 0xcc,
0x53, 0xb4, 0x1b, 0x52, 0xbf, 0xf3, 0x14, 0xed, 0x86, 0xf4, 0x6f, 0x3a, 0x09, 0xd2, 0x8b, 0x9e, 0x91, 0x27, 0x50, 0x91, 0xdf, 0x2d, 0x23, 0x9b, 0xd9, 0x5f, 0x65, 0xdb, 0xde, 0x5a, 0x80, 0x8b,
0xb9, 0x66, 0x5b, 0x1a, 0x75, 0xe8, 0xef, 0x65, 0x47, 0xa4, 0xb7, 0xf8, 0x22, 0xf6, 0x13, 0x58, 0xae, 0xb4, 0x00, 0xe2, 0xef, 0x64, 0x11, 0x39, 0xf0, 0x85, 0xef, 0x6e, 0xa9, 0x95, 0xc9, 0xf8,
0x8b, 0x88, 0x26, 0x7a, 0xa4, 0x3a, 0x88, 0xfa, 0x94, 0xfa, 0x14, 0xf6, 0x76, 0x7d, 0x3e, 0xf7, 0xa8, 0xd6, 0x2e, 0xd4, 0xb4, 0x4f, 0x62, 0xa9, 0x39, 0x59, 0xfc, 0x9c, 0x96, 0x9a, 0x93, 0xac,
0x51, 0x86, 0x7d, 0x02, 0x45, 0xf9, 0xf2, 0x2f, 0xdb, 0x98, 0x7f, 0x09, 0x98, 0x3a, 0xb1, 0x99, 0x2f, 0x68, 0xfd, 0x04, 0x1a, 0x89, 0x6f, 0x5b, 0x29, 0x3a, 0xce, 0xfa, 0x72, 0x96, 0xa2, 0xe3,
0xfe, 0x40, 0x30, 0x3b, 0xc6, 0x0d, 0xad, 0x3f, 0xcd, 0xab, 0x53, 0x6c, 0xca, 0x6b, 0xbe, 0xdb, 0xec, 0xcf, 0x61, 0xed, 0x42, 0x4d, 0xfb, 0x12, 0x95, 0xea, 0xd1, 0xe2, 0x47, 0xaf, 0x54, 0x8f,
0xaf, 0xdf, 0x94, 0x1d, 0xd7, 0x38, 0xff, 0x9c, 0xf4, 0xdd, 0x9b, 0x9e, 0x9d, 0x48, 0xd6, 0x78, 0x32, 0x3e, 0x5c, 0xc5, 0x76, 0x43, 0xf2, 0x33, 0x54, 0x6a, 0x37, 0x64, 0x7e, 0xcf, 0x4a, 0xed,
0xd3, 0xfb, 0x58, 0x4f, 0xa0, 0xaa, 0x7f, 0x1c, 0x84, 0xe9, 0xfb, 0x70, 0xbe, 0xae, 0x3b, 0xa9, 0x86, 0xec, 0x6f, 0x57, 0x31, 0xd2, 0x53, 0xcf, 0x79, 0x93, 0x2d, 0x8d, 0x3a, 0xf4, 0x77, 0xc1,
0x79, 0xb2, 0xa2, 0xcf, 0x61, 0x33, 0x9a, 0x6f, 0xfd, 0x0d, 0x84, 0x80, 0xdd, 0x4b, 0x79, 0x19, 0x15, 0xe9, 0x2d, 0xbe, 0xfc, 0xfd, 0x14, 0xd6, 0x14, 0xd1, 0xa8, 0xc7, 0xb8, 0x43, 0xd5, 0xa7,
0x21, 0x31, 0xeb, 0xb7, 0x6f, 0x7c, 0x3a, 0xe1, 0x51, 0x06, 0x99, 0x6c, 0xe2, 0x3d, 0xff, 0x98, 0xcc, 0x27, 0xbf, 0xb7, 0x8d, 0x74, 0xee, 0xc3, 0x1c, 0xf9, 0x0c, 0xca, 0xe2, 0x85, 0x63, 0xb2,
0xc9, 0xa6, 0x7d, 0xc6, 0x20, 0x66, 0xb2, 0xe9, 0x1f, 0x01, 0x68, 0xc2, 0x8a, 0xf6, 0x86, 0x43, 0x91, 0x7e, 0xf1, 0x18, 0x3b, 0xb1, 0x99, 0xfd, 0x10, 0x32, 0x39, 0xe2, 0x1b, 0x5a, 0x7f, 0x82,
0xff, 0xda, 0x1d, 0x46, 0xf4, 0xbe, 0xf8, 0x66, 0xea, 0x76, 0x9a, 0x89, 0x90, 0xb5, 0xa0, 0xa2, 0x58, 0xa7, 0xd8, 0x8c, 0x57, 0x8b, 0xb7, 0xdf, 0xbc, 0x2e, 0x3b, 0xae, 0x31, 0xfd, 0x6c, 0xf6,
0x3f, 0x03, 0xf1, 0x82, 0xe2, 0x5b, 0x5a, 0x96, 0xfe, 0x80, 0xe6, 0xa3, 0x0c, 0x3b, 0x84, 0xfa, 0xed, 0xeb, 0x9e, 0xd7, 0x48, 0xd6, 0x78, 0xdd, 0x3b, 0x60, 0x4f, 0xa1, 0xae, 0x7f, 0x04, 0x85,
0xfc, 0xa3, 0x6d, 0xd1, 0x16, 0x4e, 0x7b, 0xe8, 0x6e, 0x7b, 0x2e, 0x33, 0xf1, 0xd4, 0x9b, 0xa0, 0xe8, 0xfb, 0x30, 0x5d, 0xd7, 0xad, 0xcc, 0x3c, 0x51, 0xd1, 0x17, 0xb0, 0xa9, 0xe6, 0x5b, 0x7f,
0x8b, 0xc4, 0xc7, 0x46, 0x3d, 0x7f, 0xfe, 0x28, 0x4a, 0x7e, 0x84, 0x34, 0xaa, 0x2d, 0xed, 0xf3, 0xeb, 0x21, 0x24, 0x77, 0x32, 0x5e, 0x80, 0x48, 0xcc, 0xfa, 0xcd, 0x6b, 0x9f, 0x88, 0x78, 0x98,
0xb3, 0x0f, 0x32, 0x8f, 0x32, 0x6c, 0x1f, 0xaa, 0x89, 0x37, 0x8b, 0x12, 0x81, 0xfd, 0x73, 0xc3, 0xe3, 0x4c, 0x36, 0xf1, 0xdd, 0x82, 0x98, 0xc9, 0x66, 0x7d, 0xae, 0x21, 0x66, 0xb2, 0xd9, 0x1f,
0x6c, 0xe8, 0x79, 0x73, 0xe3, 0x3c, 0x82, 0xe5, 0xa4, 0x2f, 0x3b, 0xea, 0x58, 0xaa, 0xd7, 0x3c, 0x3b, 0x68, 0xc1, 0x8a, 0xf6, 0x56, 0xc5, 0xe0, 0xca, 0x1b, 0x29, 0x7a, 0x5f, 0x7c, 0x1b, 0x76,
0x5a, 0xbe, 0x74, 0x07, 0x38, 0xfb, 0x21, 0x7d, 0x4a, 0x5b, 0xc5, 0x2d, 0xb1, 0xc5, 0x4f, 0x2f, 0x3b, 0xcb, 0x14, 0x4a, 0xda, 0x50, 0xd3, 0x9f, 0xbb, 0x78, 0x49, 0xf1, 0x2d, 0x2d, 0x4b, 0x7f,
0x47, 0x6b, 0xa6, 0x7f, 0xa8, 0xd8, 0xc8, 0xfd, 0x85, 0x6c, 0x06, 0xc7, 0xf5, 0x7d, 0xfa, 0x90, 0x28, 0xf4, 0x61, 0x8e, 0x1c, 0x80, 0x91, 0x7e, 0x9c, 0x4e, 0x6d, 0xe1, 0xac, 0x07, 0xfd, 0xb6,
0xa5, 0x0a, 0x5d, 0x11, 0xeb, 0xff, 0xaa, 0x95, 0xb0, 0x7d, 0x6a, 0x5c, 0x7e, 0x46, 0x38, 0xe6, 0x53, 0x99, 0x89, 0x27, 0xed, 0x18, 0x5d, 0x24, 0x3e, 0xaa, 0xea, 0x07, 0xe9, 0xa3, 0x28, 0xf9,
0xdc, 0x0b, 0x9f, 0x16, 0x7e, 0x49, 0x1f, 0x9a, 0xd4, 0x07, 0x59, 0x26, 0x41, 0x83, 0xaf, 0x58, 0xb1, 0x55, 0x55, 0x5b, 0xd6, 0x67, 0x76, 0xef, 0xe5, 0x1e, 0xe6, 0xc8, 0x1e, 0xd4, 0x13, 0x6f,
0x17, 0xfb, 0x18, 0x20, 0x8e, 0x07, 0x64, 0x73, 0x51, 0x69, 0xd1, 0x86, 0x4a, 0x09, 0x19, 0x6c, 0x33, 0x25, 0x2e, 0x30, 0xa4, 0x86, 0xd9, 0xd4, 0xf3, 0x52, 0xe3, 0x3c, 0x84, 0xe5, 0xa4, 0xcf,
0xd3, 0x7e, 0x8f, 0xc2, 0xe2, 0xf4, 0x23, 0x39, 0x19, 0xa1, 0x97, 0x38, 0x92, 0xe7, 0xab, 0xf9, 0x5e, 0x75, 0x2c, 0x33, 0x3a, 0x40, 0x2d, 0x5f, 0xb6, 0xa3, 0x9f, 0xfc, 0x08, 0x3f, 0x19, 0x2e,
0x2e, 0xd4, 0x0e, 0x3d, 0xef, 0xd9, 0x6c, 0x1a, 0x05, 0x95, 0x27, 0x63, 0x36, 0x84, 0xce, 0xbf, 0xe3, 0xb3, 0xc8, 0xe2, 0x27, 0xa6, 0xd5, 0x9a, 0xe9, 0x1f, 0x64, 0x36, 0x0b, 0x7f, 0x2e, 0x9f,
0x3d, 0xd7, 0x2d, 0xd6, 0x84, 0xd5, 0x88, 0x45, 0xc4, 0x71, 0x79, 0x49, 0xa4, 0x04, 0x63, 0x98, 0xe3, 0xe3, 0xfa, 0x01, 0x7e, 0xb0, 0x53, 0x86, 0xe8, 0xb0, 0xf5, 0x7f, 0xdd, 0x4a, 0xc8, 0x1e,
0xab, 0xe0, 0x51, 0x86, 0x3d, 0x86, 0xea, 0x1e, 0x1f, 0xe2, 0x9b, 0x02, 0x18, 0x5d, 0xb0, 0x96, 0x36, 0x2e, 0x3e, 0x97, 0x1c, 0x73, 0xee, 0x85, 0x4f, 0x28, 0xbf, 0xa2, 0x0f, 0x2d, 0xec, 0x83,
0xf0, 0x54, 0x53, 0x58, 0xc2, 0x76, 0x2d, 0x01, 0x54, 0x2c, 0x2e, 0x8e, 0x52, 0xd1, 0xcf, 0x8c, 0x28, 0x93, 0xa0, 0xc1, 0xd7, 0xac, 0x8b, 0x7c, 0x0a, 0x10, 0xc7, 0x3d, 0x92, 0x54, 0xf4, 0x9d,
0x64, 0xa8, 0x47, 0x82, 0xc5, 0x2d, 0x44, 0xaa, 0x7c, 0x0e, 0xab, 0x0b, 0x71, 0x20, 0x11, 0x77, 0xda, 0x50, 0x19, 0xa1, 0x91, 0x1d, 0xdc, 0xef, 0x2a, 0xfc, 0x4f, 0x3f, 0x92, 0x93, 0x91, 0x88,
0xbb, 0x29, 0x7a, 0x64, 0xfb, 0xfe, 0xcd, 0x08, 0xb2, 0xde, 0x1f, 0x41, 0x8d, 0xde, 0x53, 0x3d, 0x89, 0x23, 0x39, 0x5d, 0xcd, 0xf7, 0xa1, 0x71, 0xe0, 0xfb, 0xcf, 0xe7, 0x33, 0x15, 0x3c, 0x9f,
0xe5, 0x74, 0x27, 0x70, 0xee, 0x41, 0x1d, 0xfd, 0xc2, 0xe1, 0x3c, 0x4b, 0xa2, 0x02, 0x4f, 0xf0, 0x8c, 0x4d, 0x61, 0x3a, 0xff, 0x76, 0xaa, 0x5b, 0xa4, 0x05, 0xab, 0x8a, 0x45, 0xc4, 0xf1, 0x87,
0xdb, 0x09, 0xda, 0x8d, 0xbb, 0x68, 0x5d, 0x17, 0x6f, 0x01, 0x46, 0xeb, 0x9a, 0x76, 0xb9, 0xef, 0x49, 0xa4, 0x04, 0x63, 0x48, 0x55, 0xf0, 0x30, 0x47, 0x1e, 0x41, 0x7d, 0x97, 0x8e, 0xf8, 0xdb,
0x53, 0xa8, 0x3c, 0xe1, 0xa1, 0xba, 0xc3, 0x16, 0xc9, 0x47, 0x73, 0x97, 0xda, 0xb6, 0x53, 0x6e, 0x09, 0x3c, 0x8a, 0x62, 0x2d, 0xe1, 0x91, 0xc7, 0xf0, 0x8b, 0xed, 0x46, 0x02, 0x28, 0x59, 0x5c,
0x1e, 0xb2, 0x8f, 0xb0, 0x68, 0x74, 0x1f, 0x7b, 0x53, 0x6b, 0x45, 0x2f, 0xba, 0x32, 0x07, 0x17, 0x1c, 0x8d, 0xa3, 0x9f, 0x19, 0xc9, 0x90, 0x96, 0x04, 0x8b, 0x5b, 0x88, 0xc8, 0xf9, 0x02, 0x56,
0xd2, 0x87, 0xf6, 0x2a, 0x43, 0xd4, 0xf1, 0xc5, 0x57, 0x38, 0xa2, 0x8e, 0xa7, 0x3d, 0xe2, 0xf0, 0x17, 0xe2, 0x5d, 0x14, 0x77, 0xbb, 0x2e, 0x4a, 0x66, 0xfb, 0xee, 0xf5, 0x08, 0xa2, 0xde, 0x1f,
0x43, 0x9a, 0x01, 0xed, 0xd6, 0x5c, 0x2c, 0x82, 0xcd, 0x5f, 0xb0, 0x8b, 0xba, 0xaf, 0xa3, 0x7f, 0x43, 0x03, 0xdf, 0x8d, 0x3d, 0xa1, 0x78, 0xf7, 0x31, 0xf5, 0x70, 0x90, 0x7e, 0xb1, 0x32, 0xcd,
0x08, 0xd0, 0x0f, 0xbd, 0xe9, 0x9e, 0xcd, 0x27, 0x9e, 0x1b, 0xf3, 0x84, 0xf8, 0xbe, 0x56, 0xbc, 0x92, 0xb0, 0xc0, 0x53, 0xfe, 0x8d, 0x08, 0xed, 0x66, 0xa1, 0x5a, 0xd7, 0xc5, 0xdb, 0x8e, 0x6a,
0x11, 0xb5, 0x4b, 0x5b, 0xec, 0x0b, 0x4d, 0x36, 0x4d, 0x2c, 0x89, 0x5a, 0xf6, 0x1b, 0xaf, 0x74, 0x5d, 0xb3, 0x2e, 0x31, 0x7e, 0x0e, 0xb5, 0xa7, 0x34, 0x92, 0x77, 0xf5, 0x94, 0x7c, 0x94, 0xba,
0x45, 0xc3, 0x49, 0xb9, 0xd6, 0x85, 0x4c, 0x02, 0xe2, 0x10, 0x9d, 0x48, 0xd2, 0x5c, 0x88, 0xfe, 0xbc, 0xb7, 0x9d, 0x71, 0xc3, 0x92, 0x7c, 0xc2, 0x8b, 0xaa, 0x7b, 0xe7, 0x9b, 0x5a, 0x2b, 0x7a,
0x89, 0xf6, 0x7a, 0x4a, 0x3c, 0xcf, 0x0f, 0xa0, 0x1c, 0xc7, 0x36, 0x6c, 0xc5, 0x4f, 0xc4, 0x24, 0xd1, 0x95, 0x14, 0x9c, 0x49, 0x1f, 0xda, 0xeb, 0x13, 0xaa, 0xe3, 0x8b, 0xaf, 0x8d, 0xa8, 0x8e,
0x22, 0x21, 0x22, 0xee, 0xbd, 0x18, 0x57, 0xd0, 0x85, 0x35, 0xea, 0x4e, 0x74, 0xfc, 0xe1, 0xad, 0x67, 0x3d, 0x56, 0xf1, 0x23, 0x9c, 0x01, 0xed, 0x76, 0x60, 0x2c, 0x82, 0xa5, 0x2f, 0x12, 0xaa,
0xa2, 0xe8, 0xd3, 0x1f, 0x8b, 0x0e, 0xfd, 0x68, 0xff, 0xa4, 0xb9, 0xa5, 0xc5, 0xfe, 0x59, 0x70, 0xee, 0xeb, 0xe8, 0x8f, 0x01, 0x06, 0x91, 0x3f, 0xdb, 0x75, 0xe8, 0xd4, 0xf7, 0x62, 0x9e, 0x10,
0x6f, 0x46, 0xfb, 0xe7, 0x26, 0x7f, 0x75, 0xb4, 0x7f, 0x6e, 0xf6, 0x8c, 0x76, 0x61, 0x2d, 0xc5, 0xdf, 0x4b, 0x8b, 0x37, 0xa2, 0x76, 0x39, 0x8d, 0x7c, 0xa9, 0xc9, 0xa6, 0x89, 0x25, 0x91, 0xcb,
0x51, 0xc9, 0xde, 0x50, 0x8a, 0xcd, 0x8d, 0x4e, 0xcc, 0xed, 0x54, 0x87, 0x16, 0x1b, 0xc0, 0x16, 0x7e, 0xed, 0xd5, 0x35, 0x35, 0x9c, 0x8c, 0xeb, 0x6b, 0x9c, 0x49, 0x40, 0x1c, 0x8a, 0xa4, 0x24,
0x95, 0x69, 0x8e, 0xc7, 0x73, 0x7e, 0xb1, 0xd7, 0xb5, 0x02, 0x29, 0xbe, 0xbe, 0x84, 0x28, 0x33, 0xcd, 0x85, 0x28, 0x27, 0xb5, 0xd7, 0x33, 0xe2, 0x96, 0x7e, 0x08, 0xd5, 0x38, 0x86, 0x63, 0x2b,
0xe7, 0xef, 0xeb, 0x42, 0x7d, 0xde, 0xa5, 0xc4, 0x6e, 0x46, 0xdf, 0xbe, 0x97, 0x10, 0xd9, 0x17, 0x7e, 0x0a, 0x27, 0x11, 0xf1, 0xa1, 0xb8, 0xf7, 0x62, 0xfc, 0x44, 0x0f, 0xd6, 0xb0, 0x3b, 0xea,
0xdd, 0x50, 0xec, 0xf3, 0xc8, 0xb1, 0x35, 0xd7, 0xc7, 0x7b, 0xf1, 0x07, 0xa7, 0x52, 0xdd, 0x70, 0xf8, 0xe3, 0xb7, 0xa7, 0xd4, 0x27, 0x4e, 0x16, 0x03, 0x17, 0xd4, 0xfe, 0xc9, 0x72, 0xbf, 0xb3,
0x91, 0x36, 0x90, 0xea, 0x17, 0x63, 0xbf, 0x0c, 0x5b, 0xf3, 0x14, 0xad, 0x6a, 0xbe, 0x9f, 0x36, 0xfd, 0xb3, 0xe0, 0xc6, 0x55, 0xfb, 0xe7, 0x3a, 0xbf, 0xbc, 0xda, 0x3f, 0xd7, 0x7b, 0x80, 0x7b,
0x5d, 0x37, 0x8a, 0x72, 0xc9, 0x01, 0x3d, 0xca, 0x08, 0x46, 0xac, 0xbb, 0xa7, 0x22, 0x42, 0x4a, 0xb0, 0x96, 0xe1, 0x90, 0x25, 0x6f, 0x49, 0xc5, 0xe6, 0x5a, 0x67, 0xed, 0x76, 0xa6, 0xe3, 0x8e,
0xf1, 0x83, 0x45, 0x84, 0x94, 0xe6, 0xcf, 0xda, 0x7d, 0xe7, 0x57, 0xbe, 0x75, 0xee, 0x84, 0x17, 0x0c, 0x61, 0x0b, 0xcb, 0xb4, 0x26, 0x93, 0x94, 0xff, 0xef, 0x4d, 0xad, 0x40, 0x86, 0x4f, 0x33,
0xb3, 0xd3, 0x9d, 0xa1, 0x37, 0x79, 0x7f, 0xac, 0x94, 0x7b, 0x79, 0xd7, 0xf4, 0xfd, 0xb1, 0x3b, 0x21, 0xca, 0xa4, 0xfc, 0x9a, 0x3d, 0x30, 0xd2, 0xae, 0x33, 0x72, 0x3d, 0xfa, 0xf6, 0x9d, 0x84,
0x7a, 0x1f, 0x4b, 0x9f, 0x2e, 0x4d, 0x7d, 0x2f, 0xf4, 0xbe, 0xfb, 0x7f, 0x03, 0x00, 0x00, 0xff, 0xc8, 0xbe, 0xe8, 0x6e, 0x23, 0x5f, 0x28, 0x07, 0x5e, 0xaa, 0x8f, 0x77, 0xe2, 0x0f, 0x6b, 0x65,
0xff, 0x39, 0x56, 0x74, 0xe8, 0xdb, 0x86, 0x00, 0x00, 0xba, 0x1b, 0x95, 0x36, 0x90, 0xe9, 0xff, 0x23, 0xbf, 0x0c, 0x5b, 0x69, 0x8a, 0x96, 0x35, 0xdf,
0xcd, 0x9a, 0xae, 0x6b, 0x45, 0xb9, 0xe4, 0x80, 0x1e, 0xe6, 0x18, 0x23, 0xd6, 0xdd, 0x6c, 0x8a,
0x90, 0x32, 0xfc, 0x7d, 0x8a, 0x90, 0x32, 0xfd, 0x72, 0x47, 0xb0, 0x92, 0xf2, 0xb0, 0x29, 0x31,
0x38, 0xdb, 0x27, 0xa7, 0xc4, 0xe0, 0xeb, 0x1c, 0x73, 0x03, 0x30, 0xd2, 0xbe, 0x33, 0xb5, 0xd6,
0xd7, 0xf8, 0xe3, 0xb6, 0xef, 0x5c, 0x9b, 0x8f, 0x95, 0xee, 0xbc, 0xf7, 0x2b, 0xdf, 0x39, 0x73,
0xa3, 0xf3, 0xf9, 0xc9, 0x83, 0x91, 0x3f, 0xfd, 0x70, 0x22, 0x6d, 0x10, 0xe2, 0xea, 0xef, 0x87,
0x13, 0x6f, 0xfc, 0x21, 0xaf, 0xe1, 0x64, 0x69, 0x16, 0xf8, 0x91, 0xff, 0xfd, 0xff, 0x1d, 0x00,
0x00, 0xff, 0xff, 0x76, 0x4d, 0x7c, 0xa2, 0x6a, 0x88, 0x00, 0x00,
} }
// Reference imports to suppress errors if they are not otherwise used. // Reference imports to suppress errors if they are not otherwise used.
@ -13130,6 +13301,13 @@ type LightningClient interface {
//write permissions. No first-party caveats are added since this can be done //write permissions. No first-party caveats are added since this can be done
//offline. //offline.
BakeMacaroon(ctx context.Context, in *BakeMacaroonRequest, opts ...grpc.CallOption) (*BakeMacaroonResponse, error) BakeMacaroon(ctx context.Context, in *BakeMacaroonRequest, opts ...grpc.CallOption) (*BakeMacaroonResponse, error)
// lncli: `listmacaroonids`
//ListMacaroonIDs returns all root key IDs that are in use.
ListMacaroonIDs(ctx context.Context, in *ListMacaroonIDsRequest, opts ...grpc.CallOption) (*ListMacaroonIDsResponse, error)
// lncli: `deletemacaroonid`
//DeleteMacaroonID deletes the specified macaroon ID and invalidates all
//macaroons derived from that ID.
DeleteMacaroonID(ctx context.Context, in *DeleteMacaroonIDRequest, opts ...grpc.CallOption) (*DeleteMacaroonIDResponse, error)
} }
type lightningClient struct { type lightningClient struct {
@ -13896,6 +14074,24 @@ func (c *lightningClient) BakeMacaroon(ctx context.Context, in *BakeMacaroonRequ
return out, nil return out, nil
} }
func (c *lightningClient) ListMacaroonIDs(ctx context.Context, in *ListMacaroonIDsRequest, opts ...grpc.CallOption) (*ListMacaroonIDsResponse, error) {
out := new(ListMacaroonIDsResponse)
err := c.cc.Invoke(ctx, "/lnrpc.Lightning/ListMacaroonIDs", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
func (c *lightningClient) DeleteMacaroonID(ctx context.Context, in *DeleteMacaroonIDRequest, opts ...grpc.CallOption) (*DeleteMacaroonIDResponse, error) {
out := new(DeleteMacaroonIDResponse)
err := c.cc.Invoke(ctx, "/lnrpc.Lightning/DeleteMacaroonID", in, out, opts...)
if err != nil {
return nil, err
}
return out, nil
}
// LightningServer is the server API for Lightning service. // LightningServer is the server API for Lightning service.
type LightningServer interface { type LightningServer interface {
// lncli: `walletbalance` // lncli: `walletbalance`
@ -14235,6 +14431,13 @@ type LightningServer interface {
//write permissions. No first-party caveats are added since this can be done //write permissions. No first-party caveats are added since this can be done
//offline. //offline.
BakeMacaroon(context.Context, *BakeMacaroonRequest) (*BakeMacaroonResponse, error) BakeMacaroon(context.Context, *BakeMacaroonRequest) (*BakeMacaroonResponse, error)
// lncli: `listmacaroonids`
//ListMacaroonIDs returns all root key IDs that are in use.
ListMacaroonIDs(context.Context, *ListMacaroonIDsRequest) (*ListMacaroonIDsResponse, error)
// lncli: `deletemacaroonid`
//DeleteMacaroonID deletes the specified macaroon ID and invalidates all
//macaroons derived from that ID.
DeleteMacaroonID(context.Context, *DeleteMacaroonIDRequest) (*DeleteMacaroonIDResponse, error)
} }
// UnimplementedLightningServer can be embedded to have forward compatible implementations. // UnimplementedLightningServer can be embedded to have forward compatible implementations.
@ -14409,6 +14612,12 @@ func (*UnimplementedLightningServer) SubscribeChannelBackups(req *ChannelBackupS
func (*UnimplementedLightningServer) BakeMacaroon(ctx context.Context, req *BakeMacaroonRequest) (*BakeMacaroonResponse, error) { func (*UnimplementedLightningServer) BakeMacaroon(ctx context.Context, req *BakeMacaroonRequest) (*BakeMacaroonResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method BakeMacaroon not implemented") return nil, status.Errorf(codes.Unimplemented, "method BakeMacaroon not implemented")
} }
func (*UnimplementedLightningServer) ListMacaroonIDs(ctx context.Context, req *ListMacaroonIDsRequest) (*ListMacaroonIDsResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method ListMacaroonIDs not implemented")
}
func (*UnimplementedLightningServer) DeleteMacaroonID(ctx context.Context, req *DeleteMacaroonIDRequest) (*DeleteMacaroonIDResponse, error) {
return nil, status.Errorf(codes.Unimplemented, "method DeleteMacaroonID not implemented")
}
func RegisterLightningServer(s *grpc.Server, srv LightningServer) { func RegisterLightningServer(s *grpc.Server, srv LightningServer) {
s.RegisterService(&_Lightning_serviceDesc, srv) s.RegisterService(&_Lightning_serviceDesc, srv)
@ -15470,6 +15679,42 @@ func _Lightning_BakeMacaroon_Handler(srv interface{}, ctx context.Context, dec f
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _Lightning_ListMacaroonIDs_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(ListMacaroonIDsRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LightningServer).ListMacaroonIDs(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/lnrpc.Lightning/ListMacaroonIDs",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LightningServer).ListMacaroonIDs(ctx, req.(*ListMacaroonIDsRequest))
}
return interceptor(ctx, in, info, handler)
}
func _Lightning_DeleteMacaroonID_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(DeleteMacaroonIDRequest)
if err := dec(in); err != nil {
return nil, err
}
if interceptor == nil {
return srv.(LightningServer).DeleteMacaroonID(ctx, in)
}
info := &grpc.UnaryServerInfo{
Server: srv,
FullMethod: "/lnrpc.Lightning/DeleteMacaroonID",
}
handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(LightningServer).DeleteMacaroonID(ctx, req.(*DeleteMacaroonIDRequest))
}
return interceptor(ctx, in, info, handler)
}
var _Lightning_serviceDesc = grpc.ServiceDesc{ var _Lightning_serviceDesc = grpc.ServiceDesc{
ServiceName: "lnrpc.Lightning", ServiceName: "lnrpc.Lightning",
HandlerType: (*LightningServer)(nil), HandlerType: (*LightningServer)(nil),
@ -15654,6 +15899,14 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{
MethodName: "BakeMacaroon", MethodName: "BakeMacaroon",
Handler: _Lightning_BakeMacaroon_Handler, Handler: _Lightning_BakeMacaroon_Handler,
}, },
{
MethodName: "ListMacaroonIDs",
Handler: _Lightning_ListMacaroonIDs_Handler,
},
{
MethodName: "DeleteMacaroonID",
Handler: _Lightning_DeleteMacaroonID_Handler,
},
}, },
Streams: []grpc.StreamDesc{ Streams: []grpc.StreamDesc{
{ {

@ -1913,6 +1913,78 @@ func local_request_Lightning_BakeMacaroon_0(ctx context.Context, marshaler runti
} }
func request_Lightning_ListMacaroonIDs_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq ListMacaroonIDsRequest
var metadata runtime.ServerMetadata
msg, err := client.ListMacaroonIDs(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_Lightning_ListMacaroonIDs_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq ListMacaroonIDsRequest
var metadata runtime.ServerMetadata
msg, err := server.ListMacaroonIDs(ctx, &protoReq)
return msg, metadata, err
}
func request_Lightning_DeleteMacaroonID_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq DeleteMacaroonIDRequest
var metadata runtime.ServerMetadata
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["root_key_id"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "root_key_id")
}
protoReq.RootKeyId, err = runtime.Uint64(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "root_key_id", err)
}
msg, err := client.DeleteMacaroonID(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD))
return msg, metadata, err
}
func local_request_Lightning_DeleteMacaroonID_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) {
var protoReq DeleteMacaroonIDRequest
var metadata runtime.ServerMetadata
var (
val string
ok bool
err error
_ = err
)
val, ok = pathParams["root_key_id"]
if !ok {
return nil, metadata, status.Errorf(codes.InvalidArgument, "missing parameter %s", "root_key_id")
}
protoReq.RootKeyId, err = runtime.Uint64(val)
if err != nil {
return nil, metadata, status.Errorf(codes.InvalidArgument, "type mismatch, parameter: %s, error: %v", "root_key_id", err)
}
msg, err := server.DeleteMacaroonID(ctx, &protoReq)
return msg, metadata, err
}
// RegisterLightningHandlerServer registers the http handlers for service Lightning to "mux". // RegisterLightningHandlerServer registers the http handlers for service Lightning to "mux".
// UnaryRPC :call LightningServer directly. // UnaryRPC :call LightningServer directly.
// StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906.
@ -2874,6 +2946,46 @@ func RegisterLightningHandlerServer(ctx context.Context, mux *runtime.ServeMux,
}) })
mux.Handle("GET", pattern_Lightning_ListMacaroonIDs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_Lightning_ListMacaroonIDs_0(rctx, inboundMarshaler, server, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Lightning_ListMacaroonIDs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("DELETE", pattern_Lightning_DeleteMacaroonID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateIncomingContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := local_request_Lightning_DeleteMacaroonID_0(rctx, inboundMarshaler, server, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Lightning_DeleteMacaroonID_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil return nil
} }
@ -3975,6 +4087,46 @@ func RegisterLightningHandlerClient(ctx context.Context, mux *runtime.ServeMux,
}) })
mux.Handle("GET", pattern_Lightning_ListMacaroonIDs_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_Lightning_ListMacaroonIDs_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Lightning_ListMacaroonIDs_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
mux.Handle("DELETE", pattern_Lightning_DeleteMacaroonID_0, func(w http.ResponseWriter, req *http.Request, pathParams map[string]string) {
ctx, cancel := context.WithCancel(req.Context())
defer cancel()
inboundMarshaler, outboundMarshaler := runtime.MarshalerForRequest(mux, req)
rctx, err := runtime.AnnotateContext(ctx, mux, req)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
resp, md, err := request_Lightning_DeleteMacaroonID_0(rctx, inboundMarshaler, client, req, pathParams)
ctx = runtime.NewServerMetadataContext(ctx, md)
if err != nil {
runtime.HTTPError(ctx, mux, outboundMarshaler, w, req, err)
return
}
forward_Lightning_DeleteMacaroonID_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...)
})
return nil return nil
} }
@ -4084,6 +4236,10 @@ var (
pattern_Lightning_SubscribeChannelBackups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "channels", "backup", "subscribe"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Lightning_SubscribeChannelBackups_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2, 2, 3}, []string{"v1", "channels", "backup", "subscribe"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_Lightning_BakeMacaroon_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "macaroon"}, "", runtime.AssumeColonVerbOpt(true))) pattern_Lightning_BakeMacaroon_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1}, []string{"v1", "macaroon"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_Lightning_ListMacaroonIDs_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "macaroon", "ids"}, "", runtime.AssumeColonVerbOpt(true)))
pattern_Lightning_DeleteMacaroonID_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 1, 0, 4, 1, 5, 2}, []string{"v1", "macaroon", "root_key_id"}, "", runtime.AssumeColonVerbOpt(true)))
) )
var ( var (
@ -4192,4 +4348,8 @@ var (
forward_Lightning_SubscribeChannelBackups_0 = runtime.ForwardResponseStream forward_Lightning_SubscribeChannelBackups_0 = runtime.ForwardResponseStream
forward_Lightning_BakeMacaroon_0 = runtime.ForwardResponseMessage forward_Lightning_BakeMacaroon_0 = runtime.ForwardResponseMessage
forward_Lightning_ListMacaroonIDs_0 = runtime.ForwardResponseMessage
forward_Lightning_DeleteMacaroonID_0 = runtime.ForwardResponseMessage
) )

@ -491,6 +491,19 @@ service Lightning {
offline. offline.
*/ */
rpc BakeMacaroon (BakeMacaroonRequest) returns (BakeMacaroonResponse); rpc BakeMacaroon (BakeMacaroonRequest) returns (BakeMacaroonResponse);
/* lncli: `listmacaroonids`
ListMacaroonIDs returns all root key IDs that are in use.
*/
rpc ListMacaroonIDs (ListMacaroonIDsRequest)
returns (ListMacaroonIDsResponse);
/* lncli: `deletemacaroonid`
DeleteMacaroonID deletes the specified macaroon ID and invalidates all
macaroons derived from that ID.
*/
rpc DeleteMacaroonID (DeleteMacaroonIDRequest)
returns (DeleteMacaroonIDResponse);
} }
message Utxo { message Utxo {
@ -3327,12 +3340,31 @@ message MacaroonPermission {
message BakeMacaroonRequest { message BakeMacaroonRequest {
// The list of permissions the new macaroon should grant. // The list of permissions the new macaroon should grant.
repeated MacaroonPermission permissions = 1; repeated MacaroonPermission permissions = 1;
// The root key ID used to create the macaroon, must be a positive integer.
uint64 root_key_id = 2;
} }
message BakeMacaroonResponse { message BakeMacaroonResponse {
// The hex encoded macaroon, serialized in binary format. // The hex encoded macaroon, serialized in binary format.
string macaroon = 1; string macaroon = 1;
} }
message ListMacaroonIDsRequest {
}
message ListMacaroonIDsResponse {
// The list of root key IDs that are in use.
repeated uint64 root_key_ids = 1;
}
message DeleteMacaroonIDRequest {
// The root key ID to be removed.
uint64 root_key_id = 1;
}
message DeleteMacaroonIDResponse {
// A boolean indicates that the deletion is successful.
bool deleted = 1;
}
message Failure { message Failure {
enum FailureCode { enum FailureCode {
/* /*

@ -1426,6 +1426,62 @@
] ]
} }
}, },
"/v1/macaroon/ids": {
"get": {
"summary": "lncli: `listmacaroonids`\nListMacaroonIDs returns all root key IDs that are in use.",
"operationId": "ListMacaroonIDs",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/lnrpcListMacaroonIDsResponse"
}
},
"default": {
"description": "An unexpected error response",
"schema": {
"$ref": "#/definitions/runtimeError"
}
}
},
"tags": [
"Lightning"
]
}
},
"/v1/macaroon/{root_key_id}": {
"delete": {
"summary": "lncli: `deletemacaroonid`\nDeleteMacaroonID deletes the specified macaroon ID and invalidates all\nmacaroons derived from that ID.",
"operationId": "DeleteMacaroonID",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/lnrpcDeleteMacaroonIDResponse"
}
},
"default": {
"description": "An unexpected error response",
"schema": {
"$ref": "#/definitions/runtimeError"
}
}
},
"parameters": [
{
"name": "root_key_id",
"description": "The root key ID to be removed.",
"in": "path",
"required": true,
"type": "string",
"format": "uint64"
}
],
"tags": [
"Lightning"
]
}
},
"/v1/newaddress": { "/v1/newaddress": {
"get": { "get": {
"summary": "lncli: `newaddress`\nNewAddress creates a new address under control of the local wallet.", "summary": "lncli: `newaddress`\nNewAddress creates a new address under control of the local wallet.",
@ -2399,6 +2455,11 @@
"$ref": "#/definitions/lnrpcMacaroonPermission" "$ref": "#/definitions/lnrpcMacaroonPermission"
}, },
"description": "The list of permissions the new macaroon should grant." "description": "The list of permissions the new macaroon should grant."
},
"root_key_id": {
"type": "string",
"format": "uint64",
"description": "The root key ID used to create the macaroon, must be a positive integer."
} }
} }
}, },
@ -3161,6 +3222,16 @@
"lnrpcDeleteAllPaymentsResponse": { "lnrpcDeleteAllPaymentsResponse": {
"type": "object" "type": "object"
}, },
"lnrpcDeleteMacaroonIDResponse": {
"type": "object",
"properties": {
"deleted": {
"type": "boolean",
"format": "boolean",
"description": "A boolean indicates that the deletion is successful."
}
}
},
"lnrpcDisconnectPeerResponse": { "lnrpcDisconnectPeerResponse": {
"type": "object" "type": "object"
}, },
@ -4095,6 +4166,19 @@
} }
} }
}, },
"lnrpcListMacaroonIDsResponse": {
"type": "object",
"properties": {
"root_key_ids": {
"type": "array",
"items": {
"type": "string",
"format": "uint64"
},
"description": "The list of root key IDs that are in use."
}
}
},
"lnrpcListPaymentsResponse": { "lnrpcListPaymentsResponse": {
"type": "object", "type": "object",
"properties": { "properties": {

@ -19,6 +19,7 @@ import (
"github.com/lightningnetwork/lnd/keychain" "github.com/lightningnetwork/lnd/keychain"
"github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc"
"github.com/lightningnetwork/lnd/lnwire" "github.com/lightningnetwork/lnd/lnwire"
"github.com/lightningnetwork/lnd/macaroons"
"google.golang.org/grpc" "google.golang.org/grpc"
"gopkg.in/macaroon-bakery.v2/bakery" "gopkg.in/macaroon-bakery.v2/bakery"
) )
@ -111,8 +112,8 @@ func New(cfg *Config) (*Server, lnrpc.MacaroonPerms, error) {
// At this point, we know that the signer macaroon doesn't yet, // At this point, we know that the signer macaroon doesn't yet,
// exist, so we need to create it with the help of the main // exist, so we need to create it with the help of the main
// macaroon service. // macaroon service.
signerMac, err := cfg.MacService.Oven.NewMacaroon( signerMac, err := cfg.MacService.NewMacaroon(
context.Background(), bakery.LatestVersion, nil, context.Background(), macaroons.DefaultRootKeyID,
macaroonOps..., macaroonOps...,
) )
if err != nil { if err != nil {

@ -25,6 +25,7 @@ import (
"github.com/lightningnetwork/lnd/lnwallet" "github.com/lightningnetwork/lnd/lnwallet"
"github.com/lightningnetwork/lnd/lnwallet/btcwallet" "github.com/lightningnetwork/lnd/lnwallet/btcwallet"
"github.com/lightningnetwork/lnd/lnwallet/chainfee" "github.com/lightningnetwork/lnd/lnwallet/chainfee"
"github.com/lightningnetwork/lnd/macaroons"
"github.com/lightningnetwork/lnd/sweep" "github.com/lightningnetwork/lnd/sweep"
"google.golang.org/grpc" "google.golang.org/grpc"
"gopkg.in/macaroon-bakery.v2/bakery" "gopkg.in/macaroon-bakery.v2/bakery"
@ -156,8 +157,9 @@ func New(cfg *Config) (*WalletKit, lnrpc.MacaroonPerms, error) {
// At this point, we know that the wallet kit macaroon doesn't // At this point, we know that the wallet kit macaroon doesn't
// yet, exist, so we need to create it with the help of the // yet, exist, so we need to create it with the help of the
// main macaroon service. // main macaroon service.
walletKitMac, err := cfg.MacService.Oven.NewMacaroon( walletKitMac, err := cfg.MacService.NewMacaroon(
context.Background(), bakery.LatestVersion, nil, context.Background(),
macaroons.DefaultRootKeyID,
macaroonOps..., macaroonOps...,
) )
if err != nil { if err != nil {

@ -14287,6 +14287,14 @@ var testsCases = []*testCase{
name: "macaroon authentication", name: "macaroon authentication",
test: testMacaroonAuthentication, test: testMacaroonAuthentication,
}, },
{
name: "bake macaroon",
test: testBakeMacaroon,
},
{
name: "delete macaroon id",
test: testDeleteMacaroonID,
},
{ {
name: "immediate payment after channel opened", name: "immediate payment after channel opened",
test: testPaymentFollowingChannelOpen, test: testPaymentFollowingChannelOpen,

@ -208,3 +208,7 @@
<time> [ERR] RPCS: WS: error closing upgraded conn: write tcp4 <ip>-><ip>: write: connection reset by peer <time> [ERR] RPCS: WS: error closing upgraded conn: write tcp4 <ip>-><ip>: write: connection reset by peer
<time> [ERR] NTFN: chain notifier shutting down <time> [ERR] NTFN: chain notifier shutting down
<time> [ERR] NTFN: Failed getting UTXO: get utxo request cancelled <time> [ERR] NTFN: Failed getting UTXO: get utxo request cancelled
<time> [ERR] RPCS: [/lnrpc.Lightning/BakeMacaroon]: invalid permission action. supported actions are [read write generate], supported entities are [onchain offchain address message peers info invoices signer macaroon]
<time> [ERR] RPCS: [/lnrpc.Lightning/BakeMacaroon]: invalid permission entity. supported actions are [read write generate], supported entities are [onchain offchain address message peers info invoices signer macaroon]
<time> [ERR] RPCS: [/lnrpc.Lightning/BakeMacaroon]: permission list cannot be empty. specify at least one action/entity pair. supported actions are [read write generate], supported entities are [onchain offchain address message peers info invoices signer macaroon]
<time> [ERR] RPCS: [/lnrpc.Lightning/DeleteMacaroonID]: the specified ID cannot be deleted

@ -4,6 +4,9 @@ package itest
import ( import (
"context" "context"
"encoding/hex"
"sort"
"strconv"
"strings" "strings"
"github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lnrpc"
@ -166,3 +169,308 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) {
t.Fatalf("returned address was not a regtest address") t.Fatalf("returned address was not a regtest address")
} }
} }
// testBakeMacaroon checks that when creating macaroons, the permissions param
// in the request must be set correctly, and the baked macaroon has the intended
// permissions.
func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) {
var (
ctxb = context.Background()
req = &lnrpc.BakeMacaroonRequest{}
testNode = net.Alice
)
// First test: when the permission list is empty in the request, an error
// should be returned.
adminMac, err := testNode.ReadMacaroon(
testNode.AdminMacPath(), defaultTimeout,
)
if err != nil {
t.Fatalf("unable to read admin.macaroon from node: %v", err)
}
conn, err := testNode.ConnectRPCWithMacaroon(adminMac)
if err != nil {
t.Fatalf("unable to connect to alice: %v", err)
}
defer conn.Close()
ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout)
defer cancel()
adminMacConnection := lnrpc.NewLightningClient(conn)
_, err = adminMacConnection.BakeMacaroon(ctxt, req)
if err == nil || !errContains(err, "permission list cannot be empty") {
t.Fatalf("expected an error, got %v", err)
}
// Second test: when the action in the permission list is not valid,
// an error should be returned.
req = &lnrpc.BakeMacaroonRequest{
Permissions: []*lnrpc.MacaroonPermission{
{
Entity: "macaroon",
Action: "invalid123",
},
},
}
_, err = adminMacConnection.BakeMacaroon(ctxt, req)
if err == nil || !errContains(err, "invalid permission action") {
t.Fatalf("expected an error, got %v", err)
}
// Third test: when the entity in the permission list is not valid,
// an error should be returned.
req = &lnrpc.BakeMacaroonRequest{
Permissions: []*lnrpc.MacaroonPermission{
{
Entity: "invalid123",
Action: "read",
},
},
}
_, err = adminMacConnection.BakeMacaroon(ctxt, req)
if err == nil || !errContains(err, "invalid permission entity") {
t.Fatalf("expected an error, got %v", err)
}
// Fourth test: check that when no root key ID is specified, the default
// root key ID is used.
req = &lnrpc.BakeMacaroonRequest{
Permissions: []*lnrpc.MacaroonPermission{
{
Entity: "macaroon",
Action: "read",
},
},
}
_, err = adminMacConnection.BakeMacaroon(ctxt, req)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
listReq := &lnrpc.ListMacaroonIDsRequest{}
resp, err := adminMacConnection.ListMacaroonIDs(ctxt, listReq)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if resp.RootKeyIds[0] != 0 {
t.Fatalf("expected ID to be 0, found: %v", resp.RootKeyIds)
}
// Fifth test: create a macaroon use a non-default root key ID.
rootKeyID := uint64(4200)
req = &lnrpc.BakeMacaroonRequest{
RootKeyId: rootKeyID,
Permissions: []*lnrpc.MacaroonPermission{
{
Entity: "macaroon",
Action: "read",
},
},
}
bakeResp, err := adminMacConnection.BakeMacaroon(ctxt, req)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
listReq = &lnrpc.ListMacaroonIDsRequest{}
resp, err = adminMacConnection.ListMacaroonIDs(ctxt, listReq)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
// the ListMacaroonIDs should give a list of two IDs, the default ID 0, and
// the newly created ID. The returned response is sorted to guarantee the
// order so that we can compare them one by one.
sort.Slice(resp.RootKeyIds, func(i, j int) bool {
return resp.RootKeyIds[i] < resp.RootKeyIds[j]
})
if resp.RootKeyIds[0] != 0 {
t.Fatalf("expected ID to be %v, found: %v", 0, resp.RootKeyIds[0])
}
if resp.RootKeyIds[1] != rootKeyID {
t.Fatalf(
"expected ID to be %v, found: %v",
rootKeyID, resp.RootKeyIds[1],
)
}
// Sixth test: check the baked macaroon has the intended permissions. It
// should succeed in reading, and fail to write a macaroon.
newMac, err := readMacaroonFromHex(bakeResp.Macaroon)
if err != nil {
t.Fatalf("failed to load macaroon from bytes, error: %v", err)
}
conn, err = testNode.ConnectRPCWithMacaroon(newMac)
if err != nil {
t.Fatalf("unable to connect to alice: %v", err)
}
defer conn.Close()
ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout)
defer cancel()
newMacConnection := lnrpc.NewLightningClient(conn)
// BakeMacaroon requires a write permission, so this call should return an
// error.
_, err = newMacConnection.BakeMacaroon(ctxt, req)
if err == nil || !errContains(err, "permission denied") {
t.Fatalf("expected an error, got %v", err)
}
// ListMacaroon requires a read permission, so this call should succeed.
listReq = &lnrpc.ListMacaroonIDsRequest{}
resp, err = newMacConnection.ListMacaroonIDs(ctxt, listReq)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
// Current macaroon can only work on entity macaroon, so a GetInfo request
// will fail.
infoReq := &lnrpc.GetInfoRequest{}
_, err = newMacConnection.GetInfo(ctxt, infoReq)
if err == nil || !errContains(err, "permission denied") {
t.Fatalf("expected error not returned, got %v", err)
}
}
// testDeleteMacaroonID checks that when deleting a macaroon ID, it removes the
// specified ID and invalidates all macaroons derived from the key with that ID.
// Also, it checks deleting the reserved marcaroon ID, DefaultRootKeyID or is
// forbidden.
func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) {
var (
ctxb = context.Background()
testNode = net.Alice
)
// Use admin macaroon to create a connection.
adminMac, err := testNode.ReadMacaroon(
testNode.AdminMacPath(), defaultTimeout,
)
if err != nil {
t.Fatalf("unable to read admin.macaroon from node: %v", err)
}
conn, err := testNode.ConnectRPCWithMacaroon(adminMac)
if err != nil {
t.Fatalf("unable to connect to alice: %v", err)
}
defer conn.Close()
ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout)
defer cancel()
adminMacConnection := lnrpc.NewLightningClient(conn)
// Record the number of macaroon IDs before creation.
listReq := &lnrpc.ListMacaroonIDsRequest{}
listResp, err := adminMacConnection.ListMacaroonIDs(ctxt, listReq)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
numMacIDs := len(listResp.RootKeyIds)
// Create macaroons for testing.
rootKeyIDs := []uint64{1, 2, 3}
macList := []string{}
for _, id := range rootKeyIDs {
req := &lnrpc.BakeMacaroonRequest{
RootKeyId: id,
Permissions: []*lnrpc.MacaroonPermission{
{
Entity: "macaroon",
Action: "read",
},
},
}
resp, err := adminMacConnection.BakeMacaroon(ctxt, req)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
macList = append(macList, resp.Macaroon)
}
// Check that the creation is successful.
listReq = &lnrpc.ListMacaroonIDsRequest{}
listResp, err = adminMacConnection.ListMacaroonIDs(ctxt, listReq)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
// The number of macaroon IDs should be increased by len(rootKeyIDs)
if len(listResp.RootKeyIds) != numMacIDs+len(rootKeyIDs) {
t.Fatalf(
"expected to have %v ids, found: %v",
numMacIDs+len(rootKeyIDs), len(listResp.RootKeyIds),
)
}
// First test: check deleting the DefaultRootKeyID returns an error.
defaultID, _ := strconv.ParseUint(
string(macaroons.DefaultRootKeyID), 10, 64,
)
req := &lnrpc.DeleteMacaroonIDRequest{
RootKeyId: defaultID,
}
_, err = adminMacConnection.DeleteMacaroonID(ctxt, req)
if err == nil || !errContains(err, macaroons.ErrDeletionForbidden.Error()) {
t.Fatalf("expected an error, got %v", err)
}
// Second test: check deleting the customized ID returns success.
req = &lnrpc.DeleteMacaroonIDRequest{
RootKeyId: rootKeyIDs[0],
}
resp, err := adminMacConnection.DeleteMacaroonID(ctxt, req)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
if resp.Deleted != true {
t.Fatalf("expected the ID to be deleted")
}
// Check that the deletion is successful.
listReq = &lnrpc.ListMacaroonIDsRequest{}
listResp, err = adminMacConnection.ListMacaroonIDs(ctxt, listReq)
if err != nil {
t.Fatalf("expected no error, got %v", err)
}
// The number of macaroon IDs should be decreased by 1.
if len(listResp.RootKeyIds) != numMacIDs+len(rootKeyIDs)-1 {
t.Fatalf(
"expected to have %v ids, found: %v",
numMacIDs+len(rootKeyIDs)-1, len(listResp.RootKeyIds),
)
}
// Check that the deleted macaroon can no longer access macaroon:read.
deletedMac, err := readMacaroonFromHex(macList[0])
if err != nil {
t.Fatalf("failed to load macaroon from bytes, error: %v", err)
}
conn, err = testNode.ConnectRPCWithMacaroon(deletedMac)
if err != nil {
t.Fatalf("unable to connect to alice: %v", err)
}
defer conn.Close()
ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout)
defer cancel()
deletedMacConnection := lnrpc.NewLightningClient(conn)
// Because the macaroon is deleted, it will be treated as an invalid one.
listReq = &lnrpc.ListMacaroonIDsRequest{}
_, err = deletedMacConnection.ListMacaroonIDs(ctxt, listReq)
if err == nil || !errContains(err, "cannot get macaroon") {
t.Fatalf("expected error not returned, got %v", err)
}
}
// readMacaroonFromHex loads a macaroon from a hex string.
func readMacaroonFromHex(macHex string) (*macaroon.Macaroon, error) {
macBytes, err := hex.DecodeString(macHex)
if err != nil {
return nil, err
}
mac := &macaroon.Macaroon{}
if err := mac.UnmarshalBinary(macBytes); err != nil {
return nil, err
}
return mac, nil
}

@ -95,8 +95,8 @@ command line.
Users can create their own macaroons with custom permissions if the provided Users can create their own macaroons with custom permissions if the provided
default macaroons (`admin`, `invoice` and `readonly`) are not sufficient. default macaroons (`admin`, `invoice` and `readonly`) are not sufficient.
For example, a macaroon that is only allowed to manage peers would be created For example, a macaroon that is only allowed to manage peers with a default root
with the following command: key `0` would be created with the following command:
`lncli bakemacaroon peers:read peers:write` `lncli bakemacaroon peers:read peers:write`
@ -114,3 +114,19 @@ removing all three default macaroons (`admin.macaroon`, `invoice.macaroon` and
`readonly.macaroon`, **NOT** the `macaroons.db`!) from their `readonly.macaroon`, **NOT** the `macaroons.db`!) from their
`data/chain/<chain>/<network>/` directory inside the lnd data directory and `data/chain/<chain>/<network>/` directory inside the lnd data directory and
restarting lnd. restarting lnd.
## Root key rotation
To manage the root keys used by macaroons, there are `listmacaroonids` and
`deletemacaroonid` available through gPRC and command line.
Users can view a list of all macaroon root key IDs that are in use using:
`lncli listmacaroonids`
And remove a specific macaroon root key ID using command:
`lncli deletemacaroonid root_key_id`
Be careful with the `deletemacaroonid` command as when a root key is deleted,
**all the macaroons created from it are invalidated**.

44
macaroons/context.go Normal file

@ -0,0 +1,44 @@
package macaroons
import (
"context"
"fmt"
)
var (
// RootKeyIDContextKey is the key to get rootKeyID from context.
RootKeyIDContextKey = contextKey{"rootkeyid"}
// ErrContextRootKeyID is used when the supplied context doesn't have
// a root key ID.
ErrContextRootKeyID = fmt.Errorf("failed to read root key ID " +
"from context")
)
// contextKey is the type we use to identify values in the context.
type contextKey struct {
Name string
}
// ContextWithRootKeyID passes the root key ID value to context.
func ContextWithRootKeyID(ctx context.Context,
value interface{}) context.Context {
return context.WithValue(ctx, RootKeyIDContextKey, value)
}
// RootKeyIDFromContext retrieves the root key ID from context using the key
// RootKeyIDContextKey.
func RootKeyIDFromContext(ctx context.Context) ([]byte, error) {
id, ok := ctx.Value(RootKeyIDContextKey).([]byte)
if !ok {
return nil, ErrContextRootKeyID
}
// Check that the id is not empty.
if len(id) == 0 {
return nil, ErrMissingRootKeyID
}
return id, nil
}

@ -20,6 +20,13 @@ var (
// DBFilename is the filename within the data directory which contains // DBFilename is the filename within the data directory which contains
// the macaroon stores. // the macaroon stores.
DBFilename = "macaroons.db" DBFilename = "macaroons.db"
// ErrMissingRootKeyID specifies the root key ID is missing.
ErrMissingRootKeyID = fmt.Errorf("missing root key ID")
// ErrDeletionForbidden is used when attempting to delete the
// DefaultRootKeyID or the encryptedKeyID.
ErrDeletionForbidden = fmt.Errorf("the specified ID cannot be deleted")
) )
// Service encapsulates bakery.Bakery and adds a Close() method that zeroes the // Service encapsulates bakery.Bakery and adds a Close() method that zeroes the
@ -197,3 +204,39 @@ func (svc *Service) Close() error {
func (svc *Service) CreateUnlock(password *[]byte) error { func (svc *Service) CreateUnlock(password *[]byte) error {
return svc.rks.CreateUnlock(password) return svc.rks.CreateUnlock(password)
} }
// NewMacaroon wraps around the function Oven.NewMacaroon with the defaults,
// - version is always bakery.LatestVersion;
// - caveats is always nil.
// In addition, it takes a rootKeyID parameter, and puts it into the context.
// The context is passed through Oven.NewMacaroon(), in which calls the function
// RootKey(), that reads the context for rootKeyID.
func (svc *Service) NewMacaroon(
ctx context.Context, rootKeyID []byte,
ops ...bakery.Op) (*bakery.Macaroon, error) {
// Check rootKeyID is not called with nil or empty bytes. We want the
// caller to be aware the value of root key ID used, so we won't replace
// it with the DefaultRootKeyID if not specified.
if len(rootKeyID) == 0 {
return nil, ErrMissingRootKeyID
}
// // Pass the root key ID to context.
ctx = ContextWithRootKeyID(ctx, rootKeyID)
return svc.Oven.NewMacaroon(ctx, bakery.LatestVersion, nil, ops...)
}
// ListMacaroonIDs returns all the root key ID values except the value of
// encryptedKeyID.
func (svc *Service) ListMacaroonIDs(ctxt context.Context) ([][]byte, error) {
return svc.rks.ListMacaroonIDs(ctxt)
}
// DeleteMacaroonID removes one specific root key ID. If the root key ID is
// found and deleted, it will be returned.
func (svc *Service) DeleteMacaroonID(ctxt context.Context,
rootKeyID []byte) ([]byte, error) {
return svc.rks.DeleteMacaroonID(ctxt, rootKeyID)
}

@ -10,6 +10,7 @@ import (
"github.com/lightningnetwork/lnd/channeldb/kvdb" "github.com/lightningnetwork/lnd/channeldb/kvdb"
"github.com/lightningnetwork/lnd/macaroons" "github.com/lightningnetwork/lnd/macaroons"
"github.com/stretchr/testify/require"
"google.golang.org/grpc/metadata" "google.golang.org/grpc/metadata"
"gopkg.in/macaroon-bakery.v2/bakery" "gopkg.in/macaroon-bakery.v2/bakery"
"gopkg.in/macaroon-bakery.v2/bakery/checkers" "gopkg.in/macaroon-bakery.v2/bakery/checkers"
@ -72,8 +73,13 @@ func TestNewService(t *testing.T) {
} }
// Third, check if the created service can bake macaroons. // Third, check if the created service can bake macaroons.
macaroon, err := service.Oven.NewMacaroon( _, err = service.NewMacaroon(context.TODO(), nil, testOperation)
context.TODO(), bakery.LatestVersion, nil, testOperation, if err != macaroons.ErrMissingRootKeyID {
t.Fatalf("Received %v instead of ErrMissingRootKeyID", err)
}
macaroon, err := service.NewMacaroon(
context.TODO(), macaroons.DefaultRootKeyID, testOperation,
) )
if err != nil { if err != nil {
t.Fatalf("Error creating macaroon from service: %v", err) t.Fatalf("Error creating macaroon from service: %v", err)
@ -117,8 +123,8 @@ func TestValidateMacaroon(t *testing.T) {
} }
// Then, create a new macaroon that we can serialize. // Then, create a new macaroon that we can serialize.
macaroon, err := service.Oven.NewMacaroon( macaroon, err := service.NewMacaroon(
context.TODO(), bakery.LatestVersion, nil, testOperation, context.TODO(), macaroons.DefaultRootKeyID, testOperation,
) )
if err != nil { if err != nil {
t.Fatalf("Error creating macaroon from service: %v", err) t.Fatalf("Error creating macaroon from service: %v", err)
@ -141,3 +147,84 @@ func TestValidateMacaroon(t *testing.T) {
t.Fatalf("Error validating the macaroon: %v", err) t.Fatalf("Error validating the macaroon: %v", err)
} }
} }
// TestListMacaroonIDs checks that ListMacaroonIDs returns the expected result.
func TestListMacaroonIDs(t *testing.T) {
// First, initialize a dummy DB file with a store that the service
// can read from. Make sure the file is removed in the end.
tempDir := setupTestRootKeyStorage(t)
defer os.RemoveAll(tempDir)
// Second, create the new service instance, unlock it and pass in a
// checker that we expect it to add to the bakery.
service, err := macaroons.NewService(tempDir, macaroons.IPLockChecker)
require.NoError(t, err, "Error creating new service")
defer service.Close()
err = service.CreateUnlock(&defaultPw)
require.NoError(t, err, "Error unlocking root key storage")
// Third, make 3 new macaroons with different root key IDs.
expectedIDs := [][]byte{{1}, {2}, {3}}
for _, v := range expectedIDs {
_, err := service.NewMacaroon(context.TODO(), v, testOperation)
require.NoError(t, err, "Error creating macaroon from service")
}
// Finally, check that calling List return the expected values.
ids, _ := service.ListMacaroonIDs(context.TODO())
require.Equal(t, expectedIDs, ids, "root key IDs mismatch")
}
// TestDeleteMacaroonID removes the specific root key ID.
func TestDeleteMacaroonID(t *testing.T) {
ctxb := context.Background()
// First, initialize a dummy DB file with a store that the service
// can read from. Make sure the file is removed in the end.
tempDir := setupTestRootKeyStorage(t)
defer os.RemoveAll(tempDir)
// Second, create the new service instance, unlock it and pass in a
// checker that we expect it to add to the bakery.
service, err := macaroons.NewService(tempDir, macaroons.IPLockChecker)
require.NoError(t, err, "Error creating new service")
defer service.Close()
err = service.CreateUnlock(&defaultPw)
require.NoError(t, err, "Error unlocking root key storage")
// Third, checks that removing encryptedKeyID returns an error.
encryptedKeyID := []byte("enckey")
_, err = service.DeleteMacaroonID(ctxb, encryptedKeyID)
require.Equal(t, macaroons.ErrDeletionForbidden, err)
// Fourth, checks that removing DefaultKeyID returns an error.
_, err = service.DeleteMacaroonID(ctxb, macaroons.DefaultRootKeyID)
require.Equal(t, macaroons.ErrDeletionForbidden, err)
// Fifth, checks that removing empty key id returns an error.
_, err = service.DeleteMacaroonID(ctxb, []byte{})
require.Equal(t, macaroons.ErrMissingRootKeyID, err)
// Sixth, checks that removing a non-existed key id returns nil.
nonExistedID := []byte("test-non-existed")
deletedID, err := service.DeleteMacaroonID(ctxb, nonExistedID)
require.NoError(t, err, "deleting macaroon ID got an error")
require.Nil(t, deletedID, "deleting non-existed ID should return nil")
// Seventh, make 3 new macaroons with different root key IDs, and delete
// one.
expectedIDs := [][]byte{{1}, {2}, {3}}
for _, v := range expectedIDs {
_, err := service.NewMacaroon(ctxb, v, testOperation)
require.NoError(t, err, "Error creating macaroon from service")
}
deletedID, err = service.DeleteMacaroonID(ctxb, expectedIDs[0])
require.NoError(t, err, "deleting macaroon ID got an error")
// Finally, check that the ID is deleted.
require.Equal(t, expectedIDs[0], deletedID, "expected ID to be removed")
ids, _ := service.ListMacaroonIDs(ctxb)
require.Equal(t, expectedIDs[1:], ids, "root key IDs mismatch")
}

@ -1,6 +1,7 @@
package macaroons package macaroons
import ( import (
"bytes"
"context" "context"
"crypto/rand" "crypto/rand"
"fmt" "fmt"
@ -21,11 +22,9 @@ var (
// rootKeyBucketName is the name of the root key store bucket. // rootKeyBucketName is the name of the root key store bucket.
rootKeyBucketName = []byte("macrootkeys") rootKeyBucketName = []byte("macrootkeys")
// defaultRootKeyID is the ID of the default root key. The first is // DefaultRootKeyID is the ID of the default root key. The first is
// just 0, to emulate the memory storage that comes with bakery. // just 0, to emulate the memory storage that comes with bakery.
// DefaultRootKeyID = []byte("0")
// TODO(aakselrod): Add support for key rotation.
defaultRootKeyID = []byte("0")
// encryptedKeyID is the name of the database key that stores the // encryptedKeyID is the name of the database key that stores the
// encryption key, encrypted with a salted + hashed password. The // encryption key, encrypted with a salted + hashed password. The
@ -42,6 +41,10 @@ var (
// ErrPasswordRequired specifies that a nil password has been passed. // ErrPasswordRequired specifies that a nil password has been passed.
ErrPasswordRequired = fmt.Errorf("a non-nil password is required") ErrPasswordRequired = fmt.Errorf("a non-nil password is required")
// ErrKeyValueForbidden is used when the root key ID uses encryptedKeyID as
// its value.
ErrKeyValueForbidden = fmt.Errorf("root key ID value is not allowed")
) )
// RootKeyStorage implements the bakery.RootKeyStorage interface. // RootKeyStorage implements the bakery.RootKeyStorage interface.
@ -157,8 +160,7 @@ func (r *RootKeyStorage) Get(_ context.Context, id []byte) ([]byte, error) {
// RootKey implements the RootKey method for the bakery.RootKeyStorage // RootKey implements the RootKey method for the bakery.RootKeyStorage
// interface. // interface.
// TODO(aakselrod): Add support for key rotation. func (r *RootKeyStorage) RootKey(ctx context.Context) ([]byte, []byte, error) {
func (r *RootKeyStorage) RootKey(_ context.Context) ([]byte, []byte, error) {
r.encKeyMtx.RLock() r.encKeyMtx.RLock()
defer r.encKeyMtx.RUnlock() defer r.encKeyMtx.RUnlock()
@ -166,8 +168,19 @@ func (r *RootKeyStorage) RootKey(_ context.Context) ([]byte, []byte, error) {
return nil, nil, ErrStoreLocked return nil, nil, ErrStoreLocked
} }
var rootKey []byte var rootKey []byte
id := defaultRootKeyID
err := kvdb.Update(r, func(tx kvdb.RwTx) error { // Read the root key ID from the context. If no key is specified in the
// context, an error will be returned.
id, err := RootKeyIDFromContext(ctx)
if err != nil {
return nil, nil, err
}
if bytes.Equal(id, encryptedKeyID) {
return nil, nil, ErrKeyValueForbidden
}
err = kvdb.Update(r, func(tx kvdb.RwTx) error {
ns := tx.ReadWriteBucket(rootKeyBucketName) ns := tx.ReadWriteBucket(rootKeyBucketName)
dbKey := ns.Get(id) dbKey := ns.Get(id)
@ -215,3 +228,88 @@ func (r *RootKeyStorage) Close() error {
} }
return r.Backend.Close() return r.Backend.Close()
} }
// ListMacaroonIDs returns all the root key ID values except the value of
// encryptedKeyID.
func (r *RootKeyStorage) ListMacaroonIDs(_ context.Context) ([][]byte, error) {
r.encKeyMtx.RLock()
defer r.encKeyMtx.RUnlock()
// Check it's unlocked.
if r.encKey == nil {
return nil, ErrStoreLocked
}
var rootKeySlice [][]byte
// Read all the items in the bucket and append the keys, which are the
// root key IDs we want.
err := kvdb.View(r, func(tx kvdb.RTx) error {
// appendRootKey is a function closure that appends root key ID
// to rootKeySlice.
appendRootKey := func(k, _ []byte) error {
// Only append when the key value is not encryptedKeyID.
if !bytes.Equal(k, encryptedKeyID) {
rootKeySlice = append(rootKeySlice, k)
}
return nil
}
return tx.ReadBucket(rootKeyBucketName).ForEach(appendRootKey)
})
if err != nil {
return nil, err
}
return rootKeySlice, nil
}
// DeleteMacaroonID removes one specific root key ID. If the root key ID is
// found and deleted, it will be returned.
func (r *RootKeyStorage) DeleteMacaroonID(
_ context.Context, rootKeyID []byte) ([]byte, error) {
r.encKeyMtx.RLock()
defer r.encKeyMtx.RUnlock()
// Check it's unlocked.
if r.encKey == nil {
return nil, ErrStoreLocked
}
// Check the rootKeyID is not empty.
if len(rootKeyID) == 0 {
return nil, ErrMissingRootKeyID
}
// Deleting encryptedKeyID or DefaultRootKeyID is not allowed.
if bytes.Equal(rootKeyID, encryptedKeyID) ||
bytes.Equal(rootKeyID, DefaultRootKeyID) {
return nil, ErrDeletionForbidden
}
var rootKeyIDDeleted []byte
err := kvdb.Update(r, func(tx kvdb.RwTx) error {
bucket := tx.ReadWriteBucket(rootKeyBucketName)
// Check the key can be found. If not, return nil.
if bucket.Get(rootKeyID) == nil {
return nil
}
// Once the key is found, we do the deletion.
if err := bucket.Delete(rootKeyID); err != nil {
return err
}
rootKeyIDDeleted = rootKeyID
return nil
})
if err != nil {
return nil, err
}
return rootKeyIDDeleted, nil
}

@ -51,13 +51,45 @@ func TestStore(t *testing.T) {
t.Fatalf("Error creating store encryption key: %v", err) t.Fatalf("Error creating store encryption key: %v", err)
} }
key, id, err := store.RootKey(context.TODO()) // Check ErrContextRootKeyID is returned when no root key ID found in
// context.
_, _, err = store.RootKey(context.TODO())
if err != macaroons.ErrContextRootKeyID {
t.Fatalf("Received %v instead of ErrContextRootKeyID", err)
}
// Check ErrMissingRootKeyID is returned when empty root key ID is used.
emptyKeyID := []byte{}
badCtx := macaroons.ContextWithRootKeyID(context.TODO(), emptyKeyID)
_, _, err = store.RootKey(badCtx)
if err != macaroons.ErrMissingRootKeyID {
t.Fatalf("Received %v instead of ErrMissingRootKeyID", err)
}
// Create a context with illegal root key ID value.
encryptedKeyID := []byte("enckey")
badCtx = macaroons.ContextWithRootKeyID(context.TODO(), encryptedKeyID)
_, _, err = store.RootKey(badCtx)
if err != macaroons.ErrKeyValueForbidden {
t.Fatalf("Received %v instead of ErrKeyValueForbidden", err)
}
// Create a context with root key ID value.
ctx := macaroons.ContextWithRootKeyID(
context.TODO(), macaroons.DefaultRootKeyID,
)
key, id, err := store.RootKey(ctx)
if err != nil { if err != nil {
t.Fatalf("Error getting root key from store: %v", err) t.Fatalf("Error getting root key from store: %v", err)
} }
rootID := id
key2, err := store.Get(context.TODO(), id) rootID := id
if !bytes.Equal(rootID, macaroons.DefaultRootKeyID) {
t.Fatalf("Root key ID doesn't match: expected %v, got %v",
macaroons.DefaultRootKeyID, rootID)
}
key2, err := store.Get(ctx, id)
if err != nil { if err != nil {
t.Fatalf("Error getting key with ID %s: %v", string(id), err) t.Fatalf("Error getting key with ID %s: %v", string(id), err)
} }
@ -100,12 +132,12 @@ func TestStore(t *testing.T) {
t.Fatalf("Received %v instead of ErrPasswordRequired", err) t.Fatalf("Received %v instead of ErrPasswordRequired", err)
} }
_, _, err = store.RootKey(context.TODO()) _, _, err = store.RootKey(ctx)
if err != macaroons.ErrStoreLocked { if err != macaroons.ErrStoreLocked {
t.Fatalf("Received %v instead of ErrStoreLocked", err) t.Fatalf("Received %v instead of ErrStoreLocked", err)
} }
_, err = store.Get(context.TODO(), nil) _, err = store.Get(ctx, nil)
if err != macaroons.ErrStoreLocked { if err != macaroons.ErrStoreLocked {
t.Fatalf("Received %v instead of ErrStoreLocked", err) t.Fatalf("Received %v instead of ErrStoreLocked", err)
} }
@ -115,7 +147,7 @@ func TestStore(t *testing.T) {
t.Fatalf("Error unlocking root key store: %v", err) t.Fatalf("Error unlocking root key store: %v", err)
} }
key, err = store.Get(context.TODO(), rootID) key, err = store.Get(ctx, rootID)
if err != nil { if err != nil {
t.Fatalf("Error getting key with ID %s: %v", t.Fatalf("Error getting key with ID %s: %v",
string(rootID), err) string(rootID), err)
@ -125,7 +157,7 @@ func TestStore(t *testing.T) {
key2, key) key2, key)
} }
key, id, err = store.RootKey(context.TODO()) key, id, err = store.RootKey(ctx)
if err != nil { if err != nil {
t.Fatalf("Error getting root key from store: %v", err) t.Fatalf("Error getting root key from store: %v", err)
} }

@ -12,6 +12,7 @@ import (
"net/http" "net/http"
"runtime" "runtime"
"sort" "sort"
"strconv"
"strings" "strings"
"sync" "sync"
"sync/atomic" "sync/atomic"
@ -107,6 +108,10 @@ var (
Entity: "signer", Entity: "signer",
Action: "read", Action: "read",
}, },
{
Entity: "macaroon",
Action: "read",
},
} }
// writePermissions is a slice of all entities that allow write // writePermissions is a slice of all entities that allow write
@ -148,6 +153,10 @@ var (
Entity: "macaroon", Entity: "macaroon",
Action: "generate", Action: "generate",
}, },
{
Entity: "macaroon",
Action: "write",
},
} }
// invoicePermissions is a slice of all the entities that allows a user // invoicePermissions is a slice of all the entities that allows a user
@ -185,6 +194,12 @@ var (
"onchain", "offchain", "address", "message", "onchain", "offchain", "address", "message",
"peers", "info", "invoices", "signer", "macaroon", "peers", "info", "invoices", "signer", "macaroon",
} }
// If the --no-macaroons flag is used to start lnd, the macaroon service
// is not initialized. errMacaroonDisabled is then returned when
// macaroon related services are used.
errMacaroonDisabled = fmt.Errorf("macaroon authentication disabled, " +
"remove --no-macaroons flag to enable")
) )
// stringInSlice returns true if a string is contained in the given slice. // stringInSlice returns true if a string is contained in the given slice.
@ -429,6 +444,14 @@ func mainRPCServerPermissions() map[string][]bakery.Op {
Entity: "macaroon", Entity: "macaroon",
Action: "generate", Action: "generate",
}}, }},
"/lnrpc.Lightning/ListMacaroonIDs": {{
Entity: "macaroon",
Action: "read",
}},
"/lnrpc.Lightning/DeleteMacaroonID": {{
Entity: "macaroon",
Action: "write",
}},
"/lnrpc.Lightning/SubscribePeerEvents": {{ "/lnrpc.Lightning/SubscribePeerEvents": {{
Entity: "peers", Entity: "peers",
Action: "read", Action: "read",
@ -6387,8 +6410,7 @@ func (r *rpcServer) BakeMacaroon(ctx context.Context,
// If the --no-macaroons flag is used to start lnd, the macaroon service // If the --no-macaroons flag is used to start lnd, the macaroon service
// is not initialized. Therefore we can't bake new macaroons. // is not initialized. Therefore we can't bake new macaroons.
if r.macService == nil { if r.macService == nil {
return nil, fmt.Errorf("macaroon authentication disabled, " + return nil, errMacaroonDisabled
"remove --no-macaroons flag to enable")
} }
helpMsg := fmt.Sprintf("supported actions are %v, supported entities "+ helpMsg := fmt.Sprintf("supported actions are %v, supported entities "+
@ -6420,10 +6442,17 @@ func (r *rpcServer) BakeMacaroon(ctx context.Context,
} }
} }
// Convert root key id from uint64 to bytes. Because the
// DefaultRootKeyID is a digit 0 expressed in a byte slice of a string
// "0", we will keep the IDs in the same format - all must be numeric,
// and must be a byte slice of string value of the digit, e.g.,
// uint64(123) to string(123).
rootKeyID := []byte(strconv.FormatUint(req.RootKeyId, 10))
// Bake new macaroon with the given permissions and send it binary // Bake new macaroon with the given permissions and send it binary
// serialized and hex encoded to the client. // serialized and hex encoded to the client.
newMac, err := r.macService.Oven.NewMacaroon( newMac, err := r.macService.NewMacaroon(
ctx, bakery.LatestVersion, nil, requestedPermissions..., ctx, rootKeyID, requestedPermissions...,
) )
if err != nil { if err != nil {
return nil, err return nil, err
@ -6438,6 +6467,68 @@ func (r *rpcServer) BakeMacaroon(ctx context.Context,
return resp, nil return resp, nil
} }
// ListMacaroonIDs returns a list of macaroon root key IDs in use.
func (r *rpcServer) ListMacaroonIDs(ctx context.Context,
req *lnrpc.ListMacaroonIDsRequest) (
*lnrpc.ListMacaroonIDsResponse, error) {
rpcsLog.Debugf("[listmacaroonids]")
// If the --no-macaroons flag is used to start lnd, the macaroon service
// is not initialized. Therefore we can't show any IDs.
if r.macService == nil {
return nil, errMacaroonDisabled
}
rootKeyIDByteSlice, err := r.macService.ListMacaroonIDs(ctx)
if err != nil {
return nil, err
}
var rootKeyIDs []uint64
for _, value := range rootKeyIDByteSlice {
// Convert bytes into uint64.
id, err := strconv.ParseUint(string(value), 10, 64)
if err != nil {
return nil, err
}
rootKeyIDs = append(rootKeyIDs, id)
}
return &lnrpc.ListMacaroonIDsResponse{RootKeyIds: rootKeyIDs}, nil
}
// DeleteMacaroonID removes a specific macaroon ID.
func (r *rpcServer) DeleteMacaroonID(ctx context.Context,
req *lnrpc.DeleteMacaroonIDRequest) (
*lnrpc.DeleteMacaroonIDResponse, error) {
rpcsLog.Debugf("[deletemacaroonid]")
// If the --no-macaroons flag is used to start lnd, the macaroon service
// is not initialized. Therefore we can't delete any IDs.
if r.macService == nil {
return nil, errMacaroonDisabled
}
// Convert root key id from uint64 to bytes. Because the
// DefaultRootKeyID is a digit 0 expressed in a byte slice of a string
// "0", we will keep the IDs in the same format - all must be digit, and
// must be a byte slice of string value of the digit.
rootKeyID := []byte(strconv.FormatUint(req.RootKeyId, 10))
deletedIDBytes, err := r.macService.DeleteMacaroonID(ctx, rootKeyID)
if err != nil {
return nil, err
}
return &lnrpc.DeleteMacaroonIDResponse{
// If the root key ID doesn't exist, it won't be deleted. We
// will return a response with deleted = false, otherwise true.
Deleted: deletedIDBytes != nil,
}, nil
}
// FundingStateStep is an advanced funding related call that allows the caller // FundingStateStep is an advanced funding related call that allows the caller
// to either execute some preparatory steps for a funding workflow, or manually // to either execute some preparatory steps for a funding workflow, or manually
// progress a funding workflow. The primary way a funding flow is identified is // progress a funding workflow. The primary way a funding flow is identified is