diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index cf5042e3b21c6..8e99195e0fc77 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -7209,6 +7209,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 87c0335586bf6..7b3520572b30f 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -1114,6 +1114,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 189ecd959438e..6cf1ff8faf5ee 100644 --- a/api/types/integration.go +++ b/api/types/integration.go @@ -53,6 +53,11 @@ type Integration interface { // GetAzureOIDCIntegrationSpec returns the `azure-oidc` spec fields. GetAzureOIDCIntegrationSpec() *AzureOIDCIntegrationSpecV1 + + // GetStatus returns the Integration Status. + GetStatus() IntegrationStatusV1 + // SetStatus sets the Integration Status. + SetStatus(IntegrationStatusV1) } var _ ResourceWithLabels = (*IntegrationV1)(nil) @@ -250,6 +255,22 @@ func (ig *IntegrationV1) GetAzureOIDCIntegrationSpec() *AzureOIDCIntegrationSpec return ig.Spec.GetAzureOIDC() } +// 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 @@ -302,6 +323,7 @@ func (ig *IntegrationV1) UnmarshalJSON(data []byte) error { AWSOIDC json.RawMessage `json:"aws_oidc"` AzureOIDC json.RawMessage `json:"azure_oidc"` } `json:"spec"` + Status IntegrationStatusV1 `json:"status"` }{} err := json.Unmarshal(data, &d) @@ -310,6 +332,7 @@ func (ig *IntegrationV1) UnmarshalJSON(data []byte) error { } integration.ResourceHeader = d.ResourceHeader + integration.Status = d.Status switch integration.SubKind { case IntegrationSubKindAWSOIDC: @@ -357,9 +380,11 @@ func (ig *IntegrationV1) MarshalJSON() ([]byte, error) { AWSOIDC AWSOIDCIntegrationSpecV1 `json:"aws_oidc,omitempty"` AzureOIDC AzureOIDCIntegrationSpecV1 `json:"azure_oidc,omitempty"` } `json:"spec"` + Status IntegrationStatusV1 `json:"status"` }{} d.ResourceHeader = ig.ResourceHeader + d.Status = ig.Status switch ig.SubKind { case IntegrationSubKindAWSOIDC: 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 ffcd029a4f18e..288a4eacdb5b7 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -18987,10 +18987,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{} } @@ -19025,6 +19027,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{328} +} +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: @@ -19041,7 +19088,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{328} + return fileDescriptor_9198ee693835762e, []int{329} } func (m *IntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19141,7 +19188,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{329} + return fileDescriptor_9198ee693835762e, []int{330} } func (m *AWSOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19187,7 +19234,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{330} + return fileDescriptor_9198ee693835762e, []int{331} } func (m *AzureOIDCIntegrationSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19248,7 +19295,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{331} + return fileDescriptor_9198ee693835762e, []int{332} } func (m *HeadlessAuthentication) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19305,7 +19352,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{332} + return fileDescriptor_9198ee693835762e, []int{333} } func (m *WatchKind) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19355,7 +19402,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{333} + return fileDescriptor_9198ee693835762e, []int{334} } func (m *WatchStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19396,7 +19443,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{334} + return fileDescriptor_9198ee693835762e, []int{335} } func (m *WatchStatusSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19446,7 +19493,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{335} + return fileDescriptor_9198ee693835762e, []int{336} } func (m *ServerInfoV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19488,7 +19535,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{336} + return fileDescriptor_9198ee693835762e, []int{337} } func (m *ServerInfoSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19545,7 +19592,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{337} + return fileDescriptor_9198ee693835762e, []int{338} } func (m *JamfSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19610,7 +19657,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{338} + return fileDescriptor_9198ee693835762e, []int{339} } func (m *JamfInventoryEntry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19667,7 +19714,7 @@ type MessageWithHeader struct { func (m *MessageWithHeader) Reset() { *m = MessageWithHeader{} } func (*MessageWithHeader) ProtoMessage() {} func (*MessageWithHeader) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{339} + return fileDescriptor_9198ee693835762e, []int{340} } func (m *MessageWithHeader) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19731,7 +19778,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{340} + return fileDescriptor_9198ee693835762e, []int{341} } func (m *AWSMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19776,7 +19823,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{341} + return fileDescriptor_9198ee693835762e, []int{342} } func (m *AssumeRole) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19838,7 +19885,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{342} + return fileDescriptor_9198ee693835762e, []int{343} } func (m *InstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19881,7 +19928,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{343} + return fileDescriptor_9198ee693835762e, []int{344} } func (m *AWSSSM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19924,7 +19971,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{344} + return fileDescriptor_9198ee693835762e, []int{345} } func (m *AzureInstallerParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19978,7 +20025,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{345} + return fileDescriptor_9198ee693835762e, []int{346} } func (m *AzureMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20033,7 +20080,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{346} + return fileDescriptor_9198ee693835762e, []int{347} } func (m *GCPMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20079,7 +20126,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{347} + return fileDescriptor_9198ee693835762e, []int{348} } func (m *KubernetesMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20121,7 +20168,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{348} + return fileDescriptor_9198ee693835762e, []int{349} } func (m *OktaOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20163,7 +20210,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{349} + return fileDescriptor_9198ee693835762e, []int{350} } func (m *AccessGraphSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20209,7 +20256,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{350} + return fileDescriptor_9198ee693835762e, []int{351} } func (m *AccessGraphAWSSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -20627,6 +20674,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") @@ -20657,7 +20705,7 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 28842 bytes of a gzipped FileDescriptorProto + // 28946 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x90, 0x1c, 0x49, 0x7a, 0x18, 0xb6, 0xdd, 0x3d, 0x8f, 0x9e, 0x6f, 0x5e, 0x3d, 0x39, 0x03, 0x60, 0x30, 0xfb, 0x68, 0x6c, 0xed, 0x2e, 0x16, 0xbb, 0xb7, 0x0b, 0x1c, 0x06, 0xb7, 0xb8, 0xdb, 0xdb, 0xd7, 0xf5, 0x3c, @@ -22135,332 +22183,339 @@ var fileDescriptor_9198ee693835762e = []byte{ 0x99, 0x18, 0x5e, 0x0b, 0xfd, 0x7b, 0xcb, 0x54, 0x4b, 0x4b, 0x1d, 0x31, 0xba, 0x60, 0xcd, 0x2e, 0xc2, 0x7c, 0x2a, 0xe4, 0x46, 0xe2, 0xc3, 0x6d, 0xcf, 0x89, 0x22, 0x33, 0x40, 0xd3, 0x8b, 0x30, 0xa5, 0x86, 0x21, 0x88, 0x3d, 0xc1, 0xec, 0x49, 0x82, 0x89, 0x59, 0x4e, 0xd5, 0x75, 0x55, 0xa3, - 0x32, 0x65, 0xf2, 0x21, 0x64, 0xd7, 0xff, 0x9f, 0xbd, 0xab, 0xf9, 0x8d, 0xe4, 0xb8, 0xee, 0xec, - 0x99, 0x21, 0x39, 0x7c, 0xc3, 0x8f, 0x66, 0xed, 0x6a, 0x97, 0x22, 0x77, 0xb9, 0xda, 0xd6, 0xee, - 0x6a, 0x77, 0x64, 0x49, 0xde, 0x55, 0x64, 0x69, 0xe5, 0xc8, 0x72, 0x73, 0xa6, 0x87, 0xd3, 0xcb, - 0xf9, 0x52, 0xf7, 0x0c, 0xe9, 0x95, 0x6c, 0x77, 0x5a, 0x9c, 0x26, 0x39, 0xd1, 0x70, 0x66, 0x3c, - 0x1f, 0x5a, 0xaf, 0x10, 0x20, 0x5f, 0x80, 0x0d, 0x24, 0x71, 0x9c, 0x38, 0x01, 0x62, 0x04, 0x01, - 0x72, 0x88, 0x10, 0xe4, 0x90, 0xbf, 0x20, 0xc9, 0x25, 0x37, 0x01, 0x86, 0x01, 0x1f, 0x72, 0x4a, - 0x00, 0x21, 0x11, 0x90, 0x1c, 0x92, 0xdc, 0x82, 0xf8, 0xe0, 0x53, 0x50, 0xaf, 0xaa, 0xba, 0xab, - 0x3f, 0x66, 0x96, 0xab, 0x95, 0x92, 0x18, 0xf0, 0x89, 0x9c, 0xaa, 0xf7, 0xaa, 0xeb, 0xbb, 0x5e, - 0xbd, 0x7a, 0xef, 0xf7, 0xc8, 0x0b, 0x40, 0x7c, 0x39, 0xd9, 0x5f, 0x98, 0xfc, 0x83, 0xeb, 0x22, - 0xc7, 0x5f, 0x51, 0xfc, 0xb3, 0x7f, 0x97, 0x82, 0x73, 0x09, 0xc2, 0x3c, 0x15, 0xba, 0x3b, 0xbd, - 0xb1, 0x77, 0xcc, 0x44, 0x76, 0xb9, 0x91, 0x6b, 0x52, 0x3a, 0xd7, 0xd0, 0x2c, 0xb0, 0x18, 0xdc, - 0xfc, 0x5b, 0xfc, 0x17, 0x5d, 0xac, 0xee, 0x50, 0x28, 0x1f, 0xe8, 0xbf, 0xc4, 0x84, 0x75, 0x0c, - 0x2c, 0x30, 0xea, 0xf4, 0x31, 0x3e, 0x01, 0x1e, 0xfa, 0x99, 0xd0, 0x15, 0x08, 0x6b, 0xd1, 0x90, - 0x88, 0xe8, 0xa9, 0x6f, 0xa9, 0x83, 0x48, 0x0a, 0xf9, 0x32, 0x6c, 0x4a, 0x7b, 0xbb, 0x13, 0x99, - 0xea, 0x68, 0xeb, 0x6d, 0x5d, 0x74, 0xfd, 0x5d, 0xbe, 0x18, 0x9a, 0xf4, 0x3b, 0xb0, 0x8d, 0x83, - 0xd8, 0x69, 0x0f, 0x9c, 0x58, 0x24, 0x0a, 0x6c, 0x2a, 0x83, 0x6e, 0xdf, 0xa4, 0x54, 0x66, 0x7b, - 0x10, 0x09, 0x4a, 0x41, 0x5b, 0xcd, 0xbb, 0xef, 0x1d, 0x78, 0x2a, 0xb1, 0xc6, 0x74, 0x43, 0x47, - 0x53, 0xa2, 0x40, 0x16, 0x59, 0xa4, 0xbf, 0xa9, 0x30, 0x72, 0x15, 0x96, 0xdf, 0xf5, 0xdc, 0xa1, - 0x37, 0xe4, 0x27, 0x25, 0x9f, 0x12, 0x2c, 0x4d, 0x3e, 0x28, 0xff, 0x32, 0x25, 0xae, 0x21, 0x3b, - 0xfd, 0xfe, 0x78, 0x34, 0x1e, 0xba, 0x83, 0x90, 0x02, 0x84, 0x9c, 0xc2, 0xd3, 0x78, 0x4a, 0xdf, - 0x41, 0xe0, 0xfa, 0xfe, 0x50, 0x78, 0xea, 0x1f, 0x0a, 0xeb, 0xd7, 0xdc, 0x9d, 0x97, 0xc2, 0x72, - 0x84, 0x4e, 0xa9, 0x75, 0x99, 0x98, 0x4a, 0xcd, 0x52, 0xa9, 0xe5, 0x39, 0xeb, 0x22, 0x2b, 0x33, - 0x46, 0x45, 0xca, 0x09, 0x15, 0x8f, 0x6a, 0x40, 0x76, 0x82, 0x56, 0x84, 0x4b, 0x95, 0xdb, 0x47, - 0xbe, 0x02, 0x4b, 0x9d, 0xb6, 0x1c, 0x9f, 0x2d, 0x7a, 0xf7, 0x36, 0xdb, 0x0c, 0x23, 0x36, 0x28, - 0xa3, 0x3c, 0x67, 0x65, 0x3b, 0x3c, 0x75, 0x67, 0x25, 0xa4, 0x2a, 0xd2, 0x76, 0x84, 0xc4, 0x1b, - 0x67, 0x23, 0xab, 0x90, 0xf2, 0x77, 0x82, 0x54, 0xa7, 0x4d, 0x67, 0xeb, 0x48, 0x42, 0xa9, 0xb5, - 0xf8, 0x2f, 0xed, 0xd7, 0xe0, 0xe6, 0x59, 0xfb, 0x88, 0xae, 0xb4, 0x29, 0x1d, 0xbe, 0x64, 0xad, - 0xbb, 0xb1, 0x7e, 0xbb, 0x0a, 0x32, 0xc8, 0x66, 0x47, 0x0c, 0xb8, 0x48, 0x6b, 0x0d, 0x3b, 0xda, - 0x6f, 0xa5, 0x61, 0x35, 0xac, 0x1c, 0x23, 0xcf, 0x43, 0xc6, 0x2f, 0x76, 0xd5, 0x7f, 0xc4, 0x91, - 0x89, 0x68, 0xe1, 0x16, 0x12, 0x51, 0x29, 0x04, 0xdf, 0x7c, 0x9d, 0x53, 0xf9, 0x9d, 0xc5, 0x5a, - 0xc6, 0x44, 0xf1, 0xbe, 0x72, 0x0f, 0x56, 0xd1, 0x5c, 0x07, 0x8f, 0xb7, 0x71, 0x87, 0xab, 0x5c, - 0x67, 0x6b, 0xcd, 0xb3, 0x1f, 0x7d, 0x7c, 0x65, 0x0e, 0x15, 0xe4, 0xcb, 0x94, 0x97, 0x1e, 0x31, - 0x34, 0x53, 0xd2, 0x7d, 0x64, 0xa6, 0xeb, 0x3e, 0x78, 0x53, 0xa6, 0xe8, 0x3e, 0xe6, 0x67, 0xe8, - 0x3e, 0x02, 0x4e, 0x59, 0xf7, 0x81, 0x1a, 0xb0, 0xc5, 0x69, 0x1a, 0xb0, 0x80, 0x87, 0x69, 0xc0, - 0xae, 0xf1, 0xe6, 0x0e, 0xdd, 0x07, 0x0e, 0xf6, 0x03, 0x5f, 0xd5, 0xd8, 0x10, 0xcb, 0x7d, 0x80, - 0xaf, 0xe3, 0x3b, 0x4b, 0x20, 0x9e, 0xd4, 0xb5, 0x3f, 0x52, 0x22, 0x8a, 0x03, 0x31, 0x14, 0xd7, - 0x61, 0xb5, 0x73, 0x4a, 0x6f, 0x34, 0x5e, 0x5b, 0x12, 0x4d, 0x57, 0xac, 0x15, 0x91, 0xca, 0xc4, - 0xd3, 0xe7, 0x60, 0xcd, 0x27, 0xe3, 0x12, 0x1a, 0xba, 0xda, 0x58, 0x3e, 0x37, 0xc7, 0x8d, 0x78, - 0x1e, 0xd6, 0x7d, 0x42, 0x7e, 0xf9, 0x63, 0xd2, 0xe9, 0x8a, 0xa5, 0x8a, 0x0c, 0x1e, 0xef, 0x7f, - 0xa4, 0x1d, 0x47, 0x05, 0x95, 0xcf, 0xa9, 0x56, 0xda, 0xdf, 0xa7, 0x43, 0x97, 0x2a, 0xf1, 0x99, - 0x1d, 0xc8, 0xd1, 0xd3, 0x92, 0x77, 0x12, 0xdf, 0x56, 0xae, 0x4e, 0xe9, 0x7e, 0x6e, 0x94, 0x60, - 0xdb, 0x75, 0x0b, 0x46, 0xa3, 0xbe, 0xb0, 0x51, 0x70, 0x98, 0x40, 0xc0, 0x04, 0x65, 0x9c, 0x7e, - 0xa2, 0x38, 0xb6, 0x87, 0xe4, 0x67, 0x17, 0x27, 0xa4, 0x5a, 0x3a, 0xfb, 0x50, 0x30, 0xf0, 0x7f, - 0x89, 0x0f, 0xb4, 0x00, 0x75, 0x10, 0xa3, 0x70, 0xe1, 0xe9, 0x04, 0x51, 0x2b, 0x56, 0x38, 0xf6, - 0x12, 0x96, 0xac, 0x4e, 0xc4, 0xbf, 0xa2, 0x58, 0x03, 0x96, 0xf1, 0x4a, 0x23, 0x0a, 0xcc, 0x24, - 0xe8, 0xd0, 0xe2, 0x8d, 0x2f, 0x98, 0x55, 0x2b, 0x47, 0xf9, 0x44, 0x31, 0x27, 0xf0, 0xb4, 0x7c, - 0x11, 0x09, 0x57, 0x72, 0x5e, 0xc0, 0x60, 0xce, 0xec, 0x81, 0xe0, 0xbe, 0x82, 0x55, 0xbd, 0xe0, - 0x86, 0x13, 0x38, 0x99, 0x76, 0x02, 0x9b, 0xd3, 0x87, 0x64, 0x46, 0x88, 0x95, 0x40, 0x66, 0x4a, - 0xc9, 0x32, 0x93, 0x7c, 0x2d, 0x49, 0x87, 0xae, 0x25, 0xda, 0x5f, 0xa4, 0xe1, 0xd9, 0x33, 0x0c, - 0xd7, 0x8c, 0x6f, 0x7e, 0x15, 0x72, 0x4c, 0xf3, 0xcf, 0xb6, 0x4f, 0x66, 0x35, 0xe3, 0x07, 0x4a, - 0x7d, 0x6f, 0xec, 0xf2, 0xbd, 0x8e, 0x4a, 0xb5, 0xc1, 0x7e, 0x07, 0x23, 0xff, 0x7f, 0xf2, 0x2b, - 0xb0, 0xc6, 0x36, 0x34, 0x66, 0x57, 0x74, 0x34, 0xe9, 0x9e, 0x61, 0x47, 0xdb, 0x12, 0x4e, 0x10, - 0x11, 0x56, 0xdc, 0xe4, 0x70, 0xc7, 0xb0, 0xfd, 0x34, 0xd2, 0x84, 0x1c, 0x92, 0x1d, 0xb9, 0x9d, - 0xee, 0x99, 0xac, 0xf1, 0x85, 0x8b, 0x85, 0xcc, 0xc6, 0xcc, 0x21, 0x69, 0x42, 0x09, 0x7f, 0x93, - 0x1b, 0xb0, 0xd6, 0x9b, 0x9c, 0xd2, 0x9b, 0x1c, 0x9b, 0x0b, 0xfc, 0xf9, 0x76, 0xde, 0x5a, 0xe9, - 0x4d, 0x4e, 0xf5, 0xc1, 0x00, 0x87, 0x14, 0xdf, 0x79, 0xd7, 0x29, 0x1d, 0x5b, 0xb5, 0x82, 0x72, - 0x01, 0x29, 0x69, 0x01, 0x6c, 0xdd, 0x72, 0xda, 0xf3, 0xc0, 0xac, 0x7e, 0x78, 0x88, 0x19, 0xf6, - 0x43, 0xfb, 0x69, 0x4a, 0x88, 0xeb, 0xd3, 0xe7, 0xfd, 0x2f, 0x86, 0x28, 0x61, 0x88, 0x6e, 0x82, - 0x4a, 0xbb, 0x3e, 0xd8, 0x54, 0xfc, 0x31, 0x5a, 0xed, 0x4d, 0x4e, 0xfd, 0xbe, 0x93, 0x3b, 0x7e, - 0x41, 0xee, 0xf8, 0x57, 0x85, 0x38, 0x9f, 0xb8, 0x3d, 0x4c, 0xef, 0x72, 0xed, 0x3f, 0xd3, 0x70, - 0xe3, 0x6c, 0x9b, 0xc0, 0x2f, 0xc6, 0x2d, 0x61, 0xdc, 0x22, 0x9a, 0x96, 0xf9, 0x98, 0xa6, 0x25, - 0x61, 0xed, 0x2d, 0x24, 0xad, 0xbd, 0x98, 0x5e, 0x67, 0x31, 0x41, 0xaf, 0x93, 0xb8, 0x40, 0xb3, - 0x8f, 0x58, 0xa0, 0x4b, 0xf2, 0x3c, 0xf9, 0x37, 0xff, 0xfe, 0x15, 0x16, 0xed, 0xdf, 0x81, 0x73, - 0x42, 0xb4, 0x67, 0x27, 0x47, 0xa0, 0xae, 0xcb, 0xdd, 0xb9, 0x95, 0x24, 0xd4, 0x23, 0x59, 0x82, - 0xe0, 0xbd, 0xce, 0xc5, 0xf9, 0x20, 0xff, 0xff, 0x8f, 0x20, 0x4f, 0xee, 0xc3, 0x05, 0x04, 0x68, - 0x3e, 0x94, 0x15, 0x8d, 0xce, 0xd0, 0x3b, 0xe2, 0xf3, 0xe1, 0x6a, 0x4c, 0xec, 0xed, 0x1c, 0x4a, - 0xd5, 0xb1, 0xbc, 0xa3, 0xf2, 0x9c, 0x75, 0x7e, 0x94, 0x90, 0x1e, 0xbd, 0x23, 0xfc, 0xb5, 0x02, - 0xda, 0xa3, 0xfb, 0x0b, 0xef, 0xd9, 0xd1, 0x0e, 0xa7, 0xf7, 0x6c, 0xa9, 0xf7, 0x9e, 0x85, 0x95, - 0xa1, 0x77, 0x34, 0xf4, 0x46, 0x27, 0xa1, 0x0b, 0xdc, 0x32, 0x4f, 0x14, 0x1d, 0x23, 0x60, 0xe2, - 0x1e, 0x4b, 0xc8, 0x16, 0x4c, 0x5a, 0xc9, 0xbf, 0xfa, 0x25, 0x8e, 0x03, 0x9d, 0x4d, 0x72, 0x05, - 0xd9, 0x8f, 0x7b, 0x99, 0x6c, 0x4a, 0x4d, 0x5b, 0x1c, 0xcc, 0xee, 0xa8, 0xd3, 0xf5, 0xb4, 0xbf, - 0x51, 0x84, 0x44, 0x90, 0xd4, 0x79, 0xe4, 0x1d, 0xc9, 0x1a, 0x2f, 0x1d, 0x13, 0x43, 0x92, 0x58, - 0x64, 0xc3, 0x25, 0x8e, 0xaf, 0x86, 0x09, 0x21, 0x7c, 0x35, 0x4c, 0x79, 0x02, 0x93, 0x22, 0x7e, - 0x01, 0xbe, 0x2b, 0x9e, 0xf4, 0xe9, 0x9e, 0xb7, 0x7f, 0x9b, 0xdc, 0x82, 0x45, 0xf6, 0x8a, 0x2f, - 0xaa, 0xbb, 0x16, 0xaa, 0xee, 0xfe, 0x6d, 0x4b, 0xe4, 0x6b, 0x3f, 0xf4, 0xd5, 0xe0, 0xb1, 0x46, - 0xec, 0xdf, 0x26, 0xaf, 0x9e, 0xcd, 0xba, 0x2e, 0x2b, 0xac, 0xeb, 0x7c, 0xcb, 0xba, 0xd7, 0x42, - 0x96, 0x75, 0xd7, 0x66, 0xf7, 0x16, 0x7f, 0xbc, 0x60, 0x78, 0x62, 0x01, 0xce, 0xcc, 0x4f, 0x15, - 0xb8, 0x3c, 0x93, 0x83, 0x5c, 0x82, 0xac, 0xde, 0x30, 0x9b, 0xc1, 0xf8, 0xd2, 0x35, 0x23, 0x52, - 0xc8, 0x2e, 0x2c, 0xed, 0xb8, 0xa3, 0xce, 0x21, 0x9d, 0xc6, 0x89, 0xda, 0xc4, 0x58, 0xb1, 0x3e, - 0x79, 0x79, 0xce, 0x0a, 0x78, 0x89, 0x03, 0xeb, 0xb8, 0x16, 0x42, 0xb1, 0x5b, 0xd2, 0x09, 0x6a, - 0x83, 0x58, 0x81, 0x31, 0x36, 0xba, 0xcf, 0xc4, 0x12, 0xa3, 0x4b, 0xf0, 0x7d, 0x21, 0x8b, 0x4c, - 0xaf, 0xe0, 0x63, 0x00, 0x23, 0xde, 0x84, 0x6c, 0x43, 0x3c, 0x2b, 0x4a, 0xe6, 0xa8, 0xe2, 0x09, - 0xd1, 0xf2, 0x73, 0xb5, 0xdf, 0x53, 0xc4, 0xdd, 0xfe, 0xd1, 0x0d, 0x91, 0xc2, 0xde, 0xb4, 0x67, - 0x87, 0xbd, 0x69, 0x7f, 0xca, 0xb0, 0x37, 0xda, 0x5f, 0x71, 0xd8, 0x62, 0xb3, 0xdd, 0x88, 0x28, - 0x96, 0x9e, 0xd4, 0xac, 0xd8, 0x08, 0xcd, 0xce, 0x67, 0xa5, 0xb0, 0x69, 0xf1, 0x6f, 0x4d, 0xb7, - 0x2e, 0x96, 0xa6, 0xea, 0x9f, 0xa4, 0xe1, 0xd2, 0x2c, 0xf6, 0xc4, 0xc0, 0xac, 0xca, 0xe3, 0x05, - 0x66, 0xbd, 0x05, 0x59, 0x96, 0xe6, 0xdb, 0xcc, 0x62, 0x87, 0x73, 0x56, 0xda, 0xe1, 0x22, 0x9b, - 0x3c, 0x0b, 0x0b, 0x7a, 0xc1, 0x0e, 0x62, 0x05, 0xa1, 0x71, 0x9b, 0x7b, 0x38, 0x42, 0xb3, 0x29, - 0x9e, 0x45, 0xbe, 0x19, 0x0f, 0x8f, 0xc5, 0x83, 0x04, 0x6d, 0x49, 0x1d, 0x12, 0x43, 0x14, 0xc7, - 0xfa, 0x06, 0x08, 0xd8, 0x1c, 0x54, 0xd6, 0x8a, 0x87, 0xda, 0xd2, 0x60, 0xa1, 0x31, 0xf4, 0x46, - 0xde, 0x58, 0x36, 0x3c, 0x1b, 0x60, 0x8a, 0xc5, 0x73, 0xb8, 0x59, 0x98, 0xfb, 0x90, 0x79, 0x01, - 0x2f, 0xc8, 0xc8, 0x0c, 0x68, 0x47, 0x46, 0x93, 0x2d, 0x89, 0x84, 0x32, 0x54, 0xdc, 0x49, 0xef, - 0xf0, 0xa4, 0x65, 0x55, 0xb8, 0xa8, 0xc1, 0x18, 0xba, 0x98, 0x4a, 0x1b, 0x38, 0xb2, 0x24, 0x12, - 0xed, 0xbb, 0x0a, 0x9c, 0x4f, 0x6a, 0x07, 0xb9, 0x04, 0x99, 0x5e, 0x62, 0x24, 0xb0, 0x1e, 0x73, - 0x5e, 0xcc, 0xd1, 0xbf, 0xce, 0x51, 0x7f, 0x78, 0xea, 0x8e, 0x65, 0xf3, 0x3c, 0x29, 0xd9, 0x02, - 0xfa, 0xa3, 0x84, 0xff, 0x93, 0x2b, 0x62, 0x8f, 0x4e, 0xc7, 0x62, 0x87, 0xe1, 0x1f, 0x4d, 0x07, - 0x30, 0xdb, 0x8d, 0xfa, 0x80, 0x21, 0x5a, 0xbf, 0x0c, 0x19, 0x5a, 0xad, 0xc8, 0xec, 0xa5, 0xf3, - 0x47, 0xaf, 0x56, 0x38, 0x11, 0xab, 0xd5, 0xc8, 0x3d, 0xed, 0x5a, 0x48, 0xac, 0x1d, 0xc0, 0x6a, - 0x98, 0x82, 0x18, 0x61, 0x0c, 0xc4, 0xdc, 0x1d, 0x95, 0x97, 0xb4, 0xd3, 0xef, 0x33, 0x13, 0xf1, - 0x9d, 0xa7, 0xff, 0xf1, 0xe3, 0x2b, 0x40, 0x7f, 0x32, 0x9e, 0x24, 0x8c, 0x44, 0xed, 0xfb, 0x29, - 0x38, 0x1f, 0x78, 0xa5, 0x8a, 0x35, 0xf4, 0x73, 0xeb, 0x22, 0xa5, 0x87, 0x5c, 0x78, 0x84, 0xa0, - 0x15, 0x6f, 0xe0, 0x0c, 0xcf, 0x81, 0x5d, 0xd8, 0x98, 0x46, 0x4f, 0x9e, 0x87, 0x25, 0x04, 0x32, - 0x19, 0xb8, 0x87, 0x9e, 0xbc, 0xf7, 0xf5, 0x44, 0xa2, 0x15, 0xe4, 0x6b, 0x3f, 0x56, 0x60, 0x93, - 0x1b, 0x36, 0x57, 0xdd, 0x4e, 0x6f, 0xec, 0xf5, 0xdc, 0xde, 0xa1, 0xf7, 0xd9, 0xb8, 0xf8, 0xed, - 0x86, 0xf6, 0xb1, 0xeb, 0x61, 0xfb, 0xf5, 0xd8, 0xd7, 0xa6, 0xb7, 0x96, 0xdc, 0x42, 0x70, 0x9e, - 0x43, 0x36, 0x79, 0x33, 0xcc, 0xa5, 0xba, 0x47, 0x13, 0x64, 0x97, 0x6a, 0xa4, 0xd0, 0x7e, 0x1d, - 0xb6, 0x67, 0x7f, 0x80, 0x7c, 0x03, 0x56, 0x30, 0xda, 0x4b, 0x6b, 0x70, 0x3c, 0x74, 0xdb, 0x9e, - 0x50, 0x85, 0x09, 0x4d, 0xa4, 0x9c, 0xc7, 0xb0, 0x86, 0xb8, 0x8b, 0xef, 0x31, 0xc6, 0x91, 0xe1, - 0x4c, 0x21, 0xef, 0x01, 0xb9, 0x34, 0xed, 0x37, 0x14, 0x20, 0xf1, 0x32, 0xc8, 0x97, 0x60, 0xb9, - 0xd5, 0x2c, 0xd8, 0x63, 0x77, 0x38, 0x2e, 0xf7, 0x27, 0x43, 0x0e, 0xf4, 0xc3, 0x3c, 0x3e, 0xc7, - 0x87, 0x74, 0x2b, 0x19, 0x8e, 0x9d, 0x93, 0xfe, 0x64, 0x68, 0x85, 0xe8, 0x30, 0x4c, 0x89, 0xe7, - 0xbd, 0xd7, 0x76, 0x1f, 0x86, 0xc3, 0x94, 0xf0, 0xb4, 0x50, 0x98, 0x12, 0x9e, 0xa6, 0x7d, 0xa8, - 0xc0, 0x96, 0x30, 0x3e, 0x6a, 0x27, 0xd4, 0xa5, 0x80, 0xb8, 0x06, 0x43, 0x81, 0x2c, 0x39, 0x4b, - 0xa4, 0x5d, 0x17, 0xd0, 0x1f, 0x58, 0x41, 0x94, 0x6d, 0x19, 0x2f, 0xf9, 0x2a, 0x64, 0xec, 0x71, - 0x7f, 0x70, 0x06, 0xec, 0x0f, 0xd5, 0x1f, 0xd1, 0x71, 0x7f, 0x80, 0x45, 0x20, 0xa7, 0xe6, 0xc1, - 0x79, 0xb9, 0x72, 0xa2, 0xc6, 0xa4, 0x0a, 0x8b, 0x1c, 0xe4, 0x29, 0xf2, 0xce, 0x38, 0xa3, 0x4d, - 0x3b, 0x6b, 0x02, 0x60, 0x84, 0x23, 0x1b, 0x5a, 0xa2, 0x0c, 0xed, 0xf7, 0x15, 0xc8, 0x51, 0x69, - 0x03, 0x6f, 0x71, 0x4f, 0x3a, 0xa5, 0xc3, 0x82, 0xa3, 0x78, 0xa6, 0xf6, 0x8b, 0x3f, 0xd3, 0x69, - 0xfc, 0x0a, 0xac, 0x45, 0x18, 0x88, 0x86, 0xae, 0xe5, 0xdd, 0xce, 0xa1, 0xcb, 0xa2, 0x1e, 0xb0, - 0x37, 0xde, 0x50, 0x9a, 0xf6, 0x3b, 0x0a, 0x9c, 0xa7, 0x77, 0x7e, 0x13, 0xd5, 0xbd, 0xd6, 0xa4, - 0x2b, 0xd6, 0x3b, 0x95, 0xa0, 0x84, 0x15, 0x1b, 0x73, 0x7b, 0x65, 0x12, 0x14, 0x4f, 0xb3, 0xfc, - 0x5c, 0x52, 0x86, 0x2c, 0x3f, 0x5f, 0x46, 0x1c, 0x90, 0x70, 0x5b, 0x52, 0x26, 0x04, 0x05, 0x73, - 0x22, 0xda, 0x12, 0xdc, 0xc2, 0x38, 0x8f, 0xe5, 0x73, 0x6b, 0xff, 0xa5, 0xc0, 0xc5, 0x29, 0x3c, - 0xe4, 0x0d, 0x98, 0x47, 0x97, 0x1c, 0x3e, 0x7a, 0x97, 0xa6, 0x7c, 0x62, 0x7c, 0x78, 0xb2, 0x7f, - 0x9b, 0x1d, 0x44, 0xa7, 0xf4, 0x87, 0xc5, 0xb8, 0xc8, 0x3b, 0xb0, 0xa4, 0xb7, 0xdb, 0xfc, 0x3a, - 0x93, 0x0a, 0x5d, 0x67, 0xa6, 0x7c, 0xf1, 0x45, 0x9f, 0x9e, 0x5d, 0x67, 0x98, 0x71, 0x78, 0xbb, - 0xed, 0x70, 0x77, 0xa3, 0xa0, 0xbc, 0xcd, 0x5f, 0x86, 0xd5, 0x30, 0xf1, 0x63, 0x79, 0x48, 0xfc, - 0x50, 0x01, 0x35, 0x5c, 0x87, 0xcf, 0x07, 0x1a, 0x25, 0x69, 0x98, 0x1f, 0x31, 0xa9, 0xfe, 0x30, - 0x05, 0x4f, 0x25, 0xf6, 0x30, 0x79, 0x01, 0x16, 0xf4, 0xc1, 0xc0, 0x2c, 0xf2, 0x59, 0xc5, 0x25, - 0x24, 0xd4, 0x12, 0x87, 0x6e, 0x7b, 0x8c, 0x88, 0xbc, 0x0c, 0x59, 0x9c, 0x99, 0x94, 0x21, 0x15, - 0x40, 0x03, 0x32, 0x25, 0x4a, 0x04, 0x1a, 0x50, 0x10, 0x92, 0x12, 0xac, 0x72, 0x94, 0x04, 0xcb, - 0x3b, 0xf6, 0xbe, 0xed, 0x63, 0x54, 0x23, 0x8c, 0xb6, 0x50, 0x3d, 0x3b, 0x43, 0x96, 0x27, 0xe3, - 0x04, 0x84, 0xb9, 0x48, 0x05, 0x54, 0x2c, 0x53, 0x2e, 0x89, 0xe1, 0x13, 0x22, 0x6e, 0x05, 0xab, - 0xc4, 0x94, 0xb2, 0x62, 0x9c, 0xfe, 0x70, 0xe9, 0xa3, 0x51, 0xe7, 0xb8, 0x77, 0xea, 0xf5, 0xc6, - 0x9f, 0xdf, 0x70, 0x05, 0xdf, 0x38, 0xd3, 0x70, 0xfd, 0x71, 0x86, 0x2d, 0xe6, 0x28, 0x1b, 0x95, - 0x68, 0x24, 0x48, 0x5a, 0x94, 0x68, 0x30, 0x88, 0x37, 0xc3, 0x01, 0x28, 0xc2, 0x22, 0xc3, 0x67, - 0x10, 0x2b, 0xe3, 0x72, 0x62, 0x15, 0x18, 0xcd, 0xfe, 0x6d, 0x26, 0xbe, 0x30, 0xdf, 0xa0, 0x91, - 0x25, 0x58, 0xc9, 0x3e, 0xe4, 0x0a, 0x5d, 0xcf, 0xed, 0x4d, 0x06, 0xcd, 0xb3, 0xbd, 0x1e, 0x6e, - 0xf0, 0xb6, 0x2c, 0x1f, 0x32, 0x36, 0x7c, 0x75, 0xc4, 0x9d, 0x5c, 0x2e, 0x88, 0x34, 0x7d, 0x77, - 0x01, 0x16, 0x7a, 0xfd, 0x8b, 0x33, 0xfa, 0x27, 0x9a, 0x88, 0x7c, 0x61, 0x5f, 0x18, 0xee, 0x4f, - 0xe0, 0xc0, 0x6a, 0xc5, 0x1d, 0x8d, 0x9b, 0x43, 0xb7, 0x37, 0x42, 0x5c, 0xb7, 0x33, 0xe0, 0xde, - 0x6c, 0x89, 0x98, 0xa1, 0xa8, 0x63, 0x1c, 0xfb, 0xac, 0x4c, 0x83, 0x19, 0x2e, 0x8e, 0xca, 0x4b, - 0xa5, 0x4e, 0xcf, 0xed, 0x76, 0x3e, 0x10, 0x5e, 0x55, 0x4c, 0x5e, 0x3a, 0x12, 0x89, 0x56, 0x90, - 0xaf, 0x7d, 0x3d, 0x36, 0x6e, 0xac, 0x96, 0x39, 0x58, 0xe4, 0x3e, 0xb7, 0xcc, 0x07, 0xb5, 0x61, - 0xd4, 0x8a, 0x66, 0x6d, 0x57, 0x55, 0xc8, 0x2a, 0x40, 0xc3, 0xaa, 0x17, 0x0c, 0xdb, 0xa6, 0xbf, - 0x53, 0xf4, 0x37, 0x77, 0x50, 0x2d, 0xb5, 0x2a, 0x6a, 0x5a, 0xf2, 0x51, 0xcd, 0x68, 0x3f, 0x52, - 0xe0, 0x42, 0xf2, 0x50, 0x92, 0x26, 0xa0, 0x97, 0x32, 0x7f, 0x47, 0xfe, 0xd2, 0xcc, 0x71, 0x4f, - 0x4c, 0x8e, 0x7a, 0x3b, 0x8f, 0x99, 0x17, 0x6d, 0x4a, 0x3c, 0x16, 0x05, 0x81, 0xea, 0x3b, 0x6d, - 0xad, 0x00, 0x1b, 0xd3, 0xca, 0x08, 0x37, 0x75, 0x0d, 0x72, 0x7a, 0xa3, 0x51, 0x31, 0x0b, 0x7a, - 0xd3, 0xac, 0xd7, 0x54, 0x85, 0x2c, 0xc1, 0xfc, 0xae, 0x55, 0x6f, 0x35, 0xd4, 0x94, 0xf6, 0x03, - 0x05, 0x56, 0xcc, 0xc0, 0xca, 0xe4, 0x49, 0x17, 0xdf, 0xeb, 0xa1, 0xc5, 0xb7, 0xe1, 0xfb, 0xf3, - 0xfb, 0x1f, 0x38, 0xd3, 0xca, 0xfb, 0x07, 0x05, 0xd6, 0x63, 0x3c, 0xc4, 0x86, 0x45, 0xfd, 0xc0, - 0xae, 0x9b, 0xc5, 0x02, 0xaf, 0xd9, 0x95, 0xc0, 0x90, 0x05, 0x43, 0xb6, 0xc4, 0xbe, 0xc2, 0x7c, - 0xe0, 0x1e, 0x8c, 0x9c, 0x7e, 0xa7, 0x2d, 0x85, 0x5b, 0x2c, 0xcf, 0x59, 0xa2, 0x24, 0x3c, 0xc9, - 0x3e, 0x98, 0x0c, 0x3d, 0x2c, 0x36, 0x15, 0x52, 0x84, 0xfa, 0xe9, 0xf1, 0x82, 0xd1, 0x3e, 0xda, - 0xa5, 0xf9, 0xf1, 0xa2, 0x83, 0xf2, 0x76, 0x56, 0x20, 0xc7, 0x6f, 0x2d, 0x78, 0x21, 0xf8, 0x9e, - 0x02, 0x1b, 0xd3, 0xea, 0x4a, 0x2f, 0x42, 0x61, 0x87, 0xd8, 0x0b, 0x3e, 0x04, 0x7b, 0xd8, 0x13, - 0x56, 0x90, 0x91, 0x37, 0x21, 0x67, 0x8e, 0x46, 0x13, 0x6f, 0x68, 0xbf, 0xdc, 0xb2, 0x4c, 0x3e, - 0x41, 0x2e, 0xff, 0xfb, 0xc7, 0x57, 0x2e, 0xa2, 0x15, 0xf3, 0xd0, 0x19, 0xbd, 0xec, 0x4c, 0x86, - 0x9d, 0x10, 0x5c, 0xb5, 0xcc, 0xa1, 0x7d, 0x47, 0x81, 0xcd, 0xe9, 0x8d, 0xa4, 0xa7, 0x4c, 0x93, - 0xca, 0xe6, 0x81, 0x4f, 0x21, 0x9e, 0x32, 0x28, 0xaf, 0x47, 0x9c, 0x0a, 0x7d, 0x42, 0xca, 0xe4, - 0x87, 0x32, 0x4e, 0xc5, 0xe2, 0x97, 0x86, 0x99, 0x04, 0xa1, 0xf6, 0x1f, 0x29, 0xb8, 0x40, 0x27, - 0x50, 0xd7, 0x1b, 0x8d, 0xf4, 0xc9, 0xf8, 0xc4, 0xeb, 0x8d, 0xb9, 0x48, 0x45, 0x5e, 0x85, 0x85, - 0x93, 0xc7, 0x53, 0x1f, 0x32, 0x72, 0x42, 0x00, 0x37, 0x65, 0x61, 0x5f, 0x4d, 0xff, 0x27, 0x57, - 0x41, 0x8e, 0x18, 0x9b, 0x46, 0xcc, 0xba, 0xd4, 0x86, 0x62, 0x2d, 0x0d, 0xfc, 0xe0, 0x8e, 0xaf, - 0xc1, 0x3c, 0xaa, 0x0c, 0xf8, 0xf6, 0x28, 0xc4, 0xda, 0xe4, 0xda, 0xa1, 0x42, 0xc1, 0x62, 0x0c, - 0xe4, 0x25, 0x80, 0x00, 0xee, 0x9b, 0xef, 0x7f, 0xe2, 0x2a, 0xed, 0x23, 0x7e, 0x5b, 0x4b, 0xa7, - 0x47, 0x2e, 0xc7, 0xd0, 0xce, 0xc3, 0xba, 0xe8, 0x96, 0x81, 0x80, 0xba, 0xe2, 0x2f, 0x5b, 0x6b, - 0x2c, 0xc3, 0x1c, 0x08, 0xb8, 0xab, 0x6b, 0xb1, 0xa8, 0x97, 0x88, 0x78, 0x19, 0x09, 0x6d, 0x79, - 0x2d, 0x16, 0xda, 0x32, 0xcb, 0xa8, 0xe4, 0xf8, 0x95, 0xda, 0xbf, 0xa6, 0x60, 0xe9, 0x80, 0x0a, - 0x1e, 0x78, 0x9d, 0x9e, 0x7d, 0x3d, 0xbf, 0x03, 0xb9, 0x4a, 0xdf, 0xe5, 0x4f, 0x08, 0xdc, 0x2c, - 0x99, 0x39, 0xea, 0x75, 0xfb, 0xae, 0x78, 0x8d, 0x18, 0x59, 0x32, 0xd1, 0x23, 0x9c, 0x0c, 0xef, - 0xc1, 0x02, 0x7b, 0xd2, 0xe1, 0x9a, 0x22, 0x21, 0x7a, 0xfa, 0x35, 0x7a, 0x91, 0x65, 0x4b, 0x5a, - 0x6f, 0xf6, 0x2c, 0x24, 0xcb, 0x41, 0x1c, 0xb8, 0x4f, 0x52, 0x1e, 0xcc, 0x9f, 0x4d, 0x79, 0x20, - 0x01, 0x14, 0x2d, 0x9c, 0x05, 0xa0, 0x68, 0xf3, 0x2e, 0xe4, 0xa4, 0xfa, 0x3c, 0x96, 0x24, 0xfa, - 0x9b, 0x29, 0x58, 0xc1, 0x56, 0xf9, 0xf6, 0x1d, 0x3f, 0x9f, 0xaa, 0x90, 0xd7, 0x43, 0xaa, 0x90, - 0x0d, 0x79, 0xbc, 0x58, 0xcb, 0x66, 0xe8, 0x40, 0xee, 0xc1, 0x7a, 0x8c, 0x90, 0xbc, 0x02, 0xf3, - 0xb4, 0xfa, 0xe2, 0xea, 0xa8, 0x46, 0x67, 0x40, 0x00, 0x66, 0x49, 0x1b, 0x3e, 0xb2, 0x18, 0xb5, - 0xf6, 0xdf, 0x0a, 0x2c, 0x73, 0x2c, 0xf9, 0xde, 0x51, 0xff, 0x91, 0xdd, 0x79, 0x23, 0xda, 0x9d, - 0xcc, 0x65, 0x9e, 0x77, 0xe7, 0xff, 0x76, 0x27, 0xde, 0x0d, 0x75, 0xe2, 0x45, 0x1f, 0xda, 0x4a, - 0x34, 0x67, 0x46, 0x1f, 0xfe, 0x2d, 0x82, 0x3d, 0x86, 0x09, 0xc9, 0x37, 0x61, 0xa9, 0xe6, 0x3d, - 0x08, 0xdd, 0xc0, 0x6e, 0x4c, 0x29, 0xf4, 0x45, 0x9f, 0x90, 0xad, 0x29, 0x3c, 0xbc, 0x7a, 0xde, - 0x03, 0x27, 0xf6, 0x9a, 0x14, 0x14, 0x49, 0x2f, 0x61, 0x61, 0xb6, 0xc7, 0x99, 0xfa, 0xdc, 0x47, - 0x0a, 0x51, 0x20, 0xbe, 0x9b, 0x06, 0x08, 0xdc, 0x4b, 0xe8, 0x02, 0x0c, 0x3d, 0xa4, 0x0b, 0xe5, - 0x35, 0x26, 0xc9, 0x73, 0x5c, 0xbc, 0xaf, 0xdf, 0xe0, 0x4a, 0xd6, 0xd4, 0x74, 0xe8, 0x31, 0x54, - 0xb7, 0x16, 0xb8, 0x3f, 0x43, 0xdb, 0xeb, 0xba, 0x6c, 0x6f, 0x4f, 0xef, 0x5c, 0x43, 0xa4, 0x49, - 0x3f, 0x75, 0x4a, 0x50, 0x50, 0xf4, 0x7a, 0x28, 0x52, 0x82, 0x98, 0xcb, 0x56, 0xe6, 0xf1, 0x5c, - 0xb6, 0x1a, 0xb0, 0xd4, 0xe9, 0xbd, 0xef, 0xf5, 0xc6, 0xfd, 0xe1, 0x43, 0xd4, 0x2c, 0x07, 0x2a, - 0x2b, 0xda, 0x05, 0xa6, 0xc8, 0x63, 0xe3, 0x80, 0x07, 0xa3, 0x4f, 0x2f, 0x0f, 0x83, 0x9f, 0xe8, - 0xbb, 0x9c, 0xcd, 0xab, 0x0b, 0xf7, 0x32, 0xd9, 0x05, 0x75, 0xf1, 0x5e, 0x26, 0x9b, 0x55, 0x97, - 0xee, 0x65, 0xb2, 0x4b, 0x2a, 0x58, 0xd2, 0x5b, 0x8d, 0xff, 0x16, 0x23, 0x3d, 0x9f, 0x84, 0x9f, - 0x46, 0xb4, 0x9f, 0xa5, 0x80, 0xc4, 0xab, 0x41, 0x5e, 0x87, 0x1c, 0xdb, 0x60, 0x9d, 0xe1, 0xe8, - 0x5b, 0xdc, 0x82, 0x96, 0x61, 0x69, 0x48, 0xc9, 0x32, 0x96, 0x06, 0x4b, 0xb6, 0x46, 0xdf, 0xea, - 0x92, 0x6f, 0xc0, 0x39, 0xec, 0xde, 0x81, 0x37, 0xec, 0xf4, 0xdb, 0x0e, 0x02, 0x1f, 0xba, 0x5d, - 0x1e, 0xc0, 0xeb, 0x05, 0x8c, 0x34, 0x19, 0xcf, 0x9e, 0x32, 0x0c, 0xe8, 0x45, 0xd2, 0x40, 0xca, - 0x06, 0x23, 0x24, 0x4d, 0x50, 0x65, 0xfe, 0xa3, 0x49, 0xb7, 0xcb, 0x47, 0x36, 0x4f, 0x2f, 0xad, - 0xd1, 0xbc, 0x29, 0x05, 0xaf, 0x06, 0x05, 0x97, 0x26, 0xdd, 0x2e, 0x79, 0x15, 0xa0, 0xdf, 0x73, - 0x4e, 0x3b, 0xa3, 0x11, 0x7b, 0xaf, 0xf0, 0x1d, 0xde, 0x82, 0x54, 0x79, 0x30, 0xfa, 0xbd, 0x2a, - 0x4b, 0x24, 0xbf, 0x04, 0xe8, 0x82, 0x8b, 0xbe, 0xe9, 0xcc, 0x42, 0x85, 0x43, 0xf2, 0x8b, 0xc4, - 0xb0, 0x7f, 0xdd, 0xb1, 0x67, 0x77, 0x3e, 0x10, 0xd6, 0xcb, 0x6f, 0xc3, 0x3a, 0xb7, 0x0d, 0x3d, - 0xe8, 0x8c, 0x4f, 0xb8, 0xb4, 0xfc, 0x24, 0xa2, 0xb6, 0x24, 0x2e, 0xff, 0x53, 0x06, 0x40, 0x3f, - 0xb0, 0x05, 0xec, 0xcb, 0x2d, 0x98, 0xa7, 0x77, 0x00, 0xa1, 0x4b, 0x40, 0x4d, 0x2c, 0x96, 0x2b, - 0x6b, 0x62, 0x91, 0x82, 0xae, 0x46, 0x0b, 0x2d, 0xc8, 0x85, 0x1e, 0x01, 0x57, 0x23, 0x33, 0x2a, - 0x0f, 0xc1, 0x6e, 0x72, 0x2a, 0x52, 0x01, 0x08, 0x80, 0x58, 0xf8, 0xad, 0x74, 0x3d, 0x40, 0x34, - 0xe0, 0x19, 0x1c, 0xfa, 0x3b, 0x00, 0x73, 0x91, 0xa7, 0x4f, 0x40, 0x46, 0xf6, 0x20, 0xd3, 0x74, - 0x7d, 0x77, 0xae, 0x29, 0xf0, 0x34, 0xcf, 0xf0, 0x00, 0x6b, 0x01, 0x44, 0xcd, 0xea, 0xd8, 0x0d, - 0xc5, 0xa1, 0xc4, 0x42, 0x88, 0x01, 0x0b, 0x3c, 0x78, 0xee, 0x14, 0x58, 0x33, 0x1e, 0x3b, 0x97, - 0x83, 0x99, 0x62, 0xa2, 0x2c, 0x53, 0xf0, 0x30, 0xb9, 0x77, 0x20, 0x6d, 0xdb, 0x55, 0xee, 0x94, - 0xbd, 0x12, 0xdc, 0x30, 0x6c, 0xbb, 0x2a, 0x22, 0xc3, 0x9f, 0x4a, 0x6c, 0x94, 0x98, 0x7c, 0x19, - 0x72, 0x92, 0xf8, 0xcc, 0xe1, 0x0c, 0xb0, 0x0f, 0x24, 0x03, 0x7e, 0x79, 0xd3, 0x90, 0xa8, 0x49, - 0x05, 0xd4, 0xbd, 0xc9, 0xbb, 0x9e, 0x3e, 0x18, 0xa0, 0x27, 0xcd, 0xfb, 0xde, 0x90, 0x89, 0x6d, - 0xd9, 0x00, 0x07, 0x14, 0x1d, 0x91, 0xda, 0x22, 0x57, 0xd6, 0xa7, 0x44, 0x39, 0x49, 0x03, 0xd6, - 0x6d, 0x6f, 0x3c, 0x19, 0x30, 0x9b, 0x8b, 0x52, 0x7f, 0x48, 0x2f, 0x14, 0x0c, 0xfc, 0x00, 0x21, - 0x13, 0x47, 0x34, 0x53, 0x18, 0xba, 0x1c, 0xf5, 0x87, 0x91, 0xcb, 0x45, 0x9c, 0x59, 0xf3, 0xe4, - 0x21, 0xa7, 0xa7, 0x6a, 0xf8, 0x9a, 0x82, 0xa7, 0xaa, 0xb8, 0xa6, 0x04, 0x97, 0x93, 0x97, 0x12, - 0x00, 0x7a, 0xf0, 0xf1, 0x4b, 0x02, 0xe8, 0x09, 0xc1, 0xf2, 0x7c, 0x98, 0x91, 0x30, 0xe2, 0xf8, - 0x58, 0xbc, 0x01, 0x70, 0xaf, 0xdf, 0xe9, 0x55, 0xbd, 0xf1, 0x49, 0xbf, 0x2d, 0xe1, 0x04, 0xe5, - 0x7e, 0xb5, 0xdf, 0xe9, 0x39, 0xa7, 0x98, 0xfc, 0xb3, 0x8f, 0xaf, 0x48, 0x44, 0x96, 0xf4, 0x3f, - 0xf9, 0x02, 0x2c, 0xd1, 0x5f, 0xcd, 0xc0, 0x72, 0x84, 0xa9, 0x1d, 0x91, 0x9b, 0x21, 0xa9, 0x07, - 0x04, 0xe4, 0x2e, 0xc6, 0x0e, 0xe8, 0x0c, 0xc6, 0x92, 0xf0, 0x2a, 0x02, 0x05, 0x74, 0x06, 0xe3, - 0x28, 0xec, 0xa7, 0x44, 0x4c, 0xca, 0x7e, 0xd5, 0x45, 0xb8, 0x0f, 0x1e, 0xa2, 0x00, 0x75, 0x6b, - 0x7c, 0xae, 0x39, 0x02, 0x6f, 0x50, 0x0e, 0xcc, 0x18, 0x61, 0xc3, 0x4a, 0xd8, 0xe5, 0x22, 0x7b, - 0x0c, 0xe1, 0x42, 0xad, 0x88, 0x6c, 0xdf, 0x76, 0x0e, 0x31, 0x39, 0x54, 0x09, 0x9f, 0x98, 0xec, - 0xc0, 0x1a, 0x93, 0xf1, 0xfd, 0xb0, 0x61, 0x5c, 0xc4, 0xc5, 0xbd, 0x2d, 0x88, 0x2b, 0x26, 0x7f, - 0x3e, 0xc2, 0x40, 0x4a, 0x30, 0x8f, 0x17, 0x42, 0x6e, 0xf9, 0xbd, 0x25, 0xdf, 0x84, 0xa3, 0xeb, - 0x08, 0xf7, 0x15, 0xbc, 0x03, 0xcb, 0xfb, 0x0a, 0x92, 0x92, 0xaf, 0x01, 0x18, 0xbd, 0x61, 0xbf, - 0xdb, 0x45, 0x44, 0xcc, 0x2c, 0x5e, 0xa5, 0x2e, 0x87, 0xd7, 0x23, 0x96, 0x12, 0x10, 0x71, 0xf4, - 0x26, 0xfc, 0xed, 0x44, 0x70, 0x33, 0xa5, 0xb2, 0x34, 0x13, 0x16, 0xd8, 0x62, 0x44, 0x74, 0x59, - 0x8e, 0x97, 0x2f, 0x61, 0x93, 0x32, 0x74, 0x59, 0x9e, 0x1e, 0x47, 0x97, 0x95, 0x18, 0xb4, 0x3d, - 0x38, 0x9f, 0xd4, 0xb0, 0xd0, 0x15, 0x56, 0x39, 0xeb, 0x15, 0xf6, 0xcf, 0xd3, 0xb0, 0x8c, 0xa5, - 0x89, 0x5d, 0x58, 0x87, 0x15, 0x7b, 0xf2, 0xae, 0x0f, 0xbd, 0x22, 0x76, 0x63, 0xac, 0xdf, 0x48, - 0xce, 0x90, 0x9f, 0xa9, 0x42, 0x1c, 0xc4, 0x80, 0x55, 0x71, 0x12, 0xec, 0x0a, 0x6b, 0x72, 0x1f, - 0xd8, 0x55, 0xc0, 0x87, 0xc5, 0xc3, 0x26, 0x46, 0x98, 0x82, 0xf3, 0x20, 0xfd, 0x38, 0xe7, 0x41, - 0xe6, 0x4c, 0xe7, 0xc1, 0x3b, 0xb0, 0x2c, 0xbe, 0x86, 0x3b, 0xf9, 0xfc, 0x93, 0xed, 0xe4, 0xa1, - 0xc2, 0x48, 0xc5, 0xdf, 0xd1, 0x17, 0x66, 0xee, 0xe8, 0xf8, 0xf6, 0x27, 0x56, 0x59, 0x2c, 0x12, - 0x3a, 0x2f, 0x03, 0xe3, 0x8a, 0xed, 0x16, 0x1a, 0x9f, 0xe2, 0x94, 0x7c, 0x05, 0x96, 0x2a, 0x7d, - 0xf1, 0xec, 0x23, 0xe9, 0xdb, 0xbb, 0x22, 0x51, 0x16, 0x17, 0x7c, 0x4a, 0xff, 0x74, 0x4b, 0x7f, - 0x16, 0xa7, 0xdb, 0x5d, 0x00, 0xee, 0xa6, 0x10, 0xc4, 0x03, 0xc2, 0x25, 0x23, 0x9c, 0xdc, 0xc3, - 0x6a, 0x7f, 0x89, 0x98, 0xee, 0x4e, 0xdc, 0xa2, 0x44, 0x3f, 0x3c, 0xec, 0x4f, 0x7a, 0xe3, 0x50, - 0x00, 0x4d, 0xe1, 0x94, 0xe5, 0xf2, 0x3c, 0x79, 0x7b, 0x88, 0xb0, 0x7d, 0xb6, 0x03, 0x42, 0xde, - 0xf2, 0x0d, 0xe2, 0x16, 0x67, 0xf5, 0x90, 0x16, 0xeb, 0xa1, 0xa9, 0x66, 0x70, 0xda, 0x8f, 0x14, - 0x19, 0x55, 0xfb, 0x53, 0x0c, 0xf5, 0x6b, 0x00, 0xfe, 0xbb, 0xbb, 0x18, 0x6b, 0x76, 0x5f, 0xf2, - 0x53, 0xe5, 0x5e, 0x0e, 0x68, 0xa5, 0xd6, 0xa4, 0x3f, 0xab, 0xd6, 0x34, 0x21, 0x57, 0x7f, 0x6f, - 0xec, 0x06, 0x86, 0x1a, 0x60, 0xfb, 0x92, 0x2c, 0xee, 0x4c, 0xe9, 0x9d, 0xeb, 0x78, 0x36, 0x04, - 0x72, 0xf0, 0x14, 0x11, 0x58, 0x62, 0xd4, 0xde, 0x82, 0x35, 0xd9, 0x91, 0xf4, 0x61, 0xef, 0x90, - 0x7c, 0x85, 0x61, 0xfc, 0x29, 0xa1, 0x1b, 0x8b, 0x44, 0x44, 0x77, 0xdc, 0x87, 0xbd, 0x43, 0x26, - 0xff, 0xb8, 0x0f, 0xe4, 0xba, 0xe2, 0x1d, 0xef, 0x27, 0x0a, 0x90, 0x38, 0xb9, 0xbc, 0x9b, 0x28, - 0xff, 0x07, 0xd2, 0x65, 0x44, 0x2a, 0xcb, 0x3c, 0x8e, 0x54, 0x96, 0xff, 0x03, 0x05, 0xd6, 0x4c, - 0xbd, 0xca, 0x21, 0xb0, 0xd9, 0xfb, 0xc1, 0x55, 0xb8, 0x6c, 0xea, 0x55, 0xa7, 0x51, 0xaf, 0x98, - 0x85, 0xfb, 0x4e, 0x22, 0xb2, 0xe5, 0x65, 0x78, 0x3a, 0x4e, 0x12, 0xbc, 0x33, 0x5c, 0x82, 0x8d, - 0x78, 0xb6, 0x40, 0xbf, 0x4c, 0x66, 0x16, 0x40, 0x99, 0xe9, 0xfc, 0x9b, 0xb0, 0x26, 0x90, 0x1e, - 0x9b, 0x15, 0x1b, 0xb1, 0xa4, 0xd7, 0x20, 0xb7, 0x6f, 0x58, 0x66, 0xe9, 0xbe, 0x53, 0x6a, 0x55, - 0x2a, 0xea, 0x1c, 0x59, 0x81, 0x25, 0x9e, 0x50, 0xd0, 0x55, 0x85, 0x2c, 0x43, 0xd6, 0xac, 0xd9, - 0x46, 0xa1, 0x65, 0x19, 0x6a, 0x2a, 0xff, 0x26, 0xac, 0x36, 0x86, 0x9d, 0xf7, 0xdd, 0xb1, 0xb7, - 0xe7, 0x3d, 0xc4, 0x67, 0x82, 0x45, 0x48, 0x5b, 0xfa, 0x81, 0x3a, 0x47, 0x00, 0x16, 0x1a, 0x7b, - 0x05, 0xfb, 0xf6, 0x6d, 0x55, 0x21, 0x39, 0x58, 0xdc, 0x2d, 0x34, 0x9c, 0xbd, 0xaa, 0xad, 0xa6, - 0xe8, 0x0f, 0xfd, 0xc0, 0xc6, 0x1f, 0xe9, 0xfc, 0x17, 0x61, 0x1d, 0x65, 0x85, 0x4a, 0x67, 0x34, - 0xf6, 0x7a, 0xde, 0x10, 0xeb, 0xb0, 0x0c, 0x59, 0xdb, 0xa3, 0x8b, 0x7c, 0xec, 0xb1, 0x0a, 0x54, - 0x27, 0xdd, 0x71, 0x67, 0xd0, 0xf5, 0xbe, 0xad, 0x2a, 0xf9, 0xbb, 0xb0, 0x66, 0xf5, 0x27, 0xe3, - 0x4e, 0xef, 0xd8, 0x1e, 0x53, 0x8a, 0xe3, 0x87, 0xe4, 0x29, 0x58, 0x6f, 0xd5, 0xf4, 0xea, 0x8e, - 0xb9, 0xdb, 0xaa, 0xb7, 0x6c, 0xa7, 0xaa, 0x37, 0x0b, 0x65, 0xf6, 0x48, 0x51, 0xad, 0xdb, 0x4d, - 0xc7, 0x32, 0x0a, 0x46, 0xad, 0xa9, 0x2a, 0xf9, 0xef, 0xa3, 0xda, 0xe3, 0xb0, 0xdf, 0x6b, 0x97, - 0x5c, 0x8c, 0x2d, 0x4e, 0x2b, 0xac, 0xc1, 0xb6, 0x6d, 0x14, 0xea, 0xb5, 0xa2, 0x53, 0xd2, 0x0b, - 0xcd, 0xba, 0x95, 0x04, 0xad, 0xba, 0x09, 0x17, 0x12, 0x68, 0xea, 0xcd, 0x86, 0xaa, 0x90, 0x2b, - 0xb0, 0x95, 0x90, 0x77, 0x60, 0xec, 0xe8, 0xad, 0x66, 0xb9, 0xa6, 0xa6, 0xa6, 0x30, 0xdb, 0x76, - 0x5d, 0x4d, 0xe7, 0x7f, 0x57, 0x81, 0xd5, 0xd6, 0x88, 0x5b, 0x08, 0xb7, 0xd0, 0xcf, 0xef, 0x19, - 0xb8, 0xd4, 0xb2, 0x0d, 0xcb, 0x69, 0xd6, 0xf7, 0x8c, 0x9a, 0xd3, 0xb2, 0xf5, 0xdd, 0x68, 0x6d, - 0xae, 0xc0, 0x96, 0x44, 0x61, 0x19, 0x85, 0xfa, 0xbe, 0x61, 0x39, 0x0d, 0xdd, 0xb6, 0x0f, 0xea, - 0x56, 0x51, 0x55, 0xe8, 0x17, 0x13, 0x08, 0xaa, 0x25, 0x9d, 0xd5, 0x26, 0x94, 0x57, 0x33, 0x0e, - 0xf4, 0x8a, 0xb3, 0x53, 0x6f, 0xaa, 0xe9, 0x7c, 0x95, 0x1e, 0xbd, 0x08, 0x70, 0xc8, 0xec, 0xda, - 0xb2, 0x90, 0xa9, 0xd5, 0x6b, 0x46, 0xf4, 0x69, 0x6b, 0x19, 0xb2, 0x7a, 0xa3, 0x61, 0xd5, 0xf7, - 0x71, 0x8a, 0x01, 0x2c, 0x14, 0x8d, 0x1a, 0xad, 0x59, 0x9a, 0xe6, 0x34, 0xac, 0x7a, 0xb5, 0xde, - 0x34, 0x8a, 0x6a, 0x26, 0x6f, 0x89, 0x25, 0x2c, 0x0a, 0x3d, 0xec, 0xb3, 0x77, 0xa4, 0xa2, 0x51, - 0xd2, 0x5b, 0x95, 0x26, 0x1f, 0xa2, 0xfb, 0x8e, 0x65, 0xbc, 0xd5, 0x32, 0xec, 0xa6, 0xad, 0x2a, - 0x44, 0x85, 0xe5, 0x9a, 0x61, 0x14, 0x6d, 0xc7, 0x32, 0xf6, 0x4d, 0xe3, 0x40, 0x4d, 0xd1, 0x32, - 0xd9, 0xff, 0xf4, 0x0b, 0xf9, 0x0f, 0x15, 0x20, 0x0c, 0x1c, 0x52, 0x44, 0x1c, 0xc0, 0x19, 0xb3, - 0x0d, 0x9b, 0x65, 0x3a, 0xd4, 0xd8, 0xb4, 0x6a, 0xbd, 0x18, 0xed, 0xb2, 0x0b, 0x40, 0x22, 0xf9, - 0xf5, 0x52, 0x49, 0x55, 0xc8, 0x16, 0x9c, 0x8b, 0xa4, 0x17, 0xad, 0x7a, 0x43, 0x4d, 0x6d, 0xa6, - 0xb2, 0x0a, 0xb9, 0x18, 0xcb, 0xdc, 0x33, 0x8c, 0x86, 0x9a, 0xa6, 0x43, 0x14, 0xc9, 0x10, 0x4b, - 0x82, 0xb1, 0x67, 0xf2, 0xdf, 0x51, 0xe0, 0x02, 0xab, 0xa6, 0x58, 0x5f, 0x7e, 0x55, 0x2f, 0xc1, - 0x06, 0x87, 0xbc, 0x4d, 0xaa, 0xe8, 0x79, 0x50, 0x43, 0xb9, 0xac, 0x9a, 0x4f, 0xc1, 0x7a, 0x28, - 0x15, 0xeb, 0x91, 0xa2, 0xbb, 0x47, 0x28, 0x79, 0xc7, 0xb0, 0x9b, 0x8e, 0x51, 0x2a, 0xd5, 0xad, - 0x26, 0xab, 0x48, 0x3a, 0xaf, 0xc1, 0x7a, 0xc1, 0x1b, 0x8e, 0xe9, 0xad, 0xa8, 0x37, 0xea, 0xf4, - 0x7b, 0x58, 0x85, 0x15, 0x58, 0x32, 0xbe, 0xd6, 0x34, 0x6a, 0xb6, 0x59, 0xaf, 0xa9, 0x73, 0xf9, - 0x4b, 0x11, 0x1a, 0xb1, 0x8e, 0x6d, 0xbb, 0xac, 0xce, 0xe5, 0x5d, 0x58, 0x11, 0xb6, 0xb8, 0x6c, - 0x56, 0x6c, 0xc3, 0xa6, 0x98, 0x6b, 0xb8, 0xa3, 0x44, 0x9b, 0xb0, 0x01, 0xe7, 0xe3, 0xf9, 0x46, - 0x53, 0x55, 0xe8, 0x28, 0x44, 0x72, 0x68, 0x7a, 0x2a, 0xff, 0xdb, 0x0a, 0xac, 0xf8, 0xef, 0x19, - 0xa8, 0x41, 0xbd, 0x02, 0x5b, 0xd5, 0x92, 0xee, 0x14, 0x8d, 0x7d, 0xb3, 0x60, 0x38, 0x7b, 0x66, - 0xad, 0x18, 0xf9, 0xc8, 0xd3, 0xf0, 0x54, 0x02, 0x01, 0x7e, 0x65, 0x03, 0xce, 0x47, 0xb3, 0x9a, - 0x74, 0xa9, 0xa6, 0x68, 0xd7, 0x47, 0x73, 0xfc, 0x75, 0x9a, 0xce, 0xff, 0x99, 0x02, 0x1b, 0x3c, - 0xa4, 0x33, 0x7f, 0x59, 0x61, 0x58, 0xff, 0x08, 0x86, 0x99, 0x87, 0x1b, 0x4d, 0xab, 0x65, 0x37, - 0x8d, 0xa2, 0x60, 0xa7, 0x93, 0xd6, 0xb4, 0x8c, 0xaa, 0x51, 0x6b, 0x46, 0xea, 0xf6, 0x3c, 0x3c, - 0x37, 0x83, 0xb6, 0x56, 0x6f, 0x8a, 0xdf, 0x74, 0xad, 0x3e, 0x07, 0xcf, 0xce, 0x20, 0xf6, 0x09, - 0x53, 0xf9, 0x7d, 0x58, 0xb5, 0xf5, 0x6a, 0xa5, 0xd4, 0x1f, 0x1e, 0x7a, 0xfa, 0x64, 0x7c, 0xd2, - 0x23, 0x5b, 0x70, 0xb1, 0x54, 0xb7, 0x0a, 0x86, 0x83, 0x2d, 0x88, 0x54, 0xe2, 0x1c, 0xac, 0xc9, - 0x99, 0xf7, 0x0d, 0xba, 0xba, 0x08, 0xac, 0xca, 0x89, 0xb5, 0xba, 0x9a, 0xca, 0x7f, 0x1d, 0x96, - 0x43, 0x71, 0x91, 0x2e, 0xc2, 0x39, 0xf9, 0x77, 0xc3, 0xeb, 0xb5, 0x3b, 0xbd, 0x63, 0x75, 0x2e, - 0x9a, 0x61, 0x4d, 0x7a, 0x3d, 0x9a, 0x81, 0xdb, 0x8d, 0x9c, 0xd1, 0xf4, 0x86, 0xa7, 0x9d, 0x9e, - 0x3b, 0xf6, 0xda, 0x6a, 0x2a, 0xff, 0x22, 0xac, 0x84, 0xd0, 0x58, 0xe9, 0xbc, 0xaa, 0xd4, 0xf9, - 0xf9, 0x50, 0x35, 0x8a, 0x66, 0xab, 0xaa, 0xce, 0xd3, 0x8d, 0xa6, 0x6c, 0xee, 0x96, 0x55, 0xc8, - 0xff, 0x40, 0xa1, 0x37, 0x14, 0xec, 0xf7, 0x6a, 0x49, 0x17, 0x33, 0x91, 0xae, 0x02, 0x86, 0xf1, - 0x6c, 0xd8, 0x36, 0x7b, 0x70, 0xbe, 0x04, 0x1b, 0xfc, 0x87, 0xa3, 0xd7, 0x8a, 0x4e, 0x59, 0xb7, - 0x8a, 0x07, 0xba, 0x45, 0x97, 0xc6, 0x7d, 0x35, 0x85, 0xeb, 0x5d, 0x4a, 0x71, 0x9a, 0xf5, 0x56, - 0xa1, 0xac, 0xa6, 0xe9, 0xf2, 0x0a, 0xa5, 0x37, 0xcc, 0x9a, 0x9a, 0xc1, 0xdd, 0x23, 0x46, 0x8d, - 0xc5, 0xd2, 0xfc, 0xf9, 0xfc, 0x27, 0x0a, 0x5c, 0xb4, 0x3b, 0xc7, 0x3d, 0x77, 0x3c, 0x19, 0x7a, - 0x7a, 0xf7, 0xb8, 0x3f, 0xec, 0x8c, 0x4f, 0x4e, 0xed, 0x49, 0x67, 0xec, 0x91, 0x5b, 0x70, 0xdd, - 0x36, 0x77, 0x6b, 0x7a, 0x93, 0xae, 0x7e, 0xbd, 0xb2, 0x5b, 0xb7, 0xcc, 0x66, 0xb9, 0xea, 0xd8, - 0x2d, 0x33, 0xb6, 0x30, 0xae, 0xc1, 0x33, 0xd3, 0x49, 0x2b, 0xc6, 0xae, 0x5e, 0xb8, 0xaf, 0x2a, - 0xb3, 0x0b, 0xdc, 0xd1, 0x2b, 0x7a, 0xad, 0x60, 0x14, 0x9d, 0xfd, 0xdb, 0x6a, 0x8a, 0x5c, 0x87, - 0xab, 0xd3, 0x49, 0x4b, 0x66, 0xc3, 0xa6, 0x64, 0xe9, 0xd9, 0xdf, 0x2d, 0xdb, 0x55, 0x4a, 0x95, - 0xc9, 0x77, 0x40, 0x8d, 0xba, 0xa7, 0xc7, 0xcc, 0x1b, 0xac, 0x56, 0xad, 0xc6, 0xce, 0x80, 0x35, - 0xc8, 0xd5, 0x9b, 0x65, 0xc3, 0xe2, 0x50, 0xe3, 0x88, 0x2d, 0xde, 0xaa, 0xd1, 0x69, 0x55, 0xb7, - 0xcc, 0xb7, 0xf1, 0x30, 0xd8, 0x80, 0xf3, 0x76, 0x45, 0x2f, 0xec, 0xe1, 0x8c, 0x37, 0x6b, 0x4e, - 0xa1, 0xac, 0xd7, 0x6a, 0x46, 0x45, 0x85, 0xfc, 0x9f, 0x2a, 0xcc, 0xce, 0x20, 0xc9, 0x8f, 0x8d, - 0x7c, 0x01, 0x6e, 0xd6, 0xf7, 0x9a, 0xba, 0xd3, 0xa8, 0xb4, 0x76, 0xcd, 0x9a, 0x63, 0xdf, 0xaf, - 0x15, 0x84, 0xe0, 0x52, 0x88, 0xef, 0x97, 0x37, 0xe1, 0xda, 0x4c, 0xea, 0x00, 0x14, 0xfc, 0x06, - 0x68, 0x33, 0x29, 0x79, 0x43, 0xf2, 0x3f, 0x56, 0x60, 0x6b, 0xc6, 0xdb, 0x2c, 0x79, 0x01, 0x6e, - 0x95, 0x0d, 0xbd, 0x58, 0x31, 0x6c, 0x1b, 0x97, 0x91, 0x51, 0x6b, 0x72, 0x33, 0x88, 0xc4, 0xdd, - 0xf0, 0x16, 0x5c, 0x9f, 0x4d, 0x1e, 0x9c, 0xab, 0x37, 0xe1, 0xda, 0x6c, 0x52, 0x7e, 0xce, 0xa6, - 0xe8, 0x6e, 0x34, 0x9b, 0xd2, 0x3f, 0x9f, 0xd3, 0xf9, 0xef, 0x29, 0x70, 0x21, 0x59, 0x41, 0x42, - 0xeb, 0x66, 0xd6, 0xec, 0xa6, 0x5e, 0xa9, 0x38, 0x0d, 0xdd, 0xd2, 0xab, 0x8e, 0x51, 0xb3, 0xea, - 0x95, 0x4a, 0xd2, 0xb9, 0x74, 0x0d, 0x9e, 0x99, 0x4e, 0x6a, 0x17, 0x2c, 0xb3, 0x41, 0xb7, 0x5e, - 0x0d, 0xb6, 0xa7, 0x53, 0x19, 0x66, 0xc1, 0x50, 0x53, 0x3b, 0x6f, 0x7c, 0xf4, 0x2f, 0xdb, 0x73, - 0x1f, 0x7d, 0xb2, 0xad, 0xfc, 0xe4, 0x93, 0x6d, 0xe5, 0x9f, 0x3f, 0xd9, 0x56, 0xde, 0x7e, 0xfe, - 0x6c, 0xf1, 0x34, 0x50, 0x68, 0x7f, 0x77, 0x01, 0xed, 0x7e, 0x5e, 0xfe, 0x9f, 0x00, 0x00, 0x00, - 0xff, 0xff, 0xee, 0xd6, 0xab, 0xfe, 0x26, 0xa9, 0x01, 0x00, + 0x32, 0x65, 0xf2, 0x21, 0x64, 0xd7, 0xff, 0x9f, 0xbd, 0x6f, 0xfb, 0x71, 0xe3, 0xc8, 0xee, 0x9e, + 0x26, 0x39, 0xb7, 0xc3, 0xb9, 0xf4, 0x94, 0x64, 0x69, 0x3c, 0x92, 0x46, 0x56, 0xeb, 0xb2, 0x12, + 0x7d, 0x95, 0xfc, 0x79, 0x6d, 0x79, 0x3f, 0xaf, 0xb7, 0x49, 0x36, 0x87, 0x94, 0x78, 0x73, 0x37, + 0x39, 0xb3, 0xb2, 0x77, 0xb7, 0xd3, 0x1e, 0xf6, 0xcc, 0x30, 0xe6, 0x90, 0x5c, 0xb2, 0x69, 0x59, + 0x46, 0x80, 0xdc, 0x80, 0x5d, 0x20, 0xc9, 0x66, 0x73, 0x03, 0xb2, 0x08, 0x02, 0xe4, 0x21, 0x46, + 0x10, 0x20, 0xf9, 0x0b, 0x72, 0x79, 0xc8, 0x9b, 0x81, 0xc5, 0x02, 0xfb, 0x10, 0xe4, 0x21, 0x01, + 0x84, 0xc4, 0x40, 0xf2, 0xe0, 0xe4, 0x2d, 0xc8, 0x3e, 0xec, 0x53, 0x50, 0xa7, 0xaa, 0xba, 0xab, + 0x2f, 0xa4, 0x46, 0x96, 0x9d, 0x64, 0x81, 0x7d, 0x9a, 0x61, 0xd5, 0xa9, 0xea, 0xba, 0xd7, 0x39, + 0xa7, 0xce, 0xf9, 0x1d, 0xf2, 0x3c, 0x10, 0x9f, 0x4f, 0xf6, 0x37, 0x26, 0xff, 0xe0, 0x86, 0xc8, + 0xf1, 0x77, 0x14, 0xff, 0xec, 0xdf, 0xa4, 0xe0, 0x54, 0x02, 0x33, 0x4f, 0x99, 0xee, 0x6e, 0xdf, + 0x73, 0x0f, 0x19, 0xcb, 0x2e, 0x77, 0x72, 0x5d, 0x4a, 0xe7, 0x1a, 0x9a, 0x05, 0x16, 0x83, 0x9b, + 0x7f, 0x8b, 0xff, 0xa2, 0x9b, 0xd5, 0x19, 0x09, 0xe5, 0x03, 0xfd, 0x97, 0x54, 0x60, 0x03, 0x03, + 0x0b, 0x8c, 0xbb, 0x03, 0x8c, 0x4f, 0x80, 0x97, 0x7e, 0x26, 0x24, 0x02, 0x61, 0x2b, 0x9a, 0x12, + 0x11, 0xbd, 0xf5, 0x4d, 0x75, 0x18, 0x49, 0x21, 0x5f, 0x81, 0x2d, 0xe9, 0x6c, 0xb7, 0x23, 0x4b, + 0x1d, 0x6d, 0xbd, 0xcd, 0xb3, 0x8e, 0x7f, 0xca, 0x17, 0x43, 0x8b, 0x3e, 0x0f, 0xdb, 0x38, 0x89, + 0xdd, 0xce, 0xd0, 0x8e, 0x45, 0xa2, 0xc0, 0xae, 0x32, 0xe8, 0xf6, 0x2d, 0x4a, 0x55, 0xe9, 0x0c, + 0x23, 0x41, 0x29, 0x68, 0xaf, 0xf9, 0xf0, 0xbd, 0x03, 0x4f, 0x25, 0xb6, 0x98, 0x1e, 0xe8, 0x68, + 0x4a, 0x14, 0xf0, 0x22, 0x8b, 0xf4, 0x37, 0x65, 0x46, 0x2e, 0xc1, 0xca, 0xbb, 0xae, 0x33, 0x72, + 0x47, 0xfc, 0xa6, 0xe4, 0x4b, 0x82, 0xa5, 0xc9, 0x17, 0xe5, 0x9f, 0xa5, 0x84, 0x18, 0x92, 0x1f, + 0x0c, 0xbc, 0xb1, 0x37, 0x72, 0x86, 0x21, 0x05, 0x08, 0x39, 0x86, 0xa7, 0xf1, 0x96, 0xbe, 0x85, + 0xc0, 0xf5, 0x83, 0x91, 0xf0, 0xd4, 0xdf, 0x17, 0xd6, 0xaf, 0xd9, 0x5b, 0x2f, 0x86, 0xf9, 0x08, + 0x9d, 0x52, 0xeb, 0x32, 0x31, 0xe5, 0x9a, 0xa5, 0x5a, 0xcb, 0x73, 0xe6, 0x59, 0x56, 0x67, 0x8c, + 0x8a, 0x94, 0x13, 0x1a, 0x1e, 0xd5, 0x80, 0xe4, 0x83, 0x5e, 0x84, 0x6b, 0x95, 0xfb, 0x47, 0xbe, + 0x0a, 0xcb, 0xdd, 0x8e, 0x1c, 0x9f, 0x2d, 0x2a, 0x7b, 0x57, 0x3a, 0x0c, 0x23, 0x36, 0xa8, 0xa3, + 0x3c, 0x67, 0x2e, 0x75, 0x79, 0x6a, 0x7e, 0x35, 0xa4, 0x2a, 0xd2, 0xf2, 0x82, 0xe3, 0x8d, 0x17, + 0x23, 0x6b, 0x90, 0xf2, 0x4f, 0x82, 0x54, 0xb7, 0x43, 0x57, 0xeb, 0x58, 0x42, 0xa9, 0x35, 0xf9, + 0x2f, 0xed, 0x97, 0xe0, 0xfa, 0x49, 0xc7, 0x88, 0xee, 0xb4, 0x29, 0x03, 0xbe, 0x6c, 0x6e, 0x38, + 0xb1, 0x71, 0xbb, 0x04, 0x32, 0xc8, 0x66, 0x57, 0x4c, 0xb8, 0x48, 0x6b, 0x8f, 0xba, 0xda, 0xaf, + 0xa5, 0x61, 0x2d, 0xac, 0x1c, 0x23, 0xcf, 0x42, 0xc6, 0xaf, 0x76, 0xcd, 0x7f, 0xc4, 0x91, 0x89, + 0x68, 0xe5, 0x26, 0x12, 0x51, 0x2e, 0x04, 0xdf, 0x7c, 0xed, 0x63, 0xf9, 0x9d, 0xc5, 0x5c, 0xc1, + 0x44, 0xf1, 0xbe, 0x72, 0x07, 0xd6, 0xd0, 0x5c, 0x07, 0xaf, 0x37, 0xaf, 0xcb, 0x55, 0xae, 0xb3, + 0xb5, 0xe6, 0x4b, 0x1f, 0x3f, 0xbc, 0x38, 0x87, 0x0a, 0xf2, 0x15, 0x5a, 0x96, 0x5e, 0x31, 0x34, + 0x53, 0xd2, 0x7d, 0x64, 0xa6, 0xeb, 0x3e, 0x78, 0x57, 0xa6, 0xe8, 0x3e, 0xe6, 0x67, 0xe8, 0x3e, + 0x82, 0x92, 0xb2, 0xee, 0x03, 0x35, 0x60, 0x8b, 0xd3, 0x34, 0x60, 0x41, 0x19, 0xa6, 0x01, 0xbb, + 0xc2, 0xbb, 0x3b, 0x72, 0xee, 0xdb, 0x38, 0x0e, 0x7c, 0x57, 0x63, 0x47, 0x4c, 0xe7, 0x3e, 0xbe, + 0x8e, 0xe7, 0x97, 0x41, 0x3c, 0xa9, 0x6b, 0xbf, 0xaf, 0x44, 0x14, 0x07, 0x62, 0x2a, 0xae, 0xc2, + 0x5a, 0xf7, 0x98, 0x4a, 0x34, 0x6e, 0x47, 0x62, 0x4d, 0x57, 0xcd, 0x55, 0x91, 0xca, 0xd8, 0xd3, + 0x2f, 0xc1, 0xba, 0x4f, 0xc6, 0x39, 0x34, 0x74, 0xb5, 0x31, 0xfd, 0xd2, 0x1c, 0x37, 0xe2, 0x59, + 0xd8, 0xf0, 0x09, 0xb9, 0xf0, 0xc7, 0xb8, 0xd3, 0x55, 0x53, 0x15, 0x19, 0x3c, 0xde, 0xff, 0x58, + 0x3b, 0x8c, 0x32, 0x2a, 0x5f, 0x50, 0xab, 0xb4, 0xbf, 0x4b, 0x87, 0x84, 0x2a, 0xf1, 0x99, 0x3c, + 0x64, 0xe9, 0x6d, 0xc9, 0x07, 0x89, 0x1f, 0x2b, 0x97, 0xa6, 0x0c, 0x3f, 0x37, 0x4a, 0xb0, 0xac, + 0x86, 0x09, 0xe3, 0xf1, 0x40, 0xd8, 0x28, 0xd8, 0x8c, 0x21, 0x60, 0x8c, 0x32, 0x2e, 0x3f, 0x51, + 0x1d, 0x3b, 0x43, 0x72, 0xb3, 0xab, 0x13, 0x5c, 0x2d, 0x5d, 0x7d, 0xc8, 0x18, 0xf8, 0xbf, 0xc4, + 0x07, 0xda, 0x80, 0x3a, 0x88, 0x71, 0xb8, 0xf2, 0x74, 0x02, 0xab, 0x15, 0xab, 0x1c, 0x47, 0x09, + 0x6b, 0x56, 0x27, 0xe2, 0x5f, 0x51, 0xad, 0x01, 0x2b, 0x28, 0xd2, 0x88, 0x0a, 0x33, 0x09, 0x3a, + 0xb4, 0x78, 0xe7, 0x0b, 0x95, 0x9a, 0x99, 0xa5, 0xe5, 0x44, 0x35, 0x47, 0xf0, 0xb4, 0x2c, 0x88, + 0x84, 0x1b, 0x39, 0x2f, 0x60, 0x30, 0x67, 0x8e, 0x40, 0x20, 0xaf, 0x60, 0x53, 0xcf, 0x38, 0xe1, + 0x04, 0x4e, 0xa6, 0x1d, 0xc1, 0xd6, 0xf4, 0x29, 0x99, 0x11, 0x62, 0x25, 0xe0, 0x99, 0x52, 0x32, + 0xcf, 0x24, 0x8b, 0x25, 0xe9, 0x90, 0x58, 0xa2, 0xfd, 0x69, 0x1a, 0x2e, 0x9f, 0x60, 0xba, 0x66, + 0x7c, 0xf3, 0x6b, 0x90, 0x65, 0x9a, 0x7f, 0x76, 0x7c, 0x32, 0xab, 0x19, 0x3f, 0x50, 0xea, 0x7b, + 0x9e, 0xc3, 0xcf, 0x3a, 0xca, 0xd5, 0x06, 0xe7, 0x1d, 0x8c, 0xfd, 0xff, 0xc9, 0x2f, 0xc0, 0x3a, + 0x3b, 0xd0, 0x98, 0x5d, 0xd1, 0xc1, 0xa4, 0x77, 0x82, 0x13, 0xed, 0x9c, 0x70, 0x82, 0x88, 0x14, + 0xc5, 0x43, 0x0e, 0x4f, 0x0c, 0xcb, 0x4f, 0x23, 0x2d, 0xc8, 0x22, 0xd9, 0x81, 0xd3, 0xed, 0x9d, + 0xc8, 0x1a, 0x5f, 0xb8, 0x58, 0xc8, 0xc5, 0x98, 0x39, 0x24, 0x4d, 0x28, 0xe1, 0x6f, 0x72, 0x0d, + 0xd6, 0xfb, 0x93, 0x63, 0x2a, 0xc9, 0xb1, 0xb5, 0xc0, 0x9f, 0x6f, 0xe7, 0xcd, 0xd5, 0xfe, 0xe4, + 0x58, 0x1f, 0x0e, 0x71, 0x4a, 0xf1, 0x9d, 0x77, 0x83, 0xd2, 0xb1, 0x5d, 0x2b, 0x28, 0x17, 0x90, + 0x92, 0x56, 0xc0, 0xf6, 0x2d, 0xa7, 0x3d, 0x0d, 0xcc, 0xea, 0x87, 0x87, 0x98, 0x61, 0x3f, 0xb4, + 0x9f, 0xa4, 0x04, 0xbb, 0x3e, 0x7d, 0xdd, 0xff, 0x7c, 0x8a, 0x12, 0xa6, 0xe8, 0x3a, 0xa8, 0x74, + 0xe8, 0x83, 0x43, 0xc5, 0x9f, 0xa3, 0xb5, 0xfe, 0xe4, 0xd8, 0x1f, 0x3b, 0x79, 0xe0, 0x17, 0xe4, + 0x81, 0x7f, 0x55, 0xb0, 0xf3, 0x89, 0xc7, 0xc3, 0xf4, 0x21, 0xd7, 0xfe, 0x23, 0x0d, 0xd7, 0x4e, + 0x76, 0x08, 0xfc, 0x7c, 0xde, 0x12, 0xe6, 0x2d, 0xa2, 0x69, 0x99, 0x8f, 0x69, 0x5a, 0x12, 0xf6, + 0xde, 0x42, 0xd2, 0xde, 0x8b, 0xe9, 0x75, 0x16, 0x13, 0xf4, 0x3a, 0x89, 0x1b, 0x74, 0xe9, 0x11, + 0x1b, 0x74, 0x59, 0x5e, 0x27, 0xff, 0xe6, 0xcb, 0x5f, 0x61, 0xd6, 0xfe, 0x1d, 0x38, 0x25, 0x58, + 0x7b, 0x76, 0x73, 0x04, 0xea, 0xba, 0xec, 0xad, 0x1b, 0x49, 0x4c, 0x3d, 0x92, 0x25, 0x30, 0xde, + 0x1b, 0x9c, 0x9d, 0x0f, 0xf2, 0xff, 0xef, 0x30, 0xf2, 0xe4, 0x1e, 0x9c, 0x41, 0x80, 0xe6, 0x7d, + 0x59, 0xd1, 0x68, 0x8f, 0xdc, 0x03, 0xbe, 0x1e, 0x2e, 0xc5, 0xd8, 0xde, 0xee, 0xbe, 0xd4, 0x1c, + 0xd3, 0x3d, 0x28, 0xcf, 0x99, 0xa7, 0xc7, 0x09, 0xe9, 0x51, 0x19, 0xe1, 0x2f, 0x15, 0xd0, 0x1e, + 0x3d, 0x5e, 0x28, 0x67, 0x47, 0x07, 0x9c, 0xca, 0xd9, 0xd2, 0xe8, 0x5d, 0x86, 0xd5, 0x91, 0x7b, + 0x30, 0x72, 0xc7, 0x47, 0x21, 0x01, 0x6e, 0x85, 0x27, 0x8a, 0x81, 0x11, 0x30, 0x71, 0x8f, 0xc5, + 0x64, 0x8b, 0x42, 0x5a, 0xc9, 0x17, 0xfd, 0x12, 0xe7, 0x81, 0xae, 0x26, 0xb9, 0x81, 0xec, 0xc7, + 0x9d, 0xcc, 0x52, 0x4a, 0x4d, 0x9b, 0x1c, 0xcc, 0xee, 0xa0, 0xdb, 0x73, 0xb5, 0xbf, 0x52, 0x04, + 0x47, 0x90, 0x34, 0x78, 0xe4, 0x1d, 0xc9, 0x1a, 0x2f, 0x1d, 0x63, 0x43, 0x92, 0x8a, 0xc8, 0x86, + 0x4b, 0x1c, 0x5f, 0x0d, 0x13, 0x42, 0xf8, 0x6a, 0x98, 0xf2, 0x04, 0x26, 0x45, 0x5c, 0x00, 0xbe, + 0x2d, 0x9e, 0xf4, 0xe9, 0x99, 0xb7, 0x7b, 0x93, 0xdc, 0x80, 0x45, 0xf6, 0x8a, 0x2f, 0x9a, 0xbb, + 0x1e, 0x6a, 0xee, 0xee, 0x4d, 0x53, 0xe4, 0x6b, 0x3f, 0xf0, 0xd5, 0xe0, 0xb1, 0x4e, 0xec, 0xde, + 0x24, 0xaf, 0x9e, 0xcc, 0xba, 0x6e, 0x49, 0x58, 0xd7, 0xf9, 0x96, 0x75, 0xaf, 0x85, 0x2c, 0xeb, + 0xae, 0xcc, 0x1e, 0x2d, 0xfe, 0x78, 0xc1, 0xf0, 0xc4, 0x02, 0x9c, 0x99, 0x9f, 0x28, 0x70, 0x61, + 0x66, 0x09, 0x72, 0x1e, 0x96, 0xf4, 0x66, 0xa5, 0x15, 0xcc, 0x2f, 0xdd, 0x33, 0x22, 0x85, 0xec, + 0xc0, 0x72, 0xde, 0x19, 0x77, 0xf7, 0xe9, 0x32, 0x4e, 0xd4, 0x26, 0xc6, 0xaa, 0xf5, 0xc9, 0xcb, + 0x73, 0x66, 0x50, 0x96, 0xd8, 0xb0, 0x81, 0x7b, 0x21, 0x14, 0xbb, 0x25, 0x9d, 0xa0, 0x36, 0x88, + 0x55, 0x18, 0x2b, 0x46, 0xcf, 0x99, 0x58, 0x62, 0x74, 0x0b, 0xbe, 0x2f, 0x78, 0x91, 0xe9, 0x0d, + 0x7c, 0x0c, 0x60, 0xc4, 0xeb, 0xb0, 0xd4, 0x14, 0xcf, 0x8a, 0x92, 0x39, 0xaa, 0x78, 0x42, 0x34, + 0xfd, 0x5c, 0xed, 0xb7, 0x14, 0x21, 0xdb, 0x3f, 0xba, 0x23, 0x52, 0xd8, 0x9b, 0xce, 0xec, 0xb0, + 0x37, 0x9d, 0xcf, 0x18, 0xf6, 0x46, 0xfb, 0x73, 0x0e, 0x5b, 0x5c, 0xe9, 0x34, 0x23, 0x8a, 0xa5, + 0x27, 0x35, 0x2b, 0x36, 0x42, 0xab, 0xf3, 0xb2, 0x14, 0x36, 0x2d, 0xfe, 0xad, 0xe9, 0xd6, 0xc5, + 0xd2, 0x52, 0xfd, 0xc3, 0x34, 0x9c, 0x9f, 0x55, 0x3c, 0x31, 0x30, 0xab, 0xf2, 0x78, 0x81, 0x59, + 0x6f, 0xc0, 0x12, 0x4b, 0xf3, 0x6d, 0x66, 0x71, 0xc0, 0x79, 0x51, 0x3a, 0xe0, 0x22, 0x9b, 0x5c, + 0x86, 0x05, 0xbd, 0x60, 0x05, 0xb1, 0x82, 0xd0, 0xb8, 0xcd, 0xd9, 0x1f, 0xa3, 0xd9, 0x14, 0xcf, + 0x22, 0xdf, 0x8a, 0x87, 0xc7, 0xe2, 0x41, 0x82, 0xce, 0x49, 0x03, 0x12, 0x43, 0x14, 0xc7, 0xf6, + 0x06, 0x08, 0xd8, 0x1c, 0x54, 0xd6, 0x8c, 0x87, 0xda, 0xd2, 0x60, 0xa1, 0x39, 0x72, 0xc7, 0xae, + 0x27, 0x1b, 0x9e, 0x0d, 0x31, 0xc5, 0xe4, 0x39, 0xdc, 0x2c, 0xcc, 0x79, 0xc0, 0xbc, 0x80, 0x17, + 0x64, 0x64, 0x06, 0xb4, 0x23, 0xa3, 0xc9, 0xa6, 0x44, 0x42, 0x0b, 0x54, 0x9d, 0x49, 0x7f, 0xff, + 0xa8, 0x6d, 0x56, 0x39, 0xab, 0xc1, 0x0a, 0xf4, 0x30, 0x95, 0x76, 0x70, 0x6c, 0x4a, 0x24, 0xda, + 0x77, 0x15, 0x38, 0x9d, 0xd4, 0x0f, 0x72, 0x1e, 0x32, 0xfd, 0xc4, 0x48, 0x60, 0x7d, 0xe6, 0xbc, + 0x98, 0xa5, 0x7f, 0xed, 0x83, 0xc1, 0xe8, 0xd8, 0xf1, 0x64, 0xf3, 0x3c, 0x29, 0xd9, 0x04, 0xfa, + 0xa3, 0x84, 0xff, 0x93, 0x8b, 0xe2, 0x8c, 0x4e, 0xc7, 0x62, 0x87, 0xe1, 0x1f, 0x4d, 0x07, 0xa8, + 0x74, 0x9a, 0x8d, 0x21, 0x43, 0xb4, 0x7e, 0x19, 0x32, 0xb4, 0x59, 0x91, 0xd5, 0x4b, 0xd7, 0x8f, + 0x5e, 0xab, 0x72, 0x22, 0xd6, 0xaa, 0xb1, 0x73, 0xdc, 0x33, 0x91, 0x58, 0xdb, 0x83, 0xb5, 0x30, + 0x05, 0x31, 0xc2, 0x18, 0x88, 0xd9, 0x5b, 0x2a, 0xaf, 0x29, 0x3f, 0x18, 0x30, 0x13, 0xf1, 0xfc, + 0xd3, 0xff, 0xf8, 0xf0, 0x22, 0xd0, 0x9f, 0xac, 0x4c, 0x12, 0x46, 0xa2, 0xf6, 0xfd, 0x14, 0x9c, + 0x0e, 0xbc, 0x52, 0xc5, 0x1e, 0xfa, 0x99, 0x75, 0x91, 0xd2, 0x43, 0x2e, 0x3c, 0x82, 0xd1, 0x8a, + 0x77, 0x70, 0x86, 0xe7, 0xc0, 0x0e, 0x6c, 0x4e, 0xa3, 0x27, 0xcf, 0xc2, 0x32, 0x02, 0x99, 0x0c, + 0x9d, 0x7d, 0x57, 0x3e, 0xfb, 0xfa, 0x22, 0xd1, 0x0c, 0xf2, 0xb5, 0x1f, 0x29, 0xb0, 0xc5, 0x0d, + 0x9b, 0x6b, 0x4e, 0xb7, 0xef, 0xb9, 0x7d, 0xa7, 0xbf, 0xef, 0x7e, 0x3e, 0x2e, 0x7e, 0x3b, 0xa1, + 0x73, 0xec, 0x6a, 0xd8, 0x7e, 0x3d, 0xf6, 0xb5, 0xe9, 0xbd, 0x25, 0x37, 0x10, 0x9c, 0x67, 0x9f, + 0x2d, 0xde, 0x0c, 0x73, 0xa9, 0xee, 0xd3, 0x04, 0xd9, 0xa5, 0x1a, 0x29, 0xb4, 0x5f, 0x86, 0xed, + 0xd9, 0x1f, 0x20, 0xdf, 0x84, 0x55, 0x8c, 0xf6, 0xd2, 0x1e, 0x1e, 0x8e, 0x9c, 0x8e, 0x2b, 0x54, + 0x61, 0x42, 0x13, 0x29, 0xe7, 0x31, 0xac, 0x21, 0xee, 0xe2, 0x7b, 0x88, 0x71, 0x64, 0x78, 0xa1, + 0x90, 0xf7, 0x80, 0x5c, 0x9b, 0xf6, 0x2b, 0x0a, 0x90, 0x78, 0x1d, 0xe4, 0xcb, 0xb0, 0xd2, 0x6e, + 0x15, 0x2c, 0xcf, 0x19, 0x79, 0xe5, 0xc1, 0x64, 0xc4, 0x81, 0x7e, 0x98, 0xc7, 0xa7, 0xb7, 0x4f, + 0x8f, 0x92, 0x91, 0x67, 0x1f, 0x0d, 0x26, 0x23, 0x33, 0x44, 0x87, 0x61, 0x4a, 0x5c, 0xf7, 0xbd, + 0x8e, 0xf3, 0x20, 0x1c, 0xa6, 0x84, 0xa7, 0x85, 0xc2, 0x94, 0xf0, 0x34, 0xed, 0x23, 0x05, 0xce, + 0x09, 0xe3, 0xa3, 0x4e, 0x42, 0x5b, 0x0a, 0x88, 0x6b, 0x30, 0x12, 0xc8, 0x92, 0xb3, 0x58, 0xda, + 0x0d, 0x01, 0xfd, 0x81, 0x0d, 0x44, 0xde, 0x96, 0x95, 0x25, 0x5f, 0x83, 0x8c, 0xe5, 0x0d, 0x86, + 0x27, 0xc0, 0xfe, 0x50, 0xfd, 0x19, 0xf5, 0x06, 0x43, 0xac, 0x02, 0x4b, 0x6a, 0x2e, 0x9c, 0x96, + 0x1b, 0x27, 0x5a, 0x4c, 0x6a, 0xb0, 0xc8, 0x41, 0x9e, 0x22, 0xef, 0x8c, 0x33, 0xfa, 0x94, 0x5f, + 0x17, 0x00, 0x23, 0x1c, 0xd9, 0xd0, 0x14, 0x75, 0x68, 0xbf, 0xad, 0x40, 0x96, 0x72, 0x1b, 0x28, + 0xc5, 0x3d, 0xe9, 0x92, 0x0e, 0x33, 0x8e, 0xe2, 0x99, 0xda, 0xaf, 0xfe, 0x44, 0xb7, 0xf1, 0x2b, + 0xb0, 0x1e, 0x29, 0x40, 0x34, 0x74, 0x2d, 0xef, 0x75, 0xf7, 0x1d, 0x16, 0xf5, 0x80, 0xbd, 0xf1, + 0x86, 0xd2, 0xb4, 0xdf, 0x50, 0xe0, 0x34, 0x95, 0xf9, 0x2b, 0xa8, 0xee, 0x35, 0x27, 0x3d, 0xb1, + 0xdf, 0x29, 0x07, 0x25, 0xac, 0xd8, 0x98, 0xdb, 0x2b, 0xe3, 0xa0, 0x78, 0x9a, 0xe9, 0xe7, 0x92, + 0x32, 0x2c, 0xf1, 0xfb, 0x65, 0xcc, 0x01, 0x09, 0xb7, 0x25, 0x65, 0x42, 0x50, 0x31, 0x27, 0xa2, + 0x3d, 0xc1, 0x23, 0x8c, 0x97, 0x31, 0xfd, 0xd2, 0xda, 0x7f, 0x2a, 0x70, 0x76, 0x4a, 0x19, 0xf2, + 0x06, 0xcc, 0xa3, 0x4b, 0x0e, 0x9f, 0xbd, 0xf3, 0x53, 0x3e, 0xe1, 0xed, 0x1f, 0xed, 0xde, 0x64, + 0x17, 0xd1, 0x31, 0xfd, 0x61, 0xb2, 0x52, 0xe4, 0x1d, 0x58, 0xd6, 0x3b, 0x1d, 0x2e, 0xce, 0xa4, + 0x42, 0xe2, 0xcc, 0x94, 0x2f, 0xbe, 0xe0, 0xd3, 0x33, 0x71, 0x86, 0x19, 0x87, 0x77, 0x3a, 0x36, + 0x77, 0x37, 0x0a, 0xea, 0xdb, 0xfa, 0xff, 0xb0, 0x16, 0x26, 0x7e, 0x2c, 0x0f, 0x89, 0x1f, 0x28, + 0xa0, 0x86, 0xdb, 0xf0, 0xc5, 0x40, 0xa3, 0x24, 0x4d, 0xf3, 0x23, 0x16, 0xd5, 0xef, 0xa6, 0xe0, + 0xa9, 0xc4, 0x11, 0x26, 0xcf, 0xc3, 0x82, 0x3e, 0x1c, 0x56, 0x8a, 0x7c, 0x55, 0x71, 0x0e, 0x09, + 0xb5, 0xc4, 0x21, 0x69, 0x8f, 0x11, 0x91, 0x97, 0x61, 0x09, 0x57, 0x26, 0x2d, 0x90, 0x0a, 0xa0, + 0x01, 0x99, 0x12, 0x25, 0x02, 0x0d, 0x28, 0x08, 0x49, 0x09, 0xd6, 0x38, 0x4a, 0x82, 0xe9, 0x1e, + 0xba, 0x1f, 0xf8, 0x18, 0xd5, 0x08, 0xa3, 0x2d, 0x54, 0xcf, 0xf6, 0x88, 0xe5, 0xc9, 0x38, 0x01, + 0xe1, 0x52, 0xa4, 0x0a, 0x2a, 0xd6, 0x29, 0xd7, 0xc4, 0xf0, 0x09, 0x11, 0xb7, 0x82, 0x35, 0x62, + 0x4a, 0x5d, 0xb1, 0x92, 0xfe, 0x74, 0xe9, 0xe3, 0x71, 0xf7, 0xb0, 0x7f, 0xec, 0xf6, 0xbd, 0x2f, + 0x6e, 0xba, 0x82, 0x6f, 0x9c, 0x68, 0xba, 0xfe, 0x20, 0xc3, 0x36, 0x73, 0xb4, 0x18, 0xe5, 0x68, + 0x24, 0x48, 0x5a, 0xe4, 0x68, 0x30, 0x88, 0x37, 0xc3, 0x01, 0x28, 0xc2, 0x22, 0xc3, 0x67, 0x10, + 0x3b, 0xe3, 0x42, 0x62, 0x13, 0x18, 0xcd, 0xee, 0x4d, 0xc6, 0xbe, 0x30, 0xdf, 0xa0, 0xb1, 0x29, + 0x8a, 0x92, 0x5d, 0xc8, 0x16, 0x7a, 0xae, 0xd3, 0x9f, 0x0c, 0x5b, 0x27, 0x7b, 0x3d, 0xdc, 0xe4, + 0x7d, 0x59, 0xd9, 0x67, 0xc5, 0xf0, 0xd5, 0x11, 0x4f, 0x72, 0xb9, 0x22, 0xd2, 0xf2, 0xdd, 0x05, + 0x58, 0xe8, 0xf5, 0x97, 0x66, 0x8c, 0x4f, 0x34, 0x11, 0xcb, 0x85, 0x7d, 0x61, 0xb8, 0x3f, 0x81, + 0x0d, 0x6b, 0x55, 0x67, 0xec, 0xb5, 0x46, 0x4e, 0x7f, 0x8c, 0xb8, 0x6e, 0x27, 0xc0, 0xbd, 0x39, + 0x27, 0x62, 0x86, 0xa2, 0x8e, 0xd1, 0xf3, 0x8b, 0x32, 0x0d, 0x66, 0xb8, 0x3a, 0xca, 0x2f, 0x95, + 0xba, 0x7d, 0xa7, 0xd7, 0xfd, 0x50, 0x78, 0x55, 0x31, 0x7e, 0xe9, 0x40, 0x24, 0x9a, 0x41, 0xbe, + 0xf6, 0x8d, 0xd8, 0xbc, 0xb1, 0x56, 0x66, 0x61, 0x91, 0xfb, 0xdc, 0x32, 0x1f, 0xd4, 0xa6, 0x51, + 0x2f, 0x56, 0xea, 0x3b, 0xaa, 0x42, 0xd6, 0x00, 0x9a, 0x66, 0xa3, 0x60, 0x58, 0x16, 0xfd, 0x9d, + 0xa2, 0xbf, 0xb9, 0x83, 0x6a, 0xa9, 0x5d, 0x55, 0xd3, 0x92, 0x8f, 0x6a, 0x46, 0xfb, 0xa1, 0x02, + 0x67, 0x92, 0xa7, 0x92, 0xb4, 0x00, 0xbd, 0x94, 0xf9, 0x3b, 0xf2, 0x97, 0x67, 0xce, 0x7b, 0x62, + 0x72, 0xd4, 0xdb, 0xd9, 0x63, 0x5e, 0xb4, 0x29, 0xf1, 0x58, 0x14, 0x04, 0xaa, 0xef, 0x76, 0xb4, + 0x02, 0x6c, 0x4e, 0xab, 0x23, 0xdc, 0xd5, 0x75, 0xc8, 0xea, 0xcd, 0x66, 0xb5, 0x52, 0xd0, 0x5b, + 0x95, 0x46, 0x5d, 0x55, 0xc8, 0x32, 0xcc, 0xef, 0x98, 0x8d, 0x76, 0x53, 0x4d, 0x69, 0xff, 0xa0, + 0xc0, 0x6a, 0x25, 0xb0, 0x32, 0x79, 0xd2, 0xcd, 0xf7, 0x7a, 0x68, 0xf3, 0x6d, 0xfa, 0xfe, 0xfc, + 0xfe, 0x07, 0x66, 0x70, 0x90, 0x79, 0xdf, 0xe9, 0x2a, 0x1d, 0x32, 0x80, 0x97, 0x4b, 0x0b, 0x77, + 0x16, 0x1f, 0x56, 0x3b, 0xec, 0x94, 0x25, 0xed, 0xde, 0xbf, 0x4d, 0xc1, 0xa9, 0x84, 0x92, 0xe4, + 0x03, 0xd8, 0x6e, 0xba, 0xfd, 0x4e, 0xb7, 0x7f, 0x48, 0x77, 0x6b, 0xcb, 0x19, 0xbf, 0x37, 0xae, + 0x0f, 0xbc, 0xee, 0x01, 0xbf, 0xc3, 0x7d, 0xff, 0xb9, 0x97, 0x3e, 0x7d, 0x78, 0xf1, 0xb9, 0x21, + 0xa3, 0x64, 0xa6, 0xac, 0x1e, 0xa5, 0xb5, 0xfb, 0x12, 0x71, 0xd8, 0xb3, 0xee, 0x11, 0xf5, 0x92, + 0xbf, 0x50, 0xe0, 0xf2, 0x2c, 0x12, 0x39, 0xfc, 0xc5, 0xec, 0xad, 0xf3, 0x06, 0x57, 0xcf, 0xdf, + 0x7c, 0x54, 0xfb, 0x92, 0xfd, 0xef, 0x4e, 0xd2, 0x0a, 0xed, 0xef, 0x15, 0xd8, 0x88, 0xcd, 0x1b, + 0xb1, 0x60, 0x51, 0xdf, 0xb3, 0x1a, 0x95, 0x62, 0x81, 0xaf, 0x8e, 0x8b, 0x81, 0x31, 0x11, 0x86, + 0xcd, 0x89, 0xcd, 0x34, 0xf3, 0x43, 0xbc, 0x3f, 0xb6, 0x07, 0xdd, 0x8e, 0x14, 0xf2, 0xb2, 0x3c, + 0x67, 0x8a, 0x9a, 0x90, 0x9b, 0xf8, 0x70, 0x32, 0x72, 0xb1, 0xda, 0x54, 0x48, 0x19, 0xed, 0xa7, + 0xc7, 0x2b, 0x46, 0x1b, 0x75, 0x87, 0xe6, 0xc7, 0xab, 0x0e, 0xea, 0xcb, 0xaf, 0x42, 0x96, 0x4b, + 0x8e, 0x28, 0x94, 0x7d, 0x4f, 0x81, 0xcd, 0x69, 0x6d, 0xa5, 0xc2, 0x68, 0xd8, 0x29, 0xf9, 0x8c, + 0x0f, 0x83, 0x1f, 0xf6, 0x46, 0x16, 0x64, 0xe4, 0x4d, 0xc8, 0x56, 0xc6, 0xe3, 0x89, 0x3b, 0xb2, + 0x5e, 0x6e, 0x9b, 0x15, 0xbe, 0x49, 0x2f, 0x7c, 0xfa, 0xf0, 0xe2, 0x59, 0xb4, 0x24, 0x1f, 0xd9, + 0xe3, 0x97, 0xed, 0xc9, 0xa8, 0x1b, 0x82, 0x0c, 0x97, 0x4b, 0x68, 0xdf, 0x51, 0x60, 0x6b, 0x7a, + 0x27, 0xe9, 0x4d, 0xdf, 0xa2, 0xf2, 0x51, 0xe0, 0xd7, 0x89, 0x37, 0x3d, 0xca, 0x4c, 0x11, 0xc7, + 0x4e, 0x9f, 0x90, 0x16, 0xf2, 0xc3, 0x49, 0xa7, 0x62, 0x31, 0x64, 0xc3, 0x85, 0x04, 0xa1, 0xf6, + 0xef, 0x29, 0x38, 0x43, 0x37, 0x71, 0xcf, 0x1d, 0x8f, 0xf5, 0x89, 0x77, 0xe4, 0xf6, 0x3d, 0xbe, + 0x22, 0xc8, 0xab, 0xb0, 0x70, 0xf4, 0x78, 0x2a, 0x5c, 0x46, 0x4e, 0x08, 0xe0, 0xc5, 0x28, 0x6c, + 0xdc, 0xe9, 0xff, 0xe4, 0x12, 0xc8, 0x51, 0x7b, 0xd3, 0x88, 0x1b, 0x98, 0xda, 0x54, 0xcc, 0xe5, + 0xa1, 0x1f, 0x60, 0xf3, 0x35, 0x98, 0x47, 0xb5, 0x0d, 0xbf, 0xa2, 0x84, 0x68, 0x91, 0xdc, 0x3a, + 0x54, 0xea, 0x98, 0xac, 0x00, 0x79, 0x11, 0x20, 0x80, 0x5c, 0xe7, 0x77, 0x90, 0x50, 0x67, 0xf8, + 0xa8, 0xeb, 0xe6, 0xf2, 0xf1, 0x81, 0xc3, 0x71, 0xcc, 0x73, 0xb0, 0x21, 0x86, 0x65, 0x28, 0xe0, + 0xc6, 0xf8, 0xeb, 0xe2, 0x3a, 0xcb, 0xa8, 0x0c, 0x05, 0xe4, 0xd8, 0x95, 0x58, 0xe4, 0x51, 0x44, + 0x1d, 0x8d, 0x84, 0x17, 0xbd, 0x12, 0x0b, 0x2f, 0xba, 0xc4, 0xa8, 0xe4, 0x18, 0xa2, 0xda, 0xbf, + 0xa6, 0x60, 0x79, 0x8f, 0x32, 0x7f, 0xa8, 0xd2, 0x98, 0xad, 0x22, 0xb9, 0x05, 0xd9, 0xea, 0xc0, + 0xe1, 0xcf, 0x38, 0xdc, 0x34, 0x9c, 0x39, 0x4b, 0xf6, 0x06, 0x8e, 0x78, 0x11, 0x1a, 0x9b, 0x32, + 0xd1, 0x23, 0x1c, 0x3d, 0xef, 0xc0, 0x02, 0x7b, 0x56, 0xe3, 0xda, 0x3a, 0xc1, 0xfe, 0xfb, 0x2d, + 0x7a, 0x81, 0x65, 0x4b, 0x2f, 0x0f, 0xec, 0x69, 0x4e, 0xe6, 0x45, 0x39, 0x78, 0xa2, 0xa4, 0xc0, + 0x99, 0x3f, 0x99, 0x02, 0x47, 0x02, 0x89, 0x5a, 0x38, 0x09, 0x48, 0xd4, 0xd6, 0x6d, 0xc8, 0x4a, + 0xed, 0x79, 0x2c, 0x69, 0xe0, 0x57, 0x53, 0xb0, 0x8a, 0xbd, 0xf2, 0xcf, 0xff, 0x9f, 0x4d, 0x75, + 0xd4, 0xeb, 0x21, 0x75, 0xd4, 0xa6, 0x3c, 0x5f, 0xac, 0x67, 0x33, 0xf4, 0x50, 0x77, 0x60, 0x23, + 0x46, 0x48, 0x5e, 0x81, 0x79, 0xda, 0x7c, 0x21, 0xbe, 0xab, 0xd1, 0x15, 0x10, 0x00, 0x8a, 0xd2, + 0x8e, 0x8f, 0x4d, 0x46, 0xad, 0xfd, 0x97, 0x02, 0x2b, 0x1c, 0xcf, 0xbf, 0x7f, 0x30, 0x78, 0xe4, + 0x70, 0x5e, 0x8b, 0x0e, 0x27, 0x83, 0x2d, 0xe0, 0xc3, 0xf9, 0x3f, 0x3d, 0x88, 0xb7, 0x43, 0x83, + 0x78, 0xd6, 0x87, 0x17, 0x13, 0xdd, 0x99, 0x31, 0x86, 0x7f, 0x8d, 0x80, 0x9b, 0x61, 0x42, 0xf2, + 0x2d, 0x58, 0xae, 0xbb, 0xf7, 0x43, 0x52, 0xf0, 0xb5, 0x29, 0x95, 0xbe, 0xe0, 0x13, 0xb2, 0x3d, + 0x85, 0x97, 0x57, 0xdf, 0xbd, 0x6f, 0xc7, 0x5e, 0xf4, 0x82, 0x2a, 0xa9, 0x20, 0x1c, 0x2e, 0xf6, + 0x38, 0x4b, 0x9f, 0xfb, 0xa9, 0x21, 0x12, 0xc7, 0x77, 0xd3, 0x00, 0x81, 0x8b, 0x0f, 0xdd, 0x80, + 0x21, 0x63, 0x06, 0xf1, 0x80, 0x80, 0x49, 0xf2, 0x1a, 0x17, 0x36, 0x0e, 0xd7, 0xb8, 0xa2, 0x3b, + 0x35, 0x1d, 0xfe, 0x0d, 0x55, 0xde, 0x05, 0xee, 0x53, 0xd2, 0x71, 0x7b, 0x0e, 0x3b, 0xdb, 0xd3, + 0xf9, 0x2b, 0x88, 0xf6, 0xe9, 0xa7, 0x4e, 0x09, 0xcc, 0x8a, 0x9e, 0x27, 0x45, 0x4a, 0x10, 0x73, + 0x9b, 0xcb, 0x3c, 0x9e, 0xdb, 0x5c, 0x13, 0x96, 0xbb, 0xfd, 0xf7, 0xdd, 0xbe, 0x37, 0x18, 0x3d, + 0x40, 0xed, 0x7e, 0xa0, 0x36, 0xa4, 0x43, 0x50, 0x11, 0x79, 0x6c, 0x1e, 0xf0, 0x62, 0xf4, 0xe9, + 0xe5, 0x69, 0xf0, 0x13, 0x7d, 0xb7, 0xbf, 0x79, 0x75, 0xe1, 0x4e, 0x66, 0x69, 0x41, 0x5d, 0xbc, + 0x93, 0x59, 0x5a, 0x52, 0x97, 0xef, 0x64, 0x96, 0x96, 0x55, 0x30, 0xa5, 0xf7, 0x32, 0xff, 0x3d, + 0x4c, 0x7a, 0xc2, 0x0a, 0x3f, 0x4f, 0x69, 0x3f, 0x4d, 0x01, 0x89, 0x37, 0x83, 0xbc, 0x0e, 0x59, + 0x76, 0xc0, 0xda, 0xa3, 0xf1, 0xb7, 0xb9, 0x15, 0x33, 0xc3, 0x33, 0x91, 0x92, 0x65, 0x3c, 0x13, + 0x96, 0x6c, 0x8e, 0xbf, 0xdd, 0x23, 0xdf, 0x84, 0x53, 0x38, 0xbc, 0x43, 0x77, 0xd4, 0x1d, 0x74, + 0x6c, 0x04, 0x9f, 0x74, 0x7a, 0x3c, 0x88, 0xda, 0xf3, 0x18, 0xed, 0x33, 0x9e, 0x3d, 0x65, 0x1a, + 0xd0, 0x93, 0xa7, 0x89, 0x94, 0x4d, 0x46, 0x48, 0x5a, 0xa0, 0xca, 0xe5, 0x0f, 0x26, 0xbd, 0x1e, + 0x9f, 0xd9, 0xdc, 0xa7, 0x0f, 0x2f, 0x6e, 0x45, 0xf3, 0xa6, 0x54, 0xbc, 0x16, 0x54, 0x5c, 0x9a, + 0xf4, 0x7a, 0xe4, 0x55, 0x80, 0x41, 0xdf, 0x3e, 0xee, 0x8e, 0xc7, 0xec, 0xcd, 0xc8, 0x77, 0x3a, + 0x0c, 0x52, 0xe5, 0xc9, 0x18, 0xf4, 0x6b, 0x2c, 0x91, 0xfc, 0x3f, 0x40, 0x37, 0x68, 0xc4, 0x07, + 0x60, 0x56, 0x42, 0x3c, 0x2c, 0x82, 0x48, 0x0c, 0xfb, 0x38, 0x1e, 0xba, 0x56, 0xf7, 0x43, 0x61, + 0x41, 0xfe, 0x36, 0x6c, 0x70, 0xfb, 0xdc, 0xbd, 0xae, 0x77, 0xc4, 0x25, 0x96, 0x27, 0x11, 0x77, + 0x24, 0x71, 0xe3, 0x9f, 0x32, 0x00, 0xfa, 0x9e, 0x25, 0xa0, 0x77, 0x6e, 0xc0, 0x3c, 0x95, 0xc3, + 0x84, 0x3e, 0x07, 0xb5, 0xe1, 0x58, 0xaf, 0xac, 0x0d, 0x47, 0x0a, 0xba, 0x1b, 0x4d, 0xb4, 0xe2, + 0x17, 0xba, 0x1c, 0xdc, 0x8d, 0xcc, 0xb0, 0x3f, 0x04, 0x7d, 0xca, 0xa9, 0x48, 0x15, 0x20, 0x00, + 0xc3, 0xe1, 0xb2, 0xd2, 0x46, 0x80, 0x2a, 0xc1, 0x33, 0x38, 0xfc, 0x7a, 0x00, 0xa8, 0x23, 0x2f, + 0x9f, 0x80, 0x8c, 0xdc, 0x85, 0x4c, 0xcb, 0xf1, 0x5d, 0xea, 0xa6, 0x40, 0x04, 0x3d, 0xc3, 0x83, + 0xdc, 0x05, 0x30, 0x41, 0x6b, 0x9e, 0x13, 0x8a, 0x05, 0x8a, 0x95, 0x10, 0x03, 0x16, 0x78, 0x00, + 0xe3, 0x29, 0xd0, 0x72, 0x3c, 0x7e, 0x31, 0x07, 0x94, 0xc5, 0x44, 0x99, 0xa7, 0xe0, 0xa1, 0x8a, + 0x6f, 0x41, 0xda, 0xb2, 0x6a, 0xdc, 0x31, 0x7e, 0x35, 0x90, 0x30, 0x2c, 0xab, 0x26, 0xa2, 0xf3, + 0x1f, 0x4b, 0xc5, 0x28, 0x31, 0xf9, 0x0a, 0x64, 0x25, 0xf6, 0x99, 0x43, 0x4a, 0xe0, 0x18, 0x48, + 0x4e, 0x14, 0xf2, 0xa1, 0x21, 0x51, 0x93, 0x2a, 0xa8, 0x77, 0x27, 0xef, 0xba, 0xfa, 0x70, 0x88, + 0xde, 0x4c, 0xef, 0xbb, 0x23, 0xc6, 0xb6, 0x2d, 0x05, 0x58, 0xac, 0xe8, 0x0c, 0xd6, 0x11, 0xb9, + 0xb2, 0x4e, 0x2b, 0x5a, 0x92, 0x34, 0x61, 0xc3, 0x72, 0xbd, 0xc9, 0x90, 0xd9, 0xbd, 0x94, 0x06, + 0x23, 0x2a, 0x50, 0x30, 0x00, 0x0a, 0x84, 0xad, 0x1c, 0xd3, 0x4c, 0x61, 0x6c, 0x74, 0x30, 0x18, + 0x45, 0x84, 0x8b, 0x78, 0x61, 0xcd, 0x95, 0xa7, 0x9c, 0xde, 0xaa, 0x61, 0x31, 0x05, 0x6f, 0x55, + 0x21, 0xa6, 0x04, 0xc2, 0xc9, 0x8b, 0x09, 0x20, 0x49, 0xf8, 0x00, 0x29, 0x81, 0x24, 0x85, 0xa0, + 0x91, 0x3e, 0xca, 0x48, 0x38, 0x7d, 0x7c, 0x2e, 0xde, 0x00, 0xb8, 0x33, 0xe8, 0xf6, 0x6b, 0xae, + 0x77, 0x34, 0xe8, 0x48, 0x58, 0x4d, 0xd9, 0x5f, 0x1c, 0x74, 0xfb, 0xf6, 0x31, 0x26, 0xff, 0xf4, + 0xe1, 0x45, 0x89, 0xc8, 0x94, 0xfe, 0x27, 0xcf, 0xc1, 0x32, 0xfd, 0xd5, 0x0a, 0xac, 0x77, 0x98, + 0xea, 0x17, 0x4b, 0x33, 0x34, 0xfb, 0x80, 0x80, 0xdc, 0xc6, 0xf8, 0x0d, 0xdd, 0xa1, 0x27, 0x31, + 0xaf, 0x22, 0x58, 0x43, 0x77, 0xe8, 0x45, 0xa1, 0x57, 0x25, 0x62, 0x52, 0xf6, 0x9b, 0x2e, 0x42, + 0xae, 0xf0, 0x30, 0x11, 0xa8, 0xdf, 0xe4, 0x6b, 0xcd, 0x16, 0x98, 0x8f, 0x72, 0x70, 0xcc, 0x48, + 0x31, 0x6c, 0x84, 0x55, 0x2e, 0xb2, 0x07, 0x29, 0xce, 0xd4, 0xb2, 0x46, 0x8c, 0x8f, 0x3a, 0xf6, + 0x3e, 0x26, 0x87, 0x1a, 0xe1, 0x13, 0x93, 0x3c, 0xac, 0x33, 0x1e, 0xdf, 0x0f, 0xdd, 0xc6, 0x59, + 0x5c, 0x3c, 0xdb, 0x82, 0xd8, 0x6e, 0xf2, 0xe7, 0x23, 0x05, 0x48, 0x09, 0xe6, 0x51, 0x20, 0xe4, + 0xd6, 0xf7, 0xe7, 0x64, 0x49, 0x38, 0xba, 0x8f, 0xf0, 0x5c, 0x41, 0x19, 0x58, 0x3e, 0x57, 0x90, + 0x94, 0x7c, 0x1d, 0xc0, 0xe8, 0x8f, 0x06, 0xbd, 0x1e, 0xa2, 0x92, 0x2e, 0xa1, 0x28, 0x75, 0x21, + 0xbc, 0x1f, 0xb1, 0x96, 0x80, 0x88, 0x23, 0x68, 0xe1, 0x6f, 0x3b, 0x82, 0x5d, 0x2a, 0xd5, 0xa5, + 0x55, 0x60, 0x81, 0x6d, 0x46, 0x44, 0xf8, 0xe5, 0x31, 0x0b, 0x24, 0x7c, 0x58, 0x86, 0xf0, 0xcb, + 0xd3, 0xe3, 0x08, 0xbf, 0x52, 0x01, 0xed, 0x2e, 0x9c, 0x4e, 0xea, 0x58, 0x48, 0x84, 0x55, 0x4e, + 0x2a, 0xc2, 0xfe, 0x49, 0x1a, 0x56, 0xb0, 0x36, 0x71, 0x0a, 0xeb, 0xb0, 0x6a, 0x4d, 0xde, 0xf5, + 0xe1, 0x6f, 0xc4, 0x69, 0x8c, 0xed, 0x1b, 0xcb, 0x19, 0xf2, 0x53, 0x61, 0xa8, 0x04, 0x31, 0x60, + 0x4d, 0xdc, 0x04, 0x3b, 0xc2, 0xa2, 0xdf, 0x07, 0xd7, 0x15, 0x10, 0x6e, 0xf1, 0xd0, 0x95, 0x91, + 0x42, 0xc1, 0x7d, 0x90, 0x7e, 0x9c, 0xfb, 0x20, 0x73, 0xa2, 0xfb, 0xe0, 0x1d, 0x58, 0x11, 0x5f, + 0xc3, 0x93, 0x7c, 0xfe, 0xc9, 0x4e, 0xf2, 0x50, 0x65, 0xa4, 0xea, 0x9f, 0xe8, 0x0b, 0x33, 0x4f, + 0x74, 0x7c, 0x7f, 0x15, 0xbb, 0x2c, 0x16, 0x8d, 0x9e, 0xd7, 0x81, 0xb1, 0xdd, 0x76, 0x0a, 0xcd, + 0xcf, 0x70, 0x4b, 0xbe, 0x02, 0xcb, 0xd5, 0x81, 0x78, 0x7a, 0x93, 0xde, 0x3c, 0x7a, 0x22, 0x51, + 0x66, 0x17, 0x7c, 0x4a, 0xff, 0x76, 0x4b, 0x7f, 0x1e, 0xb7, 0xdb, 0x6d, 0x00, 0xee, 0x2a, 0x12, + 0xc4, 0x64, 0xc2, 0x2d, 0x23, 0x80, 0x06, 0xc2, 0x4f, 0x2f, 0x12, 0x31, 0x3d, 0x9d, 0xb8, 0x55, + 0x8f, 0xbe, 0xbf, 0x3f, 0x98, 0xf4, 0xbd, 0x50, 0x10, 0x53, 0xe1, 0x18, 0xe7, 0xf0, 0x3c, 0xf9, + 0x78, 0x88, 0x14, 0xfb, 0x7c, 0x27, 0x84, 0xbc, 0xe5, 0x1b, 0x25, 0x2e, 0xce, 0x1a, 0x21, 0x2d, + 0x36, 0x42, 0x53, 0x4d, 0x11, 0xb5, 0x1f, 0x2a, 0x32, 0xb2, 0xf9, 0x67, 0x98, 0xea, 0xd7, 0x00, + 0x7c, 0xdb, 0x07, 0x31, 0xd7, 0x4c, 0x5e, 0xf2, 0x53, 0xe5, 0x51, 0x0e, 0x68, 0xa5, 0xde, 0xa4, + 0x3f, 0xaf, 0xde, 0xb4, 0x20, 0xdb, 0x78, 0xcf, 0x73, 0x02, 0x63, 0x19, 0xb0, 0x7c, 0x4e, 0x16, + 0x4f, 0xa6, 0x74, 0xfe, 0x2a, 0xde, 0x0d, 0x01, 0x1f, 0x3c, 0x85, 0x05, 0x96, 0x0a, 0x6a, 0x6f, + 0xc1, 0xba, 0xec, 0xcc, 0xfb, 0xa0, 0xbf, 0x4f, 0xbe, 0xca, 0x70, 0x16, 0x95, 0x90, 0xc4, 0x22, + 0x11, 0xd1, 0x13, 0xf7, 0x41, 0x7f, 0x9f, 0xf1, 0x3f, 0xce, 0x7d, 0xb9, 0xad, 0x28, 0xe3, 0xfd, + 0x58, 0x01, 0x12, 0x27, 0x97, 0x4f, 0x13, 0xe5, 0x7f, 0x81, 0xbb, 0x8c, 0x70, 0x65, 0x99, 0xc7, + 0xe1, 0xca, 0x72, 0xbf, 0xa3, 0xc0, 0x7a, 0x45, 0xaf, 0x71, 0x18, 0x72, 0xf6, 0x86, 0x73, 0x09, + 0x2e, 0x54, 0xf4, 0x9a, 0xdd, 0x6c, 0x54, 0x2b, 0x85, 0x7b, 0x76, 0x22, 0xba, 0xe8, 0x05, 0x78, + 0x3a, 0x4e, 0x12, 0xbc, 0xf5, 0x9c, 0x87, 0xcd, 0x78, 0xb6, 0x40, 0x20, 0x4d, 0x2e, 0x2c, 0xc0, + 0x4a, 0xd3, 0xb9, 0x37, 0x61, 0x5d, 0xa0, 0x6d, 0xb6, 0xaa, 0x16, 0xe2, 0x79, 0xaf, 0x43, 0x76, + 0xd7, 0x30, 0x2b, 0xa5, 0x7b, 0x76, 0xa9, 0x5d, 0xad, 0xaa, 0x73, 0x64, 0x15, 0x96, 0x79, 0x42, + 0x41, 0x57, 0x15, 0xb2, 0x02, 0x4b, 0x95, 0xba, 0x65, 0x14, 0xda, 0xa6, 0xa1, 0xa6, 0x72, 0x6f, + 0xc2, 0x5a, 0x73, 0xd4, 0x7d, 0xdf, 0xf1, 0xdc, 0xbb, 0xee, 0x03, 0x7c, 0xaa, 0x59, 0x84, 0xb4, + 0xa9, 0xef, 0xa9, 0x73, 0x04, 0x60, 0xa1, 0x79, 0xb7, 0x60, 0xdd, 0xbc, 0xa9, 0x2a, 0x24, 0x0b, + 0x8b, 0x3b, 0x85, 0xa6, 0x7d, 0xb7, 0x66, 0xa9, 0x29, 0xfa, 0x43, 0xdf, 0xb3, 0xf0, 0x47, 0x3a, + 0xf7, 0x12, 0x6c, 0x20, 0xaf, 0x50, 0xed, 0x8e, 0x3d, 0xb7, 0xef, 0x8e, 0xb0, 0x0d, 0x2b, 0xb0, + 0x64, 0xb9, 0x74, 0x93, 0x7b, 0x2e, 0x6b, 0x40, 0x6d, 0xd2, 0xf3, 0xba, 0xc3, 0x9e, 0xfb, 0x81, + 0xaa, 0xe4, 0x6e, 0xc3, 0xba, 0x39, 0x98, 0x78, 0xdd, 0xfe, 0xa1, 0xe5, 0x51, 0x8a, 0xc3, 0x07, + 0xe4, 0x29, 0xd8, 0x68, 0xd7, 0xf5, 0x5a, 0xbe, 0xb2, 0xd3, 0x6e, 0xb4, 0x2d, 0xbb, 0xa6, 0xb7, + 0x0a, 0x65, 0xf6, 0x50, 0x54, 0x6b, 0x58, 0x2d, 0xdb, 0x34, 0x0a, 0x46, 0xbd, 0xa5, 0x2a, 0xb9, + 0xef, 0xa3, 0xda, 0x63, 0x7f, 0xd0, 0xef, 0x94, 0x1c, 0x8c, 0xef, 0x4e, 0x1b, 0xac, 0xc1, 0xb6, + 0x65, 0x14, 0x1a, 0xf5, 0xa2, 0x5d, 0xd2, 0x0b, 0xad, 0x86, 0x99, 0x04, 0x6f, 0xbb, 0x05, 0x67, + 0x12, 0x68, 0x1a, 0xad, 0xa6, 0xaa, 0x90, 0x8b, 0x70, 0x2e, 0x21, 0x6f, 0xcf, 0xc8, 0xeb, 0xed, + 0x56, 0xb9, 0xae, 0xa6, 0xa6, 0x14, 0xb6, 0xac, 0x86, 0x9a, 0xce, 0xfd, 0xa6, 0x02, 0x6b, 0xf8, + 0x6e, 0x41, 0xf9, 0xc5, 0x36, 0xfa, 0x5a, 0x3e, 0x03, 0xe7, 0xdb, 0x96, 0x61, 0xda, 0xad, 0xc6, + 0x5d, 0xa3, 0x6e, 0xb7, 0x2d, 0x7d, 0x27, 0xda, 0x9a, 0x8b, 0x70, 0x4e, 0xa2, 0x30, 0x8d, 0x42, + 0x63, 0xd7, 0x30, 0xed, 0xa6, 0x6e, 0x59, 0x7b, 0x0d, 0xb3, 0xa8, 0x2a, 0xf4, 0x8b, 0x09, 0x04, + 0xb5, 0x92, 0xce, 0x5a, 0x13, 0xca, 0xab, 0x1b, 0x7b, 0x7a, 0xd5, 0xce, 0x37, 0x5a, 0x6a, 0x3a, + 0x57, 0xa3, 0x57, 0x2f, 0x82, 0x4c, 0x32, 0xdb, 0xc2, 0x25, 0xc8, 0xd4, 0x1b, 0x75, 0x23, 0xfa, + 0xbc, 0xb8, 0x02, 0x4b, 0x7a, 0xb3, 0x69, 0x36, 0x76, 0x71, 0x89, 0x01, 0x2c, 0x14, 0x8d, 0x3a, + 0x6d, 0x59, 0x9a, 0xe6, 0x34, 0xcd, 0x46, 0xad, 0xd1, 0x32, 0x8a, 0x6a, 0x26, 0x67, 0x8a, 0x2d, + 0x2c, 0x2a, 0xdd, 0x1f, 0xb0, 0xb7, 0xbc, 0xa2, 0x51, 0xd2, 0xdb, 0xd5, 0x16, 0x9f, 0xa2, 0x7b, + 0xb6, 0x69, 0xbc, 0xd5, 0x36, 0xac, 0x96, 0xa5, 0x2a, 0x44, 0x85, 0x95, 0xba, 0x61, 0x14, 0x2d, + 0xdb, 0x34, 0x76, 0x2b, 0xc6, 0x9e, 0x9a, 0xa2, 0x75, 0xb2, 0xff, 0xe9, 0x17, 0x72, 0x1f, 0x29, + 0x40, 0x18, 0x40, 0xa7, 0x88, 0xfa, 0x80, 0x2b, 0x66, 0x1b, 0xb6, 0xca, 0x74, 0xaa, 0xb1, 0x6b, + 0xb5, 0x46, 0x31, 0x3a, 0x64, 0x67, 0x80, 0x44, 0xf2, 0x1b, 0xa5, 0x92, 0xaa, 0x90, 0x73, 0x70, + 0x2a, 0x92, 0x5e, 0x34, 0x1b, 0x4d, 0x35, 0xb5, 0x95, 0x5a, 0x52, 0xc8, 0xd9, 0x58, 0xe6, 0x5d, + 0xc3, 0x68, 0xaa, 0x69, 0x3a, 0x45, 0x91, 0x0c, 0xb1, 0x25, 0x58, 0xf1, 0x4c, 0xee, 0x3b, 0x0a, + 0x9c, 0x61, 0xcd, 0x14, 0xfb, 0xcb, 0x6f, 0xea, 0x79, 0xd8, 0xe4, 0xb0, 0xc3, 0x49, 0x0d, 0x3d, + 0x0d, 0x6a, 0x28, 0x97, 0x35, 0xf3, 0x29, 0xd8, 0x08, 0xa5, 0x62, 0x3b, 0x52, 0xf4, 0xf4, 0x08, + 0x25, 0xe7, 0x0d, 0xab, 0x65, 0x1b, 0xa5, 0x52, 0xc3, 0x6c, 0xb1, 0x86, 0xa4, 0x73, 0x1a, 0x6c, + 0x14, 0xdc, 0x91, 0x47, 0xa5, 0xa2, 0xfe, 0xb8, 0x3b, 0xe8, 0x63, 0x13, 0x56, 0x61, 0xd9, 0xf8, + 0x7a, 0xcb, 0xa8, 0x5b, 0x95, 0x46, 0x5d, 0x9d, 0xcb, 0x9d, 0x8f, 0xd0, 0x88, 0x7d, 0x6c, 0x59, + 0x65, 0x75, 0x2e, 0xe7, 0xc0, 0xaa, 0xb0, 0x87, 0x66, 0xab, 0x62, 0x1b, 0xb6, 0xc4, 0x5a, 0xc3, + 0x13, 0x25, 0xda, 0x85, 0x4d, 0x38, 0x1d, 0xcf, 0x37, 0x5a, 0xaa, 0x42, 0x67, 0x21, 0x92, 0x43, + 0xd3, 0x53, 0xb9, 0x5f, 0x57, 0x60, 0xd5, 0x7f, 0xcf, 0x40, 0x0d, 0xea, 0x45, 0x38, 0x57, 0x2b, + 0xe9, 0x76, 0xd1, 0xd8, 0xad, 0x14, 0x0c, 0xfb, 0x6e, 0xa5, 0x5e, 0x8c, 0x7c, 0xe4, 0x69, 0x78, + 0x2a, 0x81, 0x00, 0xbf, 0xb2, 0x09, 0xa7, 0xa3, 0x59, 0x2d, 0xba, 0x55, 0x53, 0x74, 0xe8, 0xa3, + 0x39, 0xfe, 0x3e, 0x4d, 0xe7, 0xfe, 0x58, 0x81, 0x4d, 0x1e, 0x56, 0x9b, 0xbf, 0xac, 0xb0, 0x78, + 0x0b, 0x08, 0x48, 0x9a, 0x83, 0x6b, 0x2d, 0xb3, 0x6d, 0xb5, 0x8c, 0xa2, 0x28, 0x4e, 0x17, 0x6d, + 0xc5, 0x34, 0x6a, 0x46, 0xbd, 0x15, 0x69, 0xdb, 0xb3, 0xf0, 0xa5, 0x19, 0xb4, 0xf5, 0x46, 0x4b, + 0xfc, 0xa6, 0x7b, 0xf5, 0x4b, 0x70, 0x79, 0x06, 0xb1, 0x4f, 0x98, 0xca, 0xed, 0xc2, 0x9a, 0xa5, + 0xd7, 0xaa, 0xa5, 0xc1, 0x68, 0xdf, 0xd5, 0x27, 0xde, 0x51, 0x9f, 0x9c, 0x83, 0xb3, 0xa5, 0x86, + 0x59, 0x30, 0x6c, 0xec, 0x41, 0xa4, 0x11, 0xa7, 0x60, 0x5d, 0xce, 0xbc, 0x67, 0xd0, 0xdd, 0x45, + 0x60, 0x4d, 0x4e, 0xac, 0x37, 0xd4, 0x54, 0xee, 0x1b, 0xb0, 0x12, 0x8a, 0x4d, 0x75, 0x16, 0x4e, + 0xc9, 0xbf, 0xf9, 0xe3, 0xaa, 0x3a, 0x17, 0xcd, 0x30, 0x27, 0xfd, 0x3e, 0xcd, 0xc0, 0xe3, 0x46, + 0xce, 0x68, 0xb9, 0xa3, 0xe3, 0x6e, 0xdf, 0xf1, 0xdc, 0x8e, 0x9a, 0xca, 0xbd, 0x00, 0xab, 0x21, + 0x44, 0x5c, 0xba, 0xae, 0xaa, 0x0d, 0x7e, 0x3f, 0xd4, 0x8c, 0x62, 0xa5, 0x5d, 0x53, 0xe7, 0xe9, + 0x41, 0x53, 0xae, 0xec, 0x94, 0x55, 0xc8, 0xfd, 0x9e, 0x42, 0x25, 0x14, 0x1c, 0xf7, 0x5a, 0x49, + 0x17, 0x2b, 0x91, 0xee, 0x02, 0x86, 0xb3, 0x6d, 0x58, 0x16, 0x7b, 0xf4, 0x3f, 0x0f, 0x9b, 0xfc, + 0x87, 0xad, 0xd7, 0x8b, 0x76, 0x59, 0x37, 0x8b, 0x7b, 0xba, 0x49, 0xb7, 0xc6, 0x3d, 0x35, 0x85, + 0xfb, 0x5d, 0x4a, 0xb1, 0x5b, 0x8d, 0x76, 0xa1, 0xac, 0xa6, 0xe9, 0xf6, 0x0a, 0xa5, 0x37, 0x2b, + 0x75, 0x35, 0x83, 0xa7, 0x47, 0x8c, 0x1a, 0xab, 0xa5, 0xf9, 0xf3, 0xb9, 0x4f, 0x14, 0x38, 0x6b, + 0x75, 0x0f, 0xfb, 0x8e, 0x37, 0x19, 0xb9, 0x7a, 0xef, 0x70, 0x30, 0xea, 0x7a, 0x47, 0xc7, 0xd6, + 0xa4, 0xeb, 0xb9, 0xe4, 0x06, 0x5c, 0xb5, 0x2a, 0x3b, 0x75, 0xbd, 0x45, 0x77, 0xbf, 0x5e, 0xdd, + 0x69, 0x98, 0x95, 0x56, 0xb9, 0x66, 0x5b, 0xed, 0x4a, 0x6c, 0x63, 0x5c, 0x81, 0x67, 0xa6, 0x93, + 0x56, 0x8d, 0x1d, 0xbd, 0x70, 0x4f, 0x55, 0x66, 0x57, 0x98, 0xd7, 0xab, 0x7a, 0xbd, 0x60, 0x14, + 0xed, 0xdd, 0x9b, 0x6a, 0x8a, 0x5c, 0x85, 0x4b, 0xd3, 0x49, 0x4b, 0x95, 0xa6, 0x45, 0xc9, 0xd2, + 0xb3, 0xbf, 0x5b, 0xb6, 0x6a, 0x94, 0x2a, 0x93, 0xeb, 0x82, 0x1a, 0x85, 0x08, 0x88, 0x99, 0x98, + 0x98, 0xed, 0x7a, 0x9d, 0xdd, 0x01, 0xeb, 0x90, 0x6d, 0xb4, 0xca, 0x86, 0xc9, 0xe1, 0xde, 0x11, + 0xdf, 0xbd, 0x5d, 0xa7, 0xcb, 0xaa, 0x61, 0x56, 0xde, 0xc6, 0xcb, 0x60, 0x13, 0x4e, 0x5b, 0x55, + 0xbd, 0x70, 0x17, 0x57, 0x7c, 0xa5, 0x6e, 0x17, 0xca, 0x7a, 0xbd, 0x6e, 0x54, 0x55, 0xc8, 0xfd, + 0x91, 0xc2, 0x6c, 0x3d, 0x92, 0x7c, 0x09, 0xc9, 0x73, 0x70, 0xbd, 0x71, 0xb7, 0xa5, 0xdb, 0xcd, + 0x6a, 0x7b, 0xa7, 0x52, 0xb7, 0xad, 0x7b, 0xf5, 0x82, 0x60, 0x5c, 0x0a, 0xf1, 0xf3, 0xf2, 0x3a, + 0x5c, 0x99, 0x49, 0x1d, 0x00, 0xb3, 0x5f, 0x03, 0x6d, 0x26, 0x25, 0xef, 0x48, 0xee, 0x47, 0x0a, + 0x9c, 0x9b, 0xf1, 0x36, 0x4b, 0x9e, 0x87, 0x1b, 0x65, 0x43, 0x2f, 0x56, 0x0d, 0xcb, 0xc2, 0x6d, + 0x64, 0xd4, 0x5b, 0xdc, 0x14, 0x25, 0xf1, 0x34, 0xbc, 0x01, 0x57, 0x67, 0x93, 0x07, 0xf7, 0xea, + 0x75, 0xb8, 0x32, 0x9b, 0x94, 0xdf, 0xb3, 0x29, 0x7a, 0x1a, 0xcd, 0xa6, 0xf4, 0xef, 0xe7, 0x74, + 0xee, 0x7b, 0x0a, 0x9c, 0x49, 0x56, 0x90, 0xd0, 0xb6, 0x55, 0xea, 0x56, 0x4b, 0xaf, 0x56, 0xed, + 0xa6, 0x6e, 0xea, 0x35, 0xdb, 0xa8, 0x9b, 0x8d, 0x6a, 0x35, 0xe9, 0x5e, 0xba, 0x02, 0xcf, 0x4c, + 0x27, 0xb5, 0x0a, 0x66, 0xa5, 0x49, 0x8f, 0x5e, 0x0d, 0xb6, 0xa7, 0x53, 0x19, 0x95, 0x82, 0xa1, + 0xa6, 0xf2, 0x6f, 0x7c, 0xfc, 0x2f, 0xdb, 0x73, 0x1f, 0x7f, 0xb2, 0xad, 0xfc, 0xf8, 0x93, 0x6d, + 0xe5, 0x9f, 0x3f, 0xd9, 0x56, 0xde, 0x7e, 0xf6, 0x64, 0x31, 0x4d, 0x90, 0x69, 0x7f, 0x77, 0x01, + 0x0d, 0x48, 0x5e, 0xfe, 0xef, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfe, 0x2f, 0x8f, 0xb6, 0xaa, 0xaa, + 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -46092,6 +46147,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 { @@ -46115,6 +46180,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 { + n390, err390 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.PendingUserTasksNotificationExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.PendingUserTasksNotificationExpires):]) + if err390 != nil { + return 0, err390 + } + i -= n390 + i = encodeVarintTypes(dAtA, i, uint64(n390)) + 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) @@ -57639,6 +57748,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) } @@ -123261,6 +123392,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 c20d745d05a9b..c5c19a5152730 100644 --- a/lib/auth/usertasks/usertasksv1/service.go +++ b/lib/auth/usertasks/usertasksv1/service.go @@ -27,9 +27,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" @@ -37,13 +39,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 @@ -90,7 +104,7 @@ type Service struct { usertasksv1.UnimplementedUserTaskServiceServer authorizer authz.Authorizer - backend services.UserTasks + backend BackendService cache Reader usageReporter func() usagereporter.UsageReporter emitter apievents.Emitter @@ -112,6 +126,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 { @@ -130,6 +145,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 } @@ -234,6 +253,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 { @@ -259,6 +279,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 } @@ -289,6 +313,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 { @@ -323,6 +348,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 } @@ -391,3 +420,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 0f0a56fb4ef1c..6fae3f509955a 100644 --- a/lib/auth/usertasks/usertasksv1/service_test.go +++ b/lib/auth/usertasks/usertasksv1/service_test.go @@ -27,9 +27,13 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" + "github.com/google/uuid" "github.com/gravitational/trace" "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" @@ -88,7 +92,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{}) + backendService := newMockBackendService(t) + service := newService(t, fakeChecker{allowedVerbs: verbs}, backendService, testReporter, &libevents.DiscardEmitter{}) err := callMethod(t, service, tt.name) // expect access denied except with full set of verbs. if len(verbs) == len(tt.allowedVerbs) { @@ -119,7 +124,8 @@ func TestEvents(t *testing.T) { rwVerbs := []string{types.VerbList, types.VerbCreate, types.VerbRead, types.VerbUpdate, types.VerbDelete} testReporter := &mockUsageReporter{} auditEventsSink := eventstest.NewChannelEmitter(10) - service := newService(t, fakeChecker{allowedVerbs: rwVerbs}, testReporter, auditEventsSink) + backendService := newMockBackendService(t) + service := newService(t, fakeChecker{allowedVerbs: rwVerbs}, backendService, testReporter, auditEventsSink) ctx := context.Background() ut1, err := usertasks.NewDiscoverEC2UserTask(&usertasksv1.UserTaskSpec{ @@ -266,15 +272,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) *Service { +func newService(t *testing.T, checker services.AccessChecker, backendService BackendService, usageReporter usagereporter.UsageReporter, emitter apievents.Emitter) *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 { @@ -313,3 +313,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{}) + 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 7fe0b0f39398d..35f559f6c0067 100644 --- a/lib/srv/discovery/status.go +++ b/lib/srv/discovery/status.go @@ -377,12 +377,7 @@ func (d *awsEC2Tasks) addFailedEnrollment(g awsEC2TaskKey, instance *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 := 5 * time.Second // AcquireSemaphoreLock will retry until the semaphore is acquired. @@ -394,7 +389,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, @@ -422,13 +417,30 @@ func (s *Server) acquireSemaphoreForUserTask(userTaskName string) (releaseFn fun cancel() lease.Stop() if err := lease.Wait(); err != nil { - s.Log.WithError(err).WithField("semaphore", userTaskName).Warn("error cleaning up UserTask semaphore") + s.Log.WithError(err). + WithField("semaphore_kind", kind). + WithField("semaphore", semaphoreName). + Warn("Error cleaning up semaphore") } } 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 discover-ec2.instance is 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. // @@ -443,7 +455,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) } @@ -470,9 +482,11 @@ func (s *Server) mergeUpsertDiscoverEC2Task(taskGroup awsEC2TaskKey, failedInsta IssueType: taskGroup.issueType, State: usertasks.TaskStateOpen, DiscoverEc2: &usertasksv1.DiscoverEC2{ - AccountId: taskGroup.accountID, - Region: taskGroup.region, - Instances: failedInstances, + AccountId: taskGroup.accountID, + Region: taskGroup.region, + SsmDocument: taskGroup.ssmDocument, + InstallerScript: taskGroup.installerScript, + Instances: failedInstances, }, }, usertasks.WithExpiration(taskExpiration), @@ -528,7 +542,7 @@ func (s *Server) upsertTasksForAWSEC2FailedEnrollments() { "aws_account_id": g.accountID, "aws_region": g.region, }, - ).Warning("Failed to create discover ec2 user task.", g.integration, g.issueType, g.accountID, g.region) + ).Warning("Failed to create discover ec2 user task.") continue }