From da730b372ec992200d354c426dfb12e566071366 Mon Sep 17 00:00:00 2001 From: Marco Dinis Date: Wed, 23 Oct 2024 10:35:43 +0100 Subject: [PATCH 1/2] Notify users of pending User Tasks User Tasks is a new resource that contains issues about an integration. For now, User Tasks are only created to register issues related to auto enrolling EC2 instances. Other types of issues will be registered in the future. Users must proactively list User Tasks in order to understand existing issues. For now, this can only be done using `tctl get user_task`. An UI for this new resource will be created, but users still need to navigate to that UI to see what issues exist. This PR creates a new Notification type which is used to explicitly notify the user that the Integration has pending User Tasks. When are users notified about pending User Tasks? When a User Task is created or updated, if its state is OPEN, then a notification is created. Given that we can have dozens of UserTasks for a single integration, we had to ensure only one Notification exists per Integration. To do that, the current Notification ID is stored in the Integration's Status field. This way, when we try to create a new Notification, we ensure the existing one is deleted to prevent showing two (or more) Notifications saying "Your integration needs attention". All of this is protected by a semaphore lock. The DiscoveryService is highly async and multiple UserTasks can be created in parallel, and the locks prevents it. --- api/proto/teleport/legacy/types/types.proto | 19 + api/types/constants.go | 6 + api/types/integration.go | 27 + api/types/notifications/notifications.go | 56 + api/types/types.pb.go | 1211 ++++++++++------- lib/auth/usertasks/usertasksv1/service.go | 87 +- .../usertasks/usertasksv1/service_test.go | 146 +- lib/srv/discovery/status.go | 31 +- 8 files changed, 1096 insertions(+), 487 deletions(-) create mode 100644 api/types/notifications/notifications.go diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index d81f1c5ab0a44..35179685047b9 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -7631,6 +7631,25 @@ message IntegrationV1 { (gogoproto.nullable) = false, (gogoproto.jsontag) = "spec" ]; + + // Status has the current state of the integration. + IntegrationStatusV1 Status = 3 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "status" + ]; +} + +// IntegrationStatusV1 contains the current status for a given integration. +message IntegrationStatusV1 { + // PendingUserTasksNotificationID contains the notification ID that indicates that this integration has unresolved user tasks. + string PendingUserTasksNotificationID = 1 [(gogoproto.jsontag) = "pending_user_tasks_notification_id,omitempty"]; + // NeedsAttentionNotificationExpires contains the expiration date for the notification. + // Used to ensure new notifications' expiration is the greater between the current notification and the new one. + google.protobuf.Timestamp PendingUserTasksNotificationExpires = 2 [ + (gogoproto.stdtime) = true, + (gogoproto.nullable) = true, + (gogoproto.jsontag) = "pending_user_tasks_notification_expires,omitempty" + ]; } // IntegrationSpecV1 contains properties of all the supported integrations. diff --git a/api/types/constants.go b/api/types/constants.go index 10aa2322998d3..650811765ec07 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -1156,6 +1156,12 @@ const ( // NotificationUserCreatedWarningSubKind is the subkind for a user-created warning notification. NotificationUserCreatedWarningSubKind = "user-created-warning" + // NotificationPendingUserTaskIntegrationSubKind is the subkind for a notification that warns the user about pending User Tasks for a given integration. + NotificationPendingUserTaskIntegrationSubKind = "pending-user-task-for-integration" + // NotificationIntegrationLabel is the label which contains the name of the integration. + // To be used with NotificationUserTaskIntegrationSubKind. + NotificationIntegrationLabel = "integration-name" + // NotificationAccessRequestPendingSubKind is the subkind for a notification for an access request pending review. NotificationAccessRequestPendingSubKind = "access-request-pending" // NotificationAccessRequestApprovedSubKind is the subkind for a notification for a user's access request being approved. diff --git a/api/types/integration.go b/api/types/integration.go index 175d6f2df4c10..3cfe742697356 100644 --- a/api/types/integration.go +++ b/api/types/integration.go @@ -78,6 +78,11 @@ type Integration interface { GetCredentials() PluginCredentials // WithoutCredentials returns a copy without credentials. WithoutCredentials() Integration + + // GetStatus returns the Integration Status. + GetStatus() IntegrationStatusV1 + // SetStatus sets the Integration Status. + SetStatus(IntegrationStatusV1) } var _ ResourceWithLabels = (*IntegrationV1)(nil) @@ -339,6 +344,22 @@ func (ig *IntegrationV1) SetGitHubIntegrationSpec(spec *GitHubIntegrationSpecV1) } } +// GetStatus returns the Integration Status. +func (ig *IntegrationV1) GetStatus() IntegrationStatusV1 { + if ig == nil { + return IntegrationStatusV1{} + } + return ig.Status +} + +// SetStatus sets the Integration Status. +func (ig *IntegrationV1) SetStatus(s IntegrationStatusV1) { + if ig == nil { + return + } + ig.Status = s +} + // Integrations is a list of Integration resources. type Integrations []Integration @@ -393,6 +414,7 @@ func (ig *IntegrationV1) UnmarshalJSON(data []byte) error { GitHub json.RawMessage `json:"github"` Credentials json.RawMessage `json:"credentials"` } `json:"spec"` + Status IntegrationStatusV1 `json:"status"` }{} err := json.Unmarshal(data, &d) @@ -401,6 +423,8 @@ func (ig *IntegrationV1) UnmarshalJSON(data []byte) error { } integration.ResourceHeader = d.ResourceHeader + integration.Status = d.Status + if len(d.Spec.Credentials) != 0 { var credentials PluginCredentialsV1 if err := protojson.Unmarshal(d.Spec.Credentials, protoadapt.MessageV2Of(&credentials)); err != nil { @@ -468,9 +492,12 @@ func (ig *IntegrationV1) MarshalJSON() ([]byte, error) { GitHub GitHubIntegrationSpecV1 `json:"github,omitempty"` Credentials json.RawMessage `json:"credentials,omitempty"` } `json:"spec"` + Status IntegrationStatusV1 `json:"status"` }{} d.ResourceHeader = ig.ResourceHeader + d.Status = ig.Status + if ig.Spec.Credentials != nil { data, err := protojson.Marshal(protoadapt.MessageV2Of(ig.Spec.Credentials)) if err != nil { diff --git a/api/types/notifications/notifications.go b/api/types/notifications/notifications.go new file mode 100644 index 0000000000000..46d13dd21d930 --- /dev/null +++ b/api/types/notifications/notifications.go @@ -0,0 +1,56 @@ +/* +Copyright 2024 Gravitational, Inc. + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. +*/ + +package notifications + +import ( + "time" + + "google.golang.org/protobuf/types/known/timestamppb" + + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + notificationsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" + "github.com/gravitational/teleport/api/types" +) + +// NewPendingUserTasksIntegrationNotification creates a new GlobalNotification for warning the users about pending UserTasks related to an integration. +func NewPendingUserTasksIntegrationNotification(integrationName string, expires time.Time) *notificationsv1.GlobalNotification { + return ¬ificationsv1.GlobalNotification{ + Spec: ¬ificationsv1.GlobalNotificationSpec{ + Matcher: ¬ificationsv1.GlobalNotificationSpec_ByPermissions{ + ByPermissions: ¬ificationsv1.ByPermissions{ + RoleConditions: []*types.RoleConditions{{ + Rules: []types.Rule{{ + Resources: []string{types.KindIntegration}, + Verbs: []string{types.VerbList, types.VerbRead}, + }}, + }}, + }, + }, + Notification: ¬ificationsv1.Notification{ + Spec: ¬ificationsv1.NotificationSpec{}, + SubKind: types.NotificationPendingUserTaskIntegrationSubKind, + Metadata: &headerv1.Metadata{ + Labels: map[string]string{ + types.NotificationTitleLabel: "Your integration needs attention.", + types.NotificationIntegrationLabel: integrationName, + }, + Expires: timestamppb.New(expires), + }, + }, + }, + } +} diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 7b81e7d2d28f2..920a37ad6d227 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -20313,10 +20313,12 @@ type IntegrationV1 struct { // Header is the resource header. ResourceHeader `protobuf:"bytes,1,opt,name=Header,proto3,embedded=Header" json:""` // Spec is an Integration specification. - Spec IntegrationSpecV1 `protobuf:"bytes,2,opt,name=Spec,proto3" json:"spec"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + Spec IntegrationSpecV1 `protobuf:"bytes,2,opt,name=Spec,proto3" json:"spec"` + // Status has the current state of the integration. + Status IntegrationStatusV1 `protobuf:"bytes,3,opt,name=Status,proto3" json:"status"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } @@ -20351,6 +20353,51 @@ func (m *IntegrationV1) XXX_DiscardUnknown() { var xxx_messageInfo_IntegrationV1 proto.InternalMessageInfo +// IntegrationStatusV1 contains the current status for a given integration. +type IntegrationStatusV1 struct { + // PendingUserTasksNotificationID contains the notification ID that indicates that this integration has unresolved user tasks. + PendingUserTasksNotificationID string `protobuf:"bytes,1,opt,name=PendingUserTasksNotificationID,proto3" json:"pending_user_tasks_notification_id,omitempty"` + // NeedsAttentionNotificationExpires contains the expiration date for the notification. + // Used to ensure new notifications' expiration is the greater between the current notification and the new one. + PendingUserTasksNotificationExpires *time.Time `protobuf:"bytes,2,opt,name=PendingUserTasksNotificationExpires,proto3,stdtime" json:"pending_user_tasks_notification_expires,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *IntegrationStatusV1) Reset() { *m = IntegrationStatusV1{} } +func (m *IntegrationStatusV1) String() string { return proto.CompactTextString(m) } +func (*IntegrationStatusV1) ProtoMessage() {} +func (*IntegrationStatusV1) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{350} +} +func (m *IntegrationStatusV1) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IntegrationStatusV1) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IntegrationStatusV1.Marshal(b, m, deterministic) + } else { + b = b[:cap(b)] + n, err := m.MarshalToSizedBuffer(b) + if err != nil { + return nil, err + } + return b[:n], nil + } +} +func (m *IntegrationStatusV1) XXX_Merge(src proto.Message) { + xxx_messageInfo_IntegrationStatusV1.Merge(m, src) +} +func (m *IntegrationStatusV1) XXX_Size() int { + return m.Size() +} +func (m *IntegrationStatusV1) XXX_DiscardUnknown() { + xxx_messageInfo_IntegrationStatusV1.DiscardUnknown(m) +} + +var xxx_messageInfo_IntegrationStatusV1 proto.InternalMessageInfo + // IntegrationSpecV1 contains properties of all the supported integrations. type IntegrationSpecV1 struct { // Types that are valid to be assigned to SubKindSpec: @@ -20370,7 +20417,7 @@ func (m *IntegrationSpecV1) Reset() { *m = IntegrationSpecV1{} } func (m *IntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*IntegrationSpecV1) ProtoMessage() {} func (*IntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{350} + return fileDescriptor_9198ee693835762e, []int{351} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20489,7 +20536,7 @@ func (m *AWSOIDCIntegrationSpecV1) Reset() { *m = AWSOIDCIntegrationSpec func (m *AWSOIDCIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*AWSOIDCIntegrationSpecV1) ProtoMessage() {} func (*AWSOIDCIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{351} + return fileDescriptor_9198ee693835762e, []int{352} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20535,7 +20582,7 @@ func (m *AzureOIDCIntegrationSpecV1) Reset() { *m = AzureOIDCIntegration func (m *AzureOIDCIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*AzureOIDCIntegrationSpecV1) ProtoMessage() {} func (*AzureOIDCIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{352} + return fileDescriptor_9198ee693835762e, []int{353} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20577,7 +20624,7 @@ func (m *GitHubIntegrationSpecV1) Reset() { *m = GitHubIntegrationSpecV1 func (m *GitHubIntegrationSpecV1) String() string { return proto.CompactTextString(m) } func (*GitHubIntegrationSpecV1) ProtoMessage() {} func (*GitHubIntegrationSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{353} + return fileDescriptor_9198ee693835762e, []int{354} } func (m *GitHubIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20638,7 +20685,7 @@ func (m *HeadlessAuthentication) Reset() { *m = HeadlessAuthentication{} func (m *HeadlessAuthentication) String() string { return proto.CompactTextString(m) } func (*HeadlessAuthentication) ProtoMessage() {} func (*HeadlessAuthentication) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{354} + return fileDescriptor_9198ee693835762e, []int{355} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20695,7 +20742,7 @@ func (m *WatchKind) Reset() { *m = WatchKind{} } func (m *WatchKind) String() string { return proto.CompactTextString(m) } func (*WatchKind) ProtoMessage() {} func (*WatchKind) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{355} + return fileDescriptor_9198ee693835762e, []int{356} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20745,7 +20792,7 @@ func (m *WatchStatusV1) Reset() { *m = WatchStatusV1{} } func (m *WatchStatusV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusV1) ProtoMessage() {} func (*WatchStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{356} + return fileDescriptor_9198ee693835762e, []int{357} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20786,7 +20833,7 @@ func (m *WatchStatusSpecV1) Reset() { *m = WatchStatusSpecV1{} } func (m *WatchStatusSpecV1) String() string { return proto.CompactTextString(m) } func (*WatchStatusSpecV1) ProtoMessage() {} func (*WatchStatusSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{357} + return fileDescriptor_9198ee693835762e, []int{358} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20836,7 +20883,7 @@ func (m *ServerInfoV1) Reset() { *m = ServerInfoV1{} } func (m *ServerInfoV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoV1) ProtoMessage() {} func (*ServerInfoV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{358} + return fileDescriptor_9198ee693835762e, []int{359} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20878,7 +20925,7 @@ func (m *ServerInfoSpecV1) Reset() { *m = ServerInfoSpecV1{} } func (m *ServerInfoSpecV1) String() string { return proto.CompactTextString(m) } func (*ServerInfoSpecV1) ProtoMessage() {} func (*ServerInfoSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{359} + return fileDescriptor_9198ee693835762e, []int{360} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20935,7 +20982,7 @@ func (m *JamfSpecV1) Reset() { *m = JamfSpecV1{} } func (m *JamfSpecV1) String() string { return proto.CompactTextString(m) } func (*JamfSpecV1) ProtoMessage() {} func (*JamfSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{360} + return fileDescriptor_9198ee693835762e, []int{361} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21000,7 +21047,7 @@ func (m *JamfInventoryEntry) Reset() { *m = JamfInventoryEntry{} } func (m *JamfInventoryEntry) String() string { return proto.CompactTextString(m) } func (*JamfInventoryEntry) ProtoMessage() {} func (*JamfInventoryEntry) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{361} + return fileDescriptor_9198ee693835762e, []int{362} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21057,7 +21104,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{362} + return fileDescriptor_9198ee693835762e, []int{363} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21121,7 +21168,7 @@ func (m *AWSMatcher) Reset() { *m = AWSMatcher{} } func (m *AWSMatcher) String() string { return proto.CompactTextString(m) } func (*AWSMatcher) ProtoMessage() {} func (*AWSMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{363} + return fileDescriptor_9198ee693835762e, []int{364} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21166,7 +21213,7 @@ func (m *AssumeRole) Reset() { *m = AssumeRole{} } func (m *AssumeRole) String() string { return proto.CompactTextString(m) } func (*AssumeRole) ProtoMessage() {} func (*AssumeRole) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{364} + return fileDescriptor_9198ee693835762e, []int{365} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21228,7 +21275,7 @@ func (m *InstallerParams) Reset() { *m = InstallerParams{} } func (m *InstallerParams) String() string { return proto.CompactTextString(m) } func (*InstallerParams) ProtoMessage() {} func (*InstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{365} + return fileDescriptor_9198ee693835762e, []int{366} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21271,7 +21318,7 @@ func (m *AWSSSM) Reset() { *m = AWSSSM{} } func (m *AWSSSM) String() string { return proto.CompactTextString(m) } func (*AWSSSM) ProtoMessage() {} func (*AWSSSM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{366} + return fileDescriptor_9198ee693835762e, []int{367} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21314,7 +21361,7 @@ func (m *AzureInstallerParams) Reset() { *m = AzureInstallerParams{} } func (m *AzureInstallerParams) String() string { return proto.CompactTextString(m) } func (*AzureInstallerParams) ProtoMessage() {} func (*AzureInstallerParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{367} + return fileDescriptor_9198ee693835762e, []int{368} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21368,7 +21415,7 @@ func (m *AzureMatcher) Reset() { *m = AzureMatcher{} } func (m *AzureMatcher) String() string { return proto.CompactTextString(m) } func (*AzureMatcher) ProtoMessage() {} func (*AzureMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{368} + return fileDescriptor_9198ee693835762e, []int{369} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21423,7 +21470,7 @@ func (m *GCPMatcher) Reset() { *m = GCPMatcher{} } func (m *GCPMatcher) String() string { return proto.CompactTextString(m) } func (*GCPMatcher) ProtoMessage() {} func (*GCPMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{369} + return fileDescriptor_9198ee693835762e, []int{370} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21469,7 +21516,7 @@ func (m *KubernetesMatcher) Reset() { *m = KubernetesMatcher{} } func (m *KubernetesMatcher) String() string { return proto.CompactTextString(m) } func (*KubernetesMatcher) ProtoMessage() {} func (*KubernetesMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{370} + return fileDescriptor_9198ee693835762e, []int{371} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21511,7 +21558,7 @@ func (m *OktaOptions) Reset() { *m = OktaOptions{} } func (m *OktaOptions) String() string { return proto.CompactTextString(m) } func (*OktaOptions) ProtoMessage() {} func (*OktaOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{371} + return fileDescriptor_9198ee693835762e, []int{372} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21557,7 +21604,7 @@ func (m *AccessGraphSync) Reset() { *m = AccessGraphSync{} } func (m *AccessGraphSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphSync) ProtoMessage() {} func (*AccessGraphSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{372} + return fileDescriptor_9198ee693835762e, []int{373} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21603,7 +21650,7 @@ func (m *AccessGraphAWSSync) Reset() { *m = AccessGraphAWSSync{} } func (m *AccessGraphAWSSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphAWSSync) ProtoMessage() {} func (*AccessGraphAWSSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{373} + return fileDescriptor_9198ee693835762e, []int{374} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -21647,7 +21694,7 @@ func (m *AccessGraphAzureSync) Reset() { *m = AccessGraphAzureSync{} } func (m *AccessGraphAzureSync) String() string { return proto.CompactTextString(m) } func (*AccessGraphAzureSync) ProtoMessage() {} func (*AccessGraphAzureSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{374} + return fileDescriptor_9198ee693835762e, []int{375} } func (m *AccessGraphAzureSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -22090,6 +22137,7 @@ func init() { proto.RegisterType((*OktaAssignmentSpecV1)(nil), "types.OktaAssignmentSpecV1") proto.RegisterType((*OktaAssignmentTargetV1)(nil), "types.OktaAssignmentTargetV1") proto.RegisterType((*IntegrationV1)(nil), "types.IntegrationV1") + proto.RegisterType((*IntegrationStatusV1)(nil), "types.IntegrationStatusV1") proto.RegisterType((*IntegrationSpecV1)(nil), "types.IntegrationSpecV1") proto.RegisterType((*AWSOIDCIntegrationSpecV1)(nil), "types.AWSOIDCIntegrationSpecV1") proto.RegisterType((*AzureOIDCIntegrationSpecV1)(nil), "types.AzureOIDCIntegrationSpecV1") @@ -22122,7 +22170,7 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 30604 bytes of a gzipped FileDescriptorProto + // 30707 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x1c, 0x49, 0x7a, 0x20, 0x36, 0xdd, 0x8d, 0x47, 0xe3, 0xc3, 0xab, 0x91, 0x00, 0x49, 0x10, 0xf3, 0x68, 0x4e, 0xcd, 0x0c, 0x87, 0x9c, 0x9d, 0x21, 0x97, 0xe0, 0x0e, 0x77, 0x67, 0xe7, 0xb5, 0x8d, 0x6e, 0x90, @@ -23607,435 +23655,442 @@ var fileDescriptor_9198ee693835762e = []byte{ 0x8a, 0x0a, 0x11, 0x08, 0x53, 0xa7, 0xc1, 0xe4, 0x14, 0x2a, 0x0d, 0xa2, 0xb2, 0x81, 0x6c, 0xf9, 0xe8, 0x5e, 0x22, 0x12, 0x45, 0xe8, 0x7d, 0xb2, 0x56, 0x43, 0x9f, 0x13, 0xf5, 0x13, 0x05, 0x3a, 0xfb, 0xc4, 0x36, 0x0d, 0x2c, 0xe7, 0xeb, 0x22, 0xd5, 0x83, 0x5e, 0xdd, 0x3a, 0x0d, 0xaa, 0x1f, - 0xa8, 0xd5, 0xb5, 0x69, 0x50, 0xfd, 0x3a, 0x79, 0xe1, 0xff, 0x67, 0xef, 0xdb, 0x7a, 0x1b, 0x49, - 0xae, 0x83, 0xa7, 0x49, 0x4a, 0xa2, 0x0e, 0x75, 0x69, 0xd5, 0x68, 0x46, 0x5a, 0xcd, 0x6d, 0xa7, - 0x77, 0x76, 0x3c, 0xc3, 0xf5, 0xae, 0x77, 0x66, 0xbf, 0xf5, 0x5e, 0xec, 0xf5, 0xba, 0x45, 0xb5, - 0x44, 0xce, 0xf0, 0xe6, 0x6e, 0x52, 0xe3, 0xf1, 0xd8, 0x6e, 0xf7, 0x90, 0x2d, 0xa9, 0xbd, 0x14, - 0x49, 0xb3, 0xc9, 0x1d, 0xcb, 0xf8, 0x80, 0xcf, 0xc6, 0x07, 0xd8, 0x80, 0xbf, 0x2f, 0x71, 0xe2, - 0x24, 0xc8, 0xc2, 0x2f, 0x0e, 0x90, 0x45, 0x90, 0x87, 0xfc, 0x80, 0x20, 0x7e, 0xf2, 0x9b, 0x01, - 0xc3, 0x80, 0x81, 0xbc, 0x39, 0xc1, 0x22, 0x59, 0x20, 0x41, 0x6e, 0x6f, 0x41, 0xf2, 0x60, 0x20, - 0x40, 0x50, 0xa7, 0xaa, 0xba, 0xab, 0x2f, 0xe4, 0x68, 0xbc, 0xbb, 0x49, 0x0c, 0xf8, 0x49, 0xe2, - 0xa9, 0x53, 0xa7, 0xeb, 0x7a, 0xea, 0xd4, 0xa9, 0x73, 0x01, 0x08, 0x9f, 0xfe, 0xd9, 0x43, 0x8d, - 0x29, 0x41, 0x5e, 0xcf, 0xfd, 0xc3, 0x1f, 0x5d, 0x51, 0xb6, 0x01, 0xf2, 0x22, 0xac, 0x8e, 0x56, - 0x85, 0xa7, 0xa6, 0x32, 0x0b, 0x72, 0x13, 0xd4, 0x03, 0x87, 0xab, 0x0a, 0x3b, 0x47, 0x4e, 0xbf, - 0xef, 0xf6, 0x38, 0x9b, 0x5e, 0x15, 0xf0, 0x12, 0x03, 0x33, 0xca, 0xda, 0x9b, 0xb0, 0x9e, 0xb6, - 0x4a, 0xc8, 0x55, 0x58, 0x92, 0x23, 0x08, 0x71, 0x22, 0x05, 0x67, 0xe8, 0x89, 0x18, 0x42, 0x9c, - 0xc0, 0x8f, 0x14, 0xb8, 0x38, 0x8b, 0xe7, 0x90, 0x2d, 0xc8, 0x0f, 0x47, 0xde, 0x00, 0x65, 0x5b, - 0x9e, 0xa2, 0x41, 0xfc, 0xc6, 0xec, 0x0b, 0x28, 0x84, 0x8d, 0x9d, 0x43, 0xee, 0x15, 0x62, 0x2e, - 0x22, 0xa4, 0xe5, 0x1c, 0xfa, 0xe4, 0x39, 0x58, 0xeb, 0xba, 0x07, 0xce, 0xa4, 0x37, 0xb6, 0xfd, - 0xce, 0x91, 0xdb, 0x45, 0xbf, 0x2d, 0xb4, 0xf6, 0x33, 0x55, 0x5e, 0x60, 0x09, 0x78, 0xa2, 0xc5, - 0x73, 0x53, 0x5a, 0x7c, 0x27, 0x97, 0x57, 0xd4, 0x8c, 0x89, 0xe6, 0x55, 0xda, 0x37, 0x33, 0xb0, - 0x39, 0x6d, 0x93, 0x91, 0x37, 0xd2, 0xc6, 0x80, 0xbd, 0x76, 0xc8, 0x70, 0xf9, 0xb5, 0x43, 0xfa, - 0x1a, 0xb9, 0x0d, 0x81, 0xd7, 0xd5, 0xe3, 0x22, 0x28, 0x08, 0x18, 0xad, 0x33, 0x74, 0x7c, 0xff, - 0x11, 0xe5, 0x23, 0x59, 0x29, 0x0a, 0x2f, 0x87, 0xc9, 0x75, 0x04, 0x8c, 0xbc, 0x02, 0xd0, 0xe9, - 0x0d, 0x7c, 0x17, 0x8d, 0x0a, 0xb8, 0x80, 0xc2, 0x6c, 0xc9, 0x03, 0xa8, 0xfc, 0x8a, 0x8c, 0xd0, - 0xd2, 0xa0, 0xeb, 0xf2, 0x09, 0x74, 0x60, 0x63, 0x0a, 0x57, 0xa5, 0xd3, 0x13, 0xa6, 0xb4, 0x17, - 0x09, 0xb2, 0x26, 0x41, 0x62, 0xfb, 0xf8, 0x88, 0x67, 0xa6, 0xad, 0x91, 0x13, 0x20, 0x49, 0xd6, - 0x49, 0xa9, 0x73, 0x8b, 0xe8, 0xc9, 0x28, 0xa0, 0xce, 0x20, 0xed, 0x51, 0x8f, 0x5c, 0x81, 0x82, - 0x48, 0x80, 0x49, 0x2f, 0x00, 0x8c, 0x38, 0x70, 0xd0, 0x5d, 0x17, 0x17, 0x0f, 0x86, 0x59, 0x45, - 0xdf, 0x3a, 0x2e, 0x5a, 0x2c, 0x22, 0xa4, 0x75, 0x32, 0x14, 0xbd, 0xbb, 0x28, 0xd6, 0x77, 0xf4, - 0x40, 0xe3, 0xa5, 0x7f, 0xa0, 0x88, 0xe9, 0x4f, 0x9e, 0x08, 0x8f, 0x6b, 0x1f, 0x01, 0x74, 0x6d, - 0xe2, 0x0d, 0xc3, 0xff, 0xa9, 0xa8, 0x23, 0x76, 0x1d, 0x17, 0x75, 0xf8, 0x4f, 0x72, 0x1d, 0x56, - 0x47, 0xcc, 0xf8, 0x75, 0x3c, 0xe0, 0xe3, 0xc9, 0x92, 0x8d, 0x2c, 0x33, 0x70, 0x6b, 0x80, 0x63, - 0xca, 0xdb, 0x75, 0x27, 0x18, 0x30, 0xe9, 0x80, 0x24, 0x2f, 0xc0, 0x22, 0x3d, 0x20, 0x31, 0x3c, - 0x4f, 0xcc, 0xa7, 0x02, 0xf1, 0x50, 0xdc, 0x30, 0xf3, 0x5f, 0xe5, 0xff, 0x73, 0x5a, 0xef, 0x64, - 0x04, 0x31, 0xf9, 0x78, 0x26, 0x1b, 0xb0, 0x30, 0x18, 0x1d, 0x4a, 0x5d, 0x9b, 0x1f, 0x8c, 0x0e, - 0x69, 0xbf, 0x6e, 0x80, 0xca, 0x5c, 0x7c, 0x58, 0xa8, 0x05, 0xff, 0xa4, 0xcf, 0xee, 0xef, 0x79, - 0x73, 0x85, 0xc1, 0x31, 0xcb, 0xff, 0x49, 0xbf, 0x43, 0x31, 0x7d, 0x7f, 0x60, 0xcb, 0x51, 0xb9, - 0x78, 0xb7, 0x57, 0x7c, 0x7f, 0x10, 0x86, 0xe7, 0xea, 0x92, 0x6d, 0x58, 0xa6, 0x74, 0x82, 0xd8, - 0x60, 0x5c, 0x7a, 0xb8, 0x94, 0x94, 0x1e, 0x4e, 0xfa, 0x1d, 0xd1, 0x44, 0x73, 0xc9, 0x97, 0x7e, - 0x91, 0xbb, 0xa0, 0x4a, 0x62, 0x16, 0xfa, 0x7c, 0xc6, 0x0c, 0xb1, 0x43, 0x32, 0x92, 0x78, 0x56, - 0xe9, 0x1f, 0x0c, 0xcc, 0xd5, 0x4e, 0x14, 0xc0, 0x87, 0xe6, 0x87, 0x8a, 0xe0, 0xa5, 0x29, 0x95, - 0x88, 0x06, 0xcb, 0x47, 0x8e, 0x6f, 0xfb, 0xfe, 0x31, 0x33, 0x2c, 0xe3, 0xd1, 0x88, 0x0b, 0x47, - 0x8e, 0x6f, 0xf9, 0xc7, 0x22, 0xdb, 0xc9, 0x39, 0x8a, 0x33, 0x70, 0x26, 0xe3, 0x23, 0x5b, 0x16, - 0x1a, 0xd9, 0x88, 0x9d, 0x3d, 0x72, 0xfc, 0x06, 0x2d, 0x93, 0x68, 0x93, 0x6b, 0xb0, 0x82, 0x74, - 0x3b, 0x9e, 0x20, 0x8c, 0xe1, 0x32, 0xcc, 0x25, 0x4a, 0xb8, 0xe3, 0x31, 0xca, 0xbc, 0x85, 0xff, - 0x98, 0x81, 0xf3, 0xe9, 0xa3, 0x83, 0xcb, 0x93, 0x8e, 0x29, 0x3a, 0xf6, 0xf1, 0xb6, 0x2d, 0x52, - 0x08, 0x0b, 0x75, 0x92, 0x36, 0x39, 0x99, 0xd4, 0xc9, 0x29, 0xc2, 0x1a, 0x12, 0xe2, 0xe2, 0x69, - 0xcf, 0xf3, 0xc7, 0x3c, 0x82, 0x87, 0xb9, 0x4a, 0x0b, 0x18, 0x3f, 0xaf, 0x52, 0x30, 0x79, 0x16, - 0x56, 0x04, 0x47, 0x1e, 0x3c, 0xea, 0xd3, 0x0f, 0x33, 0x76, 0xbc, 0xcc, 0xa1, 0x0d, 0x04, 0x92, - 0x73, 0x30, 0xef, 0x0c, 0x87, 0xf4, 0x93, 0x8c, 0x0b, 0xcf, 0x39, 0xc3, 0x21, 0xcb, 0xc8, 0x83, - 0x6e, 0x8c, 0xf6, 0x01, 0x9a, 0x16, 0x71, 0x3b, 0x46, 0x73, 0x09, 0x81, 0xcc, 0xdc, 0xc8, 0xa7, - 0xfb, 0x9e, 0xd6, 0x15, 0x28, 0x0b, 0x88, 0x02, 0xce, 0x30, 0x40, 0x78, 0x0a, 0xf2, 0xe2, 0x91, - 0x9b, 0x79, 0x63, 0x98, 0x0b, 0x0e, 0x7f, 0xe0, 0x7e, 0x19, 0x36, 0xba, 0x9e, 0x8f, 0x8b, 0x97, - 0x75, 0x69, 0x38, 0xe4, 0x8e, 0x93, 0x2c, 0xb2, 0xaf, 0xb9, 0xce, 0x8b, 0xe9, 0x48, 0xea, 0xc3, - 0x21, 0x73, 0x9f, 0xe4, 0x63, 0xfd, 0x2a, 0xac, 0x72, 0x31, 0x8d, 0x1f, 0x91, 0xd8, 0x16, 0xbe, - 0x81, 0xe9, 0xfd, 0x89, 0xe7, 0x40, 0x02, 0x0e, 0xaa, 0x74, 0x45, 0xcd, 0xbf, 0x56, 0xe0, 0x5c, - 0xaa, 0x9c, 0x47, 0xbe, 0x02, 0xcc, 0x4f, 0x6c, 0x3c, 0xb0, 0x47, 0x6e, 0xc7, 0x1b, 0x7a, 0x18, - 0x78, 0x83, 0xe9, 0x41, 0x6f, 0xcf, 0x92, 0x10, 0xd1, 0xe7, 0xac, 0x35, 0x30, 0x83, 0x4a, 0x4c, - 0x41, 0xa3, 0x8e, 0x62, 0xe0, 0xad, 0x07, 0x70, 0x2e, 0x15, 0x35, 0x45, 0x71, 0xf2, 0xf1, 0x68, - 0x06, 0x6a, 0xf1, 0xb2, 0x15, 0xeb, 0xb4, 0xa4, 0x50, 0xe1, 0xdd, 0xfb, 0x71, 0xd0, 0xbd, 0x98, - 0x44, 0x48, 0x8c, 0xf8, 0xbe, 0x4e, 0xbb, 0xd4, 0x88, 0x4a, 0xd3, 0xb7, 0xf6, 0x03, 0x38, 0xc7, - 0x17, 0xdf, 0xe1, 0xc8, 0x19, 0x1e, 0x85, 0xe4, 0x58, 0x43, 0x3f, 0x96, 0x46, 0x8e, 0xad, 0xca, - 0x3d, 0x8a, 0x1f, 0x50, 0x3d, 0xeb, 0x24, 0x81, 0xbc, 0x0f, 0xdf, 0xca, 0x88, 0xad, 0x9e, 0xd2, - 0x9c, 0x94, 0x65, 0xad, 0xa4, 0x2d, 0xeb, 0xd3, 0xef, 0xa9, 0x3a, 0x10, 0x99, 0x59, 0x31, 0x55, - 0x29, 0xb7, 0xc2, 0x12, 0xc2, 0x3d, 0x6f, 0x88, 0xc4, 0x1a, 0x2c, 0x96, 0x01, 0x74, 0xad, 0x13, - 0x07, 0x91, 0x0b, 0xb0, 0x18, 0x24, 0xd9, 0xe6, 0x07, 0x47, 0x9e, 0x01, 0x2a, 0x5d, 0xf2, 0x34, - 0x2c, 0x31, 0x39, 0x3e, 0xb2, 0xe7, 0x00, 0x61, 0x3a, 0xdd, 0x78, 0x62, 0x0c, 0x14, 0x78, 0xfa, - 0x71, 0x63, 0x48, 0xee, 0xc1, 0x79, 0xb4, 0x05, 0xf1, 0x07, 0xc1, 0x34, 0xd8, 0x1d, 0xa7, 0x73, - 0xe4, 0xf2, 0x55, 0xab, 0xa5, 0x4e, 0xc6, 0x70, 0x68, 0x59, 0x0d, 0x69, 0x1e, 0x86, 0x43, 0xcb, - 0x1f, 0x88, 0xdf, 0x25, 0x5a, 0x9d, 0xb7, 0xa1, 0x0b, 0x17, 0x66, 0xd4, 0x94, 0x18, 0x87, 0x22, - 0x33, 0x8e, 0x1b, 0xa0, 0x1e, 0xb8, 0x5d, 0x2a, 0x13, 0xbb, 0x5d, 0x6c, 0xda, 0xdb, 0xb7, 0x59, - 0x5a, 0x79, 0x73, 0x25, 0x80, 0x5b, 0xfe, 0x60, 0xff, 0x36, 0xff, 0xca, 0xb1, 0x38, 0xf2, 0xe4, - 0xbb, 0x08, 0x79, 0x01, 0xce, 0xc6, 0x82, 0x9a, 0x84, 0x5e, 0xf2, 0xe6, 0x1a, 0x2d, 0x8a, 0x86, - 0xc0, 0xba, 0x0a, 0x4b, 0x62, 0x55, 0x8c, 0x02, 0xe7, 0x39, 0xb3, 0xc0, 0x61, 0x74, 0xd7, 0xf1, - 0xcf, 0x4d, 0x44, 0xa7, 0x52, 0xaf, 0x31, 0xa7, 0x90, 0xa5, 0xc9, 0xf3, 0x40, 0x02, 0xb9, 0x3d, - 0x60, 0x14, 0xfc, 0x83, 0x6b, 0xa2, 0x24, 0xd8, 0xe1, 0xfc, 0xb3, 0xdf, 0xcd, 0xc2, 0xd9, 0x94, - 0xfb, 0x0f, 0xbd, 0x04, 0x78, 0xfd, 0xb1, 0x7b, 0xc8, 0xae, 0x10, 0x72, 0x27, 0x57, 0x25, 0x38, - 0x57, 0x6a, 0xcd, 0xb3, 0xb4, 0xe9, 0xfc, 0x5b, 0xfc, 0x17, 0x65, 0x1e, 0xce, 0x48, 0xe8, 0x6b, - 0xe8, 0xbf, 0xa4, 0x02, 0x6b, 0x98, 0x0b, 0xc2, 0xf7, 0x06, 0x98, 0x52, 0x02, 0x85, 0x90, 0x5c, - 0xe4, 0x86, 0x84, 0xad, 0x68, 0x4a, 0x48, 0x54, 0x0a, 0x31, 0xd5, 0x61, 0x0c, 0x42, 0x3e, 0x05, - 0x5b, 0xd2, 0x59, 0x63, 0xc7, 0x76, 0x1e, 0x9a, 0xc7, 0x9b, 0x1b, 0x4e, 0x70, 0xea, 0xec, 0x44, - 0xf6, 0xe0, 0x36, 0x5c, 0xc6, 0x49, 0xf4, 0xba, 0x43, 0x3b, 0x91, 0x3c, 0x04, 0xbb, 0xca, 0xa2, - 0xed, 0x6f, 0x51, 0xac, 0x4a, 0x77, 0x18, 0xcb, 0x23, 0x82, 0xbd, 0xae, 0xa6, 0xee, 0xce, 0x05, - 0xdc, 0x9d, 0x97, 0xe4, 0xce, 0x9c, 0x66, 0x6f, 0xf2, 0xc9, 0x78, 0x00, 0xe7, 0x52, 0xfb, 0x4f, - 0x8f, 0x2b, 0xb4, 0xe5, 0x0a, 0x25, 0xad, 0x05, 0xfa, 0x9b, 0x8a, 0x5a, 0x57, 0x61, 0xe9, 0xa1, - 0xeb, 0x8c, 0xdc, 0x11, 0x97, 0x03, 0xf8, 0x02, 0x63, 0x30, 0x59, 0x0c, 0xe8, 0x46, 0x27, 0x9a, - 0xab, 0xad, 0x48, 0x0d, 0xce, 0xb2, 0xf3, 0xd4, 0x3b, 0x46, 0xd1, 0x92, 0xab, 0xba, 0x94, 0x88, - 0x70, 0x85, 0x55, 0xf0, 0xa0, 0xab, 0x20, 0x16, 0xab, 0x6d, 0xae, 0x1d, 0xc6, 0x41, 0x94, 0x3f, - 0x9c, 0x4f, 0xc7, 0x26, 0xdb, 0x50, 0x60, 0xc4, 0xd9, 0x25, 0x83, 0xbd, 0x51, 0x5c, 0x9d, 0xf9, - 0x85, 0x12, 0x9a, 0x38, 0xfb, 0xc1, 0xff, 0xf4, 0xf4, 0xc7, 0xe7, 0x60, 0xfb, 0x58, 0x7e, 0x82, - 0x31, 0x97, 0x10, 0xc8, 0x9f, 0x5e, 0xb4, 0xbf, 0x54, 0x44, 0x57, 0x23, 0xf7, 0x73, 0xba, 0x50, - 0x7d, 0xb7, 0x2f, 0x9e, 0xa1, 0x16, 0x4d, 0xfe, 0xeb, 0x09, 0x37, 0x0e, 0x79, 0x05, 0x96, 0x28, - 0xd9, 0xc3, 0x49, 0x9f, 0x2d, 0xe0, 0x6c, 0x24, 0x34, 0x50, 0x8d, 0x15, 0xd1, 0x69, 0x2b, 0x9f, - 0x31, 0x0b, 0xc7, 0xe1, 0x4f, 0x2a, 0x7b, 0xfb, 0xc7, 0xe3, 0xa1, 0xbc, 0xec, 0x85, 0xae, 0xd2, - 0xaa, 0xb5, 0x9a, 0xbc, 0x4a, 0x9e, 0xe2, 0x84, 0xb2, 0xf7, 0xf6, 0x3c, 0xd3, 0x56, 0x6a, 0xcf, - 0x41, 0x41, 0xa2, 0x4d, 0x3b, 0xc3, 0x9c, 0x77, 0x44, 0x67, 0xd8, 0x2f, 0x3e, 0xd9, 0x0f, 0x21, - 0x2f, 0x48, 0xd2, 0x4b, 0xc6, 0xd1, 0xc0, 0x17, 0x2c, 0x03, 0xff, 0xa7, 0x30, 0x3a, 0xca, 0xd8, - 0xc9, 0x39, 0x13, 0xff, 0xc7, 0x93, 0x69, 0xec, 0xd0, 0xdb, 0x45, 0xcf, 0xb7, 0x87, 0x68, 0x04, - 0x16, 0x88, 0xe2, 0x14, 0xde, 0xea, 0xf9, 0xcc, 0x34, 0x8c, 0x7f, 0xe3, 0xcf, 0x83, 0x23, 0x3d, - 0xa6, 0xd0, 0x98, 0xc6, 0x81, 0x23, 0x07, 0x50, 0x26, 0x79, 0x00, 0xb1, 0x90, 0x2f, 0xbc, 0x26, - 0xfb, 0x32, 0x20, 0x0c, 0x0f, 0x20, 0x89, 0xcf, 0xe4, 0x22, 0x7c, 0x46, 0xba, 0xe1, 0x87, 0xb3, - 0xc7, 0xce, 0x2f, 0x71, 0xc3, 0x8f, 0x73, 0xbd, 0x77, 0x83, 0x15, 0x12, 0x51, 0xa9, 0x50, 0x51, - 0x9c, 0x89, 0xe1, 0x3c, 0x51, 0x70, 0x8c, 0xdd, 0x9e, 0xc5, 0x42, 0x96, 0x46, 0x28, 0x60, 0xbb, - 0x8f, 0xbf, 0xc1, 0x92, 0x17, 0x61, 0x3d, 0x48, 0x6d, 0xe9, 0xbf, 0xe5, 0x0d, 0x6d, 0x4c, 0x6e, - 0x7a, 0xc2, 0x05, 0x64, 0x22, 0xca, 0xac, 0xb7, 0xbc, 0xe1, 0x3e, 0x96, 0xf0, 0x66, 0xfe, 0x49, - 0x46, 0xe8, 0x45, 0xb6, 0x07, 0x83, 0xb1, 0x3f, 0x1e, 0x39, 0xc3, 0x88, 0xd2, 0x98, 0x1c, 0xc3, - 0x53, 0xd8, 0xa4, 0xdb, 0x98, 0x6c, 0x64, 0x30, 0x12, 0xc1, 0x50, 0x82, 0x0d, 0x56, 0xb8, 0xfd, - 0x89, 0xe8, 0xc5, 0x46, 0xa7, 0xd8, 0xba, 0x8c, 0x4c, 0xf7, 0x95, 0x44, 0xb5, 0x7c, 0xc6, 0xdc, - 0x60, 0x34, 0x13, 0x58, 0xa4, 0x9c, 0xc2, 0x6b, 0xe2, 0x5a, 0xe3, 0xed, 0x90, 0xf1, 0x44, 0xa9, - 0xca, 0x2c, 0x89, 0x7c, 0x06, 0x16, 0xbd, 0xae, 0x9c, 0x53, 0x33, 0xae, 0xaf, 0xac, 0x74, 0x59, - 0x5c, 0xef, 0x90, 0x06, 0xdd, 0x1a, 0x1e, 0x87, 0x6e, 0x2f, 0x47, 0xd4, 0xeb, 0xda, 0xb6, 0xb8, - 0x82, 0x27, 0xab, 0x91, 0x15, 0xc8, 0x04, 0x0b, 0x31, 0xe3, 0x75, 0x19, 0x17, 0x08, 0x23, 0x8b, - 0x9b, 0xfc, 0x97, 0xf6, 0xbf, 0xe1, 0xc6, 0x69, 0xc7, 0x88, 0x72, 0x8c, 0x29, 0x03, 0xbe, 0xc8, - 0x82, 0x7a, 0x46, 0xc7, 0xed, 0x2a, 0xc8, 0x81, 0x91, 0x3d, 0xb1, 0x44, 0x04, 0xac, 0x3d, 0xf2, - 0xb4, 0x7f, 0xc9, 0xc2, 0x4a, 0xf4, 0x41, 0x81, 0x3c, 0x07, 0x39, 0x89, 0x51, 0x6e, 0xa4, 0xbc, - 0x3a, 0x20, 0x7b, 0x44, 0xa4, 0x53, 0x31, 0x46, 0x72, 0x07, 0x56, 0xd0, 0xc4, 0x11, 0xe5, 0xed, - 0xb1, 0xc7, 0x9f, 0xa9, 0x66, 0xbf, 0x34, 0xe6, 0x7f, 0xf2, 0xde, 0x95, 0x33, 0xf8, 0xa8, 0xb8, - 0x44, 0xeb, 0x52, 0x91, 0x97, 0x16, 0x4a, 0xfa, 0xe2, 0xdc, 0x74, 0x7d, 0x31, 0xef, 0xca, 0x14, - 0x7d, 0xf1, 0xdc, 0x0c, 0x7d, 0x71, 0x58, 0x53, 0xd6, 0x17, 0xe3, 0xab, 0xc1, 0xc2, 0xb4, 0x57, - 0x83, 0xb0, 0x0e, 0x7b, 0x35, 0x08, 0xf5, 0xbd, 0xf9, 0xa9, 0xfa, 0xde, 0xb0, 0x0e, 0xd7, 0xf7, - 0x86, 0x1a, 0xd8, 0xc5, 0xa9, 0x1a, 0x58, 0xa9, 0x12, 0xd3, 0xc0, 0x5e, 0xe3, 0x03, 0x3b, 0x72, - 0x1e, 0xd9, 0x38, 0xe2, 0x5c, 0x80, 0xc0, 0x21, 0x33, 0x9d, 0x47, 0x68, 0xbb, 0xb4, 0xbd, 0x08, - 0xc2, 0xe0, 0x49, 0xfb, 0x51, 0x8c, 0x01, 0x89, 0x39, 0x7f, 0x16, 0x56, 0xd8, 0x39, 0xcc, 0x83, - 0xc5, 0xb2, 0x83, 0x78, 0xd9, 0x5c, 0x16, 0x50, 0x76, 0x31, 0xff, 0x18, 0xac, 0x06, 0x68, 0xfc, - 0x6e, 0x8a, 0x7e, 0x90, 0x66, 0x50, 0x9b, 0x07, 0xf5, 0x91, 0xe9, 0x8d, 0x78, 0xd8, 0x9c, 0x08, - 0x3d, 0x16, 0x53, 0xe5, 0x79, 0x20, 0x21, 0x5a, 0x60, 0xfe, 0x99, 0x43, 0xd4, 0xb5, 0x00, 0x35, - 0xb0, 0xd1, 0xfc, 0x3d, 0x25, 0xa6, 0xf1, 0xfd, 0xa8, 0x9a, 0xff, 0x1c, 0x04, 0x5f, 0xb7, 0xb9, - 0xd6, 0x4e, 0xf4, 0x40, 0x15, 0x05, 0x4d, 0x0e, 0xd7, 0x0e, 0xe3, 0x37, 0xcc, 0x8f, 0xa8, 0x55, - 0xda, 0x8f, 0xb3, 0x11, 0x6d, 0x98, 0xf8, 0x0c, 0x95, 0x6f, 0xfc, 0x81, 0xcd, 0xa7, 0x98, 0xb3, - 0xdf, 0xab, 0x53, 0x96, 0x29, 0x37, 0x78, 0xb3, 0xac, 0x86, 0x09, 0xbe, 0x3f, 0x10, 0xf6, 0x6f, - 0x36, 0xbb, 0x39, 0x31, 0x89, 0x0c, 0xb7, 0xa9, 0x20, 0xc7, 0x78, 0x6d, 0x71, 0x36, 0x39, 0xa1, - 0x8e, 0xa0, 0xbb, 0x14, 0x6f, 0x50, 0xc1, 0x2f, 0xf1, 0x81, 0x36, 0xa0, 0xf2, 0xd8, 0x8f, 0x12, - 0xcf, 0xa6, 0xdc, 0x91, 0x13, 0xc4, 0x71, 0x94, 0x90, 0xb2, 0x3a, 0x11, 0xff, 0x0a, 0xb2, 0x06, - 0x2c, 0xa1, 0x2e, 0x4a, 0x10, 0xcc, 0xa5, 0xbc, 0xcf, 0x24, 0x3b, 0x5f, 0xaa, 0xd4, 0xcc, 0x02, - 0xad, 0x27, 0xc8, 0x1c, 0xc1, 0x53, 0xb2, 0x06, 0x29, 0xda, 0xc8, 0x39, 0x11, 0xe2, 0x79, 0xe6, - 0x08, 0x84, 0x8a, 0x26, 0x6c, 0xea, 0x79, 0x27, 0x0a, 0xe0, 0x68, 0xda, 0x11, 0x6c, 0x4d, 0x9f, - 0x92, 0x19, 0xe9, 0xc3, 0x42, 0xd1, 0x26, 0x23, 0x8b, 0x36, 0xb2, 0x3e, 0x29, 0x1b, 0xd1, 0x27, - 0x69, 0x7f, 0x9c, 0x85, 0x67, 0x4e, 0x31, 0x5d, 0x33, 0xbe, 0xf9, 0xd9, 0xa8, 0xe0, 0x9c, 0x89, - 0x68, 0x00, 0x28, 0x51, 0x7e, 0x26, 0x9c, 0xf4, 0x3b, 0x53, 0xc4, 0xe6, 0xaf, 0xc0, 0x2a, 0x63, - 0xfc, 0xcc, 0x66, 0xf5, 0x60, 0xd2, 0x3b, 0x05, 0xe7, 0xbf, 0x20, 0x1c, 0xec, 0x62, 0x55, 0xf1, - 0x30, 0x40, 0x7e, 0x67, 0x05, 0x30, 0xd2, 0x82, 0x02, 0xa2, 0x1d, 0x38, 0x5e, 0xef, 0x54, 0x9e, - 0x5e, 0xc2, 0x7d, 0x4f, 0xae, 0xc6, 0x4c, 0xed, 0x29, 0x60, 0x17, 0x7f, 0x93, 0xeb, 0xb0, 0xda, - 0x9f, 0x1c, 0x53, 0x91, 0x90, 0xad, 0x05, 0x6e, 0x1a, 0x34, 0x67, 0x2e, 0xf7, 0x27, 0xc7, 0xfa, - 0x70, 0x88, 0x53, 0x8a, 0x36, 0x44, 0x6b, 0x14, 0x8f, 0xed, 0x5a, 0x81, 0x39, 0x8f, 0x98, 0x94, - 0x00, 0xdb, 0xb7, 0x1c, 0x77, 0x1d, 0x98, 0x45, 0x29, 0x4f, 0x9f, 0xc6, 0x7e, 0x68, 0xff, 0x9e, - 0x11, 0x7a, 0x8d, 0xe9, 0xeb, 0xfe, 0x37, 0x53, 0x94, 0x32, 0x45, 0x37, 0x40, 0xa5, 0x43, 0x1f, - 0x32, 0x95, 0x60, 0x8e, 0x56, 0xfa, 0x93, 0xe3, 0x60, 0xec, 0xe4, 0x81, 0x9f, 0x97, 0x07, 0xfe, - 0x15, 0xa1, 0xf7, 0x48, 0x65, 0x0f, 0xd3, 0x87, 0x9c, 0x4a, 0x4c, 0xd7, 0x4f, 0xc7, 0x04, 0x7e, - 0x33, 0x6f, 0x29, 0xf3, 0x16, 0x53, 0x91, 0xcf, 0x25, 0x54, 0xe4, 0x29, 0x7b, 0x6f, 0x3e, 0x6d, - 0xef, 0x25, 0x14, 0xf2, 0x0b, 0x29, 0x0a, 0xf9, 0xd4, 0x0d, 0x9a, 0x7f, 0xcc, 0x06, 0x5d, 0x94, - 0xd7, 0xc9, 0xdf, 0x67, 0x84, 0xc4, 0x14, 0xbd, 0x02, 0x3d, 0x80, 0xb3, 0xe2, 0x0a, 0xc4, 0x4e, - 0x8e, 0xf0, 0x9d, 0xa5, 0x70, 0xfb, 0x66, 0xda, 0xe5, 0x07, 0xd1, 0x52, 0x2e, 0x28, 0x6b, 0xfc, - 0xda, 0x13, 0x96, 0xff, 0xcf, 0xb9, 0xf0, 0x90, 0xfb, 0x70, 0x1e, 0x93, 0x0f, 0x74, 0xe4, 0x17, - 0x22, 0x7b, 0xe4, 0x1e, 0xf0, 0xf5, 0x70, 0x35, 0x71, 0x3d, 0xf0, 0x3a, 0x52, 0x73, 0x4c, 0xf7, - 0xa0, 0x7c, 0xc6, 0x5c, 0xf7, 0x53, 0xe0, 0xf1, 0xbb, 0xd4, 0x9f, 0x29, 0xa0, 0x3d, 0x7e, 0xbc, - 0xf0, 0xda, 0x1b, 0x1f, 0x70, 0x7a, 0xed, 0x95, 0x46, 0xef, 0x19, 0x58, 0x1e, 0xb9, 0x07, 0x23, - 0xd7, 0x3f, 0x8a, 0xe8, 0xa6, 0x96, 0x38, 0x50, 0x0c, 0x8c, 0x88, 0x58, 0xfa, 0x44, 0x97, 0x11, - 0x51, 0x49, 0xdb, 0x0d, 0xae, 0xc8, 0xa9, 0xf3, 0x40, 0x57, 0x93, 0xdc, 0x40, 0xf6, 0xe3, 0x4e, - 0x2e, 0x9f, 0x51, 0xb3, 0x26, 0x8f, 0xab, 0x7a, 0xe0, 0xf5, 0x5c, 0xed, 0x2f, 0x14, 0x21, 0x11, - 0xa4, 0x0d, 0x1e, 0x79, 0x20, 0x59, 0x7a, 0x67, 0x13, 0x62, 0x48, 0x5a, 0x15, 0xd9, 0x28, 0x96, - 0xc7, 0xee, 0x44, 0x40, 0x24, 0x76, 0x27, 0x42, 0x3e, 0x80, 0xb9, 0x2a, 0x57, 0x14, 0xbc, 0x26, - 0xcc, 0xc5, 0x28, 0xcf, 0xdb, 0xbf, 0x45, 0x6e, 0xc2, 0x02, 0xb3, 0x10, 0x13, 0xcd, 0x5d, 0x8d, - 0x34, 0x77, 0xff, 0x96, 0x29, 0xca, 0xb5, 0x77, 0x82, 0xf7, 0xcb, 0x44, 0x27, 0xf6, 0x6f, 0x91, - 0x57, 0x4e, 0x67, 0xb9, 0x9d, 0x17, 0x96, 0xdb, 0x81, 0xd5, 0xf6, 0xab, 0x11, 0xab, 0xed, 0x6b, - 0xb3, 0x47, 0x8b, 0xbf, 0x3a, 0xb3, 0x58, 0x95, 0x61, 0x0c, 0xb3, 0x5f, 0x64, 0xe0, 0xd2, 0xcc, - 0x1a, 0xe4, 0x22, 0xe4, 0xf5, 0x66, 0xa5, 0x15, 0xce, 0x2f, 0xdd, 0x33, 0x02, 0x42, 0xf6, 0x60, - 0x71, 0xdb, 0xf1, 0xbd, 0x0e, 0x5d, 0xc6, 0xa9, 0xcf, 0x40, 0x09, 0xb2, 0x01, 0x7a, 0xf9, 0x8c, - 0x19, 0xd6, 0x25, 0x36, 0xac, 0xe1, 0x5e, 0x88, 0xe4, 0x25, 0xcb, 0xa6, 0xa8, 0x57, 0x12, 0x04, - 0x13, 0xd5, 0x28, 0x9f, 0x49, 0x00, 0xc9, 0x43, 0x20, 0x96, 0x55, 0x2e, 0xb9, 0xa3, 0x31, 0x57, - 0x3b, 0x8c, 0xbd, 0xc0, 0x0c, 0xf8, 0xc5, 0xc7, 0x8c, 0x5d, 0xa2, 0x5e, 0xf9, 0x8c, 0x99, 0x42, - 0x2d, 0xbe, 0xcd, 0xdf, 0x16, 0xf2, 0xce, 0xf4, 0x41, 0x78, 0x82, 0x38, 0xc0, 0x37, 0x20, 0xdf, - 0x14, 0x36, 0x27, 0x92, 0x3b, 0x85, 0xb0, 0x2f, 0x31, 0x83, 0x52, 0xed, 0xff, 0x2b, 0x42, 0xcf, - 0xf2, 0xf8, 0xc1, 0x92, 0xd2, 0xc6, 0x75, 0x67, 0xa7, 0x8d, 0xeb, 0xfe, 0x8a, 0x69, 0xe3, 0x34, - 0x0f, 0x6e, 0x9e, 0x7a, 0x60, 0xc9, 0xa7, 0x41, 0xc5, 0x0c, 0x5b, 0x8e, 0x34, 0x49, 0x6c, 0x7f, - 0xad, 0x05, 0x81, 0xe1, 0xcb, 0x3c, 0x8d, 0xa1, 0xb9, 0xda, 0x89, 0xd6, 0xd6, 0xfe, 0x94, 0x27, - 0x04, 0xa8, 0x74, 0x9b, 0xb1, 0x07, 0x85, 0x0f, 0xea, 0x81, 0x63, 0x44, 0x36, 0xdb, 0x33, 0x52, - 0x86, 0xd3, 0xe4, 0xb7, 0xa6, 0x3b, 0xe2, 0x48, 0x3b, 0xef, 0x0f, 0xb3, 0x70, 0x71, 0x56, 0xf5, - 0xd4, 0x1c, 0xea, 0xca, 0x93, 0xe5, 0x50, 0xbf, 0x09, 0x79, 0x06, 0x0b, 0xdc, 0x4b, 0x70, 0x6e, - 0x79, 0x55, 0x3a, 0xb7, 0xa2, 0x98, 0x3c, 0x03, 0xf3, 0x7a, 0xc9, 0x0a, 0xd3, 0xfa, 0xa1, 0x1d, - 0xb8, 0xd3, 0xf1, 0xd1, 0xc2, 0x98, 0x17, 0x91, 0x2f, 0x27, 0x33, 0x59, 0xf2, 0x7c, 0x7e, 0x17, - 0xa4, 0x01, 0x49, 0xe4, 0xea, 0xc0, 0xf6, 0x86, 0xb9, 0x25, 0x78, 0xb8, 0x76, 0x33, 0x99, 0x15, - 0x53, 0x83, 0xf9, 0xe6, 0xc8, 0xf5, 0xdd, 0xb1, 0x6c, 0xa3, 0x3d, 0x44, 0x88, 0xc9, 0x4b, 0xb8, - 0x05, 0xb5, 0x73, 0xc2, 0x02, 0x66, 0xcc, 0xcb, 0x41, 0x8c, 0xd0, 0xe4, 0x9a, 0x82, 0x4d, 0x09, - 0x85, 0x56, 0xa8, 0x3a, 0x93, 0x7e, 0xe7, 0xa8, 0x6d, 0x56, 0xb9, 0xe4, 0xc4, 0x2a, 0xf4, 0x10, - 0x4a, 0x3b, 0xe8, 0x9b, 0x12, 0x8a, 0xf6, 0x1d, 0x05, 0xd6, 0xd3, 0xfa, 0x41, 0x2e, 0x42, 0xae, - 0x9f, 0x9a, 0xb4, 0xb3, 0xcf, 0xfc, 0xfc, 0x0b, 0xf4, 0xaf, 0x7d, 0x30, 0x18, 0x1d, 0x3b, 0x63, - 0xd9, 0x92, 0x5d, 0x02, 0x9b, 0x40, 0x7f, 0xec, 0xe2, 0xff, 0xe4, 0x8a, 0x38, 0x72, 0xb2, 0x89, - 0x34, 0x9f, 0xf8, 0x47, 0xd3, 0x01, 0x2a, 0xdd, 0x66, 0x63, 0xc8, 0x72, 0x45, 0xbc, 0x04, 0x39, - 0xda, 0xac, 0xd8, 0xea, 0xa5, 0xeb, 0x47, 0xaf, 0x55, 0x39, 0x12, 0x6b, 0x95, 0xef, 0x1c, 0xf7, - 0x4c, 0x44, 0xd6, 0xee, 0xc1, 0x4a, 0x14, 0x83, 0x18, 0xd1, 0x70, 0xc1, 0x85, 0xdb, 0x2a, 0xa7, - 0xb4, 0x3d, 0x18, 0x30, 0x6f, 0xaa, 0xed, 0xa7, 0x7e, 0xf1, 0xde, 0x15, 0xa0, 0x3f, 0x59, 0x9d, - 0xb4, 0x70, 0xc2, 0xda, 0xf7, 0x32, 0xb0, 0x1e, 0x06, 0x70, 0x10, 0x7b, 0xe8, 0xd7, 0xd6, 0x9b, - 0x58, 0x8f, 0x78, 0xbb, 0x0a, 0xb9, 0x31, 0xd9, 0xc1, 0x19, 0x4e, 0x76, 0x7b, 0xb0, 0x39, 0x0d, - 0x9f, 0x3c, 0x07, 0x8b, 0x18, 0xf3, 0x6b, 0xe8, 0x74, 0x5c, 0x99, 0xcd, 0xf6, 0x05, 0xd0, 0x0c, - 0xcb, 0xb5, 0x9f, 0x29, 0xb0, 0xc5, 0x7d, 0x80, 0x6a, 0x8e, 0xd7, 0xc7, 0xf7, 0x9b, 0x8e, 0xfb, - 0xe1, 0x78, 0xc3, 0xef, 0x45, 0xf8, 0xd8, 0xb3, 0x51, 0x57, 0xaf, 0xc4, 0xd7, 0xa6, 0xf7, 0x96, - 0xdc, 0xc4, 0x38, 0x76, 0xdc, 0x5a, 0x22, 0xc7, 0xa2, 0x8f, 0xf4, 0x29, 0x40, 0x8e, 0x3e, 0x82, - 0x18, 0xda, 0xff, 0x81, 0xcb, 0xb3, 0x3f, 0x40, 0xbe, 0x04, 0xcb, 0x98, 0x98, 0xad, 0x3d, 0x3c, - 0x1c, 0x39, 0x5d, 0x57, 0x68, 0xf6, 0x84, 0x02, 0x5a, 0x2e, 0x63, 0x61, 0xf9, 0x78, 0x34, 0x8c, - 0x43, 0x4c, 0xf9, 0xc6, 0x2b, 0x45, 0x1c, 0xed, 0x64, 0x6a, 0xda, 0x37, 0x15, 0x20, 0x49, 0x1a, - 0xe4, 0x93, 0xb0, 0xd4, 0x6e, 0x95, 0xac, 0xb1, 0x33, 0x1a, 0x97, 0x07, 0x93, 0x11, 0x8f, 0x89, - 0xc7, 0x82, 0x23, 0x8c, 0x3b, 0x36, 0x7b, 0xa9, 0x3b, 0x1a, 0x4c, 0x46, 0x66, 0x04, 0x0f, 0x13, - 0x80, 0xb9, 0xee, 0x5b, 0x5d, 0xe7, 0x24, 0x9a, 0x00, 0x8c, 0xc3, 0x22, 0x09, 0xc0, 0x38, 0x4c, - 0x7b, 0x57, 0x81, 0x0b, 0xc2, 0x08, 0xb6, 0x9b, 0xd2, 0x96, 0x12, 0x86, 0x00, 0x1a, 0x89, 0x20, - 0xcc, 0xb3, 0x24, 0xf4, 0x35, 0x11, 0x25, 0x0b, 0x1b, 0x88, 0xa2, 0x3a, 0xab, 0x4b, 0x3e, 0x0b, - 0x39, 0x6b, 0x3c, 0x18, 0x9e, 0x22, 0x4c, 0x96, 0x1a, 0xcc, 0xe8, 0x78, 0x30, 0x44, 0x12, 0x58, - 0x53, 0x73, 0x61, 0x5d, 0x6e, 0x9c, 0x68, 0x31, 0xa9, 0xc1, 0x02, 0x8f, 0x87, 0x18, 0xb3, 0x2f, - 0x99, 0xd1, 0xa7, 0xed, 0x55, 0x11, 0x8b, 0x8b, 0x07, 0x01, 0x36, 0x05, 0x0d, 0xed, 0xb7, 0x15, - 0x28, 0x50, 0xc1, 0x06, 0x2f, 0xa5, 0x1f, 0x74, 0x49, 0x47, 0xe5, 0x60, 0x61, 0x2e, 0x15, 0x90, - 0x3f, 0xd5, 0x69, 0xfc, 0x32, 0xac, 0xc6, 0x2a, 0x10, 0x0d, 0xa3, 0xb0, 0xf4, 0xbc, 0x8e, 0xc3, - 0xf2, 0x09, 0x31, 0x53, 0xa3, 0x08, 0x4c, 0xfb, 0xae, 0x02, 0xeb, 0x8d, 0xb7, 0xc6, 0x0e, 0x7b, - 0x50, 0x37, 0x27, 0x3d, 0xb1, 0xdf, 0xa9, 0xb0, 0x26, 0xac, 0xa9, 0x59, 0x84, 0x08, 0x26, 0xac, - 0x71, 0x98, 0x19, 0x94, 0x92, 0x32, 0xe4, 0xf9, 0xf9, 0xe2, 0xf3, 0xd8, 0xbd, 0x97, 0x25, 0xdd, - 0x48, 0x48, 0x98, 0x23, 0xd1, 0x9e, 0x20, 0x0b, 0xe3, 0x75, 0xcc, 0xa0, 0xb6, 0xf6, 0xaf, 0x0a, - 0x6c, 0x4c, 0xa9, 0x43, 0xde, 0x80, 0x39, 0xf4, 0x5e, 0xe5, 0xb3, 0x77, 0x71, 0xca, 0x27, 0xc6, - 0x9d, 0xa3, 0xfd, 0x5b, 0xec, 0x20, 0x3a, 0xa6, 0x3f, 0x4c, 0x56, 0x8b, 0x3c, 0x80, 0x45, 0xbd, - 0xdb, 0xe5, 0xb7, 0xb3, 0x4c, 0xe4, 0x76, 0x36, 0xe5, 0x8b, 0x2f, 0x04, 0xf8, 0xec, 0x76, 0xc6, - 0xfc, 0xa8, 0xba, 0x5d, 0x9b, 0x7b, 0xe6, 0x86, 0xf4, 0xb6, 0x3e, 0x0d, 0x2b, 0x51, 0xe4, 0x27, - 0x72, 0x26, 0x7c, 0x47, 0x01, 0x35, 0xda, 0x86, 0x8f, 0x26, 0x8a, 0x58, 0xda, 0x34, 0x3f, 0x66, - 0x51, 0xfd, 0x6e, 0x06, 0xce, 0xa5, 0x8e, 0x30, 0x79, 0x1e, 0xe6, 0xf5, 0xe1, 0xb0, 0xb2, 0xc3, - 0x57, 0x15, 0x97, 0x90, 0x50, 0xe9, 0x1d, 0xb9, 0xbc, 0x32, 0x24, 0xf2, 0x12, 0xe4, 0x99, 0xdd, - 0xc6, 0x8e, 0x60, 0x38, 0x18, 0x16, 0x89, 0x1b, 0x95, 0x44, 0xa3, 0xe8, 0x0a, 0x44, 0xb2, 0x0b, - 0x2b, 0x3c, 0xa0, 0x90, 0xe9, 0x1e, 0xba, 0x5f, 0x0f, 0xd2, 0x39, 0x60, 0xc6, 0x09, 0xa1, 0x49, - 0xb7, 0x47, 0xac, 0x4c, 0x0e, 0xa9, 0x13, 0xad, 0x45, 0xaa, 0xa0, 0x22, 0x4d, 0x99, 0x12, 0x0b, - 0xe5, 0x8b, 0x21, 0x9e, 0x58, 0x23, 0xa6, 0xd0, 0x4a, 0xd4, 0x0c, 0xa6, 0x4b, 0xf7, 0x7d, 0xef, - 0xb0, 0x7f, 0xec, 0xf6, 0xc7, 0x1f, 0xdd, 0x74, 0x85, 0xdf, 0x38, 0xd5, 0x74, 0xfd, 0x7e, 0x8e, - 0x6d, 0xe6, 0x78, 0x35, 0x2a, 0xd1, 0x48, 0xd1, 0xdb, 0x51, 0xa2, 0xa1, 0xf7, 0x33, 0x1e, 0x32, - 0x67, 0x07, 0x16, 0x58, 0x28, 0x23, 0xb1, 0x33, 0x2e, 0xa5, 0x36, 0x81, 0xe1, 0xec, 0xdf, 0x62, - 0xe2, 0x0b, 0x73, 0xa3, 0xf5, 0x4d, 0x51, 0x95, 0xec, 0x43, 0xa1, 0xd4, 0x73, 0x9d, 0xfe, 0x64, - 0xd8, 0x3a, 0xdd, 0xa3, 0xf1, 0x26, 0xef, 0xcb, 0x52, 0x87, 0x55, 0xc3, 0xc7, 0x66, 0xe4, 0xe4, - 0x32, 0x21, 0xd2, 0x0a, 0x3c, 0xeb, 0x72, 0xa8, 0x78, 0x7d, 0x71, 0xc6, 0xf8, 0xc4, 0x81, 0x58, - 0x2f, 0xea, 0x36, 0xca, 0x5d, 0xef, 0x6c, 0x58, 0xa9, 0x3a, 0xfe, 0xb8, 0x35, 0x72, 0xfa, 0x3e, - 0x86, 0x40, 0x3d, 0x45, 0x88, 0xb8, 0x0b, 0x22, 0xbd, 0x37, 0xaa, 0x4c, 0xc7, 0x41, 0x55, 0xa6, - 0x90, 0x8d, 0x92, 0xa3, 0xf2, 0xd2, 0xae, 0xd7, 0x77, 0x7a, 0xde, 0x37, 0x84, 0x03, 0x32, 0x93, - 0x97, 0x0e, 0x04, 0xd0, 0x0c, 0xcb, 0xb5, 0x2f, 0x26, 0xe6, 0x8d, 0xb5, 0xb2, 0x00, 0x0b, 0x3c, - 0x3c, 0x05, 0x0b, 0xd7, 0xd0, 0x34, 0xea, 0x3b, 0x95, 0xfa, 0x9e, 0xaa, 0x90, 0x15, 0x80, 0xa6, - 0xd9, 0x28, 0x19, 0x96, 0x45, 0x7f, 0x67, 0xe8, 0x6f, 0x1e, 0xcb, 0x61, 0xb7, 0x5d, 0x55, 0xb3, - 0x52, 0x38, 0x87, 0x9c, 0xf6, 0x53, 0x05, 0xce, 0xa7, 0x4f, 0x25, 0x69, 0x01, 0x06, 0xf4, 0xe0, - 0xe6, 0x03, 0x9f, 0x9c, 0x39, 0xef, 0xa9, 0xe0, 0x78, 0x60, 0x90, 0x31, 0x0b, 0x38, 0x91, 0x11, - 0x6f, 0x5f, 0xcc, 0x83, 0xd5, 0xeb, 0x9a, 0x19, 0xaf, 0xab, 0x95, 0x60, 0x73, 0x1a, 0x8d, 0x68, - 0x57, 0x57, 0xa1, 0xa0, 0x37, 0x9b, 0xd5, 0x4a, 0x49, 0x6f, 0x55, 0x1a, 0x75, 0x55, 0x21, 0x8b, - 0x30, 0xb7, 0x67, 0x36, 0xda, 0x4d, 0x35, 0xa3, 0x7d, 0x5f, 0x81, 0xe5, 0x4a, 0x68, 0x5d, 0xf8, - 0x41, 0x37, 0xdf, 0xeb, 0x91, 0xcd, 0xb7, 0x19, 0x84, 0xbe, 0x09, 0x3e, 0x70, 0xaa, 0x9d, 0xf7, - 0x7e, 0x06, 0xd6, 0x12, 0x75, 0x88, 0x05, 0x0b, 0xfa, 0x3d, 0xab, 0x51, 0xd9, 0x29, 0xf1, 0x96, - 0x5d, 0x09, 0x0d, 0xd9, 0x30, 0x19, 0x5a, 0xe2, 0x2b, 0xcc, 0x5d, 0xfc, 0x91, 0x6f, 0x0f, 0xbc, - 0xae, 0x94, 0x19, 0xb9, 0x7c, 0xc6, 0x14, 0x94, 0xf0, 0x24, 0xfb, 0xc6, 0x64, 0xe4, 0x22, 0xd9, - 0x4c, 0x44, 0xaf, 0x1b, 0xc0, 0x93, 0x84, 0xd1, 0x4f, 0xc7, 0xa1, 0xe5, 0x49, 0xd2, 0x21, 0x3d, - 0x52, 0x87, 0xf9, 0x3d, 0x6f, 0x5c, 0x9e, 0x3c, 0xe4, 0xfb, 0xf7, 0x72, 0x98, 0x1a, 0xab, 0x3c, - 0x79, 0x98, 0x24, 0x8b, 0x2a, 0x4b, 0x16, 0xda, 0x29, 0x42, 0x92, 0x53, 0x89, 0x7b, 0xb8, 0xe6, - 0x9e, 0xc8, 0xc3, 0x75, 0x7b, 0x19, 0x0a, 0xfc, 0x0e, 0x85, 0xd7, 0x93, 0x1f, 0x2b, 0xb0, 0x39, - 0x6d, 0xe4, 0xe8, 0xb5, 0x2c, 0x1a, 0xc9, 0xe2, 0x7c, 0x90, 0x3b, 0x25, 0x1a, 0xc2, 0x42, 0xa0, - 0x91, 0x37, 0xa1, 0xc0, 0xac, 0xb4, 0xac, 0x97, 0xda, 0x66, 0x85, 0x2f, 0xd7, 0x4b, 0xff, 0xf4, - 0xde, 0x95, 0x0d, 0x6e, 0xd8, 0xe5, 0xbf, 0x64, 0x4f, 0x46, 0x5e, 0x24, 0xcf, 0x84, 0x5c, 0x83, - 0x4a, 0xd1, 0xce, 0xa4, 0xeb, 0xb9, 0xe2, 0x0e, 0x21, 0xbc, 0xfd, 0x39, 0x4c, 0x3e, 0xd3, 0x04, - 0x4c, 0xfb, 0xb6, 0x02, 0x5b, 0xd3, 0xa7, 0x89, 0x9e, 0x93, 0x2d, 0x66, 0xec, 0x26, 0xfc, 0xed, - 0xf1, 0x9c, 0x0c, 0x2c, 0xe2, 0x64, 0x9a, 0x02, 0x91, 0x56, 0xe2, 0x1a, 0x2e, 0xa1, 0x24, 0x91, - 0x93, 0xa5, 0x47, 0x2b, 0x09, 0x44, 0xed, 0x3e, 0x6c, 0x4c, 0x99, 0x54, 0xf2, 0x99, 0xd4, 0x8c, - 0x4c, 0xe8, 0x8e, 0x26, 0x67, 0x64, 0x8a, 0xa4, 0xf6, 0x93, 0xe0, 0xda, 0x3f, 0x67, 0xe0, 0x3c, - 0xdd, 0x5d, 0x3d, 0xd7, 0xf7, 0xf5, 0x30, 0x79, 0x31, 0xe5, 0x8a, 0xaf, 0xc0, 0xfc, 0xd1, 0x93, - 0xa9, 0x8a, 0x19, 0x3a, 0x21, 0x80, 0x27, 0x96, 0x70, 0x82, 0xa2, 0xff, 0x93, 0xab, 0x20, 0x67, - 0xbe, 0xcf, 0x62, 0xec, 0xdb, 0xcc, 0xa6, 0x62, 0x2e, 0x0e, 0x83, 0x24, 0xd5, 0xaf, 0xc2, 0x1c, - 0xea, 0x53, 0xf8, 0xd9, 0x21, 0x64, 0xfe, 0xf4, 0xd6, 0xa1, 0xb6, 0xc5, 0x64, 0x15, 0xc8, 0x27, - 0x00, 0xc2, 0xb4, 0x21, 0xfc, 0x70, 0x10, 0x7a, 0x86, 0x20, 0x73, 0x88, 0xb9, 0x78, 0x7c, 0xe0, - 0xf0, 0x5c, 0x1c, 0x45, 0x58, 0x13, 0x23, 0x3e, 0x14, 0x21, 0x33, 0xf9, 0x2b, 0xe6, 0x2a, 0x2b, - 0xa8, 0x0c, 0x45, 0xd8, 0xcc, 0x6b, 0x89, 0xec, 0xdd, 0x18, 0x39, 0x3b, 0x96, 0xa2, 0xfb, 0x5a, - 0x22, 0x45, 0x77, 0x9e, 0x61, 0xc9, 0x79, 0xb8, 0xb5, 0xbf, 0xcb, 0xc0, 0xe2, 0x3d, 0x2a, 0x95, - 0xa1, 0xae, 0x61, 0xb6, 0xee, 0xe2, 0x36, 0x14, 0xaa, 0x03, 0x87, 0x3f, 0x17, 0x71, 0xdf, 0x21, - 0xe6, 0xf0, 0xdf, 0x1b, 0x38, 0xe2, 0xe5, 0xc9, 0x37, 0x65, 0xa4, 0xc7, 0x04, 0x2b, 0xb8, 0x03, - 0xf3, 0xec, 0xf9, 0x8e, 0xab, 0xd1, 0x84, 0x5c, 0x1e, 0xb4, 0xe8, 0x05, 0x56, 0x2c, 0xbd, 0x70, - 0xb0, 0x27, 0x40, 0x59, 0x48, 0xe4, 0x01, 0x80, 0x25, 0xcd, 0xca, 0xdc, 0xe9, 0x34, 0x2b, 0x52, - 0xa0, 0xc3, 0xf9, 0xd3, 0x04, 0x3a, 0xdc, 0x7a, 0x0d, 0x0a, 0x52, 0x7b, 0x9e, 0x48, 0x4c, 0xff, - 0x56, 0x06, 0x96, 0xb1, 0x57, 0x81, 0x2d, 0xcf, 0xaf, 0xa7, 0x9e, 0xe8, 0xf5, 0x88, 0x9e, 0x68, - 0x53, 0x9e, 0x2f, 0xd6, 0xb3, 0x19, 0x0a, 0xa2, 0x3b, 0xb0, 0x96, 0x40, 0x24, 0x2f, 0xc3, 0x1c, - 0x6d, 0xbe, 0xb8, 0x57, 0xab, 0xf1, 0x15, 0x10, 0x06, 0xc5, 0xa6, 0x1d, 0xf7, 0x4d, 0x86, 0xad, - 0xfd, 0x9b, 0x02, 0x4b, 0x3c, 0x27, 0x4d, 0xff, 0x60, 0xf0, 0xd8, 0xe1, 0xbc, 0x1e, 0x1f, 0x4e, - 0x16, 0x7a, 0x87, 0x0f, 0xe7, 0x7f, 0xf5, 0x20, 0xbe, 0x16, 0x19, 0xc4, 0x8d, 0x20, 0x44, 0xa6, - 0xe8, 0xce, 0x8c, 0x31, 0xfc, 0x11, 0x06, 0x8d, 0x8e, 0x22, 0x92, 0x2f, 0xc3, 0x62, 0xdd, 0x7d, - 0x14, 0xb9, 0x9e, 0x5e, 0x9f, 0x42, 0xf4, 0x85, 0x00, 0x91, 0xed, 0x29, 0x3c, 0xd9, 0xfb, 0xee, - 0x23, 0x3b, 0xf1, 0x72, 0x18, 0x92, 0xa4, 0x37, 0xd4, 0x68, 0xb5, 0x27, 0x59, 0xfa, 0xdc, 0x91, - 0x19, 0xa3, 0x49, 0x7d, 0x27, 0x0b, 0x10, 0xfa, 0x80, 0xd2, 0x0d, 0x18, 0x31, 0x9a, 0x10, 0x9a, - 0x7d, 0x04, 0xc9, 0x6b, 0x5c, 0xd8, 0x52, 0x5c, 0xe7, 0x1a, 0xe8, 0xcc, 0xf4, 0x10, 0xa6, 0xa8, - 0x8b, 0x2e, 0x71, 0xa7, 0xc3, 0xae, 0xdb, 0x73, 0x18, 0x6f, 0xcf, 0x6e, 0x5f, 0xc3, 0x88, 0xd5, - 0x01, 0x74, 0x4a, 0x2e, 0x72, 0x74, 0x4d, 0xdc, 0xa1, 0x08, 0x09, 0xbf, 0xea, 0xdc, 0x93, 0xf9, - 0x55, 0x37, 0x61, 0xd1, 0xeb, 0xbf, 0xed, 0xf6, 0xc7, 0x83, 0xd1, 0x09, 0xaa, 0xdd, 0x43, 0x7d, - 0x1e, 0x1d, 0x82, 0x8a, 0x28, 0x63, 0xf3, 0x80, 0x67, 0x6e, 0x80, 0x2f, 0x4f, 0x43, 0x00, 0x0c, - 0xfc, 0xc2, 0xe7, 0xd4, 0xf9, 0x3b, 0xb9, 0xfc, 0xbc, 0xba, 0x70, 0x27, 0x97, 0xcf, 0xab, 0x8b, - 0x77, 0x72, 0xf9, 0x45, 0x15, 0x4c, 0xe9, 0xcd, 0x2c, 0x78, 0x13, 0x93, 0x9e, 0xb1, 0xa2, 0x4f, - 0x54, 0xda, 0x2f, 0x33, 0x40, 0x92, 0xcd, 0x20, 0xaf, 0x43, 0x81, 0x31, 0x58, 0x7b, 0xe4, 0x7f, - 0x8d, 0x3b, 0x82, 0xb0, 0x98, 0x5c, 0x12, 0x58, 0x8e, 0xc9, 0xc5, 0xc0, 0xa6, 0xff, 0xb5, 0x1e, - 0xf9, 0x12, 0x9c, 0xc5, 0xe1, 0x1d, 0xba, 0x23, 0x6f, 0xd0, 0xb5, 0x31, 0x80, 0xb2, 0xd3, 0xe3, - 0x79, 0x43, 0x9f, 0xc7, 0x04, 0xd7, 0xc9, 0xe2, 0x29, 0xd3, 0x80, 0xae, 0x9e, 0x4d, 0xc4, 0x6c, - 0x32, 0x44, 0xd2, 0x02, 0x55, 0xae, 0x7f, 0x30, 0xe9, 0xf5, 0xf8, 0xcc, 0x16, 0xe9, 0x8d, 0x3e, - 0x5e, 0x36, 0x85, 0xf0, 0x4a, 0x48, 0x78, 0x77, 0xd2, 0xeb, 0x91, 0x57, 0x00, 0x06, 0x7d, 0xfb, - 0xd8, 0xf3, 0x7d, 0xf6, 0x98, 0x13, 0x78, 0xa5, 0x87, 0x50, 0x79, 0x32, 0x06, 0xfd, 0x1a, 0x03, - 0x92, 0xff, 0x05, 0x18, 0xca, 0x03, 0x63, 0xdc, 0x30, 0x6b, 0x24, 0x9e, 0xda, 0x47, 0x00, 0xa3, - 0x4e, 0xf0, 0x87, 0xae, 0xe5, 0x7d, 0x43, 0x38, 0xe1, 0x7c, 0x01, 0xd6, 0xb8, 0xbd, 0xf4, 0x3d, - 0x6f, 0x7c, 0xc4, 0xaf, 0x12, 0x1f, 0xe4, 0x1e, 0x22, 0xdd, 0x25, 0xfe, 0x2a, 0x07, 0xa0, 0xdf, - 0xb3, 0x44, 0xf8, 0xb8, 0x9b, 0x30, 0x47, 0x2f, 0x48, 0x42, 0xd1, 0x82, 0x6a, 0x6a, 0xa4, 0x2b, - 0xab, 0xa9, 0x11, 0x83, 0xee, 0x46, 0x13, 0xdd, 0x1d, 0x84, 0x92, 0x05, 0x77, 0x23, 0xf3, 0x80, - 0x88, 0x84, 0xef, 0xe6, 0x58, 0xa4, 0x0a, 0x10, 0x06, 0x74, 0xe3, 0x22, 0xff, 0x5a, 0x18, 0x19, - 0x89, 0x17, 0xf0, 0x14, 0x22, 0x61, 0x50, 0x38, 0x79, 0xf9, 0x84, 0x68, 0xe4, 0x2e, 0xe4, 0x5a, - 0x4e, 0xe0, 0x73, 0x3d, 0x25, 0xcc, 0xdd, 0xd3, 0x3c, 0xaf, 0x6b, 0x18, 0xea, 0x6e, 0x65, 0xec, - 0x44, 0xd2, 0x5f, 0x23, 0x11, 0x62, 0xc0, 0x3c, 0xcf, 0xd9, 0x3f, 0x25, 0x3c, 0x2a, 0x4f, 0xd9, - 0xcf, 0x83, 0xa2, 0x23, 0x50, 0x96, 0x29, 0x78, 0x76, 0xfe, 0xdb, 0x90, 0xb5, 0xac, 0x1a, 0x0f, - 0xee, 0xb2, 0x1c, 0x5e, 0xbf, 0x2c, 0xab, 0xc6, 0xde, 0x7d, 0x7d, 0xff, 0x58, 0xaa, 0x46, 0x91, - 0xc9, 0xa7, 0xa0, 0x20, 0x09, 0xc5, 0x3c, 0x2c, 0x12, 0x8e, 0x81, 0xe4, 0xd5, 0x26, 0x33, 0x0d, - 0x09, 0x9b, 0x54, 0x41, 0xbd, 0x3b, 0x79, 0xe8, 0xea, 0xc3, 0x21, 0xba, 0xbb, 0xbe, 0xed, 0x8e, - 0x98, 0xd8, 0x96, 0x0f, 0xe3, 0x89, 0xa3, 0xf7, 0x4a, 0x57, 0x94, 0xca, 0xca, 0xa6, 0x78, 0x4d, - 0xd2, 0x84, 0x35, 0xcb, 0x1d, 0x4f, 0x86, 0xcc, 0xbe, 0x66, 0x77, 0x30, 0xa2, 0xf7, 0x1b, 0x16, - 0x44, 0x09, 0x43, 0x2f, 0xfb, 0xb4, 0x50, 0x18, 0x35, 0x1d, 0x0c, 0x46, 0xb1, 0xbb, 0x4e, 0xb2, - 0xb2, 0xe6, 0xca, 0x53, 0x4e, 0x4f, 0xd5, 0xe8, 0xad, 0x09, 0x4f, 0x55, 0x71, 0x6b, 0x0a, 0xef, - 0x4a, 0x9f, 0x48, 0x09, 0xf4, 0x87, 0x2f, 0x83, 0x52, 0xa0, 0xbf, 0x48, 0x78, 0xbf, 0x77, 0x73, - 0x52, 0xac, 0x59, 0x3e, 0x17, 0x6f, 0x00, 0xdc, 0x19, 0x78, 0xfd, 0x9a, 0x3b, 0x3e, 0x1a, 0x74, - 0xa5, 0x78, 0x83, 0x85, 0xaf, 0x0e, 0xbc, 0xbe, 0x7d, 0x8c, 0xe0, 0x5f, 0xbe, 0x77, 0x45, 0x42, - 0x32, 0xa5, 0xff, 0xc9, 0xc7, 0x61, 0x91, 0xfe, 0x6a, 0x85, 0x56, 0x42, 0x4c, 0x27, 0x8b, 0xb5, - 0x59, 0x46, 0x96, 0x10, 0x81, 0xbc, 0x86, 0x39, 0x88, 0xbc, 0xe1, 0x58, 0x12, 0x5e, 0x45, 0xc2, - 0x21, 0x6f, 0x38, 0x8e, 0x87, 0x0f, 0x97, 0x90, 0x49, 0x39, 0x68, 0xba, 0x48, 0x1b, 0xc6, 0x53, - 0x1d, 0xa1, 0xe2, 0x91, 0xaf, 0x35, 0x5b, 0xc4, 0x2d, 0x96, 0xf3, 0x41, 0xc7, 0xaa, 0x61, 0x23, - 0xac, 0xf2, 0x0e, 0x7b, 0x29, 0xe2, 0x42, 0x2d, 0x6b, 0x84, 0x7f, 0xd4, 0xb5, 0x3b, 0x08, 0x8e, - 0x34, 0x22, 0x40, 0x26, 0xdb, 0xb0, 0xca, 0x64, 0xfc, 0x20, 0xfd, 0x28, 0x17, 0x71, 0x91, 0xb7, - 0x85, 0xf9, 0x49, 0xe5, 0xcf, 0xc7, 0x2a, 0x90, 0x5d, 0x98, 0xc3, 0xbb, 0x26, 0xf7, 0x86, 0xb8, - 0x20, 0xab, 0x09, 0xe2, 0xfb, 0x08, 0xf9, 0x0a, 0x2a, 0x08, 0x64, 0xbe, 0x82, 0xa8, 0xe4, 0xf3, - 0x00, 0x46, 0x7f, 0x34, 0xe8, 0xf5, 0x30, 0xb2, 0x76, 0x3e, 0xe2, 0xbe, 0xc8, 0xe9, 0x20, 0x95, - 0x10, 0x89, 0x47, 0x81, 0xc4, 0xdf, 0x76, 0x2c, 0xfe, 0xb6, 0x44, 0x4b, 0xab, 0xc0, 0x3c, 0xdb, - 0x8c, 0x18, 0xa5, 0x9e, 0xe7, 0xdd, 0x91, 0x62, 0x9c, 0xb3, 0x28, 0xf5, 0x1c, 0x9e, 0x8c, 0x52, - 0x2f, 0x55, 0xd0, 0xee, 0xc2, 0x7a, 0x5a, 0xc7, 0x22, 0xb7, 0x63, 0xe5, 0xb4, 0xb7, 0xe3, 0x1f, - 0x66, 0x61, 0x09, 0xa9, 0x09, 0x2e, 0xac, 0xc3, 0xb2, 0x35, 0x79, 0x18, 0x84, 0x70, 0x13, 0xdc, - 0x18, 0xdb, 0xe7, 0xcb, 0x05, 0xf2, 0x1b, 0x5e, 0xa4, 0x06, 0x31, 0x60, 0x45, 0x9c, 0x04, 0x7b, - 0xc2, 0x73, 0x20, 0x08, 0x10, 0x2f, 0x1c, 0x2a, 0x92, 0xe9, 0x97, 0x63, 0x95, 0xc2, 0xf3, 0x20, - 0xfb, 0x24, 0xe7, 0x41, 0xee, 0x54, 0xe7, 0xc1, 0x03, 0x58, 0x12, 0x5f, 0x43, 0x4e, 0x3e, 0xf7, - 0xc1, 0x38, 0x79, 0x84, 0x18, 0xa9, 0x06, 0x1c, 0x7d, 0x7e, 0x26, 0x47, 0xc7, 0x87, 0x51, 0xb1, - 0xcb, 0x86, 0x08, 0x4b, 0x32, 0x76, 0xcc, 0x4f, 0xba, 0x57, 0x6a, 0xfe, 0x0a, 0xa7, 0xe4, 0xcb, - 0xb0, 0x58, 0x1d, 0x88, 0x37, 0x31, 0xe9, 0x31, 0xa2, 0x27, 0x80, 0xb2, 0xb8, 0x10, 0x60, 0x06, - 0xa7, 0x5b, 0xf6, 0xc3, 0x38, 0xdd, 0x5e, 0x03, 0xe0, 0x2e, 0x29, 0x61, 0x5e, 0x41, 0xdc, 0x32, - 0x22, 0x12, 0x4d, 0xf4, 0x4d, 0x44, 0x42, 0xa6, 0xdc, 0x89, 0x9b, 0xdb, 0xe8, 0x9d, 0xce, 0x60, - 0xd2, 0x1f, 0x47, 0x12, 0x71, 0x0b, 0x4f, 0x65, 0x87, 0x97, 0xc9, 0xec, 0x21, 0x56, 0xed, 0xc3, - 0x9d, 0x10, 0xf2, 0xb9, 0xc0, 0xf8, 0x71, 0x61, 0xd6, 0x08, 0x69, 0x89, 0x11, 0x9a, 0x6a, 0xf2, - 0xa8, 0xfd, 0x54, 0x91, 0xb3, 0x73, 0xfc, 0x0a, 0x53, 0xfd, 0x2a, 0x40, 0x60, 0x94, 0x20, 0xe6, - 0x9a, 0xdd, 0x97, 0x02, 0xa8, 0x3c, 0xca, 0x21, 0xae, 0xd4, 0x9b, 0xec, 0x87, 0xd5, 0x9b, 0x16, - 0x14, 0x1a, 0x6f, 0x8d, 0x9d, 0xd0, 0x8a, 0x05, 0xac, 0x40, 0x92, 0x45, 0xce, 0x94, 0xdd, 0x7e, - 0x16, 0xcf, 0x86, 0x50, 0x0e, 0x9e, 0x22, 0x02, 0x4b, 0x15, 0xb5, 0xff, 0x50, 0x60, 0x55, 0x0e, - 0xaf, 0x70, 0xd2, 0xef, 0x90, 0xcf, 0xb0, 0x60, 0xc1, 0x4a, 0xe4, 0xca, 0x22, 0x21, 0x51, 0x96, - 0x7b, 0xd2, 0xef, 0x30, 0x01, 0xc8, 0x79, 0x24, 0x37, 0x96, 0x56, 0x24, 0x0f, 0x61, 0xa9, 0x39, - 0xe8, 0xf5, 0xa8, 0x58, 0x33, 0x7a, 0x9b, 0x5f, 0x00, 0x28, 0xa1, 0xf8, 0xd3, 0x88, 0x68, 0xd0, - 0xf6, 0x33, 0xfc, 0x9e, 0xbb, 0x31, 0xa4, 0xfc, 0xde, 0xe3, 0xf5, 0x42, 0xb2, 0xef, 0xa0, 0x6b, - 0xa0, 0x4c, 0x33, 0x3c, 0x9b, 0xa2, 0x59, 0x26, 0xe4, 0x56, 0xd2, 0x62, 0x6c, 0xe7, 0x8c, 0xb3, - 0x49, 0xfb, 0xb9, 0x02, 0x24, 0xd9, 0x35, 0x99, 0xf5, 0x29, 0xff, 0x0d, 0xa2, 0x70, 0x4c, 0x84, - 0xcc, 0x3d, 0x89, 0x08, 0xa9, 0xfd, 0x40, 0x81, 0xf5, 0xb4, 0x71, 0xa0, 0x27, 0x88, 0x7c, 0xa4, - 0x04, 0x07, 0x1a, 0x9e, 0x20, 0xf2, 0x29, 0x14, 0x3d, 0xd6, 0x62, 0x95, 0xe2, 0x8d, 0xcb, 0x3c, - 0x49, 0xe3, 0x8a, 0xbf, 0xa3, 0xc0, 0x6a, 0x45, 0xaf, 0xf1, 0xa4, 0x24, 0xec, 0x99, 0xea, 0x2a, - 0x5c, 0xaa, 0xe8, 0x35, 0xbb, 0xd9, 0xa8, 0x56, 0x4a, 0xf7, 0xed, 0xd4, 0x58, 0xe3, 0x97, 0xe0, - 0xa9, 0x24, 0x4a, 0xf8, 0x9c, 0x75, 0x11, 0x36, 0x93, 0xc5, 0x22, 0x1e, 0x79, 0x7a, 0x65, 0x11, - 0xba, 0x3c, 0x5b, 0x7c, 0x13, 0x56, 0x45, 0xec, 0xed, 0x56, 0xd5, 0xc2, 0xec, 0x1e, 0xab, 0x50, - 0xd8, 0x37, 0xcc, 0xca, 0xee, 0x7d, 0x7b, 0xb7, 0x5d, 0xad, 0xaa, 0x67, 0xc8, 0x32, 0x2c, 0x72, - 0x40, 0x49, 0x57, 0x15, 0xb2, 0x04, 0xf9, 0x4a, 0xdd, 0x32, 0x4a, 0x6d, 0xd3, 0x50, 0x33, 0xc5, - 0x37, 0x61, 0xa5, 0x39, 0xf2, 0xde, 0x76, 0xc6, 0xee, 0x5d, 0xf7, 0x04, 0x5f, 0xa3, 0x16, 0x20, - 0x6b, 0xea, 0xf7, 0xd4, 0x33, 0x04, 0x60, 0xbe, 0x79, 0xb7, 0x64, 0xdd, 0xba, 0xa5, 0x2a, 0xa4, - 0x00, 0x0b, 0x7b, 0xa5, 0xa6, 0x7d, 0xb7, 0x66, 0xa9, 0x19, 0xfa, 0x43, 0xbf, 0x67, 0xe1, 0x8f, - 0x6c, 0xf1, 0x45, 0x58, 0x43, 0xa9, 0xab, 0xea, 0xf9, 0x63, 0xb7, 0xef, 0x8e, 0xb0, 0x0d, 0x4b, - 0x90, 0xb7, 0x5c, 0xca, 0x2e, 0xc7, 0x2e, 0x6b, 0x40, 0x6d, 0xd2, 0x1b, 0x7b, 0xc3, 0x9e, 0xfb, - 0x75, 0x55, 0x29, 0xbe, 0x06, 0xab, 0xe6, 0x60, 0x32, 0xf6, 0xfa, 0x87, 0xd6, 0x98, 0x62, 0x1c, - 0x9e, 0x90, 0x73, 0xb0, 0xd6, 0xae, 0xeb, 0xb5, 0xed, 0xca, 0x5e, 0xbb, 0xd1, 0xb6, 0xec, 0x9a, - 0xde, 0x2a, 0x95, 0xd9, 0x5b, 0x58, 0xad, 0x61, 0xb5, 0x6c, 0xd3, 0x28, 0x19, 0xf5, 0x96, 0xaa, - 0x14, 0xbf, 0x87, 0x0a, 0xa4, 0xce, 0xa0, 0xdf, 0xdd, 0x75, 0x3a, 0xe3, 0xc1, 0x08, 0x1b, 0xac, - 0xc1, 0x65, 0xcb, 0x28, 0x35, 0xea, 0x3b, 0xf6, 0xae, 0x5e, 0x6a, 0x35, 0xcc, 0xb4, 0x60, 0xf7, - 0x5b, 0x70, 0x3e, 0x05, 0xa7, 0xd1, 0x6a, 0xaa, 0x0a, 0xb9, 0x02, 0x17, 0x52, 0xca, 0xee, 0x19, - 0xdb, 0x7a, 0xbb, 0x55, 0xae, 0xab, 0x99, 0x29, 0x95, 0x2d, 0xab, 0xa1, 0x66, 0x8b, 0xff, 0x4f, - 0x81, 0x95, 0xb6, 0xcf, 0xed, 0xea, 0xdb, 0xe8, 0x45, 0xfc, 0x34, 0x5c, 0x6c, 0x5b, 0x86, 0x69, - 0xb7, 0x1a, 0x77, 0x8d, 0xba, 0xdd, 0xb6, 0xf4, 0xbd, 0x78, 0x6b, 0xae, 0xc0, 0x05, 0x09, 0xc3, - 0x34, 0x4a, 0x8d, 0x7d, 0xc3, 0xb4, 0x9b, 0xba, 0x65, 0xdd, 0x6b, 0x98, 0x3b, 0xaa, 0x42, 0xbf, - 0x98, 0x82, 0x50, 0xdb, 0xd5, 0x59, 0x6b, 0x22, 0x65, 0x75, 0xe3, 0x9e, 0x5e, 0xb5, 0xb7, 0x1b, - 0x2d, 0x35, 0x5b, 0xac, 0x51, 0x21, 0x06, 0x43, 0x4e, 0x33, 0xf3, 0xc9, 0x3c, 0xe4, 0xea, 0x8d, - 0xba, 0x11, 0x7f, 0x41, 0x5d, 0x82, 0xbc, 0xde, 0x6c, 0x9a, 0x8d, 0x7d, 0x5c, 0x62, 0x00, 0xf3, - 0x3b, 0x46, 0x9d, 0xb6, 0x2c, 0x4b, 0x4b, 0x9a, 0x66, 0xa3, 0xd6, 0x68, 0x19, 0x3b, 0x6a, 0xae, - 0x68, 0x0a, 0xfe, 0x22, 0x88, 0x76, 0x06, 0xec, 0xb9, 0x72, 0xc7, 0xd8, 0xd5, 0xdb, 0xd5, 0x16, - 0x9f, 0xa2, 0xfb, 0xb6, 0x69, 0x7c, 0xae, 0x6d, 0x58, 0x2d, 0x4b, 0x55, 0x88, 0x0a, 0x4b, 0x75, - 0xc3, 0xd8, 0xb1, 0x6c, 0xd3, 0xd8, 0xaf, 0x18, 0xf7, 0xd4, 0x0c, 0xa5, 0xc9, 0xfe, 0xa7, 0x5f, - 0x28, 0xbe, 0xab, 0x00, 0x61, 0xe1, 0xba, 0x45, 0x0e, 0x28, 0x5c, 0x31, 0x97, 0x61, 0xab, 0x4c, - 0xa7, 0x1a, 0xbb, 0x56, 0x6b, 0xec, 0xc4, 0x87, 0xec, 0x3c, 0x90, 0x58, 0x79, 0x63, 0x77, 0x57, - 0x55, 0xc8, 0x05, 0x38, 0x1b, 0x83, 0xef, 0x98, 0x8d, 0xa6, 0x9a, 0xd9, 0xca, 0xe4, 0x15, 0xb2, - 0x91, 0x28, 0xbc, 0x6b, 0x18, 0x4d, 0x35, 0x4b, 0xa7, 0x28, 0x56, 0x20, 0xb6, 0x04, 0xab, 0x9e, - 0x2b, 0x7e, 0x5b, 0x81, 0xf3, 0xac, 0x99, 0x62, 0x7f, 0x05, 0x4d, 0xbd, 0x08, 0x9b, 0x3c, 0x09, - 0x41, 0x5a, 0x43, 0xd7, 0x41, 0x8d, 0x94, 0xb2, 0x66, 0x9e, 0x83, 0xb5, 0x08, 0x14, 0xdb, 0x91, - 0xa1, 0xdc, 0x23, 0x02, 0xde, 0x36, 0xac, 0x96, 0x6d, 0xec, 0xee, 0x36, 0xcc, 0x16, 0x6b, 0x48, - 0xb6, 0xa8, 0xc1, 0x5a, 0xc9, 0x1d, 0x8d, 0xe9, 0xfd, 0xb2, 0xef, 0x7b, 0x83, 0x3e, 0x36, 0x61, - 0x19, 0x16, 0x8d, 0xcf, 0xb7, 0x8c, 0xba, 0x55, 0x69, 0xd4, 0xd5, 0x33, 0xc5, 0x8b, 0x31, 0x1c, - 0xb1, 0x8f, 0x2d, 0xab, 0xac, 0x9e, 0x29, 0x3a, 0xb0, 0x2c, 0xac, 0xcb, 0xd9, 0xaa, 0xb8, 0x0c, - 0x5b, 0x62, 0xad, 0x21, 0x47, 0x89, 0x77, 0x61, 0x13, 0xd6, 0x93, 0xe5, 0x46, 0x4b, 0x55, 0xe8, - 0x2c, 0xc4, 0x4a, 0x28, 0x3c, 0x53, 0xfc, 0xbf, 0x0a, 0x2c, 0x07, 0x2f, 0x43, 0xa8, 0x8b, 0xbe, - 0x02, 0x17, 0x6a, 0xbb, 0xba, 0xbd, 0x63, 0xec, 0x57, 0x4a, 0x86, 0x7d, 0xb7, 0x52, 0xdf, 0x89, - 0x7d, 0xe4, 0x29, 0x38, 0x97, 0x82, 0x80, 0x5f, 0xd9, 0x84, 0xf5, 0x78, 0x51, 0x8b, 0x6e, 0xd5, - 0x0c, 0x1d, 0xfa, 0x78, 0x49, 0xb0, 0x4f, 0xb3, 0xc5, 0x7d, 0x58, 0xb1, 0xf4, 0x5a, 0x75, 0x77, - 0x30, 0xea, 0xb8, 0xfa, 0x64, 0x7c, 0xd4, 0x27, 0x17, 0x60, 0x63, 0xb7, 0x61, 0x96, 0x0c, 0x1b, - 0x51, 0x62, 0x2d, 0x38, 0x0b, 0xab, 0x72, 0xe1, 0x7d, 0x83, 0x2e, 0x5f, 0x02, 0x2b, 0x32, 0xb0, - 0xde, 0x50, 0x33, 0xc5, 0x2f, 0xc2, 0x52, 0x24, 0x15, 0xe4, 0x06, 0x9c, 0x95, 0x7f, 0x37, 0xdd, - 0x7e, 0xd7, 0xeb, 0x1f, 0xaa, 0x67, 0xe2, 0x05, 0xe6, 0xa4, 0xdf, 0xa7, 0x05, 0xb8, 0x9f, 0xe5, - 0x82, 0x96, 0x3b, 0x3a, 0xf6, 0xfa, 0xce, 0xd8, 0xed, 0xaa, 0x99, 0xe2, 0x0b, 0xb0, 0x1c, 0x09, - 0x40, 0x4f, 0x27, 0xae, 0xda, 0xe0, 0x0c, 0xb8, 0x66, 0xec, 0x54, 0xda, 0x35, 0x75, 0x8e, 0xee, - 0xe4, 0x72, 0x65, 0xaf, 0xac, 0x42, 0xf1, 0xfb, 0x0a, 0xbd, 0x4c, 0x61, 0x5a, 0xa9, 0xda, 0xae, - 0x2e, 0xa6, 0x9a, 0x2e, 0x33, 0x96, 0xd6, 0xc2, 0xb0, 0x2c, 0x66, 0x38, 0x70, 0x11, 0x36, 0xf9, - 0x0f, 0x5b, 0xaf, 0xef, 0xd8, 0x65, 0xdd, 0xdc, 0xb9, 0xa7, 0x9b, 0x74, 0xed, 0xdd, 0x57, 0x33, - 0xb8, 0xa1, 0x24, 0x88, 0xdd, 0x6a, 0xb4, 0x4b, 0x65, 0x35, 0x4b, 0xd7, 0x6f, 0x04, 0xde, 0xac, - 0xd4, 0xd5, 0x1c, 0x6e, 0xcf, 0x04, 0x36, 0x92, 0xa5, 0xe5, 0x73, 0xc5, 0xf7, 0x15, 0xd8, 0xb0, - 0xbc, 0xc3, 0xbe, 0x33, 0x9e, 0x8c, 0x5c, 0xbd, 0x77, 0x38, 0x18, 0x79, 0xe3, 0xa3, 0x63, 0x6b, - 0xe2, 0x8d, 0x5d, 0x72, 0x13, 0x9e, 0xb5, 0x2a, 0x7b, 0x75, 0xbd, 0x45, 0xb7, 0x97, 0x5e, 0xdd, - 0x6b, 0x98, 0x95, 0x56, 0xb9, 0x66, 0x5b, 0xed, 0x4a, 0x62, 0xe5, 0x5d, 0x83, 0xa7, 0xa7, 0xa3, - 0x56, 0x8d, 0x3d, 0xbd, 0x74, 0x5f, 0x55, 0x66, 0x13, 0xdc, 0xd6, 0xab, 0x7a, 0xbd, 0x64, 0xec, - 0xd8, 0xfb, 0xb7, 0xd4, 0x0c, 0x79, 0x16, 0xae, 0x4e, 0x47, 0xdd, 0xad, 0x34, 0x2d, 0x8a, 0x96, - 0x9d, 0xfd, 0xdd, 0xb2, 0x55, 0xa3, 0x58, 0xb9, 0xe2, 0x0f, 0x14, 0xd8, 0x9c, 0x16, 0x50, 0x8c, - 0x5c, 0x07, 0xcd, 0xa8, 0xb7, 0x4c, 0xbd, 0xb2, 0x63, 0x97, 0x4c, 0x63, 0xc7, 0xa8, 0xb7, 0x2a, - 0x7a, 0xd5, 0xb2, 0xad, 0x46, 0x9b, 0xae, 0xa6, 0xd0, 0xbe, 0xe3, 0x19, 0xb8, 0x32, 0x03, 0xaf, - 0x51, 0xd9, 0x29, 0xa9, 0x0a, 0xb9, 0x05, 0xcf, 0xcf, 0x40, 0xb2, 0xee, 0x5b, 0x2d, 0xa3, 0x26, - 0x97, 0xa8, 0x19, 0x64, 0x58, 0xe9, 0xf1, 0x94, 0x68, 0xef, 0xb0, 0x64, 0x76, 0xc3, 0xae, 0xc2, - 0xa5, 0xa9, 0x58, 0xbc, 0x59, 0xcf, 0xc0, 0x95, 0xa9, 0x28, 0xac, 0x51, 0x6a, 0xa6, 0x58, 0x82, - 0xad, 0xe9, 0xc1, 0x8a, 0xe8, 0x79, 0x11, 0x9d, 0xf2, 0x3c, 0xe4, 0x76, 0xe8, 0x11, 0x15, 0x49, - 0xc3, 0x52, 0xf4, 0x40, 0x8d, 0x07, 0xf2, 0x48, 0x58, 0x04, 0x99, 0xed, 0x7a, 0x9d, 0x9d, 0x67, - 0xab, 0x50, 0x68, 0xb4, 0xca, 0x86, 0xc9, 0x13, 0xd9, 0x60, 0xe6, 0x9a, 0x76, 0x9d, 0xee, 0xe0, - 0x86, 0x59, 0xf9, 0x02, 0x1e, 0x6c, 0x9b, 0xb0, 0x6e, 0x55, 0xf5, 0xd2, 0x5d, 0xbb, 0xde, 0x68, - 0xd9, 0x95, 0xba, 0x5d, 0x2a, 0xeb, 0xf5, 0xba, 0x51, 0x55, 0x01, 0x67, 0x75, 0x9a, 0x27, 0x2b, - 0xf9, 0x38, 0xdc, 0x68, 0xdc, 0x6d, 0xe9, 0x76, 0xb3, 0xda, 0xde, 0xab, 0xd4, 0x6d, 0xeb, 0x7e, - 0xbd, 0x24, 0x84, 0xb0, 0x52, 0x92, 0xf7, 0xdf, 0x80, 0x6b, 0x33, 0xb1, 0xc3, 0x94, 0x33, 0xd7, - 0x41, 0x9b, 0x89, 0xc9, 0x3b, 0x52, 0xfc, 0x99, 0x02, 0x17, 0x66, 0xbc, 0xd8, 0x93, 0xe7, 0xe1, - 0x66, 0xd9, 0xd0, 0x77, 0xaa, 0x86, 0x65, 0x21, 0xc7, 0xa2, 0x93, 0xc2, 0x2c, 0x87, 0x52, 0x39, - 0xfb, 0x4d, 0x78, 0x76, 0x36, 0x7a, 0x28, 0x23, 0xdc, 0x80, 0x6b, 0xb3, 0x51, 0xb9, 0xcc, 0x90, - 0x21, 0x45, 0xb8, 0x3e, 0x1b, 0x33, 0x90, 0x35, 0xb2, 0xc5, 0xdf, 0x52, 0xe0, 0x7c, 0xba, 0xda, - 0x8c, 0xb6, 0xad, 0x52, 0xb7, 0x5a, 0x7a, 0xb5, 0x6a, 0x37, 0x75, 0x53, 0xaf, 0xd9, 0x46, 0xdd, - 0x6c, 0x54, 0xab, 0x69, 0x67, 0xec, 0x35, 0x78, 0x7a, 0x3a, 0xaa, 0x55, 0x32, 0x2b, 0x4d, 0x7a, - 0x8c, 0x68, 0x70, 0x79, 0x3a, 0x96, 0x51, 0x29, 0x19, 0x6a, 0x66, 0xfb, 0x8d, 0x9f, 0xfc, 0xed, - 0xe5, 0x33, 0x3f, 0x79, 0xff, 0xb2, 0xf2, 0xf3, 0xf7, 0x2f, 0x2b, 0x7f, 0xf3, 0xfe, 0x65, 0xe5, - 0x0b, 0xcf, 0x9d, 0x2e, 0x5b, 0x1b, 0xde, 0x8e, 0x1e, 0xce, 0xe3, 0x7d, 0xf0, 0xa5, 0xff, 0x0c, - 0x00, 0x00, 0xff, 0xff, 0x59, 0xf2, 0x60, 0xff, 0x1d, 0xc3, 0x01, 0x00, + 0xa8, 0xd5, 0xb5, 0x69, 0x50, 0xfd, 0x3a, 0x79, 0xe1, 0xff, 0x67, 0xef, 0x49, 0x7b, 0xe3, 0x48, + 0xae, 0x53, 0xcf, 0x0c, 0xc9, 0xe1, 0xe3, 0xd5, 0x2c, 0x51, 0x22, 0x97, 0x3a, 0xb8, 0x6a, 0x69, + 0x65, 0x69, 0xf6, 0xf0, 0x4a, 0x9b, 0xf5, 0x1e, 0xf6, 0x7a, 0xdd, 0x1c, 0x36, 0xc9, 0x91, 0xe6, + 0x72, 0xf7, 0x90, 0xb2, 0xbc, 0xb6, 0xdb, 0xad, 0x99, 0x26, 0xd9, 0xde, 0xe1, 0xf4, 0x78, 0x7a, + 0x66, 0x65, 0x1a, 0x01, 0x62, 0x23, 0x80, 0x0d, 0x38, 0x87, 0x73, 0x22, 0x0b, 0x7f, 0x71, 0x80, + 0x2c, 0x82, 0x00, 0xc9, 0x0f, 0x08, 0x62, 0xe4, 0x83, 0xbf, 0x19, 0x30, 0x0c, 0x18, 0x08, 0x90, + 0x0f, 0x4e, 0xb0, 0x48, 0x16, 0x48, 0x90, 0x38, 0xf9, 0x16, 0x24, 0x1f, 0x0c, 0x04, 0x08, 0xea, + 0x55, 0x55, 0x77, 0xf5, 0x31, 0x23, 0xca, 0xbb, 0x9b, 0xc4, 0x80, 0x3f, 0x91, 0xf3, 0xea, 0xd5, + 0xeb, 0x3a, 0x5f, 0xbd, 0x7a, 0xf5, 0x0e, 0x80, 0xe8, 0xe9, 0x9f, 0x3d, 0xd4, 0x98, 0x12, 0xe4, + 0xd5, 0xc2, 0xbf, 0xfc, 0xf1, 0x86, 0xb2, 0x09, 0x50, 0x14, 0x61, 0x75, 0xb4, 0x2a, 0x3c, 0x31, + 0x96, 0x59, 0x90, 0x9b, 0xa0, 0x1e, 0x38, 0x5c, 0x55, 0xd8, 0x3e, 0x72, 0x7a, 0x3d, 0xb7, 0xcb, + 0xd9, 0xf4, 0x92, 0x80, 0x97, 0x19, 0x98, 0x51, 0xd6, 0x5e, 0x87, 0x95, 0xac, 0x55, 0x42, 0xae, + 0xc0, 0xbc, 0x1c, 0x41, 0x88, 0x13, 0x99, 0x73, 0xfa, 0x9e, 0x88, 0x21, 0xc4, 0x09, 0x7c, 0x4f, + 0x81, 0x8b, 0x93, 0x78, 0x0e, 0x59, 0x87, 0x62, 0x7f, 0xe0, 0xf9, 0x28, 0xdb, 0xf2, 0x14, 0x0d, + 0xe2, 0x37, 0x66, 0x5f, 0x40, 0x21, 0x6c, 0xe8, 0x1c, 0x72, 0xaf, 0x10, 0x73, 0x16, 0x21, 0x2d, + 0xe7, 0x30, 0x20, 0x4f, 0xc3, 0x72, 0xc7, 0x3d, 0x70, 0x46, 0xdd, 0xa1, 0x1d, 0xb4, 0x8f, 0xdc, + 0x0e, 0xfa, 0x6d, 0xa1, 0xb5, 0x9f, 0xa9, 0xf2, 0x02, 0x4b, 0xc0, 0x53, 0x2d, 0x9e, 0x1a, 0xd3, + 0xe2, 0x3b, 0x85, 0xa2, 0xa2, 0xe6, 0x4c, 0x34, 0xaf, 0xd2, 0xbe, 0x96, 0x83, 0xb5, 0x71, 0x9b, + 0x8c, 0xbc, 0x96, 0x35, 0x06, 0xec, 0xb5, 0x43, 0x86, 0xcb, 0xaf, 0x1d, 0xd2, 0xd7, 0xc8, 0x6d, + 0x08, 0xbd, 0xae, 0x1e, 0x15, 0x41, 0x41, 0xc0, 0x68, 0x9d, 0xbe, 0x13, 0x04, 0x0f, 0x29, 0x1f, + 0xc9, 0x4b, 0x51, 0x78, 0x39, 0x4c, 0xae, 0x23, 0x60, 0xe4, 0x25, 0x80, 0x76, 0xd7, 0x0f, 0x5c, + 0x34, 0x2a, 0xe0, 0x02, 0x0a, 0xb3, 0x25, 0x0f, 0xa1, 0xf2, 0x2b, 0x32, 0x42, 0xcb, 0x7e, 0xc7, + 0xe5, 0x13, 0xe8, 0xc0, 0xea, 0x18, 0xae, 0x4a, 0xa7, 0x27, 0x4a, 0x69, 0x2f, 0x12, 0x64, 0x8d, + 0xc2, 0xc4, 0xf6, 0xc9, 0x11, 0xcf, 0x8d, 0x5b, 0x23, 0x27, 0x40, 0xd2, 0xac, 0x93, 0x52, 0xe7, + 0x16, 0xd1, 0xa3, 0x41, 0x48, 0x9d, 0x41, 0xf6, 0x06, 0x5d, 0xb2, 0x01, 0x73, 0x22, 0x01, 0x26, + 0xbd, 0x00, 0x30, 0xe2, 0xc0, 0x41, 0x77, 0x5d, 0x5c, 0x3c, 0x18, 0x66, 0x15, 0x7d, 0xeb, 0xb8, + 0x68, 0x31, 0x8b, 0x90, 0xd6, 0x49, 0x5f, 0xf4, 0xee, 0xa2, 0x58, 0xdf, 0xf1, 0x03, 0x8d, 0x97, + 0xfe, 0xa1, 0x22, 0xa6, 0x3f, 0x7d, 0x22, 0x3c, 0xaa, 0x7d, 0x04, 0xd0, 0xb5, 0x89, 0x37, 0x0c, + 0xff, 0xa7, 0xa2, 0x8e, 0xd8, 0x75, 0x5c, 0xd4, 0xe1, 0x3f, 0xc9, 0x75, 0x58, 0x1a, 0x30, 0xe3, + 0xd7, 0xa1, 0xcf, 0xc7, 0x93, 0x25, 0x1b, 0x59, 0x60, 0xe0, 0x96, 0x8f, 0x63, 0xca, 0xdb, 0x75, + 0x27, 0x1c, 0x30, 0xe9, 0x80, 0x24, 0xcf, 0xc1, 0x2c, 0x3d, 0x20, 0x31, 0x3c, 0x4f, 0xc2, 0xa7, + 0x02, 0xf1, 0x50, 0xdc, 0x30, 0x8b, 0x5f, 0xe2, 0xff, 0x73, 0x5a, 0x6f, 0xe7, 0x04, 0x31, 0xf9, + 0x78, 0x26, 0xab, 0x30, 0xe3, 0x0f, 0x0e, 0xa5, 0xae, 0x4d, 0xfb, 0x83, 0x43, 0xda, 0xaf, 0x1b, + 0xa0, 0x32, 0x17, 0x1f, 0x16, 0x6a, 0x21, 0x38, 0xe9, 0xb1, 0xfb, 0x7b, 0xd1, 0x5c, 0x64, 0x70, + 0xcc, 0xf2, 0x7f, 0xd2, 0x6b, 0x53, 0xcc, 0x20, 0xf0, 0x6d, 0x39, 0x2a, 0x17, 0xef, 0xf6, 0x62, + 0x10, 0xf8, 0x51, 0x78, 0xae, 0x0e, 0xd9, 0x84, 0x05, 0x4a, 0x27, 0x8c, 0x0d, 0xc6, 0xa5, 0x87, + 0x4b, 0x69, 0xe9, 0xe1, 0xa4, 0xd7, 0x16, 0x4d, 0x34, 0xe7, 0x03, 0xe9, 0x17, 0xb9, 0x0b, 0xaa, + 0x24, 0x66, 0xa1, 0xcf, 0x67, 0xc2, 0x10, 0x3b, 0x22, 0x23, 0x89, 0x67, 0x95, 0xde, 0x81, 0x6f, + 0x2e, 0xb5, 0xe3, 0x00, 0x3e, 0x34, 0xdf, 0x55, 0x04, 0x2f, 0xcd, 0xa8, 0x44, 0x34, 0x58, 0x38, + 0x72, 0x02, 0x3b, 0x08, 0x8e, 0x99, 0x61, 0x19, 0x8f, 0x46, 0x3c, 0x77, 0xe4, 0x04, 0x56, 0x70, + 0x2c, 0xb2, 0x9d, 0x9c, 0xa3, 0x38, 0xbe, 0x33, 0x1a, 0x1e, 0xd9, 0xb2, 0xd0, 0xc8, 0x46, 0xec, + 0xec, 0x91, 0x13, 0x34, 0x68, 0x99, 0x44, 0x9b, 0x5c, 0x83, 0x45, 0xa4, 0xdb, 0xf6, 0x04, 0x61, + 0x0c, 0x97, 0x61, 0xce, 0x53, 0xc2, 0x6d, 0x8f, 0x51, 0xe6, 0x2d, 0xfc, 0xd7, 0x1c, 0x9c, 0xcf, + 0x1e, 0x1d, 0x5c, 0x9e, 0x74, 0x4c, 0xd1, 0xb1, 0x8f, 0xb7, 0x6d, 0x96, 0x42, 0x58, 0xa8, 0x93, + 0xac, 0xc9, 0xc9, 0x65, 0x4e, 0x4e, 0x09, 0x96, 0x91, 0x10, 0x17, 0x4f, 0xbb, 0x5e, 0x30, 0xe4, + 0x11, 0x3c, 0xcc, 0x25, 0x5a, 0xc0, 0xf8, 0x79, 0x95, 0x82, 0xc9, 0x53, 0xb0, 0x28, 0x38, 0xb2, + 0xff, 0xb0, 0x47, 0x3f, 0xcc, 0xd8, 0xf1, 0x02, 0x87, 0x36, 0x10, 0x48, 0xce, 0xc1, 0xb4, 0xd3, + 0xef, 0xd3, 0x4f, 0x32, 0x2e, 0x3c, 0xe5, 0xf4, 0xfb, 0x2c, 0x23, 0x0f, 0xba, 0x31, 0xda, 0x07, + 0x68, 0x5a, 0xc4, 0xed, 0x18, 0xcd, 0x79, 0x04, 0x32, 0x73, 0xa3, 0x80, 0xee, 0x7b, 0x5a, 0x57, + 0xa0, 0xcc, 0x20, 0x0a, 0x38, 0xfd, 0x10, 0xe1, 0x09, 0x28, 0x8a, 0x47, 0x6e, 0xe6, 0x8d, 0x61, + 0xce, 0x38, 0xfc, 0x81, 0xfb, 0x45, 0x58, 0xed, 0x78, 0x01, 0x2e, 0x5e, 0xd6, 0xa5, 0x7e, 0x9f, + 0x3b, 0x4e, 0xb2, 0xc8, 0xbe, 0xe6, 0x0a, 0x2f, 0xa6, 0x23, 0xa9, 0xf7, 0xfb, 0xcc, 0x7d, 0x92, + 0x8f, 0xf5, 0xcb, 0xb0, 0xc4, 0xc5, 0x34, 0x7e, 0x44, 0x62, 0x5b, 0xf8, 0x06, 0xa6, 0xf7, 0x27, + 0x9e, 0x03, 0x09, 0x38, 0xa8, 0xd2, 0x11, 0x35, 0xff, 0x5e, 0x81, 0x73, 0x99, 0x72, 0x1e, 0xf9, + 0x22, 0x30, 0x3f, 0xb1, 0xa1, 0x6f, 0x0f, 0xdc, 0xb6, 0xd7, 0xf7, 0x30, 0xf0, 0x06, 0xd3, 0x83, + 0xde, 0x9e, 0x24, 0x21, 0xa2, 0xcf, 0x59, 0xcb, 0x37, 0xc3, 0x4a, 0x4c, 0x41, 0xa3, 0x0e, 0x12, + 0xe0, 0xf5, 0x37, 0xe0, 0x5c, 0x26, 0x6a, 0x86, 0xe2, 0xe4, 0x99, 0x78, 0x06, 0x6a, 0xf1, 0xb2, + 0x95, 0xe8, 0xb4, 0xa4, 0x50, 0xe1, 0xdd, 0xfb, 0x7e, 0xd8, 0xbd, 0x84, 0x44, 0x48, 0x8c, 0xe4, + 0xbe, 0xce, 0xba, 0xd4, 0x88, 0x4a, 0xe3, 0xb7, 0xf6, 0x1b, 0x70, 0x8e, 0x2f, 0xbe, 0xc3, 0x81, + 0xd3, 0x3f, 0x8a, 0xc8, 0xb1, 0x86, 0x7e, 0x24, 0x8b, 0x1c, 0x5b, 0x95, 0x3b, 0x14, 0x3f, 0xa4, + 0x7a, 0xd6, 0x49, 0x03, 0x79, 0x1f, 0xbe, 0x9e, 0x13, 0x5b, 0x3d, 0xa3, 0x39, 0x19, 0xcb, 0x5a, + 0xc9, 0x5a, 0xd6, 0xa7, 0xdf, 0x53, 0x75, 0x20, 0x32, 0xb3, 0x62, 0xaa, 0x52, 0x6e, 0x85, 0x25, + 0x84, 0x7b, 0xde, 0x10, 0x89, 0x35, 0x58, 0x2c, 0x03, 0xe8, 0x72, 0x3b, 0x09, 0x22, 0x17, 0x60, + 0x36, 0x4c, 0xb2, 0xcd, 0x0f, 0x8e, 0x22, 0x03, 0x54, 0x3a, 0xe4, 0x49, 0x98, 0x67, 0x72, 0x7c, + 0x6c, 0xcf, 0x01, 0xc2, 0x74, 0xba, 0xf1, 0xc4, 0x18, 0x28, 0xf0, 0xe4, 0xa3, 0xc6, 0x90, 0xdc, + 0x83, 0xf3, 0x68, 0x0b, 0x12, 0xf8, 0xe1, 0x34, 0xd8, 0x6d, 0xa7, 0x7d, 0xe4, 0xf2, 0x55, 0xab, + 0x65, 0x4e, 0x46, 0xbf, 0x6f, 0x59, 0x0d, 0x69, 0x1e, 0xfa, 0x7d, 0x2b, 0xf0, 0xc5, 0xef, 0x32, + 0xad, 0xce, 0xdb, 0xd0, 0x81, 0x0b, 0x13, 0x6a, 0x4a, 0x8c, 0x43, 0x91, 0x19, 0xc7, 0x0d, 0x50, + 0x0f, 0xdc, 0x0e, 0x95, 0x89, 0xdd, 0x0e, 0x36, 0xed, 0xad, 0xdb, 0x2c, 0xad, 0xbc, 0xb9, 0x18, + 0xc2, 0xad, 0xc0, 0xdf, 0xbf, 0xcd, 0xbf, 0x72, 0x2c, 0x8e, 0x3c, 0xf9, 0x2e, 0x42, 0x9e, 0x83, + 0xb3, 0x89, 0xa0, 0x26, 0x91, 0x97, 0xbc, 0xb9, 0x4c, 0x8b, 0xe2, 0x21, 0xb0, 0xae, 0xc0, 0xbc, + 0x58, 0x15, 0x83, 0xd0, 0x79, 0xce, 0x9c, 0xe3, 0x30, 0xba, 0xeb, 0xf8, 0xe7, 0x46, 0xa2, 0x53, + 0x99, 0xd7, 0x98, 0x53, 0xc8, 0xd2, 0xe4, 0x59, 0x20, 0xa1, 0xdc, 0x1e, 0x32, 0x0a, 0xfe, 0xc1, + 0x65, 0x51, 0x12, 0xee, 0x70, 0xfe, 0xd9, 0x6f, 0xe5, 0xe1, 0x6c, 0xc6, 0xfd, 0x87, 0x5e, 0x02, + 0xbc, 0xde, 0xd0, 0x3d, 0x64, 0x57, 0x08, 0xb9, 0x93, 0x4b, 0x12, 0x9c, 0x2b, 0xb5, 0xa6, 0x59, + 0xda, 0x74, 0xfe, 0x2d, 0xfe, 0x8b, 0x32, 0x0f, 0x67, 0x20, 0xf4, 0x35, 0xf4, 0x5f, 0x52, 0x81, + 0x65, 0xcc, 0x05, 0x11, 0x78, 0x3e, 0xa6, 0x94, 0x40, 0x21, 0xa4, 0x10, 0xbb, 0x21, 0x61, 0x2b, + 0x9a, 0x12, 0x12, 0x95, 0x42, 0x4c, 0xb5, 0x9f, 0x80, 0x90, 0x8f, 0xc3, 0xba, 0x74, 0xd6, 0xd8, + 0x89, 0x9d, 0x87, 0xe6, 0xf1, 0xe6, 0xaa, 0x13, 0x9e, 0x3a, 0x5b, 0xb1, 0x3d, 0xb8, 0x09, 0x97, + 0x71, 0x12, 0xbd, 0x4e, 0xdf, 0x4e, 0x25, 0x0f, 0xc1, 0xae, 0xb2, 0x68, 0xfb, 0xeb, 0x14, 0xab, + 0xd2, 0xe9, 0x27, 0xf2, 0x88, 0x60, 0xaf, 0xab, 0x99, 0xbb, 0x73, 0x06, 0x77, 0xe7, 0x25, 0xb9, + 0x33, 0xa7, 0xd9, 0x9b, 0x7c, 0x32, 0xde, 0x80, 0x73, 0x99, 0xfd, 0xa7, 0xc7, 0x15, 0xda, 0x72, + 0x45, 0x92, 0xd6, 0x0c, 0xfd, 0x4d, 0x45, 0xad, 0x2b, 0x30, 0xff, 0xc0, 0x75, 0x06, 0xee, 0x80, + 0xcb, 0x01, 0x7c, 0x81, 0x31, 0x98, 0x2c, 0x06, 0x74, 0xe2, 0x13, 0xcd, 0xd5, 0x56, 0xa4, 0x06, + 0x67, 0xd9, 0x79, 0xea, 0x1d, 0xa3, 0x68, 0xc9, 0x55, 0x5d, 0x4a, 0x4c, 0xb8, 0xc2, 0x2a, 0x78, + 0xd0, 0x55, 0x10, 0x8b, 0xd5, 0x36, 0x97, 0x0f, 0x93, 0x20, 0xca, 0x1f, 0xce, 0x67, 0x63, 0x93, + 0x4d, 0x98, 0x63, 0xc4, 0xd9, 0x25, 0x83, 0xbd, 0x51, 0x5c, 0x99, 0xf8, 0x85, 0x32, 0x9a, 0x38, + 0x07, 0xe1, 0xff, 0xf4, 0xf4, 0xc7, 0xe7, 0x60, 0xfb, 0x58, 0x7e, 0x82, 0x31, 0xe7, 0x11, 0xc8, + 0x9f, 0x5e, 0xb4, 0xbf, 0x51, 0x44, 0x57, 0x63, 0xf7, 0x73, 0xba, 0x50, 0x03, 0xb7, 0x27, 0x9e, + 0xa1, 0x66, 0x4d, 0xfe, 0xeb, 0x31, 0x37, 0x0e, 0x79, 0x09, 0xe6, 0x29, 0xd9, 0xc3, 0x51, 0x8f, + 0x2d, 0xe0, 0x7c, 0x2c, 0x34, 0x50, 0x8d, 0x15, 0xd1, 0x69, 0xdb, 0x3d, 0x63, 0xce, 0x1d, 0x47, + 0x3f, 0xa9, 0xec, 0x1d, 0x1c, 0x0f, 0xfb, 0xf2, 0xb2, 0x17, 0xba, 0x4a, 0xab, 0xd6, 0x6a, 0xf2, + 0x2a, 0x45, 0x8a, 0x13, 0xc9, 0xde, 0x9b, 0xd3, 0x4c, 0x5b, 0xa9, 0x3d, 0x0d, 0x73, 0x12, 0x6d, + 0xda, 0x19, 0xe6, 0xbc, 0x23, 0x3a, 0xc3, 0x7e, 0xf1, 0xc9, 0x7e, 0x00, 0x45, 0x41, 0x92, 0x5e, + 0x32, 0x8e, 0xfc, 0x40, 0xb0, 0x0c, 0xfc, 0x9f, 0xc2, 0xe8, 0x28, 0x63, 0x27, 0xa7, 0x4c, 0xfc, + 0x1f, 0x4f, 0xa6, 0xa1, 0x43, 0x6f, 0x17, 0xdd, 0xc0, 0xee, 0xa3, 0x11, 0x58, 0x28, 0x8a, 0x53, + 0x78, 0xab, 0x1b, 0x30, 0xd3, 0x30, 0xfe, 0x8d, 0xbf, 0x0c, 0x8f, 0xf4, 0x84, 0x42, 0x63, 0x1c, + 0x07, 0x8e, 0x1d, 0x40, 0xb9, 0xf4, 0x01, 0xc4, 0x42, 0xbe, 0xf0, 0x9a, 0xec, 0xcb, 0x80, 0x30, + 0x3c, 0x80, 0x24, 0x3e, 0x53, 0x88, 0xf1, 0x19, 0xe9, 0x86, 0x1f, 0xcd, 0x1e, 0x3b, 0xbf, 0xc4, + 0x0d, 0x3f, 0xc9, 0xf5, 0xde, 0x09, 0x57, 0x48, 0x4c, 0xa5, 0x42, 0x45, 0x71, 0x26, 0x86, 0xf3, + 0x44, 0xc1, 0x09, 0x76, 0x7b, 0x16, 0x0b, 0x59, 0x1a, 0xa1, 0x90, 0xed, 0x3e, 0xfa, 0x06, 0x4b, + 0x9e, 0x87, 0x95, 0x30, 0xb5, 0x65, 0xf0, 0xa6, 0xd7, 0xb7, 0x31, 0xb9, 0xe9, 0x09, 0x17, 0x90, + 0x89, 0x28, 0xb3, 0xde, 0xf4, 0xfa, 0xfb, 0x58, 0xc2, 0x9b, 0xf9, 0xa7, 0x39, 0xa1, 0x17, 0xd9, + 0xf4, 0xfd, 0x61, 0x30, 0x1c, 0x38, 0xfd, 0x98, 0xd2, 0x98, 0x1c, 0xc3, 0x13, 0xd8, 0xa4, 0xdb, + 0x98, 0x6c, 0xc4, 0x1f, 0x88, 0x60, 0x28, 0xe1, 0x06, 0x9b, 0xbb, 0xfd, 0xd1, 0xf8, 0xc5, 0x46, + 0xa7, 0xd8, 0xba, 0x8c, 0x4c, 0xf7, 0x95, 0x44, 0x75, 0xf7, 0x8c, 0xb9, 0xca, 0x68, 0xa6, 0xb0, + 0xc8, 0x6e, 0x06, 0xaf, 0x49, 0x6a, 0x8d, 0x37, 0x23, 0xc6, 0x13, 0xa7, 0x2a, 0xb3, 0x24, 0xf2, + 0x49, 0x98, 0xf5, 0x3a, 0x72, 0x4e, 0xcd, 0xa4, 0xbe, 0xb2, 0xd2, 0x61, 0x71, 0xbd, 0x23, 0x1a, + 0x74, 0x6b, 0x78, 0x1c, 0xba, 0xb9, 0x10, 0x53, 0xaf, 0x6b, 0x9b, 0xe2, 0x0a, 0x9e, 0xae, 0x46, + 0x16, 0x21, 0x17, 0x2e, 0xc4, 0x9c, 0xd7, 0x61, 0x5c, 0x20, 0x8a, 0x2c, 0x6e, 0xf2, 0x5f, 0xda, + 0xaf, 0xc2, 0x8d, 0xd3, 0x8e, 0x11, 0xe5, 0x18, 0x63, 0x06, 0x7c, 0x96, 0x05, 0xf5, 0x8c, 0x8f, + 0xdb, 0x15, 0x90, 0x03, 0x23, 0x7b, 0x62, 0x89, 0x08, 0xd8, 0xde, 0xc0, 0xd3, 0xfe, 0x3d, 0x0f, + 0x8b, 0xf1, 0x07, 0x05, 0xf2, 0x34, 0x14, 0x24, 0x46, 0xb9, 0x9a, 0xf1, 0xea, 0x80, 0xec, 0x11, + 0x91, 0x4e, 0xc5, 0x18, 0xc9, 0x1d, 0x58, 0x44, 0x13, 0x47, 0x94, 0xb7, 0x87, 0x1e, 0x7f, 0xa6, + 0x9a, 0xfc, 0xd2, 0x58, 0xfc, 0xc1, 0xbb, 0x1b, 0x67, 0xf0, 0x51, 0x71, 0x9e, 0xd6, 0xa5, 0x22, + 0x2f, 0x2d, 0x94, 0xf4, 0xc5, 0x85, 0xf1, 0xfa, 0x62, 0xde, 0x95, 0x31, 0xfa, 0xe2, 0xa9, 0x09, + 0xfa, 0xe2, 0xa8, 0xa6, 0xac, 0x2f, 0xc6, 0x57, 0x83, 0x99, 0x71, 0xaf, 0x06, 0x51, 0x1d, 0xf6, + 0x6a, 0x10, 0xe9, 0x7b, 0x8b, 0x63, 0xf5, 0xbd, 0x51, 0x1d, 0xae, 0xef, 0x8d, 0x34, 0xb0, 0xb3, + 0x63, 0x35, 0xb0, 0x52, 0x25, 0xa6, 0x81, 0xbd, 0xc6, 0x07, 0x76, 0xe0, 0x3c, 0xb4, 0x71, 0xc4, + 0xb9, 0x00, 0x81, 0x43, 0x66, 0x3a, 0x0f, 0xd1, 0x76, 0x69, 0x73, 0x16, 0x84, 0xc1, 0x93, 0xf6, + 0xbd, 0x04, 0x03, 0x12, 0x73, 0xfe, 0x14, 0x2c, 0xb2, 0x73, 0x98, 0x07, 0x8b, 0x65, 0x07, 0xf1, + 0x82, 0xb9, 0x20, 0xa0, 0xec, 0x62, 0xfe, 0x11, 0x58, 0x0a, 0xd1, 0xf8, 0xdd, 0x14, 0xfd, 0x20, + 0xcd, 0xb0, 0x36, 0x0f, 0xea, 0x23, 0xd3, 0x1b, 0xf0, 0xb0, 0x39, 0x31, 0x7a, 0x2c, 0xa6, 0xca, + 0xb3, 0x40, 0x22, 0xb4, 0xd0, 0xfc, 0xb3, 0x80, 0xa8, 0xcb, 0x21, 0x6a, 0x68, 0xa3, 0xf9, 0xfb, + 0x4a, 0x42, 0xe3, 0xfb, 0x61, 0x35, 0xff, 0x69, 0x08, 0xbf, 0x6e, 0x73, 0xad, 0x9d, 0xe8, 0x81, + 0x2a, 0x0a, 0x9a, 0x1c, 0xae, 0x1d, 0x26, 0x6f, 0x98, 0x1f, 0x52, 0xab, 0xb4, 0xef, 0xe7, 0x63, + 0xda, 0x30, 0xf1, 0x19, 0x2a, 0xdf, 0x04, 0xbe, 0xcd, 0xa7, 0x98, 0xb3, 0xdf, 0x2b, 0x63, 0x96, + 0x29, 0x37, 0x78, 0xb3, 0xac, 0x86, 0x09, 0x41, 0xe0, 0x0b, 0xfb, 0x37, 0x9b, 0xdd, 0x9c, 0x98, + 0x44, 0x86, 0xdb, 0x54, 0x90, 0x63, 0xbc, 0xb6, 0x34, 0x99, 0x9c, 0x50, 0x47, 0xd0, 0x5d, 0x8a, + 0x37, 0xa8, 0xf0, 0x97, 0xf8, 0xc0, 0x1e, 0xa0, 0xf2, 0x38, 0x88, 0x13, 0xcf, 0x67, 0xdc, 0x91, + 0x53, 0xc4, 0x71, 0x94, 0x90, 0xb2, 0x3a, 0x12, 0xff, 0x0a, 0xb2, 0x06, 0xcc, 0xa3, 0x2e, 0x4a, + 0x10, 0x2c, 0x64, 0xbc, 0xcf, 0xa4, 0x3b, 0x5f, 0xae, 0xd4, 0xcc, 0x39, 0x5a, 0x4f, 0x90, 0x39, + 0x82, 0x27, 0x64, 0x0d, 0x52, 0xbc, 0x91, 0x53, 0x22, 0xc4, 0xf3, 0xc4, 0x11, 0x88, 0x14, 0x4d, + 0xd8, 0xd4, 0xf3, 0x4e, 0x1c, 0xc0, 0xd1, 0xb4, 0x23, 0x58, 0x1f, 0x3f, 0x25, 0x13, 0xd2, 0x87, + 0x45, 0xa2, 0x4d, 0x4e, 0x16, 0x6d, 0x64, 0x7d, 0x52, 0x3e, 0xa6, 0x4f, 0xd2, 0xfe, 0x24, 0x0f, + 0x57, 0x4f, 0x31, 0x5d, 0x13, 0xbe, 0xf9, 0xa9, 0xb8, 0xe0, 0x9c, 0x8b, 0x69, 0x00, 0x28, 0x51, + 0x7e, 0x26, 0x9c, 0xf4, 0xda, 0x63, 0xc4, 0xe6, 0x2f, 0xc2, 0x12, 0x63, 0xfc, 0xcc, 0x66, 0xf5, + 0x60, 0xd4, 0x3d, 0x05, 0xe7, 0xbf, 0x20, 0x1c, 0xec, 0x12, 0x55, 0xf1, 0x30, 0x40, 0x7e, 0x67, + 0x85, 0x30, 0xd2, 0x82, 0x39, 0x44, 0x3b, 0x70, 0xbc, 0xee, 0xa9, 0x3c, 0xbd, 0x84, 0xfb, 0x9e, + 0x5c, 0x8d, 0x99, 0xda, 0x53, 0xc0, 0x36, 0xfe, 0x26, 0xd7, 0x61, 0xa9, 0x37, 0x3a, 0xa6, 0x22, + 0x21, 0x5b, 0x0b, 0xdc, 0x34, 0x68, 0xca, 0x5c, 0xe8, 0x8d, 0x8e, 0xf5, 0x7e, 0x1f, 0xa7, 0x14, + 0x6d, 0x88, 0x96, 0x29, 0x1e, 0xdb, 0xb5, 0x02, 0x73, 0x1a, 0x31, 0x29, 0x01, 0xb6, 0x6f, 0x39, + 0xee, 0x0a, 0x30, 0x8b, 0x52, 0x9e, 0x3e, 0x8d, 0xfd, 0xd0, 0xfe, 0x2b, 0x27, 0xf4, 0x1a, 0xe3, + 0xd7, 0xfd, 0x2f, 0xa7, 0x28, 0x63, 0x8a, 0x6e, 0x80, 0x4a, 0x87, 0x3e, 0x62, 0x2a, 0xe1, 0x1c, + 0x2d, 0xf6, 0x46, 0xc7, 0xe1, 0xd8, 0xc9, 0x03, 0x3f, 0x2d, 0x0f, 0xfc, 0x4b, 0x42, 0xef, 0x91, + 0xc9, 0x1e, 0xc6, 0x0f, 0x39, 0x95, 0x98, 0xae, 0x9f, 0x8e, 0x09, 0xfc, 0x72, 0xde, 0x32, 0xe6, + 0x2d, 0xa1, 0x22, 0x9f, 0x4a, 0xa9, 0xc8, 0x33, 0xf6, 0xde, 0x74, 0xd6, 0xde, 0x4b, 0x29, 0xe4, + 0x67, 0x32, 0x14, 0xf2, 0x99, 0x1b, 0xb4, 0xf8, 0x88, 0x0d, 0x3a, 0x2b, 0xaf, 0x93, 0x7f, 0xce, + 0x09, 0x89, 0x29, 0x7e, 0x05, 0x7a, 0x03, 0xce, 0x8a, 0x2b, 0x10, 0x3b, 0x39, 0xa2, 0x77, 0x96, + 0xb9, 0xdb, 0x37, 0xb3, 0x2e, 0x3f, 0x88, 0x96, 0x71, 0x41, 0x59, 0xe6, 0xd7, 0x9e, 0xa8, 0xfc, + 0xff, 0xcf, 0x85, 0x87, 0xdc, 0x87, 0xf3, 0x98, 0x7c, 0xa0, 0x2d, 0xbf, 0x10, 0xd9, 0x03, 0xf7, + 0x80, 0xaf, 0x87, 0x2b, 0xa9, 0xeb, 0x81, 0xd7, 0x96, 0x9a, 0x63, 0xba, 0x07, 0xbb, 0x67, 0xcc, + 0x95, 0x20, 0x03, 0x9e, 0xbc, 0x4b, 0xfd, 0x85, 0x02, 0xda, 0xa3, 0xc7, 0x0b, 0xaf, 0xbd, 0xc9, + 0x01, 0xa7, 0xd7, 0x5e, 0x69, 0xf4, 0xae, 0xc2, 0xc2, 0xc0, 0x3d, 0x18, 0xb8, 0xc1, 0x51, 0x4c, + 0x37, 0x35, 0xcf, 0x81, 0x62, 0x60, 0x44, 0xc4, 0xd2, 0xc7, 0xba, 0x8c, 0x88, 0x4a, 0xda, 0x76, + 0x78, 0x45, 0xce, 0x9c, 0x07, 0xba, 0x9a, 0xe4, 0x06, 0xb2, 0x1f, 0x77, 0x0a, 0xc5, 0x9c, 0x9a, + 0x37, 0x79, 0x5c, 0xd5, 0x03, 0xaf, 0xeb, 0x6a, 0x7f, 0xa5, 0x08, 0x89, 0x20, 0x6b, 0xf0, 0xc8, + 0x1b, 0x92, 0xa5, 0x77, 0x3e, 0x25, 0x86, 0x64, 0x55, 0x91, 0x8d, 0x62, 0x79, 0xec, 0x4e, 0x04, + 0xc4, 0x62, 0x77, 0x22, 0xe4, 0x7d, 0x98, 0xab, 0x72, 0x45, 0xc1, 0x2b, 0xc2, 0x5c, 0x8c, 0xf2, + 0xbc, 0xfd, 0x5b, 0xe4, 0x26, 0xcc, 0x30, 0x0b, 0x31, 0xd1, 0xdc, 0xa5, 0x58, 0x73, 0xf7, 0x6f, + 0x99, 0xa2, 0x5c, 0x7b, 0x3b, 0x7c, 0xbf, 0x4c, 0x75, 0x62, 0xff, 0x16, 0x79, 0xe9, 0x74, 0x96, + 0xdb, 0x45, 0x61, 0xb9, 0x1d, 0x5a, 0x6d, 0xbf, 0x1c, 0xb3, 0xda, 0xbe, 0x36, 0x79, 0xb4, 0xf8, + 0xab, 0x33, 0x8b, 0x55, 0x19, 0xc5, 0x30, 0xfb, 0x49, 0x0e, 0x2e, 0x4d, 0xac, 0x41, 0x2e, 0x42, + 0x51, 0x6f, 0x56, 0x5a, 0xd1, 0xfc, 0xd2, 0x3d, 0x23, 0x20, 0x64, 0x07, 0x66, 0x37, 0x9d, 0xc0, + 0x6b, 0xd3, 0x65, 0x9c, 0xf9, 0x0c, 0x94, 0x22, 0x1b, 0xa2, 0xef, 0x9e, 0x31, 0xa3, 0xba, 0xc4, + 0x86, 0x65, 0xdc, 0x0b, 0xb1, 0xbc, 0x64, 0xf9, 0x0c, 0xf5, 0x4a, 0x8a, 0x60, 0xaa, 0x1a, 0xe5, + 0x33, 0x29, 0x20, 0x79, 0x00, 0xc4, 0xb2, 0x76, 0xcb, 0xee, 0x60, 0xc8, 0xd5, 0x0e, 0x43, 0x2f, + 0x34, 0x03, 0x7e, 0xfe, 0x11, 0x63, 0x97, 0xaa, 0xb7, 0x7b, 0xc6, 0xcc, 0xa0, 0x96, 0xdc, 0xe6, + 0x6f, 0x09, 0x79, 0x67, 0xfc, 0x20, 0x3c, 0x46, 0x1c, 0xe0, 0x1b, 0x50, 0x6c, 0x0a, 0x9b, 0x13, + 0xc9, 0x9d, 0x42, 0xd8, 0x97, 0x98, 0x61, 0xa9, 0xf6, 0x9b, 0x8a, 0xd0, 0xb3, 0x3c, 0x7a, 0xb0, + 0xa4, 0xb4, 0x71, 0x9d, 0xc9, 0x69, 0xe3, 0x3a, 0x3f, 0x67, 0xda, 0x38, 0xcd, 0x83, 0x9b, 0xa7, + 0x1e, 0x58, 0xf2, 0x09, 0x50, 0x31, 0xc3, 0x96, 0x23, 0x4d, 0x12, 0xdb, 0x5f, 0xcb, 0x61, 0x60, + 0xf8, 0x5d, 0x9e, 0xc6, 0xd0, 0x5c, 0x6a, 0xc7, 0x6b, 0x6b, 0x7f, 0xc6, 0x13, 0x02, 0x54, 0x3a, + 0xcd, 0xc4, 0x83, 0xc2, 0xfb, 0xf5, 0xc0, 0x31, 0x62, 0x9b, 0xed, 0xaa, 0x94, 0xe1, 0x34, 0xfd, + 0xad, 0xf1, 0x8e, 0x38, 0xd2, 0xce, 0xfb, 0xa3, 0x3c, 0x5c, 0x9c, 0x54, 0x3d, 0x33, 0x87, 0xba, + 0xf2, 0x78, 0x39, 0xd4, 0x6f, 0x42, 0x91, 0xc1, 0x42, 0xf7, 0x12, 0x9c, 0x5b, 0x5e, 0x95, 0xce, + 0xad, 0x28, 0x26, 0x57, 0x61, 0x5a, 0x2f, 0x5b, 0x51, 0x5a, 0x3f, 0xb4, 0x03, 0x77, 0xda, 0x01, + 0x5a, 0x18, 0xf3, 0x22, 0xf2, 0x85, 0x74, 0x26, 0x4b, 0x9e, 0xcf, 0xef, 0x82, 0x34, 0x20, 0xa9, + 0x5c, 0x1d, 0xd8, 0xde, 0x28, 0xb7, 0x04, 0x0f, 0xd7, 0x6e, 0xa6, 0xb3, 0x62, 0x6a, 0x30, 0xdd, + 0x1c, 0xb8, 0x81, 0x3b, 0x94, 0x6d, 0xb4, 0xfb, 0x08, 0x31, 0x79, 0x09, 0xb7, 0xa0, 0x76, 0x4e, + 0x58, 0xc0, 0x8c, 0x69, 0x39, 0x88, 0x11, 0x9a, 0x5c, 0x53, 0xb0, 0x29, 0xa1, 0xd0, 0x0a, 0x55, + 0x67, 0xd4, 0x6b, 0x1f, 0xed, 0x99, 0x55, 0x2e, 0x39, 0xb1, 0x0a, 0x5d, 0x84, 0xd2, 0x0e, 0x06, + 0xa6, 0x84, 0xa2, 0x7d, 0x53, 0x81, 0x95, 0xac, 0x7e, 0x90, 0x8b, 0x50, 0xe8, 0x65, 0x26, 0xed, + 0xec, 0x31, 0x3f, 0xff, 0x39, 0xfa, 0xd7, 0x3e, 0xf0, 0x07, 0xc7, 0xce, 0x50, 0xb6, 0x64, 0x97, + 0xc0, 0x26, 0xd0, 0x1f, 0xdb, 0xf8, 0x3f, 0xd9, 0x10, 0x47, 0x4e, 0x3e, 0x95, 0xe6, 0x13, 0xff, + 0x68, 0x3a, 0x40, 0xa5, 0xd3, 0x6c, 0xf4, 0x59, 0xae, 0x88, 0x17, 0xa0, 0x40, 0x9b, 0x95, 0x58, + 0xbd, 0x74, 0xfd, 0xe8, 0xb5, 0x2a, 0x47, 0x62, 0xad, 0x0a, 0x9c, 0xe3, 0xae, 0x89, 0xc8, 0xda, + 0x3d, 0x58, 0x8c, 0x63, 0x10, 0x23, 0x1e, 0x2e, 0x78, 0xee, 0xb6, 0xca, 0x29, 0x6d, 0xfa, 0x3e, + 0xf3, 0xa6, 0xda, 0x7c, 0xe2, 0x27, 0xef, 0x6e, 0x00, 0xfd, 0xc9, 0xea, 0x64, 0x85, 0x13, 0xd6, + 0xbe, 0x9d, 0x83, 0x95, 0x28, 0x80, 0x83, 0xd8, 0x43, 0xbf, 0xb0, 0xde, 0xc4, 0x7a, 0xcc, 0xdb, + 0x55, 0xc8, 0x8d, 0xe9, 0x0e, 0x4e, 0x70, 0xb2, 0xdb, 0x81, 0xb5, 0x71, 0xf8, 0xe4, 0x69, 0x98, + 0xc5, 0x98, 0x5f, 0x7d, 0xa7, 0xed, 0xca, 0x6c, 0xb6, 0x27, 0x80, 0x66, 0x54, 0xae, 0xfd, 0x48, + 0x81, 0x75, 0xee, 0x03, 0x54, 0x73, 0xbc, 0x1e, 0xbe, 0xdf, 0xb4, 0xdd, 0x0f, 0xc6, 0x1b, 0x7e, + 0x27, 0xc6, 0xc7, 0x9e, 0x8a, 0xbb, 0x7a, 0xa5, 0xbe, 0x36, 0xbe, 0xb7, 0xe4, 0x26, 0xc6, 0xb1, + 0xe3, 0xd6, 0x12, 0x05, 0x16, 0x7d, 0xa4, 0x47, 0x01, 0x72, 0xf4, 0x11, 0xc4, 0xd0, 0x7e, 0x0d, + 0x2e, 0x4f, 0xfe, 0x00, 0xf9, 0x3c, 0x2c, 0x60, 0x62, 0xb6, 0xbd, 0xfe, 0xe1, 0xc0, 0xe9, 0xb8, + 0x42, 0xb3, 0x27, 0x14, 0xd0, 0x72, 0x19, 0x0b, 0xcb, 0xc7, 0xa3, 0x61, 0x1c, 0x62, 0xca, 0x37, + 0x5e, 0x29, 0xe6, 0x68, 0x27, 0x53, 0xd3, 0xbe, 0xa6, 0x00, 0x49, 0xd3, 0x20, 0x1f, 0x83, 0xf9, + 0xbd, 0x56, 0xd9, 0x1a, 0x3a, 0x83, 0xe1, 0xae, 0x3f, 0x1a, 0xf0, 0x98, 0x78, 0x2c, 0x38, 0xc2, + 0xb0, 0x6d, 0xb3, 0x97, 0xba, 0x23, 0x7f, 0x34, 0x30, 0x63, 0x78, 0x98, 0x00, 0xcc, 0x75, 0xdf, + 0xec, 0x38, 0x27, 0xf1, 0x04, 0x60, 0x1c, 0x16, 0x4b, 0x00, 0xc6, 0x61, 0xda, 0x3b, 0x0a, 0x5c, + 0x10, 0x46, 0xb0, 0x9d, 0x8c, 0xb6, 0x94, 0x31, 0x04, 0xd0, 0x40, 0x04, 0x61, 0x9e, 0x24, 0xa1, + 0x2f, 0x8b, 0x28, 0x59, 0xd8, 0x40, 0x14, 0xd5, 0x59, 0x5d, 0xf2, 0x29, 0x28, 0x58, 0x43, 0xbf, + 0x7f, 0x8a, 0x30, 0x59, 0x6a, 0x38, 0xa3, 0x43, 0xbf, 0x8f, 0x24, 0xb0, 0xa6, 0xe6, 0xc2, 0x8a, + 0xdc, 0x38, 0xd1, 0x62, 0x52, 0x83, 0x19, 0x1e, 0x0f, 0x31, 0x61, 0x5f, 0x32, 0xa1, 0x4f, 0x9b, + 0x4b, 0x22, 0x16, 0x17, 0x0f, 0x02, 0x6c, 0x0a, 0x1a, 0xda, 0x6f, 0x2b, 0x30, 0x47, 0x05, 0x1b, + 0xbc, 0x94, 0xbe, 0xdf, 0x25, 0x1d, 0x97, 0x83, 0x85, 0xb9, 0x54, 0x48, 0xfe, 0x54, 0xa7, 0xf1, + 0x8b, 0xb0, 0x94, 0xa8, 0x40, 0x34, 0x8c, 0xc2, 0xd2, 0xf5, 0xda, 0x0e, 0xcb, 0x27, 0xc4, 0x4c, + 0x8d, 0x62, 0x30, 0xed, 0x5b, 0x0a, 0xac, 0x34, 0xde, 0x1c, 0x3a, 0xec, 0x41, 0xdd, 0x1c, 0x75, + 0xc5, 0x7e, 0xa7, 0xc2, 0x9a, 0xb0, 0xa6, 0x66, 0x11, 0x22, 0x98, 0xb0, 0xc6, 0x61, 0x66, 0x58, + 0x4a, 0x76, 0xa1, 0xc8, 0xcf, 0x97, 0x80, 0xc7, 0xee, 0xbd, 0x2c, 0xe9, 0x46, 0x22, 0xc2, 0x1c, + 0x89, 0xf6, 0x04, 0x59, 0x18, 0xaf, 0x63, 0x86, 0xb5, 0xb5, 0xff, 0x50, 0x60, 0x75, 0x4c, 0x1d, + 0xf2, 0x1a, 0x4c, 0xa1, 0xf7, 0x2a, 0x9f, 0xbd, 0x8b, 0x63, 0x3e, 0x31, 0x6c, 0x1f, 0xed, 0xdf, + 0x62, 0x07, 0xd1, 0x31, 0xfd, 0x61, 0xb2, 0x5a, 0xe4, 0x0d, 0x98, 0xd5, 0x3b, 0x1d, 0x7e, 0x3b, + 0xcb, 0xc5, 0x6e, 0x67, 0x63, 0xbe, 0xf8, 0x5c, 0x88, 0xcf, 0x6e, 0x67, 0xcc, 0x8f, 0xaa, 0xd3, + 0xb1, 0xb9, 0x67, 0x6e, 0x44, 0x6f, 0xfd, 0x13, 0xb0, 0x18, 0x47, 0x7e, 0x2c, 0x67, 0xc2, 0xb7, + 0x15, 0x50, 0xe3, 0x6d, 0xf8, 0x70, 0xa2, 0x88, 0x65, 0x4d, 0xf3, 0x23, 0x16, 0xd5, 0xef, 0xe6, + 0xe0, 0x5c, 0xe6, 0x08, 0x93, 0x67, 0x61, 0x5a, 0xef, 0xf7, 0x2b, 0x5b, 0x7c, 0x55, 0x71, 0x09, + 0x09, 0x95, 0xde, 0xb1, 0xcb, 0x2b, 0x43, 0x22, 0x2f, 0x40, 0x91, 0xd9, 0x6d, 0x6c, 0x09, 0x86, + 0x83, 0x61, 0x91, 0xb8, 0x51, 0x49, 0x3c, 0x8a, 0xae, 0x40, 0x24, 0xdb, 0xb0, 0xc8, 0x03, 0x0a, + 0x99, 0xee, 0xa1, 0xfb, 0x95, 0x30, 0x9d, 0x03, 0x66, 0x9c, 0x10, 0x9a, 0x74, 0x7b, 0xc0, 0xca, + 0xe4, 0x90, 0x3a, 0xf1, 0x5a, 0xa4, 0x0a, 0x2a, 0xd2, 0x94, 0x29, 0xb1, 0x50, 0xbe, 0x18, 0xe2, + 0x89, 0x35, 0x62, 0x0c, 0xad, 0x54, 0xcd, 0x70, 0xba, 0xf4, 0x20, 0xf0, 0x0e, 0x7b, 0xc7, 0x6e, + 0x6f, 0xf8, 0xe1, 0x4d, 0x57, 0xf4, 0x8d, 0x53, 0x4d, 0xd7, 0x1f, 0x14, 0xd8, 0x66, 0x4e, 0x56, + 0xa3, 0x12, 0x8d, 0x14, 0xbd, 0x1d, 0x25, 0x1a, 0x7a, 0x3f, 0xe3, 0x21, 0x73, 0xb6, 0x60, 0x86, + 0x85, 0x32, 0x12, 0x3b, 0xe3, 0x52, 0x66, 0x13, 0x18, 0xce, 0xfe, 0x2d, 0x26, 0xbe, 0x30, 0x37, + 0xda, 0xc0, 0x14, 0x55, 0xc9, 0x3e, 0xcc, 0x95, 0xbb, 0xae, 0xd3, 0x1b, 0xf5, 0x5b, 0xa7, 0x7b, + 0x34, 0x5e, 0xe3, 0x7d, 0x99, 0x6f, 0xb3, 0x6a, 0xf8, 0xd8, 0x8c, 0x9c, 0x5c, 0x26, 0x44, 0x5a, + 0xa1, 0x67, 0x5d, 0x01, 0x15, 0xaf, 0xcf, 0x4f, 0x18, 0x9f, 0x24, 0x10, 0xeb, 0xc5, 0xdd, 0x46, + 0xb9, 0xeb, 0x9d, 0x0d, 0x8b, 0x55, 0x27, 0x18, 0xb6, 0x06, 0x4e, 0x2f, 0xc0, 0x10, 0xa8, 0xa7, + 0x08, 0x11, 0x77, 0x41, 0xa4, 0xf7, 0x46, 0x95, 0xe9, 0x30, 0xac, 0xca, 0x14, 0xb2, 0x71, 0x72, + 0x54, 0x5e, 0xda, 0xf6, 0x7a, 0x4e, 0xd7, 0xfb, 0xaa, 0x70, 0x40, 0x66, 0xf2, 0xd2, 0x81, 0x00, + 0x9a, 0x51, 0xb9, 0xf6, 0xb9, 0xd4, 0xbc, 0xb1, 0x56, 0xce, 0xc1, 0x0c, 0x0f, 0x4f, 0xc1, 0xc2, + 0x35, 0x34, 0x8d, 0xfa, 0x56, 0xa5, 0xbe, 0xa3, 0x2a, 0x64, 0x11, 0xa0, 0x69, 0x36, 0xca, 0x86, + 0x65, 0xd1, 0xdf, 0x39, 0xfa, 0x9b, 0xc7, 0x72, 0xd8, 0xde, 0xab, 0xaa, 0x79, 0x29, 0x9c, 0x43, + 0x41, 0xfb, 0xa1, 0x02, 0xe7, 0xb3, 0xa7, 0x92, 0xb4, 0x00, 0x03, 0x7a, 0x70, 0xf3, 0x81, 0x8f, + 0x4d, 0x9c, 0xf7, 0x4c, 0x70, 0x32, 0x30, 0xc8, 0x90, 0x05, 0x9c, 0xc8, 0x89, 0xb7, 0x2f, 0xe6, + 0xc1, 0xea, 0x75, 0xcc, 0x9c, 0xd7, 0xd1, 0xca, 0xb0, 0x36, 0x8e, 0x46, 0xbc, 0xab, 0x4b, 0x30, + 0xa7, 0x37, 0x9b, 0xd5, 0x4a, 0x59, 0x6f, 0x55, 0x1a, 0x75, 0x55, 0x21, 0xb3, 0x30, 0xb5, 0x63, + 0x36, 0xf6, 0x9a, 0x6a, 0x4e, 0xfb, 0x5b, 0x05, 0x16, 0x2a, 0x91, 0x75, 0xe1, 0xfb, 0xdd, 0x7c, + 0xaf, 0xc6, 0x36, 0xdf, 0x5a, 0x18, 0xfa, 0x26, 0xfc, 0xc0, 0x04, 0x09, 0x72, 0x33, 0xf4, 0x4f, + 0xce, 0xc7, 0xcc, 0x00, 0xe4, 0xda, 0xc2, 0xf3, 0x33, 0xcc, 0x40, 0x11, 0xf7, 0x5f, 0x96, 0x76, + 0xef, 0x5f, 0xe7, 0xe0, 0x6c, 0x46, 0x4d, 0xf2, 0x15, 0xb8, 0xdc, 0x74, 0x7b, 0x1d, 0xaf, 0x77, + 0x48, 0x77, 0x6b, 0xcb, 0x09, 0xde, 0x0c, 0xea, 0xfe, 0xd0, 0x3b, 0xe0, 0x67, 0x78, 0xe8, 0x6a, + 0xfe, 0xfc, 0x4f, 0xdf, 0xdd, 0x78, 0xa6, 0xcf, 0x30, 0x99, 0x4b, 0xc5, 0x90, 0xe2, 0xda, 0x3d, + 0x09, 0x39, 0xee, 0x84, 0xfe, 0x08, 0xba, 0xe4, 0xcf, 0x15, 0xb8, 0x3a, 0x09, 0x45, 0x4e, 0x2c, + 0x35, 0x79, 0xeb, 0xbc, 0xc6, 0x5f, 0x1b, 0x6e, 0x3d, 0xaa, 0x7d, 0xd9, 0xae, 0xea, 0xa7, 0x69, + 0x85, 0xf6, 0x5e, 0x0e, 0x96, 0x53, 0xf3, 0x46, 0x2c, 0x98, 0xd1, 0xef, 0x59, 0x8d, 0xca, 0x56, + 0x99, 0xaf, 0x8e, 0x8d, 0xc8, 0x98, 0x10, 0x13, 0xd2, 0xa5, 0x66, 0x9a, 0xb9, 0xec, 0x3f, 0x0c, + 0x6c, 0xdf, 0xeb, 0x48, 0xd9, 0xa9, 0x77, 0xcf, 0x98, 0x82, 0x12, 0x4a, 0x13, 0x5f, 0x1d, 0x0d, + 0x5c, 0x24, 0x9b, 0x8b, 0xe9, 0xd6, 0x43, 0x78, 0x9a, 0x30, 0xfa, 0x4a, 0x39, 0xb4, 0x3c, 0x4d, + 0x3a, 0xa2, 0x47, 0xea, 0x30, 0xbd, 0xe3, 0x0d, 0x77, 0x47, 0x0f, 0xf8, 0xaa, 0xba, 0x1c, 0xa5, + 0x27, 0xdb, 0x1d, 0x3d, 0x48, 0x93, 0x45, 0xb5, 0x31, 0x0b, 0xaf, 0x15, 0x23, 0xc9, 0xa9, 0x24, + 0xbd, 0x8c, 0x0b, 0x8f, 0xe5, 0x65, 0xbc, 0xb9, 0x00, 0x73, 0xfc, 0x1e, 0x8b, 0x57, 0xc4, 0xef, + 0x2b, 0xb0, 0x36, 0x6e, 0xe4, 0xe8, 0xd5, 0x38, 0x1e, 0x4d, 0xe4, 0x7c, 0x98, 0xbf, 0x26, 0x1e, + 0x46, 0x44, 0xa0, 0x91, 0xd7, 0x61, 0x8e, 0x59, 0xca, 0x59, 0x2f, 0xec, 0x99, 0x15, 0xce, 0x32, + 0x2e, 0xfd, 0xf4, 0xdd, 0x8d, 0x55, 0x6e, 0x5c, 0x17, 0xbc, 0x60, 0x8f, 0x06, 0x5e, 0x2c, 0xd7, + 0x87, 0x5c, 0x83, 0xde, 0x64, 0x9c, 0x51, 0xc7, 0x73, 0xc5, 0x3d, 0x4e, 0x44, 0x5c, 0xe0, 0x30, + 0x59, 0xae, 0x10, 0x30, 0xed, 0x1b, 0x0a, 0xac, 0x8f, 0x9f, 0x26, 0x2a, 0xab, 0xb4, 0x98, 0xc1, + 0xa1, 0xd8, 0x59, 0x28, 0xab, 0x84, 0x56, 0x89, 0x32, 0x4d, 0x81, 0x48, 0x2b, 0x71, 0x2d, 0xa3, + 0x50, 0x54, 0xc9, 0x09, 0xeb, 0xe3, 0x95, 0x04, 0xa2, 0x76, 0x1f, 0x56, 0xc7, 0x4c, 0x2a, 0xf9, + 0x64, 0x66, 0x56, 0x2c, 0x74, 0x09, 0x94, 0xb3, 0x62, 0xc5, 0xd2, 0x2b, 0x4a, 0x70, 0xed, 0xdf, + 0x72, 0x70, 0x9e, 0x72, 0xb8, 0xae, 0x1b, 0x04, 0x7a, 0x94, 0x40, 0x9a, 0x9e, 0x4c, 0x2f, 0xc1, + 0xf4, 0xd1, 0xe3, 0xa9, 0xeb, 0x19, 0x3a, 0x21, 0x80, 0x52, 0x83, 0x70, 0x44, 0xa3, 0xff, 0x93, + 0x2b, 0x00, 0x52, 0x0a, 0xf1, 0x3c, 0xc6, 0x1f, 0xce, 0xad, 0x29, 0xe6, 0x6c, 0x3f, 0x4c, 0x14, + 0xfe, 0x32, 0x4c, 0xa1, 0x4e, 0x8b, 0x9f, 0xdf, 0xe2, 0xde, 0x95, 0xdd, 0x3a, 0xd4, 0x78, 0x99, + 0xac, 0x02, 0xf9, 0x28, 0x40, 0x94, 0xba, 0x85, 0x1f, 0xd0, 0x42, 0xd7, 0x13, 0x66, 0x6f, 0x31, + 0x67, 0x8f, 0x0f, 0x1c, 0x9e, 0x0f, 0xa5, 0x04, 0xcb, 0x62, 0xc4, 0xfb, 0x22, 0x6c, 0x29, 0x7f, + 0x49, 0x5e, 0x62, 0x05, 0x95, 0xbe, 0x08, 0x5d, 0x7a, 0x2d, 0x95, 0x41, 0x1d, 0xa3, 0x97, 0x27, + 0xd2, 0xa4, 0x5f, 0x4b, 0xa5, 0x49, 0x2f, 0x32, 0x2c, 0x39, 0x17, 0xba, 0xf6, 0x4f, 0x39, 0x98, + 0xbd, 0x47, 0x25, 0x63, 0xd4, 0xf7, 0x4c, 0xd6, 0x1f, 0xdd, 0x86, 0xb9, 0xaa, 0xef, 0xf0, 0x27, + 0x3b, 0xee, 0xbf, 0xc5, 0x82, 0x2e, 0x74, 0x7d, 0x47, 0xbc, 0xfe, 0x05, 0xa6, 0x8c, 0xf4, 0x88, + 0x80, 0x11, 0x77, 0x60, 0x9a, 0x3d, 0xa1, 0x72, 0x55, 0xa6, 0xb8, 0x1b, 0x85, 0x2d, 0x7a, 0x8e, + 0x15, 0x4b, 0xaf, 0x4c, 0xec, 0x19, 0x56, 0x16, 0xd4, 0x79, 0x10, 0x66, 0x49, 0xbb, 0x35, 0x75, + 0x3a, 0xed, 0x96, 0x14, 0x6c, 0x72, 0xfa, 0x34, 0xc1, 0x26, 0xd7, 0x5f, 0x81, 0x39, 0xa9, 0x3d, + 0x8f, 0x75, 0x55, 0xfa, 0x7a, 0x0e, 0x16, 0xb0, 0x57, 0xe1, 0xe1, 0xf8, 0x8b, 0xa9, 0xab, 0x7b, + 0x35, 0xa6, 0xab, 0x5b, 0x93, 0xe7, 0x8b, 0xf5, 0x6c, 0x82, 0x92, 0xee, 0x0e, 0x2c, 0xa7, 0x10, + 0xc9, 0x8b, 0x30, 0x45, 0x9b, 0x2f, 0x74, 0x1b, 0x6a, 0x72, 0x05, 0x44, 0x81, 0xc9, 0x69, 0xc7, + 0x03, 0x93, 0x61, 0x6b, 0xff, 0xa9, 0xc0, 0x3c, 0xcf, 0x0b, 0xd4, 0x3b, 0xf0, 0x1f, 0x39, 0x9c, + 0xd7, 0x93, 0xc3, 0xc9, 0xc2, 0x1f, 0xf1, 0xe1, 0xfc, 0xdf, 0x1e, 0xc4, 0x57, 0x62, 0x83, 0xb8, + 0x1a, 0x86, 0x29, 0x15, 0xdd, 0x99, 0x30, 0x86, 0xdf, 0xc3, 0xc0, 0xdd, 0x71, 0x44, 0xf2, 0x05, + 0x98, 0xad, 0xbb, 0x0f, 0x63, 0x2a, 0x82, 0xeb, 0x63, 0x88, 0x3e, 0x17, 0x22, 0xb2, 0x3d, 0x85, + 0x27, 0x7b, 0xcf, 0x7d, 0x68, 0xa7, 0x5e, 0x6f, 0x23, 0x92, 0xeb, 0x9f, 0x80, 0xc5, 0x78, 0xb5, + 0xc7, 0x59, 0xfa, 0xdc, 0x99, 0x1c, 0x23, 0x7a, 0x7d, 0x33, 0x0f, 0x10, 0xf9, 0xe1, 0xd2, 0x0d, + 0x18, 0x33, 0x5c, 0x11, 0xaf, 0x2b, 0x08, 0x92, 0xd7, 0xb8, 0xb0, 0x67, 0xb9, 0xce, 0x5f, 0x01, + 0x72, 0xe3, 0xc3, 0xc8, 0xe2, 0x7b, 0x40, 0x99, 0x3b, 0x7e, 0x76, 0xdc, 0xae, 0xc3, 0x78, 0x7b, + 0x7e, 0xf3, 0x1a, 0x46, 0x0d, 0x0f, 0xa1, 0x63, 0xf2, 0xc1, 0xa3, 0x7b, 0xe8, 0x16, 0x45, 0x48, + 0xf9, 0xb6, 0x17, 0x1e, 0xcf, 0xb7, 0xbd, 0x09, 0xb3, 0x5e, 0xef, 0x2d, 0xb7, 0x37, 0xf4, 0x07, + 0x27, 0xf8, 0xf4, 0x11, 0xe9, 0x54, 0xe9, 0x10, 0x54, 0x44, 0x19, 0x9b, 0x07, 0x3c, 0x73, 0x43, + 0x7c, 0x79, 0x1a, 0x42, 0x60, 0xe8, 0x9b, 0x3f, 0xa5, 0x4e, 0xdf, 0x29, 0x14, 0xa7, 0xd5, 0x99, + 0x3b, 0x85, 0x62, 0x51, 0x9d, 0xbd, 0x53, 0x28, 0xce, 0xaa, 0x60, 0x4a, 0xef, 0x96, 0xe1, 0xbb, + 0xa4, 0xf4, 0x94, 0x18, 0x7f, 0x26, 0xd4, 0x7e, 0x96, 0x03, 0x92, 0x6e, 0x06, 0x79, 0x15, 0xe6, + 0x18, 0x83, 0xb5, 0x07, 0xc1, 0x97, 0xb9, 0x33, 0x0e, 0x8b, 0x8b, 0x26, 0x81, 0xe5, 0xb8, 0x68, + 0x0c, 0x6c, 0x06, 0x5f, 0xee, 0x92, 0xcf, 0xc3, 0x59, 0x1c, 0xde, 0xbe, 0x3b, 0xf0, 0xfc, 0x8e, + 0x8d, 0x41, 0xac, 0x9d, 0x2e, 0xcf, 0xdd, 0xfa, 0x2c, 0x26, 0x19, 0x4f, 0x17, 0x8f, 0x99, 0x06, + 0x74, 0xb7, 0x6d, 0x22, 0x66, 0x93, 0x21, 0x92, 0x16, 0xa8, 0x72, 0xfd, 0x83, 0x51, 0xb7, 0xcb, + 0x67, 0xb6, 0xf4, 0xd3, 0x77, 0x37, 0xd6, 0x93, 0x65, 0x63, 0x08, 0x2f, 0x46, 0x84, 0xb7, 0x47, + 0xdd, 0x2e, 0x79, 0x09, 0xc0, 0xef, 0xd9, 0xc7, 0x5e, 0x10, 0xb0, 0x07, 0xb5, 0x30, 0x32, 0x40, + 0x04, 0x95, 0x27, 0xc3, 0xef, 0xd5, 0x18, 0x90, 0xfc, 0x0a, 0x60, 0x38, 0x15, 0x8c, 0x33, 0xc4, + 0x2c, 0xc2, 0x78, 0x7a, 0x25, 0x01, 0x8c, 0x07, 0x22, 0x38, 0x74, 0x2d, 0xef, 0xab, 0xc2, 0x11, + 0xea, 0xb3, 0xb0, 0xcc, 0x6d, 0xd6, 0xef, 0x79, 0xc3, 0x23, 0x7e, 0x9d, 0x7b, 0x3f, 0x77, 0x41, + 0xe9, 0x2e, 0xf6, 0x77, 0x05, 0x00, 0xfd, 0x9e, 0x25, 0x42, 0xf8, 0xdd, 0x84, 0x29, 0x7a, 0x49, + 0x15, 0xca, 0x2e, 0x7c, 0x2a, 0x40, 0xba, 0xf2, 0x53, 0x01, 0x62, 0xd0, 0xdd, 0x68, 0xa2, 0xcb, + 0x89, 0x50, 0x74, 0xe1, 0x6e, 0x64, 0x5e, 0x28, 0xb1, 0x10, 0xea, 0x1c, 0x8b, 0x54, 0x01, 0xa2, + 0xa0, 0x7a, 0x5c, 0xe4, 0x5f, 0x8e, 0xa2, 0x53, 0xf1, 0x02, 0x9e, 0xc6, 0x25, 0x0a, 0xcc, 0x27, + 0x2f, 0x9f, 0x08, 0x8d, 0xdc, 0x85, 0x42, 0xcb, 0x09, 0xfd, 0xde, 0xc7, 0x84, 0x1a, 0x7c, 0x92, + 0xe7, 0xd6, 0x8d, 0xc2, 0x0d, 0x2e, 0x0e, 0x9d, 0x58, 0x0a, 0x72, 0x24, 0x42, 0x0c, 0x98, 0x6e, + 0x3a, 0x03, 0xe7, 0x38, 0x18, 0x17, 0xa2, 0x96, 0x95, 0x8a, 0xc0, 0xf4, 0x08, 0x94, 0x65, 0x0a, + 0x56, 0x4c, 0x6e, 0x43, 0xde, 0xb2, 0x6a, 0x3c, 0xc0, 0xce, 0x42, 0x74, 0xfd, 0xb2, 0xac, 0x1a, + 0x7b, 0x7b, 0x0f, 0x82, 0x63, 0xa9, 0x1a, 0x45, 0x26, 0x1f, 0x87, 0x39, 0x49, 0x28, 0xe6, 0xa1, + 0xa9, 0x70, 0x0c, 0x24, 0xcf, 0x42, 0x99, 0x69, 0x48, 0xd8, 0xa4, 0x0a, 0xea, 0xdd, 0xd1, 0x03, + 0x57, 0xef, 0xf7, 0xd1, 0xe5, 0xf8, 0x2d, 0x77, 0xc0, 0xc4, 0xb6, 0x62, 0x14, 0xd3, 0x1d, 0x3d, + 0x88, 0x3a, 0xa2, 0x54, 0x56, 0xf8, 0x25, 0x6b, 0x92, 0x26, 0x2c, 0x5b, 0xee, 0x70, 0xd4, 0x67, + 0x36, 0x4e, 0xdb, 0xfe, 0x80, 0xde, 0x6f, 0x58, 0x20, 0x2b, 0x0c, 0x7f, 0x1d, 0xd0, 0x42, 0x61, + 0x58, 0x76, 0xe0, 0x0f, 0x12, 0x77, 0x9d, 0x74, 0x65, 0xcd, 0x95, 0xa7, 0x9c, 0x9e, 0xaa, 0xf1, + 0x5b, 0x13, 0x9e, 0xaa, 0xe2, 0xd6, 0x14, 0xdd, 0x95, 0x3e, 0x9a, 0x11, 0x6c, 0x11, 0x5f, 0x67, + 0xa5, 0x60, 0x8b, 0xb1, 0x10, 0x8b, 0xef, 0x14, 0xa4, 0x78, 0xbf, 0x7c, 0x2e, 0x5e, 0x03, 0xb8, + 0xe3, 0x7b, 0xbd, 0x9a, 0x3b, 0x3c, 0xf2, 0x3b, 0x52, 0xcc, 0xc7, 0xb9, 0x2f, 0xf9, 0x5e, 0xcf, + 0x3e, 0x46, 0xf0, 0xcf, 0xde, 0xdd, 0x90, 0x90, 0x4c, 0xe9, 0x7f, 0xf2, 0x0c, 0xcc, 0xd2, 0x5f, + 0xad, 0xc8, 0x52, 0x8b, 0xe9, 0xc5, 0xb1, 0x36, 0xcb, 0x8a, 0x13, 0x21, 0x90, 0x57, 0x30, 0x0f, + 0x94, 0xd7, 0x1f, 0x4a, 0xc2, 0xab, 0x48, 0xfa, 0xe4, 0xf5, 0x87, 0xc9, 0x10, 0xee, 0x12, 0x32, + 0xd9, 0x0d, 0x9b, 0x2e, 0x52, 0xb7, 0xf1, 0x74, 0x53, 0xa8, 0xfc, 0xe5, 0x6b, 0xcd, 0x16, 0xb1, + 0xa3, 0xe5, 0x9c, 0xdc, 0x89, 0x6a, 0xd8, 0x08, 0x6b, 0x77, 0x8b, 0xbd, 0xd6, 0x71, 0xa1, 0x96, + 0x35, 0x22, 0x38, 0xea, 0xd8, 0x6d, 0x04, 0xc7, 0x1a, 0x11, 0x22, 0x93, 0x4d, 0x58, 0x62, 0x32, + 0x7e, 0x98, 0x02, 0x96, 0x8b, 0xb8, 0xc8, 0xdb, 0xa2, 0x1c, 0xb1, 0xf2, 0xe7, 0x13, 0x15, 0xc8, + 0x36, 0x4c, 0xe1, 0x5d, 0x93, 0x7b, 0xa4, 0x5c, 0x90, 0xd5, 0x04, 0xc9, 0x7d, 0x84, 0x7c, 0x05, + 0x15, 0x04, 0x32, 0x5f, 0x41, 0x54, 0xf2, 0x19, 0x00, 0xa3, 0x37, 0xf0, 0xbb, 0x5d, 0x8c, 0x6e, + 0x5e, 0x8c, 0xb9, 0x90, 0x72, 0x3a, 0x48, 0x25, 0x42, 0xe2, 0x91, 0x38, 0xf1, 0xb7, 0x9d, 0x88, + 0x81, 0x2e, 0xd1, 0xd2, 0x2a, 0x30, 0xcd, 0x36, 0x23, 0x66, 0x0a, 0xe0, 0xb9, 0x8f, 0xa4, 0x38, + 0xf3, 0x2c, 0x53, 0x00, 0x87, 0xa7, 0x33, 0x05, 0x48, 0x15, 0xb4, 0xbb, 0xb0, 0x92, 0xd5, 0xb1, + 0xd8, 0xed, 0x58, 0x39, 0xed, 0xed, 0xf8, 0xbb, 0x79, 0x98, 0x47, 0x6a, 0x82, 0x0b, 0xeb, 0xb0, + 0x60, 0x8d, 0x1e, 0x84, 0x61, 0xf4, 0x04, 0x37, 0xc6, 0xf6, 0x05, 0x72, 0x81, 0xfc, 0x8e, 0x1a, + 0xab, 0x41, 0x0c, 0x58, 0x14, 0x27, 0xc1, 0x8e, 0xf0, 0xde, 0x08, 0x83, 0xf4, 0x0b, 0xa7, 0x96, + 0x74, 0x0a, 0xec, 0x44, 0xa5, 0xe8, 0x3c, 0xc8, 0x3f, 0xce, 0x79, 0x50, 0x38, 0xd5, 0x79, 0xf0, + 0x06, 0xcc, 0x8b, 0xaf, 0x21, 0x27, 0x9f, 0x7a, 0x7f, 0x9c, 0x3c, 0x46, 0x8c, 0x54, 0x43, 0x8e, + 0x3e, 0x3d, 0x91, 0xa3, 0xe3, 0xe3, 0xb4, 0xd8, 0x65, 0x7d, 0x84, 0xa5, 0x19, 0x3b, 0xe6, 0x88, + 0xdd, 0x29, 0x37, 0x7f, 0x8e, 0x53, 0xf2, 0x45, 0x98, 0xad, 0xfa, 0xe2, 0x5d, 0x52, 0x7a, 0x10, + 0xea, 0x0a, 0xa0, 0x2c, 0x2e, 0x84, 0x98, 0xe1, 0xe9, 0x96, 0xff, 0x20, 0x4e, 0xb7, 0x57, 0x00, + 0xb8, 0x5b, 0x50, 0x94, 0xdb, 0x11, 0xb7, 0x8c, 0x88, 0x06, 0x14, 0x7f, 0x97, 0x92, 0x90, 0x29, + 0x77, 0xe2, 0x26, 0x4f, 0x7a, 0xbb, 0xed, 0x8f, 0x7a, 0xc3, 0x58, 0x32, 0x74, 0xe1, 0x2d, 0xee, + 0xf0, 0x32, 0x99, 0x3d, 0x24, 0xaa, 0x7d, 0xb0, 0x13, 0x42, 0x3e, 0x1d, 0x1a, 0xa0, 0xce, 0x4c, + 0x1a, 0x21, 0x2d, 0x35, 0x42, 0x63, 0xcd, 0x4e, 0xb5, 0x1f, 0x2a, 0x72, 0x86, 0x94, 0x9f, 0x63, + 0xaa, 0x5f, 0x06, 0x08, 0x0d, 0x43, 0xc4, 0x5c, 0xb3, 0xfb, 0x52, 0x08, 0x95, 0x47, 0x39, 0xc2, + 0x95, 0x7a, 0x93, 0xff, 0xa0, 0x7a, 0xd3, 0x82, 0xb9, 0xc6, 0x9b, 0x43, 0x27, 0xb2, 0x24, 0x02, + 0x2b, 0x94, 0x64, 0x91, 0x33, 0xe5, 0x37, 0x9f, 0xc2, 0xb3, 0x21, 0x92, 0x83, 0xc7, 0x88, 0xc0, + 0x52, 0x45, 0xed, 0xbf, 0x15, 0x58, 0x92, 0x43, 0x5c, 0x9c, 0xf4, 0xda, 0xe4, 0x93, 0x2c, 0x60, + 0xb3, 0x12, 0xbb, 0xb2, 0x48, 0x48, 0x94, 0xe5, 0x9e, 0xf4, 0xda, 0x4c, 0x00, 0x72, 0x1e, 0xca, + 0x8d, 0xa5, 0x15, 0xc9, 0x03, 0x98, 0x6f, 0xfa, 0xdd, 0x2e, 0x15, 0x6b, 0x06, 0x6f, 0xf1, 0x0b, + 0x00, 0x25, 0x94, 0xd4, 0xb1, 0x8b, 0x06, 0x6d, 0x5e, 0xe5, 0xf7, 0xdc, 0xd5, 0x3e, 0xe5, 0xf7, + 0x1e, 0xaf, 0x17, 0x91, 0x7d, 0x1b, 0xdd, 0x33, 0x65, 0x9a, 0xd1, 0xd9, 0x14, 0xcf, 0xf4, 0x21, + 0xb7, 0x92, 0x16, 0x63, 0x3b, 0x27, 0x9c, 0x4d, 0xda, 0x8f, 0x15, 0x20, 0xe9, 0xae, 0xc9, 0xac, + 0x4f, 0xf9, 0x3f, 0x10, 0x85, 0x13, 0x22, 0x64, 0xe1, 0x71, 0x44, 0x48, 0xed, 0x3b, 0x0a, 0xac, + 0x64, 0x8d, 0x03, 0x3d, 0x41, 0xe4, 0x23, 0x25, 0x3c, 0xd0, 0xf0, 0x04, 0x91, 0x4f, 0xa1, 0xf8, + 0xb1, 0x96, 0xa8, 0x94, 0x6c, 0x5c, 0xee, 0x71, 0x1a, 0x57, 0xfa, 0x1d, 0x05, 0x96, 0x2a, 0x7a, + 0x8d, 0x27, 0x86, 0x61, 0x4f, 0x85, 0x57, 0xe0, 0x52, 0x45, 0xaf, 0xd9, 0xcd, 0x46, 0xb5, 0x52, + 0xbe, 0x6f, 0x67, 0xc6, 0x7b, 0xbf, 0x04, 0x4f, 0xa4, 0x51, 0xa2, 0x27, 0xc5, 0x8b, 0xb0, 0x96, + 0x2e, 0x16, 0x31, 0xe1, 0xb3, 0x2b, 0x8b, 0xf0, 0xf1, 0xf9, 0xd2, 0xeb, 0xb0, 0x24, 0xe2, 0x9f, + 0xb7, 0xaa, 0x16, 0x66, 0x58, 0x59, 0x82, 0xb9, 0x7d, 0xc3, 0xac, 0x6c, 0xdf, 0xb7, 0xb7, 0xf7, + 0xaa, 0x55, 0xf5, 0x0c, 0x59, 0x80, 0x59, 0x0e, 0x28, 0xeb, 0xaa, 0x42, 0xe6, 0xa1, 0x58, 0xa9, + 0x5b, 0x46, 0x79, 0xcf, 0x34, 0xd4, 0x5c, 0xe9, 0x75, 0x58, 0x6c, 0x0e, 0xbc, 0xb7, 0x9c, 0xa1, + 0x7b, 0xd7, 0x3d, 0xc1, 0x17, 0xc1, 0x19, 0xc8, 0x9b, 0xfa, 0x3d, 0xf5, 0x0c, 0x01, 0x98, 0x6e, + 0xde, 0x2d, 0x5b, 0xb7, 0x6e, 0xa9, 0x0a, 0x99, 0x83, 0x99, 0x9d, 0x72, 0xd3, 0xbe, 0x5b, 0xb3, + 0xd4, 0x1c, 0xfd, 0xa1, 0xdf, 0xb3, 0xf0, 0x47, 0xbe, 0xf4, 0x3c, 0x2c, 0xa3, 0xd4, 0x55, 0xf5, + 0x82, 0xa1, 0xdb, 0x73, 0x07, 0xd8, 0x86, 0x79, 0x28, 0x5a, 0x2e, 0x65, 0x97, 0x43, 0x97, 0x35, + 0xa0, 0x36, 0xea, 0x0e, 0xbd, 0x7e, 0xd7, 0xfd, 0x8a, 0xaa, 0x94, 0x5e, 0x81, 0x25, 0xd3, 0x1f, + 0x0d, 0xbd, 0xde, 0xa1, 0x35, 0xa4, 0x18, 0x87, 0x27, 0xe4, 0x1c, 0x2c, 0xef, 0xd5, 0xf5, 0xda, + 0x66, 0x65, 0x67, 0xaf, 0xb1, 0x67, 0xd9, 0x35, 0xbd, 0x55, 0xde, 0x65, 0xef, 0x91, 0xb5, 0x86, + 0xd5, 0xb2, 0x4d, 0xa3, 0x6c, 0xd4, 0x5b, 0xaa, 0x52, 0xfa, 0x36, 0x2a, 0x90, 0xda, 0x7e, 0xaf, + 0xb3, 0xed, 0xb4, 0x87, 0xfe, 0x00, 0x1b, 0xac, 0xc1, 0x65, 0xcb, 0x28, 0x37, 0xea, 0x5b, 0xf6, + 0xb6, 0x5e, 0x6e, 0x35, 0xcc, 0xac, 0x84, 0x03, 0xeb, 0x70, 0x3e, 0x03, 0xa7, 0xd1, 0x6a, 0xaa, + 0x0a, 0xd9, 0x80, 0x0b, 0x19, 0x65, 0xf7, 0x8c, 0x4d, 0x7d, 0xaf, 0xb5, 0x5b, 0x57, 0x73, 0x63, + 0x2a, 0x5b, 0x56, 0x43, 0xcd, 0x97, 0x7e, 0x43, 0x81, 0x45, 0x7c, 0x1e, 0xa3, 0x92, 0xf7, 0x1e, + 0x7a, 0x72, 0x3f, 0x09, 0x17, 0xf7, 0x2c, 0xc3, 0xb4, 0x5b, 0x8d, 0xbb, 0x46, 0xdd, 0xde, 0xb3, + 0xf4, 0x9d, 0x64, 0x6b, 0x36, 0xe0, 0x82, 0x84, 0x61, 0x1a, 0xe5, 0xc6, 0xbe, 0x61, 0xda, 0x4d, + 0xdd, 0xb2, 0xee, 0x35, 0xcc, 0x2d, 0x55, 0xa1, 0x5f, 0xcc, 0x40, 0xa8, 0x6d, 0xeb, 0xac, 0x35, + 0xb1, 0xb2, 0xba, 0x71, 0x4f, 0xaf, 0xda, 0x9b, 0x8d, 0x96, 0x9a, 0x2f, 0xd5, 0xa8, 0x10, 0x83, + 0x61, 0xbf, 0x99, 0x09, 0x6b, 0x11, 0x0a, 0xf5, 0x46, 0xdd, 0x48, 0xbe, 0x62, 0xcf, 0x43, 0x51, + 0x6f, 0x36, 0xcd, 0xc6, 0x3e, 0x2e, 0x31, 0x80, 0xe9, 0x2d, 0xa3, 0x4e, 0x5b, 0x96, 0xa7, 0x25, + 0x4d, 0xb3, 0x51, 0x6b, 0xb4, 0x8c, 0x2d, 0xb5, 0x50, 0x32, 0x05, 0x7f, 0x11, 0x44, 0xdb, 0x3e, + 0x7b, 0x32, 0xde, 0x32, 0xb6, 0xf5, 0xbd, 0x6a, 0x8b, 0x4f, 0xd1, 0x7d, 0xdb, 0x34, 0x3e, 0xbd, + 0x67, 0x58, 0x2d, 0x4b, 0x55, 0x88, 0x0a, 0xf3, 0x75, 0xc3, 0xd8, 0xb2, 0x6c, 0xd3, 0xd8, 0xaf, + 0x18, 0xf7, 0xd4, 0x1c, 0xa5, 0xc9, 0xfe, 0xa7, 0x5f, 0x28, 0xbd, 0xa3, 0x00, 0x61, 0x21, 0xd3, + 0x45, 0x1e, 0x2e, 0x5c, 0x31, 0x97, 0x61, 0x7d, 0x97, 0x4e, 0x35, 0x76, 0xad, 0xd6, 0xd8, 0x4a, + 0x0e, 0xd9, 0x79, 0x20, 0x89, 0xf2, 0xc6, 0xf6, 0xb6, 0xaa, 0x90, 0x0b, 0x70, 0x36, 0x01, 0xdf, + 0x32, 0x1b, 0x4d, 0x35, 0xb7, 0x9e, 0x2b, 0x2a, 0x64, 0x35, 0x55, 0x78, 0xd7, 0x30, 0x9a, 0x6a, + 0x9e, 0x4e, 0x51, 0xa2, 0x40, 0x6c, 0x09, 0x56, 0xbd, 0x50, 0xfa, 0x86, 0x02, 0xe7, 0x59, 0x33, + 0xc5, 0xfe, 0x0a, 0x9b, 0x7a, 0x11, 0xd6, 0x78, 0x22, 0x88, 0xac, 0x86, 0xae, 0x80, 0x1a, 0x2b, + 0x65, 0xcd, 0x3c, 0x07, 0xcb, 0x31, 0x28, 0xb6, 0x23, 0x47, 0xb9, 0x47, 0x0c, 0xbc, 0x69, 0x58, + 0x2d, 0xdb, 0xd8, 0xde, 0x6e, 0x98, 0x2d, 0xd6, 0x90, 0x7c, 0x49, 0x83, 0xe5, 0xb2, 0x3b, 0x18, + 0xd2, 0xfb, 0x65, 0x2f, 0xf0, 0xfc, 0x1e, 0x36, 0x61, 0x01, 0x66, 0x8d, 0xcf, 0xb4, 0x8c, 0xba, + 0x55, 0x69, 0xd4, 0xd5, 0x33, 0xa5, 0x8b, 0x09, 0x1c, 0xb1, 0x8f, 0x2d, 0x6b, 0x57, 0x3d, 0x53, + 0x72, 0x60, 0x41, 0x58, 0xf8, 0xb3, 0x55, 0x71, 0x19, 0xd6, 0xc5, 0x5a, 0x43, 0x8e, 0x92, 0xec, + 0xc2, 0x1a, 0xac, 0xa4, 0xcb, 0x8d, 0x96, 0xaa, 0xd0, 0x59, 0x48, 0x94, 0x50, 0x78, 0xae, 0xf4, + 0xeb, 0x0a, 0x2c, 0x84, 0x2f, 0x43, 0xa8, 0x8b, 0xde, 0x80, 0x0b, 0xb5, 0x6d, 0xdd, 0xde, 0x32, + 0xf6, 0x2b, 0x65, 0xc3, 0xbe, 0x5b, 0xa9, 0x6f, 0x25, 0x3e, 0xf2, 0x04, 0x9c, 0xcb, 0x40, 0xc0, + 0xaf, 0xac, 0xc1, 0x4a, 0xb2, 0xa8, 0x45, 0xb7, 0x6a, 0x8e, 0x0e, 0x7d, 0xb2, 0x24, 0xdc, 0xa7, + 0xf9, 0xd2, 0x3e, 0x2c, 0x5a, 0x7a, 0xad, 0xba, 0xed, 0x0f, 0xda, 0xae, 0x3e, 0x1a, 0x1e, 0xf5, + 0xc8, 0x05, 0x58, 0xdd, 0x6e, 0x98, 0x65, 0xc3, 0x46, 0x94, 0x44, 0x0b, 0xce, 0xc2, 0x92, 0x5c, + 0x78, 0xdf, 0xa0, 0xcb, 0x97, 0xc0, 0xa2, 0x0c, 0xac, 0x37, 0xd4, 0x5c, 0xe9, 0x73, 0x30, 0x1f, + 0x4b, 0xc7, 0xb9, 0x0a, 0x67, 0xe5, 0xdf, 0xfc, 0x91, 0x5c, 0x3d, 0x93, 0x2c, 0x30, 0x47, 0xbd, + 0x1e, 0x2d, 0xc0, 0xfd, 0x2c, 0x17, 0xb4, 0xdc, 0xc1, 0xb1, 0xd7, 0x73, 0x86, 0x6e, 0x47, 0xcd, + 0x95, 0x9e, 0x83, 0x85, 0x58, 0x12, 0x00, 0x3a, 0x71, 0xd5, 0x06, 0x67, 0xc0, 0x35, 0x63, 0xab, + 0xb2, 0x57, 0x53, 0xa7, 0xe8, 0x4e, 0xde, 0xad, 0xec, 0xec, 0xaa, 0x50, 0xfa, 0x3d, 0x85, 0x5e, + 0xa6, 0x30, 0xb5, 0x57, 0x6d, 0x5b, 0x17, 0x53, 0x4d, 0x97, 0x19, 0x4b, 0x2d, 0x62, 0x58, 0x16, + 0x33, 0xde, 0xb8, 0x08, 0x6b, 0xfc, 0x87, 0xad, 0xd7, 0xb7, 0xec, 0x5d, 0xdd, 0xdc, 0xba, 0xa7, + 0x9b, 0x74, 0xed, 0xdd, 0x57, 0x73, 0xb8, 0xa1, 0x24, 0x88, 0xdd, 0x6a, 0xec, 0x95, 0x77, 0xd5, + 0x3c, 0x5d, 0xbf, 0x31, 0x78, 0xb3, 0x52, 0x57, 0x0b, 0xb8, 0x3d, 0x53, 0xd8, 0x48, 0x96, 0x96, + 0x4f, 0x95, 0xde, 0x53, 0x60, 0xd5, 0xf2, 0x0e, 0x7b, 0xce, 0x70, 0x34, 0x70, 0xf5, 0xee, 0xa1, + 0x3f, 0xf0, 0x86, 0x47, 0xc7, 0xd6, 0xc8, 0x1b, 0xba, 0xe4, 0x26, 0x3c, 0x65, 0x55, 0x76, 0xea, + 0x7a, 0x8b, 0x6e, 0x2f, 0xbd, 0xba, 0xd3, 0x30, 0x2b, 0xad, 0xdd, 0x9a, 0x6d, 0xed, 0x55, 0x52, + 0x2b, 0xef, 0x1a, 0x3c, 0x39, 0x1e, 0xb5, 0x6a, 0xec, 0xe8, 0xe5, 0xfb, 0xaa, 0x32, 0x99, 0xe0, + 0xa6, 0x5e, 0xd5, 0xeb, 0x65, 0x63, 0xcb, 0xde, 0xbf, 0xa5, 0xe6, 0xc8, 0x53, 0x70, 0x65, 0x3c, + 0xea, 0x76, 0xa5, 0x69, 0x51, 0xb4, 0xfc, 0xe4, 0xef, 0xee, 0x5a, 0x35, 0x8a, 0x55, 0x28, 0x7d, + 0x47, 0x81, 0xb5, 0x71, 0x41, 0xdd, 0xc8, 0x75, 0xd0, 0x8c, 0x7a, 0xcb, 0xd4, 0x2b, 0x5b, 0x76, + 0xd9, 0x34, 0xb6, 0x8c, 0x7a, 0xab, 0xa2, 0x57, 0x2d, 0xdb, 0x6a, 0xec, 0xd1, 0xd5, 0x14, 0xd9, + 0xd8, 0x5c, 0x85, 0x8d, 0x09, 0x78, 0x8d, 0xca, 0x56, 0x59, 0x55, 0xc8, 0x2d, 0x78, 0x76, 0x02, + 0x92, 0x75, 0xdf, 0x6a, 0x19, 0x35, 0xb9, 0x44, 0xcd, 0x21, 0xc3, 0xca, 0x8e, 0x69, 0x45, 0x7b, + 0x87, 0x25, 0x93, 0x1b, 0x76, 0x05, 0x2e, 0x8d, 0xc5, 0xe2, 0xcd, 0xba, 0x0a, 0x1b, 0x63, 0x51, + 0x58, 0xa3, 0xd4, 0x5c, 0xa9, 0x0c, 0xeb, 0xe3, 0x03, 0x46, 0xd1, 0xf3, 0x22, 0x3e, 0xe5, 0x45, + 0x28, 0x6c, 0xd1, 0x23, 0x2a, 0x96, 0x0a, 0xa7, 0xe4, 0x81, 0x9a, 0x0c, 0xa6, 0x92, 0xb2, 0xca, + 0x32, 0xf7, 0xea, 0x75, 0x76, 0x9e, 0x2d, 0xc1, 0x5c, 0xa3, 0xb5, 0x6b, 0x98, 0x3c, 0x99, 0x10, + 0x66, 0x0f, 0xda, 0xab, 0xd3, 0x1d, 0xdc, 0x30, 0x2b, 0x9f, 0xc5, 0x83, 0x6d, 0x0d, 0x56, 0xac, + 0xaa, 0x5e, 0xbe, 0x6b, 0xd7, 0x1b, 0x2d, 0xbb, 0x52, 0xb7, 0xcb, 0xbb, 0x7a, 0xbd, 0x6e, 0x54, + 0x55, 0xc0, 0x59, 0x1d, 0xe7, 0x4d, 0x4c, 0x9e, 0x81, 0x1b, 0x8d, 0xbb, 0x2d, 0xdd, 0x6e, 0x56, + 0xf7, 0x76, 0x2a, 0x75, 0xdb, 0xba, 0x5f, 0x2f, 0x0b, 0x21, 0xac, 0x9c, 0xe6, 0xfd, 0x37, 0xe0, + 0xda, 0x44, 0xec, 0x28, 0xed, 0xcf, 0x75, 0xd0, 0x26, 0x62, 0xf2, 0x8e, 0x94, 0x7e, 0xa4, 0xc0, + 0x85, 0x09, 0x2f, 0xf6, 0xe4, 0x59, 0xb8, 0xb9, 0x6b, 0xe8, 0x5b, 0x55, 0xc3, 0xb2, 0x90, 0x63, + 0xd1, 0x49, 0x61, 0xd6, 0x5b, 0x99, 0x9c, 0xfd, 0x26, 0x3c, 0x35, 0x19, 0x3d, 0x92, 0x11, 0x6e, + 0xc0, 0xb5, 0xc9, 0xa8, 0x5c, 0x66, 0xc8, 0x91, 0x12, 0x5c, 0x9f, 0x8c, 0x19, 0xca, 0x1a, 0xf9, + 0xd2, 0x6f, 0x29, 0x70, 0x3e, 0x5b, 0x6d, 0x46, 0xdb, 0x56, 0xa9, 0x5b, 0x2d, 0xbd, 0x5a, 0xb5, + 0x9b, 0xba, 0xa9, 0xd7, 0x6c, 0xa3, 0x6e, 0x36, 0xaa, 0xd5, 0xac, 0x33, 0xf6, 0x1a, 0x3c, 0x39, + 0x1e, 0xd5, 0x2a, 0x9b, 0x95, 0x26, 0x3d, 0x46, 0x34, 0xb8, 0x3c, 0x1e, 0xcb, 0xa8, 0x94, 0x0d, + 0x35, 0xb7, 0xf9, 0xda, 0x0f, 0xfe, 0xf1, 0xf2, 0x99, 0x1f, 0xbc, 0x77, 0x59, 0xf9, 0xf1, 0x7b, + 0x97, 0x95, 0x7f, 0x78, 0xef, 0xb2, 0xf2, 0xd9, 0xa7, 0x4f, 0x97, 0x31, 0x0f, 0x6f, 0x47, 0x0f, + 0xa6, 0xf1, 0x3e, 0xf8, 0xc2, 0xff, 0x04, 0x00, 0x00, 0xff, 0xff, 0x4a, 0x71, 0xf4, 0xa3, 0xa1, + 0xc4, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -49392,6 +49447,16 @@ func (m *IntegrationV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x1a { size, err := m.Spec.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -49415,6 +49480,50 @@ func (m *IntegrationV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *IntegrationStatusV1) Marshal() (dAtA []byte, err error) { + size := m.Size() + dAtA = make([]byte, size) + n, err := m.MarshalToSizedBuffer(dAtA[:size]) + if err != nil { + return nil, err + } + return dAtA[:n], nil +} + +func (m *IntegrationStatusV1) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IntegrationStatusV1) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + _ = i + var l int + _ = l + if m.XXX_unrecognized != nil { + i -= len(m.XXX_unrecognized) + copy(dAtA[i:], m.XXX_unrecognized) + } + if m.PendingUserTasksNotificationExpires != nil { + n414, err414 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.PendingUserTasksNotificationExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.PendingUserTasksNotificationExpires):]) + if err414 != nil { + return 0, err414 + } + i -= n414 + i = encodeVarintTypes(dAtA, i, uint64(n414)) + i-- + dAtA[i] = 0x12 + } + if len(m.PendingUserTasksNotificationID) > 0 { + i -= len(m.PendingUserTasksNotificationID) + copy(dAtA[i:], m.PendingUserTasksNotificationID) + i = encodeVarintTypes(dAtA, i, uint64(len(m.PendingUserTasksNotificationID))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *IntegrationSpecV1) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -50826,12 +50935,12 @@ func (m *AccessGraphSync) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x1a } } - n435, err435 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) - if err435 != nil { - return 0, err435 + n437, err437 := github_com_gogo_protobuf_types.StdDurationMarshalTo(m.PollInterval, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdDuration(m.PollInterval):]) + if err437 != nil { + return 0, err437 } - i -= n435 - i = encodeVarintTypes(dAtA, i, uint64(n435)) + i -= n437 + i = encodeVarintTypes(dAtA, i, uint64(n437)) i-- dAtA[i] = 0x12 if len(m.AWS) > 0 { @@ -61736,6 +61845,28 @@ func (m *IntegrationV1) Size() (n int) { n += 1 + l + sovTypes(uint64(l)) l = m.Spec.Size() n += 1 + l + sovTypes(uint64(l)) + l = m.Status.Size() + n += 1 + l + sovTypes(uint64(l)) + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *IntegrationStatusV1) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PendingUserTasksNotificationID) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + if m.PendingUserTasksNotificationExpires != nil { + l = github_com_gogo_protobuf_types.SizeOfStdTime(*m.PendingUserTasksNotificationExpires) + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -131103,6 +131234,158 @@ func (m *IntegrationV1) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipTypes(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthTypes + } + if (iNdEx + skippy) > l { + return io.ErrUnexpectedEOF + } + m.XXX_unrecognized = append(m.XXX_unrecognized, dAtA[iNdEx:iNdEx+skippy]...) + iNdEx += skippy + } + } + + if iNdEx > l { + return io.ErrUnexpectedEOF + } + return nil +} +func (m *IntegrationStatusV1) Unmarshal(dAtA []byte) error { + l := len(dAtA) + iNdEx := 0 + for iNdEx < l { + preIndex := iNdEx + var wire uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + wire |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + fieldNum := int32(wire >> 3) + wireType := int(wire & 0x7) + if wireType == 4 { + return fmt.Errorf("proto: IntegrationStatusV1: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IntegrationStatusV1: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PendingUserTasksNotificationID", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + stringLen |= uint64(b&0x7F) << shift + if b < 0x80 { + break + } + } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.PendingUserTasksNotificationID = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PendingUserTasksNotificationExpires", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthTypes + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthTypes + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.PendingUserTasksNotificationExpires == nil { + m.PendingUserTasksNotificationExpires = new(time.Time) + } + if err := github_com_gogo_protobuf_types.StdTimeUnmarshal(m.PendingUserTasksNotificationExpires, dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/lib/auth/usertasks/usertasksv1/service.go b/lib/auth/usertasks/usertasksv1/service.go index 1c9f7eedcdb83..64c42cc0495ec 100644 --- a/lib/auth/usertasks/usertasksv1/service.go +++ b/lib/auth/usertasks/usertasksv1/service.go @@ -29,9 +29,11 @@ import ( "google.golang.org/protobuf/types/known/emptypb" "google.golang.org/protobuf/types/known/timestamppb" + notificationsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" usertasksv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" + "github.com/gravitational/teleport/api/types/notifications" "github.com/gravitational/teleport/api/types/usertasks" "github.com/gravitational/teleport/lib/authz" libevents "github.com/gravitational/teleport/lib/events" @@ -39,13 +41,25 @@ import ( usagereporter "github.com/gravitational/teleport/lib/usagereporter/teleport" ) +// BackendService contains the methods used to manage Resources. +type BackendService interface { + // CRUD methods for the UserTasks resources. + services.UserTasks + + // Methods required to notify the users of pending User Tasks. + CreateGlobalNotification(ctx context.Context, globalNotification *notificationsv1.GlobalNotification) (*notificationsv1.GlobalNotification, error) + DeleteGlobalNotification(ctx context.Context, notificationId string) error + UpdateIntegration(ctx context.Context, ig types.Integration) (types.Integration, error) + GetIntegration(ctx context.Context, name string) (types.Integration, error) +} + // ServiceConfig holds configuration options for the UserTask gRPC service. type ServiceConfig struct { // Authorizer is the authorizer to use. Authorizer authz.Authorizer - // Backend is the backend for storing UserTask. - Backend services.UserTasks + // Backend is the backend for storing resources. + Backend BackendService // Cache is the cache for storing UserTask. Cache Reader @@ -98,7 +112,7 @@ type Service struct { usertasksv1.UnimplementedUserTaskServiceServer authorizer authz.Authorizer - backend services.UserTasks + backend BackendService cache Reader clock clockwork.Clock usageReporter func() usagereporter.UsageReporter @@ -122,6 +136,7 @@ func NewService(cfg ServiceConfig) (*Service, error) { } // CreateUserTask creates user task resource. +// A global notification is created to ensure the user is aware of the pending user task. func (s *Service) CreateUserTask(ctx context.Context, req *usertasksv1.CreateUserTaskRequest) (*usertasksv1.UserTask, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { @@ -142,6 +157,10 @@ func (s *Service) CreateUserTask(ctx context.Context, req *usertasksv1.CreateUse s.usageReporter().AnonymizeAndSubmit(userTaskToUserTaskStateEvent(req.GetUserTask())) + if err := s.notifyUserAboutPendingTask(ctx, rsp); err != nil { + return nil, trace.Wrap(err) + } + return rsp, nil } @@ -251,6 +270,7 @@ func (s *Service) GetUserTask(ctx context.Context, req *usertasksv1.GetUserTaskR } // UpdateUserTask updates user task resource. +// If the UserTask state goes from Resolved to Open, a global notification is created to ensure the user is aware of the pending user task. func (s *Service) UpdateUserTask(ctx context.Context, req *usertasksv1.UpdateUserTaskRequest) (*usertasksv1.UserTask, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { @@ -279,6 +299,10 @@ func (s *Service) UpdateUserTask(ctx context.Context, req *usertasksv1.UpdateUse s.usageReporter().AnonymizeAndSubmit(userTaskToUserTaskStateEvent(req.GetUserTask())) } + if err := s.notifyUserAboutPendingTask(ctx, rsp); err != nil { + return nil, trace.Wrap(err) + } + return rsp, nil } @@ -309,6 +333,7 @@ func (s *Service) emitUpdateAuditEvent(ctx context.Context, old, new *usertasksv } // UpsertUserTask upserts user task resource. +// If the UserTask state goes from Resolved to Open, a global notification is created to ensure the user is aware of the pending user task. func (s *Service) UpsertUserTask(ctx context.Context, req *usertasksv1.UpsertUserTaskRequest) (*usertasksv1.UserTask, error) { authCtx, err := s.authorizer.Authorize(ctx) if err != nil { @@ -345,6 +370,10 @@ func (s *Service) UpsertUserTask(ctx context.Context, req *usertasksv1.UpsertUse s.usageReporter().AnonymizeAndSubmit(userTaskToUserTaskStateEvent(req.GetUserTask())) } + if err := s.notifyUserAboutPendingTask(ctx, rsp); err != nil { + return nil, trace.Wrap(err) + } + return rsp, nil } @@ -430,3 +459,55 @@ func getExpires(cj *timestamppb.Timestamp) time.Time { } return cj.AsTime() } + +// notifyUserAboutPendingTask creates a global notification that notifies the user about pending tasks. +// Only one notification per Integration is created. +// If a notification already exists, it will be deleted and re-created. +// When creating the notification, the longest lifespan of the existing and the new notification will be used. +func (s *Service) notifyUserAboutPendingTask(ctx context.Context, ut *usertasksv1.UserTask) error { + if ut.GetSpec().GetState() != usertasks.TaskStateOpen { + return nil + } + + integrationName := ut.GetSpec().GetIntegration() + expires := ut.GetMetadata().GetExpires().AsTime() + + integration, err := s.backend.GetIntegration(ctx, integrationName) + if err != nil { + return trace.Wrap(err) + } + integrationStatus := integration.GetStatus() + existingNotification := integrationStatus.PendingUserTasksNotificationID + if existingNotification != "" { + if err := s.backend.DeleteGlobalNotification(ctx, integrationStatus.PendingUserTasksNotificationID); err != nil { + // NotFound might be returned when the GlobalNotification already expired or was deleted. + if !trace.IsNotFound(err) { + return trace.Wrap(err) + } + } + + if integrationStatus.PendingUserTasksNotificationExpires != nil { + // Ensure we keep the longest lived notification. + if expires.Before(*integrationStatus.PendingUserTasksNotificationExpires) { + expires = *integrationStatus.PendingUserTasksNotificationExpires + } + } + } + + pendingUserTasksNotification := notifications.NewPendingUserTasksIntegrationNotification(integrationName, expires) + newNotification, err := s.backend.CreateGlobalNotification(ctx, pendingUserTasksNotification) + if err != nil { + return trace.Wrap(err) + } + + integration.SetStatus(types.IntegrationStatusV1{ + PendingUserTasksNotificationID: newNotification.GetMetadata().GetName(), + PendingUserTasksNotificationExpires: &expires, + }) + + if _, err := s.backend.UpdateIntegration(ctx, integration); err != nil { + return trace.Wrap(err) + } + + return nil +} diff --git a/lib/auth/usertasks/usertasksv1/service_test.go b/lib/auth/usertasks/usertasksv1/service_test.go index 1a909c278bdd8..f699b752b445f 100644 --- a/lib/auth/usertasks/usertasksv1/service_test.go +++ b/lib/auth/usertasks/usertasksv1/service_test.go @@ -27,11 +27,14 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" "google.golang.org/protobuf/types/known/timestamppb" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + notificationsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/notifications/v1" usertasksv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/usertasks/v1" "github.com/gravitational/teleport/api/types" apievents "github.com/gravitational/teleport/api/types/events" @@ -90,7 +93,8 @@ func TestServiceAccess(t *testing.T) { t.Run(tt.name, func(t *testing.T) { for _, verbs := range utils.Combinations(tt.allowedVerbs) { t.Run(fmt.Sprintf("verbs=%v", verbs), func(t *testing.T) { - service := newService(t, fakeChecker{allowedVerbs: verbs}, testReporter, &libevents.DiscardEmitter{}, clockwork.NewFakeClock()) + backendService := newMockBackendService(t) + service := newService(t, fakeChecker{allowedVerbs: verbs}, backendService, testReporter, &libevents.DiscardEmitter{}, clockwork.NewFakeClock()) err := callMethod(t, service, tt.name) // expect access denied except with full set of verbs. if len(verbs) == len(tt.allowedVerbs) { @@ -122,7 +126,8 @@ func TestEvents(t *testing.T) { testReporter := &mockUsageReporter{} auditEventsSink := eventstest.NewChannelEmitter(10) fakeClock := clockwork.NewFakeClock() - service := newService(t, fakeChecker{allowedVerbs: rwVerbs}, testReporter, auditEventsSink, fakeClock) + backendService := newMockBackendService(t) + service := newService(t, fakeChecker{allowedVerbs: rwVerbs}, backendService, testReporter, auditEventsSink, fakeClock) ctx := context.Background() ut1, err := usertasks.NewDiscoverEC2UserTask(&usertasksv1.UserTaskSpec{ @@ -320,15 +325,9 @@ func (f fakeChecker) CheckAccessToRule(_ services.RuleContext, _ string, resourc return trace.AccessDenied("access denied to rule=%v/verb=%v", resource, verb) } -func newService(t *testing.T, checker services.AccessChecker, usageReporter usagereporter.UsageReporter, emitter apievents.Emitter, clock clockwork.Clock) *Service { +func newService(t *testing.T, checker services.AccessChecker, backendService BackendService, usageReporter usagereporter.UsageReporter, emitter apievents.Emitter, clock clockwork.Clock) *Service { t.Helper() - b, err := memory.New(memory.Config{}) - require.NoError(t, err) - - backendService, err := local.NewUserTasksService(b) - require.NoError(t, err) - authorizer := authz.AuthorizerFunc(func(ctx context.Context) (*authz.Context, error) { user, err := types.NewUser("llama") if err != nil { @@ -368,3 +367,132 @@ func (m *mockUsageReporter) AnonymizeAndSubmit(events ...usagereporter.Anonymiza } } } + +func createDummyUserTask(t *testing.T, integration string) *usertasksv1.UserTask { + ut, err := usertasks.NewDiscoverEC2UserTask( + &usertasksv1.UserTaskSpec{ + Integration: integration, + TaskType: "discover-ec2", + IssueType: "ec2-ssm-invocation-failure", + State: "OPEN", + DiscoverEc2: &usertasksv1.DiscoverEC2{ + AccountId: "123456789012", + Region: "us-east-1", + Instances: map[string]*usertasksv1.DiscoverEC2Instance{ + "i-123": { + InstanceId: "i-123", + DiscoveryConfig: "dc01", + DiscoveryGroup: "dg01", + }, + }, + }, + }, + ) + require.NoError(t, err) + return ut +} + +func TestNotifications(t *testing.T) { + rwVerbs := []string{types.VerbList, types.VerbCreate, types.VerbRead, types.VerbUpdate, types.VerbDelete} + backendService := newMockBackendService(t) + service := newService(t, fakeChecker{allowedVerbs: rwVerbs}, backendService, &mockUsageReporter{}, &libevents.DiscardEmitter{}, clockwork.NewFakeClock()) + ctx := context.Background() + + ut1 := createDummyUserTask(t, "my-integration") + userTaskName := ut1.GetMetadata().GetName() + + _, err := service.CreateUserTask(ctx, &usertasksv1.CreateUserTaskRequest{UserTask: ut1}) + require.NoError(t, err) + // A global notification must be created because there's a new UserTask reporting happens when user task is created, so we expect to see an event. + require.Len(t, backendService.notifications, 1) + var existingNotification *notificationsv1.GlobalNotification + for _, v := range backendService.notifications { + existingNotification = v + } + // Integration is updated accordingly to store this notification. + require.Equal(t, backendService.integrationStatus.PendingUserTasksNotificationID, existingNotification.Metadata.GetName()) + + // Updating the User Task to resolved does not trigger a new notification. + ut1.Spec.State = "RESOLVED" + _, err = service.UpsertUserTask(ctx, &usertasksv1.UpsertUserTaskRequest{UserTask: ut1}) + require.NoError(t, err) + require.Equal(t, backendService.integrationStatus.PendingUserTasksNotificationID, existingNotification.Metadata.GetName()) + + // But updating it again to OPEN must create a new notification. + ut1.Spec.State = "OPEN" + _, err = service.UpsertUserTask(ctx, &usertasksv1.UpsertUserTaskRequest{UserTask: ut1}) + require.NoError(t, err) + require.NotEqual(t, backendService.integrationStatus.PendingUserTasksNotificationID, existingNotification.Metadata.GetName()) + + _, err = service.DeleteUserTask(ctx, &usertasksv1.DeleteUserTaskRequest{Name: userTaskName}) + require.NoError(t, err) + require.NotEqual(t, backendService.integrationStatus.PendingUserTasksNotificationID, existingNotification.Metadata.GetName()) + + // After the notification expires, stale state might exist in the Integration status field. + // In that case, Deleting the Notification is a no-op and should be handled gracefully. + delete(backendService.notifications, ut1.GetMetadata().GetName()) + + ut2 := createDummyUserTask(t, "integration-for-ut2") + ut2.Metadata.Expires = ×tamppb.Timestamp{Seconds: 100} + _, err = service.CreateUserTask(ctx, &usertasksv1.CreateUserTaskRequest{UserTask: ut2}) + require.NoError(t, err) + + // Issuing a new Notification, whose expiration is shorter, should keep the old expiration. + ut3 := createDummyUserTask(t, "integration-for-ut3") + ut3.Metadata.Expires = ×tamppb.Timestamp{Seconds: 90} + _, err = service.CreateUserTask(ctx, &usertasksv1.CreateUserTaskRequest{UserTask: ut3}) + require.NoError(t, err) + + require.Len(t, backendService.notifications, 1) + for _, v := range backendService.notifications { + existingNotification = v + t.Log(v.Metadata.Expires) + } + require.Equal(t, int64(100), existingNotification.GetSpec().GetNotification().GetMetadata().GetExpires().GetSeconds()) +} + +func newMockBackendService(t *testing.T) *mockBackendService { + b, err := memory.New(memory.Config{}) + require.NoError(t, err) + + backendService, err := local.NewUserTasksService(b) + require.NoError(t, err) + return &mockBackendService{ + UserTasks: backendService, + notifications: make(map[string]*notificationsv1.GlobalNotification), + } +} + +type mockBackendService struct { + services.UserTasks + + notifications map[string]*notificationsv1.GlobalNotification + integrationStatus types.IntegrationStatusV1 +} + +func (m *mockBackendService) CreateGlobalNotification(ctx context.Context, globalNotification *notificationsv1.GlobalNotification) (*notificationsv1.GlobalNotification, error) { + globalNotification.Metadata = &headerv1.Metadata{ + Name: uuid.NewString(), + } + m.notifications[globalNotification.GetMetadata().Name] = globalNotification + return globalNotification, nil +} + +func (m *mockBackendService) DeleteGlobalNotification(ctx context.Context, notificationId string) error { + if _, ok := m.notifications[notificationId]; !ok { + return trace.NotFound("global notification not found") + } + delete(m.notifications, notificationId) + return nil +} + +func (m *mockBackendService) UpdateIntegration(ctx context.Context, integration types.Integration) (types.Integration, error) { + m.integrationStatus = integration.GetStatus() + return nil, nil +} + +func (m *mockBackendService) GetIntegration(ctx context.Context, name string) (types.Integration, error) { + return &types.IntegrationV1{ + Status: m.integrationStatus, + }, nil +} diff --git a/lib/srv/discovery/status.go b/lib/srv/discovery/status.go index ab7a23e040039..83b940671e346 100644 --- a/lib/srv/discovery/status.go +++ b/lib/srv/discovery/status.go @@ -560,12 +560,7 @@ func (d *awsRDSTasks) addFailedEnrollment(g awsRDSTaskKey, database *usertasksv1 d.issuesSyncQueue[g] = struct{}{} } -// acquireSemaphoreForUserTask tries to acquire a semaphore lock for this user task. -// It returns a func which must be called to release the lock. -// It also returns a context which is tied to the lease and will be canceled if the lease ends. -func (s *Server) acquireSemaphoreForUserTask(userTaskName string) (releaseFn func(), ctx context.Context, err error) { - // Use the deterministic task name as semaphore name. - semaphoreName := userTaskName +func (s *Server) acquireSemaphore(kind, semaphoreName string) (releaseFn func(), stopCtx context.Context, err error) { semaphoreExpiration := 10 * time.Second // AcquireSemaphoreLock will retry until the semaphore is acquired. @@ -577,7 +572,7 @@ func (s *Server) acquireSemaphoreForUserTask(userTaskName string) (releaseFn fun SemaphoreLockConfig: services.SemaphoreLockConfig{ Service: s.AccessPoint, Params: types.AcquireSemaphoreRequest{ - SemaphoreKind: types.KindUserTask, + SemaphoreKind: kind, SemaphoreName: semaphoreName, MaxLeases: 1, Holder: s.Config.ServerID, @@ -605,13 +600,27 @@ func (s *Server) acquireSemaphoreForUserTask(userTaskName string) (releaseFn fun cancel() lease.Stop() if err := lease.Wait(); err != nil { - s.Log.WarnContext(ctx, "Error cleaning up UserTask semaphore", "semaphore", semaphoreName, "error", err) + s.Log.WarnContext(s.ctx, "Error cleaning up semaphore", "semaphore_kind", kind, "semaphore", semaphoreName, "error", err) } } return releaseFn, ctxWithLease, nil } +// acquireSemaphoreForIntegration tries to acquire a semaphore lock for the integration. +// This allows the process to do two things: +// - merge the current UserTask with the one stored in the backend, so that no task items are lost +// - ensure a single Notification (pending-user-task-integration) is created +// The former could be achieved using the UserTask name as lock identifier. +// However, for the latter, we would need a lock for the Integration. +// Instead of having two locks, locking by the Integration allows us to safely edit both resources. +// +// Note: UserTask name is a deterministic value, based on multiple fields, including the integration. +// Note: UpsertUserTask triggers the creation of a new Notification. +func (s *Server) acquireSemaphoreForIntegration(integration string) (releaseFn func(), ctx context.Context, err error) { + return s.acquireSemaphore(types.KindIntegration, integration) +} + // mergeUpsertDiscoverEC2Task takes the current DiscoverEC2 User Task issues stored in memory and // merges them against the ones that exist in the cluster. // @@ -630,7 +639,7 @@ func (s *Server) mergeUpsertDiscoverEC2Task(taskGroup awsEC2TaskKey, failedInsta InstallerScript: taskGroup.installerScript, }) - releaseFn, ctxWithLease, err := s.acquireSemaphoreForUserTask(userTaskName) + releaseFn, ctxWithLease, err := s.acquireSemaphoreForIntegration(taskGroup.integration) if err != nil { return trace.Wrap(err) } @@ -750,7 +759,7 @@ func (s *Server) mergeUpsertDiscoverEKSTask(taskGroup awsEKSTaskKey, failedClust AppAutoDiscover: taskGroup.appAutoDiscover, }) - releaseFn, ctxWithLease, err := s.acquireSemaphoreForUserTask(userTaskName) + releaseFn, ctxWithLease, err := s.acquireSemaphoreForIntegration(taskGroup.integration) if err != nil { return trace.Wrap(err) } @@ -850,7 +859,7 @@ func (s *Server) mergeUpsertDiscoverRDSTask(taskGroup awsRDSTaskKey, failedDatab Region: taskGroup.region, }) - releaseFn, ctxWithLease, err := s.acquireSemaphoreForUserTask(userTaskName) + releaseFn, ctxWithLease, err := s.acquireSemaphoreForIntegration(taskGroup.integration) if err != nil { return trace.Wrap(err) } From 01a0ff20d0d63a4d6e724fb72ba591565c325ce6 Mon Sep 17 00:00:00 2001 From: Marco Dinis Date: Fri, 25 Oct 2024 11:12:04 +0100 Subject: [PATCH 2/2] fix typo --- api/proto/teleport/legacy/types/types.proto | 2 +- api/types/types.pb.go | 2 +- lib/auth/usertasks/usertasksv1/service.go | 3 +-- 3 files changed, 3 insertions(+), 4 deletions(-) diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 35179685047b9..763e7f9200bb7 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -7643,7 +7643,7 @@ message IntegrationV1 { message IntegrationStatusV1 { // PendingUserTasksNotificationID contains the notification ID that indicates that this integration has unresolved user tasks. string PendingUserTasksNotificationID = 1 [(gogoproto.jsontag) = "pending_user_tasks_notification_id,omitempty"]; - // NeedsAttentionNotificationExpires contains the expiration date for the notification. + // PendingUserTasksNotificationExpires contains the expiration date for the notification. // Used to ensure new notifications' expiration is the greater between the current notification and the new one. google.protobuf.Timestamp PendingUserTasksNotificationExpires = 2 [ (gogoproto.stdtime) = true, diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 920a37ad6d227..87cea987cc512 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -20357,7 +20357,7 @@ var xxx_messageInfo_IntegrationV1 proto.InternalMessageInfo type IntegrationStatusV1 struct { // PendingUserTasksNotificationID contains the notification ID that indicates that this integration has unresolved user tasks. PendingUserTasksNotificationID string `protobuf:"bytes,1,opt,name=PendingUserTasksNotificationID,proto3" json:"pending_user_tasks_notification_id,omitempty"` - // NeedsAttentionNotificationExpires contains the expiration date for the notification. + // PendingUserTasksNotificationExpires contains the expiration date for the notification. // Used to ensure new notifications' expiration is the greater between the current notification and the new one. PendingUserTasksNotificationExpires *time.Time `protobuf:"bytes,2,opt,name=PendingUserTasksNotificationExpires,proto3,stdtime" json:"pending_user_tasks_notification_expires,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` diff --git a/lib/auth/usertasks/usertasksv1/service.go b/lib/auth/usertasks/usertasksv1/service.go index 64c42cc0495ec..f7a8f948ab2bd 100644 --- a/lib/auth/usertasks/usertasksv1/service.go +++ b/lib/auth/usertasks/usertasksv1/service.go @@ -477,8 +477,7 @@ func (s *Service) notifyUserAboutPendingTask(ctx context.Context, ut *usertasksv return trace.Wrap(err) } integrationStatus := integration.GetStatus() - existingNotification := integrationStatus.PendingUserTasksNotificationID - if existingNotification != "" { + if integrationStatus.PendingUserTasksNotificationID != "" { if err := s.backend.DeleteGlobalNotification(ctx, integrationStatus.PendingUserTasksNotificationID); err != nil { // NotFound might be returned when the GlobalNotification already expired or was deleted. if !trace.IsNotFound(err) {