From 6d201ef4fc168eeda71340c6ab85e53353278c30 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Fri, 4 Sep 2020 09:22:35 +0200 Subject: [PATCH 01/12] macaroons: add special permission entity for URI specific permissions To make the permission system even more fine-grained, we want to allow users to specify exact gRPC URIs in the macaroon permissions instead of just broad entity/action groups. For this we add the special entity "uri" which allows an URI specific permission to be defined as "uri:/lnrpc.Lightning/GetInfo" for example instead of the more coarse "info:read" which gives access to multiple URIs. --- macaroons/README.md | 14 ++++++++++++-- macaroons/service.go | 37 ++++++++++++++++++++++++++++++++----- macaroons/service_test.go | 18 +++++++++++++++++- 3 files changed, 61 insertions(+), 8 deletions(-) diff --git a/macaroons/README.md b/macaroons/README.md index 8e379c0a..863f435b 100644 --- a/macaroons/README.md +++ b/macaroons/README.md @@ -100,8 +100,18 @@ key `0` would be created with the following command: `lncli bakemacaroon peers:read peers:write` -A full and up-to-date list of available entity/action pairs can be found by -looking at the `rpcserver.go` in the root folder of the project. +For even more fine-grained permission control, it is also possible to specify +single RPC method URIs that are allowed to be accessed by a macaroon. This can +be achieved by passing `uri:` pairs to `bakemacaroon`, for example: + +`lncli bakemacaroon uri:/lnrpc.Lightning/GetInfo uri:/verrpc.Versioner/GetVersion` + +The macaroon created by this call would only be allowed to call the `GetInfo` and +`GetVersion` methods instead of all methods that have similar permissions (like +`info:read` for example). + +A full list of available entity/action pairs and RPC method URIs can be queried +by using the `lncli listpermissions` command. ### Upgrading from v0.8.0-beta or earlier diff --git a/macaroons/service.go b/macaroons/service.go index 823ef0fc..0e84ddeb 100644 --- a/macaroons/service.go +++ b/macaroons/service.go @@ -27,6 +27,15 @@ var ( // ErrDeletionForbidden is used when attempting to delete the // DefaultRootKeyID or the encryptedKeyID. ErrDeletionForbidden = fmt.Errorf("the specified ID cannot be deleted") + + // PermissionEntityCustomURI is a special entity name for a permission + // that does not describe an entity:action pair but instead specifies a + // specific URI that needs to be granted access to. This can be used for + // more fine-grained permissions where a macaroon only grants access to + // certain methods instead of a whole list of methods that define the + // same entity:action pairs. For example: uri:/lnrpc.Lightning/GetInfo + // only gives access to the GetInfo call. + PermissionEntityCustomURI = "uri" ) // Service encapsulates bakery.Bakery and adds a Close() method that zeroes the @@ -118,12 +127,15 @@ func (svc *Service) UnaryServerInterceptor( info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (interface{}, error) { - if _, ok := permissionMap[info.FullMethod]; !ok { + uriPermissions, ok := permissionMap[info.FullMethod] + if !ok { return nil, fmt.Errorf("%s: unknown permissions "+ "required for method", info.FullMethod) } - err := svc.ValidateMacaroon(ctx, permissionMap[info.FullMethod]) + err := svc.ValidateMacaroon( + ctx, uriPermissions, info.FullMethod, + ) if err != nil { return nil, err } @@ -140,13 +152,14 @@ func (svc *Service) StreamServerInterceptor( return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { - if _, ok := permissionMap[info.FullMethod]; !ok { + uriPermissions, ok := permissionMap[info.FullMethod] + if !ok { return fmt.Errorf("%s: unknown permissions required "+ "for method", info.FullMethod) } err := svc.ValidateMacaroon( - ss.Context(), permissionMap[info.FullMethod], + ss.Context(), uriPermissions, info.FullMethod, ) if err != nil { return err @@ -161,7 +174,7 @@ func (svc *Service) StreamServerInterceptor( // expect a macaroon to be encoded as request metadata using the key // "macaroon". func (svc *Service) ValidateMacaroon(ctx context.Context, - requiredPermissions []bakery.Op) error { + requiredPermissions []bakery.Op, fullMethod string) error { // Get macaroon bytes from context and unmarshal into macaroon. md, ok := metadata.FromIncomingContext(ctx) @@ -190,6 +203,20 @@ func (svc *Service) ValidateMacaroon(ctx context.Context, // the expiration time and IP address and return the result. authChecker := svc.Checker.Auth(macaroon.Slice{mac}) _, err = authChecker.Allow(ctx, requiredPermissions...) + + // If the macaroon contains broad permissions and checks out, we're + // done. + if err == nil { + return nil + } + + // To also allow the special permission of "uri:" to be a + // valid permission, we need to check it manually in case there is no + // broader scope permission defined. + _, err = authChecker.Allow(ctx, bakery.Op{ + Entity: PermissionEntityCustomURI, + Action: fullMethod, + }) return err } diff --git a/macaroons/service_test.go b/macaroons/service_test.go index 32f2327c..90c9b573 100644 --- a/macaroons/service_test.go +++ b/macaroons/service_test.go @@ -21,6 +21,10 @@ var ( Entity: "testEntity", Action: "read", } + testOperationURI = bakery.Op{ + Entity: macaroons.PermissionEntityCustomURI, + Action: "SomeMethod", + } defaultPw = []byte("hello") ) @@ -125,6 +129,7 @@ func TestValidateMacaroon(t *testing.T) { // Then, create a new macaroon that we can serialize. macaroon, err := service.NewMacaroon( context.TODO(), macaroons.DefaultRootKeyID, testOperation, + testOperationURI, ) if err != nil { t.Fatalf("Error creating macaroon from service: %v", err) @@ -142,7 +147,18 @@ func TestValidateMacaroon(t *testing.T) { mockContext := metadata.NewIncomingContext(context.Background(), md) // Finally, validate the macaroon against the required permissions. - err = service.ValidateMacaroon(mockContext, []bakery.Op{testOperation}) + err = service.ValidateMacaroon( + mockContext, []bakery.Op{testOperation}, "FooMethod", + ) + if err != nil { + t.Fatalf("Error validating the macaroon: %v", err) + } + + // If the macaroon has the method specific URI permission, the list of + // required entity/action pairs is irrelevant. + err = service.ValidateMacaroon( + mockContext, []bakery.Op{{Entity: "irrelevant"}}, "SomeMethod", + ) if err != nil { t.Fatalf("Error validating the macaroon: %v", err) } From 84879fddc6a9338ae683d35259ac0575100be0ee Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Fri, 4 Sep 2020 09:22:36 +0200 Subject: [PATCH 02/12] rpcserver: allow to bake macaroons for specific URIs To support the new URI specific permissions, we allow them to be added in the BakeMacaroon call. --- rpcserver.go | 26 ++++++++++++++++++++++---- 1 file changed, 22 insertions(+), 4 deletions(-) diff --git a/rpcserver.go b/rpcserver.go index c55a7313..86c82eab 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -193,6 +193,7 @@ var ( validEntities = []string{ "onchain", "offchain", "address", "message", "peers", "info", "invoices", "signer", "macaroon", + macaroons.PermissionEntityCustomURI, } // If the --no-macaroons flag is used to start lnd, the macaroon service @@ -525,6 +526,10 @@ type rpcServer struct { // selfNode is our own pubkey. selfNode route.Vertex + + // allPermissions is a map of all registered gRPC URIs (including + // internal and external subservers) to the permissions they require. + allPermissions map[string][]bakery.Op } // A compile time check to ensure that rpcServer fully implements the @@ -732,6 +737,7 @@ func newRPCServer(cfg *Config, s *server, macService *macaroons.Service, quit: make(chan struct{}, 1), macService: macService, selfNode: selfNode.PubKeyBytes, + allPermissions: permissions, } lnrpc.RegisterLightningServer(grpcServer, rootRPCServer) @@ -6452,15 +6458,27 @@ func (r *rpcServer) BakeMacaroon(ctx context.Context, // the bakery. requestedPermissions := make([]bakery.Op, len(req.Permissions)) for idx, op := range req.Permissions { - if !stringInSlice(op.Action, validActions) { - return nil, fmt.Errorf("invalid permission action. %s", - helpMsg) - } if !stringInSlice(op.Entity, validEntities) { return nil, fmt.Errorf("invalid permission entity. %s", helpMsg) } + // Either we have the special entity "uri" which specifies a + // full gRPC URI or we have one of the pre-defined actions. + if op.Entity == macaroons.PermissionEntityCustomURI { + _, ok := r.allPermissions[op.Action] + if !ok { + return nil, fmt.Errorf("invalid permission " + + "action, must be an existing URI in " + + "the format /package.Service/" + + "MethodName") + } + } else if !stringInSlice(op.Action, validActions) { + return nil, fmt.Errorf("invalid permission action. %s", + helpMsg) + + } + requestedPermissions[idx] = bakery.Op{ Entity: op.Entity, Action: op.Action, From ba6156d41d8667f8aec8548453060636700b238a Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Fri, 4 Sep 2020 09:22:38 +0200 Subject: [PATCH 03/12] lnrpc+rpcserver: add ListPermissions RPC As a convenience method for users to look up what RPC method URIs exist and what permissions they require, we add a new ListPermissions call that simply returns all registered URIs (including internal and external subservers) and their required permissions. --- lnrpc/rest-annotations.yaml | 2 + lnrpc/rpc.pb.go | 1647 +++++++++++++++++++---------------- lnrpc/rpc.pb.gw.go | 62 ++ lnrpc/rpc.proto | 22 + lnrpc/rpc.swagger.json | 47 + rpcserver.go | 31 + 6 files changed, 1070 insertions(+), 741 deletions(-) diff --git a/lnrpc/rest-annotations.yaml b/lnrpc/rest-annotations.yaml index 94513837..fa29afc9 100644 --- a/lnrpc/rest-annotations.yaml +++ b/lnrpc/rest-annotations.yaml @@ -137,6 +137,8 @@ http: get: "/v1/macaroon/ids" - selector: lnrpc.Lightning.DeleteMacaroonID delete: "/v1/macaroon/{root_key_id}" + - selector: lnrpc.Lightning.ListPermissions + get: "/v1/macaroon/permissions" # walletunlocker.proto - selector: lnrpc.WalletUnlocker.GenSeed diff --git a/lnrpc/rpc.pb.go b/lnrpc/rpc.pb.go index ba8b705a..5cad7101 100644 --- a/lnrpc/rpc.pb.go +++ b/lnrpc/rpc.pb.go @@ -760,7 +760,7 @@ func (x Failure_FailureCode) String() string { } func (Failure_FailureCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{154, 0} + return fileDescriptor_77a6da22d6a3feb1, []int{157, 0} } type Utxo struct { @@ -11758,6 +11758,119 @@ func (m *DeleteMacaroonIDResponse) GetDeleted() bool { return false } +type MacaroonPermissionList struct { + // A list of macaroon permissions. + Permissions []*MacaroonPermission `protobuf:"bytes,1,rep,name=permissions,proto3" json:"permissions,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *MacaroonPermissionList) Reset() { *m = MacaroonPermissionList{} } +func (m *MacaroonPermissionList) String() string { return proto.CompactTextString(m) } +func (*MacaroonPermissionList) ProtoMessage() {} +func (*MacaroonPermissionList) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{154} +} + +func (m *MacaroonPermissionList) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_MacaroonPermissionList.Unmarshal(m, b) +} +func (m *MacaroonPermissionList) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_MacaroonPermissionList.Marshal(b, m, deterministic) +} +func (m *MacaroonPermissionList) XXX_Merge(src proto.Message) { + xxx_messageInfo_MacaroonPermissionList.Merge(m, src) +} +func (m *MacaroonPermissionList) XXX_Size() int { + return xxx_messageInfo_MacaroonPermissionList.Size(m) +} +func (m *MacaroonPermissionList) XXX_DiscardUnknown() { + xxx_messageInfo_MacaroonPermissionList.DiscardUnknown(m) +} + +var xxx_messageInfo_MacaroonPermissionList proto.InternalMessageInfo + +func (m *MacaroonPermissionList) GetPermissions() []*MacaroonPermission { + if m != nil { + return m.Permissions + } + return nil +} + +type ListPermissionsRequest struct { + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListPermissionsRequest) Reset() { *m = ListPermissionsRequest{} } +func (m *ListPermissionsRequest) String() string { return proto.CompactTextString(m) } +func (*ListPermissionsRequest) ProtoMessage() {} +func (*ListPermissionsRequest) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{155} +} + +func (m *ListPermissionsRequest) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListPermissionsRequest.Unmarshal(m, b) +} +func (m *ListPermissionsRequest) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListPermissionsRequest.Marshal(b, m, deterministic) +} +func (m *ListPermissionsRequest) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListPermissionsRequest.Merge(m, src) +} +func (m *ListPermissionsRequest) XXX_Size() int { + return xxx_messageInfo_ListPermissionsRequest.Size(m) +} +func (m *ListPermissionsRequest) XXX_DiscardUnknown() { + xxx_messageInfo_ListPermissionsRequest.DiscardUnknown(m) +} + +var xxx_messageInfo_ListPermissionsRequest proto.InternalMessageInfo + +type ListPermissionsResponse struct { + // + //A map between all RPC method URIs and their required macaroon permissions to + //access them. + MethodPermissions map[string]*MacaroonPermissionList `protobuf:"bytes,1,rep,name=method_permissions,json=methodPermissions,proto3" json:"method_permissions,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *ListPermissionsResponse) Reset() { *m = ListPermissionsResponse{} } +func (m *ListPermissionsResponse) String() string { return proto.CompactTextString(m) } +func (*ListPermissionsResponse) ProtoMessage() {} +func (*ListPermissionsResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_77a6da22d6a3feb1, []int{156} +} + +func (m *ListPermissionsResponse) XXX_Unmarshal(b []byte) error { + return xxx_messageInfo_ListPermissionsResponse.Unmarshal(m, b) +} +func (m *ListPermissionsResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + return xxx_messageInfo_ListPermissionsResponse.Marshal(b, m, deterministic) +} +func (m *ListPermissionsResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_ListPermissionsResponse.Merge(m, src) +} +func (m *ListPermissionsResponse) XXX_Size() int { + return xxx_messageInfo_ListPermissionsResponse.Size(m) +} +func (m *ListPermissionsResponse) XXX_DiscardUnknown() { + xxx_messageInfo_ListPermissionsResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_ListPermissionsResponse proto.InternalMessageInfo + +func (m *ListPermissionsResponse) GetMethodPermissions() map[string]*MacaroonPermissionList { + if m != nil { + return m.MethodPermissions + } + return nil +} + type Failure struct { // Failure code as defined in the Lightning spec Code Failure_FailureCode `protobuf:"varint,1,opt,name=code,proto3,enum=lnrpc.Failure_FailureCode" json:"code,omitempty"` @@ -11786,7 +11899,7 @@ func (m *Failure) Reset() { *m = Failure{} } func (m *Failure) String() string { return proto.CompactTextString(m) } func (*Failure) ProtoMessage() {} func (*Failure) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{154} + return fileDescriptor_77a6da22d6a3feb1, []int{157} } func (m *Failure) XXX_Unmarshal(b []byte) error { @@ -11930,7 +12043,7 @@ func (m *ChannelUpdate) Reset() { *m = ChannelUpdate{} } func (m *ChannelUpdate) String() string { return proto.CompactTextString(m) } func (*ChannelUpdate) ProtoMessage() {} func (*ChannelUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_77a6da22d6a3feb1, []int{155} + return fileDescriptor_77a6da22d6a3feb1, []int{158} } func (m *ChannelUpdate) XXX_Unmarshal(b []byte) error { @@ -12226,6 +12339,10 @@ func init() { proto.RegisterType((*ListMacaroonIDsResponse)(nil), "lnrpc.ListMacaroonIDsResponse") proto.RegisterType((*DeleteMacaroonIDRequest)(nil), "lnrpc.DeleteMacaroonIDRequest") proto.RegisterType((*DeleteMacaroonIDResponse)(nil), "lnrpc.DeleteMacaroonIDResponse") + proto.RegisterType((*MacaroonPermissionList)(nil), "lnrpc.MacaroonPermissionList") + proto.RegisterType((*ListPermissionsRequest)(nil), "lnrpc.ListPermissionsRequest") + proto.RegisterType((*ListPermissionsResponse)(nil), "lnrpc.ListPermissionsResponse") + proto.RegisterMapType((map[string]*MacaroonPermissionList)(nil), "lnrpc.ListPermissionsResponse.MethodPermissionsEntry") proto.RegisterType((*Failure)(nil), "lnrpc.Failure") proto.RegisterType((*ChannelUpdate)(nil), "lnrpc.ChannelUpdate") } @@ -12233,744 +12350,750 @@ func init() { func init() { proto.RegisterFile("rpc.proto", fileDescriptor_77a6da22d6a3feb1) } var fileDescriptor_77a6da22d6a3feb1 = []byte{ - // 11788 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x7d, 0x4b, 0x6c, 0x23, 0x49, - 0x96, 0x58, 0xf1, 0x27, 0x92, 0x8f, 0xa4, 0x94, 0x0a, 0xfd, 0x58, 0xaa, 0xae, 0xae, 0xea, 0xec, - 0x9e, 0xee, 0x9a, 0xea, 0x99, 0xea, 0xea, 0x9a, 0xae, 0xfe, 0x4c, 0x79, 0x67, 0x86, 0xa2, 0xa8, - 0x12, 0xa7, 0x24, 0x52, 0x93, 0xa4, 0xba, 0xb7, 0x17, 0xeb, 0xcd, 0x4d, 0x91, 0x21, 0x29, 0x5d, - 0x64, 0x26, 0x3b, 0x33, 0xa9, 0x92, 0xc6, 0xf0, 0x6d, 0xfd, 0xc1, 0x62, 0x6d, 0xc0, 0x80, 0xd7, - 0x80, 0x3f, 0x0b, 0xff, 0x60, 0xfb, 0xb6, 0x30, 0xbc, 0x6b, 0x9f, 0x7c, 0xf6, 0x5e, 0x6c, 0x18, - 0x86, 0xd7, 0xf0, 0x07, 0x8b, 0x05, 0x7c, 0xf0, 0xfa, 0x60, 0xc0, 0x58, 0xc0, 0x06, 0x0c, 0x1f, - 0x0c, 0x18, 0x11, 0x2f, 0x22, 0x32, 0x32, 0x99, 0xaa, 0xaa, 0x9e, 0x6d, 0xcf, 0x45, 0x62, 0xbe, - 0xf7, 0x22, 0x32, 0x3e, 0x2f, 0x5e, 0xbc, 0x5f, 0x44, 0x42, 0x35, 0x98, 0x8d, 0x1e, 0xcc, 0x02, - 0x3f, 0xf2, 0x49, 0x69, 0xe2, 0x05, 0xb3, 0x91, 0xf9, 0x47, 0x39, 0x28, 0x1e, 0x47, 0x97, 0x3e, - 0x79, 0x0c, 0x75, 0x67, 0x3c, 0x0e, 0x68, 0x18, 0xda, 0xd1, 0xd5, 0x8c, 0x36, 0x73, 0x77, 0x73, - 0xf7, 0x96, 0x1f, 0x91, 0x07, 0x9c, 0xec, 0x41, 0x0b, 0x51, 0xc3, 0xab, 0x19, 0xb5, 0x6a, 0x4e, - 0xfc, 0x40, 0x9a, 0x50, 0x16, 0x8f, 0xcd, 0xfc, 0xdd, 0xdc, 0xbd, 0xaa, 0x25, 0x1f, 0xc9, 0x6d, - 0x00, 0x67, 0xea, 0xcf, 0xbd, 0xc8, 0x0e, 0x9d, 0xa8, 0x59, 0xb8, 0x9b, 0xbb, 0x57, 0xb0, 0xaa, - 0x08, 0x19, 0x38, 0x11, 0xb9, 0x05, 0xd5, 0xd9, 0x73, 0x3b, 0x1c, 0x05, 0xee, 0x2c, 0x6a, 0x16, - 0x79, 0xd1, 0xca, 0xec, 0xf9, 0x80, 0x3f, 0x93, 0xf7, 0xa1, 0xe2, 0xcf, 0xa3, 0x99, 0xef, 0x7a, - 0x51, 0xb3, 0x74, 0x37, 0x77, 0xaf, 0xf6, 0x68, 0x45, 0x34, 0xa4, 0x3f, 0x8f, 0x8e, 0x18, 0xd8, - 0x52, 0x04, 0xe4, 0x1d, 0x68, 0x8c, 0x7c, 0xef, 0xd4, 0x0d, 0xa6, 0x4e, 0xe4, 0xfa, 0x5e, 0xd8, - 0x5c, 0xe2, 0xef, 0x4a, 0x02, 0xcd, 0x7f, 0x99, 0x87, 0xda, 0x30, 0x70, 0xbc, 0xd0, 0x19, 0x31, - 0x00, 0xd9, 0x82, 0x72, 0x74, 0x69, 0x9f, 0x3b, 0xe1, 0x39, 0xef, 0x6a, 0xd5, 0x5a, 0x8a, 0x2e, - 0xf7, 0x9d, 0xf0, 0x9c, 0x6c, 0xc2, 0x12, 0xb6, 0x92, 0x77, 0xa8, 0x60, 0x89, 0x27, 0xf2, 0x3e, - 0xac, 0x7a, 0xf3, 0xa9, 0x9d, 0x7c, 0x15, 0xeb, 0x56, 0xc9, 0x32, 0xbc, 0xf9, 0xb4, 0xad, 0xc3, - 0x59, 0xe7, 0x4f, 0x26, 0xfe, 0xe8, 0x39, 0xbe, 0x00, 0xbb, 0x57, 0xe5, 0x10, 0xfe, 0x8e, 0xb7, - 0xa0, 0x2e, 0xd0, 0xd4, 0x3d, 0x3b, 0xc7, 0x3e, 0x96, 0xac, 0x1a, 0x12, 0x70, 0x10, 0xab, 0x21, - 0x72, 0xa7, 0xd4, 0x0e, 0x23, 0x67, 0x3a, 0x13, 0x5d, 0xaa, 0x32, 0xc8, 0x80, 0x01, 0x38, 0xda, - 0x8f, 0x9c, 0x89, 0x7d, 0x4a, 0x69, 0xd8, 0x2c, 0x0b, 0x34, 0x83, 0xec, 0x51, 0x1a, 0x92, 0x6f, - 0xc1, 0xf2, 0x98, 0x86, 0x91, 0x2d, 0x26, 0x83, 0x86, 0xcd, 0xca, 0xdd, 0xc2, 0xbd, 0xaa, 0xd5, - 0x60, 0xd0, 0x96, 0x04, 0x92, 0x37, 0x00, 0x02, 0xe7, 0x85, 0xcd, 0x06, 0x82, 0x5e, 0x36, 0xab, - 0x38, 0x0b, 0x81, 0xf3, 0x62, 0x78, 0xb9, 0x4f, 0x2f, 0xc9, 0x3a, 0x94, 0x26, 0xce, 0x09, 0x9d, - 0x34, 0x81, 0x23, 0xf0, 0xc1, 0xfc, 0x25, 0xd8, 0x7c, 0x4a, 0x23, 0x6d, 0x28, 0x43, 0x8b, 0x7e, - 0x35, 0xa7, 0x61, 0xc4, 0x7a, 0x15, 0x46, 0x4e, 0x10, 0xc9, 0x5e, 0xe5, 0xb0, 0x57, 0x1c, 0x16, - 0xf7, 0x8a, 0x7a, 0x63, 0x49, 0x90, 0xe7, 0x04, 0x55, 0xea, 0x8d, 0x11, 0x6d, 0x1e, 0x00, 0xd1, - 0x2a, 0xde, 0xa5, 0x91, 0xe3, 0x4e, 0x42, 0xf2, 0x31, 0xd4, 0x23, 0xed, 0x75, 0xcd, 0xdc, 0xdd, - 0xc2, 0xbd, 0x9a, 0x62, 0x4d, 0xad, 0x80, 0x95, 0xa0, 0x33, 0xcf, 0xa1, 0xb2, 0x47, 0xe9, 0x81, - 0x3b, 0x75, 0x23, 0xb2, 0x09, 0xa5, 0x53, 0xf7, 0x92, 0x8e, 0x79, 0xa3, 0x0a, 0xfb, 0x37, 0x2c, - 0x7c, 0x24, 0x77, 0x00, 0xf8, 0x0f, 0x7b, 0xaa, 0xb8, 0x74, 0xff, 0x86, 0x55, 0xe5, 0xb0, 0xc3, - 0xd0, 0x89, 0xc8, 0x36, 0x94, 0x67, 0x34, 0x18, 0x51, 0xc9, 0x0f, 0xfb, 0x37, 0x2c, 0x09, 0xd8, - 0x29, 0x43, 0x69, 0xc2, 0x6a, 0x37, 0x7f, 0xaf, 0x04, 0xb5, 0x01, 0xf5, 0xc6, 0x72, 0x24, 0x08, - 0x14, 0xd9, 0x40, 0xf3, 0x97, 0xd5, 0x2d, 0xfe, 0x9b, 0xbc, 0x0d, 0x35, 0x3e, 0x25, 0x61, 0x14, - 0xb8, 0xde, 0x19, 0xae, 0x96, 0x9d, 0x7c, 0x33, 0x67, 0x01, 0x03, 0x0f, 0x38, 0x94, 0x18, 0x50, - 0x70, 0xa6, 0x72, 0xb5, 0xb0, 0x9f, 0xe4, 0x26, 0x54, 0x9c, 0x69, 0x84, 0xcd, 0xab, 0x73, 0x70, - 0xd9, 0x99, 0x46, 0xbc, 0x69, 0x6f, 0x41, 0x7d, 0xe6, 0x5c, 0x4d, 0xa9, 0x17, 0xc5, 0x6c, 0x56, - 0xb7, 0x6a, 0x02, 0xc6, 0x19, 0xed, 0x11, 0xac, 0xe9, 0x24, 0xf2, 0xe5, 0x25, 0xf5, 0xf2, 0x55, - 0x8d, 0x5a, 0xb4, 0xe1, 0x3d, 0x58, 0x91, 0x65, 0x02, 0xec, 0x0f, 0x67, 0xbf, 0xaa, 0xb5, 0x2c, - 0xc0, 0xb2, 0x97, 0xf7, 0xc0, 0x38, 0x75, 0x3d, 0x67, 0x62, 0x8f, 0x26, 0xd1, 0x85, 0x3d, 0xa6, - 0x93, 0xc8, 0xe1, 0x9c, 0x58, 0xb2, 0x96, 0x39, 0xbc, 0x3d, 0x89, 0x2e, 0x76, 0x19, 0x94, 0x7c, - 0x07, 0xaa, 0xa7, 0x94, 0xda, 0x7c, 0xb0, 0x9a, 0x95, 0xc4, 0x82, 0x96, 0x33, 0x64, 0x55, 0x4e, - 0xe5, 0x5c, 0x7d, 0x07, 0x0c, 0x7f, 0x1e, 0x9d, 0xf9, 0xae, 0x77, 0x66, 0x8f, 0xce, 0x1d, 0xcf, - 0x76, 0xc7, 0x9c, 0x37, 0x8b, 0x3b, 0xf9, 0x87, 0x39, 0x6b, 0x59, 0xe2, 0xda, 0xe7, 0x8e, 0xd7, - 0x1d, 0x93, 0x77, 0x61, 0x65, 0xe2, 0x84, 0x91, 0x7d, 0xee, 0xcf, 0xec, 0xd9, 0xfc, 0xe4, 0x39, - 0xbd, 0x6a, 0x36, 0xf8, 0x40, 0x34, 0x18, 0x78, 0xdf, 0x9f, 0x1d, 0x71, 0x20, 0x63, 0x3d, 0xde, - 0x4e, 0x6c, 0x04, 0x63, 0xe9, 0x86, 0x55, 0x65, 0x10, 0x7c, 0xe9, 0x97, 0xb0, 0xc6, 0xa7, 0x67, - 0x34, 0x0f, 0x23, 0x7f, 0x6a, 0x07, 0x74, 0xe4, 0x07, 0xe3, 0xb0, 0x59, 0xe3, 0xbc, 0xf6, 0x6d, - 0xd1, 0x58, 0x6d, 0x8e, 0x1f, 0xec, 0xd2, 0x30, 0x6a, 0x73, 0x62, 0x0b, 0x69, 0x3b, 0x5e, 0x14, - 0x5c, 0x59, 0xab, 0xe3, 0x34, 0x9c, 0x7c, 0x07, 0x88, 0x33, 0x99, 0xf8, 0x2f, 0xec, 0x90, 0x4e, - 0x4e, 0x6d, 0x31, 0x88, 0xcd, 0xe5, 0xbb, 0xb9, 0x7b, 0x15, 0xcb, 0xe0, 0x98, 0x01, 0x9d, 0x9c, - 0x1e, 0x21, 0x9c, 0x7c, 0x0c, 0x7c, 0x91, 0xda, 0xa7, 0xd4, 0x89, 0xe6, 0x01, 0x0d, 0x9b, 0x2b, - 0x77, 0x0b, 0xf7, 0x96, 0x1f, 0xad, 0xaa, 0xf1, 0xe2, 0xe0, 0x1d, 0x37, 0xb2, 0xea, 0x8c, 0x4e, - 0x3c, 0x87, 0xdb, 0xbb, 0xb0, 0x99, 0xdd, 0x24, 0xc6, 0x54, 0x6c, 0x54, 0x18, 0x33, 0x16, 0x2d, - 0xf6, 0x93, 0xad, 0xec, 0x0b, 0x67, 0x32, 0xa7, 0x9c, 0x0b, 0xeb, 0x16, 0x3e, 0x7c, 0x3f, 0xff, - 0x69, 0xce, 0xfc, 0xdd, 0x1c, 0xd4, 0xb1, 0x97, 0xe1, 0xcc, 0xf7, 0x42, 0x4a, 0xde, 0x86, 0x86, - 0xe4, 0x06, 0x1a, 0x04, 0x7e, 0x20, 0xa4, 0xa5, 0xe4, 0xbc, 0x0e, 0x83, 0x91, 0x6f, 0x83, 0x21, - 0x89, 0x66, 0x01, 0x75, 0xa7, 0xce, 0x99, 0xac, 0x5a, 0xb2, 0xd2, 0x91, 0x00, 0x93, 0x0f, 0xe3, - 0xfa, 0x02, 0x7f, 0x1e, 0x51, 0xce, 0xeb, 0xb5, 0x47, 0x75, 0xd1, 0x3d, 0x8b, 0xc1, 0x54, 0xed, - 0xfc, 0xe9, 0x35, 0xf8, 0xdc, 0xfc, 0xcd, 0x1c, 0x10, 0xd6, 0xec, 0xa1, 0x8f, 0x15, 0xc4, 0x12, - 0x29, 0x51, 0x32, 0xf7, 0xda, 0x2b, 0x24, 0xff, 0xb2, 0x15, 0x62, 0x42, 0x09, 0xdb, 0x5e, 0xcc, - 0x68, 0x3b, 0xa2, 0x7e, 0x5c, 0xac, 0x14, 0x8c, 0xa2, 0xf9, 0x9f, 0x0b, 0xb0, 0xce, 0xf8, 0xd4, - 0xa3, 0x93, 0xd6, 0x68, 0x44, 0x67, 0x6a, 0xed, 0xdc, 0x81, 0x9a, 0xe7, 0x8f, 0xa9, 0xe4, 0x58, - 0x6c, 0x18, 0x30, 0x90, 0xc6, 0xae, 0xe7, 0x8e, 0xeb, 0x61, 0xc3, 0x71, 0x30, 0xab, 0x1c, 0xc2, - 0x9b, 0xfd, 0x2e, 0xac, 0xcc, 0xa8, 0x37, 0xd6, 0x97, 0x48, 0x01, 0xb9, 0x5e, 0x80, 0xc5, 0xea, - 0xb8, 0x03, 0xb5, 0xd3, 0x39, 0xd2, 0x31, 0xc1, 0x52, 0xe4, 0x3c, 0x00, 0x02, 0xd4, 0x42, 0xf9, - 0x32, 0x9b, 0x87, 0xe7, 0x1c, 0x5b, 0xe2, 0xd8, 0x32, 0x7b, 0x66, 0xa8, 0xdb, 0x00, 0xe3, 0x79, - 0x18, 0x89, 0x15, 0xb3, 0xc4, 0x91, 0x55, 0x06, 0xc1, 0x15, 0xf3, 0x5d, 0x58, 0x9b, 0x3a, 0x97, - 0x36, 0xe7, 0x1d, 0xdb, 0xf5, 0xec, 0xd3, 0x09, 0x17, 0xea, 0x65, 0x4e, 0x67, 0x4c, 0x9d, 0xcb, - 0xcf, 0x19, 0xa6, 0xeb, 0xed, 0x71, 0x38, 0x13, 0x2b, 0x23, 0x1c, 0x09, 0x3b, 0xa0, 0x21, 0x0d, - 0x2e, 0x28, 0x97, 0x04, 0x45, 0x6b, 0x59, 0x80, 0x2d, 0x84, 0xb2, 0x16, 0x4d, 0x59, 0xbf, 0xa3, - 0xc9, 0x08, 0x97, 0xbd, 0x55, 0x9e, 0xba, 0xde, 0x7e, 0x34, 0x19, 0xb1, 0xfd, 0x8a, 0xc9, 0x91, - 0x19, 0x0d, 0xec, 0xe7, 0x2f, 0xf8, 0x1a, 0x2e, 0x72, 0xb9, 0x71, 0x44, 0x83, 0x67, 0x2f, 0x98, - 0x4a, 0x31, 0x0a, 0xb9, 0x20, 0x72, 0xae, 0x9a, 0x35, 0xbe, 0xc0, 0x2b, 0xa3, 0x90, 0x89, 0x20, - 0xe7, 0x8a, 0x2d, 0x42, 0xd6, 0x5a, 0x87, 0xcf, 0x02, 0x1d, 0xf3, 0xea, 0x43, 0x2e, 0x51, 0x1b, - 0xbc, 0xb1, 0x2d, 0x81, 0x60, 0xef, 0x09, 0x19, 0xd7, 0xcb, 0xc6, 0x9e, 0x4e, 0x9c, 0xb3, 0x90, - 0x8b, 0x94, 0x86, 0x55, 0x17, 0xc0, 0x3d, 0x06, 0x33, 0xbf, 0x80, 0x8d, 0xd4, 0xdc, 0x8a, 0x35, - 0xc3, 0x54, 0x08, 0x0e, 0xe1, 0xf3, 0x5a, 0xb1, 0xc4, 0x53, 0xd6, 0xa4, 0xe5, 0x33, 0x26, 0xcd, - 0xfc, 0xad, 0x1c, 0xd4, 0x45, 0xcd, 0x5c, 0xd9, 0x21, 0x0f, 0x80, 0xc8, 0x59, 0x8c, 0x2e, 0xdd, - 0xb1, 0x7d, 0x72, 0x15, 0xd1, 0x10, 0x99, 0x66, 0xff, 0x86, 0x65, 0x08, 0xdc, 0xf0, 0xd2, 0x1d, - 0xef, 0x30, 0x0c, 0xb9, 0x0f, 0x46, 0x82, 0x3e, 0x8c, 0x02, 0xe4, 0xe8, 0xfd, 0x1b, 0xd6, 0xb2, - 0x46, 0x3d, 0x88, 0x02, 0xb6, 0x46, 0x98, 0x2a, 0x35, 0x8f, 0x6c, 0xd7, 0x1b, 0xd3, 0x4b, 0xce, - 0x46, 0x0d, 0xab, 0x86, 0xb0, 0x2e, 0x03, 0xed, 0x2c, 0x43, 0x5d, 0xaf, 0xce, 0x3c, 0x83, 0x8a, - 0xd4, 0xc3, 0xb8, 0x22, 0x92, 0x6a, 0x92, 0x55, 0x8d, 0x54, 0x4b, 0x6e, 0x42, 0x25, 0xd9, 0x02, - 0xab, 0x1c, 0xbd, 0xf6, 0x8b, 0xcd, 0x1f, 0x80, 0x71, 0xc0, 0x98, 0xc7, 0x63, 0xcc, 0x2a, 0xf4, - 0xca, 0x4d, 0x58, 0xd2, 0x16, 0x4d, 0xd5, 0x12, 0x4f, 0x6c, 0xcf, 0x3d, 0xf7, 0xc3, 0x48, 0xbc, - 0x85, 0xff, 0x36, 0x7f, 0x2f, 0x07, 0xa4, 0x13, 0x46, 0xee, 0xd4, 0x89, 0xe8, 0x1e, 0x55, 0x62, - 0xa1, 0x0f, 0x75, 0x56, 0xdb, 0xd0, 0x6f, 0xa1, 0xa2, 0x87, 0x0a, 0xc5, 0xfb, 0x62, 0x19, 0x2f, - 0x16, 0x78, 0xa0, 0x53, 0xa3, 0x98, 0x4f, 0x54, 0xc0, 0x56, 0x59, 0xe4, 0x04, 0x67, 0x34, 0xe2, - 0xea, 0xa1, 0xd0, 0x6b, 0x00, 0x41, 0x4c, 0x31, 0xdc, 0xfe, 0x21, 0xac, 0x2e, 0xd4, 0xa1, 0xcb, - 0xe5, 0x6a, 0x86, 0x5c, 0x2e, 0xe8, 0x72, 0xd9, 0x86, 0xb5, 0x44, 0xbb, 0x04, 0xa7, 0x6d, 0x41, - 0x99, 0x2d, 0x08, 0xa6, 0x1c, 0xe4, 0x50, 0x5b, 0x3d, 0xa5, 0x94, 0xa9, 0xd7, 0x1f, 0xc0, 0xfa, - 0x29, 0xa5, 0x81, 0x13, 0x71, 0x24, 0x5f, 0x31, 0x6c, 0x86, 0x44, 0xc5, 0xab, 0x02, 0x37, 0x70, - 0xa2, 0x23, 0x1a, 0xb0, 0x99, 0x32, 0xff, 0x4f, 0x0e, 0x56, 0x98, 0x04, 0x3d, 0x74, 0xbc, 0x2b, - 0x39, 0x4e, 0x07, 0x99, 0xe3, 0x74, 0x4f, 0xdb, 0x0c, 0x35, 0xea, 0xaf, 0x3b, 0x48, 0x85, 0xf4, - 0x20, 0x91, 0xbb, 0x50, 0x4f, 0xb4, 0xb5, 0xc4, 0xdb, 0x0a, 0xa1, 0x6a, 0x64, 0xac, 0x91, 0x2e, - 0x69, 0x1a, 0xe9, 0x9f, 0x7c, 0x70, 0xdf, 0x05, 0x23, 0xee, 0x8c, 0x18, 0x59, 0x02, 0x45, 0xc6, - 0xa8, 0xa2, 0x02, 0xfe, 0xdb, 0xfc, 0xa7, 0x39, 0x24, 0x6c, 0xfb, 0x6e, 0xac, 0xf5, 0x12, 0x28, - 0x32, 0x2d, 0x5b, 0x12, 0xb2, 0xdf, 0xd7, 0xda, 0x10, 0xdf, 0xc0, 0x10, 0xdc, 0x84, 0x4a, 0xc8, - 0x54, 0x68, 0x67, 0x82, 0xa3, 0x50, 0xb1, 0xca, 0xec, 0xb9, 0x35, 0x99, 0xc4, 0xa3, 0x53, 0xd6, - 0xf5, 0xf5, 0xf7, 0x60, 0x55, 0x6b, 0xf3, 0x4b, 0x7a, 0xd7, 0x03, 0x72, 0xe0, 0x86, 0xd1, 0xb1, - 0x17, 0xce, 0x34, 0x25, 0xef, 0x16, 0x54, 0x99, 0x34, 0x66, 0xed, 0x0d, 0x85, 0x46, 0xcf, 0xc4, - 0x33, 0x6b, 0x6d, 0xc8, 0x91, 0xce, 0xa5, 0x40, 0xe6, 0x05, 0xd2, 0xb9, 0xe4, 0x48, 0xf3, 0x53, - 0x58, 0x4b, 0xd4, 0x27, 0x5e, 0xfd, 0x16, 0x94, 0xe6, 0xd1, 0xa5, 0x2f, 0xd5, 0xf8, 0x9a, 0xe0, - 0x26, 0x66, 0x84, 0x5a, 0x88, 0x31, 0x9f, 0xc0, 0x6a, 0x8f, 0xbe, 0x10, 0x0b, 0x5e, 0x36, 0xe4, - 0x5d, 0x28, 0xbe, 0xc2, 0x30, 0xe5, 0x78, 0xf3, 0x01, 0x10, 0xbd, 0xb0, 0x78, 0xab, 0x66, 0xa7, - 0xe6, 0x12, 0x76, 0xaa, 0xf9, 0x2e, 0x90, 0x81, 0x7b, 0xe6, 0x1d, 0xd2, 0x30, 0x74, 0xce, 0x94, - 0x88, 0x30, 0xa0, 0x30, 0x0d, 0xcf, 0x84, 0x3c, 0x63, 0x3f, 0xcd, 0xef, 0xc1, 0x5a, 0x82, 0x4e, - 0x54, 0xfc, 0x06, 0x54, 0x43, 0xf7, 0xcc, 0xe3, 0x4a, 0x98, 0xa8, 0x3a, 0x06, 0x98, 0x7b, 0xb0, - 0xfe, 0x39, 0x0d, 0xdc, 0xd3, 0xab, 0x57, 0x55, 0x9f, 0xac, 0x27, 0x9f, 0xae, 0xa7, 0x03, 0x1b, - 0xa9, 0x7a, 0xc4, 0xeb, 0x91, 0xa9, 0xc5, 0x4c, 0x56, 0x2c, 0x7c, 0xd0, 0x64, 0x64, 0x5e, 0x97, - 0x91, 0xe6, 0x31, 0x90, 0xb6, 0xef, 0x79, 0x74, 0x14, 0x1d, 0x51, 0x1a, 0xc8, 0xc6, 0xbc, 0xaf, - 0x71, 0x70, 0xed, 0xd1, 0x96, 0x18, 0xd9, 0xb4, 0xe0, 0x15, 0xac, 0x4d, 0xa0, 0x38, 0xa3, 0xc1, - 0x94, 0x57, 0x5c, 0xb1, 0xf8, 0x6f, 0x73, 0x03, 0xd6, 0x12, 0xd5, 0x62, 0xdb, 0xcc, 0x87, 0xb0, - 0xb1, 0xeb, 0x86, 0xa3, 0xc5, 0x17, 0x6e, 0x41, 0x79, 0x36, 0x3f, 0xb1, 0x93, 0x32, 0xfc, 0x19, - 0xbd, 0x32, 0x9b, 0xb0, 0x99, 0x2e, 0x21, 0xea, 0xfa, 0xb5, 0x1c, 0x14, 0xf7, 0x87, 0x07, 0x6d, - 0xb2, 0x0d, 0x15, 0xd7, 0x1b, 0xf9, 0x53, 0xa6, 0xa4, 0x61, 0x9f, 0xd5, 0xf3, 0xb5, 0xcb, 0xee, - 0x16, 0x54, 0xb9, 0x6e, 0xc7, 0xcc, 0x6b, 0xa1, 0x26, 0x55, 0x18, 0xe0, 0xc0, 0x1f, 0x3d, 0x67, - 0x76, 0x3d, 0xbd, 0x9c, 0xb9, 0x01, 0xb7, 0xdc, 0xa5, 0x65, 0x5a, 0x44, 0xbd, 0x20, 0x46, 0x08, - 0x03, 0xf5, 0xd7, 0xf2, 0x40, 0xc4, 0xce, 0xdc, 0xf6, 0xbd, 0x30, 0x0a, 0x1c, 0xd7, 0x8b, 0xc2, - 0xa4, 0xe6, 0x91, 0x4b, 0x69, 0x1e, 0xf7, 0xc0, 0xe0, 0xbb, 0xbd, 0xd0, 0x7a, 0xb8, 0xb0, 0xce, - 0xc7, 0x9a, 0x8f, 0x50, 0x7b, 0x98, 0xd0, 0x7e, 0x07, 0x96, 0x63, 0x85, 0x4b, 0xb9, 0x4d, 0x8a, - 0x56, 0x5d, 0x29, 0x5d, 0x42, 0xb4, 0xb3, 0x45, 0x27, 0x35, 0x09, 0x65, 0x1d, 0xa2, 0x6e, 0xb7, - 0x3a, 0x75, 0x2e, 0x8f, 0xa8, 0x54, 0xef, 0xb8, 0x9d, 0x68, 0x42, 0x43, 0x2a, 0x54, 0x48, 0x89, - 0x7a, 0x5e, 0x4d, 0x68, 0x55, 0x9c, 0x26, 0x5b, 0x3d, 0x5a, 0xca, 0x56, 0x8f, 0xcc, 0xff, 0x50, - 0x85, 0xb2, 0x18, 0x06, 0x54, 0x76, 0x22, 0xf7, 0x82, 0xc6, 0xca, 0x0e, 0x7b, 0x62, 0x2a, 0x54, - 0x40, 0xa7, 0x7e, 0xa4, 0x74, 0x5c, 0x64, 0xc5, 0x3a, 0x02, 0x85, 0x96, 0xab, 0xe9, 0x59, 0xe8, - 0xed, 0x29, 0x20, 0xd1, 0x48, 0xd7, 0x7e, 0x6e, 0x41, 0x59, 0xaa, 0x4b, 0x45, 0x65, 0x06, 0x2e, - 0x8d, 0x50, 0xc1, 0xdd, 0x86, 0xca, 0xc8, 0x99, 0x39, 0x23, 0x37, 0xba, 0x12, 0xd2, 0x52, 0x3d, - 0xb3, 0xda, 0x27, 0xfe, 0xc8, 0x99, 0xd8, 0x27, 0xce, 0xc4, 0xf1, 0x46, 0x54, 0xb8, 0x51, 0xea, - 0x1c, 0xb8, 0x83, 0x30, 0xf2, 0x2d, 0x58, 0x16, 0xed, 0x94, 0x54, 0xe8, 0x4d, 0x11, 0xad, 0x97, - 0x64, 0x4c, 0x1f, 0xf7, 0xa7, 0x6c, 0x5e, 0x4e, 0x29, 0x6a, 0xae, 0x05, 0xab, 0x8a, 0x90, 0x3d, - 0xca, 0x7b, 0x2b, 0xd0, 0x2f, 0x90, 0x83, 0xaa, 0xf8, 0x2a, 0x04, 0x7e, 0x81, 0xde, 0x8f, 0x45, - 0xf5, 0xb5, 0xa0, 0xa9, 0xaf, 0xef, 0xc3, 0xea, 0xdc, 0x0b, 0x69, 0x14, 0x4d, 0xe8, 0x58, 0xb5, - 0xa5, 0xc6, 0x89, 0x0c, 0x85, 0x90, 0xcd, 0x79, 0x00, 0x6b, 0xe8, 0xff, 0x09, 0x9d, 0xc8, 0x0f, - 0xcf, 0xdd, 0xd0, 0x0e, 0x99, 0x51, 0x89, 0x1e, 0x82, 0x55, 0x8e, 0x1a, 0x08, 0xcc, 0x00, 0xad, - 0xca, 0xad, 0x14, 0x7d, 0x40, 0x47, 0xd4, 0xbd, 0xa0, 0x63, 0xae, 0xda, 0x16, 0xac, 0x8d, 0x44, - 0x19, 0x4b, 0x20, 0xb9, 0x9d, 0x32, 0x9f, 0xda, 0xf3, 0xd9, 0xd8, 0x61, 0xfa, 0xdd, 0x32, 0xda, - 0x0f, 0xde, 0x7c, 0x7a, 0x8c, 0x10, 0xf2, 0x10, 0xa4, 0xf2, 0x2a, 0x78, 0x66, 0x25, 0x21, 0xd6, - 0xd9, 0x9a, 0xb5, 0xea, 0x82, 0x02, 0x75, 0xeb, 0x3b, 0xfa, 0x62, 0x31, 0x18, 0x87, 0x71, 0x3b, - 0x2b, 0x5e, 0x30, 0x4d, 0x28, 0xcf, 0x02, 0xf7, 0xc2, 0x89, 0x68, 0x73, 0x15, 0x77, 0x38, 0xf1, - 0xc8, 0x84, 0xa4, 0xeb, 0xb9, 0x91, 0xeb, 0x44, 0x7e, 0xd0, 0x24, 0x1c, 0x17, 0x03, 0xc8, 0x7d, - 0x58, 0xe5, 0x7c, 0x12, 0x46, 0x4e, 0x34, 0x0f, 0x85, 0xe2, 0xbe, 0xc6, 0x19, 0x8a, 0x9b, 0x1e, - 0x03, 0x0e, 0xe7, 0xba, 0x3b, 0xf9, 0x04, 0x36, 0x91, 0x35, 0x16, 0x96, 0xe6, 0x3a, 0x1b, 0x0e, - 0xde, 0xa2, 0x35, 0x4e, 0xd1, 0x4e, 0xae, 0xd1, 0xcf, 0x60, 0x4b, 0xb0, 0xcb, 0x42, 0xc9, 0x0d, - 0x55, 0x72, 0x1d, 0x49, 0x52, 0x45, 0x1f, 0xc0, 0x2a, 0x6b, 0x9a, 0x3b, 0xb2, 0x45, 0x0d, 0x6c, - 0x55, 0x6c, 0xb2, 0x5e, 0xf0, 0x42, 0x2b, 0x88, 0xb4, 0x38, 0xee, 0x19, 0xbd, 0x22, 0x3f, 0x80, - 0x15, 0x64, 0x1f, 0x6e, 0x9d, 0xf2, 0xcd, 0x6f, 0x9b, 0x6f, 0x7e, 0x1b, 0x62, 0x70, 0xdb, 0x0a, - 0xcb, 0xf7, 0xbf, 0xe5, 0x51, 0xe2, 0x99, 0x2d, 0x8d, 0x89, 0x7b, 0x4a, 0x23, 0x77, 0x4a, 0x9b, - 0x5b, 0xc8, 0x6c, 0xf2, 0x99, 0xad, 0xda, 0xf9, 0x8c, 0x63, 0x9a, 0x28, 0x2a, 0xf1, 0x89, 0xf3, - 0xf1, 0xc4, 0x0f, 0xa9, 0xf4, 0x1c, 0x36, 0x6f, 0x8a, 0x05, 0xc9, 0x80, 0x52, 0x05, 0x67, 0x76, - 0x0c, 0xda, 0x8c, 0xca, 0xbf, 0x7b, 0x8b, 0x33, 0x46, 0x03, 0x4d, 0x47, 0xe9, 0xe3, 0x65, 0xea, - 0xce, 0xb9, 0xf3, 0x42, 0x0a, 0xd5, 0x37, 0xb8, 0x34, 0x01, 0x06, 0x12, 0xee, 0xc0, 0x3d, 0x58, - 0x15, 0xb3, 0x10, 0x0b, 0xd3, 0xe6, 0x6d, 0xbe, 0x0d, 0xdd, 0x94, 0x7d, 0x5c, 0x90, 0xb6, 0x96, - 0x81, 0xf3, 0xa2, 0xc9, 0xdf, 0x7d, 0x20, 0x72, 0x52, 0xb4, 0x8a, 0xde, 0x7c, 0x55, 0x45, 0xab, - 0x62, 0x9a, 0x62, 0x90, 0xf9, 0x3b, 0x39, 0xd4, 0x5a, 0x04, 0x75, 0xa8, 0xd9, 0xeb, 0x28, 0xd7, - 0x6c, 0xdf, 0x9b, 0x5c, 0x09, 0x51, 0x07, 0x08, 0xea, 0x7b, 0x13, 0x2e, 0x6b, 0x5c, 0x4f, 0x27, - 0xc1, 0x0d, 0xb2, 0x2e, 0x81, 0x9c, 0xe8, 0x0e, 0xd4, 0x66, 0xf3, 0x93, 0x89, 0x3b, 0x42, 0x92, - 0x02, 0xd6, 0x82, 0x20, 0x4e, 0xf0, 0x16, 0xd4, 0x05, 0xaf, 0x23, 0x45, 0x91, 0x53, 0xd4, 0x04, - 0x8c, 0x93, 0xf0, 0x0d, 0x98, 0x06, 0x5c, 0xd8, 0xd5, 0x2d, 0xfe, 0xdb, 0xdc, 0x81, 0xf5, 0x64, - 0xa3, 0x85, 0x76, 0x70, 0x1f, 0x2a, 0x42, 0x92, 0x4a, 0x4f, 0xd6, 0x72, 0x72, 0x34, 0x2c, 0x85, - 0x37, 0xff, 0x63, 0x09, 0xd6, 0xe4, 0x18, 0xb1, 0xc9, 0x1e, 0xcc, 0xa7, 0x53, 0x27, 0xc8, 0x10, - 0xd1, 0xb9, 0x97, 0x8b, 0xe8, 0xfc, 0x82, 0x88, 0x4e, 0xba, 0x32, 0x50, 0xc2, 0x27, 0x5d, 0x19, - 0x8c, 0xbb, 0xd0, 0xba, 0xd4, 0x1d, 0xe6, 0x0d, 0x01, 0x1e, 0xa2, 0x63, 0x7e, 0x61, 0x43, 0x29, - 0x65, 0x6c, 0x28, 0xfa, 0x76, 0xb0, 0x94, 0xda, 0x0e, 0xde, 0x02, 0x64, 0x63, 0xc9, 0x8f, 0x65, - 0x34, 0x38, 0x39, 0x4c, 0x30, 0xe4, 0x7b, 0xb0, 0x92, 0x96, 0xc0, 0x28, 0xea, 0x97, 0x33, 0xe4, - 0xaf, 0x3b, 0xa5, 0x5c, 0xa5, 0xd0, 0x88, 0xab, 0x42, 0xfe, 0xba, 0x53, 0x7a, 0xc0, 0x31, 0x92, - 0xbe, 0x03, 0x80, 0xef, 0xe6, 0xcb, 0x18, 0xf8, 0x32, 0x7e, 0x37, 0xc5, 0x99, 0xda, 0xa8, 0x3f, - 0x60, 0x0f, 0xf3, 0x80, 0xf2, 0x75, 0x5d, 0xe5, 0x25, 0xf9, 0x92, 0xfe, 0x04, 0x96, 0xfd, 0x19, - 0xf5, 0xec, 0x58, 0x0a, 0xd6, 0x78, 0x55, 0x86, 0xa8, 0xaa, 0x2b, 0xe1, 0x56, 0x83, 0xd1, 0xa9, - 0x47, 0xf2, 0x19, 0x0e, 0x32, 0xd5, 0x4a, 0xd6, 0xaf, 0x29, 0xb9, 0xcc, 0x09, 0xe3, 0xa2, 0xdf, - 0x83, 0x5a, 0x40, 0x43, 0x7f, 0x32, 0x47, 0xef, 0x7b, 0x83, 0xf3, 0x91, 0x74, 0x47, 0x5a, 0x0a, - 0x63, 0xe9, 0x54, 0xe6, 0xaf, 0xe7, 0xa0, 0xa6, 0xf5, 0x81, 0x6c, 0xc0, 0x6a, 0xbb, 0xdf, 0x3f, - 0xea, 0x58, 0xad, 0x61, 0xf7, 0xf3, 0x8e, 0xdd, 0x3e, 0xe8, 0x0f, 0x3a, 0xc6, 0x0d, 0x06, 0x3e, - 0xe8, 0xb7, 0x5b, 0x07, 0xf6, 0x5e, 0xdf, 0x6a, 0x4b, 0x70, 0x8e, 0x6c, 0x02, 0xb1, 0x3a, 0x87, - 0xfd, 0x61, 0x27, 0x01, 0xcf, 0x13, 0x03, 0xea, 0x3b, 0x56, 0xa7, 0xd5, 0xde, 0x17, 0x90, 0x02, - 0x59, 0x07, 0x63, 0xef, 0xb8, 0xb7, 0xdb, 0xed, 0x3d, 0xb5, 0xdb, 0xad, 0x5e, 0xbb, 0x73, 0xd0, - 0xd9, 0x35, 0x8a, 0xa4, 0x01, 0xd5, 0xd6, 0x4e, 0xab, 0xb7, 0xdb, 0xef, 0x75, 0x76, 0x8d, 0x92, - 0xf9, 0xdf, 0x73, 0x00, 0x71, 0x43, 0x99, 0x5c, 0x8d, 0x9b, 0xaa, 0x47, 0xbb, 0x36, 0x16, 0x3a, - 0x85, 0x72, 0x35, 0x48, 0x3c, 0x93, 0x47, 0x50, 0xf6, 0xe7, 0xd1, 0xc8, 0x9f, 0xa2, 0xa2, 0xbe, - 0xfc, 0xa8, 0xb9, 0x50, 0xae, 0x8f, 0x78, 0x4b, 0x12, 0x26, 0x22, 0x5a, 0x85, 0x57, 0x45, 0xb4, - 0x92, 0xa1, 0x33, 0xd4, 0xeb, 0xb4, 0xd0, 0xd9, 0x6d, 0x80, 0xf0, 0x05, 0xa5, 0x33, 0xee, 0x8c, - 0x11, 0xab, 0xa0, 0xca, 0x21, 0x43, 0x66, 0xc7, 0xfd, 0x61, 0x0e, 0x36, 0x38, 0x2f, 0x8d, 0xd3, - 0x42, 0xec, 0x2e, 0xd4, 0x46, 0xbe, 0x3f, 0x63, 0xa6, 0x7f, 0xac, 0xaf, 0xe9, 0x20, 0x26, 0xa0, - 0x50, 0x20, 0x9f, 0xfa, 0xc1, 0x88, 0x0a, 0x19, 0x06, 0x1c, 0xb4, 0xc7, 0x20, 0x6c, 0x0d, 0x89, - 0x45, 0x88, 0x14, 0x28, 0xc2, 0x6a, 0x08, 0x43, 0x92, 0x4d, 0x58, 0x3a, 0x09, 0xa8, 0x33, 0x3a, - 0x17, 0xd2, 0x4b, 0x3c, 0x91, 0x6f, 0xc7, 0x4e, 0xa9, 0x11, 0x5b, 0x13, 0x13, 0x8a, 0x8d, 0xaf, - 0x58, 0x2b, 0x02, 0xde, 0x16, 0x60, 0xb6, 0xcf, 0x3b, 0x27, 0x8e, 0x37, 0xf6, 0x3d, 0x3a, 0x16, - 0x56, 0x6e, 0x0c, 0x30, 0x8f, 0x60, 0x33, 0xdd, 0x3f, 0x21, 0xef, 0x3e, 0xd6, 0xe4, 0x1d, 0x9a, - 0x97, 0xdb, 0xd7, 0xaf, 0x31, 0x4d, 0xf6, 0xfd, 0xe5, 0x22, 0x14, 0x99, 0xb9, 0x71, 0xad, 0x65, - 0xa2, 0xdb, 0x8f, 0x85, 0x85, 0x38, 0x27, 0xf7, 0x7d, 0xa1, 0x02, 0x26, 0x26, 0x8b, 0x43, 0xb8, - 0xe2, 0xa5, 0xd0, 0x01, 0x1d, 0x5d, 0x08, 0xcd, 0x1b, 0xd1, 0x16, 0x1d, 0x5d, 0x70, 0x73, 0xde, - 0x89, 0xb0, 0x2c, 0xca, 0xab, 0x72, 0xe8, 0x44, 0xbc, 0xa4, 0x40, 0xf1, 0x72, 0x65, 0x85, 0xe2, - 0xa5, 0x9a, 0x50, 0x76, 0xbd, 0x13, 0x7f, 0xee, 0x8d, 0xb9, 0x78, 0xaa, 0x58, 0xf2, 0x91, 0x87, - 0x55, 0xb9, 0x24, 0x65, 0x5b, 0x3b, 0x4a, 0xa3, 0x0a, 0x03, 0x0c, 0xd9, 0xe6, 0xfe, 0x21, 0x54, - 0xc3, 0x2b, 0x6f, 0xa4, 0xcb, 0xa0, 0x75, 0x31, 0x3e, 0xac, 0xf7, 0x0f, 0x06, 0x57, 0xde, 0x88, - 0x73, 0x7c, 0x25, 0x14, 0xbf, 0xc8, 0x63, 0xa8, 0xa8, 0x40, 0x04, 0xee, 0x20, 0x37, 0xf5, 0x12, - 0x32, 0xfa, 0x80, 0xfe, 0x1e, 0x45, 0x4a, 0x3e, 0x80, 0x25, 0x1e, 0x2d, 0x08, 0x9b, 0x75, 0x5e, - 0x48, 0x1a, 0x95, 0xac, 0x19, 0x3c, 0xa2, 0x49, 0xc7, 0x3c, 0x72, 0x60, 0x09, 0xb2, 0xed, 0x67, - 0xd0, 0x48, 0xd4, 0xa5, 0xfb, 0x6f, 0x1a, 0xe8, 0xbf, 0x79, 0x47, 0xf7, 0xdf, 0xc4, 0x3b, 0x99, - 0x28, 0xa6, 0xfb, 0x73, 0x7e, 0x08, 0x15, 0xd9, 0x15, 0x26, 0x32, 0x8e, 0x7b, 0xcf, 0x7a, 0xfd, - 0x2f, 0x7a, 0xf6, 0xe0, 0xcb, 0x5e, 0xdb, 0xb8, 0x41, 0x56, 0xa0, 0xd6, 0x6a, 0x73, 0x29, 0xc4, - 0x01, 0x39, 0x46, 0x72, 0xd4, 0x1a, 0x0c, 0x14, 0x24, 0x6f, 0xee, 0x81, 0x91, 0x6e, 0x29, 0xe3, - 0xc9, 0x48, 0xc2, 0x44, 0x2c, 0x25, 0x06, 0x30, 0x3b, 0x1c, 0xc3, 0x23, 0x68, 0xe5, 0xe0, 0x83, - 0xf9, 0x18, 0x0c, 0xb6, 0x2f, 0xb3, 0xa1, 0xd2, 0xa3, 0xa4, 0x13, 0xa6, 0x39, 0xeb, 0xf1, 0x94, - 0x8a, 0x55, 0x43, 0x18, 0x7f, 0x95, 0xf9, 0x31, 0xac, 0x6a, 0xc5, 0x62, 0xbf, 0x09, 0xdb, 0xeb, - 0xd3, 0x7e, 0x13, 0x6e, 0x25, 0x23, 0xc6, 0xdc, 0x82, 0x0d, 0xf6, 0xd8, 0xb9, 0xa0, 0x5e, 0x34, - 0x98, 0x9f, 0x60, 0x70, 0xdd, 0xf5, 0x3d, 0x66, 0x3d, 0x57, 0x15, 0xe6, 0x7a, 0x26, 0x7f, 0x20, - 0x5c, 0x2c, 0x28, 0xd5, 0xb6, 0xb5, 0x37, 0xf0, 0x82, 0x0f, 0xf8, 0xdf, 0x84, 0xab, 0xa5, 0xaa, - 0x40, 0x6c, 0x58, 0x8f, 0x3a, 0x1d, 0xcb, 0xee, 0xf7, 0x0e, 0xba, 0x3d, 0x26, 0xdb, 0xd9, 0xb0, - 0x72, 0xc0, 0xde, 0x1e, 0x87, 0xe4, 0x4c, 0x03, 0x96, 0x9f, 0xd2, 0xa8, 0xeb, 0x9d, 0xfa, 0x62, - 0x30, 0xcc, 0xbf, 0xb8, 0x04, 0x2b, 0x0a, 0x14, 0xbb, 0x6a, 0x2e, 0x68, 0x10, 0xba, 0xbe, 0xc7, - 0xcd, 0x8d, 0xaa, 0x25, 0x1f, 0x99, 0x74, 0x12, 0x46, 0x16, 0xd7, 0x12, 0xd6, 0x39, 0x56, 0x98, - 0x65, 0x5c, 0x45, 0x78, 0x0f, 0x56, 0xdc, 0x31, 0xf5, 0x22, 0x37, 0xba, 0xb2, 0x13, 0x4e, 0xe2, - 0x65, 0x09, 0x16, 0x6a, 0xc2, 0x3a, 0x94, 0x9c, 0x89, 0xeb, 0xc8, 0xa4, 0x05, 0x7c, 0x60, 0xd0, - 0x91, 0x3f, 0xf1, 0x03, 0x6e, 0x76, 0x54, 0x2d, 0x7c, 0x20, 0x0f, 0x61, 0x9d, 0x99, 0x40, 0xba, - 0xe7, 0x9e, 0x0b, 0x18, 0xf4, 0x57, 0x13, 0x6f, 0x3e, 0x3d, 0x8a, 0xbd, 0xf7, 0x0c, 0xc3, 0x94, - 0x03, 0x56, 0x42, 0x68, 0x83, 0xaa, 0x00, 0x3a, 0x15, 0x56, 0xbd, 0xf9, 0xb4, 0xc5, 0x31, 0x8a, - 0xfe, 0x11, 0x6c, 0x30, 0x7a, 0xa5, 0x3f, 0xaa, 0x12, 0x2b, 0xbc, 0x04, 0xab, 0xac, 0x2b, 0x70, - 0xaa, 0xcc, 0x2d, 0xa8, 0x62, 0xab, 0x18, 0x4b, 0x94, 0xd0, 0xe5, 0xc0, 0x9b, 0x42, 0x83, 0x70, - 0x21, 0xbf, 0x00, 0xed, 0xf8, 0x74, 0x7e, 0x81, 0x96, 0xa1, 0x50, 0x49, 0x67, 0x28, 0x3c, 0x82, - 0x8d, 0x13, 0xc6, 0xa3, 0xe7, 0xd4, 0x19, 0xd3, 0xc0, 0x8e, 0x39, 0x1f, 0xad, 0xc5, 0x35, 0x86, - 0xdc, 0xe7, 0x38, 0xb5, 0x50, 0x98, 0x22, 0xc7, 0xe4, 0x06, 0x1d, 0xdb, 0x91, 0x6f, 0x73, 0xfd, - 0x8e, 0x4b, 0xa0, 0x8a, 0xd5, 0x40, 0xf0, 0xd0, 0x6f, 0x33, 0x60, 0x92, 0xee, 0x2c, 0x70, 0x66, - 0xe7, 0xc2, 0x96, 0x53, 0x74, 0x4f, 0x19, 0x90, 0xbc, 0x01, 0x65, 0xb6, 0x26, 0x3c, 0x8a, 0xe1, - 0x5a, 0xb4, 0x92, 0x24, 0x88, 0xbc, 0x03, 0x4b, 0xfc, 0x1d, 0x61, 0xd3, 0xe0, 0x0b, 0xa2, 0x1e, - 0x4b, 0x7a, 0xd7, 0xb3, 0x04, 0x8e, 0x69, 0xcb, 0xf3, 0xc0, 0x45, 0x31, 0x54, 0xb5, 0xf8, 0x6f, - 0xf2, 0x23, 0x4d, 0xa6, 0xad, 0xf1, 0xb2, 0xef, 0x88, 0xb2, 0x29, 0x56, 0xbc, 0x4e, 0xbc, 0x7d, - 0xa3, 0xd2, 0xea, 0xc7, 0xc5, 0x4a, 0xcd, 0xa8, 0x9b, 0x4d, 0x9e, 0x56, 0x61, 0xd1, 0x91, 0x7f, - 0x41, 0x83, 0xab, 0xc4, 0x1a, 0xc9, 0xc1, 0xd6, 0x02, 0x2a, 0x8e, 0xce, 0x06, 0x02, 0x6e, 0x4f, - 0xfd, 0xb1, 0xdc, 0xd3, 0xeb, 0x12, 0x78, 0xe8, 0x8f, 0x99, 0xee, 0xb1, 0xaa, 0x88, 0x4e, 0x5d, - 0xcf, 0x0d, 0xcf, 0xe9, 0x58, 0x6c, 0xed, 0x86, 0x44, 0xec, 0x09, 0x38, 0x53, 0xa0, 0x67, 0x81, - 0x7f, 0xa6, 0x76, 0xba, 0x9c, 0xa5, 0x9e, 0xcd, 0x4f, 0xa0, 0x84, 0x33, 0xc8, 0x16, 0x0a, 0x9f, - 0xdf, 0x9c, 0x58, 0x28, 0x1c, 0xda, 0x84, 0xb2, 0x47, 0xa3, 0x17, 0x7e, 0xf0, 0x5c, 0x86, 0x7a, - 0xc4, 0xa3, 0xf9, 0x53, 0xee, 0x77, 0x54, 0xf9, 0x31, 0xe8, 0x3b, 0x60, 0x2c, 0x8c, 0x2c, 0x18, - 0x9e, 0x3b, 0xc2, 0x15, 0x5a, 0xe1, 0x80, 0xc1, 0xb9, 0xb3, 0xc0, 0xc2, 0xf9, 0xc5, 0x14, 0x99, - 0x77, 0x60, 0x59, 0x66, 0xe4, 0x84, 0xf6, 0x84, 0x9e, 0x46, 0x62, 0x49, 0xd6, 0x45, 0x3a, 0x4e, - 0x78, 0x40, 0x4f, 0x23, 0xf3, 0x10, 0x56, 0xc5, 0xa2, 0xe9, 0xcf, 0xa8, 0x7c, 0xf5, 0xa7, 0x59, - 0x46, 0x4d, 0xed, 0xd1, 0x5a, 0x52, 0x5b, 0x40, 0xbd, 0x2c, 0x61, 0xe9, 0x98, 0x3f, 0x89, 0x1d, - 0x80, 0x4c, 0x97, 0x10, 0xf5, 0x09, 0xd3, 0x42, 0x46, 0xc8, 0x64, 0xa0, 0x59, 0x19, 0x30, 0xee, - 0x98, 0x8d, 0x4e, 0x38, 0x1f, 0x8d, 0x64, 0xa6, 0x54, 0xc5, 0x92, 0x8f, 0xe6, 0xbf, 0xcb, 0xc1, - 0x1a, 0xaf, 0x4c, 0x1a, 0x65, 0x62, 0xa7, 0xf8, 0x99, 0x1b, 0xc9, 0xe6, 0x47, 0x57, 0xe0, 0xf0, - 0xe1, 0xeb, 0x47, 0x1f, 0x8a, 0x0b, 0xd1, 0x87, 0x6f, 0x83, 0x31, 0xa6, 0x13, 0x97, 0xb3, 0x92, - 0xd4, 0x87, 0x50, 0x01, 0x5d, 0x91, 0x70, 0xe1, 0x24, 0x30, 0xff, 0x7a, 0x0e, 0x56, 0x51, 0xdd, - 0xe2, 0x6e, 0x17, 0x31, 0x50, 0x4f, 0xa4, 0x7f, 0x41, 0x88, 0x53, 0xd1, 0xa7, 0x58, 0x0d, 0xe1, - 0x50, 0x24, 0xde, 0xbf, 0x21, 0xfc, 0x0e, 0x02, 0x4a, 0xbe, 0xcf, 0x0d, 0x49, 0xcf, 0xe6, 0x40, - 0xa1, 0x46, 0xdf, 0xcc, 0x50, 0xf0, 0x54, 0x71, 0x66, 0x65, 0x7a, 0x1c, 0xb4, 0x53, 0x81, 0x25, - 0x74, 0x62, 0x99, 0x7b, 0xd0, 0x48, 0xbc, 0x26, 0x11, 0x0c, 0xa9, 0x63, 0x30, 0x64, 0x21, 0x38, - 0x99, 0x5f, 0x0c, 0x4e, 0x5e, 0xc1, 0x9a, 0x45, 0x9d, 0xf1, 0xd5, 0x9e, 0x1f, 0x1c, 0x85, 0x27, - 0xd1, 0x1e, 0xea, 0xb0, 0x6c, 0x0f, 0x52, 0x11, 0xf7, 0x44, 0xc4, 0x41, 0x06, 0x5e, 0xa5, 0x17, - 0xe5, 0x5b, 0xb0, 0x1c, 0x87, 0xe6, 0x35, 0xaf, 0x75, 0x43, 0x45, 0xe7, 0xb9, 0xf3, 0x9a, 0xd9, - 0xfb, 0xe1, 0x49, 0x24, 0xfc, 0xd6, 0xfc, 0xb7, 0xf9, 0xbf, 0x8a, 0x40, 0x18, 0x37, 0xa7, 0x18, - 0x26, 0x95, 0x54, 0x90, 0x5f, 0x48, 0x2a, 0x78, 0x08, 0x44, 0x23, 0x90, 0xb9, 0x0e, 0x05, 0x95, - 0xeb, 0x60, 0xc4, 0xb4, 0x22, 0xd5, 0xe1, 0x21, 0xac, 0x0b, 0x83, 0x20, 0xd9, 0x54, 0x64, 0x0d, - 0x82, 0x96, 0x41, 0xa2, 0xbd, 0x32, 0xa1, 0x40, 0x3a, 0x9a, 0x0b, 0x98, 0x50, 0x20, 0xfd, 0x41, - 0x1a, 0x03, 0x2e, 0xbd, 0x92, 0x01, 0xcb, 0x0b, 0x0c, 0xa8, 0xf9, 0x06, 0x2b, 0x49, 0xdf, 0xe0, - 0x82, 0x97, 0x1b, 0xb5, 0xdf, 0x84, 0x97, 0xfb, 0x1e, 0x18, 0xd2, 0x4f, 0xa4, 0x3c, 0x90, 0x98, - 0x09, 0x24, 0x7c, 0xc0, 0x6d, 0xe9, 0x83, 0x4c, 0x84, 0xbd, 0x6a, 0xa9, 0xb0, 0xd7, 0xfb, 0xb0, - 0x1a, 0x32, 0xfe, 0xb5, 0xe7, 0x9e, 0x48, 0x07, 0xa4, 0x63, 0x6e, 0x4e, 0x57, 0x2c, 0x83, 0x23, - 0x8e, 0x63, 0xf8, 0xa2, 0x47, 0xad, 0x91, 0xe1, 0x51, 0x7b, 0x1c, 0x47, 0xd8, 0xc3, 0x73, 0x77, - 0xca, 0x15, 0x9f, 0x38, 0xc5, 0x4d, 0x0c, 0xf0, 0xe0, 0xdc, 0x9d, 0x5a, 0x32, 0x9d, 0x83, 0x3d, - 0x90, 0x36, 0xdc, 0x11, 0xfd, 0xc9, 0xc8, 0xc4, 0xc0, 0x51, 0x58, 0xe1, 0x9a, 0xea, 0x36, 0x92, - 0x1d, 0xa6, 0x92, 0x32, 0x52, 0x83, 0xc2, 0x2a, 0x41, 0x27, 0xae, 0xa1, 0x0f, 0xca, 0xa1, 0x73, - 0x89, 0x6e, 0xff, 0xff, 0x99, 0x03, 0x83, 0xb1, 0x5d, 0x62, 0x45, 0x7f, 0x06, 0x5c, 0xf6, 0xbc, - 0xe6, 0x82, 0xae, 0x31, 0x5a, 0xb9, 0x9e, 0x3f, 0x01, 0xbe, 0x40, 0x6d, 0x7f, 0x46, 0x3d, 0xb1, - 0x9c, 0x9b, 0xc9, 0xe5, 0x1c, 0x8b, 0xec, 0xfd, 0x1b, 0x68, 0xaf, 0x31, 0x08, 0xf9, 0x0c, 0xaa, - 0x6c, 0x1d, 0x70, 0xa6, 0x14, 0x09, 0xa2, 0xdb, 0xca, 0x06, 0x5f, 0x58, 0x92, 0xac, 0xe8, 0x4c, - 0x3c, 0x66, 0xe5, 0x60, 0x14, 0x33, 0x72, 0x30, 0x34, 0x79, 0xb1, 0x0f, 0xf0, 0x8c, 0x5e, 0x1d, - 0xf8, 0x23, 0xee, 0x0d, 0xb9, 0x0d, 0xc0, 0x96, 0xce, 0xa9, 0x33, 0x75, 0x85, 0x1f, 0xb0, 0x64, - 0x55, 0x9f, 0xd3, 0xab, 0x3d, 0x0e, 0x60, 0x7c, 0xc3, 0xd0, 0xb1, 0xd0, 0x28, 0x59, 0x95, 0xe7, - 0xf4, 0x0a, 0x25, 0x86, 0x0d, 0x8d, 0x67, 0xf4, 0x6a, 0x97, 0xa2, 0x62, 0xee, 0x07, 0x8c, 0x67, - 0x03, 0xe7, 0x05, 0xd3, 0xc4, 0x13, 0xf9, 0x13, 0xb5, 0xc0, 0x79, 0xf1, 0x8c, 0x5e, 0xc9, 0x5c, - 0x8e, 0x32, 0xc3, 0x4f, 0xfc, 0x91, 0x50, 0x25, 0xa4, 0xeb, 0x25, 0x6e, 0x94, 0xb5, 0xf4, 0x9c, - 0xff, 0x36, 0xff, 0x38, 0x07, 0x0d, 0xd6, 0x7e, 0xbe, 0x0b, 0x70, 0x0e, 0x11, 0x09, 0x85, 0xb9, - 0x38, 0xa1, 0xf0, 0x91, 0x10, 0xa2, 0xb8, 0xa5, 0xe4, 0xaf, 0xdf, 0x52, 0xf8, 0xdc, 0xe0, 0x7e, - 0xf2, 0x21, 0x54, 0x51, 0x0a, 0x30, 0xb1, 0x52, 0x48, 0x4c, 0x70, 0xa2, 0x43, 0x56, 0x85, 0x93, - 0x3d, 0xc3, 0xfc, 0x25, 0xcd, 0xcb, 0x8d, 0x43, 0x5c, 0x0d, 0x94, 0x6f, 0x3b, 0x63, 0x1a, 0x4a, - 0xd7, 0xe4, 0x2f, 0xe9, 0x2e, 0xe4, 0xa5, 0xb4, 0x0b, 0xd9, 0xf4, 0xa0, 0xc2, 0xa6, 0x9a, 0x77, - 0x36, 0xa3, 0xd2, 0x5c, 0x56, 0xa5, 0x4c, 0xf1, 0x70, 0xd8, 0x1e, 0xc4, 0xe4, 0x6a, 0x5e, 0x28, - 0x1e, 0x4e, 0x48, 0x59, 0x45, 0xac, 0xe1, 0x9e, 0x6f, 0x73, 0x9f, 0xac, 0xf0, 0x56, 0x56, 0xac, - 0xaa, 0xe7, 0x1f, 0x21, 0xc0, 0xfc, 0xf3, 0x39, 0xa8, 0x69, 0xeb, 0x91, 0x3b, 0xe9, 0xd5, 0x70, - 0xe2, 0xe2, 0x4d, 0xae, 0x80, 0xc4, 0x7c, 0xec, 0xdf, 0xb0, 0x1a, 0xa3, 0xc4, 0x04, 0x3d, 0x10, - 0xac, 0xcc, 0x4b, 0xe6, 0x13, 0x9e, 0x21, 0xd9, 0x2f, 0xc9, 0xbf, 0xec, 0xf7, 0xce, 0x12, 0x14, - 0x19, 0xa9, 0xf9, 0x04, 0x56, 0xb5, 0x66, 0xa0, 0xe7, 0xe4, 0x75, 0x07, 0xc0, 0xfc, 0x65, 0x55, - 0x98, 0xbd, 0x03, 0x23, 0xcb, 0x32, 0x55, 0x8c, 0x8e, 0x71, 0x5c, 0x44, 0x4a, 0x1a, 0x82, 0xf8, - 0xc8, 0xbc, 0x6e, 0xfa, 0xd2, 0xaf, 0xc0, 0x9a, 0x56, 0xfb, 0x9e, 0xeb, 0x39, 0x13, 0xf7, 0xa7, - 0x5c, 0xfd, 0x08, 0xdd, 0x33, 0x2f, 0x55, 0x3f, 0x82, 0xbe, 0x56, 0xfd, 0x7f, 0x23, 0x0f, 0xeb, - 0xe2, 0x05, 0x3c, 0xf9, 0xd7, 0x65, 0x3a, 0xe5, 0x61, 0x78, 0x46, 0x3e, 0x83, 0x06, 0x1b, 0x1b, - 0x3b, 0xa0, 0x67, 0x6e, 0x18, 0x51, 0x19, 0xd1, 0xce, 0x10, 0xa3, 0x4c, 0xb5, 0x60, 0xa4, 0x96, - 0xa0, 0x24, 0x4f, 0xa0, 0xc6, 0x8b, 0xa2, 0x67, 0x4a, 0x4c, 0x44, 0x73, 0xb1, 0x20, 0x0e, 0xf4, - 0xfe, 0x0d, 0x0b, 0xc2, 0x78, 0xd8, 0x9f, 0x40, 0x8d, 0xcf, 0xe1, 0x05, 0x1f, 0xc8, 0x94, 0x24, - 0x5b, 0x18, 0x68, 0x56, 0x78, 0x16, 0x0f, 0x7b, 0x0b, 0x1a, 0x28, 0xcb, 0xc4, 0x38, 0x89, 0xa4, - 0xc2, 0xed, 0xc5, 0xe2, 0x72, 0x24, 0x59, 0xe3, 0x67, 0xda, 0xf3, 0x4e, 0x15, 0xca, 0x51, 0xe0, - 0x9e, 0x9d, 0xd1, 0xc0, 0xdc, 0x54, 0x43, 0xc3, 0x84, 0x34, 0x1d, 0x44, 0x74, 0xc6, 0x8c, 0x05, - 0xf3, 0x5f, 0xe5, 0xa0, 0x26, 0xc4, 0xee, 0xcf, 0x1c, 0x46, 0xdf, 0x4e, 0xf9, 0x30, 0xab, 0x9a, - 0xcb, 0xf2, 0x3d, 0x58, 0x99, 0x32, 0xcb, 0x86, 0x59, 0xde, 0x89, 0x18, 0xfa, 0xb2, 0x04, 0x0b, - 0xa5, 0xfd, 0x01, 0xac, 0x71, 0x1d, 0x3e, 0xb4, 0x23, 0x77, 0x62, 0x4b, 0xa4, 0xc8, 0x80, 0x5f, - 0x45, 0xd4, 0xd0, 0x9d, 0x1c, 0x0a, 0x04, 0x53, 0x65, 0xc3, 0xc8, 0x39, 0xa3, 0x62, 0xe9, 0xe3, - 0x03, 0xb3, 0x96, 0x52, 0x46, 0xb7, 0xb4, 0x96, 0xfe, 0xef, 0x2a, 0x6c, 0x2d, 0xa0, 0x84, 0xb5, - 0xa4, 0x82, 0xa6, 0x13, 0x77, 0x7a, 0xe2, 0x2b, 0xa7, 0x7d, 0x4e, 0x0b, 0x9a, 0x1e, 0x30, 0x8c, - 0x74, 0xda, 0x53, 0xd8, 0x90, 0x0c, 0xc9, 0xbd, 0xee, 0xca, 0x2e, 0xcf, 0x73, 0xab, 0xf1, 0xc3, - 0xe4, 0x1e, 0x97, 0x7e, 0x9d, 0x84, 0xeb, 0x8a, 0xda, 0xda, 0x6c, 0x01, 0x16, 0x92, 0x3f, 0x03, - 0x4d, 0xc5, 0xf7, 0xc2, 0x88, 0xd0, 0x9c, 0x0c, 0xec, 0x4d, 0xdf, 0x79, 0xc5, 0x9b, 0x12, 0xee, - 0x50, 0xae, 0xc9, 0x6d, 0xca, 0x25, 0x83, 0x15, 0xaa, 0x77, 0x5d, 0xc0, 0x9b, 0xf2, 0x5d, 0xdc, - 0x28, 0x58, 0x7c, 0x63, 0xf1, 0xb5, 0xfa, 0xc6, 0x5d, 0xbd, 0x89, 0xd7, 0x5a, 0xb7, 0x44, 0xc5, - 0x0a, 0xa5, 0xbf, 0xf7, 0x1c, 0x36, 0x5f, 0x38, 0x6e, 0x24, 0xfb, 0xa8, 0xf9, 0x38, 0x4a, 0xfc, - 0x7d, 0x8f, 0x5e, 0xf1, 0xbe, 0x2f, 0xb0, 0x70, 0xc2, 0x4c, 0x5a, 0x7f, 0xb1, 0x08, 0x0c, 0xb7, - 0xff, 0x5e, 0x01, 0x96, 0x93, 0xb5, 0x30, 0xc1, 0x22, 0xf6, 0x22, 0xa9, 0xfd, 0x0a, 0x95, 0x5c, - 0x04, 0x94, 0x7a, 0xa8, 0xf5, 0x2e, 0x86, 0xba, 0xf2, 0x19, 0xa1, 0x2e, 0x3d, 0xc2, 0x54, 0x78, - 0x55, 0xc2, 0x41, 0xf1, 0xb5, 0x12, 0x0e, 0x4a, 0x59, 0x09, 0x07, 0xdf, 0xbb, 0x36, 0x42, 0x8d, - 0x7e, 0xe2, 0xcc, 0xe8, 0xf4, 0xe3, 0xeb, 0xa3, 0xd3, 0xa8, 0x4b, 0x5f, 0x17, 0x99, 0xd6, 0xe2, - 0xea, 0x95, 0x6b, 0xe2, 0x42, 0x5a, 0xa4, 0x3d, 0x23, 0x32, 0x5d, 0xfd, 0x1a, 0x91, 0xe9, 0xed, - 0x3f, 0xce, 0x01, 0x59, 0x5c, 0x1d, 0xe4, 0x29, 0x46, 0x11, 0x3d, 0x3a, 0x11, 0x92, 0xfb, 0xbb, - 0xaf, 0xb7, 0xc2, 0x24, 0x43, 0xc8, 0xd2, 0xe4, 0x03, 0x58, 0xd3, 0xcf, 0xe9, 0xe8, 0x3e, 0x84, - 0x86, 0x45, 0x74, 0x54, 0xec, 0x0d, 0xd3, 0xb2, 0x3b, 0x8a, 0xaf, 0xcc, 0xee, 0x28, 0xbd, 0x32, - 0xbb, 0x63, 0x29, 0x99, 0xdd, 0xb1, 0xfd, 0x6f, 0x73, 0xb0, 0x96, 0xc1, 0xc4, 0xdf, 0x5c, 0x9f, - 0x19, 0xef, 0x25, 0xc4, 0x5a, 0x5e, 0xf0, 0x9e, 0x2e, 0xd1, 0x0e, 0xa4, 0x07, 0x95, 0x4d, 0x45, - 0x28, 0x76, 0xaa, 0xfb, 0xaf, 0x92, 0x2e, 0x71, 0x09, 0x4b, 0x2f, 0xbe, 0xfd, 0x0f, 0xf2, 0x50, - 0xd3, 0x90, 0x6c, 0x14, 0x91, 0x65, 0xb5, 0xdc, 0x42, 0x54, 0x1c, 0xb9, 0x07, 0xe4, 0x0e, 0x88, - 0x38, 0x11, 0xe2, 0x71, 0x71, 0x09, 0x2d, 0x91, 0x13, 0x3c, 0x80, 0x35, 0x19, 0xe1, 0xa5, 0x71, - 0xba, 0xb1, 0xd8, 0x6b, 0x44, 0xb0, 0x5e, 0x34, 0x92, 0xd3, 0x7f, 0x20, 0x8d, 0xd3, 0x78, 0xee, - 0xb4, 0x88, 0xd9, 0xaa, 0x48, 0x13, 0x10, 0x93, 0xc8, 0xf8, 0xfc, 0x43, 0xd8, 0x50, 0x79, 0x02, - 0x89, 0x12, 0x18, 0x97, 0x21, 0x32, 0x1f, 0x40, 0x2b, 0xf2, 0x23, 0xb8, 0x9d, 0x6a, 0x53, 0xaa, - 0x28, 0xe6, 0xc5, 0xdf, 0x4c, 0xb4, 0x4e, 0xaf, 0x61, 0xfb, 0xcf, 0x42, 0x23, 0x21, 0x28, 0xbf, - 0xb9, 0x29, 0x4f, 0x7b, 0x9d, 0x70, 0x44, 0x75, 0xaf, 0xd3, 0xf6, 0xff, 0x28, 0x00, 0x59, 0x94, - 0xd5, 0x3f, 0xcf, 0x26, 0x2c, 0x32, 0x66, 0x21, 0x83, 0x31, 0xff, 0xbf, 0xe9, 0x0f, 0xb1, 0xf3, - 0x53, 0x0b, 0xd3, 0xe3, 0xe2, 0x34, 0x14, 0x42, 0xb6, 0xe2, 0x93, 0x74, 0x32, 0x53, 0x25, 0x71, - 0xd4, 0x4c, 0x53, 0xa0, 0x52, 0x39, 0x4d, 0xc7, 0xb0, 0xe4, 0x78, 0xa3, 0x73, 0x3f, 0x10, 0x72, - 0xf0, 0x17, 0xbe, 0xf6, 0xf6, 0xf9, 0xa0, 0xc5, 0xcb, 0x73, 0xad, 0xcd, 0x12, 0x95, 0x99, 0x1f, - 0x42, 0x4d, 0x03, 0x93, 0x2a, 0x94, 0x0e, 0xba, 0x87, 0x3b, 0x7d, 0xe3, 0x06, 0x69, 0x40, 0xd5, - 0xea, 0xb4, 0xfb, 0x9f, 0x77, 0xac, 0xce, 0xae, 0x91, 0x23, 0x15, 0x28, 0x1e, 0xf4, 0x07, 0x43, - 0x23, 0x6f, 0x6e, 0x43, 0x53, 0xd4, 0xb8, 0x18, 0x06, 0xfa, 0xcd, 0xa2, 0x72, 0x5e, 0x72, 0xa4, - 0xb0, 0xe0, 0xbf, 0x07, 0x75, 0x5d, 0xbd, 0x11, 0x1c, 0x91, 0xca, 0x14, 0x61, 0xb6, 0xbb, 0xaf, - 0xc9, 0xea, 0x36, 0x60, 0x9e, 0xc0, 0x58, 0x15, 0xcb, 0x27, 0xf4, 0xd6, 0x8c, 0x80, 0x2b, 0x37, - 0x7e, 0x12, 0x6c, 0xf8, 0xa7, 0x60, 0x39, 0x19, 0xf2, 0x10, 0x12, 0x29, 0xcb, 0x1e, 0x65, 0xa5, - 0x13, 0x31, 0x10, 0xf2, 0x23, 0x30, 0xd2, 0x21, 0x13, 0xa1, 0x3c, 0x5f, 0x53, 0x7e, 0xc5, 0x4d, - 0x46, 0x51, 0xc8, 0x3e, 0xac, 0x67, 0x29, 0x78, 0x9c, 0x3f, 0xae, 0xf7, 0x61, 0x90, 0x45, 0x25, - 0x8e, 0x7c, 0x2a, 0x42, 0x67, 0x25, 0x3e, 0xfd, 0xef, 0x24, 0xdf, 0xaf, 0x0d, 0xf6, 0x03, 0xfc, - 0xa7, 0x05, 0xd1, 0x2e, 0x00, 0x62, 0x18, 0x31, 0xa0, 0xde, 0x3f, 0xea, 0xf4, 0xec, 0xf6, 0x7e, - 0xab, 0xd7, 0xeb, 0x1c, 0x18, 0x37, 0x08, 0x81, 0x65, 0x9e, 0xec, 0xb0, 0xab, 0x60, 0x39, 0x06, - 0x13, 0x21, 0x4c, 0x09, 0xcb, 0x93, 0x75, 0x30, 0xba, 0xbd, 0x14, 0xb4, 0x40, 0x9a, 0xb0, 0x7e, - 0xd4, 0xc1, 0xfc, 0x88, 0x44, 0xbd, 0x45, 0x66, 0x34, 0x88, 0xee, 0x32, 0xa3, 0xe1, 0x0b, 0x67, - 0x32, 0xa1, 0x91, 0x58, 0x07, 0x52, 0x97, 0xfe, 0x9b, 0x39, 0xd8, 0x48, 0x21, 0xe2, 0xb8, 0x03, - 0x6a, 0xd2, 0x49, 0x1d, 0xba, 0xce, 0x81, 0x72, 0x35, 0xbd, 0x0f, 0xab, 0xca, 0x0d, 0x96, 0xda, - 0x95, 0x0c, 0x85, 0x90, 0xc4, 0x1f, 0xc0, 0x9a, 0xe6, 0x4d, 0x4b, 0xc9, 0x0a, 0xa2, 0xa1, 0x44, - 0x01, 0x73, 0x4b, 0x9d, 0xbe, 0x49, 0xb5, 0x7a, 0x0c, 0x9b, 0x69, 0x44, 0x1c, 0x59, 0x4c, 0xb6, - 0x57, 0x3e, 0x92, 0x87, 0x29, 0x46, 0x48, 0xb6, 0x56, 0x9f, 0x70, 0xf9, 0xfa, 0xdf, 0x5e, 0x02, - 0xf2, 0x93, 0x39, 0x0d, 0xae, 0xf8, 0xa9, 0xaf, 0xf0, 0x55, 0xa9, 0xcd, 0xd2, 0x11, 0x93, 0x7f, - 0xad, 0x93, 0x9d, 0x59, 0x27, 0x2b, 0x8b, 0xaf, 0x3e, 0x59, 0x59, 0x7a, 0xd5, 0xc9, 0xca, 0xb7, - 0xa1, 0xe1, 0x9e, 0x79, 0x3e, 0x13, 0x85, 0x4c, 0x13, 0x0e, 0x9b, 0x4b, 0x77, 0x0b, 0xf7, 0xea, - 0x56, 0x5d, 0x00, 0x99, 0x1e, 0x1c, 0x92, 0x27, 0x31, 0x11, 0x1d, 0x9f, 0xf1, 0xd3, 0xc5, 0xba, - 0x10, 0xec, 0x8c, 0xcf, 0xa8, 0xf0, 0x3b, 0x71, 0x4b, 0x43, 0x16, 0x66, 0xf0, 0x90, 0xbc, 0x03, - 0xcb, 0xa1, 0x3f, 0x67, 0x86, 0x85, 0x1c, 0x06, 0x0c, 0x2d, 0xd6, 0x11, 0x7a, 0x24, 0x03, 0xcd, - 0x6b, 0xf3, 0x90, 0xda, 0x53, 0x37, 0x0c, 0x99, 0x7a, 0x36, 0xf2, 0xbd, 0x28, 0xf0, 0x27, 0x22, - 0x5a, 0xb8, 0x3a, 0x0f, 0xe9, 0x21, 0x62, 0xda, 0x88, 0x20, 0x1f, 0xc5, 0x4d, 0x9a, 0x39, 0x6e, - 0x10, 0x36, 0x81, 0x37, 0x49, 0xf6, 0x94, 0xeb, 0xef, 0x8e, 0x1b, 0xa8, 0xb6, 0xb0, 0x87, 0x30, - 0x75, 0xe2, 0xb3, 0x96, 0x3e, 0xf1, 0xf9, 0xab, 0xd9, 0x27, 0x3e, 0x31, 0xbf, 0xe9, 0xa1, 0xa8, - 0x7a, 0x71, 0x8a, 0xbf, 0xd6, 0xc1, 0xcf, 0xc5, 0x83, 0xac, 0xcb, 0x5f, 0xe7, 0x20, 0xeb, 0x4a, - 0xd6, 0x41, 0xd6, 0x0f, 0xa1, 0xc6, 0x8f, 0x18, 0xda, 0xe7, 0x3c, 0xcb, 0x11, 0xa3, 0x9f, 0x86, - 0x7e, 0x06, 0x71, 0xdf, 0xf5, 0x22, 0x0b, 0x02, 0xf9, 0x33, 0x5c, 0x3c, 0x53, 0xba, 0xfa, 0x73, - 0x3c, 0x53, 0x2a, 0x8e, 0x42, 0x3e, 0x80, 0x8a, 0x9c, 0x27, 0x42, 0xa0, 0x78, 0x1a, 0xf8, 0x53, - 0x19, 0x71, 0x61, 0xbf, 0xc9, 0x32, 0xe4, 0x23, 0x5f, 0x14, 0xce, 0x47, 0xbe, 0xf9, 0xa7, 0xa1, - 0xa6, 0xb1, 0x1a, 0x79, 0x0b, 0xdd, 0x96, 0xcc, 0x36, 0x13, 0xba, 0x25, 0x8e, 0x62, 0x55, 0x40, - 0xbb, 0x63, 0x26, 0x6f, 0xc6, 0x6e, 0x40, 0xf9, 0xe9, 0x6f, 0x3b, 0xa0, 0x17, 0x34, 0x08, 0x65, - 0x04, 0xcc, 0x50, 0x08, 0x0b, 0xe1, 0xe6, 0xaf, 0xc0, 0x5a, 0x62, 0x6e, 0x85, 0x88, 0x78, 0x07, - 0x96, 0xf8, 0xb8, 0xc9, 0x34, 0x8b, 0xe4, 0xd9, 0x4e, 0x81, 0xe3, 0x27, 0xdd, 0x31, 0x78, 0x67, - 0xcf, 0x02, 0xff, 0x84, 0xbf, 0x24, 0x67, 0xd5, 0x04, 0xec, 0x28, 0xf0, 0x4f, 0xcc, 0x3f, 0x28, - 0x40, 0x61, 0xdf, 0x9f, 0xe9, 0x99, 0x91, 0xb9, 0x85, 0xcc, 0x48, 0x61, 0x70, 0xda, 0xca, 0xa0, - 0x14, 0x3a, 0x3b, 0x0f, 0x5b, 0x49, 0xa3, 0xf2, 0x1e, 0x2c, 0x33, 0x39, 0x11, 0xf9, 0xcc, 0x62, - 0x7f, 0xe1, 0x04, 0xa8, 0x10, 0x63, 0xa2, 0x71, 0xdd, 0x99, 0x46, 0x43, 0x7f, 0x0f, 0xe1, 0x64, - 0x1d, 0x0a, 0xca, 0x7c, 0xe1, 0x68, 0xf6, 0x48, 0x36, 0x61, 0x89, 0x9f, 0x63, 0xb8, 0x12, 0x69, - 0x02, 0xe2, 0x89, 0x7c, 0x17, 0xd6, 0x92, 0xf5, 0xa2, 0x28, 0x12, 0xba, 0x91, 0x5e, 0x31, 0x97, - 0x49, 0x37, 0x81, 0xc9, 0x11, 0xa4, 0x11, 0xe9, 0x48, 0xa7, 0x94, 0x72, 0x94, 0x26, 0xf4, 0x2a, - 0x09, 0xa1, 0x77, 0x07, 0x6a, 0xd1, 0xe4, 0xc2, 0x9e, 0x39, 0x57, 0x13, 0xdf, 0x19, 0x8b, 0xf5, - 0x0d, 0xd1, 0xe4, 0xe2, 0x08, 0x21, 0xe4, 0x03, 0x80, 0xe9, 0x6c, 0x26, 0xd6, 0x1e, 0x0f, 0xc5, - 0xc4, 0xac, 0x7c, 0x78, 0x74, 0x84, 0x2c, 0x67, 0x55, 0xa7, 0xb3, 0x19, 0xfe, 0x24, 0xbb, 0xb0, - 0x9c, 0x79, 0x42, 0xfb, 0xb6, 0xcc, 0x37, 0xf7, 0x67, 0x0f, 0x32, 0x16, 0x67, 0x63, 0xa4, 0xc3, - 0xb6, 0x7f, 0x04, 0xe4, 0x4f, 0x78, 0x4e, 0x7a, 0x08, 0x55, 0xd5, 0x3e, 0xfd, 0x98, 0x31, 0x3f, - 0x48, 0x53, 0x4b, 0x1c, 0x33, 0x6e, 0x8d, 0xc7, 0x01, 0x93, 0x8b, 0xb8, 0x61, 0x2a, 0x91, 0x0f, - 0xda, 0x8e, 0x29, 0x4e, 0x6a, 0x98, 0xff, 0x25, 0x07, 0x25, 0x3c, 0xf3, 0xfc, 0x2e, 0xac, 0x20, - 0xbd, 0xca, 0x32, 0x15, 0xc9, 0x05, 0xb8, 0xef, 0x0e, 0x45, 0x82, 0x29, 0x5b, 0x16, 0xda, 0x3d, - 0x10, 0x79, 0x35, 0xf3, 0xda, 0x5d, 0x10, 0x77, 0xa0, 0xaa, 0x5e, 0xad, 0xb1, 0x4e, 0x45, 0xbe, - 0x99, 0xbc, 0x09, 0xc5, 0x73, 0x7f, 0x26, 0x3d, 0x3f, 0x10, 0x8f, 0xa4, 0xc5, 0xe1, 0x71, 0x5b, - 0xd8, 0x3b, 0xe2, 0x13, 0x24, 0x05, 0xd1, 0x16, 0xf6, 0x12, 0xce, 0x06, 0x8b, 0x7d, 0x5c, 0xca, - 0xe8, 0xe3, 0x31, 0xac, 0x30, 0x39, 0xa0, 0x65, 0x38, 0x5c, 0xbf, 0x69, 0x7e, 0x9b, 0x69, 0x78, - 0xa3, 0xc9, 0x7c, 0x4c, 0x75, 0xdf, 0x1b, 0x4f, 0x19, 0x14, 0x70, 0xa9, 0x59, 0x9b, 0xbf, 0x9d, - 0x43, 0xf9, 0xc2, 0xea, 0x25, 0xf7, 0xa0, 0xe8, 0xc9, 0x6c, 0x88, 0x58, 0x8f, 0x53, 0x27, 0x9a, - 0x18, 0x9d, 0xc5, 0x29, 0xd8, 0xd4, 0xf1, 0x1c, 0x02, 0xbd, 0xf6, 0x86, 0x55, 0xf3, 0xe6, 0x53, - 0xe5, 0xba, 0xfa, 0x96, 0xec, 0x56, 0xca, 0xed, 0x83, 0xbd, 0x57, 0xcb, 0xf4, 0x81, 0x96, 0x7b, - 0x58, 0x4c, 0xec, 0x98, 0x52, 0x0b, 0x1c, 0x9f, 0x51, 0x2d, 0xe7, 0xf0, 0x77, 0xf3, 0xd0, 0x48, - 0xb4, 0x88, 0x27, 0x5f, 0xb2, 0x0d, 0x00, 0xe3, 0x4e, 0x62, 0xbe, 0x81, 0x81, 0x84, 0xa2, 0xae, - 0x8d, 0x53, 0x3e, 0x31, 0x4e, 0x2a, 0x9d, 0xa9, 0xa0, 0xa7, 0x33, 0x3d, 0x84, 0x6a, 0x7c, 0xff, - 0x47, 0xb2, 0x49, 0xec, 0x7d, 0xf2, 0x5c, 0x57, 0x4c, 0x14, 0x27, 0x40, 0x95, 0xf4, 0x04, 0xa8, - 0x1f, 0x68, 0xf9, 0x32, 0x4b, 0xbc, 0x1a, 0x33, 0x6b, 0x44, 0x7f, 0x2e, 0xd9, 0x32, 0xe6, 0x13, - 0xa8, 0x69, 0x8d, 0xd7, 0x73, 0x4e, 0x72, 0x89, 0x9c, 0x13, 0x75, 0x2e, 0x33, 0x1f, 0x9f, 0xcb, - 0x34, 0xff, 0x42, 0x1e, 0x1a, 0x6c, 0x7d, 0xb9, 0xde, 0xd9, 0x91, 0x3f, 0x71, 0x47, 0x3c, 0x0e, - 0xa5, 0x56, 0x98, 0x50, 0xb4, 0xe4, 0x3a, 0x13, 0x4b, 0x0c, 0xf5, 0x2c, 0xfd, 0x50, 0x3a, 0x0a, - 0x69, 0x75, 0x28, 0xdd, 0x84, 0x06, 0x13, 0x8c, 0x3c, 0xa2, 0x14, 0xdf, 0x22, 0x62, 0xd5, 0x4e, - 0x29, 0xdd, 0x71, 0x42, 0x94, 0x90, 0xdf, 0x85, 0x35, 0x46, 0xc3, 0xcf, 0xe3, 0x4e, 0xdd, 0xc9, - 0xc4, 0x8d, 0x8f, 0x6c, 0x15, 0x2c, 0xe3, 0x94, 0x52, 0xcb, 0x89, 0xe8, 0x21, 0x43, 0x88, 0x4b, - 0x47, 0x2a, 0x63, 0x37, 0x74, 0x4e, 0xe2, 0x14, 0x59, 0xf5, 0xcc, 0xe3, 0xdc, 0x22, 0x4e, 0x1b, - 0x2f, 0xb2, 0xa2, 0x55, 0x9b, 0x62, 0x94, 0x96, 0x97, 0x4f, 0x71, 0x52, 0x39, 0xcd, 0x49, 0xe6, - 0xbf, 0xc8, 0x43, 0x4d, 0x63, 0xcb, 0xd7, 0xd9, 0x5d, 0x6f, 0x2f, 0xc4, 0x0d, 0xab, 0x7a, 0x88, - 0xf0, 0xed, 0xe4, 0x2b, 0x0b, 0xea, 0x5c, 0x8f, 0xce, 0xc0, 0xb7, 0xa0, 0xca, 0x56, 0xdd, 0x87, - 0xdc, 0x05, 0x2b, 0x2e, 0xfd, 0xe1, 0x80, 0xa3, 0xf9, 0x89, 0x44, 0x3e, 0xe2, 0xc8, 0x52, 0x8c, - 0x7c, 0xc4, 0x90, 0x2f, 0xcb, 0xeb, 0xff, 0x04, 0xea, 0xa2, 0x56, 0x3e, 0xa7, 0xbc, 0xbb, 0xf1, - 0xaa, 0x4f, 0xcc, 0xb7, 0x55, 0xc3, 0xd7, 0xe1, 0xe4, 0x8b, 0x82, 0x8f, 0x64, 0xc1, 0xca, 0xab, - 0x0a, 0x3e, 0xc2, 0x07, 0x73, 0x4f, 0x1d, 0x95, 0xe0, 0x99, 0x6a, 0x52, 0x8e, 0x7d, 0x00, 0x6b, - 0x52, 0x5c, 0xcd, 0x3d, 0xc7, 0xf3, 0xfc, 0xb9, 0x37, 0xa2, 0xf2, 0x68, 0x26, 0x11, 0xa8, 0xe3, - 0x18, 0x63, 0x8e, 0xd5, 0x39, 0x7f, 0xcc, 0x78, 0xbb, 0x0f, 0x25, 0xd4, 0xcb, 0x51, 0xf9, 0xc8, - 0x16, 0x5c, 0x48, 0x42, 0xee, 0x41, 0x09, 0xd5, 0xf3, 0xfc, 0xb5, 0xc2, 0x06, 0x09, 0xcc, 0x16, - 0x10, 0x56, 0xf0, 0x90, 0x46, 0x81, 0x3b, 0x0a, 0xe3, 0x53, 0x9f, 0x25, 0x66, 0x7f, 0xe2, 0xbb, - 0x62, 0xcf, 0x6d, 0x4c, 0xc9, 0x6d, 0x54, 0xa4, 0x61, 0x1b, 0xd3, 0x5a, 0xa2, 0x0e, 0xa1, 0x2e, - 0x4d, 0x60, 0xf3, 0x84, 0x46, 0x2f, 0x28, 0xf5, 0x3c, 0xa6, 0x0c, 0x8d, 0xa8, 0x17, 0x05, 0xce, - 0x84, 0x4d, 0x12, 0xf6, 0xe0, 0xf1, 0x42, 0xad, 0xb1, 0x0f, 0x64, 0x27, 0x2e, 0xd8, 0x56, 0xe5, - 0x50, 0x76, 0x6c, 0x9c, 0x64, 0xe1, 0xb6, 0x7f, 0x19, 0xb6, 0xaf, 0x2f, 0x94, 0x71, 0xe2, 0xfb, - 0x5e, 0x52, 0xaa, 0xa8, 0x38, 0xe0, 0xc4, 0x77, 0x22, 0x6c, 0x8d, 0x2e, 0x59, 0x7a, 0x50, 0xd3, - 0x30, 0xf1, 0xde, 0x9f, 0xe3, 0xca, 0x1d, 0x3e, 0xb0, 0x1d, 0xc9, 0xf3, 0x83, 0x29, 0x8f, 0xbb, - 0x8d, 0xed, 0xb8, 0xf6, 0x9c, 0xb5, 0x12, 0xc3, 0x79, 0x8e, 0x85, 0xf9, 0x00, 0x56, 0xb8, 0x66, - 0xaf, 0x6d, 0x74, 0x2f, 0x53, 0x06, 0xcd, 0x75, 0x20, 0x3d, 0x94, 0x5d, 0x7a, 0xf6, 0xdf, 0xbf, - 0x2f, 0x40, 0x4d, 0x03, 0xb3, 0xdd, 0x88, 0xa7, 0x4c, 0xda, 0x63, 0xd7, 0x99, 0x52, 0x19, 0xe4, - 0x6c, 0x58, 0x0d, 0x0e, 0xdd, 0x15, 0x40, 0xb6, 0x17, 0x3b, 0x17, 0x67, 0xb6, 0x3f, 0x8f, 0xec, - 0x31, 0x3d, 0x0b, 0xa8, 0x6c, 0x65, 0xdd, 0xb9, 0x38, 0xeb, 0xcf, 0xa3, 0x5d, 0x0e, 0x63, 0x54, - 0x4c, 0x96, 0x68, 0x54, 0x22, 0x83, 0x6e, 0xea, 0x5c, 0xc6, 0x54, 0x22, 0xd5, 0x14, 0x39, 0xb3, - 0xa8, 0x52, 0x4d, 0xd1, 0x5a, 0x4c, 0x6f, 0xa0, 0xa5, 0xc5, 0x0d, 0xf4, 0x23, 0xd8, 0xc4, 0x0d, - 0x54, 0x88, 0x66, 0x3b, 0xb5, 0x92, 0xd7, 0x39, 0x56, 0x74, 0x52, 0x53, 0x7b, 0x0d, 0xd6, 0x03, - 0x29, 0x96, 0x42, 0xf7, 0xa7, 0x28, 0xc8, 0x72, 0x16, 0xeb, 0x99, 0xa8, 0x7c, 0xe0, 0xfe, 0x94, - 0x32, 0x4a, 0x9e, 0xab, 0xa3, 0x53, 0x8a, 0x53, 0x3b, 0x53, 0xd7, 0x4b, 0x53, 0x3a, 0x97, 0x49, - 0xca, 0xaa, 0xa0, 0x74, 0x2e, 0x75, 0xca, 0xc7, 0xb0, 0x35, 0xa5, 0x63, 0xd7, 0x49, 0x56, 0x6b, - 0xc7, 0x8a, 0xdb, 0x3a, 0xa2, 0xb5, 0x32, 0x03, 0x34, 0xdc, 0xd9, 0x68, 0xfc, 0xd4, 0x9f, 0x9e, - 0xb8, 0xa8, 0xb3, 0x60, 0xf6, 0x50, 0xd1, 0x5a, 0xf6, 0xe6, 0xd3, 0x5f, 0xe2, 0x60, 0x56, 0x24, - 0x34, 0x1b, 0x50, 0x1b, 0x44, 0xfe, 0x4c, 0x4e, 0xf3, 0x32, 0xd4, 0xf1, 0x51, 0x9c, 0x77, 0xbe, - 0x05, 0x37, 0xb9, 0x48, 0x18, 0xfa, 0x33, 0x7f, 0xe2, 0x9f, 0x5d, 0x25, 0xfc, 0x78, 0xff, 0x3a, - 0x07, 0x6b, 0x09, 0xac, 0x10, 0xaf, 0x1f, 0xa1, 0x3c, 0x53, 0xa7, 0x35, 0x73, 0x89, 0xa3, 0x3a, - 0x6c, 0xbe, 0x90, 0x10, 0x85, 0x99, 0x3c, 0xc1, 0xd9, 0x8a, 0x2f, 0x66, 0x91, 0x05, 0x51, 0xa4, - 0x34, 0x17, 0x45, 0x8a, 0x28, 0x2f, 0xaf, 0x6c, 0x91, 0x55, 0xfc, 0x82, 0x38, 0x59, 0x35, 0x16, - 0x5d, 0x2e, 0x24, 0xcf, 0x5e, 0xe8, 0x3e, 0x3f, 0xd9, 0x82, 0xd8, 0x11, 0x18, 0x9a, 0x7f, 0x3f, - 0x07, 0x10, 0xb7, 0x8e, 0x9f, 0xfe, 0x50, 0x7a, 0x4b, 0x8e, 0x27, 0xee, 0x6a, 0x3a, 0xca, 0x5b, - 0x50, 0x57, 0x39, 0xde, 0xb1, 0x26, 0x54, 0x93, 0x30, 0xa6, 0x0e, 0xbd, 0x07, 0x2b, 0x67, 0x13, - 0xff, 0x84, 0x6b, 0xac, 0x42, 0x6f, 0xc1, 0xec, 0xb9, 0x65, 0x04, 0x4b, 0x6d, 0x24, 0xd6, 0x9b, - 0x8a, 0x99, 0x69, 0xe0, 0xba, 0x16, 0x64, 0xfe, 0xd5, 0xbc, 0x4a, 0x24, 0x8d, 0x47, 0xe2, 0xe5, - 0xe6, 0xdd, 0xcf, 0x92, 0x6a, 0xf3, 0xb2, 0xf0, 0xe2, 0x13, 0x58, 0x0e, 0x70, 0x53, 0x92, 0x3b, - 0x56, 0xf1, 0x25, 0x3b, 0x56, 0x23, 0x48, 0x68, 0x3a, 0xdf, 0x06, 0xc3, 0x19, 0x5f, 0xd0, 0x20, - 0x72, 0xb9, 0xb7, 0x9e, 0xeb, 0xc7, 0x22, 0x75, 0x53, 0x83, 0x73, 0x45, 0xf4, 0x3d, 0x58, 0x11, - 0x67, 0xf0, 0x15, 0xa5, 0xb8, 0x01, 0x2c, 0x06, 0x33, 0x42, 0xf3, 0x1f, 0xcb, 0xcc, 0xd5, 0xe4, - 0xec, 0xbe, 0x7c, 0x54, 0xf4, 0x1e, 0xe6, 0x17, 0x03, 0xa8, 0x82, 0x91, 0x44, 0x10, 0x40, 0xc8, - 0x23, 0x04, 0x8a, 0x10, 0x40, 0x72, 0x58, 0x8b, 0xaf, 0x33, 0xac, 0xe6, 0xbf, 0xc9, 0x41, 0x79, - 0xdf, 0x9f, 0xed, 0xbb, 0x78, 0xfe, 0x81, 0x2f, 0x13, 0x15, 0xa3, 0x5a, 0x62, 0x8f, 0x3c, 0x2f, - 0xe8, 0x25, 0xa7, 0x18, 0x33, 0xd5, 0xbc, 0x46, 0x52, 0xcd, 0xfb, 0x01, 0xdc, 0xe2, 0x21, 0xc0, - 0xc0, 0x9f, 0xf9, 0x01, 0x5b, 0xaa, 0xce, 0x04, 0xd5, 0x3d, 0xdf, 0x8b, 0xce, 0xa5, 0xec, 0xbc, - 0x79, 0x4a, 0xe9, 0x91, 0x46, 0x71, 0xa8, 0x08, 0xf8, 0x09, 0xe6, 0x49, 0x74, 0x61, 0xa3, 0x85, - 0x2e, 0xf4, 0x51, 0x94, 0xa8, 0x2b, 0x0c, 0xd1, 0xe1, 0x70, 0xae, 0x91, 0x9a, 0x9f, 0x42, 0x55, - 0x39, 0x7b, 0xc8, 0xfb, 0x50, 0x3d, 0xf7, 0x67, 0xc2, 0x23, 0x94, 0x4b, 0x9c, 0xf4, 0x14, 0xbd, - 0xb6, 0x2a, 0xe7, 0xf8, 0x23, 0x34, 0xff, 0xa0, 0x0c, 0xe5, 0xae, 0x77, 0xe1, 0xbb, 0x23, 0x9e, - 0xfb, 0x3a, 0xa5, 0x53, 0x5f, 0x5e, 0x04, 0xc2, 0x7e, 0xf3, 0xd4, 0xad, 0xf8, 0x1e, 0xaf, 0x82, - 0x48, 0xdd, 0x52, 0x37, 0x78, 0x6d, 0xc0, 0x52, 0xa0, 0x5f, 0xc4, 0x55, 0x0a, 0xf8, 0x89, 0x01, - 0xb5, 0x5f, 0x96, 0xb4, 0xeb, 0x55, 0x58, 0x5d, 0x98, 0x96, 0xc8, 0x87, 0x0c, 0x4f, 0x21, 0x57, - 0x39, 0x84, 0x0f, 0xd8, 0x1b, 0x50, 0x16, 0x07, 0x2b, 0xf1, 0x98, 0x17, 0xa6, 0xf8, 0x0b, 0x10, - 0xe7, 0x86, 0x80, 0x62, 0x08, 0x57, 0x29, 0xb2, 0x05, 0xab, 0x2e, 0x81, 0xbb, 0x8c, 0xd7, 0xee, - 0x40, 0x0d, 0xe9, 0x91, 0xa4, 0x22, 0x52, 0x46, 0x39, 0x88, 0x13, 0x64, 0xdc, 0x67, 0x57, 0xcd, - 0xbc, 0xcf, 0x8e, 0x27, 0x37, 0x2b, 0x29, 0x8b, 0x5d, 0x04, 0xbc, 0xc5, 0x4c, 0x83, 0xcb, 0x4b, - 0x22, 0x85, 0x4f, 0x05, 0x0f, 0xe8, 0x4b, 0x9f, 0xca, 0xdb, 0xd0, 0x38, 0x75, 0x26, 0x93, 0x13, - 0x67, 0xf4, 0x1c, 0x5d, 0x01, 0x75, 0xf4, 0x7e, 0x4a, 0x20, 0xf7, 0x05, 0xdc, 0x81, 0x9a, 0x36, - 0xcb, 0x3c, 0x1f, 0xb4, 0x68, 0x41, 0x3c, 0xbf, 0x69, 0x0f, 0xdf, 0xf2, 0x6b, 0x78, 0xf8, 0xb4, - 0xbc, 0xd8, 0x95, 0x64, 0x5e, 0xec, 0x2d, 0x2e, 0x4d, 0x45, 0x46, 0xa2, 0x81, 0x57, 0x66, 0x39, - 0xe3, 0x31, 0xcf, 0x48, 0xe4, 0x8e, 0x2c, 0x1c, 0x3c, 0xc4, 0xaf, 0xa2, 0x2d, 0x81, 0x30, 0x24, - 0xb9, 0x8d, 0x6e, 0xea, 0x99, 0xe3, 0x8e, 0xf9, 0x31, 0x0d, 0xf4, 0x1e, 0x94, 0x9d, 0x69, 0x74, - 0xe4, 0xb8, 0x63, 0x72, 0x17, 0xea, 0x12, 0xcd, 0x77, 0xc7, 0x35, 0x1c, 0x7f, 0x81, 0x1e, 0xe0, - 0xf5, 0x13, 0x8a, 0x62, 0xaa, 0x4e, 0xd8, 0x5b, 0x35, 0x41, 0xc2, 0xf9, 0xe0, 0x43, 0x9e, 0xe5, - 0x13, 0x51, 0x7e, 0x86, 0x7e, 0xf9, 0xd1, 0x2d, 0x95, 0x7c, 0xc0, 0xb9, 0x54, 0xfe, 0xc7, 0xe0, - 0x18, 0x52, 0x32, 0xe5, 0x0e, 0x63, 0x74, 0x9b, 0x09, 0xfd, 0x57, 0x90, 0xf2, 0x18, 0x1d, 0x12, - 0x90, 0x4f, 0x35, 0xfb, 0xb5, 0xc9, 0x89, 0xdf, 0x48, 0xd5, 0x7f, 0xdd, 0x31, 0xb6, 0xdb, 0x00, - 0x6e, 0xc8, 0x76, 0x99, 0x90, 0x7a, 0x63, 0x7e, 0x14, 0xbe, 0x62, 0x55, 0xdd, 0xf0, 0x19, 0x02, - 0xbe, 0x59, 0xc3, 0xb6, 0x05, 0x75, 0xbd, 0x9b, 0xa4, 0x02, 0xc5, 0xfe, 0x51, 0xa7, 0x67, 0xdc, - 0x20, 0x35, 0x28, 0x0f, 0x3a, 0xc3, 0xe1, 0x01, 0x8f, 0xf4, 0xd5, 0xa1, 0xa2, 0x0e, 0xba, 0xe6, - 0xd9, 0x53, 0xab, 0xdd, 0xee, 0x1c, 0x0d, 0x3b, 0xbb, 0x46, 0xe1, 0xc7, 0xc5, 0x4a, 0xde, 0x28, - 0x98, 0x7f, 0x58, 0x80, 0x9a, 0x36, 0x0a, 0x2f, 0x17, 0xc6, 0xb7, 0x01, 0xb8, 0x25, 0x19, 0x27, - 0xac, 0x16, 0xad, 0x2a, 0x83, 0xe0, 0xe4, 0xeb, 0x31, 0x0a, 0xbc, 0x8b, 0x44, 0xc5, 0x28, 0xde, - 0x86, 0x06, 0xde, 0x16, 0xa2, 0xc7, 0x6b, 0x4b, 0x56, 0x1d, 0x81, 0x42, 0x54, 0xf3, 0x63, 0xf3, - 0x9c, 0x88, 0x1f, 0x48, 0x14, 0xd7, 0x19, 0x21, 0x88, 0x1f, 0x49, 0xe4, 0xe7, 0x49, 0x43, 0x7f, - 0x72, 0x41, 0x91, 0x02, 0x35, 0xc2, 0x9a, 0x80, 0x0d, 0xc5, 0x95, 0x04, 0x42, 0x1e, 0x6a, 0xe7, - 0xb6, 0x4b, 0x56, 0x1d, 0x81, 0xe2, 0x45, 0xdf, 0x95, 0x0c, 0x84, 0xd9, 0x2b, 0x5b, 0x8b, 0xdc, - 0x90, 0x60, 0x9e, 0x83, 0x05, 0x37, 0x62, 0x95, 0x33, 0xc6, 0xb7, 0x16, 0xcb, 0xbd, 0xda, 0x9d, - 0x48, 0xde, 0x07, 0x32, 0x9d, 0xcd, 0xec, 0x0c, 0x07, 0x5f, 0xd1, 0x5a, 0x99, 0xce, 0x66, 0x43, - 0xcd, 0xff, 0xf5, 0x0d, 0xf8, 0x1e, 0xbf, 0x02, 0xd2, 0x62, 0x0b, 0x98, 0x37, 0x51, 0x99, 0x62, - 0xb1, 0x58, 0xce, 0xe9, 0x62, 0x39, 0x43, 0xfa, 0xe5, 0x33, 0xa5, 0xdf, 0xcb, 0xe4, 0x84, 0xb9, - 0x07, 0xb5, 0x23, 0xed, 0xd2, 0xc4, 0xbb, 0x6c, 0x87, 0x90, 0xd7, 0x25, 0xe2, 0xde, 0x81, 0x3e, - 0xc5, 0x40, 0xdc, 0x92, 0xa8, 0xb5, 0x26, 0xaf, 0xb5, 0xc6, 0xfc, 0xbb, 0x39, 0xbc, 0x64, 0x4a, - 0x35, 0x3e, 0xbe, 0xa7, 0x51, 0x86, 0xdf, 0xe2, 0xeb, 0x15, 0x6a, 0x32, 0xec, 0x26, 0x6e, 0x46, - 0xe0, 0x4d, 0xb3, 0xfd, 0xd3, 0xd3, 0x90, 0xca, 0x1c, 0x8f, 0x1a, 0x87, 0xf5, 0x39, 0x48, 0x2a, - 0xdf, 0x4c, 0xc3, 0x77, 0xb1, 0xfe, 0x50, 0x24, 0x76, 0x30, 0xe5, 0xfb, 0xd0, 0xb9, 0x14, 0x6f, - 0x0d, 0x99, 0x0a, 0x22, 0xe2, 0x03, 0xf2, 0x78, 0xb1, 0x7a, 0x36, 0xff, 0x96, 0xb8, 0x01, 0x22, - 0x3d, 0xbe, 0xf7, 0xa1, 0xa2, 0x6a, 0x4d, 0xee, 0xb0, 0x92, 0x52, 0xe1, 0xd9, 0x3e, 0xce, 0x9d, - 0x21, 0x89, 0x16, 0xe3, 0xe2, 0xe2, 0x31, 0x9e, 0xae, 0xd6, 0xea, 0xef, 0x00, 0x39, 0x75, 0x83, - 0x34, 0x31, 0x2e, 0x36, 0x83, 0x63, 0x34, 0x6a, 0xf3, 0x18, 0xd6, 0xa4, 0x94, 0xd0, 0x2c, 0x82, - 0xe4, 0xe4, 0xe5, 0x5e, 0x21, 0xe4, 0xf3, 0x0b, 0x42, 0xde, 0xfc, 0xf5, 0x12, 0x94, 0xe5, 0x05, - 0xa4, 0x59, 0x97, 0x66, 0x56, 0x93, 0x97, 0x66, 0x36, 0x13, 0x57, 0xa9, 0xf1, 0xa9, 0x17, 0xfb, - 0xfd, 0x7b, 0xe9, 0x2d, 0x5b, 0x8b, 0x55, 0x24, 0xb6, 0x6d, 0x11, 0xab, 0x28, 0x25, 0x63, 0x15, - 0x59, 0x17, 0x89, 0xa2, 0xea, 0xb9, 0x70, 0x91, 0xe8, 0x2d, 0x40, 0x3d, 0x42, 0x4b, 0x6e, 0xab, - 0x70, 0x80, 0x38, 0x22, 0xaf, 0xa9, 0x1d, 0x95, 0xb4, 0xda, 0xf1, 0xda, 0x2a, 0xc1, 0x47, 0xb0, - 0x84, 0xb7, 0xc9, 0x88, 0xe3, 0xd2, 0x72, 0xe3, 0x10, 0x63, 0x25, 0xff, 0xe3, 0x81, 0x08, 0x4b, - 0xd0, 0xea, 0xb7, 0xf2, 0xd5, 0x12, 0xb7, 0xf2, 0xe9, 0x31, 0x94, 0x7a, 0x32, 0x86, 0x72, 0x0f, - 0x0c, 0x35, 0x70, 0xdc, 0x23, 0xe9, 0x85, 0xe2, 0xac, 0xe5, 0xb2, 0x84, 0x33, 0x69, 0xd8, 0x0b, - 0xe3, 0x8d, 0x6f, 0x39, 0xb1, 0xf1, 0x31, 0x59, 0xd5, 0x8a, 0x22, 0x3a, 0x9d, 0x45, 0x72, 0xe3, - 0xd3, 0xee, 0x6e, 0xc5, 0x99, 0xc7, 0xc3, 0x20, 0x72, 0x7a, 0x91, 0x3b, 0x76, 0x60, 0xf9, 0xd4, - 0x71, 0x27, 0xf3, 0x80, 0xda, 0x01, 0x75, 0x42, 0xdf, 0xe3, 0x8b, 0x3f, 0xde, 0x83, 0x45, 0x17, - 0xf7, 0x90, 0xc6, 0xe2, 0x24, 0x56, 0xe3, 0x54, 0x7f, 0xe4, 0x47, 0xaa, 0xf4, 0x91, 0x60, 0x5b, - 0x96, 0x38, 0x75, 0x8d, 0xb9, 0x2a, 0xdd, 0x9e, 0xbd, 0x77, 0xd0, 0x7d, 0xba, 0x3f, 0x34, 0x72, - 0xec, 0x71, 0x70, 0xdc, 0x6e, 0x77, 0x3a, 0xbb, 0x7c, 0x0b, 0x03, 0x58, 0xda, 0x6b, 0x75, 0x0f, - 0xc4, 0x06, 0x56, 0x34, 0x4a, 0xe6, 0x3f, 0xcf, 0x43, 0x4d, 0xeb, 0x0d, 0x79, 0xac, 0x26, 0x01, - 0xaf, 0x69, 0xb8, 0xbd, 0xd8, 0xe3, 0x07, 0x52, 0xc2, 0x6b, 0xb3, 0xa0, 0x6e, 0x69, 0xcd, 0x5f, - 0x7b, 0x4b, 0x2b, 0x79, 0x17, 0x56, 0x1c, 0xac, 0x41, 0x0d, 0xba, 0x70, 0xee, 0x0b, 0xb0, 0x18, - 0xf3, 0x77, 0xc5, 0x95, 0x11, 0x62, 0x9b, 0x62, 0x74, 0x45, 0x99, 0xb4, 0xa9, 0x76, 0x2a, 0x3e, - 0x37, 0x65, 0x31, 0x32, 0x22, 0x18, 0xaf, 0x36, 0x7c, 0x31, 0x5e, 0x12, 0x8d, 0xe7, 0x2c, 0x35, - 0x0e, 0xaf, 0x5b, 0xea, 0xd9, 0xfc, 0x18, 0x20, 0xee, 0x4f, 0x72, 0xf8, 0x6e, 0x24, 0x87, 0x2f, - 0xa7, 0x0d, 0x5f, 0xde, 0xfc, 0x47, 0x42, 0x74, 0x89, 0xb9, 0x50, 0xae, 0xbe, 0xef, 0x82, 0x74, - 0x3e, 0xda, 0x3c, 0xc9, 0x7b, 0x36, 0xa1, 0x91, 0x3c, 0x2a, 0xba, 0x2a, 0x30, 0x5d, 0x85, 0x58, - 0x10, 0xb5, 0xf9, 0x45, 0x51, 0xfb, 0x16, 0xd4, 0xf9, 0x1d, 0x64, 0xe2, 0x45, 0x42, 0x5c, 0xd5, - 0xa6, 0xce, 0xa5, 0x7c, 0x77, 0x42, 0xc6, 0x16, 0x53, 0x32, 0xf6, 0x6f, 0xe7, 0xf0, 0xc2, 0x9a, - 0xb8, 0xa1, 0xb1, 0x90, 0x55, 0x75, 0x26, 0x85, 0xac, 0x20, 0xb5, 0x14, 0xfe, 0x1a, 0xc1, 0x99, - 0xcf, 0x16, 0x9c, 0xd9, 0x22, 0xb9, 0x90, 0x29, 0x92, 0xcd, 0x6d, 0x68, 0xee, 0x52, 0x36, 0x14, - 0xad, 0xc9, 0x24, 0x35, 0x96, 0xe6, 0x2d, 0xb8, 0x99, 0x81, 0x13, 0x5e, 0x9b, 0xdf, 0xc8, 0xc1, - 0x46, 0x0b, 0xef, 0xa9, 0xf8, 0xc6, 0xce, 0x72, 0x7e, 0x06, 0x37, 0x55, 0xc6, 0xb6, 0x76, 0x44, - 0x4c, 0xbf, 0x64, 0x48, 0x26, 0x7b, 0x6b, 0xe7, 0x14, 0xd8, 0x9e, 0x69, 0x36, 0x61, 0x33, 0xdd, - 0x1a, 0xd1, 0xd0, 0x3d, 0x58, 0xdd, 0xa5, 0x27, 0xf3, 0xb3, 0x03, 0x7a, 0x11, 0xb7, 0x91, 0x40, - 0x31, 0x3c, 0xf7, 0x5f, 0x08, 0xc6, 0xe0, 0xbf, 0x79, 0x4a, 0x27, 0xa3, 0xb1, 0xc3, 0x19, 0x1d, - 0x49, 0xaf, 0x3f, 0x87, 0x0c, 0x66, 0x74, 0x64, 0x3e, 0x06, 0xa2, 0xd7, 0x23, 0x66, 0x91, 0x99, - 0x64, 0xf3, 0x13, 0x3b, 0xbc, 0x0a, 0x23, 0x3a, 0x95, 0xc7, 0x1f, 0x21, 0x9c, 0x9f, 0x0c, 0x10, - 0x62, 0xbe, 0x07, 0xf5, 0x23, 0xe7, 0xca, 0xa2, 0x5f, 0x89, 0x53, 0x86, 0x5b, 0x50, 0x9e, 0x39, - 0x57, 0x4c, 0x16, 0xab, 0x00, 0x20, 0x47, 0x9b, 0xff, 0xa4, 0x08, 0x4b, 0x48, 0x49, 0xee, 0xe2, - 0xfd, 0xe9, 0xae, 0xc7, 0x65, 0xa1, 0xdc, 0x95, 0x34, 0xd0, 0xc2, 0xc6, 0x95, 0x5f, 0xdc, 0xb8, - 0x84, 0xb7, 0x52, 0x5e, 0x82, 0x26, 0x43, 0x35, 0xde, 0x7c, 0x2a, 0x6f, 0x3e, 0x4b, 0xde, 0xf3, - 0x50, 0x8c, 0xef, 0xdd, 0xc7, 0x33, 0xee, 0xc9, 0x60, 0x7a, 0x6c, 0xf8, 0x61, 0xeb, 0xe4, 0x7e, - 0x2c, 0xf6, 0x2c, 0x1d, 0x94, 0x69, 0x5d, 0x96, 0xe5, 0xd1, 0xd9, 0xa4, 0x75, 0xb9, 0x60, 0x45, - 0x56, 0x5e, 0x6d, 0x45, 0xa2, 0x1b, 0xf3, 0x25, 0x56, 0x24, 0xbc, 0x86, 0x15, 0xf9, 0x1a, 0x81, - 0xec, 0x9b, 0x50, 0xe1, 0x4a, 0x96, 0xb6, 0x85, 0x31, 0xe5, 0x8a, 0x6d, 0x61, 0x9f, 0x68, 0x76, - 0x16, 0x66, 0xd1, 0x68, 0x7b, 0x88, 0x45, 0xbf, 0xfa, 0xf9, 0x04, 0x08, 0xbf, 0x84, 0xb2, 0x80, - 0x32, 0x86, 0xf6, 0x9c, 0xa9, 0xbc, 0x4e, 0x93, 0xff, 0x66, 0xc3, 0xc6, 0x2f, 0xbf, 0xfb, 0x6a, - 0xee, 0x06, 0x74, 0x2c, 0xaf, 0xe0, 0x72, 0xf9, 0xfa, 0x66, 0x10, 0xd6, 0x41, 0x66, 0xf3, 0x79, - 0xfe, 0x0b, 0x4f, 0xc8, 0xad, 0xb2, 0x1b, 0x3e, 0x63, 0x8f, 0x26, 0x01, 0x83, 0x5f, 0xbe, 0x3b, - 0xf3, 0x03, 0xa9, 0x21, 0x98, 0xbf, 0x93, 0x03, 0x43, 0xac, 0x2e, 0x85, 0xd3, 0x4d, 0xae, 0xd2, - 0x75, 0x49, 0x1f, 0x2f, 0xbf, 0x50, 0xcb, 0x84, 0x06, 0xf7, 0x34, 0x29, 0x75, 0x01, 0x3d, 0x65, - 0x35, 0x06, 0xdc, 0x13, 0x2a, 0xc3, 0x9b, 0x50, 0x93, 0x09, 0xe7, 0x53, 0x77, 0x22, 0x3f, 0xb1, - 0x81, 0x19, 0xe7, 0x87, 0xee, 0x44, 0x6a, 0x1b, 0x81, 0x23, 0x8e, 0x72, 0xe7, 0xb8, 0xb6, 0x61, - 0x39, 0x11, 0x35, 0xff, 0x59, 0x0e, 0x56, 0xb5, 0xae, 0x88, 0x75, 0xfb, 0x7d, 0xa8, 0xab, 0x5b, - 0xaf, 0xa9, 0x52, 0x73, 0xb7, 0x92, 0x32, 0x2a, 0x2e, 0x56, 0x1b, 0x29, 0x48, 0xc8, 0x1a, 0x33, - 0x76, 0xae, 0x30, 0x2b, 0x7a, 0x3e, 0x95, 0x96, 0xe4, 0xd8, 0xb9, 0xda, 0xa3, 0x74, 0x30, 0x9f, - 0x92, 0xbb, 0x50, 0x7f, 0x41, 0xe9, 0x73, 0x45, 0x80, 0xa2, 0x17, 0x18, 0x4c, 0x50, 0x98, 0xd0, - 0x98, 0xfa, 0x5e, 0x74, 0xae, 0x48, 0x84, 0x8a, 0xcf, 0x81, 0x48, 0x63, 0xfe, 0x7e, 0x1e, 0xd6, - 0xd0, 0x9f, 0x29, 0xfc, 0xc8, 0x42, 0x74, 0x35, 0x61, 0x09, 0x5d, 0xbb, 0x28, 0xbc, 0xf6, 0x6f, - 0x58, 0xe2, 0x99, 0x7c, 0xf4, 0x9a, 0x3e, 0x58, 0x79, 0x5a, 0xfc, 0x9a, 0xe1, 0x2f, 0x2c, 0x0e, - 0xff, 0xf5, 0xc3, 0x9b, 0x15, 0x55, 0x2e, 0x65, 0x45, 0x95, 0x5f, 0x27, 0x96, 0xbb, 0x70, 0xae, - 0xb9, 0xbc, 0x78, 0x7b, 0xe7, 0x63, 0xd8, 0x4a, 0xd0, 0x70, 0x69, 0xed, 0x9e, 0xba, 0x54, 0xde, - 0x0f, 0xb4, 0xae, 0x51, 0x0f, 0x24, 0x6e, 0xa7, 0x0c, 0xa5, 0x70, 0xe4, 0xcf, 0xa8, 0xb9, 0x09, - 0xeb, 0xc9, 0x51, 0x15, 0xdb, 0xc4, 0x6f, 0xe5, 0xa0, 0x29, 0x72, 0x80, 0x5c, 0xef, 0x6c, 0xdf, - 0x0d, 0x23, 0x3f, 0x50, 0xb7, 0x43, 0xdf, 0x06, 0xc0, 0xcf, 0x7d, 0x70, 0xc3, 0x5d, 0xdc, 0x88, - 0xc3, 0x21, 0xdc, 0x6c, 0xbf, 0x09, 0x15, 0xea, 0x8d, 0x11, 0x89, 0xdc, 0x50, 0xa6, 0xde, 0x58, - 0x1a, 0xfd, 0x0b, 0xdb, 0x70, 0x23, 0xa9, 0x60, 0x88, 0xbb, 0x1d, 0xd8, 0xe8, 0xd0, 0x0b, 0xae, - 0x0e, 0x14, 0xd5, 0xdd, 0x0e, 0x87, 0xce, 0x25, 0xcf, 0xa8, 0x0d, 0xcd, 0xbf, 0x96, 0x87, 0x95, - 0xb8, 0x7d, 0x78, 0xbb, 0xcd, 0xcb, 0xef, 0xe9, 0xb9, 0x2b, 0xd8, 0xc1, 0x65, 0xc6, 0x92, 0xe6, - 0xe5, 0xad, 0xe0, 0xe2, 0xec, 0x7a, 0xc4, 0x84, 0x9a, 0xa4, 0xf0, 0xe7, 0x91, 0x76, 0xe3, 0x68, - 0x15, 0x49, 0xfa, 0xf3, 0x88, 0x59, 0xb7, 0xcc, 0xcc, 0x77, 0x3d, 0x61, 0x5f, 0x96, 0x9c, 0x69, - 0xd4, 0xe5, 0xdf, 0x94, 0x61, 0x60, 0x56, 0x0c, 0x27, 0x92, 0x51, 0x31, 0x7a, 0x03, 0x8d, 0x1d, - 0x9c, 0x39, 0x6e, 0xe8, 0xe8, 0x96, 0x00, 0x5e, 0x83, 0xaf, 0x2c, 0x81, 0x37, 0xa1, 0x86, 0x95, - 0xc7, 0xc7, 0xd8, 0xf9, 0xf5, 0x5f, 0x51, 0xd7, 0xe3, 0x78, 0xe1, 0x71, 0xf3, 0xe7, 0x09, 0x3f, - 0x03, 0xe0, 0xab, 0x78, 0x8a, 0xcd, 0x6f, 0xe4, 0xe0, 0x66, 0xc6, 0xb4, 0x89, 0x55, 0xde, 0x86, - 0xd5, 0x53, 0x85, 0x94, 0xa3, 0x8b, 0x4b, 0x7d, 0x53, 0x8a, 0xd5, 0xe4, 0x98, 0x5a, 0xc6, 0x69, - 0x12, 0x10, 0x5b, 0xb8, 0x38, 0x83, 0x89, 0x4b, 0x12, 0xb8, 0x3a, 0x85, 0xd3, 0x88, 0xc6, 0xe5, - 0x11, 0x6c, 0x77, 0x2e, 0x99, 0xc4, 0x50, 0x69, 0xb9, 0xa3, 0xe7, 0x73, 0x19, 0xf9, 0x4a, 0x79, - 0xf3, 0x73, 0xaf, 0xe5, 0xcd, 0x1f, 0xe3, 0x31, 0x67, 0x55, 0xd7, 0xcf, 0x52, 0x09, 0xdf, 0x40, - 0x59, 0x99, 0x13, 0x5e, 0x85, 0xbc, 0x2d, 0x81, 0x81, 0xb0, 0x52, 0x33, 0x84, 0x95, 0xc3, 0xf9, - 0x24, 0x72, 0xdb, 0x0a, 0x44, 0x3e, 0x12, 0x65, 0xf8, 0x7b, 0xe4, 0xa8, 0x65, 0xbe, 0x08, 0xd4, - 0x8b, 0xf8, 0x60, 0x4d, 0x59, 0x45, 0xf6, 0xe2, 0xfb, 0x56, 0xa6, 0xc9, 0x37, 0x98, 0x37, 0x61, - 0x2b, 0x7e, 0xc2, 0x61, 0x93, 0x5b, 0xcd, 0xdf, 0xc9, 0x61, 0xfa, 0x3e, 0xe2, 0x06, 0x9e, 0x33, - 0x0b, 0xcf, 0xfd, 0x88, 0x74, 0x60, 0x2d, 0x74, 0xbd, 0xb3, 0x09, 0xd5, 0xab, 0x0f, 0xc5, 0x20, - 0x6c, 0x24, 0xdb, 0x86, 0x45, 0x43, 0x6b, 0x15, 0x4b, 0xc4, 0xb5, 0x85, 0x64, 0xe7, 0xba, 0x46, - 0xc6, 0x6c, 0x91, 0x1a, 0x8d, 0xc5, 0xc6, 0x77, 0x61, 0x39, 0xf9, 0x22, 0xf2, 0x89, 0xb8, 0x1d, - 0x20, 0x6e, 0x55, 0x21, 0x75, 0x36, 0x3a, 0x66, 0x88, 0x5a, 0x3c, 0xf6, 0xa1, 0xf9, 0x57, 0x72, - 0xd0, 0xb4, 0x28, 0xe3, 0x5c, 0xad, 0x95, 0x92, 0x67, 0xbe, 0xbf, 0x50, 0xeb, 0xf5, 0x7d, 0x95, - 0x97, 0x0e, 0xc8, 0x16, 0x7d, 0xe7, 0xda, 0xc9, 0xd8, 0xbf, 0xb1, 0xd0, 0xa3, 0x9d, 0x0a, 0x2c, - 0x21, 0x89, 0xb9, 0x05, 0x1b, 0xa2, 0x3d, 0xb2, 0x2d, 0x71, 0xa8, 0x36, 0xf1, 0xc6, 0x44, 0xa8, - 0x76, 0x1b, 0x9a, 0x78, 0xce, 0x57, 0xef, 0x84, 0x28, 0xb8, 0x0b, 0xe4, 0xd0, 0x19, 0x39, 0x81, - 0xef, 0x7b, 0x47, 0x34, 0x10, 0xc9, 0xd0, 0x5c, 0xc3, 0xe4, 0x91, 0x4c, 0xa9, 0x0a, 0xe3, 0x93, - 0xbc, 0x67, 0xd9, 0xf7, 0x64, 0xee, 0x17, 0x3e, 0x99, 0x01, 0xac, 0xed, 0x38, 0xcf, 0xa9, 0xac, - 0x49, 0x0e, 0xd1, 0x13, 0xa8, 0xcd, 0x54, 0xa5, 0x72, 0xdc, 0xe5, 0x65, 0x29, 0x8b, 0xaf, 0xb5, - 0x74, 0x6a, 0x26, 0x82, 0x02, 0xdf, 0x8f, 0xf8, 0xc5, 0x04, 0x32, 0x18, 0x66, 0x55, 0x19, 0xe8, - 0x19, 0xbd, 0xea, 0x8e, 0xcd, 0x47, 0xb0, 0x9e, 0x7c, 0xa7, 0x10, 0x2d, 0xdb, 0x50, 0x99, 0x0a, - 0x98, 0x68, 0xbd, 0x7a, 0x66, 0xc6, 0x08, 0x33, 0xf9, 0x64, 0x99, 0xee, 0xae, 0x32, 0xa9, 0x9e, - 0xc0, 0xd6, 0x02, 0x46, 0x54, 0x78, 0x17, 0xea, 0x5a, 0x43, 0xb0, 0x1b, 0x45, 0xa6, 0xb2, 0x8a, - 0x96, 0x84, 0xe6, 0x67, 0xb0, 0x85, 0xf6, 0x58, 0x5c, 0x5c, 0x0e, 0x41, 0xaa, 0x17, 0xb9, 0x74, - 0x2f, 0x3e, 0x92, 0x66, 0x9e, 0x5e, 0x34, 0x3e, 0x2a, 0x30, 0xe6, 0x38, 0x99, 0xbe, 0x23, 0x1f, - 0xcd, 0xdf, 0xac, 0x40, 0x59, 0x58, 0xf3, 0xe4, 0x01, 0x14, 0x47, 0x32, 0xcf, 0x30, 0xbe, 0x30, - 0x4d, 0x60, 0xe5, 0xff, 0x36, 0xcf, 0x36, 0x64, 0x74, 0xe4, 0x09, 0x2c, 0x27, 0x43, 0xed, 0xa9, - 0xcb, 0x14, 0x92, 0x31, 0xf2, 0xc6, 0x28, 0x15, 0x54, 0xad, 0xc6, 0x4a, 0x00, 0xea, 0x46, 0x95, - 0x73, 0x4d, 0x4b, 0xf0, 0x3d, 0x66, 0x57, 0x84, 0xe7, 0x8e, 0xfd, 0xe8, 0xf1, 0xc7, 0xe2, 0x36, - 0x85, 0x1a, 0x07, 0x0e, 0xce, 0x9d, 0x47, 0x8f, 0x3f, 0x4e, 0x5b, 0x0c, 0xe2, 0x2e, 0x05, 0xcd, - 0x62, 0x58, 0x87, 0x12, 0x5e, 0x9a, 0x8c, 0x09, 0x63, 0xf8, 0x40, 0x1e, 0xc2, 0xba, 0x74, 0x10, - 0x89, 0xd4, 0x7e, 0x94, 0xf6, 0x15, 0x3c, 0x4d, 0x29, 0x70, 0x03, 0x8e, 0x42, 0x97, 0xd2, 0x26, - 0x2c, 0x9d, 0xc7, 0xb7, 0x60, 0x37, 0x2c, 0xf1, 0x64, 0xfe, 0x7e, 0x09, 0x6a, 0xda, 0xa0, 0x90, - 0x3a, 0x54, 0xac, 0xce, 0xa0, 0x63, 0x7d, 0xde, 0xd9, 0x35, 0x6e, 0x90, 0x7b, 0xf0, 0x4e, 0xb7, - 0xd7, 0xee, 0x5b, 0x56, 0xa7, 0x3d, 0xb4, 0xfb, 0x96, 0x2d, 0xaf, 0xed, 0x3b, 0x6a, 0x7d, 0x79, - 0xd8, 0xe9, 0x0d, 0xed, 0xdd, 0xce, 0xb0, 0xd5, 0x3d, 0x18, 0x18, 0x39, 0xf2, 0x06, 0x34, 0x63, - 0x4a, 0x89, 0x6e, 0x1d, 0xf6, 0x8f, 0x7b, 0x43, 0x23, 0x4f, 0xee, 0xc0, 0xad, 0xbd, 0x6e, 0xaf, - 0x75, 0x60, 0xc7, 0x34, 0xed, 0x83, 0xe1, 0xe7, 0x76, 0xe7, 0x17, 0x8f, 0xba, 0xd6, 0x97, 0x46, - 0x21, 0x8b, 0x60, 0x7f, 0x78, 0xd0, 0x96, 0x35, 0x14, 0xc9, 0x4d, 0xd8, 0x40, 0x02, 0x2c, 0x62, - 0x0f, 0xfb, 0x7d, 0x7b, 0xd0, 0xef, 0xf7, 0x8c, 0x12, 0x59, 0x85, 0x46, 0xb7, 0xf7, 0x79, 0xeb, - 0xa0, 0xbb, 0x6b, 0x5b, 0x9d, 0xd6, 0xc1, 0xa1, 0xb1, 0x44, 0xd6, 0x60, 0x25, 0x4d, 0x57, 0x66, - 0x55, 0x48, 0xba, 0x7e, 0xaf, 0xdb, 0xef, 0xd9, 0x9f, 0x77, 0xac, 0x41, 0xb7, 0xdf, 0x33, 0x2a, - 0x64, 0x13, 0x48, 0x12, 0xb5, 0x7f, 0xd8, 0x6a, 0x1b, 0x55, 0xb2, 0x01, 0xab, 0x49, 0xf8, 0xb3, - 0xce, 0x97, 0x06, 0x90, 0x26, 0xac, 0x63, 0xc3, 0xec, 0x9d, 0xce, 0x41, 0xff, 0x0b, 0xfb, 0xb0, - 0xdb, 0xeb, 0x1e, 0x1e, 0x1f, 0x1a, 0x35, 0x7e, 0xf7, 0x69, 0xa7, 0x63, 0x77, 0x7b, 0x83, 0xe3, - 0xbd, 0xbd, 0x6e, 0xbb, 0xdb, 0xe9, 0x0d, 0x8d, 0x3a, 0xbe, 0x39, 0xab, 0xe3, 0x0d, 0x56, 0x40, - 0x9c, 0xff, 0xb1, 0x77, 0xbb, 0x83, 0xd6, 0xce, 0x41, 0x67, 0xd7, 0x58, 0x26, 0xb7, 0xe1, 0xe6, - 0xb0, 0x73, 0x78, 0xd4, 0xb7, 0x5a, 0xd6, 0x97, 0xf2, 0x7c, 0x90, 0xbd, 0xd7, 0xea, 0x1e, 0x1c, - 0x5b, 0x1d, 0x63, 0x85, 0xbc, 0x05, 0xb7, 0xad, 0xce, 0x4f, 0x8e, 0xbb, 0x56, 0x67, 0xd7, 0xee, - 0xf5, 0x77, 0x3b, 0xf6, 0x5e, 0xa7, 0x35, 0x3c, 0xb6, 0x3a, 0xf6, 0x61, 0x77, 0x30, 0xe8, 0xf6, - 0x9e, 0x1a, 0x06, 0x79, 0x07, 0xee, 0x2a, 0x12, 0x55, 0x41, 0x8a, 0x6a, 0x95, 0xf5, 0x4f, 0x4e, - 0x69, 0xaf, 0xf3, 0x8b, 0x43, 0xfb, 0xa8, 0xd3, 0xb1, 0x0c, 0x42, 0xb6, 0x61, 0x33, 0x7e, 0x3d, - 0xbe, 0x40, 0xbc, 0x7b, 0x8d, 0xe1, 0x8e, 0x3a, 0xd6, 0x61, 0xab, 0xc7, 0x26, 0x38, 0x81, 0x5b, - 0x67, 0xcd, 0x8e, 0x71, 0xe9, 0x66, 0x6f, 0x10, 0x02, 0xcb, 0xda, 0xac, 0xec, 0xb5, 0x2c, 0x63, - 0x93, 0xac, 0x40, 0xed, 0xf0, 0xe8, 0xc8, 0x1e, 0x76, 0x0f, 0x3b, 0xfd, 0xe3, 0xa1, 0xb1, 0x45, - 0x36, 0xc0, 0xe8, 0xf6, 0x86, 0x1d, 0x8b, 0xcd, 0xb5, 0x2c, 0xfa, 0x5f, 0xcb, 0x64, 0x1d, 0x56, - 0x64, 0x4b, 0x25, 0xf4, 0x8f, 0xca, 0x64, 0x0b, 0xc8, 0x71, 0xcf, 0xea, 0xb4, 0x76, 0xd9, 0xc0, - 0x29, 0xc4, 0x7f, 0x2b, 0x8b, 0xb0, 0xdb, 0xef, 0x14, 0x94, 0x52, 0x12, 0xe7, 0xb1, 0x24, 0x3f, - 0x0d, 0x51, 0xd7, 0x3e, 0xe9, 0xf0, 0xaa, 0x0f, 0x3c, 0x69, 0x26, 0x64, 0x61, 0xc1, 0x84, 0x5c, - 0xf0, 0x51, 0x34, 0x74, 0x1d, 0xf7, 0x6d, 0x68, 0x4c, 0xf1, 0x33, 0x11, 0xe2, 0x0e, 0x74, 0x10, - 0x49, 0x5d, 0x08, 0xc4, 0x0b, 0xd0, 0x17, 0xbe, 0x70, 0x54, 0x5a, 0xfc, 0xc2, 0x51, 0x96, 0x1d, - 0xb3, 0x94, 0x65, 0xc7, 0xdc, 0x87, 0x55, 0x14, 0x4d, 0xae, 0xe7, 0x4e, 0xa5, 0x77, 0x00, 0xb5, - 0xdd, 0x15, 0x2e, 0xa2, 0x10, 0x2e, 0xcd, 0x26, 0x69, 0x5a, 0x09, 0x11, 0x52, 0x16, 0x56, 0x55, - 0xc2, 0xa2, 0x42, 0xc9, 0xa1, 0x2c, 0x2a, 0xf5, 0x06, 0xe7, 0x32, 0x7e, 0x43, 0x4d, 0x7b, 0x03, - 0xc2, 0xf9, 0x1b, 0xee, 0xc3, 0x2a, 0xbd, 0x8c, 0x02, 0xc7, 0xf6, 0x67, 0xce, 0x57, 0x73, 0x9e, - 0x17, 0xe0, 0x70, 0x5f, 0x45, 0xdd, 0x5a, 0xe1, 0x88, 0x3e, 0x87, 0xef, 0x3a, 0x91, 0x73, 0xff, - 0xcf, 0x41, 0x4d, 0xfb, 0x84, 0x08, 0xd9, 0x82, 0xb5, 0x2f, 0xba, 0xc3, 0x5e, 0x67, 0x30, 0xb0, - 0x8f, 0x8e, 0x77, 0x9e, 0x75, 0xbe, 0xb4, 0xf7, 0x5b, 0x83, 0x7d, 0xe3, 0x06, 0x5b, 0xb4, 0xbd, - 0xce, 0x60, 0xd8, 0xd9, 0x4d, 0xc0, 0x73, 0xe4, 0x4d, 0xd8, 0x3e, 0xee, 0x1d, 0x0f, 0x3a, 0xbb, - 0x76, 0x56, 0xb9, 0x3c, 0xe3, 0x52, 0x81, 0xcf, 0x28, 0x5e, 0xb8, 0xff, 0x2b, 0xb0, 0x9c, 0x3c, - 0x2a, 0x4f, 0x00, 0x96, 0x0e, 0x3a, 0x4f, 0x5b, 0xed, 0x2f, 0xf1, 0x76, 0xe4, 0xc1, 0xb0, 0x35, - 0xec, 0xb6, 0x6d, 0x71, 0x1b, 0x32, 0x93, 0x08, 0x39, 0x52, 0x83, 0x72, 0xab, 0xd7, 0xde, 0xef, - 0x5b, 0x03, 0x23, 0x4f, 0xde, 0x80, 0x2d, 0xc9, 0xab, 0xed, 0xfe, 0xe1, 0x61, 0x77, 0xc8, 0x85, - 0xe1, 0xf0, 0xcb, 0x23, 0xc6, 0x9a, 0xf7, 0x1d, 0xa8, 0xc6, 0x17, 0x39, 0x73, 0x01, 0xd3, 0x1d, - 0x76, 0x5b, 0xc3, 0x58, 0xba, 0x1a, 0x37, 0x98, 0xfc, 0x8a, 0xc1, 0xfc, 0x36, 0x66, 0x23, 0x87, - 0xa7, 0x09, 0x25, 0x10, 0xdf, 0x6e, 0xe4, 0xd9, 0xa2, 0x8a, 0xa1, 0x3b, 0xfd, 0x21, 0xeb, 0xc2, - 0xaf, 0xc2, 0x72, 0xf2, 0xbe, 0x64, 0x62, 0x40, 0x9d, 0xbd, 0x5f, 0x7b, 0x05, 0xc0, 0x12, 0xb6, - 0xd8, 0xc8, 0xa1, 0x04, 0x6d, 0xf7, 0x0f, 0xbb, 0xbd, 0xa7, 0x5c, 0xec, 0x1a, 0x79, 0x06, 0xea, - 0x1f, 0x0f, 0x9f, 0xf6, 0x15, 0xa8, 0xc0, 0x4a, 0x60, 0x77, 0x8c, 0xe2, 0xfd, 0xaf, 0x60, 0x75, - 0xe1, 0x66, 0x65, 0xd6, 0xea, 0xfe, 0xf1, 0xb0, 0xdd, 0x3f, 0xd4, 0xdf, 0x53, 0x83, 0x72, 0xfb, - 0xa0, 0xd5, 0x3d, 0xe4, 0x9e, 0xf1, 0x06, 0x54, 0x8f, 0x7b, 0xf2, 0x31, 0x9f, 0xbc, 0x13, 0xba, - 0xc0, 0x64, 0xc1, 0x5e, 0xd7, 0x1a, 0x0c, 0xed, 0xc1, 0xb0, 0xf5, 0xb4, 0x63, 0x14, 0x59, 0x59, - 0x29, 0x18, 0x4a, 0xf7, 0x3f, 0x83, 0xe5, 0x64, 0x22, 0x6c, 0x32, 0xa2, 0xb1, 0x0d, 0x9b, 0x3b, - 0x9d, 0xe1, 0x17, 0x9d, 0x4e, 0x8f, 0x4f, 0x79, 0xbb, 0xd3, 0x1b, 0x5a, 0xad, 0x83, 0xee, 0xf0, - 0x4b, 0x23, 0x77, 0xff, 0x09, 0x18, 0xe9, 0xa8, 0x73, 0x22, 0x4c, 0xff, 0xb2, 0x78, 0xfe, 0xfd, - 0xff, 0x94, 0x83, 0xf5, 0xac, 0x80, 0x0b, 0x63, 0x4c, 0x21, 0x71, 0xd8, 0xbe, 0x33, 0xe8, 0xf7, - 0xec, 0x5e, 0x9f, 0xdf, 0xb2, 0xba, 0x0d, 0x9b, 0x29, 0x84, 0xec, 0x45, 0x8e, 0xdc, 0x82, 0xad, - 0x85, 0x42, 0xb6, 0xd5, 0x3f, 0xe6, 0x73, 0xd9, 0x84, 0xf5, 0x14, 0xb2, 0x63, 0x59, 0x7d, 0xcb, - 0x28, 0x90, 0xef, 0xc0, 0xbd, 0x14, 0x66, 0x71, 0xb7, 0x95, 0x9b, 0x71, 0x91, 0xbc, 0x07, 0x6f, - 0x2f, 0x50, 0xc7, 0x1b, 0x92, 0xbd, 0xd3, 0x3a, 0x60, 0xdd, 0x33, 0x4a, 0xf7, 0xff, 0x61, 0x01, - 0x20, 0x3e, 0x69, 0xc6, 0xde, 0xbf, 0xdb, 0x1a, 0xb6, 0x0e, 0xfa, 0x6c, 0xcd, 0x58, 0xfd, 0x21, - 0xab, 0xdd, 0xea, 0xfc, 0xc4, 0xb8, 0x91, 0x89, 0xe9, 0x1f, 0xb1, 0x0e, 0x6d, 0xc1, 0x1a, 0xf2, - 0xdf, 0x01, 0xeb, 0x06, 0x63, 0x17, 0x7e, 0x61, 0x2f, 0xdf, 0xd2, 0x8f, 0x8f, 0xf6, 0xac, 0x7e, - 0x6f, 0x68, 0x0f, 0xf6, 0x8f, 0x87, 0xbb, 0xfc, 0xba, 0xdf, 0xb6, 0xd5, 0x3d, 0xc2, 0x3a, 0x8b, - 0x2f, 0x23, 0x60, 0x55, 0x97, 0xd8, 0x02, 0x7f, 0xda, 0x1f, 0x0c, 0xba, 0x47, 0xf6, 0x4f, 0x8e, - 0x3b, 0x56, 0xb7, 0x33, 0xe0, 0x05, 0x97, 0x32, 0xe0, 0x8c, 0xbe, 0xcc, 0x78, 0x76, 0x78, 0xf0, - 0xb9, 0xd8, 0xa9, 0x19, 0x69, 0x25, 0x09, 0x62, 0x54, 0x55, 0x36, 0x3b, 0x6c, 0xab, 0xcb, 0xa8, - 0x19, 0xae, 0xc1, 0xb1, 0x72, 0x35, 0xb6, 0x89, 0x2f, 0xac, 0x7c, 0x5e, 0xac, 0x9e, 0x8d, 0x62, - 0xa5, 0xf8, 0xfe, 0xae, 0xb4, 0xa1, 0xdd, 0x5d, 0x8b, 0x17, 0x58, 0x5e, 0x80, 0x32, 0xda, 0x15, - 0xc6, 0x84, 0x6c, 0x2f, 0x64, 0x24, 0x86, 0x7c, 0x60, 0x98, 0xd5, 0x47, 0xff, 0xfb, 0x2e, 0x54, - 0x55, 0xc6, 0x39, 0xf9, 0x31, 0x34, 0x12, 0x47, 0x80, 0x89, 0xf4, 0xe9, 0x66, 0x9d, 0x18, 0xde, - 0x7e, 0x23, 0x1b, 0x29, 0x94, 0xea, 0x43, 0xcd, 0x3c, 0xc4, 0xca, 0xde, 0x48, 0x9b, 0x6c, 0x89, - 0xda, 0x6e, 0x5f, 0x83, 0x15, 0xd5, 0x3d, 0xe3, 0x77, 0x07, 0xeb, 0x5f, 0xa2, 0x25, 0xb7, 0xe3, - 0x8b, 0x5c, 0x33, 0xbe, 0x50, 0xbb, 0x7d, 0x73, 0xf1, 0x9b, 0xb1, 0xf2, 0x23, 0xb3, 0xbb, 0x50, - 0xd3, 0x3e, 0xb0, 0x46, 0x6e, 0x5e, 0xfb, 0x31, 0xb8, 0xed, 0xed, 0x2c, 0x94, 0x68, 0xd2, 0x0f, - 0xa0, 0xaa, 0x3e, 0xb6, 0x45, 0xb6, 0xb4, 0x0f, 0xa5, 0xe9, 0x9f, 0x0c, 0xdb, 0x6e, 0x2e, 0x22, - 0x44, 0xf9, 0x5d, 0xa8, 0x69, 0xdf, 0xcc, 0x52, 0xad, 0x58, 0xfc, 0x2e, 0x97, 0x6a, 0x45, 0xd6, - 0x27, 0xb6, 0x0e, 0x60, 0x43, 0x18, 0xa1, 0x27, 0xf4, 0xeb, 0x0c, 0x4f, 0xc6, 0x27, 0x75, 0x1f, - 0xe6, 0xc8, 0x13, 0xa8, 0xc8, 0xaf, 0xa3, 0x91, 0xcd, 0xec, 0x6f, 0xbf, 0x6d, 0x6f, 0x2d, 0xc0, - 0x45, 0x53, 0x5a, 0x00, 0xf1, 0xd7, 0xb8, 0x88, 0xec, 0xf8, 0xc2, 0xd7, 0xbd, 0xd4, 0xcc, 0x64, - 0x7c, 0xba, 0x6b, 0x17, 0x6a, 0xda, 0x87, 0xb7, 0xd4, 0x98, 0x2c, 0x7e, 0xb4, 0x4b, 0x8d, 0x49, - 0xd6, 0x77, 0xba, 0x7e, 0x0c, 0x8d, 0xc4, 0x17, 0xb4, 0x14, 0x1f, 0x67, 0x7d, 0x9f, 0x4b, 0xf1, - 0x71, 0xf6, 0x47, 0xb7, 0x76, 0xa1, 0xa6, 0x7d, 0xef, 0x4a, 0xb5, 0x68, 0xf1, 0xd3, 0x5a, 0xaa, - 0x45, 0x19, 0x9f, 0xc7, 0x62, 0xab, 0x21, 0xf9, 0xb1, 0x2b, 0xb5, 0x1a, 0x32, 0xbf, 0x9a, 0xa5, - 0x56, 0x43, 0xf6, 0x17, 0xb2, 0x18, 0xeb, 0xa9, 0x4b, 0xc3, 0xc9, 0x96, 0xc6, 0x1d, 0xfa, 0xed, - 0xe3, 0x8a, 0xf5, 0x16, 0xef, 0x17, 0x7f, 0x0a, 0x6b, 0x8a, 0x69, 0xd4, 0x95, 0xdf, 0xa1, 0x6a, - 0x53, 0xe6, 0xc5, 0xe2, 0xdb, 0x46, 0x1a, 0xfb, 0x30, 0x47, 0x3e, 0x85, 0xb2, 0xb8, 0x47, 0x99, - 0x6c, 0xa4, 0xef, 0x55, 0xc6, 0x46, 0x6c, 0x66, 0x5f, 0xb7, 0x4c, 0x8e, 0xf8, 0x82, 0xd6, 0x2f, - 0x3a, 0xd6, 0x39, 0x36, 0xe3, 0x6e, 0xe4, 0xed, 0x37, 0xaf, 0x43, 0xc7, 0x35, 0xa6, 0x2f, 0xe7, - 0xbe, 0x7d, 0xdd, 0xd5, 0x1c, 0xc9, 0x1a, 0xaf, 0xbb, 0x43, 0xec, 0x29, 0xd4, 0xf5, 0x4f, 0xad, - 0x10, 0x7d, 0x1d, 0xa6, 0xeb, 0xba, 0x95, 0x89, 0x13, 0x15, 0x7d, 0x0e, 0x9b, 0x6a, 0xbc, 0xf5, - 0x7b, 0x22, 0x42, 0x72, 0x27, 0xe3, 0xf6, 0x88, 0xc4, 0xa8, 0xdf, 0xbc, 0xf6, 0x7a, 0x89, 0x87, - 0x39, 0x2e, 0x64, 0x13, 0x5f, 0x47, 0x88, 0x85, 0x6c, 0xd6, 0x47, 0x21, 0x62, 0x21, 0x9b, 0xfd, - 0x49, 0x85, 0x16, 0xac, 0x68, 0xf7, 0x5c, 0x0c, 0xae, 0xbc, 0x91, 0xe2, 0xf7, 0xc5, 0x1b, 0x68, - 0xb7, 0xb3, 0x5c, 0xa1, 0xa4, 0x0d, 0x35, 0xfd, 0xaa, 0x8c, 0x97, 0x14, 0xdf, 0xd2, 0x50, 0xfa, - 0x25, 0xa3, 0x0f, 0x73, 0xe4, 0x00, 0x8c, 0xf4, 0xc5, 0x76, 0x6a, 0x09, 0x67, 0x5d, 0x06, 0xb8, - 0x9d, 0x42, 0x26, 0xae, 0xc3, 0x63, 0x7c, 0x91, 0xf8, 0x74, 0xab, 0x1f, 0xa4, 0xb7, 0xa2, 0xe4, - 0x27, 0x5d, 0x55, 0x6d, 0x59, 0x1f, 0xf3, 0xbd, 0x97, 0x7b, 0x98, 0x23, 0x7b, 0x50, 0x4f, 0xdc, - 0xeb, 0x94, 0x38, 0xfc, 0x90, 0xea, 0x66, 0x53, 0xc7, 0xa5, 0xfa, 0x79, 0x08, 0xcb, 0xc9, 0x98, - 0xbd, 0x6a, 0x58, 0x66, 0x62, 0x81, 0x9a, 0xbe, 0xec, 0x40, 0x3f, 0xf9, 0x21, 0x7e, 0x98, 0x5c, - 0xe6, 0x76, 0x91, 0xc5, 0x0f, 0x59, 0xab, 0x39, 0xd3, 0x3f, 0xfb, 0x6c, 0x16, 0xfe, 0x52, 0x3e, - 0xc7, 0xfb, 0xf5, 0x7d, 0xfc, 0x2c, 0xa8, 0x4c, 0xef, 0x61, 0xf3, 0xff, 0xba, 0x95, 0x90, 0x3d, - 0x7c, 0xb9, 0xf8, 0x28, 0x73, 0x2c, 0xb9, 0x17, 0x3e, 0xd4, 0xfc, 0x8a, 0x36, 0xb4, 0xb0, 0x0d, - 0xa2, 0x4c, 0x82, 0x07, 0x5f, 0xb3, 0x2e, 0xf2, 0x09, 0x40, 0x9c, 0x33, 0x49, 0x52, 0x99, 0x7b, - 0x6a, 0x41, 0x65, 0xa4, 0x55, 0x76, 0x70, 0xbd, 0xab, 0xd4, 0x41, 0x7d, 0x4b, 0x4e, 0x66, 0x31, - 0x26, 0xb6, 0xe4, 0x74, 0x35, 0xdf, 0x83, 0xc6, 0x81, 0xef, 0x3f, 0x9f, 0xcf, 0x54, 0xe2, 0x7d, - 0x32, 0xaf, 0x85, 0xd9, 0xfc, 0xdb, 0xa9, 0x66, 0x91, 0x16, 0xac, 0x2a, 0x11, 0x11, 0xe7, 0x2e, - 0x26, 0x89, 0x12, 0x82, 0x21, 0x55, 0xc1, 0xc3, 0x1c, 0x79, 0x04, 0xf5, 0x5d, 0x3a, 0xe2, 0xf7, - 0x2e, 0xf0, 0x2c, 0x8a, 0xb5, 0x44, 0x44, 0x1e, 0xd3, 0x2f, 0xb6, 0x1b, 0x09, 0xa0, 0x14, 0x71, - 0x71, 0x26, 0x8f, 0xbe, 0x67, 0x24, 0xd3, 0x61, 0x12, 0x22, 0x6e, 0x21, 0x9b, 0xe7, 0x73, 0x58, - 0x5d, 0xc8, 0x95, 0x51, 0xd2, 0xed, 0xba, 0x0c, 0x9b, 0xed, 0xbb, 0xd7, 0x13, 0x88, 0x7a, 0x7f, - 0x04, 0x0d, 0xbc, 0x73, 0xf6, 0x84, 0xe2, 0xb9, 0xc9, 0xd4, 0xa5, 0x43, 0xfa, 0xa1, 0xcc, 0xb4, - 0x48, 0xc2, 0x02, 0x4f, 0xf9, 0x97, 0x28, 0xb4, 0x53, 0x89, 0x6a, 0x5e, 0x17, 0x4f, 0x4a, 0xaa, - 0x79, 0xcd, 0x3a, 0x00, 0xf9, 0x19, 0xd4, 0x9e, 0xd2, 0x48, 0x9e, 0xf3, 0x53, 0xfa, 0x51, 0xea, - 0xe0, 0xdf, 0x76, 0xc6, 0xe9, 0x4c, 0xf2, 0x31, 0x2f, 0xaa, 0xce, 0xac, 0x6f, 0x6a, 0x6f, 0xd1, - 0x8b, 0xae, 0xa4, 0xe0, 0x4c, 0xfb, 0xd0, 0x6e, 0xae, 0x50, 0x0d, 0x5f, 0xbc, 0xa9, 0x44, 0x35, - 0x3c, 0xeb, 0xa2, 0x8b, 0x1f, 0xe2, 0x08, 0x68, 0x27, 0x0b, 0x63, 0x15, 0x2c, 0x7d, 0x08, 0x51, - 0x35, 0x5f, 0x27, 0x7f, 0x0c, 0x30, 0x88, 0xfc, 0xd9, 0xae, 0x43, 0xa7, 0xbe, 0x17, 0xcb, 0x84, - 0xf8, 0x4c, 0x5b, 0xbc, 0x10, 0xb5, 0x83, 0x6d, 0xe4, 0x0b, 0x4d, 0x37, 0x4d, 0x4c, 0x89, 0x9c, - 0xf6, 0x6b, 0x8f, 0xbd, 0xa9, 0xee, 0x64, 0x1c, 0x7d, 0xe3, 0x42, 0x02, 0xe2, 0x54, 0x24, 0xa5, - 0x69, 0x2e, 0x64, 0x39, 0xa9, 0xb5, 0x9e, 0x91, 0xb7, 0xf4, 0x03, 0xa8, 0xc6, 0x39, 0x1c, 0x5b, - 0xf1, 0x35, 0x3a, 0x89, 0x8c, 0x0f, 0x25, 0xbd, 0x17, 0xf3, 0x27, 0x7a, 0xb0, 0x86, 0xcd, 0x51, - 0xdb, 0x1f, 0x3f, 0x79, 0xa5, 0x3e, 0xa4, 0xb2, 0x98, 0xb8, 0xa0, 0xd6, 0x4f, 0x56, 0xf8, 0x9d, - 0xad, 0x9f, 0x85, 0x30, 0xae, 0x5a, 0x3f, 0xd7, 0xc5, 0xe5, 0xd5, 0xfa, 0xb9, 0x3e, 0x02, 0xdc, - 0x83, 0xb5, 0x8c, 0x80, 0x2c, 0x79, 0x4b, 0x1a, 0x36, 0xd7, 0x06, 0x6b, 0xb7, 0x33, 0x03, 0x77, - 0x64, 0x08, 0x5b, 0x58, 0xa6, 0x35, 0x99, 0xa4, 0xe2, 0x7f, 0x6f, 0x6a, 0x05, 0x32, 0x62, 0x9a, - 0x09, 0x55, 0x26, 0x15, 0xd7, 0xec, 0x81, 0x91, 0x0e, 0x9d, 0x91, 0xeb, 0xc9, 0xb7, 0xef, 0x24, - 0x54, 0xf6, 0xc5, 0x70, 0x1b, 0xf9, 0x5c, 0x05, 0xf0, 0x52, 0x6d, 0xbc, 0x13, 0x7f, 0xbe, 0x2b, - 0x33, 0xdc, 0xa8, 0xac, 0x81, 0xcc, 0xf8, 0x1f, 0xf9, 0x45, 0xd8, 0x4a, 0x73, 0xb4, 0xac, 0xf9, - 0x6e, 0xd6, 0x70, 0x5d, 0xab, 0xca, 0x25, 0x3b, 0xf4, 0x30, 0xc7, 0x04, 0xb1, 0x1e, 0x66, 0x53, - 0x8c, 0x94, 0x11, 0xef, 0x53, 0x8c, 0x94, 0x19, 0x97, 0x3b, 0x82, 0x95, 0x54, 0x84, 0x4d, 0xa9, - 0xc1, 0xd9, 0x31, 0x39, 0xa5, 0x06, 0x5f, 0x17, 0x98, 0x1b, 0x80, 0x91, 0x8e, 0x9d, 0xa9, 0xb9, - 0xbe, 0x26, 0x1e, 0xb7, 0x7d, 0xe7, 0x5a, 0x3c, 0x56, 0xba, 0xf3, 0xde, 0x2f, 0x7d, 0xeb, 0xcc, - 0x8d, 0xce, 0xe7, 0x27, 0x0f, 0x46, 0xfe, 0xf4, 0x83, 0x89, 0xf4, 0x41, 0x88, 0x63, 0xc3, 0x1f, - 0x4c, 0xbc, 0xf1, 0x07, 0xbc, 0x86, 0x93, 0xa5, 0x59, 0xe0, 0x47, 0xfe, 0xf7, 0xfe, 0x5f, 0x00, - 0x00, 0x00, 0xff, 0xff, 0xa4, 0x19, 0x80, 0x8a, 0xd0, 0x88, 0x00, 0x00, + // 11877 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0xbd, 0x59, 0x6c, 0x23, 0x49, + 0x9a, 0x18, 0x5c, 0xbc, 0x44, 0xf2, 0x23, 0x29, 0x51, 0xa1, 0x8b, 0xa5, 0xea, 0xea, 0xaa, 0xce, + 0xee, 0xe9, 0xae, 0xa9, 0xee, 0xa9, 0xae, 0xae, 0xee, 0xea, 0x63, 0xfa, 0xdf, 0x99, 0xa1, 0x28, + 0xaa, 0xc4, 0x29, 0x89, 0xd4, 0x24, 0xa9, 0xee, 0xed, 0xc5, 0xfe, 0x9b, 0x9b, 0x22, 0x43, 0x52, + 0xba, 0xc8, 0x4c, 0x76, 0x66, 0x52, 0x25, 0x8d, 0xe1, 0xb7, 0xf5, 0x81, 0xc5, 0xda, 0x80, 0x01, + 0xaf, 0x01, 0x1f, 0x0b, 0x5f, 0xb0, 0xfd, 0xb6, 0x30, 0xbc, 0x6b, 0x3f, 0xf9, 0xd9, 0x0b, 0x03, + 0x36, 0x0c, 0xc3, 0x6b, 0xf8, 0xc0, 0x62, 0x01, 0x03, 0xf6, 0xfa, 0xc1, 0x80, 0xb1, 0x80, 0xfd, + 0xe2, 0x07, 0x03, 0x46, 0xc4, 0x17, 0x11, 0x19, 0x79, 0xa8, 0xaa, 0x7a, 0xb6, 0x3d, 0x2f, 0x12, + 0xf3, 0xfb, 0xbe, 0x88, 0x8c, 0xe3, 0x8b, 0x2f, 0xbe, 0x2b, 0x22, 0xa1, 0xea, 0xcf, 0xc7, 0x0f, + 0xe6, 0xbe, 0x17, 0x7a, 0xa4, 0x34, 0x75, 0xfd, 0xf9, 0xd8, 0xf8, 0xa3, 0x1c, 0x14, 0x8f, 0xc3, + 0x4b, 0x8f, 0x3c, 0x86, 0xba, 0x3d, 0x99, 0xf8, 0x34, 0x08, 0xac, 0xf0, 0x6a, 0x4e, 0x5b, 0xb9, + 0xbb, 0xb9, 0x7b, 0xcb, 0x8f, 0xc8, 0x03, 0x4e, 0xf6, 0xa0, 0x8d, 0xa8, 0xd1, 0xd5, 0x9c, 0x9a, + 0x35, 0x3b, 0x7a, 0x20, 0x2d, 0x28, 0x8b, 0xc7, 0x56, 0xfe, 0x6e, 0xee, 0x5e, 0xd5, 0x94, 0x8f, + 0xe4, 0x36, 0x80, 0x3d, 0xf3, 0x16, 0x6e, 0x68, 0x05, 0x76, 0xd8, 0x2a, 0xdc, 0xcd, 0xdd, 0x2b, + 0x98, 0x55, 0x84, 0x0c, 0xed, 0x90, 0xdc, 0x82, 0xea, 0xfc, 0x99, 0x15, 0x8c, 0x7d, 0x67, 0x1e, + 0xb6, 0x8a, 0xbc, 0x68, 0x65, 0xfe, 0x6c, 0xc8, 0x9f, 0xc9, 0xbb, 0x50, 0xf1, 0x16, 0xe1, 0xdc, + 0x73, 0xdc, 0xb0, 0x55, 0xba, 0x9b, 0xbb, 0x57, 0x7b, 0xb4, 0x22, 0x1a, 0x32, 0x58, 0x84, 0x47, + 0x0c, 0x6c, 0x2a, 0x02, 0xf2, 0x16, 0x34, 0xc6, 0x9e, 0x7b, 0xea, 0xf8, 0x33, 0x3b, 0x74, 0x3c, + 0x37, 0x68, 0x2d, 0xf1, 0x77, 0xc5, 0x81, 0xc6, 0x3f, 0xcf, 0x43, 0x6d, 0xe4, 0xdb, 0x6e, 0x60, + 0x8f, 0x19, 0x80, 0x6c, 0x41, 0x39, 0xbc, 0xb4, 0xce, 0xed, 0xe0, 0x9c, 0x77, 0xb5, 0x6a, 0x2e, + 0x85, 0x97, 0xfb, 0x76, 0x70, 0x4e, 0x36, 0x61, 0x09, 0x5b, 0xc9, 0x3b, 0x54, 0x30, 0xc5, 0x13, + 0x79, 0x17, 0x56, 0xdd, 0xc5, 0xcc, 0x8a, 0xbf, 0x8a, 0x75, 0xab, 0x64, 0x36, 0xdd, 0xc5, 0xac, + 0xa3, 0xc3, 0x59, 0xe7, 0x4f, 0xa6, 0xde, 0xf8, 0x19, 0xbe, 0x00, 0xbb, 0x57, 0xe5, 0x10, 0xfe, + 0x8e, 0x37, 0xa0, 0x2e, 0xd0, 0xd4, 0x39, 0x3b, 0xc7, 0x3e, 0x96, 0xcc, 0x1a, 0x12, 0x70, 0x10, + 0xab, 0x21, 0x74, 0x66, 0xd4, 0x0a, 0x42, 0x7b, 0x36, 0x17, 0x5d, 0xaa, 0x32, 0xc8, 0x90, 0x01, + 0x38, 0xda, 0x0b, 0xed, 0xa9, 0x75, 0x4a, 0x69, 0xd0, 0x2a, 0x0b, 0x34, 0x83, 0xec, 0x51, 0x1a, + 0x90, 0xef, 0xc0, 0xf2, 0x84, 0x06, 0xa1, 0x25, 0x26, 0x83, 0x06, 0xad, 0xca, 0xdd, 0xc2, 0xbd, + 0xaa, 0xd9, 0x60, 0xd0, 0xb6, 0x04, 0x92, 0xd7, 0x00, 0x7c, 0xfb, 0xb9, 0xc5, 0x06, 0x82, 0x5e, + 0xb6, 0xaa, 0x38, 0x0b, 0xbe, 0xfd, 0x7c, 0x74, 0xb9, 0x4f, 0x2f, 0xc9, 0x3a, 0x94, 0xa6, 0xf6, + 0x09, 0x9d, 0xb6, 0x80, 0x23, 0xf0, 0xc1, 0xf8, 0x25, 0xd8, 0x7c, 0x42, 0x43, 0x6d, 0x28, 0x03, + 0x93, 0x7e, 0xbd, 0xa0, 0x41, 0xc8, 0x7a, 0x15, 0x84, 0xb6, 0x1f, 0xca, 0x5e, 0xe5, 0xb0, 0x57, + 0x1c, 0x16, 0xf5, 0x8a, 0xba, 0x13, 0x49, 0x90, 0xe7, 0x04, 0x55, 0xea, 0x4e, 0x10, 0x6d, 0x1c, + 0x00, 0xd1, 0x2a, 0xde, 0xa5, 0xa1, 0xed, 0x4c, 0x03, 0xf2, 0x31, 0xd4, 0x43, 0xed, 0x75, 0xad, + 0xdc, 0xdd, 0xc2, 0xbd, 0x9a, 0x62, 0x4d, 0xad, 0x80, 0x19, 0xa3, 0x33, 0xce, 0xa1, 0xb2, 0x47, + 0xe9, 0x81, 0x33, 0x73, 0x42, 0xb2, 0x09, 0xa5, 0x53, 0xe7, 0x92, 0x4e, 0x78, 0xa3, 0x0a, 0xfb, + 0x37, 0x4c, 0x7c, 0x24, 0x77, 0x00, 0xf8, 0x0f, 0x6b, 0xa6, 0xb8, 0x74, 0xff, 0x86, 0x59, 0xe5, + 0xb0, 0xc3, 0xc0, 0x0e, 0xc9, 0x36, 0x94, 0xe7, 0xd4, 0x1f, 0x53, 0xc9, 0x0f, 0xfb, 0x37, 0x4c, + 0x09, 0xd8, 0x29, 0x43, 0x69, 0xca, 0x6a, 0x37, 0x7e, 0xaf, 0x04, 0xb5, 0x21, 0x75, 0x27, 0x72, + 0x24, 0x08, 0x14, 0xd9, 0x40, 0xf3, 0x97, 0xd5, 0x4d, 0xfe, 0x9b, 0xbc, 0x09, 0x35, 0x3e, 0x25, + 0x41, 0xe8, 0x3b, 0xee, 0x19, 0xae, 0x96, 0x9d, 0x7c, 0x2b, 0x67, 0x02, 0x03, 0x0f, 0x39, 0x94, + 0x34, 0xa1, 0x60, 0xcf, 0xe4, 0x6a, 0x61, 0x3f, 0xc9, 0x4d, 0xa8, 0xd8, 0xb3, 0x10, 0x9b, 0x57, + 0xe7, 0xe0, 0xb2, 0x3d, 0x0b, 0x79, 0xd3, 0xde, 0x80, 0xfa, 0xdc, 0xbe, 0x9a, 0x51, 0x37, 0x8c, + 0xd8, 0xac, 0x6e, 0xd6, 0x04, 0x8c, 0x33, 0xda, 0x23, 0x58, 0xd3, 0x49, 0xe4, 0xcb, 0x4b, 0xea, + 0xe5, 0xab, 0x1a, 0xb5, 0x68, 0xc3, 0x3b, 0xb0, 0x22, 0xcb, 0xf8, 0xd8, 0x1f, 0xce, 0x7e, 0x55, + 0x73, 0x59, 0x80, 0x65, 0x2f, 0xef, 0x41, 0xf3, 0xd4, 0x71, 0xed, 0xa9, 0x35, 0x9e, 0x86, 0x17, + 0xd6, 0x84, 0x4e, 0x43, 0x9b, 0x73, 0x62, 0xc9, 0x5c, 0xe6, 0xf0, 0xce, 0x34, 0xbc, 0xd8, 0x65, + 0x50, 0xf2, 0x1e, 0x54, 0x4f, 0x29, 0xb5, 0xf8, 0x60, 0xb5, 0x2a, 0xb1, 0x05, 0x2d, 0x67, 0xc8, + 0xac, 0x9c, 0xca, 0xb9, 0x7a, 0x0f, 0x9a, 0xde, 0x22, 0x3c, 0xf3, 0x1c, 0xf7, 0xcc, 0x1a, 0x9f, + 0xdb, 0xae, 0xe5, 0x4c, 0x38, 0x6f, 0x16, 0x77, 0xf2, 0x0f, 0x73, 0xe6, 0xb2, 0xc4, 0x75, 0xce, + 0x6d, 0xb7, 0x37, 0x21, 0x6f, 0xc3, 0xca, 0xd4, 0x0e, 0x42, 0xeb, 0xdc, 0x9b, 0x5b, 0xf3, 0xc5, + 0xc9, 0x33, 0x7a, 0xd5, 0x6a, 0xf0, 0x81, 0x68, 0x30, 0xf0, 0xbe, 0x37, 0x3f, 0xe2, 0x40, 0xc6, + 0x7a, 0xbc, 0x9d, 0xd8, 0x08, 0xc6, 0xd2, 0x0d, 0xb3, 0xca, 0x20, 0xf8, 0xd2, 0xaf, 0x60, 0x8d, + 0x4f, 0xcf, 0x78, 0x11, 0x84, 0xde, 0xcc, 0xf2, 0xe9, 0xd8, 0xf3, 0x27, 0x41, 0xab, 0xc6, 0x79, + 0xed, 0xbb, 0xa2, 0xb1, 0xda, 0x1c, 0x3f, 0xd8, 0xa5, 0x41, 0xd8, 0xe1, 0xc4, 0x26, 0xd2, 0x76, + 0xdd, 0xd0, 0xbf, 0x32, 0x57, 0x27, 0x49, 0x38, 0x79, 0x0f, 0x88, 0x3d, 0x9d, 0x7a, 0xcf, 0xad, + 0x80, 0x4e, 0x4f, 0x2d, 0x31, 0x88, 0xad, 0xe5, 0xbb, 0xb9, 0x7b, 0x15, 0xb3, 0xc9, 0x31, 0x43, + 0x3a, 0x3d, 0x3d, 0x42, 0x38, 0xf9, 0x18, 0xf8, 0x22, 0xb5, 0x4e, 0xa9, 0x1d, 0x2e, 0x7c, 0x1a, + 0xb4, 0x56, 0xee, 0x16, 0xee, 0x2d, 0x3f, 0x5a, 0x55, 0xe3, 0xc5, 0xc1, 0x3b, 0x4e, 0x68, 0xd6, + 0x19, 0x9d, 0x78, 0x0e, 0xb6, 0x77, 0x61, 0x33, 0xbb, 0x49, 0x8c, 0xa9, 0xd8, 0xa8, 0x30, 0x66, + 0x2c, 0x9a, 0xec, 0x27, 0x5b, 0xd9, 0x17, 0xf6, 0x74, 0x41, 0x39, 0x17, 0xd6, 0x4d, 0x7c, 0xf8, + 0x7e, 0xfe, 0xd3, 0x9c, 0xf1, 0xbb, 0x39, 0xa8, 0x63, 0x2f, 0x83, 0xb9, 0xe7, 0x06, 0x94, 0xbc, + 0x09, 0x0d, 0xc9, 0x0d, 0xd4, 0xf7, 0x3d, 0x5f, 0x48, 0x4b, 0xc9, 0x79, 0x5d, 0x06, 0x23, 0xdf, + 0x85, 0xa6, 0x24, 0x9a, 0xfb, 0xd4, 0x99, 0xd9, 0x67, 0xb2, 0x6a, 0xc9, 0x4a, 0x47, 0x02, 0x4c, + 0x3e, 0x88, 0xea, 0xf3, 0xbd, 0x45, 0x48, 0x39, 0xaf, 0xd7, 0x1e, 0xd5, 0x45, 0xf7, 0x4c, 0x06, + 0x53, 0xb5, 0xf3, 0xa7, 0x57, 0xe0, 0x73, 0xe3, 0x37, 0x73, 0x40, 0x58, 0xb3, 0x47, 0x1e, 0x56, + 0x10, 0x49, 0xa4, 0x58, 0xc9, 0xdc, 0x2b, 0xaf, 0x90, 0xfc, 0x8b, 0x56, 0x88, 0x01, 0x25, 0x6c, + 0x7b, 0x31, 0xa3, 0xed, 0x88, 0xfa, 0x71, 0xb1, 0x52, 0x68, 0x16, 0x8d, 0xff, 0x54, 0x80, 0x75, + 0xc6, 0xa7, 0x2e, 0x9d, 0xb6, 0xc7, 0x63, 0x3a, 0x57, 0x6b, 0xe7, 0x0e, 0xd4, 0x5c, 0x6f, 0x42, + 0x25, 0xc7, 0x62, 0xc3, 0x80, 0x81, 0x34, 0x76, 0x3d, 0xb7, 0x1d, 0x17, 0x1b, 0x8e, 0x83, 0x59, + 0xe5, 0x10, 0xde, 0xec, 0xb7, 0x61, 0x65, 0x4e, 0xdd, 0x89, 0xbe, 0x44, 0x0a, 0xc8, 0xf5, 0x02, + 0x2c, 0x56, 0xc7, 0x1d, 0xa8, 0x9d, 0x2e, 0x90, 0x8e, 0x09, 0x96, 0x22, 0xe7, 0x01, 0x10, 0xa0, + 0x36, 0xca, 0x97, 0xf9, 0x22, 0x38, 0xe7, 0xd8, 0x12, 0xc7, 0x96, 0xd9, 0x33, 0x43, 0xdd, 0x06, + 0x98, 0x2c, 0x82, 0x50, 0xac, 0x98, 0x25, 0x8e, 0xac, 0x32, 0x08, 0xae, 0x98, 0xef, 0xc1, 0xda, + 0xcc, 0xbe, 0xb4, 0x38, 0xef, 0x58, 0x8e, 0x6b, 0x9d, 0x4e, 0xb9, 0x50, 0x2f, 0x73, 0xba, 0xe6, + 0xcc, 0xbe, 0xfc, 0x82, 0x61, 0x7a, 0xee, 0x1e, 0x87, 0x33, 0xb1, 0x32, 0xc6, 0x91, 0xb0, 0x7c, + 0x1a, 0x50, 0xff, 0x82, 0x72, 0x49, 0x50, 0x34, 0x97, 0x05, 0xd8, 0x44, 0x28, 0x6b, 0xd1, 0x8c, + 0xf5, 0x3b, 0x9c, 0x8e, 0x71, 0xd9, 0x9b, 0xe5, 0x99, 0xe3, 0xee, 0x87, 0xd3, 0x31, 0xdb, 0xaf, + 0x98, 0x1c, 0x99, 0x53, 0xdf, 0x7a, 0xf6, 0x9c, 0xaf, 0xe1, 0x22, 0x97, 0x1b, 0x47, 0xd4, 0x7f, + 0xfa, 0x9c, 0xa9, 0x14, 0xe3, 0x80, 0x0b, 0x22, 0xfb, 0xaa, 0x55, 0xe3, 0x0b, 0xbc, 0x32, 0x0e, + 0x98, 0x08, 0xb2, 0xaf, 0xd8, 0x22, 0x64, 0xad, 0xb5, 0xf9, 0x2c, 0xd0, 0x09, 0xaf, 0x3e, 0xe0, + 0x12, 0xb5, 0xc1, 0x1b, 0xdb, 0x16, 0x08, 0xf6, 0x9e, 0x80, 0x71, 0xbd, 0x6c, 0xec, 0xe9, 0xd4, + 0x3e, 0x0b, 0xb8, 0x48, 0x69, 0x98, 0x75, 0x01, 0xdc, 0x63, 0x30, 0xe3, 0x4b, 0xd8, 0x48, 0xcc, + 0xad, 0x58, 0x33, 0x4c, 0x85, 0xe0, 0x10, 0x3e, 0xaf, 0x15, 0x53, 0x3c, 0x65, 0x4d, 0x5a, 0x3e, + 0x63, 0xd2, 0x8c, 0xdf, 0xca, 0x41, 0x5d, 0xd4, 0xcc, 0x95, 0x1d, 0xf2, 0x00, 0x88, 0x9c, 0xc5, + 0xf0, 0xd2, 0x99, 0x58, 0x27, 0x57, 0x21, 0x0d, 0x90, 0x69, 0xf6, 0x6f, 0x98, 0x4d, 0x81, 0x1b, + 0x5d, 0x3a, 0x93, 0x1d, 0x86, 0x21, 0xf7, 0xa1, 0x19, 0xa3, 0x0f, 0x42, 0x1f, 0x39, 0x7a, 0xff, + 0x86, 0xb9, 0xac, 0x51, 0x0f, 0x43, 0x9f, 0xad, 0x11, 0xa6, 0x4a, 0x2d, 0x42, 0xcb, 0x71, 0x27, + 0xf4, 0x92, 0xb3, 0x51, 0xc3, 0xac, 0x21, 0xac, 0xc7, 0x40, 0x3b, 0xcb, 0x50, 0xd7, 0xab, 0x33, + 0xce, 0xa0, 0x22, 0xf5, 0x30, 0xae, 0x88, 0x24, 0x9a, 0x64, 0x56, 0x43, 0xd5, 0x92, 0x9b, 0x50, + 0x89, 0xb7, 0xc0, 0x2c, 0x87, 0xaf, 0xfc, 0x62, 0xe3, 0x07, 0xd0, 0x3c, 0x60, 0xcc, 0xe3, 0x32, + 0x66, 0x15, 0x7a, 0xe5, 0x26, 0x2c, 0x69, 0x8b, 0xa6, 0x6a, 0x8a, 0x27, 0xb6, 0xe7, 0x9e, 0x7b, + 0x41, 0x28, 0xde, 0xc2, 0x7f, 0x1b, 0xbf, 0x97, 0x03, 0xd2, 0x0d, 0x42, 0x67, 0x66, 0x87, 0x74, + 0x8f, 0x2a, 0xb1, 0x30, 0x80, 0x3a, 0xab, 0x6d, 0xe4, 0xb5, 0x51, 0xd1, 0x43, 0x85, 0xe2, 0x5d, + 0xb1, 0x8c, 0xd3, 0x05, 0x1e, 0xe8, 0xd4, 0x28, 0xe6, 0x63, 0x15, 0xb0, 0x55, 0x16, 0xda, 0xfe, + 0x19, 0x0d, 0xb9, 0x7a, 0x28, 0xf4, 0x1a, 0x40, 0x10, 0x53, 0x0c, 0xb7, 0x7f, 0x08, 0xab, 0xa9, + 0x3a, 0x74, 0xb9, 0x5c, 0xcd, 0x90, 0xcb, 0x05, 0x5d, 0x2e, 0x5b, 0xb0, 0x16, 0x6b, 0x97, 0xe0, + 0xb4, 0x2d, 0x28, 0xb3, 0x05, 0xc1, 0x94, 0x83, 0x1c, 0x6a, 0xab, 0xa7, 0x94, 0x32, 0xf5, 0xfa, + 0x7d, 0x58, 0x3f, 0xa5, 0xd4, 0xb7, 0x43, 0x8e, 0xe4, 0x2b, 0x86, 0xcd, 0x90, 0xa8, 0x78, 0x55, + 0xe0, 0x86, 0x76, 0x78, 0x44, 0x7d, 0x36, 0x53, 0xc6, 0xff, 0xce, 0xc1, 0x0a, 0x93, 0xa0, 0x87, + 0xb6, 0x7b, 0x25, 0xc7, 0xe9, 0x20, 0x73, 0x9c, 0xee, 0x69, 0x9b, 0xa1, 0x46, 0xfd, 0x4d, 0x07, + 0xa9, 0x90, 0x1c, 0x24, 0x72, 0x17, 0xea, 0xb1, 0xb6, 0x96, 0x78, 0x5b, 0x21, 0x50, 0x8d, 0x8c, + 0x34, 0xd2, 0x25, 0x4d, 0x23, 0xfd, 0x93, 0x0f, 0xee, 0xdb, 0xd0, 0x8c, 0x3a, 0x23, 0x46, 0x96, + 0x40, 0x91, 0x31, 0xaa, 0xa8, 0x80, 0xff, 0x36, 0xfe, 0x71, 0x0e, 0x09, 0x3b, 0x9e, 0x13, 0x69, + 0xbd, 0x04, 0x8a, 0x4c, 0xcb, 0x96, 0x84, 0xec, 0xf7, 0xb5, 0x36, 0xc4, 0xb7, 0x30, 0x04, 0x37, + 0xa1, 0x12, 0x30, 0x15, 0xda, 0x9e, 0xe2, 0x28, 0x54, 0xcc, 0x32, 0x7b, 0x6e, 0x4f, 0xa7, 0xd1, + 0xe8, 0x94, 0x75, 0x7d, 0xfd, 0x1d, 0x58, 0xd5, 0xda, 0xfc, 0x82, 0xde, 0xf5, 0x81, 0x1c, 0x38, + 0x41, 0x78, 0xec, 0x06, 0x73, 0x4d, 0xc9, 0xbb, 0x05, 0x55, 0x26, 0x8d, 0x59, 0x7b, 0x03, 0xa1, + 0xd1, 0x33, 0xf1, 0xcc, 0x5a, 0x1b, 0x70, 0xa4, 0x7d, 0x29, 0x90, 0x79, 0x81, 0xb4, 0x2f, 0x39, + 0xd2, 0xf8, 0x14, 0xd6, 0x62, 0xf5, 0x89, 0x57, 0xbf, 0x01, 0xa5, 0x45, 0x78, 0xe9, 0x49, 0x35, + 0xbe, 0x26, 0xb8, 0x89, 0x19, 0xa1, 0x26, 0x62, 0x8c, 0xcf, 0x61, 0xb5, 0x4f, 0x9f, 0x8b, 0x05, + 0x2f, 0x1b, 0xf2, 0x36, 0x14, 0x5f, 0x62, 0x98, 0x72, 0xbc, 0xf1, 0x00, 0x88, 0x5e, 0x58, 0xbc, + 0x55, 0xb3, 0x53, 0x73, 0x31, 0x3b, 0xd5, 0x78, 0x1b, 0xc8, 0xd0, 0x39, 0x73, 0x0f, 0x69, 0x10, + 0xd8, 0x67, 0x4a, 0x44, 0x34, 0xa1, 0x30, 0x0b, 0xce, 0x84, 0x3c, 0x63, 0x3f, 0x8d, 0x0f, 0x61, + 0x2d, 0x46, 0x27, 0x2a, 0x7e, 0x0d, 0xaa, 0x81, 0x73, 0xe6, 0x72, 0x25, 0x4c, 0x54, 0x1d, 0x01, + 0x8c, 0x3d, 0x58, 0xff, 0x82, 0xfa, 0xce, 0xe9, 0xd5, 0xcb, 0xaa, 0x8f, 0xd7, 0x93, 0x4f, 0xd6, + 0xd3, 0x85, 0x8d, 0x44, 0x3d, 0xe2, 0xf5, 0xc8, 0xd4, 0x62, 0x26, 0x2b, 0x26, 0x3e, 0x68, 0x32, + 0x32, 0xaf, 0xcb, 0x48, 0xe3, 0x18, 0x48, 0xc7, 0x73, 0x5d, 0x3a, 0x0e, 0x8f, 0x28, 0xf5, 0x65, + 0x63, 0xde, 0xd5, 0x38, 0xb8, 0xf6, 0x68, 0x4b, 0x8c, 0x6c, 0x52, 0xf0, 0x0a, 0xd6, 0x26, 0x50, + 0x9c, 0x53, 0x7f, 0xc6, 0x2b, 0xae, 0x98, 0xfc, 0xb7, 0xb1, 0x01, 0x6b, 0xb1, 0x6a, 0xb1, 0x6d, + 0xc6, 0x43, 0xd8, 0xd8, 0x75, 0x82, 0x71, 0xfa, 0x85, 0x5b, 0x50, 0x9e, 0x2f, 0x4e, 0xac, 0xb8, + 0x0c, 0x7f, 0x4a, 0xaf, 0x8c, 0x16, 0x6c, 0x26, 0x4b, 0x88, 0xba, 0x7e, 0x2d, 0x07, 0xc5, 0xfd, + 0xd1, 0x41, 0x87, 0x6c, 0x43, 0xc5, 0x71, 0xc7, 0xde, 0x8c, 0x29, 0x69, 0xd8, 0x67, 0xf5, 0x7c, + 0xed, 0xb2, 0xbb, 0x05, 0x55, 0xae, 0xdb, 0x31, 0xf3, 0x5a, 0xa8, 0x49, 0x15, 0x06, 0x38, 0xf0, + 0xc6, 0xcf, 0x98, 0x5d, 0x4f, 0x2f, 0xe7, 0x8e, 0xcf, 0x2d, 0x77, 0x69, 0x99, 0x16, 0x51, 0x2f, + 0x88, 0x10, 0xc2, 0x40, 0xfd, 0xb5, 0x3c, 0x10, 0xb1, 0x33, 0x77, 0x3c, 0x37, 0x08, 0x7d, 0xdb, + 0x71, 0xc3, 0x20, 0xae, 0x79, 0xe4, 0x12, 0x9a, 0xc7, 0x3d, 0x68, 0xf2, 0xdd, 0x5e, 0x68, 0x3d, + 0x5c, 0x58, 0xe7, 0x23, 0xcd, 0x47, 0xa8, 0x3d, 0x4c, 0x68, 0xbf, 0x05, 0xcb, 0x91, 0xc2, 0xa5, + 0xdc, 0x26, 0x45, 0xb3, 0xae, 0x94, 0x2e, 0x21, 0xda, 0xd9, 0xa2, 0x93, 0x9a, 0x84, 0xb2, 0x0e, + 0x51, 0xb7, 0x5b, 0x9d, 0xd9, 0x97, 0x47, 0x54, 0xaa, 0x77, 0xdc, 0x4e, 0x34, 0xa0, 0x21, 0x15, + 0x2a, 0xa4, 0x44, 0x3d, 0xaf, 0x26, 0xb4, 0x2a, 0x4e, 0x93, 0xad, 0x1e, 0x2d, 0x65, 0xab, 0x47, + 0xc6, 0xbf, 0xaf, 0x42, 0x59, 0x0c, 0x03, 0x2a, 0x3b, 0xa1, 0x73, 0x41, 0x23, 0x65, 0x87, 0x3d, + 0x31, 0x15, 0xca, 0xa7, 0x33, 0x2f, 0x54, 0x3a, 0x2e, 0xb2, 0x62, 0x1d, 0x81, 0x42, 0xcb, 0xd5, + 0xf4, 0x2c, 0xf4, 0xf6, 0x14, 0x90, 0x68, 0xac, 0x6b, 0x3f, 0xb7, 0xa0, 0x2c, 0xd5, 0xa5, 0xa2, + 0x32, 0x03, 0x97, 0xc6, 0xa8, 0xe0, 0x6e, 0x43, 0x65, 0x6c, 0xcf, 0xed, 0xb1, 0x13, 0x5e, 0x09, + 0x69, 0xa9, 0x9e, 0x59, 0xed, 0x53, 0x6f, 0x6c, 0x4f, 0xad, 0x13, 0x7b, 0x6a, 0xbb, 0x63, 0x2a, + 0xdc, 0x28, 0x75, 0x0e, 0xdc, 0x41, 0x18, 0xf9, 0x0e, 0x2c, 0x8b, 0x76, 0x4a, 0x2a, 0xf4, 0xa6, + 0x88, 0xd6, 0x4b, 0x32, 0xa6, 0x8f, 0x7b, 0x33, 0x36, 0x2f, 0xa7, 0x14, 0x35, 0xd7, 0x82, 0x59, + 0x45, 0xc8, 0x1e, 0xe5, 0xbd, 0x15, 0xe8, 0xe7, 0xc8, 0x41, 0x55, 0x7c, 0x15, 0x02, 0xbf, 0x44, + 0xef, 0x47, 0x5a, 0x7d, 0x2d, 0x68, 0xea, 0xeb, 0xbb, 0xb0, 0xba, 0x70, 0x03, 0x1a, 0x86, 0x53, + 0x3a, 0x51, 0x6d, 0xa9, 0x71, 0xa2, 0xa6, 0x42, 0xc8, 0xe6, 0x3c, 0x80, 0x35, 0xf4, 0xff, 0x04, + 0x76, 0xe8, 0x05, 0xe7, 0x4e, 0x60, 0x05, 0xcc, 0xa8, 0x44, 0x0f, 0xc1, 0x2a, 0x47, 0x0d, 0x05, + 0x66, 0x88, 0x56, 0xe5, 0x56, 0x82, 0xde, 0xa7, 0x63, 0xea, 0x5c, 0xd0, 0x09, 0x57, 0x6d, 0x0b, + 0xe6, 0x46, 0xac, 0x8c, 0x29, 0x90, 0xdc, 0x4e, 0x59, 0xcc, 0xac, 0xc5, 0x7c, 0x62, 0x33, 0xfd, + 0x6e, 0x19, 0xed, 0x07, 0x77, 0x31, 0x3b, 0x46, 0x08, 0x79, 0x08, 0x52, 0x79, 0x15, 0x3c, 0xb3, + 0x12, 0x13, 0xeb, 0x6c, 0xcd, 0x9a, 0x75, 0x41, 0x81, 0xba, 0xf5, 0x1d, 0x7d, 0xb1, 0x34, 0x19, + 0x87, 0x71, 0x3b, 0x2b, 0x5a, 0x30, 0x2d, 0x28, 0xcf, 0x7d, 0xe7, 0xc2, 0x0e, 0x69, 0x6b, 0x15, + 0x77, 0x38, 0xf1, 0xc8, 0x84, 0xa4, 0xe3, 0x3a, 0xa1, 0x63, 0x87, 0x9e, 0xdf, 0x22, 0x1c, 0x17, + 0x01, 0xc8, 0x7d, 0x58, 0xe5, 0x7c, 0x12, 0x84, 0x76, 0xb8, 0x08, 0x84, 0xe2, 0xbe, 0xc6, 0x19, + 0x8a, 0x9b, 0x1e, 0x43, 0x0e, 0xe7, 0xba, 0x3b, 0xf9, 0x04, 0x36, 0x91, 0x35, 0x52, 0x4b, 0x73, + 0x9d, 0x0d, 0x07, 0x6f, 0xd1, 0x1a, 0xa7, 0xe8, 0xc4, 0xd7, 0xe8, 0x67, 0xb0, 0x25, 0xd8, 0x25, + 0x55, 0x72, 0x43, 0x95, 0x5c, 0x47, 0x92, 0x44, 0xd1, 0x07, 0xb0, 0xca, 0x9a, 0xe6, 0x8c, 0x2d, + 0x51, 0x03, 0x5b, 0x15, 0x9b, 0xac, 0x17, 0xbc, 0xd0, 0x0a, 0x22, 0x4d, 0x8e, 0x7b, 0x4a, 0xaf, + 0xc8, 0x0f, 0x60, 0x05, 0xd9, 0x87, 0x5b, 0xa7, 0x7c, 0xf3, 0xdb, 0xe6, 0x9b, 0xdf, 0x86, 0x18, + 0xdc, 0x8e, 0xc2, 0xf2, 0xfd, 0x6f, 0x79, 0x1c, 0x7b, 0x66, 0x4b, 0x63, 0xea, 0x9c, 0xd2, 0xd0, + 0x99, 0xd1, 0xd6, 0x16, 0x32, 0x9b, 0x7c, 0x66, 0xab, 0x76, 0x31, 0xe7, 0x98, 0x16, 0x8a, 0x4a, + 0x7c, 0xe2, 0x7c, 0x3c, 0xf5, 0x02, 0x2a, 0x3d, 0x87, 0xad, 0x9b, 0x62, 0x41, 0x32, 0xa0, 0x54, + 0xc1, 0x99, 0x1d, 0x83, 0x36, 0xa3, 0xf2, 0xef, 0xde, 0xe2, 0x8c, 0xd1, 0x40, 0xd3, 0x51, 0xfa, + 0x78, 0x99, 0xba, 0x73, 0x6e, 0x3f, 0x97, 0x42, 0xf5, 0x35, 0x2e, 0x4d, 0x80, 0x81, 0x84, 0x3b, + 0x70, 0x0f, 0x56, 0xc5, 0x2c, 0x44, 0xc2, 0xb4, 0x75, 0x9b, 0x6f, 0x43, 0x37, 0x65, 0x1f, 0x53, + 0xd2, 0xd6, 0x6c, 0xe2, 0xbc, 0x68, 0xf2, 0x77, 0x1f, 0x88, 0x9c, 0x14, 0xad, 0xa2, 0xd7, 0x5f, + 0x56, 0xd1, 0xaa, 0x98, 0xa6, 0x08, 0x64, 0xfc, 0x4e, 0x0e, 0xb5, 0x16, 0x41, 0x1d, 0x68, 0xf6, + 0x3a, 0xca, 0x35, 0xcb, 0x73, 0xa7, 0x57, 0x42, 0xd4, 0x01, 0x82, 0x06, 0xee, 0x94, 0xcb, 0x1a, + 0xc7, 0xd5, 0x49, 0x70, 0x83, 0xac, 0x4b, 0x20, 0x27, 0xba, 0x03, 0xb5, 0xf9, 0xe2, 0x64, 0xea, + 0x8c, 0x91, 0xa4, 0x80, 0xb5, 0x20, 0x88, 0x13, 0xbc, 0x01, 0x75, 0xc1, 0xeb, 0x48, 0x51, 0xe4, + 0x14, 0x35, 0x01, 0xe3, 0x24, 0x7c, 0x03, 0xa6, 0x3e, 0x17, 0x76, 0x75, 0x93, 0xff, 0x36, 0x76, + 0x60, 0x3d, 0xde, 0x68, 0xa1, 0x1d, 0xdc, 0x87, 0x8a, 0x90, 0xa4, 0xd2, 0x93, 0xb5, 0x1c, 0x1f, + 0x0d, 0x53, 0xe1, 0x8d, 0xff, 0x50, 0x82, 0x35, 0x39, 0x46, 0x6c, 0xb2, 0x87, 0x8b, 0xd9, 0xcc, + 0xf6, 0x33, 0x44, 0x74, 0xee, 0xc5, 0x22, 0x3a, 0x9f, 0x12, 0xd1, 0x71, 0x57, 0x06, 0x4a, 0xf8, + 0xb8, 0x2b, 0x83, 0x71, 0x17, 0x5a, 0x97, 0xba, 0xc3, 0xbc, 0x21, 0xc0, 0x23, 0x74, 0xcc, 0xa7, + 0x36, 0x94, 0x52, 0xc6, 0x86, 0xa2, 0x6f, 0x07, 0x4b, 0x89, 0xed, 0xe0, 0x0d, 0x40, 0x36, 0x96, + 0xfc, 0x58, 0x46, 0x83, 0x93, 0xc3, 0x04, 0x43, 0xbe, 0x03, 0x2b, 0x49, 0x09, 0x8c, 0xa2, 0x7e, + 0x39, 0x43, 0xfe, 0x3a, 0x33, 0xca, 0x55, 0x0a, 0x8d, 0xb8, 0x2a, 0xe4, 0xaf, 0x33, 0xa3, 0x07, + 0x1c, 0x23, 0xe9, 0xbb, 0x00, 0xf8, 0x6e, 0xbe, 0x8c, 0x81, 0x2f, 0xe3, 0xb7, 0x13, 0x9c, 0xa9, + 0x8d, 0xfa, 0x03, 0xf6, 0xb0, 0xf0, 0x29, 0x5f, 0xd7, 0x55, 0x5e, 0x92, 0x2f, 0xe9, 0x4f, 0x60, + 0xd9, 0x9b, 0x53, 0xd7, 0x8a, 0xa4, 0x60, 0x8d, 0x57, 0xd5, 0x14, 0x55, 0xf5, 0x24, 0xdc, 0x6c, + 0x30, 0x3a, 0xf5, 0x48, 0x3e, 0xc3, 0x41, 0xa6, 0x5a, 0xc9, 0xfa, 0x35, 0x25, 0x97, 0x39, 0x61, + 0x54, 0xf4, 0x43, 0xa8, 0xf9, 0x34, 0xf0, 0xa6, 0x0b, 0xf4, 0xbe, 0x37, 0x38, 0x1f, 0x49, 0x77, + 0xa4, 0xa9, 0x30, 0xa6, 0x4e, 0x65, 0xfc, 0x7a, 0x0e, 0x6a, 0x5a, 0x1f, 0xc8, 0x06, 0xac, 0x76, + 0x06, 0x83, 0xa3, 0xae, 0xd9, 0x1e, 0xf5, 0xbe, 0xe8, 0x5a, 0x9d, 0x83, 0xc1, 0xb0, 0xdb, 0xbc, + 0xc1, 0xc0, 0x07, 0x83, 0x4e, 0xfb, 0xc0, 0xda, 0x1b, 0x98, 0x1d, 0x09, 0xce, 0x91, 0x4d, 0x20, + 0x66, 0xf7, 0x70, 0x30, 0xea, 0xc6, 0xe0, 0x79, 0xd2, 0x84, 0xfa, 0x8e, 0xd9, 0x6d, 0x77, 0xf6, + 0x05, 0xa4, 0x40, 0xd6, 0xa1, 0xb9, 0x77, 0xdc, 0xdf, 0xed, 0xf5, 0x9f, 0x58, 0x9d, 0x76, 0xbf, + 0xd3, 0x3d, 0xe8, 0xee, 0x36, 0x8b, 0xa4, 0x01, 0xd5, 0xf6, 0x4e, 0xbb, 0xbf, 0x3b, 0xe8, 0x77, + 0x77, 0x9b, 0x25, 0xe3, 0xbf, 0xe7, 0x00, 0xa2, 0x86, 0x32, 0xb9, 0x1a, 0x35, 0x55, 0x8f, 0x76, + 0x6d, 0xa4, 0x3a, 0x85, 0x72, 0xd5, 0x8f, 0x3d, 0x93, 0x47, 0x50, 0xf6, 0x16, 0xe1, 0xd8, 0x9b, + 0xa1, 0xa2, 0xbe, 0xfc, 0xa8, 0x95, 0x2a, 0x37, 0x40, 0xbc, 0x29, 0x09, 0x63, 0x11, 0xad, 0xc2, + 0xcb, 0x22, 0x5a, 0xf1, 0xd0, 0x19, 0xea, 0x75, 0x5a, 0xe8, 0xec, 0x36, 0x40, 0xf0, 0x9c, 0xd2, + 0x39, 0x77, 0xc6, 0x88, 0x55, 0x50, 0xe5, 0x90, 0x11, 0xb3, 0xe3, 0xfe, 0x30, 0x07, 0x1b, 0x9c, + 0x97, 0x26, 0x49, 0x21, 0x76, 0x17, 0x6a, 0x63, 0xcf, 0x9b, 0x33, 0xd3, 0x3f, 0xd2, 0xd7, 0x74, + 0x10, 0x13, 0x50, 0x28, 0x90, 0x4f, 0x3d, 0x7f, 0x4c, 0x85, 0x0c, 0x03, 0x0e, 0xda, 0x63, 0x10, + 0xb6, 0x86, 0xc4, 0x22, 0x44, 0x0a, 0x14, 0x61, 0x35, 0x84, 0x21, 0xc9, 0x26, 0x2c, 0x9d, 0xf8, + 0xd4, 0x1e, 0x9f, 0x0b, 0xe9, 0x25, 0x9e, 0xc8, 0x77, 0x23, 0xa7, 0xd4, 0x98, 0xad, 0x89, 0x29, + 0xc5, 0xc6, 0x57, 0xcc, 0x15, 0x01, 0xef, 0x08, 0x30, 0xdb, 0xe7, 0xed, 0x13, 0xdb, 0x9d, 0x78, + 0x2e, 0x9d, 0x08, 0x2b, 0x37, 0x02, 0x18, 0x47, 0xb0, 0x99, 0xec, 0x9f, 0x90, 0x77, 0x1f, 0x6b, + 0xf2, 0x0e, 0xcd, 0xcb, 0xed, 0xeb, 0xd7, 0x98, 0x26, 0xfb, 0xfe, 0x62, 0x11, 0x8a, 0xcc, 0xdc, + 0xb8, 0xd6, 0x32, 0xd1, 0xed, 0xc7, 0x42, 0x2a, 0xce, 0xc9, 0x7d, 0x5f, 0xa8, 0x80, 0x89, 0xc9, + 0xe2, 0x10, 0xae, 0x78, 0x29, 0xb4, 0x4f, 0xc7, 0x17, 0x42, 0xf3, 0x46, 0xb4, 0x49, 0xc7, 0x17, + 0xdc, 0x9c, 0xb7, 0x43, 0x2c, 0x8b, 0xf2, 0xaa, 0x1c, 0xd8, 0x21, 0x2f, 0x29, 0x50, 0xbc, 0x5c, + 0x59, 0xa1, 0x78, 0xa9, 0x16, 0x94, 0x1d, 0xf7, 0xc4, 0x5b, 0xb8, 0x13, 0x2e, 0x9e, 0x2a, 0xa6, + 0x7c, 0xe4, 0x61, 0x55, 0x2e, 0x49, 0xd9, 0xd6, 0x8e, 0xd2, 0xa8, 0xc2, 0x00, 0x23, 0xb6, 0xb9, + 0x7f, 0x00, 0xd5, 0xe0, 0xca, 0x1d, 0xeb, 0x32, 0x68, 0x5d, 0x8c, 0x0f, 0xeb, 0xfd, 0x83, 0xe1, + 0x95, 0x3b, 0xe6, 0x1c, 0x5f, 0x09, 0xc4, 0x2f, 0xf2, 0x18, 0x2a, 0x2a, 0x10, 0x81, 0x3b, 0xc8, + 0x4d, 0xbd, 0x84, 0x8c, 0x3e, 0xa0, 0xbf, 0x47, 0x91, 0x92, 0xf7, 0x61, 0x89, 0x47, 0x0b, 0x82, + 0x56, 0x9d, 0x17, 0x92, 0x46, 0x25, 0x6b, 0x06, 0x8f, 0x68, 0xd2, 0x09, 0x8f, 0x1c, 0x98, 0x82, + 0x6c, 0xfb, 0x29, 0x34, 0x62, 0x75, 0xe9, 0xfe, 0x9b, 0x06, 0xfa, 0x6f, 0xde, 0xd2, 0xfd, 0x37, + 0xd1, 0x4e, 0x26, 0x8a, 0xe9, 0xfe, 0x9c, 0x1f, 0x42, 0x45, 0x76, 0x85, 0x89, 0x8c, 0xe3, 0xfe, + 0xd3, 0xfe, 0xe0, 0xcb, 0xbe, 0x35, 0xfc, 0xaa, 0xdf, 0x69, 0xde, 0x20, 0x2b, 0x50, 0x6b, 0x77, + 0xb8, 0x14, 0xe2, 0x80, 0x1c, 0x23, 0x39, 0x6a, 0x0f, 0x87, 0x0a, 0x92, 0x37, 0xf6, 0xa0, 0x99, + 0x6c, 0x29, 0xe3, 0xc9, 0x50, 0xc2, 0x44, 0x2c, 0x25, 0x02, 0x30, 0x3b, 0x1c, 0xc3, 0x23, 0x68, + 0xe5, 0xe0, 0x83, 0xf1, 0x18, 0x9a, 0x6c, 0x5f, 0x66, 0x43, 0xa5, 0x47, 0x49, 0xa7, 0x4c, 0x73, + 0xd6, 0xe3, 0x29, 0x15, 0xb3, 0x86, 0x30, 0xfe, 0x2a, 0xe3, 0x63, 0x58, 0xd5, 0x8a, 0x45, 0x7e, + 0x13, 0xb6, 0xd7, 0x27, 0xfd, 0x26, 0xdc, 0x4a, 0x46, 0x8c, 0xb1, 0x05, 0x1b, 0xec, 0xb1, 0x7b, + 0x41, 0xdd, 0x70, 0xb8, 0x38, 0xc1, 0xe0, 0xba, 0xe3, 0xb9, 0xcc, 0x7a, 0xae, 0x2a, 0xcc, 0xf5, + 0x4c, 0xfe, 0x40, 0xb8, 0x58, 0x50, 0xaa, 0x6d, 0x6b, 0x6f, 0xe0, 0x05, 0x1f, 0xf0, 0xbf, 0x31, + 0x57, 0x4b, 0x55, 0x81, 0xd8, 0xb0, 0x1e, 0x75, 0xbb, 0xa6, 0x35, 0xe8, 0x1f, 0xf4, 0xfa, 0x4c, + 0xb6, 0xb3, 0x61, 0xe5, 0x80, 0xbd, 0x3d, 0x0e, 0xc9, 0x19, 0x4d, 0x58, 0x7e, 0x42, 0xc3, 0x9e, + 0x7b, 0xea, 0x89, 0xc1, 0x30, 0xfe, 0xfc, 0x12, 0xac, 0x28, 0x50, 0xe4, 0xaa, 0xb9, 0xa0, 0x7e, + 0xe0, 0x78, 0x2e, 0x37, 0x37, 0xaa, 0xa6, 0x7c, 0x64, 0xd2, 0x49, 0x18, 0x59, 0x5c, 0x4b, 0x58, + 0xe7, 0x58, 0x61, 0x96, 0x71, 0x15, 0xe1, 0x1d, 0x58, 0x71, 0x26, 0xd4, 0x0d, 0x9d, 0xf0, 0xca, + 0x8a, 0x39, 0x89, 0x97, 0x25, 0x58, 0xa8, 0x09, 0xeb, 0x50, 0xb2, 0xa7, 0x8e, 0x2d, 0x93, 0x16, + 0xf0, 0x81, 0x41, 0xc7, 0xde, 0xd4, 0xf3, 0xb9, 0xd9, 0x51, 0x35, 0xf1, 0x81, 0x3c, 0x84, 0x75, + 0x66, 0x02, 0xe9, 0x9e, 0x7b, 0x2e, 0x60, 0xd0, 0x5f, 0x4d, 0xdc, 0xc5, 0xec, 0x28, 0xf2, 0xde, + 0x33, 0x0c, 0x53, 0x0e, 0x58, 0x09, 0xa1, 0x0d, 0xaa, 0x02, 0xe8, 0x54, 0x58, 0x75, 0x17, 0xb3, + 0x36, 0xc7, 0x28, 0xfa, 0x47, 0xb0, 0xc1, 0xe8, 0x95, 0xfe, 0xa8, 0x4a, 0xac, 0xf0, 0x12, 0xac, + 0xb2, 0x9e, 0xc0, 0xa9, 0x32, 0xb7, 0xa0, 0x8a, 0xad, 0x62, 0x2c, 0x51, 0x42, 0x97, 0x03, 0x6f, + 0x0a, 0xf5, 0x83, 0x54, 0x7e, 0x01, 0xda, 0xf1, 0xc9, 0xfc, 0x02, 0x2d, 0x43, 0xa1, 0x92, 0xcc, + 0x50, 0x78, 0x04, 0x1b, 0x27, 0x8c, 0x47, 0xcf, 0xa9, 0x3d, 0xa1, 0xbe, 0x15, 0x71, 0x3e, 0x5a, + 0x8b, 0x6b, 0x0c, 0xb9, 0xcf, 0x71, 0x6a, 0xa1, 0x30, 0x45, 0x8e, 0xc9, 0x0d, 0x3a, 0xb1, 0x42, + 0xcf, 0xe2, 0xfa, 0x1d, 0x97, 0x40, 0x15, 0xb3, 0x81, 0xe0, 0x91, 0xd7, 0x61, 0xc0, 0x38, 0xdd, + 0x99, 0x6f, 0xcf, 0xcf, 0x85, 0x2d, 0xa7, 0xe8, 0x9e, 0x30, 0x20, 0x79, 0x0d, 0xca, 0x6c, 0x4d, + 0xb8, 0x14, 0xc3, 0xb5, 0x68, 0x25, 0x49, 0x10, 0x79, 0x0b, 0x96, 0xf8, 0x3b, 0x82, 0x56, 0x93, + 0x2f, 0x88, 0x7a, 0x24, 0xe9, 0x1d, 0xd7, 0x14, 0x38, 0xa6, 0x2d, 0x2f, 0x7c, 0x07, 0xc5, 0x50, + 0xd5, 0xe4, 0xbf, 0xc9, 0x8f, 0x34, 0x99, 0xb6, 0xc6, 0xcb, 0xbe, 0x25, 0xca, 0x26, 0x58, 0xf1, + 0x3a, 0xf1, 0xf6, 0xad, 0x4a, 0xab, 0x1f, 0x17, 0x2b, 0xb5, 0x66, 0xdd, 0x68, 0xf1, 0xb4, 0x0a, + 0x93, 0x8e, 0xbd, 0x0b, 0xea, 0x5f, 0xc5, 0xd6, 0x48, 0x0e, 0xb6, 0x52, 0xa8, 0x28, 0x3a, 0xeb, + 0x0b, 0xb8, 0x35, 0xf3, 0x26, 0x72, 0x4f, 0xaf, 0x4b, 0xe0, 0xa1, 0x37, 0x61, 0xba, 0xc7, 0xaa, + 0x22, 0x3a, 0x75, 0x5c, 0x27, 0x38, 0xa7, 0x13, 0xb1, 0xb5, 0x37, 0x25, 0x62, 0x4f, 0xc0, 0x99, + 0x02, 0x3d, 0xf7, 0xbd, 0x33, 0xb5, 0xd3, 0xe5, 0x4c, 0xf5, 0x6c, 0x7c, 0x02, 0x25, 0x9c, 0x41, + 0xb6, 0x50, 0xf8, 0xfc, 0xe6, 0xc4, 0x42, 0xe1, 0xd0, 0x16, 0x94, 0x5d, 0x1a, 0x3e, 0xf7, 0xfc, + 0x67, 0x32, 0xd4, 0x23, 0x1e, 0x8d, 0x9f, 0x72, 0xbf, 0xa3, 0xca, 0x8f, 0x41, 0xdf, 0x01, 0x63, + 0x61, 0x64, 0xc1, 0xe0, 0xdc, 0x16, 0xae, 0xd0, 0x0a, 0x07, 0x0c, 0xcf, 0xed, 0x14, 0x0b, 0xe7, + 0xd3, 0x29, 0x32, 0x6f, 0xc1, 0xb2, 0xcc, 0xc8, 0x09, 0xac, 0x29, 0x3d, 0x0d, 0xc5, 0x92, 0xac, + 0x8b, 0x74, 0x9c, 0xe0, 0x80, 0x9e, 0x86, 0xc6, 0x21, 0xac, 0x8a, 0x45, 0x33, 0x98, 0x53, 0xf9, + 0xea, 0x4f, 0xb3, 0x8c, 0x9a, 0xda, 0xa3, 0xb5, 0xb8, 0xb6, 0x80, 0x7a, 0x59, 0xcc, 0xd2, 0x31, + 0x7e, 0x12, 0x39, 0x00, 0x99, 0x2e, 0x21, 0xea, 0x13, 0xa6, 0x85, 0x8c, 0x90, 0xc9, 0x40, 0xb3, + 0x32, 0x60, 0x9c, 0x09, 0x1b, 0x9d, 0x60, 0x31, 0x1e, 0xcb, 0x4c, 0xa9, 0x8a, 0x29, 0x1f, 0x8d, + 0x7f, 0x9b, 0x83, 0x35, 0x5e, 0x99, 0x34, 0xca, 0xc4, 0x4e, 0xf1, 0x33, 0x37, 0x92, 0xcd, 0x8f, + 0xae, 0xc0, 0xe1, 0xc3, 0x37, 0x8f, 0x3e, 0x14, 0x53, 0xd1, 0x87, 0xef, 0x42, 0x73, 0x42, 0xa7, + 0x0e, 0x67, 0x25, 0xa9, 0x0f, 0xa1, 0x02, 0xba, 0x22, 0xe1, 0xc2, 0x49, 0x60, 0xfc, 0xd5, 0x1c, + 0xac, 0xa2, 0xba, 0xc5, 0xdd, 0x2e, 0x62, 0xa0, 0x3e, 0x97, 0xfe, 0x05, 0x21, 0x4e, 0x45, 0x9f, + 0x22, 0x35, 0x84, 0x43, 0x91, 0x78, 0xff, 0x86, 0xf0, 0x3b, 0x08, 0x28, 0xf9, 0x3e, 0x37, 0x24, + 0x5d, 0x8b, 0x03, 0x85, 0x1a, 0x7d, 0x33, 0x43, 0xc1, 0x53, 0xc5, 0x99, 0x95, 0xe9, 0x72, 0xd0, + 0x4e, 0x05, 0x96, 0xd0, 0x89, 0x65, 0xec, 0x41, 0x23, 0xf6, 0x9a, 0x58, 0x30, 0xa4, 0x8e, 0xc1, + 0x90, 0x54, 0x70, 0x32, 0x9f, 0x0e, 0x4e, 0x5e, 0xc1, 0x9a, 0x49, 0xed, 0xc9, 0xd5, 0x9e, 0xe7, + 0x1f, 0x05, 0x27, 0xe1, 0x1e, 0xea, 0xb0, 0x6c, 0x0f, 0x52, 0x11, 0xf7, 0x58, 0xc4, 0x41, 0x06, + 0x5e, 0xa5, 0x17, 0xe5, 0x3b, 0xb0, 0x1c, 0x85, 0xe6, 0x35, 0xaf, 0x75, 0x43, 0x45, 0xe7, 0xb9, + 0xf3, 0x9a, 0xd9, 0xfb, 0xc1, 0x49, 0x28, 0xfc, 0xd6, 0xfc, 0xb7, 0xf1, 0xbf, 0x8a, 0x40, 0x18, + 0x37, 0x27, 0x18, 0x26, 0x91, 0x54, 0x90, 0x4f, 0x25, 0x15, 0x3c, 0x04, 0xa2, 0x11, 0xc8, 0x5c, + 0x87, 0x82, 0xca, 0x75, 0x68, 0x46, 0xb4, 0x22, 0xd5, 0xe1, 0x21, 0xac, 0x0b, 0x83, 0x20, 0xde, + 0x54, 0x64, 0x0d, 0x82, 0x96, 0x41, 0xac, 0xbd, 0x32, 0xa1, 0x40, 0x3a, 0x9a, 0x0b, 0x98, 0x50, + 0x20, 0xfd, 0x41, 0x1a, 0x03, 0x2e, 0xbd, 0x94, 0x01, 0xcb, 0x29, 0x06, 0xd4, 0x7c, 0x83, 0x95, + 0xb8, 0x6f, 0x30, 0xe5, 0xe5, 0x46, 0xed, 0x37, 0xe6, 0xe5, 0xbe, 0x07, 0x4d, 0xe9, 0x27, 0x52, + 0x1e, 0x48, 0xcc, 0x04, 0x12, 0x3e, 0xe0, 0x8e, 0xf4, 0x41, 0xc6, 0xc2, 0x5e, 0xb5, 0x44, 0xd8, + 0xeb, 0x5d, 0x58, 0x0d, 0x18, 0xff, 0x5a, 0x0b, 0x57, 0xa4, 0x03, 0xd2, 0x09, 0x37, 0xa7, 0x2b, + 0x66, 0x93, 0x23, 0x8e, 0x23, 0x78, 0xda, 0xa3, 0xd6, 0xc8, 0xf0, 0xa8, 0x3d, 0x8e, 0x22, 0xec, + 0xc1, 0xb9, 0x33, 0xe3, 0x8a, 0x4f, 0x94, 0xe2, 0x26, 0x06, 0x78, 0x78, 0xee, 0xcc, 0x4c, 0x99, + 0xce, 0xc1, 0x1e, 0x48, 0x07, 0xee, 0x88, 0xfe, 0x64, 0x64, 0x62, 0xe0, 0x28, 0xac, 0x70, 0x4d, + 0x75, 0x1b, 0xc9, 0x0e, 0x13, 0x49, 0x19, 0x89, 0x41, 0x61, 0x95, 0xa0, 0x13, 0xb7, 0xa9, 0x0f, + 0xca, 0xa1, 0x7d, 0x89, 0x6e, 0xff, 0xff, 0x99, 0x83, 0x26, 0x63, 0xbb, 0xd8, 0x8a, 0xfe, 0x0c, + 0xb8, 0xec, 0x79, 0xc5, 0x05, 0x5d, 0x63, 0xb4, 0x72, 0x3d, 0x7f, 0x02, 0x7c, 0x81, 0x5a, 0xde, + 0x9c, 0xba, 0x62, 0x39, 0xb7, 0xe2, 0xcb, 0x39, 0x12, 0xd9, 0xfb, 0x37, 0xd0, 0x5e, 0x63, 0x10, + 0xf2, 0x19, 0x54, 0xd9, 0x3a, 0xe0, 0x4c, 0x29, 0x12, 0x44, 0xb7, 0x95, 0x0d, 0x9e, 0x5a, 0x92, + 0xac, 0xe8, 0x5c, 0x3c, 0x66, 0xe5, 0x60, 0x14, 0x33, 0x72, 0x30, 0x34, 0x79, 0xb1, 0x0f, 0xf0, + 0x94, 0x5e, 0x1d, 0x78, 0x63, 0xee, 0x0d, 0xb9, 0x0d, 0xc0, 0x96, 0xce, 0xa9, 0x3d, 0x73, 0x84, + 0x1f, 0xb0, 0x64, 0x56, 0x9f, 0xd1, 0xab, 0x3d, 0x0e, 0x60, 0x7c, 0xc3, 0xd0, 0x91, 0xd0, 0x28, + 0x99, 0x95, 0x67, 0xf4, 0x0a, 0x25, 0x86, 0x05, 0x8d, 0xa7, 0xf4, 0x6a, 0x97, 0xa2, 0x62, 0xee, + 0xf9, 0x8c, 0x67, 0x7d, 0xfb, 0x39, 0xd3, 0xc4, 0x63, 0xf9, 0x13, 0x35, 0xdf, 0x7e, 0xfe, 0x94, + 0x5e, 0xc9, 0x5c, 0x8e, 0x32, 0xc3, 0x4f, 0xbd, 0xb1, 0x50, 0x25, 0xa4, 0xeb, 0x25, 0x6a, 0x94, + 0xb9, 0xf4, 0x8c, 0xff, 0x36, 0xfe, 0x38, 0x07, 0x0d, 0xd6, 0x7e, 0xbe, 0x0b, 0x70, 0x0e, 0x11, + 0x09, 0x85, 0xb9, 0x28, 0xa1, 0xf0, 0x91, 0x10, 0xa2, 0xb8, 0xa5, 0xe4, 0xaf, 0xdf, 0x52, 0xf8, + 0xdc, 0xe0, 0x7e, 0xf2, 0x01, 0x54, 0x51, 0x0a, 0x30, 0xb1, 0x52, 0x88, 0x4d, 0x70, 0xac, 0x43, + 0x66, 0x85, 0x93, 0x3d, 0xc5, 0xfc, 0x25, 0xcd, 0xcb, 0x8d, 0x43, 0x5c, 0xf5, 0x95, 0x6f, 0x3b, + 0x63, 0x1a, 0x4a, 0xd7, 0xe4, 0x2f, 0xe9, 0x2e, 0xe4, 0xa5, 0xa4, 0x0b, 0xd9, 0x70, 0xa1, 0xc2, + 0xa6, 0x9a, 0x77, 0x36, 0xa3, 0xd2, 0x5c, 0x56, 0xa5, 0x4c, 0xf1, 0xb0, 0xd9, 0x1e, 0xc4, 0xe4, + 0x6a, 0x5e, 0x28, 0x1e, 0x76, 0x40, 0x59, 0x45, 0xac, 0xe1, 0xae, 0x67, 0x71, 0x9f, 0xac, 0xf0, + 0x56, 0x56, 0xcc, 0xaa, 0xeb, 0x1d, 0x21, 0xc0, 0xf8, 0xb3, 0x39, 0xa8, 0x69, 0xeb, 0x91, 0x3b, + 0xe9, 0xd5, 0x70, 0xe2, 0xe2, 0x8d, 0xaf, 0x80, 0xd8, 0x7c, 0xec, 0xdf, 0x30, 0x1b, 0xe3, 0xd8, + 0x04, 0x3d, 0x10, 0xac, 0xcc, 0x4b, 0xe6, 0x63, 0x9e, 0x21, 0xd9, 0x2f, 0xc9, 0xbf, 0xec, 0xf7, + 0xce, 0x12, 0x14, 0x19, 0xa9, 0xf1, 0x39, 0xac, 0x6a, 0xcd, 0x40, 0xcf, 0xc9, 0xab, 0x0e, 0x80, + 0xf1, 0xcb, 0xaa, 0x30, 0x7b, 0x07, 0x46, 0x96, 0x65, 0xaa, 0x18, 0x9d, 0xe0, 0xb8, 0x88, 0x94, + 0x34, 0x04, 0xf1, 0x91, 0x79, 0xd5, 0xf4, 0xa5, 0x5f, 0x81, 0x35, 0xad, 0xf6, 0x3d, 0xc7, 0xb5, + 0xa7, 0xce, 0x4f, 0xb9, 0xfa, 0x11, 0x38, 0x67, 0x6e, 0xa2, 0x7e, 0x04, 0x7d, 0xa3, 0xfa, 0xff, + 0x5a, 0x1e, 0xd6, 0xc5, 0x0b, 0x78, 0xf2, 0xaf, 0xc3, 0x74, 0xca, 0xc3, 0xe0, 0x8c, 0x7c, 0x06, + 0x0d, 0x36, 0x36, 0x96, 0x4f, 0xcf, 0x9c, 0x20, 0xa4, 0x32, 0xa2, 0x9d, 0x21, 0x46, 0x99, 0x6a, + 0xc1, 0x48, 0x4d, 0x41, 0x49, 0x3e, 0x87, 0x1a, 0x2f, 0x8a, 0x9e, 0x29, 0x31, 0x11, 0xad, 0x74, + 0x41, 0x1c, 0xe8, 0xfd, 0x1b, 0x26, 0x04, 0xd1, 0xb0, 0x7f, 0x0e, 0x35, 0x3e, 0x87, 0x17, 0x7c, + 0x20, 0x13, 0x92, 0x2c, 0x35, 0xd0, 0xac, 0xf0, 0x3c, 0x1a, 0xf6, 0x36, 0x34, 0x50, 0x96, 0x89, + 0x71, 0x12, 0x49, 0x85, 0xdb, 0xe9, 0xe2, 0x72, 0x24, 0x59, 0xe3, 0xe7, 0xda, 0xf3, 0x4e, 0x15, + 0xca, 0xa1, 0xef, 0x9c, 0x9d, 0x51, 0xdf, 0xd8, 0x54, 0x43, 0xc3, 0x84, 0x34, 0x1d, 0x86, 0x74, + 0xce, 0x8c, 0x05, 0xe3, 0x5f, 0xe6, 0xa0, 0x26, 0xc4, 0xee, 0xcf, 0x1c, 0x46, 0xdf, 0x4e, 0xf8, + 0x30, 0xab, 0x9a, 0xcb, 0xf2, 0x1d, 0x58, 0x99, 0x31, 0xcb, 0x86, 0x59, 0xde, 0xb1, 0x18, 0xfa, + 0xb2, 0x04, 0x0b, 0xa5, 0xfd, 0x01, 0xac, 0x71, 0x1d, 0x3e, 0xb0, 0x42, 0x67, 0x6a, 0x49, 0xa4, + 0xc8, 0x80, 0x5f, 0x45, 0xd4, 0xc8, 0x99, 0x1e, 0x0a, 0x04, 0x53, 0x65, 0x83, 0xd0, 0x3e, 0xa3, + 0x62, 0xe9, 0xe3, 0x03, 0xb3, 0x96, 0x12, 0x46, 0xb7, 0xb4, 0x96, 0xfe, 0xcf, 0x2a, 0x6c, 0xa5, + 0x50, 0xc2, 0x5a, 0x52, 0x41, 0xd3, 0xa9, 0x33, 0x3b, 0xf1, 0x94, 0xd3, 0x3e, 0xa7, 0x05, 0x4d, + 0x0f, 0x18, 0x46, 0x3a, 0xed, 0x29, 0x6c, 0x48, 0x86, 0xe4, 0x5e, 0x77, 0x65, 0x97, 0xe7, 0xb9, + 0xd5, 0xf8, 0x41, 0x7c, 0x8f, 0x4b, 0xbe, 0x4e, 0xc2, 0x75, 0x45, 0x6d, 0x6d, 0x9e, 0x82, 0x05, + 0xe4, 0x4f, 0x41, 0x4b, 0xf1, 0xbd, 0x30, 0x22, 0x34, 0x27, 0x03, 0x7b, 0xd3, 0x7b, 0x2f, 0x79, + 0x53, 0xcc, 0x1d, 0xca, 0x35, 0xb9, 0x4d, 0xb9, 0x64, 0xb0, 0x42, 0xf5, 0xae, 0x0b, 0x78, 0x5d, + 0xbe, 0x8b, 0x1b, 0x05, 0xe9, 0x37, 0x16, 0x5f, 0xa9, 0x6f, 0xdc, 0xd5, 0x1b, 0x7b, 0xad, 0x79, + 0x4b, 0x54, 0xac, 0x50, 0xfa, 0x7b, 0xcf, 0x61, 0xf3, 0xb9, 0xed, 0x84, 0xb2, 0x8f, 0x9a, 0x8f, + 0xa3, 0xc4, 0xdf, 0xf7, 0xe8, 0x25, 0xef, 0xfb, 0x12, 0x0b, 0xc7, 0xcc, 0xa4, 0xf5, 0xe7, 0x69, + 0x60, 0xb0, 0xfd, 0x77, 0x0a, 0xb0, 0x1c, 0xaf, 0x85, 0x09, 0x16, 0xb1, 0x17, 0x49, 0xed, 0x57, + 0xa8, 0xe4, 0x22, 0xa0, 0xd4, 0x47, 0xad, 0x37, 0x1d, 0xea, 0xca, 0x67, 0x84, 0xba, 0xf4, 0x08, + 0x53, 0xe1, 0x65, 0x09, 0x07, 0xc5, 0x57, 0x4a, 0x38, 0x28, 0x65, 0x25, 0x1c, 0x7c, 0x78, 0x6d, + 0x84, 0x1a, 0xfd, 0xc4, 0x99, 0xd1, 0xe9, 0xc7, 0xd7, 0x47, 0xa7, 0x51, 0x97, 0xbe, 0x2e, 0x32, + 0xad, 0xc5, 0xd5, 0x2b, 0xd7, 0xc4, 0x85, 0xb4, 0x48, 0x7b, 0x46, 0x64, 0xba, 0xfa, 0x0d, 0x22, + 0xd3, 0xdb, 0x7f, 0x9c, 0x03, 0x92, 0x5e, 0x1d, 0xe4, 0x09, 0x46, 0x11, 0x5d, 0x3a, 0x15, 0x92, + 0xfb, 0x7b, 0xaf, 0xb6, 0xc2, 0x24, 0x43, 0xc8, 0xd2, 0xe4, 0x7d, 0x58, 0xd3, 0xcf, 0xe9, 0xe8, + 0x3e, 0x84, 0x86, 0x49, 0x74, 0x54, 0xe4, 0x0d, 0xd3, 0xb2, 0x3b, 0x8a, 0x2f, 0xcd, 0xee, 0x28, + 0xbd, 0x34, 0xbb, 0x63, 0x29, 0x9e, 0xdd, 0xb1, 0xfd, 0x6f, 0x72, 0xb0, 0x96, 0xc1, 0xc4, 0xdf, + 0x5e, 0x9f, 0x19, 0xef, 0xc5, 0xc4, 0x5a, 0x5e, 0xf0, 0x9e, 0x2e, 0xd1, 0x0e, 0xa4, 0x07, 0x95, + 0x4d, 0x45, 0x20, 0x76, 0xaa, 0xfb, 0x2f, 0x93, 0x2e, 0x51, 0x09, 0x53, 0x2f, 0xbe, 0xfd, 0xf7, + 0xf2, 0x50, 0xd3, 0x90, 0x6c, 0x14, 0x91, 0x65, 0xb5, 0xdc, 0x42, 0x54, 0x1c, 0xb9, 0x07, 0xe4, + 0x0e, 0x88, 0x38, 0x11, 0xe2, 0x71, 0x71, 0x09, 0x2d, 0x91, 0x13, 0x3c, 0x80, 0x35, 0x19, 0xe1, + 0xa5, 0x51, 0xba, 0xb1, 0xd8, 0x6b, 0x44, 0xb0, 0x5e, 0x34, 0x92, 0xd3, 0xbf, 0x2f, 0x8d, 0xd3, + 0x68, 0xee, 0xb4, 0x88, 0xd9, 0xaa, 0x48, 0x13, 0x10, 0x93, 0xc8, 0xf8, 0xfc, 0x03, 0xd8, 0x50, + 0x79, 0x02, 0xb1, 0x12, 0x18, 0x97, 0x21, 0x32, 0x1f, 0x40, 0x2b, 0xf2, 0x23, 0xb8, 0x9d, 0x68, + 0x53, 0xa2, 0x28, 0xe6, 0xc5, 0xdf, 0x8c, 0xb5, 0x4e, 0xaf, 0x61, 0xfb, 0x4f, 0x43, 0x23, 0x26, + 0x28, 0xbf, 0xbd, 0x29, 0x4f, 0x7a, 0x9d, 0x70, 0x44, 0x75, 0xaf, 0xd3, 0xf6, 0xff, 0x28, 0x00, + 0x49, 0xcb, 0xea, 0x9f, 0x67, 0x13, 0xd2, 0x8c, 0x59, 0xc8, 0x60, 0xcc, 0xff, 0x67, 0xfa, 0x43, + 0xe4, 0xfc, 0xd4, 0xc2, 0xf4, 0xb8, 0x38, 0x9b, 0x0a, 0x21, 0x5b, 0xf1, 0x49, 0x32, 0x99, 0xa9, + 0x12, 0x3b, 0x6a, 0xa6, 0x29, 0x50, 0x89, 0x9c, 0xa6, 0x63, 0x58, 0xb2, 0xdd, 0xf1, 0xb9, 0xe7, + 0x0b, 0x39, 0xf8, 0x0b, 0xdf, 0x78, 0xfb, 0x7c, 0xd0, 0xe6, 0xe5, 0xb9, 0xd6, 0x66, 0x8a, 0xca, + 0x8c, 0x0f, 0xa0, 0xa6, 0x81, 0x49, 0x15, 0x4a, 0x07, 0xbd, 0xc3, 0x9d, 0x41, 0xf3, 0x06, 0x69, + 0x40, 0xd5, 0xec, 0x76, 0x06, 0x5f, 0x74, 0xcd, 0xee, 0x6e, 0x33, 0x47, 0x2a, 0x50, 0x3c, 0x18, + 0x0c, 0x47, 0xcd, 0xbc, 0xb1, 0x0d, 0x2d, 0x51, 0x63, 0x3a, 0x0c, 0xf4, 0x9b, 0x45, 0xe5, 0xbc, + 0xe4, 0x48, 0x61, 0xc1, 0x7f, 0x08, 0x75, 0x5d, 0xbd, 0x11, 0x1c, 0x91, 0xc8, 0x14, 0x61, 0xb6, + 0xbb, 0xa7, 0xc9, 0xea, 0x0e, 0x60, 0x9e, 0xc0, 0x44, 0x15, 0xcb, 0xc7, 0xf4, 0xd6, 0x8c, 0x80, + 0x2b, 0x37, 0x7e, 0x62, 0x6c, 0xf8, 0xff, 0xc1, 0x72, 0x3c, 0xe4, 0x21, 0x24, 0x52, 0x96, 0x3d, + 0xca, 0x4a, 0xc7, 0x62, 0x20, 0xe4, 0x47, 0xd0, 0x4c, 0x86, 0x4c, 0x84, 0xf2, 0x7c, 0x4d, 0xf9, + 0x15, 0x27, 0x1e, 0x45, 0x21, 0xfb, 0xb0, 0x9e, 0xa5, 0xe0, 0x71, 0xfe, 0xb8, 0xde, 0x87, 0x41, + 0xd2, 0x4a, 0x1c, 0xf9, 0x54, 0x84, 0xce, 0x4a, 0x7c, 0xfa, 0xdf, 0x8a, 0xbf, 0x5f, 0x1b, 0xec, + 0x07, 0xf8, 0x4f, 0x0b, 0xa2, 0x5d, 0x00, 0x44, 0x30, 0xd2, 0x84, 0xfa, 0xe0, 0xa8, 0xdb, 0xb7, + 0x3a, 0xfb, 0xed, 0x7e, 0xbf, 0x7b, 0xd0, 0xbc, 0x41, 0x08, 0x2c, 0xf3, 0x64, 0x87, 0x5d, 0x05, + 0xcb, 0x31, 0x98, 0x08, 0x61, 0x4a, 0x58, 0x9e, 0xac, 0x43, 0xb3, 0xd7, 0x4f, 0x40, 0x0b, 0xa4, + 0x05, 0xeb, 0x47, 0x5d, 0xcc, 0x8f, 0x88, 0xd5, 0x5b, 0x64, 0x46, 0x83, 0xe8, 0x2e, 0x33, 0x1a, + 0xbe, 0xb4, 0xa7, 0x53, 0x1a, 0x8a, 0x75, 0x20, 0x75, 0xe9, 0xbf, 0x9e, 0x83, 0x8d, 0x04, 0x22, + 0x8a, 0x3b, 0xa0, 0x26, 0x1d, 0xd7, 0xa1, 0xeb, 0x1c, 0x28, 0x57, 0xd3, 0xbb, 0xb0, 0xaa, 0xdc, + 0x60, 0x89, 0x5d, 0xa9, 0xa9, 0x10, 0x92, 0xf8, 0x7d, 0x58, 0xd3, 0xbc, 0x69, 0x09, 0x59, 0x41, + 0x34, 0x94, 0x28, 0x60, 0x6c, 0xa9, 0xd3, 0x37, 0x89, 0x56, 0x4f, 0x60, 0x33, 0x89, 0x88, 0x22, + 0x8b, 0xf1, 0xf6, 0xca, 0x47, 0xf2, 0x30, 0xc1, 0x08, 0xf1, 0xd6, 0xea, 0x13, 0x2e, 0x5f, 0xff, + 0xdb, 0x4b, 0x40, 0x7e, 0xb2, 0xa0, 0xfe, 0x15, 0x3f, 0xf5, 0x15, 0xbc, 0x2c, 0xb5, 0x59, 0x3a, + 0x62, 0xf2, 0xaf, 0x74, 0xb2, 0x33, 0xeb, 0x64, 0x65, 0xf1, 0xe5, 0x27, 0x2b, 0x4b, 0x2f, 0x3b, + 0x59, 0xf9, 0x26, 0x34, 0x9c, 0x33, 0xd7, 0x63, 0xa2, 0x90, 0x69, 0xc2, 0x41, 0x6b, 0xe9, 0x6e, + 0xe1, 0x5e, 0xdd, 0xac, 0x0b, 0x20, 0xd3, 0x83, 0x03, 0xf2, 0x79, 0x44, 0x44, 0x27, 0x67, 0xfc, + 0x74, 0xb1, 0x2e, 0x04, 0xbb, 0x93, 0x33, 0x2a, 0xfc, 0x4e, 0xdc, 0xd2, 0x90, 0x85, 0x19, 0x3c, + 0x20, 0x6f, 0xc1, 0x72, 0xe0, 0x2d, 0x98, 0x61, 0x21, 0x87, 0x01, 0x43, 0x8b, 0x75, 0x84, 0x1e, + 0xc9, 0x40, 0xf3, 0xda, 0x22, 0xa0, 0xd6, 0xcc, 0x09, 0x02, 0xa6, 0x9e, 0x8d, 0x3d, 0x37, 0xf4, + 0xbd, 0xa9, 0x88, 0x16, 0xae, 0x2e, 0x02, 0x7a, 0x88, 0x98, 0x0e, 0x22, 0xc8, 0x47, 0x51, 0x93, + 0xe6, 0xb6, 0xe3, 0x07, 0x2d, 0xe0, 0x4d, 0x92, 0x3d, 0xe5, 0xfa, 0xbb, 0xed, 0xf8, 0xaa, 0x2d, + 0xec, 0x21, 0x48, 0x9c, 0xf8, 0xac, 0x25, 0x4f, 0x7c, 0xfe, 0x6a, 0xf6, 0x89, 0x4f, 0xcc, 0x6f, + 0x7a, 0x28, 0xaa, 0x4e, 0x4f, 0xf1, 0x37, 0x3a, 0xf8, 0x99, 0x3e, 0xc8, 0xba, 0xfc, 0x4d, 0x0e, + 0xb2, 0xae, 0x64, 0x1d, 0x64, 0xfd, 0x00, 0x6a, 0xfc, 0x88, 0xa1, 0x75, 0xce, 0xb3, 0x1c, 0x31, + 0xfa, 0xd9, 0xd4, 0xcf, 0x20, 0xee, 0x3b, 0x6e, 0x68, 0x82, 0x2f, 0x7f, 0x06, 0xe9, 0x33, 0xa5, + 0xab, 0x3f, 0xc7, 0x33, 0xa5, 0xe2, 0x28, 0xe4, 0x03, 0xa8, 0xc8, 0x79, 0x22, 0x04, 0x8a, 0xa7, + 0xbe, 0x37, 0x93, 0x11, 0x17, 0xf6, 0x9b, 0x2c, 0x43, 0x3e, 0xf4, 0x44, 0xe1, 0x7c, 0xe8, 0x19, + 0xff, 0x3f, 0xd4, 0x34, 0x56, 0x23, 0x6f, 0xa0, 0xdb, 0x92, 0xd9, 0x66, 0x42, 0xb7, 0xc4, 0x51, + 0xac, 0x0a, 0x68, 0x6f, 0xc2, 0xe4, 0xcd, 0xc4, 0xf1, 0x29, 0x3f, 0xfd, 0x6d, 0xf9, 0xf4, 0x82, + 0xfa, 0x81, 0x8c, 0x80, 0x35, 0x15, 0xc2, 0x44, 0xb8, 0xf1, 0x2b, 0xb0, 0x16, 0x9b, 0x5b, 0x21, + 0x22, 0xde, 0x82, 0x25, 0x3e, 0x6e, 0x32, 0xcd, 0x22, 0x7e, 0xb6, 0x53, 0xe0, 0xf8, 0x49, 0x77, + 0x0c, 0xde, 0x59, 0x73, 0xdf, 0x3b, 0xe1, 0x2f, 0xc9, 0x99, 0x35, 0x01, 0x3b, 0xf2, 0xbd, 0x13, + 0xe3, 0x0f, 0x0a, 0x50, 0xd8, 0xf7, 0xe6, 0x7a, 0x66, 0x64, 0x2e, 0x95, 0x19, 0x29, 0x0c, 0x4e, + 0x4b, 0x19, 0x94, 0x42, 0x67, 0xe7, 0x61, 0x2b, 0x69, 0x54, 0xde, 0x83, 0x65, 0x26, 0x27, 0x42, + 0x8f, 0x59, 0xec, 0xcf, 0x6d, 0x1f, 0x15, 0x62, 0x4c, 0x34, 0xae, 0xdb, 0xb3, 0x70, 0xe4, 0xed, + 0x21, 0x9c, 0xac, 0x43, 0x41, 0x99, 0x2f, 0x1c, 0xcd, 0x1e, 0xc9, 0x26, 0x2c, 0xf1, 0x73, 0x0c, + 0x57, 0x22, 0x4d, 0x40, 0x3c, 0x91, 0xef, 0xc1, 0x5a, 0xbc, 0x5e, 0x14, 0x45, 0x42, 0x37, 0xd2, + 0x2b, 0xe6, 0x32, 0xe9, 0x26, 0x30, 0x39, 0x82, 0x34, 0x22, 0x1d, 0xe9, 0x94, 0x52, 0x8e, 0xd2, + 0x84, 0x5e, 0x25, 0x26, 0xf4, 0xee, 0x40, 0x2d, 0x9c, 0x5e, 0x58, 0x73, 0xfb, 0x6a, 0xea, 0xd9, + 0x13, 0xb1, 0xbe, 0x21, 0x9c, 0x5e, 0x1c, 0x21, 0x84, 0xbc, 0x0f, 0x30, 0x9b, 0xcf, 0xc5, 0xda, + 0xe3, 0xa1, 0x98, 0x88, 0x95, 0x0f, 0x8f, 0x8e, 0x90, 0xe5, 0xcc, 0xea, 0x6c, 0x3e, 0xc7, 0x9f, + 0x64, 0x17, 0x96, 0x33, 0x4f, 0x68, 0xdf, 0x96, 0xf9, 0xe6, 0xde, 0xfc, 0x41, 0xc6, 0xe2, 0x6c, + 0x8c, 0x75, 0xd8, 0xf6, 0x8f, 0x80, 0xfc, 0x09, 0xcf, 0x49, 0x8f, 0xa0, 0xaa, 0xda, 0xa7, 0x1f, + 0x33, 0xe6, 0x07, 0x69, 0x6a, 0xb1, 0x63, 0xc6, 0xed, 0xc9, 0xc4, 0x67, 0x72, 0x11, 0x37, 0x4c, + 0x25, 0xf2, 0x41, 0xdb, 0x31, 0xc5, 0x49, 0x0d, 0xe3, 0x3f, 0xe7, 0xa0, 0x84, 0x67, 0x9e, 0xdf, + 0x86, 0x15, 0xa4, 0x57, 0x59, 0xa6, 0x22, 0xb9, 0x00, 0xf7, 0xdd, 0x91, 0x48, 0x30, 0x65, 0xcb, + 0x42, 0xbb, 0x07, 0x22, 0xaf, 0x66, 0x5e, 0xbb, 0x0b, 0xe2, 0x0e, 0x54, 0xd5, 0xab, 0x35, 0xd6, + 0xa9, 0xc8, 0x37, 0x93, 0xd7, 0xa1, 0x78, 0xee, 0xcd, 0xa5, 0xe7, 0x07, 0xa2, 0x91, 0x34, 0x39, + 0x3c, 0x6a, 0x0b, 0x7b, 0x47, 0x74, 0x82, 0xa4, 0x20, 0xda, 0xc2, 0x5e, 0xc2, 0xd9, 0x20, 0xdd, + 0xc7, 0xa5, 0x8c, 0x3e, 0x1e, 0xc3, 0x0a, 0x93, 0x03, 0x5a, 0x86, 0xc3, 0xf5, 0x9b, 0xe6, 0x77, + 0x99, 0x86, 0x37, 0x9e, 0x2e, 0x26, 0x54, 0xf7, 0xbd, 0xf1, 0x94, 0x41, 0x01, 0x97, 0x9a, 0xb5, + 0xf1, 0xdb, 0x39, 0x94, 0x2f, 0xac, 0x5e, 0x72, 0x0f, 0x8a, 0xae, 0xcc, 0x86, 0x88, 0xf4, 0x38, + 0x75, 0xa2, 0x89, 0xd1, 0x99, 0x9c, 0x82, 0x4d, 0x1d, 0xcf, 0x21, 0xd0, 0x6b, 0x6f, 0x98, 0x35, + 0x77, 0x31, 0x53, 0xae, 0xab, 0xef, 0xc8, 0x6e, 0x25, 0xdc, 0x3e, 0xd8, 0x7b, 0xb5, 0x4c, 0x1f, + 0x68, 0xb9, 0x87, 0xc5, 0xd8, 0x8e, 0x29, 0xb5, 0xc0, 0xc9, 0x19, 0xd5, 0x72, 0x0e, 0x7f, 0x37, + 0x0f, 0x8d, 0x58, 0x8b, 0x78, 0xf2, 0x25, 0xdb, 0x00, 0x30, 0xee, 0x24, 0xe6, 0x1b, 0x18, 0x48, + 0x28, 0xea, 0xda, 0x38, 0xe5, 0x63, 0xe3, 0xa4, 0xd2, 0x99, 0x0a, 0x7a, 0x3a, 0xd3, 0x43, 0xa8, + 0x46, 0xf7, 0x7f, 0xc4, 0x9b, 0xc4, 0xde, 0x27, 0xcf, 0x75, 0x45, 0x44, 0x51, 0x02, 0x54, 0x49, + 0x4f, 0x80, 0xfa, 0x81, 0x96, 0x2f, 0xb3, 0xc4, 0xab, 0x31, 0xb2, 0x46, 0xf4, 0xe7, 0x92, 0x2d, + 0x63, 0x7c, 0x0e, 0x35, 0xad, 0xf1, 0x7a, 0xce, 0x49, 0x2e, 0x96, 0x73, 0xa2, 0xce, 0x65, 0xe6, + 0xa3, 0x73, 0x99, 0xc6, 0x9f, 0xcb, 0x43, 0x83, 0xad, 0x2f, 0xc7, 0x3d, 0x3b, 0xf2, 0xa6, 0xce, + 0x98, 0xc7, 0xa1, 0xd4, 0x0a, 0x13, 0x8a, 0x96, 0x5c, 0x67, 0x62, 0x89, 0xa1, 0x9e, 0xa5, 0x1f, + 0x4a, 0x47, 0x21, 0xad, 0x0e, 0xa5, 0x1b, 0xd0, 0x60, 0x82, 0x91, 0x47, 0x94, 0xa2, 0x5b, 0x44, + 0xcc, 0xda, 0x29, 0xa5, 0x3b, 0x76, 0x80, 0x12, 0xf2, 0x7b, 0xb0, 0xc6, 0x68, 0xf8, 0x79, 0xdc, + 0x99, 0x33, 0x9d, 0x3a, 0xd1, 0x91, 0xad, 0x82, 0xd9, 0x3c, 0xa5, 0xd4, 0xb4, 0x43, 0x7a, 0xc8, + 0x10, 0xe2, 0xd2, 0x91, 0xca, 0xc4, 0x09, 0xec, 0x93, 0x28, 0x45, 0x56, 0x3d, 0xf3, 0x38, 0xb7, + 0x88, 0xd3, 0x46, 0x8b, 0xac, 0x68, 0xd6, 0x66, 0x18, 0xa5, 0xe5, 0xe5, 0x13, 0x9c, 0x54, 0x4e, + 0x72, 0x92, 0xf1, 0xcf, 0xf2, 0x50, 0xd3, 0xd8, 0xf2, 0x55, 0x76, 0xd7, 0xdb, 0xa9, 0xb8, 0x61, + 0x55, 0x0f, 0x11, 0xbe, 0x19, 0x7f, 0x65, 0x41, 0x9d, 0xeb, 0xd1, 0x19, 0xf8, 0x16, 0x54, 0xd9, + 0xaa, 0xfb, 0x80, 0xbb, 0x60, 0xc5, 0xa5, 0x3f, 0x1c, 0x70, 0xb4, 0x38, 0x91, 0xc8, 0x47, 0x1c, + 0x59, 0x8a, 0x90, 0x8f, 0x18, 0xf2, 0x45, 0x79, 0xfd, 0x9f, 0x40, 0x5d, 0xd4, 0xca, 0xe7, 0x94, + 0x77, 0x37, 0x5a, 0xf5, 0xb1, 0xf9, 0x36, 0x6b, 0xf8, 0x3a, 0x9c, 0x7c, 0x51, 0xf0, 0x91, 0x2c, + 0x58, 0x79, 0x59, 0xc1, 0x47, 0xf8, 0x60, 0xec, 0xa9, 0xa3, 0x12, 0x3c, 0x53, 0x4d, 0xca, 0xb1, + 0xf7, 0x61, 0x4d, 0x8a, 0xab, 0x85, 0x6b, 0xbb, 0xae, 0xb7, 0x70, 0xc7, 0x54, 0x1e, 0xcd, 0x24, + 0x02, 0x75, 0x1c, 0x61, 0x8c, 0x89, 0x3a, 0xe7, 0x8f, 0x19, 0x6f, 0xf7, 0xa1, 0x84, 0x7a, 0x39, + 0x2a, 0x1f, 0xd9, 0x82, 0x0b, 0x49, 0xc8, 0x3d, 0x28, 0xa1, 0x7a, 0x9e, 0xbf, 0x56, 0xd8, 0x20, + 0x81, 0xd1, 0x06, 0xc2, 0x0a, 0x1e, 0xd2, 0xd0, 0x77, 0xc6, 0x41, 0x74, 0xea, 0xb3, 0xc4, 0xec, + 0x4f, 0x7c, 0x57, 0xe4, 0xb9, 0x8d, 0x28, 0xb9, 0x8d, 0x8a, 0x34, 0x6c, 0x63, 0x5a, 0x8b, 0xd5, + 0x21, 0xd4, 0xa5, 0x29, 0x6c, 0x9e, 0xd0, 0xf0, 0x39, 0xa5, 0xae, 0xcb, 0x94, 0xa1, 0x31, 0x75, + 0x43, 0xdf, 0x9e, 0xb2, 0x49, 0xc2, 0x1e, 0x3c, 0x4e, 0xd5, 0x1a, 0xf9, 0x40, 0x76, 0xa2, 0x82, + 0x1d, 0x55, 0x0e, 0x65, 0xc7, 0xc6, 0x49, 0x16, 0x6e, 0xfb, 0x97, 0x61, 0xfb, 0xfa, 0x42, 0x19, + 0x27, 0xbe, 0xef, 0xc5, 0xa5, 0x8a, 0x8a, 0x03, 0x4e, 0x3d, 0x3b, 0xc4, 0xd6, 0xe8, 0x92, 0xa5, + 0x0f, 0x35, 0x0d, 0x13, 0xed, 0xfd, 0x39, 0xae, 0xdc, 0xe1, 0x03, 0xdb, 0x91, 0x5c, 0xcf, 0x9f, + 0xf1, 0xb8, 0xdb, 0xc4, 0x8a, 0x6a, 0xcf, 0x99, 0x2b, 0x11, 0x9c, 0xe7, 0x58, 0x18, 0x0f, 0x60, + 0x85, 0x6b, 0xf6, 0xda, 0x46, 0xf7, 0x22, 0x65, 0xd0, 0x58, 0x07, 0xd2, 0x47, 0xd9, 0xa5, 0x67, + 0xff, 0xfd, 0xbb, 0x02, 0xd4, 0x34, 0x30, 0xdb, 0x8d, 0x78, 0xca, 0xa4, 0x35, 0x71, 0xec, 0x19, + 0x95, 0x41, 0xce, 0x86, 0xd9, 0xe0, 0xd0, 0x5d, 0x01, 0x64, 0x7b, 0xb1, 0x7d, 0x71, 0x66, 0x79, + 0x8b, 0xd0, 0x9a, 0xd0, 0x33, 0x9f, 0xca, 0x56, 0xd6, 0xed, 0x8b, 0xb3, 0xc1, 0x22, 0xdc, 0xe5, + 0x30, 0x46, 0xc5, 0x64, 0x89, 0x46, 0x25, 0x32, 0xe8, 0x66, 0xf6, 0x65, 0x44, 0x25, 0x52, 0x4d, + 0x91, 0x33, 0x8b, 0x2a, 0xd5, 0x14, 0xad, 0xc5, 0xe4, 0x06, 0x5a, 0x4a, 0x6f, 0xa0, 0x1f, 0xc1, + 0x26, 0x6e, 0xa0, 0x42, 0x34, 0x5b, 0x89, 0x95, 0xbc, 0xce, 0xb1, 0xa2, 0x93, 0x9a, 0xda, 0xdb, + 0x64, 0x3d, 0x90, 0x62, 0x29, 0x70, 0x7e, 0x8a, 0x82, 0x2c, 0x67, 0xb2, 0x9e, 0x89, 0xca, 0x87, + 0xce, 0x4f, 0x29, 0xa3, 0xe4, 0xb9, 0x3a, 0x3a, 0xa5, 0x38, 0xb5, 0x33, 0x73, 0xdc, 0x24, 0xa5, + 0x7d, 0x19, 0xa7, 0xac, 0x0a, 0x4a, 0xfb, 0x52, 0xa7, 0x7c, 0x0c, 0x5b, 0x33, 0x3a, 0x71, 0xec, + 0x78, 0xb5, 0x56, 0xa4, 0xb8, 0xad, 0x23, 0x5a, 0x2b, 0x33, 0x44, 0xc3, 0x9d, 0x8d, 0xc6, 0x4f, + 0xbd, 0xd9, 0x89, 0x83, 0x3a, 0x0b, 0x66, 0x0f, 0x15, 0xcd, 0x65, 0x77, 0x31, 0xfb, 0x25, 0x0e, + 0x66, 0x45, 0x02, 0xa3, 0x01, 0xb5, 0x61, 0xe8, 0xcd, 0xe5, 0x34, 0x2f, 0x43, 0x1d, 0x1f, 0xc5, + 0x79, 0xe7, 0x5b, 0x70, 0x93, 0x8b, 0x84, 0x91, 0x37, 0xf7, 0xa6, 0xde, 0xd9, 0x55, 0xcc, 0x8f, + 0xf7, 0xaf, 0x72, 0xb0, 0x16, 0xc3, 0x0a, 0xf1, 0xfa, 0x11, 0xca, 0x33, 0x75, 0x5a, 0x33, 0x17, + 0x3b, 0xaa, 0xc3, 0xe6, 0x0b, 0x09, 0x51, 0x98, 0xc9, 0x13, 0x9c, 0xed, 0xe8, 0x62, 0x16, 0x59, + 0x10, 0x45, 0x4a, 0x2b, 0x2d, 0x52, 0x44, 0x79, 0x79, 0x65, 0x8b, 0xac, 0xe2, 0x17, 0xc4, 0xc9, + 0xaa, 0x89, 0xe8, 0x72, 0x21, 0x7e, 0xf6, 0x42, 0xf7, 0xf9, 0xc9, 0x16, 0x44, 0x8e, 0xc0, 0xc0, + 0xf8, 0xbb, 0x39, 0x80, 0xa8, 0x75, 0xfc, 0xf4, 0x87, 0xd2, 0x5b, 0x72, 0x3c, 0x71, 0x57, 0xd3, + 0x51, 0xde, 0x80, 0xba, 0xca, 0xf1, 0x8e, 0x34, 0xa1, 0x9a, 0x84, 0x31, 0x75, 0xe8, 0x1d, 0x58, + 0x39, 0x9b, 0x7a, 0x27, 0x5c, 0x63, 0x15, 0x7a, 0x0b, 0x66, 0xcf, 0x2d, 0x23, 0x58, 0x6a, 0x23, + 0x91, 0xde, 0x54, 0xcc, 0x4c, 0x03, 0xd7, 0xb5, 0x20, 0xe3, 0x2f, 0xe7, 0x55, 0x22, 0x69, 0x34, + 0x12, 0x2f, 0x36, 0xef, 0x7e, 0x96, 0x54, 0x9b, 0x17, 0x85, 0x17, 0x3f, 0x87, 0x65, 0x1f, 0x37, + 0x25, 0xb9, 0x63, 0x15, 0x5f, 0xb0, 0x63, 0x35, 0xfc, 0x98, 0xa6, 0xf3, 0x5d, 0x68, 0xda, 0x93, + 0x0b, 0xea, 0x87, 0x0e, 0xf7, 0xd6, 0x73, 0xfd, 0x58, 0xa4, 0x6e, 0x6a, 0x70, 0xae, 0x88, 0xbe, + 0x03, 0x2b, 0xe2, 0x0c, 0xbe, 0xa2, 0x14, 0x37, 0x80, 0x45, 0x60, 0x46, 0x68, 0xfc, 0x43, 0x99, + 0xb9, 0x1a, 0x9f, 0xdd, 0x17, 0x8f, 0x8a, 0xde, 0xc3, 0x7c, 0x3a, 0x80, 0x2a, 0x18, 0x49, 0x04, + 0x01, 0x84, 0x3c, 0x42, 0xa0, 0x08, 0x01, 0xc4, 0x87, 0xb5, 0xf8, 0x2a, 0xc3, 0x6a, 0xfc, 0xeb, + 0x1c, 0x94, 0xf7, 0xbd, 0xf9, 0xbe, 0x83, 0xe7, 0x1f, 0xf8, 0x32, 0x51, 0x31, 0xaa, 0x25, 0xf6, + 0xc8, 0xf3, 0x82, 0x5e, 0x70, 0x8a, 0x31, 0x53, 0xcd, 0x6b, 0xc4, 0xd5, 0xbc, 0x1f, 0xc0, 0x2d, + 0x1e, 0x02, 0xf4, 0xbd, 0xb9, 0xe7, 0xb3, 0xa5, 0x6a, 0x4f, 0x51, 0xdd, 0xf3, 0xdc, 0xf0, 0x5c, + 0xca, 0xce, 0x9b, 0xa7, 0x94, 0x1e, 0x69, 0x14, 0x87, 0x8a, 0x80, 0x9f, 0x60, 0x9e, 0x86, 0x17, + 0x16, 0x5a, 0xe8, 0x42, 0x1f, 0x45, 0x89, 0xba, 0xc2, 0x10, 0x5d, 0x0e, 0xe7, 0x1a, 0xa9, 0xf1, + 0x29, 0x54, 0x95, 0xb3, 0x87, 0xbc, 0x0b, 0xd5, 0x73, 0x6f, 0x2e, 0x3c, 0x42, 0xb9, 0xd8, 0x49, + 0x4f, 0xd1, 0x6b, 0xb3, 0x72, 0x8e, 0x3f, 0x02, 0xe3, 0x0f, 0xca, 0x50, 0xee, 0xb9, 0x17, 0x9e, + 0x33, 0xe6, 0xb9, 0xaf, 0x33, 0x3a, 0xf3, 0xe4, 0x45, 0x20, 0xec, 0x37, 0x4f, 0xdd, 0x8a, 0xee, + 0xf1, 0x2a, 0x88, 0xd4, 0x2d, 0x75, 0x83, 0xd7, 0x06, 0x2c, 0xf9, 0xfa, 0x45, 0x5c, 0x25, 0x9f, + 0x9f, 0x18, 0x50, 0xfb, 0x65, 0x49, 0xbb, 0x5e, 0x85, 0xd5, 0x85, 0x69, 0x89, 0x7c, 0xc8, 0xf0, + 0x14, 0x72, 0x95, 0x43, 0xf8, 0x80, 0xbd, 0x06, 0x65, 0x71, 0xb0, 0x12, 0x8f, 0x79, 0x61, 0x8a, + 0xbf, 0x00, 0x71, 0x6e, 0xf0, 0x29, 0x86, 0x70, 0x95, 0x22, 0x5b, 0x30, 0xeb, 0x12, 0xb8, 0xcb, + 0x78, 0xed, 0x0e, 0xd4, 0x90, 0x1e, 0x49, 0x2a, 0x22, 0x65, 0x94, 0x83, 0x38, 0x41, 0xc6, 0x7d, + 0x76, 0xd5, 0xcc, 0xfb, 0xec, 0x78, 0x72, 0xb3, 0x92, 0xb2, 0xd8, 0x45, 0xc0, 0x5b, 0xcc, 0x34, + 0xb8, 0xbc, 0x24, 0x52, 0xf8, 0x54, 0xf0, 0x80, 0xbe, 0xf4, 0xa9, 0xbc, 0x09, 0x8d, 0x53, 0x7b, + 0x3a, 0x3d, 0xb1, 0xc7, 0xcf, 0xd0, 0x15, 0x50, 0x47, 0xef, 0xa7, 0x04, 0x72, 0x5f, 0xc0, 0x1d, + 0xa8, 0x69, 0xb3, 0xcc, 0xf3, 0x41, 0x8b, 0x26, 0x44, 0xf3, 0x9b, 0xf4, 0xf0, 0x2d, 0xbf, 0x82, + 0x87, 0x4f, 0xcb, 0x8b, 0x5d, 0x89, 0xe7, 0xc5, 0xde, 0xe2, 0xd2, 0x54, 0x64, 0x24, 0x36, 0xf1, + 0xca, 0x2c, 0x7b, 0x32, 0xe1, 0x19, 0x89, 0xdc, 0x91, 0x85, 0x83, 0x87, 0xf8, 0x55, 0xb4, 0x25, + 0x10, 0x86, 0x24, 0xb7, 0xd1, 0x4d, 0x3d, 0xb7, 0x9d, 0x09, 0x3f, 0xa6, 0x81, 0xde, 0x83, 0xb2, + 0x3d, 0x0b, 0x8f, 0x6c, 0x67, 0x42, 0xee, 0x42, 0x5d, 0xa2, 0xf9, 0xee, 0xb8, 0x86, 0xe3, 0x2f, + 0xd0, 0x43, 0xbc, 0x7e, 0x42, 0x51, 0xcc, 0xd4, 0x09, 0x7b, 0xb3, 0x26, 0x48, 0x38, 0x1f, 0x7c, + 0xc0, 0xb3, 0x7c, 0x42, 0xca, 0xcf, 0xd0, 0x2f, 0x3f, 0xba, 0xa5, 0x92, 0x0f, 0x38, 0x97, 0xca, + 0xff, 0x18, 0x1c, 0x43, 0x4a, 0xa6, 0xdc, 0x61, 0x8c, 0x6e, 0x33, 0xa6, 0xff, 0x0a, 0x52, 0x1e, + 0xa3, 0x43, 0x02, 0xf2, 0xa9, 0x66, 0xbf, 0xb6, 0x38, 0xf1, 0x6b, 0x89, 0xfa, 0xaf, 0x3b, 0xc6, + 0x76, 0x1b, 0xc0, 0x09, 0xd8, 0x2e, 0x13, 0x50, 0x77, 0xc2, 0x8f, 0xc2, 0x57, 0xcc, 0xaa, 0x13, + 0x3c, 0x45, 0xc0, 0xb7, 0x6b, 0xd8, 0xb6, 0xa1, 0xae, 0x77, 0x93, 0x54, 0xa0, 0x38, 0x38, 0xea, + 0xf6, 0x9b, 0x37, 0x48, 0x0d, 0xca, 0xc3, 0xee, 0x68, 0x74, 0xc0, 0x23, 0x7d, 0x75, 0xa8, 0xa8, + 0x83, 0xae, 0x79, 0xf6, 0xd4, 0xee, 0x74, 0xba, 0x47, 0xa3, 0xee, 0x6e, 0xb3, 0xf0, 0xe3, 0x62, + 0x25, 0xdf, 0x2c, 0x18, 0x7f, 0x58, 0x80, 0x9a, 0x36, 0x0a, 0x2f, 0x16, 0xc6, 0xb7, 0x01, 0xb8, + 0x25, 0x19, 0x25, 0xac, 0x16, 0xcd, 0x2a, 0x83, 0xe0, 0xe4, 0xeb, 0x31, 0x0a, 0xbc, 0x8b, 0x44, + 0xc5, 0x28, 0xde, 0x84, 0x06, 0xde, 0x16, 0xa2, 0xc7, 0x6b, 0x4b, 0x66, 0x1d, 0x81, 0x42, 0x54, + 0xf3, 0x63, 0xf3, 0x9c, 0x88, 0x1f, 0x48, 0x14, 0xd7, 0x19, 0x21, 0x88, 0x1f, 0x49, 0xe4, 0xe7, + 0x49, 0x03, 0x6f, 0x7a, 0x41, 0x91, 0x02, 0x35, 0xc2, 0x9a, 0x80, 0x8d, 0xc4, 0x95, 0x04, 0x42, + 0x1e, 0x6a, 0xe7, 0xb6, 0x4b, 0x66, 0x1d, 0x81, 0xe2, 0x45, 0xdf, 0x93, 0x0c, 0x84, 0xd9, 0x2b, + 0x5b, 0x69, 0x6e, 0x88, 0x31, 0xcf, 0x41, 0xca, 0x8d, 0x58, 0xe5, 0x8c, 0xf1, 0x9d, 0x74, 0xb9, + 0x97, 0xbb, 0x13, 0xc9, 0xbb, 0x40, 0x66, 0xf3, 0xb9, 0x95, 0xe1, 0xe0, 0x2b, 0x9a, 0x2b, 0xb3, + 0xf9, 0x7c, 0xa4, 0xf9, 0xbf, 0xbe, 0x05, 0xdf, 0xe3, 0xd7, 0x40, 0xda, 0x6c, 0x01, 0xf3, 0x26, + 0x2a, 0x53, 0x2c, 0x12, 0xcb, 0x39, 0x5d, 0x2c, 0x67, 0x48, 0xbf, 0x7c, 0xa6, 0xf4, 0x7b, 0x91, + 0x9c, 0x30, 0xf6, 0xa0, 0x76, 0xa4, 0x5d, 0x9a, 0x78, 0x97, 0xed, 0x10, 0xf2, 0xba, 0x44, 0xdc, + 0x3b, 0xd0, 0xa7, 0xe8, 0x8b, 0x5b, 0x12, 0xb5, 0xd6, 0xe4, 0xb5, 0xd6, 0x18, 0x7f, 0x3b, 0x87, + 0x97, 0x4c, 0xa9, 0xc6, 0x47, 0xf7, 0x34, 0xca, 0xf0, 0x5b, 0x74, 0xbd, 0x42, 0x4d, 0x86, 0xdd, + 0xc4, 0xcd, 0x08, 0xbc, 0x69, 0x96, 0x77, 0x7a, 0x1a, 0x50, 0x99, 0xe3, 0x51, 0xe3, 0xb0, 0x01, + 0x07, 0x49, 0xe5, 0x9b, 0x69, 0xf8, 0x0e, 0xd6, 0x1f, 0x88, 0xc4, 0x0e, 0xa6, 0x7c, 0x1f, 0xda, + 0x97, 0xe2, 0xad, 0x01, 0x53, 0x41, 0x44, 0x7c, 0x40, 0x1e, 0x2f, 0x56, 0xcf, 0xc6, 0xdf, 0x10, + 0x37, 0x40, 0x24, 0xc7, 0xf7, 0x3e, 0x54, 0x54, 0xad, 0xf1, 0x1d, 0x56, 0x52, 0x2a, 0x3c, 0xdb, + 0xc7, 0xb9, 0x33, 0x24, 0xd6, 0x62, 0x5c, 0x5c, 0x3c, 0xc6, 0xd3, 0xd3, 0x5a, 0xfd, 0x1e, 0x90, + 0x53, 0xc7, 0x4f, 0x12, 0xe3, 0x62, 0x6b, 0x72, 0x8c, 0x46, 0x6d, 0x1c, 0xc3, 0x9a, 0x94, 0x12, + 0x9a, 0x45, 0x10, 0x9f, 0xbc, 0xdc, 0x4b, 0x84, 0x7c, 0x3e, 0x25, 0xe4, 0x8d, 0x5f, 0x2f, 0x41, + 0x59, 0x5e, 0x40, 0x9a, 0x75, 0x69, 0x66, 0x35, 0x7e, 0x69, 0x66, 0x2b, 0x76, 0x95, 0x1a, 0x9f, + 0x7a, 0xb1, 0xdf, 0xbf, 0x93, 0xdc, 0xb2, 0xb5, 0x58, 0x45, 0x6c, 0xdb, 0x16, 0xb1, 0x8a, 0x52, + 0x3c, 0x56, 0x91, 0x75, 0x91, 0x28, 0xaa, 0x9e, 0xa9, 0x8b, 0x44, 0x6f, 0x01, 0xea, 0x11, 0x5a, + 0x72, 0x5b, 0x85, 0x03, 0xc4, 0x11, 0x79, 0x4d, 0xed, 0xa8, 0x24, 0xd5, 0x8e, 0x57, 0x56, 0x09, + 0x3e, 0x82, 0x25, 0xbc, 0x4d, 0x46, 0x1c, 0x97, 0x96, 0x1b, 0x87, 0x18, 0x2b, 0xf9, 0x1f, 0x0f, + 0x44, 0x98, 0x82, 0x56, 0xbf, 0x95, 0xaf, 0x16, 0xbb, 0x95, 0x4f, 0x8f, 0xa1, 0xd4, 0xe3, 0x31, + 0x94, 0x7b, 0xd0, 0x54, 0x03, 0xc7, 0x3d, 0x92, 0x6e, 0x20, 0xce, 0x5a, 0x2e, 0x4b, 0x38, 0x93, + 0x86, 0xfd, 0x20, 0xda, 0xf8, 0x96, 0x63, 0x1b, 0x1f, 0x93, 0x55, 0xed, 0x30, 0xa4, 0xb3, 0x79, + 0x28, 0x37, 0x3e, 0xed, 0xee, 0x56, 0x9c, 0x79, 0x3c, 0x0c, 0x22, 0xa7, 0x17, 0xb9, 0x63, 0x07, + 0x96, 0x4f, 0x6d, 0x67, 0xba, 0xf0, 0xa9, 0xe5, 0x53, 0x3b, 0xf0, 0x5c, 0xbe, 0xf8, 0xa3, 0x3d, + 0x58, 0x74, 0x71, 0x0f, 0x69, 0x4c, 0x4e, 0x62, 0x36, 0x4e, 0xf5, 0x47, 0x7e, 0xa4, 0x4a, 0x1f, + 0x09, 0xb6, 0x65, 0x89, 0x53, 0xd7, 0x98, 0xab, 0xd2, 0xeb, 0x5b, 0x7b, 0x07, 0xbd, 0x27, 0xfb, + 0xa3, 0x66, 0x8e, 0x3d, 0x0e, 0x8f, 0x3b, 0x9d, 0x6e, 0x77, 0x97, 0x6f, 0x61, 0x00, 0x4b, 0x7b, + 0xed, 0xde, 0x81, 0xd8, 0xc0, 0x8a, 0xcd, 0x92, 0xf1, 0x4f, 0xf3, 0x50, 0xd3, 0x7a, 0x43, 0x1e, + 0xab, 0x49, 0xc0, 0x6b, 0x1a, 0x6e, 0xa7, 0x7b, 0xfc, 0x40, 0x4a, 0x78, 0x6d, 0x16, 0xd4, 0x2d, + 0xad, 0xf9, 0x6b, 0x6f, 0x69, 0x25, 0x6f, 0xc3, 0x8a, 0x8d, 0x35, 0xa8, 0x41, 0x17, 0xce, 0x7d, + 0x01, 0x16, 0x63, 0xfe, 0xb6, 0xb8, 0x32, 0x42, 0x6c, 0x53, 0x8c, 0xae, 0x28, 0x93, 0x36, 0xd5, + 0x4e, 0xc5, 0xe7, 0xa6, 0x2c, 0x46, 0x46, 0x04, 0xe3, 0xd5, 0x86, 0x2f, 0xc6, 0x4b, 0xa2, 0xf1, + 0x9c, 0xa5, 0xc6, 0xe1, 0x75, 0x53, 0x3d, 0x1b, 0x1f, 0x03, 0x44, 0xfd, 0x89, 0x0f, 0xdf, 0x8d, + 0xf8, 0xf0, 0xe5, 0xb4, 0xe1, 0xcb, 0x1b, 0xff, 0x40, 0x88, 0x2e, 0x31, 0x17, 0xca, 0xd5, 0xf7, + 0x3d, 0x90, 0xce, 0x47, 0x8b, 0x27, 0x79, 0xcf, 0xa7, 0x34, 0x94, 0x47, 0x45, 0x57, 0x05, 0xa6, + 0xa7, 0x10, 0x29, 0x51, 0x9b, 0x4f, 0x8b, 0xda, 0x37, 0xa0, 0xce, 0xef, 0x20, 0x13, 0x2f, 0x12, + 0xe2, 0xaa, 0x36, 0xb3, 0x2f, 0xe5, 0xbb, 0x63, 0x32, 0xb6, 0x98, 0x90, 0xb1, 0x7f, 0x33, 0x87, + 0x17, 0xd6, 0x44, 0x0d, 0x8d, 0x84, 0xac, 0xaa, 0x33, 0x2e, 0x64, 0x05, 0xa9, 0xa9, 0xf0, 0xd7, + 0x08, 0xce, 0x7c, 0xb6, 0xe0, 0xcc, 0x16, 0xc9, 0x85, 0x4c, 0x91, 0x6c, 0x6c, 0x43, 0x6b, 0x97, + 0xb2, 0xa1, 0x68, 0x4f, 0xa7, 0x89, 0xb1, 0x34, 0x6e, 0xc1, 0xcd, 0x0c, 0x9c, 0xf0, 0xda, 0xfc, + 0x46, 0x0e, 0x36, 0xda, 0x78, 0x4f, 0xc5, 0xb7, 0x76, 0x96, 0xf3, 0x33, 0xb8, 0xa9, 0x32, 0xb6, + 0xb5, 0x23, 0x62, 0xfa, 0x25, 0x43, 0x32, 0xd9, 0x5b, 0x3b, 0xa7, 0xc0, 0xf6, 0x4c, 0xa3, 0x05, + 0x9b, 0xc9, 0xd6, 0x88, 0x86, 0xee, 0xc1, 0xea, 0x2e, 0x3d, 0x59, 0x9c, 0x1d, 0xd0, 0x8b, 0xa8, + 0x8d, 0x04, 0x8a, 0xc1, 0xb9, 0xf7, 0x5c, 0x30, 0x06, 0xff, 0xcd, 0x53, 0x3a, 0x19, 0x8d, 0x15, + 0xcc, 0xe9, 0x58, 0x7a, 0xfd, 0x39, 0x64, 0x38, 0xa7, 0x63, 0xe3, 0x31, 0x10, 0xbd, 0x1e, 0x31, + 0x8b, 0xcc, 0x24, 0x5b, 0x9c, 0x58, 0xc1, 0x55, 0x10, 0xd2, 0x99, 0x3c, 0xfe, 0x08, 0xc1, 0xe2, + 0x64, 0x88, 0x10, 0xe3, 0x1d, 0xa8, 0x1f, 0xd9, 0x57, 0x26, 0xfd, 0x5a, 0x9c, 0x32, 0xdc, 0x82, + 0xf2, 0xdc, 0xbe, 0x62, 0xb2, 0x58, 0x05, 0x00, 0x39, 0xda, 0xf8, 0x47, 0x45, 0x58, 0x42, 0x4a, + 0x72, 0x17, 0xef, 0x4f, 0x77, 0x5c, 0x2e, 0x0b, 0xe5, 0xae, 0xa4, 0x81, 0x52, 0x1b, 0x57, 0x3e, + 0xbd, 0x71, 0x09, 0x6f, 0xa5, 0xbc, 0x04, 0x4d, 0x86, 0x6a, 0xdc, 0xc5, 0x4c, 0xde, 0x7c, 0x16, + 0xbf, 0xe7, 0xa1, 0x18, 0xdd, 0xbb, 0x8f, 0x67, 0xdc, 0xe3, 0xc1, 0xf4, 0xc8, 0xf0, 0xc3, 0xd6, + 0xc9, 0xfd, 0x58, 0xec, 0x59, 0x3a, 0x28, 0xd3, 0xba, 0x2c, 0xcb, 0xa3, 0xb3, 0x71, 0xeb, 0x32, + 0x65, 0x45, 0x56, 0x5e, 0x6e, 0x45, 0xa2, 0x1b, 0xf3, 0x05, 0x56, 0x24, 0xbc, 0x82, 0x15, 0xf9, + 0x0a, 0x81, 0xec, 0x9b, 0x50, 0xe1, 0x4a, 0x96, 0xb6, 0x85, 0x31, 0xe5, 0x8a, 0x6d, 0x61, 0x9f, + 0x68, 0x76, 0x16, 0x66, 0xd1, 0x68, 0x7b, 0x88, 0x49, 0xbf, 0xfe, 0xf9, 0x04, 0x08, 0xbf, 0x82, + 0xb2, 0x80, 0x32, 0x86, 0x76, 0xed, 0x99, 0xbc, 0x4e, 0x93, 0xff, 0x66, 0xc3, 0xc6, 0x2f, 0xbf, + 0xfb, 0x7a, 0xe1, 0xf8, 0x74, 0x22, 0xaf, 0xe0, 0x72, 0xf8, 0xfa, 0x66, 0x10, 0xd6, 0x41, 0x66, + 0xf3, 0xb9, 0xde, 0x73, 0x57, 0xc8, 0xad, 0xb2, 0x13, 0x3c, 0x65, 0x8f, 0x06, 0x81, 0x26, 0xbf, + 0x7c, 0x77, 0xee, 0xf9, 0x52, 0x43, 0x30, 0x7e, 0x27, 0x07, 0x4d, 0xb1, 0xba, 0x14, 0x4e, 0x37, + 0xb9, 0x4a, 0xd7, 0x25, 0x7d, 0xbc, 0xf8, 0x42, 0x2d, 0x03, 0x1a, 0xdc, 0xd3, 0xa4, 0xd4, 0x05, + 0xf4, 0x94, 0xd5, 0x18, 0x70, 0x4f, 0xa8, 0x0c, 0xaf, 0x43, 0x4d, 0x26, 0x9c, 0xcf, 0x9c, 0xa9, + 0xfc, 0xc4, 0x06, 0x66, 0x9c, 0x1f, 0x3a, 0x53, 0xa9, 0x6d, 0xf8, 0xb6, 0x38, 0xca, 0x9d, 0xe3, + 0xda, 0x86, 0x69, 0x87, 0xd4, 0xf8, 0x27, 0x39, 0x58, 0xd5, 0xba, 0x22, 0xd6, 0xed, 0xf7, 0xa1, + 0xae, 0x6e, 0xbd, 0xa6, 0x4a, 0xcd, 0xdd, 0x8a, 0xcb, 0xa8, 0xa8, 0x58, 0x6d, 0xac, 0x20, 0x01, + 0x6b, 0xcc, 0xc4, 0xbe, 0xc2, 0xac, 0xe8, 0xc5, 0x4c, 0x5a, 0x92, 0x13, 0xfb, 0x6a, 0x8f, 0xd2, + 0xe1, 0x62, 0x46, 0xee, 0x42, 0xfd, 0x39, 0xa5, 0xcf, 0x14, 0x01, 0x8a, 0x5e, 0x60, 0x30, 0x41, + 0x61, 0x40, 0x63, 0xe6, 0xb9, 0xe1, 0xb9, 0x22, 0x11, 0x2a, 0x3e, 0x07, 0x22, 0x8d, 0xf1, 0xfb, + 0x79, 0x58, 0x43, 0x7f, 0xa6, 0xf0, 0x23, 0x0b, 0xd1, 0xd5, 0x82, 0x25, 0x74, 0xed, 0xa2, 0xf0, + 0xda, 0xbf, 0x61, 0x8a, 0x67, 0xf2, 0xd1, 0x2b, 0xfa, 0x60, 0xe5, 0x69, 0xf1, 0x6b, 0x86, 0xbf, + 0x90, 0x1e, 0xfe, 0xeb, 0x87, 0x37, 0x2b, 0xaa, 0x5c, 0xca, 0x8a, 0x2a, 0xbf, 0x4a, 0x2c, 0x37, + 0x75, 0xae, 0xb9, 0x9c, 0xbe, 0xbd, 0xf3, 0x31, 0x6c, 0xc5, 0x68, 0xb8, 0xb4, 0x76, 0x4e, 0x1d, + 0x2a, 0xef, 0x07, 0x5a, 0xd7, 0xa8, 0x87, 0x12, 0xb7, 0x53, 0x86, 0x52, 0x30, 0xf6, 0xe6, 0xd4, + 0xd8, 0x84, 0xf5, 0xf8, 0xa8, 0x8a, 0x6d, 0xe2, 0xb7, 0x72, 0xd0, 0x12, 0x39, 0x40, 0x8e, 0x7b, + 0xb6, 0xef, 0x04, 0xa1, 0xe7, 0xab, 0xdb, 0xa1, 0x6f, 0x03, 0xe0, 0xe7, 0x3e, 0xb8, 0xe1, 0x2e, + 0x6e, 0xc4, 0xe1, 0x10, 0x6e, 0xb6, 0xdf, 0x84, 0x0a, 0x75, 0x27, 0x88, 0x44, 0x6e, 0x28, 0x53, + 0x77, 0x22, 0x8d, 0xfe, 0xd4, 0x36, 0xdc, 0x88, 0x2b, 0x18, 0xe2, 0x6e, 0x07, 0x36, 0x3a, 0xf4, + 0x82, 0xab, 0x03, 0x45, 0x75, 0xb7, 0xc3, 0xa1, 0x7d, 0xc9, 0x33, 0x6a, 0x03, 0xe3, 0xaf, 0xe4, + 0x61, 0x25, 0x6a, 0x1f, 0xde, 0x6e, 0xf3, 0xe2, 0x7b, 0x7a, 0xee, 0x0a, 0x76, 0x70, 0x98, 0xb1, + 0xa4, 0x79, 0x79, 0x2b, 0xb8, 0x38, 0x7b, 0x2e, 0x31, 0xa0, 0x26, 0x29, 0xbc, 0x45, 0xa8, 0xdd, + 0x38, 0x5a, 0x45, 0x92, 0xc1, 0x22, 0x64, 0xd6, 0x2d, 0x33, 0xf3, 0x1d, 0x57, 0xd8, 0x97, 0x25, + 0x7b, 0x16, 0xf6, 0xf8, 0x37, 0x65, 0x18, 0x98, 0x15, 0xc3, 0x89, 0x64, 0x54, 0x8c, 0xbe, 0x89, + 0xc6, 0x0e, 0xce, 0x1c, 0x37, 0x74, 0x74, 0x4b, 0x00, 0xaf, 0xc1, 0x57, 0x96, 0xc0, 0xeb, 0x50, + 0xc3, 0xca, 0xa3, 0x63, 0xec, 0xfc, 0xfa, 0xaf, 0xb0, 0xe7, 0x72, 0xbc, 0xf0, 0xb8, 0x79, 0x8b, + 0x98, 0x9f, 0x01, 0xf0, 0x55, 0x3c, 0xc5, 0xe6, 0x37, 0x72, 0x70, 0x33, 0x63, 0xda, 0xc4, 0x2a, + 0xef, 0xc0, 0xea, 0xa9, 0x42, 0xca, 0xd1, 0xc5, 0xa5, 0xbe, 0x29, 0xc5, 0x6a, 0x7c, 0x4c, 0xcd, + 0xe6, 0x69, 0x1c, 0x10, 0x59, 0xb8, 0x38, 0x83, 0xb1, 0x4b, 0x12, 0xb8, 0x3a, 0x85, 0xd3, 0x88, + 0xc6, 0xe5, 0x11, 0x6c, 0x77, 0x2f, 0x99, 0xc4, 0x50, 0x69, 0xb9, 0xe3, 0x67, 0x0b, 0x19, 0xf9, + 0x4a, 0x78, 0xf3, 0x73, 0xaf, 0xe4, 0xcd, 0x9f, 0xe0, 0x31, 0x67, 0x55, 0xd7, 0xcf, 0x52, 0x09, + 0xdf, 0x40, 0x59, 0x99, 0x13, 0x5e, 0x85, 0xbc, 0x2d, 0x81, 0x81, 0xb0, 0x52, 0x23, 0x80, 0x95, + 0xc3, 0xc5, 0x34, 0x74, 0x3a, 0x0a, 0x44, 0x3e, 0x12, 0x65, 0xf8, 0x7b, 0xe4, 0xa8, 0x65, 0xbe, + 0x08, 0xd4, 0x8b, 0xf8, 0x60, 0xcd, 0x58, 0x45, 0x56, 0xfa, 0x7d, 0x2b, 0xb3, 0xf8, 0x1b, 0x8c, + 0x9b, 0xb0, 0x15, 0x3d, 0xe1, 0xb0, 0xc9, 0xad, 0xe6, 0x6f, 0xe5, 0x30, 0x7d, 0x1f, 0x71, 0x43, + 0xd7, 0x9e, 0x07, 0xe7, 0x5e, 0x48, 0xba, 0xb0, 0x16, 0x38, 0xee, 0xd9, 0x94, 0xea, 0xd5, 0x07, + 0x62, 0x10, 0x36, 0xe2, 0x6d, 0xc3, 0xa2, 0x81, 0xb9, 0x8a, 0x25, 0xa2, 0xda, 0x02, 0xb2, 0x73, + 0x5d, 0x23, 0x23, 0xb6, 0x48, 0x8c, 0x46, 0xba, 0xf1, 0x3d, 0x58, 0x8e, 0xbf, 0x88, 0x7c, 0x22, + 0x6e, 0x07, 0x88, 0x5a, 0x55, 0x48, 0x9c, 0x8d, 0x8e, 0x18, 0xa2, 0x16, 0x8d, 0x7d, 0x60, 0xfc, + 0xa5, 0x1c, 0xb4, 0x4c, 0xca, 0x38, 0x57, 0x6b, 0xa5, 0xe4, 0x99, 0xef, 0xa7, 0x6a, 0xbd, 0xbe, + 0xaf, 0xf2, 0xd2, 0x01, 0xd9, 0xa2, 0xf7, 0xae, 0x9d, 0x8c, 0xfd, 0x1b, 0xa9, 0x1e, 0xed, 0x54, + 0x60, 0x09, 0x49, 0x8c, 0x2d, 0xd8, 0x10, 0xed, 0x91, 0x6d, 0x89, 0x42, 0xb5, 0xb1, 0x37, 0xc6, + 0x42, 0xb5, 0xdb, 0xd0, 0xc2, 0x73, 0xbe, 0x7a, 0x27, 0x44, 0xc1, 0x5d, 0x20, 0x87, 0xf6, 0xd8, + 0xf6, 0x3d, 0xcf, 0x3d, 0xa2, 0xbe, 0x48, 0x86, 0xe6, 0x1a, 0x26, 0x8f, 0x64, 0x4a, 0x55, 0x18, + 0x9f, 0xe4, 0x3d, 0xcb, 0x9e, 0x2b, 0x73, 0xbf, 0xf0, 0xc9, 0xf0, 0x61, 0x6d, 0xc7, 0x7e, 0x46, + 0x65, 0x4d, 0x72, 0x88, 0x3e, 0x87, 0xda, 0x5c, 0x55, 0x2a, 0xc7, 0x5d, 0x5e, 0x96, 0x92, 0x7e, + 0xad, 0xa9, 0x53, 0x33, 0x11, 0xe4, 0x7b, 0x5e, 0xc8, 0x2f, 0x26, 0x90, 0xc1, 0x30, 0xb3, 0xca, + 0x40, 0x4f, 0xe9, 0x55, 0x6f, 0x62, 0x3c, 0x82, 0xf5, 0xf8, 0x3b, 0x85, 0x68, 0xd9, 0x86, 0xca, + 0x4c, 0xc0, 0x44, 0xeb, 0xd5, 0x33, 0x33, 0x46, 0x98, 0xc9, 0x27, 0xcb, 0xf4, 0x76, 0x95, 0x49, + 0xf5, 0x39, 0x6c, 0xa5, 0x30, 0xa2, 0xc2, 0xbb, 0x50, 0xd7, 0x1a, 0x82, 0xdd, 0x28, 0x32, 0x95, + 0x55, 0xb4, 0x24, 0x30, 0x3e, 0x83, 0x2d, 0xb4, 0xc7, 0xa2, 0xe2, 0x72, 0x08, 0x12, 0xbd, 0xc8, + 0x25, 0x7b, 0xf1, 0x91, 0x34, 0xf3, 0xf4, 0xa2, 0xd1, 0x51, 0x81, 0x09, 0xc7, 0xc9, 0xf4, 0x1d, + 0xf9, 0x68, 0x1c, 0xc3, 0x66, 0x7a, 0xf8, 0x58, 0xfb, 0xff, 0x44, 0x43, 0x2e, 0x87, 0x27, 0x42, + 0xab, 0xe1, 0xf9, 0x2f, 0x39, 0x1c, 0x9f, 0x18, 0x4a, 0x34, 0x73, 0x02, 0x64, 0x46, 0xc3, 0x73, + 0x6f, 0x62, 0xa5, 0xdf, 0xfc, 0x58, 0x65, 0x0f, 0x65, 0x96, 0x7d, 0x70, 0xc8, 0x0b, 0x6a, 0x18, + 0x91, 0xc7, 0x3e, 0x4b, 0xc2, 0xb7, 0xc7, 0xb0, 0x99, 0x4d, 0x9c, 0x91, 0x73, 0xf3, 0x61, 0x5c, + 0x51, 0xbf, 0x7d, 0x6d, 0xf7, 0x59, 0xb3, 0x74, 0xbd, 0xfd, 0x37, 0x2b, 0x50, 0x16, 0x5e, 0x12, + 0xf2, 0x00, 0x8a, 0x63, 0x99, 0xbf, 0x19, 0x5d, 0x44, 0x27, 0xb0, 0xf2, 0x7f, 0x87, 0x67, 0x71, + 0x32, 0x3a, 0xf2, 0x39, 0x2c, 0xc7, 0x53, 0x18, 0x12, 0x97, 0x54, 0xc4, 0x73, 0x0f, 0x1a, 0xe3, + 0x44, 0xb0, 0xba, 0x1a, 0x29, 0x57, 0xa8, 0x73, 0x56, 0xce, 0x35, 0xed, 0xcb, 0x73, 0x99, 0xbd, + 0x16, 0x9c, 0xdb, 0xd6, 0xa3, 0xc7, 0x1f, 0x8b, 0x5b, 0x2a, 0x6a, 0x1c, 0x38, 0x3c, 0xb7, 0x1f, + 0x3d, 0xfe, 0x38, 0x69, 0x89, 0x89, 0x3b, 0x2a, 0x34, 0x4b, 0x6c, 0x1d, 0x4a, 0x78, 0x19, 0x35, + 0x26, 0xe2, 0xe1, 0x03, 0x79, 0x08, 0xeb, 0xd2, 0xf1, 0x26, 0x8e, 0x4c, 0xe0, 0x2e, 0x5a, 0xc1, + 0x53, 0xaa, 0x02, 0x37, 0xe4, 0x28, 0x74, 0xd5, 0x6d, 0xc2, 0xd2, 0x79, 0x74, 0xbb, 0x78, 0xc3, + 0x14, 0x4f, 0xc6, 0xef, 0x97, 0xa0, 0xa6, 0x0d, 0x0a, 0xa9, 0x43, 0xc5, 0xec, 0x0e, 0xbb, 0xe6, + 0x17, 0xdd, 0xdd, 0xe6, 0x0d, 0x72, 0x0f, 0xde, 0xea, 0xf5, 0x3b, 0x03, 0xd3, 0xec, 0x76, 0x46, + 0xd6, 0xc0, 0xb4, 0xe4, 0x75, 0x88, 0x47, 0xed, 0xaf, 0x0e, 0xbb, 0xfd, 0x91, 0xb5, 0xdb, 0x1d, + 0xb5, 0x7b, 0x07, 0xc3, 0x66, 0x8e, 0xbc, 0x06, 0xad, 0x88, 0x52, 0xa2, 0xdb, 0x87, 0x83, 0xe3, + 0xfe, 0xa8, 0x99, 0x27, 0x77, 0xe0, 0xd6, 0x5e, 0xaf, 0xdf, 0x3e, 0xb0, 0x22, 0x9a, 0xce, 0xc1, + 0xe8, 0x0b, 0xab, 0xfb, 0x8b, 0x47, 0x3d, 0xf3, 0xab, 0x66, 0x21, 0x8b, 0x60, 0x7f, 0x74, 0xd0, + 0x91, 0x35, 0x14, 0xc9, 0x4d, 0xd8, 0x40, 0x02, 0x2c, 0x62, 0x8d, 0x06, 0x03, 0x6b, 0x38, 0x18, + 0xf4, 0x9b, 0x25, 0xb2, 0x0a, 0x8d, 0x5e, 0xff, 0x8b, 0xf6, 0x41, 0x6f, 0xd7, 0x32, 0xbb, 0xed, + 0x83, 0xc3, 0xe6, 0x12, 0x59, 0x83, 0x95, 0x24, 0x5d, 0x99, 0x55, 0x21, 0xe9, 0x06, 0xfd, 0xde, + 0xa0, 0x6f, 0x7d, 0xd1, 0x35, 0x87, 0xbd, 0x41, 0xbf, 0x59, 0x21, 0x9b, 0x40, 0xe2, 0xa8, 0xfd, + 0xc3, 0x76, 0xa7, 0x59, 0x25, 0x1b, 0xb0, 0x1a, 0x87, 0x3f, 0xed, 0x7e, 0xd5, 0x04, 0xd2, 0x82, + 0x75, 0x6c, 0x98, 0xb5, 0xd3, 0x3d, 0x18, 0x7c, 0x69, 0x1d, 0xf6, 0xfa, 0xbd, 0xc3, 0xe3, 0xc3, + 0x66, 0x8d, 0xdf, 0x29, 0xdb, 0xed, 0x5a, 0xbd, 0xfe, 0xf0, 0x78, 0x6f, 0xaf, 0xd7, 0xe9, 0x75, + 0xfb, 0xa3, 0x66, 0x1d, 0xdf, 0x9c, 0xd5, 0xf1, 0x06, 0x2b, 0x20, 0xce, 0x55, 0x59, 0xbb, 0xbd, + 0x61, 0x7b, 0xe7, 0xa0, 0xbb, 0xdb, 0x5c, 0x26, 0xb7, 0xe1, 0xe6, 0xa8, 0x7b, 0x78, 0x34, 0x30, + 0xdb, 0xe6, 0x57, 0xf2, 0xdc, 0x95, 0xb5, 0xd7, 0xee, 0x1d, 0x1c, 0x9b, 0xdd, 0xe6, 0x0a, 0x79, + 0x03, 0x6e, 0x9b, 0xdd, 0x9f, 0x1c, 0xf7, 0xcc, 0xee, 0xae, 0xd5, 0x1f, 0xec, 0x76, 0xad, 0xbd, + 0x6e, 0x7b, 0x74, 0x6c, 0x76, 0xad, 0xc3, 0xde, 0x70, 0xd8, 0xeb, 0x3f, 0x69, 0x36, 0xc9, 0x5b, + 0x70, 0x57, 0x91, 0xa8, 0x0a, 0x12, 0x54, 0xab, 0xac, 0x7f, 0x72, 0x4a, 0xfb, 0xdd, 0x5f, 0x1c, + 0x59, 0x47, 0xdd, 0xae, 0xd9, 0x24, 0x64, 0x1b, 0x36, 0xa3, 0xd7, 0xe3, 0x0b, 0xc4, 0xbb, 0xd7, + 0x18, 0xee, 0xa8, 0x6b, 0x1e, 0xb6, 0xfb, 0x6c, 0x82, 0x63, 0xb8, 0x75, 0xd6, 0xec, 0x08, 0x97, + 0x6c, 0xf6, 0x06, 0x21, 0xb0, 0xac, 0xcd, 0xca, 0x5e, 0xdb, 0x6c, 0x6e, 0x92, 0x15, 0xa8, 0x1d, + 0x1e, 0x1d, 0x59, 0xa3, 0xde, 0x61, 0x77, 0x70, 0x3c, 0x6a, 0x6e, 0x91, 0x0d, 0x68, 0xf6, 0xfa, + 0xa3, 0xae, 0xc9, 0xe6, 0x5a, 0x16, 0xfd, 0xaf, 0x65, 0xb2, 0x0e, 0x2b, 0xb2, 0xa5, 0x12, 0xfa, + 0x47, 0x65, 0xb2, 0x05, 0xe4, 0xb8, 0x6f, 0x76, 0xdb, 0xbb, 0x6c, 0xe0, 0x14, 0xe2, 0xbf, 0x95, + 0x45, 0x38, 0xf3, 0x77, 0x0a, 0x4a, 0xd9, 0x8b, 0xf2, 0x83, 0xe2, 0x9f, 0xdc, 0xa8, 0x6b, 0x9f, + 0xca, 0x78, 0xd9, 0x87, 0xb3, 0x34, 0xd3, 0xbc, 0x90, 0x32, 0xcd, 0x53, 0xbe, 0x9f, 0x86, 0x6e, + 0x3b, 0xbc, 0x09, 0x8d, 0x19, 0x7e, 0x7e, 0x43, 0xdc, 0x2d, 0x0f, 0x22, 0x59, 0x0e, 0x81, 0x78, + 0xb1, 0x7c, 0xea, 0xcb, 0x51, 0xa5, 0xf4, 0x97, 0xa3, 0xb2, 0xec, 0xc3, 0xa5, 0x2c, 0xfb, 0xf0, + 0x3e, 0xac, 0xa2, 0x68, 0x72, 0x5c, 0x67, 0x26, 0xbd, 0x2e, 0x68, 0x45, 0xac, 0x70, 0x11, 0x85, + 0x70, 0x69, 0x8e, 0x4a, 0x93, 0x55, 0x88, 0x90, 0xb2, 0xb0, 0x56, 0x63, 0x96, 0x2a, 0x4a, 0x0e, + 0x65, 0xa9, 0xaa, 0x37, 0xd8, 0x97, 0xd1, 0x1b, 0x6a, 0xda, 0x1b, 0x10, 0xce, 0xdf, 0x70, 0x1f, + 0x56, 0xe9, 0x65, 0xe8, 0xdb, 0x96, 0x37, 0xb7, 0xbf, 0x5e, 0xf0, 0x7c, 0x0b, 0x9b, 0xfb, 0x80, + 0xea, 0xe6, 0x0a, 0x47, 0x0c, 0x38, 0x7c, 0xd7, 0x0e, 0xed, 0xfb, 0x7f, 0x06, 0x6a, 0xda, 0xa7, + 0x59, 0xc8, 0x16, 0xac, 0x7d, 0xd9, 0x1b, 0xf5, 0xbb, 0xc3, 0xa1, 0x75, 0x74, 0xbc, 0xf3, 0xb4, + 0xfb, 0x95, 0xb5, 0xdf, 0x1e, 0xee, 0x37, 0x6f, 0xb0, 0x45, 0xdb, 0xef, 0x0e, 0x47, 0xdd, 0xdd, + 0x18, 0x3c, 0x47, 0x5e, 0x87, 0xed, 0xe3, 0xfe, 0xf1, 0xb0, 0xbb, 0x6b, 0x65, 0x95, 0xcb, 0x33, + 0x2e, 0x15, 0xf8, 0x8c, 0xe2, 0x85, 0xfb, 0xbf, 0x02, 0xcb, 0xf1, 0x2b, 0x08, 0x08, 0xc0, 0xd2, + 0x41, 0xf7, 0x49, 0xbb, 0xf3, 0x15, 0xde, 0x3a, 0x3d, 0x1c, 0xb5, 0x47, 0xbd, 0x8e, 0x25, 0x6e, + 0x99, 0x66, 0x12, 0x21, 0x47, 0x6a, 0x50, 0x6e, 0xf7, 0x3b, 0xfb, 0x03, 0x73, 0xd8, 0xcc, 0x93, + 0xd7, 0x60, 0x4b, 0xf2, 0x6a, 0x67, 0x70, 0x78, 0xd8, 0x1b, 0x71, 0x61, 0x38, 0xfa, 0xea, 0x88, + 0xb1, 0xe6, 0x7d, 0x1b, 0xaa, 0xd1, 0x05, 0xd9, 0x5c, 0xc0, 0xf4, 0x46, 0xbd, 0xf6, 0x28, 0x92, + 0xae, 0xcd, 0x1b, 0x4c, 0x7e, 0x45, 0x60, 0x7e, 0xcb, 0x75, 0x33, 0x87, 0xa7, 0x34, 0x25, 0x10, + 0xdf, 0xde, 0xcc, 0xb3, 0x45, 0x15, 0x41, 0x77, 0x06, 0x23, 0xd6, 0x85, 0x5f, 0x85, 0xe5, 0xf8, + 0x3d, 0xd4, 0xa4, 0x09, 0x75, 0xf6, 0x7e, 0xed, 0x15, 0x00, 0x4b, 0xd8, 0xe2, 0x66, 0x0e, 0x25, + 0x68, 0x67, 0x70, 0xd8, 0xeb, 0x3f, 0xe1, 0x62, 0xb7, 0x99, 0x67, 0xa0, 0xc1, 0xf1, 0xe8, 0xc9, + 0x40, 0x81, 0x0a, 0xac, 0x04, 0x76, 0xa7, 0x59, 0xbc, 0xff, 0x35, 0xac, 0xa6, 0x6e, 0xac, 0x66, + 0xad, 0x1e, 0x1c, 0x8f, 0x3a, 0x83, 0x43, 0xfd, 0x3d, 0x35, 0x28, 0x77, 0x0e, 0xda, 0xbd, 0x43, + 0x1e, 0x71, 0x68, 0x40, 0xf5, 0xb8, 0x2f, 0x1f, 0xf3, 0xf1, 0xbb, 0xb6, 0x0b, 0x4c, 0x16, 0xec, + 0xf5, 0xcc, 0xe1, 0xc8, 0x1a, 0x8e, 0xda, 0x4f, 0xba, 0xcd, 0x22, 0x2b, 0x2b, 0x05, 0x43, 0xe9, + 0xfe, 0x67, 0xb0, 0x1c, 0x4f, 0x30, 0x8e, 0x47, 0x8a, 0xb6, 0x61, 0x73, 0xa7, 0x3b, 0xfa, 0xb2, + 0xdb, 0xed, 0xf3, 0x29, 0xef, 0x74, 0xfb, 0x23, 0xb3, 0x7d, 0xd0, 0x1b, 0x7d, 0xd5, 0xcc, 0xdd, + 0xff, 0x1c, 0x9a, 0xc9, 0x68, 0x7e, 0x2c, 0xfd, 0xe1, 0x45, 0x79, 0x12, 0xf7, 0xff, 0x63, 0x0e, + 0xd6, 0xb3, 0x02, 0x59, 0x8c, 0x31, 0x85, 0xc4, 0x61, 0xfb, 0xce, 0x70, 0xd0, 0xb7, 0xfa, 0x03, + 0x7e, 0x7b, 0xed, 0x36, 0x6c, 0x26, 0x10, 0xb2, 0x17, 0x39, 0x72, 0x0b, 0xb6, 0x52, 0x85, 0x2c, + 0x73, 0x70, 0xcc, 0xe7, 0xb2, 0x05, 0xeb, 0x09, 0x64, 0xd7, 0x34, 0x07, 0x66, 0xb3, 0x40, 0xde, + 0x83, 0x7b, 0x09, 0x4c, 0x7a, 0xb7, 0x95, 0x9b, 0x71, 0x91, 0xbc, 0x03, 0x6f, 0xa6, 0xa8, 0xa3, + 0x0d, 0xc9, 0xda, 0x69, 0x1f, 0xb0, 0xee, 0x35, 0x4b, 0xf7, 0xff, 0x7e, 0x01, 0x20, 0x3a, 0xc1, + 0xc7, 0xde, 0xbf, 0xdb, 0x1e, 0xb5, 0x0f, 0x06, 0x6c, 0xcd, 0x98, 0x83, 0x11, 0xab, 0xdd, 0xec, + 0xfe, 0xa4, 0x79, 0x23, 0x13, 0x33, 0x38, 0x62, 0x1d, 0xda, 0x82, 0x35, 0xe4, 0xbf, 0x03, 0xd6, + 0x0d, 0xc6, 0x2e, 0xfc, 0x22, 0x64, 0xbe, 0xa5, 0x1f, 0x1f, 0xed, 0x99, 0x83, 0xfe, 0xc8, 0x1a, + 0xee, 0x1f, 0x8f, 0x76, 0xf9, 0x35, 0xca, 0x1d, 0xb3, 0x77, 0x84, 0x75, 0x16, 0x5f, 0x44, 0xc0, + 0xaa, 0x2e, 0xb1, 0x05, 0xfe, 0x64, 0x30, 0x1c, 0xf6, 0x8e, 0xac, 0x9f, 0x1c, 0x77, 0xcd, 0x5e, + 0x77, 0xc8, 0x0b, 0x2e, 0x65, 0xc0, 0x19, 0x7d, 0x99, 0xf1, 0xec, 0xe8, 0xe0, 0x0b, 0xb1, 0x53, + 0x33, 0xd2, 0x4a, 0x1c, 0xc4, 0xa8, 0xaa, 0x6c, 0x76, 0xd8, 0x56, 0x97, 0x51, 0x33, 0x5c, 0x83, + 0x63, 0xe5, 0x6a, 0x6c, 0x13, 0x4f, 0xad, 0x7c, 0x5e, 0xac, 0x9e, 0x8d, 0x62, 0xa5, 0xf8, 0xfe, + 0xae, 0xb4, 0xa1, 0xdd, 0x5d, 0x93, 0x17, 0x58, 0x4e, 0x41, 0x19, 0xed, 0x0a, 0x63, 0x42, 0xb6, + 0x17, 0x32, 0x92, 0xa6, 0x7c, 0x60, 0x98, 0xd5, 0x47, 0xff, 0xe2, 0x0d, 0xa8, 0xaa, 0x4c, 0x7e, + 0xf2, 0x63, 0x68, 0xc4, 0x8e, 0x56, 0x13, 0xe9, 0x2b, 0xcf, 0x3a, 0x89, 0xbd, 0xfd, 0x5a, 0x36, + 0x52, 0x58, 0x01, 0x87, 0x9a, 0xd9, 0x8d, 0x95, 0xbd, 0x96, 0x34, 0x85, 0x63, 0xb5, 0xdd, 0xbe, + 0x06, 0x2b, 0xaa, 0x7b, 0xca, 0xef, 0x64, 0xd6, 0xbf, 0xf0, 0x4b, 0x6e, 0x47, 0x17, 0xe4, 0x66, + 0x7c, 0xf9, 0x77, 0xfb, 0x66, 0xfa, 0x5b, 0xbc, 0xf2, 0xe3, 0xbd, 0xbb, 0x50, 0xd3, 0x3e, 0x5c, + 0x47, 0x6e, 0x5e, 0xfb, 0x91, 0xbd, 0xed, 0xed, 0x2c, 0x94, 0x68, 0xd2, 0x0f, 0xa0, 0xaa, 0x3e, + 0x62, 0x46, 0xb6, 0xb4, 0x0f, 0xd0, 0xe9, 0x9f, 0x62, 0xdb, 0x6e, 0xa5, 0x11, 0xa2, 0xfc, 0x2e, + 0xd4, 0xb4, 0x6f, 0x91, 0xa9, 0x56, 0xa4, 0xbf, 0x77, 0xa6, 0x5a, 0x91, 0xf5, 0xe9, 0xb2, 0x03, + 0xd8, 0x10, 0xc6, 0xfd, 0x09, 0xfd, 0x26, 0xc3, 0x93, 0xf1, 0xa9, 0xe2, 0x87, 0x39, 0xf2, 0x39, + 0x54, 0xe4, 0x57, 0xe7, 0xc8, 0x66, 0xf6, 0x37, 0xf5, 0xb6, 0xb7, 0x52, 0x70, 0xd1, 0x94, 0x36, + 0x40, 0xf4, 0x95, 0x33, 0x22, 0x3b, 0x9e, 0xfa, 0x6a, 0x9a, 0x9a, 0x99, 0x8c, 0x4f, 0xa2, 0xed, + 0x42, 0x4d, 0xfb, 0xa0, 0x99, 0x1a, 0x93, 0xf4, 0xc7, 0xd0, 0xd4, 0x98, 0x64, 0x7d, 0xff, 0xec, + 0xc7, 0xd0, 0x88, 0x7d, 0x99, 0x4c, 0xf1, 0x71, 0xd6, 0x77, 0xcf, 0x14, 0x1f, 0x67, 0x7f, 0xcc, + 0x6c, 0x17, 0x6a, 0xda, 0x77, 0xc4, 0x54, 0x8b, 0xd2, 0x9f, 0x2c, 0x53, 0x2d, 0xca, 0xf8, 0xec, + 0x18, 0x5b, 0x0d, 0xf1, 0x8f, 0x88, 0xa9, 0xd5, 0x90, 0xf9, 0x35, 0x32, 0xb5, 0x1a, 0xb2, 0xbf, + 0x3c, 0xc6, 0x58, 0x4f, 0x5d, 0xc6, 0x4e, 0xb6, 0x62, 0x36, 0x75, 0x74, 0xab, 0xbb, 0x62, 0xbd, + 0xf4, 0xbd, 0xed, 0x4f, 0x60, 0x4d, 0x31, 0x8d, 0xba, 0x4a, 0x3d, 0x50, 0x6d, 0xca, 0xbc, 0xb0, + 0x7d, 0xbb, 0x99, 0xc4, 0x3e, 0xcc, 0x91, 0x4f, 0xa1, 0x2c, 0xee, 0xa7, 0x26, 0x1b, 0xc9, 0xfb, + 0xaa, 0xb1, 0x11, 0x9b, 0xd9, 0xd7, 0x58, 0x93, 0x23, 0xbe, 0xa0, 0xf5, 0x0b, 0xa4, 0x75, 0x8e, + 0xcd, 0xb8, 0x73, 0x7a, 0xfb, 0xf5, 0xeb, 0xd0, 0x51, 0x8d, 0xc9, 0x4b, 0xcf, 0x6f, 0x5f, 0x77, + 0xe5, 0x49, 0xbc, 0xc6, 0xeb, 0xee, 0x66, 0x7b, 0x02, 0x75, 0xfd, 0x13, 0x36, 0x44, 0x5f, 0x87, + 0xc9, 0xba, 0x6e, 0x65, 0xe2, 0x44, 0x45, 0x5f, 0xc0, 0xa6, 0x1a, 0x6f, 0xfd, 0xfe, 0x8d, 0x80, + 0xdc, 0xc9, 0xb8, 0x95, 0x23, 0x36, 0xea, 0x37, 0xaf, 0xbd, 0xb6, 0xe3, 0x61, 0x8e, 0x0b, 0xd9, + 0xd8, 0x57, 0x27, 0x22, 0x21, 0x9b, 0xf5, 0xb1, 0x8d, 0x48, 0xc8, 0x66, 0x7f, 0xaa, 0xa2, 0x0d, + 0x2b, 0xda, 0xfd, 0x21, 0xc3, 0x2b, 0x77, 0xac, 0xf8, 0x3d, 0x7d, 0xb3, 0xef, 0x76, 0x96, 0x8b, + 0x99, 0x74, 0xa0, 0xa6, 0x5f, 0x41, 0xf2, 0x82, 0xe2, 0x5b, 0x1a, 0x4a, 0xbf, 0xbc, 0xf5, 0x61, + 0x8e, 0x1c, 0x40, 0x33, 0x79, 0x61, 0xa0, 0x5a, 0xc2, 0x59, 0x97, 0x2c, 0x6e, 0x27, 0x90, 0xb1, + 0x6b, 0x06, 0x19, 0x5f, 0xc4, 0x3e, 0x89, 0xeb, 0xf9, 0xc9, 0xad, 0x28, 0xfe, 0xa9, 0x5c, 0x55, + 0x5b, 0xd6, 0x47, 0x92, 0xef, 0xe5, 0x1e, 0xe6, 0xc8, 0x1e, 0xd4, 0x63, 0xf7, 0x65, 0xc5, 0x0e, + 0x95, 0x24, 0xba, 0xd9, 0xd2, 0x71, 0x89, 0x7e, 0x1e, 0xc2, 0x72, 0x3c, 0x17, 0x42, 0x35, 0x2c, + 0x33, 0x61, 0x43, 0x4d, 0x5f, 0x76, 0x02, 0x05, 0xf9, 0x21, 0x7e, 0xf0, 0x5d, 0xe6, 0xcc, 0x91, + 0xf4, 0x07, 0xc2, 0xd5, 0x9c, 0xe9, 0x9f, 0xd3, 0x36, 0x0a, 0x7f, 0x21, 0x9f, 0xe3, 0xfd, 0xfa, + 0x3e, 0x7e, 0x6e, 0x55, 0xa6, 0x4d, 0xb1, 0xf9, 0x7f, 0xd5, 0x4a, 0xc8, 0x1e, 0xbe, 0x5c, 0x7c, + 0xec, 0x3a, 0x92, 0xdc, 0xa9, 0x0f, 0x60, 0xbf, 0xa4, 0x0d, 0x6d, 0x6c, 0x83, 0x28, 0x13, 0xe3, + 0xc1, 0x57, 0xac, 0x8b, 0x7c, 0x02, 0x10, 0xe5, 0xa2, 0x92, 0x44, 0x46, 0xa4, 0x5a, 0x50, 0x19, + 0xe9, 0xaa, 0x5d, 0x5c, 0xef, 0x2a, 0x25, 0x53, 0xdf, 0x92, 0xe3, 0xd9, 0xa1, 0xb1, 0x2d, 0x39, + 0x59, 0xcd, 0x87, 0xd0, 0x38, 0xf0, 0xbc, 0x67, 0x8b, 0xb9, 0x3a, 0xd0, 0x10, 0xcf, 0x17, 0x62, + 0x36, 0xff, 0x76, 0xa2, 0x59, 0xa4, 0x0d, 0xab, 0x4a, 0x44, 0x44, 0x39, 0xa1, 0x71, 0xa2, 0x98, + 0x60, 0x48, 0x54, 0xf0, 0x30, 0x47, 0x1e, 0x41, 0x7d, 0x97, 0x8e, 0xf9, 0x7d, 0x16, 0x3c, 0x3b, + 0x65, 0x2d, 0x96, 0xe9, 0x80, 0x69, 0x2d, 0xdb, 0x8d, 0x18, 0x50, 0x8a, 0xb8, 0x28, 0x43, 0x4a, + 0xdf, 0x33, 0xe2, 0x69, 0x46, 0x31, 0x11, 0x97, 0xca, 0x92, 0xfa, 0x02, 0x56, 0x53, 0x39, 0x48, + 0x4a, 0xba, 0x5d, 0x97, 0xb9, 0xb4, 0x7d, 0xf7, 0x7a, 0x02, 0x51, 0xef, 0x8f, 0xa0, 0x81, 0x77, + 0xf9, 0x9e, 0x50, 0x3c, 0x8f, 0x9a, 0xb8, 0xcc, 0x49, 0x3f, 0xec, 0x9a, 0x14, 0x49, 0x58, 0xe0, + 0x09, 0xff, 0xc2, 0x87, 0x76, 0xda, 0x53, 0xcd, 0x6b, 0xfa, 0x04, 0xaa, 0x9a, 0xd7, 0xac, 0x83, + 0xa5, 0x9f, 0x41, 0xed, 0x09, 0x0d, 0xe5, 0xf9, 0x49, 0xa5, 0x1f, 0x25, 0x0e, 0x54, 0x6e, 0x67, + 0x9c, 0x7a, 0x25, 0x1f, 0xf3, 0xa2, 0xea, 0x2e, 0x80, 0x4d, 0xed, 0x2d, 0x7a, 0xd1, 0x95, 0x04, + 0x9c, 0x69, 0x1f, 0xda, 0x8d, 0x20, 0xaa, 0xe1, 0xe9, 0x1b, 0x60, 0x54, 0xc3, 0xb3, 0x2e, 0x10, + 0xf9, 0x21, 0x8e, 0x80, 0x76, 0x62, 0x33, 0x52, 0xc1, 0x92, 0x87, 0x3b, 0x55, 0xf3, 0x75, 0xf2, + 0xc7, 0x00, 0xc3, 0xd0, 0x9b, 0xef, 0xda, 0x74, 0xe6, 0xb9, 0x91, 0x4c, 0x88, 0xce, 0x0a, 0x46, + 0x0b, 0x51, 0x3b, 0x30, 0x48, 0xbe, 0xd4, 0x74, 0xd3, 0xd8, 0x94, 0xc8, 0x69, 0xbf, 0xf6, 0x38, + 0xa1, 0xea, 0x4e, 0xc6, 0x91, 0x42, 0x2e, 0x24, 0x20, 0x4a, 0xf1, 0x52, 0x9a, 0x66, 0x2a, 0x7b, + 0x4c, 0xad, 0xf5, 0x8c, 0x7c, 0xb0, 0x1f, 0x40, 0x35, 0xca, 0x8d, 0xd9, 0x8a, 0xae, 0x27, 0x8a, + 0x65, 0xd2, 0x28, 0xe9, 0x9d, 0xce, 0x4b, 0xe9, 0xc3, 0x1a, 0x36, 0x47, 0x6d, 0x7f, 0xfc, 0x44, + 0x9b, 0xfa, 0x40, 0x4d, 0x3a, 0x21, 0x44, 0xad, 0x9f, 0xac, 0xb4, 0x06, 0xb6, 0x7e, 0x52, 0xe1, + 0x71, 0xb5, 0x7e, 0xae, 0xcb, 0x77, 0x50, 0xeb, 0xe7, 0xfa, 0xc8, 0x7a, 0x1f, 0xd6, 0x32, 0x02, + 0xdd, 0xe4, 0x0d, 0x69, 0xd8, 0x5c, 0x1b, 0x04, 0xdf, 0xce, 0x0c, 0x88, 0x92, 0x11, 0x6c, 0x61, + 0x99, 0xf6, 0x74, 0x9a, 0x88, 0xab, 0xbe, 0xae, 0x15, 0xc8, 0x88, 0x15, 0xc7, 0x54, 0x99, 0x44, + 0xbc, 0xb8, 0x0f, 0xcd, 0x64, 0x48, 0x92, 0x5c, 0x4f, 0xbe, 0x7d, 0x27, 0xa6, 0xb2, 0xa7, 0xc3, + 0x98, 0xe4, 0x0b, 0x15, 0x18, 0x4d, 0xb4, 0xf1, 0x4e, 0xf4, 0x59, 0xb4, 0xcc, 0x30, 0xae, 0xb2, + 0x06, 0x32, 0xe3, 0xaa, 0xe4, 0x17, 0x61, 0x2b, 0xc9, 0xd1, 0xb2, 0xe6, 0xbb, 0x59, 0xc3, 0x75, + 0xad, 0x2a, 0x17, 0xef, 0xd0, 0xc3, 0x1c, 0x13, 0xc4, 0x7a, 0xf8, 0x52, 0x31, 0x52, 0x46, 0x1c, + 0x55, 0x31, 0x52, 0x66, 0xbc, 0xf3, 0x08, 0x56, 0x12, 0x91, 0x4b, 0xa5, 0x06, 0x67, 0xc7, 0x3a, + 0x95, 0x1a, 0x7c, 0x5d, 0xc0, 0x73, 0x08, 0xcd, 0x64, 0x4c, 0x52, 0xcd, 0xf5, 0x35, 0x71, 0xce, + 0xed, 0x3b, 0xd7, 0xe2, 0xe3, 0xcd, 0xd4, 0xa2, 0x77, 0xb1, 0x66, 0xa6, 0x63, 0x8e, 0xb1, 0x66, + 0x66, 0xc4, 0x0e, 0x77, 0xde, 0xf9, 0xa5, 0xef, 0x9c, 0x39, 0xe1, 0xf9, 0xe2, 0xe4, 0xc1, 0xd8, + 0x9b, 0xbd, 0x3f, 0x95, 0x5e, 0x0d, 0x71, 0xc0, 0xfb, 0xfd, 0xa9, 0x3b, 0x79, 0x9f, 0x57, 0x70, + 0xb2, 0x34, 0xf7, 0xbd, 0xd0, 0xfb, 0xf0, 0xff, 0x06, 0x00, 0x00, 0xff, 0xff, 0x30, 0x03, 0xfc, + 0xc8, 0x7a, 0x8a, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -13331,6 +13454,10 @@ type LightningClient interface { //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) + // lncli: `listpermissions` + //ListPermissions lists all RPC method URIs and their required macaroon + //permissions to access them. + ListPermissions(ctx context.Context, in *ListPermissionsRequest, opts ...grpc.CallOption) (*ListPermissionsResponse, error) } type lightningClient struct { @@ -14115,6 +14242,15 @@ func (c *lightningClient) DeleteMacaroonID(ctx context.Context, in *DeleteMacaro return out, nil } +func (c *lightningClient) ListPermissions(ctx context.Context, in *ListPermissionsRequest, opts ...grpc.CallOption) (*ListPermissionsResponse, error) { + out := new(ListPermissionsResponse) + err := c.cc.Invoke(ctx, "/lnrpc.Lightning/ListPermissions", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // LightningServer is the server API for Lightning service. type LightningServer interface { // lncli: `walletbalance` @@ -14463,6 +14599,10 @@ type LightningServer interface { //DeleteMacaroonID deletes the specified macaroon ID and invalidates all //macaroons derived from that ID. DeleteMacaroonID(context.Context, *DeleteMacaroonIDRequest) (*DeleteMacaroonIDResponse, error) + // lncli: `listpermissions` + //ListPermissions lists all RPC method URIs and their required macaroon + //permissions to access them. + ListPermissions(context.Context, *ListPermissionsRequest) (*ListPermissionsResponse, error) } // UnimplementedLightningServer can be embedded to have forward compatible implementations. @@ -14643,6 +14783,9 @@ func (*UnimplementedLightningServer) ListMacaroonIDs(ctx context.Context, req *L func (*UnimplementedLightningServer) DeleteMacaroonID(ctx context.Context, req *DeleteMacaroonIDRequest) (*DeleteMacaroonIDResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteMacaroonID not implemented") } +func (*UnimplementedLightningServer) ListPermissions(ctx context.Context, req *ListPermissionsRequest) (*ListPermissionsResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ListPermissions not implemented") +} func RegisterLightningServer(s *grpc.Server, srv LightningServer) { s.RegisterService(&_Lightning_serviceDesc, srv) @@ -15740,6 +15883,24 @@ func _Lightning_DeleteMacaroonID_Handler(srv interface{}, ctx context.Context, d return interceptor(ctx, in, info, handler) } +func _Lightning_ListPermissions_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ListPermissionsRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(LightningServer).ListPermissions(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/lnrpc.Lightning/ListPermissions", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(LightningServer).ListPermissions(ctx, req.(*ListPermissionsRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _Lightning_serviceDesc = grpc.ServiceDesc{ ServiceName: "lnrpc.Lightning", HandlerType: (*LightningServer)(nil), @@ -15932,6 +16093,10 @@ var _Lightning_serviceDesc = grpc.ServiceDesc{ MethodName: "DeleteMacaroonID", Handler: _Lightning_DeleteMacaroonID_Handler, }, + { + MethodName: "ListPermissions", + Handler: _Lightning_ListPermissions_Handler, + }, }, Streams: []grpc.StreamDesc{ { diff --git a/lnrpc/rpc.pb.gw.go b/lnrpc/rpc.pb.gw.go index f1fefe99..e3f63d79 100644 --- a/lnrpc/rpc.pb.gw.go +++ b/lnrpc/rpc.pb.gw.go @@ -1985,6 +1985,24 @@ func local_request_Lightning_DeleteMacaroonID_0(ctx context.Context, marshaler r } +func request_Lightning_ListPermissions_0(ctx context.Context, marshaler runtime.Marshaler, client LightningClient, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListPermissionsRequest + var metadata runtime.ServerMetadata + + msg, err := client.ListPermissions(ctx, &protoReq, grpc.Header(&metadata.HeaderMD), grpc.Trailer(&metadata.TrailerMD)) + return msg, metadata, err + +} + +func local_request_Lightning_ListPermissions_0(ctx context.Context, marshaler runtime.Marshaler, server LightningServer, req *http.Request, pathParams map[string]string) (proto.Message, runtime.ServerMetadata, error) { + var protoReq ListPermissionsRequest + var metadata runtime.ServerMetadata + + msg, err := server.ListPermissions(ctx, &protoReq) + return msg, metadata, err + +} + // RegisterLightningHandlerServer registers the http handlers for service Lightning to "mux". // UnaryRPC :call LightningServer directly. // StreamingRPC :currently unsupported pending https://github.com/grpc/grpc-go/issues/906. @@ -2986,6 +3004,26 @@ func RegisterLightningHandlerServer(ctx context.Context, mux *runtime.ServeMux, }) + mux.Handle("GET", pattern_Lightning_ListPermissions_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_ListPermissions_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_ListPermissions_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -4127,6 +4165,26 @@ func RegisterLightningHandlerClient(ctx context.Context, mux *runtime.ServeMux, }) + mux.Handle("GET", pattern_Lightning_ListPermissions_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_ListPermissions_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_ListPermissions_0(ctx, mux, outboundMarshaler, w, req, resp, mux.GetForwardResponseOptions()...) + + }) + return nil } @@ -4240,6 +4298,8 @@ var ( 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))) + + pattern_Lightning_ListPermissions_0 = runtime.MustPattern(runtime.NewPattern(1, []int{2, 0, 2, 1, 2, 2}, []string{"v1", "macaroon", "permissions"}, "", runtime.AssumeColonVerbOpt(true))) ) var ( @@ -4352,4 +4412,6 @@ var ( forward_Lightning_ListMacaroonIDs_0 = runtime.ForwardResponseMessage forward_Lightning_DeleteMacaroonID_0 = runtime.ForwardResponseMessage + + forward_Lightning_ListPermissions_0 = runtime.ForwardResponseMessage ) diff --git a/lnrpc/rpc.proto b/lnrpc/rpc.proto index f9d67683..4ecb5fb1 100644 --- a/lnrpc/rpc.proto +++ b/lnrpc/rpc.proto @@ -506,6 +506,13 @@ service Lightning { */ rpc DeleteMacaroonID (DeleteMacaroonIDRequest) returns (DeleteMacaroonIDResponse); + + /* lncli: `listpermissions` + ListPermissions lists all RPC method URIs and their required macaroon + permissions to access them. + */ + rpc ListPermissions (ListPermissionsRequest) + returns (ListPermissionsResponse); } message Utxo { @@ -3375,6 +3382,21 @@ message DeleteMacaroonIDResponse { bool deleted = 1; } +message MacaroonPermissionList { + // A list of macaroon permissions. + repeated MacaroonPermission permissions = 1; +} + +message ListPermissionsRequest { +} +message ListPermissionsResponse { + /* + A map between all RPC method URIs and their required macaroon permissions to + access them. + */ + map method_permissions = 1; +} + message Failure { enum FailureCode { /* diff --git a/lnrpc/rpc.swagger.json b/lnrpc/rpc.swagger.json index 84a704c6..81c55a86 100644 --- a/lnrpc/rpc.swagger.json +++ b/lnrpc/rpc.swagger.json @@ -1456,6 +1456,29 @@ ] } }, + "/v1/macaroon/permissions": { + "get": { + "summary": "lncli: `listpermissions`\nListPermissions lists all RPC method URIs and their required macaroon\npermissions to access them.", + "operationId": "ListPermissions", + "responses": { + "200": { + "description": "A successful response.", + "schema": { + "$ref": "#/definitions/lnrpcListPermissionsResponse" + } + }, + "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.", @@ -4220,6 +4243,18 @@ } } }, + "lnrpcListPermissionsResponse": { + "type": "object", + "properties": { + "method_permissions": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/lnrpcMacaroonPermissionList" + }, + "description": "A map between all RPC method URIs and their required macaroon permissions to\naccess them." + } + } + }, "lnrpcListUnspentResponse": { "type": "object", "properties": { @@ -4260,6 +4295,18 @@ } } }, + "lnrpcMacaroonPermissionList": { + "type": "object", + "properties": { + "permissions": { + "type": "array", + "items": { + "$ref": "#/definitions/lnrpcMacaroonPermission" + }, + "description": "A list of macaroon permissions." + } + } + }, "lnrpcMultiChanBackup": { "type": "object", "properties": { diff --git a/rpcserver.go b/rpcserver.go index 86c82eab..be6e7a8e 100644 --- a/rpcserver.go +++ b/rpcserver.go @@ -453,6 +453,10 @@ func mainRPCServerPermissions() map[string][]bakery.Op { Entity: "macaroon", Action: "write", }}, + "/lnrpc.Lightning/ListPermissions": {{ + Entity: "info", + Action: "read", + }}, "/lnrpc.Lightning/SubscribePeerEvents": {{ Entity: "peers", Action: "read", @@ -6572,6 +6576,33 @@ func (r *rpcServer) DeleteMacaroonID(ctx context.Context, }, nil } +// ListPermissions lists all RPC method URIs and their required macaroon +// permissions to access them. +func (r *rpcServer) ListPermissions(_ context.Context, + _ *lnrpc.ListPermissionsRequest) (*lnrpc.ListPermissionsResponse, + error) { + + rpcsLog.Debugf("[listpermissions]") + + permissionMap := make(map[string]*lnrpc.MacaroonPermissionList) + for uri, perms := range r.allPermissions { + rpcPerms := make([]*lnrpc.MacaroonPermission, len(perms)) + for idx, perm := range perms { + rpcPerms[idx] = &lnrpc.MacaroonPermission{ + Entity: perm.Entity, + Action: perm.Action, + } + } + permissionMap[uri] = &lnrpc.MacaroonPermissionList{ + Permissions: rpcPerms, + } + } + + return &lnrpc.ListPermissionsResponse{ + MethodPermissions: permissionMap, + }, nil +} + // FundingStateStep is an advanced funding related call that allows the caller // 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 From 906011f2783931a4209905fffa023b7a315f7bf2 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Fri, 4 Sep 2020 09:22:39 +0200 Subject: [PATCH 04/12] itest: add _test file name suffix to tests To fix the compiler of some IDEs complaining about types and functions it cannot find, we rename all files that contain tests back to lnd_xxx_test.go to make sure they are compiled correctly. --- lntest/itest/{macaroons.go => lnd_macaroons_test.go} | 0 ...ror-propagation.go => lnd_multi-hop-error-propagation_test.go} | 0 .../{lnd_multi-hop-payments.go => lnd_multi-hop-payments_test.go} | 0 lntest/itest/{onchain.go => lnd_onchain_test.go} | 0 lntest/itest/{psbt.go => lnd_psbt_test.go} | 0 lntest/itest/{rest_api.go => lnd_rest_api_test.go} | 0 ..._multi_path_payment.go => lnd_send_multi_path_payment_test.go} | 0 7 files changed, 0 insertions(+), 0 deletions(-) rename lntest/itest/{macaroons.go => lnd_macaroons_test.go} (100%) rename lntest/itest/{lnd_multi-hop-error-propagation.go => lnd_multi-hop-error-propagation_test.go} (100%) rename lntest/itest/{lnd_multi-hop-payments.go => lnd_multi-hop-payments_test.go} (100%) rename lntest/itest/{onchain.go => lnd_onchain_test.go} (100%) rename lntest/itest/{psbt.go => lnd_psbt_test.go} (100%) rename lntest/itest/{rest_api.go => lnd_rest_api_test.go} (100%) rename lntest/itest/{lnd_send_multi_path_payment.go => lnd_send_multi_path_payment_test.go} (100%) diff --git a/lntest/itest/macaroons.go b/lntest/itest/lnd_macaroons_test.go similarity index 100% rename from lntest/itest/macaroons.go rename to lntest/itest/lnd_macaroons_test.go diff --git a/lntest/itest/lnd_multi-hop-error-propagation.go b/lntest/itest/lnd_multi-hop-error-propagation_test.go similarity index 100% rename from lntest/itest/lnd_multi-hop-error-propagation.go rename to lntest/itest/lnd_multi-hop-error-propagation_test.go diff --git a/lntest/itest/lnd_multi-hop-payments.go b/lntest/itest/lnd_multi-hop-payments_test.go similarity index 100% rename from lntest/itest/lnd_multi-hop-payments.go rename to lntest/itest/lnd_multi-hop-payments_test.go diff --git a/lntest/itest/onchain.go b/lntest/itest/lnd_onchain_test.go similarity index 100% rename from lntest/itest/onchain.go rename to lntest/itest/lnd_onchain_test.go diff --git a/lntest/itest/psbt.go b/lntest/itest/lnd_psbt_test.go similarity index 100% rename from lntest/itest/psbt.go rename to lntest/itest/lnd_psbt_test.go diff --git a/lntest/itest/rest_api.go b/lntest/itest/lnd_rest_api_test.go similarity index 100% rename from lntest/itest/rest_api.go rename to lntest/itest/lnd_rest_api_test.go diff --git a/lntest/itest/lnd_send_multi_path_payment.go b/lntest/itest/lnd_send_multi_path_payment_test.go similarity index 100% rename from lntest/itest/lnd_send_multi_path_payment.go rename to lntest/itest/lnd_send_multi_path_payment_test.go From a929f56781a868bd5745fa719ea8e2b4c7c30d47 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Fri, 4 Sep 2020 09:22:40 +0200 Subject: [PATCH 05/12] itest: use require for macaroon tests --- lntest/itest/lnd_macaroons_test.go | 175 ++++++++--------------------- 1 file changed, 49 insertions(+), 126 deletions(-) diff --git a/lntest/itest/lnd_macaroons_test.go b/lntest/itest/lnd_macaroons_test.go index 662b4dfc..15a13d0b 100644 --- a/lntest/itest/lnd_macaroons_test.go +++ b/lntest/itest/lnd_macaroons_test.go @@ -12,6 +12,8 @@ import ( "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lntest" "github.com/lightningnetwork/lnd/macaroons" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" "gopkg.in/macaroon.v2" ) @@ -38,9 +40,7 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { // First test: Make sure we get an error if we use no macaroons but try // to connect to a node that has macaroon authentication enabled. conn, err := testNode.ConnectRPC(false) - if err != nil { - t.Fatalf("unable to connect to alice: %v", err) - } + require.NoError(t.t, err) defer conn.Close() ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout) defer cancel() @@ -57,9 +57,7 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { macaroon.LatestVersion, ) conn, err = testNode.ConnectRPCWithMacaroon(invalidMac) - if err != nil { - t.Fatalf("unable to connect to alice: %v", err) - } + require.NoError(t.t, err) defer conn.Close() ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) defer cancel() @@ -74,13 +72,9 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { readonlyMac, err := testNode.ReadMacaroon( testNode.ReadMacPath(), defaultTimeout, ) - if err != nil { - t.Fatalf("unable to read readonly.macaroon from node: %v", err) - } + require.NoError(t.t, err) conn, err = testNode.ConnectRPCWithMacaroon(readonlyMac) - if err != nil { - t.Fatalf("unable to connect to alice: %v", err) - } + require.NoError(t.t, err) defer conn.Close() ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) defer cancel() @@ -96,14 +90,9 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { timeoutMac, err := macaroons.AddConstraints( readonlyMac, macaroons.TimeoutConstraint(-30), ) - if err != nil { - t.Fatalf("unable to add constraint to readonly macaroon: %v", - err) - } + require.NoError(t.t, err) conn, err = testNode.ConnectRPCWithMacaroon(timeoutMac) - if err != nil { - t.Fatalf("unable to connect to alice: %v", err) - } + require.NoError(t.t, err) defer conn.Close() ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) defer cancel() @@ -118,14 +107,9 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { invalidIpAddrMac, err := macaroons.AddConstraints( readonlyMac, macaroons.IPLockConstraint("1.1.1.1"), ) - if err != nil { - t.Fatalf("unable to add constraint to readonly macaroon: %v", - err) - } + require.NoError(t.t, err) conn, err = testNode.ConnectRPCWithMacaroon(invalidIpAddrMac) - if err != nil { - t.Fatalf("unable to connect to alice: %v", err) - } + require.NoError(t.t, err) defer conn.Close() ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) defer cancel() @@ -142,32 +126,21 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { adminMac, err := testNode.ReadMacaroon( testNode.AdminMacPath(), defaultTimeout, ) - if err != nil { - t.Fatalf("unable to read admin.macaroon from node: %v", err) - } + require.NoError(t.t, err) adminMac, err = macaroons.AddConstraints( adminMac, macaroons.TimeoutConstraint(30), macaroons.IPLockConstraint("127.0.0.1"), ) - if err != nil { - t.Fatalf("unable to add constraints to admin macaroon: %v", err) - } + require.NoError(t.t, err) conn, err = testNode.ConnectRPCWithMacaroon(adminMac) - if err != nil { - t.Fatalf("unable to connect to alice: %v", err) - } + require.NoError(t.t, err) defer conn.Close() ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) defer cancel() adminMacConnection := lnrpc.NewLightningClient(conn) res, err := adminMacConnection.NewAddress(ctxt, newAddrReq) - if err != nil { - t.Fatalf("unable to get new address with valid macaroon: %v", - err) - } - if !strings.HasPrefix(res.Address, "bcrt1") { - t.Fatalf("returned address was not a regtest address") - } + require.NoError(t.t, err) + assert.Contains(t.t, res.Address, "bcrt1") } // testBakeMacaroon checks that when creating macaroons, the permissions param @@ -185,13 +158,9 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { adminMac, err := testNode.ReadMacaroon( testNode.AdminMacPath(), defaultTimeout, ) - if err != nil { - t.Fatalf("unable to read admin.macaroon from node: %v", err) - } + require.NoError(t.t, err) conn, err := testNode.ConnectRPCWithMacaroon(adminMac) - if err != nil { - t.Fatalf("unable to connect to alice: %v", err) - } + require.NoError(t.t, err) defer conn.Close() ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout) defer cancel() @@ -242,15 +211,11 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { }, } _, err = adminMacConnection.BakeMacaroon(ctxt, req) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } + require.NoError(t.t, err) listReq := &lnrpc.ListMacaroonIDsRequest{} resp, err := adminMacConnection.ListMacaroonIDs(ctxt, listReq) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } + require.NoError(t.t, err) if resp.RootKeyIds[0] != 0 { t.Fatalf("expected ID to be 0, found: %v", resp.RootKeyIds) } @@ -267,15 +232,11 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { }, } bakeResp, err := adminMacConnection.BakeMacaroon(ctxt, req) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } + require.NoError(t.t, err) listReq = &lnrpc.ListMacaroonIDsRequest{} resp, err = adminMacConnection.ListMacaroonIDs(ctxt, listReq) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } + require.NoError(t.t, 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 @@ -296,13 +257,9 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { // 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) - } + require.NoError(t.t, err) conn, err = testNode.ConnectRPCWithMacaroon(newMac) - if err != nil { - t.Fatalf("unable to connect to alice: %v", err) - } + require.NoError(t.t, err) defer conn.Close() ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) defer cancel() @@ -318,9 +275,7 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { // 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) - } + require.NoError(t.t, err) // Current macaroon can only work on entity macaroon, so a GetInfo request // will fail. @@ -345,13 +300,9 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { adminMac, err := testNode.ReadMacaroon( testNode.AdminMacPath(), defaultTimeout, ) - if err != nil { - t.Fatalf("unable to read admin.macaroon from node: %v", err) - } + require.NoError(t.t, err) conn, err := testNode.ConnectRPCWithMacaroon(adminMac) - if err != nil { - t.Fatalf("unable to connect to alice: %v", err) - } + require.NoError(t.t, err) defer conn.Close() ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout) defer cancel() @@ -360,45 +311,32 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { // 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) - } + require.NoError(t.t, err) numMacIDs := len(listResp.RootKeyIds) // Create macaroons for testing. rootKeyIDs := []uint64{1, 2, 3} - macList := []string{} + macList := make([]string, 0, len(rootKeyIDs)) for _, id := range rootKeyIDs { req := &lnrpc.BakeMacaroonRequest{ RootKeyId: id, - Permissions: []*lnrpc.MacaroonPermission{ - { - Entity: "macaroon", - Action: "read", - }, - }, + Permissions: []*lnrpc.MacaroonPermission{{ + Entity: "macaroon", + Action: "read", + }}, } resp, err := adminMacConnection.BakeMacaroon(ctxt, req) - if err != nil { - t.Fatalf("expected no error, got %v", err) - } + require.NoError(t.t, 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) - } + require.NoError(t.t, 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), - ) - } + // The number of macaroon IDs should be increased by len(rootKeyIDs). + require.Equal(t.t, numMacIDs+len(rootKeyIDs), len(listResp.RootKeyIds)) // First test: check deleting the DefaultRootKeyID returns an error. defaultID, _ := strconv.ParseUint( @@ -408,45 +346,32 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { RootKeyId: defaultID, } _, err = adminMacConnection.DeleteMacaroonID(ctxt, req) - if err == nil || !errContains(err, macaroons.ErrDeletionForbidden.Error()) { - t.Fatalf("expected an error, got %v", err) - } + require.Error(t.t, err) + require.Contains( + t.t, err.Error(), macaroons.ErrDeletionForbidden.Error(), + ) // 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") - } + require.NoError(t.t, err) + require.True(t.t, resp.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) - } + require.NoError(t.t, 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), - ) - } + require.Equal(t.t, 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) - } + require.NoError(t.t, err) conn, err = testNode.ConnectRPCWithMacaroon(deletedMac) - if err != nil { - t.Fatalf("unable to connect to alice: %v", err) - } + require.NoError(t.t, err) defer conn.Close() ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) defer cancel() @@ -455,10 +380,8 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { // 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) - } - + require.Error(t.t, err) + require.Contains(t.t, err.Error(), "cannot get macaroon") } // readMacaroonFromHex loads a macaroon from a hex string. From 17276e9a7f1a604754e05915f93f18eb828ad3bf Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Fri, 4 Sep 2020 09:22:42 +0200 Subject: [PATCH 06/12] itest: use only one timeout context All these operations should be very fast and can be done in just one timeout context. --- lntest/itest/lnd_macaroons_test.go | 26 ++++++-------------------- 1 file changed, 6 insertions(+), 20 deletions(-) diff --git a/lntest/itest/lnd_macaroons_test.go b/lntest/itest/lnd_macaroons_test.go index 15a13d0b..b7df5e32 100644 --- a/lntest/itest/lnd_macaroons_test.go +++ b/lntest/itest/lnd_macaroons_test.go @@ -36,14 +36,14 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { } testNode = net.Alice ) + ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout) + defer cancel() // First test: Make sure we get an error if we use no macaroons but try // to connect to a node that has macaroon authentication enabled. conn, err := testNode.ConnectRPC(false) require.NoError(t.t, err) defer conn.Close() - ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout) - defer cancel() noMacConnection := lnrpc.NewLightningClient(conn) _, err = noMacConnection.GetInfo(ctxt, infoReq) if err == nil || !errContains(err, "expected 1 macaroon") { @@ -59,8 +59,6 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { conn, err = testNode.ConnectRPCWithMacaroon(invalidMac) require.NoError(t.t, err) defer conn.Close() - ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) - defer cancel() invalidMacConnection := lnrpc.NewLightningClient(conn) _, err = invalidMacConnection.GetInfo(ctxt, infoReq) if err == nil || !errContains(err, "cannot get macaroon") { @@ -76,8 +74,6 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { conn, err = testNode.ConnectRPCWithMacaroon(readonlyMac) require.NoError(t.t, err) defer conn.Close() - ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) - defer cancel() readonlyMacConnection := lnrpc.NewLightningClient(conn) _, err = readonlyMacConnection.NewAddress(ctxt, newAddrReq) if err == nil || !errContains(err, "permission denied") { @@ -94,8 +90,6 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { conn, err = testNode.ConnectRPCWithMacaroon(timeoutMac) require.NoError(t.t, err) defer conn.Close() - ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) - defer cancel() timeoutMacConnection := lnrpc.NewLightningClient(conn) _, err = timeoutMacConnection.GetInfo(ctxt, infoReq) if err == nil || !errContains(err, "macaroon has expired") { @@ -111,8 +105,6 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { conn, err = testNode.ConnectRPCWithMacaroon(invalidIpAddrMac) require.NoError(t.t, err) defer conn.Close() - ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) - defer cancel() invalidIpAddrMacConnection := lnrpc.NewLightningClient(conn) _, err = invalidIpAddrMacConnection.GetInfo(ctxt, infoReq) if err == nil || !errContains(err, "different IP address") { @@ -135,8 +127,6 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { conn, err = testNode.ConnectRPCWithMacaroon(adminMac) require.NoError(t.t, err) defer conn.Close() - ctxt, cancel = context.WithTimeout(ctxb, defaultTimeout) - defer cancel() adminMacConnection := lnrpc.NewLightningClient(conn) res, err := adminMacConnection.NewAddress(ctxt, newAddrReq) require.NoError(t.t, err) @@ -152,6 +142,8 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { req = &lnrpc.BakeMacaroonRequest{} testNode = net.Alice ) + ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout) + defer cancel() // First test: when the permission list is empty in the request, an error // should be returned. @@ -162,8 +154,6 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { conn, err := testNode.ConnectRPCWithMacaroon(adminMac) require.NoError(t.t, 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") { @@ -261,8 +251,6 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { conn, err = testNode.ConnectRPCWithMacaroon(newMac) require.NoError(t.t, 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 @@ -295,6 +283,8 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { ctxb = context.Background() testNode = net.Alice ) + ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout) + defer cancel() // Use admin macaroon to create a connection. adminMac, err := testNode.ReadMacaroon( @@ -304,8 +294,6 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { conn, err := testNode.ConnectRPCWithMacaroon(adminMac) require.NoError(t.t, err) defer conn.Close() - ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout) - defer cancel() adminMacConnection := lnrpc.NewLightningClient(conn) // Record the number of macaroon IDs before creation. @@ -373,8 +361,6 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { conn, err = testNode.ConnectRPCWithMacaroon(deletedMac) require.NoError(t.t, 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. From 9862ee7cd663424e6a7c5dc90795e4ce28b3c2e6 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Fri, 4 Sep 2020 09:22:43 +0200 Subject: [PATCH 07/12] itest: extract connection setup --- lntest/itest/lnd_macaroons_test.go | 118 ++++++++++++++--------------- 1 file changed, 57 insertions(+), 61 deletions(-) diff --git a/lntest/itest/lnd_macaroons_test.go b/lntest/itest/lnd_macaroons_test.go index b7df5e32..d808af55 100644 --- a/lntest/itest/lnd_macaroons_test.go +++ b/lntest/itest/lnd_macaroons_test.go @@ -8,6 +8,7 @@ import ( "sort" "strconv" "strings" + "testing" "github.com/lightningnetwork/lnd/lnrpc" "github.com/lightningnetwork/lnd/lntest" @@ -44,8 +45,8 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { conn, err := testNode.ConnectRPC(false) require.NoError(t.t, err) defer conn.Close() - noMacConnection := lnrpc.NewLightningClient(conn) - _, err = noMacConnection.GetInfo(ctxt, infoReq) + client := lnrpc.NewLightningClient(conn) + _, err = client.GetInfo(ctxt, infoReq) if err == nil || !errContains(err, "expected 1 macaroon") { t.Fatalf("expected to get an error when connecting without " + "macaroons") @@ -56,11 +57,9 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { []byte("dummy_root_key"), []byte("0"), "itest", macaroon.LatestVersion, ) - conn, err = testNode.ConnectRPCWithMacaroon(invalidMac) - require.NoError(t.t, err) - defer conn.Close() - invalidMacConnection := lnrpc.NewLightningClient(conn) - _, err = invalidMacConnection.GetInfo(ctxt, infoReq) + cleanup, client := macaroonClient(t.t, testNode, invalidMac) + defer cleanup() + _, err = client.GetInfo(ctxt, infoReq) if err == nil || !errContains(err, "cannot get macaroon") { t.Fatalf("expected to get an error when connecting with an " + "invalid macaroon") @@ -71,11 +70,9 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { testNode.ReadMacPath(), defaultTimeout, ) require.NoError(t.t, err) - conn, err = testNode.ConnectRPCWithMacaroon(readonlyMac) - require.NoError(t.t, err) - defer conn.Close() - readonlyMacConnection := lnrpc.NewLightningClient(conn) - _, err = readonlyMacConnection.NewAddress(ctxt, newAddrReq) + cleanup, client = macaroonClient(t.t, testNode, readonlyMac) + defer cleanup() + _, err = client.NewAddress(ctxt, newAddrReq) if err == nil || !errContains(err, "permission denied") { t.Fatalf("expected to get an error when connecting to " + "write method with read-only macaroon") @@ -87,11 +84,9 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { readonlyMac, macaroons.TimeoutConstraint(-30), ) require.NoError(t.t, err) - conn, err = testNode.ConnectRPCWithMacaroon(timeoutMac) - require.NoError(t.t, err) - defer conn.Close() - timeoutMacConnection := lnrpc.NewLightningClient(conn) - _, err = timeoutMacConnection.GetInfo(ctxt, infoReq) + cleanup, client = macaroonClient(t.t, testNode, timeoutMac) + defer cleanup() + _, err = client.GetInfo(ctxt, infoReq) if err == nil || !errContains(err, "macaroon has expired") { t.Fatalf("expected to get an error when connecting with an " + "invalid macaroon") @@ -102,11 +97,9 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { readonlyMac, macaroons.IPLockConstraint("1.1.1.1"), ) require.NoError(t.t, err) - conn, err = testNode.ConnectRPCWithMacaroon(invalidIpAddrMac) - require.NoError(t.t, err) - defer conn.Close() - invalidIpAddrMacConnection := lnrpc.NewLightningClient(conn) - _, err = invalidIpAddrMacConnection.GetInfo(ctxt, infoReq) + cleanup, client = macaroonClient(t.t, testNode, invalidIpAddrMac) + defer cleanup() + _, err = client.GetInfo(ctxt, infoReq) if err == nil || !errContains(err, "different IP address") { t.Fatalf("expected to get an error when connecting with an " + "invalid macaroon") @@ -124,12 +117,10 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { macaroons.IPLockConstraint("127.0.0.1"), ) require.NoError(t.t, err) - conn, err = testNode.ConnectRPCWithMacaroon(adminMac) - require.NoError(t.t, err) - defer conn.Close() - adminMacConnection := lnrpc.NewLightningClient(conn) - res, err := adminMacConnection.NewAddress(ctxt, newAddrReq) - require.NoError(t.t, err) + cleanup, client = macaroonClient(t.t, testNode, adminMac) + defer cleanup() + res, err := client.NewAddress(ctxt, newAddrReq) + require.NoError(t.t, err, "get new address") assert.Contains(t.t, res.Address, "bcrt1") } @@ -151,11 +142,9 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { testNode.AdminMacPath(), defaultTimeout, ) require.NoError(t.t, err) - conn, err := testNode.ConnectRPCWithMacaroon(adminMac) - require.NoError(t.t, err) - defer conn.Close() - adminMacConnection := lnrpc.NewLightningClient(conn) - _, err = adminMacConnection.BakeMacaroon(ctxt, req) + cleanup, client := macaroonClient(t.t, testNode, adminMac) + defer cleanup() + _, err = client.BakeMacaroon(ctxt, req) if err == nil || !errContains(err, "permission list cannot be empty") { t.Fatalf("expected an error, got %v", err) } @@ -170,7 +159,7 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { }, }, } - _, err = adminMacConnection.BakeMacaroon(ctxt, req) + _, err = client.BakeMacaroon(ctxt, req) if err == nil || !errContains(err, "invalid permission action") { t.Fatalf("expected an error, got %v", err) } @@ -185,7 +174,7 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { }, }, } - _, err = adminMacConnection.BakeMacaroon(ctxt, req) + _, err = client.BakeMacaroon(ctxt, req) if err == nil || !errContains(err, "invalid permission entity") { t.Fatalf("expected an error, got %v", err) } @@ -200,11 +189,11 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { }, }, } - _, err = adminMacConnection.BakeMacaroon(ctxt, req) + _, err = client.BakeMacaroon(ctxt, req) require.NoError(t.t, err) listReq := &lnrpc.ListMacaroonIDsRequest{} - resp, err := adminMacConnection.ListMacaroonIDs(ctxt, listReq) + resp, err := client.ListMacaroonIDs(ctxt, listReq) require.NoError(t.t, err) if resp.RootKeyIds[0] != 0 { t.Fatalf("expected ID to be 0, found: %v", resp.RootKeyIds) @@ -221,11 +210,11 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { }, }, } - bakeResp, err := adminMacConnection.BakeMacaroon(ctxt, req) + bakeResp, err := client.BakeMacaroon(ctxt, req) require.NoError(t.t, err) listReq = &lnrpc.ListMacaroonIDsRequest{} - resp, err = adminMacConnection.ListMacaroonIDs(ctxt, listReq) + resp, err = client.ListMacaroonIDs(ctxt, listReq) require.NoError(t.t, err) // the ListMacaroonIDs should give a list of two IDs, the default ID 0, and @@ -248,27 +237,25 @@ func testBakeMacaroon(net *lntest.NetworkHarness, t *harnessTest) { // should succeed in reading, and fail to write a macaroon. newMac, err := readMacaroonFromHex(bakeResp.Macaroon) require.NoError(t.t, err) - conn, err = testNode.ConnectRPCWithMacaroon(newMac) - require.NoError(t.t, err) - defer conn.Close() - newMacConnection := lnrpc.NewLightningClient(conn) + cleanup, client = macaroonClient(t.t, testNode, newMac) + defer cleanup() // BakeMacaroon requires a write permission, so this call should return an // error. - _, err = newMacConnection.BakeMacaroon(ctxt, req) + _, err = client.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) + resp, err = client.ListMacaroonIDs(ctxt, listReq) require.NoError(t.t, err) // Current macaroon can only work on entity macaroon, so a GetInfo request // will fail. infoReq := &lnrpc.GetInfoRequest{} - _, err = newMacConnection.GetInfo(ctxt, infoReq) + _, err = client.GetInfo(ctxt, infoReq) if err == nil || !errContains(err, "permission denied") { t.Fatalf("expected error not returned, got %v", err) } @@ -291,14 +278,12 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { testNode.AdminMacPath(), defaultTimeout, ) require.NoError(t.t, err) - conn, err := testNode.ConnectRPCWithMacaroon(adminMac) - require.NoError(t.t, err) - defer conn.Close() - adminMacConnection := lnrpc.NewLightningClient(conn) + cleanup, client := macaroonClient(t.t, testNode, adminMac) + defer cleanup() // Record the number of macaroon IDs before creation. listReq := &lnrpc.ListMacaroonIDsRequest{} - listResp, err := adminMacConnection.ListMacaroonIDs(ctxt, listReq) + listResp, err := client.ListMacaroonIDs(ctxt, listReq) require.NoError(t.t, err) numMacIDs := len(listResp.RootKeyIds) @@ -313,14 +298,14 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { Action: "read", }}, } - resp, err := adminMacConnection.BakeMacaroon(ctxt, req) + resp, err := client.BakeMacaroon(ctxt, req) require.NoError(t.t, err) macList = append(macList, resp.Macaroon) } // Check that the creation is successful. listReq = &lnrpc.ListMacaroonIDsRequest{} - listResp, err = adminMacConnection.ListMacaroonIDs(ctxt, listReq) + listResp, err = client.ListMacaroonIDs(ctxt, listReq) require.NoError(t.t, err) // The number of macaroon IDs should be increased by len(rootKeyIDs). @@ -333,7 +318,7 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { req := &lnrpc.DeleteMacaroonIDRequest{ RootKeyId: defaultID, } - _, err = adminMacConnection.DeleteMacaroonID(ctxt, req) + _, err = client.DeleteMacaroonID(ctxt, req) require.Error(t.t, err) require.Contains( t.t, err.Error(), macaroons.ErrDeletionForbidden.Error(), @@ -343,13 +328,13 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { req = &lnrpc.DeleteMacaroonIDRequest{ RootKeyId: rootKeyIDs[0], } - resp, err := adminMacConnection.DeleteMacaroonID(ctxt, req) + resp, err := client.DeleteMacaroonID(ctxt, req) require.NoError(t.t, err) require.True(t.t, resp.Deleted) // Check that the deletion is successful. listReq = &lnrpc.ListMacaroonIDsRequest{} - listResp, err = adminMacConnection.ListMacaroonIDs(ctxt, listReq) + listResp, err = client.ListMacaroonIDs(ctxt, listReq) require.NoError(t.t, err) // The number of macaroon IDs should be decreased by 1. @@ -358,14 +343,12 @@ func testDeleteMacaroonID(net *lntest.NetworkHarness, t *harnessTest) { // Check that the deleted macaroon can no longer access macaroon:read. deletedMac, err := readMacaroonFromHex(macList[0]) require.NoError(t.t, err) - conn, err = testNode.ConnectRPCWithMacaroon(deletedMac) - require.NoError(t.t, err) - defer conn.Close() - deletedMacConnection := lnrpc.NewLightningClient(conn) + cleanup, client = macaroonClient(t.t, testNode, deletedMac) + defer cleanup() // Because the macaroon is deleted, it will be treated as an invalid one. listReq = &lnrpc.ListMacaroonIDsRequest{} - _, err = deletedMacConnection.ListMacaroonIDs(ctxt, listReq) + _, err = client.ListMacaroonIDs(ctxt, listReq) require.Error(t.t, err) require.Contains(t.t, err.Error(), "cannot get macaroon") } @@ -383,3 +366,16 @@ func readMacaroonFromHex(macHex string) (*macaroon.Macaroon, error) { } return mac, nil } + +func macaroonClient(t *testing.T, testNode *lntest.HarnessNode, + mac *macaroon.Macaroon) (func(), lnrpc.LightningClient) { + + conn, err := testNode.ConnectRPCWithMacaroon(mac) + require.NoError(t, err, "connect to alice") + + cleanup := func() { + err := conn.Close() + require.NoError(t, err, "close") + } + return cleanup, lnrpc.NewLightningClient(conn) +} From decd2d975c354fa7ca3943085b59d5cca69e4f11 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Fri, 4 Sep 2020 09:22:44 +0200 Subject: [PATCH 08/12] itest: parallelize test steps --- lntest/itest/lnd_macaroons_test.go | 495 +++++++++++++++++------------ 1 file changed, 290 insertions(+), 205 deletions(-) diff --git a/lntest/itest/lnd_macaroons_test.go b/lntest/itest/lnd_macaroons_test.go index d808af55..08e19803 100644 --- a/lntest/itest/lnd_macaroons_test.go +++ b/lntest/itest/lnd_macaroons_test.go @@ -7,7 +7,6 @@ import ( "encoding/hex" "sort" "strconv" - "strings" "testing" "github.com/lightningnetwork/lnd/lnrpc" @@ -18,246 +17,332 @@ import ( "gopkg.in/macaroon.v2" ) -// errContains is a helper function that returns true if a string is contained -// in the message of an error. -func errContains(err error, str string) bool { - return strings.Contains(err.Error(), str) -} - // testMacaroonAuthentication makes sure that if macaroon authentication is // enabled on the gRPC interface, no requests with missing or invalid // macaroons are allowed. Further, the specific access rights (read/write, // entity based) and first-party caveats are tested as well. func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { var ( - ctxb = context.Background() infoReq = &lnrpc.GetInfoRequest{} newAddrReq = &lnrpc.NewAddressRequest{ Type: AddrTypeWitnessPubkeyHash, } testNode = net.Alice ) - ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout) - defer cancel() - // First test: Make sure we get an error if we use no macaroons but try - // to connect to a node that has macaroon authentication enabled. - conn, err := testNode.ConnectRPC(false) - require.NoError(t.t, err) - defer conn.Close() - client := lnrpc.NewLightningClient(conn) - _, err = client.GetInfo(ctxt, infoReq) - if err == nil || !errContains(err, "expected 1 macaroon") { - t.Fatalf("expected to get an error when connecting without " + - "macaroons") + testCases := []struct { + name string + run func(ctxt context.Context, t *testing.T) + }{{ + // First test: Make sure we get an error if we use no macaroons + // but try to connect to a node that has macaroon authentication + // enabled. + name: "no macaroon", + run: func(ctxt context.Context, t *testing.T) { + conn, err := testNode.ConnectRPC(false) + require.NoError(t, err) + defer func() { _ = conn.Close() }() + client := lnrpc.NewLightningClient(conn) + _, err = client.GetInfo(ctxt, infoReq) + require.Error(t, err) + require.Contains(t, err.Error(), "expected 1 macaroon") + }, + }, { + // Second test: Ensure that an invalid macaroon also triggers an + // error. + name: "invalid macaroon", + run: func(ctxt context.Context, t *testing.T) { + invalidMac, _ := macaroon.New( + []byte("dummy_root_key"), []byte("0"), "itest", + macaroon.LatestVersion, + ) + cleanup, client := macaroonClient( + t, testNode, invalidMac, + ) + defer cleanup() + _, err := client.GetInfo(ctxt, infoReq) + require.Error(t, err) + require.Contains(t, err.Error(), "cannot get macaroon") + }, + }, { + // Third test: Try to access a write method with read-only + // macaroon. + name: "read only macaroon", + run: func(ctxt context.Context, t *testing.T) { + readonlyMac, err := testNode.ReadMacaroon( + testNode.ReadMacPath(), defaultTimeout, + ) + require.NoError(t, err) + cleanup, client := macaroonClient( + t, testNode, readonlyMac, + ) + defer cleanup() + _, err = client.NewAddress(ctxt, newAddrReq) + require.Error(t, err) + require.Contains(t, err.Error(), "permission denied") + }, + }, { + // Fourth test: Check first-party caveat with timeout that + // expired 30 seconds ago. + name: "expired macaroon", + run: func(ctxt context.Context, t *testing.T) { + readonlyMac, err := testNode.ReadMacaroon( + testNode.ReadMacPath(), defaultTimeout, + ) + require.NoError(t, err) + timeoutMac, err := macaroons.AddConstraints( + readonlyMac, macaroons.TimeoutConstraint(-30), + ) + require.NoError(t, err) + cleanup, client := macaroonClient( + t, testNode, timeoutMac, + ) + defer cleanup() + _, err = client.GetInfo(ctxt, infoReq) + require.Error(t, err) + require.Contains(t, err.Error(), "macaroon has expired") + }, + }, { + // Fifth test: Check first-party caveat with invalid IP address. + name: "invalid IP macaroon", + run: func(ctxt context.Context, t *testing.T) { + readonlyMac, err := testNode.ReadMacaroon( + testNode.ReadMacPath(), defaultTimeout, + ) + require.NoError(t, err) + invalidIpAddrMac, err := macaroons.AddConstraints( + readonlyMac, macaroons.IPLockConstraint( + "1.1.1.1", + ), + ) + require.NoError(t, err) + cleanup, client := macaroonClient( + t, testNode, invalidIpAddrMac, + ) + defer cleanup() + _, err = client.GetInfo(ctxt, infoReq) + require.Error(t, err) + require.Contains(t, err.Error(), "different IP address") + }, + }, { + // Sixth test: Make sure that if we do everything correct and + // send the admin macaroon with first-party caveats that we can + // satisfy, we get a correct answer. + name: "correct macaroon", + run: func(ctxt context.Context, t *testing.T) { + adminMac, err := testNode.ReadMacaroon( + testNode.AdminMacPath(), defaultTimeout, + ) + require.NoError(t, err) + adminMac, err = macaroons.AddConstraints( + adminMac, macaroons.TimeoutConstraint(30), + macaroons.IPLockConstraint("127.0.0.1"), + ) + require.NoError(t, err) + cleanup, client := macaroonClient(t, testNode, adminMac) + defer cleanup() + res, err := client.NewAddress(ctxt, newAddrReq) + require.NoError(t, err, "get new address") + assert.Contains(t, res.Address, "bcrt1") + }, + }} + + for _, tc := range testCases { + tc := tc + t.t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ctxt, cancel := context.WithTimeout( + context.Background(), defaultTimeout, + ) + defer cancel() + + tc.run(ctxt, t) + }) } - - // Second test: Ensure that an invalid macaroon also triggers an error. - invalidMac, _ := macaroon.New( - []byte("dummy_root_key"), []byte("0"), "itest", - macaroon.LatestVersion, - ) - cleanup, client := macaroonClient(t.t, testNode, invalidMac) - defer cleanup() - _, err = client.GetInfo(ctxt, infoReq) - if err == nil || !errContains(err, "cannot get macaroon") { - t.Fatalf("expected to get an error when connecting with an " + - "invalid macaroon") - } - - // Third test: Try to access a write method with read-only macaroon. - readonlyMac, err := testNode.ReadMacaroon( - testNode.ReadMacPath(), defaultTimeout, - ) - require.NoError(t.t, err) - cleanup, client = macaroonClient(t.t, testNode, readonlyMac) - defer cleanup() - _, err = client.NewAddress(ctxt, newAddrReq) - if err == nil || !errContains(err, "permission denied") { - t.Fatalf("expected to get an error when connecting to " + - "write method with read-only macaroon") - } - - // Fourth test: Check first-party caveat with timeout that expired - // 30 seconds ago. - timeoutMac, err := macaroons.AddConstraints( - readonlyMac, macaroons.TimeoutConstraint(-30), - ) - require.NoError(t.t, err) - cleanup, client = macaroonClient(t.t, testNode, timeoutMac) - defer cleanup() - _, err = client.GetInfo(ctxt, infoReq) - if err == nil || !errContains(err, "macaroon has expired") { - t.Fatalf("expected to get an error when connecting with an " + - "invalid macaroon") - } - - // Fifth test: Check first-party caveat with invalid IP address. - invalidIpAddrMac, err := macaroons.AddConstraints( - readonlyMac, macaroons.IPLockConstraint("1.1.1.1"), - ) - require.NoError(t.t, err) - cleanup, client = macaroonClient(t.t, testNode, invalidIpAddrMac) - defer cleanup() - _, err = client.GetInfo(ctxt, infoReq) - if err == nil || !errContains(err, "different IP address") { - t.Fatalf("expected to get an error when connecting with an " + - "invalid macaroon") - } - - // Sixth test: Make sure that if we do everything correct and send - // the admin macaroon with first-party caveats that we can satisfy, - // we get a correct answer. - adminMac, err := testNode.ReadMacaroon( - testNode.AdminMacPath(), defaultTimeout, - ) - require.NoError(t.t, err) - adminMac, err = macaroons.AddConstraints( - adminMac, macaroons.TimeoutConstraint(30), - macaroons.IPLockConstraint("127.0.0.1"), - ) - require.NoError(t.t, err) - cleanup, client = macaroonClient(t.t, testNode, adminMac) - defer cleanup() - res, err := client.NewAddress(ctxt, newAddrReq) - require.NoError(t.t, err, "get new address") - assert.Contains(t.t, res.Address, "bcrt1") } // 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 - ) - ctxt, cancel := context.WithTimeout(ctxb, defaultTimeout) - defer cancel() + var 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, - ) - require.NoError(t.t, err) - cleanup, client := macaroonClient(t.t, testNode, adminMac) - defer cleanup() - _, err = client.BakeMacaroon(ctxt, req) - if err == nil || !errContains(err, "permission list cannot be empty") { - t.Fatalf("expected an error, got %v", err) - } + testCases := []struct { + name string + run func(ctxt context.Context, t *testing.T, + adminClient lnrpc.LightningClient) + }{{ + // First test: when the permission list is empty in the request, + // an error should be returned. + name: "no permission list", + run: func(ctxt context.Context, t *testing.T, + adminClient lnrpc.LightningClient) { - // 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", - }, + req := &lnrpc.BakeMacaroonRequest{} + _, err := adminClient.BakeMacaroon(ctxt, req) + require.Error(t, err) + assert.Contains( + t, err.Error(), "permission list cannot be "+ + "empty", + ) }, - } - _, err = client.BakeMacaroon(ctxt, req) - if err == nil || !errContains(err, "invalid permission action") { - 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. + name: "invalid permission list", + run: func(ctxt context.Context, t *testing.T, + adminClient lnrpc.LightningClient) { - // 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", - }, + req := &lnrpc.BakeMacaroonRequest{ + Permissions: []*lnrpc.MacaroonPermission{{ + Entity: "macaroon", + Action: "invalid123", + }}, + } + _, err := adminClient.BakeMacaroon(ctxt, req) + require.Error(t, err) + assert.Contains( + t, err.Error(), "invalid permission action", + ) }, - } - _, err = client.BakeMacaroon(ctxt, req) - if err == nil || !errContains(err, "invalid permission entity") { - 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. + name: "invalid permission entity", + run: func(ctxt context.Context, t *testing.T, + adminClient lnrpc.LightningClient) { - // 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", - }, + req := &lnrpc.BakeMacaroonRequest{ + Permissions: []*lnrpc.MacaroonPermission{{ + Entity: "invalid123", + Action: "read", + }}, + } + _, err := adminClient.BakeMacaroon(ctxt, req) + require.Error(t, err) + assert.Contains( + t, err.Error(), "invalid permission entity", + ) }, - } - _, err = client.BakeMacaroon(ctxt, req) - require.NoError(t.t, err) + }, { + // Fourth test: check that when no root key ID is specified, the + // default root keyID is used. + name: "default root key ID", + run: func(ctxt context.Context, t *testing.T, + adminClient lnrpc.LightningClient) { - listReq := &lnrpc.ListMacaroonIDsRequest{} - resp, err := client.ListMacaroonIDs(ctxt, listReq) - require.NoError(t.t, err) - if resp.RootKeyIds[0] != 0 { - t.Fatalf("expected ID to be 0, found: %v", resp.RootKeyIds) - } + req := &lnrpc.BakeMacaroonRequest{ + Permissions: []*lnrpc.MacaroonPermission{{ + Entity: "macaroon", + Action: "read", + }}, + } + _, err := adminClient.BakeMacaroon(ctxt, req) + require.NoError(t, err) - // 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", - }, + listReq := &lnrpc.ListMacaroonIDsRequest{} + resp, err := adminClient.ListMacaroonIDs(ctxt, listReq) + require.NoError(t, err) + require.Equal(t, resp.RootKeyIds[0], uint64(0)) }, - } - bakeResp, err := client.BakeMacaroon(ctxt, req) - require.NoError(t.t, err) + }, { + // Fifth test: create a macaroon use a non-default root key ID. + name: "custom root key ID", + run: func(ctxt context.Context, t *testing.T, + adminClient lnrpc.LightningClient) { - listReq = &lnrpc.ListMacaroonIDsRequest{} - resp, err = client.ListMacaroonIDs(ctxt, listReq) - require.NoError(t.t, err) + rootKeyID := uint64(4200) + req := &lnrpc.BakeMacaroonRequest{ + RootKeyId: rootKeyID, + Permissions: []*lnrpc.MacaroonPermission{{ + Entity: "macaroon", + Action: "read", + }}, + } + _, err := adminClient.BakeMacaroon(ctxt, req) + require.NoError(t, 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], - ) - } + listReq := &lnrpc.ListMacaroonIDsRequest{} + resp, err := adminClient.ListMacaroonIDs(ctxt, listReq) + require.NoError(t, err) - // 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) - require.NoError(t.t, err) - cleanup, client = macaroonClient(t.t, testNode, newMac) - defer cleanup() + // 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] + }) + require.Equal(t, resp.RootKeyIds[0], uint64(0)) + require.Equal(t, resp.RootKeyIds[1], rootKeyID) + }, + }, { + // Sixth test: check the baked macaroon has the intended + // permissions. It should succeed in reading, and fail to write + // a macaroon. + name: "custom macaroon permissions", + run: func(ctxt context.Context, t *testing.T, + adminClient lnrpc.LightningClient) { - // BakeMacaroon requires a write permission, so this call should return an - // error. - _, err = client.BakeMacaroon(ctxt, req) - if err == nil || !errContains(err, "permission denied") { - t.Fatalf("expected an error, got %v", err) - } + rootKeyID := uint64(4200) + req := &lnrpc.BakeMacaroonRequest{ + RootKeyId: rootKeyID, + Permissions: []*lnrpc.MacaroonPermission{{ + Entity: "macaroon", + Action: "read", + }}, + } + bakeResp, err := adminClient.BakeMacaroon(ctxt, req) + require.NoError(t, err) - // ListMacaroon requires a read permission, so this call should succeed. - listReq = &lnrpc.ListMacaroonIDsRequest{} - resp, err = client.ListMacaroonIDs(ctxt, listReq) - require.NoError(t.t, err) + newMac, err := readMacaroonFromHex(bakeResp.Macaroon) + require.NoError(t, err) + cleanup, readOnlyClient := macaroonClient( + t, testNode, newMac, + ) + defer cleanup() - // Current macaroon can only work on entity macaroon, so a GetInfo request - // will fail. - infoReq := &lnrpc.GetInfoRequest{} - _, err = client.GetInfo(ctxt, infoReq) - if err == nil || !errContains(err, "permission denied") { - t.Fatalf("expected error not returned, got %v", err) + // BakeMacaroon requires a write permission, so this + // call should return an error. + _, err = readOnlyClient.BakeMacaroon(ctxt, req) + require.Error(t, err) + require.Contains(t, err.Error(), "permission denied") + + // ListMacaroon requires a read permission, so this call + // should succeed. + listReq := &lnrpc.ListMacaroonIDsRequest{} + _, err = readOnlyClient.ListMacaroonIDs(ctxt, listReq) + require.NoError(t, err) + + // Current macaroon can only work on entity macaroon, so + // a GetInfo request will fail. + infoReq := &lnrpc.GetInfoRequest{} + _, err = readOnlyClient.GetInfo(ctxt, infoReq) + require.Error(t, err) + require.Contains(t, err.Error(), "permission denied") + }, + }} + + for _, tc := range testCases { + tc := tc + t.t.Run(tc.name, func(t *testing.T) { + t.Parallel() + + ctxt, cancel := context.WithTimeout( + context.Background(), defaultTimeout, + ) + defer cancel() + + adminMac, err := testNode.ReadMacaroon( + testNode.AdminMacPath(), defaultTimeout, + ) + require.NoError(t, err) + cleanup, client := macaroonClient(t, testNode, adminMac) + defer cleanup() + + tc.run(ctxt, t, client) + }) } } From 295bd44fea21d81a8eb240aaef637cba1f5348d7 Mon Sep 17 00:00:00 2001 From: Oliver Gugger Date: Fri, 4 Sep 2020 09:22:46 +0200 Subject: [PATCH 09/12] itest: test custom permissions --- lntest/itest/lnd_macaroons_test.go | 50 ++++++++++++++++++++++++++++ lntest/itest/log_error_whitelist.txt | 6 ++-- 2 files changed, 53 insertions(+), 3 deletions(-) diff --git a/lntest/itest/lnd_macaroons_test.go b/lntest/itest/lnd_macaroons_test.go index 08e19803..8b939362 100644 --- a/lntest/itest/lnd_macaroons_test.go +++ b/lntest/itest/lnd_macaroons_test.go @@ -145,6 +145,56 @@ func testMacaroonAuthentication(net *lntest.NetworkHarness, t *harnessTest) { require.NoError(t, err, "get new address") assert.Contains(t, res.Address, "bcrt1") }, + }, { + // Seventh test: Bake a macaroon that can only access exactly + // two RPCs and make sure it works as expected. + name: "custom URI permissions", + run: func(ctxt context.Context, t *testing.T) { + entity := macaroons.PermissionEntityCustomURI + req := &lnrpc.BakeMacaroonRequest{ + Permissions: []*lnrpc.MacaroonPermission{{ + Entity: entity, + Action: "/lnrpc.Lightning/GetInfo", + }, { + Entity: entity, + Action: "/lnrpc.Lightning/List" + + "Permissions", + }}, + } + bakeRes, err := testNode.BakeMacaroon(ctxt, req) + require.NoError(t, err) + + // Create a connection that uses the custom macaroon. + customMacBytes, err := hex.DecodeString( + bakeRes.Macaroon, + ) + require.NoError(t, err) + customMac := &macaroon.Macaroon{} + err = customMac.UnmarshalBinary(customMacBytes) + require.NoError(t, err) + cleanup, client := macaroonClient( + t, testNode, customMac, + ) + defer cleanup() + + // Call GetInfo which should succeed. + _, err = client.GetInfo(ctxt, infoReq) + require.NoError(t, err) + + // Call ListPermissions which should also succeed. + permReq := &lnrpc.ListPermissionsRequest{} + permRes, err := client.ListPermissions(ctxt, permReq) + require.NoError(t, err) + require.Greater( + t, len(permRes.MethodPermissions), 10, + "permissions", + ) + + // Try NewAddress which should be denied. + _, err = client.NewAddress(ctxt, newAddrReq) + require.Error(t, err) + require.Contains(t, err.Error(), "permission denied") + }, }} for _, tc := range testCases { diff --git a/lntest/itest/log_error_whitelist.txt b/lntest/itest/log_error_whitelist.txt index 8fa26729..831f49c2 100644 --- a/lntest/itest/log_error_whitelist.txt +++ b/lntest/itest/log_error_whitelist.txt @@ -208,7 +208,7 @@