From 1348d81fd4b291d363b28f308292a760721e71ac Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Mon, 21 Oct 2024 16:18:25 -0400 Subject: [PATCH 01/70] Add autoupdate agent protos (#47666) * Add autoupdate agent protos * fix tests * Add create/update/delete RPCs + add missing event proto * Update api/proto/teleport/autoupdate/v1/autoupdate.proto Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> * address timr's feedback + fix tests * buf lint * buf lint pt.2 --------- Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> --- api/client/proto/event.pb.go | 63 +- .../teleport/autoupdate/v1/autoupdate.pb.go | 983 +++- .../autoupdate/v1/autoupdate_service.pb.go | 518 +- .../v1/autoupdate_service_grpc.pb.go | 220 +- .../teleport/autoupdate/v1/autoupdate.proto | 125 + .../autoupdate/v1/autoupdate_service.proto | 36 + .../teleport/legacy/client/proto/event.proto | 2 + .../teleport/legacy/types/events/events.proto | 98 +- api/types/events/events.pb.go | 4490 ++++++----------- .../autoupdate/autoupdatev1/service_test.go | 12 + 10 files changed, 3375 insertions(+), 3172 deletions(-) diff --git a/api/client/proto/event.pb.go b/api/client/proto/event.pb.go index ac356c9c606b1..f022839dcd0c5 100644 --- a/api/client/proto/event.pb.go +++ b/api/client/proto/event.pb.go @@ -181,6 +181,7 @@ type Event struct { // *Event_UserTask // *Event_DynamicWindowsDesktop // *Event_ProvisioningPrincipalState + // *Event_AutoUpdateAgentRollout Resource isEvent_Resource `protobuf_oneof:"Resource"` } @@ -683,6 +684,13 @@ func (x *Event) GetProvisioningPrincipalState() *v113.PrincipalState { return nil } +func (x *Event) GetAutoUpdateAgentRollout() *v111.AutoUpdateAgentRollout { + if x, ok := x.GetResource().(*Event_AutoUpdateAgentRollout); ok { + return x.AutoUpdateAgentRollout + } + return nil +} + type isEvent_Resource interface { isEvent_Resource() } @@ -1016,6 +1024,11 @@ type Event_ProvisioningPrincipalState struct { ProvisioningPrincipalState *v113.PrincipalState `protobuf:"bytes,70,opt,name=ProvisioningPrincipalState,proto3,oneof"` } +type Event_AutoUpdateAgentRollout struct { + // AutoUpdateVersion is a resource for controlling the autoupdate agent rollout. + AutoUpdateAgentRollout *v111.AutoUpdateAgentRollout `protobuf:"bytes,71,opt,name=AutoUpdateAgentRollout,proto3,oneof"` +} + func (*Event_ResourceHeader) isEvent_Resource() {} func (*Event_CertAuthority) isEvent_Resource() {} @@ -1146,6 +1159,8 @@ func (*Event_DynamicWindowsDesktop) isEvent_Resource() {} func (*Event_ProvisioningPrincipalState) isEvent_Resource() {} +func (*Event_AutoUpdateAgentRollout) isEvent_Resource() {} + var File_teleport_legacy_client_proto_event_proto protoreflect.FileDescriptor var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ @@ -1201,7 +1216,7 @@ var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ 0x72, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x1a, 0x26, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2f, 0x76, 0x31, 0x2f, 0x75, 0x73, 0x65, 0x72, 0x5f, 0x74, 0x61, 0x73, 0x6b, 0x73, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, - 0x8c, 0x25, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x54, 0x79, 0x70, + 0xf6, 0x25, 0x0a, 0x05, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x24, 0x0a, 0x04, 0x54, 0x79, 0x70, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x10, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2e, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x04, 0x54, 0x79, 0x70, 0x65, 0x12, 0x3f, 0x0a, 0x0e, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x48, 0x65, 0x61, 0x64, 0x65, @@ -1492,19 +1507,26 @@ var file_teleport_legacy_client_proto_event_proto_rawDesc = []byte{ 0x67, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x48, 0x00, 0x52, 0x1a, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x42, 0x0a, 0x0a, 0x08, 0x52, 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, - 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, 0x31, 0x10, 0x32, 0x4a, 0x04, 0x08, 0x3f, 0x10, 0x40, 0x4a, - 0x04, 0x08, 0x44, 0x10, 0x45, 0x52, 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, - 0x6c, 0x6f, 0x75, 0x64, 0x41, 0x75, 0x64, 0x69, 0x74, 0x52, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x69, - 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, 0x73, 0x65, 0x72, 0x52, 0x13, 0x41, 0x75, 0x74, 0x6f, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x2a, 0x2a, - 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x49, - 0x4e, 0x49, 0x54, 0x10, 0x00, 0x12, 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x0a, - 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x10, 0x02, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, - 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, - 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, - 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x65, 0x12, 0x68, 0x0a, 0x16, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x47, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, + 0x74, 0x48, 0x00, 0x52, 0x16, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x42, 0x0a, 0x0a, 0x08, 0x52, + 0x65, 0x73, 0x6f, 0x75, 0x72, 0x63, 0x65, 0x4a, 0x04, 0x08, 0x07, 0x10, 0x08, 0x4a, 0x04, 0x08, + 0x31, 0x10, 0x32, 0x4a, 0x04, 0x08, 0x3f, 0x10, 0x40, 0x4a, 0x04, 0x08, 0x44, 0x10, 0x45, 0x52, + 0x12, 0x45, 0x78, 0x74, 0x65, 0x72, 0x6e, 0x61, 0x6c, 0x43, 0x6c, 0x6f, 0x75, 0x64, 0x41, 0x75, + 0x64, 0x69, 0x74, 0x52, 0x0e, 0x53, 0x74, 0x61, 0x74, 0x69, 0x63, 0x48, 0x6f, 0x73, 0x74, 0x55, + 0x73, 0x65, 0x72, 0x52, 0x13, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x50, 0x6c, 0x61, 0x6e, 0x2a, 0x2a, 0x0a, 0x09, 0x4f, 0x70, 0x65, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x08, 0x0a, 0x04, 0x49, 0x4e, 0x49, 0x54, 0x10, 0x00, 0x12, + 0x07, 0x0a, 0x03, 0x50, 0x55, 0x54, 0x10, 0x01, 0x12, 0x0a, 0x0a, 0x06, 0x44, 0x45, 0x4c, 0x45, + 0x54, 0x45, 0x10, 0x02, 0x42, 0x34, 0x5a, 0x32, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x63, 0x6c, + 0x69, 0x65, 0x6e, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x33, } var ( @@ -1586,6 +1608,7 @@ var file_teleport_legacy_client_proto_event_proto_goTypes = []any{ (*v112.UserTask)(nil), // 61: teleport.usertasks.v1.UserTask (*types.DynamicWindowsDesktopV1)(nil), // 62: types.DynamicWindowsDesktopV1 (*v113.PrincipalState)(nil), // 63: teleport.provisioning.v1.PrincipalState + (*v111.AutoUpdateAgentRollout)(nil), // 64: teleport.autoupdate.v1.AutoUpdateAgentRollout } var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 0, // 0: proto.Event.Type:type_name -> proto.Operation @@ -1654,11 +1677,12 @@ var file_teleport_legacy_client_proto_event_proto_depIdxs = []int32{ 61, // 63: proto.Event.UserTask:type_name -> teleport.usertasks.v1.UserTask 62, // 64: proto.Event.DynamicWindowsDesktop:type_name -> types.DynamicWindowsDesktopV1 63, // 65: proto.Event.ProvisioningPrincipalState:type_name -> teleport.provisioning.v1.PrincipalState - 66, // [66:66] is the sub-list for method output_type - 66, // [66:66] is the sub-list for method input_type - 66, // [66:66] is the sub-list for extension type_name - 66, // [66:66] is the sub-list for extension extendee - 0, // [0:66] is the sub-list for field type_name + 64, // 66: proto.Event.AutoUpdateAgentRollout:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRollout + 67, // [67:67] is the sub-list for method output_type + 67, // [67:67] is the sub-list for method input_type + 67, // [67:67] is the sub-list for extension type_name + 67, // [67:67] is the sub-list for extension extendee + 0, // [0:67] is the sub-list for field type_name } func init() { file_teleport_legacy_client_proto_event_proto_init() } @@ -1732,6 +1756,7 @@ func file_teleport_legacy_client_proto_event_proto_init() { (*Event_UserTask)(nil), (*Event_DynamicWindowsDesktop)(nil), (*Event_ProvisioningPrincipalState)(nil), + (*Event_AutoUpdateAgentRollout)(nil), } type x struct{} out := protoimpl.TypeBuilder{ diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go index be298bcc51b60..6213401019f87 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go @@ -24,6 +24,8 @@ import ( v1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" protoreflect "google.golang.org/protobuf/reflect/protoreflect" protoimpl "google.golang.org/protobuf/runtime/protoimpl" + durationpb "google.golang.org/protobuf/types/known/durationpb" + timestamppb "google.golang.org/protobuf/types/known/timestamppb" reflect "reflect" sync "sync" ) @@ -35,6 +37,70 @@ const ( _ = protoimpl.EnforceVersion(protoimpl.MaxVersion - 20) ) +// AutoUpdateAgentGroupState represents the agent group state. This state controls whether the agents from this group +// should install the start version, the target version, and if they should update immediately or wait. +type AutoUpdateAgentGroupState int32 + +const ( + // AUTO_UPDATE_AGENT_GROUP_STATE_UNSPECIFIED state + AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_UNSPECIFIED AutoUpdateAgentGroupState = 0 + // AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED represents that the group update has not been started yet. + AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED AutoUpdateAgentGroupState = 1 + // AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE represents that the group is actively getting updated. + // New agents should run v2, existing agents are instructed to update to v2. + AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE AutoUpdateAgentGroupState = 2 + // AUTO_UPDATE_AGENT_GROUP_STATE_DONE represents that the group has been updated. New agents should run v2. + AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_DONE AutoUpdateAgentGroupState = 3 + // AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK represents that the group has been rolleback. + // New agents should run v1, existing agents should update to v1. + AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK AutoUpdateAgentGroupState = 4 +) + +// Enum value maps for AutoUpdateAgentGroupState. +var ( + AutoUpdateAgentGroupState_name = map[int32]string{ + 0: "AUTO_UPDATE_AGENT_GROUP_STATE_UNSPECIFIED", + 1: "AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED", + 2: "AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE", + 3: "AUTO_UPDATE_AGENT_GROUP_STATE_DONE", + 4: "AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK", + } + AutoUpdateAgentGroupState_value = map[string]int32{ + "AUTO_UPDATE_AGENT_GROUP_STATE_UNSPECIFIED": 0, + "AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED": 1, + "AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE": 2, + "AUTO_UPDATE_AGENT_GROUP_STATE_DONE": 3, + "AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK": 4, + } +) + +func (x AutoUpdateAgentGroupState) Enum() *AutoUpdateAgentGroupState { + p := new(AutoUpdateAgentGroupState) + *p = x + return p +} + +func (x AutoUpdateAgentGroupState) String() string { + return protoimpl.X.EnumStringOf(x.Descriptor(), protoreflect.EnumNumber(x)) +} + +func (AutoUpdateAgentGroupState) Descriptor() protoreflect.EnumDescriptor { + return file_teleport_autoupdate_v1_autoupdate_proto_enumTypes[0].Descriptor() +} + +func (AutoUpdateAgentGroupState) Type() protoreflect.EnumType { + return &file_teleport_autoupdate_v1_autoupdate_proto_enumTypes[0] +} + +func (x AutoUpdateAgentGroupState) Number() protoreflect.EnumNumber { + return protoreflect.EnumNumber(x) +} + +// Deprecated: Use AutoUpdateAgentGroupState.Descriptor instead. +func (AutoUpdateAgentGroupState) EnumDescriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{0} +} + // AutoUpdateConfig is a config singleton used to configure cluster // autoupdate settings. type AutoUpdateConfig struct { @@ -207,6 +273,203 @@ func (x *AutoUpdateConfigSpecTools) GetMode() string { return "" } +// AutoUpdateConfigSpecAgents encodes the parameters of automatic agent updates. +type AutoUpdateConfigSpecAgents struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // mode specifies whether agent autoupdates are enabled, disabled, or paused. + Mode string `protobuf:"bytes,1,opt,name=mode,proto3" json:"mode,omitempty"` + // strategy to use for updating the agents. + Strategy string `protobuf:"bytes,2,opt,name=strategy,proto3" json:"strategy,omitempty"` + // maintenance_window_duration is the maintenance window duration. This can only be set if `strategy` is "time-based". + // Once the window is over, the group transitions to the done state. Existing agents won't be updated until the next + // maintenance window. + MaintenanceWindowDuration *durationpb.Duration `protobuf:"bytes,3,opt,name=maintenance_window_duration,json=maintenanceWindowDuration,proto3" json:"maintenance_window_duration,omitempty"` + // agent_schedules specifies schedules for updates of grouped agents. + AgentSchedules *AgentAutoUpdateSchedules `protobuf:"bytes,5,opt,name=agent_schedules,json=agentSchedules,proto3" json:"agent_schedules,omitempty"` +} + +func (x *AutoUpdateConfigSpecAgents) Reset() { + *x = AutoUpdateConfigSpecAgents{} + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AutoUpdateConfigSpecAgents) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoUpdateConfigSpecAgents) ProtoMessage() {} + +func (x *AutoUpdateConfigSpecAgents) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoUpdateConfigSpecAgents.ProtoReflect.Descriptor instead. +func (*AutoUpdateConfigSpecAgents) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{3} +} + +func (x *AutoUpdateConfigSpecAgents) GetMode() string { + if x != nil { + return x.Mode + } + return "" +} + +func (x *AutoUpdateConfigSpecAgents) GetStrategy() string { + if x != nil { + return x.Strategy + } + return "" +} + +func (x *AutoUpdateConfigSpecAgents) GetMaintenanceWindowDuration() *durationpb.Duration { + if x != nil { + return x.MaintenanceWindowDuration + } + return nil +} + +func (x *AutoUpdateConfigSpecAgents) GetAgentSchedules() *AgentAutoUpdateSchedules { + if x != nil { + return x.AgentSchedules + } + return nil +} + +// AgentAutoUpdateSchedules specifies update scheduled for grouped agents. +type AgentAutoUpdateSchedules struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // regular schedules for non-critical versions. + Regular []*AgentAutoUpdateGroup `protobuf:"bytes,1,rep,name=regular,proto3" json:"regular,omitempty"` +} + +func (x *AgentAutoUpdateSchedules) Reset() { + *x = AgentAutoUpdateSchedules{} + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[4] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AgentAutoUpdateSchedules) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AgentAutoUpdateSchedules) ProtoMessage() {} + +func (x *AgentAutoUpdateSchedules) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[4] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AgentAutoUpdateSchedules.ProtoReflect.Descriptor instead. +func (*AgentAutoUpdateSchedules) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{4} +} + +func (x *AgentAutoUpdateSchedules) GetRegular() []*AgentAutoUpdateGroup { + if x != nil { + return x.Regular + } + return nil +} + +// AgentAutoUpdateGroup specifies the update schedule for a group of agents. +type AgentAutoUpdateGroup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // name of the group + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // days when the update can run. Supported values are "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" and "*" + Days []string `protobuf:"bytes,2,rep,name=days,proto3" json:"days,omitempty"` + // start_hour to initiate update + StartHour int32 `protobuf:"varint,3,opt,name=start_hour,json=startHour,proto3" json:"start_hour,omitempty"` + // wait_days after last group succeeds before this group can run. This can only be used when the strategy is "halt-on-failure". + WaitDays int64 `protobuf:"varint,4,opt,name=wait_days,json=waitDays,proto3" json:"wait_days,omitempty"` +} + +func (x *AgentAutoUpdateGroup) Reset() { + *x = AgentAutoUpdateGroup{} + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[5] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AgentAutoUpdateGroup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AgentAutoUpdateGroup) ProtoMessage() {} + +func (x *AgentAutoUpdateGroup) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[5] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AgentAutoUpdateGroup.ProtoReflect.Descriptor instead. +func (*AgentAutoUpdateGroup) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{5} +} + +func (x *AgentAutoUpdateGroup) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AgentAutoUpdateGroup) GetDays() []string { + if x != nil { + return x.Days + } + return nil +} + +func (x *AgentAutoUpdateGroup) GetStartHour() int32 { + if x != nil { + return x.StartHour + } + return 0 +} + +func (x *AgentAutoUpdateGroup) GetWaitDays() int64 { + if x != nil { + return x.WaitDays + } + return 0 +} + // AutoUpdateVersion is a resource singleton with version required for // tools autoupdate. type AutoUpdateVersion struct { @@ -223,7 +486,7 @@ type AutoUpdateVersion struct { func (x *AutoUpdateVersion) Reset() { *x = AutoUpdateVersion{} - mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[6] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -235,7 +498,7 @@ func (x *AutoUpdateVersion) String() string { func (*AutoUpdateVersion) ProtoMessage() {} func (x *AutoUpdateVersion) ProtoReflect() protoreflect.Message { - mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[3] + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[6] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -248,7 +511,7 @@ func (x *AutoUpdateVersion) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoUpdateVersion.ProtoReflect.Descriptor instead. func (*AutoUpdateVersion) Descriptor() ([]byte, []int) { - return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{3} + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{6} } func (x *AutoUpdateVersion) GetKind() string { @@ -292,12 +555,13 @@ type AutoUpdateVersionSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tools *AutoUpdateVersionSpecTools `protobuf:"bytes,2,opt,name=tools,proto3" json:"tools,omitempty"` + Tools *AutoUpdateVersionSpecTools `protobuf:"bytes,2,opt,name=tools,proto3" json:"tools,omitempty"` + Agents *AutoUpdateVersionSpecAgents `protobuf:"bytes,3,opt,name=agents,proto3" json:"agents,omitempty"` } func (x *AutoUpdateVersionSpec) Reset() { *x = AutoUpdateVersionSpec{} - mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[4] + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[7] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -309,7 +573,7 @@ func (x *AutoUpdateVersionSpec) String() string { func (*AutoUpdateVersionSpec) ProtoMessage() {} func (x *AutoUpdateVersionSpec) ProtoReflect() protoreflect.Message { - mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[4] + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[7] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -322,7 +586,7 @@ func (x *AutoUpdateVersionSpec) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoUpdateVersionSpec.ProtoReflect.Descriptor instead. func (*AutoUpdateVersionSpec) Descriptor() ([]byte, []int) { - return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{4} + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{7} } func (x *AutoUpdateVersionSpec) GetTools() *AutoUpdateVersionSpecTools { @@ -332,6 +596,13 @@ func (x *AutoUpdateVersionSpec) GetTools() *AutoUpdateVersionSpecTools { return nil } +func (x *AutoUpdateVersionSpec) GetAgents() *AutoUpdateVersionSpecAgents { + if x != nil { + return x.Agents + } + return nil +} + // AutoUpdateVersionSpecTools encodes the parameters for client tools auto updates. type AutoUpdateVersionSpecTools struct { state protoimpl.MessageState @@ -345,7 +616,7 @@ type AutoUpdateVersionSpecTools struct { func (x *AutoUpdateVersionSpecTools) Reset() { *x = AutoUpdateVersionSpecTools{} - mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[5] + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[8] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -357,7 +628,7 @@ func (x *AutoUpdateVersionSpecTools) String() string { func (*AutoUpdateVersionSpecTools) ProtoMessage() {} func (x *AutoUpdateVersionSpecTools) ProtoReflect() protoreflect.Message { - mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[5] + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[8] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -370,7 +641,7 @@ func (x *AutoUpdateVersionSpecTools) ProtoReflect() protoreflect.Message { // Deprecated: Use AutoUpdateVersionSpecTools.ProtoReflect.Descriptor instead. func (*AutoUpdateVersionSpecTools) Descriptor() ([]byte, []int) { - return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{5} + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{8} } func (x *AutoUpdateVersionSpecTools) GetTargetVersion() string { @@ -380,6 +651,396 @@ func (x *AutoUpdateVersionSpecTools) GetTargetVersion() string { return "" } +// AutoUpdateVersionSpecAgents is the spec for the autoupdate version. +type AutoUpdateVersionSpecAgents struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // start_version is the version to update from. + StartVersion string `protobuf:"bytes,1,opt,name=start_version,json=startVersion,proto3" json:"start_version,omitempty"` + // target_version is the version to update to. + TargetVersion string `protobuf:"bytes,2,opt,name=target_version,json=targetVersion,proto3" json:"target_version,omitempty"` + // schedule to use for the rollout + Schedule string `protobuf:"bytes,3,opt,name=schedule,proto3" json:"schedule,omitempty"` + // autoupdate_mode to use for the rollout + Mode string `protobuf:"bytes,4,opt,name=mode,proto3" json:"mode,omitempty"` +} + +func (x *AutoUpdateVersionSpecAgents) Reset() { + *x = AutoUpdateVersionSpecAgents{} + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[9] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AutoUpdateVersionSpecAgents) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoUpdateVersionSpecAgents) ProtoMessage() {} + +func (x *AutoUpdateVersionSpecAgents) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[9] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoUpdateVersionSpecAgents.ProtoReflect.Descriptor instead. +func (*AutoUpdateVersionSpecAgents) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{9} +} + +func (x *AutoUpdateVersionSpecAgents) GetStartVersion() string { + if x != nil { + return x.StartVersion + } + return "" +} + +func (x *AutoUpdateVersionSpecAgents) GetTargetVersion() string { + if x != nil { + return x.TargetVersion + } + return "" +} + +func (x *AutoUpdateVersionSpecAgents) GetSchedule() string { + if x != nil { + return x.Schedule + } + return "" +} + +func (x *AutoUpdateVersionSpecAgents) GetMode() string { + if x != nil { + return x.Mode + } + return "" +} + +// AutoUpdateAgentRollout is the resource the Teleport Auth Service uses to track and control the rollout of a new +// agent version. This resource is written by the automatic agent update controller in the Teleport Auth Service +// and read by the Teleport Proxy Service. +type AutoUpdateAgentRollout struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Kind string `protobuf:"bytes,1,opt,name=kind,proto3" json:"kind,omitempty"` + SubKind string `protobuf:"bytes,2,opt,name=sub_kind,json=subKind,proto3" json:"sub_kind,omitempty"` + Version string `protobuf:"bytes,3,opt,name=version,proto3" json:"version,omitempty"` + Metadata *v1.Metadata `protobuf:"bytes,4,opt,name=metadata,proto3" json:"metadata,omitempty"` + Spec *AutoUpdateAgentRolloutSpec `protobuf:"bytes,5,opt,name=spec,proto3" json:"spec,omitempty"` + Status *AutoUpdateAgentRolloutStatus `protobuf:"bytes,6,opt,name=status,proto3" json:"status,omitempty"` +} + +func (x *AutoUpdateAgentRollout) Reset() { + *x = AutoUpdateAgentRollout{} + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AutoUpdateAgentRollout) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoUpdateAgentRollout) ProtoMessage() {} + +func (x *AutoUpdateAgentRollout) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoUpdateAgentRollout.ProtoReflect.Descriptor instead. +func (*AutoUpdateAgentRollout) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{10} +} + +func (x *AutoUpdateAgentRollout) GetKind() string { + if x != nil { + return x.Kind + } + return "" +} + +func (x *AutoUpdateAgentRollout) GetSubKind() string { + if x != nil { + return x.SubKind + } + return "" +} + +func (x *AutoUpdateAgentRollout) GetVersion() string { + if x != nil { + return x.Version + } + return "" +} + +func (x *AutoUpdateAgentRollout) GetMetadata() *v1.Metadata { + if x != nil { + return x.Metadata + } + return nil +} + +func (x *AutoUpdateAgentRollout) GetSpec() *AutoUpdateAgentRolloutSpec { + if x != nil { + return x.Spec + } + return nil +} + +func (x *AutoUpdateAgentRollout) GetStatus() *AutoUpdateAgentRolloutStatus { + if x != nil { + return x.Status + } + return nil +} + +// AutoUpdateAgentRolloutSpec describes the desired agent rollout. +// This is built by merging the user-provided AutoUpdateConfigSpecAgents and the operator-provided +// AutoUpdateVersionSpecAgents. +type AutoUpdateAgentRolloutSpec struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // start_version is the version to update from. + StartVersion string `protobuf:"bytes,1,opt,name=start_version,json=startVersion,proto3" json:"start_version,omitempty"` + // target_version is the version to update to. + TargetVersion string `protobuf:"bytes,2,opt,name=target_version,json=targetVersion,proto3" json:"target_version,omitempty"` + // schedule to use for the rollout. Supported values are "regular" and "immediate". + // - "regular" follows the regular group schedule + // - "immediate" updates all the agents immediately + Schedule string `protobuf:"bytes,3,opt,name=schedule,proto3" json:"schedule,omitempty"` + // autoupdate_mode to use for the rollout. Supported modes are: + // - "enabled": Teleport will update existing agents. + // - "disabled": Teleport will not update existing agents. + // - "suspended": Teleport will temporarily stop updating existing agents. + AutoupdateMode string `protobuf:"bytes,4,opt,name=autoupdate_mode,json=autoupdateMode,proto3" json:"autoupdate_mode,omitempty"` + // strategy to use for updating the agents. Supported strategies are: + // - "time-based": agents update as soon as their maintenance window starts. There is no dependency between groups. + // This strategy allows Teleport users to setup reliable follow-the-sun updates and enforce the maintenance window + // more strictly. A group finishes its update at the end of the maintenance window, regardless of the new version + // adoption rate. Agents that missed the maintenance window will not attempt to update until the next maintenance + // window. + // - "halt-on-failure": the update proceeds from the first group to the last group, ensuring that each group + // successfully updates before allowing the next group to proceed. This is the strategy that offers the best + // availability. A group finishes its update once most of its agents are running the correct version. Agents that + // missed the group update will try to catch back as soon as possible. + Strategy string `protobuf:"bytes,5,opt,name=strategy,proto3" json:"strategy,omitempty"` +} + +func (x *AutoUpdateAgentRolloutSpec) Reset() { + *x = AutoUpdateAgentRolloutSpec{} + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AutoUpdateAgentRolloutSpec) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoUpdateAgentRolloutSpec) ProtoMessage() {} + +func (x *AutoUpdateAgentRolloutSpec) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoUpdateAgentRolloutSpec.ProtoReflect.Descriptor instead. +func (*AutoUpdateAgentRolloutSpec) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{11} +} + +func (x *AutoUpdateAgentRolloutSpec) GetStartVersion() string { + if x != nil { + return x.StartVersion + } + return "" +} + +func (x *AutoUpdateAgentRolloutSpec) GetTargetVersion() string { + if x != nil { + return x.TargetVersion + } + return "" +} + +func (x *AutoUpdateAgentRolloutSpec) GetSchedule() string { + if x != nil { + return x.Schedule + } + return "" +} + +func (x *AutoUpdateAgentRolloutSpec) GetAutoupdateMode() string { + if x != nil { + return x.AutoupdateMode + } + return "" +} + +func (x *AutoUpdateAgentRolloutSpec) GetStrategy() string { + if x != nil { + return x.Strategy + } + return "" +} + +// AutoUpdateAgentRolloutStatus tracks the current agent rollout status. +type AutoUpdateAgentRolloutStatus struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Groups []*AutoUpdateAgentRolloutStatusGroup `protobuf:"bytes,1,rep,name=groups,proto3" json:"groups,omitempty"` +} + +func (x *AutoUpdateAgentRolloutStatus) Reset() { + *x = AutoUpdateAgentRolloutStatus{} + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AutoUpdateAgentRolloutStatus) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoUpdateAgentRolloutStatus) ProtoMessage() {} + +func (x *AutoUpdateAgentRolloutStatus) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoUpdateAgentRolloutStatus.ProtoReflect.Descriptor instead. +func (*AutoUpdateAgentRolloutStatus) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{12} +} + +func (x *AutoUpdateAgentRolloutStatus) GetGroups() []*AutoUpdateAgentRolloutStatusGroup { + if x != nil { + return x.Groups + } + return nil +} + +// AutoUpdateAgentRolloutStatusGroup tracks the current agent rollout status of a specific group. +type AutoUpdateAgentRolloutStatusGroup struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // name of the group + Name string `protobuf:"bytes,1,opt,name=name,proto3" json:"name,omitempty"` + // start_time of the rollout + StartTime *timestamppb.Timestamp `protobuf:"bytes,2,opt,name=start_time,json=startTime,proto3" json:"start_time,omitempty"` + // state is the current state of the rollout. + State AutoUpdateAgentGroupState `protobuf:"varint,3,opt,name=state,proto3,enum=teleport.autoupdate.v1.AutoUpdateAgentGroupState" json:"state,omitempty"` + // last_update_time is the time of the previous update for this group. + LastUpdateTime *timestamppb.Timestamp `protobuf:"bytes,4,opt,name=last_update_time,json=lastUpdateTime,proto3" json:"last_update_time,omitempty"` + // last_update_reason is the trigger for the last update + LastUpdateReason string `protobuf:"bytes,5,opt,name=last_update_reason,json=lastUpdateReason,proto3" json:"last_update_reason,omitempty"` +} + +func (x *AutoUpdateAgentRolloutStatusGroup) Reset() { + *x = AutoUpdateAgentRolloutStatusGroup{} + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *AutoUpdateAgentRolloutStatusGroup) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*AutoUpdateAgentRolloutStatusGroup) ProtoMessage() {} + +func (x *AutoUpdateAgentRolloutStatusGroup) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use AutoUpdateAgentRolloutStatusGroup.ProtoReflect.Descriptor instead. +func (*AutoUpdateAgentRolloutStatusGroup) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP(), []int{13} +} + +func (x *AutoUpdateAgentRolloutStatusGroup) GetName() string { + if x != nil { + return x.Name + } + return "" +} + +func (x *AutoUpdateAgentRolloutStatusGroup) GetStartTime() *timestamppb.Timestamp { + if x != nil { + return x.StartTime + } + return nil +} + +func (x *AutoUpdateAgentRolloutStatusGroup) GetState() AutoUpdateAgentGroupState { + if x != nil { + return x.State + } + return AutoUpdateAgentGroupState_AUTO_UPDATE_AGENT_GROUP_STATE_UNSPECIFIED +} + +func (x *AutoUpdateAgentRolloutStatusGroup) GetLastUpdateTime() *timestamppb.Timestamp { + if x != nil { + return x.LastUpdateTime + } + return nil +} + +func (x *AutoUpdateAgentRolloutStatusGroup) GetLastUpdateReason() string { + if x != nil { + return x.LastUpdateReason + } + return "" +} + var File_teleport_autoupdate_v1_autoupdate_proto protoreflect.FileDescriptor var file_teleport_autoupdate_v1_autoupdate_proto_rawDesc = []byte{ @@ -387,65 +1048,187 @@ var file_teleport_autoupdate_v1_autoupdate_proto_rawDesc = []byte{ 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x12, 0x16, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, - 0x31, 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x68, 0x65, 0x61, 0x64, - 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd7, 0x01, 0x0a, 0x10, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, - 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, - 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, - 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, - 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, - 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, - 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0x77, - 0x0a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x47, 0x0a, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x18, - 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, - 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x4a, - 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x10, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x61, 0x75, 0x74, - 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2f, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x6f, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x54, - 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xd9, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, - 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, - 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, - 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, - 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, - 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, - 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x12, 0x41, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, - 0x73, 0x70, 0x65, 0x63, 0x22, 0x76, 0x0a, 0x15, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x48, 0x0a, - 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, + 0x31, 0x1a, 0x1e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x64, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x1a, 0x1f, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, + 0x75, 0x66, 0x2f, 0x74, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x2e, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x1a, 0x21, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x68, 0x65, 0x61, + 0x64, 0x65, 0x72, 0x2f, 0x76, 0x31, 0x2f, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x2e, + 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x22, 0xd7, 0x01, 0x0a, 0x10, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, + 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, + 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, + 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x40, 0x0a, + 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, + 0x77, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x47, 0x0a, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, + 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, + 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x10, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x61, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2f, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x6f, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, + 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x1a, 0x41, 0x75, + 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, + 0x65, 0x63, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, + 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x59, 0x0a, 0x1b, 0x6d, 0x61, 0x69, 0x6e, + 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x64, + 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, + 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, + 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x19, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, + 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x44, 0x75, 0x72, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x0f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, - 0x52, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x0d, 0x74, - 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x1a, - 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0e, + 0x61, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x62, + 0x0a, 0x18, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x07, 0x72, 0x65, + 0x67, 0x75, 0x6c, 0x61, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x07, 0x72, 0x65, 0x67, 0x75, 0x6c, + 0x61, 0x72, 0x22, 0x7a, 0x0a, 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, + 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, + 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x6f, 0x75, 0x72, + 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x6f, 0x75, + 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x77, 0x61, 0x69, 0x74, 0x44, 0x61, 0x79, 0x73, 0x22, 0xd9, + 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, + 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, + 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, + 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, + 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, + 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xc3, 0x01, 0x0a, 0x15, 0x41, + 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x48, 0x0a, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, + 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x4b, + 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, + 0x02, 0x52, 0x0d, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x22, 0x43, 0x0a, 0x1a, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x25, + 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x99, 0x01, 0x0a, 0x1b, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, + 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, + 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, - 0x33, + 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, + 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, + 0x65, 0x22, 0xb1, 0x02, 0x0a, 0x16, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, + 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, + 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, + 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, + 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, + 0x46, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x70, 0x65, + 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x4c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1a, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, + 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x61, + 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, + 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, + 0x79, 0x22, 0x71, 0x0a, 0x1c, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, + 0x73, 0x12, 0x51, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, + 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, + 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x22, 0xaf, 0x02, 0x0a, 0x21, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, + 0x74, 0x61, 0x74, 0x75, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, + 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, + 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, + 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, + 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, + 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, + 0x74, 0x65, 0x12, 0x44, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, + 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, + 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2a, 0xf7, 0x01, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, + 0x74, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x29, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, + 0x41, 0x54, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, + 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, + 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, + 0x54, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, + 0x12, 0x28, 0x0a, 0x24, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, + 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, + 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x41, 0x55, + 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, + 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x4f, 0x4e, 0x45, + 0x10, 0x03, 0x12, 0x2c, 0x0a, 0x28, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, + 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, + 0x41, 0x54, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x44, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x04, + 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, + 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, + 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -460,28 +1243,51 @@ func file_teleport_autoupdate_v1_autoupdate_proto_rawDescGZIP() []byte { return file_teleport_autoupdate_v1_autoupdate_proto_rawDescData } -var file_teleport_autoupdate_v1_autoupdate_proto_msgTypes = make([]protoimpl.MessageInfo, 6) +var file_teleport_autoupdate_v1_autoupdate_proto_enumTypes = make([]protoimpl.EnumInfo, 1) +var file_teleport_autoupdate_v1_autoupdate_proto_msgTypes = make([]protoimpl.MessageInfo, 14) var file_teleport_autoupdate_v1_autoupdate_proto_goTypes = []any{ - (*AutoUpdateConfig)(nil), // 0: teleport.autoupdate.v1.AutoUpdateConfig - (*AutoUpdateConfigSpec)(nil), // 1: teleport.autoupdate.v1.AutoUpdateConfigSpec - (*AutoUpdateConfigSpecTools)(nil), // 2: teleport.autoupdate.v1.AutoUpdateConfigSpecTools - (*AutoUpdateVersion)(nil), // 3: teleport.autoupdate.v1.AutoUpdateVersion - (*AutoUpdateVersionSpec)(nil), // 4: teleport.autoupdate.v1.AutoUpdateVersionSpec - (*AutoUpdateVersionSpecTools)(nil), // 5: teleport.autoupdate.v1.AutoUpdateVersionSpecTools - (*v1.Metadata)(nil), // 6: teleport.header.v1.Metadata + (AutoUpdateAgentGroupState)(0), // 0: teleport.autoupdate.v1.AutoUpdateAgentGroupState + (*AutoUpdateConfig)(nil), // 1: teleport.autoupdate.v1.AutoUpdateConfig + (*AutoUpdateConfigSpec)(nil), // 2: teleport.autoupdate.v1.AutoUpdateConfigSpec + (*AutoUpdateConfigSpecTools)(nil), // 3: teleport.autoupdate.v1.AutoUpdateConfigSpecTools + (*AutoUpdateConfigSpecAgents)(nil), // 4: teleport.autoupdate.v1.AutoUpdateConfigSpecAgents + (*AgentAutoUpdateSchedules)(nil), // 5: teleport.autoupdate.v1.AgentAutoUpdateSchedules + (*AgentAutoUpdateGroup)(nil), // 6: teleport.autoupdate.v1.AgentAutoUpdateGroup + (*AutoUpdateVersion)(nil), // 7: teleport.autoupdate.v1.AutoUpdateVersion + (*AutoUpdateVersionSpec)(nil), // 8: teleport.autoupdate.v1.AutoUpdateVersionSpec + (*AutoUpdateVersionSpecTools)(nil), // 9: teleport.autoupdate.v1.AutoUpdateVersionSpecTools + (*AutoUpdateVersionSpecAgents)(nil), // 10: teleport.autoupdate.v1.AutoUpdateVersionSpecAgents + (*AutoUpdateAgentRollout)(nil), // 11: teleport.autoupdate.v1.AutoUpdateAgentRollout + (*AutoUpdateAgentRolloutSpec)(nil), // 12: teleport.autoupdate.v1.AutoUpdateAgentRolloutSpec + (*AutoUpdateAgentRolloutStatus)(nil), // 13: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatus + (*AutoUpdateAgentRolloutStatusGroup)(nil), // 14: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup + (*v1.Metadata)(nil), // 15: teleport.header.v1.Metadata + (*durationpb.Duration)(nil), // 16: google.protobuf.Duration + (*timestamppb.Timestamp)(nil), // 17: google.protobuf.Timestamp } var file_teleport_autoupdate_v1_autoupdate_proto_depIdxs = []int32{ - 6, // 0: teleport.autoupdate.v1.AutoUpdateConfig.metadata:type_name -> teleport.header.v1.Metadata - 1, // 1: teleport.autoupdate.v1.AutoUpdateConfig.spec:type_name -> teleport.autoupdate.v1.AutoUpdateConfigSpec - 2, // 2: teleport.autoupdate.v1.AutoUpdateConfigSpec.tools:type_name -> teleport.autoupdate.v1.AutoUpdateConfigSpecTools - 6, // 3: teleport.autoupdate.v1.AutoUpdateVersion.metadata:type_name -> teleport.header.v1.Metadata - 4, // 4: teleport.autoupdate.v1.AutoUpdateVersion.spec:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpec - 5, // 5: teleport.autoupdate.v1.AutoUpdateVersionSpec.tools:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpecTools - 6, // [6:6] is the sub-list for method output_type - 6, // [6:6] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 15, // 0: teleport.autoupdate.v1.AutoUpdateConfig.metadata:type_name -> teleport.header.v1.Metadata + 2, // 1: teleport.autoupdate.v1.AutoUpdateConfig.spec:type_name -> teleport.autoupdate.v1.AutoUpdateConfigSpec + 3, // 2: teleport.autoupdate.v1.AutoUpdateConfigSpec.tools:type_name -> teleport.autoupdate.v1.AutoUpdateConfigSpecTools + 16, // 3: teleport.autoupdate.v1.AutoUpdateConfigSpecAgents.maintenance_window_duration:type_name -> google.protobuf.Duration + 5, // 4: teleport.autoupdate.v1.AutoUpdateConfigSpecAgents.agent_schedules:type_name -> teleport.autoupdate.v1.AgentAutoUpdateSchedules + 6, // 5: teleport.autoupdate.v1.AgentAutoUpdateSchedules.regular:type_name -> teleport.autoupdate.v1.AgentAutoUpdateGroup + 15, // 6: teleport.autoupdate.v1.AutoUpdateVersion.metadata:type_name -> teleport.header.v1.Metadata + 8, // 7: teleport.autoupdate.v1.AutoUpdateVersion.spec:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpec + 9, // 8: teleport.autoupdate.v1.AutoUpdateVersionSpec.tools:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpecTools + 10, // 9: teleport.autoupdate.v1.AutoUpdateVersionSpec.agents:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpecAgents + 15, // 10: teleport.autoupdate.v1.AutoUpdateAgentRollout.metadata:type_name -> teleport.header.v1.Metadata + 12, // 11: teleport.autoupdate.v1.AutoUpdateAgentRollout.spec:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRolloutSpec + 13, // 12: teleport.autoupdate.v1.AutoUpdateAgentRollout.status:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRolloutStatus + 14, // 13: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatus.groups:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup + 17, // 14: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup.start_time:type_name -> google.protobuf.Timestamp + 0, // 15: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup.state:type_name -> teleport.autoupdate.v1.AutoUpdateAgentGroupState + 17, // 16: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup.last_update_time:type_name -> google.protobuf.Timestamp + 17, // [17:17] is the sub-list for method output_type + 17, // [17:17] is the sub-list for method input_type + 17, // [17:17] is the sub-list for extension type_name + 17, // [17:17] is the sub-list for extension extendee + 0, // [0:17] is the sub-list for field type_name } func init() { file_teleport_autoupdate_v1_autoupdate_proto_init() } @@ -494,13 +1300,14 @@ func file_teleport_autoupdate_v1_autoupdate_proto_init() { File: protoimpl.DescBuilder{ GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_teleport_autoupdate_v1_autoupdate_proto_rawDesc, - NumEnums: 0, - NumMessages: 6, + NumEnums: 1, + NumMessages: 14, NumExtensions: 0, NumServices: 0, }, GoTypes: file_teleport_autoupdate_v1_autoupdate_proto_goTypes, DependencyIndexes: file_teleport_autoupdate_v1_autoupdate_proto_depIdxs, + EnumInfos: file_teleport_autoupdate_v1_autoupdate_proto_enumTypes, MessageInfos: file_teleport_autoupdate_v1_autoupdate_proto_msgTypes, }.Build() File_teleport_autoupdate_v1_autoupdate_proto = out.File diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go index e938af2cc8eb2..fe03262d93800 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service.pb.go @@ -459,6 +459,218 @@ func (*DeleteAutoUpdateVersionRequest) Descriptor() ([]byte, []int) { return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{9} } +// Request for GetAutoUpdateAgentRollout. +type GetAutoUpdateAgentRolloutRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *GetAutoUpdateAgentRolloutRequest) Reset() { + *x = GetAutoUpdateAgentRolloutRequest{} + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[10] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *GetAutoUpdateAgentRolloutRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*GetAutoUpdateAgentRolloutRequest) ProtoMessage() {} + +func (x *GetAutoUpdateAgentRolloutRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[10] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use GetAutoUpdateAgentRolloutRequest.ProtoReflect.Descriptor instead. +func (*GetAutoUpdateAgentRolloutRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{10} +} + +// Request for CreateAutoUpdateAgentRollout. +type CreateAutoUpdateAgentRolloutRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rollout *AutoUpdateAgentRollout `protobuf:"bytes,1,opt,name=rollout,proto3" json:"rollout,omitempty"` +} + +func (x *CreateAutoUpdateAgentRolloutRequest) Reset() { + *x = CreateAutoUpdateAgentRolloutRequest{} + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[11] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *CreateAutoUpdateAgentRolloutRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*CreateAutoUpdateAgentRolloutRequest) ProtoMessage() {} + +func (x *CreateAutoUpdateAgentRolloutRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[11] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use CreateAutoUpdateAgentRolloutRequest.ProtoReflect.Descriptor instead. +func (*CreateAutoUpdateAgentRolloutRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{11} +} + +func (x *CreateAutoUpdateAgentRolloutRequest) GetRollout() *AutoUpdateAgentRollout { + if x != nil { + return x.Rollout + } + return nil +} + +// Request for UpdateAutoUpdateConfig. +type UpdateAutoUpdateAgentRolloutRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rollout *AutoUpdateAgentRollout `protobuf:"bytes,1,opt,name=rollout,proto3" json:"rollout,omitempty"` +} + +func (x *UpdateAutoUpdateAgentRolloutRequest) Reset() { + *x = UpdateAutoUpdateAgentRolloutRequest{} + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpdateAutoUpdateAgentRolloutRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpdateAutoUpdateAgentRolloutRequest) ProtoMessage() {} + +func (x *UpdateAutoUpdateAgentRolloutRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpdateAutoUpdateAgentRolloutRequest.ProtoReflect.Descriptor instead. +func (*UpdateAutoUpdateAgentRolloutRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{12} +} + +func (x *UpdateAutoUpdateAgentRolloutRequest) GetRollout() *AutoUpdateAgentRollout { + if x != nil { + return x.Rollout + } + return nil +} + +// Request for UpsertAutoUpdateAgentRollout. +type UpsertAutoUpdateAgentRolloutRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + Rollout *AutoUpdateAgentRollout `protobuf:"bytes,1,opt,name=rollout,proto3" json:"rollout,omitempty"` +} + +func (x *UpsertAutoUpdateAgentRolloutRequest) Reset() { + *x = UpsertAutoUpdateAgentRolloutRequest{} + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *UpsertAutoUpdateAgentRolloutRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*UpsertAutoUpdateAgentRolloutRequest) ProtoMessage() {} + +func (x *UpsertAutoUpdateAgentRolloutRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use UpsertAutoUpdateAgentRolloutRequest.ProtoReflect.Descriptor instead. +func (*UpsertAutoUpdateAgentRolloutRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{13} +} + +func (x *UpsertAutoUpdateAgentRolloutRequest) GetRollout() *AutoUpdateAgentRollout { + if x != nil { + return x.Rollout + } + return nil +} + +// Request for DeleteAutoUpdateAgentRollout. +type DeleteAutoUpdateAgentRolloutRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *DeleteAutoUpdateAgentRolloutRequest) Reset() { + *x = DeleteAutoUpdateAgentRolloutRequest{} + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *DeleteAutoUpdateAgentRolloutRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*DeleteAutoUpdateAgentRolloutRequest) ProtoMessage() {} + +func (x *DeleteAutoUpdateAgentRolloutRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use DeleteAutoUpdateAgentRolloutRequest.ProtoReflect.Descriptor instead. +func (*DeleteAutoUpdateAgentRolloutRequest) Descriptor() ([]byte, []int) { + return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP(), []int{14} +} + var File_teleport_autoupdate_v1_autoupdate_service_proto protoreflect.FileDescriptor var file_teleport_autoupdate_v1_autoupdate_service_proto_rawDesc = []byte{ @@ -516,89 +728,158 @@ var file_teleport_autoupdate_v1_autoupdate_service_proto_rawDesc = []byte{ 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x20, 0x0a, 0x1e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0xbf, 0x09, - 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, - 0x69, 0x63, 0x65, 0x12, 0x73, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, - 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x79, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, - 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, - 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, - 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x22, 0x0a, + 0x20, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x22, 0x6f, 0x0a, 0x23, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, + 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x48, 0x0a, 0x07, 0x72, 0x6f, 0x6c, 0x6c, + 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, - 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, - 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x2e, + 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, 0x6f, + 0x75, 0x74, 0x22, 0x6f, 0x0a, 0x23, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, + 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x48, 0x0a, 0x07, 0x72, 0x6f, 0x6c, + 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x52, 0x07, 0x72, 0x6f, 0x6c, 0x6c, + 0x6f, 0x75, 0x74, 0x22, 0x6f, 0x0a, 0x23, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, + 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x48, 0x0a, 0x07, 0x72, 0x6f, + 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2e, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x52, 0x07, 0x72, 0x6f, 0x6c, + 0x6c, 0x6f, 0x75, 0x74, 0x22, 0x25, 0x0a, 0x23, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, + 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, + 0x6c, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x32, 0xe6, 0x0e, 0x0a, 0x11, + 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, + 0x65, 0x12, 0x73, 0x0a, 0x13, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x79, 0x0a, 0x16, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x79, 0x0a, 0x16, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, + 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x79, 0x0a, 0x16, + 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, - 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, - 0x75, 0x65, 0x73, 0x74, 0x1a, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, - 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, - 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x79, - 0x0a, 0x16, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x67, 0x0a, 0x16, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, + 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, + 0x12, 0x76, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x12, 0x67, 0x0a, 0x16, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, - 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, - 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, - 0x74, 0x79, 0x12, 0x76, 0x0a, 0x14, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x33, 0x2e, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, - 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x17, 0x43, 0x72, - 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, - 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, + 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, + 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x17, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x17, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x17, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, - 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, - 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x69, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, + 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x7c, 0x0a, 0x17, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, - 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x42, - 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, - 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, - 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, - 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x69, 0x0a, 0x17, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x36, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, 0x6d, 0x70, 0x74, 0x79, 0x12, 0x85, 0x01, + 0x0a, 0x19, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x38, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, + 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, + 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, + 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x8b, 0x01, 0x0a, 0x1c, 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, + 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x3b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x43, 0x72, 0x65, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, + 0x6f, 0x75, 0x74, 0x12, 0x8b, 0x01, 0x0a, 0x1c, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, + 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, + 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x3b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, + 0x64, 0x61, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, + 0x74, 0x1a, 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, + 0x74, 0x12, 0x8b, 0x01, 0x0a, 0x1c, 0x55, 0x70, 0x73, 0x65, 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, + 0x75, 0x74, 0x12, 0x3b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, + 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x70, 0x73, 0x65, + 0x72, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, + 0x2e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, + 0x73, 0x0a, 0x1c, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, + 0x3b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x44, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x41, + 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, + 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x16, 0x2e, 0x67, + 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x45, + 0x6d, 0x70, 0x74, 0x79, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, + 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, + 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, + 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, + 0x31, 0x3b, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, + 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -613,54 +894,73 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescGZIP() []byte { return file_teleport_autoupdate_v1_autoupdate_service_proto_rawDescData } -var file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes = make([]protoimpl.MessageInfo, 10) +var file_teleport_autoupdate_v1_autoupdate_service_proto_msgTypes = make([]protoimpl.MessageInfo, 15) var file_teleport_autoupdate_v1_autoupdate_service_proto_goTypes = []any{ - (*GetAutoUpdateConfigRequest)(nil), // 0: teleport.autoupdate.v1.GetAutoUpdateConfigRequest - (*CreateAutoUpdateConfigRequest)(nil), // 1: teleport.autoupdate.v1.CreateAutoUpdateConfigRequest - (*UpdateAutoUpdateConfigRequest)(nil), // 2: teleport.autoupdate.v1.UpdateAutoUpdateConfigRequest - (*UpsertAutoUpdateConfigRequest)(nil), // 3: teleport.autoupdate.v1.UpsertAutoUpdateConfigRequest - (*DeleteAutoUpdateConfigRequest)(nil), // 4: teleport.autoupdate.v1.DeleteAutoUpdateConfigRequest - (*GetAutoUpdateVersionRequest)(nil), // 5: teleport.autoupdate.v1.GetAutoUpdateVersionRequest - (*CreateAutoUpdateVersionRequest)(nil), // 6: teleport.autoupdate.v1.CreateAutoUpdateVersionRequest - (*UpdateAutoUpdateVersionRequest)(nil), // 7: teleport.autoupdate.v1.UpdateAutoUpdateVersionRequest - (*UpsertAutoUpdateVersionRequest)(nil), // 8: teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest - (*DeleteAutoUpdateVersionRequest)(nil), // 9: teleport.autoupdate.v1.DeleteAutoUpdateVersionRequest - (*AutoUpdateConfig)(nil), // 10: teleport.autoupdate.v1.AutoUpdateConfig - (*AutoUpdateVersion)(nil), // 11: teleport.autoupdate.v1.AutoUpdateVersion - (*emptypb.Empty)(nil), // 12: google.protobuf.Empty + (*GetAutoUpdateConfigRequest)(nil), // 0: teleport.autoupdate.v1.GetAutoUpdateConfigRequest + (*CreateAutoUpdateConfigRequest)(nil), // 1: teleport.autoupdate.v1.CreateAutoUpdateConfigRequest + (*UpdateAutoUpdateConfigRequest)(nil), // 2: teleport.autoupdate.v1.UpdateAutoUpdateConfigRequest + (*UpsertAutoUpdateConfigRequest)(nil), // 3: teleport.autoupdate.v1.UpsertAutoUpdateConfigRequest + (*DeleteAutoUpdateConfigRequest)(nil), // 4: teleport.autoupdate.v1.DeleteAutoUpdateConfigRequest + (*GetAutoUpdateVersionRequest)(nil), // 5: teleport.autoupdate.v1.GetAutoUpdateVersionRequest + (*CreateAutoUpdateVersionRequest)(nil), // 6: teleport.autoupdate.v1.CreateAutoUpdateVersionRequest + (*UpdateAutoUpdateVersionRequest)(nil), // 7: teleport.autoupdate.v1.UpdateAutoUpdateVersionRequest + (*UpsertAutoUpdateVersionRequest)(nil), // 8: teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest + (*DeleteAutoUpdateVersionRequest)(nil), // 9: teleport.autoupdate.v1.DeleteAutoUpdateVersionRequest + (*GetAutoUpdateAgentRolloutRequest)(nil), // 10: teleport.autoupdate.v1.GetAutoUpdateAgentRolloutRequest + (*CreateAutoUpdateAgentRolloutRequest)(nil), // 11: teleport.autoupdate.v1.CreateAutoUpdateAgentRolloutRequest + (*UpdateAutoUpdateAgentRolloutRequest)(nil), // 12: teleport.autoupdate.v1.UpdateAutoUpdateAgentRolloutRequest + (*UpsertAutoUpdateAgentRolloutRequest)(nil), // 13: teleport.autoupdate.v1.UpsertAutoUpdateAgentRolloutRequest + (*DeleteAutoUpdateAgentRolloutRequest)(nil), // 14: teleport.autoupdate.v1.DeleteAutoUpdateAgentRolloutRequest + (*AutoUpdateConfig)(nil), // 15: teleport.autoupdate.v1.AutoUpdateConfig + (*AutoUpdateVersion)(nil), // 16: teleport.autoupdate.v1.AutoUpdateVersion + (*AutoUpdateAgentRollout)(nil), // 17: teleport.autoupdate.v1.AutoUpdateAgentRollout + (*emptypb.Empty)(nil), // 18: google.protobuf.Empty } var file_teleport_autoupdate_v1_autoupdate_service_proto_depIdxs = []int32{ - 10, // 0: teleport.autoupdate.v1.CreateAutoUpdateConfigRequest.config:type_name -> teleport.autoupdate.v1.AutoUpdateConfig - 10, // 1: teleport.autoupdate.v1.UpdateAutoUpdateConfigRequest.config:type_name -> teleport.autoupdate.v1.AutoUpdateConfig - 10, // 2: teleport.autoupdate.v1.UpsertAutoUpdateConfigRequest.config:type_name -> teleport.autoupdate.v1.AutoUpdateConfig - 11, // 3: teleport.autoupdate.v1.CreateAutoUpdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoUpdateVersion - 11, // 4: teleport.autoupdate.v1.UpdateAutoUpdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoUpdateVersion - 11, // 5: teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoUpdateVersion - 0, // 6: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateConfig:input_type -> teleport.autoupdate.v1.GetAutoUpdateConfigRequest - 1, // 7: teleport.autoupdate.v1.AutoUpdateService.CreateAutoUpdateConfig:input_type -> teleport.autoupdate.v1.CreateAutoUpdateConfigRequest - 2, // 8: teleport.autoupdate.v1.AutoUpdateService.UpdateAutoUpdateConfig:input_type -> teleport.autoupdate.v1.UpdateAutoUpdateConfigRequest - 3, // 9: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateConfig:input_type -> teleport.autoupdate.v1.UpsertAutoUpdateConfigRequest - 4, // 10: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateConfig:input_type -> teleport.autoupdate.v1.DeleteAutoUpdateConfigRequest - 5, // 11: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateVersion:input_type -> teleport.autoupdate.v1.GetAutoUpdateVersionRequest - 6, // 12: teleport.autoupdate.v1.AutoUpdateService.CreateAutoUpdateVersion:input_type -> teleport.autoupdate.v1.CreateAutoUpdateVersionRequest - 7, // 13: teleport.autoupdate.v1.AutoUpdateService.UpdateAutoUpdateVersion:input_type -> teleport.autoupdate.v1.UpdateAutoUpdateVersionRequest - 8, // 14: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateVersion:input_type -> teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest - 9, // 15: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateVersion:input_type -> teleport.autoupdate.v1.DeleteAutoUpdateVersionRequest - 10, // 16: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateConfig:output_type -> teleport.autoupdate.v1.AutoUpdateConfig - 10, // 17: teleport.autoupdate.v1.AutoUpdateService.CreateAutoUpdateConfig:output_type -> teleport.autoupdate.v1.AutoUpdateConfig - 10, // 18: teleport.autoupdate.v1.AutoUpdateService.UpdateAutoUpdateConfig:output_type -> teleport.autoupdate.v1.AutoUpdateConfig - 10, // 19: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateConfig:output_type -> teleport.autoupdate.v1.AutoUpdateConfig - 12, // 20: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateConfig:output_type -> google.protobuf.Empty - 11, // 21: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion - 11, // 22: teleport.autoupdate.v1.AutoUpdateService.CreateAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion - 11, // 23: teleport.autoupdate.v1.AutoUpdateService.UpdateAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion - 11, // 24: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion - 12, // 25: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateVersion:output_type -> google.protobuf.Empty - 16, // [16:26] is the sub-list for method output_type - 6, // [6:16] is the sub-list for method input_type - 6, // [6:6] is the sub-list for extension type_name - 6, // [6:6] is the sub-list for extension extendee - 0, // [0:6] is the sub-list for field type_name + 15, // 0: teleport.autoupdate.v1.CreateAutoUpdateConfigRequest.config:type_name -> teleport.autoupdate.v1.AutoUpdateConfig + 15, // 1: teleport.autoupdate.v1.UpdateAutoUpdateConfigRequest.config:type_name -> teleport.autoupdate.v1.AutoUpdateConfig + 15, // 2: teleport.autoupdate.v1.UpsertAutoUpdateConfigRequest.config:type_name -> teleport.autoupdate.v1.AutoUpdateConfig + 16, // 3: teleport.autoupdate.v1.CreateAutoUpdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoUpdateVersion + 16, // 4: teleport.autoupdate.v1.UpdateAutoUpdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoUpdateVersion + 16, // 5: teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest.version:type_name -> teleport.autoupdate.v1.AutoUpdateVersion + 17, // 6: teleport.autoupdate.v1.CreateAutoUpdateAgentRolloutRequest.rollout:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRollout + 17, // 7: teleport.autoupdate.v1.UpdateAutoUpdateAgentRolloutRequest.rollout:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRollout + 17, // 8: teleport.autoupdate.v1.UpsertAutoUpdateAgentRolloutRequest.rollout:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRollout + 0, // 9: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateConfig:input_type -> teleport.autoupdate.v1.GetAutoUpdateConfigRequest + 1, // 10: teleport.autoupdate.v1.AutoUpdateService.CreateAutoUpdateConfig:input_type -> teleport.autoupdate.v1.CreateAutoUpdateConfigRequest + 2, // 11: teleport.autoupdate.v1.AutoUpdateService.UpdateAutoUpdateConfig:input_type -> teleport.autoupdate.v1.UpdateAutoUpdateConfigRequest + 3, // 12: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateConfig:input_type -> teleport.autoupdate.v1.UpsertAutoUpdateConfigRequest + 4, // 13: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateConfig:input_type -> teleport.autoupdate.v1.DeleteAutoUpdateConfigRequest + 5, // 14: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateVersion:input_type -> teleport.autoupdate.v1.GetAutoUpdateVersionRequest + 6, // 15: teleport.autoupdate.v1.AutoUpdateService.CreateAutoUpdateVersion:input_type -> teleport.autoupdate.v1.CreateAutoUpdateVersionRequest + 7, // 16: teleport.autoupdate.v1.AutoUpdateService.UpdateAutoUpdateVersion:input_type -> teleport.autoupdate.v1.UpdateAutoUpdateVersionRequest + 8, // 17: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateVersion:input_type -> teleport.autoupdate.v1.UpsertAutoUpdateVersionRequest + 9, // 18: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateVersion:input_type -> teleport.autoupdate.v1.DeleteAutoUpdateVersionRequest + 10, // 19: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateAgentRollout:input_type -> teleport.autoupdate.v1.GetAutoUpdateAgentRolloutRequest + 11, // 20: teleport.autoupdate.v1.AutoUpdateService.CreateAutoUpdateAgentRollout:input_type -> teleport.autoupdate.v1.CreateAutoUpdateAgentRolloutRequest + 12, // 21: teleport.autoupdate.v1.AutoUpdateService.UpdateAutoUpdateAgentRollout:input_type -> teleport.autoupdate.v1.UpdateAutoUpdateAgentRolloutRequest + 13, // 22: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateAgentRollout:input_type -> teleport.autoupdate.v1.UpsertAutoUpdateAgentRolloutRequest + 14, // 23: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateAgentRollout:input_type -> teleport.autoupdate.v1.DeleteAutoUpdateAgentRolloutRequest + 15, // 24: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateConfig:output_type -> teleport.autoupdate.v1.AutoUpdateConfig + 15, // 25: teleport.autoupdate.v1.AutoUpdateService.CreateAutoUpdateConfig:output_type -> teleport.autoupdate.v1.AutoUpdateConfig + 15, // 26: teleport.autoupdate.v1.AutoUpdateService.UpdateAutoUpdateConfig:output_type -> teleport.autoupdate.v1.AutoUpdateConfig + 15, // 27: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateConfig:output_type -> teleport.autoupdate.v1.AutoUpdateConfig + 18, // 28: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateConfig:output_type -> google.protobuf.Empty + 16, // 29: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion + 16, // 30: teleport.autoupdate.v1.AutoUpdateService.CreateAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion + 16, // 31: teleport.autoupdate.v1.AutoUpdateService.UpdateAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion + 16, // 32: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateVersion:output_type -> teleport.autoupdate.v1.AutoUpdateVersion + 18, // 33: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateVersion:output_type -> google.protobuf.Empty + 17, // 34: teleport.autoupdate.v1.AutoUpdateService.GetAutoUpdateAgentRollout:output_type -> teleport.autoupdate.v1.AutoUpdateAgentRollout + 17, // 35: teleport.autoupdate.v1.AutoUpdateService.CreateAutoUpdateAgentRollout:output_type -> teleport.autoupdate.v1.AutoUpdateAgentRollout + 17, // 36: teleport.autoupdate.v1.AutoUpdateService.UpdateAutoUpdateAgentRollout:output_type -> teleport.autoupdate.v1.AutoUpdateAgentRollout + 17, // 37: teleport.autoupdate.v1.AutoUpdateService.UpsertAutoUpdateAgentRollout:output_type -> teleport.autoupdate.v1.AutoUpdateAgentRollout + 18, // 38: teleport.autoupdate.v1.AutoUpdateService.DeleteAutoUpdateAgentRollout:output_type -> google.protobuf.Empty + 24, // [24:39] is the sub-list for method output_type + 9, // [9:24] is the sub-list for method input_type + 9, // [9:9] is the sub-list for extension type_name + 9, // [9:9] is the sub-list for extension extendee + 0, // [0:9] is the sub-list for field type_name } func init() { file_teleport_autoupdate_v1_autoupdate_service_proto_init() } @@ -675,7 +975,7 @@ func file_teleport_autoupdate_v1_autoupdate_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_teleport_autoupdate_v1_autoupdate_service_proto_rawDesc, NumEnums: 0, - NumMessages: 10, + NumMessages: 15, NumExtensions: 0, NumServices: 1, }, diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go index 46746b2f9ae7f..1370e50d3ec80 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate_service_grpc.pb.go @@ -34,16 +34,21 @@ import ( const _ = grpc.SupportPackageIsVersion9 const ( - AutoUpdateService_GetAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/GetAutoUpdateConfig" - AutoUpdateService_CreateAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/CreateAutoUpdateConfig" - AutoUpdateService_UpdateAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpdateAutoUpdateConfig" - AutoUpdateService_UpsertAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpsertAutoUpdateConfig" - AutoUpdateService_DeleteAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/DeleteAutoUpdateConfig" - AutoUpdateService_GetAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/GetAutoUpdateVersion" - AutoUpdateService_CreateAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/CreateAutoUpdateVersion" - AutoUpdateService_UpdateAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpdateAutoUpdateVersion" - AutoUpdateService_UpsertAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpsertAutoUpdateVersion" - AutoUpdateService_DeleteAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/DeleteAutoUpdateVersion" + AutoUpdateService_GetAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/GetAutoUpdateConfig" + AutoUpdateService_CreateAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/CreateAutoUpdateConfig" + AutoUpdateService_UpdateAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpdateAutoUpdateConfig" + AutoUpdateService_UpsertAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpsertAutoUpdateConfig" + AutoUpdateService_DeleteAutoUpdateConfig_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/DeleteAutoUpdateConfig" + AutoUpdateService_GetAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/GetAutoUpdateVersion" + AutoUpdateService_CreateAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/CreateAutoUpdateVersion" + AutoUpdateService_UpdateAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpdateAutoUpdateVersion" + AutoUpdateService_UpsertAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpsertAutoUpdateVersion" + AutoUpdateService_DeleteAutoUpdateVersion_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/DeleteAutoUpdateVersion" + AutoUpdateService_GetAutoUpdateAgentRollout_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/GetAutoUpdateAgentRollout" + AutoUpdateService_CreateAutoUpdateAgentRollout_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/CreateAutoUpdateAgentRollout" + AutoUpdateService_UpdateAutoUpdateAgentRollout_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpdateAutoUpdateAgentRollout" + AutoUpdateService_UpsertAutoUpdateAgentRollout_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/UpsertAutoUpdateAgentRollout" + AutoUpdateService_DeleteAutoUpdateAgentRollout_FullMethodName = "/teleport.autoupdate.v1.AutoUpdateService/DeleteAutoUpdateAgentRollout" ) // AutoUpdateServiceClient is the client API for AutoUpdateService service. @@ -72,6 +77,16 @@ type AutoUpdateServiceClient interface { UpsertAutoUpdateVersion(ctx context.Context, in *UpsertAutoUpdateVersionRequest, opts ...grpc.CallOption) (*AutoUpdateVersion, error) // DeleteAutoUpdateVersion hard deletes the specified AutoUpdateVersionRequest. DeleteAutoUpdateVersion(ctx context.Context, in *DeleteAutoUpdateVersionRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) + // GetAutoUpdateVersion gets the current autoupdate version singleton. + GetAutoUpdateAgentRollout(ctx context.Context, in *GetAutoUpdateAgentRolloutRequest, opts ...grpc.CallOption) (*AutoUpdateAgentRollout, error) + // CreateAutoUpdateAgentRollout creates a new AutoUpdateAgentRollout. + CreateAutoUpdateAgentRollout(ctx context.Context, in *CreateAutoUpdateAgentRolloutRequest, opts ...grpc.CallOption) (*AutoUpdateAgentRollout, error) + // UpdateAutoUpdateAgentRollout updates AutoUpdateAgentRollout singleton. + UpdateAutoUpdateAgentRollout(ctx context.Context, in *UpdateAutoUpdateAgentRolloutRequest, opts ...grpc.CallOption) (*AutoUpdateAgentRollout, error) + // UpsertAutoUpdateAgentRollout creates a new AutoUpdateAgentRollout or replaces an existing AutoUpdateAgentRollout. + UpsertAutoUpdateAgentRollout(ctx context.Context, in *UpsertAutoUpdateAgentRolloutRequest, opts ...grpc.CallOption) (*AutoUpdateAgentRollout, error) + // DeleteAutoUpdateAgentRollout hard deletes the specified AutoUpdateAgentRolloutRequest. + DeleteAutoUpdateAgentRollout(ctx context.Context, in *DeleteAutoUpdateAgentRolloutRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) } type autoUpdateServiceClient struct { @@ -182,6 +197,56 @@ func (c *autoUpdateServiceClient) DeleteAutoUpdateVersion(ctx context.Context, i return out, nil } +func (c *autoUpdateServiceClient) GetAutoUpdateAgentRollout(ctx context.Context, in *GetAutoUpdateAgentRolloutRequest, opts ...grpc.CallOption) (*AutoUpdateAgentRollout, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AutoUpdateAgentRollout) + err := c.cc.Invoke(ctx, AutoUpdateService_GetAutoUpdateAgentRollout_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *autoUpdateServiceClient) CreateAutoUpdateAgentRollout(ctx context.Context, in *CreateAutoUpdateAgentRolloutRequest, opts ...grpc.CallOption) (*AutoUpdateAgentRollout, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AutoUpdateAgentRollout) + err := c.cc.Invoke(ctx, AutoUpdateService_CreateAutoUpdateAgentRollout_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *autoUpdateServiceClient) UpdateAutoUpdateAgentRollout(ctx context.Context, in *UpdateAutoUpdateAgentRolloutRequest, opts ...grpc.CallOption) (*AutoUpdateAgentRollout, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AutoUpdateAgentRollout) + err := c.cc.Invoke(ctx, AutoUpdateService_UpdateAutoUpdateAgentRollout_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *autoUpdateServiceClient) UpsertAutoUpdateAgentRollout(ctx context.Context, in *UpsertAutoUpdateAgentRolloutRequest, opts ...grpc.CallOption) (*AutoUpdateAgentRollout, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(AutoUpdateAgentRollout) + err := c.cc.Invoke(ctx, AutoUpdateService_UpsertAutoUpdateAgentRollout_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *autoUpdateServiceClient) DeleteAutoUpdateAgentRollout(ctx context.Context, in *DeleteAutoUpdateAgentRolloutRequest, opts ...grpc.CallOption) (*emptypb.Empty, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(emptypb.Empty) + err := c.cc.Invoke(ctx, AutoUpdateService_DeleteAutoUpdateAgentRollout_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + // AutoUpdateServiceServer is the server API for AutoUpdateService service. // All implementations must embed UnimplementedAutoUpdateServiceServer // for forward compatibility. @@ -208,6 +273,16 @@ type AutoUpdateServiceServer interface { UpsertAutoUpdateVersion(context.Context, *UpsertAutoUpdateVersionRequest) (*AutoUpdateVersion, error) // DeleteAutoUpdateVersion hard deletes the specified AutoUpdateVersionRequest. DeleteAutoUpdateVersion(context.Context, *DeleteAutoUpdateVersionRequest) (*emptypb.Empty, error) + // GetAutoUpdateVersion gets the current autoupdate version singleton. + GetAutoUpdateAgentRollout(context.Context, *GetAutoUpdateAgentRolloutRequest) (*AutoUpdateAgentRollout, error) + // CreateAutoUpdateAgentRollout creates a new AutoUpdateAgentRollout. + CreateAutoUpdateAgentRollout(context.Context, *CreateAutoUpdateAgentRolloutRequest) (*AutoUpdateAgentRollout, error) + // UpdateAutoUpdateAgentRollout updates AutoUpdateAgentRollout singleton. + UpdateAutoUpdateAgentRollout(context.Context, *UpdateAutoUpdateAgentRolloutRequest) (*AutoUpdateAgentRollout, error) + // UpsertAutoUpdateAgentRollout creates a new AutoUpdateAgentRollout or replaces an existing AutoUpdateAgentRollout. + UpsertAutoUpdateAgentRollout(context.Context, *UpsertAutoUpdateAgentRolloutRequest) (*AutoUpdateAgentRollout, error) + // DeleteAutoUpdateAgentRollout hard deletes the specified AutoUpdateAgentRolloutRequest. + DeleteAutoUpdateAgentRollout(context.Context, *DeleteAutoUpdateAgentRolloutRequest) (*emptypb.Empty, error) mustEmbedUnimplementedAutoUpdateServiceServer() } @@ -248,6 +323,21 @@ func (UnimplementedAutoUpdateServiceServer) UpsertAutoUpdateVersion(context.Cont func (UnimplementedAutoUpdateServiceServer) DeleteAutoUpdateVersion(context.Context, *DeleteAutoUpdateVersionRequest) (*emptypb.Empty, error) { return nil, status.Errorf(codes.Unimplemented, "method DeleteAutoUpdateVersion not implemented") } +func (UnimplementedAutoUpdateServiceServer) GetAutoUpdateAgentRollout(context.Context, *GetAutoUpdateAgentRolloutRequest) (*AutoUpdateAgentRollout, error) { + return nil, status.Errorf(codes.Unimplemented, "method GetAutoUpdateAgentRollout not implemented") +} +func (UnimplementedAutoUpdateServiceServer) CreateAutoUpdateAgentRollout(context.Context, *CreateAutoUpdateAgentRolloutRequest) (*AutoUpdateAgentRollout, error) { + return nil, status.Errorf(codes.Unimplemented, "method CreateAutoUpdateAgentRollout not implemented") +} +func (UnimplementedAutoUpdateServiceServer) UpdateAutoUpdateAgentRollout(context.Context, *UpdateAutoUpdateAgentRolloutRequest) (*AutoUpdateAgentRollout, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpdateAutoUpdateAgentRollout not implemented") +} +func (UnimplementedAutoUpdateServiceServer) UpsertAutoUpdateAgentRollout(context.Context, *UpsertAutoUpdateAgentRolloutRequest) (*AutoUpdateAgentRollout, error) { + return nil, status.Errorf(codes.Unimplemented, "method UpsertAutoUpdateAgentRollout not implemented") +} +func (UnimplementedAutoUpdateServiceServer) DeleteAutoUpdateAgentRollout(context.Context, *DeleteAutoUpdateAgentRolloutRequest) (*emptypb.Empty, error) { + return nil, status.Errorf(codes.Unimplemented, "method DeleteAutoUpdateAgentRollout not implemented") +} func (UnimplementedAutoUpdateServiceServer) mustEmbedUnimplementedAutoUpdateServiceServer() {} func (UnimplementedAutoUpdateServiceServer) testEmbeddedByValue() {} @@ -449,6 +539,96 @@ func _AutoUpdateService_DeleteAutoUpdateVersion_Handler(srv interface{}, ctx con return interceptor(ctx, in, info, handler) } +func _AutoUpdateService_GetAutoUpdateAgentRollout_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(GetAutoUpdateAgentRolloutRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoUpdateServiceServer).GetAutoUpdateAgentRollout(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoUpdateService_GetAutoUpdateAgentRollout_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoUpdateServiceServer).GetAutoUpdateAgentRollout(ctx, req.(*GetAutoUpdateAgentRolloutRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AutoUpdateService_CreateAutoUpdateAgentRollout_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(CreateAutoUpdateAgentRolloutRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoUpdateServiceServer).CreateAutoUpdateAgentRollout(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoUpdateService_CreateAutoUpdateAgentRollout_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoUpdateServiceServer).CreateAutoUpdateAgentRollout(ctx, req.(*CreateAutoUpdateAgentRolloutRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AutoUpdateService_UpdateAutoUpdateAgentRollout_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpdateAutoUpdateAgentRolloutRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoUpdateServiceServer).UpdateAutoUpdateAgentRollout(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoUpdateService_UpdateAutoUpdateAgentRollout_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoUpdateServiceServer).UpdateAutoUpdateAgentRollout(ctx, req.(*UpdateAutoUpdateAgentRolloutRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AutoUpdateService_UpsertAutoUpdateAgentRollout_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(UpsertAutoUpdateAgentRolloutRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoUpdateServiceServer).UpsertAutoUpdateAgentRollout(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoUpdateService_UpsertAutoUpdateAgentRollout_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoUpdateServiceServer).UpsertAutoUpdateAgentRollout(ctx, req.(*UpsertAutoUpdateAgentRolloutRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _AutoUpdateService_DeleteAutoUpdateAgentRollout_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(DeleteAutoUpdateAgentRolloutRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(AutoUpdateServiceServer).DeleteAutoUpdateAgentRollout(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: AutoUpdateService_DeleteAutoUpdateAgentRollout_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(AutoUpdateServiceServer).DeleteAutoUpdateAgentRollout(ctx, req.(*DeleteAutoUpdateAgentRolloutRequest)) + } + return interceptor(ctx, in, info, handler) +} + // AutoUpdateService_ServiceDesc is the grpc.ServiceDesc for AutoUpdateService service. // It's only intended for direct use with grpc.RegisterService, // and not to be introspected or modified (even as a copy) @@ -496,6 +676,26 @@ var AutoUpdateService_ServiceDesc = grpc.ServiceDesc{ MethodName: "DeleteAutoUpdateVersion", Handler: _AutoUpdateService_DeleteAutoUpdateVersion_Handler, }, + { + MethodName: "GetAutoUpdateAgentRollout", + Handler: _AutoUpdateService_GetAutoUpdateAgentRollout_Handler, + }, + { + MethodName: "CreateAutoUpdateAgentRollout", + Handler: _AutoUpdateService_CreateAutoUpdateAgentRollout_Handler, + }, + { + MethodName: "UpdateAutoUpdateAgentRollout", + Handler: _AutoUpdateService_UpdateAutoUpdateAgentRollout_Handler, + }, + { + MethodName: "UpsertAutoUpdateAgentRollout", + Handler: _AutoUpdateService_UpsertAutoUpdateAgentRollout_Handler, + }, + { + MethodName: "DeleteAutoUpdateAgentRollout", + Handler: _AutoUpdateService_DeleteAutoUpdateAgentRollout_Handler, + }, }, Streams: []grpc.StreamDesc{}, Metadata: "teleport/autoupdate/v1/autoupdate_service.proto", diff --git a/api/proto/teleport/autoupdate/v1/autoupdate.proto b/api/proto/teleport/autoupdate/v1/autoupdate.proto index b4e557549b316..8bd11fd8cdeec 100644 --- a/api/proto/teleport/autoupdate/v1/autoupdate.proto +++ b/api/proto/teleport/autoupdate/v1/autoupdate.proto @@ -16,6 +16,8 @@ syntax = "proto3"; package teleport.autoupdate.v1; +import "google/protobuf/duration.proto"; +import "google/protobuf/timestamp.proto"; import "teleport/header/v1/metadata.proto"; option go_package = "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1;autoupdate"; @@ -44,6 +46,38 @@ message AutoUpdateConfigSpecTools { string mode = 1; } +// AutoUpdateConfigSpecAgents encodes the parameters of automatic agent updates. +message AutoUpdateConfigSpecAgents { + // mode specifies whether agent autoupdates are enabled, disabled, or paused. + string mode = 1; + // strategy to use for updating the agents. + string strategy = 2; + // maintenance_window_duration is the maintenance window duration. This can only be set if `strategy` is "time-based". + // Once the window is over, the group transitions to the done state. Existing agents won't be updated until the next + // maintenance window. + google.protobuf.Duration maintenance_window_duration = 3; + // agent_schedules specifies schedules for updates of grouped agents. + AgentAutoUpdateSchedules agent_schedules = 5; +} + +// AgentAutoUpdateSchedules specifies update scheduled for grouped agents. +message AgentAutoUpdateSchedules { + // regular schedules for non-critical versions. + repeated AgentAutoUpdateGroup regular = 1; +} + +// AgentAutoUpdateGroup specifies the update schedule for a group of agents. +message AgentAutoUpdateGroup { + // name of the group + string name = 1; + // days when the update can run. Supported values are "Mon", "Tue", "Wed", "Thu", "Fri", "Sat", "Sun" and "*" + repeated string days = 2; + // start_hour to initiate update + int32 start_hour = 3; + // wait_days after last group succeeds before this group can run. This can only be used when the strategy is "halt-on-failure". + int64 wait_days = 4; +} + // AutoUpdateVersion is a resource singleton with version required for // tools autoupdate. message AutoUpdateVersion { @@ -60,6 +94,7 @@ message AutoUpdateVersionSpec { reserved 1; reserved "tools_version"; // ToolsVersion is replaced by tools.target_version. AutoUpdateVersionSpecTools tools = 2; + AutoUpdateVersionSpecAgents agents = 3; } // AutoUpdateVersionSpecTools encodes the parameters for client tools auto updates. @@ -68,3 +103,93 @@ message AutoUpdateVersionSpecTools { // Client tools after connection to the cluster going to be updated to this version automatically. string target_version = 1; } + +// AutoUpdateVersionSpecAgents is the spec for the autoupdate version. +message AutoUpdateVersionSpecAgents { + // start_version is the version to update from. + string start_version = 1; + // target_version is the version to update to. + string target_version = 2; + // schedule to use for the rollout + string schedule = 3; + // autoupdate_mode to use for the rollout + string mode = 4; +} + +// AutoUpdateAgentRollout is the resource the Teleport Auth Service uses to track and control the rollout of a new +// agent version. This resource is written by the automatic agent update controller in the Teleport Auth Service +// and read by the Teleport Proxy Service. +message AutoUpdateAgentRollout { + string kind = 1; + string sub_kind = 2; + string version = 3; + teleport.header.v1.Metadata metadata = 4; + AutoUpdateAgentRolloutSpec spec = 5; + AutoUpdateAgentRolloutStatus status = 6; +} + +// AutoUpdateAgentRolloutSpec describes the desired agent rollout. +// This is built by merging the user-provided AutoUpdateConfigSpecAgents and the operator-provided +// AutoUpdateVersionSpecAgents. +message AutoUpdateAgentRolloutSpec { + // start_version is the version to update from. + string start_version = 1; + // target_version is the version to update to. + string target_version = 2; + // schedule to use for the rollout. Supported values are "regular" and "immediate". + // - "regular" follows the regular group schedule + // - "immediate" updates all the agents immediately + string schedule = 3; + // autoupdate_mode to use for the rollout. Supported modes are: + // - "enabled": Teleport will update existing agents. + // - "disabled": Teleport will not update existing agents. + // - "suspended": Teleport will temporarily stop updating existing agents. + string autoupdate_mode = 4; + // strategy to use for updating the agents. Supported strategies are: + // - "time-based": agents update as soon as their maintenance window starts. There is no dependency between groups. + // This strategy allows Teleport users to setup reliable follow-the-sun updates and enforce the maintenance window + // more strictly. A group finishes its update at the end of the maintenance window, regardless of the new version + // adoption rate. Agents that missed the maintenance window will not attempt to update until the next maintenance + // window. + // - "halt-on-failure": the update proceeds from the first group to the last group, ensuring that each group + // successfully updates before allowing the next group to proceed. This is the strategy that offers the best + // availability. A group finishes its update once most of its agents are running the correct version. Agents that + // missed the group update will try to catch back as soon as possible. + string strategy = 5; +} + +// AutoUpdateAgentRolloutStatus tracks the current agent rollout status. +message AutoUpdateAgentRolloutStatus { + repeated AutoUpdateAgentRolloutStatusGroup groups = 1; +} + +// AutoUpdateAgentRolloutStatusGroup tracks the current agent rollout status of a specific group. +message AutoUpdateAgentRolloutStatusGroup { + // name of the group + string name = 1; + // start_time of the rollout + google.protobuf.Timestamp start_time = 2; + // state is the current state of the rollout. + AutoUpdateAgentGroupState state = 3; + // last_update_time is the time of the previous update for this group. + google.protobuf.Timestamp last_update_time = 4; + // last_update_reason is the trigger for the last update + string last_update_reason = 5; +} + +// AutoUpdateAgentGroupState represents the agent group state. This state controls whether the agents from this group +// should install the start version, the target version, and if they should update immediately or wait. +enum AutoUpdateAgentGroupState { + // AUTO_UPDATE_AGENT_GROUP_STATE_UNSPECIFIED state + AUTO_UPDATE_AGENT_GROUP_STATE_UNSPECIFIED = 0; + // AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED represents that the group update has not been started yet. + AUTO_UPDATE_AGENT_GROUP_STATE_UNSTARTED = 1; + // AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE represents that the group is actively getting updated. + // New agents should run v2, existing agents are instructed to update to v2. + AUTO_UPDATE_AGENT_GROUP_STATE_ACTIVE = 2; + // AUTO_UPDATE_AGENT_GROUP_STATE_DONE represents that the group has been updated. New agents should run v2. + AUTO_UPDATE_AGENT_GROUP_STATE_DONE = 3; + // AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK represents that the group has been rolleback. + // New agents should run v1, existing agents should update to v1. + AUTO_UPDATE_AGENT_GROUP_STATE_ROLLEDBACK = 4; +} diff --git a/api/proto/teleport/autoupdate/v1/autoupdate_service.proto b/api/proto/teleport/autoupdate/v1/autoupdate_service.proto index efd045306d63e..4191d09f83101 100644 --- a/api/proto/teleport/autoupdate/v1/autoupdate_service.proto +++ b/api/proto/teleport/autoupdate/v1/autoupdate_service.proto @@ -52,6 +52,21 @@ service AutoUpdateService { // DeleteAutoUpdateVersion hard deletes the specified AutoUpdateVersionRequest. rpc DeleteAutoUpdateVersion(DeleteAutoUpdateVersionRequest) returns (google.protobuf.Empty); + + // GetAutoUpdateVersion gets the current autoupdate version singleton. + rpc GetAutoUpdateAgentRollout(GetAutoUpdateAgentRolloutRequest) returns (AutoUpdateAgentRollout); + + // CreateAutoUpdateAgentRollout creates a new AutoUpdateAgentRollout. + rpc CreateAutoUpdateAgentRollout(CreateAutoUpdateAgentRolloutRequest) returns (AutoUpdateAgentRollout); + + // UpdateAutoUpdateAgentRollout updates AutoUpdateAgentRollout singleton. + rpc UpdateAutoUpdateAgentRollout(UpdateAutoUpdateAgentRolloutRequest) returns (AutoUpdateAgentRollout); + + // UpsertAutoUpdateAgentRollout creates a new AutoUpdateAgentRollout or replaces an existing AutoUpdateAgentRollout. + rpc UpsertAutoUpdateAgentRollout(UpsertAutoUpdateAgentRolloutRequest) returns (AutoUpdateAgentRollout); + + // DeleteAutoUpdateAgentRollout hard deletes the specified AutoUpdateAgentRolloutRequest. + rpc DeleteAutoUpdateAgentRollout(DeleteAutoUpdateAgentRolloutRequest) returns (google.protobuf.Empty); } // Request for GetAutoUpdateConfig. @@ -95,3 +110,24 @@ message UpsertAutoUpdateVersionRequest { // Request for DeleteAutoUpdateVersion. message DeleteAutoUpdateVersionRequest {} + +// Request for GetAutoUpdateAgentRollout. +message GetAutoUpdateAgentRolloutRequest {} + +// Request for CreateAutoUpdateAgentRollout. +message CreateAutoUpdateAgentRolloutRequest { + AutoUpdateAgentRollout rollout = 1; +} + +// Request for UpdateAutoUpdateConfig. +message UpdateAutoUpdateAgentRolloutRequest { + AutoUpdateAgentRollout rollout = 1; +} + +// Request for UpsertAutoUpdateAgentRollout. +message UpsertAutoUpdateAgentRolloutRequest { + AutoUpdateAgentRollout rollout = 1; +} + +// Request for DeleteAutoUpdateAgentRollout. +message DeleteAutoUpdateAgentRolloutRequest {} diff --git a/api/proto/teleport/legacy/client/proto/event.proto b/api/proto/teleport/legacy/client/proto/event.proto index 179babd56d6cc..f88d95a926ac5 100644 --- a/api/proto/teleport/legacy/client/proto/event.proto +++ b/api/proto/teleport/legacy/client/proto/event.proto @@ -195,5 +195,7 @@ message Event { // ProvisioningPrincipalState is a resource for tracking the provisioning of // users and groups into downstream systems. teleport.provisioning.v1.PrincipalState ProvisioningPrincipalState = 70; + // AutoUpdateVersion is a resource for controlling the autoupdate agent rollout. + teleport.autoupdate.v1.AutoUpdateAgentRollout AutoUpdateAgentRollout = 71; } } diff --git a/api/proto/teleport/legacy/types/events/events.proto b/api/proto/teleport/legacy/types/events/events.proto index 9a6f97f5e50cc..d984ba5881dc6 100644 --- a/api/proto/teleport/legacy/types/events/events.proto +++ b/api/proto/teleport/legacy/types/events/events.proto @@ -4426,6 +4426,8 @@ message PluginMetadata { // OneOf is a union of one of audit events submitted to the auth service message OneOf { // Event is one of the audit events + reserved 185, 186, 187; + reserved "AutoUpdateAgentPlanCreate", "AutoUpdateAgentPlanUpdate", "AutoUpdateAgentPlanDelete"; oneof Event { events.UserLogin UserLogin = 1; events.UserCreate UserCreate = 2; @@ -4610,9 +4612,6 @@ message OneOf { events.CrownJewelCreate CrownJewelCreate = 182; events.CrownJewelUpdate CrownJewelUpdate = 183; events.CrownJewelDelete CrownJewelDelete = 184; - events.AutoUpdateAgentPlanCreate AutoUpdateAgentPlanCreate = 185; - events.AutoUpdateAgentPlanUpdate AutoUpdateAgentPlanUpdate = 186; - events.AutoUpdateAgentPlanDelete AutoUpdateAgentPlanDelete = 187; events.UserTaskCreate UserTaskCreate = 188; events.UserTaskUpdate UserTaskUpdate = 189; events.UserTaskDelete UserTaskDelete = 190; @@ -7317,99 +7316,6 @@ message CrownJewelDelete { ]; } -// AutoUpdateVersionCreate is emitted when an auto update version is created. -message AutoUpdateAgentPlanCreate { - // Metadata is a common event metadata - Metadata Metadata = 1 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; - - // ResourceMetadata is a common resource event metadata - ResourceMetadata Resource = 2 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; - - // User is a common user event metadata - UserMetadata User = 3 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; - - // ConnectionMetadata holds information about the connection - ConnectionMetadata Connection = 4 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; -} - -// AutoUpdateAgentPlanUpdate is emitted when an auto update version is updated. -message AutoUpdateAgentPlanUpdate { - // Metadata is a common event metadata - Metadata Metadata = 1 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; - - // Status indicates whether the update was successful. - Status Status = 2 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; - - // User is a common user event metadata - UserMetadata User = 3 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; - - // ConnectionMetadata holds information about the connection - ConnectionMetadata Connection = 4 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; -} - -// AutoUpdateAgentPlanDelete is emitted when an auto update version is deleted. -message AutoUpdateAgentPlanDelete { - // Metadata is a common event metadata - Metadata Metadata = 1 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; - - // ResourceMetadata is a common resource event metadata - ResourceMetadata Resource = 2 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; - - // User is a common user event metadata - UserMetadata User = 3 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; - - // ConnectionMetadata holds information about the connection - ConnectionMetadata Connection = 4 [ - (gogoproto.nullable) = false, - (gogoproto.embed) = true, - (gogoproto.jsontag) = "" - ]; -} - // UserTaskCreate is emitted when a user task is created. message UserTaskCreate { // Metadata is a common event metadata diff --git a/api/types/events/events.pb.go b/api/types/events/events.pb.go index d18b3ab6c1e12..d992e716e5201 100644 --- a/api/types/events/events.pb.go +++ b/api/types/events/events.pb.go @@ -7545,8 +7545,6 @@ var xxx_messageInfo_PluginMetadata proto.InternalMessageInfo // OneOf is a union of one of audit events submitted to the auth service type OneOf struct { - // Event is one of the audit events - // // Types that are valid to be assigned to Event: // *OneOf_UserLogin // *OneOf_UserCreate @@ -7731,9 +7729,6 @@ type OneOf struct { // *OneOf_CrownJewelCreate // *OneOf_CrownJewelUpdate // *OneOf_CrownJewelDelete - // *OneOf_AutoUpdateAgentPlanCreate - // *OneOf_AutoUpdateAgentPlanUpdate - // *OneOf_AutoUpdateAgentPlanDelete // *OneOf_UserTaskCreate // *OneOf_UserTaskUpdate // *OneOf_UserTaskDelete @@ -8331,15 +8326,6 @@ type OneOf_CrownJewelUpdate struct { type OneOf_CrownJewelDelete struct { CrownJewelDelete *CrownJewelDelete `protobuf:"bytes,184,opt,name=CrownJewelDelete,proto3,oneof" json:"CrownJewelDelete,omitempty"` } -type OneOf_AutoUpdateAgentPlanCreate struct { - AutoUpdateAgentPlanCreate *AutoUpdateAgentPlanCreate `protobuf:"bytes,185,opt,name=AutoUpdateAgentPlanCreate,proto3,oneof" json:"AutoUpdateAgentPlanCreate,omitempty"` -} -type OneOf_AutoUpdateAgentPlanUpdate struct { - AutoUpdateAgentPlanUpdate *AutoUpdateAgentPlanUpdate `protobuf:"bytes,186,opt,name=AutoUpdateAgentPlanUpdate,proto3,oneof" json:"AutoUpdateAgentPlanUpdate,omitempty"` -} -type OneOf_AutoUpdateAgentPlanDelete struct { - AutoUpdateAgentPlanDelete *AutoUpdateAgentPlanDelete `protobuf:"bytes,187,opt,name=AutoUpdateAgentPlanDelete,proto3,oneof" json:"AutoUpdateAgentPlanDelete,omitempty"` -} type OneOf_UserTaskCreate struct { UserTaskCreate *UserTaskCreate `protobuf:"bytes,188,opt,name=UserTaskCreate,proto3,oneof" json:"UserTaskCreate,omitempty"` } @@ -8533,9 +8519,6 @@ func (*OneOf_StaticHostUserDelete) isOneOf_Event() {} func (*OneOf_CrownJewelCreate) isOneOf_Event() {} func (*OneOf_CrownJewelUpdate) isOneOf_Event() {} func (*OneOf_CrownJewelDelete) isOneOf_Event() {} -func (*OneOf_AutoUpdateAgentPlanCreate) isOneOf_Event() {} -func (*OneOf_AutoUpdateAgentPlanUpdate) isOneOf_Event() {} -func (*OneOf_AutoUpdateAgentPlanDelete) isOneOf_Event() {} func (*OneOf_UserTaskCreate) isOneOf_Event() {} func (*OneOf_UserTaskUpdate) isOneOf_Event() {} func (*OneOf_UserTaskDelete) isOneOf_Event() {} @@ -9828,27 +9811,6 @@ func (m *OneOf) GetCrownJewelDelete() *CrownJewelDelete { return nil } -func (m *OneOf) GetAutoUpdateAgentPlanCreate() *AutoUpdateAgentPlanCreate { - if x, ok := m.GetEvent().(*OneOf_AutoUpdateAgentPlanCreate); ok { - return x.AutoUpdateAgentPlanCreate - } - return nil -} - -func (m *OneOf) GetAutoUpdateAgentPlanUpdate() *AutoUpdateAgentPlanUpdate { - if x, ok := m.GetEvent().(*OneOf_AutoUpdateAgentPlanUpdate); ok { - return x.AutoUpdateAgentPlanUpdate - } - return nil -} - -func (m *OneOf) GetAutoUpdateAgentPlanDelete() *AutoUpdateAgentPlanDelete { - if x, ok := m.GetEvent().(*OneOf_AutoUpdateAgentPlanDelete); ok { - return x.AutoUpdateAgentPlanDelete - } - return nil -} - func (m *OneOf) GetUserTaskCreate() *UserTaskCreate { if x, ok := m.GetEvent().(*OneOf_UserTaskCreate); ok { return x.UserTaskCreate @@ -10056,9 +10018,6 @@ func (*OneOf) XXX_OneofWrappers() []interface{} { (*OneOf_CrownJewelCreate)(nil), (*OneOf_CrownJewelUpdate)(nil), (*OneOf_CrownJewelDelete)(nil), - (*OneOf_AutoUpdateAgentPlanCreate)(nil), - (*OneOf_AutoUpdateAgentPlanUpdate)(nil), - (*OneOf_AutoUpdateAgentPlanDelete)(nil), (*OneOf_UserTaskCreate)(nil), (*OneOf_UserTaskUpdate)(nil), (*OneOf_UserTaskDelete)(nil), @@ -14582,150 +14541,6 @@ func (m *CrownJewelDelete) XXX_DiscardUnknown() { var xxx_messageInfo_CrownJewelDelete proto.InternalMessageInfo -// AutoUpdateVersionCreate is emitted when an auto update version is created. -type AutoUpdateAgentPlanCreate struct { - // Metadata is a common event metadata - Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` - // ResourceMetadata is a common resource event metadata - ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` - // User is a common user event metadata - UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` - // ConnectionMetadata holds information about the connection - ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AutoUpdateAgentPlanCreate) Reset() { *m = AutoUpdateAgentPlanCreate{} } -func (m *AutoUpdateAgentPlanCreate) String() string { return proto.CompactTextString(m) } -func (*AutoUpdateAgentPlanCreate) ProtoMessage() {} -func (*AutoUpdateAgentPlanCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{227} -} -func (m *AutoUpdateAgentPlanCreate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AutoUpdateAgentPlanCreate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AutoUpdateAgentPlanCreate.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 *AutoUpdateAgentPlanCreate) XXX_Merge(src proto.Message) { - xxx_messageInfo_AutoUpdateAgentPlanCreate.Merge(m, src) -} -func (m *AutoUpdateAgentPlanCreate) XXX_Size() int { - return m.Size() -} -func (m *AutoUpdateAgentPlanCreate) XXX_DiscardUnknown() { - xxx_messageInfo_AutoUpdateAgentPlanCreate.DiscardUnknown(m) -} - -var xxx_messageInfo_AutoUpdateAgentPlanCreate proto.InternalMessageInfo - -// AutoUpdateAgentPlanUpdate is emitted when an auto update version is updated. -type AutoUpdateAgentPlanUpdate struct { - // Metadata is a common event metadata - Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` - // Status indicates whether the update was successful. - Status `protobuf:"bytes,2,opt,name=Status,proto3,embedded=Status" json:""` - // User is a common user event metadata - UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` - // ConnectionMetadata holds information about the connection - ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AutoUpdateAgentPlanUpdate) Reset() { *m = AutoUpdateAgentPlanUpdate{} } -func (m *AutoUpdateAgentPlanUpdate) String() string { return proto.CompactTextString(m) } -func (*AutoUpdateAgentPlanUpdate) ProtoMessage() {} -func (*AutoUpdateAgentPlanUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{228} -} -func (m *AutoUpdateAgentPlanUpdate) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AutoUpdateAgentPlanUpdate) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AutoUpdateAgentPlanUpdate.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 *AutoUpdateAgentPlanUpdate) XXX_Merge(src proto.Message) { - xxx_messageInfo_AutoUpdateAgentPlanUpdate.Merge(m, src) -} -func (m *AutoUpdateAgentPlanUpdate) XXX_Size() int { - return m.Size() -} -func (m *AutoUpdateAgentPlanUpdate) XXX_DiscardUnknown() { - xxx_messageInfo_AutoUpdateAgentPlanUpdate.DiscardUnknown(m) -} - -var xxx_messageInfo_AutoUpdateAgentPlanUpdate proto.InternalMessageInfo - -// AutoUpdateAgentPlanDelete is emitted when an auto update version is deleted. -type AutoUpdateAgentPlanDelete struct { - // Metadata is a common event metadata - Metadata `protobuf:"bytes,1,opt,name=Metadata,proto3,embedded=Metadata" json:""` - // ResourceMetadata is a common resource event metadata - ResourceMetadata `protobuf:"bytes,2,opt,name=Resource,proto3,embedded=Resource" json:""` - // User is a common user event metadata - UserMetadata `protobuf:"bytes,3,opt,name=User,proto3,embedded=User" json:""` - // ConnectionMetadata holds information about the connection - ConnectionMetadata `protobuf:"bytes,4,opt,name=Connection,proto3,embedded=Connection" json:""` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` -} - -func (m *AutoUpdateAgentPlanDelete) Reset() { *m = AutoUpdateAgentPlanDelete{} } -func (m *AutoUpdateAgentPlanDelete) String() string { return proto.CompactTextString(m) } -func (*AutoUpdateAgentPlanDelete) ProtoMessage() {} -func (*AutoUpdateAgentPlanDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{229} -} -func (m *AutoUpdateAgentPlanDelete) XXX_Unmarshal(b []byte) error { - return m.Unmarshal(b) -} -func (m *AutoUpdateAgentPlanDelete) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { - if deterministic { - return xxx_messageInfo_AutoUpdateAgentPlanDelete.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 *AutoUpdateAgentPlanDelete) XXX_Merge(src proto.Message) { - xxx_messageInfo_AutoUpdateAgentPlanDelete.Merge(m, src) -} -func (m *AutoUpdateAgentPlanDelete) XXX_Size() int { - return m.Size() -} -func (m *AutoUpdateAgentPlanDelete) XXX_DiscardUnknown() { - xxx_messageInfo_AutoUpdateAgentPlanDelete.DiscardUnknown(m) -} - -var xxx_messageInfo_AutoUpdateAgentPlanDelete proto.InternalMessageInfo - // UserTaskCreate is emitted when a user task is created. type UserTaskCreate struct { // Metadata is a common event metadata @@ -14749,7 +14564,7 @@ func (m *UserTaskCreate) Reset() { *m = UserTaskCreate{} } func (m *UserTaskCreate) String() string { return proto.CompactTextString(m) } func (*UserTaskCreate) ProtoMessage() {} func (*UserTaskCreate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{230} + return fileDescriptor_007ba1c3d6266d56, []int{227} } func (m *UserTaskCreate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14805,7 +14620,7 @@ func (m *UserTaskUpdate) Reset() { *m = UserTaskUpdate{} } func (m *UserTaskUpdate) String() string { return proto.CompactTextString(m) } func (*UserTaskUpdate) ProtoMessage() {} func (*UserTaskUpdate) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{231} + return fileDescriptor_007ba1c3d6266d56, []int{228} } func (m *UserTaskUpdate) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14851,7 +14666,7 @@ func (m *UserTaskMetadata) Reset() { *m = UserTaskMetadata{} } func (m *UserTaskMetadata) String() string { return proto.CompactTextString(m) } func (*UserTaskMetadata) ProtoMessage() {} func (*UserTaskMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{232} + return fileDescriptor_007ba1c3d6266d56, []int{229} } func (m *UserTaskMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14901,7 +14716,7 @@ func (m *UserTaskDelete) Reset() { *m = UserTaskDelete{} } func (m *UserTaskDelete) String() string { return proto.CompactTextString(m) } func (*UserTaskDelete) ProtoMessage() {} func (*UserTaskDelete) Descriptor() ([]byte, []int) { - return fileDescriptor_007ba1c3d6266d56, []int{233} + return fileDescriptor_007ba1c3d6266d56, []int{230} } func (m *UserTaskDelete) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15181,9 +14996,6 @@ func init() { proto.RegisterType((*CrownJewelCreate)(nil), "events.CrownJewelCreate") proto.RegisterType((*CrownJewelUpdate)(nil), "events.CrownJewelUpdate") proto.RegisterType((*CrownJewelDelete)(nil), "events.CrownJewelDelete") - proto.RegisterType((*AutoUpdateAgentPlanCreate)(nil), "events.AutoUpdateAgentPlanCreate") - proto.RegisterType((*AutoUpdateAgentPlanUpdate)(nil), "events.AutoUpdateAgentPlanUpdate") - proto.RegisterType((*AutoUpdateAgentPlanDelete)(nil), "events.AutoUpdateAgentPlanDelete") proto.RegisterType((*UserTaskCreate)(nil), "events.UserTaskCreate") proto.RegisterType((*UserTaskUpdate)(nil), "events.UserTaskUpdate") proto.RegisterType((*UserTaskMetadata)(nil), "events.UserTaskMetadata") @@ -15195,1050 +15007,1048 @@ func init() { } var fileDescriptor_007ba1c3d6266d56 = []byte{ - // 16685 bytes of a gzipped FileDescriptorProto + // 16650 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x78, 0x24, 0x49, - 0x72, 0x18, 0x86, 0x7e, 0xa0, 0x01, 0x04, 0x1e, 0x83, 0xc9, 0x79, 0xd5, 0xce, 0xce, 0x2e, 0x76, - 0x6b, 0xef, 0xe6, 0x66, 0xf6, 0x76, 0x67, 0x6e, 0x67, 0x67, 0x77, 0x6f, 0x5f, 0xb7, 0xd7, 0x40, - 0x03, 0x83, 0x9e, 0xc1, 0x6b, 0xab, 0x31, 0x33, 0xb7, 0x47, 0xde, 0x35, 0x0b, 0x5d, 0x89, 0x46, - 0x2d, 0xba, 0xab, 0xfa, 0xaa, 0xaa, 0x07, 0x83, 0xf5, 0x8b, 0x27, 0x53, 0x14, 0x29, 0xde, 0x9d, - 0xce, 0x47, 0x53, 0xa4, 0x44, 0xc9, 0x22, 0xf5, 0xb0, 0x29, 0x9a, 0x22, 0x45, 0x89, 0x26, 0x79, - 0xa4, 0xce, 0x96, 0x7c, 0x7e, 0x9c, 0xc4, 0xcf, 0xfc, 0x24, 0xd9, 0xd6, 0xa7, 0xcf, 0x96, 0x71, - 0x32, 0x6d, 0xfd, 0xc1, 0x67, 0x7f, 0x1f, 0x6d, 0xf3, 0xb3, 0xce, 0xb2, 0xec, 0x4f, 0x5f, 0x46, - 0x66, 0x55, 0x65, 0xbd, 0x1a, 0xcf, 0x15, 0x16, 0x0b, 0xfc, 0x99, 0x41, 0x47, 0x44, 0x46, 0x66, - 0x45, 0x46, 0x66, 0x46, 0x66, 0x46, 0x46, 0xc0, 0x75, 0x8f, 0xb6, 0x68, 0xc7, 0x76, 0xbc, 0x9b, - 0x2d, 0xda, 0xd4, 0x1b, 0x9b, 0x37, 0xbd, 0xcd, 0x0e, 0x75, 0x6f, 0xd2, 0x47, 0xd4, 0xf2, 0xfc, - 0xff, 0x6e, 0x74, 0x1c, 0xdb, 0xb3, 0x49, 0x89, 0xff, 0xba, 0x7c, 0xbe, 0x69, 0x37, 0x6d, 0x04, - 0xdd, 0x64, 0x7f, 0x71, 0xec, 0xe5, 0x2b, 0x4d, 0xdb, 0x6e, 0xb6, 0xe8, 0x4d, 0xfc, 0xb5, 0xd2, - 0x5d, 0xbd, 0xe9, 0x7a, 0x4e, 0xb7, 0xe1, 0x09, 0xec, 0x44, 0x1c, 0xeb, 0x99, 0x6d, 0xea, 0x7a, - 0x7a, 0xbb, 0x23, 0x08, 0x9e, 0x8e, 0x13, 0x6c, 0x38, 0x7a, 0xa7, 0x43, 0x1d, 0x51, 0xf9, 0xe5, - 0x67, 0xd3, 0xdb, 0x89, 0xff, 0x0a, 0x92, 0x17, 0xd3, 0x49, 0x7c, 0x46, 0x31, 0x8e, 0xea, 0xb7, - 0xf2, 0x30, 0x38, 0x4f, 0x3d, 0xdd, 0xd0, 0x3d, 0x9d, 0x5c, 0x81, 0xfe, 0xaa, 0x65, 0xd0, 0xc7, - 0x4a, 0xee, 0x99, 0xdc, 0xb5, 0xc2, 0x64, 0x69, 0x7b, 0x6b, 0x22, 0x4f, 0x4d, 0x8d, 0x03, 0xc9, - 0x53, 0x50, 0x5c, 0xde, 0xec, 0x50, 0x25, 0xff, 0x4c, 0xee, 0xda, 0xd0, 0xe4, 0xd0, 0xf6, 0xd6, - 0x44, 0x3f, 0xca, 0x42, 0x43, 0x30, 0x79, 0x16, 0xf2, 0xd5, 0x8a, 0x52, 0x40, 0xe4, 0xd9, 0xed, - 0xad, 0x89, 0xd1, 0xae, 0x69, 0xbc, 0x60, 0xb7, 0x4d, 0x8f, 0xb6, 0x3b, 0xde, 0xa6, 0x96, 0xaf, - 0x56, 0xc8, 0x55, 0x28, 0x4e, 0xd9, 0x06, 0x55, 0x8a, 0x48, 0x44, 0xb6, 0xb7, 0x26, 0xc6, 0x1a, - 0xb6, 0x41, 0x25, 0x2a, 0xc4, 0x93, 0xcf, 0x43, 0x71, 0xd9, 0x6c, 0x53, 0xa5, 0xff, 0x99, 0xdc, - 0xb5, 0xe1, 0x5b, 0x97, 0x6f, 0x70, 0xa9, 0xdc, 0xf0, 0xa5, 0x72, 0x63, 0xd9, 0x17, 0xdb, 0xe4, - 0xf8, 0xf7, 0xb6, 0x26, 0xfa, 0xb6, 0xb7, 0x26, 0x8a, 0x4c, 0x92, 0xdf, 0xfc, 0xfe, 0x44, 0x4e, - 0xc3, 0x92, 0xe4, 0x2d, 0x18, 0x9e, 0x6a, 0x75, 0x5d, 0x8f, 0x3a, 0x0b, 0x7a, 0x9b, 0x2a, 0x25, - 0xac, 0xf0, 0xf2, 0xf6, 0xd6, 0xc4, 0xc5, 0x06, 0x07, 0xd7, 0x2d, 0xbd, 0x2d, 0x57, 0x2c, 0x93, - 0xab, 0xbf, 0x9d, 0x83, 0x33, 0x35, 0xea, 0xba, 0xa6, 0x6d, 0x05, 0xb2, 0xf9, 0x24, 0x0c, 0x09, - 0x50, 0xb5, 0x82, 0xf2, 0x19, 0x9a, 0x1c, 0xd8, 0xde, 0x9a, 0x28, 0xb8, 0xa6, 0xa1, 0x85, 0x18, - 0xf2, 0x19, 0x18, 0x78, 0x68, 0x7a, 0x6b, 0xf3, 0x33, 0x65, 0x21, 0xa7, 0x8b, 0xdb, 0x5b, 0x13, - 0x64, 0xc3, 0xf4, 0xd6, 0xea, 0xed, 0x55, 0x5d, 0xaa, 0xd0, 0x27, 0x23, 0x73, 0x30, 0xbe, 0xe4, - 0x98, 0x8f, 0x74, 0x8f, 0xde, 0xa3, 0x9b, 0x4b, 0x76, 0xcb, 0x6c, 0x6c, 0x0a, 0x29, 0x3e, 0xb3, - 0xbd, 0x35, 0x71, 0xa5, 0xc3, 0x71, 0xf5, 0x75, 0xba, 0x59, 0xef, 0x20, 0x56, 0x62, 0x92, 0x28, - 0xa9, 0xfe, 0x4e, 0x09, 0x46, 0xee, 0xbb, 0xd4, 0x09, 0xda, 0x7d, 0x15, 0x8a, 0xec, 0xb7, 0x68, - 0x32, 0xca, 0xbc, 0xeb, 0x52, 0x47, 0x96, 0x39, 0xc3, 0x93, 0xeb, 0xd0, 0x3f, 0x67, 0x37, 0x4d, - 0x4b, 0x34, 0xfb, 0xdc, 0xf6, 0xd6, 0xc4, 0x99, 0x16, 0x03, 0x48, 0x94, 0x9c, 0x82, 0x7c, 0x0e, - 0x46, 0xaa, 0x6d, 0xa6, 0x43, 0xb6, 0xa5, 0x7b, 0xb6, 0x23, 0x5a, 0x8b, 0xd2, 0x35, 0x25, 0xb8, - 0x54, 0x30, 0x42, 0x4f, 0xde, 0x00, 0x28, 0x3f, 0xac, 0x69, 0x76, 0x8b, 0x96, 0xb5, 0x05, 0xa1, - 0x0c, 0x58, 0x5a, 0xdf, 0x70, 0xeb, 0x8e, 0xdd, 0xa2, 0x75, 0xdd, 0x91, 0xab, 0x95, 0xa8, 0xc9, - 0x34, 0x8c, 0x95, 0x1b, 0x0d, 0xea, 0xba, 0x1a, 0xfd, 0x4a, 0x97, 0xba, 0x9e, 0xab, 0xf4, 0x3f, - 0x53, 0xb8, 0x36, 0x34, 0xf9, 0xd4, 0xf6, 0xd6, 0xc4, 0x13, 0x3a, 0x62, 0xea, 0x8e, 0x40, 0x49, - 0x2c, 0x62, 0x85, 0xc8, 0x24, 0x8c, 0x96, 0x3f, 0xe8, 0x3a, 0xb4, 0x6a, 0x50, 0xcb, 0x33, 0xbd, - 0x4d, 0xa1, 0x21, 0x57, 0xb6, 0xb7, 0x26, 0x14, 0x9d, 0x21, 0xea, 0xa6, 0xc0, 0x48, 0x4c, 0xa2, - 0x45, 0xc8, 0x22, 0x9c, 0xbd, 0x33, 0xb5, 0x54, 0xa3, 0xce, 0x23, 0xb3, 0x41, 0xcb, 0x8d, 0x86, - 0xdd, 0xb5, 0x3c, 0x65, 0x00, 0xf9, 0x3c, 0xbb, 0xbd, 0x35, 0xf1, 0x54, 0xb3, 0xd1, 0xa9, 0xbb, - 0x1c, 0x5b, 0xd7, 0x39, 0x5a, 0x62, 0x96, 0x2c, 0x4b, 0xbe, 0x08, 0xa3, 0xcb, 0x0e, 0xd3, 0x42, - 0xa3, 0x42, 0x19, 0x5c, 0x19, 0x44, 0xfd, 0xbf, 0x78, 0x43, 0x4c, 0x40, 0x1c, 0xea, 0xf7, 0x2c, - 0x6f, 0xac, 0xc7, 0x0b, 0xd4, 0x0d, 0xc4, 0xc9, 0x8d, 0x8d, 0xb0, 0x22, 0x14, 0x14, 0xf6, 0xf1, - 0xa6, 0x43, 0x8d, 0x84, 0xb6, 0x0d, 0x61, 0x9b, 0xaf, 0x6f, 0x6f, 0x4d, 0x7c, 0xd2, 0x11, 0x34, - 0xf5, 0x9e, 0x6a, 0x97, 0xc9, 0x8a, 0x4c, 0xc3, 0x20, 0xd3, 0xa6, 0x7b, 0xa6, 0x65, 0x28, 0xf0, - 0x4c, 0xee, 0xda, 0xd8, 0xad, 0x71, 0xbf, 0xf5, 0x3e, 0x7c, 0xf2, 0xd2, 0xf6, 0xd6, 0xc4, 0x39, - 0xa6, 0x83, 0xf5, 0x75, 0xd3, 0x92, 0xa7, 0x88, 0xa0, 0x28, 0x1b, 0x45, 0x93, 0xb6, 0x87, 0x43, - 0x77, 0x38, 0x1c, 0x45, 0x2b, 0xb6, 0x17, 0x1f, 0xb6, 0x3e, 0x19, 0x99, 0x82, 0xd1, 0x49, 0xdb, - 0xab, 0x5a, 0xae, 0xa7, 0x5b, 0x0d, 0x5a, 0xad, 0x28, 0x23, 0x58, 0x0e, 0xd5, 0x82, 0x95, 0x33, - 0x05, 0xa6, 0x1e, 0x99, 0x94, 0xa2, 0x65, 0xd4, 0x7f, 0x5e, 0x84, 0x31, 0xd6, 0x27, 0xd2, 0xf0, - 0x29, 0xb3, 0x99, 0x80, 0x41, 0x58, 0x2d, 0x6e, 0x47, 0x6f, 0x50, 0x31, 0x92, 0xf0, 0x2b, 0x2c, - 0x1f, 0x28, 0xf1, 0x8c, 0xd3, 0x93, 0xeb, 0x30, 0xc8, 0x41, 0xd5, 0x8a, 0x18, 0x5c, 0xa3, 0xdb, - 0x5b, 0x13, 0x43, 0x2e, 0xc2, 0xea, 0xa6, 0xa1, 0x05, 0x68, 0xa6, 0xdd, 0xfc, 0xef, 0x59, 0xdb, - 0xf5, 0x18, 0x73, 0x31, 0xb6, 0xf0, 0x33, 0x44, 0x81, 0x35, 0x81, 0x92, 0xb5, 0x3b, 0x5a, 0x88, - 0xbc, 0x0e, 0xc0, 0x21, 0x65, 0xc3, 0x70, 0xc4, 0x00, 0x7b, 0x62, 0x7b, 0x6b, 0xe2, 0x82, 0x60, - 0xa1, 0x1b, 0x86, 0x3c, 0x3a, 0x25, 0x62, 0xd2, 0x86, 0x11, 0xfe, 0x6b, 0x4e, 0x5f, 0xa1, 0x2d, - 0x3e, 0xba, 0x86, 0x6f, 0x5d, 0xf3, 0x3b, 0x31, 0x2a, 0x9d, 0x1b, 0x32, 0xe9, 0xb4, 0xe5, 0x39, - 0x9b, 0x93, 0x13, 0x62, 0x42, 0xbe, 0x24, 0xaa, 0x6a, 0x21, 0x4e, 0x9e, 0x0a, 0xe4, 0x32, 0x6c, - 0x9e, 0x9e, 0xb1, 0x9d, 0x0d, 0xdd, 0x31, 0xa8, 0x31, 0xb9, 0x29, 0xcf, 0xd3, 0xab, 0x3e, 0xb8, - 0xbe, 0x22, 0xab, 0x9e, 0x4c, 0xce, 0x3a, 0x9d, 0x73, 0xab, 0x75, 0x57, 0x50, 0xe5, 0x06, 0x12, - 0xd2, 0x72, 0xbb, 0x2b, 0x71, 0x35, 0x8b, 0x96, 0x61, 0x53, 0x01, 0x07, 0x3c, 0xa0, 0x0e, 0x9b, - 0xc4, 0x71, 0xd4, 0x89, 0xa9, 0x40, 0x30, 0x79, 0xc4, 0x31, 0x49, 0x1e, 0xa2, 0xc8, 0xe5, 0x77, - 0xe0, 0x6c, 0x42, 0x14, 0x64, 0x1c, 0x0a, 0xeb, 0x74, 0x93, 0xab, 0x8b, 0xc6, 0xfe, 0x24, 0xe7, - 0xa1, 0xff, 0x91, 0xde, 0xea, 0x8a, 0x25, 0x54, 0xe3, 0x3f, 0xde, 0xc8, 0x7f, 0x36, 0xc7, 0x56, - 0x1c, 0x32, 0x65, 0x5b, 0x16, 0x6d, 0x78, 0xf2, 0xa2, 0xf3, 0x2a, 0x0c, 0xcd, 0xd9, 0x0d, 0xbd, - 0x85, 0xfd, 0xc8, 0xf5, 0x4e, 0xd9, 0xde, 0x9a, 0x38, 0xcf, 0x3a, 0xf0, 0x46, 0x8b, 0x61, 0xa4, - 0x36, 0x85, 0xa4, 0x4c, 0x01, 0x34, 0xda, 0xb6, 0x3d, 0x8a, 0x05, 0xf3, 0xa1, 0x02, 0x60, 0x41, - 0x07, 0x51, 0xb2, 0x02, 0x84, 0xc4, 0xe4, 0x26, 0x0c, 0x2e, 0xb1, 0x75, 0xb6, 0x61, 0xb7, 0x84, - 0xf2, 0xe1, 0x52, 0x80, 0x6b, 0xaf, 0x3c, 0x56, 0x7d, 0x22, 0x75, 0x16, 0xc6, 0xa6, 0x5a, 0x26, - 0xb5, 0x3c, 0xb9, 0xd5, 0x6c, 0x24, 0x97, 0x9b, 0xd4, 0xf2, 0xe4, 0x56, 0xe3, 0x98, 0xd7, 0x19, - 0x54, 0x6e, 0x75, 0x40, 0xaa, 0xfe, 0x7e, 0x01, 0x9e, 0xb8, 0xd7, 0x5d, 0xa1, 0x8e, 0x45, 0x3d, - 0xea, 0x8a, 0x05, 0x39, 0xe0, 0xba, 0x00, 0x67, 0x13, 0x48, 0xc1, 0x1d, 0x17, 0xca, 0xf5, 0x00, - 0x59, 0x17, 0x6b, 0xbc, 0x3c, 0xdb, 0x26, 0x8a, 0x92, 0x59, 0x38, 0x13, 0x02, 0x59, 0x23, 0x5c, - 0x25, 0x8f, 0x4b, 0xc9, 0xd3, 0xdb, 0x5b, 0x13, 0x97, 0x25, 0x6e, 0xac, 0xd9, 0xb2, 0x06, 0xc7, - 0x8b, 0x91, 0x7b, 0x30, 0x1e, 0x82, 0xee, 0x38, 0x76, 0xb7, 0xe3, 0x2a, 0x05, 0x64, 0x35, 0xb1, - 0xbd, 0x35, 0xf1, 0xa4, 0xc4, 0xaa, 0x89, 0x48, 0x79, 0x01, 0x8f, 0x17, 0x24, 0x3f, 0x96, 0x93, - 0xb9, 0x89, 0x51, 0x58, 0xc4, 0x51, 0xf8, 0x9a, 0x3f, 0x0a, 0x33, 0x85, 0x74, 0x23, 0x5e, 0x52, - 0x0c, 0xca, 0x58, 0x33, 0x12, 0x83, 0x32, 0x51, 0xe3, 0xe5, 0x29, 0xb8, 0x90, 0xca, 0x6b, 0x4f, - 0x5a, 0xfd, 0xcf, 0x0a, 0x32, 0x97, 0x25, 0xdb, 0x08, 0x3a, 0x73, 0x51, 0xee, 0xcc, 0x25, 0xdb, - 0xc0, 0xa9, 0x3e, 0x17, 0xae, 0x9d, 0x52, 0x63, 0x3b, 0xb6, 0x11, 0x9f, 0xf5, 0x93, 0x65, 0xc9, - 0x97, 0xe1, 0x62, 0x02, 0xc8, 0xa7, 0x6b, 0xae, 0xfd, 0x57, 0xb7, 0xb7, 0x26, 0xd4, 0x14, 0xae, - 0xf1, 0xd9, 0x3b, 0x83, 0x0b, 0xd1, 0xe1, 0x92, 0x24, 0x75, 0xdb, 0xf2, 0x74, 0xd3, 0x12, 0xc6, - 0x25, 0x1f, 0x25, 0x9f, 0xda, 0xde, 0x9a, 0x78, 0x4e, 0xd6, 0x41, 0x9f, 0x26, 0xde, 0xf8, 0x2c, - 0x3e, 0xc4, 0x00, 0x25, 0x05, 0x55, 0x6d, 0xeb, 0x4d, 0xdf, 0x62, 0xbe, 0xb6, 0xbd, 0x35, 0xf1, - 0x89, 0xd4, 0x3a, 0x4c, 0x46, 0x25, 0xaf, 0xd0, 0x59, 0x9c, 0x88, 0x06, 0x24, 0xc4, 0x2d, 0xd8, - 0x06, 0xc5, 0x6f, 0xe8, 0x47, 0xfe, 0xea, 0xf6, 0xd6, 0xc4, 0xd3, 0x12, 0x7f, 0xcb, 0x36, 0x68, - 0xbc, 0xf9, 0x29, 0xa5, 0xd5, 0xdf, 0x2e, 0xc0, 0xd3, 0xb5, 0xf2, 0xfc, 0x5c, 0xd5, 0xf0, 0x4d, - 0x9a, 0x25, 0xc7, 0x7e, 0x64, 0x1a, 0xd2, 0xe8, 0x5d, 0x81, 0x4b, 0x31, 0xd4, 0x34, 0x5a, 0x51, - 0x81, 0x31, 0x8d, 0xdf, 0xe6, 0x9b, 0x4b, 0x1d, 0x41, 0x53, 0xe7, 0xa6, 0x56, 0x74, 0xd1, 0xce, - 0x62, 0xc4, 0xfa, 0x28, 0x86, 0xaa, 0xad, 0xd9, 0x8e, 0xd7, 0xe8, 0x7a, 0x42, 0x09, 0xb0, 0x8f, - 0x12, 0x75, 0xb8, 0x82, 0xa8, 0x47, 0x15, 0x3e, 0x1f, 0xf2, 0x93, 0x39, 0x18, 0x2f, 0x7b, 0x9e, - 0x63, 0xae, 0x74, 0x3d, 0x3a, 0xaf, 0x77, 0x3a, 0xa6, 0xd5, 0xc4, 0xb1, 0x3e, 0x7c, 0xeb, 0xad, - 0x60, 0x8d, 0xec, 0x29, 0x89, 0x1b, 0xf1, 0xe2, 0xd2, 0x10, 0xd5, 0x7d, 0x54, 0xbd, 0xcd, 0x71, - 0xf2, 0x10, 0x8d, 0x97, 0x63, 0x43, 0x34, 0x95, 0xd7, 0x9e, 0x86, 0xe8, 0xb7, 0x0a, 0x70, 0x65, - 0x71, 0xdd, 0xd3, 0x35, 0xea, 0xda, 0x5d, 0xa7, 0x41, 0xdd, 0xfb, 0x1d, 0x43, 0xf7, 0x68, 0x38, - 0x52, 0x27, 0xa0, 0xbf, 0x6c, 0x18, 0xd4, 0x40, 0x76, 0xfd, 0x7c, 0xdb, 0xa7, 0x33, 0x80, 0xc6, - 0xe1, 0xe4, 0x93, 0x30, 0x20, 0xca, 0x20, 0xf7, 0xfe, 0xc9, 0xe1, 0xed, 0xad, 0x89, 0x81, 0x2e, - 0x07, 0x69, 0x3e, 0x8e, 0x91, 0x55, 0x68, 0x8b, 0x32, 0xb2, 0x42, 0x48, 0x66, 0x70, 0x90, 0xe6, - 0xe3, 0xc8, 0xbb, 0x30, 0x86, 0x6c, 0x83, 0xf6, 0x88, 0xb9, 0xef, 0xbc, 0x2f, 0x5d, 0xb9, 0xb1, - 0x7c, 0x69, 0xc2, 0xd6, 0xd4, 0x1d, 0xbf, 0x80, 0x16, 0x63, 0x40, 0x1e, 0xc2, 0xb8, 0x68, 0x44, - 0xc8, 0xb4, 0xbf, 0x07, 0xd3, 0x0b, 0xdb, 0x5b, 0x13, 0x67, 0x45, 0xfb, 0x25, 0xb6, 0x09, 0x26, - 0x8c, 0xb1, 0x68, 0x76, 0xc8, 0xb8, 0xb4, 0x13, 0x63, 0xf1, 0xc5, 0x32, 0xe3, 0x38, 0x13, 0xf5, - 0x3d, 0x18, 0x91, 0x0b, 0x92, 0x8b, 0xb8, 0xb5, 0xe6, 0xe3, 0x04, 0x37, 0xe5, 0xa6, 0x81, 0xfb, - 0xe9, 0x97, 0x60, 0xb8, 0x42, 0xdd, 0x86, 0x63, 0x76, 0x98, 0xd5, 0x20, 0x94, 0xfc, 0xcc, 0xf6, - 0xd6, 0xc4, 0xb0, 0x11, 0x82, 0x35, 0x99, 0x46, 0xfd, 0xbf, 0x73, 0x70, 0x91, 0xf1, 0x2e, 0xbb, - 0xae, 0xd9, 0xb4, 0xda, 0xf2, 0xb2, 0xfd, 0x02, 0x94, 0x6a, 0x58, 0x9f, 0xa8, 0xe9, 0xfc, 0xf6, - 0xd6, 0xc4, 0x38, 0x6f, 0x81, 0xa4, 0x87, 0x82, 0x26, 0xd8, 0x57, 0xe6, 0x77, 0xd8, 0x57, 0x32, - 0x93, 0xd6, 0xd3, 0x1d, 0xcf, 0xb4, 0x9a, 0x35, 0x4f, 0xf7, 0xba, 0x6e, 0xc4, 0xa4, 0x15, 0x98, - 0xba, 0x8b, 0xa8, 0x88, 0x49, 0x1b, 0x29, 0x44, 0xde, 0x81, 0x91, 0x69, 0xcb, 0x08, 0x99, 0xf0, - 0x09, 0xf1, 0x49, 0x66, 0x69, 0x52, 0x84, 0x27, 0x59, 0x44, 0x0a, 0xa8, 0x7f, 0x2d, 0x07, 0x0a, - 0xdf, 0x04, 0xce, 0x99, 0xae, 0x37, 0x4f, 0xdb, 0x2b, 0xd2, 0xec, 0x34, 0xe3, 0xef, 0x2a, 0x19, - 0x4e, 0x5a, 0x8b, 0xd0, 0x14, 0x10, 0xbb, 0xca, 0x96, 0xe9, 0x26, 0xb6, 0x1f, 0xb1, 0x52, 0xa4, - 0x0a, 0x03, 0x9c, 0x33, 0xb7, 0x25, 0x86, 0x6f, 0x29, 0xbe, 0x22, 0xc4, 0xab, 0xe6, 0xca, 0xd0, - 0xe6, 0xc4, 0xf2, 0x86, 0x46, 0x94, 0x57, 0xff, 0x7a, 0x1e, 0xc6, 0xe3, 0x85, 0xc8, 0x43, 0x18, - 0xbc, 0x6b, 0x9b, 0x16, 0x35, 0x16, 0x2d, 0x6c, 0x61, 0xef, 0xc3, 0x11, 0xdf, 0x16, 0x3f, 0xf7, - 0x3e, 0x96, 0xa9, 0xcb, 0x16, 0x2c, 0x9e, 0x95, 0x04, 0xcc, 0xc8, 0x17, 0x61, 0x88, 0xd9, 0x80, - 0x8f, 0x90, 0x73, 0x7e, 0x47, 0xce, 0xcf, 0x08, 0xce, 0xe7, 0x1d, 0x5e, 0x28, 0xc9, 0x3a, 0x64, - 0xc7, 0xf4, 0x4a, 0xa3, 0xba, 0x6b, 0x5b, 0xa2, 0xe7, 0x51, 0xaf, 0x1c, 0x84, 0xc8, 0x7a, 0xc5, - 0x69, 0x98, 0xe9, 0xca, 0x3f, 0x16, 0xbb, 0x41, 0xda, 0xbb, 0x70, 0x59, 0xc5, 0x7b, 0x40, 0x22, - 0x56, 0x7f, 0x3c, 0x0f, 0x2f, 0x86, 0x22, 0xd3, 0xe8, 0x23, 0x93, 0x6e, 0x08, 0x71, 0xae, 0x99, - 0x1d, 0xb1, 0x67, 0x65, 0x2a, 0xef, 0x4e, 0xad, 0xe9, 0x56, 0x93, 0x1a, 0xe4, 0x3a, 0xf4, 0x6b, - 0x76, 0x8b, 0xba, 0x4a, 0x0e, 0xcd, 0x35, 0x9c, 0x4e, 0x1c, 0x06, 0x90, 0x0f, 0x3d, 0x90, 0x82, - 0xd8, 0x50, 0x5a, 0x76, 0x74, 0xd3, 0xf3, 0x7b, 0xb6, 0x9c, 0xec, 0xd9, 0x5d, 0xd4, 0x78, 0x83, - 0xf3, 0xe0, 0x73, 0x3e, 0x0a, 0xc2, 0x43, 0x80, 0x2c, 0x08, 0x4e, 0x72, 0xf9, 0x75, 0x18, 0x96, - 0x88, 0xf7, 0x34, 0xa9, 0x7f, 0xbb, 0x28, 0xeb, 0xba, 0xdf, 0x2c, 0xa1, 0xeb, 0x37, 0x99, 0x8e, - 0xba, 0x2e, 0xb3, 0x2a, 0xb8, 0x92, 0x0b, 0x4d, 0x44, 0x50, 0x54, 0x13, 0x11, 0x44, 0x5e, 0x86, - 0x41, 0xce, 0x22, 0xd8, 0xbf, 0xe2, 0xde, 0xd7, 0x41, 0x58, 0x74, 0x69, 0x0e, 0x08, 0xc9, 0x2f, - 0xe7, 0xe0, 0xa9, 0x9e, 0x92, 0x40, 0x65, 0x18, 0xbe, 0xf5, 0xca, 0xbe, 0xc4, 0x38, 0xf9, 0xe2, - 0xf6, 0xd6, 0xc4, 0xf5, 0x76, 0x40, 0x52, 0x77, 0x24, 0x9a, 0x7a, 0x83, 0x13, 0x49, 0xed, 0xea, - 0xdd, 0x14, 0x66, 0x3c, 0xf2, 0x4a, 0x67, 0xf0, 0xe8, 0xc8, 0x6a, 0x6c, 0xfa, 0x8d, 0x2c, 0x86, - 0xc6, 0xa3, 0xf8, 0xde, 0x55, 0x9f, 0x24, 0xa5, 0x9a, 0x0c, 0x2e, 0xa4, 0x01, 0x97, 0x38, 0xa6, - 0xa2, 0x6f, 0x2e, 0xae, 0xce, 0xdb, 0x96, 0xb7, 0xe6, 0x57, 0xd0, 0x2f, 0x9f, 0xbd, 0x60, 0x05, - 0x86, 0xbe, 0x59, 0xb7, 0x57, 0xeb, 0x6d, 0x46, 0x95, 0x52, 0x47, 0x16, 0x27, 0x36, 0xd1, 0x8a, - 0x31, 0xe7, 0x4f, 0x41, 0xa5, 0xf0, 0x64, 0xcc, 0x1f, 0xa7, 0xc9, 0x09, 0x27, 0x56, 0x48, 0xad, - 0xc2, 0xc8, 0x9c, 0xdd, 0x58, 0x0f, 0xd4, 0xe5, 0x75, 0x28, 0x2d, 0xeb, 0x4e, 0x93, 0x7a, 0x28, - 0x8b, 0xe1, 0x5b, 0x67, 0x6f, 0xf0, 0xd3, 0x66, 0x46, 0xc4, 0x11, 0x93, 0x63, 0x62, 0x36, 0x28, - 0x79, 0xf8, 0x5b, 0x13, 0x05, 0xd4, 0xef, 0xf7, 0xc3, 0x88, 0x38, 0x19, 0xc5, 0xd9, 0x9c, 0xbc, - 0x11, 0x9e, 0x35, 0x8b, 0xe9, 0x2b, 0x38, 0x1d, 0x0a, 0x4e, 0xb5, 0x46, 0x18, 0xb3, 0xbf, 0xbf, - 0x35, 0x91, 0xdb, 0xde, 0x9a, 0xe8, 0xd3, 0x06, 0xa5, 0x4d, 0x65, 0xb8, 0xde, 0x48, 0x0b, 0xac, - 0x7c, 0xd6, 0x19, 0x2b, 0xcb, 0xd7, 0x9f, 0x77, 0x60, 0x40, 0xb4, 0x41, 0x68, 0xdc, 0xa5, 0xf0, - 0x2c, 0x23, 0x72, 0xc2, 0x1b, 0x2b, 0xed, 0x97, 0x22, 0x6f, 0x41, 0x89, 0xef, 0xed, 0x85, 0x00, - 0x2e, 0xa6, 0x9f, 0x85, 0xc4, 0x8a, 0x8b, 0x32, 0x64, 0x16, 0x20, 0xdc, 0xd7, 0x07, 0x07, 0xda, - 0x82, 0x43, 0x72, 0xc7, 0x1f, 0xe3, 0x22, 0x95, 0x25, 0xaf, 0xc2, 0xc8, 0x32, 0x75, 0xda, 0xa6, - 0xa5, 0xb7, 0x6a, 0xe6, 0x07, 0xfe, 0x99, 0x36, 0x2e, 0xbc, 0xae, 0xf9, 0x81, 0x3c, 0x72, 0x23, - 0x74, 0xe4, 0x4b, 0x69, 0xfb, 0xe6, 0x01, 0x6c, 0xc8, 0xb3, 0x3b, 0x6e, 0x28, 0x63, 0xed, 0x49, - 0xd9, 0x46, 0xbf, 0x0b, 0xa3, 0x91, 0x2d, 0x93, 0x38, 0xb4, 0x7c, 0x2a, 0xc9, 0x5a, 0xda, 0xff, - 0xc5, 0xd8, 0x46, 0x39, 0x30, 0x4d, 0xae, 0x5a, 0xa6, 0x67, 0xea, 0xad, 0x29, 0xbb, 0xdd, 0xd6, - 0x2d, 0x43, 0x19, 0x0a, 0x35, 0xd9, 0xe4, 0x98, 0x7a, 0x83, 0xa3, 0x64, 0x4d, 0x8e, 0x16, 0x62, - 0xdb, 0x72, 0xd1, 0x87, 0x1a, 0x6d, 0xd8, 0x0e, 0xb3, 0x05, 0xf0, 0x4c, 0x52, 0x6c, 0xcb, 0x5d, - 0x8e, 0xab, 0x3b, 0x3e, 0x52, 0x36, 0xb6, 0xe3, 0x05, 0xef, 0x16, 0x07, 0x87, 0xc7, 0x47, 0xe2, - 0xc7, 0xc8, 0xea, 0x5f, 0x2d, 0xc0, 0xb0, 0x20, 0x65, 0x4b, 0xe9, 0xa9, 0x82, 0x1f, 0x44, 0xc1, - 0x53, 0x15, 0xb5, 0x74, 0x58, 0x8a, 0xaa, 0x7e, 0x2d, 0x1f, 0xcc, 0x46, 0x4b, 0x8e, 0x69, 0x1d, - 0x6c, 0x36, 0xba, 0x0a, 0x30, 0xb5, 0xd6, 0xb5, 0xd6, 0xf9, 0x75, 0x59, 0x3e, 0xbc, 0x2e, 0x6b, - 0x98, 0x9a, 0x84, 0x21, 0x4f, 0x41, 0xb1, 0xc2, 0xf8, 0xb3, 0x9e, 0x19, 0x99, 0x1c, 0xfa, 0x1e, - 0xe7, 0x94, 0x7b, 0x51, 0x43, 0x30, 0xdb, 0x5c, 0x4d, 0x6e, 0x7a, 0x94, 0x9b, 0xb3, 0x05, 0xbe, - 0xb9, 0x5a, 0x61, 0x00, 0x8d, 0xc3, 0xc9, 0x6d, 0x38, 0x5b, 0xa1, 0x2d, 0x7d, 0x73, 0xde, 0x6c, - 0xb5, 0x4c, 0x97, 0x36, 0x6c, 0xcb, 0x70, 0x51, 0xc8, 0xa2, 0xba, 0xb6, 0xab, 0x25, 0x09, 0x88, - 0x0a, 0xa5, 0xc5, 0xd5, 0x55, 0x97, 0x7a, 0x28, 0xbe, 0xc2, 0x24, 0xb0, 0xc9, 0xd9, 0x46, 0x88, - 0x26, 0x30, 0xea, 0xaf, 0xe5, 0xd8, 0xee, 0xc5, 0x5d, 0xf7, 0xec, 0x4e, 0xa0, 0xe5, 0x07, 0x12, - 0xc9, 0xf5, 0xd0, 0xae, 0xc8, 0xe3, 0xd7, 0x9e, 0x11, 0x5f, 0x3b, 0x20, 0x6c, 0x8b, 0xd0, 0xa2, - 0x48, 0xfd, 0xaa, 0xc2, 0x0e, 0x5f, 0xa5, 0xfe, 0x61, 0x1e, 0x2e, 0x89, 0x16, 0x4f, 0xb5, 0xcc, - 0xce, 0x8a, 0xad, 0x3b, 0x86, 0x46, 0x1b, 0xd4, 0x7c, 0x44, 0x8f, 0xe7, 0xc0, 0x8b, 0x0e, 0x9d, - 0xe2, 0x01, 0x86, 0xce, 0x2d, 0xdc, 0x08, 0x32, 0xc9, 0xe0, 0x81, 0x2f, 0x37, 0x2a, 0xc6, 0xb7, - 0xb7, 0x26, 0x46, 0x0c, 0x0e, 0xc6, 0x23, 0x7f, 0x4d, 0x26, 0x62, 0x4a, 0x32, 0x47, 0xad, 0xa6, - 0xb7, 0x86, 0x4a, 0xd2, 0xcf, 0x95, 0xa4, 0x85, 0x10, 0x4d, 0x60, 0xd4, 0xff, 0x3d, 0x0f, 0xe7, - 0xe3, 0x22, 0xaf, 0x51, 0xcb, 0x38, 0x95, 0xf7, 0x87, 0x23, 0xef, 0x3f, 0x2a, 0xc0, 0x93, 0xa2, - 0x4c, 0x6d, 0x4d, 0x77, 0xa8, 0x51, 0x31, 0x1d, 0xda, 0xf0, 0x6c, 0x67, 0xf3, 0x18, 0x1b, 0x50, - 0x87, 0x27, 0xf6, 0xdb, 0x50, 0x12, 0xdb, 0x7f, 0xbe, 0xce, 0x8c, 0x05, 0x2d, 0x41, 0x68, 0x62, - 0x85, 0xe2, 0x47, 0x07, 0xb1, 0xce, 0x2a, 0xed, 0xa6, 0xb3, 0x3e, 0x0b, 0xa3, 0x81, 0xe8, 0x71, - 0x23, 0x3a, 0x10, 0x5a, 0x5b, 0x86, 0x8f, 0xc0, 0xbd, 0xa8, 0x16, 0x25, 0xc4, 0xda, 0x7c, 0x40, - 0xb5, 0x82, 0xd6, 0xd0, 0xa8, 0xa8, 0x2d, 0x28, 0x67, 0x1a, 0x9a, 0x4c, 0xa4, 0x6e, 0x15, 0xe1, - 0x72, 0x7a, 0xb7, 0x6b, 0x54, 0x37, 0x4e, 0x7b, 0xfd, 0x63, 0xd9, 0xeb, 0xe4, 0x59, 0x28, 0x2e, - 0xe9, 0xde, 0x9a, 0xb8, 0x7e, 0xc7, 0x3b, 0xe1, 0x55, 0xb3, 0x45, 0xeb, 0x1d, 0xdd, 0x5b, 0xd3, - 0x10, 0x25, 0xcd, 0x19, 0x80, 0x1c, 0x53, 0xe6, 0x0c, 0x69, 0xb1, 0x1f, 0x7e, 0x26, 0x77, 0xad, - 0x98, 0xba, 0xd8, 0x7f, 0xbf, 0x98, 0x35, 0xaf, 0x3c, 0x74, 0x4c, 0x8f, 0x9e, 0x6a, 0xd8, 0xa9, - 0x86, 0x1d, 0x50, 0xc3, 0xfe, 0x61, 0x1e, 0x46, 0x83, 0x4d, 0xd3, 0xfb, 0xb4, 0x71, 0x34, 0x6b, - 0x55, 0xb8, 0x95, 0x29, 0x1c, 0x78, 0x2b, 0x73, 0x10, 0x85, 0x52, 0x83, 0x23, 0x4f, 0x6e, 0x1a, - 0xa0, 0xc4, 0xf8, 0x91, 0x67, 0x70, 0xd0, 0xf9, 0x2c, 0x0c, 0xcc, 0xeb, 0x8f, 0xcd, 0x76, 0xb7, - 0x2d, 0xac, 0x74, 0x74, 0x27, 0x6b, 0xeb, 0x8f, 0x35, 0x1f, 0xae, 0xfe, 0x77, 0x39, 0x18, 0x13, - 0x42, 0x15, 0xcc, 0x0f, 0x24, 0xd5, 0x50, 0x3a, 0xf9, 0x03, 0x4b, 0xa7, 0xb0, 0x7f, 0xe9, 0xa8, - 0x7f, 0xae, 0x00, 0xca, 0x8c, 0xd9, 0xa2, 0xcb, 0x8e, 0x6e, 0xb9, 0xab, 0xd4, 0x11, 0xdb, 0xe9, - 0x69, 0xc6, 0xea, 0x40, 0x1f, 0x28, 0x4d, 0x29, 0xf9, 0x7d, 0x4d, 0x29, 0x9f, 0x86, 0x21, 0xd1, - 0x98, 0xc0, 0x95, 0x11, 0x47, 0x8d, 0xe3, 0x03, 0xb5, 0x10, 0xcf, 0x88, 0xcb, 0x9d, 0x8e, 0x63, - 0x3f, 0xa2, 0x0e, 0xbf, 0xa5, 0x12, 0xc4, 0xba, 0x0f, 0xd4, 0x42, 0xbc, 0xc4, 0x99, 0xfa, 0xf6, - 0xa2, 0xcc, 0x99, 0x3a, 0x5a, 0x88, 0x27, 0xd7, 0x60, 0x70, 0xce, 0x6e, 0xe8, 0x28, 0x68, 0x3e, - 0xad, 0x8c, 0x6c, 0x6f, 0x4d, 0x0c, 0xb6, 0x04, 0x4c, 0x0b, 0xb0, 0x8c, 0xb2, 0x62, 0x6f, 0x58, - 0x2d, 0x5b, 0xe7, 0xce, 0x2f, 0x83, 0x9c, 0xd2, 0x10, 0x30, 0x2d, 0xc0, 0x32, 0x4a, 0x26, 0x73, - 0x74, 0x2a, 0x1a, 0x0c, 0x79, 0xae, 0x0a, 0x98, 0x16, 0x60, 0xd5, 0x5f, 0x2b, 0x32, 0xed, 0x75, - 0xcd, 0x0f, 0x4e, 0xfc, 0xba, 0x10, 0x0e, 0x98, 0xfe, 0x7d, 0x0c, 0x98, 0x13, 0x73, 0x60, 0xa7, - 0xfe, 0xf3, 0x01, 0x00, 0x21, 0xfd, 0xe9, 0xd3, 0xcd, 0xe1, 0xc1, 0xb4, 0xa6, 0x02, 0x67, 0xa7, - 0xad, 0x35, 0xdd, 0x6a, 0x50, 0x23, 0x3c, 0xb6, 0x2c, 0xe1, 0xd0, 0x46, 0x27, 0x48, 0x2a, 0x90, - 0xe1, 0xb9, 0xa5, 0x96, 0x2c, 0x40, 0x5e, 0x82, 0xe1, 0xaa, 0xe5, 0x51, 0x47, 0x6f, 0x78, 0xe6, - 0x23, 0x2a, 0xa6, 0x06, 0xbc, 0x19, 0x36, 0x43, 0xb0, 0x26, 0xd3, 0x90, 0xdb, 0x30, 0xb2, 0xa4, - 0x3b, 0x9e, 0xd9, 0x30, 0x3b, 0xba, 0xe5, 0xb9, 0xca, 0x20, 0xce, 0x68, 0x68, 0x61, 0x74, 0x24, - 0xb8, 0x16, 0xa1, 0x22, 0x5f, 0x82, 0x21, 0xdc, 0x9a, 0xa2, 0xbf, 0xf6, 0xd0, 0x8e, 0x17, 0x87, - 0xcf, 0x85, 0xee, 0x81, 0xfc, 0xf4, 0x15, 0x6f, 0x80, 0xe3, 0x77, 0x87, 0x01, 0x47, 0xf2, 0x05, - 0x18, 0x98, 0xb6, 0x0c, 0x64, 0x0e, 0x3b, 0x32, 0x57, 0x05, 0xf3, 0x8b, 0x21, 0x73, 0xbb, 0x13, - 0xe3, 0xed, 0xb3, 0x4b, 0x1f, 0x65, 0xc3, 0x1f, 0xde, 0x28, 0x1b, 0xf9, 0x10, 0x8e, 0xc5, 0x47, - 0x0f, 0xeb, 0x58, 0x7c, 0x6c, 0x9f, 0xc7, 0xe2, 0xea, 0x07, 0x30, 0x3c, 0xb9, 0x34, 0x13, 0x8c, - 0xde, 0x27, 0xa0, 0xb0, 0x24, 0x3c, 0x15, 0x8a, 0xdc, 0x9e, 0xe9, 0x98, 0x86, 0xc6, 0x60, 0xe4, - 0x3a, 0x0c, 0x4e, 0xa1, 0xfb, 0x9b, 0xb8, 0x45, 0x2c, 0xf2, 0xf5, 0xaf, 0x81, 0x30, 0xf4, 0x82, - 0xf5, 0xd1, 0xe4, 0x93, 0x30, 0xb0, 0xe4, 0xd8, 0x4d, 0x47, 0x6f, 0x8b, 0x35, 0x18, 0x5d, 0x45, - 0x3a, 0x1c, 0xa4, 0xf9, 0x38, 0xf5, 0xa7, 0x73, 0xbe, 0xd9, 0xce, 0x4a, 0xd4, 0xba, 0x78, 0x34, - 0x8f, 0x75, 0x0f, 0xf2, 0x12, 0x2e, 0x07, 0x69, 0x3e, 0x8e, 0x5c, 0x87, 0xfe, 0x69, 0xc7, 0xb1, - 0x1d, 0xd9, 0xc7, 0x9d, 0x32, 0x80, 0x7c, 0xdd, 0x8b, 0x14, 0xe4, 0x35, 0x18, 0xe6, 0x73, 0x0e, - 0x3f, 0xd1, 0x2c, 0xf4, 0xba, 0x29, 0x95, 0x29, 0xd5, 0xef, 0x16, 0x24, 0x9b, 0x8d, 0x4b, 0xfc, - 0x04, 0xde, 0x0a, 0xbc, 0x0c, 0x85, 0xc9, 0xa5, 0x19, 0x31, 0x01, 0x9e, 0xf3, 0x8b, 0x4a, 0xaa, - 0x12, 0x2b, 0xc7, 0xa8, 0xc9, 0x15, 0x28, 0x2e, 0x31, 0xf5, 0x29, 0xa1, 0x7a, 0x0c, 0x6e, 0x6f, - 0x4d, 0x14, 0x3b, 0x4c, 0x7f, 0x10, 0x8a, 0x58, 0xb6, 0x99, 0xe1, 0x3b, 0x26, 0x8e, 0x0d, 0xf7, - 0x31, 0x57, 0xa0, 0x58, 0x76, 0x9a, 0x8f, 0xc4, 0xac, 0x85, 0x58, 0xdd, 0x69, 0x3e, 0xd2, 0x10, - 0x4a, 0x6e, 0x02, 0x68, 0xd4, 0xeb, 0x3a, 0x16, 0x3e, 0x3f, 0x19, 0xc2, 0xf3, 0x37, 0x9c, 0x0d, - 0x1d, 0x84, 0xd6, 0x1b, 0xb6, 0x41, 0x35, 0x89, 0x44, 0xfd, 0x2b, 0xe1, 0xc5, 0x4e, 0xc5, 0x74, - 0xd7, 0x4f, 0xbb, 0x70, 0x0f, 0x5d, 0xa8, 0x8b, 0x23, 0xce, 0x64, 0x27, 0x4d, 0x40, 0xff, 0x4c, - 0x4b, 0x6f, 0xba, 0xd8, 0x87, 0xc2, 0x97, 0x6c, 0x95, 0x01, 0x34, 0x0e, 0x8f, 0xf5, 0xd3, 0xe0, - 0xce, 0xfd, 0xf4, 0xb3, 0xfd, 0xc1, 0x68, 0x5b, 0xa0, 0xde, 0x86, 0xed, 0x9c, 0x76, 0xd5, 0x6e, - 0xbb, 0xea, 0x2a, 0x0c, 0xd4, 0x9c, 0x86, 0x74, 0x74, 0x81, 0xfb, 0x01, 0xd7, 0x69, 0xf0, 0x63, - 0x0b, 0x1f, 0xc9, 0xe8, 0x2a, 0xae, 0x87, 0x74, 0x03, 0x21, 0x9d, 0xe1, 0x7a, 0x82, 0x4e, 0x20, - 0x05, 0xdd, 0x92, 0xed, 0x78, 0xa2, 0xe3, 0x02, 0xba, 0x8e, 0xed, 0x78, 0x9a, 0x8f, 0x24, 0x9f, - 0x06, 0x58, 0x9e, 0x5a, 0xf2, 0x9d, 0xed, 0x87, 0x42, 0x5f, 0x40, 0xe1, 0x65, 0xaf, 0x49, 0x68, - 0xb2, 0x0c, 0x43, 0x8b, 0x1d, 0xea, 0xf0, 0xad, 0x10, 0x7f, 0x50, 0xf2, 0xa9, 0x98, 0x68, 0x45, - 0xbf, 0xdf, 0x10, 0xff, 0x07, 0xe4, 0x7c, 0x7d, 0xb1, 0xfd, 0x9f, 0x5a, 0xc8, 0x88, 0xbc, 0x06, - 0xa5, 0x32, 0xb7, 0xf3, 0x86, 0x91, 0x65, 0x20, 0x32, 0xdc, 0x82, 0x72, 0x14, 0xdf, 0xb3, 0xeb, - 0xf8, 0xb7, 0x26, 0xc8, 0xd5, 0xeb, 0x30, 0x1e, 0xaf, 0x86, 0x0c, 0xc3, 0xc0, 0xd4, 0xe2, 0xc2, - 0xc2, 0xf4, 0xd4, 0xf2, 0x78, 0x1f, 0x19, 0x84, 0x62, 0x6d, 0x7a, 0xa1, 0x32, 0x9e, 0x53, 0x7f, - 0x45, 0x9a, 0x41, 0x98, 0x6a, 0x9d, 0x5e, 0x0d, 0x1f, 0xe8, 0xbe, 0x65, 0x1c, 0xef, 0x43, 0xf1, - 0xc4, 0xa0, 0x6d, 0x7a, 0x1e, 0x35, 0xc4, 0x2a, 0x81, 0xf7, 0x85, 0xde, 0x63, 0x2d, 0x81, 0x27, - 0x2f, 0xc0, 0x28, 0xc2, 0xc4, 0x15, 0x21, 0xdf, 0x1f, 0x8b, 0x02, 0xce, 0x63, 0x2d, 0x8a, 0x54, - 0x7f, 0x2f, 0xbc, 0x1d, 0x9e, 0xa3, 0xfa, 0x71, 0xbd, 0x51, 0xfc, 0x88, 0xf4, 0x97, 0xfa, 0x2f, - 0x8b, 0xfc, 0x09, 0x08, 0x7f, 0x2f, 0x78, 0x14, 0xa2, 0x0c, 0x8f, 0x74, 0x0b, 0x7b, 0x38, 0xd2, - 0x7d, 0x01, 0x4a, 0xf3, 0xd4, 0x5b, 0xb3, 0x7d, 0xc7, 0x2f, 0xf4, 0xd0, 0x6b, 0x23, 0x44, 0xf6, - 0xd0, 0xe3, 0x34, 0x64, 0x1d, 0x88, 0xff, 0x18, 0x30, 0x70, 0xc4, 0xf6, 0x8f, 0x90, 0x2f, 0x25, - 0xf6, 0x29, 0x35, 0x7c, 0x09, 0x8c, 0x3e, 0xf6, 0xe7, 0x03, 0x47, 0x6f, 0xc9, 0x13, 0xeb, 0x5f, - 0x6c, 0x4d, 0x94, 0x38, 0x8d, 0x96, 0xc2, 0x96, 0xbc, 0x0b, 0x43, 0xf3, 0x33, 0x65, 0xf1, 0x30, - 0x90, 0x7b, 0x45, 0x3c, 0x11, 0x48, 0xd1, 0x47, 0x04, 0x22, 0xc1, 0xf7, 0x36, 0xed, 0x55, 0x3d, - 0xf9, 0x2e, 0x30, 0xe4, 0xc2, 0xb4, 0x85, 0xbf, 0xdc, 0x11, 0xa7, 0x0b, 0x81, 0xb6, 0x44, 0xdf, - 0xf3, 0xc4, 0x65, 0xc5, 0xb1, 0x31, 0x6d, 0x19, 0x3c, 0xc0, 0xe8, 0x5e, 0x84, 0xb3, 0xe5, 0x4e, - 0xa7, 0x65, 0x52, 0x03, 0xf5, 0x45, 0xeb, 0xb6, 0xa8, 0x2b, 0x5c, 0x7e, 0xf0, 0x31, 0x88, 0xce, - 0x91, 0x75, 0x7c, 0x8e, 0x5a, 0x77, 0xba, 0x51, 0xff, 0xcc, 0x64, 0x59, 0xf5, 0x4f, 0xe7, 0xe1, - 0xe2, 0x94, 0x43, 0x75, 0x8f, 0xce, 0xcf, 0x94, 0xcb, 0x5d, 0xf4, 0x91, 0x6b, 0xb5, 0xa8, 0xd5, - 0x3c, 0x9a, 0x61, 0xfd, 0x26, 0x8c, 0x05, 0x0d, 0xa8, 0x35, 0xec, 0x0e, 0x95, 0x1f, 0x56, 0x35, - 0x7c, 0x4c, 0xdd, 0x65, 0x28, 0x2d, 0x46, 0x4a, 0xee, 0xc1, 0xb9, 0x00, 0x52, 0x6e, 0xb5, 0xec, - 0x0d, 0x8d, 0x76, 0x5d, 0xee, 0x18, 0x3b, 0xc8, 0x1d, 0x63, 0x43, 0x0e, 0x3a, 0xc3, 0xd7, 0x1d, - 0x46, 0xa0, 0xa5, 0x95, 0x52, 0x7f, 0xa1, 0x00, 0x97, 0x1e, 0xe8, 0x2d, 0xd3, 0x08, 0x45, 0xa3, - 0x51, 0xb7, 0x63, 0x5b, 0x2e, 0x3d, 0x46, 0xa3, 0x34, 0x32, 0x14, 0x8a, 0x87, 0x32, 0x14, 0x92, - 0x5d, 0xd4, 0x7f, 0xe0, 0x2e, 0x2a, 0xed, 0xab, 0x8b, 0xfe, 0xb7, 0x1c, 0x8c, 0xfb, 0x8e, 0xff, - 0xf2, 0x23, 0x6e, 0xc9, 0x2b, 0x1d, 0x8f, 0x10, 0x63, 0x7e, 0xd0, 0x88, 0x27, 0x35, 0x18, 0x98, - 0x7e, 0xdc, 0x31, 0x1d, 0xea, 0xee, 0xc2, 0x89, 0xfb, 0x29, 0x71, 0x5c, 0x72, 0x96, 0xf2, 0x22, - 0x89, 0x93, 0x12, 0x0e, 0xc6, 0xe7, 0x7c, 0xfc, 0xe9, 0xc3, 0xa4, 0xff, 0x32, 0x9d, 0x3f, 0xe7, - 0x13, 0x4f, 0x24, 0x22, 0xef, 0x33, 0x43, 0x52, 0xf2, 0x1c, 0x14, 0x96, 0x97, 0xe7, 0xc4, 0x4c, - 0x8a, 0x11, 0x01, 0x3c, 0x4f, 0x7e, 0xaf, 0xc8, 0xb0, 0xea, 0x3f, 0xc9, 0x03, 0x30, 0x55, 0xe0, - 0xc3, 0xf5, 0x48, 0x94, 0x70, 0x12, 0x06, 0x7d, 0x81, 0x0b, 0x35, 0x0c, 0xbc, 0xf6, 0xe3, 0x1d, - 0x11, 0xaf, 0x3b, 0x78, 0xa1, 0x31, 0xe1, 0x3b, 0x92, 0xf3, 0x7b, 0x00, 0xdc, 0xd9, 0xa0, 0x23, - 0xb9, 0xef, 0x3e, 0xfe, 0x69, 0x18, 0x12, 0x33, 0x9e, 0x1d, 0x39, 0xff, 0x6f, 0xf8, 0x40, 0x2d, - 0xc4, 0xc7, 0xa6, 0xd6, 0xd2, 0x01, 0x16, 0x62, 0x5f, 0xbc, 0xbc, 0x57, 0x4e, 0xc5, 0x7b, 0xc8, - 0xe2, 0xfd, 0x86, 0x10, 0x2f, 0x7f, 0xc1, 0x73, 0x6c, 0xc5, 0x7b, 0x68, 0x67, 0xdf, 0xea, 0x3f, - 0xcc, 0x01, 0x61, 0xcd, 0x5a, 0xd2, 0x5d, 0x77, 0xc3, 0x76, 0x0c, 0xee, 0x9c, 0x7e, 0x24, 0x82, - 0x39, 0xbc, 0xfb, 0xca, 0xef, 0x0e, 0xc2, 0xb9, 0x88, 0xe3, 0xef, 0x31, 0x9f, 0xac, 0xae, 0x47, - 0x47, 0x53, 0xaf, 0x57, 0x2f, 0x9f, 0x90, 0x2f, 0x44, 0xfb, 0x23, 0x0f, 0xd0, 0xa4, 0x9b, 0xd0, - 0x17, 0x61, 0x44, 0xfc, 0x60, 0x2b, 0xb4, 0x7f, 0xd3, 0x85, 0xa3, 0xd4, 0x65, 0x00, 0x2d, 0x82, - 0x26, 0xaf, 0xc0, 0x10, 0x1b, 0x30, 0x4d, 0x0c, 0x1e, 0x32, 0x10, 0xbe, 0x28, 0x31, 0x7c, 0xa0, - 0xbc, 0x9e, 0x04, 0x94, 0xd2, 0x3b, 0xa2, 0xc1, 0x5d, 0xbc, 0x23, 0xfa, 0x32, 0x0c, 0x97, 0x2d, - 0xcb, 0xf6, 0x70, 0x93, 0xee, 0x8a, 0xab, 0x89, 0x4c, 0xab, 0xfc, 0x39, 0x7c, 0x1c, 0x1f, 0xd2, - 0xa7, 0x9a, 0xe5, 0x32, 0x43, 0x72, 0xcb, 0x7f, 0x15, 0x43, 0x1d, 0xe1, 0x55, 0x8e, 0xd7, 0x33, - 0x8e, 0x80, 0x25, 0x1f, 0xc5, 0x60, 0xe7, 0x8d, 0x2e, 0x39, 0x76, 0xc7, 0x76, 0xa9, 0xc1, 0x05, - 0x35, 0x1c, 0x86, 0x1a, 0xe8, 0x08, 0x04, 0xbe, 0x63, 0x8b, 0x04, 0xf2, 0x88, 0x14, 0x21, 0xab, - 0x70, 0xde, 0xbf, 0x28, 0x0e, 0x5e, 0x0c, 0x56, 0x2b, 0xae, 0x32, 0x82, 0xaf, 0x92, 0x48, 0x5c, - 0x19, 0xaa, 0x95, 0xc9, 0xa7, 0xfd, 0x6b, 0x11, 0xff, 0xc9, 0x61, 0xdd, 0x34, 0xe4, 0xae, 0x4e, - 0xe5, 0x47, 0x7e, 0x04, 0x86, 0xe7, 0xf5, 0xc7, 0x95, 0xae, 0x38, 0x7b, 0x19, 0xdd, 0xfd, 0xed, - 0x4b, 0x5b, 0x7f, 0x5c, 0x37, 0x44, 0xb9, 0x98, 0x4d, 0x21, 0xb3, 0x24, 0x75, 0xb8, 0xb8, 0xe4, - 0xd8, 0x6d, 0xdb, 0xa3, 0x46, 0xec, 0xf1, 0xdd, 0x99, 0xf0, 0xb5, 0x6e, 0x47, 0x50, 0xd4, 0x7b, - 0xbc, 0xc2, 0xcb, 0x60, 0x43, 0xda, 0x70, 0xa6, 0xec, 0xba, 0xdd, 0x36, 0x0d, 0x6f, 0xa8, 0xc6, - 0x77, 0xfc, 0x8c, 0x4f, 0x09, 0xaf, 0xe5, 0x27, 0x75, 0x2c, 0xca, 0x2f, 0xa8, 0xea, 0x9e, 0x29, - 0xd7, 0x88, 0xdf, 0x12, 0xe7, 0x7d, 0xb7, 0x38, 0x38, 0x36, 0x7e, 0x46, 0xbb, 0x94, 0x6c, 0xcc, - 0xb2, 0xe9, 0xb5, 0xa8, 0xfa, 0x9d, 0x1c, 0x40, 0x28, 0x60, 0xf2, 0x62, 0x34, 0x42, 0x51, 0x2e, - 0xbc, 0xe8, 0x10, 0xd1, 0x0b, 0x22, 0x21, 0x89, 0xc8, 0x15, 0x28, 0x62, 0x84, 0x8b, 0x7c, 0x78, - 0xb0, 0xba, 0x6e, 0x5a, 0x86, 0x86, 0x50, 0x86, 0x95, 0x9e, 0xa2, 0x23, 0x16, 0x2f, 0xf5, 0xb9, - 0x55, 0x58, 0x81, 0x33, 0xb5, 0xee, 0x8a, 0x5f, 0xb7, 0xf4, 0xae, 0x0e, 0x03, 0x6d, 0xb8, 0xdd, - 0x95, 0xe0, 0x31, 0x6a, 0x24, 0x8c, 0x49, 0xb4, 0x88, 0xfa, 0x6b, 0xb9, 0xd8, 0x2c, 0x78, 0x84, - 0x8b, 0xde, 0x27, 0x92, 0x7e, 0x1a, 0xc9, 0x69, 0x49, 0xfd, 0x0b, 0x79, 0x18, 0x5e, 0xb2, 0x1d, - 0x4f, 0x84, 0x0c, 0x39, 0xde, 0xab, 0x90, 0xb4, 0x57, 0x2a, 0xee, 0x61, 0xaf, 0x74, 0x05, 0x8a, - 0x92, 0x8b, 0x32, 0xbf, 0x17, 0x31, 0x0c, 0x47, 0x43, 0xa8, 0xfa, 0xa3, 0x79, 0x80, 0x2f, 0xbc, - 0xf4, 0xd2, 0x09, 0x16, 0x90, 0xfa, 0xf3, 0x39, 0x38, 0x23, 0x2e, 0xea, 0xa4, 0x58, 0x5f, 0x03, - 0xfe, 0x15, 0xab, 0x3c, 0x2e, 0x39, 0x48, 0xf3, 0x71, 0x6c, 0x09, 0x98, 0x7e, 0x6c, 0x7a, 0x78, - 0x57, 0x21, 0x05, 0xfb, 0xa2, 0x02, 0x26, 0x2f, 0x01, 0x3e, 0x1d, 0x79, 0xd1, 0xbf, 0x82, 0x2c, - 0x84, 0xeb, 0x1e, 0x2b, 0x30, 0x9d, 0x7a, 0x0d, 0xa9, 0xfe, 0x66, 0x11, 0x8a, 0xd3, 0x8f, 0x69, - 0xe3, 0x98, 0x77, 0x8d, 0x74, 0xb0, 0x59, 0x3c, 0xe0, 0xc1, 0xe6, 0x7e, 0x7c, 0x2a, 0xde, 0x09, - 0xfb, 0xb3, 0x14, 0xad, 0x3e, 0xd6, 0xf3, 0xf1, 0xea, 0xfd, 0x9e, 0x3e, 0x7e, 0x2e, 0x39, 0xff, - 0x65, 0x01, 0x0a, 0xb5, 0xa9, 0xa5, 0x53, 0xbd, 0x39, 0x52, 0xbd, 0xe9, 0x7d, 0x67, 0xad, 0x06, - 0xd7, 0x50, 0x83, 0xa1, 0x97, 0x68, 0xec, 0xc6, 0xe9, 0x8f, 0x0a, 0x30, 0x56, 0x9b, 0x59, 0x5e, - 0x92, 0x4e, 0x82, 0xef, 0x71, 0x4f, 0x3e, 0xf4, 0x29, 0xe3, 0x5d, 0x7a, 0x25, 0x61, 0xcf, 0xdc, - 0xaf, 0x5a, 0xde, 0xab, 0xb7, 0x1f, 0xe8, 0xad, 0x2e, 0xc5, 0xa3, 0x17, 0xee, 0xf7, 0xeb, 0x9a, - 0x1f, 0xd0, 0x5f, 0xc0, 0x87, 0xff, 0x3e, 0x03, 0xf2, 0x26, 0x14, 0xee, 0x0b, 0x8f, 0x8c, 0x2c, - 0x3e, 0x2f, 0xdf, 0xe2, 0x7c, 0xd8, 0x24, 0x58, 0xe8, 0x9a, 0x06, 0x72, 0x60, 0xa5, 0x58, 0xe1, - 0x3b, 0x62, 0x01, 0xde, 0x55, 0xe1, 0xa6, 0x5f, 0xf8, 0x4e, 0xb5, 0x42, 0x6a, 0x30, 0xbc, 0x44, - 0x9d, 0xb6, 0x89, 0x1d, 0xe5, 0xcf, 0xd9, 0xbd, 0x99, 0xb0, 0x9d, 0xca, 0x70, 0x27, 0x2c, 0x84, - 0xcc, 0x64, 0x2e, 0xe4, 0x3d, 0x00, 0x6e, 0xa3, 0xec, 0x32, 0x7e, 0xe4, 0x53, 0x68, 0xf7, 0x73, - 0xd3, 0x32, 0xc5, 0xc6, 0x93, 0x98, 0x91, 0x75, 0x18, 0x9f, 0xb7, 0x0d, 0x73, 0xd5, 0xe4, 0xae, - 0x97, 0x58, 0x41, 0x69, 0x67, 0x87, 0x27, 0x66, 0x4a, 0xb6, 0xa5, 0x72, 0x69, 0xd5, 0x24, 0x18, - 0xab, 0xff, 0x59, 0x3f, 0x14, 0x59, 0xb7, 0x9f, 0x8e, 0xdf, 0x83, 0x8c, 0xdf, 0x32, 0x8c, 0x3f, - 0xb4, 0x9d, 0x75, 0xd3, 0x6a, 0x06, 0x5e, 0xf1, 0x62, 0x6f, 0x8a, 0x9e, 0x3c, 0x1b, 0x1c, 0x57, - 0x0f, 0x1c, 0xe8, 0xb5, 0x04, 0xf9, 0x0e, 0x23, 0xf8, 0x75, 0x00, 0xfe, 0xd6, 0x1d, 0x69, 0x06, - 0xc3, 0x60, 0x15, 0xfc, 0x25, 0x3c, 0x3a, 0xda, 0xcb, 0xc1, 0x2a, 0x42, 0x62, 0xb6, 0x09, 0xe7, - 0xbe, 0x10, 0x43, 0xe8, 0x77, 0x8f, 0x9b, 0x70, 0xf4, 0x85, 0x90, 0x8d, 0x00, 0xee, 0x15, 0xb1, - 0x04, 0x20, 0xdd, 0x2f, 0x41, 0x4c, 0x10, 0x91, 0xc9, 0x41, 0x84, 0x87, 0x4b, 0xb9, 0x5e, 0xd2, - 0x24, 0x1e, 0xe4, 0xd5, 0xd8, 0x05, 0x38, 0x89, 0x70, 0xcb, 0xbc, 0xff, 0x0e, 0x1d, 0xa8, 0x46, - 0x76, 0x72, 0xa0, 0x52, 0xbf, 0x96, 0x87, 0xa1, 0x5a, 0x77, 0xc5, 0xdd, 0x74, 0x3d, 0xda, 0x3e, - 0xe6, 0x6a, 0xec, 0x6f, 0xaf, 0x8a, 0xa9, 0xdb, 0xab, 0xe7, 0x7c, 0xa1, 0x48, 0xe7, 0x8e, 0x81, - 0x49, 0xe7, 0x8b, 0xe3, 0x6f, 0xe4, 0x61, 0x9c, 0x5f, 0x9c, 0x55, 0x4c, 0xb7, 0x71, 0x08, 0xce, - 0xfc, 0x47, 0x2f, 0x95, 0x83, 0x5d, 0x36, 0xef, 0xe2, 0x89, 0x84, 0xfa, 0xd5, 0x3c, 0x0c, 0x97, - 0xbb, 0xde, 0x5a, 0xd9, 0x43, 0xdd, 0x3a, 0x91, 0xfb, 0x93, 0xbf, 0x9b, 0x83, 0x33, 0xac, 0x21, - 0xcb, 0xf6, 0x3a, 0xb5, 0x0e, 0xe1, 0xe0, 0x51, 0x3e, 0x40, 0xcc, 0xef, 0xf3, 0x00, 0xd1, 0x97, - 0x65, 0x61, 0x6f, 0xb2, 0xc4, 0xe3, 0x72, 0xcd, 0x6e, 0xd1, 0xe3, 0xfd, 0x19, 0x87, 0x78, 0x5c, - 0xee, 0x0b, 0xe4, 0x10, 0xae, 0x67, 0x3e, 0x5e, 0x02, 0x39, 0x84, 0xb3, 0xa5, 0x8f, 0x87, 0x40, - 0xbe, 0x9b, 0x83, 0xa1, 0x49, 0xdb, 0x3b, 0xe6, 0x03, 0x5f, 0x7c, 0xc5, 0xf1, 0x56, 0x73, 0xff, - 0x2b, 0x8e, 0xb7, 0x6e, 0xaa, 0x3f, 0x97, 0x87, 0xf3, 0x22, 0x36, 0xb8, 0x38, 0x7f, 0x38, 0x9d, - 0x8e, 0xc5, 0x60, 0x4b, 0x8a, 0xe6, 0x74, 0x1e, 0x12, 0xa2, 0xf9, 0xa5, 0x02, 0x9c, 0xc7, 0x50, - 0xa6, 0x6c, 0x5b, 0xf6, 0x31, 0xb0, 0x45, 0x48, 0x23, 0x7a, 0x09, 0x3a, 0x9f, 0x72, 0x09, 0xfa, - 0x2f, 0xb6, 0x26, 0x5e, 0x6d, 0x9a, 0xde, 0x5a, 0x77, 0xe5, 0x46, 0xc3, 0x6e, 0xdf, 0x6c, 0x3a, - 0xfa, 0x23, 0x93, 0x5f, 0xff, 0xe9, 0xad, 0x9b, 0x41, 0x9a, 0x0d, 0xbd, 0x63, 0x8a, 0x04, 0x1c, - 0x35, 0xdc, 0xeb, 0x30, 0xae, 0xfe, 0xf5, 0xa9, 0x0b, 0x70, 0xd7, 0x36, 0x2d, 0xe1, 0x53, 0xc8, - 0x0d, 0xdd, 0x1a, 0xdb, 0x1f, 0xbe, 0x6f, 0x9b, 0x56, 0x3d, 0xee, 0x58, 0xb8, 0xd7, 0xfa, 0x42, - 0xd6, 0x9a, 0x54, 0x8d, 0xfa, 0xdf, 0xe6, 0xe0, 0x89, 0xa8, 0x16, 0x7f, 0x1c, 0x6c, 0xc7, 0x3f, - 0x93, 0x87, 0x0b, 0x77, 0x50, 0x38, 0x81, 0x23, 0xc7, 0xe9, 0xbc, 0x25, 0x06, 0x67, 0x8a, 0x6c, - 0x4e, 0x2d, 0xca, 0x6c, 0xd9, 0x9c, 0x4e, 0xea, 0x42, 0x36, 0xff, 0x4d, 0x0e, 0xce, 0x2d, 0x56, - 0x2b, 0x53, 0x1f, 0x93, 0x11, 0x95, 0xfc, 0x9e, 0x63, 0x6e, 0x70, 0x26, 0xbe, 0xe7, 0x98, 0x9b, - 0x9e, 0xdf, 0xca, 0xc3, 0xb9, 0x5a, 0x79, 0x7e, 0xee, 0xe3, 0x32, 0x83, 0x4f, 0xc9, 0x5e, 0x87, - 0xfe, 0x21, 0x98, 0xb0, 0x05, 0xe4, 0xcf, 0x7c, 0x70, 0x2b, 0xdb, 0x1b, 0x31, 0x29, 0x94, 0x63, - 0x3e, 0x75, 0x1f, 0x8a, 0x50, 0x98, 0xe6, 0x47, 0xa8, 0x8f, 0xb9, 0xe6, 0xff, 0x17, 0x25, 0x18, - 0xbe, 0xd7, 0x5d, 0xa1, 0xc2, 0x39, 0xe5, 0x44, 0x9f, 0xfc, 0xde, 0x82, 0x61, 0x21, 0x06, 0xbc, - 0x35, 0x91, 0x82, 0xe7, 0x89, 0x60, 0x28, 0x3c, 0x3e, 0x91, 0x4c, 0x44, 0xae, 0x40, 0xf1, 0x01, - 0x75, 0x56, 0xe4, 0x77, 0xa5, 0x8f, 0xa8, 0xb3, 0xa2, 0x21, 0x94, 0xcc, 0x85, 0x2e, 0xf3, 0xe5, - 0xa5, 0x2a, 0x26, 0x52, 0x11, 0x17, 0x36, 0x98, 0x19, 0x26, 0xf0, 0x7b, 0xd3, 0x3b, 0x26, 0x4f, - 0xc1, 0x22, 0xbf, 0x69, 0x8f, 0x97, 0x24, 0x0b, 0x70, 0x56, 0x76, 0x7c, 0xe2, 0x59, 0x44, 0x06, - 0x53, 0xd8, 0xa5, 0xe5, 0x0f, 0x49, 0x16, 0x25, 0xef, 0xc0, 0x88, 0x0f, 0x44, 0x17, 0xae, 0xa1, - 0x30, 0x74, 0x7d, 0xc0, 0x2a, 0x96, 0xa2, 0x28, 0x52, 0x40, 0x66, 0x80, 0xd7, 0x10, 0x90, 0xc2, - 0x20, 0xe6, 0x12, 0x17, 0x29, 0x40, 0x5e, 0x41, 0x06, 0xf8, 0xcc, 0x03, 0x9d, 0x55, 0x86, 0xf1, - 0xd1, 0x25, 0xba, 0xe4, 0x3b, 0x02, 0xce, 0x9f, 0xd6, 0x46, 0xc8, 0xc8, 0x22, 0x40, 0xe8, 0x54, - 0x20, 0x02, 0x18, 0xec, 0xd9, 0xdd, 0x41, 0x62, 0x21, 0x5f, 0x07, 0x8e, 0xee, 0xe7, 0x3a, 0x50, - 0xfd, 0x07, 0x79, 0x18, 0x2e, 0x77, 0x3a, 0xc1, 0x50, 0x78, 0x11, 0x4a, 0xe5, 0x4e, 0xe7, 0xbe, - 0x56, 0x95, 0x43, 0x99, 0xeb, 0x9d, 0x4e, 0xbd, 0xeb, 0x98, 0xb2, 0x4f, 0x28, 0x27, 0x22, 0x53, - 0x30, 0x5a, 0xee, 0x74, 0x96, 0xba, 0x2b, 0x2d, 0xb3, 0x21, 0x65, 0x46, 0xe2, 0xb9, 0xe3, 0x3a, - 0x9d, 0x7a, 0x07, 0x31, 0xf1, 0xf4, 0x58, 0xd1, 0x32, 0xe4, 0xcb, 0x18, 0xf6, 0x47, 0x24, 0xe6, - 0xe1, 0xa9, 0x3f, 0xd4, 0x20, 0x88, 0x79, 0xd8, 0xb6, 0x1b, 0x01, 0x11, 0x0f, 0xf6, 0x7e, 0xc5, - 0x0f, 0x99, 0xcf, 0x2a, 0x4a, 0x24, 0xe0, 0x09, 0x59, 0x92, 0xcf, 0xc0, 0x40, 0xb9, 0xd3, 0x91, - 0xee, 0x9b, 0xd0, 0xa9, 0x88, 0x95, 0x8a, 0xe7, 0x3e, 0x13, 0x64, 0x97, 0xdf, 0x82, 0xb1, 0x68, - 0x65, 0x7b, 0x0a, 0x16, 0xff, 0x83, 0x1c, 0x7e, 0xd0, 0x31, 0xf7, 0x69, 0x7e, 0x19, 0x0a, 0xe5, - 0x4e, 0x47, 0xcc, 0x47, 0xe7, 0x52, 0xfa, 0x23, 0xfe, 0x04, 0xba, 0xdc, 0xe9, 0xf8, 0x9f, 0x7e, - 0xcc, 0x1f, 0x47, 0xec, 0xeb, 0xd3, 0xbf, 0xcb, 0x3f, 0xfd, 0x78, 0x3f, 0x5c, 0x50, 0x7f, 0xb3, - 0x00, 0x67, 0xca, 0x9d, 0xce, 0x69, 0x90, 0xf9, 0xc3, 0x7a, 0x68, 0xfd, 0x12, 0x80, 0x34, 0x3d, - 0x0e, 0x04, 0x4f, 0xb7, 0x86, 0xa5, 0xa9, 0x51, 0xc9, 0x69, 0x12, 0x91, 0xaf, 0x7e, 0x83, 0x7b, - 0x52, 0xbf, 0xaf, 0x16, 0x70, 0x2a, 0x3e, 0xee, 0x41, 0xa3, 0x3e, 0x2a, 0xdd, 0x26, 0xfa, 0xa0, - 0xb4, 0xa7, 0x3e, 0xf8, 0x3b, 0x91, 0xc1, 0x83, 0x41, 0xcb, 0x4f, 0x7b, 0xa1, 0xff, 0x40, 0x66, - 0xf1, 0x98, 0x2c, 0x4c, 0x11, 0xc9, 0xc6, 0x4f, 0xa4, 0x24, 0xe2, 0x2a, 0x35, 0x18, 0xaa, 0x6e, - 0x1a, 0x5a, 0x8c, 0xd6, 0xef, 0xc3, 0x81, 0x3d, 0xf5, 0xe1, 0x56, 0x1e, 0xdf, 0x4e, 0x07, 0x71, - 0x99, 0x0e, 0xbe, 0xbb, 0xb8, 0x09, 0xc0, 0x3d, 0x0f, 0x02, 0xb7, 0xe6, 0x51, 0x1e, 0x82, 0x85, - 0xe7, 0x57, 0x12, 0x21, 0x58, 0x42, 0x92, 0xc0, 0x43, 0xaa, 0x90, 0xea, 0x21, 0x75, 0x1d, 0x06, - 0x35, 0x7d, 0xe3, 0xdd, 0x2e, 0x75, 0x36, 0x85, 0x39, 0xc3, 0xc3, 0x1e, 0xea, 0x1b, 0xf5, 0xaf, - 0x30, 0xa0, 0x16, 0xa0, 0x89, 0x1a, 0x3c, 0xbe, 0x97, 0x3c, 0x42, 0xf8, 0x19, 0x79, 0xf0, 0xe4, - 0x7e, 0x3f, 0x8a, 0x4e, 0xde, 0x80, 0x42, 0xf9, 0x61, 0x4d, 0x48, 0x36, 0xe8, 0xda, 0xf2, 0xc3, - 0x9a, 0x90, 0x57, 0x66, 0xd9, 0x87, 0x35, 0xf5, 0xab, 0x79, 0x20, 0x49, 0x4a, 0xf2, 0x2a, 0x0c, - 0x21, 0xb4, 0xc9, 0x74, 0x46, 0x4e, 0xcc, 0xb9, 0xe1, 0xd6, 0x1d, 0x84, 0x46, 0x8c, 0x3b, 0x9f, - 0x94, 0xbc, 0x8e, 0xa9, 0x8f, 0x45, 0x6a, 0xb8, 0x48, 0x62, 0xce, 0x0d, 0xd7, 0x4f, 0x16, 0x1c, - 0xcb, 0x7c, 0x2c, 0x88, 0xd1, 0x2e, 0x7c, 0x58, 0x9b, 0xb5, 0x5d, 0x4f, 0x88, 0x9a, 0xdb, 0x85, - 0x1b, 0x2e, 0x66, 0x84, 0x8d, 0xd8, 0x85, 0x9c, 0x0c, 0xb3, 0x5a, 0x3d, 0xac, 0xf1, 0x67, 0x2a, - 0x86, 0x66, 0xb7, 0x7c, 0x83, 0x92, 0x67, 0xb5, 0xda, 0x70, 0xeb, 0xfc, 0x89, 0x8b, 0x81, 0x39, - 0x97, 0x23, 0x59, 0xad, 0x22, 0xa5, 0xd4, 0xaf, 0x0f, 0xc2, 0x78, 0x45, 0xf7, 0xf4, 0x15, 0xdd, - 0xa5, 0xd2, 0x6e, 0xfa, 0x8c, 0x0f, 0xf3, 0x3f, 0x47, 0x92, 0x83, 0xb1, 0x92, 0xf2, 0x35, 0xf1, - 0x02, 0xe4, 0xcd, 0x90, 0x6f, 0x90, 0x73, 0x54, 0x4e, 0x62, 0xb6, 0x52, 0xef, 0x08, 0xb0, 0x96, - 0x20, 0x24, 0x2f, 0xc0, 0xb0, 0x0f, 0x63, 0x1b, 0x80, 0x42, 0xa8, 0x33, 0xc6, 0x0a, 0xb3, 0xff, - 0x35, 0x19, 0x4d, 0x5e, 0x87, 0x11, 0xff, 0xa7, 0x64, 0x5a, 0xf3, 0x8c, 0x6c, 0x2b, 0x89, 0xdd, - 0x93, 0x4c, 0x2a, 0x17, 0xc5, 0xf9, 0xad, 0x3f, 0x52, 0x34, 0x96, 0xf4, 0x2c, 0x42, 0x4a, 0xbe, - 0x02, 0x63, 0xfe, 0x6f, 0xb1, 0x61, 0xe0, 0xf9, 0xe1, 0x5e, 0x08, 0x52, 0x3a, 0xc7, 0xc4, 0x7a, - 0x23, 0x4a, 0xce, 0xb7, 0x0e, 0x4f, 0xfa, 0x79, 0xbc, 0x8c, 0x95, 0xe4, 0xce, 0x21, 0x56, 0x01, - 0xa9, 0xc2, 0x59, 0x1f, 0x12, 0x6a, 0xe8, 0x40, 0xb8, 0x63, 0x34, 0x56, 0xea, 0xa9, 0x4a, 0x9a, - 0x2c, 0x45, 0x5a, 0x70, 0x25, 0x02, 0x34, 0xdc, 0x35, 0x73, 0xd5, 0x13, 0xdb, 0x3d, 0x11, 0x83, - 0x58, 0x24, 0x6e, 0x0c, 0xb8, 0x72, 0x1a, 0x3f, 0x03, 0x6b, 0x34, 0x3b, 0x54, 0x4f, 0x6e, 0xa4, - 0x06, 0xe7, 0x7d, 0xfc, 0x9d, 0xa9, 0xa5, 0x25, 0xc7, 0x7e, 0x9f, 0x36, 0xbc, 0x6a, 0x45, 0x6c, - 0x97, 0x31, 0x36, 0x9d, 0xb1, 0x52, 0x6f, 0x36, 0x3a, 0x4c, 0x29, 0x18, 0x2e, 0xca, 0x3c, 0xb5, - 0x30, 0x79, 0x00, 0x17, 0x24, 0xb8, 0x94, 0x1e, 0x1a, 0xc2, 0xfd, 0xbc, 0xe0, 0x9a, 0x9e, 0x21, - 0x3a, 0xbd, 0x38, 0x79, 0x0b, 0x46, 0x7d, 0x04, 0xbf, 0x45, 0x1c, 0xc6, 0x5b, 0x44, 0x1c, 0x92, - 0xc6, 0x4a, 0x3d, 0xfe, 0x9a, 0x32, 0x4a, 0x2c, 0x6b, 0x14, 0x66, 0xd4, 0x1f, 0x89, 0x68, 0x94, - 0xb7, 0xd9, 0x49, 0x55, 0x46, 0xcc, 0xb2, 0xff, 0x4e, 0xa8, 0x51, 0x8b, 0x8e, 0xd9, 0x34, 0xf9, - 0x4e, 0xda, 0x7f, 0x40, 0xb9, 0x52, 0xb7, 0x11, 0x98, 0xa6, 0x1f, 0x9c, 0xfc, 0x72, 0x19, 0xce, - 0xa5, 0xe8, 0xd8, 0x9e, 0x76, 0x8c, 0x5f, 0xcb, 0x87, 0x8d, 0x38, 0xe6, 0xdb, 0xc6, 0x49, 0x18, - 0xf4, 0xbf, 0x44, 0x18, 0x0f, 0x4a, 0xd6, 0xd0, 0x8c, 0xf3, 0xf0, 0xf1, 0x11, 0x71, 0x1c, 0xf3, - 0xad, 0xe4, 0x61, 0x88, 0xe3, 0x7b, 0xb9, 0x50, 0x1c, 0xc7, 0x7c, 0x7b, 0xf9, 0x53, 0xc5, 0x70, - 0x4e, 0x3a, 0xdd, 0x63, 0x1e, 0x96, 0x99, 0x1c, 0xfa, 0xc1, 0x96, 0xf6, 0xf0, 0x90, 0x51, 0x56, - 0xcd, 0x81, 0xfd, 0xa9, 0x26, 0x79, 0x0b, 0x86, 0x97, 0x6c, 0xd7, 0x6b, 0x3a, 0xd4, 0x5d, 0x0a, - 0x62, 0xe8, 0xe3, 0x23, 0xd8, 0x8e, 0x00, 0xd7, 0x3b, 0x91, 0xd9, 0x5f, 0x26, 0x57, 0xff, 0x51, - 0x21, 0xa1, 0x0d, 0xdc, 0x70, 0x3d, 0x96, 0xda, 0x70, 0x08, 0x43, 0x9d, 0xdc, 0x0a, 0x57, 0x41, - 0x6e, 0xe1, 0xf7, 0x4b, 0x01, 0x02, 0x57, 0x84, 0x81, 0x1f, 0x25, 0x21, 0x3f, 0x04, 0x97, 0x22, - 0x80, 0x25, 0xdd, 0xd1, 0xdb, 0xd4, 0x0b, 0xf3, 0x15, 0x62, 0xc8, 0x27, 0xbf, 0x74, 0xbd, 0x13, - 0xa0, 0xe5, 0x1c, 0x88, 0x19, 0x1c, 0x24, 0xd5, 0x1a, 0xd8, 0x83, 0x8b, 0xf5, 0xcf, 0x16, 0x42, - 0x43, 0x27, 0x1a, 0xba, 0x55, 0xa3, 0x6e, 0xb7, 0xe5, 0x9d, 0xdc, 0x0e, 0xde, 0x5f, 0x62, 0x8c, - 0x59, 0x38, 0x53, 0x5e, 0x5d, 0xa5, 0x0d, 0xcf, 0x8f, 0x48, 0xed, 0x8a, 0x60, 0x7d, 0x7c, 0xe3, - 0x21, 0x50, 0x22, 0xc2, 0x70, 0x24, 0xb3, 0x7e, 0xac, 0x98, 0xfa, 0x8f, 0x8b, 0xa0, 0x04, 0x86, - 0x7f, 0xf0, 0xcc, 0xeb, 0x08, 0x17, 0xd9, 0x8f, 0x44, 0xaf, 0x98, 0x70, 0x36, 0x14, 0x46, 0xad, - 0xdb, 0x6e, 0xeb, 0x38, 0xf4, 0xd8, 0xc6, 0x62, 0x22, 0xce, 0x2c, 0x24, 0xe4, 0x7b, 0x89, 0xcb, - 0x62, 0x2f, 0x41, 0xc2, 0x67, 0x74, 0x75, 0x97, 0xb3, 0xd0, 0x92, 0x5c, 0xc9, 0x37, 0x72, 0x70, - 0xde, 0xef, 0x94, 0xc5, 0x15, 0x66, 0x54, 0x4f, 0xd9, 0x5d, 0xcb, 0xf3, 0xf7, 0x31, 0x6f, 0x64, - 0x57, 0xc7, 0x3b, 0xe9, 0x46, 0x5a, 0x61, 0xde, 0x92, 0x20, 0x2c, 0x45, 0xa0, 0x10, 0x36, 0xd2, - 0xd4, 0x1b, 0x48, 0xa4, 0xa5, 0xd6, 0x7b, 0xf9, 0x0e, 0x3c, 0x91, 0xc9, 0x72, 0x27, 0x23, 0xb6, - 0x5f, 0x36, 0x62, 0xff, 0xfb, 0x5c, 0x38, 0x11, 0xc5, 0x84, 0x44, 0x6e, 0x00, 0x84, 0x20, 0xb1, - 0xad, 0x1d, 0xdb, 0xde, 0x9a, 0x80, 0x50, 0x68, 0x9a, 0x44, 0x41, 0x16, 0xa1, 0x24, 0xc4, 0xc2, - 0x73, 0x03, 0x7f, 0x7a, 0x87, 0x5e, 0xb8, 0x21, 0xcb, 0x01, 0xb7, 0xac, 0xe2, 0x9b, 0x05, 0x9b, - 0xcb, 0xaf, 0xc3, 0xf0, 0x7e, 0xbf, 0xeb, 0x1b, 0x05, 0x20, 0xf2, 0x1e, 0xf4, 0x08, 0x0d, 0xf4, - 0x63, 0x3c, 0x85, 0x5d, 0x83, 0x41, 0xf6, 0x09, 0x98, 0x2d, 0x43, 0x8a, 0x8e, 0xdb, 0x15, 0x30, - 0x2d, 0xc0, 0x86, 0xa1, 0xa9, 0x06, 0xd2, 0x43, 0x53, 0xa9, 0x3f, 0x53, 0x80, 0x8b, 0x72, 0x87, - 0x54, 0x28, 0x06, 0xdc, 0x3f, 0xed, 0x94, 0x0f, 0xb1, 0x53, 0x54, 0x28, 0xf1, 0xad, 0x87, 0xc8, - 0x7c, 0xc0, 0x8f, 0x85, 0x10, 0xa2, 0x09, 0x8c, 0xfa, 0xbf, 0xe4, 0x61, 0x34, 0x30, 0xef, 0x74, - 0xc7, 0x3d, 0xc1, 0xdd, 0xf1, 0x59, 0x18, 0xc5, 0xe0, 0x42, 0x6d, 0x6a, 0xf1, 0x00, 0x3c, 0xfd, + 0x72, 0x18, 0x86, 0x7e, 0xa0, 0xd1, 0x08, 0x3c, 0x06, 0x93, 0xf3, 0xaa, 0x99, 0x9d, 0x5d, 0xec, + 0xd6, 0xde, 0xcd, 0xcd, 0xec, 0xed, 0xce, 0xdc, 0xce, 0xce, 0xee, 0xde, 0xbe, 0x6e, 0xaf, 0x81, + 0x06, 0x06, 0x3d, 0x83, 0xd7, 0x56, 0x63, 0x66, 0x6e, 0x8f, 0xbc, 0x6b, 0x16, 0xba, 0x12, 0x40, + 0xed, 0x74, 0x57, 0x35, 0xab, 0xaa, 0x07, 0x83, 0xf5, 0x8b, 0x27, 0x53, 0x14, 0x29, 0xee, 0x9d, + 0xce, 0x47, 0x53, 0xa4, 0x44, 0xd9, 0x22, 0xf5, 0xb0, 0x29, 0x9a, 0x22, 0x45, 0x89, 0x26, 0x79, + 0x24, 0xcf, 0x96, 0x7c, 0x7e, 0xac, 0xc4, 0xcf, 0xfc, 0x24, 0xd9, 0xd6, 0xa7, 0xcf, 0x96, 0x71, + 0x32, 0x6d, 0xfd, 0xc1, 0x67, 0x7f, 0x1f, 0x6d, 0xdf, 0x67, 0x9d, 0x65, 0xd9, 0x9f, 0xbf, 0x8c, + 0xcc, 0xaa, 0xca, 0x7a, 0x35, 0x9e, 0x2b, 0x2c, 0x16, 0xf8, 0x33, 0x83, 0x8e, 0x88, 0x8c, 0xcc, + 0x8a, 0x8c, 0xcc, 0x8c, 0xcc, 0x8c, 0x8c, 0x80, 0x6b, 0x1e, 0x6d, 0xd1, 0x8e, 0xed, 0x78, 0x37, + 0x5a, 0x74, 0x55, 0x6f, 0x6e, 0xdc, 0xf0, 0x36, 0x3a, 0xd4, 0xbd, 0x41, 0x1f, 0x51, 0xcb, 0xf3, + 0xff, 0xbb, 0xde, 0x71, 0x6c, 0xcf, 0x26, 0x25, 0xfe, 0xeb, 0xd2, 0xd9, 0x55, 0x7b, 0xd5, 0x46, + 0xd0, 0x0d, 0xf6, 0x17, 0xc7, 0x5e, 0xba, 0xbc, 0x6a, 0xdb, 0xab, 0x2d, 0x7a, 0x03, 0x7f, 0x2d, + 0x77, 0x57, 0x6e, 0xb8, 0x9e, 0xd3, 0x6d, 0x7a, 0x02, 0x3b, 0x1e, 0xc7, 0x7a, 0x66, 0x9b, 0xba, + 0x9e, 0xde, 0xee, 0x08, 0x82, 0xa7, 0xe2, 0x04, 0xeb, 0x8e, 0xde, 0xe9, 0x50, 0x47, 0x54, 0x7e, + 0xe9, 0x99, 0xf4, 0x76, 0xe2, 0xbf, 0x82, 0xe4, 0x85, 0x74, 0x12, 0x9f, 0x51, 0x8c, 0xa3, 0xfa, + 0xad, 0x3c, 0x94, 0xe7, 0xa8, 0xa7, 0x1b, 0xba, 0xa7, 0x93, 0xcb, 0xd0, 0x5f, 0xb3, 0x0c, 0xfa, + 0x58, 0xc9, 0x3d, 0x9d, 0xbb, 0x5a, 0x98, 0x28, 0x6d, 0x6d, 0x8e, 0xe7, 0xa9, 0xa9, 0x71, 0x20, + 0x79, 0x12, 0x8a, 0x4b, 0x1b, 0x1d, 0xaa, 0xe4, 0x9f, 0xce, 0x5d, 0x1d, 0x9c, 0x18, 0xdc, 0xda, + 0x1c, 0xef, 0x47, 0x59, 0x68, 0x08, 0x26, 0xcf, 0x40, 0xbe, 0x56, 0x55, 0x0a, 0x88, 0x3c, 0xbd, + 0xb5, 0x39, 0x3e, 0xd2, 0x35, 0x8d, 0xe7, 0xed, 0xb6, 0xe9, 0xd1, 0x76, 0xc7, 0xdb, 0xd0, 0xf2, + 0xb5, 0x2a, 0xb9, 0x02, 0xc5, 0x49, 0xdb, 0xa0, 0x4a, 0x11, 0x89, 0xc8, 0xd6, 0xe6, 0xf8, 0x68, + 0xd3, 0x36, 0xa8, 0x44, 0x85, 0x78, 0xf2, 0x45, 0x28, 0x2e, 0x99, 0x6d, 0xaa, 0xf4, 0x3f, 0x9d, + 0xbb, 0x3a, 0x74, 0xf3, 0xd2, 0x75, 0x2e, 0x95, 0xeb, 0xbe, 0x54, 0xae, 0x2f, 0xf9, 0x62, 0x9b, + 0x18, 0xfb, 0x70, 0x73, 0xbc, 0x6f, 0x6b, 0x73, 0xbc, 0xc8, 0x24, 0xf9, 0xcd, 0xef, 0x8d, 0xe7, + 0x34, 0x2c, 0x49, 0xde, 0x84, 0xa1, 0xc9, 0x56, 0xd7, 0xf5, 0xa8, 0x33, 0xaf, 0xb7, 0xa9, 0x52, + 0xc2, 0x0a, 0x2f, 0x6d, 0x6d, 0x8e, 0x9f, 0x6f, 0x72, 0x70, 0xc3, 0xd2, 0xdb, 0x72, 0xc5, 0x32, + 0xb9, 0xfa, 0x3b, 0x39, 0x38, 0x55, 0xa7, 0xae, 0x6b, 0xda, 0x56, 0x20, 0x9b, 0x4f, 0xc3, 0xa0, + 0x00, 0xd5, 0xaa, 0x28, 0x9f, 0xc1, 0x89, 0x81, 0xad, 0xcd, 0xf1, 0x82, 0x6b, 0x1a, 0x5a, 0x88, + 0x21, 0x9f, 0x83, 0x81, 0x07, 0xa6, 0xb7, 0x36, 0x37, 0x5d, 0x11, 0x72, 0x3a, 0xbf, 0xb5, 0x39, + 0x4e, 0xd6, 0x4d, 0x6f, 0xad, 0xd1, 0x5e, 0xd1, 0xa5, 0x0a, 0x7d, 0x32, 0x32, 0x0b, 0x63, 0x8b, + 0x8e, 0xf9, 0x48, 0xf7, 0xe8, 0x5d, 0xba, 0xb1, 0x68, 0xb7, 0xcc, 0xe6, 0x86, 0x90, 0xe2, 0xd3, + 0x5b, 0x9b, 0xe3, 0x97, 0x3b, 0x1c, 0xd7, 0x78, 0x48, 0x37, 0x1a, 0x1d, 0xc4, 0x4a, 0x4c, 0x12, + 0x25, 0xd5, 0xdf, 0x2d, 0xc1, 0xf0, 0x3d, 0x97, 0x3a, 0x41, 0xbb, 0xaf, 0x40, 0x91, 0xfd, 0x16, + 0x4d, 0x46, 0x99, 0x77, 0x5d, 0xea, 0xc8, 0x32, 0x67, 0x78, 0x72, 0x0d, 0xfa, 0x67, 0xed, 0x55, + 0xd3, 0x12, 0xcd, 0x3e, 0xb3, 0xb5, 0x39, 0x7e, 0xaa, 0xc5, 0x00, 0x12, 0x25, 0xa7, 0x20, 0x5f, + 0x80, 0xe1, 0x5a, 0x9b, 0xe9, 0x90, 0x6d, 0xe9, 0x9e, 0xed, 0x88, 0xd6, 0xa2, 0x74, 0x4d, 0x09, + 0x2e, 0x15, 0x8c, 0xd0, 0x93, 0xd7, 0x01, 0x2a, 0x0f, 0xea, 0x9a, 0xdd, 0xa2, 0x15, 0x6d, 0x5e, + 0x28, 0x03, 0x96, 0xd6, 0xd7, 0xdd, 0x86, 0x63, 0xb7, 0x68, 0x43, 0x77, 0xe4, 0x6a, 0x25, 0x6a, + 0x32, 0x05, 0xa3, 0x95, 0x66, 0x93, 0xba, 0xae, 0x46, 0x7f, 0xb4, 0x4b, 0x5d, 0xcf, 0x55, 0xfa, + 0x9f, 0x2e, 0x5c, 0x1d, 0x9c, 0x78, 0x72, 0x6b, 0x73, 0xfc, 0xa2, 0x8e, 0x98, 0x86, 0x23, 0x50, + 0x12, 0x8b, 0x58, 0x21, 0x32, 0x01, 0x23, 0x95, 0xf7, 0xbb, 0x0e, 0xad, 0x19, 0xd4, 0xf2, 0x4c, + 0x6f, 0x43, 0x68, 0xc8, 0xe5, 0xad, 0xcd, 0x71, 0x45, 0x67, 0x88, 0x86, 0x29, 0x30, 0x12, 0x93, + 0x68, 0x11, 0xb2, 0x00, 0xa7, 0x6f, 0x4f, 0x2e, 0xd6, 0xa9, 0xf3, 0xc8, 0x6c, 0xd2, 0x4a, 0xb3, + 0x69, 0x77, 0x2d, 0x4f, 0x19, 0x40, 0x3e, 0xcf, 0x6c, 0x6d, 0x8e, 0x3f, 0xb9, 0xda, 0xec, 0x34, + 0x5c, 0x8e, 0x6d, 0xe8, 0x1c, 0x2d, 0x31, 0x4b, 0x96, 0x25, 0x5f, 0x86, 0x91, 0x25, 0x87, 0x69, + 0xa1, 0x51, 0xa5, 0x0c, 0xae, 0x94, 0x51, 0xff, 0xcf, 0x5f, 0x17, 0x13, 0x10, 0x87, 0xfa, 0x3d, + 0xcb, 0x1b, 0xeb, 0xf1, 0x02, 0x0d, 0x03, 0x71, 0x72, 0x63, 0x23, 0xac, 0x08, 0x05, 0x85, 0x7d, + 0xbc, 0xe9, 0x50, 0x23, 0xa1, 0x6d, 0x83, 0xd8, 0xe6, 0x6b, 0x5b, 0x9b, 0xe3, 0x9f, 0x76, 0x04, + 0x4d, 0xa3, 0xa7, 0xda, 0x65, 0xb2, 0x22, 0x53, 0x50, 0x66, 0xda, 0x74, 0xd7, 0xb4, 0x0c, 0x05, + 0x9e, 0xce, 0x5d, 0x1d, 0xbd, 0x39, 0xe6, 0xb7, 0xde, 0x87, 0x4f, 0x5c, 0xd8, 0xda, 0x1c, 0x3f, + 0xc3, 0x74, 0xb0, 0xf1, 0xd0, 0xb4, 0xe4, 0x29, 0x22, 0x28, 0xca, 0x46, 0xd1, 0x84, 0xed, 0xe1, + 0xd0, 0x1d, 0x0a, 0x47, 0xd1, 0xb2, 0xed, 0xc5, 0x87, 0xad, 0x4f, 0x46, 0x26, 0x61, 0x64, 0xc2, + 0xf6, 0x6a, 0x96, 0xeb, 0xe9, 0x56, 0x93, 0xd6, 0xaa, 0xca, 0x30, 0x96, 0x43, 0xb5, 0x60, 0xe5, + 0x4c, 0x81, 0x69, 0x44, 0x26, 0xa5, 0x68, 0x19, 0xf5, 0x9f, 0x17, 0x61, 0x94, 0xf5, 0x89, 0x34, + 0x7c, 0x2a, 0x6c, 0x26, 0x60, 0x10, 0x56, 0x8b, 0xdb, 0xd1, 0x9b, 0x54, 0x8c, 0x24, 0xfc, 0x0a, + 0xcb, 0x07, 0x4a, 0x3c, 0xe3, 0xf4, 0xe4, 0x1a, 0x94, 0x39, 0xa8, 0x56, 0x15, 0x83, 0x6b, 0x64, + 0x6b, 0x73, 0x7c, 0xd0, 0x45, 0x58, 0xc3, 0x34, 0xb4, 0x00, 0xcd, 0xb4, 0x9b, 0xff, 0x3d, 0x63, + 0xbb, 0x1e, 0x63, 0x2e, 0xc6, 0x16, 0x7e, 0x86, 0x28, 0xb0, 0x26, 0x50, 0xb2, 0x76, 0x47, 0x0b, + 0x91, 0xd7, 0x00, 0x38, 0xa4, 0x62, 0x18, 0x8e, 0x18, 0x60, 0x17, 0xb7, 0x36, 0xc7, 0xcf, 0x09, + 0x16, 0xba, 0x61, 0xc8, 0xa3, 0x53, 0x22, 0x26, 0x6d, 0x18, 0xe6, 0xbf, 0x66, 0xf5, 0x65, 0xda, + 0xe2, 0xa3, 0x6b, 0xe8, 0xe6, 0x55, 0xbf, 0x13, 0xa3, 0xd2, 0xb9, 0x2e, 0x93, 0x4e, 0x59, 0x9e, + 0xb3, 0x31, 0x31, 0x2e, 0x26, 0xe4, 0x0b, 0xa2, 0xaa, 0x16, 0xe2, 0xe4, 0xa9, 0x40, 0x2e, 0xc3, + 0xe6, 0xe9, 0x69, 0xdb, 0x59, 0xd7, 0x1d, 0x83, 0x1a, 0x13, 0x1b, 0xf2, 0x3c, 0xbd, 0xe2, 0x83, + 0x1b, 0xcb, 0xb2, 0xea, 0xc9, 0xe4, 0xac, 0xd3, 0x39, 0xb7, 0x7a, 0x77, 0x19, 0x55, 0x6e, 0x20, + 0x21, 0x2d, 0xb7, 0xbb, 0x1c, 0x57, 0xb3, 0x68, 0x19, 0x36, 0x15, 0x70, 0xc0, 0x7d, 0xea, 0xb0, + 0x49, 0x1c, 0x47, 0x9d, 0x98, 0x0a, 0x04, 0x93, 0x47, 0x1c, 0x93, 0xe4, 0x21, 0x8a, 0x5c, 0x7a, + 0x1b, 0x4e, 0x27, 0x44, 0x41, 0xc6, 0xa0, 0xf0, 0x90, 0x6e, 0x70, 0x75, 0xd1, 0xd8, 0x9f, 0xe4, + 0x2c, 0xf4, 0x3f, 0xd2, 0x5b, 0x5d, 0xb1, 0x84, 0x6a, 0xfc, 0xc7, 0xeb, 0xf9, 0xcf, 0xe7, 0xd8, + 0x8a, 0x43, 0x26, 0x6d, 0xcb, 0xa2, 0x4d, 0x4f, 0x5e, 0x74, 0x5e, 0x81, 0xc1, 0x59, 0xbb, 0xa9, + 0xb7, 0xb0, 0x1f, 0xb9, 0xde, 0x29, 0x5b, 0x9b, 0xe3, 0x67, 0x59, 0x07, 0x5e, 0x6f, 0x31, 0x8c, + 0xd4, 0xa6, 0x90, 0x94, 0x29, 0x80, 0x46, 0xdb, 0xb6, 0x47, 0xb1, 0x60, 0x3e, 0x54, 0x00, 0x2c, + 0xe8, 0x20, 0x4a, 0x56, 0x80, 0x90, 0x98, 0xdc, 0x80, 0xf2, 0x22, 0x5b, 0x67, 0x9b, 0x76, 0x4b, + 0x28, 0x1f, 0x2e, 0x05, 0xb8, 0xf6, 0xca, 0x63, 0xd5, 0x27, 0x52, 0x67, 0x60, 0x74, 0xb2, 0x65, + 0x52, 0xcb, 0x93, 0x5b, 0xcd, 0x46, 0x72, 0x65, 0x95, 0x5a, 0x9e, 0xdc, 0x6a, 0x1c, 0xf3, 0x3a, + 0x83, 0xca, 0xad, 0x0e, 0x48, 0xd5, 0x3f, 0x2c, 0xc0, 0xc5, 0xbb, 0xdd, 0x65, 0xea, 0x58, 0xd4, + 0xa3, 0xae, 0x58, 0x90, 0x03, 0xae, 0xf3, 0x70, 0x3a, 0x81, 0x14, 0xdc, 0x71, 0xa1, 0x7c, 0x18, + 0x20, 0x1b, 0x62, 0x8d, 0x97, 0x67, 0xdb, 0x44, 0x51, 0x32, 0x03, 0xa7, 0x42, 0x20, 0x6b, 0x84, + 0xab, 0xe4, 0x71, 0x29, 0x79, 0x6a, 0x6b, 0x73, 0xfc, 0x92, 0xc4, 0x8d, 0x35, 0x5b, 0xd6, 0xe0, + 0x78, 0x31, 0x72, 0x17, 0xc6, 0x42, 0xd0, 0x6d, 0xc7, 0xee, 0x76, 0x5c, 0xa5, 0x80, 0xac, 0xc6, + 0xb7, 0x36, 0xc7, 0x9f, 0x90, 0x58, 0xad, 0x22, 0x52, 0x5e, 0xc0, 0xe3, 0x05, 0xc9, 0x8f, 0xe7, + 0x64, 0x6e, 0x62, 0x14, 0x16, 0x71, 0x14, 0xbe, 0xea, 0x8f, 0xc2, 0x4c, 0x21, 0x5d, 0x8f, 0x97, + 0x14, 0x83, 0x32, 0xd6, 0x8c, 0xc4, 0xa0, 0x4c, 0xd4, 0x78, 0x69, 0x12, 0xce, 0xa5, 0xf2, 0xda, + 0x95, 0x56, 0xff, 0xb3, 0x82, 0xcc, 0x65, 0xd1, 0x36, 0x82, 0xce, 0x5c, 0x90, 0x3b, 0x73, 0xd1, + 0x36, 0x70, 0xaa, 0xcf, 0x85, 0x6b, 0xa7, 0xd4, 0xd8, 0x8e, 0x6d, 0xc4, 0x67, 0xfd, 0x64, 0x59, + 0xf2, 0x55, 0x38, 0x9f, 0x00, 0xf2, 0xe9, 0x9a, 0x6b, 0xff, 0x95, 0xad, 0xcd, 0x71, 0x35, 0x85, + 0x6b, 0x7c, 0xf6, 0xce, 0xe0, 0x42, 0x74, 0xb8, 0x20, 0x49, 0xdd, 0xb6, 0x3c, 0xdd, 0xb4, 0x84, + 0x71, 0xc9, 0x47, 0xc9, 0x67, 0xb6, 0x36, 0xc7, 0x9f, 0x95, 0x75, 0xd0, 0xa7, 0x89, 0x37, 0x3e, + 0x8b, 0x0f, 0x31, 0x40, 0x49, 0x41, 0xd5, 0xda, 0xfa, 0xaa, 0x6f, 0x31, 0x5f, 0xdd, 0xda, 0x1c, + 0xff, 0x54, 0x6a, 0x1d, 0x26, 0xa3, 0x92, 0x57, 0xe8, 0x2c, 0x4e, 0x44, 0x03, 0x12, 0xe2, 0xe6, + 0x6d, 0x83, 0xe2, 0x37, 0xf4, 0x23, 0x7f, 0x75, 0x6b, 0x73, 0xfc, 0x29, 0x89, 0xbf, 0x65, 0x1b, + 0x34, 0xde, 0xfc, 0x94, 0xd2, 0xea, 0xef, 0x14, 0xe0, 0xa9, 0x7a, 0x65, 0x6e, 0xb6, 0x66, 0xf8, + 0x26, 0xcd, 0xa2, 0x63, 0x3f, 0x32, 0x0d, 0x69, 0xf4, 0x2e, 0xc3, 0x85, 0x18, 0x6a, 0x0a, 0xad, + 0xa8, 0xc0, 0x98, 0xc6, 0x6f, 0xf3, 0xcd, 0xa5, 0x8e, 0xa0, 0x69, 0x70, 0x53, 0x2b, 0xba, 0x68, + 0x67, 0x31, 0x62, 0x7d, 0x14, 0x43, 0xd5, 0xd7, 0x6c, 0xc7, 0x6b, 0x76, 0x3d, 0xa1, 0x04, 0xd8, + 0x47, 0x89, 0x3a, 0x5c, 0x41, 0xd4, 0xa3, 0x0a, 0x9f, 0x0f, 0xf9, 0xa9, 0x1c, 0x8c, 0x55, 0x3c, + 0xcf, 0x31, 0x97, 0xbb, 0x1e, 0x9d, 0xd3, 0x3b, 0x1d, 0xd3, 0x5a, 0xc5, 0xb1, 0x3e, 0x74, 0xf3, + 0xcd, 0x60, 0x8d, 0xec, 0x29, 0x89, 0xeb, 0xf1, 0xe2, 0xd2, 0x10, 0xd5, 0x7d, 0x54, 0xa3, 0xcd, + 0x71, 0xf2, 0x10, 0x8d, 0x97, 0x63, 0x43, 0x34, 0x95, 0xd7, 0xae, 0x86, 0xe8, 0xb7, 0x0a, 0x70, + 0x79, 0xe1, 0xa1, 0xa7, 0x6b, 0xd4, 0xb5, 0xbb, 0x4e, 0x93, 0xba, 0xf7, 0x3a, 0x86, 0xee, 0xd1, + 0x70, 0xa4, 0x8e, 0x43, 0x7f, 0xc5, 0x30, 0xa8, 0x81, 0xec, 0xfa, 0xf9, 0xb6, 0x4f, 0x67, 0x00, + 0x8d, 0xc3, 0xc9, 0xa7, 0x61, 0x40, 0x94, 0x41, 0xee, 0xfd, 0x13, 0x43, 0x5b, 0x9b, 0xe3, 0x03, + 0x5d, 0x0e, 0xd2, 0x7c, 0x1c, 0x23, 0xab, 0xd2, 0x16, 0x65, 0x64, 0x85, 0x90, 0xcc, 0xe0, 0x20, + 0xcd, 0xc7, 0x91, 0x77, 0x60, 0x14, 0xd9, 0x06, 0xed, 0x11, 0x73, 0xdf, 0x59, 0x5f, 0xba, 0x72, + 0x63, 0xf9, 0xd2, 0x84, 0xad, 0x69, 0x38, 0x7e, 0x01, 0x2d, 0xc6, 0x80, 0x3c, 0x80, 0x31, 0xd1, + 0x88, 0x90, 0x69, 0x7f, 0x0f, 0xa6, 0xe7, 0xb6, 0x36, 0xc7, 0x4f, 0x8b, 0xf6, 0x4b, 0x6c, 0x13, + 0x4c, 0x18, 0x63, 0xd1, 0xec, 0x90, 0x71, 0x69, 0x3b, 0xc6, 0xe2, 0x8b, 0x65, 0xc6, 0x71, 0x26, + 0xea, 0xbb, 0x30, 0x2c, 0x17, 0x24, 0xe7, 0x71, 0x6b, 0xcd, 0xc7, 0x09, 0x6e, 0xca, 0x4d, 0x03, + 0xf7, 0xd3, 0x2f, 0xc2, 0x50, 0x95, 0xba, 0x4d, 0xc7, 0xec, 0x30, 0xab, 0x41, 0x28, 0xf9, 0xa9, + 0xad, 0xcd, 0xf1, 0x21, 0x23, 0x04, 0x6b, 0x32, 0x8d, 0xfa, 0x7f, 0xe5, 0xe0, 0x3c, 0xe3, 0x5d, + 0x71, 0x5d, 0x73, 0xd5, 0x6a, 0xcb, 0xcb, 0xf6, 0xf3, 0x50, 0xaa, 0x63, 0x7d, 0xa2, 0xa6, 0xb3, + 0x5b, 0x9b, 0xe3, 0x63, 0xbc, 0x05, 0x92, 0x1e, 0x0a, 0x9a, 0x60, 0x5f, 0x99, 0xdf, 0x66, 0x5f, + 0xc9, 0x4c, 0x5a, 0x4f, 0x77, 0x3c, 0xd3, 0x5a, 0xad, 0x7b, 0xba, 0xd7, 0x75, 0x23, 0x26, 0xad, + 0xc0, 0x34, 0x5c, 0x44, 0x45, 0x4c, 0xda, 0x48, 0x21, 0xf2, 0x36, 0x0c, 0x4f, 0x59, 0x46, 0xc8, + 0x84, 0x4f, 0x88, 0x4f, 0x30, 0x4b, 0x93, 0x22, 0x3c, 0xc9, 0x22, 0x52, 0x40, 0xfd, 0xeb, 0x39, + 0x50, 0xf8, 0x26, 0x70, 0xd6, 0x74, 0xbd, 0x39, 0xda, 0x5e, 0x96, 0x66, 0xa7, 0x69, 0x7f, 0x57, + 0xc9, 0x70, 0xd2, 0x5a, 0x84, 0xa6, 0x80, 0xd8, 0x55, 0xb6, 0x4c, 0x37, 0xb1, 0xfd, 0x88, 0x95, + 0x22, 0x35, 0x18, 0xe0, 0x9c, 0xb9, 0x2d, 0x31, 0x74, 0x53, 0xf1, 0x15, 0x21, 0x5e, 0x35, 0x57, + 0x86, 0x36, 0x27, 0x96, 0x37, 0x34, 0xa2, 0xbc, 0xfa, 0x37, 0xf2, 0x30, 0x16, 0x2f, 0x44, 0x1e, + 0x40, 0xf9, 0x8e, 0x6d, 0x5a, 0xd4, 0x58, 0xb0, 0xb0, 0x85, 0xbd, 0x0f, 0x47, 0x7c, 0x5b, 0xfc, + 0xcc, 0x7b, 0x58, 0xa6, 0x21, 0x5b, 0xb0, 0x78, 0x56, 0x12, 0x30, 0x23, 0x5f, 0x86, 0x41, 0x66, + 0x03, 0x3e, 0x42, 0xce, 0xf9, 0x6d, 0x39, 0x3f, 0x2d, 0x38, 0x9f, 0x75, 0x78, 0xa1, 0x24, 0xeb, + 0x90, 0x1d, 0xd3, 0x2b, 0x8d, 0xea, 0xae, 0x6d, 0x89, 0x9e, 0x47, 0xbd, 0x72, 0x10, 0x22, 0xeb, + 0x15, 0xa7, 0x61, 0xa6, 0x2b, 0xff, 0x58, 0xec, 0x06, 0x69, 0xef, 0xc2, 0x65, 0x15, 0xef, 0x01, + 0x89, 0x58, 0xfd, 0x89, 0x3c, 0xbc, 0x10, 0x8a, 0x4c, 0xa3, 0x8f, 0x4c, 0xba, 0x2e, 0xc4, 0xb9, + 0x66, 0x76, 0xc4, 0x9e, 0x95, 0xa9, 0xbc, 0x3b, 0xb9, 0xa6, 0x5b, 0xab, 0xd4, 0x20, 0xd7, 0xa0, + 0x5f, 0xb3, 0x5b, 0xd4, 0x55, 0x72, 0x68, 0xae, 0xe1, 0x74, 0xe2, 0x30, 0x80, 0x7c, 0xe8, 0x81, + 0x14, 0xc4, 0x86, 0xd2, 0x92, 0xa3, 0x9b, 0x9e, 0xdf, 0xb3, 0x95, 0x64, 0xcf, 0xee, 0xa0, 0xc6, + 0xeb, 0x9c, 0x07, 0x9f, 0xf3, 0x51, 0x10, 0x1e, 0x02, 0x64, 0x41, 0x70, 0x92, 0x4b, 0xaf, 0xc1, + 0x90, 0x44, 0xbc, 0xab, 0x49, 0xfd, 0xdb, 0x45, 0x59, 0xd7, 0xfd, 0x66, 0x09, 0x5d, 0xbf, 0xc1, + 0x74, 0xd4, 0x75, 0x99, 0x55, 0xc1, 0x95, 0x5c, 0x68, 0x22, 0x82, 0xa2, 0x9a, 0x88, 0x20, 0xf2, + 0x12, 0x94, 0x39, 0x8b, 0x60, 0xff, 0x8a, 0x7b, 0x5f, 0x07, 0x61, 0xd1, 0xa5, 0x39, 0x20, 0x24, + 0xbf, 0x92, 0x83, 0x27, 0x7b, 0x4a, 0x02, 0x95, 0x61, 0xe8, 0xe6, 0xcb, 0x7b, 0x12, 0xe3, 0xc4, + 0x0b, 0x5b, 0x9b, 0xe3, 0xd7, 0xda, 0x01, 0x49, 0xc3, 0x91, 0x68, 0x1a, 0x4d, 0x4e, 0x24, 0xb5, + 0xab, 0x77, 0x53, 0x98, 0xf1, 0xc8, 0x2b, 0x9d, 0xc6, 0xa3, 0x23, 0xab, 0xb9, 0xe1, 0x37, 0xb2, + 0x18, 0x1a, 0x8f, 0xe2, 0x7b, 0x57, 0x7c, 0x92, 0x94, 0x6a, 0x32, 0xb8, 0x90, 0x26, 0x5c, 0xe0, + 0x98, 0xaa, 0xbe, 0xb1, 0xb0, 0x32, 0x67, 0x5b, 0xde, 0x9a, 0x5f, 0x41, 0xbf, 0x7c, 0xf6, 0x82, + 0x15, 0x18, 0xfa, 0x46, 0xc3, 0x5e, 0x69, 0xb4, 0x19, 0x55, 0x4a, 0x1d, 0x59, 0x9c, 0xd8, 0x44, + 0x2b, 0xc6, 0x9c, 0x3f, 0x05, 0x95, 0xc2, 0x93, 0x31, 0x7f, 0x9c, 0x26, 0x27, 0x9c, 0x58, 0x21, + 0xb5, 0x06, 0xc3, 0xb3, 0x76, 0xf3, 0x61, 0xa0, 0x2e, 0xaf, 0x41, 0x69, 0x49, 0x77, 0x56, 0xa9, + 0x87, 0xb2, 0x18, 0xba, 0x79, 0xfa, 0x3a, 0x3f, 0x6d, 0x66, 0x44, 0x1c, 0x31, 0x31, 0x2a, 0x66, + 0x83, 0x92, 0x87, 0xbf, 0x35, 0x51, 0x40, 0xfd, 0x5e, 0x3f, 0x0c, 0x8b, 0x93, 0x51, 0x9c, 0xcd, + 0xc9, 0xeb, 0xe1, 0x59, 0xb3, 0x98, 0xbe, 0x82, 0xd3, 0xa1, 0xe0, 0x54, 0x6b, 0x98, 0x31, 0xfb, + 0xfb, 0x9b, 0xe3, 0xb9, 0xad, 0xcd, 0xf1, 0x3e, 0xad, 0x2c, 0x6d, 0x2a, 0xc3, 0xf5, 0x46, 0x5a, + 0x60, 0xe5, 0xb3, 0xce, 0x58, 0x59, 0xbe, 0xfe, 0xbc, 0x0d, 0x03, 0xa2, 0x0d, 0x42, 0xe3, 0x2e, + 0x84, 0x67, 0x19, 0x91, 0x13, 0xde, 0x58, 0x69, 0xbf, 0x14, 0x79, 0x13, 0x4a, 0x7c, 0x6f, 0x2f, + 0x04, 0x70, 0x3e, 0xfd, 0x2c, 0x24, 0x56, 0x5c, 0x94, 0x21, 0x33, 0x00, 0xe1, 0xbe, 0x3e, 0x38, + 0xd0, 0x16, 0x1c, 0x92, 0x3b, 0xfe, 0x18, 0x17, 0xa9, 0x2c, 0x79, 0x05, 0x86, 0x97, 0xa8, 0xd3, + 0x36, 0x2d, 0xbd, 0x55, 0x37, 0xdf, 0xf7, 0xcf, 0xb4, 0x71, 0xe1, 0x75, 0xcd, 0xf7, 0xe5, 0x91, + 0x1b, 0xa1, 0x23, 0x5f, 0x49, 0xdb, 0x37, 0x0f, 0x60, 0x43, 0x9e, 0xd9, 0x76, 0x43, 0x19, 0x6b, + 0x4f, 0xca, 0x36, 0xfa, 0x1d, 0x18, 0x89, 0x6c, 0x99, 0xc4, 0xa1, 0xe5, 0x93, 0x49, 0xd6, 0xd2, + 0xfe, 0x2f, 0xc6, 0x36, 0xca, 0x81, 0x69, 0x72, 0xcd, 0x32, 0x3d, 0x53, 0x6f, 0x4d, 0xda, 0xed, + 0xb6, 0x6e, 0x19, 0xca, 0x60, 0xa8, 0xc9, 0x26, 0xc7, 0x34, 0x9a, 0x1c, 0x25, 0x6b, 0x72, 0xb4, + 0x10, 0xdb, 0x96, 0x8b, 0x3e, 0xd4, 0x68, 0xd3, 0x76, 0x98, 0x2d, 0x80, 0x67, 0x92, 0x62, 0x5b, + 0xee, 0x72, 0x5c, 0xc3, 0xf1, 0x91, 0xb2, 0xb1, 0x1d, 0x2f, 0x78, 0xa7, 0x58, 0x1e, 0x1a, 0x1b, + 0x8e, 0x1f, 0x23, 0xab, 0x7f, 0xad, 0x00, 0x43, 0x82, 0x94, 0x2d, 0xa5, 0x27, 0x0a, 0xbe, 0x1f, + 0x05, 0x4f, 0x55, 0xd4, 0xd2, 0x41, 0x29, 0xaa, 0xfa, 0x41, 0x3e, 0x98, 0x8d, 0x16, 0x1d, 0xd3, + 0xda, 0xdf, 0x6c, 0x74, 0x05, 0x60, 0x72, 0xad, 0x6b, 0x3d, 0xe4, 0xd7, 0x65, 0xf9, 0xf0, 0xba, + 0xac, 0x69, 0x6a, 0x12, 0x86, 0x3c, 0x09, 0xc5, 0x2a, 0xe3, 0xcf, 0x7a, 0x66, 0x78, 0x62, 0xf0, + 0x43, 0xce, 0x29, 0xf7, 0x82, 0x86, 0x60, 0xb6, 0xb9, 0x9a, 0xd8, 0xf0, 0x28, 0x37, 0x67, 0x0b, + 0x7c, 0x73, 0xb5, 0xcc, 0x00, 0x1a, 0x87, 0x93, 0x5b, 0x70, 0xba, 0x4a, 0x5b, 0xfa, 0xc6, 0x9c, + 0xd9, 0x6a, 0x99, 0x2e, 0x6d, 0xda, 0x96, 0xe1, 0xa2, 0x90, 0x45, 0x75, 0x6d, 0x57, 0x4b, 0x12, + 0x10, 0x15, 0x4a, 0x0b, 0x2b, 0x2b, 0x2e, 0xf5, 0x50, 0x7c, 0x85, 0x09, 0x60, 0x93, 0xb3, 0x8d, + 0x10, 0x4d, 0x60, 0xd4, 0x5f, 0xcf, 0xb1, 0xdd, 0x8b, 0xfb, 0xd0, 0xb3, 0x3b, 0x81, 0x96, 0xef, + 0x4b, 0x24, 0xd7, 0x42, 0xbb, 0x22, 0x8f, 0x5f, 0x7b, 0x4a, 0x7c, 0xed, 0x80, 0xb0, 0x2d, 0x42, + 0x8b, 0x22, 0xf5, 0xab, 0x0a, 0xdb, 0x7c, 0x95, 0xfa, 0xc7, 0x79, 0xb8, 0x20, 0x5a, 0x3c, 0xd9, + 0x32, 0x3b, 0xcb, 0xb6, 0xee, 0x18, 0x1a, 0x6d, 0x52, 0xf3, 0x11, 0x3d, 0x9a, 0x03, 0x2f, 0x3a, + 0x74, 0x8a, 0xfb, 0x18, 0x3a, 0x37, 0x71, 0x23, 0xc8, 0x24, 0x83, 0x07, 0xbe, 0xdc, 0xa8, 0x18, + 0xdb, 0xda, 0x1c, 0x1f, 0x36, 0x38, 0x18, 0x8f, 0xfc, 0x35, 0x99, 0x88, 0x29, 0xc9, 0x2c, 0xb5, + 0x56, 0xbd, 0x35, 0x54, 0x92, 0x7e, 0xae, 0x24, 0x2d, 0x84, 0x68, 0x02, 0xa3, 0xfe, 0x6f, 0x79, + 0x38, 0x1b, 0x17, 0x79, 0x9d, 0x5a, 0xc6, 0x89, 0xbc, 0x3f, 0x1a, 0x79, 0x7f, 0xbf, 0x00, 0x4f, + 0x88, 0x32, 0xf5, 0x35, 0xdd, 0xa1, 0x46, 0xd5, 0x74, 0x68, 0xd3, 0xb3, 0x9d, 0x8d, 0x23, 0x6c, + 0x40, 0x1d, 0x9c, 0xd8, 0x6f, 0x41, 0x49, 0x6c, 0xff, 0xf9, 0x3a, 0x33, 0x1a, 0xb4, 0x04, 0xa1, + 0x89, 0x15, 0x8a, 0x1f, 0x1d, 0xc4, 0x3a, 0xab, 0xb4, 0x93, 0xce, 0xfa, 0x3c, 0x8c, 0x04, 0xa2, + 0xc7, 0x8d, 0xe8, 0x40, 0x68, 0x6d, 0x19, 0x3e, 0x02, 0xf7, 0xa2, 0x5a, 0x94, 0x10, 0x6b, 0xf3, + 0x01, 0xb5, 0x2a, 0x5a, 0x43, 0x23, 0xa2, 0xb6, 0xa0, 0x9c, 0x69, 0x68, 0x32, 0x91, 0xba, 0x59, + 0x84, 0x4b, 0xe9, 0xdd, 0xae, 0x51, 0xdd, 0x38, 0xe9, 0xf5, 0x4f, 0x64, 0xaf, 0x93, 0x67, 0xa0, + 0xb8, 0xa8, 0x7b, 0x6b, 0xe2, 0xfa, 0x1d, 0xef, 0x84, 0x57, 0xcc, 0x16, 0x6d, 0x74, 0x74, 0x6f, + 0x4d, 0x43, 0x94, 0x34, 0x67, 0x00, 0x72, 0x4c, 0x99, 0x33, 0xa4, 0xc5, 0x7e, 0xe8, 0xe9, 0xdc, + 0xd5, 0x62, 0xea, 0x62, 0xff, 0xbd, 0x62, 0xd6, 0xbc, 0xf2, 0xc0, 0x31, 0x3d, 0x7a, 0xa2, 0x61, + 0x27, 0x1a, 0xb6, 0x4f, 0x0d, 0xfb, 0x87, 0x79, 0x18, 0x09, 0x36, 0x4d, 0xef, 0xd1, 0xe6, 0xe1, + 0xac, 0x55, 0xe1, 0x56, 0xa6, 0xb0, 0xef, 0xad, 0xcc, 0x7e, 0x14, 0x4a, 0x0d, 0x8e, 0x3c, 0xb9, + 0x69, 0x80, 0x12, 0xe3, 0x47, 0x9e, 0xc1, 0x41, 0xe7, 0x33, 0x30, 0x30, 0xa7, 0x3f, 0x36, 0xdb, + 0xdd, 0xb6, 0xb0, 0xd2, 0xd1, 0x9d, 0xac, 0xad, 0x3f, 0xd6, 0x7c, 0xb8, 0xfa, 0xdf, 0xe6, 0x60, + 0x54, 0x08, 0x55, 0x30, 0xdf, 0x97, 0x54, 0x43, 0xe9, 0xe4, 0xf7, 0x2d, 0x9d, 0xc2, 0xde, 0xa5, + 0xa3, 0xfe, 0x85, 0x02, 0x28, 0xd3, 0x66, 0x8b, 0x2e, 0x39, 0xba, 0xe5, 0xae, 0x50, 0x47, 0x6c, + 0xa7, 0xa7, 0x18, 0xab, 0x7d, 0x7d, 0xa0, 0x34, 0xa5, 0xe4, 0xf7, 0x34, 0xa5, 0x7c, 0x16, 0x06, + 0x45, 0x63, 0x02, 0x57, 0x46, 0x1c, 0x35, 0x8e, 0x0f, 0xd4, 0x42, 0x3c, 0x23, 0xae, 0x74, 0x3a, + 0x8e, 0xfd, 0x88, 0x3a, 0xfc, 0x96, 0x4a, 0x10, 0xeb, 0x3e, 0x50, 0x0b, 0xf1, 0x12, 0x67, 0xea, + 0xdb, 0x8b, 0x32, 0x67, 0xea, 0x68, 0x21, 0x9e, 0x5c, 0x85, 0xf2, 0xac, 0xdd, 0xd4, 0x51, 0xd0, + 0x7c, 0x5a, 0x19, 0xde, 0xda, 0x1c, 0x2f, 0xb7, 0x04, 0x4c, 0x0b, 0xb0, 0x8c, 0xb2, 0x6a, 0xaf, + 0x5b, 0x2d, 0x5b, 0xe7, 0xce, 0x2f, 0x65, 0x4e, 0x69, 0x08, 0x98, 0x16, 0x60, 0x19, 0x25, 0x93, + 0x39, 0x3a, 0x15, 0x95, 0x43, 0x9e, 0x2b, 0x02, 0xa6, 0x05, 0x58, 0xf5, 0xd7, 0x8b, 0x4c, 0x7b, + 0x5d, 0xf3, 0xfd, 0x63, 0xbf, 0x2e, 0x84, 0x03, 0xa6, 0x7f, 0x0f, 0x03, 0xe6, 0xd8, 0x1c, 0xd8, + 0xa9, 0xff, 0x7c, 0x00, 0x40, 0x48, 0x7f, 0xea, 0x64, 0x73, 0xb8, 0x3f, 0xad, 0xa9, 0xc2, 0xe9, + 0x29, 0x6b, 0x4d, 0xb7, 0x9a, 0xd4, 0x08, 0x8f, 0x2d, 0x4b, 0x38, 0xb4, 0xd1, 0x09, 0x92, 0x0a, + 0x64, 0x78, 0x6e, 0xa9, 0x25, 0x0b, 0x90, 0x17, 0x61, 0xa8, 0x66, 0x79, 0xd4, 0xd1, 0x9b, 0x9e, + 0xf9, 0x88, 0x8a, 0xa9, 0x01, 0x6f, 0x86, 0xcd, 0x10, 0xac, 0xc9, 0x34, 0xe4, 0x16, 0x0c, 0x2f, + 0xea, 0x8e, 0x67, 0x36, 0xcd, 0x8e, 0x6e, 0x79, 0xae, 0x52, 0xc6, 0x19, 0x0d, 0x2d, 0x8c, 0x8e, + 0x04, 0xd7, 0x22, 0x54, 0xe4, 0x2b, 0x30, 0x88, 0x5b, 0x53, 0xf4, 0xd7, 0x1e, 0xdc, 0xf6, 0xe2, + 0xf0, 0xd9, 0xd0, 0x3d, 0x90, 0x9f, 0xbe, 0xe2, 0x0d, 0x70, 0xfc, 0xee, 0x30, 0xe0, 0x48, 0xbe, + 0x04, 0x03, 0x53, 0x96, 0x81, 0xcc, 0x61, 0x5b, 0xe6, 0xaa, 0x60, 0x7e, 0x3e, 0x64, 0x6e, 0x77, + 0x62, 0xbc, 0x7d, 0x76, 0xe9, 0xa3, 0x6c, 0xe8, 0xa3, 0x1b, 0x65, 0xc3, 0x1f, 0xc1, 0xb1, 0xf8, + 0xc8, 0x41, 0x1d, 0x8b, 0x8f, 0xee, 0xf1, 0x58, 0x5c, 0x7d, 0x1f, 0x86, 0x26, 0x16, 0xa7, 0x83, + 0xd1, 0x7b, 0x11, 0x0a, 0x8b, 0xc2, 0x53, 0xa1, 0xc8, 0xed, 0x99, 0x8e, 0x69, 0x68, 0x0c, 0x46, + 0xae, 0x41, 0x79, 0x12, 0xdd, 0xdf, 0xc4, 0x2d, 0x62, 0x91, 0xaf, 0x7f, 0x4d, 0x84, 0xa1, 0x17, + 0xac, 0x8f, 0x26, 0x9f, 0x86, 0x81, 0x45, 0xc7, 0x5e, 0x75, 0xf4, 0xb6, 0x58, 0x83, 0xd1, 0x55, + 0xa4, 0xc3, 0x41, 0x9a, 0x8f, 0x53, 0x7f, 0x26, 0xe7, 0x9b, 0xed, 0xac, 0x44, 0xbd, 0x8b, 0x47, + 0xf3, 0x58, 0x77, 0x99, 0x97, 0x70, 0x39, 0x48, 0xf3, 0x71, 0xe4, 0x1a, 0xf4, 0x4f, 0x39, 0x8e, + 0xed, 0xc8, 0x3e, 0xee, 0x94, 0x01, 0xe4, 0xeb, 0x5e, 0xa4, 0x20, 0xaf, 0xc2, 0x10, 0x9f, 0x73, + 0xf8, 0x89, 0x66, 0xa1, 0xd7, 0x4d, 0xa9, 0x4c, 0xa9, 0x7e, 0xb7, 0x20, 0xd9, 0x6c, 0x5c, 0xe2, + 0xc7, 0xf0, 0x56, 0xe0, 0x25, 0x28, 0x4c, 0x2c, 0x4e, 0x8b, 0x09, 0xf0, 0x8c, 0x5f, 0x54, 0x52, + 0x95, 0x58, 0x39, 0x46, 0x4d, 0x2e, 0x43, 0x71, 0x91, 0xa9, 0x4f, 0x09, 0xd5, 0xa3, 0xbc, 0xb5, + 0x39, 0x5e, 0xec, 0x30, 0xfd, 0x41, 0x28, 0x62, 0xd9, 0x66, 0x86, 0xef, 0x98, 0x38, 0x36, 0xdc, + 0xc7, 0x5c, 0x86, 0x62, 0xc5, 0x59, 0x7d, 0x24, 0x66, 0x2d, 0xc4, 0xea, 0xce, 0xea, 0x23, 0x0d, + 0xa1, 0xe4, 0x06, 0x80, 0x46, 0xbd, 0xae, 0x63, 0xe1, 0xf3, 0x93, 0x41, 0x3c, 0x7f, 0xc3, 0xd9, + 0xd0, 0x41, 0x68, 0xa3, 0x69, 0x1b, 0x54, 0x93, 0x48, 0xd4, 0xbf, 0x1a, 0x5e, 0xec, 0x54, 0x4d, + 0xf7, 0xe1, 0x49, 0x17, 0xee, 0xa2, 0x0b, 0x75, 0x71, 0xc4, 0x99, 0xec, 0xa4, 0x71, 0xe8, 0x9f, + 0x6e, 0xe9, 0xab, 0x2e, 0xf6, 0xa1, 0xf0, 0x25, 0x5b, 0x61, 0x00, 0x8d, 0xc3, 0x63, 0xfd, 0x54, + 0xde, 0xbe, 0x9f, 0x7e, 0xae, 0x3f, 0x18, 0x6d, 0xf3, 0xd4, 0x5b, 0xb7, 0x9d, 0x93, 0xae, 0xda, + 0x69, 0x57, 0x5d, 0x81, 0x81, 0xba, 0xd3, 0x94, 0x8e, 0x2e, 0x70, 0x3f, 0xe0, 0x3a, 0x4d, 0x7e, + 0x6c, 0xe1, 0x23, 0x19, 0x5d, 0xd5, 0xf5, 0x90, 0x6e, 0x20, 0xa4, 0x33, 0x5c, 0x4f, 0xd0, 0x09, + 0xa4, 0xa0, 0x5b, 0xb4, 0x1d, 0x4f, 0x74, 0x5c, 0x40, 0xd7, 0xb1, 0x1d, 0x4f, 0xf3, 0x91, 0xe4, + 0xb3, 0x00, 0x4b, 0x93, 0x8b, 0xbe, 0xb3, 0xfd, 0x60, 0xe8, 0x0b, 0x28, 0xbc, 0xec, 0x35, 0x09, + 0x4d, 0x96, 0x60, 0x70, 0xa1, 0x43, 0x1d, 0xbe, 0x15, 0xe2, 0x0f, 0x4a, 0x3e, 0x13, 0x13, 0xad, + 0xe8, 0xf7, 0xeb, 0xe2, 0xff, 0x80, 0x9c, 0xaf, 0x2f, 0xb6, 0xff, 0x53, 0x0b, 0x19, 0x91, 0x57, + 0xa1, 0x54, 0xe1, 0x76, 0xde, 0x10, 0xb2, 0x0c, 0x44, 0x86, 0x5b, 0x50, 0x8e, 0xe2, 0x7b, 0x76, + 0x1d, 0xff, 0xd6, 0x04, 0xb9, 0x7a, 0x0d, 0xc6, 0xe2, 0xd5, 0x90, 0x21, 0x18, 0x98, 0x5c, 0x98, + 0x9f, 0x9f, 0x9a, 0x5c, 0x1a, 0xeb, 0x23, 0x65, 0x28, 0xd6, 0xa7, 0xe6, 0xab, 0x63, 0x39, 0xf5, + 0x57, 0xa5, 0x19, 0x84, 0xa9, 0xd6, 0xc9, 0xd5, 0xf0, 0xbe, 0xee, 0x5b, 0xc6, 0xf0, 0x3e, 0x14, + 0x4f, 0x0c, 0xda, 0xa6, 0xe7, 0x51, 0x43, 0xac, 0x12, 0x78, 0x5f, 0xe8, 0x3d, 0xd6, 0x12, 0x78, + 0xf2, 0x3c, 0x8c, 0x20, 0x4c, 0x5c, 0x11, 0xf2, 0xfd, 0xb1, 0x28, 0xe0, 0x3c, 0xd6, 0xa2, 0x48, + 0xf5, 0x0f, 0xc2, 0xdb, 0xe1, 0x59, 0xaa, 0x1f, 0xd5, 0x1b, 0xc5, 0x8f, 0x49, 0x7f, 0xa9, 0xff, + 0xb2, 0xc8, 0x9f, 0x80, 0xf0, 0xf7, 0x82, 0x87, 0x21, 0xca, 0xf0, 0x48, 0xb7, 0xb0, 0x8b, 0x23, + 0xdd, 0xe7, 0xa1, 0x34, 0x47, 0xbd, 0x35, 0xdb, 0x77, 0xfc, 0x42, 0x0f, 0xbd, 0x36, 0x42, 0x64, + 0x0f, 0x3d, 0x4e, 0x43, 0x1e, 0x02, 0xf1, 0x1f, 0x03, 0x06, 0x8e, 0xd8, 0xfe, 0x11, 0xf2, 0x85, + 0xc4, 0x3e, 0xa5, 0x8e, 0x2f, 0x81, 0xd1, 0xc7, 0xfe, 0x6c, 0xe0, 0xe8, 0x2d, 0x79, 0x62, 0xfd, + 0x8b, 0xcd, 0xf1, 0x12, 0xa7, 0xd1, 0x52, 0xd8, 0x92, 0x77, 0x60, 0x70, 0x6e, 0xba, 0x22, 0x1e, + 0x06, 0x72, 0xaf, 0x88, 0x8b, 0x81, 0x14, 0x7d, 0x44, 0x20, 0x12, 0x7c, 0x6f, 0xd3, 0x5e, 0xd1, + 0x93, 0xef, 0x02, 0x43, 0x2e, 0x4c, 0x5b, 0xf8, 0xcb, 0x1d, 0x71, 0xba, 0x10, 0x68, 0x4b, 0xf4, + 0x3d, 0x4f, 0x5c, 0x56, 0x1c, 0x1b, 0xd3, 0x96, 0xf2, 0x3e, 0x46, 0xf7, 0x02, 0x9c, 0xae, 0x74, + 0x3a, 0x2d, 0x93, 0x1a, 0xa8, 0x2f, 0x5a, 0xb7, 0x45, 0x5d, 0xe1, 0xf2, 0x83, 0x8f, 0x41, 0x74, + 0x8e, 0x6c, 0xe0, 0x73, 0xd4, 0x86, 0xd3, 0x8d, 0xfa, 0x67, 0x26, 0xcb, 0xaa, 0x7f, 0x36, 0x0f, + 0xe7, 0x27, 0x1d, 0xaa, 0x7b, 0x74, 0x6e, 0xba, 0x52, 0xe9, 0xa2, 0x8f, 0x5c, 0xab, 0x45, 0xad, + 0xd5, 0xc3, 0x19, 0xd6, 0x6f, 0xc0, 0x68, 0xd0, 0x80, 0x7a, 0xd3, 0xee, 0x50, 0xf9, 0x61, 0x55, + 0xd3, 0xc7, 0x34, 0x5c, 0x86, 0xd2, 0x62, 0xa4, 0xe4, 0x2e, 0x9c, 0x09, 0x20, 0x95, 0x56, 0xcb, + 0x5e, 0xd7, 0x68, 0xd7, 0xe5, 0x8e, 0xb1, 0x65, 0xee, 0x18, 0x1b, 0x72, 0xd0, 0x19, 0xbe, 0xe1, + 0x30, 0x02, 0x2d, 0xad, 0x94, 0xfa, 0x8b, 0x05, 0xb8, 0x70, 0x5f, 0x6f, 0x99, 0x46, 0x28, 0x1a, + 0x8d, 0xba, 0x1d, 0xdb, 0x72, 0xe9, 0x11, 0x1a, 0xa5, 0x91, 0xa1, 0x50, 0x3c, 0x90, 0xa1, 0x90, + 0xec, 0xa2, 0xfe, 0x7d, 0x77, 0x51, 0x69, 0x4f, 0x5d, 0xf4, 0xbf, 0xe6, 0x60, 0xcc, 0x77, 0xfc, + 0x97, 0x1f, 0x71, 0x4b, 0x5e, 0xe9, 0x78, 0x84, 0x18, 0xf3, 0x83, 0x46, 0x3c, 0xa9, 0xc3, 0xc0, + 0xd4, 0xe3, 0x8e, 0xe9, 0x50, 0x77, 0x07, 0x4e, 0xdc, 0x4f, 0x8a, 0xe3, 0x92, 0xd3, 0x94, 0x17, + 0x49, 0x9c, 0x94, 0x70, 0x30, 0x3e, 0xe7, 0xe3, 0x4f, 0x1f, 0x26, 0xfc, 0x97, 0xe9, 0xfc, 0x39, + 0x9f, 0x78, 0x22, 0x11, 0x79, 0x9f, 0x19, 0x92, 0x92, 0x67, 0xa1, 0xb0, 0xb4, 0x34, 0x2b, 0x66, + 0x52, 0x8c, 0x08, 0xe0, 0x79, 0xf2, 0x7b, 0x45, 0x86, 0x55, 0xff, 0x49, 0x1e, 0x80, 0xa9, 0x02, + 0x1f, 0xae, 0x87, 0xa2, 0x84, 0x13, 0x50, 0xf6, 0x05, 0x2e, 0xd4, 0x30, 0xf0, 0xda, 0x8f, 0x77, + 0x44, 0xbc, 0xee, 0xe0, 0x85, 0xc6, 0xb8, 0xef, 0x48, 0xce, 0xef, 0x01, 0x70, 0x67, 0x83, 0x8e, + 0xe4, 0xbe, 0xfb, 0xf8, 0x67, 0x61, 0x50, 0xcc, 0x78, 0x76, 0xe4, 0xfc, 0xbf, 0xe9, 0x03, 0xb5, + 0x10, 0x1f, 0x9b, 0x5a, 0x4b, 0xfb, 0x58, 0x88, 0x7d, 0xf1, 0xf2, 0x5e, 0x39, 0x11, 0xef, 0x01, + 0x8b, 0xf7, 0x1b, 0x42, 0xbc, 0xfc, 0x05, 0xcf, 0x91, 0x15, 0xef, 0x81, 0x9d, 0x7d, 0xab, 0xff, + 0x30, 0x07, 0x84, 0x35, 0x6b, 0x51, 0x77, 0xdd, 0x75, 0xdb, 0x31, 0xb8, 0x73, 0xfa, 0xa1, 0x08, + 0xe6, 0xe0, 0xee, 0x2b, 0xbf, 0x5b, 0x86, 0x33, 0x11, 0xc7, 0xdf, 0x23, 0x3e, 0x59, 0x5d, 0x8b, + 0x8e, 0xa6, 0x5e, 0xaf, 0x5e, 0x3e, 0x25, 0x5f, 0x88, 0xf6, 0x47, 0x1e, 0xa0, 0x49, 0x37, 0xa1, + 0x2f, 0xc0, 0xb0, 0xf8, 0xc1, 0x56, 0x68, 0xff, 0xa6, 0x0b, 0x47, 0xa9, 0xcb, 0x00, 0x5a, 0x04, + 0x4d, 0x5e, 0x86, 0x41, 0x36, 0x60, 0x56, 0x31, 0x78, 0xc8, 0x40, 0xf8, 0xa2, 0xc4, 0xf0, 0x81, + 0xf2, 0x7a, 0x12, 0x50, 0x4a, 0xef, 0x88, 0xca, 0x3b, 0x78, 0x47, 0xf4, 0x55, 0x18, 0xaa, 0x58, + 0x96, 0xed, 0xe1, 0x26, 0xdd, 0x15, 0x57, 0x13, 0x99, 0x56, 0xf9, 0xb3, 0xf8, 0x38, 0x3e, 0xa4, + 0x4f, 0x35, 0xcb, 0x65, 0x86, 0xe4, 0xa6, 0xff, 0x2a, 0x86, 0x3a, 0xc2, 0xab, 0x1c, 0xaf, 0x67, + 0x1c, 0x01, 0x4b, 0x3e, 0x8a, 0xc1, 0xce, 0x1b, 0x59, 0x74, 0xec, 0x8e, 0xed, 0x52, 0x83, 0x0b, + 0x6a, 0x28, 0x0c, 0x35, 0xd0, 0x11, 0x08, 0x7c, 0xc7, 0x16, 0x09, 0xe4, 0x11, 0x29, 0x42, 0x56, + 0xe0, 0xac, 0x7f, 0x51, 0x1c, 0xbc, 0x18, 0xac, 0x55, 0x5d, 0x65, 0x18, 0x5f, 0x25, 0x91, 0xb8, + 0x32, 0xd4, 0xaa, 0x13, 0x4f, 0xf9, 0xd7, 0x22, 0xfe, 0x93, 0xc3, 0x86, 0x69, 0xc8, 0x5d, 0x9d, + 0xca, 0x8f, 0xfc, 0x08, 0x0c, 0xcd, 0xe9, 0x8f, 0xab, 0x5d, 0x71, 0xf6, 0x32, 0xb2, 0xf3, 0xdb, + 0x97, 0xb6, 0xfe, 0xb8, 0x61, 0x88, 0x72, 0x31, 0x9b, 0x42, 0x66, 0x49, 0x1a, 0x70, 0x7e, 0xd1, + 0xb1, 0xdb, 0xb6, 0x47, 0x8d, 0xd8, 0xe3, 0xbb, 0x53, 0xe1, 0x6b, 0xdd, 0x8e, 0xa0, 0x68, 0xf4, + 0x78, 0x85, 0x97, 0xc1, 0x86, 0xb4, 0xe1, 0x54, 0xc5, 0x75, 0xbb, 0x6d, 0x1a, 0xde, 0x50, 0x8d, + 0x6d, 0xfb, 0x19, 0x9f, 0x11, 0x5e, 0xcb, 0x4f, 0xe8, 0x58, 0x94, 0x5f, 0x50, 0x35, 0x3c, 0x53, + 0xae, 0x11, 0xbf, 0x25, 0xce, 0xfb, 0x4e, 0xb1, 0x3c, 0x3a, 0x76, 0x4a, 0xbb, 0x90, 0x6c, 0xcc, + 0x92, 0xe9, 0xb5, 0xa8, 0xfa, 0x9d, 0x1c, 0x40, 0x28, 0x60, 0xf2, 0x42, 0x34, 0x42, 0x51, 0x2e, + 0xbc, 0xe8, 0x10, 0xd1, 0x0b, 0x22, 0x21, 0x89, 0xc8, 0x65, 0x28, 0x62, 0x84, 0x8b, 0x7c, 0x78, + 0xb0, 0xfa, 0xd0, 0xb4, 0x0c, 0x0d, 0xa1, 0x0c, 0x2b, 0x3d, 0x45, 0x47, 0x2c, 0x5e, 0xea, 0x73, + 0xab, 0xb0, 0x0a, 0xa7, 0xea, 0xdd, 0x65, 0xbf, 0x6e, 0xe9, 0x5d, 0x1d, 0x06, 0xda, 0x70, 0xbb, + 0xcb, 0xc1, 0x63, 0xd4, 0x48, 0x18, 0x93, 0x68, 0x11, 0xf5, 0xd7, 0x73, 0xb1, 0x59, 0xf0, 0x10, + 0x17, 0xbd, 0x4f, 0x25, 0xfd, 0x34, 0x92, 0xd3, 0x92, 0xfa, 0x17, 0xf3, 0x30, 0xb4, 0x68, 0x3b, + 0x9e, 0x08, 0x19, 0x72, 0xb4, 0x57, 0x21, 0x69, 0xaf, 0x54, 0xdc, 0xc5, 0x5e, 0xe9, 0x32, 0x14, + 0x25, 0x17, 0x65, 0x7e, 0x2f, 0x62, 0x18, 0x8e, 0x86, 0x50, 0xf5, 0xc7, 0xf2, 0x00, 0x5f, 0x7a, + 0xf1, 0xc5, 0x63, 0x2c, 0x20, 0xf5, 0x17, 0x72, 0x70, 0x4a, 0x5c, 0xd4, 0x49, 0xb1, 0xbe, 0x06, + 0xfc, 0x2b, 0x56, 0x79, 0x5c, 0x72, 0x90, 0xe6, 0xe3, 0xd8, 0x12, 0x30, 0xf5, 0xd8, 0xf4, 0xf0, + 0xae, 0x42, 0x0a, 0xf6, 0x45, 0x05, 0x4c, 0x5e, 0x02, 0x7c, 0x3a, 0xf2, 0x82, 0x7f, 0x05, 0x59, + 0x08, 0xd7, 0x3d, 0x56, 0x60, 0x2a, 0xf5, 0x1a, 0x52, 0xfd, 0xad, 0x22, 0x14, 0xa7, 0x1e, 0xd3, + 0xe6, 0x11, 0xef, 0x1a, 0xe9, 0x60, 0xb3, 0xb8, 0xcf, 0x83, 0xcd, 0xbd, 0xf8, 0x54, 0xbc, 0x1d, + 0xf6, 0x67, 0x29, 0x5a, 0x7d, 0xac, 0xe7, 0xe3, 0xd5, 0xfb, 0x3d, 0x7d, 0xf4, 0x5c, 0x72, 0xfe, + 0x8b, 0x02, 0x14, 0xea, 0x93, 0x8b, 0x27, 0x7a, 0x73, 0xa8, 0x7a, 0xd3, 0xfb, 0xce, 0x5a, 0x0d, + 0xae, 0xa1, 0xca, 0xa1, 0x97, 0x68, 0xec, 0xc6, 0xe9, 0xfb, 0x05, 0x18, 0xad, 0x4f, 0x2f, 0x2d, + 0x4a, 0x27, 0xc1, 0x77, 0xb9, 0x27, 0x1f, 0xfa, 0x94, 0xf1, 0x2e, 0xbd, 0x9c, 0xb0, 0x67, 0xee, + 0xd5, 0x2c, 0xef, 0x95, 0x5b, 0xf7, 0xf5, 0x56, 0x97, 0xe2, 0xd1, 0x0b, 0xf7, 0xfb, 0x75, 0xcd, + 0xf7, 0xe9, 0x2f, 0xe2, 0xc3, 0x7f, 0x9f, 0x01, 0x79, 0x03, 0x0a, 0xf7, 0x84, 0x47, 0x46, 0x16, + 0x9f, 0x97, 0x6e, 0x72, 0x3e, 0x6c, 0x12, 0x2c, 0x74, 0x4d, 0x03, 0x39, 0xb0, 0x52, 0xac, 0xf0, + 0x6d, 0xb1, 0x00, 0xef, 0xa8, 0xf0, 0xaa, 0x5f, 0xf8, 0x76, 0xad, 0x4a, 0xea, 0x30, 0xb4, 0x48, + 0x9d, 0xb6, 0x89, 0x1d, 0xe5, 0xcf, 0xd9, 0xbd, 0x99, 0xb0, 0x9d, 0xca, 0x50, 0x27, 0x2c, 0x84, + 0xcc, 0x64, 0x2e, 0xe4, 0x5d, 0x00, 0x6e, 0xa3, 0xec, 0x30, 0x7e, 0xe4, 0x93, 0x68, 0xf7, 0x73, + 0xd3, 0x32, 0xc5, 0xc6, 0x93, 0x98, 0x91, 0x87, 0x30, 0x36, 0x67, 0x1b, 0xe6, 0x8a, 0xc9, 0x5d, + 0x2f, 0xb1, 0x82, 0xd2, 0xf6, 0x0e, 0x4f, 0xcc, 0x94, 0x6c, 0x4b, 0xe5, 0xd2, 0xaa, 0x49, 0x30, + 0x56, 0xff, 0xd3, 0x7e, 0x28, 0xb2, 0x6e, 0x3f, 0x19, 0xbf, 0xfb, 0x19, 0xbf, 0x15, 0x18, 0x7b, + 0x60, 0x3b, 0x0f, 0x4d, 0x6b, 0x35, 0xf0, 0x8a, 0x17, 0x7b, 0x53, 0xf4, 0xe4, 0x59, 0xe7, 0xb8, + 0x46, 0xe0, 0x40, 0xaf, 0x25, 0xc8, 0xb7, 0x19, 0xc1, 0xaf, 0x01, 0xf0, 0xb7, 0xee, 0x48, 0x53, + 0x0e, 0x83, 0x55, 0xf0, 0x97, 0xf0, 0xe8, 0x68, 0x2f, 0x07, 0xab, 0x08, 0x89, 0xd9, 0x26, 0x9c, + 0xfb, 0x42, 0x0c, 0xa2, 0xdf, 0x3d, 0x6e, 0xc2, 0xd1, 0x17, 0x42, 0x36, 0x02, 0xb8, 0x57, 0xc4, + 0x22, 0x80, 0x74, 0xbf, 0x04, 0x31, 0x41, 0x44, 0x26, 0x07, 0x11, 0x1e, 0x2e, 0xe5, 0x7a, 0x49, + 0x93, 0x78, 0x90, 0x57, 0x62, 0x17, 0xe0, 0x24, 0xc2, 0x2d, 0xf3, 0xfe, 0x3b, 0x74, 0xa0, 0x1a, + 0xde, 0xce, 0x81, 0x4a, 0xfd, 0x20, 0x0f, 0x83, 0xf5, 0xee, 0xb2, 0xbb, 0xe1, 0x7a, 0xb4, 0x7d, + 0xc4, 0xd5, 0xd8, 0xdf, 0x5e, 0x15, 0x53, 0xb7, 0x57, 0xcf, 0xfa, 0x42, 0x91, 0xce, 0x1d, 0x03, + 0x93, 0xce, 0x17, 0xc7, 0xdf, 0xcc, 0xc3, 0x18, 0xbf, 0x38, 0xab, 0x9a, 0x6e, 0xf3, 0x00, 0x9c, + 0xf9, 0x0f, 0x5f, 0x2a, 0xfb, 0xbb, 0x6c, 0xde, 0xc1, 0x13, 0x09, 0xf5, 0x6b, 0x79, 0x18, 0xaa, + 0x74, 0xbd, 0xb5, 0x8a, 0x87, 0xba, 0x75, 0x2c, 0xf7, 0x27, 0x7f, 0x37, 0x07, 0xa7, 0x58, 0x43, + 0x96, 0xec, 0x87, 0xd4, 0x3a, 0x80, 0x83, 0x47, 0xf9, 0x00, 0x31, 0xbf, 0xc7, 0x03, 0x44, 0x5f, + 0x96, 0x85, 0xdd, 0xc9, 0x12, 0x8f, 0xcb, 0x35, 0xbb, 0x45, 0x8f, 0xf6, 0x67, 0x1c, 0xe0, 0x71, + 0xb9, 0x2f, 0x90, 0x03, 0xb8, 0x9e, 0xf9, 0x64, 0x09, 0xe4, 0x00, 0xce, 0x96, 0x3e, 0x19, 0x02, + 0xf9, 0x6e, 0x0e, 0x06, 0x27, 0x6c, 0xef, 0x88, 0x0f, 0x7c, 0xf1, 0x15, 0x47, 0x5b, 0xcd, 0xfd, + 0xaf, 0x38, 0xda, 0xba, 0xa9, 0xfe, 0x7c, 0x1e, 0xce, 0x8a, 0xd8, 0xe0, 0xe2, 0xfc, 0xe1, 0x64, + 0x3a, 0x16, 0x83, 0x2d, 0x29, 0x9a, 0x93, 0x79, 0x48, 0x88, 0xe6, 0x97, 0x0b, 0x70, 0x16, 0x43, + 0x99, 0xb2, 0x6d, 0xd9, 0x27, 0xc0, 0x16, 0x21, 0xcd, 0xe8, 0x25, 0xe8, 0x5c, 0xca, 0x25, 0xe8, + 0xbf, 0xd8, 0x1c, 0x7f, 0x65, 0xd5, 0xf4, 0xd6, 0xba, 0xcb, 0xd7, 0x9b, 0x76, 0xfb, 0xc6, 0xaa, + 0xa3, 0x3f, 0x32, 0xf9, 0xf5, 0x9f, 0xde, 0xba, 0x11, 0xa4, 0xd9, 0xd0, 0x3b, 0xa6, 0x48, 0xc0, + 0x51, 0xc7, 0xbd, 0x0e, 0xe3, 0xea, 0x5f, 0x9f, 0xba, 0x00, 0x77, 0x6c, 0xd3, 0x12, 0x3e, 0x85, + 0xdc, 0xd0, 0xad, 0xb3, 0xfd, 0xe1, 0x7b, 0xb6, 0x69, 0x35, 0xe2, 0x8e, 0x85, 0xbb, 0xad, 0x2f, + 0x64, 0xad, 0x49, 0xd5, 0xa8, 0xff, 0x4d, 0x0e, 0x2e, 0x46, 0xb5, 0xf8, 0x93, 0x60, 0x3b, 0xfe, + 0xb9, 0x3c, 0x9c, 0xbb, 0x8d, 0xc2, 0x09, 0x1c, 0x39, 0x4e, 0xe6, 0x2d, 0x31, 0x38, 0x53, 0x64, + 0x73, 0x62, 0x51, 0x66, 0xcb, 0xe6, 0x64, 0x52, 0x17, 0xb2, 0xf9, 0xaf, 0x73, 0x70, 0x66, 0xa1, + 0x56, 0x9d, 0xfc, 0x84, 0x8c, 0xa8, 0xe4, 0xf7, 0x1c, 0x71, 0x83, 0x33, 0xf1, 0x3d, 0x47, 0xdc, + 0xf4, 0xfc, 0x56, 0x1e, 0xce, 0xd4, 0x2b, 0x73, 0xb3, 0x9f, 0x94, 0x19, 0x7c, 0x52, 0xf6, 0x3a, + 0xf4, 0x0f, 0xc1, 0x84, 0x2d, 0x20, 0x7f, 0xe6, 0xfd, 0x9b, 0xd9, 0xde, 0x88, 0x49, 0xa1, 0x1c, + 0xf1, 0xa9, 0xfb, 0x40, 0x84, 0xc2, 0x34, 0x3f, 0x42, 0x7d, 0xc4, 0x35, 0xff, 0x3f, 0x2f, 0xc1, + 0xd0, 0xdd, 0xee, 0x32, 0x15, 0xce, 0x29, 0xc7, 0xfa, 0xe4, 0xf7, 0x26, 0x0c, 0x09, 0x31, 0xe0, + 0xad, 0x89, 0x14, 0x3c, 0x4f, 0x04, 0x43, 0xe1, 0xf1, 0x89, 0x64, 0x22, 0x72, 0x19, 0x8a, 0xf7, + 0xa9, 0xb3, 0x2c, 0xbf, 0x2b, 0x7d, 0x44, 0x9d, 0x65, 0x0d, 0xa1, 0x64, 0x36, 0x74, 0x99, 0xaf, + 0x2c, 0xd6, 0x30, 0x91, 0x8a, 0xb8, 0xb0, 0xc1, 0xcc, 0x30, 0x81, 0xdf, 0x9b, 0xde, 0x31, 0x79, + 0x0a, 0x16, 0xf9, 0x4d, 0x7b, 0xbc, 0x24, 0x99, 0x87, 0xd3, 0xb2, 0xe3, 0x13, 0xcf, 0x22, 0x52, + 0x4e, 0x61, 0x97, 0x96, 0x3f, 0x24, 0x59, 0x94, 0xbc, 0x0d, 0xc3, 0x3e, 0x10, 0x5d, 0xb8, 0x06, + 0xc3, 0xd0, 0xf5, 0x01, 0xab, 0x58, 0x8a, 0xa2, 0x48, 0x01, 0x99, 0x01, 0x5e, 0x43, 0x40, 0x0a, + 0x83, 0x98, 0x4b, 0x5c, 0xa4, 0x00, 0x79, 0x19, 0x19, 0xe0, 0x33, 0x0f, 0x74, 0x56, 0x19, 0xc2, + 0x47, 0x97, 0xe8, 0x92, 0xef, 0x08, 0x38, 0x7f, 0x5a, 0x1b, 0x21, 0x23, 0x0b, 0x00, 0xa1, 0x53, + 0x81, 0x08, 0x60, 0xb0, 0x6b, 0x77, 0x07, 0x89, 0x85, 0x7c, 0x1d, 0x38, 0xb2, 0x97, 0xeb, 0x40, + 0xf5, 0x1f, 0xe4, 0x61, 0xa8, 0xd2, 0xe9, 0x04, 0x43, 0xe1, 0x05, 0x28, 0x55, 0x3a, 0x9d, 0x7b, + 0x5a, 0x4d, 0x0e, 0x65, 0xae, 0x77, 0x3a, 0x8d, 0xae, 0x63, 0xca, 0x3e, 0xa1, 0x9c, 0x88, 0x4c, + 0xc2, 0x48, 0xa5, 0xd3, 0x59, 0xec, 0x2e, 0xb7, 0xcc, 0xa6, 0x94, 0x19, 0x89, 0xe7, 0x8e, 0xeb, + 0x74, 0x1a, 0x1d, 0xc4, 0xc4, 0xd3, 0x63, 0x45, 0xcb, 0x90, 0xaf, 0x62, 0xd8, 0x1f, 0x91, 0x98, + 0x87, 0xa7, 0xfe, 0x50, 0x83, 0x20, 0xe6, 0x61, 0xdb, 0xae, 0x07, 0x44, 0x3c, 0xd8, 0xfb, 0x65, + 0x3f, 0x64, 0x3e, 0xab, 0x28, 0x91, 0x80, 0x27, 0x64, 0x49, 0x3e, 0x07, 0x03, 0x95, 0x4e, 0x47, + 0xba, 0x6f, 0x42, 0xa7, 0x22, 0x56, 0x2a, 0x9e, 0xfb, 0x4c, 0x90, 0x5d, 0x7a, 0x13, 0x46, 0xa3, + 0x95, 0xed, 0x2a, 0x58, 0xfc, 0x0f, 0x72, 0xf8, 0x41, 0x47, 0xdc, 0xa7, 0xf9, 0x25, 0x28, 0x54, + 0x3a, 0x1d, 0x31, 0x1f, 0x9d, 0x49, 0xe9, 0x8f, 0xf8, 0x13, 0xe8, 0x4a, 0xa7, 0xe3, 0x7f, 0xfa, + 0x11, 0x7f, 0x1c, 0xb1, 0xa7, 0x4f, 0xff, 0x2e, 0xff, 0xf4, 0xa3, 0xfd, 0x70, 0x41, 0xfd, 0xad, + 0x02, 0x9c, 0xaa, 0x74, 0x3a, 0x27, 0x41, 0xe6, 0x0f, 0xea, 0xa1, 0xf5, 0x8b, 0x00, 0xd2, 0xf4, + 0x38, 0x10, 0x3c, 0xdd, 0x1a, 0x92, 0xa6, 0x46, 0x25, 0xa7, 0x49, 0x44, 0xbe, 0xfa, 0x95, 0x77, + 0xa5, 0x7e, 0x5f, 0x2b, 0xe0, 0x54, 0x7c, 0xd4, 0x83, 0x46, 0x7d, 0x5c, 0xba, 0x4d, 0xf4, 0x41, + 0x69, 0x57, 0x7d, 0xf0, 0x77, 0x22, 0x83, 0x07, 0x83, 0x96, 0x9f, 0xf4, 0x42, 0xff, 0xbe, 0xcc, + 0xe2, 0x51, 0x59, 0x98, 0x22, 0x92, 0x8d, 0x9f, 0x48, 0x49, 0xc4, 0x55, 0x6a, 0x32, 0x54, 0xc3, + 0x34, 0xb4, 0x18, 0xad, 0xdf, 0x87, 0x03, 0xbb, 0xea, 0xc3, 0xcd, 0x3c, 0xbe, 0x9d, 0x0e, 0xe2, + 0x32, 0xed, 0x7f, 0x77, 0x71, 0x03, 0x80, 0x7b, 0x1e, 0x04, 0x6e, 0xcd, 0x23, 0x3c, 0x04, 0x0b, + 0xcf, 0xaf, 0x24, 0x42, 0xb0, 0x84, 0x24, 0x81, 0x87, 0x54, 0x21, 0xd5, 0x43, 0xea, 0x1a, 0x94, + 0x35, 0x7d, 0xfd, 0x9d, 0x2e, 0x75, 0x36, 0x84, 0x39, 0xc3, 0xc3, 0x1e, 0xea, 0xeb, 0x8d, 0x1f, + 0x65, 0x40, 0x2d, 0x40, 0x13, 0x35, 0x78, 0x7c, 0x2f, 0x79, 0x84, 0xf0, 0x33, 0xf2, 0xe0, 0xc9, + 0xfd, 0x5e, 0x14, 0x9d, 0xbc, 0x0e, 0x85, 0xca, 0x83, 0xba, 0x90, 0x6c, 0xd0, 0xb5, 0x95, 0x07, + 0x75, 0x21, 0xaf, 0xcc, 0xb2, 0x0f, 0xea, 0xea, 0xd7, 0xf2, 0x40, 0x92, 0x94, 0xe4, 0x15, 0x18, + 0x44, 0xe8, 0x2a, 0xd3, 0x19, 0x39, 0x31, 0xe7, 0xba, 0xdb, 0x70, 0x10, 0x1a, 0x31, 0xee, 0x7c, + 0x52, 0xf2, 0x1a, 0xa6, 0x3e, 0x16, 0xa9, 0xe1, 0x22, 0x89, 0x39, 0xd7, 0x5d, 0x3f, 0x59, 0x70, + 0x2c, 0xf3, 0xb1, 0x20, 0x46, 0xbb, 0xf0, 0x41, 0x7d, 0xc6, 0x76, 0x3d, 0x21, 0x6a, 0x6e, 0x17, + 0xae, 0xbb, 0x98, 0x11, 0x36, 0x62, 0x17, 0x72, 0x32, 0xcc, 0x6a, 0xf5, 0xa0, 0xce, 0x9f, 0xa9, + 0x18, 0x9a, 0xdd, 0xf2, 0x0d, 0x4a, 0x9e, 0xd5, 0x6a, 0xdd, 0x6d, 0xf0, 0x27, 0x2e, 0x06, 0xe6, + 0x5c, 0x8e, 0x64, 0xb5, 0x8a, 0x94, 0x52, 0xbf, 0x5e, 0x86, 0xb1, 0xaa, 0xee, 0xe9, 0xcb, 0xba, + 0x4b, 0xa5, 0xdd, 0xf4, 0x29, 0x1f, 0xe6, 0x7f, 0x8e, 0x24, 0x07, 0x63, 0x39, 0xe5, 0x6b, 0xe2, + 0x05, 0xc8, 0x1b, 0x21, 0xdf, 0x20, 0xe7, 0xa8, 0x9c, 0xc4, 0x6c, 0xb9, 0xd1, 0x11, 0x60, 0x2d, + 0x41, 0x48, 0x9e, 0x87, 0x21, 0x1f, 0xc6, 0x36, 0x00, 0x85, 0x50, 0x67, 0x8c, 0x65, 0x66, 0xff, + 0x6b, 0x32, 0x9a, 0xbc, 0x06, 0xc3, 0xfe, 0x4f, 0xc9, 0xb4, 0xe6, 0x19, 0xd9, 0x96, 0x13, 0xbb, + 0x27, 0x99, 0x54, 0x2e, 0x8a, 0xf3, 0x5b, 0x7f, 0xa4, 0x68, 0x2c, 0xe9, 0x59, 0x84, 0x94, 0xfc, + 0x28, 0x8c, 0xfa, 0xbf, 0xc5, 0x86, 0x81, 0xe7, 0x87, 0x7b, 0x3e, 0x48, 0xe9, 0x1c, 0x13, 0xeb, + 0xf5, 0x28, 0x39, 0xdf, 0x3a, 0x3c, 0xe1, 0xe7, 0xf1, 0x32, 0x96, 0x93, 0x3b, 0x87, 0x58, 0x05, + 0xa4, 0x06, 0xa7, 0x7d, 0x48, 0xa8, 0xa1, 0x03, 0xe1, 0x8e, 0xd1, 0x58, 0x6e, 0xa4, 0x2a, 0x69, + 0xb2, 0x14, 0x69, 0xc1, 0xe5, 0x08, 0xd0, 0x70, 0xd7, 0xcc, 0x15, 0x4f, 0x6c, 0xf7, 0x44, 0x0c, + 0x62, 0x91, 0xb8, 0x31, 0xe0, 0xca, 0x69, 0xfc, 0x0c, 0xac, 0xd1, 0xec, 0x50, 0x3d, 0xb9, 0x91, + 0x3a, 0x9c, 0xf5, 0xf1, 0xb7, 0x27, 0x17, 0x17, 0x1d, 0xfb, 0x3d, 0xda, 0xf4, 0x6a, 0x55, 0xb1, + 0x5d, 0xc6, 0xd8, 0x74, 0xc6, 0x72, 0x63, 0xb5, 0xd9, 0x61, 0x4a, 0xc1, 0x70, 0x51, 0xe6, 0xa9, + 0x85, 0xc9, 0x7d, 0x38, 0x27, 0xc1, 0xa5, 0xf4, 0xd0, 0x10, 0xee, 0xe7, 0x05, 0xd7, 0xf4, 0x0c, + 0xd1, 0xe9, 0xc5, 0xc9, 0x9b, 0x30, 0xe2, 0x23, 0xf8, 0x2d, 0xe2, 0x10, 0xde, 0x22, 0xe2, 0x90, + 0x34, 0x96, 0x1b, 0xf1, 0xd7, 0x94, 0x51, 0x62, 0x59, 0xa3, 0x30, 0xa3, 0xfe, 0x70, 0x44, 0xa3, + 0xbc, 0x8d, 0x4e, 0xaa, 0x32, 0x62, 0x96, 0xfd, 0xb7, 0x43, 0x8d, 0x5a, 0x70, 0xcc, 0x55, 0x93, + 0xef, 0xa4, 0xfd, 0x07, 0x94, 0xcb, 0x0d, 0x1b, 0x81, 0x69, 0xfa, 0xc1, 0xc9, 0x2f, 0x55, 0xe0, + 0x4c, 0x8a, 0x8e, 0xed, 0x6a, 0xc7, 0xf8, 0x41, 0x3e, 0x6c, 0xc4, 0x11, 0xdf, 0x36, 0x4e, 0x40, + 0xd9, 0xff, 0x12, 0x61, 0x3c, 0x28, 0x59, 0x43, 0x33, 0xce, 0xc3, 0xc7, 0x47, 0xc4, 0x71, 0xc4, + 0xb7, 0x92, 0x07, 0x21, 0x8e, 0x0f, 0x73, 0xa1, 0x38, 0x8e, 0xf8, 0xf6, 0xf2, 0xa7, 0x8b, 0xe1, + 0x9c, 0x74, 0xb2, 0xc7, 0x3c, 0x28, 0x33, 0x39, 0xf4, 0x83, 0x2d, 0xed, 0xe2, 0x21, 0xa3, 0xac, + 0x9a, 0x03, 0x7b, 0x53, 0x4d, 0xf2, 0x26, 0x0c, 0x2d, 0xda, 0xae, 0xb7, 0xea, 0x50, 0x77, 0x31, + 0x88, 0xa1, 0x8f, 0x8f, 0x60, 0x3b, 0x02, 0xdc, 0xe8, 0x44, 0x66, 0x7f, 0x99, 0x5c, 0xfd, 0x47, + 0x85, 0x84, 0x36, 0x70, 0xc3, 0xf5, 0x48, 0x6a, 0xc3, 0x01, 0x0c, 0x75, 0x72, 0x33, 0x5c, 0x05, + 0xb9, 0x85, 0xdf, 0x2f, 0x05, 0x08, 0x5c, 0x16, 0x06, 0x7e, 0x94, 0x84, 0xfc, 0x10, 0x5c, 0x88, + 0x00, 0x16, 0x75, 0x47, 0x6f, 0x53, 0x2f, 0xcc, 0x57, 0x88, 0x21, 0x9f, 0xfc, 0xd2, 0x8d, 0x4e, + 0x80, 0x96, 0x73, 0x20, 0x66, 0x70, 0x90, 0x54, 0x6b, 0x60, 0x17, 0x2e, 0xd6, 0x3f, 0x57, 0x08, + 0x0d, 0x9d, 0x68, 0xe8, 0x56, 0x8d, 0xba, 0xdd, 0x96, 0x77, 0x7c, 0x3b, 0x78, 0x6f, 0x89, 0x31, + 0x66, 0xe0, 0x54, 0x65, 0x65, 0x85, 0x36, 0x3d, 0x3f, 0x22, 0xb5, 0x2b, 0x82, 0xf5, 0xf1, 0x8d, + 0x87, 0x40, 0x89, 0x08, 0xc3, 0x91, 0xcc, 0xfa, 0xb1, 0x62, 0xea, 0x3f, 0x2e, 0x82, 0x12, 0x18, + 0xfe, 0xc1, 0x33, 0xaf, 0x43, 0x5c, 0x64, 0x3f, 0x16, 0xbd, 0x62, 0xc2, 0xe9, 0x50, 0x18, 0xf5, + 0x6e, 0xbb, 0xad, 0xe3, 0xd0, 0x63, 0x1b, 0x8b, 0xf1, 0x38, 0xb3, 0x90, 0x90, 0xef, 0x25, 0x2e, + 0x89, 0xbd, 0x04, 0x09, 0x9f, 0xd1, 0x35, 0x5c, 0xce, 0x42, 0x4b, 0x72, 0x25, 0xdf, 0xc8, 0xc1, + 0x59, 0xbf, 0x53, 0x16, 0x96, 0x99, 0x51, 0x3d, 0x69, 0x77, 0x2d, 0xcf, 0xdf, 0xc7, 0xbc, 0x9e, + 0x5d, 0x1d, 0xef, 0xa4, 0xeb, 0x69, 0x85, 0x79, 0x4b, 0x82, 0xb0, 0x14, 0x81, 0x42, 0xd8, 0x48, + 0xd3, 0x68, 0x22, 0x91, 0x96, 0x5a, 0xef, 0xa5, 0xdb, 0x70, 0x31, 0x93, 0xe5, 0x76, 0x46, 0x6c, + 0xbf, 0x6c, 0xc4, 0xfe, 0x77, 0xb9, 0x70, 0x22, 0x8a, 0x09, 0x89, 0x5c, 0x07, 0x08, 0x41, 0x62, + 0x5b, 0x3b, 0xba, 0xb5, 0x39, 0x0e, 0xa1, 0xd0, 0x34, 0x89, 0x82, 0x2c, 0x40, 0x49, 0x88, 0x85, + 0xe7, 0x06, 0xfe, 0xec, 0x36, 0xbd, 0x70, 0x5d, 0x96, 0x03, 0x6e, 0x59, 0xc5, 0x37, 0x0b, 0x36, + 0x97, 0x5e, 0x83, 0xa1, 0xbd, 0x7e, 0xd7, 0x37, 0x0a, 0x40, 0xe4, 0x3d, 0xe8, 0x21, 0x1a, 0xe8, + 0x47, 0x78, 0x0a, 0xbb, 0x0a, 0x65, 0xf6, 0x09, 0x98, 0x2d, 0x43, 0x8a, 0x8e, 0xdb, 0x15, 0x30, + 0x2d, 0xc0, 0x86, 0xa1, 0xa9, 0x06, 0xd2, 0x43, 0x53, 0xa9, 0x3f, 0x5b, 0x80, 0xf3, 0x72, 0x87, + 0x54, 0x29, 0x06, 0xdc, 0x3f, 0xe9, 0x94, 0x8f, 0xb0, 0x53, 0x54, 0x28, 0xf1, 0xad, 0x87, 0xc8, + 0x7c, 0xc0, 0x8f, 0x85, 0x10, 0xa2, 0x09, 0x8c, 0xfa, 0x3f, 0xe7, 0x61, 0x24, 0x30, 0xef, 0x74, + 0xc7, 0x3d, 0xc6, 0xdd, 0xf1, 0x79, 0x18, 0xc1, 0xe0, 0x42, 0x6d, 0x6a, 0xf1, 0x00, 0x3c, 0xfd, 0x52, 0xaa, 0x12, 0x1f, 0x21, 0xb2, 0x52, 0x45, 0x08, 0x99, 0xf6, 0x73, 0xcb, 0x4f, 0x0a, 0xf9, - 0xc4, 0xcd, 0x3e, 0x0e, 0x57, 0xff, 0x62, 0x01, 0x46, 0x7c, 0x29, 0x4f, 0x9a, 0xc7, 0xf5, 0x9e, - 0xe7, 0x68, 0x85, 0x7c, 0x13, 0x60, 0xc9, 0x76, 0x3c, 0xbd, 0xb5, 0x10, 0x6a, 0x3e, 0x1e, 0x90, + 0xc4, 0xcd, 0x3e, 0x0e, 0x57, 0xff, 0x52, 0x01, 0x86, 0x7d, 0x29, 0x4f, 0x98, 0x47, 0xf5, 0x9e, + 0xe7, 0x70, 0x85, 0x7c, 0x03, 0x60, 0xd1, 0x76, 0x3c, 0xbd, 0x35, 0x1f, 0x6a, 0x3e, 0x1e, 0x90, 0x76, 0x10, 0xca, 0xcb, 0x48, 0x24, 0xb8, 0x7e, 0x85, 0x66, 0x35, 0x9f, 0x98, 0xf8, 0xfa, 0x15, - 0x40, 0x35, 0x89, 0x42, 0xfd, 0xdd, 0x3c, 0x9c, 0xf1, 0x3b, 0x69, 0xfa, 0x31, 0x6d, 0x74, 0x4f, - 0xf2, 0xdc, 0x14, 0x95, 0x76, 0xff, 0x8e, 0xd2, 0x56, 0xff, 0x2f, 0x69, 0x22, 0x99, 0x6a, 0xd9, - 0xa7, 0x13, 0xc9, 0xbf, 0x0e, 0x1d, 0x57, 0x7f, 0xac, 0x00, 0xe7, 0x7d, 0xa9, 0xcf, 0x74, 0x2d, - 0x3c, 0x5a, 0x98, 0xd2, 0x5b, 0xad, 0x93, 0xbc, 0x1b, 0x1f, 0xf6, 0x05, 0xb1, 0x28, 0xa2, 0xf5, - 0x89, 0x0c, 0x81, 0xab, 0x02, 0x5c, 0xb7, 0x4d, 0x43, 0x93, 0x89, 0xc8, 0x3b, 0x30, 0xe2, 0xff, - 0x2c, 0x3b, 0x4d, 0x7f, 0x0b, 0x8e, 0x17, 0x05, 0x41, 0x21, 0xdd, 0x89, 0x04, 0x25, 0x88, 0x14, - 0x50, 0xbf, 0x3a, 0x00, 0x97, 0x1f, 0x9a, 0x96, 0x61, 0x6f, 0xb8, 0x7e, 0x82, 0xc9, 0x63, 0x7f, - 0x50, 0x76, 0xd4, 0x89, 0x25, 0xdf, 0x85, 0x0b, 0x71, 0x91, 0x3a, 0x41, 0xd8, 0x6f, 0xd1, 0x3b, - 0x1b, 0x9c, 0xa0, 0xee, 0xa7, 0x9a, 0x14, 0xb7, 0x6d, 0x5a, 0x7a, 0xc9, 0x78, 0xae, 0xca, 0x81, - 0xdd, 0xe4, 0xaa, 0x7c, 0x1e, 0x4a, 0x15, 0xbb, 0xad, 0x9b, 0x7e, 0x78, 0x1a, 0x1c, 0xc5, 0x41, - 0xbd, 0x88, 0xd1, 0x04, 0x05, 0xe3, 0x2f, 0x2a, 0xc6, 0x2e, 0x1b, 0x0a, 0xf9, 0xfb, 0x05, 0x98, - 0x95, 0xa6, 0xc9, 0x44, 0xc4, 0x86, 0x51, 0x51, 0x9d, 0xb8, 0x1b, 0x03, 0xdc, 0x3c, 0xbd, 0xe2, - 0xcb, 0x28, 0x5b, 0xad, 0x6e, 0x44, 0xca, 0xf1, 0x6d, 0x14, 0x4f, 0xa1, 0x29, 0x3e, 0x86, 0xdf, - 0x92, 0x69, 0x51, 0xfe, 0x92, 0x10, 0x70, 0x92, 0x19, 0x4e, 0x0a, 0x01, 0x67, 0x19, 0x99, 0x88, - 0x4c, 0xc3, 0x59, 0x0c, 0xce, 0x1c, 0x6c, 0xa5, 0x98, 0x4a, 0x8c, 0xa0, 0x51, 0x89, 0x57, 0x2e, - 0x3c, 0x9e, 0x33, 0xfb, 0xb8, 0x7a, 0x43, 0xa0, 0xb5, 0x64, 0x09, 0xf2, 0x04, 0x14, 0x16, 0xe6, - 0xca, 0x78, 0x57, 0x33, 0xc8, 0x13, 0x23, 0x59, 0x2d, 0x5d, 0x63, 0xb0, 0xcb, 0x9f, 0x07, 0x92, - 0xfc, 0x9c, 0x3d, 0xdd, 0xc7, 0xfc, 0x57, 0xd2, 0x96, 0xef, 0xb8, 0x7b, 0xd4, 0x1c, 0xc6, 0x44, - 0x18, 0xc9, 0x49, 0xd6, 0xff, 0x61, 0xe6, 0x24, 0x2b, 0x1d, 0x6a, 0x4e, 0x32, 0xf5, 0x57, 0x73, - 0x70, 0x36, 0x11, 0xc0, 0x9c, 0xbc, 0x0c, 0xc0, 0x21, 0x52, 0xa0, 0x48, 0x8c, 0xbc, 0x12, 0x06, - 0x35, 0x17, 0xcb, 0x63, 0x48, 0x46, 0x6e, 0xc2, 0x20, 0xff, 0x25, 0x82, 0x3b, 0x25, 0x8b, 0x74, - 0xbb, 0xa6, 0xa1, 0x05, 0x44, 0x61, 0x2d, 0x78, 0x23, 0x59, 0x48, 0x2d, 0xe2, 0x6d, 0x76, 0x82, - 0x5a, 0x18, 0x99, 0xfa, 0xf5, 0x3c, 0x8c, 0x04, 0x0d, 0x2e, 0x1b, 0x47, 0xa5, 0x73, 0x25, 0x11, - 0x0b, 0xbe, 0xb0, 0x53, 0x2c, 0xf8, 0xd8, 0x7c, 0x2b, 0x82, 0xbf, 0x1f, 0xde, 0x83, 0xaa, 0x6f, - 0xe6, 0xe1, 0x4c, 0x50, 0xeb, 0x11, 0x5e, 0x7e, 0x7d, 0x84, 0x44, 0xf2, 0x8d, 0x1c, 0x28, 0x93, - 0x66, 0xab, 0x65, 0x5a, 0xcd, 0xaa, 0xb5, 0x6a, 0x3b, 0x6d, 0x9c, 0x10, 0x8f, 0xee, 0x08, 0x57, - 0xfd, 0x13, 0x39, 0x38, 0x2b, 0x1a, 0x34, 0xa5, 0x3b, 0xc6, 0xd1, 0x9d, 0x8f, 0xc5, 0x5b, 0x72, - 0x74, 0xfa, 0xa2, 0x7e, 0x3b, 0x0f, 0x30, 0x67, 0x37, 0xd6, 0x8f, 0xf9, 0x7b, 0xac, 0x37, 0xa1, - 0xc4, 0x23, 0x6c, 0x09, 0x8d, 0x3d, 0x2b, 0xde, 0x1d, 0xb1, 0x4f, 0xe3, 0x88, 0xc9, 0x71, 0x31, + 0x40, 0x35, 0x89, 0x42, 0xfd, 0xbd, 0x3c, 0x9c, 0xf2, 0x3b, 0x69, 0xea, 0x31, 0x6d, 0x76, 0x8f, + 0xf3, 0xdc, 0x14, 0x95, 0x76, 0xff, 0xb6, 0xd2, 0x56, 0xff, 0x4f, 0x69, 0x22, 0x99, 0x6c, 0xd9, + 0x27, 0x13, 0xc9, 0xbf, 0x0a, 0x1d, 0x57, 0x7f, 0xbc, 0x00, 0x67, 0x7d, 0xa9, 0x4f, 0x77, 0x2d, + 0x3c, 0x5a, 0x98, 0xd4, 0x5b, 0xad, 0xe3, 0xbc, 0x1b, 0x1f, 0xf2, 0x05, 0xb1, 0x20, 0xa2, 0xf5, + 0x89, 0x0c, 0x81, 0x2b, 0x02, 0xdc, 0xb0, 0x4d, 0x43, 0x93, 0x89, 0xc8, 0xdb, 0x30, 0xec, 0xff, + 0xac, 0x38, 0xab, 0xfe, 0x16, 0x1c, 0x2f, 0x0a, 0x82, 0x42, 0xba, 0x13, 0x09, 0x4a, 0x10, 0x29, + 0xa0, 0x7e, 0x6d, 0x00, 0x2e, 0x3d, 0x30, 0x2d, 0xc3, 0x5e, 0x77, 0xfd, 0x04, 0x93, 0x47, 0xfe, + 0xa0, 0xec, 0xb0, 0x13, 0x4b, 0xbe, 0x03, 0xe7, 0xe2, 0x22, 0x75, 0x82, 0xb0, 0xdf, 0xa2, 0x77, + 0xd6, 0x39, 0x41, 0xc3, 0x4f, 0x35, 0x29, 0x6e, 0xdb, 0xb4, 0xf4, 0x92, 0xf1, 0x5c, 0x95, 0x03, + 0x3b, 0xc9, 0x55, 0xf9, 0x1c, 0x94, 0xaa, 0x76, 0x5b, 0x37, 0xfd, 0xf0, 0x34, 0x38, 0x8a, 0x83, + 0x7a, 0x11, 0xa3, 0x09, 0x0a, 0xc6, 0x5f, 0x54, 0x8c, 0x5d, 0x36, 0x18, 0xf2, 0xf7, 0x0b, 0x30, + 0x2b, 0x4d, 0x93, 0x89, 0x88, 0x0d, 0x23, 0xa2, 0x3a, 0x71, 0x37, 0x06, 0xb8, 0x79, 0x7a, 0xd9, + 0x97, 0x51, 0xb6, 0x5a, 0x5d, 0x8f, 0x94, 0xe3, 0xdb, 0x28, 0x9e, 0x42, 0x53, 0x7c, 0x0c, 0xbf, + 0x25, 0xd3, 0xa2, 0xfc, 0x25, 0x21, 0xe0, 0x24, 0x33, 0x94, 0x14, 0x02, 0xce, 0x32, 0x32, 0x11, + 0x99, 0x82, 0xd3, 0x18, 0x9c, 0x39, 0xd8, 0x4a, 0x31, 0x95, 0x18, 0x46, 0xa3, 0x12, 0xaf, 0x5c, + 0x78, 0x3c, 0x67, 0xf6, 0x71, 0x8d, 0xa6, 0x40, 0x6b, 0xc9, 0x12, 0xe4, 0x22, 0x14, 0xe6, 0x67, + 0x2b, 0x78, 0x57, 0x53, 0xe6, 0x89, 0x91, 0xac, 0x96, 0xae, 0x31, 0xd8, 0xa5, 0x2f, 0x02, 0x49, + 0x7e, 0xce, 0xae, 0xee, 0x63, 0xfe, 0x4b, 0x69, 0xcb, 0x77, 0xd4, 0x3d, 0x6a, 0x0e, 0x62, 0x22, + 0x8c, 0xe4, 0x24, 0xeb, 0xff, 0x28, 0x73, 0x92, 0x95, 0x0e, 0x34, 0x27, 0x99, 0xfa, 0x6b, 0x39, + 0x38, 0x9d, 0x08, 0x60, 0x4e, 0x5e, 0x02, 0xe0, 0x10, 0x29, 0x50, 0x24, 0x46, 0x5e, 0x09, 0x83, + 0x9a, 0x8b, 0xe5, 0x31, 0x24, 0x23, 0x37, 0xa0, 0xcc, 0x7f, 0x89, 0xe0, 0x4e, 0xc9, 0x22, 0xdd, + 0xae, 0x69, 0x68, 0x01, 0x51, 0x58, 0x0b, 0xde, 0x48, 0x16, 0x52, 0x8b, 0x78, 0x1b, 0x9d, 0xa0, + 0x16, 0x46, 0xa6, 0x7e, 0x3d, 0x0f, 0xc3, 0x41, 0x83, 0x2b, 0xc6, 0x61, 0xe9, 0x5c, 0x49, 0xc4, + 0x82, 0x2f, 0x6c, 0x17, 0x0b, 0x3e, 0x36, 0xdf, 0x8a, 0xe0, 0xef, 0x07, 0xf7, 0xa0, 0xea, 0x9b, + 0x79, 0x38, 0x15, 0xd4, 0x7a, 0x88, 0x97, 0x5f, 0x1f, 0x23, 0x91, 0x7c, 0x23, 0x07, 0xca, 0x84, + 0xd9, 0x6a, 0x99, 0xd6, 0x6a, 0xcd, 0x5a, 0xb1, 0x9d, 0x36, 0x4e, 0x88, 0x87, 0x77, 0x84, 0xab, + 0xfe, 0xa9, 0x1c, 0x9c, 0x16, 0x0d, 0x9a, 0xd4, 0x1d, 0xe3, 0xf0, 0xce, 0xc7, 0xe2, 0x2d, 0x39, + 0x3c, 0x7d, 0x51, 0xbf, 0x9d, 0x07, 0x98, 0xb5, 0x9b, 0x0f, 0x8f, 0xf8, 0x7b, 0xac, 0x37, 0xa0, + 0xc4, 0x23, 0x6c, 0x09, 0x8d, 0x3d, 0x2d, 0xde, 0x1d, 0xb1, 0x4f, 0xe3, 0x88, 0x89, 0x31, 0x31, 0x1f, 0x97, 0x78, 0x84, 0x2e, 0x25, 0xa7, 0x89, 0x22, 0xac, 0x52, 0x46, 0x27, 0x16, 0x8c, 0xa0, - 0x52, 0x06, 0x8b, 0x56, 0xba, 0xbd, 0x35, 0x51, 0x6c, 0xd9, 0x8d, 0x75, 0x0d, 0xe9, 0xd5, 0x7f, - 0x99, 0xe3, 0xb2, 0x3b, 0xe6, 0xaf, 0x4a, 0xfd, 0xcf, 0x2f, 0xee, 0xf1, 0xf3, 0xff, 0x64, 0x0e, - 0xce, 0x6b, 0xb4, 0x61, 0x3f, 0xa2, 0xce, 0xe6, 0x94, 0x6d, 0xd0, 0x3b, 0xd4, 0xa2, 0xce, 0x51, - 0x8d, 0xa8, 0xbf, 0x85, 0xc9, 0x33, 0xc2, 0xc6, 0xdc, 0x77, 0xa9, 0x71, 0x7c, 0x12, 0x9b, 0xa8, - 0xbf, 0x31, 0x00, 0x4a, 0xaa, 0xd5, 0x7b, 0x6c, 0xcd, 0xb9, 0xcc, 0xad, 0x4c, 0xf1, 0xb0, 0xb6, - 0x32, 0xfd, 0x7b, 0xdb, 0xca, 0x94, 0xf6, 0xba, 0x95, 0x19, 0xd8, 0xcd, 0x56, 0xa6, 0x1d, 0xdf, - 0xca, 0x0c, 0xe2, 0x56, 0xe6, 0xe5, 0x9e, 0x5b, 0x99, 0x69, 0xcb, 0xd8, 0xe7, 0x46, 0xe6, 0xd8, - 0x26, 0xdd, 0xdd, 0xcf, 0x0e, 0xec, 0x1a, 0x9b, 0x14, 0x1b, 0xb6, 0x63, 0x50, 0x43, 0x6c, 0xbc, - 0xf0, 0xd4, 0xdf, 0x11, 0x30, 0x2d, 0xc0, 0x26, 0x32, 0x18, 0x8f, 0xee, 0x26, 0x83, 0xf1, 0x21, - 0xec, 0xbf, 0xbe, 0x96, 0x87, 0xb3, 0x53, 0xd4, 0xf1, 0x78, 0x08, 0xcf, 0xc3, 0x70, 0x89, 0x2b, - 0xc3, 0x19, 0x89, 0x21, 0x5a, 0xe4, 0xf9, 0xd0, 0xcd, 0xaf, 0x41, 0x1d, 0x2f, 0xee, 0x25, 0x18, - 0xa7, 0x67, 0xd5, 0xfb, 0x59, 0xc4, 0xc4, 0xd8, 0x0d, 0xaa, 0xf7, 0xe1, 0x5c, 0x90, 0xa6, 0xf8, - 0xa5, 0x05, 0xf4, 0x52, 0x62, 0xb0, 0xe2, 0xde, 0x13, 0x83, 0xa9, 0xbf, 0x92, 0x83, 0xab, 0x1a, - 0xb5, 0xe8, 0x86, 0xbe, 0xd2, 0xa2, 0x52, 0xb3, 0xc4, 0xca, 0xc0, 0x66, 0x0d, 0xd3, 0x6d, 0xeb, - 0x5e, 0x63, 0xed, 0x40, 0x32, 0x9a, 0x81, 0x11, 0x79, 0xfe, 0xda, 0xc3, 0xdc, 0x16, 0x29, 0xa7, - 0xfe, 0x46, 0x11, 0x06, 0x26, 0x6d, 0xef, 0xae, 0x7d, 0xc0, 0x4c, 0x75, 0xe1, 0x94, 0x9f, 0xdf, - 0xc3, 0x59, 0xcf, 0x67, 0xb0, 0x72, 0x29, 0x78, 0x3f, 0xba, 0x90, 0xae, 0xd8, 0x89, 0x24, 0x07, - 0x3e, 0xd9, 0x1e, 0x73, 0xd4, 0xbd, 0x0a, 0x43, 0x18, 0xfd, 0x45, 0x3a, 0x8d, 0x45, 0x07, 0x6d, - 0x8f, 0x01, 0xe3, 0x75, 0x84, 0xa4, 0xe4, 0x87, 0x22, 0x31, 0x47, 0x4b, 0x07, 0xcf, 0x69, 0x27, - 0x87, 0x1f, 0x7d, 0x99, 0x5f, 0xe4, 0x61, 0x9b, 0xa4, 0xfc, 0x1f, 0x78, 0x8a, 0x12, 0x6b, 0x52, - 0x40, 0x78, 0x88, 0xf9, 0xe6, 0xa6, 0x60, 0x74, 0xd2, 0xf6, 0x24, 0x67, 0xe0, 0xa1, 0xf0, 0x19, - 0x28, 0x93, 0x7c, 0xba, 0x27, 0x70, 0xb4, 0x8c, 0xfa, 0x47, 0x45, 0x18, 0xf1, 0x7f, 0x1e, 0x91, - 0xee, 0xbc, 0x08, 0xa5, 0x59, 0x5b, 0x4a, 0x81, 0x80, 0x0e, 0xc4, 0x6b, 0xb6, 0x1b, 0xf3, 0x8c, - 0x16, 0x44, 0x4c, 0xea, 0x0b, 0xb6, 0x21, 0xbb, 0xbf, 0xa3, 0xd4, 0x2d, 0xdb, 0x48, 0x3c, 0x1f, - 0x0e, 0x08, 0xc9, 0x55, 0x28, 0xe2, 0xcb, 0x01, 0xe9, 0x20, 0x3f, 0xf6, 0x5a, 0x00, 0xf1, 0x92, - 0x56, 0x96, 0xf6, 0xaa, 0x95, 0x03, 0xfb, 0xd5, 0xca, 0xc1, 0xc3, 0xd5, 0xca, 0xf7, 0x60, 0x04, - 0x6b, 0xf2, 0x33, 0xa8, 0xed, 0xbc, 0xb0, 0x3e, 0x21, 0xd6, 0xbe, 0x51, 0xde, 0x6e, 0x91, 0x47, - 0x0d, 0x97, 0xbc, 0x08, 0xab, 0x98, 0xee, 0xc2, 0x01, 0xb6, 0xd3, 0xff, 0x28, 0x07, 0x03, 0xf7, - 0xad, 0x75, 0xcb, 0xde, 0x38, 0x98, 0xc6, 0xbd, 0x0c, 0xc3, 0x82, 0x8d, 0xb4, 0xba, 0xe0, 0x8b, - 0xf0, 0x2e, 0x07, 0xd7, 0x91, 0x93, 0x26, 0x53, 0x91, 0xb7, 0x82, 0x42, 0xf8, 0x38, 0xa8, 0x10, - 0x26, 0x11, 0xf1, 0x0b, 0x35, 0xa2, 0x79, 0x0f, 0x64, 0x72, 0x72, 0x05, 0x8a, 0x15, 0xd6, 0x54, - 0x29, 0x8a, 0x2e, 0x6b, 0x8a, 0x86, 0x50, 0xf5, 0x6b, 0x45, 0x18, 0x8b, 0x1d, 0x7c, 0x3d, 0x0f, - 0x43, 0xe2, 0xe0, 0xc9, 0xf4, 0x13, 0x31, 0xe0, 0xe3, 0xa1, 0x00, 0xa8, 0x0d, 0xf2, 0x3f, 0xab, - 0x06, 0xf9, 0x1c, 0x0c, 0xd8, 0x2e, 0x2e, 0x8a, 0xf8, 0x2d, 0x63, 0xe1, 0x10, 0x5a, 0xac, 0xb1, - 0xb6, 0xf3, 0xc1, 0x21, 0x48, 0x64, 0x8d, 0xb4, 0x5d, 0xfc, 0xb4, 0xdb, 0x30, 0xa4, 0xbb, 0x2e, - 0xf5, 0xea, 0x9e, 0xde, 0x94, 0x73, 0x33, 0x04, 0x40, 0x79, 0x74, 0x20, 0x70, 0x59, 0x6f, 0x92, - 0xcf, 0xc3, 0x68, 0xc3, 0xa1, 0xb8, 0x6c, 0xea, 0x2d, 0xd6, 0x4a, 0xc9, 0xac, 0x8d, 0x20, 0xe4, - 0xfb, 0x93, 0x10, 0x51, 0x35, 0xc8, 0x03, 0x18, 0x15, 0x9f, 0xc3, 0x3d, 0xf7, 0x71, 0xa0, 0x8d, - 0x85, 0xcb, 0x18, 0x17, 0x09, 0xf7, 0xdd, 0x17, 0x0f, 0x38, 0x64, 0x72, 0x99, 0xaf, 0x21, 0x91, - 0x92, 0x45, 0x20, 0x1b, 0x74, 0xa5, 0xae, 0x77, 0xbd, 0x35, 0x56, 0x17, 0x0f, 0x2d, 0x2e, 0x52, - 0x12, 0xe2, 0xab, 0x87, 0x24, 0x56, 0x7e, 0x0c, 0xb2, 0x41, 0x57, 0xca, 0x11, 0x24, 0x79, 0x08, - 0x17, 0x92, 0x45, 0xd8, 0x27, 0xf3, 0xcb, 0x81, 0xe7, 0xb6, 0xb7, 0x26, 0x26, 0x52, 0x09, 0x24, - 0xb6, 0xe7, 0x12, 0x6c, 0xab, 0xc6, 0xdd, 0xe2, 0xe0, 0xc0, 0xf8, 0xa0, 0x36, 0xc6, 0xca, 0xfa, - 0x26, 0xa4, 0x69, 0xa8, 0xbf, 0x97, 0x63, 0xa6, 0x22, 0xfb, 0x20, 0xcc, 0xc9, 0xcc, 0x74, 0xbd, - 0xbd, 0x47, 0x5d, 0x6f, 0x87, 0xd9, 0x13, 0x4b, 0x6e, 0x8f, 0xd9, 0x55, 0x13, 0x58, 0x72, 0x03, - 0x4a, 0x86, 0x7c, 0x6a, 0x76, 0x31, 0xda, 0x09, 0x7e, 0x3d, 0x9a, 0xa0, 0x22, 0xd7, 0xa0, 0xc8, - 0x96, 0xac, 0xf8, 0x96, 0x59, 0xb6, 0x2e, 0x34, 0xa4, 0x50, 0x7f, 0x34, 0x0f, 0x23, 0xd2, 0xd7, - 0xdc, 0x3a, 0xd0, 0xe7, 0xbc, 0xb1, 0xbb, 0x66, 0xfa, 0x4e, 0x2f, 0xb8, 0x97, 0xf2, 0x9b, 0x7c, - 0x3b, 0x10, 0xc5, 0xae, 0x2e, 0xa4, 0x84, 0x60, 0x5e, 0x15, 0x1f, 0x5a, 0xda, 0xfd, 0xf6, 0x91, - 0xd1, 0xdf, 0x2d, 0x0e, 0xe6, 0xc7, 0x0b, 0x77, 0x8b, 0x83, 0xc5, 0xf1, 0x7e, 0x8c, 0xc3, 0x85, - 0xa1, 0xaf, 0xf9, 0xde, 0xdc, 0x5a, 0x35, 0x9b, 0xc7, 0xfc, 0xed, 0xc8, 0xe1, 0xc6, 0x28, 0x8b, - 0xc9, 0xe6, 0x98, 0x3f, 0x24, 0xf9, 0x50, 0x65, 0x73, 0x9a, 0x6d, 0x51, 0xc8, 0xe6, 0x1f, 0xe7, - 0x40, 0x49, 0x95, 0x4d, 0xf9, 0x88, 0xfc, 0x20, 0x0e, 0x2f, 0xe7, 0xe2, 0x1f, 0xe4, 0xe1, 0x6c, - 0xd5, 0xf2, 0x68, 0x93, 0xef, 0x18, 0x8f, 0xf9, 0x54, 0x71, 0x0f, 0x86, 0xa5, 0x8f, 0x11, 0x7d, - 0xfe, 0x64, 0xb0, 0x1f, 0x0f, 0x51, 0x19, 0x9c, 0xe4, 0xd2, 0x87, 0x98, 0xa6, 0x3d, 0x26, 0xe4, - 0x63, 0x3e, 0xe7, 0x1c, 0x0f, 0x21, 0x1f, 0xf3, 0xc9, 0xeb, 0x23, 0x2a, 0xe4, 0xff, 0x23, 0x07, - 0xe7, 0x52, 0x2a, 0x27, 0x57, 0x61, 0xa0, 0xd6, 0x5d, 0xc1, 0xb0, 0x5b, 0xb9, 0xd0, 0x63, 0xd8, - 0xed, 0xae, 0x60, 0xc4, 0x2d, 0xcd, 0x47, 0x92, 0x65, 0x7c, 0x5c, 0xbf, 0x58, 0xad, 0x4c, 0x09, - 0xa9, 0xaa, 0x52, 0x98, 0x00, 0x06, 0x4e, 0xfb, 0xb2, 0xe0, 0x01, 0xbe, 0x6d, 0x1a, 0x8d, 0xd8, - 0x03, 0x7c, 0x56, 0x86, 0xfc, 0x30, 0x0c, 0x95, 0x3f, 0xe8, 0x3a, 0x14, 0xf9, 0x72, 0x89, 0x7f, - 0x22, 0xe0, 0xeb, 0x23, 0xd2, 0x38, 0xf3, 0x58, 0x02, 0x8c, 0x22, 0xce, 0x3b, 0x64, 0xa8, 0x7e, - 0x3d, 0x07, 0x97, 0xb3, 0x5b, 0x47, 0x3e, 0x03, 0x03, 0x6c, 0x67, 0x5e, 0xd6, 0x16, 0xc4, 0xa7, - 0xf3, 0xfc, 0xa4, 0x76, 0x8b, 0xd6, 0x75, 0x47, 0x36, 0xf6, 0x7d, 0x32, 0xf2, 0x36, 0x0c, 0x57, - 0x5d, 0xb7, 0x4b, 0x9d, 0xda, 0xcb, 0xf7, 0xb5, 0xaa, 0xd8, 0x13, 0xe2, 0x9e, 0xc3, 0x44, 0x70, - 0xdd, 0x7d, 0x39, 0x16, 0x58, 0x4b, 0xa6, 0x57, 0x7f, 0x22, 0x07, 0x57, 0x7a, 0x7d, 0x15, 0x79, - 0x19, 0x06, 0x97, 0xa9, 0xa5, 0x5b, 0x5e, 0xb5, 0x22, 0x9a, 0x84, 0x5b, 0x2c, 0x0f, 0x61, 0xd1, - 0x9d, 0x42, 0x40, 0xc8, 0x0a, 0xf1, 0x73, 0xc5, 0xc0, 0x91, 0x81, 0x9f, 0x81, 0x22, 0x2c, 0x56, - 0xc8, 0x27, 0x54, 0x7f, 0x3f, 0x0f, 0x23, 0x4b, 0xad, 0x6e, 0xd3, 0x94, 0x16, 0x8e, 0x7d, 0xdb, - 0xdb, 0xbe, 0xf5, 0x9b, 0xdf, 0x9b, 0xf5, 0xcb, 0x86, 0x9b, 0xb3, 0xcf, 0xe1, 0xe6, 0x97, 0x23, - 0x6f, 0x41, 0xa9, 0x83, 0xdf, 0x11, 0x3f, 0x89, 0xe5, 0x5f, 0x97, 0x75, 0x12, 0xcb, 0xcb, 0xb0, - 0xf1, 0xd5, 0x38, 0xc0, 0xf8, 0x0a, 0xcb, 0x4a, 0x02, 0x0d, 0x17, 0x89, 0x53, 0x81, 0x1e, 0x8a, - 0x40, 0xc3, 0x05, 0xe1, 0x54, 0xa0, 0x07, 0x10, 0xe8, 0x6f, 0xe4, 0x61, 0x2c, 0x5a, 0x25, 0xf9, - 0x0c, 0x0c, 0xf3, 0x6a, 0xf8, 0xb9, 0x50, 0x4e, 0x72, 0x2a, 0x0e, 0xc1, 0x1a, 0xf0, 0x1f, 0xe2, - 0x80, 0xeb, 0xcc, 0x9a, 0xee, 0xd6, 0xc3, 0x13, 0x1a, 0x7e, 0x7f, 0x3b, 0xc8, 0x3d, 0xa1, 0x62, - 0x28, 0x6d, 0x6c, 0x4d, 0x77, 0xa7, 0xc2, 0xdf, 0x64, 0x1a, 0x88, 0x43, 0xbb, 0x2e, 0x8d, 0x32, - 0x28, 0x22, 0x03, 0x91, 0x1c, 0x3a, 0x8e, 0xd5, 0xce, 0x72, 0x98, 0xcc, 0xe6, 0x4b, 0x41, 0xb3, - 0x51, 0x19, 0xfa, 0x77, 0x91, 0xb9, 0x5a, 0xa2, 0x4f, 0x3f, 0xe6, 0xe4, 0x04, 0x15, 0xdd, 0xd3, - 0xf9, 0xa6, 0xdc, 0xef, 0x00, 0xf5, 0xa7, 0xbe, 0x02, 0xfd, 0x8b, 0x16, 0x5d, 0x5c, 0x25, 0x2f, - 0xc1, 0x10, 0x53, 0x98, 0x39, 0x9b, 0xf5, 0x65, 0x4e, 0xf8, 0x4f, 0x48, 0x9a, 0x84, 0x88, 0xd9, - 0x3e, 0x2d, 0xa4, 0x22, 0xb7, 0x79, 0xf6, 0x7b, 0x3e, 0xc7, 0x0a, 0xed, 0x23, 0x72, 0x19, 0x8e, - 0x99, 0xed, 0xd3, 0x24, 0x3a, 0xbf, 0x94, 0x78, 0xa0, 0x53, 0x48, 0x96, 0xe2, 0x18, 0xbf, 0x94, - 0x18, 0x1f, 0x73, 0x69, 0x89, 0xe5, 0xe3, 0xbb, 0xa7, 0x24, 0xc5, 0x6c, 0x9f, 0x96, 0x9e, 0x90, - 0x7e, 0x44, 0x76, 0x28, 0x8d, 0x3b, 0x7d, 0xc8, 0xb8, 0xd9, 0x3e, 0x2d, 0x42, 0x4b, 0x5e, 0x83, - 0x61, 0xf1, 0xfb, 0xae, 0x2d, 0x6e, 0x94, 0xa5, 0x58, 0x44, 0x12, 0x6a, 0xb6, 0x4f, 0x93, 0x29, - 0xa5, 0x4a, 0x97, 0x1c, 0xd3, 0xf2, 0xc4, 0x1b, 0xe5, 0x78, 0xa5, 0x88, 0x93, 0x2a, 0xc5, 0xdf, - 0xe4, 0x6d, 0x18, 0x0d, 0x82, 0x3c, 0xbd, 0x4f, 0x1b, 0x9e, 0x38, 0xfc, 0xbe, 0x10, 0x2b, 0xcc, - 0x91, 0xb3, 0x7d, 0x5a, 0x94, 0x9a, 0x5c, 0x83, 0x92, 0x46, 0x5d, 0xf3, 0x03, 0xff, 0xba, 0x78, - 0x4c, 0x1a, 0xe7, 0xe6, 0x07, 0x4c, 0x4a, 0x02, 0xcf, 0x7a, 0x27, 0xbc, 0x9f, 0x16, 0x47, 0xd5, - 0x24, 0x56, 0xcb, 0xb4, 0x65, 0xb0, 0xde, 0x91, 0x9c, 0x13, 0x3e, 0x1f, 0x86, 0xbe, 0x12, 0x09, - 0x33, 0x87, 0xe3, 0x31, 0x06, 0x64, 0xec, 0x6c, 0x9f, 0x16, 0xa3, 0x97, 0xa4, 0x5a, 0x31, 0xdd, - 0x75, 0x11, 0x6d, 0x34, 0x2e, 0x55, 0x86, 0x92, 0xa4, 0xca, 0x7e, 0x4a, 0x55, 0x2f, 0x50, 0x6f, - 0xc3, 0x76, 0xd6, 0x45, 0x6c, 0xd1, 0x78, 0xd5, 0x02, 0x2b, 0x55, 0x2d, 0x20, 0x72, 0xd5, 0x6c, - 0xc0, 0x8d, 0xa5, 0x57, 0xad, 0x7b, 0xba, 0x5c, 0x35, 0x3f, 0x89, 0xf3, 0x3b, 0x69, 0x8e, 0xea, - 0x8f, 0x78, 0xde, 0xf2, 0x64, 0x87, 0x22, 0x4e, 0xea, 0x50, 0xfc, 0xcd, 0x2a, 0x95, 0x72, 0x53, - 0x8b, 0xc4, 0xe4, 0x41, 0xa5, 0x12, 0x8a, 0x55, 0x2a, 0x67, 0xb1, 0xbe, 0x2d, 0xa7, 0x6c, 0x56, - 0xce, 0x46, 0x3b, 0x28, 0xc4, 0xb0, 0x0e, 0x92, 0x52, 0x3b, 0x4f, 0x60, 0x3a, 0x58, 0x85, 0x20, - 0xf9, 0x70, 0xd0, 0xc2, 0xa9, 0xa5, 0xd9, 0x3e, 0x0d, 0x13, 0xc5, 0xaa, 0x3c, 0xd1, 0xb0, 0x72, - 0x0e, 0x29, 0x46, 0x7c, 0x0a, 0x06, 0x9b, 0xed, 0xd3, 0x78, 0x12, 0xe2, 0x97, 0xa4, 0x94, 0x7e, - 0xca, 0xf9, 0xe8, 0x14, 0x11, 0x20, 0xd8, 0x14, 0x11, 0x26, 0xfe, 0x9b, 0x49, 0xa6, 0xbd, 0x53, - 0x2e, 0x44, 0x97, 0x9a, 0x38, 0x7e, 0xb6, 0x4f, 0x4b, 0xa6, 0xca, 0x7b, 0x2d, 0x92, 0x09, 0x4e, - 0xb9, 0x18, 0x0b, 0x00, 0x16, 0xa2, 0x98, 0xb8, 0xe4, 0x9c, 0x71, 0x8b, 0xb1, 0xac, 0xe5, 0x62, - 0xb2, 0xba, 0x14, 0xdd, 0xb8, 0xa4, 0x90, 0xcc, 0xf6, 0x69, 0x69, 0x25, 0xc9, 0x54, 0x22, 0x1f, - 0x9b, 0xa2, 0x44, 0x7d, 0x63, 0x62, 0xe8, 0xd9, 0x3e, 0x2d, 0x91, 0xc1, 0xed, 0xb6, 0x9c, 0x08, - 0x4d, 0x79, 0x22, 0xda, 0x89, 0x21, 0x86, 0x75, 0xa2, 0x94, 0x30, 0xed, 0xb6, 0x9c, 0x1c, 0x4b, - 0xb9, 0x9c, 0x2c, 0x15, 0xce, 0x9c, 0x52, 0x12, 0x2d, 0x2d, 0x3d, 0xdf, 0x8f, 0xf2, 0xa4, 0xc8, - 0xb8, 0x2a, 0xca, 0xa7, 0xd1, 0xcc, 0xf6, 0x69, 0xe9, 0xb9, 0x82, 0xb4, 0xf4, 0x44, 0x39, 0xca, - 0x95, 0x5e, 0x3c, 0x83, 0xd6, 0xa5, 0x27, 0xd9, 0xd1, 0x7b, 0xa4, 0x2d, 0x51, 0x9e, 0x8a, 0x46, - 0x1f, 0xce, 0x24, 0x9c, 0xed, 0xd3, 0x7a, 0x24, 0x3f, 0xb9, 0x9f, 0x91, 0x43, 0x44, 0x79, 0x3a, - 0x9a, 0x70, 0x39, 0x95, 0x68, 0xb6, 0x4f, 0xcb, 0xc8, 0x40, 0x72, 0x3f, 0x23, 0xc5, 0x84, 0x32, - 0xd1, 0x93, 0x6d, 0x20, 0x8f, 0x8c, 0x04, 0x15, 0x8b, 0xa9, 0xd9, 0x19, 0x94, 0x67, 0xa2, 0xaa, - 0x9b, 0x42, 0xc2, 0x54, 0x37, 0x2d, 0xaf, 0xc3, 0x62, 0x6a, 0x3a, 0x01, 0xe5, 0xd9, 0x1e, 0x0c, - 0x83, 0x36, 0xa6, 0x26, 0x22, 0x58, 0x4c, 0x8d, 0xe7, 0xaf, 0xa8, 0x51, 0x86, 0x29, 0x24, 0x8c, - 0x61, 0x5a, 0x26, 0x80, 0xc5, 0xd4, 0xb0, 0xef, 0xca, 0x73, 0x3d, 0x18, 0x86, 0x2d, 0x4c, 0x0b, - 0x18, 0xff, 0x5a, 0x24, 0xee, 0xba, 0xf2, 0x89, 0xe8, 0xbc, 0x21, 0xa1, 0xd8, 0xbc, 0x21, 0x47, - 0x68, 0x9f, 0x4a, 0x44, 0x96, 0x55, 0x3e, 0x19, 0x1d, 0xe6, 0x31, 0x34, 0x1b, 0xe6, 0xf1, 0x58, - 0xb4, 0x53, 0x89, 0x08, 0x9b, 0xca, 0xd5, 0x2c, 0x26, 0x88, 0x8e, 0x32, 0xe1, 0x31, 0x39, 0xab, - 0x29, 0x21, 0x1e, 0x95, 0x4f, 0x45, 0xfd, 0xba, 0x13, 0x04, 0xb3, 0x7d, 0x5a, 0x4a, 0x60, 0x48, - 0x2d, 0x3d, 0x9e, 0x91, 0x72, 0x2d, 0x3a, 0x6c, 0xd3, 0x68, 0xd8, 0xb0, 0x4d, 0x8d, 0x85, 0x34, - 0x97, 0xf6, 0xf8, 0x44, 0xb9, 0x1e, 0x35, 0xcc, 0x92, 0x14, 0xcc, 0x30, 0x4b, 0x79, 0xb4, 0xa2, - 0xa5, 0xc7, 0xd8, 0x51, 0x9e, 0xef, 0xd9, 0x42, 0xa4, 0x49, 0x69, 0x21, 0x0f, 0x39, 0x13, 0xda, - 0x4e, 0xf7, 0x3b, 0x2d, 0x5b, 0x37, 0x94, 0x4f, 0xa7, 0xda, 0x4e, 0x1c, 0x29, 0xd9, 0x4e, 0x1c, - 0xc0, 0x56, 0x79, 0xf9, 0x8d, 0x83, 0xf2, 0x42, 0x74, 0x95, 0x97, 0x71, 0x6c, 0x95, 0x8f, 0xbc, - 0x87, 0x98, 0x4a, 0xbc, 0x07, 0x50, 0x5e, 0x8c, 0x2a, 0x40, 0x0c, 0xcd, 0x14, 0x20, 0xfe, 0x82, - 0xe0, 0xcb, 0xd9, 0x1e, 0xf4, 0xca, 0x0d, 0xe4, 0xf6, 0x8c, 0xcf, 0x2d, 0x8b, 0x6e, 0xb6, 0x4f, - 0xcb, 0xf6, 0xc2, 0xaf, 0xa6, 0x38, 0xc4, 0x2b, 0x37, 0xa3, 0x0a, 0x96, 0x20, 0x60, 0x0a, 0x96, - 0x74, 0xa3, 0xaf, 0xa6, 0x78, 0xb4, 0x2b, 0x9f, 0xc9, 0x64, 0x15, 0x7c, 0x73, 0x8a, 0x1f, 0xfc, - 0x6d, 0xd9, 0x25, 0x5d, 0x79, 0x29, 0xba, 0xd8, 0x85, 0x18, 0xb6, 0xd8, 0x49, 0xae, 0xeb, 0xb7, - 0x65, 0x67, 0x6c, 0xe5, 0x56, 0xb2, 0x54, 0xb8, 0x44, 0x4a, 0x4e, 0xdb, 0x5a, 0xba, 0x0f, 0xb3, - 0xf2, 0x72, 0x54, 0xeb, 0xd2, 0x68, 0x98, 0xd6, 0xa5, 0xfa, 0x3f, 0xcf, 0x24, 0x5d, 0x91, 0x95, - 0xdb, 0xf1, 0x4d, 0x76, 0x14, 0xcf, 0x2c, 0x9f, 0x84, 0xfb, 0xf2, 0xe7, 0xe3, 0xc1, 0xf6, 0x94, - 0x57, 0x62, 0xd7, 0xbe, 0x11, 0x2c, 0xb3, 0x6f, 0x63, 0xc1, 0xf9, 0x3e, 0x1f, 0x8f, 0x4f, 0xa7, - 0xbc, 0x9a, 0xce, 0x21, 0xd0, 0x95, 0x78, 0x3c, 0xbb, 0xcf, 0xc7, 0x43, 0xba, 0x29, 0xaf, 0xa5, - 0x73, 0x08, 0xa4, 0x1b, 0x0f, 0x01, 0xf7, 0x92, 0x14, 0x64, 0x5e, 0xf9, 0x6c, 0xd4, 0x74, 0x0c, - 0x10, 0xcc, 0x74, 0x0c, 0x43, 0xd1, 0xbf, 0x24, 0x05, 0x67, 0x57, 0x5e, 0x4f, 0x14, 0x09, 0x1a, - 0x2b, 0x85, 0x70, 0x7f, 0x49, 0x0a, 0x6a, 0xae, 0xbc, 0x91, 0x28, 0x12, 0xb4, 0x4e, 0x0a, 0x7d, - 0x6e, 0xf4, 0x7a, 0xbf, 0xaa, 0xbc, 0x19, 0x3d, 0x0c, 0xce, 0xa6, 0x9c, 0xed, 0xd3, 0x7a, 0xbd, - 0x83, 0xfd, 0x72, 0xb6, 0x63, 0xb7, 0xf2, 0x56, 0x74, 0x08, 0x67, 0xd1, 0xb1, 0x21, 0x9c, 0xe9, - 0x1c, 0xfe, 0x76, 0x2c, 0x96, 0x85, 0xf2, 0x76, 0x74, 0x8a, 0x8b, 0x20, 0xd9, 0x14, 0x17, 0x8f, - 0x7c, 0x11, 0x09, 0xd2, 0xa0, 0x7c, 0x2e, 0x3a, 0xc5, 0xc9, 0x38, 0x36, 0xc5, 0x45, 0x02, 0x3a, - 0x4c, 0x25, 0x62, 0x07, 0x28, 0xef, 0x44, 0xa7, 0xb8, 0x18, 0x9a, 0x4d, 0x71, 0xf1, 0x68, 0x03, - 0x6f, 0xc7, 0x9e, 0xd0, 0x2b, 0x9f, 0x4f, 0x6f, 0x3f, 0x22, 0xe5, 0xf6, 0xf3, 0x07, 0xf7, 0x5a, - 0xfa, 0x5b, 0x70, 0xa5, 0x1c, 0x1d, 0xbf, 0x69, 0x34, 0x6c, 0xfc, 0xa6, 0xbe, 0x23, 0x8f, 0x6f, - 0x1c, 0x84, 0x56, 0x4d, 0xf6, 0xd8, 0x38, 0x84, 0xa6, 0x48, 0x0a, 0x38, 0xb2, 0x47, 0xe6, 0x1b, - 0xa1, 0xa9, 0x8c, 0x3d, 0xb2, 0xbf, 0x0d, 0x8a, 0xd1, 0xb3, 0xd9, 0x35, 0xe1, 0x67, 0xac, 0x54, - 0xa2, 0xb3, 0x6b, 0x82, 0x80, 0xcd, 0xae, 0x49, 0xef, 0xe4, 0x19, 0x18, 0x17, 0x5a, 0xc4, 0xdd, - 0xa7, 0x4d, 0xab, 0xa9, 0x4c, 0xc7, 0xde, 0x5b, 0xc6, 0xf0, 0x6c, 0x76, 0x8a, 0xc3, 0x70, 0xbd, - 0xe6, 0xb0, 0xa9, 0x96, 0xd9, 0x59, 0xb1, 0x75, 0xc7, 0xa8, 0x51, 0xcb, 0x50, 0x66, 0x62, 0xeb, - 0x75, 0x0a, 0x0d, 0xae, 0xd7, 0x29, 0x70, 0x0c, 0x11, 0x17, 0x83, 0x6b, 0xb4, 0x41, 0xcd, 0x47, - 0x54, 0xb9, 0x83, 0x6c, 0x27, 0xb2, 0xd8, 0x0a, 0xb2, 0xd9, 0x3e, 0x2d, 0x8b, 0x03, 0xb3, 0xd5, - 0xe7, 0x37, 0x6b, 0xef, 0xce, 0x05, 0xe1, 0x07, 0x96, 0x1c, 0xda, 0xd1, 0x1d, 0xaa, 0xcc, 0x46, - 0x6d, 0xf5, 0x54, 0x22, 0x66, 0xab, 0xa7, 0x22, 0x92, 0x6c, 0xfd, 0xb1, 0x50, 0xed, 0xc5, 0x36, - 0x1c, 0x11, 0xe9, 0xa5, 0xd9, 0xec, 0x14, 0x45, 0x30, 0x01, 0xcd, 0xd9, 0x56, 0x13, 0x4f, 0x2a, - 0xee, 0x46, 0x67, 0xa7, 0x6c, 0x4a, 0x36, 0x3b, 0x65, 0x63, 0x99, 0xaa, 0x47, 0xb1, 0x7c, 0x0c, - 0xde, 0x8b, 0xaa, 0x7a, 0x0a, 0x09, 0x53, 0xf5, 0x14, 0x70, 0x92, 0xa1, 0x46, 0x5d, 0xea, 0x29, - 0x73, 0xbd, 0x18, 0x22, 0x49, 0x92, 0x21, 0x82, 0x93, 0x0c, 0x67, 0xa8, 0xd7, 0x58, 0x53, 0xe6, - 0x7b, 0x31, 0x44, 0x92, 0x24, 0x43, 0x04, 0xb3, 0xcd, 0x66, 0x14, 0x3c, 0xd9, 0x6d, 0xad, 0xfb, - 0x7d, 0xb6, 0x10, 0xdd, 0x6c, 0x66, 0x12, 0xb2, 0xcd, 0x66, 0x26, 0x92, 0xfc, 0xc4, 0xae, 0xfd, - 0xe0, 0x95, 0x45, 0xac, 0xf0, 0x46, 0x68, 0x17, 0xec, 0xa6, 0xd4, 0x6c, 0x9f, 0xb6, 0x5b, 0x3f, - 0xfb, 0x4f, 0x07, 0x4e, 0xa3, 0xca, 0x12, 0x56, 0x75, 0x26, 0x38, 0xab, 0xe0, 0xe0, 0xd9, 0x3e, - 0x2d, 0x70, 0x2b, 0x7d, 0x0d, 0x86, 0xf1, 0xa3, 0xaa, 0x96, 0xe9, 0x55, 0x26, 0x95, 0x77, 0xa3, - 0x5b, 0x26, 0x09, 0xc5, 0xb6, 0x4c, 0xd2, 0x4f, 0x36, 0x89, 0xe3, 0x4f, 0x3e, 0xc5, 0x54, 0x26, - 0x15, 0x2d, 0x3a, 0x89, 0x47, 0x90, 0x6c, 0x12, 0x8f, 0x00, 0x82, 0x7a, 0x2b, 0x8e, 0xdd, 0xa9, - 0x4c, 0x2a, 0xb5, 0x94, 0x7a, 0x39, 0x2a, 0xa8, 0x97, 0xff, 0x0c, 0xea, 0xad, 0xad, 0x75, 0xbd, - 0x0a, 0xfb, 0xc6, 0xe5, 0x94, 0x7a, 0x7d, 0x64, 0x50, 0xaf, 0x0f, 0x60, 0x53, 0x21, 0x02, 0x96, - 0x1c, 0x9b, 0x4d, 0xda, 0xf7, 0xcc, 0x56, 0x4b, 0xb9, 0x1f, 0x9d, 0x0a, 0xe3, 0x78, 0x36, 0x15, - 0xc6, 0x61, 0xcc, 0xf4, 0xe4, 0xad, 0xa2, 0x2b, 0xdd, 0xa6, 0xf2, 0x20, 0x6a, 0x7a, 0x86, 0x18, - 0x66, 0x7a, 0x86, 0xbf, 0x70, 0x77, 0xc1, 0x7e, 0x69, 0x74, 0xd5, 0xa1, 0xee, 0x9a, 0xf2, 0x30, - 0xb6, 0xbb, 0x90, 0x70, 0xb8, 0xbb, 0x90, 0x7e, 0x93, 0x26, 0x3c, 0x19, 0x59, 0x68, 0xfc, 0x4b, - 0x9b, 0x1a, 0xd5, 0x9d, 0xc6, 0x9a, 0xf2, 0x05, 0x64, 0xf5, 0x5c, 0xea, 0x52, 0x15, 0x25, 0x9d, - 0xed, 0xd3, 0x7a, 0x71, 0xc2, 0x6d, 0xf9, 0xbb, 0x73, 0x3c, 0x12, 0xac, 0xb6, 0x34, 0xe5, 0x6f, - 0x42, 0xdf, 0x8b, 0x6d, 0xcb, 0x93, 0x24, 0xb8, 0x2d, 0x4f, 0x82, 0x49, 0x07, 0x9e, 0x8e, 0x6d, - 0xd5, 0xe6, 0xf5, 0x16, 0xdb, 0x97, 0x50, 0x63, 0x49, 0x6f, 0xac, 0x53, 0x4f, 0xf9, 0x22, 0xf2, - 0xbe, 0x9a, 0xb1, 0xe1, 0x8b, 0x51, 0xcf, 0xf6, 0x69, 0x3b, 0xf0, 0x23, 0x2a, 0x14, 0x6b, 0x33, - 0xcb, 0x4b, 0xca, 0x0f, 0x45, 0xcf, 0x37, 0x19, 0x6c, 0xb6, 0x4f, 0x43, 0x1c, 0xb3, 0xd2, 0xee, - 0x77, 0x9a, 0x8e, 0x6e, 0x50, 0x6e, 0x68, 0xa1, 0xed, 0x26, 0x0c, 0xd0, 0x1f, 0x8e, 0x5a, 0x69, - 0x59, 0x74, 0xcc, 0x4a, 0xcb, 0xc2, 0x31, 0x45, 0x8d, 0x24, 0x3d, 0x51, 0xbe, 0x14, 0x55, 0xd4, - 0x08, 0x92, 0x29, 0x6a, 0x34, 0x45, 0xca, 0x17, 0xe0, 0x62, 0xb0, 0x9f, 0x17, 0xeb, 0x2f, 0xef, - 0x34, 0xe5, 0xcb, 0xc8, 0xe7, 0xe9, 0xc4, 0x65, 0x40, 0x84, 0x6a, 0xb6, 0x4f, 0xcb, 0x28, 0xcf, - 0x56, 0xdc, 0x44, 0x3e, 0x2f, 0x61, 0x5e, 0xfc, 0x48, 0x74, 0xc5, 0xcd, 0x20, 0x63, 0x2b, 0x6e, - 0x06, 0x2a, 0x95, 0xb9, 0x10, 0xaa, 0xbe, 0x03, 0xf3, 0x40, 0xa6, 0x59, 0x1c, 0x52, 0x99, 0x0b, - 0x4b, 0x6d, 0x65, 0x07, 0xe6, 0x81, 0xb5, 0x96, 0xc5, 0x81, 0x5c, 0x83, 0x52, 0xad, 0x36, 0xaf, - 0x75, 0x2d, 0xa5, 0x11, 0xf3, 0x96, 0x45, 0xe8, 0x6c, 0x9f, 0x26, 0xf0, 0xcc, 0x0c, 0x9a, 0x6e, - 0xe9, 0xae, 0x67, 0x36, 0x5c, 0x1c, 0x31, 0xfe, 0x08, 0x31, 0xa2, 0x66, 0x50, 0x1a, 0x0d, 0x33, - 0x83, 0xd2, 0xe0, 0xcc, 0x5e, 0x9c, 0xd2, 0x5d, 0x57, 0xb7, 0x0c, 0x47, 0x9f, 0xc4, 0x65, 0x82, - 0xc6, 0x5e, 0x63, 0x45, 0xb0, 0xcc, 0x5e, 0x8c, 0x42, 0xf0, 0xf0, 0xdd, 0x87, 0xf8, 0x66, 0xce, - 0x6a, 0xec, 0xf0, 0x3d, 0x86, 0xc7, 0xc3, 0xf7, 0x18, 0x0c, 0xed, 0x4e, 0x1f, 0xa6, 0xd1, 0xa6, - 0xc9, 0x44, 0xa4, 0x34, 0x63, 0x76, 0x67, 0x9c, 0x00, 0xed, 0xce, 0x38, 0x30, 0xd2, 0x24, 0x7f, - 0xb9, 0x5d, 0xcb, 0x68, 0x52, 0xb8, 0xca, 0x26, 0xca, 0xb0, 0xf5, 0x3b, 0x1c, 0x1c, 0x95, 0x4d, - 0x4b, 0x6f, 0xdb, 0x95, 0x49, 0x5f, 0xea, 0x66, 0x74, 0xfd, 0xce, 0x24, 0x64, 0xeb, 0x77, 0x26, - 0x92, 0xcd, 0xae, 0xfe, 0x46, 0x6b, 0x4d, 0x77, 0xa8, 0x51, 0x31, 0x1d, 0x3c, 0x59, 0xdc, 0xe4, - 0x5b, 0xc3, 0xf7, 0xa3, 0xb3, 0x6b, 0x0f, 0x52, 0x36, 0xbb, 0xf6, 0x40, 0x33, 0x23, 0x2f, 0x1d, - 0xad, 0x51, 0xdd, 0x50, 0xd6, 0xa3, 0x46, 0x5e, 0x36, 0x25, 0x33, 0xf2, 0xb2, 0xb1, 0xd9, 0x9f, - 0xf3, 0xd0, 0x31, 0x3d, 0xaa, 0xb4, 0x76, 0xf3, 0x39, 0x48, 0x9a, 0xfd, 0x39, 0x88, 0x66, 0x1b, - 0xc2, 0x78, 0x87, 0xb4, 0xa3, 0x1b, 0xc2, 0x64, 0x37, 0xc4, 0x4b, 0x30, 0x8b, 0x45, 0x3c, 0xca, - 0x53, 0xac, 0xa8, 0xc5, 0x22, 0xc0, 0xcc, 0x62, 0x09, 0x9f, 0xed, 0x45, 0x9e, 0x62, 0x29, 0x76, - 0x74, 0x0d, 0x95, 0x71, 0x6c, 0x0d, 0x8d, 0x3c, 0xdb, 0x7a, 0x2d, 0xf2, 0xce, 0x40, 0xe9, 0x44, - 0xad, 0x0e, 0x09, 0xc5, 0xac, 0x0e, 0xf9, 0x45, 0xc2, 0x14, 0x9c, 0xc1, 0x5b, 0x70, 0xad, 0x1b, - 0xdc, 0xe3, 0x7c, 0x25, 0xfa, 0x99, 0x31, 0x34, 0xfb, 0xcc, 0x18, 0x28, 0xc2, 0x44, 0x4c, 0x5b, - 0x4e, 0x06, 0x93, 0xf0, 0x7c, 0x30, 0x06, 0x22, 0x73, 0x40, 0x6a, 0xe5, 0xf9, 0xb9, 0xaa, 0xb1, - 0x24, 0x5f, 0x91, 0xb9, 0xd1, 0x13, 0xd8, 0x24, 0xc5, 0x6c, 0x9f, 0x96, 0x52, 0x8e, 0xbc, 0x0f, - 0x57, 0x04, 0x54, 0xbc, 0xb8, 0xc6, 0xb4, 0xff, 0x46, 0xb0, 0x20, 0x78, 0x51, 0x3f, 0xb6, 0x5e, - 0xb4, 0xb3, 0x7d, 0x5a, 0x4f, 0x5e, 0xd9, 0x75, 0x89, 0xf5, 0xa1, 0xbb, 0x9b, 0xba, 0x82, 0x45, - 0xa2, 0x27, 0xaf, 0xec, 0xba, 0x84, 0xdc, 0x1f, 0xed, 0xa6, 0xae, 0xa0, 0x13, 0x7a, 0xf2, 0x22, - 0x2e, 0x4c, 0xf4, 0xc2, 0x97, 0x5b, 0x2d, 0x65, 0x03, 0xab, 0xfb, 0xd4, 0x6e, 0xaa, 0x2b, 0xa3, - 0xc1, 0xb9, 0x13, 0x47, 0x36, 0x4b, 0x2f, 0x76, 0xa8, 0x55, 0x8b, 0x2c, 0x40, 0x8f, 0xa3, 0xb3, - 0x74, 0x82, 0x80, 0xcd, 0xd2, 0x09, 0x20, 0x1b, 0x50, 0xf2, 0x73, 0x15, 0x65, 0x33, 0x3a, 0xa0, - 0x64, 0x1c, 0x1b, 0x50, 0x91, 0xa7, 0x2d, 0x8b, 0x70, 0x6e, 0x71, 0xdd, 0xd3, 0x7d, 0x0b, 0xd2, - 0x15, 0x5d, 0xf9, 0x41, 0xec, 0x92, 0x29, 0x49, 0x82, 0x97, 0x4c, 0x49, 0x30, 0x1b, 0x23, 0x0c, - 0x5c, 0xdb, 0xb4, 0x1a, 0x33, 0xba, 0xd9, 0xea, 0x3a, 0x54, 0xf9, 0x37, 0xa2, 0x63, 0x24, 0x86, - 0x66, 0x63, 0x24, 0x06, 0x62, 0x0b, 0x34, 0x03, 0x95, 0x5d, 0xd7, 0x6c, 0x5a, 0x62, 0x5f, 0xd9, - 0x6d, 0x79, 0xca, 0xbf, 0x19, 0x5d, 0xa0, 0xd3, 0x68, 0xd8, 0x02, 0x9d, 0x06, 0xc7, 0x53, 0x27, - 0xd6, 0x0b, 0x6c, 0xf1, 0x90, 0xef, 0x2a, 0xff, 0xad, 0xd8, 0xa9, 0x53, 0x0a, 0x0d, 0x9e, 0x3a, - 0xa5, 0xc0, 0xd9, 0xfa, 0xc8, 0x6d, 0xb2, 0x39, 0x33, 0xb8, 0xab, 0xfe, 0xb7, 0xa3, 0xeb, 0x63, - 0x1c, 0xcf, 0xd6, 0xc7, 0x38, 0x2c, 0xca, 0x47, 0x74, 0xc1, 0xbf, 0x93, 0xc5, 0x27, 0x90, 0x7f, - 0xa2, 0x0c, 0xb9, 0x23, 0xf3, 0x11, 0x23, 0xe5, 0x47, 0x73, 0x59, 0x8c, 0x82, 0xe1, 0x91, 0x28, - 0x14, 0x65, 0xa4, 0xd1, 0x47, 0x26, 0xdd, 0x50, 0xbe, 0x9a, 0xc9, 0x88, 0x13, 0x44, 0x19, 0x71, - 0x18, 0x79, 0x0f, 0x2e, 0x86, 0xb0, 0x79, 0xda, 0x5e, 0x09, 0x66, 0xa6, 0x3f, 0x96, 0x8b, 0x9a, - 0xc1, 0xe9, 0x64, 0xcc, 0x0c, 0x4e, 0xc7, 0xa4, 0xb1, 0x16, 0xa2, 0xfb, 0x77, 0x77, 0x60, 0x1d, - 0x48, 0x30, 0x83, 0x41, 0x1a, 0x6b, 0x21, 0xcd, 0x1f, 0xdb, 0x81, 0x75, 0x20, 0xd3, 0x0c, 0x06, - 0xe4, 0x27, 0x73, 0x70, 0x35, 0x1d, 0x55, 0x6e, 0xb5, 0x66, 0x6c, 0x27, 0xc4, 0x29, 0x7f, 0x3c, - 0x17, 0x3d, 0x68, 0xd8, 0x5d, 0xb1, 0xd9, 0x3e, 0x6d, 0x97, 0x15, 0x90, 0xcf, 0xc1, 0x68, 0xb9, - 0x6b, 0x98, 0x1e, 0x5e, 0xbc, 0x31, 0xc3, 0xf9, 0xc7, 0x73, 0xb1, 0x2d, 0x8e, 0x8c, 0xc5, 0x2d, - 0x8e, 0x0c, 0x20, 0x77, 0xe1, 0x6c, 0x8d, 0x36, 0xba, 0x8e, 0xe9, 0x6d, 0x6a, 0xb4, 0x63, 0x3b, - 0x1e, 0xe3, 0xf1, 0x27, 0x72, 0xd1, 0x49, 0x2c, 0x41, 0xc1, 0x26, 0xb1, 0x04, 0x90, 0x3c, 0x48, - 0xdc, 0xca, 0x8b, 0xce, 0xfc, 0x89, 0x5c, 0xcf, 0x6b, 0xf9, 0xa0, 0x2f, 0xd3, 0x8b, 0x93, 0xa5, - 0xd8, 0x2d, 0xba, 0xe0, 0xfa, 0x93, 0xb9, 0x1e, 0xd7, 0xe8, 0xd2, 0x0c, 0x97, 0x04, 0x33, 0x8e, - 0x29, 0x19, 0xe0, 0x95, 0x3f, 0x99, 0xeb, 0x71, 0xed, 0x1d, 0x72, 0x4c, 0x4b, 0x1e, 0xff, 0x0a, - 0xf7, 0x14, 0x11, 0x8c, 0x7e, 0x2a, 0x97, 0x74, 0x15, 0x09, 0xca, 0x4b, 0x84, 0xac, 0xd8, 0x7d, - 0x37, 0x50, 0xfa, 0xaf, 0xe5, 0x92, 0xbe, 0x79, 0x61, 0xb1, 0xf0, 0x17, 0xa1, 0x70, 0x79, 0xfa, - 0xb1, 0x47, 0x1d, 0x4b, 0x6f, 0x61, 0x77, 0xd6, 0x3c, 0xdb, 0xd1, 0x9b, 0x74, 0xda, 0xd2, 0x57, - 0x5a, 0x54, 0xf9, 0x7a, 0x2e, 0x6a, 0xc1, 0x66, 0x93, 0x32, 0x0b, 0x36, 0x1b, 0x4b, 0xd6, 0xe0, - 0xc9, 0x34, 0x6c, 0xc5, 0x74, 0xb1, 0x9e, 0x6f, 0xe4, 0xa2, 0x26, 0x6c, 0x0f, 0x5a, 0x66, 0xc2, - 0xf6, 0x40, 0x93, 0x5b, 0x30, 0x34, 0x69, 0xfb, 0xd3, 0xef, 0x9f, 0x8a, 0x39, 0x43, 0x06, 0x98, - 0xd9, 0x3e, 0x2d, 0x24, 0x13, 0x65, 0xc4, 0xa0, 0xfe, 0x66, 0xb2, 0x4c, 0x78, 0xf9, 0x14, 0xfc, - 0x10, 0x65, 0x84, 0xb8, 0xff, 0xbd, 0x64, 0x99, 0xf0, 0x8e, 0x2b, 0xf8, 0xc1, 0x66, 0x12, 0x5e, - 0xe3, 0xfc, 0x4c, 0x99, 0xd9, 0x6d, 0x53, 0x6b, 0x7a, 0xab, 0x45, 0xad, 0x26, 0x55, 0xbe, 0x15, - 0x9b, 0x49, 0xd2, 0xc9, 0xd8, 0x4c, 0x92, 0x8e, 0x21, 0x3f, 0x0c, 0x97, 0x1e, 0xe8, 0x2d, 0xd3, - 0x08, 0x71, 0x7e, 0x3e, 0x70, 0xe5, 0xa7, 0x73, 0xd1, 0xdd, 0x74, 0x06, 0x1d, 0xdb, 0x4d, 0x67, - 0xa0, 0xc8, 0x3c, 0x10, 0x5c, 0x46, 0x83, 0xd9, 0x82, 0xad, 0xcf, 0xca, 0xbf, 0x9f, 0x8b, 0xda, - 0xa9, 0x49, 0x12, 0x66, 0xa7, 0x26, 0xa1, 0xa4, 0x9e, 0x9d, 0x1a, 0x44, 0xf9, 0x99, 0x5c, 0xf4, - 0xb4, 0x26, 0x8b, 0x70, 0xb6, 0x4f, 0xcb, 0xce, 0x2f, 0x72, 0x07, 0xc6, 0x6b, 0x4b, 0xd5, 0x99, - 0x99, 0xe9, 0xda, 0x83, 0x6a, 0x05, 0x1f, 0x3a, 0x18, 0xca, 0x9f, 0x8e, 0xad, 0x58, 0x71, 0x02, - 0xb6, 0x62, 0xc5, 0x61, 0xe4, 0x4d, 0x18, 0x61, 0xed, 0x67, 0x03, 0x06, 0x3f, 0xf9, 0x67, 0x73, - 0x51, 0x73, 0x4a, 0x46, 0x32, 0x73, 0x4a, 0xfe, 0x4d, 0x6a, 0x70, 0x9e, 0x49, 0x71, 0xc9, 0xa1, - 0xab, 0xd4, 0xa1, 0x56, 0xc3, 0x1f, 0xd3, 0x3f, 0x97, 0x8b, 0x5a, 0x19, 0x69, 0x44, 0xcc, 0xca, - 0x48, 0x83, 0x93, 0x75, 0xb8, 0x12, 0x3f, 0x09, 0x92, 0x9f, 0x9d, 0x2a, 0x7f, 0x26, 0x17, 0x33, - 0x86, 0x7b, 0x10, 0xa3, 0x31, 0xdc, 0x03, 0x4f, 0x2c, 0x78, 0x4a, 0x1c, 0xab, 0x08, 0x87, 0xcb, - 0x78, 0x6d, 0x7f, 0x96, 0xd7, 0xf6, 0xc9, 0xd0, 0x21, 0xb0, 0x07, 0xf5, 0x6c, 0x9f, 0xd6, 0x9b, - 0x1d, 0xd3, 0xb3, 0x64, 0x02, 0x0c, 0xe5, 0xe7, 0x73, 0xe9, 0x1e, 0x29, 0x11, 0x37, 0xe5, 0xb4, - 0xcc, 0x19, 0xef, 0x65, 0xa5, 0x6f, 0x50, 0xfe, 0x5c, 0x6c, 0xbc, 0xa5, 0x93, 0xb1, 0xf1, 0x96, - 0x91, 0xff, 0xe1, 0x2e, 0x9c, 0xe5, 0x4a, 0xbd, 0xa4, 0xe3, 0x30, 0xb4, 0x9a, 0xd4, 0x50, 0xfe, - 0x7c, 0x6c, 0xb5, 0x4b, 0x50, 0xa0, 0x6b, 0x4f, 0x1c, 0xc8, 0xa6, 0xee, 0x5a, 0x47, 0xb7, 0x2c, - 0x3c, 0x66, 0x55, 0xfe, 0x83, 0xd8, 0xd4, 0x1d, 0xa2, 0xd0, 0x71, 0x37, 0xf8, 0xc5, 0x34, 0xa1, - 0x57, 0xea, 0x23, 0xe5, 0x2f, 0xc4, 0x34, 0xa1, 0x17, 0x31, 0xd3, 0x84, 0x9e, 0x79, 0x94, 0x1e, - 0x64, 0x3c, 0x01, 0x57, 0x7e, 0x21, 0xb6, 0x22, 0xa7, 0x52, 0xb1, 0x15, 0x39, 0xfd, 0x05, 0xf9, - 0x83, 0x8c, 0xe7, 0xd3, 0xca, 0x2f, 0xf6, 0xe6, 0x1b, 0xae, 0xf4, 0xe9, 0xaf, 0xaf, 0x1f, 0x64, - 0x3c, 0x3d, 0x56, 0xfe, 0x62, 0x6f, 0xbe, 0xa1, 0x63, 0x5f, 0xfa, 0xcb, 0xe5, 0x7a, 0xf6, 0xb3, - 0x5d, 0xe5, 0x2f, 0xc5, 0xa7, 0xae, 0x0c, 0x42, 0x9c, 0xba, 0xb2, 0xde, 0xfe, 0xae, 0xc0, 0x13, - 0x5c, 0x43, 0xee, 0x38, 0x7a, 0x67, 0xad, 0x46, 0x3d, 0xcf, 0xb4, 0x9a, 0xfe, 0x4e, 0xec, 0x2f, - 0xe7, 0x62, 0xc7, 0x63, 0x59, 0x94, 0x78, 0x3c, 0x96, 0x85, 0x64, 0xca, 0x9b, 0x78, 0xa0, 0xab, - 0xfc, 0x95, 0x98, 0xf2, 0x26, 0x28, 0x98, 0xf2, 0x26, 0xdf, 0xf5, 0xde, 0x4d, 0x79, 0x87, 0xaa, - 0xfc, 0x87, 0xd9, 0xbc, 0x82, 0xf6, 0xa5, 0x3c, 0x5f, 0xbd, 0x9b, 0xf2, 0xdc, 0x52, 0xf9, 0x8f, - 0xb2, 0x79, 0x85, 0x3e, 0x48, 0xc9, 0x57, 0x9a, 0xef, 0xc1, 0x45, 0x3e, 0x9b, 0xcf, 0x50, 0x83, - 0x46, 0x3e, 0xf4, 0x97, 0x62, 0x63, 0x3f, 0x9d, 0x0c, 0x8f, 0xdc, 0x53, 0x31, 0x69, 0xac, 0x45, - 0x5b, 0xff, 0xea, 0x0e, 0xac, 0xc3, 0x0d, 0x41, 0x3a, 0x86, 0xad, 0x37, 0xf2, 0xe3, 0x37, 0xe5, - 0x97, 0x63, 0xeb, 0x8d, 0x8c, 0x44, 0x77, 0x0e, 0xf9, 0xa5, 0xdc, 0x9b, 0xd1, 0x87, 0x5e, 0xca, - 0x7f, 0x9c, 0x5a, 0x38, 0xe8, 0x80, 0xe8, 0xab, 0xb0, 0x37, 0xa3, 0x8f, 0x9a, 0x94, 0x5f, 0x49, - 0x2d, 0x1c, 0x7c, 0x40, 0xf4, 0x05, 0x14, 0xdb, 0x22, 0x75, 0x3d, 0x9b, 0xb3, 0x8a, 0x4c, 0x0f, - 0x7f, 0x2d, 0xbe, 0x45, 0x4a, 0x25, 0xc3, 0x2d, 0x52, 0x2a, 0x26, 0x8d, 0xb5, 0xf8, 0xbc, 0x5f, - 0xdd, 0x81, 0xb5, 0xb4, 0xb1, 0x4b, 0xc5, 0xa4, 0xb1, 0x16, 0x1f, 0xff, 0x6b, 0x3b, 0xb0, 0x96, - 0x36, 0x76, 0xa9, 0x18, 0x66, 0x8e, 0x85, 0x98, 0x07, 0xd4, 0x71, 0x43, 0xf5, 0xfb, 0xeb, 0x31, - 0x73, 0x2c, 0x83, 0x8e, 0x99, 0x63, 0x19, 0xa8, 0x54, 0xee, 0x42, 0x28, 0xbf, 0xbe, 0x13, 0xf7, - 0xf0, 0x5e, 0x26, 0x03, 0x95, 0xca, 0x5d, 0xc8, 0xe5, 0x6f, 0xec, 0xc4, 0x3d, 0xbc, 0x98, 0xc9, - 0x40, 0x31, 0xa3, 0xa8, 0xe6, 0xe9, 0x9e, 0xd9, 0x98, 0xb5, 0x5d, 0x4f, 0x5a, 0xe4, 0xff, 0x66, - 0xcc, 0x28, 0x4a, 0x23, 0x62, 0x46, 0x51, 0x1a, 0x3c, 0xc9, 0x54, 0x48, 0xe3, 0x37, 0x7a, 0x32, - 0x0d, 0x2d, 0xad, 0x34, 0x78, 0x92, 0xa9, 0x10, 0xc2, 0x7f, 0xd2, 0x93, 0x69, 0xe8, 0x29, 0x9f, - 0x06, 0x67, 0x96, 0xe9, 0x94, 0x63, 0x6f, 0x58, 0x77, 0xe9, 0x06, 0x6d, 0x89, 0x4f, 0xff, 0xcd, - 0x98, 0x65, 0x1a, 0x27, 0xc0, 0x5b, 0x94, 0x18, 0x2c, 0xca, 0x48, 0x7c, 0xee, 0x6f, 0x65, 0x32, - 0x0a, 0x8f, 0x89, 0xe2, 0xb0, 0x28, 0x23, 0xf1, 0x89, 0xbf, 0x9d, 0xc9, 0x28, 0x3c, 0x26, 0x8a, - 0xc3, 0x70, 0xe5, 0x0a, 0x3a, 0xbd, 0xdc, 0xa4, 0x96, 0xb7, 0xd4, 0xd2, 0x7d, 0xad, 0xff, 0x76, - 0x7c, 0xe5, 0xca, 0xa2, 0xc4, 0x95, 0x2b, 0x0b, 0x99, 0x51, 0x87, 0xf8, 0xfc, 0xdf, 0xd9, 0xb9, - 0x0e, 0x69, 0x75, 0xcc, 0x42, 0x66, 0xd4, 0x21, 0x24, 0xf3, 0xbb, 0x3b, 0xd7, 0x11, 0x88, 0x28, - 0x9b, 0x0d, 0x29, 0xc3, 0x18, 0xbe, 0x2b, 0xd1, 0x5d, 0xdf, 0x4b, 0xf6, 0x6f, 0xe5, 0xa2, 0x37, - 0x84, 0x51, 0xf4, 0x6c, 0x9f, 0x16, 0x2b, 0x20, 0xb3, 0x10, 0xdf, 0xff, 0x9d, 0x0c, 0x16, 0xa1, - 0x6f, 0x68, 0x14, 0x22, 0xb3, 0x10, 0x9f, 0xf7, 0x9f, 0x66, 0xb0, 0x08, 0x9d, 0x43, 0xa3, 0x90, - 0xc9, 0x01, 0xe8, 0xc7, 0xc3, 0x63, 0xf5, 0x17, 0x72, 0x30, 0x52, 0xf3, 0x1c, 0xaa, 0xb7, 0x45, - 0x88, 0xbb, 0xcb, 0x30, 0xc8, 0xbd, 0xb0, 0xfd, 0x27, 0xe3, 0x5a, 0xf0, 0x9b, 0x5c, 0x85, 0xb1, - 0x39, 0xdd, 0xf5, 0xb0, 0x64, 0xd5, 0x32, 0xe8, 0x63, 0x7c, 0x81, 0x58, 0xd0, 0x62, 0x50, 0x32, - 0xc7, 0xe9, 0x78, 0x39, 0x8c, 0x6a, 0x5a, 0xd8, 0x31, 0xb2, 0xdb, 0xe0, 0xf7, 0xb6, 0x26, 0xfa, - 0x30, 0x90, 0x5b, 0xac, 0xac, 0xfa, 0x7b, 0x39, 0x48, 0xf8, 0x87, 0xef, 0x3f, 0x94, 0xc3, 0x22, - 0x9c, 0x89, 0x45, 0xd2, 0x15, 0xcf, 0x28, 0x77, 0x19, 0x68, 0x37, 0x5e, 0x9a, 0x7c, 0x2a, 0x78, - 0xbe, 0x77, 0x5f, 0x9b, 0x13, 0x51, 0xfb, 0x30, 0xdf, 0x44, 0xd7, 0x69, 0x69, 0x12, 0x4a, 0x44, - 0x65, 0xfa, 0xc1, 0x78, 0x18, 0x26, 0x94, 0x5c, 0x15, 0x71, 0x25, 0x72, 0x61, 0xac, 0xbf, 0x58, - 0x76, 0x7b, 0x1e, 0x47, 0xe2, 0x73, 0x30, 0x52, 0x6d, 0x77, 0xa8, 0xe3, 0xda, 0x96, 0xee, 0xd9, - 0x8e, 0x78, 0x96, 0x8f, 0x71, 0xe0, 0x4c, 0x09, 0x2e, 0xc7, 0x26, 0x93, 0xe9, 0xc9, 0x75, 0x3f, - 0x65, 0x5e, 0x01, 0x03, 0xb4, 0xe2, 0xdb, 0xda, 0x78, 0xc6, 0x74, 0x4e, 0xc1, 0x48, 0xef, 0xbb, - 0x3a, 0x3e, 0xf4, 0x0c, 0x48, 0xbb, 0x0c, 0x20, 0x93, 0x22, 0x05, 0x79, 0x01, 0x4a, 0x78, 0x31, - 0xe6, 0x62, 0x2a, 0x4c, 0x11, 0x81, 0xb0, 0x85, 0x10, 0x39, 0xde, 0x1b, 0xa7, 0x21, 0xf7, 0x60, - 0x3c, 0xbc, 0xf5, 0xbf, 0xe3, 0xd8, 0xdd, 0x8e, 0x9f, 0xfc, 0x06, 0x33, 0xcd, 0xaf, 0x07, 0xb8, - 0x7a, 0x13, 0x91, 0x12, 0x8b, 0x44, 0x41, 0x32, 0x0b, 0x67, 0x42, 0x18, 0x13, 0x91, 0x9f, 0x74, - 0x0b, 0x13, 0x9e, 0x4a, 0xbc, 0x98, 0x38, 0x23, 0x09, 0x4f, 0x63, 0xc5, 0x48, 0x15, 0x06, 0xfc, - 0xf0, 0x83, 0x83, 0x3b, 0x2a, 0xe9, 0x39, 0x11, 0x7e, 0x70, 0x40, 0x0e, 0x3c, 0xe8, 0x97, 0x27, - 0x33, 0x30, 0xa6, 0xd9, 0x5d, 0x8f, 0x2e, 0xdb, 0x62, 0xbb, 0x2c, 0xc2, 0x5c, 0x62, 0x9b, 0x1c, - 0x86, 0xa9, 0x7b, 0xb6, 0x9f, 0xa8, 0x5f, 0x4e, 0x18, 0x1f, 0x2d, 0x45, 0x16, 0xe0, 0x6c, 0xc2, - 0x3f, 0x02, 0xdf, 0x85, 0x0e, 0xf1, 0x40, 0x72, 0xd2, 0xe7, 0x25, 0x99, 0x25, 0x8b, 0x92, 0x1f, - 0xcf, 0x41, 0x69, 0xd9, 0xd1, 0x4d, 0xcf, 0x15, 0x6f, 0x44, 0x2f, 0xdc, 0xd8, 0x70, 0xf4, 0x0e, - 0xd3, 0x8f, 0x1b, 0x18, 0x81, 0xf7, 0x81, 0xde, 0xea, 0x52, 0x77, 0xf2, 0x21, 0xfb, 0xba, 0xff, - 0x61, 0x6b, 0xe2, 0xcd, 0x26, 0x9e, 0xc2, 0xde, 0x68, 0xd8, 0xed, 0x9b, 0x4d, 0x47, 0x7f, 0x64, - 0x7a, 0x68, 0xeb, 0xea, 0xad, 0x9b, 0x1e, 0x6d, 0xe1, 0x61, 0xef, 0x4d, 0xbd, 0x63, 0xde, 0xc4, - 0x48, 0xef, 0x37, 0x03, 0x4e, 0xbc, 0x06, 0xa6, 0x02, 0x1e, 0xfe, 0x25, 0xab, 0x00, 0xc7, 0x91, - 0x05, 0x00, 0xf1, 0xa9, 0xe5, 0x4e, 0x47, 0x3c, 0x38, 0x95, 0x8e, 0x48, 0x7d, 0x0c, 0x57, 0xec, - 0x40, 0x60, 0x7a, 0x47, 0x8a, 0x6e, 0xac, 0x49, 0x1c, 0x98, 0x16, 0x2c, 0x8b, 0x16, 0xf9, 0x62, - 0x1a, 0x0d, 0x25, 0xee, 0x37, 0x36, 0x45, 0x48, 0xf1, 0x62, 0x64, 0x05, 0xce, 0x08, 0xbe, 0x41, - 0x2e, 0x94, 0xb1, 0xe8, 0xac, 0x10, 0x43, 0x73, 0xa5, 0x0d, 0xda, 0x68, 0x08, 0xb0, 0x5c, 0x47, - 0xac, 0x04, 0x99, 0x0c, 0x73, 0x37, 0x2f, 0xe8, 0x6d, 0xea, 0x2a, 0x67, 0x50, 0x63, 0xaf, 0x6c, - 0x6f, 0x4d, 0x28, 0x7e, 0x79, 0x8c, 0xc4, 0x29, 0x8b, 0x2e, 0x5a, 0x44, 0xe6, 0xc1, 0xb5, 0x7e, - 0x3c, 0x85, 0x47, 0x5c, 0xe7, 0xa3, 0x45, 0xc8, 0x14, 0x8c, 0x06, 0xef, 0x5d, 0xee, 0xdf, 0xaf, - 0x56, 0xf0, 0x45, 0xab, 0x08, 0xc6, 0x1a, 0xcb, 0x56, 0x22, 0x33, 0x89, 0x94, 0x91, 0x82, 0x84, - 0xf0, 0x27, 0xae, 0xb1, 0x20, 0x21, 0x9d, 0x94, 0x20, 0x21, 0x4b, 0xe4, 0x6d, 0x18, 0x2e, 0x3f, - 0xac, 0x89, 0xe0, 0x27, 0xae, 0x72, 0x2e, 0x4c, 0x7d, 0xa5, 0x6f, 0xb8, 0x75, 0x3f, 0x50, 0x8a, - 0xdc, 0x74, 0x99, 0x9e, 0x4c, 0xc3, 0x58, 0xc4, 0x65, 0xce, 0x55, 0xce, 0x23, 0x07, 0x6c, 0xb9, - 0x8e, 0x98, 0xba, 0x23, 0x50, 0xf2, 0xf0, 0x8a, 0x16, 0x62, 0x5a, 0x53, 0x31, 0x5d, 0x4c, 0x23, - 0xa4, 0x51, 0x8c, 0xb3, 0x82, 0xef, 0x63, 0x07, 0xb9, 0xd6, 0x18, 0x02, 0x55, 0x77, 0x38, 0x4e, - 0xee, 0xd1, 0x58, 0x31, 0xf2, 0x3e, 0x10, 0x4c, 0x3c, 0x44, 0x0d, 0xff, 0x06, 0xb5, 0x5a, 0x71, - 0x95, 0x8b, 0x18, 0x89, 0x9c, 0xc4, 0xe3, 0x3a, 0x54, 0x2b, 0x93, 0x57, 0xc5, 0xf4, 0xf1, 0xb4, - 0xce, 0x4b, 0xd5, 0xfd, 0x98, 0x0e, 0x75, 0x33, 0x92, 0x95, 0x39, 0x85, 0x2b, 0xd9, 0x80, 0x4b, - 0x4b, 0x0e, 0x7d, 0x64, 0xda, 0x5d, 0xd7, 0x5f, 0x3e, 0xfc, 0x79, 0xeb, 0xd2, 0x8e, 0xf3, 0xd6, - 0xb3, 0xa2, 0xe2, 0x0b, 0x1d, 0x87, 0x3e, 0xaa, 0xfb, 0xf1, 0xa7, 0x23, 0xe1, 0x53, 0xb3, 0xb8, - 0x63, 0x6e, 0xe9, 0x0f, 0xba, 0x0e, 0x15, 0x70, 0x93, 0xba, 0x8a, 0x12, 0x4e, 0xb5, 0x3c, 0x64, - 0x8e, 0x19, 0xe0, 0x22, 0xb9, 0xa5, 0xa3, 0xc5, 0x88, 0x06, 0xe4, 0xce, 0x94, 0x7f, 0x9b, 0x5e, - 0x6e, 0xf0, 0x0c, 0xbc, 0xca, 0x13, 0xc8, 0x4c, 0x65, 0x62, 0x69, 0x36, 0x82, 0x58, 0xf4, 0x75, - 0x5d, 0xe0, 0x65, 0xb1, 0x24, 0x4b, 0x93, 0x39, 0x18, 0x5f, 0x72, 0xf0, 0x6c, 0xef, 0x1e, 0xdd, - 0x5c, 0xb2, 0x5b, 0x66, 0x63, 0x13, 0x9f, 0xe9, 0x8a, 0xa9, 0xb2, 0xc3, 0x71, 0xf5, 0x75, 0xba, - 0x59, 0xef, 0x20, 0x56, 0x5e, 0x56, 0xe2, 0x25, 0xe5, 0xd8, 0xd0, 0x4f, 0xee, 0x2e, 0x36, 0x34, - 0x85, 0x71, 0x71, 0x17, 0xff, 0xd8, 0xa3, 0x16, 0x5b, 0xea, 0x5d, 0xf1, 0x24, 0x57, 0x89, 0xdd, - 0xdd, 0x07, 0x78, 0x3e, 0x75, 0x88, 0x51, 0x46, 0x03, 0xb0, 0xdc, 0xb0, 0x78, 0x91, 0x64, 0x00, - 0xe5, 0xa7, 0xf6, 0x11, 0x40, 0xf9, 0x6f, 0x16, 0xe4, 0xf9, 0x97, 0x5c, 0x81, 0xa2, 0x94, 0xdf, - 0x08, 0xa3, 0xc3, 0x62, 0x2c, 0xf8, 0xa2, 0x08, 0x7a, 0x3d, 0x24, 0x6c, 0x97, 0x20, 0x0c, 0x10, - 0x26, 0xb4, 0x0c, 0x23, 0x86, 0x6a, 0x21, 0x01, 0x26, 0x13, 0xec, 0xae, 0xb4, 0xcc, 0x06, 0x66, - 0x08, 0x28, 0x48, 0x71, 0x3f, 0x10, 0xca, 0x13, 0x04, 0x48, 0x24, 0xe4, 0x16, 0x0c, 0xfb, 0x67, - 0xca, 0x61, 0x74, 0x64, 0x0c, 0x1c, 0x2f, 0x66, 0x6b, 0x11, 0x97, 0x5e, 0x22, 0x22, 0x6f, 0x00, - 0x84, 0xd3, 0x81, 0xb0, 0xb4, 0x70, 0xa9, 0x90, 0x67, 0x0f, 0x79, 0xa9, 0x08, 0xa9, 0xd9, 0xc4, - 0x29, 0xab, 0xa3, 0x9f, 0x3e, 0x15, 0x27, 0xce, 0x88, 0x0e, 0xcb, 0x0a, 0x12, 0x2d, 0x42, 0x16, - 0xe1, 0x6c, 0x42, 0x03, 0x45, 0x2c, 0x65, 0x4c, 0xa1, 0x9f, 0xa2, 0xbe, 0xf2, 0xc2, 0x9c, 0x28, - 0x4b, 0x9e, 0x83, 0xc2, 0x7d, 0xad, 0x2a, 0xe2, 0xb9, 0xf2, 0x50, 0xc0, 0x91, 0x60, 0x4f, 0x0c, - 0xab, 0xfe, 0xb1, 0x7c, 0x62, 0x6d, 0x62, 0xd2, 0x13, 0xac, 0xa4, 0x1e, 0x44, 0xe9, 0xf9, 0xf5, - 0x73, 0xe9, 0x49, 0x44, 0xe4, 0x1a, 0x0c, 0x2e, 0xb1, 0x99, 0xa1, 0x61, 0xb7, 0x44, 0x7f, 0x62, - 0x64, 0xae, 0x8e, 0x80, 0x69, 0x01, 0x96, 0xdc, 0x92, 0xb2, 0xfe, 0x4a, 0x21, 0xd2, 0xfd, 0xac, - 0xbf, 0xf1, 0x58, 0xe1, 0x98, 0xff, 0xf7, 0x56, 0x2c, 0x8b, 0x98, 0x28, 0x93, 0xb2, 0x2e, 0x86, - 0x59, 0xc3, 0x02, 0xab, 0xb4, 0x7f, 0x27, 0xab, 0x54, 0xfd, 0xdb, 0xb9, 0xe4, 0x38, 0x23, 0xb7, - 0x93, 0xd1, 0x8a, 0x71, 0x11, 0x0a, 0x80, 0x72, 0xad, 0x41, 0xdc, 0xe2, 0x48, 0xdc, 0xe1, 0xfc, - 0xbe, 0xe3, 0x0e, 0x17, 0xf6, 0x18, 0x77, 0x58, 0xfd, 0x7f, 0x8b, 0x3d, 0x7d, 0xc7, 0x8f, 0x24, - 0x3e, 0xdd, 0xeb, 0x6c, 0x67, 0xc5, 0x6a, 0x2f, 0xbb, 0x89, 0xfd, 0x01, 0x77, 0x8d, 0xad, 0xeb, - 0x7c, 0x68, 0xb9, 0x5a, 0x94, 0x92, 0xbc, 0x03, 0x23, 0xfe, 0x07, 0x60, 0x3c, 0x6b, 0x29, 0x0e, - 0x73, 0xb0, 0xaa, 0xc5, 0x22, 0x3f, 0x47, 0x0a, 0x90, 0x57, 0x60, 0x08, 0x6d, 0x9a, 0x8e, 0xde, - 0xf0, 0x83, 0x9d, 0xf3, 0xe8, 0xe8, 0x3e, 0x50, 0x8e, 0xc1, 0x16, 0x50, 0x92, 0x2f, 0x41, 0x49, - 0x64, 0xfc, 0xe0, 0x09, 0xf1, 0x6f, 0xee, 0xc2, 0xd9, 0xfe, 0x86, 0x9c, 0xed, 0x83, 0xef, 0x52, - 0x10, 0x10, 0xd9, 0xa5, 0xf0, 0x44, 0x1f, 0xcb, 0x70, 0x6e, 0xc9, 0xa1, 0x06, 0x3e, 0xeb, 0x98, - 0x7e, 0xdc, 0x71, 0x44, 0x2e, 0x16, 0x3e, 0xca, 0x71, 0x91, 0xea, 0xf8, 0x68, 0xb6, 0x7c, 0x0a, - 0xbc, 0x1c, 0x71, 0x39, 0xa5, 0x38, 0xb3, 0x5c, 0x78, 0x4b, 0xee, 0xd1, 0xcd, 0x0d, 0xdb, 0x31, - 0x78, 0xba, 0x12, 0x31, 0x7f, 0x0b, 0x41, 0xaf, 0x0b, 0x94, 0x6c, 0xb9, 0x44, 0x0b, 0x5d, 0x7e, - 0x1d, 0x86, 0xf7, 0x9b, 0x31, 0xe3, 0xd7, 0xf3, 0x19, 0xaf, 0xb0, 0x4e, 0x6e, 0xd2, 0xc2, 0x20, - 0x93, 0x76, 0x7f, 0x46, 0x26, 0xed, 0x3f, 0xca, 0x67, 0x3c, 0x31, 0x3b, 0xd1, 0x19, 0x6f, 0x03, - 0x61, 0x44, 0x33, 0xde, 0x86, 0xc9, 0x86, 0x4d, 0x43, 0x93, 0x89, 0x62, 0xb9, 0xb1, 0x4b, 0x3b, - 0xe6, 0xc6, 0xfe, 0xa5, 0x42, 0xaf, 0x27, 0x78, 0xa7, 0xb2, 0xdf, 0x8b, 0xec, 0x6f, 0xc1, 0x70, - 0x20, 0xd9, 0x6a, 0x05, 0x8d, 0x9e, 0xd1, 0x20, 0x3f, 0x0f, 0x07, 0x63, 0x19, 0x89, 0x88, 0x5c, - 0xe7, 0x6d, 0xad, 0x99, 0x1f, 0xf0, 0x4c, 0x11, 0xa3, 0x22, 0x07, 0x80, 0xee, 0xe9, 0x75, 0xd7, - 0xfc, 0x80, 0x6a, 0x01, 0x5a, 0xfd, 0xcf, 0xf3, 0xa9, 0xef, 0x18, 0x4f, 0xfb, 0x68, 0x0f, 0x7d, - 0x94, 0x22, 0x44, 0xfe, 0x02, 0xf3, 0x54, 0x88, 0x7b, 0x10, 0xe2, 0x1f, 0xe6, 0x53, 0xdf, 0xab, - 0x9e, 0x0a, 0x71, 0x2f, 0xb3, 0xc5, 0x0b, 0x30, 0xa4, 0xd9, 0x1b, 0xee, 0x14, 0x6e, 0x6c, 0xf8, - 0x5c, 0x81, 0x13, 0xb5, 0x63, 0x6f, 0xb8, 0x75, 0xdc, 0xb2, 0x68, 0x21, 0x81, 0xfa, 0x83, 0x7c, - 0x8f, 0x17, 0xbd, 0xa7, 0x82, 0xff, 0x30, 0x97, 0xc8, 0xdf, 0xca, 0x47, 0x5e, 0x0c, 0x9f, 0x5c, - 0x61, 0xdf, 0x04, 0xa8, 0x35, 0xd6, 0x68, 0x5b, 0x97, 0xb2, 0x6d, 0xe1, 0xb9, 0x83, 0x8b, 0x50, - 0x91, 0xa5, 0x39, 0x24, 0x51, 0xbf, 0x9d, 0x8f, 0x3d, 0x99, 0x3e, 0x95, 0xdd, 0xae, 0x65, 0x17, - 0x68, 0x9d, 0x78, 0x05, 0x7e, 0x2a, 0xb9, 0xdd, 0x4a, 0xee, 0x27, 0xf2, 0xb1, 0x07, 0xf3, 0x27, - 0x56, 0x76, 0x6c, 0x00, 0x26, 0x1f, 0xf2, 0x9f, 0x58, 0x4d, 0x7a, 0x01, 0x86, 0x84, 0x1c, 0x82, - 0xa5, 0x82, 0xcf, 0xfb, 0x1c, 0x88, 0xa7, 0xac, 0x01, 0x81, 0xfa, 0xc7, 0xf3, 0x10, 0x0d, 0x64, - 0x70, 0x42, 0x75, 0xe8, 0xb7, 0xf2, 0xd1, 0x10, 0x0e, 0x27, 0x57, 0x7f, 0x6e, 0x00, 0xd4, 0xba, - 0x2b, 0x0d, 0x11, 0x01, 0xb8, 0x5f, 0x3a, 0xa6, 0x0f, 0xa0, 0x9a, 0x44, 0xa1, 0xfe, 0x7f, 0xf9, - 0xd4, 0xb8, 0x12, 0x27, 0x57, 0x80, 0x2f, 0xe3, 0xa9, 0x78, 0xc3, 0x0a, 0x27, 0x72, 0x3c, 0x84, - 0x64, 0xe3, 0x2f, 0x91, 0xa2, 0xd1, 0x27, 0x24, 0x9f, 0x4d, 0x31, 0xd7, 0x30, 0x81, 0x44, 0x68, - 0xae, 0xc9, 0xd7, 0x10, 0x92, 0xe1, 0xf6, 0xf7, 0xf2, 0x3b, 0x85, 0xe1, 0x38, 0xc9, 0xab, 0xea, - 0xc0, 0x92, 0xbe, 0x89, 0xe1, 0x22, 0x59, 0x4f, 0x8c, 0xf0, 0x04, 0x82, 0x1d, 0x0e, 0x92, 0xef, - 0xde, 0x04, 0x95, 0xfa, 0xcf, 0xfa, 0xd3, 0x63, 0x40, 0x9c, 0x5c, 0x11, 0x5e, 0x81, 0xe2, 0x92, - 0xee, 0xad, 0x09, 0x4d, 0xc6, 0x2b, 0xbd, 0x8e, 0xee, 0xad, 0x69, 0x08, 0x25, 0xd7, 0x61, 0x50, - 0xd3, 0x37, 0xf8, 0x99, 0x67, 0x29, 0x4c, 0xee, 0xe8, 0xe8, 0x1b, 0x75, 0x7e, 0xee, 0x19, 0xa0, - 0x89, 0x1a, 0x24, 0x17, 0xe5, 0x27, 0xdf, 0x98, 0xd9, 0x8e, 0x27, 0x17, 0x0d, 0x52, 0x8a, 0x5e, - 0x81, 0xe2, 0xa4, 0x6d, 0x6c, 0xe2, 0xf5, 0xd5, 0x08, 0xaf, 0x6c, 0xc5, 0x36, 0x36, 0x35, 0x84, - 0x92, 0x9f, 0xcc, 0xc1, 0xc0, 0x2c, 0xd5, 0x0d, 0x36, 0x42, 0x86, 0x7a, 0x79, 0x9d, 0x7c, 0xe1, - 0x70, 0xbc, 0x4e, 0xce, 0xae, 0xf1, 0xca, 0x64, 0x45, 0x11, 0xf5, 0x93, 0x3b, 0x30, 0x38, 0xa5, - 0x7b, 0xb4, 0x69, 0x3b, 0x9b, 0xe8, 0x47, 0x33, 0x16, 0xbe, 0x23, 0x88, 0xe8, 0x8f, 0x4f, 0xc4, - 0x6f, 0xc6, 0x1a, 0xe2, 0x97, 0x16, 0x14, 0x66, 0x62, 0x59, 0xd6, 0x9d, 0x26, 0xf5, 0x44, 0x22, - 0x6d, 0x14, 0x8b, 0x87, 0x10, 0x4d, 0x60, 0xc2, 0x63, 0xe5, 0x91, 0xf4, 0x63, 0x65, 0xb4, 0x1e, - 0xd1, 0xd7, 0x0e, 0x53, 0x7a, 0x8e, 0xe2, 0xa2, 0xcf, 0xad, 0x47, 0x84, 0x62, 0x46, 0x4f, 0x4d, - 0x22, 0x51, 0xbf, 0xdf, 0x0f, 0xa9, 0x2f, 0xc6, 0x4f, 0x95, 0xfc, 0x54, 0xc9, 0x43, 0x25, 0xaf, - 0x24, 0x94, 0xfc, 0x72, 0x32, 0x06, 0xc1, 0x47, 0x54, 0xc3, 0x7f, 0xb6, 0x98, 0x88, 0x60, 0x72, - 0xb2, 0x77, 0x97, 0xa1, 0xf4, 0xfa, 0x77, 0x94, 0x5e, 0x30, 0x20, 0x4a, 0x3b, 0x0e, 0x88, 0x81, - 0xdd, 0x0e, 0x88, 0xc1, 0xcc, 0x01, 0x11, 0x2a, 0xc8, 0x50, 0xa6, 0x82, 0x54, 0xc5, 0xa0, 0x81, - 0xde, 0x89, 0x54, 0xae, 0x6c, 0x6f, 0x4d, 0x8c, 0xb1, 0xd1, 0x94, 0x9a, 0x41, 0x05, 0x59, 0xa8, - 0xbf, 0x57, 0xec, 0x11, 0x76, 0xe8, 0x48, 0x74, 0xe4, 0x65, 0x28, 0x94, 0x3b, 0x1d, 0xa1, 0x1f, - 0xe7, 0xa4, 0x88, 0x47, 0x19, 0xa5, 0x18, 0x35, 0x79, 0x03, 0x0a, 0xe5, 0x87, 0xb5, 0x78, 0xf2, - 0x94, 0xf2, 0xc3, 0x9a, 0xf8, 0x92, 0xcc, 0xb2, 0x0f, 0x6b, 0xe4, 0xad, 0x30, 0x8a, 0xe9, 0x5a, - 0xd7, 0x5a, 0x17, 0x1b, 0x45, 0xe1, 0x6e, 0xeb, 0xbb, 0xe3, 0x34, 0x18, 0x8a, 0x6d, 0x17, 0x63, - 0xb4, 0x31, 0x6d, 0x2a, 0xed, 0x5e, 0x9b, 0x06, 0x76, 0xd4, 0xa6, 0xc1, 0xdd, 0x6a, 0xd3, 0xd0, - 0x2e, 0xb4, 0x09, 0x76, 0xd4, 0xa6, 0xe1, 0x83, 0x6b, 0x53, 0x07, 0x2e, 0x27, 0x43, 0xc5, 0x05, - 0x1a, 0xa1, 0x01, 0x49, 0x62, 0x85, 0x63, 0x09, 0x5e, 0xfd, 0x77, 0x39, 0xb6, 0xbe, 0x81, 0xe8, - 0xba, 0xcb, 0xf0, 0xb2, 0x7f, 0x5a, 0xb2, 0xb4, 0xfa, 0xeb, 0xf9, 0xec, 0x08, 0x77, 0xc7, 0x73, - 0x8a, 0xfb, 0x91, 0x54, 0x29, 0x15, 0xa3, 0x11, 0x07, 0xb2, 0xa5, 0x1c, 0x63, 0x9b, 0x26, 0xb3, - 0xef, 0xe6, 0xb2, 0xc2, 0xee, 0x1d, 0x48, 0x62, 0x9f, 0x4c, 0x7a, 0xb4, 0xa1, 0x9f, 0xbe, 0x1b, - 0x75, 0x65, 0x9b, 0x81, 0x11, 0x59, 0x88, 0x42, 0x4a, 0xbb, 0x11, 0x70, 0xa4, 0x9c, 0xfa, 0xb7, - 0x73, 0x70, 0xee, 0x5e, 0x77, 0x85, 0x0a, 0x0f, 0xb6, 0xa0, 0x19, 0xef, 0x03, 0x30, 0xb0, 0x70, - 0x62, 0xc9, 0xa1, 0x13, 0xcb, 0xa7, 0xe5, 0x90, 0x79, 0xb1, 0x02, 0x37, 0x42, 0x6a, 0xee, 0xc0, - 0xf2, 0x94, 0xef, 0xcc, 0xb9, 0xde, 0x5d, 0xa1, 0xf5, 0x84, 0x27, 0x8b, 0xc4, 0xfd, 0xf2, 0xdb, - 0xdc, 0x4d, 0x7e, 0xbf, 0x4e, 0x23, 0xbf, 0x9a, 0xcf, 0x8c, 0x52, 0x78, 0x6c, 0xd3, 0x69, 0xfe, - 0x50, 0x6a, 0xaf, 0xc4, 0xd3, 0x6a, 0xa6, 0x90, 0xc4, 0x38, 0xa6, 0x71, 0x49, 0x17, 0xd8, 0x31, - 0x4f, 0xf2, 0xfa, 0xa1, 0x0a, 0xec, 0x1f, 0xe4, 0x32, 0xa3, 0x49, 0x1e, 0x57, 0x81, 0xa9, 0xff, - 0x6b, 0xc1, 0x0f, 0x62, 0x79, 0xa0, 0x4f, 0x78, 0x01, 0x86, 0xc4, 0x5b, 0xfe, 0xa8, 0x03, 0xae, - 0x38, 0xca, 0xc3, 0xa3, 0xe1, 0x80, 0x80, 0x2d, 0xf3, 0x92, 0x77, 0xb0, 0xe4, 0x80, 0x2b, 0x79, - 0x06, 0x6b, 0x12, 0x09, 0x5b, 0xc8, 0xa7, 0x1f, 0x9b, 0x1e, 0x5a, 0x05, 0xac, 0x2f, 0x0b, 0x7c, - 0x21, 0xa7, 0x8f, 0x4d, 0x8f, 0xdb, 0x04, 0x01, 0x9a, 0x2d, 0xd2, 0xb5, 0x30, 0x85, 0xbd, 0x58, - 0xa4, 0x5d, 0x91, 0xc9, 0x5f, 0x3c, 0x1b, 0x7b, 0x01, 0x86, 0x84, 0x57, 0xab, 0x70, 0x33, 0x11, - 0xad, 0x15, 0x7e, 0xb0, 0xd8, 0xda, 0x80, 0x80, 0x71, 0xd4, 0x68, 0x33, 0x74, 0xac, 0x43, 0x8e, - 0x0e, 0x42, 0x34, 0x81, 0x21, 0xb7, 0x60, 0xac, 0xe6, 0xe9, 0x96, 0xa1, 0x3b, 0xc6, 0x62, 0xd7, - 0xeb, 0x74, 0x3d, 0xd9, 0x28, 0x75, 0x3d, 0xc3, 0xee, 0x7a, 0x5a, 0x8c, 0x82, 0x7c, 0x06, 0x46, - 0x7d, 0xc8, 0xb4, 0xe3, 0xd8, 0x8e, 0x6c, 0x79, 0xb8, 0x9e, 0x41, 0x1d, 0x47, 0x8b, 0x12, 0x90, - 0xcf, 0xc2, 0x68, 0xd5, 0x7a, 0x64, 0x37, 0xf8, 0x7b, 0x76, 0x6d, 0x4e, 0xd8, 0x21, 0xf8, 0x14, - 0xcb, 0x0c, 0x10, 0xf5, 0xae, 0xd3, 0xd2, 0xa2, 0x84, 0xea, 0x76, 0x3e, 0x19, 0xeb, 0xf3, 0xe4, - 0x6e, 0x5a, 0xae, 0x47, 0x9d, 0xe9, 0xd0, 0x83, 0x14, 0x0d, 0x42, 0xd9, 0x97, 0x97, 0xdb, 0x85, - 0xb7, 0x60, 0xf0, 0x1e, 0xdd, 0xe4, 0x7e, 0x9f, 0xa5, 0xd0, 0x55, 0x78, 0x5d, 0xc0, 0xe4, 0x13, - 0x57, 0x9f, 0x4e, 0xfd, 0x4e, 0x3e, 0x19, 0xc5, 0xf4, 0xe4, 0x0a, 0xfb, 0x33, 0x30, 0x80, 0xa2, - 0xac, 0xfa, 0x47, 0xfe, 0x28, 0x40, 0x14, 0x77, 0xd4, 0x03, 0xd9, 0x27, 0x53, 0x7f, 0xb1, 0x14, - 0x0f, 0x6d, 0x7b, 0x72, 0xa5, 0xf7, 0x26, 0x0c, 0x4f, 0xd9, 0x96, 0x6b, 0xba, 0x1e, 0xb5, 0x1a, - 0xbe, 0xc2, 0x3e, 0xc1, 0x0c, 0xaa, 0x46, 0x08, 0x96, 0xdf, 0x20, 0x49, 0xd4, 0xfb, 0x51, 0x5e, - 0xf2, 0x2a, 0x0c, 0xa1, 0xc8, 0xd1, 0x4f, 0x9a, 0x4f, 0x78, 0x78, 0x5b, 0xb0, 0xc2, 0x80, 0x71, - 0x27, 0xe9, 0x90, 0x94, 0xdc, 0x87, 0xc1, 0xa9, 0x35, 0xb3, 0x65, 0x38, 0xd4, 0x42, 0x7f, 0x61, - 0xe9, 0xfd, 0x72, 0xb4, 0x2f, 0x6f, 0xe0, 0xbf, 0x48, 0xcb, 0x9b, 0xd3, 0x10, 0xc5, 0x22, 0xaf, - 0xb0, 0x04, 0xec, 0xf2, 0xcf, 0xe4, 0x01, 0xc2, 0x02, 0xe4, 0x19, 0xc8, 0x07, 0xd9, 0xa1, 0xd1, - 0x4d, 0x25, 0xa2, 0x41, 0x79, 0x5c, 0x2a, 0xc4, 0xd8, 0xce, 0xef, 0x38, 0xb6, 0xef, 0x43, 0x89, - 0x9f, 0x78, 0xa1, 0x27, 0xb9, 0x14, 0x6d, 0x33, 0xb3, 0xc1, 0x37, 0x90, 0x9e, 0x6f, 0x66, 0xd1, - 0xf2, 0x8c, 0x78, 0x65, 0x73, 0x66, 0x97, 0x1b, 0xd0, 0x8f, 0x7f, 0x91, 0xab, 0x50, 0x5c, 0xf6, - 0x33, 0xcb, 0x8e, 0xf2, 0x59, 0x3a, 0x26, 0x3f, 0xc4, 0xb3, 0x6e, 0x9a, 0xb2, 0x2d, 0x8f, 0x55, - 0x8d, 0xad, 0x1e, 0x11, 0x72, 0x11, 0xb0, 0x88, 0x5c, 0x04, 0x4c, 0xfd, 0xaf, 0xf3, 0x29, 0x41, - 0x97, 0x4f, 0xee, 0x30, 0x79, 0x1d, 0x00, 0x9f, 0x74, 0x33, 0x79, 0xfa, 0x4f, 0x34, 0x70, 0x94, - 0x20, 0x23, 0x54, 0xdb, 0xc8, 0xb6, 0x23, 0x24, 0x56, 0xff, 0x6e, 0x2e, 0x11, 0xa9, 0xf7, 0x40, - 0x72, 0x94, 0xad, 0xb2, 0xfc, 0x3e, 0xcd, 0x58, 0xbf, 0x2f, 0x0a, 0x7b, 0xeb, 0x8b, 0xe8, 0xb7, - 0x1c, 0x82, 0x65, 0x7a, 0x94, 0xdf, 0xf2, 0xfd, 0x7c, 0x5a, 0xdc, 0xe2, 0xe3, 0xa9, 0xe2, 0xb7, - 0x03, 0xa3, 0xb4, 0x18, 0x8b, 0x14, 0x8f, 0xd0, 0x78, 0xf6, 0x6b, 0x61, 0xa6, 0x7e, 0x19, 0xce, - 0xc4, 0xa2, 0xf9, 0x8a, 0x44, 0xc4, 0x57, 0x7b, 0x87, 0x05, 0xce, 0x0e, 0x06, 0x10, 0x21, 0x53, - 0xff, 0xff, 0x5c, 0xef, 0x58, 0xce, 0x47, 0xae, 0x3a, 0x29, 0x02, 0x28, 0xfc, 0xeb, 0x11, 0xc0, - 0x21, 0x6c, 0x83, 0x8f, 0xb7, 0x00, 0x3e, 0x22, 0x93, 0xc7, 0x87, 0x2d, 0x80, 0x5f, 0xcc, 0xed, - 0x18, 0x8a, 0xfb, 0xa8, 0x65, 0xa0, 0xfe, 0x4f, 0xb9, 0xd4, 0x90, 0xd9, 0x07, 0x6a, 0xd7, 0x5b, - 0x50, 0xe2, 0x6e, 0x35, 0xa2, 0x55, 0x52, 0x92, 0x31, 0x06, 0xcd, 0x4a, 0xcb, 0xcf, 0xb1, 0x64, - 0x0e, 0x06, 0x78, 0x1b, 0x0c, 0xd1, 0x1b, 0x9f, 0xe8, 0x11, 0xb7, 0xdb, 0xc8, 0x9a, 0x1c, 0x05, - 0x5a, 0xfd, 0x3b, 0xb9, 0x44, 0x04, 0xef, 0x23, 0xfc, 0xb6, 0x70, 0xaa, 0x2e, 0xec, 0x7e, 0xaa, - 0x56, 0xff, 0x69, 0x3e, 0x3d, 0x80, 0xf8, 0x11, 0x7e, 0xc8, 0x61, 0x1c, 0xa7, 0xed, 0x6f, 0xdd, - 0x5a, 0x86, 0xb1, 0xa8, 0x2c, 0xc4, 0xb2, 0xf5, 0x74, 0x7a, 0x18, 0xf5, 0x8c, 0x56, 0xc4, 0x78, - 0xa8, 0xdf, 0xcb, 0x25, 0x63, 0x9f, 0x1f, 0xf9, 0xfc, 0xb4, 0x3f, 0x6d, 0x89, 0x7e, 0xca, 0x47, - 0x64, 0xad, 0x39, 0x8c, 0x4f, 0xf9, 0x88, 0xac, 0x1a, 0xfb, 0xfb, 0x94, 0x5f, 0xce, 0x67, 0x85, - 0x8e, 0x3f, 0xf2, 0x0f, 0xfa, 0xa2, 0x2c, 0x64, 0xde, 0x32, 0xf1, 0x69, 0xcf, 0x64, 0xc5, 0x6a, - 0xcf, 0xe0, 0x99, 0xe0, 0xb3, 0xbf, 0x31, 0x9e, 0x2a, 0xac, 0x8f, 0x88, 0x22, 0x1f, 0x0f, 0x61, - 0x7d, 0x44, 0x86, 0xca, 0x47, 0x4f, 0x58, 0xbf, 0x93, 0xdf, 0x6d, 0xbe, 0x82, 0x53, 0xe1, 0x25, - 0x84, 0xf7, 0xcd, 0x7c, 0x32, 0x8f, 0xc6, 0x91, 0x8b, 0x69, 0x06, 0x4a, 0x22, 0xa3, 0x47, 0xa6, - 0x70, 0x38, 0x3e, 0xcb, 0xa2, 0x11, 0xdf, 0x71, 0x1b, 0xc4, 0x45, 0xce, 0xee, 0x44, 0xc2, 0x69, - 0xd5, 0x1f, 0xe4, 0x62, 0x49, 0x27, 0x8e, 0xe4, 0x08, 0x61, 0x5f, 0x4b, 0x12, 0x79, 0xdb, 0x3f, - 0xcc, 0x2c, 0xc6, 0x82, 0x7e, 0x07, 0xdf, 0x53, 0xa1, 0x9e, 0x6e, 0xb6, 0xe2, 0xe5, 0x45, 0x4c, - 0x80, 0xef, 0xe4, 0xe1, 0x6c, 0x82, 0x94, 0x5c, 0x8d, 0x84, 0xd2, 0xc1, 0x63, 0xc9, 0x98, 0xf3, - 0x38, 0x0f, 0xaa, 0xb3, 0x87, 0x93, 0xd4, 0xab, 0x50, 0xac, 0xe8, 0x9b, 0xfc, 0xdb, 0xfa, 0x39, - 0x4b, 0x43, 0xdf, 0x94, 0x4f, 0xdc, 0x10, 0x4f, 0x56, 0xe0, 0x02, 0xbf, 0x0f, 0x31, 0x6d, 0x6b, - 0xd9, 0x6c, 0xd3, 0xaa, 0x35, 0x6f, 0xb6, 0x5a, 0xa6, 0x2b, 0x2e, 0xf5, 0x5e, 0xd8, 0xde, 0x9a, - 0xb8, 0xe6, 0xd9, 0x9e, 0xde, 0xaa, 0x53, 0x9f, 0xac, 0xee, 0x99, 0x6d, 0x5a, 0x37, 0xad, 0x7a, - 0x1b, 0x29, 0x25, 0x96, 0xe9, 0xac, 0x48, 0x95, 0xc7, 0x77, 0xaf, 0x35, 0x74, 0xcb, 0xa2, 0x46, - 0xd5, 0x9a, 0xdc, 0xf4, 0x28, 0xbf, 0x0c, 0x2c, 0xf0, 0x23, 0x41, 0xfe, 0x36, 0x9c, 0xa3, 0x19, - 0xe3, 0x15, 0x46, 0xa0, 0xa5, 0x14, 0x52, 0x7f, 0xb7, 0x98, 0x92, 0x6f, 0xe4, 0x18, 0xa9, 0x8f, - 0xdf, 0xd3, 0xc5, 0x1d, 0x7a, 0xfa, 0x26, 0x0c, 0x88, 0x00, 0xba, 0xe2, 0x82, 0x01, 0x9d, 0xd9, - 0x1f, 0x71, 0x90, 0x7c, 0x43, 0x23, 0xa8, 0x48, 0x0b, 0x2e, 0x2f, 0xb3, 0x6e, 0x4a, 0xef, 0xcc, - 0xd2, 0x3e, 0x3a, 0xb3, 0x07, 0x3f, 0xf2, 0x1e, 0x5c, 0x42, 0x6c, 0x4a, 0xb7, 0x0e, 0x60, 0x55, - 0x18, 0xa3, 0x8a, 0x57, 0x95, 0xde, 0xb9, 0x59, 0xe5, 0xc9, 0x17, 0x61, 0x24, 0x18, 0x20, 0x26, - 0x75, 0xc5, 0xcd, 0x45, 0x8f, 0x71, 0xc6, 0x03, 0xc0, 0x31, 0x30, 0xba, 0x90, 0x45, 0x83, 0x88, - 0x45, 0x78, 0xa9, 0xff, 0x63, 0xae, 0x57, 0xde, 0x93, 0x23, 0x9f, 0x95, 0xdf, 0x86, 0x01, 0x83, - 0x7f, 0x94, 0xd0, 0xa9, 0xde, 0x99, 0x51, 0x38, 0xa9, 0xe6, 0x97, 0x51, 0xff, 0x49, 0xae, 0x67, - 0xba, 0x95, 0xe3, 0xfe, 0x79, 0xdf, 0x2c, 0x64, 0x7c, 0x9e, 0x98, 0x44, 0xaf, 0xc3, 0xb8, 0x19, - 0xc6, 0x83, 0xaf, 0x87, 0xe1, 0xa7, 0xb4, 0x33, 0x12, 0x1c, 0x47, 0xd7, 0x6d, 0xb8, 0xe8, 0x3b, - 0x3e, 0x3a, 0xbe, 0x87, 0x98, 0x5b, 0xef, 0x3a, 0x26, 0x1f, 0x97, 0xda, 0x79, 0x37, 0xe6, 0x3e, - 0xe6, 0xde, 0x77, 0x4c, 0x56, 0x81, 0xee, 0xad, 0x51, 0x4b, 0xaf, 0x6f, 0xd8, 0xce, 0x3a, 0x46, - 0x19, 0xe5, 0x83, 0x53, 0x3b, 0xc3, 0xe1, 0x0f, 0x7d, 0x30, 0x79, 0x0e, 0x46, 0x9b, 0xad, 0x2e, - 0x0d, 0xe2, 0x3a, 0xf2, 0xbb, 0x3e, 0x6d, 0x84, 0x01, 0x83, 0x1b, 0x92, 0xa7, 0x00, 0x90, 0xc8, - 0xc3, 0x64, 0x38, 0x78, 0xb1, 0xa7, 0x0d, 0x31, 0xc8, 0xb2, 0xe8, 0xae, 0xcb, 0x5c, 0xab, 0xb9, - 0x90, 0xea, 0x2d, 0xdb, 0x6a, 0xd6, 0x3d, 0xea, 0xb4, 0xb1, 0xa1, 0xe8, 0xcc, 0xa0, 0x5d, 0x44, - 0x0a, 0xbc, 0x3a, 0x71, 0xe7, 0x6c, 0xab, 0xb9, 0x4c, 0x9d, 0x36, 0x6b, 0xea, 0x0b, 0x40, 0x44, - 0x53, 0x1d, 0x3c, 0xf4, 0xe0, 0x1f, 0x87, 0xde, 0x0c, 0x9a, 0xf8, 0x08, 0x7e, 0x1a, 0x82, 0x1f, - 0x36, 0x01, 0xc3, 0x3c, 0xb8, 0x1d, 0x17, 0x1a, 0xba, 0x30, 0x68, 0xc0, 0x41, 0x28, 0xaf, 0x8b, - 0x20, 0xbc, 0x2b, 0xb8, 0x57, 0xb7, 0x26, 0x7e, 0xa9, 0x5f, 0x2b, 0xa4, 0x65, 0x88, 0x39, 0x90, - 0xa2, 0x85, 0xd3, 0x6a, 0x7e, 0x4f, 0xd3, 0xea, 0x19, 0xab, 0xdb, 0xae, 0xeb, 0x9d, 0x4e, 0x7d, - 0xd5, 0x6c, 0xe1, 0xb3, 0x2a, 0x5c, 0xf8, 0xb4, 0x51, 0xab, 0xdb, 0x2e, 0x77, 0x3a, 0x33, 0x1c, - 0x48, 0x9e, 0x87, 0xb3, 0x8c, 0x0e, 0x3b, 0x29, 0xa0, 0x2c, 0x22, 0x25, 0x63, 0x80, 0xd1, 0x61, - 0x7d, 0xda, 0x27, 0x60, 0x50, 0xf0, 0xe4, 0x6b, 0x55, 0xbf, 0x36, 0xc0, 0x99, 0xb9, 0xac, 0xe7, - 0x02, 0x36, 0x7c, 0x72, 0xed, 0xd7, 0x86, 0xfc, 0xf2, 0x18, 0x03, 0xd9, 0xea, 0xb6, 0x79, 0x44, - 0xac, 0x01, 0x44, 0x06, 0xbf, 0xc9, 0x55, 0x18, 0x63, 0x5c, 0x02, 0x81, 0xf1, 0xb0, 0xb1, 0xfd, - 0x5a, 0x0c, 0x4a, 0x6e, 0xc1, 0xf9, 0x08, 0x84, 0xdb, 0xa0, 0xfc, 0x99, 0x40, 0xbf, 0x96, 0x8a, - 0x53, 0xbf, 0x5d, 0x88, 0xe6, 0xad, 0x39, 0x82, 0x8e, 0xb8, 0x04, 0x03, 0xb6, 0xd3, 0xac, 0x77, - 0x9d, 0x96, 0x18, 0x7b, 0x25, 0xdb, 0x69, 0xde, 0x77, 0x5a, 0xe4, 0x02, 0x94, 0x58, 0xef, 0x98, - 0x86, 0x18, 0x62, 0xfd, 0x7a, 0xa7, 0x53, 0x35, 0x48, 0x99, 0x77, 0x08, 0x86, 0x1c, 0xad, 0x37, - 0x70, 0x6b, 0xcf, 0x9d, 0x12, 0xfa, 0xf9, 0x8a, 0x97, 0x40, 0x62, 0x3f, 0x61, 0x20, 0x52, 0x7e, - 0x10, 0x10, 0x63, 0x61, 0xe0, 0xb6, 0xc4, 0xe0, 0x7d, 0x12, 0x67, 0x21, 0x90, 0x21, 0x0b, 0xbe, - 0x89, 0x31, 0x48, 0x05, 0x48, 0x48, 0xd5, 0xb6, 0x0d, 0x73, 0xd5, 0xa4, 0xfc, 0x55, 0x47, 0x3f, - 0xbf, 0xf8, 0x4d, 0x62, 0xb5, 0x71, 0x9f, 0xc9, 0xbc, 0x80, 0x90, 0x37, 0xb9, 0x12, 0x72, 0x3a, - 0x5c, 0xfb, 0x78, 0xdf, 0x72, 0x3b, 0x2d, 0x86, 0x42, 0xcd, 0xc4, 0xf2, 0xb8, 0x10, 0xaa, 0x7f, - 0xb9, 0x98, 0x4c, 0x5e, 0x74, 0x24, 0x76, 0xcd, 0x2c, 0x80, 0xc8, 0x4d, 0x16, 0x5e, 0xae, 0x05, - 0x1e, 0xe7, 0x21, 0x26, 0x83, 0x87, 0x54, 0x96, 0x5c, 0x87, 0x41, 0xfe, 0x45, 0xd5, 0x8a, 0xb0, - 0x77, 0xd0, 0x45, 0xcc, 0xed, 0x98, 0xab, 0xab, 0xe8, 0x4f, 0x16, 0xa0, 0xc9, 0x55, 0x18, 0xa8, - 0x2c, 0xd4, 0x6a, 0xe5, 0x05, 0xff, 0xa6, 0x18, 0xdf, 0x97, 0x18, 0x96, 0x5b, 0x77, 0x75, 0xcb, - 0xd5, 0x7c, 0x24, 0x79, 0x0e, 0x4a, 0xd5, 0x25, 0x24, 0xe3, 0xaf, 0x26, 0x87, 0xb7, 0xb7, 0x26, - 0x06, 0xcc, 0x0e, 0xa7, 0x12, 0x28, 0xac, 0xf7, 0x41, 0xb5, 0x22, 0xb9, 0x4b, 0xf0, 0x7a, 0x1f, - 0x99, 0x06, 0x5e, 0x3b, 0x6b, 0x01, 0x9a, 0xbc, 0x02, 0x23, 0x35, 0xea, 0x98, 0x7a, 0x6b, 0xa1, - 0x8b, 0x5b, 0x45, 0x29, 0x94, 0xa2, 0x8b, 0xf0, 0xba, 0x85, 0x08, 0x2d, 0x42, 0x46, 0xae, 0x40, - 0x71, 0xd6, 0xb4, 0xfc, 0x27, 0x0c, 0xe8, 0xe3, 0xbe, 0x66, 0x5a, 0x9e, 0x86, 0x50, 0xf2, 0x1c, - 0x14, 0xee, 0x2e, 0x57, 0x85, 0x27, 0x18, 0xf2, 0x7a, 0xdf, 0x8b, 0x84, 0x65, 0xbc, 0xbb, 0x5c, - 0x25, 0xaf, 0xc0, 0x10, 0x5b, 0xc4, 0xa8, 0xd5, 0xa0, 0xae, 0x32, 0x8c, 0x1f, 0xc3, 0xc3, 0x08, - 0xfa, 0x40, 0xd9, 0xa7, 0x23, 0xa0, 0x54, 0xff, 0xcf, 0x7c, 0x7a, 0x76, 0xa9, 0x23, 0x18, 0xea, - 0xfb, 0xbc, 0x45, 0x8e, 0x29, 0x58, 0xf1, 0x00, 0x0a, 0xb6, 0x0a, 0x67, 0xca, 0x46, 0xdb, 0xb4, - 0xca, 0xf8, 0xd3, 0x9d, 0x9f, 0x29, 0xe3, 0xd4, 0x21, 0x3d, 0xcf, 0x8b, 0xa1, 0xc5, 0xf7, 0xf0, - 0x80, 0xbf, 0x0c, 0x55, 0xd7, 0x39, 0xae, 0xde, 0x5e, 0xd5, 0xeb, 0x0d, 0x9e, 0x98, 0x49, 0x8b, - 0x33, 0x55, 0x7f, 0x3a, 0xbf, 0x43, 0x42, 0xac, 0x93, 0x28, 0x7d, 0xf5, 0x5b, 0xf9, 0xde, 0x39, - 0xc9, 0x4e, 0xa4, 0x50, 0xfe, 0x30, 0x9f, 0x92, 0x21, 0xec, 0x40, 0x92, 0xb8, 0x0e, 0x83, 0x9c, - 0x4d, 0xe0, 0xc6, 0x8b, 0xb3, 0x19, 0x57, 0x56, 0x9c, 0x45, 0x7d, 0x34, 0x59, 0x80, 0xf3, 0xe5, - 0xd5, 0x55, 0xda, 0xf0, 0xc2, 0xd0, 0xcf, 0x0b, 0x61, 0x10, 0x56, 0x1e, 0xea, 0x56, 0xe0, 0xc3, - 0xd0, 0xd1, 0x18, 0x6c, 0x24, 0xb5, 0x1c, 0x59, 0x86, 0x8b, 0x71, 0x78, 0x8d, 0x6f, 0x01, 0x8a, - 0x52, 0xf4, 0xdb, 0x04, 0x47, 0xfe, 0x9f, 0x96, 0x51, 0x36, 0xad, 0x95, 0x38, 0x55, 0xf7, 0xf7, - 0x6a, 0x25, 0xce, 0xdb, 0xa9, 0xe5, 0xd4, 0xef, 0x14, 0xe4, 0x44, 0x6a, 0x27, 0xd7, 0xe1, 0xea, - 0x76, 0xc4, 0xcd, 0x7a, 0xb7, 0x43, 0xe6, 0x15, 0x11, 0x41, 0xc4, 0xe8, 0x3a, 0xbe, 0x47, 0x62, - 0x10, 0xc1, 0x00, 0x81, 0xf2, 0x3a, 0x14, 0x50, 0x92, 0x2a, 0x14, 0xcb, 0x4e, 0x93, 0x9b, 0xb7, - 0x3b, 0x3d, 0xaa, 0xd2, 0x9d, 0xa6, 0x9b, 0xfe, 0xa8, 0x8a, 0xb1, 0x50, 0xff, 0x54, 0xbe, 0x47, - 0xee, 0xb3, 0x13, 0x39, 0x89, 0xfc, 0xd9, 0x7c, 0x56, 0x16, 0xb3, 0xe3, 0xea, 0x3a, 0xf6, 0x21, - 0x0b, 0xe7, 0x78, 0xfb, 0xd5, 0x1d, 0xb2, 0x70, 0x32, 0x32, 0xaa, 0x9d, 0x0a, 0xe7, 0x6b, 0xf9, - 0xac, 0xa4, 0x72, 0x27, 0x76, 0x96, 0xc9, 0xc8, 0x63, 0x77, 0xaa, 0x2b, 0x3f, 0x9f, 0xcf, 0x4c, - 0xe5, 0x77, 0x2a, 0x1d, 0xf5, 0xeb, 0xf9, 0xcc, 0x54, 0x84, 0x27, 0x72, 0x28, 0xa5, 0x6a, 0xcb, - 0xe9, 0x58, 0x12, 0xd2, 0xf9, 0xfd, 0x7c, 0x7a, 0xf2, 0xc7, 0x23, 0x50, 0x95, 0xc3, 0xf0, 0xc0, - 0xf3, 0x05, 0x5a, 0x3c, 0x90, 0x40, 0xfb, 0x0f, 0x55, 0xa0, 0x47, 0x36, 0xf6, 0x3e, 0xae, 0x02, - 0x3d, 0x84, 0xc1, 0x7b, 0x92, 0x05, 0xfa, 0x53, 0x85, 0x64, 0xc2, 0xd3, 0x13, 0x79, 0x44, 0x39, - 0x09, 0x83, 0xfe, 0x19, 0x86, 0x10, 0xe8, 0xae, 0xbb, 0xd3, 0x2f, 0x47, 0xde, 0x81, 0x33, 0xa1, - 0x2c, 0xe5, 0xc8, 0x54, 0x78, 0xbd, 0xd1, 0x60, 0xa8, 0xfa, 0xfb, 0x0c, 0x27, 0x42, 0xa8, 0xc4, - 0xa9, 0xd5, 0x1f, 0x14, 0x92, 0x59, 0x63, 0x4f, 0x7b, 0x63, 0x9f, 0xbd, 0x71, 0x1f, 0x2e, 0x4e, - 0x75, 0x1d, 0x87, 0x5a, 0x5e, 0x7a, 0xa7, 0xe0, 0xe1, 0x72, 0x83, 0x53, 0xd4, 0x93, 0x9d, 0x93, - 0x51, 0x98, 0xb1, 0x15, 0xde, 0xf7, 0x71, 0xb6, 0x03, 0x21, 0xdb, 0x2e, 0xa7, 0x48, 0x63, 0x9b, - 0x5e, 0x58, 0xfd, 0x7b, 0xf9, 0x64, 0x9e, 0xdf, 0xd3, 0xae, 0xdf, 0x5f, 0xd7, 0xab, 0x7f, 0x3e, - 0xdf, 0x23, 0xd7, 0xf1, 0xa9, 0xa1, 0xc7, 0x4f, 0xf2, 0x32, 0x13, 0x2c, 0x9f, 0xc4, 0x8d, 0x41, - 0x86, 0xc6, 0x9c, 0x6e, 0x0d, 0xfc, 0x23, 0x99, 0x42, 0x3c, 0x23, 0xf6, 0xa9, 0xc9, 0xb5, 0xff, - 0x09, 0xce, 0x97, 0x24, 0xae, 0x44, 0xd2, 0x57, 0xf8, 0xf0, 0xac, 0xaf, 0xf0, 0xf1, 0xea, 0xaf, - 0x16, 0xe3, 0xd9, 0xc5, 0x4f, 0xbb, 0xe3, 0xe8, 0xba, 0x83, 0x2c, 0xc2, 0x79, 0x61, 0x2d, 0xf8, - 0x20, 0x4c, 0xfa, 0x21, 0x2c, 0x02, 0x9e, 0x3b, 0x50, 0x18, 0x1a, 0x5d, 0x97, 0x3a, 0x75, 0x4f, - 0x77, 0xd7, 0xeb, 0x98, 0x25, 0x44, 0x4b, 0x2d, 0xc8, 0x18, 0x0a, 0x3b, 0x21, 0xca, 0x70, 0x30, - 0x64, 0xe8, 0x9b, 0x18, 0x09, 0x86, 0x69, 0x05, 0xd5, 0xdf, 0xca, 0xc1, 0x78, 0xfc, 0x73, 0xc8, - 0x0d, 0x18, 0x64, 0xbf, 0x83, 0x40, 0x0b, 0x52, 0x66, 0x72, 0xce, 0x91, 0x3b, 0x61, 0xf8, 0x34, - 0xe4, 0x55, 0x18, 0x42, 0x7f, 0x17, 0x2c, 0x90, 0x0f, 0xe3, 0x5b, 0x84, 0x05, 0x30, 0x5d, 0x2e, - 0x2f, 0x16, 0x92, 0x92, 0x37, 0x61, 0xb8, 0x1a, 0x3a, 0xf6, 0x89, 0x5b, 0x4e, 0xf4, 0x27, 0x96, - 0x4a, 0x86, 0x04, 0x9a, 0x4c, 0xad, 0x7e, 0x2f, 0x1f, 0xcf, 0x82, 0x7f, 0xaa, 0xea, 0xfb, 0x53, - 0xf5, 0xe7, 0xe7, 0xb9, 0xaa, 0xdf, 0x33, 0x2d, 0x83, 0x3c, 0x01, 0x17, 0xee, 0xd7, 0xa6, 0xb5, - 0xfa, 0xbd, 0xea, 0x42, 0xa5, 0x7e, 0x7f, 0xa1, 0xb6, 0x34, 0x3d, 0x55, 0x9d, 0xa9, 0x4e, 0x57, - 0xc6, 0xfb, 0xc8, 0x39, 0x38, 0x13, 0xa2, 0x66, 0xef, 0xcf, 0x97, 0x17, 0xc6, 0x73, 0xe4, 0x2c, - 0x8c, 0x86, 0xc0, 0xc9, 0xc5, 0xe5, 0xf1, 0xfc, 0xf3, 0x9f, 0x82, 0x61, 0x74, 0x68, 0xe4, 0x0e, - 0x18, 0x64, 0x04, 0x06, 0x17, 0x27, 0x6b, 0xd3, 0xda, 0x03, 0x64, 0x02, 0x50, 0xaa, 0x4c, 0x2f, - 0x30, 0x86, 0xb9, 0xe7, 0xff, 0x9f, 0x1c, 0x40, 0x6d, 0x66, 0x79, 0x49, 0x10, 0x0e, 0xc3, 0x40, - 0x75, 0xe1, 0x41, 0x79, 0xae, 0xca, 0xe8, 0x06, 0xa1, 0xb8, 0xb8, 0x34, 0xcd, 0x6a, 0x18, 0x82, - 0xfe, 0xa9, 0xb9, 0xc5, 0xda, 0xf4, 0x78, 0x9e, 0x01, 0xb5, 0xe9, 0x72, 0x65, 0xbc, 0xc0, 0x80, - 0x0f, 0xb5, 0xea, 0xf2, 0xf4, 0x78, 0x91, 0xfd, 0x39, 0x57, 0x5b, 0x2e, 0x2f, 0x8f, 0xf7, 0xb3, - 0x3f, 0x67, 0xf0, 0xcf, 0x12, 0x63, 0x56, 0x9b, 0x5e, 0xc6, 0x1f, 0x03, 0xac, 0x09, 0x33, 0xfe, - 0xaf, 0x41, 0x86, 0x62, 0xac, 0x2b, 0x55, 0x6d, 0x7c, 0x88, 0xfd, 0x60, 0x2c, 0xd9, 0x0f, 0x60, - 0x8d, 0xd3, 0xa6, 0xe7, 0x17, 0x1f, 0x4c, 0x8f, 0x0f, 0x33, 0x5e, 0xf3, 0xf7, 0x18, 0x78, 0x84, - 0xfd, 0xa9, 0xcd, 0xb3, 0x3f, 0x47, 0x19, 0x27, 0x6d, 0xba, 0x3c, 0xb7, 0x54, 0x5e, 0x9e, 0x1d, - 0x1f, 0x63, 0xed, 0x41, 0x9e, 0x67, 0x78, 0xc9, 0x85, 0xf2, 0xfc, 0xf4, 0xf8, 0xb8, 0xa0, 0xa9, - 0xcc, 0x55, 0x17, 0xee, 0x8d, 0x9f, 0xc5, 0x86, 0xbc, 0x37, 0x8f, 0x3f, 0x08, 0x2b, 0x80, 0x7f, - 0x9d, 0x7b, 0xfe, 0x87, 0xa1, 0xb4, 0x58, 0xc3, 0x51, 0x70, 0x09, 0xce, 0x2d, 0xd6, 0xea, 0xcb, - 0xef, 0x2d, 0x4d, 0xc7, 0xe4, 0x7d, 0x16, 0x46, 0x7d, 0xc4, 0x5c, 0x75, 0xe1, 0xfe, 0x17, 0xb8, - 0xb4, 0x7d, 0xd0, 0x7c, 0x79, 0x6a, 0xb1, 0x36, 0x9e, 0x67, 0xbd, 0xe2, 0x83, 0x1e, 0x56, 0x17, - 0x2a, 0x8b, 0x0f, 0x6b, 0xe3, 0x85, 0xe7, 0x1f, 0xc1, 0x08, 0xcf, 0x96, 0xba, 0xe8, 0x98, 0x4d, - 0xd3, 0x22, 0x4f, 0xc1, 0x13, 0x95, 0xe9, 0x07, 0xd5, 0xa9, 0xe9, 0xfa, 0xa2, 0x56, 0xbd, 0x53, - 0x5d, 0x88, 0xd5, 0x74, 0x01, 0xce, 0x46, 0xd1, 0xe5, 0xa5, 0xea, 0x78, 0x8e, 0x5c, 0x04, 0x12, - 0x05, 0xdf, 0x2d, 0xcf, 0xcf, 0x8c, 0xe7, 0x89, 0x02, 0xe7, 0xa3, 0xf0, 0xea, 0xc2, 0xf2, 0xfd, - 0x85, 0xe9, 0xf1, 0xc2, 0xf3, 0x7f, 0x29, 0x07, 0x17, 0x52, 0x23, 0x6a, 0x13, 0x15, 0x9e, 0x9e, - 0x9e, 0x2b, 0xd7, 0x96, 0xab, 0x53, 0xb5, 0xe9, 0xb2, 0x36, 0x35, 0x5b, 0x9f, 0x2a, 0x2f, 0x4f, - 0xdf, 0x59, 0xd4, 0xde, 0xab, 0xdf, 0x99, 0x5e, 0x98, 0xd6, 0xca, 0x73, 0xe3, 0x7d, 0xe4, 0x39, - 0x98, 0xc8, 0xa0, 0xa9, 0x4d, 0x4f, 0xdd, 0xd7, 0xaa, 0xcb, 0xef, 0x8d, 0xe7, 0xc8, 0xb3, 0xf0, - 0x54, 0x26, 0x11, 0xfb, 0x3d, 0x9e, 0x27, 0x4f, 0xc3, 0xe5, 0x2c, 0x92, 0x77, 0xe7, 0xc6, 0x0b, - 0xcf, 0xff, 0x5c, 0x0e, 0x48, 0x32, 0x24, 0x32, 0x79, 0x06, 0xae, 0x30, 0xbd, 0xa8, 0x67, 0x37, - 0xf0, 0x59, 0x78, 0x2a, 0x95, 0x42, 0x6a, 0xde, 0x04, 0x3c, 0x99, 0x41, 0x22, 0x1a, 0x77, 0x05, - 0x94, 0x74, 0x02, 0x6c, 0xda, 0x6f, 0xe6, 0xe0, 0x42, 0xaa, 0xcf, 0x13, 0xb9, 0x06, 0x9f, 0x28, - 0x57, 0xe6, 0x59, 0xdf, 0x4c, 0x2d, 0x57, 0x17, 0x17, 0x6a, 0xf5, 0xf9, 0x99, 0x72, 0x9d, 0x69, - 0xdf, 0xfd, 0x5a, 0xac, 0x37, 0xaf, 0x82, 0xda, 0x83, 0x72, 0x6a, 0xb6, 0xbc, 0x70, 0x87, 0x0d, - 0x3f, 0xf2, 0x09, 0x78, 0x26, 0x93, 0x6e, 0x7a, 0xa1, 0x3c, 0x39, 0x37, 0x5d, 0x19, 0xcf, 0x93, - 0x4f, 0xc2, 0xb3, 0x99, 0x54, 0x95, 0x6a, 0x8d, 0x93, 0x15, 0x26, 0x2b, 0xdf, 0xfb, 0x9f, 0x9f, - 0xee, 0xfb, 0xde, 0x1f, 0x3c, 0x9d, 0xfb, 0xfb, 0x7f, 0xf0, 0x74, 0xee, 0x9f, 0xfe, 0xc1, 0xd3, - 0xb9, 0x2f, 0xde, 0xda, 0x4b, 0xa8, 0x6b, 0x3e, 0x6d, 0xad, 0x94, 0xd0, 0xff, 0xe0, 0xe5, 0x7f, - 0x15, 0x00, 0x00, 0xff, 0xff, 0x7b, 0x1a, 0x9a, 0x96, 0x1e, 0x80, 0x01, 0x00, + 0x52, 0x06, 0x8b, 0x56, 0xba, 0xb5, 0x39, 0x5e, 0x6c, 0xd9, 0xcd, 0x87, 0x1a, 0xd2, 0xab, 0xff, + 0x32, 0xc7, 0x65, 0x77, 0xc4, 0x5f, 0x95, 0xfa, 0x9f, 0x5f, 0xdc, 0xe5, 0xe7, 0xff, 0xe9, 0x1c, + 0x9c, 0xd5, 0x68, 0xd3, 0x7e, 0x44, 0x9d, 0x8d, 0x49, 0xdb, 0xa0, 0xb7, 0xa9, 0x45, 0x9d, 0xc3, + 0x1a, 0x51, 0xbf, 0x8f, 0xc9, 0x33, 0xc2, 0xc6, 0xdc, 0x73, 0xa9, 0x71, 0x74, 0x12, 0x9b, 0xa8, + 0xbf, 0x39, 0x00, 0x4a, 0xaa, 0xd5, 0x7b, 0x64, 0xcd, 0xb9, 0xcc, 0xad, 0x4c, 0xf1, 0xa0, 0xb6, + 0x32, 0xfd, 0xbb, 0xdb, 0xca, 0x94, 0x76, 0xbb, 0x95, 0x19, 0xd8, 0xc9, 0x56, 0xa6, 0x1d, 0xdf, + 0xca, 0x94, 0x71, 0x2b, 0xf3, 0x52, 0xcf, 0xad, 0xcc, 0x94, 0x65, 0xec, 0x71, 0x23, 0x73, 0x64, + 0x93, 0xee, 0xee, 0x65, 0x07, 0x76, 0x95, 0x4d, 0x8a, 0x4d, 0xdb, 0x31, 0xa8, 0x21, 0x36, 0x5e, + 0x78, 0xea, 0xef, 0x08, 0x98, 0x16, 0x60, 0x13, 0x19, 0x8c, 0x47, 0x76, 0x92, 0xc1, 0xf8, 0x00, + 0xf6, 0x5f, 0x1f, 0xe4, 0xe1, 0xf4, 0x24, 0x75, 0x3c, 0x1e, 0xc2, 0xf3, 0x20, 0x5c, 0xe2, 0x2a, + 0x70, 0x4a, 0x62, 0x88, 0x16, 0x79, 0x3e, 0x74, 0xf3, 0x6b, 0x52, 0xc7, 0x8b, 0x7b, 0x09, 0xc6, + 0xe9, 0x59, 0xf5, 0x7e, 0x16, 0x31, 0x31, 0x76, 0x83, 0xea, 0x7d, 0x38, 0x17, 0xa4, 0x29, 0x7e, + 0x69, 0x01, 0xbd, 0x94, 0x18, 0xac, 0xb8, 0xfb, 0xc4, 0x60, 0xea, 0xaf, 0xe6, 0xe0, 0x8a, 0x46, + 0x2d, 0xba, 0xae, 0x2f, 0xb7, 0xa8, 0xd4, 0x2c, 0xb1, 0x32, 0xb0, 0x59, 0xc3, 0x74, 0xdb, 0xba, + 0xd7, 0x5c, 0xdb, 0x97, 0x8c, 0xa6, 0x61, 0x58, 0x9e, 0xbf, 0x76, 0x31, 0xb7, 0x45, 0xca, 0xa9, + 0xbf, 0x59, 0x84, 0x81, 0x09, 0xdb, 0xbb, 0x63, 0xef, 0x33, 0x53, 0x5d, 0x38, 0xe5, 0xe7, 0x77, + 0x71, 0xd6, 0xf3, 0x39, 0xac, 0x5c, 0x0a, 0xde, 0x8f, 0x2e, 0xa4, 0xcb, 0x76, 0x22, 0xc9, 0x81, + 0x4f, 0xb6, 0xcb, 0x1c, 0x75, 0xaf, 0xc0, 0x20, 0x46, 0x7f, 0x91, 0x4e, 0x63, 0xd1, 0x41, 0xdb, + 0x63, 0xc0, 0x78, 0x1d, 0x21, 0x29, 0xf9, 0xa1, 0x48, 0xcc, 0xd1, 0xd2, 0xfe, 0x73, 0xda, 0xc9, + 0xe1, 0x47, 0x5f, 0xe2, 0x17, 0x79, 0xd8, 0x26, 0x29, 0xff, 0x07, 0x9e, 0xa2, 0xc4, 0x9a, 0x14, + 0x10, 0x1e, 0x60, 0xbe, 0xb9, 0x49, 0x18, 0x99, 0xb0, 0x3d, 0xc9, 0x19, 0x78, 0x30, 0x7c, 0x06, + 0xca, 0x24, 0x9f, 0xee, 0x09, 0x1c, 0x2d, 0xa3, 0x7e, 0xbf, 0x08, 0xc3, 0xfe, 0xcf, 0x43, 0xd2, + 0x9d, 0x17, 0xa0, 0x34, 0x63, 0x4b, 0x29, 0x10, 0xd0, 0x81, 0x78, 0xcd, 0x76, 0x63, 0x9e, 0xd1, + 0x82, 0x88, 0x49, 0x7d, 0xde, 0x36, 0x64, 0xf7, 0x77, 0x94, 0xba, 0x65, 0x1b, 0x89, 0xe7, 0xc3, + 0x01, 0x21, 0xb9, 0x02, 0x45, 0x7c, 0x39, 0x20, 0x1d, 0xe4, 0xc7, 0x5e, 0x0b, 0x20, 0x5e, 0xd2, + 0xca, 0xd2, 0x6e, 0xb5, 0x72, 0x60, 0xaf, 0x5a, 0x59, 0x3e, 0x58, 0xad, 0x7c, 0x17, 0x86, 0xb1, + 0x26, 0x3f, 0x83, 0xda, 0xf6, 0x0b, 0xeb, 0x45, 0xb1, 0xf6, 0x8d, 0xf0, 0x76, 0x8b, 0x3c, 0x6a, + 0xb8, 0xe4, 0x45, 0x58, 0xc5, 0x74, 0x17, 0xf6, 0xb1, 0x9d, 0xfe, 0x47, 0x39, 0x18, 0xb8, 0x67, + 0x3d, 0xb4, 0xec, 0xf5, 0xfd, 0x69, 0xdc, 0x4b, 0x30, 0x24, 0xd8, 0x48, 0xab, 0x0b, 0xbe, 0x08, + 0xef, 0x72, 0x70, 0x03, 0x39, 0x69, 0x32, 0x15, 0x79, 0x33, 0x28, 0x84, 0x8f, 0x83, 0x0a, 0x61, + 0x12, 0x11, 0xbf, 0x50, 0x33, 0x9a, 0xf7, 0x40, 0x26, 0x27, 0x97, 0xa1, 0x58, 0x65, 0x4d, 0x95, + 0xa2, 0xe8, 0xb2, 0xa6, 0x68, 0x08, 0x55, 0x3f, 0x28, 0xc2, 0x68, 0xec, 0xe0, 0xeb, 0x39, 0x18, + 0x14, 0x07, 0x4f, 0xa6, 0x9f, 0x88, 0x01, 0x1f, 0x0f, 0x05, 0x40, 0xad, 0xcc, 0xff, 0xac, 0x19, + 0xe4, 0x0b, 0x30, 0x60, 0xbb, 0xb8, 0x28, 0xe2, 0xb7, 0x8c, 0x86, 0x43, 0x68, 0xa1, 0xce, 0xda, + 0xce, 0x07, 0x87, 0x20, 0x91, 0x35, 0xd2, 0x76, 0xf1, 0xd3, 0x6e, 0xc1, 0xa0, 0xee, 0xba, 0xd4, + 0x6b, 0x78, 0xfa, 0xaa, 0x9c, 0x9b, 0x21, 0x00, 0xca, 0xa3, 0x03, 0x81, 0x4b, 0xfa, 0x2a, 0xf9, + 0x22, 0x8c, 0x34, 0x1d, 0x8a, 0xcb, 0xa6, 0xde, 0x62, 0xad, 0x94, 0xcc, 0xda, 0x08, 0x42, 0xbe, + 0x3f, 0x09, 0x11, 0x35, 0x83, 0xdc, 0x87, 0x11, 0xf1, 0x39, 0xdc, 0x73, 0x1f, 0x07, 0xda, 0x68, + 0xb8, 0x8c, 0x71, 0x91, 0x70, 0xdf, 0x7d, 0xf1, 0x80, 0x43, 0x26, 0x97, 0xf9, 0x1a, 0x12, 0x29, + 0x59, 0x00, 0xb2, 0x4e, 0x97, 0x1b, 0x7a, 0xd7, 0x5b, 0x63, 0x75, 0xf1, 0xd0, 0xe2, 0x22, 0x25, + 0x21, 0xbe, 0x7a, 0x48, 0x62, 0xe5, 0xc7, 0x20, 0xeb, 0x74, 0xb9, 0x12, 0x41, 0x92, 0x07, 0x70, + 0x2e, 0x59, 0x84, 0x7d, 0x32, 0xbf, 0x1c, 0x78, 0x76, 0x6b, 0x73, 0x7c, 0x3c, 0x95, 0x40, 0x62, + 0x7b, 0x26, 0xc1, 0xb6, 0x66, 0xdc, 0x29, 0x96, 0x07, 0xc6, 0xca, 0xda, 0x28, 0x2b, 0xeb, 0x9b, + 0x90, 0xa6, 0xa1, 0xfe, 0x41, 0x8e, 0x99, 0x8a, 0xec, 0x83, 0x30, 0x27, 0x33, 0xd3, 0xf5, 0xf6, + 0x2e, 0x75, 0xbd, 0x1d, 0x66, 0x4f, 0x2c, 0xb9, 0x3d, 0x66, 0x57, 0x4d, 0x60, 0xc9, 0x75, 0x28, + 0x19, 0xf2, 0xa9, 0xd9, 0xf9, 0x68, 0x27, 0xf8, 0xf5, 0x68, 0x82, 0x8a, 0x5c, 0x85, 0x22, 0x5b, + 0xb2, 0xe2, 0x5b, 0x66, 0xd9, 0xba, 0xd0, 0x90, 0x42, 0xfd, 0xb1, 0x3c, 0x0c, 0x4b, 0x5f, 0x73, + 0x73, 0x5f, 0x9f, 0xf3, 0xfa, 0xce, 0x9a, 0xe9, 0x3b, 0xbd, 0xe0, 0x5e, 0xca, 0x6f, 0xf2, 0xad, + 0x40, 0x14, 0x3b, 0xba, 0x90, 0x12, 0x82, 0x79, 0x45, 0x7c, 0x68, 0x69, 0xe7, 0xdb, 0x47, 0x46, + 0x7f, 0xa7, 0x58, 0xce, 0x8f, 0x15, 0xee, 0x14, 0xcb, 0xc5, 0xb1, 0x7e, 0x8c, 0xc3, 0x85, 0xa1, + 0xaf, 0xf9, 0xde, 0xdc, 0x5a, 0x31, 0x57, 0x8f, 0xf8, 0xdb, 0x91, 0x83, 0x8d, 0x51, 0x16, 0x93, + 0xcd, 0x11, 0x7f, 0x48, 0xf2, 0x91, 0xca, 0xe6, 0x24, 0xdb, 0xa2, 0x90, 0xcd, 0x3f, 0xce, 0x81, + 0x92, 0x2a, 0x9b, 0xca, 0x21, 0xf9, 0x41, 0x1c, 0x5c, 0xce, 0xc5, 0x3f, 0xca, 0xc3, 0xe9, 0x9a, + 0xe5, 0xd1, 0x55, 0xbe, 0x63, 0x3c, 0xe2, 0x53, 0xc5, 0x5d, 0x18, 0x92, 0x3e, 0x46, 0xf4, 0xf9, + 0x13, 0xc1, 0x7e, 0x3c, 0x44, 0x65, 0x70, 0x92, 0x4b, 0x1f, 0x60, 0x9a, 0xf6, 0x98, 0x90, 0x8f, + 0xf8, 0x9c, 0x73, 0x34, 0x84, 0x7c, 0xc4, 0x27, 0xaf, 0x8f, 0xa9, 0x90, 0xff, 0xf7, 0x1c, 0x9c, + 0x49, 0xa9, 0x9c, 0x5c, 0x81, 0x81, 0x7a, 0x77, 0x19, 0xc3, 0x6e, 0xe5, 0x42, 0x8f, 0x61, 0xb7, + 0xbb, 0x8c, 0x11, 0xb7, 0x34, 0x1f, 0x49, 0x96, 0xf0, 0x71, 0xfd, 0x42, 0xad, 0x3a, 0x29, 0xa4, + 0xaa, 0x4a, 0x61, 0x02, 0x18, 0x38, 0xed, 0xcb, 0x82, 0x07, 0xf8, 0xb6, 0x69, 0x34, 0x63, 0x0f, + 0xf0, 0x59, 0x19, 0xf2, 0xc3, 0x30, 0x58, 0x79, 0xbf, 0xeb, 0x50, 0xe4, 0xcb, 0x25, 0xfe, 0xa9, + 0x80, 0xaf, 0x8f, 0x48, 0xe3, 0xcc, 0x63, 0x09, 0x30, 0x8a, 0x38, 0xef, 0x90, 0xa1, 0xfa, 0xf5, + 0x1c, 0x5c, 0xca, 0x6e, 0x1d, 0xf9, 0x1c, 0x0c, 0xb0, 0x9d, 0x79, 0x45, 0x9b, 0x17, 0x9f, 0xce, + 0xf3, 0x93, 0xda, 0x2d, 0xda, 0xd0, 0x1d, 0xd9, 0xd8, 0xf7, 0xc9, 0xc8, 0x5b, 0x30, 0x54, 0x73, + 0xdd, 0x2e, 0x75, 0xea, 0x2f, 0xdd, 0xd3, 0x6a, 0x62, 0x4f, 0x88, 0x7b, 0x0e, 0x13, 0xc1, 0x0d, + 0xf7, 0xa5, 0x58, 0x60, 0x2d, 0x99, 0x5e, 0xfd, 0xc9, 0x1c, 0x5c, 0xee, 0xf5, 0x55, 0xe4, 0x25, + 0x28, 0x2f, 0x51, 0x4b, 0xb7, 0xbc, 0x5a, 0x55, 0x34, 0x09, 0xb7, 0x58, 0x1e, 0xc2, 0xa2, 0x3b, + 0x85, 0x80, 0x90, 0x15, 0xe2, 0xe7, 0x8a, 0x81, 0x23, 0x03, 0x3f, 0x03, 0x45, 0x58, 0xac, 0x90, + 0x4f, 0xa8, 0xfe, 0x61, 0x1e, 0x86, 0x17, 0x5b, 0xdd, 0x55, 0x53, 0x5a, 0x38, 0xf6, 0x6c, 0x6f, + 0xfb, 0xd6, 0x6f, 0x7e, 0x77, 0xd6, 0x2f, 0x1b, 0x6e, 0xce, 0x1e, 0x87, 0x9b, 0x5f, 0x8e, 0xbc, + 0x09, 0xa5, 0x0e, 0x7e, 0x47, 0xfc, 0x24, 0x96, 0x7f, 0x5d, 0xd6, 0x49, 0x2c, 0x2f, 0xc3, 0xc6, + 0x57, 0x73, 0x1f, 0xe3, 0x2b, 0x2c, 0x2b, 0x09, 0x34, 0x5c, 0x24, 0x4e, 0x04, 0x7a, 0x20, 0x02, + 0x0d, 0x17, 0x84, 0x13, 0x81, 0xee, 0x43, 0xa0, 0xbf, 0x99, 0x87, 0xd1, 0x68, 0x95, 0xe4, 0x73, + 0x30, 0xc4, 0xab, 0xe1, 0xe7, 0x42, 0x39, 0xc9, 0xa9, 0x38, 0x04, 0x6b, 0xc0, 0x7f, 0x88, 0x03, + 0xae, 0x53, 0x6b, 0xba, 0xdb, 0x08, 0x4f, 0x68, 0xf8, 0xfd, 0x6d, 0x99, 0x7b, 0x42, 0xc5, 0x50, + 0xda, 0xe8, 0x9a, 0xee, 0x4e, 0x86, 0xbf, 0xc9, 0x14, 0x10, 0x87, 0x76, 0x5d, 0x1a, 0x65, 0x50, + 0x44, 0x06, 0x22, 0x39, 0x74, 0x1c, 0xab, 0x9d, 0xe6, 0x30, 0x99, 0xcd, 0x57, 0x82, 0x66, 0xa3, + 0x32, 0xf4, 0xef, 0x20, 0x73, 0xb5, 0x44, 0x9f, 0x7e, 0xcc, 0xc9, 0x09, 0xaa, 0xba, 0xa7, 0xf3, + 0x4d, 0xb9, 0xdf, 0x01, 0xea, 0x87, 0x36, 0xf4, 0x2f, 0x58, 0x74, 0x61, 0x85, 0xbc, 0x08, 0x83, + 0x4c, 0x61, 0x66, 0x6d, 0xd6, 0x97, 0x39, 0xe1, 0x3f, 0x21, 0x69, 0x12, 0x22, 0x66, 0xfa, 0xb4, + 0x90, 0x8a, 0xdc, 0xe2, 0xd9, 0xef, 0xf9, 0x1c, 0x2b, 0xb4, 0x8f, 0xc8, 0x65, 0x38, 0x66, 0xa6, + 0x4f, 0x93, 0xe8, 0xfc, 0x52, 0xe2, 0x81, 0x4e, 0x21, 0x59, 0x8a, 0x63, 0xfc, 0x52, 0x62, 0x7c, + 0xcc, 0xa6, 0x25, 0x96, 0x8f, 0xef, 0x9e, 0x92, 0x14, 0x33, 0x7d, 0x5a, 0x7a, 0x42, 0xfa, 0x61, + 0xd9, 0xa1, 0x34, 0xee, 0xf4, 0x21, 0xe3, 0x66, 0xfa, 0xb4, 0x08, 0x2d, 0x79, 0x15, 0x86, 0xc4, + 0xef, 0x3b, 0xb6, 0xb8, 0x51, 0x96, 0x62, 0x11, 0x49, 0xa8, 0x99, 0x3e, 0x4d, 0xa6, 0x94, 0x2a, + 0x5d, 0x74, 0x4c, 0xcb, 0x13, 0x6f, 0x94, 0xe3, 0x95, 0x22, 0x4e, 0xaa, 0x14, 0x7f, 0x93, 0xb7, + 0x60, 0x24, 0x08, 0xf2, 0xf4, 0x1e, 0x6d, 0x7a, 0xe2, 0xf0, 0xfb, 0x5c, 0xac, 0x30, 0x47, 0xce, + 0xf4, 0x69, 0x51, 0x6a, 0x72, 0x15, 0x4a, 0x1a, 0x75, 0xcd, 0xf7, 0xfd, 0xeb, 0xe2, 0x51, 0x69, + 0x9c, 0x9b, 0xef, 0x33, 0x29, 0x09, 0x3c, 0xeb, 0x9d, 0xf0, 0x7e, 0x5a, 0x1c, 0x55, 0x93, 0x58, + 0x2d, 0x53, 0x96, 0xc1, 0x7a, 0x47, 0x72, 0x4e, 0xf8, 0x62, 0x18, 0xfa, 0x4a, 0x24, 0xcc, 0x1c, + 0x8a, 0xc7, 0x18, 0x90, 0xb1, 0x33, 0x7d, 0x5a, 0x8c, 0x5e, 0x92, 0x6a, 0xd5, 0x74, 0x1f, 0x8a, + 0x68, 0xa3, 0x71, 0xa9, 0x32, 0x94, 0x24, 0x55, 0xf6, 0x53, 0xaa, 0x7a, 0x9e, 0x7a, 0xeb, 0xb6, + 0xf3, 0x50, 0xc4, 0x16, 0x8d, 0x57, 0x2d, 0xb0, 0x52, 0xd5, 0x02, 0x22, 0x57, 0xcd, 0x06, 0xdc, + 0x68, 0x7a, 0xd5, 0xba, 0xa7, 0xcb, 0x55, 0xf3, 0x93, 0x38, 0xbf, 0x93, 0x66, 0xa9, 0xfe, 0x88, + 0xe7, 0x2d, 0x4f, 0x76, 0x28, 0xe2, 0xa4, 0x0e, 0xc5, 0xdf, 0xac, 0x52, 0x29, 0x37, 0xb5, 0x48, + 0x4c, 0x1e, 0x54, 0x2a, 0xa1, 0x58, 0xa5, 0x72, 0x16, 0xeb, 0x5b, 0x72, 0xca, 0x66, 0xe5, 0x74, + 0xb4, 0x83, 0x42, 0x0c, 0xeb, 0x20, 0x29, 0xb5, 0xf3, 0x38, 0xa6, 0x83, 0x55, 0x08, 0x92, 0x0f, + 0x05, 0x2d, 0x9c, 0x5c, 0x9c, 0xe9, 0xd3, 0x30, 0x51, 0xac, 0xca, 0x13, 0x0d, 0x2b, 0x67, 0x90, + 0x62, 0xd8, 0xa7, 0x60, 0xb0, 0x99, 0x3e, 0x8d, 0x27, 0x21, 0x7e, 0x51, 0x4a, 0xe9, 0xa7, 0x9c, + 0x8d, 0x4e, 0x11, 0x01, 0x82, 0x4d, 0x11, 0x61, 0xe2, 0xbf, 0xe9, 0x64, 0xda, 0x3b, 0xe5, 0x5c, + 0x74, 0xa9, 0x89, 0xe3, 0x67, 0xfa, 0xb4, 0x64, 0xaa, 0xbc, 0x57, 0x23, 0x99, 0xe0, 0x94, 0xf3, + 0xb1, 0x00, 0x60, 0x21, 0x8a, 0x89, 0x4b, 0xce, 0x19, 0xb7, 0x10, 0xcb, 0x5a, 0x2e, 0x26, 0xab, + 0x0b, 0xd1, 0x8d, 0x4b, 0x0a, 0xc9, 0x4c, 0x9f, 0x96, 0x56, 0x92, 0x4c, 0x26, 0xf2, 0xb1, 0x29, + 0x4a, 0xd4, 0x37, 0x26, 0x86, 0x9e, 0xe9, 0xd3, 0x12, 0x19, 0xdc, 0x6e, 0xc9, 0x89, 0xd0, 0x94, + 0x8b, 0xd1, 0x4e, 0x0c, 0x31, 0xac, 0x13, 0xa5, 0x84, 0x69, 0xb7, 0xe4, 0xe4, 0x58, 0xca, 0xa5, + 0x64, 0xa9, 0x70, 0xe6, 0x94, 0x92, 0x68, 0x69, 0xe9, 0xf9, 0x7e, 0x94, 0x27, 0x44, 0xc6, 0x55, + 0x51, 0x3e, 0x8d, 0x66, 0xa6, 0x4f, 0x4b, 0xcf, 0x15, 0xa4, 0xa5, 0x27, 0xca, 0x51, 0x2e, 0xf7, + 0xe2, 0x19, 0xb4, 0x2e, 0x3d, 0xc9, 0x8e, 0xde, 0x23, 0x6d, 0x89, 0xf2, 0x64, 0x34, 0xfa, 0x70, + 0x26, 0xe1, 0x4c, 0x9f, 0xd6, 0x23, 0xf9, 0xc9, 0xbd, 0x8c, 0x1c, 0x22, 0xca, 0x53, 0xd1, 0x84, + 0xcb, 0xa9, 0x44, 0x33, 0x7d, 0x5a, 0x46, 0x06, 0x92, 0x7b, 0x19, 0x29, 0x26, 0x94, 0xf1, 0x9e, + 0x6c, 0x03, 0x79, 0x64, 0x24, 0xa8, 0x58, 0x48, 0xcd, 0xce, 0xa0, 0x3c, 0x1d, 0x55, 0xdd, 0x14, + 0x12, 0xa6, 0xba, 0x69, 0x79, 0x1d, 0x16, 0x52, 0xd3, 0x09, 0x28, 0xcf, 0xf4, 0x60, 0x18, 0xb4, + 0x31, 0x35, 0x11, 0xc1, 0x42, 0x6a, 0x3c, 0x7f, 0x45, 0x8d, 0x32, 0x4c, 0x21, 0x61, 0x0c, 0xd3, + 0x32, 0x01, 0x2c, 0xa4, 0x86, 0x7d, 0x57, 0x9e, 0xed, 0xc1, 0x30, 0x6c, 0x61, 0x5a, 0xc0, 0xf8, + 0x57, 0x23, 0x71, 0xd7, 0x95, 0x4f, 0x45, 0xe7, 0x0d, 0x09, 0xc5, 0xe6, 0x0d, 0x39, 0x42, 0xfb, + 0x64, 0x22, 0xb2, 0xac, 0xf2, 0xe9, 0xe8, 0x30, 0x8f, 0xa1, 0xd9, 0x30, 0x8f, 0xc7, 0xa2, 0x9d, + 0x4c, 0x44, 0xd8, 0x54, 0xae, 0x64, 0x31, 0x41, 0x74, 0x94, 0x09, 0x8f, 0xc9, 0x59, 0x4b, 0x09, + 0xf1, 0xa8, 0x7c, 0x26, 0xea, 0xd7, 0x9d, 0x20, 0x98, 0xe9, 0xd3, 0x52, 0x02, 0x43, 0x6a, 0xe9, + 0xf1, 0x8c, 0x94, 0xab, 0xd1, 0x61, 0x9b, 0x46, 0xc3, 0x86, 0x6d, 0x6a, 0x2c, 0xa4, 0xd9, 0xb4, + 0xc7, 0x27, 0xca, 0xb5, 0xa8, 0x61, 0x96, 0xa4, 0x60, 0x86, 0x59, 0xca, 0xa3, 0x15, 0x2d, 0x3d, + 0xc6, 0x8e, 0xf2, 0x5c, 0xcf, 0x16, 0x22, 0x4d, 0x4a, 0x0b, 0x79, 0xc8, 0x99, 0xd0, 0x76, 0xba, + 0xd7, 0x69, 0xd9, 0xba, 0xa1, 0x7c, 0x36, 0xd5, 0x76, 0xe2, 0x48, 0xc9, 0x76, 0xe2, 0x00, 0xb6, + 0xca, 0xcb, 0x6f, 0x1c, 0x94, 0xe7, 0xa3, 0xab, 0xbc, 0x8c, 0x63, 0xab, 0x7c, 0xe4, 0x3d, 0xc4, + 0x64, 0xe2, 0x3d, 0x80, 0xf2, 0x42, 0x54, 0x01, 0x62, 0x68, 0xa6, 0x00, 0xf1, 0x17, 0x04, 0x5f, + 0xcd, 0xf6, 0xa0, 0x57, 0xae, 0x23, 0xb7, 0xa7, 0x7d, 0x6e, 0x59, 0x74, 0x33, 0x7d, 0x5a, 0xb6, + 0x17, 0x7e, 0x2d, 0xc5, 0x21, 0x5e, 0xb9, 0x11, 0x55, 0xb0, 0x04, 0x01, 0x53, 0xb0, 0xa4, 0x1b, + 0x7d, 0x2d, 0xc5, 0xa3, 0x5d, 0xf9, 0x5c, 0x26, 0xab, 0xe0, 0x9b, 0x53, 0xfc, 0xe0, 0x6f, 0xc9, + 0x2e, 0xe9, 0xca, 0x8b, 0xd1, 0xc5, 0x2e, 0xc4, 0xb0, 0xc5, 0x4e, 0x72, 0x5d, 0xbf, 0x25, 0x3b, + 0x63, 0x2b, 0x37, 0x93, 0xa5, 0xc2, 0x25, 0x52, 0x72, 0xda, 0xd6, 0xd2, 0x7d, 0x98, 0x95, 0x97, + 0xa2, 0x5a, 0x97, 0x46, 0xc3, 0xb4, 0x2e, 0xd5, 0xff, 0x79, 0x3a, 0xe9, 0x8a, 0xac, 0xdc, 0x8a, + 0x6f, 0xb2, 0xa3, 0x78, 0x66, 0xf9, 0x24, 0xdc, 0x97, 0xbf, 0x18, 0x0f, 0xb6, 0xa7, 0xbc, 0x1c, + 0xbb, 0xf6, 0x8d, 0x60, 0x99, 0x7d, 0x1b, 0x0b, 0xce, 0xf7, 0xc5, 0x78, 0x7c, 0x3a, 0xe5, 0x95, + 0x74, 0x0e, 0x81, 0xae, 0xc4, 0xe3, 0xd9, 0x7d, 0x31, 0x1e, 0xd2, 0x4d, 0x79, 0x35, 0x9d, 0x43, + 0x20, 0xdd, 0x78, 0x08, 0xb8, 0x17, 0xa5, 0x20, 0xf3, 0xca, 0xe7, 0xa3, 0xa6, 0x63, 0x80, 0x60, + 0xa6, 0x63, 0x18, 0x8a, 0xfe, 0x45, 0x29, 0x38, 0xbb, 0xf2, 0x5a, 0xa2, 0x48, 0xd0, 0x58, 0x29, + 0x84, 0xfb, 0x8b, 0x52, 0x50, 0x73, 0xe5, 0xf5, 0x44, 0x91, 0xa0, 0x75, 0x52, 0xe8, 0x73, 0xa3, + 0xd7, 0xfb, 0x55, 0xe5, 0x8d, 0xe8, 0x61, 0x70, 0x36, 0xe5, 0x4c, 0x9f, 0xd6, 0xeb, 0x1d, 0xec, + 0x57, 0xb3, 0x1d, 0xbb, 0x95, 0x37, 0xa3, 0x43, 0x38, 0x8b, 0x8e, 0x0d, 0xe1, 0x4c, 0xe7, 0xf0, + 0xb7, 0x62, 0xb1, 0x2c, 0x94, 0xb7, 0xa2, 0x53, 0x5c, 0x04, 0xc9, 0xa6, 0xb8, 0x78, 0xe4, 0x8b, + 0x48, 0x90, 0x06, 0xe5, 0x0b, 0xd1, 0x29, 0x4e, 0xc6, 0xb1, 0x29, 0x2e, 0x12, 0xd0, 0x61, 0x32, + 0x11, 0x3b, 0x40, 0x79, 0x3b, 0x3a, 0xc5, 0xc5, 0xd0, 0x6c, 0x8a, 0x8b, 0x47, 0x1b, 0x78, 0x2b, + 0xf6, 0x84, 0x5e, 0xf9, 0x62, 0x7a, 0xfb, 0x11, 0x29, 0xb7, 0x9f, 0x3f, 0xb8, 0xd7, 0xd2, 0xdf, + 0x82, 0x2b, 0x95, 0xe8, 0xf8, 0x4d, 0xa3, 0x61, 0xe3, 0x37, 0xf5, 0x1d, 0x79, 0x7c, 0xe3, 0x20, + 0xb4, 0x6a, 0xa2, 0xc7, 0xc6, 0x21, 0x34, 0x45, 0x52, 0xc0, 0x91, 0x3d, 0x32, 0xdf, 0x08, 0x4d, + 0x66, 0xec, 0x91, 0xfd, 0x6d, 0x50, 0x8c, 0x9e, 0xcd, 0xae, 0x09, 0x3f, 0x63, 0xa5, 0x1a, 0x9d, + 0x5d, 0x13, 0x04, 0x6c, 0x76, 0x4d, 0x7a, 0x27, 0x4f, 0xc3, 0x98, 0xd0, 0x22, 0xee, 0x3e, 0x6d, + 0x5a, 0xab, 0xca, 0x54, 0xec, 0xbd, 0x65, 0x0c, 0xcf, 0x66, 0xa7, 0x38, 0x0c, 0xd7, 0x6b, 0x0e, + 0x9b, 0x6c, 0x99, 0x9d, 0x65, 0x5b, 0x77, 0x8c, 0x3a, 0xb5, 0x0c, 0x65, 0x3a, 0xb6, 0x5e, 0xa7, + 0xd0, 0xe0, 0x7a, 0x9d, 0x02, 0xc7, 0x10, 0x71, 0x31, 0xb8, 0x46, 0x9b, 0xd4, 0x7c, 0x44, 0x95, + 0xdb, 0xc8, 0x76, 0x3c, 0x8b, 0xad, 0x20, 0x9b, 0xe9, 0xd3, 0xb2, 0x38, 0x30, 0x5b, 0x7d, 0x6e, + 0xa3, 0xfe, 0xce, 0x6c, 0x10, 0x7e, 0x60, 0xd1, 0xa1, 0x1d, 0xdd, 0xa1, 0xca, 0x4c, 0xd4, 0x56, + 0x4f, 0x25, 0x62, 0xb6, 0x7a, 0x2a, 0x22, 0xc9, 0xd6, 0x1f, 0x0b, 0xb5, 0x5e, 0x6c, 0xc3, 0x11, + 0x91, 0x5e, 0x9a, 0xcd, 0x4e, 0x51, 0x04, 0x13, 0xd0, 0xac, 0x6d, 0xad, 0xe2, 0x49, 0xc5, 0x9d, + 0xe8, 0xec, 0x94, 0x4d, 0xc9, 0x66, 0xa7, 0x6c, 0x2c, 0x53, 0xf5, 0x28, 0x96, 0x8f, 0xc1, 0xbb, + 0x51, 0x55, 0x4f, 0x21, 0x61, 0xaa, 0x9e, 0x02, 0x4e, 0x32, 0xd4, 0xa8, 0x4b, 0x3d, 0x65, 0xb6, + 0x17, 0x43, 0x24, 0x49, 0x32, 0x44, 0x70, 0x92, 0xe1, 0x34, 0xf5, 0x9a, 0x6b, 0xca, 0x5c, 0x2f, + 0x86, 0x48, 0x92, 0x64, 0x88, 0x60, 0xb6, 0xd9, 0x8c, 0x82, 0x27, 0xba, 0xad, 0x87, 0x7e, 0x9f, + 0xcd, 0x47, 0x37, 0x9b, 0x99, 0x84, 0x6c, 0xb3, 0x99, 0x89, 0x24, 0x3f, 0xb9, 0x63, 0x3f, 0x78, + 0x65, 0x01, 0x2b, 0xbc, 0x1e, 0xda, 0x05, 0x3b, 0x29, 0x35, 0xd3, 0xa7, 0xed, 0xd4, 0xcf, 0xfe, + 0xb3, 0x81, 0xd3, 0xa8, 0xb2, 0x88, 0x55, 0x9d, 0x0a, 0xce, 0x2a, 0x38, 0x78, 0xa6, 0x4f, 0x0b, + 0xdc, 0x4a, 0x5f, 0x85, 0x21, 0xfc, 0xa8, 0x9a, 0x65, 0x7a, 0xd5, 0x09, 0xe5, 0x9d, 0xe8, 0x96, + 0x49, 0x42, 0xb1, 0x2d, 0x93, 0xf4, 0x93, 0x4d, 0xe2, 0xf8, 0x93, 0x4f, 0x31, 0xd5, 0x09, 0x45, + 0x8b, 0x4e, 0xe2, 0x11, 0x24, 0x9b, 0xc4, 0x23, 0x80, 0xa0, 0xde, 0xaa, 0x63, 0x77, 0xaa, 0x13, + 0x4a, 0x3d, 0xa5, 0x5e, 0x8e, 0x0a, 0xea, 0xe5, 0x3f, 0x83, 0x7a, 0xeb, 0x6b, 0x5d, 0xaf, 0xca, + 0xbe, 0x71, 0x29, 0xa5, 0x5e, 0x1f, 0x19, 0xd4, 0xeb, 0x03, 0xd8, 0x54, 0x88, 0x80, 0x45, 0xc7, + 0x66, 0x93, 0xf6, 0x5d, 0xb3, 0xd5, 0x52, 0xee, 0x45, 0xa7, 0xc2, 0x38, 0x9e, 0x4d, 0x85, 0x71, + 0x18, 0x33, 0x3d, 0x79, 0xab, 0xe8, 0x72, 0x77, 0x55, 0xb9, 0x1f, 0x35, 0x3d, 0x43, 0x0c, 0x33, + 0x3d, 0xc3, 0x5f, 0xb8, 0xbb, 0x60, 0xbf, 0x34, 0xba, 0xe2, 0x50, 0x77, 0x4d, 0x79, 0x10, 0xdb, + 0x5d, 0x48, 0x38, 0xdc, 0x5d, 0x48, 0xbf, 0xc9, 0x2a, 0x3c, 0x11, 0x59, 0x68, 0xfc, 0x4b, 0x9b, + 0x3a, 0xd5, 0x9d, 0xe6, 0x9a, 0xf2, 0x25, 0x64, 0xf5, 0x6c, 0xea, 0x52, 0x15, 0x25, 0x9d, 0xe9, + 0xd3, 0x7a, 0x71, 0xc2, 0x6d, 0xf9, 0x3b, 0xb3, 0x3c, 0x12, 0xac, 0xb6, 0x38, 0xe9, 0x6f, 0x42, + 0xdf, 0x8d, 0x6d, 0xcb, 0x93, 0x24, 0xb8, 0x2d, 0x4f, 0x82, 0x49, 0x07, 0x9e, 0x8a, 0x6d, 0xd5, + 0xe6, 0xf4, 0x16, 0xdb, 0x97, 0x50, 0x63, 0x51, 0x6f, 0x3e, 0xa4, 0x9e, 0xf2, 0x65, 0xe4, 0x7d, + 0x25, 0x63, 0xc3, 0x17, 0xa3, 0x9e, 0xe9, 0xd3, 0xb6, 0xe1, 0x47, 0x54, 0x28, 0xd6, 0xa7, 0x97, + 0x16, 0x95, 0x1f, 0x8a, 0x9e, 0x6f, 0x32, 0xd8, 0x4c, 0x9f, 0x86, 0x38, 0x66, 0xa5, 0xdd, 0xeb, + 0xac, 0x3a, 0xba, 0x41, 0xb9, 0xa1, 0x85, 0xb6, 0x9b, 0x30, 0x40, 0x7f, 0x38, 0x6a, 0xa5, 0x65, + 0xd1, 0x31, 0x2b, 0x2d, 0x0b, 0xc7, 0x14, 0x35, 0x92, 0xf4, 0x44, 0xf9, 0x4a, 0x54, 0x51, 0x23, + 0x48, 0xa6, 0xa8, 0xd1, 0x14, 0x29, 0x5f, 0x82, 0xf3, 0xc1, 0x7e, 0x5e, 0xac, 0xbf, 0xbc, 0xd3, + 0x94, 0xaf, 0x22, 0x9f, 0xa7, 0x12, 0x97, 0x01, 0x11, 0xaa, 0x99, 0x3e, 0x2d, 0xa3, 0x3c, 0x5b, + 0x71, 0x13, 0xf9, 0xbc, 0x84, 0x79, 0xf1, 0x23, 0xd1, 0x15, 0x37, 0x83, 0x8c, 0xad, 0xb8, 0x19, + 0xa8, 0x54, 0xe6, 0x42, 0xa8, 0xfa, 0x36, 0xcc, 0x03, 0x99, 0x66, 0x71, 0x48, 0x65, 0x2e, 0x2c, + 0xb5, 0xe5, 0x6d, 0x98, 0x07, 0xd6, 0x5a, 0x16, 0x07, 0x72, 0x15, 0x4a, 0xf5, 0xfa, 0x9c, 0xd6, + 0xb5, 0x94, 0x66, 0xcc, 0x5b, 0x16, 0xa1, 0x33, 0x7d, 0x9a, 0xc0, 0x33, 0x33, 0x68, 0xaa, 0xa5, + 0xbb, 0x9e, 0xd9, 0x74, 0x71, 0xc4, 0xf8, 0x23, 0xc4, 0x88, 0x9a, 0x41, 0x69, 0x34, 0xcc, 0x0c, + 0x4a, 0x83, 0x33, 0x7b, 0x71, 0x52, 0x77, 0x5d, 0xdd, 0x32, 0x1c, 0x7d, 0x02, 0x97, 0x09, 0x1a, + 0x7b, 0x8d, 0x15, 0xc1, 0x32, 0x7b, 0x31, 0x0a, 0xc1, 0xc3, 0x77, 0x1f, 0xe2, 0x9b, 0x39, 0x2b, + 0xb1, 0xc3, 0xf7, 0x18, 0x1e, 0x0f, 0xdf, 0x63, 0x30, 0xb4, 0x3b, 0x7d, 0x98, 0x46, 0x57, 0x4d, + 0x26, 0x22, 0x65, 0x35, 0x66, 0x77, 0xc6, 0x09, 0xd0, 0xee, 0x8c, 0x03, 0x23, 0x4d, 0xf2, 0x97, + 0xdb, 0xb5, 0x8c, 0x26, 0x85, 0xab, 0x6c, 0xa2, 0x0c, 0x5b, 0xbf, 0xc3, 0xc1, 0x51, 0xdd, 0xb0, + 0xf4, 0xb6, 0x5d, 0x9d, 0xf0, 0xa5, 0x6e, 0x46, 0xd7, 0xef, 0x4c, 0x42, 0xb6, 0x7e, 0x67, 0x22, + 0xd9, 0xec, 0xea, 0x6f, 0xb4, 0xd6, 0x74, 0x87, 0x1a, 0x55, 0xd3, 0xc1, 0x93, 0xc5, 0x0d, 0xbe, + 0x35, 0x7c, 0x2f, 0x3a, 0xbb, 0xf6, 0x20, 0x65, 0xb3, 0x6b, 0x0f, 0x34, 0x33, 0xf2, 0xd2, 0xd1, + 0x1a, 0xd5, 0x0d, 0xe5, 0x61, 0xd4, 0xc8, 0xcb, 0xa6, 0x64, 0x46, 0x5e, 0x36, 0x36, 0xfb, 0x73, + 0x1e, 0x38, 0xa6, 0x47, 0x95, 0xd6, 0x4e, 0x3e, 0x07, 0x49, 0xb3, 0x3f, 0x07, 0xd1, 0x6c, 0x43, + 0x18, 0xef, 0x90, 0x76, 0x74, 0x43, 0x98, 0xec, 0x86, 0x78, 0x09, 0x66, 0xb1, 0x88, 0x47, 0x79, + 0x8a, 0x15, 0xb5, 0x58, 0x04, 0x98, 0x59, 0x2c, 0xe1, 0xb3, 0xbd, 0xc8, 0x53, 0x2c, 0xc5, 0x8e, + 0xae, 0xa1, 0x32, 0x8e, 0xad, 0xa1, 0x91, 0x67, 0x5b, 0xaf, 0x46, 0xde, 0x19, 0x28, 0x9d, 0xa8, + 0xd5, 0x21, 0xa1, 0x98, 0xd5, 0x21, 0xbf, 0x48, 0x98, 0x84, 0x53, 0x78, 0x0b, 0xae, 0x75, 0x83, + 0x7b, 0x9c, 0x1f, 0x8d, 0x7e, 0x66, 0x0c, 0xcd, 0x3e, 0x33, 0x06, 0x8a, 0x30, 0x11, 0xd3, 0x96, + 0x93, 0xc1, 0x24, 0x3c, 0x1f, 0x8c, 0x81, 0xc8, 0x2c, 0x90, 0x7a, 0x65, 0x6e, 0xb6, 0x66, 0x2c, + 0xca, 0x57, 0x64, 0x6e, 0xf4, 0x04, 0x36, 0x49, 0x31, 0xd3, 0xa7, 0xa5, 0x94, 0x23, 0xef, 0xc1, + 0x65, 0x01, 0x15, 0x2f, 0xae, 0x31, 0xed, 0xbf, 0x11, 0x2c, 0x08, 0x5e, 0xd4, 0x8f, 0xad, 0x17, + 0xed, 0x4c, 0x9f, 0xd6, 0x93, 0x57, 0x76, 0x5d, 0x62, 0x7d, 0xe8, 0xee, 0xa4, 0xae, 0x60, 0x91, + 0xe8, 0xc9, 0x2b, 0xbb, 0x2e, 0x21, 0xf7, 0x47, 0x3b, 0xa9, 0x2b, 0xe8, 0x84, 0x9e, 0xbc, 0x88, + 0x0b, 0xe3, 0xbd, 0xf0, 0x95, 0x56, 0x4b, 0x59, 0xc7, 0xea, 0x3e, 0xb3, 0x93, 0xea, 0x2a, 0x68, + 0x70, 0x6e, 0xc7, 0x91, 0xcd, 0xd2, 0x0b, 0x1d, 0x6a, 0xd5, 0x23, 0x0b, 0xd0, 0xe3, 0xe8, 0x2c, + 0x9d, 0x20, 0x60, 0xb3, 0x74, 0x02, 0xc8, 0x06, 0x94, 0xfc, 0x5c, 0x45, 0xd9, 0x88, 0x0e, 0x28, + 0x19, 0xc7, 0x06, 0x54, 0xe4, 0x69, 0xcb, 0x02, 0x9c, 0x59, 0x78, 0xe8, 0xe9, 0xbe, 0x05, 0xe9, + 0x8a, 0xae, 0x7c, 0x3f, 0x76, 0xc9, 0x94, 0x24, 0xc1, 0x4b, 0xa6, 0x24, 0x98, 0x8d, 0x11, 0x06, + 0xae, 0x6f, 0x58, 0xcd, 0x69, 0xdd, 0x6c, 0x75, 0x1d, 0xaa, 0xfc, 0x6b, 0xd1, 0x31, 0x12, 0x43, + 0xb3, 0x31, 0x12, 0x03, 0xb1, 0x05, 0x9a, 0x81, 0x2a, 0xae, 0x6b, 0xae, 0x5a, 0x62, 0x5f, 0xd9, + 0x6d, 0x79, 0xca, 0xbf, 0x1e, 0x5d, 0xa0, 0xd3, 0x68, 0xd8, 0x02, 0x9d, 0x06, 0xc7, 0x53, 0x27, + 0xd6, 0x0b, 0x6c, 0xf1, 0x90, 0xef, 0x2a, 0xff, 0x8d, 0xd8, 0xa9, 0x53, 0x0a, 0x0d, 0x9e, 0x3a, + 0xa5, 0xc0, 0xd9, 0xfa, 0xc8, 0x6d, 0xb2, 0x59, 0x33, 0xb8, 0xab, 0xfe, 0x37, 0xa3, 0xeb, 0x63, + 0x1c, 0xcf, 0xd6, 0xc7, 0x38, 0x2c, 0xca, 0x47, 0x74, 0xc1, 0xbf, 0x95, 0xc5, 0x27, 0x90, 0x7f, + 0xa2, 0x0c, 0xb9, 0x2d, 0xf3, 0x11, 0x23, 0xe5, 0xc7, 0x72, 0x59, 0x8c, 0x82, 0xe1, 0x91, 0x28, + 0x14, 0x65, 0xa4, 0xd1, 0x47, 0x26, 0x5d, 0x57, 0xbe, 0x96, 0xc9, 0x88, 0x13, 0x44, 0x19, 0x71, + 0x18, 0x79, 0x17, 0xce, 0x87, 0xb0, 0x39, 0xda, 0x5e, 0x0e, 0x66, 0xa6, 0x3f, 0x91, 0x8b, 0x9a, + 0xc1, 0xe9, 0x64, 0xcc, 0x0c, 0x4e, 0xc7, 0xa4, 0xb1, 0x16, 0xa2, 0xfb, 0xb7, 0xb7, 0x61, 0x1d, + 0x48, 0x30, 0x83, 0x41, 0x1a, 0x6b, 0x21, 0xcd, 0x1f, 0xdf, 0x86, 0x75, 0x20, 0xd3, 0x0c, 0x06, + 0xe4, 0xa7, 0x72, 0x70, 0x25, 0x1d, 0x55, 0x69, 0xb5, 0xa6, 0x6d, 0x27, 0xc4, 0x29, 0x7f, 0x32, + 0x17, 0x3d, 0x68, 0xd8, 0x59, 0xb1, 0x99, 0x3e, 0x6d, 0x87, 0x15, 0x90, 0x2f, 0xc0, 0x48, 0xa5, + 0x6b, 0x98, 0x1e, 0x5e, 0xbc, 0x31, 0xc3, 0xf9, 0x27, 0x72, 0xb1, 0x2d, 0x8e, 0x8c, 0xc5, 0x2d, + 0x8e, 0x0c, 0x20, 0x77, 0xe0, 0x74, 0x9d, 0x36, 0xbb, 0x8e, 0xe9, 0x6d, 0x68, 0xb4, 0x63, 0x3b, + 0x1e, 0xe3, 0xf1, 0xa7, 0x72, 0xd1, 0x49, 0x2c, 0x41, 0xc1, 0x26, 0xb1, 0x04, 0x90, 0xdc, 0x4f, + 0xdc, 0xca, 0x8b, 0xce, 0xfc, 0xc9, 0x5c, 0xcf, 0x6b, 0xf9, 0xa0, 0x2f, 0xd3, 0x8b, 0x93, 0xc5, + 0xd8, 0x2d, 0xba, 0xe0, 0xfa, 0x53, 0xb9, 0x1e, 0xd7, 0xe8, 0xd2, 0x0c, 0x97, 0x04, 0x33, 0x8e, + 0x29, 0x19, 0xe0, 0x95, 0x3f, 0x9d, 0xeb, 0x71, 0xed, 0x1d, 0x72, 0x4c, 0x4b, 0x1e, 0xff, 0x32, + 0xf7, 0x14, 0x11, 0x8c, 0x7e, 0x3a, 0x97, 0x74, 0x15, 0x09, 0xca, 0x4b, 0x84, 0xac, 0xd8, 0x3d, + 0x37, 0x50, 0xfa, 0x0f, 0x72, 0x49, 0xdf, 0xbc, 0xb0, 0x58, 0xf8, 0x8b, 0x50, 0xb8, 0x34, 0xf5, + 0xd8, 0xa3, 0x8e, 0xa5, 0xb7, 0xb0, 0x3b, 0xeb, 0x9e, 0xed, 0xe8, 0xab, 0x74, 0xca, 0xd2, 0x97, + 0x5b, 0x54, 0xf9, 0x7a, 0x2e, 0x6a, 0xc1, 0x66, 0x93, 0x32, 0x0b, 0x36, 0x1b, 0x4b, 0xd6, 0xe0, + 0x89, 0x34, 0x6c, 0xd5, 0x74, 0xb1, 0x9e, 0x6f, 0xe4, 0xa2, 0x26, 0x6c, 0x0f, 0x5a, 0x66, 0xc2, + 0xf6, 0x40, 0x93, 0x9b, 0x30, 0x38, 0x61, 0xfb, 0xd3, 0xef, 0x9f, 0x89, 0x39, 0x43, 0x06, 0x98, + 0x99, 0x3e, 0x2d, 0x24, 0x13, 0x65, 0xc4, 0xa0, 0xfe, 0x66, 0xb2, 0x4c, 0x78, 0xf9, 0x14, 0xfc, + 0x10, 0x65, 0x84, 0xb8, 0xff, 0x9d, 0x64, 0x99, 0xf0, 0x8e, 0x2b, 0xf8, 0xc1, 0x66, 0x12, 0x5e, + 0xe3, 0xdc, 0x74, 0x85, 0xd9, 0x6d, 0x93, 0x6b, 0x7a, 0xab, 0x45, 0xad, 0x55, 0xaa, 0x7c, 0x2b, + 0x36, 0x93, 0xa4, 0x93, 0xb1, 0x99, 0x24, 0x1d, 0x43, 0x7e, 0x18, 0x2e, 0xdc, 0xd7, 0x5b, 0xa6, + 0x11, 0xe2, 0xfc, 0x7c, 0xe0, 0xca, 0xcf, 0xe4, 0xa2, 0xbb, 0xe9, 0x0c, 0x3a, 0xb6, 0x9b, 0xce, + 0x40, 0x91, 0x39, 0x20, 0xb8, 0x8c, 0x06, 0xb3, 0x05, 0x5b, 0x9f, 0x95, 0x7f, 0x37, 0x17, 0xb5, + 0x53, 0x93, 0x24, 0xcc, 0x4e, 0x4d, 0x42, 0x49, 0x23, 0x3b, 0x35, 0x88, 0xf2, 0xb3, 0xb9, 0xe8, + 0x69, 0x4d, 0x16, 0xe1, 0x4c, 0x9f, 0x96, 0x9d, 0x5f, 0xe4, 0x36, 0x8c, 0xd5, 0x17, 0x6b, 0xd3, + 0xd3, 0x53, 0xf5, 0xfb, 0xb5, 0x2a, 0x3e, 0x74, 0x30, 0x94, 0x3f, 0x1b, 0x5b, 0xb1, 0xe2, 0x04, + 0x6c, 0xc5, 0x8a, 0xc3, 0xc8, 0x1b, 0x30, 0xcc, 0xda, 0xcf, 0x06, 0x0c, 0x7e, 0xf2, 0xcf, 0xe5, + 0xa2, 0xe6, 0x94, 0x8c, 0x64, 0xe6, 0x94, 0xfc, 0x9b, 0xd4, 0xe1, 0x2c, 0x93, 0xe2, 0xa2, 0x43, + 0x57, 0xa8, 0x43, 0xad, 0xa6, 0x3f, 0xa6, 0x7f, 0x3e, 0x17, 0xb5, 0x32, 0xd2, 0x88, 0x98, 0x95, + 0x91, 0x06, 0x27, 0x0f, 0xe1, 0x72, 0xfc, 0x24, 0x48, 0x7e, 0x76, 0xaa, 0xfc, 0xb9, 0x5c, 0xcc, + 0x18, 0xee, 0x41, 0x8c, 0xc6, 0x70, 0x0f, 0x3c, 0xb1, 0xe0, 0x49, 0x71, 0xac, 0x22, 0x1c, 0x2e, + 0xe3, 0xb5, 0xfd, 0x79, 0x5e, 0xdb, 0xa7, 0x43, 0x87, 0xc0, 0x1e, 0xd4, 0x33, 0x7d, 0x5a, 0x6f, + 0x76, 0x4c, 0xcf, 0x92, 0x09, 0x30, 0x94, 0x5f, 0xc8, 0xa5, 0x7b, 0xa4, 0x44, 0xdc, 0x94, 0xd3, + 0x32, 0x67, 0xbc, 0x9b, 0x95, 0xbe, 0x41, 0xf9, 0x0b, 0xb1, 0xf1, 0x96, 0x4e, 0xc6, 0xc6, 0x5b, + 0x46, 0xfe, 0x87, 0x3b, 0x70, 0x9a, 0x2b, 0xf5, 0xa2, 0x8e, 0xc3, 0xd0, 0x5a, 0xa5, 0x86, 0xf2, + 0xef, 0xc5, 0x56, 0xbb, 0x04, 0x05, 0xba, 0xf6, 0xc4, 0x81, 0x6c, 0xea, 0xae, 0x77, 0x74, 0xcb, + 0xc2, 0x63, 0x56, 0xe5, 0xdf, 0x8f, 0x4d, 0xdd, 0x21, 0x0a, 0x1d, 0x77, 0x83, 0x5f, 0x4c, 0x13, + 0x7a, 0xa5, 0x3e, 0x52, 0xfe, 0x62, 0x4c, 0x13, 0x7a, 0x11, 0x33, 0x4d, 0xe8, 0x99, 0x47, 0xe9, + 0x7e, 0xc6, 0x13, 0x70, 0xe5, 0x17, 0x63, 0x2b, 0x72, 0x2a, 0x15, 0x5b, 0x91, 0xd3, 0x5f, 0x90, + 0xdf, 0xcf, 0x78, 0x3e, 0xad, 0xfc, 0x52, 0x6f, 0xbe, 0xe1, 0x4a, 0x9f, 0xfe, 0xfa, 0xfa, 0x7e, + 0xc6, 0xd3, 0x63, 0xe5, 0x2f, 0xf5, 0xe6, 0x1b, 0x3a, 0xf6, 0xa5, 0xbf, 0x5c, 0x6e, 0x64, 0x3f, + 0xdb, 0x55, 0xfe, 0x72, 0x7c, 0xea, 0xca, 0x20, 0xc4, 0xa9, 0x2b, 0xeb, 0xed, 0xef, 0x32, 0x5c, + 0xe4, 0x1a, 0x72, 0xdb, 0xd1, 0x3b, 0x6b, 0x75, 0xea, 0x79, 0xa6, 0xb5, 0xea, 0xef, 0xc4, 0xfe, + 0x4a, 0x2e, 0x76, 0x3c, 0x96, 0x45, 0x89, 0xc7, 0x63, 0x59, 0x48, 0xa6, 0xbc, 0x89, 0x07, 0xba, + 0xca, 0x5f, 0x8d, 0x29, 0x6f, 0x82, 0x82, 0x29, 0x6f, 0xf2, 0x5d, 0xef, 0x9d, 0x94, 0x77, 0xa8, + 0xca, 0x7f, 0x90, 0xcd, 0x2b, 0x68, 0x5f, 0xca, 0xf3, 0xd5, 0x3b, 0x29, 0xcf, 0x2d, 0x95, 0xff, + 0x30, 0x9b, 0x57, 0xe8, 0x83, 0x94, 0x7c, 0xa5, 0xf9, 0x2e, 0x9c, 0xe7, 0xb3, 0xf9, 0x34, 0x35, + 0x68, 0xe4, 0x43, 0x7f, 0x39, 0x36, 0xf6, 0xd3, 0xc9, 0xf0, 0xc8, 0x3d, 0x15, 0x93, 0xc6, 0x5a, + 0xb4, 0xf5, 0xaf, 0x6d, 0xc3, 0x3a, 0xdc, 0x10, 0xa4, 0x63, 0xd8, 0x7a, 0x23, 0x3f, 0x7e, 0x53, + 0x7e, 0x25, 0xb6, 0xde, 0xc8, 0x48, 0x74, 0xe7, 0x90, 0x5f, 0xca, 0xbd, 0x11, 0x7d, 0xe8, 0xa5, + 0xfc, 0x47, 0xa9, 0x85, 0x83, 0x0e, 0x88, 0xbe, 0x0a, 0x7b, 0x23, 0xfa, 0xa8, 0x49, 0xf9, 0xd5, + 0xd4, 0xc2, 0xc1, 0x07, 0x44, 0x5f, 0x40, 0xb1, 0x2d, 0x52, 0xd7, 0xb3, 0x39, 0xab, 0xc8, 0xf4, + 0xf0, 0xd7, 0xe3, 0x5b, 0xa4, 0x54, 0x32, 0xdc, 0x22, 0xa5, 0x62, 0xd2, 0x58, 0x8b, 0xcf, 0xfb, + 0xb5, 0x6d, 0x58, 0x4b, 0x1b, 0xbb, 0x54, 0x4c, 0x1a, 0x6b, 0xf1, 0xf1, 0xbf, 0xbe, 0x0d, 0x6b, + 0x69, 0x63, 0x97, 0x8a, 0x61, 0xe6, 0x58, 0x88, 0xb9, 0x4f, 0x1d, 0x37, 0x54, 0xbf, 0xbf, 0x11, + 0x33, 0xc7, 0x32, 0xe8, 0x98, 0x39, 0x96, 0x81, 0x4a, 0xe5, 0x2e, 0x84, 0xf2, 0x1b, 0xdb, 0x71, + 0x0f, 0xef, 0x65, 0x32, 0x50, 0xa9, 0xdc, 0x85, 0x5c, 0xfe, 0xe6, 0x76, 0xdc, 0xc3, 0x8b, 0x99, + 0x0c, 0x14, 0x33, 0x8a, 0xea, 0x9e, 0xee, 0x99, 0xcd, 0x19, 0xdb, 0xf5, 0xa4, 0x45, 0xfe, 0x6f, + 0xc5, 0x8c, 0xa2, 0x34, 0x22, 0x66, 0x14, 0xa5, 0xc1, 0x93, 0x4c, 0x85, 0x34, 0x7e, 0xb3, 0x27, + 0xd3, 0xd0, 0xd2, 0x4a, 0x83, 0x27, 0x99, 0x0a, 0x21, 0xfc, 0xc7, 0x3d, 0x99, 0x86, 0x9e, 0xf2, + 0x69, 0x70, 0x66, 0x99, 0x4e, 0x3a, 0xf6, 0xba, 0x75, 0x87, 0xae, 0xd3, 0x96, 0xf8, 0xf4, 0xdf, + 0x8a, 0x59, 0xa6, 0x71, 0x02, 0xbc, 0x45, 0x89, 0xc1, 0xa2, 0x8c, 0xc4, 0xe7, 0xfe, 0x76, 0x26, + 0xa3, 0xf0, 0x98, 0x28, 0x0e, 0x8b, 0x32, 0x12, 0x9f, 0xf8, 0x3b, 0x99, 0x8c, 0xc2, 0x63, 0xa2, + 0x38, 0x8c, 0x54, 0x60, 0x14, 0xdf, 0x4a, 0xe8, 0xae, 0xef, 0xf9, 0xf9, 0xfb, 0xb9, 0xe8, 0xad, + 0x57, 0x14, 0x3d, 0xd3, 0xa7, 0xc5, 0x0a, 0xc8, 0x2c, 0xc4, 0x27, 0x7d, 0x27, 0x83, 0x45, 0xe8, + 0xef, 0x18, 0x85, 0xc8, 0x2c, 0xc4, 0xc7, 0xfc, 0x27, 0x19, 0x2c, 0x42, 0x87, 0xc7, 0x28, 0x64, + 0x62, 0x00, 0xfa, 0xf1, 0x40, 0xf4, 0x4e, 0xa9, 0xfc, 0xed, 0xdc, 0xd8, 0xef, 0xe6, 0xee, 0x94, + 0xca, 0xbf, 0x9b, 0x1b, 0xfb, 0x3d, 0xf6, 0xff, 0xef, 0xe5, 0xc6, 0x7e, 0x3f, 0xa7, 0x5d, 0x0c, + 0x95, 0xbb, 0xb2, 0x4a, 0x2d, 0x6f, 0xb1, 0xa5, 0x8b, 0xa1, 0x99, 0x8a, 0xe2, 0x3f, 0x53, 0x51, + 0x22, 0xa1, 0xd5, 0x2f, 0xe6, 0x60, 0xb8, 0xee, 0x39, 0x54, 0x6f, 0x8b, 0xf8, 0x70, 0x97, 0xa0, + 0xcc, 0x5d, 0x98, 0xfd, 0xf7, 0xd6, 0x5a, 0xf0, 0x9b, 0x5c, 0x81, 0xd1, 0x59, 0xdd, 0xf5, 0xb0, + 0x89, 0x35, 0xcb, 0xa0, 0x8f, 0xf1, 0xf9, 0x5e, 0x41, 0x8b, 0x41, 0xc9, 0x2c, 0xa7, 0xe3, 0xe5, + 0x30, 0x24, 0x68, 0x61, 0xdb, 0xb0, 0x68, 0xe5, 0x0f, 0x37, 0xc7, 0xfb, 0x30, 0x0a, 0x5a, 0xac, + 0xac, 0xfa, 0x07, 0x39, 0x48, 0x38, 0x57, 0xef, 0x3d, 0x0e, 0xc2, 0x02, 0x9c, 0x8a, 0x85, 0xa1, + 0x15, 0x6f, 0x10, 0x77, 0x18, 0xa5, 0x36, 0x5e, 0x9a, 0x7c, 0x26, 0x78, 0xfb, 0x76, 0x4f, 0x9b, + 0x15, 0x21, 0xef, 0x30, 0x59, 0x43, 0xd7, 0x69, 0x69, 0x12, 0x4a, 0x84, 0x34, 0xfa, 0xc1, 0x58, + 0x18, 0x63, 0x93, 0x5c, 0x11, 0x41, 0x19, 0x72, 0x61, 0xa0, 0xbc, 0x58, 0x6a, 0x78, 0x1e, 0x84, + 0xe1, 0x0b, 0x30, 0x5c, 0x6b, 0x77, 0xa8, 0xe3, 0xda, 0x96, 0xee, 0xd9, 0x8e, 0x78, 0xd3, 0x8e, + 0x41, 0xd4, 0x4c, 0x09, 0x2e, 0x07, 0xf6, 0x92, 0xe9, 0xc9, 0x35, 0x3f, 0xdf, 0x5c, 0x01, 0xa3, + 0x9b, 0xe2, 0xc3, 0xd4, 0x78, 0xba, 0x71, 0x4e, 0xc1, 0x48, 0xef, 0xb9, 0x3a, 0xbe, 0x92, 0x0c, + 0x48, 0xbb, 0x0c, 0x20, 0x93, 0x22, 0x05, 0x79, 0x1e, 0x4a, 0x78, 0xab, 0xe4, 0x62, 0x1e, 0x49, + 0x11, 0xbe, 0xaf, 0x85, 0x10, 0x39, 0x58, 0x1a, 0xa7, 0x21, 0x77, 0x61, 0x2c, 0xbc, 0x32, 0xbf, + 0xed, 0xd8, 0xdd, 0x8e, 0x9f, 0x39, 0x06, 0xd3, 0xb4, 0x3f, 0x0c, 0x70, 0x8d, 0x55, 0x44, 0x4a, + 0x2c, 0x12, 0x05, 0xc9, 0x0c, 0x9c, 0x0a, 0x61, 0x4c, 0x44, 0x7e, 0xc6, 0x2a, 0xcc, 0x16, 0x2a, + 0xf1, 0x62, 0xe2, 0x8c, 0x64, 0x0b, 0x8d, 0x15, 0x23, 0x35, 0x18, 0xf0, 0x63, 0xf7, 0x95, 0xb7, + 0x55, 0xd2, 0x33, 0x22, 0x76, 0xdf, 0x80, 0x1c, 0xb5, 0xcf, 0x2f, 0x4f, 0xa6, 0x61, 0x54, 0xb3, + 0xbb, 0x1e, 0x5d, 0xb2, 0xc5, 0x5e, 0x53, 0xc4, 0x88, 0xc4, 0x36, 0x39, 0x0c, 0xd3, 0xf0, 0x6c, + 0x3f, 0xcb, 0xbd, 0x9c, 0x6d, 0x3d, 0x5a, 0x8a, 0xcc, 0xc3, 0xe9, 0x84, 0x73, 0x81, 0x9c, 0x7b, + 0x5e, 0xfa, 0xbc, 0x24, 0xb3, 0x64, 0x51, 0xf2, 0x13, 0x39, 0x28, 0x2d, 0x39, 0xba, 0xe9, 0xb9, + 0xe2, 0x81, 0xe5, 0xb9, 0xeb, 0xeb, 0x8e, 0xde, 0x61, 0xfa, 0x71, 0x1d, 0xc3, 0xd7, 0xde, 0xd7, + 0x5b, 0x5d, 0xea, 0x4e, 0x3c, 0x60, 0x5f, 0xf7, 0xdf, 0x6f, 0x8e, 0xbf, 0xb1, 0x8a, 0x47, 0x98, + 0xd7, 0x9b, 0x76, 0xfb, 0xc6, 0xaa, 0xa3, 0x3f, 0x32, 0x3d, 0x34, 0x14, 0xf5, 0xd6, 0x0d, 0x8f, + 0xb6, 0xf0, 0xa4, 0xf4, 0x86, 0xde, 0x31, 0x6f, 0x60, 0x98, 0xf4, 0x1b, 0x01, 0x27, 0x5e, 0x03, + 0x53, 0x01, 0x0f, 0xff, 0x92, 0x55, 0x80, 0xe3, 0xc8, 0x3c, 0x80, 0xf8, 0xd4, 0x4a, 0xa7, 0x23, + 0x5e, 0x6b, 0x4a, 0xe7, 0x8b, 0x3e, 0x86, 0x2b, 0x76, 0x20, 0x30, 0xbd, 0x23, 0x85, 0x06, 0xd6, + 0x24, 0x0e, 0x4c, 0x0b, 0x96, 0x44, 0x8b, 0x7c, 0x31, 0x8d, 0x84, 0x12, 0xf7, 0x1b, 0x9b, 0x22, + 0xa4, 0x78, 0x31, 0xb2, 0x0c, 0xa7, 0x04, 0xdf, 0x20, 0x91, 0xc8, 0x68, 0x74, 0x56, 0x88, 0xa1, + 0xb9, 0xd2, 0x06, 0x6d, 0x34, 0x04, 0x58, 0xae, 0x23, 0x56, 0x82, 0x4c, 0x84, 0x89, 0x8f, 0xe7, + 0xf5, 0x36, 0x75, 0x95, 0x53, 0xa8, 0xb1, 0x97, 0xb7, 0x36, 0xc7, 0x15, 0xbf, 0x3c, 0x86, 0xb1, + 0x94, 0x45, 0x17, 0x2d, 0x22, 0xf3, 0xe0, 0x5a, 0x3f, 0x96, 0xc2, 0x23, 0xae, 0xf3, 0xd1, 0x22, + 0x64, 0x12, 0x46, 0x82, 0xc7, 0x22, 0xf7, 0xee, 0xd5, 0xaa, 0xf8, 0x1c, 0x54, 0x44, 0x32, 0x8d, + 0xa5, 0xfa, 0x90, 0x99, 0x44, 0xca, 0x48, 0x11, 0x36, 0xf8, 0xfb, 0xd0, 0x58, 0x84, 0x8d, 0x4e, + 0x4a, 0x84, 0x8d, 0x45, 0xf2, 0x16, 0x0c, 0x55, 0x1e, 0xd4, 0x45, 0xe4, 0x10, 0x57, 0x39, 0x13, + 0xe6, 0x8d, 0xd2, 0xd7, 0xdd, 0x86, 0x1f, 0x65, 0x44, 0x6e, 0xba, 0x4c, 0x4f, 0xa6, 0x60, 0x34, + 0xe2, 0x6f, 0xe6, 0x2a, 0x67, 0x91, 0x03, 0xb6, 0x5c, 0x47, 0x4c, 0xc3, 0x11, 0x28, 0x79, 0x78, + 0x45, 0x0b, 0x31, 0xad, 0xa9, 0x9a, 0x2e, 0xe6, 0xe0, 0xd1, 0x28, 0x06, 0x29, 0xc1, 0xc7, 0xa5, + 0x65, 0xae, 0x35, 0x86, 0x40, 0x35, 0x1c, 0x8e, 0x93, 0x7b, 0x34, 0x56, 0x8c, 0xbc, 0x07, 0x04, + 0xb3, 0xf6, 0x50, 0xc3, 0xbf, 0x7e, 0xac, 0x55, 0x5d, 0xe5, 0x3c, 0x86, 0xf1, 0x26, 0xf1, 0xa0, + 0x08, 0xb5, 0xea, 0xc4, 0x15, 0x31, 0x7d, 0x3c, 0xa5, 0xf3, 0x52, 0x0d, 0x3f, 0x20, 0x42, 0xc3, + 0x8c, 0xa4, 0x34, 0x4e, 0xe1, 0x4a, 0xd6, 0xe1, 0xc2, 0xa2, 0x43, 0x1f, 0x99, 0x76, 0xd7, 0xf5, + 0x97, 0x0f, 0x7f, 0xde, 0xba, 0xb0, 0xed, 0xbc, 0xf5, 0x8c, 0xa8, 0xf8, 0x5c, 0xc7, 0xa1, 0x8f, + 0x1a, 0x7e, 0xf0, 0xe6, 0x48, 0xec, 0xd1, 0x2c, 0xee, 0x98, 0x98, 0xf9, 0xfd, 0xae, 0x43, 0x05, + 0xdc, 0xa4, 0xae, 0xa2, 0x84, 0x53, 0x2d, 0x8f, 0x37, 0x63, 0x06, 0xb8, 0x48, 0x62, 0xe6, 0x68, + 0x31, 0xa2, 0x01, 0xb9, 0x3d, 0xe9, 0x5f, 0x45, 0x57, 0x9a, 0x3c, 0x7d, 0xad, 0x72, 0x11, 0x99, + 0xa9, 0x4c, 0x2c, 0xab, 0xcd, 0x20, 0x90, 0x7b, 0x43, 0x17, 0x78, 0x59, 0x2c, 0xc9, 0xd2, 0x64, + 0x16, 0xc6, 0x16, 0x1d, 0x3c, 0x18, 0xbb, 0x4b, 0x37, 0x16, 0xed, 0x96, 0xd9, 0xdc, 0xc0, 0x37, + 0xae, 0x62, 0xaa, 0xec, 0x70, 0x5c, 0xe3, 0x21, 0xdd, 0x68, 0x74, 0x10, 0x2b, 0x2f, 0x2b, 0xf1, + 0x92, 0x72, 0x60, 0xe5, 0x27, 0x76, 0x16, 0x58, 0x99, 0xc2, 0x98, 0xb8, 0xc8, 0x7e, 0xec, 0x51, + 0x8b, 0x2d, 0xf5, 0xae, 0x78, 0xcf, 0xaa, 0xc4, 0x2e, 0xbe, 0x03, 0x3c, 0x9f, 0x3a, 0xc4, 0x28, + 0xa3, 0x01, 0x58, 0x6e, 0x58, 0xbc, 0x48, 0x32, 0xfa, 0xf0, 0x93, 0x7b, 0x88, 0x3e, 0xfc, 0xb7, + 0x0a, 0xf2, 0xfc, 0x4b, 0x2e, 0x43, 0x51, 0x4a, 0x0e, 0x84, 0xa1, 0x55, 0x31, 0x90, 0x7a, 0x51, + 0x44, 0x8c, 0x1e, 0x14, 0xb6, 0x4b, 0x10, 0x43, 0x07, 0xb3, 0x41, 0x86, 0xe1, 0x36, 0xb5, 0x90, + 0x00, 0x33, 0xf1, 0x75, 0x97, 0x5b, 0x66, 0x13, 0xc3, 0xeb, 0x17, 0xa4, 0xa0, 0x19, 0x08, 0xe5, + 0xd1, 0xf5, 0x25, 0x12, 0x72, 0x13, 0x86, 0xfc, 0x03, 0xd9, 0x30, 0xb4, 0x30, 0x46, 0x5d, 0x17, + 0xb3, 0xb5, 0x08, 0xea, 0x2e, 0x11, 0x91, 0xd7, 0x01, 0xc2, 0xe9, 0x40, 0x58, 0x5a, 0xb8, 0x54, + 0xc8, 0xb3, 0x87, 0xbc, 0x54, 0x84, 0xd4, 0x6c, 0xe2, 0x94, 0xd5, 0xd1, 0xcf, 0x3d, 0x8a, 0x13, + 0x67, 0x44, 0x87, 0x65, 0x05, 0x89, 0x16, 0x21, 0x0b, 0x70, 0x3a, 0xa1, 0x81, 0x22, 0x10, 0x31, + 0xe6, 0x9f, 0x4f, 0x51, 0x5f, 0x79, 0x61, 0x4e, 0x94, 0x25, 0xcf, 0x42, 0xe1, 0x9e, 0x56, 0x13, + 0xc1, 0x50, 0x79, 0x1c, 0xdd, 0x48, 0xa4, 0x24, 0x86, 0x55, 0xff, 0x44, 0x3e, 0xb1, 0x36, 0x31, + 0xe9, 0x09, 0x56, 0x52, 0x0f, 0xa2, 0xf4, 0xfc, 0xfa, 0xb9, 0xf4, 0x24, 0x22, 0x72, 0x15, 0xca, + 0x8b, 0x6c, 0x66, 0x68, 0xda, 0x2d, 0xd1, 0x9f, 0x18, 0xd6, 0xaa, 0x23, 0x60, 0x5a, 0x80, 0x25, + 0x37, 0xa5, 0x94, 0xb9, 0x52, 0x7c, 0x71, 0x3f, 0x65, 0x6e, 0x3c, 0xd0, 0x36, 0x26, 0xcf, 0xbd, + 0x19, 0x4b, 0xc1, 0x25, 0xca, 0xa4, 0xac, 0x8b, 0x61, 0xca, 0xad, 0xc0, 0x2a, 0xed, 0xdf, 0xce, + 0x2a, 0x55, 0xff, 0x76, 0x2e, 0x39, 0xce, 0xc8, 0xad, 0x64, 0xa8, 0x5f, 0x5c, 0x84, 0x02, 0xa0, + 0x5c, 0x6b, 0x10, 0xf4, 0x37, 0x12, 0xb4, 0x37, 0xbf, 0xe7, 0xa0, 0xbd, 0x85, 0x5d, 0x06, 0xed, + 0x55, 0xff, 0x9f, 0x62, 0x4f, 0xc7, 0xeb, 0x43, 0x09, 0xee, 0xf6, 0x1a, 0xdb, 0x59, 0xb1, 0xda, + 0x2b, 0x6e, 0x62, 0x7f, 0xc0, 0xfd, 0x4a, 0x1b, 0x3a, 0x1f, 0x5a, 0xae, 0x16, 0xa5, 0x24, 0x6f, + 0xc3, 0xb0, 0xff, 0x01, 0x18, 0x0c, 0x5a, 0x0a, 0x62, 0x1c, 0xac, 0x6a, 0xb1, 0xb0, 0xc9, 0x91, + 0x02, 0xe4, 0x65, 0x18, 0x44, 0x9b, 0xa6, 0xa3, 0x37, 0xfd, 0x48, 0xe1, 0x3c, 0xb4, 0xb8, 0x0f, + 0x94, 0x03, 0x98, 0x05, 0x94, 0xe4, 0x2b, 0x50, 0x12, 0xe9, 0x32, 0x78, 0x36, 0xf9, 0x1b, 0x3b, + 0xf0, 0x54, 0xbf, 0x2e, 0xa7, 0xca, 0xe0, 0xbb, 0x14, 0x04, 0x44, 0x76, 0x29, 0x3c, 0x4b, 0xc6, + 0x12, 0x9c, 0x59, 0x74, 0xa8, 0x81, 0x6f, 0x22, 0xa6, 0x1e, 0x77, 0x1c, 0x91, 0xc8, 0x84, 0x8f, + 0x72, 0x5c, 0xa4, 0x3a, 0x3e, 0x9a, 0x2d, 0x9f, 0x02, 0x2f, 0x87, 0x2b, 0x4e, 0x29, 0xce, 0x2c, + 0x17, 0xde, 0x92, 0xbb, 0x74, 0x63, 0xdd, 0x76, 0x0c, 0x9e, 0xeb, 0x43, 0xcc, 0xdf, 0x42, 0xd0, + 0x0f, 0x05, 0x4a, 0xb6, 0x5c, 0xa2, 0x85, 0x2e, 0xbd, 0x06, 0x43, 0x7b, 0x4d, 0x37, 0xf1, 0x1b, + 0xf9, 0x8c, 0x27, 0x4c, 0xc7, 0x37, 0xe3, 0x5f, 0x90, 0x86, 0xba, 0x3f, 0x23, 0x0d, 0xf5, 0xf7, + 0xf3, 0x19, 0xef, 0xb3, 0x8e, 0x75, 0xba, 0xd8, 0x40, 0x18, 0xd1, 0x74, 0xb1, 0x61, 0xa6, 0x5e, + 0xd3, 0xd0, 0x64, 0xa2, 0x58, 0x62, 0xe9, 0xd2, 0xb6, 0x89, 0xa5, 0x7f, 0xb9, 0xd0, 0xeb, 0xfd, + 0xda, 0x89, 0xec, 0x77, 0x23, 0xfb, 0x9b, 0x30, 0x14, 0x48, 0xb6, 0x56, 0x45, 0xa3, 0x67, 0x24, + 0x48, 0x6e, 0xc3, 0xc1, 0x58, 0x46, 0x22, 0x22, 0xd7, 0x78, 0x5b, 0xeb, 0xe6, 0xfb, 0x3c, 0xcd, + 0xc2, 0x88, 0x08, 0xa0, 0xaf, 0x7b, 0x7a, 0xc3, 0x35, 0xdf, 0xa7, 0x5a, 0x80, 0x56, 0xff, 0xb3, + 0x7c, 0xea, 0x23, 0xc0, 0x93, 0x3e, 0xda, 0x45, 0x1f, 0xa5, 0x08, 0x91, 0x3f, 0x5f, 0x3c, 0x11, + 0xe2, 0x2e, 0x84, 0xf8, 0xc7, 0xf9, 0xd4, 0xc7, 0x9e, 0x27, 0x42, 0xdc, 0xcd, 0x6c, 0xf1, 0x3c, + 0x0c, 0x6a, 0xf6, 0xba, 0x3b, 0x89, 0x1b, 0x1b, 0x3e, 0x57, 0xe0, 0x44, 0xed, 0xd8, 0xeb, 0x6e, + 0x03, 0xb7, 0x2c, 0x5a, 0x48, 0xa0, 0xfe, 0x20, 0xdf, 0xe3, 0x39, 0xec, 0x89, 0xe0, 0x3f, 0xca, + 0x25, 0xf2, 0xb7, 0xf3, 0x91, 0xe7, 0xb6, 0xc7, 0x57, 0xd8, 0x37, 0x00, 0xea, 0xcd, 0x35, 0xda, + 0xd6, 0xa5, 0x54, 0x55, 0x78, 0xee, 0xe0, 0x22, 0x54, 0xa4, 0x38, 0x0e, 0x49, 0xd4, 0x6f, 0xe7, + 0x63, 0xef, 0x8d, 0x4f, 0x64, 0xb7, 0x63, 0xd9, 0x05, 0x5a, 0x27, 0x9e, 0x50, 0x9f, 0x48, 0x6e, + 0xa7, 0x92, 0xfb, 0xc9, 0x7c, 0xec, 0xb5, 0xf9, 0xb1, 0x95, 0x1d, 0x1b, 0x80, 0xc9, 0x57, 0xf0, + 0xc7, 0x56, 0x93, 0x9e, 0x87, 0x41, 0x21, 0x87, 0x60, 0xa9, 0xe0, 0xf3, 0x3e, 0x07, 0xe2, 0x29, + 0x6b, 0x40, 0xa0, 0xfe, 0xc9, 0x3c, 0x44, 0xa3, 0x00, 0x1c, 0x53, 0x1d, 0xfa, 0xed, 0x7c, 0x34, + 0xfe, 0xc1, 0xf1, 0xd5, 0x9f, 0xeb, 0x00, 0xf5, 0xee, 0x72, 0x53, 0x84, 0xcf, 0xed, 0x97, 0x8e, + 0xe9, 0x03, 0xa8, 0x26, 0x51, 0xa8, 0xff, 0x6f, 0x3e, 0x35, 0x28, 0xc3, 0xf1, 0x15, 0xe0, 0x4b, + 0x78, 0x2a, 0xde, 0xb4, 0xc2, 0x89, 0x1c, 0x0f, 0x21, 0xd9, 0xf8, 0x4b, 0xe4, 0x37, 0xf4, 0x09, + 0xc9, 0xe7, 0x53, 0xcc, 0x35, 0xcc, 0xbe, 0x10, 0x9a, 0x6b, 0xf2, 0x35, 0x84, 0x64, 0xb8, 0xfd, + 0xbd, 0xfc, 0x76, 0x31, 0x2c, 0x8e, 0xf3, 0xaa, 0x3a, 0xb0, 0xa8, 0x6f, 0x60, 0xac, 0x45, 0xd6, + 0x13, 0xc3, 0x3c, 0xfb, 0x5e, 0x87, 0x83, 0xe4, 0xbb, 0x37, 0x41, 0xa5, 0xfe, 0xb3, 0xfe, 0xf4, + 0x00, 0x0a, 0xc7, 0x57, 0x84, 0x97, 0xa1, 0xb8, 0xa8, 0x7b, 0x6b, 0x42, 0x93, 0xf1, 0x4a, 0xaf, + 0xa3, 0x7b, 0x6b, 0x1a, 0x42, 0xc9, 0x35, 0x28, 0x6b, 0xfa, 0x3a, 0x3f, 0xf3, 0x2c, 0x85, 0x99, + 0x11, 0x1d, 0x7d, 0xbd, 0xc1, 0xcf, 0x3d, 0x03, 0x34, 0x51, 0x83, 0xcc, 0x9c, 0xfc, 0xe4, 0x1b, + 0xd3, 0xc2, 0xf1, 0xcc, 0x9c, 0x41, 0x3e, 0xce, 0xcb, 0x50, 0x9c, 0xb0, 0x8d, 0x0d, 0xbc, 0xbe, + 0x1a, 0xe6, 0x95, 0x2d, 0xdb, 0xc6, 0x86, 0x86, 0x50, 0xf2, 0x53, 0x39, 0x18, 0x98, 0xa1, 0xba, + 0xc1, 0x46, 0xc8, 0x60, 0x2f, 0xaf, 0x93, 0x2f, 0x1d, 0x8c, 0xd7, 0xc9, 0xe9, 0x35, 0x5e, 0x99, + 0xac, 0x28, 0xa2, 0x7e, 0x72, 0x1b, 0xca, 0x93, 0xba, 0x47, 0x57, 0x6d, 0x67, 0x03, 0xfd, 0x68, + 0x46, 0x43, 0x27, 0xfc, 0x88, 0xfe, 0xf8, 0x44, 0xfc, 0x66, 0xac, 0x29, 0x7e, 0x69, 0x41, 0x61, + 0x26, 0x16, 0x9e, 0xf8, 0x5f, 0x64, 0xa1, 0x46, 0xb1, 0x78, 0x08, 0xd1, 0x04, 0x26, 0x3c, 0x56, + 0x1e, 0x4e, 0x3f, 0x56, 0x46, 0xeb, 0x11, 0x7d, 0xed, 0x30, 0x1f, 0xe6, 0x08, 0x2e, 0xfa, 0xdc, + 0x7a, 0x44, 0x28, 0xa6, 0xc3, 0xd4, 0x24, 0x12, 0xf5, 0x7b, 0xfd, 0x90, 0xfa, 0xdc, 0xfa, 0x44, + 0xc9, 0x4f, 0x94, 0x3c, 0x54, 0xf2, 0x6a, 0x42, 0xc9, 0x2f, 0x25, 0x1f, 0xf0, 0x7f, 0x4c, 0x35, + 0xfc, 0xe7, 0x8a, 0x89, 0xf0, 0x1f, 0xc7, 0x7b, 0x77, 0x19, 0x4a, 0xaf, 0x7f, 0x5b, 0xe9, 0x05, + 0x03, 0xa2, 0xb4, 0xed, 0x80, 0x18, 0xd8, 0xe9, 0x80, 0x28, 0x67, 0x0e, 0x88, 0x50, 0x41, 0x06, + 0x33, 0x15, 0xa4, 0x26, 0x06, 0x0d, 0xf4, 0xce, 0x42, 0x72, 0x79, 0x6b, 0x73, 0x7c, 0x94, 0x8d, + 0xa6, 0xd4, 0xf4, 0x23, 0xc8, 0x42, 0xfd, 0x83, 0x62, 0x8f, 0x98, 0x3d, 0x87, 0xa2, 0x23, 0x2f, + 0x41, 0xa1, 0xd2, 0xe9, 0x08, 0xfd, 0x38, 0x23, 0x85, 0x0b, 0xca, 0x28, 0xc5, 0xa8, 0xc9, 0xeb, + 0x50, 0xa8, 0x3c, 0xa8, 0xc7, 0x33, 0x8f, 0x54, 0x1e, 0xd4, 0xc5, 0x97, 0x64, 0x96, 0x7d, 0x50, + 0x27, 0x6f, 0x86, 0x21, 0x40, 0xd7, 0xba, 0xd6, 0x43, 0xb1, 0x51, 0x14, 0xee, 0xb6, 0xbe, 0x3b, + 0x4e, 0x93, 0xa1, 0xd8, 0x76, 0x31, 0x46, 0x1b, 0xd3, 0xa6, 0xd2, 0xce, 0xb5, 0x69, 0x60, 0x5b, + 0x6d, 0x2a, 0xef, 0x54, 0x9b, 0x06, 0x77, 0xa0, 0x4d, 0xb0, 0xad, 0x36, 0x0d, 0xed, 0x5f, 0x9b, + 0x3a, 0x70, 0x29, 0x19, 0x67, 0x2d, 0xd0, 0x08, 0x0d, 0x48, 0x12, 0x2b, 0x1c, 0x4b, 0xf0, 0xea, + 0xbf, 0xcb, 0xb1, 0x8d, 0x75, 0x44, 0x37, 0x5c, 0x86, 0x97, 0xfd, 0xd3, 0x92, 0xa5, 0xd5, 0xdf, + 0xc8, 0x67, 0x87, 0x87, 0x3b, 0x9a, 0x53, 0xdc, 0x8f, 0xa4, 0x4a, 0xa9, 0x18, 0x7d, 0xae, 0x9f, + 0x2d, 0xe5, 0x18, 0xdb, 0x34, 0x99, 0x7d, 0x37, 0x97, 0x15, 0xb3, 0x6e, 0x5f, 0x12, 0xfb, 0x74, + 0xd2, 0xa3, 0x0d, 0xfd, 0xf4, 0xdd, 0xa8, 0x2b, 0xdb, 0x34, 0x0c, 0xcb, 0x42, 0x14, 0x52, 0xda, + 0x89, 0x80, 0x23, 0xe5, 0xd4, 0xbf, 0x9d, 0x83, 0x33, 0x77, 0xbb, 0xcb, 0x54, 0x78, 0xb0, 0x05, + 0xcd, 0x78, 0x0f, 0x80, 0x81, 0x85, 0x13, 0x4b, 0x0e, 0x9d, 0x58, 0x3e, 0x2b, 0xc7, 0x9b, 0x8b, + 0x15, 0xb8, 0x1e, 0x52, 0x73, 0x07, 0x96, 0x27, 0x7d, 0x67, 0xce, 0x87, 0xdd, 0x65, 0xda, 0x48, + 0x78, 0xb2, 0x48, 0xdc, 0x2f, 0xbd, 0xc5, 0xdd, 0xe4, 0xf7, 0xea, 0x34, 0xf2, 0x6b, 0xf9, 0xcc, + 0x10, 0x7f, 0x47, 0x36, 0x17, 0xe5, 0x0f, 0xa5, 0xf6, 0x4a, 0x3c, 0x27, 0x65, 0x0a, 0x49, 0x8c, + 0x63, 0x1a, 0x97, 0x74, 0x81, 0x1d, 0xf1, 0x0c, 0xa9, 0x1f, 0xa9, 0xc0, 0xfe, 0x41, 0x2e, 0x33, + 0x14, 0xe3, 0x51, 0x15, 0x98, 0xfa, 0xbf, 0x14, 0xfc, 0x08, 0x90, 0xfb, 0xfa, 0x84, 0xe7, 0x61, + 0x50, 0x3c, 0x84, 0x8f, 0x3a, 0xe0, 0x8a, 0xa3, 0x3c, 0x3c, 0x1a, 0x0e, 0x08, 0xd8, 0x32, 0x2f, + 0x79, 0x07, 0x4b, 0x0e, 0xb8, 0x92, 0x67, 0xb0, 0x26, 0x91, 0xb0, 0x85, 0x7c, 0xea, 0xb1, 0xe9, + 0xa1, 0x55, 0xc0, 0xfa, 0xb2, 0xc0, 0x17, 0x72, 0xfa, 0xd8, 0xf4, 0xb8, 0x4d, 0x10, 0xa0, 0xd9, + 0x22, 0x5d, 0x0f, 0xf3, 0xbf, 0x8b, 0x45, 0xda, 0x15, 0x69, 0xf0, 0xc5, 0xb3, 0xb1, 0xe7, 0x61, + 0x50, 0x78, 0xb5, 0x0a, 0x37, 0x13, 0xd1, 0x5a, 0xe1, 0x07, 0x8b, 0xad, 0x0d, 0x08, 0x18, 0x47, + 0x8d, 0xae, 0x86, 0x8e, 0x75, 0xc8, 0xd1, 0x41, 0x88, 0x26, 0x30, 0xe4, 0x26, 0x8c, 0xd6, 0x3d, + 0xdd, 0x32, 0x74, 0xc7, 0x58, 0xe8, 0x7a, 0x9d, 0xae, 0x27, 0x1b, 0xa5, 0xae, 0x67, 0xd8, 0x5d, + 0x4f, 0x8b, 0x51, 0x90, 0xcf, 0xc1, 0x88, 0x0f, 0x99, 0x72, 0x1c, 0xdb, 0x91, 0x2d, 0x0f, 0xd7, + 0x33, 0xa8, 0xe3, 0x68, 0x51, 0x02, 0xf2, 0x79, 0x18, 0xa9, 0x59, 0x8f, 0xec, 0x26, 0x7f, 0x0c, + 0xae, 0xcd, 0x0a, 0x3b, 0x04, 0x9f, 0x62, 0x99, 0x01, 0xa2, 0xd1, 0x75, 0x5a, 0x5a, 0x94, 0x50, + 0xdd, 0xca, 0x27, 0x03, 0x65, 0x1e, 0xdf, 0x4d, 0xcb, 0xb5, 0xa8, 0x33, 0x1d, 0x7a, 0x90, 0xa2, + 0x41, 0x28, 0xfb, 0xf2, 0x72, 0xbb, 0xf0, 0x26, 0x94, 0xef, 0xd2, 0x0d, 0xee, 0xf7, 0x59, 0x0a, + 0x5d, 0x85, 0x1f, 0x0a, 0x98, 0x7c, 0xe2, 0xea, 0xd3, 0xa9, 0xdf, 0xc9, 0x27, 0x43, 0x80, 0x1e, + 0x5f, 0x61, 0x7f, 0x0e, 0x06, 0x50, 0x94, 0x35, 0xff, 0xc8, 0x1f, 0x05, 0x88, 0xe2, 0x8e, 0x7a, + 0x20, 0xfb, 0x64, 0xea, 0x2f, 0x95, 0xe2, 0x71, 0x61, 0x8f, 0xaf, 0xf4, 0xde, 0x80, 0xa1, 0x49, + 0xdb, 0x72, 0x4d, 0xd7, 0xa3, 0x56, 0xd3, 0x57, 0xd8, 0x8b, 0xcc, 0xa0, 0x6a, 0x86, 0x60, 0xf9, + 0x0d, 0x92, 0x44, 0xbd, 0x17, 0xe5, 0x25, 0xaf, 0xc0, 0x20, 0x8a, 0x1c, 0xfd, 0xa4, 0xf9, 0x84, + 0x87, 0xb7, 0x05, 0xcb, 0x0c, 0x18, 0x77, 0x92, 0x0e, 0x49, 0xc9, 0x3d, 0x28, 0x4f, 0xae, 0x99, + 0x2d, 0xc3, 0xa1, 0x16, 0xfa, 0x0b, 0x4b, 0xe1, 0x37, 0xa2, 0x7d, 0x79, 0x1d, 0xff, 0x45, 0x5a, + 0xde, 0x9c, 0xa6, 0x28, 0x16, 0x79, 0x85, 0x25, 0x60, 0x97, 0x7e, 0x36, 0x0f, 0x10, 0x16, 0x20, + 0x4f, 0x43, 0x3e, 0x48, 0xad, 0x8c, 0x6e, 0x2a, 0x11, 0x0d, 0xca, 0xe3, 0x52, 0x21, 0xc6, 0x76, + 0x7e, 0xdb, 0xb1, 0x7d, 0x0f, 0x4a, 0xfc, 0xc4, 0x0b, 0x3d, 0xc9, 0xa5, 0x50, 0x95, 0x99, 0x0d, + 0xbe, 0x8e, 0xf4, 0x7c, 0x33, 0x8b, 0x96, 0x67, 0xc4, 0x2b, 0x9b, 0x33, 0xbb, 0xd4, 0x84, 0x7e, + 0xfc, 0x8b, 0x5c, 0x81, 0xe2, 0x92, 0x9f, 0x96, 0x75, 0x84, 0xcf, 0xd2, 0x31, 0xf9, 0x21, 0x9e, + 0x75, 0xd3, 0xa4, 0x6d, 0x79, 0xac, 0x6a, 0x6c, 0xf5, 0xb0, 0x90, 0x8b, 0x80, 0x45, 0xe4, 0x22, + 0x60, 0xea, 0x7f, 0x95, 0x4f, 0x89, 0x58, 0x7c, 0x7c, 0x87, 0xc9, 0x6b, 0x00, 0xf8, 0xa4, 0x9b, + 0xc9, 0xd3, 0x7f, 0xa2, 0x81, 0xa3, 0x04, 0x19, 0xa1, 0xda, 0x46, 0xb6, 0x1d, 0x21, 0xb1, 0xfa, + 0x77, 0x73, 0x89, 0x30, 0xb7, 0xfb, 0x92, 0xa3, 0x6c, 0x95, 0xe5, 0xf7, 0x68, 0xc6, 0xfa, 0x7d, + 0x51, 0xd8, 0x5d, 0x5f, 0x44, 0xbf, 0xe5, 0x00, 0x2c, 0xd3, 0xc3, 0xfc, 0x96, 0xef, 0xe5, 0xd3, + 0x82, 0xfe, 0x1e, 0x4d, 0x15, 0xbf, 0x15, 0x18, 0xa5, 0xc5, 0x58, 0x98, 0x75, 0x84, 0xc6, 0x53, + 0x47, 0x0b, 0x33, 0xf5, 0xab, 0x70, 0x2a, 0x16, 0x0a, 0x57, 0x64, 0xf1, 0xbd, 0xd2, 0x3b, 0xa6, + 0x6e, 0x76, 0x30, 0x80, 0x08, 0x99, 0xfa, 0xff, 0xe5, 0x7a, 0x07, 0x42, 0x3e, 0x74, 0xd5, 0x49, + 0x11, 0x40, 0xe1, 0x5f, 0x8d, 0x00, 0x0e, 0x60, 0x1b, 0x7c, 0xb4, 0x05, 0xf0, 0x31, 0x99, 0x3c, + 0x3e, 0x6a, 0x01, 0xfc, 0x52, 0x6e, 0xdb, 0x38, 0xd6, 0x87, 0x2d, 0x03, 0xf5, 0x7f, 0xcc, 0xa5, + 0xc6, 0x9b, 0xde, 0x57, 0xbb, 0xde, 0x84, 0x12, 0x77, 0xab, 0x11, 0xad, 0x92, 0x32, 0x74, 0x31, + 0x68, 0x56, 0x4e, 0x7b, 0x8e, 0x25, 0xb3, 0x30, 0xc0, 0xdb, 0x60, 0x88, 0xde, 0xf8, 0x54, 0x8f, + 0xa0, 0xd7, 0x46, 0xd6, 0xe4, 0x28, 0xd0, 0xea, 0xdf, 0xc9, 0x25, 0xc2, 0x5f, 0x1f, 0xe2, 0xb7, + 0x85, 0x53, 0x75, 0x61, 0xe7, 0x53, 0xb5, 0xfa, 0x4f, 0xf3, 0xe9, 0xd1, 0xb7, 0x0f, 0xf1, 0x43, + 0x0e, 0xe2, 0x38, 0x6d, 0x6f, 0xeb, 0xd6, 0x12, 0x8c, 0x46, 0x65, 0x21, 0x96, 0xad, 0xa7, 0xd2, + 0x63, 0x90, 0x67, 0xb4, 0x22, 0xc6, 0x43, 0xfd, 0x30, 0x97, 0x0c, 0x1c, 0x7e, 0xe8, 0xf3, 0xd3, + 0xde, 0xb4, 0x25, 0xfa, 0x29, 0x1f, 0x93, 0xb5, 0xe6, 0x20, 0x3e, 0xe5, 0x63, 0xb2, 0x6a, 0xec, + 0xed, 0x53, 0x7e, 0x25, 0x9f, 0x15, 0x77, 0xfd, 0xd0, 0x3f, 0xe8, 0xcb, 0xb2, 0x90, 0x79, 0xcb, + 0xc4, 0xa7, 0x3d, 0x9d, 0x15, 0xe8, 0x3c, 0x83, 0x67, 0x82, 0xcf, 0xde, 0xc6, 0x78, 0xaa, 0xb0, + 0x3e, 0x26, 0x8a, 0x7c, 0x34, 0x84, 0xf5, 0x31, 0x19, 0x2a, 0x1f, 0x3f, 0x61, 0xfd, 0x6e, 0x7e, + 0xa7, 0xc1, 0xfe, 0x4f, 0x84, 0x97, 0x10, 0xde, 0x37, 0xf3, 0xc9, 0x24, 0x14, 0x87, 0x2e, 0xa6, + 0x69, 0x28, 0x89, 0x74, 0x18, 0x99, 0xc2, 0xe1, 0xf8, 0x2c, 0x8b, 0x46, 0x7c, 0xc7, 0x2d, 0x10, + 0x17, 0x39, 0x3b, 0x13, 0x09, 0xa7, 0x55, 0x7f, 0x90, 0x8b, 0x65, 0x6c, 0x38, 0x94, 0x23, 0x84, + 0x3d, 0x2d, 0x49, 0xe4, 0x2d, 0xff, 0x30, 0xb3, 0x18, 0x8b, 0x98, 0x1d, 0x7c, 0x4f, 0x95, 0x7a, + 0xba, 0xd9, 0x8a, 0x97, 0x17, 0x31, 0x01, 0xbe, 0x93, 0x87, 0xd3, 0x09, 0x52, 0x72, 0x25, 0x12, + 0x4a, 0x07, 0x8f, 0x25, 0x63, 0xce, 0xe3, 0x3c, 0xa8, 0xce, 0x2e, 0x4e, 0x52, 0xaf, 0x40, 0xb1, + 0xaa, 0x6f, 0xf0, 0x6f, 0xeb, 0xe7, 0x2c, 0x0d, 0x7d, 0x43, 0x3e, 0x71, 0x43, 0x3c, 0x59, 0x86, + 0x73, 0xfc, 0x3e, 0xc4, 0xb4, 0xad, 0x25, 0xb3, 0x4d, 0x6b, 0xd6, 0x9c, 0xd9, 0x6a, 0x99, 0xae, + 0xb8, 0xd4, 0x7b, 0x7e, 0x6b, 0x73, 0xfc, 0xaa, 0x67, 0x7b, 0x7a, 0xab, 0x41, 0x7d, 0xb2, 0x86, + 0x67, 0xb6, 0x69, 0xc3, 0xb4, 0x1a, 0x6d, 0xa4, 0x94, 0x58, 0xa6, 0xb3, 0x22, 0x35, 0x1e, 0x1c, + 0xbd, 0xde, 0xd4, 0x2d, 0x8b, 0x1a, 0x35, 0x6b, 0x62, 0xc3, 0xa3, 0xfc, 0x32, 0xb0, 0xc0, 0x8f, + 0x04, 0xf9, 0xdb, 0x70, 0x8e, 0x66, 0x8c, 0x97, 0x19, 0x81, 0x96, 0x52, 0x48, 0xfd, 0xbd, 0x62, + 0x4a, 0xb2, 0x8e, 0x23, 0xa4, 0x3e, 0x7e, 0x4f, 0x17, 0xb7, 0xe9, 0xe9, 0x1b, 0x30, 0x20, 0xa2, + 0xcf, 0x8a, 0x0b, 0x06, 0x74, 0x66, 0x7f, 0xc4, 0x41, 0xf2, 0x0d, 0x8d, 0xa0, 0x22, 0x2d, 0xb8, + 0xb4, 0xc4, 0xba, 0x29, 0xbd, 0x33, 0x4b, 0x7b, 0xe8, 0xcc, 0x1e, 0xfc, 0xc8, 0xbb, 0x70, 0x01, + 0xb1, 0x29, 0xdd, 0x3a, 0x80, 0x55, 0x61, 0x8c, 0x2a, 0x5e, 0x55, 0x7a, 0xe7, 0x66, 0x95, 0x27, + 0x5f, 0x86, 0xe1, 0x60, 0x80, 0x98, 0xd4, 0x15, 0x37, 0x17, 0x3d, 0xc6, 0x19, 0x0f, 0x00, 0xc7, + 0xc0, 0xe8, 0x42, 0x16, 0x0d, 0x22, 0x16, 0xe1, 0xa5, 0xfe, 0x0f, 0xb9, 0x5e, 0x49, 0x43, 0x0e, + 0x7d, 0x56, 0x7e, 0x0b, 0x06, 0x0c, 0xfe, 0x51, 0x42, 0xa7, 0x7a, 0xa7, 0x15, 0xe1, 0xa4, 0x9a, + 0x5f, 0x46, 0xfd, 0x27, 0xb9, 0x9e, 0xb9, 0x4a, 0x8e, 0xfa, 0xe7, 0x7d, 0xb3, 0x90, 0xf1, 0x79, + 0x62, 0x12, 0xbd, 0x06, 0x63, 0x66, 0x18, 0x4c, 0xbd, 0x11, 0x86, 0x9f, 0xd2, 0x4e, 0x49, 0x70, + 0x1c, 0x5d, 0xb7, 0xe0, 0xbc, 0xef, 0xf8, 0xe8, 0xf8, 0x1e, 0x62, 0x6e, 0xa3, 0xeb, 0x98, 0x7c, + 0x5c, 0x6a, 0x67, 0xdd, 0x98, 0xfb, 0x98, 0x7b, 0xcf, 0x31, 0x59, 0x05, 0xba, 0xb7, 0x46, 0x2d, + 0xbd, 0xb1, 0x6e, 0x3b, 0x0f, 0x31, 0xca, 0x28, 0x1f, 0x9c, 0xda, 0x29, 0x0e, 0x7f, 0xe0, 0x83, + 0xc9, 0xb3, 0x30, 0xb2, 0xda, 0xea, 0xd2, 0x20, 0xae, 0x23, 0xbf, 0xeb, 0xd3, 0x86, 0x19, 0x30, + 0xb8, 0x21, 0x79, 0x12, 0x00, 0x89, 0x3c, 0xcc, 0x24, 0x83, 0x17, 0x7b, 0xda, 0x20, 0x83, 0x2c, + 0x89, 0xee, 0xba, 0xc4, 0xb5, 0x9a, 0x0b, 0xa9, 0xd1, 0xb2, 0xad, 0xd5, 0x86, 0x47, 0x9d, 0x36, + 0x36, 0x14, 0x9d, 0x19, 0xb4, 0xf3, 0x48, 0x81, 0x57, 0x27, 0xee, 0xac, 0x6d, 0xad, 0x2e, 0x51, + 0xa7, 0xcd, 0x9a, 0xfa, 0x3c, 0x10, 0xd1, 0x54, 0x07, 0x0f, 0x3d, 0xf8, 0xc7, 0xa1, 0x37, 0x83, + 0x26, 0x3e, 0x82, 0x9f, 0x86, 0xe0, 0x87, 0x8d, 0xc3, 0x10, 0x0f, 0x6e, 0xc7, 0x85, 0x86, 0x2e, + 0x0c, 0x1a, 0x70, 0x10, 0xca, 0xeb, 0x3c, 0x08, 0xef, 0x0a, 0xee, 0xd5, 0xad, 0x89, 0x5f, 0xea, + 0x07, 0x85, 0xb4, 0xf4, 0x2a, 0xfb, 0x52, 0xb4, 0x70, 0x5a, 0xcd, 0xef, 0x6a, 0x5a, 0x3d, 0x65, + 0x75, 0xdb, 0x0d, 0xbd, 0xd3, 0x69, 0xac, 0x98, 0x2d, 0x7c, 0x56, 0x85, 0x0b, 0x9f, 0x36, 0x62, + 0x75, 0xdb, 0x95, 0x4e, 0x67, 0x9a, 0x03, 0xc9, 0x73, 0x70, 0x9a, 0xd1, 0x61, 0x27, 0x05, 0x94, + 0x45, 0xa4, 0x64, 0x0c, 0x30, 0x3a, 0xac, 0x4f, 0x7b, 0x11, 0xca, 0x82, 0x27, 0x5f, 0xab, 0xfa, + 0xb5, 0x01, 0xce, 0xcc, 0x65, 0x3d, 0x17, 0xb0, 0xe1, 0x93, 0x6b, 0xbf, 0x36, 0xe8, 0x97, 0xc7, + 0x18, 0xc8, 0x56, 0xb7, 0xcd, 0x23, 0x62, 0x0d, 0x20, 0x32, 0xf8, 0x4d, 0xae, 0xc0, 0x28, 0xe3, + 0x12, 0x08, 0x8c, 0x87, 0x8d, 0xed, 0xd7, 0x62, 0x50, 0x72, 0x13, 0xce, 0x46, 0x20, 0xdc, 0x06, + 0xe5, 0xcf, 0x04, 0xfa, 0xb5, 0x54, 0x9c, 0xfa, 0xed, 0x42, 0x34, 0xe9, 0xcb, 0x21, 0x74, 0xc4, + 0x05, 0x18, 0xb0, 0x9d, 0xd5, 0x46, 0xd7, 0x69, 0x89, 0xb1, 0x57, 0xb2, 0x9d, 0xd5, 0x7b, 0x4e, + 0x8b, 0x9c, 0x83, 0x12, 0xeb, 0x1d, 0xd3, 0x10, 0x43, 0xac, 0x5f, 0xef, 0x74, 0x6a, 0x06, 0xa9, + 0xf0, 0x0e, 0xc1, 0x90, 0xa3, 0x8d, 0x26, 0x6e, 0xed, 0xb9, 0x53, 0x42, 0x3f, 0x5f, 0xf1, 0x12, + 0x48, 0xec, 0x27, 0x0c, 0x44, 0xca, 0x0f, 0x02, 0x62, 0x2c, 0x0c, 0xdc, 0x96, 0x18, 0xbc, 0x4f, + 0xe2, 0x2c, 0x04, 0x32, 0x64, 0xc1, 0x37, 0x31, 0x06, 0xa9, 0x02, 0x09, 0xa9, 0xda, 0xb6, 0x61, + 0xae, 0x98, 0x94, 0xbf, 0xea, 0xe8, 0xe7, 0x17, 0xbf, 0x49, 0xac, 0x36, 0xe6, 0x33, 0x99, 0x13, + 0x10, 0xf2, 0x06, 0x57, 0x42, 0x4e, 0x87, 0x6b, 0x1f, 0xef, 0x5b, 0x6e, 0xa7, 0xc5, 0x50, 0xa8, + 0x99, 0x58, 0x1e, 0x17, 0x42, 0xf5, 0xaf, 0x14, 0x93, 0x99, 0x7f, 0x0e, 0xc5, 0xae, 0x99, 0x01, + 0x10, 0x89, 0xbd, 0xc2, 0xcb, 0xb5, 0xc0, 0xe3, 0x3c, 0xc4, 0x64, 0xf0, 0x90, 0xca, 0x92, 0x6b, + 0x50, 0xe6, 0x5f, 0x54, 0xab, 0x0a, 0x7b, 0x07, 0x5d, 0xc4, 0xdc, 0x8e, 0xb9, 0xb2, 0x82, 0xfe, + 0x64, 0x01, 0x9a, 0x5c, 0x81, 0x81, 0xea, 0x7c, 0xbd, 0x5e, 0x99, 0xf7, 0x6f, 0x8a, 0xf1, 0x7d, + 0x89, 0x61, 0xb9, 0x0d, 0x57, 0xb7, 0x5c, 0xcd, 0x47, 0x92, 0x67, 0xa1, 0x54, 0x5b, 0x44, 0x32, + 0xfe, 0x6a, 0x72, 0x68, 0x6b, 0x73, 0x7c, 0xc0, 0xec, 0x70, 0x2a, 0x81, 0xc2, 0x7a, 0xef, 0xd7, + 0xaa, 0x92, 0xbb, 0x04, 0xaf, 0xf7, 0x91, 0x69, 0xe0, 0xb5, 0xb3, 0x16, 0xa0, 0xc9, 0xcb, 0x30, + 0x5c, 0xa7, 0x8e, 0xa9, 0xb7, 0xe6, 0xbb, 0xb8, 0x55, 0x94, 0x42, 0x29, 0xba, 0x08, 0x6f, 0x58, + 0x88, 0xd0, 0x22, 0x64, 0xe4, 0x32, 0x14, 0x67, 0x4c, 0xcb, 0x7f, 0xc2, 0x80, 0x3e, 0xee, 0x6b, + 0xa6, 0xe5, 0x69, 0x08, 0x25, 0xcf, 0x42, 0xe1, 0xce, 0x52, 0x4d, 0x78, 0x82, 0x21, 0xaf, 0xf7, + 0xbc, 0x48, 0x58, 0xc6, 0x3b, 0x4b, 0x35, 0xf2, 0x32, 0x0c, 0xb2, 0x45, 0x8c, 0x5a, 0x4d, 0xea, + 0x2a, 0x43, 0xf8, 0x31, 0x3c, 0x8c, 0xa0, 0x0f, 0x94, 0x7d, 0x3a, 0x02, 0x4a, 0xf5, 0xff, 0xc8, + 0xa7, 0xa7, 0x66, 0x3a, 0x84, 0xa1, 0xbe, 0xc7, 0x5b, 0xe4, 0x98, 0x82, 0x15, 0xf7, 0xa1, 0x60, + 0x2b, 0x70, 0xaa, 0x62, 0xb4, 0x4d, 0xab, 0x82, 0x3f, 0xdd, 0xb9, 0xe9, 0x0a, 0x4e, 0x1d, 0xd2, + 0xf3, 0xbc, 0x18, 0x5a, 0x7c, 0x0f, 0x0f, 0xf8, 0xcb, 0x50, 0x0d, 0x9d, 0xe3, 0x1a, 0xed, 0x15, + 0xbd, 0xd1, 0xe4, 0x59, 0x8d, 0xb4, 0x38, 0x53, 0xf5, 0x67, 0xf2, 0xdb, 0x64, 0x93, 0x3a, 0x8e, + 0xd2, 0x57, 0xbf, 0x95, 0xef, 0x9d, 0xd0, 0xeb, 0x58, 0x0a, 0xe5, 0x8f, 0xf3, 0x29, 0xe9, 0xb5, + 0xf6, 0x25, 0x89, 0x6b, 0x50, 0xe6, 0x6c, 0x02, 0x37, 0x5e, 0x9c, 0xcd, 0xb8, 0xb2, 0xe2, 0x2c, + 0xea, 0xa3, 0xc9, 0x3c, 0x9c, 0xad, 0xac, 0xac, 0xd0, 0xa6, 0x17, 0x86, 0x7e, 0x9e, 0x0f, 0x83, + 0xb0, 0xf2, 0x50, 0xb7, 0x02, 0x1f, 0x86, 0x8e, 0xc6, 0x60, 0x23, 0xa9, 0xe5, 0xc8, 0x12, 0x9c, + 0x8f, 0xc3, 0xeb, 0x7c, 0x0b, 0x50, 0x94, 0xa2, 0xdf, 0x26, 0x38, 0xf2, 0xff, 0xb4, 0x8c, 0xb2, + 0x69, 0xad, 0xc4, 0xa9, 0xba, 0xbf, 0x57, 0x2b, 0x71, 0xde, 0x4e, 0x2d, 0xa7, 0x7e, 0xa7, 0x20, + 0x67, 0x21, 0x3b, 0xbe, 0x0e, 0x57, 0xb7, 0x22, 0x6e, 0xd6, 0x3b, 0x1d, 0x32, 0x2f, 0x8b, 0x08, + 0x22, 0x46, 0xd7, 0xf1, 0x3d, 0x12, 0x83, 0x08, 0x06, 0x08, 0x94, 0xd7, 0xa1, 0x80, 0x92, 0xd4, + 0xa0, 0x58, 0x71, 0x56, 0xb9, 0x79, 0xbb, 0xdd, 0xa3, 0x2a, 0xdd, 0x59, 0x75, 0xd3, 0x1f, 0x55, + 0x31, 0x16, 0xea, 0x9f, 0xc9, 0xf7, 0x48, 0x1c, 0x76, 0x2c, 0x27, 0x91, 0x3f, 0x9f, 0xcf, 0x4a, + 0x01, 0x76, 0x54, 0x5d, 0xc7, 0x3e, 0x62, 0xe1, 0x1c, 0x6d, 0xbf, 0xba, 0x03, 0x16, 0x4e, 0x46, + 0x3a, 0xb2, 0x13, 0xe1, 0x7c, 0x90, 0xcf, 0xca, 0xc8, 0x76, 0x6c, 0x67, 0x99, 0x8c, 0x24, 0x70, + 0x27, 0xba, 0xf2, 0x0b, 0xf9, 0xcc, 0x3c, 0x78, 0x27, 0xd2, 0x51, 0xbf, 0x9e, 0xcf, 0xcc, 0xe3, + 0x77, 0x2c, 0x87, 0x52, 0xaa, 0xb6, 0x9c, 0x8c, 0x25, 0x21, 0x9d, 0x3f, 0xcc, 0xa7, 0x67, 0x4e, + 0x3c, 0x04, 0x55, 0x39, 0x08, 0x0f, 0x3c, 0x5f, 0xa0, 0xc5, 0x7d, 0x09, 0xb4, 0xff, 0x40, 0x05, + 0x7a, 0x68, 0x63, 0xef, 0x93, 0x2a, 0xd0, 0x03, 0x18, 0xbc, 0xc7, 0x59, 0xa0, 0x3f, 0x5d, 0x48, + 0x66, 0x0b, 0x3d, 0x96, 0x47, 0x94, 0x13, 0x50, 0xf6, 0xcf, 0x30, 0x84, 0x40, 0x77, 0xdc, 0x9d, + 0x7e, 0x39, 0xf2, 0x36, 0x9c, 0x0a, 0x65, 0x29, 0x47, 0xa6, 0xc2, 0xeb, 0x8d, 0x26, 0x43, 0x35, + 0xde, 0x63, 0x38, 0x11, 0x42, 0x25, 0x4e, 0xad, 0xfe, 0xa0, 0x90, 0x4c, 0xb9, 0x7a, 0xd2, 0x1b, + 0x7b, 0xec, 0x8d, 0x7b, 0x70, 0x7e, 0xb2, 0xeb, 0x38, 0xd4, 0xf2, 0xd2, 0x3b, 0x05, 0x0f, 0x97, + 0x9b, 0x9c, 0xa2, 0x91, 0xec, 0x9c, 0x8c, 0xc2, 0x8c, 0xad, 0xf0, 0xbe, 0x8f, 0xb3, 0x1d, 0x08, + 0xd9, 0x76, 0x39, 0x45, 0x1a, 0xdb, 0xf4, 0xc2, 0xea, 0xdf, 0xcb, 0x27, 0x93, 0xe4, 0x9e, 0x74, + 0xfd, 0xde, 0xba, 0x5e, 0xfd, 0xa0, 0x10, 0x4f, 0x14, 0x7c, 0xb2, 0x40, 0xec, 0xbd, 0x3b, 0x7c, + 0x49, 0xe2, 0xb8, 0x91, 0xbe, 0xc2, 0x87, 0x67, 0x7d, 0x85, 0x8f, 0x57, 0x7f, 0xad, 0x18, 0x4f, + 0xba, 0x7c, 0xd2, 0x1d, 0x87, 0xd7, 0x1d, 0x64, 0x01, 0xce, 0x8a, 0xb9, 0xcd, 0x07, 0x61, 0x8a, + 0x02, 0x31, 0x7f, 0xf1, 0x4c, 0x67, 0x62, 0x5a, 0xec, 0xba, 0xd4, 0x69, 0x78, 0xba, 0xfb, 0xb0, + 0x81, 0x39, 0x0d, 0xb4, 0xd4, 0x82, 0x8c, 0xa1, 0x98, 0xd5, 0xa2, 0x0c, 0xcb, 0x21, 0x43, 0x7f, + 0x42, 0x4c, 0x30, 0x4c, 0x2b, 0xa8, 0xfe, 0x76, 0x0e, 0xc6, 0xe2, 0x9f, 0x43, 0xae, 0x43, 0x99, + 0xfd, 0x0e, 0x9e, 0x85, 0x4b, 0x79, 0x94, 0x39, 0x47, 0x7e, 0x65, 0xec, 0xd3, 0x90, 0x57, 0x60, + 0x10, 0x6f, 0xe7, 0xb1, 0x40, 0x3e, 0x7c, 0x8d, 0x1f, 0x16, 0xc0, 0xe4, 0x9e, 0xbc, 0x58, 0x48, + 0x4a, 0xde, 0x80, 0xa1, 0x5a, 0xe8, 0x86, 0x24, 0xee, 0x64, 0xd0, 0xfb, 0x51, 0x2a, 0x19, 0x12, + 0x68, 0x32, 0xb5, 0xfa, 0x61, 0x3e, 0x9e, 0x1c, 0xfc, 0x44, 0xd5, 0xf7, 0xa6, 0xea, 0xcf, 0xcd, + 0x71, 0x55, 0xbf, 0x6b, 0x5a, 0x06, 0xb9, 0x08, 0xe7, 0xee, 0xd5, 0xa7, 0xb4, 0xc6, 0xdd, 0xda, + 0x7c, 0xb5, 0x71, 0x6f, 0xbe, 0xbe, 0x38, 0x35, 0x59, 0x9b, 0xae, 0x4d, 0x55, 0xc7, 0xfa, 0xc8, + 0x19, 0x38, 0x15, 0xa2, 0x66, 0xee, 0xcd, 0x55, 0xe6, 0xc7, 0x72, 0xe4, 0x34, 0x8c, 0x84, 0xc0, + 0x89, 0x85, 0xa5, 0xb1, 0xfc, 0x73, 0x9f, 0x81, 0x21, 0x74, 0xbf, 0xe2, 0xd7, 0xc5, 0x64, 0x18, + 0xca, 0x0b, 0x13, 0xf5, 0x29, 0xed, 0x3e, 0x32, 0x01, 0x28, 0x55, 0xa7, 0xe6, 0x19, 0xc3, 0xdc, + 0x73, 0xff, 0x77, 0x0e, 0xa0, 0x3e, 0xbd, 0xb4, 0x28, 0x08, 0x87, 0x60, 0xa0, 0x36, 0x7f, 0xbf, + 0x32, 0x5b, 0x63, 0x74, 0x65, 0x28, 0x2e, 0x2c, 0x4e, 0xb1, 0x1a, 0x06, 0xa1, 0x7f, 0x72, 0x76, + 0xa1, 0x3e, 0x35, 0x96, 0x67, 0x40, 0x6d, 0xaa, 0x52, 0x1d, 0x2b, 0x30, 0xe0, 0x03, 0xad, 0xb6, + 0x34, 0x35, 0x56, 0x64, 0x7f, 0xce, 0xd6, 0x97, 0x2a, 0x4b, 0x63, 0xfd, 0xec, 0xcf, 0x69, 0xfc, + 0xb3, 0xc4, 0x98, 0xd5, 0xa7, 0x96, 0xf0, 0xc7, 0x00, 0x6b, 0xc2, 0xb4, 0xff, 0xab, 0xcc, 0x50, + 0x8c, 0x75, 0xb5, 0xa6, 0x8d, 0x0d, 0xb2, 0x1f, 0x8c, 0x25, 0xfb, 0x01, 0xac, 0x71, 0xda, 0xd4, + 0xdc, 0xc2, 0xfd, 0xa9, 0xb1, 0x21, 0xc6, 0x6b, 0xee, 0x2e, 0x03, 0x0f, 0xb3, 0x3f, 0xb5, 0x39, + 0xf6, 0xe7, 0x08, 0xe3, 0xa4, 0x4d, 0x55, 0x66, 0x17, 0x2b, 0x4b, 0x33, 0x63, 0xa3, 0xac, 0x3d, + 0xc8, 0xf3, 0x14, 0x2f, 0x39, 0x5f, 0x99, 0x9b, 0x1a, 0x1b, 0x13, 0x34, 0xd5, 0xd9, 0xda, 0xfc, + 0xdd, 0xb1, 0xd3, 0xd8, 0x90, 0x77, 0xe7, 0xf0, 0x07, 0x61, 0x05, 0xf0, 0xaf, 0x33, 0xcf, 0xfd, + 0x30, 0x94, 0x16, 0xea, 0x38, 0x0a, 0x2e, 0xc0, 0x99, 0x85, 0x7a, 0x63, 0xe9, 0xdd, 0xc5, 0xa9, + 0x98, 0xbc, 0x4f, 0xc3, 0x88, 0x8f, 0x98, 0xad, 0xcd, 0xdf, 0xfb, 0x12, 0x97, 0xb6, 0x0f, 0x9a, + 0xab, 0x4c, 0x2e, 0xd4, 0xc7, 0xf2, 0xac, 0x57, 0x7c, 0xd0, 0x83, 0xda, 0x7c, 0x75, 0xe1, 0x41, + 0x7d, 0xac, 0xf0, 0xdc, 0x23, 0x18, 0xe6, 0xb9, 0x1d, 0x17, 0x1c, 0x73, 0xd5, 0xb4, 0xc8, 0x93, + 0x70, 0xb1, 0x3a, 0x75, 0xbf, 0x36, 0x39, 0xd5, 0x58, 0xd0, 0x6a, 0xb7, 0x6b, 0xf3, 0xb1, 0x9a, + 0xce, 0xc1, 0xe9, 0x28, 0xba, 0xb2, 0x58, 0x1b, 0xcb, 0x91, 0xf3, 0x40, 0xa2, 0xe0, 0x3b, 0x95, + 0xb9, 0xe9, 0xb1, 0x3c, 0x51, 0xe0, 0x6c, 0x14, 0x5e, 0x9b, 0x5f, 0xba, 0x37, 0x3f, 0x35, 0x56, + 0x78, 0xee, 0x2f, 0xe7, 0xe0, 0x5c, 0x6a, 0xfc, 0x5f, 0xa2, 0xc2, 0x53, 0x53, 0xb3, 0x95, 0xfa, + 0x52, 0x6d, 0xb2, 0x3e, 0x55, 0xd1, 0x26, 0x67, 0x1a, 0x93, 0x95, 0xa5, 0xa9, 0xdb, 0x0b, 0xda, + 0xbb, 0x8d, 0xdb, 0x53, 0xf3, 0x53, 0x5a, 0x65, 0x76, 0xac, 0x8f, 0x3c, 0x0b, 0xe3, 0x19, 0x34, + 0xf5, 0xa9, 0xc9, 0x7b, 0x5a, 0x6d, 0xe9, 0xdd, 0xb1, 0x1c, 0x79, 0x06, 0x9e, 0xcc, 0x24, 0x62, + 0xbf, 0xc7, 0xf2, 0xe4, 0x29, 0xb8, 0x94, 0x45, 0xf2, 0xce, 0xec, 0x58, 0xe1, 0xb9, 0x9f, 0xcf, + 0x01, 0x49, 0x06, 0x70, 0x25, 0x4f, 0xc3, 0x65, 0xa6, 0x17, 0x8d, 0xec, 0x06, 0x3e, 0x03, 0x4f, + 0xa6, 0x52, 0x48, 0xcd, 0x1b, 0x87, 0x27, 0x32, 0x48, 0x44, 0xe3, 0x2e, 0x83, 0x92, 0x4e, 0x80, + 0x4d, 0xfb, 0xad, 0x1c, 0x9c, 0x4b, 0xf5, 0xd0, 0x20, 0x57, 0xe1, 0x53, 0x95, 0xea, 0x1c, 0xeb, + 0x9b, 0xc9, 0xa5, 0xda, 0xc2, 0x7c, 0xbd, 0x31, 0x37, 0x5d, 0x69, 0x30, 0xed, 0xbb, 0x57, 0x8f, + 0xf5, 0xe6, 0x15, 0x50, 0x7b, 0x50, 0x4e, 0xce, 0x54, 0xe6, 0x6f, 0xb3, 0xe1, 0x47, 0x3e, 0x05, + 0x4f, 0x67, 0xd2, 0x4d, 0xcd, 0x57, 0x26, 0x66, 0xa7, 0xaa, 0x63, 0x79, 0xf2, 0x69, 0x78, 0x26, + 0x93, 0xaa, 0x5a, 0xab, 0x73, 0xb2, 0xc2, 0x44, 0xf5, 0xc3, 0xff, 0xe9, 0xa9, 0xbe, 0x0f, 0xff, + 0xe8, 0xa9, 0xdc, 0xdf, 0xff, 0xa3, 0xa7, 0x72, 0xff, 0xf4, 0x8f, 0x9e, 0xca, 0x7d, 0xf9, 0xe6, + 0x6e, 0x02, 0xf3, 0xf2, 0x69, 0x6b, 0xb9, 0x84, 0xb7, 0xa5, 0x2f, 0xfd, 0xff, 0x01, 0x00, 0x00, + 0xff, 0xff, 0xf3, 0xef, 0xd0, 0xdb, 0x09, 0x7c, 0x01, 0x00, } func (m *Metadata) Marshal() (dAtA []byte, err error) { @@ -30965,75 +30775,6 @@ func (m *OneOf_CrownJewelDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) } return len(dAtA) - i, nil } -func (m *OneOf_AutoUpdateAgentPlanCreate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *OneOf_AutoUpdateAgentPlanCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.AutoUpdateAgentPlanCreate != nil { - { - size, err := m.AutoUpdateAgentPlanCreate.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xb - i-- - dAtA[i] = 0xca - } - return len(dAtA) - i, nil -} -func (m *OneOf_AutoUpdateAgentPlanUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *OneOf_AutoUpdateAgentPlanUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.AutoUpdateAgentPlanUpdate != nil { - { - size, err := m.AutoUpdateAgentPlanUpdate.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xb - i-- - dAtA[i] = 0xd2 - } - return len(dAtA) - i, nil -} -func (m *OneOf_AutoUpdateAgentPlanDelete) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *OneOf_AutoUpdateAgentPlanDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { - i := len(dAtA) - if m.AutoUpdateAgentPlanDelete != nil { - { - size, err := m.AutoUpdateAgentPlanDelete.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xb - i-- - dAtA[i] = 0xda - } - return len(dAtA) - i, nil -} func (m *OneOf_UserTaskCreate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) @@ -31127,12 +30868,12 @@ func (m *StreamStatus) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n651, err651 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) - if err651 != nil { - return 0, err651 + n648, err648 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.LastUploadTime, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.LastUploadTime):]) + if err648 != nil { + return 0, err648 } - i -= n651 - i = encodeVarintEvents(dAtA, i, uint64(n651)) + i -= n648 + i = encodeVarintEvents(dAtA, i, uint64(n648)) i-- dAtA[i] = 0x1a if m.LastEventIndex != 0 { @@ -31291,12 +31032,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0xc2 } } - n655, err655 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) - if err655 != nil { - return 0, err655 + n652, err652 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.PreviousIdentityExpires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.PreviousIdentityExpires):]) + if err652 != nil { + return 0, err652 } - i -= n655 - i = encodeVarintEvents(dAtA, i, uint64(n655)) + i -= n652 + i = encodeVarintEvents(dAtA, i, uint64(n652)) i-- dAtA[i] = 0x1 i-- @@ -31444,12 +31185,12 @@ func (m *Identity) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x4a } - n659, err659 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) - if err659 != nil { - return 0, err659 + n656, err656 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Expires):]) + if err656 != nil { + return 0, err656 } - i -= n659 - i = encodeVarintEvents(dAtA, i, uint64(n659)) + i -= n656 + i = encodeVarintEvents(dAtA, i, uint64(n656)) i-- dAtA[i] = 0x42 if len(m.KubernetesUsers) > 0 { @@ -37356,259 +37097,7 @@ func (m *StaticHostUserUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *StaticHostUserDelete) 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 *StaticHostUserDelete) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *StaticHostUserDelete) 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) - } - { - size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *CrownJewelCreate) 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 *CrownJewelCreate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CrownJewelCreate) 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 len(m.CrownJewelQuery) > 0 { - i -= len(m.CrownJewelQuery) - copy(dAtA[i:], m.CrownJewelQuery) - i = encodeVarintEvents(dAtA, i, uint64(len(m.CrownJewelQuery))) - i-- - dAtA[i] = 0x32 - } - { - size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *CrownJewelUpdate) 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 *CrownJewelUpdate) MarshalTo(dAtA []byte) (int, error) { - size := m.Size() - return m.MarshalToSizedBuffer(dAtA[:size]) -} - -func (m *CrownJewelUpdate) 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 len(m.UpdatedCrownJewelQuery) > 0 { - i -= len(m.UpdatedCrownJewelQuery) - copy(dAtA[i:], m.UpdatedCrownJewelQuery) - i = encodeVarintEvents(dAtA, i, uint64(len(m.UpdatedCrownJewelQuery))) - i-- - dAtA[i] = 0x3a - } - if len(m.CurrentCrownJewelQuery) > 0 { - i -= len(m.CurrentCrownJewelQuery) - copy(dAtA[i:], m.CurrentCrownJewelQuery) - i = encodeVarintEvents(dAtA, i, uint64(len(m.CurrentCrownJewelQuery))) - i-- - dAtA[i] = 0x32 - } - { - size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x2a - { - size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x22 - { - size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x1a - { - size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0x12 - { - size, err := m.Metadata.MarshalToSizedBuffer(dAtA[:i]) - if err != nil { - return 0, err - } - i -= size - i = encodeVarintEvents(dAtA, i, uint64(size)) - } - i-- - dAtA[i] = 0xa - return len(dAtA) - i, nil -} - -func (m *CrownJewelDelete) Marshal() (dAtA []byte, err error) { +func (m *StaticHostUserDelete) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -37618,12 +37107,12 @@ func (m *CrownJewelDelete) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *CrownJewelDelete) MarshalTo(dAtA []byte) (int, error) { +func (m *StaticHostUserDelete) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *CrownJewelDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *StaticHostUserDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -37633,7 +37122,7 @@ func (m *CrownJewelDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { copy(dAtA[i:], m.XXX_unrecognized) } { - size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -37643,7 +37132,7 @@ func (m *CrownJewelDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x2a { - size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -37653,7 +37142,7 @@ func (m *CrownJewelDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { i-- dAtA[i] = 0x22 { - size, err := m.UserMetadata.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -37685,7 +37174,7 @@ func (m *CrownJewelDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } -func (m *AutoUpdateAgentPlanCreate) Marshal() (dAtA []byte, err error) { +func (m *CrownJewelCreate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -37695,12 +37184,12 @@ func (m *AutoUpdateAgentPlanCreate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AutoUpdateAgentPlanCreate) MarshalTo(dAtA []byte) (int, error) { +func (m *CrownJewelCreate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AutoUpdateAgentPlanCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CrownJewelCreate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -37709,6 +37198,23 @@ func (m *AutoUpdateAgentPlanCreate) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.CrownJewelQuery) > 0 { + i -= len(m.CrownJewelQuery) + copy(dAtA[i:], m.CrownJewelQuery) + i = encodeVarintEvents(dAtA, i, uint64(len(m.CrownJewelQuery))) + i-- + dAtA[i] = 0x32 + } + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a { size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -37730,7 +37236,7 @@ func (m *AutoUpdateAgentPlanCreate) MarshalToSizedBuffer(dAtA []byte) (int, erro i-- dAtA[i] = 0x1a { - size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -37752,7 +37258,7 @@ func (m *AutoUpdateAgentPlanCreate) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *AutoUpdateAgentPlanUpdate) Marshal() (dAtA []byte, err error) { +func (m *CrownJewelUpdate) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -37762,12 +37268,12 @@ func (m *AutoUpdateAgentPlanUpdate) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AutoUpdateAgentPlanUpdate) MarshalTo(dAtA []byte) (int, error) { +func (m *CrownJewelUpdate) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AutoUpdateAgentPlanUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CrownJewelUpdate) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -37776,6 +37282,30 @@ func (m *AutoUpdateAgentPlanUpdate) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.UpdatedCrownJewelQuery) > 0 { + i -= len(m.UpdatedCrownJewelQuery) + copy(dAtA[i:], m.UpdatedCrownJewelQuery) + i = encodeVarintEvents(dAtA, i, uint64(len(m.UpdatedCrownJewelQuery))) + i-- + dAtA[i] = 0x3a + } + if len(m.CurrentCrownJewelQuery) > 0 { + i -= len(m.CurrentCrownJewelQuery) + copy(dAtA[i:], m.CurrentCrownJewelQuery) + i = encodeVarintEvents(dAtA, i, uint64(len(m.CurrentCrownJewelQuery))) + i-- + dAtA[i] = 0x32 + } + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a { size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -37819,7 +37349,7 @@ func (m *AutoUpdateAgentPlanUpdate) MarshalToSizedBuffer(dAtA []byte) (int, erro return len(dAtA) - i, nil } -func (m *AutoUpdateAgentPlanDelete) Marshal() (dAtA []byte, err error) { +func (m *CrownJewelDelete) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) n, err := m.MarshalToSizedBuffer(dAtA[:size]) @@ -37829,12 +37359,12 @@ func (m *AutoUpdateAgentPlanDelete) Marshal() (dAtA []byte, err error) { return dAtA[:n], nil } -func (m *AutoUpdateAgentPlanDelete) MarshalTo(dAtA []byte) (int, error) { +func (m *CrownJewelDelete) MarshalTo(dAtA []byte) (int, error) { size := m.Size() return m.MarshalToSizedBuffer(dAtA[:size]) } -func (m *AutoUpdateAgentPlanDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { +func (m *CrownJewelDelete) MarshalToSizedBuffer(dAtA []byte) (int, error) { i := len(dAtA) _ = i var l int @@ -37843,6 +37373,16 @@ func (m *AutoUpdateAgentPlanDelete) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + { + size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintEvents(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a { size, err := m.ConnectionMetadata.MarshalToSizedBuffer(dAtA[:i]) if err != nil { @@ -37864,7 +37404,7 @@ func (m *AutoUpdateAgentPlanDelete) MarshalToSizedBuffer(dAtA []byte) (int, erro i-- dAtA[i] = 0x1a { - size, err := m.ResourceMetadata.MarshalToSizedBuffer(dAtA[:i]) + size, err := m.Status.MarshalToSizedBuffer(dAtA[:i]) if err != nil { return 0, err } @@ -44227,42 +43767,6 @@ func (m *OneOf_CrownJewelDelete) Size() (n int) { } return n } -func (m *OneOf_AutoUpdateAgentPlanCreate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.AutoUpdateAgentPlanCreate != nil { - l = m.AutoUpdateAgentPlanCreate.Size() - n += 2 + l + sovEvents(uint64(l)) - } - return n -} -func (m *OneOf_AutoUpdateAgentPlanUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.AutoUpdateAgentPlanUpdate != nil { - l = m.AutoUpdateAgentPlanUpdate.Size() - n += 2 + l + sovEvents(uint64(l)) - } - return n -} -func (m *OneOf_AutoUpdateAgentPlanDelete) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - if m.AutoUpdateAgentPlanDelete != nil { - l = m.AutoUpdateAgentPlanDelete.Size() - n += 2 + l + sovEvents(uint64(l)) - } - return n -} func (m *OneOf_UserTaskCreate) Size() (n int) { if m == nil { return 0 @@ -46660,66 +46164,6 @@ func (m *CrownJewelDelete) Size() (n int) { return n } -func (m *AutoUpdateAgentPlanCreate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Metadata.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.ResourceMetadata.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.UserMetadata.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.ConnectionMetadata.Size() - n += 1 + l + sovEvents(uint64(l)) - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AutoUpdateAgentPlanUpdate) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Metadata.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.Status.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.UserMetadata.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.ConnectionMetadata.Size() - n += 1 + l + sovEvents(uint64(l)) - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - -func (m *AutoUpdateAgentPlanDelete) Size() (n int) { - if m == nil { - return 0 - } - var l int - _ = l - l = m.Metadata.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.ResourceMetadata.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.UserMetadata.Size() - n += 1 + l + sovEvents(uint64(l)) - l = m.ConnectionMetadata.Size() - n += 1 + l + sovEvents(uint64(l)) - if m.XXX_unrecognized != nil { - n += len(m.XXX_unrecognized) - } - return n -} - func (m *UserTaskCreate) Size() (n int) { if m == nil { return 0 @@ -84342,120 +83786,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &PluginCreate{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Event = &OneOf_PluginCreate{v} - iNdEx = postIndex - case 171: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PluginUpdate", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PluginUpdate{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Event = &OneOf_PluginUpdate{v} - iNdEx = postIndex - case 172: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field PluginDelete", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &PluginDelete{} - if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - m.Event = &OneOf_PluginDelete{v} - iNdEx = postIndex - case 173: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateConfigCreate", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - v := &AutoUpdateConfigCreate{} + v := &PluginCreate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_AutoUpdateConfigCreate{v} + m.Event = &OneOf_PluginCreate{v} iNdEx = postIndex - case 174: + case 171: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateConfigUpdate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PluginUpdate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84482,15 +83821,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &AutoUpdateConfigUpdate{} + v := &PluginUpdate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_AutoUpdateConfigUpdate{v} + m.Event = &OneOf_PluginUpdate{v} iNdEx = postIndex - case 175: + case 172: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateConfigDelete", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field PluginDelete", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84517,15 +83856,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &AutoUpdateConfigDelete{} + v := &PluginDelete{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_AutoUpdateConfigDelete{v} + m.Event = &OneOf_PluginDelete{v} iNdEx = postIndex - case 176: + case 173: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateVersionCreate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateConfigCreate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84552,15 +83891,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &AutoUpdateVersionCreate{} + v := &AutoUpdateConfigCreate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_AutoUpdateVersionCreate{v} + m.Event = &OneOf_AutoUpdateConfigCreate{v} iNdEx = postIndex - case 177: + case 174: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateVersionUpdate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateConfigUpdate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84587,15 +83926,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &AutoUpdateVersionUpdate{} + v := &AutoUpdateConfigUpdate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_AutoUpdateVersionUpdate{v} + m.Event = &OneOf_AutoUpdateConfigUpdate{v} iNdEx = postIndex - case 178: + case 175: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateVersionDelete", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateConfigDelete", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84622,15 +83961,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &AutoUpdateVersionDelete{} + v := &AutoUpdateConfigDelete{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_AutoUpdateVersionDelete{v} + m.Event = &OneOf_AutoUpdateConfigDelete{v} iNdEx = postIndex - case 179: + case 176: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StaticHostUserCreate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateVersionCreate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84657,15 +83996,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &StaticHostUserCreate{} + v := &AutoUpdateVersionCreate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_StaticHostUserCreate{v} + m.Event = &OneOf_AutoUpdateVersionCreate{v} iNdEx = postIndex - case 180: + case 177: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StaticHostUserUpdate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateVersionUpdate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84692,15 +84031,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &StaticHostUserUpdate{} + v := &AutoUpdateVersionUpdate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_StaticHostUserUpdate{v} + m.Event = &OneOf_AutoUpdateVersionUpdate{v} iNdEx = postIndex - case 181: + case 178: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field StaticHostUserDelete", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateVersionDelete", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84727,15 +84066,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &StaticHostUserDelete{} + v := &AutoUpdateVersionDelete{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_StaticHostUserDelete{v} + m.Event = &OneOf_AutoUpdateVersionDelete{v} iNdEx = postIndex - case 182: + case 179: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelCreate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StaticHostUserCreate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84762,15 +84101,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &CrownJewelCreate{} + v := &StaticHostUserCreate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_CrownJewelCreate{v} + m.Event = &OneOf_StaticHostUserCreate{v} iNdEx = postIndex - case 183: + case 180: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelUpdate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StaticHostUserUpdate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84797,15 +84136,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &CrownJewelUpdate{} + v := &StaticHostUserUpdate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_CrownJewelUpdate{v} + m.Event = &OneOf_StaticHostUserUpdate{v} iNdEx = postIndex - case 184: + case 181: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelDelete", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field StaticHostUserDelete", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84832,15 +84171,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &CrownJewelDelete{} + v := &StaticHostUserDelete{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_CrownJewelDelete{v} + m.Event = &OneOf_StaticHostUserDelete{v} iNdEx = postIndex - case 185: + case 182: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateAgentPlanCreate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelCreate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84867,15 +84206,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &AutoUpdateAgentPlanCreate{} + v := &CrownJewelCreate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_AutoUpdateAgentPlanCreate{v} + m.Event = &OneOf_CrownJewelCreate{v} iNdEx = postIndex - case 186: + case 183: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateAgentPlanUpdate", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelUpdate", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84902,15 +84241,15 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &AutoUpdateAgentPlanUpdate{} + v := &CrownJewelUpdate{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_AutoUpdateAgentPlanUpdate{v} + m.Event = &OneOf_CrownJewelUpdate{v} iNdEx = postIndex - case 187: + case 184: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AutoUpdateAgentPlanDelete", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelDelete", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -84937,11 +84276,11 @@ func (m *OneOf) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &AutoUpdateAgentPlanDelete{} + v := &CrownJewelDelete{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Event = &OneOf_AutoUpdateAgentPlanDelete{v} + m.Event = &OneOf_CrownJewelDelete{v} iNdEx = postIndex case 188: if wireType != 2 { @@ -100197,224 +99536,13 @@ func (m *SPIFFESVIDIssued) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.IPSANs = append(m.IPSANs, string(dAtA[iNdEx:postIndex])) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SVIDType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SVIDType = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 8: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SerialNumber", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.SerialNumber = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 9: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Hint", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Hint = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 10: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field JTI", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.JTI = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 11: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Audiences", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.Audiences = append(m.Audiences, string(dAtA[iNdEx:postIndex])) + m.IPSANs = append(m.IPSANs, string(dAtA[iNdEx:postIndex])) iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - 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 *AuthPreferenceUpdate) 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 ErrIntOverflowEvents - } - 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: AuthPreferenceUpdate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AuthPreferenceUpdate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 7: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SVIDType", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -100424,30 +99552,29 @@ func (m *AuthPreferenceUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.SVIDType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 2: + case 8: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SerialNumber", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -100457,30 +99584,29 @@ func (m *AuthPreferenceUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.SerialNumber = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 3: + case 9: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Hint", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -100490,30 +99616,29 @@ func (m *AuthPreferenceUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.Hint = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 4: + case 10: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field JTI", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -100523,30 +99648,29 @@ func (m *AuthPreferenceUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.JTI = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex - case 5: - if wireType != 0 { - return fmt.Errorf("proto: wrong wireType = %d for field AdminActionsMFA", wireType) + case 11: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Audiences", wireType) } - m.AdminActionsMFA = 0 + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -100556,11 +99680,24 @@ func (m *AuthPreferenceUpdate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - m.AdminActionsMFA |= AdminActionsMFAStatus(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } + intStringLen := int(stringLen) + if intStringLen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Audiences = append(m.Audiences, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -100583,7 +99720,7 @@ func (m *AuthPreferenceUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *ClusterNetworkingConfigUpdate) Unmarshal(dAtA []byte) error { +func (m *AuthPreferenceUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -100606,10 +99743,10 @@ func (m *ClusterNetworkingConfigUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: ClusterNetworkingConfigUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: AuthPreferenceUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: ClusterNetworkingConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AuthPreferenceUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -100744,6 +99881,25 @@ func (m *ClusterNetworkingConfigUpdate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field AdminActionsMFA", wireType) + } + m.AdminActionsMFA = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.AdminActionsMFA |= AdminActionsMFAStatus(b&0x7F) << shift + if b < 0x80 { + break + } + } default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -100766,7 +99922,7 @@ func (m *ClusterNetworkingConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *SessionRecordingConfigUpdate) Unmarshal(dAtA []byte) error { +func (m *ClusterNetworkingConfigUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -100789,10 +99945,10 @@ func (m *SessionRecordingConfigUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SessionRecordingConfigUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: ClusterNetworkingConfigUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SessionRecordingConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: ClusterNetworkingConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -100949,7 +100105,7 @@ func (m *SessionRecordingConfigUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { +func (m *SessionRecordingConfigUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -100972,10 +100128,10 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AccessPathChanged: wiretype end group for non-group") + return fmt.Errorf("proto: SessionRecordingConfigUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AccessPathChanged: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SessionRecordingConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101013,9 +100169,9 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ChangeID", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101025,29 +100181,30 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.ChangeID = string(dAtA[iNdEx:postIndex]) + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceName", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101057,29 +100214,30 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.AffectedResourceName = string(dAtA[iNdEx:postIndex]) + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceSource", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } - var stringLen uint64 + var msglen int for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101089,55 +100247,24 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - stringLen |= uint64(b&0x7F) << shift + msglen |= int(b&0x7F) << shift if b < 0x80 { break } } - intStringLen := int(stringLen) - if intStringLen < 0 { + if msglen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + intStringLen + postIndex := iNdEx + msglen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - m.AffectedResourceSource = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 5: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceType", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err } - m.AffectedResourceType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -101161,7 +100288,7 @@ func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { } return nil } -func (m *SpannerRPC) Unmarshal(dAtA []byte) error { +func (m *AccessPathChanged) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101184,10 +100311,10 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SpannerRPC: wiretype end group for non-group") + return fmt.Errorf("proto: AccessPathChanged: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SpannerRPC: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AccessPathChanged: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101225,9 +100352,9 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ChangeID", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101237,30 +100364,29 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.ChangeID = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceName", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101270,30 +100396,29 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.AffectedResourceName = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field DatabaseMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceSource", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -101303,61 +100428,27 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.DatabaseMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.AffectedResourceSource = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex case 5: 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 ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Procedure", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field AffectedResourceType", wireType) } var stringLen uint64 for shift := uint(0); ; shift += 7 { @@ -101385,43 +100476,7 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - m.Procedure = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if m.Args == nil { - m.Args = &Struct{} - } - if err := m.Args.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.AffectedResourceType = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -101445,7 +100500,7 @@ func (m *SpannerRPC) Unmarshal(dAtA []byte) error { } return nil } -func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { +func (m *SpannerRPC) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101468,10 +100523,10 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AccessGraphSettingsUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: SpannerRPC: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AccessGraphSettingsUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SpannerRPC: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101509,7 +100564,7 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101536,13 +100591,13 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SessionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101569,13 +100624,13 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.SessionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field DatabaseMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101602,7 +100657,108 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.DatabaseMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 5: + 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 ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Procedure", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Procedure = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Args", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.Args == nil { + m.Args = &Struct{} + } + if err := m.Args.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -101628,7 +100784,7 @@ func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { +func (m *AccessGraphSettingsUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101651,10 +100807,10 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SPIFFEFederationCreate: wiretype end group for non-group") + return fmt.Errorf("proto: AccessGraphSettingsUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SPIFFEFederationCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AccessGraphSettingsUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101692,7 +100848,7 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -101719,7 +100875,7 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -101811,7 +100967,7 @@ func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { +func (m *SPIFFEFederationCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -101834,10 +100990,10 @@ func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: SPIFFEFederationDelete: wiretype end group for non-group") + return fmt.Errorf("proto: SPIFFEFederationCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: SPIFFEFederationDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SPIFFEFederationCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -101994,7 +101150,7 @@ func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { +func (m *SPIFFEFederationDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102017,10 +101173,10 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateConfigCreate: wiretype end group for non-group") + return fmt.Errorf("proto: SPIFFEFederationDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateConfigCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: SPIFFEFederationDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102177,190 +101333,7 @@ func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateConfigUpdate) 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 ErrIntOverflowEvents - } - 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: AutoUpdateConfigUpdate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - 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 ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - 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 *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateConfigCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102383,10 +101356,10 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateConfigDelete: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateConfigCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateConfigCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102543,7 +101516,7 @@ func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateConfigUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102566,10 +101539,10 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionCreate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateConfigUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateConfigUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102607,7 +101580,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -102634,7 +101607,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -102726,7 +101699,7 @@ func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateConfigDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102749,10 +101722,10 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateConfigDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateConfigDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -102790,7 +101763,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -102817,7 +101790,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -102909,7 +101882,7 @@ func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -102932,10 +101905,10 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateVersionDelete: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateVersionDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103092,7 +102065,7 @@ func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103115,10 +102088,10 @@ func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserCreate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103183,44 +102156,11 @@ func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } @@ -103253,7 +102193,7 @@ func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } @@ -103308,7 +102248,7 @@ func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { +func (m *AutoUpdateVersionDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103331,10 +102271,10 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: AutoUpdateVersionDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: AutoUpdateVersionDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103371,39 +102311,6 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { } iNdEx = postIndex case 2: - 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 ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } @@ -103436,7 +102343,7 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 4: + case 3: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } @@ -103469,7 +102376,7 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 5: + case 4: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } @@ -103524,7 +102431,7 @@ func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103547,10 +102454,10 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: StaticHostUserDelete: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: StaticHostUserDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103740,7 +102647,7 @@ func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -103763,10 +102670,10 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelCreate: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelCreate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -103837,7 +102744,7 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103864,13 +102771,13 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103897,13 +102804,13 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -103930,42 +102837,10 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelQuery", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CrownJewelQuery = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -103988,7 +102863,7 @@ func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { +func (m *StaticHostUserDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104011,10 +102886,10 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: StaticHostUserDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: StaticHostUserDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104085,7 +102960,7 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104112,13 +102987,13 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104145,13 +103020,13 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex case 5: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104178,74 +103053,10 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 6: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field CurrentCrownJewelQuery", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.CurrentCrownJewelQuery = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex - case 7: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UpdatedCrownJewelQuery", wireType) - } - var stringLen uint64 - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - 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 ErrInvalidLengthEvents - } - postIndex := iNdEx + intStringLen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - m.UpdatedCrownJewelQuery = string(dAtA[iNdEx:postIndex]) - iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -104268,7 +103079,7 @@ func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { +func (m *CrownJewelCreate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104291,10 +103102,10 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: CrownJewelDelete: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelCreate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: CrownJewelDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelCreate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104326,79 +103137,13 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 2: - 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 ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 4: + case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104425,13 +103170,13 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 5: + case 3: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104458,64 +103203,13 @@ func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - default: - iNdEx = preIndex - skippy, err := skipEvents(dAtA[iNdEx:]) - if err != nil { - return err - } - if (skippy < 0) || (iNdEx+skippy) < 0 { - return ErrInvalidLengthEvents - } - 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 *AutoUpdateAgentPlanCreate) 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 ErrIntOverflowEvents - } - 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: AutoUpdateAgentPlanCreate: wiretype end group for non-group") - } - if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateAgentPlanCreate: illegal tag %d (wire type %d)", fieldNum, wire) - } - switch fieldNum { - case 1: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Metadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104542,11 +103236,11 @@ func (m *AutoUpdateAgentPlanCreate) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.Metadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex - case 2: + case 5: if wireType != 2 { return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) } @@ -104579,44 +103273,11 @@ func (m *AutoUpdateAgentPlanCreate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex - case 3: - if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field UserMetadata", wireType) - } - var msglen int - for shift := uint(0); ; shift += 7 { - if shift >= 64 { - return ErrIntOverflowEvents - } - if iNdEx >= l { - return io.ErrUnexpectedEOF - } - b := dAtA[iNdEx] - iNdEx++ - msglen |= int(b&0x7F) << shift - if b < 0x80 { - break - } - } - if msglen < 0 { - return ErrInvalidLengthEvents - } - postIndex := iNdEx + msglen - if postIndex < 0 { - return ErrInvalidLengthEvents - } - if postIndex > l { - return io.ErrUnexpectedEOF - } - if err := m.UserMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } - iNdEx = postIndex - case 4: + case 6: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ConnectionMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field CrownJewelQuery", wireType) } - var msglen int + var stringLen uint64 for shift := uint(0); ; shift += 7 { if shift >= 64 { return ErrIntOverflowEvents @@ -104626,24 +103287,23 @@ func (m *AutoUpdateAgentPlanCreate) Unmarshal(dAtA []byte) error { } b := dAtA[iNdEx] iNdEx++ - msglen |= int(b&0x7F) << shift + stringLen |= uint64(b&0x7F) << shift if b < 0x80 { break } } - if msglen < 0 { + intStringLen := int(stringLen) + if intStringLen < 0 { return ErrInvalidLengthEvents } - postIndex := iNdEx + msglen + postIndex := iNdEx + intStringLen if postIndex < 0 { return ErrInvalidLengthEvents } if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ConnectionMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { - return err - } + m.CrownJewelQuery = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex default: iNdEx = preIndex @@ -104667,7 +103327,7 @@ func (m *AutoUpdateAgentPlanCreate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateAgentPlanUpdate) Unmarshal(dAtA []byte) error { +func (m *CrownJewelUpdate) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104690,10 +103350,10 @@ func (m *AutoUpdateAgentPlanUpdate) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateAgentPlanUpdate: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelUpdate: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateAgentPlanUpdate: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelUpdate: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104828,6 +103488,103 @@ func (m *AutoUpdateAgentPlanUpdate) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field CurrentCrownJewelQuery", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.CurrentCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field UpdatedCrownJewelQuery", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + 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 ErrInvalidLengthEvents + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.UpdatedCrownJewelQuery = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) @@ -104850,7 +103607,7 @@ func (m *AutoUpdateAgentPlanUpdate) Unmarshal(dAtA []byte) error { } return nil } -func (m *AutoUpdateAgentPlanDelete) Unmarshal(dAtA []byte) error { +func (m *CrownJewelDelete) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 for iNdEx < l { @@ -104873,10 +103630,10 @@ func (m *AutoUpdateAgentPlanDelete) Unmarshal(dAtA []byte) error { fieldNum := int32(wire >> 3) wireType := int(wire & 0x7) if wireType == 4 { - return fmt.Errorf("proto: AutoUpdateAgentPlanDelete: wiretype end group for non-group") + return fmt.Errorf("proto: CrownJewelDelete: wiretype end group for non-group") } if fieldNum <= 0 { - return fmt.Errorf("proto: AutoUpdateAgentPlanDelete: illegal tag %d (wire type %d)", fieldNum, wire) + return fmt.Errorf("proto: CrownJewelDelete: illegal tag %d (wire type %d)", fieldNum, wire) } switch fieldNum { case 1: @@ -104914,7 +103671,7 @@ func (m *AutoUpdateAgentPlanDelete) Unmarshal(dAtA []byte) error { iNdEx = postIndex case 2: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field Status", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -104941,7 +103698,7 @@ func (m *AutoUpdateAgentPlanDelete) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + if err := m.Status.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } iNdEx = postIndex @@ -105011,6 +103768,39 @@ func (m *AutoUpdateAgentPlanDelete) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field ResourceMetadata", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowEvents + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthEvents + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthEvents + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if err := m.ResourceMetadata.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipEvents(dAtA[iNdEx:]) diff --git a/lib/auth/autoupdate/autoupdatev1/service_test.go b/lib/auth/autoupdate/autoupdatev1/service_test.go index 840fd9bbf94cd..24acfbf575eea 100644 --- a/lib/auth/autoupdate/autoupdatev1/service_test.go +++ b/lib/auth/autoupdate/autoupdatev1/service_test.go @@ -210,9 +210,21 @@ func TestServiceAccess(t *testing.T) { }) } + // TODO(hugoShaka): remove this as we implement the service for the autoupdate agent rollout resource + notImplementedYetRPCs := []string{ + "GetAutoUpdateAgentRollout", + "CreateAutoUpdateAgentRollout", + "UpdateAutoUpdateAgentRollout", + "UpsertAutoUpdateAgentRollout", + "DeleteAutoUpdateAgentRollout", + } + // verify that all declared methods have matching test cases t.Run("verify coverage", func(t *testing.T) { for _, method := range autoupdate.AutoUpdateService_ServiceDesc.Methods { + if slices.Contains(notImplementedYetRPCs, method.MethodName) { + continue + } t.Run(method.MethodName, func(t *testing.T) { match := false for _, testCase := range testCases { From eef6f75f6ed4fa6cac30af55245986dda6d81e5c Mon Sep 17 00:00:00 2001 From: Yassine Bounekhla <56373201+rudream@users.noreply.github.com> Date: Mon, 21 Oct 2024 16:35:18 -0400 Subject: [PATCH 02/70] fix error when searching while on non-sidenav section (#47772) --- web/packages/teleport/src/Navigation/SideNavigation/Search.tsx | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/web/packages/teleport/src/Navigation/SideNavigation/Search.tsx b/web/packages/teleport/src/Navigation/SideNavigation/Search.tsx index f060b6fea3449..9ca0c39aab873 100644 --- a/web/packages/teleport/src/Navigation/SideNavigation/Search.tsx +++ b/web/packages/teleport/src/Navigation/SideNavigation/Search.tsx @@ -123,7 +123,7 @@ function SearchContent({ ))} From eab1b6516b04a8944942fa038baf778d8aba3a64 Mon Sep 17 00:00:00 2001 From: Gus Luxton Date: Mon, 21 Oct 2024 17:37:47 -0300 Subject: [PATCH 03/70] docs: Fix username attribute transformation in Azure AD guide (#47717) * docs: Fix username attribute transformation in Azure AD guide * Value -> Transformation --- docs/img/azuread/azuread-8c-usernameclaim.png | Bin 221189 -> 163647 bytes .../access-controls/sso/azuread.mdx | 10 +++++++--- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/docs/img/azuread/azuread-8c-usernameclaim.png b/docs/img/azuread/azuread-8c-usernameclaim.png index c4522140a05e5ec6f55e607f03367c8be91d8305..884df14c9eca109e19a225b521da4da480a8c380 100644 GIT binary patch literal 163647 zcmagG1zc2H_diT2EhQ!0N(~{+(B0kLh~yAMgLESyT_Vz5(h}0GbW3*+F~mFG``mn< z|NDc(XZDs3=KeqP;+agM-7Am61?`gL~=?2ls>y?nv7_JL$A zswfHvR~?6bXZi&8ozh%JO%V>xiyjUxAQ%qr7IrIO2M*4S4GwP41P+cr6%LNjDYIEs z5ca^qQb*QGQ4x+2Rz`tCfX9VHgq7f7zi?r;a7e$E;ox8`!G4euLgA2MpSZ9;gIxH( z-pob#&$_HP|P{9qvUZ*TC!%D-*{s40JY#nlc-t)r+y zDemZENy*L1#>z%5ghok8Dd=Kh#jhqI^`GjnZ$N4rS63%~0Kmh;gVlqR)zQToz|P0V z2Vmm>aB#4|-e3WFI=GsGSsXw#zc=znI}(;4a~E4DS6fF1%3tl8nmM|;0;#Egb@b=Y z@8h%t+y2#)1L!}~f=v+c>j{9Jl@0K}s=3-){XeSxdh&a<-{$pucY?nf;}>^)>*%8H zWNL0H#4h+-`+vXn*WiACTg4V^`BqoL)*iM7u!#tUQ zRp_r({7>b-Km2#a-x}8WTc6xqe1GrrZ;$>~_1Bd7m0fIM-I@NP`LEgi*S-I|F9`Ux zAb(q+-&g;)yRhXKLK6i1$x1?KQLU#i))#@3l@Qec!yjZJXHH2FegiO5wp}$}JVVfm zL<|3@R=^r%g7_S#U{>T*T|}}vAU9wV>EL2XUfa1Zc0aOwiS$cFHqy*{NYU};#~<2;%N9~}!d8Q@V*Xdn03@|YxNq4> z)MMuffAs(91%lKnI~n)FQNi38-5-PcCb7Xk-^h!eM$L(owU}?=1_dpP}BX_H2$pY zWQdbH3o=|%GQ#*{L?Q;LL^yqZnS~q&JexY{Zr)98m=%ft9Or+CD&hjGooMjMll(uU zr3}=N{))nH6@l(lxzMP-^yGhbDuOWc1UAo^Z}uCKe=ZL#7ko=mklT5u=OHwqnc{8E z|EB9A(o4vf2&arcp00+{ugZTpts7&#T^wHppZ9?jZ#&}8byh=!Z~SWB zLsqMRIrCNM&o%mUG_Zof3al%Gm8%qO=|5<`8Wf=4U#)#vKV}FRZ-%UY`G2fNge0s# zv-cJPGr+($2EgESK4ArPAL9a{uY#Yo^1Q zxSHLl_-akn6j69|{^Y!tRJ%sr4!_?QBS0L=Do6I|BH^*jJnI&HCpDovr2z1^phI@ z&-cC@sAK6qio$}PjT>Y{&W1`z?ho#j8uvD(Pe466eYC!hith%-J~ePbM|VM(_xCbt zIgG0iYst(H&T=QHKPZ#d(jGT+zLR6!yxnvzzFX6Z;Po*&4jT_TbS_l_m*pgc_za=y+Fa8l|U|hl=2xb|I<2;_eP8{*3cSfieNVG zPxjuh^OTR@j6CSh7a}?seCF6MJ)X`x$0a+m2r>)X3vKSJR6lm$MGA3 --tfHqjGFb{Y6uAbzx2kauB=XTtKbQc* z!)KX=6>?YsZIggb!*57G^thal8$t_e`@55CTcUg&%+>B@%B?rj1VGTTluUs!!{(0+ z`)m^)Z6wRnVa4)F8t1OY07HS4#)xr=LlImqZWYC^W(mCh)2=R6{x`Jz@`JC3tUCvQ z?0pK>L$6vkcU#hGfO4(13|sY``-PA~0gLW>LJ^M7@-*8O5xi6AmPrJAj_@s=c3T6* zP*>H{%-sU@kxa;v*V3K4k}5#q?U5nH~n#$z+CGWkh%{pD3X4l(g7RaMnkMmqTqNgS4~ zAa{+er>L}e@Zng#&=uvX5B|w;7hO>RI(0zBZ zOml1hc~t#gc$e~vXFI(;Bfi(7;WNrfgp6=(95&)go^{q!O(Zty#9_C(6*;a0x7Y%ojP__-<<;ag&1hlSS$=A>}nxuCo8-S$@l zyav@|2^TB(Sa-_uR>P>d|Elp9HC@_d7dc_nY^yMO2pA7K{FHkj z++iQgBe)qNpL-AScvdUSx=wcoH)B`i)JPT=LFu!+Dk5aqF%%=l)vLHPq&qS)M| zto-Iuv&)#SZ_bii73KsAw@iq|xy8C>zx18eR)1<8c~6Ud2TteClhJM4*yNHeFNBNX$jYWU(6d*|L2;hGk z;?XHF`W1R6pVREAiIQLw5PpdT2*ApCo^-?s*=@#_>#b*{ZX_6?y^32XZqrw35o^z| z5KU15+FG2@Yz(P?ztT-ypaWUPQwR`V@vd3Ko;LJsY)0>X#~tbJ`|f$d?K%?ISlXC( zzK?BB-+@};xt0HI^C&_0LVv^~Zq62!p`Qd%AXm(sN@3X;IyTUq=spy?PUy<_#c!ga zsIK@08U3hVY#L)2{Pj=8z4ptq9Z<)W3B0ILa50JU9!Mn9t6o%yI9F(^-NM_qc2S=` zDrq=NRLICn;mi{Cz3=_t{vw9WanJrlwtQ;lTcBm5P}ouQ?e^S!lO_1OnAdrK+R)@f z>5>^evT8VLXCnzAw(+P^KO(!=jdK)y#p!;P8NUYQJlhOWid`{Dx}?$lX6~gR^~RXC zsbu}jFzzL8g%I>T0cdWScSW7XAO$cmBBFQO`Y5HENm<9Yo0fj|tIs8gW2tvbB{T^x zXd7WAh^(HwOA+i!b^ba zah15!)2LaX(x)=J)OHWC6Lnjr=*BFvA?Q+9BsL*si}blSE2q!cQ|`gzbAjyi?2sNJ zPAWYU42lkZdJlC9E-l~Mhfhhv$wq$r1VB{HgDe&`Ezg)$p07l~Nf|~(HoE#I8b|&SRzw%@}h@HyMo| zoE`qcu8j2d9gF#GKUIua9iOHZw7xtv;yB4f)%J9rE6tM%@mc?}R>VRuaKNiJC!{lQJ_s>sA@{Al*2Cv08 zYx}oZ&?6^4XdMHYLh>m%J!TT!y!pFE+wUSR#*TzvA6%{YW|aA^4Tlg-Sx^4&Tbf+B)ey!7AvC^F@4!U*`)_V4YVX_urq%XqRtt8nhr#Hqq{xay?>ht)? zsBfrWRNoq_BpPD}L}zIl(bzQZ*ZICl5QsBLz)GATYhR{mjGm>>lWXm)_8=H5!)xha zg9h+vP+m~Ja&5?%92`eRA5?GLp2m}KlRiY*DYq`AT97kqEsu==^3b%#V0I%w*-@h- zny|y-7FgJOVqf$4LvrLzJnoo-T#A+jZ#c&No(0eI74@V(T%Nzec~$G?uo#5jGB!A?6=JEjK&{5>&3}{Ateu+49qP@d zt+?Ua@bgP+5&encEZJh^c>^tXYHslLc`U9YTf~h_OlATVt)9VGx9Mwe2JFa;p~)be ze7DrXh%qK3oJ}$NC=)~Kl|XRc_lk;Uw)3qfAGMtF9eLq+DJ4sf;smSvE--Lue-nVq&g+sipRq*^5iya6yxz5ecVf zPW<_`S)@B=3rt#2YH7WSSB=7^NyneOLW3-m) zcfjJh8%;g#xcBVxc)lFQR<^?BRd}n|M2#&h-N;-fX?OLh{T^HfZKeo}ZaRWg-OpY@ zH)!aHW*8GxrRranRbu@VLLxEWx;kDS^N_tB;k)ptwLTQQeG(=hG*?lH>~>04dN!d& z#)!GHw7Vw|?Zb7woVV!2zVZY*i#4&la2&BKZIFV^VyZ|lC7Yv*?BnGZtI_rB;8fp5 zE}uiUUVGGri?s;|cB8u-vzwXs^Qh)DAnCOe#N%yjG*=`!)n#4ulY)_)k)5E!a+O;? z>%5p4TE2AvV9^PARmb5y&D>!v_0bzeyl$1oX>$-?eh0OExj-SV!C}EFi&y>wvs$?x zmt6)^AP%oLHyaMAm~-WFo8{!jz+{2E_CPATyU_I4(SE&u*+m12l(&})68ucKle=wHEYeu-Ua3E6{G9}avteo$Vq2D^TppQ~_AN#KVA2BKYMuYI&Fw!r$E z_iyfcK;x>Y-=uQ6#|kPND8b%PhhEEJuI;bDj8DDj;AQ50@_Q>c9=dnS9A+)U5rXBC z;B~Sfb2b98>#(&JPmzd=m6GxBllboAr>zSnD`9%A&@k}UGsPk0snO)KJK;e$g!7=xeqxK-|!@($% zMU|a*ih1Q~E6DPPd*csB25or2Bk=+6>o_MC@WPZm=Yvo|2%7psUwy>pvpq%2mbG$! z1zgh_Q0X9_iI{nwQf(xAp2=z!TyEVfaZUT4OJGQJ;1!}{!#du~o7cyJC8 zXHy{d89i0#zz~&V2OSPh#*=~mbu(-iY@=a^#(5;Pq(*fk>>}%f_8Q&S;u~luN#|dG z1QBA!>ep(A7^_gsZrWAyk&Kb6H^$02*$0!Whtjp`MUMyBgAMRC^I9p3if&k=_(s=X z$#TcCYqhCJ=~lD`pEU3XBL!1%SOxRFr4fu}50(^rz=t*s3)S}cemk`x!Rz{5E-sf^ zt)DydPPR*`!n)D3;DAHPlT*|LUE(0EfZo>Bu^3x+nR(pLTVOekKn^v|$cRE4Rvo~VEdoCCPI9@8b6sjZ{IRY!#C+J+jc;W z5Z`VPmLr=_Ar3Ci*k|_W97r|FCUz+0gIDdB=%&vxE1EkTI->Y4!+t`W!Nr&#lMD|6 z156vWl51_Nt%JP$=1a&{gZI0x1|4>Ida^C$TpKeQt5=K|^7b+1t=|VR*1hb>=J5y8 z0>*$v#x*);8nXM6v9Ij%L7t*J98XU%&Bjg&q=AvZqATIe0W>Pqj>ERStqE#@)>KM* zQ|7o*sw8Sbl9*ys`I6EO1|vIcme_pKLvH4*IgJVV;M+U1OXmm;|H?(Zmu+ZNgy+nB zjP&27%Jmxi_ohlO=BR0CEW2+n)uy7Z5Rpn>B{Jv&OAT8Zm<^kM%tPvH>}FVXYrX0Z zgsY4pM-dPSCatnBNorJiFJ8ZWxjXso;XAIU*ux#?=XTOTNy$MxR3uS~YPlfo9q%WXCOkA7{2tvc+YIwf9i`?5!Zo<8LMM~i%- zGEBiwqh?8|o}fLCf5Bz9S7pNIvJt=H4^MbeZlYC(Of;R|%b+NbSJGdb#CJ4u*g>BZ;LkipupH2f2M39Ptc56`4&JoLVIs zvYW&jh8z~*HyJ-jgEo6HNj3uZ@R(`s!xz;%+P^NmIa+MGP3v^FUuZ~v_XK_SVg2z* z^pe-U{X1)vnR@q;7x!5`D`NPJTJcsR>FBKq(QAALE$%VQ#tjNz5oe6@r4)0U-z8fLs8L7-SXbxDLXCst>Lr+u^Tj(G2qqpy^%K% z$K&rl$aoP!)M#>`9K~Guf;xO7c8)oMgJ3{p^<$i1Kv1hD?0{w)GZUfxL=ADUDg^E7itx7gb*z+%EB^GN(!n3W;q3huBKpRY z;3ucm1Bmvv5kV|#=>*8R9^baO!XJB6u3t3jA2gnHy~?xii@${jAfe3M8nELlSJ2;1 zM$YGn+E2Bc?;OHl3x@CRv%emB9m+n+a*{GaLS}|@sX)O-zR+gs>=V;9(ed8x-W4lileYJJ$p(C4+! zUCvUCyq)p+LFtqpBJzB`2~;>$9!CD=r}lwvi+j1x?SPDKjYWi8rZ?T|*BZ;j91_Z( z7Oq5*c5e=9wI;qRd!#^*T9ovT{Msq^ zRb)Ns?E~}-7C8CFc%{W=x213+!R}5%zk7Js8%x6Av8=1FU3-Q9v2WqHm4-$CwTF}M zY9Mkw?{kbRY=pjCQAFS6ZkP{d;C$>VK@y#CaAEHoW25MG^*Ise7H6@3Wwz$w$yzsu zgmWrz!JAh+90#n$q+Rir%v!5An%F#o@}+*$n|i^Uo^?IS*KQ?R#UPQ+ zGDXSx@$6XOB{8SfPTVWwS_t4i>)chbamBBt*op;q2s(QDezmKXpe=o;C)!>NU)fPn zIcF5>rkuIr3AIn-zx4LdWVyf~;Z`__{{9cYA0;1ZG%-*whZVaMSqy7${n1u!@F!18 z>euCTS;f|vXeU8;@pd#K7uuewiV^+&ZnpQBcE!tYvp>63(SA0a#0}+{3L2o)GQoY$ z=M{@pM0w(VX1Po+PqjCTd487q38Y*_O_(4oUUML6C|hW|a} zX+gKWrYR&kb+Zz95T;GoRY0}!RP5m^;uFjMfu9W`m6nbB=@X-Z_);hYHY+gakLtig zD{6bx2pW853A2l;6hIwiSn+vv-@=JKMv2gbAqN>RzPMh~H%sG1{euVH^ z41=pas4SzB!kP@9ha?d4zjN-iZn-lg~-UV{b>A_LZMEYawX7! zOjQ(7f!wAkg__DFW?eP!p0Dz7kdYZ<`IUA6uOO;IVLS9lpq5dyL@T*w5bs;gh*mar zdoVdE7JRYy)zR7cSO-|Jk`K8j3ecXqgH1au#LPaYUj}yGov$x#)A44y!SzxhHj)5z zTqK;4GO}ovXgHI0xNOSpF7Dz;r}-jMixrM$9Y~VTtc{GXr&(K^{*)xY%IIqMz3uNr zMBc3Kqu`O0ZEp3tjKn2>>baRdd4)|b56s>@($-Nxp$&h@i=2&U3=6Sn*?w zx1Fmgs4U^|oTLpKUoYiAnt%yFaM`=Oc%-KjLvegx;0+c}z|kx17$!$pQ_~dx*?YBAy(R~( za<{TLybVE14mDRS0;rRx(6!dZr=TwoX?0*CB-s|(k!A=_?X_$n9;^mhL1lNrz{RZ4(A1wZfem4Hn|njA1>D8w48OIY<9qSd~nAq z3mv#z;YQ7~0prC1N@Xyl@#J82?zPw#II9_+uo0?ha->-ZeqjEJByPIVn^C$c=re3Wk3G6(EJVgKn!*S*y+~l{dFZR(Gq~PSP zu5GYn8plu6QiBSyegdPo&ZGU zl^eBr57h#_d-rB!E)^D@SbLK=xA}W4xixO>Kq6lmx3_*He3w#)9Su28cMGp~$V0Yw zJAQ~hlkt+BulI-*zpi*Z_OIMm0e{9+mZ!N8yxlQB>)=^V3e&H5(GVBtmzMhHX4;^I zTYLJ5h0)m;Yy-*>)(IxRV3HK{jyEC3vrj#F%fT*}-40C2)W&1zX9++pRn~tVi?23> zIkCb`zYConDg_G3Va$C5af*~(+xHRQ=+H$8T}myU9jyBFPXvwIqh9WGB3(s+GL2sD z9B0IwL0g#n9;6uK#&X`gD_$8xE+`ue!K*maX@!c2+P-!#d~nq=0-$&VsmM4MvGIT? zn5Y^JhDLtc^w$S|noAa1WCSc{X)AvQUVVo*G%rGPd#=p{870^)cVS#C>q4a(CO%`N zM8>Ayy)A;CFFQ(G<~ASO{n()FAqk!oy*vSq=QOEo^! zx|QssQm8@1J(-vH1dgvGKcg}pSZ0;qq_K2d@{}u_sfv{`IFZ3y&iB~)IP@_Pnzf{k z-(eZZAt~N@!AwcKSOS^bc zs&YhNL#m*|_$0R3dia^AY>eTM#sfDvbQaUnP&2%%opDhcXX+?!kOs+JA8ws`&-1q( zPStLbDVqH`ox<^Z-UjxA^ImVFi%Nv%xxEoRFF-J!o0PY*LO8<*7Q!IEdcX2)9qz5f zxtN-`XGneK^8$awk|G~Y|Cdw(bfxlH0vCrXrd*u6#lL9gQa9>;wrRC5EF3HITLjk&ny2kk`_gSs@eCsM) zlxR_no3$_sI&a9%N;S+8P%v7~A_Ug25GqH*p1RY)+cOw@6Z+bbaK7@JT>x zL2Ceq)o{@_s*UGoRy0!4KgM1`8nMt5h1$Fa03CNfi(=!$P_R-3JT9&mKgp^$J+@0} zk!@6oIWT&&e!N~5#uGD}s}bHj?IW)posilj+Z(4^oPTEVQF z;Id`&XAAnglih(2mca2Ic8zcJjE%Pwn4D##tkYAbqmEX0tj)-Ll6p-%(;WV6WOM&n zntPJbDx3a!^IbXg9Nooy^>7uwVL;U16hs>zdsh~|U90i-{;OQx%SzHrs?Q6H; z2HlUORE_cI*5QNta6wgwr{-cA)co6nJDYt^D2Tc?L@WZ+xQEpU=N~$IR$VW*t`pU- zcGVVBCp@zGn-gkZTJUHJGH1L(g{;Ce`TX8@4M%gx|LeWB?247fz(O z1gTC$i+DEz0(LgrKf`nZyu!4}LN`H%%3?Or%EfhEC$W{`bL(vB4Z_<}Yg^m%O@}Pk zC0ZjMBi=yB!gpV;8Osm6{$lOokOy-z)9iQw)Wi`s!8icpX^G<0bp)G@`H!<5o-~1F zQs6)^M~kTo!C1E$-B)rx5FddusNBj{c)ARE@cHF0EBL4cG6m|tB2g;2V{hSdjP~tc zH*frL$4uLs8gV@Pku~pZHQ11U@r780so=XS}-ZbBXi!jUi!Y`sL#^2v{Iq~us~Sva+7+TpquWcFYKMT^fA-Gg1CWMQpkm-wVV+5>ZDYp&B>$jEr z>Be(bb)*nJAHGR6kLWpFTU+BNd^#G2bnqSrN9&q)Bkg8y2vA;;%Zi(eZ1xMwp@*4R z+aLIDT&Jr1Q3B9L1{c_qm57u$f5IWAL~ahfItGOUv1?CGEmDIWKe}L1ArW9CUiZaO zG|~@sK#%nMOaZU3kXpurvQFy2;+~I!3;ALB6~5+>gE@#|AmKY4uiD-XRD& zBn+{g#tIQL>D3kKCMUIrY5!R1a1TngCiJetTBdV2CV{dqPoKV}SxjHT{)lQ z5W};gF*X>a#V)wInzuC~CN7@LFr>m17Tcl-b#7d74x_usB{kbJj}yj`KiDl7yCcp+ zzC1ag>cH&ECKmVwzo)IR1j0zUTgu>uiU?)F8fE6 z#trdFC|@vfizzPFHownS!hwLNY-DlcS0LR+14YobMKNwfY{{ot6i*8YW?BRfeae}4 z=9CwAcVN^k62$wLm4XF}iSb8vLEA(^?%lvnU?}0hGkgd#)$s87?+QPP`O!8t6%0i~ zye!qr1|Kz6fk!yS36k8-{YncG!|+VIBhEH9cgTLoRwpHVss01=vo-wvjhteavW>51 zgR!>~n`jKFhP(X8n3!2inn{2)D)k5|{)?*CTctJV6CC9IUbY7+VWMF1ACh3Ma7iNc zn7oJ1ht18@7XobU$tvdgsQK1=*Lq&f6h#y{?1bx7w^4R;pZyTeEhES&fT;MDr7OzO zjzrQE$SwVrw^1vmu<+%icp<=!3g49YaBE*+^Kky454l-rYpv@n0@uBPqNS+MW@DVG zsA9%|M6h9TJ+0+%D>>6m@ZO#J>V2X677%C8VbmO`aYjHtu>5r{5Z?{>1Ne}0Th8yM zI#{AoYpXHK-MZ;8oI#jBmt!ylQ&Jmx$TLBEb;XmF#{Ryy_=B}wLb`j9Thvc+U$#0P zmtQ{KoySQWMkW}xxHG=DZh^6N%sRtIN&2P78t4*+8!CfD>=-MBZP z=)>8j?lStDn)Cd)Tc9*d@eeMpUC3~3r()8o7$+xfT=vSK`#igk)aE}zum~p9oR!Gyayxi|2V4-rI z{gzErqP%HN_R4EfcE@8}ycQncex+eV^?0I>Jc{lj6-_aN``6KO)Nk*~X^m zV6jR4xF*i{sCkk8ABOQKdJ{q)tx6-7Qtk3ds$~UFwH)DiNEYXDAnE&lw-X2#eNW<~ zQ|zD|rCj)pR}_HikiNGX8ziVJOE*v3L)l6jD*E~>Z9bq|fdrhHb;pl|cO znpi7rzlZ3TX23|F5Qz`$_+qMAQ=ZB1CKrkYm0?in+W?D|fvat>j6Fy^&v?b388wm8 zq~@|ppan~i@c3oolMgP179OG#vhwbkt1apK;ez=^G0xm$j!^A3s86j?EJMcMo(Rdw ziFY_Zw&}{PbiemC**VCHD%~Q$7>%q;wwDkuUWv)NR2-0Y4wMk_gMPw zPy3Tj$tRyZ;F1Vp9*SWik@$oG4Fz7X81QlnB+)P=;&@jn{?m+0qJ=Zq=A2M{9MJe8E|bA;?vnV?{Xw!ZE^ej3*mXiADwEG4U88oj8K66+OCh1V4AU)lXiiq;W)0_N!$@;@A;mdX{&|+u& zinJ?+575J;faYBj#9A5WbF=<|W@34(-4}Y00beP8Ap7QgYvA4a({5l7?PD-1UP1Di z5Qs#O+lYcqgg?{++mYPx$oyad+hwaux+u-dhF=pgK&9|f}>Wh2)tv9Su!#% z0ek70)~Q9m?B)nA^ubdguHy_5`5Ax7_4?a0$+Vyc=&^9^3%gx=1DQ%O=)^zWt2!u@ zt|Wq9louuuhb9~km!t|FLB3SKZ5=0U8)M+FcsPr?h93u!;1defo54^XCYw!97t*ho zFvxWi^vK(F884C4cmBfGr}@*n#YFA6qQ&(n24*ybryU$lmzUl> zEI0;o6K{LLOozk}bV9v8Drpt(;dF@*qFcphC-{!c%o`_l&{y}Ygv(iy*TIyqkVk{Co}h(Khdk#{I* z$P9PFJk8K|z9q{}m&aj`kqa!(kVQ{-m=n?Cc+T9Onh>w6=3msS$93A?VPE)?ZE|{& zH=C%JQ$f4Kli-s>p&`q_t^95)v3}r-!H~bB*2X7i!K2Y_MnIn@z8TYO%$Qi!3f0Oz z$rLqz8TuK>P(!u{muC3mG3V1UqYWI;Ca3c0s9V{4@fRs$j5q5Qj`3h>I(IZfY!JeYj0c$;?7NoQ2r5%au7`WD9nO`7`q@ZD5G*K6A9%W0-d7?0ORW z`B!vky((B84oqvYdjTub~t zHw6y$lNN&1?CyMd2HgQsp!M+1#BI&6yPT2vYUOZ&1;F#jf+nC9n{lek%@lU}o&^RQ z00^_9J)ZF?qZRk;7k6GWe+q5cXo=I+aL6Em?RCs(d7_+m15On23qx@<;%sg=p@;HO zA6Up{9Imu%r}*88Sfni%o(dWs7y)6LpfvM)i=gzA`k897Y@1Tm7I(h+5}oRg<|H=? z2Y5drStqU4-V^~(ke(_-cDVwFzY8UWgog6F$B^($S7$vZdH)^<^$oYqQC?wGzzl{M zn)~kLRJHf^C|Rt%Kgo?|5f{q)Udn#Y^Vj;V;Oe&v1T=e8NV$#JW}n-V4CtrsLE9^+ z8!y&WtsCFdNcXEICk`emrm`)olBO(5$09a~{sU9{O5tnbxOp>DATk0r62%XB+x*$Y zNsoYShCiiVpai{2osDXo!G@jsm=gUV^|lslHZopKR4@OHvS5eAHo~S^H#DF)~Ytiu1J6f?TcDh`m0wI=%9T ziF_&4*hZ2D2Bl2Oa(&=iz%v`Nh{MBBA8ryJ3Ga_EA*04>)M~SG=mFF@T0=hWsB9Zi z$`Lx;;XGr%KkdVn)~z=CMz-+4O}TSSSUmgew3u87Avi@Dp{S-J!8RrTIgnmTHd&lbOzLwsUr?B0p0H ze;JJvdc)mB`zJYIg+LAQuPNi^tkkJUIX_PI+Nt{fo`57Gf;8WV6}7p9J)I{m(w8nr zMMb4nYo#c?Qxl50Cx19!Pv?7!Q3F1uR_BsU`4u|I+=q4deVHGnv;h`F$PvThCm>%| z?Tw>2h7H}rkysF1^_AuL@bUr#iE#%MC>4Np1=gs`Kx@GI0 zf6NOmq^l#CP^vznNQKGw!4=DI^D9(>27c)`iEer0?WY9ra8et)(jDrOxF ztF6Rrp7oj-4R`+mpXuoN_-c%HAtY;F-+p^EtH$ck7+1#cf#KyP74P=lhs- zyU)!9$nJ_(qRsE#7~g|e5+s=N4nhh>HF=-TjEBZ0cm2$Tm?8Moeh*{xp7@;Y(J8#^{wCat zJus(&85Z%GL)lX59gh*`?9FL7PW9dwbeKe;RZM^F{5+ow#hBA-xGI=jI)v9jqzFV3 zoPDjwwkZDH0|g$23Vc71NUwV}b`XRNL$l|kjqtKiMYcXZAnRq;QG|O3kqW_l#726R zFXO6ym_#@~x@--?9pxdMFM4IQ|$lB6%)b5Mp0d+a7RatI4p}9IDW>hoDDHGjcujh zx{k;8&>uZauYWVp|2_wW-t#at;^qS*&-i%WvB11rSeDBb3$0;z8?hZQYp-%?a{d;E zuxH&&+Y|oY1$yYg3&CgB z>93B#M3Fvj=g|g>do$DC<^x^2BJakS&v_*{vyAa^r3XMiP+Hlxb!l*t{sQO~-O6bZ zZZY%$sHJ|ijYsvfH4W;WIyzKq-=R!AS$H*@3B74t84F$(26bsCYsWHl_APgaRP4qI z9BG(hZ@&qg@+;%R`rx)dot#!{HI%6AuIjmL#_0-bps+Lch@*h`8vJ#({o2f*XyHzK z!3RiQ+1I3aHVc72$m!~dLOkny=lC}r|erEyp$-QAqYo4VNt24kQ1 z4Yg5RSrwv{dfX1%x*4CzJL3;BvmZr41qbT0bgqtJHe8LgZ`@cmuvB~tUqh^dL6m-c zUyN4>jIsues0xRv(Q@OU7dxK1aevX`m)iFgmLD0Hh}`(63h021kece6@v0V3ee|#x zZWfm@b@>J8bInG4xm!40&T!?zi)%7b}v5ks3XDef=52pKJAJ!9ft#to!;B$cX)q@dQwt zh}F-TrgA`W_m8lCo89Q;PzqoOW)sqx_eK|=Bh1?Un@%vwRpI1X$6-Fz{(Ay}0|o+2 z^1b_?DZLfQ2*YzA;G(1v;vZfAIop2~zGBJ;n2lk2?|ZKO4+i=(_4c>I4C1du*lxoO zu77aCzgqn5>tYpBYVCGt+oi1kTCMe10*ijb4qnJ7%=brQf{8`dr(-$704D9S_?pc@ z*+7IR2@mhUPyffn|IRfiVh9oR5K^F*1`Kt#{-vkR_Pb2bQ%pLTgo$-AhG}*0aq;mt zi_~f?WM8R&j?RxJ=~Om3%538Be-JFqH*9uSd|kZ_%d?!^Sq_Cs5aOkW)lNs*p)iVu z(Qo+wN8evmQE1a=YfZbKdRA=LR)0~<7LTYDZgZI7_B{+*-#_?92c*UL|r8L>dI z4pLyEVyEO=Bz_7EhbkKsib-eKJevZBE&I*+SSmz5nX!C72k5OeU8&Dds#Tt_)Z!su zJXuiCyvHdPa>D_pV==r9J6LMbh8(X{wk1UpGSSm%QtVBYlao7H|M9;77@E#EPTjs_ z3V0|@7oR&Ux5`p;OUuC6`4j9kRLhsb9C%L?_RE-ddFb+7k~&)S{PcN#d*m6p;7bzj zvYA5($-{)7-{fVQTsAkXrnF$XXB!!T(+$krqobx4Yj9kk*Kd5Fk&Y!#=3w+!Dv(Pq z@VPll;Bj0ISm40NTPOd8)|C6eY@410+|z~S_P(`Wfk8#n=>}&ibn|l*FK1;#BJn@z z)^5REO$4Q^M}714b`~&u)MaO!O4Kj+1=pL~4F|H}|BLx$tPrY`<0bY)e#h!5DrE?b zl+Gfm+Q4+t=`;$jq6p(^Yna}Bw#z_cIgmg%?R=CxKCa?v-H%pWAy{0cMB9h6Vg+^Y*CR=GvZx0d-*@ zBe%~=_eSm4Khf2f^t$v1QpSTKvEz*VcIoE6IOn@%>gqPR6uh=Qi`PEgNIgs6{n3Cr@6x?-B-{05#sWfjtB9z_*jx3L?Xi~)0QTcNSO~!dB`7|L-Fn3Gdf_?38S9oG}XP;vl>`Uu-&aD%G-5 z2e3~(e2){>vot;IF1r-bTD_lacC#ZZDO1VosxgPU->i0HT_6d?N<)qP_#~TMBTi$T z8(Ux|nqlyXO-xeQSn|+>5eLeq)j=(LKAoW8BF@p!K{p3;S&&AFfvjBUhop6e*rAuKvlGyca?$)OK# z)H))#CgSX7Yb>Ki^UYttO!>A^^ov2J`%g0OsXyxg_J0&JT`e#Cf9!o_Se4t_u7og= znv|lz1f&E}O1eYolG9tyF1Td?Y;KWz4o`y`E&k#*X57t zRG9A^?|7f_jJrlJ2aMfmlf`42Ypm2fO98Q7@A4EyuGCB=E8D#Ct(cIBWr@yKeh!In z&uqPSHnvaD#XsZ$n-$s4N9#0nk}pwAXSy?)tQ!#5hAPWSwoLDiOx1dL2;(i5^D9>Z z*SyLS#J5blKJOFQ3uSfAi0RG|cAH$Vjy12fO&lv6>^k>W^({6kL zDy!m4%%^|>jhv>TjZHrX`q=3H)DC4~^DC-X@&)(IpF%|d&_*A-bIdqi>yfzi1S>!V z3Y`?dq#>=9#)))k!xsu)Xbp*z#H-j=GbMUTSAF_PaFzcdm&Ek$?3K4$i(yZKx#H1& zpD=Ne53C5mOB$FdVkB?V2uijs4Z7pUFbYu2kZX^kz)ump8Awx@S0wuxK^e)oqmrqYKi?6NYztBCwog{9N8`6i$#*dm`cPy>7DuUh}q^I%Xh6b ziH{`4!FgJ>o+>3#(DGYrhB>ip5?qIx8g*@<^AOEcplVqY#Q6!|kMu%?EG5x03+YtX z)-iA4PWKNb2-U< zX0@b5#v}|-z{5F(O3!0wcE&s>`|s_h9F?a&mdkd{1?=Y+s*t5FM)UI*>~Ak)yhpEs2slgK z%w4%$V+4gV97Z(yvsG*}UZ)2ycE-LY9?wxzI=d>Hab*tw>IOIqTL^a>)*z@b+j4IF z2@gig3-k;C&7=E;Dtv#qU?Qwhcrz~8K7et$%2|e?SP13A)6yA2w%foEZ-u<5SN)D? zYAb8+yzbs(8}}Cp=XPnho2XsxpODMS9Q8x6B-S**^ap#e_B%XsWNmQC(j<1Tr zV##x+pORMOI>so>6PKTl!6C2mb#?jXJWB!ZPa?oBT)_{|!I7!8TWC}{-^%k_q=O$? zAl^JJjY;&k;IX!EK6I5Yh0LN3R(e`1kOs#p?6ay(vX6Q{Q4ncL*sl*p3i#e@&U`TA zbr0`pdzxficH>B{1{rh*+XMg@IL_!?3BMx@e=8tfo_ynr>q57fdwQWuRgAqXRY8a%!|@acQ^-g;BS9a2nQd7rsxz z_0>6hLt^aT;c`$!zC<=k$? zc(qFz*S<)rGECTXBscOlji>LM@KxzU+LK;OVHMB+%V^5MdFrDq7_t>x65oFsBBkt) zVd%iu0lLQwm7+8ahSwsE>YkS zp#i&z2qMn6Z2;jpbYGNu|6!>uOb`kE5pA_IwkPKw;G-D*6K~egp89 z$+r{c1?%L7{QkSU$|KkygNL{0OO|hlZu5I;eyYh0YJgxq5%jAfFuh?|dWgW#Jlab3 zDn=o%L+T5MXgH-L;YA;YPag28C<}yq6Ch;S2F;K&HEFv!B)v?x`JVWy_0CBN5!y+w z(oOllp=W=a+j6L$LO3o0{Ty-k0JQr8F(mj;Xcwx3q$(0n`E2EFmuiXrVw-faQ6M`~ z2dzq>hT)m)WBflucuY-9dBx4{HqGeoz51{3kTZF{P>Q5DV8_|AdqAg&yBIoFX%w>fGfv50 z*86KjJd$hMLtMNP@qU{6B-IiVRo6gM;?NbNjwq2Ic6*=hdwhgoJ;X{v%)YN^J5|X` z#+~3cJbqm4Rr+>wG0_Xl+9p93rqVRz`1I|j|g6*Fms3Ox2+QY|PpP9=_e+c~9bVGUJU-cFcn}ZK11Fq!v z+;2^O2dDomIU;Z1yHAa&r{V}UFE@sB2Et!XKL^0*&07ffccoMtJj)@K{~uLr{l z0b6@N47X}cXKO+fNL=jJ2USc4v#FcqgNc2-#=bT5cYR?J=DE3K65eTOY)qA3>knqM z`1L;h$Jdjii1;nf?(TS`zQ=>-;j}rutk6!<2bl7#o^sfqWvGr54kxoqvoT^UTG_z^ zzoknmXydOd`vt_KmVBo(DR+*6XmyQ*PSAe%kXL3E!5$}9 z@+!r~Nwk_(%Ewz1RIS0Vq3YYkIzo1CTr7%)0-fMRM8(m1sy3aI$$z?ce~$Pq!sDq; zSx0ZdZ|Cq_tA-X#%m@GkAj#&9{)tDF^Pt4Ym>*{`862l_`Vf>p{IB0Dft%V5*=z+9 z1qI9XKVjj&jKb~EK%c-ZZ=yutZiM|O`0}r>4*r!7iv4vI$A{Hd<6l7auejuIuRZxt zWd8Tp{_h}w+5NwR@c(lVQc#N@|EFh{PY#RCW--6>;>>8Q$jCwNi`UlgO8s8w6V>9F z7Zo?|KjT=nk`DuQrIWSw$^Kq0QAqD3rR%1OVc(x-Ann>!{;iye;2~bCR=%p;j8OKt zVf?6;S-!PN{_pEB2<4pZv$YNSJaY1KfBiR{aP|@0_%|2A0v@nXJ?HX8l<9Y|zRHbF>(djh9Y_ZQCS?^~4ideP4{#MWOo znRr~2g>=;8J=KdW`t?Wtd_6BfqM=Sx^ef%Z*N&xJx+$%4-YS2z`KdD>~8N2V47>EgxaeBD3Vf6rL)zdt-8w z1DFZ3CAU!e*NMe11%^CyhUD!pEi0NQ(0{h~r+Tb*y-t_`D3sdW0MO#IMeeD9FjlU!KqHq}~YMMct1HN_ko2_{5A3P$$K*uOzV+L-LE*_%;bIn zLO^AU%B@oUP2ZE(SJxNV)qrU8<9~Yi)tgE>AtFg|Cj7*&#!^E9nBomiTZz>sM5_yR zn$o>6(WbePiB&|ys4|j@t~NgLHTs>ja|-%3ZH)84c+^7@MV}ozKCAn!+jSWNZYHRgbDrGF@i}Q%7*wVG)MDo5+7#;u9cpEO5) za>hSD$z>@%6OXVaE|c@c;jld~p0r;1GF-5XJ(8nF<#AIj%V^L^ew*v@9`EVTeS;2t zas8Cs!ov_=J4ov1OgH?hP(XSvp*X@Gq!#zml7}?;&FMzEml(I zumfY(ajo1wS(c1Tkx3G;IpIE0Hp^+r&5?I0t(--`BqlqZF`F!x zl_KPQUa~P*P^C|=DfCK6#Ciz@x5P9$US4kiNNpESX57Os&ki=M5d}C}zI-zIcxk?; z%WXK6iFfrXy=-s54#%loG0WO0yix8eq~IndT8#T zg1pWzoDRwFk29S_meSstj}^Wo#(}|}zfP0rGjN~@Tk}4di5?J}^_=yJ=SbrXPj>~; ztcOtpnUfK293~O>?X7lwP!^Un)Qc)=4ovp#>rC_3SXV0FZcqZWDEegDMJZ8lao!B4xQ}uay>rwzAkAU z@S?YX%z;>jgX3~~>u|(*N$s5k?)KNqPFLJbCs@NfkmZ5#XpINJ9QXk331p?<5)3 zy&JhJfYv~mDjNQ(p`k&)YrJ-GMQi!z$?NntaLXq%9=3<>$D1n74Yp(Zc(>l?4L8*L zmzmMKx}LoUnb^|qaz7|~hhutpMlPag&jb_J`UF4l#<2(+dqN(g`y_bLaA6(yBrqwR zqyy|`-wWFx5V@;tCt%mISk%*cuUn(sN~hW~d_Q9Ca`juq=7wcWp8-)LrwH&&EIJG= z14&GB54-y$Th=p(nwHyD5YGy+_)SC$CfC=}T5Lx;?&H&i{fQDQTgZZ6jc)&tx%JjX zAP$vXcTjWf)$?bn#i5Drm$JK2wXEKC2ua8=p0EM9;JDo!DP@r$KsE&1-ERL0YsGP_k4*AvoqKK#}SZd}49VxQKg)4sADRQJ{% zFjGvEkXM>xdKOF8{WzqL#Shg;`Zby6jk_ z4R!8iea}6;4ej^~;3dJs`7WRFsaRY zL?i$#!7oiRdrcq)h~6idXmjKAKLX48us(Ig@r!s-VF}>YcOd!I`1m^vZdfEy15R*I zmNdH1sK>&WPw)!diH$9jp-eT{s~Dl?vkw`&cDGhBGljXek8|i(Kw{PCm&j-1 z>VQqv;K#i+V;-z9tYNs@7@5|u(yxLeSZ7=XIe7L1CT+yEVRqFQhqn?@(e8Nmqw*!w z%O*!SOHs%Gez-Op#zH8oAdL89NGecP%l9p)7U-H(C66xLY5YYMCBhG1gP5p|<^0b7 zcB4%?m+{L;W<6>|eJKt#U0bt}{*3FC_@eyE}pV>8+^N?N%>| zk?PZHWnEH!%xyl7FGad`%A=s}RK$Zqj_1i;d9s=|H|4OuSPSa*`v^?b456?W3oTd&9;w^h zzj>m{Eg-bY<$V6QUaV3Xa;b=#R0OPM0V79|bXuC%CoOR_C(RRuuPNwf4o_xa6Vz&@ z+0V6hH}Zn7JTCYAr@>Md|BZ`*1+-dDX7x~zM;!#^0ZAE(2|pXd4wE49b}m3wq|)rtM=SE zJC3)9eK>}ND~P@AnIC;*%hR^Om#3m1vr;1+e$%CqoI>#HZ*2nbN$F~3>0W8!u3PlR z7I!)S1=WENeBrOoB__8lIsll$>eQBj6kx%%5Qz5M5%C&w_7H-Gn%-CgcUwBWkn!bn zic%5>s6gx7vttt)k7kxgwH1J<4r;#K-nFpa4)sT9&kVK52aI0^y#)IrW~A{Hxf$zF z7%znM%k2(h36fxE(-hK)0)PCeX5N6Pza>4~ca zxi(Afg+Oo4?zEmlQX7-bkZ#cQgp+2VjK z2g5l?;n9{#YDz|498%IMve}EVO_Ril8Ti5NA7U}+_m$5RzQ1V2mhtW83Zw0^1ozK# zpd|oV_cPcoHwkiI#6n^`npfjCu^5Ms{hJhVj#NQJ`9}!KVvpcHT!&-Be}aeaCnXhuK>CTq8$b0^7ubnk zt*~}*ZG+yhbozMb)M;m$)xmIkawn+yY|0h`r9Ai!mn~R=zw-`j3J0C5uvm`KmRU?k z+#IcDu+|S?vfDc!ZBhg07almeC*yTl?&kOsbr1pbr(4}q+y&Lw6{>^>IP#-yAT~$@ z&}E0$yRK$a%Ux;-$327r+%M&&3PD(c7!bFb-?&d#y(v0Abvl`H$nkIbb$1K=!z9Tl z+;upDKMHF1^g^`j*a*R7Y7@Mp+k=(o{fXiAebIPw(Zz>s!eRh*G)G}OrwXMmdR}00 zQ_r*mD*8D>5`m6Gf0`r#wX(B|%SK?+>D~geOH~Y?+vQ^5vELq9)#<=f8dUC&SkSgo8_;P>ehx zVZ)nF(PYg~ua&+K1ms)ww?XG>qWx;ec*zEvNjKv!tv?*Ll^BUcGYkiH3c?~KY&aHh zKFk88PA=lp@hJ+m;!|_&WG|Rqra=+92k*w?DBNx&g}+*0!F3?xuIxb8d!+I&r2P-b zK_HF~9Zz6?KULgjbCf|eg00|?n7;1*JY(@m*Y#iP_B+Jn`=0bTF7MDA;CVc<^veyo z>DfpRV_3e2%=C@T_USb}vVvsp8jQ~q`V4YD;YdV=xtwCZ>&3w>K>n6Gic_=l(dDm| z4-R`*@{VQzWC7`^Mn&;X(B;ct))78_50B|X5OYSv#}p?blte`$ zHwgJx48d*LvUsVNhtY+G~uC+y9@~&a72L_526GxKamN)XpFg)*@+}PA{5kB zDE0t7wAJULAXLa<<`d5B6Y_MZKcjb|pAlqv#dYL(DEX5Fj*Oib+nxV|`gZS>wj} z!h!l0tpN0n?>f&Y`!AE}cko>Z8NRQjXrB+{L0VV*L4u>|;?7YndYTWn9Vi4Ly)%Bwch?t47~+`sv+8uAUD_$19P$<;9-fM z;V!o&2!c-Y`Q3Z>2T%Bn(X^L8J_PAy-|R*Jgb<}#V(Q;wVV6iWUKTDE$rG`|`4$(F zjQ(g4z*d#*53~kROWZK^o|^HO~Cy0NFB&O7xS^ z2X5$N67|LIFB1y1jX8<$5Q&vgxY_vVD^suo0B-VHw>3CN1+a8-RJbo6&P#x!WK@a* z2v~E;6-8f7O-?ohp*s+kK=>9j=-1*&J`(UiT|)h-UY(HboAkOQ+2lk0jXGnVFSwt* z#3q+`a(1v3?YKAp6J&@kf-O7aVtNukHi;ExR~)C({z?zsS)@^d2U1UgXgHNt!>KPnO zyX=V0HTc?NQ8tETg-Tx>Zwf)rNthK$qcVe!L80%hIlS^_Aa8Jdz5ep zOcY>3N0tZnSLgQ6@ROdSSA5U0rxRG%U0>3mfnd227F5`p@oF?XORJqeZ8b*-s z763X2%o)Z|^O8Mou9T+TPBgSuFjtT#z()V;!AEVP1e}=;D41HqqlB}@4-1ZBjyc;%u_rI<83-~7QDn;=2@JHj5;)xu~t zQV51wt@VQ6Ht`&?wWO}r_O_)Erejvpv>*la>!hP{Y)u{R2x}9&8S>MQPYYueRvGmC zXAwe(i_jaOojy*Dmah%R5e-3(o_!(Ra>O=b& z#?+o7jFF`zL1gf=ixouEzyn*oSg0=<2456C&* zP$!I$X<9r7Ti7Fgr?EnVl6SW2gVfKkl?6ZLXjCeO79oY7#(clo$g3@$^=3Tu6z%xT zYC>(MTl0=W|9~K`>Q7#H8WBs3a9pr=7 z_?Z>oD4X@XPxpvEQQ0?p2&J)qpbH@~Wh-XJ&vl?;8qZv~6nMw5GSSf?9x?>sVN;ao z*Qh_I<_}({T~s+55HsTK%Bg_*(?Ig zRuLBXdGYgfQ1hN%vW&2vx*hfji|LEJ;YP|1&YFSytH zcw;25QDEGCNQw^O9Nx(1k@qNkABHX|nkH8{CTq499RPI(4cc10Z{3E2whb$=UV_1q zc=jTLvHsNamC$)P^{c6hbbKd_q=>DoLNQB9}7PlPiZ(^Y5=; z{_xgCD`%M<8eQ<1GFWH{I=>Xm_n~*x(%3jgDlpwo5#1L;Nn1rm!lWW|-BPlCS?m7H zi$W2;3#f8a$}2_~V0!o)Hx&*8ykKiW6-}r0savCB98u>rW{>ytFPs~M+&J!6L%0)B zx7$HN*=ebT7U}#*Yv2EwMym7Yivg<%aW>8}KQ~rARshK;I1wxHe9Kni{Q|lZ1Wxe- zF>j50wz8}Xr}kqa7|pI1pPEDs2r!!1I7M$H=cSzAJ7z~~z#J!aVyluRkun=E7L`=r z4#iZ!Pupd5*-7n%AtMqm>>-AAnLzRBlRg9*LGYmRv&?q{*#Z1=v_3=u^diojT=3dZ ziMmI`63ROuE(G<_XmCYK{*D~YCQdh;4HCbVXRodgdVCqP>2S>Y^>c>%5bjk}7$<&W zY&mOCzGb``A*v6dIx$opSR^vC-rdcmcEp}j27So)mo#L@U$Lu#XLY>Qg+qvWhewEV znaPg%zWSs;%!YLdA;P#lg zdDMO9^CRM~J(|O3lJR%*ZP1 zWLMGyTIF8KL+yQ>@Uob9O=>$apViZs_TJ!=o|jf{!5a_bFqCW3LzBGFNkO>1+qHRLz#eZ|~u zLFDXo_u?=gFIJ8BboBrECjNm>IU|f#xfRIkjS(2`t^iLYT7rmT7?Q#6WZm`bGd-@% zkB+`uP$W`pzFtqZcfFqA-|PYK37tm2K)?*(f#PaI(LuZ}3_s>;%}^c22o2(6oJSoW zk#!nBCTS58oHv$RyS<`hA{`G+Y@MF{iQw7lc&c1xX&l>k&Lpw{ZT>`cg2He7C|C8U z%vHYR{T9<+$%A`{tno8QFqrBpzgqx-maD8Z>r`&3|KRcskJf(H#T}Ri+sbar1s@8C z_9Gq`;jF5p_XCc_)eFdpIQo(X#GC378jKN|ABqa`GsXR3P53bPMw<6RLaVae;SsAv za@N-PQaCcY0Gkl`=+VZA8R^5WV_y@kd=~TCe%k!tmBmV$h`0h^wQ9Gbczl(^wdRLT zoO@TX2wj{@(B*iO6bzt3f~%G?tMz}OrDvHv=}$Hp77;d*7HE2K1E3HJKT)dyZcwYD z@Yc<(eIVXCTo4?;cq~P4VPv#vtljB%GH}uu5MC&hUNnStNasl$vuTtjs}|I!q5WgN z9&rWw5N&K~LuygZW1` zpBY2iV|FY0F*C{N5T`E1P2TwfB@0d01W5qO03sKXjgDO)k5hcQpM4VF{;(JojA`(Lk zc75*XElzsM=rCLP`QuT(3)6;?_RKonI_0(syeqUf+Cni=!l&30Bw`ugvzi`~?z#_s)4DB=WHh>Qd+kiEBY<{f&uXYW z0+~ThQFwg`MoaBc1@;GWPFq~=mm<7$IU}VxUaFq>sD`NbJELjVoh*s3vF6Er6d=)t zwZq51A>_Z8RBR{;xM91b^Y{!6*ZO=AMtI+=(y!OAL}(#UMJAk(7!V)Dil&p_NdU68 zv;9QnB}N;`Ajt?ms1msior~m@v`nfEI4TqV%M~61A!F$}W{#g{3@e{TLAyc&h`1y* z$%L;O22hg5cU4NwVvkon@x4(rAmqEJ1(>h>4*Y)_#{!~8 zti}f&DM*C~5hG?}Q0V-v)LLv?B_fbZdDU&prM9YLp`~3W%WU;+&hf(>%Kp&XExG3| z!trWrq(J7?wfYqSj2miq?z$Ts6KY{d4B7JA3NDT1s8<=5V-HS~ilgC0fA|=fa-zv; z1`|A@D6*ts`I7Cg@BVNCxn~8h^FAAW*gJMHTX|``eo^N09a#r4!5Yk`0jKQE4MUj; z9fzGsg{0}sQOn`lJwmm-eI5{Kpy8h^l%z0P%A)$i#`lHkb&Ctiv`&8ZSfNRhYu@=( zvVpkT6IL#S>?kH-DSjfymAayyFyQWadAmF8`s_xnRboztLnXD}{7~n?gUh)I+csI= z-*dnJrGWr1JXa-1)SF@NTJ?+ec2RNyS3uB`NfHuHY7Cb@E6Q=8sH4O?0_k9&K3G?$ zPnS*{*5o~YfJFIpBwOWMnF`fVA2Q`6R=;s-JE!MQQHfO;kE`-ZdflS4u?io!iFsI# z>J+DZ<#mfpRZg?idWa~CJd93`oi$z9IL(j|B#^lr)`}$V3Z=xxJOz@@(Mf! zU8+Mf_Qn1WdU7=?i$#1+-6-v5x~2<%y6{XOftoWuT|~`OlK5R zmGCD()5*!T#dTZp5jSIb}SR1?`u@$Uqb#!{b|D@OG#^ADN>sv01-Pjq<)rD(Y8$?H6Kw^;5A*0mEst+mP2tZq!7^RXdj z)VV%Ni=#SU=P>4eT zvYzK1xFo9LCK!2*f1RGBVo0GFO#wUFMhwKi{0;-M7nHJh4o-KvL73ae!Mp5kgA0Fe z!6PmRZ)1eU9dPXJs{O84DE#$ud2jb(v*!rj{*2jZKL3dSsNvBz!$mK_Gc7hcNFVYX zIx$52<%j!`z-6swa;DK-;^{W`xeggg7IS%~CVPTJlV6^J*fEOV>|R@C>!Ep68`Iqo zhT=x#B`Bsftu|64b6}_$@L}LdbT1&3mLFSLXtxm{CUpep9m0RwNu0kSr{KwXVpUmLy44j4KN? zzcnb4q}t_Z@P}QfG_sdOY@vaD0P~B}WKC{+OwGQ>Xg>Hp$==bJLewq?yT(s$VZYlJ zSMp2&zu6PPW3ctTmu1bBlsk-B?z7vNyk%>_B{-+_yxE?`%@6yt^9eWrT6Ke?ZSH^< zS(689Q@1l=SrcYibEZluajJm2@0c*J`~mOjs{&!1#RvZ*K5$9_6?7`8+E?2=$CfD9 zOP*Ooskg*;*CP@L!6K6hu6V+FB#Xo(zz24YM>}=yI)xWNeOAFixy8V5VF}^)L zGKG3cbYn2hJ)EqGFJS_Cav!~P)1Eo1#UiJMgbw;5<5IQ+IqJ?lu<5U3YW8U@vJh4a zupJJx-FSO5Jm=|ST373KK7ujLwyW;-0Ih{k-a8#VH!yVBv_Mm7*TSn63sD%Nq$v1= zbr*rmrBT_++{+W?nUNM1Imjs_+~auikjWsdDbKec^w4Phk>!_nO|aLz0F``>xng+U za&)JFk^l1alLR-_WhDldGZaP*oxIcwIzZfE3BPIGB%>GqxUfFt5t$x*bM?*gV;oZvZAR)I;L8pXM)%)p#mXf$^T_VV?}I`*sOmZ zG^;0s6rnOggu?#BRzA42Z_MlIA-*Bhv2Ca~pj6_UUKH4P;|v5eNU;ikvg#5!q% z=VkPJvC#g;O4VsRTd;h9ef@>f(&Oxv@?vnOtS5@P>@Phw7z zL<0E!F0_AmUk8U*Yu|p_4a)}a!S&_OKAW84&YjF zT^{fJSZMoi-}axsIf1(h>A!vGKmHpDBhFVNX?-3SLeBrOD*W?8_=>53qJ`;5OU8^jU2`MXLtLX!rRBN-wS){e|pTHEdx$| zri62WcfB6NnX~){pl}0ea!l>44Wj*v74!TqR@cYtDG_TQXn)ZI2&Sc5O7-CK%=VTe zA_p5(Sv=oPPQR5$FT_ zuD|Lf>e=zcPJ?~bq|+jKuilaU!@{3xkMJaDhHNOKlGoa9lFy_B^S>%!l=8(ghJ)o2O@*E@TkI()Bgwa;KcM1Ph96)8D_X@V3N$adA ze&DG>XO`s)-uRc+EN0S9^2)6l4TNh2LC~dHY|I zgE6&MO(YP#gBYyoK@+s16;+in-;NnMNg-IsCRMLqejst4UHx2BDY3n?XF$y2q+Dvl zmJ9{a|4yPueNqd{KO~R1E{^E`nwmo5w}vTL)j#;@q*1-pmOr>|D{eRmyHew63DsgV zY8VXNyV!fI$Rqq#eY{Bhn)(zmQ2h`j{ip9o9Q5Z@#TCW_9jZU*3`1 zMZsoQ#0UVN42L!U_RqU1v$+?7_LpQV`2`%=sxoGOgi7?W0H*uv%>ucFKeXxP33Wz^ z!;ye*LsnU3AoH9p(%;in*=-eg-9&+MN-Cqj`S6V@n@XrJYyb-}am{6?E#Wv;5(tx_ zx?ukJ;*)aTZkRlc#YviUdkXYglb>YNQTDc``P65TK_SVT+3?#ph z8)V9pK621Exm@idWB0g@zjeR?l4E73cdv}`ty$tF>$T#&1$1sjjp(N*i9d^_1*2?t zI(VOpee)&Y3U&Im(WN4&$Jm4AV8-uYw`_) zZc~1wEyX58Xn4hJ6l*>Kl#6UcT~!aO|AcEbe5eEUF2y>b)(Tw98lSq1h<^^O&DqdaVOJjXH;WzyqMY`&4edP*FS+YIh$i!DIJvJ(FeM{7b+c8b0JPiy6#Sc)dQD zOL4L@gV{gl+j2lIf)MaEQV<*%=Gy&A=92I}ijWgn!ICejm*IZpXm862-y%sqIA80w z%61@qr~wA*`nR?$LAtz0hh)_MDr^#axE#+%Rkl&J54tXe_o2At$~XphfiI2gPB!(k`k zINm!w;VJqFZBs!2`LR&S$_zO8o$f>QCH2KIaVU%VL^}!|%&KdBh@azb(jFH||DDIi zOTDw$ScyegxV-)^;bjx}n(lojSh7C2^Y^v!lFUlo=>=G1MrynGpZA2bhO}QX(YI~& z&gNs=fLNAP-}m5Ntg}vuM^o!(x3>8Z+3Y}UH$HmCW|C%}P-<v zMf#GldEH$#{NiaYBK;daMAON;CwhH)HbG!{E9%eO)v%Voj*}>K8lbdxX_fRnq)DDo zseP_qP6B||e$rZSPQx=0*c6`p@&k2GY&JYy0N}AVs-DFb>Gvg|4wtquJ17V3fT~qd zJ;qBphzVmOIT?(*xV7azi(}nz6=t_t9_+&EK72RszP~6M_|0Z#(S3)T_e`eFWGA88 z%Ss8Ayw)d_R!njhq^KPstDE(#_?>gr|*3k5~!>U6>XE z7r_+LS*To!)qo})g;*4t;&-OT`MO9dx#F}Qb_N6G$98IbejLYhlkd|$(9O^uY#iap zXbo=xDTmx-yGVl%iaieqrOIBYYVf9d)33ko`e0}Uc`0F?Lofk0`j)~hnR~QhHn6~Q zM)QZ&wO38Tz5BFJfQE8-V%H!y6Pv2R>k;a&_PaTEAh~phA?oVBsCf5nHDW#a=$q}Ww$7QUm2#^ryv-jB zl>~2K_~}U}Z|4E5VJsLqote1=#+l+;-@glzzF(3ljC z`fIJV^<)xQho!oX-u1o@+hhM=RO+-n&vBP`GJGfc3F$*d{d`!a&#>+Ah}5Y!&}nr- zfSHwPa1!g!#qwY6%R46c>FMcGQ8S|>_{y#+?$ob6v!jU~&--w~V_dI`Ei_`;tdkEn z$2ur=NoHEX0%$*iAfF3U7Nrm{^VotL1Z1cEnATH86FB4}WXwk?9i6uc0x6nT=jT)c zwe?J^Ad$e?t2%f*ovdI5xRf?r$?+l|AXA<*$YKz%+eApOQcw)yoAxEAy3Q1QyGH3t zk=z(|<_`P(0_3$N!gfGga`&-3@NyrP=7`1ABa^NnVLnW5?6cn*e~HRR{W`T@XI-Z6 zGv?j7Hjp@z=cL26>!(^_7i;K?asu=lVwla{jg5lzvcYa{$73sn+VycPt1d_D%+Byc zSAtfIdW;u9LtC2=FjHY(xyAL>LS}2-d*u^L;LI8{{9CJvNAUVry2FQZY9;HIZah!j zW%`Ek1n$1w8J1McKJ93E;Dymm;ApowDC?4t1m}1g(BPu4?R7q3SvxcV9Y#+kF#jIm6n6Drc~y;_a5|Lyki# z`GKTKXt#OYJ5Mhcg!vwjqe6BY6JYCFPSp~8^>U?u4qmzOx{1WAqXr zeWiIUkf-eW0X_J=7L(;#`q}&Pf{863-<6u3*}TThHV|^Yjzy@us$8`~w)7mc_i{x_YrE zRrRt?h*3bWKJ=6b=jZO=o?Oxt$>9t6@R-WCJF+-&l_~4O#GIxppl}Aki~2=g*RsNdb`qcsjpGE(0ag-2wOthENha0?Y^?v5;LMTN_ghR z(5Um_YKAYhqcq=(I_18el|+x+5z@mt_eYG%(h#Xw4h0so(eI5Mk|n52rJ^WIl(;I1 zJZ>d*`M|X^HC>z6MME6$W+2PK^4a5ubQlt1?tuFpe+@s^ML)g9WN4DqT6_K2^h^=2 z0@|vYB;d4`;`8H}h(iR#jhOp0xg1-nuGXL3`7mTUY(f`xy*}<~K2;$(USgToj2tg0 zu_ypo_HZ$$BJGR!ksciuOZL8|$wk=yyOgyGI zgyndL`R59x_%Ycf{sE9s&fV=)dy|{Ra%lXOTd?%Ib+&4WYRJGiCgtKv_k~6X&ItGR zhaU&a_qcFs%!VacYB6My!|t^rC#|dvq=T!&=%os_ya@i%Uzi%A{ielnW7yoy<11zW z8&r30Y`HVk6!l~%txGKhJhp{qYjP9Zh#`Q8hoKX!>-nrgbna=I%XWcu^k-UGrh8ZO z&HAMrH+n6>M@!60n~(N(oaB;pUq0*RNAm)iDH6O-t!fkHAJe13H1k15nDHJ|K&KlV z-F;x!DkZ%(`Qt+kF^lDN$_6`uf9~#i$JjxOYL7d2A+HfBcAQb`AR5|V`^dF2@Z0_pNRlm@hao8jW6pfWav7&*0;f4V^Gs~`f?o+mzn-on^uXxcIFe52th`|>m@X)LKc)S`D}runZQ zHc;^&W~%=vjImOJY#d%+P`EOm%^%RcAoi)ulr2h|_UqN@&UU{-DrEsOi++W$B1Avd zzWQ3t>T`}_g6Ua*2off)l5(a{!O}i=Z30{KKr3dxi?Ds~gLAapx%d=EqGOACue*g( zPR00foJPU-t9ig_j$0_62O2-b@bKR6e8;xmjy0)?Qi}-nvmGfH#o1!;4%&UcyKDS? zL#J{`HEV;h=w1=>95}PUgZZWf@(fm>rWeKn2BYwTpy*W)vP}y#phENNTi>n zTWvMzQhPCSg52;#mp8wo-L^ZHS!voz`=ifExt2Br4_U3SsWp73gD!4OPpBplr1gn_ z(=m^ZL)~9StPlqyB#;91KHtfP|Eu7tn6gz~7+AYDjv;Hvjc&mkaGDwu4x7CO043>7 zW)cYE@2$807|*ZmeSrwig+@x|&4^*tLok)Zs}**|j_Ucqseae28}OCxQ6v&iXp0kz zu1O34w8-}a2XbBeO2A2b^Y2kkB+giM1e5;N7~<=LZ`5sO+bY8k?5AVD+6ACEjAjmH z$r~38ITM8^I(iekAu;ELI+<33pq>i4jc6=A89(=}gJId#I+ zwUTZL)ce9Rk^KeOLs^K($XDDcSs{3sWb>E z;R2EFP*9{hq?GRN?nWBvM!K8DKbQOLefK`+-20Ega4Z#Zt?!%PobUTS#S%uJywiB1 z!%Z8sl9xBp5!tt120a!x`?GA%P>h~{%ztBRPt;=5?5?A@!*`ZgOz_M0QGvR<+`ji( zxx$KOVE&Zy&VGK8+_)nBGiAR)AWQ1IOJX6fy?O(3G0&t$Qy!~LZmXIXvYz->o{2z? z^@f9Nb(AYc#Lbc1bNEIkj?FnV{vaUp=FpTf^vUr|t+4&o7wC(ek$?#kv27#_qS9zH z_3IBJE?ZtrQz5geo$p=^rD-=bKsM>BTd&!a6ZnQ0{3)d7DORG*eU0b27SrtjnG7Y%5tu@AoZq0sox@N7+^+u_cK&Q!h)2VsTJU2xtGFLR#- z9YhqzD3q7+p^8Y51e9$Adn`;WfEA$IyGIhnpklDrv4Q`V6Wo5S5E$}{Dg+v>))1ca zzblph7}PELi!((ddbV|99i<)7+I>hXdTz-r!uYY+y!(S+)u~gCtySl8w!0wb>Myk1 zDTE?qrKr2BZRydkHgAOSRl}Igm~~ymS>j$*^3g8y60yYW?=IwVLJqRUq4xvn(Z-yC z^{r*DkY1zv>GN1I*B!m;lD!95fK9wsEM{fA!{3-ilW&tO;+2`Vtn8VmU%NvC|Dw;g z%s@a_@`dM3y!fXM3!(XeeK zbAP36-tAgV=h8ym?WrQ&eU|GLkIec|vS~0oBqKzrVSOZgM~3y#fR{e@{@@F_!u!r> z(A;;t65RrTtQf_n{VXgpZ*H~{W+LsAs#U4yBJzdb&ON!NP4-Jz6!Trecm&hFtpBVZ z()vq>v-*-VtERUN6#cy04irC9%DNFOc($FTt_7^-IAEit))4RGrZHna?7dI_!O5da zz|YodsKui}Rt&&4WZ6$1qfYk;Q|+$$k)b$Aby{Y9$*u3TRsJht;w^WB$F(E3(;gXs z7K5-AL3)h8sIQ1tPj|4{bL!H?nlRN5`j68J`YVfdOhzbMHNjkFT2h@l)~^9H2fAU> zb2{rv@uyo0UPWV(4Vl8_u_Pnc{_8(8h3_d%(eL1Ij1sP^QN_F8O`=__2wgH1cy6WH9*e7A|^^#=M(*^I1_QktZ$M5;Ff+PjWbZ3+e- zLRMTy+)B?m!LR3?U#!5;*p){%WGAzGXvCkk&iPk5L81GeDzo0er8ct@pcf&Qb(SZAbaI)>SgFnW zue3ppa2?289?VxSt=JI~P3BU_-7|C_M7|f82)kMSV2;b#(*O0Zk?CJA5T)S7^j^Q7JAELD?e&x5*i-Fc?bmmpfO3j4Lpx|e9Kh*%t;M=ns#5!Dk zVgyN@7E;ThUvY~I1Kbekn2zP(G|m~V&1cD(0fc6#J)+nIt}s3UXh!!D~Fu?sK`%*^>g5QmIpd) zpRvK*htHU$8tGPteU={XjhAJ)&!sgSU0q5B@JsI{>GDB(oEE(HZDRrbb{zi~zXj^o zXqB~6fr9#4nGmv^hLN4Nx)(wc9;>-N#k`zPy&S$y;-a!E#zL8%YF2YQn^*TLy{_m8 zBFaI#`_3FSsdecwFKjqRlY${ErgeK;MWg_j>uJIv0B`n>Z*yL7+ZUMz27R;Y#s^`P zjO9CJLt>-Gh=AWu1BCS9ip=%%t4xvlm30T6&=)wb_UA=@s$)>kLbY~^^c$GPLMgr> zbu}B%gd{UKQvjEApk(`{zkG?f&y%zQ?9Zm92i_Gmcv4}{)w!uKdmi{ueWy4=!6Lr+ zHmE|RHJKY7?6vJacqRK0W|L50Y@s(NJt>-6<+Pn@D?SGX% z+8Yz>7L^5u=R2u^9}^PyPp{5TTx8QKT;bP2fS8?NccQ` zXAjOM@XyCZFLi>%;ubM;JHq&`xov{^!Y_j}aso=0{Ca)?g2)yZwUSOEuZ@Gl_Eh*c znzY`OQ604B0NWj%5pvwhw}116{IN`~b{_qL`<%qye8Y8ZfdL~|^ZuBx@rt@s@WyHJ zz{m?yrG#f{__ds?+poufi(jM13{h|YLz$iv%CWWP-o0gq)0{7Jb}ZS-Hm5&`JTUW@ z-?Cuzq6HP8;6TVG-)?(wY_wC)0R5$OQKpqFShB1TZ@u3qz>R&l`H7|JjTXs;}Rk>_EP+G9+JnaAG8-x26k?a<~8^9tuRd-Zc!t>D1 z4e)3lrF>r6+r&Ds72@BEgB=}@1mK*h%V8)@_N!AEO7s2+t}DGt!uR>=lw3&`GqmTr z+FFfZ?3wIdxh^Gf2Q-h7Kx;T7`Jm=qiqEfY&;t9)JBmdf6p^k#=7C&rT=$sC#utHi zX@9OM*M^zUV2IE}(WvvYpjEud1M|iFNJ|W#X2x6v(>h|IS+4}7C#**#CgQK6bs=hSB-*=8T_^kqL zY75Y#KX|PWA2Ox#woHeZwt4u389+(=6=u~Bm`fhM>z>tsXX||JPquwFtTVYGiDrMG z+R}uELC8v_DRw0XoECpY%stKAFchB*^cspx^=+-`s_8823rBi_Eo&oL)<2u)KKPN| z>^*6zB?g z({W;MQ9iQHs*Zi{`v!a9eHQVX{TW)5smIif-d#}1;z(Ate6u(ROKH{IM1!i8Wl-M> zXVA>$b4d)VC#O);%+=Cd>XwPOq&AQ|cq4pQx~fb#X^c&IP5$RUUEg@qCcRlgiQpB0 z0~d$|O#aHyDlYhz0T_dr{0`Uzg}a_^*I666Lu)YUgx*O~g12?bCTYzYyE2PBJVx&CGp`V3QZT8_!Z zbGwud(ma>=aM2UVS2Q^8-2fm_Wo$R{2^aG)Q^ZSU--oqq?_~xIq$KZoSsd5L>ViaW zM%4Y)H3vE11DGY^4l@S=^FvhmbL^Qj9S8l7)@Ly?NRbK^NuM%a*Iq>M%3JH7A2n>0 zUXPf<3d8=NUfLVi62$y3Pab(&6{pD}FzHnXg7LBJMsscU(b=ljT@%04{C?W$8Sxg!bTQC_6GIKUcMzOjo%RI0TkOTJxmv7wo6M|c z%>>#UjlmdIVRYI^0yGn(4Bd&~M~Hh1O$=6(`I>2nINiXtxP0RU2sZ?#A)+{hXQs7|mhhE7vvoO!ZbMBBwxt5 zfRxR3&DKqtNpB`QUT>yCC>=9k<=-#O-zPACy!N>V`-uRmtyfAGmWN5kK@|3R*(eYY z^nRDer>UPpNZUwY=%5f|2t)e6KJo8%?0$^6wRUKJ*IjL2gjj5^E~H^?t57PVNy@bI zm!~=rM{ew-)9#OX5d+gs#d&NSIy0`6Bh_gEAz+Uc_#6?CI2o_c_M+V{j}?I%wN01f zRG*?r`xhpVSCCwQ`RD?GLv)_?7ZH!OpTU4un;96C1{AK#1u;P06$v1X=}KTjBLQq5 zzW4ryH{M;J*<4<%sH_gB`QZsUlJ&%KeY31nWY@2!tr>>`K;*SmP&63#b_0>v8bE)Z zf0t96Ys#@b-_sZP-lqi-aMcuT!!Lba5|-y?`weKrcRnVp4cig9B_- zEZ66|kqW1V3c5 zTdt>DVNe?WDnVcfvK|3nRTJQHbZGeWQFCr*TQ<&>6_E32aehgG7+m|0*rfCTC=P3a zzGR1i%(V_;<7tm0v*gmMXrk6Z>dqQaPx{)WlIP!f!_~4+fZIZ2^RlWlmsTN3=jwc$ z0T2MAdek$wxcyh#FY+`BnDd}e-Pol(`N&LoACxZRPGCu55HIAEyjufg$e1L;ufqzk zv|P{kXim2#&ow(K|BuyI$gudl1f^ARcclW>)nowki3kBjq5vAtgGC>Wf|pOJdcUir z7=WNh#<*fV0Cdm-wP2IWe6FS<47>sotslHKaY9aSVZ0Z_nSOton7$Z}Sm4dG?Sb?} z%~CAYoxBmxeR0VYF-4&)^Z8B*O2-0tKkU@^hRA?tyxVC6GL~>TzdaDd&+#P(lM8ur zz&N=nAF-pI=3QjX2a=ei0-&_xRvME-(vJgyBU|@Tla?HC=2rq{AK5lDMc<$H#k^B- z`32GsC1cq1E%DtJFA?C@BQ3|vZJ$`2S(EVFdh2PJDx^^R6{OhrN?8p2bhvW)a*zc0 z0h2?sml#l0(>^BCt}ijbHK|v0twSBeY90!{m%|Xj0c8sv+ytcT%8gf*P)3FRJX-|GVC3To?fmxo`PXunjLjlDqArRQa&Ng`& zYWEbi_GuQWNu9gx{?v34x}2$X?*j2X>_9eO3%vhd&f)k|>lA?SOqFC|W(_^-9KDQO zc0ZK+)_@V~@<5d7mh;<_U0v7arn9m63YZ}BzW z=@d6FbuR^v7V5iw-CqJkmZRlMdp2B~>G}@s+s~BlsSFa~Ea@`A39h6^YDT5pnY~_W zAc{o)W7UYUL_Fg-mVpd%IyL#Ryok*CxNxv?FefAI2)X4miKee3V% z2V;%>f3L#B&H+sPOA2Q8JMk;fpsw}C@^w_Mf#tti^`h*AHmirlC-@9M1kgZBDtrR{ zRUxQ^7MPE4=QX@;Tw8w#s#$KuW!y^VFm>S>&wR;X)zT1tcA)&e%?}*cKF#>vlaF@N z(7Vhlz<4=3%o_48s0E=^X5b~a)1WmWp3N6l!%8KWF4i9|9>Z@h0`EtRh-6e?$Y;J= z*I_H^tuckzEw>+P5`dwf>>MV$o8Io`jGu4_$51$+)wv(a_?Cus+xyMQzaG7tRn5U1GFM*E88&U7+;_jp`=DTT) zY#lWxx3ykEa^F(D8a@*o-cFia@hkHGmNRK+j)->}vB{=xJ?UBW^Di z^<3B}%6vGdfA#whX3v*aDylDcF#i4m)(dI~W8s9bU7(&}-*VE|Yp ztVI5TQu9gj_+FV7;c~B@1;Ym1-jSK> zk01g|6B+YHZFbHBL#9y>dr|fgUHc+Q4KT~xrFH?CBJrG_diM(8t7<$OuDGwO7QX9F zvX2z2(GYr;g#lNCKc+@1ak$mbbbj+5|50oGRd-QMA(|l9nNdA_)Wau8K7H2^Gm@YA`E4Q5Xb)oUah~5Q19A5ce zO*_aJ$lpHSnU>m^@5z5RPvCXu5pB`W(5^dMZP(Ga9R}t_elS82c=TEPz?1-xrZ6g% z#&`4Jt&t`}v7Q*VMDcu|4%IuP3G1Z^lWeUm1V}F!ZhQ_n`tHxC1{-f^ zXC~*SvzdS4^Lp4n-_NVztiE8u5@I)df%dL#Mi*AV{V^#4$L-0lFxVmWzkQ`CP<67H zQO~sjGRjH&T5pqf56J1-&Z`4(d7GtevLU%>Lvg;df(IAVbxxt|=LZMFF0^>< zp&U(LNI5`?VXV8$v7Cx#mIMNhu9qAXsOoKgP31%u0*QHHjN$h1G%t9<7{_RoCw)2o=*OO$u2apx_AV<60YF41EN+TIj+a%Xu3KG<6Qg znS*>W3NA-FZE6X%psrAN>8HS`r`5MXWee~m-{t#$4Y2$K(RDy{^Dk$qWbjdCSlmnz z2i(&3+S?5v;q`SRr@X0K0~FFokQVjvDz4^#iO;c>Zl*H{{T70tzFsg7FZ&#FM=ymi z8sOz1X`epU9TY4)h5xnd@aOYU z?VHArL$C+VKS~uw<1M;t?q$L{n^S@R><0c?p?|%g!n^Mr8ApwWl_2#$F0%jFYW}ec z9Z-vx1Zczm?@#xikGZr7Xi**=_N)y5|9cc~6P%*|{lEOH%Lr_T!M)3oU1|UIBK)%^ z?w~M0fGtgc;MBhVwbl&vcxGvf|9`!2e-0nwqNor1xYbUuj~rNySlZTW}z{N(`B}2qFy4)sUc5Be+&ctC*KimgJK>6^R%=!-tvHy55T3}su z_3Bi}pLc}nIX>s3kW;EZ=+&Y3U8qiky`Xx)G)@d=xl_UN-|uypc-(y>;wnz50rJ1w zoBi|C|M@w+x6#@iJz{tMX|eRjrUf{v>)#%5UpJG#0Hi;%>LckwQRhM-m1xFF0y%sY zW(!3|3Zw}6&xj>@RqAJ}c<=x-4`1tx=>dGh)r&*ZWpJuoJJ{PtCJERp0OD5$&;doT zzTl4C3H{pyA50TK4#AJp{^RO@Ed+qOaHjptCx$I+%2uof4!VgM%J>!nS(1i7sn^&vHY$S zFZ?2RGMk#PS36ADp_`IL&u zj_ob=_)C|UJ-ZZ>Z#>>&iok>2HRi2;om}P4bcR$w5giCHdFFHm_McwRDz2@H-E}Wg zi^<2ZzDSzbkoo(Q)&$o2g;^`!pMU1_TD%!ma6*d5Y$Bs!*l&TrEq|=~cWy=@1F%y6 zJ2_m4xNao|bAFR8FR@9ng+XprPn|?kC1`yB)&wjs{os`QI+%Q$sFeIfo?azh0rnj_ z@qeyLZ$xQeanAfd4_yr6msC>`XE5(EnS)CGHSSq-g@4+a9G>|h66p`x_+yWK^6630 zGNxtjFR1QkZ}f9C>l^`V{IM{qs3H+Z43Zb?lc#!rr?MjYiua3;8UMF32NfS4khmw) zW_-7Pn39wId~`#4bSwSd4SG{!6BtS%5@FgE0))pZ)@I>vkOW+DYuU0XL?%q7bx(X6 zTU+yQ+DyE{Z7BKP&V~WasC1>VZ13UG%P&z`!G82$qwzs~3arBY1Chx;T+1vv0%T`2(Q9_G7=SMxRbY7l8r`Ks z4?$xk(pgt8Ad>{fI2}1!m@%WC*sy<``MKbKM1d};zg~tI7KTxhDQ$Wl3 zPN%D>bzx%w-}zhp^I8^uH2N9~Vx_D1>F^}j zDB<%rvRhFoH6p}_*dqv8?ud%oWPus?hT>A|)9;W4QEsaVCEZA7&Ai_16xo2Xb^7|~;duC+w%{-z? zN>~0xespag9z05+aCkb;%Jr{h?IB&y-W?3pED7lM#?L{&DZh1Fd91}^Fl`PX zgOwAHRzVC!UKqj*lI*R;06iMop#A~PUOip)j7(saGJ0V(8J)xtvCsbK zsgIbIyWQKzJJXMQ0N1Dhb9t}@0i~Q_=<7_?n)l0qw6_uMpEN0wtRtACLnpD?^MJB7 zsOqJ8UyL%a(>32_sAd6<9I;@NN3N<#adbIa52y4Z+sqQqMmp&11!@W*- zF4D}a1a+G5jKPK)(dG6}-zG;b zi%uk5_4A=}g5J2u|4M$I!m`a1Agty# ze(Jcl^TK80s}rpu)V*>W$pb7gNwheWwW%N9mXoxDQ6WLtT6bkX~e1)Q0kdMCn8XYDxE2;{AepdTb(C0i9~3r<=5Nfo4kR2S4Ds(w>dBff{A;_H z_JD7^IfCi2*4ewR;_IiPnl+WlELx4iel-$cd8 zr^F!celtKf7CuMMA zt~W(>?4+V5-{0Rrg&G<)Kk;9TWvi*fSkA}YM(KAj{&Z<|$kt;oDEtVR^8HG?It9JU z?m@-74uxGV|69{^Qe>P|g=lwSZ%(3p(s}Ofs)Z9?_oeBHS_hVRF)tsYcOS8D{u(GF+jVeZ_Q zDOfpQV1e6-BLH**=#^Cskyi+XP@$8l=VZZk4y)cpz}XgjqIX;aFeH=-A*Kdi_Y;#! zdUW^1t#ztjhl@6?6We+&GF3Wk^NRdhfLUmP@hrPvoL{jw?mUQR$U}lhWvvz!)lS=h z(YNc~Ocs7!{JDKCC8q!O%AnFZ2Xk}5aH3$r=(DwAAd~V#z6gAUK>t+4`}kcvN^3m6 z61G=oi4a6dIbe-=divtf59ig+l%ci9$=bQwWH9>k3)0;_ClRw_b31&F^vb{gM=u!i zAgvc@yb}F-WgtZU%)t{E*{&Nm#ll;Z%JYv>9QZ3@t`M<3dyMmYzydp(sd90fNo%?( zOB{C}-jeWIXD91r8#X0-t~@EFV4$z&yibtyYSu@@yxva4R@^H`ts%i$dnt~y1TSm} zYj$t0c59XtcNFt(n9M@lRFd7N!xH`n@%+K=aAU))27b`s&TyQaFPPm;o$9-t2-g2L z4R1tS#Dap0yqP2v_x<+!O9y>p@cdVPjti4PwxsXVP{RVrfNrz#n%Q5{nZu+Vqe=7h4Hcu}8#bc%hA@UdmWnyKGy* zsJ=kd0_gq2VbtaNijg;GFha4ss~!%nt5KPTC>^Q@0tz&{4{);?o1lVfF4a2`hbx_z z4=MdAP#NmZccL>5c}FMPp3}*^wE5Bc;U$$_)Z;gEwGJ=8>(sBRyr^`qv0f-qe+iaq zVp|@PB#!lX?zrH|*P%15+J1NNeY(8a^-|S^RIH2pn@f|)HU`W|)czE!+CMAYLQRSl zb93F&44Ww3Z*2r~>wOcR*f0x;IK2_wtOH{Q@=n{JW#3z=skqGg;x7_%@k0Af1E}X% zS6_u7h3}l*%yKVYBEJs?b-zJvt{a*Og*3bKqQquPO`btRZPPiViPCdevVcf^+{Jqs z{YSr`7Urwtm;ph5s*n;O(sI$`Z-mhNrQ!|jMD!%#Gq?*CqYplC zWNAfHPT^%6!8_#G|B#1`8u=^ab*x;;^Nr-%hPtI#8w_HVq_R1b;wB5#Wu3a1Iqd%Q0;theHVSATUI3O_k|Q6ADp7x}F_Og> zDM;MFEn$CbLL1Bn`&z_{4-X0pNJ(O~%94KCHGoN1bU1MnmHvx0r5^$UqvCNO|SE$W`x;0NSu_N{; zvj)X)PI>!-PAH&Lmoso*Eb15oACr-#;bJfUYN3q!*TKey#C^d2DXZ;UhC2L116+Xc zD3hx{=xa_Y0;14g*Dl?QExlH+iwz+2=^rXc4Yy%q_l66Y)mTkD?q}l35b{QQm+_(n z@$-NO(v}nX8P^gQ!f|ECsVq8;REVv%%JH@?sB1dkT(LX~505^L13q2OkP0Z`5e-B* z{nx(zYY*c9gPZip%k>|Boz>D@@TgY4@_59p!6c7MP7fUck%2+E#Nbh(@DcLjuC@}{ zat#1>?Kh3LcTx~sb16kpC85pBL09opZZJHVrwP4>K!0>Ha}HIWB8fpA_r+B> zj^_8TdUHRwgP4Az^6hl`k)+;4vf@E6Jj3>-r2awMp$^uqH%jY#oP!m+4?eRjGJO>>V;e=;#a#5T1vR$jzm;3 z9*v0gAl}-r!ZjLGduiaH<@i42XeFLdPwE-zT{6RjC=kR$ZgbvU6O1%*^^oJW9TQAE zSDxJ%iq-Z~h&kw?^h4VXBd-5|?RL4!i7qde$;Q7?-Zy7biRAQ#zB{;k(NGLnAD7#p z2a*Vj+v$r(H6QbHBA1}SD~>a3-ue$p6%yVkx7aV}{2Iv^$TfI`NQ&uoZsf%TA-{2J zZi*!ly}B@k(K^tjrldY0jaSHqAHEdtrsrc1z5y!tuVOn?HFMUwEz+f*UnIIMf7Hhls0#Rt=DvLD z#%DUS(ggvr9y-YH8&y#@&_Js8(+by9OA?^xNlf+KJ#&O6g%-m)-0~y>dJ+ z9qVNrRef{fPNx+z*w5ZTVzQnkkJv1IdR6hfs0fLsJl+Ngoq#hhf~GDsaDCUKO{?>d zIe^cm1l48{|5F@xVTC_uA7B{w1koT@y1O`z%XE_tF_gE+beiG0z#ACwJ27+;s>bdkBSCgeBGB;@K$}^nyu}~1w$HfV zVaRNV6cHz672rX0lIVersq}i9l-{vFvG8o><{C=^y$dE_xywalmI12GFnhQ(oe3rg zoRUeJq0aF-+jrBfXRactWMmv;iPPpsm}#j8Ts7jrxG{H{hKpAi_vW#`ou3m9uzIsQ ze)!nn`5^O_p+iihcpQFq5?dOpn5W^^`r+>VA5>n?r=2cKfZmp0&-j1%+o@BaacWnm z3+tj~q4x{!P!ljTa$cbrs$SH|jmm)^XEn!M*f&c+v!)H>J6mia<+^8fzTb2|UYY#b zEQw#Vi&JkcRzBz5vd+NIstV!a?F@~*YAjN|?to|(l*&(|uA6xpObd?!Mv>vH{SQPf z&LFi~;Q9SJQMqo95lC`$+6+VqtK}-&GBoIOfUEd2fASCy4wK?Z=X{BncJDE=*C^&r|VTgm%|^kf^6l*0mCoZ9!bK2e_L!3h!i5O zw2w1~hP$*tH{9@rTqq=DH&hR2Tl3jRir#I6l2b09H$1D~;-0vC4*8lwul$flo}k)s zV=QqASYbsrT%TS=o7FP=qMvnrH8NDBbhHiG=O?BnGa%_12oL3$G z6REB;ULKfZeY83IC<>DieP+{bRMJinw5dIE*IV57`+j<0`2>GO=9O1|a)%Z$L8@H5 zB-7I^GY>AxbpF_OVC`SS#DVQ>{?PcI8L$WFYBlE?mloXlK|^UrvhD2I9JcUHb*Z&c z6jhf9FE3MAW^p=D`izwdaDB-FgMm|zICI?xw8-kbmfP?V@ zAL17jA{FvLZrlek?6;%ZassFv{O71M>nXOTSB2_Xg=dTjTpqR91KR3qZ|ux*5f(2W z+l{>XYLBw=LHjwNt#hE}SJbU1otibVMbSY|oS%x1Zdw0G+K z2Xt`o3O}`Uqet{EN#xHtzBmEh@J8SK$oE5(=h;SZmwR=_52I?#2b|vX>Nq!(HaQ1f z&eoJ2HMPS*d?B2WTp=XSwL^MdJ@lnueaN=44-=R>UrpF$^hQ_6x07{)gl+a`(L8V8 zP%*S^_8GDWG}Z^hc{9(qH`_kh9cL$CplLQ?eha9u5m>Gv!8Dn zA@TOKKaFz7t#ng@y!^-E_;+94211=>fKfhWL$gh>kA1ifMJd5pQ7x6UZTeYa8qjBn z!wxh{Q>lgQOK-XI;pqhTc8lBnXJi>gaYH-UlQwYPZzK09Gfv0`ljRhWeZ6ficwo}n zJpMpWdO2CI^p(7_pC(YH(2Ql!?@2f(^Uv7`%p5vWVjKp#alhZhh2$aXV%wy$m6K2i zc;4WcA$O21m)5_ii8!(z%MKrNXIOmk%cgFg(`v4^f_JjUp22|)9YZ&XwA#{dwLf0H zC>Yos{<@TW$s$W$edy1_l)S662$`uQ|Lo6Lyy=f;((DcG^mvIjhf@e|a_@9^R963M z>nZVUN;*4%0xXuvf?O|ZNl?ggdF|$AROJd!)^@ihYqC&NH&W2yMmkgZTGLS2TXAxI zAfe^~)@X^t1HLvL&ZQ1iy$xbrIlP~jt&ndjV!PCb{bj@ov^tZm%V&yh^PjI5IG}q6 zb?9D-pflDuw{fOMy0%5wDDZzzF*}p3-PB0$@$*{%%rSbdW7-Xl^$T>P_{hGf&-9PY zkReuF^?HOM7Qx~-u0Vm-JaicGG^pPz1OfVOy#yB@064%##_P-cP1k~cG4Z{_@~1IP zcODJ}J|86NKh2amQJ&LNY;j#FUCi41-W{0!C<5cDLMV(HCe=uiU*fFy$-HZ>12f+^ zY1yXXCPW7rSR#(leQLvNK3f!)e7x!o%K7W zlU=n-$2Ph*nosPiKl;|X4MJH~=3P~d@t^zY2GdD2o4DzQb{I*Z1vSM#w#XirPk8cX zOu=L)j>|XHLE;5)GFpLu8#z{_J+$`rhpC^>CocFewn{fK-u^)4yV-hHB^6)^|8sk+ zCMXYWRs|OWbAkk*+oR5G#mg{4Q}sixj6@!r%wF%8GA%#q&SRIg8){1!$yh)vLlmUn z9-dN1a*+g&$m+qQ_^czq$vGfRnr+pnUtj5cm~iMj-NSXTySp1{S3?VJW=25Aa;GYe zU;>5(?jjeYb54~cQh?b;UrR|N08(DkxLI@ylR7;vM-Hm&-XFj}O%jha2rTohR;2Vg zNlVVF=xjYcom?2!d1vT;Si`DUEG~NwX>QUG$CK(Tq=6kiAcs^ZaLjqzCYbHqaj}nL z(0#+RzWPuD4Pi1HH|f~NuW`boeut~ITJCyhR3+n^+Jv}mFdvr2n6nA|xfO2Rz-vzo zcRqLjPQ#=Rkt0o&_$wE?57T}<-fk3N85uvUT52689emNgXn>f~}{yh_(T zEx8EHSV&o_&A2ZTsa*$FYP%Ldrlv@6#k;2-E}f%bNjKgMKsc(KI#4!pznAd#0=Tic z7@=!-&-Z>j7yMlDhxZga!aFt3;<=-5ZjLoTwH)-sa;n)p&o>v4{|ZeZgQ0nxPJh58 z>0)qY-V)Tm!DiHt%~A4V7yDC0v)0_F(u%GUJzH&U)6x%l_tB} zWe7aeHR&WPw9~1+$*yn33v{<$D}r4MjIuYurL7C~Y`5L2aeQ*OWfpx~ko;%9yJZr$ zu24WVI8Fiiu6NUqEpCbo8gd{H5+jMTlQK)` zNBQ}J)hdKF>?T+!21Rrc1s2#fA>eUUPO;LL=t^wAtyQ4sP(K|Hs;e_I6FPsL*?Oei z(6g`0gJS$K^qt;bv4daBnG0zSI3YiT5|8d4hs_lmFIc+PIojN+4KV>?=Wy*hmWg&L zn(FS|o6x;N(>hZkm)q@$98;VcIv+-5qlFq>Xik&xs@VHmL*rzWtyK1(&KkZJ@Ou@{ zS{?(j_vn?LU8Y-I=*AC_JCHM!ytt*;;M#EqSSKxJR)WcfX9nA>fm|sfZWHmVk+&cM z_d1sOGWU-5SV%D6S1>z>_t7{1PRtFmA+B?)mcccc zAY?cC%lnUomj_&IArFq5Z(4l*%s`{QpK7LZGPz;*5r9JXsqO_O|6Fos0n4Y98Ft3{ zCpPoolDJog1msag2BKzHJk-1SWR<{kKF8s{*DKNOqwuK2Pc^_LzuJ_3lkqs)k6y ztHq0ltRB8PyylR*&B=N-laqLKN!mlFpUzMH42{cmu@;L+1Y9AC=w|ZFy5=o7$VPy+ zQH`y03#~OM>D^|4*Y>I zX;Zu@p>M_WFd0f|{&hHRDJkHIwhGsxYL~j}>tlWZO~UZsg6AM|`4WO)lSZjhi1zii zJ(SYWsDS9c4^K!D(u7zb8?hGJuKR~E16!{q+m44n7tCJoesrXm-Ijetv1fDmTNwj* zS@=f%$(tUY0z!Wl(LM}c?#+gO=i7S`!(o_tNCVJL>IF;+GUg8l6Brf7>dmBv(Bx$U zXZ4{(Xqzs*X(#4GQ#hX_4{F&EGNS4#iJdRN`Szi^^(QOO#g(c#Nef6p)D{+ZM`W~m3_U%PWR zU3BtWe-@VXhx;HPce~L;RWp_1GmP70jBR|^{^GQxGr=*trT_Z0R{j?bo6Z1tY*L6m ze{n|ZjDNZkDt3Rx_1RXvu5N9@({l5H1S_>w2|b(ki=trL$x)&^tH-GxGb+s!S4T~@ zhw02h%-Xrx5Sj-dPPn*oGqK&%)AQjm{0i@$b$g;~A#!W6>FtazMT_P@1YPs8If!#8 ze8lePbEDsd9aC9+`U4V5`UE(lI_(j(4~h?OozPR@&Kp%7qT|k_0{NZgC(WwCI_|@O zPrk%(%#}3u-a7C@!nfs}@FaY1lgy=j-mi3Gf!Pj3+{H6e{K=!?I=y!SlRSB=UQi~I zs@+loQctC22eH&YuB)H3SQLn2<8q&fyLbXL9AN-O?5V4;l5ebcIXQm2`;*?Lc0CQV z_qim4?Tqk3)!Vs8W_>ZyYTslNtHslFPyOea75}2GfOIOZ#T7O|C4YMu_rNDWBGs!& z^vJGj5a-*QN)Xj|5QpY`h4yMRNq48t>r0cvWMWUJS1qyOWm>I_3)v`-9RlK>Mm~4T z43~dZGT-h>@T=-iK8koMCd*{mdGUy7c!)jN1qNZQqQV!@>mOiT;S6@x66AbrmCgQMWkbSs_BQm3R%tjJW;&rmjErJ=?oP?af*w5Xtrtc6y34B9#}wjUxqe zRExBp059sJ7sqJ>NQZoqLCW{?Xxrg^K1>2-z$+jnJ6e*Zyte*g{hxF$D$Dz+r3{u| zIYNGWA^vL>F5brzH#!#excc1m3CD!3k;3@gz~OY#@PXL@pOgmmx+W6Qf2t}29T81r z>qzV*|Nj1I7p36An2Nx?m8H0q=|yRja0;`gb0TU9a1+9k?6;u*vqkxn_!TC8!XOUz zTCuJq;1APGL(2(r4Z(P~7eS=)_H5>;94%9s8cxv&Sj0R$&Tzjx;_a!J0}@!ku9UQ$ z6Ng@`;DF%AXco#CqTHCB2<_9b29-DRPec7Ik)de`9) z82u)+N#n!ogxvx4%WBO=G6pw|m{=247d1IJpJZX;Uzi32)E*x-qFmJC?hy!9K^BNq zdMVoHo4c6ZfUIdYD~izwr!g5(f?~{|j+V+!^&k zdfKllu<6dT{49mbl)fiL%qy(K=nzc;XsN7Z%~Wu?g~1043_*k?rtS9Mve&-@HOLDP z$3_ccIO>&)4W7^)`~aRgTVpwE>jR1KETw>%xLpD4|ASu(nm+sA$g0hx@SI%T1=lSXd=1}kRU*p?1+x5qBIk3jL0Xwn`x$sBu z+GfuLT#mkz@!N{)r?hPKc=TrnT`pcm0)=@`6jLO!`a+{eU9B)IM2Gthc=GY!*i>Wa zWi8b&-mHQ&maa9{V;K1g7Ksk(m7}J+Ta{Atfh|Ek#(+a(Of)>&FmSsS0iOSL+@mtI zruijiFNJN|U%S-5y%3&8bkE&^S=XHWI?jMefD?Ei6wK4#%q6UWJr+n_L}q&JJKvfj z(7pg5QxYd0l718NS7o0h!l;blnGEXvjeIaL5&{($z3v*LoYx5DlZ9(y$_!(nSBjO^ z(~lku@G8cz*1mpyTr6_9ky7f?XWo)N2O>pZ6UiLIQr7yHH`(#8sY2NC_PF2LVpEE; zg7P;qz2h^|r%&FzzNA7&RB;G;zl^weLOx}MwN;z6rl&>&?ol4m$Q52K93?YBpN32mn z)sR$n0wQw3_o{h4AO)}wm>X)qA)4XrStUn_sG4Jv3u;`8ljsDB*Bky|CN=cZE&1b-gtSiO^MB;!W`QuBb07%A|Sg5a4W_EaU`o}vg-bkZ^EJ`}v`id;>^k5%Lo|861lCm}WP z3U-fumOJ)SQ$XlXF#AjMClF0HJk~G}68tPR3dYq$PJ5O_`{|P!m+XRX=dxZTeel2| zGba2n*Nnz#PjIAqT-WK>oh6+2KORCIDgJ6obPr(i8Tt}vW4UG++7!JY?@9g&hd4DT z?Qy0`EU^EQ`y9ozR{H{1T6D_-2uqQ%$g*vWsEHuHGonCMM*FSl&LG)!i%EYLzL%F5`6}W^!x&AKO1yv`>M}Ys(3sTBX8qtts0Ht#^QbjZzWCGMi@uJBbCgGi za9gf+Q6bS&)wA>MNfq#3>5Cf95;`Y*xKWNkAQB@3qwc{G93p1gW{%C?3cptz%~mM6 zkXGZ>77N=-5Jx}8kZO78r4;oV(|Rb!l?mxT4#K}Ndes8Nl?-uCS5yRZBfiUm9*S>b z?mF;3%}4e?8vr~Lu^BvSdX`xDIfchc3xx^&>Ch^ZSZ}9tVut$0;FT6{l=$tH2VEjB zB;0rbOWO>KsGdsa-t|En_Bz|vPO0@J`gE~fr2EYwgE`mxWWYyI=))v?qS_nH0nuB? zA9nNt<*TBaKRoDFCO$N2=1q2Q@mML(2A`RiK)@jVs%+xie8=!~JMVKcmw7m(<8!pH zO9(mNv+aE@$c)qv^(q4qQ~mPse$%q3BGndF3Qu+~lC=jQw2W#C-}?w|uYL!Gh;0vE zk%BSoek@8%u{5V1&9%0ovHxtwS_x>D zM2(5UWt@Jy&{)v>aGOZwasPvL)DNV3ZFF2555&0;eURu^LFn_u2Hp`6iY%8V!{&qQ zQfbIR$)KvJAuzG!vnX&}e1@eU(vQ{4m^2CM6;!>>rRh}`m`@@mCkKa75Eqb79H-TM zJ|2&o#{Q3z<&WB>xs72_y^jKu53sk^gLmgU9h8MGPh$Sj7 zdEEw|n(~5pcj1m@y3!%>C3+fJ?>9r%i?t_v0^<41OqHY*quh=cn6z z!*(B^IG*6d%Gq{ll)rBFr6Zy@^sLEteC*Nreva4bXFp+RYf(Z980IwB$2WHI$eeS* zS~99FT<`QW{W`}MY+^ghq{G)n1F)=YpA6K!56SH>!_C8~uAE}xHVeX6k zM{Vm1wGMrIuCpI`-$G_8(DB~GXAmGB+U0}vPZ_7QY9A_5>{ZaqOcWer*avi|{78Rl z2F`$yS_i9&{2Y^H{AV%G`WVJ!lV}6YP=cQ6D6r{Ob9M)z$9xJ7ItCgtE0K){dcKnP z{Z;I7*p<=_d}jEZTKW(iL-t&XZ9h~*)}?xs^Ehm2XufTEh%vU^L z+XkAE6xu;g4qf!nZLbgkP4M3N=6oA#Yh|>y0s$Wvw`K1&(97AmSW6%xReh%T-tu&i zMJDGJp+Z{lTw{x2nxr@x+Dzdb6gmT`)onf5XSeN>0@I{GD56orG688(fBbqQWP7a0 z@D5H9TPKdcBWKk%bH+pGqj(Qotf|Y<>JMTbYNjk}5g}x^9Z_(l9f|_Zl5C{VmI-D9 z(k@;Dn%m+?FepA&T-D zU?idKHQ|c-ncS(wRCbm|N3(1vuO~m|BK@)lH&QQ6STiPNQUO6m;041@#~| z$CDGBbm8}vZ61I2>wg}0|0qyvAB9;U>4)z9;hEsbWE2G=&oZlk&7TlT6ADqz^AGJvCbccVV z=zeC!uL|pFnwja1m`v7yHhofG=Z>mU$r-6|d6ByisEQv3A@An%9(Fup#>vzF0#>I3 z&TLEzIy1k7K@bt!D^S23jjD*DE$_V=NYD&|JQ<>?_9^>+jJ*X^Ra^HytaPY=bcZxZ z2+}E_Qi34e(%s!43X+o24bt5qCEeZK-68d@bMI^1`u)E#9E=0PIs5Fh_Fi*7^9fK! z6V3RPJ%q8G)I>wVb_fAm*%#O^a&QZru%0Kw$kc}%rN zV76#oaxv*T1qY5Yiv)biWGtY%n5Zk?-@|>Ip#9Z=K6SqH$-lW;L*4?(cXS7XPNG`Z z>493?=~QQX^aid5*x+wfF5j%m+CBYQ5pvB=V|>{0y&EHux3CyyA>P7~^Yq3c!FSer zVk<&ABWPpKk#%)_9FeDKok9On&^T1I4i9cGswK(v&j z9>(!OfD%rre@L&(E(GCpg(}4JwDpsn&!Fc(M$zZoZVpBBzmS#|@bq+Gu@E{1S2%?4 zJwox(LIkhDxmK?dK$9Eg_s3?G-;&~C=|@>)sXG}};d)N3rYQ--p5V~y!K^y<)S$nC z4PEDQ(zu`lRExSTzGzSt)(-C*zpWo{+}-8Nk|oT>iS2MX3;4mWVoC`st$2zn<8`Pgrj39X%3c6pOe90$oah7ZuQ0Ql_~TjN0h zs%pKyn8(dMUc`{C*$CZ3t``8xa?DF{h*($go$&ezWy?h>%Z>3k;Y=2RaQ@*>bUOiC zl5hnW-9|v@fAF11^yfkYP?n=(Fen<-vN`gP%Up1Ea!E)Hh?zBOv-V5|Bilw}?c!HV zxk=L}o)mf*PFEHM5c8|&DTX|Vlz;8L)(#5A6%dB149hS#pYi|+yJgWcY5V5-GJ-1T z^;giFGSI~V%YZELvVqhWk5tsEIJH+BlrsUx!t1lBbhThe@DY^bQXu=AB4}My)f~Y= z{FVC&cN-CNc?MR2Nil7y0?sq-K;!dX0f_>ciJghKft=X{9eU>6<-610{75A zH1MYk0ja%TDYIY^HoYqOC`FJdIX#YfTh(^rRFCGwcl1a4% zGd9=b=lfebTCIheWpvl54z9fhIre{YYF2jE!fv?AJlyyLPAh-#DG#rBOj zDY<6ReJr8JDrKYWD|1;F6JkC&UVxzc}^Iyd>~fL{)QTaj6to51=A(Yi|+3YU}|8j za=bV8f^T;mFhMqf?+a+~PvGAkH;BPH&Qe1^!{bZ99f_!HF=Y1?%i^#4NtaBfV|KD^6`y@^n@+ zAD+kG8%NMr&9t9Y28Xr%0q8U=y*cH%nRs!HR!QfaaudJ-t?{rBiBLb5t*6RX;duUY zClS?C$erwOjX3z0#|#Q(Bv8d5ti;mt869?l3$?VDY)Zq*YlEWu&$5FL99ZmHTwmhj z3{MRa@X)02L}>q^a{uQO{r(e}7bJQXxDx*(Q+j@Rb%)txUY)hlLG-n&8v*~n9LAr2 z?a`oJw(Vzv1R$VezbfDs+ZGwju)V2#)8RI__kSlPQ&8 zGF$~B~<4q__UBV)?Ux@qF>z!)%%e*U0XlR-V7LZ-2gcJ%A~L_o9nM ze!S}6ilE=Vbxc33&R17g!;x3ID2$K)^2C2R z)j!UTZxc8*eoa)tLjV4e{P?{;{+RanJe;44_wNq`Fem|ljKSwf@JB$+-~aosXIy%s z+4#TL?ayO~bmg<>}SO zXy(3;Ax9{Hg8*6Sz>JFcJzg@lEg$1E#vL_8KKt6G7MWis_zu*Y(|xXAXVQ~eOtWuy z=83_)0H=lKtx$9$fLq9=c2$clm*7l+9fUjDS0g!MF%2oBRO#cmDPi5dFsB<%^M?+q zFq@-}3bV$;{rWRC{ERLmOo`m}WF2-t-*N&Bcr6}8{b+0QA0L8mB+T<5JeoOoeq}I; z-m`QAuxx0u(0iDU8rREm2!07n9Eiwgh6E3nJJNMJWI}lyk)$Tj#JKHGb7`}I@ex6? zUCP^)8KJM}F1aFo7d6aN;#%A(#Z)G>iZQ=#J7lnTE6bJYO`?Gjk??AF!ebDR;i#z!8M1D$WWb98 zv32%6oPG_U)DFoYl!96 znk^yK?_;PPZkv!%)5&v_ev~7}g%ZJH(qAha0s3yODyP-5F9_12{>TMj^#|6x8gG10 zqR}*1TiAY{*O&96r1N`wjHlk8;eB00n6#Q+a9wM-Mblcuvbws}->(lAy0Pv9nKsP0J;3AT_Pn#e5i!Ned$u3W? z!QgzhGvXG8<0EeYMG-}~l$a5mE*{wq>NyIz>^FL52VQTyy-a|B#HxE4*zZq{5F<4r zZ5DiGFpLK?+Kyed8k^bqJFpWmPjhU$EtgtGZ1kHo%eAhZluS3TZ4Xk?oNgTbOcmj% zXw+%x9hEEkO%zWAX3w>9=_Jw5MWCceJWsYp#SR`8I6OVVXE$r7v?dk}r+ys*)Od{8 z-E*Y7H1c-QUm-pV9Sd_PvE=S``V+O{?$;DK3I&mptF!OF>Q3Y5&LsXv_5dHAL3s@WP4lx6-dknp9amZYEHFWFFVm_>$CzwN`T1bjrF4 zWB^&4h1MkSx0m$AN9HLnNXH#Da_kQRv-1sg2f?-!AE>WEz;Q*qn`NPu|CSm(0Mm<8 z(GJW3!*s=?I$d-G`CIw{Dx?naHGgqO(uXb)E{WU=%mQM||;iSzU+%wGGW93qtlcz?*)VNnCBoprQNv!6h5+IadqqDiU z_5!)|ro|6E%{-A$@X+b_{Eg8_J|TGzkqL7rUBJOkg)tI_reb*WXPM96KnoRBiNOWf zxWgiX)KwrCDS4zVfRGLZs19AfzrWc9WF@f3?okYCgKQzphKCpz0G73yNlR5j$c>+$ zeE@}=h1C<=L0YnIc-afQ0wq3kynaaaDp!}swJ{Js*V(GVh~bq_aAvW@BTp(Hfm=7% z<)xtbx)_F=Ra7C9t9O3D0uD_f9%a_O?`o!Ps}Fwbtwcjh4QZ5r@A%dRXstHpad8)`V@HsU;^oGNVJ8O;CcQ-X#IDag#QoH5@I zXpdm|;4)a0%4#zH60@~ZN~_zBU|rwCuL=%vr~bnwItDeBR01o~6+a|i>ky1&wp{Vg z>UE!gIw^SlX2N;+a?hQF*zNdJIpH)xzh2Y3zK)P&p)vxH?|G&n=a5W1CEurB2XpkH zVMnhmD6t(cm7tjyON;J?z69PEdtDA@ zkBA6&mmIJr*nq`2>12f?`dEe*xBjkbDm{|4laF1`I>|4iEYv)N2C+=dMz6tA!xGfB zl{d#2$1yWl72}N+*!Y zRD1NTNin|K)>iPrrDD=MD7}-IGUbe056^0W48lhz^Ky~%9xNa0x+6~_eGKta!``mg8>dNq?p|>J8R;DnGdArD z-^>2@fw2(O_Y*Jx%Q^`x8H3m^OgkRQDa}iq*||p-@quSOlcauNfnqex(NOlG;;gQ$ z_4`AyJliey_7}vi+nab|yYi1!Hh7IzvPWd{T^w;)R-Mc0Z7`p3&vxI%k_PjcYCbAJ zfXn(wQ;Ar1DEGBKd)+gI;9{QBZki)@#}Zi=XV&D~5!6Q#>Y8es-83RF}_A6FOwwhMnCqd*e?yKYk;i4rH2zjA7ET^GRPS=Hu$~|7tFLCt>zg^nj?JwAu!_ zAf;_g$Lox7L01YsfQAi#GC%6h6tcUWwNrjY|C-Q&&lr=u2*ob0{HR2XjI1=?M3Ib*Hg> z6ii%_^;QFEw!C`&hw@i?Of3~>91OedOzt7IqIf>MXFgfL!jO!F&5&y-8Tb?p#ylqx zOx&MDa|i>JDsooibil@C;r_1uY*xB;dl*$gFB)=bV2{f}#sjk$b*BqmTdjA8`h5ul z6-{88M5?a)C5qi#-IJ~+1jcMCH;r0Gai&sB9H89$gmH%TerZxQ*oGoGh`W?w5}`QwLOVJbGAjkAao+GJviNTf^nGT3_Qe0Xh9y z9q4J7t*+s=Fc5aXf&KNO(aRc0IGs>BqggT|8>1?$4W`NG-Qd}+SGr49YWCh|eOn^b zZsY}Ip%#KmCva`s)a59IHcEjMyO^@@OVScXThqeX)l zl~%b1KsI4ap@d1{$;;Na)W8QW=6()Qza$fUNqyd}#0(%o;*b8U-hJ6%lJ*2DdF7321|0u$aM!a3WGWFx7e?h@OciSFM; z)n@Nqo~kHRD7JgWCfn^y!TV_}(9VB*<@b=HmYPB)SJ7jOMFqz^cImz$efGpT3L7K+ z)SUaJq<<9k>nl$q@Hx1X^h8S!Q)}h&TptfrzjSDP4bSW`-}C_Mb)zV-;qa!;+2_Va zZt3OJO2)E$M$&f6k*`vT+0;hEL9B&F>(unjUstq&8>$co!hH{58KpW}?UCJT1)1>T z06=1W{y^FAs__zq6;32y_7IlVH_lLNqCmRnt%uL+ihQofvsw2!YR>HS>(;4D_5A57 zwU0#lbD&%OM}GlCgM?|jwS%pWU;)YY zJno-ObZ0qpRlJwSZrK-Sb)@GJ5ya9{mB^^UH>Nd;U9t)2w0E`NExHb(@PA3^tWFj3 zjAg&I9BB+1I^zpBw>Z(mlx=V8LYAJLyH|?yOqIfyeJlX$SAe%bDcQW}0(vwCuLq%) zu2ds{!7J*#3)NX}e~qHkoJ~pYM@Y5aH#uH(Tf+3rV=t1D z0e&pm(kT@$=cfhpZx}3w%7p=%aHP4U3tpvp9G`YZ>xp2pr#GA^QiZcd z%I$TZ95J`_16V3%atnf1qkiSBhM6c?O$u)g^{oK9a!^=(v3ytl`SL8v^?SC}x7bVd zP7IoO$?8*(e!DT**1I8_d3^3}#@zfY#@n>vnh1w()cvgJ^5*WS=YMNR>#|| zKF;G^(D*~}@=`exg=Q^Uh5kB)?4Q7eCQRGgTu22z4L82Z@Whhu%W(vcDUMA@G1zSYOEpw;%R4-de7 zVq^`bRjB;@`~|VHnSLh;hL>?>-3us)&X%U2eGBhGl#RqiCVezvqU1B zZwo^y>yw_o=DbK~{FvEl^3c2-7A3w0#T^Z#1G5)#2s=SNO zZkKz!d7Vx!Mf65X2mk%sy40!{5r7v(E1#RTLt;K&sI|JspP~BwGSo%?H2x5fRoX%C zDjr>|OK!K#ksZ=Bu8oh};5&P!IWSSD!tPkJI(1lKS#b&&nmJ@SHXCu{OGRr~g8jqM!)1i38v$hPn2OJQiy2Dz1Td&HJqwM05At7eAn4;2I#X0Ie&f zQ?y=`_I8rc>{pQtf)Cg|9X&^xfvws;M}M{)G?W@JW|TVekHz7!2tGP^K`aIcP-?a@ z(V9y&b~~ZUd$o^L*x+kngCtTj5y(!*s~3uPKN{7Zlru0iT|dBD1x2vITNy>e*;*fx zdKgv85$1gBAVThJOBNHpa=`c;sAz5r!cEmh4Wj~9)rT|tXjTi0BBo!h(m!TjSq7uc zVPe+(@B&yiX>$z_JcOFTU&y;X#H4L+xC`Cgw8^dKdDwWsvBh~7&)~v36Zm>8e<*^k848A$xfXJxN0=e_-Gv8J0JZ3iQCz+9;C#bw>;)UtdGv-8K4{$!+j%3SI z@z*HJE(URc8$%TZ0vCa`AdW0sw}*Z1USzi1Y&dAYw5ECVKIsSAlD5nq9h2;DWm}3O z>R!A*!Dog2c(Tju^kwBG$O%ca&U}?$!JQ|=r#|gqWUEwQrd9_}iZ$LKs9}7)KYbRr zWZ0jSyggkdy9b87Ps5HGYf0u}9VdW%mXl-aL#cV2IWZ`mj*DiyEY01Arq3p0)U?l(fdD``vv2leC430a8QRy>r(1HhK_abzotz@(FJpE4f_@oW7S?`qj_y2Iyo zrfsuJi_hU}zcm~Iu^tE3aL3gRoZoC080@-xk3%NUR%0y7zx`wfc&6;7&VuS2fUpR3TCGnK2()pWbi3yv>PxpZwwaTtTqQbdmMvj3DO&P;A3Q z@>vY6i)y+$3|$2_eH<9NMmi&H2?h%SU(m5-!m`}QnQT|35}sqo)Y&1Zp@)E8(qgU* z2`M(%RB_kY;dHqpUcB0FD<6wpD{E_;h39hpG9X%9ES1$d_(*$ds#w>b^^1m725wF~ zn1W}0qgf3cH`(>F_B~i~TokV|P$y_`MB1(PeW{^Ur$;u3z4Z%>F^5{XxKBWU2KvyT zdqcl2F_IY6{pBD8bLtNY1JLwe%(X{hK6J#Mddsdl)U4yF&Ls>Mt$*liMy1z$-@2rA z+{Gq3FG_Xi8xlRNP-s6!Z6yk%hUer9ncRfc#}udJn{w-r@s6cm}&od3%iO?W~H zxaq$1`&#+CBT08qHg0^a*NsI`T0>Y3WzLe%w>fgh0{Xc0eurwI?t){y`=I1!gY%yc zNQ!|}m8v+AG${C2JM{Cn31Bp7-W2Q5IL=ne_y<6BVF&C@=tC_Mi?lLZN&E&4&mi;% zs@QO+#{D@X`yJpHD5bnJrVp~ed`qpn0W&d;NFxol&GVP@r2q^b z`SSr0I~W2Go#ATU{(A8r7=I|3yi8PSbBq3E+|Yn72&N$i_~Qx>o9BEB@U$Vk^Z)%r zmHTa83UGf$;2k^k+n8$e%M;t6FvwAnQFuZ)13*i;404b^S-B8k{8rA~K|Bw=gTbrY z84(7^Ru^eXw9YPGp8|g#hwxJ<`Q#;n3ea87VDfTg6t{^6Uj90apT`3T@v(PiDjhB1 zZoY3ZLKI`z6iUmlA6D9KMdqrNJb!g{v6i|W>H6#3{eGf5 zT`$=nAx_J~9butdl6WA>BNKx`RXD-zyWz%IMR4w1q2Oq~+S%vl?PfEG5H1;(Qp7X}<;nE7puPf?DU;g{Yp91GeowW^^ zcR3jJZ>XEzwc+Z%y1mg5g@}59@s3dsI#AqP0IXwpkji$G6>Zo1{&_+}YaqTHslw&V zWGJZ++?@S>i1PN-nmDJ+Ia35LiXUU_|7Dr$Nfptc9XK(RCaR4Ki0+@qQ?J@zKWcu{ zCcD5d8HY{nWVO=!7|=v1ftEO8yhvL-0EhXFr*vwoN+<}%mXccm#9XMY&=8mla7RSP zpXaPB1}iKKV(t%Sq26?4)YiM(6R4N9I*Uk+=}L;QcQcq@9izo1sRb~nJ^AAA640zR zPsvEGZg&qjw^|l#9-MbZbj2jF8a@fWz2`ruIy?mG;z)FiA)Z(o!(_ZreKuEB=}0_^mWI<>hn?B|J73baM{$F}e%zt*#$YIwJ%izFZZs{;wq{Z(&XZ;Q$FkKnG^R)1XLBVJ)oMj9RU`$%ev2}d z(t=rPTZBL&;t=v=7oPfdB9j*;Qj!sqh8~9sB+z|7CK17YtV)eZ7d~dk{5(9GNy{bV zi2<_NJ{-!8@)2`T%+t9@i1i$$wx{=ZijUYsMQ6aUENQ&R>mm?`Z~E!`T1P8!U}3)k zOl8a4p;ZcZ2yhZJjUw1>O`O4RTFo-?+HHRxy;zCL8mxEap7|io5zD9Bsbe^iQiVYu zqS5B_L>f+ORs;zo(A~T^m8Q zYJq3LdS`Nk#B~4Pmh|t-yGe-TeUbb=ij;`PsHcw|tPo6AR0b zT$#{MhyX;eP9T_oxc?oVjCq$4&>JRc3c4hr@L#=De|hUApmlJPBpAve`cMhvU$iD) zTx2FLANBEvfg})7KLzzqGc|TyKzYFc4fkN!E@|CxqS)tD0aWyyuA8MnbigYAiTMpw z*_&c(3$tVc4-w?=&!#HDuo5TP5ZGaU0%{r~OKRT5Xa^7i7XGQmeix5oiW&^-3ME*? zlD8+U4RELAL2m2{K%l!I;*K`r%=OQ&5_o6=@!3CxXUTN7AfoHs-drE7lJS97;%Zzn_TixQ?8dcrb?InU@WB1yh*C0C3n4loBaB5P>yk)gFmd;qdAQJG9*Q?&YMU__r zk;t!+Ga_>2#lc+F)`YWIKkRJoR$vDC=Aez)^ANsRZ-?umtq{n#ixTivtvS|0@XYHd zz)2Z!{hzZOj}uga8`K2rpEXvkM-K}91alDWpq)nJd-|qN?d7$lD`ZQ zI2(Y+I@hAGPU>)z3k7-(;iLEW2x%e15?2#oWS=81FchFt1$d?H`D)xx3v6S{v#*MD zKlzGeFgm#CSa)1$AAp=XBXQgQo37_ zj~R4P!trTjGHgbqLYR_iOYC;1H)Kx7yARMQvlpR17A&>hhJfjeI6(O1NWGsh)*Tnq zR+h&&h)bU~Ai;l30F6x+6oM}3!N{W+uJe!*0bD{2P_$=OsE#FKm{oi38WFtUkL?1# zs#N4FGq7fq7XkO0y1ljlOC?)DL>SK$ zsnFuY*)`~#;#?OWPZzf1n}=Is_JuH~(ki2h!+R+*jDH|&rgbt|0OaPa-A3;ZHZ{6O zdU-097HBHM6@}EE+jH3Sk@Wh#s!r1xwsat`F=}_J09X$gx);7wVsfvq*7U|N|0>yy zgODr!EEKr2)?iRjM=`p)J${h$h)!BvKqrEAbH+G&1XPjflnedqgvoqA@K`?E?7aw-saD1}nLd{T;f7%MmH!sLosg)>k3I z`c<*$j_!00g?RNKi(YryC3ZkWFlHf``9wYODmGnue+SzP@L9`6D*vxN6M{s1ct#?l zcsd?krE<4AC%mWs1@m@exB&ucG6eU4Fb7MuvjG0SoiQx^OQH2JL9Jm=Uno&`K>7h zI$&U-`F0P16KN$CEN3t1AVQYjv?{|w<=`Ty4&EbRYQRi|kCdR1O&{br1N?62TyGPn z&=ye}Y_q{Qs3?na*Op^X33hpj^UAIh{IQuZFWv{pvQsYs@Vadl@_2fHlfrONCp%5- zt?I0jACRT(eur-*_JYcBJ~P`qyg!E6I|MKyV}ENP!TPO~`{!en2mxu+W}%(Vn%2A~ zc(WN24mX_8DQeAAeDMg7?uj^U>q9C1<{h~_?j3A>ARa)FvAOkxc8cp%bQc(Sr^p!_ zXp0h#!BGx1rWf*t^8Gy+N5E(d1(|pFV|qg)-&DN6pXh89uXt7RgxDL6gi7&WOPsl0 zl!2%UxnsycvF#2;D=(Pxjy$Ut)P2`xJ!cjmi5N zncka;C~bj2_V+#NUmnkEq5HC$O~;}8ctIw2D3Sx-^)YOw*=l6FJ;_3McSqv11?~}1 zYu94J=)QlZv)~15)z#u{+4*s$>x4-^|4xO8PxmyW+62=U3oMpVZsTJPV52KIh#sTJ z2`W&GmLfr3YBd>H<%#ZimKWa7xalg-_PUSk+^5R(luLnyA{Qe8Jzz{vZ6-%{g>yDw zPS#dg6I0_S9DIn_fR2Aoq6HWionKrokQi2Ga-&O#44CC}$0;cXC;}^v1t`(~kdlWxDKju)#31|WymXQ}Bj-;i3L zXouMcM#~hgt`DZ?M4As5dgdyZ$&}-7;k1~8z143x|2kiX)zXawkVi%Uz136~U|XB- zO*_Lo26ObKJn1U3<#G(&D$LXZn~cNDOMvnt+Vt(3K>sU{7LxAz;X(Ela2c&m;=^EF zY7L4&!t6Az@^!&{jE9<|w_YJMVziRucD+26Ec9qlC!`uk7BE|ym5Sc_aE?h1zcm2n znS&Kl#2Z?wDL!(wx_F~@bu=1_5emmVE-Vg(31@(zw^3zL0Pa*;kJ;U(IpWO~wVzj2 zwEbx@^J8}Mvwr;f;Ew0Zwbq^230MHt?D)i61BwxGkgmDB$pzk~*JlPpnM})c$4S2p zi^lgZ{HZp6xO5q`rZMc7Qc5G$lK6nQ?3d#g09>f0_;2ae0LT5&&gqHvcN+*NNjd-Cjh=6*@f77tPAPa_{j|3g2}seUz!xPF+&d)ll1FpZ^U~)R z^PMYp8;22I2H`#uc(JhwSU+9EFe-!3<7}bPc`}WS`WeML%NN!Z)a>>q9|O(zLuPgO z61|@6{1Ya26}ZQ>uQLMZl}n}J?yVQxH+y0>n^czF~H6nixqnY574%--xt)qp?+vc{EWiof}xuX!@;fuT}h(}b{s z;D%TxeL?P1us1`J!+0YtBT>3;fOq}!b~H<9D|JKMNB_c7G-ahqQ*O{)l0Om4y^U5B zM%$rc%}5TUs=WaGln5|I6a_VokO|ZnTz*mJGe2m|w~xC2B%t{+-Ie0^G>NhHcRfQ% z=ySMPv)9CMH*}=Q!)ysM>(HHm!5q zaHZ70-8%Ox5n;@&4l7@@-u&O4;h&fAGYY^t{Nk(l`_=m&kI5JTj6k+mwb1_mxcb50 zle~c{5_;VDuLp>Lpjv-bVWRl;6+;~VUde1Ig%pE`KW3D$-_2SH+XU*5_xwlCEX)Sj ze8S}{O$UEp4h`sHcRnV7;=GHlpmvi5>P0ZoYgiedj}fk;l=wf#m5_7l*$$z{l17?f6v0N+A60Zzrg&i*XD^UPK18{+<)$943yra_-DOoXcmHnbpjqM*hd~nR22;Sfr zj>})?+SB6Uc%`Lxu0{pl_@oaqcBF#3>(g-;Jz;Yw>BZqM>S_RPQ3<_&a9_O4B0{aqD%}Pm4SwnlPfAnz%-Cf$VB?AL>OBwz zRrBWLXlM~0g`nRw749U>=qZ2lAQkJ!?!VD^eI+3LUI~3~?LS?U{#Zw-2ytAtVnBhE zNdd&llvJIDHFuymgeGg2TQ5?=M^-eI<~zEQssEWw)DR_-oq!zgvQ5`>Xkm zYYlZBeij1aU)M(^+LzZ$j~n5OozEDuPI|cqOBBq(XXdNY@xdAaTNxVeIO+x(jxX-P zcy=Em&vqf9J3OLh8{pJpTIR)!+xR|#N2CZJSO%& z0G9&r&8js(?58Nu&IPRj&bkQB|B5)9aTqbX%Gf3h~4Pn zhlu}yi^L4Sh2~ds)=^<4^=>j6*$gC^IijR1FdAF|5|5_`a_Zr=jz=2~At+{362vcp z30~X31!a9dtb@uK7)!<|)Cwa8KGq%@%U61|!J-2Y;6du!kX4|f7nvwC&Wz);RetiB z3m9%b#gaxW%Yr1FME1n4fRu#(Bl%nhO9=30!cJ6y&7d06lkv&~ooaO?l!C(T>RhmM zXR=HjZ2oiyi60p!Kz|E*a+r<^cz`8*n#nM6)5i5tWS5>?AXx6x5YX=T*a0J-W%t|5 z#Bhe|7-Q90rXp8O ztylt&W7$Oi>fScKX~wJgR@)v@l(FW-)`xkOT00oW-kkhrs$`z{&jJQ$06!uM$Sn{m z0fDqH8Z+Ou(#*PIT~H_?*CDqF-qJO9M5>ZYm*Vd?6bBd>vfS;C1m1?3#z#1GH9xl` zlDmm$g`EWY-awJ^t^N|elZcu=w-|o6hsS0Z0u&N^BKfFHeSi&Olt|%Q-$* zuX|-Lf~C^scP3-lfK%>8XSgJA47f7JAmgpJkFwjD6bDF)E--Hx{CcaPYzA?llVa4C zdsFv3kYr~;6AbkR%Z#x-RjRh0PuzhWjH|Mykj?0}I^D)K1e($9nUWW3{UG07^k{3$ zoFtyh9+-;dDbw(NJ%47mGrJ^%>dCo!BH9)-Sg7?#mw1{7oE0i!*Yo6ZSay30`>`@( z_AJ?oeBf^KT$$CJ66CCe>L)lpzih3fl!(JIx%U}7S?8f{mrbn!@)IE8p#ihnU3&;| zvHNrK5jTKg%4>AD*m|sQzXPl|4LG$xs9s8?7Rhuqg5K}5=W%(?jmIh>fG7XWc^Iu{ zt=6JZ_qIUR2R9Pqz(W*ZDU*$q?;{8eU;TDFfaPf1TzwXBxXMnw52Z0i94pF!tm#<< zZ*mW@ZQNjnt+C!{w+7-GtA&m9ssy9#k*HK|= zZx1pP1K(=K=c;@aJaWIIde6FxATE;QH^9q@*NhQI$txAky^PG>2j=di0_ zNEJ&U(fzcFfZOSfTRfW@@Dh02S|k!7DlIIS{7~L9aqaaG8wPJd-A#2bp)0*=siI~b z^u^*)-wKHLevWqPzk17L7%CtLo&Lfilv}|}ss61`kp1=h!0eV7;DLj6JEWK^Ffi0Z z-I~-tS+AWLfOqX`Az3we%hdUqLOiOYe1|*j?KiO}T1^hPyiVZ~*DDGTH-gtDPhb0t z+iCk?5_vYktWg6C*X;9VJ`CPns0t716fn1JjwsXVcso-7tQyROV!r0c;Mh}2C8T{M z3P2odU!)Kp`IwtoMMOGQprIfl1;*7U%4*vAb%^NhOry#*P2)rE-%tp7407{%=uDIP z|KYeI@CKp@dBf*S!2RpC4&$13q=;tVS;LAF zNi6-aK?V_v$uNK}-&((~6ST0b{PY?YQ?NPlimf|JKulnJ&j1;Vw$P~YoCFMaF%-)L zuozU6rV3rE`m8tm_>E6S^QH_EIXsZLE3Lfc(7u1bL|ZIxsD?4?WYVuBLVgtkA}c#- z6{$g~{OSoVwxd5bJhiZN(A9?a2?=rT>cKqASB$u+KNA{u_T70c}-@}jgdymfCR(PTE97_Fj|0; zeO~E!6uIhrIg;v(vUHP|SNryR)8Z9GIFA&y^!zRiV42v2WS}O(F?4B0phK2y^4x>0 znx~5ID!UH&gNz6F7v>Q8UU@#F=THLheRbg_7`qTrLs3A?igZAi`ow&e$5unWK;1Pp z>E*tFlD?NLDQKK2duU~rDHPC3kv+NVKF~Qt$y+;oMM-}Tz16)H%3 z=H#gFar;KY*gKpr_k>+~#$fkqgzyK$tI`3`&?@BW8Rg9|<5!qUs(Yc0|Cn$%G$Dc_ z^PR?>xIbKwghip0w1qpgtouLtdt~Oc%PJeB))%q~ynd)$^&&oz-ti-e+S}K}NP(Xo zy?_;MyGzeuHd{+Gk}dz*7&*Kno+=n<_oeXM_ivzAgv333S^+(E88C+j#`zTE5}!H; zDd#5bj?gI(8!UFNbY-UrKEHQ_0wo?J?DuekZ`#T6;hE!ie7aBgw^ym7WQBNEVsVw0 zC;I^97N^l3SPWNejcE-tnW+{5Sr?=h_Ha?!5ZMDxP{`{?FRDMfUx~iRk|~S1;?OO2 z;kNnG@NMcCmt~~0O|IRP3LtrAG>adl-rZ9y=AfXLh&!pBC@^Z}18kFtN-b{!rUPe- zctyV1?m1cFu>x3LjWG!V5(rQ~Fawg%Vg0tWj}oQgm3J@a#+reQXi{e;fd|t~oXR-e zJFmivgI|kg&$NdAXQA|?@~x+wzi=L#3CN$gCaKskM?zaAnxh?V3?0c_1L&TRS@V7#!o z03me=GCr8qB#&m>QLv3J2PL7H^>{ zWIDsz<3<5=R-j;~@yB8a2O~wlOou1FT1SnSds#Voz_zn%P`9hpDW=pAW_J?A-1KaY zJb8O=LD&pR{i5Ke6!HfHrTz7rqdA!()wnC&V1ByX z-{^ffW8eH{0*0a`RxW$}9GFRDb-o9iC-SN3J)*PIWF9XGW_fO$E&W8d?2j}mW_z=B zhXWsokubDBNK7Yy#5W`P?6t%S5triojA1U%ql;%1w;P_p(|d(g0Qm_^02xgFCaP4s zn88uSO59YGx|@>ro(FgM3y!b8W6Kzor`{{_v7>pcK@U|CUVUa#uP0)C=^p{edSy&_ z-*=>yD$L@mBe(jK>w@|wUMZgD`8>$Aole(YW7rk-vMSN*4KZ@NrJ*FIZh`sjO#jh& z`jSJMBXTOQ=3n)pXCZ2#Sse%%o?x4<^$>lIj=fs5@MyW|oBtr7dTCqAz6Q7!xkWnc z4^LdsE0O}=Um?mHrq^8X3?AH<2BW3Xw7f=jM?ogcSgZ-l#g-kXhQUNKD?Ocqw>fUv z^N>_|EYq?2x`x2X5YoAI9HTL(w#typHflUQF#x}mNf<4)=G0_;9aCImHJudZvftDx z?_urZ#3HZkL$?K`h<=s*UVg3q+l})JITqwo77DXk2j#EE3M^-x5hJF!-_1aziE_P8 zZ=BN6%-19vYK>$sfQ1W46IuG8rnZUk4DBZH)&vfwl%31v&~`;Wj^J~>6w7{-W%7wc zg?sih^UWo$8DaSZ&zr)d(y9F?S?a0pd5(^UWag+FQ5C2;K*C_C-h$Ih{ps&Yh^9B? zan{KG42sB&>1y%z#$83)g3-w)Wkzm;`L6JFvq={3kQ;kq*%03z3e1a{b&nTSqbPVm zdS4KiQZaueNRQ2n&>W?Fh65W^)6_=mWg;s-AUhHec4&Y|&T{4nP`2|@+0qYoG=BjU zP~#C>n9MM*QjcIb+5h-tJq=zq@apxE@^z*xD7mf69v-8&|3Tb#OX$SsZy!f3SpzMO z*SGU8WPgy9bO1@oMYFxITkz(HR59ZU_{~|3v}k&!OISdSX<-MxMMNTKLAJs^2J=B& z$K9$mazQVc-3g}vHzuq?pRIyIq;P1+XrAU%+==;2H3jIa`pajuFFCpet5-)gCIF=%@w5>zwN3u363ll)X*{D~AVE9pF+8OL6r zQCVCZ&J}B2b5&W)+8^{MtL5;1Q5VQ zfC%V9wG*rswijpKowOJR=&(5C9{#&H&#&2R~7t^wMR zkulJJKCQnk5j|L>NIQ%*7fTWLBkM=b;kyUrer+v9xmQc?@BWpPTWT(}WNgofohC8x z@kN5WSf`%j^UY;(a$v}R!c?sv`}Y&_V@D>Rmj!6uIR+I3?{knrxJPtV7I1On3>lhc zfzT>2E`y}wB@gif?>0!MDW9uK3cM*I&iKy-zms9{8Cq7Rw*vk{M}%sZ#O$I_Z>g$9B7|6q;k;Y)t12OsFH0B>zjMYu<`I4;^h0OfyAi2_Du1x%s750*Q4tu}2f4rYg+EfppP3?dWey;>Wi{n0H&Z9p9u)pdel)*45kz%Qk}M zxETx#r-wR3BO?t=V)ccBLr9?}OSYkbL-6`SO$+2qNiV;oQIkRq&diXKX3@`39K@f| z+t+fNbniY;x#~OW?vBS_OSp_(=(U=2p7j=p!|oT5D#<7i-Qlub27X4!?ER_mxs4=h z3KavUWe>!TkqweECkw9!TaK4;4_wMEpm`^s-G|$#t`0QIv6V&@xN{fg?_Ycap^mrx z0uzx;pWX3Pq}gvevNi3`5cF0c8>t6+vUTRt^`L*!<4P= zR5n``9cW&s-0Hjx_n`x~MQz|J`;lI;PyiVHVXZyryH*Rd4$N%)+v|aEJrZHoCzhyQ zW((f&Jg2h&lHe@q`nc{G-nPtPQ!UYT9KMkR2URRaC0YQ$ARCWJN5%6PIzLEUIip;Dp2TdKE_*d7@gKsk8QLnzWTixXUXkXVatVgw0g;duk8IpC;-^M6Z{x zkoJJd%X^oZf<(eSinJB30=3K2Pyo^OW6d30&?)4G0F!s=XeYH*~VMcJ!8!n60iJZCwtYKZ^yGa#`vF@Q0JEQ+@!4a0NpQ88sk zBAorHZC|v{4b+s^=cS%%=u&D%GFpbW;cOo_;15!{FIRby)TdAmW{bGoHSi z&VTcnA&OBglBe3g_bh^N&V3M@9?1x_LGEqF0 zJyB^Gb{|fy8e>@Ho068m?G414Va@bQ0r1I&pvu#q)P;b84irF6{-+ingPs^iZRCaW z_n6iU67kM@5&;>$#Ml9Ya@6RC@qoZ|0Xn4<5hksCcqj$&Y3-QqCZVi|Y*J4ww?g*k zBrT9X@wW8w0`9xxy53m!0z?^Cx+-gyNErt=`WJt{fIZJ2&sQYyIt^HYijQsXYlc@x z2x;A$yziAf@?}PG*l|PqPidy>%V5G8FxP^8pat%D`XX2G}-kUW8 zgr?$|fU4BGHd?uSg50(!w+9drB|24*cz#?}nnBT9tB!zgrM6r0Dq{=HA9l`CJT@#L zxCFNpv{kG`eDxdw=M5D~Y#&4mli>Q{cxGT$vs%(}$k-S#&rUDX6LrBBZsL4w4MKYB z(m+CF_8Z6T^7+A8UT5G<_cV0Kg&2^cHaOpdRg4lvOED=cai-9e8%rxkD>Y@q&uzCI z4n%4I{6-ls=jNR^G0#z%GvDb*n*)vITx+UsC(I?EGp#n%zuf7eq1+Hp*L~We)LjNv zFWrH+=rRZlDz;dF8n9$o6e^^$7%}RoJ=F5zwVX$mL`SPchXNVP6^&@_BY8BLrM>Op zb8fLFpcvWAUfUXtAQgK5vchaH_Kq{0$_x-Z?_4O%*|-+?$B&(L6)f*m%$5#`cZ-<0 z4ria_y3FQ8xlB|P5HhZU&AJ$bUOV;<1MhWa!-144o2Msiz|_qwQ_5Z9w)qri(0>!p zqd$e$pFn|AM69KykXMSBV-(Y|$A^6Fsd- zP7KUI+8&{6SB54IG)uoHVG3mu^I)er*l9f6wAWr|db}tl*t{Osz`dd^0QYgC%T-aH zl(+cz83e%pt|z?8yZ>;rSLpjL&!vg!rK3W@YazYf&kI^cfWUBn|9I;xA~O(AfRNiR z?*4ilzq`88@D~QW{hHgGONb5I>E}#|iy5~Hq3`NaEORfe?bGHM^?7J^vW^AM&hmU> z44Ga8D?op^hIe@c#sU#rV+B)t72g?H-E#~q>-*5DBqQO8UHW^M5dUR`h(o!FE}dS7 z?Cmi3C4OyCKgWOS6p+h$H)#S+}q}fCy*C{C`Z#6S<~_f>fRW4NcH54`KdM9-85q_zS_E9|>AA7Bw77*Aj)zzj6&O}w z$+tI`+qk}M5d+(Q82ePXR$8JIkySmw<;V6OTVK9$QzHc(Fz-pQLyuccSpX=`%~NI4 zhVXXQ@K(Zds_6V+`CQJBM(8?_LdRjX^PhZARcO9HOpM)?=_8Ky@|?;w!`9a{4}D?y zXQ2hkD_xrHlT?~(PWn2f85v^$bBguZ5x2{u8 zcFG=Rs}cc90W$ic@252at2jErqVS=&)X&dQ-oN8^8}JdH>-l&BQH%b7tli!#bW*Z_Nm5S%OVVB93Hl=h3EhhnU(iCanfRP(m|W( znKM^@*dAh4a#Ov0wi_DUlxjNY;$2}qRFk5wi^@op>MRBP;E^YisBJn|>Qul3MeSaUcAG`TKGnO;26 zUy7S(54a?4P?9m)IPGsMpIQ1N1EJzON z9!l$tl$CRm%pEVF(K?OH+?HZx~@Ri1fM;Ah3ylT;hp!aN!`PyILi?=bhj;l6^3^nYgZ0+-n9LUYlo) zYfscm+`B458>+JciR;w_*_B<5;u3rtF#?9?T%r34LDB?I5c*u#au{G<*}?5_4i$A# zB4gJ2H6LeZUyqy1@(QMTy9d{WoCnzjZiXD8?R=WWXQ0p=C5Nt4X0VwfY@&UU+R!9Y0hyKe;$$H@U zW(JA?Wl|RYL7HC_Bes-9i*)Es`x|(fzben_@z2;#537u_u zIfEE@G!i&mr~>e8rfSls+#exf zjC*+TFLs=>E7qPm9RnQAW0~yr4@sP!b&9RGs|L+#L)=ld$R3${NZkS*pf#^B$UjG+1G^C>}p$eKR2T z)$s#_RRGEN*vl4U_#eDxo=4#_t9A+V$QVGi5;>CaQRKfoCU=@`C$k&q-8bUXBo_jv z`)KQqb!6*G%;_T!bqcLeb&VCnAxB3F_yUphFZdd^?svX9?K?6YBs*BVSH|HiPrNmJ zSXR2PD%%T%6w$Ae1I4X1@qVanFgHhzGU&}e<~-dR5|3t|Uc32C=dmHp*TDB8Vm263 zSi&v-JSBYJ@?B(4P}F1&?b|Qcygo7Vc+Utob4vFFlZ#whdsO4D_!n;Ww@fvh1FQ%E z)`nT7Oa>qfI$Bwa9{YsL3giO;w0exWEI2B)PN^ga7v`~u@ zIKB9V#9hjN^J}g`smnE|ozqfJH=CjmnquCF&*w6XKMS37&Wd{Sig_eZ6EABxYlu8r zsE&UVQs&mpR+m^wz`V*nhn~bpIY0BIZLB>&rGQytMy~8myToBF?z~6Jyv6DBgoiLFsUu^ zabF`c@(L!GztR2I)Iy%S@!*e(BN?Y)ZT11WMy302HVq+jyRPhi>AtjGVq zhqe}Evn1RD@X2-3J(@RPALUt!vf-&}%D&oP%8(=jPd3|J822vXdlt;XXUk>QDQm4u zgZHER$j$eOPW^+$>reisqEWp+1=atCW-3c9jR67}7Q~H5JCx=EPu`;N;cEB~E z)HL|H=#ZMBh+J@tRMoSq32vI5pH!L6z=#Zie2}nUGrBTE$ru@H)hK6wzDfdM=ZL65 zg1$zZ5<2x>18nUZXh13qSel}TplHX1II9G4e5`RRUA|ZV{XtyZWoaKwHk92?D-txd zqn^fO0{3Al~n~pl{(4RnI7A>7HRaZZ}ao2-}slfB4*eVl^_f5Dz9Uw#1SEI>umT zlf$`XFW<6_j&ivW?coaxryxCZ6J2i@GMgrL0Zs8lI8fGnro6lQRB&vTe~7-mz(P(bV0?SWs+yHX8B8wXm91sH(;S0$1cq z=jw0QAkvMywJEX&`Pm#zf)3dF^d`PLf{=W(m~Q2wc8N}{TeX)b?&Ih6AkLZiJ_fOq zMk=@uNt4&zXQ-&C%nRxyo&ZYn3YgIqTErS)HQA71m8$}EW{CGBmwUP#}z0-glfKP|GrWD*UB&`l{-b$zxEBNZwwG`!B)hLG`hT9VxCS%#_ z&s|iP6R^{-Dl?V9S?slEC`gz|ZXL$K2@Oqo_qbw>8XChur$0J9NbKk0Dfuy|yR+yh z<9eW?d8Y^2A$jMYb4BnxsxOC4W%J#!t3T?o$Y~*u$B(WupN3dR35c4`S(fBH9KA+X zd>tY)b%NlyO489%LuYq?Be-M3^+YTZUZ*;=n>bszgP>G`wT|zeAxO8z4>PWkTvp5fks5m7!g=V473GIyf#^m5Bu{K{g1P$G9O;l#3|^Ka|JHtv zM=@TS2fqyI%Y5AB8*?KC-({~fme%dLK=}ORV7WE%1>5|FSF>aMAjwzzit{yMi~Dv1 zdGXMZBS+98^|vfJHfwO*ClhuDhSO65u`X#T$|?{G@4~j>wGgiB_WNU(N?q%#7${FC z#HSbJmzX#0VJEMy*Ph*>|JLQ)w1C_SueUtpF6Lz0ai<1QzEAUBF(}!nSNP`uiHas& zoxAk98wof~iz^wNX6{4Pc@7sETkMAEP#%y^!XjDxue zhMCg_^B((Pft$RL>td{s47Z$0VS*_K4O7q-HCrai1Uly~Gm6wFj5P_ZPq-V$(Pf*G zEEmKHDCT5;PP@A*tZNm@FUaFTwy5R4B@iBUMM5i*r?7^Kd(rP1dDhW~YdqR2@rHF3 zJh@%NChS&#*xOdFn2JE*4&_jbm@~MD=X%j0sEph(q_URA0T|Ms?MVk<>c!bHIHU~$ z>PE=-`*n63$(yqFW2nN@Ad=>gUARS~@Fe37Vs&ik?0=c5EKyT6krq9h3?$;Od>J-* zIGA@Y(w^wfI``o%wgvJ%(c#H_9}$AbnRGy)C6oaf!c)4vI%It+N=pvM2XqwC?lSHy z45x4pm=m4>ulSDUO7t2pG~q%@0;iHDTXnk9>(9D7o1=#lrG>&m&VD=cBT2+UlRedX ztf(PV)avaeu!+jwq}g2CQhUk3aaqh}FyeA_{>XA$((6v;P}&6NZWfW3qh2yaZ$nVb zr~$iUR-J}5_B3#E_1oGW*~<+q9I-E3h~XA1IpNx)Ix3Y&g>|_za&YK+piz533qpQVY4&XA>aR8aO?)axtC8Zs_PbnXl1a_m!dXr$P` z2ZML?`MIZ8{AHP%0xe}cv7jJT4S0;ZVEXxHxE06Pr(;ySsnhmF z0Hnx6FVQt~R-HnFi}%~35#9P=8;RNKOAFY|k4pGsOAE@P9xa~~)`}CbjK4O4k7d~u z9GQ+Cx=sI|qOtMd&8s8Rok9Gg&rde)E)Hsz@Md4XLk5NZAD{e>Blo6)pNZCq?;|JvJ^T6nT|rh<&mdQK=u3S6 zU3UH6KDZB2)4RI_7ZTkk9=6;MA6tzlO8RNlp6XZigs|` zXx!c)*bt<9TX3f7%U~*U)xR@VxU(!v-E1yJ#tf)dBCg(`?TDPC;@fFI9|4qPLHAlQ zfBb5n6sTb2PtA;PdH()Q-cRsdv6D}!C?+^DqcO)gE;Mr{%}n3j#@d%b&y z^7sHX=r0jEfO5it8l&U$J^q>aoRqRv;fK{sduJsTe?1rf2j@!!pZeE}UiP22aXASi z-;5RA`nAWWU;0k0umPg78=01<^pyvLc~yhrw)4038olC?Hj}%RW~Gl_(!#D4dp)35 ziw$;ihIx~73r##FBAaZ{L>}=ui527pnWGIFAMTl{hF^Oz;FX=dEw|=ATIN{}C~?}r zulo|H@@Q?^s=He6VPH5!0@$yLNwBEdnrIOCs3QN@Zr=s1%Mpn1g=d41{<`g`v(FWBs zk3-|A!lw6HmZ;UZ3f6PWj-APQ$gzpVYVsD_;<&(zu?ljRkJq=SDCH;pHCDpO7B+!i zr9%+&Pzwul#ksv!jvf2s*~fxdsex=g0th)Nue}+Fi3Hp}`_tmK)uOfoDz)QklK{em z!3)^F>y@|qn!ao~EPwPjKJwne|9dO;6%L@!2b(!lu4~@E`E&DmY?SJPQ@(Jc_03n! z8MhzbAEBmt4zC%JM6Wo0z0lvVMQ84}G6;yOUXcs$5(Nw@HI8yhPU-QcGgAZyU^>%D z4vV*0c-Z(j%SF`mkw%Ifltobgl(lO@D->8nzE|Ean@C5qwnFb3aD`=Yy!6Hj>p`~I zHnxP@DCR!^e_`U%@`g8@` zKOfq$lYLh`d?rYbf)ZO^%7==-G0_U*Vifs#n)r|Kg|$C??^V>}T;_o~hjOvj2k65i z;}no3xRs{`bp6o)2Oi~=@b_1~;Qcc7Fru^j0IHpZVSZlDm5BuS6{EFy+4ZDCdqP4* z+Wq`#l4YtgeB*@ur1YieM0!P~?B~%T(AXDuMZFCyI~Da)Ji&G=LDQ3X6@L8UkwXh- zWZdo^k|TxXd`YabtwgVnJBNBtARRLZJ8@Ue?j0a=U-kcWHcXYvuk+3(n)E7H9q@Xr zo~q3F{3_gQS5oiT&zClcgBqxmkw-W-8&r$Ml@}U*qyyxbXvui+;CIpQfDYfkhxefb z{r1Wx_fd77H=y|9)LE^XLml$Jwuk%LC(d>CMcHYh5RinS|Fj49QazTxmaP{zR3<2M zdfpUI@C#w#D7GaprjjDT-V{N?i3Ek%%w{$t`In#nx>P@T8XB;e!`i|?Xa?>xKgF1t7J!zRjtFiHmsu7uFyGh}uD8H_~12Hbyk(WCf zc9Y}WV7U4GVx_i?SM8gPL!B^i*UJGZ;Y8GF-|e$N{Sw~B<@+H-i>ww9YnSmkN|3)T zlp_|fkS7|ozziIyyDyoucVU075-OUnNI#jWa>1u*3}jj3Z~NJQykelcRl+OobqGoI z>+Yw@Pt4&zvo^pwK=R>YOep03pw36BNQ@<@gvr$JvYpWB(+kh)jbt;Zh# zUk<^KFOOE>F1CeijV5i~SEFJ+GGwB~5xL@2grmx(T5L=4P^9>3H|>*T`+YuIvOcBr zqCAMR2gx_LhW$ByZDDsSG{ z$adaH@OXFotPFhWy?+EStN6R$S<=qczDQ3&^cKf-dk|9mq4x?e1Hd#A3<^3yhZEfu zFH)!5bRLblF((m!0b`I;SrdjABD#6@?hI+-VU&&gyw4fWv1{g_QW|GzkGq;d5}iXF z<-mr$&+uOvGH@8hhVibHCv*`3I7SgAjUcZ#5a zxMvgmuM+_z94Z3P&DO{Ocdp#NPaK3aM}mA+bs^_3BpVUVzVZs|&utKx3bx);X}<>Q zo-L7+`8`TLq|PJ9+L;>CJ5)4n^wtVAb;{I(dAhOm%)Fmxp@|xKpZiz5Cgw7A+T1gZ z8dx(`z9?$v&x(*Ao(er0f8$rt!W49Xx>T?);{v^X!tuklmejwBghJ|H&Fx<&uiL(- z95ma2eCD*aaF1Q!)zJR$jusR)C=Csb3gE|iVHEe@^!N8CdwjsmfbKt-a| z3tx}-tESBcNXwVi4Pk8=^Yg!!8EB%pnWCHg8{E~|Bpi-me-*pSD%>_h1;?b>2n`vm z${+awAbZmL(_PfQP&v{0RqN@Om8UgtD}%+J7&u^ebq!ZyOp|UbAAsK5n%rAFzq#JS z`TKoj3i71X<$I_5sDFL2zsey=1+IyQ0kWF!c_Ri(Pyf7GKM!h0ZNIDVuix5kW&Hl2 z`U3|^9hw;}gE8`0Wz%efMwWU#PYUZn~Vo`SVxgE;{&}#2fZktA-7w zWJ3V^7sB-4PaQ~D4IWClU|vx!O^xDB+5vRxGoXJfE%O#V^v7@Ld&n|%?$yE|P|U%1 zv;~_vo33d8-Mk(AB=%Q7SVbYNam=IEY2f45|E0IpI2_h0n0=k<|GO4zT&x+<1k$3x zF@6@FE8ruy9ZYXW>BT6hIN(K9F`u|<>#Wa)tAO=GEA%P zU;~Z9@_%#Vpi%e?uug-L-UH<*H*ZKvwcRvD$^q!%_K94&=Ct8%Surn;>Cx8Cd;=DRT)<$C4ZRr_3nvCfnbqwS025_)+_`C*}~5MHARqS_ZZs zg;<$8;ecuG(Z}t%fXlgP-00>0m=!31?Kif|wPretflG;~)l$3MyZ_Sh1_}9JqJvZN zvH^F!f&g(}N;)I!aT^Sle0pC*`U&Wz;~yxFhhkd_{1HCJ>#^YM`h+>000P~kfwD%e z6vR%0D!ifjN+uS*BzjJk<(}Od%!-AqD4U96c;VQhAq-sHLj%y(Azw)BA_O_%6q$FVS2^0 z*eKlkz2EK*L26l(4z4I2`g~|A#dmjxCDb zy#J=nreR|?ahB)pXD}8N^~^ShHl4u%81fsXwS}x8hXL*3^|rQf^gm`6ls{e-44c29 zvpsmQ;qW>rS)wtn3o0NRU3PFml1e>RApGX6kQuZah}t#aX)_@IrW8-%D4X{p1X+cQ zq6D&e!<^}g*WC`Y2!t^J_b4D|X&D_FeU*JaLBgSE5nD0VRm%rlK#B_9~6`7hl#%!?^=JCS4{0jj7NuS>7N|fjY zlvIQw5W*vIu3&9nO6>9x0p4$+%ECx6nrI)WQ;gtIwVsn9peg2hBjSZ1c?Kz5&bxzd z-cR?0BCWCLu^r=I0H)&EyP4*m)}aRa&Rv@H#RNJHZ(#BgT`>DV!gd7U7aS4|$DQJg z=tBy1Sc^fS*Z3Yh{R`aOuVr^XF;^AV0~lZfNX0wsVWK=LVef^m!$|K64C;n79k58% z>_h~FtsV;0=eRG<9SC+&$)dRk0F93MW&qYl<(|1~MqkgXO2yU8ITUz4nAPEM-`()L zxjG%WkvWR8q1C-MJ!DFUGXw;|GDH`^VpPYB!tA%^Qkn>k(s-PdUG%6Hh(leJ(wf89 zgXVB#b#7F|;v$%9Ak1pL8l;pd?!iaTNLq#tt2)nl%dPKn^x0Ji7&mIT7_Lhh^@cAb zfoW`NbXR!~+IjXR171mZ3NJONs+1$w87mm6G<$}Sw4Q8qEiHL$?`jAP+Xavu&?*fM z?W})kA~?MAano0np*75IV%;>LSe!a9Hl_rGCQe?2nD4xmwXj8799(f}t8PF)MMm$$hC8K;6eN?zi^rE@(vcAw5e#VcovEL2Gw%rF^M) zYilC&>6dee$p`BRn+~FLdrp`{ZPHfy*&z$ z!sypAyM2*q1_5aly(#R6v_w5z7|f@b*i|LYbF9FqN^iYgpo|TG=IR7UEqn^7xRZoy z7IhTHV+em5`@#WU!APFH*^cSSwFaSUR{a+!Q!g-WsA_m$4(rzU+)Azjkf0CP6BjpY zCqSZ87AS$-C>mL_$wu$mV8Xps zfHqdYLpE^2cDc{ulCcRG1HSIN8eN3dpSiwtk-HF1Bu#bTZ z%-&v)VakIrvL1ex)3`YnSQP?_9^{tAa#VoUM+&wXiZ|-BRzd&@4XVexZdO<5@_orO8y-s8O#%?_i-#&z+5r zvb@$1wkX{9R`yDtx$U($T+M^Bo2v9U+4MCSD}x_iD($mrs3!}<>1#JbxMYORE5BXo zLSKa%HPC2jSvIGT465L+Fs}=3QYv#@>8mmBf-&9%#}fz#ijG;2Dsb z+m&<8+hOQSg#yLelN|c@Qgd=Uc0YiSe37VTIp;Q4KU(d`ya6a>vSSNUaF93<0k|l) zL%%d`mFefuXB&d9??g_~_nv0!wVpADG1Goh&L;Z^5cpet|IAOW;<3ZPWgBGHw$hc* zM9>-bpc?@ZIR;QmDw+>5WIta^wB~;b+1O-fA0o!ypF30R!??zCcuwLwzX(eYK(zzb z5LQD4HTACexQ|;smJ^h&Zx=zBY?{mz^_I7Ip*NuHyKdxNn5&u}yHV*X_I`R>roryf z2@6Y;Vebs}6ZxjjKg+wHlNRtW6{&aCpAkRWi}j(wWF_7I6!cZ5`v~wCF&-+ME@ZT?rSZ><3X0;OL6oe_48jax0pYg&J0i0B zD-C7fcQk~LTc;`qh_cOh9A`2SsuvP-AMY(8@PQ~17t!Xkgye5RAi+|cwg2U)w~f|m zL9o?Ewn7s|Jf}4-Ul5dzBQwty?X_f6eBnmDLx2sa5So|4_ASSH`NSNMM`pD~Y9*|j z5)7MRkDO73F3w=QGsf0`025TXgRH^Bcb~l|dy0CT3#z7VIkRBGu_>z)%m=xr%KgX% z^J6)ob7|8*EGgnR4#t9E)`o8pxC#-QApwz)(Q7y`xDEx+*PA8k7%-Q_q~+1DoF-Lz;k0qn;edOtR8 zOE;4aHT2p~OlO4J?t|{XyJ?Wo%-=x&-dk?yh9aYiVvGRo5d{Q!1?)IlhkG(v7S~z*r@u_VU`5W;@NcrUyHz_ zJJ?m3Z=LR~r+IBA8=J=Kf?d()bwavlk81LA|Ls)fd(MneUu9W!z}juAwR>iP#B*E-k~EOAw8x z(G4VL=JpYG(wfa7y_P5fY5aJ2y8lZ+h*NsP zT(<=J0)iv(ukLLe7MFyaZVfqY+S{!qw-IHj#t&J)n{PBh+t!;bgCC7uC;C|^(C~`B zP29Dg_uNPeb*5=H&$Upn8}0$eYorpw=Xo?4J~Q~%kYc2_&UHx zL zY(p9yoHRKLMk<7l^dA$P`p+fw(Q{NX}J^!rrexE0!+>cbKMFv`5 z)U}VbL9WVuo35K4*64yO+p+_$_jd5o$1SpJGw>_(AC^D}x9lolxlm0W5S?0Fik`-5 z!=o*UAGG9lN3vPaoUDx}pl@e6r_a|re+7VoT}9}1pREyv#>HN}xvA#;UrBLKXE#v*WPvKqTNljmmfIdT$Yiq=nwfjVtXxyL7z2#xT}q>Z74c0|19c-baLJWws2P z9>kxiU+qm6_qMwE%pSv%!+;67pclrbs78;klBSDgkj8>CyqnAa0COuoe5Qx!2m?BSlKmY|_Ejw}2S5UWm@}xePrq9!- z@ASSwF&i;;+n;#F%Rs7s1RDb=!~UQX|JnfLxw9!dfV0D_pGlik*Bg<(roCYbYdrVK zQtD7$g0WAHPl+q(ZHUbmp;ujg-AnzY=sI(+M9i$v7t~6(AJw(B^~r8Ysz^Iw_H~$a zvZUj28Fig>D{HnKK-2HhT#!7m6meDO*1CaAA?wJvlFr-(^_VV*`tgez-#m+RldZ2C zbYjc={%bU|2TWxica|#xXb;=<<=u!t@g<&IHU?W|` z^Oil{#Wf`!!KGk&(kk^6WGF;OYshvqNp*RbMt`qCZO0 zO^T+>ym-xOCwyrghDd&XC0z3PYV~f+x6h{s*e}%+wGQ6H=sntLz4dLKKXdx&o>8rD zUGfHavgAa>lNUD*o|A6NkkFm4_S6?*LkFtIl$d_sxYin~qx{5}LPL?@u+lzbtu^gF zNjNi_H*)lkk`#aUByxexNua)A2vA~4IHvCqpPz$43!=LRU>;hdMUV{r!zR!B4IOJP%1Y6LjlHGnQfRL zV&PVz&z#^F9s@)`G>JqXW@bBgVhR{;9@H}do)hT-BkQ=aVe-(tJ#1sV-VCR%+5Z?7iVNv#v`rQ0XqvLwcA4dSz`dZZbDA@`TSnEE;S5fmbT=0@Grr$Vl~+hS z?%+)0v+5%74m1sLavrWjR4_NY6nz}K-d6sIhR17TCs^JUaj(L?KzQ;r)H|;U=cz$N zj6CqU(h!_jkNE`D_hoi7byV9!rWJ9(OG; z>;LqM#|#ZA8#wZL=?(wX-RS0rmJDF>P64j=>w=I_(fuKGP5A3Pm?dPWF3pk~6~Qod z+OJx@Bao}oG-}?1L;6;Sjuu1^Scry$nPD9FCz@O^4yminUQK8+X#_6k7@^_iCyJN9 zBr}6r`f)E~Lb^t;F)ZA7ZDG)9=*=rMsI6p<#;6tIJTlPTo zgA+^pNM0bBhI7R!fVQl4ARl5ro;AnIrJk*^uGXSViMMA2raQ5ga*Ip72;};LRINsQ*)_)xG%}6x z<>6$6rB#2&z2Z9`-}K&BWSL|u=GodAEmVb~J5{ddAWmP80dVti20ttLyt_DMN(`c= zSX!eGDnFLu2>?<8&w&8P(q@1sVGq0Rv=;R=id$V&!0?MNamEPfzWKdJQb2XG?mTb()#mdYX1)hnzUE6J#+0DY&IA~E6R z=LuH%E%aW}tHf_Mkvzqp#YARPMP5!NkF&b|nv4G)G^Wx25F3e^h_!y}z@G zcW5tpbb}H|OMX^hB)bhP$Xg~F?+Y5Jg3P~}i_U3Ci(V}yVSQ^y%vWbH%R0JOA&)<} zRqj~aDN22ihP4kNg|SiMTIw&J94@n5KF7}FQEVeorvfM9;-uMryt|#2&XHsU|6u75 zeQTDw>8KkQX5>0pUu$Q+7Xo9bFLYdSE_ad_cS%XZW%v4|?pk=HC@UT!e`^o}+-tN= z7ARyZ5etJh?Z=rVQSVHMWlFWD#Dh)FW^H?W5<;))Iik<7}syl=@&^` z3+nOLeH)W=s7hju4j~fIQYoV+yCP}xkvY?^ra3NVsm|m!xFUzcv%d`}(=$JJYBh7N zM45EaP1MOaWI0arq!WhI?S@WRu~qj6aw=a$Yw~8rmhbiT5QGQvEw0PtI6-u;gQ)2q zgRO;uFI_HJ8CU717d=kiYjSiJBDsXtkS*X(?4xTWGTmcU0~+G2dAhx~73LPT2$zCX zFhd$MN$(jlWncanir|EP@%By1OCrDA#IDIKb`o_}+7hok>T?JwXY_U*au)E~=n>Gb zZVzdg#-Gxm7}(m4xmUZhFCg9FiiTIC4gh`pk;VWb&CqDp z+`U+kuREEpKy9p@g4+bcHP-bwN&V4M)3&Y=3wk^Gk2*Crif!h1asZ|nC@Gf+QBIH^ z;LR+3^6=iMDnU>z)z_E(((R^<*(wDFuN}y8k?=X9R|xDZ5pMj{Ax`)4?B4->C_Jl$LtCr$f1X`V2+y;d`fjYfKd+DD=FhpKuI- z2(J1g*nz2m09w@kfJX2G1|jV~z@xwCV*YVV-)-2c;w1NxDR2-slOq+O`v(X(?gSJG zyU+tftirM4a6u-3HIcj2l6l^GZFlgx3-mD$4jn!9{Vh;rz1K|G)!Uv?98&hENvaWuEp8VrQxEi<+|7zab=}%NqbV?vfV^0+f(jN;d9TVZy z0E8e@yRGes5-_;$lp$_Q6d{`Mp`B|Rc*ghDw(?`YF}c5gohdh}{^|+)4`=?aZK@B` zB;B=Jy5aiwGvFIX>W0=?Fj|d|NBkFr%H`07H$BOv!vC&(f6rO=QSBXKT3jyXt@v-S z&#$%!by>cISHEWTUx?!Gts9Imi~$0U$F;rJqRw<& zWxg=@Yfb&}>A(Kn)w5uo@c?u0|LYb{@q%^c^DOf>vEv`Nk@81w9-4#XPtT>de$lu7 z$94YwH?}W;b*2?|_xFupy6_!9N*!INMJPTaj=|pma_X4ZAjqKsbz-a4(t|9I!%P1l~@l(y>d#X|M-qH(;1o z^wHV&jwK+vT`o~mWD!EfH3G3hMiB+0Womj|7mzQ#9! z{0JFCFn8;%7q=UOWq(Zk;W;h|4)jaSi0`RgEBon=s^n;L0D`81lk^uWtI48d0i&|J z*UY=-KMocA#xtMtf;W3y)o|g~&lh(4((S6H)pSNdz;BEKwgz|Pb~AH8Ws3=gzw){V zJU9)#3PAx}z(ATuCI5kIp0Nc)!K^($D#W_G(_^%sLgl8P@-x^fpqJhfoiF!%Zvxsm zRgZ-b32HW#UDppcdzUG!7$Go${0j;&{n~Sogqtt`-h%x1IN=&a#!W)kcSsqey-k~q zcgmqMF zp)msMqh^~fz?*FJ$%24AY}Ar?v9QU!JE6>GI3)s1IDq|eUBQ(#8#qNdg%-4WZ$6k8 z?L?Zt!>5;?37owrby74RRzFo3Dm3KxSKgnco%Pv`J=wQ!Ji77GN802QgjZ2Rq~On6 zCPwrJ+aDJW2!dA7tw!#}uvfIB4zW6`mfG4Hm9 z1MDzOheE@a(72NMH2hqTfb)`};QDx^=E^L?f`SJC$xzNfdX%?1?hjwDQR;OCsR=72 z+5Y9ep@h{jIT5*p>=b@&WYAnv9#tH;?)FMM11P(?CwWFxu{Zf2wjdGWcKQ~j^Kmx# z;lfC~M3Fj}-38b+^>n3(SX62NNu;4M!z3O9rT7IEi`t&DHPm{c@oO7&ygOBQc2c#Y z!Y0$K^ZqgEXT-*>`!BuLlYxDJoZ{GqsTnwEZ)YC;x%YC%9GrjA$Re1a4zz<$fIh$S zUdsByMbHU{v5DoqHhMTP;E+Hq6rfrM5NM)Xe0g$+UMVp8s7t2RKx!mxCjzhWUQKu4 z)}fIg+F^8M;xGKK<~RNqfi)|}@xg+7>aev#n9#zmwY!<# z?5IHUcSmZu(9koQC2eM(z;a=#b|WNs_3e0XIq3A#vF&4&b^1hmZMTHUC_8IX%J!2 zYgFO(vtF70$p9KxtE;qI^qQ+ro14UXZ>oTx^iNV%mJU7i%sv%!B8El&`9~e7N#cIJzZG!~=0f7b-#dQ@O5RFY=+G(R;8TP|s=F{!fOp@l1G>u~?ac%qr@ zn)jwCYN`)lI#0HRn=od84OvkP%c-G-ksi+wb#gGZAbe#&$l!6St))$?ecx*z3V`X) z$e2M9gix*DXaoRxp-LOU?=#S`kpww284P zo4;Qx#UN>AkdkjOJcRcNwj9$+krP~H6^MHAnguk%6*KF6IyZ@pjD?c^hz|t)G49ap zrx`%r<9py%LTL>tiDITf_PXM`OTDpFcQ#vh>hfvXOP7)#d%y>x;{W66QRda62IowC z)FVS_pj-%>2&h>$U$>}V5u+e*f~%U-W!PT2)@&~WMf65Rc3kae7t>)&u)9qcihS-W?O%_PBMfnW`r z04(w@vgN?ZTf3yl3nF~{YqD7^`pUrMY_T#?!miAplaN+!y~d`~b{W33h?+i+K0N>2 z(4uzeM@WR=Y-gTP*Y*qb9{H-g+*P-9b^$a zQv2gwgD=vuR=i>UovW2vWnVCDglOu(J4aKvZf#M{mTlkE$+}nWskuHov4j`OP`+=O z5Bk@Py_PR-8PVN#hn>Q;KqvNgcpww!L**{lL1EH46sMpQg8Fxhj2bQ{!1&;mi)8!V z2Kb&qo1O%6IHNG1SsEfI4Ar8A>?RjZ$t`{5 zEdBsY12iT5xsr8L<*DG!cXjxrl!QgCYcJ$j>Q|dXjUykMpLxv-U8qgF5m4J_TuYji z?x{^{xP>INbXBuzcC4Go$#`!6xN0$ESDa7@-4D?RlA{P(8HvbNg7`&qZYEDE1{E8V z%v)=0l@=LwJRHEdWx|rN@%!f`!#X>R8q|1JXvY44$I-;q3`8h!FSCU)3YO+~A;i@4 zbn}G(-CV@f|G3E$-2|sw?kJM5JOx z04?!(x#UPb?aKA-)VdQwq%hh0S;6(IwzLv!e3UJ)x#2M=#3vk}sTY4VC~(L$*tAyV z3YvDGVwpU0iknjH^Jpg6!bfSw`sz_piu$BydD!TssMWaup^}BTV8Feoah(y;B@Q?+yh_dOY+r_w(EdDf@T zK7ksj)^3hs|Fa6{^p0cKh^GMoJX$A5>s83d>0Ni9*)FR(Yhb)V$ftE{6fq67;A@AD`XX?^D)uyGjtl5#z zW6rGoUF6FZP<1WR*HQs9&I2W zBT)6WBYVv9wsIR^;`Z1H6jp5^<6`V+G1;wuD%w3U2@z$zJXe%@HE8ix6~c{xxrq4~ z@$1%na;I`<7Cm@8%)cOTL=MB;2f;(PkFCubZchdmkC_3^bNmts%13eUpq0w|XBMKP?j$mVv z5oP^_M%O9QPK(~8=(fE36;vM3iVf9XElT8TGv-Tu?!%g3hy??uY&$}S3pRh2qS#A< zxZg(#vfZQ*Ozo;@zcz{CYt(zS1n{`H)=MVViHooB$Q3h?5{{!hZ=B$p!ZOal|X{J&e-tpNDx7I@52FIyayojg0kJ)|>CxWV|H5s`Y zP`CF(G=)<}p1!AnKmM2_&;E1v;eYVZg|JjCU&4?;=2ytp3~g~c@K?)%;_thyf$Cj_ zT6f`U&QT&^9B;Xa1Z18LkP)=FkgzgW-g`ZEYpJfcaozrP_8m6S9|ky3Zr}!TGs+J$ z3&6B%UE!0?U(ll#A7~m~rQQ2QJTJQ(1Imkbd~wrRU>_Bo3rfXhzS_9M$P{m~Rf(gF z3)2el$LyqVk0ISH_c#U~zDBd8jQQZ5zav|Qj*%^Y2yIiZAp zja~&2;3T)C63}4mJ=ja$b|xoXy7L%N;4-`=S4nGgDQ#nS!!|d8fl5a{lnu^eLu>|c z6%32t&}yTj7_ZspX;>&+jI6Z-CQ<4BY&r8aE+Zvh`fFC}K#cLu;(4&yX}7#7&!9Rd z*dv71geMrUCSwj=JXupHf<>f9UaRTzS9TM^^_yqkz z#kYdaU(+O}lmoVmT+EBF1R?*Ay|;|2GX2|zk=#gaK?DUhn^qc8=|(_WS~^5Ty1P>) zr9?`UZlpV$ArM|5aVuXW@B%2ctsGj1GAxvl=<>VLm;WXUNBDbLGe3Vq$6M&G|saqq9MK_ z{#SD&uooG#(zGOiqs~b-GoB}E23NUvt~G?LNC=OP=EY0;k-hIHdn-?UI%*To8Ye=B zGYx``6K*}I?8dZV9-e{y6g&f2RAg^R4kjIeYBFyAA@E|N*jDHTM6g>wcJFk@jZG(m z(3{c)Vq@KB0}XEdRdRuL*Ub69rY+p|#>&r`xFo*Yr;@kSgbV19)pD+F0j^)ij(9!h zYI$f|?27x4@lSD0+{5zF>vU0K?pNRVn^Yk%1R6VFpMO586&j`2BqlU&h&q`{fiCotnRX z+h1tbuQmI}BX|+t0SI*yIa1YsF@62#BYvS2yjPa7TFCSpm;B>3dFr4&Iky?hKY0F6 z0KZUXR`$GGs(`N4t)m#@pFaj#j)m5-BK_bQ0ZkZ3I;;XKG*RR?$_6cuyGD{VVVx0@ zdD?YrWlglfaWnTbA^-Xbg79z1J|-Y_*2A7^0=M)ZX#cD%*6Usvxcbc0U(y3v*L;3Q z#_w+rWcbJA{w=7!zPfAHI4gexOmKzG96pN$T$QOa3Vo5?M!KbtoVANkB5|EdxH9&&gZ zn#97Lfh44}|9PC@V2<5%H2t*-{`1TKc$Vg3&>#7Di8?CqUmors&k98YX!`Sd1I7Po z{(;8=X!<@~{pGLs@#~%b^F4drhX8*EWLVsP8J~Z?ZZ;9sdFdf9U|_3C}P% zu$y+&pc*(~J=hq|jS{#zSHvafrUtQnF##}V34r`F0rF|2c9I7zxCO@m==n6~>@4!Z zkFTxby8~_E*C2CJ*?SX)H}D*>gE!YSI;Vq@5z{?^(^Zjc^jSLo(F+h609&UxsnpIO zEckoMgHQ9pp6JeCanlmgD+O`1HhcYZetxP4TlZ$StQ`M=^y_TV*Oyx4o7cv!u6;FC z0BUY%1bvAPc0SW%OYnrIzJdu+pn0yt<8(1@XEdy}=RCCUU1@vr?V67TD^h1Hy0YqI z#^XhJwl=u%^&->$bDN#bBj|(ip*n9@h9;o=-te~7y(TO6+WZeTF6_^(9*!0PySoP` zh^FUa#CqObz;~F!X_ptCw7+TWvPUf$DFGTLMlPo>JEQr2oH^#1YxTEIsX4o!z9?v# zt}qBFHXo8abw4pI&<#CuZg?{P-=@LNjuSF$zY?x zns$q+@(NsMDG*t=95eNMKe7pQ0^5x0JFf8k&-~*x8NnoH@3+60jF{s;exsCBSp^>6cC%0W zn^7lys$_JSH`;C|(7IC_DbX@L65L)jJK3twHfY;l|2ZX$N>Hy9~g{qr*!(iJbejX ztgKx@f2xhq1Jy%5t?4XfsgvWc>&`WH*(#qJ5PD7fr8SAn@)onoR~ydG=MGX)A4tcF zjPv0Tffnq}yXQ`T~A6ldVtyW;@+pE_M9=BYmr^$PaetJpZMJ>o8`g;?>%{wVzc$f ztqB;zfw9|sW0OyFQD*H}g5RcLogZ96T zOCn~qZ6OB28{gGiW7P|a41&jZ=6mh7f27GUU`2g~GN>?4!7g%i>a?GjO%lKKfXcR< zZzAaFHS*#Yd!iIw#sv$GX9CFA51&QQ5IQz&Dhi9wJIvTkth6P${}Ap~TMAapkk>PT zrR}=XP|p$9oum~$G9DkiEd?}s#p&IFZbUPw zZ@yslsJ-K?UTm7$TydK5h1Xm18Hk@V>{x7fo|w{ji%&x%avNV+w#X;uSAWQ{Z6r+J_ z&w3@WWFDamUmIBW{NJWB;wIEFQ*UzfoY&75%RIT2pVqpDH}repEs+3s4Gh?_L9ei08Qz*TLzyVF3DCa7prXXmtpSdp?sY7dGSlgt z6?7Krss@6ar5-cdE`_^?ClXkEX{>b~Rls3t?Mu!JGHs3SPfx-DmK*y<^TY25rN1(T z%PA~Xop8YT1dzZiuOX*tQrlj+6K;g1p<`Zb!YZ&)@?2X4M4QZNH#=uxd%Z5F#v5j8iy*ovCIg%gNG3wZI2Y$fB~jDT)oov zEp9jZodSS#exi4dm3AU(NaVHan(JB{aOU}XlgOw{6q8__BguuV)mA~ z-R4>dUg1?GbC;z-YwgvRDj9$UXHIm3w4~$;cb49G4^5>Ey(ORl?u-KiZM? zAeHK6NXHn2ox+4cHS_e#)HgoNFi#>>(0PZa_r?#;TqsMwc}v8SnDT6|lp2yYL$57O zA({nJx5!>pHt$q13Hw5JOW(2XR8G7lXf>?rSlEc+NP>St*}CgxMxS#AmcDI+&l%o6 zF!^?AIvj7oAz3^>u~A5#KjWqsA5CQXo$9O?Sz142J4sw`)gz% z1uQX(TmZ2yR7**<@3`4qN|ol(#tmU^|G*_mxH(;Bk(4{Um#@#3H@C>GZl`HmFeH4;u5CA`L^CT2j%>8q6SwaVL{Sh4#<%DX#+IYaMpDlg*0y zz}sx$toa*(jZfcky1AY8A&x6*^z90sh!HfDH^FDw=K&iw;g zfLGPhK>0D#H=9=6XIbtnsS>e2(o3gR_-$7|^Ew|(d_xZxI7A2p99Vq)k=of7$7bL> zalxR)vK+@oBNoI#^NM(OZp#Tfn817E5G1ExQw|<1lJikNYH>?sgRjT)S^;}1`j?MG z$pvZ;#jM>B16lQizZ13cA--IN7)Ac|DEWy1&T_Vc_9|uy`JnGs;k!5=u0P0(Dw6@; zF$tAk_r1yS?E7yJ0+AETwU+v!;dIeBsEWjwyW>^{`BOM<-e$aitu8hY50xCZ4JoiV zWZP-di*~NG1q=#VeXtmDjq#`>$lIoA3+$+fbG53(_)k|2ve$wCZH}EBL-+-s9pHg% zXTD?Z-B_W!HX_+nqF6XT-&MC`qh(YzpK;HK#no>OVFEpD<(0imY|=g*xaZO#o}$sZ zcx*r;6z@mQT7+sr;tS`kt}sE&-~{p05QzqTT> z%;nu`=+6jfC8q4D@FUe^ z1c}Qk%m{<)B@`XU?u*#_w7tX6y?w=C{+kr0+b4_z3Khw-%tUSx+~f%dbEz`(snj<^ zZ>~x5fN-0PzY`qzLA9bnr`GlvIvy+~eXQ7+Jt+;?m$uF|8G`&C{Iy_-56fF+hEb$PpJqtU3^9LQ}l*7L_!2~r?!SwS{{T;@WI;lSK@3GF0iQ=vjSc+>}~ z3aG>VdehPAOKwma$=gD>WQ!&;*H;Ot zOU6^AFK}L`UA3pejwl^aH1eKw;tbrsj4h;}i$1xg!hF~3w1elSpyOn{Zn!cR4>mnUIt(S}Q)!J6Owu`HOHSlU-|qRUN1#K7 zvdj40k=>u4zqm={%PPs{v^!6(-E={3G2r~v=Gkm4Gd)Ym!#Z~_jjK8l;^ayfl_PfF zo2m1VyTW|}VwWog-E0#3i1OY>uHS2nXJh_Ir<8na=QC>03|JaDVQ(`mur--8FgU}c zIQ%NNDf;dCJZ(%KbPc^(_Bd(lFJd{DqfKk;e9)#FVOK19KlPKC=+o*mQd`GR^7 z>4R^$4uKoKVt?%z`BYx442Qlg?HON$&EPY#p#6VcoehT_E5vhHXg|xW?J6$ zg$ZP~8~$|f&v%cF`!VKFbYHz?vA#sR#A-jJCUj4|7 zSZG)BeM&5#_r>*jS%_%hs^-izjr(VK{P=aHDTYHL30%>q-tjr!G#>w1mu;|4y){u% zRGE=6e`voxdGdmpoTw#DzZrr%?62{VX7z&iRWY`*K(j7Hi^F-J*x!=9zMT4x6VH(b zGP`%Rk-uS5h~b15Jol;#;0A_Qmu{!YcrJNWaqIpa=E@uniM*%&IO7*TJ+2hx!o){7 ztg4MM@VPJp%pwNh&&hYmjKBuPm%F1EuLG{PF@r zBKBxHf=24nU9S)$c|w!VnKgum1qSMg{Lr0KA+39uVfA|i_1#v)?la}=5aP^fXQ{Bx z{hovg^=iR9qDkIfozI_#fZddb(s8z;`X&H%0^{Yspl;58$2#?kPlYO#TFlTw9vglk zgyT0qS0=Axn^i`gs4+>u^LqMfHg*(c2hHOMadfa2k?u@p_jCF}F2AV>LvMW3Ui@NM zl!W*)+JJ1X0^X>5QT*vA;SdXUE3uT{q;@K-xhmQG-9i~u`{TqkU)7S<5QjU-7jjY* z;m<&%P*;f?a>JtxEWzZXWU`LSla;VYm2gJ5bp<;+$Dm)B`S{#knrX$ZdNb?79Q#c? zntH?pv0I*6t+b`hbTLnXN8RoFY7&Sz0*Zb3{%GthslK$RM}0*zcSw^jbHL|-g{L0G zCr*1iczL3D7nAp?*6D168y}u4 zOt|aRWrvdKP_VfE98s~7zRfjzL!5YAXtEybjP0_}K)j?(s?;>ZWOCpfM8JIQwKkn65Jp1d(o13ji_%nw6_q%*3lKtShwSbS?&Pd4iRvWmYhByiJ^5cZ^aGn@FbE{H6> zGwdi`$mdj{=#>mZ$_olYo+}`()-D0!>S{*qVu>R^4qvJ7IJwCpbt5y65jChBx`34M z%I#40)1&80?Q2FQ4U!{yQ;P%l9=~i3ymgv}+tDS$2nb+<$g;Xy@*Zuo4X117uG2~K z9Ija^*~==M4Gu^;O`~5t9MD`p%aQzJU(1(VgCIzqkjWT2!&Z;z*Wf0#I0;9dhq zrO}4Ec|UZ#p`5FtwQ}O!wy+-la=hsb{b0E_F8ivsMzu74+U~TND&_$%7h(dtpMKUD z)eBV^&-XzD21J{NM=1~Ra-T@`>xaZGtfC6b3DM-}GQV~Jd>JBz-AG^VVk5_tjreUiHJDS)gGpzScX+VCS{JaxfxAEHn$om*73$-R$Zrk=;%?v^rhWqg+c^Of2~ z&QZ7vcRrSFoZ4+DX=ev0h(1;Jvh>?4v}!`%x?#82rspQJhMC2&AM6YjrPvkH^^TFt zQnHAp|8@1QHxa3y*;*{&(hkLVM}lPWApE=X>dvU(R(*u1*eYg@w!}{xUZzFH{n6Iu z2+hnPA_E8E(3(V!jpIi28!ZsN>0&lJ1Qn8iL^T`lj^CbM?X1f{ix%0%SHS}xa-G}G zlehHm{+WsFNavYuLPsyBq1LbeeIK7g7oK7|Ui}m#b|hC@^K?4fDdNldOqd;Rj_vNT z7#J?3b+4lus1r%vaVEKc1<5R%W#GiZT)^b<2~Ei%|6p}Wo4`xr22l5Y8q1;-`|d!T~joDHN7 zD?AB}1F<8BZ2m)p5nO_?>AlggDQ{yZiXg`_#rm8kLp1dpA%F zYP))4HX09jV|OfN^zxt$K?SEhJa-QcLeH?D4b|Kr79MOsXdw&3u)n~noptkO1ZqSAR5^zi8^1HZA zIEHfmmakbI`%wd8NhZ=*Y^Y8JXmEYg8qS(VfsWfY@}>>dbff`h14#fErjFlF1hzv&mcQxTC0!;r(R-I)dwTY7r*}=GpjYgjUQeRF3t05ysZ2e?5 z*X>4D7&hMLdPS4rE&;>Lo3WJ^NmQa6P2zY5?iSPLnht@wfsXndnmW2JBLcqhV==;h z?d<+0L?caF9&DqLHoxxT`B+{f{6P~N)?b|Be`C1$cWyN2i);HhAJh(0*nl>fAsIaJ zCG46c0wkm4Fo)tr^Mp(%Q(VmmAgSY$gB$FW!QCMm6!y^rsI0 z1tmfl9qU=Jn`(G7b1~;*cdy{pC*f%G*j-ar#B*pIb-@iNZ9`D!PV+Q5m)MQUDsCu^ zCZFD>&0_!0zHt`rO0Es{&8i znkkd>a}@Y05=p3T zs^#wohVK4;U~|6!>#Fe4#j4%a2DyGb+aldJ648g6dx!$BS@d2WU#k7@U3S)2iA9!y z{D~Q1?+$I=Jyay$0Q=9MW&IQ;@7eHCWyI{xpKvD#MGq6?r0mPIAtGDvnu^pYF{Kb6 z#OVVi_A25Pn^I3L^2r`r#wU349*%;=M9r3D$jMU$Q`QC}OAVuAS!7`#P;wxuFK9O@7B12? zSO$7sqlF9QDkY^25FtS?o@U06e3Fmzw;dpq{dQi~Rx~5bfZ+Xk@;5RuUV&pQ;Jsu49ITt>66@MHo_ut(Tnw#nhYKbFpN@a<6c~DA8c?_qmWymy2}*|X8bW^kwsn}Snx4rD>ph&8_0c7T5^9*iBtVB zPqX3+AChz;UeG&voolL7cifYk!U7a?eAU!j{_^Tj^q%_^bb4QW@u{4#6I9Xd;AuJX ziCBo9asX6pl?2AE8(;8|h8v(QTfh-K*Puy^3l})uo|6!Y>WnNlv3IM;P z{GNVUCSOu++diY6EvIFo@e#CU*>exiFuTLe7fgaM{!PSYiHPXyitBzuUs|EkHUp&0 zzKN^p3e)k@e7gD>2uWtaiwrAvJA0zVWF#xT4RayM`@OU{A)IHEA8!6pvi#~v(0azb zH2#qizSJ4h4(Ng}qw#6niMb!O88}bd3)$z;4;~l$=MC3_V1>P2foq@BZ}L-0CcqJI zXwtC;E{C@qj5;=5T*M9ePROq6xKXZNg-fRO9`ztBJJ~ua>&9UrI1*=1Ft2;((+nE2 z0Vm$N1)w}6W5)8v{ZOi!aa_B!=KcJ9cX^0Q08VK-UM>`7LiZN`wI-9HQin8FQY97~V`HYEu=W?0p*kCQU@kvG6{R5V`Rc}; zCZLGkn<#uq*+0w_S3>Ln8j?|}%&Fks+qOOsXM@LvH{T4v*QMsS3#YC|U8^rrjt+T+ zbLx5J=x-P|`5&B)PH8y|zr0ZGD*UutzihP5U)7)V%tp~dh1{S#Mrf|7crh5_e_=}Cw8KT-u0@W0c!s}`$1-Utc>h+lj^v5?2hQHRxab^(r$-wMQS_>qO3iG-a`Fe&pEw!9>ltKqfB0G{l&Bx9a7&&i z_>X!O7}ENFN)Lff<4pS^=67BmPvBY*K<17$@EY#Gc!Bz+w54!mz3|B9>XI+2XwyAx zE)9N@f;_k?Zs_pR^+ju81MAPQZ)kff#&u0Tn+DX`3=ZvKXFizd~SM@%RBxG(FpYZO9=pf$ekwHXRk@x& z$!B}4tb`i#*SQ$9i-OqPj1q+=6Hyv|FBU-k3fAK*wg-tpZCEBN=nsixBvB`@}D zGe9N(>7pwGitqwyq-lT1iT}&pNBvGtlumc&gR1}jDW0gpp`b|bGw2Tg=U-}DA>Ve^ z-XZ8}a$&-R|CBhnNvPdv;NZ~b_x`q>YS+Wx%_r~$G1B!mrPVRKY`AiNFP-1D;(vaC zJ_3&|#I6r|GJm%0{_lT6ics$#`i?0!z5V<3{kc2WZ-~I3&o^6dj`okNcsiy0^Gos{ z-*7$p?l3$1aCsAx`NL+w-_6y(e#6-c%-i&uqQHZlj>losahrcM>|g&)Bi0QF-!U$! z=AF6BZ$xXGAlIGcN4(kZJB-9^>MhHo$8C{gF=}OXiM&o<%E$%W8AD-wAAqu45=cdK z#;q)M|GQt%Yb357>pfpS2R{rnb^khQ9BFi$Nzcx~EHx%_>f&yOLHNWroe;BL*WS9* zgunKwe-E?-d=SEFB$tuAEcnmg{=feWJqK?RRY37j;(s5ZWHC?u|Mz46-%AigzMcua zSfAa`j|=00=b-sa?E!L)Z+Du*&*`DoL%>Wb;A)VM9|FF~OXEY?$()n{l>hg|{Ksnl zi7CJNJO{?-OkH>JWE=r@aQ^jO1Ga&-UVHR{X#NcM|j^FzuW0` zsu-Ng{row|<6yj~JCjY5PGl@IuOOSz(d`7q@>FA{;yR^Ir7@uQ&lU9RS1<6JFXsty*8)Lf45x! z{B^uW-V3ITY*$vsQted;M9V5wVo$GHGx^}cFzqX|TP<W*sn}aXJ z&kF3@l-J}DwbojLjbSF|y=;&`9LzD@w_#Cp5Iwupv)pAL$U(+!8|i*=+9643oeT2G zwzDKZq&!=SDXeQtfBZ(xE$-b)PeO##-tu**!y?cPrE#i7>msp41EM9y7$%2@_P0{j!;8j ze3WiyhfxXijP&4UIXeUoV*tvH(Za7OQb%1br$d|%VQBvz4#C&>kaJv9Nbk$8k4b3W zc&MZnsN_444)`qIeltZF`ux{PnByt7ITpe%qDxoX!f-zsZbaTwGE$k-^FiWo_ zv+m#D8qo01=H(Q?C1(b};>Z#Z)WkGoC2C;{au$IMhBjd0YD*T#1(^9>^)g)kfjLa=y z(*?=^Quuqtwub{8juagIfF~mp?h2SI zYj`+F`O}fp188JI8Zw?AcZrEfLz>gxorm)vcePxe!fjweNi>lh@&L-ZJzZn+ZV6nN z9vzj=GLId5_7pNlmToD+*RVlLtz~t1D8RE-h#?;44ar$eugoi zoOLsRJja=5P_d?554SfMoFQ+#ko1A0`jIUegfCcGHlaKV4eWhM(QnS})`iMI^y^mwVsEgj9|Jv=>qxhH@1(T7qCqfM}nTp7rg`lBAn7 zFu)i_ZWJeX%lVGvxK>{Dj*$Mfkl8usO56*u`FsEj+neKbl96p%ibR zA1PttTttRN(Ad0Mn%k>4)8WJe4oTtDHD{|P$$-MEo^x!_f}MToW`}!OvctMkyu%Sp zZBbi&>MD5bSq^b;GkB!mEC)yyvjaM8P?OVLLK7ca58el+o>)r{_PVIr zvR3Q7Hx7WfeNb5L0v%^@MW^LvW3HB}wouZ@c^CeH{6z@9AKX@G)p#naBoAxu=EzR{ z4HVnZD0<}&EOn=n`Kr&6H8zILQeGG8J5L;NvVd^WrOqfq%{VAoYu4U~0;XuTN^T^u zi!&)Cz)7OVd#JfERcWuh$CZ&^1CGjd1BD^^akZe9Hb&I}DhwY90Ln6DS3g_W94m}_QBV6`Y#7~96~_VgRBs$vQb zyXPq7?avKVyF2B4TO05gF;g!!)r-nRys4B8r}WExI3Vjp_`>kj(GbNK^j8uHZ{`r0q$b7EeNl7Kf##;S9sqjd@~sFf-DLCx&YC zj-nFZ?;`rEKt4;(M9{r8*PhnP-S^C@iAr*lH8~;6Y{Q0ZuBLEDpU!M=gG*-IrSK`)#*s zf_Jtit-2?ij-5AUeXM=1FHGKW&t8=gBK{^s;|y)J((B%I`oTp-Lgs@9;ICq{VCIfl zqF3q1ByW2eT$wWh=)8%U9PL-y6Br!1^;y6cqxTN!$|4|hprQS*o6ukPp>k@(4?dTm zj-~b{I%;0$u8&1VJdLj!-Z!feE-fKzd|R|oq~@{T?%M!^QqoZXBIpd$w;X1eaz$*q z6F5fblOEfo9g=qB>RUC1aiAsF4(Dhy5zxtoY18N2seUuNlDUjznoRD^d$ zS7N5xe6J@#orWG3n5SKU%+!(?QJ{A)obyKWcAB-*^84zOz-gt)a?2ZQu358b*ll+$ z-PuFlf-}!)k4OS=z3gN^Z%fE9N`K(QxwNz+Cq{iR&F)z?_W@v)0q4ffrKtK6#j+^3yU3^BM%M?em14Uo|6nsh=M{dFx! ztWg=`i*KtoHEsb^jGxB>!h9>Nx$@)`Rnod#oCzt$Tnm{xHZVsNYh8QvE-ZU=&yKe2 z*7KYXLgUL8GPXbp9j%{K74KTB_Wj8Dk~sw-rxj4wBR0;3SC)@A=F)j!I+BZ<#Tzq|l`kDezBYW&Z((;p9g*Y7om`z`#S(&eGX=BUTE)FN~72mS4PG-nPcUiIDn*j3ArpET!EtKa5pdROr!L_fwy2MaP z5JJIN-+fWEA^~{Dc1|E}<@HW$*5Y@`&Cx=;Tn1I??Y=D20%4+}G2}e<(z9cR(kHN+)y_Z* zv`)PZWOma^h0z*iro$Tm(<$rlR`+s5WuaJnfO3D@oi*w?~%#{2$6mb?S% zJ5YM9pa;3&c+hMQq&jgB*4O4_CEo&cl-xR7Wuh;O(syjsE4VQTY4SV z3JITaTFtM%p`WfZohVg?Qg%Z4=$GrRBe_cA;AM&rda)pnJ-R+p0O>(t;R z1Ify~AJ&iJ7wpD^t0XSUHMJmVcx!7QQ_+YGIl2bF`H3S8hvd+Qd3zu|AJ^C@e~)ql z6oCERb4!N8TWG^c9potvsu^lRSbU?Sm3G;OoX!(IG0M6ZC*Sb&mC}2(2JP%rRC3kt z3d*y&8Foj@%(@kut|`zJu8aWfq&(j4i%~!OiVB%DRc&8?KGhzkvGO%k zAlwV(bYpi~GM?4n^>LdPay}(EGnKuucr_ARp|sg%RrWt}O;j_LH*BtN36iL{wv?}f zA^29JbJg3AI?hr)b%-b}6x~zT9j`GdlRmZkP#IgNfT!_u!}-%w;98a%yvzCy#^)~$ zQa5s`J12iJW z6>rX~fV2v;+^PKO3O9|VL#snb6Aso0snqLW-Y1avha);Rk#v%xZZa976AvA>b*?Gt z?W_1VnLw>^`soIh;{iM#whQq~QO;LU_A5Hmd~cN=b>GK?CGJzeluZl2yYiCI<6ngJ z=VXf0)hCPJxYIy2wDt!0L=>rxZ0L-fN&2;BXY-BGW|Tsn2P}vO@~d$#QJ`Lyn=7VB zB=@*fBRM6?=f5ag25iEEK@}}>aQS(jXz&M3U7gt00k^Lw;>39~@l=oNkG;|JCn|h* zcBn)WnXaL=gf76LS2j7;{LP;n?vKSJc&7(J?g21af zr*(6xDpYl*LfFh(8@pK8$+PUao`=B6qT&VF*n8TX|AN8f-~NM_Obsr!WQmV{W|OjS zV{`PIxT=eY1sy+sVm=DLmdUk8q)QYncc&<(hg4!(hXp0EKCjKt5T_JXa-cW$cc(Z^ zc}~%)S@ZNB!_I0cJ{7mac8Uf(C|(C9z;r5j-#eDZI%l*yGA>otoO}moZ6rV6b)any z&Cf|WV-_k}d%nv67H~K=`4j0GQx3Nwi@y3CNkAf1PE0WWQDlU7KsD2kVVzg+gWh_N z&3lhD$Nvpl;}E##y#y3x6*k@wbliK4t0;1+!lGWRH}J?DRF-Rw_BlOz&K2MDEsu8L zo558CBfSDbcO-->G7X~d`v_$aKXfcGXu2Y^K~O*1SDMzs91Ny~SRewu8W@(kKeAnD z2xy3g!nC-7N!(Yl;K)}paqDEc6UE`cKu92a@l|(M|3Q3ZCjG68e7XU2?@txm@&cjw zd#8tIJz9!d=wfwQ8ztgL=IWd5gbli*2y%cY7*RMD%oy{fAXynxN(PPKj{ax=#2B5B@74|YV)f>7TMbE|8Q-8kXZo+gR0q8qk??nS=&wpwjSecbv}5_w3vYuR2W1Z> z3yYrmF0ZY$Z2U^Xo!zT?Manc1p@tFu?rH!KeGz@{`S!!D=natLOCPE6lJEmnp++cl z&@1LIq&|A3FF0GmT19OWXnR-{B#|ev+8_E3ae83#;n7;rq;j6y zr!9>#^L89NMLY^L9pC;vSXC@W%r#Ol`_{86Uofq!wz+Zxi)#&0;Y9??sh^=gzrZ%$ z>x|GSHJiEhqe<<8DkyGevw_?CP&CI*E%E%5P}h@Ya$lRGmAyi4%NJZ(jV%D>wYzxX zAMgsa>@#_ViA?hKl@d6OKLADt#_(r8sYO<%O^lQAP}#Ow`1 zF{hx#?idzE=?8sWj{1Q=$skFluzQ%r5v--`#o(Gz*tBB%*Ma-1k>c%DZ?ZPFS3QYn z>R)Vhn&y|T0`WW_hlsS%AG1uBbDXI0;`noe&E&9n!hmbsucezQlmOB~R?CXCr$iqh z`}(eLHHfi0(*z`b=U99|}>}I#ca`#<6Ct=xloVvp4Qwh0osN^cC5khfa(L zlAghw@jF#;Ei-)EapWIB5JJkePJIYOUc%P^+fmdB?KiZl|Cs&jB zT3x&~V>5fSiRt8h zp!XY|F)Di5p4Ezh!rOL($Nv1|t82sKjRri@y}72VHsH>Cz($o6x>MXD0&mj_#PEZz z+b^`>;BzUw6q3+W46!K{S;9ayf;>YU`g2ygj4*G>_-=Xo-CW!0CP5tp4#{no7iYHa z&-Tr#zt-plB8pm&d3rN!z*@X<1`LC<0}?;9*?-^ru_X0@UAzZr&Q&Jq7vc4H@hhlC zEm%m$m`K?3_U~Fun*bRR^3b2ur3Jc;ll*$?@MNU~l?zi((c?_Ur7e>FAg|+T`D7Nl zRkBc%82#iMf^0^A=g)J!0!DA}UfnhyFMh_IZCNss$0drZSa?k#H!gbh4cPCVyzt9< zO8i5+#wBj*N8VPM_hhI*Flnk^=;!6vkN0(q$5RTG9|7a9hK&Gn|MuL8vXu8X9n{tR za;6Fm0uqU=Hz|VFV{`^_SbKqH^c(62X8K30zTfES#lN;k1q#8#q(5>#3&o(w0pNLV zVWGms*U*$VQCYI_ryeU1g7=dlZA@e74lJ<(GhE_^Km}yjb|gX#_#Tp+m0ucqzz6A@s;bGaEC7KE{&@~M30Fb%dl}H0jF^W2Bk9VaK=m^lRGiCv(tA191 zoWGno;69SrA;c!SE$kcOhh~@f9K#01rR$piDH+7$qi@#aK}z8lRW9~h{q|S4*9#$7 zZzCLyV0GyU|9b!=;FGt?-4`lz)Jr5mD}p*#qhwGYZMXUMeR)B0EIpGa1Zs~JC_@JKL_STCczN)ys=!;0gAw2s#NxSp0JVz{3*c4I|#m2d4w-<3m zub@u4Pz%=ln@bFs2;d0o3ryC>ZlyUq}d@9yiWSe*KyO*1GcJy@5m*xis zAp3J5S&o9!Q03(2Tp?<2l1@uVRNZn=&k9s6tSDUN`(t_keD6@KEqOU_G~uIB1ZV~&oC98rYT@zNWu$PH^!@b>@5z9#{% zh63XtM=r&9I!s?AuV4^{YfOSXRV4Kno@*(EG%uAM&6MK?#9A@5mx+w`i{d(gCTW=7$LeqDNh0BE|1xJha=o!gS*+xImcrX;EBoU5d8(w?c zfi3}sis96F$v1_!0vb;&!fz`pbX>ULQYXV}r|P>BH_)$ND*ct8yDBK@Sd3z$L=xHiL@hh)AA<0pgobMkzJD=si>l zHBhgmO2tb^$>7rol$9#EubA!kiHVXPE2S2Kp4r~I2 zMtkCEikO+zi$9Jr0n?j-jic@90V&7T`f0bL*jX<#-yQEiuq_7Vyqp*Y6>iZ)KP;lv zt#?1`@?&bdo^v4Pags-Z`h3;_o*fN3VUo$-Xen=o=w;`+H|KuJk2qrMk!cIDLhcth z>x>LY`KB=_l!sxH^Gm7^I1~l3Jap>O1u@nIoDG_E*zdc#|xHp>Jd>^ zK}fYg0Wq6?M!dv>gUX#vuGH%Edrw}&zrQDpx|ihsrN&);ZiXl1WVJ)P+Q}tRM%6F! zvr#QUY=!p?-iX)#$##IkAbmx2yzw;u++4INkay-=B0$if;8JsDMq_!&k3^E02hUOT zMs&d>?w4}xC%z$0lu;J>KrvRiCMXXT#h}d!#f5!2E=}Tquv@(q0Qe!bb4&VV8XRO3 zg%>rz(9%in^l*&|D>A(o-1NRQm4g+b2AqEK;!YllpK*HS8UZ%sz&5zYwDS_yZn@F0 zDrYIZ@Y9ldKo~_A!NcAf;&y0fDxws}x5BdZf7pA^u%@;rd{hw>4@wagm8vL+(ouSq zCL*AqfOJHfG$BBMP()Nfng~cINEMOZ6Pi+@v`8-@1PKso0tASV0C#gdmUDjRJokUU z-TPdg#}CWxHhb;avu4ejdFP#oE1Fa7iNgN10NK4taB-8rK^U7<>0N4uWQjPt13_HD zOLoN)nDD%KFXdB`0PFFc%O!UtC9Tx1e-KyUuoAhiB9RZ<0kGITmZ&ol&gY)psZUA1 z^xhcTiZS%4HCk^fM#eTScVP^~T;p0^Dl{xZ~o!iwn*anwF1+hwF> zMLO2QZXW&mWdv+j1UIbpDmgKI8K8vFuVVD=mwS!Xf@?_5dN0Gniq}I&Q1ZuXs5Fq~e^E?zpis1-sF%U*I7rGYRwNP!56J zxul?zKTrTPqOyn4J>>(f(Tn;aB3KO=2aZ(Uc_u36Io`NmpxFZDwUFTVp+v>58err( zd~LyRqu)TgM%I)4l(Gx54AE8dXKea+llSrTexLQHWz4O!zZ~$!cCK5ZWlaZ~ zJVI+?KdpAiG!51OfuK9MN2hb#>VZ}XrqdT0Vu8L1v$a>mY`6K;?{=krY-_S26`Gbh zqos$7U1L;2CziUFJ^1^CfTAscAx2yK-6Kou_WIm9o0o@ZQM59oim7$UErh-Gl?gg@v}YsW)g{2seIQIL!Wgtr6W(W2l|a>;=6c0UfvbVpcumYCldChA}#Y{QWxA0 zdA->vSgyVpV;shK_6h3U)rY=0psL1vDZ-B$>9;BeY5#zG;$x!~w$9te3a@k{ zI1e#iT<}w4RNt`){m}7}iCcPI>Eaowhvl*S_jDnP9SQQLbaJ~!_ApRH|Ad;Jfu~$` zNIXQg_)=WHWav%6+^GHr{XfB=b^t)yGUosKD9IZ6{4aiz-N-qB7=1)K@h46U z?00s7<(kFUXViEG4%u7xRbMbdYXAbKQYSdBSpTeiV7zc60CVu5PXdl_G~^jcmtDr< zr-zwul-qUH`1zh*@SYA4KP3hbaVyc&Skiusmn*vYGQ#B2xS^0qb$V0pS(Q{FPXPPy z;VSgv?Q@!+mb2@MJVZ`TCjof?MFjD+<)c(v^Qfly%_8iMlliw|!QaBfyHowLixBG! zx%zYAm?=@IeJSBg;wuv}ea7JkbY#@SN(1G(VaL*kh#AzwX}`H|z`oSzS4-vgw=CZ8 z8NJ`ev@E-*zOdeAjbE$r=eGBc!D9&3amXmhlJD=6{l{H@{`DyxaO=kw`-$_vaC$!u zdOzRkuR)_+;B|ahosit4@yDdNdojP>QA9NP+A+Vyt!*;QJrN;$y=1BkT0^Y|KYgIm+lu4qc04 zf^f)sSrDGj|8oobPF2PDj`~!qz#UhR@Lw(&;68i#QvqSj*8mTeLck$Mpg@OldN+Z( z?b7?t_ZwHGRk@|}_F%aA$~n1Gfgke#%>9Ai5Y6B;xi?I$i!#zkR_+nvd^C8T0dhuR!0OS^wcvN(lcHAOzrk!l!tv zw3&l!QltIvh@|KHnyOD9`=5i^Pig%eC`#@g)!5RmXea*qK>vKzAD{RLfGT}X{bxAh zC)wA(4jAbH4BFvf-Uz+FC}VzmvA@nJzpf|)FM9UF|LmH-KJAamK2_e;zONeC*#86V zV@w~iy8e^x;Ff@8hG92*^krK z?k5Z^*0KP+b4$pR6!u@s^_QMK)}aO(>0$N!bmF*W?@rtEw*S(z@w*qs@t0rjS}gpg z&&p(|EMTx2{y*ldu-gbPH1dN9zh1%8UzvlSsI^!we-oWm!^8c~~f3C&v16u6vMz<&2|0lu? zydJnX`ERnNb)W_kF#G@>FdpcINrUR6P$*drRrptDm7iP8$FToRe--VRLYD5_vpd@A z`kPX|XZ+=i?QZMOdUpPoAg32{o)7=5 zi4Oe2`|<*aXEc(xAe7^<`HB$$;gbbW zIc!!)+i>vz^-HxksL$2iIMihIFaBKMmvj4=tbu}=Qtw`#8n?A~&7thZqSkHv=KgDU z?X;A3IoYS$>T?l}Kyuh<=4K`-*k@>U!-4-FbikeV~5OV+tU&)Brqg>yOPEC!YWq zxwdqr18bg0v$`w*f%4w32z8^X(Dc0Lf~2V9x23_wFW$9(iFWA*5V%5Kc0J?G_*2+F z2X8dS0mk(>AV01VyuLU!xd}0$oqRC z;dKrq=Z&d&Xm+bDR09CP$whXT-o2db2kF}gvNI_3^$rCB2fg)6^-Mh-O){Ka(7%kI znJVC(n6;F(S^Y0UpY}EtB9gOr3%5)xYYnt`DW^{FKn8gC06fuYKEvXd3#clcai?f5 ze=0u1w=V&fSj4;FIEPC|Mu8sU?vm9266yLjWg~Un3cFha=|V88@xxWpv&73mJVTH3 zy?Sp9*B{fj90Bm^XOqR9V*}{fdz=P~jB{H!Cf{i!3#N{_5ZqHopjYgVX~YZG)eRY` z!+{n4xg=BF<69YUc-iG9eZRGv@gToAE^vwIoJw)qVBtM(`!RoG-JF|zh6`E>>` z6Ec(KyE|tZSZphi5)ULp9uD|F^j8}qHjkEjfZ2zm$N-X6Z*aoKZ*1&y!tE8lv>(Ob zfOnw7^-<5-G9W4CH*-NPv>$99c=ONNHkMa1*n_9cuD{p<$};vze0c({T=*U@Y}Dq` zoW5DQ)2IZwUHqQhBP0s}Fpp<}a8$IQDV(O7DeCZ9l~W(%`}6b+c(hZvTcWe8Kl|Be%9s#A)*&<#KtOJ>Pr*}VFw;QV125+U(iHS zs56$A{%IV5dYv6rjQrx^v75SuZT96gXcVQ%dC*?rK50=nTxt_txi~VrWM}bEf{hH6 zQ`X)GT@Tg2d&!_j%5!1DpsuL?PMYNH2a|7a_q?@Kz6Wrc`q2WN4&Jm3)MoDEUo8n~ntM)TZ+qF>L?>yF~U0&@u6xfKmCE z1txI#KGU3o`r!2D6<6Qu8ia?nSGFmIS>XQz) z`fTzlK*{;#t}C|QV_ttm&lc#hR%(gm*;q$amRfx91=_O26^hw*u?ehRaT&WtD)Cu6 zlL%zQ=ahnC_dgGM*;B2-EO1PbF*%d^@m#+`&z2>>)h8ip%ULv7Gx=PubrfE1vU=tG zE`@EWVd$9z2mmX7(32G^&G}MqN>N-mI0+gc$f#Z%xiKstEWYlOHgNVEmju%hitux$ zZrKVYZ)p7%(5mq;tZhLmVAiwnTGZI=PNh%h!_NBv^~;UX`AeUe%RxBpIu;H&MxR$a z8W~Y8A3my+DkLy^{OS>I3PO4oS?hia$ILgueR5vhKdq?>BYS zd$Qkgbg0BAA&;~+_(XoGEt=c*vG9FZX>wIt8=1CJH{x*6#j8#ucLelno*!)Tr#-#& zIuLRATG|I;9$9URu#*CP?c-i_;aZPYIZgcf-YzHF1m3a-(Axv(LI6%DbhdPyZJ8c+IFY32IDUdl6jq?ry$4gXPm;$S#kHKuVe8aOteDAJB$p&>Fy;z9FP+;kr;T)7bsUM;#x37!#pO}7mc;Wo(Bh`Z(bK2eXCGdD{Zlh^KqO0 zRA~N;?nIw8ZT9m=Zva$&^zJ@8^`KkE&npOg@Z)0u;A>EIO_1~HgM6ccB$S!!4I<&jXQ>tBG0f>m>0=kCs8bLiDx2C(cG=XR_Hy}!|v5f9{M8OkdiB#3gcj~>d&%3?`tC=YeS=)4`RHfxovVWh$T23!Tu5R3p(H;KXo`lsk6FouHqM(0Ybr@T z5st|}I1jiLyIl{h`b$HY*zbQr@5n+b4daw8E+{`g0vnuae=W6EukC&7gQ$%!B9Edf z@w&)R5Ga9)6{@G`K8i4@al40GEg{Xf$yOI~lTZC1J_1UyjHy#NwGJDDu#W%h2Lh($ z*eTHm#gyD;8m}dwcfl<>Mj#*XrACiyWXK6%W*uR@09j`f^_X)Rf#)a(N5XdTTIV%- zvP6NXejslrJX>=pz+R`QLolbzYh!Rsp(Z94~qpfmt19W7M<65#6? z4qmC|5VN_Nnu!BI26IyN29@s-Fvfc?p|%;)X#iXMjbXQ`J9aRXsNJ|CI!AwT#3%9Y zRBT|xDUoaE)Iu%}7MjOE`(XLjok@3jw306FRz?w@8AO*f4()bbfG~9?$!P|Q9>|3v z!o{@;tN}Rn+GfW+v26EQ(UmS4!i-hlPEF%bLpS-b6 zCU^|V3@$kfNvEbrxqSjMa1W;1fW{X5rN%t?ghQU}0LS>8YHrK=&$T3!2*kwVeW@g6 z|5vTPaX(HbGhUkBUW>o#Jy~{I_|ePrHxs^GYHCyG40x~nHt`y*98huDmkgx+;sB_O z27qU#zIMcHX&rFaXs-x|2<%ew)&mW?CRFKNSiL+|DxaMU8-L{7y=L0vKYMLWKhMoN z5vYKomtp~$Q|K*t4g+oC1kQ7roH7$;BLeP4#lB~YK*Z&Ge4%N!0Wz&8UCHmb24T!E z3)s`N-yi@7_FYq}AFzux8&GwPRM1DU^f82M0StcG<_&}_fI1YW)3*cAgomcLMMyBT z?fSR7o*HmQnj56h&=tr^3=uwmVd!8MLdct{hTV&-uqEWkef+j{#Vr;n@KheD+!}ay ztNt3zRe~S~NFWh(@J&a8RD=y@TPLMsr7Q{B{vjxMGFk1YM;TC`^N=TpfgioQA(oN? zJ;ZX1T+uB~KRk~>VKuHNZf66|v`#nA{uTxbVg7ZDK8xSNBBIvl4o7jydZoK~J^Pj= z^?j8;=J|Qj?Om!c_vJ8wx!?948P%iGp#rL2D|=JaA}Ja`r{f%)55QJ>m-OnqPTDB8 za|dXq!TIR*agT{c*7LNqwAa5}2vxbQqIidzIpp4v++6Uf4c4wlX}HgcQ+;A*gC|1o z)8~4r$(}fV+pSAO@ns6g#A4Wbdu@LBj1Q*^03u678+q1OKqUxu{-)@D%v|}_{JVMp z*WO!>cOEcskfkEQ zgC-y?W+clQm$VYcK~u0Pgg?9y;l=k_A#IV_^o3R{PyAV<&G*G0|G;Y1A8w%44map> z71PEtboY-PwU-*a;c+Uk_F1AcaI&kU>E((k^cHNtGngsMPN1e`-{efz1tUjzmWOo4XZrCriZ9+@Xuwt43+ImF%7x1YFb_Cm3>7+txh%}vFFksP1z zjLeJcEDlUdP@{IqnCeJB-d?%AInQt=drJV8H6PDYdOGKb2wKT=YZ@;6Ts16j?RjxR zq&KOOYhI$$e_HQe)MjUs@b|}BEHg4L+>@PC;`?)EKWEc;jVWY6)i%vrjcoD;v-9=K zGf@WS3yObD_wD5+MFc=$V~PJc_df>~7XzKD(3Mh4jR%6yfQO>*`-q@tZvrjyl*;A{ z;o7+KVL2xP(`L@#19nKc$`y@#NuSS)2?&bE@K<&p-jxjS{IG(@07rY}-As$Wg!S=w z$o3pWk7K|u3Rx$FT$qg`rtaRSKmL(U$WeZS6LK{-&1bH>Q<6%KbEny?lPB3x)T#H% z*qcZAhw<_`-~#fxsThGk<^l&ljqoamVVz4|YI* z%H*E|VVeCP()h+d-}u`{{P_dG;H?1Hklx;J{FLmTJbqj4d;0Oiob2hx-__#(xAF+I z&UtB||HEzvs$P6FWEm{*u_p1vKLk`0icqiSgJB_>b6N z4-6JWmW~?bn?d={A1RN7OjVA*E^~&RW<&;OZ@!Yz@YKfd9Ib4Ab+gl+qjk(n%ft*tX? zGrLM0j7*eR>=pm8O+}ZlQ_}46r$RvjqH8>nL%4l)9Em*x7Ic>{p(%(@}dgGB+_IBMV z%shgR3Gj`s?fN?xlMnr+fEG#AUG)>|(?N&QdPltwDJ6Vn$%1K)+uO>?sq4}}dS_7k zH0#(_@eZeuGrgQ9*INhOO>e|xEipHWuX8)y*LB%FqH4QxqfZDK@Wn;%^rN{8RpKb$ z8D!_i?EO#5XInNm)|v#pFCMROIh{#qU-Z94%moz^$Yl2;Y~}2TmO^u=n--j7Yb##o z;TW+_EE(t|=U=-Cr6&ZBNQ<+36c^`~R3~-S?QDAntTZ6ZYl;t#%mz?w1MEp*Rihr5 zYfy}P5(7xqEP?JgOSHmj3@ABFH~oz{Z1XiFiIW|q3gK8z0{TJM2M|8BpOnmquyf?>sVITxXM{;87-60>!L%_9h3Ap=I$yQ~7lkLKxgPcRU%v zGk|S(Niu~?DkB3dQ;A1S_i-QNDsHBuUFToE>$v~BlNxwIWBj87-cf!hAi&8Ph7E-0 z2Y620?KJOQ3TvQHrhAHN(+LyXOEc}sSfSb)g3Cc|?eXC#^Ri)k;#Hn_`^KTm0u49I z+L;F)R+@n0_FD;TD6so&Yjy6hfi~`!r1P4&gP2*8d1E-rM*ipwgVt(`Ijo)FiE+}! zMpm&yUsf*i;=K*aa8XEY7AJy}r~k*K&XIgU4BK`*Ymz`uOR-#luQmvQ2C*azKBz0I z-N3J(!)t-%8STt0o-n)-3TrRr7o0M@bC-pMOxo@=Pqxy#+!xxzJZM}oycX&pahad= z1@=IsW7#Xi8rntxO^;!G@q;W`VHmK2ohVaZ;#yZwvJ1PvJ+U}D{vmKgk2iamH!Y)X zGT^v6hLOPB3``hP%f~K)e0VuF&ON3e%8FdfUDJ*gQRK!l@4hehI(!7KMK3d!VFa_Y zJ|!VRq4?=I;kUlFCu?zTg{WSg*XYcJCWGoVn9d~b3#1CP{$u6SwI3Ft_|##_be}^K z&ZWYWI8>o;6n>*(^5j%m5!%g&#kpmQbAYm94izuxy;72QxH*;3AiXg+9aH2_`NHh; z(I@{(0~!?k1_3Q(3IK0bbZXW=G9fM-ICcB3o=CphF7Nmu44X^vbSNVm=-3O^;|te6 z8qWH1?>oujg4w8zNV>{VVlw;SWSH*{8OFJ_n}S9fu~8Ue?DXl*@y8qaQ1SfGL1h7f zLIl>%gV?XUGeB9b(^;I~B)a#0GNzZT2({>jd!p@n7MNtE*Tj(Q?W7DOCu-CiSv&n! zM;7Fmzz_y)EJjThV+Gz_pll^(3iN|f>mr?^48{*{cY5{^XK~XhE19crf6dz)!UcHS|1?$*r2 zfUegL;=xdeGU{$8M!^p~%`i(p*~wYvR<`m-`xW&IO*11rugUhw@6*a6;YV;;g{u=! zHpPjl6HlCcqhvHQoP`OWz(=BzOdiab}JZ}m8``Eep79D^0vXL9@g2JAC z?YD85p@AlCdzkB4A>As+Wx1Q2i7R+mzmXGKEw#0HrUyr(W0dRN@sJ^^yR|1Bc81md z2}8G5&*9IM(mO@T+0x zro=qI|9#(uA6x*+j)#`XnpNKJpf6?n~_-54~tYN^cb^I}x{jL;<`N<K0U^h%<~d6-PZ znq5t~i{CnyGp=%~rgPEW*h_7Mq!pX7pq}ez-sb`KYujj*!E3q8*2^xkViUaj1;7%l zMOz`Bm3W@28YhI{F9loLn z^w>vwkT0wILZ?Rsk$K<-PQ9vp4W=)BDC}e$8uU&U^e+)Fepp=0yQ$wp2pYQR4Nyz|bX?5gqa?rvlFiQk>`)rBVjomxc^(3MCW1dxi` zbQ)a&bM35TnzYeR6qnQa5FN4ClLX!GLe)f zh00#4z-Uti&`su@<*oweu@u2`h?cL_v`j4QScSf-0G##W>cq!>O_F?ls{WCvorP8} z^(=d}alR)U$nDA7op9(*^>o9|Qk6IoqbmVo^)TXWDcd);mMS(PD0#m=`rP%U;(%{= z;YUjNm!S&@+Obmc+=7qUzojjrmbr_IjpwT5rlIXj4Lje^CJeggvN&`nn76!_!{zk4dshA#_VQAMk; zkET(vB~#kpI1OhMo||E^!7bEj8W+_#x+-xS#ZKC*jL$3V__t3#gUWb18d5y*V@OuG zp~!917MjWGmuIF<3vEqSUrrwMo61_pnbdE+LP2_bPR@Hdvbr+K`NPk8*q)qkX{ddK zwZTX@Ry_X96_jm8YNxT`Y!5*17jhQbr&C2znI}=vXqdxLu9Wq}AVIsq`M1z-=4d^6 zA1~HMGQ#%#AZ2FgvQb!*e5n=q#&EWh!=6eG@B{;wE`%=MY$B4qA zJpCOZ%aTP5Xb+y1n|DawG7*Y*7C0rW0p$w`7>22CUjO6rR>RL=1B$WFT zvy}xOj*)`OT3aI+T+foBX;rsTf4sw#Qur1%c}6%RB#^W>n*D7=r_6_P==gm%kD)o_ zF8ANfs%?-Q-;t{+fLpG&cn^~orB3f_EwfoX|A{xi)r=Slg$@=fd&|#fH(F+0RBwnS zMU=30`v?>Th&V6c%$H*k<--TrN$0*uk1c=84>lXECBtpYdn4#RbT2;q)?Aq&#D<%i z=g7a`Al6;k3zse7te$~&vvRL=vd9E%&QwA^56MqttkXj!GwLqZtsRVV+@1%sRFcWV z7>s~NBB|J>oq=tjc50aQ3PA^fxn4(38QX{;`PIIb^Ok~C#o|^DlZ^gz+^kF3g``aPJ8=1-FL-j(V;6d@1 z#}Fw;$3WL1%!(;2t0*4K%ED0)(+Ejud;McQwxzxjQwc|TMsdu^o_j4t2(waPn(aUm zMjb1*XO5o1rUn&mtz#DpXs+M}aP$a@HkhY)^Y4|6O4G75qN#aO!Uz_D*eGT7aw?>|3 zqGt+(kSrnYZuTzTu-?y~Jm@(Dj;b!-;;@d4O;ZH^d`sRkYQOq|EY|E8~fJy6RkNt2%&iiM`9KMz^+Tro- z#DH8gG(FwU^`^eNG82y#ZU=}&q3gX&jJr-<9q6qUnDh{BW8(`~pu~ViWDlkKddTo6 z9}x{|8o5^mNb{`hKgeY6BV;D$`(z?7(q^0$>?Wl1qu6@9 zB`e=LbG(UyQT&B=`7wX7X(mMG5O2%&+4bDpLeYgaQ}{{_f8T|vMbbC1XnPLVQ`jLj ztJJ7PiD^GlN{tn{Wr#N_zSP^1GdRW72~G&vvY8CE^k(lMCoD%oM7GATt_!%#n=V_e zd5fj3k|mfwa-HN?b1PFs_=U_#hF3c(nY|BX``+wCG)sE6$Y%JT%RZ^#w4v4z5x(Hs zn8yv@A${I(SSHgcfNw$^@u`YtUB%%}a*>HHnSw~x@zz7cPR-CW(NG4zX6eP>G2x#RV~L^YCQ7YJ@*; zj~r;a0+A#M{)8Ij+O;8wg<6H{0(~g^XO<~32#S?V=oP?Wikty*Q(|Tot0!-W2>l8l zvInjPpx2Gd--ha6c15`0U-RSB!r>yBEh?jNY~a`O9@u^q{5pds`h&ZkEXHbZRrXCa z+@lts0K<~}wFfgtl)8^<`G&vN*wCH{(rGBHqZ3WjJ7#LuOmNW#pI3jOFN9u=j&~XJ zM4c>%bbA3;!fNkSlciv+eI`p zWg=ARpm)j`>DgB~yDfZbKm#Gy%-5mJ`r&OBK3HX_Ex16sK@)DR%c396QL!>Z^w2kP zE~ha|vn6A%Yzi0E7@^Gzn_`WZbZ!s%@H$#s+9?j5I6S*&E>#HSn~X-6jiB zP}dU#i*3Ww1DWfFJ~W}(lau&jOWEB%v1(AMmmOIyf#kvxI6dykY?94OHDm~Hcf7W5 zR;k((R$&-SNxNDe`Ev!z&#>HQh?`v}qeY4B5HDzSUR%uQo$BVeGlQ(o<#l6t?$)$@ zURa+Ar<4w`@DiPPaRk4p!jW^TRoT%K_a1atSdGY4@*&NJDJEff*qA)3*TBtZf zLM>5#Mj|(oLlespRmAS;`tSpJXr1y7Ou>_s=6%c0gy9coLPmyKo33;z+(*9{u<34@ zl^BC*856nzvWC3uHPToKddT&S473MXhr$Bt)USn^_C+{1;c2@3z5xUM7IRr@%(V`f6w2!=a8@0`Lq3c+kSk*cFi9a`3X z&!babsV6RNz3iJ4S&w(sW*2yRPW4{K+U+c5U6yS06+6F~NSqk31P#UmwR>#~126FY zNCeCS?&{$3oQ2 z##C5X$rOCX@t4C{b;8GYPB(DLUB1{uRDdi5*)Xw8!|a2#3<&;C3M6@ojG&>)i?D;} zD;=UL@fHZv>bsg7U=K$=v=!e$n$F(S4$^g> zjngx^6NO*S5Zb)XRE;8#0vzNw+JWOmX4qG7_8}**o-F6ZT-wGKnitjAll1y@O!g(p z*_J!J2G&xV8UbSRC?f3D2GvaxiOnzsC-1IDEj@8sXF2?Z^O*-<*o(;CmR<}-4R9g{ z0puQYVj#Lu11Z{uJo$pqoobrZuYcy~db60|IW86!o?Mw0Rd~w8gwuPyGQD`;XdXS1 z4#6?kxD)fdu+C%Y84keT>d6*e&~;zyO}@2kf{cD3ac%tM}QthHY`n#X~@lxHK)Oyu>qfu-$JdfnL&X~V~VoukBduIMJcX;A+(5Wqj#O2UUSC5?F)R7ex5?*yOd#0h0K?faEkz`!!aO#b*YurS-hV2K@>tsfj!vPQ3puq7GxV%L&qtD|E{W|@ zJ%ZSJZpzxBAxi;Uz_0<{MW`4q1z=@=!a-hp1!hm1FGL)g@YIuS$|OTagmP?mYQHAV zOSt0fWDlH8+wZn%3wC~OZd2Z(IBNRsm3#0b2?4R4k06f9^>+;AS)ZF$AoY{J2ssey zq>Koqa`o1z^9wqJy034pd-TfYbo;CnTX!&-DWIlgV@$ybC2z&ky7gJX1vAz;(iv|o zHfgyfNLe*ojkHx!F#`E(hNOVMh)%k$hy|~Z@H9cIA-UpO$De-oCX!XAAe}&pA?W(@ z&6w&(C2oI=%DP2iCKs^vLdk-g9(q+>6N%S2HTP%L?JS2brnb5A&Wp*rJ^-(-g9t0F zjZ?j*tLWGuMiKrfg`1`xx!qfA5uNy(^EXE8Mjgr)DEjUn#oZ* zh+c+4S)P;9*WfaQWqCsJ=QCD;?{QfkTpTv+eE1jJQyK;pP%F5Z&+JrEkai6$)OLeE zJa%3}2M*Vs!aUC-JJ)&UM(3gkaz;}gdgYU$>BJ8^+u`_eU`9S)*w4D02wGS7ri^({ zf4wk;^oC%{j5)^EJ~bS*N+PQ7!@t@x`$C!gc6kKX(@a#UCr1LE+jU~@t>Z;o%ORxX z?swyJMRjjC2B1P(0%vwcgcf?_llkMbF=VftI;XAbf(G_wy(VRfU)JC12t{zOCZi+XB)rincLrBIFNQ^;24=6~5WO!E>iS|a|5CuTc z>qlMyZ?k0wx566t~IxWRR_uFnsne_pOps_Vx86Jh`dh>(6MQ#FaCZLltLL; zgVq#rW%j&k zF1gV~=iP+7^Eg3_gm-7=$HWMpaVqH%(DCP5M{1iC!z-&BPtV(rzL7~h&f=cYe^Z;T zT_#6iY%>)nH?#FQ@2ZjeZ5FUDA{Esghl+%-56jNSs9!~nPTXGfA-(g{u}jc?1|BOJ zXAEsUpLx|_tV-uf7#mk7b_%{`wWI4Z8fIm;P~}6)-1xBSjfukz`w11`@K+`>{HeYC zU3>Z$#{;hK$JjA#uJ}c|q^*~5Cl%FAeO{Co4G1v)nS5mJRt7h!fLr{i=I`)fUeJ(6cK<$3}r6SeD4z@ye|Q24BI zu=z+zGVF7Rv-(6==S;AC8wWI#E}quScc~GSWUSk0Th&K``0RraTULEj2wCHI2L%k0i@HUaE4*h;ZuR9JIxf*5w>Z*w#x^epT$gZh$E!i7 zqVPU!hw>yM*^i#NX!RboVQ-uw!FPy5>=$as3Hs#W+!CtG&JG;re=F~n;E#zCN z?HHu9kYn&?!8~}qmv*z#>_qRGJnL)JK^YfrHylSs8G4e;ue$PjxMPNdrV0-?B(Jjy z>7c1p!QxF>vv0|k(=mup9H|+^XSUO?*CS1=UN4*n0y+g~g)L7c`$+euK)WzGQ#NYW zhhPwCnPYl?GmVfs{61!VOXvoEH#p~n|+vo zQ*by3wmgZJYn3P4@+sEzZ|0Yy6$)j#wp~sIkGbAA-(Ga@@Iq8+yBPDfindmYIKJ4@ zbcd|Ha6ck5SIdgBGND#*ds#eL%|cF-d|khooGW4O)1W)t30zz6nlVrM=^ zziv7&>@#JPVoNve+f-e*q%mKPtPR71tjvjheb;7c%L`hh?5Q6@;NbRNJc$GM)YYn+ zVXVd!5~SYXdW2ii;xo%kKxM-T75U**SKeYl&==dIPA< z;{@rO%O0I;X^A_oV3&IWlR5vwPKjxM=yg}i3Gz<4DKpElbBm-L-U@V&iUpV1GUrHj zNCN!)=j_kmLiIFbd{T_yifJ6a+Pw1Ux?}b93oTj9S5u5srgt|^9SSEdR=M=P<^x}4 zF&+0MhiLXbBZb{R=JXgFfPwpwrP{tBq85f~EqC-rWa6+?H%!W3SZLwT@Ioq1`)oHq z3slGob9QwV)|FKrS10(l8A2DgUcX^?4N<6(U!i0=WZJQ>Au$SNS3@*ZF25aJyY7o@ zXM=JB2bP(Kiw6{>A@7qb2(^BwX@Ns2((B`kV=E+o&eZl9jEN3Gn?Wp!4l9HvSFZh=9j1i>=2vz>rDa(@g4I7R0_6lwfAxu}EtDDwKI|WGrp|@%= z-;Ax>UC{RRMiONXD2WO;$f{=E(kmJ+-IDF7uVxq7 zI$du5!a}FK+!rOG9(6gIw-qUHW`eA)d&>>5Pw2`^p&npTsv7)chna|WmRZ#pArl+^ za0)YV4zysK2}e39P;j2oOiRYL{lO9j=+g1Bp%G5p&gW@YSBh9eeR`cFhe90?+y@fJ z+ks&uW+0QG^Pc3r!-?Te2$;x)_P(C2fyzrCtgtU~KhPN5^Nf_TB05P}HUr!|$_7X_ zlb@=odqU{-*)-0<#mGyQiIO(c158rp1oB3nF?=@;KupR-CJ7HQ)1$p7?bnREOh_A5 zmX%*+>+ldyWbf?uN$6jTyf+-+m@smCVKL?am9Nh4kdOxjRXQ|D9|sIw_Y^zUAS{QTGVq z!$L#Mi4X*<3yOU}N=VbVc$K&6NhqNN&meuM6Xn>&O3;%#G^2ev0KbSYH0CYS9pBU| z^7duD6={34#rx6w13N1~Dk#!iBsFyOK8I_E4-TyD;<+>T*?VBIQ-5b`nm58p9qo;a zF16fV+|8#NvzUTWbx-6@f0hY6eX+Rj`VFy1H3FjFw`Jibn$1+IDN8iz+b9{PAotXI ztk!$c0jTrt1ek-8?v-&=zx;L!*nC0pxp>sT4VG{O9IGIBuA?4o29fY21o&7-Ws7Zia&+c^379uFn5elRh z;clBdAi4}CgzCEQuNuW4x@xY$Qg<$aiRH7wO#u#lWBcLIQtb_r;p@w~(2edx5Eq37 z?}-=z^PvtSr)Tw^-bpcjQ73ho##vqJ5*AirSe=|g*ai&haucklK4`sV_SM}taSwm(!ZiNE`DMoC{85j-R19Re z5jMIL#ZrZwmIf0{d6MqJ3slF`n?0rH{6A88swLQ=B3D)g+f~S!U6Z+sRt;`PWR^cC zv{t tCH=Hfsm4Tv|56hlX3rD(-WxB$S)aft6&YnWrMRHa=c2NhwKHyPP4}Rj`_4 zUd5tKjGzjdK8+j*wJlc}*1wJnn2YCujJEfNSl7#WFr1#6W1;CTC+7~h4yqjx(CN&@2 zQJz@=xIu|s`WF}ypA{K?u{-Sk@tH)GK%O9wMtpHW#9{ZrhCMXYkk_kcDt*6W5`d@E z(W*3TFFU@XP~On^n;fa<2gGzFY=L}qj)@$SoXGvsUxEDDpMs&{&rDpYH7b)RiMQEkaM8S|5ThOJBZPG~(}ON>T&7h{On-gj33smG4PGLqjT< ztFd8ej^=kX8~*@RO@5{GSz<9B;*0m2Z7s;327-`3XSO@IWo$7!LL(gT_p3jGle^gA zKsNvb<|ZTc9h~@&|NiHV{lGiFGYF*mtHkDSzyJN0+JHOS7AJprEB|}r9TvugJTsa< zet+=aA9WG9gRd&)Z{PE8Pr7BQSe)x~;^OZg{BJiXrkenFjB0ED=esI;0IxcCH+|pV z|KAU6;GQu4{^9mCV^1@FuP*qt^7b@iPc!y3V{bS4wF>sO*56#4Jz?w#;;5>t%AMi_-}6Y zo-p==@$V^~J^We+ww}Gb>u+mnPZ)c``1h@6 zPc!y3V^1^o9I)S3!JaVogz@htVNWymG~@qBGnRHx@TyZ%^P)$_ce1kuY>nt>Dvv3u zHotgs=zh2zwbd0Kj)}lCR#!xpUnY2A1HC@79yZ_^J7smgStYE>=j^#qT=S_5X$&E1 z$5sDO3B84K0?+%Fp-X#v@SD#U#l$c!uV6A|7&y_tA(!PU14iOsCN)RZmIh1J_;1vu ziQ+JGRO5gC`@TTf$bQd9Wo;?2zf_2?*ts_fC_nTV&I@TVyE#IPrZUq)h28}_te zPaF1jihtYu_iV$SZP>F7d$wWEHvE=L`O_r)gm&zi$UPIeXCn7Ze>ezxi(+q4>@AADMe&bJ^8b4lg&`;AXG%PfkMY~Q z`L-;L?bqW!V?W;qff~net>3)=(39uSsZ+OVkADmkJPl9fSNVIWh;~)E(P?xux~%L! zv*0;*6oQ0X4#7<7>j83-eOqz<+ z&ZMWBv}X4t6sTa$*eWTTZGJ$4Xo@Bv zih_a{_nKZbJpQ+T4u8Fe``+i{_dLJnc{uMq7w{;b_Co2q(J?svgSSCzQtBcKHad$R zV}NJ*@O{BYHqw!B7(9yqt9#AU9m@_`_zT9%@Lq*-JiM!G!{-66eX%)7^y8ZojqC4S z0gYzoP5BLqCHB*Qg96G#5Q>_~M=3#2Y6@P!77TPMPI1R5u7&pn&wKf|V(JnlKe4e2 z9XnCdW*-Wxc3E3O1s~hrV_~j$r|(|ojo@!E@9Z{D>7CRGmS*inkR8K2DwJ+l-&Y=3 zp(*Ns;BAD@rZNFsIAr}L#RszLRe?es-{0S`T?|>*uKLxrT&$*?&M`h|rd*tN@av-;rihDwufpUk5_k&v{lx7GTZ>v! zYjsCCj-Bo*St%8o_qUwEDRjDFeSCMzTpR2J5G~7`Ehb44)IPlgr22DxFmE{2lux`! zDTO<~h9ppqm(9K!w>nI9t zTmOit{_@+mpjIHLw+;n5h~c!Ec5E!&-)hJny0UC3Dsl5-|A_k=#@Q8*=qaw`*~(jv zkyBli?bu!f(5Pc8%AbX5W{pKbsv~cL@5z-`2XG4Z5|TMGVC*qs49u}A)!p*olw z%>`Z%77+_DY0$k+Nt7+K(|?SRR}_F$Jl6F+e;{Z2QML2EOr-ZYwl4xVdB)U_o22J5 zn8rMdS{-;2Y!nywPHlnQ7JO(En%>zXza%paC#vKKt*V@%$P*EobW_p1e{K6Xgwv8m zLd}E(d6V%b>8Gla9CBkB`_v5cW>j3=c-j-ulglb|^tx8jzGoiK3(2$t%(# z2`*XThe`kZL19kPYUjBzp(w?lfftg5C0{Z8z2IMy_tuoSJ^v0z0#2J2^vY35eySW6?%WSUdSxC*{o%mDG(;BB}g6vh=;2hZEY^lN|F z9k&x|bf^P^vALqB=X?!d$;e&k8b6NC_bCejSstAzvX9!s(3dxF{36Fy-1Y9mQ+IFA})^>^a|?Nl_Y zdH8mNBs`9NSJlU^!i6Tq@+RN~$O-(2uDc)thny3Zlcondm{GCWhJQ8NU^RWYB=oFtA{gq+M~dU9`GLR+A^p9%JIYJ}`QR3-DR0^%~&X)K@9EjnR%7)^K~ zQ;mnWd^MrjN(g8=gXPJic@kG?8ZCJC#bvQxM*PMI@93Km1eQ)7S%4tbTwV=$IW!HT+r*mxwJ6Jw|K)b&aNf`Y-&MX;ZBwonzglk0S=_a z^{D)HCPIl`7X*%aFH1cRu6*$WOxef&pe5I4tIcWoYW!c_UwHW}3sc%%2ZIP0XvHJp z35WBBH_V@R@+~w-ugD4H%S7-+g2In5SScDI9WB*yfX?t(VE+0S1>z!?FjKaV^ z<>^uWx{Yf$>^cI%h0f|P-Vm-mOGAfTb8h1eXmG-B?+~&r<7w7IcLEW&V|Z=6q1_q$ z4R9ikZLVt&2xiL*!NwLA7_tr}^M=oh!BDZLSs$6zS}qbk1AToUw`k34G$pV=xGrD0 zinHjdYXo_MzB)Nr)U378T;5rs{6|ew>dO0c&E~Bx-f;r6JdF(feLSj6@c8lLmk#Oc z$dzybS(vPC-SGl5RM_p}RW;L|P;y1*E&Xqy(g-yQEv1L%f4} zf4|=Aeb#!{Z>{(F?{{1hbIrA9X3w4-pS_15IT>*bR3cOe1cD*)@|ipYg6au@AQPb= zffi+%us-nZtE-}_y*$*3!rIo#(8L@@VeeuMqkuV^7(yVE`hl=@ z2FHiEJ9&FA!n9pZR{a|$1v8iLf0!#P(I$T0AlZ1QmpoPW5p^Y@q9Jx0vB0fdVQ;;z z^@}$ZgLo6NYi~G8!z18T)KjySad#t;kO*&W-1u4rfamp31sY7&6HkKD^BHK{R@;`4v?5L;H%oi05?^7$T?~i68mGJo&*Ka=$zpRyaiR6g61Y7X^WBBl{C7 znvFWAyp(~l@cII|;{{cXfvr;W*Aj0c#g}2^7g(N7X81HT)1P17Lunj8?tFqhc}E>% z>Po0`d-N{0Gg4uBSkvfjLm>$(`|@#|fhG)1O(zZ)tml-=bL6`DvDoS z?9BwJRHfx8#H?dX((Oe~DgolP9ssDw}{1Z)iq`Q)Fy_(KBxCP-y$Z*R@V%Q__lFCBAI#2BYi3p^7G?_z=D**tvw!Xgi2Rw*|M3kw zMQ~J^cehG0pd(1fQ}vu8#gyQl%0{4SC5sE!vMz32;~G6d0~1SY&-@$Tzc&6 zf02;2H33oyHUE27H>3;zDHs!^y$T$jZ%Qz{$?T%A>~y z{YC0#ANZciNeEK0F|qu&Ma~>*Z)jy}AxI?+)u)hE`0o=%6APGvJ@kfatXw?2tgNi; zTpVoNTx`5t|LvpfcSDqwg^8Wx*AoMMz88Qb6iAMV1=I+}Y;9@u>%q;w@PX9; z&O&bl6;S@w4i>{FW($MbTiGgFS(yt`-AtC^hU9-9OM~-d0JVocgWAKuXe?~(d@S62 ztgMQxTzu?Yd@O8?ES!8SfAzOAFfnxb|LT2ndME^b@A*p;J21Y>ucqHeN&#l``?ue} znw$JOOB58pP6Z!S|MwE?ppGzuU-JaCem~MThFTiIfcp3&um7~0{2ye26UxcO%Av>3 z2<0|l2jaxa3S_~Mh0%bW+rWT@1FFyYXI1~9Zf9j^?*z4lJv9P+1iS+B`HNQ+PkwJ9 z?Y}4EWDL96AHXq279bb@;TXpsjxqmPG4qYq_-Dxi%>OT@2>j~smzn|Z{cZ#53ur^; z|ER-1Oal}CzxnyI8UHtjprH8QLHQ@}hb0J6nKv*7_x1 z66VF=Bb>iJoVR@`L@>RhU;XaAR_KzhF$3$KD;!#H8=#rv#{H}BYcYzbu1~iiHJW{+ z6u%~tR+n6mDx0%D8}$42-(M|hT2GX1J$;`4o|01!@yw)iqRARAi}KZ@zt%)mJM+Vq z_Xpd@5XPr}x(ep#W-G1@9SV!hM+wLM-8pTlH{#?&!j<2jiOMLdu?&q4WMwoFUi_W*gksZI{me3H($mPe(5~-(nXrT*n`7)AMg?|?(`1+@8+2bD|d^Arqb?De{az< z3?EIVSTX9TlE;765~eVsn^~YxuThus_YBt@2iEN&kjDxCY~_oQyZ&s45`PoJh}L8p zyPk`HJpQxZsA0znSu=$O_KSb_^Pm22AB}OM;qu2@T?7A~{_OzK6kBf{y?@wIP?|Hv z=r4HY`ES0V)@Wir#XfA2{V3IePx))uH2xPBx7qSaF_A?6mV|7|h%SQ&G+&CC>pxpm zJEo|-9hLe=jDJtr^yP>A<3E#iiu(Dqw>#4%Ry}6n-<`65m?QpK;@J4TErYeFzgb0e z??&WAgjf0hYzXVxzn33Hx!LtD8+dTh=D>GVF z_7++%=!Q)!x}AOx{rhX$ltk9hQ|c(zQ;8Gm3S|+`AWVN#Qer=%4-cvyrFDMSQ1#?X z2(?N05xW+lljf(~>5V+)yVj?mm@91gibKE>ZREUC&TIl-(F5K6-d_UrT8t`o^I?i4 z*PWT*WOedzt?QN6*R*2$A&%zQrYvEzbk8(pXwTp9jTj56CwZT0V(8fo7pr`o-%Wew zop7)4_#0dU_hZhBygS?o5VSz##Rg>eor%g*8a4mI;B*M2N1XEueM9|5hH#%?yic!+ z?f&d7A%dxqsHC4{G3no_`10=a(lOR2-ruuPrWl{WWFwsFi1+@8^F(fwr8=4(GsMbP zw#t9C+}hY4@kNDGXJrW`r@D${BT`lA@BpfJQ5oV@q2wtKJsrb|hOz<6YR^jj z?u$wX+*Z7RrAmPe5^K5cLD~U?Tk&=CErv|h%){$p7>{F2@7(SU6DgDo9NRtUsCsCn zGq4n%Eh;6P7^Xky|Nf*3%er|msCRxdt++N>EYhE#mJc5?!21kRNsN=~0qH(v6i)zDe^!%3srz7gK@ zcG{`()QSa?bo~wR{@hOHdna_ywp3{6V;D1pML$AVh-h9TW4kFaP4wh(Rhw6edjX;A z?SybYiwDoC*c3vOTV#0l)yw$IUXk81<;0KF_T?34FTP6AG=4-!4zHstIjhk zJzk7?2IgQRR6>x>U!5+S%}!j3P`@92KJ}fga{6DpXJ6L^b9y=Pc?*C*dXyckJ3v9A0=9S)$T2}qB>EGYMv+1t!V%ZARH1tYe?f0}N5)~PBUny!z zyhecFV`61nPsd!#X5d8ReP48z!ZEyv411cVH_yp<5tcMNEkoIww%{|ccAG&cG6?KO z6^x(SLiS55y*@+07Gz%C^zP4*=Ueeeb^Uk4d}Wscn=f6XD|Kif zLzr1X;mmR>0;AGn%y_8j0qJ~~gHvh<8JfxqR<(6S$Zf0A%un|cQGg6s?w=}~+`b^x zQe3Yc)&A-usV}gaUn6%`Q+QEhx>JH~?4X3^(aV!)Ss8XOh_<7wyD#+Pb0Wt|B=ezV z&2qK-L7We4ABm+vB9uQpeO5cURVgRSzrU-C#n1J_f~d7Ip1*U0ZIsTL?Y88zVe8Ks z84HK&L*wN(4_A7Vg4N0l^|}_@#~aKZ*xK5T|M3sNxv`gJ`ym+3))y-Qn=Cg8P8tt$ zu`|@~9uD8UIMZI+2pVlX#9O$X!&7YUHUSK(@2{-sUxof~_t<-$j=Q%J_9*|F z23e!y4Mnq(i+IH<+KfQSnIxGfT7PG@gU!ne9`qf|Bb65W4)S$Xn-}DXO5HGmxmH}+ za=XBkU_{zGM9&O!_lIgoSU;IbJC@+PeL3j0gzp&Odpc8POHP&32$0{c$>2iPsnqOx zZiv&G=;XI?EUx0lTi7^+*s1@HB`uUV>#$M05ES@Lxa^B=A?|c&6V}Nx4 zfe)cNI-_I#RIfxw$#A`kq0EcLIGIRi7M4)*^!f-8-lZgX;7q z`C$pis~0#ZaxDY&o#*xM7<$Qz}8|bUyOy(RjrU zg>D!)Ru}F<#KGc7$}W@JXI_SjQ;|MgjPT`Dd$KsEp!ma17GdN!XS~HYyQ!N9ka5yv zX5}-|ky+BFu)97cEn~>>d`te8$#L8qkU=%myv^Deb>F?idu6N)d>Wx%@0Hf>{ZP%= zjz1Hx?QQ7?1 zJGbLjqIVb`L@Dwl$e}~xgtA>JJF&6&&Ao)~cWRqZ&pPtt?o~?1YU3glN($&G3m)a^ z6Uv!w(mcXW(V$cAcF*5N z+byrXSe$z$W1!@MjwZ|85;WeO6~ipI*;W#zKc2KJXW&!Kth2doVN(N?4TqzVQhz|V z+_v3Sea(pL#f;nxJ0~YzxDX$KSfGIEev=Zt%IF3%x_&Y|d}LLl%8`+u21o5GWMT1n zfKbk)%*ADu+M0rUI1zdHOr2wi&wrUk729)!C%k)Pnld&dY0Z^NaQ!F;J3--{ve5C` zylV~0}bx`xeh$|T5oP~quyxuoUk2&>F$wyK5gJQAY0<= zUWXz&^K=guMB*lIE+VM7ZJtdHBVvR-!&`i&iSzy^#~R6xw`8G7d&Xue!7Xp&b9W_m zIAO-uQ8v%3fuzNNac9SI#9F6KIc6N4UGH9nFntLc2N@(p*W3IHKGc2hpHfG^XbvmY z)!db%;W#K2_fZc_uR^uiGer1~TE0fO^#-26v(z}yoj3hx)ojnn9Ea&~o;72|?a=9H zAiHm8DP{1*nB}Lee<)J|y(eyy< zlaii&V7zp~kuJND)cS6)OXnfp5Vg7Vv#k%K?|V=Y+bU~5p!Mt)NxASWv{DK5G8#iLt57*uib(}Fj&cptgvrEkEaMIS6tgVMP zn?X~yXHPRlH`g%Giz}Se6YzpYcX`6RUaRYV53rC31Azqr<&Jpt&0M$TJ8haW`_}Ll z71vMq;k}~M-x!{{%g_?Jji)9x-MZN;S#kgN&i3UGi(av|HV?%@HKXyhd`SlB+wKYy z@wZH=z0O;`8!FSR!}^>DPbCD{Wt5}xR__%if`RGf%A?K(oI76?On?HO)gv~-GqDkP zA-pp8RW4m)qGXO{_^wS&1`lZ#*5`23T}ylhMz5XGwcCk7%pJRt{?&kg{9efD#yh^^ z>Z6vA<0gsv6@GH^+*k9Sdx(}AfiOeNzW@Yn&q--i?YgLF)90IL=sscv(ij&}lDCr4 z(FoCvMs2rDKDE}N`;N+?>PCqyEP!*{jhOC%@L0Q8zNf&!OTObUGd+j1<*cKnq^pwi z{i0N$Digz)J5ozMXMybjyTDo<9ZXqwV!mWpL1zVI z4deR9qU1YNVCRgNH@&qfW!CVv-pI+;sW*kefoI;N|IV7Pk-!m^5Q)pFqZyxx6V+fP zH$+%9dt>VJ&!v#Z58f;C5SmTz1gclhr{XiA0OP)T{dKGQOXc()2B@o(3aknYq|WK$?!EhU5|a4lAh=>&?VX73*)3A*9$@9!(e4zAl% zP`!Vjk`j0_>lTagbOaw4SAV}zW3cMKu8RE_i-BPDiS5H5(Q7OwZtvCB3hIl*Z!eMt zHGeN}T_49y#>&tPAdb>V8{&Swcs~PDydsK863wRRRrEOCWnw8<%tX(*`w4N%WpY3( zGxu|3G#%%{Ynlg3m5<&*5h3HQO60fKXUFf>>7YN4(3sik;D3DK!YbiUnWrDA{3*ve z1!!HkHtO>fxmCIXg*;pq7c06(+JwS!doM^cI0vfd)h^DDn6mC)PsBkWsw@oH78hHr zdeVs#OWazc!dJkWo$g-~Nd(B+`!=fo7`~N*U$uMFc(qSa{Q;iVaKZKYhgtD_watba zat6B2HS8*$gYT(3I^-KUzIWH9yM<|%2hO?m?5i0;v&U})JR*dZlY3tnM&bjf|0~^h zWt7_IpJV59Fz!~rPh+dQ94lS=()!xRLSJl84(&lO{P;j@JD{YN~K$Z5N-CTeFxH95{GhI z!gvo_3z_4MiYvR@e&Z&z)ypS*;aIA5(`ywzhiq-76FTP=g}3iXDQ2qY@A2hSJpc+9 z!_fVVQDAP-=0e^{mVtcaE5p2%vmo76SHW?M;_FYuD6eQ8yvwg*Ctdy^6GNL=E^AUuTx+7~HRT;uUWt3!hOi9U1)_vz_ zI0~$<7qUe|PI>X^Lidk|atDQ`Mak7Kx12m8cx-Ly%lArR1)Q?n?*&-CO2dv-FfAq1 z9gVaX80xxZmSSnHATkg?Nz$LRWpKLNXHW)HPU&wEhbxpAX+AmU&Z{#)+gx%5mKYaP ze7)007W1aA8J})^G_Yg4xBhVBJA8=tc8sLD0CIB|nA*GpFZx zuKuT6Ow>7_zN4I8DaN!Z?#6r!W6vm?RH|;uRt$W=Me}Z{eBF_LnT;fI;I?dGcp%W( zif&Hk#KcrgW$-!o`jS_|n40c+cQVOkV)Hu$H(w%orVQL}A>%B1p&qr#G_>#DmyWP@ zAXct6H}1~+KmqHsx_c8$T1hmHTKHRZ@$@wQ+q6? zH{nbIjq_zyTAKCG9}?9ybqgh(WJZ1*a!psYcsaDR?@wIdr@9xfmT<5M-V)>B@Yt#jd@*=KN| z2Amz=5S%M^!)_c2tSW0(xZXA396=pz%c3iYF$H61MS(u;dm08D2&H`2^zSIn?iK{JK#<6)0~*CF!bfs;TDL&{VjFTdOzqVJPv zyvAiuzHcZl8r^%>K9B{iTV^99i7rJQ8X&T?Q|zAK(bcF($;)}HS8Zq*kN{ zr%pKL@KDUc@wz494tQN2oxFOoXRs)T{hZSwKwRxkJ219bMIkNmXuNo%Mc+}3PaHn0 zt(9ej3zC^_1{8+UAq`m?WV7l%4u!~1i(O3D)#=_- z9b*TKrFz8)oBDHiOfnsneV)dM&-cVqBx}%tPqVM8!Og0f@g0Srf~jw-6F?w8mG#$# zUemS$1{*G^StQedFmu4PMVj?+J^Mqdj)D=od7-c{4Buq`O`BO>|J4)Nwm*qLDccJY zH}^z5z(+j69=b)+FuMC8JM902g<$}kcrgwZLvi%qj1KMzbgKv&}Z zvk^Rwq=yEw7AAAcB)s8KekMG)I_AgKH)g+At83ADxalL>3ny!CH%$wz&S=v+_NUa} z84f1^mIPwHcGPM=<@OI~pC)%;Q9=iENnLUE-0d5zrg`^5y)kvfKl%$vS80Gqd?38i z;)I=evE)*n446uR=`ZaJB*e+uzOkOt`TNJChqXQPdhaFCJu3I@n)d*oeU_X~KF`aS z=E{Tz#>>Dh&ymh84>x1tk-6B}*ovKYtu8+J6Ws>!YPxv1-sm?%0v>C~ix7ga8~kBz z*26pzX=`qC?2(n#VA|v3oteOWTx#9Zy#?o!hLgRf(1d|J6=tqUttWhZM4O|9?LD|1 z>Eb7r&f6m@CAQ1qFC`^&4@*4GkDrU^>iSPgL3esEgk0KVy} zvbsM#b=~mBWmF|iP-;S;MzwBF9JVtr;Vmm! z7y}?>S?;F{bp+;UCB1Hj?~8Q`YD$Ig74R@Bei{MgjFxb;@CrC6(*1Xqt|y7Jh_Cm} zxwI!TuXRt81Zl@lY-J5jz0ASgBMI*glJXjb^IZVy)<3_WlZX7qKTOyY+TCi7(pc-$*gzK2<;bXt+ zR@DExp$brw$Ow&hAX=Ws4SJ{HE%bIV`@_P?UFm%h1tSopP@pvXLeEiA!msWJ18Vc& z6gj`BqpP}3{ffB1+o+VEZ5nEFH1#&*-hTCyK@>yi6aaZx;e(Je$#lCg!}+Dsh>^Uh zD3)5kx{1T|6f!Bi*3YTQj=+)ysYMjI`wv$%3@z*XzTSx#G+TDo_ZHR2Y%EV(=aQ&T^K}_ARk)(QjpQL>MI%v?B3{k;R`_xbhp$?DkALeefPQz3-T#== zF|SnewoiGgym8H(GgELeyr1kR?#W<)mo01NRwtPbnPjUQ*6F9(ScwYWWO2h>oGobJ zL)?USKGgvGJZB8=s2IL?KifgohML&w_^5D5KaHsfnGcC?aTCYK*-2J%f;SVJ(#~qW zpmFx}kW#qJjN{e&15OYUKhd5d?3)36zcF|>paZFnd4+3Mj!&-^K<3B>CrlamlR|mL z5FcfgCo3N>kpT}M#9dH3k;X#8KBqDyxc&x2Us(1lV>^ICt$#;g!C^)(m3J?!$gRFH zp2Wu{e*L0RchtEM8#q+#l(;`>`daO|4G``gt11zVsEsC|*=<7dLN}`))0BZ&(aVF; zW6Q=sPobnXg93tf-QA4rrjR$|STwg9D!6bq{vfq!RLxlcm%e{RcL&=`YHR(@bIzVb zFE=U$lJw7&Zab_?4k3(irVHtdOY zJrob4;C%d?jX^&T02BMT_@*p{I&}eKI&RSzHi0#+N4Y^y#(F}0>~cDye1a1d_|Q! z6{mY7Y^D=W7Eb%6(CcVq^#*wy=#i$sjfzxd+g@4HVe$fFh)&W4IMD>>w;@i*yviY_ z29@9HQxOb@ijk`6_S;)Km?wHvYCaZ^sAjAVyrBlwoWStrz2L^D-*$IkNbj4fr&PX5 z^x)9SFFxvhD^gYr`BbzA%dW4!e&O@ue%kVK>>7(pk&yl3Qhu}5l4x%x5tg-*UJt?2 zhXk~6jY5*j3QbjX2$}gx$cQXamh9C}>-Y(~rUs4cX<&{Y%$jRcvW$P}B%{$WV^ZEc z|0(C{pX-z9Nj&x}F+kv}bkK{PZgn%Sp=ST2v}42{nNK4VsPTl2$XIuFtIp4LcOtw| zhk9g5=jj8cz#iI#5rv1oJ-lb*<-$X^x9i5(E1CkqUdwFrg?2F4%eE0^ZFp9eoeei* zN)l>sZ!_|4yM*g@qHZgW36SDd^VZ-YB`8WY0N4hA`_^+ORpz;$E5<*|&!SONsyuMx zC9}#RUt$X`=Tc!ia#C8XDW&r?!hJ_Cg^MPVpN|Gf5&khY-^Z;a7>1xLNB`iF3`Xnb ziA#b%5}qv~zA(N)rPt>xvXR*WQR_@G?_1hiD{AzsK>$yQa;A3xjSWjAxd=w?yy{>A($wc&_PL*jkIF(R79cN@!b**%*+PCF+p$E#xPT!SEK zaZZnW#r}|G)%ZmQ-UF3nP9!FpBQC6#cx5JS$H`;U!hqZq085ZRMoa>bcUyOj!a4li z)T~_n$QUv?7RT-?h~aoHO7~Si?u*w>=nIhGy}c^tj1j_Dgfh6MhgYe-9=D%nYly)( zDC6djCGJB8?~isnXaZkZw!84)s8a>4jJ6lXrfVy#Bek}mlwJwnZU=I>1zgCY?UygU zP7{wShw8egss}Q6)7=AsMq=#vPR=cN`jDd-kj^VU@Ruv|7^WS-A;(~`JeYX1XxelY zuk93F^`k_D_3$pl_Tv>-E2~1IuQ|+0FRzDX#ORNo8xiBz-b`#I!=S&XQ3W zN||O#&&c>(N-E@shgO}V{;kMfB5uo&q7~+5AHSxh=9ak<=dODkW}_h(V*g|cok&5J z9?P?P`KQ~4|86jg4DZDy?o<3&Vu0U|Hl9cLS44Dc+{3HvR`GI6mu-h3ad0C&wSp10 zLNnB#=HKJu_@-2v_SsK9V8P;0CxDoaceEk^|7zMrtBD+B*Xlh}?4#L-inY&7S~C(Q zp5W)rdmKlQYd*@wcR;njpM}$qOfBf|-YFuEUdD2H#-1e5HqaJ*e`%?o20wV@@!am} zE#U|25t&87h($A5SnL3HEX-@?u#RGD*VN3}u)9FD zfc&d(!%}>l1svo%?A1v8KPqdBiCWUi#N6owQ2{=@x+RaAGPhkR4iT;&1?kRzxZ;Cd zp^Tj+yF;+13Z2fE_SHQTewAxSLVVn0qC0I*EXB^Ax#U?KSkf@2`Sq!2;ZZYGx(_$g zC*!R3b6)b3A8hX9bE}m{;(wRHB7QH$>OI^>fTt`RE-o{}u(L2VK;iT zFb?u)!&c@#4evT?KFKPzXtX36Y8OKv?G=o9y7IW38_8C<*PK~UpmbptFvA3wuLNEc29*(wGWFZn&DG2y@8DO$6^OlV zvpRUE{6I%ZpCpDi4u{K{Z@=Pf*kN1F{s5IPdIuk$kOA54BVjq_iE-lB6g8U4 zY9e1as$sdZ*~^dwDWviPr{?`Qsxs>_rKsk9IW#EykY~+j2KNWa+Ej#bbxlEbNtIr% zsmfcc73-xEUu%tu_Zv1@XZ z0hFa4p~H~MqV}wCYParaWz?Ks$OhT{;O()WpaP?epptb&s2RaSG|7go5CuexdR_WH zdMG=q2fTVHD?>hw4x?n@`5`4lqLP=7q)N$ER(ZIR4SWEYT+EyX0j^nfPi`PR;MwWQTQS$4co&`Cx~;&;D@)MP*WKqM5B+|=5&nJ2#bm;f zSC#ZuEr;#>JXejOQCZjXCG03{%d`2)%dD|>5hItUmXeP=NR(-oTw*DDJXi;$gWgQb z8{9YD^vKW2+eBcdxzp$-fI^P3*M5U6s#PQ>lK3BA1b6j1VaD2uyE-TQ=V%chTnlh6xStcIDHt7h#LxRF;O>3ksIs>f+UX8C7g;gkJjt7og1` zHvZ`PXXlq5!G<<+2@tI#f!JWN^{SCzd^$t9Xi2J*#jI1s&I+z>;?=qZp;>yjw^Dc? z1Wn<2APqdYp77)XuH7R!7aOPD3BeXSlUEq>&8vYjV`*y z&@h62RF3>@J^OY(wEDVIi2NB%h~#m z7%!hWe3|MD4E;|E-9A>W#GMzS`~9u>3_{s9D-+ zy!6M$n43}tdcs#{KXHUv<4$|$)Z#c*b$t4;v47eq&r3wn1y@KbbTJi2Eai>bpc7nl4CM7Vnp+_1!X@7ZoTx#xg94oJr4dr=eY&hGlX zZfbi-sX{J5@>7AqQpVE6@e-DOd>3NI{6lwYL?BOp{5`H3*BxPm`QFCaIG|I2i}lg# zb8t)lgm{ROnJ}50(}IK60|R?%jo-2M3?zqnmqr z&?GZTwI`+XMyQyXu~7Ye@ra34Q~G*({D29{$}&pIuPZOVzq7MbTvlc#XHhU>`dUs7 zQlXB)&CSij$2V(p`8<7)f}g)meX2+~FESxP!^opRsH4=a;(E=V?}vd=>tNU2zP`TS zMWR$xwNZp$k}L48I50d$l_L&ibf4_ya9nmaywDdT%WHeo^;$s+h9tn=uoA{8;y#J?B^$f<>j6Pm}DrzQnNp*vA2i-w{9-Piw`u{ZPq*f{Ry9N)s*H z#`pFZ=nAwU2hrNv1o$iOZpxw-rMLjt46+nLa6ybsrj_|G35@epgQEd*#o=W?E6M1O zQ3+SD(7eOT5CM{o2x%1l2*YpYwapta7v5;)8J%*uffD^v{4{FbjWpwv_BY33!58Lx z5liG(#DP~@l-;>9gx(jHG4(E~tqtJfb=NXlERDQm) z2YD9BF7~?rbp28-EpMDc{XA?Y|{snwp8yK+LdeF5Bf&Mm{vAY zoha{H7<#Bv2|}B3b*42nwKY#!XQ9&I3a*NptaLNEIbn)H^Vrxi3p|XJ|B)3ruim54{IiTXDq9hBtdl%F`uxL;-FrY)B76T;;Gy-QoqO7g0v+Wzy)YMe#9HsrI zG&rn$BEtnUuM;d^OI_wc6~5O`R0RYl0{S#xRgA#KrW@&YEJ0c z%sWw0QN%Q>88!{CmoHJie3_&GW5^00pkG{E;it-ftP86x;Jk z7f-jCa)fvnXm~w$cdwtYMXf=^)%KiNiHMZRYVC@m+3#FvJze@rZn&TaG=%-m@Lh|k zN-_BHHmmM@v-%|oouDA;=Ge8~&vV9aSGGr}po(b|wF--fgJ65As;E4r+;WDfH2`BQ ze3O?~wZitXObTyko=RbJd;6Uvey5I*k7d~R?<-n)oNq+a^Vpxt`A@-5$h`}->NbkP z4-WRGlIMyo;9Qyww(aIk_FDrufNE!4iT=X!vQkC=FbC0v%_++<`FMEsxN2KRNBoh| zg9i_8BOxs`3Z0}{r8HI-$&&N%u6s?ZDJs4JMJl3sLn-916u%4C_I7{!Fl~e-c!XgjgGqMiO(%^(bc~5?ROy| zZ5t`d3ybZ+Z-at-f`ieJFiGBmxDz{euFA^FAN+lQe&K6G_wL*z?HYGNjjF46Vu4r* zcQ$Sz-rCn~Lf-$`7KC#5ZseBTYF`py&!)}smReb7rP&zf_LNieyf}G*a>nW;Nsr_1 zq<^-?YeNfq*obW2z-I~EgZ>6ht^J=pxV@Gd!25XjF8CX`lxf|TSJa@KF{T=O+432jta9E4TUWMZ(Dh_r9_Bk80>9{;9*s<{D8xJ>FN)9GPo<+a1fZUnN2MMGQkl%8lam++fp?}yk4=qJ zWktwsS)?*ZH%yEaG9GJ`A9L<3RqdX%fY2?sA{iuz^G?L0rE$phM9} z*O@@+pi7Qr6vy7dkmOBdLdbTMPxtkj@7y!J-+OF8PP@Q5S)iF}7|N+eIPMq=gr)M9P)K z)}S=8$r~%jP$`=tXLP|@V&c!DWBXWNzX+RVi*)QZ?HSQGp?IcbeNVpF(AV2DpiELD zv~WrNW4VW-AuUneD;3<}e#U|_4_hx>qeD!aF90yOtp1Sm!c1p#L1)P9y@r}8hpoye z+;PfPC_fZv%dZ@VCa*I3>vFyrxyXdcIREU*dgS-9&T0G0tEJAVa-x7d#L zUdmy2_SQpkH*^~to73IRqK9;J@;~=i`%_xa4pxf|d;8U1O{ch{uAAgJI9MaRJr)S3%4xqQM`&3M(+DuyMD4*B}+YcrOxyVcNDw5x}u zr6s;!%HZIjYNI)!sb-9N&F_Sac5bX-n$M{UDa;bt~ zWAyParc3mZ!>-Sa{ErTIg&|B#OmVz+NR<{dbTt?tcRyYVW3M!y2+Xe^a z#(O(;yQ(C1g*r`Pn`1@#Ju$rm!cfFnPk53fefj8!YNf+w(T%pvuwYWsA`=jUpv+ z>DH7J*EQUM2j?Gp4A|D}YXQXP#P*TtWVO^(T3(U^(NVh}`BRalaZz@Pcm8^LGzc86 z%rrRL2C{q>dX~M0BqLs{@+;A_UW8aQ!RI!rE>i}dz}uGsQWo}k$vLEPMpST{W%cy|R^in7rjC)bYtRHo z(Xy7z>!5A3$;>3FD{VWuyBFK=jc z)y6z7lN2IEwx&XPNEoTDXZN@YR5{!fA`8rPiPdl0yW0T&E_14m`O8mzC(WLslPlv; z%0~{Y5-^)@DrR>`!WgQzJyvCi`*%NVA`H>y&ya+8CCD5!uB>+`cNUMxa^c5vVl+(I z_Cn)`JZIW98O~pk+ZuyhKXL-+w{`r7-$$O5%gvOC6trgcoR`eKrp28)NHJI<;5vJn zf|@Fuq$|{?h6`Z+#mJ|6(XtRjg<6#pzQT&Gipe4sJ4Pmzs7)S?IOSl@?eLf)*3eF; zGt`QsnwiSnbq5u(gOO?8w{KA%h^3tHC4FkW4kcrBnd=C>E;~E$!S%WZe}m#;jV8sn z_Oq)n1tFLD6T`l^*Crx`^{1!KQUt=JyqCo_=gEjAZiS~ly$bL75&(iwU*%-%(swf~+LsYqNWjk2A?eHg4CK42?gS-7w3iILPm^ zxjx=8_^i&eBQ53#X{ot=Hs+IFeQhfF z24?~OC6XC93}MTlq*iKF=is0%VzdKQb9YN3GO^>Ne=W`QdhZkU6fi;`A*uQb^87TAv8Q?|_Z@-a^ z+yEGQG$FXv#1%+@;IXVHM$U1_-fDpn2`ajNYOm`r_lTJ+I>TH;&G-V6!t!_m7|(m0 zEi{ue>L%WB7LJj6nuPCce6{nkf|^zpem@M7c(9C2^!{)p#!q?%Jtm{fqD z#|r162k7uwxPVj@JfVr*%%jdsL%OJr=-$wPk(j%z9X|>msd|N}zvWD=QZ=)X5E<}m z%S;3lxU6!mHHI>!2P@1}*6c^};?&dRN7gEOy(%uDi{uLclEU@lCB~%6CO1QG(ed?xbvc;vPyu)!^ z8kzawoTw@fhPp9$f9Y~hu~C0AonU5hF}AS#wctM`?K_G}7+!3LCXY}MfAA&k6ef4b zNP^np`Vp1u$4(%HMtxwZ3vTroJTRj~5mC$}!mXrU2rgZJ<~RM}G&{LfqDP!C@1gW~ z{F^GLthYMYtFdd=0+}dcDxHfyut5MD!-w|!64;3$#jd@zNbo!BAFdkrtcQ`!xODp3 zz42H<1*oqwjYt8WHLaRIsMz_mUQf)WQfOxvp$4>+ZRD?hf3Y0R923MhY=gd4A_7I+9$+W5}uzkY^E?4kj-L} zzkLA^nyR(HEvs#r4l&`5PlH=1hZj5emLH^NwoI8jL4vb4*N&+Ed(SKM@Wc>$(Ym6C z`=EXv7;ec5#J{Bh4)$vA4AI05WC~8d!Q3a>&zEmh7tjE#B<$4=?E{mIr4%X=3HN*~9d!2D)8+g? zE&KdFj0aTKf2lNcxru+cvhI7e-(P6rk77N4u=GGUbHQmy(goMmRq0$)TLu*!!wzq1 zP>yjJfBDv7>s0ke=_qX_8ol6>AJ1aiuk)3jlqo5NFBOI+wl(QYMZN(S%?37Z1DsoL zZ9_GUQ6|=1ydJQ0$ITAair=6BH=vwxkd)+TM!iA3GJef!_C3-+fa|U*e9e zj`&Q@Ulv@U>dJ<8sq$OkgsDbUMS8j zxoG7AoKt`BxwEbs2cHMAzkesY4M^jF`f+fr%~ywM<7WF<-(f%d*i43TK%KM|Qyg!!S_@RieTkF4t2f84xx^$; zSTq2#Sqo7<9ebumQRMVDm+NlGixh|{N8+cDNVOv4`+kOC3#=j~Ym$fC-EEhPPD+q% z$6G3x>7ZEpq|C(G7=~uA@NR4$f?c^s4V*Rc*EyJUq28C=r~`Ue(yW@=%iJ#quB&Mb zb}-Q4y!hb4LC47Oy+=P{7J)HXA?*>#vPx^)^fuy~7)2(kq2JGxU|};~klwoDCI>eP zL4-K_Hr~R?BJakJVD(CFBwETHF*D8hzB+TUS-a?R``V%YtI!GJ=nhf z?OVi+`vytAQ&2VZgt)mPgXS?PzxkIIpbeL@ifZ2MS{PBom1tqCP7$`2NdG4Kiu0;Q z%ZaN|LSx|q$f@84T77Frw5a=b^!M$YOqzGe?;ftr_6M!a5NG)O+7RU8bA;JSSq|)T zbzSGZ7w^0hFLjuiLf}cs!_v6Bs_S@Q&e-|Omy7EHarsXSvxF;DcvLM6pMQFBr1HsR zYmzxV0nbL9Eetfm$VyC#DRrnI1ZZY@3-VeS&;J!h@H{H?7CXI}dDl5dmB1ZNOci6l zLOTLwmaq_;wmELv2tdshC_>)dTKQDc3Bp9Q==ZDM4^E(KzYHH+x#1sr{`+;KsTwL5 zMquI|?A$XH{=m)v;5JmsPAnr-{JRLode)W|p*|zmC4rf|*Bkp>8uvCmKLEthVBbE2 zgy^!wQDC{Y=6VJJY&v9H^&M6I;ITI2@+QzyZriSrU!Gp8tZVWAVy2W~c<&_5H;zNW zL_2n^%v1dC56G^pWe8849ZbIstN-i987R)vGjqzwrBHk8;;R4Yy|`Z+s{YYOP~n}L zH>3n26ih*sSMt3TFoceQdsT~&u#fg#l_5(FCZiw8&t>$+K`-b{WEDY#`Xqj4G-yy5Z@K)lnZ>vec8lFU0&d917i?r%VttjW7DAmyXF@I6fVGC`y3-y*P zHWnaG1?=@|XRzvNVwrcyVk3wGcHLu!Qo0DQ{Pc9B2RVr3R3`aR1(=g#XXSikE|S0t z5PXLB{61wbZyMcZui*PhL6#Sr-N`yU&Y0o1X;{Sg+Gj?RTsHyaB~Y19USzI zUhYvB6$n?eCbooLABXz9b!!d#V*fCk4+~0GUWSVi^0Od6BNU<&r)-5QqO$jc8ZtAM z1I~{h3Y4LC@@CsMPqJT%T+@OZA5B?-7CsQ_T0gCU-r%Mg&VB$Oh@oQtP1~C9C{cq` z#ez1fnooq@fxWB(Dm5LueU9%kV8Pw<3hcaFZ?E;N6}~!nJt}#t{IH1~;`<9fX%^4} z#^R$7oNM`U%3{*c`pJ)e7oMhJ?lA}oujl$}Wog$SH(oG0Xg5g!a|zQ12bZ;-5$LbjZ-eK8=ciD<+PuwnP1Kq&bGpr%Pp=BRr+-G zu2L}wpUT0m3Pxf~cL@nCF&>hXlr)%XPYa@5D73~0n6;URr)3V%yx&}%@ly~bQp!bg zLz@OE6iQT$RWCp_LrsRg!mx(AjJPVq>tze|hVw(g%uwQK>-AX0%8GsLTP&ME)nhj| z;cOkOuT_7kdXYkwn&H>h%W7!bsTy<~;INNvZ9Ua8B%Pf2A<1DseK=1Njy`}~qyI`M zL%MOgZ@ZB&lOL;|`)P(_F!=QMTZ}$5BLG@X^cGkY5M+ShT&U-mJ}>V6ZF{LnEJzuF zF>N`jC!@lIXh|?Ch~>LoK}6Z^D7+{O$yS| z)hTGVXAmFVWv}?*Gk4v*J(U78*H>I=Ahb1K$;Azl-_J-u2p;4aQ=ztz>$>8dk#UV(yX^j`Zx~qO2l*2gc2n&KDZF;S zeED*Hc&UkXwsbMsZTZL@|4p%?($Yi-+k^_OYce%%B;obYVm?uP)(LP^Rs=)kqD0A0 zpRQ({N3Kq$0KA(v-yN7NFA11;gO#mK`bMDq8S|Y89#`spGz^pgHv>bZjdj^;T|wkk zQhtZOM$EMWu4l{kFLT+SMtQRl60RsB&LdvIRxqZKzk?9-aoNvai{eE%JI6{=nIHD7 zyS%wKW9)$-%1Gdz%G&#neNfg+v`F;r*iUuyep1K@Zs9DpcrvdqTsQV@jDTivXpV(A zgaTcV<(2}ci%+|*eT?_vP44`#&)x$9W&U(PVP2LO(v8i)p0#D5`shk@vm9^-nGor7 zK&)D2hOc*hmvl(JVxVu>0o&bhjBe)`t6DDC3WOYe;eB-mwIQL%*KIgW&{#oS*-D}?Cb5OXTd%m?Ms~`@WKw*+K_5H&= z^yX-+?)qp%I(-cYxzD;LMSQnwBPkC8U&;+>cRC~^i;6KKf-)*4dzXi@MibBIk3HPc z6jE5Gcyg%7Tj!yh6aWGQeUS?TxHJoXpkEX3(rsH-f zaRcCUP4K4Ydv<^T9fSj3Pw;o1*Staw6^Iu$D!rhzpMUL+?emQuS%yS!^Jb;-tu==E zPmIT+)K1|uT-vB ztQ^ZSt;NWzltff%joq7pS(2OEkU$wsGkl{%WA;<4o8@vL(1kbcvRjxKY+qibi67>L?{ZvoHs0SK_r$%d+TxC@n}Kh zJ|ba_FV=e0#%{V(u5Z7H%WAM&nV+BEchRLquJW#Jyf@W}N=G7t+u>5jxle!qTXyc- zwQJWYQ8)g=xo)!$T$9^K0!z$xUu2bR=)wVUM4QRC_v_)$pFekDtdHb2 zGbprX^O`8NpHYivY`>%0#?b+_`f(X?nU(% zHnqU2y8UP(?*cRf0zfK4ErWKpBORR#@?9v;eJ0=R{sA#lKY%+gm4q+lSEmi4M7L>|mFkimQ(H;lv@MpIf zHgCoBYdN<`g&4=fD0Z3#kTp`OqdSc5cP7!X9@eS3X#+XM} z?gdFNx`;A3KjI&cb)6Mi>l1oA|8+bSdF#vG(|i4Ff8=XD;h0q_H#1Wj7j!8$!E#~8 zm}{2umugRYd7Uz+Wz?smR11Ekys=ratUX%HR&4GwxhOcqpn+fP3w1avkeGjLqppE( zG+jq7tV*r)oJ8+Nq+EYuj8tQ)k=t`rcysrht&EE^Mk!!?@~MRZcjBI&yjF!#i>@~} z1cPSO8qBE$EWDW0)WW+)ysU!)M<+`q%JDU!muDITGe`$fyZs{DMs1DR)^0P+ZKgpu zV_A8_H|t2kJ57C2lV_}xgfAQ>atIlrtUN2(t}7i(yktTT#tf^|+z_Hpn%8-5wV#jQ zEdH3Fwe2j9p4pT<67MZv(JX8_c3(rd>00IZ(;FM14)h|4rKrMnUny_e_(BXa1a8Yk|RCrxYfxRqEd#9l8T)Sga?`KBH& zv3D-QK0Pgxrl}$b6;N-h)$6kUN-1zWEitb|>izdB)SX_``YY;~I^`Gosrq)Q(FLDX za>lCGhGvQ|J8pN><*z-s1C_gLI&5(CSQo#sF3% z&yLrs?>3|R;>#J7dbV~Np$0#$xIN%Hhpr#ywXZwg5V7Q4!%HK=eRFNV5#43Dy*a&N z-j+(!huCq;X%@_w%M?uq@>Wt4~T|bRXu)7*12ZYOh)o zP-xGAU6xvz#^VdEAiPOeP6+@S+)Xe=L3I1U+bbe)Zg}L#%Amwa<8R;U>y92^Qn!pc&K+s3#atFnQ?@LnS;jF!4yM+@)$sU~-nB$lwuytqxz zYxe??+#(lMq3nO==|*Db9ItgJWSk;(rFN6)UAper?p4W#V|rsxG#V!{V8N%4c6jci zYRzjBnJdVFB8xkYcw`u&-vsR*|L)zpLv@1r)+Vm~Cpk9m%0=;FQ!N~zGNZs^`t*Cc z)2Gv*(%coH-tLxpk}=1qJ`}gFS9d;Qy!rgf1PY7jU+FKkNNzYfA?aUwiMTZ5*xpjV zH0(A~?Y|Pa*RJ|o#MA)R2hl&)5XEitiQP4(WBn^H=-=SgsO4rj6|nuG{k57U%1xi z_9~DNM}dHhrf5*_Dy zD+qjoeTwrMnUrERB#VVRcMCzc2i17nN660Jz+U=kg(H@JZ4teV$=@2a|Lkebpz~uq zJGV7|l2(*sjyg?oqBg0SLurCvqFmMO7^9@_<`Z>0L;?dEz;5gYD~v)K-Be<#Kg83Z5E zEi+56`Bx}Z!Ng`|y+^vyrL$#~<0H5ahCYbb!S$moToZYNH*(_#kej{xPz-{0wbLt< z>1*xX5BhJIt9XUC(TH-#*KP)=>m<1>EEJwLywTbwvRjM;(O&DoyjelCFG-e<%ATLk zb;m;n7S?6yAGkI9#=vv+Qrb<=eP@Ipy?~ZY(~4_tv;8Q>wgwT`&Ev}&$5YzUKoH}c zW!;sHjh0VQQdUMx*StDCLcF2wRAg106o&A4a>wOPv2cBz?E3~ZOx+BCrX{V~FmqXj zPtkyp*EKY(2-KeaIpNNQ6J2^7pNWb@Bs2R|#@|mnH~mci^__zrJG!$P3XE0)@yCj- zsG_2hIcBBPgGL?;cV(StJi+Scur$ikk)m<@Ejg2+yRNOuRh#~xcUqC1kHpDTm{J^g#IX!%2omqNEGr#uYJT!~x;Fax}AG#>B;z$AC1t23UtE_3B zuB4hcA$m1fv$i|9MRuK%&34iA@$ra_Po8G97v^pI zx}T)0Wob4yO`c%WV&N^E$ZYY}pUAx;XGtzbla%5btb^JZEv&)VjLNK(&Zzk_x>r~g zEmU(+k@Xin@kA82O{z3$SuHq=IrcqCK@94eo2M@>F1k^Wv2wdChx>`S!*R}oq3wfV&GMXrSVwY0RQ{8ZJ2@I`#VRbZq#!=2haSSfyYDQIDl57E2sMst^i>j66(8#GsPNmC#^5sX2ZROh#W z3goC>sVp52OCe$={8Ua;+M-ivNZ7+Dv2yLw*RKy(eW~shm1ykl!~DE0WVCPkmF9wK zH#e?%>oc|IvTB504t3jqU#UVaJ$`RxOz*~0#Gz*&(kU=zlT%-&O6oLpFuZ|ESqFCW zc!)zxAtUrA#YgOGb0zvwDoQ04jPK;&SGS~?+R}$OzD>T=pr#9CpV+4Jwfx+L)2hT` zRc@!o*H1ma)_$I7x15O*u!zNFOIz}YbQV*SdvhIQV93_5^q%(TGj?r9uJ(+d;WoYh z$@PhD>{#Q{H`7j7?&$zwhzDH0aYOlrN#py5XthXf>GCYi`=y~f?t`IdbPgZhO?j?t z$>F0Xk=o_pmgS&CbN7aUfq@(KfM96IXu+%j*G5wEJGB>tBnZ@L4de-e`wa{YkOL-B zya;ZS-?l^4c80%gu)J*#a$)h=yV9iZ$(O)oPe9OzP!G#h#7n!m@0H7i`#^|N%b=_&z2 zRrL>eQt@%^)l=&WBT2dV=;-LU3I#CDdKzT)j`D<6(W6JF@X@HvN&GcI!OcDn4ZmE6 z8O$`+Wo8NfO25>v2#TD!0^LL5-{^rk}ObPTK4!H zqQ+2=tS`+M8k(FFDoweIM=h6X=C3nL9QaE2bF{=SkFrhV&GURh$KE=<`yA()+dfk} z{VMO;yYf6%C8E*#(Zp^yZl;yy@9rj~jV=g_e$q_8478J$var_AuF(jki0}Rb>^#h`|a3 zvBjk$xW)JHIV%E|zPx-ZYE5@q!`@wf;qoCvBXryO^XDV^7xZXN#pGy(y66V&lhwNi%WXD;TglqLS!^2zgLJ<;A6Y_ln&m~^d! zGM@Wr77lC$zY7dQWda3m0b~h-y@U_-q1w4)VEd+d#6kXqDp@H+nRjMJB%ng}TCYs0 z-lV&PK}@S%PGr!via(<94kcR`I765BRjx;bTGx6)^k4=xb9v?`=K?h=o6U7Kj) zsK^|Tbr+4R8A5zrY(Kt}mpO~aG!>SCKNOv-#8alz-qiRNIs6JpJ<`*Q;+k&lao<)L z+G%*b0Bx-yN*#R=T6Hcu1(+$&zAo2l7J_yKjAeJ>WPgf+_-5=4lK{j9Xi&2uQgK0q zp_oKWYnD7|1~6=lJm&cf&dZ8(h+fLCXmofH44oQ z-%0;s+Y8HwzP%i|-^j>lGOtOr%_0Xo#WQFRvX_#j?9%pB#YB%4MmobCOYi}!7Ge-g z=+1eD_g+_ZVGpay%Piw`|8+;}&^b5JUI(_f80&MtKcv|8^D+v&yu2m@gl3nSni?BB z+nJSx>j=v;(>z*{Vle1NbWEM#p)ZhsfA@^_*(Y-#)(S_DU6E(ajlpC-aX1<+k6SF5 z?quQP>qDD5P2;_7cV}7mchE!uTKTlkIW07wnues>Sn)#2S zCy^o+p~ej^Sebwrvq&yV&yNZ}cRJVKnS*Y^QJ>}KJcoqPwSu*Hx>eTCGAt@8gH{i9 zI^WQF@Z+u~Tbp8E9ri6hBfa%LpSFmHTCpJ!X_ALdp1_Gh=BB*8c(S4~Ltla*%4gXf z=TFDCZ)L0TTOI3L6w7q52c8mSo>;a}S zd%CZB?Ay z%qP!%CrcY%$4eMF9n4-*H%K714v``v4Bl--(JC@|069*N-R`xxDdY_n%%)hIVYH{G zN7sF0d8KQ5WqsuB)>I0JY0hvCI^arv{IH}dLV6$`8d+IoZ*w~5CM!f~CfK@8rKMO- zQ=2?8{r+O8x6E1j4WYKKt`%l=d(x79B>1e4HDaBz56vAM3PVxLEqje1EudOI+8Xji zUbfX^o5&OAE`}toY+k_BH#BrCj@BclA*47pKjJbU?^D*-_d|?l!FILVWUn76U2)e5d&dWv;CzCA2BprhJ!XO?Q7vE0l6Rtuh%rhW?&aUDpY8F1IbBiCZ2`oUb0 z^8A&FC!PSx#(jBryQ)1vv3jVox5B-GgvTVwim`Njux^ff+EtQ*M#=1~x$mSTt8;e* z;tI`ra*a0oF9w=UH0yseWBk!uAe%T_ETyi4ED&^@O}OLF-jNi>tJDz5V?X@mAabqW z7`rxGO3M5YguC1I^I_)+$9$%ElrsR=!?EcXxu%(uS!_b60F(VTA|sp9?h;89Wxt9g#e{g!n2s zm%kiSFo*Hd#T@)DunA&H@aXl^i}e-M_v)ciZ2h`QwE(glK%MHjhaE7-(;#5jB^C>{`;yPnC&%F zD;QJ&ltjj$X)NxwLD?X~9$pS~FH3_g|0FgCEd50J!ie)lCLfcCOFDRLDYPL_N*=HMZ3V?8A4MA99K8DT z)I3z)t2kh+`i1LaKSTTo(`1s)IPdS3zxyiZuX6R z@?mIwKU7Jag>X`Hu8a^nTQnkH(JOMpIhXW|UcjZjP?VK5vv$?6#=oteLr;4Z3;rym zZXIv8)G*bWWKpa`x&+y&lE#>oUW=S-7cL~I5X^e>(?C@H4i*Z#A^{RV>|z)*X+poh z?I<8p|L$34+uNOaA1*P4-@b{A<&00I;^FnLHgi9(MTJ3Mzr(UVLp^6mnQ+r{ziTiR zooHVQp7FLy;CzO5P>I7#I>%0)65oK6;Tyti%g8?D=3G;IlB~Ly)OweKQxVeH|1Q4z zT}jw>S%^@KJeywmEx3YfHWh4|h3%OddG>%mV)tovg4Yk9rcb^a>!zffEFS_$j05F3 z$AeS=;+Vl3PcK$0Dk@e5NTbV<1rGf#Kv?&VQ-(D}@pS?7@(ysvHaLRp3`6+FT7|{p zcd_HH+SdyV-6F3Z>Bt~-xNCefvmWiZ=qA+p0@{cOA$sjdH?e74%&GP;+h$hdsUS*no5Go(bpJv{X&YZ0)QdL!z29prpmJJDJo!yVTyu1SIIo%}s zdu_m?jW#-FINWoh`j2a2PyJ(|OBM7%B ziTQ-9Gd-p10s=kh8hObE<~6BbjpXdAXd7gBB6j_DR%D;P<+7emHq(5xwTCp=D$f}W zkXcvfk1-8^TjUvv-!DR1uH_F3qj&8l?EsH+cLfeWlOEC|RkP0uV~pL7gqCap>et18 zZiHWZm?8FjO_3YI3Z6*w%f+)|&O^a<3Tlg%T}R<mJ@ij;u_~c{-aZzOVU(Ll#lY;!27X32DjDw6f8l5zA2}QhSnEoM zx<&pEKaPBGk_MQHY+DoiiRPO~!a#aa5&yo!zYp(0@dYN36$ZyeDdDZpd4aUqBX0YA zXP3)vF~yM4u`$4{4eKC01MY>EfgwIMl?enxqy<88@Sy(dzs@o>j6$WKoZH@tOt z+Ct>FqbBW;Y6&-6{}hE0(_g#){`)Mda)@c&D)LI=uL1k}<@>w%DK3itYvbW)iepH@ zOJ8$Y@BEs+fA9Wt7HEX39$q&)weR9z6aDwghrdu(zOKy8w4MAF#sB>-vcqM!zOEir z(E&YC5N@VCj`h-|+hC6=ssGspp6!Xh?@g9kl0DV^snBh@kdgN2Q6;OIl}Z||{D<4S zlaiBD0Rx}vC=EmraCn z=zuyWn?onH-9C=NIIPUMyVu>@RoDIE%|%2#&;%KPocwKRe!fjS1kA=I=63D|TgAAL zs=APC_WTzmR)$Ap%K`(#*o{KTMjt{%OF=`^s$l@2$Fh5xv&`Kx-{tqG)>O69${oeYfA3bn94?oUOlD;eZpU0NEepyOl?mkpw z44=9crt~&~&vISO=LT2!<$rb}Jv+yAoPA}Me}^&T>(DDo^VPl+O^!kSnNj5*OD#W%!jh;+&O#UUvRP2{0 z6eE%~%n3Ui<7j(uYf3^s$|)4pY+_;+->MsC9HwEx3OX-7x<9ZVtQz>EcEG;t>_qog zMzeoC%Qku4*u(^C|K2+OWdnYli&5jyVj5*eEAX=VmlLf2j#H^^S(qIBa! zvot4Han|ZiPEH>P4PZrt=E`Oi2Z|I8S0-`lN;ky^!Rv9uz#uWsOM6G!vvphxOj~YY z`W>Pob)R_Q$4QPCAY+r>QtO=7*4BJ?eEFf(IY8rpSu=+)a32*zCS=&5rdy<>r>SCH zyFQF<=@bUC>Xot$;}u3uaY$prE!xM*mxOE}mq}~gs$Vcmt5gkQhQ;t5xHBa`a_j9X zsrXVYx~w2=xG7HH$P&Pku(5R;FDYk?Rab`nbY~&LxG6Fzx=r9@u;g>8i2=gwTb0B4 zrN%4fY}!TQFmy!^Ga=|s0BFo?{lyVqU*E;T-xDOs$$ z){&`UOLa#00dND%b1c87(62u-a{8|#^;P5S2X1h++9NSm45Ors6f!Er!!g4^xz_%* zzLB==ek+X2@&xLp2l~>=be96vv7_9Ong)_c`62Dc5iwBUIrUaS6avKZ4A7FJn>r@# zrh3L>+jzRPwZ1!uZM~P2*hjO(88y!|) zmPM+u&Nm1T@oZw2st+DKDE>wwKLEcC}Ltv?}98$Eht`uVw! zFE$iLHuAb{a(4Ma73`#(OXF2qQ~MkTIDA?IGb%FZrw%jvO3V)OXrhOQhf6S_g3 z!PTdNu4DIJ2F!$Nx%>={u8GSBfy3sRigjHc@?i{i(nf*yVc+uHxN>vKC8GY~BkWd+ z*v9+*87ELiz1Hr zECAJHf*@K=K@qK%m?xBj7~I{0jGJN`gnl7KzbBuEk|89ow8#iY>D+tDVLA>Gy@iNr z#jwc8bh#+ELqSn|0H{aQk17ER^CRe+RN*?Z5Nko<|Wr6pkE7*OS?#+hLB&L)57r4g17HrjZ7Dh z$FeEnpv0Jj_-sz5pm&Sbzzk=ISp_H}&WsNV@TP!GGfl#nb0!)T?{D;2XnHN0Tl zi2Es<=Z{=$C&8|m7=S(S1O<6{H8tb0y+$yn(oZt#S>pJN!&r;ptLvu5Vnyu7V;s|@ z0_lzeByNv8spodn#J4t~WH~V~A4ym>AiR3%Pu0z%0Rmyk0DD{^g2&+dUH?-8N?BT% z)slX_9YK-7rO}+W6pJd~QBggg#rwUsC6`b!Gli)F8eq4)t;*tk5Fb-HX7KJiA_F>q zTvsqfCFgM#X=v$a)iJ zORdY!@K|NOfB*i_6!bk#yoz>fb&#H_@;eE`u6G~M`48#+`7(Qex0$S#JH$x6#jT!@WJLk*F$&nDL zGzfVa>;dNMcolKO_s0?mD1t;4Xxz)7Jpv2~7D{YaD4UiH_Z^7VS}SQ3^0WLPM!%L* zmSB-xy!vbr6f-@>UR$J$gD_X24j;Ok%NnN79ow<8p#o7ZE~P*bUTJ6~aUaeW3SEL> z^}2c%TWDe_Atfsl5Gq|O1xsFi12 z5f3FY%i12+Dk{MwazbQ&&{G#TgR98tMv4&$Ci#zBD(o6~x_XUom3Mj&}9b}+Y4n93+mos0#Tb}6p<7^U22jRT5(%ri+vdb1_u!I2u@HvlOR-0{aIqTjK zX5X9>*zWb`8%R~xbM1Fp$QoCP$fR*Ah-tX7}zzPt+azQE( zV-PFEh|-XznB%Sp2}OOTq(9z1x4zq!20bAQ{`EDjKlA-sqU`>FY^J134@ig+_C za%@<~5ud1<(PavKy>-`gnBZbSR+X0}D=W9c1khg_-gv9QfdJ!ZS{Iy_u8S=}AWcnE z8C)%cy2O>O;cn`>&+y<%#I}YsfGcUTz=4vZo1IYZymV#s`*-c-Ez+{q4J#vg&9QGA zKEor^CxvpV`(3R+auHyF*k9tsmcA9oH7r$CSDSx-kwEUnh+MwTW6{}{*vCoff9m>Y z0&zs*N{g@6QnFkm&-4mc&mV!QN8{xk+vuIZy13s$BPo)|Xc?No;R+*!x^6JFkJ_Zk z;R;V8g-P?5B)A(Wmp(>_t7;EcsUV=XUS9RpmJwoM(FD8pK1(QgR)o%QX{>?vTnVFf%$jYh8nEQhII^TTcX8Xw<{04fKu z5%0O5ILiUt5>)rf$jPai%X|``=YO5aCbl)WBtS3t2ycyDcj~umYY?TEf@FS6a25o7 zy`heitsN<=2MS-A6EuC4O$OySMLoOy2$S~q)+}5gg!nRirG}cVHqS-Gjvmu#d z;riIYNlDV}2wJ}FUmCwCrar|NxH{8oQD{utCl(_EOc(9Sv zQ)X9`mqI`#vb+8Sn`WwXpn{T$%5rgTU?}T{eyN-RED%G`aH9}WzAiIR=Yq9miEW+ZVDPv47K6DT!;#)2?D zO*OW_%HbAC4*CSU_I*oN>s_z*%N`bXEeBK%w~tmvsViHjo+x^4T0rOM3LQ7o>UpRx z35lGFKyouPr*#u+s=qj4`B?HCW^fk34w~b$v0V=v#1VfO%t3d`%KNGBWN1OpHZ(MJ z27+V2Ukjx`K8ehR99x>D_Pzk5r-6vgRjg`(c?U)9heyW7=40PZNAfvZMFc#p_le_? zPS?pO#1k4J1dXyTPjeh_78?A7+K=6X;x+AV&LMvJ@@4((x-;uFAmgeYC6#q2eG8-) zf}Tk(U)wcL)LF=f-Ns(vaydc5{}6*F5{zTo_be?#kmRTNW(T-%f2=$4U4WBu$|;8$ zsg}H*29X|OV{2)*h$v|uZ}15qJ^DX3x&D3a{G2u*W1E*K~^H` zmUCP0sE#G>#r%N*=|8=ET610KOdiR-Wn))0v-B#qpDjY)DT|tb8KCfsPkcj<^%k%B5YErt^(#=4%w@;_-EM_jyk(bFcgDO$i#3w2%NZbaK3 zCwTvQMDj*O(!jNho1Q*Sdr&g1HL_w56ciMI$Rw}?FmZrN{AOJT%8GT#ze69J6fNuN z6yt_SW)_yIXC+`-_aa{R6+*oVBuBUsVBgKZ)V=}KwgA+>?5RRP=r%n?4}^}12BT_o z3>#|it~qO2*C%64dz7F(49kKOf(|ZWoUY#4YubR zq8^$9Wl1q0+X(_mChL7ta6^FRl1Xm@n)BQ8wQI%(2}m>$Iqfly1FBXdNa-xuvd*M; zXPK5hHUZi32kI4<@I<9EP9g1~^Ssb(5vXv5gtWj7FEGuuVRFp7vXL#sSV8+b-WvuG zxcE}Oe)|rnust(QvjbRMq1)##FC`0c5ZpH*FY(6|f*?Li6{uJR!us}3`Py{Z(YHqt z^%z9IX7-2<#wxnYXkw?pR55}<)+pv*w@xuUnOWNAZjg~i$m(tD>8_@61kiM+UW?Mu z=jw&_*-s`(7LovNUycgO-Vef$2R+6GinS@IsMvD*Pu7>u7t^HN_*5u-?S``733k>( zBqXNETcaGP81+i;Rist-`>VpSctlbG(xDtpoEtbaQj2u`)?B)Nk6XKFX zkNF>Ir~&c}7|!Z#n7{uER({b9ESzBUn|JQAMc7sxax<0otX(uytAI%xJqRW620Qb$lP1y=fA%Rbiu8$Zx5AarbOa$Wjcl^Hp7rV5CTQGC;ock>vmbB_JS z@P97_mEG|n0yvZSzlrY%UCiVk#JBf12ulCA#CNj5|2yIv&wFF+zr}jT&~bCC1PX74 zUy*mJEfj?X14AgCXVTPZjas79ao8~OeUX}tbX_yY6=t1`nas;=GW%osr<&f%_#*A? zZQlJ}KT^QZ8-bh~z|tN&cC1+xN|T0oPCagn=HoVLq@%Sun^QcdiCp}8wa}iVlJKRi zCvR17b3^(wh$Pou-!yMHgDfzX``FmPNhz}M13@ny3 zK(v+*7>bfez<)IW?^!b*ra4NdQ)q};mu8{6N^twBDV*E`)03$zSNq~_k^_F#kk~hAmkue&t~m}~UbUPpBVRp)t}D?V+^?W%P4m#>39plS zO0ZU%5by2XJ^s=HFt|;eCvmECj7uw&|_xa9~>G9tzS4ha`g1Tt`!5yD*2HBt~1zSZXhW} z$bseBHCg+qPDM8?c*`Com;xf0e$Yj?V-&1$NK3+#(yq8W)_ir);I3diMWjwJH0kYC z`E&>hd^6M)psgLL8i!=9!o$P47~Si0m)jJ?%+|7XAlnR=kLHhm-Fz5MO5M%v(}IqR z*~N-RO#09Dw+Hjzp|<{BsP|_NY~4=EbK9_ybDFprXamIt9HDF`FagOtD13j*%}9Hz z0H6AmlTzSb+avD#W<~v04K74T)&l5r3`jfw$AdPql9Tezu8`_7XWIf2;ZXu&mw&Mx z9u#Su18+Yn>`D6X5S_mce*ZjB-qJSFJ2dAWWa?sNnnczzOYF+!+mhu~Av)}GE-`6h z@Tb3_NhAEYqKgP68NskAA&&FFsyMw2u+W05dd&TT=sq{<;Ue zLHx4v|1~nZ_bEErtZwLGhvObhU!OKaVfQpNG)P*&&y^PeZb||`q$5pP3dC)cN8vN> ze|3McQV{!}^GWS5uKmECU!*MQ+~ZiTZB?+tUqvAGh$=?t6qt zbmqSQV6T5||I|3dbYSDs{IP$IN_uv#_UGCTPyTB9=L=*iWYlnx|DFx!)K1Mw|5jA} z{RZ*ZLYQ{K#%~GOKbs$O$>p8<_a~BlY8ZNad=DzOPw4MGe?AePXL+@9=@$q8&nx14 zA8LfcuwEz4=Kp-$Yy_kDVC+vKnC#p-(CF{mOU)u*{gLUyYC8-eZF~^S=2L%w6EJ1Z z89^{!-Sqk7e;yy6AJC=tksyu2zi%jM6efWk{rCRz$!082t@2xLOFF`CAB>3^F%u!9 zi_YG*AHt-}7IT7s~nx3O<+qk>C70A=0lsP+dnVCfF@TRr&Dt-U{Jx(yuzq-|vc%Nzh#1YBU zzP{zu;=7F2eaR(ne)KxzPQi4pNb>$`tdB=?ZhTVG@ri*X?wCoLw_Do>1io`i?>}xj zw5_eq(U#X_8ykJBK4wnhc7tcI+}~eo@z*yc!Qb|LvjR=BE>Cpkru2Vo{_APG-DFl+)NK7ESsq2Jj^ z!tWw0X^gJ+`;X(U(PpXD4_^J%5TFGM&Hi^kd2;eheq$v~;ByRSO{8rfu*P5Law^y( zLqkLB22&0KwIu)$pb6BHo%Mh5yr957Phhq0ZOY+1O98TdVlQ7z<=T!@1Gv>$axX(| z;FN&PCA#|O(2RZ1U`sN83E}fS_z~Gh&;|}oPJXRE|LZyuN^d2$h_i%nt^YnbJC5!O zcgAgPO!m#`J$voTO`f6m?%nI;J|IlykrH83*K8olP&5tVUG=ln{ex^?fwoTE=sR;?Y;c{MoePkRaEhFaRO+bj{2qG8=xytxl&Ifd{nJk_m_O$MxQ}l# zv=+U1{rWC4P9|2$6Fi@(*!ucrBbEXK0=$*d_K>maZqd4|{&3b?^8t9nV8aprxuXg`x&h6|Q~cERC+0F{lb;k)8Ya&)hRDW|D~Lt9lc575mf053Js z98Z4X;)TPfPrt;Y2(%n!oKNZfe)mqCg$^KxUf$k)2sx?n>rPxSFRvCOa>KuT)817C zj?;Bji_F8iTw^yKU6kwUma?+)^DdZDYe;wgCtLhL7d%IuKYwL>|Gs_0*y5$ghK(<* zS^?ok^+$w9XthP0HN#_F7mpi+vY&j0h70?+#7CMV=4Va`9!8^9dk{SiHcCeUrHYai zVhWM5#Ft|mM+>cS-k|hya&gx0&7UMA-RZrDP7YT|zn$+%K^uGv|M1wx#$f#S38$xo zTvH!}R&VRu1XYX?K{@%}9Z0UAgH-*Rq^r#3qX%7Se|Nm#u~1c2B_q?*(|e$)nR|0q z@p^rzU%Kn8yHya=GR!=?4DK^jYFV2MWYCfF_yY}%gG;w=ZC+$zIzToLwWGNoeh=H3 ziEoo_;ao;GiPnyF!C(1pHu1I})o ze0lKYsl#V{Vb~7TpE!AP1PJijZ{KbYbYwhsbo4=2FhW=RN8I@tY8h3)EyuN(9yxw| z4|F_&^)&n=;zp6(#?dk?wgn`Kc2mb6t#-5PzN&;CO|N4@sHCn+*-dpH1e)-$_tlEy zjDZ##8+Y&BZKv0hJ_tiaMpnqndq<)O=KTeBc53ODFQEgrC#0dx|EWh5X0s^N~d|3Ls9| zqdLcWC0IhvU3w>W>FCQA9=@dOz3K5?xZvy?De=?a%xXoPDT=SkpEvHYX>n^RM;;bl zq9sioE5(~PcL8cjMz+0;nqM?G%m0=n8}@jnmj_PybALZQ1jR*Up7{`D<%wYuq`#%noaIW#@(chmFp;Nal>=>-!LlabaW*&>@!E*V)F z81?7!H*cEum+(+fP&{53mSkF7@)~WDjFE7b{2y$61zc78w)LWsR#HI1pu3e$6+u7= zB}GzN>F!X%Ktw=V8U*Q10THP~Nry-a8|nV$K1a{J?|qNox#-=(jp*su1*N$oGTEf4ex3zjS7ge10ga z#0gaOariFFCj+m#jyKnvK)#OdMDCB>B*O^JG@w(#4Zeuf@v5MT+l)J$48$*2_X@VO zv_UC;!^uH-hb?H)5KnR4=fD=gNGUEp$9p>-8@X4$s`u`yBQ3a>=)P(YifP
)7a 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

TxD4Al=1@$ZZ>pKGYZX@87RwVPTQ? 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 Date: Mon, 21 Oct 2024 16:42:57 -0400 Subject: [PATCH 04/70] update eref (#47770) --- e | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e b/e index ad2d7f191845b..d3347acb2791a 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit ad2d7f191845b4964c1e2baa211dceb87b6ac105 +Subproject commit d3347acb2791ad6b527cb5cce3283778ac0b6b26 From 0a0d4137db8bd0b3a37076bc4d215626623a5053 Mon Sep 17 00:00:00 2001 From: Nic Klaassen Date: Mon, 21 Oct 2024 13:55:22 -0700 Subject: [PATCH 05/70] eliminate rsa.GenerateKey and lib/auth/native (#47768) --- .../transport/transportv1/client_test.go | 4 +- api/observability/tracing/ssh/ssh_test.go | 18 +- api/utils/keys/privatekey_test.go | 1 + api/utils/sshutils/checker_test.go | 2 + api/utils/sshutils/conn_test.go | 18 +- api/utils/sshutils/test.go | 51 +++--- integration/helpers/instance.go | 18 +- integration/helpers/testmain.go | 4 +- integration/kube/fixtures.go | 6 +- integrations/event-handler/mtls_certs.go | 1 + .../lib/credentials/credentials_test.go | 10 +- .../lib/testing/fakejoin/kubesigner.go | 11 +- lib/auth/auth_test.go | 10 +- lib/auth/auth_with_roles_test.go | 3 +- lib/auth/db_test.go | 4 +- lib/auth/grpcserver_test.go | 2 +- lib/auth/keygen/keygen.go | 6 - lib/auth/keygen/keygen_test.go | 33 ++-- lib/auth/kube_test.go | 8 +- .../workload_identity_service_test.go | 4 +- lib/auth/native/native.go | 164 +++--------------- lib/auth/native/native_test.go | 94 ---------- lib/auth/sessions.go | 7 +- lib/auth/testauthority/testauthority.go | 23 +-- lib/auth/windows/windows.go | 5 +- lib/circleci/token_validator_test.go | 8 +- lib/client/api_test.go | 4 +- lib/client/keystore_test.go | 4 +- lib/client/local_proxy_middleware_test.go | 6 +- lib/cryptosuites/internal/rsa/rsa.go | 129 ++++++++++++++ lib/cryptosuites/internal/rsa/rsa_test.go | 36 ++++ lib/cryptosuites/precompute.go | 38 ++++ lib/cryptosuites/suites.go | 34 ++-- lib/devicetrust/challenge/challenge_test.go | 59 ++----- lib/gcp/token_validator_test.go | 24 +-- lib/githubactions/token_validator_test.go | 14 +- lib/gitlab/token_validator_test.go | 22 +-- .../awsoidc/eice_sendsshpublickey.go | 49 ++---- .../awsoidc/eice_sendsshpublickey_test.go | 12 +- lib/kubernetestoken/token_validator_test.go | 9 +- lib/{auth/native => modules}/boring.go | 2 +- lib/modules/modules.go | 3 +- lib/{auth/native => modules}/notboring.go | 5 +- lib/multiplexer/multiplexer_test.go | 21 +-- lib/proxy/peer/helpers_test.go | 9 +- lib/reversetunnel/cache.go | 7 +- lib/service/certreloader_test.go | 6 +- lib/services/authority.go | 2 +- lib/spacelift/token_validator_test.go | 24 +-- lib/srv/alpnproxy/helpers_test.go | 11 +- lib/srv/app/server_test.go | 3 +- lib/srv/authhandlers_test.go | 18 +- lib/srv/db/access_test.go | 4 +- lib/srv/forward/sshserver.go | 20 ++- lib/srv/forward/sshserver_test.go | 51 +++++- .../transport/transportv1/transport_test.go | 17 +- lib/sshutils/server_test.go | 16 +- lib/tbot/tbot_test.go | 4 +- lib/terraformcloud/token_validator_test.go | 28 +-- lib/tlsca/ca_test.go | 16 +- lib/tpm/tpm_simulator_test.go | 1 + lib/utils/cert/certs.go | 79 ++------- lib/utils/certs.go | 20 ++- lib/utils/chconn_test.go | 12 +- lib/web/apiserver_test.go | 3 +- tool/tbot/kube_test.go | 6 +- tool/tctl/common/admin_action_test.go | 12 +- tool/tsh/common/db_test.go | 5 +- tool/tsh/common/tsh_test.go | 3 +- 69 files changed, 644 insertions(+), 719 deletions(-) delete mode 100644 lib/auth/native/native_test.go create mode 100644 lib/cryptosuites/internal/rsa/rsa.go create mode 100644 lib/cryptosuites/internal/rsa/rsa_test.go create mode 100644 lib/cryptosuites/precompute.go rename lib/{auth/native => modules}/boring.go (98%) rename lib/{auth/native => modules}/notboring.go (85%) diff --git a/api/client/proxy/transport/transportv1/client_test.go b/api/client/proxy/transport/transportv1/client_test.go index 2743443a4b342..ce1579c9ce7cd 100644 --- a/api/client/proxy/transport/transportv1/client_test.go +++ b/api/client/proxy/transport/transportv1/client_test.go @@ -17,8 +17,8 @@ package transportv1 import ( "bytes" "context" + "crypto/ed25519" "crypto/rand" - "crypto/rsa" "errors" "fmt" "io" @@ -555,7 +555,7 @@ func newServer(t *testing.T, srv transportv1pb.TransportServiceServer) testPack // newKeyring returns an [agent.ExtendedAgent] that has // one key populated in it. func newKeyring(t *testing.T) agent.ExtendedAgent { - private, err := rsa.GenerateKey(rand.Reader, 2048) + _, private, err := ed25519.GenerateKey(rand.Reader) require.NoError(t, err) keyring := agent.NewKeyring() diff --git a/api/observability/tracing/ssh/ssh_test.go b/api/observability/tracing/ssh/ssh_test.go index 5564eb40153f2..441073d61b5f9 100644 --- a/api/observability/tracing/ssh/ssh_test.go +++ b/api/observability/tracing/ssh/ssh_test.go @@ -16,12 +16,10 @@ package ssh import ( "context" + "crypto/ed25519" "crypto/rand" - "crypto/rsa" "crypto/subtle" - "crypto/x509" "encoding/json" - "encoding/pem" "errors" "net" "testing" @@ -73,19 +71,11 @@ func (s *server) Stop() error { } func generateSigner(t *testing.T) ssh.Signer { - private, err := rsa.GenerateKey(rand.Reader, 2048) + _, private, err := ed25519.GenerateKey(rand.Reader) require.NoError(t, err) - - block := &pem.Block{ - Type: "RSA PRIVATE KEY", - Bytes: x509.MarshalPKCS1PrivateKey(private), - } - - privatePEM := pem.EncodeToMemory(block) - signer, err := ssh.ParsePrivateKey(privatePEM) + sshSigner, err := ssh.NewSignerFromSigner(private) require.NoError(t, err) - - return signer + return sshSigner } func (s *server) GetClient(t *testing.T) (ssh.Conn, <-chan ssh.NewChannel, <-chan *ssh.Request) { diff --git a/api/utils/keys/privatekey_test.go b/api/utils/keys/privatekey_test.go index 3d3eb1305f28b..6e4759eb44a2c 100644 --- a/api/utils/keys/privatekey_test.go +++ b/api/utils/keys/privatekey_test.go @@ -36,6 +36,7 @@ import ( ) func TestMarshalAndParseKey(t *testing.T) { + //nolint:forbidigo // Generating a small RSA key allowed for test. rsaKey, err := rsa.GenerateKey(rand.Reader, 1024) require.NoError(t, err) ecKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) diff --git a/api/utils/sshutils/checker_test.go b/api/utils/sshutils/checker_test.go index f32470e812552..be5e5af70c7a2 100644 --- a/api/utils/sshutils/checker_test.go +++ b/api/utils/sshutils/checker_test.go @@ -40,8 +40,10 @@ func TestCheckerValidateFIPS(t *testing.T) { FIPS: true, } + //nolint:forbidigo // Generating RSA keys allowed for key check test. rsaKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) require.NoError(t, err) + //nolint:forbidigo // Generating RSA keys allowed for key check test. smallRSAKey, err := rsa.GenerateKey(rand.Reader, 1024) require.NoError(t, err) ellipticKeyP224, err := ecdsa.GenerateKey(elliptic.P224(), rand.Reader) diff --git a/api/utils/sshutils/conn_test.go b/api/utils/sshutils/conn_test.go index ad34220726c12..e3e802ab79e4f 100644 --- a/api/utils/sshutils/conn_test.go +++ b/api/utils/sshutils/conn_test.go @@ -17,10 +17,8 @@ limitations under the License. package sshutils import ( + "crypto/ed25519" "crypto/rand" - "crypto/rsa" - "crypto/x509" - "encoding/pem" "net" "testing" "time" @@ -64,19 +62,11 @@ func (s *server) Stop() error { } func generateSigner(t *testing.T) ssh.Signer { - private, err := rsa.GenerateKey(rand.Reader, 2048) + _, private, err := ed25519.GenerateKey(rand.Reader) require.NoError(t, err) - - block := &pem.Block{ - Type: "RSA PRIVATE KEY", - Bytes: x509.MarshalPKCS1PrivateKey(private), - } - - privatePEM := pem.EncodeToMemory(block) - signer, err := ssh.ParsePrivateKey(privatePEM) + sshSigner, err := ssh.NewSignerFromSigner(private) require.NoError(t, err) - - return signer + return sshSigner } func (s *server) GetClient(t *testing.T) (ssh.Conn, <-chan ssh.NewChannel, <-chan *ssh.Request) { diff --git a/api/utils/sshutils/test.go b/api/utils/sshutils/test.go index 516e903aa71f2..b52b0dcc4b168 100644 --- a/api/utils/sshutils/test.go +++ b/api/utils/sshutils/test.go @@ -17,25 +17,24 @@ limitations under the License. package sshutils import ( + "crypto" + "crypto/ed25519" "crypto/rand" - "crypto/rsa" "time" "github.com/gravitational/trace" "golang.org/x/crypto/ssh" - - "github.com/gravitational/teleport/api/constants" ) const defaultPrincipal = "127.0.0.1" // MakeTestSSHCA generates a new SSH certificate authority for tests. func MakeTestSSHCA() (ssh.Signer, error) { - privateKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + _, privateKey, err := ed25519.GenerateKey(rand.Reader) if err != nil { return nil, trace.Wrap(err) } - ca, err := ssh.NewSignerFromKey(privateKey) + ca, err := ssh.NewSignerFromSigner(privateKey) if err != nil { return nil, trace.Wrap(err) } @@ -49,33 +48,41 @@ func MakeSpoofedHostCert(realCA ssh.Signer) (ssh.Signer, error) { if err != nil { return nil, trace.Wrap(err) } - return makeHostCert(realCA.PublicKey(), fakeCA, defaultPrincipal) + _, hostKey, err := ed25519.GenerateKey(rand.Reader) + if err != nil { + return nil, trace.Wrap(err) + } + return makeHostCert(hostKey, realCA.PublicKey(), fakeCA, defaultPrincipal) } // MakeRealHostCert makes an SSH host certificate that is signed by the // provided CA. func MakeRealHostCert(realCA ssh.Signer) (ssh.Signer, error) { - return makeHostCert(realCA.PublicKey(), realCA, defaultPrincipal) + _, hostKey, err := ed25519.GenerateKey(rand.Reader) + if err != nil { + return nil, trace.Wrap(err) + } + return makeHostCert(hostKey, realCA.PublicKey(), realCA, defaultPrincipal) +} + +// MakeRealHostCertWithKey makes an SSH host certificate with the provided key that is +// signed by the provided CA. +func MakeRealHostCertWithKey(hostKey crypto.Signer, realCA ssh.Signer) (ssh.Signer, error) { + return makeHostCert(hostKey, realCA.PublicKey(), realCA, defaultPrincipal) } // MakeRealHostCertWithPrincipals makes an SSH host certificate that is signed by the // provided CA for the provided principals. func MakeRealHostCertWithPrincipals(realCA ssh.Signer, principals ...string) (ssh.Signer, error) { - return makeHostCert(realCA.PublicKey(), realCA, principals...) -} - -func makeHostCert(signKey ssh.PublicKey, signer ssh.Signer, principals ...string) (ssh.Signer, error) { - priv, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) - if err != nil { - return nil, trace.Wrap(err) - } - - privSigner, err := ssh.NewSignerFromKey(priv) + _, hostKey, err := ed25519.GenerateKey(rand.Reader) if err != nil { return nil, trace.Wrap(err) } + return makeHostCert(hostKey, realCA.PublicKey(), realCA, principals...) +} - pub, err := ssh.NewPublicKey(priv.Public()) +func makeHostCert(hostKey crypto.Signer, caPublicKey ssh.PublicKey, caSigner ssh.Signer, principals ...string) (ssh.Signer, error) { + hostSigner, err := ssh.NewSignerFromSigner(hostKey) if err != nil { return nil, trace.Wrap(err) } @@ -87,9 +94,9 @@ func makeHostCert(signKey ssh.PublicKey, signer ssh.Signer, principals ...string cert := &ssh.Certificate{ Nonce: nonce, - Key: pub, + Key: hostSigner.PublicKey(), CertType: ssh.HostCert, - SignatureKey: signKey, + SignatureKey: caPublicKey, ValidPrincipals: principals, ValidBefore: uint64(time.Now().Add(time.Hour).Unix()), } @@ -104,12 +111,12 @@ func makeHostCert(signKey ssh.PublicKey, signer ssh.Signer, principals ...string bytesForSigning := cert.Marshal() bytesForSigning = bytesForSigning[:len(bytesForSigning)-4] - cert.Signature, err = signer.Sign(rand.Reader, bytesForSigning) + cert.Signature, err = caSigner.Sign(rand.Reader, bytesForSigning) if err != nil { return nil, trace.Wrap(err) } - certSigner, err := ssh.NewCertSigner(cert, privSigner) + certSigner, err := ssh.NewCertSigner(cert, hostSigner) if err != nil { return nil, trace.Wrap(err) } diff --git a/integration/helpers/instance.go b/integration/helpers/instance.go index df01f95d753fa..275837306b9d3 100644 --- a/integration/helpers/instance.go +++ b/integration/helpers/instance.go @@ -21,7 +21,6 @@ package helpers import ( "bytes" "context" - "crypto/rsa" "crypto/tls" "crypto/x509/pkix" "encoding/json" @@ -47,6 +46,7 @@ import ( "github.com/gravitational/teleport/api/breaker" clientproto "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/keygen" "github.com/gravitational/teleport/lib/auth/state" @@ -55,6 +55,7 @@ import ( "github.com/gravitational/teleport/lib/backend/lite" "github.com/gravitational/teleport/lib/client" "github.com/gravitational/teleport/lib/cloud/imds" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/httplib/csrf" @@ -343,24 +344,27 @@ func NewInstance(t *testing.T, cfg InstanceConfig) *TeleInstance { } // generate instance secrets (keys): - keygen := keygen.New(context.TODO()) if cfg.Priv == nil || cfg.Pub == nil { - cfg.Priv, cfg.Pub, _ = keygen.GenerateKeyPair() + privateKey, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.ECDSAP256) + fatalIf(err) + cfg.Priv = privateKey.PrivateKeyPEM() + cfg.Pub = privateKey.MarshalSSHPublicKey() } - rsaKey, err := ssh.ParseRawPrivateKey(cfg.Priv) + key, err := keys.ParsePrivateKey(cfg.Priv) fatalIf(err) - tlsCACert, err := tlsca.GenerateSelfSignedCAWithSigner(rsaKey.(*rsa.PrivateKey), pkix.Name{ + tlsCACert, err := tlsca.GenerateSelfSignedCAWithSigner(key, pkix.Name{ CommonName: cfg.ClusterName, Organization: []string{cfg.ClusterName}, }, nil, defaults.CATTL) fatalIf(err) - signer, err := ssh.ParsePrivateKey(cfg.Priv) + sshSigner, err := ssh.NewSignerFromSigner(key) fatalIf(err) + keygen := keygen.New(context.TODO()) cert, err := keygen.GenerateHostCert(services.HostCertParams{ - CASigner: signer, + CASigner: sshSigner, PublicHostKey: cfg.Pub, HostID: cfg.HostID, NodeName: cfg.NodeName, diff --git a/integration/helpers/testmain.go b/integration/helpers/testmain.go index b045546e24c68..5bc37898bffcf 100644 --- a/integration/helpers/testmain.go +++ b/integration/helpers/testmain.go @@ -23,7 +23,7 @@ import ( "testing" "time" - "github.com/gravitational/teleport/lib/auth/native" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/srv" "github.com/gravitational/teleport/lib/utils" @@ -34,7 +34,7 @@ import ( // it as an argument. Otherwise, it will run tests as normal. func TestMainImplementation(m *testing.M) { utils.InitLoggerForTests() - native.PrecomputeTestKeys(m) + cryptosuites.PrecomputeRSATestKeys(m) SetTestTimeouts(3 * time.Second) modules.SetInsecureTestMode(true) // If the test is re-executing itself, execute the command that comes over diff --git a/integration/kube/fixtures.go b/integration/kube/fixtures.go index 42228789a0f1b..5b4ba4910ca33 100644 --- a/integration/kube/fixtures.go +++ b/integration/kube/fixtures.go @@ -29,7 +29,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/integration/helpers" - "github.com/gravitational/teleport/lib/auth/native" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/tlsca" "github.com/gravitational/teleport/lib/utils" @@ -88,11 +88,11 @@ func ProxyClient(cfg ProxyConfig) (*kubernetes.Clientset, *rest.Config, error) { if err != nil { return nil, nil, trace.Wrap(err) } - privPEM, _, err := native.GenerateKeyPair() + priv, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) if err != nil { return nil, nil, trace.Wrap(err) } - priv, err := keys.ParsePrivateKey(privPEM) + privPEM, err := keys.MarshalPrivateKey(priv) if err != nil { return nil, nil, trace.Wrap(err) } diff --git a/integrations/event-handler/mtls_certs.go b/integrations/event-handler/mtls_certs.go index 84a7cc80b9827..553acf2c0ef01 100644 --- a/integrations/event-handler/mtls_certs.go +++ b/integrations/event-handler/mtls_certs.go @@ -186,6 +186,7 @@ func (c *MTLSCerts) generate(length int) error { // genCertAndPK generates and returns certificate and primary key func (c *MTLSCerts) genCertAndPK(length int, cert *x509.Certificate, parent *x509.Certificate, signer *rsa.PrivateKey) (*rsa.PrivateKey, []byte, error) { // Generate PK + //nolint:forbidigo // Allow integration to generate RSA key without importing Teleport. pk, err := rsa.GenerateKey(rand.Reader, length) if err != nil { return nil, nil, trace.Wrap(err) diff --git a/integrations/lib/credentials/credentials_test.go b/integrations/lib/credentials/credentials_test.go index a0c917323d726..3bedf5dad56b8 100644 --- a/integrations/lib/credentials/credentials_test.go +++ b/integrations/lib/credentials/credentials_test.go @@ -20,7 +20,6 @@ package credentials import ( "crypto/rand" - "crypto/rsa" "crypto/tls" "crypto/x509" "crypto/x509/pkix" @@ -33,6 +32,7 @@ import ( "golang.org/x/crypto/ssh" "github.com/gravitational/teleport/api/client" + "github.com/gravitational/teleport/lib/cryptosuites" ) // mockTLSCredentials mocks insecure Client credentials. @@ -85,13 +85,13 @@ func TestCheckExpiredCredentials(t *testing.T) { NotAfter: time.Now().Add(1 * time.Hour), } - caKey, err := rsa.GenerateKey(rand.Reader, 1024) + caKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) - clientKey, err := rsa.GenerateKey(rand.Reader, 1024) + clientKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) - validCertBytes, err := x509.CreateCertificate(rand.Reader, validCert, ca, &clientKey.PublicKey, caKey) + validCertBytes, err := x509.CreateCertificate(rand.Reader, validCert, ca, clientKey.Public(), caKey) require.NoError(t, err) - invalidCertBytes, err := x509.CreateCertificate(rand.Reader, expiredCert, ca, &clientKey.PublicKey, caKey) + invalidCertBytes, err := x509.CreateCertificate(rand.Reader, expiredCert, ca, clientKey.Public(), caKey) require.NoError(t, err) expiredCred := &mockTLSCredentials{CertificateChain: &tls.Certificate{Certificate: [][]byte{invalidCertBytes}}} diff --git a/integrations/lib/testing/fakejoin/kubesigner.go b/integrations/lib/testing/fakejoin/kubesigner.go index 3db707a1f8bc5..271c913d2758f 100644 --- a/integrations/lib/testing/fakejoin/kubesigner.go +++ b/integrations/lib/testing/fakejoin/kubesigner.go @@ -19,8 +19,6 @@ package fakejoin import ( - "crypto/rand" - "crypto/rsa" "encoding/json" "fmt" "time" @@ -31,6 +29,7 @@ import ( "github.com/gravitational/trace" "github.com/jonboulle/clockwork" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/kubernetestoken" ) @@ -38,7 +37,6 @@ import ( // allows us to do Kube joining locally. This is useful in tests as this is currently the easiest // delegated join method we can use without having to rely on external infrastructure/providers. type KubernetesSigner struct { - key *rsa.PrivateKey signer jose.Signer jwks *jose.JSONWebKeySet clock clockwork.Clock @@ -48,12 +46,12 @@ const fakeKeyID = "foo" // NewKubernetesSigner generates a keypair and creates a new KubernetesSigner. func NewKubernetesSigner(clock clockwork.Clock) (*KubernetesSigner, error) { - key, err := rsa.GenerateKey(rand.Reader, 2048) + key, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) if err != nil { return nil, trace.Wrap(err, "generating key") } signer, err := jose.NewSigner( - jose.SigningKey{Algorithm: jose.RS256, Key: key}, + jose.SigningKey{Algorithm: jose.ES256, Key: key}, (&jose.SignerOptions{}). WithType("JWT"). WithHeader("kid", fakeKeyID), @@ -65,12 +63,11 @@ func NewKubernetesSigner(clock clockwork.Clock) (*KubernetesSigner, error) { { Key: key.Public(), Use: "sig", - Algorithm: string(jose.RS256), + Algorithm: string(jose.ES256), KeyID: fakeKeyID, }, }} return &KubernetesSigner{ - key: key, signer: signer, jwks: jwks, clock: clock, diff --git a/lib/auth/auth_test.go b/lib/auth/auth_test.go index c8f8bf6a713ea..d9170412d839e 100644 --- a/lib/auth/auth_test.go +++ b/lib/auth/auth_test.go @@ -21,7 +21,6 @@ package auth import ( "context" "crypto/rand" - "crypto/rsa" "crypto/x509" "crypto/x509/pkix" "encoding/pem" @@ -66,7 +65,6 @@ import ( "github.com/gravitational/teleport/api/utils/sshutils" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/keystore" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/auth/testauthority" wantypes "github.com/gravitational/teleport/lib/auth/webauthntypes" "github.com/gravitational/teleport/lib/authz" @@ -216,7 +214,7 @@ func newAuthSuite(t *testing.T) *testPack { func TestMain(m *testing.M) { utils.InitLoggerForTests() - native.PrecomputeTestKeys(m) + cryptosuites.PrecomputeRSATestKeys(m) modules.SetInsecureTestMode(true) os.Exit(m.Run()) } @@ -1396,7 +1394,7 @@ func TestSAMLConnectorCRUDEventsEmitted(t *testing.T) { ca, err := tlsca.FromKeys([]byte(fixtures.TLSCACertPEM), []byte(fixtures.TLSCAKeyPEM)) require.NoError(t, err) - privateKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) testClock := clockwork.NewFakeClock() @@ -2581,7 +2579,7 @@ func TestGenerateOpenSSHCert(t *testing.T) { role, ok := r.(*types.RoleV6) require.True(t, ok) - priv, err := native.GeneratePrivateKey() + priv, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.Ed25519) require.NoError(t, err) reply, err := p.a.GenerateOpenSSHCert(ctx, &proto.OpenSSHCertRequest{ @@ -2693,7 +2691,7 @@ func TestGenerateHostCertWithLocks(t *testing.T) { hostID := uuid.New().String() keygen := testauthority.New() - _, pub, err := keygen.GetNewKeyPairFromPool() + _, pub, err := keygen.GenerateKeyPair() require.NoError(t, err) _, err = p.a.GenerateHostCert(ctx, pub, hostID, "test-node", []string{}, p.clusterName.GetClusterName(), types.RoleNode, time.Minute) diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go index 9eca3cae6fa15..06fcd9e849a09 100644 --- a/lib/auth/auth_with_roles_test.go +++ b/lib/auth/auth_with_roles_test.go @@ -62,7 +62,6 @@ import ( "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/api/utils/sshutils" "github.com/gravitational/teleport/lib/auth/authclient" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/auth/testauthority" "github.com/gravitational/teleport/lib/authz" "github.com/gravitational/teleport/lib/cryptosuites" @@ -1484,7 +1483,7 @@ func TestGenerateDatabaseCert(t *testing.T) { } // Generate CSR once for speed sake. - priv, err := native.GeneratePrivateKey() + priv, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.RSA2048) require.NoError(t, err) csr, err := tlsca.GenerateCertificateRequestPEM(pkix.Name{CommonName: "test"}, priv) diff --git a/lib/auth/db_test.go b/lib/auth/db_test.go index 4127b9a2ed570..13ea93087fd33 100644 --- a/lib/auth/db_test.go +++ b/lib/auth/db_test.go @@ -30,7 +30,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" - "github.com/gravitational/teleport/lib/auth/testauthority" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/tlsca" ) @@ -110,7 +110,7 @@ func TestDBCertSigning(t *testing.T) { ctx := context.Background() - privateKey, err := testauthority.New().GeneratePrivateKey() + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) require.NoError(t, err) csr, err := tlsca.GenerateCertificateRequestPEM(pkix.Name{ diff --git a/lib/auth/grpcserver_test.go b/lib/auth/grpcserver_test.go index d1dcd4de42214..c04e48ba5e24a 100644 --- a/lib/auth/grpcserver_test.go +++ b/lib/auth/grpcserver_test.go @@ -2750,7 +2750,7 @@ func TestGenerateDatabaseCerts(t *testing.T) { require.NoError(t, err) // Generate CSR once for speed sake. - priv, err := testauthority.New().GeneratePrivateKey() + priv, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) require.NoError(t, err) csr, err := tlsca.GenerateCertificateRequestPEM(pkix.Name{CommonName: "test"}, priv) require.NoError(t, err) diff --git a/lib/auth/keygen/keygen.go b/lib/auth/keygen/keygen.go index a4d185c722d45..bb77f36012188 100644 --- a/lib/auth/keygen/keygen.go +++ b/lib/auth/keygen/keygen.go @@ -35,7 +35,6 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/wrappers" apiutils "github.com/gravitational/teleport/api/utils" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/utils" @@ -70,11 +69,6 @@ func New(_ context.Context, opts ...Option) *Keygen { return k } -// GenerateKeyPair returns fresh priv/pub keypair, takes about 300ms to execute. -func (k *Keygen) GenerateKeyPair() ([]byte, []byte, error) { - return native.GenerateKeyPair() -} - // GenerateHostCert generates a host certificate with the passed in parameters. // The private key of the CA to sign the certificate must be provided. func (k *Keygen) GenerateHostCert(c services.HostCertParams) ([]byte, error) { diff --git a/lib/auth/keygen/keygen_test.go b/lib/auth/keygen/keygen_test.go index 09313f5c6b7b6..e2d68d91a923e 100644 --- a/lib/auth/keygen/keygen_test.go +++ b/lib/auth/keygen/keygen_test.go @@ -25,6 +25,7 @@ import ( "time" "github.com/google/go-cmp/cmp" + "github.com/gravitational/trace" "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" "golang.org/x/crypto/ssh" @@ -32,9 +33,10 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/api/utils/sshutils" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/auth/test" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/services" ) @@ -48,9 +50,15 @@ func setupNativeContext(ctx context.Context, _ *testing.T) *nativeContext { clock := clockwork.NewFakeClockAt(time.Date(2016, 9, 8, 7, 6, 5, 0, time.UTC)) tt.suite = &test.AuthSuite{ - A: New(ctx, SetClock(clock)), - Keygen: native.GenerateKeyPair, - Clock: clock, + A: New(ctx, SetClock(clock)), + Keygen: func() ([]byte, []byte, error) { + privateKey, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.ECDSAP256) + if err != nil { + return nil, nil, trace.Wrap(err) + } + return privateKey.PrivateKeyPEM(), privateKey.MarshalSSHPublicKey(), nil + }, + Clock: clock, } return &tt @@ -91,14 +99,16 @@ func TestBuildPrincipals(t *testing.T) { tt := setupNativeContext(context.Background(), t) - caPrivateKey, _, err := native.GenerateKeyPair() + caPrivateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.Ed25519) require.NoError(t, err) - - caSigner, err := ssh.ParsePrivateKey(caPrivateKey) + caSigner, err := ssh.NewSignerFromSigner(caPrivateKey) require.NoError(t, err) - _, hostPublicKey, err := native.GenerateKeyPair() + hostKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.Ed25519) require.NoError(t, err) + hostPrivateKey, err := keys.NewSoftwarePrivateKey(hostKey) + require.NoError(t, err) + hostPublicKey := hostPrivateKey.MarshalSSHPublicKey() tests := []struct { desc string @@ -191,10 +201,9 @@ func TestUserCertCompatibility(t *testing.T) { tt := setupNativeContext(context.Background(), t) - priv, pub, err := native.GenerateKeyPair() + caKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.Ed25519) require.NoError(t, err) - - caSigner, err := ssh.ParsePrivateKey(priv) + caSigner, err := ssh.NewSignerFromSigner(caKey) require.NoError(t, err) tests := []struct { @@ -219,7 +228,7 @@ func TestUserCertCompatibility(t *testing.T) { userCertificateBytes, err := tt.suite.A.GenerateUserCert(services.UserCertParams{ CASigner: caSigner, - PublicUserKey: pub, + PublicUserKey: ssh.MarshalAuthorizedKey(caSigner.PublicKey()), Username: "user", AllowedLogins: []string{"centos", "root"}, TTL: time.Hour, diff --git a/lib/auth/kube_test.go b/lib/auth/kube_test.go index 9b8222deda8b7..08af05f555701 100644 --- a/lib/auth/kube_test.go +++ b/lib/auth/kube_test.go @@ -19,7 +19,6 @@ package auth import ( - "crypto/rsa" "crypto/x509" "crypto/x509/pkix" "encoding/pem" @@ -33,6 +32,7 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth/authclient" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/tlsca" ) @@ -105,15 +105,15 @@ func TestProcessKubeCSR(t *testing.T) { // newTestCSR creates and PEM-encodes an x509 CSR with given subject. func newTestCSR(subj pkix.Name) ([]byte, error) { - // Use math/rand to avoid blocking on system entropy. - rng := rand.New(rand.NewSource(0)) - priv, err := rsa.GenerateKey(rng, 2048) + priv, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) if err != nil { return nil, err } x509CSR := &x509.CertificateRequest{ Subject: subj, } + // Use math/rand to avoid blocking on system entropy. + rng := rand.New(rand.NewSource(0)) derCSR, err := x509.CreateCertificateRequest(rng, x509CSR, priv) if err != nil { return nil, err diff --git a/lib/auth/machineid/machineidv1/workload_identity_service_test.go b/lib/auth/machineid/machineidv1/workload_identity_service_test.go index 38bff691642f8..dfe099c483b15 100644 --- a/lib/auth/machineid/machineidv1/workload_identity_service_test.go +++ b/lib/auth/machineid/machineidv1/workload_identity_service_test.go @@ -32,7 +32,7 @@ import ( machineidv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/machineid/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/auth" - "github.com/gravitational/teleport/lib/auth/native" + "github.com/gravitational/teleport/lib/cryptosuites" libjwt "github.com/gravitational/teleport/lib/jwt" ) @@ -93,7 +93,7 @@ func TestWorkloadIdentityService_SignX509SVIDs(t *testing.T) { ) require.NoError(t, err) - privateKey, err := native.GenerateRSAPrivateKey() + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) pubBytes, err := x509.MarshalPKIXPublicKey(privateKey.Public()) require.NoError(t, err) diff --git a/lib/auth/native/native.go b/lib/auth/native/native.go index 093e6947713e7..e8128fa06c2dc 100644 --- a/lib/auth/native/native.go +++ b/lib/auth/native/native.go @@ -16,166 +16,44 @@ * along with this program. If not, see . */ +// Package native will be deleted as soon as references are removed from +// teleport.e. package native import ( - "crypto/ed25519" - "crypto/rand" "crypto/rsa" - "crypto/x509" - "encoding/pem" - "sync" "testing" - "time" "github.com/gravitational/trace" - "github.com/sirupsen/logrus" - "github.com/gravitational/teleport" - "github.com/gravitational/teleport/api/constants" - "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/lib/cryptosuites" + "github.com/gravitational/teleport/lib/modules" ) -var log = logrus.WithFields(logrus.Fields{ - teleport.ComponentKey: teleport.ComponentKeyGen, -}) - -// precomputedKeys is a queue of cached keys ready for usage. -var precomputedKeys = make(chan *rsa.PrivateKey, 25) - -// startPrecomputeOnce is used to start the background task that precomputes key pairs. -var startPrecomputeOnce sync.Once - -// GenerateKeyPair generates a new RSA key pair. -func GenerateKeyPair() ([]byte, []byte, error) { - priv, err := GeneratePrivateKey() - if err != nil { - return nil, nil, trace.Wrap(err) - } - return priv.PrivateKeyPEM(), priv.MarshalSSHPublicKey(), nil -} - -// GenerateEICEKey generates a key that can be send to an Amazon EC2 instance using the ec2instanceconnect.SendSSHPublicKey method. -func GenerateEICEKey() (publicKey any, privateKey any, err error) { - if IsBoringBinary() { - privKey, err := GeneratePrivateKey() - if err != nil { - return nil, nil, trace.Wrap(err) - } - - return privKey.Public(), privKey, nil - } - - pubKey, privKey, err := ed25519.GenerateKey(nil) - if err != nil { - return nil, nil, trace.Wrap(err) - } - - return pubKey, privKey, nil -} - -// GeneratePrivateKey generates a new RSA private key. -func GeneratePrivateKey() (*keys.PrivateKey, error) { - rsaKey, err := getOrGenerateRSAPrivateKey() +// GenerateRSAPrivateKey will be deleted as soon as references are removed from +// teleport.e. +func GenerateRSAPrivateKey() (*rsa.PrivateKey, error) { + key, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) if err != nil { return nil, trace.Wrap(err) } - - // We encode the private key in PKCS #1, ASN.1 DER form - // instead of PKCS #8 to maintain compatibility with some - // third party clients. - keyPEM := pem.EncodeToMemory(&pem.Block{ - Type: keys.PKCS1PrivateKeyType, - Headers: nil, - Bytes: x509.MarshalPKCS1PrivateKey(rsaKey), - }) - - return keys.NewPrivateKey(rsaKey, keyPEM) -} - -func GenerateRSAPrivateKey() (*rsa.PrivateKey, error) { - return getOrGenerateRSAPrivateKey() -} - -func getOrGenerateRSAPrivateKey() (*rsa.PrivateKey, error) { - select { - case k := <-precomputedKeys: - return k, nil - default: - rsaKeyPair, err := generateRSAPrivateKey() - if err != nil { - return nil, err - } - return rsaKeyPair, nil - } + return key.(*rsa.PrivateKey), nil } -func generateRSAPrivateKey() (*rsa.PrivateKey, error) { - return rsa.GenerateKey(rand.Reader, constants.RSAKeySize) -} - -func precomputeKeys() { - const backoff = time.Second * 30 - for { - rsaPrivateKey, err := generateRSAPrivateKey() - if err != nil { - log.WithError(err).Errorf("Failed to precompute key pair, retrying in %s (this might be a bug).", backoff) - time.Sleep(backoff) - } - - precomputedKeys <- rsaPrivateKey - } -} - -func precomputeTestKeys() { - generatedTestKeys := generateTestKeys() - keysToReuse := make([]*rsa.PrivateKey, 0, testKeysNumber) - for range testKeysNumber { - k := <-generatedTestKeys - precomputedKeys <- k - keysToReuse = append(keysToReuse, k) - } - for { - for _, k := range keysToReuse { - precomputedKeys <- k - } - } -} - -// testKeysNumber is the number of RSA keys generated in tests. -const testKeysNumber = 25 - -func generateTestKeys() <-chan *rsa.PrivateKey { - generatedTestKeys := make(chan *rsa.PrivateKey, testKeysNumber) - for range testKeysNumber { - // Generate each key in a separate goroutine to take advantage of - // multiple cores if possible. - go func() { - private, err := generateRSAPrivateKey() - if err != nil { - // Use only in tests. Safe to panic. - panic(err) - } - generatedTestKeys <- private - }() - } - return generatedTestKeys +// PrecomputeKeys is an alias of [cryptosuites.PrecomputeRSAKeys]. It will be +// deleted as soon as references are removed from teleport.e. +func PrecomputeKeys() { + cryptosuites.PrecomputeRSAKeys() } -// PrecomputeKeys sets this package into a mode where a small backlog of keys are -// computed in advance. This should only be enabled if large spikes in key computation -// are expected (e.g. in auth/proxy services). Safe to double-call. -func PrecomputeKeys() { - startPrecomputeOnce.Do(func() { - go precomputeKeys() - }) +// PrecomputeTestKeys is an alias of [cryptosuites.PrecomputeRSATestKeys]. It +// will be deleted as soon as references are removed from teleport.e. +func PrecomputeTestKeys(m *testing.M) { + cryptosuites.PrecomputeRSATestKeys(m) } -// PrecomputeTestKeys generates RSA keys and reuse them to reduce CPU usage. This method should -// only be in tests. Safe to call multiple times. -// This function takes *testing.M, so is only can be used from TestMain in tests. -func PrecomputeTestKeys(_ *testing.M) { - startPrecomputeOnce.Do(func() { - go precomputeTestKeys() - }) +// IsBoringBinary is an alias of [modules.IsBoringBinary]. It will be deleted as +// soon as references are removed from teleport.e. +func IsBoringBinary() bool { + return modules.IsBoringBinary() } diff --git a/lib/auth/native/native_test.go b/lib/auth/native/native_test.go deleted file mode 100644 index 319b242b4f3e5..0000000000000 --- a/lib/auth/native/native_test.go +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Teleport - * Copyright (C) 2023 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -package native - -import ( - "crypto/ed25519" - "crypto/rsa" - "crypto/x509" - "encoding/pem" - "os" - "testing" - "time" - - "github.com/stretchr/testify/require" - - "github.com/gravitational/teleport/lib/utils" -) - -func TestMain(m *testing.M) { - utils.InitLoggerForTests() - os.Exit(m.Run()) -} - -// TestPrecomputeMode verifies that package enters precompute mode when -// PrecomputeKeys is called. -func TestPrecomputeMode(t *testing.T) { - t.Parallel() - - PrecomputeKeys() - - select { - case <-precomputedKeys: - case <-time.After(time.Second * 10): - t.Fatal("Key precompute routine failed to start.") - } -} - -// TestGenerateRSAPKSC1Keypair tests that GeneratePrivateKey generates -// a valid PKCS1 rsa key. -func TestGeneratePKSC1RSAKey(t *testing.T) { - t.Parallel() - - priv, err := GeneratePrivateKey() - require.NoError(t, err) - - block, rest := pem.Decode(priv.PrivateKeyPEM()) - require.NoError(t, err) - require.Empty(t, rest) - - _, err = x509.ParsePKCS1PrivateKey(block.Bytes) - require.NoError(t, err) -} - -func TestGenerateEICEKey_when_boringbinary(t *testing.T) { - if !IsBoringBinary() { - t.Skip() - } - - publicKey, privateKey, err := GenerateEICEKey() - require.NoError(t, err) - - // We expect an RSA Key because boringcrypto doesn't yet support generating ED25519 keys. - require.IsType(t, rsa.PublicKey{}, publicKey) - require.IsType(t, rsa.PrivateKey{}, privateKey) -} - -func TestGenerateEICEKey(t *testing.T) { - if IsBoringBinary() { - t.Skip() - } - - publicKey, privateKey, err := GenerateEICEKey() - require.NoError(t, err) - - // We expect an ED25519 key - require.IsType(t, ed25519.PublicKey{}, publicKey) - require.IsType(t, ed25519.PrivateKey{}, privateKey) -} diff --git a/lib/auth/sessions.go b/lib/auth/sessions.go index 0b394e1450da4..e93ac15133d11 100644 --- a/lib/auth/sessions.go +++ b/lib/auth/sessions.go @@ -38,7 +38,6 @@ import ( apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/entitlements" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/defaults" dtconfig "github.com/gravitational/teleport/lib/devicetrust/config" @@ -257,12 +256,12 @@ func (a *Server) newWebSession( return nil, nil, trace.Wrap(err) } if _, isRSA := sshKey.Public().(*rsa.PublicKey); isRSA { - // Ensure the native package is precomputing RSA keys if we ever - // generate one. [native.PrecomputeKeys] is idempotent. + // Start precomputing RSA keys if we ever generate one. + // [cryptosuites.PrecomputeRSAKeys] is idempotent. // Doing this lazily easily handles changing signature algorithm // suites and won't start precomputing keys if they are never needed // (a major benefit in tests). - native.PrecomputeKeys() + cryptosuites.PrecomputeRSAKeys() } } diff --git a/lib/auth/testauthority/testauthority.go b/lib/auth/testauthority/testauthority.go index 2bd004aecf909..8dae039d9c1f4 100644 --- a/lib/auth/testauthority/testauthority.go +++ b/lib/auth/testauthority/testauthority.go @@ -26,9 +26,8 @@ import ( "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/lib/auth/keygen" - "github.com/gravitational/teleport/lib/auth/native" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/services" ) @@ -47,24 +46,14 @@ func NewWithClock(clock clockwork.Clock) *Keygen { return &Keygen{Keygen: inner} } -// GeneratePrivateKey generates a new PrivateKey. -func (n *Keygen) GeneratePrivateKey() (*keys.PrivateKey, error) { - priv, _, err := n.GenerateKeyPair() - if err != nil { - return nil, trace.Wrap(err) - } - - return keys.ParsePrivateKey(priv) -} - -func (n *Keygen) GetNewKeyPairFromPool() (priv []byte, pub []byte, err error) { - return n.GenerateKeyPair() -} - // GenerateKeyPair returns a new private key in PEM format and an ssh // public key in authorized_key format. func (n *Keygen) GenerateKeyPair() (priv []byte, pub []byte, err error) { - return native.GenerateKeyPair() + privateKey, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.ECDSAP256) + if err != nil { + return nil, nil, trace.Wrap(err) + } + return privateKey.PrivateKeyPEM(), privateKey.MarshalSSHPublicKey(), nil } func (n *Keygen) GenerateHostCert(c services.HostCertParams) ([]byte, error) { diff --git a/lib/auth/windows/windows.go b/lib/auth/windows/windows.go index c44f7f35be8e2..b198075036a4d 100644 --- a/lib/auth/windows/windows.go +++ b/lib/auth/windows/windows.go @@ -34,6 +34,7 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/tlsca" ) @@ -70,12 +71,12 @@ func getCertRequest(req *GenerateCredentialsRequest) (*certRequest, error) { // Important: rdpclient currently only supports 2048-bit RSA keys. // If you switch the key type here, update handle_general_authentication in // rdp/rdpclient/src/piv.rs accordingly. - rsaKey, err := rsa.GenerateKey(rand.Reader, 2048) + rsaKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) if err != nil { return nil, trace.Wrap(err) } // Also important: rdpclient expects the private key to be in PKCS1 format. - keyDER := x509.MarshalPKCS1PrivateKey(rsaKey) + keyDER := x509.MarshalPKCS1PrivateKey(rsaKey.(*rsa.PrivateKey)) // Generate the Windows-compatible certificate, see // https://docs.microsoft.com/en-us/troubleshoot/windows-server/windows-security/enabling-smart-card-logon-third-party-certification-authorities diff --git a/lib/circleci/token_validator_test.go b/lib/circleci/token_validator_test.go index 99d56f731b461..5d0a65b683ed5 100644 --- a/lib/circleci/token_validator_test.go +++ b/lib/circleci/token_validator_test.go @@ -20,8 +20,6 @@ package circleci import ( "context" - "crypto/rand" - "crypto/rsa" "encoding/json" "fmt" "net/http" @@ -33,6 +31,8 @@ import ( "github.com/go-jose/go-jose/v3/jwt" "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/cryptosuites" ) // fakeIDP pretends to be a circle CI org OIDC provider, e.g: @@ -76,7 +76,7 @@ func (f *fakeIDP) issuerURLTemplate() string { func newFakeIDP(t *testing.T, organizationID string) *fakeIDP { // Generate keypair for IDP - privateKey, err := rsa.GenerateKey(rand.Reader, 2048) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) require.NoError(t, err) signer, err := jose.NewSigner( @@ -121,7 +121,7 @@ func newFakeIDP(t *testing.T, organizationID string) *fakeIDP { jwks := jose.JSONWebKeySet{ Keys: []jose.JSONWebKey{ { - Key: &privateKey.PublicKey, + Key: privateKey.Public(), }, }, } diff --git a/lib/client/api_test.go b/lib/client/api_test.go index 536809ceea02b..5558fb27b112a 100644 --- a/lib/client/api_test.go +++ b/lib/client/api_test.go @@ -41,7 +41,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/grpc/interceptors" "github.com/gravitational/teleport/api/utils/keys" - "github.com/gravitational/teleport/lib/auth/native" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/modules" @@ -53,7 +53,7 @@ import ( func TestMain(m *testing.M) { utils.InitLoggerForTests() modules.SetInsecureTestMode(true) - native.PrecomputeTestKeys(m) + cryptosuites.PrecomputeRSATestKeys(m) os.Exit(m.Run()) } diff --git a/lib/client/keystore_test.go b/lib/client/keystore_test.go index 613f0a7481929..620ec8f687981 100644 --- a/lib/client/keystore_test.go +++ b/lib/client/keystore_test.go @@ -218,7 +218,7 @@ func TestCheckKey(t *testing.T) { keyRing := auth.makeSignedKeyRing(t, idx, false) // Swap out the key with a ECDSA SSH key. - ellipticCertificate, _, err := cert.CreateEllipticCertificate("foo", ssh.UserCert) + ellipticCertificate, _, err := cert.CreateTestECDSACertificate("foo", ssh.UserCert) require.NoError(t, err) keyRing.Cert = ssh.MarshalAuthorizedKey(ellipticCertificate) @@ -246,7 +246,7 @@ func TestCheckKeyFIPS(t *testing.T) { keyRing := auth.makeSignedKeyRing(t, idx, false) // Swap out the key with a ECDSA SSH key. - ellipticCertificate, _, err := cert.CreateEllipticCertificate("foo", ssh.UserCert) + ellipticCertificate, _, err := cert.CreateTestECDSACertificate("foo", ssh.UserCert) require.NoError(t, err) keyRing.Cert = ssh.MarshalAuthorizedKey(ellipticCertificate) diff --git a/lib/client/local_proxy_middleware_test.go b/lib/client/local_proxy_middleware_test.go index bc32ab4b16e32..cfb79e335601e 100644 --- a/lib/client/local_proxy_middleware_test.go +++ b/lib/client/local_proxy_middleware_test.go @@ -29,8 +29,8 @@ import ( "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/client" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/tlsca" ) @@ -120,7 +120,7 @@ func newMockCertIssuer(t *testing.T, clock clockwork.Clock) *mockCertIssuer { } func (c *mockCertIssuer) initCA(t *testing.T) { - priv, err := native.GeneratePrivateKey() + priv, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) cert, err := tlsca.GenerateSelfSignedCAWithConfig(tlsca.GenerateCAConfig{ @@ -147,7 +147,7 @@ func (c *mockCertIssuer) IssueCert(ctx context.Context) (tls.Certificate, error) return tls.Certificate{}, trace.Wrap(c.issueErr) } - priv, err := native.GeneratePrivateKey() + priv, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.ECDSAP256) if err != nil { return tls.Certificate{}, trace.Wrap(err) } diff --git a/lib/cryptosuites/internal/rsa/rsa.go b/lib/cryptosuites/internal/rsa/rsa.go new file mode 100644 index 0000000000000..2203bd22bf05e --- /dev/null +++ b/lib/cryptosuites/internal/rsa/rsa.go @@ -0,0 +1,129 @@ +// Teleport +// Copyright (C) 2023 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package rsa + +import ( + "context" + "crypto/rand" + "crypto/rsa" + "log/slog" + "sync" + "testing" + "time" + + "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api/constants" +) + +var log = slog.With(teleport.ComponentKey, teleport.ComponentKeyGen) + +// precomputedKeys is a queue of cached keys ready for usage. +var precomputedKeys = make(chan *rsa.PrivateKey, 25) + +// startPrecomputeOnce is used to start the background task that precomputes key pairs. +var startPrecomputeOnce sync.Once + +// GenerateKey returns a newly generated RSA private key. +func GenerateKey() (*rsa.PrivateKey, error) { + return getOrGenerateRSAPrivateKey() +} + +func getOrGenerateRSAPrivateKey() (*rsa.PrivateKey, error) { + select { + case k := <-precomputedKeys: + return k, nil + default: + rsaKeyPair, err := generateRSAPrivateKey() + if err != nil { + return nil, err + } + return rsaKeyPair, nil + } +} + +func generateRSAPrivateKey() (*rsa.PrivateKey, error) { + //nolint:forbidigo // This is the one function allowed to generate RSA keys. + return rsa.GenerateKey(rand.Reader, constants.RSAKeySize) +} + +func precomputeKeys() { + const backoff = time.Second * 30 + for { + rsaPrivateKey, err := generateRSAPrivateKey() + if err != nil { + log.ErrorContext(context.Background(), "Failed to precompute key pair, retrying (this might be a bug).", + slog.Any("error", err), slog.Duration("backoff", backoff)) + time.Sleep(backoff) + } + + precomputedKeys <- rsaPrivateKey + } +} + +func precomputeTestKeys() { + generatedTestKeys := generateTestKeys() + keysToReuse := make([]*rsa.PrivateKey, 0, testKeysNumber) + for range testKeysNumber { + k := <-generatedTestKeys + precomputedKeys <- k + keysToReuse = append(keysToReuse, k) + } + for { + for _, k := range keysToReuse { + precomputedKeys <- k + } + } +} + +// testKeysNumber is the number of RSA keys generated in tests. +const testKeysNumber = 25 + +func generateTestKeys() <-chan *rsa.PrivateKey { + generatedTestKeys := make(chan *rsa.PrivateKey, testKeysNumber) + for range testKeysNumber { + // Generate each key in a separate goroutine to take advantage of + // multiple cores if possible. + go func() { + private, err := generateRSAPrivateKey() + if err != nil { + // Use only in tests. Safe to panic. + panic(err) + } + generatedTestKeys <- private + }() + } + return generatedTestKeys +} + +// PrecomputeKeys sets this package into a mode where a small backlog of keys are +// computed in advance. This should only be enabled if large spikes in key computation +// are expected (e.g. in auth/proxy services). Safe to double-call. +func PrecomputeKeys() { + startPrecomputeOnce.Do(func() { + go precomputeKeys() + }) +} + +// PrecomputeTestKeys generates a fixed number of RSA keys and reuses them to +// reduce CPU usage. This method should only be in tests. Safe to call multiple +// times. This function takes *testing.M so it can only be used from TestMain in +// tests. +func PrecomputeTestKeys(_ *testing.M) { + startPrecomputeOnce.Do(func() { + go precomputeTestKeys() + }) +} diff --git a/lib/cryptosuites/internal/rsa/rsa_test.go b/lib/cryptosuites/internal/rsa/rsa_test.go new file mode 100644 index 0000000000000..15bbf508f37d4 --- /dev/null +++ b/lib/cryptosuites/internal/rsa/rsa_test.go @@ -0,0 +1,36 @@ +// Teleport +// Copyright (C) 2023 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package rsa + +import ( + "testing" + "time" +) + +// TestPrecomputeMode verifies that package enters precompute mode when +// PrecomputeKeys is called. +func TestPrecomputeMode(t *testing.T) { + t.Parallel() + + PrecomputeKeys() + + select { + case <-precomputedKeys: + case <-time.After(time.Second * 10): + t.Fatal("Key precompute routine failed to start.") + } +} diff --git a/lib/cryptosuites/precompute.go b/lib/cryptosuites/precompute.go new file mode 100644 index 0000000000000..6e25378f9eaf6 --- /dev/null +++ b/lib/cryptosuites/precompute.go @@ -0,0 +1,38 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package cryptosuites + +import ( + "testing" + + "github.com/gravitational/teleport/lib/cryptosuites/internal/rsa" +) + +// PrecomputeKeys sets this package into a mode where a small backlog of RSA keys are +// computed in advance. This should only be enabled if large spikes in RSA key +// computation are expected (e.g. in auth/proxy services when the legacy suite +// is configured). Safe to double-call. +func PrecomputeRSAKeys() { + rsa.PrecomputeKeys() +} + +// PrecomputeRSATestKeys may be called from TestMain to set this package into a +// mode where it will precompute a fixed number of RSA keys and reuse them to +// save on CPU usage. +func PrecomputeRSATestKeys(m *testing.M) { + rsa.PrecomputeTestKeys(m) +} diff --git a/lib/cryptosuites/suites.go b/lib/cryptosuites/suites.go index 6d8d509b74952..641c53ce1c8ac 100644 --- a/lib/cryptosuites/suites.go +++ b/lib/cryptosuites/suites.go @@ -32,7 +32,8 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" - "github.com/gravitational/teleport/lib/auth/native" + "github.com/gravitational/teleport/api/utils/keys" + internalrsa "github.com/gravitational/teleport/lib/cryptosuites/internal/rsa" ) const defaultSuite = types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_LEGACY @@ -76,6 +77,9 @@ const ( // SPIFFECAJWT represents the JWT key for the spiffe CA. SPIFFECAJWT + // OktaCAJWT represents the JWT key for the Okta CA. + OktaCAJWT + // ProxyToDatabaseAgent represents keys used by the Proxy to dial the // Database agent over a reverse tunnel. ProxyToDatabaseAgent @@ -105,10 +109,8 @@ const ( // BotSVID represents a key used for a SPIFFE SVID generated by tbot. BotSVID - // OktaCAJWT represents the JWT key for the Okta CA. - OktaCAJWT - - // TODO(nklaassen): define remaining key purposes. + // EC2InstanceConnect is a key used for the EC2 Instance Connect service. + EC2InstanceConnect // keyPurposeMax is 1 greater than the last valid key purpose, used to test that all values less than this // are valid for each suite. @@ -179,7 +181,8 @@ var ( // never restricted algorithm support. ProxyToDatabaseAgent: RSA2048, ProxyKubeClient: RSA2048, - // TODO(nklaassen): define remaining key purposes. + // EC2InstanceConnect has always used Ed25519 by default. + EC2InstanceConnect: Ed25519, } // balancedV1 strikes a balance between security, compatibility, and @@ -209,7 +212,7 @@ var ( BotSVID: ECDSAP256, ProxyToDatabaseAgent: ECDSAP256, ProxyKubeClient: ECDSAP256, - // TODO(nklaassen): define remaining key purposes. + EC2InstanceConnect: Ed25519, } // fipsv1 is an algorithm suite tailored for FIPS compliance. It is based on @@ -239,7 +242,7 @@ var ( BotSVID: ECDSAP256, ProxyToDatabaseAgent: ECDSAP256, ProxyKubeClient: ECDSAP256, - // TODO(nklaassen): define remaining key purposes. + EC2InstanceConnect: ECDSAP256, } // hsmv1 in an algorithm suite tailored for clusters using an HSM or KMS @@ -271,7 +274,7 @@ var ( BotSVID: ECDSAP256, ProxyToDatabaseAgent: ECDSAP256, ProxyKubeClient: ECDSAP256, - // TODO(nklaassen): define remaining key purposes. + EC2InstanceConnect: Ed25519, } allSuites = map[types.SignatureAlgorithmSuite]suite{ @@ -421,8 +424,19 @@ func GenerateKeyWithAlgorithm(alg Algorithm) (crypto.Signer, error) { } } +// GeneratePrivateKeyWithAlgorithm is exactly like [GenerateKeyWithAlgorithm] +// but wraps the returned key in a [*keys.PrivateKey] for convenience. +func GeneratePrivateKeyWithAlgorithm(alg Algorithm) (*keys.PrivateKey, error) { + key, err := GenerateKeyWithAlgorithm(alg) + if err != nil { + return nil, trace.Wrap(err) + } + privateKey, err := keys.NewSoftwarePrivateKey(key) + return privateKey, trace.Wrap(err) +} + func generateRSA2048() (*rsa.PrivateKey, error) { - key, err := native.GenerateRSAPrivateKey() + key, err := internalrsa.GenerateKey() return key, trace.Wrap(err) } diff --git a/lib/devicetrust/challenge/challenge_test.go b/lib/devicetrust/challenge/challenge_test.go index 01e25c014b4c0..e78443420ed5d 100644 --- a/lib/devicetrust/challenge/challenge_test.go +++ b/lib/devicetrust/challenge/challenge_test.go @@ -17,72 +17,43 @@ package challenge_test import ( - "crypto" - "crypto/ecdsa" - "crypto/ed25519" - "crypto/elliptic" - "crypto/rand" - "crypto/rsa" "testing" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/devicetrust/challenge" ) func TestSignAndVerify(t *testing.T) { - ecKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - t.Fatalf("GenerateKey failed: %v", err) - } - rsaKey, err := rsa.GenerateKey(rand.Reader, 2048 /* bits */) - if err != nil { - t.Fatalf("GenerateKey failed: %v", err) - } - edPub, edPriv, err := ed25519.GenerateKey(rand.Reader) - if err != nil { - t.Fatalf("GenerateKey failed: %v", err) - } + for _, algo := range []cryptosuites.Algorithm{ + cryptosuites.RSA2048, + cryptosuites.ECDSAP256, + cryptosuites.Ed25519, + } { + t.Run(algo.String(), func(t *testing.T) { + t.Parallel() - tests := []struct { - name string - signer crypto.Signer - pubKey crypto.PublicKey - }{ - { - name: "ecdsa key", - signer: ecKey, - pubKey: ecKey.Public(), - }, - { - name: "rsa key", - signer: rsaKey, - pubKey: rsaKey.Public(), - }, - { - name: "ed25519 key", - signer: edPriv, - pubKey: edPub, - }, - } - for _, test := range tests { - t.Run(test.name, func(t *testing.T) { chal, err := challenge.New() if err != nil { t.Fatalf("New failed: %v", err) } - sig, err := challenge.Sign(chal, test.signer) + signer, err := cryptosuites.GenerateKeyWithAlgorithm(algo) + require.NoError(t, err) + sig, err := challenge.Sign(chal, signer) if err != nil { t.Fatalf("Sign failed: %v", err) } // Verify correct challenge signature. - if err := challenge.Verify(chal, sig, test.pubKey); err != nil { + if err := challenge.Verify(chal, sig, signer.Public()); err != nil { t.Errorf("Verify returned err=%v, want nil", err) } // Verify bad challenge signature. sig = []byte("invalid sig") - if err := challenge.Verify(chal, sig, test.pubKey); err == nil { + if err := challenge.Verify(chal, sig, signer.Public()); err == nil { t.Error("Verify returned nil err, want non-nil") } }) diff --git a/lib/gcp/token_validator_test.go b/lib/gcp/token_validator_test.go index 48e352743f39b..7dcc139f3e61c 100644 --- a/lib/gcp/token_validator_test.go +++ b/lib/gcp/token_validator_test.go @@ -20,8 +20,7 @@ package gcp import ( "context" - "crypto/rand" - "crypto/rsa" + "crypto" "encoding/json" "net/http" "net/http/httptest" @@ -32,17 +31,20 @@ import ( "github.com/go-jose/go-jose/v3/jwt" "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/cryptosuites" ) type fakeIDP struct { - t *testing.T - signer jose.Signer - privateKey *rsa.PrivateKey - server *httptest.Server + t *testing.T + signer jose.Signer + publicKey crypto.PublicKey + server *httptest.Server } func newFakeIDP(t *testing.T) *fakeIDP { - privateKey, err := rsa.GenerateKey(rand.Reader, 2048) + // GCP uses RSA, prefer to test with it. + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) require.NoError(t, err) signer, err := jose.NewSigner( @@ -52,9 +54,9 @@ func newFakeIDP(t *testing.T) *fakeIDP { require.NoError(t, err) f := &fakeIDP{ - signer: signer, - privateKey: privateKey, - t: t, + signer: signer, + publicKey: privateKey.Public(), + t: t, } providerMux := http.NewServeMux() @@ -106,7 +108,7 @@ func (f *fakeIDP) handleJWKSEndpoint(w http.ResponseWriter, r *http.Request) { jwks := jose.JSONWebKeySet{ Keys: []jose.JSONWebKey{ { - Key: &f.privateKey.PublicKey, + Key: f.publicKey, }, }, } diff --git a/lib/githubactions/token_validator_test.go b/lib/githubactions/token_validator_test.go index 1d7ab775af963..d79475597f321 100644 --- a/lib/githubactions/token_validator_test.go +++ b/lib/githubactions/token_validator_test.go @@ -20,8 +20,7 @@ package githubactions import ( "context" - "crypto/rand" - "crypto/rsa" + "crypto" "encoding/json" "net/http" "net/http/httptest" @@ -32,19 +31,22 @@ import ( "github.com/go-jose/go-jose/v3/jwt" "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/cryptosuites" ) type fakeIDP struct { t *testing.T signer jose.Signer - privateKey *rsa.PrivateKey + publicKey crypto.PublicKey server *httptest.Server entepriseSlug string ghesMode bool } func newFakeIDP(t *testing.T, ghesMode bool, enterpriseSlug string) *fakeIDP { - privateKey, err := rsa.GenerateKey(rand.Reader, 2048) + // Github uses RSA2048, prefer to test with it. + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) require.NoError(t, err) signer, err := jose.NewSigner( @@ -56,7 +58,7 @@ func newFakeIDP(t *testing.T, ghesMode bool, enterpriseSlug string) *fakeIDP { f := &fakeIDP{ signer: signer, ghesMode: ghesMode, - privateKey: privateKey, + publicKey: privateKey.Public(), t: t, entepriseSlug: enterpriseSlug, } @@ -142,7 +144,7 @@ func (f *fakeIDP) handleJWKSEndpoint(w http.ResponseWriter, r *http.Request) { jwks := jose.JSONWebKeySet{ Keys: []jose.JSONWebKey{ { - Key: &f.privateKey.PublicKey, + Key: f.publicKey, }, }, } diff --git a/lib/gitlab/token_validator_test.go b/lib/gitlab/token_validator_test.go index 13a194b1ead01..d6163b2e0702b 100644 --- a/lib/gitlab/token_validator_test.go +++ b/lib/gitlab/token_validator_test.go @@ -20,8 +20,7 @@ package gitlab import ( "context" - "crypto/rand" - "crypto/rsa" + "crypto" "encoding/json" "net/http" "net/http/httptest" @@ -35,18 +34,19 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/services" ) type fakeIDP struct { - t *testing.T - signer jose.Signer - privateKey *rsa.PrivateKey - server *httptest.Server + t *testing.T + signer jose.Signer + publicKey crypto.PublicKey + server *httptest.Server } func newFakeIDP(t *testing.T) *fakeIDP { - privateKey, err := rsa.GenerateKey(rand.Reader, 2048) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) require.NoError(t, err) signer, err := jose.NewSigner( @@ -56,9 +56,9 @@ func newFakeIDP(t *testing.T) *fakeIDP { require.NoError(t, err) f := &fakeIDP{ - signer: signer, - privateKey: privateKey, - t: t, + signer: signer, + publicKey: privateKey.Public(), + t: t, } providerMux := http.NewServeMux() @@ -112,7 +112,7 @@ func (f *fakeIDP) handleJWKSEndpoint(w http.ResponseWriter, r *http.Request) { jwks := jose.JSONWebKeySet{ Keys: []jose.JSONWebKey{ { - Key: &f.privateKey.PublicKey, + Key: f.publicKey, }, }, } diff --git a/lib/integrations/awsoidc/eice_sendsshpublickey.go b/lib/integrations/awsoidc/eice_sendsshpublickey.go index f4b74009e2c0b..40b0978f43b09 100644 --- a/lib/integrations/awsoidc/eice_sendsshpublickey.go +++ b/lib/integrations/awsoidc/eice_sendsshpublickey.go @@ -24,8 +24,6 @@ import ( "github.com/aws/aws-sdk-go-v2/service/ec2instanceconnect" "github.com/gravitational/trace" "golang.org/x/crypto/ssh" - - "github.com/gravitational/teleport/lib/auth/native" ) // EICESendSSHPublicKeyClient describes the required methods to send an SSH Public Key to @@ -62,6 +60,9 @@ type SendSSHPublicKeyToEC2Request struct { // EC2SSHLoginUser is the OS user to use when the user wants SSH access. EC2SSHLoginUser string + + // PublicKey is the SSH public key to send. + PublicKey ssh.PublicKey } // CheckAndSetDefaults checks if the required fields are present. @@ -74,55 +75,37 @@ func (r *SendSSHPublicKeyToEC2Request) CheckAndSetDefaults() error { return trace.BadParameter("ec2 ssh login user is required") } + if r.PublicKey == nil { + return trace.BadParameter("SSH public key is required") + } + return nil } // SendSSHPublicKeyToEC2 sends an SSH Public Key to a target EC2 Instance. // This key will be removed by AWS after 60 seconds and can only be used to authenticate the EC2SSHLoginUser. // An [ssh.Signer] is then returned and can be used to access the host. -func SendSSHPublicKeyToEC2(ctx context.Context, clt EICESendSSHPublicKeyClient, req SendSSHPublicKeyToEC2Request) (ssh.Signer, error) { +func SendSSHPublicKeyToEC2(ctx context.Context, clt EICESendSSHPublicKeyClient, req SendSSHPublicKeyToEC2Request) error { if err := req.CheckAndSetDefaults(); err != nil { - return nil, trace.Wrap(err) + return trace.Wrap(err) } - - sshSigner, err := sendSSHPublicKey(ctx, clt, req) - if err != nil { - return nil, trace.Wrap(err) + if err := sendSSHPublicKey(ctx, clt, req); err != nil { + return trace.Wrap(err) } - - return sshSigner, nil + return nil } // sendSSHPublicKey creates a new Private Key and uploads the Public to the ec2 instance. // This key will be removed by AWS after 60 seconds and can only be used to authenticate the EC2SSHLoginUser. // More information: https://docs.aws.amazon.com/ec2-instance-connect/latest/APIReference/API_SendSSHPublicKey.html -func sendSSHPublicKey(ctx context.Context, clt EICESendSSHPublicKeyClient, req SendSSHPublicKeyToEC2Request) (ssh.Signer, error) { - pubKey, privKey, err := native.GenerateEICEKey() - if err != nil { - return nil, trace.Wrap(err) - } - - publicKey, err := ssh.NewPublicKey(pubKey) - if err != nil { - return nil, trace.Wrap(err) - } - - pubKeySSH := string(ssh.MarshalAuthorizedKey(publicKey)) - _, err = clt.SendSSHPublicKey(ctx, +func sendSSHPublicKey(ctx context.Context, clt EICESendSSHPublicKeyClient, req SendSSHPublicKeyToEC2Request) error { + pubKeySSH := string(ssh.MarshalAuthorizedKey(req.PublicKey)) + _, err := clt.SendSSHPublicKey(ctx, &ec2instanceconnect.SendSSHPublicKeyInput{ InstanceId: &req.InstanceID, InstanceOSUser: &req.EC2SSHLoginUser, SSHPublicKey: &pubKeySSH, }, ) - if err != nil { - return nil, trace.Wrap(err) - } - - sshSigner, err := ssh.NewSignerFromKey(privKey) - if err != nil { - return nil, trace.Wrap(err) - } - - return sshSigner, nil + return trace.Wrap(err) } diff --git a/lib/integrations/awsoidc/eice_sendsshpublickey_test.go b/lib/integrations/awsoidc/eice_sendsshpublickey_test.go index 67d3fa2bdadb5..2402cec117fff 100644 --- a/lib/integrations/awsoidc/eice_sendsshpublickey_test.go +++ b/lib/integrations/awsoidc/eice_sendsshpublickey_test.go @@ -27,6 +27,8 @@ import ( "github.com/gravitational/trace" "github.com/stretchr/testify/require" "golang.org/x/crypto/ssh" + + "github.com/gravitational/teleport/lib/cryptosuites" ) func TestSendSSHPublicKeyRequest(t *testing.T) { @@ -91,15 +93,19 @@ func TestSendSSHPublicKeyToEC2(t *testing.T) { m := &mockSendSSHPublicKeyClient{} - sshSigner, err := SendSSHPublicKeyToEC2(ctx, m, SendSSHPublicKeyToEC2Request{ + key, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.Ed25519) + require.NoError(t, err) + sshSigner, err := ssh.NewSignerFromSigner(key) + require.NoError(t, err) + + err = SendSSHPublicKeyToEC2(ctx, m, SendSSHPublicKeyToEC2Request{ InstanceID: "id-123", EC2SSHLoginUser: "root", + PublicKey: sshSigner.PublicKey(), }) require.NoError(t, err) - require.NotNil(t, sshSigner) sshPublicKeyFromSigner := string(ssh.MarshalAuthorizedKey(sshSigner.PublicKey())) - require.Equal(t, sshPublicKeyFromSigner, m.sshKeySent) require.Equal(t, "root", m.sshForUserSent) } diff --git a/lib/kubernetestoken/token_validator_test.go b/lib/kubernetestoken/token_validator_test.go index 10368606e4284..51df225370c22 100644 --- a/lib/kubernetestoken/token_validator_test.go +++ b/lib/kubernetestoken/token_validator_test.go @@ -20,8 +20,6 @@ package kubernetestoken import ( "context" - "crypto/rand" - "crypto/rsa" "encoding/json" "testing" "time" @@ -40,6 +38,7 @@ import ( ctest "k8s.io/client-go/testing" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/cryptosuites" ) var userGroups = []string{"system:serviceaccounts", "system:serviceaccounts:namespace", "system:authenticated"} @@ -286,10 +285,10 @@ func Test_kubernetesSupportsBoundTokens(t *testing.T) { } func testSigner(t *testing.T) ([]byte, jose.Signer) { - key, err := rsa.GenerateKey(rand.Reader, 2048) + key, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) signer, err := jose.NewSigner( - jose.SigningKey{Algorithm: jose.RS256, Key: key}, + jose.SigningKey{Algorithm: jose.ES256, Key: key}, (&jose.SignerOptions{}). WithType("JWT"). WithHeader("kid", "foo"), @@ -300,7 +299,7 @@ func testSigner(t *testing.T) ([]byte, jose.Signer) { { Key: key.Public(), Use: "sig", - Algorithm: string(jose.RS256), + Algorithm: string(jose.ES256), KeyID: "foo", }, }} diff --git a/lib/auth/native/boring.go b/lib/modules/boring.go similarity index 98% rename from lib/auth/native/boring.go rename to lib/modules/boring.go index 0c4a8dfc30ede..afc7588f8306d 100644 --- a/lib/auth/native/boring.go +++ b/lib/modules/boring.go @@ -16,7 +16,7 @@ //go:build boringcrypto -package native +package modules import "crypto/boring" diff --git a/lib/modules/modules.go b/lib/modules/modules.go index 69cb6704f8c9c..a93b359c3ac09 100644 --- a/lib/modules/modules.go +++ b/lib/modules/modules.go @@ -37,7 +37,6 @@ import ( "github.com/gravitational/teleport/api/types/accesslist" "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/entitlements" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/automaticupgrades" "github.com/gravitational/teleport/lib/tlsca" ) @@ -407,7 +406,7 @@ func (p *defaultModules) SetFeatures(f Features) { } func (p *defaultModules) IsBoringBinary() bool { - return native.IsBoringBinary() + return IsBoringBinary() } // AttestHardwareKey attests a hardware key. diff --git a/lib/auth/native/notboring.go b/lib/modules/notboring.go similarity index 85% rename from lib/auth/native/notboring.go rename to lib/modules/notboring.go index 3fa57fb55e5cb..36cecbce41d72 100644 --- a/lib/auth/native/notboring.go +++ b/lib/modules/notboring.go @@ -16,12 +16,9 @@ //go:build !boringcrypto -package native +package modules // IsBoringBinary checks if the binary was compiled with BoringCrypto. -// -// The boringcrypto GOEXPERIMENT always sets the boringcrypto build tag, so if -// this is compiled in, we're not using BoringCrypto. func IsBoringBinary() bool { return false } diff --git a/lib/multiplexer/multiplexer_test.go b/lib/multiplexer/multiplexer_test.go index 588d98a4da082..8a1d8c0cc4b79 100644 --- a/lib/multiplexer/multiplexer_test.go +++ b/lib/multiplexer/multiplexer_test.go @@ -20,8 +20,6 @@ package multiplexer import ( "context" - "crypto/rand" - "crypto/rsa" "crypto/tls" "crypto/x509" "crypto/x509/pkix" @@ -45,10 +43,9 @@ import ( "google.golang.org/grpc" "google.golang.org/grpc/credentials" - "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/keys" - "github.com/gravitational/teleport/lib/auth/native" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/fixtures" "github.com/gravitational/teleport/lib/httplib" "github.com/gravitational/teleport/lib/jwt" @@ -66,7 +63,7 @@ func TestMain(m *testing.M) { // TestMux tests multiplexing protocols // using the same listener. func TestMux(t *testing.T) { - _, signer, err := cert.CreateCertificate("foo", ssh.HostCert) + _, signer, err := cert.CreateTestEd25519Certificate("foo", ssh.HostCert) require.NoError(t, err) // TestMux tests basic use case of multiplexing TLS @@ -736,22 +733,22 @@ func TestMux(t *testing.T) { certPool.AppendCertsFromPEM(caCert) // Sign server certificate. - serverRSAKey, err := native.GenerateRSAPrivateKey() + serverKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) serverPEM, err := ca.GenerateCertificate(tlsca.CertificateRequest{ Subject: pkix.Name{CommonName: "localhost"}, - PublicKey: serverRSAKey.Public(), + PublicKey: serverKey.Public(), NotAfter: time.Now().Add(time.Hour), DNSNames: []string{"127.0.0.1"}, }) require.NoError(t, err) - serverKeyPEM, err := keys.MarshalPrivateKey(serverRSAKey) + serverKeyPEM, err := keys.MarshalPrivateKey(serverKey) require.NoError(t, err) serverCert, err := tls.X509KeyPair(serverPEM, serverKeyPEM) require.NoError(t, err) // Sign client certificate with database access identity. - clientRSAKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + clientKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) subject, err := (&tlsca.Identity{ Username: "alice", @@ -763,11 +760,11 @@ func TestMux(t *testing.T) { require.NoError(t, err) clientPEM, err := ca.GenerateCertificate(tlsca.CertificateRequest{ Subject: subject, - PublicKey: clientRSAKey.Public(), + PublicKey: clientKey.Public(), NotAfter: time.Now().Add(time.Hour), }) require.NoError(t, err) - clientKeyPEM, err := keys.MarshalPrivateKey(clientRSAKey) + clientKeyPEM, err := keys.MarshalPrivateKey(clientKey) require.NoError(t, err) clientCert, err := tls.X509KeyPair(clientPEM, clientKeyPEM) require.NoError(t, err) @@ -1179,7 +1176,7 @@ func getTestCertCAsGetterAndSigner(t testing.TB, clusterName string) ([]byte, Ce mockCAGetter := func(ctx context.Context, id types.CertAuthID, loadKeys bool) (types.CertAuthority, error) { return ca, nil } - proxyPriv, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + proxyPriv, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) // Create host identity with role "Proxy" diff --git a/lib/proxy/peer/helpers_test.go b/lib/proxy/peer/helpers_test.go index 647ffbcea0277..f9a7b562c5fff 100644 --- a/lib/proxy/peer/helpers_test.go +++ b/lib/proxy/peer/helpers_test.go @@ -23,7 +23,6 @@ import ( "crypto/tls" "crypto/x509" "crypto/x509/pkix" - "encoding/pem" "net" "sync/atomic" "testing" @@ -37,8 +36,9 @@ import ( clientapi "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" apiutils "github.com/gravitational/teleport/api/utils" + "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/lib/auth/authclient" - "github.com/gravitational/teleport/lib/auth/native" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/fixtures" "github.com/gravitational/teleport/lib/tlsca" @@ -156,7 +156,7 @@ func certFromIdentity(t *testing.T, ca *tlsca.CertAuthority, ident tlsca.Identit subj, err := ident.Subject() require.NoError(t, err) - privateKey, err := native.GenerateRSAPrivateKey() + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) clock := clockwork.NewRealClock() @@ -171,7 +171,8 @@ func certFromIdentity(t *testing.T, ca *tlsca.CertAuthority, ident tlsca.Identit certBytes, err := ca.GenerateCertificate(request) require.NoError(t, err) - keyPEM := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(privateKey)}) + keyPEM, err := keys.MarshalPrivateKey(privateKey) + require.NoError(t, err) cert, err := tls.X509KeyPair(certBytes, keyPEM) require.NoError(t, err) diff --git a/lib/reversetunnel/cache.go b/lib/reversetunnel/cache.go index 2087ddd218684..afcbd9355153c 100644 --- a/lib/reversetunnel/cache.go +++ b/lib/reversetunnel/cache.go @@ -32,7 +32,6 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/utils/sshutils" "github.com/gravitational/teleport/lib/auth/authclient" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/utils" @@ -94,12 +93,12 @@ func (c *certificateCache) generateHostCert(ctx context.Context, principals []st } if _, isRSA := hostKey.Public().(*rsa.PublicKey); isRSA { - // Ensure the native package is precomputing RSA keys if we ever - // generate one. [native.PrecomputeKeys] is idempotent. + // Start precomputing RSA keys if we ever generate one. + // [cryptosuites.PrecomputeRSAKeys] is idempotent. // Doing this lazily easily handles changing signature algorithm suites // and won't start precomputing keys if they are never needed (a major // benefit in tests). - native.PrecomputeKeys() + cryptosuites.PrecomputeRSAKeys() } sshPub, err := ssh.NewPublicKey(hostKey.Public()) diff --git a/lib/service/certreloader_test.go b/lib/service/certreloader_test.go index e6b5faeb14172..0c40c91831687 100644 --- a/lib/service/certreloader_test.go +++ b/lib/service/certreloader_test.go @@ -30,7 +30,7 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport/lib/service/servicecfg" - "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/tlsca" ) func TestCertReloader(t *testing.T) { @@ -121,7 +121,7 @@ func TestCertReloader(t *testing.T) { // Update c0 key, and partially update c0 cert. key, crt := newCertKeyPair(t) write(t, certs[0].PrivateKey, key) - write(t, certs[0].Certificate, crt[0:1024]) + write(t, certs[0].Certificate, crt[0:len(crt)/2]) }, certsReloadErrorAssert: require.Error, certsAssert: func(t *testing.T, before []tls.Certificate, after []tls.Certificate) { @@ -225,7 +225,7 @@ func newCertKeyPair(t *testing.T) ([]byte, []byte) { Organization: []string{"teleport"}, CommonName: "teleport", } - key, crt, err := utils.GenerateSelfSignedSigningCert(entity, nil, time.Hour) + key, crt, err := tlsca.GenerateSelfSignedCA(entity, nil, time.Hour) require.NoError(t, err) return key, crt } diff --git a/lib/services/authority.go b/lib/services/authority.go index b529c0c417920..74dec10149712 100644 --- a/lib/services/authority.go +++ b/lib/services/authority.go @@ -325,7 +325,7 @@ func (c HostCertParams) Check() error { type UserCertParams struct { // CASigner is the signer that will sign the public key of the user with the CA private key CASigner ssh.Signer - // PublicUserKey is the public key of the user + // PublicUserKey is the public key of the user in SSH authorized_keys format. PublicUserKey []byte // TTL defines how long a certificate is valid for TTL time.Duration diff --git a/lib/spacelift/token_validator_test.go b/lib/spacelift/token_validator_test.go index 22c4379c9c08e..551b90d37f10e 100644 --- a/lib/spacelift/token_validator_test.go +++ b/lib/spacelift/token_validator_test.go @@ -20,8 +20,7 @@ package spacelift import ( "context" - "crypto/rand" - "crypto/rsa" + "crypto" "encoding/json" "net/http" "net/http/httptest" @@ -33,17 +32,20 @@ import ( "github.com/go-jose/go-jose/v3/jwt" "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/cryptosuites" ) type fakeIDP struct { - t *testing.T - signer jose.Signer - privateKey *rsa.PrivateKey - server *httptest.Server + t *testing.T + signer jose.Signer + publicKey crypto.PublicKey + server *httptest.Server } func newFakeIDP(t *testing.T) *fakeIDP { - privateKey, err := rsa.GenerateKey(rand.Reader, 2048) + // Spacelift uses RSA, prefer to test with it. + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) require.NoError(t, err) signer, err := jose.NewSigner( @@ -53,9 +55,9 @@ func newFakeIDP(t *testing.T) *fakeIDP { require.NoError(t, err) f := &fakeIDP{ - signer: signer, - privateKey: privateKey, - t: t, + signer: signer, + publicKey: privateKey.Public(), + t: t, } providerMux := http.NewServeMux() @@ -121,7 +123,7 @@ func (f *fakeIDP) handleJWKSEndpoint(w http.ResponseWriter, r *http.Request) { jwks := jose.JSONWebKeySet{ Keys: []jose.JSONWebKey{ { - Key: &f.privateKey.PublicKey, + Key: f.publicKey, }, }, } diff --git a/lib/srv/alpnproxy/helpers_test.go b/lib/srv/alpnproxy/helpers_test.go index 19b0bebcee004..b4e9df20e83f0 100644 --- a/lib/srv/alpnproxy/helpers_test.go +++ b/lib/srv/alpnproxy/helpers_test.go @@ -20,12 +20,9 @@ package alpnproxy import ( "context" - "crypto/rand" - "crypto/rsa" "crypto/tls" "crypto/x509" "crypto/x509/pkix" - "encoding/pem" "fmt" "io" "net" @@ -39,8 +36,10 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/srv/alpnproxy/common" "github.com/gravitational/teleport/lib/tlsca" @@ -196,7 +195,7 @@ func mustGenCertSignedWithCA(t *testing.T, ca *tlsca.CertAuthority, opts ...sign subj, err := options.identity.Subject() require.NoError(t, err) - privateKey, err := rsa.GenerateKey(rand.Reader, 2048) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) tlsCert, err := ca.GenerateCertificate(tlsca.CertificateRequest{ @@ -208,8 +207,8 @@ func mustGenCertSignedWithCA(t *testing.T, ca *tlsca.CertAuthority, opts ...sign }) require.NoError(t, err) - keyRaw := x509.MarshalPKCS1PrivateKey(privateKey) - keyPEM := pem.EncodeToMemory(&pem.Block{Type: "PRIVATE KEY", Bytes: keyRaw}) + keyPEM, err := keys.MarshalPrivateKey(privateKey) + require.NoError(t, err) cert, err := tls.X509KeyPair(tlsCert, keyPEM) require.NoError(t, err) leaf, err := utils.TLSCertLeaf(cert) diff --git a/lib/srv/app/server_test.go b/lib/srv/app/server_test.go index 32932340f4d84..ee9c01accf1fb 100644 --- a/lib/srv/app/server_test.go +++ b/lib/srv/app/server_test.go @@ -55,7 +55,6 @@ import ( "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/authz" "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/events" @@ -73,7 +72,7 @@ import ( func TestMain(m *testing.M) { utils.InitLoggerForTests() - native.PrecomputeTestKeys(m) + cryptosuites.PrecomputeRSATestKeys(m) modules.SetInsecureTestMode(true) os.Exit(m.Run()) } diff --git a/lib/srv/authhandlers_test.go b/lib/srv/authhandlers_test.go index 750ebaf522770..78856817654a9 100644 --- a/lib/srv/authhandlers_test.go +++ b/lib/srv/authhandlers_test.go @@ -32,8 +32,8 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/wrappers" "github.com/gravitational/teleport/api/utils/sshutils" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/auth/testauthority" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/events/eventstest" "github.com/gravitational/teleport/lib/services" ) @@ -139,8 +139,7 @@ func TestRBAC(t *testing.T) { } // create User CA - userTA := testauthority.New() - userCAPriv, err := userTA.GeneratePrivateKey() + userCAPriv, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) userCA, err := types.NewCertAuthority(types.CertAuthoritySpecV2{ Type: types.UserCA, @@ -211,7 +210,7 @@ func TestRBAC(t *testing.T) { caSigner, err := ssh.NewSignerFromKey(userCAPriv) require.NoError(t, err) keygen := testauthority.New() - privateKey, err := native.GeneratePrivateKey() + privateKey, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) c, err := keygen.GenerateUserCert(services.UserCertParams{ @@ -243,8 +242,7 @@ func TestRBACJoinMFA(t *testing.T) { const username = "testuser" // create User CA - userTA := testauthority.New() - userCAPriv, err := userTA.GeneratePrivateKey() + userCAPriv, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) userCA, err := types.NewCertAuthority(types.CertAuthoritySpecV2{ Type: types.UserCA, @@ -381,15 +379,15 @@ func TestRBACJoinMFA(t *testing.T) { accessPoint.authPref = tt.authPref // create SSH certificate - caSigner, err := ssh.NewSignerFromKey(userCAPriv) + caSigner, err := ssh.NewSignerFromSigner(userCAPriv.Signer) require.NoError(t, err) - keygen := testauthority.New() - privateKey, err := native.GeneratePrivateKey() + privateKey, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) + keygen := testauthority.New() c, err := keygen.GenerateUserCert(services.UserCertParams{ CASigner: caSigner, - PublicUserKey: ssh.MarshalAuthorizedKey(privateKey.SSHPublicKey()), + PublicUserKey: privateKey.MarshalSSHPublicKey(), Username: username, AllowedLogins: []string{username}, Traits: wrappers.Traits{ diff --git a/lib/srv/db/access_test.go b/lib/srv/db/access_test.go index 30d4ef22c172a..37848ea294c8e 100644 --- a/lib/srv/db/access_test.go +++ b/lib/srv/db/access_test.go @@ -60,10 +60,10 @@ import ( "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/authz" clients "github.com/gravitational/teleport/lib/cloud" "github.com/gravitational/teleport/lib/cloud/mocks" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/defaults" libevents "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/events/eventstest" @@ -101,7 +101,7 @@ import ( func TestMain(m *testing.M) { utils.InitLoggerForTests() - native.PrecomputeTestKeys(m) + cryptosuites.PrecomputeRSATestKeys(m) modules.SetInsecureTestMode(true) registerTestSnowflakeEngine() registerTestElasticsearchEngine() diff --git a/lib/srv/forward/sshserver.go b/lib/srv/forward/sshserver.go index 8fd276932becf..7b2cf1b83fd3b 100644 --- a/lib/srv/forward/sshserver.go +++ b/lib/srv/forward/sshserver.go @@ -46,6 +46,7 @@ import ( "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/bpf" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/events" "github.com/gravitational/teleport/lib/integrations/awsoidc" "github.com/gravitational/teleport/lib/service/servicecfg" @@ -698,16 +699,27 @@ func (s *Server) sendSSHPublicKeyToTarget(ctx context.Context) (ssh.Signer, erro return nil, trace.BadParameter("failed to create an aws client to send ssh public key: %v", err) } - sshSigner, err := awsoidc.SendSSHPublicKeyToEC2(ctx, sendSSHClient, awsoidc.SendSSHPublicKeyToEC2Request{ + sshKey, err := cryptosuites.GenerateKey(ctx, + cryptosuites.GetCurrentSuiteFromAuthPreference(s.GetAccessPoint()), + cryptosuites.EC2InstanceConnect) + if err != nil { + return nil, trace.Wrap(err, "generating SSH key") + } + sshSigner, err := ssh.NewSignerFromSigner(sshKey) + if err != nil { + return nil, trace.Wrap(err, "creating SSH signer") + } + + if err := awsoidc.SendSSHPublicKeyToEC2(ctx, sendSSHClient, awsoidc.SendSSHPublicKeyToEC2Request{ InstanceID: awsInfo.InstanceID, EC2SSHLoginUser: s.identityContext.Login, - }) - if err != nil { + PublicKey: sshSigner.PublicKey(), + }); err != nil { return nil, trace.BadParameter("send ssh public key failed for instance %s: %v", awsInfo.InstanceID, err) } // This is the SSH Signer that the client must use to connect to the EC2. - // This signer generates trusted keys, because the public key was sent to the target EC2 host. + // This signer is trusted because the public key was sent to the target EC2 host. return sshSigner, nil } diff --git a/lib/srv/forward/sshserver_test.go b/lib/srv/forward/sshserver_test.go index c4f4700f8b65c..98e409e63b692 100644 --- a/lib/srv/forward/sshserver_test.go +++ b/lib/srv/forward/sshserver_test.go @@ -20,6 +20,7 @@ package forward import ( "context" + "crypto/ed25519" "crypto/rand" "errors" "os/user" @@ -30,7 +31,9 @@ import ( "golang.org/x/crypto/ssh" "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api/utils/keys" apisshutils "github.com/gravitational/teleport/api/utils/sshutils" + "github.com/gravitational/teleport/lib/fixtures" "github.com/gravitational/teleport/lib/srv" "github.com/gravitational/teleport/lib/sshutils" "github.com/gravitational/teleport/lib/utils" @@ -53,7 +56,7 @@ func TestSignersWithSHA1Fallback(t *testing.T) { assertSHA1Signer := func(t *testing.T, signer ssh.Signer) { require.Equal(t, ssh.CertAlgoRSAv01, signer.PublicKey().Type()) - // We should not be able to case the signer to ssh.AlgorithmSigner. + // We should not be able to cast the signer to ssh.AlgorithmSigner. // Otherwise, x/crypto will use SHA-2-512 for signing. _, ok := signer.(ssh.AlgorithmSigner) require.False(t, ok) @@ -70,13 +73,15 @@ func TestSignersWithSHA1Fallback(t *testing.T) { want func(t *testing.T, got []ssh.Signer) }{ { - name: "simple", + name: "RSA host certificate", signersCb: func(t *testing.T) []ssh.Signer { - signer, err := apisshutils.MakeTestSSHCA() + caSigner, err := apisshutils.MakeTestSSHCA() require.NoError(t, err) - cert, err := apisshutils.MakeRealHostCert(signer) + hostKey, err := keys.ParsePrivateKey(fixtures.PEMBytes["rsa"]) require.NoError(t, err) - return []ssh.Signer{cert} + hostCert, err := apisshutils.MakeRealHostCertWithKey(hostKey.Signer, caSigner) + require.NoError(t, err) + return []ssh.Signer{hostCert} }, want: func(t *testing.T, signers []ssh.Signer) { // We expect 2 certificates, order matters. @@ -86,11 +91,13 @@ func TestSignersWithSHA1Fallback(t *testing.T) { }, }, { - name: "public key only", + name: "RSA host public key", signersCb: func(t *testing.T) []ssh.Signer { - signer, err := apisshutils.MakeTestSSHCA() + hostKey, err := keys.ParsePrivateKey(fixtures.PEMBytes["rsa"]) + require.NoError(t, err) + hostSigner, err := ssh.NewSignerFromSigner(hostKey.Signer) require.NoError(t, err) - return []ssh.Signer{signer} + return []ssh.Signer{hostSigner} }, want: func(t *testing.T, signers []ssh.Signer) { // public key should not be copied @@ -98,6 +105,34 @@ func TestSignersWithSHA1Fallback(t *testing.T) { require.Equal(t, ssh.KeyAlgoRSA, signers[0].PublicKey().Type()) }, }, + { + name: "Ed25519 host certificate", + signersCb: func(t *testing.T) []ssh.Signer { + caSigner, err := apisshutils.MakeTestSSHCA() + require.NoError(t, err) + hostCert, err := apisshutils.MakeRealHostCert(caSigner) + require.NoError(t, err) + return []ssh.Signer{hostCert} + }, + want: func(t *testing.T, signers []ssh.Signer) { + require.Len(t, signers, 1) + require.Equal(t, ssh.CertAlgoED25519v01, signers[0].PublicKey().Type()) + }, + }, + { + name: "Ed25519 host key", + signersCb: func(t *testing.T) []ssh.Signer { + _, hostKey, err := ed25519.GenerateKey(rand.Reader) + require.NoError(t, err) + hostSigner, err := ssh.NewSignerFromSigner(hostKey) + require.NoError(t, err) + return []ssh.Signer{hostSigner} + }, + want: func(t *testing.T, signers []ssh.Signer) { + require.Len(t, signers, 1) + require.Equal(t, ssh.KeyAlgoED25519, signers[0].PublicKey().Type()) + }, + }, } for _, tt := range tests { diff --git a/lib/srv/transport/transportv1/transport_test.go b/lib/srv/transport/transportv1/transport_test.go index 22a5a82797092..e45dc31194d47 100644 --- a/lib/srv/transport/transportv1/transport_test.go +++ b/lib/srv/transport/transportv1/transport_test.go @@ -20,10 +20,6 @@ package transportv1 import ( "context" - "crypto/rand" - "crypto/rsa" - "crypto/x509" - "encoding/pem" "errors" "fmt" "io" @@ -48,6 +44,7 @@ import ( streamutils "github.com/gravitational/teleport/api/utils/grpc/stream" "github.com/gravitational/teleport/lib/agentless" "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/teleagent" "github.com/gravitational/teleport/lib/utils" @@ -834,13 +831,11 @@ func (s *sshServer) Stop() error { } func generateSigner(t *testing.T, keyring agent.Agent) ssh.Signer { - private, err := rsa.GenerateKey(rand.Reader, 2048) + private, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.Ed25519) require.NoError(t, err) - block := &pem.Block{ - Type: "RSA PRIVATE KEY", - Bytes: x509.MarshalPKCS1PrivateKey(private), - } + signer, err := ssh.NewSignerFromSigner(private) + require.NoError(t, err) require.NoError(t, keyring.Add(agent.AddedKey{ PrivateKey: private, @@ -848,10 +843,6 @@ func generateSigner(t *testing.T, keyring agent.Agent) ssh.Signer { LifetimeSecs: math.MaxUint32, })) - privatePEM := pem.EncodeToMemory(block) - signer, err := ssh.ParsePrivateKey(privatePEM) - require.NoError(t, err) - return signer } diff --git a/lib/sshutils/server_test.go b/lib/sshutils/server_test.go index 704164f3d003b..7b95d3ced55c0 100644 --- a/lib/sshutils/server_test.go +++ b/lib/sshutils/server_test.go @@ -43,7 +43,7 @@ func TestMain(m *testing.M) { func TestStartStop(t *testing.T) { t.Parallel() - _, signer, err := cert.CreateCertificate("foo", ssh.HostCert) + _, signer, err := cert.CreateTestEd25519Certificate("foo", ssh.HostCert) require.NoError(t, err) called := false @@ -95,7 +95,7 @@ func TestStartStop(t *testing.T) { func TestShutdown(t *testing.T) { t.Parallel() - _, signer, err := cert.CreateCertificate("foo", ssh.HostCert) + _, signer, err := cert.CreateTestEd25519Certificate("foo", ssh.HostCert) require.NoError(t, err) closeContext, cancel := context.WithCancel(context.TODO()) @@ -151,7 +151,7 @@ func TestShutdown(t *testing.T) { func TestConfigureCiphers(t *testing.T) { t.Parallel() - _, signer, err := cert.CreateCertificate("foo", ssh.HostCert) + _, signer, err := cert.CreateTestEd25519Certificate("foo", ssh.HostCert) require.NoError(t, err) fn := NewChanHandlerFunc(func(_ context.Context, _ *ConnectionContext, nch ssh.NewChannel) { @@ -200,13 +200,13 @@ func TestConfigureCiphers(t *testing.T) { func TestHostSignerFIPS(t *testing.T) { t.Parallel() - _, signer, err := cert.CreateCertificate("foo", ssh.HostCert) + _, signer, err := cert.CreateTestRSACertificate("foo", ssh.HostCert) require.NoError(t, err) - _, ellipticSigner, err := cert.CreateEllipticCertificate("foo", ssh.HostCert) + _, ellipticSigner, err := cert.CreateTestECDSACertificate("foo", ssh.HostCert) require.NoError(t, err) - _, ed25519Signer, err := cert.CreateEd25519Certificate("foo", ssh.HostCert) + _, ed25519Signer, err := cert.CreateTestEd25519Certificate("foo", ssh.HostCert) require.NoError(t, err) fn := NewChanHandlerFunc(func(_ context.Context, _ *ConnectionContext, nch ssh.NewChannel) { @@ -286,10 +286,10 @@ func pass(need string) PasswordFunc { func TestDynamicHostSigners(t *testing.T) { t.Parallel() - certFoo, signerFoo, err := cert.CreateCertificate("foo", ssh.HostCert) + certFoo, signerFoo, err := cert.CreateTestEd25519Certificate("foo", ssh.HostCert) require.NoError(t, err) - certBar, signerBar, err := cert.CreateCertificate("bar", ssh.HostCert) + certBar, signerBar, err := cert.CreateTestEd25519Certificate("bar", ssh.HostCert) require.NoError(t, err) var activeSigner atomic.Pointer[ssh.Signer] diff --git a/lib/tbot/tbot_test.go b/lib/tbot/tbot_test.go index 4104c9b95d705..0a4659246c1ba 100644 --- a/lib/tbot/tbot_test.go +++ b/lib/tbot/tbot_test.go @@ -50,7 +50,7 @@ import ( "github.com/gravitational/teleport/api/utils/sshutils" "github.com/gravitational/teleport/integration/helpers" "github.com/gravitational/teleport/lib/auth/authclient" - "github.com/gravitational/teleport/lib/auth/native" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/service" "github.com/gravitational/teleport/lib/service/servicecfg" @@ -68,7 +68,7 @@ import ( func TestMain(m *testing.M) { utils.InitLoggerForTests() - native.PrecomputeTestKeys(m) + cryptosuites.PrecomputeRSATestKeys(m) os.Exit(m.Run()) } diff --git a/lib/terraformcloud/token_validator_test.go b/lib/terraformcloud/token_validator_test.go index c879cfae73715..75541d77ec2e0 100644 --- a/lib/terraformcloud/token_validator_test.go +++ b/lib/terraformcloud/token_validator_test.go @@ -20,8 +20,7 @@ package terraformcloud import ( "context" - "crypto/rand" - "crypto/rsa" + "crypto" "encoding/json" "net/http" "net/http/httptest" @@ -32,18 +31,21 @@ import ( "github.com/go-jose/go-jose/v3/jwt" "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/cryptosuites" ) type fakeIDP struct { - t *testing.T - signer jose.Signer - privateKey *rsa.PrivateKey - server *httptest.Server - audience string + t *testing.T + signer jose.Signer + publicKey crypto.PublicKey + server *httptest.Server + audience string } func newFakeIDP(t *testing.T, audience string) *fakeIDP { - privateKey, err := rsa.GenerateKey(rand.Reader, 2048) + // Terraform Cloud uses RSA, prefer to test with it. + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) require.NoError(t, err) signer, err := jose.NewSigner( @@ -53,10 +55,10 @@ func newFakeIDP(t *testing.T, audience string) *fakeIDP { require.NoError(t, err) f := &fakeIDP{ - signer: signer, - privateKey: privateKey, - t: t, - audience: audience, + signer: signer, + publicKey: privateKey.Public(), + t: t, + audience: audience, } providerMux := http.NewServeMux() @@ -119,7 +121,7 @@ func (f *fakeIDP) handleJWKSEndpoint(w http.ResponseWriter, r *http.Request) { jwks := jose.JSONWebKeySet{ Keys: []jose.JSONWebKey{ { - Key: &f.privateKey.PublicKey, + Key: f.publicKey, }, }, } diff --git a/lib/tlsca/ca_test.go b/lib/tlsca/ca_test.go index d84dc20fdc71c..91b4db336e173 100644 --- a/lib/tlsca/ca_test.go +++ b/lib/tlsca/ca_test.go @@ -19,8 +19,6 @@ package tlsca import ( - "crypto/rand" - "crypto/rsa" "crypto/tls" "crypto/x509/pkix" "encoding/asn1" @@ -36,9 +34,9 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport" - "github.com/gravitational/teleport/api/constants" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/fixtures" ) @@ -86,7 +84,7 @@ func TestPrincipals(t *testing.T) { ca, err := test.createFunc() require.NoError(t, err) - privateKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) hostnames := []string{"localhost", "example.com"} @@ -122,7 +120,7 @@ func TestRenewableIdentity(t *testing.T) { ca, err := FromKeys([]byte(fixtures.TLSCACertPEM), []byte(fixtures.TLSCAKeyPEM)) require.NoError(t, err) - privateKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) identity := Identity{ @@ -159,7 +157,7 @@ func TestKubeExtensions(t *testing.T) { ca, err := FromKeys([]byte(fixtures.TLSCACertPEM), []byte(fixtures.TLSCAKeyPEM)) require.NoError(t, err) - privateKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) expires := clock.Now().Add(time.Hour) @@ -209,7 +207,7 @@ func TestDatabaseExtensions(t *testing.T) { ca, err := FromKeys([]byte(fixtures.TLSCACertPEM), []byte(fixtures.TLSCAKeyPEM)) require.NoError(t, err) - privateKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) expires := clock.Now().Add(time.Hour) @@ -254,7 +252,7 @@ func TestAzureExtensions(t *testing.T) { ca, err := FromKeys([]byte(fixtures.TLSCACertPEM), []byte(fixtures.TLSCAKeyPEM)) require.NoError(t, err) - privateKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) expires := clock.Now().Add(time.Hour) @@ -360,7 +358,7 @@ func TestGCPExtensions(t *testing.T) { ca, err := FromKeys([]byte(fixtures.TLSCACertPEM), []byte(fixtures.TLSCAKeyPEM)) require.NoError(t, err) - privateKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) expires := clock.Now().Add(time.Hour) diff --git a/lib/tpm/tpm_simulator_test.go b/lib/tpm/tpm_simulator_test.go index a71fce746569d..c84ab6d9b61ca 100644 --- a/lib/tpm/tpm_simulator_test.go +++ b/lib/tpm/tpm_simulator_test.go @@ -106,6 +106,7 @@ func TestWithSimulator(t *testing.T) { NotBefore: time.Now().Add(-time.Hour), NotAfter: time.Now().Add(time.Hour), } + //nolint:forbidigo // Generating large RSA key allowed for TPM simulator. caPrivKey, err := rsa.GenerateKey(rand.Reader, 4096) require.NoError(t, err) caBytes, err := x509.CreateCertificate( diff --git a/lib/utils/cert/certs.go b/lib/utils/cert/certs.go index cad4d986cb64d..47de43a21a42f 100644 --- a/lib/utils/cert/certs.go +++ b/lib/utils/cert/certs.go @@ -19,85 +19,40 @@ package cert import ( - "crypto" - "crypto/ecdsa" - "crypto/ed25519" - "crypto/elliptic" "crypto/rand" "time" "github.com/gravitational/trace" "golang.org/x/crypto/ssh" - "github.com/gravitational/teleport/lib/auth/native" + "github.com/gravitational/teleport/lib/cryptosuites" ) -// CreateCertificate creates a valid 2048-bit RSA certificate. -func CreateCertificate(principal string, certType uint32) (*ssh.Certificate, ssh.Signer, error) { - // Create RSA key for CA and certificate to be signed by CA. - caKey, err := native.GenerateRSAPrivateKey() - if err != nil { - return nil, nil, trace.Wrap(err) - } - key, err := native.GenerateRSAPrivateKey() - if err != nil { - return nil, nil, trace.Wrap(err) - } - - cert, certSigner, err := createCertificate(principal, certType, caKey, key) - if err != nil { - return nil, nil, trace.Wrap(err) - } - - return cert, certSigner, nil +// CreateTestRSACertificate creates a valid 2048-bit RSA certificate. +func CreateTestRSACertificate(principal string, certType uint32) (*ssh.Certificate, ssh.Signer, error) { + return createCertificate(principal, certType, cryptosuites.RSA2048) } -// CreateEllipticCertificate creates a valid ECDSA P-256 certificate. -func CreateEllipticCertificate(principal string, certType uint32) (*ssh.Certificate, ssh.Signer, error) { - // Create ECDSA key for CA and certificate to be signed by CA. - caKey, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - return nil, nil, trace.Wrap(err) - } - key, err := ecdsa.GenerateKey(elliptic.P256(), rand.Reader) - if err != nil { - return nil, nil, trace.Wrap(err) - } - - cert, certSigner, err := createCertificate(principal, certType, caKey, key) - if err != nil { - return nil, nil, trace.Wrap(err) - } - - return cert, certSigner, nil +// CreateTestECDSACertificate creates a valid ECDSA P-256 certificate. +func CreateTestECDSACertificate(principal string, certType uint32) (*ssh.Certificate, ssh.Signer, error) { + return createCertificate(principal, certType, cryptosuites.ECDSAP256) } -// CreateEd25519Certificate creates an Ed25519 certificate which should be +// CreateTestEd25519Certificate creates an Ed25519 certificate which should be // rejected in FIPS mode. -func CreateEd25519Certificate(principal string, certType uint32) (*ssh.Certificate, ssh.Signer, error) { - // Create Ed25519 key for CA and certificate to be signed by CA. - _, caKey, err := ed25519.GenerateKey(rand.Reader) - if err != nil { - return nil, nil, trace.Wrap(err) - } - _, key, err := ed25519.GenerateKey(rand.Reader) - if err != nil { - return nil, nil, trace.Wrap(err) - } - - cert, certSigner, err := createCertificate(principal, certType, caKey, key) - if err != nil { - return nil, nil, trace.Wrap(err) - } - - return cert, certSigner, nil +func CreateTestEd25519Certificate(principal string, certType uint32) (*ssh.Certificate, ssh.Signer, error) { + return createCertificate(principal, certType, cryptosuites.Ed25519) } // createCertificate creates a SSH certificate for the given key signed by the // given CA key. This function exists here to allow easy key generation for // some of the more core packages like "sshutils". -func createCertificate(principal string, certType uint32, caKey crypto.Signer, key crypto.Signer) (*ssh.Certificate, ssh.Signer, error) { +func createCertificate(principal string, certType uint32, algo cryptosuites.Algorithm) (*ssh.Certificate, ssh.Signer, error) { // Create CA. + caKey, err := cryptosuites.GenerateKeyWithAlgorithm(algo) + if err != nil { + return nil, nil, trace.Wrap(err) + } caPublicKey, err := ssh.NewPublicKey(caKey.Public()) if err != nil { return nil, nil, trace.Wrap(err) @@ -108,6 +63,10 @@ func createCertificate(principal string, certType uint32, caKey crypto.Signer, k } // Create key. + key, err := cryptosuites.GenerateKeyWithAlgorithm(algo) + if err != nil { + return nil, nil, trace.Wrap(err) + } publicKey, err := ssh.NewPublicKey(key.Public()) if err != nil { return nil, nil, trace.Wrap(err) diff --git a/lib/utils/certs.go b/lib/utils/certs.go index c2f3b96c5b482..88244491bb95c 100644 --- a/lib/utils/certs.go +++ b/lib/utils/certs.go @@ -30,9 +30,9 @@ import ( "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/api/utils/tlsutils" + "github.com/gravitational/teleport/lib/cryptosuites" ) // ParseKeyStorePEM parses signing key store from PEM encoded key pair @@ -62,16 +62,24 @@ type KeyStore struct { cert []byte } +// GetKeyPair implements goxmldsig.X509KeyPair. func (ks *KeyStore) GetKeyPair() (*rsa.PrivateKey, []byte, error) { return ks.privateKey, ks.cert, nil } -// GenerateSelfSignedSigningCert generates self-signed certificate used for digital signatures -func GenerateSelfSignedSigningCert(entity pkix.Name, dnsNames []string, ttl time.Duration) ([]byte, []byte, error) { - priv, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) +// GenerateSelfSignedSigningCert is an alias of GenerateRSASelfSignedSigningCert +// used due to references in teleport.e. +var GenerateSelfSignedSigningCert = GenerateRSASelfSignedSigningCert + +// GenerateRSASelfSignedSigningCert generates an RSA self-signed certificate used +// for digital signatures. +// This should only be used for the SAML implementation and tests. +func GenerateRSASelfSignedSigningCert(entity pkix.Name, dnsNames []string, ttl time.Duration) ([]byte, []byte, error) { + priv, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) if err != nil { return nil, nil, trace.Wrap(err) } + rsaPriv := priv.(*rsa.PrivateKey) // to account for clock skew notBefore := time.Now().Add(-2 * time.Minute) notAfter := notBefore.Add(ttl) @@ -93,12 +101,12 @@ func GenerateSelfSignedSigningCert(entity pkix.Name, dnsNames []string, ttl time DNSNames: dnsNames, } - derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &priv.PublicKey, priv) + derBytes, err := x509.CreateCertificate(rand.Reader, &template, &template, &rsaPriv.PublicKey, rsaPriv) if err != nil { return nil, nil, trace.Wrap(err) } - keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(priv)}) + keyPEM := pem.EncodeToMemory(&pem.Block{Type: "RSA PRIVATE KEY", Bytes: x509.MarshalPKCS1PrivateKey(rsaPriv)}) certPEM := pem.EncodeToMemory(&pem.Block{Type: "CERTIFICATE", Bytes: derBytes}) return keyPEM, certPEM, nil diff --git a/lib/utils/chconn_test.go b/lib/utils/chconn_test.go index 7a42fe0f663d2..44a3ae314dee7 100644 --- a/lib/utils/chconn_test.go +++ b/lib/utils/chconn_test.go @@ -19,8 +19,6 @@ package utils import ( - "crypto/rand" - "crypto/rsa" "io" "net" "os" @@ -30,9 +28,8 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/crypto/ssh" - "github.com/gravitational/teleport/api/constants" - "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/api/utils/sshutils" + "github.com/gravitational/teleport/lib/cryptosuites" ) // TestChConn validates that reads from the channel connection can be @@ -92,13 +89,10 @@ func startSSHServer(t *testing.T, listener net.Listener, sshConnCh chan<- sshCon require.NoError(t, err) t.Cleanup(func() { nConn.Close() }) - privateKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.Ed25519) require.NoError(t, err) - private, err := keys.MarshalPrivateKey(privateKey) - require.NoError(t, err) - - signer, err := ssh.ParsePrivateKey(private) + signer, err := ssh.NewSignerFromSigner(privateKey) require.NoError(t, err) config := &ssh.ServerConfig{NoClientAuth: true} diff --git a/lib/web/apiserver_test.go b/lib/web/apiserver_test.go index ad16a9c658dc8..5e3fea922d245 100644 --- a/lib/web/apiserver_test.go +++ b/lib/web/apiserver_test.go @@ -103,7 +103,6 @@ import ( "github.com/gravitational/teleport/lib/auth/authclient" tlsutils "github.com/gravitational/teleport/lib/auth/keygen" "github.com/gravitational/teleport/lib/auth/mocku2f" - "github.com/gravitational/teleport/lib/auth/native" "github.com/gravitational/teleport/lib/auth/state" "github.com/gravitational/teleport/lib/auth/testauthority" wantypes "github.com/gravitational/teleport/lib/auth/webauthntypes" @@ -180,7 +179,7 @@ func TestMain(m *testing.M) { srv.RunAndExit(os.Args[1]) return } - native.PrecomputeTestKeys(m) + cryptosuites.PrecomputeRSATestKeys(m) // Otherwise run tests as normal. code := m.Run() diff --git a/tool/tbot/kube_test.go b/tool/tbot/kube_test.go index 09a29f6c38c9e..c0f2a45c4ec76 100644 --- a/tool/tbot/kube_test.go +++ b/tool/tbot/kube_test.go @@ -19,8 +19,6 @@ package main import ( - "crypto/rand" - "crypto/rsa" "crypto/x509/pkix" "encoding/json" "testing" @@ -30,9 +28,9 @@ import ( "github.com/stretchr/testify/require" "golang.org/x/crypto/ssh" - "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/api/identityfile" "github.com/gravitational/teleport/api/utils/keys" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/fixtures" "github.com/gravitational/teleport/lib/tlsca" ) @@ -42,7 +40,7 @@ func TestGetKubeCredentialData(t *testing.T) { ca, err := tlsca.FromKeys([]byte(fixtures.TLSCACertPEM), []byte(fixtures.TLSCAKeyPEM)) require.NoError(t, err) - privateKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.ECDSAP256) require.NoError(t, err) clock := clockwork.NewFakeClock() diff --git a/tool/tctl/common/admin_action_test.go b/tool/tctl/common/admin_action_test.go index 199e1901e0c52..4fcdd8661d522 100644 --- a/tool/tctl/common/admin_action_test.go +++ b/tool/tctl/common/admin_action_test.go @@ -40,7 +40,6 @@ import ( "github.com/gravitational/teleport/api/mfa" "github.com/gravitational/teleport/api/types" apiutils "github.com/gravitational/teleport/api/utils" - "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" @@ -453,11 +452,7 @@ func (s *adminActionTestSuite) testUserGroups(t *testing.T) { func (s *adminActionTestSuite) testCertAuthority(t *testing.T) { ctx := context.Background() - sshSigner, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.Ed25519) - require.NoError(t, err) - sshKey, err := keys.NewSoftwarePrivateKey(sshSigner) - require.NoError(t, err) - sshKeyPEM, err := sshKey.MarshalSSHPrivateKey() + sshKey, err := cryptosuites.GeneratePrivateKeyWithAlgorithm(cryptosuites.Ed25519) require.NoError(t, err) tlsKey, cert, err := tlsca.GenerateSelfSignedCA(pkix.Name{CommonName: "Host"}, nil, time.Minute) @@ -468,9 +463,8 @@ func (s *adminActionTestSuite) testCertAuthority(t *testing.T) { ClusterName: "clustername", ActiveKeys: types.CAKeySet{ SSH: []*types.SSHKeyPair{{ - PrivateKey: sshKeyPEM, - PrivateKeyType: types.PrivateKeyType_RAW, - PublicKey: sshKey.MarshalSSHPublicKey(), + PrivateKey: sshKey.PrivateKeyPEM(), + PublicKey: sshKey.MarshalSSHPublicKey(), }}, TLS: []*types.TLSKeyPair{{ Cert: cert, diff --git a/tool/tsh/common/db_test.go b/tool/tsh/common/db_test.go index 7ae5ba046f8b8..5502102ab2459 100644 --- a/tool/tsh/common/db_test.go +++ b/tool/tsh/common/db_test.go @@ -21,8 +21,6 @@ package common import ( "bytes" "context" - "crypto/rand" - "crypto/rsa" "encoding/pem" "fmt" "os" @@ -42,6 +40,7 @@ import ( "github.com/gravitational/teleport/api/utils/keys" "github.com/gravitational/teleport/entitlements" "github.com/gravitational/teleport/lib/client" + "github.com/gravitational/teleport/lib/cryptosuites" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/fixtures" "github.com/gravitational/teleport/lib/modules" @@ -908,7 +907,7 @@ func TestDBInfoHasChanged(t *testing.T) { ca, err := tlsca.FromKeys([]byte(fixtures.TLSCACertPEM), []byte(fixtures.TLSCAKeyPEM)) require.NoError(t, err) - privateKey, err := rsa.GenerateKey(rand.Reader, constants.RSAKeySize) + privateKey, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) require.NoError(t, err) for _, tc := range tests { diff --git a/tool/tsh/common/tsh_test.go b/tool/tsh/common/tsh_test.go index bbd8529a03368..0cc5e07fc9aab 100644 --- a/tool/tsh/common/tsh_test.go +++ b/tool/tsh/common/tsh_test.go @@ -76,7 +76,6 @@ import ( "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/authclient" "github.com/gravitational/teleport/lib/auth/mocku2f" - "github.com/gravitational/teleport/lib/auth/native" wancli "github.com/gravitational/teleport/lib/auth/webauthncli" wantypes "github.com/gravitational/teleport/lib/auth/webauthntypes" "github.com/gravitational/teleport/lib/backend" @@ -127,7 +126,7 @@ func TestMain(m *testing.M) { modules.SetInsecureTestMode(true) utils.InitLoggerForTests() - native.PrecomputeTestKeys(m) + cryptosuites.PrecomputeRSATestKeys(m) os.Exit(m.Run()) } From 69a1e7a849c5a39dfef95c0a6a887a46d983ea24 Mon Sep 17 00:00:00 2001 From: Sakshyam Shah Date: Mon, 21 Oct 2024 17:20:01 -0400 Subject: [PATCH 06/70] render aws icon for identity center plugin in integration list (#47728) --- web/packages/teleport/src/Integrations/IntegrationList.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/web/packages/teleport/src/Integrations/IntegrationList.tsx b/web/packages/teleport/src/Integrations/IntegrationList.tsx index 26a0e376af26f..f52a2965ce408 100644 --- a/web/packages/teleport/src/Integrations/IntegrationList.tsx +++ b/web/packages/teleport/src/Integrations/IntegrationList.tsx @@ -339,6 +339,10 @@ const IconCell = ({ item }: { item: IntegrationLike }) => { formattedText = 'Datadog Incident Management'; icon = ; break; + case 'aws-identity-center': + formattedText = 'AWS Identity Center'; + icon = ; + break; } } else { // Default is integration. From a95fd447ee34dd670345b5d73e6a3f7ea4a586fd Mon Sep 17 00:00:00 2001 From: Nic Klaassen Date: Mon, 21 Oct 2024 16:28:41 -0700 Subject: [PATCH 07/70] lint against rsa.GenerateKey (#47775) * lint against rsa.GenerateKey * update e ref --- .golangci.yml | 5 ++++ e | 2 +- lib/auth/native/native.go | 59 --------------------------------------- 3 files changed, 6 insertions(+), 60 deletions(-) delete mode 100644 lib/auth/native/native.go diff --git a/.golangci.yml b/.golangci.yml index dd70e4302e6d3..7dcf0342101ff 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -80,6 +80,7 @@ linters: - testifylint - unconvert - unused + - forbidigo linters-settings: depguard: @@ -228,6 +229,10 @@ linters-settings: - len - suite-extra-assert-call - suite-thelper + forbidigo: + forbid: + - p: '^rsa\.GenerateKey$' + msg: 'generating RSA keys is slow, use lib/cryptosuites to generate an appropriate key type' output: uniq-by-line: false diff --git a/e b/e index d3347acb2791a..e4f948c672214 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit d3347acb2791ad6b527cb5cce3283778ac0b6b26 +Subproject commit e4f948c6722147398b9abb2fe1075456443c4dde diff --git a/lib/auth/native/native.go b/lib/auth/native/native.go deleted file mode 100644 index e8128fa06c2dc..0000000000000 --- a/lib/auth/native/native.go +++ /dev/null @@ -1,59 +0,0 @@ -/* - * Teleport - * Copyright (C) 2023 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -// Package native will be deleted as soon as references are removed from -// teleport.e. -package native - -import ( - "crypto/rsa" - "testing" - - "github.com/gravitational/trace" - - "github.com/gravitational/teleport/lib/cryptosuites" - "github.com/gravitational/teleport/lib/modules" -) - -// GenerateRSAPrivateKey will be deleted as soon as references are removed from -// teleport.e. -func GenerateRSAPrivateKey() (*rsa.PrivateKey, error) { - key, err := cryptosuites.GenerateKeyWithAlgorithm(cryptosuites.RSA2048) - if err != nil { - return nil, trace.Wrap(err) - } - return key.(*rsa.PrivateKey), nil -} - -// PrecomputeKeys is an alias of [cryptosuites.PrecomputeRSAKeys]. It will be -// deleted as soon as references are removed from teleport.e. -func PrecomputeKeys() { - cryptosuites.PrecomputeRSAKeys() -} - -// PrecomputeTestKeys is an alias of [cryptosuites.PrecomputeRSATestKeys]. It -// will be deleted as soon as references are removed from teleport.e. -func PrecomputeTestKeys(m *testing.M) { - cryptosuites.PrecomputeRSATestKeys(m) -} - -// IsBoringBinary is an alias of [modules.IsBoringBinary]. It will be deleted as -// soon as references are removed from teleport.e. -func IsBoringBinary() bool { - return modules.IsBoringBinary() -} From 28a68483e0a1edaccbb38281f2f055dbccdb3016 Mon Sep 17 00:00:00 2001 From: Bernard Kim Date: Mon, 21 Oct 2024 18:33:11 -0700 Subject: [PATCH 08/70] Sync IntegrationEnrollKind (#47106) * Sync IntegrationEnrollKind * Map usage to prehog --- .../proto/go/usageevents/v1/usageevents.pb.go | 677 +++++++++--------- .../teleport/usageevents/v1/usageevents.proto | 9 + gen/proto/go/prehog/v1alpha/teleport.pb.go | 140 ++-- gen/proto/ts/prehog/v1alpha/teleport_pb.ts | 10 +- lib/usagereporter/teleport/types.go | 24 +- proto/prehog/v1alpha/teleport.proto | 5 + 6 files changed, 470 insertions(+), 395 deletions(-) diff --git a/api/gen/proto/go/usageevents/v1/usageevents.pb.go b/api/gen/proto/go/usageevents/v1/usageevents.pb.go index c7b881bbf748f..007fcdf51420e 100644 --- a/api/gen/proto/go/usageevents/v1/usageevents.pb.go +++ b/api/gen/proto/go/usageevents/v1/usageevents.pb.go @@ -274,6 +274,10 @@ func (CTA) EnumDescriptor() ([]byte, []int) { // IntegrationEnrollKind represents the types of integration that // can be enrolled. +// +// Note: IntegrationEnrollKind enum must be kept in sync with the values defined +// in proto/prehog/v1alpha/teleport.proto. Values 18-25 have become out of sync +// and are manually mapped to each other. type IntegrationEnrollKind int32 const ( @@ -298,6 +302,11 @@ const ( IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_SERVICENOW IntegrationEnrollKind = 18 IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_ENTRA_ID IntegrationEnrollKind = 19 IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT IntegrationEnrollKind = 20 + IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_AWS IntegrationEnrollKind = 21 + IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_GCP IntegrationEnrollKind = 22 + IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_AZURE IntegrationEnrollKind = 23 + IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_SPACELIFT IntegrationEnrollKind = 24 + IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_KUBERNETES IntegrationEnrollKind = 25 ) var IntegrationEnrollKind_name = map[int32]string{ @@ -322,6 +331,11 @@ var IntegrationEnrollKind_name = map[int32]string{ 18: "INTEGRATION_ENROLL_KIND_SERVICENOW", 19: "INTEGRATION_ENROLL_KIND_ENTRA_ID", 20: "INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT", + 21: "INTEGRATION_ENROLL_KIND_MACHINE_ID_AWS", + 22: "INTEGRATION_ENROLL_KIND_MACHINE_ID_GCP", + 23: "INTEGRATION_ENROLL_KIND_MACHINE_ID_AZURE", + 24: "INTEGRATION_ENROLL_KIND_MACHINE_ID_SPACELIFT", + 25: "INTEGRATION_ENROLL_KIND_MACHINE_ID_KUBERNETES", } var IntegrationEnrollKind_value = map[string]int32{ @@ -346,6 +360,11 @@ var IntegrationEnrollKind_value = map[string]int32{ "INTEGRATION_ENROLL_KIND_SERVICENOW": 18, "INTEGRATION_ENROLL_KIND_ENTRA_ID": 19, "INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT": 20, + "INTEGRATION_ENROLL_KIND_MACHINE_ID_AWS": 21, + "INTEGRATION_ENROLL_KIND_MACHINE_ID_GCP": 22, + "INTEGRATION_ENROLL_KIND_MACHINE_ID_AZURE": 23, + "INTEGRATION_ENROLL_KIND_MACHINE_ID_SPACELIFT": 24, + "INTEGRATION_ENROLL_KIND_MACHINE_ID_KUBERNETES": 25, } func (x IntegrationEnrollKind) String() string { @@ -5424,339 +5443,341 @@ func init() { } var fileDescriptor_94cf2ca1c69fd564 = []byte{ - // 5297 bytes of a gzipped FileDescriptorProto + // 5340 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xe4, 0x7c, 0x4d, 0x6c, 0xe3, 0x48, 0x76, 0xbf, 0xe8, 0x8f, 0x6e, 0xbb, 0xda, 0xed, 0x66, 0xb3, 0xdb, 0xb6, 0xdc, 0x6e, 0xf7, 0x87, - 0xfa, 0xdb, 0x33, 0x6b, 0x4f, 0xbb, 0x67, 0x77, 0x7a, 0x67, 0xe6, 0xff, 0x9f, 0xd0, 0x14, 0x2d, + 0xfa, 0xdb, 0x33, 0x63, 0x4f, 0xbb, 0x67, 0x77, 0x7a, 0x67, 0xe6, 0xff, 0x9f, 0xd0, 0x14, 0x2d, 0xb1, 0x2d, 0x89, 0x9a, 0x22, 0xd5, 0xbd, 0x9e, 0xc5, 0xa2, 0x42, 0x93, 0x65, 0x37, 0x63, 0x49, 0xd4, 0x92, 0x94, 0x3d, 0x4e, 0x10, 0xec, 0xe6, 0x6b, 0x11, 0x64, 0x77, 0xb3, 0x09, 0x10, 0x2c, 0x02, 0x2c, 0x10, 0x24, 0xc8, 0x07, 0x72, 0x08, 0x90, 0x53, 0xb0, 0xd7, 0x2c, 0x90, 0x43, 0x8e, - 0x01, 0x72, 0xcc, 0x25, 0xd8, 0x53, 0x6e, 0x39, 0x25, 0xc8, 0x27, 0x12, 0xd4, 0x07, 0x25, 0x4a, - 0xa2, 0x44, 0xce, 0xa4, 0x07, 0x0b, 0x74, 0xdf, 0xa4, 0xaa, 0xf7, 0xea, 0xfd, 0xea, 0xd5, 0xab, - 0x57, 0xaf, 0xea, 0x3d, 0x09, 0x3c, 0x0a, 0x71, 0x13, 0x77, 0x3c, 0x3f, 0xdc, 0xea, 0x06, 0xd6, - 0x11, 0xc6, 0x27, 0xb8, 0x1d, 0x06, 0x5b, 0x27, 0x8f, 0xe3, 0x5f, 0x37, 0x3b, 0xbe, 0x17, 0x7a, - 0xd2, 0x4a, 0x44, 0xba, 0x19, 0xef, 0x3b, 0x79, 0x5c, 0xd8, 0x00, 0x52, 0x43, 0xdb, 0xb1, 0xda, - 0x6d, 0xec, 0x2b, 0x4d, 0xd7, 0x3e, 0x56, 0x49, 0x8f, 0x74, 0x15, 0xcc, 0x5a, 0x4d, 0xec, 0x87, - 0x79, 0xe1, 0x96, 0xf0, 0x70, 0x1e, 0xb2, 0x2f, 0x85, 0x5d, 0xf0, 0xb0, 0xa1, 0xe9, 0xed, 0x03, - 0xcf, 0xf2, 0x1d, 0xc5, 0x6b, 0x75, 0x9a, 0x38, 0xc4, 0x25, 0xcf, 0xf4, 0x8a, 0x56, 0xf0, 0x92, - 0x35, 0xf6, 0x47, 0xb8, 0x06, 0xe6, 0xba, 0x01, 0xf6, 0xdb, 0x56, 0x0b, 0xf3, 0x41, 0x7a, 0xdf, - 0x0b, 0xf7, 0xc0, 0x9d, 0xde, 0x38, 0xb2, 0xe3, 0xec, 0xba, 0x7e, 0x10, 0x42, 0x1c, 0x78, 0x5d, - 0xdf, 0xc6, 0xfd, 0x21, 0x0a, 0x1b, 0x31, 0x71, 0xc3, 0x64, 0x15, 0x2b, 0x8c, 0x03, 0x2e, 0x7c, - 0x04, 0x6e, 0xf7, 0x68, 0x0d, 0x1c, 0x2a, 0x3e, 0x76, 0x70, 0x3b, 0x74, 0xad, 0xa6, 0xd1, 0x3d, - 0x68, 0xb9, 0x61, 0x3a, 0xa6, 0xf8, 0x00, 0x1f, 0x77, 0x71, 0x10, 0xba, 0x5e, 0xbb, 0x6d, 0xb9, - 0x3e, 0xce, 0x3a, 0xc0, 0x2f, 0x83, 0x7b, 0xbd, 0x01, 0x20, 0x3e, 0x72, 0x03, 0x02, 0xf0, 0xa5, - 0xd5, 0x6c, 0xe2, 0xf6, 0x51, 0xd6, 0x41, 0xa4, 0x55, 0x30, 0xd7, 0x3a, 0xb4, 0x50, 0x78, 0xd6, - 0xc1, 0xf9, 0x29, 0xda, 0x77, 0xbe, 0x75, 0x68, 0x99, 0x67, 0x1d, 0x2c, 0xad, 0x03, 0xd0, 0xf4, - 0x8e, 0xdc, 0x36, 0x3a, 0x6c, 0x7a, 0xa7, 0xf9, 0x69, 0xda, 0x39, 0x4f, 0x5b, 0x76, 0x9b, 0xde, - 0x29, 0xc3, 0x0f, 0xb1, 0xed, 0x9d, 0x60, 0xff, 0x4c, 0xf1, 0x1c, 0x1c, 0x28, 0x5e, 0x3b, 0x74, - 0xdb, 0x5d, 0x9c, 0x71, 0x51, 0x3e, 0x00, 0xeb, 0x23, 0x03, 0x74, 0xce, 0x32, 0x32, 0x7f, 0x08, - 0x6e, 0x0c, 0x31, 0xd7, 0x7d, 0xb7, 0x1d, 0x66, 0xe4, 0x2e, 0x00, 0xb1, 0xe8, 0x06, 0x94, 0xb9, - 0x8a, 0x43, 0xcb, 0xb1, 0x42, 0x4b, 0x5a, 0x04, 0x53, 0xae, 0xc3, 0x29, 0xa7, 0x5c, 0xa7, 0x60, - 0x81, 0x7c, 0x44, 0x13, 0xd9, 0x40, 0x8f, 0x56, 0x05, 0x73, 0x3e, 0x6f, 0xa3, 0x1c, 0x8b, 0xdb, - 0x8f, 0x36, 0xc7, 0xd8, 0xfb, 0xe6, 0xf0, 0x20, 0xb0, 0xc7, 0x5a, 0x38, 0x06, 0x52, 0xd4, 0x6b, - 0x84, 0xb8, 0x63, 0x84, 0x56, 0xd8, 0x0d, 0xa4, 0x8f, 0xc0, 0xb9, 0x80, 0x7e, 0xe2, 0x43, 0x3f, - 0x48, 0x1d, 0x9a, 0x31, 0x42, 0xce, 0x46, 0xf6, 0x12, 0xf6, 0x7d, 0xcf, 0xe7, 0x0b, 0xca, 0xbe, - 0x14, 0xfe, 0x44, 0x00, 0xcb, 0x0d, 0x2d, 0xc6, 0xe2, 0x87, 0xd8, 0x61, 0xaa, 0x52, 0xc1, 0x5c, - 0x8b, 0x4f, 0x8d, 0xca, 0xbc, 0x90, 0x61, 0x3a, 0x91, 0x2e, 0x60, 0x8f, 0x55, 0x52, 0x7a, 0xc0, - 0xa7, 0xe8, 0x20, 0x6f, 0x65, 0x00, 0x1e, 0xcd, 0x3a, 0x02, 0x5f, 0xf8, 0x6f, 0x01, 0xdc, 0xea, - 0xc3, 0x8c, 0x94, 0x66, 0xe0, 0x26, 0xb6, 0xc9, 0x0e, 0x79, 0xa5, 0x80, 0xab, 0xb1, 0x65, 0x64, - 0x90, 0x1f, 0x67, 0x5e, 0xc6, 0xfe, 0x70, 0xd1, 0x10, 0xb1, 0xf9, 0x4f, 0x7f, 0xfe, 0xf9, 0xff, - 0xc6, 0x14, 0x71, 0x42, 0x11, 0x81, 0xd6, 0x0e, 0xf1, 0x91, 0x6f, 0x91, 0x99, 0xcb, 0x2f, 0x0c, - 0x5d, 0x2b, 0x2a, 0x8a, 0xd7, 0x6e, 0x63, 0x3b, 0x7c, 0xed, 0xf5, 0xf0, 0xe3, 0xa9, 0xb8, 0x1d, - 0x14, 0xad, 0xd0, 0x3a, 0xb0, 0x02, 0x0c, 0x8b, 0x86, 0xda, 0xf6, 0xbd, 0x66, 0xf3, 0x75, 0x9f, - 0xbf, 0xf4, 0x14, 0xe4, 0x03, 0x6a, 0xf4, 0xd8, 0x41, 0xd1, 0xc8, 0x01, 0xb2, 0xbd, 0x6e, 0x3b, - 0xcc, 0xcf, 0xdc, 0x12, 0x1e, 0x4e, 0xc3, 0xe5, 0xa8, 0x3f, 0x82, 0x12, 0x28, 0xa4, 0xb7, 0xf0, - 0xef, 0x02, 0xb8, 0xde, 0xd7, 0xdc, 0x5e, 0xf7, 0x00, 0xab, 0x7b, 0x6f, 0x88, 0xd6, 0x0a, 0xcf, - 0x40, 0xbe, 0xa1, 0x29, 0x56, 0xb3, 0x69, 0x7a, 0x32, 0xf5, 0x17, 0xb1, 0x03, 0x61, 0x13, 0x4c, - 0xdb, 0x7c, 0xc6, 0x8b, 0xdb, 0xd7, 0xc7, 0x8e, 0xae, 0x98, 0x32, 0x24, 0x84, 0x85, 0xef, 0xcf, - 0xc6, 0xf5, 0x58, 0xc4, 0x9d, 0xa6, 0x77, 0x66, 0x60, 0xff, 0xc4, 0xb5, 0xf1, 0x6b, 0x6f, 0x7d, - 0x47, 0xe0, 0xa2, 0x43, 0x27, 0x8c, 0x5a, 0x38, 0x7c, 0xe9, 0x39, 0xd4, 0xe4, 0x16, 0xb7, 0x77, - 0xc6, 0x8e, 0x35, 0x49, 0x51, 0x9b, 0xac, 0xa9, 0x4a, 0x47, 0x82, 0x0b, 0x4e, 0xec, 0x9b, 0x64, - 0x81, 0x0b, 0x5c, 0x10, 0x0d, 0x41, 0x66, 0xa9, 0x98, 0x9f, 0xfb, 0xbf, 0x88, 0x21, 0xb1, 0x0b, - 0x04, 0x4e, 0xef, 0x73, 0x01, 0x81, 0x85, 0x38, 0x00, 0x69, 0x1d, 0xac, 0x16, 0xd5, 0x7a, 0x45, - 0xdf, 0x47, 0x55, 0xd5, 0x2c, 0xeb, 0x45, 0xd4, 0xa8, 0x19, 0x75, 0x55, 0xd1, 0x76, 0x35, 0xb5, - 0x28, 0xe6, 0xa4, 0x65, 0x20, 0x0d, 0x76, 0xcb, 0x0d, 0x53, 0x17, 0x05, 0x29, 0x0f, 0xae, 0x0e, - 0xb6, 0x57, 0xe5, 0x5a, 0x43, 0xae, 0x88, 0x53, 0x05, 0x0c, 0x40, 0x5f, 0xb4, 0xb4, 0x06, 0x56, - 0x38, 0x9d, 0xb9, 0x5f, 0x57, 0x87, 0x06, 0xbf, 0x01, 0xae, 0xc5, 0x3b, 0xb5, 0x9a, 0x61, 0xca, - 0x95, 0x0a, 0x32, 0x14, 0xa8, 0xd5, 0x4d, 0x51, 0x90, 0xae, 0x81, 0xe5, 0x78, 0xbf, 0x5c, 0x95, - 0x3f, 0xd1, 0x6b, 0x48, 0x55, 0x0c, 0x71, 0xaa, 0xf0, 0xa3, 0x19, 0x70, 0xb7, 0x3f, 0x7f, 0xc5, - 0xc7, 0x56, 0x88, 0xa3, 0x6f, 0x67, 0x8a, 0xd7, 0x3e, 0x74, 0x8f, 0x5e, 0x7b, 0xbb, 0xf4, 0xc0, - 0x45, 0x9b, 0xce, 0x74, 0xd0, 0x2e, 0x9f, 0x65, 0x30, 0x98, 0xf1, 0x0a, 0xdb, 0x64, 0x9f, 0x23, - 0xfb, 0xb4, 0x63, 0xdf, 0x0a, 0x7f, 0x26, 0x80, 0x85, 0x78, 0x37, 0xb1, 0x1e, 0x45, 0xaf, 0xed, - 0x6a, 0xa5, 0x64, 0xeb, 0x19, 0xe9, 0x96, 0x5f, 0x18, 0x48, 0x55, 0xb6, 0x91, 0x61, 0x54, 0x45, - 0x81, 0xac, 0x7f, 0x72, 0xb7, 0xaa, 0x29, 0xaa, 0x38, 0x95, 0xcc, 0x0e, 0x8b, 0x06, 0x35, 0x81, - 0x69, 0x69, 0x15, 0x2c, 0x25, 0xb0, 0xef, 0x19, 0xe2, 0x4c, 0xe1, 0xbf, 0x04, 0x70, 0x33, 0xe1, - 0xbc, 0xe4, 0xf7, 0x82, 0xd7, 0xde, 0xf1, 0xff, 0xca, 0x54, 0x7c, 0x73, 0x44, 0xd3, 0x67, 0x2b, - 0xd7, 0xf5, 0x71, 0xd5, 0xac, 0x18, 0xaf, 0xbd, 0x0e, 0x7e, 0x7b, 0x0a, 0x3c, 0x8e, 0x3b, 0xc8, - 0xe0, 0x38, 0xf4, 0x3a, 0xe4, 0x18, 0x3c, 0xc1, 0x45, 0xd7, 0xc7, 0x76, 0xe8, 0xf9, 0x67, 0xa6, - 0xe7, 0x35, 0x03, 0xad, 0x1d, 0x84, 0xd6, 0x1b, 0x10, 0x0d, 0x7c, 0x77, 0x0a, 0x6c, 0xa6, 0x29, - 0xa4, 0x67, 0x22, 0xaf, 0xbd, 0x36, 0xfe, 0x62, 0x0a, 0xdc, 0xef, 0x6b, 0x43, 0xee, 0x86, 0x5e, - 0xf4, 0x39, 0x16, 0x42, 0xbe, 0xf6, 0x27, 0xc8, 0x03, 0x70, 0x29, 0x39, 0x9c, 0x5e, 0xf4, 0x07, - 0xc3, 0xe8, 0x6f, 0x4f, 0x81, 0x3b, 0x7d, 0x75, 0xa9, 0xca, 0x36, 0xdd, 0x35, 0xed, 0x37, 0xe9, - 0x2e, 0xfa, 0xaf, 0x02, 0x58, 0x1d, 0x8e, 0xb8, 0xc8, 0x41, 0xf5, 0x86, 0x4d, 0x9c, 0x45, 0x0e, - 0x35, 0xcf, 0x79, 0xfd, 0x7d, 0xc4, 0x7f, 0x0a, 0xe0, 0xc6, 0xf0, 0xc4, 0xe5, 0x4e, 0x87, 0x84, - 0xd9, 0x6f, 0x40, 0x10, 0xf1, 0x9d, 0x29, 0xf0, 0x68, 0x42, 0x10, 0xa1, 0xc9, 0xd5, 0xba, 0xd7, - 0x74, 0xed, 0xb3, 0xd7, 0x5e, 0x11, 0xff, 0x23, 0x80, 0x42, 0x5f, 0x11, 0x75, 0xdf, 0x6d, 0xdb, - 0x6e, 0xc7, 0x6a, 0x06, 0x6f, 0xce, 0x61, 0xf9, 0x1f, 0x02, 0x58, 0xef, 0x6b, 0xc0, 0xc4, 0x41, - 0xc8, 0x1f, 0xde, 0xde, 0x04, 0xbf, 0xff, 0x2f, 0x02, 0xc8, 0xc7, 0xbc, 0x00, 0x4f, 0xbc, 0x38, - 0xaf, 0xfd, 0xbc, 0xd7, 0x88, 0xd7, 0xe7, 0xde, 0x1e, 0x9f, 0x42, 0xaf, 0x19, 0x4f, 0x0e, 0xdd, - 0x24, 0x06, 0x31, 0xd0, 0x69, 0x58, 0x27, 0x71, 0x82, 0xdb, 0xe4, 0x02, 0x36, 0xc8, 0x4d, 0xc2, - 0x85, 0x66, 0x8c, 0xe4, 0x6d, 0xb0, 0x31, 0x44, 0xf2, 0xdc, 0xc5, 0xa7, 0x45, 0xcf, 0xee, 0xb6, - 0x70, 0x3b, 0xb4, 0x06, 0x1f, 0xac, 0x0a, 0x7f, 0x25, 0x80, 0x25, 0x39, 0x08, 0x5c, 0x62, 0x7b, - 0x74, 0x09, 0x7a, 0xb6, 0xf7, 0x00, 0x5c, 0xb2, 0xbd, 0xf6, 0x09, 0xf6, 0x03, 0xca, 0x83, 0x7a, - 0x89, 0x8b, 0xc5, 0x78, 0xb3, 0xe6, 0x48, 0xb7, 0xc1, 0x42, 0xe8, 0x85, 0x56, 0x13, 0x85, 0xde, - 0x31, 0x6e, 0xb3, 0x87, 0xf9, 0x69, 0x78, 0x81, 0xb6, 0x99, 0xb4, 0x49, 0xba, 0x03, 0x2e, 0x76, - 0x7c, 0xaf, 0xd5, 0x09, 0x23, 0x9a, 0x69, 0x4a, 0xb3, 0xc0, 0x1a, 0x39, 0xd1, 0x5b, 0xe0, 0xb2, - 0xdd, 0xc3, 0x10, 0x11, 0xb2, 0xb8, 0x49, 0xec, 0x77, 0x30, 0xe2, 0xc2, 0xdf, 0x0b, 0xe0, 0x2a, - 0xc3, 0xad, 0x7e, 0x8a, 0xed, 0xee, 0xe7, 0x80, 0xbd, 0x0e, 0x40, 0xdb, 0x73, 0x30, 0x8f, 0xcf, - 0x18, 0xe8, 0x79, 0xd2, 0x42, 0x43, 0xb3, 0x91, 0x59, 0x4d, 0x67, 0x98, 0xd5, 0x4c, 0xd6, 0x59, - 0xcd, 0x8e, 0x99, 0xd5, 0x53, 0x70, 0x8d, 0x4d, 0xaa, 0x86, 0x4f, 0x95, 0x18, 0xdc, 0x5e, 0xb6, - 0xc9, 0xb6, 0x42, 0x7c, 0xe4, 0xf9, 0x67, 0x51, 0xb6, 0x29, 0xfa, 0x5e, 0xf8, 0x4b, 0x01, 0x5c, - 0x61, 0xac, 0xb2, 0x6d, 0xe3, 0x20, 0x80, 0xf8, 0x9b, 0x5d, 0x1c, 0x84, 0x04, 0x63, 0x64, 0xbf, - 0xec, 0xf5, 0x8b, 0x31, 0x2e, 0x44, 0x8d, 0xf4, 0x39, 0xe9, 0x67, 0xb2, 0x82, 0x3f, 0x12, 0xc0, - 0x42, 0x84, 0x98, 0x34, 0x4b, 0xcb, 0xe0, 0x9c, 0x45, 0x3f, 0x71, 0x8c, 0xfc, 0xdb, 0xcf, 0x06, - 0xdd, 0x5d, 0x20, 0x31, 0x45, 0x56, 0xdc, 0x20, 0x1c, 0x9b, 0xbf, 0xfb, 0x3a, 0x10, 0xfb, 0x54, - 0x6c, 0xcf, 0x49, 0xa5, 0x11, 0xdf, 0x35, 0xde, 0x4f, 0x8c, 0x8a, 0xe8, 0x7b, 0xaf, 0xc1, 0xc1, - 0x1b, 0x1d, 0xe7, 0x8b, 0x1b, 0xbc, 0x88, 0x89, 0xef, 0x7d, 0x75, 0x83, 0x5b, 0x60, 0x39, 0xde, - 0xdf, 0x3a, 0x88, 0xc2, 0xbc, 0x2f, 0x54, 0xc4, 0xab, 0x56, 0x51, 0x82, 0x88, 0x57, 0xad, 0xa8, - 0x5f, 0x8c, 0x8b, 0x28, 0xf9, 0x56, 0x3b, 0x0c, 0x4c, 0xaf, 0x11, 0x60, 0x5f, 0xda, 0x04, 0x57, - 0xa8, 0x63, 0x42, 0xbe, 0xd7, 0xc4, 0x01, 0x3a, 0x22, 0x7d, 0x98, 0x99, 0xde, 0x2c, 0xbc, 0x4c, - 0xbb, 0x88, 0x6b, 0x0f, 0x4a, 0xac, 0x43, 0x7a, 0x07, 0x5c, 0x65, 0xf4, 0xa1, 0x6f, 0xb9, 0x61, - 0x9f, 0x61, 0x8a, 0x32, 0x48, 0xb4, 0xcf, 0xa4, 0x5d, 0x9c, 0xa3, 0xf0, 0xc3, 0xe9, 0xb8, 0x70, - 0x88, 0x4f, 0x5c, 0x7c, 0xfa, 0x8a, 0x57, 0x49, 0x7a, 0x0a, 0x56, 0x1d, 0xeb, 0x2c, 0x40, 0x1d, - 0x2b, 0x08, 0x51, 0x1b, 0x7f, 0x1a, 0x22, 0xab, 0xeb, 0xb8, 0x21, 0x22, 0x0b, 0xc5, 0xa1, 0x2d, - 0x11, 0x82, 0xba, 0x45, 0x5c, 0xde, 0xa7, 0xa1, 0x4c, 0x7a, 0x8b, 0x04, 0xc2, 0x2e, 0xb8, 0xd9, - 0xa2, 0x2a, 0x0f, 0x5e, 0xba, 0x1d, 0xe4, 0xe3, 0x6f, 0x76, 0x5d, 0x1f, 0x93, 0x03, 0x2c, 0x40, - 0xf6, 0x4b, 0xab, 0x7d, 0x84, 0x1d, 0xba, 0xc7, 0xe7, 0xe0, 0x7a, 0x9f, 0x0c, 0xc6, 0xa8, 0x14, - 0x46, 0x24, 0x3d, 0x05, 0x79, 0x9f, 0x4e, 0x0d, 0x1d, 0x92, 0x41, 0x70, 0xdb, 0x3e, 0xeb, 0x0d, - 0x30, 0x43, 0x07, 0x58, 0x66, 0xfd, 0xbb, 0x51, 0x77, 0xc4, 0xf9, 0x21, 0x58, 0xe3, 0x9c, 0x8e, - 0x75, 0x86, 0xbc, 0x43, 0xd4, 0xf2, 0xda, 0xe1, 0xcb, 0x1e, 0xf3, 0x2c, 0x65, 0x5e, 0x61, 0x24, - 0x45, 0xeb, 0x4c, 0x3f, 0xac, 0x92, 0xfe, 0x88, 0xfb, 0xab, 0x60, 0xb5, 0xdd, 0x25, 0xc0, 0x08, - 0xa7, 0x8f, 0x5b, 0xde, 0x09, 0x76, 0x10, 0x87, 0x9a, 0x3f, 0x47, 0x67, 0xbe, 0xcc, 0x08, 0xf4, - 0x43, 0xc8, 0xba, 0x99, 0x89, 0x05, 0x85, 0xdf, 0x13, 0x46, 0x17, 0xe6, 0x15, 0x1b, 0x9e, 0xf4, - 0x18, 0x2c, 0x59, 0xb4, 0x1f, 0x35, 0xdd, 0x20, 0x44, 0x7c, 0xa2, 0xae, 0xc3, 0xd3, 0xf9, 0x92, - 0x35, 0x24, 0x5f, 0x73, 0x0a, 0xdf, 0x13, 0xc0, 0x6a, 0x2c, 0x55, 0xcc, 0x92, 0x7d, 0xe3, 0x3c, - 0xa3, 0xb4, 0x03, 0x66, 0x8e, 0xdd, 0x36, 0x1b, 0x6f, 0x71, 0x7b, 0x73, 0x2c, 0xca, 0x91, 0x11, - 0xf7, 0xdc, 0xb6, 0x03, 0x29, 0xaf, 0xb4, 0x06, 0xe6, 0xbb, 0x01, 0xf6, 0x11, 0x2d, 0xaf, 0x98, - 0xee, 0x97, 0x57, 0xd4, 0xac, 0x16, 0x2e, 0x78, 0x24, 0x54, 0x1a, 0xe1, 0xa6, 0x25, 0x07, 0xec, - 0xb4, 0xac, 0x8d, 0xe8, 0x6a, 0x3b, 0x3b, 0x8a, 0x84, 0xbd, 0xea, 0x83, 0x5b, 0x09, 0x02, 0xa3, - 0xc0, 0xf5, 0x8b, 0x91, 0xf9, 0x0f, 0x02, 0xb8, 0xd2, 0xab, 0x21, 0xa2, 0x7b, 0x93, 0xc9, 0xc9, - 0x74, 0xaa, 0xc7, 0x5e, 0xa1, 0x90, 0xe7, 0xbb, 0x47, 0x6e, 0x9b, 0xaf, 0x6e, 0xef, 0x15, 0x4a, - 0xa7, 0xad, 0xd2, 0x3d, 0xb0, 0x68, 0x37, 0xbd, 0xae, 0x83, 0x3a, 0xbe, 0x77, 0xe2, 0x3a, 0xd8, - 0xe7, 0xca, 0xbe, 0x48, 0x5b, 0xeb, 0xbc, 0x51, 0xd2, 0xc1, 0x9c, 0xc3, 0xaf, 0xab, 0x74, 0xeb, - 0x5c, 0xd8, 0x7e, 0x92, 0x1a, 0x00, 0x63, 0x27, 0xba, 0xe1, 0xf6, 0x67, 0x17, 0x0d, 0x52, 0x78, - 0x0e, 0xae, 0x8d, 0xa7, 0x93, 0x56, 0xc0, 0x79, 0xe7, 0x20, 0x3e, 0xbb, 0x73, 0xce, 0x01, 0x9d, - 0xd7, 0x4d, 0x70, 0xc1, 0x39, 0x40, 0xb4, 0x02, 0xcc, 0xf6, 0x9a, 0x7c, 0x4e, 0xc0, 0x39, 0xa8, - 0xf3, 0x96, 0xc2, 0x3f, 0x0b, 0xe0, 0xda, 0x2e, 0xb6, 0xc2, 0xae, 0x8f, 0x21, 0xb6, 0xbd, 0x56, - 0x0b, 0xb7, 0x9d, 0x58, 0x18, 0x35, 0x60, 0x56, 0xc2, 0xa0, 0x59, 0x49, 0xef, 0x83, 0xf3, 0x87, - 0x8c, 0x95, 0x9b, 0xee, 0xad, 0xb1, 0x73, 0x8c, 0x44, 0x44, 0x0c, 0xd2, 0xa7, 0x60, 0x9d, 0x7f, - 0x44, 0xfe, 0x80, 0x5c, 0x14, 0xbb, 0x36, 0x2c, 0x6e, 0xbf, 0x9b, 0x3a, 0xe2, 0x00, 0x33, 0xbf, - 0x3f, 0xac, 0x1d, 0x8e, 0xef, 0x2c, 0x9c, 0x82, 0xab, 0xa6, 0x5c, 0x62, 0x91, 0x30, 0xfe, 0xb8, - 0x8b, 0x7d, 0xfe, 0x7c, 0x70, 0x13, 0xb0, 0x30, 0x09, 0x91, 0xb8, 0x96, 0xd5, 0xfa, 0x4c, 0x43, - 0x40, 0x9b, 0x6a, 0xa4, 0xa5, 0x4f, 0x80, 0x9d, 0x23, 0x1c, 0x85, 0x56, 0x8c, 0x40, 0x25, 0x2d, - 0x24, 0x4a, 0x76, 0x03, 0x14, 0x74, 0xa9, 0x3f, 0xe0, 0x2e, 0x77, 0xde, 0x0d, 0x0c, 0xd6, 0x50, - 0xf8, 0xa7, 0x69, 0xb0, 0xc2, 0x1c, 0x4d, 0xc9, 0xb7, 0x3a, 0x2f, 0xe5, 0x17, 0x86, 0x61, 0x5b, - 0xed, 0x28, 0x17, 0x7e, 0x85, 0x8f, 0x6d, 0x6f, 0x23, 0x97, 0x3f, 0x6c, 0x32, 0x10, 0x33, 0xf0, - 0x32, 0x93, 0x61, 0xf7, 0x5e, 0x3c, 0x63, 0x58, 0xc8, 0x62, 0x30, 0x2c, 0x33, 0x1c, 0x0b, 0x39, - 0x12, 0x83, 0x7e, 0x20, 0x78, 0xe4, 0x7b, 0xdd, 0x0e, 0x43, 0x33, 0xc3, 0x03, 0xc1, 0x12, 0x6d, - 0xea, 0x8f, 0x41, 0x8f, 0x4d, 0x6a, 0xa6, 0xd1, 0x18, 0xf4, 0xb8, 0x24, 0xb6, 0xce, 0x08, 0x3a, - 0x5e, 0xd3, 0xb5, 0x5d, 0xcc, 0x62, 0xf1, 0x19, 0x78, 0x91, 0xb6, 0xd6, 0x79, 0xa3, 0xf4, 0x36, - 0x90, 0x38, 0xf6, 0xe3, 0x00, 0xd9, 0xcd, 0x6e, 0x10, 0x46, 0x7e, 0x7b, 0x06, 0x8a, 0x0c, 0xfa, - 0x71, 0xa0, 0xf0, 0xf6, 0xfe, 0x4c, 0x7d, 0x27, 0x88, 0xcd, 0xf4, 0x7c, 0x6c, 0xa6, 0xd0, 0x09, - 0xfa, 0x33, 0x7d, 0x08, 0xd8, 0x18, 0x28, 0x78, 0x82, 0x0e, 0xba, 0xf6, 0x31, 0x0e, 0x83, 0xfc, - 0x1c, 0x25, 0x66, 0xe0, 0x8c, 0x27, 0x3b, 0xac, 0x95, 0x1c, 0xeb, 0x9c, 0xd2, 0x6a, 0x35, 0x7b, - 0xfb, 0x33, 0xc8, 0xcf, 0x53, 0x6a, 0x86, 0xd1, 0xb0, 0x5a, 0xcd, 0x68, 0x93, 0xc6, 0x38, 0x3c, - 0xd7, 0xb1, 0x63, 0x1c, 0x20, 0xc6, 0xa1, 0xbb, 0x8e, 0xdd, 0xe7, 0xe8, 0xa9, 0xc4, 0xb2, 0x69, - 0x98, 0x10, 0xe4, 0x2f, 0xc4, 0x54, 0x22, 0xf3, 0xc6, 0xc2, 0x0f, 0x05, 0x70, 0xb7, 0xa1, 0xc5, - 0x16, 0x5b, 0xf1, 0xbd, 0xd3, 0xf6, 0x33, 0x7c, 0x8a, 0x9b, 0x45, 0xf7, 0xf0, 0x90, 0x5c, 0x32, - 0xd9, 0xba, 0x3f, 0x05, 0x79, 0xeb, 0xf0, 0x70, 0xb0, 0xaa, 0x04, 0xc5, 0x0a, 0xd9, 0xe6, 0xe1, - 0x72, 0xd4, 0xdf, 0x2b, 0xbd, 0x62, 0x17, 0xec, 0x77, 0xc1, 0xf2, 0x28, 0x67, 0xac, 0x6c, 0xf0, - 0xea, 0x30, 0x1f, 0xcd, 0xbd, 0xef, 0x82, 0xeb, 0x06, 0xb6, 0xbb, 0xbe, 0x1b, 0x9e, 0x41, 0xba, - 0xad, 0x4a, 0x38, 0x84, 0x38, 0xe8, 0x36, 0xf9, 0x41, 0x20, 0x81, 0x99, 0xd8, 0x56, 0xa7, 0x9f, - 0x49, 0x1b, 0x89, 0x3b, 0x78, 0x0c, 0x42, 0x3f, 0x17, 0x2c, 0x70, 0xa5, 0x97, 0xb9, 0xdd, 0xc5, - 0xa1, 0xfd, 0x92, 0xb1, 0x8f, 0x7a, 0x47, 0x21, 0xc9, 0x3b, 0x8e, 0xb8, 0xe4, 0xa9, 0x51, 0x97, - 0x5c, 0xf8, 0x81, 0x00, 0x24, 0x62, 0xcb, 0xa6, 0x15, 0x1c, 0x93, 0xad, 0x8b, 0x7b, 0x1e, 0x29, - 0xb4, 0x82, 0xe3, 0xb8, 0xb3, 0x9b, 0x23, 0x0d, 0x51, 0x89, 0xa4, 0x1b, 0x04, 0xdd, 0x81, 0x51, - 0xe7, 0x69, 0x0b, 0xed, 0xbe, 0x0a, 0x66, 0x89, 0x77, 0x89, 0x0e, 0x48, 0xf6, 0x85, 0xf8, 0xfe, - 0x9e, 0x1d, 0xc6, 0x32, 0x10, 0xb3, 0x70, 0xb1, 0xd7, 0xcc, 0x32, 0x10, 0x7f, 0xf3, 0x3e, 0xb8, - 0xd4, 0x20, 0x5e, 0x88, 0x22, 0xd1, 0xdb, 0x58, 0x3f, 0x94, 0x1a, 0xe0, 0x52, 0xd7, 0x45, 0x07, - 0xb4, 0x7c, 0x16, 0xd9, 0x4d, 0xd7, 0x3e, 0x4e, 0x0d, 0x36, 0x46, 0xab, 0x6d, 0xcb, 0x39, 0x78, - 0xb1, 0xeb, 0xc6, 0x5a, 0xa5, 0x1f, 0x09, 0xe0, 0x51, 0xd7, 0x45, 0x1e, 0xab, 0x26, 0x45, 0xfc, - 0xca, 0x85, 0xd1, 0x91, 0x87, 0x42, 0x0f, 0x39, 0x51, 0xb9, 0x2d, 0x97, 0xc8, 0x9e, 0x58, 0xe4, - 0x09, 0x12, 0xb3, 0xd5, 0xec, 0x96, 0x73, 0xf0, 0x4e, 0xd7, 0x4d, 0xa5, 0x95, 0xbe, 0x2b, 0x80, - 0x3b, 0x31, 0x74, 0x96, 0xe3, 0xa0, 0x43, 0xd7, 0xa7, 0xb1, 0x11, 0x5f, 0x55, 0x86, 0x8b, 0x9d, - 0x7c, 0x1f, 0xa6, 0xe3, 0x1a, 0x5f, 0x03, 0x5c, 0xce, 0xc1, 0x1b, 0x3d, 0x48, 0x89, 0x64, 0xc3, - 0xba, 0x4a, 0x40, 0xd3, 0xb4, 0xc2, 0xde, 0xea, 0xcc, 0x66, 0xd5, 0x55, 0x4a, 0xc1, 0xf1, 0x80, - 0xae, 0xc6, 0xd3, 0x4a, 0xbf, 0x2e, 0x80, 0x5b, 0x31, 0x74, 0x01, 0x0e, 0x91, 0xdd, 0xab, 0x4d, - 0x46, 0x01, 0x2d, 0x0b, 0xa6, 0xce, 0xf2, 0xc2, 0xf6, 0xfb, 0xe9, 0xa0, 0xc6, 0x55, 0x36, 0x97, - 0x73, 0xf0, 0x7a, 0x0f, 0x4d, 0x02, 0x91, 0xf4, 0x3b, 0x02, 0xb8, 0x1b, 0x83, 0xe1, 0xf3, 0x3a, - 0x04, 0x12, 0xa2, 0xb3, 0x02, 0xe5, 0x08, 0xca, 0x79, 0x0a, 0xe5, 0xff, 0xa7, 0x43, 0x99, 0x54, - 0xe2, 0x5c, 0xce, 0xc1, 0x5b, 0x3d, 0x38, 0x63, 0x08, 0x23, 0xcd, 0xf8, 0xbc, 0x68, 0x18, 0xd9, - 0xe4, 0x94, 0x45, 0x36, 0x2f, 0x5a, 0xe6, 0xcb, 0x35, 0x97, 0xaa, 0x99, 0x94, 0x92, 0x67, 0xa6, - 0x99, 0xf1, 0x44, 0xd2, 0xa7, 0xe0, 0x7a, 0x12, 0x8a, 0xce, 0x19, 0x47, 0x30, 0x4f, 0x11, 0x7c, - 0x25, 0x3b, 0x82, 0x78, 0xcd, 0x74, 0x39, 0x07, 0xf3, 0x23, 0xd2, 0x39, 0x81, 0xf4, 0x4b, 0x60, - 0x7d, 0x54, 0x72, 0xc7, 0x77, 0xdb, 0x21, 0x17, 0x0d, 0xa8, 0xe8, 0xf7, 0xb2, 0x8a, 0x1e, 0xaa, - 0xb8, 0x2e, 0xe7, 0xe0, 0xea, 0x90, 0xec, 0x3e, 0x85, 0xd4, 0x04, 0xab, 0x5d, 0x17, 0x39, 0xdc, - 0x89, 0x93, 0xa8, 0xcb, 0x27, 0x47, 0x09, 0x1d, 0x9c, 0x1e, 0x6a, 0x17, 0xb6, 0xb7, 0x32, 0x54, - 0xf1, 0xc4, 0xeb, 0x96, 0xcb, 0x39, 0xb8, 0xdc, 0x75, 0x13, 0x2b, 0x9a, 0xbf, 0xcb, 0xcc, 0xaf, - 0x27, 0xae, 0x7f, 0xd6, 0x45, 0xc9, 0x5b, 0x2e, 0x79, 0x81, 0x4a, 0xfe, 0x6a, 0x06, 0xc9, 0xc9, - 0xa5, 0xc8, 0xcc, 0xf2, 0x52, 0xca, 0x95, 0xbf, 0x45, 0x0d, 0xaf, 0x07, 0x86, 0x17, 0xbc, 0x05, - 0xac, 0x76, 0x8d, 0x03, 0xb9, 0x48, 0x81, 0x7c, 0xf9, 0x73, 0x55, 0xbe, 0x31, 0x9b, 0x9b, 0x50, - 0xa9, 0xf8, 0x9b, 0xcc, 0x81, 0xf6, 0x11, 0xf0, 0x80, 0xbe, 0xbf, 0x2f, 0x19, 0x88, 0x45, 0x0a, - 0xe2, 0x69, 0x16, 0x10, 0x49, 0x05, 0x46, 0xe5, 0x1c, 0xbc, 0x19, 0xc3, 0x91, 0x58, 0x83, 0xf4, - 0xfb, 0xcc, 0x7b, 0x8e, 0x42, 0xb1, 0xa3, 0xdc, 0x12, 0x6a, 0x85, 0xcd, 0x80, 0x03, 0xba, 0x44, - 0x01, 0xfd, 0xbf, 0xcf, 0x00, 0x68, 0xb4, 0xe4, 0xa7, 0x9c, 0x83, 0x77, 0x47, 0x51, 0xf5, 0xe9, - 0xc2, 0x26, 0xaf, 0x7a, 0xf8, 0x89, 0x00, 0x9e, 0x0e, 0xae, 0x13, 0x2d, 0x18, 0x41, 0x16, 0xad, - 0x18, 0x41, 0x4e, 0x54, 0x32, 0x82, 0x42, 0xcf, 0x6b, 0xf2, 0x60, 0xb2, 0xd9, 0xe4, 0x48, 0x45, - 0x8a, 0xf4, 0x59, 0xa6, 0xf5, 0xcb, 0x54, 0x98, 0x53, 0xce, 0xc1, 0xc7, 0xf1, 0x45, 0xcd, 0x56, - 0xcd, 0xf3, 0x63, 0x01, 0xbc, 0x9b, 0x69, 0x0e, 0x7d, 0x75, 0x33, 0xfc, 0x97, 0x29, 0xfe, 0xd2, - 0xe7, 0xc6, 0x3f, 0x98, 0x1a, 0x2c, 0xe7, 0xe0, 0x66, 0x1a, 0xf8, 0xa1, 0x64, 0xe2, 0x1f, 0x08, - 0xe0, 0xad, 0x38, 0x72, 0xab, 0x4b, 0x22, 0x8f, 0xde, 0x1d, 0x34, 0x56, 0x04, 0xcd, 0x00, 0x4b, - 0x14, 0xf0, 0x47, 0x19, 0x00, 0x4f, 0x2a, 0x75, 0x29, 0xe7, 0xe0, 0xfd, 0x3e, 0xd0, 0x89, 0x45, - 0x31, 0x7f, 0x2e, 0x80, 0xad, 0x14, 0xcb, 0x75, 0xad, 0x16, 0xbb, 0xbc, 0x9c, 0x71, 0x90, 0x57, - 0x28, 0xc8, 0x9d, 0xcf, 0x63, 0xbf, 0x83, 0xd9, 0xe6, 0x72, 0x0e, 0x3e, 0x9a, 0x60, 0xc4, 0x9a, - 0xd5, 0x8a, 0xa7, 0xa6, 0x7f, 0x57, 0x00, 0xf7, 0xe3, 0x50, 0x3b, 0xbd, 0x0c, 0xee, 0xc8, 0xba, - 0x5f, 0xa5, 0x08, 0x3f, 0xc8, 0x80, 0x70, 0x5c, 0x1a, 0xb8, 0x9c, 0x83, 0x85, 0x3e, 0xb4, 0xb1, - 0xc9, 0xe2, 0x5f, 0x15, 0xc0, 0xed, 0x38, 0xa6, 0x10, 0x07, 0x21, 0x41, 0xd3, 0x1e, 0xf0, 0xc7, - 0x4b, 0xa9, 0xa7, 0xdf, 0x84, 0x9c, 0x6c, 0x39, 0x07, 0xd7, 0xfb, 0x48, 0x92, 0x92, 0xb6, 0x3e, - 0x58, 0x8b, 0x63, 0x88, 0xe2, 0xdc, 0xe8, 0x1c, 0x5a, 0x4e, 0x49, 0x44, 0x8e, 0x4b, 0x8a, 0xb2, - 0x63, 0x77, 0x4c, 0xc2, 0xb4, 0x09, 0xf2, 0x5d, 0x97, 0x04, 0x61, 0x56, 0x88, 0x51, 0x1b, 0x9f, - 0xd2, 0xfb, 0x2f, 0x3f, 0x71, 0x57, 0x52, 0x1e, 0xa2, 0xc6, 0xa6, 0x23, 0xcb, 0x39, 0x78, 0xb5, - 0xeb, 0x8e, 0x76, 0x4a, 0x67, 0xf4, 0x90, 0x1f, 0x96, 0x16, 0x58, 0x27, 0x91, 0xc8, 0x7c, 0xaa, - 0x86, 0x27, 0x24, 0x39, 0xd9, 0x44, 0x93, 0x09, 0xa4, 0x6f, 0x81, 0x9b, 0x49, 0x13, 0xa5, 0x49, - 0x50, 0x2e, 0x7c, 0x35, 0xf5, 0x80, 0x99, 0x98, 0x40, 0x2d, 0xe7, 0xe0, 0xb5, 0xe1, 0x59, 0xf7, - 0x49, 0xa4, 0x3f, 0x62, 0x2e, 0x64, 0x18, 0x01, 0x7b, 0x28, 0x8e, 0x27, 0x59, 0x39, 0x9a, 0x6b, - 0x14, 0x8d, 0x92, 0x15, 0xcd, 0x84, 0x5c, 0x6d, 0x39, 0x07, 0xef, 0x0d, 0x01, 0x4b, 0xa6, 0x96, - 0xfe, 0x54, 0x00, 0x9b, 0x71, 0x13, 0x74, 0xfb, 0x4f, 0x8d, 0xc8, 0x3a, 0x0d, 0xd8, 0xd3, 0x00, - 0xdf, 0x16, 0xdc, 0x2a, 0xd7, 0x52, 0xaf, 0x10, 0xd9, 0x7e, 0x2e, 0x54, 0xce, 0xc1, 0x87, 0x7d, - 0x2b, 0x8d, 0xd3, 0x9e, 0x06, 0xba, 0xeb, 0xd8, 0x03, 0x3f, 0x2d, 0xfa, 0x9e, 0x00, 0xee, 0x25, - 0x87, 0x0c, 0x4e, 0x80, 0x30, 0x7d, 0x14, 0xe5, 0xf0, 0xae, 0x67, 0x0e, 0xa1, 0x92, 0x7f, 0xc5, - 0x33, 0x18, 0x42, 0xf5, 0x68, 0x9c, 0x20, 0xfe, 0x9b, 0x95, 0x90, 0x99, 0x35, 0x39, 0x6f, 0x43, - 0x0f, 0xb1, 0xec, 0x23, 0x5b, 0x45, 0x8e, 0x62, 0x3d, 0x75, 0xeb, 0x26, 0xff, 0x2c, 0x84, 0x5b, - 0x74, 0xf2, 0x4f, 0x46, 0xbe, 0x01, 0x2e, 0x5b, 0x34, 0x0d, 0x8a, 0xfa, 0x49, 0xc8, 0xfc, 0x0d, - 0x2a, 0x69, 0xfc, 0xb3, 0x79, 0x62, 0xca, 0xbe, 0x9c, 0x83, 0xa2, 0x35, 0xd4, 0x11, 0xb9, 0xc4, - 0xb8, 0x09, 0x70, 0xcd, 0xd2, 0xf0, 0x98, 0xcf, 0xec, 0x66, 0xea, 0x86, 0x9d, 0xf0, 0xd4, 0xce, - 0x5c, 0xe2, 0xa4, 0xb7, 0x78, 0x1e, 0x2a, 0x27, 0x80, 0xe8, 0xbd, 0x02, 0x30, 0x1c, 0xb7, 0x52, - 0xd7, 0x79, 0xf2, 0x0b, 0x3c, 0x5b, 0xe7, 0x94, 0x57, 0xfa, 0x5f, 0x13, 0xa8, 0x13, 0x89, 0xee, - 0x8d, 0xdf, 0x8c, 0xff, 0x30, 0x36, 0xba, 0x32, 0xde, 0xce, 0x7a, 0x7b, 0x1d, 0xf7, 0xb3, 0xda, - 0x81, 0xdb, 0x6b, 0x02, 0x91, 0xf4, 0x09, 0xe0, 0x8b, 0x85, 0x70, 0x54, 0xc1, 0x90, 0x2f, 0x50, - 0xa9, 0x5f, 0x4a, 0x59, 0xf6, 0xc1, 0x8a, 0x87, 0x72, 0x0e, 0x5e, 0xb2, 0x06, 0xdb, 0xa5, 0x16, - 0x58, 0xe1, 0x63, 0x13, 0x07, 0x15, 0x2f, 0x7c, 0xc8, 0xdf, 0x49, 0x79, 0xb9, 0x1f, 0x5f, 0x7f, - 0x50, 0xce, 0xc1, 0x25, 0x2b, 0xa9, 0x57, 0x3a, 0x00, 0x4b, 0xfd, 0x57, 0x12, 0xe6, 0x18, 0xd9, - 0x72, 0xde, 0xa5, 0xc2, 0xde, 0x1e, 0x2b, 0x2c, 0x21, 0xb7, 0x51, 0xce, 0xc1, 0x2b, 0x7e, 0x42, - 0xca, 0xe3, 0x14, 0x5c, 0x1f, 0xf3, 0xb8, 0xce, 0x44, 0xdd, 0x4b, 0x99, 0xd7, 0xf8, 0x84, 0x00, - 0x71, 0xf8, 0x87, 0xe3, 0xd3, 0x05, 0x07, 0x80, 0xcf, 0x1a, 0xf1, 0x8c, 0x99, 0xcf, 0x4a, 0x2b, - 0xf2, 0xf7, 0x53, 0x26, 0x97, 0x50, 0x8e, 0x41, 0x26, 0x67, 0x25, 0x54, 0x69, 0x54, 0xc0, 0xc5, - 0x9e, 0x0c, 0xba, 0x4a, 0x0f, 0xe8, 0xd8, 0xf7, 0x52, 0xc7, 0x26, 0xc4, 0xe5, 0x1c, 0x5c, 0xb0, - 0xe2, 0x85, 0x14, 0xfb, 0x40, 0x8a, 0x27, 0xf7, 0xd8, 0x8a, 0xe4, 0x1f, 0xa6, 0xd4, 0x51, 0x0d, - 0x17, 0x32, 0x50, 0x6f, 0x32, 0x5c, 0xdc, 0x30, 0x34, 0x74, 0x97, 0xa6, 0xdc, 0xf3, 0x8f, 0x32, - 0x0f, 0xcd, 0x72, 0xf4, 0x83, 0x43, 0xf3, 0xbc, 0xfd, 0xd0, 0xd0, 0x0e, 0xcd, 0x78, 0xe6, 0x37, - 0x32, 0x0f, 0xcd, 0x52, 0xa4, 0x83, 0x43, 0xf3, 0xb4, 0x69, 0x13, 0xac, 0xc6, 0x87, 0x66, 0x69, - 0xd8, 0x48, 0x2f, 0x6f, 0xa5, 0xbc, 0x0b, 0x24, 0x57, 0x32, 0x94, 0x73, 0x70, 0xd9, 0x4a, 0xae, - 0x71, 0x48, 0x96, 0xc6, 0x55, 0xf5, 0xf6, 0x67, 0x94, 0xd6, 0x53, 0xd8, 0x88, 0x34, 0xae, 0xb6, - 0x64, 0x69, 0x5c, 0x7b, 0x5f, 0xfa, 0x8c, 0xd2, 0x7a, 0x3a, 0x1c, 0x91, 0xc6, 0x35, 0xd9, 0x02, - 0xd7, 0xe2, 0xd2, 0x68, 0x95, 0x41, 0x40, 0x4e, 0xcb, 0x6e, 0x80, 0xfd, 0xfc, 0x66, 0x66, 0x71, - 0xf1, 0x5a, 0x87, 0x41, 0x71, 0x03, 0x55, 0x10, 0xbf, 0x25, 0x80, 0x42, 0x3c, 0x40, 0x88, 0x67, - 0x92, 0xfa, 0xcf, 0x2c, 0xf9, 0xad, 0xd4, 0x37, 0xd9, 0xd4, 0x12, 0x7b, 0xf6, 0x26, 0xdb, 0x23, - 0xb3, 0x47, 0xc9, 0xa4, 0x63, 0xb0, 0x92, 0xf0, 0xc2, 0x82, 0x5d, 0x1b, 0xe7, 0xdf, 0x49, 0x0d, - 0xb1, 0xc7, 0x14, 0xb8, 0xb3, 0x10, 0x7b, 0xa8, 0xd3, 0xb5, 0xf1, 0xb0, 0xb0, 0x28, 0xdc, 0xf4, - 0x1c, 0x9c, 0x7f, 0x9c, 0x59, 0xd8, 0x50, 0x51, 0xf9, 0xa0, 0xb0, 0x7e, 0xa7, 0xf4, 0x75, 0x70, - 0x39, 0xb4, 0x8e, 0xf8, 0x39, 0x84, 0xc9, 0x81, 0xe8, 0x9f, 0xe5, 0xb7, 0x53, 0xce, 0xa2, 0xa4, - 0x84, 0x23, 0x39, 0x8b, 0x42, 0xeb, 0x28, 0xde, 0x2e, 0x85, 0xe0, 0x5a, 0xc0, 0xd3, 0x33, 0xc8, - 0xa7, 0x23, 0xa1, 0x23, 0x4c, 0x1f, 0xb2, 0xbb, 0xcd, 0x30, 0xff, 0x24, 0xe5, 0x49, 0x6a, 0x52, - 0x66, 0xa7, 0x9c, 0x83, 0x2b, 0x41, 0x72, 0xff, 0xf0, 0xb6, 0xe0, 0x05, 0x0e, 0x7c, 0xcb, 0xbf, - 0x9b, 0xd9, 0x4e, 0xe3, 0x65, 0x31, 0x83, 0x76, 0x3a, 0x50, 0x30, 0x93, 0x2c, 0x8d, 0x6f, 0xc2, - 0x2f, 0x7f, 0x46, 0x69, 0x49, 0x9b, 0x70, 0xa0, 0x0a, 0xe4, 0x00, 0x2c, 0x45, 0x86, 0x71, 0x86, - 0x0e, 0x71, 0x68, 0xbf, 0xe4, 0x67, 0xe0, 0x57, 0x52, 0x4e, 0xa4, 0x84, 0xf4, 0x16, 0x39, 0x91, - 0x9c, 0x84, 0xac, 0xd7, 0xf7, 0x87, 0x5e, 0xf3, 0xb8, 0x01, 0xf6, 0xe5, 0xb2, 0x3b, 0x7e, 0xfe, - 0xbd, 0xcc, 0x8f, 0x67, 0xe3, 0x7f, 0x1b, 0x39, 0xf8, 0xa4, 0x97, 0x48, 0x27, 0x7d, 0x7b, 0xe8, - 0x66, 0x7f, 0xdc, 0x3d, 0xc0, 0x34, 0x39, 0x3b, 0x70, 0x4d, 0x78, 0x9a, 0xf9, 0x81, 0x73, 0xf4, - 0x27, 0xeb, 0x83, 0x0f, 0x9c, 0xb4, 0xff, 0x78, 0xe0, 0x7a, 0xf0, 0x9d, 0x64, 0x95, 0x58, 0x9d, - 0x0e, 0x7d, 0x66, 0xed, 0x3d, 0x70, 0x7e, 0x35, 0xf5, 0x85, 0x7b, 0xd2, 0x6f, 0x1f, 0x06, 0x1d, - 0x51, 0xe2, 0xaf, 0x23, 0x3a, 0x60, 0x8d, 0x5b, 0xdb, 0x91, 0x6f, 0x75, 0x5e, 0xd2, 0x2b, 0x5d, - 0x60, 0x5b, 0x51, 0x24, 0xf4, 0x3e, 0x95, 0xff, 0x4e, 0x8a, 0xbd, 0x8d, 0xe4, 0xeb, 0xc9, 0x6e, - 0xb2, 0x62, 0x5d, 0xa7, 0x41, 0x3f, 0x95, 0xff, 0x03, 0x76, 0x51, 0x1b, 0x90, 0x6a, 0xfb, 0xde, - 0x69, 0x1b, 0xfd, 0x02, 0x3e, 0xc5, 0x4d, 0xe4, 0xb8, 0x87, 0x87, 0xf4, 0x0a, 0x9c, 0xff, 0x20, - 0xd5, 0x1e, 0xd2, 0x33, 0xc8, 0xcc, 0x1e, 0x26, 0xd2, 0x49, 0x3f, 0x0f, 0x96, 0x68, 0x11, 0x07, - 0xcd, 0x9b, 0xd2, 0x9c, 0x27, 0x9f, 0xfd, 0x87, 0x69, 0x99, 0xca, 0x91, 0xf4, 0x6b, 0x39, 0x07, - 0xa5, 0xee, 0x48, 0xeb, 0xce, 0x79, 0x30, 0x4b, 0xb9, 0x9e, 0xcd, 0xcc, 0x4d, 0x89, 0xd3, 0xc4, - 0x36, 0x7a, 0x37, 0x06, 0xe2, 0xbf, 0xa2, 0xe4, 0x02, 0xbd, 0x1f, 0x6e, 0xfc, 0xf5, 0xa5, 0xfe, - 0xbf, 0xbd, 0x44, 0x41, 0xad, 0x74, 0x1b, 0xac, 0x17, 0x35, 0x43, 0xd1, 0x9f, 0xab, 0x10, 0x41, - 0xd5, 0xd0, 0x1b, 0x50, 0x19, 0xfe, 0xad, 0xf6, 0x75, 0x90, 0x1f, 0x25, 0x31, 0x54, 0xf8, 0x5c, - 0x85, 0xa2, 0x20, 0xdd, 0x02, 0xd7, 0x47, 0x7b, 0xf7, 0x1a, 0x3b, 0x2a, 0xac, 0xa9, 0xa6, 0x6a, - 0x88, 0x53, 0xd2, 0x13, 0xb0, 0x35, 0x4a, 0x51, 0x94, 0x4d, 0x79, 0x47, 0x36, 0x54, 0x54, 0xd7, - 0x0d, 0xb3, 0x04, 0x55, 0x03, 0x19, 0x6a, 0x65, 0x17, 0x95, 0x75, 0xc3, 0x54, 0x8b, 0xe2, 0xb4, - 0xf4, 0x0e, 0x78, 0x7b, 0x02, 0x53, 0x75, 0xdf, 0xf8, 0xb8, 0x32, 0xc0, 0x31, 0x23, 0x6d, 0x83, - 0xcd, 0x49, 0x1c, 0x7a, 0xad, 0xa4, 0x17, 0x77, 0x06, 0x78, 0x66, 0xa5, 0xb7, 0xc0, 0x83, 0x2c, - 0xd0, 0x60, 0xd1, 0x10, 0xcf, 0x49, 0x0f, 0xc1, 0xdd, 0x54, 0x48, 0x84, 0xf2, 0xbc, 0x74, 0x1f, - 0x14, 0x46, 0x29, 0xe5, 0x7a, 0xbd, 0xa2, 0x29, 0xb2, 0xa9, 0xe9, 0x35, 0x54, 0x36, 0xcd, 0xba, - 0x38, 0x27, 0xdd, 0x03, 0xb7, 0x27, 0xd3, 0x99, 0x4a, 0x5d, 0x9c, 0x4f, 0x26, 0x7b, 0xa1, 0xd5, - 0x8a, 0xfa, 0x0b, 0x03, 0x15, 0x55, 0x63, 0xcf, 0xd4, 0xeb, 0x22, 0x90, 0xde, 0x06, 0x0f, 0x27, - 0xe0, 0x33, 0x3e, 0xae, 0xb0, 0x35, 0xa3, 0x18, 0x2f, 0xa4, 0x28, 0xb8, 0x3f, 0x75, 0xb5, 0x68, - 0x94, 0xb5, 0x5d, 0x53, 0x5c, 0x90, 0xde, 0x05, 0xef, 0x64, 0x1a, 0x3f, 0xae, 0xe2, 0x8b, 0x29, - 0x72, 0xa0, 0x5a, 0xd4, 0x06, 0x97, 0x7e, 0x31, 0xeb, 0xa2, 0x94, 0x94, 0xba, 0x78, 0x29, 0xd3, - 0xa2, 0x10, 0x4a, 0x31, 0xb3, 0x7a, 0x08, 0xf5, 0x65, 0xe9, 0x03, 0xf0, 0xde, 0x67, 0x51, 0x0f, - 0xdf, 0x0f, 0x15, 0xd5, 0x30, 0x44, 0x49, 0xfa, 0x12, 0x78, 0x94, 0x85, 0x59, 0xfe, 0xa4, 0x01, - 0x55, 0xf1, 0x8a, 0xf4, 0x00, 0xdc, 0x99, 0x40, 0x5e, 0xdc, 0xaf, 0xc9, 0x55, 0xbd, 0xb8, 0x23, - 0x5e, 0x4d, 0x31, 0x71, 0x45, 0x36, 0x0c, 0xb9, 0x56, 0x84, 0x32, 0xda, 0x53, 0xf7, 0x8d, 0xba, - 0xac, 0xa8, 0x86, 0xb8, 0x94, 0xb2, 0x6a, 0x7d, 0x9e, 0xf8, 0x1a, 0x2c, 0x4b, 0x4f, 0xc1, 0xbb, - 0x13, 0xb8, 0xd4, 0x8a, 0x6c, 0x98, 0x9a, 0x62, 0xa8, 0x32, 0x54, 0xca, 0x03, 0x9c, 0x2b, 0x99, - 0xd6, 0x9b, 0xf3, 0xcb, 0x4a, 0x59, 0x15, 0xf3, 0x29, 0xda, 0x62, 0x1c, 0x55, 0xb5, 0xaa, 0xc3, - 0xfd, 0xe2, 0x8e, 0xb8, 0x9a, 0x49, 0x00, 0xd5, 0x2c, 0x62, 0x02, 0xae, 0xa5, 0x4c, 0x86, 0x71, - 0x28, 0x95, 0x86, 0x61, 0x0e, 0x19, 0xef, 0x9a, 0xb4, 0x01, 0xee, 0xa7, 0x5a, 0x17, 0x5b, 0xc5, - 0xeb, 0xd2, 0x26, 0xd8, 0xc8, 0x64, 0x5f, 0x8c, 0x7e, 0x3d, 0x65, 0x31, 0xfb, 0xf4, 0x55, 0x4d, - 0x81, 0xba, 0xa1, 0xef, 0x9a, 0xe2, 0x0d, 0xe9, 0x2b, 0x60, 0x7b, 0xd2, 0x62, 0xea, 0xca, 0x1e, - 0xd4, 0x65, 0xa5, 0x3c, 0xe4, 0xe7, 0x6e, 0xa6, 0xd8, 0x7e, 0xe4, 0x1b, 0x65, 0xb3, 0x22, 0x1b, - 0xe2, 0xad, 0x94, 0x3d, 0x65, 0xd4, 0xf4, 0x17, 0xbb, 0x15, 0x79, 0x4f, 0x15, 0x6f, 0x8f, 0x19, - 0x57, 0x57, 0x62, 0xda, 0x2d, 0x1a, 0xa8, 0x0e, 0xf5, 0xaf, 0xed, 0x8b, 0x85, 0x31, 0xa6, 0x18, - 0xa7, 0x2e, 0x6b, 0xa5, 0x32, 0x92, 0x9f, 0xcb, 0x5a, 0x45, 0xde, 0xd1, 0x2a, 0x9a, 0xb9, 0x2f, - 0xde, 0x91, 0xde, 0x03, 0x4f, 0x52, 0xb8, 0xe8, 0x0e, 0xd1, 0x14, 0x04, 0xd5, 0x92, 0x66, 0x98, - 0x90, 0xba, 0x4e, 0xf1, 0x6e, 0xb2, 0x17, 0x36, 0xe4, 0x6a, 0x25, 0xee, 0x62, 0xc5, 0x7b, 0x52, - 0x01, 0xdc, 0x18, 0xa5, 0x53, 0x95, 0x6d, 0xf6, 0xaf, 0x24, 0x35, 0x45, 0x15, 0xef, 0x8f, 0x31, - 0x3a, 0x5d, 0x19, 0x76, 0xc3, 0xa8, 0xa6, 0xd7, 0x90, 0x5c, 0x14, 0x1f, 0x48, 0x77, 0xc1, 0xad, - 0x49, 0xe7, 0x22, 0xfd, 0xb7, 0x8a, 0x87, 0xc9, 0xb6, 0x1f, 0x3f, 0x01, 0xe4, 0x17, 0x06, 0x52, - 0xf4, 0x9a, 0xa1, 0x57, 0x54, 0xf1, 0xd1, 0xc6, 0x1f, 0x0b, 0x60, 0x71, 0xf0, 0xcf, 0xce, 0xa4, - 0x9b, 0x60, 0xad, 0x37, 0x82, 0x61, 0xca, 0x66, 0xc3, 0x18, 0x3a, 0xbe, 0xd7, 0xc0, 0xca, 0x30, - 0x81, 0xd1, 0x50, 0x14, 0xe2, 0xa9, 0x84, 0xc4, 0xce, 0x3d, 0xad, 0x5e, 0x57, 0x8b, 0xe2, 0x94, - 0xb4, 0x0a, 0x96, 0x86, 0x3b, 0x55, 0x08, 0x75, 0x28, 0x4e, 0x27, 0xf1, 0xc9, 0x3b, 0x3a, 0xa4, - 0x27, 0xf1, 0xc6, 0x4f, 0xa6, 0xc0, 0xb4, 0x62, 0xca, 0xd2, 0x15, 0x70, 0x49, 0x31, 0xe5, 0xd1, - 0xbf, 0x95, 0x21, 0x8d, 0x72, 0xc3, 0x2c, 0x93, 0x89, 0xd5, 0x54, 0xc5, 0xd4, 0x49, 0x1c, 0xb1, - 0x02, 0xae, 0xd0, 0x76, 0xc5, 0xd4, 0x9e, 0x93, 0xf0, 0xc2, 0x30, 0x34, 0xbd, 0x46, 0xc2, 0x87, - 0x5e, 0x07, 0x81, 0x8c, 0xa0, 0xfa, 0x71, 0x43, 0x35, 0x4c, 0x43, 0x9c, 0x8e, 0x3a, 0xea, 0x50, - 0xad, 0x6a, 0x8d, 0x2a, 0x32, 0x1a, 0xf5, 0xba, 0x0e, 0x4d, 0x71, 0x26, 0xea, 0x30, 0x21, 0xd9, - 0xd2, 0x45, 0x54, 0x54, 0x9f, 0x6b, 0xc4, 0x17, 0xce, 0x46, 0xb2, 0x1b, 0xf5, 0x12, 0x94, 0x8b, - 0x2a, 0xda, 0x91, 0x6b, 0x35, 0x15, 0x8a, 0xe7, 0x22, 0x86, 0x1d, 0xad, 0x52, 0xd1, 0x6a, 0x25, - 0x64, 0x34, 0xaa, 0x55, 0x19, 0xee, 0x8b, 0xe7, 0xa3, 0x19, 0x70, 0xd9, 0x15, 0xcd, 0x30, 0xc5, - 0x39, 0xfa, 0xe7, 0x23, 0xfd, 0xc6, 0xaa, 0x5e, 0xd3, 0x4c, 0x1d, 0x6a, 0xb5, 0x92, 0x38, 0x4f, - 0xff, 0xd6, 0xc4, 0x94, 0x91, 0xfa, 0x35, 0x53, 0x85, 0x35, 0xb9, 0x82, 0xe4, 0x46, 0x51, 0x33, - 0x91, 0x61, 0xea, 0x50, 0x2e, 0xa9, 0x22, 0x88, 0x00, 0xe8, 0x7b, 0x04, 0x85, 0x41, 0x74, 0xb7, - 0x5f, 0x53, 0xc4, 0x0b, 0x92, 0x08, 0x16, 0x28, 0x5f, 0xcd, 0x84, 0x32, 0xd2, 0x8a, 0xe2, 0xc2, - 0xc6, 0xbf, 0x9d, 0x03, 0x4b, 0x89, 0x75, 0xe7, 0xe4, 0xb4, 0xd0, 0x6a, 0xa6, 0x5a, 0x62, 0x76, - 0x8e, 0xd4, 0x1a, 0xd4, 0x2b, 0x15, 0xb4, 0xa7, 0xd5, 0x86, 0xff, 0x82, 0xe5, 0x36, 0x58, 0x1f, - 0x47, 0x68, 0x54, 0x64, 0x65, 0x4f, 0x14, 0x88, 0x91, 0x8e, 0x23, 0x21, 0x86, 0xa7, 0x6b, 0x45, - 0x45, 0x9c, 0x22, 0xf1, 0xc7, 0x38, 0xaa, 0xba, 0x5c, 0x52, 0x61, 0xb1, 0x61, 0xee, 0x8b, 0xd3, - 0x93, 0xe4, 0xa9, 0x55, 0x59, 0xab, 0x88, 0x33, 0x24, 0x58, 0x1c, 0x47, 0xf2, 0x4c, 0x83, 0xb2, - 0x38, 0x2b, 0xdd, 0x01, 0x37, 0xc7, 0x51, 0x50, 0x83, 0x83, 0x45, 0xf1, 0x1c, 0xd9, 0xd9, 0xe3, - 0x88, 0xaa, 0xb2, 0x69, 0xaa, 0xb0, 0xaa, 0x1b, 0xa6, 0x78, 0x7e, 0xd2, 0xf4, 0xaa, 0x06, 0x32, - 0x55, 0xb9, 0x6a, 0x88, 0x73, 0x93, 0xa8, 0xf4, 0xba, 0x51, 0x52, 0x6b, 0x9a, 0x2a, 0xce, 0x4f, - 0x82, 0x4e, 0x96, 0x53, 0x04, 0x13, 0x27, 0x27, 0x57, 0x77, 0xc5, 0x0b, 0x93, 0x71, 0x2b, 0x65, - 0xad, 0xa6, 0xd2, 0xc5, 0x97, 0xbe, 0x0c, 0x1e, 0xa7, 0xd3, 0xa1, 0x92, 0x66, 0x96, 0x1b, 0x3b, - 0x74, 0xc7, 0x90, 0x9d, 0x72, 0x51, 0xda, 0x02, 0x6f, 0x65, 0x60, 0x53, 0x34, 0xa8, 0x54, 0x54, - 0x45, 0x13, 0x17, 0x89, 0xf7, 0xc9, 0x26, 0xa7, 0x22, 0xef, 0x88, 0x97, 0xc8, 0x09, 0x97, 0x81, - 0xfc, 0x99, 0x5a, 0xdb, 0xd3, 0x6a, 0x86, 0x28, 0x66, 0xa4, 0x97, 0x6b, 0x86, 0xb6, 0x53, 0x51, - 0xc5, 0xcb, 0x93, 0xd4, 0x43, 0xce, 0x42, 0x4d, 0x51, 0x6b, 0xfa, 0x0b, 0x51, 0x9a, 0xb4, 0x60, - 0xbd, 0x1d, 0x74, 0x85, 0x9c, 0x1b, 0x63, 0x2d, 0x49, 0x36, 0xe5, 0xa2, 0x5e, 0x42, 0x5a, 0x4d, - 0xd1, 0x8a, 0x6a, 0xcd, 0x44, 0x55, 0xb9, 0x26, 0x97, 0xd4, 0xaa, 0x5a, 0x33, 0xc5, 0xab, 0x1b, - 0x1f, 0x81, 0xf3, 0xfc, 0x21, 0x9e, 0x38, 0x86, 0x5d, 0x55, 0x36, 0x49, 0x30, 0x31, 0xe2, 0x54, - 0xa3, 0x8e, 0x61, 0x37, 0x23, 0x6c, 0xfc, 0xa1, 0x00, 0xd6, 0x26, 0x94, 0xc9, 0x13, 0xb5, 0x47, - 0xcc, 0x50, 0x55, 0xf4, 0x6a, 0x55, 0xad, 0x15, 0x19, 0xc8, 0x44, 0x07, 0xbe, 0x01, 0xee, 0x4f, - 0x26, 0xaf, 0xe9, 0x26, 0xa3, 0x15, 0x88, 0x0a, 0x27, 0xd3, 0x16, 0xf5, 0x9a, 0x2a, 0x4e, 0xed, - 0x7c, 0xe3, 0x6f, 0x7f, 0x7a, 0x43, 0xf8, 0xbb, 0x9f, 0xde, 0x10, 0xfe, 0xf1, 0xa7, 0x37, 0x84, - 0x4f, 0xf4, 0x23, 0x37, 0x7c, 0xd9, 0x3d, 0xd8, 0xb4, 0xbd, 0xd6, 0xd6, 0x91, 0x6f, 0x9d, 0xb8, - 0x2c, 0x51, 0x6b, 0x35, 0xb7, 0x7a, 0xff, 0x73, 0x6b, 0x75, 0xdc, 0xad, 0x23, 0xdc, 0xde, 0xa2, - 0x3f, 0x69, 0xd8, 0x3a, 0xf2, 0x86, 0xfe, 0xf8, 0xf6, 0x83, 0xd8, 0xd7, 0x93, 0xc7, 0x07, 0xe7, - 0x28, 0xd9, 0x93, 0xff, 0x0d, 0x00, 0x00, 0xff, 0xff, 0x1b, 0x04, 0x74, 0xeb, 0x28, 0x57, 0x00, - 0x00, + 0x01, 0x72, 0xcc, 0x25, 0xd8, 0x5c, 0x72, 0xcb, 0x29, 0x01, 0xf2, 0x85, 0x04, 0xf5, 0x41, 0x89, + 0x92, 0x28, 0x91, 0x33, 0xe9, 0xc5, 0x02, 0xdd, 0x37, 0xa9, 0xea, 0xbd, 0x7a, 0xbf, 0x7a, 0xf5, + 0xea, 0xd5, 0xab, 0x7a, 0x4f, 0x02, 0x8f, 0x42, 0xdc, 0xc4, 0x1d, 0xcf, 0x0f, 0xb7, 0xba, 0x81, + 0x75, 0x84, 0xf1, 0x09, 0x6e, 0x87, 0xc1, 0xd6, 0xc9, 0xe3, 0xf8, 0xd7, 0xcd, 0x8e, 0xef, 0x85, + 0x9e, 0xb4, 0x12, 0x91, 0x6e, 0xc6, 0xfb, 0x4e, 0x1e, 0x17, 0x36, 0x80, 0xd4, 0xd0, 0x76, 0xac, + 0x76, 0x1b, 0xfb, 0x4a, 0xd3, 0xb5, 0x8f, 0x55, 0xd2, 0x23, 0x5d, 0x05, 0xb3, 0x56, 0x13, 0xfb, + 0x61, 0x5e, 0xb8, 0x25, 0x3c, 0x9c, 0x87, 0xec, 0x4b, 0x61, 0x17, 0x3c, 0x6c, 0x68, 0x7a, 0xfb, + 0xc0, 0xb3, 0x7c, 0x47, 0xf1, 0x5a, 0x9d, 0x26, 0x0e, 0x71, 0xc9, 0x33, 0xbd, 0xa2, 0x15, 0xbc, + 0x64, 0x8d, 0xfd, 0x11, 0xae, 0x81, 0xb9, 0x6e, 0x80, 0xfd, 0xb6, 0xd5, 0xc2, 0x7c, 0x90, 0xde, + 0xf7, 0xc2, 0x3d, 0x70, 0xa7, 0x37, 0x8e, 0xec, 0x38, 0xbb, 0xae, 0x1f, 0x84, 0x10, 0x07, 0x5e, + 0xd7, 0xb7, 0x71, 0x7f, 0x88, 0xc2, 0x46, 0x4c, 0xdc, 0x30, 0x59, 0xc5, 0x0a, 0xe3, 0x80, 0x0b, + 0x1f, 0x83, 0xdb, 0x3d, 0x5a, 0x03, 0x87, 0x8a, 0x8f, 0x1d, 0xdc, 0x0e, 0x5d, 0xab, 0x69, 0x74, + 0x0f, 0x5a, 0x6e, 0x98, 0x8e, 0x29, 0x3e, 0xc0, 0x27, 0x5d, 0x1c, 0x84, 0xae, 0xd7, 0x6e, 0x5b, + 0xae, 0x8f, 0xb3, 0x0e, 0xf0, 0xcb, 0xe0, 0x5e, 0x6f, 0x00, 0x88, 0x8f, 0xdc, 0x80, 0x00, 0x7c, + 0x69, 0x35, 0x9b, 0xb8, 0x7d, 0x94, 0x75, 0x10, 0x69, 0x15, 0xcc, 0xb5, 0x0e, 0x2d, 0x14, 0x9e, + 0x75, 0x70, 0x7e, 0x8a, 0xf6, 0x9d, 0x6f, 0x1d, 0x5a, 0xe6, 0x59, 0x07, 0x4b, 0xeb, 0x00, 0x34, + 0xbd, 0x23, 0xb7, 0x8d, 0x0e, 0x9b, 0xde, 0x69, 0x7e, 0x9a, 0x76, 0xce, 0xd3, 0x96, 0xdd, 0xa6, + 0x77, 0xca, 0xf0, 0x43, 0x6c, 0x7b, 0x27, 0xd8, 0x3f, 0x53, 0x3c, 0x07, 0x07, 0x8a, 0xd7, 0x0e, + 0xdd, 0x76, 0x17, 0x67, 0x5c, 0x94, 0x0f, 0xc1, 0xfa, 0xc8, 0x00, 0x9d, 0xb3, 0x8c, 0xcc, 0x1f, + 0x81, 0x1b, 0x43, 0xcc, 0x75, 0xdf, 0x6d, 0x87, 0x19, 0xb9, 0x0b, 0x40, 0x2c, 0xba, 0x01, 0x65, + 0xae, 0xe2, 0xd0, 0x72, 0xac, 0xd0, 0x92, 0x16, 0xc1, 0x94, 0xeb, 0x70, 0xca, 0x29, 0xd7, 0x29, + 0x58, 0x20, 0x1f, 0xd1, 0x44, 0x36, 0xd0, 0xa3, 0x55, 0xc1, 0x9c, 0xcf, 0xdb, 0x28, 0xc7, 0xe2, + 0xf6, 0xa3, 0xcd, 0x31, 0xf6, 0xbe, 0x39, 0x3c, 0x08, 0xec, 0xb1, 0x16, 0x8e, 0x81, 0x14, 0xf5, + 0x1a, 0x21, 0xee, 0x18, 0xa1, 0x15, 0x76, 0x03, 0xe9, 0x63, 0x70, 0x2e, 0xa0, 0x9f, 0xf8, 0xd0, + 0x0f, 0x52, 0x87, 0x66, 0x8c, 0x90, 0xb3, 0x91, 0xbd, 0x84, 0x7d, 0xdf, 0xf3, 0xf9, 0x82, 0xb2, + 0x2f, 0x85, 0x3f, 0x11, 0xc0, 0x72, 0x43, 0x8b, 0xb1, 0xf8, 0x21, 0x76, 0x98, 0xaa, 0x54, 0x30, + 0xd7, 0xe2, 0x53, 0xa3, 0x32, 0x2f, 0x64, 0x98, 0x4e, 0xa4, 0x0b, 0xd8, 0x63, 0x95, 0x94, 0x1e, + 0xf0, 0x29, 0x3a, 0xc8, 0x5b, 0x19, 0x80, 0x47, 0xb3, 0x8e, 0xc0, 0x17, 0xfe, 0x5b, 0x00, 0xb7, + 0xfa, 0x30, 0x23, 0xa5, 0x19, 0xb8, 0x89, 0x6d, 0xb2, 0x43, 0x5e, 0x29, 0xe0, 0x6a, 0x6c, 0x19, + 0x19, 0xe4, 0xc7, 0x99, 0x97, 0xb1, 0x3f, 0x5c, 0x34, 0x44, 0x6c, 0xfe, 0xd3, 0x5f, 0x7c, 0xfe, + 0xbf, 0x31, 0x45, 0x9c, 0x50, 0x44, 0xa0, 0xb5, 0x43, 0x7c, 0xe4, 0x5b, 0x64, 0xe6, 0xf2, 0x0b, + 0x43, 0xd7, 0x8a, 0x8a, 0xe2, 0xb5, 0xdb, 0xd8, 0x0e, 0x5f, 0x7b, 0x3d, 0xfc, 0x68, 0x2a, 0x6e, + 0x07, 0x45, 0x2b, 0xb4, 0x0e, 0xac, 0x00, 0xc3, 0xa2, 0xa1, 0xb6, 0x7d, 0xaf, 0xd9, 0x7c, 0xdd, + 0xe7, 0x2f, 0x3d, 0x05, 0xf9, 0x80, 0x1a, 0x3d, 0x76, 0x50, 0x34, 0x72, 0x80, 0x6c, 0xaf, 0xdb, + 0x0e, 0xf3, 0x33, 0xb7, 0x84, 0x87, 0xd3, 0x70, 0x39, 0xea, 0x8f, 0xa0, 0x04, 0x0a, 0xe9, 0x2d, + 0xfc, 0xbb, 0x00, 0xae, 0xf7, 0x35, 0xb7, 0xd7, 0x3d, 0xc0, 0xea, 0xde, 0x1b, 0xa2, 0xb5, 0xc2, + 0x33, 0x90, 0x6f, 0x68, 0x8a, 0xd5, 0x6c, 0x9a, 0x9e, 0x4c, 0xfd, 0x45, 0xec, 0x40, 0xd8, 0x04, + 0xd3, 0x36, 0x9f, 0xf1, 0xe2, 0xf6, 0xf5, 0xb1, 0xa3, 0x2b, 0xa6, 0x0c, 0x09, 0x61, 0xe1, 0x7b, + 0xb3, 0x71, 0x3d, 0x16, 0x71, 0xa7, 0xe9, 0x9d, 0x19, 0xd8, 0x3f, 0x71, 0x6d, 0xfc, 0xda, 0x5b, + 0xdf, 0x11, 0xb8, 0xe8, 0xd0, 0x09, 0xa3, 0x16, 0x0e, 0x5f, 0x7a, 0x0e, 0x35, 0xb9, 0xc5, 0xed, + 0x9d, 0xb1, 0x63, 0x4d, 0x52, 0xd4, 0x26, 0x6b, 0xaa, 0xd2, 0x91, 0xe0, 0x82, 0x13, 0xfb, 0x26, + 0x59, 0xe0, 0x02, 0x17, 0x44, 0x43, 0x90, 0x59, 0x2a, 0xe6, 0xe7, 0xfe, 0x2f, 0x62, 0x48, 0xec, + 0x02, 0x81, 0xd3, 0xfb, 0x5c, 0x40, 0x60, 0x21, 0x0e, 0x40, 0x5a, 0x07, 0xab, 0x45, 0xb5, 0x5e, + 0xd1, 0xf7, 0x51, 0x55, 0x35, 0xcb, 0x7a, 0x11, 0x35, 0x6a, 0x46, 0x5d, 0x55, 0xb4, 0x5d, 0x4d, + 0x2d, 0x8a, 0x39, 0x69, 0x19, 0x48, 0x83, 0xdd, 0x72, 0xc3, 0xd4, 0x45, 0x41, 0xca, 0x83, 0xab, + 0x83, 0xed, 0x55, 0xb9, 0xd6, 0x90, 0x2b, 0xe2, 0x54, 0x01, 0x03, 0xd0, 0x17, 0x2d, 0xad, 0x81, + 0x15, 0x4e, 0x67, 0xee, 0xd7, 0xd5, 0xa1, 0xc1, 0x6f, 0x80, 0x6b, 0xf1, 0x4e, 0xad, 0x66, 0x98, + 0x72, 0xa5, 0x82, 0x0c, 0x05, 0x6a, 0x75, 0x53, 0x14, 0xa4, 0x6b, 0x60, 0x39, 0xde, 0x2f, 0x57, + 0xe5, 0x4f, 0xf5, 0x1a, 0x52, 0x15, 0x43, 0x9c, 0x2a, 0xfc, 0x70, 0x06, 0xdc, 0xed, 0xcf, 0x5f, + 0xf1, 0xb1, 0x15, 0xe2, 0xe8, 0xdb, 0x99, 0xe2, 0xb5, 0x0f, 0xdd, 0xa3, 0xd7, 0xde, 0x2e, 0x3d, + 0x70, 0xd1, 0xa6, 0x33, 0x1d, 0xb4, 0xcb, 0x67, 0x19, 0x0c, 0x66, 0xbc, 0xc2, 0x36, 0xd9, 0xe7, + 0xc8, 0x3e, 0xed, 0xd8, 0xb7, 0xc2, 0x9f, 0x09, 0x60, 0x21, 0xde, 0x4d, 0xac, 0x47, 0xd1, 0x6b, + 0xbb, 0x5a, 0x29, 0xd9, 0x7a, 0x46, 0xba, 0xe5, 0x17, 0x06, 0x52, 0x95, 0x6d, 0x64, 0x18, 0x55, + 0x51, 0x20, 0xeb, 0x9f, 0xdc, 0xad, 0x6a, 0x8a, 0x2a, 0x4e, 0x25, 0xb3, 0xc3, 0xa2, 0x41, 0x4d, + 0x60, 0x5a, 0x5a, 0x05, 0x4b, 0x09, 0xec, 0x7b, 0x86, 0x38, 0x53, 0xf8, 0x2f, 0x01, 0xdc, 0x4c, + 0x38, 0x2f, 0xf9, 0xbd, 0xe0, 0xb5, 0x77, 0xfc, 0xbf, 0x32, 0x15, 0xdf, 0x1c, 0xd1, 0xf4, 0xd9, + 0xca, 0x75, 0x7d, 0x5c, 0x35, 0x2b, 0xc6, 0x6b, 0xaf, 0x83, 0xdf, 0x9e, 0x02, 0x8f, 0xe3, 0x0e, + 0x32, 0x38, 0x0e, 0xbd, 0x0e, 0x39, 0x06, 0x4f, 0x70, 0xd1, 0xf5, 0xb1, 0x1d, 0x7a, 0xfe, 0x99, + 0xe9, 0x79, 0xcd, 0x40, 0x6b, 0x07, 0xa1, 0xf5, 0x06, 0x44, 0x03, 0xdf, 0x99, 0x02, 0x9b, 0x69, + 0x0a, 0xe9, 0x99, 0xc8, 0x6b, 0xaf, 0x8d, 0xbf, 0x98, 0x02, 0xf7, 0xfb, 0xda, 0x90, 0xbb, 0xa1, + 0x17, 0x7d, 0x8e, 0x85, 0x90, 0xaf, 0xfd, 0x09, 0xf2, 0x00, 0x5c, 0x4a, 0x0e, 0xa7, 0x17, 0xfd, + 0xc1, 0x30, 0xfa, 0x5b, 0x53, 0xe0, 0x4e, 0x5f, 0x5d, 0xaa, 0xb2, 0x4d, 0x77, 0x4d, 0xfb, 0x4d, + 0xba, 0x8b, 0xfe, 0x9b, 0x00, 0x56, 0x87, 0x23, 0x2e, 0x72, 0x50, 0xbd, 0x61, 0x13, 0x67, 0x91, + 0x43, 0xcd, 0x73, 0x5e, 0x7f, 0x1f, 0xf1, 0x9f, 0x02, 0xb8, 0x31, 0x3c, 0x71, 0xb9, 0xd3, 0x21, + 0x61, 0xf6, 0x1b, 0x10, 0x44, 0x7c, 0x7b, 0x0a, 0x3c, 0x9a, 0x10, 0x44, 0x68, 0x72, 0xb5, 0xee, + 0x35, 0x5d, 0xfb, 0xec, 0xb5, 0x57, 0xc4, 0xff, 0x08, 0xa0, 0xd0, 0x57, 0x44, 0xdd, 0x77, 0xdb, + 0xb6, 0xdb, 0xb1, 0x9a, 0xc1, 0x9b, 0x73, 0x58, 0xfe, 0x87, 0x00, 0xd6, 0xfb, 0x1a, 0x30, 0x71, + 0x10, 0xf2, 0x87, 0xb7, 0x37, 0xc1, 0xef, 0xff, 0xab, 0x00, 0xf2, 0x31, 0x2f, 0xc0, 0x13, 0x2f, + 0xce, 0x6b, 0x3f, 0xef, 0x35, 0xe2, 0xf5, 0xb9, 0xb7, 0xc7, 0xa7, 0xd0, 0x6b, 0xc6, 0x93, 0x43, + 0x37, 0x89, 0x41, 0x0c, 0x74, 0x1a, 0xd6, 0x49, 0x9c, 0xe0, 0x36, 0xb9, 0x80, 0x0d, 0x72, 0x93, + 0x70, 0xa1, 0x19, 0x23, 0x79, 0x1b, 0x6c, 0x0c, 0x91, 0x3c, 0x77, 0xf1, 0x69, 0xd1, 0xb3, 0xbb, + 0x2d, 0xdc, 0x0e, 0xad, 0xc1, 0x07, 0xab, 0xc2, 0x5f, 0x09, 0x60, 0x49, 0x0e, 0x02, 0x97, 0xd8, + 0x1e, 0x5d, 0x82, 0x9e, 0xed, 0x3d, 0x00, 0x97, 0x6c, 0xaf, 0x7d, 0x82, 0xfd, 0x80, 0xf2, 0xa0, + 0x5e, 0xe2, 0x62, 0x31, 0xde, 0xac, 0x39, 0xd2, 0x6d, 0xb0, 0x10, 0x7a, 0xa1, 0xd5, 0x44, 0xa1, + 0x77, 0x8c, 0xdb, 0xec, 0x61, 0x7e, 0x1a, 0x5e, 0xa0, 0x6d, 0x26, 0x6d, 0x92, 0xee, 0x80, 0x8b, + 0x1d, 0xdf, 0x6b, 0x75, 0xc2, 0x88, 0x66, 0x9a, 0xd2, 0x2c, 0xb0, 0x46, 0x4e, 0xf4, 0x16, 0xb8, + 0x6c, 0xf7, 0x30, 0x44, 0x84, 0x2c, 0x6e, 0x12, 0xfb, 0x1d, 0x8c, 0xb8, 0xf0, 0xf7, 0x02, 0xb8, + 0xca, 0x70, 0xab, 0x9f, 0x61, 0xbb, 0xfb, 0x05, 0x60, 0xaf, 0x03, 0xd0, 0xf6, 0x1c, 0xcc, 0xe3, + 0x33, 0x06, 0x7a, 0x9e, 0xb4, 0xd0, 0xd0, 0x6c, 0x64, 0x56, 0xd3, 0x19, 0x66, 0x35, 0x93, 0x75, + 0x56, 0xb3, 0x63, 0x66, 0xf5, 0x14, 0x5c, 0x63, 0x93, 0xaa, 0xe1, 0x53, 0x25, 0x06, 0xb7, 0x97, + 0x6d, 0xb2, 0xad, 0x10, 0x1f, 0x79, 0xfe, 0x59, 0x94, 0x6d, 0x8a, 0xbe, 0x17, 0xfe, 0x52, 0x00, + 0x57, 0x18, 0xab, 0x6c, 0xdb, 0x38, 0x08, 0x20, 0xfe, 0x46, 0x17, 0x07, 0x21, 0xc1, 0x18, 0xd9, + 0x2f, 0x7b, 0xfd, 0x62, 0x8c, 0x0b, 0x51, 0x23, 0x7d, 0x4e, 0xfa, 0x99, 0xac, 0xe0, 0x0f, 0x05, + 0xb0, 0x10, 0x21, 0x26, 0xcd, 0xd2, 0x32, 0x38, 0x67, 0xd1, 0x4f, 0x1c, 0x23, 0xff, 0xf6, 0xb3, + 0x41, 0x77, 0x17, 0x48, 0x4c, 0x91, 0x15, 0x37, 0x08, 0xc7, 0xe6, 0xef, 0xbe, 0x06, 0xc4, 0x3e, + 0x15, 0xdb, 0x73, 0x52, 0x69, 0xc4, 0x77, 0x8d, 0xf7, 0x13, 0xa3, 0x22, 0xfa, 0xde, 0x6b, 0x70, + 0xf0, 0x46, 0xc7, 0xf9, 0xe9, 0x0d, 0x5e, 0xc4, 0xc4, 0xf7, 0xbe, 0xba, 0xc1, 0x2d, 0xb0, 0x1c, + 0xef, 0x6f, 0x1d, 0x44, 0x61, 0xde, 0x4f, 0x55, 0xc4, 0xab, 0x56, 0x51, 0x82, 0x88, 0x57, 0xad, + 0xa8, 0x5f, 0x8c, 0x8b, 0x28, 0xf9, 0x56, 0x3b, 0x0c, 0x4c, 0xaf, 0x11, 0x60, 0x5f, 0xda, 0x04, + 0x57, 0xa8, 0x63, 0x42, 0xbe, 0xd7, 0xc4, 0x01, 0x3a, 0x22, 0x7d, 0x98, 0x99, 0xde, 0x2c, 0xbc, + 0x4c, 0xbb, 0x88, 0x6b, 0x0f, 0x4a, 0xac, 0x43, 0x7a, 0x17, 0x5c, 0x65, 0xf4, 0xa1, 0x6f, 0xb9, + 0x61, 0x9f, 0x61, 0x8a, 0x32, 0x48, 0xb4, 0xcf, 0xa4, 0x5d, 0x9c, 0xa3, 0xf0, 0x83, 0xe9, 0xb8, + 0x70, 0x88, 0x4f, 0x5c, 0x7c, 0xfa, 0x8a, 0x57, 0x49, 0x7a, 0x0a, 0x56, 0x1d, 0xeb, 0x2c, 0x40, + 0x1d, 0x2b, 0x08, 0x51, 0x1b, 0x7f, 0x16, 0x22, 0xab, 0xeb, 0xb8, 0x21, 0x22, 0x0b, 0xc5, 0xa1, + 0x2d, 0x11, 0x82, 0xba, 0x45, 0x5c, 0xde, 0x67, 0xa1, 0x4c, 0x7a, 0x8b, 0x04, 0xc2, 0x2e, 0xb8, + 0xd9, 0xa2, 0x2a, 0x0f, 0x5e, 0xba, 0x1d, 0xe4, 0xe3, 0x6f, 0x74, 0x5d, 0x1f, 0x93, 0x03, 0x2c, + 0x40, 0xf6, 0x4b, 0xab, 0x7d, 0x84, 0x1d, 0xba, 0xc7, 0xe7, 0xe0, 0x7a, 0x9f, 0x0c, 0xc6, 0xa8, + 0x14, 0x46, 0x24, 0x3d, 0x05, 0x79, 0x9f, 0x4e, 0x0d, 0x1d, 0x92, 0x41, 0x70, 0xdb, 0x3e, 0xeb, + 0x0d, 0x30, 0x43, 0x07, 0x58, 0x66, 0xfd, 0xbb, 0x51, 0x77, 0xc4, 0xf9, 0x11, 0x58, 0xe3, 0x9c, + 0x8e, 0x75, 0x86, 0xbc, 0x43, 0xd4, 0xf2, 0xda, 0xe1, 0xcb, 0x1e, 0xf3, 0x2c, 0x65, 0x5e, 0x61, + 0x24, 0x45, 0xeb, 0x4c, 0x3f, 0xac, 0x92, 0xfe, 0x88, 0xfb, 0x2b, 0x60, 0xb5, 0xdd, 0x25, 0xc0, + 0x08, 0xa7, 0x8f, 0x5b, 0xde, 0x09, 0x76, 0x10, 0x87, 0x9a, 0x3f, 0x47, 0x67, 0xbe, 0xcc, 0x08, + 0xf4, 0x43, 0xc8, 0xba, 0x99, 0x89, 0x05, 0x85, 0xdf, 0x13, 0x46, 0x17, 0xe6, 0x15, 0x1b, 0x9e, + 0xf4, 0x18, 0x2c, 0x59, 0xb4, 0x1f, 0x35, 0xdd, 0x20, 0x44, 0x7c, 0xa2, 0xae, 0xc3, 0xd3, 0xf9, + 0x92, 0x35, 0x24, 0x5f, 0x73, 0x0a, 0xdf, 0x15, 0xc0, 0x6a, 0x2c, 0x55, 0xcc, 0x92, 0x7d, 0xe3, + 0x3c, 0xa3, 0xb4, 0x03, 0x66, 0x8e, 0xdd, 0x36, 0x1b, 0x6f, 0x71, 0x7b, 0x73, 0x2c, 0xca, 0x91, + 0x11, 0xf7, 0xdc, 0xb6, 0x03, 0x29, 0xaf, 0xb4, 0x06, 0xe6, 0xbb, 0x01, 0xf6, 0x11, 0x2d, 0xaf, + 0x98, 0xee, 0x97, 0x57, 0xd4, 0xac, 0x16, 0x2e, 0x78, 0x24, 0x54, 0x1a, 0xe1, 0xa6, 0x25, 0x07, + 0xec, 0xb4, 0xac, 0x8d, 0xe8, 0x6a, 0x3b, 0x3b, 0x8a, 0x84, 0xbd, 0xea, 0x83, 0x5b, 0x09, 0x02, + 0xa3, 0xc0, 0xf5, 0xa7, 0x23, 0xf3, 0x1f, 0x04, 0x70, 0xa5, 0x57, 0x43, 0x44, 0xf7, 0x26, 0x93, + 0x93, 0xe9, 0x54, 0x8f, 0xbd, 0x42, 0x21, 0xcf, 0x77, 0x8f, 0xdc, 0x36, 0x5f, 0xdd, 0xde, 0x2b, + 0x94, 0x4e, 0x5b, 0xa5, 0x7b, 0x60, 0xd1, 0x6e, 0x7a, 0x5d, 0x07, 0x75, 0x7c, 0xef, 0xc4, 0x75, + 0xb0, 0xcf, 0x95, 0x7d, 0x91, 0xb6, 0xd6, 0x79, 0xa3, 0xa4, 0x83, 0x39, 0x87, 0x5f, 0x57, 0xe9, + 0xd6, 0xb9, 0xb0, 0xfd, 0x24, 0x35, 0x00, 0xc6, 0x4e, 0x74, 0xc3, 0xed, 0xcf, 0x2e, 0x1a, 0xa4, + 0xf0, 0x1c, 0x5c, 0x1b, 0x4f, 0x27, 0xad, 0x80, 0xf3, 0xce, 0x41, 0x7c, 0x76, 0xe7, 0x9c, 0x03, + 0x3a, 0xaf, 0x9b, 0xe0, 0x82, 0x73, 0x80, 0x68, 0x05, 0x98, 0xed, 0x35, 0xf9, 0x9c, 0x80, 0x73, + 0x50, 0xe7, 0x2d, 0x85, 0x7f, 0x11, 0xc0, 0xb5, 0x5d, 0x6c, 0x85, 0x5d, 0x1f, 0x43, 0x6c, 0x7b, + 0xad, 0x16, 0x6e, 0x3b, 0xb1, 0x30, 0x6a, 0xc0, 0xac, 0x84, 0x41, 0xb3, 0x92, 0x3e, 0x00, 0xe7, + 0x0f, 0x19, 0x2b, 0x37, 0xdd, 0x5b, 0x63, 0xe7, 0x18, 0x89, 0x88, 0x18, 0xa4, 0xcf, 0xc0, 0x3a, + 0xff, 0x88, 0xfc, 0x01, 0xb9, 0x28, 0x76, 0x6d, 0x58, 0xdc, 0x7e, 0x2f, 0x75, 0xc4, 0x01, 0x66, + 0x7e, 0x7f, 0x58, 0x3b, 0x1c, 0xdf, 0x59, 0x38, 0x05, 0x57, 0x4d, 0xb9, 0xc4, 0x22, 0x61, 0xfc, + 0x49, 0x17, 0xfb, 0xfc, 0xf9, 0xe0, 0x26, 0x60, 0x61, 0x12, 0x22, 0x71, 0x2d, 0xab, 0xf5, 0x99, + 0x86, 0x80, 0x36, 0xd5, 0x48, 0x4b, 0x9f, 0x00, 0x3b, 0x47, 0x38, 0x0a, 0xad, 0x18, 0x81, 0x4a, + 0x5a, 0x48, 0x94, 0xec, 0x06, 0x28, 0xe8, 0x52, 0x7f, 0xc0, 0x5d, 0xee, 0xbc, 0x1b, 0x18, 0xac, + 0xa1, 0xf0, 0xcf, 0xd3, 0x60, 0x85, 0x39, 0x9a, 0x92, 0x6f, 0x75, 0x5e, 0xca, 0x2f, 0x0c, 0xc3, + 0xb6, 0xda, 0x51, 0x2e, 0xfc, 0x0a, 0x1f, 0xdb, 0xde, 0x46, 0x2e, 0x7f, 0xd8, 0x64, 0x20, 0x66, + 0xe0, 0x65, 0x26, 0xc3, 0xee, 0xbd, 0x78, 0xc6, 0xb0, 0x90, 0xc5, 0x60, 0x58, 0x66, 0x38, 0x16, + 0x72, 0x24, 0x06, 0xfd, 0x40, 0xf0, 0xc8, 0xf7, 0xba, 0x1d, 0x86, 0x66, 0x86, 0x07, 0x82, 0x25, + 0xda, 0xd4, 0x1f, 0x83, 0x1e, 0x9b, 0xd4, 0x4c, 0xa3, 0x31, 0xe8, 0x71, 0x49, 0x6c, 0x9d, 0x11, + 0x74, 0xbc, 0xa6, 0x6b, 0xbb, 0x98, 0xc5, 0xe2, 0x33, 0xf0, 0x22, 0x6d, 0xad, 0xf3, 0x46, 0xe9, + 0x6d, 0x20, 0x71, 0xec, 0xc7, 0x01, 0xb2, 0x9b, 0xdd, 0x20, 0x8c, 0xfc, 0xf6, 0x0c, 0x14, 0x19, + 0xf4, 0xe3, 0x40, 0xe1, 0xed, 0xfd, 0x99, 0xfa, 0x4e, 0x10, 0x9b, 0xe9, 0xf9, 0xd8, 0x4c, 0xa1, + 0x13, 0xf4, 0x67, 0xfa, 0x10, 0xb0, 0x31, 0x50, 0xf0, 0x04, 0x1d, 0x74, 0xed, 0x63, 0x1c, 0x06, + 0xf9, 0x39, 0x4a, 0xcc, 0xc0, 0x19, 0x4f, 0x76, 0x58, 0x2b, 0x39, 0xd6, 0x39, 0xa5, 0xd5, 0x6a, + 0xf6, 0xf6, 0x67, 0x90, 0x9f, 0xa7, 0xd4, 0x0c, 0xa3, 0x61, 0xb5, 0x9a, 0xd1, 0x26, 0x8d, 0x71, + 0x78, 0xae, 0x63, 0xc7, 0x38, 0x40, 0x8c, 0x43, 0x77, 0x1d, 0xbb, 0xcf, 0xd1, 0x53, 0x89, 0x65, + 0xd3, 0x30, 0x21, 0xc8, 0x5f, 0x88, 0xa9, 0x44, 0xe6, 0x8d, 0x85, 0x1f, 0x08, 0xe0, 0x6e, 0x43, + 0x8b, 0x2d, 0xb6, 0xe2, 0x7b, 0xa7, 0xed, 0x67, 0xf8, 0x14, 0x37, 0x8b, 0xee, 0xe1, 0x21, 0xb9, + 0x64, 0xb2, 0x75, 0x7f, 0x0a, 0xf2, 0xd6, 0xe1, 0xe1, 0x60, 0x55, 0x09, 0x8a, 0x15, 0xb2, 0xcd, + 0xc3, 0xe5, 0xa8, 0xbf, 0x57, 0x7a, 0xc5, 0x2e, 0xd8, 0xef, 0x81, 0xe5, 0x51, 0xce, 0x58, 0xd9, + 0xe0, 0xd5, 0x61, 0x3e, 0x9a, 0x7b, 0xdf, 0x05, 0xd7, 0x0d, 0x6c, 0x77, 0x7d, 0x37, 0x3c, 0x83, + 0x74, 0x5b, 0x95, 0x70, 0x08, 0x71, 0xd0, 0x6d, 0xf2, 0x83, 0x40, 0x02, 0x33, 0xb1, 0xad, 0x4e, + 0x3f, 0x93, 0x36, 0x12, 0x77, 0xf0, 0x18, 0x84, 0x7e, 0x2e, 0x58, 0xe0, 0x4a, 0x2f, 0x73, 0xbb, + 0x8b, 0x43, 0xfb, 0x25, 0x63, 0x1f, 0xf5, 0x8e, 0x42, 0x92, 0x77, 0x1c, 0x71, 0xc9, 0x53, 0xa3, + 0x2e, 0xb9, 0xf0, 0x7d, 0x01, 0x48, 0xc4, 0x96, 0x4d, 0x2b, 0x38, 0x26, 0x5b, 0x17, 0xf7, 0x3c, + 0x52, 0x68, 0x05, 0xc7, 0x71, 0x67, 0x37, 0x47, 0x1a, 0xa2, 0x12, 0x49, 0x37, 0x08, 0xba, 0x03, + 0xa3, 0xce, 0xd3, 0x16, 0xda, 0x7d, 0x15, 0xcc, 0x12, 0xef, 0x12, 0x1d, 0x90, 0xec, 0x0b, 0xf1, + 0xfd, 0x3d, 0x3b, 0x8c, 0x65, 0x20, 0x66, 0xe1, 0x62, 0xaf, 0x99, 0x65, 0x20, 0xfe, 0xe6, 0x03, + 0x70, 0xa9, 0x41, 0xbc, 0x10, 0x45, 0xa2, 0xb7, 0xb1, 0x7e, 0x28, 0x35, 0xc0, 0xa5, 0xae, 0x8b, + 0x0e, 0x68, 0xf9, 0x2c, 0xb2, 0x9b, 0xae, 0x7d, 0x9c, 0x1a, 0x6c, 0x8c, 0x56, 0xdb, 0x96, 0x73, + 0xf0, 0x62, 0xd7, 0x8d, 0xb5, 0x4a, 0x3f, 0x14, 0xc0, 0xa3, 0xae, 0x8b, 0x3c, 0x56, 0x4d, 0x8a, + 0xf8, 0x95, 0x0b, 0xa3, 0x23, 0x0f, 0x85, 0x1e, 0x72, 0xa2, 0x72, 0x5b, 0x2e, 0x91, 0x3d, 0xb1, + 0xc8, 0x13, 0x24, 0x66, 0xab, 0xd9, 0x2d, 0xe7, 0xe0, 0x9d, 0xae, 0x9b, 0x4a, 0x2b, 0x7d, 0x47, + 0x00, 0x77, 0x62, 0xe8, 0x2c, 0xc7, 0x41, 0x87, 0xae, 0x4f, 0x63, 0x23, 0xbe, 0xaa, 0x0c, 0x17, + 0x3b, 0xf9, 0x3e, 0x4a, 0xc7, 0x35, 0xbe, 0x06, 0xb8, 0x9c, 0x83, 0x37, 0x7a, 0x90, 0x12, 0xc9, + 0x86, 0x75, 0x95, 0x80, 0xa6, 0x69, 0x85, 0xbd, 0xd5, 0x99, 0xcd, 0xaa, 0xab, 0x94, 0x82, 0xe3, + 0x01, 0x5d, 0x8d, 0xa7, 0x95, 0x7e, 0x5d, 0x00, 0xb7, 0x62, 0xe8, 0x02, 0x1c, 0x22, 0xbb, 0x57, + 0x9b, 0x8c, 0x02, 0x5a, 0x16, 0x4c, 0x9d, 0xe5, 0x85, 0xed, 0x0f, 0xd2, 0x41, 0x8d, 0xab, 0x6c, + 0x2e, 0xe7, 0xe0, 0xf5, 0x1e, 0x9a, 0x04, 0x22, 0xe9, 0x77, 0x04, 0x70, 0x37, 0x06, 0xc3, 0xe7, + 0x75, 0x08, 0x24, 0x44, 0x67, 0x05, 0xca, 0x11, 0x94, 0xf3, 0x14, 0xca, 0xff, 0x4f, 0x87, 0x32, + 0xa9, 0xc4, 0xb9, 0x9c, 0x83, 0xb7, 0x7a, 0x70, 0xc6, 0x10, 0x46, 0x9a, 0xf1, 0x79, 0xd1, 0x30, + 0xb2, 0xc9, 0x29, 0x8b, 0x6c, 0x5e, 0xb4, 0xcc, 0x97, 0x6b, 0x2e, 0x55, 0x33, 0x29, 0x25, 0xcf, + 0x4c, 0x33, 0xe3, 0x89, 0xa4, 0xcf, 0xc0, 0xf5, 0x24, 0x14, 0x9d, 0x33, 0x8e, 0x60, 0x9e, 0x22, + 0xf8, 0x72, 0x76, 0x04, 0xf1, 0x9a, 0xe9, 0x72, 0x0e, 0xe6, 0x47, 0xa4, 0x73, 0x02, 0xe9, 0x97, + 0xc0, 0xfa, 0xa8, 0xe4, 0x8e, 0xef, 0xb6, 0x43, 0x2e, 0x1a, 0x50, 0xd1, 0xef, 0x67, 0x15, 0x3d, + 0x54, 0x71, 0x5d, 0xce, 0xc1, 0xd5, 0x21, 0xd9, 0x7d, 0x0a, 0xa9, 0x09, 0x56, 0xbb, 0x2e, 0x72, + 0xb8, 0x13, 0x27, 0x51, 0x97, 0x4f, 0x8e, 0x12, 0x3a, 0x38, 0x3d, 0xd4, 0x2e, 0x6c, 0x6f, 0x65, + 0xa8, 0xe2, 0x89, 0xd7, 0x2d, 0x97, 0x73, 0x70, 0xb9, 0xeb, 0x26, 0x56, 0x34, 0x7f, 0x87, 0x99, + 0x5f, 0x4f, 0x5c, 0xff, 0xac, 0x8b, 0x92, 0xb7, 0x5c, 0xf2, 0x02, 0x95, 0xfc, 0x95, 0x0c, 0x92, + 0x93, 0x4b, 0x91, 0x99, 0xe5, 0xa5, 0x94, 0x2b, 0x7f, 0x93, 0x1a, 0x5e, 0x0f, 0x0c, 0x2f, 0x78, + 0x0b, 0x58, 0xed, 0x1a, 0x07, 0x72, 0x91, 0x02, 0xf9, 0xd2, 0x17, 0xaa, 0x7c, 0x63, 0x36, 0x37, + 0xa1, 0x52, 0xf1, 0x37, 0x99, 0x03, 0xed, 0x23, 0xe0, 0x01, 0x7d, 0x7f, 0x5f, 0x32, 0x10, 0x8b, + 0x14, 0xc4, 0xd3, 0x2c, 0x20, 0x92, 0x0a, 0x8c, 0xca, 0x39, 0x78, 0x33, 0x86, 0x23, 0xb1, 0x06, + 0xe9, 0xf7, 0x99, 0xf7, 0x1c, 0x85, 0x62, 0x47, 0xb9, 0x25, 0xd4, 0x0a, 0x9b, 0x01, 0x07, 0x74, + 0x89, 0x02, 0xfa, 0x7f, 0x9f, 0x03, 0xd0, 0x68, 0xc9, 0x4f, 0x39, 0x07, 0xef, 0x8e, 0xa2, 0xea, + 0xd3, 0x85, 0x4d, 0x5e, 0xf5, 0xf0, 0x63, 0x01, 0x3c, 0x1d, 0x5c, 0x27, 0x5a, 0x30, 0x82, 0x2c, + 0x5a, 0x31, 0x82, 0x9c, 0xa8, 0x64, 0x04, 0x85, 0x9e, 0xd7, 0xe4, 0xc1, 0x64, 0xb3, 0xc9, 0x91, + 0x8a, 0x14, 0xe9, 0xb3, 0x4c, 0xeb, 0x97, 0xa9, 0x30, 0xa7, 0x9c, 0x83, 0x8f, 0xe3, 0x8b, 0x9a, + 0xad, 0x9a, 0xe7, 0x47, 0x02, 0x78, 0x2f, 0xd3, 0x1c, 0xfa, 0xea, 0x66, 0xf8, 0x2f, 0x53, 0xfc, + 0xa5, 0x2f, 0x8c, 0x7f, 0x30, 0x35, 0x58, 0xce, 0xc1, 0xcd, 0x34, 0xf0, 0x43, 0xc9, 0xc4, 0x3f, + 0x10, 0xc0, 0x5b, 0x71, 0xe4, 0x56, 0x97, 0x44, 0x1e, 0xbd, 0x3b, 0x68, 0xac, 0x08, 0x9a, 0x01, + 0x96, 0x28, 0xe0, 0x8f, 0x33, 0x00, 0x9e, 0x54, 0xea, 0x52, 0xce, 0xc1, 0xfb, 0x7d, 0xa0, 0x13, + 0x8b, 0x62, 0xfe, 0x5c, 0x00, 0x5b, 0x29, 0x96, 0xeb, 0x5a, 0x2d, 0x76, 0x79, 0x39, 0xe3, 0x20, + 0xaf, 0x50, 0x90, 0x3b, 0x5f, 0xc4, 0x7e, 0x07, 0xb3, 0xcd, 0xe5, 0x1c, 0x7c, 0x34, 0xc1, 0x88, + 0x35, 0xab, 0x15, 0x4f, 0x4d, 0xff, 0xae, 0x00, 0xee, 0xc7, 0xa1, 0x76, 0x7a, 0x19, 0xdc, 0x91, + 0x75, 0xbf, 0x4a, 0x11, 0x7e, 0x98, 0x01, 0xe1, 0xb8, 0x34, 0x70, 0x39, 0x07, 0x0b, 0x7d, 0x68, + 0x63, 0x93, 0xc5, 0xbf, 0x2a, 0x80, 0xdb, 0x71, 0x4c, 0x21, 0x0e, 0x42, 0x82, 0xa6, 0x3d, 0xe0, + 0x8f, 0x97, 0x52, 0x4f, 0xbf, 0x09, 0x39, 0xd9, 0x72, 0x0e, 0xae, 0xf7, 0x91, 0x24, 0x25, 0x6d, + 0x7d, 0xb0, 0x16, 0xc7, 0x10, 0xc5, 0xb9, 0xd1, 0x39, 0xb4, 0x9c, 0x92, 0x88, 0x1c, 0x97, 0x14, + 0x65, 0xc7, 0xee, 0x98, 0x84, 0x69, 0x13, 0xe4, 0xbb, 0x2e, 0x09, 0xc2, 0xac, 0x10, 0xa3, 0x36, + 0x3e, 0xa5, 0xf7, 0x5f, 0x7e, 0xe2, 0xae, 0xa4, 0x3c, 0x44, 0x8d, 0x4d, 0x47, 0x96, 0x73, 0xf0, + 0x6a, 0xd7, 0x1d, 0xed, 0x94, 0xce, 0xe8, 0x21, 0x3f, 0x2c, 0x2d, 0xb0, 0x4e, 0x22, 0x91, 0xf9, + 0x54, 0x0d, 0x4f, 0x48, 0x72, 0xb2, 0x89, 0x26, 0x13, 0x48, 0xdf, 0x04, 0x37, 0x93, 0x26, 0x4a, + 0x93, 0xa0, 0x5c, 0xf8, 0x6a, 0xea, 0x01, 0x33, 0x31, 0x81, 0x5a, 0xce, 0xc1, 0x6b, 0xc3, 0xb3, + 0xee, 0x93, 0x48, 0x7f, 0xc4, 0x5c, 0xc8, 0x30, 0x02, 0xf6, 0x50, 0x1c, 0x4f, 0xb2, 0x72, 0x34, + 0xd7, 0x28, 0x1a, 0x25, 0x2b, 0x9a, 0x09, 0xb9, 0xda, 0x72, 0x0e, 0xde, 0x1b, 0x02, 0x96, 0x4c, + 0x2d, 0xfd, 0xa9, 0x00, 0x36, 0xe3, 0x26, 0xe8, 0xf6, 0x9f, 0x1a, 0x91, 0x75, 0x1a, 0xb0, 0xa7, + 0x01, 0xbe, 0x2d, 0xb8, 0x55, 0xae, 0xa5, 0x5e, 0x21, 0xb2, 0xfd, 0x5c, 0xa8, 0x9c, 0x83, 0x0f, + 0xfb, 0x56, 0x1a, 0xa7, 0x3d, 0x0d, 0x74, 0xd7, 0xb1, 0x07, 0x7e, 0x5a, 0xf4, 0x5d, 0x01, 0xdc, + 0x4b, 0x0e, 0x19, 0x9c, 0x00, 0x61, 0xfa, 0x28, 0xca, 0xe1, 0x5d, 0xcf, 0x1c, 0x42, 0x25, 0xff, + 0x8a, 0x67, 0x30, 0x84, 0xea, 0xd1, 0x38, 0x41, 0xfc, 0x37, 0x2b, 0x21, 0x33, 0x6b, 0x72, 0xde, + 0x86, 0x1e, 0x62, 0xd9, 0x47, 0xb6, 0x8a, 0x1c, 0xc5, 0x7a, 0xea, 0xd6, 0x4d, 0xfe, 0x59, 0x08, + 0xb7, 0xe8, 0xe4, 0x9f, 0x8c, 0x7c, 0x1d, 0x5c, 0xb6, 0x68, 0x1a, 0x14, 0xf5, 0x93, 0x90, 0xf9, + 0x1b, 0x54, 0xd2, 0xf8, 0x67, 0xf3, 0xc4, 0x94, 0x7d, 0x39, 0x07, 0x45, 0x6b, 0xa8, 0x23, 0x72, + 0x89, 0x71, 0x13, 0xe0, 0x9a, 0xa5, 0xe1, 0x31, 0x9f, 0xd9, 0xcd, 0xd4, 0x0d, 0x3b, 0xe1, 0xa9, + 0x9d, 0xb9, 0xc4, 0x49, 0x6f, 0xf1, 0x3c, 0x54, 0x4e, 0x00, 0xd1, 0x7b, 0x05, 0x60, 0x38, 0x6e, + 0xa5, 0xae, 0xf3, 0xe4, 0x17, 0x78, 0xb6, 0xce, 0x29, 0xaf, 0xf4, 0xbf, 0x26, 0x50, 0x27, 0x12, + 0xdd, 0x1b, 0xbf, 0x11, 0xff, 0x61, 0x6c, 0x74, 0x65, 0xbc, 0x9d, 0xf5, 0xf6, 0x3a, 0xee, 0x67, + 0xb5, 0x03, 0xb7, 0xd7, 0x04, 0x22, 0xe9, 0x53, 0xc0, 0x17, 0x0b, 0xe1, 0xa8, 0x82, 0x21, 0x5f, + 0xa0, 0x52, 0xdf, 0x49, 0x59, 0xf6, 0xc1, 0x8a, 0x87, 0x72, 0x0e, 0x5e, 0xb2, 0x06, 0xdb, 0xa5, + 0x16, 0x58, 0xe1, 0x63, 0x13, 0x07, 0x15, 0x2f, 0x7c, 0xc8, 0xdf, 0x49, 0x79, 0xb9, 0x1f, 0x5f, + 0x7f, 0x50, 0xce, 0xc1, 0x25, 0x2b, 0xa9, 0x57, 0x3a, 0x00, 0x4b, 0xfd, 0x57, 0x12, 0xe6, 0x18, + 0xd9, 0x72, 0xde, 0xa5, 0xc2, 0xde, 0x1e, 0x2b, 0x2c, 0x21, 0xb7, 0x51, 0xce, 0xc1, 0x2b, 0x7e, + 0x42, 0xca, 0xe3, 0x14, 0x5c, 0x1f, 0xf3, 0xb8, 0xce, 0x44, 0xdd, 0x4b, 0x99, 0xd7, 0xf8, 0x84, + 0x00, 0x71, 0xf8, 0x87, 0xe3, 0xd3, 0x05, 0x07, 0x80, 0xcf, 0x1a, 0xf1, 0x8c, 0x99, 0xcf, 0x4a, + 0x2b, 0xf2, 0xf7, 0x53, 0x26, 0x97, 0x50, 0x8e, 0x41, 0x26, 0x67, 0x25, 0x54, 0x69, 0x54, 0xc0, + 0xc5, 0x9e, 0x0c, 0xba, 0x4a, 0x0f, 0xe8, 0xd8, 0xf7, 0x52, 0xc7, 0x26, 0xc4, 0xe5, 0x1c, 0x5c, + 0xb0, 0xe2, 0x85, 0x14, 0xfb, 0x40, 0x8a, 0x27, 0xf7, 0xd8, 0x8a, 0xe4, 0x1f, 0xa6, 0xd4, 0x51, + 0x0d, 0x17, 0x32, 0x50, 0x6f, 0x32, 0x5c, 0xdc, 0x30, 0x34, 0x74, 0x97, 0xa6, 0xdc, 0xf3, 0x8f, + 0x32, 0x0f, 0xcd, 0x72, 0xf4, 0x83, 0x43, 0xf3, 0xbc, 0xfd, 0xd0, 0xd0, 0x0e, 0xcd, 0x78, 0xe6, + 0x37, 0x32, 0x0f, 0xcd, 0x52, 0xa4, 0x83, 0x43, 0xf3, 0xb4, 0x69, 0x13, 0xac, 0xc6, 0x87, 0x66, + 0x69, 0xd8, 0x48, 0x2f, 0x6f, 0xa5, 0xbc, 0x0b, 0x24, 0x57, 0x32, 0x94, 0x73, 0x70, 0xd9, 0x4a, + 0xae, 0x71, 0x48, 0x96, 0xc6, 0x55, 0xf5, 0xf6, 0xe7, 0x94, 0xd6, 0x53, 0xd8, 0x88, 0x34, 0xae, + 0xb6, 0x64, 0x69, 0x5c, 0x7b, 0xef, 0x7c, 0x4e, 0x69, 0x3d, 0x1d, 0x8e, 0x48, 0xe3, 0x9a, 0x6c, + 0x81, 0x6b, 0x71, 0x69, 0xb4, 0xca, 0x20, 0x20, 0xa7, 0x65, 0x37, 0xc0, 0x7e, 0x7e, 0x33, 0xb3, + 0xb8, 0x78, 0xad, 0xc3, 0xa0, 0xb8, 0x81, 0x2a, 0x88, 0xdf, 0x12, 0x40, 0x21, 0x1e, 0x20, 0xc4, + 0x33, 0x49, 0xfd, 0x67, 0x96, 0xfc, 0x56, 0xea, 0x9b, 0x6c, 0x6a, 0x89, 0x3d, 0x7b, 0x93, 0xed, + 0x91, 0xd9, 0xa3, 0x64, 0xd2, 0x31, 0x58, 0x49, 0x78, 0x61, 0xc1, 0xae, 0x8d, 0xf3, 0xef, 0xa6, + 0x86, 0xd8, 0x63, 0x0a, 0xdc, 0x59, 0x88, 0x3d, 0xd4, 0xe9, 0xda, 0x78, 0x58, 0x58, 0x14, 0x6e, + 0x7a, 0x0e, 0xce, 0x3f, 0xce, 0x2c, 0x6c, 0xa8, 0xa8, 0x7c, 0x50, 0x58, 0xbf, 0x53, 0xfa, 0x1a, + 0xb8, 0x1c, 0x5a, 0x47, 0xfc, 0x1c, 0xc2, 0xe4, 0x40, 0xf4, 0xcf, 0xf2, 0xdb, 0x29, 0x67, 0x51, + 0x52, 0xc2, 0x91, 0x9c, 0x45, 0xa1, 0x75, 0x14, 0x6f, 0x97, 0x42, 0x70, 0x2d, 0xe0, 0xe9, 0x19, + 0xe4, 0xd3, 0x91, 0xd0, 0x11, 0xa6, 0x0f, 0xd9, 0xdd, 0x66, 0x98, 0x7f, 0x92, 0xf2, 0x24, 0x35, + 0x29, 0xb3, 0x53, 0xce, 0xc1, 0x95, 0x20, 0xb9, 0x7f, 0x78, 0x5b, 0xf0, 0x02, 0x07, 0xbe, 0xe5, + 0xdf, 0xcb, 0x6c, 0xa7, 0xf1, 0xb2, 0x98, 0x41, 0x3b, 0x1d, 0x28, 0x98, 0x49, 0x96, 0xc6, 0x37, + 0xe1, 0x97, 0x3e, 0xa7, 0xb4, 0xa4, 0x4d, 0x38, 0x50, 0x05, 0x72, 0x00, 0x96, 0x22, 0xc3, 0x38, + 0x43, 0x87, 0x38, 0xb4, 0x5f, 0xf2, 0x33, 0xf0, 0xcb, 0x29, 0x27, 0x52, 0x42, 0x7a, 0x8b, 0x9c, + 0x48, 0x4e, 0x42, 0xd6, 0xeb, 0x7b, 0x43, 0xaf, 0x79, 0xdc, 0x00, 0xfb, 0x72, 0xd9, 0x1d, 0x3f, + 0xff, 0x7e, 0xe6, 0xc7, 0xb3, 0xf1, 0xbf, 0x8d, 0x1c, 0x7c, 0xd2, 0x4b, 0xa4, 0x93, 0xbe, 0x35, + 0x74, 0xb3, 0x3f, 0xee, 0x1e, 0x60, 0x9a, 0x9c, 0x1d, 0xb8, 0x26, 0x3c, 0xcd, 0xfc, 0xc0, 0x39, + 0xfa, 0x93, 0xf5, 0xc1, 0x07, 0x4e, 0xda, 0x7f, 0x3c, 0x70, 0x3d, 0xf8, 0x76, 0xb2, 0x4a, 0xac, + 0x4e, 0x87, 0x3e, 0xb3, 0xf6, 0x1e, 0x38, 0xbf, 0x92, 0xfa, 0xc2, 0x3d, 0xe9, 0xb7, 0x0f, 0x83, + 0x8e, 0x28, 0xf1, 0xd7, 0x11, 0x1d, 0xb0, 0xc6, 0xad, 0xed, 0xc8, 0xb7, 0x3a, 0x2f, 0xe9, 0x95, + 0x2e, 0xb0, 0xad, 0x28, 0x12, 0xfa, 0x80, 0xca, 0x7f, 0x37, 0xc5, 0xde, 0x46, 0xf2, 0xf5, 0x64, + 0x37, 0x59, 0xb1, 0xae, 0xd3, 0xa0, 0x9f, 0xca, 0xff, 0x3e, 0xbb, 0xa8, 0x0d, 0x48, 0xb5, 0x7d, + 0xef, 0xb4, 0x8d, 0x7e, 0x01, 0x9f, 0xe2, 0x26, 0x72, 0xdc, 0xc3, 0x43, 0x7a, 0x05, 0xce, 0x7f, + 0x98, 0x6a, 0x0f, 0xe9, 0x19, 0x64, 0x66, 0x0f, 0x13, 0xe9, 0xa4, 0x9f, 0x07, 0x4b, 0xb4, 0x88, + 0x83, 0xe6, 0x4d, 0x69, 0xce, 0x93, 0xcf, 0xfe, 0xa3, 0xb4, 0x4c, 0xe5, 0x48, 0xfa, 0xb5, 0x9c, + 0x83, 0x52, 0x77, 0xa4, 0x75, 0xe7, 0x3c, 0x98, 0xa5, 0x5c, 0xcf, 0x66, 0xe6, 0xa6, 0xc4, 0x69, + 0x62, 0x1b, 0xbd, 0x1b, 0x03, 0xf1, 0x5f, 0x51, 0x72, 0x81, 0xde, 0x0f, 0x37, 0xfe, 0xfa, 0x52, + 0xff, 0xdf, 0x5e, 0xa2, 0xa0, 0x56, 0xba, 0x0d, 0xd6, 0x8b, 0x9a, 0xa1, 0xe8, 0xcf, 0x55, 0x88, + 0xa0, 0x6a, 0xe8, 0x0d, 0xa8, 0x0c, 0xff, 0x56, 0xfb, 0x3a, 0xc8, 0x8f, 0x92, 0x18, 0x2a, 0x7c, + 0xae, 0x42, 0x51, 0x90, 0x6e, 0x81, 0xeb, 0xa3, 0xbd, 0x7b, 0x8d, 0x1d, 0x15, 0xd6, 0x54, 0x53, + 0x35, 0xc4, 0x29, 0xe9, 0x09, 0xd8, 0x1a, 0xa5, 0x28, 0xca, 0xa6, 0xbc, 0x23, 0x1b, 0x2a, 0xaa, + 0xeb, 0x86, 0x59, 0x82, 0xaa, 0x81, 0x0c, 0xb5, 0xb2, 0x8b, 0xca, 0xba, 0x61, 0xaa, 0x45, 0x71, + 0x5a, 0x7a, 0x17, 0xbc, 0x3d, 0x81, 0xa9, 0xba, 0x6f, 0x7c, 0x52, 0x19, 0xe0, 0x98, 0x91, 0xb6, + 0xc1, 0xe6, 0x24, 0x0e, 0xbd, 0x56, 0xd2, 0x8b, 0x3b, 0x03, 0x3c, 0xb3, 0xd2, 0x5b, 0xe0, 0x41, + 0x16, 0x68, 0xb0, 0x68, 0x88, 0xe7, 0xa4, 0x87, 0xe0, 0x6e, 0x2a, 0x24, 0x42, 0x79, 0x5e, 0xba, + 0x0f, 0x0a, 0xa3, 0x94, 0x72, 0xbd, 0x5e, 0xd1, 0x14, 0xd9, 0xd4, 0xf4, 0x1a, 0x2a, 0x9b, 0x66, + 0x5d, 0x9c, 0x93, 0xee, 0x81, 0xdb, 0x93, 0xe9, 0x4c, 0xa5, 0x2e, 0xce, 0x27, 0x93, 0xbd, 0xd0, + 0x6a, 0x45, 0xfd, 0x85, 0x81, 0x8a, 0xaa, 0xb1, 0x67, 0xea, 0x75, 0x11, 0x48, 0x6f, 0x83, 0x87, + 0x13, 0xf0, 0x19, 0x9f, 0x54, 0xd8, 0x9a, 0x51, 0x8c, 0x17, 0x52, 0x14, 0xdc, 0x9f, 0xba, 0x5a, + 0x34, 0xca, 0xda, 0xae, 0x29, 0x2e, 0x48, 0xef, 0x81, 0x77, 0x33, 0x8d, 0x1f, 0x57, 0xf1, 0xc5, + 0x14, 0x39, 0x50, 0x2d, 0x6a, 0x83, 0x4b, 0xbf, 0x98, 0x75, 0x51, 0x4a, 0x4a, 0x5d, 0xbc, 0x94, + 0x69, 0x51, 0x08, 0xa5, 0x98, 0x59, 0x3d, 0x84, 0xfa, 0xb2, 0xf4, 0x21, 0x78, 0xff, 0xf3, 0xa8, + 0x87, 0xef, 0x87, 0x8a, 0x6a, 0x18, 0xa2, 0x24, 0xbd, 0x03, 0x1e, 0x65, 0x61, 0x96, 0x3f, 0x6d, + 0x40, 0x55, 0xbc, 0x22, 0x3d, 0x00, 0x77, 0x26, 0x90, 0x17, 0xf7, 0x6b, 0x72, 0x55, 0x2f, 0xee, + 0x88, 0x57, 0x53, 0x4c, 0x5c, 0x91, 0x0d, 0x43, 0xae, 0x15, 0xa1, 0x8c, 0xf6, 0xd4, 0x7d, 0xa3, + 0x2e, 0x2b, 0xaa, 0x21, 0x2e, 0xa5, 0xac, 0x5a, 0x9f, 0x27, 0xbe, 0x06, 0xcb, 0xd2, 0x53, 0xf0, + 0xde, 0x04, 0x2e, 0xb5, 0x22, 0x1b, 0xa6, 0xa6, 0x18, 0xaa, 0x0c, 0x95, 0xf2, 0x00, 0xe7, 0x4a, + 0xa6, 0xf5, 0xe6, 0xfc, 0xb2, 0x52, 0x56, 0xc5, 0x7c, 0x8a, 0xb6, 0x18, 0x47, 0x55, 0xad, 0xea, + 0x70, 0xbf, 0xb8, 0x23, 0xae, 0x66, 0x12, 0x40, 0x35, 0x8b, 0x98, 0x80, 0x6b, 0x29, 0x93, 0x61, + 0x1c, 0x4a, 0xa5, 0x61, 0x98, 0x43, 0xc6, 0xbb, 0x26, 0x6d, 0x80, 0xfb, 0xa9, 0xd6, 0xc5, 0x56, + 0xf1, 0xba, 0xb4, 0x09, 0x36, 0x32, 0xd9, 0x17, 0xa3, 0x5f, 0x4f, 0x59, 0xcc, 0x3e, 0x7d, 0x55, + 0x53, 0xa0, 0x6e, 0xe8, 0xbb, 0xa6, 0x78, 0x43, 0xfa, 0x32, 0xd8, 0x9e, 0xb4, 0x98, 0xba, 0xb2, + 0x07, 0x75, 0x59, 0x29, 0x0f, 0xf9, 0xb9, 0x9b, 0x29, 0xb6, 0x1f, 0xf9, 0x46, 0xd9, 0xac, 0xc8, + 0x86, 0x78, 0x2b, 0x65, 0x4f, 0x19, 0x35, 0xfd, 0xc5, 0x6e, 0x45, 0xde, 0x53, 0xc5, 0xdb, 0x63, + 0xc6, 0xd5, 0x95, 0x98, 0x76, 0x8b, 0x06, 0xaa, 0x43, 0xfd, 0xab, 0xfb, 0x62, 0x61, 0x8c, 0x29, + 0xc6, 0xa9, 0xcb, 0x5a, 0xa9, 0x8c, 0xe4, 0xe7, 0xb2, 0x56, 0x91, 0x77, 0xb4, 0x8a, 0x66, 0xee, + 0x8b, 0x77, 0xa4, 0xf7, 0xc1, 0x93, 0x14, 0x2e, 0xba, 0x43, 0x34, 0x05, 0x41, 0xb5, 0xa4, 0x19, + 0x26, 0xa4, 0xae, 0x53, 0xbc, 0x9b, 0xec, 0x85, 0x0d, 0xb9, 0x5a, 0x89, 0xbb, 0x58, 0xf1, 0x9e, + 0x54, 0x00, 0x37, 0x46, 0xe9, 0x54, 0x65, 0x9b, 0xfd, 0x2b, 0x49, 0x4d, 0x51, 0xc5, 0xfb, 0x63, + 0x8c, 0x4e, 0x57, 0x86, 0xdd, 0x30, 0xaa, 0xe9, 0x35, 0x24, 0x17, 0xc5, 0x07, 0xd2, 0x5d, 0x70, + 0x6b, 0xd2, 0xb9, 0x48, 0xff, 0xad, 0xe2, 0x61, 0xb2, 0xed, 0xc7, 0x4f, 0x00, 0xf9, 0x85, 0x81, + 0x14, 0xbd, 0x66, 0xe8, 0x15, 0x55, 0x7c, 0xb4, 0xf1, 0xc7, 0x02, 0x58, 0x1c, 0xfc, 0xb3, 0x33, + 0xe9, 0x26, 0x58, 0xeb, 0x8d, 0x60, 0x98, 0xb2, 0xd9, 0x30, 0x86, 0x8e, 0xef, 0x35, 0xb0, 0x32, + 0x4c, 0x60, 0x34, 0x14, 0x85, 0x78, 0x2a, 0x21, 0xb1, 0x73, 0x4f, 0xab, 0xd7, 0xd5, 0xa2, 0x38, + 0x25, 0xad, 0x82, 0xa5, 0xe1, 0x4e, 0x15, 0x42, 0x1d, 0x8a, 0xd3, 0x49, 0x7c, 0xf2, 0x8e, 0x0e, + 0xe9, 0x49, 0xbc, 0xf1, 0xe3, 0x29, 0x30, 0xad, 0x98, 0xb2, 0x74, 0x05, 0x5c, 0x52, 0x4c, 0x79, + 0xf4, 0x6f, 0x65, 0x48, 0xa3, 0xdc, 0x30, 0xcb, 0x64, 0x62, 0x35, 0x55, 0x31, 0x75, 0x12, 0x47, + 0xac, 0x80, 0x2b, 0xb4, 0x5d, 0x31, 0xb5, 0xe7, 0x24, 0xbc, 0x30, 0x0c, 0x4d, 0xaf, 0x91, 0xf0, + 0xa1, 0xd7, 0x41, 0x20, 0x23, 0xa8, 0x7e, 0xd2, 0x50, 0x0d, 0xd3, 0x10, 0xa7, 0xa3, 0x8e, 0x3a, + 0x54, 0xab, 0x5a, 0xa3, 0x8a, 0x8c, 0x46, 0xbd, 0xae, 0x43, 0x53, 0x9c, 0x89, 0x3a, 0x4c, 0x48, + 0xb6, 0x74, 0x11, 0x15, 0xd5, 0xe7, 0x1a, 0xf1, 0x85, 0xb3, 0x91, 0xec, 0x46, 0xbd, 0x04, 0xe5, + 0xa2, 0x8a, 0x76, 0xe4, 0x5a, 0x4d, 0x85, 0xe2, 0xb9, 0x88, 0x61, 0x47, 0xab, 0x54, 0xb4, 0x5a, + 0x09, 0x19, 0x8d, 0x6a, 0x55, 0x86, 0xfb, 0xe2, 0xf9, 0x68, 0x06, 0x5c, 0x76, 0x45, 0x33, 0x4c, + 0x71, 0x8e, 0xfe, 0xf9, 0x48, 0xbf, 0xb1, 0xaa, 0xd7, 0x34, 0x53, 0x87, 0x5a, 0xad, 0x24, 0xce, + 0xd3, 0xbf, 0x35, 0x31, 0x65, 0xa4, 0x7e, 0xd5, 0x54, 0x61, 0x4d, 0xae, 0x20, 0xb9, 0x51, 0xd4, + 0x4c, 0x64, 0x98, 0x3a, 0x94, 0x4b, 0xaa, 0x08, 0x22, 0x00, 0xfa, 0x1e, 0x41, 0x61, 0x10, 0xdd, + 0xed, 0xd7, 0x14, 0xf1, 0x82, 0x24, 0x82, 0x05, 0xca, 0x57, 0x33, 0xa1, 0x8c, 0xb4, 0xa2, 0xb8, + 0xb0, 0xf1, 0x4f, 0x73, 0x60, 0x29, 0xb1, 0xee, 0x9c, 0x9c, 0x16, 0x5a, 0xcd, 0x54, 0x4b, 0xcc, + 0xce, 0x91, 0x5a, 0x83, 0x7a, 0xa5, 0x82, 0xf6, 0xb4, 0xda, 0xf0, 0x5f, 0xb0, 0xdc, 0x06, 0xeb, + 0xe3, 0x08, 0x8d, 0x8a, 0xac, 0xec, 0x89, 0x02, 0x31, 0xd2, 0x71, 0x24, 0xc4, 0xf0, 0x74, 0xad, + 0xa8, 0x88, 0x53, 0x24, 0xfe, 0x18, 0x47, 0x55, 0x97, 0x4b, 0x2a, 0x2c, 0x36, 0xcc, 0x7d, 0x71, + 0x7a, 0x92, 0x3c, 0xb5, 0x2a, 0x6b, 0x15, 0x71, 0x86, 0x04, 0x8b, 0xe3, 0x48, 0x9e, 0x69, 0x50, + 0x16, 0x67, 0xa5, 0x3b, 0xe0, 0xe6, 0x38, 0x0a, 0x6a, 0x70, 0xb0, 0x28, 0x9e, 0x23, 0x3b, 0x7b, + 0x1c, 0x51, 0x55, 0x36, 0x4d, 0x15, 0x56, 0x75, 0xc3, 0x14, 0xcf, 0x4f, 0x9a, 0x5e, 0xd5, 0x40, + 0xa6, 0x2a, 0x57, 0x0d, 0x71, 0x6e, 0x12, 0x95, 0x5e, 0x37, 0x4a, 0x6a, 0x4d, 0x53, 0xc5, 0xf9, + 0x49, 0xd0, 0xc9, 0x72, 0x8a, 0x60, 0xe2, 0xe4, 0xe4, 0xea, 0xae, 0x78, 0x61, 0x32, 0x6e, 0xa5, + 0xac, 0xd5, 0x54, 0xba, 0xf8, 0xd2, 0x97, 0xc0, 0xe3, 0x74, 0x3a, 0x54, 0xd2, 0xcc, 0x72, 0x63, + 0x87, 0xee, 0x18, 0xb2, 0x53, 0x2e, 0x4a, 0x5b, 0xe0, 0xad, 0x0c, 0x6c, 0x8a, 0x06, 0x95, 0x8a, + 0xaa, 0x68, 0xe2, 0x22, 0xf1, 0x3e, 0xd9, 0xe4, 0x54, 0xe4, 0x1d, 0xf1, 0x12, 0x39, 0xe1, 0x32, + 0x90, 0x3f, 0x53, 0x6b, 0x7b, 0x5a, 0xcd, 0x10, 0xc5, 0x8c, 0xf4, 0x72, 0xcd, 0xd0, 0x76, 0x2a, + 0xaa, 0x78, 0x79, 0x92, 0x7a, 0xc8, 0x59, 0xa8, 0x29, 0x6a, 0x4d, 0x7f, 0x21, 0x4a, 0x93, 0x16, + 0xac, 0xb7, 0x83, 0xae, 0x90, 0x73, 0x63, 0xac, 0x25, 0xc9, 0xa6, 0x5c, 0xd4, 0x4b, 0x48, 0xab, + 0x29, 0x5a, 0x51, 0xad, 0x99, 0xa8, 0x2a, 0xd7, 0xe4, 0x92, 0x5a, 0x55, 0x6b, 0xa6, 0x78, 0x95, + 0x1c, 0xfa, 0x59, 0x60, 0xbf, 0x20, 0xd1, 0x55, 0x36, 0x5a, 0x12, 0x52, 0x2e, 0x93, 0xc3, 0x32, + 0xcb, 0xb8, 0x34, 0x3c, 0xa0, 0x71, 0x54, 0x06, 0x6a, 0x1a, 0xe6, 0x55, 0x48, 0x7c, 0x9e, 0x97, + 0x1e, 0x83, 0x77, 0x32, 0x70, 0xc4, 0xae, 0x66, 0xab, 0x1b, 0x1f, 0x83, 0xf3, 0x3c, 0xe7, 0x40, + 0x7c, 0xe0, 0xae, 0x2a, 0x9b, 0x24, 0x6e, 0x1a, 0x39, 0x3f, 0xa2, 0x8e, 0x61, 0x8f, 0x2a, 0x6c, + 0xfc, 0xa1, 0x00, 0xd6, 0x26, 0xfc, 0x22, 0x80, 0x58, 0x58, 0xc4, 0x0c, 0x55, 0x45, 0xaf, 0x56, + 0xd5, 0x5a, 0x91, 0xc1, 0x4b, 0x3c, 0xab, 0x36, 0xc0, 0xfd, 0xc9, 0xe4, 0x35, 0xdd, 0x64, 0xb4, + 0x02, 0xb1, 0x96, 0xc9, 0xb4, 0x45, 0xbd, 0xa6, 0x8a, 0x53, 0x3b, 0x5f, 0xff, 0xdb, 0x9f, 0xdc, + 0x10, 0xfe, 0xee, 0x27, 0x37, 0x84, 0x7f, 0xfc, 0xc9, 0x0d, 0xe1, 0x53, 0xfd, 0xc8, 0x0d, 0x5f, + 0x76, 0x0f, 0x36, 0x6d, 0xaf, 0xb5, 0x75, 0xe4, 0x5b, 0x27, 0x2e, 0xcb, 0x49, 0x5b, 0xcd, 0xad, + 0xde, 0x5f, 0xfa, 0x5a, 0x1d, 0x77, 0xeb, 0x08, 0xb7, 0xb7, 0xe8, 0xaf, 0x37, 0xb6, 0x8e, 0xbc, + 0xa1, 0xff, 0xf8, 0xfd, 0x30, 0xf6, 0xf5, 0xe4, 0xf1, 0xc1, 0x39, 0x4a, 0xf6, 0xe4, 0x7f, 0x03, + 0x00, 0x00, 0xff, 0xff, 0x30, 0xe3, 0x6d, 0x74, 0x13, 0x58, 0x00, 0x00, } func (m *UIBannerClickEvent) Marshal() (dAtA []byte, err error) { diff --git a/api/proto/teleport/usageevents/v1/usageevents.proto b/api/proto/teleport/usageevents/v1/usageevents.proto index 72ad43d216615..a37045088eb8c 100644 --- a/api/proto/teleport/usageevents/v1/usageevents.proto +++ b/api/proto/teleport/usageevents/v1/usageevents.proto @@ -551,6 +551,10 @@ message AccessListReviewDelete { // IntegrationEnrollKind represents the types of integration that // can be enrolled. +// +// Note: IntegrationEnrollKind enum must be kept in sync with the values defined +// in proto/prehog/v1alpha/teleport.proto. Values 18-25 have become out of sync +// and are manually mapped to each other. enum IntegrationEnrollKind { INTEGRATION_ENROLL_KIND_UNSPECIFIED = 0; INTEGRATION_ENROLL_KIND_SLACK = 1; @@ -573,6 +577,11 @@ enum IntegrationEnrollKind { INTEGRATION_ENROLL_KIND_SERVICENOW = 18; INTEGRATION_ENROLL_KIND_ENTRA_ID = 19; INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT = 20; + INTEGRATION_ENROLL_KIND_MACHINE_ID_AWS = 21; + INTEGRATION_ENROLL_KIND_MACHINE_ID_GCP = 22; + INTEGRATION_ENROLL_KIND_MACHINE_ID_AZURE = 23; + INTEGRATION_ENROLL_KIND_MACHINE_ID_SPACELIFT = 24; + INTEGRATION_ENROLL_KIND_MACHINE_ID_KUBERNETES = 25; } // IntegrationEnrollMetadata contains common metadata diff --git a/gen/proto/go/prehog/v1alpha/teleport.pb.go b/gen/proto/go/prehog/v1alpha/teleport.pb.go index a9815e1753742..afe507fd85c71 100644 --- a/gen/proto/go/prehog/v1alpha/teleport.pb.go +++ b/gen/proto/go/prehog/v1alpha/teleport.pb.go @@ -496,6 +496,10 @@ func (CTA) EnumDescriptor() ([]byte, []int) { // IntegrationEnrollKind represents the types of integration that // can be enrolled. +// +// Note: IntegrationEnrollKind enum must be kept in sync with the values defined +// in api/proto/teleport/usageevents/v1/usageevents.proto. Values 18-25 have +// become out of sync and are manually mapped to each other. type IntegrationEnrollKind int32 const ( @@ -524,6 +528,7 @@ const ( IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_KUBERNETES IntegrationEnrollKind = 22 IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_ENTRA_ID IntegrationEnrollKind = 23 IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT IntegrationEnrollKind = 24 + IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_SERVICENOW IntegrationEnrollKind = 25 ) // Enum value maps for IntegrationEnrollKind. @@ -554,6 +559,7 @@ var ( 22: "INTEGRATION_ENROLL_KIND_MACHINE_ID_KUBERNETES", 23: "INTEGRATION_ENROLL_KIND_ENTRA_ID", 24: "INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT", + 25: "INTEGRATION_ENROLL_KIND_SERVICENOW", } IntegrationEnrollKind_value = map[string]int32{ "INTEGRATION_ENROLL_KIND_UNSPECIFIED": 0, @@ -581,6 +587,7 @@ var ( "INTEGRATION_ENROLL_KIND_MACHINE_ID_KUBERNETES": 22, "INTEGRATION_ENROLL_KIND_ENTRA_ID": 23, "INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT": 24, + "INTEGRATION_ENROLL_KIND_SERVICENOW": 25, } ) @@ -10773,7 +10780,7 @@ var file_prehog_v1alpha_teleport_proto_rawDesc = []byte{ 0x41, 0x4c, 0x5f, 0x41, 0x55, 0x44, 0x49, 0x54, 0x5f, 0x53, 0x54, 0x4f, 0x52, 0x41, 0x47, 0x45, 0x10, 0x0a, 0x12, 0x16, 0x0a, 0x12, 0x43, 0x54, 0x41, 0x5f, 0x4f, 0x4b, 0x54, 0x41, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x5f, 0x53, 0x59, 0x4e, 0x43, 0x10, 0x0b, 0x12, 0x10, 0x0a, 0x0c, 0x43, 0x54, - 0x41, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x41, 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x2a, 0xbb, 0x08, 0x0a, + 0x41, 0x5f, 0x45, 0x4e, 0x54, 0x52, 0x41, 0x5f, 0x49, 0x44, 0x10, 0x0c, 0x2a, 0xe3, 0x08, 0x0a, 0x15, 0x49, 0x6e, 0x74, 0x65, 0x67, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x45, 0x6e, 0x72, 0x6f, 0x6c, 0x6c, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x27, 0x0a, 0x23, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, @@ -10841,71 +10848,74 @@ var file_prehog_v1alpha_teleport_proto_rawDesc = []byte{ 0x17, 0x12, 0x37, 0x0a, 0x33, 0x49, 0x4e, 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x44, 0x41, 0x54, 0x41, 0x44, 0x4f, 0x47, 0x5f, 0x49, 0x4e, 0x43, 0x49, 0x44, 0x45, 0x4e, 0x54, 0x5f, 0x4d, 0x41, - 0x4e, 0x41, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x18, 0x2a, 0x88, 0x01, 0x0a, 0x12, 0x45, - 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x24, 0x0a, 0x20, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, - 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, - 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x25, 0x0a, 0x21, 0x45, 0x44, 0x49, 0x54, 0x4f, - 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, - 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x47, 0x52, 0x41, 0x4e, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x25, - 0x0a, 0x21, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, - 0x56, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x3f, 0x0a, 0x07, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, - 0x12, 0x17, 0x0a, 0x13, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x46, 0x45, 0x41, - 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x45, 0x44, 0x5f, 0x44, 0x45, 0x56, - 0x49, 0x43, 0x45, 0x53, 0x10, 0x01, 0x2a, 0xa0, 0x01, 0x0a, 0x1b, 0x46, 0x65, 0x61, 0x74, 0x75, - 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, - 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, 0x0a, 0x29, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, - 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, - 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, 0x26, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, - 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, 0x4f, 0x54, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, - 0x01, 0x12, 0x26, 0x0a, 0x22, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, - 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x02, 0x2a, 0x82, 0x01, 0x0a, 0x0c, 0x4c, 0x69, - 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x19, 0x4c, 0x49, - 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, - 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x28, 0x0a, 0x24, 0x4c, 0x49, 0x43, - 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, - 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x4a, 0x41, 0x4d, - 0x46, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, - 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, - 0x54, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x55, 0x53, 0x41, 0x47, 0x45, 0x10, 0x02, 0x32, 0xb4, - 0x02, 0x0a, 0x18, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0b, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, + 0x4e, 0x41, 0x47, 0x45, 0x4d, 0x45, 0x4e, 0x54, 0x10, 0x18, 0x12, 0x26, 0x0a, 0x22, 0x49, 0x4e, + 0x54, 0x45, 0x47, 0x52, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x45, 0x4e, 0x52, 0x4f, 0x4c, 0x4c, + 0x5f, 0x4b, 0x49, 0x4e, 0x44, 0x5f, 0x53, 0x45, 0x52, 0x56, 0x49, 0x43, 0x45, 0x4e, 0x4f, 0x57, + 0x10, 0x19, 0x2a, 0x88, 0x01, 0x0a, 0x12, 0x45, 0x64, 0x69, 0x74, 0x6f, 0x72, 0x43, 0x68, 0x61, + 0x6e, 0x67, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x24, 0x0a, 0x20, 0x45, 0x44, 0x49, + 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, + 0x53, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, + 0x25, 0x0a, 0x21, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, 0x4f, 0x4c, 0x45, 0x5f, 0x47, 0x52, 0x41, + 0x4e, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x25, 0x0a, 0x21, 0x45, 0x44, 0x49, 0x54, 0x4f, 0x52, + 0x5f, 0x43, 0x48, 0x41, 0x4e, 0x47, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x52, + 0x4f, 0x4c, 0x45, 0x5f, 0x52, 0x45, 0x4d, 0x4f, 0x56, 0x45, 0x44, 0x10, 0x02, 0x2a, 0x3f, 0x0a, + 0x07, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x12, 0x17, 0x0a, 0x13, 0x46, 0x45, 0x41, 0x54, + 0x55, 0x52, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x1b, 0x0a, 0x17, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x54, 0x52, 0x55, + 0x53, 0x54, 0x45, 0x44, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x53, 0x10, 0x01, 0x2a, 0xa0, + 0x01, 0x0a, 0x1b, 0x46, 0x65, 0x61, 0x74, 0x75, 0x72, 0x65, 0x52, 0x65, 0x63, 0x6f, 0x6d, 0x6d, + 0x65, 0x6e, 0x64, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x2d, + 0x0a, 0x29, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, + 0x45, 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, + 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2a, 0x0a, + 0x26, 0x46, 0x45, 0x41, 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, + 0x4e, 0x44, 0x41, 0x54, 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x4e, + 0x4f, 0x54, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x01, 0x12, 0x26, 0x0a, 0x22, 0x46, 0x45, 0x41, + 0x54, 0x55, 0x52, 0x45, 0x5f, 0x52, 0x45, 0x43, 0x4f, 0x4d, 0x4d, 0x45, 0x4e, 0x44, 0x41, 0x54, + 0x49, 0x4f, 0x4e, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x55, 0x53, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, + 0x02, 0x2a, 0x82, 0x01, 0x0a, 0x0c, 0x4c, 0x69, 0x63, 0x65, 0x6e, 0x73, 0x65, 0x4c, 0x69, 0x6d, + 0x69, 0x74, 0x12, 0x1d, 0x0a, 0x19, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, + 0x4d, 0x49, 0x54, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x28, 0x0a, 0x24, 0x4c, 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, + 0x49, 0x54, 0x5f, 0x44, 0x45, 0x56, 0x49, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x5f, + 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x4a, 0x41, 0x4d, 0x46, 0x10, 0x01, 0x12, 0x29, 0x0a, 0x25, 0x4c, + 0x49, 0x43, 0x45, 0x4e, 0x53, 0x45, 0x5f, 0x4c, 0x49, 0x4d, 0x49, 0x54, 0x5f, 0x44, 0x45, 0x56, + 0x49, 0x43, 0x45, 0x5f, 0x54, 0x52, 0x55, 0x53, 0x54, 0x5f, 0x54, 0x45, 0x41, 0x4d, 0x5f, 0x55, + 0x53, 0x41, 0x47, 0x45, 0x10, 0x02, 0x32, 0xb4, 0x02, 0x0a, 0x18, 0x54, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x72, 0x76, + 0x69, 0x63, 0x65, 0x12, 0x5b, 0x0a, 0x0b, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x12, 0x22, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, + 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, + 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, + 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, + 0x12, 0x5b, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x12, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, + 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, + 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, + 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, + 0x0d, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, - 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x03, 0x88, 0x02, 0x01, 0x12, 0x5b, 0x0a, 0x0c, 0x53, 0x75, 0x62, 0x6d, - 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, - 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, 0x75, 0x62, 0x6d, 0x69, 0x74, - 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x24, 0x2e, - 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x53, - 0x75, 0x62, 0x6d, 0x69, 0x74, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x12, 0x5e, 0x0a, 0x0d, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x12, 0x24, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, - 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, - 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x48, 0x65, - 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, - 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xc9, 0x01, 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x42, 0x0d, 0x54, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, - 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, - 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, - 0x65, 0x68, 0x6f, 0x67, 0x2f, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x3b, 0x70, 0x72, 0x65, - 0x68, 0x6f, 0x67, 0x76, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xa2, 0x02, 0x03, 0x50, 0x58, 0x58, - 0xaa, 0x02, 0x0e, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0xca, 0x02, 0x0e, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, - 0x68, 0x61, 0xe2, 0x02, 0x1a, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x5c, 0x56, 0x31, 0x61, 0x6c, - 0x70, 0x68, 0x61, 0x5c, 0x47, 0x50, 0x42, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, - 0x02, 0x0f, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, - 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x52, 0x65, 0x71, + 0x75, 0x65, 0x73, 0x74, 0x1a, 0x25, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, + 0x61, 0x6c, 0x70, 0x68, 0x61, 0x2e, 0x48, 0x65, 0x6c, 0x6c, 0x6f, 0x54, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x22, 0x00, 0x42, 0xc9, 0x01, + 0x0a, 0x12, 0x63, 0x6f, 0x6d, 0x2e, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2e, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x42, 0x0d, 0x54, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x50, 0x72, + 0x6f, 0x74, 0x6f, 0x50, 0x01, 0x5a, 0x4b, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, + 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, + 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x2f, 0x76, 0x31, 0x61, + 0x6c, 0x70, 0x68, 0x61, 0x3b, 0x70, 0x72, 0x65, 0x68, 0x6f, 0x67, 0x76, 0x31, 0x61, 0x6c, 0x70, + 0x68, 0x61, 0xa2, 0x02, 0x03, 0x50, 0x58, 0x58, 0xaa, 0x02, 0x0e, 0x50, 0x72, 0x65, 0x68, 0x6f, + 0x67, 0x2e, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xca, 0x02, 0x0e, 0x50, 0x72, 0x65, 0x68, + 0x6f, 0x67, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0xe2, 0x02, 0x1a, 0x50, 0x72, 0x65, + 0x68, 0x6f, 0x67, 0x5c, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x5c, 0x47, 0x50, 0x42, 0x4d, + 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0xea, 0x02, 0x0f, 0x50, 0x72, 0x65, 0x68, 0x6f, 0x67, + 0x3a, 0x3a, 0x56, 0x31, 0x61, 0x6c, 0x70, 0x68, 0x61, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, + 0x33, } var ( diff --git a/gen/proto/ts/prehog/v1alpha/teleport_pb.ts b/gen/proto/ts/prehog/v1alpha/teleport_pb.ts index 3588ba469cef8..fb7416a23cef0 100644 --- a/gen/proto/ts/prehog/v1alpha/teleport_pb.ts +++ b/gen/proto/ts/prehog/v1alpha/teleport_pb.ts @@ -3560,6 +3560,10 @@ export enum CTA { * IntegrationEnrollKind represents the types of integration that * can be enrolled. * + * Note: IntegrationEnrollKind enum must be kept in sync with the values defined + * in api/proto/teleport/usageevents/v1/usageevents.proto. Values 18-25 have + * become out of sync and are manually mapped to each other. + * * @generated from protobuf enum prehog.v1alpha.IntegrationEnrollKind */ export enum IntegrationEnrollKind { @@ -3662,7 +3666,11 @@ export enum IntegrationEnrollKind { /** * @generated from protobuf enum value: INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT = 24; */ - DATADOG_INCIDENT_MANAGEMENT = 24 + DATADOG_INCIDENT_MANAGEMENT = 24, + /** + * @generated from protobuf enum value: INTEGRATION_ENROLL_KIND_SERVICENOW = 25; + */ + SERVICENOW = 25 } /** * EditorChangeStatus is the possible value of an EditorChangeEvent event status diff --git a/lib/usagereporter/teleport/types.go b/lib/usagereporter/teleport/types.go index 41bdde6df9d6e..092a128185ff8 100644 --- a/lib/usagereporter/teleport/types.go +++ b/lib/usagereporter/teleport/types.go @@ -146,9 +146,31 @@ func (u *ResourceCreateEvent) Anonymize(a utils.Anonymizer) prehogv1a.SubmitEven } func integrationEnrollMetadataToPrehog(u *usageeventsv1.IntegrationEnrollMetadata, userMD UserMetadata) *prehogv1a.IntegrationEnrollMetadata { + // Some enums are out of sync and need to be mapped manually + var prehogKind prehogv1a.IntegrationEnrollKind + switch u.Kind { + case usageeventsv1.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_SERVICENOW: + prehogKind = prehogv1a.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_SERVICENOW + case usageeventsv1.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_ENTRA_ID: + prehogKind = prehogv1a.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_ENTRA_ID + case usageeventsv1.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT: + prehogKind = prehogv1a.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT + case usageeventsv1.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_AWS: + prehogKind = prehogv1a.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_AWS + case usageeventsv1.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_GCP: + prehogKind = prehogv1a.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_GCP + case usageeventsv1.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_AZURE: + prehogKind = prehogv1a.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_AZURE + case usageeventsv1.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_SPACELIFT: + prehogKind = prehogv1a.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_SPACELIFT + case usageeventsv1.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_KUBERNETES: + prehogKind = prehogv1a.IntegrationEnrollKind_INTEGRATION_ENROLL_KIND_MACHINE_ID_KUBERNETES + default: + prehogKind = prehogv1a.IntegrationEnrollKind(u.Kind) + } return &prehogv1a.IntegrationEnrollMetadata{ Id: u.Id, - Kind: prehogv1a.IntegrationEnrollKind(u.Kind), + Kind: prehogKind, UserName: userMD.Username, } } diff --git a/proto/prehog/v1alpha/teleport.proto b/proto/prehog/v1alpha/teleport.proto index 7da6c810248e0..0e1e08833dad9 100644 --- a/proto/prehog/v1alpha/teleport.proto +++ b/proto/prehog/v1alpha/teleport.proto @@ -1008,6 +1008,10 @@ message AccessListReviewComplianceEvent { // IntegrationEnrollKind represents the types of integration that // can be enrolled. +// +// Note: IntegrationEnrollKind enum must be kept in sync with the values defined +// in api/proto/teleport/usageevents/v1/usageevents.proto. Values 18-25 have +// become out of sync and are manually mapped to each other. enum IntegrationEnrollKind { INTEGRATION_ENROLL_KIND_UNSPECIFIED = 0; INTEGRATION_ENROLL_KIND_SLACK = 1; @@ -1034,6 +1038,7 @@ enum IntegrationEnrollKind { INTEGRATION_ENROLL_KIND_MACHINE_ID_KUBERNETES = 22; INTEGRATION_ENROLL_KIND_ENTRA_ID = 23; INTEGRATION_ENROLL_KIND_DATADOG_INCIDENT_MANAGEMENT = 24; + INTEGRATION_ENROLL_KIND_SERVICENOW = 25; } // IntegrationEnrollMetadata contains common metadata From bc06d0f55cffa06bc8e1dbc071ebd03be1beb60a Mon Sep 17 00:00:00 2001 From: Trent Clarke Date: Tue, 22 Oct 2024 22:04:14 +1100 Subject: [PATCH 09/70] Adds CRUD service for Identity Center resources (#47609) * Adds CRUD service for Identity Center resources This is just the pure CRUD read/write. Caching & watching support coming as necessary in subsequent PRs. Co-authored-by: Pawel Kopiczko Co-authored-by: Sakshyam Shah * Update identitycenter.go * linter appeasement --------- Co-authored-by: Pawel Kopiczko Co-authored-by: Sakshyam Shah --- api/types/constants.go | 14 + lib/auth/accesspoint/accesspoint.go | 1 + lib/auth/auth.go | 10 +- lib/auth/helpers.go | 1 + lib/auth/init.go | 4 + lib/services/identitycenter.go | 220 ++++++++++++ lib/services/identitycenter_test.go | 97 ++++++ lib/services/local/events_test.go | 5 +- lib/services/local/identitycenter.go | 399 ++++++++++++++++++++++ lib/services/local/identitycenter_test.go | 298 ++++++++++++++++ 10 files changed, 1046 insertions(+), 3 deletions(-) create mode 100644 lib/services/identitycenter.go create mode 100644 lib/services/identitycenter_test.go create mode 100644 lib/services/local/identitycenter.go create mode 100644 lib/services/local/identitycenter_test.go diff --git a/api/types/constants.go b/api/types/constants.go index 85dbe7c140388..36e2571891067 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -564,6 +564,20 @@ const ( // KindStaticHostUser is a host user to be created on matching SSH nodes. KindStaticHostUser = "static_host_user" + // KindIdentityCenterAccount describes an Identity-Center managed AWS Account + KindIdentityCenterAccount = "aws_ic_account" + + // KindIdentityCenterPermissionSet describes an AWS Identity Center Permission Set + KindIdentityCenterPermissionSet = "aws_ic_permission_set" + + // KindIdentityCenterPermissionSet describes an AWS Principal Assignment, representing + // a collection Account Assignments assigned to a Teleport User or AccessList + KindIdentityCenterPrincipalAssignment = "aws_ic_principal_assignment" + + // KindIdentityCenterAccountAssignment describes an AWS Account and Permission Set + // pair that can be requested by a Teleport User. + KindIdentityCenterAccountAssignment = "aws_ic_account_assignment" + // MetaNameAccessGraphSettings is the exact name of the singleton resource holding // access graph settings. MetaNameAccessGraphSettings = "access-graph-settings" diff --git a/lib/auth/accesspoint/accesspoint.go b/lib/auth/accesspoint/accesspoint.go index 158243d126550..3cf7c1d2e86aa 100644 --- a/lib/auth/accesspoint/accesspoint.go +++ b/lib/auth/accesspoint/accesspoint.go @@ -106,6 +106,7 @@ type Config struct { WindowsDesktops services.WindowsDesktops AutoUpdateService services.AutoUpdateServiceGetter ProvisioningStates services.ProvisioningStates + IdentityCenter services.IdentityCenter } func (c *Config) CheckAndSetDefaults() error { diff --git a/lib/auth/auth.go b/lib/auth/auth.go index ffffea18d4e72..232c7587f9c6c 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -347,7 +347,14 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { if cfg.ProvisioningStates == nil { cfg.ProvisioningStates, err = local.NewProvisioningStateService(cfg.Backend) if err != nil { - return nil, trace.Wrap(err, "Creating provisioning state service") + return nil, trace.Wrap(err) + } + } + if cfg.IdentityCenter == nil { + svcCfg := local.IdentityCenterServiceConfig{Backend: cfg.Backend} + cfg.IdentityCenter, err = local.NewIdentityCenterService(svcCfg) + if err != nil { + return nil, trace.Wrap(err) } } if cfg.CloudClients == nil { @@ -676,6 +683,7 @@ type Services struct { services.StaticHostUser services.AutoUpdateService services.ProvisioningStates + services.IdentityCenter } // GetWebSession returns existing web session described by req. diff --git a/lib/auth/helpers.go b/lib/auth/helpers.go index 227d9568699de..851cca043ad92 100644 --- a/lib/auth/helpers.go +++ b/lib/auth/helpers.go @@ -342,6 +342,7 @@ func NewTestAuthServer(cfg TestAuthServerConfig) (*TestAuthServer, error) { DiscoveryConfigs: svces.DiscoveryConfigs, DynamicAccess: svces.DynamicAccessExt, Events: svces.Events, + IdentityCenter: svces.IdentityCenter, Integrations: svces.Integrations, KubeWaitingContainers: svces.KubeWaitingContainer, Kubernetes: svces.Kubernetes, diff --git a/lib/auth/init.go b/lib/auth/init.go index 9ac7abc541db5..28a94a6e39546 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -328,6 +328,10 @@ type InitConfig struct { // Logger is the logger instance for the auth service to use. Logger *slog.Logger + + // IdentityCenter is the Identity Center state storage service to use in + // this node. + IdentityCenter services.IdentityCenter } // Init instantiates and configures an instance of AuthServer diff --git a/lib/services/identitycenter.go b/lib/services/identitycenter.go new file mode 100644 index 0000000000000..d3fbf6aca9756 --- /dev/null +++ b/lib/services/identitycenter.go @@ -0,0 +1,220 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package services + +import ( + "context" + + "google.golang.org/protobuf/proto" + + identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" + "github.com/gravitational/teleport/lib/utils/pagination" +) + +// IdentityCenterAccount wraps a raw identity center record in a new type to +// allow it to implement the interfaces required for use with the Unified +// Resource listing. +// +// IdentityCenterAccount simply wraps a pointer to the underlying +// identitycenterv1.Account record, and can be treated as a reference-like type. +// Copies of an IdentityCenterAccount will point to the same record. +type IdentityCenterAccount struct { + // This wrapper needs to: + // - implement the interfaces required for use with the Unified Resource + // service. + // - expose the existing interfaces & methods on the underlying + // identitycenterv1.Account + // - avoid copying the underlying identitycenterv1.Account due to embedded + // mutexes in the protobuf-generated code + // + // Given those requirements, storing an embedded pointer seems to be the + // least-bad approach. + + *identitycenterv1.Account +} + +// CloneResource creates a deep copy of the underlying account resource +func (a IdentityCenterAccount) CloneResource() IdentityCenterAccount { + return IdentityCenterAccount{ + Account: proto.Clone(a.Account).(*identitycenterv1.Account), + } +} + +// IdentityCenterAccountID is a strongly-typed Identity Center account ID. +type IdentityCenterAccountID string + +// IdentityCenterAccountGetter provides read-only access to Identity Center +// Account records +type IdentityCenterAccountGetter interface { + // ListIdentityCenterAccounts provides a paged list of all known identity + // center accounts + ListIdentityCenterAccounts(context.Context, int, *pagination.PageRequestToken) ([]IdentityCenterAccount, pagination.NextPageToken, error) + + // GetIdentityCenterAccount fetches a specific Identity Center Account + GetIdentityCenterAccount(context.Context, IdentityCenterAccountID) (IdentityCenterAccount, error) +} + +// IdentityCenterAccounts defines read/write access to Identity Center account +// resources +type IdentityCenterAccounts interface { + IdentityCenterAccountGetter + + // CreateIdentityCenterAccount creates a new Identity Center Account record + CreateIdentityCenterAccount(context.Context, IdentityCenterAccount) (IdentityCenterAccount, error) + + // UpdateIdentityCenterAccount performs a conditional update on an Identity + // Center Account record, returning the updated record on success. + UpdateIdentityCenterAccount(context.Context, IdentityCenterAccount) (IdentityCenterAccount, error) + + // UpsertIdentityCenterAccount performs an *unconditional* upsert on an + // Identity Center Account record, returning the updated record on success. + // Be careful when mixing UpsertIdentityCenterAccount() with resources + // protected by optimistic locking + UpsertIdentityCenterAccount(context.Context, IdentityCenterAccount) (IdentityCenterAccount, error) + + // DeleteIdentityCenterAccount deletes an Identity Center Account record + DeleteIdentityCenterAccount(context.Context, IdentityCenterAccountID) error + + // DeleteAllIdentityCenterAccounts deletes all Identity Center Account records + DeleteAllIdentityCenterAccounts(context.Context) error +} + +// PrincipalAssignmentID is a strongly-typed ID for Identity Center Principal +// Assignments +type PrincipalAssignmentID string + +// IdentityCenterPrincipalAssignments defines operations on an Identity Center +// principal assignment database +type IdentityCenterPrincipalAssignments interface { + // ListPrincipalAssignments lists all PrincipalAssignment records in the + // service + ListPrincipalAssignments(context.Context, int, *pagination.PageRequestToken) ([]*identitycenterv1.PrincipalAssignment, pagination.NextPageToken, error) + + // CreatePrincipalAssignment creates a new Principal Assignment record in + // the service from the supplied in-memory representation. Returns the + // created record on success. + CreatePrincipalAssignment(context.Context, *identitycenterv1.PrincipalAssignment) (*identitycenterv1.PrincipalAssignment, error) + + // GetPrincipalAssignment fetches a specific Principal Assignment record. + GetPrincipalAssignment(context.Context, PrincipalAssignmentID) (*identitycenterv1.PrincipalAssignment, error) + + // UpdatePrincipalAssignment performs a conditional update on a Principal + // Assignment record + UpdatePrincipalAssignment(context.Context, *identitycenterv1.PrincipalAssignment) (*identitycenterv1.PrincipalAssignment, error) + + // UpsertPrincipalAssignment performs an unconditional update on a Principal + // Assignment record + UpsertPrincipalAssignment(context.Context, *identitycenterv1.PrincipalAssignment) (*identitycenterv1.PrincipalAssignment, error) + + // DeletePrincipalAssignment deletes a specific principal assignment record + DeletePrincipalAssignment(context.Context, PrincipalAssignmentID) error + + // DeleteAllPrincipalAssignments deletes all assignment record + DeleteAllPrincipalAssignments(context.Context) error +} + +// PermissionSetID is a strongly typed ID for an identitycenterv1.PermissionSet +type PermissionSetID string + +// IdentityCenterPermissionSets defines the operations to create and maintain +// identitycenterv1.PermissionSet records in the service. +type IdentityCenterPermissionSets interface { + // ListPermissionSets list the known Permission Sets + ListPermissionSets(context.Context, int, *pagination.PageRequestToken) ([]*identitycenterv1.PermissionSet, pagination.NextPageToken, error) + + // CreatePermissionSet creates a new PermissionSet record based on the + // supplied in-memory representation, returning the created record on + // success + CreatePermissionSet(context.Context, *identitycenterv1.PermissionSet) (*identitycenterv1.PermissionSet, error) + + // GetPermissionSet fetches a specific PermissionSet record + GetPermissionSet(context.Context, PermissionSetID) (*identitycenterv1.PermissionSet, error) + + // UpdatePermissionSet performs a conditional update on the supplied Identity + // Center Permission Set + UpdatePermissionSet(context.Context, *identitycenterv1.PermissionSet) (*identitycenterv1.PermissionSet, error) + + // DeletePermissionSet deletes a specific Identity Center PermissionSet + DeletePermissionSet(context.Context, PermissionSetID) error +} + +// IdentityCenterAccountAssignment wraps a raw identitycenterv1.AccountAssignment +// record in a new type to allow it to implement the interfaces required for use +// with the Unified Resource listing. IdentityCenterAccountAssignment simply +// wraps a pointer to the underlying account record, and can be treated as a +// reference-like type. +// +// Copies of an IdentityCenterAccountAssignment will point to the same record. +type IdentityCenterAccountAssignment struct { + // This wrapper needs to: + // - implement the interfaces required for use with the Unified Resource + // service. + // - expose the existing interfaces & methods on the underlying + // identitycenterv1.AccountAssignment + // - avoid copying the underlying identitycenterv1.AccountAssignment due to + // embedded mutexes in the protobuf-generated code + // + // Given those requirements, storing an embedded pointer seems to be the + // least-bad approach. + + *identitycenterv1.AccountAssignment +} + +// CloneResource creates a deep copy of the underlying account resource +func (a IdentityCenterAccountAssignment) CloneResource() IdentityCenterAccountAssignment { + return IdentityCenterAccountAssignment{ + AccountAssignment: proto.Clone(a.AccountAssignment).(*identitycenterv1.AccountAssignment), + } +} + +// IdentityCenterAccountAssignmentID is a strongly typed ID for an +// IdentityCenterAccountAssignment +type IdentityCenterAccountAssignmentID string + +// IdentityCenterAccountAssignments defines the operations to create and maintain +// Identity Center account assignment records in the service. +type IdentityCenterAccountAssignments interface { + // ListAccountAssignments lists all IdentityCenterAccountAssignment record + // known to the service + ListAccountAssignments(context.Context, int, *pagination.PageRequestToken) ([]IdentityCenterAccountAssignment, pagination.NextPageToken, error) + + // CreateAccountAssignment creates a new Account Assignment record in + // the service from the supplied in-memory representation. Returns the + // created record on success. + CreateAccountAssignment(context.Context, IdentityCenterAccountAssignment) (IdentityCenterAccountAssignment, error) + + // GetAccountAssignment fetches a specific Account Assignment record. + GetAccountAssignment(context.Context, IdentityCenterAccountAssignmentID) (IdentityCenterAccountAssignment, error) + + // UpdateAccountAssignment performs a conditional update on the supplied + // Account Assignment, returning the updated record on success. + UpdateAccountAssignment(context.Context, IdentityCenterAccountAssignment) (IdentityCenterAccountAssignment, error) + + // DeleteAccountAssignment deletes a specific account assignment + DeleteAccountAssignment(context.Context, IdentityCenterAccountAssignmentID) error + + // DeleteAllAccountAssignments deletes all known account assignments + DeleteAllAccountAssignments(context.Context) error +} + +// IdentityCenter combines all the resource managers used by the Identity Center plugin +type IdentityCenter interface { + IdentityCenterAccounts + IdentityCenterPermissionSets + IdentityCenterPrincipalAssignments + IdentityCenterAccountAssignments +} diff --git a/lib/services/identitycenter_test.go b/lib/services/identitycenter_test.go new file mode 100644 index 0000000000000..5cbc87493feed --- /dev/null +++ b/lib/services/identitycenter_test.go @@ -0,0 +1,97 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package services + +import ( + "testing" + + "github.com/stretchr/testify/require" + + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" + "github.com/gravitational/teleport/api/types" +) + +func TestIdentityCenterAccountClone(t *testing.T) { + // GIVEN an Account Record + src := IdentityCenterAccount{ + Account: &identitycenterv1.Account{ + Kind: types.KindIdentityCenterAccount, + Version: types.V1, + Metadata: &headerv1.Metadata{Name: "some-account"}, + Spec: &identitycenterv1.AccountSpec{ + Id: "aws-account-id", + Arn: "arn:aws:sso::account-id:", + Description: "Test account", + PermissionSetInfo: []*identitycenterv1.PermissionSetInfo{ + { + Name: "original value", + Arn: "arn:aws:sso:::permissionSet/ic-instance/ps-instance", + }, + }, + }, + }, + } + + // WHEN I clone the resource + dst := src.CloneResource() + + // EXPECT that the resulting clone compares equally + require.Equal(t, src, dst) + + // WHEN I modify the source object in a way that would be shared with a + // shallow copy + src.Spec.PermissionSetInfo[0].Name = "some new value" + + // EXPECT that the cloned object DOES NOT inherit the update + require.NotEqual(t, src, dst) + require.Equal(t, "original value", dst.Spec.PermissionSetInfo[0].Name) +} + +func TestIdentityCenterAccountAssignmentClone(t *testing.T) { + // GIVEN an Account Assignment Record + src := IdentityCenterAccountAssignment{ + AccountAssignment: &identitycenterv1.AccountAssignment{ + Kind: types.KindIdentityCenterAccountAssignment, + Version: types.V1, + Metadata: &headerv1.Metadata{Name: "u-test@example.com"}, + Spec: &identitycenterv1.AccountAssignmentSpec{ + Display: "Some-Permission-set on Some-AWS-account", + PermissionSet: &identitycenterv1.PermissionSetInfo{ + Arn: "arn:aws:sso:::permissionSet/ic-instance/ps-instance", + Name: "original name", + }, + AccountName: "Some Account Name", + AccountId: "some account id", + }, + }, + } + + // WHEN I clone the resource + dst := src.CloneResource() + + // EXPECT that the resulting clone compares equally + require.Equal(t, src, dst) + + // WHEN I modify the source object in a way that would be shared with a + // shallow copy + src.Spec.PermissionSet.Name = "some new name" + + // EXPECT that the cloned object DOES NOT inherit the update + require.NotEqual(t, src, dst) + require.Equal(t, "original name", dst.Spec.PermissionSet.Name) +} diff --git a/lib/services/local/events_test.go b/lib/services/local/events_test.go index a57f07aadf2de..c4d7c91ed4e26 100644 --- a/lib/services/local/events_test.go +++ b/lib/services/local/events_test.go @@ -49,7 +49,8 @@ func fetchEvent(t *testing.T, w types.Watcher, timeout time.Duration) types.Even return ev } -func testContext(t *testing.T) context.Context { +func newTestContext(t *testing.T) context.Context { + t.Helper() ctx, cancel := context.WithCancel(context.Background()) t.Cleanup(cancel) return ctx @@ -209,7 +210,7 @@ func TestWatchers(t *testing.T) { for _, test := range testCases { t.Run(test.name, func(t *testing.T) { t.Parallel() - ctx := testContext(t) + ctx := newTestContext(t) // GIVEN an empty back-end clock := clockwork.NewFakeClock() diff --git a/lib/services/local/identitycenter.go b/lib/services/local/identitycenter.go new file mode 100644 index 0000000000000..a24e433ef3b84 --- /dev/null +++ b/lib/services/local/identitycenter.go @@ -0,0 +1,399 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package local + +import ( + "context" + "log/slog" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport" + identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/backend" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/services/local/generic" + "github.com/gravitational/teleport/lib/utils/pagination" +) + +const ( + identityCenterPageSize = 100 +) + +const ( + awsResourcePrefix = "identity_center" + awsAccountPrefix = "accounts" + awsPermissionSetPrefix = "permission_sets" + awsPrincipalAssignmentPrefix = "principal_assignments" + awsAccountAssignmentPrefix = "account_assignments" +) + +// IdentityCenterServiceConfig provides configuration parameters for an +// IdentityCenterService +type IdentityCenterServiceConfig struct { + // Backend is the storage backend to use for the service + Backend backend.Backend + + // Logger is the logger for the service to use. A default will be supplied + // if not specified. + Logger *slog.Logger +} + +// CheckAndSetDefaults validates the cfg and supplies defaults where +// appropriate. +func (cfg *IdentityCenterServiceConfig) CheckAndSetDefaults() error { + if cfg.Backend == nil { + return trace.BadParameter("must supply backend") + } + + if cfg.Logger == nil { + cfg.Logger = slog.Default().With(teleport.ComponentKey, "AWS-IC-LOCAL") + } + + return nil +} + +// IdentityCenterService handles low-level CRUD operations for the identity- +// center related resources +type IdentityCenterService struct { + accounts *generic.ServiceWrapper[*identitycenterv1.Account] + permissionSets *generic.ServiceWrapper[*identitycenterv1.PermissionSet] + principalAssignments *generic.ServiceWrapper[*identitycenterv1.PrincipalAssignment] + accountAssignments *generic.ServiceWrapper[*identitycenterv1.AccountAssignment] +} + +// compile-time assertion that the IdentityCenterService implements the +// services.IdentityCenter interface +var _ services.IdentityCenter = (*IdentityCenterService)(nil) + +// NewIdentityCenterService creates a new service for managing identity-center +// related resources +func NewIdentityCenterService(cfg IdentityCenterServiceConfig) (*IdentityCenterService, error) { + if err := cfg.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + + accountsSvc, err := generic.NewServiceWrapper(generic.ServiceWrapperConfig[*identitycenterv1.Account]{ + Backend: cfg.Backend, + ResourceKind: types.KindIdentityCenterAccount, + BackendPrefix: backend.NewKey(awsResourcePrefix, awsAccountPrefix), + MarshalFunc: services.MarshalProtoResource[*identitycenterv1.Account], + UnmarshalFunc: services.UnmarshalProtoResource[*identitycenterv1.Account], + }) + if err != nil { + return nil, trace.Wrap(err, "creating accounts service") + } + + permissionSetSvc, err := generic.NewServiceWrapper(generic.ServiceWrapperConfig[*identitycenterv1.PermissionSet]{ + Backend: cfg.Backend, + ResourceKind: types.KindIdentityCenterPermissionSet, + BackendPrefix: backend.NewKey(awsResourcePrefix, awsPermissionSetPrefix), + MarshalFunc: services.MarshalProtoResource[*identitycenterv1.PermissionSet], + UnmarshalFunc: services.UnmarshalProtoResource[*identitycenterv1.PermissionSet], + }) + if err != nil { + return nil, trace.Wrap(err, "creating permission sets service") + } + + principalsSvc, err := generic.NewServiceWrapper(generic.ServiceWrapperConfig[*identitycenterv1.PrincipalAssignment]{ + Backend: cfg.Backend, + ResourceKind: types.KindIdentityCenterPrincipalAssignment, + BackendPrefix: backend.NewKey(awsResourcePrefix, awsPrincipalAssignmentPrefix), + MarshalFunc: services.MarshalProtoResource[*identitycenterv1.PrincipalAssignment], + UnmarshalFunc: services.UnmarshalProtoResource[*identitycenterv1.PrincipalAssignment], + }) + if err != nil { + return nil, trace.Wrap(err, "creating principal assignments service") + } + + accountAssignmentsSvc, err := generic.NewServiceWrapper(generic.ServiceWrapperConfig[*identitycenterv1.AccountAssignment]{ + Backend: cfg.Backend, + ResourceKind: types.KindIdentityCenterAccountAssignment, + BackendPrefix: backend.NewKey(awsResourcePrefix, awsAccountAssignmentPrefix), + MarshalFunc: services.MarshalProtoResource[*identitycenterv1.AccountAssignment], + UnmarshalFunc: services.UnmarshalProtoResource[*identitycenterv1.AccountAssignment], + }) + if err != nil { + return nil, trace.Wrap(err, "creating account assignments service") + } + + svc := &IdentityCenterService{ + accounts: accountsSvc, + permissionSets: permissionSetSvc, + principalAssignments: principalsSvc, + accountAssignments: accountAssignmentsSvc, + } + + return svc, nil +} + +// ListIdentityCenterAccounts provides a paged list of all AWS accounts known +// to the Identity Center integration +func (svc *IdentityCenterService) ListIdentityCenterAccounts(ctx context.Context, pageSize int, page *pagination.PageRequestToken) ([]services.IdentityCenterAccount, pagination.NextPageToken, error) { + if pageSize == 0 { + pageSize = identityCenterPageSize + } + + pageToken, err := page.Consume() + if err != nil { + return nil, "", trace.Wrap(err, "listing identity center assignment records") + } + + accounts, nextPage, err := svc.accounts.ListResources(ctx, pageSize, pageToken) + if err != nil { + return nil, "", trace.Wrap(err, "listing identity center assignment records") + } + + result := make([]services.IdentityCenterAccount, len(accounts)) + for i, acct := range accounts { + result[i] = services.IdentityCenterAccount{Account: acct} + } + + return result, pagination.NextPageToken(nextPage), nil +} + +// CreateIdentityCenterAccount creates a new Identity Center Account record +func (svc *IdentityCenterService) CreateIdentityCenterAccount(ctx context.Context, acct services.IdentityCenterAccount) (services.IdentityCenterAccount, error) { + created, err := svc.accounts.CreateResource(ctx, acct.Account) + if err != nil { + return services.IdentityCenterAccount{}, trace.Wrap(err, "creating identity center account") + } + return services.IdentityCenterAccount{Account: created}, nil +} + +// GetIdentityCenterAccount fetches a specific Identity Center Account +func (svc *IdentityCenterService) GetIdentityCenterAccount(ctx context.Context, name services.IdentityCenterAccountID) (services.IdentityCenterAccount, error) { + acct, err := svc.accounts.GetResource(ctx, string(name)) + if err != nil { + return services.IdentityCenterAccount{}, trace.Wrap(err, "fetching identity center account") + } + return services.IdentityCenterAccount{Account: acct}, nil +} + +// UpdateIdentityCenterAccount performs a conditional update on an Identity +// Center Account record, returning the updated record on success. +func (svc *IdentityCenterService) UpdateIdentityCenterAccount(ctx context.Context, acct services.IdentityCenterAccount) (services.IdentityCenterAccount, error) { + updated, err := svc.accounts.ConditionalUpdateResource(ctx, acct.Account) + if err != nil { + return services.IdentityCenterAccount{}, trace.Wrap(err, "updating identity center account record") + } + return services.IdentityCenterAccount{Account: updated}, nil +} + +// UpsertIdentityCenterAccount performs an *unconditional* upsert on an +// Identity Center Account record, returning the updated record on success. +// Be careful when mixing UpsertIdentityCenterAccount() with resources +// protected by optimistic locking +func (svc *IdentityCenterService) UpsertIdentityCenterAccount(ctx context.Context, acct services.IdentityCenterAccount) (services.IdentityCenterAccount, error) { + updated, err := svc.accounts.UpsertResource(ctx, acct.Account) + if err != nil { + return services.IdentityCenterAccount{}, trace.Wrap(err, "upserting identity center account record") + } + return services.IdentityCenterAccount{Account: updated}, nil +} + +// DeleteIdentityCenterAccount deletes an Identity Center Account record +func (svc *IdentityCenterService) DeleteIdentityCenterAccount(ctx context.Context, name services.IdentityCenterAccountID) error { + return trace.Wrap(svc.accounts.DeleteResource(ctx, string(name))) +} + +// DeleteAllIdentityCenterAccounts deletes all Identity Center Account records +func (svc *IdentityCenterService) DeleteAllIdentityCenterAccounts(ctx context.Context) error { + return trace.Wrap(svc.accounts.DeleteAllResources(ctx)) +} + +// ListPrincipalAssignments lists all PrincipalAssignment records in the service +func (svc *IdentityCenterService) ListPrincipalAssignments(ctx context.Context, pageSize int, page *pagination.PageRequestToken) ([]*identitycenterv1.PrincipalAssignment, pagination.NextPageToken, error) { + if pageSize == 0 { + pageSize = identityCenterPageSize + } + + pageToken, err := page.Consume() + if err != nil { + return nil, "", trace.Wrap(err, "extracting page token") + } + + resp, nextPage, err := svc.principalAssignments.ListResources(ctx, pageSize, pageToken) + if err != nil { + return nil, "", trace.Wrap(err, "listing identity center assignment records") + } + return resp, pagination.NextPageToken(nextPage), nil +} + +// CreatePrincipalAssignment creates a new Principal Assignment record in the +// service from the supplied in-memory representation. Returns the created +// record on success. +func (svc *IdentityCenterService) CreatePrincipalAssignment(ctx context.Context, asmt *identitycenterv1.PrincipalAssignment) (*identitycenterv1.PrincipalAssignment, error) { + created, err := svc.principalAssignments.CreateResource(ctx, asmt) + if err != nil { + return nil, trace.Wrap(err, "creating principal assignment") + } + return created, nil +} + +// GetPrincipalAssignment fetches a specific Principal Assignment record. +func (svc *IdentityCenterService) GetPrincipalAssignment(ctx context.Context, name services.PrincipalAssignmentID) (*identitycenterv1.PrincipalAssignment, error) { + state, err := svc.principalAssignments.GetResource(ctx, string(name)) + if err != nil { + return nil, trace.Wrap(err, "fetching principal assignment") + } + return state, nil +} + +// UpdatePrincipalAssignment performs a conditional update on a Principal +// Assignment record +func (svc *IdentityCenterService) UpdatePrincipalAssignment(ctx context.Context, asmt *identitycenterv1.PrincipalAssignment) (*identitycenterv1.PrincipalAssignment, error) { + updated, err := svc.principalAssignments.ConditionalUpdateResource(ctx, asmt) + if err != nil { + return nil, trace.Wrap(err, "updating principal assignment record") + } + return updated, nil +} + +// UpsertPrincipalAssignment performs an unconditional update on a Principal +// Assignment record +func (svc *IdentityCenterService) UpsertPrincipalAssignment(ctx context.Context, asmt *identitycenterv1.PrincipalAssignment) (*identitycenterv1.PrincipalAssignment, error) { + updated, err := svc.principalAssignments.UpsertResource(ctx, asmt) + if err != nil { + return nil, trace.Wrap(err, "upserting principal assignment record") + } + return updated, nil +} + +// DeletePrincipalAssignment deletes a specific principal assignment record +func (svc *IdentityCenterService) DeletePrincipalAssignment(ctx context.Context, name services.PrincipalAssignmentID) error { + return trace.Wrap(svc.principalAssignments.DeleteResource(ctx, string(name))) +} + +// DeleteAllPrincipalAssignments deletes all assignment record +func (svc *IdentityCenterService) DeleteAllPrincipalAssignments(ctx context.Context) error { + return trace.Wrap(svc.principalAssignments.DeleteAllResources(ctx)) +} + +// ListPermissionSets list the known Permission Sets in the managed Identity Center +func (svc *IdentityCenterService) ListPermissionSets(ctx context.Context, pageSize int, page *pagination.PageRequestToken) ([]*identitycenterv1.PermissionSet, pagination.NextPageToken, error) { + if pageSize == 0 { + pageSize = identityCenterPageSize + } + pageToken, err := page.Consume() + if err != nil { + return nil, "", trace.Wrap(err, "extracting page token") + } + resp, nextPage, err := svc.permissionSets.ListResources(ctx, pageSize, pageToken) + if err != nil { + return nil, "", trace.Wrap(err, "listing identity center permission set records") + } + return resp, pagination.NextPageToken(nextPage), nil +} + +// CreatePermissionSet creates a new PermissionSet record based on the supplied +// in-memory representation, returning the created record on success. +func (svc *IdentityCenterService) CreatePermissionSet(ctx context.Context, asmt *identitycenterv1.PermissionSet) (*identitycenterv1.PermissionSet, error) { + created, err := svc.permissionSets.CreateResource(ctx, asmt) + if err != nil { + return nil, trace.Wrap(err, "creating identity center permission set") + } + return created, nil +} + +// GetPermissionSet fetches a specific PermissionSet record +func (svc *IdentityCenterService) GetPermissionSet(ctx context.Context, name services.PermissionSetID) (*identitycenterv1.PermissionSet, error) { + state, err := svc.permissionSets.GetResource(ctx, string(name)) + if err != nil { + return nil, trace.Wrap(err, "fetching permission set") + } + return state, nil +} + +// UpdatePermissionSet performs a conditional update on the supplied Identity +// Center Permission Set +func (svc *IdentityCenterService) UpdatePermissionSet(ctx context.Context, asmt *identitycenterv1.PermissionSet) (*identitycenterv1.PermissionSet, error) { + updated, err := svc.permissionSets.ConditionalUpdateResource(ctx, asmt) + if err != nil { + return nil, trace.Wrap(err, "updating permission set record") + } + return updated, nil +} + +// DeletePermissionSet deletes a specific Identity Center PermissionSet +func (svc *IdentityCenterService) DeletePermissionSet(ctx context.Context, name services.PermissionSetID) error { + return trace.Wrap(svc.permissionSets.DeleteResource(ctx, string(name))) +} + +// ListAccountAssignments lists all IdentityCenterAccountAssignment record +// known to the service +func (svc *IdentityCenterService) ListAccountAssignments(ctx context.Context, pageSize int, page *pagination.PageRequestToken) ([]services.IdentityCenterAccountAssignment, pagination.NextPageToken, error) { + if pageSize == 0 { + pageSize = identityCenterPageSize + } + pageToken, err := page.Consume() + if err != nil { + return nil, "", trace.Wrap(err, "extracting page token") + } + assignments, nextPage, err := svc.accountAssignments.ListResources(ctx, pageSize, pageToken) + if err != nil { + return nil, "", trace.Wrap(err, "listing identity center assignment records") + } + + result := make([]services.IdentityCenterAccountAssignment, len(assignments)) + for i, asmt := range assignments { + result[i] = services.IdentityCenterAccountAssignment{AccountAssignment: asmt} + } + + return result, pagination.NextPageToken(nextPage), nil +} + +// CreateAccountAssignment creates a new Account Assignment record in +// the service from the supplied in-memory representation. Returns the +// created record on success. +func (svc *IdentityCenterService) CreateAccountAssignment(ctx context.Context, asmt services.IdentityCenterAccountAssignment) (services.IdentityCenterAccountAssignment, error) { + created, err := svc.accountAssignments.CreateResource(ctx, asmt.AccountAssignment) + if err != nil { + return services.IdentityCenterAccountAssignment{}, trace.Wrap(err, "creating principal assignment") + } + return services.IdentityCenterAccountAssignment{AccountAssignment: created}, nil +} + +// GetAccountAssignment fetches a specific Account Assignment record. +func (svc *IdentityCenterService) GetAccountAssignment(ctx context.Context, name services.IdentityCenterAccountAssignmentID) (services.IdentityCenterAccountAssignment, error) { + asmt, err := svc.accountAssignments.GetResource(ctx, string(name)) + if err != nil { + return services.IdentityCenterAccountAssignment{}, trace.Wrap(err, "fetching principal assignment") + } + return services.IdentityCenterAccountAssignment{AccountAssignment: asmt}, nil +} + +// UpdateAccountAssignment performs a conditional update on the supplied +// Account Assignment, returning the updated record on success. +func (svc *IdentityCenterService) UpdateAccountAssignment(ctx context.Context, asmt services.IdentityCenterAccountAssignment) (services.IdentityCenterAccountAssignment, error) { + updated, err := svc.accountAssignments.ConditionalUpdateResource(ctx, asmt.AccountAssignment) + if err != nil { + return services.IdentityCenterAccountAssignment{}, trace.Wrap(err, "updating principal assignment record") + } + return services.IdentityCenterAccountAssignment{AccountAssignment: updated}, nil +} + +// DeleteAccountAssignment deletes a specific account assignment +func (svc *IdentityCenterService) DeleteAccountAssignment(ctx context.Context, name services.IdentityCenterAccountAssignmentID) error { + return trace.Wrap(svc.accountAssignments.DeleteResource(ctx, string(name))) +} + +// DeleteAllAccountAssignments deletes all known account assignments +func (svc *IdentityCenterService) DeleteAllAccountAssignments(ctx context.Context) error { + return trace.Wrap(svc.accountAssignments.DeleteAllResources(ctx)) +} diff --git a/lib/services/local/identitycenter_test.go b/lib/services/local/identitycenter_test.go new file mode 100644 index 0000000000000..a15c2a51f323b --- /dev/null +++ b/lib/services/local/identitycenter_test.go @@ -0,0 +1,298 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package local + +import ( + "context" + "fmt" + "testing" + + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + identitycenterv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/identitycenter/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/backend" + "github.com/gravitational/teleport/lib/backend/lite" + "github.com/gravitational/teleport/lib/services" +) + +func newTestBackend(t *testing.T, ctx context.Context, clock clockwork.Clock) backend.Backend { + t.Helper() + sqliteBackend, err := lite.NewWithConfig(ctx, lite.Config{ + Path: t.TempDir(), + Clock: clock, + }) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, sqliteBackend.Close()) + }) + return sqliteBackend +} + +func TestIdentityCenterResourceCRUD(t *testing.T) { + t.Parallel() + + const resourceID = "alpha" + + testCases := []struct { + name string + createResource func(*testing.T, context.Context, services.IdentityCenter, string) types.Resource153 + getResource func(context.Context, services.IdentityCenter, string) (types.Resource153, error) + updateResource func(context.Context, services.IdentityCenter, types.Resource153) (types.Resource153, error) + upsertResource func(context.Context, services.IdentityCenter, types.Resource153) (types.Resource153, error) + }{ + { + name: "Account", + createResource: func(subtestT *testing.T, subtestCtx context.Context, svc services.IdentityCenter, id string) types.Resource153 { + return makeTestIdentityCenterAccount(subtestT, subtestCtx, svc, id) + }, + getResource: func(subtestCtx context.Context, svc services.IdentityCenter, id string) (types.Resource153, error) { + return svc.GetIdentityCenterAccount(subtestCtx, services.IdentityCenterAccountID(id)) + }, + updateResource: func(subtestCtx context.Context, svc services.IdentityCenter, r types.Resource153) (types.Resource153, error) { + acct := r.(services.IdentityCenterAccount) + return svc.UpdateIdentityCenterAccount(subtestCtx, acct) + }, + upsertResource: func(subtestCtx context.Context, svc services.IdentityCenter, r types.Resource153) (types.Resource153, error) { + acct := r.(services.IdentityCenterAccount) + return svc.UpsertIdentityCenterAccount(subtestCtx, acct) + }, + }, + { + name: "PermissionSet", + createResource: func(subtestT *testing.T, subtestCtx context.Context, svc services.IdentityCenter, id string) types.Resource153 { + return makeTestIdentityCenterPermissionSet(subtestT, subtestCtx, svc, id) + }, + getResource: func(subtestCtx context.Context, svc services.IdentityCenter, id string) (types.Resource153, error) { + return svc.GetPermissionSet(subtestCtx, services.PermissionSetID(id)) + }, + updateResource: func(subtestCtx context.Context, svc services.IdentityCenter, r types.Resource153) (types.Resource153, error) { + ps := r.(*identitycenterv1.PermissionSet) + return svc.UpdatePermissionSet(subtestCtx, ps) + }, + }, + { + name: "AccountAssignment", + createResource: func(subtestT *testing.T, subtestCtx context.Context, svc services.IdentityCenter, id string) types.Resource153 { + return makeTestIdentityCenterAccountAssignment(subtestT, subtestCtx, svc, id) + }, + getResource: func(subtestCtx context.Context, svc services.IdentityCenter, id string) (types.Resource153, error) { + return svc.GetAccountAssignment(subtestCtx, services.IdentityCenterAccountAssignmentID(id)) + }, + updateResource: func(subtestCtx context.Context, svc services.IdentityCenter, r types.Resource153) (types.Resource153, error) { + asmt := r.(services.IdentityCenterAccountAssignment) + return svc.UpdateAccountAssignment(subtestCtx, asmt) + }, + }, + { + name: "PrincipalAssignment", + createResource: func(subtestT *testing.T, subtestCtx context.Context, svc services.IdentityCenter, id string) types.Resource153 { + return makeTestIdentityCenterPrincipalAssignment(subtestT, subtestCtx, svc, id) + }, + getResource: func(subtestCtx context.Context, svc services.IdentityCenter, id string) (types.Resource153, error) { + return svc.GetPrincipalAssignment(subtestCtx, services.PrincipalAssignmentID(id)) + }, + updateResource: func(subtestCtx context.Context, svc services.IdentityCenter, r types.Resource153) (types.Resource153, error) { + asmt := r.(*identitycenterv1.PrincipalAssignment) + return svc.UpdatePrincipalAssignment(subtestCtx, asmt) + }, + upsertResource: func(subtestCtx context.Context, svc services.IdentityCenter, r types.Resource153) (types.Resource153, error) { + asmt := r.(*identitycenterv1.PrincipalAssignment) + return svc.UpsertPrincipalAssignment(subtestCtx, asmt) + }, + }, + } + + for _, test := range testCases { + t.Run(test.name, func(t *testing.T) { + t.Run("OptimisticLocking", func(t *testing.T) { + const resourceID = "alpha" + + ctx := newTestContext(t) + clock := clockwork.NewFakeClock() + backend := newTestBackend(t, ctx, clock) + + // GIVEN an IdentityCenter service populated with a resource + uut, err := NewIdentityCenterService(IdentityCenterServiceConfig{Backend: backend}) + require.NoError(t, err) + createdResource := test.createResource(t, ctx, uut, resourceID) + + // WHEN I modify the backend record for that resource... + tmpResource, err := test.getResource(ctx, uut, resourceID) + require.NoError(t, err) + tmpResource.GetMetadata().Labels = map[string]string{"update": "1"} + updatedResource, err := test.updateResource(ctx, uut, tmpResource) + require.NoError(t, err) + + // EXPECT that any attempt to update backend via the original in-memory + // version of the resource fails with a comparison error + createdResource.GetMetadata().Labels = map[string]string{"update": "2"} + _, err = test.updateResource(ctx, uut, createdResource) + require.True(t, trace.IsCompareFailed(err), "expected a compare failed error, got %T (%s)", err, err) + + // EXPECT that the backend still reflects the first updated revision, + // rather than failed update + r, err := test.getResource(ctx, uut, resourceID) + require.NoError(t, err) + require.Equal(t, "1", r.GetMetadata().Labels["update"]) + + // WHEN I attempt update the backend via the latest revision of the + // record... + updatedResource.GetMetadata().Labels["update"] = "3" + _, err = test.updateResource(ctx, uut, updatedResource) + + // EXPECT the update to succeed, and the backend record to have been + // updated + require.NoError(t, err) + r, err = test.getResource(ctx, uut, resourceID) + require.NoError(t, err) + require.Equal(t, "3", r.GetMetadata().Labels["update"]) + }) + + t.Run("UnconditionalUpsert", func(t *testing.T) { + t.Parallel() + + if test.upsertResource == nil { + t.Skip(test.name + " does not support unconditional upsert") + } + + ctx := newTestContext(t) + clock := clockwork.NewFakeClock() + backend := newTestBackend(t, ctx, clock) + + // GIVEN an IdentityCenter service populated with a resource + uut, err := NewIdentityCenterService(IdentityCenterServiceConfig{Backend: backend}) + require.NoError(t, err) + originalResource := test.createResource(t, ctx, uut, resourceID) + + // GIVEN that the backend record for that resource has been changed + // between us looking up the original resource and us committing + // any changes to it... + tmpResource, err := test.getResource(ctx, uut, resourceID) + require.NoError(t, err) + tmpResource.GetMetadata().Labels = map[string]string{"update": "1"} + _, err = test.updateResource(ctx, uut, tmpResource) + require.NoError(t, err) + + // WHEN I attempt to Update the modified original resource + _, err = test.updateResource(ctx, uut, originalResource) + + // EXPECT the Update to fail due to the changed underlying record + require.True(t, trace.IsCompareFailed(err), "expected a compare failed error, got %T (%s)", err, err) + + // WHEN I attempt to Upsert the modified original resource + originalResource.GetMetadata().Labels = map[string]string{"update": "2"} + _, err = test.upsertResource(ctx, uut, originalResource) + + // EXPECT that an upsert will succeed, even though the underlying + // record has changed + require.NoError(t, err) + + // EXPECT that the backend reflects the updated values from the + // upsert + r, err := test.getResource(ctx, uut, resourceID) + require.NoError(t, err) + require.Equal(t, "2", r.GetMetadata().Labels["update"]) + }) + }) + } +} + +func makeTestIdentityCenterAccount(t *testing.T, ctx context.Context, svc services.IdentityCenter, id string) services.IdentityCenterAccount { + t.Helper() + created, err := svc.CreateIdentityCenterAccount(ctx, services.IdentityCenterAccount{ + Account: &identitycenterv1.Account{ + Kind: types.KindIdentityCenterAccount, + Version: types.V1, + Metadata: &headerv1.Metadata{Name: id}, + Spec: &identitycenterv1.AccountSpec{ + Id: "aws-account-id-" + id, + Arn: fmt.Sprintf("arn:aws:sso::%s:", id), + Description: "Test account " + id, + PermissionSetInfo: []*identitycenterv1.PermissionSetInfo{ + { + Name: "dummy", + Arn: "arn:aws:sso:::permissionSet/ic-instance/ps-instance", + }, + }, + }, + }, + }) + require.NoError(t, err) + return created +} + +func makeTestIdentityCenterPermissionSet(t *testing.T, ctx context.Context, svc services.IdentityCenter, id string) *identitycenterv1.PermissionSet { + t.Helper() + created, err := svc.CreatePermissionSet(ctx, &identitycenterv1.PermissionSet{ + Kind: types.KindIdentityCenterPermissionSet, + Version: types.V1, + Metadata: &headerv1.Metadata{Name: id}, + Spec: &identitycenterv1.PermissionSetSpec{ + Arn: fmt.Sprintf("arn:aws:sso:::permissionSet/ic-instance/%s", id), + Name: "aws-permission-set-" + id, + Description: "Test permission set " + id, + }, + }) + require.NoError(t, err) + return created +} + +func makeTestIdentityCenterAccountAssignment(t *testing.T, ctx context.Context, svc services.IdentityCenter, id string) services.IdentityCenterAccountAssignment { + t.Helper() + created, err := svc.CreateAccountAssignment(ctx, services.IdentityCenterAccountAssignment{ + AccountAssignment: &identitycenterv1.AccountAssignment{ + Kind: types.KindIdentityCenterAccountAssignment, + Version: types.V1, + Metadata: &headerv1.Metadata{Name: id}, + Spec: &identitycenterv1.AccountAssignmentSpec{ + Display: "Some-Permission-set on Some-AWS-account", + PermissionSet: &identitycenterv1.PermissionSetInfo{ + Arn: "arn:aws:sso:::permissionSet/ic-instance/ps-instance", + Name: "some permission set", + }, + AccountName: "Some Account Name", + AccountId: "some account id", + }, + }, + }) + require.NoError(t, err) + return created +} + +func makeTestIdentityCenterPrincipalAssignment(t *testing.T, ctx context.Context, svc services.IdentityCenterPrincipalAssignments, id string) *identitycenterv1.PrincipalAssignment { + t.Helper() + created, err := svc.CreatePrincipalAssignment(ctx, &identitycenterv1.PrincipalAssignment{ + Kind: types.KindIdentityCenterPrincipalAssignment, + Version: types.V1, + Metadata: &headerv1.Metadata{Name: id}, + Spec: &identitycenterv1.PrincipalAssignmentSpec{ + PrincipalType: identitycenterv1.PrincipalType_PRINCIPAL_TYPE_USER, + PrincipalId: id, + ExternalIdSource: "scim", + ExternalId: "some external id", + }, + Status: &identitycenterv1.PrincipalAssignmentStatus{ + ProvisioningState: identitycenterv1.ProvisioningState_PROVISIONING_STATE_STALE, + }, + }) + require.NoError(t, err) + return created +} From 9191081d8fe3f94d043e251355bdc1aaaea71ad5 Mon Sep 17 00:00:00 2001 From: Sakshyam Shah Date: Tue, 22 Oct 2024 08:40:19 -0400 Subject: [PATCH 10/70] update PluginAWSICSettings proto message: (#47729) - add access_list_default_owners - add saml_idp_service_provider_name --- api/proto/teleport/legacy/types/types.proto | 8 + api/types/types.pb.go | 766 +++++++++++--------- 2 files changed, 446 insertions(+), 328 deletions(-) diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 3014206024d36..87b50603ac146 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -6518,6 +6518,14 @@ message PluginAWSICSettings { // Provisioning holds settings for provisioing users and groups into AWS AWSICProvisioningSpec provisioning_spec = 4; + + // AccessListDefaultOwners is a list of default owners for Access List created for + // user groups imported from AWS Idenity Center. + repeated string access_list_default_owners = 5; + + // SAMLIdPServiceProviderName is the name of a SAML service provider created + // for the Identity Center. + string saml_idp_service_provider_name = 6; } // AWSICProvisioningSpec holds provisioning-specific Identity Center settings diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 773dfea65c92b..b0cfa923ae986 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -16689,10 +16689,16 @@ type PluginAWSICSettings struct { // InstanceARN is the arn of the Identity Center instance to manage Arn string `protobuf:"bytes,3,opt,name=arn,proto3" json:"arn,omitempty"` // Provisioning holds settings for provisioing users and groups into AWS - ProvisioningSpec *AWSICProvisioningSpec `protobuf:"bytes,4,opt,name=provisioning_spec,json=provisioningSpec,proto3" json:"provisioning_spec,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + ProvisioningSpec *AWSICProvisioningSpec `protobuf:"bytes,4,opt,name=provisioning_spec,json=provisioningSpec,proto3" json:"provisioning_spec,omitempty"` + // AccessListDefaultOwners is a list of default owners for Access List created for + // user groups imported from AWS Idenity Center. + AccessListDefaultOwners []string `protobuf:"bytes,5,rep,name=access_list_default_owners,json=accessListDefaultOwners,proto3" json:"access_list_default_owners,omitempty"` + // SAMLIdPServiceProviderName is the name of a SAML service provider created + // for the Identity Center. + SamlIdpServiceProviderName string `protobuf:"bytes,6,opt,name=saml_idp_service_provider_name,json=samlIdpServiceProviderName,proto3" json:"saml_idp_service_provider_name,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *PluginAWSICSettings) Reset() { *m = PluginAWSICSettings{} } @@ -20650,7 +20656,7 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 28794 bytes of a gzipped FileDescriptorProto + // 28842 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, @@ -22128,329 +22134,332 @@ 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, 0x71, 0xe4, 0xb8, 0xee, 0xd3, - 0x24, 0x67, 0x86, 0xf3, 0x38, 0x1f, 0x3d, 0xb5, 0xa3, 0xdd, 0xd1, 0xce, 0x7e, 0x68, 0x5b, 0xbb, - 0xeb, 0x5d, 0xca, 0x92, 0xbd, 0xab, 0xd8, 0xd2, 0x2a, 0x91, 0xe5, 0x1e, 0xb2, 0x39, 0xe4, 0x0e, - 0xbf, 0xd4, 0x4d, 0xce, 0x78, 0x25, 0xdb, 0x1d, 0x8a, 0xec, 0x99, 0x61, 0xc4, 0x69, 0xd2, 0x64, - 0x53, 0xeb, 0x15, 0x02, 0xe4, 0x0b, 0xb0, 0x81, 0x24, 0x8e, 0x13, 0x27, 0x40, 0x8c, 0x20, 0x40, - 0x0e, 0x11, 0x82, 0x1c, 0xf2, 0x17, 0x24, 0xa7, 0xdc, 0x04, 0x18, 0x06, 0x7c, 0xc8, 0x29, 0x01, - 0x84, 0x44, 0x40, 0x72, 0x48, 0x72, 0x0b, 0xe2, 0x83, 0x4f, 0x41, 0xbd, 0xaa, 0xea, 0xae, 0xfe, - 0x20, 0x77, 0x56, 0x2b, 0x25, 0x31, 0xe0, 0xd3, 0x0c, 0xab, 0xde, 0xab, 0xae, 0xef, 0x7a, 0xf5, - 0xea, 0xbd, 0xdf, 0x23, 0x2f, 0x02, 0xf1, 0xe5, 0x64, 0x7f, 0x61, 0xf2, 0x0f, 0x6e, 0x8a, 0x1c, - 0x7f, 0x45, 0x05, 0xa2, 0xee, 0xb9, 0x04, 0x61, 0x9e, 0x0a, 0xdd, 0x7d, 0xd7, 0x73, 0x8e, 0x99, - 0xc8, 0x2e, 0x37, 0x72, 0x43, 0x4a, 0xe7, 0x1a, 0x9a, 0x25, 0x16, 0x83, 0x9b, 0x7f, 0x8b, 0xff, - 0xa2, 0x8b, 0xb5, 0x33, 0x16, 0xca, 0x07, 0xfa, 0x2f, 0xa9, 0xc0, 0x26, 0x06, 0x16, 0x98, 0xf4, - 0x87, 0x18, 0x9f, 0x00, 0x0f, 0xfd, 0x4c, 0xe8, 0x0a, 0x84, 0xb5, 0x68, 0x4a, 0x44, 0xf4, 0xd4, - 0x37, 0xd5, 0x51, 0x24, 0x85, 0xd7, 0xfe, 0x6d, 0x78, 0x26, 0x91, 0x81, 0xee, 0xa7, 0x68, 0xc9, - 0x13, 0x88, 0x02, 0xcb, 0xf4, 0x37, 0x95, 0x05, 0xae, 0xc1, 0xea, 0x3b, 0x4e, 0x67, 0xec, 0x8c, - 0xf9, 0x41, 0xc5, 0x47, 0x84, 0xa5, 0xc9, 0xe7, 0xd4, 0x5f, 0xa5, 0xc4, 0x2d, 0x60, 0x77, 0x38, - 0xf4, 0x26, 0xde, 0xb8, 0x33, 0x0a, 0xe9, 0x1f, 0xc8, 0x29, 0x3c, 0x8b, 0x87, 0xe4, 0x5d, 0xc4, - 0x8d, 0x1f, 0x8e, 0x85, 0xa3, 0x7c, 0x57, 0x18, 0x9f, 0xe6, 0xee, 0x7e, 0x21, 0x7c, 0x8c, 0xeb, - 0x94, 0x5a, 0x97, 0x89, 0xa9, 0xd0, 0x2a, 0x95, 0x5a, 0x5e, 0x30, 0x2f, 0xb0, 0x32, 0x63, 0x54, - 0xa4, 0x9c, 0x50, 0xf1, 0xa8, 0x02, 0x62, 0x37, 0x68, 0x45, 0xb8, 0x54, 0xb9, 0x7d, 0xe4, 0x2b, - 0xb0, 0xd2, 0xef, 0xc9, 0xe1, 0xd1, 0xa2, 0x57, 0xdf, 0x4a, 0x8f, 0x41, 0xb4, 0x06, 0x65, 0x94, - 0x17, 0xcc, 0x6c, 0x9f, 0xa7, 0xee, 0xae, 0x85, 0x34, 0x35, 0xda, 0xae, 0x10, 0x38, 0xe3, 0x6c, - 0x64, 0x1d, 0x52, 0xfe, 0x42, 0x4c, 0xf5, 0x7b, 0x74, 0xb2, 0x4c, 0x24, 0x90, 0x58, 0x93, 0xff, - 0xd2, 0x7e, 0x1d, 0x6e, 0x9d, 0xb5, 0x8f, 0xe8, 0x44, 0x9f, 0xd1, 0xe1, 0x2b, 0xe6, 0x66, 0x27, - 0xd6, 0x6f, 0xd7, 0x40, 0xc6, 0xb8, 0xec, 0x8b, 0x01, 0x17, 0x69, 0xed, 0x71, 0x5f, 0xfb, 0xed, - 0x34, 0xac, 0x87, 0x75, 0x53, 0xe4, 0x05, 0xc8, 0xf8, 0xc5, 0xae, 0xfb, 0x6f, 0x28, 0x32, 0x11, - 0x2d, 0xdc, 0x44, 0x22, 0x2a, 0x04, 0xe0, 0x93, 0xab, 0x7d, 0x2a, 0x3f, 0x73, 0x98, 0xab, 0x98, - 0x28, 0x9e, 0x37, 0xee, 0xc3, 0x3a, 0x5a, 0xcb, 0xe0, 0xe9, 0xe2, 0xf5, 0xb9, 0xc6, 0x73, 0xbe, - 0xd2, 0x3a, 0xfb, 0xe1, 0x47, 0x57, 0x17, 0x50, 0x3f, 0xbd, 0x4a, 0x79, 0xe9, 0x0e, 0x4f, 0x33, - 0x25, 0xd5, 0x43, 0x66, 0xb6, 0xea, 0x81, 0x37, 0x65, 0x86, 0xea, 0x61, 0x71, 0x8e, 0xea, 0x21, - 0xe0, 0x94, 0x55, 0x0f, 0xa8, 0x80, 0x5a, 0x9e, 0xa5, 0x80, 0x0a, 0x78, 0x98, 0x02, 0xea, 0x3a, - 0x6f, 0xee, 0xb8, 0xf3, 0xd0, 0xc6, 0x7e, 0xe0, 0xf1, 0x10, 0xb0, 0x21, 0x66, 0xe7, 0x21, 0x3e, - 0x4e, 0xef, 0xae, 0x80, 0x78, 0xd1, 0xd6, 0xfe, 0x58, 0x89, 0xdc, 0xdb, 0xc5, 0x50, 0xdc, 0x80, - 0xf5, 0xfe, 0x29, 0xbd, 0x50, 0x38, 0x3d, 0x49, 0x32, 0x5c, 0x33, 0xd7, 0x44, 0x2a, 0x93, 0x0e, - 0x3f, 0x07, 0x1b, 0x3e, 0x19, 0x17, 0x90, 0xd0, 0xd3, 0xc5, 0xf4, 0xb9, 0x39, 0x6c, 0xc3, 0x0b, - 0xb0, 0xe9, 0x13, 0xf2, 0xbb, 0x17, 0x13, 0x0e, 0xd7, 0x4c, 0x55, 0x64, 0xf0, 0x70, 0xfb, 0x13, - 0xed, 0x38, 0x2a, 0x27, 0x7c, 0x46, 0xb5, 0xd2, 0xfe, 0x3e, 0x1d, 0xba, 0xd3, 0x88, 0xcf, 0xec, - 0x42, 0x8e, 0x1e, 0x56, 0xbc, 0x93, 0xf8, 0xb6, 0x72, 0x6d, 0x46, 0xf7, 0x73, 0x9b, 0x00, 0xcb, - 0x6a, 0x98, 0x30, 0x99, 0x0c, 0x85, 0x89, 0x80, 0xcd, 0xce, 0x63, 0x26, 0xa7, 0xe2, 0xf4, 0x13, - 0xc5, 0xb1, 0x3d, 0x24, 0x3f, 0xbf, 0x38, 0x21, 0x54, 0xd2, 0xd9, 0x87, 0xe7, 0xb2, 0xff, 0x4b, - 0x7c, 0xa0, 0x0d, 0xa8, 0x02, 0x98, 0x84, 0x0b, 0x4f, 0x27, 0x48, 0x3a, 0xb1, 0xc2, 0xb1, 0x97, - 0xb0, 0x64, 0x75, 0x2a, 0xfe, 0x15, 0xc5, 0x1a, 0xb0, 0x8a, 0x37, 0x0a, 0x51, 0x60, 0x26, 0x41, - 0x85, 0x15, 0x6f, 0x7c, 0xa1, 0x52, 0x33, 0x73, 0x94, 0x4f, 0x14, 0x73, 0x02, 0xcf, 0xca, 0xf7, - 0x80, 0x70, 0x25, 0x17, 0x05, 0x0a, 0xe5, 0xdc, 0x1e, 0x08, 0xae, 0x0b, 0x58, 0xd5, 0xf3, 0x9d, - 0x70, 0x02, 0x27, 0xd3, 0x4e, 0xe0, 0xe2, 0xec, 0x21, 0x99, 0x13, 0xe1, 0x24, 0x10, 0x59, 0x52, - 0xb2, 0xc8, 0x22, 0xdf, 0x0a, 0xd2, 0xa1, 0x5b, 0x81, 0xf6, 0x97, 0x69, 0x78, 0xfe, 0x0c, 0xc3, - 0x35, 0xe7, 0x9b, 0x5f, 0x85, 0x1c, 0x53, 0xbc, 0xb3, 0xed, 0x93, 0x19, 0xad, 0xf8, 0x71, 0x4a, - 0xdf, 0xf5, 0x3a, 0x7c, 0xaf, 0xa3, 0x42, 0x65, 0xb0, 0xdf, 0xc1, 0xc4, 0xff, 0x9f, 0xfc, 0x2a, - 0x6c, 0xb0, 0x0d, 0x8d, 0x99, 0xf5, 0x1c, 0x4d, 0x07, 0x67, 0xd8, 0xd1, 0x76, 0x84, 0x0f, 0x42, - 0x84, 0x15, 0x37, 0x39, 0xdc, 0x31, 0x2c, 0x3f, 0x8d, 0xb4, 0x20, 0x87, 0x64, 0x47, 0x9d, 0xfe, - 0xe0, 0x4c, 0xc6, 0xf0, 0xc2, 0xc3, 0x41, 0x66, 0x63, 0xd6, 0x88, 0x34, 0xa1, 0x84, 0xbf, 0xc9, - 0x4d, 0xd8, 0x70, 0xa7, 0xa7, 0xf4, 0x22, 0xc5, 0xe6, 0x02, 0x7f, 0x3d, 0x5d, 0x34, 0xd7, 0xdc, - 0xe9, 0xa9, 0x3e, 0x1a, 0xe1, 0x90, 0xe2, 0x33, 0xeb, 0x26, 0xa5, 0x63, 0xab, 0x56, 0x50, 0x2e, - 0x21, 0x25, 0x2d, 0x80, 0xad, 0x5b, 0x4e, 0xbb, 0x05, 0xcc, 0xe8, 0x86, 0x47, 0x78, 0x61, 0x3f, - 0xb4, 0x9f, 0xa6, 0x84, 0xb4, 0x3c, 0x7b, 0xde, 0xff, 0x62, 0x88, 0x12, 0x86, 0xe8, 0x16, 0xa8, - 0xb4, 0xeb, 0x83, 0x4d, 0xc5, 0x1f, 0xa3, 0x75, 0x77, 0x7a, 0xea, 0xf7, 0x9d, 0xdc, 0xf1, 0x4b, - 0x72, 0xc7, 0xbf, 0x22, 0xa4, 0xe9, 0xc4, 0xed, 0x61, 0x76, 0x97, 0x6b, 0xff, 0x99, 0x86, 0x9b, - 0x67, 0xdb, 0x04, 0x7e, 0x31, 0x6e, 0x09, 0xe3, 0x16, 0x51, 0x74, 0x2c, 0xc6, 0x14, 0x1d, 0x09, - 0x6b, 0x6f, 0x29, 0x69, 0xed, 0xc5, 0xd4, 0x2a, 0xcb, 0x09, 0x6a, 0x95, 0xc4, 0x05, 0x9a, 0x7d, - 0xcc, 0x02, 0x5d, 0x91, 0xe7, 0xc9, 0xbf, 0xa5, 0xc4, 0xf5, 0x27, 0x2c, 0xda, 0xbf, 0x0d, 0xe7, - 0x84, 0x68, 0xcf, 0x4e, 0x8e, 0x40, 0x5b, 0x96, 0xbb, 0x7b, 0x3b, 0x49, 0xa8, 0x47, 0xb2, 0x04, - 0xc1, 0x7b, 0x93, 0x8b, 0xf3, 0x41, 0xfe, 0xff, 0x1f, 0x41, 0x9e, 0x3c, 0x80, 0xf3, 0x88, 0x8f, - 0xdc, 0x95, 0xf5, 0x7c, 0xf6, 0xd8, 0x39, 0xe2, 0xf3, 0xe1, 0x5a, 0x4c, 0xec, 0xed, 0x77, 0xa5, - 0xea, 0x98, 0xce, 0x51, 0x79, 0xc1, 0xdc, 0x9a, 0x24, 0xa4, 0x47, 0xef, 0x08, 0x7f, 0xa3, 0x80, - 0xf6, 0xf8, 0xfe, 0xc2, 0x6b, 0x6e, 0xb4, 0xc3, 0xe9, 0x35, 0x57, 0xea, 0xbd, 0xe7, 0x61, 0x6d, - 0xec, 0x1c, 0x8d, 0x9d, 0xc9, 0x49, 0xe8, 0x02, 0xb7, 0xca, 0x13, 0x45, 0xc7, 0x08, 0x94, 0xb6, - 0x27, 0x12, 0xb2, 0x05, 0x93, 0x56, 0xf2, 0xaf, 0x7e, 0x89, 0xe3, 0x40, 0x67, 0x93, 0x5c, 0x41, - 0xf6, 0xe3, 0x7e, 0x26, 0x9b, 0x52, 0xd3, 0x26, 0xc7, 0x92, 0x3b, 0xea, 0x0f, 0x1c, 0xed, 0x6f, - 0x15, 0x21, 0x11, 0x24, 0x75, 0x1e, 0x79, 0x5b, 0x32, 0x86, 0x4b, 0xc7, 0xc4, 0x90, 0x24, 0x16, - 0xd9, 0x6e, 0x88, 0xc3, 0x9b, 0x61, 0x42, 0x08, 0xde, 0x0c, 0x53, 0x9e, 0xc2, 0xa2, 0x87, 0x5f, - 0x80, 0xef, 0x89, 0x17, 0x75, 0xba, 0xe7, 0x1d, 0xdc, 0x21, 0xb7, 0x61, 0x99, 0x3d, 0xa2, 0x8b, - 0xea, 0x6e, 0x84, 0xaa, 0x7b, 0x70, 0xc7, 0x14, 0xf9, 0xda, 0x0f, 0x7d, 0x2d, 0x74, 0xac, 0x11, - 0x07, 0x77, 0xc8, 0x2b, 0x67, 0x33, 0x6e, 0xcb, 0x0a, 0xe3, 0x36, 0xdf, 0xb0, 0xed, 0xd5, 0x90, - 0x61, 0xdb, 0xf5, 0xf9, 0xbd, 0xc5, 0xdf, 0x0e, 0x18, 0x9c, 0x57, 0x00, 0xf3, 0xf2, 0x53, 0x05, - 0x2e, 0xcf, 0xe5, 0x20, 0x97, 0x20, 0xab, 0x37, 0x2b, 0xad, 0x60, 0x7c, 0xe9, 0x9a, 0x11, 0x29, - 0x64, 0x0f, 0x56, 0x76, 0x3b, 0x93, 0x7e, 0x97, 0x4e, 0xe3, 0x44, 0x65, 0x5e, 0xac, 0x58, 0x9f, - 0xbc, 0xbc, 0x60, 0x06, 0xbc, 0xc4, 0x86, 0x4d, 0x5c, 0x0b, 0xa1, 0xd0, 0x29, 0xe9, 0x04, 0xb5, - 0x41, 0xac, 0xc0, 0x18, 0x1b, 0xdd, 0x67, 0x62, 0x89, 0xd1, 0x25, 0xf8, 0x9e, 0x90, 0x45, 0x66, - 0x57, 0xf0, 0x09, 0x70, 0x09, 0x6f, 0x41, 0xb6, 0x29, 0x5e, 0xf5, 0x24, 0x6b, 0x50, 0xf1, 0x82, - 0x67, 0xfa, 0xb9, 0xda, 0xef, 0x2b, 0xe2, 0x6e, 0xff, 0xf8, 0x86, 0x48, 0x51, 0x67, 0x7a, 0xf3, - 0xa3, 0xce, 0xf4, 0x3e, 0x61, 0xd4, 0x19, 0xed, 0xaf, 0x39, 0x6a, 0x70, 0xa5, 0xd7, 0x8c, 0x04, - 0x1b, 0x7d, 0x5a, 0xab, 0x5e, 0x23, 0x34, 0x3b, 0x9f, 0x97, 0xa2, 0x96, 0xc5, 0xbf, 0x35, 0xdb, - 0xb8, 0x57, 0x9a, 0xaa, 0x7f, 0x9a, 0x86, 0x4b, 0xf3, 0xd8, 0x13, 0xe3, 0xa2, 0x2a, 0x4f, 0x16, - 0x17, 0xf5, 0x36, 0x64, 0x59, 0x9a, 0x6f, 0xb2, 0x8a, 0x1d, 0xce, 0x59, 0x69, 0x87, 0x8b, 0x6c, - 0xf2, 0x3c, 0x2c, 0xe9, 0x05, 0x2b, 0x08, 0xd5, 0x83, 0xb6, 0x65, 0x9d, 0xee, 0x04, 0xad, 0x96, - 0x78, 0x16, 0xf9, 0x66, 0x3c, 0x3a, 0x15, 0x8f, 0xd1, 0xb3, 0x23, 0x75, 0x48, 0x0c, 0xd0, 0x1b, - 0xeb, 0x1b, 0x00, 0x50, 0x73, 0x4c, 0x57, 0x33, 0x1e, 0xe9, 0x4a, 0x83, 0xa5, 0xe6, 0xd8, 0x99, - 0x38, 0x9e, 0x6c, 0xf7, 0x35, 0xc2, 0x14, 0x93, 0xe7, 0x70, 0xab, 0xac, 0xce, 0x23, 0xe6, 0x84, - 0xbb, 0x24, 0x03, 0x23, 0xa0, 0x19, 0x17, 0x4d, 0x36, 0x25, 0x12, 0xca, 0x50, 0xed, 0x4c, 0xdd, - 0xee, 0x49, 0xdb, 0xac, 0x72, 0x51, 0x83, 0x31, 0x0c, 0x30, 0x95, 0x36, 0x70, 0x62, 0x4a, 0x24, - 0xda, 0x77, 0x15, 0xd8, 0x4a, 0x6a, 0x07, 0xb9, 0x04, 0x19, 0x37, 0x31, 0x10, 0x97, 0xcb, 0x7c, - 0x07, 0x73, 0xf4, 0xaf, 0x7d, 0x34, 0x1c, 0x9f, 0x76, 0x3c, 0xd9, 0x3a, 0x4e, 0x4a, 0x36, 0x81, - 0xfe, 0x28, 0xe1, 0xff, 0xe4, 0xaa, 0xd8, 0xa3, 0xd3, 0xb1, 0xd0, 0x5d, 0xf8, 0x47, 0xd3, 0x01, - 0x2a, 0xbd, 0x66, 0x63, 0xc4, 0x00, 0xa5, 0x5f, 0x86, 0x0c, 0xad, 0x56, 0x64, 0xf6, 0xd2, 0xf9, - 0xa3, 0xd7, 0xaa, 0x9c, 0x88, 0xd5, 0x6a, 0xd2, 0x39, 0x1d, 0x98, 0x48, 0xac, 0x1d, 0xc2, 0x7a, - 0x98, 0x82, 0x18, 0x61, 0x08, 0xc2, 0xdc, 0x5d, 0x95, 0x97, 0xb4, 0x3b, 0x1c, 0x32, 0x0b, 0xed, - 0xdd, 0x67, 0xff, 0xf1, 0xa3, 0xab, 0x40, 0x7f, 0x32, 0x9e, 0x24, 0x88, 0x42, 0xed, 0xfb, 0x29, - 0xd8, 0x0a, 0x9c, 0x42, 0xc5, 0x1a, 0xfa, 0xb9, 0xf5, 0x50, 0xd2, 0x43, 0x1e, 0x34, 0x42, 0xd0, - 0x8a, 0x37, 0x70, 0x8e, 0xe1, 0xfe, 0x1e, 0x6c, 0xcf, 0xa2, 0x27, 0x2f, 0xc0, 0x0a, 0xe2, 0x88, - 0x8c, 0x3a, 0x5d, 0x47, 0xde, 0xfb, 0x5c, 0x91, 0x68, 0x06, 0xf9, 0xda, 0x8f, 0x15, 0xb8, 0xc8, - 0xed, 0x8a, 0x6b, 0x9d, 0xbe, 0xeb, 0x39, 0x6e, 0xc7, 0xed, 0x3a, 0x9f, 0x8e, 0x87, 0xdd, 0x5e, - 0x68, 0x1f, 0xbb, 0x11, 0x36, 0x1f, 0x8f, 0x7d, 0x6d, 0x76, 0x6b, 0xc9, 0x6d, 0xc4, 0xc6, 0xe9, - 0xb2, 0xc9, 0x9b, 0x61, 0x1e, 0xcd, 0x2e, 0x4d, 0x90, 0x3d, 0x9a, 0x91, 0x42, 0xfb, 0x0d, 0xb8, - 0x32, 0xff, 0x03, 0xe4, 0x1b, 0xb0, 0x86, 0xc1, 0x56, 0xda, 0xa3, 0xe3, 0x71, 0xa7, 0xe7, 0x08, - 0x55, 0x98, 0xd0, 0x44, 0xca, 0x79, 0x0c, 0xea, 0x87, 0x7b, 0xd8, 0x1e, 0x63, 0x18, 0x17, 0xce, - 0x14, 0x32, 0xde, 0x97, 0x4b, 0xd3, 0x7e, 0x53, 0x01, 0x12, 0x2f, 0x83, 0x7c, 0x19, 0x56, 0xdb, - 0xad, 0x82, 0xe5, 0x75, 0xc6, 0x5e, 0x79, 0x38, 0x1d, 0x73, 0x9c, 0x1d, 0xe6, 0x70, 0xe9, 0x75, - 0xe9, 0x56, 0x32, 0xf6, 0xec, 0x93, 0xe1, 0x74, 0x6c, 0x86, 0xe8, 0x30, 0x4a, 0x88, 0xe3, 0xbc, - 0xdb, 0xeb, 0x3c, 0x0a, 0x47, 0x09, 0xe1, 0x69, 0xa1, 0x28, 0x21, 0x3c, 0x4d, 0xfb, 0x40, 0x81, - 0x1d, 0x61, 0xfb, 0xd3, 0x4b, 0xa8, 0x4b, 0x01, 0x61, 0x05, 0xc6, 0x02, 0xd8, 0x71, 0x9e, 0x48, - 0xbb, 0x29, 0x90, 0x37, 0xb0, 0x82, 0x28, 0xdb, 0x32, 0x5e, 0xf2, 0x55, 0xc8, 0x58, 0xde, 0x70, - 0x74, 0x06, 0xe8, 0x0d, 0xd5, 0x1f, 0x51, 0x6f, 0x38, 0xc2, 0x22, 0x90, 0x53, 0x73, 0x60, 0x4b, - 0xae, 0x9c, 0xa8, 0x31, 0xa9, 0xc1, 0x32, 0xc7, 0x58, 0x8a, 0x3c, 0xf3, 0xcd, 0x69, 0xd3, 0xee, - 0x86, 0xc0, 0xf7, 0xe0, 0xc0, 0x82, 0xa6, 0x28, 0x43, 0xfb, 0x03, 0x05, 0x72, 0x54, 0xda, 0xc0, - 0x5b, 0xdc, 0xd3, 0x4e, 0xe9, 0xb0, 0xe0, 0x28, 0x5e, 0x89, 0xfd, 0xe2, 0xcf, 0x74, 0x1a, 0x7f, - 0x09, 0x36, 0x22, 0x0c, 0x44, 0x43, 0xcf, 0xee, 0x41, 0xbf, 0xdb, 0x61, 0x41, 0x07, 0xd8, 0x13, - 0x6b, 0x28, 0x4d, 0xfb, 0x5d, 0x05, 0xb6, 0xe8, 0x9d, 0xbf, 0x82, 0xea, 0x5e, 0x73, 0x3a, 0x10, - 0xeb, 0x9d, 0x4a, 0x50, 0xc2, 0x88, 0x8c, 0x79, 0x9d, 0x32, 0x09, 0x8a, 0xa7, 0x99, 0x7e, 0x2e, - 0x29, 0x43, 0x96, 0x9f, 0x2f, 0x13, 0x8e, 0x07, 0x78, 0x45, 0x52, 0x26, 0x04, 0x05, 0x73, 0x22, - 0xda, 0x12, 0xdc, 0xc2, 0x38, 0x8f, 0xe9, 0x73, 0x6b, 0xff, 0xa5, 0xc0, 0x85, 0x19, 0x3c, 0xe4, - 0x75, 0x58, 0x44, 0x8f, 0x18, 0x3e, 0x7a, 0x97, 0x66, 0x7c, 0xc2, 0xeb, 0x9e, 0x1c, 0xdc, 0x61, - 0x07, 0xd1, 0x29, 0xfd, 0x61, 0x32, 0x2e, 0xf2, 0x36, 0xac, 0xe8, 0xbd, 0x1e, 0xbf, 0xce, 0xa4, - 0x42, 0xd7, 0x99, 0x19, 0x5f, 0x7c, 0xc9, 0xa7, 0x67, 0xd7, 0x19, 0x66, 0x9b, 0xdd, 0xeb, 0xd9, - 0xdc, 0xdb, 0x27, 0x28, 0xef, 0xe2, 0xaf, 0xc0, 0x7a, 0x98, 0xf8, 0x89, 0x1c, 0x14, 0x7e, 0xa8, - 0x80, 0x1a, 0xae, 0xc3, 0x67, 0x83, 0x4c, 0x92, 0x34, 0xcc, 0x8f, 0x99, 0x54, 0x7f, 0x94, 0x82, - 0x67, 0x12, 0x7b, 0x98, 0xbc, 0x08, 0x4b, 0xfa, 0x68, 0x54, 0x29, 0xf2, 0x59, 0xc5, 0x25, 0x24, - 0xd4, 0x12, 0x87, 0x6e, 0x7b, 0x8c, 0x88, 0xbc, 0x0c, 0x59, 0x9c, 0x99, 0x94, 0x21, 0x15, 0x20, - 0xf3, 0x31, 0x25, 0x4a, 0x04, 0x99, 0x4f, 0x10, 0x92, 0x12, 0xac, 0x73, 0x90, 0x02, 0xd3, 0x39, - 0x76, 0xbe, 0xed, 0x43, 0x44, 0x23, 0x8a, 0xb5, 0x50, 0x3d, 0xdb, 0x63, 0x96, 0x27, 0xbb, 0xe9, - 0x87, 0xb9, 0x48, 0x15, 0x54, 0x2c, 0x53, 0x2e, 0x89, 0xc1, 0x03, 0x22, 0x6c, 0x04, 0xab, 0xc4, - 0x8c, 0xb2, 0x62, 0x9c, 0xfe, 0x70, 0xe9, 0x93, 0x49, 0xff, 0xd8, 0x3d, 0x75, 0x5c, 0xef, 0xb3, - 0x1b, 0xae, 0xe0, 0x1b, 0x67, 0x1a, 0xae, 0x3f, 0xc9, 0xb0, 0xc5, 0x1c, 0x65, 0xa3, 0x12, 0x8d, - 0x84, 0x08, 0x8b, 0x12, 0x0d, 0xc6, 0xd0, 0x66, 0x6e, 0xf8, 0x45, 0x58, 0x66, 0xf0, 0x08, 0x62, - 0x65, 0x5c, 0x4e, 0xac, 0x02, 0xa3, 0x39, 0xb8, 0xc3, 0xc4, 0x17, 0xe6, 0x9a, 0x33, 0x31, 0x05, - 0x2b, 0x39, 0x80, 0x5c, 0x61, 0xe0, 0x74, 0xdc, 0xe9, 0xa8, 0x75, 0xb6, 0xd7, 0xc3, 0x6d, 0xde, - 0x96, 0xd5, 0x2e, 0x63, 0xc3, 0x57, 0x47, 0xdc, 0xc9, 0xe5, 0x82, 0x48, 0xcb, 0xb7, 0xd6, 0x67, - 0x91, 0xcf, 0xbf, 0x38, 0xa7, 0x7f, 0xa2, 0x89, 0xc8, 0x17, 0x76, 0x45, 0xe1, 0xe6, 0xfc, 0x36, - 0xac, 0x57, 0x3b, 0x13, 0xaf, 0x35, 0xee, 0xb8, 0x13, 0x84, 0x55, 0x3b, 0x03, 0xec, 0xcc, 0x8e, - 0x08, 0xd9, 0x89, 0x3a, 0x46, 0xcf, 0x67, 0x65, 0x1a, 0xcc, 0x70, 0x71, 0x54, 0x5e, 0x2a, 0xf5, - 0xdd, 0xce, 0xa0, 0xff, 0xbe, 0x70, 0x6a, 0x62, 0xf2, 0xd2, 0x91, 0x48, 0x34, 0x83, 0x7c, 0xed, - 0xeb, 0xb1, 0x71, 0x63, 0xb5, 0xcc, 0xc1, 0x32, 0x77, 0x79, 0x65, 0x2e, 0xa0, 0x4d, 0xa3, 0x5e, - 0xac, 0xd4, 0xf7, 0x54, 0x85, 0xac, 0x03, 0x34, 0xcd, 0x46, 0xc1, 0xb0, 0x2c, 0xfa, 0x3b, 0x45, - 0x7f, 0x73, 0xff, 0xd0, 0x52, 0xbb, 0xaa, 0xa6, 0x25, 0x17, 0xd1, 0x8c, 0xf6, 0x23, 0x05, 0xce, - 0x27, 0x0f, 0x25, 0x69, 0x01, 0x3a, 0x09, 0xf3, 0x77, 0xe4, 0x2f, 0xcf, 0x1d, 0xf7, 0xc4, 0xe4, - 0xa8, 0xb3, 0xb1, 0xc7, 0x9c, 0x58, 0x53, 0xe2, 0xb1, 0x28, 0x88, 0x13, 0xdf, 0xef, 0x69, 0x05, - 0xd8, 0x9e, 0x55, 0x46, 0xb8, 0xa9, 0x1b, 0x90, 0xd3, 0x9b, 0xcd, 0x6a, 0xa5, 0xa0, 0xb7, 0x2a, - 0x8d, 0xba, 0xaa, 0x90, 0x15, 0x58, 0xdc, 0x33, 0x1b, 0xed, 0xa6, 0x9a, 0xd2, 0x7e, 0xa0, 0xc0, - 0x5a, 0x25, 0x30, 0xf2, 0x78, 0xda, 0xc5, 0xf7, 0x5a, 0x68, 0xf1, 0x6d, 0xfb, 0xee, 0xf4, 0xfe, - 0x07, 0xce, 0xb4, 0xf2, 0xfe, 0x41, 0x81, 0xcd, 0x18, 0x0f, 0xb1, 0x60, 0x59, 0x3f, 0xb4, 0x1a, - 0x95, 0x62, 0x81, 0xd7, 0xec, 0x6a, 0x60, 0x47, 0x82, 0x11, 0x53, 0x62, 0x5f, 0x61, 0x2e, 0x68, - 0x0f, 0x27, 0xf6, 0xb0, 0xdf, 0x93, 0xa2, 0x1d, 0x96, 0x17, 0x4c, 0x51, 0x12, 0x9e, 0x64, 0xef, - 0x4f, 0xc7, 0x0e, 0x16, 0x9b, 0x0a, 0x29, 0x42, 0xfd, 0xf4, 0x78, 0xc1, 0x68, 0x9e, 0xdc, 0xa1, - 0xf9, 0xf1, 0xa2, 0x83, 0xf2, 0x76, 0xd7, 0x20, 0xc7, 0x6f, 0x2d, 0x78, 0x21, 0xf8, 0x9e, 0x02, - 0xdb, 0xb3, 0xea, 0x4a, 0x2f, 0x42, 0x61, 0x7f, 0xd4, 0xf3, 0x3e, 0x02, 0x7a, 0xd8, 0x11, 0x55, - 0x90, 0x91, 0x37, 0x20, 0x57, 0x99, 0x4c, 0xa6, 0xce, 0xd8, 0x7a, 0xb9, 0x6d, 0x56, 0xf8, 0x04, - 0xb9, 0xfc, 0xef, 0x1f, 0x5d, 0xbd, 0x80, 0x46, 0xc4, 0x63, 0x7b, 0xf2, 0xb2, 0x3d, 0x1d, 0xf7, - 0x43, 0x68, 0xd1, 0x32, 0x87, 0xf6, 0x1d, 0x05, 0x2e, 0xce, 0x6e, 0x24, 0x3d, 0x65, 0x5a, 0x54, - 0x36, 0x0f, 0x5c, 0xfa, 0xf0, 0x94, 0x41, 0x79, 0x3d, 0xe2, 0xd3, 0xe7, 0x13, 0x52, 0x26, 0x3f, - 0x92, 0x70, 0x2a, 0x16, 0x3e, 0x34, 0xcc, 0x24, 0x08, 0xb5, 0xff, 0x48, 0xc1, 0x79, 0x3a, 0x81, - 0x06, 0xce, 0x64, 0xa2, 0x4f, 0xbd, 0x13, 0xc7, 0xf5, 0xb8, 0x48, 0x45, 0x5e, 0x81, 0xa5, 0x93, - 0x27, 0x53, 0x1f, 0x32, 0x72, 0x42, 0x00, 0x37, 0x65, 0x61, 0xde, 0x4c, 0xff, 0x27, 0xd7, 0x40, - 0x0e, 0xd8, 0x9a, 0x46, 0xc8, 0xb8, 0xd4, 0xb6, 0x62, 0xae, 0x8c, 0xfc, 0xd8, 0x8a, 0xaf, 0xc2, - 0x22, 0xaa, 0x0c, 0xf8, 0xf6, 0x28, 0xc4, 0xda, 0xe4, 0xda, 0xa1, 0x42, 0xc1, 0x64, 0x0c, 0xe4, - 0x0b, 0x00, 0x01, 0xda, 0x36, 0xdf, 0xff, 0xc4, 0x55, 0xda, 0x07, 0xdc, 0x36, 0x57, 0x4e, 0x8f, - 0x3a, 0x1c, 0xc2, 0x3a, 0x0f, 0x9b, 0xa2, 0x5b, 0x46, 0x02, 0x69, 0x8a, 0xbf, 0x6c, 0x6d, 0xb0, - 0x8c, 0xca, 0x48, 0xa0, 0x4d, 0x5d, 0x8f, 0x05, 0x9d, 0x44, 0xc0, 0xc9, 0x48, 0x64, 0xc9, 0xeb, - 0xb1, 0xc8, 0x92, 0x59, 0x46, 0x25, 0x87, 0x8f, 0xd4, 0xfe, 0x35, 0x05, 0x2b, 0x87, 0x54, 0xf0, - 0xc0, 0xeb, 0xf4, 0xfc, 0xeb, 0xf9, 0x5d, 0xc8, 0x55, 0x87, 0x1d, 0xfe, 0x84, 0xc0, 0xad, 0x82, - 0x99, 0x9f, 0xdc, 0x60, 0xd8, 0x11, 0xaf, 0x11, 0x13, 0x53, 0x26, 0x7a, 0x8c, 0x8f, 0xdf, 0x7d, - 0x58, 0x62, 0x4f, 0x3a, 0x5c, 0x53, 0x24, 0x44, 0x4f, 0xbf, 0x46, 0x2f, 0xb1, 0x6c, 0x49, 0xeb, - 0xcd, 0x9e, 0x85, 0x64, 0x39, 0x88, 0xe3, 0xe6, 0x49, 0xca, 0x83, 0xc5, 0xb3, 0x29, 0x0f, 0x24, - 0x7c, 0xa0, 0xa5, 0xb3, 0xe0, 0x03, 0x5d, 0xbc, 0x07, 0x39, 0xa9, 0x3e, 0x4f, 0x24, 0x89, 0xfe, - 0x56, 0x0a, 0xd6, 0xb0, 0x55, 0xbe, 0x7d, 0xc7, 0xcf, 0xa7, 0x2a, 0xe4, 0xb5, 0x90, 0x2a, 0x64, - 0x5b, 0x1e, 0x2f, 0xd6, 0xb2, 0x39, 0x3a, 0x90, 0xfb, 0xb0, 0x19, 0x23, 0x24, 0x5f, 0x82, 0x45, - 0x5a, 0x7d, 0x71, 0x75, 0x54, 0xa3, 0x33, 0x20, 0xc0, 0x92, 0xa4, 0x0d, 0x9f, 0x98, 0x8c, 0x5a, - 0xfb, 0x6f, 0x05, 0x56, 0x39, 0x94, 0xbb, 0x7b, 0x34, 0x7c, 0x6c, 0x77, 0xde, 0x8c, 0x76, 0x27, - 0xf3, 0x58, 0xe7, 0xdd, 0xf9, 0xbf, 0xdd, 0x89, 0xf7, 0x42, 0x9d, 0x78, 0xc1, 0x47, 0x96, 0x12, - 0xcd, 0x99, 0xd3, 0x87, 0x7f, 0x87, 0x58, 0x8b, 0x61, 0x42, 0xf2, 0x4d, 0x58, 0xa9, 0x3b, 0x0f, - 0x43, 0x37, 0xb0, 0x9b, 0x33, 0x0a, 0x7d, 0xc9, 0x27, 0x64, 0x6b, 0x0a, 0x0f, 0x2f, 0xd7, 0x79, - 0x68, 0xc7, 0x5e, 0x93, 0x82, 0x22, 0xe9, 0x25, 0x2c, 0xcc, 0xf6, 0x24, 0x53, 0x9f, 0xbb, 0x28, - 0x21, 0x08, 0xc3, 0x77, 0xd3, 0x00, 0x81, 0x77, 0x07, 0x5d, 0x80, 0xa1, 0x87, 0x74, 0xa1, 0xbc, - 0xc6, 0x24, 0x79, 0x8e, 0x8b, 0xf7, 0xf5, 0x9b, 0x5c, 0xc9, 0x9a, 0x9a, 0x8d, 0xfc, 0x85, 0xea, - 0xd6, 0x02, 0x77, 0x27, 0xe8, 0x39, 0x83, 0x0e, 0xdb, 0xdb, 0xd3, 0xbb, 0xd7, 0x11, 0xe8, 0xd1, - 0x4f, 0x9d, 0x11, 0x93, 0x13, 0x9d, 0x0e, 0x8a, 0x94, 0x20, 0xe6, 0x31, 0x95, 0x79, 0x32, 0x8f, - 0xa9, 0x26, 0xac, 0xf4, 0xdd, 0xf7, 0x1c, 0xd7, 0x1b, 0x8e, 0x1f, 0xa1, 0x66, 0x39, 0x50, 0x59, - 0xd1, 0x2e, 0xa8, 0x88, 0x3c, 0x36, 0x0e, 0x78, 0x30, 0xfa, 0xf4, 0xf2, 0x30, 0xf8, 0x89, 0xbe, - 0xc7, 0xd7, 0xa2, 0xba, 0x74, 0x3f, 0x93, 0x5d, 0x52, 0x97, 0xef, 0x67, 0xb2, 0x59, 0x75, 0xe5, - 0x7e, 0x26, 0xbb, 0xa2, 0x82, 0x29, 0xbd, 0xd5, 0xf8, 0x6f, 0x31, 0xd2, 0xf3, 0x49, 0xf8, 0x69, - 0x44, 0xfb, 0x59, 0x0a, 0x48, 0xbc, 0x1a, 0xe4, 0x35, 0xc8, 0xb1, 0x0d, 0xd6, 0x1e, 0x4f, 0xbe, - 0xc5, 0x2d, 0x68, 0x19, 0x94, 0x85, 0x94, 0x2c, 0x43, 0x59, 0xb0, 0x64, 0x73, 0xf2, 0xad, 0x01, - 0xf9, 0x06, 0x9c, 0xc3, 0xee, 0x1d, 0x39, 0xe3, 0xfe, 0xb0, 0x67, 0x23, 0xee, 0x60, 0x67, 0xc0, - 0xe3, 0x67, 0xbd, 0x88, 0x81, 0x1e, 0xe3, 0xd9, 0x33, 0x86, 0x01, 0x9d, 0x38, 0x9a, 0x48, 0xd9, - 0x64, 0x84, 0xa4, 0x05, 0xaa, 0xcc, 0x7f, 0x34, 0x1d, 0x0c, 0xf8, 0xc8, 0xe6, 0xe9, 0xa5, 0x35, - 0x9a, 0x37, 0xa3, 0xe0, 0xf5, 0xa0, 0xe0, 0xd2, 0x74, 0x30, 0x20, 0xaf, 0x00, 0x0c, 0x5d, 0xfb, - 0xb4, 0x3f, 0x99, 0xb0, 0xf7, 0x0a, 0xdf, 0xdf, 0x2c, 0x48, 0x95, 0x07, 0x63, 0xe8, 0xd6, 0x58, - 0x22, 0xf9, 0x25, 0x40, 0x0f, 0x58, 0x74, 0x0d, 0x67, 0x16, 0x2a, 0x1c, 0x11, 0x5f, 0x24, 0x86, - 0xdd, 0xdb, 0x8e, 0x1d, 0xab, 0xff, 0xbe, 0x30, 0xf9, 0x7e, 0x0b, 0x36, 0xb9, 0x6d, 0xe8, 0x61, - 0xdf, 0x3b, 0xe1, 0xd2, 0xf2, 0xd3, 0x88, 0xda, 0x92, 0xb8, 0xfc, 0x4f, 0x19, 0x00, 0xfd, 0xd0, - 0x12, 0xa8, 0x2b, 0xb7, 0x61, 0x91, 0xde, 0x01, 0x84, 0x2e, 0x01, 0x35, 0xb1, 0x58, 0xae, 0xac, - 0x89, 0x45, 0x0a, 0xba, 0x1a, 0x4d, 0x34, 0xe0, 0x16, 0x7a, 0x04, 0x5c, 0x8d, 0xcc, 0xa6, 0x3b, - 0x84, 0x7a, 0xc9, 0xa9, 0x48, 0x15, 0x20, 0xc0, 0x41, 0xe1, 0xb7, 0xd2, 0xcd, 0x00, 0x50, 0x80, - 0x67, 0x70, 0xe4, 0xed, 0x00, 0x4b, 0x45, 0x9e, 0x3e, 0x01, 0x19, 0xd9, 0x87, 0x4c, 0xab, 0xe3, - 0x7b, 0x53, 0xcd, 0x40, 0x87, 0x79, 0x8e, 0xc7, 0x37, 0x0b, 0x10, 0x62, 0xd6, 0xbd, 0x4e, 0x28, - 0x0c, 0x24, 0x16, 0x42, 0x0c, 0x58, 0xe2, 0xb1, 0x6b, 0x67, 0xa0, 0x8a, 0xf1, 0xd0, 0xb5, 0x1c, - 0x4b, 0x14, 0x13, 0x65, 0x99, 0x82, 0x47, 0xa9, 0xbd, 0x0b, 0x69, 0xcb, 0xaa, 0x71, 0x9f, 0xe8, - 0xb5, 0xe0, 0x86, 0x61, 0x59, 0x35, 0x11, 0x98, 0xfd, 0x54, 0x62, 0xa3, 0xc4, 0xe4, 0x97, 0x21, - 0x27, 0x89, 0xcf, 0x1c, 0x4d, 0x00, 0xfb, 0x40, 0xb2, 0x9f, 0x97, 0x37, 0x0d, 0x89, 0x9a, 0x54, - 0x41, 0xdd, 0x9f, 0xbe, 0xe3, 0xe8, 0xa3, 0x11, 0x3a, 0xb2, 0xbc, 0xe7, 0x8c, 0x99, 0xd8, 0x96, - 0x0d, 0x60, 0x38, 0xd1, 0x0f, 0xa8, 0x27, 0x72, 0x65, 0x7d, 0x4a, 0x94, 0x93, 0x34, 0x61, 0xd3, - 0x72, 0xbc, 0xe9, 0x88, 0xd9, 0x5c, 0x94, 0x86, 0x63, 0x7a, 0xa1, 0x60, 0xd8, 0x03, 0x88, 0x58, - 0x38, 0xa1, 0x99, 0xc2, 0xd0, 0xe5, 0x68, 0x38, 0x8e, 0x5c, 0x2e, 0xe2, 0xcc, 0x9a, 0x23, 0x0f, - 0x39, 0x3d, 0x55, 0xc3, 0xd7, 0x14, 0x3c, 0x55, 0xc5, 0x35, 0x25, 0xb8, 0x9c, 0x7c, 0x21, 0x01, - 0x1f, 0x07, 0x1f, 0xbf, 0x24, 0x7c, 0x9c, 0x10, 0x2a, 0xce, 0x07, 0x19, 0x09, 0xa2, 0x8d, 0x8f, - 0xc5, 0xeb, 0x00, 0xf7, 0x87, 0x7d, 0xb7, 0xe6, 0x78, 0x27, 0xc3, 0x9e, 0x04, 0xd3, 0x93, 0xfb, - 0xb5, 0x61, 0xdf, 0xb5, 0x4f, 0x31, 0xf9, 0x67, 0x1f, 0x5d, 0x95, 0x88, 0x4c, 0xe9, 0x7f, 0xf2, - 0x79, 0x58, 0xa1, 0xbf, 0x5a, 0x81, 0xe5, 0x08, 0x53, 0x3b, 0x22, 0x37, 0x03, 0x32, 0x0f, 0x08, - 0xc8, 0x3d, 0x84, 0xee, 0xef, 0x8f, 0x3c, 0x49, 0x78, 0x15, 0x38, 0xfd, 0xfd, 0x91, 0x17, 0x45, - 0xdd, 0x94, 0x88, 0x49, 0xd9, 0xaf, 0xba, 0x88, 0xb6, 0xc1, 0x23, 0x04, 0xa0, 0x6e, 0x8d, 0xcf, - 0x35, 0x5b, 0xc0, 0xfd, 0xc9, 0x71, 0x11, 0x23, 0x6c, 0x58, 0x09, 0xab, 0x5c, 0x64, 0x8f, 0x21, - 0x5c, 0xa8, 0x15, 0x81, 0xe5, 0x7b, 0x76, 0x17, 0x93, 0x43, 0x95, 0xf0, 0x89, 0xc9, 0x2e, 0x6c, - 0x30, 0x19, 0xdf, 0x8f, 0xda, 0xc5, 0x45, 0x5c, 0xdc, 0xdb, 0x82, 0xb0, 0x5e, 0xf2, 0xe7, 0x23, - 0x0c, 0xa4, 0x04, 0x8b, 0x78, 0x21, 0xe4, 0x96, 0xdf, 0x3b, 0xf2, 0x4d, 0x38, 0xba, 0x8e, 0x70, - 0x5f, 0xc1, 0x3b, 0xb0, 0xbc, 0xaf, 0x20, 0x29, 0xf9, 0x1a, 0x80, 0xe1, 0x8e, 0x87, 0x83, 0x01, - 0x02, 0x52, 0x66, 0xf1, 0x2a, 0x75, 0x39, 0xbc, 0x1e, 0xb1, 0x94, 0x80, 0x88, 0x83, 0x27, 0xe1, - 0x6f, 0x3b, 0x02, 0x5b, 0x29, 0x95, 0xa5, 0x55, 0x60, 0x89, 0x2d, 0x46, 0x04, 0x77, 0xe5, 0x70, - 0xf5, 0x12, 0x34, 0x28, 0x03, 0x77, 0xe5, 0xe9, 0x71, 0x70, 0x57, 0x89, 0x41, 0xdb, 0x87, 0xad, - 0xa4, 0x86, 0x85, 0xae, 0xb0, 0xca, 0x59, 0xaf, 0xb0, 0x7f, 0x91, 0x86, 0x55, 0x2c, 0x4d, 0xec, - 0xc2, 0x3a, 0xac, 0x59, 0xd3, 0x77, 0x7c, 0xe4, 0x13, 0xb1, 0x1b, 0x63, 0xfd, 0x26, 0x72, 0x86, - 0xfc, 0x4c, 0x15, 0xe2, 0x20, 0x06, 0xac, 0x8b, 0x93, 0x60, 0x4f, 0x58, 0x93, 0xfb, 0xb8, 0xaa, - 0x02, 0xbd, 0x2b, 0x1e, 0xb5, 0x30, 0xc2, 0x14, 0x9c, 0x07, 0xe9, 0x27, 0x39, 0x0f, 0x32, 0x67, - 0x3a, 0x0f, 0xde, 0x86, 0x55, 0xf1, 0x35, 0xdc, 0xc9, 0x17, 0x9f, 0x6e, 0x27, 0x0f, 0x15, 0x46, - 0xaa, 0xfe, 0x8e, 0xbe, 0x34, 0x77, 0x47, 0xc7, 0xb7, 0x3f, 0xb1, 0xca, 0x62, 0x81, 0xc8, 0x79, - 0x19, 0x18, 0xd6, 0x6b, 0xaf, 0xd0, 0xfc, 0x04, 0xa7, 0xe4, 0x97, 0x60, 0xa5, 0x3a, 0x14, 0xcf, - 0x3e, 0x92, 0xbe, 0x7d, 0x20, 0x12, 0x65, 0x71, 0xc1, 0xa7, 0xf4, 0x4f, 0xb7, 0xf4, 0xa7, 0x71, - 0xba, 0xdd, 0x03, 0xe0, 0x6e, 0x0a, 0x41, 0x38, 0x1e, 0x5c, 0x32, 0xc2, 0xc7, 0x3c, 0xac, 0xf6, - 0x97, 0x88, 0xe9, 0xee, 0xc4, 0x2d, 0x4a, 0xf4, 0x6e, 0x77, 0x38, 0x75, 0xbd, 0x50, 0xfc, 0x4a, - 0x8e, 0x71, 0x41, 0x8f, 0x04, 0xcc, 0x93, 0xb7, 0x87, 0x08, 0xdb, 0xa7, 0x3b, 0x20, 0xe4, 0x4d, - 0xdf, 0x20, 0x6e, 0x6e, 0x38, 0x7f, 0x2d, 0xd6, 0x43, 0x33, 0xcd, 0xe0, 0xb4, 0x1f, 0x29, 0x32, - 0xa8, 0xf5, 0x27, 0x18, 0xea, 0x57, 0x01, 0xfc, 0x77, 0x77, 0x31, 0xd6, 0xec, 0xbe, 0xe4, 0xa7, - 0xca, 0xbd, 0x1c, 0xd0, 0x4a, 0xad, 0x49, 0x7f, 0x5a, 0xad, 0x69, 0x41, 0xae, 0xf1, 0xae, 0xd7, - 0x09, 0x0c, 0x35, 0xc0, 0xf2, 0x25, 0x59, 0xdc, 0x99, 0xd2, 0xbb, 0x37, 0xf0, 0x6c, 0x08, 0xe4, - 0xe0, 0x19, 0x22, 0xb0, 0xc4, 0xa8, 0xbd, 0x09, 0x1b, 0xb2, 0x1f, 0xe7, 0x23, 0xb7, 0x4b, 0xbe, - 0xc2, 0x20, 0xf6, 0x94, 0xd0, 0x8d, 0x45, 0x22, 0xa2, 0x3b, 0xee, 0x23, 0xb7, 0xcb, 0xe4, 0x9f, - 0xce, 0x43, 0xb9, 0xae, 0x78, 0xc7, 0xfb, 0x89, 0x02, 0x24, 0x4e, 0x2e, 0xef, 0x26, 0xca, 0xff, - 0x81, 0x74, 0x19, 0x91, 0xca, 0x32, 0x4f, 0x22, 0x95, 0xe5, 0xff, 0x50, 0x81, 0x8d, 0x8a, 0x5e, - 0xe3, 0x08, 0xd4, 0xec, 0xfd, 0xe0, 0x1a, 0x5c, 0xae, 0xe8, 0x35, 0xbb, 0xd9, 0xa8, 0x56, 0x0a, - 0x0f, 0xec, 0x44, 0x60, 0xc9, 0xcb, 0xf0, 0x6c, 0x9c, 0x24, 0x78, 0x67, 0xb8, 0x04, 0xdb, 0xf1, - 0x6c, 0x01, 0x3e, 0x99, 0xcc, 0x2c, 0x70, 0x2a, 0xd3, 0xf9, 0x37, 0x60, 0x43, 0x00, 0x2d, 0xb6, - 0xaa, 0x16, 0x42, 0x39, 0x6f, 0x40, 0xee, 0xc0, 0x30, 0x2b, 0xa5, 0x07, 0x76, 0xa9, 0x5d, 0xad, - 0xaa, 0x0b, 0x64, 0x0d, 0x56, 0x78, 0x42, 0x41, 0x57, 0x15, 0xb2, 0x0a, 0xd9, 0x4a, 0xdd, 0x32, - 0x0a, 0x6d, 0xd3, 0x50, 0x53, 0xf9, 0x37, 0x60, 0xbd, 0x39, 0xee, 0xbf, 0xd7, 0xf1, 0x9c, 0x7d, - 0xe7, 0x11, 0x3e, 0x13, 0x2c, 0x43, 0xda, 0xd4, 0x0f, 0xd5, 0x05, 0x02, 0xb0, 0xd4, 0xdc, 0x2f, - 0x58, 0x77, 0xee, 0xa8, 0x0a, 0xc9, 0xc1, 0xf2, 0x5e, 0xa1, 0x69, 0xef, 0xd7, 0x2c, 0x35, 0x45, - 0x7f, 0xe8, 0x87, 0x16, 0xfe, 0x48, 0xe7, 0xbf, 0x08, 0x9b, 0x28, 0x2b, 0x54, 0xfb, 0x13, 0xcf, - 0x71, 0x9d, 0x31, 0xd6, 0x61, 0x15, 0xb2, 0x96, 0x43, 0x17, 0xb9, 0xe7, 0xb0, 0x0a, 0xd4, 0xa6, - 0x03, 0xaf, 0x3f, 0x1a, 0x38, 0xdf, 0x56, 0x95, 0xfc, 0x3d, 0xd8, 0x30, 0x87, 0x53, 0xaf, 0xef, - 0x1e, 0x5b, 0x1e, 0xa5, 0x38, 0x7e, 0x44, 0x9e, 0x81, 0xcd, 0x76, 0x5d, 0xaf, 0xed, 0x56, 0xf6, - 0xda, 0x8d, 0xb6, 0x65, 0xd7, 0xf4, 0x56, 0xa1, 0xcc, 0x1e, 0x29, 0x6a, 0x0d, 0xab, 0x65, 0x9b, - 0x46, 0xc1, 0xa8, 0xb7, 0x54, 0x25, 0xff, 0x7d, 0x54, 0x7b, 0x74, 0x87, 0x6e, 0xaf, 0xd4, 0xc1, - 0xd0, 0xde, 0xb4, 0xc2, 0x1a, 0x5c, 0xb1, 0x8c, 0x42, 0xa3, 0x5e, 0xb4, 0x4b, 0x7a, 0xa1, 0xd5, - 0x30, 0x93, 0x90, 0x4d, 0x2f, 0xc2, 0xf9, 0x04, 0x9a, 0x46, 0xab, 0xa9, 0x2a, 0xe4, 0x2a, 0xec, - 0x24, 0xe4, 0x1d, 0x1a, 0xbb, 0x7a, 0xbb, 0x55, 0xae, 0xab, 0xa9, 0x19, 0xcc, 0x96, 0xd5, 0x50, - 0xd3, 0xf9, 0xdf, 0x53, 0x60, 0xbd, 0x3d, 0xe1, 0x16, 0xc2, 0x6d, 0xf4, 0xf3, 0x7b, 0x0e, 0x2e, - 0xb5, 0x2d, 0xc3, 0xb4, 0x5b, 0x8d, 0x7d, 0xa3, 0x6e, 0xb7, 0x2d, 0x7d, 0x2f, 0x5a, 0x9b, 0xab, - 0xb0, 0x23, 0x51, 0x98, 0x46, 0xa1, 0x71, 0x60, 0x98, 0x76, 0x53, 0xb7, 0xac, 0xc3, 0x86, 0x59, - 0x54, 0x15, 0xfa, 0xc5, 0x04, 0x82, 0x5a, 0x49, 0x67, 0xb5, 0x09, 0xe5, 0xd5, 0x8d, 0x43, 0xbd, - 0x6a, 0xef, 0x36, 0x5a, 0x6a, 0x3a, 0x5f, 0xa3, 0x47, 0x2f, 0xe2, 0x0b, 0x32, 0xbb, 0xb6, 0x2c, - 0x64, 0xea, 0x8d, 0xba, 0x11, 0x7d, 0xda, 0x5a, 0x85, 0xac, 0xde, 0x6c, 0x9a, 0x8d, 0x03, 0x9c, - 0x62, 0x00, 0x4b, 0x45, 0xa3, 0x4e, 0x6b, 0x96, 0xa6, 0x39, 0x4d, 0xb3, 0x51, 0x6b, 0xb4, 0x8c, - 0xa2, 0x9a, 0xc9, 0x9b, 0x62, 0x09, 0x8b, 0x42, 0xbb, 0x43, 0xf6, 0x8e, 0x54, 0x34, 0x4a, 0x7a, - 0xbb, 0xda, 0xe2, 0x43, 0xf4, 0xc0, 0x36, 0x8d, 0x37, 0xdb, 0x86, 0xd5, 0xb2, 0x54, 0x85, 0xa8, - 0xb0, 0x5a, 0x37, 0x8c, 0xa2, 0x65, 0x9b, 0xc6, 0x41, 0xc5, 0x38, 0x54, 0x53, 0xb4, 0x4c, 0xf6, - 0x3f, 0xfd, 0x42, 0xfe, 0x03, 0x05, 0x08, 0xc3, 0x66, 0x14, 0x80, 0xff, 0x38, 0x63, 0xae, 0xc0, - 0xc5, 0x32, 0x1d, 0x6a, 0x6c, 0x5a, 0xad, 0x51, 0x8c, 0x76, 0xd9, 0x79, 0x20, 0x91, 0xfc, 0x46, - 0xa9, 0xa4, 0x2a, 0x64, 0x07, 0xce, 0x45, 0xd2, 0x8b, 0x66, 0xa3, 0xa9, 0xa6, 0x2e, 0xa6, 0xb2, - 0x0a, 0xb9, 0x10, 0xcb, 0xdc, 0x37, 0x8c, 0xa6, 0x9a, 0xa6, 0x43, 0x14, 0xc9, 0x10, 0x4b, 0x82, - 0xb1, 0x67, 0xf2, 0xdf, 0x51, 0xe0, 0x3c, 0xab, 0xa6, 0x58, 0x5f, 0x7e, 0x55, 0x2f, 0xc1, 0x36, - 0x47, 0x9c, 0x4d, 0xaa, 0xe8, 0x16, 0xa8, 0xa1, 0x5c, 0x56, 0xcd, 0x67, 0x60, 0x33, 0x94, 0x8a, - 0xf5, 0x48, 0xd1, 0xdd, 0x23, 0x94, 0xbc, 0x6b, 0x58, 0x2d, 0xdb, 0x28, 0x95, 0x1a, 0x66, 0x8b, - 0x55, 0x24, 0x9d, 0xd7, 0x60, 0xb3, 0xe0, 0x8c, 0x3d, 0x7a, 0x2b, 0x72, 0x27, 0xfd, 0xa1, 0x8b, - 0x55, 0x58, 0x83, 0x15, 0xe3, 0x6b, 0x2d, 0xa3, 0x6e, 0x55, 0x1a, 0x75, 0x75, 0x21, 0x7f, 0x29, - 0x42, 0x23, 0xd6, 0xb1, 0x65, 0x95, 0xd5, 0x85, 0x7c, 0x07, 0xd6, 0x84, 0x2d, 0x2e, 0x9b, 0x15, - 0x57, 0xe0, 0xa2, 0x98, 0x6b, 0xb8, 0xa3, 0x44, 0x9b, 0xb0, 0x0d, 0x5b, 0xf1, 0x7c, 0xa3, 0xa5, - 0x2a, 0x74, 0x14, 0x22, 0x39, 0x34, 0x3d, 0x95, 0xff, 0x1d, 0x05, 0xd6, 0xfc, 0xf7, 0x0c, 0xd4, - 0xa0, 0x5e, 0x85, 0x9d, 0x5a, 0x49, 0xb7, 0x8b, 0xc6, 0x41, 0xa5, 0x60, 0xd8, 0xfb, 0x95, 0x7a, - 0x31, 0xf2, 0x91, 0x67, 0xe1, 0x99, 0x04, 0x02, 0xfc, 0xca, 0x36, 0x6c, 0x45, 0xb3, 0x5a, 0x74, - 0xa9, 0xa6, 0x68, 0xd7, 0x47, 0x73, 0xfc, 0x75, 0x9a, 0xce, 0xff, 0xb9, 0x02, 0xdb, 0x3c, 0xa2, - 0x32, 0x7f, 0x59, 0x61, 0x50, 0xfb, 0x88, 0x45, 0x99, 0x87, 0x9b, 0x2d, 0xb3, 0x6d, 0xb5, 0x8c, - 0xa2, 0x60, 0xa7, 0x93, 0xb6, 0x62, 0x1a, 0x35, 0xa3, 0xde, 0x8a, 0xd4, 0xed, 0x05, 0xf8, 0xdc, - 0x1c, 0xda, 0x7a, 0xa3, 0x25, 0x7e, 0xd3, 0xb5, 0xfa, 0x39, 0x78, 0x7e, 0x0e, 0xb1, 0x4f, 0x98, - 0xca, 0x1f, 0xc0, 0xba, 0xa5, 0xd7, 0xaa, 0xa5, 0xe1, 0xb8, 0xeb, 0xe8, 0x53, 0xef, 0xc4, 0x25, - 0x3b, 0x70, 0xa1, 0xd4, 0x30, 0x0b, 0x86, 0x8d, 0x2d, 0x88, 0x54, 0xe2, 0x1c, 0x6c, 0xc8, 0x99, - 0x0f, 0x0c, 0xba, 0xba, 0x08, 0xac, 0xcb, 0x89, 0xf5, 0x86, 0x9a, 0xca, 0x7f, 0x1d, 0x56, 0x43, - 0x61, 0x89, 0x2e, 0xc0, 0x39, 0xf9, 0x77, 0xd3, 0x71, 0x7b, 0x7d, 0xf7, 0x58, 0x5d, 0x88, 0x66, - 0x98, 0x53, 0xd7, 0xa5, 0x19, 0xb8, 0xdd, 0xc8, 0x19, 0x2d, 0x67, 0x7c, 0xda, 0x77, 0x3b, 0x9e, - 0xd3, 0x53, 0x53, 0xf9, 0x97, 0x60, 0x2d, 0x04, 0x86, 0x4a, 0xe7, 0x55, 0xb5, 0xc1, 0xcf, 0x87, - 0x9a, 0x51, 0xac, 0xb4, 0x6b, 0xea, 0x22, 0xdd, 0x68, 0xca, 0x95, 0xbd, 0xb2, 0x0a, 0xf9, 0x1f, - 0x28, 0xf4, 0x86, 0x82, 0xfd, 0x5e, 0x2b, 0xe9, 0x62, 0x26, 0xd2, 0x55, 0xc0, 0x20, 0x96, 0x0d, - 0xcb, 0x62, 0x0f, 0xce, 0x97, 0x60, 0x9b, 0xff, 0xb0, 0xf5, 0x7a, 0xd1, 0x2e, 0xeb, 0x66, 0xf1, - 0x50, 0x37, 0xe9, 0xd2, 0x78, 0xa0, 0xa6, 0x70, 0xbd, 0x4b, 0x29, 0x76, 0xab, 0xd1, 0x2e, 0x94, - 0xd5, 0x34, 0x5d, 0x5e, 0xa1, 0xf4, 0x66, 0xa5, 0xae, 0x66, 0x70, 0xf7, 0x88, 0x51, 0x63, 0xb1, - 0x34, 0x7f, 0x31, 0xff, 0xb1, 0x02, 0x17, 0xac, 0xfe, 0xb1, 0xdb, 0xf1, 0xa6, 0x63, 0x47, 0x1f, - 0x1c, 0x0f, 0xc7, 0x7d, 0xef, 0xe4, 0xd4, 0x9a, 0xf6, 0x3d, 0x87, 0xdc, 0x86, 0x1b, 0x56, 0x65, - 0xaf, 0xae, 0xb7, 0xe8, 0xea, 0xd7, 0xab, 0x7b, 0x0d, 0xb3, 0xd2, 0x2a, 0xd7, 0x6c, 0xab, 0x5d, - 0x89, 0x2d, 0x8c, 0xeb, 0xf0, 0xdc, 0x6c, 0xd2, 0xaa, 0xb1, 0xa7, 0x17, 0x1e, 0xa8, 0xca, 0xfc, - 0x02, 0x77, 0xf5, 0xaa, 0x5e, 0x2f, 0x18, 0x45, 0xfb, 0xe0, 0x8e, 0x9a, 0x22, 0x37, 0xe0, 0xda, - 0x6c, 0xd2, 0x52, 0xa5, 0x69, 0x51, 0xb2, 0xf4, 0xfc, 0xef, 0x96, 0xad, 0x1a, 0xa5, 0xca, 0xe4, - 0xfb, 0xa0, 0x46, 0xdd, 0xd3, 0x63, 0xe6, 0x0d, 0x66, 0xbb, 0x5e, 0x67, 0x67, 0xc0, 0x06, 0xe4, - 0x1a, 0xad, 0xb2, 0x61, 0x72, 0xa4, 0x6f, 0x84, 0xf6, 0x6e, 0xd7, 0xe9, 0xb4, 0x6a, 0x98, 0x95, - 0xb7, 0xf0, 0x30, 0xd8, 0x86, 0x2d, 0xab, 0xaa, 0x17, 0xf6, 0x71, 0xc6, 0x57, 0xea, 0x76, 0xa1, - 0xac, 0xd7, 0xeb, 0x46, 0x55, 0x85, 0xfc, 0x9f, 0x29, 0xcc, 0xce, 0x20, 0xc9, 0x8f, 0x8d, 0x7c, - 0x1e, 0x6e, 0x35, 0xf6, 0x5b, 0xba, 0xdd, 0xac, 0xb6, 0xf7, 0x2a, 0x75, 0xdb, 0x7a, 0x50, 0x2f, - 0x08, 0xc1, 0xa5, 0x10, 0xdf, 0x2f, 0x6f, 0xc1, 0xf5, 0xb9, 0xd4, 0x01, 0x26, 0xf7, 0x4d, 0xd0, - 0xe6, 0x52, 0xf2, 0x86, 0xe4, 0x7f, 0xac, 0xc0, 0xce, 0x9c, 0xb7, 0x59, 0xf2, 0x22, 0xdc, 0x2e, - 0x1b, 0x7a, 0xb1, 0x6a, 0x58, 0x16, 0x2e, 0x23, 0xa3, 0xde, 0xe2, 0x66, 0x10, 0x89, 0xbb, 0xe1, - 0x6d, 0xb8, 0x31, 0x9f, 0x3c, 0x38, 0x57, 0x6f, 0xc1, 0xf5, 0xf9, 0xa4, 0xfc, 0x9c, 0x4d, 0xd1, - 0xdd, 0x68, 0x3e, 0xa5, 0x7f, 0x3e, 0xa7, 0xf3, 0xdf, 0x53, 0xe0, 0x7c, 0xb2, 0x82, 0x84, 0xd6, - 0xad, 0x52, 0xb7, 0x5a, 0x7a, 0xb5, 0x6a, 0x37, 0x75, 0x53, 0xaf, 0xd9, 0x46, 0xdd, 0x6c, 0x54, - 0xab, 0x49, 0xe7, 0xd2, 0x75, 0x78, 0x6e, 0x36, 0xa9, 0x55, 0x30, 0x2b, 0x4d, 0xba, 0xf5, 0x6a, - 0x70, 0x65, 0x36, 0x95, 0x51, 0x29, 0x18, 0x6a, 0x6a, 0xf7, 0xf5, 0x0f, 0xff, 0xe5, 0xca, 0xc2, - 0x87, 0x1f, 0x5f, 0x51, 0x7e, 0xf2, 0xf1, 0x15, 0xe5, 0x9f, 0x3f, 0xbe, 0xa2, 0xbc, 0xf5, 0xc2, - 0xd9, 0xc2, 0x59, 0xa0, 0xd0, 0xfe, 0xce, 0x12, 0xda, 0xfd, 0xbc, 0xfc, 0x3f, 0x01, 0x00, 0x00, - 0xff, 0xff, 0x04, 0x36, 0x74, 0xce, 0xa5, 0xa8, 0x01, 0x00, + 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, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -23555,6 +23564,17 @@ func (this *PluginAWSICSettings) Equal(that interface{}) bool { if !this.ProvisioningSpec.Equal(that1.ProvisioningSpec) { return false } + if len(this.AccessListDefaultOwners) != len(that1.AccessListDefaultOwners) { + return false + } + for i := range this.AccessListDefaultOwners { + if this.AccessListDefaultOwners[i] != that1.AccessListDefaultOwners[i] { + return false + } + } + if this.SamlIdpServiceProviderName != that1.SamlIdpServiceProviderName { + return false + } if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { return false } @@ -43590,6 +43610,22 @@ func (m *PluginAWSICSettings) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.SamlIdpServiceProviderName) > 0 { + i -= len(m.SamlIdpServiceProviderName) + copy(dAtA[i:], m.SamlIdpServiceProviderName) + i = encodeVarintTypes(dAtA, i, uint64(len(m.SamlIdpServiceProviderName))) + i-- + dAtA[i] = 0x32 + } + if len(m.AccessListDefaultOwners) > 0 { + for iNdEx := len(m.AccessListDefaultOwners) - 1; iNdEx >= 0; iNdEx-- { + i -= len(m.AccessListDefaultOwners[iNdEx]) + copy(dAtA[i:], m.AccessListDefaultOwners[iNdEx]) + i = encodeVarintTypes(dAtA, i, uint64(len(m.AccessListDefaultOwners[iNdEx]))) + i-- + dAtA[i] = 0x2a + } + } if m.ProvisioningSpec != nil { { size, err := m.ProvisioningSpec.MarshalToSizedBuffer(dAtA[:i]) @@ -56479,6 +56515,16 @@ func (m *PluginAWSICSettings) Size() (n int) { l = m.ProvisioningSpec.Size() n += 1 + l + sovTypes(uint64(l)) } + if len(m.AccessListDefaultOwners) > 0 { + for _, s := range m.AccessListDefaultOwners { + l = len(s) + n += 1 + l + sovTypes(uint64(l)) + } + } + l = len(m.SamlIdpServiceProviderName) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -116906,6 +116952,70 @@ func (m *PluginAWSICSettings) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccessListDefaultOwners", 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.AccessListDefaultOwners = append(m.AccessListDefaultOwners, string(dAtA[iNdEx:postIndex])) + iNdEx = postIndex + case 6: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SamlIdpServiceProviderName", 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.SamlIdpServiceProviderName = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) From 985c8a991a994ca1c558acc938713aa87ae72283 Mon Sep 17 00:00:00 2001 From: Marco Dinis Date: Tue, 22 Oct 2024 13:53:58 +0100 Subject: [PATCH 11/70] Discover Wizard: drop v13 edge case for Kube Access (#47790) --- .../src/Discover/Kubernetes/HelmChart/HelmChart.tsx | 8 -------- 1 file changed, 8 deletions(-) diff --git a/web/packages/teleport/src/Discover/Kubernetes/HelmChart/HelmChart.tsx b/web/packages/teleport/src/Discover/Kubernetes/HelmChart/HelmChart.tsx index 53a94e1b17cb4..6d383690f48c1 100644 --- a/web/packages/teleport/src/Discover/Kubernetes/HelmChart/HelmChart.tsx +++ b/web/packages/teleport/src/Discover/Kubernetes/HelmChart/HelmChart.tsx @@ -365,14 +365,6 @@ export function generateCmd(data: GenerateCmdProps) { // AutomaticUpgradesTargetVersion contains a v, eg, v13.4.2. // However, helm chart expects no 'v', eg, 13.4.2. deployVersion = data.automaticUpgradesTargetVersion.replace(/^v/, ''); - - // TODO(marco): remove when stable/cloud moves to v14 - // For v13 releases of the helm chart, we must remove the App role. - // We get the following error otherwise: - // Error: INSTALLATION FAILED: execution error at (teleport-kube-agent/templates/statefulset.yaml:26:28): at least one of 'apps' and 'appResources' is required in chart values when app role is enabled, see README - if (deployVersion.startsWith('13.')) { - roles = ['Kube']; - } } const yamlRoles = roles.join(',').toLowerCase(); From 3c77158b2479582a1956c0324ef5b5d0c64b3657 Mon Sep 17 00:00:00 2001 From: Marco Dinis Date: Tue, 22 Oct 2024 13:57:22 +0100 Subject: [PATCH 12/70] Log Audit Error instead of operation error when auditing fails (#47783) --- lib/auth/crownjewel/crownjewelv1/service.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/lib/auth/crownjewel/crownjewelv1/service.go b/lib/auth/crownjewel/crownjewelv1/service.go index 7655098da228b..fa61478600800 100644 --- a/lib/auth/crownjewel/crownjewelv1/service.go +++ b/lib/auth/crownjewel/crownjewelv1/service.go @@ -143,7 +143,7 @@ func (s *Service) emitCreateAuditEvent(ctx context.Context, req *crownjewelv1.Cr }, CrownJewelQuery: req.GetSpec().GetQuery(), }); auditErr != nil { - slog.WarnContext(ctx, "Failed to emit crown jewel create event.", "error", err) + slog.WarnContext(ctx, "Failed to emit crown jewel create event.", "error", auditErr) } } @@ -237,7 +237,7 @@ func (s *Service) emitUpdateAuditEvent(ctx context.Context, old, new *crownjewel CurrentCrownJewelQuery: old.GetSpec().GetQuery(), UpdatedCrownJewelQuery: new.GetSpec().GetQuery(), }); auditErr != nil { - slog.WarnContext(ctx, "Failed to emit crown jewel update event.", "error", err) + slog.WarnContext(ctx, "Failed to emit crown jewel update event.", "error", auditErr) } } @@ -315,7 +315,7 @@ func (s *Service) DeleteCrownJewel(ctx context.Context, req *crownjewelv1.Delete UpdatedBy: authCtx.Identity.GetIdentity().Username, }, }); auditErr != nil { - slog.WarnContext(ctx, "Failed to emit crown jewel delete event.", "error", err) + slog.WarnContext(ctx, "Failed to emit crown jewel delete event.", "error", auditErr) } if err != nil { From b8f2853c37c3e23afb9c622236aab83afceedb64 Mon Sep 17 00:00:00 2001 From: rosstimothy <39066650+rosstimothy@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:20:16 +0000 Subject: [PATCH 13/70] Add metric to expose cluster role count (#47731) * Add metric to expose cluster role count A new `teleport_roles_total` is added to count the number of roles in the cluster. The metric is intentionally updated infrequently to avoid putting any additional strain on the backend. Additionally, the reads performed when calculating the metric are rate limited to prevent any bursts in reads when the metric timer does fire. The auth periodic tickers have also been consolidated into a single multi-interval instead of a ticker per operation. To prevent the sub-intervals from impacting each other all operations are moved to their own goroutine once their ticker fires. * Convert multi to use a clock * fix: specify a smallish page size --- integration/hsm/hsm_test.go | 5 +- lib/auth/auth.go | 323 ++++++++++++++++++++----------- lib/inventory/controller.go | 15 +- lib/utils/interval/multi.go | 32 +-- lib/utils/interval/multi_test.go | 15 +- 5 files changed, 253 insertions(+), 137 deletions(-) diff --git a/integration/hsm/hsm_test.go b/integration/hsm/hsm_test.go index 3a5ea29eed749..1d6d03f567389 100644 --- a/integration/hsm/hsm_test.go +++ b/integration/hsm/hsm_test.go @@ -590,7 +590,10 @@ func TestHSMRevert(t *testing.T) { clock.Advance(2 * defaults.HighResPollingPeriod) assert.EventuallyWithT(t, func(t *assert.CollectT) { alerts, err = auth1.process.GetAuthServer().GetClusterAlerts(ctx, types.GetClusterAlertsRequest{}) - require.NoError(t, err) + assert.NoError(t, err) assert.Empty(t, alerts) + + // Keep advancing the clock to make sure the rotation ticker gets fired + clock.Advance(2 * defaults.HighResPollingPeriod) }, 5*time.Second, 100*time.Millisecond) } diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 232c7587f9c6c..937c89e765a6d 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -746,6 +746,14 @@ var ( }, ) + roleCount = prometheus.NewGauge( + prometheus.GaugeOpts{ + Namespace: teleport.MetricNamespace, + Name: "roles_total", + Help: "Number of roles that exist in the cluster", + }, + ) + registeredAgents = prometheus.NewGaugeVec( prometheus.GaugeOpts{ Namespace: teleport.MetricNamespace, @@ -830,6 +838,7 @@ var ( accessRequestsCreatedMetric, registeredAgentsInstallMethod, userCertificatesGeneratedMetric, + roleCount, } ) @@ -1300,94 +1309,122 @@ func (a *Server) periodicSyncUpgradeWindowStartHour() { } } +// periodicIntervalKey is used to uniquely identify the subintervals registered with +// the interval.MultiInterval instance that we use for managing periodics operations. + +type periodicIntervalKey int + +const ( + heartbeatCheckKey periodicIntervalKey = 1 + iota + rotationCheckKey + metricsKey + releaseCheckKey + localReleaseCheckKey + instancePeriodicsKey + dynamicLabelsCheckKey + notificationsCleanupKey + desktopCheckKey + upgradeWindowCheckKey + roleCountKey +) + // runPeriodicOperations runs some periodic bookkeeping operations // performed by auth server func (a *Server) runPeriodicOperations() { - ctx := context.TODO() + firstReleaseCheck := utils.FullJitter(time.Hour * 6) + + // this environment variable is "unstable" since it will be deprecated + // by an upcoming tctl command. currently exists for testing purposes only. + if os.Getenv("TELEPORT_UNSTABLE_VC_SYNC_ON_START") == "yes" { + firstReleaseCheck = utils.HalfJitter(time.Second * 10) + } + // run periodic functions with a semi-random period // to avoid contention on the database in case if there are multiple // auth servers running - so they don't compete trying // to update the same resources. r := insecurerand.New(insecurerand.NewSource(a.GetClock().Now().UnixNano())) period := defaults.HighResPollingPeriod + time.Duration(r.Intn(int(defaults.HighResPollingPeriod/time.Second)))*time.Second - log.Debugf("Ticking with period: %v.", period) - a.lock.RLock() - ticker := a.clock.NewTicker(period) - a.lock.RUnlock() - // Create a ticker with jitter - heartbeatCheckTicker := interval.New(interval.Config{ - Duration: apidefaults.ServerKeepAliveTTL() * 2, - Jitter: retryutils.NewSeventhJitter(), - }) - promTicker := interval.New(interval.Config{ - FirstDuration: 5 * time.Second, - Duration: defaults.PrometheusScrapeInterval, - Jitter: retryutils.NewSeventhJitter(), - }) - missedKeepAliveCount := 0 - defer ticker.Stop() - defer heartbeatCheckTicker.Stop() - defer promTicker.Stop() - firstReleaseCheck := utils.FullJitter(time.Hour * 6) + ticker := interval.NewMulti( + a.GetClock(), + interval.SubInterval[periodicIntervalKey]{ + Key: rotationCheckKey, + Duration: period, + }, + interval.SubInterval[periodicIntervalKey]{ + Key: metricsKey, + Duration: defaults.PrometheusScrapeInterval, + FirstDuration: 5 * time.Second, + Jitter: retryutils.NewSeventhJitter(), + }, + interval.SubInterval[periodicIntervalKey]{ + Key: instancePeriodicsKey, + Duration: 9 * time.Minute, + FirstDuration: utils.HalfJitter(time.Minute), + Jitter: retryutils.NewSeventhJitter(), + }, + interval.SubInterval[periodicIntervalKey]{ + Key: notificationsCleanupKey, + Duration: 48 * time.Hour, + FirstDuration: utils.FullJitter(time.Hour), + Jitter: retryutils.NewSeventhJitter(), + }, + interval.SubInterval[periodicIntervalKey]{ + Key: roleCountKey, + Duration: 12 * time.Hour, + FirstDuration: utils.FullJitter(time.Minute), + Jitter: retryutils.NewSeventhJitter(), + }, + ) - // this environment variable is "unstable" since it will be deprecated - // by an upcoming tctl command. currently exists for testing purposes only. - if os.Getenv("TELEPORT_UNSTABLE_VC_SYNC_ON_START") == "yes" { - firstReleaseCheck = utils.HalfJitter(time.Second * 10) - } + defer ticker.Stop() - // note the use of FullJitter for the releases check interval. this lets us ensure - // that frequent restarts don't prevent checks from happening despite the infrequent - // effective check rate. - releaseCheck := interval.New(interval.Config{ - Duration: time.Hour * 24, - FirstDuration: firstReleaseCheck, - Jitter: retryutils.NewFullJitter(), - }) - defer releaseCheck.Stop() - - // more frequent release check that just re-calculates alerts based on previously - // pulled versioning info. - localReleaseCheck := interval.New(interval.Config{ - Duration: time.Minute * 10, - FirstDuration: utils.HalfJitter(time.Second * 10), - Jitter: retryutils.NewHalfJitter(), - }) - defer localReleaseCheck.Stop() + missedKeepAliveCount := 0 - instancePeriodics := interval.New(interval.Config{ - Duration: time.Minute * 9, - FirstDuration: utils.HalfJitter(time.Minute), - Jitter: retryutils.NewSeventhJitter(), - }) - defer instancePeriodics.Stop() + // Prevent some periodic operations from running for dashboard tenants. + if !services.IsDashboard(*modules.GetModules().Features().ToProto()) { + ticker.Push(interval.SubInterval[periodicIntervalKey]{ + Key: dynamicLabelsCheckKey, + Duration: dynamicLabelCheckPeriod, + FirstDuration: utils.HalfJitter(10 * time.Second), + Jitter: retryutils.NewSeventhJitter(), + }) + ticker.Push(interval.SubInterval[periodicIntervalKey]{ + Key: heartbeatCheckKey, + Duration: apidefaults.ServerKeepAliveTTL() * 2, + Jitter: retryutils.NewSeventhJitter(), + }) + ticker.Push(interval.SubInterval[periodicIntervalKey]{ + Key: releaseCheckKey, + Duration: 24 * time.Hour, + FirstDuration: firstReleaseCheck, + // note the use of FullJitter for the releases check interval. this lets us ensure + // that frequent restarts don't prevent checks from happening despite the infrequent + // effective check rate. + Jitter: retryutils.NewFullJitter(), + }) + // more frequent release check that just re-calculates alerts based on previously + // pulled versioning info. + ticker.Push(interval.SubInterval[periodicIntervalKey]{ + Key: localReleaseCheckKey, + Duration: 10 * time.Minute, + FirstDuration: utils.HalfJitter(10 * time.Second), + Jitter: retryutils.NewHalfJitter(), + }) + } - var ossDesktopsCheck <-chan time.Time if modules.GetModules().IsOSSBuild() { - ossDesktopsCheck = interval.New(interval.Config{ + ticker.Push(interval.SubInterval[periodicIntervalKey]{ + Key: desktopCheckKey, Duration: OSSDesktopsCheckPeriod, - FirstDuration: utils.HalfJitter(time.Second * 10), + FirstDuration: utils.HalfJitter(10 * time.Second), Jitter: retryutils.NewHalfJitter(), - }).Next() - } else if err := a.DeleteClusterAlert(ctx, OSSDesktopsAlertID); err != nil && !trace.IsNotFound(err) { + }) + } else if err := a.DeleteClusterAlert(a.closeCtx, OSSDesktopsAlertID); err != nil && !trace.IsNotFound(err) { log.Warnf("Can't delete OSS non-AD desktops limit alert: %v", err) } - dynamicLabelsCheck := interval.New(interval.Config{ - Duration: dynamicLabelCheckPeriod, - FirstDuration: utils.HalfJitter(time.Second * 10), - Jitter: retryutils.NewSeventhJitter(), - }) - defer dynamicLabelsCheck.Stop() - - notificationsCleanup := interval.New(interval.Config{ - Duration: 48 * time.Hour, - FirstDuration: utils.FullJitter(time.Hour), - Jitter: retryutils.NewSeventhJitter(), - }) - defer notificationsCleanup.Stop() - // isolate the schedule of potentially long-running refreshRemoteClusters() from other tasks go func() { // reasonably small interval to ensure that users observe clusters as online within 1 minute of adding them. @@ -1402,7 +1439,7 @@ func (a *Server) runPeriodicOperations() { case <-a.closeCtx.Done(): return case <-remoteClustersRefresh.Next(): - a.refreshRemoteClusters(ctx, r) + a.refreshRemoteClusters(a.closeCtx, r) } } }() @@ -1410,62 +1447,120 @@ func (a *Server) runPeriodicOperations() { // cloud auth servers need to periodically sync the upgrade window // from the cloud db. if modules.GetModules().Features().Cloud { - go a.periodicSyncUpgradeWindowStartHour() - } - - // disable periodics that are not required for cloud dashboard tenants - if services.IsDashboard(*modules.GetModules().Features().ToProto()) { - releaseCheck.Stop() - localReleaseCheck.Stop() - heartbeatCheckTicker.Stop() - dynamicLabelsCheck.Stop() + ticker.Push(interval.SubInterval[periodicIntervalKey]{ + Key: upgradeWindowCheckKey, + Duration: 3 * time.Minute, + FirstDuration: utils.FullJitter(30 * time.Second), + Jitter: retryutils.NewSeventhJitter(), + }) } for { select { case <-a.closeCtx.Done(): return - case <-ticker.Chan(): - err := a.AutoRotateCertAuthorities(ctx) - if err != nil { - if trace.IsCompareFailed(err) { - log.Debugf("Cert authority has been updated concurrently: %v.", err) - } else { - log.Errorf("Failed to perform cert rotation check: %v.", err) - } - } - case <-heartbeatCheckTicker.Next(): - nodes, err := a.GetNodes(ctx, apidefaults.Namespace) - if err != nil { - log.Errorf("Failed to load nodes for heartbeat metric calculation: %v", err) - } - for _, node := range nodes { - if services.NodeHasMissedKeepAlives(node) { - missedKeepAliveCount++ - } + case tick := <-ticker.Next(): + switch tick.Key { + case rotationCheckKey: + go func() { + if err := a.AutoRotateCertAuthorities(a.closeCtx); err != nil { + if trace.IsCompareFailed(err) { + log.Debugf("Cert authority has been updated concurrently: %v.", err) + } else { + log.Errorf("Failed to perform cert rotation check: %v.", err) + } + } + }() + case heartbeatCheckKey: + go func() { + req := &proto.ListUnifiedResourcesRequest{Kinds: []string{types.KindNode}, SortBy: types.SortBy{Field: types.ResourceKind}} + + for { + _, next, err := a.UnifiedResourceCache.IterateUnifiedResources(a.closeCtx, + func(rwl types.ResourceWithLabels) (bool, error) { + srv, ok := rwl.(types.Server) + if !ok { + return false, nil + } + if services.NodeHasMissedKeepAlives(srv) { + missedKeepAliveCount++ + } + return false, nil + }, + req, + ) + if err != nil { + log.Errorf("Failed to load nodes for heartbeat metric calculation: %v", err) + return + } + + req.StartKey = next + if req.StartKey == "" { + break + } + } + + // Update prometheus gauge + heartbeatsMissedByAuth.Set(float64(missedKeepAliveCount)) + }() + case metricsKey: + go a.updateAgentMetrics() + case releaseCheckKey: + go a.syncReleaseAlerts(a.closeCtx, true) + case localReleaseCheckKey: + go a.syncReleaseAlerts(a.closeCtx, false) + case instancePeriodicsKey: + go a.doInstancePeriodics(a.closeCtx) + case desktopCheckKey: + go a.syncDesktopsLimitAlert(a.closeCtx) + case dynamicLabelsCheckKey: + go a.syncDynamicLabelsAlert(a.closeCtx) + case notificationsCleanupKey: + go a.CleanupNotifications(a.closeCtx) + case upgradeWindowCheckKey: + go a.periodicSyncUpgradeWindowStartHour() + case roleCountKey: + go a.tallyRoles(a.closeCtx) } - // Update prometheus gauge - heartbeatsMissedByAuth.Set(float64(missedKeepAliveCount)) - case <-promTicker.Next(): - a.updateAgentMetrics() - case <-releaseCheck.Next(): - a.syncReleaseAlerts(ctx, true) - case <-localReleaseCheck.Next(): - a.syncReleaseAlerts(ctx, false) - case <-instancePeriodics.Next(): - // instance periodics are rate-limited and may be time-consuming in large - // clusters, so launch them in the background. - go a.doInstancePeriodics(ctx) - case <-ossDesktopsCheck: - a.syncDesktopsLimitAlert(ctx) - case <-dynamicLabelsCheck.Next(): - a.syncDynamicLabelsAlert(ctx) - case <-notificationsCleanup.Next(): - go a.CleanupNotifications(ctx) } } } +func (a *Server) tallyRoles(ctx context.Context) { + var count = 0 + a.logger.DebugContext(ctx, "tallying roles") + defer func() { + a.logger.DebugContext(ctx, "tallying roles completed", "role_count", count) + }() + + req := &proto.ListRolesRequest{Limit: 20} + + readLimiter := time.NewTicker(20 * time.Millisecond) + defer readLimiter.Stop() + + for { + resp, err := a.Cache.ListRoles(ctx, req) + if err != nil { + return + } + + count += len(resp.Roles) + req.StartKey = resp.NextKey + + if req.StartKey == "" { + break + } + + select { + case <-readLimiter.C: + case <-ctx.Done(): + return + } + } + + roleCount.Set(float64(count)) +} + func (a *Server) doInstancePeriodics(ctx context.Context) { const slowRate = time.Millisecond * 200 // 5 reads per second const fastRate = time.Millisecond * 5 // 200 reads per second diff --git a/lib/inventory/controller.go b/lib/inventory/controller.go index e0f17b889a60a..92220597b0e9a 100644 --- a/lib/inventory/controller.go +++ b/lib/inventory/controller.go @@ -25,6 +25,7 @@ import ( "time" "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" log "github.com/sirupsen/logrus" "github.com/gravitational/teleport/api/client" @@ -288,12 +289,14 @@ func (c *Controller) RegisterControlStream(stream client.UpstreamInventoryContro // as much as possible. this is intended to mitigate load spikes on auth restart, and is reasonably // safe to do since the instance resource is not directly relied upon for use of any particular teleport // service. - ticker := interval.NewMulti(interval.SubInterval[intervalKey]{ - Key: instanceHeartbeatKey, - VariableDuration: c.instanceHBVariableDuration, - FirstDuration: fullJitter(c.instanceHBVariableDuration.Duration()), - Jitter: seventhJitter, - }) + ticker := interval.NewMulti( + clockwork.NewRealClock(), + interval.SubInterval[intervalKey]{ + Key: instanceHeartbeatKey, + VariableDuration: c.instanceHBVariableDuration, + FirstDuration: fullJitter(c.instanceHBVariableDuration.Duration()), + Jitter: seventhJitter, + }) handle := newUpstreamHandle(stream, hello, ticker) c.store.Insert(handle) go c.handleControlStream(handle) diff --git a/lib/utils/interval/multi.go b/lib/utils/interval/multi.go index 9932203ea6076..f3c1fae80d79f 100644 --- a/lib/utils/interval/multi.go +++ b/lib/utils/interval/multi.go @@ -23,6 +23,8 @@ import ( "sync" "time" + "github.com/jonboulle/clockwork" + "github.com/gravitational/teleport/api/utils/retryutils" ) @@ -39,6 +41,7 @@ import ( // but it is still a potential source of bugs/confusion when transitioning to using this type from one // of the single-interval alternatives. type MultiInterval[T comparable] struct { + clock clockwork.Clock subs []subIntervalEntry[T] push chan subIntervalEntry[T] ch chan Tick[T] @@ -125,12 +128,17 @@ func (s *subIntervalEntry[T]) increment() { // NewMulti creates a new multi-interval instance. This function panics on non-positive // interval durations (equivalent to time.NewTicker) or if no sub-intervals are provided. -func NewMulti[T comparable](intervals ...SubInterval[T]) *MultiInterval[T] { +func NewMulti[T comparable](clock clockwork.Clock, intervals ...SubInterval[T]) *MultiInterval[T] { if len(intervals) == 0 { panic(errors.New("empty sub-interval set for interval.NewMulti")) } + if clock == nil { + clock = clockwork.NewRealClock() + } + interval := &MultiInterval[T]{ + clock: clock, subs: make([]subIntervalEntry[T], 0, len(intervals)), push: make(chan subIntervalEntry[T]), ch: make(chan Tick[T], 1), @@ -140,7 +148,7 @@ func NewMulti[T comparable](intervals ...SubInterval[T]) *MultiInterval[T] { } // check and initialize our sub-intervals. - now := time.Now() + now := clock.Now() for _, sub := range intervals { if sub.Duration <= 0 && (sub.VariableDuration == nil || sub.VariableDuration.Duration() <= 0) { panic(errors.New("non-positive sub interval for interval.NewMulti")) @@ -156,7 +164,7 @@ func NewMulti[T comparable](intervals ...SubInterval[T]) *MultiInterval[T] { // start the timer in this goroutine to improve // consistency of first tick. - timer := time.NewTimer(d) + timer := clock.NewTimer(d) go interval.run(timer, key) @@ -173,7 +181,7 @@ func (i *MultiInterval[T]) Push(sub SubInterval[T]) { SubInterval: sub, } // we initialize here in order to improve consistency of start time - entry.init(time.Now()) + entry.init(i.clock.Now()) select { case i.push <- entry: case <-i.done: @@ -257,7 +265,7 @@ func (i *MultiInterval[T]) pushEntry(entry subIntervalEntry[T]) { i.subs = append(i.subs, entry) } -func (i *MultiInterval[T]) run(timer *time.Timer, key T) { +func (i *MultiInterval[T]) run(timer clockwork.Timer, key T) { defer timer.Stop() var pending pendingTicks[T] @@ -276,7 +284,7 @@ func (i *MultiInterval[T]) run(timer *time.Timer, key T) { } select { - case t := <-timer.C: + case t := <-timer.Chan(): // increment the sub-interval for the current key i.increment(key) @@ -292,7 +300,7 @@ func (i *MultiInterval[T]) run(timer *time.Timer, key T) { timer.Reset(d) case resetKey := <-i.reset: - now := time.Now() + now := i.clock.Now() // reset the sub-interval for the target key i.resetEntry(now, resetKey) @@ -307,14 +315,14 @@ func (i *MultiInterval[T]) run(timer *time.Timer, key T) { // stop and drain timer if !timer.Stop() { - <-timer.C + <-timer.Chan() } // apply the new duration timer.Reset(d) case fireKey := <-i.fire: - now := time.Now() + now := i.clock.Now() // reset the sub-interval for the key we are firing i.resetEntry(now, fireKey) @@ -329,13 +337,13 @@ func (i *MultiInterval[T]) run(timer *time.Timer, key T) { // stop and drain timer. if !timer.Stop() { - <-timer.C + <-timer.Chan() } // re-set the timer timer.Reset(d) case entry := <-i.push: - now := time.Now() + now := i.clock.Now() // add the new sub-interval entry i.pushEntry(entry) @@ -351,7 +359,7 @@ func (i *MultiInterval[T]) run(timer *time.Timer, key T) { // stop and drain timer if !timer.Stop() { - <-timer.C + <-timer.Chan() } // apply the new duration diff --git a/lib/utils/interval/multi_test.go b/lib/utils/interval/multi_test.go index 37cf3a10b1614..3ef8b1f17ad56 100644 --- a/lib/utils/interval/multi_test.go +++ b/lib/utils/interval/multi_test.go @@ -24,6 +24,7 @@ import ( "testing" "time" + "github.com/jonboulle/clockwork" "github.com/stretchr/testify/require" ) @@ -47,10 +48,12 @@ func TestMultiIntervalReset(t *testing.T) { resetTimer := time.NewTimer(duration / 3) defer resetTimer.Stop() - interval := NewMulti[string](SubInterval[string]{ - Key: "key", - Duration: duration, - }) + interval := NewMulti[string]( + clockwork.NewRealClock(), + SubInterval[string]{ + Key: "key", + Duration: duration, + }) defer interval.Stop() start := time.Now() @@ -92,6 +95,7 @@ func TestMultiIntervalReset(t *testing.T) { func TestMultiIntervalBasics(t *testing.T) { t.Parallel() interval := NewMulti[string]( + clockwork.NewRealClock(), SubInterval[string]{ Key: "fast", Duration: time.Millisecond * 8, @@ -151,6 +155,7 @@ func TestMultiIntervalVariableDuration(t *testing.T) { bar.counter.Store(1) interval := NewMulti[string]( + clockwork.NewRealClock(), SubInterval[string]{ Key: "foo", VariableDuration: foo, @@ -216,6 +221,7 @@ func TestMultiIntervalVariableDuration(t *testing.T) { func TestMultiIntervalPush(t *testing.T) { t.Parallel() interval := NewMulti[string]( + clockwork.NewRealClock(), SubInterval[string]{ Key: "foo", Duration: time.Millisecond * 6, @@ -289,6 +295,7 @@ func TestMultiIntervalFireNow(t *testing.T) { // set up one sub-interval that fires frequently, and another that will never // fire during this test unless we trigger with FireNow. interval := NewMulti[string]( + clockwork.NewRealClock(), SubInterval[string]{ Key: "slow", Duration: time.Hour, From 04375963f3c8cde81dd2c23d873bb6b004aa180c Mon Sep 17 00:00:00 2001 From: rosstimothy <39066650+rosstimothy@users.noreply.github.com> Date: Tue, 22 Oct 2024 13:57:08 +0000 Subject: [PATCH 14/70] Update metrics docs to include teleport_roles_total (#47767) Add the new metric introduced in https://github.com/gravitational/teleport/pull/47731 to the reference page. Also performed some minor formatting on the table, and alphabetized some out of order metrics. --- docs/pages/includes/metrics.mdx | 13 +++++++------ 1 file changed, 7 insertions(+), 6 deletions(-) diff --git a/docs/pages/includes/metrics.mdx b/docs/pages/includes/metrics.mdx index d1a64ba4bf241..e875f84e75968 100644 --- a/docs/pages/includes/metrics.mdx +++ b/docs/pages/includes/metrics.mdx @@ -15,8 +15,8 @@ | `backend_batch_write_seconds` | histogram | cache | Latency for backend batch write operations. | | `backend_read_requests_total` | counter | cache | Number of read requests to the backend. | | `backend_read_seconds` | histogram | cache | Latency for read operations. | -| `backend_requests` | counter | cache | Number of requests to the backend (reads, writes, and keepalives). | -| `backend_write_requests_total` | counter | cache | Number of write requests to the backend. | +| `backend_requests` | counter | cache | Number of requests to the backend (reads, writes, and keepalives). | +| `backend_write_requests_total` | counter | cache | Number of write requests to the backend. | | `backend_write_seconds` | histogram | cache | Latency for backend write operations. | | `cluster_name_not_found_total` | counter | Teleport Auth | Number of times a cluster was not found. | | `dynamo_requests_total` | counter | DynamoDB | Total number of requests to the DynamoDB API. | @@ -31,7 +31,7 @@ | `etcd_backend_write_requests` | counter | etcd | Number of write requests to the database. | | `etcd_backend_write_seconds` | histogram | etcd | Latency for etcd write operations. | | `teleport_etcd_events` | counter | etcd | Total number of etcd events processed. | -| `teleport_etcd_event_backpressure` | counter | etcd | Total number of times event processing encountered backpressure. | +| `teleport_etcd_event_backpressure` | counter | etcd | Total number of times event processing encountered backpressure. | | `firestore_events_backend_batch_read_requests` | counter | GCP Cloud Firestore | Number of batch read requests to Cloud Firestore events. | | `firestore_events_backend_batch_read_seconds` | histogram | GCP Cloud Firestore | Latency for Cloud Firestore events batch read operations. | | `firestore_events_backend_batch_write_requests` | counter | GCP Cloud Firestore | Number of batch write requests to Cloud Firestore events. | @@ -59,17 +59,18 @@ | `teleport_audit_parquetlog_last_processed_timestamp` | gauge | Teleport Audit Log | Number of last processing time in Parquet-format audit log. | | `teleport_audit_parquetlog_age_oldest_processed_message` | gauge | Teleport Audit Log | Number of age of oldest event in Parquet-format audit log. | | `teleport_audit_parquetlog_errors_from_collect_count` | counter | Teleport Audit Log | Number of collect failures in Parquet-format audit log. | +| `teleport_connected_resources` | gauge | Teleport Auth | Number and type of resources connected via keepalives. x | | `teleport_postgres_events_backend_write_requests` | counter | Postgres (Events) | Number of write requests to postgres events, labeled with the request `status` (success or failure). | | `teleport_postgres_events_backend_batch_read_requests` | counter | Postgres (Events) | Number of batch read requests to postgres events, labeled with the request `status` (success or failure). | | `teleport_postgres_events_backend_batch_delete_requests` | counter | Postgres (Events) | Number of batch delete requests to postgres events, labeled with the request `status` (success or failure). | | `teleport_postgres_events_backend_write_seconds` | histogram | Postgres (Events) | Latency for postgres events write operations, in seconds. | | `teleport_postgres_events_backend_batch_read_seconds` | histogram | Postgres (Events) | Latency for postgres events batch read operations, in seconds. | | `teleport_postgres_events_backend_batch_delete_seconds` | histogram | Postgres (Events) | Latency for postgres events batch delete operations, in seconds. | -| `teleport_connected_resources` | gauge | Teleport Auth | Number and type of resources connected via keepalives. | | `teleport_registered_servers` | gauge | Teleport Auth | The number of Teleport services that are connected to an Auth Service instance grouped by version. | | `teleport_registered_servers_by_install_methods` | gauge | Teleport Auth | The number of Teleport services that are connected to an Auth Service instance grouped by install methods. | -| `user_login_total` | counter | Teleport Auth | Number of user logins. | +| `teleport_roles_total` | gauge | Teleport Auth | The number of roles that exist in the cluster. | | `teleport_migrations` | gauge | Teleport Auth | Tracks for each migration if it is active (1) or not (0). | +| `user_login_total` | counter | Teleport Auth | Number of user logins. | | `watcher_event_sizes` | histogram | cache | Overall size of events emitted. | | `watcher_events` | histogram | cache | Per resource size of events emitted. | @@ -110,13 +111,13 @@ | `remote_clusters` | gauge | Teleport Proxy | Number of inbound connections from leaf clusters. | | `teleport_connect_to_node_attempts_total` | counter | Teleport Proxy | Number of SSH connection attempts to a SSH Service. Use with `failed_connect_to_node_attempts_total` to get the failure rate. | | `teleport_reverse_tunnels_connected` | gauge | Teleport Proxy | Number of reverse SSH tunnels connected to the Teleport Proxy Service by Teleport instances. | -| `trusted_clusters` | gauge | Teleport Proxy | Number of outbound connections to leaf clusters. | | `teleport_proxy_db_connection_setup_time_seconds` | histogram | Teleport Proxy | Time to establish connection to DB service from Proxy service. | | `teleport_proxy_db_connection_dial_attempts_total` | counter | Teleport Proxy | Number of dial attempts from Proxy to DB service made. | | `teleport_proxy_db_connection_dial_failures_total` | counter | Teleport Proxy | Number of failed dial attempts from Proxy to DB service made. | | `teleport_proxy_db_attempted_servers_total` | histogram | Teleport Proxy | Number of servers processed during connection attempt to the DB service from Proxy service. | | `teleport_proxy_db_connection_tls_config_time_seconds` | histogram | Teleport Proxy | Time to fetch TLS configuration for the connection to DB service from Proxy service. | | `teleport_proxy_db_active_connections_total` | gauge | Teleport Proxy | Number of currently active connections to DB service from Proxy service. | +| `trusted_clusters` | gauge | Teleport Proxy | Number of outbound connections to leaf clusters. | ## Database Service From 82e120d8d5653e7195697c7074271f753c0688cf Mon Sep 17 00:00:00 2001 From: Marco Dinis Date: Tue, 22 Oct 2024 15:54:36 +0100 Subject: [PATCH 15/70] Add instance name to DiscoverEC2 User Task failed instances list (#47712) * Add instance name to DiscoverEC2 User Task failed instances list * use stdlib slices and maps --- lib/srv/discovery/discovery.go | 2 +- lib/srv/discovery/status.go | 2 +- lib/srv/server/ec2_watcher.go | 4 ++ lib/srv/server/ec2_watcher_test.go | 82 ++++++++++++++++++++++++++++-- lib/srv/server/ssm_install.go | 78 +++++++++++++++++----------- lib/srv/server/ssm_install_test.go | 3 +- 6 files changed, 135 insertions(+), 36 deletions(-) diff --git a/lib/srv/discovery/discovery.go b/lib/srv/discovery/discovery.go index d1b490bbe0830..6e93a8a8eddc6 100644 --- a/lib/srv/discovery/discovery.go +++ b/lib/srv/discovery/discovery.go @@ -990,10 +990,10 @@ func (s *Server) handleEC2RemoteInstallation(instances *server.EC2Instances) err installerScript: req.InstallerScriptName(), }, &usertasksv1.DiscoverEC2Instance{ - // TODO(marco): add instance name DiscoveryConfig: instances.DiscoveryConfig, DiscoveryGroup: s.DiscoveryGroup, InstanceId: instance.InstanceID, + Name: instance.InstanceName, SyncTime: timestamppb.New(s.clock.Now()), }, ) diff --git a/lib/srv/discovery/status.go b/lib/srv/discovery/status.go index 4bb70efaa5b66..7fe0b0f39398d 100644 --- a/lib/srv/discovery/status.go +++ b/lib/srv/discovery/status.go @@ -310,12 +310,12 @@ func (s *Server) ReportEC2SSMInstallationResult(ctx context.Context, result *ser installerScript: result.InstallerScript, }, &usertasksv1.DiscoverEC2Instance{ - // TODO(marco): add instance name InvocationUrl: result.SSMRunEvent.InvocationURL, DiscoveryConfig: result.DiscoveryConfig, DiscoveryGroup: s.DiscoveryGroup, SyncTime: timestamppb.New(result.SSMRunEvent.Time), InstanceId: result.SSMRunEvent.InstanceID, + Name: result.InstanceName, }, ) diff --git a/lib/srv/server/ec2_watcher.go b/lib/srv/server/ec2_watcher.go index f8390b032c4d2..25f12018e0170 100644 --- a/lib/srv/server/ec2_watcher.go +++ b/lib/srv/server/ec2_watcher.go @@ -79,6 +79,7 @@ type EC2Instances struct { // discovered. type EC2Instance struct { InstanceID string + InstanceName string Tags map[string]string OriginalInstance ec2.Instance } @@ -92,6 +93,9 @@ func toEC2Instance(originalInst *ec2.Instance) EC2Instance { for _, tag := range originalInst.Tags { if key := aws.StringValue(tag.Key); key != "" { inst.Tags[key] = aws.StringValue(tag.Value) + if key == "Name" { + inst.InstanceName = aws.StringValue(tag.Value) + } } } return inst diff --git a/lib/srv/server/ec2_watcher_test.go b/lib/srv/server/ec2_watcher_test.go index 2647a7b0f527f..8279cbbd868f1 100644 --- a/lib/srv/server/ec2_watcher_test.go +++ b/lib/srv/server/ec2_watcher_test.go @@ -176,10 +176,16 @@ func TestEC2Watcher(t *testing.T) { present := ec2.Instance{ InstanceId: aws.String("instance-present"), - Tags: []*ec2.Tag{{ - Key: aws.String("teleport"), - Value: aws.String("yes"), - }}, + Tags: []*ec2.Tag{ + { + Key: aws.String("teleport"), + Value: aws.String("yes"), + }, + { + Key: aws.String("Name"), + Value: aws.String("Present"), + }, + }, State: &ec2.InstanceState{ Name: aws.String(ec2.InstanceStateNameRunning), }, @@ -360,3 +366,71 @@ func TestMakeEvents(t *testing.T) { }) } } + +func TestToEC2Instances(t *testing.T) { + sampleInstance := &ec2.Instance{ + InstanceId: aws.String("instance-001"), + Tags: []*ec2.Tag{ + { + Key: aws.String("teleport"), + Value: aws.String("yes"), + }, + { + Key: aws.String("Name"), + Value: aws.String("MyInstanceName"), + }, + }, + State: &ec2.InstanceState{ + Name: aws.String(ec2.InstanceStateNameRunning), + }, + } + + sampleInstanceWithoutName := &ec2.Instance{ + InstanceId: aws.String("instance-001"), + Tags: []*ec2.Tag{ + { + Key: aws.String("teleport"), + Value: aws.String("yes"), + }, + }, + State: &ec2.InstanceState{ + Name: aws.String(ec2.InstanceStateNameRunning), + }, + } + + for _, tt := range []struct { + name string + input []*ec2.Instance + expected []EC2Instance + }{ + { + name: "with name", + input: []*ec2.Instance{sampleInstance}, + expected: []EC2Instance{{ + InstanceID: "instance-001", + Tags: map[string]string{ + "Name": "MyInstanceName", + "teleport": "yes", + }, + InstanceName: "MyInstanceName", + OriginalInstance: *sampleInstance, + }}, + }, + { + name: "without name", + input: []*ec2.Instance{sampleInstanceWithoutName}, + expected: []EC2Instance{{ + InstanceID: "instance-001", + Tags: map[string]string{ + "teleport": "yes", + }, + OriginalInstance: *sampleInstanceWithoutName, + }}, + }, + } { + t.Run(tt.name, func(t *testing.T) { + got := ToEC2Instances(tt.input) + require.Equal(t, tt.expected, got) + }) + } +} diff --git a/lib/srv/server/ssm_install.go b/lib/srv/server/ssm_install.go index 6c0c2f427708e..3c23f672884a3 100644 --- a/lib/srv/server/ssm_install.go +++ b/lib/srv/server/ssm_install.go @@ -23,6 +23,8 @@ import ( "errors" "fmt" "log/slog" + "maps" + "slices" "strings" "github.com/aws/aws-sdk-go/aws" @@ -67,6 +69,9 @@ type SSMInstallationResult struct { SSMDocumentName string // InstallerScript is the Teleport Installer script name used to install Teleport into the instance. InstallerScript string + // InstanceName is the Instance's name. + // Might be empty. + InstanceName string } // SSMInstaller handles running SSM commands that install Teleport on EC2 instances. @@ -134,9 +139,9 @@ func NewSSMInstaller(cfg SSMInstallerConfig) (*SSMInstaller, error) { // Run executes the SSM document and then blocks until the command has completed. func (si *SSMInstaller) Run(ctx context.Context, req SSMRunRequest) error { - ids := make([]string, 0, len(req.Instances)) + instances := make(map[string]string, len(req.Instances)) for _, inst := range req.Instances { - ids = append(ids, inst.InstanceID) + instances[inst.InstanceID] = inst.InstanceName } params := make(map[string][]*string) @@ -144,8 +149,8 @@ func (si *SSMInstaller) Run(ctx context.Context, req SSMRunRequest) error { params[k] = []*string{aws.String(v)} } - validInstances := ids - instancesState, err := si.describeSSMAgentState(ctx, req, ids) + validInstances := instances + instancesState, err := si.describeSSMAgentState(ctx, req, instances) switch { case trace.IsAccessDenied(err): // describeSSMAgentState uses `ssm:DescribeInstanceInformation` to gather all the instances information. @@ -169,9 +174,10 @@ func (si *SSMInstaller) Run(ctx context.Context, req SSMRunRequest) error { validInstances = instancesState.valid } + validInstanceIDs := instanceIDsFrom(validInstances) output, err := req.SSM.SendCommandWithContext(ctx, &ssm.SendCommandInput{ DocumentName: aws.String(req.DocumentName), - InstanceIds: aws.StringSlice(validInstances), + InstanceIds: aws.StringSlice(validInstanceIDs), Parameters: params, }) if err != nil { @@ -190,7 +196,7 @@ func (si *SSMInstaller) Run(ctx context.Context, req SSMRunRequest) error { delete(params, ParamSSHDConfigPath) output, err = req.SSM.SendCommandWithContext(ctx, &ssm.SendCommandInput{ DocumentName: aws.String(req.DocumentName), - InstanceIds: aws.StringSlice(validInstances), + InstanceIds: aws.StringSlice(validInstanceIDs), Parameters: params, }) if err != nil { @@ -200,16 +206,17 @@ func (si *SSMInstaller) Run(ctx context.Context, req SSMRunRequest) error { g, ctx := errgroup.WithContext(ctx) g.SetLimit(10) - for _, inst := range validInstances { - inst := inst + for instanceID, instanceName := range validInstances { + instanceID := instanceID + instanceName := instanceName g.Go(func() error { - return trace.Wrap(si.checkCommand(ctx, req, output.Command.CommandId, &inst)) + return trace.Wrap(si.checkCommand(ctx, req, output.Command.CommandId, &instanceID, instanceName)) }) } return trace.Wrap(g.Wait()) } -func invalidSSMInstanceInstallationResult(req SSMRunRequest, instanceID, status, issueType string) *SSMInstallationResult { +func invalidSSMInstanceInstallationResult(req SSMRunRequest, instanceID, instanceName, status, issueType string) *SSMInstallationResult { return &SSMInstallationResult{ SSMRunEvent: &apievents.SSMRun{ Metadata: apievents.Metadata{ @@ -228,13 +235,14 @@ func invalidSSMInstanceInstallationResult(req SSMRunRequest, instanceID, status, IssueType: issueType, SSMDocumentName: req.DocumentName, InstallerScript: req.InstallerScriptName(), + InstanceName: instanceName, } } func (si *SSMInstaller) emitInvalidInstanceEvents(ctx context.Context, req SSMRunRequest, instanceIDsState *instanceIDsSSMState) error { var errs []error - for _, instanceID := range instanceIDsState.missing { - installationResult := invalidSSMInstanceInstallationResult(req, instanceID, + for instanceID, instanceName := range instanceIDsState.missing { + installationResult := invalidSSMInstanceInstallationResult(req, instanceID, instanceName, "EC2 Instance is not registered in SSM. Make sure that the instance has AmazonSSMManagedInstanceCore policy assigned.", usertasks.AutoDiscoverEC2IssueSSMInstanceNotRegistered, ) @@ -243,8 +251,8 @@ func (si *SSMInstaller) emitInvalidInstanceEvents(ctx context.Context, req SSMRu } } - for _, instanceID := range instanceIDsState.connectionLost { - installationResult := invalidSSMInstanceInstallationResult(req, instanceID, + for instanceID, instanceName := range instanceIDsState.connectionLost { + installationResult := invalidSSMInstanceInstallationResult(req, instanceID, instanceName, "SSM Agent in EC2 Instance is not connecting to SSM Service. Restart or reinstall the SSM service. See https://docs.aws.amazon.com/systems-manager/latest/userguide/ami-preinstalled-agent.html#verify-ssm-agent-status for more details.", usertasks.AutoDiscoverEC2IssueSSMInstanceConnectionLost, ) @@ -253,8 +261,8 @@ func (si *SSMInstaller) emitInvalidInstanceEvents(ctx context.Context, req SSMRu } } - for _, instanceID := range instanceIDsState.unsupportedOS { - installationResult := invalidSSMInstanceInstallationResult(req, instanceID, + for instanceID, instanceName := range instanceIDsState.unsupportedOS { + installationResult := invalidSSMInstanceInstallationResult(req, instanceID, instanceName, "EC2 instance is running an unsupported Operating System. Only Linux is supported.", usertasks.AutoDiscoverEC2IssueSSMInstanceUnsupportedOS, ) @@ -268,19 +276,29 @@ func (si *SSMInstaller) emitInvalidInstanceEvents(ctx context.Context, req SSMRu // instanceIDsSSMState contains a list of EC2 Instance IDs for a given state. type instanceIDsSSMState struct { - valid []string - missing []string - connectionLost []string - unsupportedOS []string + valid map[string]string + missing map[string]string + connectionLost map[string]string + unsupportedOS map[string]string +} + +func instanceIDsFrom(m map[string]string) []string { + return slices.Collect(maps.Keys(m)) } // describeSSMAgentState returns the instanceIDsSSMState for all the instances. -func (si *SSMInstaller) describeSSMAgentState(ctx context.Context, req SSMRunRequest, allInstanceIDs []string) (*instanceIDsSSMState, error) { - ret := &instanceIDsSSMState{} +func (si *SSMInstaller) describeSSMAgentState(ctx context.Context, req SSMRunRequest, allInstances map[string]string) (*instanceIDsSSMState, error) { + ret := &instanceIDsSSMState{ + valid: make(map[string]string), + missing: make(map[string]string), + connectionLost: make(map[string]string), + unsupportedOS: make(map[string]string), + } + instanceIDs := instanceIDsFrom(allInstances) ssmInstancesInfo, err := req.SSM.DescribeInstanceInformationWithContext(ctx, &ssm.DescribeInstanceInformationInput{ Filters: []*ssm.InstanceInformationStringFilter{ - {Key: aws.String(ssm.InstanceInformationFilterKeyInstanceIds), Values: aws.StringSlice(allInstanceIDs)}, + {Key: aws.String(ssm.InstanceInformationFilterKeyInstanceIds), Values: aws.StringSlice(instanceIDs)}, }, MaxResults: aws.Int64(awsEC2APIChunkSize), }) @@ -294,24 +312,24 @@ func (si *SSMInstaller) describeSSMAgentState(ctx context.Context, req SSMRunReq instanceStateByInstanceID[aws.StringValue(instanceState.InstanceId)] = instanceState } - for _, instanceID := range allInstanceIDs { + for instanceID, instanceName := range allInstances { instanceState, found := instanceStateByInstanceID[instanceID] if !found { - ret.missing = append(ret.missing, instanceID) + ret.missing[instanceID] = instanceName continue } if aws.StringValue(instanceState.PingStatus) == ssm.PingStatusConnectionLost { - ret.connectionLost = append(ret.connectionLost, instanceID) + ret.connectionLost[instanceID] = instanceName continue } if aws.StringValue(instanceState.PlatformType) != ssm.PlatformTypeLinux { - ret.unsupportedOS = append(ret.unsupportedOS, instanceID) + ret.unsupportedOS[instanceID] = instanceName continue } - ret.valid = append(ret.valid, instanceID) + ret.valid[instanceID] = instanceName } return ret, nil @@ -330,7 +348,7 @@ func skipAWSWaitErr(err error) error { return trace.Wrap(err) } -func (si *SSMInstaller) checkCommand(ctx context.Context, req SSMRunRequest, commandID, instanceID *string) error { +func (si *SSMInstaller) checkCommand(ctx context.Context, req SSMRunRequest, commandID, instanceID *string, instanceName string) error { err := req.SSM.WaitUntilCommandExecutedWithContext(ctx, &ssm.GetCommandInvocationInput{ CommandId: commandID, InstanceId: instanceID, @@ -377,6 +395,7 @@ func (si *SSMInstaller) checkCommand(ctx context.Context, req SSMRunRequest, com IssueType: usertasks.AutoDiscoverEC2IssueSSMScriptFailure, SSMDocumentName: req.DocumentName, InstallerScript: req.InstallerScriptName(), + InstanceName: instanceName, })) } @@ -393,6 +412,7 @@ func (si *SSMInstaller) checkCommand(ctx context.Context, req SSMRunRequest, com IssueType: usertasks.AutoDiscoverEC2IssueSSMScriptFailure, SSMDocumentName: req.DocumentName, InstallerScript: req.InstallerScriptName(), + InstanceName: instanceName, })) } } diff --git a/lib/srv/server/ssm_install_test.go b/lib/srv/server/ssm_install_test.go index 2107e91b0e590..c56b286258527 100644 --- a/lib/srv/server/ssm_install_test.go +++ b/lib/srv/server/ssm_install_test.go @@ -102,7 +102,7 @@ func TestSSMInstaller(t *testing.T) { name: "ssm run was successful", req: SSMRunRequest{ Instances: []EC2Instance{ - {InstanceID: "instance-id-1"}, + {InstanceID: "instance-id-1", InstanceName: "my-instance-name"}, }, DocumentName: document, Params: map[string]string{"token": "abcdefg"}, @@ -146,6 +146,7 @@ func TestSSMInstaller(t *testing.T) { }, IssueType: "ec2-ssm-script-failure", SSMDocumentName: "ssmdocument", + InstanceName: "my-instance-name", }}, }, { From 3672bc6da77d14d66582cd7b9bd97400a4d55975 Mon Sep 17 00:00:00 2001 From: Edward Dowling Date: Tue, 22 Oct 2024 16:47:29 +0100 Subject: [PATCH 16/70] Fix pagerduty AMR test to prevent flakiness (#46390) * Fix pagerduty AMR test to prevent flakiness * Update integrations/access/pagerduty/testlib/suite.go Co-authored-by: Zac Bergquist * Swap pagerduty test to use EventuallyWith * Update pagerduty tests to not create several access requests * Make more information available to AMR cache update callback * Update integrations/access/pagerduty/testlib/suite.go Co-authored-by: Tiago Silva * Update integrations/access/pagerduty/testlib/suite.go Co-authored-by: Tiago Silva * Fix formatting * Revert rename of pluginData in pagerduty tests * Remove duplicated ruleHandler init --------- Co-authored-by: Zac Bergquist Co-authored-by: Tiago Silva --- .../access_monitoring_rules.go | 10 +++++++ integrations/access/pagerduty/app.go | 9 ++++--- integrations/access/pagerduty/config.go | 6 +++++ .../access/pagerduty/testlib/suite.go | 27 +++++++++++++++---- 4 files changed, 44 insertions(+), 8 deletions(-) diff --git a/integrations/access/accessmonitoring/access_monitoring_rules.go b/integrations/access/accessmonitoring/access_monitoring_rules.go index 72eb921f3f4e8..7fb2c045d57ea 100644 --- a/integrations/access/accessmonitoring/access_monitoring_rules.go +++ b/integrations/access/accessmonitoring/access_monitoring_rules.go @@ -48,6 +48,7 @@ type RuleHandler struct { pluginName string fetchRecipientCallback func(ctx context.Context, recipient string) (*common.Recipient, error) + onCacheUpdateCallback func(Operation types.OpType, name string, rule *accessmonitoringrulesv1.AccessMonitoringRule) error } // RuleMap is a concurrent map for access monitoring rules. @@ -65,6 +66,8 @@ type RuleHandlerConfig struct { // FetchRecipientCallback is a callback that maps recipient strings to plugin Recipients. FetchRecipientCallback func(ctx context.Context, recipient string) (*common.Recipient, error) + // OnCacheUpdateCallback is a callback that is called when a rule in the cache is created or updated. + OnCacheUpdateCallback func(Operation types.OpType, name string, rule *accessmonitoringrulesv1.AccessMonitoringRule) error } // NewRuleHandler returns a new RuleHandler. @@ -77,6 +80,7 @@ func NewRuleHandler(conf RuleHandlerConfig) *RuleHandler { pluginType: conf.PluginType, pluginName: conf.PluginName, fetchRecipientCallback: conf.FetchRecipientCallback, + onCacheUpdateCallback: conf.OnCacheUpdateCallback, } } @@ -93,6 +97,9 @@ func (amrh *RuleHandler) InitAccessMonitoringRulesCache(ctx context.Context) err continue } amrh.accessMonitoringRules.rules[amr.GetMetadata().Name] = amr + if amrh.onCacheUpdateCallback != nil { + amrh.onCacheUpdateCallback(types.OpPut, amr.GetMetadata().Name, amr) + } } return nil } @@ -123,6 +130,9 @@ func (amrh *RuleHandler) HandleAccessMonitoringRule(ctx context.Context, event t return nil } amrh.accessMonitoringRules.rules[req.Metadata.Name] = req + if amrh.onCacheUpdateCallback != nil { + amrh.onCacheUpdateCallback(types.OpPut, req.GetMetadata().Name, req) + } return nil case types.OpDelete: delete(amrh.accessMonitoringRules.rules, event.Resource.GetName()) diff --git a/integrations/access/pagerduty/app.go b/integrations/access/pagerduty/app.go index 972ed1bffce11..5eadcc5147cd0 100644 --- a/integrations/access/pagerduty/app.go +++ b/integrations/access/pagerduty/app.go @@ -78,7 +78,6 @@ func NewApp(conf Config) (*App, error) { teleport: conf.Client, statusSink: conf.StatusSink, } - app.mainJob = lib.NewServiceJob(app.run) return app, nil @@ -173,7 +172,7 @@ func (a *App) init(ctx context.Context) error { } } - a.accessMonitoringRules = accessmonitoring.NewRuleHandler(accessmonitoring.RuleHandlerConfig{ + amrhConf := accessmonitoring.RuleHandlerConfig{ Client: a.teleport, PluginType: types.PluginTypePagerDuty, PluginName: pluginName, @@ -184,7 +183,11 @@ func (a *App) init(ctx context.Context) error { Kind: common.RecipientKindSchedule, }, nil }, - }) + } + if a.conf.OnAccessMonitoringRuleCacheUpdateCallback != nil { + amrhConf.OnCacheUpdateCallback = a.conf.OnAccessMonitoringRuleCacheUpdateCallback + } + a.accessMonitoringRules = accessmonitoring.NewRuleHandler(amrhConf) if pong, err = a.checkTeleportVersion(ctx); err != nil { return trace.Wrap(err) diff --git a/integrations/access/pagerduty/config.go b/integrations/access/pagerduty/config.go index f76e9d2f955f2..8bf7060652b01 100644 --- a/integrations/access/pagerduty/config.go +++ b/integrations/access/pagerduty/config.go @@ -24,6 +24,8 @@ import ( "github.com/gravitational/trace" "github.com/pelletier/go-toml" + accessmonitoringrulesv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" + "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/integrations/access/common" "github.com/gravitational/teleport/integrations/access/common/teleport" "github.com/gravitational/teleport/integrations/lib" @@ -47,6 +49,10 @@ type Config struct { // TeleportUser is the name of the Teleport user that will act // as the access request approver TeleportUser string + + // OnAccessMonitoringRuleCacheUpdateCallback is used for checking when + // the Rule cache is updated in tests + OnAccessMonitoringRuleCacheUpdateCallback func(Operation types.OpType, name string, rule *accessmonitoringrulesv1.AccessMonitoringRule) error } type PagerdutyConfig struct { diff --git a/integrations/access/pagerduty/testlib/suite.go b/integrations/access/pagerduty/testlib/suite.go index c379c85219a5c..b68c4d7e8d706 100644 --- a/integrations/access/pagerduty/testlib/suite.go +++ b/integrations/access/pagerduty/testlib/suite.go @@ -430,6 +430,15 @@ func (s *PagerdutySuiteOSS) TestRecipientsFromAccessMonitoringRule() { ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) t.Cleanup(cancel) + const ruleName = "test-pagerduty-amr" + var collectedNames []string + var mu sync.Mutex + s.appConfig.OnAccessMonitoringRuleCacheUpdateCallback = func(_ types.OpType, name string, _ *accessmonitoringrulesv1.AccessMonitoringRule) error { + mu.Lock() + collectedNames = append(collectedNames, name) + mu.Unlock() + return nil + } s.startApp() _, err := s.ClientByName(integration.RulerUserName). @@ -438,7 +447,7 @@ func (s *PagerdutySuiteOSS) TestRecipientsFromAccessMonitoringRule() { Kind: types.KindAccessMonitoringRule, Version: types.V1, Metadata: &v1.Metadata{ - Name: "test-pagerduty-amr", + Name: ruleName, }, Spec: &accessmonitoringrulesv1.AccessMonitoringRuleSpec{ Subjects: []string{types.KindAccessRequest}, @@ -453,6 +462,14 @@ func (s *PagerdutySuiteOSS) TestRecipientsFromAccessMonitoringRule() { }) assert.NoError(t, err) + // Incident creation may happen before plugins Access Monitoring Rule cache + // has been updated with new rule. Retry until the new cache picks up the rule. + require.EventuallyWithT(t, func(t *assert.CollectT) { + mu.Lock() + require.Contains(t, collectedNames, ruleName) + mu.Unlock() + }, 3*time.Second, time.Millisecond*100, "new access monitoring rule did not begin applying") + // Test execution: create an access request req := s.CreateAccessRequest(ctx, integration.RequesterOSSUserName, nil) @@ -463,16 +480,16 @@ func (s *PagerdutySuiteOSS) TestRecipientsFromAccessMonitoringRule() { }) incident, err := s.fakePagerduty.CheckNewIncident(ctx) - require.NoError(t, err, "no new incidents stored") - + assert.NoError(t, err, "no new incidents stored") assert.Equal(t, incident.ID, pluginData.IncidentID) - assert.Equal(t, s.pdNotifyService2.ID, pluginData.ServiceID) assert.Equal(t, pagerduty.PdIncidentKeyPrefix+"/"+req.GetName(), incident.IncidentKey) assert.Equal(t, "triggered", incident.Status) + assert.Equal(t, s.pdNotifyService2.ID, pluginData.ServiceID) + assert.NoError(t, s.ClientByName(integration.RulerUserName). - AccessMonitoringRulesClient().DeleteAccessMonitoringRule(ctx, "test-pagerduty-amr")) + AccessMonitoringRulesClient().DeleteAccessMonitoringRule(ctx, ruleName)) } func (s *PagerdutyBaseSuite) assertNewEvent(ctx context.Context, watcher types.Watcher, opType types.OpType, resourceKind, resourceName string) types.Event { From f8bcf4baed6a3dc01173133485a2da2795b6627e Mon Sep 17 00:00:00 2001 From: Lisa Kim Date: Tue, 22 Oct 2024 10:19:25 -0700 Subject: [PATCH 17/70] Web: rename generic variable name to a helpful name (#47722) --- .../RequestCheckout/RequestCheckout.story.tsx | 4 +-- .../RequestCheckout/RequestCheckout.test.tsx | 2 +- .../RequestCheckout/RequestCheckout.tsx | 13 ++++--- .../AccessRequestCheckout.tsx | 24 ++++++++----- .../useAccessRequestCheckout.ts | 34 ++++++++++++------- 5 files changed, 48 insertions(+), 29 deletions(-) diff --git a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.story.tsx b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.story.tsx index 115f18f84c7bf..865ed0a98a025 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.story.tsx +++ b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.story.tsx @@ -81,7 +81,7 @@ export const Empty = () => { null, createRequest: () => null, - data: [ + pendingAccessRequests: [ { kind: 'app', name: 'app-name', diff --git a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.test.tsx b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.test.tsx index 89fca74f4ff92..974a2498b92ad 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.test.tsx +++ b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.test.tsx @@ -154,7 +154,7 @@ const props: RequestCheckoutWithSliderProps = { selectedReviewers: [], setSelectedReviewers: () => null, createRequest: () => null, - data: [], + pendingAccessRequests: [], clearAttempt: () => null, onClose: () => null, toggleResource: () => null, diff --git a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx index 5ba2b973380f3..ee1dc315d360a 100644 --- a/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx +++ b/web/packages/shared/components/AccessRequests/NewRequest/RequestCheckout/RequestCheckout.tsx @@ -150,7 +150,7 @@ export function RequestCheckout({ setPendingRequestTtl, pendingRequestTtlOptions, dryRunResponse, - data, + pendingAccessRequests, showClusterNameColumn, createAttempt, fetchResourceRequestRolesAttempt, @@ -190,12 +190,14 @@ export function RequestCheckout({ selectedResourceRequestRoles.length < 1; const submitBtnDisabled = - data.length === 0 || + pendingAccessRequests.length === 0 || createAttempt.status === 'processing' || isInvalidRoleSelection || fetchResourceRequestRolesAttempt.status === 'failed' || fetchResourceRequestRolesAttempt.status === 'processing'; + const numPendingAccessRequests = pendingAccessRequests.length; + const DefaultHeader = () => { return ( @@ -208,7 +210,8 @@ export function RequestCheckout({ />

- {data.length} {pluralize(data.length, 'Resource')} Selected + {numPendingAccessRequests}{' '} + {pluralize(numPendingAccessRequests, 'Resource')} Selected

@@ -254,7 +257,7 @@ export function RequestCheckout({ )} = isResourceRequest: boolean; requireReason: boolean; selectedReviewers: ReviewerOption[]; - data: T[]; + pendingAccessRequests: T[]; showClusterNameColumn?: boolean; createRequest: (req: CreateRequest) => void; fetchStatus: 'loading' | 'loaded'; diff --git a/web/packages/teleterm/src/ui/AccessRequestCheckout/AccessRequestCheckout.tsx b/web/packages/teleterm/src/ui/AccessRequestCheckout/AccessRequestCheckout.tsx index 41e18deb05711..44e81b59b3822 100644 --- a/web/packages/teleterm/src/ui/AccessRequestCheckout/AccessRequestCheckout.tsx +++ b/web/packages/teleterm/src/ui/AccessRequestCheckout/AccessRequestCheckout.tsx @@ -85,7 +85,7 @@ export function AccessRequestCheckout() { fetchResourceRolesAttempt, setSelectedResourceRequestRoles, clearCreateAttempt, - data, + pendingAccessRequests, shouldShowClusterNameColumn, selectedReviewers, setSelectedReviewers, @@ -104,7 +104,7 @@ export function AccessRequestCheckout() { onStartTimeChange, } = useAccessRequestCheckout(); - const isRoleRequest = data[0]?.kind === 'role'; + const isRoleRequest = pendingAccessRequests[0]?.kind === 'role'; const transitionRef = useRef(); function closeCheckout() { @@ -113,10 +113,15 @@ export function AccessRequestCheckout() { // We should rather detect how much space we have, // but for simplicity we only count items. - const moreToShow = Math.max(data.length - MAX_RESOURCES_IN_BAR_TO_SHOW, 0); + const moreToShow = Math.max( + pendingAccessRequests.length - MAX_RESOURCES_IN_BAR_TO_SHOW, + 0 + ); + const numPendingAccessRequests = pendingAccessRequests.length; + return ( <> - {data.length > 0 && !isCollapsed() && ( + {pendingAccessRequests.length > 0 && !isCollapsed() && ( - {data.length}{' '} - {pluralize(data.length, isRoleRequest ? 'role' : 'resource')}{' '} + {numPendingAccessRequests}{' '} + {pluralize( + numPendingAccessRequests, + isRoleRequest ? 'role' : 'resource' + )}{' '} added to access request: - {data + {pendingAccessRequests .slice(0, MAX_RESOURCES_IN_BAR_TO_SHOW) .map(c => { let resource = { @@ -238,7 +246,7 @@ export function AccessRequestCheckout() { }) } reset={reset} - data={data} + pendingAccessRequests={pendingAccessRequests} showClusterNameColumn={shouldShowClusterNameColumn} createAttempt={createRequestAttempt} resourceRequestRoles={resourceRequestRoles} diff --git a/web/packages/teleterm/src/ui/AccessRequestCheckout/useAccessRequestCheckout.ts b/web/packages/teleterm/src/ui/AccessRequestCheckout/useAccessRequestCheckout.ts index 11f78ea5ebd09..4ad261cf61b3c 100644 --- a/web/packages/teleterm/src/ui/AccessRequestCheckout/useAccessRequestCheckout.ts +++ b/web/packages/teleterm/src/ui/AccessRequestCheckout/useAccessRequestCheckout.ts @@ -91,7 +91,7 @@ export default function useAccessRequestCheckout() { workspaceAccessRequest?.getPendingAccessRequest(); useEffect(() => { - // Do a new dry run per changes to pending data + // Do a new dry run per changes to pending access requests // to get the latest time options and latest calculated // suggested reviewers. // Options and reviewers can change depending on the selected @@ -106,12 +106,13 @@ export default function useAccessRequestCheckout() { return; } - const data = getPendingAccessRequestsPerResource(pendingAccessRequest); + const pendingAccessRequests = + getPendingAccessRequestsPerResource(pendingAccessRequest); runFetchResourceRoles(() => retryWithRelogin(ctx, clusterUri, async () => { const { response } = await ctx.tshd.getRequestableRoles({ clusterUri: rootClusterUri, - resourceIds: data + resourceIds: pendingAccessRequests .filter(d => d.kind !== 'role') .map(d => ({ // We have to use id, not name. @@ -148,9 +149,9 @@ export default function useAccessRequestCheckout() { function getPendingAccessRequestsPerResource( pendingRequest: PendingAccessRequest ): PendingListItemWithOriginalItem[] { - const data: PendingListItemWithOriginalItem[] = []; + const pendingAccessRequests: PendingListItemWithOriginalItem[] = []; if (!workspaceAccessRequest) { - return data; + return pendingAccessRequests; } switch (pendingRequest.kind) { @@ -158,7 +159,7 @@ export default function useAccessRequestCheckout() { const clusterName = ctx.clustersService.findCluster(rootClusterUri)?.name; pendingRequest.roles.forEach(role => { - data.push({ + pendingAccessRequests.push({ kind: 'role', id: role, name: role, @@ -171,7 +172,7 @@ export default function useAccessRequestCheckout() { pendingRequest.resources.forEach(resourceRequest => { const { kind, id, name } = extractResourceRequestProperties(resourceRequest); - data.push({ + pendingAccessRequests.push({ kind, id, name, @@ -183,7 +184,7 @@ export default function useAccessRequestCheckout() { }); } } - return data; + return pendingAccessRequests; } function isCollapsed() { @@ -221,13 +222,14 @@ export default function useAccessRequestCheckout() { * Shared logic used both during dry runs and regular access request creation. */ function prepareAndCreateRequest(req: CreateRequest) { - const data = getPendingAccessRequestsPerResource(pendingAccessRequest); + const pendingAccessRequests = + getPendingAccessRequestsPerResource(pendingAccessRequest); const params: CreateAccessRequestRequest = { rootClusterUri, reason: req.reason, suggestedReviewers: req.suggestedReviewers || [], dryRun: req.dryRun, - resourceIds: data + resourceIds: pendingAccessRequests .filter(d => d.kind !== 'role') .map(d => ({ name: d.id, @@ -235,7 +237,9 @@ export default function useAccessRequestCheckout() { kind: d.kind, subResourceName: '', })), - roles: data.filter(d => d.kind === 'role').map(d => d.name), + roles: pendingAccessRequests + .filter(d => d.kind === 'role') + .map(d => d.name), assumeStartTime: req.start && Timestamp.fromDate(req.start), maxDuration: req.maxDuration && Timestamp.fromDate(req.maxDuration), requestTtl: req.requestTTL && Timestamp.fromDate(req.requestTTL), @@ -250,7 +254,10 @@ export default function useAccessRequestCheckout() { return retryWithRelogin(ctx, clusterUri, () => ctx.clustersService.createAccessRequest(params).then(({ response }) => { - return { accessRequest: response.request, requestedCount: data.length }; + return { + accessRequest: response.request, + requestedCount: pendingAccessRequests.length, + }; }) ).catch(e => { setCreateRequestAttempt({ status: 'failed', statusText: e.message }); @@ -337,7 +344,8 @@ export default function useAccessRequestCheckout() { isCollapsed, assumedRequests: getAssumedRequests(), toggleResource, - data: getPendingAccessRequestsPerResource(pendingAccessRequest), + pendingAccessRequests: + getPendingAccessRequestsPerResource(pendingAccessRequest), shouldShowClusterNameColumn, createRequest, reset, From 93a548c6af0a4c123217ce2ac2487c6aab1c160e Mon Sep 17 00:00:00 2001 From: Nic Klaassen Date: Tue, 22 Oct 2024 10:46:00 -0700 Subject: [PATCH 18/70] resolve minor TODOs (#47777) * resolve minor TODOs * fix terraform docs --- api/client/proto/joinservice.pb.go | 3 ++- api/proto/teleport/legacy/client/proto/joinservice.proto | 3 ++- api/proto/teleport/legacy/types/types.proto | 3 ++- api/types/types.pb.go | 3 ++- .../terraform-provider/data-sources/auth_preference.mdx | 2 +- .../reference/terraform-provider/resources/auth_preference.mdx | 2 +- integrations/terraform/tfschema/types_terraform.go | 2 +- lib/auth/bot.go | 2 -- lib/auth/init.go | 1 - lib/cryptosuites/suites.go | 1 - lib/reversetunnel/cache.go | 2 -- 11 files changed, 11 insertions(+), 13 deletions(-) diff --git a/api/client/proto/joinservice.pb.go b/api/client/proto/joinservice.pb.go index a819e18f0c46d..78690405a47e7 100644 --- a/api/client/proto/joinservice.pb.go +++ b/api/client/proto/joinservice.pb.go @@ -27,7 +27,8 @@ var _ = math.Inf // proto package needs to be updated. const _ = proto.GoGoProtoPackageIsVersion3 // please upgrade the proto package -// TODO(nklaassen): Document me. +// RegisterUsingIAMMethodRequest is a request for registration via the IAM join +// method. type RegisterUsingIAMMethodRequest struct { // RegisterUsingTokenRequest holds registration parameters common to all // join methods. diff --git a/api/proto/teleport/legacy/client/proto/joinservice.proto b/api/proto/teleport/legacy/client/proto/joinservice.proto index 68b35f06df334..2f173401fdd20 100644 --- a/api/proto/teleport/legacy/client/proto/joinservice.proto +++ b/api/proto/teleport/legacy/client/proto/joinservice.proto @@ -21,7 +21,8 @@ import "teleport/legacy/types/types.proto"; option go_package = "github.com/gravitational/teleport/api/client/proto"; -// TODO(nklaassen): Document me. +// RegisterUsingIAMMethodRequest is a request for registration via the IAM join +// method. message RegisterUsingIAMMethodRequest { // RegisterUsingTokenRequest holds registration parameters common to all // join methods. diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 87b50603ac146..cf5042e3b21c6 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -2095,7 +2095,8 @@ message AuthPreferenceSpecV2 { HardwareKey HardwareKey = 19 [(gogoproto.jsontag) = "hardware_key,omitempty"]; // SignatureAlgorithmSuite is the configured signature algorithm suite for the cluster. - // The current default value is "legacy". This field is not yet fully supported. + // If unspecified, the current default value is "legacy". + // 1 is "legacy", 2 is "balanced-v1", 3 is "fips-v1", 4 is "hsm-v1". SignatureAlgorithmSuite signature_algorithm_suite = 20; // SecondFactors is a list of supported second factor types. diff --git a/api/types/types.pb.go b/api/types/types.pb.go index b0cfa923ae986..ffcd029a4f18e 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -6175,7 +6175,8 @@ type AuthPreferenceSpecV2 struct { // HardwareKey are the settings for hardware key support. HardwareKey *HardwareKey `protobuf:"bytes,19,opt,name=HardwareKey,proto3" json:"hardware_key,omitempty"` // SignatureAlgorithmSuite is the configured signature algorithm suite for the cluster. - // The current default value is "legacy". This field is not yet fully supported. + // If unspecified, the current default value is "legacy". + // 1 is "legacy", 2 is "balanced-v1", 3 is "fips-v1", 4 is "hsm-v1". SignatureAlgorithmSuite SignatureAlgorithmSuite `protobuf:"varint,20,opt,name=signature_algorithm_suite,json=signatureAlgorithmSuite,proto3,enum=types.SignatureAlgorithmSuite" json:"signature_algorithm_suite,omitempty"` // SecondFactors is a list of supported second factor types. SecondFactors []SecondFactorType `protobuf:"varint,21,rep,packed,name=SecondFactors,proto3,enum=types.SecondFactorType" json:"second_factors,omitempty"` diff --git a/docs/pages/reference/terraform-provider/data-sources/auth_preference.mdx b/docs/pages/reference/terraform-provider/data-sources/auth_preference.mdx index cfbd8e789ff2b..b6c7dfd44ff05 100644 --- a/docs/pages/reference/terraform-provider/data-sources/auth_preference.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/auth_preference.mdx @@ -42,7 +42,7 @@ Optional: - `require_session_mfa` (Number) RequireMFAType is the type of MFA requirement enforced for this cluster. 0 is "OFF", 1 is "SESSION", 2 is "SESSION_AND_HARDWARE_KEY", 3 is "HARDWARE_KEY_TOUCH", 4 is "HARDWARE_KEY_PIN", 5 is "HARDWARE_KEY_TOUCH_AND_PIN". - `second_factor` (String) SecondFactor is the type of mult-factor. - `second_factors` (List of Number) SecondFactors is a list of supported second factor types. -- `signature_algorithm_suite` (Number) SignatureAlgorithmSuite is the configured signature algorithm suite for the cluster. The current default value is "legacy". This field is not yet fully supported. +- `signature_algorithm_suite` (Number) SignatureAlgorithmSuite is the configured signature algorithm suite for the cluster. If unspecified, the current default value is "legacy". 1 is "legacy", 2 is "balanced-v1", 3 is "fips-v1", 4 is "hsm-v1". - `type` (String) Type is the type of authentication. - `u2f` (Attributes) U2F are the settings for the U2F device. (see [below for nested schema](#nested-schema-for-specu2f)) - `webauthn` (Attributes) Webauthn are the settings for server-side Web Authentication support. (see [below for nested schema](#nested-schema-for-specwebauthn)) diff --git a/docs/pages/reference/terraform-provider/resources/auth_preference.mdx b/docs/pages/reference/terraform-provider/resources/auth_preference.mdx index 4de75147ae762..fbc49794bc64a 100644 --- a/docs/pages/reference/terraform-provider/resources/auth_preference.mdx +++ b/docs/pages/reference/terraform-provider/resources/auth_preference.mdx @@ -61,7 +61,7 @@ Optional: - `require_session_mfa` (Number) RequireMFAType is the type of MFA requirement enforced for this cluster. 0 is "OFF", 1 is "SESSION", 2 is "SESSION_AND_HARDWARE_KEY", 3 is "HARDWARE_KEY_TOUCH", 4 is "HARDWARE_KEY_PIN", 5 is "HARDWARE_KEY_TOUCH_AND_PIN". - `second_factor` (String) SecondFactor is the type of mult-factor. - `second_factors` (List of Number) SecondFactors is a list of supported second factor types. -- `signature_algorithm_suite` (Number) SignatureAlgorithmSuite is the configured signature algorithm suite for the cluster. The current default value is "legacy". This field is not yet fully supported. +- `signature_algorithm_suite` (Number) SignatureAlgorithmSuite is the configured signature algorithm suite for the cluster. If unspecified, the current default value is "legacy". 1 is "legacy", 2 is "balanced-v1", 3 is "fips-v1", 4 is "hsm-v1". - `type` (String) Type is the type of authentication. - `u2f` (Attributes) U2F are the settings for the U2F device. (see [below for nested schema](#nested-schema-for-specu2f)) - `webauthn` (Attributes) Webauthn are the settings for server-side Web Authentication support. (see [below for nested schema](#nested-schema-for-specwebauthn)) diff --git a/integrations/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index cfbac365857eb..abb411d8bcad2 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -1405,7 +1405,7 @@ func GenSchemaAuthPreferenceV2(ctx context.Context) (github_com_hashicorp_terraf Type: github_com_hashicorp_terraform_plugin_framework_types.ListType{ElemType: github_com_hashicorp_terraform_plugin_framework_types.Int64Type}, }, "signature_algorithm_suite": { - Description: "SignatureAlgorithmSuite is the configured signature algorithm suite for the cluster. The current default value is \"legacy\". This field is not yet fully supported.", + Description: "SignatureAlgorithmSuite is the configured signature algorithm suite for the cluster. If unspecified, the current default value is \"legacy\". 1 is \"legacy\", 2 is \"balanced-v1\", 3 is \"fips-v1\", 4 is \"hsm-v1\".", Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.Int64Type, }, diff --git a/lib/auth/bot.go b/lib/auth/bot.go index 4b6300564278c..d2ce2518abb50 100644 --- a/lib/auth/bot.go +++ b/lib/auth/bot.go @@ -288,8 +288,6 @@ func (a *Server) updateBotInstance( } } - // TODO(nklaassen): consider recording both public keys once they are - // actually separated. var publicKeyPEM []byte if req.tlsPublicKey != nil { publicKeyPEM = req.tlsPublicKey diff --git a/lib/auth/init.go b/lib/auth/init.go index 28a94a6e39546..f56dac7af91db 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -1244,7 +1244,6 @@ func checkResourceConsistency(ctx context.Context, keyStore *keystore.Manager, c // GenerateIdentity generates identity for the auth server func GenerateIdentity(a *Server, id state.IdentityID, additionalPrincipals, dnsNames []string) (*state.Identity, error) { - // TODO(nklaassen): split SSH and TLS keys for host identities. key, err := cryptosuites.GenerateKey(context.Background(), cryptosuites.GetCurrentSuiteFromAuthPreference(a), cryptosuites.HostIdentity) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/cryptosuites/suites.go b/lib/cryptosuites/suites.go index 641c53ce1c8ac..d9f1ec8bf7d71 100644 --- a/lib/cryptosuites/suites.go +++ b/lib/cryptosuites/suites.go @@ -100,7 +100,6 @@ const ( // HostSSH represents a host SSH key. HostSSH // HostIdentity represents a key used for a Teleport host identity. - // TODO(nklaassen): split SSH and TLS keys used for host identities. HostIdentity // BotImpersonatedIdentity represents a key used for a general impersonated diff --git a/lib/reversetunnel/cache.go b/lib/reversetunnel/cache.go index afcbd9355153c..3b2e0ab41c552 100644 --- a/lib/reversetunnel/cache.go +++ b/lib/reversetunnel/cache.go @@ -113,8 +113,6 @@ func (c *certificateCache) generateHostCert(ctx context.Context, principals []st return nil, trace.Wrap(err) } - // TODO(nklaassen): request only an SSH cert, we don't need TLS here. - // GenerateHostCert needs support for this. res, err := c.authClient.TrustClient().GenerateHostCert(ctx, &trustpb.GenerateHostCertRequest{ Key: pubBytes, HostId: principals[0], From 088f8eafdde39d745c6c7ae2dbd0f00332a503a2 Mon Sep 17 00:00:00 2001 From: Michael Date: Tue, 22 Oct 2024 13:24:44 -0500 Subject: [PATCH 19/70] Add required apps/cors tests to web testplan (#47711) --- .github/ISSUE_TEMPLATE/webtestplan.md | 93 +++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/webtestplan.md b/.github/ISSUE_TEMPLATE/webtestplan.md index a0414c0409085..2f905c9f3ec68 100644 --- a/.github/ISSUE_TEMPLATE/webtestplan.md +++ b/.github/ISSUE_TEMPLATE/webtestplan.md @@ -259,6 +259,99 @@ spec: - [ ] Verify that root is marked with a `root` pill - [ ] Verify that cluster dropdown menu items goes to the correct route +## Application Access + +### Required Applications + +Create two apps running locally, a frontend app and a backend app. The frontend app should +make an API request to the backend app at its teleport public_addr + +
+ You can use this example app if you don't have a frontend/backend setup + + ```go + package main + + import ( + "encoding/json" + "fmt" + "log" + "net/http" + ) + + // change to your cluster addr + const clusterName = "avatus.sh" + + func main() { + // handler for the html page. this is the "client". + http.HandleFunc("/", func(w http.ResponseWriter, r *http.Request) { + html := fmt.Sprintf(html, clusterName) + w.Header().Set("Content-Type", "text/html") + w.Write([]byte(html)) + }) + + // Handler for the API endpoint + http.HandleFunc("/api/data", func(w http.ResponseWriter, r *http.Request) { + w.Header().Set("Access-Control-Allow-Origin", fmt.Sprintf("https://client.%s", clusterName)) + w.Header().Set("Access-Control-Allow-Credentials", "true") + data := map[string]string{"hello": "world"} + w.Header().Set("Content-Type", "application/json") + json.NewEncoder(w).Encode(data) + }) + + log.Println("Server starting on http://localhost:8080") + log.Fatal(http.ListenAndServe(":8080", nil)) + } + + const html = ` + + + + + + API Data Fetcher + + +
+
+ + + + ` +``` +
+ +Update your app service to serve the apps like this (update your public addr to what makes sense for your cluster) +``` +app_service: + enabled: "yes" + debug_app: true + apps: + - name: client + uri: http://localhost:8080 + public_addr: client.avatus.sh + required_apps: + - api + - name: api + uri: http://localhost:8080 + public_addr: api.avatus.sh + cors: + allowed_origins: + - https://client.avatus.sh +``` + +Launch your cluster and make sure you are logged out of your api by going to `https://api.avatus.sh/teleport-logout` + +- [ ] Launch the client app and you should see `{"hello":"world"}` response +- [ ] You should see no CORS issues in the console + ## Access Requests Not available for OSS From b82b037f6e4a94a7ce8d84bf7ec010c5baff2771 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Tue, 22 Oct 2024 15:03:11 -0400 Subject: [PATCH 20/70] docs: update policy prereqs (#47784) --- .../teleport-policy/integrations/aws-sync.mdx | 11 ++++++----- .../teleport-policy/integrations/entra-id.mdx | 7 ++++--- .../teleport-policy/integrations/gitlab.mdx | 13 +++++++------ .../teleport-policy/integrations/ssh-keys-scan.mdx | 13 +++++++------ 4 files changed, 24 insertions(+), 20 deletions(-) diff --git a/docs/pages/admin-guides/teleport-policy/integrations/aws-sync.mdx b/docs/pages/admin-guides/teleport-policy/integrations/aws-sync.mdx index cb35dc9c2c067..2aae7cd963fb5 100644 --- a/docs/pages/admin-guides/teleport-policy/integrations/aws-sync.mdx +++ b/docs/pages/admin-guides/teleport-policy/integrations/aws-sync.mdx @@ -60,12 +60,13 @@ graphical representation thereof. ## Prerequisites - A running Teleport Enterprise cluster v14.3.9/v15.2.0 or later. -- For self-hosted clusters, an updated `license.pem` with Teleport Policy enabled. -- For self-hosted clusters, a running Access Graph node v1.17.0 or later. -Check [Access Graph page](../teleport-policy.mdx) for details on +- Teleport Policy enabled for your account. +- For self-hosted clusters: + - Ensure that an up-to-date `license.pem` is used in the Auth Service configuration. + - A running Access Graph node v1.17.0 or later. +Check the [Teleport Policy page](../teleport-policy.mdx) for details on how to set up Access Graph. -- The node running the Access Graph service must be reachable -from Teleport Auth Service and Discovery Service. + - The node running the Access Graph service must be reachable from the Teleport Auth Service. ## Step 1/2. Configure Discovery Service (Self-hosted only) diff --git a/docs/pages/admin-guides/teleport-policy/integrations/entra-id.mdx b/docs/pages/admin-guides/teleport-policy/integrations/entra-id.mdx index 67d9736ed8ff2..da9b9e7feff9b 100644 --- a/docs/pages/admin-guides/teleport-policy/integrations/entra-id.mdx +++ b/docs/pages/admin-guides/teleport-policy/integrations/entra-id.mdx @@ -35,11 +35,12 @@ These resources are then visualized using the graph representation detailed in t - A running Teleport Enterprise cluster v15.4.2/v16.0.0 or later. - Teleport Identity and Teleport Policy enabled for your account. - - For self-hosted clusters, ensure that an up-to-date `license.pem` is used in the Auth Service configuration. -- For self-hosted clusters, a running Access Graph node v1.21.3 or later. +- For self-hosted clusters: + - Ensure that an up-to-date `license.pem` is used in the Auth Service configuration. + - A running Access Graph node v1.21.3 or later. Check the [Teleport Policy page](../teleport-policy.mdx) for details on how to set up Access Graph. -- The node running the Access Graph service must be reachable from the Teleport Auth Service. + - The node running the Access Graph service must be reachable from the Teleport Auth Service. - Your user must have privileged administrator permissions in the Azure account To verify that Access Graph is set up correctly for your cluster, sign in to the Teleport Web UI and navigate to the Management tab. diff --git a/docs/pages/admin-guides/teleport-policy/integrations/gitlab.mdx b/docs/pages/admin-guides/teleport-policy/integrations/gitlab.mdx index 83cc193507070..3a25ef7ad225f 100644 --- a/docs/pages/admin-guides/teleport-policy/integrations/gitlab.mdx +++ b/docs/pages/admin-guides/teleport-policy/integrations/gitlab.mdx @@ -46,13 +46,14 @@ graphical representation thereof. ## Prerequisites - A running Teleport Enterprise cluster v14.3.20/v15.3.1/v16.0.0 or later. -- For self-hosted clusters, an updated `license.pem` with Teleport Policy enabled. -- For self-hosted clusters, a running Access Graph node v1.21.4 or later. -Check [Access Graph page](../teleport-policy.mdx) for details on -how to set up Access Graph. -- For self-hosted clusters, the node running the Access Graph service must be reachable -from Teleport Auth Service. +- Teleport Policy enabled for your account. - A GitLab instance running GitLab v9.0 or later. +- For self-hosted clusters: + - Ensure that an up-to-date `license.pem` is used in the Auth Service configuration. + - A running Access Graph node v1.21.4 or later. +Check the [Teleport Policy page](../teleport-policy.mdx) for details on +how to set up Access Graph. + - The node running the Access Graph service must be reachable from the Teleport Auth Service. ## Step 1/3. Create GitLab token diff --git a/docs/pages/admin-guides/teleport-policy/integrations/ssh-keys-scan.mdx b/docs/pages/admin-guides/teleport-policy/integrations/ssh-keys-scan.mdx index 8aa1b8eac451a..8c50d3ad2da9d 100644 --- a/docs/pages/admin-guides/teleport-policy/integrations/ssh-keys-scan.mdx +++ b/docs/pages/admin-guides/teleport-policy/integrations/ssh-keys-scan.mdx @@ -70,15 +70,16 @@ It also never sends the private key path or any other sensitive information. ## Prerequisites - A running Teleport Enterprise cluster v15.4.16/v16.2.0 or later. -- For self-hosted clusters, an updated `license.pem` with Teleport Policy enabled. -- For self-hosted clusters, a running Access Graph node v1.22.0 or later. -Check [Access Graph page](../teleport-policy.mdx) for details on -how to set up Access Graph. -- For self-hosted clusters, the node running the Access Graph service must be reachable -from Teleport Auth Service. +- Teleport Policy enabled for your account. - A Linux/macOS server running the Teleport SSH Service. - Devices enrolled in the [Teleport Device Trust feature](../../access-controls/device-trust.mdx). - For Jamf Pro integration, devices must be enrolled in Jamf Pro and have the signed `tsh` binary installed. +- For self-hosted clusters: + - Ensure that an up-to-date `license.pem` is used in the Auth Service configuration. + - A running Access Graph node v1.22.0 or later. +Check the [Teleport Policy page](../teleport-policy.mdx) for details on +how to set up Access Graph. + - The node running the Access Graph service must be reachable from the Teleport Auth Service. ## Step 1/3. Enable SSH Key Scanning From 0f487f6bbcf29caa61b9576de9d9ef6769b4d82d Mon Sep 17 00:00:00 2001 From: Przemko Robakowski Date: Tue, 22 Oct 2024 22:12:34 +0200 Subject: [PATCH 21/70] Implement API and backend for DynamicWindowsDesktop (#46987) * Add DynamicWindowsDesktop to proto * Add resource matchers to Windows desktop service config * Implement API and backend for DynamicWindowsDesktop * Fix imports * move rpc to separate server * rework api and grpc more towards 153-style * e * remove dynamic windows from paginated resource * add tests * add tests * Update api/proto/teleport/legacy/types/types.proto Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> * lint * gci * cleanup * cleanup * use generic service * cleanup * cleanup * cleanup * cleanup * cleanup * gci * add admin action checks * move service * add service test * gci * review comments * review comments * review comments * review comments * review comments --------- Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> --- api/client/client.go | 6 + api/client/dynamicwindows/dynamicwindows.go | 93 +++++++ api/types/constants.go | 3 + api/types/derived.gen.go | 188 +++++++------- api/types/desktop.go | 203 ++++++++++++++- api/types/role.go | 2 + lib/auth/auth.go | 8 + .../dynamicwindowsv1/service.go | 215 ++++++++++++++++ .../dynamicwindowsv1/service_test.go | 220 +++++++++++++++++ lib/auth/grpcserver.go | 13 + lib/auth/init.go | 5 +- lib/authz/permissions.go | 1 + lib/services/dynamic_desktop.go | 90 +++++++ lib/services/local/dynamic_desktops.go | 119 +++++++++ lib/services/local/dynamic_desktops_test.go | 232 ++++++++++++++++++ lib/services/resource.go | 2 + lib/services/role.go | 1 + 17 files changed, 1303 insertions(+), 98 deletions(-) create mode 100644 api/client/dynamicwindows/dynamicwindows.go create mode 100644 lib/auth/dynamicwindows/dynamicwindowsv1/service.go create mode 100644 lib/auth/dynamicwindows/dynamicwindowsv1/service_test.go create mode 100644 lib/services/dynamic_desktop.go create mode 100644 lib/services/local/dynamic_desktops.go create mode 100644 lib/services/local/dynamic_desktops_test.go diff --git a/api/client/client.go b/api/client/client.go index 8980e42ac16e8..fc08ad53467c7 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -53,6 +53,7 @@ import ( "github.com/gravitational/teleport/api/client/accessmonitoringrules" crownjewelapi "github.com/gravitational/teleport/api/client/crownjewel" "github.com/gravitational/teleport/api/client/discoveryconfig" + "github.com/gravitational/teleport/api/client/dynamicwindows" "github.com/gravitational/teleport/api/client/externalauditstorage" kubewaitingcontainerclient "github.com/gravitational/teleport/api/client/kubewaitingcontainer" "github.com/gravitational/teleport/api/client/okta" @@ -74,6 +75,7 @@ import ( dbobjectimportrulev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobjectimportrule/v1" devicepb "github.com/gravitational/teleport/api/gen/proto/go/teleport/devicetrust/v1" discoveryconfigv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/discoveryconfig/v1" + dynamicwindowsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dynamicwindows/v1" externalauditstoragev1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/externalauditstorage/v1" integrationpb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" kubeproto "github.com/gravitational/teleport/api/gen/proto/go/teleport/kube/v1" @@ -2657,6 +2659,10 @@ func (c *Client) SearchSessionEvents(ctx context.Context, fromUTC time.Time, toU return decodedEvents, response.LastKey, nil } +func (c *Client) DynamicDesktopClient() *dynamicwindows.Client { + return dynamicwindows.NewClient(dynamicwindowsv1.NewDynamicWindowsServiceClient(c.conn)) +} + // ClusterConfigClient returns an unadorned Cluster Configuration client, using the underlying // Auth gRPC connection. func (c *Client) ClusterConfigClient() clusterconfigpb.ClusterConfigServiceClient { diff --git a/api/client/dynamicwindows/dynamicwindows.go b/api/client/dynamicwindows/dynamicwindows.go new file mode 100644 index 0000000000000..6c158a39e4243 --- /dev/null +++ b/api/client/dynamicwindows/dynamicwindows.go @@ -0,0 +1,93 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package dynamicwindows + +import ( + "context" + + "github.com/gravitational/trace" + + dynamicwindows "github.com/gravitational/teleport/api/gen/proto/go/teleport/dynamicwindows/v1" + "github.com/gravitational/teleport/api/types" +) + +// Client is a DynamicWindowsDesktop client. +type Client struct { + grpcClient dynamicwindows.DynamicWindowsServiceClient +} + +// NewClient creates a new StaticHostUser client. +func NewClient(grpcClient dynamicwindows.DynamicWindowsServiceClient) *Client { + return &Client{ + grpcClient: grpcClient, + } +} + +func (c *Client) GetDynamicWindowsDesktop(ctx context.Context, name string) (types.DynamicWindowsDesktop, error) { + desktop, err := c.grpcClient.GetDynamicWindowsDesktop(ctx, &dynamicwindows.GetDynamicWindowsDesktopRequest{ + Name: name, + }) + return desktop, trace.Wrap(err) +} + +func (c *Client) ListDynamicWindowsDesktop(ctx context.Context, pageSize int, pageToken string) ([]types.DynamicWindowsDesktop, string, error) { + resp, err := c.grpcClient.ListDynamicWindowsDesktops(ctx, &dynamicwindows.ListDynamicWindowsDesktopsRequest{ + PageSize: int32(pageSize), + PageToken: pageToken, + }) + if err != nil { + return nil, "", trace.Wrap(err) + } + desktops := make([]types.DynamicWindowsDesktop, 0, len(resp.GetDesktops())) + for _, desktop := range resp.GetDesktops() { + desktops = append(desktops, desktop) + } + return desktops, resp.GetNextPageToken(), nil +} + +func (c *Client) CreateDynamicWindowsDesktop(ctx context.Context, desktop types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) { + switch desktop := desktop.(type) { + case *types.DynamicWindowsDesktopV1: + desktop, err := c.grpcClient.CreateDynamicWindowsDesktop(ctx, &dynamicwindows.CreateDynamicWindowsDesktopRequest{ + Desktop: desktop, + }) + return desktop, trace.Wrap(err) + default: + return nil, trace.BadParameter("unknown desktop type: %T", desktop) + } +} + +func (c *Client) UpdateDynamicWindowsDesktop(ctx context.Context, desktop types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) { + switch desktop := desktop.(type) { + case *types.DynamicWindowsDesktopV1: + desktop, err := c.grpcClient.UpdateDynamicWindowsDesktop(ctx, &dynamicwindows.UpdateDynamicWindowsDesktopRequest{ + Desktop: desktop, + }) + return desktop, trace.Wrap(err) + default: + return nil, trace.BadParameter("unknown desktop type: %T", desktop) + } +} + +func (c *Client) DeleteDynamicWindowsDesktop(ctx context.Context, name string) error { + _, err := c.grpcClient.DeleteDynamicWindowsDesktop(ctx, &dynamicwindows.DeleteDynamicWindowsDesktopRequest{ + Name: name, + }) + return trace.Wrap(err) +} diff --git a/api/types/constants.go b/api/types/constants.go index 36e2571891067..87c0335586bf6 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -423,6 +423,9 @@ const ( // KindWindowsDesktop is a Windows desktop host. KindWindowsDesktop = "windows_desktop" + // KindDynamicWindowsDesktop is a dynamic Windows desktop host. + KindDynamicWindowsDesktop = "dynamic_windows_desktop" + // KindRecoveryCodes is a resource that holds users recovery codes. KindRecoveryCodes = "recovery_codes" diff --git a/api/types/derived.gen.go b/api/types/derived.gen.go index 6f2cd5467ee9d..0f96c2afaa430 100644 --- a/api/types/derived.gen.go +++ b/api/types/derived.gen.go @@ -77,12 +77,20 @@ func deriveTeleportEqualDatabaseV3(this, that *DatabaseV3) bool { deriveTeleportEqual_11(&this.Spec, &that.Spec) } +// deriveTeleportEqualDynamicWindowsDesktopV1 returns whether this and that are equal. +func deriveTeleportEqualDynamicWindowsDesktopV1(this, that *DynamicWindowsDesktopV1) bool { + return (this == nil && that == nil) || + this != nil && that != nil && + deriveTeleportEqualResourceHeader(&this.ResourceHeader, &that.ResourceHeader) && + deriveTeleportEqual_12(&this.Spec, &that.Spec) +} + // deriveTeleportEqualWindowsDesktopV3 returns whether this and that are equal. func deriveTeleportEqualWindowsDesktopV3(this, that *WindowsDesktopV3) bool { return (this == nil && that == nil) || this != nil && that != nil && deriveTeleportEqualResourceHeader(&this.ResourceHeader, &that.ResourceHeader) && - deriveTeleportEqual_12(&this.Spec, &that.Spec) + deriveTeleportEqual_13(&this.Spec, &that.Spec) } // deriveTeleportEqualKubeAzure returns whether this and that are equal. @@ -121,7 +129,7 @@ func deriveTeleportEqualKubernetesClusterV3(this, that *KubernetesClusterV3) boo this.SubKind == that.SubKind && this.Version == that.Version && deriveTeleportEqualMetadata(&this.Metadata, &that.Metadata) && - deriveTeleportEqual_13(&this.Spec, &that.Spec) + deriveTeleportEqual_14(&this.Spec, &that.Spec) } // deriveTeleportEqualKubernetesServerV3 returns whether this and that are equal. @@ -132,7 +140,7 @@ func deriveTeleportEqualKubernetesServerV3(this, that *KubernetesServerV3) bool this.SubKind == that.SubKind && this.Version == that.Version && deriveTeleportEqualMetadata(&this.Metadata, &that.Metadata) && - deriveTeleportEqual_14(&this.Spec, &that.Spec) + deriveTeleportEqual_15(&this.Spec, &that.Spec) } // deriveTeleportEqualOktaAssignmentV1 returns whether this and that are equal. @@ -140,7 +148,7 @@ func deriveTeleportEqualOktaAssignmentV1(this, that *OktaAssignmentV1) bool { return (this == nil && that == nil) || this != nil && that != nil && deriveTeleportEqualResourceHeader(&this.ResourceHeader, &that.ResourceHeader) && - deriveTeleportEqual_15(&this.Spec, &that.Spec) + deriveTeleportEqual_16(&this.Spec, &that.Spec) } // deriveTeleportEqualResourceHeader returns whether this and that are equal. @@ -169,7 +177,7 @@ func deriveTeleportEqualUserGroupV1(this, that *UserGroupV1) bool { return (this == nil && that == nil) || this != nil && that != nil && deriveTeleportEqualResourceHeader(&this.ResourceHeader, &that.ResourceHeader) && - deriveTeleportEqual_16(&this.Spec, &that.Spec) + deriveTeleportEqual_17(&this.Spec, &that.Spec) } // deriveTeleportEqual returns whether this and that are equal. @@ -178,15 +186,15 @@ func deriveTeleportEqual(this, that *AppSpecV3) bool { this != nil && that != nil && this.URI == that.URI && this.PublicAddr == that.PublicAddr && - deriveTeleportEqual_17(this.DynamicLabels, that.DynamicLabels) && + deriveTeleportEqual_18(this.DynamicLabels, that.DynamicLabels) && this.InsecureSkipVerify == that.InsecureSkipVerify && - deriveTeleportEqual_18(this.Rewrite, that.Rewrite) && - deriveTeleportEqual_19(this.AWS, that.AWS) && + deriveTeleportEqual_19(this.Rewrite, that.Rewrite) && + deriveTeleportEqual_20(this.AWS, that.AWS) && this.Cloud == that.Cloud && - deriveTeleportEqual_20(this.UserGroups, that.UserGroups) && + deriveTeleportEqual_21(this.UserGroups, that.UserGroups) && this.Integration == that.Integration && - deriveTeleportEqual_20(this.RequiredAppNames, that.RequiredAppNames) && - deriveTeleportEqual_21(this.CORS, that.CORS) + deriveTeleportEqual_21(this.RequiredAppNames, that.RequiredAppNames) && + deriveTeleportEqual_22(this.CORS, that.CORS) } // deriveTeleportEqual_ returns whether this and that are equal. @@ -204,9 +212,9 @@ func deriveTeleportEqual_1(this, that *RDS) bool { this.ClusterID == that.ClusterID && this.ResourceID == that.ResourceID && this.IAMAuth == that.IAMAuth && - deriveTeleportEqual_20(this.Subnets, that.Subnets) && + deriveTeleportEqual_21(this.Subnets, that.Subnets) && this.VPCID == that.VPCID && - deriveTeleportEqual_20(this.SecurityGroups, that.SecurityGroups) + deriveTeleportEqual_21(this.SecurityGroups, that.SecurityGroups) } // deriveTeleportEqual_2 returns whether this and that are equal. @@ -214,7 +222,7 @@ func deriveTeleportEqual_2(this, that *ElastiCache) bool { return (this == nil && that == nil) || this != nil && that != nil && this.ReplicationGroupID == that.ReplicationGroupID && - deriveTeleportEqual_20(this.UserGroupIDs, that.UserGroupIDs) && + deriveTeleportEqual_21(this.UserGroupIDs, that.UserGroupIDs) && this.TransitEncryptionEnabled == that.TransitEncryptionEnabled && this.EndpointType == that.EndpointType } @@ -307,73 +315,83 @@ func deriveTeleportEqual_11(this, that *DatabaseSpecV3) bool { this.Protocol == that.Protocol && this.URI == that.URI && this.CACert == that.CACert && - deriveTeleportEqual_17(this.DynamicLabels, that.DynamicLabels) && + deriveTeleportEqual_18(this.DynamicLabels, that.DynamicLabels) && deriveTeleportEqualAWS(&this.AWS, &that.AWS) && deriveTeleportEqualGCPCloudSQL(&this.GCP, &that.GCP) && deriveTeleportEqualAzure(&this.Azure, &that.Azure) && - deriveTeleportEqual_22(&this.TLS, &that.TLS) && - deriveTeleportEqual_23(&this.AD, &that.AD) && - deriveTeleportEqual_24(&this.MySQL, &that.MySQL) && - deriveTeleportEqual_25(this.AdminUser, that.AdminUser) && - deriveTeleportEqual_26(&this.MongoAtlas, &that.MongoAtlas) && - deriveTeleportEqual_27(&this.Oracle, &that.Oracle) + deriveTeleportEqual_23(&this.TLS, &that.TLS) && + deriveTeleportEqual_24(&this.AD, &that.AD) && + deriveTeleportEqual_25(&this.MySQL, &that.MySQL) && + deriveTeleportEqual_26(this.AdminUser, that.AdminUser) && + deriveTeleportEqual_27(&this.MongoAtlas, &that.MongoAtlas) && + deriveTeleportEqual_28(&this.Oracle, &that.Oracle) } // deriveTeleportEqual_12 returns whether this and that are equal. -func deriveTeleportEqual_12(this, that *WindowsDesktopSpecV3) bool { +func deriveTeleportEqual_12(this, that *DynamicWindowsDesktopSpecV1) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Addr == that.Addr && this.Domain == that.Domain && - this.HostID == that.HostID && this.NonAD == that.NonAD && - deriveTeleportEqual_28(this.ScreenSize, that.ScreenSize) + deriveTeleportEqual_29(this.ScreenSize, that.ScreenSize) } // deriveTeleportEqual_13 returns whether this and that are equal. -func deriveTeleportEqual_13(this, that *KubernetesClusterSpecV3) bool { +func deriveTeleportEqual_13(this, that *WindowsDesktopSpecV3) bool { return (this == nil && that == nil) || this != nil && that != nil && - deriveTeleportEqual_17(this.DynamicLabels, that.DynamicLabels) && + this.Addr == that.Addr && + this.Domain == that.Domain && + this.HostID == that.HostID && + this.NonAD == that.NonAD && + deriveTeleportEqual_29(this.ScreenSize, that.ScreenSize) +} + +// deriveTeleportEqual_14 returns whether this and that are equal. +func deriveTeleportEqual_14(this, that *KubernetesClusterSpecV3) bool { + return (this == nil && that == nil) || + this != nil && that != nil && + deriveTeleportEqual_18(this.DynamicLabels, that.DynamicLabels) && bytes.Equal(this.Kubeconfig, that.Kubeconfig) && deriveTeleportEqualKubeAzure(&this.Azure, &that.Azure) && deriveTeleportEqualKubeAWS(&this.AWS, &that.AWS) && deriveTeleportEqualKubeGCP(&this.GCP, &that.GCP) } -// deriveTeleportEqual_14 returns whether this and that are equal. -func deriveTeleportEqual_14(this, that *KubernetesServerSpecV3) bool { +// deriveTeleportEqual_15 returns whether this and that are equal. +func deriveTeleportEqual_15(this, that *KubernetesServerSpecV3) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Version == that.Version && this.Hostname == that.Hostname && this.HostID == that.HostID && - deriveTeleportEqual_29(&this.Rotation, &that.Rotation) && + deriveTeleportEqual_30(&this.Rotation, &that.Rotation) && deriveTeleportEqualKubernetesClusterV3(this.Cluster, that.Cluster) && - deriveTeleportEqual_20(this.ProxyIDs, that.ProxyIDs) + deriveTeleportEqual_21(this.ProxyIDs, that.ProxyIDs) } -// deriveTeleportEqual_15 returns whether this and that are equal. -func deriveTeleportEqual_15(this, that *OktaAssignmentSpecV1) bool { +// deriveTeleportEqual_16 returns whether this and that are equal. +func deriveTeleportEqual_16(this, that *OktaAssignmentSpecV1) bool { return (this == nil && that == nil) || this != nil && that != nil && this.User == that.User && - deriveTeleportEqual_30(this.Targets, that.Targets) && + deriveTeleportEqual_31(this.Targets, that.Targets) && this.CleanupTime.Equal(that.CleanupTime) && this.Status == that.Status && this.LastTransition.Equal(that.LastTransition) && this.Finalized == that.Finalized } -// deriveTeleportEqual_16 returns whether this and that are equal. -func deriveTeleportEqual_16(this, that *UserGroupSpecV1) bool { +// deriveTeleportEqual_17 returns whether this and that are equal. +func deriveTeleportEqual_17(this, that *UserGroupSpecV1) bool { return (this == nil && that == nil) || this != nil && that != nil && - deriveTeleportEqual_20(this.Applications, that.Applications) + deriveTeleportEqual_21(this.Applications, that.Applications) } -// deriveTeleportEqual_17 returns whether this and that are equal. -func deriveTeleportEqual_17(this, that map[string]CommandLabelV2) bool { +// deriveTeleportEqual_18 returns whether this and that are equal. +func deriveTeleportEqual_18(this, that map[string]CommandLabelV2) bool { if this == nil || that == nil { return this == nil && that == nil } @@ -385,31 +403,31 @@ func deriveTeleportEqual_17(this, that map[string]CommandLabelV2) bool { if !ok { return false } - if !(deriveTeleportEqual_31(&v, &thatv)) { + if !(deriveTeleportEqual_32(&v, &thatv)) { return false } } return true } -// deriveTeleportEqual_18 returns whether this and that are equal. -func deriveTeleportEqual_18(this, that *Rewrite) bool { +// deriveTeleportEqual_19 returns whether this and that are equal. +func deriveTeleportEqual_19(this, that *Rewrite) bool { return (this == nil && that == nil) || this != nil && that != nil && - deriveTeleportEqual_20(this.Redirect, that.Redirect) && - deriveTeleportEqual_32(this.Headers, that.Headers) && + deriveTeleportEqual_21(this.Redirect, that.Redirect) && + deriveTeleportEqual_33(this.Headers, that.Headers) && this.JWTClaims == that.JWTClaims } -// deriveTeleportEqual_19 returns whether this and that are equal. -func deriveTeleportEqual_19(this, that *AppAWS) bool { +// deriveTeleportEqual_20 returns whether this and that are equal. +func deriveTeleportEqual_20(this, that *AppAWS) bool { return (this == nil && that == nil) || this != nil && that != nil && this.ExternalID == that.ExternalID } -// deriveTeleportEqual_20 returns whether this and that are equal. -func deriveTeleportEqual_20(this, that []string) bool { +// deriveTeleportEqual_21 returns whether this and that are equal. +func deriveTeleportEqual_21(this, that []string) bool { if this == nil || that == nil { return this == nil && that == nil } @@ -424,20 +442,20 @@ func deriveTeleportEqual_20(this, that []string) bool { return true } -// deriveTeleportEqual_21 returns whether this and that are equal. -func deriveTeleportEqual_21(this, that *CORSPolicy) bool { +// deriveTeleportEqual_22 returns whether this and that are equal. +func deriveTeleportEqual_22(this, that *CORSPolicy) bool { return (this == nil && that == nil) || this != nil && that != nil && - deriveTeleportEqual_20(this.AllowedOrigins, that.AllowedOrigins) && - deriveTeleportEqual_20(this.AllowedMethods, that.AllowedMethods) && - deriveTeleportEqual_20(this.AllowedHeaders, that.AllowedHeaders) && + deriveTeleportEqual_21(this.AllowedOrigins, that.AllowedOrigins) && + deriveTeleportEqual_21(this.AllowedMethods, that.AllowedMethods) && + deriveTeleportEqual_21(this.AllowedHeaders, that.AllowedHeaders) && this.AllowCredentials == that.AllowCredentials && this.MaxAge == that.MaxAge && - deriveTeleportEqual_20(this.ExposedHeaders, that.ExposedHeaders) + deriveTeleportEqual_21(this.ExposedHeaders, that.ExposedHeaders) } -// deriveTeleportEqual_22 returns whether this and that are equal. -func deriveTeleportEqual_22(this, that *DatabaseTLS) bool { +// deriveTeleportEqual_23 returns whether this and that are equal. +func deriveTeleportEqual_23(this, that *DatabaseTLS) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Mode == that.Mode && @@ -446,8 +464,8 @@ func deriveTeleportEqual_22(this, that *DatabaseTLS) bool { this.TrustSystemCertPool == that.TrustSystemCertPool } -// deriveTeleportEqual_23 returns whether this and that are equal. -func deriveTeleportEqual_23(this, that *AD) bool { +// deriveTeleportEqual_24 returns whether this and that are equal. +func deriveTeleportEqual_24(this, that *AD) bool { return (this == nil && that == nil) || this != nil && that != nil && this.KeytabFile == that.KeytabFile && @@ -458,45 +476,45 @@ func deriveTeleportEqual_23(this, that *AD) bool { this.KDCHostName == that.KDCHostName } -// deriveTeleportEqual_24 returns whether this and that are equal. -func deriveTeleportEqual_24(this, that *MySQLOptions) bool { +// deriveTeleportEqual_25 returns whether this and that are equal. +func deriveTeleportEqual_25(this, that *MySQLOptions) bool { return (this == nil && that == nil) || this != nil && that != nil && this.ServerVersion == that.ServerVersion } -// deriveTeleportEqual_25 returns whether this and that are equal. -func deriveTeleportEqual_25(this, that *DatabaseAdminUser) bool { +// deriveTeleportEqual_26 returns whether this and that are equal. +func deriveTeleportEqual_26(this, that *DatabaseAdminUser) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Name == that.Name && this.DefaultDatabase == that.DefaultDatabase } -// deriveTeleportEqual_26 returns whether this and that are equal. -func deriveTeleportEqual_26(this, that *MongoAtlas) bool { +// deriveTeleportEqual_27 returns whether this and that are equal. +func deriveTeleportEqual_27(this, that *MongoAtlas) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Name == that.Name } -// deriveTeleportEqual_27 returns whether this and that are equal. -func deriveTeleportEqual_27(this, that *OracleOptions) bool { +// deriveTeleportEqual_28 returns whether this and that are equal. +func deriveTeleportEqual_28(this, that *OracleOptions) bool { return (this == nil && that == nil) || this != nil && that != nil && this.AuditUser == that.AuditUser } -// deriveTeleportEqual_28 returns whether this and that are equal. -func deriveTeleportEqual_28(this, that *Resolution) bool { +// deriveTeleportEqual_29 returns whether this and that are equal. +func deriveTeleportEqual_29(this, that *Resolution) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Width == that.Width && this.Height == that.Height } -// deriveTeleportEqual_29 returns whether this and that are equal. -func deriveTeleportEqual_29(this, that *Rotation) bool { +// deriveTeleportEqual_30 returns whether this and that are equal. +func deriveTeleportEqual_30(this, that *Rotation) bool { return (this == nil && that == nil) || this != nil && that != nil && this.State == that.State && @@ -506,11 +524,11 @@ func deriveTeleportEqual_29(this, that *Rotation) bool { this.Started.Equal(that.Started) && this.GracePeriod == that.GracePeriod && this.LastRotated.Equal(that.LastRotated) && - deriveTeleportEqual_33(&this.Schedule, &that.Schedule) + deriveTeleportEqual_34(&this.Schedule, &that.Schedule) } -// deriveTeleportEqual_30 returns whether this and that are equal. -func deriveTeleportEqual_30(this, that []*OktaAssignmentTargetV1) bool { +// deriveTeleportEqual_31 returns whether this and that are equal. +func deriveTeleportEqual_31(this, that []*OktaAssignmentTargetV1) bool { if this == nil || that == nil { return this == nil && that == nil } @@ -518,24 +536,24 @@ func deriveTeleportEqual_30(this, that []*OktaAssignmentTargetV1) bool { return false } for i := 0; i < len(this); i++ { - if !(deriveTeleportEqual_34(this[i], that[i])) { + if !(deriveTeleportEqual_35(this[i], that[i])) { return false } } return true } -// deriveTeleportEqual_31 returns whether this and that are equal. -func deriveTeleportEqual_31(this, that *CommandLabelV2) bool { +// deriveTeleportEqual_32 returns whether this and that are equal. +func deriveTeleportEqual_32(this, that *CommandLabelV2) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Period == that.Period && - deriveTeleportEqual_20(this.Command, that.Command) && + deriveTeleportEqual_21(this.Command, that.Command) && this.Result == that.Result } -// deriveTeleportEqual_32 returns whether this and that are equal. -func deriveTeleportEqual_32(this, that []*Header) bool { +// deriveTeleportEqual_33 returns whether this and that are equal. +func deriveTeleportEqual_33(this, that []*Header) bool { if this == nil || that == nil { return this == nil && that == nil } @@ -543,15 +561,15 @@ func deriveTeleportEqual_32(this, that []*Header) bool { return false } for i := 0; i < len(this); i++ { - if !(deriveTeleportEqual_35(this[i], that[i])) { + if !(deriveTeleportEqual_36(this[i], that[i])) { return false } } return true } -// deriveTeleportEqual_33 returns whether this and that are equal. -func deriveTeleportEqual_33(this, that *RotationSchedule) bool { +// deriveTeleportEqual_34 returns whether this and that are equal. +func deriveTeleportEqual_34(this, that *RotationSchedule) bool { return (this == nil && that == nil) || this != nil && that != nil && this.UpdateClients.Equal(that.UpdateClients) && @@ -559,16 +577,16 @@ func deriveTeleportEqual_33(this, that *RotationSchedule) bool { this.Standby.Equal(that.Standby) } -// deriveTeleportEqual_34 returns whether this and that are equal. -func deriveTeleportEqual_34(this, that *OktaAssignmentTargetV1) bool { +// deriveTeleportEqual_35 returns whether this and that are equal. +func deriveTeleportEqual_35(this, that *OktaAssignmentTargetV1) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Type == that.Type && this.Id == that.Id } -// deriveTeleportEqual_35 returns whether this and that are equal. -func deriveTeleportEqual_35(this, that *Header) bool { +// deriveTeleportEqual_36 returns whether this and that are equal. +func deriveTeleportEqual_36(this, that *Header) bool { return (this == nil && that == nil) || this != nil && that != nil && this.Name == that.Name && diff --git a/api/types/desktop.go b/api/types/desktop.go index 23a8140a4deda..a6455484e2daa 100644 --- a/api/types/desktop.go +++ b/api/types/desktop.go @@ -127,6 +127,174 @@ func (s *WindowsDesktopServiceV3) MatchSearch(values []string) bool { return MatchSearch(fieldVals, values, nil) } +// DynamicWindowsDesktop represents a Windows desktop host that is automatically discovered by Windows Desktop Service. +type DynamicWindowsDesktop interface { + // ResourceWithLabels provides common resource methods. + ResourceWithLabels + // GetAddr returns the network address of this host. + GetAddr() string + // GetDomain returns the ActiveDirectory domain of this host. + GetDomain() string + // NonAD checks whether this is a standalone host that + // is not joined to an Active Directory domain. + NonAD() bool + // GetScreenSize returns the desired size of the screen to use for sessions + // to this host. Returns (0, 0) if no screen size is set, which means to + // use the size passed by the client over TDP. + GetScreenSize() (width, height uint32) + // Copy returns a copy of this dynamic Windows desktop + Copy() *DynamicWindowsDesktopV1 +} + +var _ DynamicWindowsDesktop = &DynamicWindowsDesktopV1{} + +// NewDynamicWindowsDesktopV1 creates a new DynamicWindowsDesktopV1 resource. +func NewDynamicWindowsDesktopV1(name string, labels map[string]string, spec DynamicWindowsDesktopSpecV1) (*DynamicWindowsDesktopV1, error) { + d := &DynamicWindowsDesktopV1{ + ResourceHeader: ResourceHeader{ + Metadata: Metadata{ + Name: name, + Labels: labels, + }, + }, + Spec: spec, + } + if err := d.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + return d, nil +} + +func (d *DynamicWindowsDesktopV1) setStaticFields() { + d.Kind = KindDynamicWindowsDesktop + d.Version = V1 +} + +// CheckAndSetDefaults checks and sets default values for any missing fields. +func (d *DynamicWindowsDesktopV1) CheckAndSetDefaults() error { + if d.Spec.Addr == "" { + return trace.BadParameter("DynamicWindowsDesktopV1.Spec missing Addr field") + } + + if err := checkNameAndScreenSize(d.GetName(), d.Spec.ScreenSize); err != nil { + return trace.Wrap(err) + } + + d.setStaticFields() + if err := d.ResourceHeader.CheckAndSetDefaults(); err != nil { + return trace.Wrap(err) + } + + return nil +} + +func (d *DynamicWindowsDesktopV1) GetScreenSize() (width, height uint32) { + if d.Spec.ScreenSize == nil { + return 0, 0 + } + return d.Spec.ScreenSize.Width, d.Spec.ScreenSize.Height +} + +// NonAD checks whether host is part of Active Directory +func (d *DynamicWindowsDesktopV1) NonAD() bool { + return d.Spec.NonAD +} + +// GetAddr returns the network address of this host. +func (d *DynamicWindowsDesktopV1) GetAddr() string { + return d.Spec.Addr +} + +// GetDomain returns the Active Directory domain of this host. +func (d *DynamicWindowsDesktopV1) GetDomain() string { + return d.Spec.Domain +} + +// MatchSearch goes through select field values and tries to +// match against the list of search values. +func (d *DynamicWindowsDesktopV1) MatchSearch(values []string) bool { + fieldVals := append(utils.MapToStrings(d.GetAllLabels()), d.GetName(), d.GetAddr()) + return MatchSearch(fieldVals, values, nil) +} + +// Copy returns a deep copy of this dynamic Windows desktop object. +func (d *DynamicWindowsDesktopV1) Copy() *DynamicWindowsDesktopV1 { + return utils.CloneProtoMsg(d) +} + +// IsEqual determines if two dynamic Windows desktop resources are equivalent to one another. +func (d *DynamicWindowsDesktopV1) IsEqual(i DynamicWindowsDesktop) bool { + if other, ok := i.(*DynamicWindowsDesktopV1); ok { + return deriveTeleportEqualDynamicWindowsDesktopV1(d, other) + } + return false +} + +// DynamicWindowsDesktops represents a list of Windows desktops. +type DynamicWindowsDesktops []DynamicWindowsDesktop + +// Len returns the slice length. +func (s DynamicWindowsDesktops) Len() int { return len(s) } + +// Less compares desktops by name and host ID. +func (s DynamicWindowsDesktops) Less(i, j int) bool { + return s[i].GetName() < s[j].GetName() +} + +// Swap swaps two windows desktops. +func (s DynamicWindowsDesktops) Swap(i, j int) { s[i], s[j] = s[j], s[i] } + +// SortByCustom custom sorts by given sort criteria. +func (s DynamicWindowsDesktops) SortByCustom(sortBy SortBy) error { + if sortBy.Field == "" { + return nil + } + + isDesc := sortBy.IsDesc + switch sortBy.Field { + case ResourceMetadataName: + sort.SliceStable(s, func(i, j int) bool { + return stringCompare(s[i].GetName(), s[j].GetName(), isDesc) + }) + case ResourceSpecAddr: + sort.SliceStable(s, func(i, j int) bool { + return stringCompare(s[i].GetAddr(), s[j].GetAddr(), isDesc) + }) + default: + return trace.NotImplemented("sorting by field %q for resource %q is not supported", sortBy.Field, KindDynamicWindowsDesktop) + } + + return nil +} + +// AsResources returns dynamic windows desktops as type resources with labels. +func (s DynamicWindowsDesktops) AsResources() []ResourceWithLabels { + resources := make([]ResourceWithLabels, 0, len(s)) + for _, server := range s { + resources = append(resources, ResourceWithLabels(server)) + } + return resources +} + +// GetFieldVals returns list of select field values. +func (s DynamicWindowsDesktops) GetFieldVals(field string) ([]string, error) { + vals := make([]string, 0, len(s)) + switch field { + case ResourceMetadataName: + for _, server := range s { + vals = append(vals, server.GetName()) + } + case ResourceSpecAddr: + for _, server := range s { + vals = append(vals, server.GetAddr()) + } + default: + return nil, trace.NotImplemented("getting field %q for resource %q is not supported", field, KindDynamicWindowsDesktop) + } + + return vals, nil +} + // WindowsDesktop represents a Windows desktop host. type WindowsDesktop interface { // ResourceWithLabels provides common resource methods. @@ -180,11 +348,8 @@ func (d *WindowsDesktopV3) CheckAndSetDefaults() error { return trace.BadParameter("WindowsDesktopV3.Spec missing Addr field") } - // We use SNI to identify the desktop to route a connection to, - // and '.' will add an extra subdomain, preventing Teleport from - // correctly establishing TLS connections. - if name := d.GetName(); strings.Contains(name, ".") { - return trace.BadParameter("invalid name %q: desktop names cannot contain periods", name) + if err := checkNameAndScreenSize(d.GetName(), d.Spec.ScreenSize); err != nil { + return trace.Wrap(err) } d.setStaticFields() @@ -192,13 +357,6 @@ func (d *WindowsDesktopV3) CheckAndSetDefaults() error { return trace.Wrap(err) } - if d.Spec.ScreenSize != nil { - if d.Spec.ScreenSize.Width > MaxRDPScreenWidth || d.Spec.ScreenSize.Height > MaxRDPScreenHeight { - return trace.BadParameter("invalid screen size %dx%d (maximum %dx%d)", - d.Spec.ScreenSize.Width, d.Spec.ScreenSize.Height, MaxRDPScreenWidth, MaxRDPScreenHeight) - } - } - return nil } @@ -351,6 +509,12 @@ type ListWindowsDesktopsRequest struct { SearchKeywords []string } +// ListDynamicWindowsDesktopsResponse is a response type to ListDynamicWindowsDesktops. +type ListDynamicWindowsDesktopsResponse struct { + Desktops []DynamicWindowsDesktop + NextKey string +} + // ListWindowsDesktopServicesResponse is a response type to ListWindowsDesktopServices. type ListWindowsDesktopServicesResponse struct { DesktopServices []WindowsDesktopService @@ -364,3 +528,18 @@ type ListWindowsDesktopServicesRequest struct { Labels map[string]string SearchKeywords []string } + +func checkNameAndScreenSize(name string, screenSize *Resolution) error { + // We use SNI to identify the desktop to route a connection to, + // and '.' will add an extra subdomain, preventing Teleport from + // correctly establishing TLS connections. + if strings.Contains(name, ".") { + return trace.BadParameter("invalid name %q: desktop names cannot contain periods", name) + } + + if screenSize != nil && (screenSize.Width > MaxRDPScreenWidth || screenSize.Height > MaxRDPScreenHeight) { + return trace.BadParameter("screen size %dx%d too big (maximum %dx%d)", + screenSize.Width, screenSize.Height, MaxRDPScreenWidth, MaxRDPScreenHeight) + } + return nil +} diff --git a/api/types/role.go b/api/types/role.go index a36d7242cd86f..25902d8e5c08d 100644 --- a/api/types/role.go +++ b/api/types/role.go @@ -1855,6 +1855,8 @@ func (r *RoleV6) GetLabelMatchers(rct RoleConditionType, kind string) (LabelMatc return LabelMatchers{cond.DatabaseServiceLabels, cond.DatabaseServiceLabelsExpression}, nil case KindWindowsDesktop: return LabelMatchers{cond.WindowsDesktopLabels, cond.WindowsDesktopLabelsExpression}, nil + case KindDynamicWindowsDesktop: + return LabelMatchers{cond.WindowsDesktopLabels, cond.WindowsDesktopLabelsExpression}, nil case KindWindowsDesktopService: return LabelMatchers{cond.WindowsDesktopLabels, cond.WindowsDesktopLabelsExpression}, nil case KindUserGroup: diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 937c89e765a6d..85881e3c026d7 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -247,6 +247,12 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { if cfg.WindowsDesktops == nil { cfg.WindowsDesktops = local.NewWindowsDesktopService(cfg.Backend) } + if cfg.DynamicWindowsDesktops == nil { + cfg.DynamicWindowsDesktops, err = local.NewDynamicWindowsDesktopService(cfg.Backend) + if err != nil { + return nil, trace.Wrap(err) + } + } if cfg.SAMLIdPServiceProviders == nil { cfg.SAMLIdPServiceProviders, err = local.NewSAMLIdPServiceProviderService(cfg.Backend) if err != nil { @@ -450,6 +456,7 @@ func NewServer(cfg *InitConfig, opts ...ServerOption) (*Server, error) { AuditLogSessionStreamer: cfg.AuditLog, Events: cfg.Events, WindowsDesktops: cfg.WindowsDesktops, + DynamicWindowsDesktops: cfg.DynamicWindowsDesktops, SAMLIdPServiceProviders: cfg.SAMLIdPServiceProviders, UserGroups: cfg.UserGroups, SessionTrackerService: cfg.SessionTrackerService, @@ -651,6 +658,7 @@ type Services struct { services.Databases services.DatabaseServices services.WindowsDesktops + services.DynamicWindowsDesktops services.SAMLIdPServiceProviders services.UserGroups services.SessionTrackerService diff --git a/lib/auth/dynamicwindows/dynamicwindowsv1/service.go b/lib/auth/dynamicwindows/dynamicwindowsv1/service.go new file mode 100644 index 0000000000000..98bc2f81e6b55 --- /dev/null +++ b/lib/auth/dynamicwindows/dynamicwindowsv1/service.go @@ -0,0 +1,215 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package dynamicwindowsv1 + +import ( + "context" + "log/slog" + + "github.com/gravitational/trace" + "google.golang.org/protobuf/types/known/emptypb" + + "github.com/gravitational/teleport" + dynamicwindowspb "github.com/gravitational/teleport/api/gen/proto/go/teleport/dynamicwindows/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" +) + +// Service implements the teleport.trust.v1.TrustService RPC service. +type Service struct { + dynamicwindowspb.UnimplementedDynamicWindowsServiceServer + + authorizer authz.Authorizer + backend Backend + cache Cache + logger *slog.Logger +} + +// ServiceConfig holds configuration options for Service +type ServiceConfig struct { + // Authorizer is the authorizer service which checks access to resources. + Authorizer authz.Authorizer + // Backend will be used for writing the dynamic Windows desktop resources. + Backend Backend + // Cache will be used for reading and writing the dynamic Windows desktop resources. + Cache Cache + // Logger is the logger instance to use. + Logger *slog.Logger +} + +// Backend is the interface used for writing dynamic Windows desktops +type Backend interface { + CreateDynamicWindowsDesktop(context.Context, types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) + UpdateDynamicWindowsDesktop(context.Context, types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) + UpsertDynamicWindowsDesktop(context.Context, types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) + DeleteDynamicWindowsDesktop(ctx context.Context, name string) error +} + +// Cache is the interface used for reading dynamic Windows desktops +type Cache interface { + GetDynamicWindowsDesktop(ctx context.Context, name string) (types.DynamicWindowsDesktop, error) + ListDynamicWindowsDesktops(ctx context.Context, pageSize int, pageToken string) ([]types.DynamicWindowsDesktop, string, error) +} + +// NewService creates new dynamic Windows desktop service +func NewService(cfg ServiceConfig) (*Service, error) { + switch { + case cfg.Backend == nil: + return nil, trace.BadParameter("backend service is required") + case cfg.Cache == nil: + return nil, trace.BadParameter("cache service is required") + case cfg.Authorizer == nil: + return nil, trace.BadParameter("authorizer is required") + } + + if cfg.Logger == nil { + cfg.Logger = slog.With(teleport.ComponentKey, "dynamicwindows") + } + + return &Service{ + authorizer: cfg.Authorizer, + backend: cfg.Backend, + cache: cfg.Cache, + logger: cfg.Logger, + }, nil +} + +// GetDynamicWindowsDesktop returns registered dynamic Windows desktop by name. +func (s *Service) GetDynamicWindowsDesktop(ctx context.Context, request *dynamicwindowspb.GetDynamicWindowsDesktopRequest) (*types.DynamicWindowsDesktopV1, error) { + auth, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := auth.CheckAccessToKind(types.KindDynamicWindowsDesktop, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + + if request.GetName() == "" { + return nil, trace.BadParameter("dynamic windows desktop name is required") + } + + d, err := s.cache.GetDynamicWindowsDesktop(ctx, request.GetName()) + if err != nil { + return nil, trace.Wrap(err) + } + + desktop, ok := d.(*types.DynamicWindowsDesktopV1) + if !ok { + return nil, trace.BadParameter("unexpected type %T", d) + } + + return desktop, nil +} + +// ListDynamicWindowsDesktops returns list of dynamic Windows desktops. +func (s *Service) ListDynamicWindowsDesktops(ctx context.Context, request *dynamicwindowspb.ListDynamicWindowsDesktopsRequest) (*dynamicwindowspb.ListDynamicWindowsDesktopsResponse, error) { + auth, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := auth.CheckAccessToKind(types.KindDynamicWindowsDesktop, types.VerbRead, types.VerbList); err != nil { + return nil, trace.Wrap(err) + } + + desktops, next, err := s.cache.ListDynamicWindowsDesktops(ctx, int(request.PageSize), request.PageToken) + if err != nil { + return nil, trace.Wrap(err) + } + + response := &dynamicwindowspb.ListDynamicWindowsDesktopsResponse{ + NextPageToken: next, + } + for _, d := range desktops { + desktop, ok := d.(*types.DynamicWindowsDesktopV1) + if !ok { + return nil, trace.BadParameter("unexpected type %T", d) + } + response.Desktops = append(response.Desktops, desktop) + } + + return response, nil +} + +// CreateDynamicWindowsDesktop registers a new dynamic Windows desktop. +func (s *Service) CreateDynamicWindowsDesktop(ctx context.Context, req *dynamicwindowspb.CreateDynamicWindowsDesktopRequest) (*types.DynamicWindowsDesktopV1, error) { + auth, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := auth.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + if err := auth.CheckAccessToKind(types.KindDynamicWindowsDesktop, types.VerbCreate); err != nil { + return nil, trace.Wrap(err) + } + d, err := s.backend.CreateDynamicWindowsDesktop(ctx, types.DynamicWindowsDesktop(req.Desktop)) + if err != nil { + return nil, trace.Wrap(err) + } + + createdDesktop, ok := d.(*types.DynamicWindowsDesktopV1) + if !ok { + return nil, trace.BadParameter("unexpected type %T", d) + } + + return createdDesktop, nil +} + +// UpdateDynamicWindowsDesktop updates an existing dynamic Windows desktop. +func (s *Service) UpdateDynamicWindowsDesktop(ctx context.Context, req *dynamicwindowspb.UpdateDynamicWindowsDesktopRequest) (*types.DynamicWindowsDesktopV1, error) { + auth, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := auth.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + if err := auth.CheckAccessToKind(types.KindDynamicWindowsDesktop, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + d, err := s.backend.UpdateDynamicWindowsDesktop(ctx, req.Desktop) + if err != nil { + return nil, trace.Wrap(err) + } + + updatedDesktop, ok := d.(*types.DynamicWindowsDesktopV1) + if !ok { + return nil, trace.BadParameter("unexpected type %T", d) + } + + return updatedDesktop, nil +} + +// DeleteDynamicWindowsDesktop removes the specified dynamic Windows desktop. +func (s *Service) DeleteDynamicWindowsDesktop(ctx context.Context, req *dynamicwindowspb.DeleteDynamicWindowsDesktopRequest) (*emptypb.Empty, error) { + auth, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + if err := auth.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + if err := auth.CheckAccessToKind(types.KindDynamicWindowsDesktop, types.VerbDelete); err != nil { + return nil, trace.Wrap(err) + } + if err := s.backend.DeleteDynamicWindowsDesktop(ctx, req.GetName()); err != nil { + return nil, trace.Wrap(err) + } + return &emptypb.Empty{}, nil +} diff --git a/lib/auth/dynamicwindows/dynamicwindowsv1/service_test.go b/lib/auth/dynamicwindows/dynamicwindowsv1/service_test.go new file mode 100644 index 0000000000000..8fee09af10dfb --- /dev/null +++ b/lib/auth/dynamicwindows/dynamicwindowsv1/service_test.go @@ -0,0 +1,220 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package dynamicwindowsv1 + +import ( + "context" + "fmt" + "slices" + "testing" + + "github.com/gravitational/trace" + "github.com/stretchr/testify/require" + + dynamicwindowsv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/dynamicwindows/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/backend/memory" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/services/local" + "github.com/gravitational/teleport/lib/tlsca" + "github.com/gravitational/teleport/lib/utils" +) + +func TestServiceAccess(t *testing.T) { + t.Parallel() + + testCases := []struct { + name string + allowedVerbs []string + allowedStates []authz.AdminActionAuthState + }{ + { + name: "CreateDynamicWindowsDesktop", + allowedStates: []authz.AdminActionAuthState{authz.AdminActionAuthNotRequired, authz.AdminActionAuthMFAVerified}, + allowedVerbs: []string{types.VerbCreate}, + }, + { + name: "UpdateDynamicWindowsDesktop", + allowedStates: []authz.AdminActionAuthState{authz.AdminActionAuthNotRequired, authz.AdminActionAuthMFAVerified}, + allowedVerbs: []string{types.VerbUpdate}, + }, + { + name: "DeleteDynamicWindowsDesktop", + allowedStates: []authz.AdminActionAuthState{authz.AdminActionAuthNotRequired, authz.AdminActionAuthMFAVerified}, + allowedVerbs: []string{types.VerbDelete}, + }, + { + name: "ListDynamicWindowsDesktops", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthUnauthorized, authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbRead, types.VerbList}, + }, + { + name: "GetDynamicWindowsDesktop", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthUnauthorized, authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbRead}, + }, + } + + for _, tt := range testCases { + for _, state := range tt.allowedStates { + for _, verbs := range utils.Combinations(tt.allowedVerbs) { + t.Run(fmt.Sprintf("%v,allowed:%v,verbs:%v", tt.name, stateToString(state), verbs), func(t *testing.T) { + service := newService(t, state, fakeChecker{allowedVerbs: verbs}) + err := callMethod(service, tt.name) + // expect access denied except with full set of verbs. + if len(verbs) == len(tt.allowedVerbs) { + require.False(t, trace.IsAccessDenied(err)) + } else { + require.Error(t, err) + require.True(t, trace.IsAccessDenied(err), "expected access denied for verbs %v, got err=%v", verbs, err) + } + }) + } + } + + disallowedStates := otherAdminStates(tt.allowedStates) + for _, state := range disallowedStates { + t.Run(fmt.Sprintf("%v,disallowed:%v", tt.name, stateToString(state)), func(t *testing.T) { + // it is enough to test against tt.allowedVerbs, + // this is the only different data point compared to the test cases above. + service := newService(t, state, fakeChecker{allowedVerbs: tt.allowedVerbs}) + err := callMethod(service, tt.name) + require.True(t, trace.IsAccessDenied(err)) + }) + } + } + + // verify that all declared methods have matching test cases + for _, method := range dynamicwindowsv1.DynamicWindowsService_ServiceDesc.Methods { + t.Run(fmt.Sprintf("%v covered", method.MethodName), func(t *testing.T) { + match := false + for _, testCase := range testCases { + match = match || testCase.name == method.MethodName + } + require.True(t, match, "method %v without coverage, no matching tests", method.MethodName) + }) + } +} + +var allAdminStates = map[authz.AdminActionAuthState]string{ + authz.AdminActionAuthUnauthorized: "Unauthorized", + authz.AdminActionAuthNotRequired: "NotRequired", + authz.AdminActionAuthMFAVerified: "MFAVerified", + authz.AdminActionAuthMFAVerifiedWithReuse: "MFAVerifiedWithReuse", +} + +func stateToString(state authz.AdminActionAuthState) string { + str, ok := allAdminStates[state] + if !ok { + return fmt.Sprintf("unknown(%v)", state) + } + return str +} + +// otherAdminStates returns all admin states except for those passed in +func otherAdminStates(states []authz.AdminActionAuthState) []authz.AdminActionAuthState { + var out []authz.AdminActionAuthState + for state := range allAdminStates { + found := slices.Index(states, state) != -1 + if !found { + out = append(out, state) + } + } + return out +} + +// callMethod calls a method with given name in the DynamicWindowsDesktop service +func callMethod(service *Service, method string) error { + for _, desc := range dynamicwindowsv1.DynamicWindowsService_ServiceDesc.Methods { + if desc.MethodName == method { + _, err := desc.Handler(service, context.Background(), func(arg any) error { + switch arg := arg.(type) { + case *dynamicwindowsv1.CreateDynamicWindowsDesktopRequest: + arg.Desktop, _ = types.NewDynamicWindowsDesktopV1("test", nil, types.DynamicWindowsDesktopSpecV1{ + Addr: "test", + }) + case *dynamicwindowsv1.UpdateDynamicWindowsDesktopRequest: + arg.Desktop, _ = types.NewDynamicWindowsDesktopV1("test", nil, types.DynamicWindowsDesktopSpecV1{ + Addr: "test", + }) + } + return nil + }, nil) + return err + } + } + return fmt.Errorf("method %v not found", method) +} + +type fakeChecker struct { + allowedVerbs []string + services.AccessChecker +} + +func (f fakeChecker) CheckAccessToRule(_ services.RuleContext, _ string, resource string, verb string) error { + if resource == types.KindDynamicWindowsDesktop { + if slices.Contains(f.allowedVerbs, verb) { + return nil + } + } + + return trace.AccessDenied("access denied to rule=%v/verb=%v", resource, verb) +} + +func newService(t *testing.T, authState authz.AdminActionAuthState, checker services.AccessChecker) *Service { + t.Helper() + + b, err := memory.New(memory.Config{}) + require.NoError(t, err) + + backendService, err := local.NewDynamicWindowsDesktopService(b) + require.NoError(t, err) + + authorizer := authz.AuthorizerFunc(func(ctx context.Context) (*authz.Context, error) { + user, err := types.NewUser("probakowski") + if err != nil { + return nil, err + } + return &authz.Context{ + User: user, + Checker: checker, + AdminActionAuthState: authState, + Identity: authz.LocalUser{ + Identity: tlsca.Identity{ + Username: user.GetName(), + }, + }, + }, nil + }) + + service, err := NewService(ServiceConfig{ + Authorizer: authorizer, + Backend: backendService, + Cache: backendService, + }) + require.NoError(t, err) + return service +} diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index a9f25e84f559f..0b10422ff9652 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -57,6 +57,7 @@ import ( dbobjectv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobject/v1" dbobjectimportrulev1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/dbobjectimportrule/v1" discoveryconfigv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/discoveryconfig/v1" + dynamicwindowsv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/dynamicwindows/v1" integrationv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/integration/v1" kubewaitingcontainerv1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/kubewaitingcontainer/v1" loginrulev1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/loginrule/v1" @@ -85,6 +86,7 @@ import ( "github.com/gravitational/teleport/lib/auth/dbobject/dbobjectv1" "github.com/gravitational/teleport/lib/auth/dbobjectimportrule/dbobjectimportrulev1" "github.com/gravitational/teleport/lib/auth/discoveryconfig/discoveryconfigv1" + "github.com/gravitational/teleport/lib/auth/dynamicwindows/dynamicwindowsv1" "github.com/gravitational/teleport/lib/auth/integration/integrationv1" "github.com/gravitational/teleport/lib/auth/kubewaitingcontainer/kubewaitingcontainerv1" "github.com/gravitational/teleport/lib/auth/loginrule/loginrulev1" @@ -5141,6 +5143,17 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { collectortracepb.RegisterTraceServiceServer(server, authServer) auditlogpb.RegisterAuditLogServiceServer(server, authServer) + dynamicWindows, err := dynamicwindowsv1.NewService(dynamicwindowsv1.ServiceConfig{ + Authorizer: cfg.Authorizer, + Backend: cfg.AuthServer.Services, + // TODO(probakowski): switch to cache when support is added + Cache: cfg.AuthServer.Services, + }) + if err != nil { + return nil, trace.Wrap(err) + } + dynamicwindowsv1pb.RegisterDynamicWindowsServiceServer(server, dynamicWindows) + trust, err := trustv1.NewService(&trustv1.ServiceConfig{ Authorizer: cfg.Authorizer, Cache: cfg.AuthServer.Cache, diff --git a/lib/auth/init.go b/lib/auth/init.go index f56dac7af91db..d7c2309cd2b89 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -218,9 +218,12 @@ type InitConfig struct { // session related streams Streamer events.Streamer - // WindowsServices is a service that manages Windows desktop resources. + // WindowsDesktops is a service that manages Windows desktop resources. WindowsDesktops services.WindowsDesktops + // DynamicWindowsServices is a service that manages dynamic Windows desktop resources. + DynamicWindowsDesktops services.DynamicWindowsDesktops + // SAMLIdPServiceProviders is a service that manages SAML IdP service providers. SAMLIdPServiceProviders services.SAMLIdPServiceProviders diff --git a/lib/authz/permissions.go b/lib/authz/permissions.go index f8b5587018608..86375ca1bb5ba 100644 --- a/lib/authz/permissions.go +++ b/lib/authz/permissions.go @@ -1175,6 +1175,7 @@ func definitionForBuiltinRole(clusterName string, recConfig readonly.SessionReco types.NewRule(types.KindLock, services.RO()), types.NewRule(types.KindWindowsDesktopService, services.RW()), types.NewRule(types.KindWindowsDesktop, services.RW()), + types.NewRule(types.KindDynamicWindowsDesktop, services.RW()), }, }, }) diff --git a/lib/services/dynamic_desktop.go b/lib/services/dynamic_desktop.go new file mode 100644 index 0000000000000..5903e4a88b79f --- /dev/null +++ b/lib/services/dynamic_desktop.go @@ -0,0 +1,90 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package services + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/utils" +) + +// DynamicWindowsDesktops defines an interface for managing dynamic Windows desktops. +type DynamicWindowsDesktops interface { + GetDynamicWindowsDesktop(ctx context.Context, name string) (types.DynamicWindowsDesktop, error) + CreateDynamicWindowsDesktop(context.Context, types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) + UpdateDynamicWindowsDesktop(context.Context, types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) + UpsertDynamicWindowsDesktop(context.Context, types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) + DeleteDynamicWindowsDesktop(ctx context.Context, name string) error + ListDynamicWindowsDesktops(ctx context.Context, pageSize int, pageToken string) ([]types.DynamicWindowsDesktop, string, error) +} + +// MarshalDynamicWindowsDesktop marshals the DynamicWindowsDesktop resource to JSON. +func MarshalDynamicWindowsDesktop(s types.DynamicWindowsDesktop, opts ...MarshalOption) ([]byte, error) { + cfg, err := CollectOptions(opts) + if err != nil { + return nil, trace.Wrap(err) + } + + switch s := s.(type) { + case *types.DynamicWindowsDesktopV1: + if err := s.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + + return utils.FastMarshal(maybeResetProtoRevision(cfg.PreserveRevision, s)) + default: + return nil, trace.BadParameter("unrecognized windows desktop version %T", s) + } +} + +// UnmarshalDynamicWindowsDesktop unmarshals the DynamicWindowsDesktop resource from JSON. +func UnmarshalDynamicWindowsDesktop(data []byte, opts ...MarshalOption) (types.DynamicWindowsDesktop, error) { + if len(data) == 0 { + return nil, trace.BadParameter("missing windows desktop data") + } + cfg, err := CollectOptions(opts) + if err != nil { + return nil, trace.Wrap(err) + } + var h types.ResourceHeader + if err := utils.FastUnmarshal(data, &h); err != nil { + return nil, trace.Wrap(err) + } + switch h.Version { + case types.V1: + var s types.DynamicWindowsDesktopV1 + if err := utils.FastUnmarshal(data, &s); err != nil { + return nil, trace.BadParameter(err.Error()) + } + if err := s.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + if cfg.Revision != "" { + s.SetRevision(cfg.Revision) + } + if !cfg.Expires.IsZero() { + s.SetExpiry(cfg.Expires) + } + return &s, nil + } + return nil, trace.BadParameter("windows desktop resource version %q is not supported", h.Version) +} diff --git a/lib/services/local/dynamic_desktops.go b/lib/services/local/dynamic_desktops.go new file mode 100644 index 0000000000000..b4b482d600de7 --- /dev/null +++ b/lib/services/local/dynamic_desktops.go @@ -0,0 +1,119 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package local + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/backend" + "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/services/local/generic" +) + +// DynamicWindowsDesktopService manages dynamic Windows desktop resources in the backend. +type DynamicWindowsDesktopService struct { + service *generic.Service[types.DynamicWindowsDesktop] +} + +// NewDynamicWindowsDesktopService creates a new WindowsDesktopsService. +func NewDynamicWindowsDesktopService(b backend.Backend) (*DynamicWindowsDesktopService, error) { + service, err := generic.NewService(&generic.ServiceConfig[types.DynamicWindowsDesktop]{ + Backend: b, + ResourceKind: types.KindDynamicWindowsDesktop, + PageLimit: defaults.MaxIterationLimit, + BackendPrefix: backend.NewKey(dynamicWindowsDesktopsPrefix), + MarshalFunc: services.MarshalDynamicWindowsDesktop, + UnmarshalFunc: services.UnmarshalDynamicWindowsDesktop, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return &DynamicWindowsDesktopService{ + service: service, + }, nil +} + +// GetDynamicWindowsDesktop returns dynamic Windows desktops by name. +func (s *DynamicWindowsDesktopService) GetDynamicWindowsDesktop(ctx context.Context, name string) (types.DynamicWindowsDesktop, error) { + desktop, err := s.service.GetResource(ctx, name) + if err != nil { + return nil, trace.Wrap(err) + } + return desktop, err +} + +// CreateDynamicWindowsDesktop creates a dynamic Windows desktop resource. +func (s *DynamicWindowsDesktopService) CreateDynamicWindowsDesktop(ctx context.Context, desktop types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) { + d, err := s.service.CreateResource(ctx, desktop) + if err != nil { + return nil, trace.Wrap(err) + } + return d, err +} + +// UpdateDynamicWindowsDesktop updates a dynamic Windows desktop resource. +func (s *DynamicWindowsDesktopService) UpdateDynamicWindowsDesktop(ctx context.Context, desktop types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) { + d, err := s.service.UpdateResource(ctx, desktop) + if err != nil { + return nil, trace.Wrap(err) + } + return d, err +} + +// UpsertDynamicWindowsDesktop updates a dynamic Windows desktop resource, creating it if it doesn't exist. +func (s *DynamicWindowsDesktopService) UpsertDynamicWindowsDesktop(ctx context.Context, desktop types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) { + d, err := s.service.UpsertResource(ctx, desktop) + if err != nil { + return nil, trace.Wrap(err) + } + return d, err +} + +// DeleteDynamicWindowsDesktop removes the specified dynamic Windows desktop resource. +func (s *DynamicWindowsDesktopService) DeleteDynamicWindowsDesktop(ctx context.Context, name string) error { + if err := s.service.DeleteResource(ctx, name); err != nil { + return trace.Wrap(err) + } + return nil +} + +// DeleteAllDynamicWindowsDesktops removes all dynamic Windows desktop resources. +func (s *DynamicWindowsDesktopService) DeleteAllDynamicWindowsDesktops(ctx context.Context) error { + if err := s.service.DeleteAllResources(ctx); err != nil { + return trace.Wrap(err) + } + return nil +} + +// ListDynamicWindowsDesktops returns all dynamic Windows desktops matching filter. +func (s *DynamicWindowsDesktopService) ListDynamicWindowsDesktops(ctx context.Context, pageSize int, pageToken string) ([]types.DynamicWindowsDesktop, string, error) { + desktops, next, err := s.service.ListResources(ctx, pageSize, pageToken) + if err != nil { + return nil, "", trace.Wrap(err) + } + return desktops, next, nil +} + +const ( + dynamicWindowsDesktopsPrefix = "dynamicWindowsDesktop" +) diff --git a/lib/services/local/dynamic_desktops_test.go b/lib/services/local/dynamic_desktops_test.go new file mode 100644 index 0000000000000..75ed040080648 --- /dev/null +++ b/lib/services/local/dynamic_desktops_test.go @@ -0,0 +1,232 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package local + +import ( + "context" + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/testing/protocmp" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/backend" + "github.com/gravitational/teleport/lib/backend/memory" +) + +func newDynamicDesktop(t *testing.T, name string) types.DynamicWindowsDesktop { + desktop, err := types.NewDynamicWindowsDesktopV1(name, nil, types.DynamicWindowsDesktopSpecV1{ + Addr: "xyz", + }) + require.NoError(t, err) + return desktop +} + +func setupDynamicDesktopTest(t *testing.T) (context.Context, *DynamicWindowsDesktopService) { + ctx := context.Background() + clock := clockwork.NewFakeClock() + mem, err := memory.New(memory.Config{ + Context: ctx, + Clock: clock, + }) + require.NoError(t, err) + service, err := NewDynamicWindowsDesktopService(backend.NewSanitizer(mem)) + require.NoError(t, err) + return ctx, service +} + +func TestDynamicWindowsService_CreateDynamicDesktop(t *testing.T) { + t.Parallel() + ctx, service := setupDynamicDesktopTest(t) + t.Run("ok", func(t *testing.T) { + want := newDynamicDesktop(t, "example") + got, err := service.CreateDynamicWindowsDesktop(ctx, want.Copy()) + want.SetRevision(got.GetRevision()) + require.NoError(t, err) + require.NotEmpty(t, got.GetRevision()) + require.Empty(t, cmp.Diff( + want, + got, + protocmp.Transform(), + )) + }) + t.Run("no upsert", func(t *testing.T) { + want := newDynamicDesktop(t, "upsert") + _, err := service.CreateDynamicWindowsDesktop(ctx, want.Copy()) + require.NoError(t, err) + _, err = service.CreateDynamicWindowsDesktop(ctx, want.Copy()) + require.Error(t, err) + require.True(t, trace.IsAlreadyExists(err)) + }) +} + +func TestDynamicWindowsService_UpsertDynamicDesktop(t *testing.T) { + ctx, service := setupDynamicDesktopTest(t) + want := newDynamicDesktop(t, "example") + got, err := service.UpsertDynamicWindowsDesktop(ctx, want.Copy()) + want.SetRevision(got.GetRevision()) + require.NoError(t, err) + require.NotEmpty(t, got.GetRevision()) + require.Empty(t, cmp.Diff( + want, + got, + protocmp.Transform(), + )) + _, err = service.UpsertDynamicWindowsDesktop(ctx, want.Copy()) + require.NoError(t, err) +} + +func TestDynamicWindowsService_GetDynamicDesktop(t *testing.T) { + t.Parallel() + ctx, service := setupDynamicDesktopTest(t) + t.Run("not found", func(t *testing.T) { + _, err := service.GetDynamicWindowsDesktop(ctx, "notfound") + require.Error(t, err) + require.True(t, trace.IsNotFound(err)) + }) + t.Run("ok", func(t *testing.T) { + want := newDynamicDesktop(t, "example") + created, err := service.CreateDynamicWindowsDesktop(ctx, want.Copy()) + require.NoError(t, err) + got, err := service.GetDynamicWindowsDesktop(ctx, "example") + require.NoError(t, err) + require.Empty(t, cmp.Diff( + created, + got, + protocmp.Transform(), + )) + }) +} + +func TestDynamicWindowsService_ListDynamicDesktop(t *testing.T) { + t.Parallel() + t.Run("none", func(t *testing.T) { + ctx, service := setupDynamicDesktopTest(t) + desktops, _, err := service.ListDynamicWindowsDesktops(ctx, 5, "") + require.NoError(t, err) + require.Empty(t, desktops) + }) + t.Run("list all", func(t *testing.T) { + ctx, service := setupDynamicDesktopTest(t) + d1, err := service.CreateDynamicWindowsDesktop(ctx, newDynamicDesktop(t, "d1")) + require.NoError(t, err) + d2, err := service.CreateDynamicWindowsDesktop(ctx, newDynamicDesktop(t, "d2")) + require.NoError(t, err) + desktops, next, err := service.ListDynamicWindowsDesktops(ctx, 5, "") + require.NoError(t, err) + require.Len(t, desktops, 2) + require.Empty(t, next) + require.Empty(t, cmp.Diff( + d1, + desktops[0], + protocmp.Transform(), + )) + require.Empty(t, cmp.Diff( + d2, + desktops[1], + protocmp.Transform(), + )) + }) + t.Run("list paged", func(t *testing.T) { + ctx, service := setupDynamicDesktopTest(t) + d1, err := service.CreateDynamicWindowsDesktop(ctx, newDynamicDesktop(t, "d1")) + require.NoError(t, err) + d2, err := service.CreateDynamicWindowsDesktop(ctx, newDynamicDesktop(t, "d2")) + require.NoError(t, err) + desktops, next, err := service.ListDynamicWindowsDesktops(ctx, 1, "") + require.NoError(t, err) + require.Len(t, desktops, 1) + require.NotEmpty(t, next) + require.Empty(t, cmp.Diff( + d1, + desktops[0], + protocmp.Transform(), + )) + desktops, next, err = service.ListDynamicWindowsDesktops(ctx, 1, next) + require.NoError(t, err) + require.Len(t, desktops, 1) + require.Empty(t, next) + require.Empty(t, cmp.Diff( + d2, + desktops[0], + protocmp.Transform(), + )) + }) +} + +func TestDynamicWindowsService_UpdateDynamicDesktop(t *testing.T) { + t.Parallel() + ctx, service := setupDynamicDesktopTest(t) + t.Run("not found", func(t *testing.T) { + want := newDynamicDesktop(t, "example") + _, err := service.UpdateDynamicWindowsDesktop(ctx, want.Copy()) + require.Error(t, err) + require.True(t, trace.IsNotFound(err)) + }) + t.Run("ok", func(t *testing.T) { + want := newDynamicDesktop(t, "example") + created, err := service.CreateDynamicWindowsDesktop(ctx, want.Copy()) + require.NoError(t, err) + updated, err := service.UpdateDynamicWindowsDesktop(ctx, created.Copy()) + require.NoError(t, err) + require.NotEqual(t, created.GetRevision(), updated.GetRevision()) + }) +} + +func TestDynamicWindowsService_DeleteDynamicDesktop(t *testing.T) { + t.Parallel() + ctx, service := setupDynamicDesktopTest(t) + t.Run("not found", func(t *testing.T) { + err := service.DeleteDynamicWindowsDesktop(ctx, "notfound") + require.Error(t, err) + require.True(t, trace.IsNotFound(err)) + }) + t.Run("ok", func(t *testing.T) { + _, err := service.CreateDynamicWindowsDesktop(ctx, newDynamicDesktop(t, "example")) + require.NoError(t, err) + _, err = service.GetDynamicWindowsDesktop(ctx, "example") + require.NoError(t, err) + err = service.DeleteDynamicWindowsDesktop(ctx, "example") + require.NoError(t, err) + _, err = service.GetDynamicWindowsDesktop(ctx, "example") + require.Error(t, err) + require.True(t, trace.IsNotFound(err)) + }) +} + +func TestDynamicWindowsService_DeleteAllDynamicDesktop(t *testing.T) { + ctx, service := setupDynamicDesktopTest(t) + err := service.DeleteAllDynamicWindowsDesktops(ctx) + require.NoError(t, err) + _, err = service.CreateDynamicWindowsDesktop(ctx, newDynamicDesktop(t, "d1")) + require.NoError(t, err) + _, err = service.CreateDynamicWindowsDesktop(ctx, newDynamicDesktop(t, "d2")) + require.NoError(t, err) + desktops, _, err := service.ListDynamicWindowsDesktops(ctx, 5, "") + require.NoError(t, err) + require.Len(t, desktops, 2) + err = service.DeleteAllDynamicWindowsDesktops(ctx) + require.NoError(t, err) + desktops, _, err = service.ListDynamicWindowsDesktops(ctx, 5, "") + require.NoError(t, err) + require.Empty(t, desktops) +} diff --git a/lib/services/resource.go b/lib/services/resource.go index c336f1b80f1d3..819ec724cdc81 100644 --- a/lib/services/resource.go +++ b/lib/services/resource.go @@ -189,6 +189,8 @@ func ParseShortcut(in string) (string, error) { return types.KindWindowsDesktopService, nil case types.KindWindowsDesktop, "win_desktop": return types.KindWindowsDesktop, nil + case types.KindDynamicWindowsDesktop, "dynamic_win_desktop", "dynamic_desktop": + return types.KindDynamicWindowsDesktop, nil case types.KindToken, "tokens": return types.KindToken, nil case types.KindInstaller: diff --git a/lib/services/role.go b/lib/services/role.go index 0d877761bbced..083b277c9b81f 100644 --- a/lib/services/role.go +++ b/lib/services/role.go @@ -73,6 +73,7 @@ var DefaultImplicitRules = []types.Rule{ types.NewRule(types.KindApp, RO()), types.NewRule(types.KindWindowsDesktopService, RO()), types.NewRule(types.KindWindowsDesktop, RO()), + types.NewRule(types.KindDynamicWindowsDesktop, RO()), types.NewRule(types.KindKubernetesCluster, RO()), types.NewRule(types.KindUsageEvent, []string{types.VerbCreate}), types.NewRule(types.KindVnetConfig, RO()), From b99300519021894c58327c76b05ef479728b9a0d Mon Sep 17 00:00:00 2001 From: Edward Dowling Date: Tue, 22 Oct 2024 21:40:13 +0100 Subject: [PATCH 22/70] Add access monitoring rules to msteams plugins (#47638) * Add access monitoring rules to msteams plugins * Increase handler timeout for msteams * Add in missing client field to msteams config * Fix linting --- integrations/access/msteams/app.go | 98 ++++++++++++++++---- integrations/access/msteams/config.go | 3 + integrations/access/msteams/testlib/suite.go | 79 ++++++++++++++-- 3 files changed, 152 insertions(+), 28 deletions(-) diff --git a/integrations/access/msteams/app.go b/integrations/access/msteams/app.go index 885d9ca8de65a..0f964705c6b94 100644 --- a/integrations/access/msteams/app.go +++ b/integrations/access/msteams/app.go @@ -17,12 +17,14 @@ package msteams import ( "context" "log/slog" + "slices" "time" "github.com/gravitational/trace" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/integrations/access/accessmonitoring" "github.com/gravitational/teleport/integrations/access/common" "github.com/gravitational/teleport/integrations/access/common/teleport" "github.com/gravitational/teleport/integrations/lib" @@ -40,7 +42,7 @@ const ( // initTimeout is used to bound execution time of health check and teleport version check. initTimeout = time.Second * 10 // handlerTimeout is used to bound the execution time of watcher event handler. - handlerTimeout = time.Second * 5 + handlerTimeout = time.Second * 15 ) // App contains global application state. @@ -53,7 +55,8 @@ type App struct { watcherJob lib.ServiceJob pd *pd.CompareAndSwap[PluginData] - log *slog.Logger + log *slog.Logger + accessMonitoringRules *accessmonitoring.RuleHandler *lib.Process } @@ -85,13 +88,11 @@ func (a *App) Run(ctx context.Context) error { } a.Process = lib.NewProcess(ctx) - a.watcherJob, err = a.newWatcherJob() if err != nil { return trace.Wrap(err) } a.SpawnCriticalJob(a.mainJob) - a.SpawnCriticalJob(a.watcherJob) select { case <-ctx.Done(): @@ -116,10 +117,14 @@ func (a *App) init(ctx context.Context) error { ctx, cancel := context.WithTimeout(ctx, initTimeout) defer cancel() - var err error - a.apiClient, err = common.GetTeleportClient(ctx, a.conf.Teleport) - if err != nil { - return trace.Wrap(err) + if a.conf.Client != nil { + a.apiClient = a.conf.Client + } else { + var err error + a.apiClient, err = common.GetTeleportClient(ctx, a.conf.Teleport) + if err != nil { + return trace.Wrap(err) + } } a.pd = pd.NewCAS( @@ -145,6 +150,24 @@ func (a *App) init(ctx context.Context) error { return trace.Wrap(err) } + a.accessMonitoringRules = accessmonitoring.NewRuleHandler(accessmonitoring.RuleHandlerConfig{ + Client: a.apiClient, + PluginName: pluginName, + // Map msteams.RecipientData onto the common recipient type used + // by the access monitoring rules watcher. + FetchRecipientCallback: func(ctx context.Context, name string) (*common.Recipient, error) { + msTeamsRecipient, err := a.bot.FetchRecipient(ctx, name) + if err != nil { + return nil, trace.Wrap(err) + } + return &common.Recipient{ + Name: name, + ID: msTeamsRecipient.ID, + Kind: string(msTeamsRecipient.Kind), + }, nil + }, + }) + return a.initBot(ctx) } @@ -187,27 +210,52 @@ func (a *App) initBot(ctx context.Context) error { return nil } -// newWatcherJob creates WatcherJob -func (a *App) newWatcherJob() (lib.ServiceJob, error) { - return watcherjob.NewJob( +// run starts the main process +func (a *App) run(ctx context.Context) error { + + process := lib.MustGetProcess(ctx) + + watchKinds := []types.WatchKind{ + {Kind: types.KindAccessRequest}, + {Kind: types.KindAccessMonitoringRule}, + } + acceptedWatchKinds := make([]string, 0, len(watchKinds)) + watcherJob, err := watcherjob.NewJobWithConfirmedWatchKinds( a.apiClient, watcherjob.Config{ - Watch: types.Watch{ - Kinds: []types.WatchKind{{Kind: types.KindAccessRequest}}, - }, + Watch: types.Watch{Kinds: watchKinds, AllowPartialSuccess: true}, EventFuncTimeout: handlerTimeout, }, a.onWatcherEvent, + func(ws types.WatchStatus) { + for _, watchKind := range ws.GetKinds() { + acceptedWatchKinds = append(acceptedWatchKinds, watchKind.Kind) + } + }, ) -} - -// run starts the main process -func (a *App) run(ctx context.Context) error { - ok, err := a.watcherJob.WaitReady(ctx) if err != nil { return trace.Wrap(err) } + process.SpawnCriticalJob(watcherJob) + + ok, err := watcherJob.WaitReady(ctx) + if err != nil { + return trace.Wrap(err) + } + if len(acceptedWatchKinds) == 0 { + return trace.BadParameter("failed to initialize watcher for all the required resources: %+v", + watchKinds) + } + // Check if KindAccessMonitoringRule resources are being watched, + // the role the plugin is running as may not have access. + if slices.Contains(acceptedWatchKinds, types.KindAccessMonitoringRule) { + if err := a.accessMonitoringRules.InitAccessMonitoringRulesCache(ctx); err != nil { + return trace.Wrap(err, "initializing Access Monitoring Rule cache") + } + } + a.watcherJob = watcherJob + a.watcherJob.SetReady(ok) if ok { a.log.InfoContext(ctx, "Plugin is ready") } else { @@ -243,6 +291,10 @@ func (a *App) checkTeleportVersion(ctx context.Context) (proto.PingResponse, err // onWatcherEvent called when an access request event is received func (a *App) onWatcherEvent(ctx context.Context, event types.Event) error { kind := event.Resource.GetKind() + if kind == types.KindAccessMonitoringRule { + return trace.Wrap(a.accessMonitoringRules.HandleAccessMonitoringRule(ctx, event)) + } + if kind != types.KindAccessRequest { return trace.Errorf("unexpected kind %s", kind) } @@ -480,6 +532,14 @@ func (a *App) getMessageRecipients(ctx context.Context, req types.AccessRequest) recipientSet := stringset.New() a.log.DebugContext(ctx, "Getting suggested reviewer recipients") + accessRuleRecipients := a.accessMonitoringRules.RecipientsFromAccessMonitoringRules(ctx, req) + accessRuleRecipients.ForEach(func(r common.Recipient) { + recipientSet.Add(r.Name) + }) + if recipientSet.Len() != 0 { + return recipientSet.ToSlice() + } + var validEmailsSuggReviewers []string for _, reviewer := range req.GetSuggestedReviewers() { if !lib.IsEmail(reviewer) { diff --git a/integrations/access/msteams/config.go b/integrations/access/msteams/config.go index bffb57e95e911..8aca1fa074ab1 100644 --- a/integrations/access/msteams/config.go +++ b/integrations/access/msteams/config.go @@ -22,6 +22,7 @@ import ( "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/integrations/access/common" + "github.com/gravitational/teleport/integrations/access/common/teleport" "github.com/gravitational/teleport/integrations/access/msteams/msapi" "github.com/gravitational/teleport/integrations/lib" "github.com/gravitational/teleport/integrations/lib/logger" @@ -29,6 +30,8 @@ import ( // Config represents plugin configuration type Config struct { + // Client is the Teleport API client. + Client teleport.Client Teleport lib.TeleportConfig Recipients common.RawRecipientsMap `toml:"role_to_recipients"` Log logger.Config diff --git a/integrations/access/msteams/testlib/suite.go b/integrations/access/msteams/testlib/suite.go index eaa9e138a9a17..3e652bea1aa85 100644 --- a/integrations/access/msteams/testlib/suite.go +++ b/integrations/access/msteams/testlib/suite.go @@ -28,6 +28,8 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + accessmonitoringrulesv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/accessmonitoringrules/v1" + v1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/integrations/access/common" "github.com/gravitational/teleport/integrations/access/msteams" @@ -37,7 +39,7 @@ import ( "github.com/gravitational/teleport/integrations/lib/testing/integration" ) -// MsTeamsBaseSuite is the Slack access plugin test suite. +// MsTeamsBaseSuite is the MsTeams access plugin test suite. // It implements the testify.TestingSuite interface. type MsTeamsBaseSuite struct { *integration.AccessRequestSuite @@ -51,16 +53,19 @@ type MsTeamsBaseSuite struct { reviewer2TeamsUser msapi.User } -// SetupTest starts a fake Slack, generates the plugin configuration, and loads -// the fixtures in Slack. It runs for each test. +// SetupTest starts a fake MsTeams, generates the plugin configuration, and loads +// the fixtures in MsTeams. It runs for each test. func (s *MsTeamsBaseSuite) SetupTest() { t := s.T() + + err := logger.Setup(logger.Config{Severity: "debug"}) + require.NoError(t, err) s.raceNumber = runtime.GOMAXPROCS(0) s.fakeTeams = NewFakeTeams(s.raceNumber) t.Cleanup(s.fakeTeams.Close) - // We need requester users as well, the slack plugin sends messages to users + // We need requester users as well, the MsTeams plugin sends messages to users // when their access request got approved. s.requesterOSSTeamsUser = s.fakeTeams.StoreUser(msapi.User{Name: "Requester OSS", Mail: integration.RequesterOSSUserName}) s.requester1TeamsUser = s.fakeTeams.StoreUser(msapi.User{Name: "Requester Ent", Mail: integration.Requester1UserName}) @@ -71,16 +76,16 @@ func (s *MsTeamsBaseSuite) SetupTest() { var conf msteams.Config conf.Teleport = s.TeleportConfig() + apiClient, err := common.GetTeleportClient(context.Background(), s.TeleportConfig()) + require.NoError(t, err) + conf.Client = apiClient conf.MSAPI = s.fakeTeams.Config conf.MSAPI.SetBaseURLs(s.fakeTeams.URL(), s.fakeTeams.URL(), s.fakeTeams.URL()) - conf.Log = logger.Config{ - Severity: "debug", - } s.appConfig = &conf } -// startApp starts the Slack plugin, waits for it to become ready and returns. +// startApp starts the MsTeams plugin, waits for it to become ready and returns. func (s *MsTeamsBaseSuite) startApp() { s.T().Helper() t := s.T() @@ -414,7 +419,9 @@ func (s *MsTeamsSuiteEnterprise) TestRace() { ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) t.Cleanup(cancel) - s.appConfig.Log.Severity = "debug" // Turn off noisy debug logging + err := logger.Setup(logger.Config{Severity: "info"}) // Turn off noisy debug logging + require.NoError(t, err) + s.startApp() var ( @@ -527,3 +534,57 @@ func (s *MsTeamsSuiteEnterprise) TestRace() { return next }) } + +func (s *MsTeamsSuiteOSS) TestRecipientsFromAccessMonitoringRule() { + t := s.T() + ctx, cancel := context.WithTimeout(context.Background(), 5*time.Minute) + t.Cleanup(cancel) + + s.startApp() + + _, err := s.ClientByName(integration.RulerUserName). + AccessMonitoringRulesClient(). + CreateAccessMonitoringRule(ctx, &accessmonitoringrulesv1.AccessMonitoringRule{ + Kind: types.KindAccessMonitoringRule, + Version: types.V1, + Metadata: &v1.Metadata{ + Name: "test-msteams-amr", + }, + Spec: &accessmonitoringrulesv1.AccessMonitoringRuleSpec{ + Subjects: []string{types.KindAccessRequest}, + Condition: "!is_empty(access_request.spec.roles)", + Notification: &accessmonitoringrulesv1.Notification{ + Name: "msteams", + Recipients: []string{ + s.reviewer1TeamsUser.ID, + s.reviewer2TeamsUser.Mail, + }, + }, + }, + }) + assert.NoError(t, err) + + // Test execution: create an access request + req := s.CreateAccessRequest(ctx, integration.RequesterOSSUserName, nil) + + s.checkPluginData(ctx, req.GetName(), func(data msteams.PluginData) bool { + return len(data.TeamsData) > 0 + }) + + title := "Access Request " + req.GetName() + msgs, err := s.getNewMessages(ctx, 2) + require.NoError(t, err) + + var body1 testTeamsMessage + require.NoError(t, json.Unmarshal([]byte(msgs[0].Body), &body1)) + body1.checkTitle(t, title) + require.Equal(t, msgs[0].RecipientID, s.reviewer1TeamsUser.ID) + + var body2 testTeamsMessage + require.NoError(t, json.Unmarshal([]byte(msgs[1].Body), &body2)) + body1.checkTitle(t, title) + require.Equal(t, msgs[1].RecipientID, s.reviewer2TeamsUser.ID) + + assert.NoError(t, s.ClientByName(integration.RulerUserName). + AccessMonitoringRulesClient().DeleteAccessMonitoringRule(ctx, "test-msteams-amr")) +} From ee09328cc4d068fb55a1ea98303cb5e0d55b35bb Mon Sep 17 00:00:00 2001 From: Przemko Robakowski Date: Tue, 22 Oct 2024 23:22:03 +0200 Subject: [PATCH 23/70] Cache and watcher support for DynamicWindowsDesktop (#46989) * Add DynamicWindowsDesktop to proto * Add resource matchers to Windows desktop service config * Implement API and backend for DynamicWindowsDesktop * Cache and watcher support for DynamicWindowsDesktop * Fix imports * fix test * move rpc to separate server * rework api and grpc more towards 153-style * e * remove dynamic windows from paginated resource * add tests * add tests * Update api/proto/teleport/legacy/types/types.proto Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> * lint * gci * cleanup * cleanup * use generic service * cleanup * cleanup * cleanup * cleanup * cleanup * gci * rework cache * rework cache * add admin action checks * move service * add service test * gci * review comments * review comments * review comments * update interfaces * gci * review comments * review comments * fix loggers --------- Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> --- api/client/events.go | 7 ++ lib/auth/authclient/api.go | 6 ++ lib/auth/grpcserver.go | 3 +- lib/cache/cache.go | 39 ++++++++ lib/cache/cache_test.go | 1 + lib/cache/collections.go | 59 ++++++++++++ lib/services/dynamic_desktop.go | 1 + lib/services/local/events.go | 39 ++++++++ lib/services/watcher.go | 156 ++++++++++++++++++++++++++++++++ 9 files changed, 309 insertions(+), 2 deletions(-) diff --git a/api/client/events.go b/api/client/events.go index e856a77d26d26..0cce9664d248a 100644 --- a/api/client/events.go +++ b/api/client/events.go @@ -254,6 +254,10 @@ func EventToGRPC(in types.Event) (*proto.Event, error) { out.Resource = &proto.Event_WindowsDesktop{ WindowsDesktop: r, } + case *types.DynamicWindowsDesktopV1: + out.Resource = &proto.Event_DynamicWindowsDesktop{ + DynamicWindowsDesktop: r, + } case *types.InstallerV1: out.Resource = &proto.Event_Installer{ Installer: r, @@ -444,6 +448,9 @@ func EventFromGRPC(in *proto.Event) (*types.Event, error) { } else if r := in.GetWindowsDesktop(); r != nil { out.Resource = r return &out, nil + } else if r := in.GetDynamicWindowsDesktop(); r != nil { + out.Resource = r + return &out, nil } else if r := in.GetKubernetesServer(); r != nil { out.Resource = r return &out, nil diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index 80b25dc26d2b6..57821e8995795 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -1088,6 +1088,12 @@ type Cache interface { // GetWindowsDesktopService returns a windows desktop host by name. GetWindowsDesktopService(ctx context.Context, name string) (types.WindowsDesktopService, error) + // GetDynamicWindowsDesktop returns registered dynamic Windows desktop by name. + GetDynamicWindowsDesktop(ctx context.Context, name string) (types.DynamicWindowsDesktop, error) + + // ListDynamicWindowsDesktops returns all registered dynamic Windows desktop. + ListDynamicWindowsDesktops(ctx context.Context, pageSize int, pageToken string) ([]types.DynamicWindowsDesktop, string, error) + // GetStaticTokens gets the list of static tokens used to provision nodes. GetStaticTokens() (types.StaticTokens, error) diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index 0b10422ff9652..abab08063efab 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -5146,8 +5146,7 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { dynamicWindows, err := dynamicwindowsv1.NewService(dynamicwindowsv1.ServiceConfig{ Authorizer: cfg.Authorizer, Backend: cfg.AuthServer.Services, - // TODO(probakowski): switch to cache when support is added - Cache: cfg.AuthServer.Services, + Cache: cfg.AuthServer.Cache, }) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 47678d0b89a43..312705c258198 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -161,6 +161,7 @@ func ForAuth(cfg Config) Config { {Kind: types.KindLock}, {Kind: types.KindWindowsDesktopService}, {Kind: types.KindWindowsDesktop}, + {Kind: types.KindDynamicWindowsDesktop}, {Kind: types.KindKubeServer}, {Kind: types.KindInstaller}, {Kind: types.KindKubernetesCluster}, @@ -233,6 +234,7 @@ func ForProxy(cfg Config) Config { {Kind: types.KindDatabase}, {Kind: types.KindWindowsDesktopService}, {Kind: types.KindWindowsDesktop}, + {Kind: types.KindDynamicWindowsDesktop}, {Kind: types.KindKubeServer}, {Kind: types.KindInstaller}, {Kind: types.KindKubernetesCluster}, @@ -392,6 +394,7 @@ func ForWindowsDesktop(cfg Config) Config { {Kind: types.KindNamespace, Name: apidefaults.Namespace}, {Kind: types.KindWindowsDesktopService}, {Kind: types.KindWindowsDesktop}, + {Kind: types.KindDynamicWindowsDesktop}, } cfg.QueueSize = defaults.WindowsDesktopQueueSize return cfg @@ -520,6 +523,7 @@ type Cache struct { webSessionCache types.WebSessionInterface webTokenCache types.WebTokenInterface windowsDesktopsCache services.WindowsDesktops + dynamicWindowsDesktopsCache services.DynamicWindowsDesktops samlIdPServiceProvidersCache services.SAMLIdPServiceProviders //nolint:revive // Because we want this to be IdP. userGroupsCache services.UserGroups oktaCache services.Okta @@ -690,6 +694,8 @@ type Config struct { WebToken types.WebTokenInterface // WindowsDesktops is a windows desktop service. WindowsDesktops services.WindowsDesktops + // DynamicWindowsDesktops is a dynamic Windows desktop service. + DynamicWindowsDesktops services.DynamicWindowsDesktops // SAMLIdPServiceProviders is a SAML IdP service providers service. SAMLIdPServiceProviders services.SAMLIdPServiceProviders // UserGroups is a user groups service. @@ -993,6 +999,12 @@ func New(config Config) (*Cache, error) { return nil, trace.Wrap(err) } + dynamicDesktopsService, err := local.NewDynamicWindowsDesktopService(config.Backend) + if err != nil { + cancel() + return nil, trace.Wrap(err) + } + cs := &Cache{ ctx: ctx, cancel: cancel, @@ -1019,6 +1031,7 @@ func New(config Config) (*Cache, error) { webSessionCache: identityService.WebSessions(), webTokenCache: identityService.WebTokens(), windowsDesktopsCache: local.NewWindowsDesktopService(config.Backend), + dynamicWindowsDesktopsCache: dynamicDesktopsService, accessMontoringRuleCache: accessMonitoringRuleCache, samlIdPServiceProvidersCache: samlIdPServiceProvidersCache, userGroupsCache: userGroupsCache, @@ -2822,6 +2835,32 @@ func (c *Cache) ListWindowsDesktopServices(ctx context.Context, req types.ListWi return rg.reader.ListWindowsDesktopServices(ctx, req) } +// GetDynamicWindowsDesktop returns registered dynamic Windows desktop by name. +func (c *Cache) GetDynamicWindowsDesktop(ctx context.Context, name string) (types.DynamicWindowsDesktop, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetDynamicWindowsDesktop") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.dynamicWindowsDesktops) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + return rg.reader.GetDynamicWindowsDesktop(ctx, name) +} + +// ListDynamicWindowsDesktops returns all registered dynamic Windows desktop. +func (c *Cache) ListDynamicWindowsDesktops(ctx context.Context, pageSize int, nextPage string) ([]types.DynamicWindowsDesktop, string, error) { + ctx, span := c.Tracer.Start(ctx, "cache/ListDynamicWindowsDesktops") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.dynamicWindowsDesktops) + if err != nil { + return nil, "", trace.Wrap(err) + } + defer rg.Release() + return rg.reader.ListDynamicWindowsDesktops(ctx, pageSize, nextPage) +} + // ListSAMLIdPServiceProviders returns a paginated list of SAML IdP service provider resources. func (c *Cache) ListSAMLIdPServiceProviders(ctx context.Context, pageSize int, nextKey string) ([]types.SAMLIdPServiceProvider, string, error) { ctx, span := c.Tracer.Start(ctx, "cache/ListSAMLIdPServiceProviders") diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 6961d1c2e1b12..4176f637fc655 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -3424,6 +3424,7 @@ func TestCacheWatchKindExistsInEvents(t *testing.T) { types.KindLock: &types.LockV2{}, types.KindWindowsDesktopService: &types.WindowsDesktopServiceV3{}, types.KindWindowsDesktop: &types.WindowsDesktopV3{}, + types.KindDynamicWindowsDesktop: &types.DynamicWindowsDesktopV1{}, types.KindInstaller: &types.InstallerV1{}, types.KindKubernetesCluster: &types.KubernetesClusterV3{}, types.KindSAMLIdPServiceProvider: &types.SAMLIdPServiceProviderV1{}, diff --git a/lib/cache/collections.go b/lib/cache/collections.go index 093d52b4c3741..e072212a45784 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -45,6 +45,7 @@ import ( "github.com/gravitational/teleport/api/types/discoveryconfig" "github.com/gravitational/teleport/api/types/secreports" "github.com/gravitational/teleport/api/types/userloginstate" + "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/services" ) @@ -258,6 +259,7 @@ type cacheCollections struct { webSessions collectionReader[webSessionGetter] webTokens collectionReader[webTokenGetter] windowsDesktops collectionReader[windowsDesktopsGetter] + dynamicWindowsDesktops collectionReader[dynamicWindowsDesktopsGetter] windowsDesktopServices collectionReader[windowsDesktopServiceGetter] userNotifications collectionReader[notificationGetter] accessGraphSettings collectionReader[accessGraphSettingsGetter] @@ -621,6 +623,15 @@ func setupCollections(c *Cache, watches []types.WatchKind) (*cacheCollections, e watch: watch, } collections.byKind[resourceKind] = collections.windowsDesktops + case types.KindDynamicWindowsDesktop: + if c.WindowsDesktops == nil { + return nil, trace.BadParameter("missing parameter DynamicWindowsDesktops") + } + collections.dynamicWindowsDesktops = &genericCollection[types.DynamicWindowsDesktop, dynamicWindowsDesktopsGetter, dynamicWindowsDesktopsExecutor]{ + cache: c, + watch: watch, + } + collections.byKind[resourceKind] = collections.dynamicWindowsDesktops case types.KindSAMLIdPServiceProvider: if c.SAMLIdPServiceProviders == nil { return nil, trace.BadParameter("missing parameter SAMLIdPServiceProviders") @@ -2318,6 +2329,54 @@ type windowsDesktopsGetter interface { var _ executor[types.WindowsDesktop, windowsDesktopsGetter] = windowsDesktopsExecutor{} +type dynamicWindowsDesktopsExecutor struct{} + +func (dynamicWindowsDesktopsExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]types.DynamicWindowsDesktop, error) { + var desktops []types.DynamicWindowsDesktop + next := "" + for { + d, token, err := cache.dynamicWindowsDesktopsCache.ListDynamicWindowsDesktops(ctx, defaults.MaxIterationLimit, next) + if err != nil { + return nil, err + } + desktops = append(desktops, d...) + if token == "" { + break + } + next = token + } + return desktops, nil +} + +func (dynamicWindowsDesktopsExecutor) upsert(ctx context.Context, cache *Cache, resource types.DynamicWindowsDesktop) error { + _, err := cache.dynamicWindowsDesktopsCache.UpsertDynamicWindowsDesktop(ctx, resource) + return err +} + +func (dynamicWindowsDesktopsExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return cache.dynamicWindowsDesktopsCache.DeleteAllDynamicWindowsDesktops(ctx) +} + +func (dynamicWindowsDesktopsExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return cache.dynamicWindowsDesktopsCache.DeleteDynamicWindowsDesktop(ctx, resource.GetName()) +} + +func (dynamicWindowsDesktopsExecutor) isSingleton() bool { return false } + +func (dynamicWindowsDesktopsExecutor) getReader(cache *Cache, cacheOK bool) dynamicWindowsDesktopsGetter { + if cacheOK { + return cache.dynamicWindowsDesktopsCache + } + return cache.Config.DynamicWindowsDesktops +} + +type dynamicWindowsDesktopsGetter interface { + GetDynamicWindowsDesktop(ctx context.Context, name string) (types.DynamicWindowsDesktop, error) + ListDynamicWindowsDesktops(ctx context.Context, pageSize int, nextPage string) ([]types.DynamicWindowsDesktop, string, error) +} + +var _ executor[types.DynamicWindowsDesktop, dynamicWindowsDesktopsGetter] = dynamicWindowsDesktopsExecutor{} + type kubeClusterExecutor struct{} func (kubeClusterExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]types.KubeCluster, error) { diff --git a/lib/services/dynamic_desktop.go b/lib/services/dynamic_desktop.go index 5903e4a88b79f..76279becb6014 100644 --- a/lib/services/dynamic_desktop.go +++ b/lib/services/dynamic_desktop.go @@ -34,6 +34,7 @@ type DynamicWindowsDesktops interface { UpdateDynamicWindowsDesktop(context.Context, types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) UpsertDynamicWindowsDesktop(context.Context, types.DynamicWindowsDesktop) (types.DynamicWindowsDesktop, error) DeleteDynamicWindowsDesktop(ctx context.Context, name string) error + DeleteAllDynamicWindowsDesktops(ctx context.Context) error ListDynamicWindowsDesktops(ctx context.Context, pageSize int, pageToken string) ([]types.DynamicWindowsDesktop, string, error) } diff --git a/lib/services/local/events.go b/lib/services/local/events.go index 5123421e9f8dc..f0ef42d33648a 100644 --- a/lib/services/local/events.go +++ b/lib/services/local/events.go @@ -167,6 +167,8 @@ func (e *EventsService) NewWatcher(ctx context.Context, watch types.Watch) (type parser = newWindowsDesktopServicesParser() case types.KindWindowsDesktop: parser = newWindowsDesktopsParser() + case types.KindDynamicWindowsDesktop: + parser = newDynamicWindowsDesktopsParser() case types.KindInstaller: parser = newInstallerParser() case types.KindKubernetesCluster: @@ -1851,6 +1853,43 @@ func (p *windowsDesktopServicesParser) parse(event backend.Event) (types.Resourc } } +func newDynamicWindowsDesktopsParser() *dynamicWindowsDesktopsParser { + return &dynamicWindowsDesktopsParser{ + baseParser: newBaseParser(backend.NewKey(dynamicWindowsDesktopsPrefix, "")), + } +} + +type dynamicWindowsDesktopsParser struct { + baseParser +} + +func (p *dynamicWindowsDesktopsParser) parse(event backend.Event) (types.Resource, error) { + switch event.Type { + case types.OpDelete: + name := event.Item.Key.TrimPrefix(backend.NewKey(dynamicWindowsDesktopsPrefix, "")).String() + if name == "" { + return nil, trace.NotFound("failed parsing %v", event.Item.Key.String()) + } + + return &types.ResourceHeader{ + Kind: types.KindDynamicWindowsDesktop, + Version: types.V1, + Metadata: types.Metadata{ + Name: strings.TrimPrefix(name, backend.SeparatorString), + Namespace: apidefaults.Namespace, + }, + }, nil + case types.OpPut: + return services.UnmarshalDynamicWindowsDesktop( + event.Item.Value, + services.WithExpires(event.Item.Expires), + services.WithRevision(event.Item.Revision), + ) + default: + return nil, trace.BadParameter("event %v is not supported", event.Type) + } +} + func newWindowsDesktopsParser() *windowsDesktopsParser { return &windowsDesktopsParser{ baseParser: newBaseParser(backend.NewKey(windowsDesktopsPrefix, "")), diff --git a/lib/services/watcher.go b/lib/services/watcher.go index f8151d491583b..93daf0aee5cd6 100644 --- a/lib/services/watcher.go +++ b/lib/services/watcher.go @@ -960,6 +960,162 @@ func (p *databaseCollector) processEventsAndUpdateCurrent(ctx context.Context, e func (*databaseCollector) notifyStale() {} +type DynamicWindowsDesktopGetter interface { + ListDynamicWindowsDesktops(ctx context.Context, pageSize int, pageToken string) ([]types.DynamicWindowsDesktop, string, error) +} + +// DynamicWindowsDesktopWatcherConfig is a DynamicWindowsDesktopWatcher configuration. +type DynamicWindowsDesktopWatcherConfig struct { + // ResourceWatcherConfig is the resource watcher configuration. + ResourceWatcherConfig + // DynamicWindowsDesktopGetter is responsible for fetching DynamicWindowsDesktop resources. + DynamicWindowsDesktopGetter + // DynamicWindowsDesktopsC receives up-to-date list of all DynamicWindowsDesktop resources. + DynamicWindowsDesktopsC chan types.DynamicWindowsDesktops +} + +// CheckAndSetDefaults checks parameters and sets default values. +func (cfg *DynamicWindowsDesktopWatcherConfig) CheckAndSetDefaults() error { + if err := cfg.ResourceWatcherConfig.CheckAndSetDefaults(); err != nil { + return trace.Wrap(err) + } + if cfg.DynamicWindowsDesktopGetter == nil { + getter, ok := cfg.Client.(DynamicWindowsDesktopGetter) + if !ok { + return trace.BadParameter("missing parameter DynamicWindowsDesktopGetter and Client %T not usable as DynamicWindowsDesktopGetter", cfg.Client) + } + cfg.DynamicWindowsDesktopGetter = getter + } + if cfg.DynamicWindowsDesktopsC == nil { + cfg.DynamicWindowsDesktopsC = make(chan types.DynamicWindowsDesktops) + } + return nil +} + +// NewDynamicWindowsDesktopWatcher returns a new instance of DynamicWindowsDesktopWatcher. +func NewDynamicWindowsDesktopWatcher(ctx context.Context, cfg DynamicWindowsDesktopWatcherConfig) (*DynamicWindowsDesktopWatcher, error) { + if err := cfg.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + collector := &dynamicWindowsDesktopCollector{ + DynamicWindowsDesktopWatcherConfig: cfg, + initializationC: make(chan struct{}), + } + watcher, err := newResourceWatcher(ctx, collector, cfg.ResourceWatcherConfig) + if err != nil { + return nil, trace.Wrap(err) + } + return &DynamicWindowsDesktopWatcher{watcher, collector}, nil +} + +// DynamicWindowsDesktopWatcher is built on top of resourceWatcher to monitor DynamicWindowsDesktop resources. +type DynamicWindowsDesktopWatcher struct { + *resourceWatcher + *dynamicWindowsDesktopCollector +} + +// dynamicWindowsDesktopCollector accompanies resourceWatcher when monitoring DynamicWindowsDesktop resources. +type dynamicWindowsDesktopCollector struct { + // DynamicWindowsDesktopWatcherConfig is the watcher configuration. + DynamicWindowsDesktopWatcherConfig + // current holds a map of the currently known DynamicWindowsDesktop resources. + current map[string]types.DynamicWindowsDesktop + // lock protects the "current" map. + lock sync.RWMutex + // initializationC is used to check that the + initializationC chan struct{} + once sync.Once +} + +// resourceKinds specifies the resource kind to watch. +func (p *dynamicWindowsDesktopCollector) resourceKinds() []types.WatchKind { + return []types.WatchKind{{Kind: types.KindDynamicWindowsDesktop}} +} + +// isInitialized is used to check that the cache has done its initial +// sync +func (p *dynamicWindowsDesktopCollector) initializationChan() <-chan struct{} { + return p.initializationC +} + +// getResourcesAndUpdateCurrent refreshes the list of current resources. +func (p *dynamicWindowsDesktopCollector) getResourcesAndUpdateCurrent(ctx context.Context) error { + var dynamicWindowsDesktops []types.DynamicWindowsDesktop + next := "" + for { + desktops, token, err := p.DynamicWindowsDesktopGetter.ListDynamicWindowsDesktops(ctx, defaults.MaxIterationLimit, next) + if err != nil { + return trace.Wrap(err) + } + dynamicWindowsDesktops = append(dynamicWindowsDesktops, desktops...) + if token == "" { + break + } + next = token + } + newCurrent := make(map[string]types.DynamicWindowsDesktop, len(dynamicWindowsDesktops)) + for _, dynamicWindowsDesktop := range dynamicWindowsDesktops { + newCurrent[dynamicWindowsDesktop.GetName()] = dynamicWindowsDesktop + } + p.lock.Lock() + defer p.lock.Unlock() + p.current = newCurrent + p.defineCollectorAsInitialized() + + select { + case <-ctx.Done(): + return trace.Wrap(ctx.Err()) + case p.DynamicWindowsDesktopsC <- dynamicWindowsDesktops: + } + + return nil +} + +func (p *dynamicWindowsDesktopCollector) defineCollectorAsInitialized() { + p.once.Do(func() { + // mark watcher as initialized. + close(p.initializationC) + }) +} + +// processEventsAndUpdateCurrent is called when a watcher event is received. +func (p *dynamicWindowsDesktopCollector) processEventsAndUpdateCurrent(ctx context.Context, events []types.Event) { + p.lock.Lock() + defer p.lock.Unlock() + + var updated bool + for _, event := range events { + if event.Resource == nil || event.Resource.GetKind() != types.KindDynamicWindowsDesktop { + p.Logger.WarnContext(ctx, "Received unexpected event", "event", logutils.StringerAttr(event)) + continue + } + switch event.Type { + case types.OpDelete: + delete(p.current, event.Resource.GetName()) + updated = true + case types.OpPut: + dynamicWindowsDesktop, ok := event.Resource.(types.DynamicWindowsDesktop) + if !ok { + p.Logger.WarnContext(ctx, "Received unexpected resource type", "resource", event.Resource.GetKind()) + continue + } + p.current[dynamicWindowsDesktop.GetName()] = dynamicWindowsDesktop + updated = true + default: + p.Logger.WarnContext(ctx, "Received unsupported event type", "event_type", event.Type) + } + } + + if updated { + select { + case <-ctx.Done(): + case p.DynamicWindowsDesktopsC <- resourcesToSlice(p.current): + } + } +} + +func (*dynamicWindowsDesktopCollector) notifyStale() {} + // AppWatcherConfig is an AppWatcher configuration. type AppWatcherConfig struct { // ResourceWatcherConfig is the resource watcher configuration. From d82ee8440cbc59d5f0b7d54b726e7e0b5053642b Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Tue, 22 Oct 2024 17:34:54 -0400 Subject: [PATCH 24/70] fix agent autoupdate protos (#47830) --- .../teleport/autoupdate/v1/autoupdate.pb.go | 371 +++++++++--------- .../teleport/autoupdate/v1/autoupdate.proto | 7 +- 2 files changed, 198 insertions(+), 180 deletions(-) diff --git a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go index 6213401019f87..e01283cc82414 100644 --- a/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go +++ b/api/gen/proto/go/teleport/autoupdate/v1/autoupdate.pb.go @@ -186,7 +186,8 @@ type AutoUpdateConfigSpec struct { sizeCache protoimpl.SizeCache unknownFields protoimpl.UnknownFields - Tools *AutoUpdateConfigSpecTools `protobuf:"bytes,2,opt,name=tools,proto3" json:"tools,omitempty"` + Tools *AutoUpdateConfigSpecTools `protobuf:"bytes,2,opt,name=tools,proto3" json:"tools,omitempty"` + Agents *AutoUpdateConfigSpecAgents `protobuf:"bytes,3,opt,name=agents,proto3" json:"agents,omitempty"` } func (x *AutoUpdateConfigSpec) Reset() { @@ -226,6 +227,13 @@ func (x *AutoUpdateConfigSpec) GetTools() *AutoUpdateConfigSpecTools { return nil } +func (x *AutoUpdateConfigSpec) GetAgents() *AutoUpdateConfigSpecAgents { + if x != nil { + return x.Agents + } + return nil +} + // AutoUpdateConfigSpecTools encodes the parameters for client tools auto updates. type AutoUpdateConfigSpecTools struct { state protoimpl.MessageState @@ -287,8 +295,8 @@ type AutoUpdateConfigSpecAgents struct { // Once the window is over, the group transitions to the done state. Existing agents won't be updated until the next // maintenance window. MaintenanceWindowDuration *durationpb.Duration `protobuf:"bytes,3,opt,name=maintenance_window_duration,json=maintenanceWindowDuration,proto3" json:"maintenance_window_duration,omitempty"` - // agent_schedules specifies schedules for updates of grouped agents. - AgentSchedules *AgentAutoUpdateSchedules `protobuf:"bytes,5,opt,name=agent_schedules,json=agentSchedules,proto3" json:"agent_schedules,omitempty"` + // schedules specifies schedules for updates of grouped agents. + Schedules *AgentAutoUpdateSchedules `protobuf:"bytes,6,opt,name=schedules,proto3" json:"schedules,omitempty"` } func (x *AutoUpdateConfigSpecAgents) Reset() { @@ -342,9 +350,9 @@ func (x *AutoUpdateConfigSpecAgents) GetMaintenanceWindowDuration() *durationpb. return nil } -func (x *AutoUpdateConfigSpecAgents) GetAgentSchedules() *AgentAutoUpdateSchedules { +func (x *AutoUpdateConfigSpecAgents) GetSchedules() *AgentAutoUpdateSchedules { if x != nil { - return x.AgentSchedules + return x.Schedules } return nil } @@ -1068,167 +1076,173 @@ var file_teleport_autoupdate_v1_autoupdate_proto_rawDesc = []byte{ 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, - 0x77, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, - 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x47, 0x0a, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, - 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, - 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, - 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, - 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x10, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x61, 0x75, - 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2f, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x6f, - 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, - 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x82, 0x02, 0x0a, 0x1a, 0x41, 0x75, - 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, - 0x65, 0x63, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, - 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, - 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x59, 0x0a, 0x1b, 0x6d, 0x61, 0x69, 0x6e, - 0x74, 0x65, 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x64, - 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, - 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, - 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x19, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, - 0x6e, 0x61, 0x6e, 0x63, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x44, 0x75, 0x72, 0x61, 0x74, - 0x69, 0x6f, 0x6e, 0x12, 0x59, 0x0a, 0x0f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x63, 0x68, - 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x0e, - 0x61, 0x67, 0x65, 0x6e, 0x74, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x62, - 0x0a, 0x18, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x07, 0x72, 0x65, - 0x67, 0x75, 0x6c, 0x61, 0x72, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x07, 0x72, 0x65, 0x67, 0x75, 0x6c, - 0x61, 0x72, 0x22, 0x7a, 0x0a, 0x14, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, - 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, - 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x6f, 0x75, 0x72, - 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x6f, 0x75, - 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x61, 0x69, 0x74, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x04, - 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x77, 0x61, 0x69, 0x74, 0x44, 0x61, 0x79, 0x73, 0x22, 0xd9, - 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, - 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, - 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, - 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, - 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, - 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, - 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, - 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x41, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, - 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, - 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x22, 0xc3, 0x01, 0x0a, 0x15, 0x41, - 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x53, 0x70, 0x65, 0x63, 0x12, 0x48, 0x0a, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x02, 0x20, - 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, - 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, - 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, - 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x4b, - 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, + 0xc3, 0x01, 0x0a, 0x14, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, + 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x12, 0x47, 0x0a, 0x05, 0x74, 0x6f, 0x6f, 0x6c, + 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, + 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, + 0x67, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x52, 0x05, 0x74, 0x6f, 0x6f, 0x6c, + 0x73, 0x12, 0x4a, 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, + 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x4a, 0x04, 0x08, + 0x01, 0x10, 0x02, 0x52, 0x10, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x61, 0x75, 0x74, 0x6f, 0x75, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x22, 0x2f, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, + 0x6c, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0x8e, 0x02, 0x0a, 0x1a, 0x41, 0x75, 0x74, 0x6f, 0x55, + 0x70, 0x64, 0x61, 0x74, 0x65, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x67, 0x53, 0x70, 0x65, 0x63, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x72, + 0x61, 0x74, 0x65, 0x67, 0x79, 0x12, 0x59, 0x0a, 0x1b, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, + 0x61, 0x6e, 0x63, 0x65, 0x5f, 0x77, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x5f, 0x64, 0x75, 0x72, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x19, 0x2e, 0x67, 0x6f, 0x6f, + 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x44, 0x75, 0x72, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x19, 0x6d, 0x61, 0x69, 0x6e, 0x74, 0x65, 0x6e, 0x61, 0x6e, + 0x63, 0x65, 0x57, 0x69, 0x6e, 0x64, 0x6f, 0x77, 0x44, 0x75, 0x72, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x12, 0x4e, 0x0a, 0x09, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x18, 0x06, 0x20, + 0x01, 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, + 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, + 0x64, 0x75, 0x6c, 0x65, 0x73, 0x52, 0x09, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, + 0x4a, 0x04, 0x08, 0x05, 0x10, 0x06, 0x52, 0x0f, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x5f, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x73, 0x22, 0x62, 0x0a, 0x18, 0x41, 0x67, 0x65, 0x6e, 0x74, + 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x53, 0x63, 0x68, 0x65, 0x64, 0x75, + 0x6c, 0x65, 0x73, 0x12, 0x46, 0x0a, 0x07, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x18, 0x01, + 0x20, 0x03, 0x28, 0x0b, 0x32, 0x2c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, + 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, 0x6f, + 0x75, 0x70, 0x52, 0x07, 0x72, 0x65, 0x67, 0x75, 0x6c, 0x61, 0x72, 0x22, 0x7a, 0x0a, 0x14, 0x41, + 0x67, 0x65, 0x6e, 0x74, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x64, 0x61, 0x79, 0x73, 0x18, + 0x02, 0x20, 0x03, 0x28, 0x09, 0x52, 0x04, 0x64, 0x61, 0x79, 0x73, 0x12, 0x1d, 0x0a, 0x0a, 0x73, + 0x74, 0x61, 0x72, 0x74, 0x5f, 0x68, 0x6f, 0x75, 0x72, 0x18, 0x03, 0x20, 0x01, 0x28, 0x05, 0x52, + 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x48, 0x6f, 0x75, 0x72, 0x12, 0x1b, 0x0a, 0x09, 0x77, 0x61, + 0x69, 0x74, 0x5f, 0x64, 0x61, 0x79, 0x73, 0x18, 0x04, 0x20, 0x01, 0x28, 0x03, 0x52, 0x08, 0x77, + 0x61, 0x69, 0x74, 0x44, 0x61, 0x79, 0x73, 0x22, 0xd9, 0x01, 0x0a, 0x11, 0x41, 0x75, 0x74, 0x6f, + 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x12, 0x0a, + 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, + 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, + 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, + 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, + 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, + 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, + 0x12, 0x41, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x2d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, - 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x41, 0x67, 0x65, - 0x6e, 0x74, 0x73, 0x52, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, - 0x02, 0x52, 0x0d, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x22, 0x43, 0x0a, 0x1a, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x25, - 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x99, 0x01, 0x0a, 0x1b, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, - 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, - 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, - 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, - 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, - 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, - 0x65, 0x22, 0xb1, 0x02, 0x0a, 0x16, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, - 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, - 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, - 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, - 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, - 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, - 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, - 0x46, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x70, 0x65, - 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, 0x12, 0x4c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, + 0x70, 0x65, 0x63, 0x22, 0xc3, 0x01, 0x0a, 0x15, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x12, 0x48, 0x0a, + 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, + 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, + 0x52, 0x05, 0x74, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x4b, 0x0a, 0x06, 0x61, 0x67, 0x65, 0x6e, 0x74, + 0x73, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x33, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, - 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, - 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xc9, 0x01, 0x0a, 0x1a, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, + 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x52, 0x06, 0x61, 0x67, + 0x65, 0x6e, 0x74, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x0d, 0x74, 0x6f, 0x6f, 0x6c, + 0x73, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x43, 0x0a, 0x1a, 0x41, 0x75, 0x74, + 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, + 0x65, 0x63, 0x54, 0x6f, 0x6f, 0x6c, 0x73, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, + 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x22, 0x99, + 0x01, 0x0a, 0x1b, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x56, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x53, 0x70, 0x65, 0x63, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x73, 0x12, 0x23, + 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, + 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, + 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, + 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x12, 0x0a, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6d, 0x6f, 0x64, 0x65, 0x22, 0xb1, 0x02, 0x0a, 0x16, 0x41, + 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, + 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x12, 0x12, 0x0a, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x04, 0x6b, 0x69, 0x6e, 0x64, 0x12, 0x19, 0x0a, 0x08, 0x73, 0x75, 0x62, + 0x5f, 0x6b, 0x69, 0x6e, 0x64, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x73, 0x75, 0x62, + 0x4b, 0x69, 0x6e, 0x64, 0x12, 0x18, 0x0a, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x07, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x38, + 0x0a, 0x08, 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x1c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x68, 0x65, 0x61, 0x64, + 0x65, 0x72, 0x2e, 0x76, 0x31, 0x2e, 0x4d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x52, 0x08, + 0x6d, 0x65, 0x74, 0x61, 0x64, 0x61, 0x74, 0x61, 0x12, 0x46, 0x0a, 0x04, 0x73, 0x70, 0x65, 0x63, + 0x18, 0x05, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, + 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, + 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, + 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x70, 0x65, 0x63, 0x52, 0x04, 0x73, 0x70, 0x65, 0x63, + 0x12, 0x4c, 0x0a, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x18, 0x06, 0x20, 0x01, 0x28, 0x0b, + 0x32, 0x34, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, + 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, - 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x76, 0x65, - 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x61, - 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, - 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, - 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, - 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, - 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, 0x68, 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, - 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, - 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, - 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, - 0x79, 0x22, 0x71, 0x0a, 0x1c, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, - 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, - 0x73, 0x12, 0x51, 0x0a, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, - 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, + 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x22, 0xc9, + 0x01, 0x0a, 0x1a, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, + 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x70, 0x65, 0x63, 0x12, 0x23, 0x0a, + 0x0d, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x01, + 0x20, 0x01, 0x28, 0x09, 0x52, 0x0c, 0x73, 0x74, 0x61, 0x72, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, + 0x6f, 0x6e, 0x12, 0x25, 0x0a, 0x0e, 0x74, 0x61, 0x72, 0x67, 0x65, 0x74, 0x5f, 0x76, 0x65, 0x72, + 0x73, 0x69, 0x6f, 0x6e, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0d, 0x74, 0x61, 0x72, 0x67, + 0x65, 0x74, 0x56, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x12, 0x1a, 0x0a, 0x08, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x73, 0x63, 0x68, + 0x65, 0x64, 0x75, 0x6c, 0x65, 0x12, 0x27, 0x0a, 0x0f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x5f, 0x6d, 0x6f, 0x64, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0e, + 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x4d, 0x6f, 0x64, 0x65, 0x12, 0x1a, + 0x0a, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x08, 0x73, 0x74, 0x72, 0x61, 0x74, 0x65, 0x67, 0x79, 0x22, 0x71, 0x0a, 0x1c, 0x41, 0x75, + 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, + 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x51, 0x0a, 0x06, 0x67, 0x72, + 0x6f, 0x75, 0x70, 0x73, 0x18, 0x01, 0x20, 0x03, 0x28, 0x0b, 0x32, 0x39, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, + 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, 0x6f, 0x75, 0x70, 0x73, 0x22, 0xaf, 0x02, + 0x0a, 0x21, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, + 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x47, 0x72, + 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, + 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, + 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, + 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, + 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, + 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, + 0x0e, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, - 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, - 0x74, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x52, 0x06, 0x67, 0x72, - 0x6f, 0x75, 0x70, 0x73, 0x22, 0xaf, 0x02, 0x0a, 0x21, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, - 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x52, 0x6f, 0x6c, 0x6c, 0x6f, 0x75, 0x74, 0x53, - 0x74, 0x61, 0x74, 0x75, 0x73, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x12, 0x12, 0x0a, 0x04, 0x6e, 0x61, - 0x6d, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x04, 0x6e, 0x61, 0x6d, 0x65, 0x12, 0x39, - 0x0a, 0x0a, 0x73, 0x74, 0x61, 0x72, 0x74, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x02, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x09, - 0x73, 0x74, 0x61, 0x72, 0x74, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x47, 0x0a, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x18, 0x03, 0x20, 0x01, 0x28, 0x0e, 0x32, 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x2e, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2e, 0x76, - 0x31, 0x2e, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, - 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, - 0x74, 0x65, 0x12, 0x44, 0x0a, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, - 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, - 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, - 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, - 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, - 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, - 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, - 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2a, 0xf7, 0x01, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, 0x65, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, - 0x74, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x0a, 0x29, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, - 0x41, 0x54, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, - 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, - 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, + 0x74, 0x61, 0x74, 0x65, 0x52, 0x05, 0x73, 0x74, 0x61, 0x74, 0x65, 0x12, 0x44, 0x0a, 0x10, 0x6c, + 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x5f, 0x74, 0x69, 0x6d, 0x65, 0x18, + 0x04, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x1a, 0x2e, 0x67, 0x6f, 0x6f, 0x67, 0x6c, 0x65, 0x2e, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, + 0x70, 0x52, 0x0e, 0x6c, 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x54, 0x69, 0x6d, + 0x65, 0x12, 0x2c, 0x0a, 0x12, 0x6c, 0x61, 0x73, 0x74, 0x5f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, + 0x5f, 0x72, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x18, 0x05, 0x20, 0x01, 0x28, 0x09, 0x52, 0x10, 0x6c, + 0x61, 0x73, 0x74, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x52, 0x65, 0x61, 0x73, 0x6f, 0x6e, 0x2a, + 0xf7, 0x01, 0x0a, 0x19, 0x41, 0x75, 0x74, 0x6f, 0x55, 0x70, 0x64, 0x61, 0x74, 0x65, 0x41, 0x67, + 0x65, 0x6e, 0x74, 0x47, 0x72, 0x6f, 0x75, 0x70, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x2d, 0x0a, + 0x29, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x47, 0x45, + 0x4e, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, + 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x2b, 0x0a, 0x27, + 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, + 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, + 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, 0x12, 0x28, 0x0a, 0x24, 0x41, 0x55, 0x54, + 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x47, + 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, + 0x45, 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, - 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x54, 0x41, 0x52, 0x54, 0x45, 0x44, 0x10, 0x01, - 0x12, 0x28, 0x0a, 0x24, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, - 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, - 0x45, 0x5f, 0x41, 0x43, 0x54, 0x49, 0x56, 0x45, 0x10, 0x02, 0x12, 0x26, 0x0a, 0x22, 0x41, 0x55, - 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, - 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x4f, 0x4e, 0x45, - 0x10, 0x03, 0x12, 0x2c, 0x0a, 0x28, 0x41, 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, - 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, - 0x41, 0x54, 0x45, 0x5f, 0x52, 0x4f, 0x4c, 0x4c, 0x45, 0x44, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x04, - 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, - 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, - 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, - 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, - 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x4f, 0x4e, 0x45, 0x10, 0x03, 0x12, 0x2c, 0x0a, 0x28, 0x41, + 0x55, 0x54, 0x4f, 0x5f, 0x55, 0x50, 0x44, 0x41, 0x54, 0x45, 0x5f, 0x41, 0x47, 0x45, 0x4e, 0x54, + 0x5f, 0x47, 0x52, 0x4f, 0x55, 0x50, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x52, 0x4f, 0x4c, + 0x4c, 0x45, 0x44, 0x42, 0x41, 0x43, 0x4b, 0x10, 0x04, 0x42, 0x56, 0x5a, 0x54, 0x67, 0x69, 0x74, + 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, + 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, + 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, + 0x61, 0x74, 0x65, 0x2f, 0x76, 0x31, 0x3b, 0x61, 0x75, 0x74, 0x6f, 0x75, 0x70, 0x64, 0x61, 0x74, + 0x65, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1269,25 +1283,26 @@ var file_teleport_autoupdate_v1_autoupdate_proto_depIdxs = []int32{ 15, // 0: teleport.autoupdate.v1.AutoUpdateConfig.metadata:type_name -> teleport.header.v1.Metadata 2, // 1: teleport.autoupdate.v1.AutoUpdateConfig.spec:type_name -> teleport.autoupdate.v1.AutoUpdateConfigSpec 3, // 2: teleport.autoupdate.v1.AutoUpdateConfigSpec.tools:type_name -> teleport.autoupdate.v1.AutoUpdateConfigSpecTools - 16, // 3: teleport.autoupdate.v1.AutoUpdateConfigSpecAgents.maintenance_window_duration:type_name -> google.protobuf.Duration - 5, // 4: teleport.autoupdate.v1.AutoUpdateConfigSpecAgents.agent_schedules:type_name -> teleport.autoupdate.v1.AgentAutoUpdateSchedules - 6, // 5: teleport.autoupdate.v1.AgentAutoUpdateSchedules.regular:type_name -> teleport.autoupdate.v1.AgentAutoUpdateGroup - 15, // 6: teleport.autoupdate.v1.AutoUpdateVersion.metadata:type_name -> teleport.header.v1.Metadata - 8, // 7: teleport.autoupdate.v1.AutoUpdateVersion.spec:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpec - 9, // 8: teleport.autoupdate.v1.AutoUpdateVersionSpec.tools:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpecTools - 10, // 9: teleport.autoupdate.v1.AutoUpdateVersionSpec.agents:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpecAgents - 15, // 10: teleport.autoupdate.v1.AutoUpdateAgentRollout.metadata:type_name -> teleport.header.v1.Metadata - 12, // 11: teleport.autoupdate.v1.AutoUpdateAgentRollout.spec:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRolloutSpec - 13, // 12: teleport.autoupdate.v1.AutoUpdateAgentRollout.status:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRolloutStatus - 14, // 13: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatus.groups:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup - 17, // 14: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup.start_time:type_name -> google.protobuf.Timestamp - 0, // 15: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup.state:type_name -> teleport.autoupdate.v1.AutoUpdateAgentGroupState - 17, // 16: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup.last_update_time:type_name -> google.protobuf.Timestamp - 17, // [17:17] is the sub-list for method output_type - 17, // [17:17] is the sub-list for method input_type - 17, // [17:17] is the sub-list for extension type_name - 17, // [17:17] is the sub-list for extension extendee - 0, // [0:17] is the sub-list for field type_name + 4, // 3: teleport.autoupdate.v1.AutoUpdateConfigSpec.agents:type_name -> teleport.autoupdate.v1.AutoUpdateConfigSpecAgents + 16, // 4: teleport.autoupdate.v1.AutoUpdateConfigSpecAgents.maintenance_window_duration:type_name -> google.protobuf.Duration + 5, // 5: teleport.autoupdate.v1.AutoUpdateConfigSpecAgents.schedules:type_name -> teleport.autoupdate.v1.AgentAutoUpdateSchedules + 6, // 6: teleport.autoupdate.v1.AgentAutoUpdateSchedules.regular:type_name -> teleport.autoupdate.v1.AgentAutoUpdateGroup + 15, // 7: teleport.autoupdate.v1.AutoUpdateVersion.metadata:type_name -> teleport.header.v1.Metadata + 8, // 8: teleport.autoupdate.v1.AutoUpdateVersion.spec:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpec + 9, // 9: teleport.autoupdate.v1.AutoUpdateVersionSpec.tools:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpecTools + 10, // 10: teleport.autoupdate.v1.AutoUpdateVersionSpec.agents:type_name -> teleport.autoupdate.v1.AutoUpdateVersionSpecAgents + 15, // 11: teleport.autoupdate.v1.AutoUpdateAgentRollout.metadata:type_name -> teleport.header.v1.Metadata + 12, // 12: teleport.autoupdate.v1.AutoUpdateAgentRollout.spec:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRolloutSpec + 13, // 13: teleport.autoupdate.v1.AutoUpdateAgentRollout.status:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRolloutStatus + 14, // 14: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatus.groups:type_name -> teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup + 17, // 15: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup.start_time:type_name -> google.protobuf.Timestamp + 0, // 16: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup.state:type_name -> teleport.autoupdate.v1.AutoUpdateAgentGroupState + 17, // 17: teleport.autoupdate.v1.AutoUpdateAgentRolloutStatusGroup.last_update_time:type_name -> google.protobuf.Timestamp + 18, // [18:18] is the sub-list for method output_type + 18, // [18:18] is the sub-list for method input_type + 18, // [18:18] is the sub-list for extension type_name + 18, // [18:18] is the sub-list for extension extendee + 0, // [0:18] is the sub-list for field type_name } func init() { file_teleport_autoupdate_v1_autoupdate_proto_init() } diff --git a/api/proto/teleport/autoupdate/v1/autoupdate.proto b/api/proto/teleport/autoupdate/v1/autoupdate.proto index 8bd11fd8cdeec..5c7527d0177cf 100644 --- a/api/proto/teleport/autoupdate/v1/autoupdate.proto +++ b/api/proto/teleport/autoupdate/v1/autoupdate.proto @@ -38,6 +38,7 @@ message AutoUpdateConfigSpec { reserved 1; reserved "tools_autoupdate"; // ToolsAutoupdate is replaced by tools.mode. AutoUpdateConfigSpecTools tools = 2; + AutoUpdateConfigSpecAgents agents = 3; } // AutoUpdateConfigSpecTools encodes the parameters for client tools auto updates. @@ -48,6 +49,8 @@ message AutoUpdateConfigSpecTools { // AutoUpdateConfigSpecAgents encodes the parameters of automatic agent updates. message AutoUpdateConfigSpecAgents { + reserved 5; + reserved "agent_schedules"; // mode specifies whether agent autoupdates are enabled, disabled, or paused. string mode = 1; // strategy to use for updating the agents. @@ -56,8 +59,8 @@ message AutoUpdateConfigSpecAgents { // Once the window is over, the group transitions to the done state. Existing agents won't be updated until the next // maintenance window. google.protobuf.Duration maintenance_window_duration = 3; - // agent_schedules specifies schedules for updates of grouped agents. - AgentAutoUpdateSchedules agent_schedules = 5; + // schedules specifies schedules for updates of grouped agents. + AgentAutoUpdateSchedules schedules = 6; } // AgentAutoUpdateSchedules specifies update scheduled for grouped agents. From 492379c86d2dada1f8e15e6ae40a1492aac56d79 Mon Sep 17 00:00:00 2001 From: Trent Clarke Date: Wed, 23 Oct 2024 17:06:01 +1100 Subject: [PATCH 25/70] Provisioning resource updates (#47782) * Provisioning resource updates * Address @flyinghermit's review concerns * Comment update --- .../provisioning/v1/provisioning.pb.go | 82 +++++++++++++------ .../provisioning/v1/provisioning.proto | 12 +++ 2 files changed, 68 insertions(+), 26 deletions(-) diff --git a/api/gen/proto/go/teleport/provisioning/v1/provisioning.pb.go b/api/gen/proto/go/teleport/provisioning/v1/provisioning.pb.go index 1c6cdf10aa8bd..910d748d230ea 100644 --- a/api/gen/proto/go/teleport/provisioning/v1/provisioning.pb.go +++ b/api/gen/proto/go/teleport/provisioning/v1/provisioning.pb.go @@ -328,6 +328,16 @@ type PrincipalStateStatus struct { LastProvisioned *timestamppb.Timestamp `protobuf:"bytes,3,opt,name=last_provisioned,json=lastProvisioned,proto3" json:"last_provisioned,omitempty"` // Error holds a description of the last provisioing error, if any. Error string `protobuf:"bytes,4,opt,name=error,proto3" json:"error,omitempty"` + // Revision holds the revision of the principal record provisioned into the + // downstream system. Used to assert that the latest revision of the principal + // is provisioned downstream and detect changes in the principal that require + // re-provisoning. + ProvisionedPrincipalRevision string `protobuf:"bytes,6,opt,name=provisioned_principal_revision,json=provisionedPrincipalRevision,proto3" json:"provisioned_principal_revision,omitempty"` + // ActiveLocks holds the list of known active locks on the principal. Used to + // store the lock state across restarts of Teleport in order to detect state + // changes that may happen while Teleport is not running (e.g. a storage + // backend deleting an expired lock record while Teleport is offline) + ActiveLocks []string `protobuf:"bytes,7,rep,name=active_locks,json=activeLocks,proto3" json:"active_locks,omitempty"` } func (x *PrincipalStateStatus) Reset() { @@ -388,6 +398,20 @@ func (x *PrincipalStateStatus) GetError() string { return "" } +func (x *PrincipalStateStatus) GetProvisionedPrincipalRevision() string { + if x != nil { + return x.ProvisionedPrincipalRevision + } + return "" +} + +func (x *PrincipalStateStatus) GetActiveLocks() []string { + if x != nil { + return x.ActiveLocks + } + return nil +} + var File_teleport_provisioning_v1_provisioning_proto protoreflect.FileDescriptor var file_teleport_provisioning_v1_provisioning_proto_rawDesc = []byte{ @@ -428,7 +452,7 @@ var file_teleport_provisioning_v1_provisioning_proto_rawDesc = []byte{ 0x69, 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x52, 0x0d, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x21, 0x0a, 0x0c, 0x70, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x69, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x09, 0x52, 0x0b, 0x70, - 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x49, 0x64, 0x22, 0xfe, 0x01, 0x0a, 0x14, 0x50, + 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x49, 0x64, 0x22, 0xe7, 0x02, 0x0a, 0x14, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x53, 0x74, 0x61, 0x74, 0x65, 0x53, 0x74, 0x61, 0x74, 0x75, 0x73, 0x12, 0x5a, 0x0a, 0x12, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x74, 0x61, 0x74, 0x65, 0x18, 0x05, 0x20, 0x01, 0x28, 0x0e, 0x32, @@ -443,31 +467,37 @@ var file_teleport_provisioning_v1_provisioning_proto_rawDesc = []byte{ 0x67, 0x6c, 0x65, 0x2e, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x62, 0x75, 0x66, 0x2e, 0x54, 0x69, 0x6d, 0x65, 0x73, 0x74, 0x61, 0x6d, 0x70, 0x52, 0x0f, 0x6c, 0x61, 0x73, 0x74, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x4a, 0x04, 0x08, - 0x01, 0x10, 0x02, 0x52, 0x06, 0x73, 0x74, 0x61, 0x74, 0x75, 0x73, 0x2a, 0x99, 0x01, 0x0a, 0x11, - 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, - 0x65, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, - 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, - 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, - 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x4c, - 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, - 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, - 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x02, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x56, 0x49, - 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, - 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x03, 0x2a, 0x68, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6e, 0x63, - 0x69, 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x49, 0x4e, - 0x43, 0x49, 0x50, 0x41, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, - 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x49, 0x4e, - 0x43, 0x49, 0x50, 0x41, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, - 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41, 0x4c, 0x5f, 0x54, - 0x59, 0x50, 0x45, 0x5f, 0x41, 0x43, 0x43, 0x45, 0x53, 0x53, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, - 0x02, 0x42, 0x5c, 0x5a, 0x5a, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, - 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, - 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, - 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, - 0x3b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x76, 0x31, 0x62, - 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x18, 0x04, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x12, 0x44, 0x0a, + 0x1e, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x65, 0x64, 0x5f, 0x70, 0x72, 0x69, + 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x5f, 0x72, 0x65, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, 0x18, + 0x06, 0x20, 0x01, 0x28, 0x09, 0x52, 0x1c, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, 0x6f, 0x6e, + 0x65, 0x64, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x52, 0x65, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x12, 0x21, 0x0a, 0x0c, 0x61, 0x63, 0x74, 0x69, 0x76, 0x65, 0x5f, 0x6c, 0x6f, + 0x63, 0x6b, 0x73, 0x18, 0x07, 0x20, 0x03, 0x28, 0x09, 0x52, 0x0b, 0x61, 0x63, 0x74, 0x69, 0x76, + 0x65, 0x4c, 0x6f, 0x63, 0x6b, 0x73, 0x4a, 0x04, 0x08, 0x01, 0x10, 0x02, 0x52, 0x06, 0x73, 0x74, + 0x61, 0x74, 0x75, 0x73, 0x2a, 0x99, 0x01, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x76, 0x69, 0x73, 0x69, + 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x53, 0x74, 0x61, 0x74, 0x65, 0x12, 0x22, 0x0a, 0x1e, 0x50, 0x52, + 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, + 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, 0x00, 0x12, 0x1c, + 0x0a, 0x18, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, + 0x54, 0x41, 0x54, 0x45, 0x5f, 0x53, 0x54, 0x41, 0x4c, 0x45, 0x10, 0x01, 0x12, 0x22, 0x0a, 0x1e, + 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, 0x5f, 0x53, 0x54, 0x41, + 0x54, 0x45, 0x5f, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x45, 0x44, 0x10, 0x02, + 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x4f, 0x56, 0x49, 0x53, 0x49, 0x4f, 0x4e, 0x49, 0x4e, 0x47, + 0x5f, 0x53, 0x54, 0x41, 0x54, 0x45, 0x5f, 0x44, 0x45, 0x4c, 0x45, 0x54, 0x45, 0x44, 0x10, 0x03, + 0x2a, 0x68, 0x0a, 0x0d, 0x50, 0x72, 0x69, 0x6e, 0x63, 0x69, 0x70, 0x61, 0x6c, 0x54, 0x79, 0x70, + 0x65, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41, 0x4c, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x4e, 0x53, 0x50, 0x45, 0x43, 0x49, 0x46, 0x49, 0x45, 0x44, 0x10, + 0x00, 0x12, 0x17, 0x0a, 0x13, 0x50, 0x52, 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41, 0x4c, 0x5f, 0x54, + 0x59, 0x50, 0x45, 0x5f, 0x55, 0x53, 0x45, 0x52, 0x10, 0x01, 0x12, 0x1e, 0x0a, 0x1a, 0x50, 0x52, + 0x49, 0x4e, 0x43, 0x49, 0x50, 0x41, 0x4c, 0x5f, 0x54, 0x59, 0x50, 0x45, 0x5f, 0x41, 0x43, 0x43, + 0x45, 0x53, 0x53, 0x5f, 0x4c, 0x49, 0x53, 0x54, 0x10, 0x02, 0x42, 0x5c, 0x5a, 0x5a, 0x67, 0x69, + 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, + 0x61, 0x70, 0x69, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, + 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x2f, 0x76, 0x31, 0x3b, 0x70, 0x72, 0x6f, 0x76, 0x69, 0x73, + 0x69, 0x6f, 0x6e, 0x69, 0x6e, 0x67, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( diff --git a/api/proto/teleport/provisioning/v1/provisioning.proto b/api/proto/teleport/provisioning/v1/provisioning.proto index c0501fc8e55c1..4f1e8e0686d70 100644 --- a/api/proto/teleport/provisioning/v1/provisioning.proto +++ b/api/proto/teleport/provisioning/v1/provisioning.proto @@ -104,4 +104,16 @@ message PrincipalStateStatus { // Error holds a description of the last provisioing error, if any. string error = 4; + + // Revision holds the revision of the principal record provisioned into the + // downstream system. Used to assert that the latest revision of the principal + // is provisioned downstream and detect changes in the principal that require + // re-provisoning. + string provisioned_principal_revision = 6; + + // ActiveLocks holds the list of known active locks on the principal. Used to + // store the lock state across restarts of Teleport in order to detect state + // changes that may happen while Teleport is not running (e.g. a storage + // backend deleting an expired lock record while Teleport is offline) + repeated string active_locks = 7; } From 22b50149df13ac1326d4a8ae551714aa9548324f Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Wed, 23 Oct 2024 09:12:33 +0200 Subject: [PATCH 26/70] Support hardware keys prompts in Connect (#47652) * Add new protos for hardware key prompts * Implement hardware key prompts on the daemon side * Show prompts in the UI * `PromptHardwareKeyPINAsk` -> `PromptHardwareKeyPIN` * Improve proto docs * `PromptHardwareKeySlotOverwrite` -> `ConfirmHardwareKeySlotOverwrite` * Fix typo * Remove unnecessary `form` * Pass an enum to `AskPIN` instead of the entire message * Remove an invalid restriction of PIN/PUK to numbers only * Improve the copy --- api/utils/keys/cliprompt.go | 6 +- api/utils/keys/yubikey.go | 4 +- api/utils/keys/yubikey_common.go | 13 +- .../lib/teleterm/v1/tshd_events_service.pb.go | 703 +++++++++++++++--- .../v1/tshd_events_service_grpc.pb.go | 168 +++++ .../v1/tshd_events_service_pb.client.ts | 80 +- .../v1/tshd_events_service_pb.grpc-server.ts | 76 ++ .../lib/teleterm/v1/tshd_events_service_pb.ts | 505 +++++++++++++ lib/teleterm/daemon/hardwarekeyprompt.go | 108 +++ lib/teleterm/teleterm.go | 8 +- .../lib/teleterm/v1/tshd_events_service.proto | 66 ++ .../src/services/tshd/interceptors.ts | 2 +- .../teleterm/src/services/tshdEvents/index.ts | 12 + .../teleterm/src/ui/ModalsHost/ModalsHost.tsx | 51 ++ .../ModalsHost/modals/HardwareKeys/AskPin.tsx | 98 +++ .../modals/HardwareKeys/ChangePin.tsx | 257 +++++++ .../modals/HardwareKeys/CommonHeader.tsx | 46 ++ .../modals/HardwareKeys/OverwriteSlot.tsx | 68 ++ .../ModalsHost/modals/HardwareKeys/Touch.tsx | 63 ++ .../modals/HardwareKeys/index.story.tsx | 93 +++ .../ModalsHost/modals/HardwareKeys/index.ts | 22 + .../src/ui/services/modals/modalsService.ts | 31 + web/packages/teleterm/src/ui/tshdEvents.ts | 132 ++++ 23 files changed, 2498 insertions(+), 114 deletions(-) create mode 100644 lib/teleterm/daemon/hardwarekeyprompt.go create mode 100644 web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/AskPin.tsx create mode 100644 web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/ChangePin.tsx create mode 100644 web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/CommonHeader.tsx create mode 100644 web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/OverwriteSlot.tsx create mode 100644 web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/Touch.tsx create mode 100644 web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/index.story.tsx create mode 100644 web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/index.ts diff --git a/api/utils/keys/cliprompt.go b/api/utils/keys/cliprompt.go index 8ac27790efe41..7dce20d211a7c 100644 --- a/api/utils/keys/cliprompt.go +++ b/api/utils/keys/cliprompt.go @@ -29,7 +29,11 @@ import ( type cliPrompt struct{} -func (c *cliPrompt) AskPIN(ctx context.Context, message string) (string, error) { +func (c *cliPrompt) AskPIN(ctx context.Context, requirement PINPromptRequirement) (string, error) { + message := "Enter your YubiKey PIV PIN" + if requirement == PINOptional { + message = "Enter your YubiKey PIV PIN [blank to use default PIN]" + } password, err := prompt.Password(ctx, os.Stderr, prompt.Stdin(), message) return password, trace.Wrap(err) } diff --git a/api/utils/keys/yubikey.go b/api/utils/keys/yubikey.go index 790d9a2a626b4..15e12bfc7e3f6 100644 --- a/api/utils/keys/yubikey.go +++ b/api/utils/keys/yubikey.go @@ -374,7 +374,7 @@ func (y *YubiKeyPrivateKey) sign(ctx context.Context, rand io.Reader, digest []b defer touchPromptDelayTimer.Reset(signTouchPromptDelay) } } - pass, err := y.prompt.AskPIN(ctx, "Enter your YubiKey PIV PIN") + pass, err := y.prompt.AskPIN(ctx, PINRequired) return pass, trace.Wrap(err) } @@ -666,7 +666,7 @@ func (y *YubiKey) SetPIN(oldPin, newPin string) error { // If the user provides the default PIN, they will be prompted to set a // non-default PIN and PUK before continuing. func (y *YubiKey) checkOrSetPIN(ctx context.Context) error { - pin, err := y.prompt.AskPIN(ctx, "Enter your YubiKey PIV PIN [blank to use default PIN]") + pin, err := y.prompt.AskPIN(ctx, PINOptional) if err != nil { return trace.Wrap(err) } diff --git a/api/utils/keys/yubikey_common.go b/api/utils/keys/yubikey_common.go index 78ffd1f86c918..5ed36f814580d 100644 --- a/api/utils/keys/yubikey_common.go +++ b/api/utils/keys/yubikey_common.go @@ -22,7 +22,8 @@ import ( // HardwareKeyPrompt provides methods to interact with a YubiKey hardware key. type HardwareKeyPrompt interface { // AskPIN prompts the user for a PIN. - AskPIN(ctx context.Context, message string) (string, error) + // The requirement tells if the PIN is required or optional. + AskPIN(ctx context.Context, requirement PINPromptRequirement) (string, error) // Touch prompts the user to touch the hardware key. Touch(ctx context.Context) error // ChangePIN asks for a new PIN. @@ -35,6 +36,16 @@ type HardwareKeyPrompt interface { ConfirmSlotOverwrite(ctx context.Context, message string) (bool, error) } +// PINPromptRequirement specifies whether a PIN is required. +type PINPromptRequirement int + +const ( + // PINOptional allows the user to proceed without entering a PIN. + PINOptional PINPromptRequirement = iota + // PINRequired enforces that a PIN must be entered to proceed. + PINRequired +) + // PINAndPUK describes a response returned from HardwareKeyPrompt.ChangePIN. type PINAndPUK struct { // New PIN set by the user. diff --git a/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service.pb.go index 4056f12e2433d..d9d0ce6c4cf5b 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service.pb.go @@ -742,6 +742,405 @@ func (x *PromptMFAResponse) GetTotpCode() string { return "" } +// Request for PromptHardwareKeyPIN. +type PromptHardwareKeyPINRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RootClusterUri string `protobuf:"bytes,1,opt,name=root_cluster_uri,json=rootClusterUri,proto3" json:"root_cluster_uri,omitempty"` + // Specifies if a PIN is optional, allowing the user to set it up if left empty. + PinOptional bool `protobuf:"varint,2,opt,name=pin_optional,json=pinOptional,proto3" json:"pin_optional,omitempty"` +} + +func (x *PromptHardwareKeyPINRequest) Reset() { + *x = PromptHardwareKeyPINRequest{} + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[12] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PromptHardwareKeyPINRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PromptHardwareKeyPINRequest) ProtoMessage() {} + +func (x *PromptHardwareKeyPINRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[12] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PromptHardwareKeyPINRequest.ProtoReflect.Descriptor instead. +func (*PromptHardwareKeyPINRequest) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{12} +} + +func (x *PromptHardwareKeyPINRequest) GetRootClusterUri() string { + if x != nil { + return x.RootClusterUri + } + return "" +} + +func (x *PromptHardwareKeyPINRequest) GetPinOptional() bool { + if x != nil { + return x.PinOptional + } + return false +} + +// Response for PromptHardwareKeyPIN. +type PromptHardwareKeyPINResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // pin as inputted by the user in the Electron app. + Pin string `protobuf:"bytes,1,opt,name=pin,proto3" json:"pin,omitempty"` +} + +func (x *PromptHardwareKeyPINResponse) Reset() { + *x = PromptHardwareKeyPINResponse{} + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[13] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PromptHardwareKeyPINResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PromptHardwareKeyPINResponse) ProtoMessage() {} + +func (x *PromptHardwareKeyPINResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[13] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PromptHardwareKeyPINResponse.ProtoReflect.Descriptor instead. +func (*PromptHardwareKeyPINResponse) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{13} +} + +func (x *PromptHardwareKeyPINResponse) GetPin() string { + if x != nil { + return x.Pin + } + return "" +} + +// Request for PromptHardwareKeyTouchRequest. +type PromptHardwareKeyTouchRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RootClusterUri string `protobuf:"bytes,1,opt,name=root_cluster_uri,json=rootClusterUri,proto3" json:"root_cluster_uri,omitempty"` +} + +func (x *PromptHardwareKeyTouchRequest) Reset() { + *x = PromptHardwareKeyTouchRequest{} + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[14] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PromptHardwareKeyTouchRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PromptHardwareKeyTouchRequest) ProtoMessage() {} + +func (x *PromptHardwareKeyTouchRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[14] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PromptHardwareKeyTouchRequest.ProtoReflect.Descriptor instead. +func (*PromptHardwareKeyTouchRequest) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{14} +} + +func (x *PromptHardwareKeyTouchRequest) GetRootClusterUri() string { + if x != nil { + return x.RootClusterUri + } + return "" +} + +// Response for PromptHardwareKeyTouch. +type PromptHardwareKeyTouchResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields +} + +func (x *PromptHardwareKeyTouchResponse) Reset() { + *x = PromptHardwareKeyTouchResponse{} + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[15] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PromptHardwareKeyTouchResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PromptHardwareKeyTouchResponse) ProtoMessage() {} + +func (x *PromptHardwareKeyTouchResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[15] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PromptHardwareKeyTouchResponse.ProtoReflect.Descriptor instead. +func (*PromptHardwareKeyTouchResponse) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{15} +} + +// Response for PromptHardwareKeyPINChange. +type PromptHardwareKeyPINChangeRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RootClusterUri string `protobuf:"bytes,1,opt,name=root_cluster_uri,json=rootClusterUri,proto3" json:"root_cluster_uri,omitempty"` +} + +func (x *PromptHardwareKeyPINChangeRequest) Reset() { + *x = PromptHardwareKeyPINChangeRequest{} + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[16] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PromptHardwareKeyPINChangeRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PromptHardwareKeyPINChangeRequest) ProtoMessage() {} + +func (x *PromptHardwareKeyPINChangeRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[16] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PromptHardwareKeyPINChangeRequest.ProtoReflect.Descriptor instead. +func (*PromptHardwareKeyPINChangeRequest) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{16} +} + +func (x *PromptHardwareKeyPINChangeRequest) GetRootClusterUri() string { + if x != nil { + return x.RootClusterUri + } + return "" +} + +// Response for PromptHardwareKeyPINChange. +type PromptHardwareKeyPINChangeResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // New pin set by the user. + Pin string `protobuf:"bytes,1,opt,name=pin,proto3" json:"pin,omitempty"` + // PUK is needed to change the PIN. + // This is a new PUK if it has not been changed from the default PUK. + Puk string `protobuf:"bytes,2,opt,name=puk,proto3" json:"puk,omitempty"` + // puk_changed is true if the user changed the default PUK. + PukChanged bool `protobuf:"varint,3,opt,name=puk_changed,json=pukChanged,proto3" json:"puk_changed,omitempty"` +} + +func (x *PromptHardwareKeyPINChangeResponse) Reset() { + *x = PromptHardwareKeyPINChangeResponse{} + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[17] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *PromptHardwareKeyPINChangeResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*PromptHardwareKeyPINChangeResponse) ProtoMessage() {} + +func (x *PromptHardwareKeyPINChangeResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[17] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use PromptHardwareKeyPINChangeResponse.ProtoReflect.Descriptor instead. +func (*PromptHardwareKeyPINChangeResponse) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{17} +} + +func (x *PromptHardwareKeyPINChangeResponse) GetPin() string { + if x != nil { + return x.Pin + } + return "" +} + +func (x *PromptHardwareKeyPINChangeResponse) GetPuk() string { + if x != nil { + return x.Puk + } + return "" +} + +func (x *PromptHardwareKeyPINChangeResponse) GetPukChanged() bool { + if x != nil { + return x.PukChanged + } + return false +} + +// Request for ConfirmHardwareKeySlotOverwrite. +type ConfirmHardwareKeySlotOverwriteRequest struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + RootClusterUri string `protobuf:"bytes,1,opt,name=root_cluster_uri,json=rootClusterUri,proto3" json:"root_cluster_uri,omitempty"` + // Message to display in the prompt. + Message string `protobuf:"bytes,2,opt,name=message,proto3" json:"message,omitempty"` +} + +func (x *ConfirmHardwareKeySlotOverwriteRequest) Reset() { + *x = ConfirmHardwareKeySlotOverwriteRequest{} + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[18] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ConfirmHardwareKeySlotOverwriteRequest) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfirmHardwareKeySlotOverwriteRequest) ProtoMessage() {} + +func (x *ConfirmHardwareKeySlotOverwriteRequest) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[18] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConfirmHardwareKeySlotOverwriteRequest.ProtoReflect.Descriptor instead. +func (*ConfirmHardwareKeySlotOverwriteRequest) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{18} +} + +func (x *ConfirmHardwareKeySlotOverwriteRequest) GetRootClusterUri() string { + if x != nil { + return x.RootClusterUri + } + return "" +} + +func (x *ConfirmHardwareKeySlotOverwriteRequest) GetMessage() string { + if x != nil { + return x.Message + } + return "" +} + +// Response for ConfirmHardwareKeySlotOverwrite. +type ConfirmHardwareKeySlotOverwriteResponse struct { + state protoimpl.MessageState + sizeCache protoimpl.SizeCache + unknownFields protoimpl.UnknownFields + + // If true, the slot will be overridden. + Confirmed bool `protobuf:"varint,1,opt,name=confirmed,proto3" json:"confirmed,omitempty"` +} + +func (x *ConfirmHardwareKeySlotOverwriteResponse) Reset() { + *x = ConfirmHardwareKeySlotOverwriteResponse{} + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[19] + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + ms.StoreMessageInfo(mi) +} + +func (x *ConfirmHardwareKeySlotOverwriteResponse) String() string { + return protoimpl.X.MessageStringOf(x) +} + +func (*ConfirmHardwareKeySlotOverwriteResponse) ProtoMessage() {} + +func (x *ConfirmHardwareKeySlotOverwriteResponse) ProtoReflect() protoreflect.Message { + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[19] + if x != nil { + ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) + if ms.LoadMessageInfo() == nil { + ms.StoreMessageInfo(mi) + } + return ms + } + return mi.MessageOf(x) +} + +// Deprecated: Use ConfirmHardwareKeySlotOverwriteResponse.ProtoReflect.Descriptor instead. +func (*ConfirmHardwareKeySlotOverwriteResponse) Descriptor() ([]byte, []int) { + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{19} +} + +func (x *ConfirmHardwareKeySlotOverwriteResponse) GetConfirmed() bool { + if x != nil { + return x.Confirmed + } + return false +} + // Request for GetUsageReportingSettings. type GetUsageReportingSettingsRequest struct { state protoimpl.MessageState @@ -751,7 +1150,7 @@ type GetUsageReportingSettingsRequest struct { func (x *GetUsageReportingSettingsRequest) Reset() { *x = GetUsageReportingSettingsRequest{} - mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[12] + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[20] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -763,7 +1162,7 @@ func (x *GetUsageReportingSettingsRequest) String() string { func (*GetUsageReportingSettingsRequest) ProtoMessage() {} func (x *GetUsageReportingSettingsRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[12] + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[20] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -776,7 +1175,7 @@ func (x *GetUsageReportingSettingsRequest) ProtoReflect() protoreflect.Message { // Deprecated: Use GetUsageReportingSettingsRequest.ProtoReflect.Descriptor instead. func (*GetUsageReportingSettingsRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{12} + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{20} } // Response for GetUsageReportingSettings. @@ -790,7 +1189,7 @@ type GetUsageReportingSettingsResponse struct { func (x *GetUsageReportingSettingsResponse) Reset() { *x = GetUsageReportingSettingsResponse{} - mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[13] + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[21] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -802,7 +1201,7 @@ func (x *GetUsageReportingSettingsResponse) String() string { func (*GetUsageReportingSettingsResponse) ProtoMessage() {} func (x *GetUsageReportingSettingsResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[13] + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[21] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -815,7 +1214,7 @@ func (x *GetUsageReportingSettingsResponse) ProtoReflect() protoreflect.Message // Deprecated: Use GetUsageReportingSettingsResponse.ProtoReflect.Descriptor instead. func (*GetUsageReportingSettingsResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{13} + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{21} } func (x *GetUsageReportingSettingsResponse) GetUsageReportingSettings() *UsageReportingSettings { @@ -837,7 +1236,7 @@ type UsageReportingSettings struct { func (x *UsageReportingSettings) Reset() { *x = UsageReportingSettings{} - mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[14] + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[22] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -849,7 +1248,7 @@ func (x *UsageReportingSettings) String() string { func (*UsageReportingSettings) ProtoMessage() {} func (x *UsageReportingSettings) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[14] + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[22] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -862,7 +1261,7 @@ func (x *UsageReportingSettings) ProtoReflect() protoreflect.Message { // Deprecated: Use UsageReportingSettings.ProtoReflect.Descriptor instead. func (*UsageReportingSettings) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{14} + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{22} } func (x *UsageReportingSettings) GetEnabled() bool { @@ -885,7 +1284,7 @@ type ReportUnexpectedVnetShutdownRequest struct { func (x *ReportUnexpectedVnetShutdownRequest) Reset() { *x = ReportUnexpectedVnetShutdownRequest{} - mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[15] + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[23] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -897,7 +1296,7 @@ func (x *ReportUnexpectedVnetShutdownRequest) String() string { func (*ReportUnexpectedVnetShutdownRequest) ProtoMessage() {} func (x *ReportUnexpectedVnetShutdownRequest) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[15] + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[23] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -910,7 +1309,7 @@ func (x *ReportUnexpectedVnetShutdownRequest) ProtoReflect() protoreflect.Messag // Deprecated: Use ReportUnexpectedVnetShutdownRequest.ProtoReflect.Descriptor instead. func (*ReportUnexpectedVnetShutdownRequest) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{15} + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{23} } func (x *ReportUnexpectedVnetShutdownRequest) GetError() string { @@ -929,7 +1328,7 @@ type ReportUnexpectedVnetShutdownResponse struct { func (x *ReportUnexpectedVnetShutdownResponse) Reset() { *x = ReportUnexpectedVnetShutdownResponse{} - mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[16] + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[24] ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) ms.StoreMessageInfo(mi) } @@ -941,7 +1340,7 @@ func (x *ReportUnexpectedVnetShutdownResponse) String() string { func (*ReportUnexpectedVnetShutdownResponse) ProtoMessage() {} func (x *ReportUnexpectedVnetShutdownResponse) ProtoReflect() protoreflect.Message { - mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[16] + mi := &file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes[24] if x != nil { ms := protoimpl.X.MessageStateOf(protoimpl.Pointer(x)) if ms.LoadMessageInfo() == nil { @@ -954,7 +1353,7 @@ func (x *ReportUnexpectedVnetShutdownResponse) ProtoReflect() protoreflect.Messa // Deprecated: Use ReportUnexpectedVnetShutdownResponse.ProtoReflect.Descriptor instead. func (*ReportUnexpectedVnetShutdownResponse) Descriptor() ([]byte, []int) { - return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{16} + return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP(), []int{24} } var File_teleport_lib_teleterm_v1_tshd_events_service_proto protoreflect.FileDescriptor @@ -1056,85 +1455,163 @@ var file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDesc = []byte{ 0x5f, 0x75, 0x72, 0x69, 0x22, 0x30, 0x0a, 0x11, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4d, 0x46, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1b, 0x0a, 0x09, 0x74, 0x6f, 0x74, 0x70, 0x5f, 0x63, 0x6f, 0x64, 0x65, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x08, 0x74, 0x6f, - 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x22, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x55, 0x73, 0x61, - 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, - 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x21, 0x47, - 0x65, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, - 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, - 0x12, 0x6a, 0x0a, 0x18, 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x69, 0x6e, 0x67, 0x5f, 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, - 0x28, 0x0b, 0x32, 0x30, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, - 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, + 0x74, 0x70, 0x43, 0x6f, 0x64, 0x65, 0x22, 0x6a, 0x0a, 0x1b, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, + 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x49, 0x4e, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x72, 0x6f, 0x6f, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x72, 0x69, 0x12, + 0x21, 0x0a, 0x0c, 0x70, 0x69, 0x6e, 0x5f, 0x6f, 0x70, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x08, 0x52, 0x0b, 0x70, 0x69, 0x6e, 0x4f, 0x70, 0x74, 0x69, 0x6f, 0x6e, + 0x61, 0x6c, 0x22, 0x30, 0x0a, 0x1c, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, + 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x49, 0x4e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x6e, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x03, 0x70, 0x69, 0x6e, 0x22, 0x49, 0x0a, 0x1d, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, + 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x72, 0x6f, 0x6f, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x72, 0x69, 0x22, + 0x20, 0x0a, 0x1e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, + 0x65, 0x4b, 0x65, 0x79, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x22, 0x4d, 0x0a, 0x21, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, 0x77, + 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x49, 0x4e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x63, + 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x0e, 0x72, 0x6f, 0x6f, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x72, 0x69, + 0x22, 0x69, 0x0a, 0x22, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, + 0x72, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x49, 0x4e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, 0x65, + 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x69, 0x6e, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x69, 0x6e, 0x12, 0x10, 0x0a, 0x03, 0x70, 0x75, 0x6b, 0x18, + 0x02, 0x20, 0x01, 0x28, 0x09, 0x52, 0x03, 0x70, 0x75, 0x6b, 0x12, 0x1f, 0x0a, 0x0b, 0x70, 0x75, + 0x6b, 0x5f, 0x63, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x18, 0x03, 0x20, 0x01, 0x28, 0x08, 0x52, + 0x0a, 0x70, 0x75, 0x6b, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x64, 0x22, 0x6c, 0x0a, 0x26, 0x43, + 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, + 0x79, 0x53, 0x6c, 0x6f, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, + 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x28, 0x0a, 0x10, 0x72, 0x6f, 0x6f, 0x74, 0x5f, 0x63, 0x6c, + 0x75, 0x73, 0x74, 0x65, 0x72, 0x5f, 0x75, 0x72, 0x69, 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, + 0x0e, 0x72, 0x6f, 0x6f, 0x74, 0x43, 0x6c, 0x75, 0x73, 0x74, 0x65, 0x72, 0x55, 0x72, 0x69, 0x12, + 0x18, 0x0a, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x18, 0x02, 0x20, 0x01, 0x28, 0x09, + 0x52, 0x07, 0x6d, 0x65, 0x73, 0x73, 0x61, 0x67, 0x65, 0x22, 0x47, 0x0a, 0x27, 0x43, 0x6f, 0x6e, + 0x66, 0x69, 0x72, 0x6d, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x53, + 0x6c, 0x6f, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, + 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x1c, 0x0a, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x65, + 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x09, 0x63, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x65, 0x64, 0x22, 0x22, 0x0a, 0x20, 0x47, 0x65, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x22, 0x8f, 0x01, 0x0a, 0x21, 0x47, 0x65, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, - 0x69, 0x6e, 0x67, 0x73, 0x52, 0x16, 0x75, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x32, 0x0a, 0x16, - 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, - 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, - 0x64, 0x18, 0x01, 0x20, 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, - 0x22, 0x3b, 0x0a, 0x23, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, - 0x63, 0x74, 0x65, 0x64, 0x56, 0x6e, 0x65, 0x74, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, - 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, - 0x18, 0x01, 0x20, 0x01, 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x26, 0x0a, - 0x24, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, - 0x64, 0x56, 0x6e, 0x65, 0x74, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x32, 0xba, 0x06, 0x0a, 0x11, 0x54, 0x73, 0x68, 0x64, 0x45, 0x76, - 0x65, 0x6e, 0x74, 0x73, 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x07, 0x52, - 0x65, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, - 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, - 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x29, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x6f, - 0x67, 0x69, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x10, 0x53, - 0x65, 0x6e, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, - 0x31, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, - 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4e, - 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x32, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, - 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, - 0x6e, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, - 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x21, 0x53, 0x65, 0x6e, 0x64, 0x50, - 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, - 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x2e, 0x74, + 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x6a, 0x0a, 0x18, + 0x75, 0x73, 0x61, 0x67, 0x65, 0x5f, 0x72, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x5f, + 0x73, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x18, 0x01, 0x20, 0x01, 0x28, 0x0b, 0x32, 0x30, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, + 0x52, 0x16, 0x75, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, + 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x22, 0x32, 0x0a, 0x16, 0x55, 0x73, 0x61, 0x67, + 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, + 0x67, 0x73, 0x12, 0x18, 0x0a, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x18, 0x01, 0x20, + 0x01, 0x28, 0x08, 0x52, 0x07, 0x65, 0x6e, 0x61, 0x62, 0x6c, 0x65, 0x64, 0x22, 0x3b, 0x0a, 0x23, + 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, + 0x56, 0x6e, 0x65, 0x74, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x12, 0x14, 0x0a, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x18, 0x01, 0x20, 0x01, + 0x28, 0x09, 0x52, 0x05, 0x65, 0x72, 0x72, 0x6f, 0x72, 0x22, 0x26, 0x0a, 0x24, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x56, 0x6e, 0x65, + 0x74, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x32, 0x93, 0x0b, 0x0a, 0x11, 0x54, 0x73, 0x68, 0x64, 0x45, 0x76, 0x65, 0x6e, 0x74, 0x73, + 0x53, 0x65, 0x72, 0x76, 0x69, 0x63, 0x65, 0x12, 0x5e, 0x0a, 0x07, 0x52, 0x65, 0x6c, 0x6f, 0x67, + 0x69, 0x6e, 0x12, 0x28, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, + 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, + 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x29, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x6c, 0x6f, 0x67, 0x69, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x79, 0x0a, 0x10, 0x53, 0x65, 0x6e, 0x64, 0x4e, + 0x6f, 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x31, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x6f, 0x74, 0x69, 0x66, + 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x32, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x4e, 0x6f, + 0x74, 0x69, 0x66, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, + 0x73, 0x65, 0x12, 0xac, 0x01, 0x0a, 0x21, 0x53, 0x65, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x64, 0x69, + 0x6e, 0x67, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, + 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x12, 0x42, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, + 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, + 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, + 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x43, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, 0x75, 0x74, 0x68, 0x65, - 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, - 0x1a, 0x43, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, - 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x53, 0x65, 0x6e, 0x64, - 0x50, 0x65, 0x6e, 0x64, 0x69, 0x6e, 0x67, 0x48, 0x65, 0x61, 0x64, 0x6c, 0x65, 0x73, 0x73, 0x41, - 0x75, 0x74, 0x68, 0x65, 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, - 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x64, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4d, - 0x46, 0x41, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, - 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, - 0x6f, 0x6d, 0x70, 0x74, 0x4d, 0x46, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, + 0x6e, 0x74, 0x69, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, + 0x65, 0x12, 0x64, 0x0a, 0x09, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4d, 0x46, 0x41, 0x12, 0x2a, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, - 0x4d, 0x46, 0x41, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x94, 0x01, 0x0a, 0x19, - 0x47, 0x65, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, - 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x4d, 0x46, 0x41, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x2b, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x4d, 0x46, 0x41, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x85, 0x01, 0x0a, 0x14, 0x50, 0x72, 0x6f, 0x6d, + 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x49, 0x4e, + 0x12, 0x35, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, + 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x49, 0x4e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x36, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, + 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, + 0x65, 0x4b, 0x65, 0x79, 0x50, 0x49, 0x4e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, + 0x8b, 0x01, 0x0a, 0x16, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, + 0x72, 0x65, 0x4b, 0x65, 0x79, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x12, 0x37, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, + 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x54, 0x6f, 0x75, 0x63, 0x68, 0x52, 0x65, 0x71, 0x75, + 0x65, 0x73, 0x74, 0x1a, 0x38, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, + 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, + 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, + 0x54, 0x6f, 0x75, 0x63, 0x68, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x97, 0x01, + 0x0a, 0x1a, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, + 0x4b, 0x65, 0x79, 0x50, 0x49, 0x4e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x12, 0x3b, 0x2e, 0x74, + 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, + 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, + 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x49, 0x4e, 0x43, 0x68, 0x61, 0x6e, + 0x67, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3c, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, - 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, - 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, - 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, - 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, - 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, - 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x12, 0x9d, 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x65, - 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x56, 0x6e, 0x65, 0x74, 0x53, 0x68, 0x75, 0x74, 0x64, - 0x6f, 0x77, 0x6e, 0x12, 0x3d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, - 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x52, - 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x56, - 0x6e, 0x65, 0x74, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x71, 0x75, 0x65, - 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, - 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, - 0x70, 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x56, 0x6e, - 0x65, 0x74, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, - 0x73, 0x65, 0x42, 0x54, 0x5a, 0x52, 0x67, 0x69, 0x74, 0x68, 0x75, 0x62, 0x2e, 0x63, 0x6f, 0x6d, - 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, 0x6e, 0x61, 0x6c, 0x2f, 0x74, - 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x67, 0x65, 0x6e, 0x2f, 0x70, 0x72, 0x6f, 0x74, - 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x6c, 0x69, - 0x62, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2f, 0x76, 0x31, 0x3b, 0x74, 0x65, - 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x76, 0x31, 0x62, 0x06, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x33, + 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x50, 0x72, 0x6f, 0x6d, 0x70, 0x74, 0x48, 0x61, 0x72, 0x64, 0x77, + 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x50, 0x49, 0x4e, 0x43, 0x68, 0x61, 0x6e, 0x67, 0x65, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0xa6, 0x01, 0x0a, 0x1f, 0x43, 0x6f, 0x6e, 0x66, + 0x69, 0x72, 0x6d, 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x6c, + 0x6f, 0x74, 0x4f, 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x12, 0x40, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, + 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, 0x48, 0x61, + 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x6c, 0x6f, 0x74, 0x4f, 0x76, 0x65, + 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x41, 0x2e, + 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x43, 0x6f, 0x6e, 0x66, 0x69, 0x72, 0x6d, + 0x48, 0x61, 0x72, 0x64, 0x77, 0x61, 0x72, 0x65, 0x4b, 0x65, 0x79, 0x53, 0x6c, 0x6f, 0x74, 0x4f, + 0x76, 0x65, 0x72, 0x77, 0x72, 0x69, 0x74, 0x65, 0x52, 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, + 0x12, 0x94, 0x01, 0x0a, 0x19, 0x47, 0x65, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x12, 0x3a, + 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, + 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x61, + 0x67, 0x65, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, + 0x6e, 0x67, 0x73, 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3b, 0x2e, 0x74, 0x65, 0x6c, + 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, + 0x72, 0x6d, 0x2e, 0x76, 0x31, 0x2e, 0x47, 0x65, 0x74, 0x55, 0x73, 0x61, 0x67, 0x65, 0x52, 0x65, + 0x70, 0x6f, 0x72, 0x74, 0x69, 0x6e, 0x67, 0x53, 0x65, 0x74, 0x74, 0x69, 0x6e, 0x67, 0x73, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x12, 0x9d, 0x01, 0x0a, 0x1c, 0x52, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, 0x74, 0x65, 0x64, 0x56, 0x6e, 0x65, 0x74, + 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x12, 0x3d, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, + 0x6f, 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, + 0x2e, 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, + 0x63, 0x74, 0x65, 0x64, 0x56, 0x6e, 0x65, 0x74, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, + 0x52, 0x65, 0x71, 0x75, 0x65, 0x73, 0x74, 0x1a, 0x3e, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2e, 0x6c, 0x69, 0x62, 0x2e, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2e, + 0x76, 0x31, 0x2e, 0x52, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x55, 0x6e, 0x65, 0x78, 0x70, 0x65, 0x63, + 0x74, 0x65, 0x64, 0x56, 0x6e, 0x65, 0x74, 0x53, 0x68, 0x75, 0x74, 0x64, 0x6f, 0x77, 0x6e, 0x52, + 0x65, 0x73, 0x70, 0x6f, 0x6e, 0x73, 0x65, 0x42, 0x54, 0x5a, 0x52, 0x67, 0x69, 0x74, 0x68, 0x75, + 0x62, 0x2e, 0x63, 0x6f, 0x6d, 0x2f, 0x67, 0x72, 0x61, 0x76, 0x69, 0x74, 0x61, 0x74, 0x69, 0x6f, + 0x6e, 0x61, 0x6c, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, 0x72, 0x74, 0x2f, 0x67, 0x65, 0x6e, + 0x2f, 0x70, 0x72, 0x6f, 0x74, 0x6f, 0x2f, 0x67, 0x6f, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x70, 0x6f, + 0x72, 0x74, 0x2f, 0x6c, 0x69, 0x62, 0x2f, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x2f, + 0x76, 0x31, 0x3b, 0x74, 0x65, 0x6c, 0x65, 0x74, 0x65, 0x72, 0x6d, 0x76, 0x31, 0x62, 0x06, 0x70, + 0x72, 0x6f, 0x74, 0x6f, 0x33, } var ( @@ -1149,7 +1626,7 @@ func file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescGZIP() []byt return file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDescData } -var file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes = make([]protoimpl.MessageInfo, 17) +var file_teleport_lib_teleterm_v1_tshd_events_service_proto_msgTypes = make([]protoimpl.MessageInfo, 25) var file_teleport_lib_teleterm_v1_tshd_events_service_proto_goTypes = []any{ (*ReloginRequest)(nil), // 0: teleport.lib.teleterm.v1.ReloginRequest (*GatewayCertExpired)(nil), // 1: teleport.lib.teleterm.v1.GatewayCertExpired @@ -1163,32 +1640,48 @@ var file_teleport_lib_teleterm_v1_tshd_events_service_proto_goTypes = []any{ (*SendPendingHeadlessAuthenticationResponse)(nil), // 9: teleport.lib.teleterm.v1.SendPendingHeadlessAuthenticationResponse (*PromptMFARequest)(nil), // 10: teleport.lib.teleterm.v1.PromptMFARequest (*PromptMFAResponse)(nil), // 11: teleport.lib.teleterm.v1.PromptMFAResponse - (*GetUsageReportingSettingsRequest)(nil), // 12: teleport.lib.teleterm.v1.GetUsageReportingSettingsRequest - (*GetUsageReportingSettingsResponse)(nil), // 13: teleport.lib.teleterm.v1.GetUsageReportingSettingsResponse - (*UsageReportingSettings)(nil), // 14: teleport.lib.teleterm.v1.UsageReportingSettings - (*ReportUnexpectedVnetShutdownRequest)(nil), // 15: teleport.lib.teleterm.v1.ReportUnexpectedVnetShutdownRequest - (*ReportUnexpectedVnetShutdownResponse)(nil), // 16: teleport.lib.teleterm.v1.ReportUnexpectedVnetShutdownResponse + (*PromptHardwareKeyPINRequest)(nil), // 12: teleport.lib.teleterm.v1.PromptHardwareKeyPINRequest + (*PromptHardwareKeyPINResponse)(nil), // 13: teleport.lib.teleterm.v1.PromptHardwareKeyPINResponse + (*PromptHardwareKeyTouchRequest)(nil), // 14: teleport.lib.teleterm.v1.PromptHardwareKeyTouchRequest + (*PromptHardwareKeyTouchResponse)(nil), // 15: teleport.lib.teleterm.v1.PromptHardwareKeyTouchResponse + (*PromptHardwareKeyPINChangeRequest)(nil), // 16: teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeRequest + (*PromptHardwareKeyPINChangeResponse)(nil), // 17: teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeResponse + (*ConfirmHardwareKeySlotOverwriteRequest)(nil), // 18: teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteRequest + (*ConfirmHardwareKeySlotOverwriteResponse)(nil), // 19: teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteResponse + (*GetUsageReportingSettingsRequest)(nil), // 20: teleport.lib.teleterm.v1.GetUsageReportingSettingsRequest + (*GetUsageReportingSettingsResponse)(nil), // 21: teleport.lib.teleterm.v1.GetUsageReportingSettingsResponse + (*UsageReportingSettings)(nil), // 22: teleport.lib.teleterm.v1.UsageReportingSettings + (*ReportUnexpectedVnetShutdownRequest)(nil), // 23: teleport.lib.teleterm.v1.ReportUnexpectedVnetShutdownRequest + (*ReportUnexpectedVnetShutdownResponse)(nil), // 24: teleport.lib.teleterm.v1.ReportUnexpectedVnetShutdownResponse } var file_teleport_lib_teleterm_v1_tshd_events_service_proto_depIdxs = []int32{ 1, // 0: teleport.lib.teleterm.v1.ReloginRequest.gateway_cert_expired:type_name -> teleport.lib.teleterm.v1.GatewayCertExpired 2, // 1: teleport.lib.teleterm.v1.ReloginRequest.vnet_cert_expired:type_name -> teleport.lib.teleterm.v1.VnetCertExpired 5, // 2: teleport.lib.teleterm.v1.SendNotificationRequest.cannot_proxy_gateway_connection:type_name -> teleport.lib.teleterm.v1.CannotProxyGatewayConnection 6, // 3: teleport.lib.teleterm.v1.SendNotificationRequest.cannot_proxy_vnet_connection:type_name -> teleport.lib.teleterm.v1.CannotProxyVnetConnection - 14, // 4: teleport.lib.teleterm.v1.GetUsageReportingSettingsResponse.usage_reporting_settings:type_name -> teleport.lib.teleterm.v1.UsageReportingSettings + 22, // 4: teleport.lib.teleterm.v1.GetUsageReportingSettingsResponse.usage_reporting_settings:type_name -> teleport.lib.teleterm.v1.UsageReportingSettings 0, // 5: teleport.lib.teleterm.v1.TshdEventsService.Relogin:input_type -> teleport.lib.teleterm.v1.ReloginRequest 4, // 6: teleport.lib.teleterm.v1.TshdEventsService.SendNotification:input_type -> teleport.lib.teleterm.v1.SendNotificationRequest 8, // 7: teleport.lib.teleterm.v1.TshdEventsService.SendPendingHeadlessAuthentication:input_type -> teleport.lib.teleterm.v1.SendPendingHeadlessAuthenticationRequest 10, // 8: teleport.lib.teleterm.v1.TshdEventsService.PromptMFA:input_type -> teleport.lib.teleterm.v1.PromptMFARequest - 12, // 9: teleport.lib.teleterm.v1.TshdEventsService.GetUsageReportingSettings:input_type -> teleport.lib.teleterm.v1.GetUsageReportingSettingsRequest - 15, // 10: teleport.lib.teleterm.v1.TshdEventsService.ReportUnexpectedVnetShutdown:input_type -> teleport.lib.teleterm.v1.ReportUnexpectedVnetShutdownRequest - 3, // 11: teleport.lib.teleterm.v1.TshdEventsService.Relogin:output_type -> teleport.lib.teleterm.v1.ReloginResponse - 7, // 12: teleport.lib.teleterm.v1.TshdEventsService.SendNotification:output_type -> teleport.lib.teleterm.v1.SendNotificationResponse - 9, // 13: teleport.lib.teleterm.v1.TshdEventsService.SendPendingHeadlessAuthentication:output_type -> teleport.lib.teleterm.v1.SendPendingHeadlessAuthenticationResponse - 11, // 14: teleport.lib.teleterm.v1.TshdEventsService.PromptMFA:output_type -> teleport.lib.teleterm.v1.PromptMFAResponse - 13, // 15: teleport.lib.teleterm.v1.TshdEventsService.GetUsageReportingSettings:output_type -> teleport.lib.teleterm.v1.GetUsageReportingSettingsResponse - 16, // 16: teleport.lib.teleterm.v1.TshdEventsService.ReportUnexpectedVnetShutdown:output_type -> teleport.lib.teleterm.v1.ReportUnexpectedVnetShutdownResponse - 11, // [11:17] is the sub-list for method output_type - 5, // [5:11] is the sub-list for method input_type + 12, // 9: teleport.lib.teleterm.v1.TshdEventsService.PromptHardwareKeyPIN:input_type -> teleport.lib.teleterm.v1.PromptHardwareKeyPINRequest + 14, // 10: teleport.lib.teleterm.v1.TshdEventsService.PromptHardwareKeyTouch:input_type -> teleport.lib.teleterm.v1.PromptHardwareKeyTouchRequest + 16, // 11: teleport.lib.teleterm.v1.TshdEventsService.PromptHardwareKeyPINChange:input_type -> teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeRequest + 18, // 12: teleport.lib.teleterm.v1.TshdEventsService.ConfirmHardwareKeySlotOverwrite:input_type -> teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteRequest + 20, // 13: teleport.lib.teleterm.v1.TshdEventsService.GetUsageReportingSettings:input_type -> teleport.lib.teleterm.v1.GetUsageReportingSettingsRequest + 23, // 14: teleport.lib.teleterm.v1.TshdEventsService.ReportUnexpectedVnetShutdown:input_type -> teleport.lib.teleterm.v1.ReportUnexpectedVnetShutdownRequest + 3, // 15: teleport.lib.teleterm.v1.TshdEventsService.Relogin:output_type -> teleport.lib.teleterm.v1.ReloginResponse + 7, // 16: teleport.lib.teleterm.v1.TshdEventsService.SendNotification:output_type -> teleport.lib.teleterm.v1.SendNotificationResponse + 9, // 17: teleport.lib.teleterm.v1.TshdEventsService.SendPendingHeadlessAuthentication:output_type -> teleport.lib.teleterm.v1.SendPendingHeadlessAuthenticationResponse + 11, // 18: teleport.lib.teleterm.v1.TshdEventsService.PromptMFA:output_type -> teleport.lib.teleterm.v1.PromptMFAResponse + 13, // 19: teleport.lib.teleterm.v1.TshdEventsService.PromptHardwareKeyPIN:output_type -> teleport.lib.teleterm.v1.PromptHardwareKeyPINResponse + 15, // 20: teleport.lib.teleterm.v1.TshdEventsService.PromptHardwareKeyTouch:output_type -> teleport.lib.teleterm.v1.PromptHardwareKeyTouchResponse + 17, // 21: teleport.lib.teleterm.v1.TshdEventsService.PromptHardwareKeyPINChange:output_type -> teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeResponse + 19, // 22: teleport.lib.teleterm.v1.TshdEventsService.ConfirmHardwareKeySlotOverwrite:output_type -> teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteResponse + 21, // 23: teleport.lib.teleterm.v1.TshdEventsService.GetUsageReportingSettings:output_type -> teleport.lib.teleterm.v1.GetUsageReportingSettingsResponse + 24, // 24: teleport.lib.teleterm.v1.TshdEventsService.ReportUnexpectedVnetShutdown:output_type -> teleport.lib.teleterm.v1.ReportUnexpectedVnetShutdownResponse + 15, // [15:25] is the sub-list for method output_type + 5, // [5:15] is the sub-list for method input_type 5, // [5:5] is the sub-list for extension type_name 5, // [5:5] is the sub-list for extension extendee 0, // [0:5] is the sub-list for field type_name @@ -1213,7 +1706,7 @@ func file_teleport_lib_teleterm_v1_tshd_events_service_proto_init() { GoPackagePath: reflect.TypeOf(x{}).PkgPath(), RawDescriptor: file_teleport_lib_teleterm_v1_tshd_events_service_proto_rawDesc, NumEnums: 0, - NumMessages: 17, + NumMessages: 25, NumExtensions: 0, NumServices: 1, }, diff --git a/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service_grpc.pb.go b/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service_grpc.pb.go index 8ee0b2a271acd..da8f82e67af7e 100644 --- a/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service_grpc.pb.go +++ b/gen/proto/go/teleport/lib/teleterm/v1/tshd_events_service_grpc.pb.go @@ -40,6 +40,10 @@ const ( TshdEventsService_SendNotification_FullMethodName = "/teleport.lib.teleterm.v1.TshdEventsService/SendNotification" TshdEventsService_SendPendingHeadlessAuthentication_FullMethodName = "/teleport.lib.teleterm.v1.TshdEventsService/SendPendingHeadlessAuthentication" TshdEventsService_PromptMFA_FullMethodName = "/teleport.lib.teleterm.v1.TshdEventsService/PromptMFA" + TshdEventsService_PromptHardwareKeyPIN_FullMethodName = "/teleport.lib.teleterm.v1.TshdEventsService/PromptHardwareKeyPIN" + TshdEventsService_PromptHardwareKeyTouch_FullMethodName = "/teleport.lib.teleterm.v1.TshdEventsService/PromptHardwareKeyTouch" + TshdEventsService_PromptHardwareKeyPINChange_FullMethodName = "/teleport.lib.teleterm.v1.TshdEventsService/PromptHardwareKeyPINChange" + TshdEventsService_ConfirmHardwareKeySlotOverwrite_FullMethodName = "/teleport.lib.teleterm.v1.TshdEventsService/ConfirmHardwareKeySlotOverwrite" TshdEventsService_GetUsageReportingSettings_FullMethodName = "/teleport.lib.teleterm.v1.TshdEventsService/GetUsageReportingSettings" TshdEventsService_ReportUnexpectedVnetShutdown_FullMethodName = "/teleport.lib.teleterm.v1.TshdEventsService/ReportUnexpectedVnetShutdown" ) @@ -66,6 +70,18 @@ type TshdEventsServiceClient interface { // If TOTP is supported, tsh daemon expects that the Electron app responds to this RPC with the // code. PromptMFA(ctx context.Context, in *PromptMFARequest, opts ...grpc.CallOption) (*PromptMFAResponse, error) + // PromptHardwareKeyPIN notifies the Electron app that the daemon is waiting for the user to + // provide the hardware key PIN. + PromptHardwareKeyPIN(ctx context.Context, in *PromptHardwareKeyPINRequest, opts ...grpc.CallOption) (*PromptHardwareKeyPINResponse, error) + // PromptHardwareKeyTouch notifies the Electron app that the daemon is waiting for the user to touch the hardware key. + // When the daemon detects the touch, it cancels the prompt. + PromptHardwareKeyTouch(ctx context.Context, in *PromptHardwareKeyTouchRequest, opts ...grpc.CallOption) (*PromptHardwareKeyTouchResponse, error) + // PromptHardwareKeyPINChange notifies the Electron app that the daemon is waiting for the user to + // change the hardware key PIN. + PromptHardwareKeyPINChange(ctx context.Context, in *PromptHardwareKeyPINChangeRequest, opts ...grpc.CallOption) (*PromptHardwareKeyPINChangeResponse, error) + // ConfirmHardwareKeySlotOverwrite displays a dialog prompting the user to confirm whether + // the slot's private key and certificate should be overwritten. + ConfirmHardwareKeySlotOverwrite(ctx context.Context, in *ConfirmHardwareKeySlotOverwriteRequest, opts ...grpc.CallOption) (*ConfirmHardwareKeySlotOverwriteResponse, error) // GetUsageReportingSettings returns the current state of usage reporting. // At the moment, the user cannot toggle usage reporting on and off without shutting down the app, // with the only exception being the first start of the app when they're prompted about telemetry. @@ -125,6 +141,46 @@ func (c *tshdEventsServiceClient) PromptMFA(ctx context.Context, in *PromptMFARe return out, nil } +func (c *tshdEventsServiceClient) PromptHardwareKeyPIN(ctx context.Context, in *PromptHardwareKeyPINRequest, opts ...grpc.CallOption) (*PromptHardwareKeyPINResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(PromptHardwareKeyPINResponse) + err := c.cc.Invoke(ctx, TshdEventsService_PromptHardwareKeyPIN_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tshdEventsServiceClient) PromptHardwareKeyTouch(ctx context.Context, in *PromptHardwareKeyTouchRequest, opts ...grpc.CallOption) (*PromptHardwareKeyTouchResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(PromptHardwareKeyTouchResponse) + err := c.cc.Invoke(ctx, TshdEventsService_PromptHardwareKeyTouch_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tshdEventsServiceClient) PromptHardwareKeyPINChange(ctx context.Context, in *PromptHardwareKeyPINChangeRequest, opts ...grpc.CallOption) (*PromptHardwareKeyPINChangeResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(PromptHardwareKeyPINChangeResponse) + err := c.cc.Invoke(ctx, TshdEventsService_PromptHardwareKeyPINChange_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + +func (c *tshdEventsServiceClient) ConfirmHardwareKeySlotOverwrite(ctx context.Context, in *ConfirmHardwareKeySlotOverwriteRequest, opts ...grpc.CallOption) (*ConfirmHardwareKeySlotOverwriteResponse, error) { + cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) + out := new(ConfirmHardwareKeySlotOverwriteResponse) + err := c.cc.Invoke(ctx, TshdEventsService_ConfirmHardwareKeySlotOverwrite_FullMethodName, in, out, cOpts...) + if err != nil { + return nil, err + } + return out, nil +} + func (c *tshdEventsServiceClient) GetUsageReportingSettings(ctx context.Context, in *GetUsageReportingSettingsRequest, opts ...grpc.CallOption) (*GetUsageReportingSettingsResponse, error) { cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) out := new(GetUsageReportingSettingsResponse) @@ -167,6 +223,18 @@ type TshdEventsServiceServer interface { // If TOTP is supported, tsh daemon expects that the Electron app responds to this RPC with the // code. PromptMFA(context.Context, *PromptMFARequest) (*PromptMFAResponse, error) + // PromptHardwareKeyPIN notifies the Electron app that the daemon is waiting for the user to + // provide the hardware key PIN. + PromptHardwareKeyPIN(context.Context, *PromptHardwareKeyPINRequest) (*PromptHardwareKeyPINResponse, error) + // PromptHardwareKeyTouch notifies the Electron app that the daemon is waiting for the user to touch the hardware key. + // When the daemon detects the touch, it cancels the prompt. + PromptHardwareKeyTouch(context.Context, *PromptHardwareKeyTouchRequest) (*PromptHardwareKeyTouchResponse, error) + // PromptHardwareKeyPINChange notifies the Electron app that the daemon is waiting for the user to + // change the hardware key PIN. + PromptHardwareKeyPINChange(context.Context, *PromptHardwareKeyPINChangeRequest) (*PromptHardwareKeyPINChangeResponse, error) + // ConfirmHardwareKeySlotOverwrite displays a dialog prompting the user to confirm whether + // the slot's private key and certificate should be overwritten. + ConfirmHardwareKeySlotOverwrite(context.Context, *ConfirmHardwareKeySlotOverwriteRequest) (*ConfirmHardwareKeySlotOverwriteResponse, error) // GetUsageReportingSettings returns the current state of usage reporting. // At the moment, the user cannot toggle usage reporting on and off without shutting down the app, // with the only exception being the first start of the app when they're prompted about telemetry. @@ -198,6 +266,18 @@ func (UnimplementedTshdEventsServiceServer) SendPendingHeadlessAuthentication(co func (UnimplementedTshdEventsServiceServer) PromptMFA(context.Context, *PromptMFARequest) (*PromptMFAResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method PromptMFA not implemented") } +func (UnimplementedTshdEventsServiceServer) PromptHardwareKeyPIN(context.Context, *PromptHardwareKeyPINRequest) (*PromptHardwareKeyPINResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PromptHardwareKeyPIN not implemented") +} +func (UnimplementedTshdEventsServiceServer) PromptHardwareKeyTouch(context.Context, *PromptHardwareKeyTouchRequest) (*PromptHardwareKeyTouchResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PromptHardwareKeyTouch not implemented") +} +func (UnimplementedTshdEventsServiceServer) PromptHardwareKeyPINChange(context.Context, *PromptHardwareKeyPINChangeRequest) (*PromptHardwareKeyPINChangeResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method PromptHardwareKeyPINChange not implemented") +} +func (UnimplementedTshdEventsServiceServer) ConfirmHardwareKeySlotOverwrite(context.Context, *ConfirmHardwareKeySlotOverwriteRequest) (*ConfirmHardwareKeySlotOverwriteResponse, error) { + return nil, status.Errorf(codes.Unimplemented, "method ConfirmHardwareKeySlotOverwrite not implemented") +} func (UnimplementedTshdEventsServiceServer) GetUsageReportingSettings(context.Context, *GetUsageReportingSettingsRequest) (*GetUsageReportingSettingsResponse, error) { return nil, status.Errorf(codes.Unimplemented, "method GetUsageReportingSettings not implemented") } @@ -297,6 +377,78 @@ func _TshdEventsService_PromptMFA_Handler(srv interface{}, ctx context.Context, return interceptor(ctx, in, info, handler) } +func _TshdEventsService_PromptHardwareKeyPIN_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PromptHardwareKeyPINRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TshdEventsServiceServer).PromptHardwareKeyPIN(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TshdEventsService_PromptHardwareKeyPIN_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TshdEventsServiceServer).PromptHardwareKeyPIN(ctx, req.(*PromptHardwareKeyPINRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TshdEventsService_PromptHardwareKeyTouch_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PromptHardwareKeyTouchRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TshdEventsServiceServer).PromptHardwareKeyTouch(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TshdEventsService_PromptHardwareKeyTouch_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TshdEventsServiceServer).PromptHardwareKeyTouch(ctx, req.(*PromptHardwareKeyTouchRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TshdEventsService_PromptHardwareKeyPINChange_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(PromptHardwareKeyPINChangeRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TshdEventsServiceServer).PromptHardwareKeyPINChange(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TshdEventsService_PromptHardwareKeyPINChange_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TshdEventsServiceServer).PromptHardwareKeyPINChange(ctx, req.(*PromptHardwareKeyPINChangeRequest)) + } + return interceptor(ctx, in, info, handler) +} + +func _TshdEventsService_ConfirmHardwareKeySlotOverwrite_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(ConfirmHardwareKeySlotOverwriteRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(TshdEventsServiceServer).ConfirmHardwareKeySlotOverwrite(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: TshdEventsService_ConfirmHardwareKeySlotOverwrite_FullMethodName, + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(TshdEventsServiceServer).ConfirmHardwareKeySlotOverwrite(ctx, req.(*ConfirmHardwareKeySlotOverwriteRequest)) + } + return interceptor(ctx, in, info, handler) +} + func _TshdEventsService_GetUsageReportingSettings_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { in := new(GetUsageReportingSettingsRequest) if err := dec(in); err != nil { @@ -356,6 +508,22 @@ var TshdEventsService_ServiceDesc = grpc.ServiceDesc{ MethodName: "PromptMFA", Handler: _TshdEventsService_PromptMFA_Handler, }, + { + MethodName: "PromptHardwareKeyPIN", + Handler: _TshdEventsService_PromptHardwareKeyPIN_Handler, + }, + { + MethodName: "PromptHardwareKeyTouch", + Handler: _TshdEventsService_PromptHardwareKeyTouch_Handler, + }, + { + MethodName: "PromptHardwareKeyPINChange", + Handler: _TshdEventsService_PromptHardwareKeyPINChange_Handler, + }, + { + MethodName: "ConfirmHardwareKeySlotOverwrite", + Handler: _TshdEventsService_ConfirmHardwareKeySlotOverwrite_Handler, + }, { MethodName: "GetUsageReportingSettings", Handler: _TshdEventsService_GetUsageReportingSettings_Handler, diff --git a/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.client.ts b/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.client.ts index 762ad049fc740..639353d5e19a7 100644 --- a/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.client.ts +++ b/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.client.ts @@ -28,6 +28,14 @@ import type { ReportUnexpectedVnetShutdownResponse } from "./tshd_events_service import type { ReportUnexpectedVnetShutdownRequest } from "./tshd_events_service_pb"; import type { GetUsageReportingSettingsResponse } from "./tshd_events_service_pb"; import type { GetUsageReportingSettingsRequest } from "./tshd_events_service_pb"; +import type { ConfirmHardwareKeySlotOverwriteResponse } from "./tshd_events_service_pb"; +import type { ConfirmHardwareKeySlotOverwriteRequest } from "./tshd_events_service_pb"; +import type { PromptHardwareKeyPINChangeResponse } from "./tshd_events_service_pb"; +import type { PromptHardwareKeyPINChangeRequest } from "./tshd_events_service_pb"; +import type { PromptHardwareKeyTouchResponse } from "./tshd_events_service_pb"; +import type { PromptHardwareKeyTouchRequest } from "./tshd_events_service_pb"; +import type { PromptHardwareKeyPINResponse } from "./tshd_events_service_pb"; +import type { PromptHardwareKeyPINRequest } from "./tshd_events_service_pb"; import type { PromptMFAResponse } from "./tshd_events_service_pb"; import type { PromptMFARequest } from "./tshd_events_service_pb"; import type { SendPendingHeadlessAuthenticationResponse } from "./tshd_events_service_pb"; @@ -77,6 +85,34 @@ export interface ITshdEventsServiceClient { * @generated from protobuf rpc: PromptMFA(teleport.lib.teleterm.v1.PromptMFARequest) returns (teleport.lib.teleterm.v1.PromptMFAResponse); */ promptMFA(input: PromptMFARequest, options?: RpcOptions): UnaryCall; + /** + * PromptHardwareKeyPIN notifies the Electron app that the daemon is waiting for the user to + * provide the hardware key PIN. + * + * @generated from protobuf rpc: PromptHardwareKeyPIN(teleport.lib.teleterm.v1.PromptHardwareKeyPINRequest) returns (teleport.lib.teleterm.v1.PromptHardwareKeyPINResponse); + */ + promptHardwareKeyPIN(input: PromptHardwareKeyPINRequest, options?: RpcOptions): UnaryCall; + /** + * PromptHardwareKeyTouch notifies the Electron app that the daemon is waiting for the user to touch the hardware key. + * When the daemon detects the touch, it cancels the prompt. + * + * @generated from protobuf rpc: PromptHardwareKeyTouch(teleport.lib.teleterm.v1.PromptHardwareKeyTouchRequest) returns (teleport.lib.teleterm.v1.PromptHardwareKeyTouchResponse); + */ + promptHardwareKeyTouch(input: PromptHardwareKeyTouchRequest, options?: RpcOptions): UnaryCall; + /** + * PromptHardwareKeyPINChange notifies the Electron app that the daemon is waiting for the user to + * change the hardware key PIN. + * + * @generated from protobuf rpc: PromptHardwareKeyPINChange(teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeRequest) returns (teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeResponse); + */ + promptHardwareKeyPINChange(input: PromptHardwareKeyPINChangeRequest, options?: RpcOptions): UnaryCall; + /** + * ConfirmHardwareKeySlotOverwrite displays a dialog prompting the user to confirm whether + * the slot's private key and certificate should be overwritten. + * + * @generated from protobuf rpc: ConfirmHardwareKeySlotOverwrite(teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteRequest) returns (teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteResponse); + */ + confirmHardwareKeySlotOverwrite(input: ConfirmHardwareKeySlotOverwriteRequest, options?: RpcOptions): UnaryCall; /** * GetUsageReportingSettings returns the current state of usage reporting. * At the moment, the user cannot toggle usage reporting on and off without shutting down the app, @@ -150,6 +186,46 @@ export class TshdEventsServiceClient implements ITshdEventsServiceClient, Servic const method = this.methods[3], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } + /** + * PromptHardwareKeyPIN notifies the Electron app that the daemon is waiting for the user to + * provide the hardware key PIN. + * + * @generated from protobuf rpc: PromptHardwareKeyPIN(teleport.lib.teleterm.v1.PromptHardwareKeyPINRequest) returns (teleport.lib.teleterm.v1.PromptHardwareKeyPINResponse); + */ + promptHardwareKeyPIN(input: PromptHardwareKeyPINRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[4], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * PromptHardwareKeyTouch notifies the Electron app that the daemon is waiting for the user to touch the hardware key. + * When the daemon detects the touch, it cancels the prompt. + * + * @generated from protobuf rpc: PromptHardwareKeyTouch(teleport.lib.teleterm.v1.PromptHardwareKeyTouchRequest) returns (teleport.lib.teleterm.v1.PromptHardwareKeyTouchResponse); + */ + promptHardwareKeyTouch(input: PromptHardwareKeyTouchRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[5], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * PromptHardwareKeyPINChange notifies the Electron app that the daemon is waiting for the user to + * change the hardware key PIN. + * + * @generated from protobuf rpc: PromptHardwareKeyPINChange(teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeRequest) returns (teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeResponse); + */ + promptHardwareKeyPINChange(input: PromptHardwareKeyPINChangeRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[6], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } + /** + * ConfirmHardwareKeySlotOverwrite displays a dialog prompting the user to confirm whether + * the slot's private key and certificate should be overwritten. + * + * @generated from protobuf rpc: ConfirmHardwareKeySlotOverwrite(teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteRequest) returns (teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteResponse); + */ + confirmHardwareKeySlotOverwrite(input: ConfirmHardwareKeySlotOverwriteRequest, options?: RpcOptions): UnaryCall { + const method = this.methods[7], opt = this._transport.mergeOptions(options); + return stackIntercept("unary", this._transport, method, opt, input); + } /** * GetUsageReportingSettings returns the current state of usage reporting. * At the moment, the user cannot toggle usage reporting on and off without shutting down the app, @@ -159,7 +235,7 @@ export class TshdEventsServiceClient implements ITshdEventsServiceClient, Servic * @generated from protobuf rpc: GetUsageReportingSettings(teleport.lib.teleterm.v1.GetUsageReportingSettingsRequest) returns (teleport.lib.teleterm.v1.GetUsageReportingSettingsResponse); */ getUsageReportingSettings(input: GetUsageReportingSettingsRequest, options?: RpcOptions): UnaryCall { - const method = this.methods[4], opt = this._transport.mergeOptions(options); + const method = this.methods[8], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } /** @@ -170,7 +246,7 @@ export class TshdEventsServiceClient implements ITshdEventsServiceClient, Servic * @generated from protobuf rpc: ReportUnexpectedVnetShutdown(teleport.lib.teleterm.v1.ReportUnexpectedVnetShutdownRequest) returns (teleport.lib.teleterm.v1.ReportUnexpectedVnetShutdownResponse); */ reportUnexpectedVnetShutdown(input: ReportUnexpectedVnetShutdownRequest, options?: RpcOptions): UnaryCall { - const method = this.methods[5], opt = this._transport.mergeOptions(options); + const method = this.methods[9], opt = this._transport.mergeOptions(options); return stackIntercept("unary", this._transport, method, opt, input); } } diff --git a/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.grpc-server.ts b/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.grpc-server.ts index 7f71d9adf0d4a..110fa4c7d1c33 100644 --- a/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.grpc-server.ts +++ b/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.grpc-server.ts @@ -25,6 +25,14 @@ import { ReportUnexpectedVnetShutdownResponse } from "./tshd_events_service_pb"; import { ReportUnexpectedVnetShutdownRequest } from "./tshd_events_service_pb"; import { GetUsageReportingSettingsResponse } from "./tshd_events_service_pb"; import { GetUsageReportingSettingsRequest } from "./tshd_events_service_pb"; +import { ConfirmHardwareKeySlotOverwriteResponse } from "./tshd_events_service_pb"; +import { ConfirmHardwareKeySlotOverwriteRequest } from "./tshd_events_service_pb"; +import { PromptHardwareKeyPINChangeResponse } from "./tshd_events_service_pb"; +import { PromptHardwareKeyPINChangeRequest } from "./tshd_events_service_pb"; +import { PromptHardwareKeyTouchResponse } from "./tshd_events_service_pb"; +import { PromptHardwareKeyTouchRequest } from "./tshd_events_service_pb"; +import { PromptHardwareKeyPINResponse } from "./tshd_events_service_pb"; +import { PromptHardwareKeyPINRequest } from "./tshd_events_service_pb"; import { PromptMFAResponse } from "./tshd_events_service_pb"; import { PromptMFARequest } from "./tshd_events_service_pb"; import { SendPendingHeadlessAuthenticationResponse } from "./tshd_events_service_pb"; @@ -72,6 +80,34 @@ export interface ITshdEventsService extends grpc.UntypedServiceImplementation { * @generated from protobuf rpc: PromptMFA(teleport.lib.teleterm.v1.PromptMFARequest) returns (teleport.lib.teleterm.v1.PromptMFAResponse); */ promptMFA: grpc.handleUnaryCall; + /** + * PromptHardwareKeyPIN notifies the Electron app that the daemon is waiting for the user to + * provide the hardware key PIN. + * + * @generated from protobuf rpc: PromptHardwareKeyPIN(teleport.lib.teleterm.v1.PromptHardwareKeyPINRequest) returns (teleport.lib.teleterm.v1.PromptHardwareKeyPINResponse); + */ + promptHardwareKeyPIN: grpc.handleUnaryCall; + /** + * PromptHardwareKeyTouch notifies the Electron app that the daemon is waiting for the user to touch the hardware key. + * When the daemon detects the touch, it cancels the prompt. + * + * @generated from protobuf rpc: PromptHardwareKeyTouch(teleport.lib.teleterm.v1.PromptHardwareKeyTouchRequest) returns (teleport.lib.teleterm.v1.PromptHardwareKeyTouchResponse); + */ + promptHardwareKeyTouch: grpc.handleUnaryCall; + /** + * PromptHardwareKeyPINChange notifies the Electron app that the daemon is waiting for the user to + * change the hardware key PIN. + * + * @generated from protobuf rpc: PromptHardwareKeyPINChange(teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeRequest) returns (teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeResponse); + */ + promptHardwareKeyPINChange: grpc.handleUnaryCall; + /** + * ConfirmHardwareKeySlotOverwrite displays a dialog prompting the user to confirm whether + * the slot's private key and certificate should be overwritten. + * + * @generated from protobuf rpc: ConfirmHardwareKeySlotOverwrite(teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteRequest) returns (teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteResponse); + */ + confirmHardwareKeySlotOverwrite: grpc.handleUnaryCall; /** * GetUsageReportingSettings returns the current state of usage reporting. * At the moment, the user cannot toggle usage reporting on and off without shutting down the app, @@ -142,6 +178,46 @@ export const tshdEventsServiceDefinition: grpc.ServiceDefinition Buffer.from(PromptMFAResponse.toBinary(value)), requestSerialize: value => Buffer.from(PromptMFARequest.toBinary(value)) }, + promptHardwareKeyPIN: { + path: "/teleport.lib.teleterm.v1.TshdEventsService/PromptHardwareKeyPIN", + originalName: "PromptHardwareKeyPIN", + requestStream: false, + responseStream: false, + responseDeserialize: bytes => PromptHardwareKeyPINResponse.fromBinary(bytes), + requestDeserialize: bytes => PromptHardwareKeyPINRequest.fromBinary(bytes), + responseSerialize: value => Buffer.from(PromptHardwareKeyPINResponse.toBinary(value)), + requestSerialize: value => Buffer.from(PromptHardwareKeyPINRequest.toBinary(value)) + }, + promptHardwareKeyTouch: { + path: "/teleport.lib.teleterm.v1.TshdEventsService/PromptHardwareKeyTouch", + originalName: "PromptHardwareKeyTouch", + requestStream: false, + responseStream: false, + responseDeserialize: bytes => PromptHardwareKeyTouchResponse.fromBinary(bytes), + requestDeserialize: bytes => PromptHardwareKeyTouchRequest.fromBinary(bytes), + responseSerialize: value => Buffer.from(PromptHardwareKeyTouchResponse.toBinary(value)), + requestSerialize: value => Buffer.from(PromptHardwareKeyTouchRequest.toBinary(value)) + }, + promptHardwareKeyPINChange: { + path: "/teleport.lib.teleterm.v1.TshdEventsService/PromptHardwareKeyPINChange", + originalName: "PromptHardwareKeyPINChange", + requestStream: false, + responseStream: false, + responseDeserialize: bytes => PromptHardwareKeyPINChangeResponse.fromBinary(bytes), + requestDeserialize: bytes => PromptHardwareKeyPINChangeRequest.fromBinary(bytes), + responseSerialize: value => Buffer.from(PromptHardwareKeyPINChangeResponse.toBinary(value)), + requestSerialize: value => Buffer.from(PromptHardwareKeyPINChangeRequest.toBinary(value)) + }, + confirmHardwareKeySlotOverwrite: { + path: "/teleport.lib.teleterm.v1.TshdEventsService/ConfirmHardwareKeySlotOverwrite", + originalName: "ConfirmHardwareKeySlotOverwrite", + requestStream: false, + responseStream: false, + responseDeserialize: bytes => ConfirmHardwareKeySlotOverwriteResponse.fromBinary(bytes), + requestDeserialize: bytes => ConfirmHardwareKeySlotOverwriteRequest.fromBinary(bytes), + responseSerialize: value => Buffer.from(ConfirmHardwareKeySlotOverwriteResponse.toBinary(value)), + requestSerialize: value => Buffer.from(ConfirmHardwareKeySlotOverwriteRequest.toBinary(value)) + }, getUsageReportingSettings: { path: "/teleport.lib.teleterm.v1.TshdEventsService/GetUsageReportingSettings", originalName: "GetUsageReportingSettings", diff --git a/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.ts b/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.ts index 1fc11883d6438..6bc1ef96ed469 100644 --- a/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.ts +++ b/gen/proto/ts/teleport/lib/teleterm/v1/tshd_events_service_pb.ts @@ -246,6 +246,121 @@ export interface PromptMFAResponse { */ totpCode: string; } +/** + * Request for PromptHardwareKeyPIN. + * + * @generated from protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyPINRequest + */ +export interface PromptHardwareKeyPINRequest { + /** + * @generated from protobuf field: string root_cluster_uri = 1; + */ + rootClusterUri: string; + /** + * Specifies if a PIN is optional, allowing the user to set it up if left empty. + * + * @generated from protobuf field: bool pin_optional = 2; + */ + pinOptional: boolean; +} +/** + * Response for PromptHardwareKeyPIN. + * + * @generated from protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyPINResponse + */ +export interface PromptHardwareKeyPINResponse { + /** + * pin as inputted by the user in the Electron app. + * + * @generated from protobuf field: string pin = 1; + */ + pin: string; +} +/** + * Request for PromptHardwareKeyTouchRequest. + * + * @generated from protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyTouchRequest + */ +export interface PromptHardwareKeyTouchRequest { + /** + * @generated from protobuf field: string root_cluster_uri = 1; + */ + rootClusterUri: string; +} +/** + * Response for PromptHardwareKeyTouch. + * + * @generated from protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyTouchResponse + */ +export interface PromptHardwareKeyTouchResponse { +} +/** + * Response for PromptHardwareKeyPINChange. + * + * @generated from protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeRequest + */ +export interface PromptHardwareKeyPINChangeRequest { + /** + * @generated from protobuf field: string root_cluster_uri = 1; + */ + rootClusterUri: string; +} +/** + * Response for PromptHardwareKeyPINChange. + * + * @generated from protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeResponse + */ +export interface PromptHardwareKeyPINChangeResponse { + /** + * New pin set by the user. + * + * @generated from protobuf field: string pin = 1; + */ + pin: string; + /** + * PUK is needed to change the PIN. + * This is a new PUK if it has not been changed from the default PUK. + * + * @generated from protobuf field: string puk = 2; + */ + puk: string; + /** + * puk_changed is true if the user changed the default PUK. + * + * @generated from protobuf field: bool puk_changed = 3; + */ + pukChanged: boolean; +} +/** + * Request for ConfirmHardwareKeySlotOverwrite. + * + * @generated from protobuf message teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteRequest + */ +export interface ConfirmHardwareKeySlotOverwriteRequest { + /** + * @generated from protobuf field: string root_cluster_uri = 1; + */ + rootClusterUri: string; + /** + * Message to display in the prompt. + * + * @generated from protobuf field: string message = 2; + */ + message: string; +} +/** + * Response for ConfirmHardwareKeySlotOverwrite. + * + * @generated from protobuf message teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteResponse + */ +export interface ConfirmHardwareKeySlotOverwriteResponse { + /** + * If true, the slot will be overridden. + * + * @generated from protobuf field: bool confirmed = 1; + */ + confirmed: boolean; +} /** * Request for GetUsageReportingSettings. * @@ -918,6 +1033,392 @@ class PromptMFAResponse$Type extends MessageType { */ export const PromptMFAResponse = new PromptMFAResponse$Type(); // @generated message type with reflection information, may provide speed optimized methods +class PromptHardwareKeyPINRequest$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.v1.PromptHardwareKeyPINRequest", [ + { no: 1, name: "root_cluster_uri", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "pin_optional", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): PromptHardwareKeyPINRequest { + const message = globalThis.Object.create((this.messagePrototype!)); + message.rootClusterUri = ""; + message.pinOptional = false; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PromptHardwareKeyPINRequest): PromptHardwareKeyPINRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string root_cluster_uri */ 1: + message.rootClusterUri = reader.string(); + break; + case /* bool pin_optional */ 2: + message.pinOptional = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PromptHardwareKeyPINRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string root_cluster_uri = 1; */ + if (message.rootClusterUri !== "") + writer.tag(1, WireType.LengthDelimited).string(message.rootClusterUri); + /* bool pin_optional = 2; */ + if (message.pinOptional !== false) + writer.tag(2, WireType.Varint).bool(message.pinOptional); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyPINRequest + */ +export const PromptHardwareKeyPINRequest = new PromptHardwareKeyPINRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PromptHardwareKeyPINResponse$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.v1.PromptHardwareKeyPINResponse", [ + { no: 1, name: "pin", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): PromptHardwareKeyPINResponse { + const message = globalThis.Object.create((this.messagePrototype!)); + message.pin = ""; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PromptHardwareKeyPINResponse): PromptHardwareKeyPINResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string pin */ 1: + message.pin = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PromptHardwareKeyPINResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string pin = 1; */ + if (message.pin !== "") + writer.tag(1, WireType.LengthDelimited).string(message.pin); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyPINResponse + */ +export const PromptHardwareKeyPINResponse = new PromptHardwareKeyPINResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PromptHardwareKeyTouchRequest$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.v1.PromptHardwareKeyTouchRequest", [ + { no: 1, name: "root_cluster_uri", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): PromptHardwareKeyTouchRequest { + const message = globalThis.Object.create((this.messagePrototype!)); + message.rootClusterUri = ""; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PromptHardwareKeyTouchRequest): PromptHardwareKeyTouchRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string root_cluster_uri */ 1: + message.rootClusterUri = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PromptHardwareKeyTouchRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string root_cluster_uri = 1; */ + if (message.rootClusterUri !== "") + writer.tag(1, WireType.LengthDelimited).string(message.rootClusterUri); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyTouchRequest + */ +export const PromptHardwareKeyTouchRequest = new PromptHardwareKeyTouchRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PromptHardwareKeyTouchResponse$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.v1.PromptHardwareKeyTouchResponse", []); + } + create(value?: PartialMessage): PromptHardwareKeyTouchResponse { + const message = globalThis.Object.create((this.messagePrototype!)); + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PromptHardwareKeyTouchResponse): PromptHardwareKeyTouchResponse { + return target ?? this.create(); + } + internalBinaryWrite(message: PromptHardwareKeyTouchResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyTouchResponse + */ +export const PromptHardwareKeyTouchResponse = new PromptHardwareKeyTouchResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PromptHardwareKeyPINChangeRequest$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeRequest", [ + { no: 1, name: "root_cluster_uri", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): PromptHardwareKeyPINChangeRequest { + const message = globalThis.Object.create((this.messagePrototype!)); + message.rootClusterUri = ""; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PromptHardwareKeyPINChangeRequest): PromptHardwareKeyPINChangeRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string root_cluster_uri */ 1: + message.rootClusterUri = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PromptHardwareKeyPINChangeRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string root_cluster_uri = 1; */ + if (message.rootClusterUri !== "") + writer.tag(1, WireType.LengthDelimited).string(message.rootClusterUri); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeRequest + */ +export const PromptHardwareKeyPINChangeRequest = new PromptHardwareKeyPINChangeRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class PromptHardwareKeyPINChangeResponse$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeResponse", [ + { no: 1, name: "pin", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "puk", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 3, name: "puk_changed", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): PromptHardwareKeyPINChangeResponse { + const message = globalThis.Object.create((this.messagePrototype!)); + message.pin = ""; + message.puk = ""; + message.pukChanged = false; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: PromptHardwareKeyPINChangeResponse): PromptHardwareKeyPINChangeResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string pin */ 1: + message.pin = reader.string(); + break; + case /* string puk */ 2: + message.puk = reader.string(); + break; + case /* bool puk_changed */ 3: + message.pukChanged = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: PromptHardwareKeyPINChangeResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string pin = 1; */ + if (message.pin !== "") + writer.tag(1, WireType.LengthDelimited).string(message.pin); + /* string puk = 2; */ + if (message.puk !== "") + writer.tag(2, WireType.LengthDelimited).string(message.puk); + /* bool puk_changed = 3; */ + if (message.pukChanged !== false) + writer.tag(3, WireType.Varint).bool(message.pukChanged); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.v1.PromptHardwareKeyPINChangeResponse + */ +export const PromptHardwareKeyPINChangeResponse = new PromptHardwareKeyPINChangeResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ConfirmHardwareKeySlotOverwriteRequest$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteRequest", [ + { no: 1, name: "root_cluster_uri", kind: "scalar", T: 9 /*ScalarType.STRING*/ }, + { no: 2, name: "message", kind: "scalar", T: 9 /*ScalarType.STRING*/ } + ]); + } + create(value?: PartialMessage): ConfirmHardwareKeySlotOverwriteRequest { + const message = globalThis.Object.create((this.messagePrototype!)); + message.rootClusterUri = ""; + message.message = ""; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ConfirmHardwareKeySlotOverwriteRequest): ConfirmHardwareKeySlotOverwriteRequest { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* string root_cluster_uri */ 1: + message.rootClusterUri = reader.string(); + break; + case /* string message */ 2: + message.message = reader.string(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ConfirmHardwareKeySlotOverwriteRequest, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* string root_cluster_uri = 1; */ + if (message.rootClusterUri !== "") + writer.tag(1, WireType.LengthDelimited).string(message.rootClusterUri); + /* string message = 2; */ + if (message.message !== "") + writer.tag(2, WireType.LengthDelimited).string(message.message); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteRequest + */ +export const ConfirmHardwareKeySlotOverwriteRequest = new ConfirmHardwareKeySlotOverwriteRequest$Type(); +// @generated message type with reflection information, may provide speed optimized methods +class ConfirmHardwareKeySlotOverwriteResponse$Type extends MessageType { + constructor() { + super("teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteResponse", [ + { no: 1, name: "confirmed", kind: "scalar", T: 8 /*ScalarType.BOOL*/ } + ]); + } + create(value?: PartialMessage): ConfirmHardwareKeySlotOverwriteResponse { + const message = globalThis.Object.create((this.messagePrototype!)); + message.confirmed = false; + if (value !== undefined) + reflectionMergePartial(this, message, value); + return message; + } + internalBinaryRead(reader: IBinaryReader, length: number, options: BinaryReadOptions, target?: ConfirmHardwareKeySlotOverwriteResponse): ConfirmHardwareKeySlotOverwriteResponse { + let message = target ?? this.create(), end = reader.pos + length; + while (reader.pos < end) { + let [fieldNo, wireType] = reader.tag(); + switch (fieldNo) { + case /* bool confirmed */ 1: + message.confirmed = reader.bool(); + break; + default: + let u = options.readUnknownField; + if (u === "throw") + throw new globalThis.Error(`Unknown field ${fieldNo} (wire type ${wireType}) for ${this.typeName}`); + let d = reader.skip(wireType); + if (u !== false) + (u === true ? UnknownFieldHandler.onRead : u)(this.typeName, message, fieldNo, wireType, d); + } + } + return message; + } + internalBinaryWrite(message: ConfirmHardwareKeySlotOverwriteResponse, writer: IBinaryWriter, options: BinaryWriteOptions): IBinaryWriter { + /* bool confirmed = 1; */ + if (message.confirmed !== false) + writer.tag(1, WireType.Varint).bool(message.confirmed); + let u = options.writeUnknownFields; + if (u !== false) + (u == true ? UnknownFieldHandler.onWrite : u)(this.typeName, message, writer); + return writer; + } +} +/** + * @generated MessageType for protobuf message teleport.lib.teleterm.v1.ConfirmHardwareKeySlotOverwriteResponse + */ +export const ConfirmHardwareKeySlotOverwriteResponse = new ConfirmHardwareKeySlotOverwriteResponse$Type(); +// @generated message type with reflection information, may provide speed optimized methods class GetUsageReportingSettingsRequest$Type extends MessageType { constructor() { super("teleport.lib.teleterm.v1.GetUsageReportingSettingsRequest", []); @@ -1115,6 +1616,10 @@ export const TshdEventsService = new ServiceType("teleport.lib.teleterm.v1.TshdE { name: "SendNotification", options: {}, I: SendNotificationRequest, O: SendNotificationResponse }, { name: "SendPendingHeadlessAuthentication", options: {}, I: SendPendingHeadlessAuthenticationRequest, O: SendPendingHeadlessAuthenticationResponse }, { name: "PromptMFA", options: {}, I: PromptMFARequest, O: PromptMFAResponse }, + { name: "PromptHardwareKeyPIN", options: {}, I: PromptHardwareKeyPINRequest, O: PromptHardwareKeyPINResponse }, + { name: "PromptHardwareKeyTouch", options: {}, I: PromptHardwareKeyTouchRequest, O: PromptHardwareKeyTouchResponse }, + { name: "PromptHardwareKeyPINChange", options: {}, I: PromptHardwareKeyPINChangeRequest, O: PromptHardwareKeyPINChangeResponse }, + { name: "ConfirmHardwareKeySlotOverwrite", options: {}, I: ConfirmHardwareKeySlotOverwriteRequest, O: ConfirmHardwareKeySlotOverwriteResponse }, { name: "GetUsageReportingSettings", options: {}, I: GetUsageReportingSettingsRequest, O: GetUsageReportingSettingsResponse }, { name: "ReportUnexpectedVnetShutdown", options: {}, I: ReportUnexpectedVnetShutdownRequest, O: ReportUnexpectedVnetShutdownResponse } ]); diff --git a/lib/teleterm/daemon/hardwarekeyprompt.go b/lib/teleterm/daemon/hardwarekeyprompt.go new file mode 100644 index 0000000000000..4c8b5838a3b01 --- /dev/null +++ b/lib/teleterm/daemon/hardwarekeyprompt.go @@ -0,0 +1,108 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package daemon + +import ( + "context" + + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/utils/keys" + api "github.com/gravitational/teleport/gen/proto/go/teleport/lib/teleterm/v1" + "github.com/gravitational/teleport/lib/teleterm/api/uri" +) + +// NewHardwareKeyPromptConstructor returns a new hardware key prompt constructor +// for this service and the given root cluster URI. +func (s *Service) NewHardwareKeyPromptConstructor(rootClusterURI uri.ResourceURI) keys.HardwareKeyPrompt { + return &hardwareKeyPrompter{s: s, rootClusterURI: rootClusterURI} +} + +type hardwareKeyPrompter struct { + s *Service + rootClusterURI uri.ResourceURI +} + +// Touch prompts the user to touch the hardware key. +func (h *hardwareKeyPrompter) Touch(ctx context.Context) error { + if err := h.s.importantModalSemaphore.Acquire(ctx); err != nil { + return trace.Wrap(err) + } + defer h.s.importantModalSemaphore.Release() + _, err := h.s.tshdEventsClient.PromptHardwareKeyTouch(ctx, &api.PromptHardwareKeyTouchRequest{ + RootClusterUri: h.rootClusterURI.String(), + }) + if err != nil { + return trace.Wrap(err) + } + return nil +} + +// AskPIN prompts the user for a PIN. +func (h *hardwareKeyPrompter) AskPIN(ctx context.Context, requirement keys.PINPromptRequirement) (string, error) { + if err := h.s.importantModalSemaphore.Acquire(ctx); err != nil { + return "", trace.Wrap(err) + } + defer h.s.importantModalSemaphore.Release() + res, err := h.s.tshdEventsClient.PromptHardwareKeyPIN(ctx, &api.PromptHardwareKeyPINRequest{ + RootClusterUri: h.rootClusterURI.String(), + PinOptional: requirement == keys.PINOptional, + }) + if err != nil { + return "", trace.Wrap(err) + } + return res.Pin, nil +} + +// ChangePIN asks for a new PIN. +// The Electron app prompt must handle default values for PIN and PUK, +// preventing the user from submitting empty/default values. +func (h *hardwareKeyPrompter) ChangePIN(ctx context.Context) (*keys.PINAndPUK, error) { + if err := h.s.importantModalSemaphore.Acquire(ctx); err != nil { + return nil, trace.Wrap(err) + } + defer h.s.importantModalSemaphore.Release() + res, err := h.s.tshdEventsClient.PromptHardwareKeyPINChange(ctx, &api.PromptHardwareKeyPINChangeRequest{ + RootClusterUri: h.rootClusterURI.String(), + }) + if err != nil { + return nil, trace.Wrap(err) + } + return &keys.PINAndPUK{ + PIN: res.Pin, + PUK: res.Puk, + PUKChanged: res.PukChanged, + }, nil +} + +// ConfirmSlotOverwrite asks the user if the slot's private key and certificate can be overridden. +func (h *hardwareKeyPrompter) ConfirmSlotOverwrite(ctx context.Context, message string) (bool, error) { + if err := h.s.importantModalSemaphore.Acquire(ctx); err != nil { + return false, trace.Wrap(err) + } + defer h.s.importantModalSemaphore.Release() + res, err := h.s.tshdEventsClient.ConfirmHardwareKeySlotOverwrite(ctx, &api.ConfirmHardwareKeySlotOverwriteRequest{ + RootClusterUri: h.rootClusterURI.String(), + Message: message, + }) + if err != nil { + return false, trace.Wrap(err) + } + return res.Confirmed, nil +} diff --git a/lib/teleterm/teleterm.go b/lib/teleterm/teleterm.go index fd868169642e0..c8bc92b4e0e8a 100644 --- a/lib/teleterm/teleterm.go +++ b/lib/teleterm/teleterm.go @@ -42,6 +42,7 @@ import ( // Serve starts daemon service func Serve(ctx context.Context, cfg Config) error { + var hardwareKeyPromptConstructor func(clusterURI uri.ResourceURI) keys.HardwareKeyPrompt if err := cfg.CheckAndSetDefaults(); err != nil { return trace.Wrap(err) } @@ -58,8 +59,8 @@ func Serve(ctx context.Context, cfg Config) error { Clock: clock, InsecureSkipVerify: cfg.InsecureSkipVerify, AddKeysToAgent: cfg.AddKeysToAgent, - HardwareKeyPromptConstructor: func(clusterURI uri.ResourceURI) keys.HardwareKeyPrompt { - return nil + HardwareKeyPromptConstructor: func(rootClusterURI uri.ResourceURI) keys.HardwareKeyPrompt { + return hardwareKeyPromptConstructor(rootClusterURI) }, }) if err != nil { @@ -80,6 +81,9 @@ func Serve(ctx context.Context, cfg Config) error { return trace.Wrap(err) } + // TODO(gzdunek): Move tshdEventsClient out of daemonService so that we can + // construct the prompt before creating Storage. + hardwareKeyPromptConstructor = daemonService.NewHardwareKeyPromptConstructor apiServer, err := apiserver.New(apiserver.Config{ HostAddr: cfg.Addr, InsecureSkipVerify: cfg.InsecureSkipVerify, diff --git a/proto/teleport/lib/teleterm/v1/tshd_events_service.proto b/proto/teleport/lib/teleterm/v1/tshd_events_service.proto index 1e5b6b6a53d45..de3f127c62a2d 100644 --- a/proto/teleport/lib/teleterm/v1/tshd_events_service.proto +++ b/proto/teleport/lib/teleterm/v1/tshd_events_service.proto @@ -44,6 +44,22 @@ service TshdEventsService { // code. rpc PromptMFA(PromptMFARequest) returns (PromptMFAResponse); + // PromptHardwareKeyPIN notifies the Electron app that the daemon is waiting for the user to + // provide the hardware key PIN. + rpc PromptHardwareKeyPIN(PromptHardwareKeyPINRequest) returns (PromptHardwareKeyPINResponse); + + // PromptHardwareKeyTouch notifies the Electron app that the daemon is waiting for the user to touch the hardware key. + // When the daemon detects the touch, it cancels the prompt. + rpc PromptHardwareKeyTouch(PromptHardwareKeyTouchRequest) returns (PromptHardwareKeyTouchResponse); + + // PromptHardwareKeyPINChange notifies the Electron app that the daemon is waiting for the user to + // change the hardware key PIN. + rpc PromptHardwareKeyPINChange(PromptHardwareKeyPINChangeRequest) returns (PromptHardwareKeyPINChangeResponse); + + // ConfirmHardwareKeySlotOverwrite displays a dialog prompting the user to confirm whether + // the slot's private key and certificate should be overwritten. + rpc ConfirmHardwareKeySlotOverwrite(ConfirmHardwareKeySlotOverwriteRequest) returns (ConfirmHardwareKeySlotOverwriteResponse); + // GetUsageReportingSettings returns the current state of usage reporting. // At the moment, the user cannot toggle usage reporting on and off without shutting down the app, // with the only exception being the first start of the app when they're prompted about telemetry. @@ -146,6 +162,56 @@ message PromptMFAResponse { string totp_code = 1; } +// Request for PromptHardwareKeyPIN. +message PromptHardwareKeyPINRequest { + string root_cluster_uri = 1; + // Specifies if a PIN is optional, allowing the user to set it up if left empty. + bool pin_optional = 2; +} + +// Response for PromptHardwareKeyPIN. +message PromptHardwareKeyPINResponse { + // pin as inputted by the user in the Electron app. + string pin = 1; +} + +// Request for PromptHardwareKeyTouchRequest. +message PromptHardwareKeyTouchRequest { + string root_cluster_uri = 1; +} + +// Response for PromptHardwareKeyTouch. +message PromptHardwareKeyTouchResponse {} + +// Response for PromptHardwareKeyPINChange. +message PromptHardwareKeyPINChangeRequest { + string root_cluster_uri = 1; +} + +// Response for PromptHardwareKeyPINChange. +message PromptHardwareKeyPINChangeResponse { + // New pin set by the user. + string pin = 1; + // PUK is needed to change the PIN. + // This is a new PUK if it has not been changed from the default PUK. + string puk = 2; + // puk_changed is true if the user changed the default PUK. + bool puk_changed = 3; +} + +// Request for ConfirmHardwareKeySlotOverwrite. +message ConfirmHardwareKeySlotOverwriteRequest { + string root_cluster_uri = 1; + // Message to display in the prompt. + string message = 2; +} + +// Response for ConfirmHardwareKeySlotOverwrite. +message ConfirmHardwareKeySlotOverwriteResponse { + // If true, the slot will be overridden. + bool confirmed = 1; +} + // Request for GetUsageReportingSettings. message GetUsageReportingSettingsRequest {} diff --git a/web/packages/teleterm/src/services/tshd/interceptors.ts b/web/packages/teleterm/src/services/tshd/interceptors.ts index a3375ea1f32a2..3acd92d81feef 100644 --- a/web/packages/teleterm/src/services/tshd/interceptors.ts +++ b/web/packages/teleterm/src/services/tshd/interceptors.ts @@ -22,7 +22,7 @@ import { isObject } from 'shared/utils/highbar'; import Logger from 'teleterm/logger'; -const SENSITIVE_PROPERTIES = ['password', 'authClusterId', 'pin']; +const SENSITIVE_PROPERTIES = ['password', 'authClusterId', 'pin', 'puk']; export function loggingInterceptor(logger: Logger): RpcInterceptor { return { diff --git a/web/packages/teleterm/src/services/tshdEvents/index.ts b/web/packages/teleterm/src/services/tshdEvents/index.ts index eb63c14cb9a3d..a8744d9a7c576 100644 --- a/web/packages/teleterm/src/services/tshdEvents/index.ts +++ b/web/packages/teleterm/src/services/tshdEvents/index.ts @@ -206,6 +206,18 @@ function createService(logger: Logger): { const service: apiService.ITshdEventsService = { relogin: (call, callback) => processEvent('relogin', call, callback), + promptHardwareKeyPIN: (call, callback) => + processEvent('promptHardwareKeyPIN', call, callback), + + promptHardwareKeyTouch: (call, callback) => + processEvent('promptHardwareKeyTouch', call, callback), + + promptHardwareKeyPINChange: (call, callback) => + processEvent('promptHardwareKeyPINChange', call, callback), + + confirmHardwareKeySlotOverwrite: (call, callback) => + processEvent('confirmHardwareKeySlotOverwrite', call, callback), + sendNotification: (call, callback) => processEvent('sendNotification', call, callback), diff --git a/web/packages/teleterm/src/ui/ModalsHost/ModalsHost.tsx b/web/packages/teleterm/src/ui/ModalsHost/ModalsHost.tsx index 582eaa09a49b9..09e1c09a94cd3 100644 --- a/web/packages/teleterm/src/ui/ModalsHost/ModalsHost.tsx +++ b/web/packages/teleterm/src/ui/ModalsHost/ModalsHost.tsx @@ -34,6 +34,7 @@ import { UserJobRole } from './modals/UserJobRole'; import { ReAuthenticate } from './modals/ReAuthenticate'; import { AuthenticateWebDevice } from './modals/AuthenticateWebDevice/AuthenticateWebDevice'; import { ChangeAccessRequestKind } from './modals/ChangeAccessRequestKind'; +import { AskPin, ChangePin, OverwriteSlot, Touch } from './modals/HardwareKeys'; export default function ModalsHost() { const { modalsService } = useAppContext(); @@ -202,6 +203,56 @@ function renderDialog(dialog: Dialog, handleClose: () => void) { /> ); } + case 'hardware-key-pin': { + return ( + { + handleClose(); + dialog.onSuccess(res); + }} + onCancel={() => { + handleClose(); + dialog.onCancel(); + }} + /> + ); + } + case 'hardware-key-touch': { + return ( + { + handleClose(); + dialog.onCancel(); + }} + /> + ); + } + case 'hardware-key-pin-change': { + return ( + { + handleClose(); + dialog.onCancel(); + }} + /> + ); + } + case 'hardware-key-slot-overwrite': { + return ( + { + handleClose(); + dialog.onCancel(); + }} + /> + ); + } case 'none': { return null; diff --git a/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/AskPin.tsx b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/AskPin.tsx new file mode 100644 index 0000000000000..2dbf6da7e1472 --- /dev/null +++ b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/AskPin.tsx @@ -0,0 +1,98 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { useState } from 'react'; + +import DialogConfirmation, { + DialogContent, + DialogFooter, +} from 'design/DialogConfirmation'; +import { ButtonPrimary, Flex, P2 } from 'design'; +import FieldInput from 'shared/components/FieldInput'; +import Validation from 'shared/components/Validation'; +import { requiredField } from 'shared/components/Validation/rules'; + +import { PromptHardwareKeyPINRequest } from 'gen-proto-ts/teleport/lib/teleterm/v1/tshd_events_service_pb'; + +import { CommonHeader } from './CommonHeader'; + +export function AskPin(props: { + req: PromptHardwareKeyPINRequest; + onCancel(): void; + onSuccess(pin: string): void; +}) { + const [pin, setPin] = useState(''); + + return ( + ({ + maxWidth: '450px', + width: '100%', + })} + > + + {({ validator }) => ( +
{ + e.preventDefault(); + validator.validate() && props.onSuccess(pin); + }} + > + + + + + + Enter your YubiKey PIV PIN. +
+ {props.req.pinOptional && + 'To change the default PIN, leave the field blank.'} +
+ + setPin(e.target.value)} + placeholder="123 456" + mb={0} + /> +
+
+ + + Continue + + + )} +
+
+ ); +} diff --git a/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/ChangePin.tsx b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/ChangePin.tsx new file mode 100644 index 0000000000000..64fb239cc6f6e --- /dev/null +++ b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/ChangePin.tsx @@ -0,0 +1,257 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { useState } from 'react'; + +import DialogConfirmation, { + DialogContent, + DialogFooter, +} from 'design/DialogConfirmation'; +import { ButtonPrimary, Flex, Toggle, P2 } from 'design'; +import Validation from 'shared/components/Validation'; +import FieldInput from 'shared/components/FieldInput'; +import { + PromptHardwareKeyPINChangeRequest, + PromptHardwareKeyPINChangeResponse, +} from 'gen-proto-ts/teleport/lib/teleterm/v1/tshd_events_service_pb'; + +import { + requiredField, + Rule, + requiredAll, +} from 'shared/components/Validation/rules'; + +import { CommonHeader } from './CommonHeader'; + +const DEFAULT_PIN = '123456'; +const DEFAULT_PUK = '12345678'; + +export function ChangePin(props: { + req: PromptHardwareKeyPINChangeRequest; + onCancel(): void; + onSuccess(response: PromptHardwareKeyPINChangeResponse): void; +}) { + const [pin, setPin] = useState(''); + const [confirmPin, setConfirmPin] = useState(''); + const [puk, setPuk] = useState(''); + const [newPuk, setNewPuk] = useState(''); + const [confirmNewPuk, setConfirmNewPuk] = useState(''); + const [pukChanged, setPukChanged] = useState(false); + + return ( + ({ + maxWidth: '450px', + width: '100%', + })} + > + + {({ validator }) => ( +
{ + e.preventDefault(); + validator.validate() && + props.onSuccess({ + pin, + pukChanged: pukChanged, + puk: pukChanged ? newPuk : puk, + }); + }} + > + + + + + + The default PIV PIN is not allowed. +
+ Please set a new PIV PIN for your hardware key before + proceeding. Both the PIN and PUK must be 4-6 characters long. +
+ + setPin(e.target.value)} + mb={0} + rule={requiredAll( + requiredField('New PIV PIN is required'), + notDefaultPin(), + correctLength('PIV PIN must be 4-6 characters long') + )} + /> + setConfirmPin(e.target.value)} + mb={0} + rule={requiredAll( + requiredConfirmed(pin, { + confirm: 'Confirm New PIV PIN is required', + doesNotMatch: 'PIV PIN does not match', + }), + notDefaultPin(), + correctLength('PIV PIN must be 4-6 characters long') + )} + /> + + + To change the PIN, please provide your PUK code. +
+ For security purposes, the default PUK ({DEFAULT_PUK}) cannot + be used. If you haven't changed your PUK yet, you'll need to + update it now. +
+ setPukChanged(p => !p)} + > + + Set up new PUK + + + + {!pukChanged ? ( + setPuk(e.target.value)} + mb={0} + rule={requiredAll( + requiredField('PUK is required'), + notDefaultPuk(), + correctLength('PUK must be 4-6 characters long') + )} + /> + ) : ( + <> + setNewPuk(e.target.value)} + mb={0} + rule={requiredAll( + requiredField('New PUK is required'), + notDefaultPuk(), + correctLength('PUK must be 4-6 characters long') + )} + /> + setConfirmNewPuk(e.target.value)} + mb={0} + rule={requiredAll( + requiredConfirmed(pin, { + confirm: 'Confirm New PUK is required', + doesNotMatch: 'PUK does not match', + }), + notDefaultPuk(), + correctLength('PUK must be 4-6 characters long') + )} + /> + + )} +
+
+ + + Continue + + + )} +
+
+ ); +} + +const notDefaultPin = + (): Rule => + value => + () => { + const message = 'Default PIN is not allowed'; + const valid = value !== DEFAULT_PIN; + return { + valid, + message: !valid ? message : '', + }; + }; + +const notDefaultPuk = + (): Rule => + value => + () => { + const message = 'Default PUK is not allowed'; + const valid = value !== DEFAULT_PUK; + return { + valid, + message: !valid ? message : '', + }; + }; + +const correctLength = + (message: string): Rule => + value => + () => { + const valid = + typeof value === 'string' && value.length >= 4 && value.length <= 6; + return { + valid, + message: !valid ? message : '', + }; + }; + +const requiredConfirmed = + ( + code: string, + messages: { + confirm: string; + doesNotMatch: string; + } + ): Rule => + (confirmedCode: string) => + () => { + if (!confirmedCode) { + return { + valid: false, + message: messages.confirm, + }; + } + + if (confirmedCode !== code) { + return { + valid: false, + message: messages.doesNotMatch, + }; + } + + return { + valid: true, + }; + }; diff --git a/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/CommonHeader.tsx b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/CommonHeader.tsx new file mode 100644 index 0000000000000..8027886e8fa64 --- /dev/null +++ b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/CommonHeader.tsx @@ -0,0 +1,46 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { H2, ButtonIcon } from 'design'; +import * as icons from 'design/Icon'; +import { DialogHeader } from 'design/Dialog'; + +import { RootClusterUri, routing } from 'teleterm/ui/uri'; + +export function CommonHeader(props: { + onCancel(): void; + rootClusterUri: RootClusterUri; +}) { + const rootClusterName = routing.parseClusterName(props.rootClusterUri); + + return ( + +

+ Unlock hardware key to access {rootClusterName} +

+ + + + +
+ ); +} diff --git a/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/OverwriteSlot.tsx b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/OverwriteSlot.tsx new file mode 100644 index 0000000000000..1a67d691c9747 --- /dev/null +++ b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/OverwriteSlot.tsx @@ -0,0 +1,68 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import DialogConfirmation, { + DialogContent, + DialogFooter, +} from 'design/DialogConfirmation'; +import { ButtonPrimary, ButtonSecondary, Flex, P2 } from 'design'; +import { ConfirmHardwareKeySlotOverwriteRequest } from 'gen-proto-ts/teleport/lib/teleterm/v1/tshd_events_service_pb'; + +import { CommonHeader } from './CommonHeader'; + +export function OverwriteSlot(props: { + req: ConfirmHardwareKeySlotOverwriteRequest; + onCancel(): void; + onConfirm(): void; +}) { + return ( + ({ + maxWidth: '450px', + width: '100%', + })} + > +
{ + e.preventDefault(); + props.onConfirm(); + }} + > + + + + {props.req.message} + + + + + Yes + + No + + + + +
+ ); +} diff --git a/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/Touch.tsx b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/Touch.tsx new file mode 100644 index 0000000000000..a25e1f42dc5fd --- /dev/null +++ b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/Touch.tsx @@ -0,0 +1,63 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import DialogConfirmation, { DialogContent } from 'design/DialogConfirmation'; +import { Flex, Image, P2 } from 'design'; + +import { PromptHardwareKeyTouchRequest } from 'gen-proto-ts/teleport/lib/teleterm/v1/tshd_events_service_pb'; + +import svgHardwareKey from 'teleterm/ui/ClusterConnect/ClusterLogin/FormLogin/PromptWebauthn/hardware.svg'; +import LinearProgress from 'teleterm/ui/components/LinearProgress'; + +import { CommonHeader } from './CommonHeader'; + +export function Touch(props: { + req: PromptHardwareKeyTouchRequest; + onCancel(): void; +}) { + return ( + ({ + maxWidth: '450px', + width: '100%', + })} + > + + + + + + Touch your YubiKey + + + + + ); +} diff --git a/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/index.story.tsx b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/index.story.tsx new file mode 100644 index 0000000000000..835e3b17606b6 --- /dev/null +++ b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/index.story.tsx @@ -0,0 +1,93 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { Meta } from '@storybook/react'; + +import { makeRootCluster } from 'teleterm/services/tshd/testHelpers'; + +import { Touch as TouchComponent } from './Touch'; +import { OverwriteSlot as OverwriteSlotComponent } from './OverwriteSlot'; +import { ChangePin as ChangePinComponent } from './ChangePin'; +import { AskPin as AskPinComponent } from './AskPin'; + +const rootCluster = makeRootCluster(); + +export default { + title: 'Teleterm/ModalsHost/HardwareKeys', +} satisfies Meta; + +export function AskPinOptional() { + return ( + {}} + onCancel={() => {}} + req={{ + rootClusterUri: rootCluster.uri, + pinOptional: true, + }} + /> + ); +} + +export function AskPinRequired() { + return ( + {}} + onCancel={() => {}} + req={{ + rootClusterUri: rootCluster.uri, + pinOptional: false, + }} + /> + ); +} + +export function Touch() { + return ( + {}} + req={{ + rootClusterUri: rootCluster.uri, + }} + /> + ); +} + +export function ChangePin() { + return ( + {}} + onCancel={() => {}} + req={{ rootClusterUri: rootCluster.uri }} + /> + ); +} + +export function OverwriteSlot() { + return ( + {}} + onCancel={() => {}} + req={{ + rootClusterUri: rootCluster.uri, + message: + "Would you like to overwrite this slot's private key and certificate?", + }} + /> + ); +} diff --git a/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/index.ts b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/index.ts new file mode 100644 index 0000000000000..473dcd5d9694a --- /dev/null +++ b/web/packages/teleterm/src/ui/ModalsHost/modals/HardwareKeys/index.ts @@ -0,0 +1,22 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +export * from './Touch'; +export * from './AskPin'; +export * from './ChangePin'; +export * from './OverwriteSlot'; diff --git a/web/packages/teleterm/src/ui/services/modals/modalsService.ts b/web/packages/teleterm/src/ui/services/modals/modalsService.ts index 6078e49dd2079..421a45c94398f 100644 --- a/web/packages/teleterm/src/ui/services/modals/modalsService.ts +++ b/web/packages/teleterm/src/ui/services/modals/modalsService.ts @@ -220,6 +220,33 @@ export interface DialogChangeAccessRequestKind { onCancel(): void; } +export interface DialogHardwareKeyPin { + kind: 'hardware-key-pin'; + req: tshdEventsApi.PromptHardwareKeyPINRequest; + onSuccess(pin: string): void; + onCancel(): void; +} + +export interface DialogHardwareKeyTouch { + kind: 'hardware-key-touch'; + req: tshdEventsApi.PromptHardwareKeyTouchRequest; + onCancel(): void; +} + +export interface DialogHardwareKeyPinChange { + kind: 'hardware-key-pin-change'; + req: tshdEventsApi.PromptHardwareKeyPINChangeRequest; + onSuccess(res: tshdEventsApi.PromptHardwareKeyPINChangeResponse): void; + onCancel(): void; +} + +export interface DialogHardwareKeySlotOverwrite { + kind: 'hardware-key-slot-overwrite'; + req: tshdEventsApi.ConfirmHardwareKeySlotOverwriteRequest; + onConfirm(): void; + onCancel(): void; +} + export type Dialog = | DialogClusterConnect | DialogClusterLogout @@ -231,4 +258,8 @@ export type Dialog = | DialogHeadlessAuthentication | DialogReAuthenticate | DialogChangeAccessRequestKind + | DialogHardwareKeyPin + | DialogHardwareKeyTouch + | DialogHardwareKeyPinChange + | DialogHardwareKeySlotOverwrite | DialogNone; diff --git a/web/packages/teleterm/src/ui/tshdEvents.ts b/web/packages/teleterm/src/ui/tshdEvents.ts index c48e48faa1481..b06aa73196b9e 100644 --- a/web/packages/teleterm/src/ui/tshdEvents.ts +++ b/web/packages/teleterm/src/ui/tshdEvents.ts @@ -16,6 +16,8 @@ * along with this program. If not, see . */ +import { PromptHardwareKeyPINChangeResponse } from 'gen-proto-ts/teleport/lib/teleterm/v1/tshd_events_service_pb'; + import { TshdEventContextBridgeService } from 'teleterm/types'; import { IAppContext } from 'teleterm/ui/types'; import Logger from 'teleterm/logger'; @@ -101,5 +103,135 @@ export function createTshdEventsContextBridgeService( } return {}; }, + + promptHardwareKeyPIN: async ({ request, onRequestCancelled }) => { + ctx.mainProcessClient.forceFocusWindow(); + const { pin, hasCanceledModal } = await new Promise<{ + pin: string; + hasCanceledModal: boolean; + }>(resolve => { + const { closeDialog } = ctx.modalsService.openImportantDialog({ + kind: 'hardware-key-pin', + req: request, + onSuccess: pin => resolve({ hasCanceledModal: false, pin }), + onCancel: () => + resolve({ + hasCanceledModal: true, + pin: undefined, + }), + }); + + // tshd can cancel the request + onRequestCancelled(closeDialog); + }); + + if (hasCanceledModal) { + throw { + isCrossContextError: true, + name: 'AbortError', + message: 'hardware key PIN modal closed by user', + }; + } + + return { pin: pin }; + }, + + promptHardwareKeyTouch: async ({ request, onRequestCancelled }) => { + ctx.mainProcessClient.forceFocusWindow(); + const { hasCanceledModal } = await new Promise<{ + hasCanceledModal: boolean; + }>(resolve => { + const { closeDialog } = ctx.modalsService.openImportantDialog({ + kind: 'hardware-key-touch', + req: request, + onCancel: () => + resolve({ + hasCanceledModal: true, + }), + }); + + // When a tap is detected, tshd cancels this request. + onRequestCancelled(closeDialog); + }); + + if (hasCanceledModal) { + throw { + isCrossContextError: true, + name: 'AbortError', + message: 'hardware key touch modal closed by user', + }; + } + + return {}; + }, + + promptHardwareKeyPINChange: async ({ request, onRequestCancelled }) => { + const { hasCanceledModal, res } = await new Promise<{ + hasCanceledModal: boolean; + res: PromptHardwareKeyPINChangeResponse; + }>(resolve => { + const { closeDialog } = ctx.modalsService.openImportantDialog({ + kind: 'hardware-key-pin-change', + req: request, + onSuccess: res => { + resolve({ hasCanceledModal: false, res }); + }, + onCancel: () => + resolve({ + hasCanceledModal: true, + res: undefined, + }), + }); + + // tshd can cancel the request + onRequestCancelled(closeDialog); + }); + + if (hasCanceledModal) { + throw { + isCrossContextError: true, + name: 'AbortError', + message: 'hardware key change PIN modal closed by user', + }; + } + + return res; + }, + + confirmHardwareKeySlotOverwrite: async ({ + request, + onRequestCancelled, + }) => { + const { hasCanceledModal, confirmed } = await new Promise<{ + hasCanceledModal: boolean; + confirmed: boolean; + }>(resolve => { + const { closeDialog } = ctx.modalsService.openImportantDialog({ + kind: 'hardware-key-slot-overwrite', + req: request, + onConfirm: () => { + resolve({ hasCanceledModal: false, confirmed: true }); + }, + onCancel: () => + resolve({ + hasCanceledModal: true, + confirmed: false, + }), + }); + + // tshd can cancel the request + onRequestCancelled(closeDialog); + }); + + if (hasCanceledModal) { + throw { + isCrossContextError: true, + name: 'AbortError', + message: 'hardware key slot overwrite modal closed by user', + }; + } + + return { confirmed }; + }, }; } From 802f2bca0db4c0a767498d26f0418fff54fa85b7 Mon Sep 17 00:00:00 2001 From: Trent Clarke Date: Wed, 23 Oct 2024 19:36:45 +1100 Subject: [PATCH 27/70] Adds AWS SDK dependencies for Identity Center Integration (#47786) * Adds AWS SDK dependencies for Identity Center Integration * Terraform mod tidy * Event handler mod tidy * Protect updates from `go mod tidy` * Re-tidy integrations --- e_imports.go | 3 +++ go.mod | 11 +++++++---- go.sum | 22 ++++++++++++++-------- integrations/event-handler/go.mod | 11 +++++++---- integrations/event-handler/go.sum | 22 ++++++++++++++-------- integrations/terraform/go.mod | 11 +++++++---- integrations/terraform/go.sum | 22 ++++++++++++++-------- 7 files changed, 66 insertions(+), 36 deletions(-) diff --git a/e_imports.go b/e_imports.go index a6b1fc2125622..8e6190cab8917 100644 --- a/e_imports.go +++ b/e_imports.go @@ -57,7 +57,10 @@ import ( _ "github.com/aws/aws-sdk-go-v2/service/athena" _ "github.com/aws/aws-sdk-go-v2/service/athena/types" _ "github.com/aws/aws-sdk-go-v2/service/glue" + _ "github.com/aws/aws-sdk-go-v2/service/identitystore" + _ "github.com/aws/aws-sdk-go-v2/service/organizations" _ "github.com/aws/aws-sdk-go-v2/service/s3" + _ "github.com/aws/aws-sdk-go-v2/service/ssoadmin" _ "github.com/aws/aws-sdk-go-v2/service/sts" _ "github.com/aws/aws-sdk-go-v2/service/sts/types" _ "github.com/beevik/etree" diff --git a/go.mod b/go.mod index 26b7458c73761..b75dec86e94a7 100644 --- a/go.mod +++ b/go.mod @@ -42,7 +42,7 @@ require ( github.com/aquasecurity/libbpfgo v0.5.1-libbpf-1.2 github.com/armon/go-radix v1.0.0 github.com/aws/aws-sdk-go v1.55.5 - github.com/aws/aws-sdk-go-v2 v1.31.0 + github.com/aws/aws-sdk-go-v2 v1.32.2 github.com/aws/aws-sdk-go-v2/config v1.27.39 github.com/aws/aws-sdk-go-v2/credentials v1.17.37 github.com/aws/aws-sdk-go-v2/feature/dynamodb/attributevalue v1.15.8 @@ -59,7 +59,9 @@ require ( github.com/aws/aws-sdk-go-v2/service/eks v1.49.3 github.com/aws/aws-sdk-go-v2/service/glue v1.99.2 github.com/aws/aws-sdk-go-v2/service/iam v1.36.3 + github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.2 github.com/aws/aws-sdk-go-v2/service/kms v1.36.3 + github.com/aws/aws-sdk-go-v2/service/organizations v1.34.2 github.com/aws/aws-sdk-go-v2/service/rds v1.85.2 github.com/aws/aws-sdk-go-v2/service/redshift v1.47.3 github.com/aws/aws-sdk-go-v2/service/s3 v1.63.3 @@ -67,9 +69,10 @@ require ( github.com/aws/aws-sdk-go-v2/service/sns v1.32.3 github.com/aws/aws-sdk-go-v2/service/sqs v1.35.3 github.com/aws/aws-sdk-go-v2/service/ssm v1.54.3 + github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.2 github.com/aws/aws-sdk-go-v2/service/sts v1.31.3 github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0 - github.com/aws/smithy-go v1.21.0 + github.com/aws/smithy-go v1.22.0 github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20240918142057-e21b7a4e92d1 github.com/beevik/etree v1.4.1 github.com/buildkite/bintest/v3 v3.3.0 @@ -262,8 +265,8 @@ require ( github.com/apache/arrow/go/v15 v15.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.18 // indirect github.com/aws/aws-sdk-go-v2/service/ecr v1.33.0 // indirect diff --git a/go.sum b/go.sum index 7f0ecb63d99dd..f66f4a8af0e7d 100644 --- a/go.sum +++ b/go.sum @@ -835,8 +835,8 @@ github.com/aws/aws-sdk-go v1.49.12/go.mod h1:LF8svs817+Nz+DmiMQKTO3ubZ/6IaTpq3Tj github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= github.com/aws/aws-sdk-go-v2 v1.18.0/go.mod h1:uzbQtefpm44goOPmdKyAlXSNcwlRgF3ePWVW6EtJvvw= -github.com/aws/aws-sdk-go-v2 v1.31.0 h1:3V05LbxTSItI5kUqNwhJrrrY1BAXxXt0sN0l72QmG5U= -github.com/aws/aws-sdk-go-v2 v1.31.0/go.mod h1:ztolYtaEUtdpf9Wftr31CJfLVjOnD/CVRkKOOYgF8hA= +github.com/aws/aws-sdk-go-v2 v1.32.2 h1:AkNLZEyYMLnx/Q/mSKkcMqwNFXMAvFto9bNsHqcTduI= +github.com/aws/aws-sdk-go-v2 v1.32.2/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5 h1:xDAuZTn4IMm8o1LnBZvmrL8JA1io4o3YWNXgohbf20g= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5/go.mod h1:wYSv6iDS621sEFLfKvpPE2ugjTuGlAG7iROg0hLOkfc= github.com/aws/aws-sdk-go-v2/config v1.18.25/go.mod h1:dZnYpD5wTW/dQF0rRNLVypB396zWCcPiBIvdvSWHEg4= @@ -855,11 +855,11 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14/go.mod h1:7I0Ju7p9mCIdlrf github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.25 h1:HkpHeZMM39sGtMHVYG1buAg93vhj5d7F81y6G0OAbGc= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.25/go.mod h1:j3Vz04ZjaWA6kygOsZRpmWe4CyGqfqq2u3unDTU0QGA= github.com/aws/aws-sdk-go-v2/internal/configsources v1.1.33/go.mod h1:7i0PF1ME/2eUPFcjkVIwq+DOygHEoK92t5cDqNgYbIw= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 h1:kYQ3H1u0ANr9KEKlGs/jTLrBFPo8P8NaH/w7A01NeeM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18/go.mod h1:r506HmK5JDUh9+Mw4CfGJGSSoqIiLCndAuqXuhbv67Y= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 h1:UAsR3xA31QGf79WzpG/ixT9FZvQlh5HY1NRqSHBNOCk= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21/go.mod h1:JNr43NFf5L9YaG3eKTm7HQzls9J+A9YYcGI5Quh1r2Y= github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.4.27/go.mod h1:UrHnn3QV/d0pBZ6QBAEQcqFLf8FAzLmoUfPVIueOvoM= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 h1:Z7IdFUONvTcvS7YuhtVxN99v2cCoHRXOS4mTr0B/pUc= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18/go.mod h1:DkKMmksZVVyat+Y+r1dEOgJEfUeA7UngIHWeKsi0yNc= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 h1:6jZVETqmYCadGFvrYEQfC5fAQmlo80CeL5psbno6r0s= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21/go.mod h1:1SR0GbLlnN3QUmYaflZNiH1ql+1qrSiB2vwcJ+4UM60= github.com/aws/aws-sdk-go-v2/internal/ini v1.3.34/go.mod h1:Etz2dj6UHYuw+Xw830KfzCfWGMzqvUTCjUj5b76GVDc= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= @@ -889,6 +889,8 @@ github.com/aws/aws-sdk-go-v2/service/glue v1.99.2 h1:pfX1qky3shRS3rgxkdXKtiNWtMU github.com/aws/aws-sdk-go-v2/service/glue v1.99.2/go.mod h1:rCyUHLWGaSR9/oQgj2nGKRmPqFwtq3qxL14LkuQdadA= github.com/aws/aws-sdk-go-v2/service/iam v1.36.3 h1:dV9iimLEHKYAz2qTi+tGAD9QCnAG2pLD7HUEHB7m4mI= github.com/aws/aws-sdk-go-v2/service/iam v1.36.3/go.mod h1:HSvujsK8xeEHMIB18oMXjSfqaN9cVqpo/MtHJIksQRk= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.2 h1:QSrf6HsounqUtlFAwArhVNHPt3WXmSm0pz7RtojjBdo= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.2/go.mod h1:PtkL4CXOQy84zudggyFtyJFXCGDRY8igg9Nfo9df1sU= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 h1:QFASJGfT8wMXtuP3D5CRmMjARHv9ZmzFUMJznHDOY3w= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5/go.mod h1:QdZ3OmoIjSX+8D1OPAzPxDfjXASbBMDsz9qvtyIhtik= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20 h1:rTWjG6AvWekO2B1LHeM3ktU7MqyX9rzWQ7hgzneZW7E= @@ -902,6 +904,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18 h1:eb+tFOIl9ZsUe github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18/go.mod h1:GVCC2IJNJTmdlyEsSmofEy7EfJncP7DNnXDzRjJ5Keg= github.com/aws/aws-sdk-go-v2/service/kms v1.36.3 h1:iHi6lC6LfW6SNvB2bixmlOW3WMyWFrHZCWX+P+CCxMk= github.com/aws/aws-sdk-go-v2/service/kms v1.36.3/go.mod h1:OHmlX4+o0XIlJAQGAHPIy0N9yZcYS/vNG+T7geSNcFw= +github.com/aws/aws-sdk-go-v2/service/organizations v1.34.2 h1:ndH1E8olS/rDB+tiUMKj09g0o11PoOLAC+xRFB13bJw= +github.com/aws/aws-sdk-go-v2/service/organizations v1.34.2/go.mod h1:YZvv/wXIgIviYq9P/fQDhoMlzlI89M0D45GnYvIorLk= github.com/aws/aws-sdk-go-v2/service/rds v1.85.2 h1:KDO/FSO8V+zlvnQF6v4nOariw2qwPx5/z2pyb6X7ibk= github.com/aws/aws-sdk-go-v2/service/rds v1.85.2/go.mod h1:lhiPj6RvoJHWG2STp+k5az55YqGgFLBzkKYdYHgUh9g= github.com/aws/aws-sdk-go-v2/service/redshift v1.47.3 h1:TRJP6RflPN5A4yRpyXgznsJTJMT46tKigNAKzd7owic= @@ -919,6 +923,8 @@ github.com/aws/aws-sdk-go-v2/service/ssm v1.54.3/go.mod h1:qs3TBNpFEnVubl0WL3jru github.com/aws/aws-sdk-go-v2/service/sso v1.12.10/go.mod h1:ouy2P4z6sJN70fR3ka3wD3Ro3KezSxU6eKGQI2+2fjI= github.com/aws/aws-sdk-go-v2/service/sso v1.23.3 h1:rs4JCczF805+FDv2tRhZ1NU0RB2H6ryAvsWPanAr72Y= github.com/aws/aws-sdk-go-v2/service/sso v1.23.3/go.mod h1:XRlMvmad0ZNL+75C5FYdMvbbLkd6qiqz6foR1nA1PXY= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.2 h1:O6MhOmqKN1dSmc04jaxmfdmSb3UbeQ715SYdVzNBiL4= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.2/go.mod h1:QkSUZzFJsxztercu38+HLsTz9kHqRvAhVwp9+6SAeFA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.14.10/go.mod h1:AFvkxc8xfBe8XA+5St5XIHHrQQtkxqrRincx4hmMHOk= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3 h1:S7EPdMVZod8BGKQQPTBK+FcX9g7bKR7c4+HxWqHP7Vg= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3/go.mod h1:FnvDM4sfa+isJ3kDXIzAB9GAwVSzFzSy97uZ3IsHo4E= @@ -928,8 +934,8 @@ github.com/aws/aws-sdk-go-v2/service/sts v1.31.3/go.mod h1:yMWe0F+XG0DkRZK5ODZhG github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0 h1:EJsHUYgFBV7/N1YtL73lsfZODAOU+CnNSZfEAlqqQaA= github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0/go.mod h1:AxKuXHc0zv2yYaeueUG7R3ONbcnQIuDj0bkdFmPVRzU= github.com/aws/smithy-go v1.13.5/go.mod h1:Tg+OJXh4MB2R/uN61Ko2f6hTZwB/ZYGOtib8J3gBHzA= -github.com/aws/smithy-go v1.21.0 h1:H7L8dtDRk0P1Qm6y0ji7MCYMQObJ5R9CRpyPhRUkLYA= -github.com/aws/smithy-go v1.21.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= +github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20240918142057-e21b7a4e92d1 h1:SlKqHasm//EZ5eJI3J6+HQWMCw2QS8ha1V7JtMsX6Tc= github.com/awslabs/amazon-ecr-credential-helper/ecr-login v0.0.0-20240918142057-e21b7a4e92d1/go.mod h1:TZP0PQALiGqPiKB35wBb4Z6E/3DCFVh/o2Eul3lVS9Q= github.com/aymanbagabas/go-osc52/v2 v2.0.1 h1:HwpRHbFMcZLEVr42D4p7XBqjyuxQH5SMiErDT4WkJ2k= diff --git a/integrations/event-handler/go.mod b/integrations/event-handler/go.mod index 20ea1568397a2..2e8dcc7c26f60 100644 --- a/integrations/event-handler/go.mod +++ b/integrations/event-handler/go.mod @@ -63,14 +63,14 @@ require ( github.com/armon/go-radix v1.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go v1.55.5 // indirect - github.com/aws/aws-sdk-go-v2 v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.2 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5 // indirect github.com/aws/aws-sdk-go-v2/config v1.27.39 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.37 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.18 // indirect github.com/aws/aws-sdk-go-v2/service/athena v1.46.2 // indirect @@ -80,18 +80,21 @@ require ( github.com/aws/aws-sdk-go-v2/service/eks v1.49.3 // indirect github.com/aws/aws-sdk-go-v2/service/glue v1.99.2 // indirect github.com/aws/aws-sdk-go-v2/service/iam v1.36.3 // indirect + github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18 // indirect github.com/aws/aws-sdk-go-v2/service/kms v1.36.3 // indirect + github.com/aws/aws-sdk-go-v2/service/organizations v1.34.2 // indirect github.com/aws/aws-sdk-go-v2/service/rds v1.85.2 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.63.3 // indirect github.com/aws/aws-sdk-go-v2/service/ssm v1.54.3 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.23.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.2 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.31.3 // indirect - github.com/aws/smithy-go v1.21.0 // indirect + github.com/aws/smithy-go v1.22.0 // indirect github.com/beevik/etree v1.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/blang/semver/v4 v4.0.0 // indirect diff --git a/integrations/event-handler/go.sum b/integrations/event-handler/go.sum index e3e05ecc43ee3..7b888e2365515 100644 --- a/integrations/event-handler/go.sum +++ b/integrations/event-handler/go.sum @@ -717,8 +717,8 @@ github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 h1:DklsrG3d github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2/go.mod h1:WaHUgvxTVq04UNunO+XhnAqY/wQc+bxr74GqbsZ/Jqw= github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.31.0 h1:3V05LbxTSItI5kUqNwhJrrrY1BAXxXt0sN0l72QmG5U= -github.com/aws/aws-sdk-go-v2 v1.31.0/go.mod h1:ztolYtaEUtdpf9Wftr31CJfLVjOnD/CVRkKOOYgF8hA= +github.com/aws/aws-sdk-go-v2 v1.32.2 h1:AkNLZEyYMLnx/Q/mSKkcMqwNFXMAvFto9bNsHqcTduI= +github.com/aws/aws-sdk-go-v2 v1.32.2/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5 h1:xDAuZTn4IMm8o1LnBZvmrL8JA1io4o3YWNXgohbf20g= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5/go.mod h1:wYSv6iDS621sEFLfKvpPE2ugjTuGlAG7iROg0hLOkfc= github.com/aws/aws-sdk-go-v2/config v1.27.39 h1:FCylu78eTGzW1ynHcongXK9YHtoXD5AiiUqq3YfJYjU= @@ -729,10 +729,10 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 h1:C/d03NAmh8C4BZXhuRNboF github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14/go.mod h1:7I0Ju7p9mCIdlrfS+JCgqcYD0VXz/N4yozsox+0o078= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.25 h1:HkpHeZMM39sGtMHVYG1buAg93vhj5d7F81y6G0OAbGc= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.25/go.mod h1:j3Vz04ZjaWA6kygOsZRpmWe4CyGqfqq2u3unDTU0QGA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 h1:kYQ3H1u0ANr9KEKlGs/jTLrBFPo8P8NaH/w7A01NeeM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18/go.mod h1:r506HmK5JDUh9+Mw4CfGJGSSoqIiLCndAuqXuhbv67Y= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 h1:Z7IdFUONvTcvS7YuhtVxN99v2cCoHRXOS4mTr0B/pUc= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18/go.mod h1:DkKMmksZVVyat+Y+r1dEOgJEfUeA7UngIHWeKsi0yNc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 h1:UAsR3xA31QGf79WzpG/ixT9FZvQlh5HY1NRqSHBNOCk= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21/go.mod h1:JNr43NFf5L9YaG3eKTm7HQzls9J+A9YYcGI5Quh1r2Y= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 h1:6jZVETqmYCadGFvrYEQfC5fAQmlo80CeL5psbno6r0s= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21/go.mod h1:1SR0GbLlnN3QUmYaflZNiH1ql+1qrSiB2vwcJ+4UM60= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.18 h1:OWYvKL53l1rbsUmW7bQyJVsYU/Ii3bbAAQIIFNbM0Tk= @@ -751,6 +751,8 @@ github.com/aws/aws-sdk-go-v2/service/glue v1.99.2 h1:pfX1qky3shRS3rgxkdXKtiNWtMU github.com/aws/aws-sdk-go-v2/service/glue v1.99.2/go.mod h1:rCyUHLWGaSR9/oQgj2nGKRmPqFwtq3qxL14LkuQdadA= github.com/aws/aws-sdk-go-v2/service/iam v1.36.3 h1:dV9iimLEHKYAz2qTi+tGAD9QCnAG2pLD7HUEHB7m4mI= github.com/aws/aws-sdk-go-v2/service/iam v1.36.3/go.mod h1:HSvujsK8xeEHMIB18oMXjSfqaN9cVqpo/MtHJIksQRk= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.2 h1:QSrf6HsounqUtlFAwArhVNHPt3WXmSm0pz7RtojjBdo= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.2/go.mod h1:PtkL4CXOQy84zudggyFtyJFXCGDRY8igg9Nfo9df1sU= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 h1:QFASJGfT8wMXtuP3D5CRmMjARHv9ZmzFUMJznHDOY3w= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5/go.mod h1:QdZ3OmoIjSX+8D1OPAzPxDfjXASbBMDsz9qvtyIhtik= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20 h1:rTWjG6AvWekO2B1LHeM3ktU7MqyX9rzWQ7hgzneZW7E= @@ -761,6 +763,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18 h1:eb+tFOIl9ZsUe github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18/go.mod h1:GVCC2IJNJTmdlyEsSmofEy7EfJncP7DNnXDzRjJ5Keg= github.com/aws/aws-sdk-go-v2/service/kms v1.36.3 h1:iHi6lC6LfW6SNvB2bixmlOW3WMyWFrHZCWX+P+CCxMk= github.com/aws/aws-sdk-go-v2/service/kms v1.36.3/go.mod h1:OHmlX4+o0XIlJAQGAHPIy0N9yZcYS/vNG+T7geSNcFw= +github.com/aws/aws-sdk-go-v2/service/organizations v1.34.2 h1:ndH1E8olS/rDB+tiUMKj09g0o11PoOLAC+xRFB13bJw= +github.com/aws/aws-sdk-go-v2/service/organizations v1.34.2/go.mod h1:YZvv/wXIgIviYq9P/fQDhoMlzlI89M0D45GnYvIorLk= github.com/aws/aws-sdk-go-v2/service/rds v1.85.2 h1:KDO/FSO8V+zlvnQF6v4nOariw2qwPx5/z2pyb6X7ibk= github.com/aws/aws-sdk-go-v2/service/rds v1.85.2/go.mod h1:lhiPj6RvoJHWG2STp+k5az55YqGgFLBzkKYdYHgUh9g= github.com/aws/aws-sdk-go-v2/service/s3 v1.63.3 h1:3zt8qqznMuAZWDTDpcwv9Xr11M/lVj2FsRR7oYBt0OA= @@ -769,12 +773,14 @@ github.com/aws/aws-sdk-go-v2/service/ssm v1.54.3 h1:Ctzev3ppcc46m2FgrLEZhsHMEr1G github.com/aws/aws-sdk-go-v2/service/ssm v1.54.3/go.mod h1:qs3TBNpFEnVubl0WL3jruj7NJMF1RCAPEPQ1f+fLTBE= github.com/aws/aws-sdk-go-v2/service/sso v1.23.3 h1:rs4JCczF805+FDv2tRhZ1NU0RB2H6ryAvsWPanAr72Y= github.com/aws/aws-sdk-go-v2/service/sso v1.23.3/go.mod h1:XRlMvmad0ZNL+75C5FYdMvbbLkd6qiqz6foR1nA1PXY= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.2 h1:O6MhOmqKN1dSmc04jaxmfdmSb3UbeQ715SYdVzNBiL4= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.2/go.mod h1:QkSUZzFJsxztercu38+HLsTz9kHqRvAhVwp9+6SAeFA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3 h1:S7EPdMVZod8BGKQQPTBK+FcX9g7bKR7c4+HxWqHP7Vg= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3/go.mod h1:FnvDM4sfa+isJ3kDXIzAB9GAwVSzFzSy97uZ3IsHo4E= github.com/aws/aws-sdk-go-v2/service/sts v1.31.3 h1:VzudTFrDCIDakXtemR7l6Qzt2+JYsVqo2MxBPt5k8T8= github.com/aws/aws-sdk-go-v2/service/sts v1.31.3/go.mod h1:yMWe0F+XG0DkRZK5ODZhG7BEFYhLXi2dqGsv6tX0cgI= -github.com/aws/smithy-go v1.21.0 h1:H7L8dtDRk0P1Qm6y0ji7MCYMQObJ5R9CRpyPhRUkLYA= -github.com/aws/smithy-go v1.21.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= +github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/beevik/etree v1.4.1 h1:PmQJDDYahBGNKDcpdX8uPy1xRCwoCGVUiW669MEirVI= github.com/beevik/etree v1.4.1/go.mod h1:gPNJNaBGVZ9AwsidazFZyygnd+0pAU38N4D+WemwKNs= diff --git a/integrations/terraform/go.mod b/integrations/terraform/go.mod index ee81e1b7d054c..11a8a22127c90 100644 --- a/integrations/terraform/go.mod +++ b/integrations/terraform/go.mod @@ -76,14 +76,14 @@ require ( github.com/armon/go-radix v1.0.0 // indirect github.com/asaskevich/govalidator v0.0.0-20230301143203-a9d515a09cc2 // indirect github.com/aws/aws-sdk-go v1.55.5 // indirect - github.com/aws/aws-sdk-go-v2 v1.31.0 // indirect + github.com/aws/aws-sdk-go-v2 v1.32.2 // indirect github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5 // indirect github.com/aws/aws-sdk-go-v2/config v1.27.39 // indirect github.com/aws/aws-sdk-go-v2/credentials v1.17.37 // indirect github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 // indirect github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.25 // indirect - github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 // indirect - github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 // indirect + github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 // indirect + github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 // indirect github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 // indirect github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.18 // indirect github.com/aws/aws-sdk-go-v2/service/athena v1.46.2 // indirect @@ -93,18 +93,21 @@ require ( github.com/aws/aws-sdk-go-v2/service/eks v1.49.3 // indirect github.com/aws/aws-sdk-go-v2/service/glue v1.99.2 // indirect github.com/aws/aws-sdk-go-v2/service/iam v1.36.3 // indirect + github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.2 // indirect github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 // indirect github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20 // indirect github.com/aws/aws-sdk-go-v2/service/internal/presigned-url v1.11.20 // indirect github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18 // indirect github.com/aws/aws-sdk-go-v2/service/kms v1.36.3 // indirect + github.com/aws/aws-sdk-go-v2/service/organizations v1.34.2 // indirect github.com/aws/aws-sdk-go-v2/service/rds v1.85.2 // indirect github.com/aws/aws-sdk-go-v2/service/s3 v1.63.3 // indirect github.com/aws/aws-sdk-go-v2/service/ssm v1.54.3 // indirect github.com/aws/aws-sdk-go-v2/service/sso v1.23.3 // indirect + github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.2 // indirect github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3 // indirect github.com/aws/aws-sdk-go-v2/service/sts v1.31.3 // indirect - github.com/aws/smithy-go v1.21.0 // indirect + github.com/aws/smithy-go v1.22.0 // indirect github.com/beevik/etree v1.4.1 // indirect github.com/beorn7/perks v1.0.1 // indirect github.com/bgentry/speakeasy v0.1.0 // indirect diff --git a/integrations/terraform/go.sum b/integrations/terraform/go.sum index 43d9ce09ebd55..85c86c5aad347 100644 --- a/integrations/terraform/go.sum +++ b/integrations/terraform/go.sum @@ -774,8 +774,8 @@ github.com/aws/aws-sdk-go v1.15.78/go.mod h1:E3/ieXAlvM0XWO57iftYVDLLvQ824smPP3A github.com/aws/aws-sdk-go v1.25.3/go.mod h1:KmX6BPdI08NWTb3/sm4ZGu5ShLoqVDhKgpiN924inxo= github.com/aws/aws-sdk-go v1.55.5 h1:KKUZBfBoyqy5d3swXyiC7Q76ic40rYcbqH7qjh59kzU= github.com/aws/aws-sdk-go v1.55.5/go.mod h1:eRwEWoyTWFMVYVQzKMNHWP5/RV4xIUGMQfXQHfHkpNU= -github.com/aws/aws-sdk-go-v2 v1.31.0 h1:3V05LbxTSItI5kUqNwhJrrrY1BAXxXt0sN0l72QmG5U= -github.com/aws/aws-sdk-go-v2 v1.31.0/go.mod h1:ztolYtaEUtdpf9Wftr31CJfLVjOnD/CVRkKOOYgF8hA= +github.com/aws/aws-sdk-go-v2 v1.32.2 h1:AkNLZEyYMLnx/Q/mSKkcMqwNFXMAvFto9bNsHqcTduI= +github.com/aws/aws-sdk-go-v2 v1.32.2/go.mod h1:2SK5n0a2karNTv5tbP1SjsX0uhttou00v/HpXKM1ZUo= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5 h1:xDAuZTn4IMm8o1LnBZvmrL8JA1io4o3YWNXgohbf20g= github.com/aws/aws-sdk-go-v2/aws/protocol/eventstream v1.6.5/go.mod h1:wYSv6iDS621sEFLfKvpPE2ugjTuGlAG7iROg0hLOkfc= github.com/aws/aws-sdk-go-v2/config v1.27.39 h1:FCylu78eTGzW1ynHcongXK9YHtoXD5AiiUqq3YfJYjU= @@ -790,10 +790,10 @@ github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14 h1:C/d03NAmh8C4BZXhuRNboF github.com/aws/aws-sdk-go-v2/feature/ec2/imds v1.16.14/go.mod h1:7I0Ju7p9mCIdlrfS+JCgqcYD0VXz/N4yozsox+0o078= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.25 h1:HkpHeZMM39sGtMHVYG1buAg93vhj5d7F81y6G0OAbGc= github.com/aws/aws-sdk-go-v2/feature/s3/manager v1.17.25/go.mod h1:j3Vz04ZjaWA6kygOsZRpmWe4CyGqfqq2u3unDTU0QGA= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18 h1:kYQ3H1u0ANr9KEKlGs/jTLrBFPo8P8NaH/w7A01NeeM= -github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.18/go.mod h1:r506HmK5JDUh9+Mw4CfGJGSSoqIiLCndAuqXuhbv67Y= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18 h1:Z7IdFUONvTcvS7YuhtVxN99v2cCoHRXOS4mTr0B/pUc= -github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.18/go.mod h1:DkKMmksZVVyat+Y+r1dEOgJEfUeA7UngIHWeKsi0yNc= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21 h1:UAsR3xA31QGf79WzpG/ixT9FZvQlh5HY1NRqSHBNOCk= +github.com/aws/aws-sdk-go-v2/internal/configsources v1.3.21/go.mod h1:JNr43NFf5L9YaG3eKTm7HQzls9J+A9YYcGI5Quh1r2Y= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21 h1:6jZVETqmYCadGFvrYEQfC5fAQmlo80CeL5psbno6r0s= +github.com/aws/aws-sdk-go-v2/internal/endpoints/v2 v2.6.21/go.mod h1:1SR0GbLlnN3QUmYaflZNiH1ql+1qrSiB2vwcJ+4UM60= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1 h1:VaRN3TlFdd6KxX1x3ILT5ynH6HvKgqdiXoTxAF4HQcQ= github.com/aws/aws-sdk-go-v2/internal/ini v1.8.1/go.mod h1:FbtygfRFze9usAadmnGJNc8KsP346kEe+y2/oyhGAGc= github.com/aws/aws-sdk-go-v2/internal/v4a v1.3.18 h1:OWYvKL53l1rbsUmW7bQyJVsYU/Ii3bbAAQIIFNbM0Tk= @@ -818,6 +818,8 @@ github.com/aws/aws-sdk-go-v2/service/glue v1.99.2 h1:pfX1qky3shRS3rgxkdXKtiNWtMU github.com/aws/aws-sdk-go-v2/service/glue v1.99.2/go.mod h1:rCyUHLWGaSR9/oQgj2nGKRmPqFwtq3qxL14LkuQdadA= github.com/aws/aws-sdk-go-v2/service/iam v1.36.3 h1:dV9iimLEHKYAz2qTi+tGAD9QCnAG2pLD7HUEHB7m4mI= github.com/aws/aws-sdk-go-v2/service/iam v1.36.3/go.mod h1:HSvujsK8xeEHMIB18oMXjSfqaN9cVqpo/MtHJIksQRk= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.2 h1:QSrf6HsounqUtlFAwArhVNHPt3WXmSm0pz7RtojjBdo= +github.com/aws/aws-sdk-go-v2/service/identitystore v1.27.2/go.mod h1:PtkL4CXOQy84zudggyFtyJFXCGDRY8igg9Nfo9df1sU= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5 h1:QFASJGfT8wMXtuP3D5CRmMjARHv9ZmzFUMJznHDOY3w= github.com/aws/aws-sdk-go-v2/service/internal/accept-encoding v1.11.5/go.mod h1:QdZ3OmoIjSX+8D1OPAzPxDfjXASbBMDsz9qvtyIhtik= github.com/aws/aws-sdk-go-v2/service/internal/checksum v1.3.20 h1:rTWjG6AvWekO2B1LHeM3ktU7MqyX9rzWQ7hgzneZW7E= @@ -830,6 +832,8 @@ github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18 h1:eb+tFOIl9ZsUe github.com/aws/aws-sdk-go-v2/service/internal/s3shared v1.17.18/go.mod h1:GVCC2IJNJTmdlyEsSmofEy7EfJncP7DNnXDzRjJ5Keg= github.com/aws/aws-sdk-go-v2/service/kms v1.36.3 h1:iHi6lC6LfW6SNvB2bixmlOW3WMyWFrHZCWX+P+CCxMk= github.com/aws/aws-sdk-go-v2/service/kms v1.36.3/go.mod h1:OHmlX4+o0XIlJAQGAHPIy0N9yZcYS/vNG+T7geSNcFw= +github.com/aws/aws-sdk-go-v2/service/organizations v1.34.2 h1:ndH1E8olS/rDB+tiUMKj09g0o11PoOLAC+xRFB13bJw= +github.com/aws/aws-sdk-go-v2/service/organizations v1.34.2/go.mod h1:YZvv/wXIgIviYq9P/fQDhoMlzlI89M0D45GnYvIorLk= github.com/aws/aws-sdk-go-v2/service/rds v1.85.2 h1:KDO/FSO8V+zlvnQF6v4nOariw2qwPx5/z2pyb6X7ibk= github.com/aws/aws-sdk-go-v2/service/rds v1.85.2/go.mod h1:lhiPj6RvoJHWG2STp+k5az55YqGgFLBzkKYdYHgUh9g= github.com/aws/aws-sdk-go-v2/service/s3 v1.63.3 h1:3zt8qqznMuAZWDTDpcwv9Xr11M/lVj2FsRR7oYBt0OA= @@ -842,14 +846,16 @@ github.com/aws/aws-sdk-go-v2/service/ssm v1.54.3 h1:Ctzev3ppcc46m2FgrLEZhsHMEr1G github.com/aws/aws-sdk-go-v2/service/ssm v1.54.3/go.mod h1:qs3TBNpFEnVubl0WL3jruj7NJMF1RCAPEPQ1f+fLTBE= github.com/aws/aws-sdk-go-v2/service/sso v1.23.3 h1:rs4JCczF805+FDv2tRhZ1NU0RB2H6ryAvsWPanAr72Y= github.com/aws/aws-sdk-go-v2/service/sso v1.23.3/go.mod h1:XRlMvmad0ZNL+75C5FYdMvbbLkd6qiqz6foR1nA1PXY= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.2 h1:O6MhOmqKN1dSmc04jaxmfdmSb3UbeQ715SYdVzNBiL4= +github.com/aws/aws-sdk-go-v2/service/ssoadmin v1.29.2/go.mod h1:QkSUZzFJsxztercu38+HLsTz9kHqRvAhVwp9+6SAeFA= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3 h1:S7EPdMVZod8BGKQQPTBK+FcX9g7bKR7c4+HxWqHP7Vg= github.com/aws/aws-sdk-go-v2/service/ssooidc v1.27.3/go.mod h1:FnvDM4sfa+isJ3kDXIzAB9GAwVSzFzSy97uZ3IsHo4E= github.com/aws/aws-sdk-go-v2/service/sts v1.31.3 h1:VzudTFrDCIDakXtemR7l6Qzt2+JYsVqo2MxBPt5k8T8= github.com/aws/aws-sdk-go-v2/service/sts v1.31.3/go.mod h1:yMWe0F+XG0DkRZK5ODZhG7BEFYhLXi2dqGsv6tX0cgI= github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0 h1:EJsHUYgFBV7/N1YtL73lsfZODAOU+CnNSZfEAlqqQaA= github.com/aws/aws-sigv4-auth-cassandra-gocql-driver-plugin v1.1.0/go.mod h1:AxKuXHc0zv2yYaeueUG7R3ONbcnQIuDj0bkdFmPVRzU= -github.com/aws/smithy-go v1.21.0 h1:H7L8dtDRk0P1Qm6y0ji7MCYMQObJ5R9CRpyPhRUkLYA= -github.com/aws/smithy-go v1.21.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= +github.com/aws/smithy-go v1.22.0 h1:uunKnWlcoL3zO7q+gG2Pk53joueEOsnNB28QdMsmiMM= +github.com/aws/smithy-go v1.22.0/go.mod h1:irrKGvNn1InZwb2d7fkIRNucdfwR8R+Ts3wxYa/cJHg= github.com/beevik/etree v1.1.0/go.mod h1:r8Aw8JqVegEf0w2fDnATrX9VpkMcyFeM0FhwO62wh+A= github.com/beevik/etree v1.4.1 h1:PmQJDDYahBGNKDcpdX8uPy1xRCwoCGVUiW669MEirVI= github.com/beevik/etree v1.4.1/go.mod h1:gPNJNaBGVZ9AwsidazFZyygnd+0pAU38N4D+WemwKNs= From 8829746a51dbb30861f5c0107cb955a39e9ea88b Mon Sep 17 00:00:00 2001 From: Michael Date: Wed, 23 Oct 2024 08:23:56 -0500 Subject: [PATCH 28/70] Rename useWebAuthn to useMfa and handle SSO challenges (#47819) * Rename useWebauthn to useMfa * add ssoChallenge to mfa requests/responses * Update callsites and tests --- .../teleport/src/Account/Account.test.tsx | 16 +- .../DocumentKubeExec/DocumentKubeExec.tsx | 14 +- .../src/Console/DocumentSsh/DocumentSsh.tsx | 16 +- .../DesktopSession/DesktopSession.story.tsx | 18 +-- .../src/DesktopSession/DesktopSession.tsx | 27 ++-- .../src/DesktopSession/useDesktopSession.tsx | 6 +- .../AuthnDialog/AuthnDialog.story.tsx | 9 +- .../components/AuthnDialog/AuthnDialog.tsx | 35 +++-- ...uthnSender.ts => EventEmitterMfaSender.ts} | 4 +- web/packages/teleport/src/lib/tdp/client.ts | 4 +- web/packages/teleport/src/lib/term/tty.ts | 4 +- web/packages/teleport/src/lib/useMfa.ts | 148 ++++++++++++++++++ web/packages/teleport/src/lib/useWebAuthn.ts | 115 -------------- .../teleport/src/services/auth/makeMfa.ts | 13 +- .../teleport/src/services/auth/types.ts | 6 + 15 files changed, 235 insertions(+), 200 deletions(-) rename web/packages/teleport/src/lib/{EventEmitterWebAuthnSender.ts => EventEmitterMfaSender.ts} (91%) create mode 100644 web/packages/teleport/src/lib/useMfa.ts delete mode 100644 web/packages/teleport/src/lib/useWebAuthn.ts diff --git a/web/packages/teleport/src/Account/Account.test.tsx b/web/packages/teleport/src/Account/Account.test.tsx index 6fb23549a0e36..7dcf86f471adb 100644 --- a/web/packages/teleport/src/Account/Account.test.tsx +++ b/web/packages/teleport/src/Account/Account.test.tsx @@ -243,9 +243,11 @@ test('adding an MFA device', async () => { const user = userEvent.setup(); const ctx = createTeleportContext(); jest.spyOn(ctx.mfaService, 'fetchDevices').mockResolvedValue([testPasskey]); - jest - .spyOn(auth, 'getChallenge') - .mockResolvedValue({ webauthnPublicKey: null, totpChallenge: true }); + jest.spyOn(auth, 'getChallenge').mockResolvedValue({ + webauthnPublicKey: null, + totpChallenge: true, + ssoChallenge: null, + }); jest .spyOn(auth, 'createNewWebAuthnDevice') .mockResolvedValueOnce(dummyCredential); @@ -325,9 +327,11 @@ test('removing an MFA method', async () => { const user = userEvent.setup(); const ctx = createTeleportContext(); jest.spyOn(ctx.mfaService, 'fetchDevices').mockResolvedValue([testMfaMethod]); - jest - .spyOn(auth, 'getChallenge') - .mockResolvedValue({ webauthnPublicKey: null, totpChallenge: false }); + jest.spyOn(auth, 'getChallenge').mockResolvedValue({ + webauthnPublicKey: null, + totpChallenge: false, + ssoChallenge: null, + }); jest .spyOn(auth, 'createPrivilegeTokenWithWebauthn') .mockResolvedValueOnce('webauthn-privilege-token'); diff --git a/web/packages/teleport/src/Console/DocumentKubeExec/DocumentKubeExec.tsx b/web/packages/teleport/src/Console/DocumentKubeExec/DocumentKubeExec.tsx index 1589c6ef7d347..3b405e034f04c 100644 --- a/web/packages/teleport/src/Console/DocumentKubeExec/DocumentKubeExec.tsx +++ b/web/packages/teleport/src/Console/DocumentKubeExec/DocumentKubeExec.tsx @@ -22,7 +22,7 @@ import { Box, Indicator } from 'design'; import * as stores from 'teleport/Console/stores/types'; import { Terminal, TerminalRef } from 'teleport/Console/DocumentSsh/Terminal'; -import useWebAuthn from 'teleport/lib/useWebAuthn'; +import { useMfa } from 'teleport/lib/useMfa'; import useKubeExecSession from 'teleport/Console/DocumentKubeExec/useKubeExecSession'; import Document from 'teleport/Console/Document'; @@ -39,11 +39,11 @@ export default function DocumentKubeExec({ doc, visible }: Props) { const terminalRef = useRef(); const { tty, status, closeDocument, sendKubeExecData } = useKubeExecSession(doc); - const webauthn = useWebAuthn(tty); + const mfa = useMfa(tty); useEffect(() => { // when switching tabs or closing tabs, focus on visible terminal terminalRef.current?.focus(); - }, [visible, webauthn.requested]); + }, [visible, mfa.requested]); const theme = useTheme(); const terminal = ( @@ -63,13 +63,7 @@ export default function DocumentKubeExec({ doc, visible }: Props) {
)} - {webauthn.requested && ( - - )} + {mfa.requested && } {status === 'waiting-for-exec-data' && ( diff --git a/web/packages/teleport/src/Console/DocumentSsh/DocumentSsh.tsx b/web/packages/teleport/src/Console/DocumentSsh/DocumentSsh.tsx index eb2720d7f012e..aacafdc35808a 100644 --- a/web/packages/teleport/src/Console/DocumentSsh/DocumentSsh.tsx +++ b/web/packages/teleport/src/Console/DocumentSsh/DocumentSsh.tsx @@ -31,7 +31,7 @@ import { import * as stores from 'teleport/Console/stores'; import AuthnDialog from 'teleport/components/AuthnDialog'; -import useWebAuthn from 'teleport/lib/useWebAuthn'; +import { useMfa } from 'teleport/lib/useMfa'; import Document from '../Document'; @@ -50,13 +50,13 @@ export default function DocumentSshWrapper(props: PropTypes) { function DocumentSsh({ doc, visible }: PropTypes) { const terminalRef = useRef(); const { tty, status, closeDocument, session } = useSshSession(doc); - const webauthn = useWebAuthn(tty); + const mfa = useMfa(tty); const { getMfaResponseAttempt, getDownloader, getUploader, fileTransferRequests, - } = useFileTransfer(tty, session, doc, webauthn.addMfaToScpUrls); + } = useFileTransfer(tty, session, doc, mfa.addMfaToScpUrls); const theme = useTheme(); function handleCloseFileTransfer() { @@ -70,7 +70,7 @@ function DocumentSsh({ doc, visible }: PropTypes) { useEffect(() => { // when switching tabs or closing tabs, focus on visible terminal terminalRef.current?.focus(); - }, [visible, webauthn.requested]); + }, [visible, mfa.requested]); const terminal = ( )} - {webauthn.requested && ( - - )} + {mfa.requested && } {status === 'initialized' && terminal} {}, clientOnClipboardData: async () => {}, setTdpConnection: () => {}, - webauthn: { - errorText: '', - requested: false, - authenticate: () => {}, - setState: () => {}, - addMfaToScpUrls: false, - }, + mfa: makeDefaultMfaState(), showAnotherSessionActiveDialog: false, setShowAnotherSessionActiveDialog: () => {}, alerts: [], @@ -265,12 +260,15 @@ export const WebAuthnPrompt = () => ( writeState: 'granted', }} wsConnection={{ status: 'open' }} - webauthn={{ + mfa={{ errorText: '', requested: true, - authenticate: () => {}, - setState: () => {}, + setErrorText: () => null, addMfaToScpUrls: false, + onWebauthnAuthenticate: () => null, + onSsoAuthenticate: () => null, + webauthnPublicKey: null, + ssoChallenge: null, }} /> ); diff --git a/web/packages/teleport/src/DesktopSession/DesktopSession.tsx b/web/packages/teleport/src/DesktopSession/DesktopSession.tsx index 66a66825a209e..b1f188f2997c9 100644 --- a/web/packages/teleport/src/DesktopSession/DesktopSession.tsx +++ b/web/packages/teleport/src/DesktopSession/DesktopSession.tsx @@ -39,7 +39,7 @@ import useDesktopSession, { import TopBar from './TopBar'; import type { State, WebsocketAttempt } from './useDesktopSession'; -import type { WebAuthnState } from 'teleport/lib/useWebAuthn'; +import type { MfaState } from 'teleport/lib/useMfa'; export function DesktopSessionContainer() { const state = useDesktopSession(); @@ -54,7 +54,7 @@ declare global { export function DesktopSession(props: State) { const { - webauthn, + mfa, tdpClient, username, hostname, @@ -105,7 +105,7 @@ export function DesktopSession(props: State) { tdpConnection, wsConnection, showAnotherSessionActiveDialog, - webauthn + mfa ) ); }, [ @@ -113,7 +113,7 @@ export function DesktopSession(props: State) { tdpConnection, wsConnection, showAnotherSessionActiveDialog, - webauthn, + mfa, ]); return ( @@ -144,7 +144,7 @@ export function DesktopSession(props: State) { {screenState.screen === 'anotherSessionActive' && ( )} - {screenState.screen === 'mfa' && } + {screenState.screen === 'mfa' && } {screenState.screen === 'alert dialog' && ( )} @@ -181,20 +181,15 @@ export function DesktopSession(props: State) { ); } -const MfaDialog = ({ webauthn }: { webauthn: WebAuthnState }) => { +const MfaDialog = ({ mfa }: { mfa: MfaState }) => { return ( { - webauthn.setState(prevState => { - return { - ...prevState, - errorText: - 'This session requires multi factor authentication to continue. Please hit "Retry" and follow the prompts given by your browser to complete authentication.', - }; - }); + mfa.setErrorText( + 'This session requires multi factor authentication to continue. Please hit "Retry" and follow the prompts given by your browser to complete authentication.' + ); }} - errorText={webauthn.errorText} /> ); }; @@ -282,7 +277,7 @@ const nextScreenState = ( tdpConnection: Attempt, wsConnection: WebsocketAttempt, showAnotherSessionActiveDialog: boolean, - webauthn: WebAuthnState + webauthn: MfaState ): ScreenState => { // We always want to show the user the first alert that caused the session to fail/end, // so if we're already showing an alert, don't change the screen. diff --git a/web/packages/teleport/src/DesktopSession/useDesktopSession.tsx b/web/packages/teleport/src/DesktopSession/useDesktopSession.tsx index a49e6d4a268fc..1f642d38d8d96 100644 --- a/web/packages/teleport/src/DesktopSession/useDesktopSession.tsx +++ b/web/packages/teleport/src/DesktopSession/useDesktopSession.tsx @@ -22,7 +22,7 @@ import { useParams } from 'react-router'; import useAttempt from 'shared/hooks/useAttemptNext'; import { ButtonState } from 'teleport/lib/tdp'; -import useWebAuthn from 'teleport/lib/useWebAuthn'; +import { useMfa } from 'teleport/lib/useMfa'; import desktopService from 'teleport/services/desktops'; import userService from 'teleport/services/user'; @@ -130,7 +130,7 @@ export default function useDesktopSession() { }); const tdpClient = clientCanvasProps.tdpClient; - const webauthn = useWebAuthn(tdpClient); + const mfa = useMfa(tdpClient); const onShareDirectory = () => { try { @@ -205,7 +205,7 @@ export default function useDesktopSession() { fetchAttempt, tdpConnection, wsConnection, - webauthn, + mfa, setTdpConnection, showAnotherSessionActiveDialog, setShowAnotherSessionActiveDialog, diff --git a/web/packages/teleport/src/components/AuthnDialog/AuthnDialog.story.tsx b/web/packages/teleport/src/components/AuthnDialog/AuthnDialog.story.tsx index 73600b5a7fb1c..8ec5592c47a0c 100644 --- a/web/packages/teleport/src/components/AuthnDialog/AuthnDialog.story.tsx +++ b/web/packages/teleport/src/components/AuthnDialog/AuthnDialog.story.tsx @@ -18,6 +18,8 @@ import React from 'react'; +import { makeDefaultMfaState } from 'teleport/lib/useMfa'; + import AuthnDialog, { Props } from './AuthnDialog'; export default { @@ -26,12 +28,9 @@ export default { export const Loaded = () => ; -export const Error = () => ( - -); +export const Error = () => ; const props: Props = { - onContinue: () => null, + mfa: makeDefaultMfaState(), onCancel: () => null, - errorText: '', }; diff --git a/web/packages/teleport/src/components/AuthnDialog/AuthnDialog.tsx b/web/packages/teleport/src/components/AuthnDialog/AuthnDialog.tsx index a8b5cd532a1bf..05685c0d6a3eb 100644 --- a/web/packages/teleport/src/components/AuthnDialog/AuthnDialog.tsx +++ b/web/packages/teleport/src/components/AuthnDialog/AuthnDialog.tsx @@ -18,48 +18,51 @@ import React from 'react'; import Dialog, { - DialogFooter, DialogHeader, DialogTitle, DialogContent, } from 'design/Dialog'; import { Danger } from 'design/Alert'; -import { Text, ButtonPrimary, ButtonSecondary } from 'design'; +import { Text, ButtonPrimary, ButtonSecondary, Flex } from 'design'; -export default function AuthnDialog({ - onContinue, - onCancel, - errorText, -}: Props) { +import { MfaState } from 'teleport/lib/useMfa'; + +export default function AuthnDialog({ mfa, onCancel }: Props) { return ( - ({ width: '400px' })} open={true}> + ({ width: '500px' })} open={true}> Multi-factor authentication - {errorText && ( + {mfa.errorText && ( - {errorText} + {mfa.errorText} )} Re-enter your multi-factor authentication in the browser to continue. - - - {errorText ? 'Retry' : 'OK'} + + {/* TODO (avatus) this will eventually be conditionally rendered based on what + type of challenges exist. For now, its only webauthn. */} + + {mfa.errorText ? 'Retry' : 'OK'} Cancel - + ); } export type Props = { - onContinue: () => void; + mfa: MfaState; onCancel: () => void; - errorText: string; }; diff --git a/web/packages/teleport/src/lib/EventEmitterWebAuthnSender.ts b/web/packages/teleport/src/lib/EventEmitterMfaSender.ts similarity index 91% rename from web/packages/teleport/src/lib/EventEmitterWebAuthnSender.ts rename to web/packages/teleport/src/lib/EventEmitterMfaSender.ts index 834746c866bf6..68eae3367f6ea 100644 --- a/web/packages/teleport/src/lib/EventEmitterWebAuthnSender.ts +++ b/web/packages/teleport/src/lib/EventEmitterMfaSender.ts @@ -20,7 +20,7 @@ import { EventEmitter } from 'events'; import { WebauthnAssertionResponse } from 'teleport/services/auth'; -class EventEmitterWebAuthnSender extends EventEmitter { +class EventEmitterMfaSender extends EventEmitter { constructor() { super(); } @@ -31,4 +31,4 @@ class EventEmitterWebAuthnSender extends EventEmitter { } } -export { EventEmitterWebAuthnSender }; +export { EventEmitterMfaSender }; diff --git a/web/packages/teleport/src/lib/tdp/client.ts b/web/packages/teleport/src/lib/tdp/client.ts index 098cb9d824fa6..6f000b083d820 100644 --- a/web/packages/teleport/src/lib/tdp/client.ts +++ b/web/packages/teleport/src/lib/tdp/client.ts @@ -24,7 +24,7 @@ import init, { } from 'teleport/ironrdp/pkg/ironrdp'; import { WebsocketCloseCode, TermEvent } from 'teleport/lib/term/enums'; -import { EventEmitterWebAuthnSender } from 'teleport/lib/EventEmitterWebAuthnSender'; +import { EventEmitterMfaSender } from 'teleport/lib/EventEmitterMfaSender'; import { AuthenticatedWebSocket } from 'teleport/lib/AuthenticatedWebSocket'; import Codec, { @@ -93,7 +93,7 @@ export enum LogType { // sending client commands, and receiving and processing server messages. Its creator is responsible for // ensuring the websocket gets closed and all of its event listeners cleaned up when it is no longer in use. // For convenience, this can be done in one fell swoop by calling Client.shutdown(). -export default class Client extends EventEmitterWebAuthnSender { +export default class Client extends EventEmitterMfaSender { protected codec: Codec; protected socket: AuthenticatedWebSocket | undefined; private socketAddr: string; diff --git a/web/packages/teleport/src/lib/term/tty.ts b/web/packages/teleport/src/lib/term/tty.ts index 6bd9014234323..2eb11957b8fbd 100644 --- a/web/packages/teleport/src/lib/term/tty.ts +++ b/web/packages/teleport/src/lib/term/tty.ts @@ -18,7 +18,7 @@ import Logger from 'shared/libs/logger'; -import { EventEmitterWebAuthnSender } from 'teleport/lib/EventEmitterWebAuthnSender'; +import { EventEmitterMfaSender } from 'teleport/lib/EventEmitterMfaSender'; import { WebauthnAssertionResponse } from 'teleport/services/auth'; import { AuthenticatedWebSocket } from 'teleport/lib/AuthenticatedWebSocket'; @@ -31,7 +31,7 @@ const defaultOptions = { buffered: true, }; -class Tty extends EventEmitterWebAuthnSender { +class Tty extends EventEmitterMfaSender { socket = null; _buffered = true; diff --git a/web/packages/teleport/src/lib/useMfa.ts b/web/packages/teleport/src/lib/useMfa.ts new file mode 100644 index 0000000000000..8d55cf4c73f75 --- /dev/null +++ b/web/packages/teleport/src/lib/useMfa.ts @@ -0,0 +1,148 @@ +/** + * Teleport + * Copyright (C) 2023 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { useState, useEffect, useCallback } from 'react'; + +import { EventEmitterMfaSender } from 'teleport/lib/EventEmitterMfaSender'; +import { TermEvent } from 'teleport/lib/term/enums'; +import { + makeMfaAuthenticateChallenge, + makeWebauthnAssertionResponse, + SSOChallenge, +} from 'teleport/services/auth'; + +export function useMfa(emitterSender: EventEmitterMfaSender): MfaState { + const [state, setState] = useState<{ + errorText: string; + addMfaToScpUrls: boolean; + webauthnPublicKey: PublicKeyCredentialRequestOptions; + ssoChallenge: SSOChallenge; + totpChallenge: boolean; + }>({ + addMfaToScpUrls: false, + errorText: '', + webauthnPublicKey: null, + ssoChallenge: null, + totpChallenge: false, + }); + + // TODO (avatus), this is stubbed for types but will not be called + // until SSO as MFA backend is in. + function onSsoAuthenticate() { + // eslint-disable-next-line no-console + console.error('not yet implemented'); + } + + function onWebauthnAuthenticate() { + if (!window.PublicKeyCredential) { + const errorText = + 'This browser does not support WebAuthn required for hardware tokens, \ + please try the latest version of Chrome, Firefox or Safari.'; + + setState({ + ...state, + errorText, + }); + return; + } + + navigator.credentials + .get({ publicKey: state.webauthnPublicKey }) + .then(res => { + setState(prevState => ({ + ...prevState, + errorText: '', + webauthnPublicKey: null, + })); + const credential = makeWebauthnAssertionResponse(res); + emitterSender.sendWebAuthn(credential); + }) + .catch((err: Error) => { + setErrorText(err.message); + }); + } + + const onChallenge = useCallback(challengeJson => { + const { webauthnPublicKey, ssoChallenge, totpChallenge } = + makeMfaAuthenticateChallenge(challengeJson); + + setState(prevState => ({ + ...prevState, + ssoChallenge, + webauthnPublicKey, + totpChallenge, + })); + }, []); + + useEffect(() => { + if (emitterSender) { + emitterSender.on(TermEvent.WEBAUTHN_CHALLENGE, onChallenge); + + return () => { + emitterSender.removeListener(TermEvent.WEBAUTHN_CHALLENGE, onChallenge); + }; + } + }, [emitterSender, onChallenge]); + + function setErrorText(newErrorText: string) { + setState(prevState => ({ ...prevState, errorText: newErrorText })); + } + + // if any challenge exists, requested is true + const requested = !!( + state.webauthnPublicKey || + state.totpChallenge || + state.ssoChallenge + ); + + return { + requested, + onWebauthnAuthenticate, + onSsoAuthenticate, + addMfaToScpUrls: state.addMfaToScpUrls, + setErrorText, + errorText: state.errorText, + webauthnPublicKey: state.webauthnPublicKey, + ssoChallenge: state.ssoChallenge, + }; +} + +export type MfaState = { + onWebauthnAuthenticate: () => void; + onSsoAuthenticate: () => void; + setErrorText: (errorText: string) => void; + errorText: string; + requested: boolean; + addMfaToScpUrls: boolean; + webauthnPublicKey: PublicKeyCredentialRequestOptions; + ssoChallenge: SSOChallenge; +}; + +// used for testing +export function makeDefaultMfaState(): MfaState { + return { + onWebauthnAuthenticate: () => null, + onSsoAuthenticate: () => null, + setErrorText: () => null, + errorText: '', + requested: false, + addMfaToScpUrls: false, + webauthnPublicKey: null, + ssoChallenge: null, + }; +} diff --git a/web/packages/teleport/src/lib/useWebAuthn.ts b/web/packages/teleport/src/lib/useWebAuthn.ts deleted file mode 100644 index 730065299ceed..0000000000000 --- a/web/packages/teleport/src/lib/useWebAuthn.ts +++ /dev/null @@ -1,115 +0,0 @@ -/** - * Teleport - * Copyright (C) 2023 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ - -import { useState, useEffect, Dispatch, SetStateAction } from 'react'; - -import { EventEmitterWebAuthnSender } from 'teleport/lib/EventEmitterWebAuthnSender'; -import { TermEvent } from 'teleport/lib/term/enums'; -import { - makeMfaAuthenticateChallenge, - makeWebauthnAssertionResponse, -} from 'teleport/services/auth'; - -export default function useWebAuthn( - emitterSender: EventEmitterWebAuthnSender -): WebAuthnState { - const [state, setState] = useState({ - addMfaToScpUrls: false, - requested: false, - errorText: '', - publicKey: null as PublicKeyCredentialRequestOptions, - }); - - function authenticate() { - if (!window.PublicKeyCredential) { - const errorText = - 'This browser does not support WebAuthn required for hardware tokens, \ - please try the latest version of Chrome, Firefox or Safari.'; - - setState({ - ...state, - errorText, - }); - return; - } - - navigator.credentials - .get({ publicKey: state.publicKey }) - .then(res => { - const credential = makeWebauthnAssertionResponse(res); - emitterSender.sendWebAuthn(credential); - - setState({ - ...state, - requested: false, - errorText: '', - }); - }) - .catch((err: Error) => { - setState({ - ...state, - errorText: err.message, - }); - }); - } - - const onChallenge = challengeJson => { - const challenge = JSON.parse(challengeJson); - const publicKey = makeMfaAuthenticateChallenge(challenge).webauthnPublicKey; - - setState({ - ...state, - requested: true, - addMfaToScpUrls: true, - publicKey, - }); - }; - - useEffect(() => { - if (emitterSender) { - emitterSender.on(TermEvent.WEBAUTHN_CHALLENGE, onChallenge); - - return () => { - emitterSender.removeListener(TermEvent.WEBAUTHN_CHALLENGE, onChallenge); - }; - } - }, [emitterSender]); - - return { - errorText: state.errorText, - requested: state.requested, - authenticate, - setState, - addMfaToScpUrls: state.addMfaToScpUrls, - }; -} - -export type WebAuthnState = { - errorText: string; - requested: boolean; - authenticate: () => void; - setState: Dispatch< - SetStateAction<{ - addMfaToScpUrls: boolean; - requested: boolean; - errorText: string; - publicKey: PublicKeyCredentialRequestOptions; - }> - >; - addMfaToScpUrls: boolean; -}; diff --git a/web/packages/teleport/src/services/auth/makeMfa.ts b/web/packages/teleport/src/services/auth/makeMfa.ts index 0637967483911..506cca4a874c7 100644 --- a/web/packages/teleport/src/services/auth/makeMfa.ts +++ b/web/packages/teleport/src/services/auth/makeMfa.ts @@ -50,12 +50,15 @@ export function makeMfaRegistrationChallenge(json): MfaRegistrationChallenge { } // makeMfaAuthenticateChallenge formats fetched authenticate challenge JSON. -// Webauthn challange contains Base64URL(byte) fields that needs to +// Webauthn challenge contains Base64URL(byte) fields that needs to // be converted to ArrayBuffer expected by navigator.credentials.get: // - challenge // - allowCredentials[i].id export function makeMfaAuthenticateChallenge(json): MfaAuthenticateChallenge { - const webauthnPublicKey = json.webauthn_challenge?.publicKey; + const challenge = typeof json === 'string' ? JSON.parse(json) : json; + const { sso_challenge, webauthn_challenge } = challenge; + + const webauthnPublicKey = webauthn_challenge?.publicKey; if (webauthnPublicKey) { const challenge = webauthnPublicKey.challenge || ''; const allowCredentials = webauthnPublicKey.allowCredentials || []; @@ -70,6 +73,12 @@ export function makeMfaAuthenticateChallenge(json): MfaAuthenticateChallenge { } return { + ssoChallenge: sso_challenge + ? { + redirectUrl: sso_challenge.redirect_url, + requestId: sso_challenge.request_id, + } + : null, totpChallenge: json.totp_challenge, webauthnPublicKey: webauthnPublicKey, }; diff --git a/web/packages/teleport/src/services/auth/types.ts b/web/packages/teleport/src/services/auth/types.ts index 11057cd185645..170d4eedee272 100644 --- a/web/packages/teleport/src/services/auth/types.ts +++ b/web/packages/teleport/src/services/auth/types.ts @@ -32,7 +32,13 @@ export type AuthnChallengeRequest = { userCred: UserCredentials; }; +export type SSOChallenge = { + redirectUrl: string; + requestId: string; +}; + export type MfaAuthenticateChallenge = { + ssoChallenge: SSOChallenge; totpChallenge: boolean; webauthnPublicKey: PublicKeyCredentialRequestOptions; }; From eda3671595b6507c695dd460ae9d659f0505654a Mon Sep 17 00:00:00 2001 From: Trent Clarke Date: Thu, 24 Oct 2024 00:27:56 +1100 Subject: [PATCH 29/70] Moves and exposes the AWS OIDC credentials cache (#47840) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * Moves and exposes the AWS OIDC credentials cache The IdentityCenter integration users OIDC to authenticate with AWS, and so will re-use the existing OIDC credential caching code used by the external audit storage package. This change - extracts the credential cache from the `externalauditstorage` package, - moves it to the `awsoidc` package to indicate that is generally useful, not just for storage access), and - makes it public. This patch also copies the applicable cache tests from `externalauditstorage`. The credential cache tests in `externalauditstorage` have been preserved because they also test backwards compatibility with AWS SDK v1 credential provider, which the new tests do not. * Test fixup * Linter fixups * Remove ttlValuer * Apply suggestions from code review Co-authored-by: Marek Smoliński --------- Co-authored-by: Marek Smoliński --- lib/integrations/awsoidc/credentialscache.go | 284 ++++++++++++++++++ .../awsoidc/credentialscache_test.go | 226 ++++++++++++++ .../externalauditstorage/configurator.go | 206 ++----------- .../externalauditstorage/configurator_test.go | 2 +- lib/service/service_test.go | 2 +- 5 files changed, 530 insertions(+), 190 deletions(-) create mode 100644 lib/integrations/awsoidc/credentialscache.go create mode 100644 lib/integrations/awsoidc/credentialscache_test.go diff --git a/lib/integrations/awsoidc/credentialscache.go b/lib/integrations/awsoidc/credentialscache.go new file mode 100644 index 0000000000000..1d1ddffe3bf1c --- /dev/null +++ b/lib/integrations/awsoidc/credentialscache.go @@ -0,0 +1,284 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package awsoidc + +import ( + "context" + "errors" + "log/slog" + "sync" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/aws/arn" + "github.com/aws/aws-sdk-go-v2/credentials/stscreds" + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + + "github.com/gravitational/teleport" +) + +const ( + // TokenLifetime is the lifetime of OIDC tokens used by the + // ExternalAuditStorage service with the AWS OIDC integration. + TokenLifetime = time.Hour + + refreshBeforeExpirationPeriod = 15 * time.Minute + refreshCheckInterval = 30 * time.Second + retrieveTimeout = 30 * time.Second +) + +// GenerateOIDCTokenFn is a function that should return a valid, signed JWT for +// authenticating to AWS via OIDC. +type GenerateOIDCTokenFn func(ctx context.Context, integration string) (string, error) + +type credsOrErr struct { + creds aws.Credentials + err error +} + +// CredentialsCache is used to store and refresh AWS credentials used with +// AWS OIDC integration. +// +// Credentials are valid for 1h, but they cannot be refreshed if Proxy is down, +// so we attempt to refresh the credentials early and retry on failure. +type CredentialsCache struct { + log *slog.Logger + + roleARN arn.ARN + integration string + + // generateOIDCTokenFn is dynamically set after auth is initialized. + generateOIDCTokenFn GenerateOIDCTokenFn + + // initialized communicates (via closing channel) that generateOIDCTokenFn is set. + initialized chan struct{} + closeInitialized func() + + // gotFirstCredsOrErr communicates (via closing channel) that the first + // credsOrErr has been set. + gotFirstCredsOrErr chan struct{} + closeGotFirstCredsOrErr func() + + credsOrErr credsOrErr + credsOrErrMu sync.RWMutex + + stsClient stscreds.AssumeRoleWithWebIdentityAPIClient + clock clockwork.Clock +} + +type CredentialsCacheOptions struct { + // Integration is the name of the Teleport OIDC integration to use + Integration string + + // RoleARN is the ARN of the role to assume once authenticated + RoleARN arn.ARN + + // STSClient is the AWS sts client implementation to use when communicating + // with AWS + STSClient stscreds.AssumeRoleWithWebIdentityAPIClient + + // Log is the logger to use. A default will be supplied if no logger is + // explicitly set + Log *slog.Logger + + // Clock is the clock to use. A default system clock will be provided if + // none is supplied. + Clock clockwork.Clock +} + +func (opts *CredentialsCacheOptions) CheckAndSetDefaults() error { + if opts.STSClient == nil { + return trace.BadParameter("stsClient must be provided") + } + + if opts.Log == nil { + opts.Log = slog.Default().With(teleport.ComponentKey, "AWS-OIDC-CredentialCache") + } + + if opts.Clock == nil { + opts.Clock = clockwork.NewRealClock() + } + + return nil +} + +var errNotReady = errors.New("ExternalAuditStorage: credential cache not yet initialized") + +func NewCredentialsCache(options CredentialsCacheOptions) (*CredentialsCache, error) { + if err := options.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err, "creating credentials cache") + } + + initialized := make(chan struct{}) + gotFirstCredsOrErr := make(chan struct{}) + + return &CredentialsCache{ + roleARN: options.RoleARN, + integration: options.Integration, + log: options.Log.With("integration", options.Integration), + initialized: initialized, + closeInitialized: sync.OnceFunc(func() { close(initialized) }), + gotFirstCredsOrErr: gotFirstCredsOrErr, + closeGotFirstCredsOrErr: sync.OnceFunc(func() { close(gotFirstCredsOrErr) }), + credsOrErr: credsOrErr{err: errNotReady}, + clock: options.Clock, + stsClient: options.STSClient, + }, nil +} + +func (cc *CredentialsCache) SetGenerateOIDCTokenFn(fn GenerateOIDCTokenFn) { + cc.generateOIDCTokenFn = fn + cc.closeInitialized() +} + +// Retrieve implements [aws.CredentialsProvider] and returns the latest cached +// credentials, or an error if no credentials have been generated yet or the +// last generated credentials have expired. +func (cc *CredentialsCache) Retrieve(ctx context.Context) (aws.Credentials, error) { + cc.credsOrErrMu.RLock() + defer cc.credsOrErrMu.RUnlock() + + if cc.credsOrErr.err != nil { + cc.log.WarnContext(ctx, "Returning error to AWS client", errorValue(cc.credsOrErr.err)) + } + + return cc.credsOrErr.creds, cc.credsOrErr.err +} + +func (cc *CredentialsCache) Run(ctx context.Context) { + // Wait for initialized signal before running loop. + select { + case <-cc.initialized: + case <-ctx.Done(): + cc.log.DebugContext(ctx, "Context canceled before initialized.") + return + } + + cc.refreshIfNeeded(ctx) + + ticker := cc.clock.NewTicker(refreshCheckInterval) + defer ticker.Stop() + for { + select { + case <-ticker.Chan(): + cc.refreshIfNeeded(ctx) + case <-ctx.Done(): + cc.log.DebugContext(ctx, "Context canceled, stopping refresh loop.") + return + } + } +} + +func (cc *CredentialsCache) refreshIfNeeded(ctx context.Context) { + credsFromCache, err := cc.Retrieve(ctx) + if err == nil && + credsFromCache.HasKeys() && + cc.clock.Now().Add(refreshBeforeExpirationPeriod).Before(credsFromCache.Expires) { + // No need to refresh, credentials in cache are still valid for longer + // than refreshBeforeExpirationPeriod + return + } + cc.log.DebugContext(ctx, "Refreshing credentials.") + + creds, err := cc.refresh(ctx) + if err != nil { + cc.log.WarnContext(ctx, "Failed to retrieve new credentials", errorValue(err)) + now := cc.clock.Now() + // If we were not able to refresh, check if existing credentials in + // cache are still valid. If yes, just log debug, it will be retried on + // next interval check. + if credsFromCache.HasKeys() && now.Before(credsFromCache.Expires) { + cc.log.DebugContext(ctx, "Continuing to use existing credentials", + slog.Duration( + "ttl", + credsFromCache.Expires.Sub(now).Round(time.Second))) + return + } + // If existing creds are expired, update cached error. + cc.log.ErrorContext(ctx, "Setting cached error", "error", err) + cc.setCredsOrErr(credsOrErr{err: trace.Wrap(err)}) + return + } + + // Refresh went well, update cached creds. + cc.setCredsOrErr(credsOrErr{creds: creds}) + cc.log.DebugContext(ctx, "Successfully refreshed credentials", + slog.Time("expires", creds.Expires)) +} + +func (cc *CredentialsCache) setCredsOrErr(coe credsOrErr) { + cc.credsOrErrMu.Lock() + defer cc.credsOrErrMu.Unlock() + cc.credsOrErr = coe + cc.closeGotFirstCredsOrErr() +} + +func (cc *CredentialsCache) refresh(ctx context.Context) (aws.Credentials, error) { + cc.log.InfoContext(ctx, "Refreshing AWS credentials") + defer cc.log.InfoContext(ctx, "Exiting AWS credentials refresh") + + cc.log.InfoContext(ctx, "Generating Token") + oidcToken, err := cc.generateOIDCTokenFn(ctx, cc.integration) + if err != nil { + cc.log.ErrorContext(ctx, "Token generation failed", errorValue(err)) + return aws.Credentials{}, trace.Wrap(err) + } + + roleProvider := stscreds.NewWebIdentityRoleProvider( + cc.stsClient, + cc.roleARN.String(), + identityToken(oidcToken), + func(wiro *stscreds.WebIdentityRoleOptions) { + wiro.Duration = TokenLifetime + }, + ) + + ctx, cancel := context.WithTimeout(ctx, retrieveTimeout) + defer cancel() + + cc.log.InfoContext(ctx, "Retrieving AWS role credentials") + + creds, err := roleProvider.Retrieve(ctx) + if err != nil { + cc.log.ErrorContext(ctx, "Role retrieval failed", errorValue(err)) + } + + return creds, trace.Wrap(err) +} + +func (cc *CredentialsCache) WaitForFirstCredsOrErr(ctx context.Context) { + cc.log.InfoContext(ctx, "Entering wait on first credential refresh") + defer cc.log.InfoContext(ctx, "Exiting wait on first credential refresh") + + select { + case <-ctx.Done(): + case <-cc.gotFirstCredsOrErr: + } +} + +// identityToken is an implementation of [stscreds.IdentityTokenRetriever] for returning a static token. +type identityToken string + +// GetIdentityToken returns the token configured. +func (j identityToken) GetIdentityToken() ([]byte, error) { + return []byte(j), nil +} + +func errorValue(v error) slog.Attr { + return slog.Any("error", v) +} diff --git a/lib/integrations/awsoidc/credentialscache_test.go b/lib/integrations/awsoidc/credentialscache_test.go new file mode 100644 index 0000000000000..cc997758f70be --- /dev/null +++ b/lib/integrations/awsoidc/credentialscache_test.go @@ -0,0 +1,226 @@ +// Teleport +// Copyright (C) 2024 Gravitational, Inc. +// +// This program is free software: you can redistribute it and/or modify +// it under the terms of the GNU Affero General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU Affero General Public License for more details. +// +// You should have received a copy of the GNU Affero General Public License +// along with this program. If not, see . + +package awsoidc + +import ( + "context" + "errors" + "sync" + "testing" + "time" + + "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/service/sts" + ststypes "github.com/aws/aws-sdk-go-v2/service/sts/types" + "github.com/google/uuid" + "github.com/jonboulle/clockwork" + "github.com/sirupsen/logrus" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/entitlements" + "github.com/gravitational/teleport/lib/modules" +) + +type fakeSTSClient struct { + clock clockwork.Clock + err error + sync.Mutex +} + +func (f *fakeSTSClient) setError(err error) { + f.Lock() + f.err = err + f.Unlock() +} + +func (f *fakeSTSClient) getError() error { + f.Lock() + defer f.Unlock() + return f.err +} + +func (f *fakeSTSClient) AssumeRoleWithWebIdentity(ctx context.Context, params *sts.AssumeRoleWithWebIdentityInput, optFns ...func(*sts.Options)) (*sts.AssumeRoleWithWebIdentityOutput, error) { + if err := f.getError(); err != nil { + return nil, err + } + + expiration := f.clock.Now().Add(time.Second * time.Duration(*params.DurationSeconds)) + return &sts.AssumeRoleWithWebIdentityOutput{ + Credentials: &ststypes.Credentials{ + Expiration: &expiration, + // These are example values taken from https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRoleWithWebIdentity.html + SessionToken: aws.String("AQoDYXdzEE0a8ANXXXXXXXXNO1ewxE5TijQyp+IEXAMPLE"), + SecretAccessKey: aws.String("wJalrXUtnFEMI/K7MDENG/bPxRfiCYzEXAMPLEKEY"), + AccessKeyId: aws.String("ASgeIAIOSFODNN7EXAMPLE"), + }, + }, nil +} + +func TestCredentialsCache(t *testing.T) { + logrus.SetLevel(logrus.DebugLevel) + + ctx, cancel := context.WithCancel(context.Background()) + t.Cleanup(cancel) + + modules.SetTestModules(t, &modules.TestModules{ + TestFeatures: modules.Features{ + Cloud: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.ExternalAuditStorage: {Enabled: true}, + }, + }, + }) + + // GIVEN a configured and running credential cache... + clock := clockwork.NewFakeClock() + stsClient := &fakeSTSClient{ + clock: clock, + } + cacheUnderTest, err := NewCredentialsCache(CredentialsCacheOptions{ + STSClient: stsClient, + Integration: "test", + Clock: clock, + }) + require.NoError(t, err) + require.NotNil(t, cacheUnderTest) + go cacheUnderTest.Run(ctx) + + advanceClock := func(d time.Duration) { + // Wait for the run loop to actually wait on the clock ticker before advancing. If we advance before + // the loop waits on the ticker, it may never tick. + clock.BlockUntil(1) + clock.Advance(d) + } + + // Set the GenerateOIDCTokenFn to a dumb faked function. + cacheUnderTest.SetGenerateOIDCTokenFn( + func(ctx context.Context, integration string) (string, error) { + return uuid.NewString(), nil + }) + + checkRetrieveCredentials := func(t require.TestingT, expectErr error) { + _, err := cacheUnderTest.Retrieve(ctx) + assert.ErrorIs(t, err, expectErr) + } + + checkRetrieveCredentialsWithExpiry := func(t require.TestingT, expectExpiry time.Time) { + creds, err := cacheUnderTest.Retrieve(ctx) + assert.NoError(t, err) + if err == nil { + assert.WithinDuration(t, expectExpiry, creds.Expires, time.Minute) + } + } + + const ( + // Using a longer wait time to avoid test flakes observed with 1s wait. + waitFor = 10 * time.Second + // We're using a short sleep (1ms) to allow the refresh loop goroutine to get scheduled. + // This keeps the test fast under normal conditions. If there's CPU starvation in CI, + // neither the test goroutine nor the refresh loop are likely getting scheduled often, + // so this shouldn't result in a busy loop. + tick = 1 * time.Millisecond + ) + + t.Run("Retrieve", func(t *testing.T) { + // Assert that credentials can be retrieved when everything is happy. + // EventuallyWithT is necessary to allow credentialsCache.run to be + // scheduled after SetGenerateOIDCTokenFn above. + initialCredentialExpiry := clock.Now().Add(TokenLifetime) + require.EventuallyWithT(t, func(t *assert.CollectT) { + checkRetrieveCredentialsWithExpiry(t, initialCredentialExpiry) + }, waitFor, tick) + }) + + t.Run("CachedCredsArePreservedOnError", func(t *testing.T) { + initialCredentialExpiry := clock.Now().Add(TokenLifetime) + require.EventuallyWithT(t, func(t *assert.CollectT) { + checkRetrieveCredentialsWithExpiry(t, initialCredentialExpiry) + }, waitFor, tick) + + // Assert that the good cached credentials are still used even if sts starts + // returning errors. + stsError := errors.New("test error") + stsClient.setError(stsError) + // Test immediately + checkRetrieveCredentialsWithExpiry(t, initialCredentialExpiry) + // Advance to 1 minute before first refresh attempt + advanceClock(TokenLifetime - refreshBeforeExpirationPeriod - time.Minute) + checkRetrieveCredentialsWithExpiry(t, initialCredentialExpiry) + // Advance to 1 minute after first refresh attempt + advanceClock(2 * time.Minute) + checkRetrieveCredentialsWithExpiry(t, initialCredentialExpiry) + // Advance to 1 minute before credential expiry + advanceClock(refreshBeforeExpirationPeriod - 2*time.Minute) + checkRetrieveCredentialsWithExpiry(t, initialCredentialExpiry) + + // Advance 1 minute past the credential expiry and make sure we get the + // expected error. + advanceClock(2 * time.Minute) + require.EventuallyWithT(t, func(t *assert.CollectT) { + checkRetrieveCredentials(t, stsError) + }, waitFor, tick) + + // Fix STS and make sure we stop getting errors within refreshCheckInterval + stsClient.setError(nil) + advanceClock(refreshCheckInterval) + newCredentialExpiry := clock.Now().Add(TokenLifetime) + require.EventuallyWithT(t, func(t *assert.CollectT) { + checkRetrieveCredentialsWithExpiry(t, newCredentialExpiry) + }, waitFor, tick) + }) + + t.Run("WindowedErrors", func(t *testing.T) { + // Test a scenario where STS is returning errors in two different 10-minute windows: the first surrounding + // the expected cert refresh time, and the second surrounding the cert expiry time. + // In this case the credentials cache should refresh the certs somewhere between those two outages, and + // clients should never see an error retrieving credentials. + newCredentialExpiry := clock.Now().Add(TokenLifetime) + expectedRefreshTime := newCredentialExpiry.Add(-refreshBeforeExpirationPeriod) + credentialsUpdated := false + done := newCredentialExpiry.Add(10 * time.Minute) + stsError := errors.New("test error") + for clock.Now().Before(done) { + if clock.Now().Sub(expectedRefreshTime).Abs() < 5*time.Minute || + clock.Now().Sub(newCredentialExpiry).Abs() < 5*time.Minute { + // Within one of the 10-minute outage windows, make the STS client return errors. + stsClient.setError(stsError) + advanceClock(time.Minute) + } else { + // Not within an outage window, STS client should not return errors. + stsClient.setError(nil) + advanceClock(time.Minute) + + if !credentialsUpdated && clock.Now().After(expectedRefreshTime) { + // This is after the expected refresh time and not within an outage window, for the test to + // not be flaky we need to wait for the cache run loop to get a chance to refresh the + // credentials. + expectedExpiry := clock.Now().Add(TokenLifetime) + require.EventuallyWithT(t, func(t *assert.CollectT) { + creds, err := cacheUnderTest.Retrieve(ctx) + assert.NoError(t, err) + assert.WithinDuration(t, expectedExpiry, creds.Expires, 2*time.Minute) + }, waitFor, tick) + credentialsUpdated = true + } + } + + // Assert that there is never an error getting credentials. + checkRetrieveCredentials(t, nil) + } + }) +} diff --git a/lib/integrations/externalauditstorage/configurator.go b/lib/integrations/externalauditstorage/configurator.go index 050298f9e13e0..66cea204a57cc 100644 --- a/lib/integrations/externalauditstorage/configurator.go +++ b/lib/integrations/externalauditstorage/configurator.go @@ -20,23 +20,21 @@ package externalauditstorage import ( "context" - "errors" - "sync" "time" "github.com/aws/aws-sdk-go-v2/aws" + "github.com/aws/aws-sdk-go-v2/aws/arn" "github.com/aws/aws-sdk-go-v2/config" "github.com/aws/aws-sdk-go-v2/credentials/stscreds" "github.com/aws/aws-sdk-go-v2/service/sts" "github.com/aws/aws-sdk-go/aws/credentials" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - "github.com/sirupsen/logrus" - "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/api/types/externalauditstorage" "github.com/gravitational/teleport/entitlements" + "github.com/gravitational/teleport/lib/integrations/awsoidc" "github.com/gravitational/teleport/lib/modules" "github.com/gravitational/teleport/lib/services" ) @@ -86,7 +84,7 @@ type Configurator struct { spec *externalauditstorage.ExternalAuditStorageSpec isUsed bool - credentialsCache *credentialsCache + credentialsCache *awsoidc.CredentialsCache } // Options holds options for the Configurator. @@ -202,7 +200,10 @@ func newConfigurator(ctx context.Context, spec *externalauditstorage.ExternalAud "ExternalAuditStorage: configured integration %q does not appear to be an AWS OIDC integration", oidcIntegrationName) } - awsRoleARN := awsOIDCSpec.RoleARN + awsRoleARN, err := arn.Parse(awsOIDCSpec.RoleARN) + if err != nil { + return nil, trace.Wrap(err, "AWS role is not a valid ARN") + } options := &Options{} for _, optFn := range optFns { @@ -212,11 +213,16 @@ func newConfigurator(ctx context.Context, spec *externalauditstorage.ExternalAud return nil, trace.Wrap(err) } - credentialsCache, err := newCredentialsCache(oidcIntegrationName, awsRoleARN, options) + credentialsCache, err := awsoidc.NewCredentialsCache(awsoidc.CredentialsCacheOptions{ + Integration: oidcIntegrationName, + RoleARN: awsRoleARN, + STSClient: options.stsClient, + Clock: options.clock, + }) if err != nil { return nil, trace.Wrap(err) } - go credentialsCache.run(ctx) + go credentialsCache.Run(ctx) // Draft configurator does not need to count errors or create cluster // alerts. @@ -245,13 +251,9 @@ func (c *Configurator) GetSpec() *externalauditstorage.ExternalAuditStorageSpec return c.spec } -// GenerateOIDCTokenFn is a function that should return a valid, signed JWT for -// authenticating to AWS via OIDC. -type GenerateOIDCTokenFn func(ctx context.Context, integration string) (string, error) - // SetGenerateOIDCTokenFn sets the source of OIDC tokens for this Configurator. -func (c *Configurator) SetGenerateOIDCTokenFn(fn GenerateOIDCTokenFn) { - c.credentialsCache.setGenerateOIDCTokenFn(fn) +func (c *Configurator) SetGenerateOIDCTokenFn(fn awsoidc.GenerateOIDCTokenFn) { + c.credentialsCache.SetGenerateOIDCTokenFn(fn) } // CredentialsProvider returns an aws.CredentialsProvider that can be used to @@ -274,185 +276,13 @@ func (p *Configurator) CredentialsProviderSDKV1() credentials.ProviderWithContex // credential providers won't return errors simply due to the cache not being // ready yet. func (p *Configurator) WaitForFirstCredentials(ctx context.Context) { - p.credentialsCache.waitForFirstCredsOrErr(ctx) -} - -// credentialsCache is used to store and refresh AWS credentials used with -// AWS OIDC integration. -// -// Credentials are valid for 1h, but they cannot be refreshed if Proxy is down, -// so we attempt to refresh the credentials early and retry on failure. -// -// credentialsCache is a dependency to both the s3 session uploader and the -// athena audit logger. They are both initialized before auth. However AWS -// credentials using OIDC integration can be obtained only after auth is -// initialized. That's why generateOIDCTokenFn is injected dynamically after -// auth is initialized. Before initialization, credentialsCache will return -// an error on any Retrieve call. -type credentialsCache struct { - log *logrus.Entry - - roleARN string - integration string - - // generateOIDCTokenFn is dynamically set after auth is initialized. - generateOIDCTokenFn GenerateOIDCTokenFn - - // initialized communicates (via closing channel) that generateOIDCTokenFn is set. - initialized chan struct{} - closeInitialized func() - - // gotFirstCredsOrErr communicates (via closing channel) that the first - // credsOrErr has been set. - gotFirstCredsOrErr chan struct{} - closeGotFirstCredsOrErr func() - - credsOrErr credsOrErr - credsOrErrMu sync.RWMutex - - stsClient stscreds.AssumeRoleWithWebIdentityAPIClient - clock clockwork.Clock -} - -type credsOrErr struct { - creds aws.Credentials - err error -} - -func newCredentialsCache(integration, roleARN string, options *Options) (*credentialsCache, error) { - initialized := make(chan struct{}) - gotFirstCredsOrErr := make(chan struct{}) - return &credentialsCache{ - roleARN: roleARN, - integration: integration, - log: logrus.WithField(teleport.ComponentKey, "ExternalAuditStorage.CredentialsCache"), - initialized: initialized, - closeInitialized: sync.OnceFunc(func() { close(initialized) }), - gotFirstCredsOrErr: gotFirstCredsOrErr, - closeGotFirstCredsOrErr: sync.OnceFunc(func() { close(gotFirstCredsOrErr) }), - credsOrErr: credsOrErr{ - err: errors.New("ExternalAuditStorage: credential cache not yet initialized"), - }, - clock: options.clock, - stsClient: options.stsClient, - }, nil -} - -func (cc *credentialsCache) setGenerateOIDCTokenFn(fn GenerateOIDCTokenFn) { - cc.generateOIDCTokenFn = fn - cc.closeInitialized() -} - -// Retrieve implements [aws.CredentialsProvider] and returns the latest cached -// credentials, or an error if no credentials have been generated yet or the -// last generated credentials have expired. -func (cc *credentialsCache) Retrieve(ctx context.Context) (aws.Credentials, error) { - cc.credsOrErrMu.RLock() - defer cc.credsOrErrMu.RUnlock() - return cc.credsOrErr.creds, cc.credsOrErr.err -} - -func (cc *credentialsCache) run(ctx context.Context) { - // Wait for initialized signal before running loop. - select { - case <-cc.initialized: - case <-ctx.Done(): - cc.log.Debug("Context canceled before initialized.") - return - } - - cc.refreshIfNeeded(ctx) - - ticker := cc.clock.NewTicker(refreshCheckInterval) - defer ticker.Stop() - for { - select { - case <-ticker.Chan(): - cc.refreshIfNeeded(ctx) - case <-ctx.Done(): - cc.log.Debugf("Context canceled, stopping refresh loop.") - return - } - } -} - -func (cc *credentialsCache) refreshIfNeeded(ctx context.Context) { - credsFromCache, err := cc.Retrieve(ctx) - if err == nil && - credsFromCache.HasKeys() && - cc.clock.Now().Add(refreshBeforeExpirationPeriod).Before(credsFromCache.Expires) { - // No need to refresh, credentials in cache are still valid for longer - // than refreshBeforeExpirationPeriod - return - } - cc.log.Debugf("Refreshing credentials.") - - creds, err := cc.refresh(ctx) - if err != nil { - cc.log.Warnf("Failed to retrieve new credentials: %v", err) - // If we were not able to refresh, check if existing credentials in cache are still valid. - // If yes, just log debug, it will be retried on next interval check. - if credsFromCache.HasKeys() && cc.clock.Now().Before(credsFromCache.Expires) { - cc.log.Debugf("Using existing credentials expiring in %s.", credsFromCache.Expires.Sub(cc.clock.Now()).Round(time.Second).String()) - return - } - // If existing creds are expired, update cached error. - cc.setCredsOrErr(credsOrErr{err: trace.Wrap(err)}) - return - } - // Refresh went well, update cached creds. - cc.setCredsOrErr(credsOrErr{creds: creds}) - cc.log.Debugf("Successfully refreshed credentials, new expiry at %v", creds.Expires) -} - -func (cc *credentialsCache) setCredsOrErr(coe credsOrErr) { - cc.credsOrErrMu.Lock() - defer cc.credsOrErrMu.Unlock() - cc.credsOrErr = coe - cc.closeGotFirstCredsOrErr() -} - -func (cc *credentialsCache) refresh(ctx context.Context) (aws.Credentials, error) { - oidcToken, err := cc.generateOIDCTokenFn(ctx, cc.integration) - if err != nil { - return aws.Credentials{}, trace.Wrap(err) - } - - roleProvider := stscreds.NewWebIdentityRoleProvider( - cc.stsClient, - cc.roleARN, - identityToken(oidcToken), - func(wiro *stscreds.WebIdentityRoleOptions) { - wiro.Duration = TokenLifetime - }, - ) - - ctx, cancel := context.WithTimeout(ctx, retrieveTimeout) - defer cancel() - - creds, err := roleProvider.Retrieve(ctx) - return creds, trace.Wrap(err) -} - -func (cc *credentialsCache) waitForFirstCredsOrErr(ctx context.Context) { - select { - case <-ctx.Done(): - case <-cc.gotFirstCredsOrErr: - } -} - -// identityToken is an implementation of [stscreds.IdentityTokenRetriever] for returning a static token. -type identityToken string - -// GetIdentityToken returns the token configured. -func (j identityToken) GetIdentityToken() ([]byte, error) { - return []byte(j), nil + p.credentialsCache.WaitForFirstCredsOrErr(ctx) } // v1Adapter wraps the credentialsCache to implement // [credentials.ProviderWithContext] used by aws-sdk-go (v1). type v1Adapter struct { - cc *credentialsCache + cc *awsoidc.CredentialsCache } var _ credentials.ProviderWithContext = (*v1Adapter)(nil) diff --git a/lib/integrations/externalauditstorage/configurator_test.go b/lib/integrations/externalauditstorage/configurator_test.go index abb1ce1425b9e..ba86e5f8e0c27 100644 --- a/lib/integrations/externalauditstorage/configurator_test.go +++ b/lib/integrations/externalauditstorage/configurator_test.go @@ -47,7 +47,7 @@ func testOIDCIntegration(t *testing.T) *types.IntegrationV1 { oidcIntegration, err := types.NewIntegrationAWSOIDC( types.Metadata{Name: "aws-integration-1"}, &types.AWSOIDCIntegrationSpecV1{ - RoleARN: "role1", + RoleARN: "arn:aws:iam::account:role/role1", }, ) require.NoError(t, err) diff --git a/lib/service/service_test.go b/lib/service/service_test.go index 8b029bdab2ca8..ec596200d1edc 100644 --- a/lib/service/service_test.go +++ b/lib/service/service_test.go @@ -503,7 +503,7 @@ func TestAthenaAuditLogSetup(t *testing.T) { oidcIntegration, err := types.NewIntegrationAWSOIDC( types.Metadata{Name: "aws-integration-1"}, &types.AWSOIDCIntegrationSpecV1{ - RoleARN: "role1", + RoleARN: "arn:aws:iam::account:role/role1", }, ) require.NoError(t, err) From 3c79bae775552c5a3d9b6d9e1fba190719de9f07 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Wed, 23 Oct 2024 16:02:45 +0200 Subject: [PATCH 30/70] Turn off HTTPS of Vite's dev server in Connect (#47849) --- .../teleterm/electron.vite.config.mts | 26 ------------------- .../src/mainProcess/windowsManager.ts | 2 +- 2 files changed, 1 insertion(+), 27 deletions(-) diff --git a/web/packages/teleterm/electron.vite.config.mts b/web/packages/teleterm/electron.vite.config.mts index 42a7d81eb44d6..926fc20b307cb 100644 --- a/web/packages/teleterm/electron.vite.config.mts +++ b/web/packages/teleterm/electron.vite.config.mts @@ -17,7 +17,6 @@ */ import path from 'node:path'; -import { existsSync, readFileSync } from 'node:fs'; import { defineConfig, externalizeDepsPlugin, UserConfig } from 'electron-vite'; @@ -120,31 +119,6 @@ const config = defineConfig(env => { }, }; - if (env.mode === 'development') { - if (process.env.VITE_HTTPS_KEY && process.env.VITE_HTTPS_CERT) { - config.renderer.server.https = { - key: readFileSync(process.env.VITE_HTTPS_KEY), - cert: readFileSync(process.env.VITE_HTTPS_CERT), - }; - } else { - const certsDirectory = path.resolve(rootDirectory, 'web/certs'); - - if (!existsSync(certsDirectory)) { - throw new Error( - 'Could not find SSL certificates. Please follow web/README.md to generate certificates.' - ); - } - - const keyPath = path.resolve(certsDirectory, 'server.key'); - const certPath = path.resolve(certsDirectory, 'server.crt'); - - config.renderer.server.https = { - key: readFileSync(keyPath), - cert: readFileSync(certPath), - }; - } - } - return config; }); diff --git a/web/packages/teleterm/src/mainProcess/windowsManager.ts b/web/packages/teleterm/src/mainProcess/windowsManager.ts index daa0935122c4c..513e31573400c 100644 --- a/web/packages/teleterm/src/mainProcess/windowsManager.ts +++ b/web/packages/teleterm/src/mainProcess/windowsManager.ts @@ -362,7 +362,7 @@ export class WindowsManager { * */ function getWindowUrl(isDev: boolean): string { if (isDev) { - return 'https://localhost:8080/'; + return 'http://localhost:8080/'; } // The returned URL is percent-encoded. From 7a44000c54b8a1972d1591d427db0c47a4986d1b Mon Sep 17 00:00:00 2001 From: Marco Dinis Date: Wed, 23 Oct 2024 15:19:47 +0100 Subject: [PATCH 31/70] Test plan: remove single EC2 enrollment (#47852) Single EC2 enrollment was using EICE which is no longer available. --- .github/ISSUE_TEMPLATE/webtestplan.md | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/ISSUE_TEMPLATE/webtestplan.md b/.github/ISSUE_TEMPLATE/webtestplan.md index 2f905c9f3ec68..bcdac7b26219d 100644 --- a/.github/ISSUE_TEMPLATE/webtestplan.md +++ b/.github/ISSUE_TEMPLATE/webtestplan.md @@ -175,11 +175,14 @@ All actions should require re-authn with a webauthn device. Use Discover Wizard to enroll new resources and access them: -- [ ] SSH Server (teleport service, singular EC2, SSM agent) +- [ ] SSH Server using Teleport Service - [ ] Self-Hosted PostgreSQL and Mongo -- [ ] AWS RDS (singular RDS, auto discover with ECS) - [ ] Kubernetes -- [ ] AWS EKS cluster +- [ ] Using an AWS OIDC Integration + - [ ] EC2 Auto Enrollment (SSM) + - [ ] RDS flow: single database + - [ ] RDS flow: Auto Enrollment (by VPC) + - [ ] EKS Clusters - [ ] Non-guided cards link out to correct docs #### Access Lists From 0c3b807db6a058b2a32dd407f46cb49aafff2147 Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Wed, 23 Oct 2024 13:38:17 -0400 Subject: [PATCH 32/70] Add autoupdate agent type validations (#47831) * Add autoupdate agent validations * Add AutoUpdateAgentRollout constants * Fix autoupdate API licenses Teleport's `api/` and `integrations/` should be Apache-licensed. Only the main teleport process should be licenses under AGPLv3. * address feedback --- api/types/autoupdate/config.go | 74 +++++++++----- api/types/autoupdate/config_test.go | 148 ++++++++++++++++++++++++--- api/types/autoupdate/constants.go | 46 +++++++++ api/types/autoupdate/rollout.go | 76 ++++++++++++++ api/types/autoupdate/rollout_test.go | 145 ++++++++++++++++++++++++++ api/types/autoupdate/utils.go | 68 ++++++++++++ api/types/autoupdate/version.go | 50 +++++---- api/types/autoupdate/version_test.go | 119 +++++++++++++++++---- api/types/constants.go | 6 ++ 9 files changed, 651 insertions(+), 81 deletions(-) create mode 100644 api/types/autoupdate/constants.go create mode 100644 api/types/autoupdate/rollout.go create mode 100644 api/types/autoupdate/rollout_test.go create mode 100644 api/types/autoupdate/utils.go diff --git a/api/types/autoupdate/config.go b/api/types/autoupdate/config.go index d61c35eccf0c2..32ae056195b64 100644 --- a/api/types/autoupdate/config.go +++ b/api/types/autoupdate/config.go @@ -1,24 +1,24 @@ /* - * Teleport - * Copyright (C) 2024 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ +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 autoupdate import ( + "time" + "github.com/gravitational/trace" "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" @@ -26,13 +26,6 @@ import ( "github.com/gravitational/teleport/api/types" ) -const ( - // ToolsUpdateModeEnabled enables client tools automatic updates. - ToolsUpdateModeEnabled = "enabled" - // ToolsUpdateModeDisabled disables client tools automatic updates. - ToolsUpdateModeDisabled = "disabled" -) - // NewAutoUpdateConfig creates a new auto update configuration resource. func NewAutoUpdateConfig(spec *autoupdate.AutoUpdateConfigSpec) (*autoupdate.AutoUpdateConfig, error) { config := &autoupdate.AutoUpdateConfig{ @@ -66,10 +59,41 @@ func ValidateAutoUpdateConfig(c *autoupdate.AutoUpdateConfig) error { return trace.BadParameter("Spec is nil") } if c.Spec.Tools != nil { - if c.Spec.Tools.Mode != ToolsUpdateModeDisabled && c.Spec.Tools.Mode != ToolsUpdateModeEnabled { - return trace.BadParameter("ToolsMode is not valid") + if err := checkToolsMode(c.Spec.Tools.Mode); err != nil { + return trace.Wrap(err, "validating spec.tools.mode") + } + } + if c.Spec.Agents != nil { + if err := checkAgentsMode(c.Spec.Agents.Mode); err != nil { + return trace.Wrap(err, "validating spec.agents.mode") + } + if err := checkAgentsStrategy(c.Spec.Agents.Strategy); err != nil { + return trace.Wrap(err, "validating spec.agents.strategy") } + + windowDuration := c.Spec.Agents.MaintenanceWindowDuration.AsDuration() + if c.Spec.Agents.Strategy == AgentsStrategyHaltOnError && windowDuration != 0 { + return trace.BadParameter("spec.agents.maintenance_window_duration must be zero when the strategy is %q", c.Spec.Agents.Strategy) + } + if c.Spec.Agents.Strategy == AgentsStrategyTimeBased && windowDuration < 10*time.Minute { + return trace.BadParameter("spec.agents.maintenance_window_duration must be greater than 10 minutes when the strategy is %q", c.Spec.Agents.Strategy) + } + + if err := checkAgentSchedules(c.Spec.Agents.Schedules); err != nil { + return trace.Wrap(err, "validating spec.agents.schedules") + } + } return nil } + +func checkAgentSchedules(schedules *autoupdate.AgentAutoUpdateSchedules) error { + // TODO: change this logic when we implement group support. + // Currently we reject any non-nil schedule + // When we'll implement schedule support, we'll treat an empty schedule as the default schedule. + if schedules == nil { + return nil + } + return trace.NotImplemented("agent schedules are not implemented yet") +} diff --git a/api/types/autoupdate/config_test.go b/api/types/autoupdate/config_test.go index 443d6f246fa56..f6b6a87aa6bd8 100644 --- a/api/types/autoupdate/config_test.go +++ b/api/types/autoupdate/config_test.go @@ -1,29 +1,29 @@ /* - * Teleport - * Copyright (C) 2024 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ +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 autoupdate import ( "testing" + "time" "github.com/google/go-cmp/cmp" "github.com/stretchr/testify/require" "google.golang.org/protobuf/testing/protocmp" + "google.golang.org/protobuf/types/known/durationpb" "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" @@ -99,7 +99,121 @@ func TestNewAutoUpdateConfig(t *testing.T) { }, }, assertErr: func(t *testing.T, err error, a ...any) { - require.ErrorContains(t, err, "ToolsMode is not valid") + require.ErrorContains(t, err, "unsupported tools mode: \"invalid-mode\"") + }, + }, + { + name: "invalid agents mode", + spec: &autoupdate.AutoUpdateConfigSpec{ + Agents: &autoupdate.AutoUpdateConfigSpecAgents{ + Mode: "invalid-mode", + Strategy: AgentsStrategyHaltOnError, + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "unsupported agents mode: \"invalid-mode\"") + }, + }, + { + name: "invalid agents strategy", + spec: &autoupdate.AutoUpdateConfigSpec{ + Agents: &autoupdate.AutoUpdateConfigSpecAgents{ + Mode: AgentsUpdateModeEnabled, + Strategy: "invalid-strategy", + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "unsupported agents strategy: \"invalid-strategy\"") + }, + }, + { + name: "invalid agents non-nil maintenance window with halt-on-error", + spec: &autoupdate.AutoUpdateConfigSpec{ + Agents: &autoupdate.AutoUpdateConfigSpecAgents{ + Mode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyHaltOnError, + MaintenanceWindowDuration: durationpb.New(time.Hour), + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "maintenance_window_duration must be zero") + }, + }, + { + name: "invalid agents nil maintenance window with time-based strategy", + spec: &autoupdate.AutoUpdateConfigSpec{ + Agents: &autoupdate.AutoUpdateConfigSpecAgents{ + Mode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyTimeBased, + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "maintenance_window_duration must be greater than 10 minutes") + }, + }, + { + name: "invalid agents short maintenance window", + spec: &autoupdate.AutoUpdateConfigSpec{ + Agents: &autoupdate.AutoUpdateConfigSpecAgents{ + Mode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyTimeBased, + MaintenanceWindowDuration: durationpb.New(time.Minute), + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "maintenance_window_duration must be greater than 10 minutes") + }, + }, + { + name: "success agents autoupdate halt-on-failure", + spec: &autoupdate.AutoUpdateConfigSpec{ + Agents: &autoupdate.AutoUpdateConfigSpecAgents{ + Mode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyHaltOnError, + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.NoError(t, err) + }, + want: &autoupdate.AutoUpdateConfig{ + Kind: types.KindAutoUpdateConfig, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: types.MetaNameAutoUpdateConfig, + }, + Spec: &autoupdate.AutoUpdateConfigSpec{ + Agents: &autoupdate.AutoUpdateConfigSpecAgents{ + Mode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyHaltOnError, + }, + }, + }, + }, + { + name: "success agents autoupdate time-based", + spec: &autoupdate.AutoUpdateConfigSpec{ + Agents: &autoupdate.AutoUpdateConfigSpecAgents{ + Mode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyTimeBased, + MaintenanceWindowDuration: durationpb.New(time.Hour), + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.NoError(t, err) + }, + want: &autoupdate.AutoUpdateConfig{ + Kind: types.KindAutoUpdateConfig, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: types.MetaNameAutoUpdateConfig, + }, + Spec: &autoupdate.AutoUpdateConfigSpec{ + Agents: &autoupdate.AutoUpdateConfigSpecAgents{ + Mode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyTimeBased, + MaintenanceWindowDuration: durationpb.New(time.Hour), + }, + }, }, }, } diff --git a/api/types/autoupdate/constants.go b/api/types/autoupdate/constants.go new file mode 100644 index 0000000000000..deed5168fb21f --- /dev/null +++ b/api/types/autoupdate/constants.go @@ -0,0 +1,46 @@ +/* +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 autoupdate + +const ( + // ToolsUpdateModeEnabled enables client tools automatic updates. + ToolsUpdateModeEnabled = "enabled" + // ToolsUpdateModeDisabled disables client tools automatic updates. + ToolsUpdateModeDisabled = "disabled" + + // AgentsUpdateModeEnabled enabled agent automatic updates. + AgentsUpdateModeEnabled = "enabled" + // AgentsUpdateModeDisabled disables agent automatic updates. + AgentsUpdateModeDisabled = "disabled" + // AgentsUpdateModeSuspended temporarily suspends agent automatic updates. + AgentsUpdateModeSuspended = "suspended" + + // AgentsScheduleRegular is the regular agent update schedule. + AgentsScheduleRegular = "regular" + // AgentsScheduleImmediate is the immediate agent update schedule. + // Every agent must update immediately if it's not already running the target version. + // This can be used to recover agents in case of major incident or actively exploited vulnerability. + AgentsScheduleImmediate = "immediate" + + // AgentsStrategyHaltOnError is the agent update strategy that updates groups sequentially + // according to their order in the schedule. The previous groups must succeed. + AgentsStrategyHaltOnError = "halt-on-error" + // AgentsStrategyTimeBased is the agent update strategy that updates groups solely based on their + // maintenance window. There is no dependency between groups. Agents won't be instructed to update + // if the window is over. + AgentsStrategyTimeBased = "time-based" +) diff --git a/api/types/autoupdate/rollout.go b/api/types/autoupdate/rollout.go new file mode 100644 index 0000000000000..814d71313d3ed --- /dev/null +++ b/api/types/autoupdate/rollout.go @@ -0,0 +1,76 @@ +/* +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 autoupdate + +import ( + "github.com/gravitational/trace" + + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + "github.com/gravitational/teleport/api/types" +) + +// NewAutoUpdateAgentRollout creates a new auto update version resource. +func NewAutoUpdateAgentRollout(spec *autoupdate.AutoUpdateAgentRolloutSpec) (*autoupdate.AutoUpdateAgentRollout, error) { + version := &autoupdate.AutoUpdateAgentRollout{ + Kind: types.KindAutoUpdateAgentRollout, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: types.MetaNameAutoUpdateAgentRollout, + }, + Spec: spec, + } + if err := ValidateAutoUpdateAgentRollout(version); err != nil { + return nil, trace.Wrap(err) + } + + return version, nil +} + +// ValidateAutoUpdateAgentRollout checks that required parameters are set +// for the specified AutoUpdateAgentRollout. +func ValidateAutoUpdateAgentRollout(v *autoupdate.AutoUpdateAgentRollout) error { + if v == nil { + return trace.BadParameter("AutoUpdateAgentRollout is nil") + } + if v.Metadata == nil { + return trace.BadParameter("Metadata is nil") + } + if v.Metadata.Name != types.MetaNameAutoUpdateAgentRollout { + return trace.BadParameter("Name is not valid") + } + if v.Spec == nil { + return trace.BadParameter("Spec is nil") + } + if err := checkVersion(v.Spec.StartVersion); err != nil { + return trace.Wrap(err, "validating spec.start_version") + } + if err := checkVersion(v.Spec.TargetVersion); err != nil { + return trace.Wrap(err, "validating spec.target_version") + } + if err := checkAgentsMode(v.Spec.AutoupdateMode); err != nil { + return trace.Wrap(err, "validating spec.autoupdate_mode") + } + if err := checkScheduleName(v.Spec.Schedule); err != nil { + return trace.Wrap(err, "validating spec.schedule") + } + if err := checkAgentsStrategy(v.Spec.Strategy); err != nil { + return trace.Wrap(err, "validating spec.strategy") + } + + return nil +} diff --git a/api/types/autoupdate/rollout_test.go b/api/types/autoupdate/rollout_test.go new file mode 100644 index 0000000000000..cce4dc8495d83 --- /dev/null +++ b/api/types/autoupdate/rollout_test.go @@ -0,0 +1,145 @@ +/* +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 autoupdate + +import ( + "testing" + + "github.com/google/go-cmp/cmp" + "github.com/stretchr/testify/require" + "google.golang.org/protobuf/testing/protocmp" + + "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" + headerv1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/header/v1" + "github.com/gravitational/teleport/api/types" +) + +// TestNewAutoUpdateConfig verifies validation for AutoUpdateConfig resource. +func TestNewAutoUpdateAgentRollout(t *testing.T) { + tests := []struct { + name string + spec *autoupdate.AutoUpdateAgentRolloutSpec + want *autoupdate.AutoUpdateAgentRollout + assertErr func(*testing.T, error, ...any) + }{ + { + name: "success valid rollout", + spec: &autoupdate.AutoUpdateAgentRolloutSpec{ + StartVersion: "1.2.3", + TargetVersion: "2.3.4-dev", + Schedule: AgentsScheduleRegular, + AutoupdateMode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyHaltOnError, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.NoError(t, err) + }, + want: &autoupdate.AutoUpdateAgentRollout{ + Kind: types.KindAutoUpdateAgentRollout, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: types.MetaNameAutoUpdateAgentRollout, + }, + Spec: &autoupdate.AutoUpdateAgentRolloutSpec{ + StartVersion: "1.2.3", + TargetVersion: "2.3.4-dev", + Schedule: AgentsScheduleRegular, + AutoupdateMode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyHaltOnError, + }, + }, + }, + { + name: "missing spec", + spec: nil, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "Spec is nil") + }, + }, + { + name: "missing start version", + spec: &autoupdate.AutoUpdateAgentRolloutSpec{ + TargetVersion: "2.3.4-dev", + Schedule: AgentsScheduleRegular, + AutoupdateMode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyHaltOnError, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "start_version\n\tversion is unset") + }, + }, + { + name: "invalid target version", + spec: &autoupdate.AutoUpdateAgentRolloutSpec{ + StartVersion: "1.2.3", + TargetVersion: "2-3-4", + Schedule: AgentsScheduleRegular, + AutoupdateMode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyHaltOnError, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "target_version\n\tversion \"2-3-4\" is not a valid semantic version") + }, + }, + { + name: "invalid autoupdate mode", + spec: &autoupdate.AutoUpdateAgentRolloutSpec{ + StartVersion: "1.2.3", + TargetVersion: "2.3.4-dev", + Schedule: AgentsScheduleRegular, + AutoupdateMode: "invalid-mode", + Strategy: AgentsStrategyHaltOnError, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "unsupported agents mode: \"invalid-mode\"") + }, + }, + { + name: "invalid schedule name", + spec: &autoupdate.AutoUpdateAgentRolloutSpec{ + StartVersion: "1.2.3", + TargetVersion: "2.3.4-dev", + Schedule: "invalid-schedule", + AutoupdateMode: AgentsUpdateModeEnabled, + Strategy: AgentsStrategyHaltOnError, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "unsupported schedule type: \"invalid-schedule\"") + }, + }, + { + name: "invalid strategy", + spec: &autoupdate.AutoUpdateAgentRolloutSpec{ + StartVersion: "1.2.3", + TargetVersion: "2.3.4-dev", + Schedule: AgentsScheduleRegular, + AutoupdateMode: AgentsUpdateModeEnabled, + Strategy: "invalid-strategy", + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "unsupported agents strategy: \"invalid-strategy\"") + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + got, err := NewAutoUpdateAgentRollout(tt.spec) + tt.assertErr(t, err) + require.Empty(t, cmp.Diff(got, tt.want, protocmp.Transform())) + }) + } +} diff --git a/api/types/autoupdate/utils.go b/api/types/autoupdate/utils.go new file mode 100644 index 0000000000000..4772ff8a94411 --- /dev/null +++ b/api/types/autoupdate/utils.go @@ -0,0 +1,68 @@ +/* +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 autoupdate + +import ( + "github.com/coreos/go-semver/semver" + "github.com/gravitational/trace" +) + +func checkVersion(version string) error { + if version == "" { + return trace.BadParameter("version is unset") + } + if _, err := semver.NewVersion(version); err != nil { + return trace.BadParameter("version %q is not a valid semantic version", version) + } + return nil +} + +func checkAgentsMode(mode string) error { + switch mode { + case AgentsUpdateModeEnabled, AgentsUpdateModeDisabled, AgentsUpdateModeSuspended: + return nil + default: + return trace.BadParameter("unsupported agents mode: %q", mode) + } +} + +func checkToolsMode(mode string) error { + switch mode { + case ToolsUpdateModeEnabled, ToolsUpdateModeDisabled: + return nil + default: + return trace.BadParameter("unsupported tools mode: %q", mode) + } +} + +func checkScheduleName(schedule string) error { + switch schedule { + case AgentsScheduleRegular, AgentsScheduleImmediate: + return nil + default: + return trace.BadParameter("unsupported schedule type: %q", schedule) + } +} + +func checkAgentsStrategy(strategy string) error { + switch strategy { + case AgentsStrategyHaltOnError, AgentsStrategyTimeBased: + return nil + default: + return trace.BadParameter("unsupported agents strategy: %q", strategy) + } +} diff --git a/api/types/autoupdate/version.go b/api/types/autoupdate/version.go index ad2d12f265949..4bfe14c53fc1f 100644 --- a/api/types/autoupdate/version.go +++ b/api/types/autoupdate/version.go @@ -1,25 +1,22 @@ /* - * Teleport - * Copyright (C) 2024 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ +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 autoupdate import ( - "github.com/coreos/go-semver/semver" "github.com/gravitational/trace" "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" @@ -61,11 +58,22 @@ func ValidateAutoUpdateVersion(v *autoupdate.AutoUpdateVersion) error { } if v.Spec.Tools != nil { - if v.Spec.Tools.TargetVersion == "" { - return trace.BadParameter("TargetVersion is unset") + if err := checkVersion(v.Spec.Tools.TargetVersion); err != nil { + return trace.Wrap(err, "validating spec.tools.target_version") + } + } + if v.Spec.Agents != nil { + if err := checkVersion(v.Spec.Agents.StartVersion); err != nil { + return trace.Wrap(err, "validating spec.agents.start_version") + } + if err := checkVersion(v.Spec.Agents.TargetVersion); err != nil { + return trace.Wrap(err, "validating spec.agents.target_version") + } + if err := checkAgentsMode(v.Spec.Agents.Mode); err != nil { + return trace.Wrap(err, "validating spec.agents.mode") } - if _, err := semver.NewVersion(v.Spec.Tools.TargetVersion); err != nil { - return trace.BadParameter("TargetVersion is not a valid semantic version") + if err := checkScheduleName(v.Spec.Agents.Schedule); err != nil { + return trace.Wrap(err, "validating spec.agents.schedule") } } diff --git a/api/types/autoupdate/version_test.go b/api/types/autoupdate/version_test.go index 70790a204b219..a59a4f6fe6c22 100644 --- a/api/types/autoupdate/version_test.go +++ b/api/types/autoupdate/version_test.go @@ -1,20 +1,18 @@ /* - * Teleport - * Copyright (C) 2024 Gravitational, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Affero General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU Affero General Public License for more details. - * - * You should have received a copy of the GNU Affero General Public License - * along with this program. If not, see . - */ +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 autoupdate @@ -69,7 +67,7 @@ func TestNewAutoUpdateVersion(t *testing.T) { }, }, assertErr: func(t *testing.T, err error, a ...any) { - require.ErrorContains(t, err, "TargetVersion is unset") + require.ErrorContains(t, err, "target_version\n\tversion is unset") }, }, { @@ -80,7 +78,7 @@ func TestNewAutoUpdateVersion(t *testing.T) { }, }, assertErr: func(t *testing.T, err error, a ...any) { - require.ErrorContains(t, err, "TargetVersion is not a valid semantic version") + require.ErrorContains(t, err, "target_version\n\tversion \"17-0-0\" is not a valid semantic version") }, }, { @@ -90,6 +88,91 @@ func TestNewAutoUpdateVersion(t *testing.T) { require.ErrorContains(t, err, "Spec is nil") }, }, + { + name: "success agents autoupdate version", + spec: &autoupdate.AutoUpdateVersionSpec{ + Agents: &autoupdate.AutoUpdateVersionSpecAgents{ + StartVersion: "1.2.3-dev.1", + TargetVersion: "1.2.3-dev.2", + Schedule: AgentsScheduleRegular, + Mode: AgentsUpdateModeEnabled, + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.NoError(t, err) + }, + want: &autoupdate.AutoUpdateVersion{ + Kind: types.KindAutoUpdateVersion, + Version: types.V1, + Metadata: &headerv1.Metadata{ + Name: types.MetaNameAutoUpdateVersion, + }, + Spec: &autoupdate.AutoUpdateVersionSpec{ + Agents: &autoupdate.AutoUpdateVersionSpecAgents{ + StartVersion: "1.2.3-dev.1", + TargetVersion: "1.2.3-dev.2", + Schedule: AgentsScheduleRegular, + Mode: AgentsUpdateModeEnabled, + }, + }, + }, + }, + { + name: "invalid empty agents start version", + spec: &autoupdate.AutoUpdateVersionSpec{ + Agents: &autoupdate.AutoUpdateVersionSpecAgents{ + StartVersion: "", + TargetVersion: "1.2.3", + Mode: AgentsUpdateModeEnabled, + Schedule: AgentsScheduleRegular, + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "start_version\n\tversion is unset") + }, + }, + { + name: "invalid empty agents target version", + spec: &autoupdate.AutoUpdateVersionSpec{ + Agents: &autoupdate.AutoUpdateVersionSpecAgents{ + StartVersion: "1.2.3-dev", + TargetVersion: "", + Mode: AgentsUpdateModeEnabled, + Schedule: AgentsScheduleRegular, + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "target_version\n\tversion is unset") + }, + }, + { + name: "invalid semantic agents start version", + spec: &autoupdate.AutoUpdateVersionSpec{ + Agents: &autoupdate.AutoUpdateVersionSpecAgents{ + StartVersion: "17-0-0", + TargetVersion: "1.2.3", + Mode: AgentsUpdateModeEnabled, + Schedule: AgentsScheduleRegular, + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "start_version\n\tversion \"17-0-0\" is not a valid semantic version") + }, + }, + { + name: "invalid semantic agents target version", + spec: &autoupdate.AutoUpdateVersionSpec{ + Agents: &autoupdate.AutoUpdateVersionSpecAgents{ + StartVersion: "1.2.3", + TargetVersion: "17-0-0", + Mode: AgentsUpdateModeEnabled, + Schedule: AgentsScheduleRegular, + }, + }, + assertErr: func(t *testing.T, err error, a ...any) { + require.ErrorContains(t, err, "target_version\n\tversion \"17-0-0\" is not a valid semantic version") + }, + }, } for _, tt := range tests { t.Run(tt.name, func(t *testing.T) { diff --git a/api/types/constants.go b/api/types/constants.go index 87c0335586bf6..b50b91c480aad 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -331,12 +331,18 @@ const ( // KindAutoUpdateVersion is the resource with autoupdate versions. KindAutoUpdateVersion = "autoupdate_version" + // KindAutoUpdateAgentRollout is the resource that controls and tracks agent rollouts. + KindAutoUpdateAgentRollout = "autoupdate_agent_rollout" + // MetaNameAutoUpdateConfig is the name of a configuration resource for autoupdate config. MetaNameAutoUpdateConfig = "autoupdate-config" // MetaNameAutoUpdateVersion is the name of a resource for autoupdate version. MetaNameAutoUpdateVersion = "autoupdate-version" + // MetaNameAutoUpdateAgentRollout is the name of the autoupdate agent rollout resource. + MetaNameAutoUpdateAgentRollout = "autoupdate-agent-rollout" + // KindClusterAuditConfig is the resource that holds cluster audit configuration. KindClusterAuditConfig = "cluster_audit_config" From 5de066049c50302e1634291c5b62a859850c97de Mon Sep 17 00:00:00 2001 From: Gavin Frazar Date: Wed, 23 Oct 2024 11:15:56 -0700 Subject: [PATCH 33/70] use AWS ECS service per VPC for DB service (#47842) Originally, single db enrollment deployed a DB service for an entire AWS region. This behavior was recently changed to deploy the DB service for a specific VPC in a region. So now the AWS ECS service must be named after the VPC it is deployed to for single db enrollment. --- .../AutoDeploy/AutoDeploy.test.tsx | 2 +- .../DeployService/AutoDeploy/AutoDeploy.tsx | 36 ++++++++----------- 2 files changed, 16 insertions(+), 22 deletions(-) diff --git a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.test.tsx b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.test.tsx index 93aaf318946f4..97fc6d979408b 100644 --- a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.test.tsx +++ b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.test.tsx @@ -240,7 +240,7 @@ function getMockedContexts() { }; jest - .spyOn(integrationService, 'deployAwsOidcService') + .spyOn(integrationService, 'deployDatabaseServices') .mockResolvedValue('dashboard-url'); jest.spyOn(teleCtx.databaseService, 'fetchDatabases').mockResolvedValue({ diff --git a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx index 48c013f4e7359..51f2137f4f4d1 100644 --- a/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx +++ b/web/packages/teleport/src/Discover/Database/DeployService/AutoDeploy/AutoDeploy.tsx @@ -126,22 +126,24 @@ export function AutoDeploy({ toggleDeployMethod }: DeployServiceProp) { agentMeta.awsIntegration.spec.roleArn ); + const deployment = { + region: dbMeta.awsRegion, + accountId: awsAccountId, + taskRoleArn, + deployments: [ + { + vpcId: dbMeta.awsVpcId, + subnetIds: selectedSubnetIds, + securityGroups: selectedSecurityGroups, + }, + ], + }; + if (wantAutoDiscover) { setAttempt({ status: 'processing' }); integrationService - .deployDatabaseServices(integrationName, { - region: dbMeta.awsRegion, - accountId: awsAccountId, - taskRoleArn, - deployments: [ - { - vpcId: dbMeta.awsVpcId, - subnetIds: selectedSubnetIds, - securityGroups: selectedSecurityGroups, - }, - ], - }) + .deployDatabaseServices(integrationName, deployment) .then(url => { setAttempt({ status: 'success' }); setSvcDeployedAwsUrl(url); @@ -155,15 +157,7 @@ export function AutoDeploy({ toggleDeployMethod }: DeployServiceProp) { } else { setAttempt({ status: 'processing' }); integrationService - .deployAwsOidcService(integrationName, { - deploymentMode: 'database-service', - region: dbMeta.awsRegion, - subnetIds: selectedSubnetIds, - taskRoleArn, - securityGroups: selectedSecurityGroups, - vpcId: dbMeta.awsVpcId, - accountId: awsAccountId, - }) + .deployDatabaseServices(integrationName, deployment) // The user is still technically in the "processing" // state, because after this call succeeds, we will // start pinging for the newly registered db From d391ccc792c35fdf41ff24b425aeb67d4a8db956 Mon Sep 17 00:00:00 2001 From: Przemko Robakowski Date: Wed, 23 Oct 2024 20:19:44 +0200 Subject: [PATCH 34/70] tctl support for DynamicWindowsDesktop (#46988) * Add DynamicWindowsDesktop to proto * Add resource matchers to Windows desktop service config * Implement API and backend for DynamicWindowsDesktop * tctl support for DynamicWindowsDesktop * Fix imports * Remove unused methods * move rpc to separate server * rework api and grpc more towards 153-style * e * remove dynamic windows from paginated resource * add tests * add tests * update client * Update api/proto/teleport/legacy/types/types.proto Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> * lint * gci * cleanup * cleanup * use generic service * cleanup * cleanup * cleanup * cleanup * cleanup * gci * add admin action checks * move service * add service test * add tests * gci * review comments * review comments * review comments * review comments * review comments * review comments --------- Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> --- tool/tctl/common/collection.go | 29 ++++++++ tool/tctl/common/edit_command_test.go | 36 ++++++++++ tool/tctl/common/resource_command.go | 81 +++++++++++++++++++++++ tool/tctl/common/resource_command_test.go | 33 +++++++++ 4 files changed, 179 insertions(+) diff --git a/tool/tctl/common/collection.go b/tool/tctl/common/collection.go index 5719344fe4bd3..1afe9f0c7bca9 100644 --- a/tool/tctl/common/collection.go +++ b/tool/tctl/common/collection.go @@ -866,6 +866,35 @@ func (c *windowsDesktopCollection) writeJSON(w io.Writer) error { return utils.WriteJSONArray(w, c.desktops) } +type dynamicWindowsDesktopCollection struct { + desktops []types.DynamicWindowsDesktop +} + +func (c *dynamicWindowsDesktopCollection) resources() (r []types.Resource) { + r = make([]types.Resource, 0, len(c.desktops)) + for _, resource := range c.desktops { + r = append(r, resource) + } + return r +} + +func (c *dynamicWindowsDesktopCollection) writeText(w io.Writer, verbose bool) error { + var rows [][]string + for _, d := range c.desktops { + labels := common.FormatLabels(d.GetAllLabels(), verbose) + rows = append(rows, []string{d.GetName(), d.GetAddr(), d.GetDomain(), labels}) + } + headers := []string{"Name", "Address", "AD Domain", "Labels"} + var t asciitable.Table + if verbose { + t = asciitable.MakeTable(headers, rows...) + } else { + t = asciitable.MakeTableWithTruncatedColumn(headers, rows, "Labels") + } + _, err := t.AsBuffer().WriteTo(w) + return trace.Wrap(err) +} + type tokenCollection struct { tokens []types.ProvisionToken } diff --git a/tool/tctl/common/edit_command_test.go b/tool/tctl/common/edit_command_test.go index 9ce3a89d7bf85..c0ffbf342a485 100644 --- a/tool/tctl/common/edit_command_test.go +++ b/tool/tctl/common/edit_command_test.go @@ -91,6 +91,10 @@ func TestEditResources(t *testing.T) { kind: types.KindAutoUpdateVersion, edit: testEditAutoUpdateVersion, }, + { + kind: types.KindDynamicWindowsDesktop, + edit: testEditDynamicWindowsDesktop, + }, } for _, test := range tests { @@ -635,3 +639,35 @@ func testEditAutoUpdateVersion(t *testing.T, clt *authclient.Client) { "tools_autoupdate should have been modified by edit") assert.Equal(t, expected.GetSpec().GetTools().GetTargetVersion(), actual.GetSpec().GetTools().GetTargetVersion()) } + +func testEditDynamicWindowsDesktop(t *testing.T, clt *authclient.Client) { + ctx := context.Background() + + expected, err := types.NewDynamicWindowsDesktopV1("test", nil, types.DynamicWindowsDesktopSpecV1{ + Addr: "test", + }) + require.NoError(t, err) + created, err := clt.DynamicDesktopClient().CreateDynamicWindowsDesktop(ctx, expected) + require.NoError(t, err) + + editor := func(name string) error { + f, err := os.Create(name) + if err != nil { + return trace.Wrap(err, "opening file to edit") + } + + expected.SetRevision(created.GetRevision()) + expected.Spec.Addr = "test2" + + collection := &dynamicWindowsDesktopCollection{desktops: []types.DynamicWindowsDesktop{expected}} + return trace.NewAggregate(writeYAML(collection, f), f.Close()) + } + + _, err = runEditCommand(t, clt, []string{"edit", "dynamic_windows_desktop/test"}, withEditor(editor)) + require.NoError(t, err) + + actual, err := clt.DynamicDesktopClient().GetDynamicWindowsDesktop(ctx, expected.GetName()) + require.NoError(t, err) + expected.SetRevision(actual.GetRevision()) + require.Empty(t, cmp.Diff(expected, actual, protocmp.Transform())) +} diff --git a/tool/tctl/common/resource_command.go b/tool/tctl/common/resource_command.go index 7975a80a7298f..dd558e01f7319 100644 --- a/tool/tctl/common/resource_command.go +++ b/tool/tctl/common/resource_command.go @@ -156,6 +156,7 @@ func (rc *ResourceCommand) Initialize(app *kingpin.Application, config *servicec types.KindOktaImportRule: rc.createOktaImportRule, types.KindIntegration: rc.createIntegration, types.KindWindowsDesktop: rc.createWindowsDesktop, + types.KindDynamicWindowsDesktop: rc.createDynamicWindowsDesktop, types.KindAccessList: rc.createAccessList, types.KindDiscoveryConfig: rc.createDiscoveryConfig, types.KindAuditQuery: rc.createAuditQuery, @@ -193,6 +194,7 @@ func (rc *ResourceCommand) Initialize(app *kingpin.Application, config *servicec types.KindUserTask: rc.updateUserTask, types.KindAutoUpdateConfig: rc.updateAutoUpdateConfig, types.KindAutoUpdateVersion: rc.updateAutoUpdateVersion, + types.KindDynamicWindowsDesktop: rc.updateDynamicWindowsDesktop, } rc.config = config @@ -891,6 +893,45 @@ func (rc *ResourceCommand) createWindowsDesktop(ctx context.Context, client *aut return nil } +func (rc *ResourceCommand) createDynamicWindowsDesktop(ctx context.Context, client *authclient.Client, raw services.UnknownResource) error { + wd, err := services.UnmarshalDynamicWindowsDesktop(raw.Raw) + if err != nil { + return trace.Wrap(err) + } + dynamicDesktopClient := client.DynamicDesktopClient() + if _, err := dynamicDesktopClient.CreateDynamicWindowsDesktop(ctx, wd); err != nil { + if trace.IsAlreadyExists(err) { + if !rc.force { + return trace.AlreadyExists("application %q already exists", wd.GetName()) + } + if _, err := dynamicDesktopClient.UpdateDynamicWindowsDesktop(ctx, wd); err != nil { + return trace.Wrap(err) + } + fmt.Printf("dynamic windows desktop %q has been updated\n", wd.GetName()) + return nil + } + return trace.Wrap(err) + } + + fmt.Printf("dynamic windows desktop %q has been updated\n", wd.GetName()) + return nil +} + +func (rc *ResourceCommand) updateDynamicWindowsDesktop(ctx context.Context, client *authclient.Client, raw services.UnknownResource) error { + wd, err := services.UnmarshalDynamicWindowsDesktop(raw.Raw) + if err != nil { + return trace.Wrap(err) + } + + dynamicDesktopClient := client.DynamicDesktopClient() + if _, err := dynamicDesktopClient.UpdateDynamicWindowsDesktop(ctx, wd); err != nil { + return trace.Wrap(err) + } + + fmt.Printf("dynamic windows desktop %q has been updated\n", wd.GetName()) + return nil +} + func (rc *ResourceCommand) createAppServer(ctx context.Context, client *authclient.Client, raw services.UnknownResource) error { appServer, err := services.UnmarshalAppServer(raw.Raw) if err != nil { @@ -1688,6 +1729,11 @@ func (rc *ResourceCommand) Delete(ctx context.Context, client *authclient.Client return trace.Wrap(err) } fmt.Printf("windows desktop service %q has been deleted\n", rc.ref.Name) + case types.KindDynamicWindowsDesktop: + if err = client.DynamicDesktopClient().DeleteDynamicWindowsDesktop(ctx, rc.ref.Name); err != nil { + return trace.Wrap(err) + } + fmt.Printf("dynamic windows desktop %q has been deleted\n", rc.ref.Name) case types.KindWindowsDesktop: desktops, err := client.GetWindowsDesktops(ctx, types.WindowsDesktopFilter{Name: rc.ref.Name}) @@ -2461,6 +2507,41 @@ func (rc *ResourceCommand) getCollection(ctx context.Context, client *authclient return nil, trace.NotFound("Windows desktop %q not found", rc.ref.Name) } return &windowsDesktopCollection{desktops: out}, nil + case types.KindDynamicWindowsDesktop: + dynamicDesktopClient := client.DynamicDesktopClient() + if rc.ref.Name != "" { + desktop, err := dynamicDesktopClient.GetDynamicWindowsDesktop(ctx, rc.ref.Name) + if err != nil { + return nil, trace.Wrap(err) + } + return &dynamicWindowsDesktopCollection{ + desktops: []types.DynamicWindowsDesktop{desktop}, + }, nil + } + + pageToken := "" + desktops := make([]types.DynamicWindowsDesktop, 0, 100) + for { + d, next, err := dynamicDesktopClient.ListDynamicWindowsDesktop(ctx, 100, pageToken) + if err != nil { + return nil, trace.Wrap(err) + } + if rc.ref.Name == "" { + desktops = append(desktops, d...) + } else { + for _, desktop := range desktops { + if desktop.GetName() == rc.ref.Name { + desktops = append(desktops, desktop) + } + } + } + pageToken = next + if next == "" { + break + } + } + + return &dynamicWindowsDesktopCollection{desktops}, nil case types.KindToken: if rc.ref.Name == "" { tokens, err := client.GetTokens(ctx) diff --git a/tool/tctl/common/resource_command_test.go b/tool/tctl/common/resource_command_test.go index dca834a2e6e7f..cd7b8f7fc5de4 100644 --- a/tool/tctl/common/resource_command_test.go +++ b/tool/tctl/common/resource_command_test.go @@ -1419,6 +1419,10 @@ func TestCreateResources(t *testing.T) { kind: types.KindAutoUpdateVersion, create: testCreateAutoUpdateVersion, }, + { + kind: types.KindDynamicWindowsDesktop, + create: testCreateDynamicWindowsDesktop, + }, } for _, test := range tests { @@ -2359,6 +2363,35 @@ version: v1 )) } +func testCreateDynamicWindowsDesktop(t *testing.T, clt *authclient.Client) { + const resourceYAML = `kind: dynamic_windows_desktop +metadata: + name: test + revision: 3a43b44a-201e-4d7f-aef1-ae2f6d9811ed +spec: + addr: test +version: v1 +` + + // Create the resource. + resourceYAMLPath := filepath.Join(t.TempDir(), "resource.yaml") + require.NoError(t, os.WriteFile(resourceYAMLPath, []byte(resourceYAML), 0644)) + _, err := runResourceCommand(t, clt, []string{"create", resourceYAMLPath}) + require.NoError(t, err) + + // Get the resource + buf, err := runResourceCommand(t, clt, []string{"get", types.KindDynamicWindowsDesktop, "--format=json"}) + require.NoError(t, err) + resources := mustDecodeJSON[[]types.DynamicWindowsDesktopV1](t, buf) + require.Len(t, resources, 1) + + var expected types.DynamicWindowsDesktopV1 + require.NoError(t, yaml.Unmarshal([]byte(resourceYAML), &expected)) + expected.SetRevision(resources[0].GetRevision()) + + require.Empty(t, cmp.Diff([]types.DynamicWindowsDesktopV1{expected}, resources, protocmp.Transform())) +} + func TestPluginResourceWrapper(t *testing.T) { tests := []struct { name string From 7a9f3de56928b9a9842f17cc77f883678de0f03e Mon Sep 17 00:00:00 2001 From: Sakshyam Shah Date: Wed, 23 Oct 2024 14:28:23 -0400 Subject: [PATCH 35/70] aws identity center plugin config dependency (#47844) * update PluginAWSICSettings proto message: - add access_list_default_owners - add saml_idp_service_provider_name * identity center plugin deps * add OriginAWSIdentityCenter commentary --- api/types/common/constants.go | 6 ++++++ api/types/plugin.go | 3 +++ api/types/saml_idp_service_provider.go | 2 +- api/types/saml_idp_service_provider_test.go | 9 +++++++++ api/types/samlsp/samlsp.go | 3 +++ 5 files changed, 22 insertions(+), 1 deletion(-) diff --git a/api/types/common/constants.go b/api/types/common/constants.go index 0c9b541e19bbc..431393e706fe8 100644 --- a/api/types/common/constants.go +++ b/api/types/common/constants.go @@ -69,6 +69,11 @@ const ( // OriginEntraID indicates that the resource was imported // from the Entra ID directory. OriginEntraID = "entra-id" + + // OriginAWSIdentityCenter indicates that the resource was + // imported from the AWS Identity Center or created from + // the AWS Identity Center plugin. + OriginAWSIdentityCenter = "aws-identity-center" ) // OriginValues lists all possible origin values. @@ -82,4 +87,5 @@ var OriginValues = []string{ OriginSCIM, OriginDiscoveryKubernetes, OriginEntraID, + OriginAWSIdentityCenter, } diff --git a/api/types/plugin.go b/api/types/plugin.go index 2645c7b39f0d7..c598856960bfa 100644 --- a/api/types/plugin.go +++ b/api/types/plugin.go @@ -42,6 +42,7 @@ var AllPluginTypes = []PluginType{ PluginTypeEntraID, PluginTypeSCIM, PluginTypeDatadog, + PluginTypeAWSIdentityCenter, } const ( @@ -75,6 +76,8 @@ const ( PluginTypeSCIM = "scim" // PluginTypeDatadog indicates the Datadog Incident Management plugin PluginTypeDatadog = "datadog" + // PluginTypeAWSIdentityCenter indicates AWS Identity Center plugin + PluginTypeAWSIdentityCenter = "aws-identity-center" ) // PluginSubkind represents the type of the plugin, e.g., access request, MDM etc. diff --git a/api/types/saml_idp_service_provider.go b/api/types/saml_idp_service_provider.go index 0a274e0fec54c..f04a7434585a2 100644 --- a/api/types/saml_idp_service_provider.go +++ b/api/types/saml_idp_service_provider.go @@ -387,7 +387,7 @@ func (am *SAMLAttributeMapping) CheckAndSetDefaults() error { // preset can be either empty or one of the supported type. func (s *SAMLIdPServiceProviderV1) checkAndSetPresetDefaults(preset string) bool { switch preset { - case "", samlsp.Unspecified: + case "", samlsp.Unspecified, samlsp.AWSIdentityCenter: return true case samlsp.GCPWorkforce: if s.GetRelayState() == "" { diff --git a/api/types/saml_idp_service_provider_test.go b/api/types/saml_idp_service_provider_test.go index 1b00aeebd78da..dd70d78b9e971 100644 --- a/api/types/saml_idp_service_provider_test.go +++ b/api/types/saml_idp_service_provider_test.go @@ -196,6 +196,15 @@ func TestNewSAMLIdPServiceProvider(t *testing.T) { errAssertion: require.NoError, preset: samlsp.Unspecified, }, + { + name: "aws-identity-center preset", + entityDescriptor: "", + entityID: "IAMShowcase", + acsURL: acsURL, + expectedEntityID: "IAMShowcase", + errAssertion: require.NoError, + preset: samlsp.AWSIdentityCenter, + }, { name: "unsupported preset value", entityDescriptor: "", diff --git a/api/types/samlsp/samlsp.go b/api/types/samlsp/samlsp.go index fa552cc75c00f..1a94cc81c49d2 100644 --- a/api/types/samlsp/samlsp.go +++ b/api/types/samlsp/samlsp.go @@ -23,6 +23,9 @@ const ( // Unspecified preset type is used in the Web UI to denote a generic SAML service // provider preset. Unspecified = "unspecified" + // AWSIdentityCenter is a SAML service provider preset name for AWS + // Identity Center. + AWSIdentityCenter = "aws-identity-center" ) const ( From 67de9ce55527a24536d1dba0acf6487ad0650789 Mon Sep 17 00:00:00 2001 From: Paul Gottschling Date: Wed, 23 Oct 2024 15:10:15 -0400 Subject: [PATCH 36/70] Edit the docs release plan (#47814) Add an item to ensure that redirects only exist in the default version of the docs. This is the version that we use to build the site map, and links from the product and other Teleport sites only refer to unversioned `/docs/` paths. --- .github/ISSUE_TEMPLATE/test-plan-docs.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/.github/ISSUE_TEMPLATE/test-plan-docs.md b/.github/ISSUE_TEMPLATE/test-plan-docs.md index 604ca810153db..e31d0b73cfd51 100644 --- a/.github/ISSUE_TEMPLATE/test-plan-docs.md +++ b/.github/ISSUE_TEMPLATE/test-plan-docs.md @@ -36,11 +36,15 @@ to determine the rollout date. git submodule add https://github.com/gravitational/teleport content/.x ``` -## Is the docs site up to date with the new release? +## Is the docs site content up to date with the new release? - [ ] Verify that Teleport version variables are correct and reflect the upcoming release. Check `docs/config.json` for this. +- [ ] Ensure that redirects (as configured in `docs/config.json`) only exist for + the default version of the docs site, and have been removed from other + versions. + - [ ] Remove version warnings in the docs that mention a version we no longer support _except_ for the last EOL version. E.g., if we no longer support version 10, remove messages saying "You need at least version n to use this From c1c1427b67e4833d67d6af7309a8b5f990c8ef6a Mon Sep 17 00:00:00 2001 From: rosstimothy <39066650+rosstimothy@users.noreply.github.com> Date: Wed, 23 Oct 2024 19:21:31 +0000 Subject: [PATCH 37/70] Add tsh command to resolve a single host (#47689) `tsh resolve` allows identifying a single host either directly by hostname, or via custom search/predicate expression from a matched proxy template. The main use case is to provide a simple command for users that wish to use `Match exec` in their SSH config. Today, all matching in SSH config must be done via DNS and requires users to add some Teleport specific suffix/prefix, or use a wildcard entry to invoke a tsh proxy command. For example, the SSH config generated today via `tsh config` is the following: ``` # Common flags for all local.dev hosts Host *.cluster-name proxy.example.com UserKnownHostsFile "/Users/tim/.tsh/known_hosts" IdentityFile "/Users/tim/.tsh/keys/proxy.example.com/tim" CertificateFile "/Users/tim/.tsh/keys/proxy.example.com/tim-ssh/cluster-name-cert.pub" # Flags for all local.dev hosts except the proxy Host *.cluster-name Port 3022 !proxy.example.com ProxyCommand "tsh" proxy ssh --cluster=cluster-name --proxy=proxy.example.com:443 %r@%h:%p ``` This allows connections to the Teleport SSH service without using tsh directly via `ssh foo.cluster-name`. However, when migrating to Teleport, that requires the user to alter their existing workflow to include the cluster-name suffix. To remedy this, users can now augment their SSH config to utilize `Match exec` instead of globbing on the cluster name suffix with the following: ``` Match exec "tsh resolve -q %h" ProxyCommand "tsh" proxy ssh --cluster=cluster-name --proxy=proxy.example.com:443 %r@%h:%p ``` By default tsh resolve will output the matching host, if one was found, but if the `-q` flag provided like in the example above the output will be silenced. If no matches are found, or multiple matches are found, `tsh resolve` will exit with a non-zero exit code as per the `Match exec` requirements. If and only if a single host is resolved will `tsh resolve` exit with a zero exit code. There are performance concerns that need to be taken into account before users adopt this in their SSH config. First, this may cause `tsh resolve` to be invoked on any SSH request. For example, even doing git pull/git push may now first require `tsh resolve` to exit with a non-zero exit code before interact with the git remote. Additionally, when `tsh resolve` finds a match, any connections to the node will require _two_ connections to the cluster and _two_ ListUnifiedResourcesRequests to resolve the host since the invocation of `tsh resolve` and `tsh proxy ssh` or `tbot proxy ssh` do not share any resources. For the reasons mentioned above, the SSH configuration generated by `tsh config` was not updated to include this new command. If users want to opt into this behavior they must acknowledge the latency concerns by manually editting the config. --- tool/tsh/common/tsh.go | 106 ++++++++++++++++++++ tool/tsh/common/tsh_test.go | 191 ++++++++++++++++++++++++++++++++++++ 2 files changed, 297 insertions(+) diff --git a/tool/tsh/common/tsh.go b/tool/tsh/common/tsh.go index b02091d75a8a1..d7573c092a9d2 100644 --- a/tool/tsh/common/tsh.go +++ b/tool/tsh/common/tsh.go @@ -802,6 +802,11 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { ssh.Flag("no-resume", "Disable SSH connection resumption").Envar(noResumeEnvVar).BoolVar(&cf.DisableSSHResumption) ssh.Flag("relogin", "Permit performing an authentication attempt on a failed command").Default("true").BoolVar(&cf.Relogin) + resolve := app.Command("resolve", "Resolves an SSH host.") + resolve.Arg("host", "Remote hostname to resolve").Required().StringVar(&cf.UserHost) + resolve.Flag("quiet", "Quiet mode").Short('q').BoolVar(&cf.Quiet) + resolve.Flag("format", defaults.FormatFlagDescription(defaults.DefaultFormats...)).Short('f').Default(teleport.Text).EnumVar(&cf.Format, defaults.DefaultFormats...) + // Daemon service for teleterm client daemon := app.Command("daemon", "Daemon is the tsh daemon service.").Hidden() daemonStart := daemon.Command("start", "Starts tsh daemon service.").Hidden() @@ -1361,6 +1366,18 @@ func Run(ctx context.Context, args []string, opts ...CliOption) error { err = onVersion(&cf) case ssh.FullCommand(): err = onSSH(&cf) + case resolve.FullCommand(): + err = onResolve(&cf) + // If quiet was specified for this command and + // an error occurred, exit with a non-zero exit + // code without emitting any other messaging. + // In this case, the command was likely invoked + // via a Match exec block from an SSH config and + // if no matches were found, we should not add + // additional spam to stderr. + if err != nil && cf.Quiet { + err = trace.Wrap(&common.ExitCodeError{Code: 1}) + } case latencySSH.FullCommand(): err = onSSHLatency(&cf) case benchSSH.FullCommand(): @@ -3595,6 +3612,95 @@ func runLocalCommand(hostLogin string, command []string) error { return cmd.Run() } +// onResolve executes `tsh resolve`, a command that +// attempts to resolve a single host from a provided +// hostname. The host information provided may be +// interpolated by proxy templates and converted +// from a hostname into a fuzzy search, or predicate query. +// Errors are returned if unable to connect to the cluster, +// no matching hosts were found, or multiple matching hosts +// were found. This is primarily meant to be used as a command +// for a match exec block in an SSH config. +func onResolve(cf *CLIConf) error { + tc, err := makeClient(cf) + if err != nil { + return trace.Wrap(err) + } + + req := proto.ListUnifiedResourcesRequest{ + Kinds: []string{types.KindNode}, + Labels: tc.Labels, + SearchKeywords: tc.SearchKeywords, + PredicateExpression: tc.PredicateExpression, + UseSearchAsRoles: tc.UseSearchAsRoles, + SortBy: types.SortBy{Field: types.ResourceKind}, + // Limit to 2 so we can check for an ambiguous result + Limit: 2, + } + + // If no search criteria were explicitly provided, then match exclusively + // on the hostname of the server. Otherwise, this would end up listing + // the first two servers that the user has access to and yield unexpected results. + if len(tc.Labels) == 0 && len(tc.SearchKeywords) == 0 && tc.PredicateExpression == "" { + req.PredicateExpression = fmt.Sprintf(`name == "%s"`, tc.Host) + } + + // Only enable the re-authentication behavior if not invoked with `-q`. When + // in quiet mode, this command is likely being invoked via ssh and + // the login prompt will not be able to be presented to users anyway. + executor := client.RetryWithRelogin + if cf.Quiet { + executor = func(ctx context.Context, teleportClient *client.TeleportClient, f func() error, option ...client.RetryWithReloginOption) error { + return f() + } + } + + var page []*types.EnrichedResource + if err := executor(cf.Context, tc, func() error { + clt, err := tc.ConnectToCluster(cf.Context) + if err != nil { + return trace.Wrap(err) + } + + defer clt.Close() + + page, _, err = apiclient.GetUnifiedResourcePage(cf.Context, clt.AuthClient, &req) + if err != nil { + return trace.Wrap(err) + } + + return nil + }); err != nil { + return trace.Wrap(err) + } + + switch len(page) { + case 1: + case 0: + return trace.NotFound("no matching hosts found") + default: + return trace.BadParameter("multiple matching hosts found") + } + + if cf.Quiet { + return nil + } + + format := strings.ToLower(cf.Format) + switch format { + case teleport.Text, "": + printNodesAsText(cf.Stdout(), []types.Server{page[0].ResourceWithLabels.(types.Server)}, true) + case teleport.JSON: + utils.WriteJSON(cf.Stdout(), page[0].ResourceWithLabels) + case teleport.YAML: + utils.WriteYAML(cf.Stdout(), page[0].ResourceWithLabels) + default: + return trace.BadParameter("unsupported format %q", cf.Format) + } + + return nil +} + // onSSH executes 'tsh ssh' command func onSSH(cf *CLIConf) error { tc, err := makeClient(cf) diff --git a/tool/tsh/common/tsh_test.go b/tool/tsh/common/tsh_test.go index 0cc5e07fc9aab..e7662c5dd03ec 100644 --- a/tool/tsh/common/tsh_test.go +++ b/tool/tsh/common/tsh_test.go @@ -4012,6 +4012,25 @@ func setCopyStdout(stdout io.Writer) CliOption { func setHomePath(path string) CliOption { return func(cf *CLIConf) error { cf.HomePath = path + // The TSHConfig is populated prior to applying any options, and + // if the home directory is being overridden, then any proxy templates + // and aliases that may have been loaded from the default home directory + // should be returned to default to avoid altering tests run from machines + // that may have a tsh config file present in the home directory. + cf.TSHConfig = client.TSHConfig{} + return nil + } +} + +func setTSHConfig(cfg client.TSHConfig) CliOption { + return func(cf *CLIConf) error { + for _, template := range cfg.ProxyTemplates { + if err := template.Check(); err != nil { + return err + } + } + + cf.TSHConfig = cfg return nil } } @@ -6527,3 +6546,175 @@ func TestRolesToString(t *testing.T) { }) } } + +// TestResolve tests that host resolution works for various inputs and +// that proxy templates are respected. +func TestResolve(t *testing.T) { + modules.SetTestModules(t, &modules.TestModules{TestBuildType: modules.BuildEnterprise}) + ctx, cancel := context.WithCancel(context.Background()) + defer cancel() + + accessRoleName := "access" + sshHostname := "test-ssh-server" + + accessUser, err := types.NewUser(accessRoleName) + require.NoError(t, err) + accessUser.SetRoles([]string{accessRoleName}) + + user, err := user.Current() + require.NoError(t, err) + accessUser.SetLogins([]string{user.Username}) + + traits := map[string][]string{ + constants.TraitLogins: {user.Username}, + } + accessUser.SetTraits(traits) + + connector := mockConnector(t) + rootServerOpts := []testserver.TestServerOptFunc{ + testserver.WithBootstrap(connector, accessUser), + testserver.WithHostname(sshHostname), + testserver.WithClusterName(t, "root"), + testserver.WithSSHPublicAddrs("127.0.0.1:0"), + testserver.WithConfig(func(cfg *servicecfg.Config) { + cfg.SSH.Enabled = true + cfg.SSH.PublicAddrs = []utils.NetAddr{cfg.SSH.Addr} + cfg.SSH.DisableCreateHostUser = true + cfg.SSH.Labels = map[string]string{ + "animal": "llama", + "env": "dev", + } + }), + } + rootServer := testserver.MakeTestServer(t, rootServerOpts...) + + node := testserver.MakeTestServer(t, + testserver.WithConfig(func(cfg *servicecfg.Config) { + cfg.SetAuthServerAddresses(rootServer.Config.AuthServerAddresses()) + cfg.Hostname = "second-node" + cfg.Auth.Enabled = false + cfg.Proxy.Enabled = false + cfg.SSH.Enabled = true + cfg.SSH.DisableCreateHostUser = true + cfg.SSH.Labels = map[string]string{ + "animal": "shark", + "env": "dev", + } + })) + + rootProxyAddr, err := rootServer.ProxyWebAddr() + require.NoError(t, err) + + require.EventuallyWithT(t, func(t *assert.CollectT) { + found, err := rootServer.GetAuthServer().GetNodes(ctx, apidefaults.Namespace) + if !assert.NoError(t, err) || !assert.Len(t, found, 2) { + return + } + }, 10*time.Second, 100*time.Millisecond) + + tmpHomePath := t.TempDir() + rootAuth := rootServer.GetAuthServer() + + err = Run(ctx, []string{ + "login", + "--insecure", + "--proxy", rootProxyAddr.String(), + "--user", user.Username, + }, setHomePath(tmpHomePath), setMockSSOLogin(rootAuth, accessUser, connector.GetName())) + require.NoError(t, err) + + tests := []struct { + name string + hostname string + quiet bool + assertion require.ErrorAssertionFunc + }{ + { + name: "resolved without using templates", + hostname: sshHostname, + assertion: require.NoError, + }, + { + name: "resolved via predicate from template", + hostname: "2.3.4.5", + assertion: require.NoError, + }, + { + name: "resolved via search from template", + hostname: "llama.example.com:3023", + assertion: require.NoError, + }, + { + name: "no matching host", + hostname: "asdf", + assertion: func(tt require.TestingT, err error, i ...interface{}) { + require.Error(tt, err, i...) + require.ErrorContains(tt, err, "no matching hosts", i...) + }, + }, + { + name: "quiet prevents output", + hostname: node.Config.Hostname, + quiet: true, + assertion: require.NoError, + }, + { + name: "multiple matching hosts", + hostname: "dev.example.com", + assertion: func(tt require.TestingT, err error, i ...interface{}) { + require.Error(tt, err, i...) + require.ErrorContains(tt, err, "multiple matching hosts", i...) + }, + }, + } + + for _, test := range tests { + test := test + ctx := context.Background() + t.Run(test.name, func(t *testing.T) { + t.Parallel() + + stdout := &output{buf: bytes.Buffer{}} + stderr := &output{buf: bytes.Buffer{}} + + args := []string{"resolve"} + if test.quiet { + args = append(args, "-q") + } + args = append(args, test.hostname) + + err := Run(ctx, args, + setHomePath(tmpHomePath), + setTSHConfig(client.TSHConfig{ + ProxyTemplates: client.ProxyTemplates{ + { + Template: `^([0-9\.]+):\d+$`, + Query: `labels["animal"] == "llama"`, + }, + { + Template: `^(.*).example.com:\d+$`, + Search: "$1", + }, + }, + }), + func(conf *CLIConf) error { + conf.overrideStdin = &bytes.Buffer{} + conf.OverrideStdout = stdout + conf.overrideStderr = stderr + return nil + }, + ) + + test.assertion(t, err) + if err != nil { + return + } + + if test.quiet { + require.Empty(t, stdout.String()) + } else { + require.Contains(t, stdout.String(), sshHostname) + } + }) + } +} From 795337f8142fdfdfcfb7720c4bd7476a988b5f72 Mon Sep 17 00:00:00 2001 From: Steven Martin Date: Wed, 23 Oct 2024 15:32:21 -0400 Subject: [PATCH 38/70] docs: remove deny in impersonation (#47847) --- .../access-controls/guides/impersonation.mdx | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/docs/pages/admin-guides/access-controls/guides/impersonation.mdx b/docs/pages/admin-guides/access-controls/guides/impersonation.mdx index 2896bbdfb5444..8916069032136 100644 --- a/docs/pages/admin-guides/access-controls/guides/impersonation.mdx +++ b/docs/pages/admin-guides/access-controls/guides/impersonation.mdx @@ -86,11 +86,6 @@ spec: users: ['jenkins'] roles: ['jenkins'] - # The deny section uses the identical format as the 'allow' section. - # The deny rules always override allow rules. - deny: - node_labels: - '*': '*' ``` Create the `role` resource: @@ -207,12 +202,6 @@ spec: where: > equals(impersonate_role.metadata.labels["group"], "security") && equals(impersonate_user.metadata.labels["group"], "security") - - # The deny section uses the identical format as the 'allow' section. - # The deny rules always override allow rules. - deny: - node_labels: - '*': '*' ``` Create the resources: @@ -285,12 +274,6 @@ spec: where: > contains(user.spec.traits["group"], impersonate_role.metadata.labels["group"]) && contains(user.spec.traits["group"], impersonate_user.metadata.labels["group"]) - - # The deny section uses the identical format as the 'allow' section. - # The deny rules always override allow rules. - deny: - node_labels: - '*': '*' ``` While user traits typically come from an external identity provider, we can test From f651ab19cd70b93ac8f7f020db8983e2425aa9c7 Mon Sep 17 00:00:00 2001 From: Przemko Robakowski Date: Wed, 23 Oct 2024 22:33:58 +0200 Subject: [PATCH 39/70] Create WindowsDesktops for matching DynamicWindowsDesktops (#46991) * Add DynamicWindowsDesktop to proto * Add resource matchers to Windows desktop service config * Implement API and backend for DynamicWindowsDesktop * Cache and watcher support for DynamicWindowsDesktop * Create WindowsDesktops for matching DynamicWindowsDesktops * Fix imports * fix test * lint * review comments * move rpc to separate server * rework api and grpc more towards 153-style * e * remove dynamic windows from paginated resource * add tests * add tests * Update api/proto/teleport/legacy/types/types.proto Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> * lint * gci * cleanup * cleanup * use generic service * cleanup * cleanup * cleanup * cleanup * cleanup * gci * rework cache * rework cache * add admin action checks * move service * add service test * gci * update discovery * add discovery test * review comments * review comments * review comments * update interfaces * gci * gci * review comments * review comments * fix loggers * fix tctl --------- Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> --- api/client/dynamicwindows/dynamicwindows.go | 2 +- lib/auth/authclient/clt.go | 3 + lib/srv/desktop/discovery.go | 90 +++++++++++++ lib/srv/desktop/discovery_test.go | 133 ++++++++++++++++++++ lib/srv/desktop/windows_server.go | 4 + tool/tctl/common/resource_command.go | 2 +- 6 files changed, 232 insertions(+), 2 deletions(-) diff --git a/api/client/dynamicwindows/dynamicwindows.go b/api/client/dynamicwindows/dynamicwindows.go index 6c158a39e4243..32ba1762f1aed 100644 --- a/api/client/dynamicwindows/dynamicwindows.go +++ b/api/client/dynamicwindows/dynamicwindows.go @@ -46,7 +46,7 @@ func (c *Client) GetDynamicWindowsDesktop(ctx context.Context, name string) (typ return desktop, trace.Wrap(err) } -func (c *Client) ListDynamicWindowsDesktop(ctx context.Context, pageSize int, pageToken string) ([]types.DynamicWindowsDesktop, string, error) { +func (c *Client) ListDynamicWindowsDesktops(ctx context.Context, pageSize int, pageToken string) ([]types.DynamicWindowsDesktop, string, error) { resp, err := c.grpcClient.ListDynamicWindowsDesktops(ctx, &dynamicwindows.ListDynamicWindowsDesktopsRequest{ PageSize: int32(pageSize), PageToken: pageToken, diff --git a/lib/auth/authclient/clt.go b/lib/auth/authclient/clt.go index 005a44cdda8a1..4d3bdabd846b7 100644 --- a/lib/auth/authclient/clt.go +++ b/lib/auth/authclient/clt.go @@ -33,6 +33,7 @@ import ( "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/crownjewel" "github.com/gravitational/teleport/api/client/databaseobject" + "github.com/gravitational/teleport/api/client/dynamicwindows" "github.com/gravitational/teleport/api/client/externalauditstorage" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/client/secreport" @@ -1600,6 +1601,8 @@ type ClientI interface { types.WebSessionsGetter types.WebTokensGetter + DynamicDesktopClient() *dynamicwindows.Client + // TrustClient returns a client to the Trust service. TrustClient() trustpb.TrustServiceClient diff --git a/lib/srv/desktop/discovery.go b/lib/srv/desktop/discovery.go index cc7dd71daa6d2..c44bcc0a9cabb 100644 --- a/lib/srv/desktop/discovery.go +++ b/lib/srv/desktop/discovery.go @@ -24,6 +24,7 @@ import ( "errors" "fmt" "log/slog" + "maps" "net" "net/netip" "strings" @@ -32,6 +33,7 @@ import ( "github.com/go-ldap/ldap/v3" "github.com/gravitational/trace" + "github.com/gravitational/teleport" apidefaults "github.com/gravitational/teleport/api/defaults" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/auth/windows" @@ -306,3 +308,91 @@ func (s *WindowsService) ldapEntryToWindowsDesktop(ctx context.Context, entry *l desktop.SetExpiry(s.cfg.Clock.Now().UTC().Add(apidefaults.ServerAnnounceTTL * 3)) return desktop, nil } + +// startDynamicReconciler starts resource watcher and reconciler that registers/unregisters Windows desktops +// according to the up-to-date list of dynamic Windows desktops resources. +func (s *WindowsService) startDynamicReconciler(ctx context.Context) (*services.DynamicWindowsDesktopWatcher, error) { + if len(s.cfg.ResourceMatchers) == 0 { + s.cfg.Logger.DebugContext(ctx, "Not starting dynamic desktop resource watcher.") + return nil, nil + } + s.cfg.Logger.DebugContext(ctx, "Starting dynamic desktop resource watcher.") + dynamicDesktopClient := s.cfg.AuthClient.DynamicDesktopClient() + watcher, err := services.NewDynamicWindowsDesktopWatcher(ctx, services.DynamicWindowsDesktopWatcherConfig{ + DynamicWindowsDesktopGetter: dynamicDesktopClient, + ResourceWatcherConfig: services.ResourceWatcherConfig{ + Component: teleport.ComponentWindowsDesktop, + Client: s.cfg.AccessPoint, + }, + }) + if err != nil { + return nil, trace.Wrap(err) + } + + currentResources := make(map[string]types.WindowsDesktop) + var newResources map[string]types.WindowsDesktop + + reconciler, err := services.NewReconciler(services.ReconcilerConfig[types.WindowsDesktop]{ + Matcher: func(desktop types.WindowsDesktop) bool { + return services.MatchResourceLabels(s.cfg.ResourceMatchers, desktop.GetAllLabels()) + }, + GetCurrentResources: func() map[string]types.WindowsDesktop { + return currentResources + }, + GetNewResources: func() map[string]types.WindowsDesktop { + return newResources + }, + OnCreate: s.upsertDesktop, + OnUpdate: s.updateDesktop, + OnDelete: s.deleteDesktop, + }) + if err != nil { + return nil, trace.Wrap(err) + } + go func() { + defer s.cfg.Logger.DebugContext(ctx, "DynamicWindowsDesktop resource watcher done.") + defer watcher.Close() + for { + select { + case desktops := <-watcher.DynamicWindowsDesktopsC: + newResources = make(map[string]types.WindowsDesktop) + for _, dynamicDesktop := range desktops { + desktop, err := s.toWindowsDesktop(dynamicDesktop) + if err != nil { + s.cfg.Logger.WarnContext(ctx, "Can't create desktop resource", "error", err) + continue + } + newResources[dynamicDesktop.GetName()] = desktop + } + if err := reconciler.Reconcile(ctx); err != nil { + s.cfg.Logger.WarnContext(ctx, "Reconciliation failed, will retry", "error", err) + continue + } + currentResources = newResources + case <-watcher.Done(): + return + case <-ctx.Done(): + return + } + } + }() + return watcher, nil +} + +func (s *WindowsService) toWindowsDesktop(dynamicDesktop types.DynamicWindowsDesktop) (*types.WindowsDesktopV3, error) { + width, height := dynamicDesktop.GetScreenSize() + desktopLabels := dynamicDesktop.GetAllLabels() + labels := make(map[string]string, len(desktopLabels)+1) + maps.Copy(labels, desktopLabels) + labels[types.OriginLabel] = types.OriginDynamic + return types.NewWindowsDesktopV3(dynamicDesktop.GetName(), labels, types.WindowsDesktopSpecV3{ + Addr: dynamicDesktop.GetAddr(), + Domain: dynamicDesktop.GetDomain(), + HostID: s.cfg.Heartbeat.HostUUID, + NonAD: dynamicDesktop.NonAD(), + ScreenSize: &types.Resolution{ + Width: width, + Height: height, + }, + }) +} diff --git a/lib/srv/desktop/discovery_test.go b/lib/srv/desktop/discovery_test.go index 2a35918d264b4..fc188f75ce1d6 100644 --- a/lib/srv/desktop/discovery_test.go +++ b/lib/srv/desktop/discovery_test.go @@ -33,7 +33,9 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/auth" "github.com/gravitational/teleport/lib/auth/windows" + "github.com/gravitational/teleport/lib/services" logutils "github.com/gravitational/teleport/lib/utils/log" ) @@ -169,3 +171,134 @@ func TestDNSErrors(t *testing.T) { require.Less(t, time.Since(start), dnsQueryTimeout-1*time.Second) require.Error(t, err) } + +func TestDynamicWindowsDiscovery(t *testing.T) { + t.Parallel() + authServer, err := auth.NewTestAuthServer(auth.TestAuthServerConfig{ + ClusterName: "test", + Dir: t.TempDir(), + }) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, authServer.Close()) + }) + + tlsServer, err := authServer.NewTestTLSServer() + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, tlsServer.Close()) + }) + + client, err := tlsServer.NewClient(auth.TestServerID(types.RoleWindowsDesktop, "test-host-id")) + require.NoError(t, err) + t.Cleanup(func() { + require.NoError(t, client.Close()) + }) + + dynamicWindowsClient := client.DynamicDesktopClient() + + ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second) + defer cancel() + + for _, testCase := range []struct { + name string + labels map[string]string + expected int + }{ + { + name: "no labels", + expected: 0, + }, + { + name: "no matching labels", + labels: map[string]string{"xyz": "abc"}, + expected: 0, + }, + { + name: "matching labels", + labels: map[string]string{"foo": "bar"}, + expected: 1, + }, + { + name: "matching wildcard labels", + labels: map[string]string{"abc": "abc"}, + expected: 1, + }, + } { + t.Run(testCase.name, func(t *testing.T) { + s := &WindowsService{ + cfg: WindowsServiceConfig{ + Heartbeat: HeartbeatConfig{ + HostUUID: "1234", + }, + Logger: slog.New(logutils.NewSlogTextHandler(io.Discard, logutils.SlogTextHandlerConfig{})), + Clock: clockwork.NewFakeClock(), + AuthClient: client, + AccessPoint: client, + ResourceMatchers: []services.ResourceMatcher{{ + Labels: types.Labels{ + "foo": {"bar"}, + }, + }, { + Labels: types.Labels{ + "abc": {"*"}, + }, + }}, + }, + dnsResolver: &net.Resolver{ + PreferGo: true, + Dial: func(ctx context.Context, network, address string) (net.Conn, error) { + return nil, errors.New("this resolver always fails") + }, + }, + } + reconciler, err := s.startDynamicReconciler(ctx) + require.NoError(t, err) + t.Cleanup(func() { + reconciler.Close() + require.NoError(t, authServer.AuthServer.DeleteAllWindowsDesktops(ctx)) + require.NoError(t, authServer.AuthServer.DeleteAllDynamicWindowsDesktops(ctx)) + }) + + desktop, err := types.NewDynamicWindowsDesktopV1("test", testCase.labels, types.DynamicWindowsDesktopSpecV1{ + Addr: "addr", + }) + require.NoError(t, err) + + _, err = dynamicWindowsClient.CreateDynamicWindowsDesktop(ctx, desktop) + require.NoError(t, err) + + time.Sleep(10 * time.Millisecond) + + desktops, err := client.GetWindowsDesktops(ctx, types.WindowsDesktopFilter{}) + require.NoError(t, err) + require.Len(t, desktops, testCase.expected) + if testCase.expected > 0 { + require.Equal(t, desktop.GetName(), desktops[0].GetName()) + require.Equal(t, desktop.GetAddr(), desktops[0].GetAddr()) + } + + desktop.Spec.Addr = "addr2" + _, err = dynamicWindowsClient.UpdateDynamicWindowsDesktop(ctx, desktop) + require.NoError(t, err) + + time.Sleep(10 * time.Millisecond) + desktops, err = client.GetWindowsDesktops(ctx, types.WindowsDesktopFilter{}) + require.NoError(t, err) + require.Len(t, desktops, testCase.expected) + if testCase.expected > 0 { + require.Equal(t, desktop.GetName(), desktops[0].GetName()) + require.Equal(t, desktop.GetAddr(), desktops[0].GetAddr()) + } + + require.NoError(t, dynamicWindowsClient.DeleteDynamicWindowsDesktop(ctx, "test")) + + time.Sleep(10 * time.Millisecond) + + desktops, err = client.GetWindowsDesktops(ctx, types.WindowsDesktopFilter{}) + require.NoError(t, err) + require.Empty(t, desktops) + }) + + } +} diff --git a/lib/srv/desktop/windows_server.go b/lib/srv/desktop/windows_server.go index 28aaee2a48483..791f477861666 100644 --- a/lib/srv/desktop/windows_server.go +++ b/lib/srv/desktop/windows_server.go @@ -411,6 +411,10 @@ func NewWindowsService(cfg WindowsServiceConfig) (*WindowsService, error) { return nil, trace.Wrap(err) } + if _, err := s.startDynamicReconciler(ctx); err != nil { + return nil, trace.Wrap(err) + } + if len(s.cfg.DiscoveryBaseDN) > 0 { if err := s.startDesktopDiscovery(); err != nil { return nil, trace.Wrap(err) diff --git a/tool/tctl/common/resource_command.go b/tool/tctl/common/resource_command.go index dd558e01f7319..c37e8805581e6 100644 --- a/tool/tctl/common/resource_command.go +++ b/tool/tctl/common/resource_command.go @@ -2522,7 +2522,7 @@ func (rc *ResourceCommand) getCollection(ctx context.Context, client *authclient pageToken := "" desktops := make([]types.DynamicWindowsDesktop, 0, 100) for { - d, next, err := dynamicDesktopClient.ListDynamicWindowsDesktop(ctx, 100, pageToken) + d, next, err := dynamicDesktopClient.ListDynamicWindowsDesktops(ctx, 100, pageToken) if err != nil { return nil, trace.Wrap(err) } From cca0f1914cf690c9b4e62ca148fa9041eaeacadd Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Wed, 23 Oct 2024 16:59:26 -0400 Subject: [PATCH 40/70] bump e to fix ent builds since #47840 (#47873) --- e | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/e b/e index e4f948c672214..b5db15651a8d4 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit e4f948c6722147398b9abb2fe1075456443c4dde +Subproject commit b5db15651a8d4590601e470d3e86cc3698e011b2 From b1bc41f60e1e2eb153acdec9960d51bda5066cc2 Mon Sep 17 00:00:00 2001 From: "teleport-post-release-automation[bot]" <128860004+teleport-post-release-automation[bot]@users.noreply.github.com> Date: Wed, 23 Oct 2024 22:16:58 +0000 Subject: [PATCH 41/70] [auto] Update AMI IDs for 16.4.6 (#47865) Co-authored-by: GitHub Co-authored-by: Zac Bergquist --- assets/aws/Makefile | 2 +- examples/aws/terraform/AMIS.md | 204 +++++++++--------- .../terraform/ha-autoscale-cluster/README.md | 2 +- .../aws/terraform/starter-cluster/README.md | 2 +- 4 files changed, 105 insertions(+), 105 deletions(-) diff --git a/assets/aws/Makefile b/assets/aws/Makefile index f78a0cdd49186..e65933213f99b 100644 --- a/assets/aws/Makefile +++ b/assets/aws/Makefile @@ -2,7 +2,7 @@ # This must be a _released_ version of Teleport, i.e. one which has binaries # available for download on https://goteleport.com/download # Unreleased versions will fail to build. -TELEPORT_VERSION ?= 16.4.3 +TELEPORT_VERSION ?= 16.4.6 # Teleport UID is the UID of a non-privileged 'teleport' user TELEPORT_UID ?= 1007 diff --git a/examples/aws/terraform/AMIS.md b/examples/aws/terraform/AMIS.md index 1b775003751a4..87ccac2e7b33e 100644 --- a/examples/aws/terraform/AMIS.md +++ b/examples/aws/terraform/AMIS.md @@ -6,116 +6,116 @@ This list is updated when new AMI versions are released. ### OSS ``` -# ap-northeast-1 v16.4.3 arm64 OSS: ami-03a99db2fa775900b -# ap-northeast-1 v16.4.3 x86_64 OSS: ami-068026fd823473990 -# ap-northeast-2 v16.4.3 arm64 OSS: ami-063cb5eff8ee93ae9 -# ap-northeast-2 v16.4.3 x86_64 OSS: ami-0b5b1fd8897ecd033 -# ap-northeast-3 v16.4.3 arm64 OSS: ami-0785a98abf53559f0 -# ap-northeast-3 v16.4.3 x86_64 OSS: ami-034ce21eb596f461d -# ap-south-1 v16.4.3 arm64 OSS: ami-05adbaaa445ab4f3a -# ap-south-1 v16.4.3 x86_64 OSS: ami-04c6a2b4dec6c67c8 -# ap-southeast-1 v16.4.3 arm64 OSS: ami-0858dbe717d962d28 -# ap-southeast-1 v16.4.3 x86_64 OSS: ami-09b59d463eb157e24 -# ap-southeast-2 v16.4.3 arm64 OSS: ami-06e224a773717fd38 -# ap-southeast-2 v16.4.3 x86_64 OSS: ami-022784e5407820ded -# ca-central-1 v16.4.3 arm64 OSS: ami-02c6ed3bc0c9d824e -# ca-central-1 v16.4.3 x86_64 OSS: ami-05bc6e07efc2afffd -# eu-central-1 v16.4.3 arm64 OSS: ami-0af7ec44d5b1f6c92 -# eu-central-1 v16.4.3 x86_64 OSS: ami-03fffa5ced60deb24 -# eu-north-1 v16.4.3 arm64 OSS: ami-0fbf10c3cec893e64 -# eu-north-1 v16.4.3 x86_64 OSS: ami-0dd3359279b92a8ea -# eu-west-1 v16.4.3 arm64 OSS: ami-0b43e18f381fd3ce2 -# eu-west-1 v16.4.3 x86_64 OSS: ami-04bc718116bd8d8ba -# eu-west-2 v16.4.3 arm64 OSS: ami-08b85aee5566b6d38 -# eu-west-2 v16.4.3 x86_64 OSS: ami-08f0d8bdc46fd4e96 -# eu-west-3 v16.4.3 arm64 OSS: ami-0c7c33c805040b4f5 -# eu-west-3 v16.4.3 x86_64 OSS: ami-05f3a559217d578ab -# sa-east-1 v16.4.3 arm64 OSS: ami-04cda1b5f71cf0adf -# sa-east-1 v16.4.3 x86_64 OSS: ami-05a836867a9c59a8e -# us-east-1 v16.4.3 arm64 OSS: ami-0509993561cc232d9 -# us-east-1 v16.4.3 x86_64 OSS: ami-099176631d6e3001f -# us-east-2 v16.4.3 arm64 OSS: ami-05911a676387e6359 -# us-east-2 v16.4.3 x86_64 OSS: ami-0acb2c68a8a6bd47b -# us-west-1 v16.4.3 arm64 OSS: ami-0931a3203ab46db22 -# us-west-1 v16.4.3 x86_64 OSS: ami-015c7af6995403f1c -# us-west-2 v16.4.3 arm64 OSS: ami-08fc0e0bf4374c62b -# us-west-2 v16.4.3 x86_64 OSS: ami-0ebe4df1270296286 +# ap-northeast-1 v16.4.6 arm64 OSS: ami-0307b5460949a2d09 +# ap-northeast-1 v16.4.6 x86_64 OSS: ami-0dfab44a54daa6774 +# ap-northeast-2 v16.4.6 arm64 OSS: ami-0e55fd0db3d73dac8 +# ap-northeast-2 v16.4.6 x86_64 OSS: ami-0b8383b49bc5da0a3 +# ap-northeast-3 v16.4.6 arm64 OSS: ami-028c94128392137d3 +# ap-northeast-3 v16.4.6 x86_64 OSS: ami-0d125ae89b4371a18 +# ap-south-1 v16.4.6 arm64 OSS: ami-044c55ce57c90a643 +# ap-south-1 v16.4.6 x86_64 OSS: ami-0abbfcf08a8e28c0e +# ap-southeast-1 v16.4.6 arm64 OSS: ami-0e49484dca4bb8fb4 +# ap-southeast-1 v16.4.6 x86_64 OSS: ami-0d23cc1ba5cc1ebea +# ap-southeast-2 v16.4.6 arm64 OSS: ami-07ebd854df12f216a +# ap-southeast-2 v16.4.6 x86_64 OSS: ami-0c22e4641198f8bec +# ca-central-1 v16.4.6 arm64 OSS: ami-0c143a08dcf5ca3fd +# ca-central-1 v16.4.6 x86_64 OSS: ami-0c16191afc3fb654a +# eu-central-1 v16.4.6 arm64 OSS: ami-0551d4f5aeede709e +# eu-central-1 v16.4.6 x86_64 OSS: ami-0cd3c4404ebac1b6d +# eu-north-1 v16.4.6 arm64 OSS: ami-001a29d66d3f99d0c +# eu-north-1 v16.4.6 x86_64 OSS: ami-099742a52e0243c12 +# eu-west-1 v16.4.6 arm64 OSS: ami-0f056146565210169 +# eu-west-1 v16.4.6 x86_64 OSS: ami-0bb1098e9061f3286 +# eu-west-2 v16.4.6 arm64 OSS: ami-0c41c8a9e6623cbeb +# eu-west-2 v16.4.6 x86_64 OSS: ami-0ef2785710a394477 +# eu-west-3 v16.4.6 arm64 OSS: ami-01f68dd1652a01299 +# eu-west-3 v16.4.6 x86_64 OSS: ami-062cc20058012a2ac +# sa-east-1 v16.4.6 arm64 OSS: ami-0448cf45899c4109b +# sa-east-1 v16.4.6 x86_64 OSS: ami-00153f4b099207ba6 +# us-east-1 v16.4.6 arm64 OSS: ami-023856580215a2b43 +# us-east-1 v16.4.6 x86_64 OSS: ami-06cc987e0952a0378 +# us-east-2 v16.4.6 arm64 OSS: ami-0291a0a11bdd06c8d +# us-east-2 v16.4.6 x86_64 OSS: ami-05435267916884c4e +# us-west-1 v16.4.6 arm64 OSS: ami-06cf14c2b9bfa2fc3 +# us-west-1 v16.4.6 x86_64 OSS: ami-0646577553c25d2fb +# us-west-2 v16.4.6 arm64 OSS: ami-04b773c97239cdc04 +# us-west-2 v16.4.6 x86_64 OSS: ami-015f89025eb9ab2dd ``` ### Enterprise ``` -# ap-northeast-1 v16.4.3 arm64 Enterprise: ami-0587524cb092763b8 -# ap-northeast-1 v16.4.3 x86_64 Enterprise: ami-03d76c92521d9b178 -# ap-northeast-2 v16.4.3 arm64 Enterprise: ami-087a2c13eb63f133a -# ap-northeast-2 v16.4.3 x86_64 Enterprise: ami-030048fc4753d7456 -# ap-northeast-3 v16.4.3 arm64 Enterprise: ami-0d88ac92fc0f7c1f1 -# ap-northeast-3 v16.4.3 x86_64 Enterprise: ami-02edeee2926921c43 -# ap-south-1 v16.4.3 arm64 Enterprise: ami-0fa8621c5aac4fdd1 -# ap-south-1 v16.4.3 x86_64 Enterprise: ami-09d7e5e25b07aff41 -# ap-southeast-1 v16.4.3 arm64 Enterprise: ami-07a6b4a9e00672cfa -# ap-southeast-1 v16.4.3 x86_64 Enterprise: ami-0cad3b30fd7786746 -# ap-southeast-2 v16.4.3 arm64 Enterprise: ami-0ee80dba1cfc25ddb -# ap-southeast-2 v16.4.3 x86_64 Enterprise: ami-015871b65daf94360 -# ca-central-1 v16.4.3 arm64 Enterprise: ami-0096116bef0c781eb -# ca-central-1 v16.4.3 x86_64 Enterprise: ami-0d4217deec2fa79af -# eu-central-1 v16.4.3 arm64 Enterprise: ami-03d1da8c34a30b131 -# eu-central-1 v16.4.3 x86_64 Enterprise: ami-018d51199ce555b06 -# eu-north-1 v16.4.3 arm64 Enterprise: ami-0186b55009355474e -# eu-north-1 v16.4.3 x86_64 Enterprise: ami-009e80af1651b105a -# eu-west-1 v16.4.3 arm64 Enterprise: ami-035fab6a83d3de6b4 -# eu-west-1 v16.4.3 x86_64 Enterprise: ami-0404e446cd95923d5 -# eu-west-2 v16.4.3 arm64 Enterprise: ami-086099148dcbca910 -# eu-west-2 v16.4.3 x86_64 Enterprise: ami-0cfedd8ec032b41a9 -# eu-west-3 v16.4.3 arm64 Enterprise: ami-0a05a917e47722280 -# eu-west-3 v16.4.3 x86_64 Enterprise: ami-0d670841a9b05347f -# sa-east-1 v16.4.3 arm64 Enterprise: ami-00b649f81437accf3 -# sa-east-1 v16.4.3 x86_64 Enterprise: ami-04a90f47e22ec6b94 -# us-east-1 v16.4.3 arm64 Enterprise: ami-0964d07c4f1970766 -# us-east-1 v16.4.3 x86_64 Enterprise: ami-02a8e3fa00529a543 -# us-east-2 v16.4.3 arm64 Enterprise: ami-0f29f06b24b96c7fb -# us-east-2 v16.4.3 x86_64 Enterprise: ami-012ff8f25038b5e68 -# us-west-1 v16.4.3 arm64 Enterprise: ami-02638c230b9ddeb0f -# us-west-1 v16.4.3 x86_64 Enterprise: ami-0082e714b7e481911 -# us-west-2 v16.4.3 arm64 Enterprise: ami-04fb6f48cbe7ea880 -# us-west-2 v16.4.3 x86_64 Enterprise: ami-01af4cd28ddaaca88 +# ap-northeast-1 v16.4.6 arm64 Enterprise: ami-05f137e5b9201f996 +# ap-northeast-1 v16.4.6 x86_64 Enterprise: ami-03212c4ccbf6eca85 +# ap-northeast-2 v16.4.6 arm64 Enterprise: ami-0924720d520fe8a11 +# ap-northeast-2 v16.4.6 x86_64 Enterprise: ami-0fb3f151c13f316f2 +# ap-northeast-3 v16.4.6 arm64 Enterprise: ami-04d7f1e045968880c +# ap-northeast-3 v16.4.6 x86_64 Enterprise: ami-0a2f75caf6781d4f8 +# ap-south-1 v16.4.6 arm64 Enterprise: ami-0f9d46726c638e2d4 +# ap-south-1 v16.4.6 x86_64 Enterprise: ami-072c1bda7163cd497 +# ap-southeast-1 v16.4.6 arm64 Enterprise: ami-011f33a197bfe7e44 +# ap-southeast-1 v16.4.6 x86_64 Enterprise: ami-0fbc3bdaa3047315e +# ap-southeast-2 v16.4.6 arm64 Enterprise: ami-058180b9c6d8cc471 +# ap-southeast-2 v16.4.6 x86_64 Enterprise: ami-0aa1b5b87840a1156 +# ca-central-1 v16.4.6 arm64 Enterprise: ami-05aadbead2b91af95 +# ca-central-1 v16.4.6 x86_64 Enterprise: ami-0d08f955e2eb4cce2 +# eu-central-1 v16.4.6 arm64 Enterprise: ami-068077fc8087e409c +# eu-central-1 v16.4.6 x86_64 Enterprise: ami-0ec63c9cf4ec58ef1 +# eu-north-1 v16.4.6 arm64 Enterprise: ami-04116b37191302aec +# eu-north-1 v16.4.6 x86_64 Enterprise: ami-0ff60c42661fd7ea6 +# eu-west-1 v16.4.6 arm64 Enterprise: ami-0b8f5a17eeecef1a2 +# eu-west-1 v16.4.6 x86_64 Enterprise: ami-05f6c12ade128ff2f +# eu-west-2 v16.4.6 arm64 Enterprise: ami-0d23fa319e42572c1 +# eu-west-2 v16.4.6 x86_64 Enterprise: ami-0e6fb58e541932cf6 +# eu-west-3 v16.4.6 arm64 Enterprise: ami-0567bafa2392fe6da +# eu-west-3 v16.4.6 x86_64 Enterprise: ami-01e39ed7e04cc3dd6 +# sa-east-1 v16.4.6 arm64 Enterprise: ami-08ba21a1168c24241 +# sa-east-1 v16.4.6 x86_64 Enterprise: ami-0b23038d8ed82c2a3 +# us-east-1 v16.4.6 arm64 Enterprise: ami-0e7d540c0ed15a0cc +# us-east-1 v16.4.6 x86_64 Enterprise: ami-050d0ef0234295033 +# us-east-2 v16.4.6 arm64 Enterprise: ami-0c94bb5cd6d326f4a +# us-east-2 v16.4.6 x86_64 Enterprise: ami-04fa696ef2b274943 +# us-west-1 v16.4.6 arm64 Enterprise: ami-0b43f032b82b354f0 +# us-west-1 v16.4.6 x86_64 Enterprise: ami-0f927c0e8705a2aaa +# us-west-2 v16.4.6 arm64 Enterprise: ami-0379aa56700286ccd +# us-west-2 v16.4.6 x86_64 Enterprise: ami-0606b81e192fa074d ``` ### Enterprise FIPS ``` -# ap-northeast-1 v16.4.3 arm64 Enterprise FIPS: ami-019cf60b62d5a10d7 -# ap-northeast-1 v16.4.3 x86_64 Enterprise FIPS: ami-059f7cfa3b78b78bb -# ap-northeast-2 v16.4.3 arm64 Enterprise FIPS: ami-0686e3978afbe194e -# ap-northeast-2 v16.4.3 x86_64 Enterprise FIPS: ami-09c75e412314e2285 -# ap-northeast-3 v16.4.3 arm64 Enterprise FIPS: ami-0cd8f2c41cf6ab3a6 -# ap-northeast-3 v16.4.3 x86_64 Enterprise FIPS: ami-0d7e615231cb9a07a -# ap-south-1 v16.4.3 arm64 Enterprise FIPS: ami-052410bcc79298775 -# ap-south-1 v16.4.3 x86_64 Enterprise FIPS: ami-0c34957c4e88fc5cb -# ap-southeast-1 v16.4.3 arm64 Enterprise FIPS: ami-009a131295b547ba4 -# ap-southeast-1 v16.4.3 x86_64 Enterprise FIPS: ami-0ae06abb3a918f1b0 -# ap-southeast-2 v16.4.3 arm64 Enterprise FIPS: ami-08c3056bb1b60a845 -# ap-southeast-2 v16.4.3 x86_64 Enterprise FIPS: ami-0406318e9822c396c -# ca-central-1 v16.4.3 arm64 Enterprise FIPS: ami-0a3156111e029549a -# ca-central-1 v16.4.3 x86_64 Enterprise FIPS: ami-0d3c0c6ed2542c23f -# eu-central-1 v16.4.3 arm64 Enterprise FIPS: ami-0f687501df4213855 -# eu-central-1 v16.4.3 x86_64 Enterprise FIPS: ami-065c83aee094e9d84 -# eu-north-1 v16.4.3 arm64 Enterprise FIPS: ami-08ca656487c08696d -# eu-north-1 v16.4.3 x86_64 Enterprise FIPS: ami-0e0458bbd101b2afd -# eu-west-1 v16.4.3 arm64 Enterprise FIPS: ami-038a541f0f3bb079b -# eu-west-1 v16.4.3 x86_64 Enterprise FIPS: ami-0e3895fc4988402eb -# eu-west-2 v16.4.3 arm64 Enterprise FIPS: ami-0d37fd8143a442afb -# eu-west-2 v16.4.3 x86_64 Enterprise FIPS: ami-03e00869abccc5778 -# eu-west-3 v16.4.3 arm64 Enterprise FIPS: ami-07454b7d4f108d56b -# eu-west-3 v16.4.3 x86_64 Enterprise FIPS: ami-0eafe00629a7e0ef0 -# sa-east-1 v16.4.3 arm64 Enterprise FIPS: ami-067f2d87167d38e61 -# sa-east-1 v16.4.3 x86_64 Enterprise FIPS: ami-0f5e7d1cae7105731 -# us-east-1 v16.4.3 arm64 Enterprise FIPS: ami-09af1d781d706b43c -# us-east-1 v16.4.3 x86_64 Enterprise FIPS: ami-0beb13e821cf7c941 -# us-east-2 v16.4.3 arm64 Enterprise FIPS: ami-016941078434174d1 -# us-east-2 v16.4.3 x86_64 Enterprise FIPS: ami-0a49d29be30d77240 -# us-west-1 v16.4.3 arm64 Enterprise FIPS: ami-00e936b6a86e30520 -# us-west-1 v16.4.3 x86_64 Enterprise FIPS: ami-0ae4df0bf4ea14c19 -# us-west-2 v16.4.3 arm64 Enterprise FIPS: ami-005e1ffa94a45bf74 -# us-west-2 v16.4.3 x86_64 Enterprise FIPS: ami-0b1e72b0e4fe47181 +# ap-northeast-1 v16.4.6 arm64 Enterprise FIPS: ami-03222719a3da72577 +# ap-northeast-1 v16.4.6 x86_64 Enterprise FIPS: ami-03b67fc78f15b9cb1 +# ap-northeast-2 v16.4.6 arm64 Enterprise FIPS: ami-07b1142c8d0a97142 +# ap-northeast-2 v16.4.6 x86_64 Enterprise FIPS: ami-0f5200769c8d1d528 +# ap-northeast-3 v16.4.6 arm64 Enterprise FIPS: ami-0c735142ffa7fe311 +# ap-northeast-3 v16.4.6 x86_64 Enterprise FIPS: ami-01f76396df08b2ea4 +# ap-south-1 v16.4.6 arm64 Enterprise FIPS: ami-0b151dab5123a1cde +# ap-south-1 v16.4.6 x86_64 Enterprise FIPS: ami-0a548663132b1fbcc +# ap-southeast-1 v16.4.6 arm64 Enterprise FIPS: ami-0ee14bd0e530b9802 +# ap-southeast-1 v16.4.6 x86_64 Enterprise FIPS: ami-02605938b8431df73 +# ap-southeast-2 v16.4.6 arm64 Enterprise FIPS: ami-0e1ab9036f0d741ee +# ap-southeast-2 v16.4.6 x86_64 Enterprise FIPS: ami-0da24aa1dca222d28 +# ca-central-1 v16.4.6 arm64 Enterprise FIPS: ami-0168f83e25bab435d +# ca-central-1 v16.4.6 x86_64 Enterprise FIPS: ami-0dd0f6a87b55bf122 +# eu-central-1 v16.4.6 arm64 Enterprise FIPS: ami-0be0fd9618583374b +# eu-central-1 v16.4.6 x86_64 Enterprise FIPS: ami-0c87fd696f03d07be +# eu-north-1 v16.4.6 arm64 Enterprise FIPS: ami-0165c744dd34b0367 +# eu-north-1 v16.4.6 x86_64 Enterprise FIPS: ami-0fc4ea5c96fe4b2a1 +# eu-west-1 v16.4.6 arm64 Enterprise FIPS: ami-064921542d826b418 +# eu-west-1 v16.4.6 x86_64 Enterprise FIPS: ami-03291e366b650c3bb +# eu-west-2 v16.4.6 arm64 Enterprise FIPS: ami-0913a3fa04526977b +# eu-west-2 v16.4.6 x86_64 Enterprise FIPS: ami-0f303317a7395c1da +# eu-west-3 v16.4.6 arm64 Enterprise FIPS: ami-0403b9e814a93e163 +# eu-west-3 v16.4.6 x86_64 Enterprise FIPS: ami-0550f4d59db15f7d7 +# sa-east-1 v16.4.6 arm64 Enterprise FIPS: ami-04479f0cc8407de74 +# sa-east-1 v16.4.6 x86_64 Enterprise FIPS: ami-0ae361c5388c2e620 +# us-east-1 v16.4.6 arm64 Enterprise FIPS: ami-0d6a7504bf4c12471 +# us-east-1 v16.4.6 x86_64 Enterprise FIPS: ami-0184537bbd4a91c80 +# us-east-2 v16.4.6 arm64 Enterprise FIPS: ami-0ba3bdc20ee3911eb +# us-east-2 v16.4.6 x86_64 Enterprise FIPS: ami-0deebe84e68d2ca33 +# us-west-1 v16.4.6 arm64 Enterprise FIPS: ami-04f75a751ff454fe0 +# us-west-1 v16.4.6 x86_64 Enterprise FIPS: ami-0dc241b1b82dcb44b +# us-west-2 v16.4.6 arm64 Enterprise FIPS: ami-0bcc7e8ade2f96862 +# us-west-2 v16.4.6 x86_64 Enterprise FIPS: ami-0e396f7cd99e781ae ``` diff --git a/examples/aws/terraform/ha-autoscale-cluster/README.md b/examples/aws/terraform/ha-autoscale-cluster/README.md index eceed030de64f..fff741d817e46 100644 --- a/examples/aws/terraform/ha-autoscale-cluster/README.md +++ b/examples/aws/terraform/ha-autoscale-cluster/README.md @@ -46,7 +46,7 @@ export TF_VAR_cluster_name="teleport.example.com" # OSS: aws ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-oss-*' # Enterprise: aws ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-ent-*' # FIPS 140-2 images are also available for Enterprise customers, look for '-fips' on the end of the AMI's name -export TF_VAR_ami_name="teleport-ent-16.4.3-arm64" +export TF_VAR_ami_name="teleport-ent-16.4.6-arm64" # Instance types used for authentication server auto scaling group # This should match to the AMI instance architecture type, ARM or x86 diff --git a/examples/aws/terraform/starter-cluster/README.md b/examples/aws/terraform/starter-cluster/README.md index f8ca9b8a6f1dc..5a7030487d616 100644 --- a/examples/aws/terraform/starter-cluster/README.md +++ b/examples/aws/terraform/starter-cluster/README.md @@ -98,7 +98,7 @@ TF_VAR_license_path ?= "/path/to/license" # OSS: aws ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-oss-*' # Enterprise: aws ec2 describe-images --owners 146628656107 --filters 'Name=name,Values=teleport-ent-*' # FIPS 140-2 images are also available for Enterprise customers, look for '-fips' on the end of the AMI's name -TF_VAR_ami_name ?= "teleport-ent-16.4.3-arm64" +TF_VAR_ami_name ?= "teleport-ent-16.4.6-arm64" # Route 53 hosted zone to use, must be a root zone registered in AWS, e.g. example.com TF_VAR_route53_zone ?= "example.com" From d62a0dab1e740a894493f74a0183641b46c1ceeb Mon Sep 17 00:00:00 2001 From: Tim Buckley Date: Wed, 23 Oct 2024 18:25:09 -0600 Subject: [PATCH 42/70] Machine ID: Initialize destinations and file ACLs at runtime (#47841) * Machine ID: Initialize destinations and file ACLs at runtime This adds support for initializing ACLs at runtime without needing to use `tbot init`. Users now configure a list of allowed readers from which an ACL template is built, and then ACLs will be verified and corrected both at startup and immediately before writing to an artifact. Existing ACL mode semantics remain largely unchanged: `acls: try` is the default, and will enable runtime ACL correction and enforcement if a write test completes successfully; `acls: required` results in a hard failure if the startup write test fails. As runtime ACL management requires the bot user to own the destination directory, bot user ownership is now a prerequisite for ACL management. `tbot init` itself still exists to help manage these situations, but is now marked as legacy. These new-style ACLs additionally support UIDs and GIDs, even those not defined in `/etc/passwd`, to better support containerized usage. This also adds CLI flags to add reader users and groups to the new `tbot start $service` family of flags, so runtime ACLs can be used without a `tbot.yaml`. Closes #43554 * Support the new destination helper in all new start and configure commands * Fix lints * Hard fail on file ownership check when unsupported with `acls: required` * Clarify ACLSelector comments * Actually call ACLSelector.CheckAndSetDefaults() --- lib/tbot/botfs/botfs.go | 64 +++++ lib/tbot/botfs/fs_linux.go | 229 ++++++++++++++- lib/tbot/botfs/fs_linux_test.go | 100 +++++++ lib/tbot/botfs/fs_unix.go | 33 ++- lib/tbot/botfs/fs_windows.go | 30 +- lib/tbot/cli/start_application.go | 6 +- lib/tbot/cli/start_database.go | 14 +- lib/tbot/cli/start_identity.go | 9 +- lib/tbot/cli/start_kubernetes.go | 6 +- lib/tbot/cli/start_shared.go | 54 ++++ lib/tbot/cli/start_shared_test.go | 34 +++ lib/tbot/cli/start_spiffe_svid.go | 6 +- lib/tbot/config/destination_directory.go | 266 ++++++++++++++++-- lib/tbot/config/destination_directory_test.go | 86 ++++++ .../acl_readers.golden | 6 + tool/tbot/init.go | 28 +- 16 files changed, 886 insertions(+), 85 deletions(-) create mode 100644 lib/tbot/botfs/fs_linux_test.go create mode 100644 lib/tbot/config/testdata/TestDestinationDirectory_YAML/acl_readers.golden diff --git a/lib/tbot/botfs/botfs.go b/lib/tbot/botfs/botfs.go index 20f06ed5361b4..dd834200836bd 100644 --- a/lib/tbot/botfs/botfs.go +++ b/lib/tbot/botfs/botfs.go @@ -23,7 +23,9 @@ import ( "io/fs" "os" "os/user" + "path/filepath" + "github.com/google/uuid" "github.com/gravitational/trace" "github.com/gravitational/teleport" @@ -97,6 +99,31 @@ type ACLOptions struct { ReaderUser *user.User } +// ACLSelector is a target for an ACL entry, pointing at e.g. a single user or +// group. Only one field may be specified in a given selector and this should be +// validated with `CheckAndSetDefaults()`. +type ACLSelector struct { + // User is a user specifier. If numeric, it is treated as a UID. Only one + // field may be specified per ACLSelector. + User string `yaml:"user,omitempty"` + + // Group is a group specifier. If numeric, it is treated as a UID. Only one + // field may be specified per ACLSelector. + Group string `yaml:"group,omitempty"` +} + +func (s *ACLSelector) CheckAndSetDefaults() error { + if s.User != "" && s.Group != "" { + return trace.BadParameter("reader: only one of 'user' and 'group' may be set, not both") + } + + if s.User == "" && s.Group == "" { + return trace.BadParameter("reader: one of 'user' or 'group' must be set") + } + + return nil +} + // openStandard attempts to open the given path for reading and writing with // O_CREATE set. func openStandard(path string, mode OpenMode) (*os.File, error) { @@ -135,3 +162,40 @@ func createStandard(path string, isDir bool) error { return nil } + +// TestACL attempts to create a temporary file in the given parent directory and +// apply an ACL to it. Note that `readers` should be representative of runtime +// reader configuration as `ConfigureACL()` may attempt to resolve named users, +// and may fail if resolution fails. +func TestACL(directory string, readers []*ACLSelector) error { + // Note: we need to create the test file in the dest dir to ensure we + // actually test the target filesystem. + id, err := uuid.NewRandom() + if err != nil { + return trace.Wrap(err) + } + + testFile := filepath.Join(directory, id.String()) + if err := Create(testFile, false, SymlinksInsecure); err != nil { + return trace.Wrap(err) + } + + defer func() { + err := os.Remove(testFile) + if err != nil { + log.DebugContext( + context.TODO(), + "Failed to delete ACL test file", + "path", testFile, + ) + } + }() + + // Configure a dummy ACL that redundantly includes the user as a reader. + //nolint:staticcheck // staticcheck doesn't like nop implementations in fs_other.go + if err := ConfigureACL(testFile, readers); err != nil { + return trace.Wrap(err) + } + + return nil +} diff --git a/lib/tbot/botfs/fs_linux.go b/lib/tbot/botfs/fs_linux.go index ecfd69b1a81c2..409bd202d1322 100644 --- a/lib/tbot/botfs/fs_linux.go +++ b/lib/tbot/botfs/fs_linux.go @@ -24,6 +24,7 @@ package botfs import ( "context" "errors" + "fmt" "io" "io/fs" "os" @@ -45,6 +46,9 @@ import ( // syscall. const Openat2MinKernel = "5.6.0" +// mostACLRead is a permission mode granting readonly access to a file. +const modeACLRead fs.FileMode = 04 + // modeACLReadExecute is the permissions mode needed for read on directories. const modeACLReadExecute fs.FileMode = 05 @@ -267,10 +271,11 @@ func desiredPerms(path string) (ownerMode fs.FileMode, botAndReaderMode fs.FileM return } -// VerifyACL verifies whether the ACL of the given file allows writes from the -// bot user. Errors may optionally be used as more informational warnings; -// ConfigureACL can be used to correct them, assuming the user has permissions. -func VerifyACL(path string, opts *ACLOptions) error { +// VerifyLegacyACL verifies whether the ACL of the given file allows writes from +// the bot user. Errors may optionally be used as more informational warnings; +// ConfigureLegacyACL can be used to correct them, assuming the user has +// permissions. +func VerifyLegacyACL(path string, opts *ACLOptions) error { current, err := acl.Get(path) if err != nil { return trace.Wrap(err) @@ -365,9 +370,9 @@ func VerifyACL(path string, opts *ACLOptions) error { return trace.NewAggregate(errors...) } -// ConfigureACL configures ACLs of the given file to allow writes from the bot +// ConfigureLegacyACL configures ACLs of the given file to allow writes from the bot // user. -func ConfigureACL(path string, owner *user.User, opts *ACLOptions) error { +func ConfigureLegacyACL(path string, owner *user.User, opts *ACLOptions) error { if owner.Uid == opts.BotUser.Uid && owner.Uid == opts.ReaderUser.Uid { // We'll end up with an empty ACL. This isn't technically a problem log.WarnContext( @@ -437,6 +442,142 @@ func ConfigureACL(path string, owner *user.User, opts *ACLOptions) error { // the files being writable to the reader is (maybe arguably) not a // security issue. + log.DebugContext( + context.TODO(), + "Configuring legacy ACL on path", + "path", path, + "acl", desiredACL, + ) + return trace.ConvertSystemError(trace.Wrap(acl.Set(path, desiredACL))) +} + +// resolveACLReaderSelector attempts to convert an ACL selector into a +// platform-specific acl.Entry that can be applied to a file. +func resolveACLReaderSelector(s *ACLSelector, dir bool) (acl.Entry, error) { + var perm fs.FileMode = modeACLRead + if dir { + perm = modeACLReadExecute + } + + switch { + case s.User != "": + _, err := strconv.ParseInt(s.User, 10, 32) + if err == nil { + // User is a valid number, so return it directly. We don't need to + // check the particular value as it's explicitly allowed to + // configure entries for nonexistent users. + return acl.Entry{ + Tag: acl.TagUser, + Qualifier: s.User, + Perms: perm, + }, nil + } + + user, err := user.Lookup(s.User) + if err != nil { + return acl.Entry{}, trace.Wrap(err) + } + + return acl.Entry{ + Tag: acl.TagUser, + Qualifier: user.Uid, + Perms: perm, + }, nil + case s.Group != "": + _, err := strconv.ParseInt(s.Group, 10, 32) + if err == nil { + // Group is a valid number, so return it directly. + return acl.Entry{ + Tag: acl.TagGroup, + Qualifier: s.Group, + Perms: perm, + }, nil + } + + group, err := user.LookupGroup(s.Group) + if err != nil { + return acl.Entry{}, trace.Wrap(err) + } + + return acl.Entry{ + Tag: acl.TagGroup, + Qualifier: group.Gid, + Perms: perm, + }, nil + default: + return acl.Entry{}, trace.BadParameter("unable to resolve ACL selector, user or group must be specified: %+v", s) + } +} + +// aclMaskForSelectors returns an appropriate ACL mask entry given the list of +// selectors. +func aclReaderMask(dir bool) acl.Entry { + perms := modeACLRead + if dir { + perms = modeACLReadExecute + } + + return acl.Entry{ + Tag: acl.TagMask, + Perms: perms, + } +} + +// aclFromReaders builds an ACL for a generic file or directory from the given +// list of reader selectors. +func aclFromReaders(selectors []*ACLSelector, dir bool) (acl.ACL, error) { + // Note: these entries are out of their required order, but go-acl sorts + // them before applying. + ownerPerms := modeACLReadWrite + if dir { + ownerPerms = modeACLReadWriteExecute + } + + desiredACL := acl.ACL{ + { + Tag: acl.TagUserObj, + Perms: ownerPerms, + }, + { + Tag: acl.TagGroupObj, + Perms: modeACLNone, + }, + aclReaderMask(dir), + { + Tag: acl.TagOther, + Perms: modeACLNone, + }, + } + + for _, selector := range selectors { + entry, err := resolveACLReaderSelector(selector, dir) + if err != nil { + return nil, trace.Wrap(err) + } + + desiredACL = append(desiredACL, entry) + } + + return desiredACL, nil +} + +// ConfigureACL configures a bot-user-owned ACL at the given path such that it +// can be read by the given list of readers. If the list is empty, appropriate +// non-ACL permissions will be set to ensure only the bot user can read the +// file. +func ConfigureACL(path string, readers []*ACLSelector) error { + stat, err := os.Stat(path) + if err != nil { + return trace.Wrap(err) + } + + dir := stat.IsDir() + + desiredACL, err := aclFromReaders(readers, dir) + if err != nil { + return trace.Wrap(err) + } + log.DebugContext( context.TODO(), "Configuring ACL on path", @@ -446,6 +587,78 @@ func ConfigureACL(path string, owner *user.User, opts *ACLOptions) error { return trace.ConvertSystemError(trace.Wrap(acl.Set(path, desiredACL))) } +// permStrings is a list of possible permission string representations, +// duplicated from `acl` as it is private. +var permStrings = []string{ + 0: "---", + 1: "--x", + 2: "-w-", + 3: "-wx", + 4: "r--", + 5: "r-x", + 6: "rw-", + 7: "rwx", +} + +// formatEntry formats an ACL entry without attempting to resolve UIDs or GIDs +// to ensure consistent results in tests and elsewhere. Inlined from +// acl.Entry.String(). +func formatEntry(e acl.Entry) string { + middle := "::" + if e.Tag == acl.TagUser || e.Tag == acl.TagGroup { + middle = ":" + e.Qualifier + ":" + } + return fmt.Sprintf("%s%s%s", e.Tag, middle, permStrings[7&e.Perms]) +} + +// CompareACL compares two ACLs to check if they match. Returns an empty list if +// the two are identity, otherwise returns a list of error messages for each +// issue found. +func CompareACL(expected, candidate acl.ACL) []string { + expectedSet := utils.NewSet(expected...) + candidateSet := utils.NewSet(candidate...) + + missing := expectedSet.Clone().Subtract(candidateSet) + unexpected := candidateSet.Clone().Subtract(expectedSet) + + var issues []string + for m := range missing { + issues = append(issues, fmt.Sprintf("missing required entry: %s", formatEntry(m))) + } + for u := range unexpected { + issues = append(issues, fmt.Sprintf("unexpected entry: %s", formatEntry(u))) + } + + return issues +} + +// VerifyACL loads the ACL for the file at the given path and compares it to +// the expected ACL as determined by the given list of reader selectors, +// returning a list of issues found. An empty list (and nil error) implies a +// valid ACL. The path must exist and the user must have permission to `os.Stat` +// it. Errors will be returned if the ACL was unable to be read. +func VerifyACL(path string, readers []*ACLSelector) ([]string, error) { + stat, err := os.Stat(path) + if err != nil { + return []string{}, trace.Wrap(err) + } + + dir := stat.IsDir() + + expected, err := aclFromReaders(readers, dir) + if err != nil { + return []string{}, trace.Wrap(err) + } + + fsACL, err := acl.Get(path) + if err != nil { + return []string{}, trace.Wrap(err) + } + + issues := CompareACL(expected, fsACL) + return issues, nil +} + // HasACLSupport determines if this binary / system supports ACLs. func HasACLSupport() bool { // We just assume Linux _can_ support ACLs here, and will test for support @@ -496,12 +709,12 @@ func GetOwner(fileInfo fs.FileInfo) (*user.User, error) { // IsOwnedBy checks that the file at the given path is owned by the given user. // Returns a trace.NotImplemented() on unsupported platforms. -func IsOwnedBy(fileInfo fs.FileInfo, user *user.User) (bool, error) { +func IsOwnedBy(fileInfo fs.FileInfo, uid int) (bool, error) { info, ok := fileInfo.Sys().(*syscall.Stat_t) if !ok { return false, trace.Errorf("unexpected type of file info on Linux: %T", fileInfo.Sys()) } // Our files are 0600, so don't bother checking gid. - return strconv.Itoa(int(info.Uid)) == user.Uid, nil + return int(info.Uid) == uid, nil } diff --git a/lib/tbot/botfs/fs_linux_test.go b/lib/tbot/botfs/fs_linux_test.go new file mode 100644 index 0000000000000..e12fb26a56284 --- /dev/null +++ b/lib/tbot/botfs/fs_linux_test.go @@ -0,0 +1,100 @@ +//go:build linux +// +build linux + +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package botfs + +import ( + "testing" + + "github.com/joshlf/go-acl" + "github.com/stretchr/testify/require" +) + +func TestCompareACL(t *testing.T) { + // Note: no named users or groups since we can't depend on names. + readersA := []*ACLSelector{ + {User: "123"}, + {Group: "456"}, + } + readersB := []*ACLSelector{ + {Group: "123"}, + {User: "456"}, + } + + testA, err := aclFromReaders(readersA, false) + require.NoError(t, err) + + testB, err := aclFromReaders(readersB, false) + require.NoError(t, err) + + tests := []struct { + name string + expected acl.ACL + candidate acl.ACL + assert func(t *testing.T, issues []string) + }{ + { + name: "matching", + expected: testA, + candidate: testA, + assert: func(t *testing.T, issues []string) { + require.Empty(t, issues) + }, + }, + { + name: "empty candidate", + expected: testA, + candidate: acl.ACL{}, + assert: func(t *testing.T, issues []string) { + require.Len(t, issues, 6) + require.ElementsMatch(t, issues, []string{ + "missing required entry: u::rw-", + "missing required entry: g::---", + "missing required entry: m::r--", + "missing required entry: o::---", + "missing required entry: u:123:r--", + "missing required entry: g:456:r--", + }) + }, + }, + { + name: "mismatched", + expected: testA, + candidate: testB, + assert: func(t *testing.T, issues []string) { + require.Len(t, issues, 4) + require.ElementsMatch(t, issues, []string{ + "missing required entry: u:123:r--", + "missing required entry: g:456:r--", + "unexpected entry: g:123:r--", + "unexpected entry: u:456:r--", + }) + }, + }, + } + + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + issues := CompareACL(tt.expected, tt.candidate) + tt.assert(t, issues) + }) + } +} diff --git a/lib/tbot/botfs/fs_unix.go b/lib/tbot/botfs/fs_unix.go index 45c0f36e8f9ef..ad6d417e7836f 100644 --- a/lib/tbot/botfs/fs_unix.go +++ b/lib/tbot/botfs/fs_unix.go @@ -26,7 +26,6 @@ import ( "io" "io/fs" "os/user" - "strconv" "sync" "syscall" @@ -106,19 +105,39 @@ func Write(path string, data []byte, symlinksMode SymlinksMode) error { return nil } -// VerifyACL verifies whether the ACL of the given file allows writes from the +// VerifyLegacyACL verifies whether the ACL of the given file allows writes from the // bot user. // //nolint:staticcheck // staticcheck does not like our nop implementations. -func VerifyACL(path string, opts *ACLOptions) error { +func VerifyLegacyACL(path string, opts *ACLOptions) error { return trace.NotImplemented("ACLs not supported on this platform") } -// ConfigureACL configures ACLs of the given file to allow writes from the bot +// VerifyACL loads the ACL for the file at the given path and compares it to +// the expected ACL as determined by the given list of reader selectors, +// returning a list of issues found. This is not implemented for generic UNIX +// targets. +// +//nolint:staticcheck // staticcheck does not like our nop implementations. +func VerifyACL(path string, readers []*ACLSelector) ([]string, error) { + return nil, trace.NotImplemented("ACLs not supported on this platform") +} + +// ConfigureACL configures a bot-user-owned ACL at the given path such that it +// can be read by the given list of readers. If the list is empty, appropriate +// non-ACL permissions will be set to ensure only the bot user can read the +// file. This is not implemented for generic UNIX targets. +// +//nolint:staticcheck // staticcheck does not like our nop implementations. +func ConfigureACL(path string, readers []*ACLSelector) error { + return trace.NotImplemented("ACLs are not supported on this platform") +} + +// ConfigureLegacyACL configures ACLs of the given file to allow writes from the bot // user. // //nolint:staticcheck // staticcheck does not like our nop implementations. -func ConfigureACL(path string, owner *user.User, opts *ACLOptions) error { +func ConfigureLegacyACL(path string, owner *user.User, opts *ACLOptions) error { return trace.NotImplemented("ACLs not supported on this platform") } @@ -137,12 +156,12 @@ func HasSecureWriteSupport() bool { // IsOwnedBy checks that the file at the given path is owned by the given user. // Returns a trace.NotImplemented() on unsupported platforms. -func IsOwnedBy(fileInfo fs.FileInfo, user *user.User) (bool, error) { +func IsOwnedBy(fileInfo fs.FileInfo, uid int) (bool, error) { info, ok := fileInfo.Sys().(*syscall.Stat_t) if !ok { return false, trace.NotImplemented("Cannot verify file ownership on this platform.") } // Our files are 0600, so don't bother checking gid. - return strconv.Itoa(int(info.Uid)) == user.Uid, nil + return int(info.Uid) == uid, nil } diff --git a/lib/tbot/botfs/fs_windows.go b/lib/tbot/botfs/fs_windows.go index 72be09d04b7f0..41ef28ab8e66d 100644 --- a/lib/tbot/botfs/fs_windows.go +++ b/lib/tbot/botfs/fs_windows.go @@ -106,19 +106,39 @@ func Write(path string, data []byte, symlinksMode SymlinksMode) error { return nil } -// VerifyACL verifies whether the ACL of the given file allows writes from the +// VerifyLegacyACL verifies whether the ACL of the given file allows writes from the // bot user. // //nolint:staticcheck // staticcheck does not like our nop implementations. -func VerifyACL(path string, opts *ACLOptions) error { +func VerifyLegacyACL(path string, opts *ACLOptions) error { return trace.NotImplemented("ACLs not supported on this platform") } -// ConfigureACL configures ACLs of the given file to allow writes from the bot +// VerifyACL loads the ACL for the file at the given path and compares it to +// the expected ACL as determined by the given list of reader selectors, +// returning a list of issues found. This is not implemented for Windows +// targets. +// +//nolint:staticcheck // staticcheck does not like our nop implementations. +func VerifyACL(path string, readers []*ACLSelector) ([]string, error) { + return nil, trace.NotImplemented("ACLs not supported on this platform") +} + +// ConfigureACL configures a bot-user-owned ACL at the given path such that it +// can be read by the given list of readers. If the list is empty, appropriate +// non-ACL permissions will be set to ensure only the bot user can read the +// file. This is not implemented for Windows targets. +// +//nolint:staticcheck // staticcheck does not like our nop implementations. +func ConfigureACL(path string, readers []*ACLSelector) error { + return trace.NotImplemented("ACLs are not supported on this platform") +} + +// ConfigureLegacyACL configures ACLs of the given file to allow writes from the bot // user. // //nolint:staticcheck // staticcheck does not like our nop implementations. -func ConfigureACL(path string, owner *user.User, opts *ACLOptions) error { +func ConfigureLegacyACL(path string, owner *user.User, opts *ACLOptions) error { return trace.NotImplemented("ACLs not supported on this platform") } @@ -137,6 +157,6 @@ func HasSecureWriteSupport() bool { // IsOwnedBy checks that the file at the given path is owned by the given user. // Returns a trace.NotImplemented() on unsupported platforms. -func IsOwnedBy(_ fs.FileInfo, _ *user.User) (bool, error) { +func IsOwnedBy(_ fs.FileInfo, _ int) (bool, error) { return false, trace.NotImplemented("Cannot verify file ownership on this platform.") } diff --git a/lib/tbot/cli/start_application.go b/lib/tbot/cli/start_application.go index 2d3665cdd25b9..b9d32e57850ac 100644 --- a/lib/tbot/cli/start_application.go +++ b/lib/tbot/cli/start_application.go @@ -31,9 +31,9 @@ import ( // `tbot configure application`. type ApplicationCommand struct { *sharedStartArgs + *sharedDestinationArgs *genericMutatorHandler - Destination string AppName string SpecificTLSExtensions bool } @@ -45,9 +45,9 @@ func NewApplicationCommand(parentCmd *kingpin.CmdClause, action MutatorAction) * c := &ApplicationCommand{} c.sharedStartArgs = newSharedStartArgs(cmd) + c.sharedDestinationArgs = newSharedDestinationArgs(cmd) c.genericMutatorHandler = newGenericMutatorHandler(cmd, c, action) - cmd.Flag("destination", "A destination URI, such as file:///foo/bar").Required().StringVar(&c.Destination) cmd.Flag("app", "The name of the app in Teleport").Required().StringVar(&c.AppName) cmd.Flag("specific-tls-extensions", "If set, include additional `tls.crt`, `tls.key`, and `tls.cas` for apps that require these file extensions").BoolVar(&c.SpecificTLSExtensions) @@ -61,7 +61,7 @@ func (c *ApplicationCommand) ApplyConfig(cfg *config.BotConfig, l *slog.Logger) return trace.Wrap(err) } - dest, err := config.DestinationFromURI(c.Destination) + dest, err := c.BuildDestination() if err != nil { return trace.Wrap(err) } diff --git a/lib/tbot/cli/start_database.go b/lib/tbot/cli/start_database.go index 01bc0fd8fb600..d0b5648051e72 100644 --- a/lib/tbot/cli/start_database.go +++ b/lib/tbot/cli/start_database.go @@ -31,13 +31,13 @@ import ( // `tbot configure database`. type DatabaseCommand struct { *sharedStartArgs + *sharedDestinationArgs *genericMutatorHandler - Destination string - Format string - Service string - Username string - Database string + Format string + Service string + Username string + Database string } // NewDatabaseCommand initializes a command and flags for database outputs and @@ -47,9 +47,9 @@ func NewDatabaseCommand(parentCmd *kingpin.CmdClause, action MutatorAction) *Dat c := &DatabaseCommand{} c.sharedStartArgs = newSharedStartArgs(cmd) + c.sharedDestinationArgs = newSharedDestinationArgs(cmd) c.genericMutatorHandler = newGenericMutatorHandler(cmd, c, action) - cmd.Flag("destination", "A destination URI, such as file:///foo/bar").Required().StringVar(&c.Destination) cmd.Flag("format", "The database output format if necessary").Default("").EnumVar(&c.Format, config.SupportedDatabaseFormatStrings()...) cmd.Flag("service", "The database service name").Required().StringVar(&c.Service) cmd.Flag("username", "The database user name").Required().StringVar(&c.Username) @@ -63,7 +63,7 @@ func (c *DatabaseCommand) ApplyConfig(cfg *config.BotConfig, l *slog.Logger) err return trace.Wrap(err) } - dest, err := config.DestinationFromURI(c.Destination) + dest, err := c.BuildDestination() if err != nil { return trace.Wrap(err) } diff --git a/lib/tbot/cli/start_identity.go b/lib/tbot/cli/start_identity.go index 0898c998f1fee..dec8c817df6d7 100644 --- a/lib/tbot/cli/start_identity.go +++ b/lib/tbot/cli/start_identity.go @@ -31,10 +31,10 @@ import ( // `tbot configure identity`. type IdentityCommand struct { *sharedStartArgs + *sharedDestinationArgs *genericMutatorHandler - Destination string - Cluster string + Cluster string } // NewIdentityCommand initializes the command and flags for identity outputs @@ -43,10 +43,11 @@ func NewIdentityCommand(parentCmd *kingpin.CmdClause, action MutatorAction) *Ide cmd := parentCmd.Command("identity", "Start with an identity output for SSH and Teleport API access").Alias("ssh").Alias("id") c := &IdentityCommand{} + c.sharedDestinationArgs = newSharedDestinationArgs(cmd) c.sharedStartArgs = newSharedStartArgs(cmd) + c.genericMutatorHandler = newGenericMutatorHandler(cmd, c, action) - cmd.Flag("destination", "A destination URI, such as file:///foo/bar").Required().StringVar(&c.Destination) cmd.Flag("cluster", "The name of a specific cluster for which to issue an identity if using a leaf cluster").StringVar(&c.Cluster) // Note: roles and ssh_config mode are excluded for now. @@ -59,7 +60,7 @@ func (c *IdentityCommand) ApplyConfig(cfg *config.BotConfig, l *slog.Logger) err return trace.Wrap(err) } - dest, err := config.DestinationFromURI(c.Destination) + dest, err := c.BuildDestination() if err != nil { return trace.Wrap(err) } diff --git a/lib/tbot/cli/start_kubernetes.go b/lib/tbot/cli/start_kubernetes.go index 028a09fb649a1..acbf1338e5c51 100644 --- a/lib/tbot/cli/start_kubernetes.go +++ b/lib/tbot/cli/start_kubernetes.go @@ -31,9 +31,9 @@ import ( // `tbot configure kubernetes`. type KubernetesCommand struct { *sharedStartArgs + *sharedDestinationArgs *genericMutatorHandler - Destination string KubernetesCluster string DisableExecPlugin bool } @@ -45,9 +45,9 @@ func NewKubernetesCommand(parentCmd *kingpin.CmdClause, action MutatorAction) *K c := &KubernetesCommand{} c.sharedStartArgs = newSharedStartArgs(cmd) + c.sharedDestinationArgs = newSharedDestinationArgs(cmd) c.genericMutatorHandler = newGenericMutatorHandler(cmd, c, action) - cmd.Flag("destination", "A destination URI, such as file:///foo/bar").Required().StringVar(&c.Destination) cmd.Flag("kubernetes-cluster", "The name of the Kubernetes cluster in Teleport for which to fetch credentials").Required().StringVar(&c.KubernetesCluster) cmd.Flag("disable-exec-plugin", "If set, disables the exec plugin. This allows credentials to be used without the `tbot` binary.").BoolVar(&c.DisableExecPlugin) @@ -61,7 +61,7 @@ func (c *KubernetesCommand) ApplyConfig(cfg *config.BotConfig, l *slog.Logger) e return trace.Wrap(err) } - dest, err := config.DestinationFromURI(c.Destination) + dest, err := c.BuildDestination() if err != nil { return trace.Wrap(err) } diff --git a/lib/tbot/cli/start_shared.go b/lib/tbot/cli/start_shared.go index 310405990c881..ba3501f8b6f85 100644 --- a/lib/tbot/cli/start_shared.go +++ b/lib/tbot/cli/start_shared.go @@ -30,6 +30,8 @@ import ( "github.com/gravitational/trace" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/tbot/bot" + "github.com/gravitational/teleport/lib/tbot/botfs" "github.com/gravitational/teleport/lib/tbot/config" ) @@ -233,3 +235,55 @@ func (s *sharedStartArgs) ApplyConfig(cfg *config.BotConfig, l *slog.Logger) err return nil } + +// sharedDestinationArgs are arguments common to all commands that accept a +// --destination flag and any related flags. Downstream commands will need to +// call `BuildDestination()` to retrieve the value. +type sharedDestinationArgs struct { + Destination string + ReaderUsers []string + ReaderGroups []string +} + +// newSharedDestinationArgs initializes args that provide --destination and +// related flags. +func newSharedDestinationArgs(cmd *kingpin.CmdClause) *sharedDestinationArgs { + args := &sharedDestinationArgs{} + + cmd.Flag("destination", "A destination URI, such as file:///foo/bar").Required().StringVar(&args.Destination) + cmd.Flag("reader-user", "An additional user name or UID that should be allowed by ACLs to read this destination. Only valid for file destinations on Linux.").StringsVar(&args.ReaderUsers) + cmd.Flag("reader-group", "An additional group name or GID that should be allowed by ACLs to read this destination. Only valid for file destinations on Linux.").StringsVar(&args.ReaderGroups) + + return args +} + +func (s *sharedDestinationArgs) BuildDestination() (bot.Destination, error) { + dest, err := config.DestinationFromURI(s.Destination) + if err != nil { + return nil, trace.Wrap(err) + } + + if len(s.ReaderUsers) > 0 || len(s.ReaderGroups) > 0 { + // These flags are only supported on directory destinations, so ensure + // that's what was built. + + dd, ok := dest.(*config.DestinationDirectory) + if !ok { + return nil, trace.BadParameter("--reader-user and --reader-group are only compatible with file destinations") + } + + for _, r := range s.ReaderUsers { + dd.Readers = append(dd.Readers, &botfs.ACLSelector{ + User: r, + }) + } + + for _, r := range s.ReaderGroups { + dd.Readers = append(dd.Readers, &botfs.ACLSelector{ + Group: r, + }) + } + } + + return dest, nil +} diff --git a/lib/tbot/cli/start_shared_test.go b/lib/tbot/cli/start_shared_test.go index 5ec8cbd2f3d0d..549f04497e806 100644 --- a/lib/tbot/cli/start_shared_test.go +++ b/lib/tbot/cli/start_shared_test.go @@ -19,12 +19,14 @@ package cli import ( + "fmt" "testing" "time" "github.com/stretchr/testify/require" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/tbot/botfs" "github.com/gravitational/teleport/lib/tbot/config" ) @@ -74,3 +76,35 @@ func TestSharedStartArgs(t *testing.T) { require.True(t, ok) require.Equal(t, "/foo/bar", dir.Path) } + +func TestSharedDestinationArgs(t *testing.T) { + dir := t.TempDir() + + app, subcommand := buildMinimalKingpinApp("test") + args := newSharedDestinationArgs(subcommand) + _, err := app.Parse([]string{ + "test", + fmt.Sprintf("--destination=file://%s", dir), + "--reader-user=123", + "--reader-user=456", + "--reader-group=789", + "--reader-group=101112", + }) + require.NoError(t, err) + + require.ElementsMatch(t, args.ReaderUsers, []string{"123", "456"}) + require.ElementsMatch(t, args.ReaderGroups, []string{"789", "101112"}) + + dest, err := args.BuildDestination() + require.NoError(t, err) + + dd, ok := dest.(*config.DestinationDirectory) + require.True(t, ok) + + require.ElementsMatch(t, dd.Readers, []*botfs.ACLSelector{ + {User: "123"}, + {User: "456"}, + {Group: "789"}, + {Group: "101112"}, + }) +} diff --git a/lib/tbot/cli/start_spiffe_svid.go b/lib/tbot/cli/start_spiffe_svid.go index fd602fdb5d287..22e111b12aa18 100644 --- a/lib/tbot/cli/start_spiffe_svid.go +++ b/lib/tbot/cli/start_spiffe_svid.go @@ -31,9 +31,9 @@ import ( // `tbot configure spiffe-svid`. type SPIFFESVIDCommand struct { *sharedStartArgs + *sharedDestinationArgs *genericMutatorHandler - Destination string IncludeFederatedTrustBundles bool SVIDPath string @@ -50,9 +50,9 @@ func NewSPIFFESVIDCommand(parentCmd *kingpin.CmdClause, action MutatorAction) *S c := &SPIFFESVIDCommand{} c.sharedStartArgs = newSharedStartArgs(cmd) + c.sharedDestinationArgs = newSharedDestinationArgs(cmd) c.genericMutatorHandler = newGenericMutatorHandler(cmd, c, action) - cmd.Flag("destination", "A destination URI, such as file:///foo/bar").Required().StringVar(&c.Destination) cmd.Flag("include-federated-trust-bundles", "If set, include federated trust bundles in the output").BoolVar(&c.IncludeFederatedTrustBundles) cmd.Flag("svid-path", "A SPIFFE ID to request, prefixed with '/'").Required().StringVar(&c.SVIDPath) cmd.Flag("svid-hint", "An optional hint for consumers of the SVID to aid in identification").StringVar(&c.SVIDHint) @@ -67,7 +67,7 @@ func (c *SPIFFESVIDCommand) ApplyConfig(cfg *config.BotConfig, l *slog.Logger) e return trace.Wrap(err) } - dest, err := config.DestinationFromURI(c.Destination) + dest, err := c.BuildDestination() if err != nil { return trace.Wrap(err) } diff --git a/lib/tbot/config/destination_directory.go b/lib/tbot/config/destination_directory.go index 6287f4f40b93d..cf303a1b71a08 100644 --- a/lib/tbot/config/destination_directory.go +++ b/lib/tbot/config/destination_directory.go @@ -27,6 +27,7 @@ import ( "os/user" "path" "path/filepath" + "strings" "github.com/gravitational/trace" "go.opentelemetry.io/otel/attribute" @@ -41,9 +42,15 @@ const DestinationDirectoryType = "directory" // DestinationDirectory is a Destination that writes to the local filesystem type DestinationDirectory struct { - Path string `yaml:"path,omitempty"` - Symlinks botfs.SymlinksMode `yaml:"symlinks,omitempty"` - ACLs botfs.ACLMode `yaml:"acls,omitempty"` + Path string `yaml:"path,omitempty"` + Symlinks botfs.SymlinksMode `yaml:"symlinks,omitempty"` + ACLs botfs.ACLMode `yaml:"acls,omitempty"` + Readers []*botfs.ACLSelector `yaml:"readers,omitempty"` + + // aclsEnabled is set during `Init()` if new-style ACLs are requested and + // the ACL test succeeds. When true, ACLs will be corrected on-the-fly + // during `Write()`. + aclsEnabled bool } func (dd *DestinationDirectory) UnmarshalYAML(node *yaml.Node) error { @@ -73,6 +80,12 @@ func (dd *DestinationDirectory) CheckAndSetDefaults() error { return trace.BadParameter("destination path must not be empty") } + for i, reader := range dd.Readers { + if err := reader.CheckAndSetDefaults(); err != nil { + return trace.Wrap(err, "reader entry %d is invalid", i) + } + } + switch dd.Symlinks { case "": // We default to SymlinksTrySecure. It's become apparent that the @@ -145,28 +158,74 @@ func mkdir(p string) error { return nil } -func (dd *DestinationDirectory) Init(_ context.Context, subdirs []string) error { +func (dd *DestinationDirectory) Init(ctx context.Context, subdirs []string) error { // Create the directory if needed. if err := mkdir(dd.Path); err != nil { return trace.Wrap(err) } + // Check for ACL configuration and test to ensure support. + if len(dd.Readers) > 0 && dd.ACLs != botfs.ACLOff { + // Run a test to ensure we can actually make use of them. + if err := botfs.TestACL(dd.Path, dd.Readers); err != nil { + if dd.ACLs == botfs.ACLRequired { + return trace.Wrap(err, "ACLs were marked as required but the "+ + "write test failed. Remove `acls: required` or resolve the "+ + "underlying issue.") + } + + const msg = "ACLs were requested but could not be configured, they " + + "will be disabled. To resolve this warning, ensure ACLs are " + + "supported and the directory is owned by the bot user, or " + + "remove any configured readers to disable ACLs" + log.WarnContext( + ctx, + msg, + "path", dd.Path, + "error", err, + "readers", dd.Readers, + ) + + dd.aclsEnabled = false + } else { + dd.aclsEnabled = true + log.InfoContext( + ctx, + "ACL test succeeded and will be configured at runtime", + "path", dd.Path, + "readers", len(dd.Readers), + ) + } + } + + if dd.aclsEnabled { + // Correct the base directory ACLs. Note that no default ACL is + // configured; we manage each file/subdirectory ACL manually. + if err := dd.verifyAndCorrectACL(ctx, ""); err != nil { + return trace.Wrap(err) + } + } + for _, dir := range subdirs { if err := mkdir(path.Join(dd.Path, dir)); err != nil { return trace.Wrap(err) } + + if dd.aclsEnabled { + if err := dd.verifyAndCorrectACL(ctx, dir); err != nil { + return trace.Wrap(err) + } + } } return nil } -func (dd *DestinationDirectory) Verify(keys []string) error { - // If ACLs are disabled or unsupported, just bail as there's nothing to - // check. - if dd.ACLs == botfs.ACLOff || !botfs.HasACLSupport() { - return nil - } - +// verifyLegacyACLs performs minor runtime verification of legacy-style ACLs, +// where it is _not_ assumed that the destination is owned by the bot user. +// This will not attempt to correct any issues, but will cause a hard failure if +// `acls: required` is configured and issues are detected. +func (dd *DestinationDirectory) verifyLegacyACLs(keys []string) error { currentUser, err := user.Current() if err != nil { // user.Current will fail if the user id does not exist in /etc/passwd @@ -184,48 +243,154 @@ func (dd *DestinationDirectory) Verify(keys []string) error { return nil } + errors := []error{} + for _, key := range keys { + path := filepath.Join(dd.Path, key) + + errors = append(errors, botfs.VerifyLegacyACL(path, &botfs.ACLOptions{ + BotUser: currentUser, + })) + } + + // Unlike new-style ACLs, we'll allow hard fails here: we don't expect to + // be able to manage legacy ACLs at runtime and need to depend on them being + // correct from the start, so hard fails at this stage make sense. + aggregate := trace.NewAggregate(errors...) + if dd.ACLs == botfs.ACLRequired { + // Hard fail if ACLs are specifically requested and there are errors. + return aggregate + } + + if aggregate != nil { + log.WarnContext( + context.TODO(), + "Destination has unexpected ACLs", + "path", dd.Path, + "errors", aggregate, + ) + } + + return nil +} + +func (dd *DestinationDirectory) Verify(keys []string) error { + // Preflight: Warn on common misconfigurations where any kind of ACL + // management will be impossible. + if dd.ACLs == botfs.ACLOff { + if len(dd.Readers) > 0 { + log.InfoContext( + context.TODO(), + "Readers are configured but ACLs are disabled for this destination. No ACLs will be managed or verified.", + "path", dd.Path, + ) + } + return nil + } + + if !botfs.HasACLSupport() { + if dd.ACLs == botfs.ACLRequired { + return trace.BadParameter("ACLs are marked as required for destination %s but are not supported on this platform. Set `acls: off` to resolve this error.", dd.Path) + } + + if len(dd.Readers) > 0 { + log.WarnContext( + context.TODO(), + "Readers are configured but this platform does not support filesystem ACLs. ACL management will be disabled.", + "path", dd.Path, + ) + } + } + stat, err := os.Stat(dd.Path) if err != nil { return trace.Wrap(err) } - ownedByBot, err := botfs.IsOwnedBy(stat, currentUser) + // Note: os.Getuid() returns -1 on Windows, but we've implicitly eliminated + // that as an option with the `botfs.HasACLSupport()` check above. + ownedByBot, err := botfs.IsOwnedBy(stat, os.Getuid()) if trace.IsNotImplemented(err) { // If file owners aren't supported, ACLs certainly aren't. Just bail. // (Subject to change if we ever try to support Windows ACLs.) + if dd.ACLs == botfs.ACLRequired { + return trace.NotImplemented("unable to determine file ownership on this platform but ACLs were marked as required, cannot continue") + } + + log.WarnContext( + context.TODO(), + "unable to determine file ownership on this platform, ACL verification will be skipped", + "path", dd.Path, + "error", err, + ) + return nil } else if err != nil { return trace.Wrap(err) } - // Make sure it's worth warning about ACLs for this Destination. If the + // Check for new-style ACL configuration. These explicitly require + // destinations to be owned by the bot user. This is somewhat arbitrarily + // here instead of in Init() and will run before each write attempt. + if len(dd.Readers) > 0 { + if !ownedByBot { + const msg = "This destination is not owned by the bot user so ACLs " + + "will not be enforced. To silence this warning, fix destination " + + "file ownership or remove configured `readers`" + log.WarnContext( + context.TODO(), + msg, + "path", dd.Path, + ) + + return nil + } + + return nil + } + + // For legacy ACLs, make sure it's worth warning about them. If the // destination is owned by the bot (implying the user is not trying to use - //ACLs), just bail. + // ACLs), just bail. if ownedByBot { return nil } - errors := []error{} - for _, key := range keys { - path := filepath.Join(dd.Path, key) + return trace.Wrap(dd.verifyLegacyACLs(keys)) +} - errors = append(errors, botfs.VerifyACL(path, &botfs.ACLOptions{ - BotUser: currentUser, - })) +// verifyAndCorrectACL performs validation and attempts correction on new-style +// ACLs when configured. +func (dd *DestinationDirectory) verifyAndCorrectACL(ctx context.Context, subpath string) error { + p := filepath.Join(dd.Path, subpath) + + // As a sanity check, try to ensure the resulting path is (lexically) a + // child of this destination. + if !strings.HasPrefix(p, filepath.Clean(dd.Path)) { + return trace.BadParameter("path %s is not a child of destination %s", p, dd.Path) } - aggregate := trace.NewAggregate(errors...) - if dd.ACLs == botfs.ACLRequired { - // Hard fail if ACLs are specifically requested and there are errors. - return aggregate + log.DebugContext(ctx, "verifying ACL", "path", p) + issues, err := botfs.VerifyACL(p, dd.Readers) + if err != nil { + return trace.Wrap(err) } - if aggregate != nil { - log.WarnContext( - context.TODO(), - "Destination has unexpected ACLs", - "path", dd.Path, - "errors", aggregate, + // If issues exist, attempt remediation. As the test during `Init()` + // passed, regardless of ACL mode (try, required), treat all errors here + // as hard failures. + if len(issues) > 0 { + if err := botfs.ConfigureACL(p, dd.Readers); err != nil { + // TODO: should this always be a hard fail? Would we want to just + // warn on `acls: try`? + return trace.Wrap(err, "unable to fix misconfigured ACL at path %s with issues %v", p, issues) + } + + log.InfoContext( + ctx, + "corrected ACLs on destination file", + "destination", dd.Path, + "path", subpath, + "issues", issues, ) } @@ -240,7 +405,46 @@ func (dd *DestinationDirectory) Write(ctx context.Context, name string, data []b ) defer span.End() - return trace.Wrap(botfs.Write(filepath.Join(dd.Path, name), data, dd.Symlinks)) + // If there are any parent directories, attempt to mkdir them again in case + // things have drifted since `Init()` was run. We don't bother with secure + // botfs.Create() since it's a no-op for directory creation. + if dir, _ := filepath.Split(name); dir != "" { + if err := mkdir(filepath.Join(dd.Path, dir)); err != nil { + return trace.Wrap(err) + } + } + + path := filepath.Join(dd.Path, name) + + // We can't configure permissions on a file that doesn't exist, so attempt + // to read the file first to determine if it exists, and create it if + // necessary. + _, err := botfs.Read(path, dd.Symlinks) + if trace.IsNotFound(err) { + log.DebugContext(ctx, "file is missing, creating to apply permissions", "path", path) + if err := botfs.Create(path, false, dd.Symlinks); err != nil { + return trace.Wrap(err) + } + } else if err != nil { + return trace.Wrap(err) + } + + if dd.aclsEnabled { + // Sequentially check all subdirectory ACLs. + dirs := strings.Split(name, string(os.PathSeparator)) + for i := 1; i < len(dirs); i++ { + // note: filepath.Join() will call `filepath.Clean()` on each result + if err := dd.verifyAndCorrectACL(ctx, filepath.Join(dirs[:i]...)); err != nil { + return trace.Wrap(err) + } + } + + if err := dd.verifyAndCorrectACL(ctx, name); err != nil { + return trace.Wrap(err) + } + } + + return trace.Wrap(botfs.Write(path, data, dd.Symlinks)) } func (dd *DestinationDirectory) Read(ctx context.Context, name string) ([]byte, error) { diff --git a/lib/tbot/config/destination_directory_test.go b/lib/tbot/config/destination_directory_test.go index f3b4d4ce39f4d..d0b78257f0198 100644 --- a/lib/tbot/config/destination_directory_test.go +++ b/lib/tbot/config/destination_directory_test.go @@ -19,8 +19,12 @@ package config import ( + "context" + "os" + "path/filepath" "testing" + "github.com/gravitational/trace" "github.com/stretchr/testify/require" "github.com/gravitational/teleport/lib/tbot/botfs" @@ -69,6 +73,88 @@ func TestDestinationDirectory_YAML(t *testing.T) { Path: "/my/path", }, }, + { + name: "acl readers", + in: DestinationDirectory{ + Path: "/my/path", + ACLs: botfs.ACLRequired, + Readers: []*botfs.ACLSelector{ + { + User: "foo", + }, + { + Group: "123", + }, + }, + }, + }, } testYAML(t, tests) } + +func TestDestinationDirectory_ACLs(t *testing.T) { + if !botfs.HasACLSupport() { + t.Skipf("ACLs not supported on this host") + } + + ctx := context.Background() + dir := t.TempDir() + path := filepath.Join(dir, "test") + + dd := DestinationDirectory{ + Path: path, + ACLs: botfs.ACLRequired, + Readers: []*botfs.ACLSelector{ + { + // We explicitly want to support nonexistent UIDs, so we'll pick + // an arbitrary UID we don't expect to exist. This particular + // value is outside the usual reserved ranges documented by + // Debian: + // https://www.debian.org/doc/debian-policy/ch-opersys.html#uid-and-gid-classes + User: "59123", + }, + }, + } + require.NoError(t, dd.CheckAndSetDefaults()) + + err := dd.Init(ctx, []string{"foo"}) + if trace.IsNotImplemented(err) { + t.Skipf("ACLs were unexpectedly not supported: %+v", err) + } + + require.NoError(t, err) + + // An ACL should be configured for the root directory + issues, err := botfs.VerifyACL(path, dd.Readers) + require.NoError(t, err) + require.Empty(t, issues) + + // Create an empty file to simulate an artifact. We explicitly want to + // observe ACL problems from a file created out-of-band, so that Write() can + // attempt to fix them. + artifactPath := filepath.Join(path, "foo", "bar") + f, err := os.Create(artifactPath) + require.NoError(t, err) + f.Close() + + issues, err = botfs.VerifyACL(artifactPath, dd.Readers) + require.NoError(t, err) + + // note, lib/tbot/botfs's TestCompareACL tests the specifics of an empty ACL + require.NotEmpty(t, issues) + + err = dd.Write(ctx, "foo/bar", []byte("hello world")) + require.NoError(t, err) + + // The previous issues should now be resolved. + issues, err = botfs.VerifyACL(artifactPath, dd.Readers) + require.NoError(t, err) + require.Empty(t, issues) + + // Finally, try writing to a completely separate path to ensure Write() + // initializes new files with a sane ACL. + require.NoError(t, dd.Write(ctx, "baz", []byte("example"))) + issues, err = botfs.VerifyACL(filepath.Join(path, "baz"), dd.Readers) + require.NoError(t, err) + require.Empty(t, issues) +} diff --git a/lib/tbot/config/testdata/TestDestinationDirectory_YAML/acl_readers.golden b/lib/tbot/config/testdata/TestDestinationDirectory_YAML/acl_readers.golden new file mode 100644 index 0000000000000..0ec718c727446 --- /dev/null +++ b/lib/tbot/config/testdata/TestDestinationDirectory_YAML/acl_readers.golden @@ -0,0 +1,6 @@ +type: directory +path: /my/path +acls: required +readers: + - user: foo + - group: "123" diff --git a/tool/tbot/init.go b/tool/tbot/init.go index 04adddd620014..ab59ef70adbac 100644 --- a/tool/tbot/init.go +++ b/tool/tbot/init.go @@ -121,7 +121,7 @@ func testACL(directory string, ownerUser *user.User, opts *botfs.ACLOptions) err }() //nolint:staticcheck // staticcheck doesn't like nop implementations in fs_other.go - if err := botfs.ConfigureACL(testFile, ownerUser, opts); err != nil { + if err := botfs.ConfigureLegacyACL(testFile, ownerUser, opts); err != nil { return trace.Wrap(err) } @@ -211,8 +211,18 @@ func ensurePermissions( return trace.Wrap(err) } + uid, err := strconv.Atoi(params.ownerUser.Uid) + if err != nil { + return trace.Wrap(err) + } + + gid, err := strconv.Atoi(params.ownerGroup.Gid) + if err != nil { + return trace.Wrap(err) + } + // Correct ownership. - ownedByDesiredOwner, err := botfs.IsOwnedBy(stat, params.ownerUser) + ownedByDesiredOwner, err := botfs.IsOwnedBy(stat, uid) if err != nil { log.DebugContext(ctx, "Could not determine file ownership", "path", path, "error", err) @@ -227,16 +237,6 @@ func ensurePermissions( log.WarnContext(ctx, "Not running as root, ownership change is likely to fail") } - uid, err := strconv.Atoi(params.ownerUser.Uid) - if err != nil { - return trace.Wrap(err) - } - - gid, err := strconv.Atoi(params.ownerGroup.Gid) - if err != nil { - return trace.Wrap(err) - } - if verboseLogging { log.WarnContext( ctx, @@ -259,7 +259,7 @@ func ensurePermissions( // are incorrect. //nolint:staticcheck // staticcheck doesn't like nop implementations in fs_other.go - err = botfs.VerifyACL(path, params.aclOptions) + err = botfs.VerifyLegacyACL(path, params.aclOptions) //nolint:staticcheck // staticcheck doesn't like nop implementations in fs_other.go if err != nil && (currentUser.Uid == RootUID || currentUser.Uid == params.ownerUser.Uid) { if verboseLogging { @@ -271,7 +271,7 @@ func ensurePermissions( ) } - return trace.Wrap(botfs.ConfigureACL(path, params.ownerUser, params.aclOptions)) + return trace.Wrap(botfs.ConfigureLegacyACL(path, params.ownerUser, params.aclOptions)) } else if err != nil { log.ErrorContext( ctx, From 63ac9101bb24187c2dc9f71db305839aa208dfc8 Mon Sep 17 00:00:00 2001 From: Trent Clarke Date: Thu, 24 Oct 2024 13:19:45 +1100 Subject: [PATCH 43/70] Adds Identity Center account assignments to role conditions (#47793) * Adds Identity Center account assignments to role conditions * Update types.proto * Review fixups * Updates operator resources * Add generated docs * Terraform doc updates --- api/proto/teleport/legacy/types/types.proto | 14 + api/types/types.pb.go | 4371 +++++++++-------- .../resources.teleport.dev_roles.mdx | 32 + .../resources.teleport.dev_rolesv6.mdx | 16 + .../resources.teleport.dev_rolesv7.mdx | 16 + .../terraform-provider/data-sources/role.mdx | 18 + .../terraform-provider/resources/role.mdx | 18 + .../resources.teleport.dev_roles.yaml | 44 + .../resources.teleport.dev_rolesv6.yaml | 22 + .../resources.teleport.dev_rolesv7.yaml | 22 + .../bases/resources.teleport.dev_roles.yaml | 44 + .../bases/resources.teleport.dev_rolesv6.yaml | 22 + .../bases/resources.teleport.dev_rolesv7.yaml | 22 + .../terraform/tfschema/types_terraform.go | 356 ++ 14 files changed, 2974 insertions(+), 2043 deletions(-) diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index cf5042e3b21c6..452fa091a0123 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -3248,6 +3248,20 @@ message RoleConditions { reserved "SAMLIdPServiceProviderLabels"; reserved 41; // removed saml_idp_service_provider_labels_expression in favor of using app_labels_expression. reserved "SAMLIdPServiceProviderLabelsExpression"; + + // AccountAssignments holds the list of account assignments affected by this + // condition. + repeated IdentityCenterAccountAssignment AccountAssignments = 42 [ + (gogoproto.nullable) = false, + (gogoproto.jsontag) = "account_assignments,omitempty" + ]; +} + +// IdentityCenterAccountAssignment captures an AWS Identity Center account +// assignment (acccount + permission set) pair. +message IdentityCenterAccountAssignment { + string PermissionSet = 1 [(gogoproto.jsontag) = "permission_set,omitempty"]; + string Account = 2 [(gogoproto.jsontag) = "account,omitempty"]; } // SPIFFERoleCondition sets out which SPIFFE identities this role is allowed or diff --git a/api/types/types.pb.go b/api/types/types.pb.go index ffcd029a4f18e..364ed5f11124b 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -1124,7 +1124,7 @@ func (x ConnectionDiagnosticTrace_TraceType) String() string { } func (ConnectionDiagnosticTrace_TraceType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{250, 0} + return fileDescriptor_9198ee693835762e, []int{251, 0} } // StatusType describes whether this was a success or a failure. @@ -1153,7 +1153,7 @@ func (x ConnectionDiagnosticTrace_StatusType) String() string { } func (ConnectionDiagnosticTrace_StatusType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{250, 1} + return fileDescriptor_9198ee693835762e, []int{251, 1} } // OktaAssignmentStatus represents the status of an Okta assignment. @@ -1193,7 +1193,7 @@ func (x OktaAssignmentSpecV1_OktaAssignmentStatus) String() string { } func (OktaAssignmentSpecV1_OktaAssignmentStatus) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{325, 0} + return fileDescriptor_9198ee693835762e, []int{326, 0} } // OktaAssignmentTargetType is the type of Okta object that an assignment is targeting. @@ -1225,7 +1225,7 @@ func (x OktaAssignmentTargetV1_OktaAssignmentTargetType) String() string { } func (OktaAssignmentTargetV1_OktaAssignmentTargetType) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{326, 0} + return fileDescriptor_9198ee693835762e, []int{327, 0} } type KeepAlive struct { @@ -8142,10 +8142,13 @@ type RoleConditions struct { DatabasePermissions []DatabasePermission `protobuf:"bytes,38,rep,name=DatabasePermissions,proto3" json:"db_permissions,omitempty"` // SPIFFE is used to allow or deny access to a role holder to generating a // SPIFFE SVID. - SPIFFE []*SPIFFERoleCondition `protobuf:"bytes,39,rep,name=SPIFFE,proto3" json:"spiffe,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + SPIFFE []*SPIFFERoleCondition `protobuf:"bytes,39,rep,name=SPIFFE,proto3" json:"spiffe,omitempty"` + // AccountAssignments holds the list of account assignments affected by this + // condition. + AccountAssignments []IdentityCenterAccountAssignment `protobuf:"bytes,42,rep,name=AccountAssignments,proto3" json:"account_assignments,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *RoleConditions) Reset() { *m = RoleConditions{} } @@ -8181,6 +8184,49 @@ func (m *RoleConditions) XXX_DiscardUnknown() { var xxx_messageInfo_RoleConditions proto.InternalMessageInfo +// IdentityCenterAccountAssignment captures an AWS Identity Center account +// assignment (acccount + permission set) pair. +type IdentityCenterAccountAssignment struct { + PermissionSet string `protobuf:"bytes,1,opt,name=PermissionSet,proto3" json:"permission_set,omitempty"` + Account string `protobuf:"bytes,2,opt,name=Account,proto3" json:"account,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *IdentityCenterAccountAssignment) Reset() { *m = IdentityCenterAccountAssignment{} } +func (m *IdentityCenterAccountAssignment) String() string { return proto.CompactTextString(m) } +func (*IdentityCenterAccountAssignment) ProtoMessage() {} +func (*IdentityCenterAccountAssignment) Descriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{120} +} +func (m *IdentityCenterAccountAssignment) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *IdentityCenterAccountAssignment) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_IdentityCenterAccountAssignment.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 *IdentityCenterAccountAssignment) XXX_Merge(src proto.Message) { + xxx_messageInfo_IdentityCenterAccountAssignment.Merge(m, src) +} +func (m *IdentityCenterAccountAssignment) XXX_Size() int { + return m.Size() +} +func (m *IdentityCenterAccountAssignment) XXX_DiscardUnknown() { + xxx_messageInfo_IdentityCenterAccountAssignment.DiscardUnknown(m) +} + +var xxx_messageInfo_IdentityCenterAccountAssignment proto.InternalMessageInfo + // SPIFFERoleCondition sets out which SPIFFE identities this role is allowed or // denied to generate. The Path matcher is required, and is evaluated first. If, // the Path does not match then the other matcher fields are not evaluated. @@ -8228,7 +8274,7 @@ func (m *SPIFFERoleCondition) Reset() { *m = SPIFFERoleCondition{} } func (m *SPIFFERoleCondition) String() string { return proto.CompactTextString(m) } func (*SPIFFERoleCondition) ProtoMessage() {} func (*SPIFFERoleCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{120} + return fileDescriptor_9198ee693835762e, []int{121} } func (m *SPIFFERoleCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8272,7 +8318,7 @@ func (m *DatabasePermission) Reset() { *m = DatabasePermission{} } func (m *DatabasePermission) String() string { return proto.CompactTextString(m) } func (*DatabasePermission) ProtoMessage() {} func (*DatabasePermission) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{121} + return fileDescriptor_9198ee693835762e, []int{122} } func (m *DatabasePermission) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8323,7 +8369,7 @@ func (m *KubernetesResource) Reset() { *m = KubernetesResource{} } func (m *KubernetesResource) String() string { return proto.CompactTextString(m) } func (*KubernetesResource) ProtoMessage() {} func (*KubernetesResource) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{122} + return fileDescriptor_9198ee693835762e, []int{123} } func (m *KubernetesResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8376,7 +8422,7 @@ func (m *SessionRequirePolicy) Reset() { *m = SessionRequirePolicy{} } func (m *SessionRequirePolicy) String() string { return proto.CompactTextString(m) } func (*SessionRequirePolicy) ProtoMessage() {} func (*SessionRequirePolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{123} + return fileDescriptor_9198ee693835762e, []int{124} } func (m *SessionRequirePolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8424,7 +8470,7 @@ func (m *SessionJoinPolicy) Reset() { *m = SessionJoinPolicy{} } func (m *SessionJoinPolicy) String() string { return proto.CompactTextString(m) } func (*SessionJoinPolicy) ProtoMessage() {} func (*SessionJoinPolicy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{124} + return fileDescriptor_9198ee693835762e, []int{125} } func (m *SessionJoinPolicy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8493,7 +8539,7 @@ func (m *AccessRequestConditions) Reset() { *m = AccessRequestConditions func (m *AccessRequestConditions) String() string { return proto.CompactTextString(m) } func (*AccessRequestConditions) ProtoMessage() {} func (*AccessRequestConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{125} + return fileDescriptor_9198ee693835762e, []int{126} } func (m *AccessRequestConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8546,7 +8592,7 @@ func (m *AccessReviewConditions) Reset() { *m = AccessReviewConditions{} func (m *AccessReviewConditions) String() string { return proto.CompactTextString(m) } func (*AccessReviewConditions) ProtoMessage() {} func (*AccessReviewConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{126} + return fileDescriptor_9198ee693835762e, []int{127} } func (m *AccessReviewConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8588,7 +8634,7 @@ func (m *AccessRequestAllowedPromotion) Reset() { *m = AccessRequestAllo func (m *AccessRequestAllowedPromotion) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotion) ProtoMessage() {} func (*AccessRequestAllowedPromotion) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{127} + return fileDescriptor_9198ee693835762e, []int{128} } func (m *AccessRequestAllowedPromotion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8631,7 +8677,7 @@ func (m *AccessRequestAllowedPromotions) Reset() { *m = AccessRequestAll func (m *AccessRequestAllowedPromotions) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotions) ProtoMessage() {} func (*AccessRequestAllowedPromotions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{128} + return fileDescriptor_9198ee693835762e, []int{129} } func (m *AccessRequestAllowedPromotions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8677,7 +8723,7 @@ func (m *ClaimMapping) Reset() { *m = ClaimMapping{} } func (m *ClaimMapping) String() string { return proto.CompactTextString(m) } func (*ClaimMapping) ProtoMessage() {} func (*ClaimMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{129} + return fileDescriptor_9198ee693835762e, []int{130} } func (m *ClaimMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8723,7 +8769,7 @@ func (m *TraitMapping) Reset() { *m = TraitMapping{} } func (m *TraitMapping) String() string { return proto.CompactTextString(m) } func (*TraitMapping) ProtoMessage() {} func (*TraitMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{130} + return fileDescriptor_9198ee693835762e, []int{131} } func (m *TraitMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8772,7 +8818,7 @@ func (m *Rule) Reset() { *m = Rule{} } func (m *Rule) String() string { return proto.CompactTextString(m) } func (*Rule) ProtoMessage() {} func (*Rule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{131} + return fileDescriptor_9198ee693835762e, []int{132} } func (m *Rule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8820,7 +8866,7 @@ func (m *ImpersonateConditions) Reset() { *m = ImpersonateConditions{} } func (m *ImpersonateConditions) String() string { return proto.CompactTextString(m) } func (*ImpersonateConditions) ProtoMessage() {} func (*ImpersonateConditions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{132} + return fileDescriptor_9198ee693835762e, []int{133} } func (m *ImpersonateConditions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8862,7 +8908,7 @@ func (m *BoolValue) Reset() { *m = BoolValue{} } func (m *BoolValue) String() string { return proto.CompactTextString(m) } func (*BoolValue) ProtoMessage() {} func (*BoolValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{133} + return fileDescriptor_9198ee693835762e, []int{134} } func (m *BoolValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8904,7 +8950,7 @@ func (m *UserFilter) Reset() { *m = UserFilter{} } func (m *UserFilter) String() string { return proto.CompactTextString(m) } func (*UserFilter) ProtoMessage() {} func (*UserFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{134} + return fileDescriptor_9198ee693835762e, []int{135} } func (m *UserFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8955,7 +9001,7 @@ type UserV2 struct { func (m *UserV2) Reset() { *m = UserV2{} } func (*UserV2) ProtoMessage() {} func (*UserV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{135} + return fileDescriptor_9198ee693835762e, []int{136} } func (m *UserV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9004,7 +9050,7 @@ func (m *UserStatusV2) Reset() { *m = UserStatusV2{} } func (m *UserStatusV2) String() string { return proto.CompactTextString(m) } func (*UserStatusV2) ProtoMessage() {} func (*UserStatusV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{136} + return fileDescriptor_9198ee693835762e, []int{137} } func (m *UserStatusV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9078,7 +9124,7 @@ func (m *UserSpecV2) Reset() { *m = UserSpecV2{} } func (m *UserSpecV2) String() string { return proto.CompactTextString(m) } func (*UserSpecV2) ProtoMessage() {} func (*UserSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{137} + return fileDescriptor_9198ee693835762e, []int{138} } func (m *UserSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9125,7 +9171,7 @@ type ExternalIdentity struct { func (m *ExternalIdentity) Reset() { *m = ExternalIdentity{} } func (*ExternalIdentity) ProtoMessage() {} func (*ExternalIdentity) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{138} + return fileDescriptor_9198ee693835762e, []int{139} } func (m *ExternalIdentity) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9173,7 +9219,7 @@ func (m *LoginStatus) Reset() { *m = LoginStatus{} } func (m *LoginStatus) String() string { return proto.CompactTextString(m) } func (*LoginStatus) ProtoMessage() {} func (*LoginStatus) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{139} + return fileDescriptor_9198ee693835762e, []int{140} } func (m *LoginStatus) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9218,7 +9264,7 @@ type CreatedBy struct { func (m *CreatedBy) Reset() { *m = CreatedBy{} } func (*CreatedBy) ProtoMessage() {} func (*CreatedBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{140} + return fileDescriptor_9198ee693835762e, []int{141} } func (m *CreatedBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9267,7 +9313,7 @@ func (m *LocalAuthSecrets) Reset() { *m = LocalAuthSecrets{} } func (m *LocalAuthSecrets) String() string { return proto.CompactTextString(m) } func (*LocalAuthSecrets) ProtoMessage() {} func (*LocalAuthSecrets) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{141} + return fileDescriptor_9198ee693835762e, []int{142} } func (m *LocalAuthSecrets) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9324,7 +9370,7 @@ func (m *MFADevice) Reset() { *m = MFADevice{} } func (m *MFADevice) String() string { return proto.CompactTextString(m) } func (*MFADevice) ProtoMessage() {} func (*MFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{142} + return fileDescriptor_9198ee693835762e, []int{143} } func (m *MFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9434,7 +9480,7 @@ func (m *TOTPDevice) Reset() { *m = TOTPDevice{} } func (m *TOTPDevice) String() string { return proto.CompactTextString(m) } func (*TOTPDevice) ProtoMessage() {} func (*TOTPDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{143} + return fileDescriptor_9198ee693835762e, []int{144} } func (m *TOTPDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9480,7 +9526,7 @@ func (m *U2FDevice) Reset() { *m = U2FDevice{} } func (m *U2FDevice) String() string { return proto.CompactTextString(m) } func (*U2FDevice) ProtoMessage() {} func (*U2FDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{144} + return fileDescriptor_9198ee693835762e, []int{145} } func (m *U2FDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9562,7 +9608,7 @@ func (m *WebauthnDevice) Reset() { *m = WebauthnDevice{} } func (m *WebauthnDevice) String() string { return proto.CompactTextString(m) } func (*WebauthnDevice) ProtoMessage() {} func (*WebauthnDevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{145} + return fileDescriptor_9198ee693835762e, []int{146} } func (m *WebauthnDevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9606,7 +9652,7 @@ func (m *SSOMFADevice) Reset() { *m = SSOMFADevice{} } func (m *SSOMFADevice) String() string { return proto.CompactTextString(m) } func (*SSOMFADevice) ProtoMessage() {} func (*SSOMFADevice) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{146} + return fileDescriptor_9198ee693835762e, []int{147} } func (m *SSOMFADevice) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9649,7 +9695,7 @@ func (m *WebauthnLocalAuth) Reset() { *m = WebauthnLocalAuth{} } func (m *WebauthnLocalAuth) String() string { return proto.CompactTextString(m) } func (*WebauthnLocalAuth) ProtoMessage() {} func (*WebauthnLocalAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{147} + return fileDescriptor_9198ee693835762e, []int{148} } func (m *WebauthnLocalAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9695,7 +9741,7 @@ func (m *ConnectorRef) Reset() { *m = ConnectorRef{} } func (m *ConnectorRef) String() string { return proto.CompactTextString(m) } func (*ConnectorRef) ProtoMessage() {} func (*ConnectorRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{148} + return fileDescriptor_9198ee693835762e, []int{149} } func (m *ConnectorRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9737,7 +9783,7 @@ func (m *UserRef) Reset() { *m = UserRef{} } func (m *UserRef) String() string { return proto.CompactTextString(m) } func (*UserRef) ProtoMessage() {} func (*UserRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{149} + return fileDescriptor_9198ee693835762e, []int{150} } func (m *UserRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9787,7 +9833,7 @@ func (m *ReverseTunnelV2) Reset() { *m = ReverseTunnelV2{} } func (m *ReverseTunnelV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelV2) ProtoMessage() {} func (*ReverseTunnelV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{150} + return fileDescriptor_9198ee693835762e, []int{151} } func (m *ReverseTunnelV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9834,7 +9880,7 @@ func (m *ReverseTunnelSpecV2) Reset() { *m = ReverseTunnelSpecV2{} } func (m *ReverseTunnelSpecV2) String() string { return proto.CompactTextString(m) } func (*ReverseTunnelSpecV2) ProtoMessage() {} func (*ReverseTunnelSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{151} + return fileDescriptor_9198ee693835762e, []int{152} } func (m *ReverseTunnelSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9883,7 +9929,7 @@ type TunnelConnectionV2 struct { func (m *TunnelConnectionV2) Reset() { *m = TunnelConnectionV2{} } func (*TunnelConnectionV2) ProtoMessage() {} func (*TunnelConnectionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{152} + return fileDescriptor_9198ee693835762e, []int{153} } func (m *TunnelConnectionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9931,7 +9977,7 @@ func (m *TunnelConnectionSpecV2) Reset() { *m = TunnelConnectionSpecV2{} func (m *TunnelConnectionSpecV2) String() string { return proto.CompactTextString(m) } func (*TunnelConnectionSpecV2) ProtoMessage() {} func (*TunnelConnectionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{153} + return fileDescriptor_9198ee693835762e, []int{154} } func (m *TunnelConnectionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9979,7 +10025,7 @@ func (m *SemaphoreFilter) Reset() { *m = SemaphoreFilter{} } func (m *SemaphoreFilter) String() string { return proto.CompactTextString(m) } func (*SemaphoreFilter) ProtoMessage() {} func (*SemaphoreFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{154} + return fileDescriptor_9198ee693835762e, []int{155} } func (m *SemaphoreFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10030,7 +10076,7 @@ func (m *AcquireSemaphoreRequest) Reset() { *m = AcquireSemaphoreRequest func (m *AcquireSemaphoreRequest) String() string { return proto.CompactTextString(m) } func (*AcquireSemaphoreRequest) ProtoMessage() {} func (*AcquireSemaphoreRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{155} + return fileDescriptor_9198ee693835762e, []int{156} } func (m *AcquireSemaphoreRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10078,7 +10124,7 @@ func (m *SemaphoreLease) Reset() { *m = SemaphoreLease{} } func (m *SemaphoreLease) String() string { return proto.CompactTextString(m) } func (*SemaphoreLease) ProtoMessage() {} func (*SemaphoreLease) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{156} + return fileDescriptor_9198ee693835762e, []int{157} } func (m *SemaphoreLease) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10124,7 +10170,7 @@ func (m *SemaphoreLeaseRef) Reset() { *m = SemaphoreLeaseRef{} } func (m *SemaphoreLeaseRef) String() string { return proto.CompactTextString(m) } func (*SemaphoreLeaseRef) ProtoMessage() {} func (*SemaphoreLeaseRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{157} + return fileDescriptor_9198ee693835762e, []int{158} } func (m *SemaphoreLeaseRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10173,7 +10219,7 @@ type SemaphoreV3 struct { func (m *SemaphoreV3) Reset() { *m = SemaphoreV3{} } func (*SemaphoreV3) ProtoMessage() {} func (*SemaphoreV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{158} + return fileDescriptor_9198ee693835762e, []int{159} } func (m *SemaphoreV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10215,7 +10261,7 @@ func (m *SemaphoreSpecV3) Reset() { *m = SemaphoreSpecV3{} } func (m *SemaphoreSpecV3) String() string { return proto.CompactTextString(m) } func (*SemaphoreSpecV3) ProtoMessage() {} func (*SemaphoreSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{159} + return fileDescriptor_9198ee693835762e, []int{160} } func (m *SemaphoreSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10264,7 +10310,7 @@ type WebSessionV2 struct { func (m *WebSessionV2) Reset() { *m = WebSessionV2{} } func (*WebSessionV2) ProtoMessage() {} func (*WebSessionV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{160} + return fileDescriptor_9198ee693835762e, []int{161} } func (m *WebSessionV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10349,7 +10395,7 @@ func (m *WebSessionSpecV2) Reset() { *m = WebSessionSpecV2{} } func (m *WebSessionSpecV2) String() string { return proto.CompactTextString(m) } func (*WebSessionSpecV2) ProtoMessage() {} func (*WebSessionSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{161} + return fileDescriptor_9198ee693835762e, []int{162} } func (m *WebSessionSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10394,7 +10440,7 @@ func (m *DeviceWebToken) Reset() { *m = DeviceWebToken{} } func (m *DeviceWebToken) String() string { return proto.CompactTextString(m) } func (*DeviceWebToken) ProtoMessage() {} func (*DeviceWebToken) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{162} + return fileDescriptor_9198ee693835762e, []int{163} } func (m *DeviceWebToken) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10436,7 +10482,7 @@ func (m *WebSessionFilter) Reset() { *m = WebSessionFilter{} } func (m *WebSessionFilter) String() string { return proto.CompactTextString(m) } func (*WebSessionFilter) ProtoMessage() {} func (*WebSessionFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{163} + return fileDescriptor_9198ee693835762e, []int{164} } func (m *WebSessionFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10507,7 +10553,7 @@ func (m *SAMLSessionData) Reset() { *m = SAMLSessionData{} } func (m *SAMLSessionData) String() string { return proto.CompactTextString(m) } func (*SAMLSessionData) ProtoMessage() {} func (*SAMLSessionData) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{164} + return fileDescriptor_9198ee693835762e, []int{165} } func (m *SAMLSessionData) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10556,7 +10602,7 @@ func (m *SAMLAttribute) Reset() { *m = SAMLAttribute{} } func (m *SAMLAttribute) String() string { return proto.CompactTextString(m) } func (*SAMLAttribute) ProtoMessage() {} func (*SAMLAttribute) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{165} + return fileDescriptor_9198ee693835762e, []int{166} } func (m *SAMLAttribute) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10603,7 +10649,7 @@ func (m *SAMLAttributeValue) Reset() { *m = SAMLAttributeValue{} } func (m *SAMLAttributeValue) String() string { return proto.CompactTextString(m) } func (*SAMLAttributeValue) ProtoMessage() {} func (*SAMLAttributeValue) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{166} + return fileDescriptor_9198ee693835762e, []int{167} } func (m *SAMLAttributeValue) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10654,7 +10700,7 @@ func (m *SAMLNameID) Reset() { *m = SAMLNameID{} } func (m *SAMLNameID) String() string { return proto.CompactTextString(m) } func (*SAMLNameID) ProtoMessage() {} func (*SAMLNameID) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{167} + return fileDescriptor_9198ee693835762e, []int{168} } func (m *SAMLNameID) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10703,7 +10749,7 @@ type RemoteClusterV3 struct { func (m *RemoteClusterV3) Reset() { *m = RemoteClusterV3{} } func (*RemoteClusterV3) ProtoMessage() {} func (*RemoteClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{168} + return fileDescriptor_9198ee693835762e, []int{169} } func (m *RemoteClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10747,7 +10793,7 @@ func (m *RemoteClusterStatusV3) Reset() { *m = RemoteClusterStatusV3{} } func (m *RemoteClusterStatusV3) String() string { return proto.CompactTextString(m) } func (*RemoteClusterStatusV3) ProtoMessage() {} func (*RemoteClusterStatusV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{169} + return fileDescriptor_9198ee693835762e, []int{170} } func (m *RemoteClusterStatusV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10797,7 +10843,7 @@ func (m *KubernetesCluster) Reset() { *m = KubernetesCluster{} } func (m *KubernetesCluster) String() string { return proto.CompactTextString(m) } func (*KubernetesCluster) ProtoMessage() {} func (*KubernetesCluster) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{170} + return fileDescriptor_9198ee693835762e, []int{171} } func (m *KubernetesCluster) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10846,7 +10892,7 @@ type KubernetesClusterV3 struct { func (m *KubernetesClusterV3) Reset() { *m = KubernetesClusterV3{} } func (*KubernetesClusterV3) ProtoMessage() {} func (*KubernetesClusterV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{171} + return fileDescriptor_9198ee693835762e, []int{172} } func (m *KubernetesClusterV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10897,7 +10943,7 @@ func (m *KubernetesClusterSpecV3) Reset() { *m = KubernetesClusterSpecV3 func (m *KubernetesClusterSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterSpecV3) ProtoMessage() {} func (*KubernetesClusterSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{172} + return fileDescriptor_9198ee693835762e, []int{173} } func (m *KubernetesClusterSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10945,7 +10991,7 @@ func (m *KubeAzure) Reset() { *m = KubeAzure{} } func (m *KubeAzure) String() string { return proto.CompactTextString(m) } func (*KubeAzure) ProtoMessage() {} func (*KubeAzure) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{173} + return fileDescriptor_9198ee693835762e, []int{174} } func (m *KubeAzure) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10991,7 +11037,7 @@ func (m *KubeAWS) Reset() { *m = KubeAWS{} } func (m *KubeAWS) String() string { return proto.CompactTextString(m) } func (*KubeAWS) ProtoMessage() {} func (*KubeAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{174} + return fileDescriptor_9198ee693835762e, []int{175} } func (m *KubeAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11037,7 +11083,7 @@ func (m *KubeGCP) Reset() { *m = KubeGCP{} } func (m *KubeGCP) String() string { return proto.CompactTextString(m) } func (*KubeGCP) ProtoMessage() {} func (*KubeGCP) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{175} + return fileDescriptor_9198ee693835762e, []int{176} } func (m *KubeGCP) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11079,7 +11125,7 @@ func (m *KubernetesClusterV3List) Reset() { *m = KubernetesClusterV3List func (m *KubernetesClusterV3List) String() string { return proto.CompactTextString(m) } func (*KubernetesClusterV3List) ProtoMessage() {} func (*KubernetesClusterV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{176} + return fileDescriptor_9198ee693835762e, []int{177} } func (m *KubernetesClusterV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11128,7 +11174,7 @@ type KubernetesServerV3 struct { func (m *KubernetesServerV3) Reset() { *m = KubernetesServerV3{} } func (*KubernetesServerV3) ProtoMessage() {} func (*KubernetesServerV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{177} + return fileDescriptor_9198ee693835762e, []int{178} } func (m *KubernetesServerV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11180,7 +11226,7 @@ func (m *KubernetesServerSpecV3) Reset() { *m = KubernetesServerSpecV3{} func (m *KubernetesServerSpecV3) String() string { return proto.CompactTextString(m) } func (*KubernetesServerSpecV3) ProtoMessage() {} func (*KubernetesServerSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{178} + return fileDescriptor_9198ee693835762e, []int{179} } func (m *KubernetesServerSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11232,7 +11278,7 @@ type WebTokenV3 struct { func (m *WebTokenV3) Reset() { *m = WebTokenV3{} } func (*WebTokenV3) ProtoMessage() {} func (*WebTokenV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{179} + return fileDescriptor_9198ee693835762e, []int{180} } func (m *WebTokenV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11276,7 +11322,7 @@ func (m *WebTokenSpecV3) Reset() { *m = WebTokenSpecV3{} } func (m *WebTokenSpecV3) String() string { return proto.CompactTextString(m) } func (*WebTokenSpecV3) ProtoMessage() {} func (*WebTokenSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{180} + return fileDescriptor_9198ee693835762e, []int{181} } func (m *WebTokenSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11320,7 +11366,7 @@ func (m *GetWebSessionRequest) Reset() { *m = GetWebSessionRequest{} } func (m *GetWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*GetWebSessionRequest) ProtoMessage() {} func (*GetWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{181} + return fileDescriptor_9198ee693835762e, []int{182} } func (m *GetWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11364,7 +11410,7 @@ func (m *DeleteWebSessionRequest) Reset() { *m = DeleteWebSessionRequest func (m *DeleteWebSessionRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebSessionRequest) ProtoMessage() {} func (*DeleteWebSessionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{182} + return fileDescriptor_9198ee693835762e, []int{183} } func (m *DeleteWebSessionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11408,7 +11454,7 @@ func (m *GetWebTokenRequest) Reset() { *m = GetWebTokenRequest{} } func (m *GetWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetWebTokenRequest) ProtoMessage() {} func (*GetWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{183} + return fileDescriptor_9198ee693835762e, []int{184} } func (m *GetWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11452,7 +11498,7 @@ func (m *DeleteWebTokenRequest) Reset() { *m = DeleteWebTokenRequest{} } func (m *DeleteWebTokenRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWebTokenRequest) ProtoMessage() {} func (*DeleteWebTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{184} + return fileDescriptor_9198ee693835762e, []int{185} } func (m *DeleteWebTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11494,7 +11540,7 @@ func (m *ResourceRequest) Reset() { *m = ResourceRequest{} } func (m *ResourceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceRequest) ProtoMessage() {} func (*ResourceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{185} + return fileDescriptor_9198ee693835762e, []int{186} } func (m *ResourceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11538,7 +11584,7 @@ func (m *ResourceWithSecretsRequest) Reset() { *m = ResourceWithSecretsR func (m *ResourceWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourceWithSecretsRequest) ProtoMessage() {} func (*ResourceWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{186} + return fileDescriptor_9198ee693835762e, []int{187} } func (m *ResourceWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11580,7 +11626,7 @@ func (m *ResourcesWithSecretsRequest) Reset() { *m = ResourcesWithSecret func (m *ResourcesWithSecretsRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesWithSecretsRequest) ProtoMessage() {} func (*ResourcesWithSecretsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{187} + return fileDescriptor_9198ee693835762e, []int{188} } func (m *ResourcesWithSecretsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11624,7 +11670,7 @@ func (m *ResourceInNamespaceRequest) Reset() { *m = ResourceInNamespaceR func (m *ResourceInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourceInNamespaceRequest) ProtoMessage() {} func (*ResourceInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{188} + return fileDescriptor_9198ee693835762e, []int{189} } func (m *ResourceInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11666,7 +11712,7 @@ func (m *ResourcesInNamespaceRequest) Reset() { *m = ResourcesInNamespac func (m *ResourcesInNamespaceRequest) String() string { return proto.CompactTextString(m) } func (*ResourcesInNamespaceRequest) ProtoMessage() {} func (*ResourcesInNamespaceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{189} + return fileDescriptor_9198ee693835762e, []int{190} } func (m *ResourcesInNamespaceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11717,7 +11763,7 @@ func (m *OIDCConnectorV3) Reset() { *m = OIDCConnectorV3{} } func (m *OIDCConnectorV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3) ProtoMessage() {} func (*OIDCConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{190} + return fileDescriptor_9198ee693835762e, []int{191} } func (m *OIDCConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11759,7 +11805,7 @@ func (m *OIDCConnectorV3List) Reset() { *m = OIDCConnectorV3List{} } func (m *OIDCConnectorV3List) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorV3List) ProtoMessage() {} func (*OIDCConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{191} + return fileDescriptor_9198ee693835762e, []int{192} } func (m *OIDCConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11847,7 +11893,7 @@ func (m *OIDCConnectorSpecV3) Reset() { *m = OIDCConnectorSpecV3{} } func (m *OIDCConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorSpecV3) ProtoMessage() {} func (*OIDCConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{192} + return fileDescriptor_9198ee693835762e, []int{193} } func (m *OIDCConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11889,7 +11935,7 @@ func (m *MaxAge) Reset() { *m = MaxAge{} } func (m *MaxAge) String() string { return proto.CompactTextString(m) } func (*MaxAge) ProtoMessage() {} func (*MaxAge) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{193} + return fileDescriptor_9198ee693835762e, []int{194} } func (m *MaxAge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11934,7 +11980,7 @@ func (m *SSOClientRedirectSettings) Reset() { *m = SSOClientRedirectSett func (m *SSOClientRedirectSettings) String() string { return proto.CompactTextString(m) } func (*SSOClientRedirectSettings) ProtoMessage() {} func (*SSOClientRedirectSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{194} + return fileDescriptor_9198ee693835762e, []int{195} } func (m *SSOClientRedirectSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11991,7 +12037,7 @@ func (m *OIDCConnectorMFASettings) Reset() { *m = OIDCConnectorMFASettin func (m *OIDCConnectorMFASettings) String() string { return proto.CompactTextString(m) } func (*OIDCConnectorMFASettings) ProtoMessage() {} func (*OIDCConnectorMFASettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{195} + return fileDescriptor_9198ee693835762e, []int{196} } func (m *OIDCConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12093,7 +12139,7 @@ func (m *OIDCAuthRequest) Reset() { *m = OIDCAuthRequest{} } func (m *OIDCAuthRequest) String() string { return proto.CompactTextString(m) } func (*OIDCAuthRequest) ProtoMessage() {} func (*OIDCAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{196} + return fileDescriptor_9198ee693835762e, []int{197} } func (m *OIDCAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12144,7 +12190,7 @@ func (m *SAMLConnectorV2) Reset() { *m = SAMLConnectorV2{} } func (m *SAMLConnectorV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2) ProtoMessage() {} func (*SAMLConnectorV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{197} + return fileDescriptor_9198ee693835762e, []int{198} } func (m *SAMLConnectorV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12186,7 +12232,7 @@ func (m *SAMLConnectorV2List) Reset() { *m = SAMLConnectorV2List{} } func (m *SAMLConnectorV2List) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorV2List) ProtoMessage() {} func (*SAMLConnectorV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{198} + return fileDescriptor_9198ee693835762e, []int{199} } func (m *SAMLConnectorV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12268,7 +12314,7 @@ func (m *SAMLConnectorSpecV2) Reset() { *m = SAMLConnectorSpecV2{} } func (m *SAMLConnectorSpecV2) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorSpecV2) ProtoMessage() {} func (*SAMLConnectorSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{199} + return fileDescriptor_9198ee693835762e, []int{200} } func (m *SAMLConnectorSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12327,7 +12373,7 @@ func (m *SAMLConnectorMFASettings) Reset() { *m = SAMLConnectorMFASettin func (m *SAMLConnectorMFASettings) String() string { return proto.CompactTextString(m) } func (*SAMLConnectorMFASettings) ProtoMessage() {} func (*SAMLConnectorMFASettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{200} + return fileDescriptor_9198ee693835762e, []int{201} } func (m *SAMLConnectorMFASettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12423,7 +12469,7 @@ func (m *SAMLAuthRequest) Reset() { *m = SAMLAuthRequest{} } func (m *SAMLAuthRequest) String() string { return proto.CompactTextString(m) } func (*SAMLAuthRequest) ProtoMessage() {} func (*SAMLAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{201} + return fileDescriptor_9198ee693835762e, []int{202} } func (m *SAMLAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12469,7 +12515,7 @@ func (m *AttributeMapping) Reset() { *m = AttributeMapping{} } func (m *AttributeMapping) String() string { return proto.CompactTextString(m) } func (*AttributeMapping) ProtoMessage() {} func (*AttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{202} + return fileDescriptor_9198ee693835762e, []int{203} } func (m *AttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12514,7 +12560,7 @@ func (m *AsymmetricKeyPair) Reset() { *m = AsymmetricKeyPair{} } func (m *AsymmetricKeyPair) String() string { return proto.CompactTextString(m) } func (*AsymmetricKeyPair) ProtoMessage() {} func (*AsymmetricKeyPair) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{203} + return fileDescriptor_9198ee693835762e, []int{204} } func (m *AsymmetricKeyPair) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12565,7 +12611,7 @@ func (m *GithubConnectorV3) Reset() { *m = GithubConnectorV3{} } func (m *GithubConnectorV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3) ProtoMessage() {} func (*GithubConnectorV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{204} + return fileDescriptor_9198ee693835762e, []int{205} } func (m *GithubConnectorV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12607,7 +12653,7 @@ func (m *GithubConnectorV3List) Reset() { *m = GithubConnectorV3List{} } func (m *GithubConnectorV3List) String() string { return proto.CompactTextString(m) } func (*GithubConnectorV3List) ProtoMessage() {} func (*GithubConnectorV3List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{205} + return fileDescriptor_9198ee693835762e, []int{206} } func (m *GithubConnectorV3List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12670,7 +12716,7 @@ func (m *GithubConnectorSpecV3) Reset() { *m = GithubConnectorSpecV3{} } func (m *GithubConnectorSpecV3) String() string { return proto.CompactTextString(m) } func (*GithubConnectorSpecV3) ProtoMessage() {} func (*GithubConnectorSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{206} + return fileDescriptor_9198ee693835762e, []int{207} } func (m *GithubConnectorSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12763,7 +12809,7 @@ func (m *GithubAuthRequest) Reset() { *m = GithubAuthRequest{} } func (m *GithubAuthRequest) String() string { return proto.CompactTextString(m) } func (*GithubAuthRequest) ProtoMessage() {} func (*GithubAuthRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{207} + return fileDescriptor_9198ee693835762e, []int{208} } func (m *GithubAuthRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12807,7 +12853,7 @@ func (m *SSOWarnings) Reset() { *m = SSOWarnings{} } func (m *SSOWarnings) String() string { return proto.CompactTextString(m) } func (*SSOWarnings) ProtoMessage() {} func (*SSOWarnings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{208} + return fileDescriptor_9198ee693835762e, []int{209} } func (m *SSOWarnings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12863,7 +12909,7 @@ func (m *CreateUserParams) Reset() { *m = CreateUserParams{} } func (m *CreateUserParams) String() string { return proto.CompactTextString(m) } func (*CreateUserParams) ProtoMessage() {} func (*CreateUserParams) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{209} + return fileDescriptor_9198ee693835762e, []int{210} } func (m *CreateUserParams) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12948,7 +12994,7 @@ func (m *SSODiagnosticInfo) Reset() { *m = SSODiagnosticInfo{} } func (m *SSODiagnosticInfo) String() string { return proto.CompactTextString(m) } func (*SSODiagnosticInfo) ProtoMessage() {} func (*SSODiagnosticInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{210} + return fileDescriptor_9198ee693835762e, []int{211} } func (m *SSODiagnosticInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12992,7 +13038,7 @@ func (m *GithubTokenInfo) Reset() { *m = GithubTokenInfo{} } func (m *GithubTokenInfo) String() string { return proto.CompactTextString(m) } func (*GithubTokenInfo) ProtoMessage() {} func (*GithubTokenInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{211} + return fileDescriptor_9198ee693835762e, []int{212} } func (m *GithubTokenInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13038,7 +13084,7 @@ func (m *GithubClaims) Reset() { *m = GithubClaims{} } func (m *GithubClaims) String() string { return proto.CompactTextString(m) } func (*GithubClaims) ProtoMessage() {} func (*GithubClaims) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{212} + return fileDescriptor_9198ee693835762e, []int{213} } func (m *GithubClaims) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13090,7 +13136,7 @@ func (m *TeamMapping) Reset() { *m = TeamMapping{} } func (m *TeamMapping) String() string { return proto.CompactTextString(m) } func (*TeamMapping) ProtoMessage() {} func (*TeamMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{213} + return fileDescriptor_9198ee693835762e, []int{214} } func (m *TeamMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13136,7 +13182,7 @@ func (m *TeamRolesMapping) Reset() { *m = TeamRolesMapping{} } func (m *TeamRolesMapping) String() string { return proto.CompactTextString(m) } func (*TeamRolesMapping) ProtoMessage() {} func (*TeamRolesMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{214} + return fileDescriptor_9198ee693835762e, []int{215} } func (m *TeamRolesMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13186,7 +13232,7 @@ type TrustedClusterV2 struct { func (m *TrustedClusterV2) Reset() { *m = TrustedClusterV2{} } func (*TrustedClusterV2) ProtoMessage() {} func (*TrustedClusterV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{215} + return fileDescriptor_9198ee693835762e, []int{216} } func (m *TrustedClusterV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13228,7 +13274,7 @@ func (m *TrustedClusterV2List) Reset() { *m = TrustedClusterV2List{} } func (m *TrustedClusterV2List) String() string { return proto.CompactTextString(m) } func (*TrustedClusterV2List) ProtoMessage() {} func (*TrustedClusterV2List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{216} + return fileDescriptor_9198ee693835762e, []int{217} } func (m *TrustedClusterV2List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13284,7 +13330,7 @@ func (m *TrustedClusterSpecV2) Reset() { *m = TrustedClusterSpecV2{} } func (m *TrustedClusterSpecV2) String() string { return proto.CompactTextString(m) } func (*TrustedClusterSpecV2) ProtoMessage() {} func (*TrustedClusterSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{217} + return fileDescriptor_9198ee693835762e, []int{218} } func (m *TrustedClusterSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13338,7 +13384,7 @@ func (m *LockV2) Reset() { *m = LockV2{} } func (m *LockV2) String() string { return proto.CompactTextString(m) } func (*LockV2) ProtoMessage() {} func (*LockV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{218} + return fileDescriptor_9198ee693835762e, []int{219} } func (m *LockV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13388,7 +13434,7 @@ func (m *LockSpecV2) Reset() { *m = LockSpecV2{} } func (m *LockSpecV2) String() string { return proto.CompactTextString(m) } func (*LockSpecV2) ProtoMessage() {} func (*LockSpecV2) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{219} + return fileDescriptor_9198ee693835762e, []int{220} } func (m *LockSpecV2) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13449,7 +13495,7 @@ type LockTarget struct { func (m *LockTarget) Reset() { *m = LockTarget{} } func (*LockTarget) ProtoMessage() {} func (*LockTarget) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{220} + return fileDescriptor_9198ee693835762e, []int{221} } func (m *LockTarget) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13493,7 +13539,7 @@ func (m *AddressCondition) Reset() { *m = AddressCondition{} } func (m *AddressCondition) String() string { return proto.CompactTextString(m) } func (*AddressCondition) ProtoMessage() {} func (*AddressCondition) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{221} + return fileDescriptor_9198ee693835762e, []int{222} } func (m *AddressCondition) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13536,7 +13582,7 @@ func (m *NetworkRestrictionsSpecV4) Reset() { *m = NetworkRestrictionsSp func (m *NetworkRestrictionsSpecV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsSpecV4) ProtoMessage() {} func (*NetworkRestrictionsSpecV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{222} + return fileDescriptor_9198ee693835762e, []int{223} } func (m *NetworkRestrictionsSpecV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13589,7 +13635,7 @@ func (m *NetworkRestrictionsV4) Reset() { *m = NetworkRestrictionsV4{} } func (m *NetworkRestrictionsV4) String() string { return proto.CompactTextString(m) } func (*NetworkRestrictionsV4) ProtoMessage() {} func (*NetworkRestrictionsV4) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{223} + return fileDescriptor_9198ee693835762e, []int{224} } func (m *NetworkRestrictionsV4) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13633,7 +13679,7 @@ func (m *WindowsDesktopServiceV3) Reset() { *m = WindowsDesktopServiceV3 func (m *WindowsDesktopServiceV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceV3) ProtoMessage() {} func (*WindowsDesktopServiceV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{224} + return fileDescriptor_9198ee693835762e, []int{225} } func (m *WindowsDesktopServiceV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13681,7 +13727,7 @@ func (m *WindowsDesktopServiceSpecV3) Reset() { *m = WindowsDesktopServi func (m *WindowsDesktopServiceSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopServiceSpecV3) ProtoMessage() {} func (*WindowsDesktopServiceSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{225} + return fileDescriptor_9198ee693835762e, []int{226} } func (m *WindowsDesktopServiceSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13725,7 +13771,7 @@ func (m *WindowsDesktopFilter) Reset() { *m = WindowsDesktopFilter{} } func (m *WindowsDesktopFilter) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopFilter) ProtoMessage() {} func (*WindowsDesktopFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{226} + return fileDescriptor_9198ee693835762e, []int{227} } func (m *WindowsDesktopFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13769,7 +13815,7 @@ func (m *WindowsDesktopV3) Reset() { *m = WindowsDesktopV3{} } func (m *WindowsDesktopV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopV3) ProtoMessage() {} func (*WindowsDesktopV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{227} + return fileDescriptor_9198ee693835762e, []int{228} } func (m *WindowsDesktopV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13822,7 +13868,7 @@ func (m *WindowsDesktopSpecV3) Reset() { *m = WindowsDesktopSpecV3{} } func (m *WindowsDesktopSpecV3) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopSpecV3) ProtoMessage() {} func (*WindowsDesktopSpecV3) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{228} + return fileDescriptor_9198ee693835762e, []int{229} } func (m *WindowsDesktopSpecV3) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13866,7 +13912,7 @@ func (m *DynamicWindowsDesktopV1) Reset() { *m = DynamicWindowsDesktopV1 func (m *DynamicWindowsDesktopV1) String() string { return proto.CompactTextString(m) } func (*DynamicWindowsDesktopV1) ProtoMessage() {} func (*DynamicWindowsDesktopV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{229} + return fileDescriptor_9198ee693835762e, []int{230} } func (m *DynamicWindowsDesktopV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13917,7 +13963,7 @@ func (m *DynamicWindowsDesktopSpecV1) Reset() { *m = DynamicWindowsDeskt func (m *DynamicWindowsDesktopSpecV1) String() string { return proto.CompactTextString(m) } func (*DynamicWindowsDesktopSpecV1) ProtoMessage() {} func (*DynamicWindowsDesktopSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{230} + return fileDescriptor_9198ee693835762e, []int{231} } func (m *DynamicWindowsDesktopSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13958,7 +14004,7 @@ func (m *Resolution) Reset() { *m = Resolution{} } func (m *Resolution) String() string { return proto.CompactTextString(m) } func (*Resolution) ProtoMessage() {} func (*Resolution) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{231} + return fileDescriptor_9198ee693835762e, []int{232} } func (m *Resolution) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14041,7 +14087,7 @@ func (m *RegisterUsingTokenRequest) Reset() { *m = RegisterUsingTokenReq func (m *RegisterUsingTokenRequest) String() string { return proto.CompactTextString(m) } func (*RegisterUsingTokenRequest) ProtoMessage() {} func (*RegisterUsingTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{232} + return fileDescriptor_9198ee693835762e, []int{233} } func (m *RegisterUsingTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14095,7 +14141,7 @@ func (m *RecoveryCodesV1) Reset() { *m = RecoveryCodesV1{} } func (m *RecoveryCodesV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesV1) ProtoMessage() {} func (*RecoveryCodesV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{233} + return fileDescriptor_9198ee693835762e, []int{234} } func (m *RecoveryCodesV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14140,7 +14186,7 @@ func (m *RecoveryCodesSpecV1) Reset() { *m = RecoveryCodesSpecV1{} } func (m *RecoveryCodesSpecV1) String() string { return proto.CompactTextString(m) } func (*RecoveryCodesSpecV1) ProtoMessage() {} func (*RecoveryCodesSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{234} + return fileDescriptor_9198ee693835762e, []int{235} } func (m *RecoveryCodesSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14184,7 +14230,7 @@ func (m *RecoveryCode) Reset() { *m = RecoveryCode{} } func (m *RecoveryCode) String() string { return proto.CompactTextString(m) } func (*RecoveryCode) ProtoMessage() {} func (*RecoveryCode) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{235} + return fileDescriptor_9198ee693835762e, []int{236} } func (m *RecoveryCode) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14224,7 +14270,7 @@ func (m *NullableSessionState) Reset() { *m = NullableSessionState{} } func (m *NullableSessionState) String() string { return proto.CompactTextString(m) } func (*NullableSessionState) ProtoMessage() {} func (*NullableSessionState) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{236} + return fileDescriptor_9198ee693835762e, []int{237} } func (m *NullableSessionState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14270,7 +14316,7 @@ func (m *SessionTrackerFilter) Reset() { *m = SessionTrackerFilter{} } func (m *SessionTrackerFilter) String() string { return proto.CompactTextString(m) } func (*SessionTrackerFilter) ProtoMessage() {} func (*SessionTrackerFilter) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{237} + return fileDescriptor_9198ee693835762e, []int{238} } func (m *SessionTrackerFilter) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14314,7 +14360,7 @@ func (m *SessionTrackerV1) Reset() { *m = SessionTrackerV1{} } func (m *SessionTrackerV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerV1) ProtoMessage() {} func (*SessionTrackerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{238} + return fileDescriptor_9198ee693835762e, []int{239} } func (m *SessionTrackerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14412,7 +14458,7 @@ func (m *SessionTrackerSpecV1) Reset() { *m = SessionTrackerSpecV1{} } func (m *SessionTrackerSpecV1) String() string { return proto.CompactTextString(m) } func (*SessionTrackerSpecV1) ProtoMessage() {} func (*SessionTrackerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{239} + return fileDescriptor_9198ee693835762e, []int{240} } func (m *SessionTrackerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14459,7 +14505,7 @@ func (m *SessionTrackerPolicySet) Reset() { *m = SessionTrackerPolicySet func (m *SessionTrackerPolicySet) String() string { return proto.CompactTextString(m) } func (*SessionTrackerPolicySet) ProtoMessage() {} func (*SessionTrackerPolicySet) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{240} + return fileDescriptor_9198ee693835762e, []int{241} } func (m *SessionTrackerPolicySet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14507,7 +14553,7 @@ func (m *Participant) Reset() { *m = Participant{} } func (m *Participant) String() string { return proto.CompactTextString(m) } func (*Participant) ProtoMessage() {} func (*Participant) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{241} + return fileDescriptor_9198ee693835762e, []int{242} } func (m *Participant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14551,7 +14597,7 @@ func (m *UIConfigV1) Reset() { *m = UIConfigV1{} } func (m *UIConfigV1) String() string { return proto.CompactTextString(m) } func (*UIConfigV1) ProtoMessage() {} func (*UIConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{242} + return fileDescriptor_9198ee693835762e, []int{243} } func (m *UIConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14597,7 +14643,7 @@ func (m *UIConfigSpecV1) Reset() { *m = UIConfigSpecV1{} } func (m *UIConfigSpecV1) String() string { return proto.CompactTextString(m) } func (*UIConfigSpecV1) ProtoMessage() {} func (*UIConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{243} + return fileDescriptor_9198ee693835762e, []int{244} } func (m *UIConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14648,7 +14694,7 @@ func (m *InstallerV1) Reset() { *m = InstallerV1{} } func (m *InstallerV1) String() string { return proto.CompactTextString(m) } func (*InstallerV1) ProtoMessage() {} func (*InstallerV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{244} + return fileDescriptor_9198ee693835762e, []int{245} } func (m *InstallerV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14690,7 +14736,7 @@ func (m *InstallerSpecV1) Reset() { *m = InstallerSpecV1{} } func (m *InstallerSpecV1) String() string { return proto.CompactTextString(m) } func (*InstallerSpecV1) ProtoMessage() {} func (*InstallerSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{245} + return fileDescriptor_9198ee693835762e, []int{246} } func (m *InstallerSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14732,7 +14778,7 @@ func (m *InstallerV1List) Reset() { *m = InstallerV1List{} } func (m *InstallerV1List) String() string { return proto.CompactTextString(m) } func (*InstallerV1List) ProtoMessage() {} func (*InstallerV1List) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{246} + return fileDescriptor_9198ee693835762e, []int{247} } func (m *InstallerV1List) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14776,7 +14822,7 @@ func (m *SortBy) Reset() { *m = SortBy{} } func (m *SortBy) String() string { return proto.CompactTextString(m) } func (*SortBy) ProtoMessage() {} func (*SortBy) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{247} + return fileDescriptor_9198ee693835762e, []int{248} } func (m *SortBy) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14822,7 +14868,7 @@ func (m *ConnectionDiagnosticV1) Reset() { *m = ConnectionDiagnosticV1{} func (m *ConnectionDiagnosticV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticV1) ProtoMessage() {} func (*ConnectionDiagnosticV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{248} + return fileDescriptor_9198ee693835762e, []int{249} } func (m *ConnectionDiagnosticV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14872,7 +14918,7 @@ func (m *ConnectionDiagnosticSpecV1) Reset() { *m = ConnectionDiagnostic func (m *ConnectionDiagnosticSpecV1) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticSpecV1) ProtoMessage() {} func (*ConnectionDiagnosticSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{249} + return fileDescriptor_9198ee693835762e, []int{250} } func (m *ConnectionDiagnosticSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14918,7 +14964,7 @@ func (m *ConnectionDiagnosticTrace) Reset() { *m = ConnectionDiagnosticT func (m *ConnectionDiagnosticTrace) String() string { return proto.CompactTextString(m) } func (*ConnectionDiagnosticTrace) ProtoMessage() {} func (*ConnectionDiagnosticTrace) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{250} + return fileDescriptor_9198ee693835762e, []int{251} } func (m *ConnectionDiagnosticTrace) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14961,7 +15007,7 @@ func (m *DatabaseServiceV1) Reset() { *m = DatabaseServiceV1{} } func (m *DatabaseServiceV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceV1) ProtoMessage() {} func (*DatabaseServiceV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{251} + return fileDescriptor_9198ee693835762e, []int{252} } func (m *DatabaseServiceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15005,7 +15051,7 @@ func (m *DatabaseServiceSpecV1) Reset() { *m = DatabaseServiceSpecV1{} } func (m *DatabaseServiceSpecV1) String() string { return proto.CompactTextString(m) } func (*DatabaseServiceSpecV1) ProtoMessage() {} func (*DatabaseServiceSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{252} + return fileDescriptor_9198ee693835762e, []int{253} } func (m *DatabaseServiceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15047,7 +15093,7 @@ func (m *DatabaseResourceMatcher) Reset() { *m = DatabaseResourceMatcher func (m *DatabaseResourceMatcher) String() string { return proto.CompactTextString(m) } func (*DatabaseResourceMatcher) ProtoMessage() {} func (*DatabaseResourceMatcher) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{253} + return fileDescriptor_9198ee693835762e, []int{254} } func (m *DatabaseResourceMatcher) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15091,7 +15137,7 @@ func (m *ResourceMatcherAWS) Reset() { *m = ResourceMatcherAWS{} } func (m *ResourceMatcherAWS) String() string { return proto.CompactTextString(m) } func (*ResourceMatcherAWS) ProtoMessage() {} func (*ResourceMatcherAWS) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{254} + return fileDescriptor_9198ee693835762e, []int{255} } func (m *ResourceMatcherAWS) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15133,7 +15179,7 @@ func (m *ClusterAlert) Reset() { *m = ClusterAlert{} } func (m *ClusterAlert) String() string { return proto.CompactTextString(m) } func (*ClusterAlert) ProtoMessage() {} func (*ClusterAlert) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{255} + return fileDescriptor_9198ee693835762e, []int{256} } func (m *ClusterAlert) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15179,7 +15225,7 @@ func (m *ClusterAlertSpec) Reset() { *m = ClusterAlertSpec{} } func (m *ClusterAlertSpec) String() string { return proto.CompactTextString(m) } func (*ClusterAlertSpec) ProtoMessage() {} func (*ClusterAlertSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{256} + return fileDescriptor_9198ee693835762e, []int{257} } func (m *ClusterAlertSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15232,7 +15278,7 @@ func (m *GetClusterAlertsRequest) Reset() { *m = GetClusterAlertsRequest func (m *GetClusterAlertsRequest) String() string { return proto.CompactTextString(m) } func (*GetClusterAlertsRequest) ProtoMessage() {} func (*GetClusterAlertsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{257} + return fileDescriptor_9198ee693835762e, []int{258} } func (m *GetClusterAlertsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15282,7 +15328,7 @@ func (m *AlertAcknowledgement) Reset() { *m = AlertAcknowledgement{} } func (m *AlertAcknowledgement) String() string { return proto.CompactTextString(m) } func (*AlertAcknowledgement) ProtoMessage() {} func (*AlertAcknowledgement) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{258} + return fileDescriptor_9198ee693835762e, []int{259} } func (m *AlertAcknowledgement) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15334,7 +15380,7 @@ func (m *Release) Reset() { *m = Release{} } func (m *Release) String() string { return proto.CompactTextString(m) } func (*Release) ProtoMessage() {} func (*Release) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{259} + return fileDescriptor_9198ee693835762e, []int{260} } func (m *Release) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15392,7 +15438,7 @@ func (m *Asset) Reset() { *m = Asset{} } func (m *Asset) String() string { return proto.CompactTextString(m) } func (*Asset) ProtoMessage() {} func (*Asset) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{260} + return fileDescriptor_9198ee693835762e, []int{261} } func (m *Asset) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15445,7 +15491,7 @@ func (m *PluginV1) Reset() { *m = PluginV1{} } func (m *PluginV1) String() string { return proto.CompactTextString(m) } func (*PluginV1) ProtoMessage() {} func (*PluginV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{261} + return fileDescriptor_9198ee693835762e, []int{262} } func (m *PluginV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15510,7 +15556,7 @@ func (m *PluginSpecV1) Reset() { *m = PluginSpecV1{} } func (m *PluginSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginSpecV1) ProtoMessage() {} func (*PluginSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{262} + return fileDescriptor_9198ee693835762e, []int{263} } func (m *PluginSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15752,7 +15798,7 @@ func (m *PluginSlackAccessSettings) Reset() { *m = PluginSlackAccessSett func (m *PluginSlackAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginSlackAccessSettings) ProtoMessage() {} func (*PluginSlackAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{263} + return fileDescriptor_9198ee693835762e, []int{264} } func (m *PluginSlackAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15793,7 +15839,7 @@ func (m *PluginGitlabSettings) Reset() { *m = PluginGitlabSettings{} } func (m *PluginGitlabSettings) String() string { return proto.CompactTextString(m) } func (*PluginGitlabSettings) ProtoMessage() {} func (*PluginGitlabSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{264} + return fileDescriptor_9198ee693835762e, []int{265} } func (m *PluginGitlabSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15840,7 +15886,7 @@ func (m *PluginOpsgenieAccessSettings) Reset() { *m = PluginOpsgenieAcce func (m *PluginOpsgenieAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginOpsgenieAccessSettings) ProtoMessage() {} func (*PluginOpsgenieAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{265} + return fileDescriptor_9198ee693835762e, []int{266} } func (m *PluginOpsgenieAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15888,7 +15934,7 @@ func (m *PluginServiceNowSettings) Reset() { *m = PluginServiceNowSettin func (m *PluginServiceNowSettings) String() string { return proto.CompactTextString(m) } func (*PluginServiceNowSettings) ProtoMessage() {} func (*PluginServiceNowSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{266} + return fileDescriptor_9198ee693835762e, []int{267} } func (m *PluginServiceNowSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15934,7 +15980,7 @@ func (m *PluginPagerDutySettings) Reset() { *m = PluginPagerDutySettings func (m *PluginPagerDutySettings) String() string { return proto.CompactTextString(m) } func (*PluginPagerDutySettings) ProtoMessage() {} func (*PluginPagerDutySettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{267} + return fileDescriptor_9198ee693835762e, []int{268} } func (m *PluginPagerDutySettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15980,7 +16026,7 @@ func (m *PluginJiraSettings) Reset() { *m = PluginJiraSettings{} } func (m *PluginJiraSettings) String() string { return proto.CompactTextString(m) } func (*PluginJiraSettings) ProtoMessage() {} func (*PluginJiraSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{268} + return fileDescriptor_9198ee693835762e, []int{269} } func (m *PluginJiraSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16020,7 +16066,7 @@ func (m *PluginOpenAISettings) Reset() { *m = PluginOpenAISettings{} } func (m *PluginOpenAISettings) String() string { return proto.CompactTextString(m) } func (*PluginOpenAISettings) ProtoMessage() {} func (*PluginOpenAISettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{269} + return fileDescriptor_9198ee693835762e, []int{270} } func (m *PluginOpenAISettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16071,7 +16117,7 @@ func (m *PluginMattermostSettings) Reset() { *m = PluginMattermostSettin func (m *PluginMattermostSettings) String() string { return proto.CompactTextString(m) } func (*PluginMattermostSettings) ProtoMessage() {} func (*PluginMattermostSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{270} + return fileDescriptor_9198ee693835762e, []int{271} } func (m *PluginMattermostSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16113,7 +16159,7 @@ func (m *PluginJamfSettings) Reset() { *m = PluginJamfSettings{} } func (m *PluginJamfSettings) String() string { return proto.CompactTextString(m) } func (*PluginJamfSettings) ProtoMessage() {} func (*PluginJamfSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{271} + return fileDescriptor_9198ee693835762e, []int{272} } func (m *PluginJamfSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16165,7 +16211,7 @@ func (m *PluginOktaSettings) Reset() { *m = PluginOktaSettings{} } func (m *PluginOktaSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSettings) ProtoMessage() {} func (*PluginOktaSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{272} + return fileDescriptor_9198ee693835762e, []int{273} } func (m *PluginOktaSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16212,7 +16258,7 @@ func (m *PluginOktaCredentialsInfo) Reset() { *m = PluginOktaCredentials func (m *PluginOktaCredentialsInfo) String() string { return proto.CompactTextString(m) } func (*PluginOktaCredentialsInfo) ProtoMessage() {} func (*PluginOktaCredentialsInfo) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{273} + return fileDescriptor_9198ee693835762e, []int{274} } func (m *PluginOktaCredentialsInfo) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16296,7 +16342,7 @@ func (m *PluginOktaSyncSettings) Reset() { *m = PluginOktaSyncSettings{} func (m *PluginOktaSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginOktaSyncSettings) ProtoMessage() {} func (*PluginOktaSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{274} + return fileDescriptor_9198ee693835762e, []int{275} } func (m *PluginOktaSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16337,7 +16383,7 @@ func (m *DiscordChannels) Reset() { *m = DiscordChannels{} } func (m *DiscordChannels) String() string { return proto.CompactTextString(m) } func (*DiscordChannels) ProtoMessage() {} func (*DiscordChannels) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{275} + return fileDescriptor_9198ee693835762e, []int{276} } func (m *DiscordChannels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16381,7 +16427,7 @@ func (m *PluginDiscordSettings) Reset() { *m = PluginDiscordSettings{} } func (m *PluginDiscordSettings) String() string { return proto.CompactTextString(m) } func (*PluginDiscordSettings) ProtoMessage() {} func (*PluginDiscordSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{276} + return fileDescriptor_9198ee693835762e, []int{277} } func (m *PluginDiscordSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16426,7 +16472,7 @@ func (m *PluginEntraIDSettings) Reset() { *m = PluginEntraIDSettings{} } func (m *PluginEntraIDSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSettings) ProtoMessage() {} func (*PluginEntraIDSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{277} + return fileDescriptor_9198ee693835762e, []int{278} } func (m *PluginEntraIDSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16470,7 +16516,7 @@ func (m *PluginEntraIDSyncSettings) Reset() { *m = PluginEntraIDSyncSett func (m *PluginEntraIDSyncSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDSyncSettings) ProtoMessage() {} func (*PluginEntraIDSyncSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{278} + return fileDescriptor_9198ee693835762e, []int{279} } func (m *PluginEntraIDSyncSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16515,7 +16561,7 @@ func (m *PluginEntraIDAccessGraphSettings) Reset() { *m = PluginEntraIDA func (m *PluginEntraIDAccessGraphSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAccessGraphSettings) ProtoMessage() {} func (*PluginEntraIDAccessGraphSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{279} + return fileDescriptor_9198ee693835762e, []int{280} } func (m *PluginEntraIDAccessGraphSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16561,7 +16607,7 @@ func (m *PluginEntraIDAppSSOSettings) Reset() { *m = PluginEntraIDAppSSO func (m *PluginEntraIDAppSSOSettings) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDAppSSOSettings) ProtoMessage() {} func (*PluginEntraIDAppSSOSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{280} + return fileDescriptor_9198ee693835762e, []int{281} } func (m *PluginEntraIDAppSSOSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16607,7 +16653,7 @@ func (m *PluginSCIMSettings) Reset() { *m = PluginSCIMSettings{} } func (m *PluginSCIMSettings) String() string { return proto.CompactTextString(m) } func (*PluginSCIMSettings) ProtoMessage() {} func (*PluginSCIMSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{281} + return fileDescriptor_9198ee693835762e, []int{282} } func (m *PluginSCIMSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16651,7 +16697,7 @@ func (m *PluginDatadogAccessSettings) Reset() { *m = PluginDatadogAccess func (m *PluginDatadogAccessSettings) String() string { return proto.CompactTextString(m) } func (*PluginDatadogAccessSettings) ProtoMessage() {} func (*PluginDatadogAccessSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{282} + return fileDescriptor_9198ee693835762e, []int{283} } func (m *PluginDatadogAccessSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16706,7 +16752,7 @@ func (m *PluginAWSICSettings) Reset() { *m = PluginAWSICSettings{} } func (m *PluginAWSICSettings) String() string { return proto.CompactTextString(m) } func (*PluginAWSICSettings) ProtoMessage() {} func (*PluginAWSICSettings) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{283} + return fileDescriptor_9198ee693835762e, []int{284} } func (m *PluginAWSICSettings) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16753,7 +16799,7 @@ func (m *AWSICProvisioningSpec) Reset() { *m = AWSICProvisioningSpec{} } func (m *AWSICProvisioningSpec) String() string { return proto.CompactTextString(m) } func (*AWSICProvisioningSpec) ProtoMessage() {} func (*AWSICProvisioningSpec) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{284} + return fileDescriptor_9198ee693835762e, []int{285} } func (m *AWSICProvisioningSpec) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16798,7 +16844,7 @@ func (m *PluginBootstrapCredentialsV1) Reset() { *m = PluginBootstrapCre func (m *PluginBootstrapCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginBootstrapCredentialsV1) ProtoMessage() {} func (*PluginBootstrapCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{285} + return fileDescriptor_9198ee693835762e, []int{286} } func (m *PluginBootstrapCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16898,7 +16944,7 @@ func (m *PluginIdSecretCredential) Reset() { *m = PluginIdSecretCredenti func (m *PluginIdSecretCredential) String() string { return proto.CompactTextString(m) } func (*PluginIdSecretCredential) ProtoMessage() {} func (*PluginIdSecretCredential) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{286} + return fileDescriptor_9198ee693835762e, []int{287} } func (m *PluginIdSecretCredential) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16941,7 +16987,7 @@ func (m *PluginOAuth2AuthorizationCodeCredentials) Reset() { func (m *PluginOAuth2AuthorizationCodeCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AuthorizationCodeCredentials) ProtoMessage() {} func (*PluginOAuth2AuthorizationCodeCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{287} + return fileDescriptor_9198ee693835762e, []int{288} } func (m *PluginOAuth2AuthorizationCodeCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -16999,7 +17045,7 @@ func (m *PluginStatusV1) Reset() { *m = PluginStatusV1{} } func (m *PluginStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginStatusV1) ProtoMessage() {} func (*PluginStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{288} + return fileDescriptor_9198ee693835762e, []int{289} } func (m *PluginStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17102,7 +17148,7 @@ func (m *PluginGitlabStatusV1) Reset() { *m = PluginGitlabStatusV1{} } func (m *PluginGitlabStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginGitlabStatusV1) ProtoMessage() {} func (*PluginGitlabStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{289} + return fileDescriptor_9198ee693835762e, []int{290} } func (m *PluginGitlabStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17146,7 +17192,7 @@ func (m *PluginEntraIDStatusV1) Reset() { *m = PluginEntraIDStatusV1{} } func (m *PluginEntraIDStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginEntraIDStatusV1) ProtoMessage() {} func (*PluginEntraIDStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{290} + return fileDescriptor_9198ee693835762e, []int{291} } func (m *PluginEntraIDStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17200,7 +17246,7 @@ func (m *PluginOktaStatusV1) Reset() { *m = PluginOktaStatusV1{} } func (m *PluginOktaStatusV1) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusV1) ProtoMessage() {} func (*PluginOktaStatusV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{291} + return fileDescriptor_9198ee693835762e, []int{292} } func (m *PluginOktaStatusV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17248,7 +17294,7 @@ func (m *PluginOktaStatusDetailsSSO) Reset() { *m = PluginOktaStatusDeta func (m *PluginOktaStatusDetailsSSO) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSSO) ProtoMessage() {} func (*PluginOktaStatusDetailsSSO) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{292} + return fileDescriptor_9198ee693835762e, []int{293} } func (m *PluginOktaStatusDetailsSSO) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17305,7 +17351,7 @@ func (m *PluginOktaStatusDetailsAppGroupSync) Reset() { *m = PluginOktaS func (m *PluginOktaStatusDetailsAppGroupSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAppGroupSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAppGroupSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{293} + return fileDescriptor_9198ee693835762e, []int{294} } func (m *PluginOktaStatusDetailsAppGroupSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17359,7 +17405,7 @@ func (m *PluginOktaStatusDetailsUsersSync) Reset() { *m = PluginOktaStat func (m *PluginOktaStatusDetailsUsersSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsUsersSync) ProtoMessage() {} func (*PluginOktaStatusDetailsUsersSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{294} + return fileDescriptor_9198ee693835762e, []int{295} } func (m *PluginOktaStatusDetailsUsersSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17402,7 +17448,7 @@ func (m *PluginOktaStatusDetailsSCIM) Reset() { *m = PluginOktaStatusDet func (m *PluginOktaStatusDetailsSCIM) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsSCIM) ProtoMessage() {} func (*PluginOktaStatusDetailsSCIM) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{295} + return fileDescriptor_9198ee693835762e, []int{296} } func (m *PluginOktaStatusDetailsSCIM) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17464,7 +17510,7 @@ func (m *PluginOktaStatusDetailsAccessListsSync) Reset() { func (m *PluginOktaStatusDetailsAccessListsSync) String() string { return proto.CompactTextString(m) } func (*PluginOktaStatusDetailsAccessListsSync) ProtoMessage() {} func (*PluginOktaStatusDetailsAccessListsSync) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{296} + return fileDescriptor_9198ee693835762e, []int{297} } func (m *PluginOktaStatusDetailsAccessListsSync) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17512,7 +17558,7 @@ func (m *PluginCredentialsV1) Reset() { *m = PluginCredentialsV1{} } func (m *PluginCredentialsV1) String() string { return proto.CompactTextString(m) } func (*PluginCredentialsV1) ProtoMessage() {} func (*PluginCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{297} + return fileDescriptor_9198ee693835762e, []int{298} } func (m *PluginCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17623,7 +17669,7 @@ func (m *PluginOAuth2AccessTokenCredentials) Reset() { *m = PluginOAuth2 func (m *PluginOAuth2AccessTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginOAuth2AccessTokenCredentials) ProtoMessage() {} func (*PluginOAuth2AccessTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{298} + return fileDescriptor_9198ee693835762e, []int{299} } func (m *PluginOAuth2AccessTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17664,7 +17710,7 @@ func (m *PluginBearerTokenCredentials) Reset() { *m = PluginBearerTokenC func (m *PluginBearerTokenCredentials) String() string { return proto.CompactTextString(m) } func (*PluginBearerTokenCredentials) ProtoMessage() {} func (*PluginBearerTokenCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{299} + return fileDescriptor_9198ee693835762e, []int{300} } func (m *PluginBearerTokenCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17706,7 +17752,7 @@ func (m *PluginStaticCredentialsRef) Reset() { *m = PluginStaticCredenti func (m *PluginStaticCredentialsRef) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsRef) ProtoMessage() {} func (*PluginStaticCredentialsRef) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{300} + return fileDescriptor_9198ee693835762e, []int{301} } func (m *PluginStaticCredentialsRef) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17748,7 +17794,7 @@ func (m *PluginListV1) Reset() { *m = PluginListV1{} } func (m *PluginListV1) String() string { return proto.CompactTextString(m) } func (*PluginListV1) ProtoMessage() {} func (*PluginListV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{301} + return fileDescriptor_9198ee693835762e, []int{302} } func (m *PluginListV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17791,7 +17837,7 @@ type PluginStaticCredentialsV1 struct { func (m *PluginStaticCredentialsV1) Reset() { *m = PluginStaticCredentialsV1{} } func (*PluginStaticCredentialsV1) ProtoMessage() {} func (*PluginStaticCredentialsV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{302} + return fileDescriptor_9198ee693835762e, []int{303} } func (m *PluginStaticCredentialsV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17837,7 +17883,7 @@ func (m *PluginStaticCredentialsSpecV1) Reset() { *m = PluginStaticCrede func (m *PluginStaticCredentialsSpecV1) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsSpecV1) ProtoMessage() {} func (*PluginStaticCredentialsSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{303} + return fileDescriptor_9198ee693835762e, []int{304} } func (m *PluginStaticCredentialsSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17939,7 +17985,7 @@ func (m *PluginStaticCredentialsBasicAuth) Reset() { *m = PluginStaticCr func (m *PluginStaticCredentialsBasicAuth) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsBasicAuth) ProtoMessage() {} func (*PluginStaticCredentialsBasicAuth) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{304} + return fileDescriptor_9198ee693835762e, []int{305} } func (m *PluginStaticCredentialsBasicAuth) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -17985,7 +18031,7 @@ func (m *PluginStaticCredentialsOAuthClientSecret) Reset() { func (m *PluginStaticCredentialsOAuthClientSecret) String() string { return proto.CompactTextString(m) } func (*PluginStaticCredentialsOAuthClientSecret) ProtoMessage() {} func (*PluginStaticCredentialsOAuthClientSecret) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{305} + return fileDescriptor_9198ee693835762e, []int{306} } func (m *PluginStaticCredentialsOAuthClientSecret) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18028,7 +18074,7 @@ type SAMLIdPServiceProviderV1 struct { func (m *SAMLIdPServiceProviderV1) Reset() { *m = SAMLIdPServiceProviderV1{} } func (*SAMLIdPServiceProviderV1) ProtoMessage() {} func (*SAMLIdPServiceProviderV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{306} + return fileDescriptor_9198ee693835762e, []int{307} } func (m *SAMLIdPServiceProviderV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18099,7 +18145,7 @@ func (m *SAMLIdPServiceProviderSpecV1) Reset() { *m = SAMLIdPServiceProv func (m *SAMLIdPServiceProviderSpecV1) String() string { return proto.CompactTextString(m) } func (*SAMLIdPServiceProviderSpecV1) ProtoMessage() {} func (*SAMLIdPServiceProviderSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{307} + return fileDescriptor_9198ee693835762e, []int{308} } func (m *SAMLIdPServiceProviderSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18146,7 +18192,7 @@ func (m *SAMLAttributeMapping) Reset() { *m = SAMLAttributeMapping{} } func (m *SAMLAttributeMapping) String() string { return proto.CompactTextString(m) } func (*SAMLAttributeMapping) ProtoMessage() {} func (*SAMLAttributeMapping) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{308} + return fileDescriptor_9198ee693835762e, []int{309} } func (m *SAMLAttributeMapping) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18188,7 +18234,7 @@ func (m *IdPOptions) Reset() { *m = IdPOptions{} } func (m *IdPOptions) String() string { return proto.CompactTextString(m) } func (*IdPOptions) ProtoMessage() {} func (*IdPOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{309} + return fileDescriptor_9198ee693835762e, []int{310} } func (m *IdPOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18230,7 +18276,7 @@ func (m *IdPSAMLOptions) Reset() { *m = IdPSAMLOptions{} } func (m *IdPSAMLOptions) String() string { return proto.CompactTextString(m) } func (*IdPSAMLOptions) ProtoMessage() {} func (*IdPSAMLOptions) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{310} + return fileDescriptor_9198ee693835762e, []int{311} } func (m *IdPSAMLOptions) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18280,7 +18326,7 @@ func (m *KubernetesResourceV1) Reset() { *m = KubernetesResourceV1{} } func (m *KubernetesResourceV1) String() string { return proto.CompactTextString(m) } func (*KubernetesResourceV1) ProtoMessage() {} func (*KubernetesResourceV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{311} + return fileDescriptor_9198ee693835762e, []int{312} } func (m *KubernetesResourceV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18322,7 +18368,7 @@ func (m *KubernetesResourceSpecV1) Reset() { *m = KubernetesResourceSpec func (m *KubernetesResourceSpecV1) String() string { return proto.CompactTextString(m) } func (*KubernetesResourceSpecV1) ProtoMessage() {} func (*KubernetesResourceSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{312} + return fileDescriptor_9198ee693835762e, []int{313} } func (m *KubernetesResourceSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18368,7 +18414,7 @@ func (m *ClusterMaintenanceConfigV1) Reset() { *m = ClusterMaintenanceCo func (m *ClusterMaintenanceConfigV1) String() string { return proto.CompactTextString(m) } func (*ClusterMaintenanceConfigV1) ProtoMessage() {} func (*ClusterMaintenanceConfigV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{313} + return fileDescriptor_9198ee693835762e, []int{314} } func (m *ClusterMaintenanceConfigV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18410,7 +18456,7 @@ func (m *ClusterMaintenanceConfigSpecV1) Reset() { *m = ClusterMaintenan func (m *ClusterMaintenanceConfigSpecV1) String() string { return proto.CompactTextString(m) } func (*ClusterMaintenanceConfigSpecV1) ProtoMessage() {} func (*ClusterMaintenanceConfigSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{314} + return fileDescriptor_9198ee693835762e, []int{315} } func (m *ClusterMaintenanceConfigSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18456,7 +18502,7 @@ func (m *AgentUpgradeWindow) Reset() { *m = AgentUpgradeWindow{} } func (m *AgentUpgradeWindow) String() string { return proto.CompactTextString(m) } func (*AgentUpgradeWindow) ProtoMessage() {} func (*AgentUpgradeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{315} + return fileDescriptor_9198ee693835762e, []int{316} } func (m *AgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18503,7 +18549,7 @@ func (m *ScheduledAgentUpgradeWindow) Reset() { *m = ScheduledAgentUpgra func (m *ScheduledAgentUpgradeWindow) String() string { return proto.CompactTextString(m) } func (*ScheduledAgentUpgradeWindow) ProtoMessage() {} func (*ScheduledAgentUpgradeWindow) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{316} + return fileDescriptor_9198ee693835762e, []int{317} } func (m *ScheduledAgentUpgradeWindow) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18546,7 +18592,7 @@ func (m *AgentUpgradeSchedule) Reset() { *m = AgentUpgradeSchedule{} } func (m *AgentUpgradeSchedule) String() string { return proto.CompactTextString(m) } func (*AgentUpgradeSchedule) ProtoMessage() {} func (*AgentUpgradeSchedule) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{317} + return fileDescriptor_9198ee693835762e, []int{318} } func (m *AgentUpgradeSchedule) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18589,7 +18635,7 @@ type UserGroupV1 struct { func (m *UserGroupV1) Reset() { *m = UserGroupV1{} } func (*UserGroupV1) ProtoMessage() {} func (*UserGroupV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{318} + return fileDescriptor_9198ee693835762e, []int{319} } func (m *UserGroupV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18631,7 +18677,7 @@ func (m *UserGroupSpecV1) Reset() { *m = UserGroupSpecV1{} } func (m *UserGroupSpecV1) String() string { return proto.CompactTextString(m) } func (*UserGroupSpecV1) ProtoMessage() {} func (*UserGroupSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{319} + return fileDescriptor_9198ee693835762e, []int{320} } func (m *UserGroupSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18675,7 +18721,7 @@ func (m *OktaImportRuleSpecV1) Reset() { *m = OktaImportRuleSpecV1{} } func (m *OktaImportRuleSpecV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleSpecV1) ProtoMessage() {} func (*OktaImportRuleSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{320} + return fileDescriptor_9198ee693835762e, []int{321} } func (m *OktaImportRuleSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18719,7 +18765,7 @@ func (m *OktaImportRuleMappingV1) Reset() { *m = OktaImportRuleMappingV1 func (m *OktaImportRuleMappingV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleMappingV1) ProtoMessage() {} func (*OktaImportRuleMappingV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{321} + return fileDescriptor_9198ee693835762e, []int{322} } func (m *OktaImportRuleMappingV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18762,7 +18808,7 @@ type OktaImportRuleV1 struct { func (m *OktaImportRuleV1) Reset() { *m = OktaImportRuleV1{} } func (*OktaImportRuleV1) ProtoMessage() {} func (*OktaImportRuleV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{322} + return fileDescriptor_9198ee693835762e, []int{323} } func (m *OktaImportRuleV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18810,7 +18856,7 @@ func (m *OktaImportRuleMatchV1) Reset() { *m = OktaImportRuleMatchV1{} } func (m *OktaImportRuleMatchV1) String() string { return proto.CompactTextString(m) } func (*OktaImportRuleMatchV1) ProtoMessage() {} func (*OktaImportRuleMatchV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{323} + return fileDescriptor_9198ee693835762e, []int{324} } func (m *OktaImportRuleMatchV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18853,7 +18899,7 @@ type OktaAssignmentV1 struct { func (m *OktaAssignmentV1) Reset() { *m = OktaAssignmentV1{} } func (*OktaAssignmentV1) ProtoMessage() {} func (*OktaAssignmentV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{324} + return fileDescriptor_9198ee693835762e, []int{325} } func (m *OktaAssignmentV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18907,7 +18953,7 @@ func (m *OktaAssignmentSpecV1) Reset() { *m = OktaAssignmentSpecV1{} } func (m *OktaAssignmentSpecV1) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentSpecV1) ProtoMessage() {} func (*OktaAssignmentSpecV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{325} + return fileDescriptor_9198ee693835762e, []int{326} } func (m *OktaAssignmentSpecV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18951,7 +18997,7 @@ func (m *OktaAssignmentTargetV1) Reset() { *m = OktaAssignmentTargetV1{} func (m *OktaAssignmentTargetV1) String() string { return proto.CompactTextString(m) } func (*OktaAssignmentTargetV1) ProtoMessage() {} func (*OktaAssignmentTargetV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{326} + return fileDescriptor_9198ee693835762e, []int{327} } func (m *OktaAssignmentTargetV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -18996,7 +19042,7 @@ type IntegrationV1 struct { func (m *IntegrationV1) Reset() { *m = IntegrationV1{} } func (*IntegrationV1) ProtoMessage() {} func (*IntegrationV1) Descriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{327} + return fileDescriptor_9198ee693835762e, []int{328} } func (m *IntegrationV1) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -19041,7 +19087,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 +19187,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 +19233,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 +19294,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 +19351,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 +19401,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 +19442,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 +19492,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 +19534,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 +19591,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 +19656,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 +19713,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 +19777,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 +19822,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 +19884,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 +19927,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 +19970,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 +20024,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 +20079,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 +20125,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 +20167,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 +20209,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 +20255,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) @@ -20412,6 +20458,7 @@ func init() { proto.RegisterType((*RecordSession)(nil), "types.RecordSession") proto.RegisterType((*CertExtension)(nil), "types.CertExtension") proto.RegisterType((*RoleConditions)(nil), "types.RoleConditions") + proto.RegisterType((*IdentityCenterAccountAssignment)(nil), "types.IdentityCenterAccountAssignment") proto.RegisterType((*SPIFFERoleCondition)(nil), "types.SPIFFERoleCondition") proto.RegisterType((*DatabasePermission)(nil), "types.DatabasePermission") proto.RegisterType((*KubernetesResource)(nil), "types.KubernetesResource") @@ -20657,1810 +20704,1816 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 28842 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, - 0x00, 0x34, 0x30, 0xc0, 0xcc, 0x55, 0x0f, 0x80, 0x5b, 0xde, 0xa3, 0xae, 0xa6, 0x3b, 0x67, 0xa6, - 0x16, 0xdd, 0x5d, 0x7d, 0x55, 0xd5, 0x18, 0xcc, 0x51, 0xb2, 0x48, 0x49, 0x14, 0xcd, 0x90, 0x29, - 0x8a, 0x32, 0x69, 0x9e, 0x1c, 0x14, 0xcd, 0xa0, 0x2d, 0x9b, 0x21, 0x87, 0x18, 0x36, 0x29, 0x86, - 0x6d, 0x31, 0x4c, 0x91, 0x0a, 0x06, 0xcd, 0x60, 0x38, 0x44, 0x86, 0x4d, 0xbf, 0xce, 0x8c, 0xa1, - 0x69, 0xfa, 0x87, 0x8d, 0x08, 0x47, 0x90, 0x56, 0x84, 0x1f, 0xa7, 0xa0, 0xe4, 0xc8, 0x2f, 0xbf, - 0xac, 0xca, 0xac, 0xae, 0xee, 0xe9, 0xd9, 0xc5, 0x51, 0xc4, 0x05, 0xff, 0x00, 0xd3, 0x5f, 0x7e, - 0xdf, 0x97, 0x95, 0xef, 0x2f, 0xbf, 0xfc, 0x1e, 0xf0, 0x62, 0xc4, 0x9b, 0xbc, 0xe3, 0x07, 0xd1, - 0xa5, 0x26, 0xdf, 0x73, 0xeb, 0x87, 0x97, 0xa2, 0xc3, 0x0e, 0x0f, 0xe5, 0xbf, 0x17, 0x3b, 0x81, - 0x1f, 0xf9, 0x6c, 0x14, 0x7f, 0x2c, 0x2d, 0xec, 0xf9, 0x7b, 0x3e, 0x42, 0x2e, 0x89, 0xbf, 0x64, - 0xe1, 0xd2, 0x0b, 0x7b, 0xbe, 0xbf, 0xd7, 0xe4, 0x97, 0xf0, 0xd7, 0x4e, 0x77, 0xf7, 0x52, 0xa3, - 0x1b, 0xb8, 0x91, 0xe7, 0xb7, 0xa9, 0xbc, 0x9c, 0x2e, 0x8f, 0xbc, 0x16, 0x0f, 0x23, 0xb7, 0xd5, - 0xe9, 0xc7, 0xe0, 0x20, 0x70, 0x3b, 0x1d, 0x1e, 0x50, 0xed, 0x4b, 0xaf, 0xc5, 0x1f, 0xe8, 0x46, - 0x91, 0xa0, 0x14, 0xcc, 0x2f, 0x3d, 0xbc, 0xac, 0xff, 0x24, 0xd4, 0x37, 0xb3, 0xdb, 0xa2, 0x18, - 0xa6, 0x38, 0x5b, 0x3f, 0x53, 0x80, 0x89, 0x5b, 0x9c, 0x77, 0x2a, 0x4d, 0xef, 0x21, 0x67, 0x2f, - 0xc1, 0xc8, 0x1d, 0xb7, 0xc5, 0x17, 0x73, 0xe7, 0x72, 0x17, 0x26, 0x56, 0x66, 0x1f, 0x1f, 0x95, - 0x27, 0x43, 0x1e, 0x3c, 0xe4, 0x81, 0xd3, 0x76, 0x5b, 0xdc, 0xc6, 0x42, 0xf6, 0x29, 0x98, 0x10, - 0xff, 0x87, 0x1d, 0xb7, 0xce, 0x17, 0xf3, 0x88, 0x39, 0xfd, 0xf8, 0xa8, 0x3c, 0xd1, 0x56, 0x40, - 0x3b, 0x29, 0x67, 0x55, 0x18, 0x5f, 0x7f, 0xd4, 0xf1, 0x02, 0x1e, 0x2e, 0x8e, 0x9c, 0xcb, 0x5d, - 0x98, 0x5c, 0x5e, 0xba, 0x28, 0xdb, 0x7a, 0x51, 0xb5, 0xf5, 0xe2, 0xb6, 0xea, 0x8c, 0x95, 0xf9, - 0xdf, 0x3a, 0x2a, 0x3f, 0xf3, 0xf8, 0xa8, 0x3c, 0xce, 0x25, 0xc9, 0xdf, 0xfe, 0x83, 0x72, 0xce, - 0x56, 0xf4, 0xec, 0x5d, 0x18, 0xd9, 0x3e, 0xec, 0xf0, 0xc5, 0x89, 0x73, 0xb9, 0x0b, 0x33, 0xcb, - 0x2f, 0x5c, 0x94, 0xc3, 0x13, 0x7f, 0x7c, 0xf2, 0x97, 0xc0, 0x5a, 0x29, 0x3e, 0x3e, 0x2a, 0x8f, - 0x08, 0x14, 0x1b, 0xa9, 0xd8, 0x9b, 0x30, 0x76, 0xc3, 0x0f, 0xa3, 0xea, 0xda, 0x22, 0xe0, 0x27, - 0x9f, 0x7a, 0x7c, 0x54, 0x9e, 0xdb, 0xf7, 0xc3, 0xc8, 0xf1, 0x1a, 0x6f, 0xf8, 0x2d, 0x2f, 0xe2, - 0xad, 0x4e, 0x74, 0x68, 0x13, 0x92, 0xf5, 0x08, 0xa6, 0x0d, 0x7e, 0x6c, 0x12, 0xc6, 0xef, 0xde, - 0xb9, 0x75, 0x67, 0xf3, 0xfe, 0x9d, 0xd2, 0x33, 0xac, 0x08, 0x23, 0x77, 0x36, 0xd7, 0xd6, 0x4b, - 0x39, 0x36, 0x0e, 0x85, 0xca, 0xd6, 0x56, 0x29, 0xcf, 0xa6, 0xa0, 0xb8, 0x56, 0xd9, 0xae, 0xac, - 0x54, 0x6a, 0xeb, 0xa5, 0x02, 0x9b, 0x87, 0xd9, 0xfb, 0xd5, 0x3b, 0x6b, 0x9b, 0xf7, 0x6b, 0xce, - 0xda, 0x7a, 0xed, 0xd6, 0xf6, 0xe6, 0x56, 0x69, 0x84, 0xcd, 0x00, 0xdc, 0xba, 0xbb, 0xb2, 0x6e, - 0xdf, 0x59, 0xdf, 0x5e, 0xaf, 0x95, 0x46, 0xd9, 0x02, 0x94, 0x14, 0x89, 0x53, 0x5b, 0xb7, 0xef, - 0x55, 0x57, 0xd7, 0x4b, 0x63, 0x37, 0x47, 0x8a, 0x85, 0xd2, 0x88, 0x3d, 0xbe, 0xc1, 0xdd, 0x90, - 0x57, 0xd7, 0xac, 0x7f, 0xbf, 0x00, 0xc5, 0xdb, 0x3c, 0x72, 0x1b, 0x6e, 0xe4, 0xb2, 0xe7, 0x8c, - 0xf1, 0xc1, 0x26, 0x6a, 0x03, 0xf3, 0x52, 0xef, 0xc0, 0x8c, 0x3e, 0x3e, 0x2a, 0xe7, 0xde, 0xd4, - 0x07, 0xe4, 0x1d, 0x98, 0x5c, 0xe3, 0x61, 0x3d, 0xf0, 0x3a, 0x62, 0xd2, 0x2c, 0x16, 0x10, 0xed, - 0xec, 0xe3, 0xa3, 0xf2, 0xa9, 0x46, 0x02, 0xd6, 0x3a, 0x44, 0xc7, 0x66, 0x55, 0x18, 0xdb, 0x70, - 0x77, 0x78, 0x33, 0x5c, 0x1c, 0x3d, 0x57, 0xb8, 0x30, 0xb9, 0xfc, 0x2c, 0x0d, 0x82, 0xfa, 0xc0, - 0x8b, 0xb2, 0x74, 0xbd, 0x1d, 0x05, 0x87, 0x2b, 0x0b, 0x8f, 0x8f, 0xca, 0xa5, 0x26, 0x02, 0xf4, - 0x0e, 0x96, 0x28, 0xac, 0x96, 0x4c, 0x8c, 0xb1, 0x63, 0x27, 0xc6, 0xf3, 0xbf, 0x75, 0x54, 0xce, - 0x89, 0x01, 0xa3, 0x89, 0x91, 0xf0, 0x33, 0xa7, 0xc8, 0x32, 0x14, 0x6d, 0xfe, 0xd0, 0x0b, 0x45, - 0xcb, 0x8a, 0xd8, 0xb2, 0xd3, 0x8f, 0x8f, 0xca, 0x2c, 0x20, 0x98, 0xf6, 0x19, 0x31, 0xde, 0xd2, - 0xdb, 0x30, 0xa9, 0x7d, 0x35, 0x2b, 0x41, 0xe1, 0x01, 0x3f, 0x94, 0x3d, 0x6c, 0x8b, 0x3f, 0xd9, - 0x02, 0x8c, 0x3e, 0x74, 0x9b, 0x5d, 0xea, 0x52, 0x5b, 0xfe, 0xf8, 0x7c, 0xfe, 0x73, 0xb9, 0x9b, - 0x23, 0xc5, 0xf1, 0x52, 0xd1, 0xce, 0x57, 0xd7, 0xac, 0xbf, 0x33, 0x02, 0x45, 0xdb, 0x97, 0x0b, - 0x91, 0xbd, 0x06, 0xa3, 0xb5, 0xc8, 0x8d, 0xd4, 0x30, 0xcd, 0x3f, 0x3e, 0x2a, 0xcf, 0x8a, 0x45, - 0xca, 0xb5, 0xfa, 0x25, 0x86, 0x40, 0xdd, 0xda, 0x77, 0x43, 0x35, 0x5c, 0x88, 0xda, 0x11, 0x00, - 0x1d, 0x15, 0x31, 0xd8, 0x79, 0x18, 0xb9, 0xed, 0x37, 0x38, 0x8d, 0x18, 0x7b, 0x7c, 0x54, 0x9e, - 0x69, 0xf9, 0x0d, 0x1d, 0x11, 0xcb, 0xd9, 0x1b, 0x30, 0xb1, 0xda, 0x0d, 0x02, 0xde, 0x16, 0x73, - 0x7d, 0x04, 0x91, 0x67, 0x1e, 0x1f, 0x95, 0xa1, 0x2e, 0x81, 0x8e, 0xd7, 0xb0, 0x13, 0x04, 0x31, - 0x0c, 0xb5, 0xc8, 0x0d, 0x22, 0xde, 0x58, 0x1c, 0x1d, 0x6a, 0x18, 0xc4, 0xfa, 0x9c, 0x0b, 0x25, - 0x49, 0x7a, 0x18, 0x88, 0x13, 0xbb, 0x01, 0x93, 0xd7, 0x03, 0xb7, 0xce, 0xb7, 0x78, 0xe0, 0xf9, - 0x0d, 0x1c, 0xdf, 0xc2, 0xca, 0xf9, 0xc7, 0x47, 0xe5, 0xd3, 0x7b, 0x02, 0xec, 0x74, 0x10, 0x9e, - 0x50, 0x7f, 0xe7, 0xa8, 0x5c, 0x5c, 0xa3, 0x2d, 0xd3, 0xd6, 0x49, 0xd9, 0xd7, 0xc5, 0xe0, 0x84, - 0x11, 0x76, 0x2d, 0x6f, 0x2c, 0x8e, 0x1f, 0xfb, 0x89, 0x16, 0x7d, 0xe2, 0xe9, 0xa6, 0x1b, 0x46, - 0x4e, 0x20, 0xe9, 0x52, 0xdf, 0xa9, 0xb3, 0x64, 0x9b, 0x50, 0xac, 0xd5, 0xf7, 0x79, 0xa3, 0xdb, - 0xe4, 0x38, 0x65, 0x26, 0x97, 0xcf, 0xd0, 0xa4, 0x56, 0xe3, 0xa9, 0x8a, 0x57, 0x96, 0x88, 0x37, - 0x0b, 0x09, 0xa2, 0xcf, 0x27, 0x85, 0xf5, 0xf9, 0xe2, 0xb7, 0x7e, 0xb6, 0xfc, 0xcc, 0x0f, 0xfc, - 0xfe, 0xb9, 0x67, 0xac, 0xff, 0x2c, 0x0f, 0xa5, 0x34, 0x13, 0xb6, 0x0b, 0xd3, 0x77, 0x3b, 0x0d, - 0x37, 0xe2, 0xab, 0x4d, 0x8f, 0xb7, 0xa3, 0x10, 0x27, 0xc9, 0xe0, 0x36, 0xbd, 0x4c, 0xf5, 0x2e, - 0x76, 0x91, 0xd0, 0xa9, 0x4b, 0xca, 0x54, 0xab, 0x4c, 0xb6, 0x49, 0x3d, 0x35, 0xdc, 0xc0, 0x43, - 0x9c, 0x61, 0x27, 0xab, 0x47, 0x6e, 0xfd, 0x7d, 0xea, 0x21, 0xb6, 0x34, 0x81, 0xda, 0x8d, 0x9d, - 0x43, 0x9c, 0x99, 0xc3, 0x4f, 0x20, 0x41, 0x92, 0x31, 0x81, 0x04, 0xd8, 0xfa, 0xdf, 0x72, 0x30, - 0x63, 0xf3, 0xd0, 0xef, 0x06, 0x75, 0x7e, 0x83, 0xbb, 0x0d, 0x1e, 0x88, 0xe9, 0x7f, 0xcb, 0x6b, - 0x37, 0x68, 0x4d, 0xe1, 0xf4, 0x7f, 0xe0, 0xb5, 0xf5, 0xad, 0x1b, 0xcb, 0xd9, 0xa7, 0x61, 0xbc, - 0xd6, 0xdd, 0x41, 0xd4, 0x7c, 0xb2, 0x03, 0x84, 0xdd, 0x1d, 0x27, 0x85, 0xae, 0xd0, 0xd8, 0x25, - 0x18, 0xbf, 0xc7, 0x83, 0x30, 0xd9, 0x0d, 0xf1, 0x68, 0x78, 0x28, 0x41, 0x3a, 0x01, 0x61, 0xb1, - 0xeb, 0xc9, 0x8e, 0x4c, 0x87, 0xda, 0x6c, 0x6a, 0x1f, 0x4c, 0xa6, 0x4a, 0x8b, 0x20, 0xfa, 0x54, - 0x51, 0x58, 0xd6, 0x8f, 0xe7, 0xa1, 0xb4, 0xe6, 0x46, 0xee, 0x8e, 0x1b, 0x52, 0x7f, 0xde, 0xbb, - 0x22, 0xf6, 0x78, 0xad, 0xa1, 0xb8, 0xc7, 0x8b, 0x2f, 0xff, 0xd8, 0xcd, 0x7b, 0x25, 0xdd, 0xbc, - 0x49, 0x71, 0xc2, 0x52, 0xf3, 0x92, 0x46, 0xbd, 0x77, 0x7c, 0xa3, 0x4a, 0xd4, 0xa8, 0xa2, 0x6a, - 0x54, 0xd2, 0x14, 0xf6, 0x1e, 0x8c, 0xd4, 0x3a, 0xbc, 0x4e, 0x9b, 0x88, 0x3a, 0x17, 0xcc, 0xc6, - 0x09, 0x84, 0x7b, 0x57, 0x56, 0xa6, 0x88, 0xcd, 0x48, 0xd8, 0xe1, 0x75, 0x1b, 0xc9, 0xb4, 0x45, - 0xf3, 0x9f, 0x17, 0x60, 0x21, 0x8b, 0x4c, 0x6f, 0xc7, 0xd8, 0x80, 0x76, 0x5c, 0x80, 0xa2, 0x38, - 0xc2, 0xc5, 0xb1, 0x88, 0xdb, 0xc5, 0xc4, 0xca, 0x94, 0xf8, 0xe4, 0x7d, 0x82, 0xd9, 0x71, 0x29, - 0x7b, 0x29, 0x96, 0x08, 0x8a, 0x09, 0x3f, 0x92, 0x08, 0x94, 0x1c, 0x20, 0xc6, 0x5a, 0x2d, 0x61, - 0x14, 0x1c, 0x92, 0x6e, 0x51, 0xe0, 0x64, 0xac, 0x03, 0x82, 0x18, 0xc7, 0x8c, 0x3a, 0x14, 0xd6, - 0xa1, 0xa8, 0x9a, 0xb5, 0x38, 0x85, 0x8c, 0xe6, 0x52, 0x9d, 0x74, 0xef, 0x8a, 0x1c, 0xcc, 0x06, - 0xfd, 0xd6, 0xd9, 0x28, 0x1c, 0x76, 0x05, 0x8a, 0x5b, 0x81, 0xff, 0xe8, 0xb0, 0xba, 0x16, 0x2e, - 0x4e, 0x9f, 0x2b, 0x5c, 0x98, 0x58, 0x39, 0xf3, 0xf8, 0xa8, 0x3c, 0xdf, 0x11, 0x30, 0xc7, 0x6b, - 0xe8, 0x27, 0x6d, 0x8c, 0x78, 0x73, 0xa4, 0x98, 0x2b, 0xe5, 0x6f, 0x8e, 0x14, 0xf3, 0xa5, 0x82, - 0x14, 0x2f, 0x6e, 0x8e, 0x14, 0x47, 0x4a, 0xa3, 0x37, 0x47, 0x8a, 0xa3, 0x28, 0x70, 0x4c, 0x94, - 0xe0, 0xe6, 0x48, 0x71, 0xb2, 0x34, 0x65, 0x9c, 0xf6, 0xc8, 0x20, 0xf2, 0xeb, 0x7e, 0xd3, 0x2e, - 0xdc, 0xb5, 0xab, 0xf6, 0xd8, 0x6a, 0x65, 0x95, 0x07, 0x91, 0x5d, 0xa8, 0xdc, 0xaf, 0xd9, 0xd3, - 0x6b, 0x87, 0x6d, 0xb7, 0xe5, 0xd5, 0xe5, 0xd1, 0x69, 0x17, 0xae, 0xaf, 0x6e, 0x59, 0x15, 0x98, - 0x49, 0xda, 0xb2, 0xe1, 0x85, 0x11, 0xbb, 0x04, 0x13, 0x0a, 0x22, 0x36, 0xba, 0x42, 0x66, 0xab, - 0xed, 0x04, 0xc7, 0xfa, 0xcd, 0x3c, 0x40, 0x52, 0xf2, 0x94, 0xae, 0x85, 0xcf, 0x1a, 0x6b, 0xe1, - 0x54, 0x7a, 0x2d, 0xf4, 0x5d, 0x05, 0xec, 0x03, 0x18, 0x13, 0x62, 0x41, 0x57, 0x89, 0x44, 0x67, - 0xd2, 0xa4, 0x58, 0x78, 0xef, 0xca, 0xca, 0x0c, 0x11, 0x8f, 0x85, 0x08, 0xb1, 0x89, 0x4c, 0x5b, - 0x46, 0x3f, 0x33, 0x9e, 0x0c, 0x06, 0x2d, 0xa0, 0x0b, 0x10, 0x0f, 0x28, 0x75, 0x28, 0xae, 0x8c, - 0x8e, 0x1a, 0xe4, 0xb8, 0x94, 0x9d, 0x05, 0x31, 0xe0, 0xd4, 0xa9, 0xe3, 0x8f, 0x8f, 0xca, 0x85, - 0x6e, 0xe0, 0xe1, 0x24, 0x60, 0x97, 0x80, 0xa6, 0x01, 0x75, 0xa0, 0x98, 0x7d, 0x73, 0x75, 0xd7, - 0xa9, 0xf3, 0x20, 0x4a, 0x7a, 0x7c, 0x31, 0xa7, 0x66, 0x0b, 0xeb, 0x80, 0x39, 0x55, 0x16, 0x47, - 0x70, 0x1a, 0x5c, 0xc8, 0xec, 0x95, 0x8b, 0x06, 0xaa, 0x14, 0x23, 0xcf, 0xa9, 0x53, 0xa9, 0x21, - 0xcb, 0x9c, 0x1e, 0x91, 0xd2, 0xac, 0x80, 0x5d, 0x01, 0x31, 0x43, 0xa9, 0xf7, 0x81, 0xea, 0xa9, - 0xdc, 0xaf, 0xad, 0x9c, 0x22, 0x4e, 0xd3, 0xee, 0x81, 0x4e, 0x2e, 0xb0, 0xd9, 0x3b, 0x20, 0xa6, - 0x30, 0xf5, 0x3b, 0x23, 0xa2, 0xeb, 0xab, 0x5b, 0xab, 0x4d, 0xbf, 0xdb, 0xa8, 0x7d, 0x71, 0x23, - 0x21, 0xde, 0xab, 0x77, 0x74, 0xe2, 0xeb, 0xab, 0x5b, 0xec, 0x1d, 0x18, 0xad, 0x7c, 0xb3, 0x1b, - 0x70, 0x92, 0x4f, 0xa6, 0x54, 0x9d, 0x02, 0xb6, 0x72, 0x86, 0x08, 0x67, 0x5d, 0xf1, 0x53, 0x97, - 0xeb, 0xb0, 0x5c, 0xd4, 0xbc, 0xbd, 0x51, 0x23, 0xd9, 0x83, 0xa5, 0xba, 0x65, 0x7b, 0x43, 0xfb, - 0xec, 0xc8, 0x68, 0xb5, 0xa0, 0x62, 0x97, 0x20, 0x5f, 0x59, 0xc3, 0x1b, 0xd1, 0xe4, 0xf2, 0x84, - 0xaa, 0x76, 0x6d, 0x65, 0x81, 0x48, 0xa6, 0x5c, 0x7d, 0x19, 0xe4, 0x2b, 0x6b, 0x6c, 0x05, 0x46, - 0x6f, 0x1f, 0xd6, 0xbe, 0xb8, 0x41, 0x9b, 0xd9, 0xbc, 0x9a, 0xd7, 0x02, 0xb6, 0x89, 0xcb, 0x3e, - 0x4c, 0xbe, 0xb8, 0x75, 0x18, 0x7e, 0xa3, 0xa9, 0x7f, 0x31, 0xa2, 0xb1, 0x2d, 0x98, 0xa8, 0x34, - 0x5a, 0x5e, 0xfb, 0x6e, 0xc8, 0x83, 0xc5, 0x49, 0xe4, 0xb3, 0x98, 0xfa, 0xee, 0xb8, 0x7c, 0x65, - 0xf1, 0xf1, 0x51, 0x79, 0xc1, 0x15, 0x3f, 0x9d, 0x6e, 0xc8, 0x03, 0x8d, 0x5b, 0xc2, 0x84, 0x6d, - 0x01, 0xdc, 0xf6, 0xdb, 0x7b, 0x7e, 0x25, 0x6a, 0xba, 0x61, 0x6a, 0x7b, 0x4c, 0x0a, 0x62, 0xf1, - 0xe1, 0x54, 0x4b, 0xc0, 0x1c, 0x57, 0x00, 0x35, 0x86, 0x1a, 0x0f, 0x76, 0x0d, 0xc6, 0x36, 0x03, - 0xb7, 0xde, 0xe4, 0x8b, 0xd3, 0xc8, 0x6d, 0x81, 0xb8, 0x49, 0xa0, 0x6a, 0xe9, 0x22, 0x31, 0x2c, - 0xf9, 0x08, 0xd6, 0xaf, 0x29, 0x12, 0x71, 0xe9, 0x3e, 0xb0, 0xde, 0x39, 0x99, 0x71, 0x49, 0xf8, - 0x94, 0x7e, 0x49, 0x48, 0x16, 0xfd, 0xaa, 0xdf, 0x6a, 0xb9, 0xed, 0x06, 0xd2, 0xde, 0x5b, 0xd6, - 0xee, 0x0e, 0xd6, 0x37, 0x60, 0xae, 0xa7, 0xb3, 0x8e, 0xb9, 0xdf, 0xbd, 0x0f, 0xb3, 0x6b, 0x7c, - 0xd7, 0xed, 0x36, 0xa3, 0xf8, 0x24, 0x91, 0x4b, 0x14, 0x6f, 0x5a, 0x0d, 0x59, 0xe4, 0xa8, 0xe3, - 0xc3, 0x4e, 0x23, 0x5b, 0xef, 0xc1, 0xb4, 0xd1, 0x7c, 0x71, 0x55, 0xa8, 0x74, 0x1b, 0x5e, 0x84, - 0x03, 0x99, 0x4b, 0xae, 0x0a, 0xae, 0x00, 0xe2, 0x70, 0xd9, 0x09, 0x82, 0xf5, 0x1f, 0xe8, 0xd2, - 0x0a, 0xed, 0x44, 0xe2, 0x5a, 0x4d, 0xfb, 0x41, 0x2e, 0x91, 0x9d, 0x7a, 0xf6, 0x83, 0x78, 0x37, - 0x78, 0x4d, 0xae, 0xcd, 0x7c, 0xcf, 0xda, 0x9c, 0xa4, 0x91, 0x28, 0xb8, 0x07, 0xa1, 0x5c, 0x91, - 0xf1, 0x4c, 0x2d, 0x7c, 0xfc, 0x99, 0xfa, 0x01, 0x4c, 0xdd, 0x76, 0xdb, 0xee, 0x1e, 0x6f, 0x88, - 0x16, 0xc8, 0xbd, 0x67, 0x62, 0xe5, 0xd9, 0xc7, 0x47, 0xe5, 0x33, 0x2d, 0x09, 0xc7, 0x56, 0xea, - 0x93, 0xc8, 0x20, 0x60, 0x97, 0xd5, 0xca, 0x1e, 0xcd, 0x58, 0xd9, 0xd3, 0x54, 0xfb, 0x28, 0xae, - 0x6c, 0x5a, 0xcf, 0xd6, 0xaf, 0x4d, 0x60, 0x1b, 0xd9, 0x1b, 0x30, 0x66, 0xf3, 0x3d, 0x71, 0xd4, - 0xe4, 0x92, 0x41, 0x0a, 0x10, 0xa2, 0x77, 0x8c, 0xc4, 0x41, 0x39, 0x83, 0x37, 0xc2, 0x7d, 0x6f, - 0x37, 0xa2, 0xde, 0x89, 0xe5, 0x0c, 0x02, 0x6b, 0x72, 0x06, 0x41, 0xcc, 0xeb, 0xac, 0x84, 0x89, - 0xdd, 0xcf, 0x5e, 0xab, 0x51, 0xa7, 0xa9, 0x1e, 0xb6, 0xd7, 0xb4, 0x6d, 0x24, 0x30, 0xa4, 0x04, - 0x81, 0xcd, 0xae, 0xc2, 0x44, 0xa5, 0x5e, 0xf7, 0xbb, 0xda, 0x9d, 0x51, 0xae, 0x5b, 0x09, 0x34, - 0x55, 0x24, 0x09, 0x2a, 0xab, 0xc1, 0xe4, 0xba, 0xb8, 0x68, 0x79, 0xab, 0x6e, 0x7d, 0x5f, 0x75, - 0x92, 0xda, 0xc3, 0xb4, 0x92, 0x64, 0xe5, 0x72, 0x04, 0xd6, 0x05, 0x50, 0x57, 0x32, 0x68, 0xb8, - 0x6c, 0x1b, 0x26, 0x6b, 0xbc, 0x1e, 0xf0, 0xa8, 0x16, 0xf9, 0x01, 0x4f, 0x6d, 0xc9, 0x5a, 0xc9, - 0xca, 0x0b, 0xea, 0xae, 0x17, 0x22, 0xd0, 0x09, 0x05, 0x54, 0xe7, 0xaa, 0x21, 0x4b, 0xa1, 0xbd, - 0xe5, 0x07, 0x87, 0x6b, 0x2b, 0xb4, 0x4d, 0x27, 0x67, 0xba, 0x04, 0xeb, 0x42, 0xbb, 0x80, 0x34, - 0x76, 0x4c, 0xa1, 0x5d, 0x62, 0xe1, 0x48, 0xad, 0xd5, 0x50, 0xb6, 0xa2, 0x4d, 0x7b, 0x36, 0xe9, - 0x65, 0x04, 0x6b, 0x23, 0xd5, 0x08, 0x51, 0x32, 0x33, 0x46, 0x8a, 0xb0, 0x58, 0x07, 0x98, 0x1a, - 0x35, 0x29, 0xe8, 0x36, 0x79, 0x18, 0xd2, 0x5e, 0x7e, 0x36, 0x35, 0xf8, 0x09, 0xc2, 0xca, 0x2b, - 0xc4, 0xfc, 0x79, 0x35, 0x0d, 0xe8, 0x9e, 0x26, 0x0a, 0xb5, 0x7a, 0x32, 0x78, 0xb3, 0xb7, 0x01, - 0xd6, 0x1f, 0x45, 0x3c, 0x68, 0xbb, 0xcd, 0x58, 0x0f, 0x86, 0xaa, 0x1f, 0x4e, 0x50, 0x73, 0xa0, - 0x35, 0x64, 0xb6, 0x0a, 0xd3, 0x95, 0x30, 0xec, 0xb6, 0xb8, 0xed, 0x37, 0x79, 0xc5, 0xbe, 0x83, - 0xfb, 0xfe, 0xc4, 0xca, 0xf3, 0x8f, 0x8f, 0xca, 0x67, 0x5d, 0x2c, 0x70, 0x02, 0xbf, 0xc9, 0x1d, - 0x37, 0xd0, 0x67, 0xb7, 0x49, 0xc3, 0x36, 0x01, 0x36, 0x3b, 0xbc, 0x5d, 0xe3, 0x6e, 0x50, 0xdf, - 0x4f, 0x6d, 0xf3, 0x49, 0xc1, 0xca, 0x73, 0xd4, 0xc2, 0x05, 0xbf, 0xc3, 0xdb, 0x21, 0xc2, 0xf4, - 0xaf, 0x4a, 0x30, 0xd9, 0x7d, 0x98, 0xad, 0x56, 0x6e, 0x6f, 0xf9, 0x4d, 0xaf, 0x7e, 0x48, 0x92, - 0xd3, 0x0c, 0x6a, 0x07, 0x4f, 0x13, 0xd7, 0x54, 0xa9, 0xdc, 0x9e, 0x3c, 0xb7, 0xe5, 0x74, 0x10, - 0xea, 0x90, 0xfc, 0x94, 0xe6, 0xc2, 0x3e, 0x14, 0x73, 0x30, 0x14, 0xc2, 0xe0, 0xb6, 0xbb, 0x17, - 0x2e, 0xce, 0x1a, 0xda, 0xae, 0xca, 0xfd, 0xda, 0x45, 0xad, 0x54, 0x8a, 0x29, 0x4b, 0x72, 0x22, - 0x22, 0xd4, 0x89, 0xdc, 0xbd, 0xd0, 0x9c, 0x88, 0x31, 0x36, 0xbb, 0x09, 0xb0, 0xe6, 0xd7, 0xbb, - 0x2d, 0xde, 0x8e, 0xd6, 0x56, 0x16, 0x4b, 0xe6, 0x55, 0x20, 0x2e, 0x48, 0xb6, 0xb6, 0x86, 0x5f, - 0x37, 0x66, 0xa2, 0x46, 0xbd, 0xf4, 0x3e, 0x94, 0xd2, 0x1f, 0x72, 0x42, 0x05, 0xd6, 0x74, 0x69, - 0x46, 0x6b, 0xfd, 0xfa, 0x23, 0x2f, 0x8c, 0x42, 0xeb, 0xfb, 0x8d, 0x15, 0x28, 0x76, 0x87, 0x5b, - 0xfc, 0x70, 0x2b, 0xe0, 0xbb, 0xde, 0x23, 0xda, 0xcc, 0x70, 0x77, 0x78, 0xc0, 0x0f, 0x9d, 0x0e, - 0x42, 0xf5, 0xdd, 0x21, 0x46, 0x65, 0x9f, 0x81, 0xe2, 0xad, 0xdb, 0xb5, 0x5b, 0xfc, 0xb0, 0xba, - 0x46, 0x07, 0x95, 0x24, 0x6b, 0x85, 0x8e, 0x20, 0x35, 0xe6, 0x5a, 0x8c, 0x69, 0xad, 0x24, 0x3b, - 0xa1, 0xa8, 0x79, 0xb5, 0xd9, 0x0d, 0x23, 0x1e, 0x54, 0xd7, 0xf4, 0x9a, 0xeb, 0x12, 0x98, 0xda, - 0x97, 0x62, 0x54, 0xeb, 0x5f, 0xe5, 0x71, 0x17, 0x14, 0x13, 0xbe, 0xda, 0x0e, 0x23, 0xb7, 0x5d, - 0xe7, 0x31, 0x03, 0x9c, 0xf0, 0x1e, 0x41, 0x53, 0x13, 0x3e, 0x41, 0x36, 0xab, 0xce, 0x0f, 0x5d, - 0xb5, 0xa8, 0x52, 0x69, 0x2e, 0xaa, 0x6b, 0xba, 0x7a, 0x35, 0x20, 0x68, 0xaa, 0xca, 0x04, 0x99, - 0x9d, 0x87, 0xf1, 0x6a, 0xe5, 0x76, 0xa5, 0x1b, 0xed, 0xe3, 0x1e, 0x5c, 0x94, 0xf2, 0xb9, 0x98, - 0xad, 0x6e, 0x37, 0xda, 0xb7, 0x55, 0x21, 0xbb, 0x84, 0xf7, 0x9e, 0x36, 0x8f, 0xa4, 0x1a, 0x96, - 0x0e, 0xdd, 0x50, 0x82, 0x52, 0xd7, 0x1e, 0x01, 0x62, 0xaf, 0xc3, 0xe8, 0xbd, 0xad, 0xd5, 0xea, - 0x1a, 0x5d, 0x9c, 0xf1, 0x24, 0x7a, 0xd8, 0xa9, 0x9b, 0x5f, 0x22, 0x51, 0xd8, 0x3a, 0xcc, 0xd4, - 0x78, 0xbd, 0x1b, 0x78, 0xd1, 0xe1, 0xf5, 0xc0, 0xef, 0x76, 0xc2, 0xc5, 0x71, 0xac, 0x03, 0x57, - 0x7a, 0x48, 0x25, 0xce, 0x1e, 0x16, 0x69, 0xd4, 0x29, 0x22, 0xeb, 0xd7, 0x73, 0xc9, 0x36, 0xc9, - 0xce, 0x1b, 0x62, 0x0d, 0xea, 0x6e, 0x84, 0x58, 0xa3, 0xeb, 0x6e, 0x50, 0xc0, 0xb1, 0x81, 0xad, - 0x76, 0xc3, 0xc8, 0x6f, 0xad, 0xb7, 0x1b, 0x1d, 0xdf, 0x6b, 0x47, 0x48, 0x25, 0x3b, 0xdf, 0x7a, - 0x7c, 0x54, 0x7e, 0xa1, 0x8e, 0xa5, 0x0e, 0xa7, 0x62, 0x27, 0xc5, 0x25, 0x83, 0xfa, 0x13, 0x8c, - 0x87, 0xf5, 0xdb, 0x79, 0xe3, 0x78, 0x13, 0x9f, 0x67, 0xf3, 0x4e, 0xd3, 0xab, 0xe3, 0x8d, 0x1e, - 0x1b, 0x1a, 0xcf, 0x2a, 0xfc, 0xbc, 0x20, 0x29, 0x95, 0x3d, 0x64, 0xf2, 0xce, 0xa0, 0x66, 0x5f, - 0x80, 0x29, 0x21, 0x69, 0xd0, 0xcf, 0x70, 0x31, 0x8f, 0x9d, 0xfd, 0x1c, 0x6a, 0xe1, 0x42, 0x1e, - 0xc4, 0x6c, 0x0c, 0x11, 0x45, 0xa7, 0x60, 0x0d, 0x58, 0xdc, 0x0e, 0xdc, 0x76, 0xe8, 0x45, 0xeb, - 0xed, 0x7a, 0x70, 0x88, 0x92, 0xd1, 0x7a, 0xdb, 0xdd, 0x69, 0xf2, 0x06, 0x36, 0xb7, 0xb8, 0x72, - 0xe1, 0xf1, 0x51, 0xf9, 0xe5, 0x48, 0xe2, 0x38, 0x3c, 0x46, 0x72, 0xb8, 0xc4, 0xd2, 0x38, 0xf7, - 0xe5, 0x24, 0x24, 0x29, 0xd5, 0xad, 0xf8, 0x08, 0x23, 0x85, 0x04, 0x94, 0xa4, 0xe2, 0xd1, 0x10, - 0x7b, 0x98, 0xfe, 0x99, 0x3a, 0x81, 0xf5, 0x7f, 0xe7, 0x92, 0x03, 0x98, 0xbd, 0x0b, 0x93, 0xb4, - 0x62, 0xb4, 0x79, 0x81, 0x3b, 0xa8, 0x5a, 0x5e, 0xa9, 0x91, 0xd5, 0xd1, 0xc5, 0xbd, 0xbf, 0xb2, - 0xba, 0xa1, 0xcd, 0x0d, 0xbc, 0xf7, 0xbb, 0xf5, 0x66, 0x9a, 0x4a, 0xa1, 0x89, 0x49, 0xb0, 0xbd, - 0x51, 0x33, 0x7b, 0x05, 0x27, 0x41, 0xd4, 0x0c, 0x33, 0xba, 0x41, 0x43, 0xfe, 0xe4, 0x0d, 0xff, - 0x1f, 0x72, 0x59, 0xe7, 0x3c, 0x5b, 0x81, 0xe9, 0xfb, 0x7e, 0xf0, 0x00, 0xc7, 0x57, 0xeb, 0x04, - 0x1c, 0xf9, 0x03, 0x55, 0x90, 0x6e, 0x90, 0x49, 0xa2, 0x7f, 0x9b, 0xd6, 0x1b, 0xe6, 0xb7, 0xa5, - 0x38, 0x18, 0x04, 0x62, 0x1c, 0x62, 0x8e, 0xf1, 0xea, 0xc0, 0x71, 0x48, 0x3e, 0xc1, 0x98, 0xc2, - 0x3a, 0xba, 0xf5, 0x5f, 0xe6, 0xf4, 0xf3, 0x5c, 0x74, 0xf2, 0x9a, 0xdf, 0x72, 0xbd, 0xb6, 0xd6, - 0x1c, 0xf9, 0xb0, 0x84, 0xd0, 0xf4, 0x97, 0x68, 0xc8, 0xec, 0x0a, 0x14, 0xe5, 0xaf, 0x78, 0xaf, - 0x45, 0xad, 0x16, 0x11, 0x9a, 0x07, 0x85, 0x42, 0xec, 0x19, 0x99, 0xc2, 0x49, 0x47, 0xe6, 0xd7, - 0x72, 0xfa, 0x51, 0xfc, 0x71, 0x0f, 0x9b, 0xd4, 0x21, 0x93, 0x3f, 0xc9, 0x21, 0xf3, 0x89, 0x9b, - 0xf0, 0x03, 0x39, 0x98, 0xd4, 0xb4, 0x14, 0xa2, 0x0d, 0x5b, 0x81, 0xff, 0x11, 0xaf, 0x47, 0x66, - 0x1b, 0x3a, 0x12, 0x98, 0x6a, 0x43, 0x8c, 0xfa, 0x09, 0xda, 0x60, 0xfd, 0x49, 0x8e, 0xee, 0x48, - 0x43, 0x6f, 0xf3, 0xe6, 0x96, 0x9c, 0x3f, 0xc9, 0x11, 0xf9, 0x05, 0x18, 0xb5, 0x79, 0xc3, 0x0b, - 0xe9, 0x7e, 0x33, 0xa7, 0xdf, 0xc7, 0xb0, 0x20, 0x91, 0x9b, 0x02, 0xf1, 0x53, 0x3f, 0xdf, 0xb0, - 0x5c, 0x08, 0xb2, 0xd5, 0xf0, 0x5a, 0x93, 0x3f, 0xf2, 0xe4, 0x62, 0xa4, 0xa3, 0x16, 0x8f, 0x37, - 0x2f, 0x74, 0x76, 0x45, 0x09, 0x49, 0xd4, 0xfa, 0xc2, 0x33, 0x68, 0xac, 0x0f, 0x01, 0x92, 0x2a, - 0xd9, 0x2d, 0x28, 0xd1, 0x6c, 0xf0, 0xda, 0x7b, 0x52, 0x90, 0xa2, 0x3e, 0x28, 0x3f, 0x3e, 0x2a, - 0x3f, 0x5b, 0x8f, 0xcb, 0x48, 0xea, 0xd4, 0xf8, 0xf6, 0x10, 0x5a, 0xff, 0x51, 0x1e, 0xf2, 0x15, - 0x1c, 0x90, 0x5b, 0xfc, 0x30, 0x72, 0x77, 0xae, 0x79, 0x4d, 0x63, 0x31, 0x3d, 0x40, 0xa8, 0xb3, - 0xeb, 0x19, 0xea, 0x0a, 0x0d, 0x59, 0x2c, 0xa6, 0x5b, 0xc1, 0xce, 0x5b, 0x48, 0xa8, 0x2d, 0xa6, - 0x07, 0xc1, 0xce, 0x5b, 0x69, 0xb2, 0x18, 0x91, 0x59, 0x30, 0x26, 0x17, 0x16, 0xcd, 0x41, 0x78, - 0x7c, 0x54, 0x1e, 0x93, 0xeb, 0xcf, 0xa6, 0x12, 0x76, 0x16, 0x0a, 0xb5, 0xad, 0x3b, 0xb4, 0x03, - 0xa2, 0x5a, 0x30, 0xec, 0xb4, 0x6d, 0x01, 0x13, 0x75, 0x6e, 0xac, 0x55, 0xb6, 0x50, 0x11, 0x30, - 0x9a, 0xd4, 0xd9, 0x6c, 0xb8, 0x9d, 0xb4, 0x2a, 0x20, 0x46, 0x64, 0xef, 0xc1, 0xe4, 0xad, 0xb5, - 0xd5, 0x1b, 0x7e, 0x28, 0x77, 0xaf, 0xb1, 0x64, 0xf2, 0x3f, 0x68, 0xd4, 0x1d, 0xd4, 0xc4, 0xa7, - 0x8f, 0x01, 0x0d, 0xdf, 0xfa, 0xa1, 0x3c, 0x4c, 0x6a, 0x7a, 0x32, 0xf6, 0x19, 0x7a, 0x20, 0xcd, - 0x19, 0x37, 0x00, 0x0d, 0x43, 0x94, 0x4a, 0xa5, 0x4a, 0xcb, 0x6f, 0x70, 0x7a, 0x2e, 0x4d, 0x14, - 0x18, 0xf9, 0x61, 0x14, 0x18, 0x6f, 0x03, 0xc8, 0x39, 0x80, 0x9f, 0xac, 0x89, 0x13, 0x9a, 0x9d, - 0x84, 0x3e, 0x2e, 0x09, 0x32, 0xbb, 0x07, 0xf3, 0xdb, 0x41, 0x37, 0x8c, 0x6a, 0x87, 0x61, 0xc4, - 0x5b, 0x82, 0xdb, 0x96, 0xef, 0x37, 0x69, 0xfe, 0xbd, 0xfc, 0xf8, 0xa8, 0x7c, 0x2e, 0x12, 0xc5, - 0x4e, 0x88, 0xe5, 0xf8, 0x01, 0x4e, 0xc7, 0xf7, 0x75, 0xb5, 0x46, 0x16, 0x03, 0xcb, 0x86, 0x29, - 0x5d, 0x29, 0x22, 0x4e, 0x16, 0x7a, 0x4c, 0x22, 0x55, 0xb7, 0x76, 0xb2, 0xd0, 0x57, 0xf6, 0x3e, - 0x6e, 0x99, 0x24, 0xd6, 0x67, 0x74, 0x85, 0xdc, 0xb0, 0x0b, 0xdb, 0xfa, 0xab, 0xb9, 0x64, 0x1b, - 0xb9, 0x77, 0x99, 0xbd, 0x03, 0x63, 0xf2, 0xf1, 0x8e, 0xde, 0x38, 0x4f, 0xc5, 0x97, 0x5a, 0xfd, - 0x65, 0x4f, 0x6a, 0xc2, 0x7f, 0x57, 0x3e, 0xf0, 0x3f, 0x63, 0x13, 0x49, 0xac, 0x44, 0x37, 0xf5, - 0x69, 0x8a, 0x3b, 0xaa, 0x8b, 0x2f, 0x67, 0x29, 0xd1, 0xad, 0xdf, 0x18, 0x81, 0x19, 0x13, 0x4d, - 0x7f, 0xe1, 0xcb, 0x0d, 0xf5, 0xc2, 0xf7, 0x05, 0x28, 0x8a, 0xfe, 0xf0, 0xea, 0x5c, 0x49, 0x64, - 0x2f, 0xe3, 0xd3, 0x02, 0xc1, 0x8c, 0x97, 0x6b, 0x90, 0xc3, 0x21, 0xee, 0xb8, 0x76, 0x4c, 0xc5, - 0x96, 0xb5, 0x67, 0xa8, 0x42, 0x22, 0xa4, 0xa8, 0x67, 0x28, 0x7d, 0x3d, 0xc4, 0x0f, 0x52, 0x6f, - 0xc2, 0x98, 0x90, 0xef, 0x63, 0x15, 0x0c, 0x7e, 0xa5, 0x10, 0xfd, 0x53, 0x26, 0x2a, 0x12, 0x89, - 0xdd, 0x87, 0xe2, 0x86, 0x1b, 0x46, 0x35, 0xce, 0xdb, 0x43, 0xbc, 0xdd, 0x97, 0xa9, 0xab, 0xe6, - 0xf1, 0x61, 0x3c, 0xe4, 0xbc, 0x9d, 0x7a, 0x7c, 0x8d, 0x99, 0xb1, 0xaf, 0x02, 0xac, 0xfa, 0xed, - 0x28, 0xf0, 0x9b, 0x1b, 0xfe, 0xde, 0xe2, 0x18, 0xde, 0x7d, 0x5f, 0x48, 0x0d, 0x40, 0x82, 0x20, - 0xaf, 0xbf, 0xb1, 0x82, 0xa7, 0x2e, 0x0b, 0x9c, 0xa6, 0xbf, 0xa7, 0xaf, 0x83, 0x04, 0x9f, 0x5d, - 0x83, 0x92, 0x52, 0x2c, 0xdc, 0xed, 0xec, 0x05, 0x38, 0x41, 0xc6, 0x13, 0xc9, 0x83, 0x3f, 0x8a, - 0x9c, 0x2e, 0xc1, 0xf5, 0x9d, 0x32, 0x4d, 0xc3, 0xbe, 0x02, 0x67, 0xd2, 0x30, 0x35, 0xca, 0xc5, - 0x44, 0x26, 0xd7, 0xd9, 0x65, 0xcc, 0xfb, 0x7e, 0x2c, 0xac, 0xef, 0xe4, 0xe1, 0x4c, 0x9f, 0xc6, - 0x8a, 0xf5, 0x80, 0xc7, 0xb5, 0xb6, 0x1e, 0x52, 0xa7, 0xb4, 0xb4, 0x39, 0x3a, 0x07, 0x79, 0x3a, - 0xe0, 0x46, 0x56, 0x4a, 0x8f, 0x8f, 0xca, 0x53, 0xc6, 0x38, 0xe6, 0xab, 0x6b, 0xec, 0x26, 0x8c, - 0x88, 0x21, 0x1a, 0xe2, 0xe9, 0x5c, 0xe9, 0x94, 0x66, 0x22, 0x4f, 0x9f, 0x3e, 0x38, 0x74, 0xc8, - 0x83, 0x7d, 0x06, 0x0a, 0xdb, 0xdb, 0x1b, 0x38, 0x77, 0x0a, 0xd8, 0xf6, 0xe9, 0x28, 0x6a, 0x1a, - 0x53, 0x75, 0x5a, 0xd0, 0x5e, 0x8c, 0x2d, 0x2d, 0x04, 0x3a, 0xfb, 0x52, 0xca, 0xa4, 0xe7, 0xf5, - 0xc1, 0x03, 0x3d, 0xbc, 0x85, 0xcf, 0x27, 0x30, 0xac, 0xb1, 0x7e, 0x3a, 0x9f, 0xac, 0xe1, 0x6b, - 0x5e, 0x33, 0xe2, 0x01, 0x5b, 0x92, 0x4b, 0x32, 0x11, 0xce, 0xec, 0xf8, 0x37, 0x5b, 0x4c, 0xd6, - 0xb7, 0x64, 0x15, 0x2f, 0xe4, 0xd7, 0xb5, 0x85, 0x5c, 0xc0, 0x85, 0x3c, 0xd3, 0x77, 0xc9, 0xbe, - 0x9e, 0x31, 0x2f, 0x71, 0x21, 0x66, 0xcc, 0xbd, 0x97, 0x61, 0xfa, 0x8e, 0xbf, 0xfe, 0x28, 0x8a, - 0x11, 0xc5, 0x02, 0x2c, 0xda, 0x26, 0x50, 0x70, 0xdc, 0x6c, 0x36, 0x78, 0xb0, 0xbd, 0xef, 0xb6, - 0x8d, 0xb7, 0x6b, 0xbb, 0x07, 0x2e, 0x70, 0xef, 0xf0, 0x03, 0x13, 0x77, 0x5c, 0xe2, 0xa6, 0xe1, - 0xd6, 0x0f, 0xe6, 0x55, 0x67, 0xdc, 0x5b, 0x7e, 0x4a, 0xdf, 0x48, 0xdf, 0x32, 0xde, 0x48, 0xe7, - 0x63, 0xed, 0x6e, 0xfc, 0xe0, 0xbf, 0x7c, 0x8c, 0x9d, 0xc0, 0xff, 0x38, 0x0a, 0x53, 0x3a, 0xba, - 0xe8, 0x87, 0x4a, 0xa3, 0x11, 0xe8, 0xfd, 0xe0, 0x36, 0x1a, 0x81, 0x8d, 0x50, 0xc3, 0x2c, 0xa0, - 0x30, 0xd0, 0x2c, 0xe0, 0x6b, 0x30, 0xb1, 0xda, 0x6a, 0x18, 0x8f, 0x95, 0x56, 0xc6, 0xe7, 0x5d, - 0x8c, 0x91, 0xe4, 0x5a, 0x88, 0x95, 0x96, 0xf5, 0x56, 0xa3, 0xf7, 0x89, 0x32, 0x61, 0x69, 0x58, - 0x14, 0x8c, 0x7e, 0x12, 0x8b, 0x82, 0xab, 0x30, 0x71, 0x37, 0xe4, 0xdb, 0xdd, 0x76, 0x9b, 0x37, - 0x71, 0x5a, 0x15, 0xa5, 0xac, 0xdf, 0x0d, 0xb9, 0x13, 0x21, 0x54, 0xff, 0x80, 0x18, 0x55, 0x1f, - 0xe0, 0xf1, 0x01, 0x03, 0x7c, 0x05, 0x8a, 0x5b, 0x9c, 0x07, 0xd8, 0xa7, 0x93, 0x89, 0x48, 0xd7, - 0xe1, 0x3c, 0x70, 0x44, 0xc7, 0x1a, 0x96, 0x06, 0x84, 0x68, 0x98, 0x27, 0x4c, 0x0d, 0x69, 0x9e, - 0xc0, 0x5e, 0x84, 0xa9, 0x4e, 0x77, 0xa7, 0xe9, 0xd5, 0x91, 0x2f, 0xd9, 0x35, 0xd8, 0x93, 0x12, - 0x26, 0xd8, 0x86, 0xec, 0x4b, 0x30, 0x8d, 0x77, 0x9c, 0x78, 0xca, 0xcd, 0x18, 0xaf, 0x7a, 0x46, - 0x99, 0x94, 0x74, 0xea, 0x02, 0xe4, 0x64, 0x98, 0xdf, 0x98, 0x8c, 0x96, 0x6a, 0x30, 0x63, 0x8e, - 0xe4, 0x13, 0x78, 0xdc, 0x8b, 0x4d, 0x2d, 0x8a, 0xa5, 0x89, 0x9b, 0x23, 0x45, 0x28, 0x4d, 0x4a, - 0x23, 0x0b, 0x1b, 0xb6, 0xe2, 0x36, 0xd9, 0xec, 0x56, 0x77, 0x87, 0x07, 0x6d, 0x1e, 0xf1, 0x90, - 0x2e, 0x01, 0xa1, 0x3d, 0x52, 0xe9, 0x74, 0x42, 0xeb, 0x1f, 0xe5, 0x61, 0xbc, 0x72, 0xbf, 0x56, - 0x6d, 0xef, 0xfa, 0xf8, 0x44, 0x17, 0xbf, 0xcc, 0xe8, 0x4f, 0x74, 0xf1, 0xcb, 0x8c, 0xfe, 0x1e, - 0x73, 0x29, 0xe3, 0x1a, 0x87, 0x56, 0xbc, 0xda, 0x35, 0xce, 0xb8, 0x80, 0x26, 0x8f, 0x54, 0x85, - 0x21, 0x1e, 0xa9, 0x62, 0x3d, 0xe2, 0xc8, 0xf1, 0x7a, 0xc4, 0x77, 0x60, 0xb2, 0xda, 0x8e, 0xf8, - 0x5e, 0x90, 0xcc, 0xf4, 0xf8, 0x4a, 0x19, 0x83, 0x75, 0xd1, 0x5e, 0xc3, 0x16, 0xd3, 0x48, 0xea, - 0x2e, 0x63, 0x9d, 0x25, 0x4e, 0x23, 0xa9, 0xe2, 0x4c, 0xe9, 0x03, 0x14, 0xa2, 0xb5, 0x96, 0x9a, - 0x23, 0xca, 0x10, 0x40, 0x0a, 0x9f, 0x33, 0x89, 0xf2, 0x5e, 0x74, 0xec, 0xca, 0x5c, 0xb6, 0x21, - 0x80, 0xf5, 0xc3, 0x79, 0x98, 0xac, 0x74, 0x3a, 0x4f, 0xb9, 0x39, 0xd6, 0xe7, 0x8c, 0xed, 0x55, - 0xdd, 0x85, 0xe2, 0x76, 0x0d, 0x65, 0x89, 0xf5, 0x0b, 0x79, 0x98, 0x4d, 0x51, 0xe8, 0x5f, 0x9f, - 0x1b, 0xd2, 0x08, 0x2b, 0x3f, 0xa4, 0x11, 0x56, 0x61, 0x38, 0x23, 0xac, 0x91, 0x4f, 0xb2, 0x65, - 0xbe, 0x0a, 0x85, 0x4a, 0xa7, 0x93, 0x7e, 0xcc, 0xed, 0x74, 0xee, 0x5d, 0x91, 0xf7, 0x59, 0xb7, - 0xd3, 0xb1, 0x05, 0x86, 0xb1, 0x8f, 0x8d, 0x0d, 0xb9, 0x8f, 0x59, 0x6f, 0xc2, 0x04, 0xf2, 0x42, - 0xd3, 0xa7, 0x73, 0x80, 0x8b, 0x99, 0xac, 0x9e, 0x8c, 0xba, 0x68, 0x99, 0xff, 0x8b, 0x1c, 0x8c, - 0xe2, 0xef, 0xa7, 0x74, 0x8e, 0x2d, 0x1b, 0x73, 0xac, 0xa4, 0xcd, 0xb1, 0x61, 0x66, 0xd7, 0x3f, - 0x28, 0x00, 0xac, 0x6e, 0xda, 0x35, 0xa9, 0xf6, 0x60, 0xd7, 0x60, 0xd6, 0x6d, 0x36, 0xfd, 0x03, - 0xde, 0x70, 0xfc, 0xc0, 0xdb, 0xf3, 0xda, 0xb2, 0xe7, 0xd4, 0x0b, 0xa3, 0x59, 0xa4, 0xbf, 0x3b, - 0x50, 0xd1, 0xa6, 0x2c, 0xd1, 0xf9, 0xb4, 0x78, 0xb4, 0xef, 0x37, 0xd4, 0x05, 0xce, 0xe0, 0x43, - 0x45, 0x19, 0x7c, 0x6e, 0xcb, 0x12, 0x9d, 0xcf, 0x3e, 0x5e, 0x48, 0x95, 0xfc, 0x68, 0xf0, 0xa1, - 0xa2, 0x0c, 0x3e, 0xf2, 0x16, 0x1b, 0xb2, 0x0d, 0x98, 0x43, 0x88, 0x53, 0x0f, 0x78, 0x83, 0xb7, - 0x23, 0xcf, 0x6d, 0x86, 0x74, 0xe5, 0x47, 0xe5, 0x50, 0x4f, 0xa1, 0x7e, 0xe5, 0xc1, 0xc2, 0xd5, - 0xa4, 0x8c, 0x5d, 0x84, 0xf1, 0x96, 0xfb, 0xc8, 0x71, 0xf7, 0xe4, 0x5b, 0xfb, 0xb4, 0xbc, 0x22, - 0x12, 0x48, 0xdf, 0xb0, 0x5b, 0xee, 0xa3, 0xca, 0x1e, 0x17, 0xad, 0xe0, 0x8f, 0x3a, 0x7e, 0xa8, - 0xb5, 0x62, 0x2c, 0x69, 0x45, 0xaa, 0x48, 0x6f, 0x05, 0x15, 0x51, 0x2b, 0xac, 0xff, 0x67, 0x14, - 0xa7, 0x36, 0x6d, 0x02, 0x64, 0x1e, 0x96, 0xcb, 0x30, 0x0f, 0x7b, 0x1b, 0xb4, 0x23, 0x4e, 0x57, - 0xed, 0x69, 0x07, 0xbc, 0x7e, 0x2d, 0x4c, 0x90, 0xd9, 0x83, 0xb4, 0xa1, 0x58, 0x01, 0x57, 0xce, - 0x4b, 0xe9, 0x79, 0xf5, 0x44, 0x6c, 0xc4, 0x6e, 0x00, 0xab, 0xb6, 0xf1, 0x35, 0x8b, 0xd7, 0x1e, - 0x78, 0x9d, 0x7b, 0x3c, 0xf0, 0x76, 0x0f, 0x69, 0x5c, 0x50, 0x88, 0xf2, 0xa8, 0xd4, 0x09, 0x1f, - 0x78, 0x1d, 0x71, 0x6f, 0xf4, 0x76, 0x0f, 0xed, 0x0c, 0x1a, 0xf6, 0x01, 0x8c, 0xdb, 0xfc, 0x20, - 0xf0, 0x22, 0x65, 0xfe, 0x30, 0x13, 0x6b, 0x39, 0x10, 0x2a, 0x87, 0x28, 0x90, 0x3f, 0xf4, 0xc5, - 0x4a, 0xe5, 0x6c, 0x59, 0x9e, 0x52, 0xd2, 0xcc, 0x61, 0x3a, 0x69, 0x6d, 0xe5, 0x7e, 0xad, 0xdf, - 0x21, 0xc5, 0x5e, 0x83, 0x51, 0x3c, 0xea, 0x48, 0x80, 0x43, 0xb7, 0x01, 0x14, 0x78, 0xf4, 0x73, - 0x18, 0x31, 0xd8, 0x0b, 0x00, 0xf1, 0x73, 0x51, 0xb8, 0x58, 0x44, 0xd1, 0x4a, 0x83, 0xa4, 0xcf, - 0xe9, 0x89, 0x13, 0x9d, 0xd3, 0x1b, 0x50, 0xb2, 0xf9, 0x37, 0xba, 0x5e, 0xc0, 0x1b, 0x95, 0x0e, - 0xbe, 0x49, 0x84, 0x8b, 0x80, 0x13, 0xec, 0xdc, 0xe3, 0xa3, 0xf2, 0x73, 0x01, 0x95, 0x39, 0x6e, - 0x47, 0x3e, 0x65, 0x18, 0xb3, 0x3b, 0x4d, 0xc9, 0xde, 0x86, 0x11, 0xb1, 0x23, 0x90, 0x49, 0x99, - 0xd2, 0xed, 0x26, 0x9b, 0x84, 0xbc, 0x69, 0xd7, 0x7d, 0x63, 0xaa, 0x22, 0xc9, 0x77, 0xcf, 0x4c, - 0xeb, 0x17, 0xf2, 0xf0, 0x52, 0x7c, 0x08, 0x6e, 0x06, 0xb5, 0xca, 0xed, 0x8d, 0x6a, 0x63, 0x8b, - 0xee, 0x8c, 0x5b, 0x81, 0xff, 0xd0, 0x6b, 0xf0, 0xe0, 0xde, 0xe5, 0x63, 0xb6, 0xf0, 0x0d, 0xb9, - 0x7c, 0xa4, 0xc2, 0x39, 0x6f, 0x18, 0xb4, 0x68, 0xb2, 0x06, 0xd9, 0xdc, 0x74, 0x3a, 0x3d, 0xfa, - 0xe7, 0x1b, 0xcf, 0xd8, 0x09, 0x03, 0xf6, 0x57, 0x73, 0x70, 0x3a, 0xfb, 0x43, 0x48, 0x8f, 0x50, - 0x56, 0xf7, 0x95, 0x3e, 0x5f, 0xbb, 0xf2, 0xea, 0xe3, 0xa3, 0xf2, 0x4b, 0xa1, 0xdb, 0x6a, 0x3a, - 0x5e, 0x43, 0xd6, 0xe6, 0xd5, 0xb9, 0xd3, 0x21, 0x04, 0xa3, 0xde, 0x3e, 0x35, 0x7d, 0x1e, 0xd4, - 0x4e, 0xbe, 0x98, 0x5b, 0x01, 0x28, 0x2a, 0x9d, 0x9e, 0xf5, 0xcb, 0x39, 0xd0, 0xa6, 0x76, 0xd1, - 0xe6, 0x0d, 0x2f, 0xe0, 0xf5, 0x88, 0x76, 0x73, 0x72, 0xc7, 0x91, 0xb0, 0x94, 0xfd, 0x12, 0xc2, - 0xd8, 0xfb, 0x30, 0x4e, 0xbb, 0x0e, 0x6e, 0xdc, 0xc9, 0x92, 0x20, 0x6d, 0xa1, 0xf4, 0xdb, 0xea, - 0xd9, 0xb1, 0x14, 0x91, 0xb8, 0x15, 0xdd, 0xbc, 0xbf, 0xbd, 0xda, 0x74, 0xbd, 0x56, 0x48, 0xa7, - 0x1f, 0x76, 0xeb, 0x47, 0x07, 0x91, 0x53, 0x47, 0xa8, 0x7e, 0x2b, 0x8a, 0x51, 0xad, 0xeb, 0x4a, - 0x59, 0x79, 0x8c, 0x11, 0x5e, 0x19, 0x46, 0xef, 0x25, 0x4a, 0x8b, 0x95, 0x89, 0xc7, 0x47, 0x65, - 0x39, 0x5d, 0x6c, 0x09, 0xb7, 0xfe, 0x66, 0x0e, 0x66, 0xcc, 0xf9, 0xc4, 0x2e, 0xc2, 0x18, 0xb9, - 0xc2, 0xe4, 0x50, 0x39, 0x23, 0x7a, 0x61, 0x4c, 0x3a, 0xc1, 0x18, 0xae, 0x2f, 0x84, 0x25, 0xce, - 0x6f, 0xe2, 0x40, 0x87, 0x17, 0x9e, 0xdf, 0x75, 0x09, 0xb2, 0x55, 0x19, 0xb3, 0x84, 0xf0, 0x1e, - 0x76, 0x9b, 0x91, 0xae, 0xb3, 0x0f, 0x10, 0x62, 0x53, 0x89, 0xb5, 0x0a, 0x63, 0x72, 0x2f, 0x49, - 0x19, 0xff, 0xe4, 0x4e, 0x60, 0xfc, 0x63, 0x1d, 0xe5, 0x00, 0x6a, 0xb5, 0x1b, 0xb7, 0xf8, 0xe1, - 0x96, 0xeb, 0x05, 0xf8, 0xc8, 0x84, 0xfb, 0xf6, 0x2d, 0x5a, 0x5c, 0x53, 0xf4, 0xc8, 0x24, 0xf7, - 0xf8, 0x07, 0xfc, 0xd0, 0x78, 0x64, 0x52, 0xa8, 0x78, 0x38, 0x04, 0xde, 0x43, 0x37, 0xe2, 0x82, - 0x30, 0x8f, 0x84, 0xf2, 0x70, 0x90, 0xd0, 0x14, 0xa5, 0x86, 0xcc, 0xbe, 0x0a, 0x33, 0xc9, 0xaf, - 0xf8, 0xa9, 0x6c, 0x26, 0x5e, 0xc0, 0x66, 0xe1, 0xca, 0x0b, 0x8f, 0x8f, 0xca, 0x4b, 0x1a, 0xd7, - 0xf4, 0x23, 0x5a, 0x8a, 0x99, 0xf5, 0x73, 0x39, 0x7c, 0x20, 0x56, 0x0d, 0x3c, 0x0f, 0x23, 0xb1, - 0x49, 0xe3, 0x14, 0xed, 0x3a, 0xe6, 0x73, 0x00, 0x96, 0xb3, 0x97, 0xa0, 0x90, 0xb4, 0x04, 0xf7, - 0x6a, 0xb3, 0x05, 0xa2, 0x94, 0x5d, 0x87, 0xf1, 0xa1, 0xbe, 0x19, 0x97, 0x46, 0xc6, 0xb7, 0x2a, - 0x6a, 0x1c, 0x85, 0x9b, 0xf7, 0xb7, 0xbf, 0x77, 0x47, 0xe1, 0xc7, 0xf2, 0x30, 0x2b, 0xfa, 0xb5, - 0xd2, 0x8d, 0xf6, 0xfd, 0xc0, 0x8b, 0x0e, 0x9f, 0x5a, 0xed, 0xd6, 0xbb, 0x86, 0x68, 0xbc, 0xa4, - 0x4e, 0x19, 0xbd, 0x6d, 0x43, 0x29, 0xb9, 0xfe, 0xeb, 0x51, 0x98, 0xcf, 0xa0, 0x62, 0x6f, 0x18, - 0x0a, 0xe8, 0x45, 0xe5, 0xea, 0xfa, 0x9d, 0xa3, 0xf2, 0x94, 0x42, 0xdf, 0x4e, 0x5c, 0x5f, 0x97, - 0x4d, 0x6b, 0x0b, 0xd9, 0x53, 0xa8, 0x8f, 0xd6, 0xad, 0x2d, 0x4c, 0x1b, 0x8b, 0xd7, 0x60, 0xd4, - 0xf6, 0x9b, 0x5c, 0x59, 0x18, 0xa1, 0x84, 0x11, 0x08, 0x80, 0xf1, 0xa2, 0x2a, 0x00, 0xec, 0x06, - 0x8c, 0x8b, 0x3f, 0x6e, 0xbb, 0x1d, 0x7a, 0x2b, 0x60, 0xf1, 0xe5, 0x0c, 0xa1, 0x1d, 0xaf, 0xbd, - 0xa7, 0xdf, 0xcf, 0x9a, 0xdc, 0x69, 0xb9, 0x1d, 0x43, 0x14, 0x92, 0x88, 0xc6, 0x3d, 0xaf, 0xd8, - 0xff, 0x9e, 0x97, 0x3b, 0xf6, 0x9e, 0xb7, 0x0b, 0x50, 0xf3, 0xf6, 0xda, 0x5e, 0x7b, 0xaf, 0xd2, - 0xdc, 0x23, 0x87, 0xe1, 0xd7, 0xfa, 0x8f, 0xc2, 0xc5, 0x04, 0x19, 0x27, 0xee, 0xb3, 0xf8, 0xa0, - 0x27, 0x61, 0x8e, 0xdb, 0xdc, 0x33, 0x1c, 0x1b, 0x34, 0xce, 0xec, 0x0e, 0x40, 0xa5, 0x1e, 0x79, - 0x0f, 0xc5, 0x14, 0x0e, 0x49, 0x6e, 0x51, 0x9f, 0xbc, 0x5a, 0xb9, 0xc5, 0x0f, 0x6b, 0x3c, 0x4a, - 0x9e, 0x46, 0x5c, 0x44, 0x15, 0x2b, 0xc1, 0xb0, 0x5a, 0x4f, 0x38, 0xb0, 0x0e, 0x9c, 0xaa, 0x34, - 0x1a, 0x9e, 0x68, 0x83, 0xdb, 0xc4, 0xb7, 0x3e, 0xde, 0x40, 0xd6, 0x53, 0xd9, 0xac, 0x5f, 0x23, - 0xd6, 0x2f, 0xba, 0x31, 0x95, 0x13, 0x49, 0xb2, 0x74, 0x35, 0xd9, 0x8c, 0xad, 0x1a, 0xcc, 0x98, - 0x8d, 0x37, 0x1d, 0x9d, 0xa7, 0xa0, 0x68, 0xd7, 0x2a, 0x4e, 0xed, 0x46, 0xe5, 0x72, 0x29, 0xc7, - 0x4a, 0x30, 0x45, 0xbf, 0x96, 0x9d, 0xe5, 0xb7, 0xae, 0x96, 0xf2, 0x06, 0xe4, 0xad, 0xcb, 0xcb, - 0xa5, 0xc2, 0x52, 0x7e, 0x31, 0x97, 0xf2, 0x31, 0x1a, 0x2f, 0x15, 0xa5, 0x12, 0xcc, 0xfa, 0xc5, - 0x1c, 0x14, 0xd5, 0xb7, 0xb3, 0xab, 0x50, 0xa8, 0xd5, 0x6e, 0xa4, 0xbc, 0x82, 0x92, 0x53, 0x46, - 0xee, 0xa7, 0x61, 0xa8, 0x9b, 0x7e, 0x0a, 0x02, 0x41, 0xb7, 0xbd, 0x51, 0x23, 0xe1, 0x40, 0xd1, - 0x25, 0x9b, 0xb7, 0xa4, 0xcb, 0x70, 0x95, 0xb8, 0x0a, 0x85, 0x9b, 0xf7, 0xb7, 0xe9, 0x56, 0xa1, - 0xe8, 0x92, 0xfd, 0x54, 0xd2, 0x7d, 0x74, 0xa0, 0xef, 0xf2, 0x82, 0xc0, 0xb2, 0x61, 0x52, 0x9b, - 0xc8, 0xf2, 0xd0, 0x6d, 0xf9, 0xb1, 0x77, 0x2f, 0x1d, 0xba, 0x02, 0x62, 0x53, 0x89, 0x90, 0x11, - 0x36, 0xfc, 0xba, 0xdb, 0xa4, 0xd3, 0x1b, 0x65, 0x84, 0xa6, 0x00, 0xd8, 0x12, 0x6e, 0xfd, 0x7a, - 0x0e, 0x4a, 0x28, 0x49, 0xa1, 0xe9, 0xa6, 0xff, 0x80, 0xb7, 0xef, 0x5d, 0x66, 0x6f, 0xaa, 0x25, - 0x97, 0x8b, 0x15, 0x0e, 0xa3, 0xb8, 0xe4, 0x52, 0x2f, 0x16, 0xb4, 0xec, 0x34, 0x07, 0xea, 0xfc, - 0xf0, 0x8e, 0x97, 0xc7, 0x38, 0x50, 0x97, 0x61, 0x14, 0x3f, 0x87, 0x36, 0x47, 0xfc, 0xf2, 0x48, - 0x00, 0x6c, 0x09, 0xd7, 0xf6, 0xa6, 0x1f, 0xcf, 0xf7, 0xb4, 0x61, 0xf9, 0x7b, 0xca, 0x79, 0xd1, - 0x6c, 0xdc, 0x50, 0xfb, 0xf5, 0x87, 0xb0, 0x90, 0xee, 0x12, 0x54, 0x06, 0x55, 0x60, 0xd6, 0x84, - 0x2b, 0xbd, 0xd0, 0x99, 0xcc, 0xba, 0xee, 0x2d, 0xdb, 0x69, 0x7c, 0xeb, 0x7f, 0xcd, 0xc1, 0x04, - 0xfe, 0x69, 0x77, 0x9b, 0x68, 0x42, 0x53, 0xb9, 0x5f, 0x23, 0xc5, 0xaf, 0x2e, 0xcc, 0xb9, 0x07, - 0xa1, 0x43, 0xba, 0x61, 0x63, 0x8f, 0x89, 0x91, 0x89, 0x54, 0x6a, 0x74, 0x95, 0x72, 0x24, 0x26, - 0x95, 0xaa, 0xdf, 0x30, 0x45, 0x4a, 0xc8, 0x68, 0x78, 0x77, 0xbf, 0x26, 0xa6, 0x9f, 0xfe, 0xa6, - 0x8d, 0x74, 0x7e, 0xd3, 0x34, 0xbc, 0x93, 0x68, 0xf8, 0xa4, 0x7d, 0xbf, 0x56, 0xb1, 0xef, 0x18, - 0x4f, 0xda, 0xe2, 0x1b, 0x0d, 0x3b, 0x71, 0x42, 0xb2, 0xfe, 0x09, 0xa4, 0x3b, 0x90, 0x0e, 0xbc, - 0x13, 0xae, 0x8d, 0x77, 0x60, 0xb4, 0xd2, 0x6c, 0xfa, 0x07, 0xb4, 0x4b, 0x28, 0xdd, 0x54, 0xdc, - 0x7f, 0xf2, 0x3c, 0x43, 0xf5, 0x8a, 0xe1, 0x90, 0x25, 0x00, 0x6c, 0x15, 0x26, 0x2a, 0xf7, 0x6b, - 0xd5, 0xea, 0xda, 0xf6, 0xb6, 0x74, 0x3e, 0x29, 0xac, 0xbc, 0xa2, 0xfa, 0xc7, 0xf3, 0x1a, 0x4e, - 0xfa, 0x55, 0x35, 0x91, 0xdf, 0x13, 0x3a, 0xf6, 0x1e, 0xc0, 0x4d, 0xdf, 0x6b, 0x4b, 0x75, 0x12, - 0x35, 0xfe, 0xf9, 0xc7, 0x47, 0xe5, 0xc9, 0x8f, 0x7c, 0xaf, 0x4d, 0xfa, 0x27, 0xf1, 0xed, 0x09, - 0x92, 0xad, 0xfd, 0x2d, 0x7a, 0x7a, 0xc5, 0x97, 0x66, 0x31, 0xa3, 0x49, 0x4f, 0xef, 0xf8, 0x3d, - 0x16, 0x31, 0x0a, 0x8d, 0xb5, 0x60, 0xb6, 0xd6, 0xdd, 0xdb, 0xe3, 0x62, 0x67, 0x27, 0x05, 0xca, - 0x18, 0xdd, 0x71, 0xe3, 0x90, 0x1f, 0xf2, 0x3e, 0x22, 0x6e, 0x29, 0xe1, 0xca, 0x1b, 0x62, 0x22, - 0x7f, 0xfb, 0xa8, 0x4c, 0xaf, 0xb5, 0x42, 0x54, 0x0b, 0x15, 0x7d, 0xaf, 0xfa, 0x24, 0xcd, 0x9b, - 0x6d, 0xc2, 0xd8, 0x75, 0x2f, 0xba, 0xd1, 0xdd, 0x21, 0x67, 0x8a, 0x17, 0x07, 0x2c, 0x1a, 0x89, - 0x28, 0x9f, 0x0b, 0xf6, 0xbc, 0x68, 0xbf, 0xab, 0x9b, 0xb3, 0x13, 0x1b, 0x76, 0x1f, 0x8a, 0xab, - 0x5e, 0x50, 0x6f, 0xf2, 0xd5, 0x2a, 0x9d, 0xfd, 0x2f, 0x0d, 0x60, 0xa9, 0x50, 0x65, 0xbf, 0xd4, - 0xf1, 0x57, 0xdd, 0xd3, 0x65, 0x01, 0x85, 0xc1, 0xfe, 0xed, 0x1c, 0x3c, 0x1b, 0x7f, 0x7d, 0x65, - 0x8f, 0xb7, 0xa3, 0xdb, 0x6e, 0x54, 0xdf, 0xe7, 0x01, 0xf5, 0xd2, 0xc4, 0xa0, 0x5e, 0xfa, 0x7c, - 0x4f, 0x2f, 0x5d, 0x48, 0x7a, 0xc9, 0x15, 0xcc, 0x9c, 0x96, 0xe4, 0xd6, 0xdb, 0x67, 0x83, 0x6a, - 0x65, 0x0e, 0x40, 0xf2, 0xfe, 0x43, 0xce, 0x78, 0xaf, 0x0c, 0x68, 0x70, 0x82, 0x4c, 0x46, 0xf4, - 0xf1, 0x6f, 0xc3, 0x0a, 0x2c, 0x86, 0xb2, 0x5b, 0xca, 0x73, 0x49, 0x4a, 0x25, 0xe7, 0x06, 0xf0, - 0x96, 0xde, 0x4c, 0xf3, 0x03, 0x7c, 0x14, 0xe5, 0x68, 0x6f, 0xb8, 0x3b, 0x24, 0x88, 0x1c, 0x33, - 0xda, 0x1b, 0x6e, 0x32, 0xda, 0x4d, 0x37, 0x3d, 0xda, 0x1b, 0xee, 0x0e, 0x5b, 0x95, 0xee, 0x96, - 0xd2, 0x37, 0xef, 0x85, 0x41, 0xdc, 0x56, 0xb7, 0xe4, 0xc9, 0x9c, 0xe1, 0x76, 0xf9, 0x65, 0x98, - 0xa8, 0x75, 0xdc, 0x3a, 0x6f, 0x7a, 0xbb, 0x11, 0x3d, 0x08, 0xbe, 0x3c, 0x80, 0x55, 0x8c, 0x4b, - 0x8f, 0x49, 0xea, 0xa7, 0x7e, 0x4d, 0x8a, 0x71, 0xc4, 0x17, 0x6e, 0x6f, 0xdd, 0x5e, 0x9c, 0x3d, - 0xf6, 0x0b, 0xb7, 0xb7, 0x6e, 0x93, 0xcc, 0xd1, 0x69, 0x19, 0x32, 0xc7, 0xd6, 0x6d, 0xd6, 0x81, - 0x99, 0x6d, 0x1e, 0x04, 0xee, 0xae, 0x1f, 0xb4, 0xa4, 0xc2, 0x4e, 0xfa, 0x7b, 0xbc, 0x36, 0x88, - 0x9f, 0x41, 0x20, 0x35, 0xb5, 0x91, 0x82, 0x39, 0x69, 0x2d, 0x5f, 0x8a, 0xbf, 0xf5, 0x2b, 0x05, - 0x38, 0xd3, 0xe7, 0x2b, 0xd9, 0x1d, 0xb5, 0x2b, 0xe6, 0x0c, 0xcd, 0x6a, 0x1f, 0xf4, 0x8b, 0xc7, - 0x6e, 0x94, 0x1b, 0x50, 0x5a, 0xbf, 0x85, 0xe2, 0xb4, 0xd4, 0x79, 0xaf, 0x56, 0xd4, 0x79, 0x82, - 0xda, 0x3f, 0xfe, 0x00, 0x4d, 0xd8, 0x94, 0xae, 0xbc, 0x6e, 0xf8, 0x6a, 0xf6, 0x50, 0x2e, 0xfd, - 0x60, 0x1e, 0x46, 0xf0, 0x6c, 0x4b, 0x45, 0xa8, 0xc9, 0x9d, 0x28, 0x42, 0xcd, 0x17, 0x60, 0x6a, - 0xfd, 0x96, 0xbc, 0xec, 0xde, 0x70, 0xc3, 0x7d, 0xda, 0x79, 0xf1, 0x45, 0x98, 0x3f, 0x70, 0xe8, - 0x6e, 0xbc, 0xef, 0x1a, 0x62, 0xa5, 0x41, 0xc1, 0xee, 0xc2, 0xbc, 0xfc, 0x36, 0x6f, 0xd7, 0xab, - 0xcb, 0x40, 0x17, 0x9e, 0xdb, 0xa4, 0x6d, 0xf8, 0xa5, 0xc7, 0x47, 0xe5, 0x32, 0x7f, 0x80, 0xc6, - 0x79, 0x54, 0xee, 0x84, 0x88, 0xa0, 0x5b, 0xe9, 0x65, 0xd0, 0xeb, 0xde, 0xf7, 0xf6, 0x04, 0x56, - 0x28, 0x6a, 0x13, 0x75, 0x0b, 0x5c, 0x89, 0x64, 0xfd, 0xf2, 0x28, 0x2c, 0xf5, 0xdf, 0x41, 0xd9, - 0x17, 0xcd, 0x01, 0x3c, 0x7f, 0xec, 0x9e, 0x7b, 0xfc, 0x18, 0x7e, 0x09, 0x16, 0xd6, 0xdb, 0x11, - 0x0f, 0x3a, 0x81, 0xa7, 0xe2, 0x2d, 0xdc, 0xf0, 0x43, 0x65, 0x0c, 0x89, 0x56, 0x89, 0x3c, 0x2e, - 0x27, 0xbd, 0x24, 0x9a, 0x66, 0x6a, 0xac, 0x32, 0x39, 0xb0, 0x75, 0x98, 0xd1, 0xe0, 0xcd, 0xee, - 0x1e, 0xc9, 0x0c, 0xf2, 0xe9, 0x41, 0xe3, 0xd9, 0xec, 0xea, 0x96, 0x62, 0x29, 0xa2, 0xa5, 0x9f, - 0x2b, 0xd0, 0xb4, 0x78, 0x09, 0x0a, 0xb5, 0xee, 0x0e, 0x4d, 0x07, 0x79, 0x39, 0x30, 0x0e, 0x12, - 0x51, 0xca, 0x3e, 0x07, 0x60, 0xf3, 0x8e, 0x1f, 0x7a, 0x91, 0x1f, 0x1c, 0xea, 0x6e, 0x3b, 0x41, - 0x0c, 0x35, 0x2d, 0x8b, 0x15, 0x94, 0xdd, 0x80, 0xd9, 0xe4, 0xd7, 0xe6, 0x41, 0x9b, 0x94, 0xa9, - 0x13, 0x52, 0x8b, 0x91, 0x90, 0x3b, 0xbe, 0x28, 0xd3, 0x8f, 0xc6, 0x14, 0x19, 0x5b, 0x86, 0xe2, - 0x7d, 0x3f, 0x78, 0xb0, 0x2b, 0x06, 0x6a, 0x24, 0x39, 0xbc, 0x0f, 0x08, 0xa6, 0x1f, 0x52, 0x0a, - 0x4f, 0xcc, 0xf9, 0xf5, 0xf6, 0x43, 0x2f, 0xf0, 0xdb, 0x2d, 0xde, 0x8e, 0xf4, 0xd7, 0x72, 0x9e, - 0x80, 0x0d, 0x87, 0xc9, 0x04, 0x2c, 0xee, 0xea, 0x95, 0x7a, 0xe4, 0x07, 0xf4, 0x54, 0x2e, 0x87, - 0x5b, 0x00, 0x8c, 0xe1, 0x16, 0x00, 0xd1, 0x89, 0x36, 0xdf, 0xa5, 0x67, 0x03, 0xec, 0xc4, 0x80, - 0xef, 0x1a, 0xde, 0xa0, 0x7c, 0x57, 0x08, 0x1f, 0x36, 0xdf, 0x45, 0x05, 0x83, 0x11, 0x44, 0x69, - 0xb7, 0x47, 0x35, 0x45, 0x68, 0xd6, 0x6f, 0x4d, 0xf4, 0x9d, 0xb7, 0x62, 0xb7, 0x3f, 0xd9, 0xbc, - 0xdd, 0x70, 0x87, 0x98, 0xb7, 0x6f, 0xc4, 0xf6, 0xca, 0xba, 0x0b, 0x34, 0x42, 0xf4, 0xe3, 0x46, - 0xe2, 0x2c, 0xfd, 0x7c, 0xf1, 0x24, 0x93, 0x88, 0x3a, 0x29, 0x3f, 0x6c, 0x27, 0x15, 0x86, 0xea, - 0x24, 0xb6, 0x02, 0xd3, 0x71, 0x18, 0xae, 0x2d, 0x37, 0x32, 0xf6, 0xa6, 0x38, 0x76, 0x9a, 0xd3, - 0x71, 0x23, 0x7d, 0x6f, 0x32, 0x49, 0xd8, 0xbb, 0x30, 0x49, 0x46, 0xfb, 0xc8, 0x61, 0x34, 0x31, - 0x9b, 0x54, 0x16, 0xfe, 0x29, 0x7a, 0x1d, 0x5d, 0x2c, 0xc9, 0x2d, 0xaf, 0xc3, 0x9b, 0x5e, 0x9b, - 0xd7, 0x50, 0x5b, 0x4f, 0x33, 0x06, 0x97, 0x64, 0x87, 0x4a, 0x1c, 0xa9, 0xc8, 0x37, 0xf4, 0x74, - 0x06, 0x51, 0x7a, 0xb2, 0x8e, 0x9f, 0x68, 0xb2, 0x4a, 0xab, 0xa5, 0x60, 0xc3, 0xdf, 0xf3, 0x94, - 0x9d, 0xa6, 0xb2, 0x5a, 0x0a, 0x9c, 0xa6, 0x80, 0xa6, 0xac, 0x96, 0x24, 0xaa, 0xb8, 0x49, 0x88, - 0x1f, 0xd5, 0x35, 0x7a, 0xa2, 0xc2, 0x9b, 0x04, 0x12, 0x99, 0xc6, 0xb1, 0x12, 0x49, 0x55, 0xb3, - 0xde, 0x72, 0xbd, 0x26, 0x79, 0xba, 0x26, 0xd5, 0x70, 0x01, 0x4d, 0x57, 0x83, 0xa8, 0xac, 0x0e, - 0x53, 0x36, 0xdf, 0xdd, 0x0a, 0xfc, 0x88, 0xd7, 0x23, 0xde, 0x20, 0xe9, 0x49, 0x5d, 0x20, 0x56, - 0x7c, 0x5f, 0x4a, 0x86, 0x2b, 0x6f, 0xfe, 0xd6, 0x51, 0x39, 0xf7, 0xed, 0xa3, 0x32, 0x08, 0x90, - 0xb4, 0xbc, 0x7e, 0x7c, 0x54, 0x3e, 0x23, 0xc6, 0xbf, 0xa3, 0x88, 0xf5, 0x23, 0x46, 0x67, 0xca, - 0xbe, 0x5f, 0x6c, 0xba, 0x71, 0x97, 0x24, 0x95, 0x4d, 0xf5, 0xa9, 0xec, 0xad, 0xcc, 0xca, 0xca, - 0x5a, 0x6f, 0x67, 0x56, 0x9a, 0x59, 0x09, 0x7b, 0x0f, 0x26, 0x57, 0xab, 0xab, 0x7e, 0x7b, 0xd7, - 0xdb, 0xab, 0xdd, 0xa8, 0xa0, 0x08, 0x46, 0x56, 0xf7, 0x75, 0xcf, 0xa9, 0x23, 0xdc, 0x09, 0xf7, - 0x5d, 0xc3, 0xf9, 0x2a, 0xc1, 0x67, 0xd7, 0x61, 0x46, 0xfd, 0xb4, 0xf9, 0xee, 0x5d, 0xbb, 0x8a, - 0x92, 0x97, 0x72, 0x75, 0x88, 0x39, 0x88, 0x8e, 0xe8, 0x06, 0xba, 0x44, 0x9e, 0x22, 0x13, 0x93, - 0x71, 0x8d, 0x77, 0x9a, 0xfe, 0xa1, 0xf8, 0xbc, 0x6d, 0x8f, 0x07, 0x28, 0x6b, 0xd1, 0x64, 0x6c, - 0xc4, 0x25, 0x4e, 0xe4, 0x19, 0xdb, 0x6d, 0x8a, 0x88, 0xdd, 0x81, 0x39, 0x9a, 0xe2, 0xf7, 0xbc, - 0xd0, 0xdb, 0xf1, 0x9a, 0x5e, 0x74, 0x88, 0x52, 0x16, 0x49, 0x21, 0x6a, 0x5d, 0x3c, 0x8c, 0x4b, - 0x35, 0x66, 0xbd, 0xa4, 0xd6, 0x2f, 0xe6, 0xe1, 0xb9, 0x41, 0x37, 0x0e, 0x56, 0x33, 0x37, 0xb3, - 0x0b, 0x43, 0xdc, 0x52, 0x8e, 0xdf, 0xce, 0xd6, 0x61, 0x66, 0x33, 0xd8, 0x73, 0xdb, 0xde, 0x37, - 0xf1, 0x26, 0x19, 0x1b, 0x6f, 0x61, 0x67, 0xf8, 0x5a, 0x89, 0x39, 0xdb, 0x53, 0x44, 0x4b, 0x0f, - 0x69, 0x9b, 0xfb, 0xb8, 0x6e, 0x40, 0x57, 0x61, 0x62, 0xd5, 0x6f, 0x47, 0xfc, 0x51, 0x94, 0x72, - 0x7a, 0x95, 0xc0, 0xb4, 0x0b, 0x94, 0x42, 0xb5, 0xfe, 0x55, 0x1e, 0x9e, 0x1f, 0x28, 0x72, 0xb3, - 0x6d, 0xb3, 0xd7, 0x5e, 0x1b, 0x46, 0x4e, 0x3f, 0xbe, 0xdb, 0x96, 0x7b, 0xec, 0x8c, 0x8e, 0xb5, - 0xb2, 0x5f, 0xfa, 0x6f, 0x73, 0xd4, 0x49, 0x9f, 0x86, 0x71, 0xac, 0x2a, 0xee, 0x22, 0xa9, 0x8d, - 0xc2, 0x5d, 0xd8, 0x33, 0xb5, 0x51, 0x12, 0x8d, 0x5d, 0x81, 0xe2, 0xaa, 0xdb, 0x6c, 0x6a, 0x2e, - 0xc1, 0x78, 0x93, 0xa8, 0x23, 0x2c, 0x65, 0x96, 0xa6, 0x10, 0xd9, 0xdb, 0x00, 0xf2, 0x6f, 0xed, - 0xac, 0xc0, 0xcd, 0x92, 0xc8, 0x52, 0xc7, 0x85, 0x86, 0x8c, 0x81, 0x04, 0xeb, 0x7e, 0xec, 0x74, - 0x28, 0x03, 0x09, 0x0a, 0x80, 0x11, 0x48, 0x50, 0x00, 0xac, 0x5f, 0x2a, 0xc0, 0x0b, 0x83, 0xef, - 0x8d, 0xec, 0xae, 0x39, 0x04, 0xaf, 0x0f, 0x75, 0xdb, 0x3c, 0x7e, 0x0c, 0x54, 0x58, 0x4e, 0xd9, - 0x21, 0x17, 0x7a, 0x8d, 0xe1, 0xbf, 0x73, 0x54, 0xd6, 0x6c, 0x1d, 0x6f, 0xfa, 0x5e, 0x5b, 0x7b, - 0x9b, 0xf8, 0x06, 0x40, 0x2d, 0x72, 0x23, 0xaf, 0x7e, 0xf3, 0xfe, 0x2d, 0x15, 0xb5, 0xe2, 0xea, - 0x70, 0x5f, 0x96, 0xd0, 0xc9, 0x7d, 0x85, 0xfc, 0x70, 0x10, 0xea, 0x7c, 0x74, 0xf0, 0xc0, 0xb8, - 0x19, 0x27, 0xc8, 0x4b, 0x9f, 0x87, 0x52, 0x9a, 0x94, 0x9d, 0x87, 0x11, 0xfc, 0x00, 0xcd, 0xa2, - 0x3f, 0xc5, 0x01, 0xcb, 0x97, 0x6e, 0xd3, 0xdc, 0x41, 0x2f, 0x69, 0x7c, 0x10, 0x37, 0x75, 0x70, - 0xe4, 0x25, 0x2d, 0xdf, 0xd3, 0x7b, 0xf5, 0x70, 0x29, 0x22, 0xeb, 0x4f, 0x73, 0x70, 0xb6, 0xef, - 0x8d, 0x9c, 0x6d, 0x99, 0x03, 0xf6, 0xca, 0x71, 0x57, 0xf8, 0x63, 0xc7, 0x6a, 0xe9, 0x47, 0xd5, - 0xdc, 0x7f, 0x1f, 0xa6, 0x6a, 0xdd, 0x9d, 0xf4, 0x25, 0x4b, 0xc6, 0x30, 0xd0, 0xe0, 0xfa, 0x09, - 0xa6, 0xe3, 0x8b, 0xf6, 0xab, 0x17, 0x7f, 0xb2, 0x2c, 0xd1, 0xac, 0xac, 0x62, 0x37, 0xbe, 0x5e, - 0x2f, 0x71, 0x93, 0xc8, 0xfa, 0x85, 0x7c, 0xf6, 0x6d, 0x55, 0xdc, 0xee, 0x4f, 0x70, 0x5b, 0xbd, - 0xbe, 0xba, 0x75, 0x7c, 0xdb, 0xff, 0xa9, 0x6a, 0x3b, 0x3e, 0x80, 0xd2, 0x8e, 0xa7, 0x14, 0x8a, - 0xf4, 0x00, 0xaa, 0x76, 0xc7, 0xd0, 0x7c, 0x00, 0x55, 0xc8, 0xec, 0x2d, 0x98, 0xd8, 0xf0, 0xa5, - 0x03, 0xb7, 0x6a, 0xb1, 0xf4, 0x73, 0x53, 0x40, 0x7d, 0x7b, 0x8c, 0x31, 0xc5, 0xdd, 0xc2, 0x1c, - 0x78, 0x65, 0x4c, 0x86, 0x77, 0x8b, 0xd4, 0x74, 0x31, 0xd5, 0x6e, 0x26, 0x99, 0xf5, 0x9f, 0x8e, - 0x82, 0x75, 0xbc, 0xd2, 0x80, 0x7d, 0x68, 0xf6, 0xdd, 0xc5, 0xa1, 0xd5, 0x0d, 0x43, 0x6d, 0xb9, - 0x95, 0x6e, 0xc3, 0xe3, 0xed, 0xba, 0xe9, 0x7d, 0x4d, 0x30, 0x7d, 0x0b, 0x54, 0x78, 0x1f, 0xc7, - 0x19, 0x6a, 0xe9, 0xbf, 0x2a, 0x24, 0x4b, 0x2d, 0x75, 0x34, 0xe6, 0x3e, 0xc6, 0xd1, 0xc8, 0x6e, - 0x41, 0x49, 0x87, 0x68, 0x2f, 0xa1, 0x28, 0xb9, 0x18, 0x8c, 0x52, 0x1f, 0xd5, 0x43, 0x68, 0x9e, - 0xaf, 0x85, 0xe1, 0xcf, 0xd7, 0x44, 0x7c, 0xc7, 0xfa, 0x47, 0x7a, 0xc5, 0xf7, 0xb4, 0xc3, 0xa3, - 0x86, 0xae, 0xbc, 0xb5, 0x43, 0x3a, 0xb4, 0x46, 0x4d, 0x6f, 0xed, 0x8c, 0x83, 0x4b, 0x47, 0x57, - 0x0e, 0xe7, 0xf8, 0x53, 0xf3, 0xb7, 0x8c, 0x1d, 0xce, 0x25, 0x7d, 0x96, 0xc3, 0x79, 0x4c, 0x22, - 0x0e, 0x40, 0xbb, 0xdb, 0x96, 0x11, 0x6b, 0xc7, 0x93, 0x03, 0x30, 0xe8, 0xb6, 0x9d, 0x74, 0xd4, - 0xda, 0x18, 0xd1, 0xfa, 0xd1, 0x3c, 0xcc, 0xc8, 0x0d, 0x57, 0x3e, 0x65, 0x3c, 0xb5, 0xcf, 0x44, - 0xef, 0x18, 0xcf, 0x44, 0x2a, 0x44, 0x8f, 0xde, 0xb4, 0xa1, 0x1e, 0x89, 0xf6, 0x81, 0xf5, 0xd2, - 0x30, 0x1b, 0xa6, 0x74, 0xe8, 0xe0, 0xf7, 0xa1, 0xcb, 0x49, 0x34, 0x27, 0x3a, 0xef, 0xf0, 0x91, - 0x2e, 0xb4, 0x0d, 0x1e, 0xd6, 0xdf, 0xcc, 0xc3, 0xb4, 0xf6, 0xa8, 0xff, 0xd4, 0x76, 0xfc, 0xe7, - 0x8d, 0x8e, 0x5f, 0x8c, 0x9d, 0x3e, 0xe2, 0x96, 0x0d, 0xd5, 0xef, 0x5d, 0x98, 0xeb, 0x21, 0x49, - 0xdb, 0x46, 0xe4, 0x86, 0xb1, 0x8d, 0x78, 0xa3, 0x37, 0x34, 0x8c, 0x8c, 0xb0, 0x1c, 0x07, 0x0a, - 0xd0, 0x63, 0xd1, 0xfc, 0x58, 0x1e, 0x16, 0xe8, 0x17, 0xc6, 0x52, 0x93, 0x12, 0xc7, 0x53, 0x3b, - 0x16, 0x15, 0x63, 0x2c, 0xca, 0xe6, 0x58, 0x68, 0x0d, 0xec, 0x3f, 0x24, 0xd6, 0x5f, 0x07, 0x58, - 0xec, 0x47, 0x30, 0xb4, 0x6f, 0x65, 0xe2, 0xb9, 0x92, 0x1f, 0xc2, 0x73, 0x65, 0x03, 0x4a, 0x58, - 0x15, 0x45, 0x4b, 0x0a, 0xc5, 0xbd, 0xb5, 0x90, 0x5c, 0x12, 0x65, 0xc0, 0x3b, 0x8a, 0xde, 0x14, - 0xa6, 0x2e, 0xae, 0x3d, 0x94, 0xec, 0xe7, 0x72, 0x30, 0x83, 0xc0, 0xf5, 0x87, 0xbc, 0x1d, 0x21, - 0xb3, 0x11, 0x72, 0xb4, 0x88, 0x5f, 0x91, 0x6a, 0x51, 0xe0, 0xb5, 0xf7, 0xe8, 0x19, 0x69, 0x87, - 0x9e, 0x91, 0xde, 0x95, 0xcf, 0x5f, 0x17, 0xeb, 0x7e, 0xeb, 0xd2, 0x5e, 0xe0, 0x3e, 0xf4, 0xa4, - 0xbd, 0x8a, 0xdb, 0xbc, 0x94, 0x04, 0xf8, 0xef, 0x78, 0xa9, 0x90, 0xfd, 0xc4, 0x0a, 0x9f, 0xe8, - 0xe4, 0x87, 0x72, 0xac, 0x36, 0x7d, 0xbf, 0x36, 0xbf, 0x88, 0x7d, 0x1f, 0x9c, 0x91, 0x31, 0x4c, - 0xc4, 0x35, 0xcd, 0x6b, 0x77, 0xfd, 0x6e, 0xb8, 0xe2, 0xd6, 0x1f, 0x08, 0x59, 0x4d, 0x3a, 0x8b, - 0x61, 0xcb, 0xeb, 0x71, 0xa1, 0xb3, 0x23, 0x4b, 0x0d, 0xe7, 0xd8, 0x6c, 0x06, 0xec, 0x06, 0xcc, - 0xc9, 0xa2, 0x4a, 0x37, 0xf2, 0x6b, 0x75, 0xb7, 0xe9, 0xb5, 0xf7, 0xf0, 0x40, 0x28, 0xca, 0xf3, - 0xc8, 0xed, 0x46, 0xbe, 0x13, 0x4a, 0xb8, 0x7e, 0xdd, 0xee, 0x21, 0x62, 0x55, 0x98, 0xb5, 0xb9, - 0xdb, 0xb8, 0xed, 0x3e, 0x5a, 0x75, 0x3b, 0x6e, 0x5d, 0x5c, 0xde, 0x8b, 0xf8, 0xe4, 0x8a, 0xa7, - 0x72, 0xc0, 0xdd, 0x86, 0xd3, 0x72, 0x1f, 0x39, 0x75, 0x2a, 0x34, 0xf5, 0xae, 0x06, 0x5d, 0xcc, - 0xca, 0x6b, 0xc7, 0xac, 0x26, 0xd2, 0xac, 0xbc, 0x76, 0x7f, 0x56, 0x09, 0x9d, 0x62, 0xb5, 0xed, - 0x06, 0x7b, 0x3c, 0x92, 0xe6, 0x9e, 0x70, 0x2e, 0x77, 0x21, 0xa7, 0xb1, 0x8a, 0xb0, 0xcc, 0x41, - 0xd3, 0xcf, 0x34, 0x2b, 0x8d, 0x4e, 0xcc, 0xbc, 0xfb, 0x81, 0x17, 0x71, 0xbd, 0x85, 0x93, 0xf8, - 0x59, 0xd8, 0xff, 0x68, 0x28, 0xdb, 0xaf, 0x89, 0x3d, 0x94, 0x09, 0x37, 0xad, 0x91, 0x53, 0x3d, - 0xdc, 0xb2, 0x5b, 0xd9, 0x43, 0x19, 0x73, 0xd3, 0xdb, 0x39, 0x8d, 0xed, 0xd4, 0xb8, 0xf5, 0x69, - 0x68, 0x0f, 0x25, 0xbb, 0x23, 0x3a, 0x2d, 0xe2, 0x6d, 0x31, 0xa3, 0xc9, 0xdc, 0x75, 0x06, 0x3f, - 0xed, 0x65, 0xb2, 0xd9, 0x2a, 0x05, 0xaa, 0xd8, 0xc9, 0x30, 0x7e, 0x4d, 0x13, 0xb3, 0xbf, 0x04, - 0xb3, 0x77, 0x43, 0x7e, 0xad, 0xba, 0x55, 0x53, 0x21, 0x4f, 0x50, 0x43, 0x34, 0xb3, 0x7c, 0xf9, - 0x98, 0x4d, 0xe7, 0xa2, 0x4e, 0x83, 0x71, 0xf6, 0xe5, 0xb8, 0x75, 0x43, 0xee, 0xec, 0x7a, 0x9d, - 0x30, 0x8e, 0x1f, 0xa5, 0x8f, 0x5b, 0xaa, 0x2a, 0xeb, 0x06, 0xcc, 0xf5, 0xb0, 0x61, 0x33, 0x00, - 0x02, 0xe8, 0xdc, 0xbd, 0x53, 0x5b, 0xdf, 0x2e, 0x3d, 0xc3, 0x4a, 0x30, 0x85, 0xbf, 0xd7, 0xef, - 0x54, 0x56, 0x36, 0xd6, 0xd7, 0x4a, 0x39, 0x36, 0x07, 0xd3, 0x08, 0x59, 0xab, 0xd6, 0x24, 0x28, - 0x2f, 0xa3, 0x2c, 0xdb, 0x25, 0xb9, 0x74, 0x23, 0xb1, 0x00, 0xf0, 0x4c, 0xb1, 0xfe, 0x6e, 0x1e, - 0xce, 0xaa, 0x63, 0x85, 0x47, 0x42, 0x04, 0xf3, 0xda, 0x7b, 0x4f, 0xf9, 0xe9, 0x70, 0xcd, 0x38, - 0x1d, 0x5e, 0x4e, 0x9d, 0xd4, 0xa9, 0x56, 0x0e, 0x38, 0x22, 0x7e, 0x6d, 0x02, 0x9e, 0x1f, 0x48, - 0xc5, 0xbe, 0x28, 0x4e, 0x73, 0x8f, 0xb7, 0xa3, 0x6a, 0xa3, 0xc9, 0xb7, 0xbd, 0x16, 0xf7, 0xbb, - 0x11, 0x99, 0x57, 0xbf, 0x84, 0x4a, 0x19, 0x2c, 0x74, 0xbc, 0x46, 0x93, 0x3b, 0x91, 0x2c, 0x36, - 0xa6, 0x5b, 0x2f, 0xb5, 0x60, 0x19, 0xe7, 0xfc, 0xa8, 0xb6, 0x23, 0x1e, 0x3c, 0x44, 0x13, 0xae, - 0x98, 0xe5, 0x03, 0xce, 0x3b, 0x8e, 0x2b, 0x4a, 0x1d, 0x8f, 0x8a, 0x4d, 0x96, 0x3d, 0xd4, 0xec, - 0x9a, 0xc6, 0x72, 0x55, 0x5c, 0xe1, 0x6e, 0xbb, 0x8f, 0xc8, 0xa6, 0x84, 0x42, 0xe8, 0xc5, 0x2c, - 0xa5, 0x3f, 0x67, 0xcb, 0x7d, 0x64, 0xf7, 0x92, 0xb0, 0xaf, 0xc2, 0x29, 0x3a, 0x80, 0xc8, 0x1f, - 0x5f, 0xb5, 0x58, 0x7a, 0xfb, 0xbf, 0xfa, 0xf8, 0xa8, 0x7c, 0x46, 0x05, 0x1f, 0x54, 0x11, 0x18, - 0xb2, 0x5a, 0x9d, 0xcd, 0x85, 0x6d, 0x8b, 0x03, 0x39, 0xd5, 0x1d, 0xb7, 0x79, 0x18, 0x2a, 0x47, - 0x23, 0xba, 0xde, 0xe8, 0x9d, 0xe9, 0xb4, 0x64, 0xb9, 0xdd, 0x97, 0x92, 0xdd, 0x80, 0x99, 0xfb, - 0x7c, 0x47, 0x1f, 0x9f, 0xb1, 0x78, 0xab, 0x2a, 0x1d, 0xf0, 0x9d, 0xfe, 0x83, 0x93, 0xa2, 0x63, - 0x1e, 0x2a, 0x79, 0x1f, 0x1d, 0x6e, 0x78, 0x61, 0xc4, 0xdb, 0x3c, 0xc0, 0x38, 0x2f, 0xe3, 0xb8, - 0x19, 0x2c, 0x26, 0x12, 0xb2, 0x59, 0xbe, 0xf2, 0xe2, 0xe3, 0xa3, 0xf2, 0xf3, 0xd2, 0x63, 0xaf, - 0x49, 0x70, 0x27, 0x95, 0x31, 0xa3, 0x97, 0x2b, 0xfb, 0x3a, 0xcc, 0xda, 0x7e, 0x37, 0xf2, 0xda, - 0x7b, 0xb5, 0x28, 0x70, 0x23, 0xbe, 0x27, 0x0f, 0xa4, 0x24, 0xa0, 0x4c, 0xaa, 0x94, 0xde, 0x07, - 0x25, 0xd0, 0x09, 0x09, 0x6a, 0x9c, 0x08, 0x26, 0x01, 0xfb, 0x1a, 0xcc, 0x48, 0x4f, 0xec, 0xb8, - 0x82, 0x09, 0x23, 0xda, 0xb7, 0x59, 0x78, 0xef, 0x32, 0x99, 0x00, 0x20, 0x34, 0xab, 0x82, 0x14, - 0x37, 0xf6, 0x65, 0xea, 0xac, 0x2d, 0xaf, 0xbd, 0x17, 0x4f, 0x63, 0xc0, 0x9e, 0x7f, 0x33, 0xe9, - 0x92, 0x8e, 0xf8, 0x5c, 0x35, 0x8d, 0xfb, 0xd8, 0x33, 0xf5, 0xf2, 0x61, 0x11, 0x3c, 0x5f, 0x09, - 0x43, 0x2f, 0x8c, 0xc8, 0x09, 0x61, 0xfd, 0x11, 0xaf, 0x77, 0x05, 0xb2, 0xb8, 0x28, 0xf2, 0x40, - 0x1a, 0xc1, 0x8e, 0xae, 0x5c, 0x7c, 0x7c, 0x54, 0x7e, 0xdd, 0x45, 0x44, 0x87, 0xfc, 0x16, 0x1c, - 0xae, 0x50, 0x9d, 0x03, 0x89, 0xab, 0xb5, 0x61, 0x30, 0x53, 0xf6, 0x35, 0x38, 0xbd, 0xea, 0x86, - 0xbc, 0xda, 0x0e, 0x79, 0x3b, 0xf4, 0x22, 0xef, 0x21, 0xa7, 0x4e, 0xc5, 0xc3, 0xaf, 0x88, 0xb9, - 0x45, 0xac, 0xba, 0x1b, 0x8a, 0x85, 0x19, 0xa3, 0x38, 0x34, 0x28, 0x5a, 0x35, 0x7d, 0xb8, 0x30, - 0x1b, 0x66, 0x6a, 0xb5, 0x1b, 0x6b, 0x9e, 0x1b, 0xaf, 0xab, 0x69, 0xec, 0xaf, 0xd7, 0x51, 0x3f, - 0x13, 0xee, 0x3b, 0x0d, 0xcf, 0x8d, 0x17, 0x54, 0x9f, 0xce, 0x4a, 0x71, 0xb0, 0x8e, 0x72, 0x50, - 0x4a, 0x0f, 0x25, 0xfb, 0x12, 0x4c, 0x48, 0x63, 0x20, 0x1e, 0xee, 0x93, 0x63, 0xb2, 0xb2, 0x2d, - 0x89, 0xe1, 0x26, 0x11, 0x39, 0x05, 0x49, 0x53, 0x23, 0xae, 0xdb, 0x2d, 0xa0, 0x53, 0x90, 0x22, - 0x62, 0x0d, 0x98, 0x92, 0xa3, 0xc5, 0x31, 0x9a, 0x14, 0xd9, 0x84, 0xbe, 0xa8, 0xaf, 0x0e, 0x2a, - 0x4a, 0xf1, 0xc7, 0xa7, 0x1f, 0x9a, 0x13, 0x12, 0xc1, 0xa8, 0xc2, 0xe0, 0xba, 0x02, 0x50, 0x54, - 0x84, 0xd6, 0x59, 0x38, 0xd3, 0xe7, 0x9b, 0xad, 0x87, 0xf8, 0x1c, 0xdc, 0xa7, 0x46, 0xf6, 0x25, - 0x58, 0x40, 0xc2, 0x55, 0xbf, 0xdd, 0xe6, 0xf5, 0x08, 0xb7, 0x23, 0xa5, 0x42, 0x2d, 0x48, 0x9b, - 0x03, 0xd9, 0xde, 0x7a, 0x8c, 0xe0, 0xa4, 0x35, 0xa9, 0x99, 0x1c, 0xac, 0x9f, 0xca, 0xc3, 0x22, - 0xed, 0x70, 0x36, 0xaf, 0xfb, 0x41, 0xe3, 0xe9, 0x3f, 0x51, 0xd7, 0x8d, 0x13, 0xf5, 0xa5, 0x38, - 0x12, 0x45, 0x56, 0x23, 0x07, 0x1c, 0xa8, 0xbf, 0x90, 0x83, 0xe7, 0x06, 0x11, 0x89, 0xde, 0x89, - 0xa3, 0x67, 0x4d, 0xf4, 0x44, 0xc9, 0xea, 0xc0, 0x3c, 0x0e, 0xe8, 0xea, 0x3e, 0xaf, 0x3f, 0x08, - 0x6f, 0xf8, 0x61, 0x84, 0x66, 0xe9, 0xf9, 0x3e, 0x0f, 0x96, 0x6f, 0x64, 0x3e, 0x58, 0x9e, 0x96, - 0xb3, 0xac, 0x8e, 0x3c, 0x64, 0x7c, 0xaf, 0x07, 0xfc, 0x30, 0xb4, 0xb3, 0x58, 0xa3, 0x79, 0x71, - 0xa5, 0x1b, 0xed, 0x6f, 0x05, 0x7c, 0x97, 0x07, 0xbc, 0x5d, 0xe7, 0xdf, 0x63, 0xe6, 0xc5, 0x66, - 0xe3, 0x86, 0xd2, 0x60, 0xfc, 0xd3, 0x69, 0x58, 0xc8, 0x22, 0x13, 0xfd, 0xa2, 0x5d, 0x9a, 0xd3, - 0xa9, 0xcf, 0xfe, 0x5a, 0x0e, 0xa6, 0x6a, 0xbc, 0xee, 0xb7, 0x1b, 0xd7, 0xd0, 0x2c, 0x84, 0x7a, - 0xc7, 0x91, 0x42, 0x83, 0x80, 0x3b, 0xbb, 0x29, 0x7b, 0x91, 0xef, 0x1c, 0x95, 0xbf, 0x30, 0xdc, - 0x5d, 0xb5, 0xee, 0x63, 0x34, 0x89, 0x08, 0x43, 0x73, 0xc7, 0x55, 0xe0, 0x0b, 0x8f, 0x51, 0x29, - 0x5b, 0x81, 0x69, 0x5a, 0xae, 0xbe, 0x1e, 0x3c, 0x4d, 0x06, 0xeb, 0x50, 0x05, 0x3d, 0xfa, 0x47, - 0x83, 0x84, 0x5d, 0x81, 0xc2, 0xdd, 0xe5, 0x6b, 0x34, 0x06, 0x2a, 0xb8, 0xf9, 0xdd, 0xe5, 0x6b, - 0xa8, 0x0e, 0x13, 0x57, 0x8c, 0xe9, 0xee, 0xb2, 0x61, 0xa9, 0x71, 0x77, 0xf9, 0x1a, 0xfb, 0x2b, - 0x70, 0x6a, 0xcd, 0x0b, 0xa9, 0x0a, 0x69, 0xe8, 0xde, 0x40, 0xf7, 0xae, 0xb1, 0x3e, 0xb3, 0xf7, - 0xb3, 0x99, 0xb3, 0xf7, 0xc5, 0x46, 0xcc, 0xc4, 0x91, 0x56, 0xf4, 0x8d, 0x74, 0x90, 0xb8, 0xec, - 0x7a, 0xd8, 0x47, 0x30, 0x83, 0xba, 0x73, 0xb4, 0xfd, 0xc7, 0xf0, 0xbe, 0xe3, 0x7d, 0x6a, 0xfe, - 0x74, 0x66, 0xcd, 0x4b, 0xd2, 0x49, 0x1c, 0x3d, 0x08, 0x30, 0x14, 0xb0, 0x71, 0xeb, 0x37, 0x38, - 0xb3, 0x9b, 0x30, 0x4b, 0xe2, 0xd7, 0xe6, 0xee, 0xf6, 0x3e, 0x5f, 0x73, 0x0f, 0xc9, 0xc8, 0x02, - 0x6f, 0x74, 0x24, 0xb3, 0x39, 0xfe, 0xae, 0x13, 0xed, 0x73, 0xa7, 0xe1, 0x1a, 0x82, 0x4a, 0x8a, - 0x90, 0x7d, 0x3f, 0x4c, 0x6e, 0xf8, 0x75, 0x21, 0x79, 0xe3, 0xce, 0x20, 0xed, 0x2e, 0x3e, 0xc4, - 0xe4, 0x5a, 0x12, 0x9c, 0x12, 0xa7, 0xbe, 0x73, 0x54, 0x7e, 0xe7, 0xa4, 0x93, 0x46, 0xab, 0xc0, - 0xd6, 0x6b, 0x63, 0xab, 0x50, 0xbc, 0xcf, 0x77, 0x44, 0x6b, 0xd3, 0x89, 0x77, 0x14, 0x98, 0xcc, - 0xaa, 0xe8, 0x97, 0x61, 0x56, 0x45, 0x30, 0x16, 0xc0, 0x1c, 0xf6, 0xcf, 0x96, 0x1b, 0x86, 0x07, - 0x7e, 0xd0, 0xc0, 0x08, 0xeb, 0xfd, 0x4c, 0x3a, 0x96, 0x33, 0x3b, 0xff, 0x39, 0xd9, 0xf9, 0x1d, - 0x8d, 0x83, 0x2e, 0x40, 0xf6, 0xb0, 0x67, 0x5f, 0x87, 0x19, 0xf2, 0x6c, 0xbe, 0x7d, 0xad, 0x82, - 0xab, 0x72, 0xca, 0x70, 0x92, 0x33, 0x0b, 0xa5, 0x94, 0x4a, 0x8e, 0xd2, 0x4a, 0x03, 0xe5, 0xb4, - 0x76, 0x5d, 0xf3, 0xd5, 0x4c, 0x27, 0x61, 0x5b, 0x30, 0xb9, 0xc6, 0x1f, 0x7a, 0x75, 0x8e, 0x8e, - 0x3c, 0x64, 0x44, 0x1b, 0x67, 0x0e, 0x49, 0x4a, 0xa4, 0x2e, 0xa6, 0x81, 0x00, 0xe9, 0x16, 0x64, - 0x5a, 0x4d, 0xc6, 0x88, 0xec, 0x2a, 0x14, 0xaa, 0x6b, 0x5b, 0x64, 0x43, 0xab, 0x7c, 0x63, 0xaa, - 0x8d, 0x2d, 0x95, 0x67, 0x01, 0x8d, 0xa0, 0xbc, 0x86, 0x61, 0x81, 0x5b, 0x5d, 0xdb, 0x62, 0xbb, - 0x30, 0x8d, 0x1d, 0x70, 0x83, 0xbb, 0xb2, 0x6f, 0x67, 0xfb, 0xf4, 0xed, 0xc5, 0xcc, 0xbe, 0x5d, - 0x94, 0x7d, 0xbb, 0x4f, 0xd4, 0x46, 0xe0, 0x78, 0x9d, 0xad, 0x10, 0x69, 0x29, 0x99, 0x85, 0x0a, - 0x77, 0xbe, 0xbd, 0x81, 0x46, 0x1e, 0x24, 0xd2, 0xaa, 0xdc, 0x17, 0x71, 0xfc, 0xf5, 0xbe, 0x26, - 0xfa, 0xbd, 0x7c, 0xd8, 0xe7, 0x61, 0x64, 0xf3, 0x41, 0xe4, 0x2e, 0xce, 0x19, 0xfd, 0x28, 0x40, - 0xaa, 0xf9, 0xa8, 0x85, 0xf4, 0x1f, 0x18, 0x61, 0x84, 0x90, 0x46, 0x0c, 0xc5, 0x0d, 0x37, 0x68, - 0x1c, 0xb8, 0x01, 0x7a, 0x53, 0xce, 0x1b, 0x2c, 0xb4, 0x12, 0x39, 0x14, 0xfb, 0x04, 0x48, 0xb9, - 0x58, 0xea, 0x2c, 0xd8, 0xf7, 0xc1, 0xd9, 0xd0, 0xdb, 0x6b, 0xbb, 0x51, 0x37, 0xe0, 0x8e, 0xdb, - 0xdc, 0xf3, 0x03, 0x2f, 0xda, 0x6f, 0x39, 0x61, 0xd7, 0x8b, 0xf8, 0xe2, 0x82, 0x91, 0xfa, 0xb2, - 0xa6, 0xf0, 0x2a, 0x0a, 0xad, 0x26, 0xb0, 0xec, 0x33, 0x61, 0x76, 0x01, 0xfb, 0x32, 0x4c, 0xeb, - 0x5b, 0x72, 0xb8, 0x78, 0xea, 0x5c, 0xe1, 0xc2, 0x4c, 0x7c, 0xf1, 0x48, 0x6f, 0xe0, 0x2a, 0x64, - 0xa4, 0x76, 0x42, 0x84, 0x66, 0xc8, 0x48, 0x8d, 0x57, 0x9c, 0x4c, 0x8a, 0x95, 0xe6, 0xed, 0x39, - 0x9a, 0xb1, 0xd4, 0xcb, 0xb7, 0xaf, 0x55, 0xec, 0xf1, 0xad, 0xea, 0xbd, 0x5a, 0xd3, 0x8f, 0xac, - 0xff, 0x22, 0x87, 0x9b, 0x38, 0x7b, 0x1d, 0xa3, 0x9f, 0xc4, 0xcf, 0x79, 0xa8, 0xbf, 0x75, 0x3b, - 0xa9, 0x78, 0xc3, 0x12, 0x85, 0xbd, 0x01, 0x63, 0xd7, 0xdc, 0x3a, 0x8f, 0xd4, 0xa3, 0x2b, 0x22, - 0xef, 0x22, 0x44, 0x57, 0xf6, 0x4a, 0x1c, 0x21, 0x5f, 0xca, 0xc9, 0x5d, 0x49, 0xb2, 0xa3, 0xae, - 0x56, 0xd4, 0x9b, 0x2b, 0xca, 0x97, 0xb4, 0x28, 0xb4, 0xf4, 0xa9, 0x29, 0xfb, 0xe4, 0x4c, 0x0e, - 0xd6, 0x1f, 0xe7, 0x92, 0x5d, 0x89, 0xbd, 0x0a, 0x23, 0xf6, 0x56, 0xfc, 0xfd, 0xd2, 0x43, 0x32, - 0xf5, 0xf9, 0x88, 0xc0, 0xbe, 0x0c, 0xa7, 0x34, 0x3e, 0x3d, 0xc6, 0xd2, 0xaf, 0xa0, 0x03, 0x9f, - 0xf6, 0x25, 0xd9, 0x16, 0xd3, 0xd9, 0x3c, 0x50, 0x98, 0x4e, 0x0a, 0xd6, 0x78, 0xdb, 0x93, 0xbc, - 0xb5, 0xc6, 0xea, 0xbc, 0x1b, 0x88, 0x90, 0x6e, 0x6c, 0x16, 0x07, 0xe9, 0xbf, 0x67, 0xfd, 0x6a, - 0xce, 0xd8, 0x6d, 0xe2, 0x34, 0x94, 0xb9, 0x63, 0xd2, 0x50, 0xbe, 0x0d, 0x50, 0xe9, 0x46, 0xfe, - 0x7a, 0x3b, 0xf0, 0x9b, 0x52, 0x8b, 0x42, 0x21, 0xb7, 0x51, 0x37, 0xcc, 0x11, 0x6c, 0xb8, 0x19, - 0xc5, 0xc8, 0x99, 0x76, 0xe5, 0x85, 0x8f, 0x6b, 0x57, 0x6e, 0xfd, 0x76, 0xce, 0x58, 0xa3, 0x42, - 0x4a, 0xa4, 0xa9, 0xa8, 0x9b, 0xfd, 0x74, 0xbc, 0x87, 0x4e, 0xd8, 0xf4, 0xf5, 0x1d, 0x52, 0xa1, - 0xb1, 0x7f, 0x33, 0x07, 0xa7, 0xa5, 0x81, 0xf6, 0x9d, 0x6e, 0x6b, 0x87, 0x07, 0xf7, 0xdc, 0xa6, - 0xd7, 0x90, 0x5e, 0xaa, 0x52, 0x00, 0xbe, 0xd0, 0xbb, 0xe0, 0xb3, 0xf1, 0xe5, 0x45, 0x55, 0x1a, - 0x8c, 0x3b, 0x6d, 0x2c, 0x74, 0x1e, 0xc6, 0xa5, 0xfa, 0x45, 0x35, 0x9b, 0xde, 0xfa, 0xc5, 0x1c, - 0xbc, 0x78, 0x6c, 0x2d, 0xec, 0x12, 0x8c, 0xab, 0x58, 0xe7, 0x39, 0xec, 0x78, 0x34, 0x96, 0xec, - 0x8d, 0x73, 0xae, 0xb0, 0xd8, 0x57, 0xe0, 0x94, 0xce, 0x6a, 0x3b, 0x70, 0x3d, 0x3d, 0xa2, 0x78, - 0xc6, 0x57, 0x47, 0x02, 0x25, 0x2d, 0xad, 0x65, 0x33, 0xb1, 0xfe, 0xbf, 0x9c, 0x96, 0x98, 0xf6, - 0x29, 0x95, 0xe1, 0xaf, 0x1a, 0x32, 0xbc, 0x8a, 0x3b, 0x17, 0xb7, 0x4a, 0x94, 0x65, 0xde, 0xbb, - 0x66, 0x35, 0xa3, 0x5f, 0x04, 0xfc, 0x70, 0x1e, 0x26, 0xef, 0x86, 0x3c, 0x90, 0x0f, 0xb9, 0xdf, - 0x5b, 0xf1, 0xc5, 0xe2, 0x76, 0x0d, 0x15, 0x01, 0xea, 0x0f, 0x73, 0xa8, 0xe0, 0xd7, 0x29, 0x44, - 0x6f, 0x68, 0xc9, 0xa8, 0xb0, 0x37, 0x30, 0x0d, 0x15, 0x42, 0x65, 0xe0, 0xa1, 0x0d, 0x33, 0x2f, - 0x1d, 0x26, 0x27, 0xdc, 0x60, 0x5f, 0x80, 0xd1, 0xbb, 0xa8, 0xae, 0x34, 0x23, 0x12, 0xc4, 0xfc, - 0xb1, 0x50, 0x6e, 0xd2, 0xdd, 0xd0, 0x0c, 0x96, 0x24, 0x09, 0x59, 0x0d, 0xc6, 0x57, 0x03, 0x8e, - 0x69, 0x66, 0x47, 0x86, 0xf7, 0xa7, 0xad, 0x4b, 0x92, 0xb4, 0x3f, 0x2d, 0x71, 0xb2, 0x7e, 0x32, - 0x0f, 0x2c, 0x69, 0x23, 0xe6, 0x54, 0x09, 0x9f, 0xda, 0x41, 0xff, 0xc0, 0x18, 0xf4, 0xe7, 0x7b, - 0x06, 0x5d, 0x36, 0x6f, 0xa8, 0xb1, 0xff, 0xf5, 0x1c, 0x9c, 0xce, 0x26, 0x64, 0x2f, 0xc1, 0xd8, - 0xe6, 0xf6, 0x96, 0x0a, 0x6a, 0x41, 0x4d, 0xf1, 0x3b, 0xa8, 0x2b, 0xb0, 0xa9, 0x88, 0xbd, 0x09, - 0x63, 0x5f, 0xb4, 0x57, 0xc5, 0x39, 0xa4, 0x45, 0xed, 0xfe, 0x46, 0xe0, 0xd4, 0xcd, 0xa3, 0x88, - 0x90, 0xf4, 0xb1, 0x2d, 0x3c, 0xb1, 0xb1, 0xfd, 0xb1, 0x3c, 0xcc, 0x56, 0xea, 0x75, 0x1e, 0x86, - 0x42, 0xda, 0xe1, 0x61, 0xf4, 0xd4, 0x0e, 0x6c, 0x76, 0xb8, 0x0a, 0xa3, 0x6d, 0x43, 0x8d, 0xea, - 0x6f, 0xe6, 0xe0, 0x94, 0xa2, 0x7a, 0xe8, 0xf1, 0x83, 0xed, 0xfd, 0x80, 0x87, 0xfb, 0x7e, 0xb3, - 0x31, 0x74, 0x6a, 0x00, 0x21, 0xe8, 0x61, 0xbc, 0x5f, 0xfd, 0x55, 0x7f, 0x17, 0x21, 0x86, 0xa0, - 0x27, 0x63, 0x02, 0x5f, 0x82, 0xf1, 0x4a, 0xa7, 0x13, 0xf8, 0x0f, 0xe5, 0xb2, 0xa7, 0x70, 0x68, - 0xae, 0x04, 0x19, 0xee, 0xc8, 0x12, 0x24, 0x3e, 0x63, 0x8d, 0xb7, 0x65, 0xa0, 0xaf, 0x69, 0xf9, - 0x19, 0x0d, 0xde, 0xd6, 0x65, 0x71, 0x2c, 0xb7, 0x6a, 0xc0, 0xb6, 0x02, 0xbf, 0xe5, 0x47, 0xbc, - 0x21, 0xdb, 0x83, 0x5e, 0xdc, 0xc7, 0x06, 0x06, 0xda, 0xf6, 0xa2, 0xa6, 0x11, 0x18, 0x28, 0x12, - 0x00, 0x5b, 0xc2, 0xad, 0xff, 0x6b, 0x14, 0xa6, 0xf4, 0xde, 0x61, 0x96, 0x8c, 0xf7, 0xed, 0x07, - 0x7a, 0x28, 0x01, 0x17, 0x21, 0x36, 0x95, 0x24, 0x71, 0x38, 0xf2, 0xc7, 0xc6, 0xe1, 0xb8, 0x0f, - 0xd3, 0x5b, 0x81, 0x8f, 0x71, 0xdb, 0x64, 0xfa, 0x71, 0xb9, 0x15, 0xce, 0x6b, 0xf7, 0x4e, 0x31, - 0x90, 0xf8, 0x1e, 0x8a, 0x92, 0x7d, 0x87, 0xb0, 0x9d, 0x74, 0x72, 0x72, 0x93, 0x8f, 0x34, 0xb5, - 0x70, 0x43, 0x0a, 0xbe, 0x18, 0x9b, 0x5a, 0x08, 0x88, 0x69, 0x6a, 0x21, 0x20, 0xfa, 0x5a, 0x1b, - 0x7d, 0x52, 0x6b, 0x8d, 0xfd, 0x64, 0x0e, 0x26, 0x2b, 0xed, 0x36, 0xc5, 0xf7, 0x38, 0xc6, 0xb5, - 0xf9, 0x2b, 0x64, 0x6d, 0xf1, 0xce, 0xc7, 0xb2, 0xb6, 0x40, 0xb9, 0x25, 0x44, 0x49, 0x35, 0xa9, - 0x50, 0xbf, 0xad, 0x69, 0xdf, 0xc1, 0xde, 0x81, 0x52, 0x3c, 0xc9, 0xab, 0xed, 0x06, 0x7f, 0xc4, - 0x65, 0xbe, 0xa4, 0x69, 0x0a, 0xbb, 0xaa, 0x4b, 0xa6, 0x69, 0x44, 0xb6, 0x0d, 0xe0, 0xc6, 0xb3, - 0x2b, 0x95, 0xf8, 0xad, 0x77, 0xfa, 0x91, 0xf4, 0x8c, 0xbf, 0xf1, 0x41, 0x4b, 0x97, 0x9e, 0x13, - 0x3e, 0xac, 0x05, 0xb3, 0x32, 0xeb, 0x1a, 0x66, 0x63, 0xc7, 0xe8, 0xe2, 0x70, 0xec, 0x38, 0xbc, - 0x4a, 0xfa, 0xb3, 0x67, 0x29, 0x97, 0x1b, 0x26, 0x78, 0x77, 0x32, 0x42, 0x8d, 0xa7, 0x79, 0xcb, - 0x20, 0xb7, 0xf6, 0x99, 0xde, 0xef, 0x95, 0x93, 0xfe, 0xc7, 0x72, 0x70, 0x5a, 0x9f, 0xf4, 0xb5, - 0xee, 0x4e, 0xcb, 0xc3, 0x4b, 0x21, 0xbb, 0x08, 0x13, 0x34, 0x27, 0xe3, 0x4b, 0x54, 0x6f, 0x90, - 0xf4, 0x04, 0x85, 0xad, 0x8b, 0x69, 0x28, 0x78, 0x90, 0xd4, 0x3d, 0x9f, 0xda, 0xa7, 0x44, 0x51, - 0x92, 0xd1, 0x33, 0xc0, 0xdf, 0xe6, 0xfc, 0x14, 0x10, 0xeb, 0x7d, 0x98, 0x33, 0x47, 0xa2, 0xc6, - 0x23, 0xf6, 0x1a, 0x8c, 0xab, 0xe1, 0xcb, 0x65, 0x0f, 0x9f, 0x2a, 0xb7, 0xee, 0x03, 0xeb, 0xa1, - 0x0f, 0xd1, 0x2c, 0x8a, 0x47, 0xca, 0x6c, 0x4f, 0x3d, 0x4a, 0xf6, 0x20, 0xae, 0xcc, 0xd3, 0xf7, - 0x4d, 0x1a, 0xb6, 0xe5, 0x82, 0xd4, 0xfa, 0xe3, 0x19, 0x98, 0xcf, 0xd8, 0x73, 0x8f, 0x91, 0x89, - 0xca, 0xe6, 0x06, 0x31, 0x11, 0x47, 0x46, 0x50, 0xdb, 0xc2, 0xfb, 0x30, 0x7a, 0xec, 0x76, 0x20, - 0x3d, 0x0b, 0x52, 0xbb, 0x80, 0x24, 0xfb, 0xae, 0xc8, 0x45, 0x7a, 0xf0, 0x92, 0xd1, 0x27, 0x16, - 0xbc, 0x64, 0x05, 0xa6, 0xa9, 0x55, 0xb4, 0x5d, 0x69, 0x16, 0xae, 0x81, 0x2c, 0x70, 0x7a, 0xb6, - 0x2d, 0x93, 0x44, 0xf2, 0x08, 0xfd, 0xe6, 0x43, 0x4e, 0x3c, 0xc6, 0x75, 0x1e, 0x58, 0x90, 0xc9, - 0x43, 0x23, 0x61, 0xff, 0x31, 0x66, 0x7c, 0x42, 0x88, 0xbe, 0x67, 0x15, 0x07, 0xed, 0x59, 0x8d, - 0x27, 0xb3, 0x67, 0x3d, 0xaf, 0xbe, 0x31, 0x7b, 0xef, 0xca, 0xf8, 0x2c, 0xf6, 0xf3, 0x39, 0x98, - 0x93, 0x11, 0x34, 0xf4, 0x8f, 0x1d, 0x18, 0x15, 0xa1, 0xfe, 0x64, 0x3e, 0xf6, 0x39, 0xca, 0x74, - 0x92, 0xfd, 0xad, 0xbd, 0x1f, 0xc5, 0xbe, 0x0f, 0x20, 0x5e, 0x51, 0x32, 0xd0, 0xe4, 0xe4, 0xf2, - 0x73, 0x19, 0xbb, 0x40, 0x8c, 0x94, 0x44, 0x65, 0x8f, 0x62, 0x3a, 0x23, 0xcf, 0x57, 0x0c, 0x65, - 0x7f, 0x05, 0x16, 0xc4, 0x7a, 0x89, 0x21, 0x14, 0xef, 0x67, 0x71, 0x12, 0x6b, 0xf9, 0x4c, 0x7f, - 0x99, 0xe8, 0x62, 0x16, 0x99, 0x0c, 0x4b, 0x9a, 0xa4, 0x5c, 0x8d, 0xf4, 0xd0, 0x00, 0x99, 0x15, - 0x61, 0x18, 0x2d, 0xfc, 0x7a, 0x19, 0x39, 0xbd, 0xcf, 0xfe, 0x76, 0x56, 0xad, 0x05, 0xb9, 0xbf, - 0x85, 0xa6, 0xa3, 0x29, 0x82, 0xd8, 0x17, 0x81, 0xc5, 0xa1, 0x27, 0x24, 0x8c, 0xab, 0xa8, 0xea, - 0x52, 0xdd, 0x9c, 0x84, 0xb0, 0x08, 0x54, 0xb1, 0x3e, 0x49, 0x7a, 0x89, 0x19, 0x87, 0x05, 0x6a, - 0xb4, 0x80, 0xaa, 0x74, 0x4c, 0xe1, 0xe2, 0x8c, 0x11, 0x4d, 0x29, 0x29, 0x49, 0x72, 0xb3, 0x6a, - 0x39, 0x9d, 0x0c, 0x95, 0x53, 0x16, 0x3b, 0x76, 0x15, 0x26, 0xd0, 0xdb, 0xf3, 0x86, 0x32, 0xf6, - 0x22, 0xc3, 0x13, 0xf4, 0x0b, 0x75, 0xf6, 0x4d, 0x93, 0xad, 0x04, 0x55, 0x5c, 0x07, 0xd6, 0x82, - 0x43, 0xbb, 0xdb, 0x46, 0xa5, 0x30, 0xe9, 0x3b, 0x1a, 0xc1, 0xa1, 0x13, 0x74, 0x4d, 0x77, 0x60, - 0x44, 0x62, 0x5f, 0x87, 0xc9, 0xdb, 0xee, 0x23, 0xa5, 0x13, 0x26, 0xc5, 0xef, 0xa0, 0x1d, 0xc8, - 0x52, 0xad, 0x69, 0xb9, 0x8f, 0x9c, 0x46, 0x37, 0x1d, 0x14, 0x15, 0xb7, 0x21, 0x9d, 0x25, 0xfb, - 0x2a, 0x80, 0xa6, 0xa9, 0x66, 0xc7, 0x56, 0xf0, 0xa2, 0x8a, 0x11, 0x96, 0xa9, 0xc1, 0x46, 0xfe, - 0x1a, 0xc3, 0x94, 0xe4, 0xb0, 0xf0, 0xdd, 0x93, 0x1c, 0x4e, 0x7d, 0xf7, 0x24, 0x87, 0xa5, 0x1d, - 0x38, 0xdb, 0x77, 0xe9, 0x64, 0x84, 0x6e, 0xbd, 0x64, 0x86, 0x6e, 0x3d, 0xdb, 0xef, 0x88, 0x0d, - 0xcd, 0x40, 0xfc, 0xf3, 0xa5, 0x85, 0xfe, 0xd2, 0xc9, 0xb7, 0xf3, 0xa9, 0x23, 0x97, 0x2e, 0x16, - 0x32, 0x71, 0x4b, 0x3f, 0x99, 0x24, 0x8f, 0xb9, 0x3a, 0xe5, 0xa1, 0x9c, 0x4f, 0x2e, 0x34, 0xa9, - 0xf4, 0xe6, 0xf2, 0x78, 0xfe, 0xa4, 0xa7, 0xef, 0xbb, 0x30, 0x23, 0xd3, 0xeb, 0xdd, 0xe2, 0x87, - 0x07, 0x7e, 0xd0, 0x50, 0x39, 0xac, 0x51, 0x06, 0xef, 0xc9, 0x8d, 0x9b, 0xc2, 0x65, 0x6b, 0xca, - 0x81, 0x70, 0x14, 0x6b, 0x3f, 0x9b, 0xb9, 0x8b, 0x09, 0x84, 0x41, 0xbe, 0x85, 0xec, 0xad, 0x58, - 0x50, 0xe3, 0x81, 0x1e, 0x8e, 0x3f, 0x50, 0xc0, 0x0c, 0x79, 0x8d, 0x07, 0xd6, 0xef, 0x17, 0x80, - 0xc9, 0x9a, 0x56, 0xdd, 0x8e, 0x8b, 0xee, 0xb5, 0x1e, 0x06, 0xa6, 0x29, 0x11, 0x8e, 0xbb, 0xd3, - 0xe4, 0x7a, 0x54, 0x27, 0x32, 0xae, 0x8d, 0xcb, 0x9c, 0xf4, 0x45, 0xa7, 0x87, 0xb0, 0xcf, 0x56, - 0x97, 0xff, 0x24, 0x5b, 0xdd, 0xd7, 0xe1, 0xd9, 0x4a, 0x07, 0xf3, 0x74, 0xaa, 0x5a, 0xae, 0xf9, - 0x81, 0xda, 0xa4, 0x0c, 0xc7, 0x2d, 0x37, 0x46, 0xeb, 0xf9, 0xd2, 0x41, 0x2c, 0x34, 0x39, 0x45, - 0xcc, 0xcb, 0x4e, 0xa4, 0x07, 0x02, 0x50, 0x72, 0x4a, 0x07, 0x4b, 0x32, 0xe4, 0x14, 0x49, 0xa2, - 0x78, 0x78, 0x81, 0x92, 0x53, 0x30, 0x01, 0x4d, 0xc2, 0xc3, 0x0b, 0x78, 0x1f, 0x59, 0x27, 0x26, - 0x61, 0xef, 0xc2, 0x64, 0xa5, 0x1b, 0xf9, 0xc4, 0x98, 0xac, 0xc2, 0x13, 0xfb, 0x6d, 0xfa, 0x14, - 0xe3, 0xea, 0x93, 0xa0, 0x5b, 0x7f, 0x54, 0x80, 0xb3, 0xbd, 0xc3, 0x4b, 0xa5, 0xf1, 0xfa, 0xc8, - 0x1d, 0xb3, 0x3e, 0xb2, 0x66, 0x43, 0x3e, 0x09, 0x8f, 0xfe, 0x24, 0x66, 0x83, 0x4c, 0xf7, 0xf9, - 0x31, 0x67, 0x43, 0x0d, 0x26, 0xf5, 0xf3, 0x6e, 0xe4, 0xe3, 0x9e, 0x77, 0x3a, 0x17, 0x71, 0xa9, - 0x97, 0xf1, 0x0f, 0x46, 0x93, 0xa7, 0xa3, 0x74, 0xe8, 0x03, 0x89, 0xc1, 0xfe, 0x0d, 0x38, 0x27, - 0xf7, 0xa4, 0x74, 0x63, 0x57, 0x0e, 0x15, 0x47, 0x1a, 0xb8, 0xe5, 0xc7, 0x47, 0xe5, 0x8b, 0x52, - 0x55, 0xe2, 0xf4, 0x74, 0x9b, 0xb3, 0x73, 0xe8, 0xa8, 0x2f, 0xd3, 0x2a, 0x39, 0x96, 0x37, 0xe6, - 0xf8, 0xd4, 0xf2, 0x2f, 0xbe, 0x99, 0xe5, 0x2e, 0x23, 0xa3, 0x13, 0x4b, 0xb0, 0xe9, 0x29, 0xa3, - 0xd4, 0x61, 0xf9, 0x4c, 0x75, 0x98, 0xd2, 0xa7, 0x14, 0x32, 0xf5, 0x29, 0x6b, 0x30, 0x5b, 0xeb, - 0xee, 0xa8, 0xba, 0xd3, 0xfe, 0x72, 0x61, 0x77, 0x27, 0xab, 0x41, 0x69, 0x12, 0xeb, 0x47, 0xf2, - 0x30, 0xb5, 0xd5, 0xec, 0xee, 0x79, 0xed, 0x35, 0x37, 0x72, 0x9f, 0x5a, 0x0d, 0xdd, 0xdb, 0x86, - 0x86, 0x2e, 0xf6, 0x0a, 0x8b, 0x1b, 0x36, 0x94, 0x7a, 0xee, 0x27, 0x72, 0x30, 0x9b, 0x90, 0xc8, - 0x73, 0xf6, 0x06, 0x8c, 0x88, 0x1f, 0x74, 0x6f, 0x3d, 0xd7, 0xc3, 0x58, 0x26, 0xfd, 0x8a, 0xff, - 0x22, 0x9d, 0x99, 0x99, 0x51, 0x07, 0x39, 0x2c, 0x7d, 0x16, 0x26, 0x12, 0xb6, 0x27, 0x49, 0xf6, - 0xf5, 0x4b, 0x39, 0x28, 0xa5, 0x5b, 0xc2, 0x6e, 0xc1, 0xb8, 0xe0, 0xe4, 0x71, 0x75, 0xa5, 0x7e, - 0xb9, 0x4f, 0x9b, 0x2f, 0x12, 0x9a, 0xfc, 0x3c, 0xec, 0x7c, 0x2e, 0x21, 0xb6, 0xe2, 0xb0, 0x64, - 0xc3, 0x94, 0x8e, 0x95, 0xf1, 0x75, 0x6f, 0x98, 0xc2, 0xc5, 0xe9, 0xec, 0x7e, 0x30, 0x52, 0x94, - 0x19, 0x5f, 0x4d, 0x72, 0xc3, 0x79, 0x63, 0x72, 0x61, 0x5f, 0xa5, 0xe6, 0x8d, 0x9c, 0x66, 0xcb, - 0x49, 0xc0, 0x74, 0x7d, 0x9e, 0x65, 0x4c, 0xe8, 0x18, 0x8f, 0xbd, 0x01, 0x63, 0xb2, 0x3e, 0x3d, - 0x55, 0x4f, 0x07, 0x21, 0xba, 0x88, 0x2b, 0x71, 0xac, 0xbf, 0x57, 0x80, 0xd3, 0xc9, 0xe7, 0xdd, - 0xed, 0x34, 0xdc, 0x88, 0x6f, 0xb9, 0x81, 0xdb, 0x0a, 0x8f, 0x59, 0x01, 0x17, 0x7a, 0x3e, 0x0d, - 0x53, 0xb7, 0xa8, 0x4f, 0xd3, 0x3e, 0xc8, 0x4a, 0x7d, 0x10, 0xaa, 0x2f, 0xe5, 0x07, 0xa9, 0xcf, - 0x60, 0xb7, 0xa0, 0x50, 0xe3, 0x11, 0x6d, 0x9b, 0xe7, 0x7b, 0x7a, 0x55, 0xff, 0xae, 0x8b, 0x35, - 0x1e, 0xc9, 0x41, 0x94, 0x71, 0x79, 0xb8, 0x11, 0x89, 0xb5, 0xc6, 0x23, 0x76, 0x1f, 0xc6, 0xd6, - 0x1f, 0x75, 0x78, 0x3d, 0xa2, 0x54, 0x75, 0xaf, 0x0d, 0xe6, 0x27, 0x71, 0xb5, 0x4c, 0x75, 0x1c, - 0x01, 0x7a, 0x67, 0x49, 0x94, 0xa5, 0xab, 0x50, 0x54, 0x95, 0x9f, 0x64, 0xe6, 0x2e, 0xbd, 0x0d, - 0x93, 0x5a, 0x25, 0x27, 0x9a, 0xf4, 0x3f, 0x23, 0xf6, 0x55, 0xbf, 0xa9, 0xb2, 0xdb, 0xad, 0xf7, - 0x88, 0x79, 0x39, 0x3d, 0xeb, 0xba, 0x28, 0x71, 0x1e, 0x50, 0xd1, 0x00, 0x79, 0xaf, 0x0a, 0xb3, - 0xb5, 0x07, 0x5e, 0x27, 0x09, 0x88, 0x69, 0x1c, 0xa6, 0x98, 0xca, 0x82, 0xee, 0xdc, 0xe9, 0xc3, - 0x34, 0x4d, 0x67, 0xfd, 0x69, 0x0e, 0xc6, 0xc4, 0x5f, 0xf7, 0xae, 0x3e, 0xa5, 0x5b, 0xe6, 0x15, - 0x63, 0xcb, 0x9c, 0xd3, 0x62, 0x52, 0xe3, 0xc6, 0x71, 0xf5, 0x98, 0xcd, 0xf2, 0x88, 0x06, 0x48, - 0x22, 0xb3, 0xeb, 0x30, 0x4e, 0xd6, 0x40, 0x64, 0xb6, 0xad, 0x07, 0xb9, 0x56, 0x76, 0x42, 0xf1, - 0xe5, 0xdc, 0xef, 0xa4, 0xb5, 0x19, 0x8a, 0x5a, 0x88, 0xe4, 0x2a, 0x34, 0xa9, 0x91, 0x13, 0xd5, - 0x47, 0x3f, 0x3b, 0x19, 0xa2, 0x59, 0xcb, 0x62, 0xdc, 0xc7, 0x0b, 0xbf, 0x42, 0x0f, 0x19, 0x85, - 0x41, 0x4c, 0x4e, 0xab, 0x94, 0x91, 0x99, 0x6f, 0x1c, 0xbf, 0x77, 0x4a, 0x06, 0x36, 0x56, 0x1f, - 0xf6, 0x1e, 0x4c, 0x5d, 0xf3, 0x83, 0x03, 0x37, 0x90, 0xe1, 0x2a, 0xc9, 0x72, 0x40, 0x5c, 0x1d, - 0xa7, 0x77, 0x25, 0x5c, 0x06, 0xbc, 0xfc, 0xce, 0x51, 0x79, 0x64, 0xc5, 0xf7, 0x9b, 0xb6, 0x81, - 0xce, 0x36, 0x61, 0xfa, 0xb6, 0xfb, 0x48, 0xbb, 0xf4, 0x4a, 0xc7, 0x99, 0xd7, 0xc4, 0x04, 0x16, - 0xb7, 0xe6, 0xe3, 0x4d, 0xb3, 0x4c, 0x7a, 0xe6, 0xc1, 0xcc, 0x96, 0x1f, 0x44, 0x54, 0x89, 0xd7, - 0xde, 0xa3, 0xc6, 0xf6, 0x1a, 0x97, 0x5d, 0xca, 0x34, 0x2e, 0x3b, 0xdb, 0xf1, 0x83, 0xc8, 0xd9, - 0x8d, 0xc9, 0x8d, 0x80, 0x56, 0x06, 0x63, 0xf6, 0x1e, 0xcc, 0x69, 0x01, 0xfb, 0xae, 0xf9, 0x41, - 0xcb, 0x55, 0x42, 0x39, 0xea, 0x81, 0xd1, 0xde, 0x64, 0x17, 0xc1, 0x76, 0x2f, 0x26, 0xfb, 0x72, - 0x96, 0x2b, 0xd2, 0x68, 0x62, 0x9d, 0x96, 0xe1, 0x8a, 0xd4, 0xcf, 0x3a, 0xad, 0xd7, 0x29, 0x69, - 0x6f, 0x90, 0xf5, 0x6a, 0x71, 0xe5, 0x32, 0x5d, 0xbf, 0x8f, 0xb7, 0x4e, 0x8d, 0xc7, 0xad, 0x8f, - 0x95, 0xea, 0x32, 0x14, 0x56, 0xb6, 0xae, 0xe1, 0xeb, 0x85, 0x32, 0xb4, 0x69, 0xef, 0xbb, 0xed, - 0x3a, 0x0a, 0xcb, 0x64, 0x31, 0xae, 0xef, 0xc8, 0x2b, 0x5b, 0xd7, 0x98, 0x0b, 0xf3, 0x5b, 0x3c, - 0x68, 0x79, 0xd1, 0x97, 0x2e, 0x5f, 0xd6, 0x06, 0xaa, 0x88, 0x9f, 0x76, 0x89, 0x3e, 0xad, 0xdc, - 0x41, 0x14, 0xe7, 0xd1, 0xe5, 0xcb, 0x99, 0xc3, 0x11, 0x7f, 0x58, 0x16, 0x2f, 0xb1, 0x33, 0xde, - 0x76, 0x1f, 0x25, 0x86, 0xfe, 0x21, 0x39, 0x75, 0x3e, 0xaf, 0x26, 0x56, 0xe2, 0x24, 0x60, 0xec, - 0x8c, 0x26, 0x91, 0xb8, 0xeb, 0x24, 0xd3, 0x2b, 0x24, 0x77, 0x98, 0x25, 0xa5, 0xd2, 0x51, 0x9e, - 0xbf, 0xba, 0xc0, 0xae, 0xa1, 0xb3, 0xbb, 0xf1, 0x8d, 0x4d, 0xde, 0x78, 0x28, 0x21, 0xe2, 0x25, - 0xfd, 0xc6, 0x26, 0x15, 0x29, 0x46, 0xb3, 0x66, 0xe3, 0x6b, 0xbe, 0xf4, 0x7c, 0xb0, 0x4d, 0x2e, - 0xbd, 0x17, 0xc1, 0xa9, 0x93, 0x5f, 0x04, 0x39, 0x8c, 0x6c, 0xf8, 0xf5, 0x07, 0x14, 0x85, 0xeb, - 0x8b, 0x62, 0xb9, 0x37, 0xfd, 0xfa, 0x83, 0x27, 0x67, 0x95, 0x8b, 0xec, 0xd9, 0x1d, 0xf1, 0xa9, - 0x62, 0x16, 0x50, 0x9f, 0x90, 0xa5, 0xe7, 0x42, 0x7c, 0x13, 0xd2, 0xca, 0xa4, 0xe0, 0x23, 0x27, - 0x8d, 0xea, 0x5a, 0xdb, 0x24, 0x67, 0x1c, 0x4a, 0x6b, 0x3c, 0x7c, 0x10, 0xf9, 0x9d, 0xd5, 0xa6, - 0xd7, 0xd9, 0xf1, 0xdd, 0x40, 0xc5, 0x46, 0xed, 0x5d, 0xdf, 0xaf, 0x66, 0xae, 0xef, 0xb9, 0x86, - 0xa4, 0x77, 0xea, 0x8a, 0x81, 0xdd, 0xc3, 0x92, 0x7d, 0x19, 0x66, 0xc4, 0xe4, 0x5e, 0x7f, 0x14, - 0xf1, 0xb6, 0x1c, 0xf9, 0x39, 0x14, 0x1d, 0x16, 0xb4, 0x64, 0x00, 0x71, 0xa1, 0x9c, 0x53, 0xb8, - 0xd8, 0x79, 0x4c, 0x60, 0x44, 0x30, 0x33, 0x58, 0xb1, 0x06, 0x2c, 0xde, 0x76, 0x1f, 0x69, 0x69, - 0x1c, 0xb5, 0x49, 0xca, 0x70, 0x82, 0x5d, 0x78, 0x7c, 0x54, 0x7e, 0x59, 0x4c, 0xb0, 0x24, 0x5c, - 0x6f, 0x9f, 0xf9, 0xda, 0x97, 0x13, 0xfb, 0x7e, 0x38, 0x43, 0xcd, 0x5a, 0xc3, 0x0c, 0x39, 0x7e, - 0x70, 0x58, 0xdb, 0x77, 0xd1, 0xc7, 0x67, 0xfe, 0x64, 0x1b, 0xa2, 0xea, 0xb0, 0x86, 0xe2, 0xe3, - 0x84, 0x92, 0x91, 0xdd, 0xaf, 0x06, 0xf6, 0x11, 0xcc, 0xc8, 0x27, 0x9b, 0x1b, 0x7e, 0x18, 0xe1, - 0x85, 0x7e, 0xe1, 0x64, 0xa6, 0xeb, 0xf2, 0x1d, 0x48, 0x3a, 0x7b, 0xa4, 0x14, 0x00, 0x29, 0xce, - 0xec, 0x1d, 0x98, 0xdc, 0xf2, 0xda, 0x32, 0xc6, 0x60, 0x75, 0x0b, 0x55, 0x8f, 0x74, 0xfe, 0x74, - 0xbc, 0xb6, 0xa3, 0x6e, 0xd5, 0x9d, 0x78, 0xbb, 0xd0, 0xb1, 0xd9, 0x7d, 0x98, 0xac, 0xd5, 0x6e, - 0x5c, 0xf3, 0xc4, 0x01, 0xd8, 0x39, 0x5c, 0x3c, 0xdd, 0xe7, 0x2b, 0x5f, 0xca, 0xfc, 0xca, 0xe9, - 0x30, 0xdc, 0xc7, 0xd4, 0xf8, 0x4e, 0xdd, 0xef, 0x1c, 0xda, 0x3a, 0xa7, 0x0c, 0x73, 0xee, 0x33, - 0x4f, 0xd8, 0x9c, 0xbb, 0x0a, 0xb3, 0x9a, 0x81, 0x25, 0x1a, 0x57, 0x2e, 0x26, 0x81, 0x69, 0x74, - 0xf3, 0xed, 0xb4, 0xfb, 0x62, 0x9a, 0x4e, 0xd9, 0x71, 0x9f, 0x3d, 0xa9, 0x1d, 0xb7, 0x07, 0x73, - 0x72, 0x30, 0x68, 0x1e, 0xe0, 0x48, 0x2f, 0xf5, 0xe9, 0xc3, 0xd7, 0x32, 0xfb, 0x70, 0x9e, 0x46, - 0x5a, 0x4d, 0x32, 0x7c, 0xa2, 0xec, 0xe5, 0xca, 0x76, 0x81, 0x11, 0x90, 0x12, 0xf3, 0x63, 0x5d, - 0xcf, 0xf6, 0xa9, 0xeb, 0xe5, 0xcc, 0xba, 0x66, 0x54, 0x5d, 0x3b, 0xb2, 0x9a, 0x0c, 0x8e, 0xac, - 0xad, 0xea, 0x51, 0xf3, 0x0b, 0x3b, 0xf6, 0x39, 0x43, 0x0f, 0xda, 0x8b, 0x20, 0x03, 0xfc, 0xa6, - 0x27, 0x6d, 0xba, 0xdf, 0x33, 0x38, 0xb3, 0x47, 0x70, 0xba, 0xf7, 0x2b, 0xb0, 0xce, 0xe7, 0xb1, - 0xce, 0xe7, 0x8d, 0x3a, 0xd3, 0x48, 0x72, 0xde, 0x98, 0xcd, 0x4a, 0xd7, 0xda, 0x87, 0x3f, 0xfb, - 0xeb, 0x39, 0x38, 0x73, 0xfb, 0x5a, 0x05, 0xf3, 0xd1, 0x79, 0x32, 0xe4, 0x54, 0xec, 0xf6, 0xf9, - 0x02, 0xe9, 0xca, 0xd3, 0xfa, 0x7b, 0x25, 0x71, 0xe0, 0x56, 0x21, 0x64, 0xc4, 0x97, 0x5a, 0xbb, - 0xae, 0x4c, 0x73, 0x47, 0x2c, 0x32, 0x7c, 0x43, 0xbf, 0xf5, 0x07, 0xe5, 0x9c, 0xdd, 0xaf, 0x2a, - 0xd6, 0x84, 0x25, 0xb3, 0x5b, 0x94, 0xa5, 0xfd, 0x3e, 0x6f, 0x36, 0x17, 0xcb, 0x38, 0xa3, 0xdf, - 0x78, 0x7c, 0x54, 0xbe, 0xd0, 0xd3, 0xbb, 0xb1, 0xf5, 0xbe, 0xc0, 0xd4, 0x1a, 0x3c, 0x80, 0xdf, - 0xcd, 0x91, 0xe2, 0x74, 0x69, 0x26, 0xc3, 0xce, 0xdc, 0xfa, 0xb5, 0x7c, 0xea, 0xa4, 0x62, 0x55, - 0x18, 0xa7, 0x09, 0x48, 0xa2, 0x7b, 0xef, 0x34, 0x7b, 0x3e, 0x73, 0x9a, 0x8d, 0xd3, 0x5c, 0xb6, - 0x15, 0x3d, 0x3b, 0x10, 0xac, 0xf0, 0x2b, 0xe8, 0xae, 0xf3, 0x55, 0x79, 0x10, 0x21, 0xc8, 0x38, - 0x72, 0xd7, 0x4e, 0xee, 0x3d, 0x65, 0x3a, 0xe7, 0xe1, 0xd9, 0xab, 0x6a, 0x63, 0x0f, 0x64, 0xb2, - 0x94, 0x42, 0xec, 0x82, 0x63, 0x66, 0x46, 0x79, 0x62, 0x15, 0x8a, 0x5a, 0xac, 0x5f, 0xcd, 0xc1, - 0xb4, 0x71, 0xd4, 0xb1, 0xab, 0x9a, 0x7f, 0x59, 0xe2, 0x72, 0x6d, 0xe0, 0xe0, 0xee, 0x97, 0xf6, - 0x3c, 0xbb, 0x4a, 0xc6, 0xe2, 0xf9, 0xfe, 0x74, 0x38, 0xfb, 0xd3, 0xee, 0x86, 0x83, 0x35, 0x83, - 0x71, 0x0a, 0xb6, 0x91, 0x3e, 0x29, 0xd8, 0xfe, 0xd1, 0xb3, 0x30, 0x63, 0xde, 0x85, 0xd8, 0x1b, - 0x30, 0x86, 0x0a, 0x55, 0x75, 0xb1, 0x96, 0xa9, 0xeb, 0xfd, 0x54, 0x36, 0x51, 0xc2, 0x61, 0xaf, - 0x00, 0xc4, 0x56, 0xbb, 0xea, 0x39, 0x61, 0xf4, 0xf1, 0x51, 0x39, 0xf7, 0xa6, 0xad, 0x15, 0xb0, - 0xaf, 0x01, 0xdc, 0xf1, 0x1b, 0x3c, 0xce, 0x57, 0x39, 0xe0, 0xc9, 0xfc, 0xd5, 0x9e, 0x44, 0x02, - 0xa7, 0xda, 0x7e, 0x83, 0xf7, 0x66, 0x0d, 0xd0, 0x38, 0xb2, 0xcf, 0xc3, 0xa8, 0xdd, 0x15, 0x97, - 0x78, 0xa9, 0x3f, 0x99, 0x54, 0x47, 0x4e, 0xb7, 0xc9, 0x93, 0x1b, 0x62, 0xd0, 0x4d, 0x5b, 0x83, - 0x09, 0x00, 0xfb, 0x40, 0x26, 0x18, 0xa0, 0xe8, 0x7c, 0xa3, 0xc9, 0x03, 0x8b, 0x26, 0x8a, 0xf4, - 0xc4, 0xe7, 0xd3, 0x48, 0xd8, 0x26, 0x8c, 0xeb, 0x2f, 0x03, 0x9a, 0xa3, 0xb2, 0xfe, 0x7a, 0xa4, - 0x5d, 0x37, 0x29, 0xd1, 0x65, 0xfa, 0xd1, 0x40, 0x71, 0x61, 0xef, 0xc2, 0x84, 0x60, 0x2f, 0x96, - 0x72, 0x48, 0xd7, 0x0c, 0x7c, 0x46, 0xd1, 0x3e, 0x48, 0x6c, 0x07, 0x46, 0x0c, 0xbd, 0x98, 0x80, - 0x7d, 0x19, 0x53, 0x28, 0x52, 0x57, 0x0f, 0x34, 0xa5, 0x38, 0xdf, 0xd3, 0xd5, 0x98, 0x53, 0xb1, - 0x37, 0x27, 0x7b, 0xcc, 0x8f, 0xed, 0xc5, 0x71, 0xb2, 0x86, 0x49, 0x0a, 0xf1, 0x7a, 0x4f, 0x05, - 0x8b, 0x2a, 0xf4, 0x53, 0x6f, 0xde, 0x51, 0x83, 0x2f, 0xeb, 0x40, 0x29, 0x91, 0xf2, 0xa8, 0x2e, - 0x18, 0x54, 0xd7, 0x9b, 0x3d, 0x75, 0xe9, 0x03, 0xd8, 0x53, 0x5d, 0x0f, 0x77, 0xd6, 0x80, 0x19, - 0x75, 0x62, 0x50, 0x7d, 0x93, 0x83, 0xea, 0x7b, 0xa5, 0xa7, 0xbe, 0xf9, 0xc6, 0x4e, 0x6f, 0x3d, - 0x29, 0x9e, 0xec, 0x5d, 0x98, 0x56, 0x10, 0x99, 0x05, 0x74, 0x2a, 0x49, 0xf7, 0xd8, 0xd8, 0xe9, - 0xc9, 0xfd, 0x69, 0x22, 0xeb, 0xd4, 0x72, 0x76, 0x4c, 0x1b, 0xd4, 0xe9, 0x59, 0x61, 0x22, 0xb3, - 0x0f, 0x61, 0xb2, 0xda, 0x12, 0x0d, 0xf1, 0xdb, 0x6e, 0xc4, 0xc9, 0x89, 0x4d, 0x99, 0x85, 0x68, - 0x25, 0xda, 0x54, 0x95, 0xf9, 0x4d, 0x93, 0x22, 0x23, 0xbf, 0x69, 0x02, 0x16, 0x9d, 0x27, 0x9f, - 0x82, 0x68, 0x0e, 0x2b, 0x07, 0xb7, 0xe7, 0x33, 0x4c, 0x33, 0x34, 0xf6, 0x14, 0x05, 0x53, 0x40, - 0xd5, 0x53, 0x4c, 0x2a, 0x0a, 0xa6, 0xce, 0x93, 0xbd, 0x07, 0x93, 0x94, 0x2f, 0xa7, 0x62, 0xdf, - 0x09, 0x17, 0x4b, 0xd8, 0x78, 0x74, 0xcb, 0x57, 0xa9, 0x75, 0x1c, 0x37, 0x48, 0xd9, 0x20, 0x26, - 0xf8, 0xec, 0x4b, 0xb0, 0x70, 0xdf, 0x6b, 0x37, 0xfc, 0x83, 0x90, 0x8e, 0x29, 0xda, 0xe8, 0xe6, - 0x12, 0x0f, 0xa0, 0x03, 0x59, 0x1e, 0x0b, 0x67, 0x3d, 0x1b, 0x5f, 0x26, 0x07, 0xf6, 0x97, 0x7b, - 0x38, 0xcb, 0x19, 0xc4, 0x06, 0xcd, 0xa0, 0xe5, 0x9e, 0x19, 0xd4, 0x5b, 0x7d, 0x7a, 0x3a, 0x65, - 0x56, 0xc3, 0x7c, 0x60, 0xe6, 0xf9, 0x7e, 0xd3, 0xf7, 0xda, 0x8b, 0xf3, 0xb8, 0x17, 0x3e, 0x9b, - 0x76, 0x84, 0x47, 0x3c, 0xca, 0x13, 0x6b, 0x3d, 0x3e, 0x2a, 0xbf, 0x90, 0x16, 0xc2, 0x3f, 0xf2, - 0x0d, 0x45, 0x79, 0x06, 0x6b, 0xf6, 0x21, 0x4c, 0x89, 0xff, 0x63, 0x2d, 0xc1, 0x82, 0x61, 0xcc, - 0xa7, 0x61, 0x52, 0x3d, 0x38, 0x46, 0x98, 0xd0, 0x27, 0x43, 0x81, 0x60, 0xb0, 0x62, 0x6f, 0x03, - 0x08, 0x39, 0x86, 0xb6, 0xe3, 0x53, 0x49, 0xd0, 0x51, 0x14, 0x83, 0x7a, 0x37, 0xe2, 0x04, 0x99, - 0xbd, 0x0b, 0x93, 0xe2, 0x57, 0xad, 0xdb, 0xf0, 0xc5, 0xda, 0x38, 0x8d, 0xb4, 0xd2, 0x9f, 0x50, - 0xd0, 0x86, 0x12, 0x6e, 0xf8, 0x13, 0x26, 0xe8, 0xec, 0x06, 0xcc, 0x62, 0x70, 0xd8, 0x2a, 0x26, - 0x91, 0x8e, 0x3c, 0x1e, 0x2e, 0x9e, 0xd1, 0x9e, 0xb0, 0x45, 0x91, 0xe3, 0xc5, 0x65, 0xfa, 0xe5, - 0x22, 0x45, 0xc6, 0x42, 0x98, 0x4f, 0x76, 0x97, 0xe4, 0x41, 0x7c, 0x11, 0x3b, 0x49, 0x89, 0xd4, - 0xbd, 0x18, 0x72, 0x3f, 0x16, 0x23, 0xa2, 0x6d, 0x5c, 0xea, 0x39, 0x41, 0xaf, 0x30, 0x8b, 0x3b, - 0xb3, 0x81, 0x5d, 0x5f, 0xdd, 0x4a, 0x47, 0x4f, 0x3d, 0x8b, 0x2d, 0xc0, 0x61, 0xde, 0xab, 0x27, - 0x09, 0x6c, 0x33, 0x22, 0xa8, 0x66, 0x50, 0xb3, 0x6f, 0xc2, 0x29, 0xb5, 0x83, 0x50, 0x11, 0xcd, - 0xeb, 0xa5, 0x13, 0xee, 0xc4, 0x8d, 0x9d, 0xb8, 0xea, 0x9e, 0x29, 0x9d, 0x5d, 0x05, 0x73, 0x61, - 0x12, 0x87, 0x95, 0x6a, 0x7c, 0x76, 0x50, 0x8d, 0x17, 0x7a, 0x6a, 0x3c, 0x8d, 0x13, 0xa5, 0xb7, - 0x32, 0x9d, 0x27, 0x5b, 0x81, 0x69, 0x5a, 0x47, 0x34, 0xdb, 0x9e, 0xc3, 0xde, 0x42, 0xad, 0x92, - 0x5a, 0x81, 0x3d, 0x13, 0xce, 0x24, 0xd1, 0x77, 0x64, 0xf9, 0x8c, 0xf0, 0xbc, 0xb1, 0x23, 0xa7, - 0x5f, 0x0f, 0x4c, 0x64, 0xb1, 0x23, 0x25, 0x52, 0xcc, 0xfa, 0xa3, 0x4e, 0x40, 0x3a, 0xa3, 0x17, - 0x92, 0xa4, 0x22, 0x9a, 0xf0, 0xe3, 0xf0, 0x18, 0x43, 0xdf, 0x12, 0xb2, 0x38, 0xb0, 0xbb, 0x30, - 0x1f, 0x9f, 0xda, 0x1a, 0xe3, 0x72, 0x92, 0x9c, 0x25, 0x39, 0xea, 0xb3, 0xf9, 0x66, 0xd1, 0x33, - 0x17, 0xce, 0x18, 0xe7, 0xb4, 0xc6, 0xfa, 0x1c, 0xb2, 0xc6, 0x84, 0xc9, 0xe6, 0x21, 0x9f, 0xcd, - 0xbe, 0x1f, 0x1f, 0xf6, 0x11, 0x2c, 0xa5, 0xcf, 0x66, 0xad, 0x96, 0x17, 0xb1, 0x96, 0xd7, 0x1f, - 0x1f, 0x95, 0xcf, 0xf7, 0x1c, 0xef, 0xd9, 0x15, 0x0d, 0xe0, 0xc6, 0xbe, 0x06, 0x8b, 0xe6, 0xf9, - 0xac, 0xd5, 0x64, 0x61, 0x4d, 0xb8, 0x74, 0xe2, 0x83, 0x3d, 0xbb, 0x86, 0xbe, 0x3c, 0x58, 0x04, - 0xe5, 0xcc, 0xd9, 0xad, 0x55, 0xf3, 0x52, 0xd2, 0xa0, 0x9e, 0x55, 0x92, 0x5d, 0xdd, 0x71, 0x2c, - 0xd9, 0x01, 0xbc, 0x90, 0x75, 0x4c, 0x68, 0x95, 0xbe, 0x1c, 0x6b, 0x65, 0x3f, 0x95, 0x7d, 0xe4, - 0x64, 0xd7, 0x7c, 0x0c, 0x5b, 0xf6, 0x65, 0x38, 0xa5, 0xad, 0x2f, 0xad, 0xbe, 0x57, 0xb0, 0x3e, - 0xf4, 0xdf, 0xd5, 0x17, 0x66, 0x76, 0x2d, 0xd9, 0x3c, 0x58, 0x0b, 0xe6, 0x55, 0xc3, 0x51, 0xfd, - 0x4d, 0x47, 0xcf, 0x79, 0x63, 0x57, 0xed, 0xc5, 0xd0, 0x52, 0xde, 0xef, 0x38, 0x9d, 0x84, 0x50, - 0x9f, 0xe9, 0x19, 0x7c, 0xd9, 0x0d, 0x18, 0xab, 0x6d, 0x55, 0xaf, 0x5d, 0x5b, 0x5f, 0x7c, 0x15, - 0x6b, 0x50, 0xce, 0x3e, 0x12, 0x68, 0x5c, 0x9a, 0xc8, 0xc6, 0xac, 0xe3, 0xed, 0xee, 0x1a, 0x3e, - 0x55, 0x12, 0xf5, 0xe6, 0x48, 0xf1, 0x42, 0xe9, 0xb5, 0x9b, 0x23, 0xc5, 0xd7, 0x4a, 0xaf, 0xdb, - 0xcf, 0x65, 0x27, 0x09, 0x97, 0x8d, 0xb5, 0xcf, 0x0f, 0x2a, 0x4d, 0xba, 0xc2, 0xfa, 0x99, 0x1c, - 0xcc, 0x67, 0x7c, 0x07, 0x3b, 0x0f, 0x23, 0x98, 0xed, 0x44, 0x7b, 0x55, 0x4f, 0x65, 0x39, 0xc1, - 0x72, 0xf6, 0x69, 0x18, 0x5f, 0xbb, 0x53, 0xab, 0x55, 0xee, 0xa8, 0x2b, 0x9b, 0xdc, 0xae, 0xda, - 0xa1, 0x13, 0xba, 0xe6, 0x63, 0x1c, 0xa1, 0xb1, 0x37, 0x61, 0xac, 0xba, 0x85, 0x04, 0xd2, 0xac, - 0x0b, 0xaf, 0x30, 0x5e, 0x27, 0x8d, 0x4f, 0x48, 0xd6, 0x8f, 0xe6, 0x80, 0xf5, 0x76, 0x2a, 0xbb, - 0x0c, 0x93, 0xfa, 0xd0, 0xc9, 0x0b, 0x26, 0x3e, 0x1c, 0x69, 0x03, 0x63, 0xeb, 0x38, 0x6c, 0x0d, - 0x46, 0x31, 0x1f, 0x5c, 0xfc, 0x0a, 0x98, 0x79, 0x00, 0x9c, 0xe9, 0x39, 0x00, 0x46, 0x31, 0xdb, - 0x9c, 0x2d, 0x89, 0xad, 0xdf, 0xcc, 0x01, 0xeb, 0x3d, 0x34, 0x87, 0xb6, 0x42, 0x78, 0x4b, 0x73, - 0xcb, 0xd5, 0xf3, 0x19, 0xc4, 0xc9, 0x68, 0xf4, 0xcb, 0x52, 0xe2, 0xc0, 0x7b, 0xde, 0xb8, 0x9c, - 0xf7, 0xf7, 0xe5, 0x7a, 0x0d, 0x46, 0xef, 0xf1, 0x60, 0x47, 0x59, 0x2c, 0xa2, 0x95, 0xd3, 0x43, - 0x01, 0xd0, 0x2f, 0xab, 0x88, 0x61, 0xfd, 0x51, 0x0e, 0x16, 0xb2, 0x24, 0xb9, 0x63, 0x5c, 0xae, - 0xac, 0x94, 0xb7, 0x18, 0x5a, 0x20, 0x48, 0x13, 0xa8, 0xd8, 0x47, 0xac, 0x0c, 0xa3, 0xa2, 0xb1, - 0x6a, 0x84, 0x51, 0x59, 0x20, 0x7a, 0x23, 0xb4, 0x25, 0x5c, 0x20, 0xc8, 0xf0, 0x53, 0x23, 0x18, - 0xb9, 0x0c, 0x11, 0x50, 0x50, 0xb0, 0x25, 0x5c, 0x20, 0xdc, 0xf6, 0x1b, 0x71, 0x2a, 0x64, 0x44, - 0x68, 0x09, 0x80, 0x2d, 0xe1, 0xec, 0x3c, 0x8c, 0x6f, 0xb6, 0x37, 0xb8, 0xfb, 0x50, 0xc5, 0xd4, - 0x46, 0x8b, 0x09, 0xbf, 0xed, 0x34, 0x05, 0xcc, 0x56, 0x85, 0xd6, 0x4f, 0xe4, 0x60, 0xae, 0x47, - 0x88, 0x3c, 0xde, 0xab, 0x6c, 0xb0, 0x7b, 0xc7, 0x30, 0xed, 0x93, 0x9f, 0x3f, 0x92, 0xfd, 0xf9, - 0xd6, 0xff, 0x3b, 0x02, 0x67, 0xfa, 0xdc, 0xe9, 0x13, 0xf7, 0xb3, 0xdc, 0xb1, 0xee, 0x67, 0x5f, - 0x11, 0x77, 0x68, 0xd7, 0x6b, 0x85, 0xdb, 0x7e, 0xf2, 0xc5, 0x89, 0x15, 0x3b, 0x96, 0xa9, 0x6c, - 0xd0, 0xca, 0xdc, 0xf9, 0xac, 0xcc, 0xc8, 0xef, 0x44, 0x7e, 0xaf, 0x48, 0x61, 0x30, 0xeb, 0x71, - 0x00, 0x2b, 0xfc, 0x39, 0x71, 0x00, 0x33, 0x5d, 0x12, 0x46, 0x9e, 0xa8, 0x4b, 0x42, 0xb6, 0x39, - 0xe3, 0xe8, 0x27, 0x31, 0x6e, 0x5d, 0x85, 0x69, 0x69, 0x32, 0x52, 0x09, 0xe5, 0x20, 0x8d, 0xf5, - 0x98, 0x99, 0xb8, 0x61, 0xef, 0x58, 0x18, 0x34, 0xec, 0x86, 0x69, 0x3e, 0x3f, 0x8e, 0x4f, 0x5d, - 0xe7, 0xfb, 0x9b, 0xc7, 0x1b, 0x4f, 0xdc, 0x3a, 0xa9, 0xf5, 0x13, 0x79, 0xd3, 0x3b, 0xec, 0xcf, - 0xe3, 0xcc, 0x7b, 0x0d, 0x46, 0xef, 0xef, 0xf3, 0x40, 0xed, 0x77, 0xf8, 0x21, 0x07, 0x02, 0xa0, - 0x7f, 0x08, 0x62, 0xb0, 0x6b, 0x30, 0xb3, 0x25, 0x47, 0x42, 0x75, 0xef, 0x48, 0x72, 0xd5, 0xea, - 0x90, 0x42, 0x20, 0xa3, 0x7f, 0x53, 0x54, 0xd6, 0x75, 0x78, 0xde, 0x58, 0x90, 0x14, 0xcd, 0x42, - 0x5a, 0xb1, 0xcb, 0x13, 0x71, 0x26, 0xb1, 0xdb, 0x4f, 0x76, 0x0f, 0x3b, 0x05, 0xb5, 0x76, 0xe1, - 0x85, 0x81, 0x8c, 0xc4, 0x41, 0x04, 0x9d, 0xf8, 0x57, 0xca, 0xd4, 0x6e, 0x20, 0xa9, 0xad, 0xd1, - 0x59, 0xdf, 0x0f, 0x53, 0x7a, 0x2f, 0xe3, 0x9e, 0x2a, 0x7e, 0xd3, 0xa6, 0x26, 0xf7, 0x54, 0x01, - 0xb0, 0x25, 0x3c, 0x51, 0xe1, 0xe6, 0xb3, 0x55, 0xb8, 0xc9, 0xf0, 0x17, 0x8e, 0x1b, 0x7e, 0x51, - 0x39, 0x2e, 0x59, 0xad, 0x72, 0xfc, 0xad, 0x57, 0x8e, 0xe1, 0x2a, 0x6c, 0x09, 0x7f, 0xa2, 0x95, - 0xff, 0x86, 0xca, 0x2a, 0x82, 0x46, 0xf2, 0xea, 0x4e, 0x9c, 0x64, 0x29, 0x9e, 0xcf, 0xba, 0xe9, - 0x26, 0x98, 0xc9, 0x21, 0x99, 0x3f, 0xee, 0x90, 0x3c, 0xc9, 0x44, 0xbc, 0x04, 0xe3, 0x15, 0x7a, - 0x88, 0x1e, 0x49, 0x04, 0x1b, 0xb7, 0xe7, 0xd5, 0x59, 0x61, 0x59, 0xdf, 0xca, 0xc1, 0xa9, 0x4c, - 0x55, 0x99, 0xa8, 0x55, 0xea, 0xe4, 0xb4, 0x75, 0x98, 0x56, 0xc8, 0x49, 0x8c, 0x93, 0xf8, 0x2a, - 0x0f, 0xdf, 0x16, 0xeb, 0x45, 0x98, 0x88, 0x1f, 0x6a, 0xd8, 0x82, 0x1a, 0x3a, 0xb4, 0x4e, 0x52, - 0xfa, 0xfe, 0x1a, 0x80, 0xf8, 0x82, 0x27, 0x6a, 0x4b, 0x67, 0xfd, 0x46, 0x5e, 0x66, 0x9c, 0x7b, - 0x6a, 0xc3, 0x0e, 0x66, 0x1b, 0xc0, 0x89, 0x26, 0xf5, 0x0f, 0x36, 0xc8, 0xd6, 0x61, 0xac, 0x16, - 0xb9, 0x51, 0x57, 0xb9, 0x58, 0xcf, 0xeb, 0x64, 0x58, 0x70, 0x6f, 0x39, 0x71, 0xb2, 0x0d, 0x11, - 0x62, 0x5c, 0x0e, 0x10, 0xa2, 0xd9, 0xd1, 0xfd, 0x4e, 0x0e, 0xa6, 0x74, 0x62, 0xf6, 0x21, 0xcc, - 0xa8, 0x60, 0x6a, 0xd2, 0xf1, 0x9c, 0x5e, 0x95, 0x94, 0x49, 0x86, 0x0a, 0xa6, 0xa6, 0x3b, 0xaa, - 0x1b, 0xf8, 0xfa, 0x56, 0xdd, 0xd1, 0x91, 0x59, 0x03, 0x58, 0x6b, 0xd7, 0x75, 0x0e, 0xb8, 0xfb, - 0x80, 0x87, 0x91, 0x23, 0x9f, 0xce, 0xe9, 0xf1, 0x49, 0xb1, 0xbf, 0x7d, 0xad, 0x22, 0x5f, 0xcd, - 0xc5, 0x48, 0x50, 0x54, 0xbc, 0x1e, 0x1a, 0x5d, 0xa3, 0xde, 0xda, 0x75, 0xef, 0xcb, 0x42, 0x49, - 0x67, 0xfd, 0xf1, 0x98, 0x9c, 0x6e, 0x14, 0x7b, 0x71, 0x07, 0x66, 0x36, 0xab, 0x6b, 0xab, 0x9a, - 0x7e, 0xcd, 0x4c, 0xdd, 0xb1, 0xfe, 0x28, 0xe2, 0x41, 0xdb, 0x6d, 0x12, 0xc2, 0x61, 0x72, 0x04, - 0xf9, 0x5e, 0xa3, 0x9e, 0xad, 0x7b, 0x4b, 0x71, 0x14, 0x75, 0xc8, 0x3b, 0x54, 0x5c, 0x47, 0x7e, - 0xc8, 0x3a, 0x42, 0xb7, 0xd5, 0xec, 0x53, 0x87, 0xc9, 0x91, 0xed, 0x43, 0xe9, 0x3a, 0x8a, 0x4b, - 0x5a, 0x2d, 0x85, 0xc1, 0xb5, 0xbc, 0x44, 0xb5, 0x3c, 0x2b, 0xe5, 0xac, 0xec, 0x7a, 0x7a, 0xb8, - 0x26, 0xfb, 0xc4, 0xc8, 0xb1, 0xfb, 0xc4, 0xdf, 0xc8, 0xc1, 0x98, 0x94, 0xc7, 0x68, 0x1a, 0xf7, - 0x91, 0xf8, 0xee, 0x3f, 0x19, 0x89, 0xaf, 0x84, 0xe7, 0x84, 0x31, 0xa1, 0x65, 0x19, 0x5b, 0x4b, - 0xad, 0x0b, 0x65, 0xfe, 0x89, 0x9a, 0x72, 0x59, 0x72, 0xfc, 0xb2, 0x60, 0xd5, 0xc4, 0xed, 0x79, - 0xfc, 0x58, 0xcf, 0x3a, 0xe5, 0x2a, 0x3e, 0x4e, 0x6e, 0xcf, 0xa6, 0xb3, 0xf3, 0x06, 0x4c, 0x90, - 0x33, 0xf5, 0xca, 0x21, 0xbd, 0x87, 0x95, 0x0c, 0x13, 0x83, 0xc6, 0xca, 0x61, 0x22, 0x6b, 0x92, - 0x3b, 0xb6, 0xb3, 0x73, 0x68, 0x24, 0xf0, 0x53, 0x88, 0x6c, 0x53, 0x26, 0xb6, 0x92, 0xd1, 0x29, - 0xcd, 0x70, 0xd4, 0x31, 0x9c, 0xc2, 0xb4, 0x28, 0x8f, 0xcc, 0x8c, 0x60, 0x94, 0x09, 0x0f, 0xb6, - 0x01, 0x25, 0x34, 0x4b, 0xe1, 0x0d, 0xb9, 0x6a, 0xaa, 0x6b, 0xd2, 0x61, 0x97, 0x4c, 0x0b, 0x23, - 0x59, 0x46, 0xcb, 0x2d, 0xe5, 0x2b, 0xd3, 0x43, 0x29, 0xee, 0x87, 0xa5, 0xf4, 0xec, 0x63, 0xef, - 0xc2, 0x64, 0x1c, 0x1d, 0x34, 0xf6, 0xd6, 0x43, 0xbd, 0x78, 0x12, 0x4e, 0xd4, 0x4c, 0x87, 0xa4, - 0xa1, 0xb3, 0x65, 0x28, 0x8a, 0x45, 0x9c, 0x4e, 0x1d, 0xd8, 0x25, 0x98, 0x6e, 0x82, 0xaf, 0xf0, - 0x58, 0x0d, 0xe6, 0xc5, 0xa2, 0xa9, 0x79, 0xed, 0xbd, 0x26, 0xdf, 0xf0, 0xf7, 0xfc, 0x6e, 0x74, - 0xd7, 0xde, 0xa0, 0x3d, 0x5c, 0x4a, 0xe4, 0x6e, 0xab, 0x69, 0x14, 0x07, 0x46, 0x62, 0xe8, 0x0c, - 0x6a, 0x6d, 0xab, 0xfc, 0x83, 0x3c, 0x4c, 0x6a, 0xf3, 0x89, 0xbd, 0x06, 0xc5, 0x6a, 0xb8, 0xe1, - 0xd7, 0x1f, 0xc4, 0x71, 0xbc, 0xa6, 0x1f, 0x1f, 0x95, 0x27, 0xbc, 0xd0, 0x69, 0x22, 0xd0, 0x8e, - 0x8b, 0xd9, 0x0a, 0x4c, 0xcb, 0xbf, 0x54, 0xd4, 0xf6, 0x7c, 0x62, 0x49, 0x28, 0x91, 0x55, 0xbc, - 0x76, 0x7d, 0xf7, 0x34, 0x48, 0xd8, 0x57, 0x01, 0x24, 0x00, 0x3d, 0x3f, 0x0b, 0xc3, 0xfb, 0xac, - 0x52, 0x05, 0x19, 0x3e, 0x9f, 0x1a, 0x43, 0xf6, 0x75, 0x19, 0x4d, 0x54, 0xcd, 0xff, 0x91, 0xe1, - 0x9d, 0x6e, 0x05, 0x7f, 0x27, 0xdb, 0xf7, 0x5f, 0x67, 0x49, 0x89, 0x16, 0x96, 0x6c, 0x5e, 0xf7, - 0x1f, 0xf2, 0xe0, 0xb0, 0x12, 0x21, 0xa2, 0x86, 0x61, 0xfd, 0x4f, 0x39, 0x6d, 0xd5, 0xb0, 0x3b, - 0x98, 0xed, 0x52, 0xce, 0x08, 0x32, 0x0d, 0x89, 0xef, 0x0c, 0x0a, 0x6e, 0xf3, 0xdd, 0x95, 0x67, - 0xc9, 0x90, 0x75, 0x3e, 0x9e, 0x57, 0xa9, 0x2c, 0x98, 0x12, 0xc8, 0xbe, 0x00, 0x23, 0xd8, 0x75, - 0xf9, 0x63, 0x9b, 0xa6, 0x8e, 0xed, 0x11, 0xd1, 0x67, 0xd8, 0x10, 0xa4, 0x64, 0x9f, 0x26, 0xaf, - 0x39, 0xd9, 0xf9, 0x33, 0xda, 0xd9, 0x2b, 0xbe, 0x23, 0x3e, 0xaf, 0x93, 0xf0, 0x0f, 0xda, 0xec, - 0xf9, 0x77, 0xf2, 0x50, 0x4a, 0xaf, 0x55, 0xf6, 0x01, 0x4c, 0xa9, 0xf3, 0x14, 0xd3, 0xa1, 0x8b, - 0x56, 0x4e, 0x51, 0xc8, 0x6f, 0x75, 0xa8, 0xa6, 0xb3, 0xa1, 0xeb, 0x04, 0x42, 0xb8, 0xd9, 0xa6, - 0x70, 0x4c, 0xda, 0x2a, 0x89, 0xfc, 0xa8, 0x93, 0x0a, 0x62, 0xa9, 0xd0, 0xd8, 0x5b, 0x50, 0xb8, - 0x7d, 0xad, 0x42, 0x2e, 0x1a, 0xa5, 0xf4, 0xa9, 0x2b, 0x4d, 0xd0, 0x4c, 0x83, 0x38, 0x81, 0xcf, - 0x36, 0xb4, 0x78, 0xaf, 0x63, 0x46, 0x9e, 0x27, 0x05, 0x8e, 0x1b, 0x77, 0x7c, 0xe0, 0x57, 0x99, - 0x67, 0x9d, 0x22, 0x18, 0xfe, 0x37, 0x05, 0x98, 0x88, 0xeb, 0x67, 0x0c, 0x50, 0x76, 0xa3, 0x0b, - 0x13, 0xfe, 0xcd, 0xce, 0x42, 0x51, 0x89, 0x6b, 0xe4, 0xa9, 0x31, 0x1e, 0x92, 0xa8, 0xb6, 0x08, - 0x4a, 0x2e, 0x93, 0xcb, 0xdc, 0x56, 0x3f, 0xd9, 0x65, 0x88, 0x85, 0xae, 0x7e, 0xd2, 0xd9, 0x88, - 0x18, 0x30, 0x3b, 0x46, 0x63, 0x33, 0x90, 0xf7, 0x64, 0x54, 0x9c, 0x09, 0x3b, 0xef, 0x35, 0xd8, - 0x07, 0x50, 0x74, 0x1b, 0x0d, 0xde, 0x70, 0x5c, 0x65, 0x63, 0x31, 0x68, 0xd2, 0x14, 0x05, 0x37, - 0x79, 0x08, 0x20, 0x55, 0x25, 0x62, 0x15, 0x98, 0x68, 0xba, 0xd2, 0x8c, 0xaa, 0x31, 0xc4, 0x89, - 0x92, 0x70, 0x28, 0x0a, 0xb2, 0xbb, 0x21, 0x6f, 0xb0, 0x57, 0x61, 0x44, 0x8c, 0x26, 0x1d, 0x21, - 0x4a, 0x4a, 0x14, 0x83, 0x29, 0x3b, 0xec, 0xc6, 0x33, 0x36, 0x22, 0xb0, 0x97, 0xa1, 0xd0, 0x5d, - 0xde, 0xa5, 0xc3, 0xa1, 0x94, 0xc4, 0x5e, 0x8e, 0xd1, 0x44, 0x31, 0xbb, 0x02, 0xc5, 0x03, 0x33, - 0x6c, 0xef, 0xa9, 0xd4, 0x30, 0xc6, 0xf8, 0x31, 0x22, 0x7b, 0x15, 0x0a, 0x61, 0xe8, 0x93, 0x61, - 0x82, 0x5a, 0x82, 0xb5, 0xda, 0x66, 0x3c, 0x6a, 0x82, 0x7b, 0x18, 0xfa, 0x2b, 0x45, 0x18, 0x93, - 0x27, 0x86, 0xf5, 0x02, 0x40, 0xf2, 0x8d, 0xbd, 0x9e, 0x37, 0xd6, 0x57, 0x61, 0x22, 0xfe, 0x36, - 0xf6, 0x3c, 0xc0, 0x03, 0x7e, 0xe8, 0xec, 0xbb, 0xed, 0x46, 0x53, 0x8a, 0x9b, 0x53, 0xf6, 0xc4, - 0x03, 0x7e, 0x78, 0x03, 0x01, 0xec, 0x0c, 0x8c, 0x77, 0xc4, 0xf0, 0xd3, 0x1c, 0x9f, 0xb2, 0xc7, - 0x3a, 0xdd, 0x1d, 0x31, 0x95, 0x17, 0x61, 0x1c, 0x35, 0x81, 0xb4, 0x22, 0xa7, 0x6d, 0xf5, 0xd3, - 0xfa, 0x93, 0x02, 0xe6, 0xb6, 0xd0, 0x1a, 0xc4, 0x5e, 0x82, 0xe9, 0x7a, 0xc0, 0xf1, 0x70, 0x72, - 0x85, 0xc8, 0x45, 0xf5, 0x4c, 0x25, 0xc0, 0x6a, 0x83, 0x9d, 0x87, 0xd9, 0x4e, 0x77, 0xa7, 0xe9, - 0xd5, 0x45, 0x6d, 0x4e, 0x7d, 0x87, 0x82, 0x71, 0x4f, 0xd9, 0xd3, 0x12, 0x7c, 0x8b, 0x1f, 0xae, - 0xee, 0x60, 0xd8, 0xa7, 0x92, 0x1e, 0xb5, 0x33, 0x8a, 0x53, 0xc7, 0xda, 0xb3, 0x1a, 0x1c, 0x6d, - 0xac, 0x4e, 0xc3, 0x98, 0xeb, 0xee, 0x75, 0x3d, 0x19, 0x9e, 0x65, 0xca, 0xa6, 0x5f, 0xec, 0x53, - 0x30, 0x97, 0x04, 0x92, 0x55, 0xcd, 0x18, 0xc5, 0x66, 0x94, 0xe2, 0x82, 0x55, 0x09, 0x67, 0x6f, - 0x02, 0xd3, 0xeb, 0xf3, 0x77, 0x3e, 0xe2, 0x75, 0x39, 0x27, 0xa7, 0xec, 0x39, 0xad, 0x64, 0x13, - 0x0b, 0xd8, 0x8b, 0x30, 0x15, 0xf0, 0x10, 0xc5, 0x3d, 0xec, 0x36, 0x4c, 0xfd, 0x64, 0x4f, 0x2a, - 0x98, 0xe8, 0xbb, 0x0b, 0x50, 0xd2, 0xba, 0x03, 0x03, 0xa3, 0xca, 0x48, 0xd4, 0xf6, 0x4c, 0x02, - 0xb7, 0x3b, 0xd5, 0x06, 0xfb, 0x12, 0x2c, 0x69, 0x98, 0x32, 0x0b, 0x95, 0xc3, 0x9b, 0xde, 0x9e, - 0xb7, 0xd3, 0xe4, 0x34, 0xdf, 0x7a, 0x67, 0x75, 0x7c, 0x27, 0xb4, 0x17, 0x13, 0x6a, 0x99, 0x9f, - 0x6a, 0x9d, 0x68, 0xd9, 0x06, 0x2c, 0xa4, 0x38, 0xf3, 0x86, 0xd3, 0xed, 0xf4, 0x8d, 0x87, 0x94, - 0xf0, 0x64, 0x26, 0x4f, 0xde, 0xb8, 0xdb, 0xb1, 0xbe, 0x04, 0x53, 0xfa, 0x9c, 0x14, 0x9d, 0xa0, - 0x0b, 0x1a, 0x34, 0xfb, 0x26, 0x63, 0x58, 0x55, 0x5c, 0xf4, 0x66, 0x12, 0x94, 0x28, 0xce, 0x92, - 0x6b, 0x4f, 0xc7, 0x50, 0x4c, 0x9f, 0xbf, 0x02, 0x73, 0x3d, 0x9b, 0x9c, 0x96, 0xf0, 0x5c, 0x6e, - 0xda, 0x83, 0x13, 0x9e, 0x5b, 0x6d, 0x98, 0xd2, 0x0f, 0xad, 0x63, 0x42, 0xc2, 0x9f, 0xc6, 0x00, - 0x07, 0x72, 0x47, 0x1f, 0x7b, 0x7c, 0x54, 0xce, 0x7b, 0x0d, 0x0c, 0x6b, 0x70, 0x01, 0x8a, 0x4a, - 0xbe, 0x22, 0xb1, 0x06, 0x75, 0xd9, 0x24, 0xd8, 0x1f, 0xda, 0x71, 0xa9, 0xf5, 0x2a, 0x8c, 0xd3, - 0xb9, 0x34, 0x58, 0x83, 0x6d, 0xfd, 0x50, 0x1e, 0x66, 0x6d, 0x2e, 0x76, 0x4d, 0x2e, 0xf3, 0x40, - 0x3c, 0xb5, 0x17, 0xea, 0xec, 0x30, 0x79, 0x46, 0xdb, 0x06, 0x64, 0x60, 0xf8, 0x87, 0x39, 0x98, - 0xcf, 0xc0, 0xfd, 0x58, 0x19, 0x08, 0xaf, 0xc2, 0xc4, 0x9a, 0xe7, 0x36, 0x2b, 0x8d, 0x46, 0x1c, - 0xed, 0x00, 0xa5, 0x72, 0x4c, 0x53, 0xe2, 0x0a, 0xa8, 0x2e, 0xa1, 0xc4, 0xa8, 0xec, 0x75, 0x9a, - 0x14, 0x49, 0x12, 0x56, 0x9c, 0x14, 0xdf, 0x39, 0x2a, 0x83, 0xfc, 0xa6, 0x24, 0x33, 0x33, 0x86, - 0xae, 0x94, 0xc0, 0xc4, 0x1b, 0xe1, 0xa9, 0x1d, 0xba, 0xec, 0xd0, 0x95, 0xe9, 0xe6, 0x0d, 0x95, - 0x84, 0xe1, 0x6f, 0xe5, 0xe1, 0x74, 0x36, 0xe1, 0xc7, 0x4d, 0x26, 0x89, 0xe9, 0x2f, 0xb4, 0x70, - 0xbb, 0x98, 0x4c, 0x52, 0xe6, 0xca, 0x40, 0xfc, 0x04, 0x81, 0xed, 0xc2, 0xf4, 0x86, 0x1b, 0x46, - 0x37, 0xb8, 0x1b, 0x44, 0x3b, 0xdc, 0x8d, 0x86, 0x10, 0xd3, 0x5f, 0x56, 0x0f, 0xc5, 0x28, 0x29, - 0xec, 0x2b, 0xca, 0x94, 0x20, 0x6d, 0xb2, 0x8d, 0x27, 0xca, 0xc8, 0x10, 0x13, 0xe5, 0x1b, 0x30, - 0x5b, 0xe3, 0x2d, 0xb7, 0xb3, 0xef, 0x07, 0xca, 0x9d, 0xf5, 0x22, 0x4c, 0xc7, 0xa0, 0xcc, 0xd9, - 0x62, 0x16, 0x1b, 0xf8, 0x5a, 0x47, 0x24, 0x5b, 0x89, 0x59, 0x6c, 0xfd, 0xdd, 0x3c, 0x9c, 0xa9, - 0xd4, 0xc9, 0x7e, 0x8b, 0x0a, 0x94, 0x99, 0xe9, 0x77, 0xb9, 0x6e, 0x76, 0x09, 0x26, 0x6e, 0xbb, - 0x8f, 0x36, 0xb8, 0x1b, 0xf2, 0x90, 0x52, 0x79, 0x49, 0x99, 0xd6, 0x7d, 0x94, 0x98, 0x35, 0xd9, - 0x09, 0x8e, 0x7e, 0xe9, 0x1f, 0xf9, 0x84, 0x97, 0x7e, 0x0b, 0xc6, 0x6e, 0xf8, 0xcd, 0x06, 0x1d, - 0xe4, 0xf4, 0xe0, 0xb9, 0x8f, 0x10, 0x9b, 0x4a, 0xc4, 0x5d, 0x79, 0x26, 0xfe, 0x62, 0xfc, 0x84, - 0xef, 0x7a, 0x97, 0x9c, 0x87, 0x71, 0xac, 0x28, 0x4e, 0x86, 0x8c, 0x87, 0x46, 0x93, 0x63, 0x42, - 0xa6, 0x86, 0xad, 0x0a, 0xf5, 0x9e, 0x18, 0xfd, 0x64, 0x3d, 0x61, 0xfd, 0x03, 0x7c, 0x4b, 0xd5, - 0x5b, 0x29, 0x4e, 0x22, 0xed, 0x43, 0x72, 0x43, 0x7e, 0x48, 0xfe, 0x89, 0x0d, 0x49, 0xa1, 0xef, - 0x90, 0xfc, 0x70, 0x1e, 0x26, 0xe3, 0x8f, 0xfd, 0x1e, 0x8b, 0xf9, 0x1c, 0xb7, 0x6b, 0xa8, 0x10, - 0x14, 0x35, 0x6d, 0xaf, 0xa0, 0x48, 0x0f, 0x5f, 0x80, 0x31, 0x5a, 0x4c, 0xb9, 0x94, 0xb9, 0x65, - 0x6a, 0x74, 0x57, 0x66, 0x88, 0xf5, 0x18, 0x0e, 0x68, 0x68, 0x13, 0x1d, 0xc6, 0xf8, 0xb8, 0xcf, - 0x77, 0xe8, 0x69, 0xfd, 0xa9, 0x3d, 0xa3, 0xb2, 0x63, 0x7c, 0x24, 0x0d, 0x1b, 0xea, 0x74, 0xfa, - 0x67, 0x45, 0x28, 0xa5, 0x49, 0x8e, 0x8f, 0xaa, 0xbd, 0xd5, 0xdd, 0x91, 0xf7, 0x10, 0x19, 0x55, - 0xbb, 0xd3, 0xdd, 0xb1, 0x05, 0x0c, 0x2d, 0x6f, 0x02, 0xef, 0x21, 0xb6, 0x7a, 0x8a, 0x2c, 0x6f, - 0x02, 0xef, 0xa1, 0x61, 0x79, 0x13, 0x78, 0x0f, 0x51, 0x4b, 0xb0, 0x51, 0x43, 0xb7, 0x64, 0xbc, - 0x84, 0x90, 0x96, 0xa0, 0x19, 0xa6, 0x33, 0xe4, 0x28, 0x34, 0x71, 0x54, 0xae, 0x70, 0x37, 0xa0, - 0x08, 0xd0, 0xb4, 0x9d, 0xe1, 0x51, 0xb9, 0x83, 0x60, 0x99, 0xd0, 0xda, 0xd6, 0x91, 0x58, 0x13, - 0x98, 0xf6, 0x53, 0x2d, 0xe0, 0xe3, 0x2f, 0xce, 0xca, 0x54, 0x6a, 0x41, 0x67, 0xed, 0xe8, 0xab, - 0x39, 0x83, 0xef, 0x93, 0xd4, 0xd5, 0x6e, 0x51, 0x58, 0x3b, 0xd4, 0x0e, 0x15, 0x8f, 0x65, 0xa6, - 0xfc, 0xf6, 0x41, 0x86, 0xbd, 0x8b, 0x75, 0x44, 0x09, 0x13, 0xf6, 0x3e, 0x4c, 0xea, 0xce, 0xe6, - 0xd2, 0x25, 0xfa, 0x39, 0x19, 0xa9, 0xac, 0x4f, 0x4e, 0x45, 0x9d, 0x80, 0xed, 0xc0, 0x99, 0x55, - 0xbf, 0x1d, 0x76, 0x5b, 0x2a, 0x26, 0x5a, 0x12, 0x89, 0x15, 0x70, 0x28, 0xd0, 0x73, 0xb5, 0x4e, - 0x28, 0xe4, 0xdb, 0xac, 0x6c, 0xd9, 0xcd, 0x0b, 0x48, 0x3f, 0x46, 0x6c, 0x1b, 0x26, 0x51, 0xdf, - 0x49, 0xc6, 0x72, 0x93, 0xe6, 0xb6, 0x91, 0x94, 0xac, 0x89, 0x85, 0x21, 0x83, 0xfa, 0xb8, 0xad, - 0xa6, 0x32, 0xa5, 0xd6, 0xf5, 0xb6, 0x1a, 0x32, 0xfb, 0x2a, 0xcc, 0xc8, 0xfb, 0xd7, 0x7d, 0xbe, - 0x23, 0xe7, 0xce, 0x94, 0xa1, 0x66, 0x30, 0x0b, 0xe5, 0xd3, 0x3b, 0x69, 0x99, 0x0f, 0xf8, 0x8e, - 0x1c, 0x7b, 0xc3, 0x91, 0xc1, 0xc0, 0x67, 0x77, 0x61, 0xfe, 0x86, 0x1b, 0x4a, 0xa0, 0xe6, 0x35, - 0x3c, 0x8d, 0xea, 0x57, 0x34, 0x30, 0xdd, 0x77, 0x43, 0xa5, 0xb6, 0xce, 0xf4, 0x12, 0xce, 0xa2, - 0x67, 0x3f, 0x94, 0x83, 0x45, 0x43, 0xab, 0x4d, 0x66, 0x4e, 0x2d, 0xde, 0x8e, 0xd0, 0x63, 0x61, - 0x26, 0x4e, 0xa5, 0xdd, 0x0f, 0x4d, 0x0e, 0x49, 0x4a, 0x71, 0x1e, 0x24, 0xe5, 0xba, 0xe5, 0x66, - 0x3f, 0x1e, 0xb4, 0x50, 0x71, 0x4d, 0xcf, 0x9a, 0x0b, 0x35, 0xb5, 0xae, 0x15, 0x9a, 0x75, 0x35, - 0xdd, 0xdf, 0xa4, 0xc5, 0xca, 0xc5, 0x5a, 0xac, 0x05, 0x18, 0xc5, 0x5e, 0x55, 0x41, 0x4e, 0xf0, - 0x87, 0xf5, 0x69, 0x7d, 0x1f, 0x22, 0xb1, 0x70, 0xe0, 0x3e, 0x64, 0xfd, 0x77, 0x63, 0x30, 0x9b, - 0x9a, 0x16, 0x74, 0x4f, 0xcd, 0xf5, 0xdc, 0x53, 0x6b, 0x00, 0x52, 0x8f, 0x3b, 0xa4, 0xc2, 0x55, - 0x79, 0x4b, 0x4d, 0x92, 0xf3, 0x61, 0xbc, 0xa6, 0x34, 0x36, 0x82, 0xa9, 0x5c, 0xb1, 0x43, 0x2a, - 0xc0, 0x63, 0xa6, 0x72, 0xd1, 0x6b, 0x4c, 0x13, 0x36, 0xac, 0x0c, 0xa3, 0x18, 0x99, 0x50, 0x77, - 0x56, 0xf3, 0x04, 0xc0, 0x96, 0x70, 0xf6, 0x12, 0x8c, 0x09, 0x21, 0xaa, 0xba, 0x46, 0x9b, 0x20, - 0x9e, 0x2d, 0x42, 0xca, 0x12, 0x12, 0x0b, 0x15, 0xb1, 0xab, 0x30, 0x25, 0xff, 0xa2, 0xe0, 0x14, - 0x63, 0xa6, 0xed, 0x9d, 0xe3, 0x35, 0x54, 0x7c, 0x0a, 0x03, 0x4f, 0xdc, 0x2e, 0x6a, 0x5d, 0xd4, - 0xd9, 0x54, 0xd7, 0x28, 0x94, 0x2d, 0xde, 0x2e, 0x42, 0x09, 0xc4, 0x54, 0xf5, 0x31, 0x82, 0x90, - 0x65, 0xc8, 0x64, 0xbc, 0x88, 0x77, 0x4a, 0x94, 0x65, 0xa4, 0xa9, 0xb8, 0x4d, 0x25, 0xec, 0x35, - 0xf9, 0x6e, 0x82, 0x62, 0xa1, 0xcc, 0x08, 0x86, 0x8f, 0x12, 0xa8, 0x98, 0x40, 0xd9, 0x30, 0x2e, - 0x16, 0x95, 0x8b, 0xbf, 0xd7, 0x5b, 0xae, 0xd7, 0xa4, 0x6d, 0x05, 0x2b, 0x47, 0x5c, 0x2e, 0xa0, - 0x76, 0x82, 0xc0, 0xde, 0x85, 0x19, 0xf1, 0x63, 0xd5, 0x6f, 0xb5, 0xfc, 0x36, 0xb2, 0x9f, 0x4c, - 0xe2, 0x1c, 0x21, 0x49, 0x1d, 0x8b, 0x64, 0x2d, 0x29, 0x5c, 0x71, 0x9e, 0xe0, 0x9b, 0x6c, 0x57, - 0xbe, 0xe8, 0x4c, 0x25, 0xe7, 0x09, 0x92, 0x86, 0x12, 0x6e, 0xeb, 0x48, 0xec, 0x6d, 0x98, 0x16, - 0x3f, 0xaf, 0x7b, 0x0f, 0xb9, 0xac, 0x70, 0x3a, 0x31, 0x46, 0x40, 0xaa, 0x3d, 0x51, 0x22, 0xeb, - 0x33, 0x31, 0xd9, 0x17, 0xe1, 0x14, 0x72, 0xaa, 0xfb, 0x1d, 0xde, 0xa8, 0xec, 0xee, 0x7a, 0x4d, - 0x4f, 0x1a, 0x43, 0xc9, 0x30, 0x0c, 0xa8, 0x60, 0x97, 0x15, 0x23, 0x86, 0xe3, 0x26, 0x28, 0x76, - 0x36, 0x25, 0xbb, 0x0f, 0xa5, 0xd5, 0x6e, 0x18, 0xf9, 0xad, 0x4a, 0x14, 0x05, 0xde, 0x4e, 0x37, - 0xe2, 0xe1, 0xe2, 0xac, 0x11, 0xac, 0x40, 0x2c, 0x8e, 0xb8, 0x50, 0xea, 0x83, 0xea, 0x48, 0xe1, - 0xb8, 0x31, 0x89, 0xdd, 0xc3, 0xc4, 0xfa, 0xbd, 0x1c, 0x4c, 0x1b, 0xa4, 0xec, 0x2d, 0x98, 0xba, - 0x16, 0x78, 0xbc, 0xdd, 0x68, 0x1e, 0x6a, 0x17, 0x55, 0xbc, 0xc5, 0xec, 0x12, 0x5c, 0xb6, 0xda, - 0x40, 0x8b, 0xf5, 0x3c, 0xf9, 0x4c, 0x4b, 0xc5, 0x4b, 0xd2, 0x67, 0x92, 0x26, 0x68, 0x21, 0x89, - 0x9e, 0x82, 0x13, 0x94, 0x66, 0xa7, 0x86, 0xc2, 0xde, 0x83, 0x31, 0xf9, 0x7a, 0x4b, 0x66, 0x73, - 0x67, 0xb3, 0x9a, 0x29, 0xfd, 0x73, 0x71, 0x22, 0xa2, 0x89, 0x4e, 0x68, 0x13, 0x91, 0xf5, 0x93, - 0x39, 0x60, 0xbd, 0xa8, 0xc7, 0xe8, 0xbd, 0x8e, 0x35, 0xfd, 0xf9, 0x42, 0xbc, 0x1a, 0x0b, 0x86, - 0x42, 0x5c, 0xd4, 0x24, 0x0b, 0x64, 0xc7, 0xd3, 0xaa, 0xd3, 0x15, 0x71, 0xb2, 0xd8, 0xfa, 0xeb, - 0x79, 0x80, 0x04, 0x9b, 0x7d, 0x4e, 0x26, 0x80, 0xf9, 0x62, 0xd7, 0x6d, 0x7a, 0xbb, 0x9e, 0x19, - 0x11, 0x11, 0x99, 0x7c, 0x43, 0x95, 0xd8, 0x26, 0x22, 0xfb, 0x00, 0x66, 0x6b, 0x5b, 0x26, 0xad, - 0x96, 0xec, 0x22, 0xec, 0x38, 0x29, 0xf2, 0x34, 0x36, 0x9a, 0xc7, 0xea, 0xa3, 0x21, 0xcd, 0x63, - 0xe5, 0x40, 0x50, 0x89, 0xd8, 0x58, 0x6a, 0x5b, 0x64, 0x91, 0xdd, 0xa8, 0xae, 0xd1, 0x2e, 0x85, - 0x5f, 0x17, 0x76, 0x9c, 0x0e, 0x99, 0x6a, 0x8b, 0x7d, 0xc2, 0xc0, 0x4b, 0x3a, 0x72, 0xb4, 0x8f, - 0x0f, 0xee, 0x4f, 0xa1, 0xda, 0xaf, 0xe5, 0x47, 0x9c, 0xb4, 0x1d, 0x4f, 0xed, 0xbd, 0x27, 0x79, - 0xfa, 0x1f, 0x35, 0x5c, 0x0b, 0x8d, 0xd6, 0x91, 0x79, 0xcb, 0x95, 0xe4, 0x92, 0x22, 0x8d, 0x00, - 0x32, 0x2c, 0x62, 0xfe, 0x7e, 0x0e, 0x4e, 0x65, 0xd2, 0xb2, 0x8b, 0x00, 0x89, 0x4e, 0x89, 0x7a, - 0x09, 0x77, 0xcc, 0x24, 0x66, 0x88, 0xad, 0x61, 0xb0, 0xaf, 0xa4, 0xb5, 0x41, 0xc7, 0x1f, 0x84, - 0x4b, 0x2a, 0x26, 0x94, 0xa9, 0x0d, 0xca, 0xd0, 0x01, 0x59, 0xff, 0xb0, 0x00, 0x73, 0x5a, 0x48, - 0x12, 0xf9, 0xad, 0xc7, 0x98, 0x2b, 0x3f, 0x80, 0x29, 0xd1, 0x1a, 0xaf, 0x4e, 0xfe, 0x4d, 0xd2, - 0x4c, 0xe5, 0xf5, 0x1e, 0xe7, 0x30, 0xe2, 0x76, 0x51, 0x47, 0x96, 0x91, 0xda, 0x70, 0xeb, 0xc4, - 0xd7, 0x86, 0x7a, 0xaf, 0x9f, 0x93, 0xc1, 0x9c, 0x85, 0x30, 0xbd, 0x76, 0xd8, 0x76, 0x5b, 0x71, - 0x6d, 0xd2, 0x5c, 0xe5, 0x53, 0x7d, 0x6b, 0x33, 0xb0, 0x65, 0x75, 0x89, 0x1b, 0x85, 0x2c, 0xcb, - 0xf0, 0xe0, 0x35, 0xa8, 0x96, 0x3e, 0x80, 0xb9, 0x9e, 0x8f, 0x3e, 0x51, 0xd0, 0xb8, 0xfb, 0xc0, - 0x7a, 0xbf, 0x23, 0x83, 0xc3, 0xa7, 0xcc, 0x90, 0x84, 0xa7, 0xe2, 0x97, 0x69, 0x4c, 0x91, 0x2d, - 0x8d, 0x5f, 0x96, 0xf5, 0x90, 0x72, 0x3f, 0x95, 0xd7, 0x1d, 0xf4, 0x9e, 0xf6, 0x55, 0xf7, 0x05, - 0xe3, 0x36, 0xfc, 0x42, 0xbf, 0x31, 0x1d, 0x4a, 0xeb, 0xf0, 0xed, 0x02, 0x9c, 0xe9, 0x43, 0xc9, - 0x0e, 0xd3, 0x93, 0x48, 0x6a, 0x21, 0x2e, 0x0f, 0xae, 0xf0, 0x49, 0x4c, 0x25, 0xf6, 0x39, 0xe9, - 0xa2, 0x5f, 0xc7, 0x34, 0xcc, 0x74, 0xff, 0x46, 0x35, 0xfe, 0x83, 0x18, 0x9a, 0xf6, 0xcd, 0x97, - 0x50, 0xf6, 0x01, 0x8c, 0xa2, 0x77, 0x66, 0x2a, 0x24, 0x9a, 0xc0, 0x40, 0xb8, 0x16, 0x3f, 0x4e, - 0xfc, 0x34, 0xe2, 0xc7, 0x09, 0x00, 0xfb, 0x2c, 0x14, 0x2a, 0xf7, 0x6b, 0x34, 0x2e, 0x33, 0x3a, - 0xf9, 0xfd, 0x5a, 0x12, 0xb6, 0xde, 0x35, 0xe2, 0xcb, 0x0b, 0x0a, 0x41, 0x78, 0x7d, 0x75, 0x8b, - 0x46, 0x45, 0x27, 0xbc, 0xbe, 0xba, 0x95, 0x10, 0xee, 0xd5, 0x8d, 0x10, 0x33, 0xd7, 0x57, 0xb7, - 0xbe, 0x7b, 0xd3, 0xfe, 0xdf, 0xca, 0xcb, 0xb8, 0x02, 0xb2, 0x61, 0x1f, 0xc0, 0x94, 0x11, 0x32, - 0x36, 0x97, 0xc8, 0x63, 0x71, 0x64, 0xde, 0x94, 0x7d, 0x8f, 0x41, 0xa0, 0x12, 0x40, 0x88, 0xdf, - 0x28, 0xf1, 0xea, 0x96, 0x34, 0x31, 0x07, 0x94, 0x89, 0xd3, 0x09, 0x20, 0x62, 0x12, 0x76, 0x05, - 0x8a, 0xdb, 0xbc, 0xed, 0xb6, 0xa3, 0x58, 0x21, 0x8a, 0xa6, 0xc0, 0x11, 0xc2, 0x4c, 0xa9, 0x21, - 0x46, 0x44, 0xb3, 0xd5, 0xee, 0x4e, 0x58, 0x0f, 0x3c, 0x8c, 0x3f, 0x12, 0x9f, 0xc5, 0xd2, 0x6c, - 0x55, 0x2b, 0x31, 0x19, 0xa4, 0x88, 0xac, 0x9f, 0xca, 0xc1, 0x38, 0x0d, 0xa4, 0x4c, 0xdc, 0xb3, - 0x97, 0x9c, 0x25, 0x94, 0xb8, 0x67, 0xcf, 0x4b, 0x27, 0xee, 0xd9, 0x93, 0x41, 0x3e, 0x26, 0xc8, - 0x45, 0x36, 0x7e, 0x1a, 0x94, 0xb9, 0xe7, 0x25, 0xd0, 0xac, 0x36, 0x41, 0x1d, 0xd6, 0x1f, 0xc8, - 0xfa, 0x7b, 0xf4, 0x65, 0xd7, 0x57, 0xb7, 0xd8, 0x32, 0x14, 0x37, 0x7c, 0x19, 0x40, 0x46, 0xcf, - 0xc2, 0xd8, 0x24, 0x98, 0xde, 0x41, 0x0a, 0x4f, 0x7c, 0xdf, 0x56, 0xe0, 0xd3, 0x5d, 0x46, 0xfb, - 0xbe, 0x8e, 0x04, 0xa6, 0xbe, 0x2f, 0x46, 0x1d, 0xfa, 0xfb, 0x78, 0xc6, 0x26, 0x71, 0xef, 0x0a, - 0x46, 0xc6, 0xbf, 0xa9, 0xfb, 0x59, 0x51, 0x91, 0xda, 0x29, 0x96, 0xfa, 0xed, 0x14, 0xf7, 0xae, - 0xd8, 0x19, 0x54, 0xf8, 0xae, 0x96, 0x80, 0x6b, 0x3c, 0x78, 0xf8, 0x14, 0xef, 0xd2, 0xd9, 0xef, - 0x6a, 0xe9, 0xe6, 0x0d, 0xb5, 0x49, 0xff, 0x4e, 0x1e, 0x4e, 0x67, 0x13, 0xea, 0x6d, 0xc9, 0x0d, - 0x68, 0xcb, 0x05, 0x28, 0xde, 0xf0, 0xc3, 0x48, 0x33, 0xe9, 0x43, 0xf5, 0xff, 0x3e, 0xc1, 0xec, - 0xb8, 0x54, 0xdc, 0xb9, 0xc5, 0xdf, 0xf1, 0xf2, 0x44, 0x7e, 0xe8, 0x4d, 0x2f, 0xee, 0xdc, 0xb2, - 0x88, 0x5d, 0x87, 0xa2, 0x4d, 0x7e, 0x3e, 0xa9, 0xae, 0x51, 0xe0, 0x58, 0x9a, 0x62, 0x01, 0x41, - 0x8c, 0xc8, 0xbd, 0x04, 0x63, 0x15, 0x18, 0xa7, 0xd1, 0x4f, 0x3d, 0x1d, 0x67, 0x4c, 0x19, 0x33, - 0x98, 0xb6, 0xa2, 0x13, 0x3b, 0x0a, 0x3e, 0x02, 0x56, 0xd7, 0x94, 0xcb, 0x0e, 0xee, 0x28, 0xf2, - 0x91, 0xd0, 0xb4, 0x9e, 0x8c, 0x11, 0xad, 0x1f, 0xca, 0x03, 0x28, 0xad, 0xcd, 0x53, 0x3b, 0xc3, - 0x3e, 0x6b, 0xcc, 0x30, 0xcd, 0x98, 0x68, 0xf8, 0x44, 0x93, 0x9b, 0x68, 0xab, 0x33, 0x7c, 0x9a, - 0xc9, 0x32, 0x8c, 0x6e, 0x27, 0x0a, 0x2d, 0x72, 0x20, 0x41, 0x75, 0xb4, 0x84, 0x5b, 0x3b, 0xb0, - 0x70, 0x9d, 0x47, 0x89, 0x7a, 0x4b, 0x3d, 0x3d, 0x0e, 0x66, 0xfb, 0x06, 0x4c, 0x10, 0x7e, 0xbc, - 0x7f, 0x49, 0x5d, 0x0c, 0x05, 0xa8, 0x40, 0x5d, 0x8c, 0x42, 0x10, 0xbb, 0xd1, 0x1a, 0x6f, 0xf2, - 0x88, 0x7f, 0x77, 0xab, 0xa9, 0x01, 0x93, 0x4d, 0xc1, 0x96, 0x0d, 0x57, 0xc3, 0xb1, 0xfd, 0x73, - 0x0f, 0x4e, 0xc5, 0xdf, 0xfe, 0x24, 0xf9, 0x5e, 0x12, 0x57, 0x4a, 0x8a, 0x43, 0x9d, 0x70, 0x1c, - 0x60, 0x7b, 0xf2, 0x08, 0x96, 0x14, 0xc1, 0x7d, 0x2f, 0xb6, 0x8a, 0x1c, 0x8a, 0x96, 0xbd, 0x0b, - 0x93, 0x1a, 0x0d, 0xc5, 0x51, 0x46, 0x35, 0xf5, 0x81, 0x17, 0xed, 0x3b, 0xa1, 0x84, 0xeb, 0x6a, - 0x6a, 0x0d, 0xdd, 0xfa, 0x32, 0x3c, 0x1b, 0x3b, 0xf9, 0x64, 0x54, 0x9d, 0x62, 0x9e, 0x3b, 0x19, - 0xf3, 0x3b, 0x49, 0xb3, 0xaa, 0xed, 0xd8, 0x31, 0x57, 0xf1, 0x66, 0x7a, 0xb3, 0xa8, 0x31, 0xcf, - 0xf5, 0xb8, 0xfa, 0x6a, 0x1e, 0xbd, 0xd6, 0x3b, 0xda, 0xc7, 0x66, 0x30, 0x34, 0x88, 0x73, 0x69, - 0xe2, 0x1f, 0xca, 0xc3, 0xec, 0x66, 0x75, 0x6d, 0x35, 0xb6, 0x3e, 0xfa, 0x1e, 0x4b, 0x83, 0x69, - 0xb4, 0xad, 0xff, 0x7e, 0x63, 0xdd, 0x85, 0xf9, 0x54, 0x37, 0xa0, 0xe8, 0xf0, 0xbe, 0x74, 0x0f, - 0x89, 0xc1, 0x4a, 0x6c, 0x38, 0x9d, 0xc5, 0xfe, 0xde, 0x15, 0x3b, 0x85, 0x6d, 0xfd, 0x63, 0x48, - 0xf1, 0xa5, 0x2d, 0xec, 0x0d, 0x98, 0xa8, 0x86, 0x61, 0x97, 0x07, 0x77, 0xed, 0x0d, 0x5d, 0x55, - 0xe0, 0x21, 0xd0, 0xe9, 0x06, 0x4d, 0x3b, 0x41, 0x60, 0xaf, 0x41, 0x91, 0x42, 0x0b, 0xab, 0x3d, - 0x01, 0xb5, 0xb6, 0x71, 0x64, 0x62, 0x3b, 0x2e, 0x66, 0x6f, 0xc1, 0x94, 0xfc, 0x5b, 0xce, 0x36, - 0xea, 0x70, 0x54, 0x0e, 0x12, 0xba, 0x9c, 0x9d, 0xb6, 0x81, 0xc6, 0x5e, 0x87, 0x42, 0x65, 0xd5, - 0x26, 0x75, 0x10, 0xc9, 0x8d, 0x98, 0xdc, 0xba, 0xcb, 0xcd, 0x4b, 0xc4, 0xaa, 0x2d, 0xa4, 0x3f, - 0x15, 0x04, 0x80, 0x34, 0xd9, 0x32, 0x07, 0x37, 0xc1, 0x52, 0x87, 0x19, 0xc2, 0xd8, 0x25, 0x18, - 0x5f, 0xf3, 0xc2, 0x4e, 0xd3, 0x3d, 0x24, 0x3d, 0xb6, 0xcc, 0xf1, 0x24, 0x41, 0x86, 0x6f, 0xbf, - 0x04, 0xb1, 0xd7, 0x54, 0xee, 0x9b, 0x62, 0xe2, 0x65, 0xd2, 0x27, 0xc1, 0xcd, 0x1b, 0x30, 0x46, - 0x01, 0x78, 0x27, 0xb4, 0xd0, 0xfa, 0xe9, 0xc0, 0xbb, 0x84, 0xd3, 0xeb, 0x6e, 0x0a, 0x4f, 0xd2, - 0xdd, 0x74, 0x07, 0xce, 0x5c, 0x47, 0xed, 0x8d, 0x19, 0xb5, 0xe6, 0xae, 0x5d, 0x25, 0x7d, 0x38, - 0x3e, 0x03, 0x49, 0x05, 0x4f, 0x3a, 0xf0, 0x8d, 0xd3, 0x0d, 0xf4, 0x94, 0x85, 0xfd, 0x18, 0xb1, - 0x2f, 0xc1, 0x42, 0x56, 0x11, 0x69, 0xcd, 0x31, 0x3e, 0x4b, 0x76, 0x05, 0x7a, 0x7c, 0x96, 0x2c, - 0x0e, 0x6c, 0x03, 0x4a, 0x12, 0x5e, 0x69, 0xb4, 0xbc, 0xb6, 0xd4, 0xfc, 0x4b, 0xad, 0x3a, 0xba, - 0x7d, 0x10, 0x57, 0x57, 0x14, 0xca, 0x17, 0x00, 0xc3, 0x51, 0x28, 0x45, 0xc9, 0xfe, 0x76, 0x4e, - 0xdc, 0xe6, 0x64, 0xb8, 0xda, 0xbb, 0xf6, 0x46, 0x48, 0xb1, 0xbd, 0x4e, 0x27, 0x3e, 0x40, 0xb5, - 0x28, 0xf0, 0xda, 0x7b, 0xe4, 0x04, 0xb4, 0x4d, 0x4e, 0x40, 0xef, 0x7e, 0x2c, 0x27, 0x20, 0xc9, - 0x2a, 0x7c, 0x7c, 0x54, 0x9e, 0x0a, 0xa8, 0x4e, 0x5c, 0x45, 0xc6, 0x17, 0x60, 0xba, 0xfd, 0x66, - 0xd3, 0x3f, 0xb8, 0xdb, 0x96, 0xc1, 0x32, 0x79, 0x43, 0x36, 0x72, 0x16, 0x77, 0x70, 0x99, 0x6e, - 0x5f, 0x94, 0x3b, 0xdd, 0x18, 0xa1, 0xa7, 0xa1, 0x99, 0x1c, 0xc4, 0xc5, 0x53, 0x39, 0x9a, 0x48, - 0xdf, 0xd9, 0x52, 0x72, 0xf1, 0x54, 0x5e, 0x29, 0x0e, 0x4e, 0x23, 0x7d, 0xf2, 0x18, 0x24, 0xec, - 0x12, 0x8c, 0xdd, 0x76, 0x1f, 0x55, 0xf6, 0x38, 0xe5, 0x34, 0x9b, 0x56, 0xdb, 0x1f, 0x02, 0x57, - 0x8a, 0xbf, 0x2b, 0x1d, 0x19, 0x9e, 0xb1, 0x09, 0x8d, 0xfd, 0x40, 0x0e, 0x4e, 0xcb, 0x65, 0xac, - 0x5a, 0x59, 0xe3, 0x51, 0x24, 0xfa, 0x81, 0x82, 0x7c, 0x9d, 0x4b, 0xac, 0xb1, 0xb3, 0xf1, 0x64, - 0x72, 0x78, 0xda, 0x19, 0xe2, 0x8e, 0x0b, 0xa9, 0xd4, 0x08, 0x5f, 0x9a, 0x49, 0xcf, 0xb6, 0x61, - 0xf2, 0xf6, 0xb5, 0x4a, 0x5c, 0xad, 0x8c, 0x69, 0x5c, 0xce, 0xda, 0x1d, 0x35, 0xb4, 0x2c, 0x37, - 0x02, 0x9d, 0x0d, 0x99, 0xfe, 0x7f, 0x56, 0xf5, 0x07, 0x7b, 0x53, 0x77, 0x1c, 0x2d, 0xa0, 0xf4, - 0x3c, 0xde, 0x72, 0x1f, 0x39, 0xee, 0x1e, 0x37, 0x5e, 0xc9, 0x49, 0x7b, 0xfd, 0x13, 0x39, 0x38, - 0xdb, 0xb7, 0xc9, 0xec, 0x2a, 0x9c, 0x71, 0xa5, 0x3b, 0xb4, 0xb3, 0x1f, 0x45, 0x9d, 0xd0, 0x51, - 0x57, 0x0c, 0x72, 0x35, 0xb5, 0x4f, 0x51, 0xf1, 0x0d, 0x51, 0xaa, 0x6e, 0x1d, 0x21, 0xfb, 0x00, - 0x9e, 0xf3, 0xda, 0x21, 0xaf, 0x77, 0x03, 0xee, 0x28, 0x06, 0x75, 0xaf, 0x11, 0x38, 0x81, 0xdb, - 0xde, 0x53, 0x7e, 0xb3, 0xf6, 0x59, 0x85, 0x43, 0x2e, 0xd7, 0xab, 0x5e, 0x23, 0xb0, 0x11, 0xc1, - 0xfa, 0xbd, 0x1c, 0x2c, 0xf6, 0xeb, 0x12, 0xb6, 0x08, 0xe3, 0x5c, 0xcf, 0xfa, 0x6f, 0xab, 0x9f, - 0xec, 0x59, 0x48, 0x76, 0x7a, 0x3a, 0xfd, 0x8b, 0x75, 0x8a, 0x34, 0x8f, 0x76, 0xeb, 0xfa, 0xbe, - 0x4e, 0x76, 0xe6, 0x53, 0x75, 0x7d, 0x77, 0x7f, 0x1e, 0x20, 0xd9, 0xce, 0xa5, 0x62, 0xc2, 0x9e, - 0x70, 0xeb, 0x81, 0x5c, 0x79, 0xec, 0x34, 0x8c, 0xc9, 0xed, 0x92, 0x9c, 0x1b, 0xe8, 0x97, 0x38, - 0xb7, 0xa9, 0x93, 0x71, 0x9f, 0x2f, 0xac, 0x4c, 0x19, 0x9d, 0x3d, 0xd6, 0xc2, 0xc1, 0xb1, 0x7e, - 0x7c, 0x5a, 0x8a, 0x10, 0x95, 0x6e, 0xb4, 0xaf, 0x84, 0x8e, 0xe5, 0x2c, 0xef, 0x2e, 0x69, 0x4b, - 0xa9, 0x19, 0x5d, 0x9b, 0x3e, 0x5d, 0xea, 0xed, 0x27, 0x9f, 0xf9, 0xf6, 0xf3, 0x06, 0x4c, 0xac, - 0xee, 0xf3, 0xfa, 0x83, 0xd8, 0xc3, 0xa6, 0x48, 0xca, 0x75, 0x01, 0x94, 0x81, 0x84, 0x13, 0x04, - 0x76, 0x09, 0x00, 0x9d, 0x4a, 0xa5, 0x44, 0xaa, 0x25, 0x03, 0x40, 0x1f, 0x54, 0x32, 0x4f, 0xd1, - 0x50, 0x90, 0x7d, 0xcd, 0xbe, 0xa6, 0xdb, 0xb3, 0x48, 0xf6, 0x61, 0xb0, 0x4b, 0xe8, 0x09, 0x82, - 0x68, 0x9e, 0xb6, 0xaf, 0xd0, 0x29, 0x58, 0xea, 0xd9, 0x7c, 0x74, 0x24, 0x76, 0x11, 0x26, 0xb6, - 0x94, 0x97, 0x00, 0x1e, 0x82, 0x53, 0x48, 0x01, 0x89, 0x47, 0xc1, 0x62, 0xce, 0x4e, 0x50, 0xd8, - 0x67, 0x61, 0x7c, 0x95, 0x07, 0xd1, 0xf6, 0xf6, 0x06, 0x1a, 0x9d, 0xc8, 0x98, 0xf9, 0x45, 0x8c, - 0x6f, 0x1e, 0x45, 0xcd, 0xef, 0x1c, 0x95, 0xa7, 0x23, 0xaf, 0xc5, 0xe3, 0x58, 0xc0, 0xb6, 0xc2, - 0x66, 0x2b, 0x50, 0x92, 0xcf, 0xe2, 0xc9, 0xdd, 0x03, 0x4f, 0xc6, 0xa2, 0x3c, 0xa7, 0xe9, 0x0d, - 0xfd, 0x80, 0xef, 0xc4, 0xd1, 0xdd, 0x7b, 0xf0, 0xd9, 0xba, 0x4a, 0x8a, 0xa0, 0x37, 0x13, 0x12, - 0x65, 0x58, 0x7a, 0xc7, 0x10, 0xad, 0xed, 0xa5, 0x60, 0x15, 0x98, 0x5e, 0xf5, 0x5b, 0x1d, 0x37, - 0xf2, 0x30, 0xc3, 0xd8, 0x21, 0x1d, 0x82, 0xa8, 0xd0, 0xab, 0xeb, 0x05, 0xc6, 0x89, 0xaa, 0x17, - 0xb0, 0x6b, 0x30, 0x63, 0xfb, 0x5d, 0x31, 0x4c, 0xea, 0x16, 0x2e, 0xcf, 0x39, 0x34, 0x0d, 0x09, - 0x44, 0x89, 0x38, 0x96, 0xe9, 0xca, 0x6d, 0x84, 0x69, 0x34, 0xa8, 0xd8, 0x9d, 0x8c, 0xe7, 0x10, - 0xfd, 0x70, 0xd3, 0x63, 0xbc, 0xf7, 0x30, 0xcb, 0x78, 0x49, 0xb9, 0x02, 0x93, 0xb5, 0xda, 0xe6, - 0x36, 0x0f, 0xa3, 0x6b, 0x4d, 0xff, 0x00, 0xcf, 0xb6, 0x22, 0xe5, 0xbe, 0x09, 0x7d, 0x27, 0xe2, - 0x61, 0xe4, 0xec, 0x36, 0xfd, 0x03, 0x5b, 0xc7, 0x62, 0x5f, 0x13, 0xfd, 0xa1, 0x49, 0x82, 0x14, - 0x90, 0x72, 0x90, 0xb0, 0x8a, 0x27, 0x48, 0xb2, 0x68, 0x84, 0xc8, 0x6a, 0x76, 0x96, 0x86, 0x8e, - 0x0e, 0x63, 0x81, 0xff, 0xe8, 0xb0, 0xd2, 0x68, 0x04, 0x3c, 0x0c, 0xe9, 0x10, 0x92, 0x0e, 0x63, - 0xa8, 0x6c, 0x70, 0x65, 0x81, 0xe1, 0x30, 0xa6, 0x11, 0xb0, 0x1f, 0xc9, 0xc1, 0x29, 0xdd, 0x95, - 0x04, 0x97, 0x0b, 0x9a, 0xb9, 0xc8, 0x23, 0xe9, 0xcd, 0x8b, 0xea, 0x10, 0xbe, 0xa8, 0xa1, 0x5d, - 0x7c, 0x78, 0xf9, 0x62, 0x25, 0xf9, 0x59, 0x53, 0x44, 0x18, 0x5c, 0xab, 0x9c, 0xc9, 0x2f, 0xf9, - 0x82, 0xc5, 0x9c, 0xbd, 0xe0, 0x66, 0x10, 0xb3, 0x55, 0x21, 0xa9, 0x89, 0x19, 0x85, 0x86, 0x53, - 0xd5, 0x2d, 0x3c, 0xd3, 0x48, 0xa3, 0x4a, 0xf3, 0x4f, 0x9a, 0x58, 0x79, 0x1d, 0x53, 0x20, 0xd3, - 0x68, 0x58, 0x15, 0x66, 0x25, 0x40, 0x6c, 0x0b, 0x32, 0x35, 0xca, 0x7c, 0x12, 0x9e, 0x9d, 0xd8, - 0xe0, 0x5b, 0x3f, 0xa6, 0x47, 0xd1, 0x23, 0x28, 0xa6, 0xe8, 0xd8, 0x07, 0x30, 0x13, 0x86, 0xfb, - 0x8e, 0xb6, 0x5e, 0x17, 0x70, 0x15, 0x63, 0x20, 0x48, 0x2a, 0x49, 0xb9, 0xd5, 0x4d, 0x85, 0xe1, - 0x7e, 0xb2, 0xa2, 0x3f, 0x80, 0x19, 0xb4, 0xd5, 0x49, 0x18, 0x9c, 0x4a, 0x18, 0x50, 0x49, 0x9a, - 0x41, 0xd4, 0x0c, 0x13, 0x06, 0x7f, 0x27, 0x07, 0x67, 0x45, 0x45, 0xd9, 0x23, 0x74, 0xfa, 0xe3, - 0x8c, 0x10, 0x86, 0xc6, 0xeb, 0xcb, 0x53, 0x17, 0x47, 0xc3, 0x70, 0x3f, 0x8b, 0x03, 0x7e, 0x94, - 0xf8, 0xf8, 0xec, 0x8f, 0x3a, 0xf3, 0xb1, 0x3f, 0xaa, 0x2f, 0x4f, 0xfd, 0xa3, 0xa2, 0x66, 0x98, - 0xc5, 0x01, 0xaf, 0xb5, 0xb5, 0xca, 0xed, 0x8d, 0xe4, 0x6e, 0xf6, 0xbd, 0xe5, 0xb6, 0x62, 0xb4, - 0x6d, 0x80, 0xdb, 0xca, 0x5d, 0xe9, 0xf3, 0xac, 0x75, 0x83, 0xba, 0xd6, 0x1a, 0xe0, 0xf4, 0xb5, - 0x36, 0x45, 0x63, 0xa7, 0xb0, 0xad, 0x9f, 0x83, 0x14, 0x5f, 0x32, 0x55, 0xb5, 0x60, 0x4c, 0xde, - 0x5a, 0xa9, 0x93, 0xd1, 0x66, 0x41, 0xde, 0x69, 0x6d, 0x2a, 0x61, 0x67, 0xa1, 0x50, 0xab, 0x6d, - 0x52, 0x27, 0xa3, 0xc1, 0x6a, 0x18, 0xfa, 0xb6, 0x80, 0x89, 0x11, 0x42, 0x2b, 0x54, 0x2d, 0x70, - 0xb8, 0x38, 0xef, 0x6c, 0x84, 0x8a, 0xfe, 0x56, 0x77, 0xc8, 0x91, 0xa4, 0xbf, 0xe9, 0x0e, 0x99, - 0xdc, 0x1c, 0x57, 0x61, 0xb1, 0x12, 0x86, 0x3c, 0x10, 0x13, 0x82, 0x8c, 0x1b, 0x03, 0xba, 0xe7, - 0xd0, 0xc1, 0x8e, 0x95, 0xba, 0xf5, 0xd0, 0xee, 0x8b, 0xc8, 0x2e, 0x40, 0xb1, 0xd2, 0x6d, 0x78, - 0xbc, 0x5d, 0x37, 0xa2, 0x82, 0xb9, 0x04, 0xb3, 0xe3, 0x52, 0xf6, 0x45, 0x38, 0x95, 0x8a, 0x8c, - 0x47, 0x3d, 0x30, 0x9e, 0xec, 0xbd, 0xea, 0x1e, 0x96, 0x18, 0x64, 0xc8, 0x2e, 0xc9, 0xa6, 0x64, - 0x15, 0x28, 0xad, 0xa3, 0x9b, 0xd6, 0x1a, 0x97, 0x6f, 0x43, 0x7e, 0x20, 0x9d, 0xef, 0xe4, 0xad, - 0x59, 0xba, 0x70, 0x39, 0x8d, 0xb8, 0xd0, 0xee, 0x41, 0x67, 0xb7, 0x60, 0x3e, 0x0d, 0x13, 0x27, - 0xb8, 0xbc, 0x20, 0xe3, 0x7e, 0xd3, 0xc3, 0x05, 0xcf, 0xf0, 0x2c, 0x2a, 0xb6, 0x03, 0x73, 0x89, - 0x41, 0x92, 0x79, 0x6d, 0x56, 0x76, 0xce, 0x71, 0xb9, 0xba, 0x3a, 0x3f, 0x4b, 0x93, 0x71, 0x3e, - 0x31, 0x6e, 0x8a, 0xaf, 0xcf, 0x76, 0x2f, 0x3b, 0xd6, 0x80, 0x99, 0x9a, 0xb7, 0xd7, 0xf6, 0xda, - 0x7b, 0xb7, 0xf8, 0xe1, 0x96, 0xeb, 0x05, 0x64, 0x71, 0xaa, 0xec, 0xc9, 0x2b, 0xe1, 0x61, 0xab, - 0xc5, 0xa3, 0x00, 0x37, 0x42, 0x51, 0x8e, 0x0e, 0xe6, 0xe2, 0x3a, 0xb4, 0x14, 0x4a, 0x3a, 0xf4, - 0xc9, 0xec, 0xb8, 0x9e, 0x21, 0x04, 0x98, 0x3c, 0x0d, 0xd5, 0xc5, 0xd4, 0x90, 0xaa, 0x8b, 0x26, - 0xcc, 0xad, 0xb7, 0xeb, 0xc1, 0x21, 0x3e, 0xd1, 0xa9, 0x8f, 0x9b, 0x3e, 0xe6, 0xe3, 0x5e, 0xa6, - 0x8f, 0x7b, 0xce, 0x55, 0x33, 0x2c, 0xeb, 0xf3, 0x7a, 0x19, 0xb3, 0x1a, 0xcc, 0xe1, 0xc5, 0xa1, - 0xba, 0xb6, 0x55, 0x6d, 0x7b, 0x91, 0x87, 0x99, 0xfb, 0xa5, 0x70, 0xf1, 0x0a, 0xf1, 0x7c, 0x5e, - 0x5e, 0x51, 0xbd, 0x46, 0xc7, 0xf1, 0x14, 0x8a, 0xce, 0xb4, 0x87, 0x7e, 0xd0, 0x3d, 0x71, 0xf6, - 0xcf, 0xe8, 0x9e, 0x58, 0x85, 0xd9, 0x74, 0xe0, 0x85, 0x52, 0x72, 0x0e, 0x87, 0x58, 0x24, 0x8e, - 0x73, 0xbf, 0x8b, 0xc2, 0xa4, 0x91, 0xdb, 0xce, 0xa4, 0x4b, 0x5f, 0x39, 0xe7, 0x8c, 0x2b, 0xa7, - 0xb1, 0x2b, 0x9d, 0xe0, 0xca, 0xc9, 0xb6, 0x00, 0xae, 0xf9, 0x41, 0x9d, 0x57, 0xd0, 0xf9, 0x99, - 0x19, 0x59, 0x62, 0x04, 0xd3, 0xa4, 0x50, 0xae, 0x9f, 0x5d, 0xf1, 0xdb, 0x49, 0xfb, 0xb0, 0x6b, - 0x3c, 0xac, 0xbf, 0x99, 0x87, 0xc5, 0x7e, 0x9f, 0x33, 0xe0, 0xba, 0xf7, 0x29, 0xe8, 0x5d, 0xe1, - 0x74, 0xed, 0x2b, 0xf1, 0xf4, 0x3a, 0x5f, 0x86, 0xec, 0x85, 0x4c, 0xd7, 0xc0, 0xf9, 0x34, 0xc1, - 0xdd, 0xa0, 0xc9, 0xae, 0xc2, 0xa4, 0xf6, 0xf1, 0xb8, 0x97, 0xf6, 0x6b, 0xaa, 0x0d, 0xbb, 0xf1, - 0xdf, 0xe2, 0x9a, 0x28, 0xf7, 0x2d, 0x75, 0x4d, 0x94, 0xbf, 0x58, 0x49, 0xfa, 0x7f, 0x8f, 0x49, - 0x2b, 0x80, 0x30, 0xf4, 0x19, 0x03, 0xdc, 0xb7, 0xe5, 0x16, 0x68, 0xe3, 0xdf, 0xd6, 0x2f, 0x4f, - 0xc9, 0x13, 0x59, 0xbf, 0x25, 0xf6, 0xb3, 0x0f, 0x4e, 0xdd, 0x1e, 0xf3, 0x27, 0xb9, 0x3d, 0x16, - 0x8e, 0xbf, 0x3d, 0x8e, 0x1c, 0x77, 0x7b, 0x4c, 0x5d, 0xef, 0x46, 0x4f, 0x7c, 0xbd, 0x1b, 0x3b, - 0xd1, 0xf5, 0x6e, 0xfc, 0x44, 0xd7, 0x3b, 0xe3, 0xa6, 0x5a, 0x3c, 0xee, 0xa6, 0xfa, 0x17, 0x97, - 0xc1, 0xa7, 0xf5, 0x32, 0x98, 0x25, 0xe2, 0x9d, 0xe8, 0x32, 0xf8, 0xc3, 0x7d, 0xef, 0x72, 0xa5, - 0x8f, 0x23, 0x94, 0xbf, 0x34, 0xc4, 0x5d, 0x6e, 0xd8, 0x9b, 0xdc, 0xdc, 0x93, 0xb9, 0xc9, 0xb1, - 0x27, 0x76, 0x93, 0x9b, 0xff, 0xa4, 0x37, 0xb9, 0x85, 0x27, 0x79, 0x93, 0x3b, 0xf5, 0xe7, 0xf1, - 0x26, 0x77, 0xfa, 0x5f, 0xcf, 0x4d, 0xee, 0x2f, 0x41, 0x29, 0x2d, 0x5c, 0x1e, 0x1f, 0x74, 0xf7, - 0x89, 0x05, 0x88, 0x14, 0xa2, 0x6f, 0x5a, 0xb8, 0x63, 0x97, 0x00, 0xb6, 0x02, 0xef, 0xa1, 0x1b, - 0xf1, 0x5b, 0xca, 0xfa, 0x8d, 0x02, 0x46, 0x4b, 0xa8, 0x18, 0x79, 0x5b, 0x43, 0x89, 0xef, 0x35, - 0xf9, 0xac, 0x7b, 0x8d, 0xf5, 0x23, 0x79, 0x98, 0x93, 0x51, 0xd6, 0x9e, 0xfe, 0x47, 0xd8, 0xf7, - 0x8d, 0xdb, 0xaa, 0xb2, 0xb5, 0x4e, 0xb5, 0x6e, 0xc0, 0x33, 0xec, 0x57, 0xe1, 0x54, 0x4f, 0x57, - 0xe0, 0x8d, 0x75, 0x4d, 0xc5, 0xb7, 0xeb, 0xb9, 0xb3, 0x2e, 0x66, 0x57, 0x72, 0xef, 0x8a, 0xdd, - 0x43, 0x61, 0xfd, 0xc9, 0x48, 0x0f, 0x7f, 0x7a, 0x90, 0xd5, 0x9f, 0x58, 0x73, 0x27, 0x7b, 0x62, - 0xcd, 0x0f, 0xf7, 0xc4, 0x9a, 0x12, 0x2a, 0x0a, 0xc3, 0x08, 0x15, 0x5f, 0x84, 0xe9, 0x6d, 0xee, - 0xb6, 0xc2, 0x6d, 0x9f, 0xb2, 0xc2, 0x48, 0x5f, 0x0b, 0x15, 0xbe, 0x4e, 0x94, 0xa9, 0x0b, 0x57, - 0x6c, 0x33, 0x1a, 0x09, 0x02, 0x71, 0x0c, 0xca, 0x34, 0x31, 0xb6, 0xc9, 0x41, 0xbf, 0x45, 0x8f, - 0x0e, 0xb8, 0x45, 0xd7, 0x60, 0x8a, 0xe8, 0x92, 0x48, 0xc3, 0xc9, 0x75, 0x4f, 0x14, 0x21, 0x5c, - 0xd5, 0x1e, 0x27, 0x2b, 0x8e, 0x6b, 0x97, 0x37, 0x3d, 0x83, 0x89, 0xe8, 0x82, 0xf5, 0x76, 0xa3, - 0xe3, 0x7b, 0x6d, 0xec, 0x82, 0xf1, 0xa4, 0x0b, 0x38, 0x81, 0x65, 0x17, 0x68, 0x48, 0xec, 0x5d, - 0x98, 0xa9, 0x6c, 0x55, 0x75, 0xb2, 0x62, 0xf2, 0xca, 0xeb, 0x76, 0x3c, 0xc7, 0x20, 0x4d, 0xe1, - 0x0e, 0xba, 0xf9, 0x4c, 0xfc, 0xd9, 0xdc, 0x7c, 0xac, 0x7f, 0x31, 0xa5, 0x96, 0xf7, 0x77, 0xf7, - 0x81, 0xc4, 0x7c, 0xf2, 0x28, 0x9c, 0xf0, 0xc9, 0x63, 0xe4, 0x38, 0x41, 0xd2, 0x90, 0x6f, 0x47, - 0x4f, 0x24, 0xdf, 0x8e, 0x7d, 0xe2, 0xe7, 0x8b, 0xf1, 0x13, 0x4a, 0xac, 0xa9, 0xb5, 0x56, 0x1c, - 0x66, 0xad, 0x65, 0x4a, 0xb9, 0x13, 0x9f, 0x5c, 0xca, 0x85, 0x13, 0x4b, 0xb9, 0xb5, 0xc4, 0x77, - 0x79, 0xf2, 0x58, 0x97, 0x90, 0xe7, 0x49, 0x2b, 0x30, 0x97, 0x1d, 0x62, 0x2f, 0xf6, 0x62, 0xfe, - 0x9e, 0x12, 0x9d, 0xbf, 0x9e, 0x2d, 0x3a, 0x0f, 0x3e, 0x6f, 0x4e, 0x24, 0x3c, 0xff, 0xc8, 0x93, - 0x15, 0x9e, 0x9f, 0xec, 0x43, 0xc8, 0x5f, 0x88, 0xcf, 0x7f, 0x21, 0x3e, 0x0f, 0x29, 0x3e, 0x07, - 0xb8, 0xbc, 0xee, 0xbb, 0x41, 0x1b, 0xd5, 0x4e, 0x97, 0x60, 0x5c, 0xc5, 0x18, 0xcd, 0x25, 0x1a, - 0xe5, 0xde, 0xe0, 0xa2, 0x0a, 0x8b, 0x2d, 0x43, 0x51, 0x11, 0xeb, 0x69, 0x59, 0x0e, 0x08, 0x66, - 0x84, 0x6f, 0x24, 0x98, 0xf5, 0x1f, 0x8e, 0xa8, 0x2d, 0x5c, 0xcc, 0x99, 0x2d, 0x37, 0x70, 0x5b, - 0x98, 0xd7, 0x2a, 0x5e, 0x61, 0x9a, 0xf0, 0x9e, 0x5a, 0x94, 0x29, 0xd3, 0x7e, 0x93, 0xe4, 0x63, - 0x45, 0x7d, 0x4d, 0x52, 0x87, 0x16, 0x86, 0x48, 0x1d, 0xfa, 0xb6, 0x91, 0x77, 0x73, 0x24, 0x49, - 0xf4, 0x26, 0xb6, 0xb5, 0xc1, 0x19, 0x37, 0xaf, 0xea, 0x09, 0x32, 0x47, 0x93, 0xa8, 0x5e, 0x48, - 0x39, 0x20, 0x35, 0x66, 0x7c, 0x1b, 0x19, 0x3b, 0x49, 0x3c, 0xe5, 0xf1, 0x7f, 0xad, 0xf1, 0x94, - 0xd7, 0x01, 0xe8, 0xa8, 0x4d, 0xcc, 0x13, 0x5e, 0xc1, 0xd5, 0x4f, 0x66, 0xca, 0x51, 0xd4, 0xec, - 0x93, 0x41, 0x42, 0x23, 0xb4, 0x7e, 0x9b, 0xc1, 0x5c, 0xad, 0xb6, 0xb9, 0xe6, 0xb9, 0x7b, 0x6d, - 0x3f, 0x8c, 0xbc, 0x7a, 0xb5, 0xbd, 0xeb, 0x0b, 0x51, 0x3c, 0x3e, 0x0e, 0xb4, 0xc0, 0xb9, 0xc9, - 0x51, 0x10, 0x17, 0x8b, 0xab, 0xde, 0x7a, 0x10, 0x28, 0xfd, 0xa8, 0xbc, 0xea, 0x71, 0x01, 0xb0, - 0x25, 0x5c, 0x48, 0xbb, 0xb5, 0xae, 0x4c, 0xfa, 0x2f, 0x6d, 0x46, 0x50, 0xda, 0x0d, 0x25, 0xc8, - 0x56, 0x65, 0x8c, 0xf7, 0x4e, 0x58, 0xba, 0xfd, 0x9c, 0x31, 0xa2, 0x32, 0x27, 0xc5, 0xf2, 0xb0, - 0x23, 0x61, 0x04, 0xb7, 0xcd, 0x0e, 0xc2, 0x75, 0x8b, 0xb8, 0x9e, 0x35, 0x70, 0x08, 0xa7, 0x0c, - 0x9f, 0xe7, 0x61, 0x1f, 0x53, 0x5e, 0x27, 0xe9, 0xda, 0xc2, 0x10, 0x1b, 0x19, 0x2f, 0x2a, 0x7a, - 0xa2, 0xaa, 0xcc, 0x1a, 0xc4, 0x79, 0xf6, 0x7c, 0x66, 0x49, 0xbc, 0xba, 0x27, 0x8d, 0xc8, 0xd8, - 0xda, 0xa6, 0x21, 0x53, 0x72, 0xf5, 0xab, 0xda, 0xc9, 0xd8, 0x0a, 0x06, 0xd7, 0xc4, 0x7e, 0x25, - 0x07, 0x67, 0x0c, 0x8c, 0x78, 0xbb, 0x0a, 0xe3, 0x70, 0x20, 0x99, 0xf3, 0xfa, 0xa3, 0x27, 0x33, - 0xaf, 0x5f, 0x32, 0xdb, 0x92, 0x6c, 0xa8, 0x7a, 0x1b, 0xfa, 0x7d, 0x21, 0x7b, 0x08, 0x73, 0x58, - 0xa4, 0x1e, 0x76, 0xc4, 0x9c, 0xa5, 0xf7, 0xa0, 0x85, 0xe4, 0xb3, 0xa5, 0x1f, 0x3f, 0xa6, 0x55, - 0x5e, 0xfe, 0xf6, 0x51, 0x79, 0xda, 0x40, 0x57, 0xb1, 0xa6, 0x9d, 0xe4, 0x75, 0xc8, 0x6b, 0xef, - 0xfa, 0xba, 0xa0, 0xd4, 0x53, 0x05, 0xfb, 0x27, 0x39, 0xf9, 0x9c, 0x20, 0x9b, 0x71, 0x2d, 0xf0, - 0x5b, 0x71, 0xb9, 0x32, 0xad, 0xec, 0xd3, 0x6d, 0xcd, 0x27, 0xd3, 0x6d, 0xaf, 0xe0, 0x27, 0xcb, - 0x3d, 0xc1, 0xd9, 0x0d, 0xfc, 0x56, 0xf2, 0xf9, 0x7a, 0xc7, 0xf5, 0xfd, 0x48, 0xf6, 0x83, 0x39, - 0x38, 0x6b, 0x68, 0x35, 0xf5, 0xc4, 0x1f, 0x14, 0x2d, 0x61, 0x3e, 0x8e, 0xa3, 0x92, 0x14, 0xad, - 0x5c, 0xa4, 0xf9, 0x7f, 0x1e, 0xbf, 0x40, 0x8b, 0xc9, 0x29, 0x90, 0x9c, 0x96, 0xc4, 0xd2, 0x3e, - 0xa1, 0x7f, 0x2d, 0xcc, 0x83, 0x39, 0xb4, 0xb2, 0x31, 0x4c, 0x80, 0x17, 0xfa, 0x9b, 0x00, 0xc7, - 0xe9, 0x2f, 0x31, 0xdc, 0x7f, 0x7f, 0x3b, 0xe0, 0x5e, 0xae, 0xec, 0x2f, 0xc3, 0xd9, 0x1e, 0x60, - 0xbc, 0xda, 0x4e, 0xf5, 0x5d, 0x6d, 0x9f, 0x7a, 0x7c, 0x54, 0x7e, 0x35, 0xab, 0xb6, 0xac, 0x95, - 0xd6, 0xbf, 0x06, 0xe6, 0x02, 0x24, 0x85, 0x24, 0x7e, 0x64, 0x4f, 0xd0, 0x4f, 0xd1, 0xfc, 0xd0, - 0xf0, 0xc5, 0x5e, 0xae, 0x7d, 0x83, 0x7e, 0xe4, 0x25, 0x48, 0x8c, 0xc3, 0x94, 0x96, 0xea, 0xe0, - 0x90, 0x8c, 0x3d, 0xfa, 0x54, 0xf2, 0xed, 0xa3, 0xb2, 0x81, 0x2d, 0x2e, 0x44, 0x7a, 0x0e, 0x05, - 0x43, 0xda, 0xd3, 0x11, 0xd9, 0x2f, 0xe5, 0x60, 0x41, 0x00, 0x92, 0x49, 0x45, 0x8d, 0x5a, 0x1c, - 0x34, 0xeb, 0xf7, 0x9f, 0xcc, 0xac, 0x7f, 0x11, 0xbf, 0x51, 0x9f, 0xf5, 0x3d, 0x5d, 0x92, 0xf9, - 0x71, 0x38, 0xdb, 0x0d, 0x83, 0x2e, 0x63, 0xb6, 0x9f, 0x1d, 0x62, 0xb6, 0xcb, 0x01, 0x38, 0x7e, - 0xb6, 0xf7, 0xad, 0x85, 0x6d, 0xc3, 0x14, 0xdd, 0x85, 0x64, 0x87, 0xbd, 0x60, 0xc4, 0x68, 0xd6, - 0x8b, 0xe4, 0x05, 0x95, 0x32, 0x41, 0xf4, 0xb4, 0xd0, 0xe0, 0xc2, 0xda, 0x30, 0x2f, 0x7f, 0x9b, - 0xba, 0xa9, 0x72, 0x5f, 0xdd, 0xd4, 0x05, 0x6a, 0xd1, 0x39, 0xe2, 0x9f, 0x52, 0x51, 0xe9, 0xe1, - 0x97, 0x32, 0x18, 0xb3, 0x0e, 0x30, 0x03, 0x2c, 0x17, 0xed, 0xb9, 0xc1, 0x1a, 0xa9, 0x57, 0xa9, - 0xce, 0x72, 0xba, 0xce, 0xf4, 0xca, 0xcd, 0xe0, 0xcd, 0x5c, 0x98, 0x25, 0xa8, 0xff, 0x80, 0xcb, - 0x1d, 0xfe, 0x45, 0x23, 0x00, 0x56, 0xaa, 0x54, 0x5e, 0xa2, 0x54, 0x4d, 0x18, 0xa0, 0x2c, 0xb5, - 0xa1, 0xa7, 0xf9, 0xb1, 0x4d, 0x98, 0xab, 0x74, 0x3a, 0x4d, 0x8f, 0x37, 0xb0, 0x95, 0x32, 0x53, - 0xbc, 0x95, 0x64, 0x07, 0x73, 0x65, 0x21, 0xdd, 0xec, 0xd2, 0x69, 0xe2, 0x7b, 0x69, 0xad, 0x1f, - 0xce, 0xf5, 0x7c, 0x34, 0x7b, 0x03, 0x26, 0xf0, 0x87, 0x16, 0x53, 0x05, 0x55, 0x3c, 0xf2, 0x13, - 0x51, 0x79, 0x94, 0x20, 0x08, 0x61, 0x49, 0x8f, 0xab, 0x58, 0x90, 0xc2, 0x12, 0xe9, 0x15, 0x12, - 0x4d, 0x42, 0x59, 0xb9, 0x66, 0x14, 0x12, 0xa1, 0x0b, 0x5d, 0x33, 0xc8, 0x21, 0xc3, 0xfa, 0xc1, - 0xbc, 0x39, 0xed, 0xd8, 0x05, 0x4d, 0x6e, 0xd7, 0x22, 0x3b, 0x2a, 0xb9, 0x5d, 0x93, 0xd6, 0xff, - 0x7e, 0x0e, 0xe6, 0x37, 0x83, 0x3d, 0xb7, 0xed, 0x7d, 0x53, 0xc6, 0xc8, 0xf6, 0x71, 0x5c, 0x06, - 0x27, 0x5a, 0x7c, 0x52, 0x09, 0xe3, 0x7c, 0xad, 0x62, 0x31, 0x53, 0x70, 0xca, 0xd8, 0x59, 0xdf, - 0x83, 0xce, 0x6e, 0xf8, 0x61, 0x5a, 0xde, 0x3e, 0x89, 0x2e, 0xe1, 0xd6, 0xdf, 0xca, 0xc3, 0xa4, - 0xb6, 0x04, 0xd8, 0x67, 0x60, 0x4a, 0xe7, 0xa3, 0x2b, 0xfc, 0xf4, 0x6a, 0x6d, 0x03, 0x0b, 0x35, - 0x7e, 0xdc, 0x6d, 0x19, 0x1a, 0x3f, 0x31, 0xd1, 0x11, 0x7a, 0xc2, 0xab, 0xcd, 0x07, 0x19, 0x57, - 0x9b, 0x72, 0x2a, 0x23, 0xfd, 0xc0, 0x0b, 0xce, 0xbb, 0xbd, 0x17, 0x1c, 0x54, 0x1e, 0x69, 0xf4, - 0xfd, 0xaf, 0x39, 0xd6, 0x8f, 0xe7, 0xa0, 0x94, 0x5e, 0xa4, 0xdf, 0x95, 0x5e, 0x39, 0xc1, 0xeb, - 0xce, 0x8f, 0xe6, 0xe3, 0x3c, 0x27, 0xca, 0x85, 0xf7, 0x69, 0x35, 0x13, 0x7c, 0xcf, 0x78, 0x78, - 0x79, 0xd6, 0x8c, 0x46, 0xa7, 0x07, 0xbf, 0xc8, 0x0e, 0x41, 0x39, 0xf2, 0xad, 0x9f, 0x2d, 0x3f, - 0x63, 0x7d, 0x08, 0x0b, 0xe9, 0xee, 0xc0, 0xc7, 0x97, 0x0a, 0xcc, 0x9a, 0xf0, 0x74, 0x96, 0xa4, - 0x34, 0x95, 0x9d, 0xc6, 0xb7, 0x7e, 0x37, 0x9f, 0xe6, 0x4d, 0x26, 0x83, 0x62, 0xd3, 0xd1, 0x0d, - 0x61, 0x68, 0xd3, 0x91, 0x20, 0x5b, 0x95, 0x9d, 0x24, 0x3b, 0x59, 0xec, 0x88, 0x5a, 0xc8, 0x76, - 0x44, 0x65, 0x57, 0x53, 0x56, 0xd2, 0x5a, 0xd4, 0xa4, 0x03, 0xbe, 0xe3, 0x24, 0x96, 0xd2, 0x29, - 0xe3, 0xe8, 0x55, 0x58, 0x30, 0x42, 0x80, 0x2b, 0xfa, 0xd1, 0x44, 0xd7, 0x1e, 0x61, 0x81, 0x24, - 0xce, 0x44, 0x66, 0x37, 0x60, 0x5c, 0x7c, 0xe6, 0x6d, 0xb7, 0x43, 0x6f, 0x2a, 0x2c, 0x76, 0x4b, - 0x6f, 0xc6, 0x17, 0x3e, 0xcd, 0x33, 0xbd, 0xc9, 0xc5, 0x91, 0xaf, 0x4f, 0x2c, 0x42, 0xb4, 0xfe, - 0x79, 0x4e, 0xac, 0xff, 0xfa, 0x83, 0xef, 0xb1, 0x14, 0x67, 0xa2, 0x49, 0x03, 0x2c, 0x5a, 0xff, - 0x30, 0x2f, 0x13, 0xdd, 0xd0, 0xf4, 0x79, 0x1b, 0xc6, 0xb6, 0xdd, 0x60, 0x8f, 0x47, 0x94, 0x02, - 0x46, 0xe7, 0x22, 0x0b, 0x92, 0x98, 0x4e, 0x11, 0xfe, 0xb6, 0x89, 0x40, 0xd7, 0x85, 0xe5, 0x87, - 0xd2, 0x85, 0x69, 0x7a, 0xf9, 0xc2, 0x13, 0xd3, 0xcb, 0x7f, 0x5f, 0x9c, 0xd3, 0xa6, 0x12, 0x0d, - 0x11, 0x61, 0xfa, 0x5c, 0x3a, 0x27, 0x54, 0x4f, 0x2c, 0xf0, 0x84, 0x1d, 0xbb, 0xaa, 0x67, 0x99, - 0xd2, 0x7c, 0x3b, 0x8f, 0xc9, 0x27, 0x65, 0xfd, 0x61, 0x41, 0xf6, 0x31, 0x75, 0xd4, 0x79, 0xc3, - 0xef, 0x1b, 0xd7, 0x89, 0xd8, 0xe8, 0xf5, 0x10, 0x1c, 0x68, 0x36, 0x75, 0x1e, 0x46, 0xc4, 0xdc, - 0xa4, 0xde, 0x44, 0x3c, 0x31, 0x7f, 0x75, 0x3c, 0x51, 0x2e, 0xd6, 0x32, 0x9e, 0x49, 0x7a, 0xfa, - 0x40, 0x3c, 0xb6, 0xf4, 0xb5, 0x8c, 0x18, 0xec, 0x02, 0x8c, 0xdc, 0xf1, 0x1b, 0x2a, 0x92, 0xf9, - 0x02, 0x46, 0xff, 0xf0, 0x1b, 0xdc, 0x50, 0x9a, 0x23, 0x86, 0x68, 0x6b, 0x9c, 0xdc, 0x41, 0x6f, - 0x6b, 0x6b, 0xd7, 0xed, 0x4d, 0x0b, 0xa7, 0x65, 0x94, 0x59, 0x87, 0x19, 0x33, 0x81, 0x38, 0xd9, - 0xfb, 0xa2, 0x76, 0x3d, 0x95, 0x87, 0x5c, 0x7f, 0x16, 0x31, 0x89, 0xd8, 0x0a, 0x4c, 0x1b, 0x11, - 0x54, 0xe9, 0x71, 0x13, 0xd5, 0x9b, 0x66, 0xfc, 0x55, 0x5d, 0xbd, 0x69, 0x90, 0x88, 0xf3, 0x9c, - 0xbe, 0x5f, 0x7b, 0xe2, 0xec, 0xf9, 0x76, 0xc2, 0x61, 0x57, 0xa0, 0x28, 0xc3, 0x6c, 0x54, 0xd7, - 0xf4, 0x67, 0xaa, 0x10, 0x61, 0xa9, 0x30, 0x35, 0x0a, 0x51, 0x0b, 0xab, 0xf0, 0x69, 0x28, 0xd1, - 0x96, 0x94, 0xa4, 0xea, 0x7e, 0x0e, 0x46, 0x56, 0xab, 0x6b, 0xb6, 0xbe, 0x8d, 0xd4, 0xbd, 0x46, - 0x60, 0x23, 0x14, 0xbd, 0xea, 0xee, 0xf0, 0xe8, 0xc0, 0x0f, 0x1e, 0xd8, 0x3c, 0x8c, 0x02, 0x4f, - 0x66, 0x9f, 0xc4, 0x85, 0xf8, 0x19, 0xf6, 0x2e, 0x8c, 0xa2, 0xe1, 0x69, 0xea, 0x64, 0x48, 0xd7, - 0xb1, 0x32, 0x4d, 0x13, 0x78, 0x14, 0xad, 0x58, 0x6d, 0x49, 0xc4, 0xde, 0x86, 0x91, 0x35, 0xde, - 0x3e, 0x4c, 0x25, 0xc6, 0xeb, 0x21, 0x8e, 0x37, 0x84, 0x06, 0x6f, 0x1f, 0xda, 0x48, 0x62, 0xfd, - 0x78, 0x1e, 0x4e, 0x65, 0x7c, 0xd6, 0xbd, 0xcf, 0x3c, 0xa5, 0xbb, 0xe2, 0x8a, 0xb1, 0x2b, 0xaa, - 0xf7, 0xe9, 0xbe, 0x1d, 0x9f, 0xb9, 0x49, 0xfe, 0x74, 0x0e, 0xce, 0x98, 0x13, 0x94, 0x2c, 0xcd, - 0xef, 0x5d, 0x61, 0xef, 0xc0, 0xd8, 0x0d, 0xee, 0x36, 0xb8, 0x4a, 0x9a, 0x75, 0x2a, 0x0e, 0x88, - 0x27, 0x63, 0x08, 0xc8, 0x42, 0xc9, 0x36, 0xf1, 0x38, 0x95, 0x50, 0xb6, 0x46, 0x1f, 0x27, 0xe5, - 0x71, 0x4b, 0xc5, 0xf3, 0xc8, 0xaa, 0x6a, 0x80, 0x95, 0xc7, 0xb7, 0x73, 0xf0, 0xec, 0x00, 0x1a, - 0x31, 0x70, 0x62, 0xe8, 0xf5, 0x81, 0xc3, 0x13, 0x15, 0xa1, 0xec, 0x7d, 0x98, 0xdd, 0x26, 0x79, - 0x5e, 0x0d, 0x47, 0x3e, 0x59, 0x2f, 0x4a, 0xd4, 0x77, 0xd4, 0xb8, 0xa4, 0x91, 0x8d, 0x40, 0x33, - 0x85, 0x81, 0x81, 0x66, 0xf4, 0xb8, 0x2d, 0x23, 0xc3, 0xc6, 0x6d, 0xf9, 0x10, 0x16, 0xcc, 0xb6, - 0x51, 0xf8, 0xdc, 0x24, 0x6a, 0x4d, 0xae, 0x7f, 0xd4, 0x9a, 0x81, 0x41, 0x3a, 0xad, 0xbf, 0x95, - 0x83, 0x92, 0xc9, 0xfb, 0x93, 0x8e, 0xe7, 0x7b, 0xc6, 0x78, 0x3e, 0x9b, 0x3d, 0x9e, 0xfd, 0x07, - 0xf2, 0xff, 0xcc, 0xa5, 0x1b, 0x3b, 0xd4, 0x08, 0x5a, 0x30, 0xb6, 0xe6, 0xb7, 0x5c, 0xaf, 0xad, - 0x67, 0x7e, 0x6f, 0x20, 0xc4, 0xa6, 0x92, 0xe1, 0x82, 0xfc, 0x9c, 0x83, 0xd1, 0x3b, 0x7e, 0xbb, - 0xb2, 0x46, 0x26, 0xbd, 0xc8, 0xa7, 0xed, 0xb7, 0x1d, 0xb7, 0x61, 0xcb, 0x02, 0xb6, 0x01, 0x50, - 0xab, 0x07, 0x9c, 0xb7, 0x6b, 0xde, 0x37, 0x79, 0x4a, 0xd2, 0x10, 0x3d, 0xd4, 0xec, 0xe2, 0xc6, - 0x22, 0x9f, 0x2e, 0x11, 0xd1, 0x09, 0xbd, 0x6f, 0xea, 0xfb, 0xad, 0x46, 0x8f, 0xeb, 0x8a, 0xe2, - 0xa0, 0xa5, 0xc6, 0xe1, 0xf2, 0x77, 0x63, 0x5d, 0x65, 0x56, 0x85, 0x3d, 0x7c, 0x39, 0x73, 0x38, - 0x7e, 0x27, 0x07, 0xcf, 0x0e, 0xa0, 0x79, 0x02, 0xa3, 0xf2, 0x67, 0xdd, 0xe1, 0x1c, 0x20, 0x21, - 0xc2, 0xbc, 0xc3, 0x5e, 0x23, 0x92, 0x89, 0xf0, 0xa6, 0x29, 0xef, 0xb0, 0x00, 0x18, 0x79, 0x87, - 0x05, 0x40, 0x9c, 0xa5, 0x37, 0xb8, 0xb7, 0xb7, 0x2f, 0xcd, 0xb3, 0xa6, 0xe5, 0xde, 0xb0, 0x8f, - 0x10, 0xfd, 0x2c, 0x95, 0x38, 0xd6, 0xbf, 0x1c, 0x85, 0xb3, 0x36, 0xdf, 0xf3, 0xc4, 0xbd, 0xe4, - 0x6e, 0xe8, 0xb5, 0xf7, 0x8c, 0xb8, 0x37, 0x56, 0x6a, 0xe5, 0x52, 0x92, 0x08, 0x01, 0x89, 0x67, - 0xe2, 0x6b, 0x50, 0x14, 0x62, 0x88, 0xb6, 0x78, 0xf1, 0xd1, 0x4a, 0x08, 0x2b, 0x14, 0x58, 0x59, - 0x15, 0xb3, 0xd7, 0x49, 0x4c, 0xd2, 0xd2, 0xf8, 0x08, 0x31, 0xe9, 0x3b, 0x47, 0x65, 0xa8, 0x1d, - 0x86, 0x11, 0xc7, 0x2b, 0x32, 0x89, 0x4a, 0xf1, 0x5d, 0x66, 0xa4, 0xcf, 0x5d, 0xe6, 0x36, 0x2c, - 0x54, 0x1a, 0xf2, 0x74, 0x74, 0x9b, 0x5b, 0x81, 0xd7, 0xae, 0x7b, 0x1d, 0xb7, 0xa9, 0xee, 0xe7, - 0xd8, 0xcb, 0x6e, 0x5c, 0xee, 0x74, 0x62, 0x04, 0x3b, 0x93, 0x4c, 0x34, 0x63, 0xed, 0x4e, 0x0d, - 0xc3, 0xc3, 0xd0, 0x7b, 0x24, 0x36, 0xa3, 0xd1, 0x0e, 0xb1, 0x15, 0xa1, 0x1d, 0x17, 0xe3, 0x2d, - 0x0a, 0x1f, 0xe4, 0xb7, 0x37, 0x6a, 0x89, 0x4b, 0xb3, 0xcc, 0x32, 0x20, 0x1f, 0xf6, 0xa3, 0x66, - 0x88, 0xa6, 0x90, 0x06, 0x5e, 0x42, 0x57, 0xab, 0xdd, 0x10, 0x74, 0xc5, 0x1e, 0xba, 0x30, 0xdc, - 0xd7, 0xe9, 0x24, 0x1e, 0xbb, 0x24, 0xa6, 0x42, 0xcb, 0x8f, 0x38, 0x4e, 0xe1, 0x89, 0xe4, 0xce, - 0x15, 0x20, 0x54, 0xde, 0xb9, 0x34, 0x14, 0xf6, 0x2e, 0xcc, 0xaf, 0xaf, 0x2e, 0x2b, 0x2d, 0xf2, - 0x9a, 0x5f, 0xef, 0xe2, 0x43, 0x3c, 0x60, 0x7d, 0x38, 0x86, 0xbc, 0xbe, 0x2c, 0x76, 0x93, 0x2c, - 0x34, 0x76, 0x1e, 0xc6, 0xab, 0x6b, 0xb2, 0xef, 0x27, 0xf5, 0x54, 0x5a, 0x64, 0x19, 0xa5, 0x0a, - 0xd9, 0x66, 0x72, 0x29, 0x98, 0x3a, 0x56, 0x7a, 0x3f, 0x3b, 0xc4, 0x85, 0xe0, 0x6d, 0x98, 0x5e, - 0xf1, 0xa3, 0x6a, 0x3b, 0x8c, 0xdc, 0x76, 0x9d, 0x57, 0xd7, 0xf4, 0xb8, 0xd6, 0x3b, 0x7e, 0xe4, - 0x78, 0x54, 0x22, 0xbe, 0xdc, 0xc4, 0x64, 0x9f, 0x43, 0xd2, 0xeb, 0xbc, 0xcd, 0x83, 0x24, 0x9e, - 0xf5, 0xa8, 0xec, 0x5b, 0x41, 0xba, 0x17, 0x97, 0xd8, 0x26, 0x22, 0xa5, 0xf9, 0x92, 0x99, 0x37, - 0x57, 0xfd, 0x06, 0x0f, 0xe5, 0x6e, 0xf1, 0x3d, 0x94, 0xe6, 0x4b, 0x6b, 0xdb, 0x80, 0x1d, 0xf4, - 0xdf, 0xc5, 0x34, 0x5f, 0x3d, 0xb8, 0xec, 0x73, 0x30, 0x8a, 0x3f, 0x49, 0xba, 0x9d, 0xcf, 0x60, - 0x9b, 0x48, 0xb6, 0x75, 0x81, 0x69, 0x4b, 0x02, 0x56, 0x85, 0x71, 0xba, 0x58, 0x9d, 0x24, 0x59, - 0x0d, 0xdd, 0xd0, 0xe4, 0xcc, 0x20, 0x7a, 0xab, 0x01, 0x53, 0x7a, 0x85, 0x62, 0x45, 0xdc, 0x70, - 0xc3, 0x7d, 0xde, 0x10, 0xbf, 0x28, 0xcf, 0x1c, 0xae, 0x88, 0x7d, 0x84, 0x3a, 0xe2, 0x3b, 0x6c, - 0x0d, 0x45, 0x9c, 0xa9, 0xd5, 0xf0, 0x6e, 0x48, 0x9f, 0x42, 0xaa, 0x16, 0x0f, 0xd5, 0x76, 0x0d, - 0x9b, 0x8a, 0xac, 0xef, 0x83, 0x85, 0x3b, 0xdd, 0x66, 0xd3, 0xdd, 0x69, 0x72, 0x95, 0x87, 0x04, - 0xd3, 0x73, 0xaf, 0xc0, 0x68, 0x4d, 0x4b, 0xf8, 0x1d, 0x27, 0x7a, 0xd4, 0x70, 0xd0, 0x08, 0x35, - 0x87, 0xa1, 0x7a, 0x52, 0xa9, 0xbe, 0x25, 0xa9, 0xf5, 0x5b, 0x39, 0x58, 0x50, 0xef, 0xff, 0x81, - 0x5b, 0x7f, 0x10, 0x67, 0x7d, 0x3f, 0x6f, 0xcc, 0x35, 0x9c, 0xb0, 0xa9, 0x69, 0x24, 0x67, 0xdd, - 0x4d, 0xf5, 0x11, 0xa6, 0xc0, 0x92, 0xf5, 0xc1, 0xc7, 0x7d, 0x0c, 0x7b, 0x17, 0x26, 0xe9, 0x78, - 0xd4, 0x02, 0x4c, 0x62, 0x14, 0x2f, 0xba, 0xee, 0xa5, 0xad, 0x51, 0x74, 0x74, 0x94, 0xc5, 0xcc, - 0xa6, 0x7c, 0x52, 0x19, 0x20, 0x5b, 0x16, 0x33, 0xeb, 0x18, 0x30, 0x75, 0x7f, 0x6d, 0x32, 0xdd, - 0xb7, 0x34, 0x77, 0xaf, 0xea, 0x21, 0xe5, 0x72, 0xc9, 0xcd, 0x38, 0x09, 0x29, 0xa7, 0xdf, 0x8c, - 0x63, 0xd4, 0x78, 0x4c, 0xf2, 0xc7, 0x8c, 0xc9, 0xfb, 0x6a, 0x4c, 0x0a, 0xfd, 0x27, 0xc6, 0xfc, - 0x80, 0x71, 0xa8, 0x25, 0x2b, 0x64, 0x64, 0x28, 0xb5, 0xca, 0x33, 0x18, 0x3b, 0x5f, 0x92, 0xa4, - 0x77, 0x51, 0xe2, 0xa4, 0xeb, 0x6a, 0x46, 0x87, 0x67, 0x7a, 0xcc, 0xd6, 0xfc, 0x79, 0x98, 0xaa, - 0x44, 0x91, 0x5b, 0xdf, 0xe7, 0x8d, 0x35, 0xb1, 0x3d, 0x69, 0xd1, 0xaf, 0x5c, 0x82, 0xeb, 0x8f, - 0x66, 0x3a, 0xae, 0x8c, 0xe6, 0xea, 0x86, 0x64, 0xcc, 0x1a, 0x47, 0x73, 0x15, 0x10, 0x33, 0x9a, - 0xab, 0x80, 0xb0, 0x4b, 0x30, 0x5e, 0x6d, 0x3f, 0xf4, 0x44, 0x9f, 0xc8, 0x00, 0x58, 0xa8, 0x9b, - 0xf2, 0x24, 0x48, 0xdf, 0x5c, 0x09, 0x8b, 0xbd, 0xad, 0x5d, 0x6a, 0x26, 0x12, 0x05, 0x86, 0x54, - 0x79, 0xc5, 0x11, 0x6e, 0xf4, 0x0b, 0x4b, 0x7c, 0xcb, 0xb9, 0x0a, 0xe3, 0x4a, 0x93, 0x09, 0x89, - 0xd2, 0x82, 0x28, 0x7b, 0x03, 0x46, 0x28, 0x64, 0xcc, 0xe0, 0xad, 0xe5, 0xcb, 0x9b, 0xd4, 0x32, - 0x78, 0x6b, 0xf9, 0xf2, 0x8c, 0x0c, 0xde, 0x5a, 0xe6, 0xbc, 0x58, 0x09, 0x34, 0x75, 0xac, 0x12, - 0xe8, 0x1e, 0x4c, 0x6d, 0xb9, 0x41, 0xe4, 0x09, 0x19, 0xa5, 0x1d, 0x85, 0x8b, 0xd3, 0x86, 0xde, - 0x54, 0x2b, 0x5a, 0x79, 0x41, 0x25, 0x9d, 0xee, 0x68, 0xf8, 0x66, 0x76, 0xe4, 0x04, 0x9e, 0x6d, - 0xca, 0x3a, 0xf3, 0x49, 0x4c, 0x59, 0xb1, 0x53, 0x51, 0x57, 0x36, 0x9b, 0x68, 0x64, 0xf0, 0xd2, - 0x92, 0x52, 0x98, 0xc5, 0x88, 0xec, 0x2b, 0x30, 0x25, 0xfe, 0xde, 0xf2, 0x9b, 0x5e, 0xdd, 0xe3, - 0xe1, 0x62, 0x09, 0x1b, 0xf7, 0x42, 0xe6, 0xea, 0x47, 0xa4, 0xc3, 0x1a, 0x8f, 0xe4, 0x02, 0x46, - 0xc6, 0x69, 0x25, 0xb8, 0xc1, 0x8d, 0x7d, 0x00, 0x53, 0x62, 0xf6, 0xed, 0xb8, 0xa1, 0x14, 0x4d, - 0xe7, 0x12, 0x63, 0xe4, 0x06, 0xc1, 0x7b, 0x02, 0x2a, 0xeb, 0x04, 0xe2, 0x98, 0xaf, 0x74, 0xe4, - 0x06, 0xc9, 0xb4, 0xd9, 0xde, 0xe9, 0xd9, 0x1c, 0x15, 0x1a, 0xfb, 0x02, 0x4c, 0x55, 0x3a, 0x9d, - 0x64, 0xc7, 0x99, 0xd7, 0x14, 0x61, 0x9d, 0x8e, 0x93, 0xb9, 0xeb, 0x18, 0x14, 0xe9, 0x8d, 0x79, - 0xe1, 0x44, 0x1b, 0x33, 0x7b, 0x33, 0x96, 0xd6, 0x4f, 0x25, 0x5a, 0x5d, 0xba, 0x38, 0x1a, 0xa2, - 0xbf, 0x14, 0xdc, 0x57, 0x61, 0x5a, 0xaa, 0x39, 0x95, 0x34, 0x73, 0xba, 0x67, 0xf5, 0x64, 0x08, - 0x35, 0x26, 0x0d, 0x5b, 0x87, 0x19, 0xe9, 0x6d, 0xdd, 0xa4, 0x48, 0xd7, 0x8b, 0x67, 0x70, 0xd5, - 0x22, 0x17, 0xe9, 0xa4, 0xdd, 0xc4, 0x04, 0x28, 0xae, 0xc1, 0x25, 0x45, 0x64, 0xfd, 0x51, 0x0e, - 0xce, 0xf4, 0x19, 0xf1, 0x38, 0x0e, 0x72, 0x6e, 0x70, 0x1c, 0x64, 0xb1, 0x73, 0x98, 0x5a, 0x11, - 0x6c, 0x3f, 0x49, 0x59, 0xfa, 0x78, 0x29, 0x79, 0xcb, 0x07, 0x46, 0x39, 0x86, 0xa8, 0xea, 0x9b, - 0x3e, 0xaa, 0x66, 0x0b, 0xbd, 0x87, 0x10, 0xe1, 0xc9, 0x8f, 0x5a, 0xb1, 0x1e, 0x1f, 0x95, 0x5f, - 0xa0, 0x14, 0x46, 0xf1, 0xb0, 0x7e, 0xe4, 0x1b, 0x2b, 0x38, 0x83, 0xb5, 0x75, 0x94, 0x83, 0x49, - 0x6d, 0x1d, 0xb2, 0x73, 0x9a, 0x17, 0x70, 0x49, 0x26, 0xc1, 0xd2, 0x38, 0xe4, 0xe5, 0x49, 0x84, - 0x8b, 0x2a, 0x7f, 0xbc, 0x02, 0xfa, 0xb6, 0x10, 0x85, 0xb4, 0x58, 0xd1, 0x2d, 0x43, 0x5b, 0x6c, - 0x63, 0x39, 0xe6, 0xca, 0x77, 0xc3, 0xa8, 0x52, 0x8f, 0xbc, 0x87, 0x7c, 0x88, 0x43, 0x27, 0xc9, - 0x95, 0xef, 0x86, 0x91, 0xe3, 0x22, 0x59, 0x4f, 0xae, 0xfc, 0x98, 0xa1, 0xf5, 0x57, 0x73, 0x00, - 0x77, 0xab, 0xab, 0x18, 0xec, 0xfd, 0x93, 0x0a, 0x05, 0xd9, 0x01, 0x74, 0x15, 0xf7, 0x01, 0xe2, - 0xc0, 0x7f, 0x9f, 0x83, 0x19, 0x13, 0x8d, 0xbd, 0x0f, 0xb3, 0xb5, 0x7a, 0xe0, 0x37, 0x9b, 0x3b, - 0x6e, 0xfd, 0xc1, 0x86, 0xd7, 0xe6, 0x32, 0x74, 0xe9, 0xa8, 0x3c, 0x8b, 0xc2, 0xb8, 0xc8, 0x69, - 0x8a, 0x32, 0x3b, 0x8d, 0xcc, 0xfe, 0x5a, 0x0e, 0xa6, 0x6b, 0xfb, 0xfe, 0x41, 0x1c, 0x6d, 0x94, - 0x06, 0xe4, 0xab, 0x62, 0x6d, 0x87, 0xfb, 0xfe, 0x41, 0x92, 0x41, 0xd3, 0x30, 0xfe, 0x7c, 0x6f, - 0xb8, 0x77, 0xf9, 0xba, 0x8f, 0x37, 0x99, 0x28, 0xbc, 0x68, 0x54, 0x62, 0x9b, 0x75, 0x5a, 0x7f, - 0x9a, 0x83, 0x49, 0xbc, 0xf3, 0x34, 0x9b, 0x28, 0x73, 0x7d, 0x2f, 0xa5, 0x63, 0x8c, 0xdb, 0x35, - 0x60, 0x60, 0xdf, 0x82, 0xd9, 0x14, 0x1a, 0xb3, 0x60, 0xac, 0x86, 0x0e, 0xfe, 0xba, 0x82, 0x42, - 0xba, 0xfc, 0xdb, 0x54, 0x62, 0xad, 0x6b, 0x64, 0xf7, 0x2e, 0xe3, 0xb3, 0xee, 0x32, 0x80, 0xa7, - 0x40, 0xea, 0x66, 0xc3, 0xd2, 0x5f, 0x72, 0xef, 0xb2, 0xad, 0x61, 0x59, 0x77, 0x60, 0xac, 0xe6, - 0x07, 0xd1, 0xca, 0xa1, 0xbc, 0x4c, 0xac, 0xf1, 0xb0, 0xae, 0xbf, 0xdb, 0x7a, 0xf8, 0x56, 0x52, - 0xb7, 0xa9, 0x88, 0x95, 0x61, 0xf4, 0x9a, 0xc7, 0x9b, 0x0d, 0xdd, 0x40, 0x77, 0x57, 0x00, 0x6c, - 0x09, 0x17, 0x17, 0xae, 0xd3, 0x49, 0x4e, 0x94, 0xc4, 0x12, 0xf8, 0x93, 0xae, 0x9b, 0x55, 0xa3, - 0x7f, 0x5f, 0x8c, 0xf3, 0x10, 0xf4, 0xd6, 0x34, 0xa0, 0xab, 0xff, 0x93, 0x1c, 0x2c, 0xf5, 0x27, - 0xd1, 0x8d, 0x8b, 0x73, 0x03, 0x8c, 0x8b, 0x5f, 0x49, 0xbf, 0x33, 0x22, 0x1a, 0xbd, 0x33, 0x26, - 0xaf, 0x8b, 0x6b, 0x68, 0xdb, 0x5d, 0xe7, 0x2a, 0x11, 0xca, 0xb9, 0x01, 0xdf, 0x8c, 0x88, 0x72, - 0x98, 0x23, 0xa4, 0xb1, 0x89, 0xd6, 0xfa, 0xd5, 0x11, 0x38, 0xdb, 0x97, 0x82, 0xdd, 0xd0, 0xd2, - 0x2b, 0xcd, 0xc4, 0x89, 0x5d, 0xfa, 0xe2, 0x5f, 0xc4, 0x7f, 0xd1, 0x7c, 0x2f, 0xed, 0x6d, 0xb6, - 0x19, 0xa7, 0xd5, 0xc9, 0x23, 0xaf, 0x4f, 0x1d, 0xcb, 0x4b, 0xa2, 0x23, 0x33, 0xe8, 0xcd, 0xb0, - 0x83, 0x7e, 0x89, 0x3c, 0x72, 0xbd, 0x66, 0xa8, 0x2f, 0xbb, 0x86, 0x04, 0xd9, 0xaa, 0x2c, 0xb1, - 0xf8, 0x1e, 0xc9, 0xb6, 0xf8, 0xb6, 0xfe, 0x65, 0x0e, 0x26, 0xe2, 0xcf, 0x66, 0x4b, 0x70, 0x7a, - 0xdb, 0xae, 0xac, 0xae, 0x3b, 0xdb, 0x1f, 0x6e, 0xad, 0x3b, 0x77, 0xef, 0xd4, 0xb6, 0xd6, 0x57, - 0xab, 0xd7, 0xaa, 0xeb, 0x6b, 0xa5, 0x67, 0xd8, 0x1c, 0x4c, 0xdf, 0xbd, 0x73, 0xeb, 0xce, 0xe6, - 0xfd, 0x3b, 0xce, 0xba, 0x6d, 0x6f, 0xda, 0xa5, 0x1c, 0x9b, 0x86, 0x09, 0x7b, 0xa5, 0xb2, 0xea, - 0xdc, 0xd9, 0x5c, 0x5b, 0x2f, 0xe5, 0x59, 0x09, 0xa6, 0x56, 0x37, 0xef, 0xdc, 0x59, 0x5f, 0xdd, - 0xae, 0xde, 0xab, 0x6e, 0x7f, 0x58, 0x2a, 0x30, 0x06, 0x33, 0x88, 0xb0, 0x65, 0x57, 0xef, 0xac, - 0x56, 0xb7, 0x2a, 0x1b, 0xa5, 0x11, 0x01, 0x13, 0xf8, 0x1a, 0x6c, 0x34, 0x66, 0x74, 0xeb, 0xee, - 0xca, 0x7a, 0x69, 0x4c, 0xa0, 0x88, 0xbf, 0x34, 0x94, 0x71, 0x51, 0x3d, 0xa2, 0xac, 0x55, 0xb6, - 0x2b, 0x2b, 0x95, 0xda, 0x7a, 0xa9, 0xc8, 0xce, 0xc0, 0xbc, 0x01, 0x72, 0x36, 0x36, 0xaf, 0x57, - 0xef, 0x94, 0x26, 0xd8, 0x02, 0x94, 0x62, 0xd8, 0xda, 0x8a, 0x73, 0xb7, 0xb6, 0x6e, 0x97, 0x20, - 0x0d, 0xbd, 0x53, 0xb9, 0xbd, 0x5e, 0x9a, 0xb4, 0xde, 0x93, 0x7e, 0x80, 0xb2, 0xab, 0xd9, 0x69, - 0x60, 0xb5, 0xed, 0xca, 0xf6, 0xdd, 0x5a, 0xaa, 0xf1, 0x93, 0x30, 0x5e, 0xbb, 0xbb, 0xba, 0xba, - 0x5e, 0xab, 0x95, 0x72, 0x0c, 0x60, 0xec, 0x5a, 0xa5, 0xba, 0xb1, 0xbe, 0x56, 0xca, 0x5b, 0x7f, - 0x3b, 0x07, 0x73, 0x4a, 0x02, 0x54, 0x8f, 0x46, 0x9f, 0x70, 0x2d, 0xbe, 0x6f, 0x5c, 0x6c, 0x95, - 0x93, 0x56, 0xaa, 0x92, 0x01, 0xcb, 0xf0, 0xa7, 0x73, 0x70, 0x2a, 0x13, 0x9b, 0x7d, 0x08, 0x25, - 0xf5, 0x05, 0xb7, 0xdd, 0xa8, 0xbe, 0x9f, 0xec, 0x63, 0x2f, 0xa4, 0x6a, 0x49, 0xa1, 0x49, 0xb5, - 0x66, 0x92, 0xf0, 0xb9, 0x87, 0xcd, 0xf0, 0xe9, 0x08, 0xac, 0x6f, 0xe5, 0xe0, 0x4c, 0x9f, 0x6a, - 0xd8, 0x2a, 0x8c, 0xc5, 0x89, 0x69, 0x06, 0x58, 0xb0, 0x2d, 0x7c, 0xfb, 0xa8, 0x4c, 0x88, 0x98, - 0x21, 0x17, 0xff, 0xb2, 0xc7, 0xe2, 0x4c, 0x33, 0x98, 0xee, 0x45, 0x76, 0xdf, 0xd9, 0x54, 0xcf, - 0x53, 0x4d, 0x95, 0xfb, 0xb5, 0x95, 0x49, 0xea, 0xbb, 0x82, 0x7b, 0x10, 0x62, 0xbe, 0x17, 0xeb, - 0x27, 0x72, 0x42, 0xb8, 0x4b, 0x23, 0x0a, 0x99, 0xb7, 0x12, 0x86, 0xdd, 0x16, 0xb7, 0xfd, 0x26, - 0xaf, 0xd8, 0x77, 0xe8, 0xd8, 0x40, 0x69, 0xd5, 0xc5, 0x02, 0xbc, 0x56, 0x38, 0x6e, 0xd0, 0x36, - 0x5e, 0xab, 0x75, 0x1a, 0xf6, 0x36, 0xc0, 0xfa, 0xa3, 0x88, 0x07, 0x6d, 0xb7, 0x19, 0xc7, 0x68, - 0x91, 0x91, 0xa5, 0x08, 0x6a, 0xca, 0xdb, 0x1a, 0xb2, 0xf5, 0x37, 0x72, 0x30, 0x45, 0x97, 0xa6, - 0x4a, 0x93, 0x07, 0xd1, 0x27, 0x9b, 0x5e, 0x6f, 0x1b, 0xd3, 0x2b, 0x76, 0xd8, 0xd0, 0xf8, 0x8b, - 0xe2, 0xcc, 0x99, 0xf5, 0xcf, 0x72, 0x50, 0x4a, 0x23, 0xb2, 0xf7, 0xa1, 0x58, 0xe3, 0x0f, 0x79, - 0xe0, 0x45, 0x87, 0xb4, 0x51, 0xaa, 0x14, 0x7e, 0x12, 0x87, 0xca, 0xe4, 0x7c, 0x08, 0xe9, 0x97, - 0x1d, 0xd3, 0x0c, 0xbb, 0xdf, 0x6b, 0x6a, 0x8f, 0xc2, 0x93, 0x52, 0x7b, 0x58, 0xff, 0x4b, 0x1e, - 0xce, 0x5c, 0xe7, 0x91, 0xde, 0xa6, 0xd8, 0xbc, 0xe0, 0xd3, 0xc3, 0xb5, 0x4b, 0x6b, 0xc9, 0x22, - 0x8c, 0x63, 0x91, 0x1a, 0x5f, 0x5b, 0xfd, 0x64, 0x2b, 0xf1, 0xbc, 0x2e, 0x18, 0x39, 0xc2, 0xfa, - 0xd4, 0x7d, 0x51, 0xcb, 0x1a, 0x14, 0x4f, 0xeb, 0xf3, 0x30, 0x83, 0x61, 0xf1, 0xbb, 0x62, 0x39, - 0xf0, 0x06, 0xa9, 0x7f, 0x8a, 0x76, 0x0a, 0xca, 0x5e, 0x87, 0x92, 0x80, 0x54, 0xea, 0x0f, 0xda, - 0xfe, 0x41, 0x93, 0x37, 0xf6, 0x78, 0x03, 0x8f, 0xf5, 0xa2, 0xdd, 0x03, 0x57, 0x3c, 0xef, 0xb6, - 0xe5, 0xd5, 0x8d, 0x37, 0x50, 0x47, 0x43, 0x3c, 0x13, 0xe8, 0xd2, 0xdb, 0x30, 0xf9, 0x31, 0x33, - 0x80, 0x59, 0xff, 0x73, 0x0e, 0x16, 0xb0, 0x71, 0x5a, 0xc5, 0x2a, 0x3b, 0xab, 0xea, 0x2d, 0x2d, - 0x29, 0x8e, 0x2b, 0x40, 0xe6, 0x52, 0x88, 0x7b, 0x31, 0xd1, 0x09, 0xe5, 0x87, 0xd0, 0x09, 0xd5, - 0x4e, 0x92, 0x89, 0x7e, 0x48, 0x95, 0xd6, 0xcd, 0x91, 0x62, 0xa1, 0x34, 0x92, 0x0c, 0xb9, 0xf5, - 0xd7, 0xf2, 0x30, 0x6e, 0x73, 0x4c, 0xd1, 0xcd, 0xce, 0xc3, 0xf8, 0x1d, 0x3f, 0xe2, 0xe1, 0x6d, - 0x23, 0x1f, 0x7b, 0x5b, 0x80, 0x9c, 0x56, 0xc3, 0x56, 0x85, 0x62, 0xc2, 0x6f, 0x05, 0x7e, 0xa3, - 0x5b, 0x8f, 0xf4, 0x09, 0xdf, 0x91, 0x20, 0x5b, 0x95, 0xb1, 0x37, 0x60, 0x82, 0x38, 0xc7, 0x8f, - 0xba, 0x68, 0x8c, 0x1c, 0xf0, 0x38, 0xc5, 0x7b, 0x82, 0x80, 0x32, 0xad, 0x14, 0x30, 0x46, 0x34, - 0x99, 0xb6, 0x47, 0x66, 0x50, 0xa2, 0xfa, 0xe8, 0x00, 0x51, 0xfd, 0xd3, 0x30, 0x56, 0x09, 0x43, - 0x1e, 0xa9, 0x28, 0x06, 0x53, 0x71, 0xd8, 0xb6, 0x90, 0x47, 0x92, 0xb1, 0x8b, 0xe5, 0x36, 0xe1, - 0x59, 0xff, 0x3c, 0x0f, 0xa3, 0xf8, 0x27, 0x3e, 0x99, 0x06, 0xf5, 0x7d, 0xe3, 0xc9, 0x34, 0xa8, - 0xef, 0xdb, 0x08, 0x65, 0x97, 0x51, 0x53, 0xa1, 0xf2, 0x37, 0x51, 0xeb, 0x51, 0x05, 0xdf, 0x48, - 0xc0, 0xb6, 0x8e, 0x13, 0xbf, 0xf0, 0x17, 0x32, 0x63, 0x97, 0x9c, 0x86, 0xfc, 0x66, 0x8d, 0x5a, - 0x8c, 0x11, 0xb1, 0xfc, 0xd0, 0xce, 0x6f, 0xd6, 0xb0, 0x37, 0x6e, 0x54, 0x96, 0xdf, 0xba, 0x4a, - 0x0d, 0x95, 0xbd, 0xb1, 0xef, 0x2e, 0xbf, 0x75, 0xd5, 0xa6, 0x12, 0xd1, 0xbf, 0xf8, 0xcd, 0xf8, - 0xf0, 0x2a, 0x7d, 0xee, 0xb1, 0x7f, 0xb1, 0x6d, 0xf8, 0xc8, 0x6a, 0x27, 0x08, 0x6c, 0x19, 0x26, - 0x29, 0xd6, 0x03, 0xe2, 0x6b, 0xb1, 0x18, 0x28, 0x16, 0x84, 0xa4, 0xd0, 0x91, 0xe4, 0x13, 0x1c, - 0x0d, 0x90, 0xca, 0x32, 0x4b, 0x4f, 0x70, 0x6a, 0x08, 0x43, 0x5b, 0x43, 0x11, 0x9f, 0x24, 0xdf, - 0xf0, 0x12, 0x5f, 0xfa, 0x19, 0x2d, 0x68, 0x00, 0xa6, 0x39, 0x88, 0x11, 0xac, 0x9f, 0xcf, 0x43, - 0x71, 0xab, 0xd9, 0xdd, 0xf3, 0xda, 0xf7, 0x2e, 0x33, 0x06, 0x78, 0x8d, 0x53, 0x79, 0x30, 0xc4, - 0xdf, 0xec, 0x2c, 0x14, 0xd5, 0xcd, 0x4d, 0x6d, 0x48, 0x21, 0xdd, 0xda, 0x16, 0x41, 0x8d, 0x3b, - 0x85, 0x3e, 0x53, 0x3f, 0xd9, 0x65, 0x88, 0xef, 0x5f, 0xfd, 0x2e, 0x6a, 0x23, 0x62, 0xb1, 0xd8, - 0x31, 0x1a, 0x7b, 0x13, 0xf0, 0x90, 0xa0, 0xcb, 0x83, 0x52, 0x68, 0xcb, 0x4f, 0x23, 0x39, 0x45, - 0x92, 0x20, 0x1a, 0xbb, 0x02, 0x34, 0x31, 0x29, 0x9b, 0xf9, 0x29, 0x93, 0x40, 0xe6, 0x87, 0x54, - 0x24, 0x84, 0xca, 0xde, 0x85, 0xc9, 0x7a, 0xc0, 0xf1, 0xd5, 0xd1, 0x6d, 0x26, 0x49, 0xca, 0x75, - 0xca, 0xd5, 0xa4, 0xfc, 0xde, 0x65, 0x5b, 0x47, 0xb7, 0xfe, 0xf1, 0x38, 0x4c, 0xe9, 0xdf, 0xc3, - 0x6c, 0x98, 0x0f, 0x9b, 0xe2, 0xee, 0x4e, 0xc6, 0x66, 0x1d, 0x2c, 0xa4, 0xe3, 0xf4, 0x9c, 0xf9, - 0x41, 0x02, 0x4f, 0x5a, 0x9e, 0xa9, 0x20, 0x15, 0x37, 0x9e, 0xb1, 0xe7, 0xc2, 0x04, 0x2c, 0xf1, - 0x58, 0x05, 0x8a, 0x7e, 0x27, 0xdc, 0xe3, 0x6d, 0x4f, 0xbd, 0xb7, 0xbc, 0x64, 0x30, 0xda, 0xa4, - 0xc2, 0x1e, 0x5e, 0x31, 0x19, 0x7b, 0x0b, 0xc6, 0xfc, 0x0e, 0x6f, 0xbb, 0x1e, 0x9d, 0x71, 0xcf, - 0xa6, 0x18, 0xf0, 0x76, 0xa5, 0xaa, 0x11, 0x12, 0x32, 0xbb, 0x04, 0x23, 0xfe, 0x83, 0x78, 0xbc, - 0xce, 0x9a, 0x44, 0x0f, 0x22, 0x57, 0x23, 0x41, 0x44, 0x41, 0xf0, 0x91, 0xdb, 0xda, 0xa5, 0x11, - 0x33, 0x09, 0x6e, 0xba, 0xad, 0x5d, 0x9d, 0x40, 0x20, 0xb2, 0x0f, 0x00, 0x3a, 0xee, 0x1e, 0x0f, - 0x9c, 0x46, 0x37, 0x3a, 0xa4, 0x71, 0x7b, 0xc1, 0x20, 0xdb, 0x12, 0xc5, 0x6b, 0xdd, 0xe8, 0x50, - 0xa3, 0x9d, 0xe8, 0x28, 0x20, 0xab, 0x00, 0xb4, 0xdc, 0x28, 0xe2, 0x41, 0xcb, 0x27, 0x6b, 0xbf, - 0x24, 0x08, 0xa1, 0x64, 0x70, 0x3b, 0x2e, 0xd6, 0x38, 0x68, 0x44, 0xf8, 0xd1, 0x5e, 0xe0, 0x52, - 0x4e, 0xf9, 0xd4, 0x47, 0x7b, 0x81, 0xd1, 0x4a, 0x81, 0xc8, 0x3e, 0x07, 0xe3, 0x0d, 0x2f, 0xac, - 0xfb, 0x41, 0x83, 0xa2, 0x97, 0x3c, 0x67, 0xd0, 0xac, 0xc9, 0x32, 0x8d, 0x4c, 0xa1, 0x8b, 0xaf, - 0xa5, 0x20, 0xa4, 0x77, 0xfc, 0x03, 0x54, 0xf3, 0xa7, 0xbf, 0xb6, 0x16, 0x17, 0xeb, 0x5f, 0x9b, - 0x10, 0x89, 0xa1, 0xdc, 0xf3, 0xa2, 0xa6, 0xbb, 0x43, 0xef, 0xdc, 0xe6, 0x50, 0x5e, 0xc7, 0x22, - 0x7d, 0x28, 0x25, 0x32, 0x7b, 0x1b, 0x8a, 0xbc, 0x1d, 0x05, 0xae, 0xe3, 0x35, 0xc8, 0x4b, 0xd2, - 0xfc, 0x68, 0x71, 0x00, 0xbb, 0xd5, 0x35, 0xfd, 0xa3, 0x11, 0xbf, 0xda, 0x10, 0xfd, 0x13, 0xd6, - 0xbd, 0x16, 0x39, 0x37, 0x9a, 0xfd, 0x53, 0x5b, 0xad, 0xde, 0xd6, 0xfb, 0x47, 0x20, 0xb2, 0xf7, - 0x61, 0x5c, 0xac, 0xdf, 0x86, 0xbf, 0x47, 0x01, 0x21, 0x2c, 0xb3, 0x7f, 0x64, 0x59, 0xcf, 0x74, - 0x55, 0x44, 0x62, 0x21, 0xbb, 0x07, 0xa1, 0xe3, 0xd5, 0x29, 0xc8, 0x83, 0xb9, 0x1c, 0x2b, 0xf7, - 0x6b, 0xd5, 0x55, 0x8d, 0x6c, 0xd4, 0x3d, 0x08, 0xab, 0x75, 0xf6, 0x02, 0x40, 0xf2, 0xae, 0x2e, - 0x5f, 0x41, 0x6c, 0x0d, 0xf2, 0xf9, 0x91, 0xff, 0xfd, 0x67, 0xcb, 0xb9, 0x15, 0x80, 0xa2, 0x8a, - 0x19, 0x63, 0x6d, 0xc0, 0xd9, 0xbe, 0x2b, 0x91, 0xbd, 0x06, 0xa5, 0x5d, 0x97, 0xf4, 0x70, 0xf5, - 0x7d, 0xb7, 0xdd, 0xe6, 0x4d, 0xda, 0x03, 0x67, 0x15, 0x7c, 0x55, 0x82, 0x25, 0x67, 0xeb, 0x03, - 0x58, 0xc8, 0x1a, 0x02, 0xf6, 0x22, 0x4c, 0xe9, 0xe1, 0x71, 0x88, 0xc9, 0xa4, 0xdb, 0xf1, 0x54, - 0x80, 0x1c, 0x62, 0xf0, 0x2b, 0x39, 0x78, 0x6e, 0xd0, 0x82, 0x66, 0x4b, 0x50, 0xec, 0x04, 0x9e, - 0x8f, 0x82, 0x23, 0xe5, 0x1f, 0x50, 0xbf, 0x31, 0xb5, 0x00, 0x4a, 0x38, 0x91, 0xbb, 0x47, 0x2e, - 0x17, 0xf6, 0x04, 0x42, 0xb6, 0xdd, 0xbd, 0x90, 0x7d, 0x0a, 0xe6, 0x1a, 0x7c, 0xd7, 0xed, 0x36, - 0x23, 0x27, 0xac, 0xef, 0xf3, 0x06, 0x7a, 0x39, 0xa1, 0x29, 0x9d, 0x5d, 0xa2, 0x82, 0x9a, 0x82, - 0xf7, 0x7c, 0xf1, 0x68, 0x9f, 0x2f, 0xbe, 0x39, 0x52, 0xcc, 0x95, 0xf2, 0x36, 0xda, 0x2e, 0x59, - 0x3f, 0x90, 0x87, 0xc5, 0x7e, 0x33, 0x98, 0xbd, 0x97, 0xd5, 0x07, 0xf2, 0x29, 0x41, 0x87, 0xeb, - 0x4f, 0x09, 0x5a, 0x6d, 0x6c, 0x19, 0x62, 0x1f, 0xa5, 0xe3, 0xe2, 0x0d, 0x28, 0x98, 0xa0, 0xe9, - 0xb8, 0x61, 0x78, 0x20, 0x16, 0x69, 0x41, 0x0b, 0x31, 0x4b, 0x30, 0x9d, 0x46, 0xc1, 0xd8, 0x67, - 0x01, 0xea, 0x4d, 0x3f, 0xe4, 0xf8, 0x62, 0x4f, 0xa7, 0xbf, 0x34, 0xd4, 0x8e, 0xa1, 0xfa, 0x13, - 0x2d, 0x42, 0x57, 0xfd, 0x06, 0xa7, 0x01, 0x74, 0xe1, 0x4c, 0x9f, 0x2d, 0x4b, 0x0c, 0x4f, 0x92, - 0xaf, 0x5d, 0x65, 0x7f, 0xea, 0xc6, 0x59, 0xdb, 0xd3, 0x3d, 0x9e, 0xef, 0x37, 0x47, 0x0e, 0x81, - 0xf5, 0xee, 0x4b, 0x82, 0x3b, 0x99, 0x1b, 0x77, 0x83, 0x98, 0xbb, 0x84, 0xdc, 0x0d, 0x9a, 0xac, - 0x0c, 0x93, 0x2a, 0xbb, 0xa3, 0x90, 0xae, 0x25, 0x73, 0x20, 0xd0, 0x2d, 0x8e, 0x93, 0x07, 0x63, - 0x88, 0xa2, 0x27, 0x1a, 0x9d, 0xdb, 0x13, 0x08, 0xd9, 0x3e, 0xec, 0xa8, 0xd6, 0x3d, 0xa7, 0xe6, - 0xb7, 0x79, 0x5a, 0x50, 0xe9, 0x4f, 0xe6, 0xd4, 0xf0, 0xf7, 0x6e, 0xb7, 0xc7, 0x7d, 0x1f, 0x03, - 0xf4, 0x1b, 0xa2, 0x0f, 0xc3, 0xbf, 0x85, 0x1c, 0xa1, 0x56, 0x1d, 0xc9, 0x11, 0xf4, 0x93, 0x9d, - 0x87, 0xd9, 0x40, 0x5a, 0x96, 0x46, 0x3e, 0xf5, 0xa7, 0xcc, 0xa4, 0x31, 0x2d, 0xc1, 0xdb, 0x3e, - 0xf6, 0x29, 0x7d, 0xd7, 0xcd, 0xb8, 0xc3, 0xb4, 0xd3, 0x87, 0x5d, 0x84, 0x09, 0x71, 0xfa, 0x60, - 0xec, 0x99, 0x94, 0xc3, 0x02, 0xe2, 0xe1, 0x59, 0x6e, 0x17, 0x3f, 0xa2, 0xbf, 0x89, 0xd7, 0xb7, - 0xf2, 0x8a, 0x99, 0x7e, 0xf6, 0xb1, 0x33, 0x30, 0xee, 0x07, 0x7b, 0x5a, 0xd3, 0xc6, 0xfc, 0x60, - 0x4f, 0xb4, 0xeb, 0x02, 0x94, 0xa4, 0xff, 0x8c, 0x0c, 0x4c, 0x10, 0x1e, 0xb6, 0xe5, 0xe5, 0xb8, - 0x68, 0xcf, 0x48, 0x38, 0xa6, 0xb0, 0x3f, 0x6c, 0xd7, 0x05, 0x66, 0x18, 0xfa, 0x8e, 0x1e, 0x72, - 0x8a, 0x9a, 0x3d, 0x13, 0x86, 0x7e, 0x12, 0x7b, 0xaa, 0xc1, 0x56, 0x60, 0x5a, 0xf0, 0x89, 0x03, - 0x5f, 0xd1, 0xd1, 0xfc, 0x7c, 0xef, 0xd1, 0x7c, 0xd8, 0xae, 0xab, 0x4f, 0xb4, 0xa7, 0x42, 0xed, - 0x17, 0xbb, 0x05, 0x25, 0x4d, 0x86, 0x41, 0x0f, 0xc9, 0x94, 0x95, 0x73, 0xc2, 0x46, 0x93, 0x7d, - 0xaa, 0xed, 0x5d, 0xdf, 0x9e, 0xad, 0x9b, 0x00, 0xea, 0x9a, 0x7f, 0x2f, 0xa7, 0xf6, 0xd2, 0x0c, - 0x22, 0x66, 0xc1, 0xf4, 0xbe, 0x1b, 0x3a, 0x61, 0xd8, 0x92, 0x56, 0x5b, 0x14, 0x6a, 0x77, 0x72, - 0xdf, 0x0d, 0x6b, 0x61, 0x4b, 0xa5, 0xf2, 0x38, 0x25, 0x70, 0x7c, 0xb7, 0x1b, 0xed, 0x3b, 0xba, - 0x44, 0x26, 0x7b, 0x6c, 0x7e, 0xdf, 0x0d, 0x37, 0x45, 0x99, 0xc6, 0x9b, 0xbd, 0x0c, 0x33, 0xc8, - 0xb7, 0xee, 0x29, 0xc6, 0x18, 0x5c, 0xc2, 0x9e, 0x12, 0x8c, 0xeb, 0x9e, 0xe4, 0x4c, 0x5f, 0xf8, - 0x7f, 0xe4, 0xe1, 0x74, 0x76, 0xef, 0xe0, 0xf4, 0x14, 0x7d, 0x8a, 0x5e, 0x73, 0xf4, 0x6d, 0x13, - 0x02, 0x22, 0x03, 0x83, 0x64, 0x0d, 0x4e, 0x3e, 0x73, 0x70, 0x5e, 0x87, 0x39, 0x64, 0x44, 0xb2, - 0x5f, 0xd3, 0x0b, 0x23, 0x8a, 0x77, 0x61, 0xcf, 0x8a, 0x02, 0xb9, 0x9f, 0x6f, 0x08, 0x30, 0x7b, - 0x05, 0x66, 0xd4, 0x8e, 0xec, 0x1f, 0xb4, 0x45, 0xc5, 0x72, 0x3b, 0x9e, 0x26, 0xe8, 0x26, 0x02, - 0xd9, 0x29, 0x18, 0x73, 0x3b, 0x1d, 0x51, 0xa5, 0xdc, 0x85, 0x47, 0xdd, 0x4e, 0x47, 0xa6, 0x9b, - 0x41, 0x1f, 0x41, 0x67, 0x17, 0xed, 0x76, 0xc8, 0x48, 0xd0, 0x9e, 0x42, 0xa0, 0xb4, 0xe5, 0x09, - 0xc5, 0xba, 0x17, 0xb4, 0x0a, 0x65, 0x1c, 0x51, 0xc0, 0xed, 0xc4, 0x08, 0x67, 0xa1, 0xa8, 0x5e, - 0x90, 0xa5, 0xab, 0x83, 0x3d, 0xee, 0xd2, 0xeb, 0xf1, 0x5b, 0x70, 0xa6, 0xe1, 0x85, 0x38, 0x79, - 0x65, 0x93, 0x3a, 0x1d, 0xf2, 0x4a, 0x94, 0x61, 0x6b, 0xed, 0x05, 0x2a, 0x16, 0x3d, 0x59, 0xe9, - 0x74, 0xa4, 0x6f, 0x22, 0xf5, 0xf5, 0xe7, 0x60, 0x96, 0x64, 0x20, 0x3a, 0x22, 0xf1, 0x5b, 0x68, - 0x01, 0x8b, 0xcb, 0x09, 0x25, 0xf8, 0x01, 0x02, 0x55, 0x1b, 0x8a, 0xf2, 0xf7, 0x73, 0x70, 0x2a, - 0x53, 0x88, 0x62, 0x5f, 0x07, 0xe9, 0x84, 0x15, 0xf9, 0x4e, 0xc0, 0xeb, 0x5e, 0xc7, 0xc3, 0x30, - 0x15, 0x52, 0xc9, 0xb8, 0x3c, 0x48, 0xfc, 0x42, 0x87, 0xae, 0x6d, 0xdf, 0x8e, 0x89, 0xa4, 0xf6, - 0xa3, 0x14, 0xa4, 0xc0, 0x4b, 0x5f, 0x86, 0x53, 0x99, 0xa8, 0x19, 0x5a, 0x89, 0x37, 0xcc, 0xf4, - 0xca, 0xea, 0xd9, 0x28, 0xd5, 0x68, 0x4d, 0x5b, 0x41, 0xcd, 0xfb, 0xf5, 0xb8, 0x79, 0x29, 0x71, - 0x8b, 0xad, 0xa7, 0xd7, 0x75, 0xd6, 0x8d, 0x41, 0x11, 0xf5, 0x5f, 0xda, 0x5f, 0x86, 0x53, 0x34, - 0xf9, 0xf6, 0x02, 0xb7, 0xb3, 0x9f, 0xb0, 0x93, 0x1f, 0xfa, 0x6a, 0x16, 0x3b, 0x39, 0x2b, 0xaf, - 0x0b, 0xfc, 0x98, 0xeb, 0xbc, 0xdb, 0x0b, 0xa4, 0x36, 0x04, 0x6a, 0xa5, 0x67, 0x7c, 0x4d, 0xc6, - 0xac, 0xce, 0x65, 0xcd, 0xea, 0xa1, 0x97, 0x14, 0xd5, 0xf9, 0x83, 0x39, 0x38, 0x77, 0xdc, 0x37, - 0xb3, 0xfb, 0x70, 0x1a, 0x0d, 0x1b, 0x42, 0x3f, 0x6e, 0xb6, 0x53, 0x77, 0xeb, 0xfb, 0x9c, 0x66, - 0x89, 0x95, 0xd9, 0xf8, 0x4e, 0xa7, 0x56, 0xdb, 0xd4, 0xda, 0xdd, 0xe9, 0xd4, 0x42, 0x5f, 0xfd, - 0x5e, 0x15, 0xe4, 0xf4, 0x0d, 0x0d, 0x78, 0x76, 0x00, 0xa5, 0xb6, 0x50, 0x73, 0xfa, 0x42, 0xbd, - 0x00, 0xa5, 0x5d, 0xde, 0x10, 0x32, 0x28, 0x6f, 0xe0, 0xa7, 0x3d, 0x5c, 0x96, 0x39, 0xca, 0xed, - 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, + // 28929 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6d, 0x70, 0x5c, 0x59, + 0x76, 0x18, 0x36, 0xdd, 0x8d, 0x8f, 0xc6, 0xc1, 0x57, 0xe3, 0x02, 0x24, 0x41, 0xcc, 0x70, 0x9a, + 0xf3, 0x66, 0x86, 0x43, 0xce, 0xce, 0x90, 0x4b, 0x70, 0x87, 0xbb, 0xb3, 0xf3, 0xb5, 0x8d, 0x0f, + 0x92, 0x4d, 0x82, 0x00, 0xf6, 0x35, 0x48, 0xee, 0x68, 0x3f, 0xde, 0x3e, 0x74, 0x5f, 0x00, 0x6f, + 0xd8, 0xdd, 0xaf, 0xf7, 0xbd, 0xd7, 0x24, 0xb1, 0xb2, 0x63, 0xc9, 0xb6, 0xac, 0xa8, 0x1c, 0x59, + 0x96, 0x23, 0x59, 0xeb, 0x94, 0xac, 0xa8, 0x94, 0x38, 0x51, 0x39, 0x65, 0x55, 0x22, 0x45, 0x95, + 0xc4, 0xaa, 0xc8, 0x92, 0x4b, 0xa5, 0xa8, 0x54, 0x29, 0x4b, 0x95, 0x28, 0x5f, 0x1b, 0x15, 0x14, + 0x45, 0xf9, 0x91, 0xa0, 0x2a, 0x55, 0x52, 0x5c, 0x95, 0x8f, 0x75, 0xc9, 0x4e, 0xdd, 0x73, 0xcf, + 0x7d, 0xef, 0xde, 0xd7, 0xaf, 0x81, 0xc6, 0x0c, 0x57, 0x16, 0xb7, 0xf4, 0x87, 0x44, 0x9f, 0x7b, + 0xce, 0xb9, 0xef, 0x7e, 0x9f, 0x7b, 0xee, 0xf9, 0x80, 0x97, 0x22, 0xde, 0xe4, 0x1d, 0x3f, 0x88, + 0xae, 0x34, 0xf9, 0xae, 0x5b, 0xdf, 0xbf, 0x12, 0xed, 0x77, 0x78, 0x28, 0xff, 0xbd, 0xdc, 0x09, + 0xfc, 0xc8, 0x67, 0xc3, 0xf8, 0x63, 0x61, 0x6e, 0xd7, 0xdf, 0xf5, 0x11, 0x72, 0x45, 0xfc, 0x25, + 0x0b, 0x17, 0x5e, 0xdc, 0xf5, 0xfd, 0xdd, 0x26, 0xbf, 0x82, 0xbf, 0xb6, 0xbb, 0x3b, 0x57, 0x1a, + 0xdd, 0xc0, 0x8d, 0x3c, 0xbf, 0x4d, 0xe5, 0xe5, 0x74, 0x79, 0xe4, 0xb5, 0x78, 0x18, 0xb9, 0xad, + 0x4e, 0x3f, 0x06, 0x8f, 0x03, 0xb7, 0xd3, 0xe1, 0x01, 0xd5, 0xbe, 0x70, 0x29, 0xfe, 0x40, 0x37, + 0x8a, 0x04, 0xa5, 0x60, 0x7e, 0xe5, 0xd1, 0x55, 0xfd, 0x27, 0xa1, 0xbe, 0x99, 0xdd, 0x16, 0xc5, + 0x30, 0xc5, 0xd9, 0xfa, 0x99, 0x02, 0x8c, 0xdd, 0xe1, 0xbc, 0x53, 0x69, 0x7a, 0x8f, 0x38, 0x7b, + 0x19, 0x86, 0xd6, 0xdd, 0x16, 0x9f, 0xcf, 0x9d, 0xcf, 0x5d, 0x1c, 0x5b, 0x9a, 0x3e, 0x3c, 0x28, + 0x8f, 0x87, 0x3c, 0x78, 0xc4, 0x03, 0xa7, 0xed, 0xb6, 0xb8, 0x8d, 0x85, 0xec, 0x53, 0x30, 0x26, + 0xfe, 0x0f, 0x3b, 0x6e, 0x9d, 0xcf, 0xe7, 0x11, 0x73, 0xf2, 0xf0, 0xa0, 0x3c, 0xd6, 0x56, 0x40, + 0x3b, 0x29, 0x67, 0x55, 0x18, 0x5d, 0x7d, 0xd2, 0xf1, 0x02, 0x1e, 0xce, 0x0f, 0x9d, 0xcf, 0x5d, + 0x1c, 0x5f, 0x5c, 0xb8, 0x2c, 0xdb, 0x7a, 0x59, 0xb5, 0xf5, 0xf2, 0x96, 0xea, 0x8c, 0xa5, 0xd9, + 0xdf, 0x3a, 0x28, 0x3f, 0x77, 0x78, 0x50, 0x1e, 0xe5, 0x92, 0xe4, 0x6f, 0xff, 0x41, 0x39, 0x67, + 0x2b, 0x7a, 0xf6, 0x2e, 0x0c, 0x6d, 0xed, 0x77, 0xf8, 0xfc, 0xd8, 0xf9, 0xdc, 0xc5, 0xa9, 0xc5, + 0x17, 0x2f, 0xcb, 0xe1, 0x89, 0x3f, 0x3e, 0xf9, 0x4b, 0x60, 0x2d, 0x15, 0x0f, 0x0f, 0xca, 0x43, + 0x02, 0xc5, 0x46, 0x2a, 0xf6, 0x26, 0x8c, 0xdc, 0xf2, 0xc3, 0xa8, 0xba, 0x32, 0x0f, 0xf8, 0xc9, + 0xa7, 0x0e, 0x0f, 0xca, 0x33, 0x7b, 0x7e, 0x18, 0x39, 0x5e, 0xe3, 0x0d, 0xbf, 0xe5, 0x45, 0xbc, + 0xd5, 0x89, 0xf6, 0x6d, 0x42, 0xb2, 0x9e, 0xc0, 0xa4, 0xc1, 0x8f, 0x8d, 0xc3, 0xe8, 0xbd, 0xf5, + 0x3b, 0xeb, 0x1b, 0x0f, 0xd6, 0x4b, 0xcf, 0xb1, 0x22, 0x0c, 0xad, 0x6f, 0xac, 0xac, 0x96, 0x72, + 0x6c, 0x14, 0x0a, 0x95, 0xcd, 0xcd, 0x52, 0x9e, 0x4d, 0x40, 0x71, 0xa5, 0xb2, 0x55, 0x59, 0xaa, + 0xd4, 0x56, 0x4b, 0x05, 0x36, 0x0b, 0xd3, 0x0f, 0xaa, 0xeb, 0x2b, 0x1b, 0x0f, 0x6a, 0xce, 0xca, + 0x6a, 0xed, 0xce, 0xd6, 0xc6, 0x66, 0x69, 0x88, 0x4d, 0x01, 0xdc, 0xb9, 0xb7, 0xb4, 0x6a, 0xaf, + 0xaf, 0x6e, 0xad, 0xd6, 0x4a, 0xc3, 0x6c, 0x0e, 0x4a, 0x8a, 0xc4, 0xa9, 0xad, 0xda, 0xf7, 0xab, + 0xcb, 0xab, 0xa5, 0x91, 0xdb, 0x43, 0xc5, 0x42, 0x69, 0xc8, 0x1e, 0x5d, 0xe3, 0x6e, 0xc8, 0xab, + 0x2b, 0xd6, 0xbf, 0x57, 0x80, 0xe2, 0x5d, 0x1e, 0xb9, 0x0d, 0x37, 0x72, 0xd9, 0x0b, 0xc6, 0xf8, + 0x60, 0x13, 0xb5, 0x81, 0x79, 0xb9, 0x77, 0x60, 0x86, 0x0f, 0x0f, 0xca, 0xb9, 0x37, 0xf5, 0x01, + 0x79, 0x07, 0xc6, 0x57, 0x78, 0x58, 0x0f, 0xbc, 0x8e, 0x98, 0x34, 0xf3, 0x05, 0x44, 0x3b, 0x7b, + 0x78, 0x50, 0x3e, 0xd5, 0x48, 0xc0, 0x5a, 0x87, 0xe8, 0xd8, 0xac, 0x0a, 0x23, 0x6b, 0xee, 0x36, + 0x6f, 0x86, 0xf3, 0xc3, 0xe7, 0x0b, 0x17, 0xc7, 0x17, 0x9f, 0xa7, 0x41, 0x50, 0x1f, 0x78, 0x59, + 0x96, 0xae, 0xb6, 0xa3, 0x60, 0x7f, 0x69, 0xee, 0xf0, 0xa0, 0x5c, 0x6a, 0x22, 0x40, 0xef, 0x60, + 0x89, 0xc2, 0x6a, 0xc9, 0xc4, 0x18, 0x39, 0x76, 0x62, 0x9c, 0xfb, 0xad, 0x83, 0x72, 0x4e, 0x0c, + 0x18, 0x4d, 0x8c, 0x84, 0x9f, 0x39, 0x45, 0x16, 0xa1, 0x68, 0xf3, 0x47, 0x5e, 0x28, 0x5a, 0x56, + 0xc4, 0x96, 0x9d, 0x3e, 0x3c, 0x28, 0xb3, 0x80, 0x60, 0xda, 0x67, 0xc4, 0x78, 0x0b, 0x6f, 0xc3, + 0xb8, 0xf6, 0xd5, 0xac, 0x04, 0x85, 0x87, 0x7c, 0x5f, 0xf6, 0xb0, 0x2d, 0xfe, 0x64, 0x73, 0x30, + 0xfc, 0xc8, 0x6d, 0x76, 0xa9, 0x4b, 0x6d, 0xf9, 0xe3, 0xf3, 0xf9, 0xcf, 0xe5, 0x6e, 0x0f, 0x15, + 0x47, 0x4b, 0x45, 0x3b, 0x5f, 0x5d, 0xb1, 0xfe, 0xce, 0x10, 0x14, 0x6d, 0x5f, 0x2e, 0x44, 0x76, + 0x09, 0x86, 0x6b, 0x91, 0x1b, 0xa9, 0x61, 0x9a, 0x3d, 0x3c, 0x28, 0x4f, 0x8b, 0x45, 0xca, 0xb5, + 0xfa, 0x25, 0x86, 0x40, 0xdd, 0xdc, 0x73, 0x43, 0x35, 0x5c, 0x88, 0xda, 0x11, 0x00, 0x1d, 0x15, + 0x31, 0xd8, 0x05, 0x18, 0xba, 0xeb, 0x37, 0x38, 0x8d, 0x18, 0x3b, 0x3c, 0x28, 0x4f, 0xb5, 0xfc, + 0x86, 0x8e, 0x88, 0xe5, 0xec, 0x0d, 0x18, 0x5b, 0xee, 0x06, 0x01, 0x6f, 0x8b, 0xb9, 0x3e, 0x84, + 0xc8, 0x53, 0x87, 0x07, 0x65, 0xa8, 0x4b, 0xa0, 0xe3, 0x35, 0xec, 0x04, 0x41, 0x0c, 0x43, 0x2d, + 0x72, 0x83, 0x88, 0x37, 0xe6, 0x87, 0x07, 0x1a, 0x06, 0xb1, 0x3e, 0x67, 0x42, 0x49, 0x92, 0x1e, + 0x06, 0xe2, 0xc4, 0x6e, 0xc1, 0xf8, 0xcd, 0xc0, 0xad, 0xf3, 0x4d, 0x1e, 0x78, 0x7e, 0x03, 0xc7, + 0xb7, 0xb0, 0x74, 0xe1, 0xf0, 0xa0, 0x7c, 0x7a, 0x57, 0x80, 0x9d, 0x0e, 0xc2, 0x13, 0xea, 0xef, + 0x1c, 0x94, 0x8b, 0x2b, 0xb4, 0x65, 0xda, 0x3a, 0x29, 0xfb, 0xba, 0x18, 0x9c, 0x30, 0xc2, 0xae, + 0xe5, 0x8d, 0xf9, 0xd1, 0x63, 0x3f, 0xd1, 0xa2, 0x4f, 0x3c, 0xdd, 0x74, 0xc3, 0xc8, 0x09, 0x24, + 0x5d, 0xea, 0x3b, 0x75, 0x96, 0x6c, 0x03, 0x8a, 0xb5, 0xfa, 0x1e, 0x6f, 0x74, 0x9b, 0x1c, 0xa7, + 0xcc, 0xf8, 0xe2, 0x19, 0x9a, 0xd4, 0x6a, 0x3c, 0x55, 0xf1, 0xd2, 0x02, 0xf1, 0x66, 0x21, 0x41, + 0xf4, 0xf9, 0xa4, 0xb0, 0x3e, 0x5f, 0xfc, 0xd6, 0xcf, 0x96, 0x9f, 0xfb, 0x81, 0xdf, 0x3f, 0xff, + 0x9c, 0xf5, 0x9f, 0xe5, 0xa1, 0x94, 0x66, 0xc2, 0x76, 0x60, 0xf2, 0x5e, 0xa7, 0xe1, 0x46, 0x7c, + 0xb9, 0xe9, 0xf1, 0x76, 0x14, 0xe2, 0x24, 0x39, 0xba, 0x4d, 0xaf, 0x50, 0xbd, 0xf3, 0x5d, 0x24, + 0x74, 0xea, 0x92, 0x32, 0xd5, 0x2a, 0x93, 0x6d, 0x52, 0x4f, 0x0d, 0x37, 0xf0, 0x10, 0x67, 0xd8, + 0xc9, 0xea, 0x91, 0x5b, 0x7f, 0x9f, 0x7a, 0x88, 0x2d, 0x4d, 0xa0, 0x76, 0x63, 0x7b, 0x1f, 0x67, + 0xe6, 0xe0, 0x13, 0x48, 0x90, 0x64, 0x4c, 0x20, 0x01, 0xb6, 0xfe, 0xb7, 0x1c, 0x4c, 0xd9, 0x3c, + 0xf4, 0xbb, 0x41, 0x9d, 0xdf, 0xe2, 0x6e, 0x83, 0x07, 0x62, 0xfa, 0xdf, 0xf1, 0xda, 0x0d, 0x5a, + 0x53, 0x38, 0xfd, 0x1f, 0x7a, 0x6d, 0x7d, 0xeb, 0xc6, 0x72, 0xf6, 0x69, 0x18, 0xad, 0x75, 0xb7, + 0x11, 0x35, 0x9f, 0xec, 0x00, 0x61, 0x77, 0xdb, 0x49, 0xa1, 0x2b, 0x34, 0x76, 0x05, 0x46, 0xef, + 0xf3, 0x20, 0x4c, 0x76, 0x43, 0x3c, 0x1a, 0x1e, 0x49, 0x90, 0x4e, 0x40, 0x58, 0xec, 0x66, 0xb2, + 0x23, 0xd3, 0xa1, 0x36, 0x9d, 0xda, 0x07, 0x93, 0xa9, 0xd2, 0x22, 0x88, 0x3e, 0x55, 0x14, 0x96, + 0xf5, 0xe3, 0x79, 0x28, 0xad, 0xb8, 0x91, 0xbb, 0xed, 0x86, 0xd4, 0x9f, 0xf7, 0xaf, 0x89, 0x3d, + 0x5e, 0x6b, 0x28, 0xee, 0xf1, 0xe2, 0xcb, 0x3f, 0x76, 0xf3, 0x5e, 0x4d, 0x37, 0x6f, 0x5c, 0x9c, + 0xb0, 0xd4, 0xbc, 0xa4, 0x51, 0xef, 0x1d, 0xdf, 0xa8, 0x12, 0x35, 0xaa, 0xa8, 0x1a, 0x95, 0x34, + 0x85, 0xbd, 0x07, 0x43, 0xb5, 0x0e, 0xaf, 0xd3, 0x26, 0xa2, 0xce, 0x05, 0xb3, 0x71, 0x02, 0xe1, + 0xfe, 0xb5, 0xa5, 0x09, 0x62, 0x33, 0x14, 0x76, 0x78, 0xdd, 0x46, 0x32, 0x6d, 0xd1, 0xfc, 0xe7, + 0x05, 0x98, 0xcb, 0x22, 0xd3, 0xdb, 0x31, 0x72, 0x44, 0x3b, 0x2e, 0x42, 0x51, 0x1c, 0xe1, 0xe2, + 0x58, 0xc4, 0xed, 0x62, 0x6c, 0x69, 0x42, 0x7c, 0xf2, 0x1e, 0xc1, 0xec, 0xb8, 0x94, 0xbd, 0x1c, + 0x4b, 0x04, 0xc5, 0x84, 0x1f, 0x49, 0x04, 0x4a, 0x0e, 0x10, 0x63, 0xad, 0x96, 0x30, 0x0a, 0x0e, + 0x49, 0xb7, 0x28, 0x70, 0x32, 0xd6, 0x01, 0x41, 0x8c, 0x63, 0x46, 0x1d, 0x0a, 0xab, 0x50, 0x54, + 0xcd, 0x9a, 0x9f, 0x40, 0x46, 0x33, 0xa9, 0x4e, 0xba, 0x7f, 0x4d, 0x0e, 0x66, 0x83, 0x7e, 0xeb, + 0x6c, 0x14, 0x0e, 0xbb, 0x06, 0xc5, 0xcd, 0xc0, 0x7f, 0xb2, 0x5f, 0x5d, 0x09, 0xe7, 0x27, 0xcf, + 0x17, 0x2e, 0x8e, 0x2d, 0x9d, 0x39, 0x3c, 0x28, 0xcf, 0x76, 0x04, 0xcc, 0xf1, 0x1a, 0xfa, 0x49, + 0x1b, 0x23, 0xde, 0x1e, 0x2a, 0xe6, 0x4a, 0xf9, 0xdb, 0x43, 0xc5, 0x7c, 0xa9, 0x20, 0xc5, 0x8b, + 0xdb, 0x43, 0xc5, 0xa1, 0xd2, 0xf0, 0xed, 0xa1, 0xe2, 0x30, 0x0a, 0x1c, 0x63, 0x25, 0xb8, 0x3d, + 0x54, 0x1c, 0x2f, 0x4d, 0x18, 0xa7, 0x3d, 0x32, 0x88, 0xfc, 0xba, 0xdf, 0xb4, 0x0b, 0xf7, 0xec, + 0xaa, 0x3d, 0xb2, 0x5c, 0x59, 0xe6, 0x41, 0x64, 0x17, 0x2a, 0x0f, 0x6a, 0xf6, 0xe4, 0xca, 0x7e, + 0xdb, 0x6d, 0x79, 0x75, 0x79, 0x74, 0xda, 0x85, 0x9b, 0xcb, 0x9b, 0x56, 0x05, 0xa6, 0x92, 0xb6, + 0xac, 0x79, 0x61, 0xc4, 0xae, 0xc0, 0x98, 0x82, 0x88, 0x8d, 0xae, 0x90, 0xd9, 0x6a, 0x3b, 0xc1, + 0xb1, 0x7e, 0x33, 0x0f, 0x90, 0x94, 0x3c, 0xa3, 0x6b, 0xe1, 0xb3, 0xc6, 0x5a, 0x38, 0x95, 0x5e, + 0x0b, 0x7d, 0x57, 0x01, 0xfb, 0x00, 0x46, 0x84, 0x58, 0xd0, 0x55, 0x22, 0xd1, 0x99, 0x34, 0x29, + 0x16, 0xde, 0xbf, 0xb6, 0x34, 0x45, 0xc4, 0x23, 0x21, 0x42, 0x6c, 0x22, 0xd3, 0x96, 0xd1, 0xcf, + 0x8c, 0x26, 0x83, 0x41, 0x0b, 0xe8, 0x22, 0xc4, 0x03, 0x4a, 0x1d, 0x8a, 0x2b, 0xa3, 0xa3, 0x06, + 0x39, 0x2e, 0x65, 0x67, 0x41, 0x0c, 0x38, 0x75, 0xea, 0xe8, 0xe1, 0x41, 0xb9, 0xd0, 0x0d, 0x3c, + 0x9c, 0x04, 0xec, 0x0a, 0xd0, 0x34, 0xa0, 0x0e, 0x14, 0xb3, 0x6f, 0xa6, 0xee, 0x3a, 0x75, 0x1e, + 0x44, 0x49, 0x8f, 0xcf, 0xe7, 0xd4, 0x6c, 0x61, 0x1d, 0x30, 0xa7, 0xca, 0xfc, 0x10, 0x4e, 0x83, + 0x8b, 0x99, 0xbd, 0x72, 0xd9, 0x40, 0x95, 0x62, 0xe4, 0x79, 0x75, 0x2a, 0x35, 0x64, 0x99, 0xd3, + 0x23, 0x52, 0x9a, 0x15, 0xb0, 0x6b, 0x20, 0x66, 0x28, 0xf5, 0x3e, 0x50, 0x3d, 0x95, 0x07, 0xb5, + 0xa5, 0x53, 0xc4, 0x69, 0xd2, 0x7d, 0xac, 0x93, 0x0b, 0x6c, 0xf6, 0x0e, 0x88, 0x29, 0x4c, 0xfd, + 0xce, 0x88, 0xe8, 0xe6, 0xf2, 0xe6, 0x72, 0xd3, 0xef, 0x36, 0x6a, 0x5f, 0x5c, 0x4b, 0x88, 0x77, + 0xeb, 0x1d, 0x9d, 0xf8, 0xe6, 0xf2, 0x26, 0x7b, 0x07, 0x86, 0x2b, 0xdf, 0xec, 0x06, 0x9c, 0xe4, + 0x93, 0x09, 0x55, 0xa7, 0x80, 0x2d, 0x9d, 0x21, 0xc2, 0x69, 0x57, 0xfc, 0xd4, 0xe5, 0x3a, 0x2c, + 0x17, 0x35, 0x6f, 0xad, 0xd5, 0x48, 0xf6, 0x60, 0xa9, 0x6e, 0xd9, 0x5a, 0xd3, 0x3e, 0x3b, 0x32, + 0x5a, 0x2d, 0xa8, 0xd8, 0x15, 0xc8, 0x57, 0x56, 0xf0, 0x46, 0x34, 0xbe, 0x38, 0xa6, 0xaa, 0x5d, + 0x59, 0x9a, 0x23, 0x92, 0x09, 0x57, 0x5f, 0x06, 0xf9, 0xca, 0x0a, 0x5b, 0x82, 0xe1, 0xbb, 0xfb, + 0xb5, 0x2f, 0xae, 0xd1, 0x66, 0x36, 0xab, 0xe6, 0xb5, 0x80, 0x6d, 0xe0, 0xb2, 0x0f, 0x93, 0x2f, + 0x6e, 0xed, 0x87, 0xdf, 0x68, 0xea, 0x5f, 0x8c, 0x68, 0x6c, 0x13, 0xc6, 0x2a, 0x8d, 0x96, 0xd7, + 0xbe, 0x17, 0xf2, 0x60, 0x7e, 0x1c, 0xf9, 0xcc, 0xa7, 0xbe, 0x3b, 0x2e, 0x5f, 0x9a, 0x3f, 0x3c, + 0x28, 0xcf, 0xb9, 0xe2, 0xa7, 0xd3, 0x0d, 0x79, 0xa0, 0x71, 0x4b, 0x98, 0xb0, 0x4d, 0x80, 0xbb, + 0x7e, 0x7b, 0xd7, 0xaf, 0x44, 0x4d, 0x37, 0x4c, 0x6d, 0x8f, 0x49, 0x41, 0x2c, 0x3e, 0x9c, 0x6a, + 0x09, 0x98, 0xe3, 0x0a, 0xa0, 0xc6, 0x50, 0xe3, 0xc1, 0x6e, 0xc0, 0xc8, 0x46, 0xe0, 0xd6, 0x9b, + 0x7c, 0x7e, 0x12, 0xb9, 0xcd, 0x11, 0x37, 0x09, 0x54, 0x2d, 0x9d, 0x27, 0x86, 0x25, 0x1f, 0xc1, + 0xfa, 0x35, 0x45, 0x22, 0x2e, 0x3c, 0x00, 0xd6, 0x3b, 0x27, 0x33, 0x2e, 0x09, 0x9f, 0xd2, 0x2f, + 0x09, 0xc9, 0xa2, 0x5f, 0xf6, 0x5b, 0x2d, 0xb7, 0xdd, 0x40, 0xda, 0xfb, 0x8b, 0xda, 0xdd, 0xc1, + 0xfa, 0x06, 0xcc, 0xf4, 0x74, 0xd6, 0x31, 0xf7, 0xbb, 0xf7, 0x61, 0x7a, 0x85, 0xef, 0xb8, 0xdd, + 0x66, 0x14, 0x9f, 0x24, 0x72, 0x89, 0xe2, 0x4d, 0xab, 0x21, 0x8b, 0x1c, 0x75, 0x7c, 0xd8, 0x69, + 0x64, 0xeb, 0x3d, 0x98, 0x34, 0x9a, 0x2f, 0xae, 0x0a, 0x95, 0x6e, 0xc3, 0x8b, 0x70, 0x20, 0x73, + 0xc9, 0x55, 0xc1, 0x15, 0x40, 0x1c, 0x2e, 0x3b, 0x41, 0xb0, 0xfe, 0x7d, 0x5d, 0x5a, 0xa1, 0x9d, + 0x48, 0x5c, 0xab, 0x69, 0x3f, 0xc8, 0x25, 0xb2, 0x53, 0xcf, 0x7e, 0x10, 0xef, 0x06, 0x97, 0xe4, + 0xda, 0xcc, 0xf7, 0xac, 0xcd, 0x71, 0x1a, 0x89, 0x82, 0xfb, 0x38, 0x94, 0x2b, 0x32, 0x9e, 0xa9, + 0x85, 0x8f, 0x3f, 0x53, 0x3f, 0x80, 0x89, 0xbb, 0x6e, 0xdb, 0xdd, 0xe5, 0x0d, 0xd1, 0x02, 0xb9, + 0xf7, 0x8c, 0x2d, 0x3d, 0x7f, 0x78, 0x50, 0x3e, 0xd3, 0x92, 0x70, 0x6c, 0xa5, 0x3e, 0x89, 0x0c, + 0x02, 0x76, 0x55, 0xad, 0xec, 0xe1, 0x8c, 0x95, 0x3d, 0x49, 0xb5, 0x0f, 0xe3, 0xca, 0xa6, 0xf5, + 0x6c, 0xfd, 0xda, 0x18, 0xb6, 0x91, 0xbd, 0x01, 0x23, 0x36, 0xdf, 0x15, 0x47, 0x4d, 0x2e, 0x19, + 0xa4, 0x00, 0x21, 0x7a, 0xc7, 0x48, 0x1c, 0x94, 0x33, 0x78, 0x23, 0xdc, 0xf3, 0x76, 0x22, 0xea, + 0x9d, 0x58, 0xce, 0x20, 0xb0, 0x26, 0x67, 0x10, 0xc4, 0xbc, 0xce, 0x4a, 0x98, 0xd8, 0xfd, 0xec, + 0x95, 0x1a, 0x75, 0x9a, 0xea, 0x61, 0x7b, 0x45, 0xdb, 0x46, 0x02, 0x43, 0x4a, 0x10, 0xd8, 0xec, + 0x3a, 0x8c, 0x55, 0xea, 0x75, 0xbf, 0xab, 0xdd, 0x19, 0xe5, 0xba, 0x95, 0x40, 0x53, 0x45, 0x92, + 0xa0, 0xb2, 0x1a, 0x8c, 0xaf, 0x8a, 0x8b, 0x96, 0xb7, 0xec, 0xd6, 0xf7, 0x54, 0x27, 0xa9, 0x3d, + 0x4c, 0x2b, 0x49, 0x56, 0x2e, 0x47, 0x60, 0x5d, 0x00, 0x75, 0x25, 0x83, 0x86, 0xcb, 0xb6, 0x60, + 0xbc, 0xc6, 0xeb, 0x01, 0x8f, 0x6a, 0x91, 0x1f, 0xf0, 0xd4, 0x96, 0xac, 0x95, 0x2c, 0xbd, 0xa8, + 0xee, 0x7a, 0x21, 0x02, 0x9d, 0x50, 0x40, 0x75, 0xae, 0x1a, 0xb2, 0x14, 0xda, 0x5b, 0x7e, 0xb0, + 0xbf, 0xb2, 0x44, 0xdb, 0x74, 0x72, 0xa6, 0x4b, 0xb0, 0x2e, 0xb4, 0x0b, 0x48, 0x63, 0xdb, 0x14, + 0xda, 0x25, 0x16, 0x8e, 0xd4, 0x4a, 0x0d, 0x65, 0x2b, 0xda, 0xb4, 0xa7, 0x93, 0x5e, 0x46, 0xb0, + 0x36, 0x52, 0x8d, 0x10, 0x25, 0x33, 0x63, 0xa4, 0x08, 0x8b, 0x75, 0x80, 0xa9, 0x51, 0x93, 0x82, + 0x6e, 0x93, 0x87, 0x21, 0xed, 0xe5, 0x67, 0x53, 0x83, 0x9f, 0x20, 0x2c, 0xbd, 0x4a, 0xcc, 0xcf, + 0xa9, 0x69, 0x40, 0xf7, 0x34, 0x51, 0xa8, 0xd5, 0x93, 0xc1, 0x9b, 0xbd, 0x0d, 0xb0, 0xfa, 0x24, + 0xe2, 0x41, 0xdb, 0x6d, 0xc6, 0x7a, 0x30, 0x54, 0xfd, 0x70, 0x82, 0x9a, 0x03, 0xad, 0x21, 0xb3, + 0x65, 0x98, 0xac, 0x84, 0x61, 0xb7, 0xc5, 0x6d, 0xbf, 0xc9, 0x2b, 0xf6, 0x3a, 0xee, 0xfb, 0x63, + 0x4b, 0xe7, 0x0e, 0x0f, 0xca, 0x67, 0x5d, 0x2c, 0x70, 0x02, 0xbf, 0xc9, 0x1d, 0x37, 0xd0, 0x67, + 0xb7, 0x49, 0xc3, 0x36, 0x00, 0x36, 0x3a, 0xbc, 0x5d, 0xe3, 0x6e, 0x50, 0xdf, 0x4b, 0x6d, 0xf3, + 0x49, 0xc1, 0xd2, 0x0b, 0xd4, 0xc2, 0x39, 0xbf, 0xc3, 0xdb, 0x21, 0xc2, 0xf4, 0xaf, 0x4a, 0x30, + 0xd9, 0x03, 0x98, 0xae, 0x56, 0xee, 0x6e, 0xfa, 0x4d, 0xaf, 0xbe, 0x4f, 0x92, 0xd3, 0x14, 0x6a, + 0x07, 0x4f, 0x13, 0xd7, 0x54, 0xa9, 0xdc, 0x9e, 0x3c, 0xb7, 0xe5, 0x74, 0x10, 0xea, 0x90, 0xfc, + 0x94, 0xe6, 0xc2, 0x3e, 0x14, 0x73, 0x30, 0x14, 0xc2, 0xe0, 0x96, 0xbb, 0x1b, 0xce, 0x4f, 0x1b, + 0xda, 0xae, 0xca, 0x83, 0xda, 0x65, 0xad, 0x54, 0x8a, 0x29, 0x0b, 0x72, 0x22, 0x22, 0xd4, 0x89, + 0xdc, 0xdd, 0xd0, 0x9c, 0x88, 0x31, 0x36, 0xbb, 0x0d, 0xb0, 0xe2, 0xd7, 0xbb, 0x2d, 0xde, 0x8e, + 0x56, 0x96, 0xe6, 0x4b, 0xe6, 0x55, 0x20, 0x2e, 0x48, 0xb6, 0xb6, 0x86, 0x5f, 0x37, 0x66, 0xa2, + 0x46, 0xbd, 0xf0, 0x3e, 0x94, 0xd2, 0x1f, 0x72, 0x42, 0x05, 0xd6, 0x64, 0x69, 0x4a, 0x6b, 0xfd, + 0xea, 0x13, 0x2f, 0x8c, 0x42, 0xeb, 0xfb, 0x8d, 0x15, 0x28, 0x76, 0x87, 0x3b, 0x7c, 0x7f, 0x33, + 0xe0, 0x3b, 0xde, 0x13, 0xda, 0xcc, 0x70, 0x77, 0x78, 0xc8, 0xf7, 0x9d, 0x0e, 0x42, 0xf5, 0xdd, + 0x21, 0x46, 0x65, 0x9f, 0x81, 0xe2, 0x9d, 0xbb, 0xb5, 0x3b, 0x7c, 0xbf, 0xba, 0x42, 0x07, 0x95, + 0x24, 0x6b, 0x85, 0x8e, 0x20, 0x35, 0xe6, 0x5a, 0x8c, 0x69, 0x2d, 0x25, 0x3b, 0xa1, 0xa8, 0x79, + 0xb9, 0xd9, 0x0d, 0x23, 0x1e, 0x54, 0x57, 0xf4, 0x9a, 0xeb, 0x12, 0x98, 0xda, 0x97, 0x62, 0x54, + 0xeb, 0x5f, 0xe5, 0x71, 0x17, 0x14, 0x13, 0xbe, 0xda, 0x0e, 0x23, 0xb7, 0x5d, 0xe7, 0x31, 0x03, + 0x9c, 0xf0, 0x1e, 0x41, 0x53, 0x13, 0x3e, 0x41, 0x36, 0xab, 0xce, 0x0f, 0x5c, 0xb5, 0xa8, 0x52, + 0x69, 0x2e, 0xaa, 0x2b, 0xba, 0x7a, 0x35, 0x20, 0x68, 0xaa, 0xca, 0x04, 0x99, 0x5d, 0x80, 0xd1, + 0x6a, 0xe5, 0x6e, 0xa5, 0x1b, 0xed, 0xe1, 0x1e, 0x5c, 0x94, 0xf2, 0xb9, 0x98, 0xad, 0x6e, 0x37, + 0xda, 0xb3, 0x55, 0x21, 0xbb, 0x82, 0xf7, 0x9e, 0x36, 0x8f, 0xa4, 0x1a, 0x96, 0x0e, 0xdd, 0x50, + 0x82, 0x52, 0xd7, 0x1e, 0x01, 0x62, 0xaf, 0xc3, 0xf0, 0xfd, 0xcd, 0xe5, 0xea, 0x0a, 0x5d, 0x9c, + 0xf1, 0x24, 0x7a, 0xd4, 0xa9, 0x9b, 0x5f, 0x22, 0x51, 0xd8, 0x2a, 0x4c, 0xd5, 0x78, 0xbd, 0x1b, + 0x78, 0xd1, 0xfe, 0xcd, 0xc0, 0xef, 0x76, 0xc2, 0xf9, 0x51, 0xac, 0x03, 0x57, 0x7a, 0x48, 0x25, + 0xce, 0x2e, 0x16, 0x69, 0xd4, 0x29, 0x22, 0xeb, 0xd7, 0x73, 0xc9, 0x36, 0xc9, 0x2e, 0x18, 0x62, + 0x0d, 0xea, 0x6e, 0x84, 0x58, 0xa3, 0xeb, 0x6e, 0x50, 0xc0, 0xb1, 0x81, 0x2d, 0x77, 0xc3, 0xc8, + 0x6f, 0xad, 0xb6, 0x1b, 0x1d, 0xdf, 0x6b, 0x47, 0x48, 0x25, 0x3b, 0xdf, 0x3a, 0x3c, 0x28, 0xbf, + 0x58, 0xc7, 0x52, 0x87, 0x53, 0xb1, 0x93, 0xe2, 0x92, 0x41, 0xfd, 0x09, 0xc6, 0xc3, 0xfa, 0xed, + 0xbc, 0x71, 0xbc, 0x89, 0xcf, 0xb3, 0x79, 0xa7, 0xe9, 0xd5, 0xf1, 0x46, 0x8f, 0x0d, 0x8d, 0x67, + 0x15, 0x7e, 0x5e, 0x90, 0x94, 0xca, 0x1e, 0x32, 0x79, 0x67, 0x50, 0xb3, 0x2f, 0xc0, 0x84, 0x90, + 0x34, 0xe8, 0x67, 0x38, 0x9f, 0xc7, 0xce, 0x7e, 0x01, 0xb5, 0x70, 0x21, 0x0f, 0x62, 0x36, 0x86, + 0x88, 0xa2, 0x53, 0xb0, 0x06, 0xcc, 0x6f, 0x05, 0x6e, 0x3b, 0xf4, 0xa2, 0xd5, 0x76, 0x3d, 0xd8, + 0x47, 0xc9, 0x68, 0xb5, 0xed, 0x6e, 0x37, 0x79, 0x03, 0x9b, 0x5b, 0x5c, 0xba, 0x78, 0x78, 0x50, + 0x7e, 0x25, 0x92, 0x38, 0x0e, 0x8f, 0x91, 0x1c, 0x2e, 0xb1, 0x34, 0xce, 0x7d, 0x39, 0x09, 0x49, + 0x4a, 0x75, 0x2b, 0x3e, 0xc2, 0x48, 0x21, 0x01, 0x25, 0xa9, 0x78, 0x34, 0xc4, 0x1e, 0xa6, 0x7f, + 0xa6, 0x4e, 0x60, 0xfd, 0xdf, 0xb9, 0xe4, 0x00, 0x66, 0xef, 0xc2, 0x38, 0xad, 0x18, 0x6d, 0x5e, + 0xe0, 0x0e, 0xaa, 0x96, 0x57, 0x6a, 0x64, 0x75, 0x74, 0x71, 0xef, 0xaf, 0x2c, 0xaf, 0x69, 0x73, + 0x03, 0xef, 0xfd, 0x6e, 0xbd, 0x99, 0xa6, 0x52, 0x68, 0x62, 0x12, 0x6c, 0xad, 0xd5, 0xcc, 0x5e, + 0xc1, 0x49, 0x10, 0x35, 0xc3, 0x8c, 0x6e, 0xd0, 0x90, 0x3f, 0x79, 0xc3, 0xff, 0x87, 0x5c, 0xd6, + 0x39, 0xcf, 0x96, 0x60, 0xf2, 0x81, 0x1f, 0x3c, 0xc4, 0xf1, 0xd5, 0x3a, 0x01, 0x47, 0xfe, 0xb1, + 0x2a, 0x48, 0x37, 0xc8, 0x24, 0xd1, 0xbf, 0x4d, 0xeb, 0x0d, 0xf3, 0xdb, 0x52, 0x1c, 0x0c, 0x02, + 0x31, 0x0e, 0x31, 0xc7, 0x78, 0x75, 0xe0, 0x38, 0x24, 0x9f, 0x60, 0x4c, 0x61, 0x1d, 0xdd, 0xfa, + 0x2f, 0x73, 0xfa, 0x79, 0x2e, 0x3a, 0x79, 0xc5, 0x6f, 0xb9, 0x5e, 0x5b, 0x6b, 0x8e, 0x7c, 0x58, + 0x42, 0x68, 0xfa, 0x4b, 0x34, 0x64, 0x76, 0x0d, 0x8a, 0xf2, 0x57, 0xbc, 0xd7, 0xa2, 0x56, 0x8b, + 0x08, 0xcd, 0x83, 0x42, 0x21, 0xf6, 0x8c, 0x4c, 0xe1, 0xa4, 0x23, 0xf3, 0x6b, 0x39, 0xfd, 0x28, + 0xfe, 0xb8, 0x87, 0x4d, 0xea, 0x90, 0xc9, 0x9f, 0xe4, 0x90, 0xf9, 0xc4, 0x4d, 0xf8, 0x81, 0x1c, + 0x8c, 0x6b, 0x5a, 0x0a, 0xd1, 0x86, 0xcd, 0xc0, 0xff, 0x88, 0xd7, 0x23, 0xb3, 0x0d, 0x1d, 0x09, + 0x4c, 0xb5, 0x21, 0x46, 0xfd, 0x04, 0x6d, 0xb0, 0xfe, 0x24, 0x47, 0x77, 0xa4, 0x81, 0xb7, 0x79, + 0x73, 0x4b, 0xce, 0x9f, 0xe4, 0x88, 0xfc, 0x02, 0x0c, 0xdb, 0xbc, 0xe1, 0x85, 0x74, 0xbf, 0x99, + 0xd1, 0xef, 0x63, 0x58, 0x90, 0xc8, 0x4d, 0x81, 0xf8, 0xa9, 0x9f, 0x6f, 0x58, 0x2e, 0x04, 0xd9, + 0x6a, 0x78, 0xa3, 0xc9, 0x9f, 0x78, 0x72, 0x31, 0xd2, 0x51, 0x8b, 0xc7, 0x9b, 0x17, 0x3a, 0x3b, + 0xa2, 0x84, 0x24, 0x6a, 0x7d, 0xe1, 0x19, 0x34, 0xd6, 0x87, 0x00, 0x49, 0x95, 0xec, 0x0e, 0x94, + 0x68, 0x36, 0x78, 0xed, 0x5d, 0x29, 0x48, 0x51, 0x1f, 0x94, 0x0f, 0x0f, 0xca, 0xcf, 0xd7, 0xe3, + 0x32, 0x92, 0x3a, 0x35, 0xbe, 0x3d, 0x84, 0xd6, 0x7f, 0x98, 0x87, 0x7c, 0x05, 0x07, 0xe4, 0x0e, + 0xdf, 0x8f, 0xdc, 0xed, 0x1b, 0x5e, 0xd3, 0x58, 0x4c, 0x0f, 0x11, 0xea, 0xec, 0x78, 0x86, 0xba, + 0x42, 0x43, 0x16, 0x8b, 0xe9, 0x4e, 0xb0, 0xfd, 0x16, 0x12, 0x6a, 0x8b, 0xe9, 0x61, 0xb0, 0xfd, + 0x56, 0x9a, 0x2c, 0x46, 0x64, 0x16, 0x8c, 0xc8, 0x85, 0x45, 0x73, 0x10, 0x0e, 0x0f, 0xca, 0x23, + 0x72, 0xfd, 0xd9, 0x54, 0xc2, 0xce, 0x42, 0xa1, 0xb6, 0xb9, 0x4e, 0x3b, 0x20, 0xaa, 0x05, 0xc3, + 0x4e, 0xdb, 0x16, 0x30, 0x51, 0xe7, 0xda, 0x4a, 0x65, 0x13, 0x15, 0x01, 0xc3, 0x49, 0x9d, 0xcd, + 0x86, 0xdb, 0x49, 0xab, 0x02, 0x62, 0x44, 0xf6, 0x1e, 0x8c, 0xdf, 0x59, 0x59, 0xbe, 0xe5, 0x87, + 0x72, 0xf7, 0x1a, 0x49, 0x26, 0xff, 0xc3, 0x46, 0xdd, 0x41, 0x4d, 0x7c, 0xfa, 0x18, 0xd0, 0xf0, + 0xad, 0x1f, 0xca, 0xc3, 0xb8, 0xa6, 0x27, 0x63, 0x9f, 0xa1, 0x07, 0xd2, 0x9c, 0x71, 0x03, 0xd0, + 0x30, 0x44, 0xa9, 0x54, 0xaa, 0xb4, 0xfc, 0x06, 0xa7, 0xe7, 0xd2, 0x44, 0x81, 0x91, 0x1f, 0x44, + 0x81, 0xf1, 0x36, 0x80, 0x9c, 0x03, 0xf8, 0xc9, 0x9a, 0x38, 0xa1, 0xd9, 0x49, 0xe8, 0xe3, 0x92, + 0x20, 0xb3, 0xfb, 0x30, 0xbb, 0x15, 0x74, 0xc3, 0xa8, 0xb6, 0x1f, 0x46, 0xbc, 0x25, 0xb8, 0x6d, + 0xfa, 0x7e, 0x93, 0xe6, 0xdf, 0x2b, 0x87, 0x07, 0xe5, 0xf3, 0x91, 0x28, 0x76, 0x42, 0x2c, 0xc7, + 0x0f, 0x70, 0x3a, 0xbe, 0xaf, 0xab, 0x35, 0xb2, 0x18, 0x58, 0x36, 0x4c, 0xe8, 0x4a, 0x11, 0x71, + 0xb2, 0xd0, 0x63, 0x12, 0xa9, 0xba, 0xb5, 0x93, 0x85, 0xbe, 0xb2, 0xf7, 0x71, 0xcb, 0x24, 0xb1, + 0x3e, 0xa3, 0x2b, 0xe4, 0x06, 0x5d, 0xd8, 0xd6, 0x5f, 0xcd, 0x25, 0xdb, 0xc8, 0xfd, 0xab, 0xec, + 0x1d, 0x18, 0x91, 0x8f, 0x77, 0xf4, 0xc6, 0x79, 0x2a, 0xbe, 0xd4, 0xea, 0x2f, 0x7b, 0x52, 0x13, + 0xfe, 0xbb, 0xf2, 0x81, 0xff, 0x39, 0x9b, 0x48, 0x62, 0x25, 0xba, 0xa9, 0x4f, 0x53, 0xdc, 0x51, + 0x5d, 0x7c, 0x35, 0x4b, 0x89, 0x6e, 0xfd, 0xc6, 0x10, 0x4c, 0x99, 0x68, 0xfa, 0x0b, 0x5f, 0x6e, + 0xa0, 0x17, 0xbe, 0x2f, 0x40, 0x51, 0xf4, 0x87, 0x57, 0xe7, 0x4a, 0x22, 0x7b, 0x05, 0x9f, 0x16, + 0x08, 0x66, 0xbc, 0x5c, 0x83, 0x1c, 0x0e, 0x71, 0xc7, 0xb5, 0x63, 0x2a, 0xb6, 0xa8, 0x3d, 0x43, + 0x15, 0x12, 0x21, 0x45, 0x3d, 0x43, 0xe9, 0xeb, 0x21, 0x7e, 0x90, 0x7a, 0x13, 0x46, 0x84, 0x7c, + 0x1f, 0xab, 0x60, 0xf0, 0x2b, 0x85, 0xe8, 0x9f, 0x32, 0x51, 0x91, 0x48, 0xec, 0x01, 0x14, 0xd7, + 0xdc, 0x30, 0xaa, 0x71, 0xde, 0x1e, 0xe0, 0xed, 0xbe, 0x4c, 0x5d, 0x35, 0x8b, 0x0f, 0xe3, 0x21, + 0xe7, 0xed, 0xd4, 0xe3, 0x6b, 0xcc, 0x8c, 0x7d, 0x15, 0x60, 0xd9, 0x6f, 0x47, 0x81, 0xdf, 0x5c, + 0xf3, 0x77, 0xe7, 0x47, 0xf0, 0xee, 0xfb, 0x62, 0x6a, 0x00, 0x12, 0x04, 0x79, 0xfd, 0x8d, 0x15, + 0x3c, 0x75, 0x59, 0xe0, 0x34, 0xfd, 0x5d, 0x7d, 0x1d, 0x24, 0xf8, 0xec, 0x06, 0x94, 0x94, 0x62, + 0xe1, 0x5e, 0x67, 0x37, 0xc0, 0x09, 0x32, 0x9a, 0x48, 0x1e, 0xfc, 0x49, 0xe4, 0x74, 0x09, 0xae, + 0xef, 0x94, 0x69, 0x1a, 0xf6, 0x15, 0x38, 0x93, 0x86, 0xa9, 0x51, 0x2e, 0x26, 0x32, 0xb9, 0xce, + 0x2e, 0x63, 0xde, 0xf7, 0x63, 0x61, 0x7d, 0x27, 0x0f, 0x67, 0xfa, 0x34, 0x56, 0xac, 0x07, 0x3c, + 0xae, 0xb5, 0xf5, 0x90, 0x3a, 0xa5, 0xa5, 0xcd, 0xd1, 0x79, 0xc8, 0xd3, 0x01, 0x37, 0xb4, 0x54, + 0x3a, 0x3c, 0x28, 0x4f, 0x18, 0xe3, 0x98, 0xaf, 0xae, 0xb0, 0xdb, 0x30, 0x24, 0x86, 0x68, 0x80, + 0xa7, 0x73, 0xa5, 0x53, 0x9a, 0x8a, 0x3c, 0x7d, 0xfa, 0xe0, 0xd0, 0x21, 0x0f, 0xf6, 0x19, 0x28, + 0x6c, 0x6d, 0xad, 0xe1, 0xdc, 0x29, 0x60, 0xdb, 0x27, 0xa3, 0xa8, 0x69, 0x4c, 0xd5, 0x49, 0x41, + 0x7b, 0x39, 0xb6, 0xb4, 0x10, 0xe8, 0xec, 0x4b, 0x29, 0x93, 0x9e, 0xd7, 0x8f, 0x1e, 0xe8, 0xc1, + 0x2d, 0x7c, 0x3e, 0x81, 0x61, 0x8d, 0xf5, 0xd3, 0xf9, 0x64, 0x0d, 0xdf, 0xf0, 0x9a, 0x11, 0x0f, + 0xd8, 0x82, 0x5c, 0x92, 0x89, 0x70, 0x66, 0xc7, 0xbf, 0xd9, 0x7c, 0xb2, 0xbe, 0x25, 0xab, 0x78, + 0x21, 0xbf, 0xae, 0x2d, 0xe4, 0x02, 0x2e, 0xe4, 0xa9, 0xbe, 0x4b, 0xf6, 0xf5, 0x8c, 0x79, 0x89, + 0x0b, 0x31, 0x63, 0xee, 0xbd, 0x02, 0x93, 0xeb, 0xfe, 0xea, 0x93, 0x28, 0x46, 0x14, 0x0b, 0xb0, + 0x68, 0x9b, 0x40, 0xc1, 0x71, 0xa3, 0xd9, 0xe0, 0xc1, 0xd6, 0x9e, 0xdb, 0x36, 0xde, 0xae, 0xed, + 0x1e, 0xb8, 0xc0, 0x5d, 0xe7, 0x8f, 0x4d, 0xdc, 0x51, 0x89, 0x9b, 0x86, 0x5b, 0x3f, 0x98, 0x57, + 0x9d, 0x71, 0x7f, 0xf1, 0x19, 0x7d, 0x23, 0x7d, 0xcb, 0x78, 0x23, 0x9d, 0x8d, 0xb5, 0xbb, 0xf1, + 0x83, 0xff, 0xe2, 0x31, 0x76, 0x02, 0xff, 0xe3, 0x30, 0x4c, 0xe8, 0xe8, 0xa2, 0x1f, 0x2a, 0x8d, + 0x46, 0xa0, 0xf7, 0x83, 0xdb, 0x68, 0x04, 0x36, 0x42, 0x0d, 0xb3, 0x80, 0xc2, 0x91, 0x66, 0x01, + 0x5f, 0x83, 0xb1, 0xe5, 0x56, 0xc3, 0x78, 0xac, 0xb4, 0x32, 0x3e, 0xef, 0x72, 0x8c, 0x24, 0xd7, + 0x42, 0xac, 0xb4, 0xac, 0xb7, 0x1a, 0xbd, 0x4f, 0x94, 0x09, 0x4b, 0xc3, 0xa2, 0x60, 0xf8, 0x93, + 0x58, 0x14, 0x5c, 0x87, 0xb1, 0x7b, 0x21, 0xdf, 0xea, 0xb6, 0xdb, 0xbc, 0x89, 0xd3, 0xaa, 0x28, + 0x65, 0xfd, 0x6e, 0xc8, 0x9d, 0x08, 0xa1, 0xfa, 0x07, 0xc4, 0xa8, 0xfa, 0x00, 0x8f, 0x1e, 0x31, + 0xc0, 0xd7, 0xa0, 0xb8, 0xc9, 0x79, 0x80, 0x7d, 0x3a, 0x9e, 0x88, 0x74, 0x1d, 0xce, 0x03, 0x47, + 0x74, 0xac, 0x61, 0x69, 0x40, 0x88, 0x86, 0x79, 0xc2, 0xc4, 0x80, 0xe6, 0x09, 0xec, 0x25, 0x98, + 0xe8, 0x74, 0xb7, 0x9b, 0x5e, 0x1d, 0xf9, 0x92, 0x5d, 0x83, 0x3d, 0x2e, 0x61, 0x82, 0x6d, 0xc8, + 0xbe, 0x04, 0x93, 0x78, 0xc7, 0x89, 0xa7, 0xdc, 0x94, 0xf1, 0xaa, 0x67, 0x94, 0x49, 0x49, 0xa7, + 0x2e, 0x40, 0x4e, 0x86, 0xf9, 0x8d, 0xc9, 0x68, 0xa1, 0x06, 0x53, 0xe6, 0x48, 0x3e, 0x85, 0xc7, + 0xbd, 0xd8, 0xd4, 0xa2, 0x58, 0x1a, 0xbb, 0x3d, 0x54, 0x84, 0xd2, 0xb8, 0x34, 0xb2, 0xb0, 0x61, + 0x33, 0x6e, 0x93, 0xcd, 0xee, 0x74, 0xb7, 0x79, 0xd0, 0xe6, 0x11, 0x0f, 0xe9, 0x12, 0x10, 0xda, + 0x43, 0x95, 0x4e, 0x27, 0xb4, 0xfe, 0xd3, 0x3c, 0x8c, 0x56, 0x1e, 0xd4, 0xaa, 0xed, 0x1d, 0x1f, + 0x9f, 0xe8, 0xe2, 0x97, 0x19, 0xfd, 0x89, 0x2e, 0x7e, 0x99, 0xd1, 0xdf, 0x63, 0xae, 0x64, 0x5c, + 0xe3, 0xd0, 0x8a, 0x57, 0xbb, 0xc6, 0x19, 0x17, 0xd0, 0xe4, 0x91, 0xaa, 0x30, 0xc0, 0x23, 0x55, + 0xac, 0x47, 0x1c, 0x3a, 0x5e, 0x8f, 0xf8, 0x0e, 0x8c, 0x57, 0xdb, 0x11, 0xdf, 0x0d, 0x92, 0x99, + 0x1e, 0x5f, 0x29, 0x63, 0xb0, 0x2e, 0xda, 0x6b, 0xd8, 0x62, 0x1a, 0x49, 0xdd, 0x65, 0xac, 0xb3, + 0xc4, 0x69, 0x24, 0x55, 0x9c, 0x29, 0x7d, 0x80, 0x42, 0xb4, 0x56, 0x52, 0x73, 0x44, 0x19, 0x02, + 0x48, 0xe1, 0x73, 0x2a, 0x51, 0xde, 0x8b, 0x8e, 0x5d, 0x9a, 0xc9, 0x36, 0x04, 0xb0, 0x7e, 0x38, + 0x0f, 0xe3, 0x95, 0x4e, 0xe7, 0x19, 0x37, 0xc7, 0xfa, 0x9c, 0xb1, 0xbd, 0xaa, 0xbb, 0x50, 0xdc, + 0xae, 0x81, 0x2c, 0xb1, 0x7e, 0x21, 0x0f, 0xd3, 0x29, 0x0a, 0xfd, 0xeb, 0x73, 0x03, 0x1a, 0x61, + 0xe5, 0x07, 0x34, 0xc2, 0x2a, 0x0c, 0x66, 0x84, 0x35, 0xf4, 0x49, 0xb6, 0xcc, 0xd7, 0xa0, 0x50, + 0xe9, 0x74, 0xd2, 0x8f, 0xb9, 0x9d, 0xce, 0xfd, 0x6b, 0xf2, 0x3e, 0xeb, 0x76, 0x3a, 0xb6, 0xc0, + 0x30, 0xf6, 0xb1, 0x91, 0x01, 0xf7, 0x31, 0xeb, 0x4d, 0x18, 0x43, 0x5e, 0x68, 0xfa, 0x74, 0x1e, + 0x70, 0x31, 0x93, 0xd5, 0x93, 0x51, 0x17, 0x2d, 0xf3, 0x7f, 0x91, 0x83, 0x61, 0xfc, 0xfd, 0x8c, + 0xce, 0xb1, 0x45, 0x63, 0x8e, 0x95, 0xb4, 0x39, 0x36, 0xc8, 0xec, 0xfa, 0x87, 0x05, 0x80, 0xe5, + 0x0d, 0xbb, 0x26, 0xd5, 0x1e, 0xec, 0x06, 0x4c, 0xbb, 0xcd, 0xa6, 0xff, 0x98, 0x37, 0x1c, 0x3f, + 0xf0, 0x76, 0xbd, 0xb6, 0xec, 0x39, 0xf5, 0xc2, 0x68, 0x16, 0xe9, 0xef, 0x0e, 0x54, 0xb4, 0x21, + 0x4b, 0x74, 0x3e, 0x2d, 0x1e, 0xed, 0xf9, 0x0d, 0x75, 0x81, 0x33, 0xf8, 0x50, 0x51, 0x06, 0x9f, + 0xbb, 0xb2, 0x44, 0xe7, 0xb3, 0x87, 0x17, 0x52, 0x25, 0x3f, 0x1a, 0x7c, 0xa8, 0x28, 0x83, 0x8f, + 0xbc, 0xc5, 0x86, 0x6c, 0x0d, 0x66, 0x10, 0xe2, 0xd4, 0x03, 0xde, 0xe0, 0xed, 0xc8, 0x73, 0x9b, + 0x21, 0x5d, 0xf9, 0x51, 0x39, 0xd4, 0x53, 0xa8, 0x5f, 0x79, 0xb0, 0x70, 0x39, 0x29, 0x63, 0x97, + 0x61, 0xb4, 0xe5, 0x3e, 0x71, 0xdc, 0x5d, 0xf9, 0xd6, 0x3e, 0x29, 0xaf, 0x88, 0x04, 0xd2, 0x37, + 0xec, 0x96, 0xfb, 0xa4, 0xb2, 0xcb, 0x45, 0x2b, 0xf8, 0x93, 0x8e, 0x1f, 0x6a, 0xad, 0x18, 0x49, + 0x5a, 0x91, 0x2a, 0xd2, 0x5b, 0x41, 0x45, 0xd4, 0x0a, 0xeb, 0xff, 0x19, 0xc6, 0xa9, 0x4d, 0x9b, + 0x00, 0x99, 0x87, 0xe5, 0x32, 0xcc, 0xc3, 0xde, 0x06, 0xed, 0x88, 0xd3, 0x55, 0x7b, 0xda, 0x01, + 0xaf, 0x5f, 0x0b, 0x13, 0x64, 0xf6, 0x30, 0x6d, 0x28, 0x56, 0xc0, 0x95, 0xf3, 0x72, 0x7a, 0x5e, + 0x3d, 0x15, 0x1b, 0xb1, 0x5b, 0xc0, 0xaa, 0x6d, 0x7c, 0xcd, 0xe2, 0xb5, 0x87, 0x5e, 0xe7, 0x3e, + 0x0f, 0xbc, 0x9d, 0x7d, 0x1a, 0x17, 0x14, 0xa2, 0x3c, 0x2a, 0x75, 0xc2, 0x87, 0x5e, 0x47, 0xdc, + 0x1b, 0xbd, 0x9d, 0x7d, 0x3b, 0x83, 0x86, 0x7d, 0x00, 0xa3, 0x36, 0x7f, 0x1c, 0x78, 0x91, 0x32, + 0x7f, 0x98, 0x8a, 0xb5, 0x1c, 0x08, 0x95, 0x43, 0x14, 0xc8, 0x1f, 0xfa, 0x62, 0xa5, 0x72, 0xb6, + 0x28, 0x4f, 0x29, 0x69, 0xe6, 0x30, 0x99, 0xb4, 0xb6, 0xf2, 0xa0, 0xd6, 0xef, 0x90, 0x62, 0x97, + 0x60, 0x18, 0x8f, 0x3a, 0x12, 0xe0, 0xd0, 0x6d, 0x00, 0x05, 0x1e, 0xfd, 0x1c, 0x46, 0x0c, 0xf6, + 0x22, 0x40, 0xfc, 0x5c, 0x14, 0xce, 0x17, 0x51, 0xb4, 0xd2, 0x20, 0xe9, 0x73, 0x7a, 0xec, 0x44, + 0xe7, 0xf4, 0x1a, 0x94, 0x6c, 0xfe, 0x8d, 0xae, 0x17, 0xf0, 0x46, 0xa5, 0x83, 0x6f, 0x12, 0xe1, + 0x3c, 0xe0, 0x04, 0x3b, 0x7f, 0x78, 0x50, 0x7e, 0x21, 0xa0, 0x32, 0xc7, 0xed, 0xc8, 0xa7, 0x0c, + 0x63, 0x76, 0xa7, 0x29, 0xd9, 0xdb, 0x30, 0x24, 0x76, 0x04, 0x32, 0x29, 0x53, 0xba, 0xdd, 0x64, + 0x93, 0x90, 0x37, 0xed, 0xba, 0x6f, 0x4c, 0x55, 0x24, 0xf9, 0xee, 0x99, 0x69, 0xfd, 0x42, 0x1e, + 0x5e, 0x8e, 0x0f, 0xc1, 0x8d, 0xa0, 0x56, 0xb9, 0xbb, 0x56, 0x6d, 0x6c, 0xd2, 0x9d, 0x71, 0x33, + 0xf0, 0x1f, 0x79, 0x0d, 0x1e, 0xdc, 0xbf, 0x7a, 0xcc, 0x16, 0xbe, 0x26, 0x97, 0x8f, 0x54, 0x38, + 0xe7, 0x0d, 0x83, 0x16, 0x4d, 0xd6, 0x20, 0x9b, 0x9b, 0x4e, 0xa7, 0x47, 0xff, 0x7c, 0xeb, 0x39, + 0x3b, 0x61, 0xc0, 0xfe, 0x6a, 0x0e, 0x4e, 0x67, 0x7f, 0x08, 0xe9, 0x11, 0xca, 0xea, 0xbe, 0xd2, + 0xe7, 0x6b, 0x97, 0x5e, 0x3b, 0x3c, 0x28, 0xbf, 0x1c, 0xba, 0xad, 0xa6, 0xe3, 0x35, 0x64, 0x6d, + 0x5e, 0x9d, 0x3b, 0x1d, 0x42, 0x30, 0xea, 0xed, 0x53, 0xd3, 0xe7, 0x41, 0xed, 0xe4, 0xf3, 0xb9, + 0x25, 0x80, 0xa2, 0xd2, 0xe9, 0x59, 0xbf, 0x9c, 0x03, 0x6d, 0x6a, 0x17, 0x6d, 0xde, 0xf0, 0x02, + 0x5e, 0x8f, 0x68, 0x37, 0x27, 0x77, 0x1c, 0x09, 0x4b, 0xd9, 0x2f, 0x21, 0x8c, 0xbd, 0x0f, 0xa3, + 0xb4, 0xeb, 0xe0, 0xc6, 0x9d, 0x2c, 0x09, 0xd2, 0x16, 0x4a, 0xbf, 0xad, 0x9e, 0x1d, 0x4b, 0x11, + 0x89, 0x5b, 0xd1, 0xed, 0x07, 0x5b, 0xcb, 0x4d, 0xd7, 0x6b, 0x85, 0x74, 0xfa, 0x61, 0xb7, 0x7e, + 0xf4, 0x38, 0x72, 0xea, 0x08, 0xd5, 0x6f, 0x45, 0x31, 0xaa, 0x75, 0x53, 0x29, 0x2b, 0x8f, 0x31, + 0xc2, 0x2b, 0xc3, 0xf0, 0xfd, 0x44, 0x69, 0xb1, 0x34, 0x76, 0x78, 0x50, 0x96, 0xd3, 0xc5, 0x96, + 0x70, 0xeb, 0x6f, 0xe6, 0x60, 0xca, 0x9c, 0x4f, 0xec, 0x32, 0x8c, 0x90, 0x2b, 0x4c, 0x0e, 0x95, + 0x33, 0xa2, 0x17, 0x46, 0xa4, 0x13, 0x8c, 0xe1, 0xfa, 0x42, 0x58, 0xe2, 0xfc, 0x26, 0x0e, 0x74, + 0x78, 0xe1, 0xf9, 0x5d, 0x97, 0x20, 0x5b, 0x95, 0x31, 0x4b, 0x08, 0xef, 0x61, 0xb7, 0x19, 0xe9, + 0x3a, 0xfb, 0x00, 0x21, 0x36, 0x95, 0x58, 0xcb, 0x30, 0x22, 0xf7, 0x92, 0x94, 0xf1, 0x4f, 0xee, + 0x04, 0xc6, 0x3f, 0xd6, 0x41, 0x0e, 0xa0, 0x56, 0xbb, 0x75, 0x87, 0xef, 0x6f, 0xba, 0x5e, 0x80, + 0x8f, 0x4c, 0xb8, 0x6f, 0xdf, 0xa1, 0xc5, 0x35, 0x41, 0x8f, 0x4c, 0x72, 0x8f, 0x7f, 0xc8, 0xf7, + 0x8d, 0x47, 0x26, 0x85, 0x8a, 0x87, 0x43, 0xe0, 0x3d, 0x72, 0x23, 0x2e, 0x08, 0xf3, 0x48, 0x28, + 0x0f, 0x07, 0x09, 0x4d, 0x51, 0x6a, 0xc8, 0xec, 0xab, 0x30, 0x95, 0xfc, 0x8a, 0x9f, 0xca, 0xa6, + 0xe2, 0x05, 0x6c, 0x16, 0x2e, 0xbd, 0x78, 0x78, 0x50, 0x5e, 0xd0, 0xb8, 0xa6, 0x1f, 0xd1, 0x52, + 0xcc, 0xac, 0x9f, 0xcb, 0xe1, 0x03, 0xb1, 0x6a, 0xe0, 0x05, 0x18, 0x8a, 0x4d, 0x1a, 0x27, 0x68, + 0xd7, 0x31, 0x9f, 0x03, 0xb0, 0x9c, 0xbd, 0x0c, 0x85, 0xa4, 0x25, 0xb8, 0x57, 0x9b, 0x2d, 0x10, + 0xa5, 0xec, 0x26, 0x8c, 0x0e, 0xf4, 0xcd, 0xb8, 0x34, 0x32, 0xbe, 0x55, 0x51, 0xe3, 0x28, 0xdc, + 0x7e, 0xb0, 0xf5, 0xbd, 0x3b, 0x0a, 0x3f, 0x96, 0x87, 0x69, 0xd1, 0xaf, 0x95, 0x6e, 0xb4, 0xe7, + 0x07, 0x5e, 0xb4, 0xff, 0xcc, 0x6a, 0xb7, 0xde, 0x35, 0x44, 0xe3, 0x05, 0x75, 0xca, 0xe8, 0x6d, + 0x1b, 0x48, 0xc9, 0xf5, 0x5f, 0x0f, 0xc3, 0x6c, 0x06, 0x15, 0x7b, 0xc3, 0x50, 0x40, 0xcf, 0x2b, + 0x57, 0xd7, 0xef, 0x1c, 0x94, 0x27, 0x14, 0xfa, 0x56, 0xe2, 0xfa, 0xba, 0x68, 0x5a, 0x5b, 0xc8, + 0x9e, 0x42, 0x7d, 0xb4, 0x6e, 0x6d, 0x61, 0xda, 0x58, 0x5c, 0x82, 0x61, 0xdb, 0x6f, 0x72, 0x65, + 0x61, 0x84, 0x12, 0x46, 0x20, 0x00, 0xc6, 0x8b, 0xaa, 0x00, 0xb0, 0x5b, 0x30, 0x2a, 0xfe, 0xb8, + 0xeb, 0x76, 0xe8, 0xad, 0x80, 0xc5, 0x97, 0x33, 0x84, 0x76, 0xbc, 0xf6, 0xae, 0x7e, 0x3f, 0x6b, + 0x72, 0xa7, 0xe5, 0x76, 0x0c, 0x51, 0x48, 0x22, 0x1a, 0xf7, 0xbc, 0x62, 0xff, 0x7b, 0x5e, 0xee, + 0xd8, 0x7b, 0xde, 0x0e, 0x40, 0xcd, 0xdb, 0x6d, 0x7b, 0xed, 0xdd, 0x4a, 0x73, 0x97, 0x1c, 0x86, + 0x2f, 0xf5, 0x1f, 0x85, 0xcb, 0x09, 0x32, 0x4e, 0xdc, 0xe7, 0xf1, 0x41, 0x4f, 0xc2, 0x1c, 0xb7, + 0xb9, 0x6b, 0x38, 0x36, 0x68, 0x9c, 0xd9, 0x3a, 0x40, 0xa5, 0x1e, 0x79, 0x8f, 0xc4, 0x14, 0x0e, + 0x49, 0x6e, 0x51, 0x9f, 0xbc, 0x5c, 0xb9, 0xc3, 0xf7, 0x6b, 0x3c, 0x4a, 0x9e, 0x46, 0x5c, 0x44, + 0x15, 0x2b, 0xc1, 0xb0, 0x5a, 0x4f, 0x38, 0xb0, 0x0e, 0x9c, 0xaa, 0x34, 0x1a, 0x9e, 0x68, 0x83, + 0xdb, 0xc4, 0xb7, 0x3e, 0xde, 0x40, 0xd6, 0x13, 0xd9, 0xac, 0x2f, 0x11, 0xeb, 0x97, 0xdc, 0x98, + 0xca, 0x89, 0x24, 0x59, 0xba, 0x9a, 0x6c, 0xc6, 0x56, 0x0d, 0xa6, 0xcc, 0xc6, 0x9b, 0x8e, 0xce, + 0x13, 0x50, 0xb4, 0x6b, 0x15, 0xa7, 0x76, 0xab, 0x72, 0xb5, 0x94, 0x63, 0x25, 0x98, 0xa0, 0x5f, + 0x8b, 0xce, 0xe2, 0x5b, 0xd7, 0x4b, 0x79, 0x03, 0xf2, 0xd6, 0xd5, 0xc5, 0x52, 0x61, 0x21, 0x3f, + 0x9f, 0x4b, 0xf9, 0x18, 0x8d, 0x96, 0x8a, 0x52, 0x09, 0x66, 0xfd, 0x62, 0x0e, 0x8a, 0xea, 0xdb, + 0xd9, 0x75, 0x28, 0xd4, 0x6a, 0xb7, 0x52, 0x5e, 0x41, 0xc9, 0x29, 0x23, 0xf7, 0xd3, 0x30, 0xd4, + 0x4d, 0x3f, 0x05, 0x81, 0xa0, 0xdb, 0x5a, 0xab, 0x91, 0x70, 0xa0, 0xe8, 0x92, 0xcd, 0x5b, 0xd2, + 0x65, 0xb8, 0x4a, 0x5c, 0x87, 0xc2, 0xed, 0x07, 0x5b, 0x74, 0xab, 0x50, 0x74, 0xc9, 0x7e, 0x2a, + 0xe9, 0x3e, 0x7a, 0xac, 0xef, 0xf2, 0x82, 0xc0, 0xb2, 0x61, 0x5c, 0x9b, 0xc8, 0xf2, 0xd0, 0x6d, + 0xf9, 0xb1, 0x77, 0x2f, 0x1d, 0xba, 0x02, 0x62, 0x53, 0x89, 0x90, 0x11, 0xd6, 0xfc, 0xba, 0xdb, + 0xa4, 0xd3, 0x1b, 0x65, 0x84, 0xa6, 0x00, 0xd8, 0x12, 0x6e, 0xfd, 0x7a, 0x0e, 0x4a, 0x28, 0x49, + 0xa1, 0xe9, 0xa6, 0xff, 0x90, 0xb7, 0xef, 0x5f, 0x65, 0x6f, 0xaa, 0x25, 0x97, 0x8b, 0x15, 0x0e, + 0xc3, 0xb8, 0xe4, 0x52, 0x2f, 0x16, 0xb4, 0xec, 0x34, 0x07, 0xea, 0xfc, 0xe0, 0x8e, 0x97, 0xc7, + 0x38, 0x50, 0x97, 0x61, 0x18, 0x3f, 0x87, 0x36, 0x47, 0xfc, 0xf2, 0x48, 0x00, 0x6c, 0x09, 0xd7, + 0xf6, 0xa6, 0x1f, 0xcf, 0xf7, 0xb4, 0x61, 0xf1, 0x7b, 0xca, 0x79, 0xd1, 0x6c, 0xdc, 0x40, 0xfb, + 0xf5, 0x87, 0x30, 0x97, 0xee, 0x12, 0x54, 0x06, 0x55, 0x60, 0xda, 0x84, 0x2b, 0xbd, 0xd0, 0x99, + 0xcc, 0xba, 0xee, 0x2f, 0xda, 0x69, 0x7c, 0xeb, 0x7f, 0xcd, 0xc1, 0x18, 0xfe, 0x69, 0x77, 0x9b, + 0x68, 0x42, 0x53, 0x79, 0x50, 0x23, 0xc5, 0xaf, 0x2e, 0xcc, 0xb9, 0x8f, 0x43, 0x87, 0x74, 0xc3, + 0xc6, 0x1e, 0x13, 0x23, 0x13, 0xa9, 0xd4, 0xe8, 0x2a, 0xe5, 0x48, 0x4c, 0x2a, 0x55, 0xbf, 0x61, + 0x8a, 0x94, 0x90, 0xd1, 0xf0, 0xee, 0x41, 0x4d, 0x4c, 0x3f, 0xfd, 0x4d, 0x1b, 0xe9, 0xfc, 0xa6, + 0x69, 0x78, 0x27, 0xd1, 0xf0, 0x49, 0xfb, 0x41, 0xad, 0x62, 0xaf, 0x1b, 0x4f, 0xda, 0xe2, 0x1b, + 0x0d, 0x3b, 0x71, 0x42, 0xb2, 0xfe, 0x09, 0xa4, 0x3b, 0x90, 0x0e, 0xbc, 0x13, 0xae, 0x8d, 0x77, + 0x60, 0xb8, 0xd2, 0x6c, 0xfa, 0x8f, 0x69, 0x97, 0x50, 0xba, 0xa9, 0xb8, 0xff, 0xe4, 0x79, 0x86, + 0xea, 0x15, 0xc3, 0x21, 0x4b, 0x00, 0xd8, 0x32, 0x8c, 0x55, 0x1e, 0xd4, 0xaa, 0xd5, 0x95, 0xad, + 0x2d, 0xe9, 0x7c, 0x52, 0x58, 0x7a, 0x55, 0xf5, 0x8f, 0xe7, 0x35, 0x9c, 0xf4, 0xab, 0x6a, 0x22, + 0xbf, 0x27, 0x74, 0xec, 0x3d, 0x80, 0xdb, 0xbe, 0xd7, 0x96, 0xea, 0x24, 0x6a, 0xfc, 0xb9, 0xc3, + 0x83, 0xf2, 0xf8, 0x47, 0xbe, 0xd7, 0x26, 0xfd, 0x93, 0xf8, 0xf6, 0x04, 0xc9, 0xd6, 0xfe, 0x16, + 0x3d, 0xbd, 0xe4, 0x4b, 0xb3, 0x98, 0xe1, 0xa4, 0xa7, 0xb7, 0xfd, 0x1e, 0x8b, 0x18, 0x85, 0xc6, + 0x5a, 0x30, 0x5d, 0xeb, 0xee, 0xee, 0x72, 0xb1, 0xb3, 0x93, 0x02, 0x65, 0x84, 0xee, 0xb8, 0x71, + 0xc8, 0x0f, 0x79, 0x1f, 0x11, 0xb7, 0x94, 0x70, 0xe9, 0x0d, 0x31, 0x91, 0xbf, 0x7d, 0x50, 0xa6, + 0xd7, 0x5a, 0x21, 0xaa, 0x85, 0x8a, 0xbe, 0x57, 0x7d, 0x92, 0xe6, 0xcd, 0x36, 0x60, 0xe4, 0xa6, + 0x17, 0xdd, 0xea, 0x6e, 0x93, 0x33, 0xc5, 0x4b, 0x47, 0x2c, 0x1a, 0x89, 0x28, 0x9f, 0x0b, 0x76, + 0xbd, 0x68, 0xaf, 0xab, 0x9b, 0xb3, 0x13, 0x1b, 0xf6, 0x00, 0x8a, 0xcb, 0x5e, 0x50, 0x6f, 0xf2, + 0xe5, 0x2a, 0x9d, 0xfd, 0x2f, 0x1f, 0xc1, 0x52, 0xa1, 0xca, 0x7e, 0xa9, 0xe3, 0xaf, 0xba, 0xa7, + 0xcb, 0x02, 0x0a, 0x83, 0xfd, 0xdb, 0x39, 0x78, 0x3e, 0xfe, 0xfa, 0xca, 0x2e, 0x6f, 0x47, 0x77, + 0xdd, 0xa8, 0xbe, 0xc7, 0x03, 0xea, 0xa5, 0xb1, 0xa3, 0x7a, 0xe9, 0xf3, 0x3d, 0xbd, 0x74, 0x31, + 0xe9, 0x25, 0x57, 0x30, 0x73, 0x5a, 0x92, 0x5b, 0x6f, 0x9f, 0x1d, 0x55, 0x2b, 0x73, 0x00, 0x92, + 0xf7, 0x1f, 0x72, 0xc6, 0x7b, 0xf5, 0x88, 0x06, 0x27, 0xc8, 0x64, 0x44, 0x1f, 0xff, 0x36, 0xac, + 0xc0, 0x62, 0x28, 0xbb, 0xa3, 0x3c, 0x97, 0xa4, 0x54, 0x72, 0xfe, 0x08, 0xde, 0xd2, 0x9b, 0x69, + 0xf6, 0x08, 0x1f, 0x45, 0x39, 0xda, 0x6b, 0xee, 0x36, 0x09, 0x22, 0xc7, 0x8c, 0xf6, 0x9a, 0x9b, + 0x8c, 0x76, 0xd3, 0x4d, 0x8f, 0xf6, 0x9a, 0xbb, 0xcd, 0x96, 0xa5, 0xbb, 0xa5, 0xf4, 0xcd, 0x7b, + 0xf1, 0x28, 0x6e, 0xcb, 0x9b, 0xf2, 0x64, 0xce, 0x70, 0xbb, 0xfc, 0x32, 0x8c, 0xd5, 0x3a, 0x6e, + 0x9d, 0x37, 0xbd, 0x9d, 0x88, 0x1e, 0x04, 0x5f, 0x39, 0x82, 0x55, 0x8c, 0x4b, 0x8f, 0x49, 0xea, + 0xa7, 0x7e, 0x4d, 0x8a, 0x71, 0xc4, 0x17, 0x6e, 0x6d, 0xde, 0x9d, 0x9f, 0x3e, 0xf6, 0x0b, 0xb7, + 0x36, 0xef, 0x92, 0xcc, 0xd1, 0x69, 0x19, 0x32, 0xc7, 0xe6, 0x5d, 0xd6, 0x81, 0xa9, 0x2d, 0x1e, + 0x04, 0xee, 0x8e, 0x1f, 0xb4, 0xa4, 0xc2, 0x4e, 0xfa, 0x7b, 0x5c, 0x3a, 0x8a, 0x9f, 0x41, 0x20, + 0x35, 0xb5, 0x91, 0x82, 0x39, 0x69, 0x2d, 0x5f, 0x8a, 0xbf, 0xf5, 0x2b, 0x05, 0x38, 0xd3, 0xe7, + 0x2b, 0xd9, 0xba, 0xda, 0x15, 0x73, 0x86, 0x66, 0xb5, 0x0f, 0xfa, 0xe5, 0x63, 0x37, 0xca, 0x35, + 0x28, 0xad, 0xde, 0x41, 0x71, 0x5a, 0xea, 0xbc, 0x97, 0x2b, 0xea, 0x3c, 0x41, 0xed, 0x1f, 0x7f, + 0x88, 0x26, 0x6c, 0x4a, 0x57, 0x5e, 0x37, 0x7c, 0x35, 0x7b, 0x28, 0x17, 0x7e, 0x30, 0x0f, 0x43, + 0x78, 0xb6, 0xa5, 0x22, 0xd4, 0xe4, 0x4e, 0x14, 0xa1, 0xe6, 0x0b, 0x30, 0xb1, 0x7a, 0x47, 0x5e, + 0x76, 0x6f, 0xb9, 0xe1, 0x1e, 0xed, 0xbc, 0xf8, 0x22, 0xcc, 0x1f, 0x3a, 0x74, 0x37, 0xde, 0x73, + 0x0d, 0xb1, 0xd2, 0xa0, 0x60, 0xf7, 0x60, 0x56, 0x7e, 0x9b, 0xb7, 0xe3, 0xd5, 0x65, 0xa0, 0x0b, + 0xcf, 0x6d, 0xd2, 0x36, 0xfc, 0xf2, 0xe1, 0x41, 0xb9, 0xcc, 0x1f, 0xa2, 0x71, 0x1e, 0x95, 0x3b, + 0x21, 0x22, 0xe8, 0x56, 0x7a, 0x19, 0xf4, 0xba, 0xf7, 0xbd, 0x3d, 0x86, 0x15, 0x8a, 0xda, 0x44, + 0xdd, 0x02, 0x57, 0x22, 0x59, 0xbf, 0x3c, 0x0c, 0x0b, 0xfd, 0x77, 0x50, 0xf6, 0x45, 0x73, 0x00, + 0x2f, 0x1c, 0xbb, 0xe7, 0x1e, 0x3f, 0x86, 0x5f, 0x82, 0xb9, 0xd5, 0x76, 0xc4, 0x83, 0x4e, 0xe0, + 0xa9, 0x78, 0x0b, 0xb7, 0xfc, 0x50, 0x19, 0x43, 0xa2, 0x55, 0x22, 0x8f, 0xcb, 0x49, 0x2f, 0x89, + 0xa6, 0x99, 0x1a, 0xab, 0x4c, 0x0e, 0x6c, 0x15, 0xa6, 0x34, 0x78, 0xb3, 0xbb, 0x4b, 0x32, 0x83, + 0x7c, 0x7a, 0xd0, 0x78, 0x36, 0xbb, 0xba, 0xa5, 0x58, 0x8a, 0x68, 0xe1, 0xe7, 0x0a, 0x34, 0x2d, + 0x5e, 0x86, 0x42, 0xad, 0xbb, 0x4d, 0xd3, 0x41, 0x5e, 0x0e, 0x8c, 0x83, 0x44, 0x94, 0xb2, 0xcf, + 0x01, 0xd8, 0xbc, 0xe3, 0x87, 0x5e, 0xe4, 0x07, 0xfb, 0xba, 0xdb, 0x4e, 0x10, 0x43, 0x4d, 0xcb, + 0x62, 0x05, 0x65, 0xb7, 0x60, 0x3a, 0xf9, 0xb5, 0xf1, 0xb8, 0x4d, 0xca, 0xd4, 0x31, 0xa9, 0xc5, + 0x48, 0xc8, 0x1d, 0x5f, 0x94, 0xe9, 0x47, 0x63, 0x8a, 0x8c, 0x2d, 0x42, 0xf1, 0x81, 0x1f, 0x3c, + 0xdc, 0x11, 0x03, 0x35, 0x94, 0x1c, 0xde, 0x8f, 0x09, 0xa6, 0x1f, 0x52, 0x0a, 0x4f, 0xcc, 0xf9, + 0xd5, 0xf6, 0x23, 0x2f, 0xf0, 0xdb, 0x2d, 0xde, 0x8e, 0xf4, 0xd7, 0x72, 0x9e, 0x80, 0x0d, 0x87, + 0xc9, 0x04, 0x2c, 0xee, 0xea, 0x95, 0x7a, 0xe4, 0x07, 0xf4, 0x54, 0x2e, 0x87, 0x5b, 0x00, 0x8c, + 0xe1, 0x16, 0x00, 0xd1, 0x89, 0x36, 0xdf, 0xa1, 0x67, 0x03, 0xec, 0xc4, 0x80, 0xef, 0x18, 0xde, + 0xa0, 0x7c, 0x47, 0x08, 0x1f, 0x36, 0xdf, 0x41, 0x05, 0x83, 0x11, 0x44, 0x69, 0xa7, 0x47, 0x35, + 0x45, 0x68, 0xd6, 0x6f, 0x8d, 0xf5, 0x9d, 0xb7, 0x62, 0xb7, 0x3f, 0xd9, 0xbc, 0x5d, 0x73, 0x07, + 0x98, 0xb7, 0x6f, 0xc4, 0xf6, 0xca, 0xba, 0x0b, 0x34, 0x42, 0xf4, 0xe3, 0x46, 0xe2, 0x2c, 0xfc, + 0x7c, 0xf1, 0x24, 0x93, 0x88, 0x3a, 0x29, 0x3f, 0x68, 0x27, 0x15, 0x06, 0xea, 0x24, 0xb6, 0x04, + 0x93, 0x71, 0x18, 0xae, 0x4d, 0x37, 0x32, 0xf6, 0xa6, 0x38, 0x76, 0x9a, 0xd3, 0x71, 0x23, 0x7d, + 0x6f, 0x32, 0x49, 0xd8, 0xbb, 0x30, 0x4e, 0x46, 0xfb, 0xc8, 0x61, 0x38, 0x31, 0x9b, 0x54, 0x16, + 0xfe, 0x29, 0x7a, 0x1d, 0x5d, 0x2c, 0xc9, 0x4d, 0xaf, 0xc3, 0x9b, 0x5e, 0x9b, 0xd7, 0x50, 0x5b, + 0x4f, 0x33, 0x06, 0x97, 0x64, 0x87, 0x4a, 0x1c, 0xa9, 0xc8, 0x37, 0xf4, 0x74, 0x06, 0x51, 0x7a, + 0xb2, 0x8e, 0x9e, 0x68, 0xb2, 0x4a, 0xab, 0xa5, 0x60, 0xcd, 0xdf, 0xf5, 0x94, 0x9d, 0xa6, 0xb2, + 0x5a, 0x0a, 0x9c, 0xa6, 0x80, 0xa6, 0xac, 0x96, 0x24, 0xaa, 0xb8, 0x49, 0x88, 0x1f, 0xd5, 0x15, + 0x7a, 0xa2, 0xc2, 0x9b, 0x04, 0x12, 0x99, 0xc6, 0xb1, 0x12, 0x49, 0x55, 0xb3, 0xda, 0x72, 0xbd, + 0x26, 0x79, 0xba, 0x26, 0xd5, 0x70, 0x01, 0x4d, 0x57, 0x83, 0xa8, 0xac, 0x0e, 0x13, 0x36, 0xdf, + 0xd9, 0x0c, 0xfc, 0x88, 0xd7, 0x23, 0xde, 0x20, 0xe9, 0x49, 0x5d, 0x20, 0x96, 0x7c, 0x5f, 0x4a, + 0x86, 0x4b, 0x6f, 0xfe, 0xd6, 0x41, 0x39, 0xf7, 0xed, 0x83, 0x32, 0x08, 0x90, 0xb4, 0xbc, 0x3e, + 0x3c, 0x28, 0x9f, 0x11, 0xe3, 0xdf, 0x51, 0xc4, 0xfa, 0x11, 0xa3, 0x33, 0x65, 0xdf, 0x2f, 0x36, + 0xdd, 0xb8, 0x4b, 0x92, 0xca, 0x26, 0xfa, 0x54, 0xf6, 0x56, 0x66, 0x65, 0x65, 0xad, 0xb7, 0x33, + 0x2b, 0xcd, 0xac, 0x84, 0xbd, 0x07, 0xe3, 0xcb, 0xd5, 0x65, 0xbf, 0xbd, 0xe3, 0xed, 0xd6, 0x6e, + 0x55, 0x50, 0x04, 0x23, 0xab, 0xfb, 0xba, 0xe7, 0xd4, 0x11, 0xee, 0x84, 0x7b, 0xae, 0xe1, 0x7c, + 0x95, 0xe0, 0xb3, 0x9b, 0x30, 0xa5, 0x7e, 0xda, 0x7c, 0xe7, 0x9e, 0x5d, 0x45, 0xc9, 0x4b, 0xb9, + 0x3a, 0xc4, 0x1c, 0x44, 0x47, 0x74, 0x03, 0x5d, 0x22, 0x4f, 0x91, 0x89, 0xc9, 0xb8, 0xc2, 0x3b, + 0x4d, 0x7f, 0x5f, 0x7c, 0xde, 0x96, 0xc7, 0x03, 0x94, 0xb5, 0x68, 0x32, 0x36, 0xe2, 0x12, 0x27, + 0xf2, 0x8c, 0xed, 0x36, 0x45, 0xc4, 0xd6, 0x61, 0x86, 0xa6, 0xf8, 0x7d, 0x2f, 0xf4, 0xb6, 0xbd, + 0xa6, 0x17, 0xed, 0xa3, 0x94, 0x45, 0x52, 0x88, 0x5a, 0x17, 0x8f, 0xe2, 0x52, 0x8d, 0x59, 0x2f, + 0xa9, 0xf5, 0x8b, 0x79, 0x78, 0xe1, 0xa8, 0x1b, 0x07, 0xab, 0x99, 0x9b, 0xd9, 0xc5, 0x01, 0x6e, + 0x29, 0xc7, 0x6f, 0x67, 0xab, 0x30, 0xb5, 0x11, 0xec, 0xba, 0x6d, 0xef, 0x9b, 0x78, 0x93, 0x8c, + 0x8d, 0xb7, 0xb0, 0x33, 0x7c, 0xad, 0xc4, 0x9c, 0xed, 0x29, 0xa2, 0x85, 0x47, 0xb4, 0xcd, 0x7d, + 0x5c, 0x37, 0xa0, 0xeb, 0x30, 0xb6, 0xec, 0xb7, 0x23, 0xfe, 0x24, 0x4a, 0x39, 0xbd, 0x4a, 0x60, + 0xda, 0x05, 0x4a, 0xa1, 0x5a, 0xff, 0x2a, 0x0f, 0xe7, 0x8e, 0x14, 0xb9, 0xd9, 0x96, 0xd9, 0x6b, + 0x97, 0x06, 0x91, 0xd3, 0x8f, 0xef, 0xb6, 0xc5, 0x1e, 0x3b, 0xa3, 0x63, 0xad, 0xec, 0x17, 0xfe, + 0xdb, 0x1c, 0x75, 0xd2, 0xa7, 0x61, 0x14, 0xab, 0x8a, 0xbb, 0x48, 0x6a, 0xa3, 0x70, 0x17, 0xf6, + 0x4c, 0x6d, 0x94, 0x44, 0x63, 0xd7, 0xa0, 0xb8, 0xec, 0x36, 0x9b, 0x9a, 0x4b, 0x30, 0xde, 0x24, + 0xea, 0x08, 0x4b, 0x99, 0xa5, 0x29, 0x44, 0xf6, 0x36, 0x80, 0xfc, 0x5b, 0x3b, 0x2b, 0x70, 0xb3, + 0x24, 0xb2, 0xd4, 0x71, 0xa1, 0x21, 0x63, 0x20, 0xc1, 0xba, 0x1f, 0x3b, 0x1d, 0xca, 0x40, 0x82, + 0x02, 0x60, 0x04, 0x12, 0x14, 0x00, 0xeb, 0x97, 0x0a, 0xf0, 0xe2, 0xd1, 0xf7, 0x46, 0x76, 0xcf, + 0x1c, 0x82, 0xd7, 0x07, 0xba, 0x6d, 0x1e, 0x3f, 0x06, 0x2a, 0x2c, 0xa7, 0xec, 0x90, 0x8b, 0xbd, + 0xc6, 0xf0, 0xdf, 0x39, 0x28, 0x6b, 0xb6, 0x8e, 0xb7, 0x7d, 0xaf, 0xad, 0xbd, 0x4d, 0x7c, 0x03, + 0xa0, 0x16, 0xb9, 0x91, 0x57, 0xbf, 0xfd, 0xe0, 0x8e, 0x8a, 0x5a, 0x71, 0x7d, 0xb0, 0x2f, 0x4b, + 0xe8, 0xe4, 0xbe, 0x42, 0x7e, 0x38, 0x08, 0x75, 0x3e, 0x7a, 0xfc, 0xd0, 0xb8, 0x19, 0x27, 0xc8, + 0x0b, 0x9f, 0x87, 0x52, 0x9a, 0x94, 0x5d, 0x80, 0x21, 0xfc, 0x00, 0xcd, 0xa2, 0x3f, 0xc5, 0x01, + 0xcb, 0x17, 0xee, 0xd2, 0xdc, 0x41, 0x2f, 0x69, 0x7c, 0x10, 0x37, 0x75, 0x70, 0xe4, 0x25, 0x2d, + 0xdf, 0xd3, 0x7b, 0xf5, 0x70, 0x29, 0x22, 0xeb, 0x4f, 0x73, 0x70, 0xb6, 0xef, 0x8d, 0x9c, 0x6d, + 0x9a, 0x03, 0xf6, 0xea, 0x71, 0x57, 0xf8, 0x63, 0xc7, 0x6a, 0xe1, 0x47, 0xd5, 0xdc, 0x7f, 0x1f, + 0x26, 0x6a, 0xdd, 0xed, 0xf4, 0x25, 0x4b, 0xc6, 0x30, 0xd0, 0xe0, 0xfa, 0x09, 0xa6, 0xe3, 0x8b, + 0xf6, 0xab, 0x17, 0x7f, 0xb2, 0x2c, 0xd1, 0xac, 0xac, 0x62, 0x37, 0xbe, 0x5e, 0x2f, 0x71, 0x93, + 0xc8, 0xfa, 0x85, 0x7c, 0xf6, 0x6d, 0x55, 0xdc, 0xee, 0x4f, 0x70, 0x5b, 0xbd, 0xb9, 0xbc, 0x79, + 0x7c, 0xdb, 0xff, 0xa9, 0x6a, 0x3b, 0x3e, 0x80, 0xd2, 0x8e, 0xa7, 0x14, 0x8a, 0xf4, 0x00, 0xaa, + 0x76, 0xc7, 0xd0, 0x7c, 0x00, 0x55, 0xc8, 0xec, 0x2d, 0x18, 0x5b, 0xf3, 0xa5, 0x03, 0xb7, 0x6a, + 0xb1, 0xf4, 0x73, 0x53, 0x40, 0x7d, 0x7b, 0x8c, 0x31, 0xc5, 0xdd, 0xc2, 0x1c, 0x78, 0x65, 0x4c, + 0x86, 0x77, 0x8b, 0xd4, 0x74, 0x31, 0xd5, 0x6e, 0x26, 0x99, 0xf5, 0x9f, 0x0c, 0x83, 0x75, 0xbc, + 0xd2, 0x80, 0x7d, 0x68, 0xf6, 0xdd, 0xe5, 0x81, 0xd5, 0x0d, 0x03, 0x6d, 0xb9, 0x95, 0x6e, 0xc3, + 0xe3, 0xed, 0xba, 0xe9, 0x7d, 0x4d, 0x30, 0x7d, 0x0b, 0x54, 0x78, 0x1f, 0xc7, 0x19, 0x6a, 0xe1, + 0xbf, 0x2a, 0x24, 0x4b, 0x2d, 0x75, 0x34, 0xe6, 0x3e, 0xc6, 0xd1, 0xc8, 0xee, 0x40, 0x49, 0x87, + 0x68, 0x2f, 0xa1, 0x28, 0xb9, 0x18, 0x8c, 0x52, 0x1f, 0xd5, 0x43, 0x68, 0x9e, 0xaf, 0x85, 0xc1, + 0xcf, 0xd7, 0x44, 0x7c, 0xc7, 0xfa, 0x87, 0x7a, 0xc5, 0xf7, 0xb4, 0xc3, 0xa3, 0x86, 0xae, 0xbc, + 0xb5, 0x43, 0x3a, 0xb4, 0x86, 0x4d, 0x6f, 0xed, 0x8c, 0x83, 0x4b, 0x47, 0x57, 0x0e, 0xe7, 0xf8, + 0x53, 0xf3, 0xb7, 0x8c, 0x1d, 0xce, 0x25, 0x7d, 0x96, 0xc3, 0x79, 0x4c, 0x22, 0x0e, 0x40, 0xbb, + 0xdb, 0x96, 0x11, 0x6b, 0x47, 0x93, 0x03, 0x30, 0xe8, 0xb6, 0x9d, 0x74, 0xd4, 0xda, 0x18, 0xd1, + 0xfa, 0xd1, 0x3c, 0x4c, 0xc9, 0x0d, 0x57, 0x3e, 0x65, 0x3c, 0xb3, 0xcf, 0x44, 0xef, 0x18, 0xcf, + 0x44, 0x2a, 0x44, 0x8f, 0xde, 0xb4, 0x81, 0x1e, 0x89, 0xf6, 0x80, 0xf5, 0xd2, 0x30, 0x1b, 0x26, + 0x74, 0xe8, 0xd1, 0xef, 0x43, 0x57, 0x93, 0x68, 0x4e, 0x74, 0xde, 0xe1, 0x23, 0x5d, 0x68, 0x1b, + 0x3c, 0xac, 0xbf, 0x99, 0x87, 0x49, 0xed, 0x51, 0xff, 0x99, 0xed, 0xf8, 0xcf, 0x1b, 0x1d, 0x3f, + 0x1f, 0x3b, 0x7d, 0xc4, 0x2d, 0x1b, 0xa8, 0xdf, 0xbb, 0x30, 0xd3, 0x43, 0x92, 0xb6, 0x8d, 0xc8, + 0x0d, 0x62, 0x1b, 0xf1, 0x46, 0x6f, 0x68, 0x18, 0x19, 0x61, 0x39, 0x0e, 0x14, 0xa0, 0xc7, 0xa2, + 0xf9, 0xb1, 0x3c, 0xcc, 0xd1, 0x2f, 0x8c, 0xa5, 0x26, 0x25, 0x8e, 0x67, 0x76, 0x2c, 0x2a, 0xc6, + 0x58, 0x94, 0xcd, 0xb1, 0xd0, 0x1a, 0xd8, 0x7f, 0x48, 0xac, 0xbf, 0x0e, 0x30, 0xdf, 0x8f, 0x60, + 0x60, 0xdf, 0xca, 0xc4, 0x73, 0x25, 0x3f, 0x80, 0xe7, 0xca, 0x1a, 0x94, 0xb0, 0x2a, 0x8a, 0x96, + 0x14, 0x8a, 0x7b, 0x6b, 0x21, 0xb9, 0x24, 0xca, 0x80, 0x77, 0x14, 0xbd, 0x29, 0x4c, 0x5d, 0x5c, + 0x7b, 0x28, 0xd9, 0xcf, 0xe5, 0x60, 0x0a, 0x81, 0xab, 0x8f, 0x78, 0x3b, 0x42, 0x66, 0x43, 0xe4, + 0x68, 0x11, 0xbf, 0x22, 0xd5, 0xa2, 0xc0, 0x6b, 0xef, 0xd2, 0x33, 0xd2, 0x36, 0x3d, 0x23, 0xbd, + 0x2b, 0x9f, 0xbf, 0x2e, 0xd7, 0xfd, 0xd6, 0x95, 0xdd, 0xc0, 0x7d, 0xe4, 0x49, 0x7b, 0x15, 0xb7, + 0x79, 0x25, 0x09, 0xf0, 0xdf, 0xf1, 0x52, 0x21, 0xfb, 0x89, 0x15, 0x3e, 0xd1, 0xc9, 0x0f, 0xe5, + 0x58, 0x6d, 0xfa, 0x7e, 0x6d, 0x7e, 0x11, 0xfb, 0x3e, 0x38, 0x23, 0x63, 0x98, 0x88, 0x6b, 0x9a, + 0xd7, 0xee, 0xfa, 0xdd, 0x70, 0xc9, 0xad, 0x3f, 0x14, 0xb2, 0x9a, 0x74, 0x16, 0xc3, 0x96, 0xd7, + 0xe3, 0x42, 0x67, 0x5b, 0x96, 0x1a, 0xce, 0xb1, 0xd9, 0x0c, 0xd8, 0x2d, 0x98, 0x91, 0x45, 0x95, + 0x6e, 0xe4, 0xd7, 0xea, 0x6e, 0xd3, 0x6b, 0xef, 0xe2, 0x81, 0x50, 0x94, 0xe7, 0x91, 0xdb, 0x8d, + 0x7c, 0x27, 0x94, 0x70, 0xfd, 0xba, 0xdd, 0x43, 0xc4, 0xaa, 0x30, 0x6d, 0x73, 0xb7, 0x71, 0xd7, + 0x7d, 0xb2, 0xec, 0x76, 0xdc, 0xba, 0xb8, 0xbc, 0x17, 0xf1, 0xc9, 0x15, 0x4f, 0xe5, 0x80, 0xbb, + 0x0d, 0xa7, 0xe5, 0x3e, 0x71, 0xea, 0x54, 0x68, 0xea, 0x5d, 0x0d, 0xba, 0x98, 0x95, 0xd7, 0x8e, + 0x59, 0x8d, 0xa5, 0x59, 0x79, 0xed, 0xfe, 0xac, 0x12, 0x3a, 0xc5, 0x6a, 0xcb, 0x0d, 0x76, 0x79, + 0x24, 0xcd, 0x3d, 0xe1, 0x7c, 0xee, 0x62, 0x4e, 0x63, 0x15, 0x61, 0x99, 0x83, 0xa6, 0x9f, 0x69, + 0x56, 0x1a, 0x9d, 0x98, 0x79, 0x0f, 0x02, 0x2f, 0xe2, 0x7a, 0x0b, 0xc7, 0xf1, 0xb3, 0xb0, 0xff, + 0xd1, 0x50, 0xb6, 0x5f, 0x13, 0x7b, 0x28, 0x13, 0x6e, 0x5a, 0x23, 0x27, 0x7a, 0xb8, 0x65, 0xb7, + 0xb2, 0x87, 0x32, 0xe6, 0xa6, 0xb7, 0x73, 0x12, 0xdb, 0xa9, 0x71, 0xeb, 0xd3, 0xd0, 0x1e, 0x4a, + 0xb6, 0x2e, 0x3a, 0x2d, 0xe2, 0x6d, 0x31, 0xa3, 0xc9, 0xdc, 0x75, 0x0a, 0x3f, 0xed, 0x15, 0xb2, + 0xd9, 0x2a, 0x05, 0xaa, 0xd8, 0xc9, 0x30, 0x7e, 0x4d, 0x13, 0xb3, 0xbf, 0x04, 0xd3, 0xf7, 0x42, + 0x7e, 0xa3, 0xba, 0x59, 0x53, 0x21, 0x4f, 0x50, 0x43, 0x34, 0xb5, 0x78, 0xf5, 0x98, 0x4d, 0xe7, + 0xb2, 0x4e, 0x83, 0x71, 0xf6, 0xe5, 0xb8, 0x75, 0x43, 0xee, 0xec, 0x78, 0x9d, 0x30, 0x8e, 0x1f, + 0xa5, 0x8f, 0x5b, 0xaa, 0x2a, 0xeb, 0x16, 0xcc, 0xf4, 0xb0, 0x61, 0x53, 0x00, 0x02, 0xe8, 0xdc, + 0x5b, 0xaf, 0xad, 0x6e, 0x95, 0x9e, 0x63, 0x25, 0x98, 0xc0, 0xdf, 0xab, 0xeb, 0x95, 0xa5, 0xb5, + 0xd5, 0x95, 0x52, 0x8e, 0xcd, 0xc0, 0x24, 0x42, 0x56, 0xaa, 0x35, 0x09, 0xca, 0xcb, 0x28, 0xcb, + 0x76, 0x49, 0x2e, 0xdd, 0x48, 0x2c, 0x00, 0x3c, 0x53, 0xac, 0xbf, 0x97, 0x87, 0xb3, 0xea, 0x58, + 0xe1, 0x91, 0x10, 0xc1, 0xbc, 0xf6, 0xee, 0x33, 0x7e, 0x3a, 0xdc, 0x30, 0x4e, 0x87, 0x57, 0x52, + 0x27, 0x75, 0xaa, 0x95, 0x47, 0x1c, 0x11, 0xbf, 0x36, 0x06, 0xe7, 0x8e, 0xa4, 0x62, 0x5f, 0x14, + 0xa7, 0xb9, 0xc7, 0xdb, 0x51, 0xb5, 0xd1, 0xe4, 0x5b, 0x5e, 0x8b, 0xfb, 0xdd, 0x88, 0xcc, 0xab, + 0x5f, 0x46, 0xa5, 0x0c, 0x16, 0x3a, 0x5e, 0xa3, 0xc9, 0x9d, 0x48, 0x16, 0x1b, 0xd3, 0xad, 0x97, + 0x5a, 0xb0, 0x8c, 0x73, 0x7e, 0x54, 0xdb, 0x11, 0x0f, 0x1e, 0xa1, 0x09, 0x57, 0xcc, 0xf2, 0x21, + 0xe7, 0x1d, 0xc7, 0x15, 0xa5, 0x8e, 0x47, 0xc5, 0x26, 0xcb, 0x1e, 0x6a, 0x76, 0x43, 0x63, 0xb9, + 0x2c, 0xae, 0x70, 0x77, 0xdd, 0x27, 0x64, 0x53, 0x42, 0x21, 0xf4, 0x62, 0x96, 0xd2, 0x9f, 0xb3, + 0xe5, 0x3e, 0xb1, 0x7b, 0x49, 0xd8, 0x57, 0xe1, 0x14, 0x1d, 0x40, 0xe4, 0x8f, 0xaf, 0x5a, 0x2c, + 0xbd, 0xfd, 0x5f, 0x3b, 0x3c, 0x28, 0x9f, 0x51, 0xc1, 0x07, 0x55, 0x04, 0x86, 0xac, 0x56, 0x67, + 0x73, 0x61, 0x5b, 0xe2, 0x40, 0x4e, 0x75, 0xc7, 0x5d, 0x1e, 0x86, 0xca, 0xd1, 0x88, 0xae, 0x37, + 0x7a, 0x67, 0x3a, 0x2d, 0x59, 0x6e, 0xf7, 0xa5, 0x64, 0xb7, 0x60, 0xea, 0x01, 0xdf, 0xd6, 0xc7, + 0x67, 0x24, 0xde, 0xaa, 0x4a, 0x8f, 0xf9, 0x76, 0xff, 0xc1, 0x49, 0xd1, 0x31, 0x0f, 0x95, 0xbc, + 0x4f, 0xf6, 0xd7, 0xbc, 0x30, 0xe2, 0x6d, 0x1e, 0x60, 0x9c, 0x97, 0x51, 0xdc, 0x0c, 0xe6, 0x13, + 0x09, 0xd9, 0x2c, 0x5f, 0x7a, 0xe9, 0xf0, 0xa0, 0x7c, 0x4e, 0x7a, 0xec, 0x35, 0x09, 0xee, 0xa4, + 0x32, 0x66, 0xf4, 0x72, 0x65, 0x5f, 0x87, 0x69, 0xdb, 0xef, 0x46, 0x5e, 0x7b, 0xb7, 0x16, 0x05, + 0x6e, 0xc4, 0x77, 0xe5, 0x81, 0x94, 0x04, 0x94, 0x49, 0x95, 0xd2, 0xfb, 0xa0, 0x04, 0x3a, 0x21, + 0x41, 0x8d, 0x13, 0xc1, 0x24, 0x60, 0x5f, 0x83, 0x29, 0xe9, 0x89, 0x1d, 0x57, 0x30, 0x66, 0x44, + 0xfb, 0x36, 0x0b, 0xef, 0x5f, 0x25, 0x13, 0x00, 0x84, 0x66, 0x55, 0x90, 0xe2, 0xc6, 0xbe, 0x4c, + 0x9d, 0xb5, 0xe9, 0xb5, 0x77, 0xe3, 0x69, 0x0c, 0xd8, 0xf3, 0x6f, 0x26, 0x5d, 0xd2, 0x11, 0x9f, + 0xab, 0xa6, 0x71, 0x1f, 0x7b, 0xa6, 0x5e, 0x3e, 0x2c, 0x82, 0x73, 0x95, 0x30, 0xf4, 0xc2, 0x88, + 0x9c, 0x10, 0x56, 0x9f, 0xf0, 0x7a, 0x57, 0x20, 0x8b, 0x8b, 0x22, 0x0f, 0xa4, 0x11, 0xec, 0xf0, + 0xd2, 0xe5, 0xc3, 0x83, 0xf2, 0xeb, 0x2e, 0x22, 0x3a, 0xe4, 0xb7, 0xe0, 0x70, 0x85, 0xea, 0x3c, + 0x96, 0xb8, 0x5a, 0x1b, 0x8e, 0x66, 0xca, 0xbe, 0x06, 0xa7, 0x97, 0xdd, 0x90, 0x57, 0xdb, 0x21, + 0x6f, 0x87, 0x5e, 0xe4, 0x3d, 0xe2, 0xd4, 0xa9, 0x78, 0xf8, 0x15, 0x31, 0xb7, 0x88, 0x55, 0x77, + 0x43, 0xb1, 0x30, 0x63, 0x14, 0x87, 0x06, 0x45, 0xab, 0xa6, 0x0f, 0x17, 0x66, 0xc3, 0x54, 0xad, + 0x76, 0x6b, 0xc5, 0x73, 0xe3, 0x75, 0x35, 0x89, 0xfd, 0xf5, 0x3a, 0xea, 0x67, 0xc2, 0x3d, 0xa7, + 0xe1, 0xb9, 0xf1, 0x82, 0xea, 0xd3, 0x59, 0x29, 0x0e, 0xd6, 0x41, 0x0e, 0x4a, 0xe9, 0xa1, 0x64, + 0x5f, 0x82, 0x31, 0x69, 0x0c, 0xc4, 0xc3, 0x3d, 0x72, 0x4c, 0x56, 0xb6, 0x25, 0x31, 0xdc, 0x24, + 0x22, 0xa7, 0x20, 0x69, 0x6a, 0xc4, 0x75, 0xbb, 0x05, 0x74, 0x0a, 0x52, 0x44, 0xac, 0x01, 0x13, + 0x72, 0xb4, 0x38, 0x46, 0x93, 0x22, 0x9b, 0xd0, 0x97, 0xf4, 0xd5, 0x41, 0x45, 0x29, 0xfe, 0xf8, + 0xf4, 0x43, 0x73, 0x42, 0x22, 0x18, 0x55, 0x18, 0x5c, 0x97, 0x00, 0x8a, 0x8a, 0xd0, 0x3a, 0x0b, + 0x67, 0xfa, 0x7c, 0xb3, 0xf5, 0x08, 0x9f, 0x83, 0xfb, 0xd4, 0xc8, 0xbe, 0x04, 0x73, 0x48, 0xb8, + 0xec, 0xb7, 0xdb, 0xbc, 0x1e, 0xe1, 0x76, 0xa4, 0x54, 0xa8, 0x05, 0x69, 0x73, 0x20, 0xdb, 0x5b, + 0x8f, 0x11, 0x9c, 0xb4, 0x26, 0x35, 0x93, 0x83, 0xf5, 0x53, 0x79, 0x98, 0xa7, 0x1d, 0xce, 0xe6, + 0x75, 0x3f, 0x68, 0x3c, 0xfb, 0x27, 0xea, 0xaa, 0x71, 0xa2, 0xbe, 0x1c, 0x47, 0xa2, 0xc8, 0x6a, + 0xe4, 0x11, 0x07, 0xea, 0x2f, 0xe4, 0xe0, 0x85, 0xa3, 0x88, 0x44, 0xef, 0xc4, 0xd1, 0xb3, 0xc6, + 0x7a, 0xa2, 0x64, 0x75, 0x60, 0x16, 0x07, 0x74, 0x79, 0x8f, 0xd7, 0x1f, 0x86, 0xb7, 0xfc, 0x30, + 0x42, 0xb3, 0xf4, 0x7c, 0x9f, 0x07, 0xcb, 0x37, 0x32, 0x1f, 0x2c, 0x4f, 0xcb, 0x59, 0x56, 0x47, + 0x1e, 0x32, 0xbe, 0xd7, 0x43, 0xbe, 0x1f, 0xda, 0x59, 0xac, 0xd1, 0xbc, 0xb8, 0xd2, 0x8d, 0xf6, + 0x36, 0x03, 0xbe, 0xc3, 0x03, 0xde, 0xae, 0xf3, 0xef, 0x31, 0xf3, 0x62, 0xb3, 0x71, 0x03, 0x69, + 0x30, 0xfe, 0xe9, 0x24, 0xcc, 0x65, 0x91, 0x89, 0x7e, 0xd1, 0x2e, 0xcd, 0xe9, 0xd4, 0x67, 0x7f, + 0x2d, 0x07, 0x13, 0x35, 0x5e, 0xf7, 0xdb, 0x8d, 0x1b, 0x68, 0x16, 0x42, 0xbd, 0xe3, 0x48, 0xa1, + 0x41, 0xc0, 0x9d, 0x9d, 0x94, 0xbd, 0xc8, 0x77, 0x0e, 0xca, 0x5f, 0x18, 0xec, 0xae, 0x5a, 0xf7, + 0x31, 0x9a, 0x44, 0x84, 0xa1, 0xb9, 0xe3, 0x2a, 0xf0, 0x85, 0xc7, 0xa8, 0x94, 0x2d, 0xc1, 0x24, + 0x2d, 0x57, 0x5f, 0x0f, 0x9e, 0x26, 0x83, 0x75, 0xa8, 0x82, 0x1e, 0xfd, 0xa3, 0x41, 0xc2, 0xae, + 0x41, 0xe1, 0xde, 0xe2, 0x0d, 0x1a, 0x03, 0x15, 0xdc, 0xfc, 0xde, 0xe2, 0x0d, 0x54, 0x87, 0x89, + 0x2b, 0xc6, 0x64, 0x77, 0xd1, 0xb0, 0xd4, 0xb8, 0xb7, 0x78, 0x83, 0xfd, 0x15, 0x38, 0xb5, 0xe2, + 0x85, 0x54, 0x85, 0x34, 0x74, 0x6f, 0xa0, 0x7b, 0xd7, 0x48, 0x9f, 0xd9, 0xfb, 0xd9, 0xcc, 0xd9, + 0xfb, 0x52, 0x23, 0x66, 0xe2, 0x48, 0x2b, 0xfa, 0x46, 0x3a, 0x48, 0x5c, 0x76, 0x3d, 0xec, 0x23, + 0x98, 0x42, 0xdd, 0x39, 0xda, 0xfe, 0x63, 0x78, 0xdf, 0xd1, 0x3e, 0x35, 0x7f, 0x3a, 0xb3, 0xe6, + 0x05, 0xe9, 0x24, 0x8e, 0x1e, 0x04, 0x18, 0x0a, 0xd8, 0xb8, 0xf5, 0x1b, 0x9c, 0xd9, 0x6d, 0x98, + 0x26, 0xf1, 0x6b, 0x63, 0x67, 0x6b, 0x8f, 0xaf, 0xb8, 0xfb, 0x64, 0x64, 0x81, 0x37, 0x3a, 0x92, + 0xd9, 0x1c, 0x7f, 0xc7, 0x89, 0xf6, 0xb8, 0xd3, 0x70, 0x0d, 0x41, 0x25, 0x45, 0xc8, 0xbe, 0x1f, + 0xc6, 0xd7, 0xfc, 0xba, 0x90, 0xbc, 0x71, 0x67, 0x90, 0x76, 0x17, 0x1f, 0x62, 0x72, 0x2d, 0x09, + 0x4e, 0x89, 0x53, 0xdf, 0x39, 0x28, 0xbf, 0x73, 0xd2, 0x49, 0xa3, 0x55, 0x60, 0xeb, 0xb5, 0xb1, + 0x65, 0x28, 0x3e, 0xe0, 0xdb, 0xa2, 0xb5, 0xe9, 0xc4, 0x3b, 0x0a, 0x4c, 0x66, 0x55, 0xf4, 0xcb, + 0x30, 0xab, 0x22, 0x18, 0x0b, 0x60, 0x06, 0xfb, 0x67, 0xd3, 0x0d, 0xc3, 0xc7, 0x7e, 0xd0, 0xc0, + 0x08, 0xeb, 0xfd, 0x4c, 0x3a, 0x16, 0x33, 0x3b, 0xff, 0x05, 0xd9, 0xf9, 0x1d, 0x8d, 0x83, 0x2e, + 0x40, 0xf6, 0xb0, 0x67, 0x5f, 0x87, 0x29, 0xf2, 0x6c, 0xbe, 0x7b, 0xa3, 0x82, 0xab, 0x72, 0xc2, + 0x70, 0x92, 0x33, 0x0b, 0xa5, 0x94, 0x4a, 0x8e, 0xd2, 0x4a, 0x03, 0xe5, 0xb4, 0x76, 0x5c, 0xf3, + 0xd5, 0x4c, 0x27, 0x61, 0x9b, 0x30, 0xbe, 0xc2, 0x1f, 0x79, 0x75, 0x8e, 0x8e, 0x3c, 0x64, 0x44, + 0x1b, 0x67, 0x0e, 0x49, 0x4a, 0xa4, 0x2e, 0xa6, 0x81, 0x00, 0xe9, 0x16, 0x64, 0x5a, 0x4d, 0xc6, + 0x88, 0xec, 0x3a, 0x14, 0xaa, 0x2b, 0x9b, 0x64, 0x43, 0xab, 0x7c, 0x63, 0xaa, 0x8d, 0x4d, 0x95, + 0x67, 0x01, 0x8d, 0xa0, 0xbc, 0x86, 0x61, 0x81, 0x5b, 0x5d, 0xd9, 0x64, 0x3b, 0x30, 0x89, 0x1d, + 0x70, 0x8b, 0xbb, 0xb2, 0x6f, 0xa7, 0xfb, 0xf4, 0xed, 0xe5, 0xcc, 0xbe, 0x9d, 0x97, 0x7d, 0xbb, + 0x47, 0xd4, 0x46, 0xe0, 0x78, 0x9d, 0xad, 0x10, 0x69, 0x29, 0x99, 0x85, 0x0a, 0x77, 0xbe, 0xb5, + 0x86, 0x46, 0x1e, 0x24, 0xd2, 0xaa, 0xdc, 0x17, 0x71, 0xfc, 0xf5, 0xbe, 0x26, 0xfa, 0xbd, 0x7c, + 0xd8, 0xe7, 0x61, 0x68, 0xe3, 0x61, 0xe4, 0xce, 0xcf, 0x18, 0xfd, 0x28, 0x40, 0xaa, 0xf9, 0xa8, + 0x85, 0xf4, 0x1f, 0x1a, 0x61, 0x84, 0x90, 0x46, 0x0c, 0xc5, 0x2d, 0x37, 0x68, 0x3c, 0x76, 0x03, + 0xf4, 0xa6, 0x9c, 0x35, 0x58, 0x68, 0x25, 0x72, 0x28, 0xf6, 0x08, 0x90, 0x72, 0xb1, 0xd4, 0x59, + 0xb0, 0xef, 0x83, 0xb3, 0xa1, 0xb7, 0xdb, 0x76, 0xa3, 0x6e, 0xc0, 0x1d, 0xb7, 0xb9, 0xeb, 0x07, + 0x5e, 0xb4, 0xd7, 0x72, 0xc2, 0xae, 0x17, 0xf1, 0xf9, 0x39, 0x23, 0xf5, 0x65, 0x4d, 0xe1, 0x55, + 0x14, 0x5a, 0x4d, 0x60, 0xd9, 0x67, 0xc2, 0xec, 0x02, 0xf6, 0x65, 0x98, 0xd4, 0xb7, 0xe4, 0x70, + 0xfe, 0xd4, 0xf9, 0xc2, 0xc5, 0xa9, 0xf8, 0xe2, 0x91, 0xde, 0xc0, 0x55, 0xc8, 0x48, 0xed, 0x84, + 0x08, 0xcd, 0x90, 0x91, 0x1a, 0xaf, 0x38, 0x99, 0x14, 0x2b, 0xcd, 0xda, 0x33, 0x34, 0x63, 0xa9, + 0x97, 0xef, 0xde, 0xa8, 0xd8, 0xa3, 0x9b, 0xd5, 0xfb, 0xb5, 0xa6, 0x1f, 0x59, 0xff, 0x45, 0x0e, + 0x37, 0x71, 0xf6, 0x3a, 0x46, 0x3f, 0x89, 0x9f, 0xf3, 0x50, 0x7f, 0xeb, 0x76, 0x52, 0xf1, 0x86, + 0x25, 0x0a, 0x7b, 0x03, 0x46, 0x6e, 0xb8, 0x75, 0x1e, 0xa9, 0x47, 0x57, 0x44, 0xde, 0x41, 0x88, + 0xae, 0xec, 0x95, 0x38, 0x42, 0xbe, 0x94, 0x93, 0xbb, 0x92, 0x64, 0x47, 0x5d, 0xae, 0xa8, 0x37, + 0x57, 0x94, 0x2f, 0x69, 0x51, 0x68, 0xe9, 0x53, 0x53, 0xf6, 0xc9, 0x99, 0x1c, 0xac, 0x3f, 0xce, + 0x25, 0xbb, 0x12, 0x7b, 0x0d, 0x86, 0xec, 0xcd, 0xf8, 0xfb, 0xa5, 0x87, 0x64, 0xea, 0xf3, 0x11, + 0x81, 0x7d, 0x19, 0x4e, 0x69, 0x7c, 0x7a, 0x8c, 0xa5, 0x5f, 0x45, 0x07, 0x3e, 0xed, 0x4b, 0xb2, + 0x2d, 0xa6, 0xb3, 0x79, 0xa0, 0x30, 0x9d, 0x14, 0xac, 0xf0, 0xb6, 0x27, 0x79, 0x6b, 0x8d, 0xd5, + 0x79, 0x37, 0x10, 0x21, 0xdd, 0xd8, 0x2c, 0x0e, 0xd2, 0x7f, 0xcf, 0xfa, 0xd5, 0x9c, 0xb1, 0xdb, + 0xc4, 0x69, 0x28, 0x73, 0xc7, 0xa4, 0xa1, 0x7c, 0x1b, 0xa0, 0xd2, 0x8d, 0xfc, 0xd5, 0x76, 0xe0, + 0x37, 0xa5, 0x16, 0x85, 0x42, 0x6e, 0xa3, 0x6e, 0x98, 0x23, 0xd8, 0x70, 0x33, 0x8a, 0x91, 0x33, + 0xed, 0xca, 0x0b, 0x1f, 0xd7, 0xae, 0xdc, 0xfa, 0xed, 0x9c, 0xb1, 0x46, 0x85, 0x94, 0x48, 0x53, + 0x51, 0x37, 0xfb, 0xe9, 0x78, 0x8f, 0x9c, 0xb0, 0xe9, 0xeb, 0x3b, 0xa4, 0x42, 0x63, 0xff, 0x66, + 0x0e, 0x4e, 0x4b, 0x03, 0xed, 0xf5, 0x6e, 0x6b, 0x9b, 0x07, 0xf7, 0xdd, 0xa6, 0xd7, 0x90, 0x5e, + 0xaa, 0x52, 0x00, 0xbe, 0xd8, 0xbb, 0xe0, 0xb3, 0xf1, 0xe5, 0x45, 0x55, 0x1a, 0x8c, 0x3b, 0x6d, + 0x2c, 0x74, 0x1e, 0xc5, 0xa5, 0xfa, 0x45, 0x35, 0x9b, 0xde, 0xfa, 0xc5, 0x1c, 0xbc, 0x74, 0x6c, + 0x2d, 0xec, 0x0a, 0x8c, 0xaa, 0x58, 0xe7, 0x39, 0xec, 0x78, 0x34, 0x96, 0xec, 0x8d, 0x73, 0xae, + 0xb0, 0xd8, 0x57, 0xe0, 0x94, 0xce, 0x6a, 0x2b, 0x70, 0x3d, 0x3d, 0xa2, 0x78, 0xc6, 0x57, 0x47, + 0x02, 0x25, 0x2d, 0xad, 0x65, 0x33, 0xb1, 0xfe, 0xbf, 0x9c, 0x96, 0x98, 0xf6, 0x19, 0x95, 0xe1, + 0xaf, 0x1b, 0x32, 0xbc, 0x8a, 0x3b, 0x17, 0xb7, 0x4a, 0x94, 0x65, 0xde, 0xbb, 0xa6, 0x35, 0xa3, + 0x5f, 0x04, 0xfc, 0x70, 0x1e, 0xc6, 0xef, 0x85, 0x3c, 0x90, 0x0f, 0xb9, 0xdf, 0x5b, 0xf1, 0xc5, + 0xe2, 0x76, 0x0d, 0x14, 0x01, 0xea, 0x0f, 0x73, 0xa8, 0xe0, 0xd7, 0x29, 0x44, 0x6f, 0x68, 0xc9, + 0xa8, 0xb0, 0x37, 0x30, 0x0d, 0x15, 0x42, 0x65, 0xe0, 0xa1, 0x35, 0x33, 0x2f, 0x1d, 0x26, 0x27, + 0x5c, 0x63, 0x5f, 0x80, 0xe1, 0x7b, 0xa8, 0xae, 0x34, 0x23, 0x12, 0xc4, 0xfc, 0xb1, 0x50, 0x6e, + 0xd2, 0xdd, 0xd0, 0x0c, 0x96, 0x24, 0x09, 0x59, 0x0d, 0x46, 0x97, 0x03, 0x8e, 0x69, 0x66, 0x87, + 0x06, 0xf7, 0xa7, 0xad, 0x4b, 0x92, 0xb4, 0x3f, 0x2d, 0x71, 0xb2, 0x7e, 0x32, 0x0f, 0x2c, 0x69, + 0x23, 0xe6, 0x54, 0x09, 0x9f, 0xd9, 0x41, 0xff, 0xc0, 0x18, 0xf4, 0x73, 0x3d, 0x83, 0x2e, 0x9b, + 0x37, 0xd0, 0xd8, 0xff, 0x7a, 0x0e, 0x4e, 0x67, 0x13, 0xb2, 0x97, 0x61, 0x64, 0x63, 0x6b, 0x53, + 0x05, 0xb5, 0xa0, 0xa6, 0xf8, 0x1d, 0xd4, 0x15, 0xd8, 0x54, 0xc4, 0xde, 0x84, 0x91, 0x2f, 0xda, + 0xcb, 0xe2, 0x1c, 0xd2, 0xa2, 0x76, 0x7f, 0x23, 0x70, 0xea, 0xe6, 0x51, 0x44, 0x48, 0xfa, 0xd8, + 0x16, 0x9e, 0xda, 0xd8, 0xfe, 0x58, 0x1e, 0xa6, 0x2b, 0xf5, 0x3a, 0x0f, 0x43, 0x21, 0xed, 0xf0, + 0x30, 0x7a, 0x66, 0x07, 0x36, 0x3b, 0x5c, 0x85, 0xd1, 0xb6, 0x81, 0x46, 0xf5, 0x37, 0x73, 0x70, + 0x4a, 0x51, 0x3d, 0xf2, 0xf8, 0xe3, 0xad, 0xbd, 0x80, 0x87, 0x7b, 0x7e, 0xb3, 0x31, 0x70, 0x6a, + 0x00, 0x21, 0xe8, 0x61, 0xbc, 0x5f, 0xfd, 0x55, 0x7f, 0x07, 0x21, 0x86, 0xa0, 0x27, 0x63, 0x02, + 0x5f, 0x81, 0xd1, 0x4a, 0xa7, 0x13, 0xf8, 0x8f, 0xe4, 0xb2, 0xa7, 0x70, 0x68, 0xae, 0x04, 0x19, + 0xee, 0xc8, 0x12, 0x24, 0x3e, 0x63, 0x85, 0xb7, 0x65, 0xa0, 0xaf, 0x49, 0xf9, 0x19, 0x0d, 0xde, + 0xd6, 0x65, 0x71, 0x2c, 0xb7, 0x6a, 0xc0, 0x36, 0x03, 0xbf, 0xe5, 0x47, 0xbc, 0x21, 0xdb, 0x83, + 0x5e, 0xdc, 0xc7, 0x06, 0x06, 0xda, 0xf2, 0xa2, 0xa6, 0x11, 0x18, 0x28, 0x12, 0x00, 0x5b, 0xc2, + 0xad, 0xff, 0x6b, 0x18, 0x26, 0xf4, 0xde, 0x61, 0x96, 0x8c, 0xf7, 0xed, 0x07, 0x7a, 0x28, 0x01, + 0x17, 0x21, 0x36, 0x95, 0x24, 0x71, 0x38, 0xf2, 0xc7, 0xc6, 0xe1, 0x78, 0x00, 0x93, 0x9b, 0x81, + 0x8f, 0x71, 0xdb, 0x64, 0xfa, 0x71, 0xb9, 0x15, 0xce, 0x6a, 0xf7, 0x4e, 0x31, 0x90, 0xf8, 0x1e, + 0x8a, 0x92, 0x7d, 0x87, 0xb0, 0x9d, 0x74, 0x72, 0x72, 0x93, 0x8f, 0x34, 0xb5, 0x70, 0x43, 0x0a, + 0xbe, 0x18, 0x9b, 0x5a, 0x08, 0x88, 0x69, 0x6a, 0x21, 0x20, 0xfa, 0x5a, 0x1b, 0x7e, 0x5a, 0x6b, + 0x8d, 0xfd, 0x64, 0x0e, 0xc6, 0x2b, 0xed, 0x36, 0xc5, 0xf7, 0x38, 0xc6, 0xb5, 0xf9, 0x2b, 0x64, + 0x6d, 0xf1, 0xce, 0xc7, 0xb2, 0xb6, 0x40, 0xb9, 0x25, 0x44, 0x49, 0x35, 0xa9, 0x50, 0xbf, 0xad, + 0x69, 0xdf, 0xc1, 0xde, 0x81, 0x52, 0x3c, 0xc9, 0xab, 0xed, 0x06, 0x7f, 0xc2, 0x65, 0xbe, 0xa4, + 0x49, 0x0a, 0xbb, 0xaa, 0x4b, 0xa6, 0x69, 0x44, 0xb6, 0x05, 0xe0, 0xc6, 0xb3, 0x2b, 0x95, 0xf8, + 0xad, 0x77, 0xfa, 0x91, 0xf4, 0x8c, 0xbf, 0xf1, 0x41, 0x4b, 0x97, 0x9e, 0x13, 0x3e, 0xac, 0x05, + 0xd3, 0x32, 0xeb, 0x1a, 0x66, 0x63, 0xc7, 0xe8, 0xe2, 0x70, 0xec, 0x38, 0xbc, 0x46, 0xfa, 0xb3, + 0xe7, 0x29, 0x97, 0x1b, 0x26, 0x78, 0x77, 0x32, 0x42, 0x8d, 0xa7, 0x79, 0xcb, 0x20, 0xb7, 0xf6, + 0x99, 0xde, 0xef, 0x95, 0x93, 0xfe, 0xc7, 0x72, 0x70, 0x5a, 0x9f, 0xf4, 0xb5, 0xee, 0x76, 0xcb, + 0xc3, 0x4b, 0x21, 0xbb, 0x0c, 0x63, 0x34, 0x27, 0xe3, 0x4b, 0x54, 0x6f, 0x90, 0xf4, 0x04, 0x85, + 0xad, 0x8a, 0x69, 0x28, 0x78, 0x90, 0xd4, 0x3d, 0x9b, 0xda, 0xa7, 0x44, 0x51, 0x92, 0xd1, 0x33, + 0xc0, 0xdf, 0xe6, 0xfc, 0x14, 0x10, 0xeb, 0x7d, 0x98, 0x31, 0x47, 0xa2, 0xc6, 0x23, 0x76, 0x09, + 0x46, 0xd5, 0xf0, 0xe5, 0xb2, 0x87, 0x4f, 0x95, 0x5b, 0x0f, 0x80, 0xf5, 0xd0, 0x87, 0x68, 0x16, + 0xc5, 0x23, 0x65, 0xb6, 0xa7, 0x1e, 0x25, 0x7b, 0x10, 0x97, 0x66, 0xe9, 0xfb, 0xc6, 0x0d, 0xdb, + 0x72, 0x41, 0x6a, 0xfd, 0xf1, 0x14, 0xcc, 0x66, 0xec, 0xb9, 0xc7, 0xc8, 0x44, 0x65, 0x73, 0x83, + 0x18, 0x8b, 0x23, 0x23, 0xa8, 0x6d, 0xe1, 0x7d, 0x18, 0x3e, 0x76, 0x3b, 0x90, 0x9e, 0x05, 0xa9, + 0x5d, 0x40, 0x92, 0x7d, 0x57, 0xe4, 0x22, 0x3d, 0x78, 0xc9, 0xf0, 0x53, 0x0b, 0x5e, 0xb2, 0x04, + 0x93, 0xd4, 0x2a, 0xda, 0xae, 0x34, 0x0b, 0xd7, 0x40, 0x16, 0x38, 0x3d, 0xdb, 0x96, 0x49, 0x22, + 0x79, 0x84, 0x7e, 0xf3, 0x11, 0x27, 0x1e, 0xa3, 0x3a, 0x0f, 0x2c, 0xc8, 0xe4, 0xa1, 0x91, 0xb0, + 0xff, 0x08, 0x33, 0x3e, 0x21, 0x44, 0xdf, 0xb3, 0x8a, 0x47, 0xed, 0x59, 0x8d, 0xa7, 0xb3, 0x67, + 0x9d, 0x53, 0xdf, 0x98, 0xbd, 0x77, 0x65, 0x7c, 0x16, 0xfb, 0xf9, 0x1c, 0xcc, 0xc8, 0x08, 0x1a, + 0xfa, 0xc7, 0x1e, 0x19, 0x15, 0xa1, 0xfe, 0x74, 0x3e, 0xf6, 0x05, 0xca, 0x74, 0x92, 0xfd, 0xad, + 0xbd, 0x1f, 0xc5, 0xbe, 0x0f, 0x20, 0x5e, 0x51, 0x32, 0xd0, 0xe4, 0xf8, 0xe2, 0x0b, 0x19, 0xbb, + 0x40, 0x8c, 0x94, 0x44, 0x65, 0x8f, 0x62, 0x3a, 0x23, 0xcf, 0x57, 0x0c, 0x65, 0x7f, 0x05, 0xe6, + 0xc4, 0x7a, 0x89, 0x21, 0x14, 0xef, 0x67, 0x7e, 0x1c, 0x6b, 0xf9, 0x4c, 0x7f, 0x99, 0xe8, 0x72, + 0x16, 0x99, 0x0c, 0x4b, 0x9a, 0xa4, 0x5c, 0x8d, 0xf4, 0xd0, 0x00, 0x99, 0x15, 0x61, 0x18, 0x2d, + 0xfc, 0x7a, 0x19, 0x39, 0xbd, 0xcf, 0xfe, 0x76, 0x56, 0xad, 0x05, 0xb9, 0xbf, 0x85, 0xa6, 0xa3, + 0x29, 0x82, 0xd8, 0x17, 0x81, 0xc5, 0xa1, 0x27, 0x24, 0x8c, 0xab, 0xa8, 0xea, 0x52, 0xdd, 0x9c, + 0x84, 0xb0, 0x08, 0x54, 0xb1, 0x3e, 0x49, 0x7a, 0x89, 0x19, 0x87, 0x39, 0x6a, 0xb4, 0x80, 0xaa, + 0x74, 0x4c, 0xe1, 0xfc, 0x94, 0x11, 0x4d, 0x29, 0x29, 0x49, 0x72, 0xb3, 0x6a, 0x39, 0x9d, 0x0c, + 0x95, 0x53, 0x16, 0x3b, 0x76, 0x1d, 0xc6, 0xd0, 0xdb, 0xf3, 0x96, 0x32, 0xf6, 0x22, 0xc3, 0x13, + 0xf4, 0x0b, 0x75, 0xf6, 0x4c, 0x93, 0xad, 0x04, 0x55, 0x5c, 0x07, 0x56, 0x82, 0x7d, 0xbb, 0xdb, + 0x46, 0xa5, 0x30, 0xe9, 0x3b, 0x1a, 0xc1, 0xbe, 0x13, 0x74, 0x4d, 0x77, 0x60, 0x44, 0x62, 0x5f, + 0x87, 0xf1, 0xbb, 0xee, 0x13, 0xa5, 0x13, 0x26, 0xc5, 0xef, 0x51, 0x3b, 0x90, 0xa5, 0x5a, 0xd3, + 0x72, 0x9f, 0x38, 0x8d, 0x6e, 0x3a, 0x28, 0x2a, 0x6e, 0x43, 0x3a, 0x4b, 0xf6, 0x55, 0x00, 0x4d, + 0x53, 0xcd, 0x8e, 0xad, 0xe0, 0x25, 0x15, 0x23, 0x2c, 0x53, 0x83, 0x8d, 0xfc, 0x35, 0x86, 0x29, + 0xc9, 0x61, 0xee, 0xbb, 0x27, 0x39, 0x9c, 0xfa, 0xee, 0x49, 0x0e, 0x0b, 0xdb, 0x70, 0xb6, 0xef, + 0xd2, 0xc9, 0x08, 0xdd, 0x7a, 0xc5, 0x0c, 0xdd, 0x7a, 0xb6, 0xdf, 0x11, 0x1b, 0x9a, 0x81, 0xf8, + 0x67, 0x4b, 0x73, 0xfd, 0xa5, 0x93, 0x6f, 0xe7, 0x53, 0x47, 0x2e, 0x5d, 0x2c, 0x64, 0xe2, 0x96, + 0x7e, 0x32, 0x49, 0x1e, 0x73, 0x75, 0xca, 0x43, 0x39, 0x9f, 0x5c, 0x68, 0x52, 0xe9, 0xcd, 0xe5, + 0xf1, 0xfc, 0x49, 0x4f, 0xdf, 0x77, 0x61, 0x4a, 0xa6, 0xd7, 0xbb, 0xc3, 0xf7, 0x1f, 0xfb, 0x41, + 0x43, 0xe5, 0xb0, 0x46, 0x19, 0xbc, 0x27, 0x37, 0x6e, 0x0a, 0x97, 0xad, 0x28, 0x07, 0xc2, 0x61, + 0xac, 0xfd, 0x6c, 0xe6, 0x2e, 0x26, 0x10, 0x8e, 0xf2, 0x2d, 0x64, 0x6f, 0xc5, 0x82, 0x1a, 0x0f, + 0xf4, 0x70, 0xfc, 0x81, 0x02, 0x66, 0xc8, 0x6b, 0x3c, 0xb0, 0x7e, 0xbf, 0x00, 0x4c, 0xd6, 0xb4, + 0xec, 0x76, 0x5c, 0x74, 0xaf, 0xf5, 0x30, 0x30, 0x4d, 0x89, 0x70, 0xdc, 0xed, 0x26, 0xd7, 0xa3, + 0x3a, 0x91, 0x71, 0x6d, 0x5c, 0xe6, 0xa4, 0x2f, 0x3a, 0x3d, 0x84, 0x7d, 0xb6, 0xba, 0xfc, 0x27, + 0xd9, 0xea, 0xbe, 0x0e, 0xcf, 0x57, 0x3a, 0x98, 0xa7, 0x53, 0xd5, 0x72, 0xc3, 0x0f, 0xd4, 0x26, + 0x65, 0x38, 0x6e, 0xb9, 0x31, 0x5a, 0xcf, 0x97, 0x1e, 0xc5, 0x42, 0x93, 0x53, 0xc4, 0xbc, 0xec, + 0x44, 0x7a, 0x20, 0x00, 0x25, 0xa7, 0x74, 0xb0, 0x24, 0x43, 0x4e, 0x91, 0x24, 0x8a, 0x87, 0x17, + 0x28, 0x39, 0x05, 0x13, 0xd0, 0x24, 0x3c, 0xbc, 0x80, 0xf7, 0x91, 0x75, 0x62, 0x12, 0xf6, 0x2e, + 0x8c, 0x57, 0xba, 0x91, 0x4f, 0x8c, 0xc9, 0x2a, 0x3c, 0xb1, 0xdf, 0xa6, 0x4f, 0x31, 0xae, 0x3e, + 0x09, 0xba, 0xf5, 0x47, 0x05, 0x38, 0xdb, 0x3b, 0xbc, 0x54, 0x1a, 0xaf, 0x8f, 0xdc, 0x31, 0xeb, + 0x23, 0x6b, 0x36, 0xe4, 0x93, 0xf0, 0xe8, 0x4f, 0x63, 0x36, 0xc8, 0x74, 0x9f, 0x1f, 0x73, 0x36, + 0xd4, 0x60, 0x5c, 0x3f, 0xef, 0x86, 0x3e, 0xee, 0x79, 0xa7, 0x73, 0x11, 0x97, 0x7a, 0x19, 0xff, + 0x60, 0x38, 0x79, 0x3a, 0x4a, 0x87, 0x3e, 0x90, 0x18, 0xec, 0xdf, 0x80, 0xf3, 0x72, 0x4f, 0x4a, + 0x37, 0x76, 0x69, 0x5f, 0x71, 0xa4, 0x81, 0x5b, 0x3c, 0x3c, 0x28, 0x5f, 0x96, 0xaa, 0x12, 0xa7, + 0xa7, 0xdb, 0x9c, 0xed, 0x7d, 0x47, 0x7d, 0x99, 0x56, 0xc9, 0xb1, 0xbc, 0x31, 0xc7, 0xa7, 0x96, + 0x7f, 0xf1, 0xcd, 0x2c, 0x77, 0x19, 0x19, 0x9d, 0x58, 0x82, 0x4d, 0x4f, 0x19, 0xa5, 0x0e, 0xcb, + 0x67, 0xaa, 0xc3, 0x94, 0x3e, 0xa5, 0x90, 0xa9, 0x4f, 0x59, 0x81, 0xe9, 0x5a, 0x77, 0x5b, 0xd5, + 0x9d, 0xf6, 0x97, 0x0b, 0xbb, 0xdb, 0x59, 0x0d, 0x4a, 0x93, 0x58, 0x3f, 0x92, 0x87, 0x89, 0xcd, + 0x66, 0x77, 0xd7, 0x6b, 0xaf, 0xb8, 0x91, 0xfb, 0xcc, 0x6a, 0xe8, 0xde, 0x36, 0x34, 0x74, 0xb1, + 0x57, 0x58, 0xdc, 0xb0, 0x81, 0xd4, 0x73, 0x3f, 0x91, 0x83, 0xe9, 0x84, 0x44, 0x9e, 0xb3, 0xb7, + 0x60, 0x48, 0xfc, 0xa0, 0x7b, 0xeb, 0xf9, 0x1e, 0xc6, 0x32, 0xe9, 0x57, 0xfc, 0x17, 0xe9, 0xcc, + 0xcc, 0x8c, 0x3a, 0xc8, 0x61, 0xe1, 0xb3, 0x30, 0x96, 0xb0, 0x3d, 0x49, 0xb2, 0xaf, 0x5f, 0xca, + 0x41, 0x29, 0xdd, 0x12, 0x76, 0x07, 0x46, 0x05, 0x27, 0x8f, 0xab, 0x2b, 0xf5, 0x2b, 0x7d, 0xda, + 0x7c, 0x99, 0xd0, 0xe4, 0xe7, 0x61, 0xe7, 0x73, 0x09, 0xb1, 0x15, 0x87, 0x05, 0x1b, 0x26, 0x74, + 0xac, 0x8c, 0xaf, 0x7b, 0xc3, 0x14, 0x2e, 0x4e, 0x67, 0xf7, 0x83, 0x91, 0xa2, 0xcc, 0xf8, 0x6a, + 0x92, 0x1b, 0x2e, 0x18, 0x93, 0x0b, 0xfb, 0x2a, 0x35, 0x6f, 0xe4, 0x34, 0x5b, 0x4c, 0x02, 0xa6, + 0xeb, 0xf3, 0x2c, 0x63, 0x42, 0xc7, 0x78, 0xec, 0x0d, 0x18, 0x91, 0xf5, 0xe9, 0xa9, 0x7a, 0x3a, + 0x08, 0xd1, 0x45, 0x5c, 0x89, 0x63, 0xfd, 0xfd, 0x02, 0x9c, 0x4e, 0x3e, 0xef, 0x5e, 0xa7, 0xe1, + 0x46, 0x7c, 0xd3, 0x0d, 0xdc, 0x56, 0x78, 0xcc, 0x0a, 0xb8, 0xd8, 0xf3, 0x69, 0x98, 0xba, 0x45, + 0x7d, 0x9a, 0xf6, 0x41, 0x56, 0xea, 0x83, 0x50, 0x7d, 0x29, 0x3f, 0x48, 0x7d, 0x06, 0xbb, 0x03, + 0x85, 0x1a, 0x8f, 0x68, 0xdb, 0xbc, 0xd0, 0xd3, 0xab, 0xfa, 0x77, 0x5d, 0xae, 0xf1, 0x48, 0x0e, + 0xa2, 0x8c, 0xcb, 0xc3, 0x8d, 0x48, 0xac, 0x35, 0x1e, 0xb1, 0x07, 0x30, 0xb2, 0xfa, 0xa4, 0xc3, + 0xeb, 0x11, 0xa5, 0xaa, 0xbb, 0x74, 0x34, 0x3f, 0x89, 0xab, 0x65, 0xaa, 0xe3, 0x08, 0xd0, 0x3b, + 0x4b, 0xa2, 0x2c, 0x5c, 0x87, 0xa2, 0xaa, 0xfc, 0x24, 0x33, 0x77, 0xe1, 0x6d, 0x18, 0xd7, 0x2a, + 0x39, 0xd1, 0xa4, 0xff, 0x19, 0xb1, 0xaf, 0xfa, 0x4d, 0x95, 0xdd, 0x6e, 0xb5, 0x47, 0xcc, 0xcb, + 0xe9, 0x59, 0xd7, 0x45, 0x89, 0xf3, 0x90, 0x8a, 0x8e, 0x90, 0xf7, 0xaa, 0x30, 0x5d, 0x7b, 0xe8, + 0x75, 0x92, 0x80, 0x98, 0xc6, 0x61, 0x8a, 0xa9, 0x2c, 0xe8, 0xce, 0x9d, 0x3e, 0x4c, 0xd3, 0x74, + 0xd6, 0x9f, 0xe6, 0x60, 0x44, 0xfc, 0x75, 0xff, 0xfa, 0x33, 0xba, 0x65, 0x5e, 0x33, 0xb6, 0xcc, + 0x19, 0x2d, 0x26, 0x35, 0x6e, 0x1c, 0xd7, 0x8f, 0xd9, 0x2c, 0x0f, 0x68, 0x80, 0x24, 0x32, 0xbb, + 0x09, 0xa3, 0x64, 0x0d, 0x44, 0x66, 0xdb, 0x7a, 0x90, 0x6b, 0x65, 0x27, 0x14, 0x5f, 0xce, 0xfd, + 0x4e, 0x5a, 0x9b, 0xa1, 0xa8, 0x85, 0x48, 0xae, 0x42, 0x93, 0x1a, 0x39, 0x51, 0x7d, 0xf4, 0xb3, + 0x93, 0x21, 0x9a, 0xb5, 0x2c, 0xc6, 0x7d, 0xbc, 0xf0, 0x2b, 0xf4, 0x90, 0x51, 0x38, 0x8a, 0xc9, + 0x69, 0x95, 0x32, 0x32, 0xf3, 0x8d, 0xe3, 0xf7, 0x4e, 0xc9, 0xc0, 0xc6, 0xea, 0xc3, 0xde, 0x83, + 0x89, 0x1b, 0x7e, 0xf0, 0xd8, 0x0d, 0x64, 0xb8, 0x4a, 0xb2, 0x1c, 0x10, 0x57, 0xc7, 0xc9, 0x1d, + 0x09, 0x97, 0x01, 0x2f, 0xbf, 0x73, 0x50, 0x1e, 0x5a, 0xf2, 0xfd, 0xa6, 0x6d, 0xa0, 0xb3, 0x0d, + 0x98, 0xbc, 0xeb, 0x3e, 0xd1, 0x2e, 0xbd, 0xd2, 0x71, 0xe6, 0x92, 0x98, 0xc0, 0xe2, 0xd6, 0x7c, + 0xbc, 0x69, 0x96, 0x49, 0xcf, 0x3c, 0x98, 0xda, 0xf4, 0x83, 0x88, 0x2a, 0xf1, 0xda, 0xbb, 0xd4, + 0xd8, 0x5e, 0xe3, 0xb2, 0x2b, 0x99, 0xc6, 0x65, 0x67, 0x3b, 0x7e, 0x10, 0x39, 0x3b, 0x31, 0xb9, + 0x11, 0xd0, 0xca, 0x60, 0xcc, 0xde, 0x83, 0x19, 0x2d, 0x60, 0xdf, 0x0d, 0x3f, 0x68, 0xb9, 0x4a, + 0x28, 0x47, 0x3d, 0x30, 0xda, 0x9b, 0xec, 0x20, 0xd8, 0xee, 0xc5, 0x64, 0x5f, 0xce, 0x72, 0x45, + 0x1a, 0x4e, 0xac, 0xd3, 0x32, 0x5c, 0x91, 0xfa, 0x59, 0xa7, 0xf5, 0x3a, 0x25, 0xed, 0x1e, 0x65, + 0xbd, 0x5a, 0x5c, 0xba, 0x4a, 0xd7, 0xef, 0xe3, 0xad, 0x53, 0xe3, 0x71, 0xeb, 0x63, 0xa5, 0xba, + 0x08, 0x85, 0xa5, 0xcd, 0x1b, 0xf8, 0x7a, 0xa1, 0x0c, 0x6d, 0xda, 0x7b, 0x6e, 0xbb, 0x8e, 0xc2, + 0x32, 0x59, 0x8c, 0xeb, 0x3b, 0xf2, 0xd2, 0xe6, 0x0d, 0xe6, 0xc2, 0xec, 0x26, 0x0f, 0x5a, 0x5e, + 0xf4, 0xa5, 0xab, 0x57, 0xb5, 0x81, 0x2a, 0xe2, 0xa7, 0x5d, 0xa1, 0x4f, 0x2b, 0x77, 0x10, 0xc5, + 0x79, 0x72, 0xf5, 0x6a, 0xe6, 0x70, 0xc4, 0x1f, 0x96, 0xc5, 0x4b, 0xec, 0x8c, 0x77, 0xdd, 0x27, + 0x89, 0xa1, 0x7f, 0x48, 0x4e, 0x9d, 0xe7, 0xd4, 0xc4, 0x4a, 0x9c, 0x04, 0x8c, 0x9d, 0xd1, 0x24, + 0x12, 0x77, 0x9d, 0x64, 0x7a, 0x85, 0xe4, 0x0e, 0xb3, 0xa0, 0x54, 0x3a, 0xca, 0xf3, 0x57, 0x17, + 0xd8, 0x35, 0x74, 0x76, 0x2f, 0xbe, 0xb1, 0xc9, 0x1b, 0x0f, 0x25, 0x44, 0xbc, 0xa2, 0xdf, 0xd8, + 0xa4, 0x22, 0xc5, 0x68, 0xd6, 0x74, 0x7c, 0xcd, 0x97, 0x9e, 0x0f, 0xb6, 0xc9, 0xa5, 0xf7, 0x22, + 0x38, 0x71, 0xf2, 0x8b, 0x20, 0x87, 0xa1, 0x35, 0xbf, 0xfe, 0x90, 0xa2, 0x70, 0x7d, 0x51, 0x2c, + 0xf7, 0xa6, 0x5f, 0x7f, 0xf8, 0xf4, 0xac, 0x72, 0x91, 0x3d, 0x5b, 0x17, 0x9f, 0x2a, 0x66, 0x01, + 0xf5, 0x09, 0x59, 0x7a, 0xce, 0xc5, 0x37, 0x21, 0xad, 0x4c, 0x0a, 0x3e, 0x72, 0xd2, 0xa8, 0xae, + 0xb5, 0x4d, 0x72, 0xc6, 0xa1, 0xb4, 0xc2, 0xc3, 0x87, 0x91, 0xdf, 0x59, 0x6e, 0x7a, 0x9d, 0x6d, + 0xdf, 0x0d, 0x54, 0x6c, 0xd4, 0xde, 0xf5, 0xfd, 0x5a, 0xe6, 0xfa, 0x9e, 0x69, 0x48, 0x7a, 0xa7, + 0xae, 0x18, 0xd8, 0x3d, 0x2c, 0xd9, 0x97, 0x61, 0x4a, 0x4c, 0xee, 0xd5, 0x27, 0x11, 0x6f, 0xcb, + 0x91, 0x9f, 0x41, 0xd1, 0x61, 0x4e, 0x4b, 0x06, 0x10, 0x17, 0xca, 0x39, 0x85, 0x8b, 0x9d, 0xc7, + 0x04, 0x46, 0x04, 0x33, 0x83, 0x15, 0x6b, 0xc0, 0xfc, 0x5d, 0xf7, 0x89, 0x96, 0xc6, 0x51, 0x9b, + 0xa4, 0x0c, 0x27, 0xd8, 0xc5, 0xc3, 0x83, 0xf2, 0x2b, 0x62, 0x82, 0x25, 0xe1, 0x7a, 0xfb, 0xcc, + 0xd7, 0xbe, 0x9c, 0xd8, 0xf7, 0xc3, 0x19, 0x6a, 0xd6, 0x0a, 0x66, 0xc8, 0xf1, 0x83, 0xfd, 0xda, + 0x9e, 0x8b, 0x3e, 0x3e, 0xb3, 0x27, 0xdb, 0x10, 0x55, 0x87, 0x35, 0x14, 0x1f, 0x27, 0x94, 0x8c, + 0xec, 0x7e, 0x35, 0xb0, 0x8f, 0x60, 0x4a, 0x3e, 0xd9, 0xdc, 0xf2, 0xc3, 0x08, 0x2f, 0xf4, 0x73, + 0x27, 0x33, 0x5d, 0x97, 0xef, 0x40, 0xd2, 0xd9, 0x23, 0xa5, 0x00, 0x48, 0x71, 0x66, 0xef, 0xc0, + 0xf8, 0xa6, 0xd7, 0x96, 0x31, 0x06, 0xab, 0x9b, 0xa8, 0x7a, 0xa4, 0xf3, 0xa7, 0xe3, 0xb5, 0x1d, + 0x75, 0xab, 0xee, 0xc4, 0xdb, 0x85, 0x8e, 0xcd, 0x1e, 0xc0, 0x78, 0xad, 0x76, 0xeb, 0x86, 0x27, + 0x0e, 0xc0, 0xce, 0xfe, 0xfc, 0xe9, 0x3e, 0x5f, 0xf9, 0x72, 0xe6, 0x57, 0x4e, 0x86, 0xe1, 0x1e, + 0xa6, 0xc6, 0x77, 0xea, 0x7e, 0x67, 0xdf, 0xd6, 0x39, 0x65, 0x98, 0x73, 0x9f, 0x79, 0xca, 0xe6, + 0xdc, 0x55, 0x98, 0xd6, 0x0c, 0x2c, 0xd1, 0xb8, 0x72, 0x3e, 0x09, 0x4c, 0xa3, 0x9b, 0x6f, 0xa7, + 0xdd, 0x17, 0xd3, 0x74, 0xca, 0x8e, 0xfb, 0xec, 0x49, 0xed, 0xb8, 0x3d, 0x98, 0x91, 0x83, 0x41, + 0xf3, 0x00, 0x47, 0x7a, 0xa1, 0x4f, 0x1f, 0x5e, 0xca, 0xec, 0xc3, 0x59, 0x1a, 0x69, 0x35, 0xc9, + 0xf0, 0x89, 0xb2, 0x97, 0x2b, 0xdb, 0x01, 0x46, 0x40, 0x4a, 0xcc, 0x8f, 0x75, 0x3d, 0xdf, 0xa7, + 0xae, 0x57, 0x32, 0xeb, 0x9a, 0x52, 0x75, 0x6d, 0xcb, 0x6a, 0x32, 0x38, 0xb2, 0xb6, 0xaa, 0x47, + 0xcd, 0x2f, 0xec, 0xd8, 0x17, 0x0c, 0x3d, 0x68, 0x2f, 0x82, 0x0c, 0xf0, 0x9b, 0x9e, 0xb4, 0xe9, + 0x7e, 0xcf, 0xe0, 0xcc, 0x9e, 0xc0, 0xe9, 0xde, 0xaf, 0xc0, 0x3a, 0xcf, 0x61, 0x9d, 0xe7, 0x8c, + 0x3a, 0xd3, 0x48, 0x72, 0xde, 0x98, 0xcd, 0x4a, 0xd7, 0xda, 0x87, 0x3f, 0xfb, 0xeb, 0x39, 0x38, + 0x73, 0xf7, 0x46, 0x05, 0xf3, 0xd1, 0x79, 0x32, 0xe4, 0x54, 0xec, 0xf6, 0xf9, 0x22, 0xe9, 0xca, + 0xd3, 0xfa, 0x7b, 0x25, 0x71, 0xe0, 0x56, 0x21, 0x64, 0xc4, 0x97, 0x5b, 0x3b, 0xae, 0x4c, 0x73, + 0x47, 0x2c, 0x32, 0x7c, 0x43, 0xbf, 0xf5, 0x07, 0xe5, 0x9c, 0xdd, 0xaf, 0x2a, 0xd6, 0x84, 0x05, + 0xb3, 0x5b, 0x94, 0xa5, 0xfd, 0x1e, 0x6f, 0x36, 0xe7, 0xcb, 0x38, 0xa3, 0xdf, 0x38, 0x3c, 0x28, + 0x5f, 0xec, 0xe9, 0xdd, 0xd8, 0x7a, 0x5f, 0x60, 0x6a, 0x0d, 0x3e, 0x82, 0xdf, 0xed, 0xa1, 0xe2, + 0x64, 0x69, 0x2a, 0xc3, 0xce, 0xdc, 0xfa, 0xb5, 0x7c, 0xea, 0xa4, 0x62, 0x55, 0x18, 0xa5, 0x09, + 0x48, 0xa2, 0x7b, 0xef, 0x34, 0x3b, 0x97, 0x39, 0xcd, 0x46, 0x69, 0x2e, 0xdb, 0x8a, 0x9e, 0x3d, + 0x16, 0xac, 0xf0, 0x2b, 0xe8, 0xae, 0xf3, 0x55, 0x79, 0x10, 0x21, 0xc8, 0x38, 0x72, 0x57, 0x4e, + 0xee, 0x3d, 0x65, 0x3a, 0xe7, 0xe1, 0xd9, 0xab, 0x6a, 0x63, 0x0f, 0x65, 0xb2, 0x94, 0x42, 0xec, + 0x82, 0x63, 0x66, 0x46, 0x79, 0x6a, 0x15, 0x8a, 0x5a, 0xac, 0x5f, 0xcd, 0xc1, 0xa4, 0x71, 0xd4, + 0xb1, 0xeb, 0x9a, 0x7f, 0x59, 0xe2, 0x72, 0x6d, 0xe0, 0xe0, 0xee, 0x97, 0xf6, 0x3c, 0xbb, 0x4e, + 0xc6, 0xe2, 0xf9, 0xfe, 0x74, 0x38, 0xfb, 0xd3, 0xee, 0x86, 0x47, 0x6b, 0x06, 0xe3, 0x14, 0x6c, + 0x43, 0x7d, 0x52, 0xb0, 0xfd, 0xd2, 0x0b, 0x30, 0x65, 0xde, 0x85, 0xd8, 0x1b, 0x30, 0x82, 0x0a, + 0x55, 0x75, 0xb1, 0x96, 0xa9, 0xeb, 0xfd, 0x54, 0x36, 0x51, 0xc2, 0x61, 0xaf, 0x02, 0xc4, 0x56, + 0xbb, 0xea, 0x39, 0x61, 0xf8, 0xf0, 0xa0, 0x9c, 0x7b, 0xd3, 0xd6, 0x0a, 0xd8, 0xd7, 0x00, 0xd6, + 0xfd, 0x06, 0x8f, 0xf3, 0x55, 0x1e, 0xf1, 0x64, 0xfe, 0x5a, 0x4f, 0x22, 0x81, 0x53, 0x6d, 0xbf, + 0xc1, 0x7b, 0xb3, 0x06, 0x68, 0x1c, 0xd9, 0xe7, 0x61, 0xd8, 0xee, 0x8a, 0x4b, 0xbc, 0xd4, 0x9f, + 0x8c, 0xab, 0x23, 0xa7, 0xdb, 0xe4, 0xc9, 0x0d, 0x31, 0xe8, 0xa6, 0xad, 0xc1, 0x04, 0x80, 0x7d, + 0x20, 0x13, 0x0c, 0x50, 0x74, 0xbe, 0xe1, 0xe4, 0x81, 0x45, 0x13, 0x45, 0x7a, 0xe2, 0xf3, 0x69, + 0x24, 0x6c, 0x03, 0x46, 0xf5, 0x97, 0x01, 0xcd, 0x51, 0x59, 0x7f, 0x3d, 0xd2, 0xae, 0x9b, 0x94, + 0xe8, 0x32, 0xfd, 0x68, 0xa0, 0xb8, 0xb0, 0x77, 0x61, 0x4c, 0xb0, 0x17, 0x4b, 0x39, 0xa4, 0x6b, + 0x06, 0x3e, 0xa3, 0x68, 0x1f, 0x24, 0xb6, 0x03, 0x23, 0x86, 0x5e, 0x4c, 0xc0, 0xbe, 0x8c, 0x29, + 0x14, 0xa9, 0xab, 0x8f, 0x34, 0xa5, 0xb8, 0xd0, 0xd3, 0xd5, 0x98, 0x53, 0xb1, 0x37, 0x27, 0x7b, + 0xcc, 0x8f, 0xed, 0xc6, 0x71, 0xb2, 0x06, 0x49, 0x0a, 0xf1, 0x7a, 0x4f, 0x05, 0xf3, 0x2a, 0xf4, + 0x53, 0x6f, 0xde, 0x51, 0x83, 0x2f, 0xeb, 0x40, 0x29, 0x91, 0xf2, 0xa8, 0x2e, 0x38, 0xaa, 0xae, + 0x37, 0x7b, 0xea, 0xd2, 0x07, 0xb0, 0xa7, 0xba, 0x1e, 0xee, 0xac, 0x01, 0x53, 0xea, 0xc4, 0xa0, + 0xfa, 0xc6, 0x8f, 0xaa, 0xef, 0xd5, 0x9e, 0xfa, 0x66, 0x1b, 0xdb, 0xbd, 0xf5, 0xa4, 0x78, 0xb2, + 0x77, 0x61, 0x52, 0x41, 0x64, 0x16, 0xd0, 0x89, 0x24, 0xdd, 0x63, 0x63, 0xbb, 0x27, 0xf7, 0xa7, + 0x89, 0xac, 0x53, 0xcb, 0xd9, 0x31, 0x69, 0x50, 0xa7, 0x67, 0x85, 0x89, 0xcc, 0x3e, 0x84, 0xf1, + 0x6a, 0x4b, 0x34, 0xc4, 0x6f, 0xbb, 0x11, 0x27, 0x27, 0x36, 0x65, 0x16, 0xa2, 0x95, 0x68, 0x53, + 0x55, 0xe6, 0x37, 0x4d, 0x8a, 0x8c, 0xfc, 0xa6, 0x09, 0x58, 0x74, 0x9e, 0x7c, 0x0a, 0xa2, 0x39, + 0xac, 0x1c, 0xdc, 0xce, 0x65, 0x98, 0x66, 0x68, 0xec, 0x29, 0x0a, 0xa6, 0x80, 0xaa, 0xa7, 0x98, + 0x54, 0x14, 0x4c, 0x9d, 0x27, 0x7b, 0x0f, 0xc6, 0x29, 0x5f, 0x4e, 0xc5, 0x5e, 0x0f, 0xe7, 0x4b, + 0xd8, 0x78, 0x74, 0xcb, 0x57, 0xa9, 0x75, 0x1c, 0x37, 0x48, 0xd9, 0x20, 0x26, 0xf8, 0xec, 0x4b, + 0x30, 0xf7, 0xc0, 0x6b, 0x37, 0xfc, 0xc7, 0x21, 0x1d, 0x53, 0xb4, 0xd1, 0xcd, 0x24, 0x1e, 0x40, + 0x8f, 0x65, 0x79, 0x2c, 0x9c, 0xf5, 0x6c, 0x7c, 0x99, 0x1c, 0xd8, 0x5f, 0xee, 0xe1, 0x2c, 0x67, + 0x10, 0x3b, 0x6a, 0x06, 0x2d, 0xf6, 0xcc, 0xa0, 0xde, 0xea, 0xd3, 0xd3, 0x29, 0xb3, 0x1a, 0xe6, + 0x03, 0x33, 0xcf, 0xf7, 0xdb, 0xbe, 0xd7, 0x9e, 0x9f, 0xc5, 0xbd, 0xf0, 0xf9, 0xb4, 0x23, 0x3c, + 0xe2, 0x51, 0x9e, 0x58, 0xeb, 0xf0, 0xa0, 0xfc, 0x62, 0x5a, 0x08, 0xff, 0xc8, 0x37, 0x14, 0xe5, + 0x19, 0xac, 0xd9, 0x87, 0x30, 0x21, 0xfe, 0x8f, 0xb5, 0x04, 0x73, 0x86, 0x31, 0x9f, 0x86, 0x49, + 0xf5, 0xe0, 0x18, 0x61, 0x42, 0x9f, 0x0c, 0x05, 0x82, 0xc1, 0x8a, 0xbd, 0x0d, 0x20, 0xe4, 0x18, + 0xda, 0x8e, 0x4f, 0x25, 0x41, 0x47, 0x51, 0x0c, 0xea, 0xdd, 0x88, 0x13, 0x64, 0xf6, 0x2e, 0x8c, + 0x8b, 0x5f, 0xb5, 0x6e, 0xc3, 0x17, 0x6b, 0xe3, 0x34, 0xd2, 0x4a, 0x7f, 0x42, 0x41, 0x1b, 0x4a, + 0xb8, 0xe1, 0x4f, 0x98, 0xa0, 0xb3, 0x5b, 0x30, 0x8d, 0xc1, 0x61, 0xab, 0x98, 0x44, 0x3a, 0xf2, + 0x78, 0x38, 0x7f, 0x46, 0x7b, 0xc2, 0x16, 0x45, 0x8e, 0x17, 0x97, 0xe9, 0x97, 0x8b, 0x14, 0x19, + 0x0b, 0x61, 0x36, 0xd9, 0x5d, 0x92, 0x07, 0xf1, 0x79, 0xec, 0x24, 0x25, 0x52, 0xf7, 0x62, 0xc8, + 0xfd, 0x58, 0x8c, 0x88, 0xb6, 0x71, 0xa9, 0xe7, 0x04, 0xbd, 0xc2, 0x2c, 0xee, 0xcc, 0x06, 0x76, + 0x73, 0x79, 0x33, 0x1d, 0x3d, 0xf5, 0x2c, 0xb6, 0x00, 0x87, 0x79, 0xb7, 0x9e, 0x24, 0xb0, 0xcd, + 0x88, 0xa0, 0x9a, 0x41, 0xcd, 0xbe, 0x09, 0xa7, 0xd4, 0x0e, 0x42, 0x45, 0x34, 0xaf, 0x17, 0x4e, + 0xb8, 0x13, 0x37, 0xb6, 0xe3, 0xaa, 0x7b, 0xa6, 0x74, 0x76, 0x15, 0xcc, 0x85, 0x71, 0x1c, 0x56, + 0xaa, 0xf1, 0xf9, 0xa3, 0x6a, 0xbc, 0xd8, 0x53, 0xe3, 0x69, 0x9c, 0x28, 0xbd, 0x95, 0xe9, 0x3c, + 0xd9, 0x12, 0x4c, 0xd2, 0x3a, 0xa2, 0xd9, 0xf6, 0x02, 0xf6, 0x16, 0x6a, 0x95, 0xd4, 0x0a, 0xec, + 0x99, 0x70, 0x26, 0x89, 0xbe, 0x23, 0xcb, 0x67, 0x84, 0x73, 0xc6, 0x8e, 0x9c, 0x7e, 0x3d, 0x30, + 0x91, 0xc5, 0x8e, 0x94, 0x48, 0x31, 0xab, 0x4f, 0x3a, 0x01, 0xe9, 0x8c, 0x5e, 0x4c, 0x92, 0x8a, + 0x68, 0xc2, 0x8f, 0xc3, 0x63, 0x0c, 0x7d, 0x4b, 0xc8, 0xe2, 0xc0, 0xee, 0xc1, 0x6c, 0x7c, 0x6a, + 0x6b, 0x8c, 0xcb, 0x49, 0x72, 0x96, 0xe4, 0xa8, 0xcf, 0xe6, 0x9b, 0x45, 0xcf, 0x5c, 0x38, 0x63, + 0x9c, 0xd3, 0x1a, 0xeb, 0xf3, 0xc8, 0x1a, 0x13, 0x26, 0x9b, 0x87, 0x7c, 0x36, 0xfb, 0x7e, 0x7c, + 0xd8, 0x47, 0xb0, 0x90, 0x3e, 0x9b, 0xb5, 0x5a, 0x5e, 0xc2, 0x5a, 0x5e, 0x3f, 0x3c, 0x28, 0x5f, + 0xe8, 0x39, 0xde, 0xb3, 0x2b, 0x3a, 0x82, 0x1b, 0xfb, 0x1a, 0xcc, 0x9b, 0xe7, 0xb3, 0x56, 0x93, + 0x85, 0x35, 0xe1, 0xd2, 0x89, 0x0f, 0xf6, 0xec, 0x1a, 0xfa, 0xf2, 0x60, 0x11, 0x94, 0x33, 0x67, + 0xb7, 0x56, 0xcd, 0xcb, 0x49, 0x83, 0x7a, 0x56, 0x49, 0x76, 0x75, 0xc7, 0xb1, 0x64, 0x8f, 0xe1, + 0xc5, 0xac, 0x63, 0x42, 0xab, 0xf4, 0x95, 0x58, 0x2b, 0xfb, 0xa9, 0xec, 0x23, 0x27, 0xbb, 0xe6, + 0x63, 0xd8, 0xb2, 0x2f, 0xc3, 0x29, 0x6d, 0x7d, 0x69, 0xf5, 0xbd, 0x8a, 0xf5, 0xa1, 0xff, 0xae, + 0xbe, 0x30, 0xb3, 0x6b, 0xc9, 0xe6, 0xc1, 0x5a, 0x30, 0xab, 0x1a, 0x8e, 0xea, 0x6f, 0x3a, 0x7a, + 0x2e, 0x18, 0xbb, 0x6a, 0x2f, 0x86, 0x96, 0xf2, 0x7e, 0xdb, 0xe9, 0x24, 0x84, 0xfa, 0x4c, 0xcf, + 0xe0, 0xcb, 0x6e, 0xc1, 0x48, 0x6d, 0xb3, 0x7a, 0xe3, 0xc6, 0xea, 0xfc, 0x6b, 0x58, 0x83, 0x72, + 0xf6, 0x91, 0x40, 0xe3, 0xd2, 0x44, 0x36, 0x66, 0x1d, 0x6f, 0x67, 0xc7, 0xf0, 0xa9, 0x92, 0xa8, + 0xec, 0x2f, 0xa3, 0x75, 0x97, 0xd8, 0x51, 0x2b, 0x61, 0xe8, 0xed, 0x62, 0x96, 0x89, 0x70, 0xfe, + 0x75, 0xe3, 0xa5, 0x97, 0x4e, 0x8f, 0xfd, 0x65, 0xcc, 0xf7, 0xd3, 0x83, 0x2e, 0xa5, 0xcd, 0xc3, + 0x83, 0xf2, 0x39, 0xda, 0xb9, 0x1d, 0x37, 0x61, 0xa5, 0x6f, 0xe2, 0xbd, 0x15, 0xdd, 0x1e, 0x2a, + 0x5e, 0x2c, 0x5d, 0xba, 0x3d, 0x54, 0xbc, 0x54, 0x7a, 0xdd, 0x7e, 0x21, 0x3b, 0x47, 0xb9, 0xec, + 0x6b, 0xfb, 0xc2, 0x51, 0xa5, 0xc9, 0x48, 0x58, 0x7f, 0x37, 0x07, 0xe5, 0x63, 0x3e, 0x58, 0xec, + 0xad, 0x49, 0x6f, 0xd6, 0xb8, 0x72, 0x21, 0x96, 0xee, 0x34, 0x71, 0x81, 0x63, 0x3e, 0x5e, 0x9b, + 0x24, 0xe8, 0xb5, 0x44, 0x41, 0xe3, 0x35, 0xe7, 0xb5, 0xde, 0x60, 0xf1, 0x0a, 0xcb, 0xfa, 0x99, + 0x1c, 0xcc, 0x66, 0x8c, 0x0f, 0xbb, 0x00, 0x43, 0x98, 0x05, 0x46, 0xb3, 0x36, 0x48, 0x65, 0x7f, + 0xc1, 0x72, 0xf6, 0x69, 0x18, 0x5d, 0x59, 0xaf, 0xd5, 0x2a, 0xeb, 0xea, 0x2a, 0x2b, 0xb7, 0xf1, + 0x76, 0xe8, 0x84, 0xae, 0xf9, 0x48, 0x49, 0x68, 0xec, 0x4d, 0x18, 0xa9, 0x6e, 0x22, 0x81, 0x34, + 0x77, 0xc3, 0x2f, 0xf4, 0x3a, 0x69, 0x7c, 0x42, 0xb2, 0x7e, 0x34, 0x07, 0xac, 0x77, 0xb2, 0xb1, + 0xab, 0x30, 0xae, 0x4f, 0x69, 0x79, 0xf1, 0xc6, 0x07, 0x35, 0x6d, 0xc2, 0xda, 0x3a, 0x0e, 0x5b, + 0x81, 0x61, 0xcc, 0x93, 0x17, 0xbf, 0x8e, 0x66, 0x1e, 0x8c, 0x67, 0x7a, 0x0e, 0xc6, 0x61, 0xcc, + 0xc2, 0x67, 0x4b, 0x62, 0xeb, 0x37, 0x73, 0xc0, 0x7a, 0x85, 0x89, 0x81, 0xad, 0x33, 0xde, 0xd2, + 0xdc, 0x95, 0xf5, 0x3c, 0x0f, 0x71, 0x92, 0x1e, 0xfd, 0x12, 0x99, 0x38, 0x36, 0x5f, 0x30, 0x94, + 0x16, 0xfd, 0x7d, 0xdc, 0x2e, 0xc1, 0xf0, 0x7d, 0x1e, 0x6c, 0x2b, 0x4b, 0x4e, 0xb4, 0xfe, 0x7a, + 0x24, 0x00, 0xfa, 0x25, 0x1e, 0x31, 0xac, 0x3f, 0xca, 0xc1, 0x5c, 0x96, 0x84, 0x7b, 0x8c, 0x2b, + 0x9a, 0x95, 0xf2, 0xa2, 0x43, 0xcb, 0x0c, 0x69, 0x1a, 0x16, 0xfb, 0xce, 0x95, 0x61, 0x58, 0x34, + 0x56, 0x8d, 0x30, 0x2a, 0x51, 0x44, 0x6f, 0x84, 0xb6, 0x84, 0x0b, 0x04, 0x19, 0x96, 0x6b, 0x08, + 0x23, 0xba, 0x21, 0x02, 0xce, 0x47, 0x5b, 0xc2, 0x05, 0xc2, 0x5d, 0xbf, 0x11, 0xa7, 0x88, 0x46, + 0x84, 0x96, 0x00, 0xd8, 0x12, 0xce, 0x2e, 0xc0, 0xe8, 0x46, 0x7b, 0x8d, 0xbb, 0x8f, 0x54, 0xac, + 0x71, 0xb4, 0x24, 0xf1, 0xdb, 0x4e, 0x53, 0xc0, 0x6c, 0x55, 0x68, 0xfd, 0x44, 0x0e, 0x66, 0x7a, + 0x84, 0xeb, 0xe3, 0xbd, 0xed, 0x8e, 0x76, 0x7b, 0x19, 0xa4, 0x7d, 0xf2, 0xf3, 0x87, 0xb2, 0x3f, + 0xdf, 0xfa, 0x7f, 0x87, 0xe0, 0x4c, 0x1f, 0x5d, 0x47, 0xe2, 0x96, 0x97, 0x3b, 0xd6, 0x2d, 0xef, + 0x2b, 0x30, 0xb9, 0xdc, 0x74, 0xbd, 0x56, 0xb8, 0xe5, 0x27, 0x5f, 0x9c, 0x58, 0xf7, 0x63, 0x99, + 0xca, 0x92, 0xad, 0xcc, 0xc0, 0xcf, 0xd6, 0x91, 0xc2, 0x89, 0xfc, 0x5e, 0x51, 0xcb, 0x60, 0xd6, + 0xe3, 0x18, 0x57, 0xf8, 0x73, 0xe2, 0x18, 0x67, 0xba, 0x6a, 0x0c, 0x3d, 0x55, 0x57, 0x8d, 0x6c, + 0x33, 0xcf, 0xe1, 0x4f, 0x62, 0xf4, 0xbb, 0x0c, 0x93, 0xd2, 0x94, 0xa6, 0x12, 0xca, 0x41, 0x1a, + 0xe9, 0x31, 0xbf, 0x71, 0xc3, 0xde, 0xb1, 0x30, 0x68, 0xd8, 0x2d, 0xd3, 0xad, 0x60, 0x14, 0x9f, + 0x00, 0x2f, 0xf4, 0x77, 0x1b, 0x30, 0x9e, 0xfe, 0x75, 0x52, 0xeb, 0x27, 0xf2, 0xa6, 0xd7, 0xdc, + 0x9f, 0xc7, 0x99, 0x77, 0x09, 0x86, 0x1f, 0xec, 0xf1, 0x40, 0xed, 0x77, 0xf8, 0x21, 0x8f, 0x05, + 0x40, 0xff, 0x10, 0xc4, 0x60, 0x37, 0x60, 0x6a, 0x53, 0x8e, 0x84, 0xea, 0xde, 0xa1, 0xe4, 0x0a, + 0xda, 0x21, 0x45, 0x49, 0x46, 0xff, 0xa6, 0xa8, 0xac, 0x9b, 0x70, 0xce, 0x58, 0x90, 0x14, 0xe5, + 0x43, 0x5a, 0xf7, 0xcb, 0x13, 0x71, 0x2a, 0xf1, 0x67, 0x48, 0x76, 0x0f, 0x3b, 0x05, 0xb5, 0x76, + 0xe0, 0xc5, 0x23, 0x19, 0x89, 0x83, 0x08, 0x3a, 0xf1, 0xaf, 0x94, 0x09, 0xe2, 0x91, 0xa4, 0xb6, + 0x46, 0x67, 0x7d, 0x3f, 0x4c, 0xe8, 0xbd, 0x8c, 0x7b, 0xaa, 0xf8, 0x4d, 0x9b, 0x9a, 0xdc, 0x53, + 0x05, 0xc0, 0x96, 0xf0, 0x44, 0xb5, 0x9d, 0xcf, 0x56, 0x6d, 0x27, 0xc3, 0x5f, 0x38, 0x6e, 0xf8, + 0x45, 0xe5, 0xb8, 0x64, 0xb5, 0xca, 0xf1, 0xb7, 0x5e, 0x39, 0x86, 0xf1, 0xb0, 0x25, 0xfc, 0xa9, + 0x56, 0xfe, 0x1b, 0x2a, 0xdb, 0x0a, 0x3a, 0x0f, 0x28, 0x5d, 0x41, 0x92, 0xbd, 0x79, 0x36, 0x4b, + 0x03, 0x90, 0x60, 0x26, 0x87, 0x64, 0xfe, 0xb8, 0x43, 0xf2, 0x24, 0x13, 0x11, 0x45, 0x2f, 0x39, + 0xa4, 0x43, 0x89, 0x60, 0xe3, 0xf6, 0xbc, 0xc6, 0x2b, 0x2c, 0xeb, 0x5b, 0x39, 0x38, 0x95, 0xa9, + 0x42, 0x14, 0xb5, 0x4a, 0x5d, 0xa5, 0xb6, 0x0e, 0xd3, 0x8a, 0x4a, 0x89, 0x71, 0x12, 0x1f, 0xee, + 0xc1, 0xdb, 0x62, 0xbd, 0x04, 0x63, 0xf1, 0x03, 0x16, 0x9b, 0x53, 0x43, 0x87, 0x56, 0x5b, 0xea, + 0x1d, 0xa4, 0x06, 0x20, 0xbe, 0xe0, 0xa9, 0xda, 0x18, 0x5a, 0xbf, 0x91, 0x97, 0x99, 0xf8, 0x9e, + 0xd9, 0x70, 0x8c, 0xd9, 0x86, 0x81, 0xa2, 0x49, 0xfd, 0x83, 0x30, 0xb2, 0x55, 0x18, 0xa9, 0x45, + 0x6e, 0xd4, 0x55, 0xae, 0xe7, 0xb3, 0x3a, 0x19, 0x16, 0xdc, 0x5f, 0x4c, 0x9c, 0x8f, 0x43, 0x84, + 0x18, 0x97, 0x26, 0x84, 0x68, 0xf6, 0x85, 0xbf, 0x93, 0x83, 0x09, 0x9d, 0x98, 0x7d, 0x08, 0x53, + 0x2a, 0xc8, 0x9c, 0x74, 0xc8, 0xa7, 0xd7, 0x36, 0x65, 0xaa, 0xa2, 0x82, 0xcc, 0xe9, 0x0e, 0xfc, + 0x06, 0xbe, 0xbe, 0x55, 0x77, 0x74, 0x64, 0xd6, 0x00, 0xd6, 0xda, 0x71, 0x9d, 0xc7, 0xdc, 0x7d, + 0xc8, 0xc3, 0xc8, 0x91, 0x26, 0x05, 0xf4, 0x28, 0xa7, 0xd8, 0xdf, 0xbd, 0x51, 0x91, 0xd6, 0x04, + 0x62, 0x24, 0x28, 0x5a, 0x60, 0x0f, 0x8d, 0xfe, 0xd2, 0xd0, 0xda, 0x71, 0x1f, 0xc8, 0x42, 0x49, + 0x67, 0xfd, 0xf1, 0x88, 0x9c, 0x6e, 0x14, 0x93, 0x72, 0x1b, 0xa6, 0x36, 0xaa, 0x2b, 0xcb, 0x9a, + 0xde, 0xd1, 0x4c, 0x69, 0xb2, 0xfa, 0x24, 0xe2, 0x41, 0xdb, 0x6d, 0xaa, 0x2b, 0x57, 0x72, 0x04, + 0xf9, 0x5e, 0xa3, 0x9e, 0xad, 0x93, 0x4c, 0x71, 0x14, 0x75, 0xc8, 0xcb, 0x5d, 0x5c, 0x47, 0x7e, + 0xc0, 0x3a, 0x42, 0xb7, 0xd5, 0xec, 0x53, 0x87, 0xc9, 0x91, 0xed, 0x41, 0xe9, 0x26, 0x8a, 0x4b, + 0x5a, 0x2d, 0x85, 0xa3, 0x6b, 0x79, 0x99, 0x6a, 0x79, 0x5e, 0xca, 0x59, 0xd9, 0xf5, 0xf4, 0x70, + 0x4d, 0xf6, 0x89, 0xa1, 0x63, 0xf7, 0x89, 0xbf, 0x91, 0x83, 0x11, 0x29, 0x8f, 0xd1, 0x34, 0xee, + 0x23, 0xf1, 0x3d, 0x78, 0x3a, 0x12, 0x5f, 0x09, 0xcf, 0x09, 0x63, 0x42, 0xcb, 0x32, 0xb6, 0x92, + 0x5a, 0x17, 0xca, 0x2c, 0x16, 0x5f, 0x10, 0x64, 0xc9, 0xf1, 0xcb, 0x82, 0x55, 0x13, 0x77, 0xf0, + 0xd1, 0x63, 0x3d, 0x0e, 0x95, 0x0b, 0xfd, 0x28, 0xb9, 0x83, 0x9b, 0x4e, 0xe0, 0x6b, 0x30, 0x46, + 0x4e, 0xe6, 0x4b, 0xfb, 0xf4, 0x4e, 0x58, 0x32, 0x4c, 0x2f, 0x1a, 0x4b, 0xfb, 0x89, 0xac, 0x49, + 0x6e, 0xea, 0xce, 0xf6, 0xbe, 0x91, 0xd8, 0x50, 0x21, 0xb2, 0x0d, 0x99, 0xf0, 0x4b, 0x46, 0xed, + 0x34, 0xc3, 0x74, 0xc7, 0x70, 0x0a, 0x5f, 0xa3, 0x3c, 0x55, 0x33, 0x82, 0x74, 0x26, 0x3c, 0xd8, + 0x1a, 0x94, 0xd0, 0x5c, 0x87, 0x37, 0xe4, 0xaa, 0xa9, 0xae, 0x48, 0x47, 0x66, 0x32, 0xb9, 0x8c, + 0x64, 0x19, 0x2d, 0xb7, 0x94, 0x0f, 0x51, 0x0f, 0xa5, 0xb8, 0x1f, 0x96, 0xd2, 0xb3, 0x8f, 0xbd, + 0x0b, 0xe3, 0x71, 0xd4, 0xd4, 0xd8, 0x8b, 0x11, 0xdf, 0x0b, 0x92, 0x30, 0xab, 0x66, 0x9a, 0x28, + 0x0d, 0x9d, 0x2d, 0x42, 0x51, 0x2c, 0xe2, 0x74, 0x4a, 0xc5, 0x2e, 0xc1, 0x74, 0xd7, 0x04, 0x85, + 0xc7, 0x6a, 0x30, 0x2b, 0x16, 0x4d, 0xcd, 0x6b, 0xef, 0x36, 0xf9, 0x9a, 0xbf, 0xeb, 0x77, 0xa3, + 0x7b, 0xf6, 0x1a, 0xed, 0xe1, 0x52, 0x22, 0x77, 0x5b, 0x4d, 0xa3, 0x38, 0x30, 0x12, 0x66, 0x67, + 0x50, 0x6b, 0x5b, 0xe5, 0x1f, 0xe4, 0x61, 0x5c, 0x9b, 0x4f, 0xec, 0x12, 0x14, 0xab, 0xe1, 0x9a, + 0x5f, 0x7f, 0x18, 0xc7, 0x37, 0x9b, 0x3c, 0x3c, 0x28, 0x8f, 0x79, 0xa1, 0xd3, 0x44, 0xa0, 0x1d, + 0x17, 0xb3, 0x25, 0x98, 0x94, 0x7f, 0xa9, 0x68, 0xf6, 0xf9, 0x44, 0x5f, 0x23, 0x91, 0x55, 0x1c, + 0x7b, 0x7d, 0xf7, 0x34, 0x48, 0xd8, 0x57, 0x01, 0x24, 0x00, 0x3d, 0x62, 0x0b, 0x83, 0xfb, 0xf2, + 0x52, 0x05, 0x19, 0xbe, 0xb0, 0x1a, 0x43, 0xf6, 0x75, 0x19, 0x65, 0x55, 0xcd, 0xff, 0xa1, 0xc1, + 0x9d, 0x91, 0x05, 0x7f, 0x27, 0x3b, 0x26, 0x82, 0xce, 0x92, 0x12, 0x50, 0x2c, 0xd8, 0xbc, 0xee, + 0x3f, 0xe2, 0xc1, 0x7e, 0x25, 0x42, 0x44, 0x0d, 0xc3, 0xfa, 0x9f, 0x72, 0xda, 0xaa, 0x61, 0xeb, + 0x98, 0x05, 0x54, 0xce, 0x08, 0x32, 0x99, 0x89, 0xef, 0x0c, 0x0a, 0x6e, 0xf3, 0x9d, 0xa5, 0xe7, + 0xc9, 0xc0, 0x77, 0x36, 0x9e, 0x57, 0xa9, 0xec, 0xa0, 0x12, 0xc8, 0xbe, 0x00, 0x43, 0xd8, 0x75, + 0xf9, 0x63, 0x9b, 0xa6, 0x8e, 0xed, 0x21, 0xd1, 0x67, 0xd8, 0x10, 0xa4, 0x64, 0x9f, 0x26, 0x6f, + 0x42, 0xd9, 0xf9, 0x53, 0xda, 0xd9, 0x2b, 0xbe, 0x23, 0x3e, 0xaf, 0x93, 0xb0, 0x18, 0xda, 0xec, + 0xf9, 0xbb, 0x79, 0x28, 0xa5, 0xd7, 0x2a, 0xfb, 0x00, 0x26, 0xd4, 0x79, 0x8a, 0x69, 0xe2, 0x45, + 0x2b, 0x27, 0x28, 0x14, 0xba, 0x3a, 0x54, 0xd3, 0x59, 0xe2, 0x75, 0x02, 0x21, 0xdc, 0x6c, 0x51, + 0x98, 0x2a, 0x6d, 0x95, 0x44, 0x7e, 0xd4, 0x49, 0x05, 0xf7, 0x54, 0x68, 0xec, 0x2d, 0x28, 0xdc, + 0xbd, 0x51, 0x21, 0xd7, 0x95, 0x52, 0xfa, 0xd4, 0x95, 0xa6, 0x79, 0xa6, 0xa1, 0xa0, 0xc0, 0x67, + 0x6b, 0x5a, 0x1c, 0xdc, 0x11, 0x23, 0xff, 0x95, 0x02, 0xc7, 0x8d, 0x3b, 0x3e, 0x20, 0xae, 0xcc, + 0x3f, 0x4f, 0x91, 0x1d, 0xff, 0x9b, 0x02, 0x8c, 0xc5, 0xf5, 0x33, 0x06, 0x28, 0xbb, 0xd1, 0x85, + 0x09, 0xff, 0x66, 0x67, 0xa1, 0xa8, 0xc4, 0x35, 0xf2, 0x60, 0x19, 0x0d, 0x49, 0x54, 0x9b, 0x07, + 0x25, 0x97, 0xc9, 0x65, 0x6e, 0xab, 0x9f, 0xec, 0x2a, 0xc4, 0x42, 0x57, 0x3f, 0xe9, 0x6c, 0x48, + 0x0c, 0x98, 0x1d, 0xa3, 0xb1, 0x29, 0xc8, 0x7b, 0x32, 0x5a, 0xd0, 0x98, 0x9d, 0xf7, 0x1a, 0xec, + 0x03, 0x28, 0xba, 0x8d, 0x06, 0x6f, 0x38, 0xae, 0xb2, 0x3d, 0x39, 0x6a, 0xd2, 0x14, 0x05, 0x37, + 0x79, 0x08, 0x20, 0x55, 0x25, 0x62, 0x15, 0x18, 0x6b, 0xba, 0xd2, 0xbc, 0xac, 0x31, 0xc0, 0x89, + 0x92, 0x70, 0x28, 0x0a, 0xb2, 0x7b, 0x21, 0x6f, 0xb0, 0xd7, 0x60, 0x48, 0x8c, 0x26, 0x1d, 0x21, + 0x4a, 0x4a, 0x14, 0x83, 0x29, 0x3b, 0xec, 0xd6, 0x73, 0x36, 0x22, 0xb0, 0x57, 0xa0, 0xd0, 0x5d, + 0xdc, 0xa1, 0xc3, 0xa1, 0x94, 0xc4, 0xa4, 0x8e, 0xd1, 0x44, 0x31, 0xbb, 0x06, 0xc5, 0xc7, 0x66, + 0x38, 0xe3, 0x53, 0xa9, 0x61, 0x8c, 0xf1, 0x63, 0x44, 0xf6, 0x1a, 0x14, 0xc2, 0xd0, 0x27, 0x83, + 0x0d, 0xb5, 0x04, 0x6b, 0xb5, 0x8d, 0x78, 0xd4, 0x04, 0xf7, 0x30, 0xf4, 0x97, 0x8a, 0x30, 0x22, + 0x4f, 0x0c, 0xeb, 0x45, 0x80, 0xe4, 0x1b, 0x7b, 0x3d, 0x92, 0xac, 0xaf, 0xc2, 0x58, 0xfc, 0x6d, + 0xec, 0x1c, 0xc0, 0x43, 0xbe, 0xef, 0xec, 0xb9, 0xed, 0x46, 0x53, 0x8a, 0x9b, 0x13, 0xf6, 0xd8, + 0x43, 0xbe, 0x7f, 0x0b, 0x01, 0xec, 0x0c, 0x8c, 0x76, 0xc4, 0xf0, 0xd3, 0x1c, 0x9f, 0xb0, 0x47, + 0x3a, 0xdd, 0x6d, 0x31, 0x95, 0xe7, 0x61, 0x14, 0x35, 0x81, 0xb4, 0x22, 0x27, 0x6d, 0xf5, 0xd3, + 0xfa, 0x93, 0x02, 0xe6, 0xfc, 0xd0, 0x1a, 0xc4, 0x5e, 0x86, 0xc9, 0x7a, 0xc0, 0xf1, 0x70, 0x72, + 0x85, 0xc8, 0x45, 0xf5, 0x4c, 0x24, 0xc0, 0x6a, 0x83, 0x5d, 0x80, 0xe9, 0x4e, 0x77, 0xbb, 0xe9, + 0xd5, 0x45, 0x6d, 0x4e, 0x7d, 0x9b, 0x82, 0x94, 0x4f, 0xd8, 0x93, 0x12, 0x7c, 0x87, 0xef, 0x2f, + 0x6f, 0x63, 0x38, 0xac, 0x92, 0x1e, 0xcd, 0x34, 0x8a, 0x53, 0xea, 0xda, 0xd3, 0x1a, 0x1c, 0x6d, + 0xcf, 0x4e, 0xc3, 0x88, 0xeb, 0xee, 0x76, 0x3d, 0x19, 0xb6, 0x66, 0xc2, 0xa6, 0x5f, 0xec, 0x53, + 0x30, 0x93, 0x04, 0xd8, 0x55, 0xcd, 0x18, 0xc6, 0x66, 0x94, 0xe2, 0x82, 0x65, 0x09, 0x67, 0x6f, + 0x02, 0xd3, 0xeb, 0xf3, 0xb7, 0x3f, 0xe2, 0x75, 0x39, 0x27, 0x27, 0xec, 0x19, 0xad, 0x64, 0x03, + 0x0b, 0xd8, 0x4b, 0x30, 0x11, 0xf0, 0x10, 0xc5, 0x3d, 0xec, 0x36, 0x4c, 0x89, 0x65, 0x8f, 0x2b, + 0x98, 0xe8, 0xbb, 0x8b, 0x50, 0xd2, 0xba, 0x03, 0x03, 0xc6, 0xca, 0x08, 0xdd, 0xf6, 0x54, 0x02, + 0xb7, 0x3b, 0xd5, 0x06, 0xfb, 0x12, 0x2c, 0x68, 0x98, 0x32, 0x3b, 0x97, 0xc3, 0x9b, 0xde, 0xae, + 0xb7, 0xdd, 0xe4, 0x34, 0xdf, 0x7a, 0x67, 0x75, 0x7c, 0x27, 0xb4, 0xe7, 0x13, 0x6a, 0x99, 0xb7, + 0x6b, 0x95, 0x68, 0xd9, 0x1a, 0xcc, 0xa5, 0x38, 0xf3, 0x86, 0xd3, 0xed, 0xf4, 0x8d, 0x13, 0x95, + 0xf0, 0x64, 0x26, 0x4f, 0xde, 0xb8, 0xd7, 0xb1, 0xbe, 0x04, 0x13, 0xfa, 0x9c, 0x14, 0x9d, 0xa0, + 0x0b, 0x1a, 0x34, 0xfb, 0xc6, 0x63, 0x58, 0x55, 0x5c, 0xf4, 0xa6, 0x12, 0x94, 0x28, 0xce, 0x1e, + 0x6c, 0x4f, 0xc6, 0x50, 0x31, 0x84, 0xd6, 0x12, 0xcc, 0xf4, 0x6c, 0x72, 0x5a, 0x22, 0x78, 0xb9, + 0x69, 0x1f, 0x9d, 0x08, 0xde, 0x6a, 0xc3, 0x84, 0x7e, 0x68, 0x1d, 0x13, 0x2a, 0xff, 0x34, 0x06, + 0x7e, 0x90, 0x3b, 0xfa, 0xc8, 0xe1, 0x41, 0x39, 0xef, 0x35, 0x30, 0xdc, 0xc3, 0x45, 0x28, 0x2a, + 0xf9, 0x8a, 0xc4, 0x1a, 0xd4, 0x65, 0x93, 0x60, 0xbf, 0x6f, 0xc7, 0xa5, 0xd6, 0x6b, 0x30, 0x4a, + 0xe7, 0xd2, 0xd1, 0x1a, 0x6c, 0xeb, 0x87, 0xf2, 0x30, 0x6d, 0x73, 0xb1, 0x6b, 0x72, 0x99, 0x1f, + 0xe3, 0x99, 0xbd, 0x50, 0x67, 0x87, 0x0f, 0x34, 0xda, 0x76, 0x44, 0x66, 0x8a, 0x7f, 0x94, 0x83, + 0xd9, 0x0c, 0xdc, 0x8f, 0x95, 0x99, 0xf1, 0x3a, 0x8c, 0xad, 0x78, 0x6e, 0xb3, 0xd2, 0x68, 0xc4, + 0x51, 0x20, 0x50, 0x2a, 0xc7, 0xf4, 0x2d, 0xae, 0x80, 0xea, 0x12, 0x4a, 0x8c, 0xca, 0x5e, 0xa7, + 0x49, 0x91, 0x24, 0xa7, 0xc5, 0x49, 0xf1, 0x9d, 0x83, 0x32, 0xc8, 0x6f, 0x4a, 0x32, 0x56, 0x63, + 0x48, 0x4f, 0x09, 0x4c, 0xbc, 0x34, 0x9e, 0xd9, 0xa1, 0xcb, 0x0e, 0xe9, 0x99, 0x6e, 0xde, 0x40, + 0xc9, 0x29, 0xfe, 0x56, 0x1e, 0x4e, 0x67, 0x13, 0x7e, 0xdc, 0x24, 0x9b, 0x98, 0x16, 0x44, 0x0b, + 0x43, 0x8c, 0x49, 0x36, 0x65, 0x0e, 0x11, 0xc4, 0x4f, 0x10, 0xd8, 0x0e, 0x4c, 0xae, 0xb9, 0x61, + 0x74, 0x8b, 0xbb, 0x41, 0xb4, 0xcd, 0xdd, 0x68, 0x00, 0x31, 0xfd, 0x15, 0xf5, 0x80, 0x8e, 0x92, + 0xc2, 0x9e, 0xa2, 0x4c, 0x09, 0xd2, 0x26, 0xdb, 0x78, 0xa2, 0x0c, 0x0d, 0x30, 0x51, 0xbe, 0x01, + 0xd3, 0x35, 0xde, 0x72, 0x3b, 0x7b, 0x7e, 0xa0, 0xdc, 0x7c, 0x2f, 0xc3, 0x64, 0x0c, 0xca, 0x9c, + 0x2d, 0x66, 0xb1, 0x81, 0xaf, 0x75, 0x44, 0xb2, 0x95, 0x98, 0xc5, 0xd6, 0xdf, 0xcb, 0xc3, 0x99, + 0x4a, 0x9d, 0xec, 0xda, 0xa8, 0x40, 0x99, 0xdf, 0x7e, 0x97, 0xeb, 0x66, 0x57, 0x60, 0xec, 0xae, + 0xfb, 0x64, 0x8d, 0xbb, 0x21, 0x0f, 0x29, 0xc5, 0x99, 0x94, 0x69, 0xdd, 0x27, 0x89, 0xb9, 0x97, + 0x9d, 0xe0, 0xe8, 0x97, 0xfe, 0xa1, 0x4f, 0x78, 0xe9, 0xb7, 0x60, 0xe4, 0x96, 0xdf, 0x6c, 0xd0, + 0x41, 0x4e, 0x0f, 0x9e, 0x7b, 0x08, 0xb1, 0xa9, 0x44, 0xdc, 0x95, 0xa7, 0xe2, 0x2f, 0xc6, 0x4f, + 0xf8, 0xae, 0x77, 0xc9, 0x05, 0x18, 0xc5, 0x8a, 0xe2, 0x24, 0xd1, 0x78, 0x68, 0x34, 0x39, 0x26, + 0xaa, 0x6a, 0xd8, 0xaa, 0x50, 0xef, 0x89, 0xe1, 0x4f, 0xd6, 0x13, 0xd6, 0x3f, 0xc4, 0xb7, 0x54, + 0xbd, 0x95, 0xe2, 0x24, 0xd2, 0x3e, 0x24, 0x37, 0xe0, 0x87, 0xe4, 0x9f, 0xda, 0x90, 0x14, 0xfa, + 0x0e, 0xc9, 0x0f, 0xe7, 0x61, 0x3c, 0xfe, 0xd8, 0xef, 0xb1, 0x58, 0xd8, 0x71, 0xbb, 0x06, 0x0a, + 0xcd, 0x51, 0xd3, 0xf6, 0x0a, 0x8a, 0x80, 0xf1, 0x05, 0x18, 0xa1, 0xc5, 0x94, 0x4b, 0x99, 0xa1, + 0xa6, 0x46, 0x77, 0x69, 0x8a, 0x58, 0x8f, 0xe0, 0x80, 0x86, 0x36, 0xd1, 0x61, 0xec, 0x93, 0x07, + 0x7c, 0x9b, 0x9e, 0xd6, 0x9f, 0xd9, 0x33, 0x2a, 0x3b, 0xf6, 0x49, 0xd2, 0xb0, 0x81, 0x4e, 0xa7, + 0x7f, 0x56, 0x84, 0x52, 0x9a, 0xe4, 0xf8, 0x68, 0xe3, 0x9b, 0xdd, 0x6d, 0x79, 0x0f, 0x91, 0xd1, + 0xc6, 0x3b, 0xdd, 0x6d, 0x5b, 0xc0, 0xd0, 0xf2, 0x26, 0xf0, 0x1e, 0x61, 0xab, 0x27, 0xc8, 0xf2, + 0x26, 0xf0, 0x1e, 0x19, 0x96, 0x37, 0x81, 0xf7, 0x08, 0xb5, 0x04, 0x6b, 0x35, 0x74, 0xd7, 0xc6, + 0x4b, 0x08, 0x69, 0x09, 0x9a, 0x61, 0x3a, 0x73, 0x90, 0x42, 0x13, 0x47, 0xe5, 0x12, 0x77, 0x03, + 0x8a, 0x8c, 0x4d, 0xdb, 0x19, 0x1e, 0x95, 0xdb, 0x08, 0x96, 0x89, 0xbe, 0x6d, 0x1d, 0x89, 0x35, + 0x81, 0x69, 0x3f, 0xd5, 0x02, 0x3e, 0xfe, 0xe2, 0xac, 0x4c, 0xc8, 0xe6, 0x74, 0xd6, 0x8e, 0xbe, + 0x9a, 0x33, 0xf8, 0x3e, 0x4d, 0x5d, 0xed, 0x26, 0x85, 0xfb, 0x43, 0xed, 0x50, 0xf1, 0x58, 0x66, + 0x2a, 0x9e, 0x01, 0xc8, 0x70, 0x80, 0xb1, 0x8e, 0x28, 0x61, 0xc2, 0xde, 0x87, 0x71, 0xdd, 0x09, + 0x5f, 0xba, 0x8a, 0xbf, 0x20, 0x23, 0xb8, 0xf5, 0xc9, 0x35, 0xa9, 0x13, 0xb0, 0x6d, 0x38, 0xb3, + 0xec, 0xb7, 0xc3, 0x6e, 0x4b, 0xc5, 0x8a, 0x4b, 0x22, 0xd4, 0x02, 0x0e, 0x05, 0x7a, 0xf4, 0xd6, + 0x09, 0x85, 0x7c, 0xbe, 0x95, 0x8d, 0xbf, 0x79, 0x01, 0xe9, 0xc7, 0x88, 0x6d, 0xc1, 0x38, 0xea, + 0x3b, 0xc9, 0x88, 0x70, 0xdc, 0xdc, 0x36, 0x92, 0x92, 0x15, 0xb1, 0x30, 0x64, 0xb0, 0x23, 0xb7, + 0xd5, 0x54, 0x26, 0xe6, 0xba, 0xde, 0x56, 0x43, 0x66, 0x5f, 0x85, 0x29, 0x79, 0xff, 0x7a, 0xc0, + 0xb7, 0xe5, 0xdc, 0x99, 0x30, 0xd4, 0x0c, 0x66, 0xa1, 0x7c, 0x7a, 0x27, 0x2d, 0xf3, 0x63, 0xbe, + 0x2d, 0xc7, 0xde, 0x70, 0xf0, 0x30, 0xf0, 0xd9, 0x3d, 0x98, 0xbd, 0xe5, 0x86, 0x12, 0xa8, 0x79, + 0x53, 0x4f, 0xa2, 0xfa, 0x15, 0x0d, 0x6f, 0xf7, 0xdc, 0x50, 0xa9, 0xad, 0x33, 0xbd, 0xa7, 0xb3, + 0xe8, 0xd9, 0x0f, 0xe5, 0x60, 0xde, 0xd0, 0x6a, 0x93, 0x99, 0x53, 0x8b, 0xb7, 0x23, 0xf4, 0xe4, + 0x98, 0x8a, 0x53, 0x8c, 0xf7, 0x43, 0x93, 0x43, 0x92, 0x52, 0x9c, 0x07, 0x49, 0xb9, 0x6e, 0xd1, + 0xda, 0x8f, 0x07, 0x2d, 0x54, 0x5c, 0xd3, 0xd3, 0xe6, 0x42, 0x4d, 0xad, 0x6b, 0x85, 0x66, 0x5d, + 0x4f, 0xf7, 0x37, 0x69, 0xb1, 0x72, 0xb1, 0x16, 0x6b, 0x0e, 0x86, 0xb1, 0x57, 0x55, 0xf0, 0x17, + 0xfc, 0x61, 0x7d, 0x5a, 0xdf, 0x87, 0x48, 0x2c, 0x3c, 0x72, 0x1f, 0xb2, 0xfe, 0xbb, 0x11, 0x98, + 0x4e, 0x4d, 0x0b, 0xba, 0xa7, 0xe6, 0x7a, 0xee, 0xa9, 0x35, 0x00, 0xa9, 0xc7, 0x1d, 0x50, 0xe1, + 0xaa, 0xbc, 0xc8, 0xc6, 0xc9, 0x29, 0x33, 0x5e, 0x53, 0x1a, 0x1b, 0xc1, 0x54, 0xae, 0xd8, 0x01, + 0x15, 0xe0, 0x31, 0x53, 0xb9, 0xe8, 0x35, 0xa6, 0x09, 0x1b, 0x56, 0x86, 0x61, 0x8c, 0xd8, 0xa8, + 0x3b, 0xf1, 0x79, 0x02, 0x60, 0x4b, 0x38, 0x7b, 0x19, 0x46, 0x84, 0x10, 0x55, 0x5d, 0xa1, 0x4d, + 0x10, 0xcf, 0x16, 0x21, 0x65, 0x09, 0x89, 0x85, 0x8a, 0xd8, 0x75, 0x98, 0x90, 0x7f, 0x51, 0xd0, + 0x8e, 0x11, 0xd3, 0xf6, 0xce, 0xf1, 0x1a, 0x2a, 0x6e, 0x87, 0x81, 0x27, 0x6e, 0x17, 0xb5, 0x2e, + 0xea, 0x6c, 0xaa, 0x2b, 0x14, 0xe2, 0x17, 0x6f, 0x17, 0xa1, 0x04, 0x62, 0x0a, 0xff, 0x18, 0x41, + 0xc8, 0x32, 0x64, 0x4a, 0x5f, 0xc4, 0x3b, 0x25, 0xca, 0x32, 0xd2, 0x84, 0xde, 0xa6, 0x12, 0x76, + 0x49, 0xbe, 0x9b, 0xa0, 0x58, 0x28, 0x33, 0xa5, 0xe1, 0xa3, 0x04, 0x2a, 0x26, 0x50, 0x36, 0x8c, + 0x8b, 0x45, 0xe5, 0xe2, 0xef, 0xd5, 0x96, 0xeb, 0x35, 0x69, 0x5b, 0xc1, 0xca, 0x11, 0x97, 0x0b, + 0xa8, 0x9d, 0x20, 0xb0, 0x77, 0x61, 0x4a, 0xfc, 0x58, 0xf6, 0x5b, 0x2d, 0xbf, 0x8d, 0xec, 0xc7, + 0x93, 0xf8, 0x4f, 0x48, 0x52, 0xc7, 0x22, 0x59, 0x4b, 0x0a, 0x57, 0x9c, 0x27, 0xf8, 0x26, 0xdb, + 0x95, 0x2f, 0x3a, 0x13, 0xc9, 0x79, 0x82, 0xa4, 0xa1, 0x84, 0xdb, 0x3a, 0x12, 0x7b, 0x1b, 0x26, + 0xc5, 0xcf, 0x9b, 0xde, 0x23, 0x2e, 0x2b, 0x9c, 0x4c, 0x8c, 0x11, 0x90, 0x6a, 0x57, 0x94, 0xc8, + 0xfa, 0x4c, 0x4c, 0xf6, 0x45, 0x38, 0x85, 0x9c, 0xea, 0x7e, 0x87, 0x37, 0x2a, 0x3b, 0x3b, 0x5e, + 0xd3, 0x93, 0xc6, 0x50, 0x32, 0x3c, 0x05, 0x2a, 0xd8, 0x65, 0xc5, 0x88, 0xe1, 0xb8, 0x09, 0x8a, + 0x9d, 0x4d, 0xc9, 0x1e, 0x40, 0x69, 0xb9, 0x1b, 0x46, 0x7e, 0xab, 0x12, 0x45, 0x81, 0xb7, 0xdd, + 0x8d, 0x78, 0x38, 0x3f, 0x6d, 0x04, 0x71, 0x10, 0x8b, 0x23, 0x2e, 0x94, 0xfa, 0xa0, 0x3a, 0x52, + 0x38, 0x6e, 0x4c, 0x62, 0xf7, 0x30, 0xb1, 0x7e, 0x2f, 0x07, 0x93, 0x06, 0x29, 0x7b, 0x0b, 0x26, + 0x6e, 0x04, 0x1e, 0x6f, 0x37, 0x9a, 0xfb, 0xda, 0x45, 0x15, 0x6f, 0x31, 0x3b, 0x04, 0x97, 0xad, + 0x36, 0xd0, 0x62, 0x3d, 0x4f, 0x3e, 0xd3, 0x52, 0xf1, 0x8a, 0xf4, 0x25, 0xa5, 0x09, 0x5a, 0x48, + 0xa2, 0xca, 0xe0, 0x04, 0xa5, 0xd9, 0xa9, 0xa1, 0xb0, 0xf7, 0x60, 0x44, 0xbe, 0xde, 0x92, 0xd9, + 0xdc, 0xd9, 0xac, 0x66, 0x4a, 0xbf, 0x65, 0x9c, 0x88, 0x68, 0xa2, 0x13, 0xda, 0x44, 0x64, 0xfd, + 0x64, 0x0e, 0x58, 0x2f, 0xea, 0x31, 0x7a, 0xaf, 0x63, 0x4d, 0x7f, 0xbe, 0x10, 0xaf, 0xc6, 0x82, + 0xa1, 0x10, 0x17, 0x35, 0xc9, 0x02, 0xd9, 0xf1, 0xb4, 0xea, 0x74, 0x45, 0x9c, 0x2c, 0xb6, 0xfe, + 0x7a, 0x1e, 0x20, 0xc1, 0x66, 0x9f, 0x93, 0x89, 0x71, 0xbe, 0xd8, 0x75, 0x9b, 0xde, 0x8e, 0x67, + 0x46, 0x8a, 0x44, 0x26, 0xdf, 0x50, 0x25, 0xb6, 0x89, 0xc8, 0x3e, 0x80, 0xe9, 0xda, 0xa6, 0x49, + 0xab, 0xd9, 0x51, 0x87, 0x1d, 0x27, 0x45, 0x9e, 0xc6, 0x46, 0xf3, 0x58, 0x7d, 0x34, 0xa4, 0x79, + 0xac, 0x1c, 0x08, 0x2a, 0x11, 0x1b, 0x4b, 0x6d, 0x93, 0x4c, 0xc5, 0x1b, 0xd5, 0x15, 0xda, 0xa5, + 0xf0, 0xeb, 0xc2, 0x8e, 0xd3, 0x21, 0x1b, 0x72, 0xb1, 0x4f, 0x18, 0x78, 0x49, 0x47, 0x0e, 0xf7, + 0xf1, 0x4d, 0xfe, 0x29, 0x54, 0xfb, 0xb5, 0xfc, 0x88, 0x93, 0xb6, 0xe3, 0x99, 0xbd, 0xf7, 0x24, + 0x4f, 0xff, 0xc3, 0x86, 0xcb, 0xa5, 0xd1, 0x3a, 0x32, 0x6f, 0xb9, 0x96, 0x5c, 0x52, 0xa4, 0x11, + 0x40, 0x86, 0x45, 0xcc, 0x3f, 0xc8, 0xc1, 0xa9, 0x4c, 0x5a, 0x76, 0x19, 0x20, 0xd1, 0x29, 0x51, + 0x2f, 0xe1, 0x8e, 0x99, 0xc4, 0x52, 0xb1, 0x35, 0x0c, 0xf6, 0x95, 0xb4, 0x36, 0xe8, 0xf8, 0x83, + 0x70, 0x41, 0xc5, 0xca, 0x32, 0xb5, 0x41, 0x19, 0x3a, 0x20, 0xeb, 0x1f, 0x15, 0x60, 0x46, 0x0b, + 0xd5, 0x22, 0xbf, 0xf5, 0x18, 0x73, 0xe5, 0x87, 0x30, 0x21, 0x5a, 0xe3, 0xd5, 0xc9, 0xef, 0x4b, + 0x9a, 0xa9, 0xbc, 0xde, 0xe3, 0x34, 0x47, 0xdc, 0x2e, 0xeb, 0xc8, 0x32, 0x82, 0x1d, 0x6e, 0x9d, + 0xf8, 0xda, 0x50, 0xef, 0xf5, 0xff, 0x32, 0x98, 0xb3, 0x10, 0x26, 0x57, 0xf6, 0xdb, 0x6e, 0x2b, + 0xae, 0x4d, 0x9a, 0xab, 0x7c, 0xaa, 0x6f, 0x6d, 0x06, 0xb6, 0xac, 0x2e, 0x71, 0x2f, 0x91, 0x65, + 0x19, 0x9e, 0xcd, 0x06, 0xd5, 0xc2, 0x07, 0x30, 0xd3, 0xf3, 0xd1, 0x27, 0x0a, 0xa6, 0xf7, 0x00, + 0x58, 0xef, 0x77, 0x64, 0x70, 0xf8, 0x94, 0x19, 0xaa, 0xf1, 0x54, 0xfc, 0x32, 0x8d, 0xa9, 0xc3, + 0xa5, 0xf1, 0xcb, 0xa2, 0x1e, 0x6a, 0xef, 0xa7, 0xf2, 0xba, 0xe3, 0xe2, 0xb3, 0xbe, 0xea, 0xbe, + 0x60, 0xdc, 0x86, 0x5f, 0xec, 0x37, 0xa6, 0x03, 0x69, 0x1d, 0xbe, 0x5d, 0x80, 0x33, 0x7d, 0x28, + 0xd9, 0x7e, 0x7a, 0x12, 0x49, 0x2d, 0xc4, 0xd5, 0xa3, 0x2b, 0x7c, 0x1a, 0x53, 0x89, 0x7d, 0x4e, + 0x86, 0x2e, 0xa8, 0x63, 0x7a, 0x6a, 0xba, 0x7f, 0xa3, 0x1a, 0xff, 0x61, 0x0c, 0x4d, 0xc7, 0x2c, + 0x90, 0x50, 0xf6, 0x01, 0x0c, 0xa3, 0xd7, 0x6a, 0x2a, 0x54, 0x9c, 0xc0, 0x40, 0xb8, 0x16, 0x57, + 0x4f, 0xfc, 0x34, 0xe2, 0xea, 0x09, 0x00, 0xfb, 0x2c, 0x14, 0x2a, 0x0f, 0x6a, 0x34, 0x2e, 0x53, + 0x3a, 0xf9, 0x83, 0x5a, 0x12, 0xce, 0xdf, 0x35, 0xe2, 0xee, 0x0b, 0x0a, 0x41, 0x78, 0x73, 0x79, + 0x93, 0x46, 0x45, 0x27, 0xbc, 0xb9, 0xbc, 0x99, 0x10, 0xee, 0xd6, 0x8d, 0xd0, 0x3b, 0x37, 0x97, + 0x37, 0xbf, 0x7b, 0xd3, 0xfe, 0xdf, 0xca, 0xcb, 0x78, 0x0b, 0xb2, 0x61, 0x1f, 0xc0, 0x84, 0x11, + 0x4a, 0x37, 0x97, 0xc8, 0x63, 0x71, 0xc4, 0xe2, 0x94, 0x7d, 0x8f, 0x41, 0xa0, 0x12, 0x63, 0x88, + 0xdf, 0x28, 0xf1, 0xea, 0x96, 0x34, 0x31, 0x07, 0x94, 0x89, 0xd3, 0x89, 0x31, 0x62, 0x12, 0x76, + 0x0d, 0x8a, 0x5b, 0xbc, 0xed, 0xb6, 0xa3, 0x58, 0x21, 0x8a, 0xa6, 0xc0, 0x11, 0xc2, 0x4c, 0xa9, + 0x21, 0x46, 0x44, 0xb3, 0xd5, 0xee, 0x76, 0x58, 0x0f, 0x3c, 0x8c, 0xcb, 0x12, 0x9f, 0xc5, 0xd2, + 0x6c, 0x55, 0x2b, 0x31, 0x19, 0xa4, 0x88, 0xac, 0x9f, 0xca, 0xc1, 0x28, 0x0d, 0xa4, 0x4c, 0x68, + 0xb4, 0x9b, 0x9c, 0x25, 0x94, 0xd0, 0x68, 0xd7, 0x4b, 0x27, 0x34, 0xda, 0x95, 0xc1, 0x4f, 0xc6, + 0xc8, 0x13, 0x2b, 0x7e, 0x1a, 0x94, 0x39, 0xf9, 0xc9, 0x67, 0xcd, 0xcc, 0x57, 0x13, 0xa3, 0x0e, + 0xea, 0x0f, 0x64, 0xfd, 0x7d, 0xfa, 0xb2, 0x9b, 0xcb, 0x9b, 0x6c, 0x11, 0x8a, 0x6b, 0xbe, 0x0c, + 0xac, 0xa3, 0x67, 0xa7, 0x6c, 0x12, 0x4c, 0xef, 0x20, 0x85, 0x27, 0xbe, 0x6f, 0x33, 0xf0, 0xe9, + 0x2e, 0xa3, 0x7d, 0x5f, 0x47, 0x02, 0x53, 0xdf, 0x17, 0xa3, 0x0e, 0xfc, 0x7d, 0x3c, 0x63, 0x93, + 0xb8, 0x7f, 0x0d, 0x33, 0x06, 0xdc, 0xd6, 0xfd, 0xac, 0xa8, 0x48, 0xed, 0x14, 0x0b, 0xfd, 0x76, + 0x8a, 0xfb, 0xd7, 0xec, 0x0c, 0x2a, 0x7c, 0x57, 0x4b, 0xc0, 0x35, 0x1e, 0x3c, 0x7a, 0x86, 0x77, + 0xe9, 0xec, 0x77, 0xb5, 0x74, 0xf3, 0x06, 0xda, 0xa4, 0x7f, 0x27, 0x0f, 0xa7, 0xb3, 0x09, 0xf5, + 0xb6, 0xe4, 0x8e, 0x68, 0xcb, 0x45, 0x28, 0xde, 0xf2, 0xc3, 0x48, 0x33, 0xe9, 0x43, 0xf5, 0xff, + 0x1e, 0xc1, 0xec, 0xb8, 0x54, 0xdc, 0xb9, 0xc5, 0xdf, 0xf1, 0xf2, 0x44, 0x7e, 0x18, 0x65, 0x40, + 0xdc, 0xb9, 0x65, 0x11, 0xbb, 0x09, 0x45, 0x9b, 0xfc, 0x7c, 0x52, 0x5d, 0xa3, 0xc0, 0xb1, 0x34, + 0xc5, 0x02, 0x82, 0x18, 0x11, 0x8d, 0x09, 0xc6, 0x2a, 0x30, 0x4a, 0xa3, 0x9f, 0x7a, 0x3a, 0xce, + 0x98, 0x32, 0x66, 0x90, 0x71, 0x45, 0x27, 0x76, 0x14, 0x7c, 0x04, 0xac, 0xae, 0x28, 0x97, 0x1d, + 0xdc, 0x51, 0xe4, 0x23, 0xa1, 0x69, 0x3d, 0x19, 0x23, 0x5a, 0x3f, 0x94, 0x07, 0x50, 0x5a, 0x9b, + 0x67, 0x76, 0x86, 0x7d, 0xd6, 0x98, 0x61, 0x9a, 0x31, 0xd1, 0xe0, 0x09, 0x38, 0x37, 0xd0, 0x56, + 0x67, 0xf0, 0xf4, 0x9b, 0x65, 0x18, 0xde, 0x4a, 0x14, 0x5a, 0xe4, 0x40, 0x82, 0xea, 0x68, 0x09, + 0xb7, 0xb6, 0x61, 0xee, 0x26, 0x8f, 0x12, 0xf5, 0x96, 0x7a, 0x7a, 0x3c, 0x9a, 0xed, 0x1b, 0x30, + 0x46, 0xf8, 0xf1, 0xfe, 0x25, 0x75, 0x31, 0x14, 0xb8, 0x03, 0x75, 0x31, 0x0a, 0x41, 0xec, 0x46, + 0x2b, 0xbc, 0xc9, 0x23, 0xfe, 0xdd, 0xad, 0xa6, 0x06, 0x4c, 0x36, 0x05, 0x5b, 0x36, 0x58, 0x0d, + 0xc7, 0xf6, 0xcf, 0x7d, 0x38, 0x15, 0x7f, 0xfb, 0xd3, 0xe4, 0x7b, 0x45, 0x5c, 0x29, 0x29, 0x3e, + 0x77, 0xc2, 0xf1, 0x08, 0xdb, 0x93, 0x27, 0xb0, 0xa0, 0x08, 0x1e, 0x78, 0xb1, 0x55, 0xe4, 0x40, + 0xb4, 0xec, 0x5d, 0x18, 0xd7, 0x68, 0x28, 0xbe, 0x34, 0xaa, 0xa9, 0x1f, 0x7b, 0xd1, 0x9e, 0x13, + 0x4a, 0xb8, 0xae, 0xa6, 0xd6, 0xd0, 0xad, 0x2f, 0xc3, 0xf3, 0xb1, 0x93, 0x4f, 0x46, 0xd5, 0x29, + 0xe6, 0xb9, 0x93, 0x31, 0x5f, 0x4f, 0x9a, 0x55, 0x6d, 0xc7, 0x8e, 0xb9, 0x8a, 0x37, 0xd3, 0x9b, + 0x45, 0x8d, 0x79, 0xa1, 0xc7, 0xd5, 0x57, 0xf3, 0xe8, 0xb5, 0xde, 0xd1, 0x3e, 0x36, 0x83, 0xa1, + 0x41, 0x9c, 0x4b, 0x13, 0xff, 0x50, 0x1e, 0xa6, 0x37, 0xaa, 0x2b, 0xcb, 0xb1, 0xf5, 0xd1, 0xf7, + 0x58, 0x7a, 0x50, 0xa3, 0x6d, 0xfd, 0xf7, 0x1b, 0xeb, 0x1e, 0xcc, 0xa6, 0xba, 0x01, 0x45, 0x87, + 0xf7, 0xa5, 0x7b, 0x48, 0x0c, 0x56, 0x62, 0xc3, 0xe9, 0x2c, 0xf6, 0xf7, 0xaf, 0xd9, 0x29, 0x6c, + 0xeb, 0x1f, 0x43, 0x8a, 0x2f, 0x6d, 0x61, 0x6f, 0xc0, 0x58, 0x35, 0x0c, 0xbb, 0x3c, 0xb8, 0x67, + 0xaf, 0xe9, 0xaa, 0x02, 0x0f, 0x81, 0x4e, 0x37, 0x68, 0xda, 0x09, 0x02, 0xbb, 0x04, 0x45, 0x0a, + 0xb9, 0xac, 0xf6, 0x04, 0xd4, 0xda, 0xc6, 0x11, 0x9b, 0xed, 0xb8, 0x98, 0xbd, 0x05, 0x13, 0xf2, + 0x6f, 0x39, 0xdb, 0xa8, 0xc3, 0x51, 0x39, 0x48, 0xe8, 0x72, 0x76, 0xda, 0x06, 0x1a, 0x7b, 0x1d, + 0x0a, 0x95, 0x65, 0x9b, 0xd4, 0x41, 0x24, 0x37, 0x62, 0xd2, 0xef, 0x2e, 0x37, 0x2f, 0x11, 0xcb, + 0xb6, 0x90, 0xfe, 0x54, 0x74, 0x02, 0xd2, 0x64, 0xcb, 0xdc, 0xe4, 0x04, 0x4b, 0x1d, 0x66, 0x08, + 0x63, 0x57, 0x60, 0x74, 0xc5, 0x0b, 0x3b, 0x4d, 0x77, 0x9f, 0xf4, 0xd8, 0x32, 0xf7, 0x95, 0x04, + 0x19, 0xbe, 0xfd, 0x12, 0xc4, 0x2e, 0xa9, 0x9c, 0x40, 0xc5, 0xc4, 0xcb, 0xa4, 0x4f, 0xe2, 0x9f, + 0x37, 0x60, 0x84, 0x02, 0x13, 0x8f, 0x69, 0x29, 0x07, 0xd2, 0x01, 0x89, 0x09, 0xa7, 0xd7, 0xdd, + 0x14, 0x9e, 0xa6, 0xbb, 0xe9, 0x36, 0x9c, 0xb9, 0x89, 0xda, 0x1b, 0x33, 0x9a, 0xcf, 0x3d, 0xbb, + 0x4a, 0xfa, 0x70, 0x7c, 0x06, 0x92, 0x0a, 0x9e, 0x74, 0x40, 0x20, 0xa7, 0x1b, 0xe8, 0xa9, 0x1c, + 0xfb, 0x31, 0x62, 0x5f, 0x82, 0xb9, 0xac, 0x22, 0xd2, 0x9a, 0x63, 0xdc, 0x9a, 0xec, 0x0a, 0xf4, + 0xb8, 0x35, 0x59, 0x1c, 0xd8, 0x1a, 0x94, 0x24, 0xbc, 0xd2, 0x68, 0x79, 0x6d, 0xa9, 0xf9, 0x97, + 0x5a, 0x75, 0x74, 0xfb, 0x20, 0xae, 0xae, 0x28, 0x94, 0x2f, 0x00, 0x86, 0xa3, 0x50, 0x8a, 0x92, + 0xfd, 0xed, 0x9c, 0xb8, 0xcd, 0xc9, 0x30, 0xbe, 0xf7, 0xec, 0xb5, 0x90, 0x62, 0x9e, 0x9d, 0x4e, + 0x7c, 0x80, 0x6a, 0x51, 0xe0, 0xb5, 0x77, 0xc9, 0x09, 0x68, 0x8b, 0x9c, 0x80, 0xde, 0xfd, 0x58, + 0x4e, 0x40, 0x92, 0x55, 0x78, 0x78, 0x50, 0x9e, 0x08, 0xa8, 0x4e, 0x5c, 0x45, 0xc6, 0x17, 0x88, + 0xae, 0x43, 0x4f, 0xd8, 0x7b, 0x6d, 0x19, 0x44, 0x94, 0x37, 0x64, 0x23, 0xa7, 0x71, 0x07, 0xc7, + 0xae, 0xc3, 0x50, 0xf6, 0x4e, 0x37, 0x46, 0xe8, 0x69, 0x68, 0x26, 0x07, 0x71, 0xf1, 0x54, 0x8e, + 0x26, 0xd2, 0x77, 0xb6, 0x94, 0x5c, 0x3c, 0x95, 0x57, 0x8a, 0x83, 0xd3, 0x48, 0x9f, 0x3c, 0x06, + 0x09, 0xbb, 0x02, 0x23, 0x77, 0xdd, 0x27, 0x95, 0x5d, 0x4e, 0xb9, 0xde, 0x26, 0xd5, 0xf6, 0x87, + 0xc0, 0xa5, 0xe2, 0xef, 0x4a, 0x47, 0x86, 0xe7, 0x6c, 0x42, 0x63, 0x3f, 0x90, 0x83, 0xd3, 0x72, + 0x19, 0xab, 0x56, 0xd6, 0x78, 0x14, 0x89, 0x7e, 0xa0, 0xe0, 0x67, 0xe7, 0x13, 0x6b, 0xec, 0x6c, + 0x3c, 0x99, 0x34, 0x9f, 0x76, 0x86, 0xb8, 0xe3, 0x42, 0x2a, 0x35, 0xc2, 0xba, 0x66, 0xd2, 0xb3, + 0x2d, 0x18, 0xbf, 0x7b, 0xa3, 0x12, 0x57, 0x2b, 0x63, 0x3d, 0x97, 0xb3, 0x76, 0x47, 0x0d, 0x2d, + 0xcb, 0x8d, 0x40, 0x67, 0x43, 0xa6, 0xff, 0x9f, 0x55, 0xfd, 0xc1, 0xde, 0xd4, 0x1d, 0x47, 0x0b, + 0x28, 0x3d, 0x8f, 0xb6, 0xdc, 0x27, 0x8e, 0xbb, 0xcb, 0x8d, 0x57, 0x72, 0xd2, 0x5e, 0xff, 0x44, + 0x0e, 0xce, 0xf6, 0x6d, 0x32, 0xbb, 0x0e, 0x67, 0x5c, 0xe9, 0x0e, 0xed, 0xec, 0x45, 0x51, 0x27, + 0x74, 0xd4, 0x15, 0x83, 0x5c, 0x4d, 0xed, 0x53, 0x54, 0x7c, 0x4b, 0x94, 0xaa, 0x5b, 0x47, 0xc8, + 0x3e, 0x80, 0x17, 0xbc, 0x76, 0xc8, 0xeb, 0xdd, 0x80, 0x3b, 0x8a, 0x41, 0xdd, 0x6b, 0x04, 0x4e, + 0xe0, 0xb6, 0x77, 0x95, 0xdf, 0xac, 0x7d, 0x56, 0xe1, 0x90, 0xcb, 0xf5, 0xb2, 0xd7, 0x08, 0x6c, + 0x44, 0xb0, 0x7e, 0x2f, 0x07, 0xf3, 0xfd, 0xba, 0x84, 0xcd, 0xc3, 0x28, 0x6f, 0xbb, 0xdb, 0x4d, + 0xe5, 0x2d, 0x64, 0xab, 0x9f, 0xec, 0x79, 0x48, 0x76, 0x7a, 0x3a, 0xfd, 0x8b, 0x75, 0x8a, 0xc0, + 0x8f, 0x76, 0xeb, 0xfa, 0xbe, 0x4e, 0x76, 0xe6, 0x13, 0x75, 0x7d, 0x77, 0x3f, 0x07, 0x90, 0x6c, + 0xe7, 0x52, 0x31, 0x61, 0x8f, 0xb9, 0xf5, 0x40, 0xae, 0x3c, 0x76, 0x1a, 0x46, 0xe4, 0x76, 0x49, + 0xce, 0x0d, 0xf4, 0x4b, 0x9c, 0xdb, 0xd4, 0xc9, 0xb8, 0xcf, 0x17, 0x96, 0x26, 0x8c, 0xce, 0x1e, + 0x69, 0xe1, 0xe0, 0x58, 0x3f, 0x3e, 0x29, 0x45, 0x88, 0x4a, 0x37, 0xda, 0x53, 0x42, 0xc7, 0x62, + 0x96, 0x77, 0x97, 0xb4, 0xa5, 0xd4, 0x8c, 0xae, 0x4d, 0x9f, 0x2e, 0xf5, 0xf6, 0x93, 0xcf, 0x7c, + 0xfb, 0x79, 0x03, 0xc6, 0x96, 0xf7, 0x78, 0xfd, 0x61, 0xec, 0x61, 0x53, 0x24, 0xe5, 0xba, 0x00, + 0xca, 0x00, 0xcb, 0x09, 0x02, 0xbb, 0x02, 0x80, 0x4e, 0xa5, 0x52, 0x22, 0xd5, 0x92, 0x24, 0xa0, + 0x0f, 0x2a, 0x99, 0xa7, 0x68, 0x28, 0xc8, 0xbe, 0x66, 0xdf, 0xd0, 0xed, 0x59, 0x24, 0xfb, 0x30, + 0xd8, 0x21, 0xf4, 0x04, 0x41, 0x34, 0x4f, 0xdb, 0x57, 0xe8, 0x14, 0x2c, 0xf5, 0x6c, 0x3e, 0x3a, + 0x12, 0xbb, 0x0c, 0x63, 0x9b, 0xca, 0x4b, 0x00, 0x0f, 0xc1, 0x09, 0xa4, 0x80, 0xc4, 0xa3, 0x60, + 0x3e, 0x67, 0x27, 0x28, 0xec, 0xb3, 0x30, 0xba, 0xcc, 0x83, 0x68, 0x6b, 0x6b, 0x0d, 0x8d, 0x4e, + 0x64, 0x2e, 0x81, 0x22, 0xc6, 0x7d, 0x8f, 0xa2, 0xe6, 0x77, 0x0e, 0xca, 0x93, 0x91, 0xd7, 0xe2, + 0x71, 0x8c, 0x64, 0x5b, 0x61, 0xb3, 0x25, 0x28, 0xc9, 0x67, 0xf1, 0xe4, 0xee, 0x81, 0x27, 0x63, + 0x51, 0x9e, 0xd3, 0xf4, 0x86, 0xfe, 0x98, 0x6f, 0xc7, 0x51, 0xef, 0x7b, 0xf0, 0xd9, 0xaa, 0x4a, + 0x16, 0xa1, 0x37, 0x13, 0x12, 0x65, 0x58, 0x7a, 0xc7, 0x10, 0xad, 0xed, 0xa5, 0x60, 0x15, 0x98, + 0x5c, 0xf6, 0x5b, 0x1d, 0x37, 0xf2, 0x30, 0xf3, 0xda, 0x3e, 0x1d, 0x82, 0xa8, 0xd0, 0xab, 0xeb, + 0x05, 0xc6, 0x89, 0xaa, 0x17, 0xb0, 0x1b, 0x30, 0x65, 0xfb, 0x5d, 0x31, 0x4c, 0xea, 0x16, 0x2e, + 0xcf, 0x39, 0x34, 0x0d, 0x09, 0x44, 0x89, 0x38, 0x96, 0xe9, 0xca, 0x6d, 0x84, 0xaf, 0x34, 0xa8, + 0xd8, 0x7a, 0xc6, 0x73, 0x88, 0x7e, 0xb8, 0xe9, 0xb1, 0xef, 0x7b, 0x98, 0x65, 0xbc, 0xa4, 0x5c, + 0x83, 0xf1, 0x5a, 0x6d, 0x63, 0x8b, 0x87, 0xd1, 0x8d, 0xa6, 0xff, 0x18, 0xcf, 0xb6, 0x22, 0xe5, + 0x04, 0x0a, 0x7d, 0x27, 0xe2, 0x61, 0xe4, 0xec, 0x34, 0xfd, 0xc7, 0xb6, 0x8e, 0xc5, 0xbe, 0x26, + 0xfa, 0x43, 0x93, 0x04, 0x29, 0x50, 0xe7, 0x51, 0xc2, 0x2a, 0x9e, 0x20, 0xc9, 0xa2, 0x11, 0x22, + 0xab, 0xd9, 0x59, 0x1a, 0x3a, 0x3a, 0x8c, 0x05, 0xfe, 0x93, 0xfd, 0x4a, 0xa3, 0x11, 0xf0, 0x30, + 0xa4, 0x43, 0x48, 0x3a, 0x8c, 0xa1, 0xb2, 0xc1, 0x95, 0x05, 0x86, 0xc3, 0x98, 0x46, 0xc0, 0x7e, + 0x24, 0x07, 0xa7, 0x74, 0x57, 0x12, 0x5c, 0x2e, 0x68, 0xe6, 0x22, 0x8f, 0xa4, 0x37, 0x2f, 0xab, + 0x43, 0xf8, 0xb2, 0x86, 0x76, 0xf9, 0xd1, 0xd5, 0xcb, 0x95, 0xe4, 0x67, 0x4d, 0x11, 0x61, 0xd0, + 0xb1, 0x72, 0x26, 0xbf, 0xe4, 0x0b, 0xe6, 0x73, 0xf6, 0x9c, 0x9b, 0x41, 0xcc, 0x96, 0x85, 0xa4, + 0x26, 0x66, 0x14, 0x1a, 0x4e, 0x55, 0x37, 0xf1, 0x4c, 0x23, 0x8d, 0x2a, 0xcd, 0x3f, 0x69, 0x62, + 0xe5, 0x75, 0x4c, 0x81, 0x4c, 0xa3, 0x61, 0x55, 0x98, 0x96, 0x00, 0xb1, 0x2d, 0xc8, 0x94, 0x31, + 0xb3, 0x49, 0xd8, 0x7a, 0x62, 0x83, 0x6f, 0xfd, 0x98, 0x36, 0x46, 0x8f, 0x2c, 0x99, 0xa2, 0x63, + 0x1f, 0xc0, 0x54, 0x18, 0xee, 0x39, 0xda, 0x7a, 0x9d, 0xc3, 0x55, 0x8c, 0x01, 0x32, 0xa9, 0x24, + 0xe5, 0x56, 0x37, 0x11, 0x86, 0x7b, 0xc9, 0x8a, 0xfe, 0x00, 0xa6, 0xd0, 0x56, 0x27, 0x61, 0x70, + 0x2a, 0x61, 0x40, 0x25, 0x69, 0x06, 0x51, 0x33, 0x4c, 0x18, 0xfc, 0x9d, 0x1c, 0x9c, 0x15, 0x15, + 0x65, 0x8f, 0xd0, 0xe9, 0x8f, 0x33, 0x42, 0x18, 0x32, 0xb0, 0x2f, 0x4f, 0x5d, 0x1c, 0x0d, 0xc3, + 0xbd, 0x2c, 0x0e, 0xf8, 0x51, 0xe2, 0xe3, 0xb3, 0x3f, 0xea, 0xcc, 0xc7, 0xfe, 0xa8, 0xbe, 0x3c, + 0xf5, 0x8f, 0x8a, 0x9a, 0x61, 0x16, 0x07, 0xbc, 0xd6, 0xd6, 0x2a, 0x77, 0xd7, 0x92, 0xbb, 0xd9, + 0xf7, 0x96, 0xdb, 0x8a, 0xd1, 0xb6, 0x23, 0xdc, 0x56, 0xee, 0x49, 0x9f, 0x67, 0xad, 0x1b, 0xd4, + 0xb5, 0xd6, 0x00, 0xa7, 0xaf, 0xb5, 0x29, 0x1a, 0x3b, 0x85, 0x6d, 0xfd, 0x1c, 0xa4, 0xf8, 0x92, + 0xa9, 0xaa, 0x05, 0x23, 0xf2, 0xd6, 0x4a, 0x9d, 0x8c, 0x36, 0x0b, 0xf2, 0x4e, 0x6b, 0x53, 0x09, + 0x3b, 0x0b, 0x85, 0x5a, 0x6d, 0x83, 0x3a, 0x19, 0x0d, 0x56, 0xc3, 0xd0, 0xb7, 0x05, 0x4c, 0x8c, + 0x10, 0x5a, 0xa1, 0x6a, 0x01, 0xd5, 0xc5, 0x79, 0x67, 0x23, 0x54, 0xf4, 0xb7, 0xba, 0x43, 0x0e, + 0x25, 0xfd, 0x4d, 0x77, 0xc8, 0xe4, 0xe6, 0xb8, 0x0c, 0xf3, 0x95, 0x30, 0xe4, 0x81, 0x98, 0x10, + 0x64, 0xdc, 0x18, 0xd0, 0x3d, 0x87, 0x0e, 0x76, 0xac, 0xd4, 0xad, 0x87, 0x76, 0x5f, 0x44, 0x76, + 0x11, 0x8a, 0x95, 0x6e, 0xc3, 0xe3, 0xed, 0xba, 0x11, 0x15, 0xcc, 0x25, 0x98, 0x1d, 0x97, 0xb2, + 0x2f, 0xc2, 0xa9, 0x54, 0xc8, 0x3e, 0xea, 0x81, 0xd1, 0x64, 0xef, 0x55, 0xf7, 0xb0, 0xc4, 0x20, + 0x43, 0x76, 0x49, 0x36, 0x25, 0xab, 0x40, 0x69, 0x15, 0xdd, 0xb4, 0x56, 0xb8, 0x7c, 0x1b, 0xf2, + 0x03, 0xe9, 0x7c, 0x27, 0x6f, 0xcd, 0xd2, 0x85, 0xcb, 0x69, 0xc4, 0x85, 0x76, 0x0f, 0x3a, 0xbb, + 0x03, 0xb3, 0x69, 0x98, 0x38, 0xc1, 0xe5, 0x05, 0x19, 0xf7, 0x9b, 0x1e, 0x2e, 0x78, 0x86, 0x67, + 0x51, 0xb1, 0x6d, 0x98, 0x49, 0x0c, 0x92, 0xcc, 0x6b, 0xb3, 0xb2, 0x73, 0x8e, 0xcb, 0xd5, 0xd5, + 0xf9, 0x79, 0x9a, 0x8c, 0xb3, 0x89, 0x71, 0x53, 0x7c, 0x7d, 0xb6, 0x7b, 0xd9, 0xb1, 0x06, 0x4c, + 0xd5, 0xbc, 0xdd, 0xb6, 0xd7, 0xde, 0xbd, 0xc3, 0xf7, 0x37, 0x5d, 0x2f, 0x20, 0x8b, 0x53, 0x65, + 0x4f, 0x5e, 0x09, 0xf7, 0x5b, 0x2d, 0x1e, 0x05, 0xb8, 0x11, 0x8a, 0x72, 0x74, 0x30, 0x17, 0xd7, + 0xa1, 0x85, 0x50, 0xd2, 0xa1, 0x4f, 0x66, 0xc7, 0xf5, 0x0c, 0x21, 0xc0, 0xe4, 0x69, 0xa8, 0x2e, + 0x26, 0x06, 0x54, 0x5d, 0x34, 0x61, 0x66, 0xb5, 0x5d, 0x0f, 0xf6, 0xf1, 0x89, 0x4e, 0x7d, 0xdc, + 0xe4, 0x31, 0x1f, 0xf7, 0x0a, 0x7d, 0xdc, 0x0b, 0xae, 0x9a, 0x61, 0x59, 0x9f, 0xd7, 0xcb, 0x98, + 0xd5, 0x60, 0x06, 0x2f, 0x0e, 0xd5, 0x95, 0xcd, 0x6a, 0xdb, 0x8b, 0x3c, 0x37, 0xe2, 0x0d, 0x12, + 0x2e, 0x5e, 0x25, 0x9e, 0xe7, 0xe4, 0x15, 0xd5, 0x6b, 0x74, 0x1c, 0x4f, 0xa1, 0xe8, 0x4c, 0x7b, + 0xe8, 0x8f, 0xba, 0x27, 0x4e, 0xff, 0x19, 0xdd, 0x13, 0xab, 0x30, 0x9d, 0x0e, 0xbc, 0x50, 0x4a, + 0xce, 0xe1, 0x10, 0x8b, 0xc4, 0x71, 0xee, 0x77, 0x51, 0x98, 0x34, 0x72, 0xfe, 0x99, 0x74, 0xe9, + 0x2b, 0xe7, 0x8c, 0x71, 0xe5, 0x34, 0x76, 0xa5, 0x13, 0x5c, 0x39, 0xd9, 0x26, 0xc0, 0x0d, 0x3f, + 0xa8, 0xf3, 0x0a, 0x3a, 0x3f, 0x33, 0x23, 0x7b, 0x8e, 0x60, 0x9a, 0x14, 0xca, 0xf5, 0xb3, 0x23, + 0x7e, 0x3b, 0x69, 0x1f, 0x76, 0x8d, 0x87, 0xf5, 0x37, 0xf3, 0x30, 0xdf, 0xef, 0x73, 0x8e, 0xb8, + 0xee, 0x7d, 0x0a, 0x7a, 0x57, 0x38, 0x5d, 0xfb, 0x4a, 0x3c, 0xbd, 0xce, 0x17, 0x21, 0x7b, 0x21, + 0xd3, 0x35, 0x70, 0x36, 0x4d, 0x70, 0x2f, 0x68, 0xb2, 0xeb, 0x30, 0xae, 0x7d, 0x3c, 0xee, 0xa5, + 0xfd, 0x9a, 0x6a, 0xc3, 0x4e, 0xfc, 0xb7, 0xb8, 0x26, 0xca, 0x7d, 0x4b, 0x5d, 0x13, 0xe5, 0x2f, + 0x56, 0x92, 0xfe, 0xdf, 0x23, 0xd2, 0x0a, 0x20, 0x0c, 0x7d, 0xc6, 0x00, 0xf7, 0x6d, 0xb9, 0x05, + 0xda, 0xf8, 0xb7, 0xf5, 0xcb, 0x13, 0xf2, 0x44, 0xd6, 0x6f, 0x89, 0xfd, 0xec, 0x83, 0x53, 0xb7, + 0xc7, 0xfc, 0x49, 0x6e, 0x8f, 0x85, 0xe3, 0x6f, 0x8f, 0x43, 0xc7, 0xdd, 0x1e, 0x53, 0xd7, 0xbb, + 0xe1, 0x13, 0x5f, 0xef, 0x46, 0x4e, 0x74, 0xbd, 0x1b, 0x3d, 0xd1, 0xf5, 0xce, 0xb8, 0xa9, 0x16, + 0x8f, 0xbb, 0xa9, 0xfe, 0xc5, 0x65, 0xf0, 0x59, 0xbd, 0x0c, 0x66, 0x89, 0x78, 0x27, 0xba, 0x0c, + 0xfe, 0x70, 0xdf, 0xbb, 0x5c, 0xe9, 0xe3, 0x08, 0xe5, 0x2f, 0x0f, 0x70, 0x97, 0x1b, 0xf4, 0x26, + 0x37, 0xf3, 0x74, 0x6e, 0x72, 0xec, 0xa9, 0xdd, 0xe4, 0x66, 0x3f, 0xe9, 0x4d, 0x6e, 0xee, 0x69, + 0xde, 0xe4, 0x4e, 0xfd, 0x79, 0xbc, 0xc9, 0x9d, 0xfe, 0xd7, 0x73, 0x93, 0xfb, 0x4b, 0x50, 0x4a, + 0x0b, 0x97, 0xc7, 0x07, 0xdd, 0x7d, 0x6a, 0x01, 0x22, 0x85, 0xe8, 0x9b, 0x16, 0xee, 0xd8, 0x15, + 0x80, 0xcd, 0xc0, 0x7b, 0xe4, 0x46, 0xfc, 0x8e, 0xb2, 0x7e, 0xa3, 0x80, 0xd1, 0x12, 0x2a, 0x46, + 0xde, 0xd6, 0x50, 0xe2, 0x7b, 0x4d, 0x3e, 0xeb, 0x5e, 0x63, 0xfd, 0x48, 0x1e, 0x66, 0x64, 0x94, + 0xb5, 0x67, 0xff, 0x11, 0xf6, 0x7d, 0xe3, 0xb6, 0xaa, 0x6c, 0xad, 0x53, 0xad, 0x3b, 0xe2, 0x19, + 0xf6, 0xab, 0x70, 0xaa, 0xa7, 0x2b, 0xf0, 0xc6, 0xba, 0xa2, 0xe2, 0xdb, 0xf5, 0xdc, 0x59, 0xe7, + 0xb3, 0x2b, 0xb9, 0x7f, 0xcd, 0xee, 0xa1, 0xb0, 0xfe, 0x64, 0xa8, 0x87, 0x3f, 0x3d, 0xc8, 0xea, + 0x4f, 0xac, 0xb9, 0x93, 0x3d, 0xb1, 0xe6, 0x07, 0x7b, 0x62, 0x4d, 0x09, 0x15, 0x85, 0x41, 0x84, + 0x8a, 0x2f, 0xc2, 0xe4, 0x16, 0x77, 0x5b, 0xe1, 0x96, 0x4f, 0xd9, 0x72, 0xa4, 0xaf, 0x85, 0x0a, + 0x5f, 0x27, 0xca, 0xd4, 0x85, 0x2b, 0xb6, 0x19, 0x8d, 0x04, 0x81, 0x38, 0x06, 0x65, 0xfa, 0x1c, + 0xdb, 0xe4, 0xa0, 0xdf, 0xa2, 0x87, 0x8f, 0xb8, 0x45, 0xd7, 0x60, 0x82, 0xe8, 0x92, 0x48, 0xc3, + 0xc9, 0x75, 0x4f, 0x14, 0x21, 0x5c, 0xd5, 0x1e, 0x27, 0x71, 0x8e, 0x6b, 0x97, 0x37, 0x3d, 0x83, + 0x89, 0xe8, 0x82, 0xd5, 0x76, 0xa3, 0xe3, 0x7b, 0x6d, 0xec, 0x82, 0xd1, 0xa4, 0x0b, 0x38, 0x81, + 0x65, 0x17, 0x68, 0x48, 0xec, 0x5d, 0x98, 0xaa, 0x6c, 0x56, 0x75, 0xb2, 0x62, 0xf2, 0xca, 0xeb, + 0x76, 0x3c, 0xc7, 0x20, 0x4d, 0xe1, 0x1e, 0x75, 0xf3, 0x19, 0xfb, 0xb3, 0xb9, 0xf9, 0x58, 0xff, + 0x62, 0x42, 0x2d, 0xef, 0xef, 0xee, 0x03, 0x89, 0xf9, 0xe4, 0x51, 0x38, 0xe1, 0x93, 0xc7, 0xd0, + 0x71, 0x82, 0xa4, 0x21, 0xdf, 0x0e, 0x9f, 0x48, 0xbe, 0x1d, 0xf9, 0xc4, 0xcf, 0x17, 0xa3, 0x27, + 0x94, 0x58, 0x53, 0x6b, 0xad, 0x38, 0xc8, 0x5a, 0xcb, 0x94, 0x72, 0xc7, 0x3e, 0xb9, 0x94, 0x0b, + 0x27, 0x96, 0x72, 0x6b, 0x89, 0xef, 0xf2, 0xf8, 0xb1, 0x2e, 0x21, 0xe7, 0x48, 0x2b, 0x30, 0x93, + 0x1d, 0x62, 0x2f, 0xf6, 0x62, 0xfe, 0x9e, 0x12, 0x9d, 0xbf, 0x9e, 0x2d, 0x3a, 0x1f, 0x7d, 0xde, + 0x9c, 0x48, 0x78, 0xfe, 0x91, 0xa7, 0x2b, 0x3c, 0x3f, 0xdd, 0x87, 0x90, 0xbf, 0x10, 0x9f, 0xff, + 0x42, 0x7c, 0x1e, 0x50, 0x7c, 0x0e, 0x70, 0x79, 0x3d, 0x70, 0x83, 0x36, 0xaa, 0x9d, 0xae, 0xc0, + 0xa8, 0x8a, 0x31, 0x9a, 0x4b, 0x34, 0xca, 0xbd, 0xc1, 0x45, 0x15, 0x16, 0x5b, 0x84, 0xa2, 0x22, + 0xd6, 0xd3, 0xb2, 0x3c, 0x26, 0x98, 0x11, 0xbe, 0x91, 0x60, 0xd6, 0x7f, 0x30, 0xa4, 0xb6, 0x70, + 0x31, 0x67, 0x36, 0xdd, 0xc0, 0x6d, 0x61, 0xbe, 0xaf, 0x78, 0x85, 0x69, 0xc2, 0x7b, 0x6a, 0x51, + 0xa6, 0x4c, 0xfb, 0x4d, 0x92, 0x8f, 0x15, 0xf5, 0x35, 0x49, 0xa9, 0x5a, 0x18, 0x20, 0xa5, 0xea, + 0xdb, 0x46, 0x3e, 0xd2, 0xa1, 0x24, 0x01, 0x9e, 0xd8, 0xd6, 0x8e, 0xce, 0x44, 0x7a, 0x5d, 0x4f, + 0x1c, 0x3a, 0x9c, 0x44, 0xf5, 0x42, 0xca, 0x23, 0x52, 0x86, 0xc6, 0xb7, 0x91, 0x91, 0x93, 0xc4, + 0x53, 0x1e, 0xfd, 0xd7, 0x1a, 0x4f, 0x79, 0x15, 0x80, 0x8e, 0xda, 0xc4, 0x3c, 0xe1, 0x55, 0x5c, + 0xfd, 0x64, 0xa6, 0x1c, 0x45, 0xcd, 0x3e, 0x19, 0x24, 0x34, 0x42, 0xeb, 0xb7, 0x19, 0xcc, 0xd4, + 0x6a, 0x1b, 0x2b, 0x9e, 0xbb, 0xdb, 0xf6, 0xc3, 0xc8, 0xab, 0x57, 0xdb, 0x3b, 0xbe, 0x10, 0xc5, + 0xe3, 0xe3, 0x40, 0x0b, 0x9c, 0x9b, 0x1c, 0x05, 0x71, 0xb1, 0xb8, 0xea, 0xad, 0x06, 0x81, 0xd2, + 0x8f, 0xca, 0xab, 0x1e, 0x17, 0x00, 0x5b, 0xc2, 0x85, 0xb4, 0x5b, 0xeb, 0x62, 0x64, 0x0b, 0xb2, + 0x19, 0x41, 0x69, 0x37, 0x94, 0x20, 0x5b, 0x95, 0x31, 0xde, 0x3b, 0x61, 0xe9, 0xf6, 0x73, 0xc6, + 0x88, 0xca, 0x9c, 0x14, 0xcb, 0xc3, 0x8e, 0x84, 0x11, 0xdc, 0x36, 0x3b, 0x08, 0xd7, 0x2d, 0xe2, + 0x7a, 0xd6, 0xc0, 0x3e, 0x9c, 0x32, 0x7c, 0x9e, 0x07, 0x7d, 0x4c, 0x79, 0x9d, 0xa4, 0x6b, 0x0b, + 0x43, 0x6c, 0x64, 0xbc, 0xa8, 0xe8, 0x09, 0xbc, 0x32, 0x6b, 0x10, 0xe7, 0xd9, 0xb9, 0xcc, 0x92, + 0x78, 0x75, 0x8f, 0x1b, 0x91, 0xb1, 0xb5, 0x4d, 0x43, 0xa6, 0x2a, 0xeb, 0x57, 0xb5, 0x93, 0xb1, + 0x15, 0x1c, 0x5d, 0x13, 0xfb, 0x95, 0x1c, 0x9c, 0x31, 0x30, 0xe2, 0xed, 0x2a, 0x8c, 0xc3, 0x81, + 0x64, 0xce, 0xeb, 0x8f, 0x9e, 0xce, 0xbc, 0x7e, 0xd9, 0x6c, 0x4b, 0xb2, 0xa1, 0xea, 0x6d, 0xe8, + 0xf7, 0x85, 0xec, 0x11, 0xcc, 0x60, 0x91, 0x7a, 0xd8, 0x11, 0x73, 0x96, 0xde, 0x83, 0xe6, 0x92, + 0xcf, 0x96, 0x7e, 0xfc, 0x98, 0x6e, 0x7a, 0xf1, 0xdb, 0x07, 0xe5, 0x49, 0x03, 0x5d, 0xc5, 0x9a, + 0x76, 0x92, 0xd7, 0x21, 0xaf, 0xbd, 0xe3, 0xeb, 0x82, 0x52, 0x4f, 0x15, 0xec, 0x9f, 0xe4, 0xe4, + 0x73, 0x82, 0x6c, 0xc6, 0x8d, 0xc0, 0x6f, 0xc5, 0xe5, 0xca, 0xb4, 0xb2, 0x4f, 0xb7, 0x35, 0x9f, + 0x4e, 0xb7, 0xbd, 0x8a, 0x9f, 0x2c, 0xf7, 0x04, 0x67, 0x27, 0xf0, 0x5b, 0xc9, 0xe7, 0xeb, 0x1d, + 0xd7, 0xf7, 0x23, 0xd9, 0x0f, 0xe6, 0xe0, 0xac, 0xa1, 0xd5, 0xd4, 0x13, 0x7f, 0x50, 0xb4, 0x84, + 0xd9, 0x38, 0x8e, 0x4a, 0x52, 0xb4, 0x74, 0x99, 0xe6, 0xff, 0x05, 0xfc, 0x02, 0x2d, 0x26, 0xa7, + 0x40, 0x72, 0x5a, 0x12, 0x4b, 0xfb, 0x84, 0xfe, 0xb5, 0x30, 0x0f, 0x66, 0xd0, 0xca, 0xc6, 0x30, + 0x01, 0x9e, 0xeb, 0x6f, 0x02, 0x1c, 0xa7, 0x05, 0xc5, 0x70, 0xff, 0xfd, 0xed, 0x80, 0x7b, 0xb9, + 0xb2, 0xbf, 0x0c, 0x67, 0x7b, 0x80, 0xf1, 0x6a, 0x3b, 0xd5, 0x77, 0xb5, 0x7d, 0xea, 0xf0, 0xa0, + 0xfc, 0x5a, 0x56, 0x6d, 0x59, 0x2b, 0xad, 0x7f, 0x0d, 0xcc, 0x05, 0x48, 0x0a, 0x49, 0xfc, 0xc8, + 0x9e, 0xa0, 0x9f, 0xa2, 0xf9, 0xa1, 0xe1, 0x8b, 0xbd, 0x5c, 0xfb, 0x06, 0xfd, 0xc8, 0x4b, 0x90, + 0x18, 0x87, 0x09, 0x2d, 0xd5, 0xc1, 0x3e, 0x19, 0x7b, 0xf4, 0xa9, 0xe4, 0xdb, 0x07, 0x65, 0x03, + 0x5b, 0x5c, 0x88, 0xf4, 0x1c, 0x0a, 0x86, 0xb4, 0xa7, 0x23, 0xb2, 0x5f, 0xca, 0xc1, 0x9c, 0x00, + 0x24, 0x93, 0x8a, 0x1a, 0x35, 0x7f, 0xd4, 0xac, 0xdf, 0x7b, 0x3a, 0xb3, 0xfe, 0x25, 0xfc, 0x46, + 0x7d, 0xd6, 0xf7, 0x74, 0x49, 0xe6, 0xc7, 0xe1, 0x6c, 0x37, 0x0c, 0xba, 0x8c, 0xd9, 0x7e, 0x76, + 0x80, 0xd9, 0x2e, 0x07, 0xe0, 0xf8, 0xd9, 0xde, 0xb7, 0x16, 0xb6, 0x05, 0x13, 0x74, 0x17, 0x92, + 0x1d, 0xf6, 0xa2, 0x11, 0xa3, 0x59, 0x2f, 0x92, 0x17, 0x54, 0xca, 0x04, 0xd1, 0xd3, 0x42, 0x83, + 0x0b, 0x6b, 0xc3, 0xac, 0xfc, 0x6d, 0xea, 0xa6, 0xca, 0x7d, 0x75, 0x53, 0x17, 0xa9, 0x45, 0xe7, + 0x89, 0x7f, 0x4a, 0x45, 0xa5, 0x87, 0x5f, 0xca, 0x60, 0xcc, 0x3a, 0xc0, 0x0c, 0xb0, 0x5c, 0xb4, + 0xe7, 0x8f, 0xd6, 0x48, 0xbd, 0x46, 0x75, 0x96, 0xd3, 0x75, 0xa6, 0x57, 0x6e, 0x06, 0x6f, 0xe6, + 0xc2, 0x34, 0x41, 0xfd, 0x87, 0x5c, 0xee, 0xf0, 0x2f, 0x19, 0x01, 0xb0, 0x52, 0xa5, 0xf2, 0x12, + 0xa5, 0x6a, 0xc2, 0x00, 0x65, 0xa9, 0x0d, 0x3d, 0xcd, 0x8f, 0x6d, 0xc0, 0x4c, 0xa5, 0xd3, 0x69, + 0x7a, 0xbc, 0x81, 0xad, 0x94, 0x19, 0xf4, 0xad, 0x24, 0x3b, 0x98, 0x2b, 0x0b, 0xe9, 0x66, 0x97, + 0x4e, 0x9f, 0xdf, 0x4b, 0x6b, 0xfd, 0x70, 0xae, 0xe7, 0xa3, 0xd9, 0x1b, 0x30, 0x86, 0x3f, 0xb4, + 0x98, 0x2a, 0xa8, 0xe2, 0x91, 0x9f, 0x88, 0xca, 0xa3, 0x04, 0x41, 0x08, 0x4b, 0x7a, 0x5c, 0xc5, + 0x82, 0x14, 0x96, 0x48, 0xaf, 0x90, 0x68, 0x12, 0xca, 0xca, 0x35, 0xa3, 0x90, 0x08, 0x5d, 0xe8, + 0x9a, 0x41, 0x0e, 0x19, 0xd6, 0x0f, 0xe6, 0xcd, 0x69, 0xc7, 0x2e, 0x6a, 0x72, 0xbb, 0x16, 0xd9, + 0x51, 0xc9, 0xed, 0x9a, 0xb4, 0xfe, 0x0f, 0x72, 0x30, 0xbb, 0x11, 0xec, 0xba, 0x6d, 0xef, 0x9b, + 0x32, 0x46, 0xb6, 0x8f, 0xe3, 0x72, 0x74, 0xa2, 0xc5, 0xa7, 0x95, 0x30, 0xce, 0xd7, 0x2a, 0x16, + 0x33, 0x05, 0xa7, 0x8c, 0x9d, 0xf5, 0x3d, 0xe8, 0xec, 0x86, 0x1f, 0xa6, 0xe5, 0xed, 0x93, 0xe8, + 0x12, 0x6e, 0xfd, 0xad, 0x3c, 0x8c, 0x6b, 0x4b, 0x80, 0x7d, 0x06, 0x26, 0x74, 0x3e, 0xba, 0xc2, + 0x4f, 0xaf, 0xd6, 0x36, 0xb0, 0x50, 0xe3, 0xc7, 0xdd, 0x96, 0xa1, 0xf1, 0x13, 0x13, 0x1d, 0xa1, + 0x27, 0xbc, 0xda, 0x7c, 0x90, 0x71, 0xb5, 0x29, 0xa7, 0x32, 0xf5, 0x1f, 0x79, 0xc1, 0x79, 0xb7, + 0xf7, 0x82, 0x83, 0xca, 0x23, 0x8d, 0xbe, 0xff, 0x35, 0xc7, 0xfa, 0xf1, 0x1c, 0x94, 0xd2, 0x8b, + 0xf4, 0xbb, 0xd2, 0x2b, 0x27, 0x78, 0xdd, 0xf9, 0xd1, 0x7c, 0x9c, 0xe7, 0x44, 0xb9, 0xf0, 0x3e, + 0xab, 0x66, 0x82, 0xef, 0x19, 0x0f, 0x2f, 0xcf, 0x9b, 0xd1, 0xe8, 0xf4, 0xe0, 0x17, 0xd9, 0x21, + 0x28, 0x87, 0xbe, 0xf5, 0xb3, 0xe5, 0xe7, 0xac, 0x0f, 0x61, 0x2e, 0xdd, 0x1d, 0xf8, 0xf8, 0x52, + 0x81, 0x69, 0x13, 0x9e, 0xce, 0x92, 0x94, 0xa6, 0xb2, 0xd3, 0xf8, 0xd6, 0xef, 0xe6, 0xd3, 0xbc, + 0xc9, 0x64, 0x50, 0x6c, 0x3a, 0xba, 0x21, 0x0c, 0x6d, 0x3a, 0x12, 0x64, 0xab, 0xb2, 0x93, 0x64, + 0x27, 0x8b, 0x1d, 0x51, 0x0b, 0xd9, 0x8e, 0xa8, 0xec, 0x7a, 0xca, 0x4a, 0x5a, 0x8b, 0x9a, 0xf4, + 0x98, 0x6f, 0x3b, 0x89, 0xa5, 0x74, 0xca, 0x38, 0x7a, 0x19, 0xe6, 0x8c, 0x10, 0xe0, 0x8a, 0x7e, + 0x38, 0xd1, 0xb5, 0x47, 0x58, 0x20, 0x89, 0x33, 0x91, 0xd9, 0x2d, 0x18, 0x15, 0x9f, 0x79, 0xd7, + 0xed, 0xd0, 0x9b, 0x0a, 0x8b, 0xdd, 0xd2, 0x9b, 0xf1, 0x85, 0x4f, 0xf3, 0x4c, 0x6f, 0x72, 0x71, + 0xe4, 0xeb, 0x13, 0x8b, 0x10, 0xad, 0x7f, 0x9e, 0x13, 0xeb, 0xbf, 0xfe, 0xf0, 0x7b, 0x2c, 0xc5, + 0x99, 0x68, 0xd2, 0x11, 0x16, 0xad, 0x7f, 0x98, 0x97, 0x89, 0x6e, 0x68, 0xfa, 0xbc, 0x0d, 0x23, + 0x5b, 0x6e, 0xb0, 0x4b, 0x39, 0x8e, 0x4d, 0x2e, 0xb2, 0x20, 0x89, 0xe9, 0x14, 0xe1, 0x6f, 0x9b, + 0x08, 0x74, 0x5d, 0x58, 0x7e, 0x20, 0x5d, 0x98, 0xa6, 0x97, 0x2f, 0x3c, 0x35, 0xbd, 0xfc, 0xf7, + 0xc5, 0x39, 0x6d, 0x2a, 0xd1, 0x00, 0x11, 0xa6, 0xcf, 0xa7, 0x73, 0x42, 0xf5, 0xc4, 0x02, 0x4f, + 0xd8, 0xb1, 0xeb, 0x7a, 0x96, 0x29, 0xcd, 0xb7, 0xf3, 0x98, 0x7c, 0x52, 0xd6, 0x1f, 0x16, 0x64, + 0x1f, 0x53, 0x47, 0x5d, 0x30, 0xfc, 0xbe, 0x71, 0x9d, 0x88, 0x8d, 0x5e, 0x0f, 0xc1, 0x81, 0x66, + 0x53, 0x17, 0x60, 0x48, 0xcc, 0x4d, 0xea, 0x4d, 0xc4, 0x13, 0xf3, 0x57, 0xc7, 0x13, 0xe5, 0x62, + 0x2d, 0xe3, 0x99, 0xa4, 0xa7, 0x0f, 0xc4, 0x63, 0x4b, 0x5f, 0xcb, 0x88, 0xc1, 0x2e, 0xc2, 0xd0, + 0xba, 0xdf, 0x50, 0x91, 0xcc, 0xe7, 0x30, 0xfa, 0x87, 0xdf, 0xe0, 0x86, 0xd2, 0x1c, 0x31, 0x44, + 0x5b, 0xe3, 0xe4, 0x0e, 0x7a, 0x5b, 0x5b, 0x3b, 0x6e, 0x6f, 0x5a, 0x38, 0x2d, 0xa3, 0xcc, 0x2a, + 0x4c, 0x99, 0x89, 0xd5, 0xc9, 0xde, 0x17, 0xb5, 0xeb, 0xa9, 0xfc, 0xec, 0xfa, 0xb3, 0x88, 0x49, + 0xc4, 0x96, 0x60, 0xd2, 0x88, 0xa0, 0x4a, 0x8f, 0x9b, 0xa8, 0xde, 0x34, 0xe3, 0xaf, 0xea, 0xea, + 0x4d, 0x83, 0x44, 0x9c, 0xe7, 0xf4, 0xfd, 0xda, 0x13, 0x67, 0xcf, 0xb7, 0x13, 0x0e, 0xbb, 0x06, + 0x45, 0x19, 0x66, 0xa3, 0xba, 0xa2, 0x3f, 0x53, 0x85, 0x08, 0x4b, 0x85, 0xa9, 0x51, 0x88, 0x5a, + 0x58, 0x85, 0x4f, 0x43, 0x89, 0xb6, 0xa4, 0x24, 0x55, 0xf7, 0x0b, 0x30, 0xb4, 0x5c, 0x5d, 0xb1, + 0xf5, 0x6d, 0xa4, 0xee, 0x35, 0x02, 0x1b, 0xa1, 0xe8, 0x55, 0xb7, 0xce, 0xa3, 0xc7, 0x7e, 0xf0, + 0xd0, 0xe6, 0x61, 0x14, 0x78, 0x32, 0xfb, 0x24, 0x2e, 0xc4, 0xcf, 0xb0, 0x77, 0x61, 0x18, 0x0d, + 0x4f, 0x53, 0x27, 0x43, 0xba, 0x8e, 0xa5, 0x49, 0x9a, 0xc0, 0xc3, 0x68, 0xc5, 0x6a, 0x4b, 0x22, + 0xf6, 0x36, 0x0c, 0xad, 0xf0, 0xf6, 0x7e, 0x2a, 0x31, 0x5e, 0x0f, 0x71, 0xbc, 0x21, 0x34, 0x78, + 0x7b, 0xdf, 0x46, 0x12, 0xeb, 0xc7, 0xf3, 0x70, 0x2a, 0xe3, 0xb3, 0xee, 0x7f, 0xe6, 0x19, 0xdd, + 0x15, 0x97, 0x8c, 0x5d, 0x51, 0xbd, 0x4f, 0xf7, 0xed, 0xf8, 0xcc, 0x4d, 0xf2, 0xa7, 0x73, 0x70, + 0xc6, 0x9c, 0xa0, 0x64, 0x69, 0x7e, 0xff, 0x1a, 0x7b, 0x07, 0x46, 0x6e, 0x71, 0xb7, 0xc1, 0x55, + 0xd2, 0xac, 0x53, 0x71, 0x40, 0x3c, 0x19, 0x43, 0x40, 0x16, 0x4a, 0xb6, 0x89, 0xc7, 0xa9, 0x84, + 0xb2, 0x15, 0xfa, 0x38, 0x29, 0x8f, 0x5b, 0x2a, 0x9e, 0x47, 0x56, 0x55, 0x47, 0x58, 0x79, 0x7c, + 0x3b, 0x07, 0xcf, 0x1f, 0x41, 0x23, 0x06, 0x4e, 0x0c, 0xbd, 0x3e, 0x70, 0x78, 0xa2, 0x22, 0x94, + 0xbd, 0x0f, 0xd3, 0x5b, 0x24, 0xcf, 0xab, 0xe1, 0xc8, 0x27, 0xeb, 0x45, 0x89, 0xfa, 0x8e, 0x1a, + 0x97, 0x34, 0xb2, 0x11, 0x68, 0xa6, 0x70, 0x64, 0xa0, 0x19, 0x3d, 0x6e, 0xcb, 0xd0, 0xa0, 0x71, + 0x5b, 0x3e, 0x84, 0x39, 0xb3, 0x6d, 0x14, 0x3e, 0x37, 0x89, 0x5a, 0x93, 0xeb, 0x1f, 0xb5, 0xe6, + 0xc8, 0x20, 0x9d, 0xd6, 0xdf, 0xca, 0x41, 0xc9, 0xe4, 0xfd, 0x49, 0xc7, 0xf3, 0x3d, 0x63, 0x3c, + 0x9f, 0xcf, 0x1e, 0xcf, 0xfe, 0x03, 0xf9, 0x7f, 0xe6, 0xd2, 0x8d, 0x1d, 0x68, 0x04, 0x2d, 0x18, + 0x59, 0xf1, 0x5b, 0xae, 0xd7, 0xd6, 0x33, 0xbf, 0x37, 0x10, 0x62, 0x53, 0xc9, 0x60, 0x41, 0x7e, + 0xce, 0xc3, 0xf0, 0xba, 0xdf, 0xae, 0xac, 0x90, 0x49, 0x2f, 0xf2, 0x69, 0xfb, 0x6d, 0xc7, 0x6d, + 0xd8, 0xb2, 0x80, 0xad, 0x01, 0xd4, 0xea, 0x01, 0xe7, 0xed, 0x9a, 0xf7, 0x4d, 0x9e, 0x92, 0x34, + 0x44, 0x0f, 0x35, 0xbb, 0xb8, 0xb1, 0xc8, 0xa7, 0x4b, 0x44, 0x74, 0x42, 0xef, 0x9b, 0xfa, 0x7e, + 0xab, 0xd1, 0xe3, 0xba, 0xa2, 0x38, 0x68, 0xa9, 0x71, 0xb8, 0xfa, 0xdd, 0x58, 0x57, 0x99, 0x55, + 0x61, 0x0f, 0x5f, 0xcd, 0x1c, 0x8e, 0xdf, 0xc9, 0xc1, 0xf3, 0x47, 0xd0, 0x3c, 0x85, 0x51, 0xf9, + 0xb3, 0xee, 0x70, 0x0e, 0x90, 0x10, 0x61, 0xde, 0x61, 0xaf, 0x11, 0xc9, 0x44, 0x78, 0x93, 0x94, + 0x77, 0x58, 0x00, 0x8c, 0xbc, 0xc3, 0x02, 0x20, 0xce, 0xd2, 0x5b, 0xdc, 0xdb, 0xdd, 0x93, 0xe6, + 0x59, 0x93, 0x72, 0x6f, 0xd8, 0x43, 0x88, 0x7e, 0x96, 0x4a, 0x1c, 0xeb, 0x5f, 0x0e, 0xc3, 0x59, + 0x9b, 0xef, 0x7a, 0xe2, 0x5e, 0x72, 0x2f, 0xf4, 0xda, 0xbb, 0x46, 0xdc, 0x1b, 0x2b, 0xb5, 0x72, + 0x29, 0x49, 0x84, 0x80, 0xc4, 0x33, 0xf1, 0x12, 0x14, 0x85, 0x18, 0xa2, 0x2d, 0x5e, 0x7c, 0xb4, + 0x12, 0xc2, 0x0a, 0x05, 0x56, 0x56, 0xc5, 0xec, 0x75, 0x12, 0x93, 0xb4, 0x34, 0x3e, 0x42, 0x4c, + 0xfa, 0xce, 0x41, 0x19, 0x6a, 0xfb, 0x61, 0xc4, 0xf1, 0x8a, 0x4c, 0xa2, 0x52, 0x7c, 0x97, 0x19, + 0xea, 0x73, 0x97, 0xb9, 0x0b, 0x73, 0x95, 0x86, 0x3c, 0x1d, 0xdd, 0xe6, 0x66, 0xe0, 0xb5, 0xeb, + 0x5e, 0xc7, 0x6d, 0xaa, 0xfb, 0x39, 0xf6, 0xb2, 0x1b, 0x97, 0x3b, 0x9d, 0x18, 0xc1, 0xce, 0x24, + 0x13, 0xcd, 0x58, 0x59, 0xaf, 0x61, 0x78, 0x18, 0x7a, 0x8f, 0xc4, 0x66, 0x34, 0xda, 0x21, 0xb6, + 0x22, 0xb4, 0xe3, 0x62, 0xbc, 0x45, 0xe1, 0x83, 0xfc, 0xd6, 0x5a, 0x2d, 0x71, 0x69, 0x96, 0x59, + 0x06, 0xe4, 0xc3, 0x7e, 0xd4, 0x0c, 0xd1, 0x14, 0xd2, 0xc0, 0x4b, 0xe8, 0x6a, 0xb5, 0x5b, 0x82, + 0xae, 0xd8, 0x43, 0x17, 0x86, 0x7b, 0x3a, 0x9d, 0xc4, 0x63, 0x57, 0xc4, 0x54, 0x68, 0xf9, 0x11, + 0xc7, 0x29, 0x3c, 0x96, 0xdc, 0xb9, 0x02, 0x84, 0xca, 0x3b, 0x97, 0x86, 0xc2, 0xde, 0x85, 0xd9, + 0xd5, 0xe5, 0x45, 0xa5, 0x45, 0x5e, 0xf1, 0xeb, 0x5d, 0x7c, 0x88, 0x07, 0xac, 0x0f, 0xc7, 0x90, + 0xd7, 0x17, 0xc5, 0x6e, 0x92, 0x85, 0xc6, 0x2e, 0xc0, 0x68, 0x75, 0x45, 0xf6, 0xfd, 0xb8, 0x9e, + 0x4a, 0x8b, 0x2c, 0xa3, 0x54, 0x21, 0xdb, 0x48, 0x2e, 0x05, 0x13, 0xc7, 0x4a, 0xef, 0x67, 0x07, + 0xb8, 0x10, 0xbc, 0x0d, 0x93, 0x4b, 0x7e, 0x54, 0x6d, 0x87, 0x91, 0xdb, 0xae, 0xf3, 0xea, 0x8a, + 0x1e, 0xd7, 0x7a, 0xdb, 0x8f, 0x1c, 0x8f, 0x4a, 0xc4, 0x97, 0x9b, 0x98, 0xec, 0x73, 0x48, 0x7a, + 0x93, 0xb7, 0x79, 0x90, 0xc4, 0xb3, 0x1e, 0x96, 0x7d, 0x2b, 0x48, 0x77, 0xe3, 0x12, 0xdb, 0x44, + 0xa4, 0x34, 0x5f, 0x32, 0xf3, 0xe6, 0xb2, 0xdf, 0xe0, 0xa1, 0xdc, 0x2d, 0xbe, 0x87, 0xd2, 0x7c, + 0x69, 0x6d, 0x3b, 0x62, 0x07, 0xfd, 0x77, 0x30, 0xcd, 0x57, 0x0f, 0x2e, 0xfb, 0x1c, 0x0c, 0xe3, + 0x4f, 0x92, 0x6e, 0x67, 0x33, 0xd8, 0x26, 0x92, 0x6d, 0x5d, 0x60, 0xda, 0x92, 0x80, 0x55, 0x61, + 0x94, 0x2e, 0x56, 0x27, 0x49, 0x56, 0x43, 0x37, 0x34, 0x39, 0x33, 0x88, 0xde, 0x6a, 0xc0, 0x84, + 0x5e, 0xa1, 0x58, 0x11, 0xb7, 0xdc, 0x70, 0x8f, 0x37, 0xc4, 0x2f, 0xca, 0x33, 0x87, 0x2b, 0x62, + 0x0f, 0xa1, 0x8e, 0xf8, 0x0e, 0x5b, 0x43, 0x11, 0x67, 0x6a, 0x35, 0xbc, 0x17, 0xd2, 0xa7, 0x90, + 0xaa, 0xc5, 0x43, 0xb5, 0x5d, 0xc3, 0xa6, 0x22, 0xeb, 0xfb, 0x60, 0x6e, 0xbd, 0xdb, 0x6c, 0xba, + 0xdb, 0x4d, 0xae, 0xf2, 0x90, 0x60, 0x7a, 0xee, 0x25, 0x18, 0xae, 0x69, 0x09, 0xbf, 0xe3, 0x44, + 0x8f, 0x1a, 0x0e, 0x1a, 0xa1, 0xe6, 0x30, 0x54, 0x4f, 0x2a, 0xd5, 0xb7, 0x24, 0xb5, 0x7e, 0x2b, + 0x07, 0x73, 0xea, 0xfd, 0x3f, 0x70, 0xeb, 0x0f, 0xe3, 0xac, 0xef, 0x17, 0x8c, 0xb9, 0x86, 0x13, + 0x36, 0x35, 0x8d, 0xe4, 0xac, 0xbb, 0xad, 0x3e, 0xc2, 0x14, 0x58, 0xb2, 0x3e, 0xf8, 0xb8, 0x8f, + 0x61, 0xef, 0xc2, 0x38, 0x1d, 0x8f, 0x5a, 0x80, 0x49, 0x8c, 0xe2, 0x45, 0xd7, 0xbd, 0xb4, 0x35, + 0x8a, 0x8e, 0x8e, 0xb2, 0x98, 0xd9, 0x94, 0x4f, 0x2a, 0x03, 0x64, 0xcb, 0x62, 0x66, 0x1d, 0x47, + 0x4c, 0xdd, 0x5f, 0x1b, 0x4f, 0xf7, 0x2d, 0xcd, 0xdd, 0xeb, 0x7a, 0x48, 0xb9, 0x5c, 0x72, 0x33, + 0x4e, 0x42, 0xca, 0xe9, 0x37, 0xe3, 0x18, 0x35, 0x1e, 0x93, 0xfc, 0x31, 0x63, 0xf2, 0xbe, 0x1a, + 0x93, 0x42, 0xff, 0x89, 0x31, 0x7b, 0xc4, 0x38, 0xd4, 0x92, 0x15, 0x32, 0x34, 0x90, 0x5a, 0xe5, + 0x39, 0x8c, 0x9d, 0x2f, 0x49, 0xd2, 0xbb, 0x28, 0x71, 0xd2, 0x75, 0x35, 0xc3, 0x83, 0x33, 0x3d, + 0x66, 0x6b, 0xfe, 0x3c, 0x4c, 0x54, 0xa2, 0xc8, 0xad, 0xef, 0xf1, 0xc6, 0x8a, 0xd8, 0x9e, 0xb4, + 0xe8, 0x57, 0x2e, 0xc1, 0xf5, 0x47, 0x33, 0x1d, 0x57, 0x46, 0x73, 0x75, 0x43, 0x32, 0x66, 0x8d, + 0xa3, 0xb9, 0x0a, 0x88, 0x19, 0xcd, 0x55, 0x40, 0xd8, 0x15, 0x18, 0xad, 0xb6, 0x1f, 0x79, 0xa2, + 0x4f, 0x64, 0x00, 0x2c, 0xd4, 0x4d, 0x79, 0x12, 0xa4, 0x6f, 0xae, 0x84, 0xc5, 0xde, 0xd6, 0x2e, + 0x35, 0x63, 0x89, 0x02, 0x43, 0xaa, 0xbc, 0xe2, 0x08, 0x37, 0xfa, 0x85, 0x25, 0xbe, 0xe5, 0x5c, + 0x87, 0x51, 0xa5, 0xc9, 0x84, 0x44, 0x69, 0x41, 0x94, 0xbd, 0x01, 0x23, 0x14, 0x32, 0x66, 0xf0, + 0xd6, 0xf2, 0xe5, 0x8d, 0x6b, 0x19, 0xbc, 0xb5, 0x7c, 0x79, 0x46, 0x06, 0x6f, 0x2d, 0x73, 0x5e, + 0xac, 0x04, 0x9a, 0x38, 0x56, 0x09, 0x74, 0x1f, 0x26, 0x36, 0xdd, 0x20, 0xf2, 0x84, 0x8c, 0xd2, + 0x8e, 0xc2, 0xf9, 0x49, 0x43, 0x6f, 0xaa, 0x15, 0x2d, 0xbd, 0xa8, 0x92, 0x4e, 0x77, 0x34, 0x7c, + 0x33, 0x3b, 0x72, 0x02, 0xcf, 0x36, 0x65, 0x9d, 0xfa, 0x24, 0xa6, 0xac, 0xd8, 0xa9, 0xa8, 0x2b, + 0x9b, 0x4e, 0x34, 0x32, 0x78, 0x69, 0x49, 0x29, 0xcc, 0x62, 0x44, 0xf6, 0x15, 0x98, 0x10, 0x7f, + 0x6f, 0xfa, 0x4d, 0xaf, 0xee, 0xf1, 0x70, 0xbe, 0x84, 0x8d, 0x7b, 0x31, 0x73, 0xf5, 0x23, 0xd2, + 0x7e, 0x8d, 0x47, 0x72, 0x01, 0x23, 0xe3, 0xb4, 0x12, 0xdc, 0xe0, 0xc6, 0x3e, 0x80, 0x09, 0x31, + 0xfb, 0xb6, 0xdd, 0x50, 0x8a, 0xa6, 0x33, 0x89, 0x31, 0x72, 0x83, 0xe0, 0x3d, 0x01, 0x95, 0x75, + 0x02, 0x71, 0xcc, 0x57, 0x3a, 0x72, 0x83, 0x64, 0xda, 0x6c, 0xef, 0xf4, 0x6c, 0x8e, 0x0a, 0x8d, + 0x7d, 0x01, 0x26, 0x2a, 0x9d, 0x4e, 0xb2, 0xe3, 0xcc, 0x6a, 0x8a, 0xb0, 0x4e, 0xc7, 0xc9, 0xdc, + 0x75, 0x0c, 0x8a, 0xf4, 0xc6, 0x3c, 0x77, 0xa2, 0x8d, 0x99, 0xbd, 0x19, 0x4b, 0xeb, 0xa7, 0x12, + 0xad, 0x2e, 0x5d, 0x1c, 0x0d, 0xd1, 0x5f, 0x0a, 0xee, 0xcb, 0x30, 0x29, 0xd5, 0x9c, 0x4a, 0x9a, + 0x39, 0xdd, 0xb3, 0x7a, 0x32, 0x84, 0x1a, 0x93, 0x86, 0xad, 0xc2, 0x94, 0xf4, 0xb6, 0x6e, 0x52, + 0xa4, 0xeb, 0xf9, 0x33, 0xb8, 0x6a, 0x91, 0x8b, 0x74, 0xd2, 0x6e, 0x62, 0x02, 0x14, 0xd7, 0xe0, + 0x92, 0x22, 0xb2, 0xfe, 0x28, 0x07, 0x67, 0xfa, 0x8c, 0x78, 0x1c, 0x07, 0x39, 0x77, 0x74, 0x1c, + 0x64, 0xb1, 0x73, 0x98, 0x5a, 0x11, 0x6c, 0x3f, 0x49, 0x59, 0xfa, 0x78, 0x29, 0x79, 0xcb, 0x07, + 0x46, 0x39, 0x86, 0xa8, 0xea, 0xdb, 0x3e, 0xaa, 0x66, 0x0b, 0xbd, 0x87, 0x10, 0xe1, 0xc9, 0x8f, + 0x5a, 0xb2, 0x0e, 0x0f, 0xca, 0x2f, 0x52, 0x0a, 0xa3, 0x78, 0x58, 0x3f, 0xf2, 0x8d, 0x15, 0x9c, + 0xc1, 0xda, 0x3a, 0xc8, 0xc1, 0xb8, 0xb6, 0x0e, 0xd9, 0x79, 0xcd, 0x0b, 0xb8, 0x24, 0x93, 0x60, + 0x69, 0x1c, 0xf2, 0xf2, 0x24, 0xc2, 0x45, 0x95, 0x3f, 0x5e, 0x01, 0x7d, 0x57, 0x88, 0x42, 0x5a, + 0xac, 0xe8, 0x96, 0xa1, 0x2d, 0xb6, 0xb1, 0x1c, 0x73, 0xe5, 0xbb, 0x61, 0x54, 0xa9, 0x47, 0xde, + 0x23, 0x3e, 0xc0, 0xa1, 0x93, 0xe4, 0xca, 0x77, 0xc3, 0xc8, 0x71, 0x91, 0xac, 0x27, 0x57, 0x7e, + 0xcc, 0xd0, 0xfa, 0xab, 0x39, 0x80, 0x7b, 0xd5, 0x65, 0x0c, 0xf6, 0xfe, 0x49, 0x85, 0x82, 0xec, + 0x00, 0xba, 0x8a, 0xfb, 0x11, 0xe2, 0xc0, 0x7f, 0x9f, 0x83, 0x29, 0x13, 0x8d, 0xbd, 0x0f, 0xd3, + 0xb5, 0x7a, 0xe0, 0x37, 0x9b, 0xdb, 0x6e, 0xfd, 0xe1, 0x9a, 0xd7, 0xe6, 0x32, 0x74, 0xe9, 0xb0, + 0x3c, 0x8b, 0xc2, 0xb8, 0xc8, 0x69, 0x8a, 0x32, 0x3b, 0x8d, 0xcc, 0xfe, 0x5a, 0x0e, 0x26, 0x6b, + 0x7b, 0xfe, 0xe3, 0x38, 0xda, 0x28, 0x0d, 0xc8, 0x57, 0xc5, 0xda, 0x0e, 0xf7, 0xfc, 0xc7, 0x49, + 0x06, 0x4d, 0xc3, 0xf8, 0xf3, 0xbd, 0xc1, 0xde, 0xe5, 0xeb, 0x3e, 0xde, 0x64, 0xa2, 0xf0, 0xb2, + 0x51, 0x89, 0x6d, 0xd6, 0x69, 0xfd, 0x69, 0x0e, 0xc6, 0xf1, 0xce, 0xd3, 0x6c, 0xa2, 0xcc, 0xf5, + 0xbd, 0x94, 0x8e, 0x31, 0x6e, 0xd7, 0x11, 0x03, 0xfb, 0x16, 0x4c, 0xa7, 0xd0, 0x98, 0x05, 0x23, + 0x35, 0x74, 0xf0, 0xd7, 0x15, 0x14, 0xd2, 0xe5, 0xdf, 0xa6, 0x12, 0x6b, 0x55, 0x23, 0xbb, 0x7f, + 0x15, 0x9f, 0x75, 0x17, 0x01, 0x3c, 0x05, 0x52, 0x37, 0x1b, 0x96, 0xfe, 0x92, 0xfb, 0x57, 0x6d, + 0x0d, 0xcb, 0x5a, 0x87, 0x91, 0x9a, 0x1f, 0x44, 0x4b, 0xfb, 0xf2, 0x32, 0xb1, 0xc2, 0xc3, 0xba, + 0xfe, 0x6e, 0xeb, 0xe1, 0x5b, 0x49, 0xdd, 0xa6, 0x22, 0x56, 0x86, 0xe1, 0x1b, 0x1e, 0x6f, 0x36, + 0x74, 0x03, 0xdd, 0x1d, 0x01, 0xb0, 0x25, 0x5c, 0x5c, 0xb8, 0x4e, 0x27, 0x39, 0x51, 0x12, 0x4b, + 0xe0, 0x4f, 0xba, 0x6e, 0x96, 0x8d, 0xfe, 0x7d, 0x29, 0xce, 0x43, 0xd0, 0x5b, 0xd3, 0x11, 0x5d, + 0xfd, 0x1f, 0xe7, 0x60, 0xa1, 0x3f, 0x89, 0x6e, 0x5c, 0x9c, 0x3b, 0xc2, 0xb8, 0xf8, 0xd5, 0xf4, + 0x3b, 0x23, 0xa2, 0xd1, 0x3b, 0x63, 0xf2, 0xba, 0xb8, 0x82, 0xb6, 0xdd, 0x75, 0xae, 0x12, 0xa1, + 0x9c, 0x3f, 0xe2, 0x9b, 0x11, 0x51, 0x0e, 0x73, 0x84, 0x34, 0x36, 0xd1, 0x5a, 0xbf, 0x3a, 0x04, + 0x67, 0xfb, 0x52, 0xb0, 0x5b, 0x5a, 0x7a, 0xa5, 0xa9, 0x38, 0xb1, 0x4b, 0x5f, 0xfc, 0xcb, 0xf8, + 0x2f, 0x9a, 0xef, 0xa5, 0xbd, 0xcd, 0x36, 0xe2, 0xb4, 0x3a, 0x79, 0xe4, 0xf5, 0xa9, 0x63, 0x79, + 0x49, 0x74, 0x64, 0x06, 0xbd, 0x19, 0x76, 0xd0, 0x2f, 0x91, 0x47, 0xae, 0xd7, 0x0c, 0xf5, 0x65, + 0xd7, 0x90, 0x20, 0x5b, 0x95, 0x25, 0x16, 0xdf, 0x43, 0xd9, 0x16, 0xdf, 0xd6, 0xbf, 0xcc, 0xc1, + 0x58, 0xfc, 0xd9, 0x6c, 0x01, 0x4e, 0x6f, 0xd9, 0x95, 0xe5, 0x55, 0x67, 0xeb, 0xc3, 0xcd, 0x55, + 0xe7, 0xde, 0x7a, 0x6d, 0x73, 0x75, 0xb9, 0x7a, 0xa3, 0xba, 0xba, 0x52, 0x7a, 0x8e, 0xcd, 0xc0, + 0xe4, 0xbd, 0xf5, 0x3b, 0xeb, 0x1b, 0x0f, 0xd6, 0x9d, 0x55, 0xdb, 0xde, 0xb0, 0x4b, 0x39, 0x36, + 0x09, 0x63, 0xf6, 0x52, 0x65, 0xd9, 0x59, 0xdf, 0x58, 0x59, 0x2d, 0xe5, 0x59, 0x09, 0x26, 0x96, + 0x37, 0xd6, 0xd7, 0x57, 0x97, 0xb7, 0xaa, 0xf7, 0xab, 0x5b, 0x1f, 0x96, 0x0a, 0x8c, 0xc1, 0x14, + 0x22, 0x6c, 0xda, 0xd5, 0xf5, 0xe5, 0xea, 0x66, 0x65, 0xad, 0x34, 0x24, 0x60, 0x02, 0x5f, 0x83, + 0x0d, 0xc7, 0x8c, 0xee, 0xdc, 0x5b, 0x5a, 0x2d, 0x8d, 0x08, 0x14, 0xf1, 0x97, 0x86, 0x32, 0x2a, + 0xaa, 0x47, 0x94, 0x95, 0xca, 0x56, 0x65, 0xa9, 0x52, 0x5b, 0x2d, 0x15, 0xd9, 0x19, 0x98, 0x35, + 0x40, 0xce, 0xda, 0xc6, 0xcd, 0xea, 0x7a, 0x69, 0x8c, 0xcd, 0x41, 0x29, 0x86, 0xad, 0x2c, 0x39, + 0xf7, 0x6a, 0xab, 0x76, 0x09, 0xd2, 0xd0, 0xf5, 0xca, 0xdd, 0xd5, 0xd2, 0xb8, 0xf5, 0x9e, 0xf4, + 0x03, 0x94, 0x5d, 0xcd, 0x4e, 0x03, 0xab, 0x6d, 0x55, 0xb6, 0xee, 0xd5, 0x52, 0x8d, 0x1f, 0x87, + 0xd1, 0xda, 0xbd, 0xe5, 0xe5, 0xd5, 0x5a, 0xad, 0x94, 0x63, 0x00, 0x23, 0x37, 0x2a, 0xd5, 0xb5, + 0xd5, 0x95, 0x52, 0xde, 0xfa, 0xdb, 0x39, 0x98, 0x51, 0x12, 0xa0, 0x7a, 0x34, 0xfa, 0x84, 0x6b, + 0xf1, 0x7d, 0xe3, 0x62, 0xab, 0x9c, 0xb4, 0x52, 0x95, 0x1c, 0xb1, 0x0c, 0x7f, 0x3a, 0x07, 0xa7, + 0x32, 0xb1, 0xd9, 0x87, 0x50, 0x52, 0x5f, 0x70, 0xd7, 0x8d, 0xea, 0x7b, 0xc9, 0x3e, 0xf6, 0x62, + 0xaa, 0x96, 0x14, 0x9a, 0x54, 0x6b, 0x26, 0x09, 0x9f, 0x7b, 0xd8, 0x0c, 0x9e, 0x8e, 0xc0, 0xfa, + 0x56, 0x0e, 0xce, 0xf4, 0xa9, 0x86, 0x2d, 0xc3, 0x48, 0x9c, 0x98, 0xe6, 0x08, 0x0b, 0xb6, 0xb9, + 0x6f, 0x1f, 0x94, 0x09, 0x11, 0x33, 0xe4, 0xe2, 0x5f, 0xf6, 0x48, 0x9c, 0x69, 0x06, 0xd3, 0xbd, + 0xc8, 0xee, 0x3b, 0x9b, 0xea, 0x79, 0xaa, 0xa9, 0xf2, 0xa0, 0xb6, 0x34, 0x4e, 0x7d, 0x57, 0x70, + 0x1f, 0x87, 0x98, 0xef, 0xc5, 0xfa, 0x89, 0x9c, 0x10, 0xee, 0xd2, 0x88, 0x42, 0xe6, 0xad, 0x84, + 0x61, 0xb7, 0xc5, 0x6d, 0xbf, 0xc9, 0x2b, 0xf6, 0x3a, 0x1d, 0x1b, 0x28, 0xad, 0xba, 0x58, 0x80, + 0xd7, 0x0a, 0xc7, 0x0d, 0xda, 0xc6, 0x6b, 0xb5, 0x4e, 0xc3, 0xde, 0x06, 0x58, 0x7d, 0x12, 0xf1, + 0xa0, 0xed, 0x36, 0xe3, 0x18, 0x2d, 0x32, 0xb2, 0x14, 0x41, 0x4d, 0x79, 0x5b, 0x43, 0xb6, 0xfe, + 0x46, 0x0e, 0x26, 0xe8, 0xd2, 0x54, 0x69, 0xf2, 0x20, 0xfa, 0x64, 0xd3, 0xeb, 0x6d, 0x63, 0x7a, + 0xc5, 0x0e, 0x1b, 0x1a, 0x7f, 0x51, 0x9c, 0x39, 0xb3, 0xfe, 0x59, 0x0e, 0x4a, 0x69, 0x44, 0xf6, + 0x3e, 0x14, 0x6b, 0xfc, 0x11, 0x0f, 0xbc, 0x68, 0x9f, 0x36, 0x4a, 0x95, 0xc2, 0x4f, 0xe2, 0x50, + 0x99, 0x9c, 0x0f, 0x21, 0xfd, 0xb2, 0x63, 0x9a, 0x41, 0xf7, 0x7b, 0x4d, 0xed, 0x51, 0x78, 0x5a, + 0x6a, 0x0f, 0xeb, 0x7f, 0xc9, 0xc3, 0x99, 0x9b, 0x3c, 0xd2, 0xdb, 0x14, 0x9b, 0x17, 0x7c, 0x7a, + 0xb0, 0x76, 0x69, 0x2d, 0x99, 0x87, 0x51, 0x2c, 0x52, 0xe3, 0x6b, 0xab, 0x9f, 0x6c, 0x29, 0x9e, + 0xd7, 0x05, 0x23, 0x47, 0x58, 0x9f, 0xba, 0x2f, 0x6b, 0x59, 0x83, 0xe2, 0x69, 0x7d, 0x01, 0xa6, + 0x30, 0x2c, 0x7e, 0x57, 0x2c, 0x07, 0xde, 0x20, 0xf5, 0x4f, 0xd1, 0x4e, 0x41, 0xd9, 0xeb, 0x50, + 0x12, 0x90, 0x4a, 0xfd, 0x61, 0xdb, 0x7f, 0xdc, 0xe4, 0x8d, 0x5d, 0xde, 0xc0, 0x63, 0xbd, 0x68, + 0xf7, 0xc0, 0x15, 0xcf, 0x7b, 0x6d, 0x79, 0x75, 0xe3, 0x0d, 0xd4, 0xd1, 0x10, 0xcf, 0x04, 0xba, + 0xf0, 0x36, 0x8c, 0x7f, 0xcc, 0x0c, 0x60, 0xd6, 0xff, 0x9c, 0x83, 0x39, 0x6c, 0x9c, 0x56, 0xb1, + 0xca, 0xce, 0xaa, 0x7a, 0x4b, 0x4b, 0x8a, 0xe3, 0x0a, 0x90, 0xb9, 0x14, 0xe2, 0x5e, 0x4c, 0x74, + 0x42, 0xf9, 0x01, 0x74, 0x42, 0xb5, 0x93, 0x64, 0xa2, 0x1f, 0x50, 0xa5, 0x75, 0x7b, 0xa8, 0x58, + 0x28, 0x0d, 0x25, 0x43, 0x6e, 0xfd, 0xb5, 0x3c, 0x8c, 0xda, 0x1c, 0x53, 0x74, 0xb3, 0x0b, 0x30, + 0xba, 0xee, 0x47, 0x3c, 0xbc, 0x6b, 0xe4, 0x63, 0x6f, 0x0b, 0x90, 0xd3, 0x6a, 0xd8, 0xaa, 0x50, + 0x4c, 0xf8, 0xcd, 0xc0, 0x6f, 0x74, 0xeb, 0x91, 0x3e, 0xe1, 0x3b, 0x12, 0x64, 0xab, 0x32, 0xf6, + 0x06, 0x8c, 0x11, 0xe7, 0xf8, 0x51, 0x17, 0x8d, 0x91, 0x03, 0x1e, 0xa7, 0x78, 0x4f, 0x10, 0x50, + 0xa6, 0x95, 0x02, 0xc6, 0x90, 0x26, 0xd3, 0xf6, 0xc8, 0x0c, 0x4a, 0x54, 0x1f, 0x3e, 0x42, 0x54, + 0xff, 0x34, 0x8c, 0x54, 0xc2, 0x90, 0x47, 0x2a, 0x8a, 0xc1, 0x44, 0x1c, 0xb6, 0x2d, 0xe4, 0x91, + 0x64, 0xec, 0x62, 0xb9, 0x4d, 0x78, 0xd6, 0x3f, 0xcf, 0xc3, 0x30, 0xfe, 0x89, 0x4f, 0xa6, 0x41, + 0x7d, 0xcf, 0x78, 0x32, 0x0d, 0xea, 0x7b, 0x36, 0x42, 0xd9, 0x55, 0xd4, 0x54, 0xa8, 0xfc, 0x4d, + 0xd4, 0x7a, 0x54, 0xc1, 0x37, 0x12, 0xb0, 0xad, 0xe3, 0xc4, 0x2f, 0xfc, 0x85, 0xcc, 0xd8, 0x25, + 0xa7, 0x21, 0xbf, 0x51, 0xa3, 0x16, 0x63, 0x44, 0x2c, 0x3f, 0xb4, 0xf3, 0x1b, 0x35, 0xec, 0x8d, + 0x5b, 0x95, 0xc5, 0xb7, 0xae, 0x53, 0x43, 0x65, 0x6f, 0xec, 0xb9, 0x8b, 0x6f, 0x5d, 0xb7, 0xa9, + 0x44, 0xf4, 0x2f, 0x7e, 0x33, 0x3e, 0xbc, 0x4a, 0x9f, 0x7b, 0xec, 0x5f, 0x6c, 0x1b, 0x3e, 0xb2, + 0xda, 0x09, 0x02, 0x5b, 0x84, 0x71, 0x8a, 0xf5, 0x80, 0xf8, 0x5a, 0x2c, 0x06, 0x8a, 0x05, 0x21, + 0x29, 0x74, 0x24, 0xf9, 0x04, 0x47, 0x03, 0xa4, 0xb2, 0xcc, 0xd2, 0x13, 0x9c, 0x1a, 0xc2, 0xd0, + 0xd6, 0x50, 0xc4, 0x27, 0xc9, 0x37, 0xbc, 0xc4, 0x97, 0x7e, 0x4a, 0x0b, 0x1a, 0x80, 0x69, 0x0e, + 0x62, 0x04, 0xeb, 0xe7, 0xf3, 0x50, 0xdc, 0x6c, 0x76, 0x77, 0xbd, 0xf6, 0xfd, 0xab, 0x8c, 0x01, + 0x5e, 0xe3, 0x54, 0x1e, 0x0c, 0xf1, 0x37, 0x3b, 0x0b, 0x45, 0x75, 0x73, 0x53, 0x1b, 0x52, 0x48, + 0xb7, 0xb6, 0x79, 0x50, 0xe3, 0x4e, 0xa1, 0xcf, 0xd4, 0x4f, 0x76, 0x15, 0xe2, 0xfb, 0x57, 0xbf, + 0x8b, 0xda, 0x90, 0x58, 0x2c, 0x76, 0x8c, 0xc6, 0xde, 0x04, 0x3c, 0x24, 0xe8, 0xf2, 0xa0, 0x14, + 0xda, 0xf2, 0xd3, 0x48, 0x4e, 0x91, 0x24, 0x88, 0xc6, 0xae, 0x01, 0x4d, 0x4c, 0xca, 0x66, 0x7e, + 0xca, 0x24, 0x90, 0xf9, 0x21, 0x15, 0x09, 0xa1, 0xb2, 0x77, 0x61, 0xbc, 0x1e, 0x70, 0x7c, 0x75, + 0x74, 0x9b, 0x49, 0x92, 0x72, 0x9d, 0x72, 0x39, 0x29, 0xbf, 0x7f, 0xd5, 0xd6, 0xd1, 0xad, 0x7f, + 0x3c, 0x0a, 0x13, 0xfa, 0xf7, 0x30, 0x1b, 0x66, 0xc3, 0xa6, 0xb8, 0xbb, 0x93, 0xb1, 0x59, 0x07, + 0x0b, 0xe9, 0x38, 0x3d, 0x6f, 0x7e, 0x90, 0xc0, 0x93, 0x96, 0x67, 0x2a, 0x48, 0xc5, 0xad, 0xe7, + 0xec, 0x99, 0x30, 0x01, 0x4b, 0x3c, 0x56, 0x81, 0xa2, 0xdf, 0x09, 0x77, 0x79, 0xdb, 0x53, 0xef, + 0x2d, 0x2f, 0x1b, 0x8c, 0x36, 0xa8, 0xb0, 0x87, 0x57, 0x4c, 0xc6, 0xde, 0x82, 0x11, 0xbf, 0xc3, + 0xdb, 0xae, 0x47, 0x67, 0xdc, 0xf3, 0x29, 0x06, 0xbc, 0x5d, 0xa9, 0x6a, 0x84, 0x84, 0xcc, 0xae, + 0xc0, 0x90, 0xff, 0x30, 0x1e, 0xaf, 0xb3, 0x26, 0xd1, 0xc3, 0xc8, 0xd5, 0x48, 0x10, 0x51, 0x10, + 0x7c, 0xe4, 0xb6, 0x76, 0x68, 0xc4, 0x4c, 0x82, 0xdb, 0x6e, 0x6b, 0x47, 0x27, 0x10, 0x88, 0xec, + 0x03, 0x80, 0x8e, 0xbb, 0xcb, 0x03, 0xa7, 0xd1, 0x8d, 0xf6, 0x69, 0xdc, 0x5e, 0x34, 0xc8, 0x36, + 0x45, 0xf1, 0x4a, 0x37, 0xda, 0xd7, 0x68, 0xc7, 0x3a, 0x0a, 0xc8, 0x2a, 0x00, 0x2d, 0x37, 0x8a, + 0x78, 0xd0, 0xf2, 0xc9, 0xda, 0x2f, 0x09, 0x42, 0x28, 0x19, 0xdc, 0x8d, 0x8b, 0x35, 0x0e, 0x1a, + 0x11, 0x7e, 0xb4, 0x17, 0xb8, 0x94, 0x53, 0x3e, 0xf5, 0xd1, 0x5e, 0x60, 0xb4, 0x52, 0x20, 0xb2, + 0xcf, 0xc1, 0x68, 0xc3, 0x0b, 0xeb, 0x7e, 0xd0, 0xa0, 0xe8, 0x25, 0x2f, 0x18, 0x34, 0x2b, 0xb2, + 0x4c, 0x23, 0x53, 0xe8, 0xe2, 0x6b, 0x29, 0x08, 0xe9, 0xba, 0xff, 0x18, 0xd5, 0xfc, 0xe9, 0xaf, + 0xad, 0xc5, 0xc5, 0xfa, 0xd7, 0x26, 0x44, 0x62, 0x28, 0x77, 0xbd, 0xa8, 0xe9, 0x6e, 0xd3, 0x3b, + 0xb7, 0x39, 0x94, 0x37, 0xb1, 0x48, 0x1f, 0x4a, 0x89, 0xcc, 0xde, 0x86, 0x22, 0x6f, 0x47, 0x81, + 0xeb, 0x78, 0x0d, 0xf2, 0x92, 0x34, 0x3f, 0x5a, 0x1c, 0xc0, 0x6e, 0x75, 0x45, 0xff, 0x68, 0xc4, + 0xaf, 0x36, 0x44, 0xff, 0x84, 0x75, 0xaf, 0x45, 0xce, 0x8d, 0x66, 0xff, 0xd4, 0x96, 0xab, 0x77, + 0xf5, 0xfe, 0x11, 0x88, 0xec, 0x7d, 0x18, 0x15, 0xeb, 0xb7, 0xe1, 0xef, 0x52, 0x40, 0x08, 0xcb, + 0xec, 0x1f, 0x59, 0xd6, 0x33, 0x5d, 0x15, 0x91, 0x58, 0xc8, 0xee, 0xe3, 0xd0, 0xf1, 0xea, 0x14, + 0xe4, 0xc1, 0x5c, 0x8e, 0x95, 0x07, 0xb5, 0xea, 0xb2, 0x46, 0x36, 0xec, 0x3e, 0x0e, 0xab, 0x75, + 0xf6, 0x22, 0x40, 0xf2, 0xae, 0x2e, 0x5f, 0x41, 0x6c, 0x0d, 0xf2, 0xf9, 0xa1, 0xff, 0xfd, 0x67, + 0xcb, 0xb9, 0x25, 0x80, 0xa2, 0x8a, 0x19, 0x63, 0xad, 0xc1, 0xd9, 0xbe, 0x2b, 0x91, 0x5d, 0x82, + 0xd2, 0x8e, 0x4b, 0x7a, 0xb8, 0xfa, 0x9e, 0xdb, 0x6e, 0xf3, 0x26, 0xed, 0x81, 0xd3, 0x0a, 0xbe, + 0x2c, 0xc1, 0x92, 0xb3, 0xf5, 0x01, 0xcc, 0x65, 0x0d, 0x01, 0x7b, 0x09, 0x26, 0xf4, 0xf0, 0x38, + 0xc4, 0x64, 0xdc, 0xed, 0x78, 0x2a, 0x40, 0x0e, 0x31, 0xf8, 0x95, 0x1c, 0xbc, 0x70, 0xd4, 0x82, + 0x66, 0x0b, 0x50, 0xec, 0x04, 0x9e, 0x8f, 0x82, 0x23, 0xe5, 0x1f, 0x50, 0xbf, 0x31, 0xb5, 0x00, + 0x4a, 0x38, 0x91, 0xbb, 0x4b, 0x2e, 0x17, 0xf6, 0x18, 0x42, 0xb6, 0xdc, 0xdd, 0x90, 0x7d, 0x0a, + 0x66, 0x1a, 0x7c, 0xc7, 0xed, 0x36, 0x23, 0x27, 0xac, 0xef, 0xf1, 0x06, 0x7a, 0x39, 0xa1, 0x29, + 0x9d, 0x5d, 0xa2, 0x82, 0x9a, 0x82, 0xf7, 0x7c, 0xf1, 0x70, 0x9f, 0x2f, 0xbe, 0x3d, 0x54, 0xcc, + 0x95, 0xf2, 0x36, 0xda, 0x2e, 0x59, 0x3f, 0x90, 0x87, 0xf9, 0x7e, 0x33, 0x98, 0xbd, 0x97, 0xd5, + 0x07, 0xf2, 0x29, 0x41, 0x87, 0xeb, 0x4f, 0x09, 0x5a, 0x6d, 0x6c, 0x11, 0x62, 0x1f, 0xa5, 0xe3, + 0xe2, 0x0d, 0x28, 0x98, 0xa0, 0xe9, 0xb8, 0x61, 0xf8, 0x58, 0x2c, 0xd2, 0x82, 0x16, 0x62, 0x96, + 0x60, 0x3a, 0x8d, 0x82, 0xb1, 0xcf, 0x02, 0xd4, 0x9b, 0x7e, 0xc8, 0xf1, 0xc5, 0x9e, 0x4e, 0x7f, + 0x69, 0xa8, 0x1d, 0x43, 0xf5, 0x27, 0x5a, 0x84, 0x2e, 0xfb, 0x0d, 0x4e, 0x03, 0xe8, 0xc2, 0x99, + 0x3e, 0x5b, 0x96, 0x18, 0x9e, 0x24, 0x5f, 0xbb, 0xca, 0xfe, 0xd4, 0x8d, 0xb3, 0xb6, 0xa7, 0x7b, + 0x3c, 0xdf, 0x6f, 0x8e, 0xec, 0x03, 0xeb, 0xdd, 0x97, 0x04, 0x77, 0x32, 0x37, 0xee, 0x06, 0x31, + 0x77, 0x09, 0xb9, 0x17, 0x34, 0x59, 0x19, 0xc6, 0x55, 0x76, 0x47, 0x21, 0x5d, 0x4b, 0xe6, 0x40, + 0xa0, 0x3b, 0x1c, 0x27, 0x0f, 0xc6, 0x10, 0x45, 0x4f, 0x34, 0x3a, 0xb7, 0xc7, 0x10, 0xb2, 0xb5, + 0xdf, 0x51, 0xad, 0x7b, 0x41, 0xcd, 0x6f, 0xf3, 0xb4, 0xa0, 0xd2, 0x9f, 0xcc, 0xa9, 0xe1, 0xef, + 0xdd, 0x6e, 0x8f, 0xfb, 0x3e, 0x06, 0xe8, 0x37, 0x44, 0x1f, 0x86, 0x7f, 0x0b, 0x39, 0x42, 0xad, + 0x3a, 0x92, 0x23, 0xe8, 0x27, 0xbb, 0x00, 0xd3, 0x81, 0xb4, 0x2c, 0x8d, 0x7c, 0xea, 0x4f, 0x99, + 0x49, 0x63, 0x52, 0x82, 0xb7, 0x7c, 0xec, 0x53, 0xfa, 0xae, 0xdb, 0x71, 0x87, 0x69, 0xa7, 0x0f, + 0xbb, 0x0c, 0x63, 0xe2, 0xf4, 0xc1, 0xd8, 0x33, 0x29, 0x87, 0x05, 0xc4, 0xc3, 0xb3, 0xdc, 0x2e, + 0x7e, 0x44, 0x7f, 0x13, 0xaf, 0x6f, 0xe5, 0x15, 0x33, 0xfd, 0xec, 0x63, 0x67, 0x60, 0xd4, 0x0f, + 0x76, 0xb5, 0xa6, 0x8d, 0xf8, 0xc1, 0xae, 0x68, 0xd7, 0x45, 0x28, 0x49, 0xff, 0x19, 0x19, 0x98, + 0x20, 0xdc, 0x6f, 0xcb, 0xcb, 0x71, 0xd1, 0x9e, 0x92, 0x70, 0x4c, 0x61, 0xbf, 0xdf, 0xae, 0x0b, + 0xcc, 0x30, 0xf4, 0x1d, 0x3d, 0xe4, 0x14, 0x35, 0x7b, 0x2a, 0x0c, 0xfd, 0x24, 0xf6, 0x54, 0x83, + 0x2d, 0xc1, 0xa4, 0xe0, 0x13, 0x07, 0xbe, 0xa2, 0xa3, 0xf9, 0x5c, 0xef, 0xd1, 0xbc, 0xdf, 0xae, + 0xab, 0x4f, 0xb4, 0x27, 0x42, 0xed, 0x17, 0xbb, 0x03, 0x25, 0x4d, 0x86, 0x41, 0x0f, 0xc9, 0x94, + 0x95, 0x73, 0xc2, 0x46, 0x93, 0x7d, 0xaa, 0xed, 0x1d, 0xdf, 0x9e, 0xae, 0x9b, 0x00, 0xea, 0x9a, + 0x7f, 0x37, 0xa7, 0xf6, 0xd2, 0x0c, 0x22, 0x66, 0xc1, 0xe4, 0x9e, 0x1b, 0x3a, 0x61, 0xd8, 0x92, + 0x56, 0x5b, 0x14, 0x6a, 0x77, 0x7c, 0xcf, 0x0d, 0x6b, 0x61, 0x4b, 0xa5, 0xf2, 0x38, 0x25, 0x70, + 0x7c, 0xb7, 0x1b, 0xed, 0x39, 0xba, 0x44, 0x26, 0x7b, 0x6c, 0x76, 0xcf, 0x0d, 0x37, 0x44, 0x99, + 0xc6, 0x9b, 0xbd, 0x02, 0x53, 0xc8, 0xb7, 0xee, 0x29, 0xc6, 0x18, 0x5c, 0xc2, 0x9e, 0x10, 0x8c, + 0xeb, 0x9e, 0xe4, 0x4c, 0x5f, 0xf8, 0x7f, 0xe4, 0xe1, 0x74, 0x76, 0xef, 0xe0, 0xf4, 0x14, 0x7d, + 0x8a, 0x5e, 0x73, 0xf4, 0x6d, 0x63, 0x02, 0x22, 0x03, 0x83, 0x64, 0x0d, 0x4e, 0x3e, 0x73, 0x70, + 0x5e, 0x87, 0x19, 0x64, 0x44, 0xb2, 0x5f, 0xd3, 0x0b, 0x23, 0x8a, 0x77, 0x61, 0x4f, 0x8b, 0x02, + 0xb9, 0x9f, 0xaf, 0x09, 0x30, 0x7b, 0x15, 0xa6, 0xd4, 0x8e, 0xec, 0x3f, 0x6e, 0x8b, 0x8a, 0xe5, + 0x76, 0x3c, 0x49, 0xd0, 0x0d, 0x04, 0xb2, 0x53, 0x30, 0xe2, 0x76, 0x3a, 0xa2, 0x4a, 0xb9, 0x0b, + 0x0f, 0xbb, 0x9d, 0x8e, 0x4c, 0x37, 0x83, 0x3e, 0x82, 0xce, 0x0e, 0xda, 0xed, 0x90, 0x91, 0xa0, + 0x3d, 0x81, 0x40, 0x69, 0xcb, 0x13, 0x8a, 0x75, 0x2f, 0x68, 0x15, 0xca, 0x28, 0xa2, 0x80, 0xdb, + 0x89, 0x11, 0xce, 0x42, 0x51, 0xbd, 0x20, 0x4b, 0x57, 0x07, 0x7b, 0xd4, 0xa5, 0xd7, 0xe3, 0xb7, + 0xe0, 0x4c, 0xc3, 0x0b, 0x71, 0xf2, 0xca, 0x26, 0x75, 0x3a, 0xe4, 0x95, 0x28, 0xc3, 0xd6, 0xda, + 0x73, 0x54, 0x2c, 0x7a, 0xb2, 0xd2, 0xe9, 0x48, 0xdf, 0x44, 0xea, 0xeb, 0xcf, 0xc1, 0x34, 0xc9, + 0x40, 0x74, 0x44, 0xe2, 0xb7, 0xd0, 0x02, 0x16, 0x97, 0x13, 0x4a, 0xf0, 0x03, 0x04, 0xaa, 0x36, + 0x14, 0xe5, 0xef, 0xe7, 0xe0, 0x54, 0xa6, 0x10, 0xc5, 0xbe, 0x0e, 0xd2, 0x09, 0x2b, 0xf2, 0x9d, + 0x80, 0xd7, 0xbd, 0x8e, 0x87, 0x61, 0x2a, 0xa4, 0x92, 0x71, 0xf1, 0x28, 0xf1, 0x0b, 0x1d, 0xba, + 0xb6, 0x7c, 0x3b, 0x26, 0x92, 0xda, 0x8f, 0x52, 0x90, 0x02, 0x2f, 0x7c, 0x19, 0x4e, 0x65, 0xa2, + 0x66, 0x68, 0x25, 0xde, 0x30, 0xd3, 0x2b, 0xab, 0x67, 0xa3, 0x54, 0xa3, 0x35, 0x6d, 0x05, 0x35, + 0xef, 0xd7, 0xe3, 0xe6, 0xa5, 0xc4, 0x2d, 0xb6, 0x9a, 0x5e, 0xd7, 0x59, 0x37, 0x06, 0x45, 0xd4, + 0x7f, 0x69, 0x7f, 0x19, 0x4e, 0xd1, 0xe4, 0xdb, 0x0d, 0xdc, 0xce, 0x5e, 0xc2, 0x4e, 0x7e, 0xe8, + 0x6b, 0x59, 0xec, 0xe4, 0xac, 0xbc, 0x29, 0xf0, 0x63, 0xae, 0xb3, 0x6e, 0x2f, 0x90, 0xda, 0x10, + 0xa8, 0x95, 0x9e, 0xf1, 0x35, 0x19, 0xb3, 0x3a, 0x97, 0x35, 0xab, 0x07, 0x5e, 0x52, 0x54, 0xe7, + 0x0f, 0xe6, 0xe0, 0xfc, 0x71, 0xdf, 0xcc, 0x1e, 0xc0, 0x69, 0x34, 0x6c, 0x08, 0xfd, 0xb8, 0xd9, + 0x4e, 0xdd, 0xad, 0xef, 0x71, 0x9a, 0x25, 0x56, 0x66, 0xe3, 0x3b, 0x9d, 0x5a, 0x6d, 0x43, 0x6b, + 0x77, 0xa7, 0x53, 0x0b, 0x7d, 0xf5, 0x7b, 0x59, 0x90, 0xd3, 0x37, 0x34, 0xe0, 0xf9, 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, 0x66, 0x70, 0x4a, 0x0b, + 0x55, 0x91, 0x17, 0xea, 0x4d, 0x50, 0x8f, 0xbc, 0x36, 0x95, 0x41, 0xbd, 0x36, 0x56, 0xed, 0xfd, + 0x3b, 0x2c, 0x46, 0xb9, 0xb5, 0xea, 0xa7, 0xdb, 0xa3, 0xfe, 0xfe, 0x1d, 0xfe, 0x95, 0x53, 0x71, + 0xc4, 0xc8, 0x82, 0x35, 0x79, 0x11, 0xce, 0x45, 0x20, 0x37, 0x02, 0x1f, 0x6e, 0x6b, 0x9d, 0x66, + 0x85, 0x01, 0x9a, 0xae, 0xc2, 0xb2, 0x18, 0x86, 0xa1, 0xef, 0x09, 0x66, 0xe5, 0x78, 0x1a, 0x9d, + 0xe5, 0xfc, 0x73, 0x13, 0xd1, 0xa8, 0x44, 0x99, 0xfc, 0x0c, 0xb2, 0x2b, 0x79, 0x01, 0x88, 0x2f, + 0x27, 0xfb, 0x0b, 0x93, 0x7f, 0x70, 0x5d, 0xe4, 0xf8, 0x2b, 0x8a, 0x7f, 0xf6, 0xef, 0x52, 0x70, + 0x2e, 0x41, 0x98, 0xa7, 0x42, 0x77, 0xa7, 0x37, 0xf6, 0x8e, 0x99, 0xc8, 0x2e, 0x37, 0x72, 0x4d, + 0x4a, 0xe7, 0x1a, 0x9a, 0x05, 0x16, 0x83, 0x9b, 0x7f, 0x8b, 0xff, 0xa2, 0x8b, 0xd5, 0x1d, 0x0a, + 0xe5, 0x03, 0xfd, 0x97, 0x98, 0xb0, 0x8e, 0x81, 0x05, 0x46, 0x9d, 0x3e, 0xc6, 0x27, 0xc0, 0x43, + 0x3f, 0x13, 0xba, 0x02, 0x61, 0x2d, 0x1a, 0x12, 0x11, 0x3d, 0xf5, 0x2d, 0x75, 0x10, 0x49, 0x21, + 0x5f, 0x86, 0x4d, 0x69, 0x6f, 0x77, 0x22, 0x53, 0x1d, 0x6d, 0xbd, 0xad, 0x8b, 0xae, 0xbf, 0xcb, + 0x17, 0x43, 0x93, 0x7e, 0x07, 0xb6, 0x71, 0x10, 0x3b, 0xed, 0x81, 0x13, 0x8b, 0x44, 0x81, 0x4d, + 0x65, 0xd0, 0xed, 0x9b, 0x94, 0xca, 0x6c, 0x0f, 0x22, 0x41, 0x29, 0x68, 0xab, 0x79, 0xf7, 0xbd, + 0x03, 0x4f, 0x25, 0xd6, 0x98, 0x6e, 0xe8, 0x68, 0x4a, 0x14, 0xc8, 0x22, 0x8b, 0xf4, 0x37, 0x15, + 0x46, 0xae, 0xc2, 0xf2, 0xbb, 0x9e, 0x3b, 0xf4, 0x86, 0xfc, 0xa4, 0xe4, 0x53, 0x82, 0xa5, 0xc9, + 0x07, 0xe5, 0x5f, 0xa6, 0xc4, 0x35, 0x64, 0xa7, 0xdf, 0x1f, 0x8f, 0xc6, 0x43, 0x77, 0x10, 0x52, + 0x80, 0x90, 0x53, 0x78, 0x1a, 0x4f, 0xe9, 0x3b, 0x08, 0x5c, 0xdf, 0x1f, 0x0a, 0x4f, 0xfd, 0x43, + 0x61, 0xfd, 0x9a, 0xbb, 0xf3, 0x52, 0x58, 0x8e, 0xd0, 0x29, 0xb5, 0x2e, 0x13, 0x53, 0xa9, 0x59, + 0x2a, 0xb5, 0x3c, 0x67, 0x5d, 0x64, 0x65, 0xc6, 0xa8, 0x48, 0x39, 0xa1, 0xe2, 0x51, 0x0d, 0xc8, + 0x4e, 0xd0, 0x8a, 0x70, 0xa9, 0x72, 0xfb, 0xc8, 0x57, 0x60, 0xa9, 0xd3, 0x96, 0xe3, 0xb3, 0x45, + 0xef, 0xde, 0x66, 0x9b, 0x61, 0xc4, 0x06, 0x65, 0x94, 0xe7, 0xac, 0x6c, 0x87, 0xa7, 0xee, 0xac, + 0x84, 0x54, 0x45, 0xda, 0x8e, 0x90, 0x78, 0xe3, 0x6c, 0x64, 0x15, 0x52, 0xfe, 0x4e, 0x90, 0xea, + 0xb4, 0xe9, 0x6c, 0x1d, 0x49, 0x28, 0xb5, 0x16, 0xff, 0xa5, 0xfd, 0x1a, 0xdc, 0x3c, 0x6b, 0x1f, + 0xd1, 0x95, 0x36, 0xa5, 0xc3, 0x97, 0xac, 0x75, 0x37, 0xd6, 0x6f, 0x57, 0x41, 0x06, 0xd9, 0xec, + 0x88, 0x01, 0x17, 0x69, 0xad, 0x61, 0x47, 0xfb, 0xad, 0x34, 0xac, 0x86, 0x95, 0x63, 0xe4, 0x79, + 0xc8, 0xf8, 0xc5, 0xae, 0xfa, 0x8f, 0x38, 0x32, 0x11, 0x2d, 0xdc, 0x42, 0x22, 0x2a, 0x85, 0xe0, + 0x9b, 0xaf, 0x73, 0x2a, 0xbf, 0xb3, 0x58, 0xcb, 0x98, 0x28, 0xde, 0x57, 0xee, 0xc1, 0x2a, 0x9a, + 0xeb, 0xe0, 0xf1, 0x36, 0xee, 0x70, 0x95, 0xeb, 0x6c, 0xad, 0x79, 0xf6, 0xa3, 0x8f, 0xaf, 0xcc, + 0xa1, 0x82, 0x7c, 0x99, 0xf2, 0xd2, 0x23, 0x86, 0x66, 0x4a, 0xba, 0x8f, 0xcc, 0x74, 0xdd, 0x07, + 0x6f, 0xca, 0x14, 0xdd, 0xc7, 0xfc, 0x0c, 0xdd, 0x47, 0xc0, 0x29, 0xeb, 0x3e, 0x50, 0x03, 0xb6, + 0x38, 0x4d, 0x03, 0x16, 0xf0, 0x30, 0x0d, 0xd8, 0x35, 0xde, 0xdc, 0xa1, 0xfb, 0xc0, 0xc1, 0x7e, + 0xe0, 0xab, 0x1a, 0x1b, 0x62, 0xb9, 0x0f, 0xf0, 0x75, 0x7c, 0x67, 0x09, 0xc4, 0x93, 0xba, 0xf6, + 0x47, 0x4a, 0x44, 0x71, 0x20, 0x86, 0xe2, 0x3a, 0xac, 0x76, 0x4e, 0xe9, 0x8d, 0xc6, 0x6b, 0x4b, + 0xa2, 0xe9, 0x8a, 0xb5, 0x22, 0x52, 0x99, 0x78, 0xfa, 0x1c, 0xac, 0xf9, 0x64, 0x5c, 0x42, 0x43, + 0x57, 0x1b, 0xcb, 0xe7, 0xe6, 0xb8, 0x11, 0xcf, 0xc3, 0xba, 0x4f, 0xc8, 0x2f, 0x7f, 0x4c, 0x3a, + 0x5d, 0xb1, 0x54, 0x91, 0xc1, 0xe3, 0xfd, 0x8f, 0xb4, 0xe3, 0xa8, 0xa0, 0xf2, 0x39, 0xd5, 0x4a, + 0xfb, 0xfb, 0x74, 0xe8, 0x52, 0x25, 0x3e, 0xb3, 0x03, 0x39, 0x7a, 0x5a, 0xf2, 0x4e, 0xe2, 0xdb, + 0xca, 0xd5, 0x29, 0xdd, 0xcf, 0x8d, 0x12, 0x6c, 0xbb, 0x6e, 0xc1, 0x68, 0xd4, 0x17, 0x36, 0x0a, + 0x0e, 0x13, 0x08, 0x98, 0xa0, 0x8c, 0xd3, 0x4f, 0x14, 0xc7, 0xf6, 0x90, 0xfc, 0xec, 0xe2, 0x84, + 0x54, 0x4b, 0x67, 0x1f, 0x0a, 0x06, 0xfe, 0x2f, 0xf1, 0x81, 0x16, 0xa0, 0x0e, 0x62, 0x14, 0x2e, + 0x3c, 0x9d, 0x20, 0x6a, 0xc5, 0x0a, 0xc7, 0x5e, 0xc2, 0x92, 0xd5, 0x89, 0xf8, 0x57, 0x14, 0x6b, + 0xc0, 0x32, 0x5e, 0x69, 0x44, 0x81, 0x99, 0x04, 0x1d, 0x5a, 0xbc, 0xf1, 0x05, 0xb3, 0x6a, 0xe5, + 0x28, 0x9f, 0x28, 0xe6, 0x04, 0x9e, 0x96, 0x2f, 0x22, 0xe1, 0x4a, 0xce, 0x0b, 0x18, 0xcc, 0x99, + 0x3d, 0x10, 0xdc, 0x57, 0xb0, 0xaa, 0x17, 0xdc, 0x70, 0x02, 0x27, 0xd3, 0x4e, 0x60, 0x73, 0xfa, + 0x90, 0xcc, 0x08, 0xb1, 0x12, 0xc8, 0x4c, 0x29, 0x59, 0x66, 0x92, 0xaf, 0x25, 0xe9, 0xd0, 0xb5, + 0x44, 0xfb, 0x8b, 0x34, 0x3c, 0x7b, 0x86, 0xe1, 0x9a, 0xf1, 0xcd, 0xaf, 0x42, 0x8e, 0x69, 0xfe, + 0xd9, 0xf6, 0xc9, 0xac, 0x66, 0xfc, 0x40, 0xa9, 0xef, 0x8d, 0x5d, 0xbe, 0xd7, 0x51, 0xa9, 0x36, + 0xd8, 0xef, 0x60, 0xe4, 0xff, 0x4f, 0x7e, 0x05, 0xd6, 0xd8, 0x86, 0xc6, 0xec, 0x8a, 0x8e, 0x26, + 0xdd, 0x33, 0xec, 0x68, 0x5b, 0xc2, 0x09, 0x22, 0xc2, 0x8a, 0x9b, 0x1c, 0xee, 0x18, 0xb6, 0x9f, + 0x46, 0x9a, 0x90, 0x43, 0xb2, 0x23, 0xb7, 0xd3, 0x3d, 0x93, 0x35, 0xbe, 0x70, 0xb1, 0x90, 0xd9, + 0x98, 0x39, 0x24, 0x4d, 0x28, 0xe1, 0x6f, 0x72, 0x03, 0xd6, 0x7a, 0x93, 0x53, 0x7a, 0x93, 0x63, + 0x73, 0x81, 0x3f, 0xdf, 0xce, 0x5b, 0x2b, 0xbd, 0xc9, 0xa9, 0x3e, 0x18, 0xe0, 0x90, 0xe2, 0x3b, + 0xef, 0x3a, 0xa5, 0x63, 0xab, 0x56, 0x50, 0x2e, 0x20, 0x25, 0x2d, 0x80, 0xad, 0x5b, 0x4e, 0x7b, + 0x1e, 0x98, 0xd5, 0x0f, 0x0f, 0x31, 0xc3, 0x7e, 0x68, 0x3f, 0x4d, 0x09, 0x71, 0x7d, 0xfa, 0xbc, + 0xff, 0xc5, 0x10, 0x25, 0x0c, 0xd1, 0x4d, 0x50, 0x69, 0xd7, 0x07, 0x9b, 0x8a, 0x3f, 0x46, 0xab, + 0xbd, 0xc9, 0xa9, 0xdf, 0x77, 0x72, 0xc7, 0x2f, 0xc8, 0x1d, 0xff, 0xaa, 0x10, 0xe7, 0x13, 0xb7, + 0x87, 0xe9, 0x5d, 0xae, 0xfd, 0x67, 0x1a, 0x6e, 0x9c, 0x6d, 0x13, 0xf8, 0xc5, 0xb8, 0x25, 0x8c, + 0x5b, 0x44, 0xd3, 0x32, 0x1f, 0xd3, 0xb4, 0x24, 0xac, 0xbd, 0x85, 0xa4, 0xb5, 0x17, 0xd3, 0xeb, + 0x2c, 0x26, 0xe8, 0x75, 0x12, 0x17, 0x68, 0xf6, 0x11, 0x0b, 0x74, 0x49, 0x9e, 0x27, 0xff, 0xe6, + 0xdf, 0xbf, 0xc2, 0xa2, 0xfd, 0x3b, 0x70, 0x4e, 0x88, 0xf6, 0xec, 0xe4, 0x08, 0xd4, 0x75, 0xb9, + 0x3b, 0xb7, 0x92, 0x84, 0x7a, 0x24, 0x4b, 0x10, 0xbc, 0xd7, 0xb9, 0x38, 0x1f, 0xe4, 0xff, 0xff, + 0x11, 0xe4, 0xc9, 0x7d, 0xb8, 0x80, 0x00, 0xcd, 0x87, 0xb2, 0xa2, 0xd1, 0x19, 0x7a, 0x47, 0x7c, + 0x3e, 0x5c, 0x8d, 0x89, 0xbd, 0x9d, 0x43, 0xa9, 0x3a, 0x96, 0x77, 0x54, 0x9e, 0xb3, 0xce, 0x8f, + 0x12, 0xd2, 0xa3, 0x77, 0x84, 0xbf, 0x56, 0x40, 0x7b, 0x74, 0x7f, 0xe1, 0x3d, 0x3b, 0xda, 0xe1, + 0xf4, 0x9e, 0x2d, 0xf5, 0xde, 0xb3, 0xb0, 0x32, 0xf4, 0x8e, 0x86, 0xde, 0xe8, 0x24, 0x74, 0x81, + 0x5b, 0xe6, 0x89, 0xa2, 0x63, 0x04, 0x4c, 0xdc, 0x63, 0x09, 0xd9, 0x82, 0x49, 0x2b, 0xf9, 0x57, + 0xbf, 0xc4, 0x71, 0xa0, 0xb3, 0x49, 0xae, 0x20, 0xfb, 0x71, 0x2f, 0x93, 0x4d, 0xa9, 0x69, 0x8b, + 0x83, 0xd9, 0x1d, 0x75, 0xba, 0x9e, 0xf6, 0x37, 0x8a, 0x90, 0x08, 0x92, 0x3a, 0x8f, 0xbc, 0x23, + 0x59, 0xe3, 0xa5, 0x63, 0x62, 0x48, 0x12, 0x8b, 0x6c, 0xb8, 0xc4, 0xf1, 0xd5, 0x30, 0x21, 0x84, + 0xaf, 0x86, 0x29, 0x4f, 0x60, 0x52, 0xc4, 0x2f, 0xc0, 0x77, 0xc5, 0x93, 0x3e, 0xdd, 0xf3, 0xf6, + 0x6f, 0x93, 0x5b, 0xb0, 0xc8, 0x5e, 0xf1, 0x45, 0x75, 0xd7, 0x42, 0xd5, 0xdd, 0xbf, 0x6d, 0x89, + 0x7c, 0xed, 0x87, 0xbe, 0x1a, 0x3c, 0xd6, 0x88, 0xfd, 0xdb, 0xe4, 0xd5, 0xb3, 0x59, 0xd7, 0x65, + 0x85, 0x75, 0x9d, 0x6f, 0x59, 0xf7, 0x5a, 0xc8, 0xb2, 0xee, 0xda, 0xec, 0xde, 0xe2, 0x8f, 0x17, + 0x0c, 0x4f, 0x2c, 0xc0, 0x99, 0xf9, 0xa9, 0x02, 0x97, 0x67, 0x72, 0x90, 0x4b, 0x90, 0xd5, 0x1b, + 0x66, 0x33, 0x18, 0x5f, 0xba, 0x66, 0x44, 0x0a, 0xd9, 0x85, 0xa5, 0x1d, 0x77, 0xd4, 0x39, 0xa4, + 0xd3, 0x38, 0x51, 0x9b, 0x18, 0x2b, 0xd6, 0x27, 0x2f, 0xcf, 0x59, 0x01, 0x2f, 0x71, 0x60, 0x1d, + 0xd7, 0x42, 0x28, 0x76, 0x4b, 0x3a, 0x41, 0x6d, 0x10, 0x2b, 0x30, 0xc6, 0x46, 0xf7, 0x99, 0x58, + 0x62, 0x74, 0x09, 0xbe, 0x2f, 0x64, 0x91, 0xe9, 0x15, 0x7c, 0x0c, 0x60, 0xc4, 0x9b, 0x90, 0x6d, + 0x88, 0x67, 0x45, 0xc9, 0x1c, 0x55, 0x3c, 0x21, 0x5a, 0x7e, 0xae, 0xf6, 0x7b, 0x8a, 0xb8, 0xdb, + 0x3f, 0xba, 0x21, 0x52, 0xd8, 0x9b, 0xf6, 0xec, 0xb0, 0x37, 0xed, 0x4f, 0x19, 0xf6, 0x46, 0xfb, + 0x2b, 0x0e, 0x5b, 0x6c, 0xb6, 0x1b, 0x11, 0xc5, 0xd2, 0x93, 0x9a, 0x15, 0x1b, 0xa1, 0xd9, 0xf9, + 0xac, 0x14, 0x36, 0x2d, 0xfe, 0xad, 0xe9, 0xd6, 0xc5, 0xd2, 0x54, 0xfd, 0x93, 0x34, 0x5c, 0x9a, + 0xc5, 0x9e, 0x18, 0x98, 0x55, 0x79, 0xbc, 0xc0, 0xac, 0xb7, 0x20, 0xcb, 0xd2, 0x7c, 0x9b, 0x59, + 0xec, 0x70, 0xce, 0x4a, 0x3b, 0x5c, 0x64, 0x93, 0x67, 0x61, 0x41, 0x2f, 0xd8, 0x41, 0xac, 0x20, + 0x34, 0x6e, 0x73, 0x0f, 0x47, 0x68, 0x36, 0xc5, 0xb3, 0xc8, 0x37, 0xe3, 0xe1, 0xb1, 0x78, 0x90, + 0xa0, 0x2d, 0xa9, 0x43, 0x62, 0x88, 0xe2, 0x58, 0xdf, 0x00, 0x01, 0x9b, 0x83, 0xca, 0x5a, 0xf1, + 0x50, 0x5b, 0x1a, 0x2c, 0x34, 0x86, 0xde, 0xc8, 0x1b, 0xcb, 0x86, 0x67, 0x03, 0x4c, 0xb1, 0x78, + 0x0e, 0x37, 0x0b, 0x73, 0x1f, 0x32, 0x2f, 0xe0, 0x05, 0x19, 0x99, 0x01, 0xed, 0xc8, 0x68, 0xb2, + 0x25, 0x91, 0x50, 0x86, 0x8a, 0x3b, 0xe9, 0x1d, 0x9e, 0xb4, 0xac, 0x0a, 0x17, 0x35, 0x18, 0x43, + 0x17, 0x53, 0x69, 0x03, 0x47, 0x96, 0x44, 0xa2, 0x7d, 0x57, 0x81, 0xf3, 0x49, 0xed, 0x20, 0x97, + 0x20, 0xd3, 0x4b, 0x8c, 0x04, 0xd6, 0x63, 0xce, 0x8b, 0x39, 0xfa, 0xd7, 0x39, 0xea, 0x0f, 0x4f, + 0xdd, 0xb1, 0x6c, 0x9e, 0x27, 0x25, 0x5b, 0x40, 0x7f, 0x94, 0xf0, 0x7f, 0x72, 0x45, 0xec, 0xd1, + 0xe9, 0x58, 0xec, 0x30, 0xfc, 0xa3, 0xe9, 0x00, 0x66, 0xbb, 0x51, 0x1f, 0x30, 0x44, 0xeb, 0x97, + 0x21, 0x43, 0xab, 0x15, 0x99, 0xbd, 0x74, 0xfe, 0xe8, 0xd5, 0x0a, 0x27, 0x62, 0xb5, 0x1a, 0xb9, + 0xa7, 0x5d, 0x0b, 0x89, 0xb5, 0x03, 0x58, 0x0d, 0x53, 0x10, 0x23, 0x8c, 0x81, 0x98, 0xbb, 0xa3, + 0xf2, 0x92, 0x76, 0xfa, 0x7d, 0x66, 0x22, 0xbe, 0xf3, 0xf4, 0x3f, 0x7e, 0x7c, 0x05, 0xe8, 0x4f, + 0xc6, 0x93, 0x84, 0x91, 0xa8, 0x7d, 0x3f, 0x05, 0xe7, 0x03, 0xaf, 0x54, 0xb1, 0x86, 0x7e, 0x6e, + 0x5d, 0xa4, 0xf4, 0x90, 0x0b, 0x8f, 0x10, 0xb4, 0xe2, 0x0d, 0x9c, 0xe1, 0x39, 0xb0, 0x0b, 0x1b, + 0xd3, 0xe8, 0xc9, 0xf3, 0xb0, 0x84, 0x40, 0x26, 0x03, 0xf7, 0xd0, 0x93, 0xf7, 0xbe, 0x9e, 0x48, + 0xb4, 0x82, 0x7c, 0xed, 0xc7, 0x0a, 0x6c, 0x72, 0xc3, 0xe6, 0xaa, 0xdb, 0xe9, 0x8d, 0xbd, 0x9e, + 0xdb, 0x3b, 0xf4, 0x3e, 0x1b, 0x17, 0xbf, 0xdd, 0xd0, 0x3e, 0x76, 0x3d, 0x6c, 0xbf, 0x1e, 0xfb, + 0xda, 0xf4, 0xd6, 0x92, 0x5b, 0x08, 0xce, 0x73, 0xc8, 0x26, 0x6f, 0x86, 0xb9, 0x54, 0xf7, 0x68, + 0x82, 0xec, 0x52, 0x8d, 0x14, 0xda, 0xaf, 0xc3, 0xf6, 0xec, 0x0f, 0x90, 0x6f, 0xc0, 0x0a, 0x46, + 0x7b, 0x69, 0x0d, 0x8e, 0x87, 0x6e, 0xdb, 0x13, 0xaa, 0x30, 0xa1, 0x89, 0x94, 0xf3, 0x18, 0xd6, + 0x10, 0x77, 0xf1, 0x3d, 0xc6, 0x38, 0x32, 0x9c, 0x29, 0xe4, 0x3d, 0x20, 0x97, 0xa6, 0xfd, 0x86, + 0x02, 0x24, 0x5e, 0x06, 0xf9, 0x12, 0x2c, 0xb7, 0x9a, 0x05, 0x7b, 0xec, 0x0e, 0xc7, 0xe5, 0xfe, + 0x64, 0xc8, 0x81, 0x7e, 0x98, 0xc7, 0xe7, 0xf8, 0x90, 0x6e, 0x25, 0xc3, 0xb1, 0x73, 0xd2, 0x9f, + 0x0c, 0xad, 0x10, 0x1d, 0x86, 0x29, 0xf1, 0xbc, 0xf7, 0xda, 0xee, 0xc3, 0x70, 0x98, 0x12, 0x9e, + 0x16, 0x0a, 0x53, 0xc2, 0xd3, 0xb4, 0x0f, 0x15, 0xd8, 0x12, 0xc6, 0x47, 0xed, 0x84, 0xba, 0x14, + 0x10, 0xd7, 0x60, 0x28, 0x90, 0x25, 0x67, 0x89, 0xb4, 0xeb, 0x02, 0xfa, 0x03, 0x2b, 0x88, 0xb2, + 0x2d, 0xe3, 0x25, 0x5f, 0x85, 0x8c, 0x3d, 0xee, 0x0f, 0xce, 0x80, 0xfd, 0xa1, 0xfa, 0x23, 0x3a, + 0xee, 0x0f, 0xb0, 0x08, 0xe4, 0xd4, 0x3c, 0x38, 0x2f, 0x57, 0x4e, 0xd4, 0x98, 0x54, 0x61, 0x91, + 0x83, 0x3c, 0x45, 0xde, 0x19, 0x67, 0xb4, 0x69, 0x67, 0x4d, 0x00, 0x8c, 0x70, 0x64, 0x43, 0x4b, + 0x94, 0xa1, 0xfd, 0xbe, 0x02, 0x39, 0x2a, 0x6d, 0xe0, 0x2d, 0xee, 0x49, 0xa7, 0x74, 0x58, 0x70, + 0x14, 0xcf, 0xd4, 0x7e, 0xf1, 0x67, 0x3a, 0x8d, 0x5f, 0x81, 0xb5, 0x08, 0x03, 0xd1, 0xd0, 0xb5, + 0xbc, 0xdb, 0x39, 0x74, 0x59, 0xd4, 0x03, 0xf6, 0xc6, 0x1b, 0x4a, 0xd3, 0x7e, 0x47, 0x81, 0xf3, + 0xf4, 0xce, 0x6f, 0xa2, 0xba, 0xd7, 0x9a, 0x74, 0xc5, 0x7a, 0xa7, 0x12, 0x94, 0xb0, 0x62, 0x63, + 0x6e, 0xaf, 0x4c, 0x82, 0xe2, 0x69, 0x96, 0x9f, 0x4b, 0xca, 0x90, 0xe5, 0xe7, 0xcb, 0x88, 0x03, + 0x12, 0x6e, 0x4b, 0xca, 0x84, 0xa0, 0x60, 0x4e, 0x44, 0x5b, 0x82, 0x5b, 0x18, 0xe7, 0xb1, 0x7c, + 0x6e, 0xed, 0xbf, 0x14, 0xb8, 0x38, 0x85, 0x87, 0xbc, 0x01, 0xf3, 0xe8, 0x92, 0xc3, 0x47, 0xef, + 0xd2, 0x94, 0x4f, 0x8c, 0x0f, 0x4f, 0xf6, 0x6f, 0xb3, 0x83, 0xe8, 0x94, 0xfe, 0xb0, 0x18, 0x17, + 0x79, 0x07, 0x96, 0xf4, 0x76, 0x9b, 0x5f, 0x67, 0x52, 0xa1, 0xeb, 0xcc, 0x94, 0x2f, 0xbe, 0xe8, + 0xd3, 0xb3, 0xeb, 0x0c, 0x33, 0x0e, 0x6f, 0xb7, 0x1d, 0xee, 0x6e, 0x14, 0x94, 0xb7, 0xf9, 0xcb, + 0xb0, 0x1a, 0x26, 0x7e, 0x2c, 0x0f, 0x89, 0x1f, 0x2a, 0xa0, 0x86, 0xeb, 0xf0, 0xf9, 0x40, 0xa3, + 0x24, 0x0d, 0xf3, 0x23, 0x26, 0xd5, 0x1f, 0xa6, 0xe0, 0xa9, 0xc4, 0x1e, 0x26, 0x2f, 0xc0, 0x82, + 0x3e, 0x18, 0x98, 0x45, 0x3e, 0xab, 0xb8, 0x84, 0x84, 0x5a, 0xe2, 0xd0, 0x6d, 0x8f, 0x11, 0x91, + 0x97, 0x21, 0x8b, 0x33, 0x93, 0x32, 0xa4, 0x02, 0x68, 0x40, 0xa6, 0x44, 0x89, 0x40, 0x03, 0x0a, + 0x42, 0x52, 0x82, 0x55, 0x8e, 0x92, 0x60, 0x79, 0xc7, 0xde, 0xb7, 0x7d, 0x8c, 0x6a, 0x84, 0xd1, + 0x16, 0xaa, 0x67, 0x67, 0xc8, 0xf2, 0x64, 0x9c, 0x80, 0x30, 0x17, 0xa9, 0x80, 0x8a, 0x65, 0xca, + 0x25, 0x31, 0x7c, 0x42, 0xc4, 0xad, 0x60, 0x95, 0x98, 0x52, 0x56, 0x8c, 0xd3, 0x1f, 0x2e, 0x7d, + 0x34, 0xea, 0x1c, 0xf7, 0x4e, 0xbd, 0xde, 0xf8, 0xf3, 0x1b, 0xae, 0xe0, 0x1b, 0x67, 0x1a, 0xae, + 0x3f, 0xce, 0xb0, 0xc5, 0x1c, 0x65, 0xa3, 0x12, 0x8d, 0x04, 0x49, 0x8b, 0x12, 0x0d, 0x06, 0xf1, + 0x66, 0x38, 0x00, 0x45, 0x58, 0x64, 0xf8, 0x0c, 0x62, 0x65, 0x5c, 0x4e, 0xac, 0x02, 0xa3, 0xd9, + 0xbf, 0xcd, 0xc4, 0x17, 0xe6, 0x1b, 0x34, 0xb2, 0x04, 0x2b, 0xd9, 0x87, 0x5c, 0xa1, 0xeb, 0xb9, + 0xbd, 0xc9, 0xa0, 0x79, 0xb6, 0xd7, 0xc3, 0x0d, 0xde, 0x96, 0xe5, 0x43, 0xc6, 0x86, 0xaf, 0x8e, + 0xb8, 0x93, 0xcb, 0x05, 0x91, 0xa6, 0xef, 0x2e, 0xc0, 0x42, 0xaf, 0x7f, 0x71, 0x46, 0xff, 0x44, + 0x13, 0x91, 0x2f, 0xec, 0x0b, 0xc3, 0xfd, 0x09, 0x1c, 0x58, 0xad, 0xb8, 0xa3, 0x71, 0x73, 0xe8, + 0xf6, 0x46, 0x88, 0xeb, 0x76, 0x06, 0xdc, 0x9b, 0x2d, 0x11, 0x33, 0x14, 0x75, 0x8c, 0x63, 0x9f, + 0x95, 0x69, 0x30, 0xc3, 0xc5, 0x51, 0x79, 0xa9, 0xd4, 0xe9, 0xb9, 0xdd, 0xce, 0x07, 0xc2, 0xab, + 0x8a, 0xc9, 0x4b, 0x47, 0x22, 0xd1, 0x0a, 0xf2, 0xb5, 0xaf, 0xc7, 0xc6, 0x8d, 0xd5, 0x32, 0x07, + 0x8b, 0xdc, 0xe7, 0x96, 0xf9, 0xa0, 0x36, 0x8c, 0x5a, 0xd1, 0xac, 0xed, 0xaa, 0x0a, 0x59, 0x05, + 0x68, 0x58, 0xf5, 0x82, 0x61, 0xdb, 0xf4, 0x77, 0x8a, 0xfe, 0xe6, 0x0e, 0xaa, 0xa5, 0x56, 0x45, + 0x4d, 0x4b, 0x3e, 0xaa, 0x19, 0xed, 0x47, 0x0a, 0x5c, 0x48, 0x1e, 0x4a, 0xd2, 0x04, 0xf4, 0x52, + 0xe6, 0xef, 0xc8, 0x5f, 0x9a, 0x39, 0xee, 0x89, 0xc9, 0x51, 0x6f, 0xe7, 0x31, 0xf3, 0xa2, 0x4d, + 0x89, 0xc7, 0xa2, 0x20, 0x50, 0x7d, 0xa7, 0xad, 0x15, 0x60, 0x63, 0x5a, 0x19, 0xe1, 0xa6, 0xae, + 0x41, 0x4e, 0x6f, 0x34, 0x2a, 0x66, 0x41, 0x6f, 0x9a, 0xf5, 0x9a, 0xaa, 0x90, 0x25, 0x98, 0xdf, + 0xb5, 0xea, 0xad, 0x86, 0x9a, 0xd2, 0x7e, 0xa0, 0xc0, 0x8a, 0x19, 0x58, 0x99, 0x3c, 0xe9, 0xe2, + 0x7b, 0x3d, 0xb4, 0xf8, 0x36, 0x7c, 0x7f, 0x7e, 0xff, 0x03, 0x67, 0x5a, 0x79, 0xff, 0xa0, 0xc0, + 0x7a, 0x8c, 0x87, 0xd8, 0xb0, 0xa8, 0x1f, 0xd8, 0x75, 0xb3, 0x58, 0xe0, 0x35, 0xbb, 0x12, 0x18, + 0xb2, 0x60, 0xc8, 0x96, 0xd8, 0x57, 0x98, 0x0f, 0xdc, 0x83, 0x91, 0xd3, 0xef, 0xb4, 0xa5, 0x70, + 0x8b, 0xe5, 0x39, 0x4b, 0x94, 0x84, 0x27, 0xd9, 0x07, 0x93, 0xa1, 0x87, 0xc5, 0xa6, 0x42, 0x8a, + 0x50, 0x3f, 0x3d, 0x5e, 0x30, 0xda, 0x47, 0xbb, 0x34, 0x3f, 0x5e, 0x74, 0x50, 0xde, 0xce, 0x0a, + 0xe4, 0xf8, 0xad, 0x05, 0x2f, 0x04, 0xdf, 0x53, 0x60, 0x63, 0x5a, 0x5d, 0xe9, 0x45, 0x28, 0xec, + 0x10, 0x7b, 0xc1, 0x87, 0x60, 0x0f, 0x7b, 0xc2, 0x0a, 0x32, 0xf2, 0x26, 0xe4, 0xcc, 0xd1, 0x68, + 0xe2, 0x0d, 0xed, 0x97, 0x5b, 0x96, 0xc9, 0x27, 0xc8, 0xe5, 0x7f, 0xff, 0xf8, 0xca, 0x45, 0xb4, + 0x62, 0x1e, 0x3a, 0xa3, 0x97, 0x9d, 0xc9, 0xb0, 0x13, 0x82, 0xab, 0x96, 0x39, 0xb4, 0xef, 0x28, + 0xb0, 0x39, 0xbd, 0x91, 0xf4, 0x94, 0x69, 0x52, 0xd9, 0x3c, 0xf0, 0x29, 0xc4, 0x53, 0x06, 0xe5, + 0xf5, 0x88, 0x53, 0xa1, 0x4f, 0x48, 0x99, 0xfc, 0x50, 0xc6, 0xa9, 0x58, 0xfc, 0xd2, 0x30, 0x93, + 0x20, 0xd4, 0xfe, 0x23, 0x05, 0x17, 0xe8, 0x04, 0xea, 0x7a, 0xa3, 0x91, 0x3e, 0x19, 0x9f, 0x78, + 0xbd, 0x31, 0x17, 0xa9, 0xc8, 0xab, 0xb0, 0x70, 0xf2, 0x78, 0xea, 0x43, 0x46, 0x4e, 0x08, 0xe0, + 0xa6, 0x2c, 0xec, 0xab, 0xe9, 0xff, 0xe4, 0x2a, 0xc8, 0x11, 0x63, 0xd3, 0x88, 0x59, 0x97, 0xda, + 0x50, 0xac, 0xa5, 0x81, 0x1f, 0xdc, 0xf1, 0x35, 0x98, 0x47, 0x95, 0x01, 0xdf, 0x1e, 0x85, 0x58, + 0x9b, 0x5c, 0x3b, 0x54, 0x28, 0x58, 0x8c, 0x81, 0xbc, 0x04, 0x10, 0xc0, 0x7d, 0xf3, 0xfd, 0x4f, + 0x5c, 0xa5, 0x7d, 0xc4, 0x6f, 0x6b, 0xe9, 0xf4, 0xc8, 0xe5, 0x18, 0xda, 0x79, 0x58, 0x17, 0xdd, + 0x32, 0x10, 0x50, 0x57, 0xfc, 0x65, 0x6b, 0x8d, 0x65, 0x98, 0x03, 0x01, 0x77, 0x75, 0x2d, 0x16, + 0xf5, 0x12, 0x11, 0x2f, 0x23, 0xa1, 0x2d, 0xaf, 0xc5, 0x42, 0x5b, 0x66, 0x19, 0x95, 0x1c, 0xbf, + 0x52, 0xfb, 0xd7, 0x14, 0x2c, 0x1d, 0x50, 0xc1, 0x03, 0xaf, 0xd3, 0xb3, 0xaf, 0xe7, 0x77, 0x20, + 0x57, 0xe9, 0xbb, 0xfc, 0x09, 0x81, 0x9b, 0x25, 0x33, 0x47, 0xbd, 0x6e, 0xdf, 0x15, 0xaf, 0x11, + 0x23, 0x4b, 0x26, 0x7a, 0x84, 0x93, 0xe1, 0x3d, 0x58, 0x60, 0x4f, 0x3a, 0x5c, 0x53, 0x24, 0x44, + 0x4f, 0xbf, 0x46, 0x2f, 0xb2, 0x6c, 0x49, 0xeb, 0xcd, 0x9e, 0x85, 0x64, 0x39, 0x88, 0x03, 0xf7, + 0x49, 0xca, 0x83, 0xf9, 0xb3, 0x29, 0x0f, 0x24, 0x80, 0xa2, 0x85, 0xb3, 0x00, 0x14, 0x6d, 0xde, + 0x85, 0x9c, 0x54, 0x9f, 0xc7, 0x92, 0x44, 0x7f, 0x33, 0x05, 0x2b, 0xd8, 0x2a, 0xdf, 0xbe, 0xe3, + 0xe7, 0x53, 0x15, 0xf2, 0x7a, 0x48, 0x15, 0xb2, 0x21, 0x8f, 0x17, 0x6b, 0xd9, 0x0c, 0x1d, 0xc8, + 0x3d, 0x58, 0x8f, 0x11, 0x92, 0x57, 0x60, 0x9e, 0x56, 0x5f, 0x5c, 0x1d, 0xd5, 0xe8, 0x0c, 0x08, + 0xc0, 0x2c, 0x69, 0xc3, 0x47, 0x16, 0xa3, 0xd6, 0xfe, 0x5b, 0x81, 0x65, 0x8e, 0x25, 0xdf, 0x3b, + 0xea, 0x3f, 0xb2, 0x3b, 0x6f, 0x44, 0xbb, 0x93, 0xb9, 0xcc, 0xf3, 0xee, 0xfc, 0xdf, 0xee, 0xc4, + 0xbb, 0xa1, 0x4e, 0xbc, 0xe8, 0x43, 0x5b, 0x89, 0xe6, 0xcc, 0xe8, 0xc3, 0xbf, 0x45, 0xb0, 0xc7, + 0x30, 0x21, 0xf9, 0x26, 0x2c, 0xd5, 0xbc, 0x07, 0xa1, 0x1b, 0xd8, 0x8d, 0x29, 0x85, 0xbe, 0xe8, + 0x13, 0xb2, 0x35, 0x85, 0x87, 0x57, 0xcf, 0x7b, 0xe0, 0xc4, 0x5e, 0x93, 0x82, 0x22, 0xe9, 0x25, + 0x2c, 0xcc, 0xf6, 0x38, 0x53, 0x9f, 0xfb, 0x48, 0x21, 0x0a, 0xc4, 0x77, 0xd3, 0x00, 0x81, 0x7b, + 0x09, 0x5d, 0x80, 0xa1, 0x87, 0x74, 0xa1, 0xbc, 0xc6, 0x24, 0x79, 0x8e, 0x8b, 0xf7, 0xf5, 0x1b, + 0x5c, 0xc9, 0x9a, 0x9a, 0x0e, 0x3d, 0x86, 0xea, 0xd6, 0x02, 0xf7, 0x67, 0x68, 0x7b, 0x5d, 0x97, + 0xed, 0xed, 0xe9, 0x9d, 0x6b, 0x88, 0x34, 0xe9, 0xa7, 0x4e, 0x09, 0x0a, 0x8a, 0x5e, 0x0f, 0x45, + 0x4a, 0x10, 0x73, 0xd9, 0xca, 0x3c, 0x9e, 0xcb, 0x56, 0x03, 0x96, 0x3a, 0xbd, 0xf7, 0xbd, 0xde, + 0xb8, 0x3f, 0x7c, 0x88, 0x9a, 0xe5, 0x40, 0x65, 0x45, 0xbb, 0xc0, 0x14, 0x79, 0x6c, 0x1c, 0xf0, + 0x60, 0xf4, 0xe9, 0xe5, 0x61, 0xf0, 0x13, 0x7d, 0x97, 0xb3, 0x79, 0x75, 0xe1, 0x5e, 0x26, 0xbb, + 0xa0, 0x2e, 0xde, 0xcb, 0x64, 0xb3, 0xea, 0xd2, 0xbd, 0x4c, 0x76, 0x49, 0x05, 0x4b, 0x7a, 0xab, + 0xf1, 0xdf, 0x62, 0xa4, 0xe7, 0x93, 0xf0, 0xd3, 0x88, 0xf6, 0xb3, 0x14, 0x90, 0x78, 0x35, 0xc8, + 0xeb, 0x90, 0x63, 0x1b, 0xac, 0x33, 0x1c, 0x7d, 0x8b, 0x5b, 0xd0, 0x32, 0x2c, 0x0d, 0x29, 0x59, + 0xc6, 0xd2, 0x60, 0xc9, 0xd6, 0xe8, 0x5b, 0x5d, 0xf2, 0x0d, 0x38, 0x87, 0xdd, 0x3b, 0xf0, 0x86, + 0x9d, 0x7e, 0xdb, 0x41, 0xe0, 0x43, 0xb7, 0xcb, 0x03, 0x78, 0xbd, 0x80, 0x91, 0x26, 0xe3, 0xd9, + 0x53, 0x86, 0x01, 0xbd, 0x48, 0x1a, 0x48, 0xd9, 0x60, 0x84, 0xa4, 0x09, 0xaa, 0xcc, 0x7f, 0x34, + 0xe9, 0x76, 0xf9, 0xc8, 0xe6, 0xe9, 0xa5, 0x35, 0x9a, 0x37, 0xa5, 0xe0, 0xd5, 0xa0, 0xe0, 0xd2, + 0xa4, 0xdb, 0x25, 0xaf, 0x02, 0xf4, 0x7b, 0xce, 0x69, 0x67, 0x34, 0x62, 0xef, 0x15, 0xbe, 0xc3, + 0x5b, 0x90, 0x2a, 0x0f, 0x46, 0xbf, 0x57, 0x65, 0x89, 0xe4, 0x97, 0x00, 0x5d, 0x70, 0xd1, 0x37, + 0x9d, 0x59, 0xa8, 0x70, 0x48, 0x7e, 0x91, 0x18, 0xf6, 0xaf, 0x3b, 0xf6, 0xec, 0xce, 0x07, 0xc2, + 0x7a, 0xf9, 0x6d, 0x58, 0xe7, 0xb6, 0xa1, 0x07, 0x9d, 0xf1, 0x09, 0x97, 0x96, 0x9f, 0x44, 0xd4, + 0x96, 0xc4, 0xe5, 0x7f, 0xca, 0x00, 0xe8, 0x07, 0xb6, 0x80, 0x7d, 0xb9, 0x05, 0xf3, 0xf4, 0x0e, + 0x20, 0x74, 0x09, 0xa8, 0x89, 0xc5, 0x72, 0x65, 0x4d, 0x2c, 0x52, 0xd0, 0xd5, 0x68, 0xa1, 0x05, + 0xb9, 0xd0, 0x23, 0xe0, 0x6a, 0x64, 0x46, 0xe5, 0x21, 0xd8, 0x4d, 0x4e, 0x45, 0x2a, 0x00, 0x01, + 0x10, 0x0b, 0xbf, 0x95, 0xae, 0x07, 0x88, 0x06, 0x3c, 0x83, 0x43, 0x7f, 0x07, 0x60, 0x2e, 0xf2, + 0xf4, 0x09, 0xc8, 0xc8, 0x1e, 0x64, 0x9a, 0xae, 0xef, 0xce, 0x35, 0x05, 0x9e, 0xe6, 0x19, 0x1e, + 0x60, 0x2d, 0x80, 0xa8, 0x59, 0x1d, 0xbb, 0xa1, 0x38, 0x94, 0x58, 0x08, 0x31, 0x60, 0x81, 0x07, + 0xcf, 0x9d, 0x02, 0x6b, 0xc6, 0x63, 0xe7, 0x72, 0x30, 0x53, 0x4c, 0x94, 0x65, 0x0a, 0x1e, 0x26, + 0xf7, 0x0e, 0xa4, 0x6d, 0xbb, 0xca, 0x9d, 0xb2, 0x57, 0x82, 0x1b, 0x86, 0x6d, 0x57, 0x45, 0x64, + 0xf8, 0x53, 0x89, 0x8d, 0x12, 0x93, 0x2f, 0x43, 0x4e, 0x12, 0x9f, 0x39, 0x9c, 0x01, 0xf6, 0x81, + 0x64, 0xc0, 0x2f, 0x6f, 0x1a, 0x12, 0x35, 0xa9, 0x80, 0xba, 0x37, 0x79, 0xd7, 0xd3, 0x07, 0x03, + 0xf4, 0xa4, 0x79, 0xdf, 0x1b, 0x32, 0xb1, 0x2d, 0x1b, 0xe0, 0x80, 0xa2, 0x23, 0x52, 0x5b, 0xe4, + 0xca, 0xfa, 0x94, 0x28, 0x27, 0x69, 0xc0, 0xba, 0xed, 0x8d, 0x27, 0x03, 0x66, 0x73, 0x51, 0xea, + 0x0f, 0xe9, 0x85, 0x82, 0x81, 0x1f, 0x20, 0x64, 0xe2, 0x88, 0x66, 0x0a, 0x43, 0x97, 0xa3, 0xfe, + 0x30, 0x72, 0xb9, 0x88, 0x33, 0x6b, 0x9e, 0x3c, 0xe4, 0xf4, 0x54, 0x0d, 0x5f, 0x53, 0xf0, 0x54, + 0x15, 0xd7, 0x94, 0xe0, 0x72, 0xf2, 0x52, 0x02, 0x40, 0x0f, 0x3e, 0x7e, 0x49, 0x00, 0x3d, 0x21, + 0x58, 0x9e, 0x0f, 0x33, 0x12, 0x46, 0x1c, 0x1f, 0x8b, 0x37, 0x00, 0xee, 0xf5, 0x3b, 0xbd, 0xaa, + 0x37, 0x3e, 0xe9, 0xb7, 0x25, 0x9c, 0xa0, 0xdc, 0xaf, 0xf6, 0x3b, 0x3d, 0xe7, 0x14, 0x93, 0x7f, + 0xf6, 0xf1, 0x15, 0x89, 0xc8, 0x92, 0xfe, 0x27, 0x5f, 0x80, 0x25, 0xfa, 0xab, 0x19, 0x58, 0x8e, + 0x30, 0xb5, 0x23, 0x72, 0x33, 0x24, 0xf5, 0x80, 0x80, 0xdc, 0xc5, 0xd8, 0x01, 0x9d, 0xc1, 0x58, + 0x12, 0x5e, 0x45, 0xa0, 0x80, 0xce, 0x60, 0x1c, 0x85, 0xfd, 0x94, 0x88, 0x49, 0xd9, 0xaf, 0xba, + 0x08, 0xf7, 0xc1, 0x43, 0x14, 0xa0, 0x6e, 0x8d, 0xcf, 0x35, 0x47, 0xe0, 0x0d, 0xca, 0x81, 0x19, + 0x23, 0x6c, 0x58, 0x09, 0xbb, 0x5c, 0x64, 0x8f, 0x21, 0x5c, 0xa8, 0x15, 0x91, 0xed, 0xdb, 0xce, + 0x21, 0x26, 0x87, 0x2a, 0xe1, 0x13, 0x93, 0x1d, 0x58, 0x63, 0x32, 0xbe, 0x1f, 0x36, 0x8c, 0x8b, + 0xb8, 0xb8, 0xb7, 0x05, 0x71, 0xc5, 0xe4, 0xcf, 0x47, 0x18, 0x48, 0x09, 0xe6, 0xf1, 0x42, 0xc8, + 0x2d, 0xbf, 0xb7, 0xe4, 0x9b, 0x70, 0x74, 0x1d, 0xe1, 0xbe, 0x82, 0x77, 0x60, 0x79, 0x5f, 0x41, + 0x52, 0xf2, 0x35, 0x00, 0xa3, 0x37, 0xec, 0x77, 0xbb, 0x88, 0x88, 0x99, 0xc5, 0xab, 0xd4, 0xe5, + 0xf0, 0x7a, 0xc4, 0x52, 0x02, 0x22, 0x8e, 0xde, 0x84, 0xbf, 0x9d, 0x08, 0x6e, 0xa6, 0x54, 0x96, + 0x66, 0xc2, 0x02, 0x5b, 0x8c, 0x88, 0x2e, 0xcb, 0xf1, 0xf2, 0x25, 0x6c, 0x52, 0x86, 0x2e, 0xcb, + 0xd3, 0xe3, 0xe8, 0xb2, 0x12, 0x83, 0xb6, 0x07, 0xe7, 0x93, 0x1a, 0x16, 0xba, 0xc2, 0x2a, 0x67, + 0xbd, 0xc2, 0xfe, 0x79, 0x1a, 0x96, 0xb1, 0x34, 0xb1, 0x0b, 0xeb, 0xb0, 0x62, 0x4f, 0xde, 0xf5, + 0xa1, 0x57, 0xc4, 0x6e, 0x8c, 0xf5, 0x1b, 0xc9, 0x19, 0xf2, 0x33, 0x55, 0x88, 0x83, 0x18, 0xb0, + 0x2a, 0x4e, 0x82, 0x5d, 0x61, 0x4d, 0xee, 0x03, 0xbb, 0x0a, 0xf8, 0xb0, 0x78, 0xd8, 0xc4, 0x08, + 0x53, 0x70, 0x1e, 0xa4, 0x1f, 0xe7, 0x3c, 0xc8, 0x9c, 0xe9, 0x3c, 0x78, 0x07, 0x96, 0xc5, 0xd7, + 0x70, 0x27, 0x9f, 0x7f, 0xb2, 0x9d, 0x3c, 0x54, 0x18, 0xa9, 0xf8, 0x3b, 0xfa, 0xc2, 0xcc, 0x1d, + 0x1d, 0xdf, 0xfe, 0xc4, 0x2a, 0x8b, 0x45, 0x42, 0xe7, 0x65, 0x60, 0x5c, 0xb1, 0xdd, 0x42, 0xe3, + 0x53, 0x9c, 0x92, 0xaf, 0xc0, 0x52, 0xa5, 0x2f, 0x9e, 0x7d, 0x24, 0x7d, 0x7b, 0x57, 0x24, 0xca, + 0xe2, 0x82, 0x4f, 0xe9, 0x9f, 0x6e, 0xe9, 0xcf, 0xe2, 0x74, 0xbb, 0x0b, 0xc0, 0xdd, 0x14, 0x82, + 0x78, 0x40, 0xb8, 0x64, 0x84, 0x93, 0x7b, 0x58, 0xed, 0x2f, 0x11, 0xd3, 0xdd, 0x89, 0x5b, 0x94, + 0xe8, 0x87, 0x87, 0xfd, 0x49, 0x6f, 0x1c, 0x0a, 0xa0, 0x29, 0x9c, 0xb2, 0x5c, 0x9e, 0x27, 0x6f, + 0x0f, 0x11, 0xb6, 0xcf, 0x76, 0x40, 0xc8, 0x5b, 0xbe, 0x41, 0xdc, 0xe2, 0xac, 0x1e, 0xd2, 0x62, + 0x3d, 0x34, 0xd5, 0x0c, 0x4e, 0xfb, 0x91, 0x22, 0xa3, 0x6a, 0x7f, 0x8a, 0xa1, 0x7e, 0x0d, 0xc0, + 0x7f, 0x77, 0x17, 0x63, 0xcd, 0xee, 0x4b, 0x7e, 0xaa, 0xdc, 0xcb, 0x01, 0xad, 0xd4, 0x9a, 0xf4, + 0x67, 0xd5, 0x9a, 0x26, 0xe4, 0xea, 0xef, 0x8d, 0xdd, 0xc0, 0x50, 0x03, 0x6c, 0x5f, 0x92, 0xc5, + 0x9d, 0x29, 0xbd, 0x73, 0x1d, 0xcf, 0x86, 0x40, 0x0e, 0x9e, 0x22, 0x02, 0x4b, 0x8c, 0xda, 0x5b, + 0xb0, 0x26, 0x3b, 0x92, 0x3e, 0xec, 0x1d, 0x92, 0xaf, 0x30, 0x8c, 0x3f, 0x25, 0x74, 0x63, 0x91, + 0x88, 0xe8, 0x8e, 0xfb, 0xb0, 0x77, 0xc8, 0xe4, 0x1f, 0xf7, 0x81, 0x5c, 0x57, 0xbc, 0xe3, 0xfd, + 0x44, 0x01, 0x12, 0x27, 0x97, 0x77, 0x13, 0xe5, 0xff, 0x40, 0xba, 0x8c, 0x48, 0x65, 0x99, 0xc7, + 0x91, 0xca, 0xf2, 0x7f, 0xa0, 0xc0, 0x9a, 0xa9, 0x57, 0x39, 0x04, 0x36, 0x7b, 0x3f, 0xb8, 0x0a, + 0x97, 0x4d, 0xbd, 0xea, 0x34, 0xea, 0x15, 0xb3, 0x70, 0xdf, 0x49, 0x44, 0xb6, 0xbc, 0x0c, 0x4f, + 0xc7, 0x49, 0x82, 0x77, 0x86, 0x4b, 0xb0, 0x11, 0xcf, 0x16, 0xe8, 0x97, 0xc9, 0xcc, 0x02, 0x28, + 0x33, 0x9d, 0x7f, 0x13, 0xd6, 0x04, 0xd2, 0x63, 0xb3, 0x62, 0x23, 0x96, 0xf4, 0x1a, 0xe4, 0xf6, + 0x0d, 0xcb, 0x2c, 0xdd, 0x77, 0x4a, 0xad, 0x4a, 0x45, 0x9d, 0x23, 0x2b, 0xb0, 0xc4, 0x13, 0x0a, + 0xba, 0xaa, 0x90, 0x65, 0xc8, 0x9a, 0x35, 0xdb, 0x28, 0xb4, 0x2c, 0x43, 0x4d, 0xe5, 0xdf, 0x84, + 0xd5, 0xc6, 0xb0, 0xf3, 0xbe, 0x3b, 0xf6, 0xf6, 0xbc, 0x87, 0xf8, 0x4c, 0xb0, 0x08, 0x69, 0x4b, + 0x3f, 0x50, 0xe7, 0x08, 0xc0, 0x42, 0x63, 0xaf, 0x60, 0xdf, 0xbe, 0xad, 0x2a, 0x24, 0x07, 0x8b, + 0xbb, 0x85, 0x86, 0xb3, 0x57, 0xb5, 0xd5, 0x14, 0xfd, 0xa1, 0x1f, 0xd8, 0xf8, 0x23, 0x9d, 0xff, + 0x22, 0xac, 0xa3, 0xac, 0x50, 0xe9, 0x8c, 0xc6, 0x5e, 0xcf, 0x1b, 0x62, 0x1d, 0x96, 0x21, 0x6b, + 0x7b, 0x74, 0x91, 0x8f, 0x3d, 0x56, 0x81, 0xea, 0xa4, 0x3b, 0xee, 0x0c, 0xba, 0xde, 0xb7, 0x55, + 0x25, 0x7f, 0x17, 0xd6, 0xac, 0xfe, 0x64, 0xdc, 0xe9, 0x1d, 0xdb, 0x63, 0x4a, 0x71, 0xfc, 0x90, + 0x3c, 0x05, 0xeb, 0xad, 0x9a, 0x5e, 0xdd, 0x31, 0x77, 0x5b, 0xf5, 0x96, 0xed, 0x54, 0xf5, 0x66, + 0xa1, 0xcc, 0x1e, 0x29, 0xaa, 0x75, 0xbb, 0xe9, 0x58, 0x46, 0xc1, 0xa8, 0x35, 0x55, 0x25, 0xff, + 0x7d, 0x54, 0x7b, 0x1c, 0xf6, 0x7b, 0xed, 0x92, 0x8b, 0xb1, 0xc5, 0x69, 0x85, 0x35, 0xd8, 0xb6, + 0x8d, 0x42, 0xbd, 0x56, 0x74, 0x4a, 0x7a, 0xa1, 0x59, 0xb7, 0x92, 0xa0, 0x55, 0x37, 0xe1, 0x42, + 0x02, 0x4d, 0xbd, 0xd9, 0x50, 0x15, 0x72, 0x05, 0xb6, 0x12, 0xf2, 0x0e, 0x8c, 0x1d, 0xbd, 0xd5, + 0x2c, 0xd7, 0xd4, 0xd4, 0x14, 0x66, 0xdb, 0xae, 0xab, 0xe9, 0xfc, 0xef, 0x2a, 0xb0, 0xda, 0x1a, + 0x71, 0x0b, 0xe1, 0x16, 0xfa, 0xf9, 0x3d, 0x03, 0x97, 0x5a, 0xb6, 0x61, 0x39, 0xcd, 0xfa, 0x9e, + 0x51, 0x73, 0x5a, 0xb6, 0xbe, 0x1b, 0xad, 0xcd, 0x15, 0xd8, 0x92, 0x28, 0x2c, 0xa3, 0x50, 0xdf, + 0x37, 0x2c, 0xa7, 0xa1, 0xdb, 0xf6, 0x41, 0xdd, 0x2a, 0xaa, 0x0a, 0xfd, 0x62, 0x02, 0x41, 0xb5, + 0xa4, 0xb3, 0xda, 0x84, 0xf2, 0x6a, 0xc6, 0x81, 0x5e, 0x71, 0x76, 0xea, 0x4d, 0x35, 0x9d, 0xaf, + 0xd2, 0xa3, 0x17, 0x01, 0x0e, 0x99, 0x5d, 0x5b, 0x16, 0x32, 0xb5, 0x7a, 0xcd, 0x88, 0x3e, 0x6d, + 0x2d, 0x43, 0x56, 0x6f, 0x34, 0xac, 0xfa, 0x3e, 0x4e, 0x31, 0x80, 0x85, 0xa2, 0x51, 0xa3, 0x35, + 0x4b, 0xd3, 0x9c, 0x86, 0x55, 0xaf, 0xd6, 0x9b, 0x46, 0x51, 0xcd, 0xe4, 0x2d, 0xb1, 0x84, 0x45, + 0xa1, 0x87, 0x7d, 0xf6, 0x8e, 0x54, 0x34, 0x4a, 0x7a, 0xab, 0xd2, 0xe4, 0x43, 0x74, 0xdf, 0xb1, + 0x8c, 0xb7, 0x5a, 0x86, 0xdd, 0xb4, 0x55, 0x85, 0xa8, 0xb0, 0x5c, 0x33, 0x8c, 0xa2, 0xed, 0x58, + 0xc6, 0xbe, 0x69, 0x1c, 0xa8, 0x29, 0x5a, 0x26, 0xfb, 0x9f, 0x7e, 0x21, 0xff, 0xa1, 0x02, 0x84, + 0x81, 0x43, 0x8a, 0x88, 0x03, 0x38, 0x63, 0xb6, 0x61, 0xb3, 0x4c, 0x87, 0x1a, 0x9b, 0x56, 0xad, + 0x17, 0xa3, 0x5d, 0x76, 0x01, 0x48, 0x24, 0xbf, 0x5e, 0x2a, 0xa9, 0x0a, 0xd9, 0x82, 0x73, 0x91, + 0xf4, 0xa2, 0x55, 0x6f, 0xa8, 0xa9, 0xcd, 0x54, 0x56, 0x21, 0x17, 0x63, 0x99, 0x7b, 0x86, 0xd1, + 0x50, 0xd3, 0x74, 0x88, 0x22, 0x19, 0x62, 0x49, 0x30, 0xf6, 0x4c, 0xfe, 0x3b, 0x0a, 0x5c, 0x60, + 0xd5, 0x14, 0xeb, 0xcb, 0xaf, 0xea, 0x25, 0xd8, 0xe0, 0x90, 0xb7, 0x49, 0x15, 0x3d, 0x0f, 0x6a, + 0x28, 0x97, 0x55, 0xf3, 0x29, 0x58, 0x0f, 0xa5, 0x62, 0x3d, 0x52, 0x74, 0xf7, 0x08, 0x25, 0xef, + 0x18, 0x76, 0xd3, 0x31, 0x4a, 0xa5, 0xba, 0xd5, 0x64, 0x15, 0x49, 0xe7, 0x35, 0x58, 0x2f, 0x78, + 0xc3, 0x31, 0xbd, 0x15, 0xf5, 0x46, 0x9d, 0x7e, 0x0f, 0xab, 0xb0, 0x02, 0x4b, 0xc6, 0xd7, 0x9a, + 0x46, 0xcd, 0x36, 0xeb, 0x35, 0x75, 0x2e, 0x7f, 0x29, 0x42, 0x23, 0xd6, 0xb1, 0x6d, 0x97, 0xd5, + 0xb9, 0xbc, 0x0b, 0x2b, 0xc2, 0x16, 0x97, 0xcd, 0x8a, 0x6d, 0xd8, 0x14, 0x73, 0x0d, 0x77, 0x94, + 0x68, 0x13, 0x36, 0xe0, 0x7c, 0x3c, 0xdf, 0x68, 0xaa, 0x0a, 0x1d, 0x85, 0x48, 0x0e, 0x4d, 0x4f, + 0xe5, 0x7f, 0x5b, 0x81, 0x15, 0xff, 0x3d, 0x03, 0x35, 0xa8, 0x57, 0x60, 0xab, 0x5a, 0xd2, 0x9d, + 0xa2, 0xb1, 0x6f, 0x16, 0x0c, 0x67, 0xcf, 0xac, 0x15, 0x23, 0x1f, 0x79, 0x1a, 0x9e, 0x4a, 0x20, + 0xc0, 0xaf, 0x6c, 0xc0, 0xf9, 0x68, 0x56, 0x93, 0x2e, 0xd5, 0x14, 0xed, 0xfa, 0x68, 0x8e, 0xbf, + 0x4e, 0xd3, 0xf9, 0x3f, 0x53, 0x60, 0x83, 0x87, 0x74, 0xe6, 0x2f, 0x2b, 0x0c, 0xeb, 0x1f, 0xc1, + 0x30, 0xf3, 0x70, 0xa3, 0x69, 0xb5, 0xec, 0xa6, 0x51, 0x14, 0xec, 0x74, 0xd2, 0x9a, 0x96, 0x51, + 0x35, 0x6a, 0xcd, 0x48, 0xdd, 0x9e, 0x87, 0xe7, 0x66, 0xd0, 0xd6, 0xea, 0x4d, 0xf1, 0x9b, 0xae, + 0xd5, 0xe7, 0xe0, 0xd9, 0x19, 0xc4, 0x3e, 0x61, 0x2a, 0xbf, 0x0f, 0xab, 0xb6, 0x5e, 0xad, 0x94, + 0xfa, 0xc3, 0x43, 0x4f, 0x9f, 0x8c, 0x4f, 0x7a, 0x64, 0x0b, 0x2e, 0x96, 0xea, 0x56, 0xc1, 0x70, + 0xb0, 0x05, 0x91, 0x4a, 0x9c, 0x83, 0x35, 0x39, 0xf3, 0xbe, 0x41, 0x57, 0x17, 0x81, 0x55, 0x39, + 0xb1, 0x56, 0x57, 0x53, 0xf9, 0xaf, 0xc3, 0x72, 0x28, 0x2e, 0xd2, 0x45, 0x38, 0x27, 0xff, 0x6e, + 0x78, 0xbd, 0x76, 0xa7, 0x77, 0xac, 0xce, 0x45, 0x33, 0xac, 0x49, 0xaf, 0x47, 0x33, 0x70, 0xbb, + 0x91, 0x33, 0x9a, 0xde, 0xf0, 0xb4, 0xd3, 0x73, 0xc7, 0x5e, 0x5b, 0x4d, 0xe5, 0x5f, 0x84, 0x95, + 0x10, 0x1a, 0x2b, 0x9d, 0x57, 0x95, 0x3a, 0x3f, 0x1f, 0xaa, 0x46, 0xd1, 0x6c, 0x55, 0xd5, 0x79, + 0xba, 0xd1, 0x94, 0xcd, 0xdd, 0xb2, 0x0a, 0xf9, 0x1f, 0x28, 0xf4, 0x86, 0x82, 0xfd, 0x5e, 0x2d, + 0xe9, 0x62, 0x26, 0xd2, 0x55, 0xc0, 0x30, 0x9e, 0x0d, 0xdb, 0x66, 0x0f, 0xce, 0x97, 0x60, 0x83, + 0xff, 0x70, 0xf4, 0x5a, 0xd1, 0x29, 0xeb, 0x56, 0xf1, 0x40, 0xb7, 0xe8, 0xd2, 0xb8, 0xaf, 0xa6, + 0x70, 0xbd, 0x4b, 0x29, 0x4e, 0xb3, 0xde, 0x2a, 0x94, 0xd5, 0x34, 0x5d, 0x5e, 0xa1, 0xf4, 0x86, + 0x59, 0x53, 0x33, 0xb8, 0x7b, 0xc4, 0xa8, 0xb1, 0x58, 0x9a, 0x3f, 0x9f, 0xff, 0x44, 0x81, 0x8b, + 0x76, 0xe7, 0xb8, 0xe7, 0x8e, 0x27, 0x43, 0x4f, 0xef, 0x1e, 0xf7, 0x87, 0x9d, 0xf1, 0xc9, 0xa9, + 0x3d, 0xe9, 0x8c, 0x3d, 0x72, 0x0b, 0xae, 0xdb, 0xe6, 0x6e, 0x4d, 0x6f, 0xd2, 0xd5, 0xaf, 0x57, + 0x76, 0xeb, 0x96, 0xd9, 0x2c, 0x57, 0x1d, 0xbb, 0x65, 0xc6, 0x16, 0xc6, 0x35, 0x78, 0x66, 0x3a, + 0x69, 0xc5, 0xd8, 0xd5, 0x0b, 0xf7, 0x55, 0x65, 0x76, 0x81, 0x3b, 0x7a, 0x45, 0xaf, 0x15, 0x8c, + 0xa2, 0xb3, 0x7f, 0x5b, 0x4d, 0x91, 0xeb, 0x70, 0x75, 0x3a, 0x69, 0xc9, 0x6c, 0xd8, 0x94, 0x2c, + 0x3d, 0xfb, 0xbb, 0x65, 0xbb, 0x4a, 0xa9, 0x32, 0xf9, 0x0e, 0xa8, 0x51, 0xf7, 0xf4, 0x98, 0x79, + 0x83, 0xd5, 0xaa, 0xd5, 0xd8, 0x19, 0xb0, 0x06, 0xb9, 0x7a, 0xb3, 0x6c, 0x58, 0x1c, 0x6a, 0x1c, + 0xb1, 0xc5, 0x5b, 0x35, 0x3a, 0xad, 0xea, 0x96, 0xf9, 0x36, 0x1e, 0x06, 0x1b, 0x70, 0xde, 0xae, + 0xe8, 0x85, 0x3d, 0x9c, 0xf1, 0x66, 0xcd, 0x29, 0x94, 0xf5, 0x5a, 0xcd, 0xa8, 0xa8, 0x90, 0xff, + 0x53, 0x85, 0xd9, 0x19, 0x24, 0xf9, 0xb1, 0x91, 0x2f, 0xc0, 0xcd, 0xfa, 0x5e, 0x53, 0x77, 0x1a, + 0x95, 0xd6, 0xae, 0x59, 0x73, 0xec, 0xfb, 0xb5, 0x82, 0x10, 0x5c, 0x0a, 0xf1, 0xfd, 0xf2, 0x26, + 0x5c, 0x9b, 0x49, 0x1d, 0x80, 0x82, 0xdf, 0x00, 0x6d, 0x26, 0x25, 0x6f, 0x48, 0xfe, 0xc7, 0x0a, + 0x6c, 0xcd, 0x78, 0x9b, 0x25, 0x2f, 0xc0, 0xad, 0xb2, 0xa1, 0x17, 0x2b, 0x86, 0x6d, 0xe3, 0x32, + 0x32, 0x6a, 0x4d, 0x6e, 0x06, 0x91, 0xb8, 0x1b, 0xde, 0x82, 0xeb, 0xb3, 0xc9, 0x83, 0x73, 0xf5, + 0x26, 0x5c, 0x9b, 0x4d, 0xca, 0xcf, 0xd9, 0x14, 0xdd, 0x8d, 0x66, 0x53, 0xfa, 0xe7, 0x73, 0x3a, + 0xff, 0x3d, 0x05, 0x2e, 0x24, 0x2b, 0x48, 0x68, 0xdd, 0xcc, 0x9a, 0xdd, 0xd4, 0x2b, 0x15, 0xa7, + 0xa1, 0x5b, 0x7a, 0xd5, 0x31, 0x6a, 0x56, 0xbd, 0x52, 0x49, 0x3a, 0x97, 0xae, 0xc1, 0x33, 0xd3, + 0x49, 0xed, 0x82, 0x65, 0x36, 0xe8, 0xd6, 0xab, 0xc1, 0xf6, 0x74, 0x2a, 0xc3, 0x2c, 0x18, 0x6a, + 0x6a, 0xe7, 0x8d, 0x8f, 0xfe, 0x65, 0x7b, 0xee, 0xa3, 0x4f, 0xb6, 0x95, 0x9f, 0x7c, 0xb2, 0xad, + 0xfc, 0xf3, 0x27, 0xdb, 0xca, 0xdb, 0xcf, 0x9f, 0x2d, 0x9e, 0x06, 0x0a, 0xed, 0xef, 0x2e, 0xa0, + 0xdd, 0xcf, 0xcb, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xc0, 0xcf, 0xb2, 0xa9, 0x3e, 0xaa, 0x01, + 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -32405,6 +32458,22 @@ func (m *RoleConditions) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.AccountAssignments) > 0 { + for iNdEx := len(m.AccountAssignments) - 1; iNdEx >= 0; iNdEx-- { + { + size, err := m.AccountAssignments[iNdEx].MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintTypes(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2 + i-- + dAtA[i] = 0xd2 + } + } if len(m.SPIFFE) > 0 { for iNdEx := len(m.SPIFFE) - 1; iNdEx >= 0; iNdEx-- { { @@ -32838,6 +32907,47 @@ func (m *RoleConditions) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *IdentityCenterAccountAssignment) 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 *IdentityCenterAccountAssignment) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *IdentityCenterAccountAssignment) 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 len(m.Account) > 0 { + i -= len(m.Account) + copy(dAtA[i:], m.Account) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Account))) + i-- + dAtA[i] = 0x12 + } + if len(m.PermissionSet) > 0 { + i -= len(m.PermissionSet) + copy(dAtA[i:], m.PermissionSet) + i = encodeVarintTypes(dAtA, i, uint64(len(m.PermissionSet))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *SPIFFERoleCondition) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -51574,6 +51684,32 @@ func (m *RoleConditions) Size() (n int) { n += 2 + l + sovTypes(uint64(l)) } } + if len(m.AccountAssignments) > 0 { + for _, e := range m.AccountAssignments { + l = e.Size() + n += 2 + l + sovTypes(uint64(l)) + } + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *IdentityCenterAccountAssignment) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.PermissionSet) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } + l = len(m.Account) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -85553,6 +85689,155 @@ func (m *RoleConditions) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 42: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field AccountAssignments", 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 + } + m.AccountAssignments = append(m.AccountAssignments, IdentityCenterAccountAssignment{}) + if err := m.AccountAssignments[len(m.AccountAssignments)-1].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 *IdentityCenterAccountAssignment) 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: IdentityCenterAccountAssignment: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: IdentityCenterAccountAssignment: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field PermissionSet", 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.PermissionSet = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Account", 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.Account = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx index 204ff9b9b9cd4..1a1bd131d98ee 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx @@ -34,6 +34,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| +|account_assignments|[][object](#specallowaccount_assignments-items)|AccountAssignments holds the list of account assignments affected by this condition.| |app_labels|object|AppLabels is a map of labels used as part of the RBAC system.| |app_labels_expression|string|AppLabelsExpression is a predicate expression used to allow/deny access to Apps.| |aws_role_arns|[]string|AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume.| @@ -73,6 +74,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +### spec.allow.account_assignments items + +|Field|Type|Description| +|---|---|---| +|account|string|| +|permission_set|string|| + ### spec.allow.db_permissions items |Field|Type|Description| @@ -184,6 +192,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| +|account_assignments|[][object](#specdenyaccount_assignments-items)|AccountAssignments holds the list of account assignments affected by this condition.| |app_labels|object|AppLabels is a map of labels used as part of the RBAC system.| |app_labels_expression|string|AppLabelsExpression is a predicate expression used to allow/deny access to Apps.| |aws_role_arns|[]string|AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume.| @@ -223,6 +232,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +### spec.deny.account_assignments items + +|Field|Type|Description| +|---|---|---| +|account|string|| +|permission_set|string|| + ### spec.deny.db_permissions items |Field|Type|Description| @@ -417,6 +433,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| +|account_assignments|[][object](#specallowaccount_assignments-items)|AccountAssignments holds the list of account assignments affected by this condition.| |app_labels|object|AppLabels is a map of labels used as part of the RBAC system.| |app_labels_expression|string|AppLabelsExpression is a predicate expression used to allow/deny access to Apps.| |aws_role_arns|[]string|AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume.| @@ -456,6 +473,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +### spec.allow.account_assignments items + +|Field|Type|Description| +|---|---|---| +|account|string|| +|permission_set|string|| + ### spec.allow.db_permissions items |Field|Type|Description| @@ -567,6 +591,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| +|account_assignments|[][object](#specdenyaccount_assignments-items)|AccountAssignments holds the list of account assignments affected by this condition.| |app_labels|object|AppLabels is a map of labels used as part of the RBAC system.| |app_labels_expression|string|AppLabelsExpression is a predicate expression used to allow/deny access to Apps.| |aws_role_arns|[]string|AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume.| @@ -606,6 +631,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +### spec.deny.account_assignments items + +|Field|Type|Description| +|---|---|---| +|account|string|| +|permission_set|string|| + ### spec.deny.db_permissions items |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx index 1ea906c390622..5a52c58697753 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx @@ -34,6 +34,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| +|account_assignments|[][object](#specallowaccount_assignments-items)|AccountAssignments holds the list of account assignments affected by this condition.| |app_labels|object|AppLabels is a map of labels used as part of the RBAC system.| |app_labels_expression|string|AppLabelsExpression is a predicate expression used to allow/deny access to Apps.| |aws_role_arns|[]string|AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume.| @@ -73,6 +74,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +### spec.allow.account_assignments items + +|Field|Type|Description| +|---|---|---| +|account|string|| +|permission_set|string|| + ### spec.allow.db_permissions items |Field|Type|Description| @@ -184,6 +192,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| +|account_assignments|[][object](#specdenyaccount_assignments-items)|AccountAssignments holds the list of account assignments affected by this condition.| |app_labels|object|AppLabels is a map of labels used as part of the RBAC system.| |app_labels_expression|string|AppLabelsExpression is a predicate expression used to allow/deny access to Apps.| |aws_role_arns|[]string|AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume.| @@ -223,6 +232,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +### spec.deny.account_assignments items + +|Field|Type|Description| +|---|---|---| +|account|string|| +|permission_set|string|| + ### spec.deny.db_permissions items |Field|Type|Description| diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx index 877857b1dd5e1..328bfa0c52c24 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx @@ -34,6 +34,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| +|account_assignments|[][object](#specallowaccount_assignments-items)|AccountAssignments holds the list of account assignments affected by this condition.| |app_labels|object|AppLabels is a map of labels used as part of the RBAC system.| |app_labels_expression|string|AppLabelsExpression is a predicate expression used to allow/deny access to Apps.| |aws_role_arns|[]string|AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume.| @@ -73,6 +74,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +### spec.allow.account_assignments items + +|Field|Type|Description| +|---|---|---| +|account|string|| +|permission_set|string|| + ### spec.allow.db_permissions items |Field|Type|Description| @@ -184,6 +192,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| +|account_assignments|[][object](#specdenyaccount_assignments-items)|AccountAssignments holds the list of account assignments affected by this condition.| |app_labels|object|AppLabels is a map of labels used as part of the RBAC system.| |app_labels_expression|string|AppLabelsExpression is a predicate expression used to allow/deny access to Apps.| |aws_role_arns|[]string|AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume.| @@ -223,6 +232,13 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |windows_desktop_labels_expression|string|WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops.| |windows_desktop_logins|[]string|WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops.| +### spec.deny.account_assignments items + +|Field|Type|Description| +|---|---|---| +|account|string|| +|permission_set|string|| + ### spec.deny.db_permissions items |Field|Type|Description| diff --git a/docs/pages/reference/terraform-provider/data-sources/role.mdx b/docs/pages/reference/terraform-provider/data-sources/role.mdx index c86fe26c731c1..b5ace20ebbbc2 100644 --- a/docs/pages/reference/terraform-provider/data-sources/role.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/role.mdx @@ -48,6 +48,7 @@ Optional: Optional: +- `account_assignments` (Attributes List) AccountAssignments holds the list of account assignments affected by this condition. (see [below for nested schema](#nested-schema-for-specallowaccount_assignments)) - `app_labels` (Map of List of String) AppLabels is a map of labels used as part of the RBAC system. - `app_labels_expression` (String) AppLabelsExpression is a predicate expression used to allow/deny access to Apps. - `aws_role_arns` (List of String) AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume. @@ -87,6 +88,14 @@ Optional: - `windows_desktop_labels_expression` (String) WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops. - `windows_desktop_logins` (List of String) WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops. +### Nested Schema for `spec.allow.account_assignments` + +Optional: + +- `account` (String) +- `permission_set` (String) + + ### Nested Schema for `spec.allow.db_permissions` Optional: @@ -211,6 +220,7 @@ Optional: Optional: +- `account_assignments` (Attributes List) AccountAssignments holds the list of account assignments affected by this condition. (see [below for nested schema](#nested-schema-for-specdenyaccount_assignments)) - `app_labels` (Map of List of String) AppLabels is a map of labels used as part of the RBAC system. - `app_labels_expression` (String) AppLabelsExpression is a predicate expression used to allow/deny access to Apps. - `aws_role_arns` (List of String) AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume. @@ -250,6 +260,14 @@ Optional: - `windows_desktop_labels_expression` (String) WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops. - `windows_desktop_logins` (List of String) WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops. +### Nested Schema for `spec.deny.account_assignments` + +Optional: + +- `account` (String) +- `permission_set` (String) + + ### Nested Schema for `spec.deny.db_permissions` Optional: diff --git a/docs/pages/reference/terraform-provider/resources/role.mdx b/docs/pages/reference/terraform-provider/resources/role.mdx index e18ddabb1f0e5..1a48109632ced 100644 --- a/docs/pages/reference/terraform-provider/resources/role.mdx +++ b/docs/pages/reference/terraform-provider/resources/role.mdx @@ -102,6 +102,7 @@ Optional: Optional: +- `account_assignments` (Attributes List) AccountAssignments holds the list of account assignments affected by this condition. (see [below for nested schema](#nested-schema-for-specallowaccount_assignments)) - `app_labels` (Map of List of String) AppLabels is a map of labels used as part of the RBAC system. - `app_labels_expression` (String) AppLabelsExpression is a predicate expression used to allow/deny access to Apps. - `aws_role_arns` (List of String) AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume. @@ -141,6 +142,14 @@ Optional: - `windows_desktop_labels_expression` (String) WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops. - `windows_desktop_logins` (List of String) WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops. +### Nested Schema for `spec.allow.account_assignments` + +Optional: + +- `account` (String) +- `permission_set` (String) + + ### Nested Schema for `spec.allow.db_permissions` Optional: @@ -265,6 +274,7 @@ Optional: Optional: +- `account_assignments` (Attributes List) AccountAssignments holds the list of account assignments affected by this condition. (see [below for nested schema](#nested-schema-for-specdenyaccount_assignments)) - `app_labels` (Map of List of String) AppLabels is a map of labels used as part of the RBAC system. - `app_labels_expression` (String) AppLabelsExpression is a predicate expression used to allow/deny access to Apps. - `aws_role_arns` (List of String) AWSRoleARNs is a list of AWS role ARNs this role is allowed to assume. @@ -304,6 +314,14 @@ Optional: - `windows_desktop_labels_expression` (String) WindowsDesktopLabelsExpression is a predicate expression used to allow/deny access to Windows desktops. - `windows_desktop_logins` (List of String) WindowsDesktopLogins is a list of desktop login names allowed/denied for Windows desktops. +### Nested Schema for `spec.deny.account_assignments` + +Optional: + +- `account` (String) +- `permission_set` (String) + + ### Nested Schema for `spec.deny.db_permissions` Optional: diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml index d091c86f048ae..ef5b2d5ce6676 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml @@ -35,6 +35,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -561,6 +572,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -1366,6 +1388,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -1892,6 +1925,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml index 837ff72ce28d8..69cdeef31b1fa 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml @@ -38,6 +38,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -564,6 +575,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml index a214227ba32b7..0d7aceff039f0 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml @@ -38,6 +38,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -564,6 +575,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml index d091c86f048ae..ef5b2d5ce6676 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml @@ -35,6 +35,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -561,6 +572,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -1366,6 +1388,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -1892,6 +1925,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml index 837ff72ce28d8..69cdeef31b1fa 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml @@ -38,6 +38,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -564,6 +575,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml index a214227ba32b7..0d7aceff039f0 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml @@ -38,6 +38,17 @@ spec: allow: description: Allow is the set of conditions evaluated to grant access. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true @@ -564,6 +575,17 @@ spec: description: Deny is the set of conditions evaluated to deny access. Deny takes priority over allow. properties: + account_assignments: + description: AccountAssignments holds the list of account assignments + affected by this condition. + items: + properties: + account: + type: string + permission_set: + type: string + type: object + type: array app_labels: additionalProperties: x-kubernetes-preserve-unknown-fields: true diff --git a/integrations/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index abb411d8bcad2..7e841973780dc 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -1537,6 +1537,22 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ "allow": { Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "account_assignments": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.ListNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "account": { + Description: "", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, + "permission_set": { + Description: "", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, + }), + Description: "AccountAssignments holds the list of account assignments affected by this condition.", + Optional: true, + }, "app_labels": GenSchemaLabels(ctx, github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ Description: "AppLabels is a map of labels used as part of the RBAC system.", Optional: true, @@ -1974,6 +1990,22 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin }, "deny": { Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.SingleNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "account_assignments": { + Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.ListNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ + "account": { + Description: "", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, + "permission_set": { + Description: "", + Optional: true, + Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, + }, + }), + Description: "AccountAssignments holds the list of account assignments affected by this condition.", + Optional: true, + }, "app_labels": GenSchemaLabels(ctx, github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ Description: "AppLabels is a map of labels used as part of the RBAC system.", Optional: true, @@ -18006,6 +18038,68 @@ func CopyRoleV6FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["account_assignments"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Allow.AccountAssignments"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.AccountAssignments", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.AccountAssignments = make([]github_com_gravitational_teleport_api_types.IdentityCenterAccountAssignment, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.AccountAssignments", "github_com_hashicorp_terraform_plugin_framework_types.Object"}) + } else { + var t github_com_gravitational_teleport_api_types.IdentityCenterAccountAssignment + if !v.Null && !v.Unknown { + tf := v + obj := &t + { + a, ok := tf.Attrs["permission_set"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Allow.AccountAssignments.PermissionSet"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.AccountAssignments.PermissionSet", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.PermissionSet = t + } + } + } + { + a, ok := tf.Attrs["account"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Allow.AccountAssignments.Account"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Allow.AccountAssignments.Account", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Account = t + } + } + } + } + obj.AccountAssignments[k] = t + } + } + } + } + } + } } } } @@ -19813,6 +19907,68 @@ func CopyRoleV6FromTerraform(_ context.Context, tf github_com_hashicorp_terrafor } } } + { + a, ok := tf.Attrs["account_assignments"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Deny.AccountAssignments"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.AccountAssignments", "github.com/hashicorp/terraform-plugin-framework/types.List"}) + } else { + obj.AccountAssignments = make([]github_com_gravitational_teleport_api_types.IdentityCenterAccountAssignment, len(v.Elems)) + if !v.Null && !v.Unknown { + for k, a := range v.Elems { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.AccountAssignments", "github_com_hashicorp_terraform_plugin_framework_types.Object"}) + } else { + var t github_com_gravitational_teleport_api_types.IdentityCenterAccountAssignment + if !v.Null && !v.Unknown { + tf := v + obj := &t + { + a, ok := tf.Attrs["permission_set"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Deny.AccountAssignments.PermissionSet"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.AccountAssignments.PermissionSet", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.PermissionSet = t + } + } + } + { + a, ok := tf.Attrs["account"] + if !ok { + diags.Append(attrReadMissingDiag{"RoleV6.Spec.Deny.AccountAssignments.Account"}) + } else { + v, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrReadConversionFailureDiag{"RoleV6.Spec.Deny.AccountAssignments.Account", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } else { + var t string + if !v.Null && !v.Unknown { + t = string(v.Value) + } + obj.Account = t + } + } + } + } + obj.AccountAssignments[k] = t + } + } + } + } + } + } } } } @@ -24145,6 +24301,106 @@ func CopyRoleV6ToTerraform(ctx context.Context, obj *github_com_gravitational_te } } } + { + a, ok := tf.AttrTypes["account_assignments"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Allow.AccountAssignments"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.AccountAssignments", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["account_assignments"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.AccountAssignments)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.AccountAssignments)) + } + } + if obj.AccountAssignments != nil { + o := o.ElemType.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if len(obj.AccountAssignments) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.AccountAssignments)) + } + for k, a := range obj.AccountAssignments { + v, ok := tf.Attrs["account_assignments"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + { + obj := a + tf := &v + { + t, ok := tf.AttrTypes["permission_set"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Allow.AccountAssignments.PermissionSet"}) + } else { + v, ok := tf.Attrs["permission_set"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Allow.AccountAssignments.PermissionSet", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.AccountAssignments.PermissionSet", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.PermissionSet) == "" + } + v.Value = string(obj.PermissionSet) + v.Unknown = false + tf.Attrs["permission_set"] = v + } + } + { + t, ok := tf.AttrTypes["account"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Allow.AccountAssignments.Account"}) + } else { + v, ok := tf.Attrs["account"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Allow.AccountAssignments.Account", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Allow.AccountAssignments.Account", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.Account) == "" + } + v.Value = string(obj.Account) + v.Unknown = false + tf.Attrs["account"] = v + } + } + } + v.Unknown = false + c.Elems[k] = v + } + if len(obj.AccountAssignments) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["account_assignments"] = c + } + } + } } v.Unknown = false tf.Attrs["allow"] = v @@ -27311,6 +27567,106 @@ func CopyRoleV6ToTerraform(ctx context.Context, obj *github_com_gravitational_te } } } + { + a, ok := tf.AttrTypes["account_assignments"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Deny.AccountAssignments"}) + } else { + o, ok := a.(github_com_hashicorp_terraform_plugin_framework_types.ListType) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.AccountAssignments", "github.com/hashicorp/terraform-plugin-framework/types.ListType"}) + } else { + c, ok := tf.Attrs["account_assignments"].(github_com_hashicorp_terraform_plugin_framework_types.List) + if !ok { + c = github_com_hashicorp_terraform_plugin_framework_types.List{ + + ElemType: o.ElemType, + Elems: make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.AccountAssignments)), + Null: true, + } + } else { + if c.Elems == nil { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.AccountAssignments)) + } + } + if obj.AccountAssignments != nil { + o := o.ElemType.(github_com_hashicorp_terraform_plugin_framework_types.ObjectType) + if len(obj.AccountAssignments) != len(c.Elems) { + c.Elems = make([]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(obj.AccountAssignments)) + } + for k, a := range obj.AccountAssignments { + v, ok := tf.Attrs["account_assignments"].(github_com_hashicorp_terraform_plugin_framework_types.Object) + if !ok { + v = github_com_hashicorp_terraform_plugin_framework_types.Object{ + + AttrTypes: o.AttrTypes, + Attrs: make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(o.AttrTypes)), + } + } else { + if v.Attrs == nil { + v.Attrs = make(map[string]github_com_hashicorp_terraform_plugin_framework_attr.Value, len(tf.AttrTypes)) + } + } + { + obj := a + tf := &v + { + t, ok := tf.AttrTypes["permission_set"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Deny.AccountAssignments.PermissionSet"}) + } else { + v, ok := tf.Attrs["permission_set"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Deny.AccountAssignments.PermissionSet", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.AccountAssignments.PermissionSet", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.PermissionSet) == "" + } + v.Value = string(obj.PermissionSet) + v.Unknown = false + tf.Attrs["permission_set"] = v + } + } + { + t, ok := tf.AttrTypes["account"] + if !ok { + diags.Append(attrWriteMissingDiag{"RoleV6.Spec.Deny.AccountAssignments.Account"}) + } else { + v, ok := tf.Attrs["account"].(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + i, err := t.ValueFromTerraform(ctx, github_com_hashicorp_terraform_plugin_go_tftypes.NewValue(t.TerraformType(ctx), nil)) + if err != nil { + diags.Append(attrWriteGeneralError{"RoleV6.Spec.Deny.AccountAssignments.Account", err}) + } + v, ok = i.(github_com_hashicorp_terraform_plugin_framework_types.String) + if !ok { + diags.Append(attrWriteConversionFailureDiag{"RoleV6.Spec.Deny.AccountAssignments.Account", "github.com/hashicorp/terraform-plugin-framework/types.String"}) + } + v.Null = string(obj.Account) == "" + } + v.Value = string(obj.Account) + v.Unknown = false + tf.Attrs["account"] = v + } + } + } + v.Unknown = false + c.Elems[k] = v + } + if len(obj.AccountAssignments) > 0 { + c.Null = false + } + } + c.Unknown = false + tf.Attrs["account_assignments"] = c + } + } + } } v.Unknown = false tf.Attrs["deny"] = v From 71292d4aec6b33bdc47cc7f1136f179e66f67ae7 Mon Sep 17 00:00:00 2001 From: Marco Dinis Date: Thu, 24 Oct 2024 09:03:56 +0100 Subject: [PATCH 44/70] Replace logrus with slog in most of `lib/srv/app` (#47808) * Replace logrus with slog in most of `lib/srv/app` * move things * avoid slog.Logger().With * Update lib/srv/app/aws/handler.go Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> --------- Co-authored-by: rosstimothy <39066650+rosstimothy@users.noreply.github.com> --- lib/srv/app/aws/handler.go | 18 ++++++++++----- lib/srv/app/azure/credential.go | 2 +- lib/srv/app/azure/handler.go | 35 +++++++++++++++++------------- lib/srv/app/cloud.go | 4 ---- lib/srv/app/common/audit.go | 8 +++---- lib/srv/app/connections_handler.go | 2 +- lib/srv/app/gcp/handler.go | 27 ++++++++++++++++------- lib/srv/app/server.go | 31 ++++++++++++++------------ lib/srv/app/session.go | 28 ++++++++++++++++-------- lib/srv/app/session_test.go | 4 +++- lib/srv/app/transport.go | 13 ++++++----- lib/srv/app/watcher.go | 15 ++++++++----- 12 files changed, 114 insertions(+), 73 deletions(-) diff --git a/lib/srv/app/aws/handler.go b/lib/srv/app/aws/handler.go index f98b3222891a7..8e2d0933bb441 100644 --- a/lib/srv/app/aws/handler.go +++ b/lib/srv/app/aws/handler.go @@ -22,6 +22,7 @@ import ( "bytes" "context" "io" + "log/slog" "net/http" "net/url" "strings" @@ -53,8 +54,12 @@ type signerHandler struct { // SignerHandlerConfig is the awsSignerHandler configuration. type SignerHandlerConfig struct { + // LegacyLogger is the old logger. + // Should be removed gradually. + // Deprecated: use Log instead. + LegacyLogger logrus.FieldLogger // Log is a logger for the handler. - Log logrus.FieldLogger + Log *slog.Logger // RoundTripper is an http.RoundTripper instance used for requests. RoundTripper http.RoundTripper // SigningService is used to sign requests before forwarding them. @@ -77,8 +82,11 @@ func (cfg *SignerHandlerConfig) CheckAndSetDefaults() error { } cfg.RoundTripper = tr } + if cfg.LegacyLogger == nil { + cfg.LegacyLogger = logrus.WithField(teleport.ComponentKey, "aws:signer") + } if cfg.Log == nil { - cfg.Log = logrus.WithField(teleport.ComponentKey, "aws:signer") + cfg.Log = slog.With(teleport.ComponentKey, "aws:signer") } if cfg.Clock == nil { cfg.Clock = clockwork.NewRealClock() @@ -106,7 +114,7 @@ func NewAWSSignerHandler(ctx context.Context, config SignerHandlerConfig) (http. var err error handler.fwd, err = reverseproxy.New( reverseproxy.WithRoundTripper(config.RoundTripper), - reverseproxy.WithLogger(config.Log), + reverseproxy.WithLogger(config.LegacyLogger), reverseproxy.WithErrorHandler(handler.formatForwardResponseError), ) @@ -115,7 +123,7 @@ func NewAWSSignerHandler(ctx context.Context, config SignerHandlerConfig) (http. // formatForwardResponseError converts an error to a status code and writes the code to a response. func (s *signerHandler) formatForwardResponseError(rw http.ResponseWriter, r *http.Request, err error) { - s.Log.WithError(err).Debugf("Failed to process request.") + s.Log.DebugContext(r.Context(), "Failed to process request", "error", err) common.SetTeleportAPIErrorHeader(rw, err) // Convert trace error type to HTTP and write response. @@ -217,7 +225,7 @@ func (s *signerHandler) emitAudit(sessCtx *common.SessionContext, req *http.Requ } if auditErr != nil { // log but don't return the error, because we already handed off request/response handling to the oxy forwarder. - s.Log.WithError(auditErr).Warn("Failed to emit audit event.") + s.Log.WarnContext(req.Context(), "Failed to emit audit event.", "error", auditErr) } } diff --git a/lib/srv/app/azure/credential.go b/lib/srv/app/azure/credential.go index fede72eb6f37b..e653bb2a2917f 100644 --- a/lib/srv/app/azure/credential.go +++ b/lib/srv/app/azure/credential.go @@ -89,7 +89,7 @@ func findDefaultCredentialProvider(ctx context.Context, logger *slog.Logger) (cr defaultWorkloadIdentity, err := azidentity.NewWorkloadIdentityCredential(nil) if err != nil { // If no workload identity is found, fall back to regular managed identity. - logger.With("error", err).DebugContext(ctx, "Failed to load azure workload identity.") + logger.DebugContext(ctx, "Failed to load azure workload identity.", "error", err) logger.InfoContext(ctx, "Using azure managed identity.") return managedIdentityCredentialProvider{}, nil } diff --git a/lib/srv/app/azure/handler.go b/lib/srv/app/azure/handler.go index 3699995057ada..9c5cc2f1c4314 100644 --- a/lib/srv/app/azure/handler.go +++ b/lib/srv/app/azure/handler.go @@ -51,11 +51,12 @@ const ComponentKey = "azure:fwd" type HandlerConfig struct { // RoundTripper is the underlying transport given to an oxy Forwarder. RoundTripper http.RoundTripper - // Log is the Logger. - // TODO(greedy52) replace with slog. - Log logrus.FieldLogger - // Logger is the slog.Logger. - Logger *slog.Logger + // LegacyLogger is the old logger. + // Should be removed gradually. + // Deprecated: use Log instead. + LegacyLogger logrus.FieldLogger + // Log is a logger for the handler. + Log *slog.Logger // Clock is used to override time in tests. Clock clockwork.Clock @@ -75,14 +76,14 @@ func (s *HandlerConfig) CheckAndSetDefaults(ctx context.Context) error { if s.Clock == nil { s.Clock = clockwork.NewRealClock() } - if s.Log == nil { - s.Log = logrus.WithField(teleport.ComponentKey, ComponentKey) + if s.LegacyLogger == nil { + s.LegacyLogger = logrus.WithField(teleport.ComponentKey, ComponentKey) } - if s.Logger == nil { - s.Logger = slog.Default().With(teleport.ComponentKey, ComponentKey) + if s.Log == nil { + s.Log = slog.With(teleport.ComponentKey, ComponentKey) } if s.getAccessToken == nil { - s.getAccessToken = lazyGetAccessTokenFromDefaultCredentialProvider(s.Logger) + s.getAccessToken = lazyGetAccessTokenFromDefaultCredentialProvider(s.Log) } return nil } @@ -127,7 +128,7 @@ func newAzureHandler(ctx context.Context, config HandlerConfig) (*handler, error svc.fwd, err = reverseproxy.New( reverseproxy.WithRoundTripper(config.RoundTripper), - reverseproxy.WithLogger(config.Log), + reverseproxy.WithLogger(config.LegacyLogger), reverseproxy.WithErrorHandler(svc.formatForwardResponseError), ) @@ -161,13 +162,13 @@ func (s *handler) serveHTTP(w http.ResponseWriter, req *http.Request) error { if err := sessionCtx.Audit.OnRequest(req.Context(), sessionCtx, fwdRequest, status, nil); err != nil { // log but don't return the error, because we already handed off request/response handling to the oxy forwarder. - s.Log.WithError(err).Warn("Failed to emit audit event.") + s.Log.WarnContext(req.Context(), "Failed to emit audit event.", "error", err) } return nil } func (s *handler) formatForwardResponseError(rw http.ResponseWriter, r *http.Request, err error) { - s.Log.WithError(err).Debugf("Failed to process request.") + s.Log.DebugContext(r.Context(), "Failed to process request.", "error", err) common.SetTeleportAPIErrorHeader(rw, err) // Convert trace error type to HTTP and write response. @@ -224,7 +225,7 @@ func getPeerKey(certs []*x509.Certificate) (crypto.PublicKey, error) { func (s *handler) replaceAuthHeaders(r *http.Request, sessionCtx *common.SessionContext, reqCopy *http.Request) error { auth := reqCopy.Header.Get("Authorization") if auth == "" { - s.Log.Debugf("No Authorization header present, skipping replacement.") + s.Log.DebugContext(r.Context(), "No Authorization header present, skipping replacement.") return nil } @@ -238,7 +239,11 @@ func (s *handler) replaceAuthHeaders(r *http.Request, sessionCtx *common.Session return trace.Wrap(err, "failed to parse Authorization header") } - s.Log.Debugf("Processing request, sessionId = %q, azureIdentity = %q, claims = %v", sessionCtx.Identity.RouteToApp.SessionID, sessionCtx.Identity.RouteToApp.AzureIdentity, claims) + s.Log.DebugContext(r.Context(), "Processing request.", + "session_id", sessionCtx.Identity.RouteToApp.SessionID, + "azure_identity", sessionCtx.Identity.RouteToApp.AzureIdentity, + "claims", claims, + ) token, err := s.getToken(r.Context(), sessionCtx.Identity.RouteToApp.AzureIdentity, claims.Resource) if err != nil { return trace.Wrap(err) diff --git a/lib/srv/app/cloud.go b/lib/srv/app/cloud.go index 3675bc14910ed..0196cdff2faa0 100644 --- a/lib/srv/app/cloud.go +++ b/lib/srv/app/cloud.go @@ -35,9 +35,7 @@ import ( awssession "github.com/aws/aws-sdk-go/aws/session" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - "github.com/sirupsen/logrus" - "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/constants" "github.com/gravitational/teleport/lib/tlsca" awsutils "github.com/gravitational/teleport/lib/utils/aws" @@ -110,7 +108,6 @@ func (c *CloudConfig) CheckAndSetDefaults() error { type cloud struct { cfg CloudConfig - log logrus.FieldLogger } // NewCloud creates a new cloud service. @@ -120,7 +117,6 @@ func NewCloud(cfg CloudConfig) (Cloud, error) { } return &cloud{ cfg: cfg, - log: logrus.WithField(teleport.ComponentKey, "cloud"), }, nil } diff --git a/lib/srv/app/common/audit.go b/lib/srv/app/common/audit.go index 4b6a465b2b52b..2c745be2b3495 100644 --- a/lib/srv/app/common/audit.go +++ b/lib/srv/app/common/audit.go @@ -20,11 +20,11 @@ package common import ( "context" + "log/slog" "net/http" "github.com/aws/aws-sdk-go/aws/endpoints" "github.com/gravitational/trace" - "github.com/sirupsen/logrus" "github.com/gravitational/teleport" apidefaults "github.com/gravitational/teleport/api/defaults" @@ -75,7 +75,7 @@ type audit struct { // cfg is the audit events emitter configuration. cfg AuditConfig // log is used for logging - log logrus.FieldLogger + log *slog.Logger } // NewAudit returns a new instance of the audit events emitter. @@ -85,7 +85,7 @@ func NewAudit(config AuditConfig) (Audit, error) { } return &audit{ cfg: config, - log: logrus.WithField(teleport.ComponentKey, "app:audit"), + log: slog.With(teleport.ComponentKey, "app:audit"), }, nil } @@ -199,7 +199,7 @@ func (a *audit) OnDynamoDBRequest(ctx context.Context, sessionCtx *SessionContex // If this fails, we still want to emit the rest of the event info; the request event Body is nullable, so it's ok if body is left nil here. body, err := awsutils.UnmarshalRequestBody(req) if err != nil { - a.log.WithError(err).Warn("Failed to read request body as JSON, omitting the body from the audit event.") + a.log.WarnContext(ctx, "Failed to read request body as JSON, omitting the body from the audit event.", "error", err) } // get the API target from the request header, according to the API request format documentation: // https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.LowLevelAPI.html#Programming.LowLevelAPI.RequestFormat diff --git a/lib/srv/app/connections_handler.go b/lib/srv/app/connections_handler.go index 179f6e4bec284..5cc34fb4f0ab5 100644 --- a/lib/srv/app/connections_handler.go +++ b/lib/srv/app/connections_handler.go @@ -225,7 +225,7 @@ func NewConnectionsHandler(closeContext context.Context, cfg *ConnectionsHandler } azureHandler, err := appazure.NewAzureHandler(closeContext, appazure.HandlerConfig{ - Logger: cfg.Logger.With(teleport.ComponentKey, appazure.ComponentKey), + Log: cfg.Logger.With(teleport.ComponentKey, appazure.ComponentKey), }) if err != nil { return nil, trace.Wrap(err) diff --git a/lib/srv/app/gcp/handler.go b/lib/srv/app/gcp/handler.go index c0e7b8ff64611..ebafa0faf07cc 100644 --- a/lib/srv/app/gcp/handler.go +++ b/lib/srv/app/gcp/handler.go @@ -22,6 +22,7 @@ import ( "bytes" "context" "fmt" + "log/slog" "net/http" "time" @@ -68,8 +69,12 @@ var _ cloudClientGCP = (*cloudClientGCPImpl[iamCredentialsClient])(nil) type HandlerConfig struct { // RoundTripper is the underlying transport given to an oxy Forwarder. RoundTripper http.RoundTripper - // Log is the Logger. - Log logrus.FieldLogger + // LegacyLogger is the old logger. + // Should be removed gradually. + // Deprecated: use Log instead. + LegacyLogger logrus.FieldLogger + // Log is a logger for the handler. + Log *slog.Logger // Clock is used to override time in tests. Clock clockwork.Clock // cloudClientGCP holds a reference to GCP IAM client. Normally set in CheckAndSetDefaults, it is overridden in tests. @@ -89,7 +94,10 @@ func (s *HandlerConfig) CheckAndSetDefaults() error { s.Clock = clockwork.NewRealClock() } if s.Log == nil { - s.Log = logrus.WithField(teleport.ComponentKey, "gcp:fwd") + s.Log = slog.With(teleport.ComponentKey, "gcp:fwd") + } + if s.LegacyLogger == nil { + s.LegacyLogger = logrus.WithField(teleport.ComponentKey, "gcp:fwd") } if s.cloudClientGCP == nil { clients, err := cloud.NewClients() @@ -141,7 +149,7 @@ func newGCPHandler(ctx context.Context, config HandlerConfig) (*handler, error) svc.fwd, err = reverseproxy.New( reverseproxy.WithRoundTripper(config.RoundTripper), - reverseproxy.WithLogger(config.Log), + reverseproxy.WithLogger(config.LegacyLogger), reverseproxy.WithErrorHandler(svc.formatForwardResponseError), ) return svc, trace.Wrap(err) @@ -164,7 +172,10 @@ func (s *handler) serveHTTP(w http.ResponseWriter, req *http.Request) error { if err != nil { return trace.Wrap(err) } - s.Log.Debugf("Processing request, sessionId = %q, gcpServiceAccount = %q", sessionCtx.Identity.RouteToApp.SessionID, sessionCtx.Identity.RouteToApp.GCPServiceAccount) + s.Log.DebugContext(req.Context(), "Processing request", + "session_id", sessionCtx.Identity.RouteToApp.SessionID, + "gcp_service_account", sessionCtx.Identity.RouteToApp.GCPServiceAccount, + ) fwdRequest, err := s.prepareForwardRequest(req, sessionCtx) if err != nil { @@ -176,13 +187,13 @@ func (s *handler) serveHTTP(w http.ResponseWriter, req *http.Request) error { if err := sessionCtx.Audit.OnRequest(req.Context(), sessionCtx, fwdRequest, status, nil); err != nil { // log but don't return the error, because we already handed off request/response handling to the oxy forwarder. - s.Log.WithError(err).Warn("Failed to emit audit event.") + s.Log.WarnContext(req.Context(), "Failed to emit audit event.", "error", err) } return nil } func (s *handler) formatForwardResponseError(rw http.ResponseWriter, r *http.Request, err error) { - s.Log.WithError(err).Debugf("Failed to process request.") + s.Log.DebugContext(r.Context(), "Failed to process request.", "error", err) common.SetTeleportAPIErrorHeader(rw, err) // Convert trace error type to HTTP and write response. @@ -224,7 +235,7 @@ func (s *handler) prepareForwardRequest(r *http.Request, sessionCtx *common.Sess func (s *handler) replaceAuthHeaders(r *http.Request, sessionCtx *common.SessionContext, reqCopy *http.Request) error { auth := reqCopy.Header.Get("Authorization") if auth == "" { - s.Log.Debugf("No Authorization header present, skipping replacement.") + s.Log.DebugContext(r.Context(), "No Authorization header present, skipping replacement.") return nil } diff --git a/lib/srv/app/server.go b/lib/srv/app/server.go index 0a248bc941018..83684289cdb3b 100644 --- a/lib/srv/app/server.go +++ b/lib/srv/app/server.go @@ -23,6 +23,7 @@ package app import ( "context" + "log/slog" "net" "sync" @@ -131,8 +132,9 @@ func (c *Config) CheckAndSetDefaults() error { // Server is an application server. It authenticates requests from the web // proxy and forwards th to internal applications. type Server struct { - c *Config - log *logrus.Entry + c *Config + legacyLog *logrus.Entry + log *slog.Logger closeContext context.Context closeFunc context.CancelFunc @@ -199,9 +201,10 @@ func New(ctx context.Context, c *Config) (*Server, error) { s := &Server{ c: c, // TODO(greedy52) replace with slog from Config.Logger. - log: logrus.WithFields(logrus.Fields{ + legacyLog: logrus.WithFields(logrus.Fields{ teleport.ComponentKey: teleport.ComponentApp, }), + log: slog.With(teleport.ComponentKey, teleport.ComponentApp), heartbeats: make(map[string]srv.HeartbeatI), dynamicLabels: make(map[string]*labels.Dynamic), apps: make(map[string]types.Application), @@ -231,7 +234,7 @@ func (s *Server) startApp(ctx context.Context, app types.Application) error { if err := s.startHeartbeat(ctx, app); err != nil { return trace.Wrap(err) } - s.log.Debugf("Started %v.", app) + s.log.DebugContext(ctx, "App started.", "app", app) return nil } @@ -241,7 +244,7 @@ func (s *Server) stopApp(ctx context.Context, name string) error { if err := s.stopHeartbeat(name); err != nil { return trace.Wrap(err) } - s.log.Debugf("Stopped app %q.", name) + s.log.DebugContext(ctx, "App stopped.", "app", name) return nil } @@ -365,7 +368,7 @@ func (s *Server) getServerInfo(app types.Application) (*types.AppServerV3, error func (s *Server) getRotationState() types.Rotation { rotation, err := s.c.GetRotation(types.RoleApp) if err != nil && !trace.IsNotFound(err) && !trace.IsConnectionProblem(err) { - s.log.WithError(err).Warn("Failed to get rotation state.") + s.log.WarnContext(s.closeContext, "Failed to get rotation state.", "error", err) } if rotation != nil { return *rotation @@ -488,21 +491,21 @@ func (s *Server) close(ctx context.Context) error { } if heartbeat != nil { - log := s.log.WithField("app", name) - log.Debug("Stopping app") + log := s.log.With("app", name) + log.DebugContext(ctx, "Stopping app") if err := heartbeat.Close(); err != nil { - log.WithError(err).Warn("Failed to stop app.") + log.WarnContext(ctx, "Failed to stop app.", "error", err) } else { - log.Debug("Stopped app") + log.DebugContext(ctx, "Stopped app") } if shouldDeleteApps { g.Go(func() error { - log.Debug("Deleting app") + log.DebugContext(ctx, "Deleting app") if err := s.removeAppServer(gctx, name); err != nil { - log.WithError(err).Warn("Failed to delete app.") + log.WarnContext(ctx, "Failed to delete app.", "error", err) } else { - log.Debug("Deleted app") + log.DebugContext(ctx, "Deleted app") } return nil }) @@ -512,7 +515,7 @@ func (s *Server) close(ctx context.Context) error { s.mu.RUnlock() if err := g.Wait(); err != nil { - s.log.WithError(err).Warn("Deleting all apps failed") + s.log.WarnContext(ctx, "Deleting all apps failed", "error", err) } s.mu.Lock() diff --git a/lib/srv/app/session.go b/lib/srv/app/session.go index 8574501041d79..f1b53f3994f8f 100644 --- a/lib/srv/app/session.go +++ b/lib/srv/app/session.go @@ -21,6 +21,7 @@ package app import ( "context" "errors" + "log/slog" "net/http" "sync" "time" @@ -83,7 +84,9 @@ type sessionChunk struct { // for ~7 minutes at most. closeTimeout time.Duration - log *logrus.Entry + log *slog.Logger + + legacyLogger *logrus.Entry } // sessionOpt defines an option function for creating sessionChunk. @@ -99,10 +102,11 @@ func (c *ConnectionsHandler) newSessionChunk(ctx context.Context, identity *tlsc closeC: make(chan struct{}), inflightCond: sync.NewCond(&sync.Mutex{}), closeTimeout: sessionChunkCloseTimeout, - log: c.legacyLogger, + log: c.log, + legacyLogger: c.legacyLogger, } - sess.log.Debugf("Creating app session chunk %s", sess.id) + sess.log.DebugContext(ctx, "Creating app session chunk", "session_id", sess.id) // Create a session tracker so that other services, such as the // session upload completer, can track the session chunk's lifetime. @@ -139,7 +143,7 @@ func (c *ConnectionsHandler) newSessionChunk(ctx context.Context, identity *tlsc return nil, trace.Wrap(err) } - sess.log.Debugf("Created app session chunk %s", sess.id) + sess.log.DebugContext(ctx, "Created app session chunk", "session_id", sess.id) return sess, nil } @@ -188,7 +192,7 @@ func (c *ConnectionsHandler) withJWTTokenForwarder(ctx context.Context, sess *se cipherSuites: c.cfg.CipherSuites, jwt: jwt, traits: traits, - log: c.legacyLogger, + log: c.log, }) if err != nil { return trace.Wrap(err) @@ -198,7 +202,7 @@ func (c *ConnectionsHandler) withJWTTokenForwarder(ctx context.Context, sess *se sess.handler, err = reverseproxy.New( reverseproxy.WithFlushInterval(100*time.Millisecond), reverseproxy.WithRoundTripper(transport), - reverseproxy.WithLogger(sess.log), + reverseproxy.WithLogger(sess.legacyLogger), reverseproxy.WithRewriter(common.NewHeaderRewriter(delegate)), ) if err != nil { @@ -262,16 +266,22 @@ func (s *sessionChunk) close(ctx context.Context) error { if s.inflight == 0 { break } else if time.Now().After(deadline) { - s.log.Debugf("Timeout expired, forcibly closing session chunk %s, inflight requests: %d", s.id, s.inflight) + s.log.DebugContext(ctx, "Timeout expired, forcibly closing session chunk", + "session_id", s.id, + "inflight_requests", s.inflight, + ) break } - s.log.Debugf("Inflight requests: %d, waiting to close session chunk %s", s.inflight, s.id) + s.log.DebugContext(ctx, "Waiting to close session chunk", + "session_id", s.id, + "inflight_requests", s.inflight, + ) s.inflightCond.Wait() } s.inflight = -1 s.inflightCond.L.Unlock() close(s.closeC) - s.log.Debugf("Closed session chunk %s", s.id) + s.log.DebugContext(ctx, "Closed session chunk", "session_id", s.id) return trace.Wrap(s.streamCloser.Close(ctx)) } diff --git a/lib/srv/app/session_test.go b/lib/srv/app/session_test.go index f6b94552c8fb2..d76fdcb6a9a22 100644 --- a/lib/srv/app/session_test.go +++ b/lib/srv/app/session_test.go @@ -29,6 +29,7 @@ import ( "github.com/stretchr/testify/require" "github.com/gravitational/teleport/lib/events" + "github.com/gravitational/teleport/lib/utils" ) func newSessionChunk(timeout time.Duration) *sessionChunk { @@ -37,7 +38,8 @@ func newSessionChunk(timeout time.Duration) *sessionChunk { closeC: make(chan struct{}), inflightCond: sync.NewCond(&sync.Mutex{}), closeTimeout: timeout, - log: logrus.NewEntry(logrus.StandardLogger()), + legacyLogger: logrus.NewEntry(logrus.StandardLogger()), + log: utils.NewSlogLoggerForTests(), streamCloser: events.NewDiscardRecorder(), } } diff --git a/lib/srv/app/transport.go b/lib/srv/app/transport.go index cb545acb0846d..d019af70dbe9f 100644 --- a/lib/srv/app/transport.go +++ b/lib/srv/app/transport.go @@ -21,6 +21,7 @@ package app import ( "context" "crypto/tls" + "log/slog" "net" "net/http" "net/url" @@ -28,7 +29,6 @@ import ( "slices" "github.com/gravitational/trace" - "github.com/sirupsen/logrus" "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/types" @@ -47,7 +47,7 @@ type transportConfig struct { cipherSuites []uint16 jwt string traits wrappers.Traits - log logrus.FieldLogger + log *slog.Logger } // Check validates configuration. @@ -62,7 +62,7 @@ func (c *transportConfig) Check() error { return trace.BadParameter("jwt missing") } if c.log == nil { - c.log = logrus.WithField(teleport.ComponentKey, "transport") + c.log = slog.With(teleport.ComponentKey, "transport") } return nil @@ -185,12 +185,15 @@ func rewriteHeaders(r *http.Request, c *transportConfig) { } for _, header := range c.app.GetRewrite().Headers { if common.IsReservedHeader(header.Name) { - c.log.Debugf("Not rewriting Teleport header %q.", header.Name) + c.log.DebugContext(r.Context(), "Not rewriting Teleport reserved header", "header_name", header.Name) continue } values, err := services.ApplyValueTraits(header.Value, c.traits) if err != nil { - c.log.Debugf("Failed to apply traits to %q: %v.", header.Value, err) + c.log.DebugContext(r.Context(), "Failed to apply traits", + "header_value", header.Value, + "error", err, + ) continue } r.Header.Del(header.Name) diff --git a/lib/srv/app/watcher.go b/lib/srv/app/watcher.go index c0a0745d9eba1..ac355fd6b9fd2 100644 --- a/lib/srv/app/watcher.go +++ b/lib/srv/app/watcher.go @@ -52,12 +52,12 @@ func (s *Server) startReconciler(ctx context.Context) error { select { case <-s.reconcileCh: if err := reconciler.Reconcile(ctx); err != nil { - s.log.WithError(err).Error("Failed to reconcile.") + s.log.ErrorContext(ctx, "Failed to reconcile.", "error", err) } else if s.c.OnReconcile != nil { s.c.OnReconcile(s.getApps()) } case <-ctx.Done(): - s.log.Debug("Reconciler done.") + s.log.DebugContext(ctx, "Reconciler done.") return } } @@ -69,10 +69,10 @@ func (s *Server) startReconciler(ctx context.Context) error { // registers/unregisters the proxied applications accordingly. func (s *Server) startResourceWatcher(ctx context.Context) (*services.AppWatcher, error) { if len(s.c.ResourceMatchers) == 0 { - s.log.Debug("Not initializing application resource watcher.") + s.log.DebugContext(ctx, "Not initializing application resource watcher.") return nil, nil } - s.log.Debug("Initializing application resource watcher.") + s.log.DebugContext(ctx, "Initializing application resource watcher.") watcher, err := services.NewAppWatcher(ctx, services.AppWatcherConfig{ ResourceWatcherConfig: services.ResourceWatcherConfig{ Component: teleport.ComponentApp, @@ -100,7 +100,7 @@ func (s *Server) startResourceWatcher(ctx context.Context) (*services.AppWatcher return } case <-ctx.Done(): - s.log.Debug("Application resource watcher done.") + s.log.DebugContext(ctx, "Application resource watcher done.") return } } @@ -118,7 +118,10 @@ func (s *Server) guessPublicAddr(app types.Application) types.Application { if err == nil { appCopy.Spec.PublicAddr = pubAddr } else { - s.log.WithError(err).Errorf("Unable to find public address for app %q, leaving empty.", app.GetName()) + s.log.ErrorContext(s.closeContext, "Unable to find public address for app, leaving empty", + "app_name", app.GetName(), + "error", err, + ) } return appCopy } From 4104ec17d82587f8906e64c75a87adcdbdebbaa9 Mon Sep 17 00:00:00 2001 From: Bartosz Leper Date: Thu, 24 Oct 2024 10:42:29 +0200 Subject: [PATCH 45/70] Tweak the react-select custom components (#47855) --- .../shared/components/Select/Select.story.tsx | 3 ++ .../shared/components/Select/Select.tsx | 46 +++++++++---------- 2 files changed, 26 insertions(+), 23 deletions(-) diff --git a/web/packages/shared/components/Select/Select.story.tsx b/web/packages/shared/components/Select/Select.story.tsx index a6c0a104e8843..a5ae58852ef9c 100644 --- a/web/packages/shared/components/Select/Select.story.tsx +++ b/web/packages/shared/components/Select/Select.story.tsx @@ -144,6 +144,7 @@ export function Selects() { options={options} placeholder="Click to select a role" isMulti={true} + isClearable={true} /> @@ -162,6 +163,7 @@ export function Selects() { options={options} placeholder="Click to select a role" isMulti={true} + isClearable={true} /> @@ -180,6 +182,7 @@ export function Selects() { options={options} placeholder="Click to select a role" isMulti={true} + isClearable={true} /> diff --git a/web/packages/shared/components/Select/Select.tsx b/web/packages/shared/components/Select/Select.tsx index fc9b3eac0fe9d..8a14974e2c303 100644 --- a/web/packages/shared/components/Select/Select.tsx +++ b/web/packages/shared/components/Select/Select.tsx @@ -22,6 +22,7 @@ import ReactSelect, { DropdownIndicatorProps, GroupBase, MultiValueRemoveProps, + components, } from 'react-select'; import ReactSelectAsync from 'react-select/async'; import CreatableSelect from 'react-select/creatable'; @@ -165,39 +166,27 @@ export function SelectCreatableAsync< ); } -function DropdownIndicator({ selectProps }: DropdownIndicatorProps) { - const { size = 'medium' } = selectProps.customProps; - const { indicatorPadding } = selectGeometry[size]; +function DropdownIndicator(props: DropdownIndicatorProps) { return ( - + + + ); } -function ClearIndicator({ selectProps, clearValue }: ClearIndicatorProps) { - const { size = 'medium' } = selectProps.customProps; - const { indicatorPadding } = selectGeometry[size]; +function ClearIndicator(props: ClearIndicatorProps) { return ( - + + + ); } function MultiValueRemove(props: MultiValueRemoveProps) { return ( - + + + ); } @@ -287,6 +276,7 @@ const StyledSelect = styled.div<{ ${error} .react-select__dropdown-indicator { + padding: ${props => selectGeometry[props.selectSize].indicatorPadding}px; color: ${props => props.isDisabled ? props.theme.colors.text.disabled @@ -331,6 +321,15 @@ const StyledSelect = styled.div<{ border-radius: 1000px; padding: 0 0 0 12px; overflow: hidden; + + /* + * These margins keep the height of item rows consistent when the select + * goes multiline. They do so by keeping flex line height consistent between + * the lines containing only value pills and those with the input container. + */ + margin-top: 6px; + margin-bottom: 6px; + .react-select__multi-value__label { color: ${props => props.theme.colors.text.main}; padding: 0 2px 0 0; @@ -387,6 +386,7 @@ const StyledSelect = styled.div<{ .react-select__clear-indicator { color: ${props => props.theme.colors.text.slightlyMuted}; + padding: ${props => selectGeometry[props.selectSize].indicatorPadding}px; &:hover, &:focus { background-color: ${props => From dec0aee0d23f74bd6c6a3841f52e4f9760e39e09 Mon Sep 17 00:00:00 2001 From: Tiago Silva Date: Thu, 24 Oct 2024 10:15:27 +0100 Subject: [PATCH 46/70] [entraid] add field to support system credentials instead of OIDC (#47861) * [entraid] add field to support system credentials instead of OIDC This PR introduces two new fields for Entra Plugins' settings: - `tenant_id`: Is the Directory to sync - `credentials_source`: defaults to system credentials instead of using OIDC to authenticate to Entra ID Both these fields are required for clusters whose access is private and can't be reached from the internet. For those cases, Azure can't validate the OIDC token Teleport shares. Signed-off-by: Tiago Silva * handle code review comments --------- Signed-off-by: Tiago Silva --- api/proto/teleport/legacy/types/types.proto | 22 +- api/types/plugin.go | 5 + api/types/plugin_test.go | 5 +- api/types/types.pb.go | 3754 ++++++++++--------- 4 files changed, 1967 insertions(+), 1819 deletions(-) diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 452fa091a0123..227b0fde27e27 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -6466,8 +6466,28 @@ message PluginEntraIDSyncSettings { // DefaultOwners are the default owners for all imported access lists. repeated string default_owners = 1; - // SSOConnectorID is the name of the Teleport SSO connector created and used by the Entra ID plugin + // SSOConnectorID is the name of the Teleport SSO connector created and used by the Entra ID plugin. string sso_connector_id = 2; + + // credentials_source specifies the source of the credentials used for authentication with Azure. + EntraIDCredentialsSource credentials_source = 3; + + // tenant_id refers to the Azure Directory that this plugin synchronizes with. + // This field is populated on a best-effort basis for legacy plugins but mandatory for plugins created after its introduction. + // For existing plugins, it is filled in using the Entra integration when utilized. + string tenant_id = 4; +} + +// EntraIDCredentialsSource defines the credentials source for Entra ID. +enum EntraIDCredentialsSource { + // ENTRAID_CREDENTIALS_SOURCE_UNKNOWN is used when the credentials source is not specified. + // Due to legacy reasons, UNKNOWN is handled as OIDC. + ENTRAID_CREDENTIALS_SOURCE_UNKNOWN = 0; + // ENTRAID_CREDENTIALS_SOURCE_OIDC indicates that the plugin will authenticate with Azure/Entra ID using OIDC. + ENTRAID_CREDENTIALS_SOURCE_OIDC = 1; + // ENTRAID_CREDENTIALS_SOURCE_SYSTEM_CREDENTIALS means the plugin will rely on system-provided credentials + // for authentication with Azure Entra ID, especially for clusters with no internet access. + ENTRAID_CREDENTIALS_SOURCE_SYSTEM_CREDENTIALS = 2; } // AccessGraphSettings controls settings for syncing access graph specific data. diff --git a/api/types/plugin.go b/api/types/plugin.go index c598856960bfa..001b854c49e0f 100644 --- a/api/types/plugin.go +++ b/api/types/plugin.go @@ -321,6 +321,11 @@ func (p *PluginV1) CheckAndSetDefaults() error { if err := settings.EntraId.Validate(); err != nil { return trace.Wrap(err) } + // backfill the credentials source if it's not set. + if settings.EntraId.SyncSettings.CredentialsSource == EntraIDCredentialsSource_ENTRAID_CREDENTIALS_SOURCE_UNKNOWN { + settings.EntraId.SyncSettings.CredentialsSource = EntraIDCredentialsSource_ENTRAID_CREDENTIALS_SOURCE_OIDC + } + case *PluginSpecV1_Scim: if settings.Scim == nil { return trace.BadParameter("Must be used with SCIM settings") diff --git a/api/types/plugin_test.go b/api/types/plugin_test.go index 0f02aa0a4296a..84dfe525cb645 100644 --- a/api/types/plugin_test.go +++ b/api/types/plugin_test.go @@ -855,8 +855,9 @@ func TestPluginEntraIDValidation(t *testing.T) { return &PluginSpecV1_EntraId{ EntraId: &PluginEntraIDSettings{ SyncSettings: &PluginEntraIDSyncSettings{ - DefaultOwners: []string{"admin"}, - SsoConnectorId: "myconnector", + DefaultOwners: []string{"admin"}, + SsoConnectorId: "myconnector", + CredentialsSource: EntraIDCredentialsSource_ENTRAID_CREDENTIALS_SOURCE_OIDC, }, }, } diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 364ed5f11124b..57f0a4a20bee8 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -796,6 +796,40 @@ func (SignatureAlgorithmSuite) EnumDescriptor() ([]byte, []int) { return fileDescriptor_9198ee693835762e, []int{20} } +// EntraIDCredentialsSource defines the credentials source for Entra ID. +type EntraIDCredentialsSource int32 + +const ( + // ENTRAID_CREDENTIALS_SOURCE_UNKNOWN is used when the credentials source is not specified. + // Due to legacy reasons, UNKNOWN is handled as OIDC. + EntraIDCredentialsSource_ENTRAID_CREDENTIALS_SOURCE_UNKNOWN EntraIDCredentialsSource = 0 + // ENTRAID_CREDENTIALS_SOURCE_OIDC indicates that the plugin will authenticate with Azure/Entra ID using OIDC. + EntraIDCredentialsSource_ENTRAID_CREDENTIALS_SOURCE_OIDC EntraIDCredentialsSource = 1 + // ENTRAID_CREDENTIALS_SOURCE_SYSTEM_CREDENTIALS means the plugin will rely on system-provided credentials + // for authentication with Azure Entra ID, especially for clusters with no internet access. + EntraIDCredentialsSource_ENTRAID_CREDENTIALS_SOURCE_SYSTEM_CREDENTIALS EntraIDCredentialsSource = 2 +) + +var EntraIDCredentialsSource_name = map[int32]string{ + 0: "ENTRAID_CREDENTIALS_SOURCE_UNKNOWN", + 1: "ENTRAID_CREDENTIALS_SOURCE_OIDC", + 2: "ENTRAID_CREDENTIALS_SOURCE_SYSTEM_CREDENTIALS", +} + +var EntraIDCredentialsSource_value = map[string]int32{ + "ENTRAID_CREDENTIALS_SOURCE_UNKNOWN": 0, + "ENTRAID_CREDENTIALS_SOURCE_OIDC": 1, + "ENTRAID_CREDENTIALS_SOURCE_SYSTEM_CREDENTIALS": 2, +} + +func (x EntraIDCredentialsSource) String() string { + return proto.EnumName(EntraIDCredentialsSource_name, int32(x)) +} + +func (EntraIDCredentialsSource) EnumDescriptor() ([]byte, []int) { + return fileDescriptor_9198ee693835762e, []int{21} +} + type PluginStatusCode int32 const ( @@ -834,7 +868,7 @@ func (x PluginStatusCode) String() string { } func (PluginStatusCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{21} + return fileDescriptor_9198ee693835762e, []int{22} } // OktaPluginSyncStatusCode indicates the possible states of an Okta @@ -870,7 +904,7 @@ func (x OktaPluginSyncStatusCode) String() string { } func (OktaPluginSyncStatusCode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{22} + return fileDescriptor_9198ee693835762e, []int{23} } // HeadlessAuthenticationState is a headless authentication state. @@ -905,7 +939,7 @@ func (x HeadlessAuthenticationState) String() string { } func (HeadlessAuthenticationState) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{23} + return fileDescriptor_9198ee693835762e, []int{24} } // InstallParamEnrollMode is the mode used to enroll the node into the cluster. @@ -938,7 +972,7 @@ func (x InstallParamEnrollMode) String() string { } func (InstallParamEnrollMode) EnumDescriptor() ([]byte, []int) { - return fileDescriptor_9198ee693835762e, []int{24} + return fileDescriptor_9198ee693835762e, []int{25} } // The type of a KeepAlive. When adding a new type, please double-check @@ -16505,8 +16539,14 @@ var xxx_messageInfo_PluginEntraIDSettings proto.InternalMessageInfo type PluginEntraIDSyncSettings struct { // DefaultOwners are the default owners for all imported access lists. DefaultOwners []string `protobuf:"bytes,1,rep,name=default_owners,json=defaultOwners,proto3" json:"default_owners,omitempty"` - // SSOConnectorID is the name of the Teleport SSO connector created and used by the Entra ID plugin - SsoConnectorId string `protobuf:"bytes,2,opt,name=sso_connector_id,json=ssoConnectorId,proto3" json:"sso_connector_id,omitempty"` + // SSOConnectorID is the name of the Teleport SSO connector created and used by the Entra ID plugin. + SsoConnectorId string `protobuf:"bytes,2,opt,name=sso_connector_id,json=ssoConnectorId,proto3" json:"sso_connector_id,omitempty"` + // credentials_source specifies the source of the credentials used for authentication with Azure. + CredentialsSource EntraIDCredentialsSource `protobuf:"varint,3,opt,name=credentials_source,json=credentialsSource,proto3,enum=types.EntraIDCredentialsSource" json:"credentials_source,omitempty"` + // tenant_id refers to the Azure Directory that this plugin synchronizes with. + // This field is populated on a best-effort basis for legacy plugins but mandatory for plugins created after its introduction. + // For existing plugins, it is filled in using the Entra integration when utilized. + TenantId string `protobuf:"bytes,4,opt,name=tenant_id,json=tenantId,proto3" json:"tenant_id,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -20306,6 +20346,7 @@ func init() { proto.RegisterEnum("types.AlertSeverity", AlertSeverity_name, AlertSeverity_value) proto.RegisterEnum("types.RequireMFAType", RequireMFAType_name, RequireMFAType_value) proto.RegisterEnum("types.SignatureAlgorithmSuite", SignatureAlgorithmSuite_name, SignatureAlgorithmSuite_value) + proto.RegisterEnum("types.EntraIDCredentialsSource", EntraIDCredentialsSource_name, EntraIDCredentialsSource_value) proto.RegisterEnum("types.PluginStatusCode", PluginStatusCode_name, PluginStatusCode_value) proto.RegisterEnum("types.OktaPluginSyncStatusCode", OktaPluginSyncStatusCode_name, OktaPluginSyncStatusCode_value) proto.RegisterEnum("types.HeadlessAuthenticationState", HeadlessAuthenticationState_name, HeadlessAuthenticationState_value) @@ -20704,1816 +20745,1821 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 28929 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6d, 0x70, 0x5c, 0x59, - 0x76, 0x18, 0x36, 0xdd, 0x8d, 0x8f, 0xc6, 0xc1, 0x57, 0xe3, 0x02, 0x24, 0x41, 0xcc, 0x70, 0x9a, - 0xf3, 0x66, 0x86, 0x43, 0xce, 0xce, 0x90, 0x4b, 0x70, 0x87, 0xbb, 0xb3, 0xf3, 0xb5, 0x8d, 0x0f, - 0x92, 0x4d, 0x82, 0x00, 0xf6, 0x35, 0x48, 0xee, 0x68, 0x3f, 0xde, 0x3e, 0x74, 0x5f, 0x00, 0x6f, - 0xd8, 0xdd, 0xaf, 0xf7, 0xbd, 0xd7, 0x24, 0xb1, 0xb2, 0x63, 0xc9, 0xb6, 0xac, 0xa8, 0x1c, 0x59, - 0x96, 0x23, 0x59, 0xeb, 0x94, 0xac, 0xa8, 0x94, 0x38, 0x51, 0x39, 0x65, 0x55, 0x22, 0x45, 0x95, - 0xc4, 0xaa, 0xc8, 0x92, 0x4b, 0xa5, 0xa8, 0x54, 0x29, 0x4b, 0x95, 0x28, 0x5f, 0x1b, 0x15, 0x14, - 0x45, 0xf9, 0x91, 0xa0, 0x2a, 0x55, 0x52, 0x5c, 0x95, 0x8f, 0x75, 0xc9, 0x4e, 0xdd, 0x73, 0xcf, - 0x7d, 0xef, 0xde, 0xd7, 0xaf, 0x81, 0xc6, 0x0c, 0x57, 0x16, 0xb7, 0xf4, 0x87, 0x44, 0x9f, 0x7b, - 0xce, 0xb9, 0xef, 0x7e, 0x9f, 0x7b, 0xee, 0xf9, 0x80, 0x97, 0x22, 0xde, 0xe4, 0x1d, 0x3f, 0x88, - 0xae, 0x34, 0xf9, 0xae, 0x5b, 0xdf, 0xbf, 0x12, 0xed, 0x77, 0x78, 0x28, 0xff, 0xbd, 0xdc, 0x09, - 0xfc, 0xc8, 0x67, 0xc3, 0xf8, 0x63, 0x61, 0x6e, 0xd7, 0xdf, 0xf5, 0x11, 0x72, 0x45, 0xfc, 0x25, - 0x0b, 0x17, 0x5e, 0xdc, 0xf5, 0xfd, 0xdd, 0x26, 0xbf, 0x82, 0xbf, 0xb6, 0xbb, 0x3b, 0x57, 0x1a, - 0xdd, 0xc0, 0x8d, 0x3c, 0xbf, 0x4d, 0xe5, 0xe5, 0x74, 0x79, 0xe4, 0xb5, 0x78, 0x18, 0xb9, 0xad, - 0x4e, 0x3f, 0x06, 0x8f, 0x03, 0xb7, 0xd3, 0xe1, 0x01, 0xd5, 0xbe, 0x70, 0x29, 0xfe, 0x40, 0x37, - 0x8a, 0x04, 0xa5, 0x60, 0x7e, 0xe5, 0xd1, 0x55, 0xfd, 0x27, 0xa1, 0xbe, 0x99, 0xdd, 0x16, 0xc5, - 0x30, 0xc5, 0xd9, 0xfa, 0x99, 0x02, 0x8c, 0xdd, 0xe1, 0xbc, 0x53, 0x69, 0x7a, 0x8f, 0x38, 0x7b, - 0x19, 0x86, 0xd6, 0xdd, 0x16, 0x9f, 0xcf, 0x9d, 0xcf, 0x5d, 0x1c, 0x5b, 0x9a, 0x3e, 0x3c, 0x28, - 0x8f, 0x87, 0x3c, 0x78, 0xc4, 0x03, 0xa7, 0xed, 0xb6, 0xb8, 0x8d, 0x85, 0xec, 0x53, 0x30, 0x26, - 0xfe, 0x0f, 0x3b, 0x6e, 0x9d, 0xcf, 0xe7, 0x11, 0x73, 0xf2, 0xf0, 0xa0, 0x3c, 0xd6, 0x56, 0x40, - 0x3b, 0x29, 0x67, 0x55, 0x18, 0x5d, 0x7d, 0xd2, 0xf1, 0x02, 0x1e, 0xce, 0x0f, 0x9d, 0xcf, 0x5d, - 0x1c, 0x5f, 0x5c, 0xb8, 0x2c, 0xdb, 0x7a, 0x59, 0xb5, 0xf5, 0xf2, 0x96, 0xea, 0x8c, 0xa5, 0xd9, - 0xdf, 0x3a, 0x28, 0x3f, 0x77, 0x78, 0x50, 0x1e, 0xe5, 0x92, 0xe4, 0x6f, 0xff, 0x41, 0x39, 0x67, - 0x2b, 0x7a, 0xf6, 0x2e, 0x0c, 0x6d, 0xed, 0x77, 0xf8, 0xfc, 0xd8, 0xf9, 0xdc, 0xc5, 0xa9, 0xc5, - 0x17, 0x2f, 0xcb, 0xe1, 0x89, 0x3f, 0x3e, 0xf9, 0x4b, 0x60, 0x2d, 0x15, 0x0f, 0x0f, 0xca, 0x43, - 0x02, 0xc5, 0x46, 0x2a, 0xf6, 0x26, 0x8c, 0xdc, 0xf2, 0xc3, 0xa8, 0xba, 0x32, 0x0f, 0xf8, 0xc9, - 0xa7, 0x0e, 0x0f, 0xca, 0x33, 0x7b, 0x7e, 0x18, 0x39, 0x5e, 0xe3, 0x0d, 0xbf, 0xe5, 0x45, 0xbc, - 0xd5, 0x89, 0xf6, 0x6d, 0x42, 0xb2, 0x9e, 0xc0, 0xa4, 0xc1, 0x8f, 0x8d, 0xc3, 0xe8, 0xbd, 0xf5, - 0x3b, 0xeb, 0x1b, 0x0f, 0xd6, 0x4b, 0xcf, 0xb1, 0x22, 0x0c, 0xad, 0x6f, 0xac, 0xac, 0x96, 0x72, - 0x6c, 0x14, 0x0a, 0x95, 0xcd, 0xcd, 0x52, 0x9e, 0x4d, 0x40, 0x71, 0xa5, 0xb2, 0x55, 0x59, 0xaa, - 0xd4, 0x56, 0x4b, 0x05, 0x36, 0x0b, 0xd3, 0x0f, 0xaa, 0xeb, 0x2b, 0x1b, 0x0f, 0x6a, 0xce, 0xca, - 0x6a, 0xed, 0xce, 0xd6, 0xc6, 0x66, 0x69, 0x88, 0x4d, 0x01, 0xdc, 0xb9, 0xb7, 0xb4, 0x6a, 0xaf, - 0xaf, 0x6e, 0xad, 0xd6, 0x4a, 0xc3, 0x6c, 0x0e, 0x4a, 0x8a, 0xc4, 0xa9, 0xad, 0xda, 0xf7, 0xab, - 0xcb, 0xab, 0xa5, 0x91, 0xdb, 0x43, 0xc5, 0x42, 0x69, 0xc8, 0x1e, 0x5d, 0xe3, 0x6e, 0xc8, 0xab, - 0x2b, 0xd6, 0xbf, 0x57, 0x80, 0xe2, 0x5d, 0x1e, 0xb9, 0x0d, 0x37, 0x72, 0xd9, 0x0b, 0xc6, 0xf8, - 0x60, 0x13, 0xb5, 0x81, 0x79, 0xb9, 0x77, 0x60, 0x86, 0x0f, 0x0f, 0xca, 0xb9, 0x37, 0xf5, 0x01, - 0x79, 0x07, 0xc6, 0x57, 0x78, 0x58, 0x0f, 0xbc, 0x8e, 0x98, 0x34, 0xf3, 0x05, 0x44, 0x3b, 0x7b, - 0x78, 0x50, 0x3e, 0xd5, 0x48, 0xc0, 0x5a, 0x87, 0xe8, 0xd8, 0xac, 0x0a, 0x23, 0x6b, 0xee, 0x36, - 0x6f, 0x86, 0xf3, 0xc3, 0xe7, 0x0b, 0x17, 0xc7, 0x17, 0x9f, 0xa7, 0x41, 0x50, 0x1f, 0x78, 0x59, - 0x96, 0xae, 0xb6, 0xa3, 0x60, 0x7f, 0x69, 0xee, 0xf0, 0xa0, 0x5c, 0x6a, 0x22, 0x40, 0xef, 0x60, - 0x89, 0xc2, 0x6a, 0xc9, 0xc4, 0x18, 0x39, 0x76, 0x62, 0x9c, 0xfb, 0xad, 0x83, 0x72, 0x4e, 0x0c, - 0x18, 0x4d, 0x8c, 0x84, 0x9f, 0x39, 0x45, 0x16, 0xa1, 0x68, 0xf3, 0x47, 0x5e, 0x28, 0x5a, 0x56, - 0xc4, 0x96, 0x9d, 0x3e, 0x3c, 0x28, 0xb3, 0x80, 0x60, 0xda, 0x67, 0xc4, 0x78, 0x0b, 0x6f, 0xc3, - 0xb8, 0xf6, 0xd5, 0xac, 0x04, 0x85, 0x87, 0x7c, 0x5f, 0xf6, 0xb0, 0x2d, 0xfe, 0x64, 0x73, 0x30, - 0xfc, 0xc8, 0x6d, 0x76, 0xa9, 0x4b, 0x6d, 0xf9, 0xe3, 0xf3, 0xf9, 0xcf, 0xe5, 0x6e, 0x0f, 0x15, - 0x47, 0x4b, 0x45, 0x3b, 0x5f, 0x5d, 0xb1, 0xfe, 0xce, 0x10, 0x14, 0x6d, 0x5f, 0x2e, 0x44, 0x76, - 0x09, 0x86, 0x6b, 0x91, 0x1b, 0xa9, 0x61, 0x9a, 0x3d, 0x3c, 0x28, 0x4f, 0x8b, 0x45, 0xca, 0xb5, - 0xfa, 0x25, 0x86, 0x40, 0xdd, 0xdc, 0x73, 0x43, 0x35, 0x5c, 0x88, 0xda, 0x11, 0x00, 0x1d, 0x15, - 0x31, 0xd8, 0x05, 0x18, 0xba, 0xeb, 0x37, 0x38, 0x8d, 0x18, 0x3b, 0x3c, 0x28, 0x4f, 0xb5, 0xfc, - 0x86, 0x8e, 0x88, 0xe5, 0xec, 0x0d, 0x18, 0x5b, 0xee, 0x06, 0x01, 0x6f, 0x8b, 0xb9, 0x3e, 0x84, - 0xc8, 0x53, 0x87, 0x07, 0x65, 0xa8, 0x4b, 0xa0, 0xe3, 0x35, 0xec, 0x04, 0x41, 0x0c, 0x43, 0x2d, - 0x72, 0x83, 0x88, 0x37, 0xe6, 0x87, 0x07, 0x1a, 0x06, 0xb1, 0x3e, 0x67, 0x42, 0x49, 0x92, 0x1e, - 0x06, 0xe2, 0xc4, 0x6e, 0xc1, 0xf8, 0xcd, 0xc0, 0xad, 0xf3, 0x4d, 0x1e, 0x78, 0x7e, 0x03, 0xc7, - 0xb7, 0xb0, 0x74, 0xe1, 0xf0, 0xa0, 0x7c, 0x7a, 0x57, 0x80, 0x9d, 0x0e, 0xc2, 0x13, 0xea, 0xef, - 0x1c, 0x94, 0x8b, 0x2b, 0xb4, 0x65, 0xda, 0x3a, 0x29, 0xfb, 0xba, 0x18, 0x9c, 0x30, 0xc2, 0xae, - 0xe5, 0x8d, 0xf9, 0xd1, 0x63, 0x3f, 0xd1, 0xa2, 0x4f, 0x3c, 0xdd, 0x74, 0xc3, 0xc8, 0x09, 0x24, - 0x5d, 0xea, 0x3b, 0x75, 0x96, 0x6c, 0x03, 0x8a, 0xb5, 0xfa, 0x1e, 0x6f, 0x74, 0x9b, 0x1c, 0xa7, - 0xcc, 0xf8, 0xe2, 0x19, 0x9a, 0xd4, 0x6a, 0x3c, 0x55, 0xf1, 0xd2, 0x02, 0xf1, 0x66, 0x21, 0x41, - 0xf4, 0xf9, 0xa4, 0xb0, 0x3e, 0x5f, 0xfc, 0xd6, 0xcf, 0x96, 0x9f, 0xfb, 0x81, 0xdf, 0x3f, 0xff, - 0x9c, 0xf5, 0x9f, 0xe5, 0xa1, 0x94, 0x66, 0xc2, 0x76, 0x60, 0xf2, 0x5e, 0xa7, 0xe1, 0x46, 0x7c, - 0xb9, 0xe9, 0xf1, 0x76, 0x14, 0xe2, 0x24, 0x39, 0xba, 0x4d, 0xaf, 0x50, 0xbd, 0xf3, 0x5d, 0x24, - 0x74, 0xea, 0x92, 0x32, 0xd5, 0x2a, 0x93, 0x6d, 0x52, 0x4f, 0x0d, 0x37, 0xf0, 0x10, 0x67, 0xd8, - 0xc9, 0xea, 0x91, 0x5b, 0x7f, 0x9f, 0x7a, 0x88, 0x2d, 0x4d, 0xa0, 0x76, 0x63, 0x7b, 0x1f, 0x67, - 0xe6, 0xe0, 0x13, 0x48, 0x90, 0x64, 0x4c, 0x20, 0x01, 0xb6, 0xfe, 0xb7, 0x1c, 0x4c, 0xd9, 0x3c, - 0xf4, 0xbb, 0x41, 0x9d, 0xdf, 0xe2, 0x6e, 0x83, 0x07, 0x62, 0xfa, 0xdf, 0xf1, 0xda, 0x0d, 0x5a, - 0x53, 0x38, 0xfd, 0x1f, 0x7a, 0x6d, 0x7d, 0xeb, 0xc6, 0x72, 0xf6, 0x69, 0x18, 0xad, 0x75, 0xb7, - 0x11, 0x35, 0x9f, 0xec, 0x00, 0x61, 0x77, 0xdb, 0x49, 0xa1, 0x2b, 0x34, 0x76, 0x05, 0x46, 0xef, - 0xf3, 0x20, 0x4c, 0x76, 0x43, 0x3c, 0x1a, 0x1e, 0x49, 0x90, 0x4e, 0x40, 0x58, 0xec, 0x66, 0xb2, - 0x23, 0xd3, 0xa1, 0x36, 0x9d, 0xda, 0x07, 0x93, 0xa9, 0xd2, 0x22, 0x88, 0x3e, 0x55, 0x14, 0x96, - 0xf5, 0xe3, 0x79, 0x28, 0xad, 0xb8, 0x91, 0xbb, 0xed, 0x86, 0xd4, 0x9f, 0xf7, 0xaf, 0x89, 0x3d, - 0x5e, 0x6b, 0x28, 0xee, 0xf1, 0xe2, 0xcb, 0x3f, 0x76, 0xf3, 0x5e, 0x4d, 0x37, 0x6f, 0x5c, 0x9c, - 0xb0, 0xd4, 0xbc, 0xa4, 0x51, 0xef, 0x1d, 0xdf, 0xa8, 0x12, 0x35, 0xaa, 0xa8, 0x1a, 0x95, 0x34, - 0x85, 0xbd, 0x07, 0x43, 0xb5, 0x0e, 0xaf, 0xd3, 0x26, 0xa2, 0xce, 0x05, 0xb3, 0x71, 0x02, 0xe1, - 0xfe, 0xb5, 0xa5, 0x09, 0x62, 0x33, 0x14, 0x76, 0x78, 0xdd, 0x46, 0x32, 0x6d, 0xd1, 0xfc, 0xe7, - 0x05, 0x98, 0xcb, 0x22, 0xd3, 0xdb, 0x31, 0x72, 0x44, 0x3b, 0x2e, 0x42, 0x51, 0x1c, 0xe1, 0xe2, - 0x58, 0xc4, 0xed, 0x62, 0x6c, 0x69, 0x42, 0x7c, 0xf2, 0x1e, 0xc1, 0xec, 0xb8, 0x94, 0xbd, 0x1c, - 0x4b, 0x04, 0xc5, 0x84, 0x1f, 0x49, 0x04, 0x4a, 0x0e, 0x10, 0x63, 0xad, 0x96, 0x30, 0x0a, 0x0e, - 0x49, 0xb7, 0x28, 0x70, 0x32, 0xd6, 0x01, 0x41, 0x8c, 0x63, 0x46, 0x1d, 0x0a, 0xab, 0x50, 0x54, - 0xcd, 0x9a, 0x9f, 0x40, 0x46, 0x33, 0xa9, 0x4e, 0xba, 0x7f, 0x4d, 0x0e, 0x66, 0x83, 0x7e, 0xeb, - 0x6c, 0x14, 0x0e, 0xbb, 0x06, 0xc5, 0xcd, 0xc0, 0x7f, 0xb2, 0x5f, 0x5d, 0x09, 0xe7, 0x27, 0xcf, - 0x17, 0x2e, 0x8e, 0x2d, 0x9d, 0x39, 0x3c, 0x28, 0xcf, 0x76, 0x04, 0xcc, 0xf1, 0x1a, 0xfa, 0x49, - 0x1b, 0x23, 0xde, 0x1e, 0x2a, 0xe6, 0x4a, 0xf9, 0xdb, 0x43, 0xc5, 0x7c, 0xa9, 0x20, 0xc5, 0x8b, - 0xdb, 0x43, 0xc5, 0xa1, 0xd2, 0xf0, 0xed, 0xa1, 0xe2, 0x30, 0x0a, 0x1c, 0x63, 0x25, 0xb8, 0x3d, - 0x54, 0x1c, 0x2f, 0x4d, 0x18, 0xa7, 0x3d, 0x32, 0x88, 0xfc, 0xba, 0xdf, 0xb4, 0x0b, 0xf7, 0xec, - 0xaa, 0x3d, 0xb2, 0x5c, 0x59, 0xe6, 0x41, 0x64, 0x17, 0x2a, 0x0f, 0x6a, 0xf6, 0xe4, 0xca, 0x7e, - 0xdb, 0x6d, 0x79, 0x75, 0x79, 0x74, 0xda, 0x85, 0x9b, 0xcb, 0x9b, 0x56, 0x05, 0xa6, 0x92, 0xb6, - 0xac, 0x79, 0x61, 0xc4, 0xae, 0xc0, 0x98, 0x82, 0x88, 0x8d, 0xae, 0x90, 0xd9, 0x6a, 0x3b, 0xc1, - 0xb1, 0x7e, 0x33, 0x0f, 0x90, 0x94, 0x3c, 0xa3, 0x6b, 0xe1, 0xb3, 0xc6, 0x5a, 0x38, 0x95, 0x5e, - 0x0b, 0x7d, 0x57, 0x01, 0xfb, 0x00, 0x46, 0x84, 0x58, 0xd0, 0x55, 0x22, 0xd1, 0x99, 0x34, 0x29, - 0x16, 0xde, 0xbf, 0xb6, 0x34, 0x45, 0xc4, 0x23, 0x21, 0x42, 0x6c, 0x22, 0xd3, 0x96, 0xd1, 0xcf, - 0x8c, 0x26, 0x83, 0x41, 0x0b, 0xe8, 0x22, 0xc4, 0x03, 0x4a, 0x1d, 0x8a, 0x2b, 0xa3, 0xa3, 0x06, - 0x39, 0x2e, 0x65, 0x67, 0x41, 0x0c, 0x38, 0x75, 0xea, 0xe8, 0xe1, 0x41, 0xb9, 0xd0, 0x0d, 0x3c, - 0x9c, 0x04, 0xec, 0x0a, 0xd0, 0x34, 0xa0, 0x0e, 0x14, 0xb3, 0x6f, 0xa6, 0xee, 0x3a, 0x75, 0x1e, - 0x44, 0x49, 0x8f, 0xcf, 0xe7, 0xd4, 0x6c, 0x61, 0x1d, 0x30, 0xa7, 0xca, 0xfc, 0x10, 0x4e, 0x83, - 0x8b, 0x99, 0xbd, 0x72, 0xd9, 0x40, 0x95, 0x62, 0xe4, 0x79, 0x75, 0x2a, 0x35, 0x64, 0x99, 0xd3, - 0x23, 0x52, 0x9a, 0x15, 0xb0, 0x6b, 0x20, 0x66, 0x28, 0xf5, 0x3e, 0x50, 0x3d, 0x95, 0x07, 0xb5, - 0xa5, 0x53, 0xc4, 0x69, 0xd2, 0x7d, 0xac, 0x93, 0x0b, 0x6c, 0xf6, 0x0e, 0x88, 0x29, 0x4c, 0xfd, - 0xce, 0x88, 0xe8, 0xe6, 0xf2, 0xe6, 0x72, 0xd3, 0xef, 0x36, 0x6a, 0x5f, 0x5c, 0x4b, 0x88, 0x77, - 0xeb, 0x1d, 0x9d, 0xf8, 0xe6, 0xf2, 0x26, 0x7b, 0x07, 0x86, 0x2b, 0xdf, 0xec, 0x06, 0x9c, 0xe4, - 0x93, 0x09, 0x55, 0xa7, 0x80, 0x2d, 0x9d, 0x21, 0xc2, 0x69, 0x57, 0xfc, 0xd4, 0xe5, 0x3a, 0x2c, - 0x17, 0x35, 0x6f, 0xad, 0xd5, 0x48, 0xf6, 0x60, 0xa9, 0x6e, 0xd9, 0x5a, 0xd3, 0x3e, 0x3b, 0x32, - 0x5a, 0x2d, 0xa8, 0xd8, 0x15, 0xc8, 0x57, 0x56, 0xf0, 0x46, 0x34, 0xbe, 0x38, 0xa6, 0xaa, 0x5d, - 0x59, 0x9a, 0x23, 0x92, 0x09, 0x57, 0x5f, 0x06, 0xf9, 0xca, 0x0a, 0x5b, 0x82, 0xe1, 0xbb, 0xfb, - 0xb5, 0x2f, 0xae, 0xd1, 0x66, 0x36, 0xab, 0xe6, 0xb5, 0x80, 0x6d, 0xe0, 0xb2, 0x0f, 0x93, 0x2f, - 0x6e, 0xed, 0x87, 0xdf, 0x68, 0xea, 0x5f, 0x8c, 0x68, 0x6c, 0x13, 0xc6, 0x2a, 0x8d, 0x96, 0xd7, - 0xbe, 0x17, 0xf2, 0x60, 0x7e, 0x1c, 0xf9, 0xcc, 0xa7, 0xbe, 0x3b, 0x2e, 0x5f, 0x9a, 0x3f, 0x3c, - 0x28, 0xcf, 0xb9, 0xe2, 0xa7, 0xd3, 0x0d, 0x79, 0xa0, 0x71, 0x4b, 0x98, 0xb0, 0x4d, 0x80, 0xbb, - 0x7e, 0x7b, 0xd7, 0xaf, 0x44, 0x4d, 0x37, 0x4c, 0x6d, 0x8f, 0x49, 0x41, 0x2c, 0x3e, 0x9c, 0x6a, - 0x09, 0x98, 0xe3, 0x0a, 0xa0, 0xc6, 0x50, 0xe3, 0xc1, 0x6e, 0xc0, 0xc8, 0x46, 0xe0, 0xd6, 0x9b, - 0x7c, 0x7e, 0x12, 0xb9, 0xcd, 0x11, 0x37, 0x09, 0x54, 0x2d, 0x9d, 0x27, 0x86, 0x25, 0x1f, 0xc1, - 0xfa, 0x35, 0x45, 0x22, 0x2e, 0x3c, 0x00, 0xd6, 0x3b, 0x27, 0x33, 0x2e, 0x09, 0x9f, 0xd2, 0x2f, - 0x09, 0xc9, 0xa2, 0x5f, 0xf6, 0x5b, 0x2d, 0xb7, 0xdd, 0x40, 0xda, 0xfb, 0x8b, 0xda, 0xdd, 0xc1, - 0xfa, 0x06, 0xcc, 0xf4, 0x74, 0xd6, 0x31, 0xf7, 0xbb, 0xf7, 0x61, 0x7a, 0x85, 0xef, 0xb8, 0xdd, - 0x66, 0x14, 0x9f, 0x24, 0x72, 0x89, 0xe2, 0x4d, 0xab, 0x21, 0x8b, 0x1c, 0x75, 0x7c, 0xd8, 0x69, - 0x64, 0xeb, 0x3d, 0x98, 0x34, 0x9a, 0x2f, 0xae, 0x0a, 0x95, 0x6e, 0xc3, 0x8b, 0x70, 0x20, 0x73, - 0xc9, 0x55, 0xc1, 0x15, 0x40, 0x1c, 0x2e, 0x3b, 0x41, 0xb0, 0xfe, 0x7d, 0x5d, 0x5a, 0xa1, 0x9d, - 0x48, 0x5c, 0xab, 0x69, 0x3f, 0xc8, 0x25, 0xb2, 0x53, 0xcf, 0x7e, 0x10, 0xef, 0x06, 0x97, 0xe4, - 0xda, 0xcc, 0xf7, 0xac, 0xcd, 0x71, 0x1a, 0x89, 0x82, 0xfb, 0x38, 0x94, 0x2b, 0x32, 0x9e, 0xa9, - 0x85, 0x8f, 0x3f, 0x53, 0x3f, 0x80, 0x89, 0xbb, 0x6e, 0xdb, 0xdd, 0xe5, 0x0d, 0xd1, 0x02, 0xb9, - 0xf7, 0x8c, 0x2d, 0x3d, 0x7f, 0x78, 0x50, 0x3e, 0xd3, 0x92, 0x70, 0x6c, 0xa5, 0x3e, 0x89, 0x0c, - 0x02, 0x76, 0x55, 0xad, 0xec, 0xe1, 0x8c, 0x95, 0x3d, 0x49, 0xb5, 0x0f, 0xe3, 0xca, 0xa6, 0xf5, - 0x6c, 0xfd, 0xda, 0x18, 0xb6, 0x91, 0xbd, 0x01, 0x23, 0x36, 0xdf, 0x15, 0x47, 0x4d, 0x2e, 0x19, - 0xa4, 0x00, 0x21, 0x7a, 0xc7, 0x48, 0x1c, 0x94, 0x33, 0x78, 0x23, 0xdc, 0xf3, 0x76, 0x22, 0xea, - 0x9d, 0x58, 0xce, 0x20, 0xb0, 0x26, 0x67, 0x10, 0xc4, 0xbc, 0xce, 0x4a, 0x98, 0xd8, 0xfd, 0xec, - 0x95, 0x1a, 0x75, 0x9a, 0xea, 0x61, 0x7b, 0x45, 0xdb, 0x46, 0x02, 0x43, 0x4a, 0x10, 0xd8, 0xec, - 0x3a, 0x8c, 0x55, 0xea, 0x75, 0xbf, 0xab, 0xdd, 0x19, 0xe5, 0xba, 0x95, 0x40, 0x53, 0x45, 0x92, - 0xa0, 0xb2, 0x1a, 0x8c, 0xaf, 0x8a, 0x8b, 0x96, 0xb7, 0xec, 0xd6, 0xf7, 0x54, 0x27, 0xa9, 0x3d, - 0x4c, 0x2b, 0x49, 0x56, 0x2e, 0x47, 0x60, 0x5d, 0x00, 0x75, 0x25, 0x83, 0x86, 0xcb, 0xb6, 0x60, - 0xbc, 0xc6, 0xeb, 0x01, 0x8f, 0x6a, 0x91, 0x1f, 0xf0, 0xd4, 0x96, 0xac, 0x95, 0x2c, 0xbd, 0xa8, - 0xee, 0x7a, 0x21, 0x02, 0x9d, 0x50, 0x40, 0x75, 0xae, 0x1a, 0xb2, 0x14, 0xda, 0x5b, 0x7e, 0xb0, - 0xbf, 0xb2, 0x44, 0xdb, 0x74, 0x72, 0xa6, 0x4b, 0xb0, 0x2e, 0xb4, 0x0b, 0x48, 0x63, 0xdb, 0x14, - 0xda, 0x25, 0x16, 0x8e, 0xd4, 0x4a, 0x0d, 0x65, 0x2b, 0xda, 0xb4, 0xa7, 0x93, 0x5e, 0x46, 0xb0, - 0x36, 0x52, 0x8d, 0x10, 0x25, 0x33, 0x63, 0xa4, 0x08, 0x8b, 0x75, 0x80, 0xa9, 0x51, 0x93, 0x82, - 0x6e, 0x93, 0x87, 0x21, 0xed, 0xe5, 0x67, 0x53, 0x83, 0x9f, 0x20, 0x2c, 0xbd, 0x4a, 0xcc, 0xcf, - 0xa9, 0x69, 0x40, 0xf7, 0x34, 0x51, 0xa8, 0xd5, 0x93, 0xc1, 0x9b, 0xbd, 0x0d, 0xb0, 0xfa, 0x24, - 0xe2, 0x41, 0xdb, 0x6d, 0xc6, 0x7a, 0x30, 0x54, 0xfd, 0x70, 0x82, 0x9a, 0x03, 0xad, 0x21, 0xb3, - 0x65, 0x98, 0xac, 0x84, 0x61, 0xb7, 0xc5, 0x6d, 0xbf, 0xc9, 0x2b, 0xf6, 0x3a, 0xee, 0xfb, 0x63, - 0x4b, 0xe7, 0x0e, 0x0f, 0xca, 0x67, 0x5d, 0x2c, 0x70, 0x02, 0xbf, 0xc9, 0x1d, 0x37, 0xd0, 0x67, - 0xb7, 0x49, 0xc3, 0x36, 0x00, 0x36, 0x3a, 0xbc, 0x5d, 0xe3, 0x6e, 0x50, 0xdf, 0x4b, 0x6d, 0xf3, - 0x49, 0xc1, 0xd2, 0x0b, 0xd4, 0xc2, 0x39, 0xbf, 0xc3, 0xdb, 0x21, 0xc2, 0xf4, 0xaf, 0x4a, 0x30, - 0xd9, 0x03, 0x98, 0xae, 0x56, 0xee, 0x6e, 0xfa, 0x4d, 0xaf, 0xbe, 0x4f, 0x92, 0xd3, 0x14, 0x6a, - 0x07, 0x4f, 0x13, 0xd7, 0x54, 0xa9, 0xdc, 0x9e, 0x3c, 0xb7, 0xe5, 0x74, 0x10, 0xea, 0x90, 0xfc, - 0x94, 0xe6, 0xc2, 0x3e, 0x14, 0x73, 0x30, 0x14, 0xc2, 0xe0, 0x96, 0xbb, 0x1b, 0xce, 0x4f, 0x1b, - 0xda, 0xae, 0xca, 0x83, 0xda, 0x65, 0xad, 0x54, 0x8a, 0x29, 0x0b, 0x72, 0x22, 0x22, 0xd4, 0x89, - 0xdc, 0xdd, 0xd0, 0x9c, 0x88, 0x31, 0x36, 0xbb, 0x0d, 0xb0, 0xe2, 0xd7, 0xbb, 0x2d, 0xde, 0x8e, - 0x56, 0x96, 0xe6, 0x4b, 0xe6, 0x55, 0x20, 0x2e, 0x48, 0xb6, 0xb6, 0x86, 0x5f, 0x37, 0x66, 0xa2, - 0x46, 0xbd, 0xf0, 0x3e, 0x94, 0xd2, 0x1f, 0x72, 0x42, 0x05, 0xd6, 0x64, 0x69, 0x4a, 0x6b, 0xfd, - 0xea, 0x13, 0x2f, 0x8c, 0x42, 0xeb, 0xfb, 0x8d, 0x15, 0x28, 0x76, 0x87, 0x3b, 0x7c, 0x7f, 0x33, - 0xe0, 0x3b, 0xde, 0x13, 0xda, 0xcc, 0x70, 0x77, 0x78, 0xc8, 0xf7, 0x9d, 0x0e, 0x42, 0xf5, 0xdd, - 0x21, 0x46, 0x65, 0x9f, 0x81, 0xe2, 0x9d, 0xbb, 0xb5, 0x3b, 0x7c, 0xbf, 0xba, 0x42, 0x07, 0x95, - 0x24, 0x6b, 0x85, 0x8e, 0x20, 0x35, 0xe6, 0x5a, 0x8c, 0x69, 0x2d, 0x25, 0x3b, 0xa1, 0xa8, 0x79, - 0xb9, 0xd9, 0x0d, 0x23, 0x1e, 0x54, 0x57, 0xf4, 0x9a, 0xeb, 0x12, 0x98, 0xda, 0x97, 0x62, 0x54, - 0xeb, 0x5f, 0xe5, 0x71, 0x17, 0x14, 0x13, 0xbe, 0xda, 0x0e, 0x23, 0xb7, 0x5d, 0xe7, 0x31, 0x03, - 0x9c, 0xf0, 0x1e, 0x41, 0x53, 0x13, 0x3e, 0x41, 0x36, 0xab, 0xce, 0x0f, 0x5c, 0xb5, 0xa8, 0x52, - 0x69, 0x2e, 0xaa, 0x2b, 0xba, 0x7a, 0x35, 0x20, 0x68, 0xaa, 0xca, 0x04, 0x99, 0x5d, 0x80, 0xd1, - 0x6a, 0xe5, 0x6e, 0xa5, 0x1b, 0xed, 0xe1, 0x1e, 0x5c, 0x94, 0xf2, 0xb9, 0x98, 0xad, 0x6e, 0x37, - 0xda, 0xb3, 0x55, 0x21, 0xbb, 0x82, 0xf7, 0x9e, 0x36, 0x8f, 0xa4, 0x1a, 0x96, 0x0e, 0xdd, 0x50, - 0x82, 0x52, 0xd7, 0x1e, 0x01, 0x62, 0xaf, 0xc3, 0xf0, 0xfd, 0xcd, 0xe5, 0xea, 0x0a, 0x5d, 0x9c, - 0xf1, 0x24, 0x7a, 0xd4, 0xa9, 0x9b, 0x5f, 0x22, 0x51, 0xd8, 0x2a, 0x4c, 0xd5, 0x78, 0xbd, 0x1b, - 0x78, 0xd1, 0xfe, 0xcd, 0xc0, 0xef, 0x76, 0xc2, 0xf9, 0x51, 0xac, 0x03, 0x57, 0x7a, 0x48, 0x25, - 0xce, 0x2e, 0x16, 0x69, 0xd4, 0x29, 0x22, 0xeb, 0xd7, 0x73, 0xc9, 0x36, 0xc9, 0x2e, 0x18, 0x62, - 0x0d, 0xea, 0x6e, 0x84, 0x58, 0xa3, 0xeb, 0x6e, 0x50, 0xc0, 0xb1, 0x81, 0x2d, 0x77, 0xc3, 0xc8, - 0x6f, 0xad, 0xb6, 0x1b, 0x1d, 0xdf, 0x6b, 0x47, 0x48, 0x25, 0x3b, 0xdf, 0x3a, 0x3c, 0x28, 0xbf, - 0x58, 0xc7, 0x52, 0x87, 0x53, 0xb1, 0x93, 0xe2, 0x92, 0x41, 0xfd, 0x09, 0xc6, 0xc3, 0xfa, 0xed, - 0xbc, 0x71, 0xbc, 0x89, 0xcf, 0xb3, 0x79, 0xa7, 0xe9, 0xd5, 0xf1, 0x46, 0x8f, 0x0d, 0x8d, 0x67, - 0x15, 0x7e, 0x5e, 0x90, 0x94, 0xca, 0x1e, 0x32, 0x79, 0x67, 0x50, 0xb3, 0x2f, 0xc0, 0x84, 0x90, - 0x34, 0xe8, 0x67, 0x38, 0x9f, 0xc7, 0xce, 0x7e, 0x01, 0xb5, 0x70, 0x21, 0x0f, 0x62, 0x36, 0x86, - 0x88, 0xa2, 0x53, 0xb0, 0x06, 0xcc, 0x6f, 0x05, 0x6e, 0x3b, 0xf4, 0xa2, 0xd5, 0x76, 0x3d, 0xd8, - 0x47, 0xc9, 0x68, 0xb5, 0xed, 0x6e, 0x37, 0x79, 0x03, 0x9b, 0x5b, 0x5c, 0xba, 0x78, 0x78, 0x50, - 0x7e, 0x25, 0x92, 0x38, 0x0e, 0x8f, 0x91, 0x1c, 0x2e, 0xb1, 0x34, 0xce, 0x7d, 0x39, 0x09, 0x49, - 0x4a, 0x75, 0x2b, 0x3e, 0xc2, 0x48, 0x21, 0x01, 0x25, 0xa9, 0x78, 0x34, 0xc4, 0x1e, 0xa6, 0x7f, - 0xa6, 0x4e, 0x60, 0xfd, 0xdf, 0xb9, 0xe4, 0x00, 0x66, 0xef, 0xc2, 0x38, 0xad, 0x18, 0x6d, 0x5e, - 0xe0, 0x0e, 0xaa, 0x96, 0x57, 0x6a, 0x64, 0x75, 0x74, 0x71, 0xef, 0xaf, 0x2c, 0xaf, 0x69, 0x73, - 0x03, 0xef, 0xfd, 0x6e, 0xbd, 0x99, 0xa6, 0x52, 0x68, 0x62, 0x12, 0x6c, 0xad, 0xd5, 0xcc, 0x5e, - 0xc1, 0x49, 0x10, 0x35, 0xc3, 0x8c, 0x6e, 0xd0, 0x90, 0x3f, 0x79, 0xc3, 0xff, 0x87, 0x5c, 0xd6, - 0x39, 0xcf, 0x96, 0x60, 0xf2, 0x81, 0x1f, 0x3c, 0xc4, 0xf1, 0xd5, 0x3a, 0x01, 0x47, 0xfe, 0xb1, - 0x2a, 0x48, 0x37, 0xc8, 0x24, 0xd1, 0xbf, 0x4d, 0xeb, 0x0d, 0xf3, 0xdb, 0x52, 0x1c, 0x0c, 0x02, - 0x31, 0x0e, 0x31, 0xc7, 0x78, 0x75, 0xe0, 0x38, 0x24, 0x9f, 0x60, 0x4c, 0x61, 0x1d, 0xdd, 0xfa, - 0x2f, 0x73, 0xfa, 0x79, 0x2e, 0x3a, 0x79, 0xc5, 0x6f, 0xb9, 0x5e, 0x5b, 0x6b, 0x8e, 0x7c, 0x58, - 0x42, 0x68, 0xfa, 0x4b, 0x34, 0x64, 0x76, 0x0d, 0x8a, 0xf2, 0x57, 0xbc, 0xd7, 0xa2, 0x56, 0x8b, - 0x08, 0xcd, 0x83, 0x42, 0x21, 0xf6, 0x8c, 0x4c, 0xe1, 0xa4, 0x23, 0xf3, 0x6b, 0x39, 0xfd, 0x28, - 0xfe, 0xb8, 0x87, 0x4d, 0xea, 0x90, 0xc9, 0x9f, 0xe4, 0x90, 0xf9, 0xc4, 0x4d, 0xf8, 0x81, 0x1c, - 0x8c, 0x6b, 0x5a, 0x0a, 0xd1, 0x86, 0xcd, 0xc0, 0xff, 0x88, 0xd7, 0x23, 0xb3, 0x0d, 0x1d, 0x09, - 0x4c, 0xb5, 0x21, 0x46, 0xfd, 0x04, 0x6d, 0xb0, 0xfe, 0x24, 0x47, 0x77, 0xa4, 0x81, 0xb7, 0x79, - 0x73, 0x4b, 0xce, 0x9f, 0xe4, 0x88, 0xfc, 0x02, 0x0c, 0xdb, 0xbc, 0xe1, 0x85, 0x74, 0xbf, 0x99, - 0xd1, 0xef, 0x63, 0x58, 0x90, 0xc8, 0x4d, 0x81, 0xf8, 0xa9, 0x9f, 0x6f, 0x58, 0x2e, 0x04, 0xd9, - 0x6a, 0x78, 0xa3, 0xc9, 0x9f, 0x78, 0x72, 0x31, 0xd2, 0x51, 0x8b, 0xc7, 0x9b, 0x17, 0x3a, 0x3b, - 0xa2, 0x84, 0x24, 0x6a, 0x7d, 0xe1, 0x19, 0x34, 0xd6, 0x87, 0x00, 0x49, 0x95, 0xec, 0x0e, 0x94, - 0x68, 0x36, 0x78, 0xed, 0x5d, 0x29, 0x48, 0x51, 0x1f, 0x94, 0x0f, 0x0f, 0xca, 0xcf, 0xd7, 0xe3, - 0x32, 0x92, 0x3a, 0x35, 0xbe, 0x3d, 0x84, 0xd6, 0x7f, 0x98, 0x87, 0x7c, 0x05, 0x07, 0xe4, 0x0e, - 0xdf, 0x8f, 0xdc, 0xed, 0x1b, 0x5e, 0xd3, 0x58, 0x4c, 0x0f, 0x11, 0xea, 0xec, 0x78, 0x86, 0xba, - 0x42, 0x43, 0x16, 0x8b, 0xe9, 0x4e, 0xb0, 0xfd, 0x16, 0x12, 0x6a, 0x8b, 0xe9, 0x61, 0xb0, 0xfd, - 0x56, 0x9a, 0x2c, 0x46, 0x64, 0x16, 0x8c, 0xc8, 0x85, 0x45, 0x73, 0x10, 0x0e, 0x0f, 0xca, 0x23, - 0x72, 0xfd, 0xd9, 0x54, 0xc2, 0xce, 0x42, 0xa1, 0xb6, 0xb9, 0x4e, 0x3b, 0x20, 0xaa, 0x05, 0xc3, - 0x4e, 0xdb, 0x16, 0x30, 0x51, 0xe7, 0xda, 0x4a, 0x65, 0x13, 0x15, 0x01, 0xc3, 0x49, 0x9d, 0xcd, - 0x86, 0xdb, 0x49, 0xab, 0x02, 0x62, 0x44, 0xf6, 0x1e, 0x8c, 0xdf, 0x59, 0x59, 0xbe, 0xe5, 0x87, - 0x72, 0xf7, 0x1a, 0x49, 0x26, 0xff, 0xc3, 0x46, 0xdd, 0x41, 0x4d, 0x7c, 0xfa, 0x18, 0xd0, 0xf0, - 0xad, 0x1f, 0xca, 0xc3, 0xb8, 0xa6, 0x27, 0x63, 0x9f, 0xa1, 0x07, 0xd2, 0x9c, 0x71, 0x03, 0xd0, - 0x30, 0x44, 0xa9, 0x54, 0xaa, 0xb4, 0xfc, 0x06, 0xa7, 0xe7, 0xd2, 0x44, 0x81, 0x91, 0x1f, 0x44, - 0x81, 0xf1, 0x36, 0x80, 0x9c, 0x03, 0xf8, 0xc9, 0x9a, 0x38, 0xa1, 0xd9, 0x49, 0xe8, 0xe3, 0x92, - 0x20, 0xb3, 0xfb, 0x30, 0xbb, 0x15, 0x74, 0xc3, 0xa8, 0xb6, 0x1f, 0x46, 0xbc, 0x25, 0xb8, 0x6d, - 0xfa, 0x7e, 0x93, 0xe6, 0xdf, 0x2b, 0x87, 0x07, 0xe5, 0xf3, 0x91, 0x28, 0x76, 0x42, 0x2c, 0xc7, - 0x0f, 0x70, 0x3a, 0xbe, 0xaf, 0xab, 0x35, 0xb2, 0x18, 0x58, 0x36, 0x4c, 0xe8, 0x4a, 0x11, 0x71, - 0xb2, 0xd0, 0x63, 0x12, 0xa9, 0xba, 0xb5, 0x93, 0x85, 0xbe, 0xb2, 0xf7, 0x71, 0xcb, 0x24, 0xb1, - 0x3e, 0xa3, 0x2b, 0xe4, 0x06, 0x5d, 0xd8, 0xd6, 0x5f, 0xcd, 0x25, 0xdb, 0xc8, 0xfd, 0xab, 0xec, - 0x1d, 0x18, 0x91, 0x8f, 0x77, 0xf4, 0xc6, 0x79, 0x2a, 0xbe, 0xd4, 0xea, 0x2f, 0x7b, 0x52, 0x13, - 0xfe, 0xbb, 0xf2, 0x81, 0xff, 0x39, 0x9b, 0x48, 0x62, 0x25, 0xba, 0xa9, 0x4f, 0x53, 0xdc, 0x51, - 0x5d, 0x7c, 0x35, 0x4b, 0x89, 0x6e, 0xfd, 0xc6, 0x10, 0x4c, 0x99, 0x68, 0xfa, 0x0b, 0x5f, 0x6e, - 0xa0, 0x17, 0xbe, 0x2f, 0x40, 0x51, 0xf4, 0x87, 0x57, 0xe7, 0x4a, 0x22, 0x7b, 0x05, 0x9f, 0x16, - 0x08, 0x66, 0xbc, 0x5c, 0x83, 0x1c, 0x0e, 0x71, 0xc7, 0xb5, 0x63, 0x2a, 0xb6, 0xa8, 0x3d, 0x43, - 0x15, 0x12, 0x21, 0x45, 0x3d, 0x43, 0xe9, 0xeb, 0x21, 0x7e, 0x90, 0x7a, 0x13, 0x46, 0x84, 0x7c, - 0x1f, 0xab, 0x60, 0xf0, 0x2b, 0x85, 0xe8, 0x9f, 0x32, 0x51, 0x91, 0x48, 0xec, 0x01, 0x14, 0xd7, - 0xdc, 0x30, 0xaa, 0x71, 0xde, 0x1e, 0xe0, 0xed, 0xbe, 0x4c, 0x5d, 0x35, 0x8b, 0x0f, 0xe3, 0x21, - 0xe7, 0xed, 0xd4, 0xe3, 0x6b, 0xcc, 0x8c, 0x7d, 0x15, 0x60, 0xd9, 0x6f, 0x47, 0x81, 0xdf, 0x5c, - 0xf3, 0x77, 0xe7, 0x47, 0xf0, 0xee, 0xfb, 0x62, 0x6a, 0x00, 0x12, 0x04, 0x79, 0xfd, 0x8d, 0x15, - 0x3c, 0x75, 0x59, 0xe0, 0x34, 0xfd, 0x5d, 0x7d, 0x1d, 0x24, 0xf8, 0xec, 0x06, 0x94, 0x94, 0x62, - 0xe1, 0x5e, 0x67, 0x37, 0xc0, 0x09, 0x32, 0x9a, 0x48, 0x1e, 0xfc, 0x49, 0xe4, 0x74, 0x09, 0xae, - 0xef, 0x94, 0x69, 0x1a, 0xf6, 0x15, 0x38, 0x93, 0x86, 0xa9, 0x51, 0x2e, 0x26, 0x32, 0xb9, 0xce, - 0x2e, 0x63, 0xde, 0xf7, 0x63, 0x61, 0x7d, 0x27, 0x0f, 0x67, 0xfa, 0x34, 0x56, 0xac, 0x07, 0x3c, - 0xae, 0xb5, 0xf5, 0x90, 0x3a, 0xa5, 0xa5, 0xcd, 0xd1, 0x79, 0xc8, 0xd3, 0x01, 0x37, 0xb4, 0x54, - 0x3a, 0x3c, 0x28, 0x4f, 0x18, 0xe3, 0x98, 0xaf, 0xae, 0xb0, 0xdb, 0x30, 0x24, 0x86, 0x68, 0x80, - 0xa7, 0x73, 0xa5, 0x53, 0x9a, 0x8a, 0x3c, 0x7d, 0xfa, 0xe0, 0xd0, 0x21, 0x0f, 0xf6, 0x19, 0x28, - 0x6c, 0x6d, 0xad, 0xe1, 0xdc, 0x29, 0x60, 0xdb, 0x27, 0xa3, 0xa8, 0x69, 0x4c, 0xd5, 0x49, 0x41, - 0x7b, 0x39, 0xb6, 0xb4, 0x10, 0xe8, 0xec, 0x4b, 0x29, 0x93, 0x9e, 0xd7, 0x8f, 0x1e, 0xe8, 0xc1, - 0x2d, 0x7c, 0x3e, 0x81, 0x61, 0x8d, 0xf5, 0xd3, 0xf9, 0x64, 0x0d, 0xdf, 0xf0, 0x9a, 0x11, 0x0f, - 0xd8, 0x82, 0x5c, 0x92, 0x89, 0x70, 0x66, 0xc7, 0xbf, 0xd9, 0x7c, 0xb2, 0xbe, 0x25, 0xab, 0x78, - 0x21, 0xbf, 0xae, 0x2d, 0xe4, 0x02, 0x2e, 0xe4, 0xa9, 0xbe, 0x4b, 0xf6, 0xf5, 0x8c, 0x79, 0x89, - 0x0b, 0x31, 0x63, 0xee, 0xbd, 0x02, 0x93, 0xeb, 0xfe, 0xea, 0x93, 0x28, 0x46, 0x14, 0x0b, 0xb0, - 0x68, 0x9b, 0x40, 0xc1, 0x71, 0xa3, 0xd9, 0xe0, 0xc1, 0xd6, 0x9e, 0xdb, 0x36, 0xde, 0xae, 0xed, - 0x1e, 0xb8, 0xc0, 0x5d, 0xe7, 0x8f, 0x4d, 0xdc, 0x51, 0x89, 0x9b, 0x86, 0x5b, 0x3f, 0x98, 0x57, - 0x9d, 0x71, 0x7f, 0xf1, 0x19, 0x7d, 0x23, 0x7d, 0xcb, 0x78, 0x23, 0x9d, 0x8d, 0xb5, 0xbb, 0xf1, - 0x83, 0xff, 0xe2, 0x31, 0x76, 0x02, 0xff, 0xe3, 0x30, 0x4c, 0xe8, 0xe8, 0xa2, 0x1f, 0x2a, 0x8d, - 0x46, 0xa0, 0xf7, 0x83, 0xdb, 0x68, 0x04, 0x36, 0x42, 0x0d, 0xb3, 0x80, 0xc2, 0x91, 0x66, 0x01, - 0x5f, 0x83, 0xb1, 0xe5, 0x56, 0xc3, 0x78, 0xac, 0xb4, 0x32, 0x3e, 0xef, 0x72, 0x8c, 0x24, 0xd7, - 0x42, 0xac, 0xb4, 0xac, 0xb7, 0x1a, 0xbd, 0x4f, 0x94, 0x09, 0x4b, 0xc3, 0xa2, 0x60, 0xf8, 0x93, - 0x58, 0x14, 0x5c, 0x87, 0xb1, 0x7b, 0x21, 0xdf, 0xea, 0xb6, 0xdb, 0xbc, 0x89, 0xd3, 0xaa, 0x28, - 0x65, 0xfd, 0x6e, 0xc8, 0x9d, 0x08, 0xa1, 0xfa, 0x07, 0xc4, 0xa8, 0xfa, 0x00, 0x8f, 0x1e, 0x31, - 0xc0, 0xd7, 0xa0, 0xb8, 0xc9, 0x79, 0x80, 0x7d, 0x3a, 0x9e, 0x88, 0x74, 0x1d, 0xce, 0x03, 0x47, - 0x74, 0xac, 0x61, 0x69, 0x40, 0x88, 0x86, 0x79, 0xc2, 0xc4, 0x80, 0xe6, 0x09, 0xec, 0x25, 0x98, - 0xe8, 0x74, 0xb7, 0x9b, 0x5e, 0x1d, 0xf9, 0x92, 0x5d, 0x83, 0x3d, 0x2e, 0x61, 0x82, 0x6d, 0xc8, - 0xbe, 0x04, 0x93, 0x78, 0xc7, 0x89, 0xa7, 0xdc, 0x94, 0xf1, 0xaa, 0x67, 0x94, 0x49, 0x49, 0xa7, - 0x2e, 0x40, 0x4e, 0x86, 0xf9, 0x8d, 0xc9, 0x68, 0xa1, 0x06, 0x53, 0xe6, 0x48, 0x3e, 0x85, 0xc7, - 0xbd, 0xd8, 0xd4, 0xa2, 0x58, 0x1a, 0xbb, 0x3d, 0x54, 0x84, 0xd2, 0xb8, 0x34, 0xb2, 0xb0, 0x61, - 0x33, 0x6e, 0x93, 0xcd, 0xee, 0x74, 0xb7, 0x79, 0xd0, 0xe6, 0x11, 0x0f, 0xe9, 0x12, 0x10, 0xda, - 0x43, 0x95, 0x4e, 0x27, 0xb4, 0xfe, 0xd3, 0x3c, 0x8c, 0x56, 0x1e, 0xd4, 0xaa, 0xed, 0x1d, 0x1f, - 0x9f, 0xe8, 0xe2, 0x97, 0x19, 0xfd, 0x89, 0x2e, 0x7e, 0x99, 0xd1, 0xdf, 0x63, 0xae, 0x64, 0x5c, - 0xe3, 0xd0, 0x8a, 0x57, 0xbb, 0xc6, 0x19, 0x17, 0xd0, 0xe4, 0x91, 0xaa, 0x30, 0xc0, 0x23, 0x55, - 0xac, 0x47, 0x1c, 0x3a, 0x5e, 0x8f, 0xf8, 0x0e, 0x8c, 0x57, 0xdb, 0x11, 0xdf, 0x0d, 0x92, 0x99, - 0x1e, 0x5f, 0x29, 0x63, 0xb0, 0x2e, 0xda, 0x6b, 0xd8, 0x62, 0x1a, 0x49, 0xdd, 0x65, 0xac, 0xb3, - 0xc4, 0x69, 0x24, 0x55, 0x9c, 0x29, 0x7d, 0x80, 0x42, 0xb4, 0x56, 0x52, 0x73, 0x44, 0x19, 0x02, - 0x48, 0xe1, 0x73, 0x2a, 0x51, 0xde, 0x8b, 0x8e, 0x5d, 0x9a, 0xc9, 0x36, 0x04, 0xb0, 0x7e, 0x38, - 0x0f, 0xe3, 0x95, 0x4e, 0xe7, 0x19, 0x37, 0xc7, 0xfa, 0x9c, 0xb1, 0xbd, 0xaa, 0xbb, 0x50, 0xdc, - 0xae, 0x81, 0x2c, 0xb1, 0x7e, 0x21, 0x0f, 0xd3, 0x29, 0x0a, 0xfd, 0xeb, 0x73, 0x03, 0x1a, 0x61, - 0xe5, 0x07, 0x34, 0xc2, 0x2a, 0x0c, 0x66, 0x84, 0x35, 0xf4, 0x49, 0xb6, 0xcc, 0xd7, 0xa0, 0x50, - 0xe9, 0x74, 0xd2, 0x8f, 0xb9, 0x9d, 0xce, 0xfd, 0x6b, 0xf2, 0x3e, 0xeb, 0x76, 0x3a, 0xb6, 0xc0, - 0x30, 0xf6, 0xb1, 0x91, 0x01, 0xf7, 0x31, 0xeb, 0x4d, 0x18, 0x43, 0x5e, 0x68, 0xfa, 0x74, 0x1e, - 0x70, 0x31, 0x93, 0xd5, 0x93, 0x51, 0x17, 0x2d, 0xf3, 0x7f, 0x91, 0x83, 0x61, 0xfc, 0xfd, 0x8c, - 0xce, 0xb1, 0x45, 0x63, 0x8e, 0x95, 0xb4, 0x39, 0x36, 0xc8, 0xec, 0xfa, 0x87, 0x05, 0x80, 0xe5, - 0x0d, 0xbb, 0x26, 0xd5, 0x1e, 0xec, 0x06, 0x4c, 0xbb, 0xcd, 0xa6, 0xff, 0x98, 0x37, 0x1c, 0x3f, - 0xf0, 0x76, 0xbd, 0xb6, 0xec, 0x39, 0xf5, 0xc2, 0x68, 0x16, 0xe9, 0xef, 0x0e, 0x54, 0xb4, 0x21, - 0x4b, 0x74, 0x3e, 0x2d, 0x1e, 0xed, 0xf9, 0x0d, 0x75, 0x81, 0x33, 0xf8, 0x50, 0x51, 0x06, 0x9f, - 0xbb, 0xb2, 0x44, 0xe7, 0xb3, 0x87, 0x17, 0x52, 0x25, 0x3f, 0x1a, 0x7c, 0xa8, 0x28, 0x83, 0x8f, - 0xbc, 0xc5, 0x86, 0x6c, 0x0d, 0x66, 0x10, 0xe2, 0xd4, 0x03, 0xde, 0xe0, 0xed, 0xc8, 0x73, 0x9b, - 0x21, 0x5d, 0xf9, 0x51, 0x39, 0xd4, 0x53, 0xa8, 0x5f, 0x79, 0xb0, 0x70, 0x39, 0x29, 0x63, 0x97, - 0x61, 0xb4, 0xe5, 0x3e, 0x71, 0xdc, 0x5d, 0xf9, 0xd6, 0x3e, 0x29, 0xaf, 0x88, 0x04, 0xd2, 0x37, - 0xec, 0x96, 0xfb, 0xa4, 0xb2, 0xcb, 0x45, 0x2b, 0xf8, 0x93, 0x8e, 0x1f, 0x6a, 0xad, 0x18, 0x49, - 0x5a, 0x91, 0x2a, 0xd2, 0x5b, 0x41, 0x45, 0xd4, 0x0a, 0xeb, 0xff, 0x19, 0xc6, 0xa9, 0x4d, 0x9b, - 0x00, 0x99, 0x87, 0xe5, 0x32, 0xcc, 0xc3, 0xde, 0x06, 0xed, 0x88, 0xd3, 0x55, 0x7b, 0xda, 0x01, - 0xaf, 0x5f, 0x0b, 0x13, 0x64, 0xf6, 0x30, 0x6d, 0x28, 0x56, 0xc0, 0x95, 0xf3, 0x72, 0x7a, 0x5e, - 0x3d, 0x15, 0x1b, 0xb1, 0x5b, 0xc0, 0xaa, 0x6d, 0x7c, 0xcd, 0xe2, 0xb5, 0x87, 0x5e, 0xe7, 0x3e, - 0x0f, 0xbc, 0x9d, 0x7d, 0x1a, 0x17, 0x14, 0xa2, 0x3c, 0x2a, 0x75, 0xc2, 0x87, 0x5e, 0x47, 0xdc, - 0x1b, 0xbd, 0x9d, 0x7d, 0x3b, 0x83, 0x86, 0x7d, 0x00, 0xa3, 0x36, 0x7f, 0x1c, 0x78, 0x91, 0x32, - 0x7f, 0x98, 0x8a, 0xb5, 0x1c, 0x08, 0x95, 0x43, 0x14, 0xc8, 0x1f, 0xfa, 0x62, 0xa5, 0x72, 0xb6, - 0x28, 0x4f, 0x29, 0x69, 0xe6, 0x30, 0x99, 0xb4, 0xb6, 0xf2, 0xa0, 0xd6, 0xef, 0x90, 0x62, 0x97, - 0x60, 0x18, 0x8f, 0x3a, 0x12, 0xe0, 0xd0, 0x6d, 0x00, 0x05, 0x1e, 0xfd, 0x1c, 0x46, 0x0c, 0xf6, - 0x22, 0x40, 0xfc, 0x5c, 0x14, 0xce, 0x17, 0x51, 0xb4, 0xd2, 0x20, 0xe9, 0x73, 0x7a, 0xec, 0x44, - 0xe7, 0xf4, 0x1a, 0x94, 0x6c, 0xfe, 0x8d, 0xae, 0x17, 0xf0, 0x46, 0xa5, 0x83, 0x6f, 0x12, 0xe1, - 0x3c, 0xe0, 0x04, 0x3b, 0x7f, 0x78, 0x50, 0x7e, 0x21, 0xa0, 0x32, 0xc7, 0xed, 0xc8, 0xa7, 0x0c, - 0x63, 0x76, 0xa7, 0x29, 0xd9, 0xdb, 0x30, 0x24, 0x76, 0x04, 0x32, 0x29, 0x53, 0xba, 0xdd, 0x64, - 0x93, 0x90, 0x37, 0xed, 0xba, 0x6f, 0x4c, 0x55, 0x24, 0xf9, 0xee, 0x99, 0x69, 0xfd, 0x42, 0x1e, - 0x5e, 0x8e, 0x0f, 0xc1, 0x8d, 0xa0, 0x56, 0xb9, 0xbb, 0x56, 0x6d, 0x6c, 0xd2, 0x9d, 0x71, 0x33, - 0xf0, 0x1f, 0x79, 0x0d, 0x1e, 0xdc, 0xbf, 0x7a, 0xcc, 0x16, 0xbe, 0x26, 0x97, 0x8f, 0x54, 0x38, - 0xe7, 0x0d, 0x83, 0x16, 0x4d, 0xd6, 0x20, 0x9b, 0x9b, 0x4e, 0xa7, 0x47, 0xff, 0x7c, 0xeb, 0x39, - 0x3b, 0x61, 0xc0, 0xfe, 0x6a, 0x0e, 0x4e, 0x67, 0x7f, 0x08, 0xe9, 0x11, 0xca, 0xea, 0xbe, 0xd2, - 0xe7, 0x6b, 0x97, 0x5e, 0x3b, 0x3c, 0x28, 0xbf, 0x1c, 0xba, 0xad, 0xa6, 0xe3, 0x35, 0x64, 0x6d, - 0x5e, 0x9d, 0x3b, 0x1d, 0x42, 0x30, 0xea, 0xed, 0x53, 0xd3, 0xe7, 0x41, 0xed, 0xe4, 0xf3, 0xb9, - 0x25, 0x80, 0xa2, 0xd2, 0xe9, 0x59, 0xbf, 0x9c, 0x03, 0x6d, 0x6a, 0x17, 0x6d, 0xde, 0xf0, 0x02, - 0x5e, 0x8f, 0x68, 0x37, 0x27, 0x77, 0x1c, 0x09, 0x4b, 0xd9, 0x2f, 0x21, 0x8c, 0xbd, 0x0f, 0xa3, - 0xb4, 0xeb, 0xe0, 0xc6, 0x9d, 0x2c, 0x09, 0xd2, 0x16, 0x4a, 0xbf, 0xad, 0x9e, 0x1d, 0x4b, 0x11, - 0x89, 0x5b, 0xd1, 0xed, 0x07, 0x5b, 0xcb, 0x4d, 0xd7, 0x6b, 0x85, 0x74, 0xfa, 0x61, 0xb7, 0x7e, - 0xf4, 0x38, 0x72, 0xea, 0x08, 0xd5, 0x6f, 0x45, 0x31, 0xaa, 0x75, 0x53, 0x29, 0x2b, 0x8f, 0x31, - 0xc2, 0x2b, 0xc3, 0xf0, 0xfd, 0x44, 0x69, 0xb1, 0x34, 0x76, 0x78, 0x50, 0x96, 0xd3, 0xc5, 0x96, - 0x70, 0xeb, 0x6f, 0xe6, 0x60, 0xca, 0x9c, 0x4f, 0xec, 0x32, 0x8c, 0x90, 0x2b, 0x4c, 0x0e, 0x95, - 0x33, 0xa2, 0x17, 0x46, 0xa4, 0x13, 0x8c, 0xe1, 0xfa, 0x42, 0x58, 0xe2, 0xfc, 0x26, 0x0e, 0x74, - 0x78, 0xe1, 0xf9, 0x5d, 0x97, 0x20, 0x5b, 0x95, 0x31, 0x4b, 0x08, 0xef, 0x61, 0xb7, 0x19, 0xe9, - 0x3a, 0xfb, 0x00, 0x21, 0x36, 0x95, 0x58, 0xcb, 0x30, 0x22, 0xf7, 0x92, 0x94, 0xf1, 0x4f, 0xee, - 0x04, 0xc6, 0x3f, 0xd6, 0x41, 0x0e, 0xa0, 0x56, 0xbb, 0x75, 0x87, 0xef, 0x6f, 0xba, 0x5e, 0x80, - 0x8f, 0x4c, 0xb8, 0x6f, 0xdf, 0xa1, 0xc5, 0x35, 0x41, 0x8f, 0x4c, 0x72, 0x8f, 0x7f, 0xc8, 0xf7, - 0x8d, 0x47, 0x26, 0x85, 0x8a, 0x87, 0x43, 0xe0, 0x3d, 0x72, 0x23, 0x2e, 0x08, 0xf3, 0x48, 0x28, - 0x0f, 0x07, 0x09, 0x4d, 0x51, 0x6a, 0xc8, 0xec, 0xab, 0x30, 0x95, 0xfc, 0x8a, 0x9f, 0xca, 0xa6, - 0xe2, 0x05, 0x6c, 0x16, 0x2e, 0xbd, 0x78, 0x78, 0x50, 0x5e, 0xd0, 0xb8, 0xa6, 0x1f, 0xd1, 0x52, - 0xcc, 0xac, 0x9f, 0xcb, 0xe1, 0x03, 0xb1, 0x6a, 0xe0, 0x05, 0x18, 0x8a, 0x4d, 0x1a, 0x27, 0x68, - 0xd7, 0x31, 0x9f, 0x03, 0xb0, 0x9c, 0xbd, 0x0c, 0x85, 0xa4, 0x25, 0xb8, 0x57, 0x9b, 0x2d, 0x10, - 0xa5, 0xec, 0x26, 0x8c, 0x0e, 0xf4, 0xcd, 0xb8, 0x34, 0x32, 0xbe, 0x55, 0x51, 0xe3, 0x28, 0xdc, - 0x7e, 0xb0, 0xf5, 0xbd, 0x3b, 0x0a, 0x3f, 0x96, 0x87, 0x69, 0xd1, 0xaf, 0x95, 0x6e, 0xb4, 0xe7, - 0x07, 0x5e, 0xb4, 0xff, 0xcc, 0x6a, 0xb7, 0xde, 0x35, 0x44, 0xe3, 0x05, 0x75, 0xca, 0xe8, 0x6d, - 0x1b, 0x48, 0xc9, 0xf5, 0x5f, 0x0f, 0xc3, 0x6c, 0x06, 0x15, 0x7b, 0xc3, 0x50, 0x40, 0xcf, 0x2b, - 0x57, 0xd7, 0xef, 0x1c, 0x94, 0x27, 0x14, 0xfa, 0x56, 0xe2, 0xfa, 0xba, 0x68, 0x5a, 0x5b, 0xc8, - 0x9e, 0x42, 0x7d, 0xb4, 0x6e, 0x6d, 0x61, 0xda, 0x58, 0x5c, 0x82, 0x61, 0xdb, 0x6f, 0x72, 0x65, - 0x61, 0x84, 0x12, 0x46, 0x20, 0x00, 0xc6, 0x8b, 0xaa, 0x00, 0xb0, 0x5b, 0x30, 0x2a, 0xfe, 0xb8, - 0xeb, 0x76, 0xe8, 0xad, 0x80, 0xc5, 0x97, 0x33, 0x84, 0x76, 0xbc, 0xf6, 0xae, 0x7e, 0x3f, 0x6b, - 0x72, 0xa7, 0xe5, 0x76, 0x0c, 0x51, 0x48, 0x22, 0x1a, 0xf7, 0xbc, 0x62, 0xff, 0x7b, 0x5e, 0xee, - 0xd8, 0x7b, 0xde, 0x0e, 0x40, 0xcd, 0xdb, 0x6d, 0x7b, 0xed, 0xdd, 0x4a, 0x73, 0x97, 0x1c, 0x86, - 0x2f, 0xf5, 0x1f, 0x85, 0xcb, 0x09, 0x32, 0x4e, 0xdc, 0xe7, 0xf1, 0x41, 0x4f, 0xc2, 0x1c, 0xb7, - 0xb9, 0x6b, 0x38, 0x36, 0x68, 0x9c, 0xd9, 0x3a, 0x40, 0xa5, 0x1e, 0x79, 0x8f, 0xc4, 0x14, 0x0e, - 0x49, 0x6e, 0x51, 0x9f, 0xbc, 0x5c, 0xb9, 0xc3, 0xf7, 0x6b, 0x3c, 0x4a, 0x9e, 0x46, 0x5c, 0x44, - 0x15, 0x2b, 0xc1, 0xb0, 0x5a, 0x4f, 0x38, 0xb0, 0x0e, 0x9c, 0xaa, 0x34, 0x1a, 0x9e, 0x68, 0x83, - 0xdb, 0xc4, 0xb7, 0x3e, 0xde, 0x40, 0xd6, 0x13, 0xd9, 0xac, 0x2f, 0x11, 0xeb, 0x97, 0xdc, 0x98, - 0xca, 0x89, 0x24, 0x59, 0xba, 0x9a, 0x6c, 0xc6, 0x56, 0x0d, 0xa6, 0xcc, 0xc6, 0x9b, 0x8e, 0xce, - 0x13, 0x50, 0xb4, 0x6b, 0x15, 0xa7, 0x76, 0xab, 0x72, 0xb5, 0x94, 0x63, 0x25, 0x98, 0xa0, 0x5f, - 0x8b, 0xce, 0xe2, 0x5b, 0xd7, 0x4b, 0x79, 0x03, 0xf2, 0xd6, 0xd5, 0xc5, 0x52, 0x61, 0x21, 0x3f, - 0x9f, 0x4b, 0xf9, 0x18, 0x8d, 0x96, 0x8a, 0x52, 0x09, 0x66, 0xfd, 0x62, 0x0e, 0x8a, 0xea, 0xdb, - 0xd9, 0x75, 0x28, 0xd4, 0x6a, 0xb7, 0x52, 0x5e, 0x41, 0xc9, 0x29, 0x23, 0xf7, 0xd3, 0x30, 0xd4, - 0x4d, 0x3f, 0x05, 0x81, 0xa0, 0xdb, 0x5a, 0xab, 0x91, 0x70, 0xa0, 0xe8, 0x92, 0xcd, 0x5b, 0xd2, - 0x65, 0xb8, 0x4a, 0x5c, 0x87, 0xc2, 0xed, 0x07, 0x5b, 0x74, 0xab, 0x50, 0x74, 0xc9, 0x7e, 0x2a, - 0xe9, 0x3e, 0x7a, 0xac, 0xef, 0xf2, 0x82, 0xc0, 0xb2, 0x61, 0x5c, 0x9b, 0xc8, 0xf2, 0xd0, 0x6d, - 0xf9, 0xb1, 0x77, 0x2f, 0x1d, 0xba, 0x02, 0x62, 0x53, 0x89, 0x90, 0x11, 0xd6, 0xfc, 0xba, 0xdb, - 0xa4, 0xd3, 0x1b, 0x65, 0x84, 0xa6, 0x00, 0xd8, 0x12, 0x6e, 0xfd, 0x7a, 0x0e, 0x4a, 0x28, 0x49, - 0xa1, 0xe9, 0xa6, 0xff, 0x90, 0xb7, 0xef, 0x5f, 0x65, 0x6f, 0xaa, 0x25, 0x97, 0x8b, 0x15, 0x0e, - 0xc3, 0xb8, 0xe4, 0x52, 0x2f, 0x16, 0xb4, 0xec, 0x34, 0x07, 0xea, 0xfc, 0xe0, 0x8e, 0x97, 0xc7, - 0x38, 0x50, 0x97, 0x61, 0x18, 0x3f, 0x87, 0x36, 0x47, 0xfc, 0xf2, 0x48, 0x00, 0x6c, 0x09, 0xd7, - 0xf6, 0xa6, 0x1f, 0xcf, 0xf7, 0xb4, 0x61, 0xf1, 0x7b, 0xca, 0x79, 0xd1, 0x6c, 0xdc, 0x40, 0xfb, - 0xf5, 0x87, 0x30, 0x97, 0xee, 0x12, 0x54, 0x06, 0x55, 0x60, 0xda, 0x84, 0x2b, 0xbd, 0xd0, 0x99, - 0xcc, 0xba, 0xee, 0x2f, 0xda, 0x69, 0x7c, 0xeb, 0x7f, 0xcd, 0xc1, 0x18, 0xfe, 0x69, 0x77, 0x9b, - 0x68, 0x42, 0x53, 0x79, 0x50, 0x23, 0xc5, 0xaf, 0x2e, 0xcc, 0xb9, 0x8f, 0x43, 0x87, 0x74, 0xc3, - 0xc6, 0x1e, 0x13, 0x23, 0x13, 0xa9, 0xd4, 0xe8, 0x2a, 0xe5, 0x48, 0x4c, 0x2a, 0x55, 0xbf, 0x61, - 0x8a, 0x94, 0x90, 0xd1, 0xf0, 0xee, 0x41, 0x4d, 0x4c, 0x3f, 0xfd, 0x4d, 0x1b, 0xe9, 0xfc, 0xa6, - 0x69, 0x78, 0x27, 0xd1, 0xf0, 0x49, 0xfb, 0x41, 0xad, 0x62, 0xaf, 0x1b, 0x4f, 0xda, 0xe2, 0x1b, - 0x0d, 0x3b, 0x71, 0x42, 0xb2, 0xfe, 0x09, 0xa4, 0x3b, 0x90, 0x0e, 0xbc, 0x13, 0xae, 0x8d, 0x77, - 0x60, 0xb8, 0xd2, 0x6c, 0xfa, 0x8f, 0x69, 0x97, 0x50, 0xba, 0xa9, 0xb8, 0xff, 0xe4, 0x79, 0x86, - 0xea, 0x15, 0xc3, 0x21, 0x4b, 0x00, 0xd8, 0x32, 0x8c, 0x55, 0x1e, 0xd4, 0xaa, 0xd5, 0x95, 0xad, - 0x2d, 0xe9, 0x7c, 0x52, 0x58, 0x7a, 0x55, 0xf5, 0x8f, 0xe7, 0x35, 0x9c, 0xf4, 0xab, 0x6a, 0x22, - 0xbf, 0x27, 0x74, 0xec, 0x3d, 0x80, 0xdb, 0xbe, 0xd7, 0x96, 0xea, 0x24, 0x6a, 0xfc, 0xb9, 0xc3, - 0x83, 0xf2, 0xf8, 0x47, 0xbe, 0xd7, 0x26, 0xfd, 0x93, 0xf8, 0xf6, 0x04, 0xc9, 0xd6, 0xfe, 0x16, - 0x3d, 0xbd, 0xe4, 0x4b, 0xb3, 0x98, 0xe1, 0xa4, 0xa7, 0xb7, 0xfd, 0x1e, 0x8b, 0x18, 0x85, 0xc6, - 0x5a, 0x30, 0x5d, 0xeb, 0xee, 0xee, 0x72, 0xb1, 0xb3, 0x93, 0x02, 0x65, 0x84, 0xee, 0xb8, 0x71, - 0xc8, 0x0f, 0x79, 0x1f, 0x11, 0xb7, 0x94, 0x70, 0xe9, 0x0d, 0x31, 0x91, 0xbf, 0x7d, 0x50, 0xa6, - 0xd7, 0x5a, 0x21, 0xaa, 0x85, 0x8a, 0xbe, 0x57, 0x7d, 0x92, 0xe6, 0xcd, 0x36, 0x60, 0xe4, 0xa6, - 0x17, 0xdd, 0xea, 0x6e, 0x93, 0x33, 0xc5, 0x4b, 0x47, 0x2c, 0x1a, 0x89, 0x28, 0x9f, 0x0b, 0x76, - 0xbd, 0x68, 0xaf, 0xab, 0x9b, 0xb3, 0x13, 0x1b, 0xf6, 0x00, 0x8a, 0xcb, 0x5e, 0x50, 0x6f, 0xf2, - 0xe5, 0x2a, 0x9d, 0xfd, 0x2f, 0x1f, 0xc1, 0x52, 0xa1, 0xca, 0x7e, 0xa9, 0xe3, 0xaf, 0xba, 0xa7, - 0xcb, 0x02, 0x0a, 0x83, 0xfd, 0xdb, 0x39, 0x78, 0x3e, 0xfe, 0xfa, 0xca, 0x2e, 0x6f, 0x47, 0x77, - 0xdd, 0xa8, 0xbe, 0xc7, 0x03, 0xea, 0xa5, 0xb1, 0xa3, 0x7a, 0xe9, 0xf3, 0x3d, 0xbd, 0x74, 0x31, - 0xe9, 0x25, 0x57, 0x30, 0x73, 0x5a, 0x92, 0x5b, 0x6f, 0x9f, 0x1d, 0x55, 0x2b, 0x73, 0x00, 0x92, - 0xf7, 0x1f, 0x72, 0xc6, 0x7b, 0xf5, 0x88, 0x06, 0x27, 0xc8, 0x64, 0x44, 0x1f, 0xff, 0x36, 0xac, - 0xc0, 0x62, 0x28, 0xbb, 0xa3, 0x3c, 0x97, 0xa4, 0x54, 0x72, 0xfe, 0x08, 0xde, 0xd2, 0x9b, 0x69, - 0xf6, 0x08, 0x1f, 0x45, 0x39, 0xda, 0x6b, 0xee, 0x36, 0x09, 0x22, 0xc7, 0x8c, 0xf6, 0x9a, 0x9b, - 0x8c, 0x76, 0xd3, 0x4d, 0x8f, 0xf6, 0x9a, 0xbb, 0xcd, 0x96, 0xa5, 0xbb, 0xa5, 0xf4, 0xcd, 0x7b, - 0xf1, 0x28, 0x6e, 0xcb, 0x9b, 0xf2, 0x64, 0xce, 0x70, 0xbb, 0xfc, 0x32, 0x8c, 0xd5, 0x3a, 0x6e, - 0x9d, 0x37, 0xbd, 0x9d, 0x88, 0x1e, 0x04, 0x5f, 0x39, 0x82, 0x55, 0x8c, 0x4b, 0x8f, 0x49, 0xea, - 0xa7, 0x7e, 0x4d, 0x8a, 0x71, 0xc4, 0x17, 0x6e, 0x6d, 0xde, 0x9d, 0x9f, 0x3e, 0xf6, 0x0b, 0xb7, - 0x36, 0xef, 0x92, 0xcc, 0xd1, 0x69, 0x19, 0x32, 0xc7, 0xe6, 0x5d, 0xd6, 0x81, 0xa9, 0x2d, 0x1e, - 0x04, 0xee, 0x8e, 0x1f, 0xb4, 0xa4, 0xc2, 0x4e, 0xfa, 0x7b, 0x5c, 0x3a, 0x8a, 0x9f, 0x41, 0x20, - 0x35, 0xb5, 0x91, 0x82, 0x39, 0x69, 0x2d, 0x5f, 0x8a, 0xbf, 0xf5, 0x2b, 0x05, 0x38, 0xd3, 0xe7, - 0x2b, 0xd9, 0xba, 0xda, 0x15, 0x73, 0x86, 0x66, 0xb5, 0x0f, 0xfa, 0xe5, 0x63, 0x37, 0xca, 0x35, - 0x28, 0xad, 0xde, 0x41, 0x71, 0x5a, 0xea, 0xbc, 0x97, 0x2b, 0xea, 0x3c, 0x41, 0xed, 0x1f, 0x7f, - 0x88, 0x26, 0x6c, 0x4a, 0x57, 0x5e, 0x37, 0x7c, 0x35, 0x7b, 0x28, 0x17, 0x7e, 0x30, 0x0f, 0x43, - 0x78, 0xb6, 0xa5, 0x22, 0xd4, 0xe4, 0x4e, 0x14, 0xa1, 0xe6, 0x0b, 0x30, 0xb1, 0x7a, 0x47, 0x5e, - 0x76, 0x6f, 0xb9, 0xe1, 0x1e, 0xed, 0xbc, 0xf8, 0x22, 0xcc, 0x1f, 0x3a, 0x74, 0x37, 0xde, 0x73, - 0x0d, 0xb1, 0xd2, 0xa0, 0x60, 0xf7, 0x60, 0x56, 0x7e, 0x9b, 0xb7, 0xe3, 0xd5, 0x65, 0xa0, 0x0b, - 0xcf, 0x6d, 0xd2, 0x36, 0xfc, 0xf2, 0xe1, 0x41, 0xb9, 0xcc, 0x1f, 0xa2, 0x71, 0x1e, 0x95, 0x3b, - 0x21, 0x22, 0xe8, 0x56, 0x7a, 0x19, 0xf4, 0xba, 0xf7, 0xbd, 0x3d, 0x86, 0x15, 0x8a, 0xda, 0x44, - 0xdd, 0x02, 0x57, 0x22, 0x59, 0xbf, 0x3c, 0x0c, 0x0b, 0xfd, 0x77, 0x50, 0xf6, 0x45, 0x73, 0x00, - 0x2f, 0x1c, 0xbb, 0xe7, 0x1e, 0x3f, 0x86, 0x5f, 0x82, 0xb9, 0xd5, 0x76, 0xc4, 0x83, 0x4e, 0xe0, - 0xa9, 0x78, 0x0b, 0xb7, 0xfc, 0x50, 0x19, 0x43, 0xa2, 0x55, 0x22, 0x8f, 0xcb, 0x49, 0x2f, 0x89, - 0xa6, 0x99, 0x1a, 0xab, 0x4c, 0x0e, 0x6c, 0x15, 0xa6, 0x34, 0x78, 0xb3, 0xbb, 0x4b, 0x32, 0x83, - 0x7c, 0x7a, 0xd0, 0x78, 0x36, 0xbb, 0xba, 0xa5, 0x58, 0x8a, 0x68, 0xe1, 0xe7, 0x0a, 0x34, 0x2d, - 0x5e, 0x86, 0x42, 0xad, 0xbb, 0x4d, 0xd3, 0x41, 0x5e, 0x0e, 0x8c, 0x83, 0x44, 0x94, 0xb2, 0xcf, - 0x01, 0xd8, 0xbc, 0xe3, 0x87, 0x5e, 0xe4, 0x07, 0xfb, 0xba, 0xdb, 0x4e, 0x10, 0x43, 0x4d, 0xcb, - 0x62, 0x05, 0x65, 0xb7, 0x60, 0x3a, 0xf9, 0xb5, 0xf1, 0xb8, 0x4d, 0xca, 0xd4, 0x31, 0xa9, 0xc5, - 0x48, 0xc8, 0x1d, 0x5f, 0x94, 0xe9, 0x47, 0x63, 0x8a, 0x8c, 0x2d, 0x42, 0xf1, 0x81, 0x1f, 0x3c, - 0xdc, 0x11, 0x03, 0x35, 0x94, 0x1c, 0xde, 0x8f, 0x09, 0xa6, 0x1f, 0x52, 0x0a, 0x4f, 0xcc, 0xf9, - 0xd5, 0xf6, 0x23, 0x2f, 0xf0, 0xdb, 0x2d, 0xde, 0x8e, 0xf4, 0xd7, 0x72, 0x9e, 0x80, 0x0d, 0x87, - 0xc9, 0x04, 0x2c, 0xee, 0xea, 0x95, 0x7a, 0xe4, 0x07, 0xf4, 0x54, 0x2e, 0x87, 0x5b, 0x00, 0x8c, - 0xe1, 0x16, 0x00, 0xd1, 0x89, 0x36, 0xdf, 0xa1, 0x67, 0x03, 0xec, 0xc4, 0x80, 0xef, 0x18, 0xde, - 0xa0, 0x7c, 0x47, 0x08, 0x1f, 0x36, 0xdf, 0x41, 0x05, 0x83, 0x11, 0x44, 0x69, 0xa7, 0x47, 0x35, - 0x45, 0x68, 0xd6, 0x6f, 0x8d, 0xf5, 0x9d, 0xb7, 0x62, 0xb7, 0x3f, 0xd9, 0xbc, 0x5d, 0x73, 0x07, - 0x98, 0xb7, 0x6f, 0xc4, 0xf6, 0xca, 0xba, 0x0b, 0x34, 0x42, 0xf4, 0xe3, 0x46, 0xe2, 0x2c, 0xfc, - 0x7c, 0xf1, 0x24, 0x93, 0x88, 0x3a, 0x29, 0x3f, 0x68, 0x27, 0x15, 0x06, 0xea, 0x24, 0xb6, 0x04, - 0x93, 0x71, 0x18, 0xae, 0x4d, 0x37, 0x32, 0xf6, 0xa6, 0x38, 0x76, 0x9a, 0xd3, 0x71, 0x23, 0x7d, - 0x6f, 0x32, 0x49, 0xd8, 0xbb, 0x30, 0x4e, 0x46, 0xfb, 0xc8, 0x61, 0x38, 0x31, 0x9b, 0x54, 0x16, - 0xfe, 0x29, 0x7a, 0x1d, 0x5d, 0x2c, 0xc9, 0x4d, 0xaf, 0xc3, 0x9b, 0x5e, 0x9b, 0xd7, 0x50, 0x5b, - 0x4f, 0x33, 0x06, 0x97, 0x64, 0x87, 0x4a, 0x1c, 0xa9, 0xc8, 0x37, 0xf4, 0x74, 0x06, 0x51, 0x7a, - 0xb2, 0x8e, 0x9e, 0x68, 0xb2, 0x4a, 0xab, 0xa5, 0x60, 0xcd, 0xdf, 0xf5, 0x94, 0x9d, 0xa6, 0xb2, - 0x5a, 0x0a, 0x9c, 0xa6, 0x80, 0xa6, 0xac, 0x96, 0x24, 0xaa, 0xb8, 0x49, 0x88, 0x1f, 0xd5, 0x15, - 0x7a, 0xa2, 0xc2, 0x9b, 0x04, 0x12, 0x99, 0xc6, 0xb1, 0x12, 0x49, 0x55, 0xb3, 0xda, 0x72, 0xbd, - 0x26, 0x79, 0xba, 0x26, 0xd5, 0x70, 0x01, 0x4d, 0x57, 0x83, 0xa8, 0xac, 0x0e, 0x13, 0x36, 0xdf, - 0xd9, 0x0c, 0xfc, 0x88, 0xd7, 0x23, 0xde, 0x20, 0xe9, 0x49, 0x5d, 0x20, 0x96, 0x7c, 0x5f, 0x4a, - 0x86, 0x4b, 0x6f, 0xfe, 0xd6, 0x41, 0x39, 0xf7, 0xed, 0x83, 0x32, 0x08, 0x90, 0xb4, 0xbc, 0x3e, - 0x3c, 0x28, 0x9f, 0x11, 0xe3, 0xdf, 0x51, 0xc4, 0xfa, 0x11, 0xa3, 0x33, 0x65, 0xdf, 0x2f, 0x36, - 0xdd, 0xb8, 0x4b, 0x92, 0xca, 0x26, 0xfa, 0x54, 0xf6, 0x56, 0x66, 0x65, 0x65, 0xad, 0xb7, 0x33, - 0x2b, 0xcd, 0xac, 0x84, 0xbd, 0x07, 0xe3, 0xcb, 0xd5, 0x65, 0xbf, 0xbd, 0xe3, 0xed, 0xd6, 0x6e, - 0x55, 0x50, 0x04, 0x23, 0xab, 0xfb, 0xba, 0xe7, 0xd4, 0x11, 0xee, 0x84, 0x7b, 0xae, 0xe1, 0x7c, - 0x95, 0xe0, 0xb3, 0x9b, 0x30, 0xa5, 0x7e, 0xda, 0x7c, 0xe7, 0x9e, 0x5d, 0x45, 0xc9, 0x4b, 0xb9, - 0x3a, 0xc4, 0x1c, 0x44, 0x47, 0x74, 0x03, 0x5d, 0x22, 0x4f, 0x91, 0x89, 0xc9, 0xb8, 0xc2, 0x3b, - 0x4d, 0x7f, 0x5f, 0x7c, 0xde, 0x96, 0xc7, 0x03, 0x94, 0xb5, 0x68, 0x32, 0x36, 0xe2, 0x12, 0x27, - 0xf2, 0x8c, 0xed, 0x36, 0x45, 0xc4, 0xd6, 0x61, 0x86, 0xa6, 0xf8, 0x7d, 0x2f, 0xf4, 0xb6, 0xbd, - 0xa6, 0x17, 0xed, 0xa3, 0x94, 0x45, 0x52, 0x88, 0x5a, 0x17, 0x8f, 0xe2, 0x52, 0x8d, 0x59, 0x2f, - 0xa9, 0xf5, 0x8b, 0x79, 0x78, 0xe1, 0xa8, 0x1b, 0x07, 0xab, 0x99, 0x9b, 0xd9, 0xc5, 0x01, 0x6e, - 0x29, 0xc7, 0x6f, 0x67, 0xab, 0x30, 0xb5, 0x11, 0xec, 0xba, 0x6d, 0xef, 0x9b, 0x78, 0x93, 0x8c, - 0x8d, 0xb7, 0xb0, 0x33, 0x7c, 0xad, 0xc4, 0x9c, 0xed, 0x29, 0xa2, 0x85, 0x47, 0xb4, 0xcd, 0x7d, - 0x5c, 0x37, 0xa0, 0xeb, 0x30, 0xb6, 0xec, 0xb7, 0x23, 0xfe, 0x24, 0x4a, 0x39, 0xbd, 0x4a, 0x60, - 0xda, 0x05, 0x4a, 0xa1, 0x5a, 0xff, 0x2a, 0x0f, 0xe7, 0x8e, 0x14, 0xb9, 0xd9, 0x96, 0xd9, 0x6b, - 0x97, 0x06, 0x91, 0xd3, 0x8f, 0xef, 0xb6, 0xc5, 0x1e, 0x3b, 0xa3, 0x63, 0xad, 0xec, 0x17, 0xfe, - 0xdb, 0x1c, 0x75, 0xd2, 0xa7, 0x61, 0x14, 0xab, 0x8a, 0xbb, 0x48, 0x6a, 0xa3, 0x70, 0x17, 0xf6, - 0x4c, 0x6d, 0x94, 0x44, 0x63, 0xd7, 0xa0, 0xb8, 0xec, 0x36, 0x9b, 0x9a, 0x4b, 0x30, 0xde, 0x24, - 0xea, 0x08, 0x4b, 0x99, 0xa5, 0x29, 0x44, 0xf6, 0x36, 0x80, 0xfc, 0x5b, 0x3b, 0x2b, 0x70, 0xb3, - 0x24, 0xb2, 0xd4, 0x71, 0xa1, 0x21, 0x63, 0x20, 0xc1, 0xba, 0x1f, 0x3b, 0x1d, 0xca, 0x40, 0x82, - 0x02, 0x60, 0x04, 0x12, 0x14, 0x00, 0xeb, 0x97, 0x0a, 0xf0, 0xe2, 0xd1, 0xf7, 0x46, 0x76, 0xcf, - 0x1c, 0x82, 0xd7, 0x07, 0xba, 0x6d, 0x1e, 0x3f, 0x06, 0x2a, 0x2c, 0xa7, 0xec, 0x90, 0x8b, 0xbd, - 0xc6, 0xf0, 0xdf, 0x39, 0x28, 0x6b, 0xb6, 0x8e, 0xb7, 0x7d, 0xaf, 0xad, 0xbd, 0x4d, 0x7c, 0x03, - 0xa0, 0x16, 0xb9, 0x91, 0x57, 0xbf, 0xfd, 0xe0, 0x8e, 0x8a, 0x5a, 0x71, 0x7d, 0xb0, 0x2f, 0x4b, - 0xe8, 0xe4, 0xbe, 0x42, 0x7e, 0x38, 0x08, 0x75, 0x3e, 0x7a, 0xfc, 0xd0, 0xb8, 0x19, 0x27, 0xc8, - 0x0b, 0x9f, 0x87, 0x52, 0x9a, 0x94, 0x5d, 0x80, 0x21, 0xfc, 0x00, 0xcd, 0xa2, 0x3f, 0xc5, 0x01, - 0xcb, 0x17, 0xee, 0xd2, 0xdc, 0x41, 0x2f, 0x69, 0x7c, 0x10, 0x37, 0x75, 0x70, 0xe4, 0x25, 0x2d, - 0xdf, 0xd3, 0x7b, 0xf5, 0x70, 0x29, 0x22, 0xeb, 0x4f, 0x73, 0x70, 0xb6, 0xef, 0x8d, 0x9c, 0x6d, - 0x9a, 0x03, 0xf6, 0xea, 0x71, 0x57, 0xf8, 0x63, 0xc7, 0x6a, 0xe1, 0x47, 0xd5, 0xdc, 0x7f, 0x1f, - 0x26, 0x6a, 0xdd, 0xed, 0xf4, 0x25, 0x4b, 0xc6, 0x30, 0xd0, 0xe0, 0xfa, 0x09, 0xa6, 0xe3, 0x8b, - 0xf6, 0xab, 0x17, 0x7f, 0xb2, 0x2c, 0xd1, 0xac, 0xac, 0x62, 0x37, 0xbe, 0x5e, 0x2f, 0x71, 0x93, - 0xc8, 0xfa, 0x85, 0x7c, 0xf6, 0x6d, 0x55, 0xdc, 0xee, 0x4f, 0x70, 0x5b, 0xbd, 0xb9, 0xbc, 0x79, - 0x7c, 0xdb, 0xff, 0xa9, 0x6a, 0x3b, 0x3e, 0x80, 0xd2, 0x8e, 0xa7, 0x14, 0x8a, 0xf4, 0x00, 0xaa, - 0x76, 0xc7, 0xd0, 0x7c, 0x00, 0x55, 0xc8, 0xec, 0x2d, 0x18, 0x5b, 0xf3, 0xa5, 0x03, 0xb7, 0x6a, - 0xb1, 0xf4, 0x73, 0x53, 0x40, 0x7d, 0x7b, 0x8c, 0x31, 0xc5, 0xdd, 0xc2, 0x1c, 0x78, 0x65, 0x4c, - 0x86, 0x77, 0x8b, 0xd4, 0x74, 0x31, 0xd5, 0x6e, 0x26, 0x99, 0xf5, 0x9f, 0x0c, 0x83, 0x75, 0xbc, - 0xd2, 0x80, 0x7d, 0x68, 0xf6, 0xdd, 0xe5, 0x81, 0xd5, 0x0d, 0x03, 0x6d, 0xb9, 0x95, 0x6e, 0xc3, - 0xe3, 0xed, 0xba, 0xe9, 0x7d, 0x4d, 0x30, 0x7d, 0x0b, 0x54, 0x78, 0x1f, 0xc7, 0x19, 0x6a, 0xe1, - 0xbf, 0x2a, 0x24, 0x4b, 0x2d, 0x75, 0x34, 0xe6, 0x3e, 0xc6, 0xd1, 0xc8, 0xee, 0x40, 0x49, 0x87, - 0x68, 0x2f, 0xa1, 0x28, 0xb9, 0x18, 0x8c, 0x52, 0x1f, 0xd5, 0x43, 0x68, 0x9e, 0xaf, 0x85, 0xc1, - 0xcf, 0xd7, 0x44, 0x7c, 0xc7, 0xfa, 0x87, 0x7a, 0xc5, 0xf7, 0xb4, 0xc3, 0xa3, 0x86, 0xae, 0xbc, - 0xb5, 0x43, 0x3a, 0xb4, 0x86, 0x4d, 0x6f, 0xed, 0x8c, 0x83, 0x4b, 0x47, 0x57, 0x0e, 0xe7, 0xf8, - 0x53, 0xf3, 0xb7, 0x8c, 0x1d, 0xce, 0x25, 0x7d, 0x96, 0xc3, 0x79, 0x4c, 0x22, 0x0e, 0x40, 0xbb, - 0xdb, 0x96, 0x11, 0x6b, 0x47, 0x93, 0x03, 0x30, 0xe8, 0xb6, 0x9d, 0x74, 0xd4, 0xda, 0x18, 0xd1, - 0xfa, 0xd1, 0x3c, 0x4c, 0xc9, 0x0d, 0x57, 0x3e, 0x65, 0x3c, 0xb3, 0xcf, 0x44, 0xef, 0x18, 0xcf, - 0x44, 0x2a, 0x44, 0x8f, 0xde, 0xb4, 0x81, 0x1e, 0x89, 0xf6, 0x80, 0xf5, 0xd2, 0x30, 0x1b, 0x26, - 0x74, 0xe8, 0xd1, 0xef, 0x43, 0x57, 0x93, 0x68, 0x4e, 0x74, 0xde, 0xe1, 0x23, 0x5d, 0x68, 0x1b, - 0x3c, 0xac, 0xbf, 0x99, 0x87, 0x49, 0xed, 0x51, 0xff, 0x99, 0xed, 0xf8, 0xcf, 0x1b, 0x1d, 0x3f, - 0x1f, 0x3b, 0x7d, 0xc4, 0x2d, 0x1b, 0xa8, 0xdf, 0xbb, 0x30, 0xd3, 0x43, 0x92, 0xb6, 0x8d, 0xc8, - 0x0d, 0x62, 0x1b, 0xf1, 0x46, 0x6f, 0x68, 0x18, 0x19, 0x61, 0x39, 0x0e, 0x14, 0xa0, 0xc7, 0xa2, - 0xf9, 0xb1, 0x3c, 0xcc, 0xd1, 0x2f, 0x8c, 0xa5, 0x26, 0x25, 0x8e, 0x67, 0x76, 0x2c, 0x2a, 0xc6, - 0x58, 0x94, 0xcd, 0xb1, 0xd0, 0x1a, 0xd8, 0x7f, 0x48, 0xac, 0xbf, 0x0e, 0x30, 0xdf, 0x8f, 0x60, - 0x60, 0xdf, 0xca, 0xc4, 0x73, 0x25, 0x3f, 0x80, 0xe7, 0xca, 0x1a, 0x94, 0xb0, 0x2a, 0x8a, 0x96, - 0x14, 0x8a, 0x7b, 0x6b, 0x21, 0xb9, 0x24, 0xca, 0x80, 0x77, 0x14, 0xbd, 0x29, 0x4c, 0x5d, 0x5c, - 0x7b, 0x28, 0xd9, 0xcf, 0xe5, 0x60, 0x0a, 0x81, 0xab, 0x8f, 0x78, 0x3b, 0x42, 0x66, 0x43, 0xe4, - 0x68, 0x11, 0xbf, 0x22, 0xd5, 0xa2, 0xc0, 0x6b, 0xef, 0xd2, 0x33, 0xd2, 0x36, 0x3d, 0x23, 0xbd, - 0x2b, 0x9f, 0xbf, 0x2e, 0xd7, 0xfd, 0xd6, 0x95, 0xdd, 0xc0, 0x7d, 0xe4, 0x49, 0x7b, 0x15, 0xb7, - 0x79, 0x25, 0x09, 0xf0, 0xdf, 0xf1, 0x52, 0x21, 0xfb, 0x89, 0x15, 0x3e, 0xd1, 0xc9, 0x0f, 0xe5, - 0x58, 0x6d, 0xfa, 0x7e, 0x6d, 0x7e, 0x11, 0xfb, 0x3e, 0x38, 0x23, 0x63, 0x98, 0x88, 0x6b, 0x9a, - 0xd7, 0xee, 0xfa, 0xdd, 0x70, 0xc9, 0xad, 0x3f, 0x14, 0xb2, 0x9a, 0x74, 0x16, 0xc3, 0x96, 0xd7, - 0xe3, 0x42, 0x67, 0x5b, 0x96, 0x1a, 0xce, 0xb1, 0xd9, 0x0c, 0xd8, 0x2d, 0x98, 0x91, 0x45, 0x95, - 0x6e, 0xe4, 0xd7, 0xea, 0x6e, 0xd3, 0x6b, 0xef, 0xe2, 0x81, 0x50, 0x94, 0xe7, 0x91, 0xdb, 0x8d, - 0x7c, 0x27, 0x94, 0x70, 0xfd, 0xba, 0xdd, 0x43, 0xc4, 0xaa, 0x30, 0x6d, 0x73, 0xb7, 0x71, 0xd7, - 0x7d, 0xb2, 0xec, 0x76, 0xdc, 0xba, 0xb8, 0xbc, 0x17, 0xf1, 0xc9, 0x15, 0x4f, 0xe5, 0x80, 0xbb, - 0x0d, 0xa7, 0xe5, 0x3e, 0x71, 0xea, 0x54, 0x68, 0xea, 0x5d, 0x0d, 0xba, 0x98, 0x95, 0xd7, 0x8e, - 0x59, 0x8d, 0xa5, 0x59, 0x79, 0xed, 0xfe, 0xac, 0x12, 0x3a, 0xc5, 0x6a, 0xcb, 0x0d, 0x76, 0x79, - 0x24, 0xcd, 0x3d, 0xe1, 0x7c, 0xee, 0x62, 0x4e, 0x63, 0x15, 0x61, 0x99, 0x83, 0xa6, 0x9f, 0x69, - 0x56, 0x1a, 0x9d, 0x98, 0x79, 0x0f, 0x02, 0x2f, 0xe2, 0x7a, 0x0b, 0xc7, 0xf1, 0xb3, 0xb0, 0xff, - 0xd1, 0x50, 0xb6, 0x5f, 0x13, 0x7b, 0x28, 0x13, 0x6e, 0x5a, 0x23, 0x27, 0x7a, 0xb8, 0x65, 0xb7, - 0xb2, 0x87, 0x32, 0xe6, 0xa6, 0xb7, 0x73, 0x12, 0xdb, 0xa9, 0x71, 0xeb, 0xd3, 0xd0, 0x1e, 0x4a, - 0xb6, 0x2e, 0x3a, 0x2d, 0xe2, 0x6d, 0x31, 0xa3, 0xc9, 0xdc, 0x75, 0x0a, 0x3f, 0xed, 0x15, 0xb2, - 0xd9, 0x2a, 0x05, 0xaa, 0xd8, 0xc9, 0x30, 0x7e, 0x4d, 0x13, 0xb3, 0xbf, 0x04, 0xd3, 0xf7, 0x42, - 0x7e, 0xa3, 0xba, 0x59, 0x53, 0x21, 0x4f, 0x50, 0x43, 0x34, 0xb5, 0x78, 0xf5, 0x98, 0x4d, 0xe7, - 0xb2, 0x4e, 0x83, 0x71, 0xf6, 0xe5, 0xb8, 0x75, 0x43, 0xee, 0xec, 0x78, 0x9d, 0x30, 0x8e, 0x1f, - 0xa5, 0x8f, 0x5b, 0xaa, 0x2a, 0xeb, 0x16, 0xcc, 0xf4, 0xb0, 0x61, 0x53, 0x00, 0x02, 0xe8, 0xdc, - 0x5b, 0xaf, 0xad, 0x6e, 0x95, 0x9e, 0x63, 0x25, 0x98, 0xc0, 0xdf, 0xab, 0xeb, 0x95, 0xa5, 0xb5, - 0xd5, 0x95, 0x52, 0x8e, 0xcd, 0xc0, 0x24, 0x42, 0x56, 0xaa, 0x35, 0x09, 0xca, 0xcb, 0x28, 0xcb, - 0x76, 0x49, 0x2e, 0xdd, 0x48, 0x2c, 0x00, 0x3c, 0x53, 0xac, 0xbf, 0x97, 0x87, 0xb3, 0xea, 0x58, - 0xe1, 0x91, 0x10, 0xc1, 0xbc, 0xf6, 0xee, 0x33, 0x7e, 0x3a, 0xdc, 0x30, 0x4e, 0x87, 0x57, 0x52, - 0x27, 0x75, 0xaa, 0x95, 0x47, 0x1c, 0x11, 0xbf, 0x36, 0x06, 0xe7, 0x8e, 0xa4, 0x62, 0x5f, 0x14, - 0xa7, 0xb9, 0xc7, 0xdb, 0x51, 0xb5, 0xd1, 0xe4, 0x5b, 0x5e, 0x8b, 0xfb, 0xdd, 0x88, 0xcc, 0xab, - 0x5f, 0x46, 0xa5, 0x0c, 0x16, 0x3a, 0x5e, 0xa3, 0xc9, 0x9d, 0x48, 0x16, 0x1b, 0xd3, 0xad, 0x97, - 0x5a, 0xb0, 0x8c, 0x73, 0x7e, 0x54, 0xdb, 0x11, 0x0f, 0x1e, 0xa1, 0x09, 0x57, 0xcc, 0xf2, 0x21, - 0xe7, 0x1d, 0xc7, 0x15, 0xa5, 0x8e, 0x47, 0xc5, 0x26, 0xcb, 0x1e, 0x6a, 0x76, 0x43, 0x63, 0xb9, - 0x2c, 0xae, 0x70, 0x77, 0xdd, 0x27, 0x64, 0x53, 0x42, 0x21, 0xf4, 0x62, 0x96, 0xd2, 0x9f, 0xb3, - 0xe5, 0x3e, 0xb1, 0x7b, 0x49, 0xd8, 0x57, 0xe1, 0x14, 0x1d, 0x40, 0xe4, 0x8f, 0xaf, 0x5a, 0x2c, - 0xbd, 0xfd, 0x5f, 0x3b, 0x3c, 0x28, 0x9f, 0x51, 0xc1, 0x07, 0x55, 0x04, 0x86, 0xac, 0x56, 0x67, - 0x73, 0x61, 0x5b, 0xe2, 0x40, 0x4e, 0x75, 0xc7, 0x5d, 0x1e, 0x86, 0xca, 0xd1, 0x88, 0xae, 0x37, - 0x7a, 0x67, 0x3a, 0x2d, 0x59, 0x6e, 0xf7, 0xa5, 0x64, 0xb7, 0x60, 0xea, 0x01, 0xdf, 0xd6, 0xc7, - 0x67, 0x24, 0xde, 0xaa, 0x4a, 0x8f, 0xf9, 0x76, 0xff, 0xc1, 0x49, 0xd1, 0x31, 0x0f, 0x95, 0xbc, - 0x4f, 0xf6, 0xd7, 0xbc, 0x30, 0xe2, 0x6d, 0x1e, 0x60, 0x9c, 0x97, 0x51, 0xdc, 0x0c, 0xe6, 0x13, - 0x09, 0xd9, 0x2c, 0x5f, 0x7a, 0xe9, 0xf0, 0xa0, 0x7c, 0x4e, 0x7a, 0xec, 0x35, 0x09, 0xee, 0xa4, - 0x32, 0x66, 0xf4, 0x72, 0x65, 0x5f, 0x87, 0x69, 0xdb, 0xef, 0x46, 0x5e, 0x7b, 0xb7, 0x16, 0x05, - 0x6e, 0xc4, 0x77, 0xe5, 0x81, 0x94, 0x04, 0x94, 0x49, 0x95, 0xd2, 0xfb, 0xa0, 0x04, 0x3a, 0x21, - 0x41, 0x8d, 0x13, 0xc1, 0x24, 0x60, 0x5f, 0x83, 0x29, 0xe9, 0x89, 0x1d, 0x57, 0x30, 0x66, 0x44, - 0xfb, 0x36, 0x0b, 0xef, 0x5f, 0x25, 0x13, 0x00, 0x84, 0x66, 0x55, 0x90, 0xe2, 0xc6, 0xbe, 0x4c, - 0x9d, 0xb5, 0xe9, 0xb5, 0x77, 0xe3, 0x69, 0x0c, 0xd8, 0xf3, 0x6f, 0x26, 0x5d, 0xd2, 0x11, 0x9f, - 0xab, 0xa6, 0x71, 0x1f, 0x7b, 0xa6, 0x5e, 0x3e, 0x2c, 0x82, 0x73, 0x95, 0x30, 0xf4, 0xc2, 0x88, - 0x9c, 0x10, 0x56, 0x9f, 0xf0, 0x7a, 0x57, 0x20, 0x8b, 0x8b, 0x22, 0x0f, 0xa4, 0x11, 0xec, 0xf0, - 0xd2, 0xe5, 0xc3, 0x83, 0xf2, 0xeb, 0x2e, 0x22, 0x3a, 0xe4, 0xb7, 0xe0, 0x70, 0x85, 0xea, 0x3c, - 0x96, 0xb8, 0x5a, 0x1b, 0x8e, 0x66, 0xca, 0xbe, 0x06, 0xa7, 0x97, 0xdd, 0x90, 0x57, 0xdb, 0x21, - 0x6f, 0x87, 0x5e, 0xe4, 0x3d, 0xe2, 0xd4, 0xa9, 0x78, 0xf8, 0x15, 0x31, 0xb7, 0x88, 0x55, 0x77, - 0x43, 0xb1, 0x30, 0x63, 0x14, 0x87, 0x06, 0x45, 0xab, 0xa6, 0x0f, 0x17, 0x66, 0xc3, 0x54, 0xad, - 0x76, 0x6b, 0xc5, 0x73, 0xe3, 0x75, 0x35, 0x89, 0xfd, 0xf5, 0x3a, 0xea, 0x67, 0xc2, 0x3d, 0xa7, - 0xe1, 0xb9, 0xf1, 0x82, 0xea, 0xd3, 0x59, 0x29, 0x0e, 0xd6, 0x41, 0x0e, 0x4a, 0xe9, 0xa1, 0x64, - 0x5f, 0x82, 0x31, 0x69, 0x0c, 0xc4, 0xc3, 0x3d, 0x72, 0x4c, 0x56, 0xb6, 0x25, 0x31, 0xdc, 0x24, - 0x22, 0xa7, 0x20, 0x69, 0x6a, 0xc4, 0x75, 0xbb, 0x05, 0x74, 0x0a, 0x52, 0x44, 0xac, 0x01, 0x13, - 0x72, 0xb4, 0x38, 0x46, 0x93, 0x22, 0x9b, 0xd0, 0x97, 0xf4, 0xd5, 0x41, 0x45, 0x29, 0xfe, 0xf8, - 0xf4, 0x43, 0x73, 0x42, 0x22, 0x18, 0x55, 0x18, 0x5c, 0x97, 0x00, 0x8a, 0x8a, 0xd0, 0x3a, 0x0b, - 0x67, 0xfa, 0x7c, 0xb3, 0xf5, 0x08, 0x9f, 0x83, 0xfb, 0xd4, 0xc8, 0xbe, 0x04, 0x73, 0x48, 0xb8, - 0xec, 0xb7, 0xdb, 0xbc, 0x1e, 0xe1, 0x76, 0xa4, 0x54, 0xa8, 0x05, 0x69, 0x73, 0x20, 0xdb, 0x5b, - 0x8f, 0x11, 0x9c, 0xb4, 0x26, 0x35, 0x93, 0x83, 0xf5, 0x53, 0x79, 0x98, 0xa7, 0x1d, 0xce, 0xe6, - 0x75, 0x3f, 0x68, 0x3c, 0xfb, 0x27, 0xea, 0xaa, 0x71, 0xa2, 0xbe, 0x1c, 0x47, 0xa2, 0xc8, 0x6a, - 0xe4, 0x11, 0x07, 0xea, 0x2f, 0xe4, 0xe0, 0x85, 0xa3, 0x88, 0x44, 0xef, 0xc4, 0xd1, 0xb3, 0xc6, - 0x7a, 0xa2, 0x64, 0x75, 0x60, 0x16, 0x07, 0x74, 0x79, 0x8f, 0xd7, 0x1f, 0x86, 0xb7, 0xfc, 0x30, - 0x42, 0xb3, 0xf4, 0x7c, 0x9f, 0x07, 0xcb, 0x37, 0x32, 0x1f, 0x2c, 0x4f, 0xcb, 0x59, 0x56, 0x47, - 0x1e, 0x32, 0xbe, 0xd7, 0x43, 0xbe, 0x1f, 0xda, 0x59, 0xac, 0xd1, 0xbc, 0xb8, 0xd2, 0x8d, 0xf6, - 0x36, 0x03, 0xbe, 0xc3, 0x03, 0xde, 0xae, 0xf3, 0xef, 0x31, 0xf3, 0x62, 0xb3, 0x71, 0x03, 0x69, - 0x30, 0xfe, 0xe9, 0x24, 0xcc, 0x65, 0x91, 0x89, 0x7e, 0xd1, 0x2e, 0xcd, 0xe9, 0xd4, 0x67, 0x7f, - 0x2d, 0x07, 0x13, 0x35, 0x5e, 0xf7, 0xdb, 0x8d, 0x1b, 0x68, 0x16, 0x42, 0xbd, 0xe3, 0x48, 0xa1, - 0x41, 0xc0, 0x9d, 0x9d, 0x94, 0xbd, 0xc8, 0x77, 0x0e, 0xca, 0x5f, 0x18, 0xec, 0xae, 0x5a, 0xf7, - 0x31, 0x9a, 0x44, 0x84, 0xa1, 0xb9, 0xe3, 0x2a, 0xf0, 0x85, 0xc7, 0xa8, 0x94, 0x2d, 0xc1, 0x24, - 0x2d, 0x57, 0x5f, 0x0f, 0x9e, 0x26, 0x83, 0x75, 0xa8, 0x82, 0x1e, 0xfd, 0xa3, 0x41, 0xc2, 0xae, - 0x41, 0xe1, 0xde, 0xe2, 0x0d, 0x1a, 0x03, 0x15, 0xdc, 0xfc, 0xde, 0xe2, 0x0d, 0x54, 0x87, 0x89, - 0x2b, 0xc6, 0x64, 0x77, 0xd1, 0xb0, 0xd4, 0xb8, 0xb7, 0x78, 0x83, 0xfd, 0x15, 0x38, 0xb5, 0xe2, - 0x85, 0x54, 0x85, 0x34, 0x74, 0x6f, 0xa0, 0x7b, 0xd7, 0x48, 0x9f, 0xd9, 0xfb, 0xd9, 0xcc, 0xd9, - 0xfb, 0x52, 0x23, 0x66, 0xe2, 0x48, 0x2b, 0xfa, 0x46, 0x3a, 0x48, 0x5c, 0x76, 0x3d, 0xec, 0x23, - 0x98, 0x42, 0xdd, 0x39, 0xda, 0xfe, 0x63, 0x78, 0xdf, 0xd1, 0x3e, 0x35, 0x7f, 0x3a, 0xb3, 0xe6, - 0x05, 0xe9, 0x24, 0x8e, 0x1e, 0x04, 0x18, 0x0a, 0xd8, 0xb8, 0xf5, 0x1b, 0x9c, 0xd9, 0x6d, 0x98, - 0x26, 0xf1, 0x6b, 0x63, 0x67, 0x6b, 0x8f, 0xaf, 0xb8, 0xfb, 0x64, 0x64, 0x81, 0x37, 0x3a, 0x92, - 0xd9, 0x1c, 0x7f, 0xc7, 0x89, 0xf6, 0xb8, 0xd3, 0x70, 0x0d, 0x41, 0x25, 0x45, 0xc8, 0xbe, 0x1f, - 0xc6, 0xd7, 0xfc, 0xba, 0x90, 0xbc, 0x71, 0x67, 0x90, 0x76, 0x17, 0x1f, 0x62, 0x72, 0x2d, 0x09, - 0x4e, 0x89, 0x53, 0xdf, 0x39, 0x28, 0xbf, 0x73, 0xd2, 0x49, 0xa3, 0x55, 0x60, 0xeb, 0xb5, 0xb1, - 0x65, 0x28, 0x3e, 0xe0, 0xdb, 0xa2, 0xb5, 0xe9, 0xc4, 0x3b, 0x0a, 0x4c, 0x66, 0x55, 0xf4, 0xcb, - 0x30, 0xab, 0x22, 0x18, 0x0b, 0x60, 0x06, 0xfb, 0x67, 0xd3, 0x0d, 0xc3, 0xc7, 0x7e, 0xd0, 0xc0, - 0x08, 0xeb, 0xfd, 0x4c, 0x3a, 0x16, 0x33, 0x3b, 0xff, 0x05, 0xd9, 0xf9, 0x1d, 0x8d, 0x83, 0x2e, - 0x40, 0xf6, 0xb0, 0x67, 0x5f, 0x87, 0x29, 0xf2, 0x6c, 0xbe, 0x7b, 0xa3, 0x82, 0xab, 0x72, 0xc2, - 0x70, 0x92, 0x33, 0x0b, 0xa5, 0x94, 0x4a, 0x8e, 0xd2, 0x4a, 0x03, 0xe5, 0xb4, 0x76, 0x5c, 0xf3, - 0xd5, 0x4c, 0x27, 0x61, 0x9b, 0x30, 0xbe, 0xc2, 0x1f, 0x79, 0x75, 0x8e, 0x8e, 0x3c, 0x64, 0x44, - 0x1b, 0x67, 0x0e, 0x49, 0x4a, 0xa4, 0x2e, 0xa6, 0x81, 0x00, 0xe9, 0x16, 0x64, 0x5a, 0x4d, 0xc6, - 0x88, 0xec, 0x3a, 0x14, 0xaa, 0x2b, 0x9b, 0x64, 0x43, 0xab, 0x7c, 0x63, 0xaa, 0x8d, 0x4d, 0x95, - 0x67, 0x01, 0x8d, 0xa0, 0xbc, 0x86, 0x61, 0x81, 0x5b, 0x5d, 0xd9, 0x64, 0x3b, 0x30, 0x89, 0x1d, - 0x70, 0x8b, 0xbb, 0xb2, 0x6f, 0xa7, 0xfb, 0xf4, 0xed, 0xe5, 0xcc, 0xbe, 0x9d, 0x97, 0x7d, 0xbb, - 0x47, 0xd4, 0x46, 0xe0, 0x78, 0x9d, 0xad, 0x10, 0x69, 0x29, 0x99, 0x85, 0x0a, 0x77, 0xbe, 0xb5, - 0x86, 0x46, 0x1e, 0x24, 0xd2, 0xaa, 0xdc, 0x17, 0x71, 0xfc, 0xf5, 0xbe, 0x26, 0xfa, 0xbd, 0x7c, - 0xd8, 0xe7, 0x61, 0x68, 0xe3, 0x61, 0xe4, 0xce, 0xcf, 0x18, 0xfd, 0x28, 0x40, 0xaa, 0xf9, 0xa8, - 0x85, 0xf4, 0x1f, 0x1a, 0x61, 0x84, 0x90, 0x46, 0x0c, 0xc5, 0x2d, 0x37, 0x68, 0x3c, 0x76, 0x03, - 0xf4, 0xa6, 0x9c, 0x35, 0x58, 0x68, 0x25, 0x72, 0x28, 0xf6, 0x08, 0x90, 0x72, 0xb1, 0xd4, 0x59, - 0xb0, 0xef, 0x83, 0xb3, 0xa1, 0xb7, 0xdb, 0x76, 0xa3, 0x6e, 0xc0, 0x1d, 0xb7, 0xb9, 0xeb, 0x07, - 0x5e, 0xb4, 0xd7, 0x72, 0xc2, 0xae, 0x17, 0xf1, 0xf9, 0x39, 0x23, 0xf5, 0x65, 0x4d, 0xe1, 0x55, - 0x14, 0x5a, 0x4d, 0x60, 0xd9, 0x67, 0xc2, 0xec, 0x02, 0xf6, 0x65, 0x98, 0xd4, 0xb7, 0xe4, 0x70, - 0xfe, 0xd4, 0xf9, 0xc2, 0xc5, 0xa9, 0xf8, 0xe2, 0x91, 0xde, 0xc0, 0x55, 0xc8, 0x48, 0xed, 0x84, - 0x08, 0xcd, 0x90, 0x91, 0x1a, 0xaf, 0x38, 0x99, 0x14, 0x2b, 0xcd, 0xda, 0x33, 0x34, 0x63, 0xa9, - 0x97, 0xef, 0xde, 0xa8, 0xd8, 0xa3, 0x9b, 0xd5, 0xfb, 0xb5, 0xa6, 0x1f, 0x59, 0xff, 0x45, 0x0e, - 0x37, 0x71, 0xf6, 0x3a, 0x46, 0x3f, 0x89, 0x9f, 0xf3, 0x50, 0x7f, 0xeb, 0x76, 0x52, 0xf1, 0x86, - 0x25, 0x0a, 0x7b, 0x03, 0x46, 0x6e, 0xb8, 0x75, 0x1e, 0xa9, 0x47, 0x57, 0x44, 0xde, 0x41, 0x88, - 0xae, 0xec, 0x95, 0x38, 0x42, 0xbe, 0x94, 0x93, 0xbb, 0x92, 0x64, 0x47, 0x5d, 0xae, 0xa8, 0x37, - 0x57, 0x94, 0x2f, 0x69, 0x51, 0x68, 0xe9, 0x53, 0x53, 0xf6, 0xc9, 0x99, 0x1c, 0xac, 0x3f, 0xce, - 0x25, 0xbb, 0x12, 0x7b, 0x0d, 0x86, 0xec, 0xcd, 0xf8, 0xfb, 0xa5, 0x87, 0x64, 0xea, 0xf3, 0x11, - 0x81, 0x7d, 0x19, 0x4e, 0x69, 0x7c, 0x7a, 0x8c, 0xa5, 0x5f, 0x45, 0x07, 0x3e, 0xed, 0x4b, 0xb2, - 0x2d, 0xa6, 0xb3, 0x79, 0xa0, 0x30, 0x9d, 0x14, 0xac, 0xf0, 0xb6, 0x27, 0x79, 0x6b, 0x8d, 0xd5, - 0x79, 0x37, 0x10, 0x21, 0xdd, 0xd8, 0x2c, 0x0e, 0xd2, 0x7f, 0xcf, 0xfa, 0xd5, 0x9c, 0xb1, 0xdb, - 0xc4, 0x69, 0x28, 0x73, 0xc7, 0xa4, 0xa1, 0x7c, 0x1b, 0xa0, 0xd2, 0x8d, 0xfc, 0xd5, 0x76, 0xe0, - 0x37, 0xa5, 0x16, 0x85, 0x42, 0x6e, 0xa3, 0x6e, 0x98, 0x23, 0xd8, 0x70, 0x33, 0x8a, 0x91, 0x33, - 0xed, 0xca, 0x0b, 0x1f, 0xd7, 0xae, 0xdc, 0xfa, 0xed, 0x9c, 0xb1, 0x46, 0x85, 0x94, 0x48, 0x53, - 0x51, 0x37, 0xfb, 0xe9, 0x78, 0x8f, 0x9c, 0xb0, 0xe9, 0xeb, 0x3b, 0xa4, 0x42, 0x63, 0xff, 0x66, - 0x0e, 0x4e, 0x4b, 0x03, 0xed, 0xf5, 0x6e, 0x6b, 0x9b, 0x07, 0xf7, 0xdd, 0xa6, 0xd7, 0x90, 0x5e, - 0xaa, 0x52, 0x00, 0xbe, 0xd8, 0xbb, 0xe0, 0xb3, 0xf1, 0xe5, 0x45, 0x55, 0x1a, 0x8c, 0x3b, 0x6d, - 0x2c, 0x74, 0x1e, 0xc5, 0xa5, 0xfa, 0x45, 0x35, 0x9b, 0xde, 0xfa, 0xc5, 0x1c, 0xbc, 0x74, 0x6c, - 0x2d, 0xec, 0x0a, 0x8c, 0xaa, 0x58, 0xe7, 0x39, 0xec, 0x78, 0x34, 0x96, 0xec, 0x8d, 0x73, 0xae, - 0xb0, 0xd8, 0x57, 0xe0, 0x94, 0xce, 0x6a, 0x2b, 0x70, 0x3d, 0x3d, 0xa2, 0x78, 0xc6, 0x57, 0x47, - 0x02, 0x25, 0x2d, 0xad, 0x65, 0x33, 0xb1, 0xfe, 0xbf, 0x9c, 0x96, 0x98, 0xf6, 0x19, 0x95, 0xe1, - 0xaf, 0x1b, 0x32, 0xbc, 0x8a, 0x3b, 0x17, 0xb7, 0x4a, 0x94, 0x65, 0xde, 0xbb, 0xa6, 0x35, 0xa3, - 0x5f, 0x04, 0xfc, 0x70, 0x1e, 0xc6, 0xef, 0x85, 0x3c, 0x90, 0x0f, 0xb9, 0xdf, 0x5b, 0xf1, 0xc5, - 0xe2, 0x76, 0x0d, 0x14, 0x01, 0xea, 0x0f, 0x73, 0xa8, 0xe0, 0xd7, 0x29, 0x44, 0x6f, 0x68, 0xc9, - 0xa8, 0xb0, 0x37, 0x30, 0x0d, 0x15, 0x42, 0x65, 0xe0, 0xa1, 0x35, 0x33, 0x2f, 0x1d, 0x26, 0x27, - 0x5c, 0x63, 0x5f, 0x80, 0xe1, 0x7b, 0xa8, 0xae, 0x34, 0x23, 0x12, 0xc4, 0xfc, 0xb1, 0x50, 0x6e, - 0xd2, 0xdd, 0xd0, 0x0c, 0x96, 0x24, 0x09, 0x59, 0x0d, 0x46, 0x97, 0x03, 0x8e, 0x69, 0x66, 0x87, - 0x06, 0xf7, 0xa7, 0xad, 0x4b, 0x92, 0xb4, 0x3f, 0x2d, 0x71, 0xb2, 0x7e, 0x32, 0x0f, 0x2c, 0x69, - 0x23, 0xe6, 0x54, 0x09, 0x9f, 0xd9, 0x41, 0xff, 0xc0, 0x18, 0xf4, 0x73, 0x3d, 0x83, 0x2e, 0x9b, - 0x37, 0xd0, 0xd8, 0xff, 0x7a, 0x0e, 0x4e, 0x67, 0x13, 0xb2, 0x97, 0x61, 0x64, 0x63, 0x6b, 0x53, - 0x05, 0xb5, 0xa0, 0xa6, 0xf8, 0x1d, 0xd4, 0x15, 0xd8, 0x54, 0xc4, 0xde, 0x84, 0x91, 0x2f, 0xda, - 0xcb, 0xe2, 0x1c, 0xd2, 0xa2, 0x76, 0x7f, 0x23, 0x70, 0xea, 0xe6, 0x51, 0x44, 0x48, 0xfa, 0xd8, - 0x16, 0x9e, 0xda, 0xd8, 0xfe, 0x58, 0x1e, 0xa6, 0x2b, 0xf5, 0x3a, 0x0f, 0x43, 0x21, 0xed, 0xf0, - 0x30, 0x7a, 0x66, 0x07, 0x36, 0x3b, 0x5c, 0x85, 0xd1, 0xb6, 0x81, 0x46, 0xf5, 0x37, 0x73, 0x70, - 0x4a, 0x51, 0x3d, 0xf2, 0xf8, 0xe3, 0xad, 0xbd, 0x80, 0x87, 0x7b, 0x7e, 0xb3, 0x31, 0x70, 0x6a, - 0x00, 0x21, 0xe8, 0x61, 0xbc, 0x5f, 0xfd, 0x55, 0x7f, 0x07, 0x21, 0x86, 0xa0, 0x27, 0x63, 0x02, - 0x5f, 0x81, 0xd1, 0x4a, 0xa7, 0x13, 0xf8, 0x8f, 0xe4, 0xb2, 0xa7, 0x70, 0x68, 0xae, 0x04, 0x19, - 0xee, 0xc8, 0x12, 0x24, 0x3e, 0x63, 0x85, 0xb7, 0x65, 0xa0, 0xaf, 0x49, 0xf9, 0x19, 0x0d, 0xde, - 0xd6, 0x65, 0x71, 0x2c, 0xb7, 0x6a, 0xc0, 0x36, 0x03, 0xbf, 0xe5, 0x47, 0xbc, 0x21, 0xdb, 0x83, - 0x5e, 0xdc, 0xc7, 0x06, 0x06, 0xda, 0xf2, 0xa2, 0xa6, 0x11, 0x18, 0x28, 0x12, 0x00, 0x5b, 0xc2, - 0xad, 0xff, 0x6b, 0x18, 0x26, 0xf4, 0xde, 0x61, 0x96, 0x8c, 0xf7, 0xed, 0x07, 0x7a, 0x28, 0x01, - 0x17, 0x21, 0x36, 0x95, 0x24, 0x71, 0x38, 0xf2, 0xc7, 0xc6, 0xe1, 0x78, 0x00, 0x93, 0x9b, 0x81, - 0x8f, 0x71, 0xdb, 0x64, 0xfa, 0x71, 0xb9, 0x15, 0xce, 0x6a, 0xf7, 0x4e, 0x31, 0x90, 0xf8, 0x1e, - 0x8a, 0x92, 0x7d, 0x87, 0xb0, 0x9d, 0x74, 0x72, 0x72, 0x93, 0x8f, 0x34, 0xb5, 0x70, 0x43, 0x0a, - 0xbe, 0x18, 0x9b, 0x5a, 0x08, 0x88, 0x69, 0x6a, 0x21, 0x20, 0xfa, 0x5a, 0x1b, 0x7e, 0x5a, 0x6b, - 0x8d, 0xfd, 0x64, 0x0e, 0xc6, 0x2b, 0xed, 0x36, 0xc5, 0xf7, 0x38, 0xc6, 0xb5, 0xf9, 0x2b, 0x64, - 0x6d, 0xf1, 0xce, 0xc7, 0xb2, 0xb6, 0x40, 0xb9, 0x25, 0x44, 0x49, 0x35, 0xa9, 0x50, 0xbf, 0xad, - 0x69, 0xdf, 0xc1, 0xde, 0x81, 0x52, 0x3c, 0xc9, 0xab, 0xed, 0x06, 0x7f, 0xc2, 0x65, 0xbe, 0xa4, - 0x49, 0x0a, 0xbb, 0xaa, 0x4b, 0xa6, 0x69, 0x44, 0xb6, 0x05, 0xe0, 0xc6, 0xb3, 0x2b, 0x95, 0xf8, - 0xad, 0x77, 0xfa, 0x91, 0xf4, 0x8c, 0xbf, 0xf1, 0x41, 0x4b, 0x97, 0x9e, 0x13, 0x3e, 0xac, 0x05, - 0xd3, 0x32, 0xeb, 0x1a, 0x66, 0x63, 0xc7, 0xe8, 0xe2, 0x70, 0xec, 0x38, 0xbc, 0x46, 0xfa, 0xb3, - 0xe7, 0x29, 0x97, 0x1b, 0x26, 0x78, 0x77, 0x32, 0x42, 0x8d, 0xa7, 0x79, 0xcb, 0x20, 0xb7, 0xf6, - 0x99, 0xde, 0xef, 0x95, 0x93, 0xfe, 0xc7, 0x72, 0x70, 0x5a, 0x9f, 0xf4, 0xb5, 0xee, 0x76, 0xcb, - 0xc3, 0x4b, 0x21, 0xbb, 0x0c, 0x63, 0x34, 0x27, 0xe3, 0x4b, 0x54, 0x6f, 0x90, 0xf4, 0x04, 0x85, - 0xad, 0x8a, 0x69, 0x28, 0x78, 0x90, 0xd4, 0x3d, 0x9b, 0xda, 0xa7, 0x44, 0x51, 0x92, 0xd1, 0x33, - 0xc0, 0xdf, 0xe6, 0xfc, 0x14, 0x10, 0xeb, 0x7d, 0x98, 0x31, 0x47, 0xa2, 0xc6, 0x23, 0x76, 0x09, - 0x46, 0xd5, 0xf0, 0xe5, 0xb2, 0x87, 0x4f, 0x95, 0x5b, 0x0f, 0x80, 0xf5, 0xd0, 0x87, 0x68, 0x16, - 0xc5, 0x23, 0x65, 0xb6, 0xa7, 0x1e, 0x25, 0x7b, 0x10, 0x97, 0x66, 0xe9, 0xfb, 0xc6, 0x0d, 0xdb, - 0x72, 0x41, 0x6a, 0xfd, 0xf1, 0x14, 0xcc, 0x66, 0xec, 0xb9, 0xc7, 0xc8, 0x44, 0x65, 0x73, 0x83, - 0x18, 0x8b, 0x23, 0x23, 0xa8, 0x6d, 0xe1, 0x7d, 0x18, 0x3e, 0x76, 0x3b, 0x90, 0x9e, 0x05, 0xa9, - 0x5d, 0x40, 0x92, 0x7d, 0x57, 0xe4, 0x22, 0x3d, 0x78, 0xc9, 0xf0, 0x53, 0x0b, 0x5e, 0xb2, 0x04, - 0x93, 0xd4, 0x2a, 0xda, 0xae, 0x34, 0x0b, 0xd7, 0x40, 0x16, 0x38, 0x3d, 0xdb, 0x96, 0x49, 0x22, - 0x79, 0x84, 0x7e, 0xf3, 0x11, 0x27, 0x1e, 0xa3, 0x3a, 0x0f, 0x2c, 0xc8, 0xe4, 0xa1, 0x91, 0xb0, - 0xff, 0x08, 0x33, 0x3e, 0x21, 0x44, 0xdf, 0xb3, 0x8a, 0x47, 0xed, 0x59, 0x8d, 0xa7, 0xb3, 0x67, - 0x9d, 0x53, 0xdf, 0x98, 0xbd, 0x77, 0x65, 0x7c, 0x16, 0xfb, 0xf9, 0x1c, 0xcc, 0xc8, 0x08, 0x1a, - 0xfa, 0xc7, 0x1e, 0x19, 0x15, 0xa1, 0xfe, 0x74, 0x3e, 0xf6, 0x05, 0xca, 0x74, 0x92, 0xfd, 0xad, - 0xbd, 0x1f, 0xc5, 0xbe, 0x0f, 0x20, 0x5e, 0x51, 0x32, 0xd0, 0xe4, 0xf8, 0xe2, 0x0b, 0x19, 0xbb, - 0x40, 0x8c, 0x94, 0x44, 0x65, 0x8f, 0x62, 0x3a, 0x23, 0xcf, 0x57, 0x0c, 0x65, 0x7f, 0x05, 0xe6, - 0xc4, 0x7a, 0x89, 0x21, 0x14, 0xef, 0x67, 0x7e, 0x1c, 0x6b, 0xf9, 0x4c, 0x7f, 0x99, 0xe8, 0x72, - 0x16, 0x99, 0x0c, 0x4b, 0x9a, 0xa4, 0x5c, 0x8d, 0xf4, 0xd0, 0x00, 0x99, 0x15, 0x61, 0x18, 0x2d, - 0xfc, 0x7a, 0x19, 0x39, 0xbd, 0xcf, 0xfe, 0x76, 0x56, 0xad, 0x05, 0xb9, 0xbf, 0x85, 0xa6, 0xa3, - 0x29, 0x82, 0xd8, 0x17, 0x81, 0xc5, 0xa1, 0x27, 0x24, 0x8c, 0xab, 0xa8, 0xea, 0x52, 0xdd, 0x9c, - 0x84, 0xb0, 0x08, 0x54, 0xb1, 0x3e, 0x49, 0x7a, 0x89, 0x19, 0x87, 0x39, 0x6a, 0xb4, 0x80, 0xaa, - 0x74, 0x4c, 0xe1, 0xfc, 0x94, 0x11, 0x4d, 0x29, 0x29, 0x49, 0x72, 0xb3, 0x6a, 0x39, 0x9d, 0x0c, - 0x95, 0x53, 0x16, 0x3b, 0x76, 0x1d, 0xc6, 0xd0, 0xdb, 0xf3, 0x96, 0x32, 0xf6, 0x22, 0xc3, 0x13, - 0xf4, 0x0b, 0x75, 0xf6, 0x4c, 0x93, 0xad, 0x04, 0x55, 0x5c, 0x07, 0x56, 0x82, 0x7d, 0xbb, 0xdb, - 0x46, 0xa5, 0x30, 0xe9, 0x3b, 0x1a, 0xc1, 0xbe, 0x13, 0x74, 0x4d, 0x77, 0x60, 0x44, 0x62, 0x5f, - 0x87, 0xf1, 0xbb, 0xee, 0x13, 0xa5, 0x13, 0x26, 0xc5, 0xef, 0x51, 0x3b, 0x90, 0xa5, 0x5a, 0xd3, - 0x72, 0x9f, 0x38, 0x8d, 0x6e, 0x3a, 0x28, 0x2a, 0x6e, 0x43, 0x3a, 0x4b, 0xf6, 0x55, 0x00, 0x4d, - 0x53, 0xcd, 0x8e, 0xad, 0xe0, 0x25, 0x15, 0x23, 0x2c, 0x53, 0x83, 0x8d, 0xfc, 0x35, 0x86, 0x29, - 0xc9, 0x61, 0xee, 0xbb, 0x27, 0x39, 0x9c, 0xfa, 0xee, 0x49, 0x0e, 0x0b, 0xdb, 0x70, 0xb6, 0xef, - 0xd2, 0xc9, 0x08, 0xdd, 0x7a, 0xc5, 0x0c, 0xdd, 0x7a, 0xb6, 0xdf, 0x11, 0x1b, 0x9a, 0x81, 0xf8, - 0x67, 0x4b, 0x73, 0xfd, 0xa5, 0x93, 0x6f, 0xe7, 0x53, 0x47, 0x2e, 0x5d, 0x2c, 0x64, 0xe2, 0x96, - 0x7e, 0x32, 0x49, 0x1e, 0x73, 0x75, 0xca, 0x43, 0x39, 0x9f, 0x5c, 0x68, 0x52, 0xe9, 0xcd, 0xe5, - 0xf1, 0xfc, 0x49, 0x4f, 0xdf, 0x77, 0x61, 0x4a, 0xa6, 0xd7, 0xbb, 0xc3, 0xf7, 0x1f, 0xfb, 0x41, - 0x43, 0xe5, 0xb0, 0x46, 0x19, 0xbc, 0x27, 0x37, 0x6e, 0x0a, 0x97, 0xad, 0x28, 0x07, 0xc2, 0x61, - 0xac, 0xfd, 0x6c, 0xe6, 0x2e, 0x26, 0x10, 0x8e, 0xf2, 0x2d, 0x64, 0x6f, 0xc5, 0x82, 0x1a, 0x0f, - 0xf4, 0x70, 0xfc, 0x81, 0x02, 0x66, 0xc8, 0x6b, 0x3c, 0xb0, 0x7e, 0xbf, 0x00, 0x4c, 0xd6, 0xb4, - 0xec, 0x76, 0x5c, 0x74, 0xaf, 0xf5, 0x30, 0x30, 0x4d, 0x89, 0x70, 0xdc, 0xed, 0x26, 0xd7, 0xa3, - 0x3a, 0x91, 0x71, 0x6d, 0x5c, 0xe6, 0xa4, 0x2f, 0x3a, 0x3d, 0x84, 0x7d, 0xb6, 0xba, 0xfc, 0x27, - 0xd9, 0xea, 0xbe, 0x0e, 0xcf, 0x57, 0x3a, 0x98, 0xa7, 0x53, 0xd5, 0x72, 0xc3, 0x0f, 0xd4, 0x26, - 0x65, 0x38, 0x6e, 0xb9, 0x31, 0x5a, 0xcf, 0x97, 0x1e, 0xc5, 0x42, 0x93, 0x53, 0xc4, 0xbc, 0xec, - 0x44, 0x7a, 0x20, 0x00, 0x25, 0xa7, 0x74, 0xb0, 0x24, 0x43, 0x4e, 0x91, 0x24, 0x8a, 0x87, 0x17, - 0x28, 0x39, 0x05, 0x13, 0xd0, 0x24, 0x3c, 0xbc, 0x80, 0xf7, 0x91, 0x75, 0x62, 0x12, 0xf6, 0x2e, - 0x8c, 0x57, 0xba, 0x91, 0x4f, 0x8c, 0xc9, 0x2a, 0x3c, 0xb1, 0xdf, 0xa6, 0x4f, 0x31, 0xae, 0x3e, - 0x09, 0xba, 0xf5, 0x47, 0x05, 0x38, 0xdb, 0x3b, 0xbc, 0x54, 0x1a, 0xaf, 0x8f, 0xdc, 0x31, 0xeb, - 0x23, 0x6b, 0x36, 0xe4, 0x93, 0xf0, 0xe8, 0x4f, 0x63, 0x36, 0xc8, 0x74, 0x9f, 0x1f, 0x73, 0x36, - 0xd4, 0x60, 0x5c, 0x3f, 0xef, 0x86, 0x3e, 0xee, 0x79, 0xa7, 0x73, 0x11, 0x97, 0x7a, 0x19, 0xff, - 0x60, 0x38, 0x79, 0x3a, 0x4a, 0x87, 0x3e, 0x90, 0x18, 0xec, 0xdf, 0x80, 0xf3, 0x72, 0x4f, 0x4a, - 0x37, 0x76, 0x69, 0x5f, 0x71, 0xa4, 0x81, 0x5b, 0x3c, 0x3c, 0x28, 0x5f, 0x96, 0xaa, 0x12, 0xa7, - 0xa7, 0xdb, 0x9c, 0xed, 0x7d, 0x47, 0x7d, 0x99, 0x56, 0xc9, 0xb1, 0xbc, 0x31, 0xc7, 0xa7, 0x96, - 0x7f, 0xf1, 0xcd, 0x2c, 0x77, 0x19, 0x19, 0x9d, 0x58, 0x82, 0x4d, 0x4f, 0x19, 0xa5, 0x0e, 0xcb, - 0x67, 0xaa, 0xc3, 0x94, 0x3e, 0xa5, 0x90, 0xa9, 0x4f, 0x59, 0x81, 0xe9, 0x5a, 0x77, 0x5b, 0xd5, - 0x9d, 0xf6, 0x97, 0x0b, 0xbb, 0xdb, 0x59, 0x0d, 0x4a, 0x93, 0x58, 0x3f, 0x92, 0x87, 0x89, 0xcd, - 0x66, 0x77, 0xd7, 0x6b, 0xaf, 0xb8, 0x91, 0xfb, 0xcc, 0x6a, 0xe8, 0xde, 0x36, 0x34, 0x74, 0xb1, - 0x57, 0x58, 0xdc, 0xb0, 0x81, 0xd4, 0x73, 0x3f, 0x91, 0x83, 0xe9, 0x84, 0x44, 0x9e, 0xb3, 0xb7, - 0x60, 0x48, 0xfc, 0xa0, 0x7b, 0xeb, 0xf9, 0x1e, 0xc6, 0x32, 0xe9, 0x57, 0xfc, 0x17, 0xe9, 0xcc, - 0xcc, 0x8c, 0x3a, 0xc8, 0x61, 0xe1, 0xb3, 0x30, 0x96, 0xb0, 0x3d, 0x49, 0xb2, 0xaf, 0x5f, 0xca, - 0x41, 0x29, 0xdd, 0x12, 0x76, 0x07, 0x46, 0x05, 0x27, 0x8f, 0xab, 0x2b, 0xf5, 0x2b, 0x7d, 0xda, - 0x7c, 0x99, 0xd0, 0xe4, 0xe7, 0x61, 0xe7, 0x73, 0x09, 0xb1, 0x15, 0x87, 0x05, 0x1b, 0x26, 0x74, - 0xac, 0x8c, 0xaf, 0x7b, 0xc3, 0x14, 0x2e, 0x4e, 0x67, 0xf7, 0x83, 0x91, 0xa2, 0xcc, 0xf8, 0x6a, - 0x92, 0x1b, 0x2e, 0x18, 0x93, 0x0b, 0xfb, 0x2a, 0x35, 0x6f, 0xe4, 0x34, 0x5b, 0x4c, 0x02, 0xa6, - 0xeb, 0xf3, 0x2c, 0x63, 0x42, 0xc7, 0x78, 0xec, 0x0d, 0x18, 0x91, 0xf5, 0xe9, 0xa9, 0x7a, 0x3a, - 0x08, 0xd1, 0x45, 0x5c, 0x89, 0x63, 0xfd, 0xfd, 0x02, 0x9c, 0x4e, 0x3e, 0xef, 0x5e, 0xa7, 0xe1, - 0x46, 0x7c, 0xd3, 0x0d, 0xdc, 0x56, 0x78, 0xcc, 0x0a, 0xb8, 0xd8, 0xf3, 0x69, 0x98, 0xba, 0x45, - 0x7d, 0x9a, 0xf6, 0x41, 0x56, 0xea, 0x83, 0x50, 0x7d, 0x29, 0x3f, 0x48, 0x7d, 0x06, 0xbb, 0x03, - 0x85, 0x1a, 0x8f, 0x68, 0xdb, 0xbc, 0xd0, 0xd3, 0xab, 0xfa, 0x77, 0x5d, 0xae, 0xf1, 0x48, 0x0e, - 0xa2, 0x8c, 0xcb, 0xc3, 0x8d, 0x48, 0xac, 0x35, 0x1e, 0xb1, 0x07, 0x30, 0xb2, 0xfa, 0xa4, 0xc3, - 0xeb, 0x11, 0xa5, 0xaa, 0xbb, 0x74, 0x34, 0x3f, 0x89, 0xab, 0x65, 0xaa, 0xe3, 0x08, 0xd0, 0x3b, - 0x4b, 0xa2, 0x2c, 0x5c, 0x87, 0xa2, 0xaa, 0xfc, 0x24, 0x33, 0x77, 0xe1, 0x6d, 0x18, 0xd7, 0x2a, - 0x39, 0xd1, 0xa4, 0xff, 0x19, 0xb1, 0xaf, 0xfa, 0x4d, 0x95, 0xdd, 0x6e, 0xb5, 0x47, 0xcc, 0xcb, - 0xe9, 0x59, 0xd7, 0x45, 0x89, 0xf3, 0x90, 0x8a, 0x8e, 0x90, 0xf7, 0xaa, 0x30, 0x5d, 0x7b, 0xe8, - 0x75, 0x92, 0x80, 0x98, 0xc6, 0x61, 0x8a, 0xa9, 0x2c, 0xe8, 0xce, 0x9d, 0x3e, 0x4c, 0xd3, 0x74, - 0xd6, 0x9f, 0xe6, 0x60, 0x44, 0xfc, 0x75, 0xff, 0xfa, 0x33, 0xba, 0x65, 0x5e, 0x33, 0xb6, 0xcc, - 0x19, 0x2d, 0x26, 0x35, 0x6e, 0x1c, 0xd7, 0x8f, 0xd9, 0x2c, 0x0f, 0x68, 0x80, 0x24, 0x32, 0xbb, - 0x09, 0xa3, 0x64, 0x0d, 0x44, 0x66, 0xdb, 0x7a, 0x90, 0x6b, 0x65, 0x27, 0x14, 0x5f, 0xce, 0xfd, - 0x4e, 0x5a, 0x9b, 0xa1, 0xa8, 0x85, 0x48, 0xae, 0x42, 0x93, 0x1a, 0x39, 0x51, 0x7d, 0xf4, 0xb3, - 0x93, 0x21, 0x9a, 0xb5, 0x2c, 0xc6, 0x7d, 0xbc, 0xf0, 0x2b, 0xf4, 0x90, 0x51, 0x38, 0x8a, 0xc9, - 0x69, 0x95, 0x32, 0x32, 0xf3, 0x8d, 0xe3, 0xf7, 0x4e, 0xc9, 0xc0, 0xc6, 0xea, 0xc3, 0xde, 0x83, - 0x89, 0x1b, 0x7e, 0xf0, 0xd8, 0x0d, 0x64, 0xb8, 0x4a, 0xb2, 0x1c, 0x10, 0x57, 0xc7, 0xc9, 0x1d, - 0x09, 0x97, 0x01, 0x2f, 0xbf, 0x73, 0x50, 0x1e, 0x5a, 0xf2, 0xfd, 0xa6, 0x6d, 0xa0, 0xb3, 0x0d, - 0x98, 0xbc, 0xeb, 0x3e, 0xd1, 0x2e, 0xbd, 0xd2, 0x71, 0xe6, 0x92, 0x98, 0xc0, 0xe2, 0xd6, 0x7c, - 0xbc, 0x69, 0x96, 0x49, 0xcf, 0x3c, 0x98, 0xda, 0xf4, 0x83, 0x88, 0x2a, 0xf1, 0xda, 0xbb, 0xd4, - 0xd8, 0x5e, 0xe3, 0xb2, 0x2b, 0x99, 0xc6, 0x65, 0x67, 0x3b, 0x7e, 0x10, 0x39, 0x3b, 0x31, 0xb9, - 0x11, 0xd0, 0xca, 0x60, 0xcc, 0xde, 0x83, 0x19, 0x2d, 0x60, 0xdf, 0x0d, 0x3f, 0x68, 0xb9, 0x4a, - 0x28, 0x47, 0x3d, 0x30, 0xda, 0x9b, 0xec, 0x20, 0xd8, 0xee, 0xc5, 0x64, 0x5f, 0xce, 0x72, 0x45, - 0x1a, 0x4e, 0xac, 0xd3, 0x32, 0x5c, 0x91, 0xfa, 0x59, 0xa7, 0xf5, 0x3a, 0x25, 0xed, 0x1e, 0x65, - 0xbd, 0x5a, 0x5c, 0xba, 0x4a, 0xd7, 0xef, 0xe3, 0xad, 0x53, 0xe3, 0x71, 0xeb, 0x63, 0xa5, 0xba, - 0x08, 0x85, 0xa5, 0xcd, 0x1b, 0xf8, 0x7a, 0xa1, 0x0c, 0x6d, 0xda, 0x7b, 0x6e, 0xbb, 0x8e, 0xc2, - 0x32, 0x59, 0x8c, 0xeb, 0x3b, 0xf2, 0xd2, 0xe6, 0x0d, 0xe6, 0xc2, 0xec, 0x26, 0x0f, 0x5a, 0x5e, - 0xf4, 0xa5, 0xab, 0x57, 0xb5, 0x81, 0x2a, 0xe2, 0xa7, 0x5d, 0xa1, 0x4f, 0x2b, 0x77, 0x10, 0xc5, - 0x79, 0x72, 0xf5, 0x6a, 0xe6, 0x70, 0xc4, 0x1f, 0x96, 0xc5, 0x4b, 0xec, 0x8c, 0x77, 0xdd, 0x27, - 0x89, 0xa1, 0x7f, 0x48, 0x4e, 0x9d, 0xe7, 0xd4, 0xc4, 0x4a, 0x9c, 0x04, 0x8c, 0x9d, 0xd1, 0x24, - 0x12, 0x77, 0x9d, 0x64, 0x7a, 0x85, 0xe4, 0x0e, 0xb3, 0xa0, 0x54, 0x3a, 0xca, 0xf3, 0x57, 0x17, - 0xd8, 0x35, 0x74, 0x76, 0x2f, 0xbe, 0xb1, 0xc9, 0x1b, 0x0f, 0x25, 0x44, 0xbc, 0xa2, 0xdf, 0xd8, - 0xa4, 0x22, 0xc5, 0x68, 0xd6, 0x74, 0x7c, 0xcd, 0x97, 0x9e, 0x0f, 0xb6, 0xc9, 0xa5, 0xf7, 0x22, - 0x38, 0x71, 0xf2, 0x8b, 0x20, 0x87, 0xa1, 0x35, 0xbf, 0xfe, 0x90, 0xa2, 0x70, 0x7d, 0x51, 0x2c, - 0xf7, 0xa6, 0x5f, 0x7f, 0xf8, 0xf4, 0xac, 0x72, 0x91, 0x3d, 0x5b, 0x17, 0x9f, 0x2a, 0x66, 0x01, - 0xf5, 0x09, 0x59, 0x7a, 0xce, 0xc5, 0x37, 0x21, 0xad, 0x4c, 0x0a, 0x3e, 0x72, 0xd2, 0xa8, 0xae, - 0xb5, 0x4d, 0x72, 0xc6, 0xa1, 0xb4, 0xc2, 0xc3, 0x87, 0x91, 0xdf, 0x59, 0x6e, 0x7a, 0x9d, 0x6d, - 0xdf, 0x0d, 0x54, 0x6c, 0xd4, 0xde, 0xf5, 0xfd, 0x5a, 0xe6, 0xfa, 0x9e, 0x69, 0x48, 0x7a, 0xa7, - 0xae, 0x18, 0xd8, 0x3d, 0x2c, 0xd9, 0x97, 0x61, 0x4a, 0x4c, 0xee, 0xd5, 0x27, 0x11, 0x6f, 0xcb, - 0x91, 0x9f, 0x41, 0xd1, 0x61, 0x4e, 0x4b, 0x06, 0x10, 0x17, 0xca, 0x39, 0x85, 0x8b, 0x9d, 0xc7, - 0x04, 0x46, 0x04, 0x33, 0x83, 0x15, 0x6b, 0xc0, 0xfc, 0x5d, 0xf7, 0x89, 0x96, 0xc6, 0x51, 0x9b, - 0xa4, 0x0c, 0x27, 0xd8, 0xc5, 0xc3, 0x83, 0xf2, 0x2b, 0x62, 0x82, 0x25, 0xe1, 0x7a, 0xfb, 0xcc, - 0xd7, 0xbe, 0x9c, 0xd8, 0xf7, 0xc3, 0x19, 0x6a, 0xd6, 0x0a, 0x66, 0xc8, 0xf1, 0x83, 0xfd, 0xda, - 0x9e, 0x8b, 0x3e, 0x3e, 0xb3, 0x27, 0xdb, 0x10, 0x55, 0x87, 0x35, 0x14, 0x1f, 0x27, 0x94, 0x8c, - 0xec, 0x7e, 0x35, 0xb0, 0x8f, 0x60, 0x4a, 0x3e, 0xd9, 0xdc, 0xf2, 0xc3, 0x08, 0x2f, 0xf4, 0x73, - 0x27, 0x33, 0x5d, 0x97, 0xef, 0x40, 0xd2, 0xd9, 0x23, 0xa5, 0x00, 0x48, 0x71, 0x66, 0xef, 0xc0, - 0xf8, 0xa6, 0xd7, 0x96, 0x31, 0x06, 0xab, 0x9b, 0xa8, 0x7a, 0xa4, 0xf3, 0xa7, 0xe3, 0xb5, 0x1d, - 0x75, 0xab, 0xee, 0xc4, 0xdb, 0x85, 0x8e, 0xcd, 0x1e, 0xc0, 0x78, 0xad, 0x76, 0xeb, 0x86, 0x27, - 0x0e, 0xc0, 0xce, 0xfe, 0xfc, 0xe9, 0x3e, 0x5f, 0xf9, 0x72, 0xe6, 0x57, 0x4e, 0x86, 0xe1, 0x1e, - 0xa6, 0xc6, 0x77, 0xea, 0x7e, 0x67, 0xdf, 0xd6, 0x39, 0x65, 0x98, 0x73, 0x9f, 0x79, 0xca, 0xe6, - 0xdc, 0x55, 0x98, 0xd6, 0x0c, 0x2c, 0xd1, 0xb8, 0x72, 0x3e, 0x09, 0x4c, 0xa3, 0x9b, 0x6f, 0xa7, - 0xdd, 0x17, 0xd3, 0x74, 0xca, 0x8e, 0xfb, 0xec, 0x49, 0xed, 0xb8, 0x3d, 0x98, 0x91, 0x83, 0x41, - 0xf3, 0x00, 0x47, 0x7a, 0xa1, 0x4f, 0x1f, 0x5e, 0xca, 0xec, 0xc3, 0x59, 0x1a, 0x69, 0x35, 0xc9, - 0xf0, 0x89, 0xb2, 0x97, 0x2b, 0xdb, 0x01, 0x46, 0x40, 0x4a, 0xcc, 0x8f, 0x75, 0x3d, 0xdf, 0xa7, - 0xae, 0x57, 0x32, 0xeb, 0x9a, 0x52, 0x75, 0x6d, 0xcb, 0x6a, 0x32, 0x38, 0xb2, 0xb6, 0xaa, 0x47, - 0xcd, 0x2f, 0xec, 0xd8, 0x17, 0x0c, 0x3d, 0x68, 0x2f, 0x82, 0x0c, 0xf0, 0x9b, 0x9e, 0xb4, 0xe9, - 0x7e, 0xcf, 0xe0, 0xcc, 0x9e, 0xc0, 0xe9, 0xde, 0xaf, 0xc0, 0x3a, 0xcf, 0x61, 0x9d, 0xe7, 0x8c, - 0x3a, 0xd3, 0x48, 0x72, 0xde, 0x98, 0xcd, 0x4a, 0xd7, 0xda, 0x87, 0x3f, 0xfb, 0xeb, 0x39, 0x38, - 0x73, 0xf7, 0x46, 0x05, 0xf3, 0xd1, 0x79, 0x32, 0xe4, 0x54, 0xec, 0xf6, 0xf9, 0x22, 0xe9, 0xca, - 0xd3, 0xfa, 0x7b, 0x25, 0x71, 0xe0, 0x56, 0x21, 0x64, 0xc4, 0x97, 0x5b, 0x3b, 0xae, 0x4c, 0x73, - 0x47, 0x2c, 0x32, 0x7c, 0x43, 0xbf, 0xf5, 0x07, 0xe5, 0x9c, 0xdd, 0xaf, 0x2a, 0xd6, 0x84, 0x05, - 0xb3, 0x5b, 0x94, 0xa5, 0xfd, 0x1e, 0x6f, 0x36, 0xe7, 0xcb, 0x38, 0xa3, 0xdf, 0x38, 0x3c, 0x28, - 0x5f, 0xec, 0xe9, 0xdd, 0xd8, 0x7a, 0x5f, 0x60, 0x6a, 0x0d, 0x3e, 0x82, 0xdf, 0xed, 0xa1, 0xe2, - 0x64, 0x69, 0x2a, 0xc3, 0xce, 0xdc, 0xfa, 0xb5, 0x7c, 0xea, 0xa4, 0x62, 0x55, 0x18, 0xa5, 0x09, - 0x48, 0xa2, 0x7b, 0xef, 0x34, 0x3b, 0x97, 0x39, 0xcd, 0x46, 0x69, 0x2e, 0xdb, 0x8a, 0x9e, 0x3d, - 0x16, 0xac, 0xf0, 0x2b, 0xe8, 0xae, 0xf3, 0x55, 0x79, 0x10, 0x21, 0xc8, 0x38, 0x72, 0x57, 0x4e, - 0xee, 0x3d, 0x65, 0x3a, 0xe7, 0xe1, 0xd9, 0xab, 0x6a, 0x63, 0x0f, 0x65, 0xb2, 0x94, 0x42, 0xec, - 0x82, 0x63, 0x66, 0x46, 0x79, 0x6a, 0x15, 0x8a, 0x5a, 0xac, 0x5f, 0xcd, 0xc1, 0xa4, 0x71, 0xd4, - 0xb1, 0xeb, 0x9a, 0x7f, 0x59, 0xe2, 0x72, 0x6d, 0xe0, 0xe0, 0xee, 0x97, 0xf6, 0x3c, 0xbb, 0x4e, - 0xc6, 0xe2, 0xf9, 0xfe, 0x74, 0x38, 0xfb, 0xd3, 0xee, 0x86, 0x47, 0x6b, 0x06, 0xe3, 0x14, 0x6c, - 0x43, 0x7d, 0x52, 0xb0, 0xfd, 0xd2, 0x0b, 0x30, 0x65, 0xde, 0x85, 0xd8, 0x1b, 0x30, 0x82, 0x0a, - 0x55, 0x75, 0xb1, 0x96, 0xa9, 0xeb, 0xfd, 0x54, 0x36, 0x51, 0xc2, 0x61, 0xaf, 0x02, 0xc4, 0x56, - 0xbb, 0xea, 0x39, 0x61, 0xf8, 0xf0, 0xa0, 0x9c, 0x7b, 0xd3, 0xd6, 0x0a, 0xd8, 0xd7, 0x00, 0xd6, - 0xfd, 0x06, 0x8f, 0xf3, 0x55, 0x1e, 0xf1, 0x64, 0xfe, 0x5a, 0x4f, 0x22, 0x81, 0x53, 0x6d, 0xbf, - 0xc1, 0x7b, 0xb3, 0x06, 0x68, 0x1c, 0xd9, 0xe7, 0x61, 0xd8, 0xee, 0x8a, 0x4b, 0xbc, 0xd4, 0x9f, - 0x8c, 0xab, 0x23, 0xa7, 0xdb, 0xe4, 0xc9, 0x0d, 0x31, 0xe8, 0xa6, 0xad, 0xc1, 0x04, 0x80, 0x7d, - 0x20, 0x13, 0x0c, 0x50, 0x74, 0xbe, 0xe1, 0xe4, 0x81, 0x45, 0x13, 0x45, 0x7a, 0xe2, 0xf3, 0x69, - 0x24, 0x6c, 0x03, 0x46, 0xf5, 0x97, 0x01, 0xcd, 0x51, 0x59, 0x7f, 0x3d, 0xd2, 0xae, 0x9b, 0x94, - 0xe8, 0x32, 0xfd, 0x68, 0xa0, 0xb8, 0xb0, 0x77, 0x61, 0x4c, 0xb0, 0x17, 0x4b, 0x39, 0xa4, 0x6b, - 0x06, 0x3e, 0xa3, 0x68, 0x1f, 0x24, 0xb6, 0x03, 0x23, 0x86, 0x5e, 0x4c, 0xc0, 0xbe, 0x8c, 0x29, - 0x14, 0xa9, 0xab, 0x8f, 0x34, 0xa5, 0xb8, 0xd0, 0xd3, 0xd5, 0x98, 0x53, 0xb1, 0x37, 0x27, 0x7b, - 0xcc, 0x8f, 0xed, 0xc6, 0x71, 0xb2, 0x06, 0x49, 0x0a, 0xf1, 0x7a, 0x4f, 0x05, 0xf3, 0x2a, 0xf4, - 0x53, 0x6f, 0xde, 0x51, 0x83, 0x2f, 0xeb, 0x40, 0x29, 0x91, 0xf2, 0xa8, 0x2e, 0x38, 0xaa, 0xae, - 0x37, 0x7b, 0xea, 0xd2, 0x07, 0xb0, 0xa7, 0xba, 0x1e, 0xee, 0xac, 0x01, 0x53, 0xea, 0xc4, 0xa0, - 0xfa, 0xc6, 0x8f, 0xaa, 0xef, 0xd5, 0x9e, 0xfa, 0x66, 0x1b, 0xdb, 0xbd, 0xf5, 0xa4, 0x78, 0xb2, - 0x77, 0x61, 0x52, 0x41, 0x64, 0x16, 0xd0, 0x89, 0x24, 0xdd, 0x63, 0x63, 0xbb, 0x27, 0xf7, 0xa7, - 0x89, 0xac, 0x53, 0xcb, 0xd9, 0x31, 0x69, 0x50, 0xa7, 0x67, 0x85, 0x89, 0xcc, 0x3e, 0x84, 0xf1, - 0x6a, 0x4b, 0x34, 0xc4, 0x6f, 0xbb, 0x11, 0x27, 0x27, 0x36, 0x65, 0x16, 0xa2, 0x95, 0x68, 0x53, - 0x55, 0xe6, 0x37, 0x4d, 0x8a, 0x8c, 0xfc, 0xa6, 0x09, 0x58, 0x74, 0x9e, 0x7c, 0x0a, 0xa2, 0x39, - 0xac, 0x1c, 0xdc, 0xce, 0x65, 0x98, 0x66, 0x68, 0xec, 0x29, 0x0a, 0xa6, 0x80, 0xaa, 0xa7, 0x98, - 0x54, 0x14, 0x4c, 0x9d, 0x27, 0x7b, 0x0f, 0xc6, 0x29, 0x5f, 0x4e, 0xc5, 0x5e, 0x0f, 0xe7, 0x4b, - 0xd8, 0x78, 0x74, 0xcb, 0x57, 0xa9, 0x75, 0x1c, 0x37, 0x48, 0xd9, 0x20, 0x26, 0xf8, 0xec, 0x4b, - 0x30, 0xf7, 0xc0, 0x6b, 0x37, 0xfc, 0xc7, 0x21, 0x1d, 0x53, 0xb4, 0xd1, 0xcd, 0x24, 0x1e, 0x40, - 0x8f, 0x65, 0x79, 0x2c, 0x9c, 0xf5, 0x6c, 0x7c, 0x99, 0x1c, 0xd8, 0x5f, 0xee, 0xe1, 0x2c, 0x67, - 0x10, 0x3b, 0x6a, 0x06, 0x2d, 0xf6, 0xcc, 0xa0, 0xde, 0xea, 0xd3, 0xd3, 0x29, 0xb3, 0x1a, 0xe6, - 0x03, 0x33, 0xcf, 0xf7, 0xdb, 0xbe, 0xd7, 0x9e, 0x9f, 0xc5, 0xbd, 0xf0, 0xf9, 0xb4, 0x23, 0x3c, - 0xe2, 0x51, 0x9e, 0x58, 0xeb, 0xf0, 0xa0, 0xfc, 0x62, 0x5a, 0x08, 0xff, 0xc8, 0x37, 0x14, 0xe5, - 0x19, 0xac, 0xd9, 0x87, 0x30, 0x21, 0xfe, 0x8f, 0xb5, 0x04, 0x73, 0x86, 0x31, 0x9f, 0x86, 0x49, - 0xf5, 0xe0, 0x18, 0x61, 0x42, 0x9f, 0x0c, 0x05, 0x82, 0xc1, 0x8a, 0xbd, 0x0d, 0x20, 0xe4, 0x18, - 0xda, 0x8e, 0x4f, 0x25, 0x41, 0x47, 0x51, 0x0c, 0xea, 0xdd, 0x88, 0x13, 0x64, 0xf6, 0x2e, 0x8c, - 0x8b, 0x5f, 0xb5, 0x6e, 0xc3, 0x17, 0x6b, 0xe3, 0x34, 0xd2, 0x4a, 0x7f, 0x42, 0x41, 0x1b, 0x4a, - 0xb8, 0xe1, 0x4f, 0x98, 0xa0, 0xb3, 0x5b, 0x30, 0x8d, 0xc1, 0x61, 0xab, 0x98, 0x44, 0x3a, 0xf2, - 0x78, 0x38, 0x7f, 0x46, 0x7b, 0xc2, 0x16, 0x45, 0x8e, 0x17, 0x97, 0xe9, 0x97, 0x8b, 0x14, 0x19, - 0x0b, 0x61, 0x36, 0xd9, 0x5d, 0x92, 0x07, 0xf1, 0x79, 0xec, 0x24, 0x25, 0x52, 0xf7, 0x62, 0xc8, - 0xfd, 0x58, 0x8c, 0x88, 0xb6, 0x71, 0xa9, 0xe7, 0x04, 0xbd, 0xc2, 0x2c, 0xee, 0xcc, 0x06, 0x76, - 0x73, 0x79, 0x33, 0x1d, 0x3d, 0xf5, 0x2c, 0xb6, 0x00, 0x87, 0x79, 0xb7, 0x9e, 0x24, 0xb0, 0xcd, - 0x88, 0xa0, 0x9a, 0x41, 0xcd, 0xbe, 0x09, 0xa7, 0xd4, 0x0e, 0x42, 0x45, 0x34, 0xaf, 0x17, 0x4e, - 0xb8, 0x13, 0x37, 0xb6, 0xe3, 0xaa, 0x7b, 0xa6, 0x74, 0x76, 0x15, 0xcc, 0x85, 0x71, 0x1c, 0x56, - 0xaa, 0xf1, 0xf9, 0xa3, 0x6a, 0xbc, 0xd8, 0x53, 0xe3, 0x69, 0x9c, 0x28, 0xbd, 0x95, 0xe9, 0x3c, - 0xd9, 0x12, 0x4c, 0xd2, 0x3a, 0xa2, 0xd9, 0xf6, 0x02, 0xf6, 0x16, 0x6a, 0x95, 0xd4, 0x0a, 0xec, - 0x99, 0x70, 0x26, 0x89, 0xbe, 0x23, 0xcb, 0x67, 0x84, 0x73, 0xc6, 0x8e, 0x9c, 0x7e, 0x3d, 0x30, - 0x91, 0xc5, 0x8e, 0x94, 0x48, 0x31, 0xab, 0x4f, 0x3a, 0x01, 0xe9, 0x8c, 0x5e, 0x4c, 0x92, 0x8a, - 0x68, 0xc2, 0x8f, 0xc3, 0x63, 0x0c, 0x7d, 0x4b, 0xc8, 0xe2, 0xc0, 0xee, 0xc1, 0x6c, 0x7c, 0x6a, - 0x6b, 0x8c, 0xcb, 0x49, 0x72, 0x96, 0xe4, 0xa8, 0xcf, 0xe6, 0x9b, 0x45, 0xcf, 0x5c, 0x38, 0x63, - 0x9c, 0xd3, 0x1a, 0xeb, 0xf3, 0xc8, 0x1a, 0x13, 0x26, 0x9b, 0x87, 0x7c, 0x36, 0xfb, 0x7e, 0x7c, - 0xd8, 0x47, 0xb0, 0x90, 0x3e, 0x9b, 0xb5, 0x5a, 0x5e, 0xc2, 0x5a, 0x5e, 0x3f, 0x3c, 0x28, 0x5f, - 0xe8, 0x39, 0xde, 0xb3, 0x2b, 0x3a, 0x82, 0x1b, 0xfb, 0x1a, 0xcc, 0x9b, 0xe7, 0xb3, 0x56, 0x93, - 0x85, 0x35, 0xe1, 0xd2, 0x89, 0x0f, 0xf6, 0xec, 0x1a, 0xfa, 0xf2, 0x60, 0x11, 0x94, 0x33, 0x67, - 0xb7, 0x56, 0xcd, 0xcb, 0x49, 0x83, 0x7a, 0x56, 0x49, 0x76, 0x75, 0xc7, 0xb1, 0x64, 0x8f, 0xe1, - 0xc5, 0xac, 0x63, 0x42, 0xab, 0xf4, 0x95, 0x58, 0x2b, 0xfb, 0xa9, 0xec, 0x23, 0x27, 0xbb, 0xe6, - 0x63, 0xd8, 0xb2, 0x2f, 0xc3, 0x29, 0x6d, 0x7d, 0x69, 0xf5, 0xbd, 0x8a, 0xf5, 0xa1, 0xff, 0xae, - 0xbe, 0x30, 0xb3, 0x6b, 0xc9, 0xe6, 0xc1, 0x5a, 0x30, 0xab, 0x1a, 0x8e, 0xea, 0x6f, 0x3a, 0x7a, - 0x2e, 0x18, 0xbb, 0x6a, 0x2f, 0x86, 0x96, 0xf2, 0x7e, 0xdb, 0xe9, 0x24, 0x84, 0xfa, 0x4c, 0xcf, - 0xe0, 0xcb, 0x6e, 0xc1, 0x48, 0x6d, 0xb3, 0x7a, 0xe3, 0xc6, 0xea, 0xfc, 0x6b, 0x58, 0x83, 0x72, - 0xf6, 0x91, 0x40, 0xe3, 0xd2, 0x44, 0x36, 0x66, 0x1d, 0x6f, 0x67, 0xc7, 0xf0, 0xa9, 0x92, 0xa8, - 0xec, 0x2f, 0xa3, 0x75, 0x97, 0xd8, 0x51, 0x2b, 0x61, 0xe8, 0xed, 0x62, 0x96, 0x89, 0x70, 0xfe, - 0x75, 0xe3, 0xa5, 0x97, 0x4e, 0x8f, 0xfd, 0x65, 0xcc, 0xf7, 0xd3, 0x83, 0x2e, 0xa5, 0xcd, 0xc3, - 0x83, 0xf2, 0x39, 0xda, 0xb9, 0x1d, 0x37, 0x61, 0xa5, 0x6f, 0xe2, 0xbd, 0x15, 0xdd, 0x1e, 0x2a, - 0x5e, 0x2c, 0x5d, 0xba, 0x3d, 0x54, 0xbc, 0x54, 0x7a, 0xdd, 0x7e, 0x21, 0x3b, 0x47, 0xb9, 0xec, - 0x6b, 0xfb, 0xc2, 0x51, 0xa5, 0xc9, 0x48, 0x58, 0x7f, 0x37, 0x07, 0xe5, 0x63, 0x3e, 0x58, 0xec, - 0xad, 0x49, 0x6f, 0xd6, 0xb8, 0x72, 0x21, 0x96, 0xee, 0x34, 0x71, 0x81, 0x63, 0x3e, 0x5e, 0x9b, - 0x24, 0xe8, 0xb5, 0x44, 0x41, 0xe3, 0x35, 0xe7, 0xb5, 0xde, 0x60, 0xf1, 0x0a, 0xcb, 0xfa, 0x99, - 0x1c, 0xcc, 0x66, 0x8c, 0x0f, 0xbb, 0x00, 0x43, 0x98, 0x05, 0x46, 0xb3, 0x36, 0x48, 0x65, 0x7f, - 0xc1, 0x72, 0xf6, 0x69, 0x18, 0x5d, 0x59, 0xaf, 0xd5, 0x2a, 0xeb, 0xea, 0x2a, 0x2b, 0xb7, 0xf1, - 0x76, 0xe8, 0x84, 0xae, 0xf9, 0x48, 0x49, 0x68, 0xec, 0x4d, 0x18, 0xa9, 0x6e, 0x22, 0x81, 0x34, - 0x77, 0xc3, 0x2f, 0xf4, 0x3a, 0x69, 0x7c, 0x42, 0xb2, 0x7e, 0x34, 0x07, 0xac, 0x77, 0xb2, 0xb1, - 0xab, 0x30, 0xae, 0x4f, 0x69, 0x79, 0xf1, 0xc6, 0x07, 0x35, 0x6d, 0xc2, 0xda, 0x3a, 0x0e, 0x5b, - 0x81, 0x61, 0xcc, 0x93, 0x17, 0xbf, 0x8e, 0x66, 0x1e, 0x8c, 0x67, 0x7a, 0x0e, 0xc6, 0x61, 0xcc, - 0xc2, 0x67, 0x4b, 0x62, 0xeb, 0x37, 0x73, 0xc0, 0x7a, 0x85, 0x89, 0x81, 0xad, 0x33, 0xde, 0xd2, - 0xdc, 0x95, 0xf5, 0x3c, 0x0f, 0x71, 0x92, 0x1e, 0xfd, 0x12, 0x99, 0x38, 0x36, 0x5f, 0x30, 0x94, - 0x16, 0xfd, 0x7d, 0xdc, 0x2e, 0xc1, 0xf0, 0x7d, 0x1e, 0x6c, 0x2b, 0x4b, 0x4e, 0xb4, 0xfe, 0x7a, - 0x24, 0x00, 0xfa, 0x25, 0x1e, 0x31, 0xac, 0x3f, 0xca, 0xc1, 0x5c, 0x96, 0x84, 0x7b, 0x8c, 0x2b, - 0x9a, 0x95, 0xf2, 0xa2, 0x43, 0xcb, 0x0c, 0x69, 0x1a, 0x16, 0xfb, 0xce, 0x95, 0x61, 0x58, 0x34, - 0x56, 0x8d, 0x30, 0x2a, 0x51, 0x44, 0x6f, 0x84, 0xb6, 0x84, 0x0b, 0x04, 0x19, 0x96, 0x6b, 0x08, - 0x23, 0xba, 0x21, 0x02, 0xce, 0x47, 0x5b, 0xc2, 0x05, 0xc2, 0x5d, 0xbf, 0x11, 0xa7, 0x88, 0x46, - 0x84, 0x96, 0x00, 0xd8, 0x12, 0xce, 0x2e, 0xc0, 0xe8, 0x46, 0x7b, 0x8d, 0xbb, 0x8f, 0x54, 0xac, - 0x71, 0xb4, 0x24, 0xf1, 0xdb, 0x4e, 0x53, 0xc0, 0x6c, 0x55, 0x68, 0xfd, 0x44, 0x0e, 0x66, 0x7a, - 0x84, 0xeb, 0xe3, 0xbd, 0xed, 0x8e, 0x76, 0x7b, 0x19, 0xa4, 0x7d, 0xf2, 0xf3, 0x87, 0xb2, 0x3f, - 0xdf, 0xfa, 0x7f, 0x87, 0xe0, 0x4c, 0x1f, 0x5d, 0x47, 0xe2, 0x96, 0x97, 0x3b, 0xd6, 0x2d, 0xef, - 0x2b, 0x30, 0xb9, 0xdc, 0x74, 0xbd, 0x56, 0xb8, 0xe5, 0x27, 0x5f, 0x9c, 0x58, 0xf7, 0x63, 0x99, - 0xca, 0x92, 0xad, 0xcc, 0xc0, 0xcf, 0xd6, 0x91, 0xc2, 0x89, 0xfc, 0x5e, 0x51, 0xcb, 0x60, 0xd6, - 0xe3, 0x18, 0x57, 0xf8, 0x73, 0xe2, 0x18, 0x67, 0xba, 0x6a, 0x0c, 0x3d, 0x55, 0x57, 0x8d, 0x6c, - 0x33, 0xcf, 0xe1, 0x4f, 0x62, 0xf4, 0xbb, 0x0c, 0x93, 0xd2, 0x94, 0xa6, 0x12, 0xca, 0x41, 0x1a, - 0xe9, 0x31, 0xbf, 0x71, 0xc3, 0xde, 0xb1, 0x30, 0x68, 0xd8, 0x2d, 0xd3, 0xad, 0x60, 0x14, 0x9f, - 0x00, 0x2f, 0xf4, 0x77, 0x1b, 0x30, 0x9e, 0xfe, 0x75, 0x52, 0xeb, 0x27, 0xf2, 0xa6, 0xd7, 0xdc, - 0x9f, 0xc7, 0x99, 0x77, 0x09, 0x86, 0x1f, 0xec, 0xf1, 0x40, 0xed, 0x77, 0xf8, 0x21, 0x8f, 0x05, - 0x40, 0xff, 0x10, 0xc4, 0x60, 0x37, 0x60, 0x6a, 0x53, 0x8e, 0x84, 0xea, 0xde, 0xa1, 0xe4, 0x0a, - 0xda, 0x21, 0x45, 0x49, 0x46, 0xff, 0xa6, 0xa8, 0xac, 0x9b, 0x70, 0xce, 0x58, 0x90, 0x14, 0xe5, - 0x43, 0x5a, 0xf7, 0xcb, 0x13, 0x71, 0x2a, 0xf1, 0x67, 0x48, 0x76, 0x0f, 0x3b, 0x05, 0xb5, 0x76, - 0xe0, 0xc5, 0x23, 0x19, 0x89, 0x83, 0x08, 0x3a, 0xf1, 0xaf, 0x94, 0x09, 0xe2, 0x91, 0xa4, 0xb6, - 0x46, 0x67, 0x7d, 0x3f, 0x4c, 0xe8, 0xbd, 0x8c, 0x7b, 0xaa, 0xf8, 0x4d, 0x9b, 0x9a, 0xdc, 0x53, - 0x05, 0xc0, 0x96, 0xf0, 0x44, 0xb5, 0x9d, 0xcf, 0x56, 0x6d, 0x27, 0xc3, 0x5f, 0x38, 0x6e, 0xf8, - 0x45, 0xe5, 0xb8, 0x64, 0xb5, 0xca, 0xf1, 0xb7, 0x5e, 0x39, 0x86, 0xf1, 0xb0, 0x25, 0xfc, 0xa9, - 0x56, 0xfe, 0x1b, 0x2a, 0xdb, 0x0a, 0x3a, 0x0f, 0x28, 0x5d, 0x41, 0x92, 0xbd, 0x79, 0x36, 0x4b, - 0x03, 0x90, 0x60, 0x26, 0x87, 0x64, 0xfe, 0xb8, 0x43, 0xf2, 0x24, 0x13, 0x11, 0x45, 0x2f, 0x39, - 0xa4, 0x43, 0x89, 0x60, 0xe3, 0xf6, 0xbc, 0xc6, 0x2b, 0x2c, 0xeb, 0x5b, 0x39, 0x38, 0x95, 0xa9, - 0x42, 0x14, 0xb5, 0x4a, 0x5d, 0xa5, 0xb6, 0x0e, 0xd3, 0x8a, 0x4a, 0x89, 0x71, 0x12, 0x1f, 0xee, - 0xc1, 0xdb, 0x62, 0xbd, 0x04, 0x63, 0xf1, 0x03, 0x16, 0x9b, 0x53, 0x43, 0x87, 0x56, 0x5b, 0xea, - 0x1d, 0xa4, 0x06, 0x20, 0xbe, 0xe0, 0xa9, 0xda, 0x18, 0x5a, 0xbf, 0x91, 0x97, 0x99, 0xf8, 0x9e, - 0xd9, 0x70, 0x8c, 0xd9, 0x86, 0x81, 0xa2, 0x49, 0xfd, 0x83, 0x30, 0xb2, 0x55, 0x18, 0xa9, 0x45, - 0x6e, 0xd4, 0x55, 0xae, 0xe7, 0xb3, 0x3a, 0x19, 0x16, 0xdc, 0x5f, 0x4c, 0x9c, 0x8f, 0x43, 0x84, - 0x18, 0x97, 0x26, 0x84, 0x68, 0xf6, 0x85, 0xbf, 0x93, 0x83, 0x09, 0x9d, 0x98, 0x7d, 0x08, 0x53, - 0x2a, 0xc8, 0x9c, 0x74, 0xc8, 0xa7, 0xd7, 0x36, 0x65, 0xaa, 0xa2, 0x82, 0xcc, 0xe9, 0x0e, 0xfc, - 0x06, 0xbe, 0xbe, 0x55, 0x77, 0x74, 0x64, 0xd6, 0x00, 0xd6, 0xda, 0x71, 0x9d, 0xc7, 0xdc, 0x7d, - 0xc8, 0xc3, 0xc8, 0x91, 0x26, 0x05, 0xf4, 0x28, 0xa7, 0xd8, 0xdf, 0xbd, 0x51, 0x91, 0xd6, 0x04, - 0x62, 0x24, 0x28, 0x5a, 0x60, 0x0f, 0x8d, 0xfe, 0xd2, 0xd0, 0xda, 0x71, 0x1f, 0xc8, 0x42, 0x49, - 0x67, 0xfd, 0xf1, 0x88, 0x9c, 0x6e, 0x14, 0x93, 0x72, 0x1b, 0xa6, 0x36, 0xaa, 0x2b, 0xcb, 0x9a, - 0xde, 0xd1, 0x4c, 0x69, 0xb2, 0xfa, 0x24, 0xe2, 0x41, 0xdb, 0x6d, 0xaa, 0x2b, 0x57, 0x72, 0x04, - 0xf9, 0x5e, 0xa3, 0x9e, 0xad, 0x93, 0x4c, 0x71, 0x14, 0x75, 0xc8, 0xcb, 0x5d, 0x5c, 0x47, 0x7e, - 0xc0, 0x3a, 0x42, 0xb7, 0xd5, 0xec, 0x53, 0x87, 0xc9, 0x91, 0xed, 0x41, 0xe9, 0x26, 0x8a, 0x4b, - 0x5a, 0x2d, 0x85, 0xa3, 0x6b, 0x79, 0x99, 0x6a, 0x79, 0x5e, 0xca, 0x59, 0xd9, 0xf5, 0xf4, 0x70, - 0x4d, 0xf6, 0x89, 0xa1, 0x63, 0xf7, 0x89, 0xbf, 0x91, 0x83, 0x11, 0x29, 0x8f, 0xd1, 0x34, 0xee, - 0x23, 0xf1, 0x3d, 0x78, 0x3a, 0x12, 0x5f, 0x09, 0xcf, 0x09, 0x63, 0x42, 0xcb, 0x32, 0xb6, 0x92, - 0x5a, 0x17, 0xca, 0x2c, 0x16, 0x5f, 0x10, 0x64, 0xc9, 0xf1, 0xcb, 0x82, 0x55, 0x13, 0x77, 0xf0, - 0xd1, 0x63, 0x3d, 0x0e, 0x95, 0x0b, 0xfd, 0x28, 0xb9, 0x83, 0x9b, 0x4e, 0xe0, 0x6b, 0x30, 0x46, - 0x4e, 0xe6, 0x4b, 0xfb, 0xf4, 0x4e, 0x58, 0x32, 0x4c, 0x2f, 0x1a, 0x4b, 0xfb, 0x89, 0xac, 0x49, - 0x6e, 0xea, 0xce, 0xf6, 0xbe, 0x91, 0xd8, 0x50, 0x21, 0xb2, 0x0d, 0x99, 0xf0, 0x4b, 0x46, 0xed, - 0x34, 0xc3, 0x74, 0xc7, 0x70, 0x0a, 0x5f, 0xa3, 0x3c, 0x55, 0x33, 0x82, 0x74, 0x26, 0x3c, 0xd8, - 0x1a, 0x94, 0xd0, 0x5c, 0x87, 0x37, 0xe4, 0xaa, 0xa9, 0xae, 0x48, 0x47, 0x66, 0x32, 0xb9, 0x8c, - 0x64, 0x19, 0x2d, 0xb7, 0x94, 0x0f, 0x51, 0x0f, 0xa5, 0xb8, 0x1f, 0x96, 0xd2, 0xb3, 0x8f, 0xbd, - 0x0b, 0xe3, 0x71, 0xd4, 0xd4, 0xd8, 0x8b, 0x11, 0xdf, 0x0b, 0x92, 0x30, 0xab, 0x66, 0x9a, 0x28, - 0x0d, 0x9d, 0x2d, 0x42, 0x51, 0x2c, 0xe2, 0x74, 0x4a, 0xc5, 0x2e, 0xc1, 0x74, 0xd7, 0x04, 0x85, - 0xc7, 0x6a, 0x30, 0x2b, 0x16, 0x4d, 0xcd, 0x6b, 0xef, 0x36, 0xf9, 0x9a, 0xbf, 0xeb, 0x77, 0xa3, - 0x7b, 0xf6, 0x1a, 0xed, 0xe1, 0x52, 0x22, 0x77, 0x5b, 0x4d, 0xa3, 0x38, 0x30, 0x12, 0x66, 0x67, - 0x50, 0x6b, 0x5b, 0xe5, 0x1f, 0xe4, 0x61, 0x5c, 0x9b, 0x4f, 0xec, 0x12, 0x14, 0xab, 0xe1, 0x9a, - 0x5f, 0x7f, 0x18, 0xc7, 0x37, 0x9b, 0x3c, 0x3c, 0x28, 0x8f, 0x79, 0xa1, 0xd3, 0x44, 0xa0, 0x1d, - 0x17, 0xb3, 0x25, 0x98, 0x94, 0x7f, 0xa9, 0x68, 0xf6, 0xf9, 0x44, 0x5f, 0x23, 0x91, 0x55, 0x1c, - 0x7b, 0x7d, 0xf7, 0x34, 0x48, 0xd8, 0x57, 0x01, 0x24, 0x00, 0x3d, 0x62, 0x0b, 0x83, 0xfb, 0xf2, - 0x52, 0x05, 0x19, 0xbe, 0xb0, 0x1a, 0x43, 0xf6, 0x75, 0x19, 0x65, 0x55, 0xcd, 0xff, 0xa1, 0xc1, - 0x9d, 0x91, 0x05, 0x7f, 0x27, 0x3b, 0x26, 0x82, 0xce, 0x92, 0x12, 0x50, 0x2c, 0xd8, 0xbc, 0xee, - 0x3f, 0xe2, 0xc1, 0x7e, 0x25, 0x42, 0x44, 0x0d, 0xc3, 0xfa, 0x9f, 0x72, 0xda, 0xaa, 0x61, 0xeb, - 0x98, 0x05, 0x54, 0xce, 0x08, 0x32, 0x99, 0x89, 0xef, 0x0c, 0x0a, 0x6e, 0xf3, 0x9d, 0xa5, 0xe7, - 0xc9, 0xc0, 0x77, 0x36, 0x9e, 0x57, 0xa9, 0xec, 0xa0, 0x12, 0xc8, 0xbe, 0x00, 0x43, 0xd8, 0x75, - 0xf9, 0x63, 0x9b, 0xa6, 0x8e, 0xed, 0x21, 0xd1, 0x67, 0xd8, 0x10, 0xa4, 0x64, 0x9f, 0x26, 0x6f, - 0x42, 0xd9, 0xf9, 0x53, 0xda, 0xd9, 0x2b, 0xbe, 0x23, 0x3e, 0xaf, 0x93, 0xb0, 0x18, 0xda, 0xec, - 0xf9, 0xbb, 0x79, 0x28, 0xa5, 0xd7, 0x2a, 0xfb, 0x00, 0x26, 0xd4, 0x79, 0x8a, 0x69, 0xe2, 0x45, - 0x2b, 0x27, 0x28, 0x14, 0xba, 0x3a, 0x54, 0xd3, 0x59, 0xe2, 0x75, 0x02, 0x21, 0xdc, 0x6c, 0x51, - 0x98, 0x2a, 0x6d, 0x95, 0x44, 0x7e, 0xd4, 0x49, 0x05, 0xf7, 0x54, 0x68, 0xec, 0x2d, 0x28, 0xdc, - 0xbd, 0x51, 0x21, 0xd7, 0x95, 0x52, 0xfa, 0xd4, 0x95, 0xa6, 0x79, 0xa6, 0xa1, 0xa0, 0xc0, 0x67, - 0x6b, 0x5a, 0x1c, 0xdc, 0x11, 0x23, 0xff, 0x95, 0x02, 0xc7, 0x8d, 0x3b, 0x3e, 0x20, 0xae, 0xcc, - 0x3f, 0x4f, 0x91, 0x1d, 0xff, 0x9b, 0x02, 0x8c, 0xc5, 0xf5, 0x33, 0x06, 0x28, 0xbb, 0xd1, 0x85, - 0x09, 0xff, 0x66, 0x67, 0xa1, 0xa8, 0xc4, 0x35, 0xf2, 0x60, 0x19, 0x0d, 0x49, 0x54, 0x9b, 0x07, - 0x25, 0x97, 0xc9, 0x65, 0x6e, 0xab, 0x9f, 0xec, 0x2a, 0xc4, 0x42, 0x57, 0x3f, 0xe9, 0x6c, 0x48, - 0x0c, 0x98, 0x1d, 0xa3, 0xb1, 0x29, 0xc8, 0x7b, 0x32, 0x5a, 0xd0, 0x98, 0x9d, 0xf7, 0x1a, 0xec, - 0x03, 0x28, 0xba, 0x8d, 0x06, 0x6f, 0x38, 0xae, 0xb2, 0x3d, 0x39, 0x6a, 0xd2, 0x14, 0x05, 0x37, - 0x79, 0x08, 0x20, 0x55, 0x25, 0x62, 0x15, 0x18, 0x6b, 0xba, 0xd2, 0xbc, 0xac, 0x31, 0xc0, 0x89, - 0x92, 0x70, 0x28, 0x0a, 0xb2, 0x7b, 0x21, 0x6f, 0xb0, 0xd7, 0x60, 0x48, 0x8c, 0x26, 0x1d, 0x21, - 0x4a, 0x4a, 0x14, 0x83, 0x29, 0x3b, 0xec, 0xd6, 0x73, 0x36, 0x22, 0xb0, 0x57, 0xa0, 0xd0, 0x5d, - 0xdc, 0xa1, 0xc3, 0xa1, 0x94, 0xc4, 0xa4, 0x8e, 0xd1, 0x44, 0x31, 0xbb, 0x06, 0xc5, 0xc7, 0x66, - 0x38, 0xe3, 0x53, 0xa9, 0x61, 0x8c, 0xf1, 0x63, 0x44, 0xf6, 0x1a, 0x14, 0xc2, 0xd0, 0x27, 0x83, - 0x0d, 0xb5, 0x04, 0x6b, 0xb5, 0x8d, 0x78, 0xd4, 0x04, 0xf7, 0x30, 0xf4, 0x97, 0x8a, 0x30, 0x22, - 0x4f, 0x0c, 0xeb, 0x45, 0x80, 0xe4, 0x1b, 0x7b, 0x3d, 0x92, 0xac, 0xaf, 0xc2, 0x58, 0xfc, 0x6d, - 0xec, 0x1c, 0xc0, 0x43, 0xbe, 0xef, 0xec, 0xb9, 0xed, 0x46, 0x53, 0x8a, 0x9b, 0x13, 0xf6, 0xd8, - 0x43, 0xbe, 0x7f, 0x0b, 0x01, 0xec, 0x0c, 0x8c, 0x76, 0xc4, 0xf0, 0xd3, 0x1c, 0x9f, 0xb0, 0x47, - 0x3a, 0xdd, 0x6d, 0x31, 0x95, 0xe7, 0x61, 0x14, 0x35, 0x81, 0xb4, 0x22, 0x27, 0x6d, 0xf5, 0xd3, - 0xfa, 0x93, 0x02, 0xe6, 0xfc, 0xd0, 0x1a, 0xc4, 0x5e, 0x86, 0xc9, 0x7a, 0xc0, 0xf1, 0x70, 0x72, - 0x85, 0xc8, 0x45, 0xf5, 0x4c, 0x24, 0xc0, 0x6a, 0x83, 0x5d, 0x80, 0xe9, 0x4e, 0x77, 0xbb, 0xe9, - 0xd5, 0x45, 0x6d, 0x4e, 0x7d, 0x9b, 0x82, 0x94, 0x4f, 0xd8, 0x93, 0x12, 0x7c, 0x87, 0xef, 0x2f, - 0x6f, 0x63, 0x38, 0xac, 0x92, 0x1e, 0xcd, 0x34, 0x8a, 0x53, 0xea, 0xda, 0xd3, 0x1a, 0x1c, 0x6d, - 0xcf, 0x4e, 0xc3, 0x88, 0xeb, 0xee, 0x76, 0x3d, 0x19, 0xb6, 0x66, 0xc2, 0xa6, 0x5f, 0xec, 0x53, - 0x30, 0x93, 0x04, 0xd8, 0x55, 0xcd, 0x18, 0xc6, 0x66, 0x94, 0xe2, 0x82, 0x65, 0x09, 0x67, 0x6f, - 0x02, 0xd3, 0xeb, 0xf3, 0xb7, 0x3f, 0xe2, 0x75, 0x39, 0x27, 0x27, 0xec, 0x19, 0xad, 0x64, 0x03, - 0x0b, 0xd8, 0x4b, 0x30, 0x11, 0xf0, 0x10, 0xc5, 0x3d, 0xec, 0x36, 0x4c, 0x89, 0x65, 0x8f, 0x2b, - 0x98, 0xe8, 0xbb, 0x8b, 0x50, 0xd2, 0xba, 0x03, 0x03, 0xc6, 0xca, 0x08, 0xdd, 0xf6, 0x54, 0x02, - 0xb7, 0x3b, 0xd5, 0x06, 0xfb, 0x12, 0x2c, 0x68, 0x98, 0x32, 0x3b, 0x97, 0xc3, 0x9b, 0xde, 0xae, - 0xb7, 0xdd, 0xe4, 0x34, 0xdf, 0x7a, 0x67, 0x75, 0x7c, 0x27, 0xb4, 0xe7, 0x13, 0x6a, 0x99, 0xb7, - 0x6b, 0x95, 0x68, 0xd9, 0x1a, 0xcc, 0xa5, 0x38, 0xf3, 0x86, 0xd3, 0xed, 0xf4, 0x8d, 0x13, 0x95, - 0xf0, 0x64, 0x26, 0x4f, 0xde, 0xb8, 0xd7, 0xb1, 0xbe, 0x04, 0x13, 0xfa, 0x9c, 0x14, 0x9d, 0xa0, - 0x0b, 0x1a, 0x34, 0xfb, 0xc6, 0x63, 0x58, 0x55, 0x5c, 0xf4, 0xa6, 0x12, 0x94, 0x28, 0xce, 0x1e, - 0x6c, 0x4f, 0xc6, 0x50, 0x31, 0x84, 0xd6, 0x12, 0xcc, 0xf4, 0x6c, 0x72, 0x5a, 0x22, 0x78, 0xb9, - 0x69, 0x1f, 0x9d, 0x08, 0xde, 0x6a, 0xc3, 0x84, 0x7e, 0x68, 0x1d, 0x13, 0x2a, 0xff, 0x34, 0x06, - 0x7e, 0x90, 0x3b, 0xfa, 0xc8, 0xe1, 0x41, 0x39, 0xef, 0x35, 0x30, 0xdc, 0xc3, 0x45, 0x28, 0x2a, - 0xf9, 0x8a, 0xc4, 0x1a, 0xd4, 0x65, 0x93, 0x60, 0xbf, 0x6f, 0xc7, 0xa5, 0xd6, 0x6b, 0x30, 0x4a, - 0xe7, 0xd2, 0xd1, 0x1a, 0x6c, 0xeb, 0x87, 0xf2, 0x30, 0x6d, 0x73, 0xb1, 0x6b, 0x72, 0x99, 0x1f, - 0xe3, 0x99, 0xbd, 0x50, 0x67, 0x87, 0x0f, 0x34, 0xda, 0x76, 0x44, 0x66, 0x8a, 0x7f, 0x94, 0x83, - 0xd9, 0x0c, 0xdc, 0x8f, 0x95, 0x99, 0xf1, 0x3a, 0x8c, 0xad, 0x78, 0x6e, 0xb3, 0xd2, 0x68, 0xc4, - 0x51, 0x20, 0x50, 0x2a, 0xc7, 0xf4, 0x2d, 0xae, 0x80, 0xea, 0x12, 0x4a, 0x8c, 0xca, 0x5e, 0xa7, - 0x49, 0x91, 0x24, 0xa7, 0xc5, 0x49, 0xf1, 0x9d, 0x83, 0x32, 0xc8, 0x6f, 0x4a, 0x32, 0x56, 0x63, - 0x48, 0x4f, 0x09, 0x4c, 0xbc, 0x34, 0x9e, 0xd9, 0xa1, 0xcb, 0x0e, 0xe9, 0x99, 0x6e, 0xde, 0x40, - 0xc9, 0x29, 0xfe, 0x56, 0x1e, 0x4e, 0x67, 0x13, 0x7e, 0xdc, 0x24, 0x9b, 0x98, 0x16, 0x44, 0x0b, - 0x43, 0x8c, 0x49, 0x36, 0x65, 0x0e, 0x11, 0xc4, 0x4f, 0x10, 0xd8, 0x0e, 0x4c, 0xae, 0xb9, 0x61, - 0x74, 0x8b, 0xbb, 0x41, 0xb4, 0xcd, 0xdd, 0x68, 0x00, 0x31, 0xfd, 0x15, 0xf5, 0x80, 0x8e, 0x92, - 0xc2, 0x9e, 0xa2, 0x4c, 0x09, 0xd2, 0x26, 0xdb, 0x78, 0xa2, 0x0c, 0x0d, 0x30, 0x51, 0xbe, 0x01, - 0xd3, 0x35, 0xde, 0x72, 0x3b, 0x7b, 0x7e, 0xa0, 0xdc, 0x7c, 0x2f, 0xc3, 0x64, 0x0c, 0xca, 0x9c, - 0x2d, 0x66, 0xb1, 0x81, 0xaf, 0x75, 0x44, 0xb2, 0x95, 0x98, 0xc5, 0xd6, 0xdf, 0xcb, 0xc3, 0x99, - 0x4a, 0x9d, 0xec, 0xda, 0xa8, 0x40, 0x99, 0xdf, 0x7e, 0x97, 0xeb, 0x66, 0x57, 0x60, 0xec, 0xae, - 0xfb, 0x64, 0x8d, 0xbb, 0x21, 0x0f, 0x29, 0xc5, 0x99, 0x94, 0x69, 0xdd, 0x27, 0x89, 0xb9, 0x97, - 0x9d, 0xe0, 0xe8, 0x97, 0xfe, 0xa1, 0x4f, 0x78, 0xe9, 0xb7, 0x60, 0xe4, 0x96, 0xdf, 0x6c, 0xd0, - 0x41, 0x4e, 0x0f, 0x9e, 0x7b, 0x08, 0xb1, 0xa9, 0x44, 0xdc, 0x95, 0xa7, 0xe2, 0x2f, 0xc6, 0x4f, - 0xf8, 0xae, 0x77, 0xc9, 0x05, 0x18, 0xc5, 0x8a, 0xe2, 0x24, 0xd1, 0x78, 0x68, 0x34, 0x39, 0x26, - 0xaa, 0x6a, 0xd8, 0xaa, 0x50, 0xef, 0x89, 0xe1, 0x4f, 0xd6, 0x13, 0xd6, 0x3f, 0xc4, 0xb7, 0x54, - 0xbd, 0x95, 0xe2, 0x24, 0xd2, 0x3e, 0x24, 0x37, 0xe0, 0x87, 0xe4, 0x9f, 0xda, 0x90, 0x14, 0xfa, - 0x0e, 0xc9, 0x0f, 0xe7, 0x61, 0x3c, 0xfe, 0xd8, 0xef, 0xb1, 0x58, 0xd8, 0x71, 0xbb, 0x06, 0x0a, - 0xcd, 0x51, 0xd3, 0xf6, 0x0a, 0x8a, 0x80, 0xf1, 0x05, 0x18, 0xa1, 0xc5, 0x94, 0x4b, 0x99, 0xa1, - 0xa6, 0x46, 0x77, 0x69, 0x8a, 0x58, 0x8f, 0xe0, 0x80, 0x86, 0x36, 0xd1, 0x61, 0xec, 0x93, 0x07, - 0x7c, 0x9b, 0x9e, 0xd6, 0x9f, 0xd9, 0x33, 0x2a, 0x3b, 0xf6, 0x49, 0xd2, 0xb0, 0x81, 0x4e, 0xa7, - 0x7f, 0x56, 0x84, 0x52, 0x9a, 0xe4, 0xf8, 0x68, 0xe3, 0x9b, 0xdd, 0x6d, 0x79, 0x0f, 0x91, 0xd1, - 0xc6, 0x3b, 0xdd, 0x6d, 0x5b, 0xc0, 0xd0, 0xf2, 0x26, 0xf0, 0x1e, 0x61, 0xab, 0x27, 0xc8, 0xf2, - 0x26, 0xf0, 0x1e, 0x19, 0x96, 0x37, 0x81, 0xf7, 0x08, 0xb5, 0x04, 0x6b, 0x35, 0x74, 0xd7, 0xc6, - 0x4b, 0x08, 0x69, 0x09, 0x9a, 0x61, 0x3a, 0x73, 0x90, 0x42, 0x13, 0x47, 0xe5, 0x12, 0x77, 0x03, - 0x8a, 0x8c, 0x4d, 0xdb, 0x19, 0x1e, 0x95, 0xdb, 0x08, 0x96, 0x89, 0xbe, 0x6d, 0x1d, 0x89, 0x35, - 0x81, 0x69, 0x3f, 0xd5, 0x02, 0x3e, 0xfe, 0xe2, 0xac, 0x4c, 0xc8, 0xe6, 0x74, 0xd6, 0x8e, 0xbe, - 0x9a, 0x33, 0xf8, 0x3e, 0x4d, 0x5d, 0xed, 0x26, 0x85, 0xfb, 0x43, 0xed, 0x50, 0xf1, 0x58, 0x66, - 0x2a, 0x9e, 0x01, 0xc8, 0x70, 0x80, 0xb1, 0x8e, 0x28, 0x61, 0xc2, 0xde, 0x87, 0x71, 0xdd, 0x09, - 0x5f, 0xba, 0x8a, 0xbf, 0x20, 0x23, 0xb8, 0xf5, 0xc9, 0x35, 0xa9, 0x13, 0xb0, 0x6d, 0x38, 0xb3, - 0xec, 0xb7, 0xc3, 0x6e, 0x4b, 0xc5, 0x8a, 0x4b, 0x22, 0xd4, 0x02, 0x0e, 0x05, 0x7a, 0xf4, 0xd6, - 0x09, 0x85, 0x7c, 0xbe, 0x95, 0x8d, 0xbf, 0x79, 0x01, 0xe9, 0xc7, 0x88, 0x6d, 0xc1, 0x38, 0xea, - 0x3b, 0xc9, 0x88, 0x70, 0xdc, 0xdc, 0x36, 0x92, 0x92, 0x15, 0xb1, 0x30, 0x64, 0xb0, 0x23, 0xb7, - 0xd5, 0x54, 0x26, 0xe6, 0xba, 0xde, 0x56, 0x43, 0x66, 0x5f, 0x85, 0x29, 0x79, 0xff, 0x7a, 0xc0, - 0xb7, 0xe5, 0xdc, 0x99, 0x30, 0xd4, 0x0c, 0x66, 0xa1, 0x7c, 0x7a, 0x27, 0x2d, 0xf3, 0x63, 0xbe, - 0x2d, 0xc7, 0xde, 0x70, 0xf0, 0x30, 0xf0, 0xd9, 0x3d, 0x98, 0xbd, 0xe5, 0x86, 0x12, 0xa8, 0x79, - 0x53, 0x4f, 0xa2, 0xfa, 0x15, 0x0d, 0x6f, 0xf7, 0xdc, 0x50, 0xa9, 0xad, 0x33, 0xbd, 0xa7, 0xb3, - 0xe8, 0xd9, 0x0f, 0xe5, 0x60, 0xde, 0xd0, 0x6a, 0x93, 0x99, 0x53, 0x8b, 0xb7, 0x23, 0xf4, 0xe4, - 0x98, 0x8a, 0x53, 0x8c, 0xf7, 0x43, 0x93, 0x43, 0x92, 0x52, 0x9c, 0x07, 0x49, 0xb9, 0x6e, 0xd1, - 0xda, 0x8f, 0x07, 0x2d, 0x54, 0x5c, 0xd3, 0xd3, 0xe6, 0x42, 0x4d, 0xad, 0x6b, 0x85, 0x66, 0x5d, - 0x4f, 0xf7, 0x37, 0x69, 0xb1, 0x72, 0xb1, 0x16, 0x6b, 0x0e, 0x86, 0xb1, 0x57, 0x55, 0xf0, 0x17, - 0xfc, 0x61, 0x7d, 0x5a, 0xdf, 0x87, 0x48, 0x2c, 0x3c, 0x72, 0x1f, 0xb2, 0xfe, 0xbb, 0x11, 0x98, - 0x4e, 0x4d, 0x0b, 0xba, 0xa7, 0xe6, 0x7a, 0xee, 0xa9, 0x35, 0x00, 0xa9, 0xc7, 0x1d, 0x50, 0xe1, - 0xaa, 0xbc, 0xc8, 0xc6, 0xc9, 0x29, 0x33, 0x5e, 0x53, 0x1a, 0x1b, 0xc1, 0x54, 0xae, 0xd8, 0x01, - 0x15, 0xe0, 0x31, 0x53, 0xb9, 0xe8, 0x35, 0xa6, 0x09, 0x1b, 0x56, 0x86, 0x61, 0x8c, 0xd8, 0xa8, - 0x3b, 0xf1, 0x79, 0x02, 0x60, 0x4b, 0x38, 0x7b, 0x19, 0x46, 0x84, 0x10, 0x55, 0x5d, 0xa1, 0x4d, - 0x10, 0xcf, 0x16, 0x21, 0x65, 0x09, 0x89, 0x85, 0x8a, 0xd8, 0x75, 0x98, 0x90, 0x7f, 0x51, 0xd0, - 0x8e, 0x11, 0xd3, 0xf6, 0xce, 0xf1, 0x1a, 0x2a, 0x6e, 0x87, 0x81, 0x27, 0x6e, 0x17, 0xb5, 0x2e, - 0xea, 0x6c, 0xaa, 0x2b, 0x14, 0xe2, 0x17, 0x6f, 0x17, 0xa1, 0x04, 0x62, 0x0a, 0xff, 0x18, 0x41, - 0xc8, 0x32, 0x64, 0x4a, 0x5f, 0xc4, 0x3b, 0x25, 0xca, 0x32, 0xd2, 0x84, 0xde, 0xa6, 0x12, 0x76, - 0x49, 0xbe, 0x9b, 0xa0, 0x58, 0x28, 0x33, 0xa5, 0xe1, 0xa3, 0x04, 0x2a, 0x26, 0x50, 0x36, 0x8c, - 0x8b, 0x45, 0xe5, 0xe2, 0xef, 0xd5, 0x96, 0xeb, 0x35, 0x69, 0x5b, 0xc1, 0xca, 0x11, 0x97, 0x0b, - 0xa8, 0x9d, 0x20, 0xb0, 0x77, 0x61, 0x4a, 0xfc, 0x58, 0xf6, 0x5b, 0x2d, 0xbf, 0x8d, 0xec, 0xc7, - 0x93, 0xf8, 0x4f, 0x48, 0x52, 0xc7, 0x22, 0x59, 0x4b, 0x0a, 0x57, 0x9c, 0x27, 0xf8, 0x26, 0xdb, - 0x95, 0x2f, 0x3a, 0x13, 0xc9, 0x79, 0x82, 0xa4, 0xa1, 0x84, 0xdb, 0x3a, 0x12, 0x7b, 0x1b, 0x26, - 0xc5, 0xcf, 0x9b, 0xde, 0x23, 0x2e, 0x2b, 0x9c, 0x4c, 0x8c, 0x11, 0x90, 0x6a, 0x57, 0x94, 0xc8, - 0xfa, 0x4c, 0x4c, 0xf6, 0x45, 0x38, 0x85, 0x9c, 0xea, 0x7e, 0x87, 0x37, 0x2a, 0x3b, 0x3b, 0x5e, - 0xd3, 0x93, 0xc6, 0x50, 0x32, 0x3c, 0x05, 0x2a, 0xd8, 0x65, 0xc5, 0x88, 0xe1, 0xb8, 0x09, 0x8a, - 0x9d, 0x4d, 0xc9, 0x1e, 0x40, 0x69, 0xb9, 0x1b, 0x46, 0x7e, 0xab, 0x12, 0x45, 0x81, 0xb7, 0xdd, - 0x8d, 0x78, 0x38, 0x3f, 0x6d, 0x04, 0x71, 0x10, 0x8b, 0x23, 0x2e, 0x94, 0xfa, 0xa0, 0x3a, 0x52, - 0x38, 0x6e, 0x4c, 0x62, 0xf7, 0x30, 0xb1, 0x7e, 0x2f, 0x07, 0x93, 0x06, 0x29, 0x7b, 0x0b, 0x26, - 0x6e, 0x04, 0x1e, 0x6f, 0x37, 0x9a, 0xfb, 0xda, 0x45, 0x15, 0x6f, 0x31, 0x3b, 0x04, 0x97, 0xad, - 0x36, 0xd0, 0x62, 0x3d, 0x4f, 0x3e, 0xd3, 0x52, 0xf1, 0x8a, 0xf4, 0x25, 0xa5, 0x09, 0x5a, 0x48, - 0xa2, 0xca, 0xe0, 0x04, 0xa5, 0xd9, 0xa9, 0xa1, 0xb0, 0xf7, 0x60, 0x44, 0xbe, 0xde, 0x92, 0xd9, - 0xdc, 0xd9, 0xac, 0x66, 0x4a, 0xbf, 0x65, 0x9c, 0x88, 0x68, 0xa2, 0x13, 0xda, 0x44, 0x64, 0xfd, - 0x64, 0x0e, 0x58, 0x2f, 0xea, 0x31, 0x7a, 0xaf, 0x63, 0x4d, 0x7f, 0xbe, 0x10, 0xaf, 0xc6, 0x82, - 0xa1, 0x10, 0x17, 0x35, 0xc9, 0x02, 0xd9, 0xf1, 0xb4, 0xea, 0x74, 0x45, 0x9c, 0x2c, 0xb6, 0xfe, - 0x7a, 0x1e, 0x20, 0xc1, 0x66, 0x9f, 0x93, 0x89, 0x71, 0xbe, 0xd8, 0x75, 0x9b, 0xde, 0x8e, 0x67, - 0x46, 0x8a, 0x44, 0x26, 0xdf, 0x50, 0x25, 0xb6, 0x89, 0xc8, 0x3e, 0x80, 0xe9, 0xda, 0xa6, 0x49, - 0xab, 0xd9, 0x51, 0x87, 0x1d, 0x27, 0x45, 0x9e, 0xc6, 0x46, 0xf3, 0x58, 0x7d, 0x34, 0xa4, 0x79, - 0xac, 0x1c, 0x08, 0x2a, 0x11, 0x1b, 0x4b, 0x6d, 0x93, 0x4c, 0xc5, 0x1b, 0xd5, 0x15, 0xda, 0xa5, - 0xf0, 0xeb, 0xc2, 0x8e, 0xd3, 0x21, 0x1b, 0x72, 0xb1, 0x4f, 0x18, 0x78, 0x49, 0x47, 0x0e, 0xf7, - 0xf1, 0x4d, 0xfe, 0x29, 0x54, 0xfb, 0xb5, 0xfc, 0x88, 0x93, 0xb6, 0xe3, 0x99, 0xbd, 0xf7, 0x24, - 0x4f, 0xff, 0xc3, 0x86, 0xcb, 0xa5, 0xd1, 0x3a, 0x32, 0x6f, 0xb9, 0x96, 0x5c, 0x52, 0xa4, 0x11, - 0x40, 0x86, 0x45, 0xcc, 0x3f, 0xc8, 0xc1, 0xa9, 0x4c, 0x5a, 0x76, 0x19, 0x20, 0xd1, 0x29, 0x51, - 0x2f, 0xe1, 0x8e, 0x99, 0xc4, 0x52, 0xb1, 0x35, 0x0c, 0xf6, 0x95, 0xb4, 0x36, 0xe8, 0xf8, 0x83, - 0x70, 0x41, 0xc5, 0xca, 0x32, 0xb5, 0x41, 0x19, 0x3a, 0x20, 0xeb, 0x1f, 0x15, 0x60, 0x46, 0x0b, - 0xd5, 0x22, 0xbf, 0xf5, 0x18, 0x73, 0xe5, 0x87, 0x30, 0x21, 0x5a, 0xe3, 0xd5, 0xc9, 0xef, 0x4b, - 0x9a, 0xa9, 0xbc, 0xde, 0xe3, 0x34, 0x47, 0xdc, 0x2e, 0xeb, 0xc8, 0x32, 0x82, 0x1d, 0x6e, 0x9d, - 0xf8, 0xda, 0x50, 0xef, 0xf5, 0xff, 0x32, 0x98, 0xb3, 0x10, 0x26, 0x57, 0xf6, 0xdb, 0x6e, 0x2b, - 0xae, 0x4d, 0x9a, 0xab, 0x7c, 0xaa, 0x6f, 0x6d, 0x06, 0xb6, 0xac, 0x2e, 0x71, 0x2f, 0x91, 0x65, - 0x19, 0x9e, 0xcd, 0x06, 0xd5, 0xc2, 0x07, 0x30, 0xd3, 0xf3, 0xd1, 0x27, 0x0a, 0xa6, 0xf7, 0x00, - 0x58, 0xef, 0x77, 0x64, 0x70, 0xf8, 0x94, 0x19, 0xaa, 0xf1, 0x54, 0xfc, 0x32, 0x8d, 0xa9, 0xc3, - 0xa5, 0xf1, 0xcb, 0xa2, 0x1e, 0x6a, 0xef, 0xa7, 0xf2, 0xba, 0xe3, 0xe2, 0xb3, 0xbe, 0xea, 0xbe, - 0x60, 0xdc, 0x86, 0x5f, 0xec, 0x37, 0xa6, 0x03, 0x69, 0x1d, 0xbe, 0x5d, 0x80, 0x33, 0x7d, 0x28, - 0xd9, 0x7e, 0x7a, 0x12, 0x49, 0x2d, 0xc4, 0xd5, 0xa3, 0x2b, 0x7c, 0x1a, 0x53, 0x89, 0x7d, 0x4e, - 0x86, 0x2e, 0xa8, 0x63, 0x7a, 0x6a, 0xba, 0x7f, 0xa3, 0x1a, 0xff, 0x61, 0x0c, 0x4d, 0xc7, 0x2c, - 0x90, 0x50, 0xf6, 0x01, 0x0c, 0xa3, 0xd7, 0x6a, 0x2a, 0x54, 0x9c, 0xc0, 0x40, 0xb8, 0x16, 0x57, - 0x4f, 0xfc, 0x34, 0xe2, 0xea, 0x09, 0x00, 0xfb, 0x2c, 0x14, 0x2a, 0x0f, 0x6a, 0x34, 0x2e, 0x53, - 0x3a, 0xf9, 0x83, 0x5a, 0x12, 0xce, 0xdf, 0x35, 0xe2, 0xee, 0x0b, 0x0a, 0x41, 0x78, 0x73, 0x79, - 0x93, 0x46, 0x45, 0x27, 0xbc, 0xb9, 0xbc, 0x99, 0x10, 0xee, 0xd6, 0x8d, 0xd0, 0x3b, 0x37, 0x97, - 0x37, 0xbf, 0x7b, 0xd3, 0xfe, 0xdf, 0xca, 0xcb, 0x78, 0x0b, 0xb2, 0x61, 0x1f, 0xc0, 0x84, 0x11, - 0x4a, 0x37, 0x97, 0xc8, 0x63, 0x71, 0xc4, 0xe2, 0x94, 0x7d, 0x8f, 0x41, 0xa0, 0x12, 0x63, 0x88, - 0xdf, 0x28, 0xf1, 0xea, 0x96, 0x34, 0x31, 0x07, 0x94, 0x89, 0xd3, 0x89, 0x31, 0x62, 0x12, 0x76, - 0x0d, 0x8a, 0x5b, 0xbc, 0xed, 0xb6, 0xa3, 0x58, 0x21, 0x8a, 0xa6, 0xc0, 0x11, 0xc2, 0x4c, 0xa9, - 0x21, 0x46, 0x44, 0xb3, 0xd5, 0xee, 0x76, 0x58, 0x0f, 0x3c, 0x8c, 0xcb, 0x12, 0x9f, 0xc5, 0xd2, - 0x6c, 0x55, 0x2b, 0x31, 0x19, 0xa4, 0x88, 0xac, 0x9f, 0xca, 0xc1, 0x28, 0x0d, 0xa4, 0x4c, 0x68, - 0xb4, 0x9b, 0x9c, 0x25, 0x94, 0xd0, 0x68, 0xd7, 0x4b, 0x27, 0x34, 0xda, 0x95, 0xc1, 0x4f, 0xc6, - 0xc8, 0x13, 0x2b, 0x7e, 0x1a, 0x94, 0x39, 0xf9, 0xc9, 0x67, 0xcd, 0xcc, 0x57, 0x13, 0xa3, 0x0e, - 0xea, 0x0f, 0x64, 0xfd, 0x7d, 0xfa, 0xb2, 0x9b, 0xcb, 0x9b, 0x6c, 0x11, 0x8a, 0x6b, 0xbe, 0x0c, - 0xac, 0xa3, 0x67, 0xa7, 0x6c, 0x12, 0x4c, 0xef, 0x20, 0x85, 0x27, 0xbe, 0x6f, 0x33, 0xf0, 0xe9, - 0x2e, 0xa3, 0x7d, 0x5f, 0x47, 0x02, 0x53, 0xdf, 0x17, 0xa3, 0x0e, 0xfc, 0x7d, 0x3c, 0x63, 0x93, - 0xb8, 0x7f, 0x0d, 0x33, 0x06, 0xdc, 0xd6, 0xfd, 0xac, 0xa8, 0x48, 0xed, 0x14, 0x0b, 0xfd, 0x76, - 0x8a, 0xfb, 0xd7, 0xec, 0x0c, 0x2a, 0x7c, 0x57, 0x4b, 0xc0, 0x35, 0x1e, 0x3c, 0x7a, 0x86, 0x77, - 0xe9, 0xec, 0x77, 0xb5, 0x74, 0xf3, 0x06, 0xda, 0xa4, 0x7f, 0x27, 0x0f, 0xa7, 0xb3, 0x09, 0xf5, - 0xb6, 0xe4, 0x8e, 0x68, 0xcb, 0x45, 0x28, 0xde, 0xf2, 0xc3, 0x48, 0x33, 0xe9, 0x43, 0xf5, 0xff, - 0x1e, 0xc1, 0xec, 0xb8, 0x54, 0xdc, 0xb9, 0xc5, 0xdf, 0xf1, 0xf2, 0x44, 0x7e, 0x18, 0x65, 0x40, - 0xdc, 0xb9, 0x65, 0x11, 0xbb, 0x09, 0x45, 0x9b, 0xfc, 0x7c, 0x52, 0x5d, 0xa3, 0xc0, 0xb1, 0x34, - 0xc5, 0x02, 0x82, 0x18, 0x11, 0x8d, 0x09, 0xc6, 0x2a, 0x30, 0x4a, 0xa3, 0x9f, 0x7a, 0x3a, 0xce, - 0x98, 0x32, 0x66, 0x90, 0x71, 0x45, 0x27, 0x76, 0x14, 0x7c, 0x04, 0xac, 0xae, 0x28, 0x97, 0x1d, - 0xdc, 0x51, 0xe4, 0x23, 0xa1, 0x69, 0x3d, 0x19, 0x23, 0x5a, 0x3f, 0x94, 0x07, 0x50, 0x5a, 0x9b, - 0x67, 0x76, 0x86, 0x7d, 0xd6, 0x98, 0x61, 0x9a, 0x31, 0xd1, 0xe0, 0x09, 0x38, 0x37, 0xd0, 0x56, - 0x67, 0xf0, 0xf4, 0x9b, 0x65, 0x18, 0xde, 0x4a, 0x14, 0x5a, 0xe4, 0x40, 0x82, 0xea, 0x68, 0x09, - 0xb7, 0xb6, 0x61, 0xee, 0x26, 0x8f, 0x12, 0xf5, 0x96, 0x7a, 0x7a, 0x3c, 0x9a, 0xed, 0x1b, 0x30, - 0x46, 0xf8, 0xf1, 0xfe, 0x25, 0x75, 0x31, 0x14, 0xb8, 0x03, 0x75, 0x31, 0x0a, 0x41, 0xec, 0x46, - 0x2b, 0xbc, 0xc9, 0x23, 0xfe, 0xdd, 0xad, 0xa6, 0x06, 0x4c, 0x36, 0x05, 0x5b, 0x36, 0x58, 0x0d, - 0xc7, 0xf6, 0xcf, 0x7d, 0x38, 0x15, 0x7f, 0xfb, 0xd3, 0xe4, 0x7b, 0x45, 0x5c, 0x29, 0x29, 0x3e, - 0x77, 0xc2, 0xf1, 0x08, 0xdb, 0x93, 0x27, 0xb0, 0xa0, 0x08, 0x1e, 0x78, 0xb1, 0x55, 0xe4, 0x40, - 0xb4, 0xec, 0x5d, 0x18, 0xd7, 0x68, 0x28, 0xbe, 0x34, 0xaa, 0xa9, 0x1f, 0x7b, 0xd1, 0x9e, 0x13, - 0x4a, 0xb8, 0xae, 0xa6, 0xd6, 0xd0, 0xad, 0x2f, 0xc3, 0xf3, 0xb1, 0x93, 0x4f, 0x46, 0xd5, 0x29, - 0xe6, 0xb9, 0x93, 0x31, 0x5f, 0x4f, 0x9a, 0x55, 0x6d, 0xc7, 0x8e, 0xb9, 0x8a, 0x37, 0xd3, 0x9b, - 0x45, 0x8d, 0x79, 0xa1, 0xc7, 0xd5, 0x57, 0xf3, 0xe8, 0xb5, 0xde, 0xd1, 0x3e, 0x36, 0x83, 0xa1, - 0x41, 0x9c, 0x4b, 0x13, 0xff, 0x50, 0x1e, 0xa6, 0x37, 0xaa, 0x2b, 0xcb, 0xb1, 0xf5, 0xd1, 0xf7, - 0x58, 0x7a, 0x50, 0xa3, 0x6d, 0xfd, 0xf7, 0x1b, 0xeb, 0x1e, 0xcc, 0xa6, 0xba, 0x01, 0x45, 0x87, - 0xf7, 0xa5, 0x7b, 0x48, 0x0c, 0x56, 0x62, 0xc3, 0xe9, 0x2c, 0xf6, 0xf7, 0xaf, 0xd9, 0x29, 0x6c, - 0xeb, 0x1f, 0x43, 0x8a, 0x2f, 0x6d, 0x61, 0x6f, 0xc0, 0x58, 0x35, 0x0c, 0xbb, 0x3c, 0xb8, 0x67, - 0xaf, 0xe9, 0xaa, 0x02, 0x0f, 0x81, 0x4e, 0x37, 0x68, 0xda, 0x09, 0x02, 0xbb, 0x04, 0x45, 0x0a, - 0xb9, 0xac, 0xf6, 0x04, 0xd4, 0xda, 0xc6, 0x11, 0x9b, 0xed, 0xb8, 0x98, 0xbd, 0x05, 0x13, 0xf2, - 0x6f, 0x39, 0xdb, 0xa8, 0xc3, 0x51, 0x39, 0x48, 0xe8, 0x72, 0x76, 0xda, 0x06, 0x1a, 0x7b, 0x1d, - 0x0a, 0x95, 0x65, 0x9b, 0xd4, 0x41, 0x24, 0x37, 0x62, 0xd2, 0xef, 0x2e, 0x37, 0x2f, 0x11, 0xcb, - 0xb6, 0x90, 0xfe, 0x54, 0x74, 0x02, 0xd2, 0x64, 0xcb, 0xdc, 0xe4, 0x04, 0x4b, 0x1d, 0x66, 0x08, - 0x63, 0x57, 0x60, 0x74, 0xc5, 0x0b, 0x3b, 0x4d, 0x77, 0x9f, 0xf4, 0xd8, 0x32, 0xf7, 0x95, 0x04, - 0x19, 0xbe, 0xfd, 0x12, 0xc4, 0x2e, 0xa9, 0x9c, 0x40, 0xc5, 0xc4, 0xcb, 0xa4, 0x4f, 0xe2, 0x9f, - 0x37, 0x60, 0x84, 0x02, 0x13, 0x8f, 0x69, 0x29, 0x07, 0xd2, 0x01, 0x89, 0x09, 0xa7, 0xd7, 0xdd, - 0x14, 0x9e, 0xa6, 0xbb, 0xe9, 0x36, 0x9c, 0xb9, 0x89, 0xda, 0x1b, 0x33, 0x9a, 0xcf, 0x3d, 0xbb, - 0x4a, 0xfa, 0x70, 0x7c, 0x06, 0x92, 0x0a, 0x9e, 0x74, 0x40, 0x20, 0xa7, 0x1b, 0xe8, 0xa9, 0x1c, - 0xfb, 0x31, 0x62, 0x5f, 0x82, 0xb9, 0xac, 0x22, 0xd2, 0x9a, 0x63, 0xdc, 0x9a, 0xec, 0x0a, 0xf4, - 0xb8, 0x35, 0x59, 0x1c, 0xd8, 0x1a, 0x94, 0x24, 0xbc, 0xd2, 0x68, 0x79, 0x6d, 0xa9, 0xf9, 0x97, - 0x5a, 0x75, 0x74, 0xfb, 0x20, 0xae, 0xae, 0x28, 0x94, 0x2f, 0x00, 0x86, 0xa3, 0x50, 0x8a, 0x92, - 0xfd, 0xed, 0x9c, 0xb8, 0xcd, 0xc9, 0x30, 0xbe, 0xf7, 0xec, 0xb5, 0x90, 0x62, 0x9e, 0x9d, 0x4e, - 0x7c, 0x80, 0x6a, 0x51, 0xe0, 0xb5, 0x77, 0xc9, 0x09, 0x68, 0x8b, 0x9c, 0x80, 0xde, 0xfd, 0x58, - 0x4e, 0x40, 0x92, 0x55, 0x78, 0x78, 0x50, 0x9e, 0x08, 0xa8, 0x4e, 0x5c, 0x45, 0xc6, 0x17, 0x88, - 0xae, 0x43, 0x4f, 0xd8, 0x7b, 0x6d, 0x19, 0x44, 0x94, 0x37, 0x64, 0x23, 0xa7, 0x71, 0x07, 0xc7, - 0xae, 0xc3, 0x50, 0xf6, 0x4e, 0x37, 0x46, 0xe8, 0x69, 0x68, 0x26, 0x07, 0x71, 0xf1, 0x54, 0x8e, - 0x26, 0xd2, 0x77, 0xb6, 0x94, 0x5c, 0x3c, 0x95, 0x57, 0x8a, 0x83, 0xd3, 0x48, 0x9f, 0x3c, 0x06, - 0x09, 0xbb, 0x02, 0x23, 0x77, 0xdd, 0x27, 0x95, 0x5d, 0x4e, 0xb9, 0xde, 0x26, 0xd5, 0xf6, 0x87, - 0xc0, 0xa5, 0xe2, 0xef, 0x4a, 0x47, 0x86, 0xe7, 0x6c, 0x42, 0x63, 0x3f, 0x90, 0x83, 0xd3, 0x72, - 0x19, 0xab, 0x56, 0xd6, 0x78, 0x14, 0x89, 0x7e, 0xa0, 0xe0, 0x67, 0xe7, 0x13, 0x6b, 0xec, 0x6c, - 0x3c, 0x99, 0x34, 0x9f, 0x76, 0x86, 0xb8, 0xe3, 0x42, 0x2a, 0x35, 0xc2, 0xba, 0x66, 0xd2, 0xb3, - 0x2d, 0x18, 0xbf, 0x7b, 0xa3, 0x12, 0x57, 0x2b, 0x63, 0x3d, 0x97, 0xb3, 0x76, 0x47, 0x0d, 0x2d, - 0xcb, 0x8d, 0x40, 0x67, 0x43, 0xa6, 0xff, 0x9f, 0x55, 0xfd, 0xc1, 0xde, 0xd4, 0x1d, 0x47, 0x0b, - 0x28, 0x3d, 0x8f, 0xb6, 0xdc, 0x27, 0x8e, 0xbb, 0xcb, 0x8d, 0x57, 0x72, 0xd2, 0x5e, 0xff, 0x44, - 0x0e, 0xce, 0xf6, 0x6d, 0x32, 0xbb, 0x0e, 0x67, 0x5c, 0xe9, 0x0e, 0xed, 0xec, 0x45, 0x51, 0x27, - 0x74, 0xd4, 0x15, 0x83, 0x5c, 0x4d, 0xed, 0x53, 0x54, 0x7c, 0x4b, 0x94, 0xaa, 0x5b, 0x47, 0xc8, - 0x3e, 0x80, 0x17, 0xbc, 0x76, 0xc8, 0xeb, 0xdd, 0x80, 0x3b, 0x8a, 0x41, 0xdd, 0x6b, 0x04, 0x4e, - 0xe0, 0xb6, 0x77, 0x95, 0xdf, 0xac, 0x7d, 0x56, 0xe1, 0x90, 0xcb, 0xf5, 0xb2, 0xd7, 0x08, 0x6c, - 0x44, 0xb0, 0x7e, 0x2f, 0x07, 0xf3, 0xfd, 0xba, 0x84, 0xcd, 0xc3, 0x28, 0x6f, 0xbb, 0xdb, 0x4d, - 0xe5, 0x2d, 0x64, 0xab, 0x9f, 0xec, 0x79, 0x48, 0x76, 0x7a, 0x3a, 0xfd, 0x8b, 0x75, 0x8a, 0xc0, - 0x8f, 0x76, 0xeb, 0xfa, 0xbe, 0x4e, 0x76, 0xe6, 0x13, 0x75, 0x7d, 0x77, 0x3f, 0x07, 0x90, 0x6c, - 0xe7, 0x52, 0x31, 0x61, 0x8f, 0xb9, 0xf5, 0x40, 0xae, 0x3c, 0x76, 0x1a, 0x46, 0xe4, 0x76, 0x49, - 0xce, 0x0d, 0xf4, 0x4b, 0x9c, 0xdb, 0xd4, 0xc9, 0xb8, 0xcf, 0x17, 0x96, 0x26, 0x8c, 0xce, 0x1e, - 0x69, 0xe1, 0xe0, 0x58, 0x3f, 0x3e, 0x29, 0x45, 0x88, 0x4a, 0x37, 0xda, 0x53, 0x42, 0xc7, 0x62, - 0x96, 0x77, 0x97, 0xb4, 0xa5, 0xd4, 0x8c, 0xae, 0x4d, 0x9f, 0x2e, 0xf5, 0xf6, 0x93, 0xcf, 0x7c, - 0xfb, 0x79, 0x03, 0xc6, 0x96, 0xf7, 0x78, 0xfd, 0x61, 0xec, 0x61, 0x53, 0x24, 0xe5, 0xba, 0x00, - 0xca, 0x00, 0xcb, 0x09, 0x02, 0xbb, 0x02, 0x80, 0x4e, 0xa5, 0x52, 0x22, 0xd5, 0x92, 0x24, 0xa0, - 0x0f, 0x2a, 0x99, 0xa7, 0x68, 0x28, 0xc8, 0xbe, 0x66, 0xdf, 0xd0, 0xed, 0x59, 0x24, 0xfb, 0x30, - 0xd8, 0x21, 0xf4, 0x04, 0x41, 0x34, 0x4f, 0xdb, 0x57, 0xe8, 0x14, 0x2c, 0xf5, 0x6c, 0x3e, 0x3a, - 0x12, 0xbb, 0x0c, 0x63, 0x9b, 0xca, 0x4b, 0x00, 0x0f, 0xc1, 0x09, 0xa4, 0x80, 0xc4, 0xa3, 0x60, - 0x3e, 0x67, 0x27, 0x28, 0xec, 0xb3, 0x30, 0xba, 0xcc, 0x83, 0x68, 0x6b, 0x6b, 0x0d, 0x8d, 0x4e, - 0x64, 0x2e, 0x81, 0x22, 0xc6, 0x7d, 0x8f, 0xa2, 0xe6, 0x77, 0x0e, 0xca, 0x93, 0x91, 0xd7, 0xe2, - 0x71, 0x8c, 0x64, 0x5b, 0x61, 0xb3, 0x25, 0x28, 0xc9, 0x67, 0xf1, 0xe4, 0xee, 0x81, 0x27, 0x63, - 0x51, 0x9e, 0xd3, 0xf4, 0x86, 0xfe, 0x98, 0x6f, 0xc7, 0x51, 0xef, 0x7b, 0xf0, 0xd9, 0xaa, 0x4a, - 0x16, 0xa1, 0x37, 0x13, 0x12, 0x65, 0x58, 0x7a, 0xc7, 0x10, 0xad, 0xed, 0xa5, 0x60, 0x15, 0x98, - 0x5c, 0xf6, 0x5b, 0x1d, 0x37, 0xf2, 0x30, 0xf3, 0xda, 0x3e, 0x1d, 0x82, 0xa8, 0xd0, 0xab, 0xeb, - 0x05, 0xc6, 0x89, 0xaa, 0x17, 0xb0, 0x1b, 0x30, 0x65, 0xfb, 0x5d, 0x31, 0x4c, 0xea, 0x16, 0x2e, - 0xcf, 0x39, 0x34, 0x0d, 0x09, 0x44, 0x89, 0x38, 0x96, 0xe9, 0xca, 0x6d, 0x84, 0xaf, 0x34, 0xa8, - 0xd8, 0x7a, 0xc6, 0x73, 0x88, 0x7e, 0xb8, 0xe9, 0xb1, 0xef, 0x7b, 0x98, 0x65, 0xbc, 0xa4, 0x5c, - 0x83, 0xf1, 0x5a, 0x6d, 0x63, 0x8b, 0x87, 0xd1, 0x8d, 0xa6, 0xff, 0x18, 0xcf, 0xb6, 0x22, 0xe5, - 0x04, 0x0a, 0x7d, 0x27, 0xe2, 0x61, 0xe4, 0xec, 0x34, 0xfd, 0xc7, 0xb6, 0x8e, 0xc5, 0xbe, 0x26, - 0xfa, 0x43, 0x93, 0x04, 0x29, 0x50, 0xe7, 0x51, 0xc2, 0x2a, 0x9e, 0x20, 0xc9, 0xa2, 0x11, 0x22, - 0xab, 0xd9, 0x59, 0x1a, 0x3a, 0x3a, 0x8c, 0x05, 0xfe, 0x93, 0xfd, 0x4a, 0xa3, 0x11, 0xf0, 0x30, - 0xa4, 0x43, 0x48, 0x3a, 0x8c, 0xa1, 0xb2, 0xc1, 0x95, 0x05, 0x86, 0xc3, 0x98, 0x46, 0xc0, 0x7e, - 0x24, 0x07, 0xa7, 0x74, 0x57, 0x12, 0x5c, 0x2e, 0x68, 0xe6, 0x22, 0x8f, 0xa4, 0x37, 0x2f, 0xab, - 0x43, 0xf8, 0xb2, 0x86, 0x76, 0xf9, 0xd1, 0xd5, 0xcb, 0x95, 0xe4, 0x67, 0x4d, 0x11, 0x61, 0xd0, - 0xb1, 0x72, 0x26, 0xbf, 0xe4, 0x0b, 0xe6, 0x73, 0xf6, 0x9c, 0x9b, 0x41, 0xcc, 0x96, 0x85, 0xa4, - 0x26, 0x66, 0x14, 0x1a, 0x4e, 0x55, 0x37, 0xf1, 0x4c, 0x23, 0x8d, 0x2a, 0xcd, 0x3f, 0x69, 0x62, - 0xe5, 0x75, 0x4c, 0x81, 0x4c, 0xa3, 0x61, 0x55, 0x98, 0x96, 0x00, 0xb1, 0x2d, 0xc8, 0x94, 0x31, - 0xb3, 0x49, 0xd8, 0x7a, 0x62, 0x83, 0x6f, 0xfd, 0x98, 0x36, 0x46, 0x8f, 0x2c, 0x99, 0xa2, 0x63, - 0x1f, 0xc0, 0x54, 0x18, 0xee, 0x39, 0xda, 0x7a, 0x9d, 0xc3, 0x55, 0x8c, 0x01, 0x32, 0xa9, 0x24, - 0xe5, 0x56, 0x37, 0x11, 0x86, 0x7b, 0xc9, 0x8a, 0xfe, 0x00, 0xa6, 0xd0, 0x56, 0x27, 0x61, 0x70, - 0x2a, 0x61, 0x40, 0x25, 0x69, 0x06, 0x51, 0x33, 0x4c, 0x18, 0xfc, 0x9d, 0x1c, 0x9c, 0x15, 0x15, - 0x65, 0x8f, 0xd0, 0xe9, 0x8f, 0x33, 0x42, 0x18, 0x32, 0xb0, 0x2f, 0x4f, 0x5d, 0x1c, 0x0d, 0xc3, - 0xbd, 0x2c, 0x0e, 0xf8, 0x51, 0xe2, 0xe3, 0xb3, 0x3f, 0xea, 0xcc, 0xc7, 0xfe, 0xa8, 0xbe, 0x3c, - 0xf5, 0x8f, 0x8a, 0x9a, 0x61, 0x16, 0x07, 0xbc, 0xd6, 0xd6, 0x2a, 0x77, 0xd7, 0x92, 0xbb, 0xd9, - 0xf7, 0x96, 0xdb, 0x8a, 0xd1, 0xb6, 0x23, 0xdc, 0x56, 0xee, 0x49, 0x9f, 0x67, 0xad, 0x1b, 0xd4, - 0xb5, 0xd6, 0x00, 0xa7, 0xaf, 0xb5, 0x29, 0x1a, 0x3b, 0x85, 0x6d, 0xfd, 0x1c, 0xa4, 0xf8, 0x92, - 0xa9, 0xaa, 0x05, 0x23, 0xf2, 0xd6, 0x4a, 0x9d, 0x8c, 0x36, 0x0b, 0xf2, 0x4e, 0x6b, 0x53, 0x09, - 0x3b, 0x0b, 0x85, 0x5a, 0x6d, 0x83, 0x3a, 0x19, 0x0d, 0x56, 0xc3, 0xd0, 0xb7, 0x05, 0x4c, 0x8c, - 0x10, 0x5a, 0xa1, 0x6a, 0x01, 0xd5, 0xc5, 0x79, 0x67, 0x23, 0x54, 0xf4, 0xb7, 0xba, 0x43, 0x0e, - 0x25, 0xfd, 0x4d, 0x77, 0xc8, 0xe4, 0xe6, 0xb8, 0x0c, 0xf3, 0x95, 0x30, 0xe4, 0x81, 0x98, 0x10, - 0x64, 0xdc, 0x18, 0xd0, 0x3d, 0x87, 0x0e, 0x76, 0xac, 0xd4, 0xad, 0x87, 0x76, 0x5f, 0x44, 0x76, - 0x11, 0x8a, 0x95, 0x6e, 0xc3, 0xe3, 0xed, 0xba, 0x11, 0x15, 0xcc, 0x25, 0x98, 0x1d, 0x97, 0xb2, - 0x2f, 0xc2, 0xa9, 0x54, 0xc8, 0x3e, 0xea, 0x81, 0xd1, 0x64, 0xef, 0x55, 0xf7, 0xb0, 0xc4, 0x20, - 0x43, 0x76, 0x49, 0x36, 0x25, 0xab, 0x40, 0x69, 0x15, 0xdd, 0xb4, 0x56, 0xb8, 0x7c, 0x1b, 0xf2, - 0x03, 0xe9, 0x7c, 0x27, 0x6f, 0xcd, 0xd2, 0x85, 0xcb, 0x69, 0xc4, 0x85, 0x76, 0x0f, 0x3a, 0xbb, - 0x03, 0xb3, 0x69, 0x98, 0x38, 0xc1, 0xe5, 0x05, 0x19, 0xf7, 0x9b, 0x1e, 0x2e, 0x78, 0x86, 0x67, - 0x51, 0xb1, 0x6d, 0x98, 0x49, 0x0c, 0x92, 0xcc, 0x6b, 0xb3, 0xb2, 0x73, 0x8e, 0xcb, 0xd5, 0xd5, - 0xf9, 0x79, 0x9a, 0x8c, 0xb3, 0x89, 0x71, 0x53, 0x7c, 0x7d, 0xb6, 0x7b, 0xd9, 0xb1, 0x06, 0x4c, - 0xd5, 0xbc, 0xdd, 0xb6, 0xd7, 0xde, 0xbd, 0xc3, 0xf7, 0x37, 0x5d, 0x2f, 0x20, 0x8b, 0x53, 0x65, - 0x4f, 0x5e, 0x09, 0xf7, 0x5b, 0x2d, 0x1e, 0x05, 0xb8, 0x11, 0x8a, 0x72, 0x74, 0x30, 0x17, 0xd7, - 0xa1, 0x85, 0x50, 0xd2, 0xa1, 0x4f, 0x66, 0xc7, 0xf5, 0x0c, 0x21, 0xc0, 0xe4, 0x69, 0xa8, 0x2e, - 0x26, 0x06, 0x54, 0x5d, 0x34, 0x61, 0x66, 0xb5, 0x5d, 0x0f, 0xf6, 0xf1, 0x89, 0x4e, 0x7d, 0xdc, - 0xe4, 0x31, 0x1f, 0xf7, 0x0a, 0x7d, 0xdc, 0x0b, 0xae, 0x9a, 0x61, 0x59, 0x9f, 0xd7, 0xcb, 0x98, - 0xd5, 0x60, 0x06, 0x2f, 0x0e, 0xd5, 0x95, 0xcd, 0x6a, 0xdb, 0x8b, 0x3c, 0x37, 0xe2, 0x0d, 0x12, - 0x2e, 0x5e, 0x25, 0x9e, 0xe7, 0xe4, 0x15, 0xd5, 0x6b, 0x74, 0x1c, 0x4f, 0xa1, 0xe8, 0x4c, 0x7b, - 0xe8, 0x8f, 0xba, 0x27, 0x4e, 0xff, 0x19, 0xdd, 0x13, 0xab, 0x30, 0x9d, 0x0e, 0xbc, 0x50, 0x4a, - 0xce, 0xe1, 0x10, 0x8b, 0xc4, 0x71, 0xee, 0x77, 0x51, 0x98, 0x34, 0x72, 0xfe, 0x99, 0x74, 0xe9, - 0x2b, 0xe7, 0x8c, 0x71, 0xe5, 0x34, 0x76, 0xa5, 0x13, 0x5c, 0x39, 0xd9, 0x26, 0xc0, 0x0d, 0x3f, - 0xa8, 0xf3, 0x0a, 0x3a, 0x3f, 0x33, 0x23, 0x7b, 0x8e, 0x60, 0x9a, 0x14, 0xca, 0xf5, 0xb3, 0x23, - 0x7e, 0x3b, 0x69, 0x1f, 0x76, 0x8d, 0x87, 0xf5, 0x37, 0xf3, 0x30, 0xdf, 0xef, 0x73, 0x8e, 0xb8, - 0xee, 0x7d, 0x0a, 0x7a, 0x57, 0x38, 0x5d, 0xfb, 0x4a, 0x3c, 0xbd, 0xce, 0x17, 0x21, 0x7b, 0x21, - 0xd3, 0x35, 0x70, 0x36, 0x4d, 0x70, 0x2f, 0x68, 0xb2, 0xeb, 0x30, 0xae, 0x7d, 0x3c, 0xee, 0xa5, - 0xfd, 0x9a, 0x6a, 0xc3, 0x4e, 0xfc, 0xb7, 0xb8, 0x26, 0xca, 0x7d, 0x4b, 0x5d, 0x13, 0xe5, 0x2f, - 0x56, 0x92, 0xfe, 0xdf, 0x23, 0xd2, 0x0a, 0x20, 0x0c, 0x7d, 0xc6, 0x00, 0xf7, 0x6d, 0xb9, 0x05, - 0xda, 0xf8, 0xb7, 0xf5, 0xcb, 0x13, 0xf2, 0x44, 0xd6, 0x6f, 0x89, 0xfd, 0xec, 0x83, 0x53, 0xb7, - 0xc7, 0xfc, 0x49, 0x6e, 0x8f, 0x85, 0xe3, 0x6f, 0x8f, 0x43, 0xc7, 0xdd, 0x1e, 0x53, 0xd7, 0xbb, - 0xe1, 0x13, 0x5f, 0xef, 0x46, 0x4e, 0x74, 0xbd, 0x1b, 0x3d, 0xd1, 0xf5, 0xce, 0xb8, 0xa9, 0x16, - 0x8f, 0xbb, 0xa9, 0xfe, 0xc5, 0x65, 0xf0, 0x59, 0xbd, 0x0c, 0x66, 0x89, 0x78, 0x27, 0xba, 0x0c, - 0xfe, 0x70, 0xdf, 0xbb, 0x5c, 0xe9, 0xe3, 0x08, 0xe5, 0x2f, 0x0f, 0x70, 0x97, 0x1b, 0xf4, 0x26, - 0x37, 0xf3, 0x74, 0x6e, 0x72, 0xec, 0xa9, 0xdd, 0xe4, 0x66, 0x3f, 0xe9, 0x4d, 0x6e, 0xee, 0x69, - 0xde, 0xe4, 0x4e, 0xfd, 0x79, 0xbc, 0xc9, 0x9d, 0xfe, 0xd7, 0x73, 0x93, 0xfb, 0x4b, 0x50, 0x4a, - 0x0b, 0x97, 0xc7, 0x07, 0xdd, 0x7d, 0x6a, 0x01, 0x22, 0x85, 0xe8, 0x9b, 0x16, 0xee, 0xd8, 0x15, - 0x80, 0xcd, 0xc0, 0x7b, 0xe4, 0x46, 0xfc, 0x8e, 0xb2, 0x7e, 0xa3, 0x80, 0xd1, 0x12, 0x2a, 0x46, - 0xde, 0xd6, 0x50, 0xe2, 0x7b, 0x4d, 0x3e, 0xeb, 0x5e, 0x63, 0xfd, 0x48, 0x1e, 0x66, 0x64, 0x94, - 0xb5, 0x67, 0xff, 0x11, 0xf6, 0x7d, 0xe3, 0xb6, 0xaa, 0x6c, 0xad, 0x53, 0xad, 0x3b, 0xe2, 0x19, - 0xf6, 0xab, 0x70, 0xaa, 0xa7, 0x2b, 0xf0, 0xc6, 0xba, 0xa2, 0xe2, 0xdb, 0xf5, 0xdc, 0x59, 0xe7, - 0xb3, 0x2b, 0xb9, 0x7f, 0xcd, 0xee, 0xa1, 0xb0, 0xfe, 0x64, 0xa8, 0x87, 0x3f, 0x3d, 0xc8, 0xea, - 0x4f, 0xac, 0xb9, 0x93, 0x3d, 0xb1, 0xe6, 0x07, 0x7b, 0x62, 0x4d, 0x09, 0x15, 0x85, 0x41, 0x84, - 0x8a, 0x2f, 0xc2, 0xe4, 0x16, 0x77, 0x5b, 0xe1, 0x96, 0x4f, 0xd9, 0x72, 0xa4, 0xaf, 0x85, 0x0a, - 0x5f, 0x27, 0xca, 0xd4, 0x85, 0x2b, 0xb6, 0x19, 0x8d, 0x04, 0x81, 0x38, 0x06, 0x65, 0xfa, 0x1c, - 0xdb, 0xe4, 0xa0, 0xdf, 0xa2, 0x87, 0x8f, 0xb8, 0x45, 0xd7, 0x60, 0x82, 0xe8, 0x92, 0x48, 0xc3, - 0xc9, 0x75, 0x4f, 0x14, 0x21, 0x5c, 0xd5, 0x1e, 0x27, 0x71, 0x8e, 0x6b, 0x97, 0x37, 0x3d, 0x83, - 0x89, 0xe8, 0x82, 0xd5, 0x76, 0xa3, 0xe3, 0x7b, 0x6d, 0xec, 0x82, 0xd1, 0xa4, 0x0b, 0x38, 0x81, - 0x65, 0x17, 0x68, 0x48, 0xec, 0x5d, 0x98, 0xaa, 0x6c, 0x56, 0x75, 0xb2, 0x62, 0xf2, 0xca, 0xeb, - 0x76, 0x3c, 0xc7, 0x20, 0x4d, 0xe1, 0x1e, 0x75, 0xf3, 0x19, 0xfb, 0xb3, 0xb9, 0xf9, 0x58, 0xff, - 0x62, 0x42, 0x2d, 0xef, 0xef, 0xee, 0x03, 0x89, 0xf9, 0xe4, 0x51, 0x38, 0xe1, 0x93, 0xc7, 0xd0, - 0x71, 0x82, 0xa4, 0x21, 0xdf, 0x0e, 0x9f, 0x48, 0xbe, 0x1d, 0xf9, 0xc4, 0xcf, 0x17, 0xa3, 0x27, - 0x94, 0x58, 0x53, 0x6b, 0xad, 0x38, 0xc8, 0x5a, 0xcb, 0x94, 0x72, 0xc7, 0x3e, 0xb9, 0x94, 0x0b, - 0x27, 0x96, 0x72, 0x6b, 0x89, 0xef, 0xf2, 0xf8, 0xb1, 0x2e, 0x21, 0xe7, 0x48, 0x2b, 0x30, 0x93, - 0x1d, 0x62, 0x2f, 0xf6, 0x62, 0xfe, 0x9e, 0x12, 0x9d, 0xbf, 0x9e, 0x2d, 0x3a, 0x1f, 0x7d, 0xde, - 0x9c, 0x48, 0x78, 0xfe, 0x91, 0xa7, 0x2b, 0x3c, 0x3f, 0xdd, 0x87, 0x90, 0xbf, 0x10, 0x9f, 0xff, - 0x42, 0x7c, 0x1e, 0x50, 0x7c, 0x0e, 0x70, 0x79, 0x3d, 0x70, 0x83, 0x36, 0xaa, 0x9d, 0xae, 0xc0, - 0xa8, 0x8a, 0x31, 0x9a, 0x4b, 0x34, 0xca, 0xbd, 0xc1, 0x45, 0x15, 0x16, 0x5b, 0x84, 0xa2, 0x22, - 0xd6, 0xd3, 0xb2, 0x3c, 0x26, 0x98, 0x11, 0xbe, 0x91, 0x60, 0xd6, 0x7f, 0x30, 0xa4, 0xb6, 0x70, - 0x31, 0x67, 0x36, 0xdd, 0xc0, 0x6d, 0x61, 0xbe, 0xaf, 0x78, 0x85, 0x69, 0xc2, 0x7b, 0x6a, 0x51, - 0xa6, 0x4c, 0xfb, 0x4d, 0x92, 0x8f, 0x15, 0xf5, 0x35, 0x49, 0xa9, 0x5a, 0x18, 0x20, 0xa5, 0xea, - 0xdb, 0x46, 0x3e, 0xd2, 0xa1, 0x24, 0x01, 0x9e, 0xd8, 0xd6, 0x8e, 0xce, 0x44, 0x7a, 0x5d, 0x4f, - 0x1c, 0x3a, 0x9c, 0x44, 0xf5, 0x42, 0xca, 0x23, 0x52, 0x86, 0xc6, 0xb7, 0x91, 0x91, 0x93, 0xc4, - 0x53, 0x1e, 0xfd, 0xd7, 0x1a, 0x4f, 0x79, 0x15, 0x80, 0x8e, 0xda, 0xc4, 0x3c, 0xe1, 0x55, 0x5c, - 0xfd, 0x64, 0xa6, 0x1c, 0x45, 0xcd, 0x3e, 0x19, 0x24, 0x34, 0x42, 0xeb, 0xb7, 0x19, 0xcc, 0xd4, - 0x6a, 0x1b, 0x2b, 0x9e, 0xbb, 0xdb, 0xf6, 0xc3, 0xc8, 0xab, 0x57, 0xdb, 0x3b, 0xbe, 0x10, 0xc5, - 0xe3, 0xe3, 0x40, 0x0b, 0x9c, 0x9b, 0x1c, 0x05, 0x71, 0xb1, 0xb8, 0xea, 0xad, 0x06, 0x81, 0xd2, - 0x8f, 0xca, 0xab, 0x1e, 0x17, 0x00, 0x5b, 0xc2, 0x85, 0xb4, 0x5b, 0xeb, 0x62, 0x64, 0x0b, 0xb2, - 0x19, 0x41, 0x69, 0x37, 0x94, 0x20, 0x5b, 0x95, 0x31, 0xde, 0x3b, 0x61, 0xe9, 0xf6, 0x73, 0xc6, - 0x88, 0xca, 0x9c, 0x14, 0xcb, 0xc3, 0x8e, 0x84, 0x11, 0xdc, 0x36, 0x3b, 0x08, 0xd7, 0x2d, 0xe2, - 0x7a, 0xd6, 0xc0, 0x3e, 0x9c, 0x32, 0x7c, 0x9e, 0x07, 0x7d, 0x4c, 0x79, 0x9d, 0xa4, 0x6b, 0x0b, - 0x43, 0x6c, 0x64, 0xbc, 0xa8, 0xe8, 0x09, 0xbc, 0x32, 0x6b, 0x10, 0xe7, 0xd9, 0xb9, 0xcc, 0x92, - 0x78, 0x75, 0x8f, 0x1b, 0x91, 0xb1, 0xb5, 0x4d, 0x43, 0xa6, 0x2a, 0xeb, 0x57, 0xb5, 0x93, 0xb1, - 0x15, 0x1c, 0x5d, 0x13, 0xfb, 0x95, 0x1c, 0x9c, 0x31, 0x30, 0xe2, 0xed, 0x2a, 0x8c, 0xc3, 0x81, - 0x64, 0xce, 0xeb, 0x8f, 0x9e, 0xce, 0xbc, 0x7e, 0xd9, 0x6c, 0x4b, 0xb2, 0xa1, 0xea, 0x6d, 0xe8, - 0xf7, 0x85, 0xec, 0x11, 0xcc, 0x60, 0x91, 0x7a, 0xd8, 0x11, 0x73, 0x96, 0xde, 0x83, 0xe6, 0x92, - 0xcf, 0x96, 0x7e, 0xfc, 0x98, 0x6e, 0x7a, 0xf1, 0xdb, 0x07, 0xe5, 0x49, 0x03, 0x5d, 0xc5, 0x9a, - 0x76, 0x92, 0xd7, 0x21, 0xaf, 0xbd, 0xe3, 0xeb, 0x82, 0x52, 0x4f, 0x15, 0xec, 0x9f, 0xe4, 0xe4, - 0x73, 0x82, 0x6c, 0xc6, 0x8d, 0xc0, 0x6f, 0xc5, 0xe5, 0xca, 0xb4, 0xb2, 0x4f, 0xb7, 0x35, 0x9f, - 0x4e, 0xb7, 0xbd, 0x8a, 0x9f, 0x2c, 0xf7, 0x04, 0x67, 0x27, 0xf0, 0x5b, 0xc9, 0xe7, 0xeb, 0x1d, - 0xd7, 0xf7, 0x23, 0xd9, 0x0f, 0xe6, 0xe0, 0xac, 0xa1, 0xd5, 0xd4, 0x13, 0x7f, 0x50, 0xb4, 0x84, - 0xd9, 0x38, 0x8e, 0x4a, 0x52, 0xb4, 0x74, 0x99, 0xe6, 0xff, 0x05, 0xfc, 0x02, 0x2d, 0x26, 0xa7, - 0x40, 0x72, 0x5a, 0x12, 0x4b, 0xfb, 0x84, 0xfe, 0xb5, 0x30, 0x0f, 0x66, 0xd0, 0xca, 0xc6, 0x30, - 0x01, 0x9e, 0xeb, 0x6f, 0x02, 0x1c, 0xa7, 0x05, 0xc5, 0x70, 0xff, 0xfd, 0xed, 0x80, 0x7b, 0xb9, - 0xb2, 0xbf, 0x0c, 0x67, 0x7b, 0x80, 0xf1, 0x6a, 0x3b, 0xd5, 0x77, 0xb5, 0x7d, 0xea, 0xf0, 0xa0, - 0xfc, 0x5a, 0x56, 0x6d, 0x59, 0x2b, 0xad, 0x7f, 0x0d, 0xcc, 0x05, 0x48, 0x0a, 0x49, 0xfc, 0xc8, - 0x9e, 0xa0, 0x9f, 0xa2, 0xf9, 0xa1, 0xe1, 0x8b, 0xbd, 0x5c, 0xfb, 0x06, 0xfd, 0xc8, 0x4b, 0x90, - 0x18, 0x87, 0x09, 0x2d, 0xd5, 0xc1, 0x3e, 0x19, 0x7b, 0xf4, 0xa9, 0xe4, 0xdb, 0x07, 0x65, 0x03, - 0x5b, 0x5c, 0x88, 0xf4, 0x1c, 0x0a, 0x86, 0xb4, 0xa7, 0x23, 0xb2, 0x5f, 0xca, 0xc1, 0x9c, 0x00, - 0x24, 0x93, 0x8a, 0x1a, 0x35, 0x7f, 0xd4, 0xac, 0xdf, 0x7b, 0x3a, 0xb3, 0xfe, 0x25, 0xfc, 0x46, - 0x7d, 0xd6, 0xf7, 0x74, 0x49, 0xe6, 0xc7, 0xe1, 0x6c, 0x37, 0x0c, 0xba, 0x8c, 0xd9, 0x7e, 0x76, - 0x80, 0xd9, 0x2e, 0x07, 0xe0, 0xf8, 0xd9, 0xde, 0xb7, 0x16, 0xb6, 0x05, 0x13, 0x74, 0x17, 0x92, - 0x1d, 0xf6, 0xa2, 0x11, 0xa3, 0x59, 0x2f, 0x92, 0x17, 0x54, 0xca, 0x04, 0xd1, 0xd3, 0x42, 0x83, - 0x0b, 0x6b, 0xc3, 0xac, 0xfc, 0x6d, 0xea, 0xa6, 0xca, 0x7d, 0x75, 0x53, 0x17, 0xa9, 0x45, 0xe7, - 0x89, 0x7f, 0x4a, 0x45, 0xa5, 0x87, 0x5f, 0xca, 0x60, 0xcc, 0x3a, 0xc0, 0x0c, 0xb0, 0x5c, 0xb4, - 0xe7, 0x8f, 0xd6, 0x48, 0xbd, 0x46, 0x75, 0x96, 0xd3, 0x75, 0xa6, 0x57, 0x6e, 0x06, 0x6f, 0xe6, - 0xc2, 0x34, 0x41, 0xfd, 0x87, 0x5c, 0xee, 0xf0, 0x2f, 0x19, 0x01, 0xb0, 0x52, 0xa5, 0xf2, 0x12, - 0xa5, 0x6a, 0xc2, 0x00, 0x65, 0xa9, 0x0d, 0x3d, 0xcd, 0x8f, 0x6d, 0xc0, 0x4c, 0xa5, 0xd3, 0x69, - 0x7a, 0xbc, 0x81, 0xad, 0x94, 0x19, 0xf4, 0xad, 0x24, 0x3b, 0x98, 0x2b, 0x0b, 0xe9, 0x66, 0x97, - 0x4e, 0x9f, 0xdf, 0x4b, 0x6b, 0xfd, 0x70, 0xae, 0xe7, 0xa3, 0xd9, 0x1b, 0x30, 0x86, 0x3f, 0xb4, - 0x98, 0x2a, 0xa8, 0xe2, 0x91, 0x9f, 0x88, 0xca, 0xa3, 0x04, 0x41, 0x08, 0x4b, 0x7a, 0x5c, 0xc5, - 0x82, 0x14, 0x96, 0x48, 0xaf, 0x90, 0x68, 0x12, 0xca, 0xca, 0x35, 0xa3, 0x90, 0x08, 0x5d, 0xe8, - 0x9a, 0x41, 0x0e, 0x19, 0xd6, 0x0f, 0xe6, 0xcd, 0x69, 0xc7, 0x2e, 0x6a, 0x72, 0xbb, 0x16, 0xd9, - 0x51, 0xc9, 0xed, 0x9a, 0xb4, 0xfe, 0x0f, 0x72, 0x30, 0xbb, 0x11, 0xec, 0xba, 0x6d, 0xef, 0x9b, - 0x32, 0x46, 0xb6, 0x8f, 0xe3, 0x72, 0x74, 0xa2, 0xc5, 0xa7, 0x95, 0x30, 0xce, 0xd7, 0x2a, 0x16, - 0x33, 0x05, 0xa7, 0x8c, 0x9d, 0xf5, 0x3d, 0xe8, 0xec, 0x86, 0x1f, 0xa6, 0xe5, 0xed, 0x93, 0xe8, - 0x12, 0x6e, 0xfd, 0xad, 0x3c, 0x8c, 0x6b, 0x4b, 0x80, 0x7d, 0x06, 0x26, 0x74, 0x3e, 0xba, 0xc2, - 0x4f, 0xaf, 0xd6, 0x36, 0xb0, 0x50, 0xe3, 0xc7, 0xdd, 0x96, 0xa1, 0xf1, 0x13, 0x13, 0x1d, 0xa1, - 0x27, 0xbc, 0xda, 0x7c, 0x90, 0x71, 0xb5, 0x29, 0xa7, 0x32, 0xf5, 0x1f, 0x79, 0xc1, 0x79, 0xb7, - 0xf7, 0x82, 0x83, 0xca, 0x23, 0x8d, 0xbe, 0xff, 0x35, 0xc7, 0xfa, 0xf1, 0x1c, 0x94, 0xd2, 0x8b, - 0xf4, 0xbb, 0xd2, 0x2b, 0x27, 0x78, 0xdd, 0xf9, 0xd1, 0x7c, 0x9c, 0xe7, 0x44, 0xb9, 0xf0, 0x3e, - 0xab, 0x66, 0x82, 0xef, 0x19, 0x0f, 0x2f, 0xcf, 0x9b, 0xd1, 0xe8, 0xf4, 0xe0, 0x17, 0xd9, 0x21, - 0x28, 0x87, 0xbe, 0xf5, 0xb3, 0xe5, 0xe7, 0xac, 0x0f, 0x61, 0x2e, 0xdd, 0x1d, 0xf8, 0xf8, 0x52, - 0x81, 0x69, 0x13, 0x9e, 0xce, 0x92, 0x94, 0xa6, 0xb2, 0xd3, 0xf8, 0xd6, 0xef, 0xe6, 0xd3, 0xbc, - 0xc9, 0x64, 0x50, 0x6c, 0x3a, 0xba, 0x21, 0x0c, 0x6d, 0x3a, 0x12, 0x64, 0xab, 0xb2, 0x93, 0x64, - 0x27, 0x8b, 0x1d, 0x51, 0x0b, 0xd9, 0x8e, 0xa8, 0xec, 0x7a, 0xca, 0x4a, 0x5a, 0x8b, 0x9a, 0xf4, - 0x98, 0x6f, 0x3b, 0x89, 0xa5, 0x74, 0xca, 0x38, 0x7a, 0x19, 0xe6, 0x8c, 0x10, 0xe0, 0x8a, 0x7e, - 0x38, 0xd1, 0xb5, 0x47, 0x58, 0x20, 0x89, 0x33, 0x91, 0xd9, 0x2d, 0x18, 0x15, 0x9f, 0x79, 0xd7, - 0xed, 0xd0, 0x9b, 0x0a, 0x8b, 0xdd, 0xd2, 0x9b, 0xf1, 0x85, 0x4f, 0xf3, 0x4c, 0x6f, 0x72, 0x71, - 0xe4, 0xeb, 0x13, 0x8b, 0x10, 0xad, 0x7f, 0x9e, 0x13, 0xeb, 0xbf, 0xfe, 0xf0, 0x7b, 0x2c, 0xc5, - 0x99, 0x68, 0xd2, 0x11, 0x16, 0xad, 0x7f, 0x98, 0x97, 0x89, 0x6e, 0x68, 0xfa, 0xbc, 0x0d, 0x23, - 0x5b, 0x6e, 0xb0, 0x4b, 0x39, 0x8e, 0x4d, 0x2e, 0xb2, 0x20, 0x89, 0xe9, 0x14, 0xe1, 0x6f, 0x9b, - 0x08, 0x74, 0x5d, 0x58, 0x7e, 0x20, 0x5d, 0x98, 0xa6, 0x97, 0x2f, 0x3c, 0x35, 0xbd, 0xfc, 0xf7, - 0xc5, 0x39, 0x6d, 0x2a, 0xd1, 0x00, 0x11, 0xa6, 0xcf, 0xa7, 0x73, 0x42, 0xf5, 0xc4, 0x02, 0x4f, - 0xd8, 0xb1, 0xeb, 0x7a, 0x96, 0x29, 0xcd, 0xb7, 0xf3, 0x98, 0x7c, 0x52, 0xd6, 0x1f, 0x16, 0x64, - 0x1f, 0x53, 0x47, 0x5d, 0x30, 0xfc, 0xbe, 0x71, 0x9d, 0x88, 0x8d, 0x5e, 0x0f, 0xc1, 0x81, 0x66, - 0x53, 0x17, 0x60, 0x48, 0xcc, 0x4d, 0xea, 0x4d, 0xc4, 0x13, 0xf3, 0x57, 0xc7, 0x13, 0xe5, 0x62, - 0x2d, 0xe3, 0x99, 0xa4, 0xa7, 0x0f, 0xc4, 0x63, 0x4b, 0x5f, 0xcb, 0x88, 0xc1, 0x2e, 0xc2, 0xd0, - 0xba, 0xdf, 0x50, 0x91, 0xcc, 0xe7, 0x30, 0xfa, 0x87, 0xdf, 0xe0, 0x86, 0xd2, 0x1c, 0x31, 0x44, - 0x5b, 0xe3, 0xe4, 0x0e, 0x7a, 0x5b, 0x5b, 0x3b, 0x6e, 0x6f, 0x5a, 0x38, 0x2d, 0xa3, 0xcc, 0x2a, - 0x4c, 0x99, 0x89, 0xd5, 0xc9, 0xde, 0x17, 0xb5, 0xeb, 0xa9, 0xfc, 0xec, 0xfa, 0xb3, 0x88, 0x49, - 0xc4, 0x96, 0x60, 0xd2, 0x88, 0xa0, 0x4a, 0x8f, 0x9b, 0xa8, 0xde, 0x34, 0xe3, 0xaf, 0xea, 0xea, - 0x4d, 0x83, 0x44, 0x9c, 0xe7, 0xf4, 0xfd, 0xda, 0x13, 0x67, 0xcf, 0xb7, 0x13, 0x0e, 0xbb, 0x06, - 0x45, 0x19, 0x66, 0xa3, 0xba, 0xa2, 0x3f, 0x53, 0x85, 0x08, 0x4b, 0x85, 0xa9, 0x51, 0x88, 0x5a, - 0x58, 0x85, 0x4f, 0x43, 0x89, 0xb6, 0xa4, 0x24, 0x55, 0xf7, 0x0b, 0x30, 0xb4, 0x5c, 0x5d, 0xb1, - 0xf5, 0x6d, 0xa4, 0xee, 0x35, 0x02, 0x1b, 0xa1, 0xe8, 0x55, 0xb7, 0xce, 0xa3, 0xc7, 0x7e, 0xf0, - 0xd0, 0xe6, 0x61, 0x14, 0x78, 0x32, 0xfb, 0x24, 0x2e, 0xc4, 0xcf, 0xb0, 0x77, 0x61, 0x18, 0x0d, - 0x4f, 0x53, 0x27, 0x43, 0xba, 0x8e, 0xa5, 0x49, 0x9a, 0xc0, 0xc3, 0x68, 0xc5, 0x6a, 0x4b, 0x22, - 0xf6, 0x36, 0x0c, 0xad, 0xf0, 0xf6, 0x7e, 0x2a, 0x31, 0x5e, 0x0f, 0x71, 0xbc, 0x21, 0x34, 0x78, - 0x7b, 0xdf, 0x46, 0x12, 0xeb, 0xc7, 0xf3, 0x70, 0x2a, 0xe3, 0xb3, 0xee, 0x7f, 0xe6, 0x19, 0xdd, - 0x15, 0x97, 0x8c, 0x5d, 0x51, 0xbd, 0x4f, 0xf7, 0xed, 0xf8, 0xcc, 0x4d, 0xf2, 0xa7, 0x73, 0x70, - 0xc6, 0x9c, 0xa0, 0x64, 0x69, 0x7e, 0xff, 0x1a, 0x7b, 0x07, 0x46, 0x6e, 0x71, 0xb7, 0xc1, 0x55, - 0xd2, 0xac, 0x53, 0x71, 0x40, 0x3c, 0x19, 0x43, 0x40, 0x16, 0x4a, 0xb6, 0x89, 0xc7, 0xa9, 0x84, - 0xb2, 0x15, 0xfa, 0x38, 0x29, 0x8f, 0x5b, 0x2a, 0x9e, 0x47, 0x56, 0x55, 0x47, 0x58, 0x79, 0x7c, - 0x3b, 0x07, 0xcf, 0x1f, 0x41, 0x23, 0x06, 0x4e, 0x0c, 0xbd, 0x3e, 0x70, 0x78, 0xa2, 0x22, 0x94, - 0xbd, 0x0f, 0xd3, 0x5b, 0x24, 0xcf, 0xab, 0xe1, 0xc8, 0x27, 0xeb, 0x45, 0x89, 0xfa, 0x8e, 0x1a, - 0x97, 0x34, 0xb2, 0x11, 0x68, 0xa6, 0x70, 0x64, 0xa0, 0x19, 0x3d, 0x6e, 0xcb, 0xd0, 0xa0, 0x71, - 0x5b, 0x3e, 0x84, 0x39, 0xb3, 0x6d, 0x14, 0x3e, 0x37, 0x89, 0x5a, 0x93, 0xeb, 0x1f, 0xb5, 0xe6, - 0xc8, 0x20, 0x9d, 0xd6, 0xdf, 0xca, 0x41, 0xc9, 0xe4, 0xfd, 0x49, 0xc7, 0xf3, 0x3d, 0x63, 0x3c, - 0x9f, 0xcf, 0x1e, 0xcf, 0xfe, 0x03, 0xf9, 0x7f, 0xe6, 0xd2, 0x8d, 0x1d, 0x68, 0x04, 0x2d, 0x18, - 0x59, 0xf1, 0x5b, 0xae, 0xd7, 0xd6, 0x33, 0xbf, 0x37, 0x10, 0x62, 0x53, 0xc9, 0x60, 0x41, 0x7e, - 0xce, 0xc3, 0xf0, 0xba, 0xdf, 0xae, 0xac, 0x90, 0x49, 0x2f, 0xf2, 0x69, 0xfb, 0x6d, 0xc7, 0x6d, - 0xd8, 0xb2, 0x80, 0xad, 0x01, 0xd4, 0xea, 0x01, 0xe7, 0xed, 0x9a, 0xf7, 0x4d, 0x9e, 0x92, 0x34, - 0x44, 0x0f, 0x35, 0xbb, 0xb8, 0xb1, 0xc8, 0xa7, 0x4b, 0x44, 0x74, 0x42, 0xef, 0x9b, 0xfa, 0x7e, - 0xab, 0xd1, 0xe3, 0xba, 0xa2, 0x38, 0x68, 0xa9, 0x71, 0xb8, 0xfa, 0xdd, 0x58, 0x57, 0x99, 0x55, - 0x61, 0x0f, 0x5f, 0xcd, 0x1c, 0x8e, 0xdf, 0xc9, 0xc1, 0xf3, 0x47, 0xd0, 0x3c, 0x85, 0x51, 0xf9, - 0xb3, 0xee, 0x70, 0x0e, 0x90, 0x10, 0x61, 0xde, 0x61, 0xaf, 0x11, 0xc9, 0x44, 0x78, 0x93, 0x94, - 0x77, 0x58, 0x00, 0x8c, 0xbc, 0xc3, 0x02, 0x20, 0xce, 0xd2, 0x5b, 0xdc, 0xdb, 0xdd, 0x93, 0xe6, - 0x59, 0x93, 0x72, 0x6f, 0xd8, 0x43, 0x88, 0x7e, 0x96, 0x4a, 0x1c, 0xeb, 0x5f, 0x0e, 0xc3, 0x59, - 0x9b, 0xef, 0x7a, 0xe2, 0x5e, 0x72, 0x2f, 0xf4, 0xda, 0xbb, 0x46, 0xdc, 0x1b, 0x2b, 0xb5, 0x72, - 0x29, 0x49, 0x84, 0x80, 0xc4, 0x33, 0xf1, 0x12, 0x14, 0x85, 0x18, 0xa2, 0x2d, 0x5e, 0x7c, 0xb4, - 0x12, 0xc2, 0x0a, 0x05, 0x56, 0x56, 0xc5, 0xec, 0x75, 0x12, 0x93, 0xb4, 0x34, 0x3e, 0x42, 0x4c, - 0xfa, 0xce, 0x41, 0x19, 0x6a, 0xfb, 0x61, 0xc4, 0xf1, 0x8a, 0x4c, 0xa2, 0x52, 0x7c, 0x97, 0x19, - 0xea, 0x73, 0x97, 0xb9, 0x0b, 0x73, 0x95, 0x86, 0x3c, 0x1d, 0xdd, 0xe6, 0x66, 0xe0, 0xb5, 0xeb, - 0x5e, 0xc7, 0x6d, 0xaa, 0xfb, 0x39, 0xf6, 0xb2, 0x1b, 0x97, 0x3b, 0x9d, 0x18, 0xc1, 0xce, 0x24, - 0x13, 0xcd, 0x58, 0x59, 0xaf, 0x61, 0x78, 0x18, 0x7a, 0x8f, 0xc4, 0x66, 0x34, 0xda, 0x21, 0xb6, - 0x22, 0xb4, 0xe3, 0x62, 0xbc, 0x45, 0xe1, 0x83, 0xfc, 0xd6, 0x5a, 0x2d, 0x71, 0x69, 0x96, 0x59, - 0x06, 0xe4, 0xc3, 0x7e, 0xd4, 0x0c, 0xd1, 0x14, 0xd2, 0xc0, 0x4b, 0xe8, 0x6a, 0xb5, 0x5b, 0x82, - 0xae, 0xd8, 0x43, 0x17, 0x86, 0x7b, 0x3a, 0x9d, 0xc4, 0x63, 0x57, 0xc4, 0x54, 0x68, 0xf9, 0x11, - 0xc7, 0x29, 0x3c, 0x96, 0xdc, 0xb9, 0x02, 0x84, 0xca, 0x3b, 0x97, 0x86, 0xc2, 0xde, 0x85, 0xd9, - 0xd5, 0xe5, 0x45, 0xa5, 0x45, 0x5e, 0xf1, 0xeb, 0x5d, 0x7c, 0x88, 0x07, 0xac, 0x0f, 0xc7, 0x90, - 0xd7, 0x17, 0xc5, 0x6e, 0x92, 0x85, 0xc6, 0x2e, 0xc0, 0x68, 0x75, 0x45, 0xf6, 0xfd, 0xb8, 0x9e, - 0x4a, 0x8b, 0x2c, 0xa3, 0x54, 0x21, 0xdb, 0x48, 0x2e, 0x05, 0x13, 0xc7, 0x4a, 0xef, 0x67, 0x07, - 0xb8, 0x10, 0xbc, 0x0d, 0x93, 0x4b, 0x7e, 0x54, 0x6d, 0x87, 0x91, 0xdb, 0xae, 0xf3, 0xea, 0x8a, - 0x1e, 0xd7, 0x7a, 0xdb, 0x8f, 0x1c, 0x8f, 0x4a, 0xc4, 0x97, 0x9b, 0x98, 0xec, 0x73, 0x48, 0x7a, - 0x93, 0xb7, 0x79, 0x90, 0xc4, 0xb3, 0x1e, 0x96, 0x7d, 0x2b, 0x48, 0x77, 0xe3, 0x12, 0xdb, 0x44, - 0xa4, 0x34, 0x5f, 0x32, 0xf3, 0xe6, 0xb2, 0xdf, 0xe0, 0xa1, 0xdc, 0x2d, 0xbe, 0x87, 0xd2, 0x7c, - 0x69, 0x6d, 0x3b, 0x62, 0x07, 0xfd, 0x77, 0x30, 0xcd, 0x57, 0x0f, 0x2e, 0xfb, 0x1c, 0x0c, 0xe3, - 0x4f, 0x92, 0x6e, 0x67, 0x33, 0xd8, 0x26, 0x92, 0x6d, 0x5d, 0x60, 0xda, 0x92, 0x80, 0x55, 0x61, - 0x94, 0x2e, 0x56, 0x27, 0x49, 0x56, 0x43, 0x37, 0x34, 0x39, 0x33, 0x88, 0xde, 0x6a, 0xc0, 0x84, - 0x5e, 0xa1, 0x58, 0x11, 0xb7, 0xdc, 0x70, 0x8f, 0x37, 0xc4, 0x2f, 0xca, 0x33, 0x87, 0x2b, 0x62, - 0x0f, 0xa1, 0x8e, 0xf8, 0x0e, 0x5b, 0x43, 0x11, 0x67, 0x6a, 0x35, 0xbc, 0x17, 0xd2, 0xa7, 0x90, - 0xaa, 0xc5, 0x43, 0xb5, 0x5d, 0xc3, 0xa6, 0x22, 0xeb, 0xfb, 0x60, 0x6e, 0xbd, 0xdb, 0x6c, 0xba, - 0xdb, 0x4d, 0xae, 0xf2, 0x90, 0x60, 0x7a, 0xee, 0x25, 0x18, 0xae, 0x69, 0x09, 0xbf, 0xe3, 0x44, - 0x8f, 0x1a, 0x0e, 0x1a, 0xa1, 0xe6, 0x30, 0x54, 0x4f, 0x2a, 0xd5, 0xb7, 0x24, 0xb5, 0x7e, 0x2b, - 0x07, 0x73, 0xea, 0xfd, 0x3f, 0x70, 0xeb, 0x0f, 0xe3, 0xac, 0xef, 0x17, 0x8c, 0xb9, 0x86, 0x13, - 0x36, 0x35, 0x8d, 0xe4, 0xac, 0xbb, 0xad, 0x3e, 0xc2, 0x14, 0x58, 0xb2, 0x3e, 0xf8, 0xb8, 0x8f, - 0x61, 0xef, 0xc2, 0x38, 0x1d, 0x8f, 0x5a, 0x80, 0x49, 0x8c, 0xe2, 0x45, 0xd7, 0xbd, 0xb4, 0x35, - 0x8a, 0x8e, 0x8e, 0xb2, 0x98, 0xd9, 0x94, 0x4f, 0x2a, 0x03, 0x64, 0xcb, 0x62, 0x66, 0x1d, 0x47, - 0x4c, 0xdd, 0x5f, 0x1b, 0x4f, 0xf7, 0x2d, 0xcd, 0xdd, 0xeb, 0x7a, 0x48, 0xb9, 0x5c, 0x72, 0x33, - 0x4e, 0x42, 0xca, 0xe9, 0x37, 0xe3, 0x18, 0x35, 0x1e, 0x93, 0xfc, 0x31, 0x63, 0xf2, 0xbe, 0x1a, - 0x93, 0x42, 0xff, 0x89, 0x31, 0x7b, 0xc4, 0x38, 0xd4, 0x92, 0x15, 0x32, 0x34, 0x90, 0x5a, 0xe5, - 0x39, 0x8c, 0x9d, 0x2f, 0x49, 0xd2, 0xbb, 0x28, 0x71, 0xd2, 0x75, 0x35, 0xc3, 0x83, 0x33, 0x3d, - 0x66, 0x6b, 0xfe, 0x3c, 0x4c, 0x54, 0xa2, 0xc8, 0xad, 0xef, 0xf1, 0xc6, 0x8a, 0xd8, 0x9e, 0xb4, - 0xe8, 0x57, 0x2e, 0xc1, 0xf5, 0x47, 0x33, 0x1d, 0x57, 0x46, 0x73, 0x75, 0x43, 0x32, 0x66, 0x8d, - 0xa3, 0xb9, 0x0a, 0x88, 0x19, 0xcd, 0x55, 0x40, 0xd8, 0x15, 0x18, 0xad, 0xb6, 0x1f, 0x79, 0xa2, - 0x4f, 0x64, 0x00, 0x2c, 0xd4, 0x4d, 0x79, 0x12, 0xa4, 0x6f, 0xae, 0x84, 0xc5, 0xde, 0xd6, 0x2e, - 0x35, 0x63, 0x89, 0x02, 0x43, 0xaa, 0xbc, 0xe2, 0x08, 0x37, 0xfa, 0x85, 0x25, 0xbe, 0xe5, 0x5c, - 0x87, 0x51, 0xa5, 0xc9, 0x84, 0x44, 0x69, 0x41, 0x94, 0xbd, 0x01, 0x23, 0x14, 0x32, 0x66, 0xf0, - 0xd6, 0xf2, 0xe5, 0x8d, 0x6b, 0x19, 0xbc, 0xb5, 0x7c, 0x79, 0x46, 0x06, 0x6f, 0x2d, 0x73, 0x5e, - 0xac, 0x04, 0x9a, 0x38, 0x56, 0x09, 0x74, 0x1f, 0x26, 0x36, 0xdd, 0x20, 0xf2, 0x84, 0x8c, 0xd2, - 0x8e, 0xc2, 0xf9, 0x49, 0x43, 0x6f, 0xaa, 0x15, 0x2d, 0xbd, 0xa8, 0x92, 0x4e, 0x77, 0x34, 0x7c, - 0x33, 0x3b, 0x72, 0x02, 0xcf, 0x36, 0x65, 0x9d, 0xfa, 0x24, 0xa6, 0xac, 0xd8, 0xa9, 0xa8, 0x2b, - 0x9b, 0x4e, 0x34, 0x32, 0x78, 0x69, 0x49, 0x29, 0xcc, 0x62, 0x44, 0xf6, 0x15, 0x98, 0x10, 0x7f, - 0x6f, 0xfa, 0x4d, 0xaf, 0xee, 0xf1, 0x70, 0xbe, 0x84, 0x8d, 0x7b, 0x31, 0x73, 0xf5, 0x23, 0xd2, - 0x7e, 0x8d, 0x47, 0x72, 0x01, 0x23, 0xe3, 0xb4, 0x12, 0xdc, 0xe0, 0xc6, 0x3e, 0x80, 0x09, 0x31, - 0xfb, 0xb6, 0xdd, 0x50, 0x8a, 0xa6, 0x33, 0x89, 0x31, 0x72, 0x83, 0xe0, 0x3d, 0x01, 0x95, 0x75, - 0x02, 0x71, 0xcc, 0x57, 0x3a, 0x72, 0x83, 0x64, 0xda, 0x6c, 0xef, 0xf4, 0x6c, 0x8e, 0x0a, 0x8d, - 0x7d, 0x01, 0x26, 0x2a, 0x9d, 0x4e, 0xb2, 0xe3, 0xcc, 0x6a, 0x8a, 0xb0, 0x4e, 0xc7, 0xc9, 0xdc, - 0x75, 0x0c, 0x8a, 0xf4, 0xc6, 0x3c, 0x77, 0xa2, 0x8d, 0x99, 0xbd, 0x19, 0x4b, 0xeb, 0xa7, 0x12, - 0xad, 0x2e, 0x5d, 0x1c, 0x0d, 0xd1, 0x5f, 0x0a, 0xee, 0xcb, 0x30, 0x29, 0xd5, 0x9c, 0x4a, 0x9a, - 0x39, 0xdd, 0xb3, 0x7a, 0x32, 0x84, 0x1a, 0x93, 0x86, 0xad, 0xc2, 0x94, 0xf4, 0xb6, 0x6e, 0x52, - 0xa4, 0xeb, 0xf9, 0x33, 0xb8, 0x6a, 0x91, 0x8b, 0x74, 0xd2, 0x6e, 0x62, 0x02, 0x14, 0xd7, 0xe0, - 0x92, 0x22, 0xb2, 0xfe, 0x28, 0x07, 0x67, 0xfa, 0x8c, 0x78, 0x1c, 0x07, 0x39, 0x77, 0x74, 0x1c, - 0x64, 0xb1, 0x73, 0x98, 0x5a, 0x11, 0x6c, 0x3f, 0x49, 0x59, 0xfa, 0x78, 0x29, 0x79, 0xcb, 0x07, - 0x46, 0x39, 0x86, 0xa8, 0xea, 0xdb, 0x3e, 0xaa, 0x66, 0x0b, 0xbd, 0x87, 0x10, 0xe1, 0xc9, 0x8f, - 0x5a, 0xb2, 0x0e, 0x0f, 0xca, 0x2f, 0x52, 0x0a, 0xa3, 0x78, 0x58, 0x3f, 0xf2, 0x8d, 0x15, 0x9c, - 0xc1, 0xda, 0x3a, 0xc8, 0xc1, 0xb8, 0xb6, 0x0e, 0xd9, 0x79, 0xcd, 0x0b, 0xb8, 0x24, 0x93, 0x60, - 0x69, 0x1c, 0xf2, 0xf2, 0x24, 0xc2, 0x45, 0x95, 0x3f, 0x5e, 0x01, 0x7d, 0x57, 0x88, 0x42, 0x5a, - 0xac, 0xe8, 0x96, 0xa1, 0x2d, 0xb6, 0xb1, 0x1c, 0x73, 0xe5, 0xbb, 0x61, 0x54, 0xa9, 0x47, 0xde, - 0x23, 0x3e, 0xc0, 0xa1, 0x93, 0xe4, 0xca, 0x77, 0xc3, 0xc8, 0x71, 0x91, 0xac, 0x27, 0x57, 0x7e, - 0xcc, 0xd0, 0xfa, 0xab, 0x39, 0x80, 0x7b, 0xd5, 0x65, 0x0c, 0xf6, 0xfe, 0x49, 0x85, 0x82, 0xec, - 0x00, 0xba, 0x8a, 0xfb, 0x11, 0xe2, 0xc0, 0x7f, 0x9f, 0x83, 0x29, 0x13, 0x8d, 0xbd, 0x0f, 0xd3, - 0xb5, 0x7a, 0xe0, 0x37, 0x9b, 0xdb, 0x6e, 0xfd, 0xe1, 0x9a, 0xd7, 0xe6, 0x32, 0x74, 0xe9, 0xb0, - 0x3c, 0x8b, 0xc2, 0xb8, 0xc8, 0x69, 0x8a, 0x32, 0x3b, 0x8d, 0xcc, 0xfe, 0x5a, 0x0e, 0x26, 0x6b, - 0x7b, 0xfe, 0xe3, 0x38, 0xda, 0x28, 0x0d, 0xc8, 0x57, 0xc5, 0xda, 0x0e, 0xf7, 0xfc, 0xc7, 0x49, - 0x06, 0x4d, 0xc3, 0xf8, 0xf3, 0xbd, 0xc1, 0xde, 0xe5, 0xeb, 0x3e, 0xde, 0x64, 0xa2, 0xf0, 0xb2, - 0x51, 0x89, 0x6d, 0xd6, 0x69, 0xfd, 0x69, 0x0e, 0xc6, 0xf1, 0xce, 0xd3, 0x6c, 0xa2, 0xcc, 0xf5, - 0xbd, 0x94, 0x8e, 0x31, 0x6e, 0xd7, 0x11, 0x03, 0xfb, 0x16, 0x4c, 0xa7, 0xd0, 0x98, 0x05, 0x23, - 0x35, 0x74, 0xf0, 0xd7, 0x15, 0x14, 0xd2, 0xe5, 0xdf, 0xa6, 0x12, 0x6b, 0x55, 0x23, 0xbb, 0x7f, - 0x15, 0x9f, 0x75, 0x17, 0x01, 0x3c, 0x05, 0x52, 0x37, 0x1b, 0x96, 0xfe, 0x92, 0xfb, 0x57, 0x6d, - 0x0d, 0xcb, 0x5a, 0x87, 0x91, 0x9a, 0x1f, 0x44, 0x4b, 0xfb, 0xf2, 0x32, 0xb1, 0xc2, 0xc3, 0xba, - 0xfe, 0x6e, 0xeb, 0xe1, 0x5b, 0x49, 0xdd, 0xa6, 0x22, 0x56, 0x86, 0xe1, 0x1b, 0x1e, 0x6f, 0x36, - 0x74, 0x03, 0xdd, 0x1d, 0x01, 0xb0, 0x25, 0x5c, 0x5c, 0xb8, 0x4e, 0x27, 0x39, 0x51, 0x12, 0x4b, - 0xe0, 0x4f, 0xba, 0x6e, 0x96, 0x8d, 0xfe, 0x7d, 0x29, 0xce, 0x43, 0xd0, 0x5b, 0xd3, 0x11, 0x5d, - 0xfd, 0x1f, 0xe7, 0x60, 0xa1, 0x3f, 0x89, 0x6e, 0x5c, 0x9c, 0x3b, 0xc2, 0xb8, 0xf8, 0xd5, 0xf4, - 0x3b, 0x23, 0xa2, 0xd1, 0x3b, 0x63, 0xf2, 0xba, 0xb8, 0x82, 0xb6, 0xdd, 0x75, 0xae, 0x12, 0xa1, - 0x9c, 0x3f, 0xe2, 0x9b, 0x11, 0x51, 0x0e, 0x73, 0x84, 0x34, 0x36, 0xd1, 0x5a, 0xbf, 0x3a, 0x04, - 0x67, 0xfb, 0x52, 0xb0, 0x5b, 0x5a, 0x7a, 0xa5, 0xa9, 0x38, 0xb1, 0x4b, 0x5f, 0xfc, 0xcb, 0xf8, - 0x2f, 0x9a, 0xef, 0xa5, 0xbd, 0xcd, 0x36, 0xe2, 0xb4, 0x3a, 0x79, 0xe4, 0xf5, 0xa9, 0x63, 0x79, - 0x49, 0x74, 0x64, 0x06, 0xbd, 0x19, 0x76, 0xd0, 0x2f, 0x91, 0x47, 0xae, 0xd7, 0x0c, 0xf5, 0x65, - 0xd7, 0x90, 0x20, 0x5b, 0x95, 0x25, 0x16, 0xdf, 0x43, 0xd9, 0x16, 0xdf, 0xd6, 0xbf, 0xcc, 0xc1, - 0x58, 0xfc, 0xd9, 0x6c, 0x01, 0x4e, 0x6f, 0xd9, 0x95, 0xe5, 0x55, 0x67, 0xeb, 0xc3, 0xcd, 0x55, - 0xe7, 0xde, 0x7a, 0x6d, 0x73, 0x75, 0xb9, 0x7a, 0xa3, 0xba, 0xba, 0x52, 0x7a, 0x8e, 0xcd, 0xc0, - 0xe4, 0xbd, 0xf5, 0x3b, 0xeb, 0x1b, 0x0f, 0xd6, 0x9d, 0x55, 0xdb, 0xde, 0xb0, 0x4b, 0x39, 0x36, - 0x09, 0x63, 0xf6, 0x52, 0x65, 0xd9, 0x59, 0xdf, 0x58, 0x59, 0x2d, 0xe5, 0x59, 0x09, 0x26, 0x96, - 0x37, 0xd6, 0xd7, 0x57, 0x97, 0xb7, 0xaa, 0xf7, 0xab, 0x5b, 0x1f, 0x96, 0x0a, 0x8c, 0xc1, 0x14, - 0x22, 0x6c, 0xda, 0xd5, 0xf5, 0xe5, 0xea, 0x66, 0x65, 0xad, 0x34, 0x24, 0x60, 0x02, 0x5f, 0x83, - 0x0d, 0xc7, 0x8c, 0xee, 0xdc, 0x5b, 0x5a, 0x2d, 0x8d, 0x08, 0x14, 0xf1, 0x97, 0x86, 0x32, 0x2a, - 0xaa, 0x47, 0x94, 0x95, 0xca, 0x56, 0x65, 0xa9, 0x52, 0x5b, 0x2d, 0x15, 0xd9, 0x19, 0x98, 0x35, - 0x40, 0xce, 0xda, 0xc6, 0xcd, 0xea, 0x7a, 0x69, 0x8c, 0xcd, 0x41, 0x29, 0x86, 0xad, 0x2c, 0x39, - 0xf7, 0x6a, 0xab, 0x76, 0x09, 0xd2, 0xd0, 0xf5, 0xca, 0xdd, 0xd5, 0xd2, 0xb8, 0xf5, 0x9e, 0xf4, - 0x03, 0x94, 0x5d, 0xcd, 0x4e, 0x03, 0xab, 0x6d, 0x55, 0xb6, 0xee, 0xd5, 0x52, 0x8d, 0x1f, 0x87, - 0xd1, 0xda, 0xbd, 0xe5, 0xe5, 0xd5, 0x5a, 0xad, 0x94, 0x63, 0x00, 0x23, 0x37, 0x2a, 0xd5, 0xb5, - 0xd5, 0x95, 0x52, 0xde, 0xfa, 0xdb, 0x39, 0x98, 0x51, 0x12, 0xa0, 0x7a, 0x34, 0xfa, 0x84, 0x6b, - 0xf1, 0x7d, 0xe3, 0x62, 0xab, 0x9c, 0xb4, 0x52, 0x95, 0x1c, 0xb1, 0x0c, 0x7f, 0x3a, 0x07, 0xa7, - 0x32, 0xb1, 0xd9, 0x87, 0x50, 0x52, 0x5f, 0x70, 0xd7, 0x8d, 0xea, 0x7b, 0xc9, 0x3e, 0xf6, 0x62, - 0xaa, 0x96, 0x14, 0x9a, 0x54, 0x6b, 0x26, 0x09, 0x9f, 0x7b, 0xd8, 0x0c, 0x9e, 0x8e, 0xc0, 0xfa, - 0x56, 0x0e, 0xce, 0xf4, 0xa9, 0x86, 0x2d, 0xc3, 0x48, 0x9c, 0x98, 0xe6, 0x08, 0x0b, 0xb6, 0xb9, - 0x6f, 0x1f, 0x94, 0x09, 0x11, 0x33, 0xe4, 0xe2, 0x5f, 0xf6, 0x48, 0x9c, 0x69, 0x06, 0xd3, 0xbd, - 0xc8, 0xee, 0x3b, 0x9b, 0xea, 0x79, 0xaa, 0xa9, 0xf2, 0xa0, 0xb6, 0x34, 0x4e, 0x7d, 0x57, 0x70, - 0x1f, 0x87, 0x98, 0xef, 0xc5, 0xfa, 0x89, 0x9c, 0x10, 0xee, 0xd2, 0x88, 0x42, 0xe6, 0xad, 0x84, - 0x61, 0xb7, 0xc5, 0x6d, 0xbf, 0xc9, 0x2b, 0xf6, 0x3a, 0x1d, 0x1b, 0x28, 0xad, 0xba, 0x58, 0x80, - 0xd7, 0x0a, 0xc7, 0x0d, 0xda, 0xc6, 0x6b, 0xb5, 0x4e, 0xc3, 0xde, 0x06, 0x58, 0x7d, 0x12, 0xf1, - 0xa0, 0xed, 0x36, 0xe3, 0x18, 0x2d, 0x32, 0xb2, 0x14, 0x41, 0x4d, 0x79, 0x5b, 0x43, 0xb6, 0xfe, - 0x46, 0x0e, 0x26, 0xe8, 0xd2, 0x54, 0x69, 0xf2, 0x20, 0xfa, 0x64, 0xd3, 0xeb, 0x6d, 0x63, 0x7a, - 0xc5, 0x0e, 0x1b, 0x1a, 0x7f, 0x51, 0x9c, 0x39, 0xb3, 0xfe, 0x59, 0x0e, 0x4a, 0x69, 0x44, 0xf6, - 0x3e, 0x14, 0x6b, 0xfc, 0x11, 0x0f, 0xbc, 0x68, 0x9f, 0x36, 0x4a, 0x95, 0xc2, 0x4f, 0xe2, 0x50, - 0x99, 0x9c, 0x0f, 0x21, 0xfd, 0xb2, 0x63, 0x9a, 0x41, 0xf7, 0x7b, 0x4d, 0xed, 0x51, 0x78, 0x5a, - 0x6a, 0x0f, 0xeb, 0x7f, 0xc9, 0xc3, 0x99, 0x9b, 0x3c, 0xd2, 0xdb, 0x14, 0x9b, 0x17, 0x7c, 0x7a, - 0xb0, 0x76, 0x69, 0x2d, 0x99, 0x87, 0x51, 0x2c, 0x52, 0xe3, 0x6b, 0xab, 0x9f, 0x6c, 0x29, 0x9e, - 0xd7, 0x05, 0x23, 0x47, 0x58, 0x9f, 0xba, 0x2f, 0x6b, 0x59, 0x83, 0xe2, 0x69, 0x7d, 0x01, 0xa6, - 0x30, 0x2c, 0x7e, 0x57, 0x2c, 0x07, 0xde, 0x20, 0xf5, 0x4f, 0xd1, 0x4e, 0x41, 0xd9, 0xeb, 0x50, - 0x12, 0x90, 0x4a, 0xfd, 0x61, 0xdb, 0x7f, 0xdc, 0xe4, 0x8d, 0x5d, 0xde, 0xc0, 0x63, 0xbd, 0x68, - 0xf7, 0xc0, 0x15, 0xcf, 0x7b, 0x6d, 0x79, 0x75, 0xe3, 0x0d, 0xd4, 0xd1, 0x10, 0xcf, 0x04, 0xba, - 0xf0, 0x36, 0x8c, 0x7f, 0xcc, 0x0c, 0x60, 0xd6, 0xff, 0x9c, 0x83, 0x39, 0x6c, 0x9c, 0x56, 0xb1, - 0xca, 0xce, 0xaa, 0x7a, 0x4b, 0x4b, 0x8a, 0xe3, 0x0a, 0x90, 0xb9, 0x14, 0xe2, 0x5e, 0x4c, 0x74, - 0x42, 0xf9, 0x01, 0x74, 0x42, 0xb5, 0x93, 0x64, 0xa2, 0x1f, 0x50, 0xa5, 0x75, 0x7b, 0xa8, 0x58, - 0x28, 0x0d, 0x25, 0x43, 0x6e, 0xfd, 0xb5, 0x3c, 0x8c, 0xda, 0x1c, 0x53, 0x74, 0xb3, 0x0b, 0x30, - 0xba, 0xee, 0x47, 0x3c, 0xbc, 0x6b, 0xe4, 0x63, 0x6f, 0x0b, 0x90, 0xd3, 0x6a, 0xd8, 0xaa, 0x50, - 0x4c, 0xf8, 0xcd, 0xc0, 0x6f, 0x74, 0xeb, 0x91, 0x3e, 0xe1, 0x3b, 0x12, 0x64, 0xab, 0x32, 0xf6, - 0x06, 0x8c, 0x11, 0xe7, 0xf8, 0x51, 0x17, 0x8d, 0x91, 0x03, 0x1e, 0xa7, 0x78, 0x4f, 0x10, 0x50, - 0xa6, 0x95, 0x02, 0xc6, 0x90, 0x26, 0xd3, 0xf6, 0xc8, 0x0c, 0x4a, 0x54, 0x1f, 0x3e, 0x42, 0x54, - 0xff, 0x34, 0x8c, 0x54, 0xc2, 0x90, 0x47, 0x2a, 0x8a, 0xc1, 0x44, 0x1c, 0xb6, 0x2d, 0xe4, 0x91, - 0x64, 0xec, 0x62, 0xb9, 0x4d, 0x78, 0xd6, 0x3f, 0xcf, 0xc3, 0x30, 0xfe, 0x89, 0x4f, 0xa6, 0x41, - 0x7d, 0xcf, 0x78, 0x32, 0x0d, 0xea, 0x7b, 0x36, 0x42, 0xd9, 0x55, 0xd4, 0x54, 0xa8, 0xfc, 0x4d, - 0xd4, 0x7a, 0x54, 0xc1, 0x37, 0x12, 0xb0, 0xad, 0xe3, 0xc4, 0x2f, 0xfc, 0x85, 0xcc, 0xd8, 0x25, - 0xa7, 0x21, 0xbf, 0x51, 0xa3, 0x16, 0x63, 0x44, 0x2c, 0x3f, 0xb4, 0xf3, 0x1b, 0x35, 0xec, 0x8d, - 0x5b, 0x95, 0xc5, 0xb7, 0xae, 0x53, 0x43, 0x65, 0x6f, 0xec, 0xb9, 0x8b, 0x6f, 0x5d, 0xb7, 0xa9, - 0x44, 0xf4, 0x2f, 0x7e, 0x33, 0x3e, 0xbc, 0x4a, 0x9f, 0x7b, 0xec, 0x5f, 0x6c, 0x1b, 0x3e, 0xb2, - 0xda, 0x09, 0x02, 0x5b, 0x84, 0x71, 0x8a, 0xf5, 0x80, 0xf8, 0x5a, 0x2c, 0x06, 0x8a, 0x05, 0x21, - 0x29, 0x74, 0x24, 0xf9, 0x04, 0x47, 0x03, 0xa4, 0xb2, 0xcc, 0xd2, 0x13, 0x9c, 0x1a, 0xc2, 0xd0, - 0xd6, 0x50, 0xc4, 0x27, 0xc9, 0x37, 0xbc, 0xc4, 0x97, 0x7e, 0x4a, 0x0b, 0x1a, 0x80, 0x69, 0x0e, - 0x62, 0x04, 0xeb, 0xe7, 0xf3, 0x50, 0xdc, 0x6c, 0x76, 0x77, 0xbd, 0xf6, 0xfd, 0xab, 0x8c, 0x01, - 0x5e, 0xe3, 0x54, 0x1e, 0x0c, 0xf1, 0x37, 0x3b, 0x0b, 0x45, 0x75, 0x73, 0x53, 0x1b, 0x52, 0x48, - 0xb7, 0xb6, 0x79, 0x50, 0xe3, 0x4e, 0xa1, 0xcf, 0xd4, 0x4f, 0x76, 0x15, 0xe2, 0xfb, 0x57, 0xbf, - 0x8b, 0xda, 0x90, 0x58, 0x2c, 0x76, 0x8c, 0xc6, 0xde, 0x04, 0x3c, 0x24, 0xe8, 0xf2, 0xa0, 0x14, - 0xda, 0xf2, 0xd3, 0x48, 0x4e, 0x91, 0x24, 0x88, 0xc6, 0xae, 0x01, 0x4d, 0x4c, 0xca, 0x66, 0x7e, - 0xca, 0x24, 0x90, 0xf9, 0x21, 0x15, 0x09, 0xa1, 0xb2, 0x77, 0x61, 0xbc, 0x1e, 0x70, 0x7c, 0x75, - 0x74, 0x9b, 0x49, 0x92, 0x72, 0x9d, 0x72, 0x39, 0x29, 0xbf, 0x7f, 0xd5, 0xd6, 0xd1, 0xad, 0x7f, - 0x3c, 0x0a, 0x13, 0xfa, 0xf7, 0x30, 0x1b, 0x66, 0xc3, 0xa6, 0xb8, 0xbb, 0x93, 0xb1, 0x59, 0x07, - 0x0b, 0xe9, 0x38, 0x3d, 0x6f, 0x7e, 0x90, 0xc0, 0x93, 0x96, 0x67, 0x2a, 0x48, 0xc5, 0xad, 0xe7, - 0xec, 0x99, 0x30, 0x01, 0x4b, 0x3c, 0x56, 0x81, 0xa2, 0xdf, 0x09, 0x77, 0x79, 0xdb, 0x53, 0xef, - 0x2d, 0x2f, 0x1b, 0x8c, 0x36, 0xa8, 0xb0, 0x87, 0x57, 0x4c, 0xc6, 0xde, 0x82, 0x11, 0xbf, 0xc3, - 0xdb, 0xae, 0x47, 0x67, 0xdc, 0xf3, 0x29, 0x06, 0xbc, 0x5d, 0xa9, 0x6a, 0x84, 0x84, 0xcc, 0xae, - 0xc0, 0x90, 0xff, 0x30, 0x1e, 0xaf, 0xb3, 0x26, 0xd1, 0xc3, 0xc8, 0xd5, 0x48, 0x10, 0x51, 0x10, - 0x7c, 0xe4, 0xb6, 0x76, 0x68, 0xc4, 0x4c, 0x82, 0xdb, 0x6e, 0x6b, 0x47, 0x27, 0x10, 0x88, 0xec, - 0x03, 0x80, 0x8e, 0xbb, 0xcb, 0x03, 0xa7, 0xd1, 0x8d, 0xf6, 0x69, 0xdc, 0x5e, 0x34, 0xc8, 0x36, - 0x45, 0xf1, 0x4a, 0x37, 0xda, 0xd7, 0x68, 0xc7, 0x3a, 0x0a, 0xc8, 0x2a, 0x00, 0x2d, 0x37, 0x8a, - 0x78, 0xd0, 0xf2, 0xc9, 0xda, 0x2f, 0x09, 0x42, 0x28, 0x19, 0xdc, 0x8d, 0x8b, 0x35, 0x0e, 0x1a, - 0x11, 0x7e, 0xb4, 0x17, 0xb8, 0x94, 0x53, 0x3e, 0xf5, 0xd1, 0x5e, 0x60, 0xb4, 0x52, 0x20, 0xb2, - 0xcf, 0xc1, 0x68, 0xc3, 0x0b, 0xeb, 0x7e, 0xd0, 0xa0, 0xe8, 0x25, 0x2f, 0x18, 0x34, 0x2b, 0xb2, - 0x4c, 0x23, 0x53, 0xe8, 0xe2, 0x6b, 0x29, 0x08, 0xe9, 0xba, 0xff, 0x18, 0xd5, 0xfc, 0xe9, 0xaf, - 0xad, 0xc5, 0xc5, 0xfa, 0xd7, 0x26, 0x44, 0x62, 0x28, 0x77, 0xbd, 0xa8, 0xe9, 0x6e, 0xd3, 0x3b, - 0xb7, 0x39, 0x94, 0x37, 0xb1, 0x48, 0x1f, 0x4a, 0x89, 0xcc, 0xde, 0x86, 0x22, 0x6f, 0x47, 0x81, - 0xeb, 0x78, 0x0d, 0xf2, 0x92, 0x34, 0x3f, 0x5a, 0x1c, 0xc0, 0x6e, 0x75, 0x45, 0xff, 0x68, 0xc4, - 0xaf, 0x36, 0x44, 0xff, 0x84, 0x75, 0xaf, 0x45, 0xce, 0x8d, 0x66, 0xff, 0xd4, 0x96, 0xab, 0x77, - 0xf5, 0xfe, 0x11, 0x88, 0xec, 0x7d, 0x18, 0x15, 0xeb, 0xb7, 0xe1, 0xef, 0x52, 0x40, 0x08, 0xcb, - 0xec, 0x1f, 0x59, 0xd6, 0x33, 0x5d, 0x15, 0x91, 0x58, 0xc8, 0xee, 0xe3, 0xd0, 0xf1, 0xea, 0x14, - 0xe4, 0xc1, 0x5c, 0x8e, 0x95, 0x07, 0xb5, 0xea, 0xb2, 0x46, 0x36, 0xec, 0x3e, 0x0e, 0xab, 0x75, - 0xf6, 0x22, 0x40, 0xf2, 0xae, 0x2e, 0x5f, 0x41, 0x6c, 0x0d, 0xf2, 0xf9, 0xa1, 0xff, 0xfd, 0x67, - 0xcb, 0xb9, 0x25, 0x80, 0xa2, 0x8a, 0x19, 0x63, 0xad, 0xc1, 0xd9, 0xbe, 0x2b, 0x91, 0x5d, 0x82, - 0xd2, 0x8e, 0x4b, 0x7a, 0xb8, 0xfa, 0x9e, 0xdb, 0x6e, 0xf3, 0x26, 0xed, 0x81, 0xd3, 0x0a, 0xbe, - 0x2c, 0xc1, 0x92, 0xb3, 0xf5, 0x01, 0xcc, 0x65, 0x0d, 0x01, 0x7b, 0x09, 0x26, 0xf4, 0xf0, 0x38, - 0xc4, 0x64, 0xdc, 0xed, 0x78, 0x2a, 0x40, 0x0e, 0x31, 0xf8, 0x95, 0x1c, 0xbc, 0x70, 0xd4, 0x82, - 0x66, 0x0b, 0x50, 0xec, 0x04, 0x9e, 0x8f, 0x82, 0x23, 0xe5, 0x1f, 0x50, 0xbf, 0x31, 0xb5, 0x00, - 0x4a, 0x38, 0x91, 0xbb, 0x4b, 0x2e, 0x17, 0xf6, 0x18, 0x42, 0xb6, 0xdc, 0xdd, 0x90, 0x7d, 0x0a, - 0x66, 0x1a, 0x7c, 0xc7, 0xed, 0x36, 0x23, 0x27, 0xac, 0xef, 0xf1, 0x06, 0x7a, 0x39, 0xa1, 0x29, - 0x9d, 0x5d, 0xa2, 0x82, 0x9a, 0x82, 0xf7, 0x7c, 0xf1, 0x70, 0x9f, 0x2f, 0xbe, 0x3d, 0x54, 0xcc, - 0x95, 0xf2, 0x36, 0xda, 0x2e, 0x59, 0x3f, 0x90, 0x87, 0xf9, 0x7e, 0x33, 0x98, 0xbd, 0x97, 0xd5, - 0x07, 0xf2, 0x29, 0x41, 0x87, 0xeb, 0x4f, 0x09, 0x5a, 0x6d, 0x6c, 0x11, 0x62, 0x1f, 0xa5, 0xe3, - 0xe2, 0x0d, 0x28, 0x98, 0xa0, 0xe9, 0xb8, 0x61, 0xf8, 0x58, 0x2c, 0xd2, 0x82, 0x16, 0x62, 0x96, - 0x60, 0x3a, 0x8d, 0x82, 0xb1, 0xcf, 0x02, 0xd4, 0x9b, 0x7e, 0xc8, 0xf1, 0xc5, 0x9e, 0x4e, 0x7f, - 0x69, 0xa8, 0x1d, 0x43, 0xf5, 0x27, 0x5a, 0x84, 0x2e, 0xfb, 0x0d, 0x4e, 0x03, 0xe8, 0xc2, 0x99, - 0x3e, 0x5b, 0x96, 0x18, 0x9e, 0x24, 0x5f, 0xbb, 0xca, 0xfe, 0xd4, 0x8d, 0xb3, 0xb6, 0xa7, 0x7b, - 0x3c, 0xdf, 0x6f, 0x8e, 0xec, 0x03, 0xeb, 0xdd, 0x97, 0x04, 0x77, 0x32, 0x37, 0xee, 0x06, 0x31, - 0x77, 0x09, 0xb9, 0x17, 0x34, 0x59, 0x19, 0xc6, 0x55, 0x76, 0x47, 0x21, 0x5d, 0x4b, 0xe6, 0x40, - 0xa0, 0x3b, 0x1c, 0x27, 0x0f, 0xc6, 0x10, 0x45, 0x4f, 0x34, 0x3a, 0xb7, 0xc7, 0x10, 0xb2, 0xb5, - 0xdf, 0x51, 0xad, 0x7b, 0x41, 0xcd, 0x6f, 0xf3, 0xb4, 0xa0, 0xd2, 0x9f, 0xcc, 0xa9, 0xe1, 0xef, - 0xdd, 0x6e, 0x8f, 0xfb, 0x3e, 0x06, 0xe8, 0x37, 0x44, 0x1f, 0x86, 0x7f, 0x0b, 0x39, 0x42, 0xad, - 0x3a, 0x92, 0x23, 0xe8, 0x27, 0xbb, 0x00, 0xd3, 0x81, 0xb4, 0x2c, 0x8d, 0x7c, 0xea, 0x4f, 0x99, - 0x49, 0x63, 0x52, 0x82, 0xb7, 0x7c, 0xec, 0x53, 0xfa, 0xae, 0xdb, 0x71, 0x87, 0x69, 0xa7, 0x0f, - 0xbb, 0x0c, 0x63, 0xe2, 0xf4, 0xc1, 0xd8, 0x33, 0x29, 0x87, 0x05, 0xc4, 0xc3, 0xb3, 0xdc, 0x2e, - 0x7e, 0x44, 0x7f, 0x13, 0xaf, 0x6f, 0xe5, 0x15, 0x33, 0xfd, 0xec, 0x63, 0x67, 0x60, 0xd4, 0x0f, - 0x76, 0xb5, 0xa6, 0x8d, 0xf8, 0xc1, 0xae, 0x68, 0xd7, 0x45, 0x28, 0x49, 0xff, 0x19, 0x19, 0x98, - 0x20, 0xdc, 0x6f, 0xcb, 0xcb, 0x71, 0xd1, 0x9e, 0x92, 0x70, 0x4c, 0x61, 0xbf, 0xdf, 0xae, 0x0b, - 0xcc, 0x30, 0xf4, 0x1d, 0x3d, 0xe4, 0x14, 0x35, 0x7b, 0x2a, 0x0c, 0xfd, 0x24, 0xf6, 0x54, 0x83, - 0x2d, 0xc1, 0xa4, 0xe0, 0x13, 0x07, 0xbe, 0xa2, 0xa3, 0xf9, 0x5c, 0xef, 0xd1, 0xbc, 0xdf, 0xae, - 0xab, 0x4f, 0xb4, 0x27, 0x42, 0xed, 0x17, 0xbb, 0x03, 0x25, 0x4d, 0x86, 0x41, 0x0f, 0xc9, 0x94, - 0x95, 0x73, 0xc2, 0x46, 0x93, 0x7d, 0xaa, 0xed, 0x1d, 0xdf, 0x9e, 0xae, 0x9b, 0x00, 0xea, 0x9a, - 0x7f, 0x37, 0xa7, 0xf6, 0xd2, 0x0c, 0x22, 0x66, 0xc1, 0xe4, 0x9e, 0x1b, 0x3a, 0x61, 0xd8, 0x92, - 0x56, 0x5b, 0x14, 0x6a, 0x77, 0x7c, 0xcf, 0x0d, 0x6b, 0x61, 0x4b, 0xa5, 0xf2, 0x38, 0x25, 0x70, - 0x7c, 0xb7, 0x1b, 0xed, 0x39, 0xba, 0x44, 0x26, 0x7b, 0x6c, 0x76, 0xcf, 0x0d, 0x37, 0x44, 0x99, - 0xc6, 0x9b, 0xbd, 0x02, 0x53, 0xc8, 0xb7, 0xee, 0x29, 0xc6, 0x18, 0x5c, 0xc2, 0x9e, 0x10, 0x8c, - 0xeb, 0x9e, 0xe4, 0x4c, 0x5f, 0xf8, 0x7f, 0xe4, 0xe1, 0x74, 0x76, 0xef, 0xe0, 0xf4, 0x14, 0x7d, - 0x8a, 0x5e, 0x73, 0xf4, 0x6d, 0x63, 0x02, 0x22, 0x03, 0x83, 0x64, 0x0d, 0x4e, 0x3e, 0x73, 0x70, - 0x5e, 0x87, 0x19, 0x64, 0x44, 0xb2, 0x5f, 0xd3, 0x0b, 0x23, 0x8a, 0x77, 0x61, 0x4f, 0x8b, 0x02, - 0xb9, 0x9f, 0xaf, 0x09, 0x30, 0x7b, 0x15, 0xa6, 0xd4, 0x8e, 0xec, 0x3f, 0x6e, 0x8b, 0x8a, 0xe5, - 0x76, 0x3c, 0x49, 0xd0, 0x0d, 0x04, 0xb2, 0x53, 0x30, 0xe2, 0x76, 0x3a, 0xa2, 0x4a, 0xb9, 0x0b, - 0x0f, 0xbb, 0x9d, 0x8e, 0x4c, 0x37, 0x83, 0x3e, 0x82, 0xce, 0x0e, 0xda, 0xed, 0x90, 0x91, 0xa0, - 0x3d, 0x81, 0x40, 0x69, 0xcb, 0x13, 0x8a, 0x75, 0x2f, 0x68, 0x15, 0xca, 0x28, 0xa2, 0x80, 0xdb, - 0x89, 0x11, 0xce, 0x42, 0x51, 0xbd, 0x20, 0x4b, 0x57, 0x07, 0x7b, 0xd4, 0xa5, 0xd7, 0xe3, 0xb7, - 0xe0, 0x4c, 0xc3, 0x0b, 0x71, 0xf2, 0xca, 0x26, 0x75, 0x3a, 0xe4, 0x95, 0x28, 0xc3, 0xd6, 0xda, - 0x73, 0x54, 0x2c, 0x7a, 0xb2, 0xd2, 0xe9, 0x48, 0xdf, 0x44, 0xea, 0xeb, 0xcf, 0xc1, 0x34, 0xc9, - 0x40, 0x74, 0x44, 0xe2, 0xb7, 0xd0, 0x02, 0x16, 0x97, 0x13, 0x4a, 0xf0, 0x03, 0x04, 0xaa, 0x36, - 0x14, 0xe5, 0xef, 0xe7, 0xe0, 0x54, 0xa6, 0x10, 0xc5, 0xbe, 0x0e, 0xd2, 0x09, 0x2b, 0xf2, 0x9d, - 0x80, 0xd7, 0xbd, 0x8e, 0x87, 0x61, 0x2a, 0xa4, 0x92, 0x71, 0xf1, 0x28, 0xf1, 0x0b, 0x1d, 0xba, - 0xb6, 0x7c, 0x3b, 0x26, 0x92, 0xda, 0x8f, 0x52, 0x90, 0x02, 0x2f, 0x7c, 0x19, 0x4e, 0x65, 0xa2, - 0x66, 0x68, 0x25, 0xde, 0x30, 0xd3, 0x2b, 0xab, 0x67, 0xa3, 0x54, 0xa3, 0x35, 0x6d, 0x05, 0x35, - 0xef, 0xd7, 0xe3, 0xe6, 0xa5, 0xc4, 0x2d, 0xb6, 0x9a, 0x5e, 0xd7, 0x59, 0x37, 0x06, 0x45, 0xd4, - 0x7f, 0x69, 0x7f, 0x19, 0x4e, 0xd1, 0xe4, 0xdb, 0x0d, 0xdc, 0xce, 0x5e, 0xc2, 0x4e, 0x7e, 0xe8, - 0x6b, 0x59, 0xec, 0xe4, 0xac, 0xbc, 0x29, 0xf0, 0x63, 0xae, 0xb3, 0x6e, 0x2f, 0x90, 0xda, 0x10, - 0xa8, 0x95, 0x9e, 0xf1, 0x35, 0x19, 0xb3, 0x3a, 0x97, 0x35, 0xab, 0x07, 0x5e, 0x52, 0x54, 0xe7, - 0x0f, 0xe6, 0xe0, 0xfc, 0x71, 0xdf, 0xcc, 0x1e, 0xc0, 0x69, 0x34, 0x6c, 0x08, 0xfd, 0xb8, 0xd9, - 0x4e, 0xdd, 0xad, 0xef, 0x71, 0x9a, 0x25, 0x56, 0x66, 0xe3, 0x3b, 0x9d, 0x5a, 0x6d, 0x43, 0x6b, - 0x77, 0xa7, 0x53, 0x0b, 0x7d, 0xf5, 0x7b, 0x59, 0x90, 0xd3, 0x37, 0x34, 0xe0, 0xf9, 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, 0x66, 0x70, 0x4a, 0x0b, - 0x55, 0x91, 0x17, 0xea, 0x4d, 0x50, 0x8f, 0xbc, 0x36, 0x95, 0x41, 0xbd, 0x36, 0x56, 0xed, 0xfd, - 0x3b, 0x2c, 0x46, 0xb9, 0xb5, 0xea, 0xa7, 0xdb, 0xa3, 0xfe, 0xfe, 0x1d, 0xfe, 0x95, 0x53, 0x71, - 0xc4, 0xc8, 0x82, 0x35, 0x79, 0x11, 0xce, 0x45, 0x20, 0x37, 0x02, 0x1f, 0x6e, 0x6b, 0x9d, 0x66, - 0x85, 0x01, 0x9a, 0xae, 0xc2, 0xb2, 0x18, 0x86, 0xa1, 0xef, 0x09, 0x66, 0xe5, 0x78, 0x1a, 0x9d, - 0xe5, 0xfc, 0x73, 0x13, 0xd1, 0xa8, 0x44, 0x99, 0xfc, 0x0c, 0xb2, 0x2b, 0x79, 0x01, 0x88, 0x2f, - 0x27, 0xfb, 0x0b, 0x93, 0x7f, 0x70, 0x5d, 0xe4, 0xf8, 0x2b, 0x8a, 0x7f, 0xf6, 0xef, 0x52, 0x70, - 0x2e, 0x41, 0x98, 0xa7, 0x42, 0x77, 0xa7, 0x37, 0xf6, 0x8e, 0x99, 0xc8, 0x2e, 0x37, 0x72, 0x4d, - 0x4a, 0xe7, 0x1a, 0x9a, 0x05, 0x16, 0x83, 0x9b, 0x7f, 0x8b, 0xff, 0xa2, 0x8b, 0xd5, 0x1d, 0x0a, - 0xe5, 0x03, 0xfd, 0x97, 0x98, 0xb0, 0x8e, 0x81, 0x05, 0x46, 0x9d, 0x3e, 0xc6, 0x27, 0xc0, 0x43, - 0x3f, 0x13, 0xba, 0x02, 0x61, 0x2d, 0x1a, 0x12, 0x11, 0x3d, 0xf5, 0x2d, 0x75, 0x10, 0x49, 0x21, - 0x5f, 0x86, 0x4d, 0x69, 0x6f, 0x77, 0x22, 0x53, 0x1d, 0x6d, 0xbd, 0xad, 0x8b, 0xae, 0xbf, 0xcb, - 0x17, 0x43, 0x93, 0x7e, 0x07, 0xb6, 0x71, 0x10, 0x3b, 0xed, 0x81, 0x13, 0x8b, 0x44, 0x81, 0x4d, - 0x65, 0xd0, 0xed, 0x9b, 0x94, 0xca, 0x6c, 0x0f, 0x22, 0x41, 0x29, 0x68, 0xab, 0x79, 0xf7, 0xbd, - 0x03, 0x4f, 0x25, 0xd6, 0x98, 0x6e, 0xe8, 0x68, 0x4a, 0x14, 0xc8, 0x22, 0x8b, 0xf4, 0x37, 0x15, - 0x46, 0xae, 0xc2, 0xf2, 0xbb, 0x9e, 0x3b, 0xf4, 0x86, 0xfc, 0xa4, 0xe4, 0x53, 0x82, 0xa5, 0xc9, - 0x07, 0xe5, 0x5f, 0xa6, 0xc4, 0x35, 0x64, 0xa7, 0xdf, 0x1f, 0x8f, 0xc6, 0x43, 0x77, 0x10, 0x52, - 0x80, 0x90, 0x53, 0x78, 0x1a, 0x4f, 0xe9, 0x3b, 0x08, 0x5c, 0xdf, 0x1f, 0x0a, 0x4f, 0xfd, 0x43, - 0x61, 0xfd, 0x9a, 0xbb, 0xf3, 0x52, 0x58, 0x8e, 0xd0, 0x29, 0xb5, 0x2e, 0x13, 0x53, 0xa9, 0x59, - 0x2a, 0xb5, 0x3c, 0x67, 0x5d, 0x64, 0x65, 0xc6, 0xa8, 0x48, 0x39, 0xa1, 0xe2, 0x51, 0x0d, 0xc8, - 0x4e, 0xd0, 0x8a, 0x70, 0xa9, 0x72, 0xfb, 0xc8, 0x57, 0x60, 0xa9, 0xd3, 0x96, 0xe3, 0xb3, 0x45, - 0xef, 0xde, 0x66, 0x9b, 0x61, 0xc4, 0x06, 0x65, 0x94, 0xe7, 0xac, 0x6c, 0x87, 0xa7, 0xee, 0xac, - 0x84, 0x54, 0x45, 0xda, 0x8e, 0x90, 0x78, 0xe3, 0x6c, 0x64, 0x15, 0x52, 0xfe, 0x4e, 0x90, 0xea, - 0xb4, 0xe9, 0x6c, 0x1d, 0x49, 0x28, 0xb5, 0x16, 0xff, 0xa5, 0xfd, 0x1a, 0xdc, 0x3c, 0x6b, 0x1f, - 0xd1, 0x95, 0x36, 0xa5, 0xc3, 0x97, 0xac, 0x75, 0x37, 0xd6, 0x6f, 0x57, 0x41, 0x06, 0xd9, 0xec, - 0x88, 0x01, 0x17, 0x69, 0xad, 0x61, 0x47, 0xfb, 0xad, 0x34, 0xac, 0x86, 0x95, 0x63, 0xe4, 0x79, - 0xc8, 0xf8, 0xc5, 0xae, 0xfa, 0x8f, 0x38, 0x32, 0x11, 0x2d, 0xdc, 0x42, 0x22, 0x2a, 0x85, 0xe0, - 0x9b, 0xaf, 0x73, 0x2a, 0xbf, 0xb3, 0x58, 0xcb, 0x98, 0x28, 0xde, 0x57, 0xee, 0xc1, 0x2a, 0x9a, - 0xeb, 0xe0, 0xf1, 0x36, 0xee, 0x70, 0x95, 0xeb, 0x6c, 0xad, 0x79, 0xf6, 0xa3, 0x8f, 0xaf, 0xcc, - 0xa1, 0x82, 0x7c, 0x99, 0xf2, 0xd2, 0x23, 0x86, 0x66, 0x4a, 0xba, 0x8f, 0xcc, 0x74, 0xdd, 0x07, - 0x6f, 0xca, 0x14, 0xdd, 0xc7, 0xfc, 0x0c, 0xdd, 0x47, 0xc0, 0x29, 0xeb, 0x3e, 0x50, 0x03, 0xb6, - 0x38, 0x4d, 0x03, 0x16, 0xf0, 0x30, 0x0d, 0xd8, 0x35, 0xde, 0xdc, 0xa1, 0xfb, 0xc0, 0xc1, 0x7e, - 0xe0, 0xab, 0x1a, 0x1b, 0x62, 0xb9, 0x0f, 0xf0, 0x75, 0x7c, 0x67, 0x09, 0xc4, 0x93, 0xba, 0xf6, - 0x47, 0x4a, 0x44, 0x71, 0x20, 0x86, 0xe2, 0x3a, 0xac, 0x76, 0x4e, 0xe9, 0x8d, 0xc6, 0x6b, 0x4b, - 0xa2, 0xe9, 0x8a, 0xb5, 0x22, 0x52, 0x99, 0x78, 0xfa, 0x1c, 0xac, 0xf9, 0x64, 0x5c, 0x42, 0x43, - 0x57, 0x1b, 0xcb, 0xe7, 0xe6, 0xb8, 0x11, 0xcf, 0xc3, 0xba, 0x4f, 0xc8, 0x2f, 0x7f, 0x4c, 0x3a, - 0x5d, 0xb1, 0x54, 0x91, 0xc1, 0xe3, 0xfd, 0x8f, 0xb4, 0xe3, 0xa8, 0xa0, 0xf2, 0x39, 0xd5, 0x4a, - 0xfb, 0xfb, 0x74, 0xe8, 0x52, 0x25, 0x3e, 0xb3, 0x03, 0x39, 0x7a, 0x5a, 0xf2, 0x4e, 0xe2, 0xdb, - 0xca, 0xd5, 0x29, 0xdd, 0xcf, 0x8d, 0x12, 0x6c, 0xbb, 0x6e, 0xc1, 0x68, 0xd4, 0x17, 0x36, 0x0a, - 0x0e, 0x13, 0x08, 0x98, 0xa0, 0x8c, 0xd3, 0x4f, 0x14, 0xc7, 0xf6, 0x90, 0xfc, 0xec, 0xe2, 0x84, - 0x54, 0x4b, 0x67, 0x1f, 0x0a, 0x06, 0xfe, 0x2f, 0xf1, 0x81, 0x16, 0xa0, 0x0e, 0x62, 0x14, 0x2e, - 0x3c, 0x9d, 0x20, 0x6a, 0xc5, 0x0a, 0xc7, 0x5e, 0xc2, 0x92, 0xd5, 0x89, 0xf8, 0x57, 0x14, 0x6b, - 0xc0, 0x32, 0x5e, 0x69, 0x44, 0x81, 0x99, 0x04, 0x1d, 0x5a, 0xbc, 0xf1, 0x05, 0xb3, 0x6a, 0xe5, - 0x28, 0x9f, 0x28, 0xe6, 0x04, 0x9e, 0x96, 0x2f, 0x22, 0xe1, 0x4a, 0xce, 0x0b, 0x18, 0xcc, 0x99, - 0x3d, 0x10, 0xdc, 0x57, 0xb0, 0xaa, 0x17, 0xdc, 0x70, 0x02, 0x27, 0xd3, 0x4e, 0x60, 0x73, 0xfa, - 0x90, 0xcc, 0x08, 0xb1, 0x12, 0xc8, 0x4c, 0x29, 0x59, 0x66, 0x92, 0xaf, 0x25, 0xe9, 0xd0, 0xb5, - 0x44, 0xfb, 0x8b, 0x34, 0x3c, 0x7b, 0x86, 0xe1, 0x9a, 0xf1, 0xcd, 0xaf, 0x42, 0x8e, 0x69, 0xfe, - 0xd9, 0xf6, 0xc9, 0xac, 0x66, 0xfc, 0x40, 0xa9, 0xef, 0x8d, 0x5d, 0xbe, 0xd7, 0x51, 0xa9, 0x36, - 0xd8, 0xef, 0x60, 0xe4, 0xff, 0x4f, 0x7e, 0x05, 0xd6, 0xd8, 0x86, 0xc6, 0xec, 0x8a, 0x8e, 0x26, - 0xdd, 0x33, 0xec, 0x68, 0x5b, 0xc2, 0x09, 0x22, 0xc2, 0x8a, 0x9b, 0x1c, 0xee, 0x18, 0xb6, 0x9f, - 0x46, 0x9a, 0x90, 0x43, 0xb2, 0x23, 0xb7, 0xd3, 0x3d, 0x93, 0x35, 0xbe, 0x70, 0xb1, 0x90, 0xd9, - 0x98, 0x39, 0x24, 0x4d, 0x28, 0xe1, 0x6f, 0x72, 0x03, 0xd6, 0x7a, 0x93, 0x53, 0x7a, 0x93, 0x63, - 0x73, 0x81, 0x3f, 0xdf, 0xce, 0x5b, 0x2b, 0xbd, 0xc9, 0xa9, 0x3e, 0x18, 0xe0, 0x90, 0xe2, 0x3b, - 0xef, 0x3a, 0xa5, 0x63, 0xab, 0x56, 0x50, 0x2e, 0x20, 0x25, 0x2d, 0x80, 0xad, 0x5b, 0x4e, 0x7b, - 0x1e, 0x98, 0xd5, 0x0f, 0x0f, 0x31, 0xc3, 0x7e, 0x68, 0x3f, 0x4d, 0x09, 0x71, 0x7d, 0xfa, 0xbc, - 0xff, 0xc5, 0x10, 0x25, 0x0c, 0xd1, 0x4d, 0x50, 0x69, 0xd7, 0x07, 0x9b, 0x8a, 0x3f, 0x46, 0xab, - 0xbd, 0xc9, 0xa9, 0xdf, 0x77, 0x72, 0xc7, 0x2f, 0xc8, 0x1d, 0xff, 0xaa, 0x10, 0xe7, 0x13, 0xb7, - 0x87, 0xe9, 0x5d, 0xae, 0xfd, 0x67, 0x1a, 0x6e, 0x9c, 0x6d, 0x13, 0xf8, 0xc5, 0xb8, 0x25, 0x8c, - 0x5b, 0x44, 0xd3, 0x32, 0x1f, 0xd3, 0xb4, 0x24, 0xac, 0xbd, 0x85, 0xa4, 0xb5, 0x17, 0xd3, 0xeb, - 0x2c, 0x26, 0xe8, 0x75, 0x12, 0x17, 0x68, 0xf6, 0x11, 0x0b, 0x74, 0x49, 0x9e, 0x27, 0xff, 0xe6, - 0xdf, 0xbf, 0xc2, 0xa2, 0xfd, 0x3b, 0x70, 0x4e, 0x88, 0xf6, 0xec, 0xe4, 0x08, 0xd4, 0x75, 0xb9, - 0x3b, 0xb7, 0x92, 0x84, 0x7a, 0x24, 0x4b, 0x10, 0xbc, 0xd7, 0xb9, 0x38, 0x1f, 0xe4, 0xff, 0xff, - 0x11, 0xe4, 0xc9, 0x7d, 0xb8, 0x80, 0x00, 0xcd, 0x87, 0xb2, 0xa2, 0xd1, 0x19, 0x7a, 0x47, 0x7c, - 0x3e, 0x5c, 0x8d, 0x89, 0xbd, 0x9d, 0x43, 0xa9, 0x3a, 0x96, 0x77, 0x54, 0x9e, 0xb3, 0xce, 0x8f, - 0x12, 0xd2, 0xa3, 0x77, 0x84, 0xbf, 0x56, 0x40, 0x7b, 0x74, 0x7f, 0xe1, 0x3d, 0x3b, 0xda, 0xe1, - 0xf4, 0x9e, 0x2d, 0xf5, 0xde, 0xb3, 0xb0, 0x32, 0xf4, 0x8e, 0x86, 0xde, 0xe8, 0x24, 0x74, 0x81, - 0x5b, 0xe6, 0x89, 0xa2, 0x63, 0x04, 0x4c, 0xdc, 0x63, 0x09, 0xd9, 0x82, 0x49, 0x2b, 0xf9, 0x57, - 0xbf, 0xc4, 0x71, 0xa0, 0xb3, 0x49, 0xae, 0x20, 0xfb, 0x71, 0x2f, 0x93, 0x4d, 0xa9, 0x69, 0x8b, - 0x83, 0xd9, 0x1d, 0x75, 0xba, 0x9e, 0xf6, 0x37, 0x8a, 0x90, 0x08, 0x92, 0x3a, 0x8f, 0xbc, 0x23, - 0x59, 0xe3, 0xa5, 0x63, 0x62, 0x48, 0x12, 0x8b, 0x6c, 0xb8, 0xc4, 0xf1, 0xd5, 0x30, 0x21, 0x84, - 0xaf, 0x86, 0x29, 0x4f, 0x60, 0x52, 0xc4, 0x2f, 0xc0, 0x77, 0xc5, 0x93, 0x3e, 0xdd, 0xf3, 0xf6, - 0x6f, 0x93, 0x5b, 0xb0, 0xc8, 0x5e, 0xf1, 0x45, 0x75, 0xd7, 0x42, 0xd5, 0xdd, 0xbf, 0x6d, 0x89, - 0x7c, 0xed, 0x87, 0xbe, 0x1a, 0x3c, 0xd6, 0x88, 0xfd, 0xdb, 0xe4, 0xd5, 0xb3, 0x59, 0xd7, 0x65, - 0x85, 0x75, 0x9d, 0x6f, 0x59, 0xf7, 0x5a, 0xc8, 0xb2, 0xee, 0xda, 0xec, 0xde, 0xe2, 0x8f, 0x17, - 0x0c, 0x4f, 0x2c, 0xc0, 0x99, 0xf9, 0xa9, 0x02, 0x97, 0x67, 0x72, 0x90, 0x4b, 0x90, 0xd5, 0x1b, - 0x66, 0x33, 0x18, 0x5f, 0xba, 0x66, 0x44, 0x0a, 0xd9, 0x85, 0xa5, 0x1d, 0x77, 0xd4, 0x39, 0xa4, - 0xd3, 0x38, 0x51, 0x9b, 0x18, 0x2b, 0xd6, 0x27, 0x2f, 0xcf, 0x59, 0x01, 0x2f, 0x71, 0x60, 0x1d, - 0xd7, 0x42, 0x28, 0x76, 0x4b, 0x3a, 0x41, 0x6d, 0x10, 0x2b, 0x30, 0xc6, 0x46, 0xf7, 0x99, 0x58, - 0x62, 0x74, 0x09, 0xbe, 0x2f, 0x64, 0x91, 0xe9, 0x15, 0x7c, 0x0c, 0x60, 0xc4, 0x9b, 0x90, 0x6d, - 0x88, 0x67, 0x45, 0xc9, 0x1c, 0x55, 0x3c, 0x21, 0x5a, 0x7e, 0xae, 0xf6, 0x7b, 0x8a, 0xb8, 0xdb, - 0x3f, 0xba, 0x21, 0x52, 0xd8, 0x9b, 0xf6, 0xec, 0xb0, 0x37, 0xed, 0x4f, 0x19, 0xf6, 0x46, 0xfb, - 0x2b, 0x0e, 0x5b, 0x6c, 0xb6, 0x1b, 0x11, 0xc5, 0xd2, 0x93, 0x9a, 0x15, 0x1b, 0xa1, 0xd9, 0xf9, - 0xac, 0x14, 0x36, 0x2d, 0xfe, 0xad, 0xe9, 0xd6, 0xc5, 0xd2, 0x54, 0xfd, 0x93, 0x34, 0x5c, 0x9a, - 0xc5, 0x9e, 0x18, 0x98, 0x55, 0x79, 0xbc, 0xc0, 0xac, 0xb7, 0x20, 0xcb, 0xd2, 0x7c, 0x9b, 0x59, - 0xec, 0x70, 0xce, 0x4a, 0x3b, 0x5c, 0x64, 0x93, 0x67, 0x61, 0x41, 0x2f, 0xd8, 0x41, 0xac, 0x20, - 0x34, 0x6e, 0x73, 0x0f, 0x47, 0x68, 0x36, 0xc5, 0xb3, 0xc8, 0x37, 0xe3, 0xe1, 0xb1, 0x78, 0x90, - 0xa0, 0x2d, 0xa9, 0x43, 0x62, 0x88, 0xe2, 0x58, 0xdf, 0x00, 0x01, 0x9b, 0x83, 0xca, 0x5a, 0xf1, - 0x50, 0x5b, 0x1a, 0x2c, 0x34, 0x86, 0xde, 0xc8, 0x1b, 0xcb, 0x86, 0x67, 0x03, 0x4c, 0xb1, 0x78, - 0x0e, 0x37, 0x0b, 0x73, 0x1f, 0x32, 0x2f, 0xe0, 0x05, 0x19, 0x99, 0x01, 0xed, 0xc8, 0x68, 0xb2, - 0x25, 0x91, 0x50, 0x86, 0x8a, 0x3b, 0xe9, 0x1d, 0x9e, 0xb4, 0xac, 0x0a, 0x17, 0x35, 0x18, 0x43, - 0x17, 0x53, 0x69, 0x03, 0x47, 0x96, 0x44, 0xa2, 0x7d, 0x57, 0x81, 0xf3, 0x49, 0xed, 0x20, 0x97, - 0x20, 0xd3, 0x4b, 0x8c, 0x04, 0xd6, 0x63, 0xce, 0x8b, 0x39, 0xfa, 0xd7, 0x39, 0xea, 0x0f, 0x4f, - 0xdd, 0xb1, 0x6c, 0x9e, 0x27, 0x25, 0x5b, 0x40, 0x7f, 0x94, 0xf0, 0x7f, 0x72, 0x45, 0xec, 0xd1, - 0xe9, 0x58, 0xec, 0x30, 0xfc, 0xa3, 0xe9, 0x00, 0x66, 0xbb, 0x51, 0x1f, 0x30, 0x44, 0xeb, 0x97, - 0x21, 0x43, 0xab, 0x15, 0x99, 0xbd, 0x74, 0xfe, 0xe8, 0xd5, 0x0a, 0x27, 0x62, 0xb5, 0x1a, 0xb9, - 0xa7, 0x5d, 0x0b, 0x89, 0xb5, 0x03, 0x58, 0x0d, 0x53, 0x10, 0x23, 0x8c, 0x81, 0x98, 0xbb, 0xa3, - 0xf2, 0x92, 0x76, 0xfa, 0x7d, 0x66, 0x22, 0xbe, 0xf3, 0xf4, 0x3f, 0x7e, 0x7c, 0x05, 0xe8, 0x4f, - 0xc6, 0x93, 0x84, 0x91, 0xa8, 0x7d, 0x3f, 0x05, 0xe7, 0x03, 0xaf, 0x54, 0xb1, 0x86, 0x7e, 0x6e, - 0x5d, 0xa4, 0xf4, 0x90, 0x0b, 0x8f, 0x10, 0xb4, 0xe2, 0x0d, 0x9c, 0xe1, 0x39, 0xb0, 0x0b, 0x1b, - 0xd3, 0xe8, 0xc9, 0xf3, 0xb0, 0x84, 0x40, 0x26, 0x03, 0xf7, 0xd0, 0x93, 0xf7, 0xbe, 0x9e, 0x48, - 0xb4, 0x82, 0x7c, 0xed, 0xc7, 0x0a, 0x6c, 0x72, 0xc3, 0xe6, 0xaa, 0xdb, 0xe9, 0x8d, 0xbd, 0x9e, - 0xdb, 0x3b, 0xf4, 0x3e, 0x1b, 0x17, 0xbf, 0xdd, 0xd0, 0x3e, 0x76, 0x3d, 0x6c, 0xbf, 0x1e, 0xfb, - 0xda, 0xf4, 0xd6, 0x92, 0x5b, 0x08, 0xce, 0x73, 0xc8, 0x26, 0x6f, 0x86, 0xb9, 0x54, 0xf7, 0x68, - 0x82, 0xec, 0x52, 0x8d, 0x14, 0xda, 0xaf, 0xc3, 0xf6, 0xec, 0x0f, 0x90, 0x6f, 0xc0, 0x0a, 0x46, - 0x7b, 0x69, 0x0d, 0x8e, 0x87, 0x6e, 0xdb, 0x13, 0xaa, 0x30, 0xa1, 0x89, 0x94, 0xf3, 0x18, 0xd6, - 0x10, 0x77, 0xf1, 0x3d, 0xc6, 0x38, 0x32, 0x9c, 0x29, 0xe4, 0x3d, 0x20, 0x97, 0xa6, 0xfd, 0x86, - 0x02, 0x24, 0x5e, 0x06, 0xf9, 0x12, 0x2c, 0xb7, 0x9a, 0x05, 0x7b, 0xec, 0x0e, 0xc7, 0xe5, 0xfe, - 0x64, 0xc8, 0x81, 0x7e, 0x98, 0xc7, 0xe7, 0xf8, 0x90, 0x6e, 0x25, 0xc3, 0xb1, 0x73, 0xd2, 0x9f, - 0x0c, 0xad, 0x10, 0x1d, 0x86, 0x29, 0xf1, 0xbc, 0xf7, 0xda, 0xee, 0xc3, 0x70, 0x98, 0x12, 0x9e, - 0x16, 0x0a, 0x53, 0xc2, 0xd3, 0xb4, 0x0f, 0x15, 0xd8, 0x12, 0xc6, 0x47, 0xed, 0x84, 0xba, 0x14, - 0x10, 0xd7, 0x60, 0x28, 0x90, 0x25, 0x67, 0x89, 0xb4, 0xeb, 0x02, 0xfa, 0x03, 0x2b, 0x88, 0xb2, - 0x2d, 0xe3, 0x25, 0x5f, 0x85, 0x8c, 0x3d, 0xee, 0x0f, 0xce, 0x80, 0xfd, 0xa1, 0xfa, 0x23, 0x3a, - 0xee, 0x0f, 0xb0, 0x08, 0xe4, 0xd4, 0x3c, 0x38, 0x2f, 0x57, 0x4e, 0xd4, 0x98, 0x54, 0x61, 0x91, - 0x83, 0x3c, 0x45, 0xde, 0x19, 0x67, 0xb4, 0x69, 0x67, 0x4d, 0x00, 0x8c, 0x70, 0x64, 0x43, 0x4b, - 0x94, 0xa1, 0xfd, 0xbe, 0x02, 0x39, 0x2a, 0x6d, 0xe0, 0x2d, 0xee, 0x49, 0xa7, 0x74, 0x58, 0x70, - 0x14, 0xcf, 0xd4, 0x7e, 0xf1, 0x67, 0x3a, 0x8d, 0x5f, 0x81, 0xb5, 0x08, 0x03, 0xd1, 0xd0, 0xb5, - 0xbc, 0xdb, 0x39, 0x74, 0x59, 0xd4, 0x03, 0xf6, 0xc6, 0x1b, 0x4a, 0xd3, 0x7e, 0x47, 0x81, 0xf3, - 0xf4, 0xce, 0x6f, 0xa2, 0xba, 0xd7, 0x9a, 0x74, 0xc5, 0x7a, 0xa7, 0x12, 0x94, 0xb0, 0x62, 0x63, - 0x6e, 0xaf, 0x4c, 0x82, 0xe2, 0x69, 0x96, 0x9f, 0x4b, 0xca, 0x90, 0xe5, 0xe7, 0xcb, 0x88, 0x03, - 0x12, 0x6e, 0x4b, 0xca, 0x84, 0xa0, 0x60, 0x4e, 0x44, 0x5b, 0x82, 0x5b, 0x18, 0xe7, 0xb1, 0x7c, - 0x6e, 0xed, 0xbf, 0x14, 0xb8, 0x38, 0x85, 0x87, 0xbc, 0x01, 0xf3, 0xe8, 0x92, 0xc3, 0x47, 0xef, - 0xd2, 0x94, 0x4f, 0x8c, 0x0f, 0x4f, 0xf6, 0x6f, 0xb3, 0x83, 0xe8, 0x94, 0xfe, 0xb0, 0x18, 0x17, - 0x79, 0x07, 0x96, 0xf4, 0x76, 0x9b, 0x5f, 0x67, 0x52, 0xa1, 0xeb, 0xcc, 0x94, 0x2f, 0xbe, 0xe8, - 0xd3, 0xb3, 0xeb, 0x0c, 0x33, 0x0e, 0x6f, 0xb7, 0x1d, 0xee, 0x6e, 0x14, 0x94, 0xb7, 0xf9, 0xcb, - 0xb0, 0x1a, 0x26, 0x7e, 0x2c, 0x0f, 0x89, 0x1f, 0x2a, 0xa0, 0x86, 0xeb, 0xf0, 0xf9, 0x40, 0xa3, - 0x24, 0x0d, 0xf3, 0x23, 0x26, 0xd5, 0x1f, 0xa6, 0xe0, 0xa9, 0xc4, 0x1e, 0x26, 0x2f, 0xc0, 0x82, - 0x3e, 0x18, 0x98, 0x45, 0x3e, 0xab, 0xb8, 0x84, 0x84, 0x5a, 0xe2, 0xd0, 0x6d, 0x8f, 0x11, 0x91, - 0x97, 0x21, 0x8b, 0x33, 0x93, 0x32, 0xa4, 0x02, 0x68, 0x40, 0xa6, 0x44, 0x89, 0x40, 0x03, 0x0a, - 0x42, 0x52, 0x82, 0x55, 0x8e, 0x92, 0x60, 0x79, 0xc7, 0xde, 0xb7, 0x7d, 0x8c, 0x6a, 0x84, 0xd1, - 0x16, 0xaa, 0x67, 0x67, 0xc8, 0xf2, 0x64, 0x9c, 0x80, 0x30, 0x17, 0xa9, 0x80, 0x8a, 0x65, 0xca, - 0x25, 0x31, 0x7c, 0x42, 0xc4, 0xad, 0x60, 0x95, 0x98, 0x52, 0x56, 0x8c, 0xd3, 0x1f, 0x2e, 0x7d, - 0x34, 0xea, 0x1c, 0xf7, 0x4e, 0xbd, 0xde, 0xf8, 0xf3, 0x1b, 0xae, 0xe0, 0x1b, 0x67, 0x1a, 0xae, - 0x3f, 0xce, 0xb0, 0xc5, 0x1c, 0x65, 0xa3, 0x12, 0x8d, 0x04, 0x49, 0x8b, 0x12, 0x0d, 0x06, 0xf1, - 0x66, 0x38, 0x00, 0x45, 0x58, 0x64, 0xf8, 0x0c, 0x62, 0x65, 0x5c, 0x4e, 0xac, 0x02, 0xa3, 0xd9, - 0xbf, 0xcd, 0xc4, 0x17, 0xe6, 0x1b, 0x34, 0xb2, 0x04, 0x2b, 0xd9, 0x87, 0x5c, 0xa1, 0xeb, 0xb9, - 0xbd, 0xc9, 0xa0, 0x79, 0xb6, 0xd7, 0xc3, 0x0d, 0xde, 0x96, 0xe5, 0x43, 0xc6, 0x86, 0xaf, 0x8e, - 0xb8, 0x93, 0xcb, 0x05, 0x91, 0xa6, 0xef, 0x2e, 0xc0, 0x42, 0xaf, 0x7f, 0x71, 0x46, 0xff, 0x44, - 0x13, 0x91, 0x2f, 0xec, 0x0b, 0xc3, 0xfd, 0x09, 0x1c, 0x58, 0xad, 0xb8, 0xa3, 0x71, 0x73, 0xe8, - 0xf6, 0x46, 0x88, 0xeb, 0x76, 0x06, 0xdc, 0x9b, 0x2d, 0x11, 0x33, 0x14, 0x75, 0x8c, 0x63, 0x9f, - 0x95, 0x69, 0x30, 0xc3, 0xc5, 0x51, 0x79, 0xa9, 0xd4, 0xe9, 0xb9, 0xdd, 0xce, 0x07, 0xc2, 0xab, - 0x8a, 0xc9, 0x4b, 0x47, 0x22, 0xd1, 0x0a, 0xf2, 0xb5, 0xaf, 0xc7, 0xc6, 0x8d, 0xd5, 0x32, 0x07, - 0x8b, 0xdc, 0xe7, 0x96, 0xf9, 0xa0, 0x36, 0x8c, 0x5a, 0xd1, 0xac, 0xed, 0xaa, 0x0a, 0x59, 0x05, - 0x68, 0x58, 0xf5, 0x82, 0x61, 0xdb, 0xf4, 0x77, 0x8a, 0xfe, 0xe6, 0x0e, 0xaa, 0xa5, 0x56, 0x45, - 0x4d, 0x4b, 0x3e, 0xaa, 0x19, 0xed, 0x47, 0x0a, 0x5c, 0x48, 0x1e, 0x4a, 0xd2, 0x04, 0xf4, 0x52, - 0xe6, 0xef, 0xc8, 0x5f, 0x9a, 0x39, 0xee, 0x89, 0xc9, 0x51, 0x6f, 0xe7, 0x31, 0xf3, 0xa2, 0x4d, - 0x89, 0xc7, 0xa2, 0x20, 0x50, 0x7d, 0xa7, 0xad, 0x15, 0x60, 0x63, 0x5a, 0x19, 0xe1, 0xa6, 0xae, - 0x41, 0x4e, 0x6f, 0x34, 0x2a, 0x66, 0x41, 0x6f, 0x9a, 0xf5, 0x9a, 0xaa, 0x90, 0x25, 0x98, 0xdf, - 0xb5, 0xea, 0xad, 0x86, 0x9a, 0xd2, 0x7e, 0xa0, 0xc0, 0x8a, 0x19, 0x58, 0x99, 0x3c, 0xe9, 0xe2, - 0x7b, 0x3d, 0xb4, 0xf8, 0x36, 0x7c, 0x7f, 0x7e, 0xff, 0x03, 0x67, 0x5a, 0x79, 0xff, 0xa0, 0xc0, - 0x7a, 0x8c, 0x87, 0xd8, 0xb0, 0xa8, 0x1f, 0xd8, 0x75, 0xb3, 0x58, 0xe0, 0x35, 0xbb, 0x12, 0x18, - 0xb2, 0x60, 0xc8, 0x96, 0xd8, 0x57, 0x98, 0x0f, 0xdc, 0x83, 0x91, 0xd3, 0xef, 0xb4, 0xa5, 0x70, - 0x8b, 0xe5, 0x39, 0x4b, 0x94, 0x84, 0x27, 0xd9, 0x07, 0x93, 0xa1, 0x87, 0xc5, 0xa6, 0x42, 0x8a, - 0x50, 0x3f, 0x3d, 0x5e, 0x30, 0xda, 0x47, 0xbb, 0x34, 0x3f, 0x5e, 0x74, 0x50, 0xde, 0xce, 0x0a, - 0xe4, 0xf8, 0xad, 0x05, 0x2f, 0x04, 0xdf, 0x53, 0x60, 0x63, 0x5a, 0x5d, 0xe9, 0x45, 0x28, 0xec, - 0x10, 0x7b, 0xc1, 0x87, 0x60, 0x0f, 0x7b, 0xc2, 0x0a, 0x32, 0xf2, 0x26, 0xe4, 0xcc, 0xd1, 0x68, - 0xe2, 0x0d, 0xed, 0x97, 0x5b, 0x96, 0xc9, 0x27, 0xc8, 0xe5, 0x7f, 0xff, 0xf8, 0xca, 0x45, 0xb4, - 0x62, 0x1e, 0x3a, 0xa3, 0x97, 0x9d, 0xc9, 0xb0, 0x13, 0x82, 0xab, 0x96, 0x39, 0xb4, 0xef, 0x28, - 0xb0, 0x39, 0xbd, 0x91, 0xf4, 0x94, 0x69, 0x52, 0xd9, 0x3c, 0xf0, 0x29, 0xc4, 0x53, 0x06, 0xe5, - 0xf5, 0x88, 0x53, 0xa1, 0x4f, 0x48, 0x99, 0xfc, 0x50, 0xc6, 0xa9, 0x58, 0xfc, 0xd2, 0x30, 0x93, - 0x20, 0xd4, 0xfe, 0x23, 0x05, 0x17, 0xe8, 0x04, 0xea, 0x7a, 0xa3, 0x91, 0x3e, 0x19, 0x9f, 0x78, - 0xbd, 0x31, 0x17, 0xa9, 0xc8, 0xab, 0xb0, 0x70, 0xf2, 0x78, 0xea, 0x43, 0x46, 0x4e, 0x08, 0xe0, - 0xa6, 0x2c, 0xec, 0xab, 0xe9, 0xff, 0xe4, 0x2a, 0xc8, 0x11, 0x63, 0xd3, 0x88, 0x59, 0x97, 0xda, - 0x50, 0xac, 0xa5, 0x81, 0x1f, 0xdc, 0xf1, 0x35, 0x98, 0x47, 0x95, 0x01, 0xdf, 0x1e, 0x85, 0x58, - 0x9b, 0x5c, 0x3b, 0x54, 0x28, 0x58, 0x8c, 0x81, 0xbc, 0x04, 0x10, 0xc0, 0x7d, 0xf3, 0xfd, 0x4f, - 0x5c, 0xa5, 0x7d, 0xc4, 0x6f, 0x6b, 0xe9, 0xf4, 0xc8, 0xe5, 0x18, 0xda, 0x79, 0x58, 0x17, 0xdd, - 0x32, 0x10, 0x50, 0x57, 0xfc, 0x65, 0x6b, 0x8d, 0x65, 0x98, 0x03, 0x01, 0x77, 0x75, 0x2d, 0x16, - 0xf5, 0x12, 0x11, 0x2f, 0x23, 0xa1, 0x2d, 0xaf, 0xc5, 0x42, 0x5b, 0x66, 0x19, 0x95, 0x1c, 0xbf, - 0x52, 0xfb, 0xd7, 0x14, 0x2c, 0x1d, 0x50, 0xc1, 0x03, 0xaf, 0xd3, 0xb3, 0xaf, 0xe7, 0x77, 0x20, - 0x57, 0xe9, 0xbb, 0xfc, 0x09, 0x81, 0x9b, 0x25, 0x33, 0x47, 0xbd, 0x6e, 0xdf, 0x15, 0xaf, 0x11, - 0x23, 0x4b, 0x26, 0x7a, 0x84, 0x93, 0xe1, 0x3d, 0x58, 0x60, 0x4f, 0x3a, 0x5c, 0x53, 0x24, 0x44, - 0x4f, 0xbf, 0x46, 0x2f, 0xb2, 0x6c, 0x49, 0xeb, 0xcd, 0x9e, 0x85, 0x64, 0x39, 0x88, 0x03, 0xf7, - 0x49, 0xca, 0x83, 0xf9, 0xb3, 0x29, 0x0f, 0x24, 0x80, 0xa2, 0x85, 0xb3, 0x00, 0x14, 0x6d, 0xde, - 0x85, 0x9c, 0x54, 0x9f, 0xc7, 0x92, 0x44, 0x7f, 0x33, 0x05, 0x2b, 0xd8, 0x2a, 0xdf, 0xbe, 0xe3, - 0xe7, 0x53, 0x15, 0xf2, 0x7a, 0x48, 0x15, 0xb2, 0x21, 0x8f, 0x17, 0x6b, 0xd9, 0x0c, 0x1d, 0xc8, - 0x3d, 0x58, 0x8f, 0x11, 0x92, 0x57, 0x60, 0x9e, 0x56, 0x5f, 0x5c, 0x1d, 0xd5, 0xe8, 0x0c, 0x08, - 0xc0, 0x2c, 0x69, 0xc3, 0x47, 0x16, 0xa3, 0xd6, 0xfe, 0x5b, 0x81, 0x65, 0x8e, 0x25, 0xdf, 0x3b, - 0xea, 0x3f, 0xb2, 0x3b, 0x6f, 0x44, 0xbb, 0x93, 0xb9, 0xcc, 0xf3, 0xee, 0xfc, 0xdf, 0xee, 0xc4, - 0xbb, 0xa1, 0x4e, 0xbc, 0xe8, 0x43, 0x5b, 0x89, 0xe6, 0xcc, 0xe8, 0xc3, 0xbf, 0x45, 0xb0, 0xc7, - 0x30, 0x21, 0xf9, 0x26, 0x2c, 0xd5, 0xbc, 0x07, 0xa1, 0x1b, 0xd8, 0x8d, 0x29, 0x85, 0xbe, 0xe8, - 0x13, 0xb2, 0x35, 0x85, 0x87, 0x57, 0xcf, 0x7b, 0xe0, 0xc4, 0x5e, 0x93, 0x82, 0x22, 0xe9, 0x25, - 0x2c, 0xcc, 0xf6, 0x38, 0x53, 0x9f, 0xfb, 0x48, 0x21, 0x0a, 0xc4, 0x77, 0xd3, 0x00, 0x81, 0x7b, - 0x09, 0x5d, 0x80, 0xa1, 0x87, 0x74, 0xa1, 0xbc, 0xc6, 0x24, 0x79, 0x8e, 0x8b, 0xf7, 0xf5, 0x1b, - 0x5c, 0xc9, 0x9a, 0x9a, 0x0e, 0x3d, 0x86, 0xea, 0xd6, 0x02, 0xf7, 0x67, 0x68, 0x7b, 0x5d, 0x97, - 0xed, 0xed, 0xe9, 0x9d, 0x6b, 0x88, 0x34, 0xe9, 0xa7, 0x4e, 0x09, 0x0a, 0x8a, 0x5e, 0x0f, 0x45, - 0x4a, 0x10, 0x73, 0xd9, 0xca, 0x3c, 0x9e, 0xcb, 0x56, 0x03, 0x96, 0x3a, 0xbd, 0xf7, 0xbd, 0xde, - 0xb8, 0x3f, 0x7c, 0x88, 0x9a, 0xe5, 0x40, 0x65, 0x45, 0xbb, 0xc0, 0x14, 0x79, 0x6c, 0x1c, 0xf0, - 0x60, 0xf4, 0xe9, 0xe5, 0x61, 0xf0, 0x13, 0x7d, 0x97, 0xb3, 0x79, 0x75, 0xe1, 0x5e, 0x26, 0xbb, - 0xa0, 0x2e, 0xde, 0xcb, 0x64, 0xb3, 0xea, 0xd2, 0xbd, 0x4c, 0x76, 0x49, 0x05, 0x4b, 0x7a, 0xab, - 0xf1, 0xdf, 0x62, 0xa4, 0xe7, 0x93, 0xf0, 0xd3, 0x88, 0xf6, 0xb3, 0x14, 0x90, 0x78, 0x35, 0xc8, - 0xeb, 0x90, 0x63, 0x1b, 0xac, 0x33, 0x1c, 0x7d, 0x8b, 0x5b, 0xd0, 0x32, 0x2c, 0x0d, 0x29, 0x59, - 0xc6, 0xd2, 0x60, 0xc9, 0xd6, 0xe8, 0x5b, 0x5d, 0xf2, 0x0d, 0x38, 0x87, 0xdd, 0x3b, 0xf0, 0x86, - 0x9d, 0x7e, 0xdb, 0x41, 0xe0, 0x43, 0xb7, 0xcb, 0x03, 0x78, 0xbd, 0x80, 0x91, 0x26, 0xe3, 0xd9, - 0x53, 0x86, 0x01, 0xbd, 0x48, 0x1a, 0x48, 0xd9, 0x60, 0x84, 0xa4, 0x09, 0xaa, 0xcc, 0x7f, 0x34, - 0xe9, 0x76, 0xf9, 0xc8, 0xe6, 0xe9, 0xa5, 0x35, 0x9a, 0x37, 0xa5, 0xe0, 0xd5, 0xa0, 0xe0, 0xd2, - 0xa4, 0xdb, 0x25, 0xaf, 0x02, 0xf4, 0x7b, 0xce, 0x69, 0x67, 0x34, 0x62, 0xef, 0x15, 0xbe, 0xc3, - 0x5b, 0x90, 0x2a, 0x0f, 0x46, 0xbf, 0x57, 0x65, 0x89, 0xe4, 0x97, 0x00, 0x5d, 0x70, 0xd1, 0x37, - 0x9d, 0x59, 0xa8, 0x70, 0x48, 0x7e, 0x91, 0x18, 0xf6, 0xaf, 0x3b, 0xf6, 0xec, 0xce, 0x07, 0xc2, - 0x7a, 0xf9, 0x6d, 0x58, 0xe7, 0xb6, 0xa1, 0x07, 0x9d, 0xf1, 0x09, 0x97, 0x96, 0x9f, 0x44, 0xd4, - 0x96, 0xc4, 0xe5, 0x7f, 0xca, 0x00, 0xe8, 0x07, 0xb6, 0x80, 0x7d, 0xb9, 0x05, 0xf3, 0xf4, 0x0e, - 0x20, 0x74, 0x09, 0xa8, 0x89, 0xc5, 0x72, 0x65, 0x4d, 0x2c, 0x52, 0xd0, 0xd5, 0x68, 0xa1, 0x05, - 0xb9, 0xd0, 0x23, 0xe0, 0x6a, 0x64, 0x46, 0xe5, 0x21, 0xd8, 0x4d, 0x4e, 0x45, 0x2a, 0x00, 0x01, - 0x10, 0x0b, 0xbf, 0x95, 0xae, 0x07, 0x88, 0x06, 0x3c, 0x83, 0x43, 0x7f, 0x07, 0x60, 0x2e, 0xf2, - 0xf4, 0x09, 0xc8, 0xc8, 0x1e, 0x64, 0x9a, 0xae, 0xef, 0xce, 0x35, 0x05, 0x9e, 0xe6, 0x19, 0x1e, - 0x60, 0x2d, 0x80, 0xa8, 0x59, 0x1d, 0xbb, 0xa1, 0x38, 0x94, 0x58, 0x08, 0x31, 0x60, 0x81, 0x07, - 0xcf, 0x9d, 0x02, 0x6b, 0xc6, 0x63, 0xe7, 0x72, 0x30, 0x53, 0x4c, 0x94, 0x65, 0x0a, 0x1e, 0x26, - 0xf7, 0x0e, 0xa4, 0x6d, 0xbb, 0xca, 0x9d, 0xb2, 0x57, 0x82, 0x1b, 0x86, 0x6d, 0x57, 0x45, 0x64, - 0xf8, 0x53, 0x89, 0x8d, 0x12, 0x93, 0x2f, 0x43, 0x4e, 0x12, 0x9f, 0x39, 0x9c, 0x01, 0xf6, 0x81, - 0x64, 0xc0, 0x2f, 0x6f, 0x1a, 0x12, 0x35, 0xa9, 0x80, 0xba, 0x37, 0x79, 0xd7, 0xd3, 0x07, 0x03, - 0xf4, 0xa4, 0x79, 0xdf, 0x1b, 0x32, 0xb1, 0x2d, 0x1b, 0xe0, 0x80, 0xa2, 0x23, 0x52, 0x5b, 0xe4, - 0xca, 0xfa, 0x94, 0x28, 0x27, 0x69, 0xc0, 0xba, 0xed, 0x8d, 0x27, 0x03, 0x66, 0x73, 0x51, 0xea, - 0x0f, 0xe9, 0x85, 0x82, 0x81, 0x1f, 0x20, 0x64, 0xe2, 0x88, 0x66, 0x0a, 0x43, 0x97, 0xa3, 0xfe, - 0x30, 0x72, 0xb9, 0x88, 0x33, 0x6b, 0x9e, 0x3c, 0xe4, 0xf4, 0x54, 0x0d, 0x5f, 0x53, 0xf0, 0x54, - 0x15, 0xd7, 0x94, 0xe0, 0x72, 0xf2, 0x52, 0x02, 0x40, 0x0f, 0x3e, 0x7e, 0x49, 0x00, 0x3d, 0x21, - 0x58, 0x9e, 0x0f, 0x33, 0x12, 0x46, 0x1c, 0x1f, 0x8b, 0x37, 0x00, 0xee, 0xf5, 0x3b, 0xbd, 0xaa, - 0x37, 0x3e, 0xe9, 0xb7, 0x25, 0x9c, 0xa0, 0xdc, 0xaf, 0xf6, 0x3b, 0x3d, 0xe7, 0x14, 0x93, 0x7f, - 0xf6, 0xf1, 0x15, 0x89, 0xc8, 0x92, 0xfe, 0x27, 0x5f, 0x80, 0x25, 0xfa, 0xab, 0x19, 0x58, 0x8e, - 0x30, 0xb5, 0x23, 0x72, 0x33, 0x24, 0xf5, 0x80, 0x80, 0xdc, 0xc5, 0xd8, 0x01, 0x9d, 0xc1, 0x58, - 0x12, 0x5e, 0x45, 0xa0, 0x80, 0xce, 0x60, 0x1c, 0x85, 0xfd, 0x94, 0x88, 0x49, 0xd9, 0xaf, 0xba, - 0x08, 0xf7, 0xc1, 0x43, 0x14, 0xa0, 0x6e, 0x8d, 0xcf, 0x35, 0x47, 0xe0, 0x0d, 0xca, 0x81, 0x19, - 0x23, 0x6c, 0x58, 0x09, 0xbb, 0x5c, 0x64, 0x8f, 0x21, 0x5c, 0xa8, 0x15, 0x91, 0xed, 0xdb, 0xce, - 0x21, 0x26, 0x87, 0x2a, 0xe1, 0x13, 0x93, 0x1d, 0x58, 0x63, 0x32, 0xbe, 0x1f, 0x36, 0x8c, 0x8b, - 0xb8, 0xb8, 0xb7, 0x05, 0x71, 0xc5, 0xe4, 0xcf, 0x47, 0x18, 0x48, 0x09, 0xe6, 0xf1, 0x42, 0xc8, - 0x2d, 0xbf, 0xb7, 0xe4, 0x9b, 0x70, 0x74, 0x1d, 0xe1, 0xbe, 0x82, 0x77, 0x60, 0x79, 0x5f, 0x41, - 0x52, 0xf2, 0x35, 0x00, 0xa3, 0x37, 0xec, 0x77, 0xbb, 0x88, 0x88, 0x99, 0xc5, 0xab, 0xd4, 0xe5, - 0xf0, 0x7a, 0xc4, 0x52, 0x02, 0x22, 0x8e, 0xde, 0x84, 0xbf, 0x9d, 0x08, 0x6e, 0xa6, 0x54, 0x96, - 0x66, 0xc2, 0x02, 0x5b, 0x8c, 0x88, 0x2e, 0xcb, 0xf1, 0xf2, 0x25, 0x6c, 0x52, 0x86, 0x2e, 0xcb, - 0xd3, 0xe3, 0xe8, 0xb2, 0x12, 0x83, 0xb6, 0x07, 0xe7, 0x93, 0x1a, 0x16, 0xba, 0xc2, 0x2a, 0x67, - 0xbd, 0xc2, 0xfe, 0x79, 0x1a, 0x96, 0xb1, 0x34, 0xb1, 0x0b, 0xeb, 0xb0, 0x62, 0x4f, 0xde, 0xf5, - 0xa1, 0x57, 0xc4, 0x6e, 0x8c, 0xf5, 0x1b, 0xc9, 0x19, 0xf2, 0x33, 0x55, 0x88, 0x83, 0x18, 0xb0, - 0x2a, 0x4e, 0x82, 0x5d, 0x61, 0x4d, 0xee, 0x03, 0xbb, 0x0a, 0xf8, 0xb0, 0x78, 0xd8, 0xc4, 0x08, - 0x53, 0x70, 0x1e, 0xa4, 0x1f, 0xe7, 0x3c, 0xc8, 0x9c, 0xe9, 0x3c, 0x78, 0x07, 0x96, 0xc5, 0xd7, - 0x70, 0x27, 0x9f, 0x7f, 0xb2, 0x9d, 0x3c, 0x54, 0x18, 0xa9, 0xf8, 0x3b, 0xfa, 0xc2, 0xcc, 0x1d, - 0x1d, 0xdf, 0xfe, 0xc4, 0x2a, 0x8b, 0x45, 0x42, 0xe7, 0x65, 0x60, 0x5c, 0xb1, 0xdd, 0x42, 0xe3, - 0x53, 0x9c, 0x92, 0xaf, 0xc0, 0x52, 0xa5, 0x2f, 0x9e, 0x7d, 0x24, 0x7d, 0x7b, 0x57, 0x24, 0xca, - 0xe2, 0x82, 0x4f, 0xe9, 0x9f, 0x6e, 0xe9, 0xcf, 0xe2, 0x74, 0xbb, 0x0b, 0xc0, 0xdd, 0x14, 0x82, - 0x78, 0x40, 0xb8, 0x64, 0x84, 0x93, 0x7b, 0x58, 0xed, 0x2f, 0x11, 0xd3, 0xdd, 0x89, 0x5b, 0x94, - 0xe8, 0x87, 0x87, 0xfd, 0x49, 0x6f, 0x1c, 0x0a, 0xa0, 0x29, 0x9c, 0xb2, 0x5c, 0x9e, 0x27, 0x6f, - 0x0f, 0x11, 0xb6, 0xcf, 0x76, 0x40, 0xc8, 0x5b, 0xbe, 0x41, 0xdc, 0xe2, 0xac, 0x1e, 0xd2, 0x62, - 0x3d, 0x34, 0xd5, 0x0c, 0x4e, 0xfb, 0x91, 0x22, 0xa3, 0x6a, 0x7f, 0x8a, 0xa1, 0x7e, 0x0d, 0xc0, - 0x7f, 0x77, 0x17, 0x63, 0xcd, 0xee, 0x4b, 0x7e, 0xaa, 0xdc, 0xcb, 0x01, 0xad, 0xd4, 0x9a, 0xf4, - 0x67, 0xd5, 0x9a, 0x26, 0xe4, 0xea, 0xef, 0x8d, 0xdd, 0xc0, 0x50, 0x03, 0x6c, 0x5f, 0x92, 0xc5, - 0x9d, 0x29, 0xbd, 0x73, 0x1d, 0xcf, 0x86, 0x40, 0x0e, 0x9e, 0x22, 0x02, 0x4b, 0x8c, 0xda, 0x5b, - 0xb0, 0x26, 0x3b, 0x92, 0x3e, 0xec, 0x1d, 0x92, 0xaf, 0x30, 0x8c, 0x3f, 0x25, 0x74, 0x63, 0x91, - 0x88, 0xe8, 0x8e, 0xfb, 0xb0, 0x77, 0xc8, 0xe4, 0x1f, 0xf7, 0x81, 0x5c, 0x57, 0xbc, 0xe3, 0xfd, - 0x44, 0x01, 0x12, 0x27, 0x97, 0x77, 0x13, 0xe5, 0xff, 0x40, 0xba, 0x8c, 0x48, 0x65, 0x99, 0xc7, - 0x91, 0xca, 0xf2, 0x7f, 0xa0, 0xc0, 0x9a, 0xa9, 0x57, 0x39, 0x04, 0x36, 0x7b, 0x3f, 0xb8, 0x0a, - 0x97, 0x4d, 0xbd, 0xea, 0x34, 0xea, 0x15, 0xb3, 0x70, 0xdf, 0x49, 0x44, 0xb6, 0xbc, 0x0c, 0x4f, - 0xc7, 0x49, 0x82, 0x77, 0x86, 0x4b, 0xb0, 0x11, 0xcf, 0x16, 0xe8, 0x97, 0xc9, 0xcc, 0x02, 0x28, - 0x33, 0x9d, 0x7f, 0x13, 0xd6, 0x04, 0xd2, 0x63, 0xb3, 0x62, 0x23, 0x96, 0xf4, 0x1a, 0xe4, 0xf6, - 0x0d, 0xcb, 0x2c, 0xdd, 0x77, 0x4a, 0xad, 0x4a, 0x45, 0x9d, 0x23, 0x2b, 0xb0, 0xc4, 0x13, 0x0a, - 0xba, 0xaa, 0x90, 0x65, 0xc8, 0x9a, 0x35, 0xdb, 0x28, 0xb4, 0x2c, 0x43, 0x4d, 0xe5, 0xdf, 0x84, - 0xd5, 0xc6, 0xb0, 0xf3, 0xbe, 0x3b, 0xf6, 0xf6, 0xbc, 0x87, 0xf8, 0x4c, 0xb0, 0x08, 0x69, 0x4b, - 0x3f, 0x50, 0xe7, 0x08, 0xc0, 0x42, 0x63, 0xaf, 0x60, 0xdf, 0xbe, 0xad, 0x2a, 0x24, 0x07, 0x8b, - 0xbb, 0x85, 0x86, 0xb3, 0x57, 0xb5, 0xd5, 0x14, 0xfd, 0xa1, 0x1f, 0xd8, 0xf8, 0x23, 0x9d, 0xff, - 0x22, 0xac, 0xa3, 0xac, 0x50, 0xe9, 0x8c, 0xc6, 0x5e, 0xcf, 0x1b, 0x62, 0x1d, 0x96, 0x21, 0x6b, - 0x7b, 0x74, 0x91, 0x8f, 0x3d, 0x56, 0x81, 0xea, 0xa4, 0x3b, 0xee, 0x0c, 0xba, 0xde, 0xb7, 0x55, - 0x25, 0x7f, 0x17, 0xd6, 0xac, 0xfe, 0x64, 0xdc, 0xe9, 0x1d, 0xdb, 0x63, 0x4a, 0x71, 0xfc, 0x90, - 0x3c, 0x05, 0xeb, 0xad, 0x9a, 0x5e, 0xdd, 0x31, 0x77, 0x5b, 0xf5, 0x96, 0xed, 0x54, 0xf5, 0x66, - 0xa1, 0xcc, 0x1e, 0x29, 0xaa, 0x75, 0xbb, 0xe9, 0x58, 0x46, 0xc1, 0xa8, 0x35, 0x55, 0x25, 0xff, - 0x7d, 0x54, 0x7b, 0x1c, 0xf6, 0x7b, 0xed, 0x92, 0x8b, 0xb1, 0xc5, 0x69, 0x85, 0x35, 0xd8, 0xb6, - 0x8d, 0x42, 0xbd, 0x56, 0x74, 0x4a, 0x7a, 0xa1, 0x59, 0xb7, 0x92, 0xa0, 0x55, 0x37, 0xe1, 0x42, - 0x02, 0x4d, 0xbd, 0xd9, 0x50, 0x15, 0x72, 0x05, 0xb6, 0x12, 0xf2, 0x0e, 0x8c, 0x1d, 0xbd, 0xd5, - 0x2c, 0xd7, 0xd4, 0xd4, 0x14, 0x66, 0xdb, 0xae, 0xab, 0xe9, 0xfc, 0xef, 0x2a, 0xb0, 0xda, 0x1a, - 0x71, 0x0b, 0xe1, 0x16, 0xfa, 0xf9, 0x3d, 0x03, 0x97, 0x5a, 0xb6, 0x61, 0x39, 0xcd, 0xfa, 0x9e, - 0x51, 0x73, 0x5a, 0xb6, 0xbe, 0x1b, 0xad, 0xcd, 0x15, 0xd8, 0x92, 0x28, 0x2c, 0xa3, 0x50, 0xdf, - 0x37, 0x2c, 0xa7, 0xa1, 0xdb, 0xf6, 0x41, 0xdd, 0x2a, 0xaa, 0x0a, 0xfd, 0x62, 0x02, 0x41, 0xb5, - 0xa4, 0xb3, 0xda, 0x84, 0xf2, 0x6a, 0xc6, 0x81, 0x5e, 0x71, 0x76, 0xea, 0x4d, 0x35, 0x9d, 0xaf, - 0xd2, 0xa3, 0x17, 0x01, 0x0e, 0x99, 0x5d, 0x5b, 0x16, 0x32, 0xb5, 0x7a, 0xcd, 0x88, 0x3e, 0x6d, - 0x2d, 0x43, 0x56, 0x6f, 0x34, 0xac, 0xfa, 0x3e, 0x4e, 0x31, 0x80, 0x85, 0xa2, 0x51, 0xa3, 0x35, - 0x4b, 0xd3, 0x9c, 0x86, 0x55, 0xaf, 0xd6, 0x9b, 0x46, 0x51, 0xcd, 0xe4, 0x2d, 0xb1, 0x84, 0x45, - 0xa1, 0x87, 0x7d, 0xf6, 0x8e, 0x54, 0x34, 0x4a, 0x7a, 0xab, 0xd2, 0xe4, 0x43, 0x74, 0xdf, 0xb1, - 0x8c, 0xb7, 0x5a, 0x86, 0xdd, 0xb4, 0x55, 0x85, 0xa8, 0xb0, 0x5c, 0x33, 0x8c, 0xa2, 0xed, 0x58, - 0xc6, 0xbe, 0x69, 0x1c, 0xa8, 0x29, 0x5a, 0x26, 0xfb, 0x9f, 0x7e, 0x21, 0xff, 0xa1, 0x02, 0x84, - 0x81, 0x43, 0x8a, 0x88, 0x03, 0x38, 0x63, 0xb6, 0x61, 0xb3, 0x4c, 0x87, 0x1a, 0x9b, 0x56, 0xad, - 0x17, 0xa3, 0x5d, 0x76, 0x01, 0x48, 0x24, 0xbf, 0x5e, 0x2a, 0xa9, 0x0a, 0xd9, 0x82, 0x73, 0x91, - 0xf4, 0xa2, 0x55, 0x6f, 0xa8, 0xa9, 0xcd, 0x54, 0x56, 0x21, 0x17, 0x63, 0x99, 0x7b, 0x86, 0xd1, - 0x50, 0xd3, 0x74, 0x88, 0x22, 0x19, 0x62, 0x49, 0x30, 0xf6, 0x4c, 0xfe, 0x3b, 0x0a, 0x5c, 0x60, - 0xd5, 0x14, 0xeb, 0xcb, 0xaf, 0xea, 0x25, 0xd8, 0xe0, 0x90, 0xb7, 0x49, 0x15, 0x3d, 0x0f, 0x6a, - 0x28, 0x97, 0x55, 0xf3, 0x29, 0x58, 0x0f, 0xa5, 0x62, 0x3d, 0x52, 0x74, 0xf7, 0x08, 0x25, 0xef, - 0x18, 0x76, 0xd3, 0x31, 0x4a, 0xa5, 0xba, 0xd5, 0x64, 0x15, 0x49, 0xe7, 0x35, 0x58, 0x2f, 0x78, - 0xc3, 0x31, 0xbd, 0x15, 0xf5, 0x46, 0x9d, 0x7e, 0x0f, 0xab, 0xb0, 0x02, 0x4b, 0xc6, 0xd7, 0x9a, - 0x46, 0xcd, 0x36, 0xeb, 0x35, 0x75, 0x2e, 0x7f, 0x29, 0x42, 0x23, 0xd6, 0xb1, 0x6d, 0x97, 0xd5, - 0xb9, 0xbc, 0x0b, 0x2b, 0xc2, 0x16, 0x97, 0xcd, 0x8a, 0x6d, 0xd8, 0x14, 0x73, 0x0d, 0x77, 0x94, - 0x68, 0x13, 0x36, 0xe0, 0x7c, 0x3c, 0xdf, 0x68, 0xaa, 0x0a, 0x1d, 0x85, 0x48, 0x0e, 0x4d, 0x4f, - 0xe5, 0x7f, 0x5b, 0x81, 0x15, 0xff, 0x3d, 0x03, 0x35, 0xa8, 0x57, 0x60, 0xab, 0x5a, 0xd2, 0x9d, - 0xa2, 0xb1, 0x6f, 0x16, 0x0c, 0x67, 0xcf, 0xac, 0x15, 0x23, 0x1f, 0x79, 0x1a, 0x9e, 0x4a, 0x20, - 0xc0, 0xaf, 0x6c, 0xc0, 0xf9, 0x68, 0x56, 0x93, 0x2e, 0xd5, 0x14, 0xed, 0xfa, 0x68, 0x8e, 0xbf, - 0x4e, 0xd3, 0xf9, 0x3f, 0x53, 0x60, 0x83, 0x87, 0x74, 0xe6, 0x2f, 0x2b, 0x0c, 0xeb, 0x1f, 0xc1, - 0x30, 0xf3, 0x70, 0xa3, 0x69, 0xb5, 0xec, 0xa6, 0x51, 0x14, 0xec, 0x74, 0xd2, 0x9a, 0x96, 0x51, - 0x35, 0x6a, 0xcd, 0x48, 0xdd, 0x9e, 0x87, 0xe7, 0x66, 0xd0, 0xd6, 0xea, 0x4d, 0xf1, 0x9b, 0xae, - 0xd5, 0xe7, 0xe0, 0xd9, 0x19, 0xc4, 0x3e, 0x61, 0x2a, 0xbf, 0x0f, 0xab, 0xb6, 0x5e, 0xad, 0x94, - 0xfa, 0xc3, 0x43, 0x4f, 0x9f, 0x8c, 0x4f, 0x7a, 0x64, 0x0b, 0x2e, 0x96, 0xea, 0x56, 0xc1, 0x70, - 0xb0, 0x05, 0x91, 0x4a, 0x9c, 0x83, 0x35, 0x39, 0xf3, 0xbe, 0x41, 0x57, 0x17, 0x81, 0x55, 0x39, - 0xb1, 0x56, 0x57, 0x53, 0xf9, 0xaf, 0xc3, 0x72, 0x28, 0x2e, 0xd2, 0x45, 0x38, 0x27, 0xff, 0x6e, - 0x78, 0xbd, 0x76, 0xa7, 0x77, 0xac, 0xce, 0x45, 0x33, 0xac, 0x49, 0xaf, 0x47, 0x33, 0x70, 0xbb, - 0x91, 0x33, 0x9a, 0xde, 0xf0, 0xb4, 0xd3, 0x73, 0xc7, 0x5e, 0x5b, 0x4d, 0xe5, 0x5f, 0x84, 0x95, - 0x10, 0x1a, 0x2b, 0x9d, 0x57, 0x95, 0x3a, 0x3f, 0x1f, 0xaa, 0x46, 0xd1, 0x6c, 0x55, 0xd5, 0x79, - 0xba, 0xd1, 0x94, 0xcd, 0xdd, 0xb2, 0x0a, 0xf9, 0x1f, 0x28, 0xf4, 0x86, 0x82, 0xfd, 0x5e, 0x2d, - 0xe9, 0x62, 0x26, 0xd2, 0x55, 0xc0, 0x30, 0x9e, 0x0d, 0xdb, 0x66, 0x0f, 0xce, 0x97, 0x60, 0x83, - 0xff, 0x70, 0xf4, 0x5a, 0xd1, 0x29, 0xeb, 0x56, 0xf1, 0x40, 0xb7, 0xe8, 0xd2, 0xb8, 0xaf, 0xa6, - 0x70, 0xbd, 0x4b, 0x29, 0x4e, 0xb3, 0xde, 0x2a, 0x94, 0xd5, 0x34, 0x5d, 0x5e, 0xa1, 0xf4, 0x86, - 0x59, 0x53, 0x33, 0xb8, 0x7b, 0xc4, 0xa8, 0xb1, 0x58, 0x9a, 0x3f, 0x9f, 0xff, 0x44, 0x81, 0x8b, - 0x76, 0xe7, 0xb8, 0xe7, 0x8e, 0x27, 0x43, 0x4f, 0xef, 0x1e, 0xf7, 0x87, 0x9d, 0xf1, 0xc9, 0xa9, - 0x3d, 0xe9, 0x8c, 0x3d, 0x72, 0x0b, 0xae, 0xdb, 0xe6, 0x6e, 0x4d, 0x6f, 0xd2, 0xd5, 0xaf, 0x57, - 0x76, 0xeb, 0x96, 0xd9, 0x2c, 0x57, 0x1d, 0xbb, 0x65, 0xc6, 0x16, 0xc6, 0x35, 0x78, 0x66, 0x3a, - 0x69, 0xc5, 0xd8, 0xd5, 0x0b, 0xf7, 0x55, 0x65, 0x76, 0x81, 0x3b, 0x7a, 0x45, 0xaf, 0x15, 0x8c, - 0xa2, 0xb3, 0x7f, 0x5b, 0x4d, 0x91, 0xeb, 0x70, 0x75, 0x3a, 0x69, 0xc9, 0x6c, 0xd8, 0x94, 0x2c, - 0x3d, 0xfb, 0xbb, 0x65, 0xbb, 0x4a, 0xa9, 0x32, 0xf9, 0x0e, 0xa8, 0x51, 0xf7, 0xf4, 0x98, 0x79, - 0x83, 0xd5, 0xaa, 0xd5, 0xd8, 0x19, 0xb0, 0x06, 0xb9, 0x7a, 0xb3, 0x6c, 0x58, 0x1c, 0x6a, 0x1c, - 0xb1, 0xc5, 0x5b, 0x35, 0x3a, 0xad, 0xea, 0x96, 0xf9, 0x36, 0x1e, 0x06, 0x1b, 0x70, 0xde, 0xae, - 0xe8, 0x85, 0x3d, 0x9c, 0xf1, 0x66, 0xcd, 0x29, 0x94, 0xf5, 0x5a, 0xcd, 0xa8, 0xa8, 0x90, 0xff, - 0x53, 0x85, 0xd9, 0x19, 0x24, 0xf9, 0xb1, 0x91, 0x2f, 0xc0, 0xcd, 0xfa, 0x5e, 0x53, 0x77, 0x1a, - 0x95, 0xd6, 0xae, 0x59, 0x73, 0xec, 0xfb, 0xb5, 0x82, 0x10, 0x5c, 0x0a, 0xf1, 0xfd, 0xf2, 0x26, - 0x5c, 0x9b, 0x49, 0x1d, 0x80, 0x82, 0xdf, 0x00, 0x6d, 0x26, 0x25, 0x6f, 0x48, 0xfe, 0xc7, 0x0a, - 0x6c, 0xcd, 0x78, 0x9b, 0x25, 0x2f, 0xc0, 0xad, 0xb2, 0xa1, 0x17, 0x2b, 0x86, 0x6d, 0xe3, 0x32, - 0x32, 0x6a, 0x4d, 0x6e, 0x06, 0x91, 0xb8, 0x1b, 0xde, 0x82, 0xeb, 0xb3, 0xc9, 0x83, 0x73, 0xf5, - 0x26, 0x5c, 0x9b, 0x4d, 0xca, 0xcf, 0xd9, 0x14, 0xdd, 0x8d, 0x66, 0x53, 0xfa, 0xe7, 0x73, 0x3a, - 0xff, 0x3d, 0x05, 0x2e, 0x24, 0x2b, 0x48, 0x68, 0xdd, 0xcc, 0x9a, 0xdd, 0xd4, 0x2b, 0x15, 0xa7, - 0xa1, 0x5b, 0x7a, 0xd5, 0x31, 0x6a, 0x56, 0xbd, 0x52, 0x49, 0x3a, 0x97, 0xae, 0xc1, 0x33, 0xd3, - 0x49, 0xed, 0x82, 0x65, 0x36, 0xe8, 0xd6, 0xab, 0xc1, 0xf6, 0x74, 0x2a, 0xc3, 0x2c, 0x18, 0x6a, - 0x6a, 0xe7, 0x8d, 0x8f, 0xfe, 0x65, 0x7b, 0xee, 0xa3, 0x4f, 0xb6, 0x95, 0x9f, 0x7c, 0xb2, 0xad, - 0xfc, 0xf3, 0x27, 0xdb, 0xca, 0xdb, 0xcf, 0x9f, 0x2d, 0x9e, 0x06, 0x0a, 0xed, 0xef, 0x2e, 0xa0, - 0xdd, 0xcf, 0xcb, 0xff, 0x13, 0x00, 0x00, 0xff, 0xff, 0xc0, 0xcf, 0xb2, 0xa9, 0x3e, 0xaa, 0x01, - 0x00, + // 29014 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x1c, 0x49, + 0x7a, 0x20, 0x36, 0xdd, 0x8d, 0x47, 0xe3, 0xc3, 0xab, 0x91, 0x00, 0x49, 0x10, 0x33, 0x64, 0x73, + 0x6a, 0x66, 0x38, 0xe4, 0xec, 0x0c, 0xb9, 0x04, 0x77, 0xb8, 0x3b, 0x3b, 0xaf, 0x6d, 0x3c, 0x48, + 0x36, 0x09, 0x82, 0xd8, 0x6a, 0x90, 0xdc, 0xd1, 0x3e, 0x6a, 0x0b, 0xdd, 0x09, 0xa0, 0x86, 0xdd, + 0x5d, 0xbd, 0x55, 0xd5, 0x24, 0xb1, 0xba, 0xf3, 0x49, 0x77, 0xd2, 0xc9, 0x0a, 0x59, 0xaf, 0xb3, + 0x74, 0xda, 0x73, 0xe8, 0x64, 0x85, 0xec, 0xb3, 0x15, 0xe7, 0x38, 0x85, 0x2d, 0x59, 0x61, 0xfb, + 0x14, 0xd6, 0x49, 0x17, 0x0a, 0x59, 0xa1, 0x70, 0x9c, 0x14, 0xb6, 0xfc, 0x5a, 0x2b, 0x20, 0xcb, + 0xf2, 0x0f, 0x1b, 0x11, 0x8e, 0x90, 0x7c, 0x11, 0x7e, 0xec, 0x85, 0xee, 0x1c, 0xf9, 0xe5, 0x97, + 0x55, 0x99, 0xd5, 0xd5, 0x40, 0x63, 0x86, 0xab, 0x13, 0x27, 0xf4, 0x87, 0x44, 0x7f, 0xf9, 0x7d, + 0x5f, 0x56, 0xbe, 0xbf, 0xfc, 0xf2, 0x7b, 0xc0, 0x8b, 0x11, 0x6f, 0xf2, 0x8e, 0x1f, 0x44, 0x97, + 0x9b, 0x7c, 0xc7, 0xad, 0xef, 0x5d, 0x8e, 0xf6, 0x3a, 0x3c, 0x94, 0xff, 0x5e, 0xea, 0x04, 0x7e, + 0xe4, 0xb3, 0x61, 0xfc, 0xb1, 0x30, 0xb7, 0xe3, 0xef, 0xf8, 0x08, 0xb9, 0x2c, 0xfe, 0x92, 0x85, + 0x0b, 0x67, 0x77, 0x7c, 0x7f, 0xa7, 0xc9, 0x2f, 0xe3, 0xaf, 0xad, 0xee, 0xf6, 0xe5, 0x46, 0x37, + 0x70, 0x23, 0xcf, 0x6f, 0x53, 0x79, 0x39, 0x5d, 0x1e, 0x79, 0x2d, 0x1e, 0x46, 0x6e, 0xab, 0xd3, + 0x8f, 0xc1, 0xe3, 0xc0, 0xed, 0x74, 0x78, 0x40, 0xb5, 0x2f, 0x5c, 0x8c, 0x3f, 0xd0, 0x8d, 0x22, + 0x41, 0x29, 0x98, 0x5f, 0x7e, 0x74, 0x45, 0xff, 0x49, 0xa8, 0x6f, 0x64, 0xb7, 0x45, 0x31, 0x4c, + 0x71, 0xb6, 0x7e, 0xae, 0x00, 0x63, 0xb7, 0x39, 0xef, 0x54, 0x9a, 0xde, 0x23, 0xce, 0x5e, 0x82, + 0xa1, 0x75, 0xb7, 0xc5, 0xe7, 0x73, 0xe7, 0x72, 0x17, 0xc6, 0x96, 0xa6, 0x0f, 0xf6, 0xcb, 0xe3, + 0x21, 0x0f, 0x1e, 0xf1, 0xc0, 0x69, 0xbb, 0x2d, 0x6e, 0x63, 0x21, 0xfb, 0x14, 0x8c, 0x89, 0xff, + 0xc3, 0x8e, 0x5b, 0xe7, 0xf3, 0x79, 0xc4, 0x9c, 0x3c, 0xd8, 0x2f, 0x8f, 0xb5, 0x15, 0xd0, 0x4e, + 0xca, 0x59, 0x15, 0x46, 0x57, 0x9f, 0x74, 0xbc, 0x80, 0x87, 0xf3, 0x43, 0xe7, 0x72, 0x17, 0xc6, + 0x17, 0x17, 0x2e, 0xc9, 0xb6, 0x5e, 0x52, 0x6d, 0xbd, 0xb4, 0xa9, 0x3a, 0x63, 0x69, 0xf6, 0x77, + 0xf6, 0xcb, 0xcf, 0x1d, 0xec, 0x97, 0x47, 0xb9, 0x24, 0xf9, 0x89, 0x3f, 0x2a, 0xe7, 0x6c, 0x45, + 0xcf, 0xde, 0x81, 0xa1, 0xcd, 0xbd, 0x0e, 0x9f, 0x1f, 0x3b, 0x97, 0xbb, 0x30, 0xb5, 0x78, 0xf6, + 0x92, 0x1c, 0x9e, 0xf8, 0xe3, 0x93, 0xbf, 0x04, 0xd6, 0x52, 0xf1, 0x60, 0xbf, 0x3c, 0x24, 0x50, + 0x6c, 0xa4, 0x62, 0x6f, 0xc0, 0xc8, 0x4d, 0x3f, 0x8c, 0xaa, 0x2b, 0xf3, 0x80, 0x9f, 0x7c, 0xe2, + 0x60, 0xbf, 0x3c, 0xb3, 0xeb, 0x87, 0x91, 0xe3, 0x35, 0x5e, 0xf7, 0x5b, 0x5e, 0xc4, 0x5b, 0x9d, + 0x68, 0xcf, 0x26, 0x24, 0xeb, 0x09, 0x4c, 0x1a, 0xfc, 0xd8, 0x38, 0x8c, 0xde, 0x5b, 0xbf, 0xbd, + 0x7e, 0xf7, 0xc1, 0x7a, 0xe9, 0x39, 0x56, 0x84, 0xa1, 0xf5, 0xbb, 0x2b, 0xab, 0xa5, 0x1c, 0x1b, + 0x85, 0x42, 0x65, 0x63, 0xa3, 0x94, 0x67, 0x13, 0x50, 0x5c, 0xa9, 0x6c, 0x56, 0x96, 0x2a, 0xb5, + 0xd5, 0x52, 0x81, 0xcd, 0xc2, 0xf4, 0x83, 0xea, 0xfa, 0xca, 0xdd, 0x07, 0x35, 0x67, 0x65, 0xb5, + 0x76, 0x7b, 0xf3, 0xee, 0x46, 0x69, 0x88, 0x4d, 0x01, 0xdc, 0xbe, 0xb7, 0xb4, 0x6a, 0xaf, 0xaf, + 0x6e, 0xae, 0xd6, 0x4a, 0xc3, 0x6c, 0x0e, 0x4a, 0x8a, 0xc4, 0xa9, 0xad, 0xda, 0xf7, 0xab, 0xcb, + 0xab, 0xa5, 0x91, 0x5b, 0x43, 0xc5, 0x42, 0x69, 0xc8, 0x1e, 0x5d, 0xe3, 0x6e, 0xc8, 0xab, 0x2b, + 0xd6, 0xbf, 0x57, 0x80, 0xe2, 0x1d, 0x1e, 0xb9, 0x0d, 0x37, 0x72, 0xd9, 0x0b, 0xc6, 0xf8, 0x60, + 0x13, 0xb5, 0x81, 0x79, 0xa9, 0x77, 0x60, 0x86, 0x0f, 0xf6, 0xcb, 0xb9, 0x37, 0xf4, 0x01, 0x79, + 0x1b, 0xc6, 0x57, 0x78, 0x58, 0x0f, 0xbc, 0x8e, 0x98, 0x34, 0xf3, 0x05, 0x44, 0x3b, 0x7d, 0xb0, + 0x5f, 0x3e, 0xd1, 0x48, 0xc0, 0x5a, 0x87, 0xe8, 0xd8, 0xac, 0x0a, 0x23, 0x6b, 0xee, 0x16, 0x6f, + 0x86, 0xf3, 0xc3, 0xe7, 0x0a, 0x17, 0xc6, 0x17, 0x9f, 0xa7, 0x41, 0x50, 0x1f, 0x78, 0x49, 0x96, + 0xae, 0xb6, 0xa3, 0x60, 0x6f, 0x69, 0xee, 0x60, 0xbf, 0x5c, 0x6a, 0x22, 0x40, 0xef, 0x60, 0x89, + 0xc2, 0x6a, 0xc9, 0xc4, 0x18, 0x39, 0x72, 0x62, 0x9c, 0xf9, 0x9d, 0xfd, 0x72, 0x4e, 0x0c, 0x18, + 0x4d, 0x8c, 0x84, 0x9f, 0x39, 0x45, 0x16, 0xa1, 0x68, 0xf3, 0x47, 0x5e, 0x28, 0x5a, 0x56, 0xc4, + 0x96, 0x9d, 0x3c, 0xd8, 0x2f, 0xb3, 0x80, 0x60, 0xda, 0x67, 0xc4, 0x78, 0x0b, 0x6f, 0xc1, 0xb8, + 0xf6, 0xd5, 0xac, 0x04, 0x85, 0x87, 0x7c, 0x4f, 0xf6, 0xb0, 0x2d, 0xfe, 0x64, 0x73, 0x30, 0xfc, + 0xc8, 0x6d, 0x76, 0xa9, 0x4b, 0x6d, 0xf9, 0xe3, 0xf3, 0xf9, 0xcf, 0xe5, 0x6e, 0x0d, 0x15, 0x47, + 0x4b, 0x45, 0x3b, 0x5f, 0x5d, 0xb1, 0xfe, 0xce, 0x10, 0x14, 0x6d, 0x5f, 0x2e, 0x44, 0x76, 0x11, + 0x86, 0x6b, 0x91, 0x1b, 0xa9, 0x61, 0x9a, 0x3d, 0xd8, 0x2f, 0x4f, 0x8b, 0x45, 0xca, 0xb5, 0xfa, + 0x25, 0x86, 0x40, 0xdd, 0xd8, 0x75, 0x43, 0x35, 0x5c, 0x88, 0xda, 0x11, 0x00, 0x1d, 0x15, 0x31, + 0xd8, 0x79, 0x18, 0xba, 0xe3, 0x37, 0x38, 0x8d, 0x18, 0x3b, 0xd8, 0x2f, 0x4f, 0xb5, 0xfc, 0x86, + 0x8e, 0x88, 0xe5, 0xec, 0x75, 0x18, 0x5b, 0xee, 0x06, 0x01, 0x6f, 0x8b, 0xb9, 0x3e, 0x84, 0xc8, + 0x53, 0x07, 0xfb, 0x65, 0xa8, 0x4b, 0xa0, 0xe3, 0x35, 0xec, 0x04, 0x41, 0x0c, 0x43, 0x2d, 0x72, + 0x83, 0x88, 0x37, 0xe6, 0x87, 0x07, 0x1a, 0x06, 0xb1, 0x3e, 0x67, 0x42, 0x49, 0x92, 0x1e, 0x06, + 0xe2, 0xc4, 0x6e, 0xc2, 0xf8, 0x8d, 0xc0, 0xad, 0xf3, 0x0d, 0x1e, 0x78, 0x7e, 0x03, 0xc7, 0xb7, + 0xb0, 0x74, 0xfe, 0x60, 0xbf, 0x7c, 0x72, 0x47, 0x80, 0x9d, 0x0e, 0xc2, 0x13, 0xea, 0xef, 0xec, + 0x97, 0x8b, 0x2b, 0xb4, 0x65, 0xda, 0x3a, 0x29, 0xfb, 0xba, 0x18, 0x9c, 0x30, 0xc2, 0xae, 0xe5, + 0x8d, 0xf9, 0xd1, 0x23, 0x3f, 0xd1, 0xa2, 0x4f, 0x3c, 0xd9, 0x74, 0xc3, 0xc8, 0x09, 0x24, 0x5d, + 0xea, 0x3b, 0x75, 0x96, 0xec, 0x2e, 0x14, 0x6b, 0xf5, 0x5d, 0xde, 0xe8, 0x36, 0x39, 0x4e, 0x99, + 0xf1, 0xc5, 0x53, 0x34, 0xa9, 0xd5, 0x78, 0xaa, 0xe2, 0xa5, 0x05, 0xe2, 0xcd, 0x42, 0x82, 0xe8, + 0xf3, 0x49, 0x61, 0x7d, 0xbe, 0xf8, 0xad, 0x9f, 0x2f, 0x3f, 0xf7, 0x7d, 0x7f, 0x78, 0xee, 0x39, + 0xeb, 0x3f, 0xcb, 0x43, 0x29, 0xcd, 0x84, 0x6d, 0xc3, 0xe4, 0xbd, 0x4e, 0xc3, 0x8d, 0xf8, 0x72, + 0xd3, 0xe3, 0xed, 0x28, 0xc4, 0x49, 0x72, 0x78, 0x9b, 0x5e, 0xa6, 0x7a, 0xe7, 0xbb, 0x48, 0xe8, + 0xd4, 0x25, 0x65, 0xaa, 0x55, 0x26, 0xdb, 0xa4, 0x9e, 0x1a, 0x6e, 0xe0, 0x21, 0xce, 0xb0, 0xe3, + 0xd5, 0x23, 0xb7, 0xfe, 0x3e, 0xf5, 0x10, 0x5b, 0x9a, 0x40, 0xed, 0xc6, 0xd6, 0x1e, 0xce, 0xcc, + 0xc1, 0x27, 0x90, 0x20, 0xc9, 0x98, 0x40, 0x02, 0x6c, 0xfd, 0x6f, 0x39, 0x98, 0xb2, 0x79, 0xe8, + 0x77, 0x83, 0x3a, 0xbf, 0xc9, 0xdd, 0x06, 0x0f, 0xc4, 0xf4, 0xbf, 0xed, 0xb5, 0x1b, 0xb4, 0xa6, + 0x70, 0xfa, 0x3f, 0xf4, 0xda, 0xfa, 0xd6, 0x8d, 0xe5, 0xec, 0xd3, 0x30, 0x5a, 0xeb, 0x6e, 0x21, + 0x6a, 0x3e, 0xd9, 0x01, 0xc2, 0xee, 0x96, 0x93, 0x42, 0x57, 0x68, 0xec, 0x32, 0x8c, 0xde, 0xe7, + 0x41, 0x98, 0xec, 0x86, 0x78, 0x34, 0x3c, 0x92, 0x20, 0x9d, 0x80, 0xb0, 0xd8, 0x8d, 0x64, 0x47, + 0xa6, 0x43, 0x6d, 0x3a, 0xb5, 0x0f, 0x26, 0x53, 0xa5, 0x45, 0x10, 0x7d, 0xaa, 0x28, 0x2c, 0xeb, + 0x27, 0xf3, 0x50, 0x5a, 0x71, 0x23, 0x77, 0xcb, 0x0d, 0xa9, 0x3f, 0xef, 0x5f, 0x15, 0x7b, 0xbc, + 0xd6, 0x50, 0xdc, 0xe3, 0xc5, 0x97, 0x7f, 0xe4, 0xe6, 0xbd, 0x92, 0x6e, 0xde, 0xb8, 0x38, 0x61, + 0xa9, 0x79, 0x49, 0xa3, 0xde, 0x3d, 0xba, 0x51, 0x25, 0x6a, 0x54, 0x51, 0x35, 0x2a, 0x69, 0x0a, + 0x7b, 0x17, 0x86, 0x6a, 0x1d, 0x5e, 0xa7, 0x4d, 0x44, 0x9d, 0x0b, 0x66, 0xe3, 0x04, 0xc2, 0xfd, + 0xab, 0x4b, 0x13, 0xc4, 0x66, 0x28, 0xec, 0xf0, 0xba, 0x8d, 0x64, 0xda, 0xa2, 0xf9, 0xcf, 0x0b, + 0x30, 0x97, 0x45, 0xa6, 0xb7, 0x63, 0xe4, 0x90, 0x76, 0x5c, 0x80, 0xa2, 0x38, 0xc2, 0xc5, 0xb1, + 0x88, 0xdb, 0xc5, 0xd8, 0xd2, 0x84, 0xf8, 0xe4, 0x5d, 0x82, 0xd9, 0x71, 0x29, 0x7b, 0x29, 0x96, + 0x08, 0x8a, 0x09, 0x3f, 0x92, 0x08, 0x94, 0x1c, 0x20, 0xc6, 0x5a, 0x2d, 0x61, 0x14, 0x1c, 0x92, + 0x6e, 0x51, 0xe0, 0x64, 0xac, 0x03, 0x82, 0x18, 0xc7, 0x8c, 0x3a, 0x14, 0x56, 0xa1, 0xa8, 0x9a, + 0x35, 0x3f, 0x81, 0x8c, 0x66, 0x52, 0x9d, 0x74, 0xff, 0xaa, 0x1c, 0xcc, 0x06, 0xfd, 0xd6, 0xd9, + 0x28, 0x1c, 0x76, 0x15, 0x8a, 0x1b, 0x81, 0xff, 0x64, 0xaf, 0xba, 0x12, 0xce, 0x4f, 0x9e, 0x2b, + 0x5c, 0x18, 0x5b, 0x3a, 0x75, 0xb0, 0x5f, 0x9e, 0xed, 0x08, 0x98, 0xe3, 0x35, 0xf4, 0x93, 0x36, + 0x46, 0xbc, 0x35, 0x54, 0xcc, 0x95, 0xf2, 0xb7, 0x86, 0x8a, 0xf9, 0x52, 0x41, 0x8a, 0x17, 0xb7, + 0x86, 0x8a, 0x43, 0xa5, 0xe1, 0x5b, 0x43, 0xc5, 0x61, 0x14, 0x38, 0xc6, 0x4a, 0x70, 0x6b, 0xa8, + 0x38, 0x5e, 0x9a, 0x30, 0x4e, 0x7b, 0x64, 0x10, 0xf9, 0x75, 0xbf, 0x69, 0x17, 0xee, 0xd9, 0x55, + 0x7b, 0x64, 0xb9, 0xb2, 0xcc, 0x83, 0xc8, 0x2e, 0x54, 0x1e, 0xd4, 0xec, 0xc9, 0x95, 0xbd, 0xb6, + 0xdb, 0xf2, 0xea, 0xf2, 0xe8, 0xb4, 0x0b, 0x37, 0x96, 0x37, 0xac, 0x0a, 0x4c, 0x25, 0x6d, 0x59, + 0xf3, 0xc2, 0x88, 0x5d, 0x86, 0x31, 0x05, 0x11, 0x1b, 0x5d, 0x21, 0xb3, 0xd5, 0x76, 0x82, 0x63, + 0xfd, 0x76, 0x1e, 0x20, 0x29, 0x79, 0x46, 0xd7, 0xc2, 0x67, 0x8d, 0xb5, 0x70, 0x22, 0xbd, 0x16, + 0xfa, 0xae, 0x02, 0xf6, 0x3e, 0x8c, 0x08, 0xb1, 0xa0, 0xab, 0x44, 0xa2, 0x53, 0x69, 0x52, 0x2c, + 0xbc, 0x7f, 0x75, 0x69, 0x8a, 0x88, 0x47, 0x42, 0x84, 0xd8, 0x44, 0xa6, 0x2d, 0xa3, 0x9f, 0x1b, + 0x4d, 0x06, 0x83, 0x16, 0xd0, 0x05, 0x88, 0x07, 0x94, 0x3a, 0x14, 0x57, 0x46, 0x47, 0x0d, 0x72, + 0x5c, 0xca, 0x4e, 0x83, 0x18, 0x70, 0xea, 0xd4, 0xd1, 0x83, 0xfd, 0x72, 0xa1, 0x1b, 0x78, 0x38, + 0x09, 0xd8, 0x65, 0xa0, 0x69, 0x40, 0x1d, 0x28, 0x66, 0xdf, 0x4c, 0xdd, 0x75, 0xea, 0x3c, 0x88, + 0x92, 0x1e, 0x9f, 0xcf, 0xa9, 0xd9, 0xc2, 0x3a, 0x60, 0x4e, 0x95, 0xf9, 0x21, 0x9c, 0x06, 0x17, + 0x32, 0x7b, 0xe5, 0x92, 0x81, 0x2a, 0xc5, 0xc8, 0x73, 0xea, 0x54, 0x6a, 0xc8, 0x32, 0xa7, 0x47, + 0xa4, 0x34, 0x2b, 0x60, 0x57, 0x41, 0xcc, 0x50, 0xea, 0x7d, 0xa0, 0x7a, 0x2a, 0x0f, 0x6a, 0x4b, + 0x27, 0x88, 0xd3, 0xa4, 0xfb, 0x58, 0x27, 0x17, 0xd8, 0xec, 0x6d, 0x10, 0x53, 0x98, 0xfa, 0x9d, + 0x11, 0xd1, 0x8d, 0xe5, 0x8d, 0xe5, 0xa6, 0xdf, 0x6d, 0xd4, 0xbe, 0xb8, 0x96, 0x10, 0xef, 0xd4, + 0x3b, 0x3a, 0xf1, 0x8d, 0xe5, 0x0d, 0xf6, 0x36, 0x0c, 0x57, 0xbe, 0xd9, 0x0d, 0x38, 0xc9, 0x27, + 0x13, 0xaa, 0x4e, 0x01, 0x5b, 0x3a, 0x45, 0x84, 0xd3, 0xae, 0xf8, 0xa9, 0xcb, 0x75, 0x58, 0x2e, + 0x6a, 0xde, 0x5c, 0xab, 0x91, 0xec, 0xc1, 0x52, 0xdd, 0xb2, 0xb9, 0xa6, 0x7d, 0x76, 0x64, 0xb4, + 0x5a, 0x50, 0xb1, 0xcb, 0x90, 0xaf, 0xac, 0xe0, 0x8d, 0x68, 0x7c, 0x71, 0x4c, 0x55, 0xbb, 0xb2, + 0x34, 0x47, 0x24, 0x13, 0xae, 0xbe, 0x0c, 0xf2, 0x95, 0x15, 0xb6, 0x04, 0xc3, 0x77, 0xf6, 0x6a, + 0x5f, 0x5c, 0xa3, 0xcd, 0x6c, 0x56, 0xcd, 0x6b, 0x01, 0xbb, 0x8b, 0xcb, 0x3e, 0x4c, 0xbe, 0xb8, + 0xb5, 0x17, 0x7e, 0xa3, 0xa9, 0x7f, 0x31, 0xa2, 0xb1, 0x0d, 0x18, 0xab, 0x34, 0x5a, 0x5e, 0xfb, + 0x5e, 0xc8, 0x83, 0xf9, 0x71, 0xe4, 0x33, 0x9f, 0xfa, 0xee, 0xb8, 0x7c, 0x69, 0xfe, 0x60, 0xbf, + 0x3c, 0xe7, 0x8a, 0x9f, 0x4e, 0x37, 0xe4, 0x81, 0xc6, 0x2d, 0x61, 0xc2, 0x36, 0x00, 0xee, 0xf8, + 0xed, 0x1d, 0xbf, 0x12, 0x35, 0xdd, 0x30, 0xb5, 0x3d, 0x26, 0x05, 0xb1, 0xf8, 0x70, 0xa2, 0x25, + 0x60, 0x8e, 0x2b, 0x80, 0x1a, 0x43, 0x8d, 0x07, 0xbb, 0x0e, 0x23, 0x77, 0x03, 0xb7, 0xde, 0xe4, + 0xf3, 0x93, 0xc8, 0x6d, 0x8e, 0xb8, 0x49, 0xa0, 0x6a, 0xe9, 0x3c, 0x31, 0x2c, 0xf9, 0x08, 0xd6, + 0xaf, 0x29, 0x12, 0x71, 0xe1, 0x01, 0xb0, 0xde, 0x39, 0x99, 0x71, 0x49, 0xf8, 0x94, 0x7e, 0x49, + 0x48, 0x16, 0xfd, 0xb2, 0xdf, 0x6a, 0xb9, 0xed, 0x06, 0xd2, 0xde, 0x5f, 0xd4, 0xee, 0x0e, 0xd6, + 0x37, 0x60, 0xa6, 0xa7, 0xb3, 0x8e, 0xb8, 0xdf, 0xbd, 0x07, 0xd3, 0x2b, 0x7c, 0xdb, 0xed, 0x36, + 0xa3, 0xf8, 0x24, 0x91, 0x4b, 0x14, 0x6f, 0x5a, 0x0d, 0x59, 0xe4, 0xa8, 0xe3, 0xc3, 0x4e, 0x23, + 0x5b, 0xef, 0xc2, 0xa4, 0xd1, 0x7c, 0x71, 0x55, 0xa8, 0x74, 0x1b, 0x5e, 0x84, 0x03, 0x99, 0x4b, + 0xae, 0x0a, 0xae, 0x00, 0xe2, 0x70, 0xd9, 0x09, 0x82, 0xf5, 0xef, 0xeb, 0xd2, 0x0a, 0xed, 0x44, + 0xe2, 0x5a, 0x4d, 0xfb, 0x41, 0x2e, 0x91, 0x9d, 0x7a, 0xf6, 0x83, 0x78, 0x37, 0xb8, 0x28, 0xd7, + 0x66, 0xbe, 0x67, 0x6d, 0x8e, 0xd3, 0x48, 0x14, 0xdc, 0xc7, 0xa1, 0x5c, 0x91, 0xf1, 0x4c, 0x2d, + 0x7c, 0xf4, 0x99, 0xfa, 0x3e, 0x4c, 0xdc, 0x71, 0xdb, 0xee, 0x0e, 0x6f, 0x88, 0x16, 0xc8, 0xbd, + 0x67, 0x6c, 0xe9, 0xf9, 0x83, 0xfd, 0xf2, 0xa9, 0x96, 0x84, 0x63, 0x2b, 0xf5, 0x49, 0x64, 0x10, + 0xb0, 0x2b, 0x6a, 0x65, 0x0f, 0x67, 0xac, 0xec, 0x49, 0xaa, 0x7d, 0x18, 0x57, 0x36, 0xad, 0x67, + 0xeb, 0x37, 0xc6, 0xb0, 0x8d, 0xec, 0x75, 0x18, 0xb1, 0xf9, 0x8e, 0x38, 0x6a, 0x72, 0xc9, 0x20, + 0x05, 0x08, 0xd1, 0x3b, 0x46, 0xe2, 0xa0, 0x9c, 0xc1, 0x1b, 0xe1, 0xae, 0xb7, 0x1d, 0x51, 0xef, + 0xc4, 0x72, 0x06, 0x81, 0x35, 0x39, 0x83, 0x20, 0xe6, 0x75, 0x56, 0xc2, 0xc4, 0xee, 0x67, 0xaf, + 0xd4, 0xa8, 0xd3, 0x54, 0x0f, 0xdb, 0x2b, 0xda, 0x36, 0x12, 0x18, 0x52, 0x82, 0xc0, 0x66, 0xd7, + 0x60, 0xac, 0x52, 0xaf, 0xfb, 0x5d, 0xed, 0xce, 0x28, 0xd7, 0xad, 0x04, 0x9a, 0x2a, 0x92, 0x04, + 0x95, 0xd5, 0x60, 0x7c, 0x55, 0x5c, 0xb4, 0xbc, 0x65, 0xb7, 0xbe, 0xab, 0x3a, 0x49, 0xed, 0x61, + 0x5a, 0x49, 0xb2, 0x72, 0x39, 0x02, 0xeb, 0x02, 0xa8, 0x2b, 0x19, 0x34, 0x5c, 0xb6, 0x09, 0xe3, + 0x35, 0x5e, 0x0f, 0x78, 0x54, 0x8b, 0xfc, 0x80, 0xa7, 0xb6, 0x64, 0xad, 0x64, 0xe9, 0xac, 0xba, + 0xeb, 0x85, 0x08, 0x74, 0x42, 0x01, 0xd5, 0xb9, 0x6a, 0xc8, 0x52, 0x68, 0x6f, 0xf9, 0xc1, 0xde, + 0xca, 0x12, 0x6d, 0xd3, 0xc9, 0x99, 0x2e, 0xc1, 0xba, 0xd0, 0x2e, 0x20, 0x8d, 0x2d, 0x53, 0x68, + 0x97, 0x58, 0x38, 0x52, 0x2b, 0x35, 0x94, 0xad, 0x68, 0xd3, 0x9e, 0x4e, 0x7a, 0x19, 0xc1, 0xda, + 0x48, 0x35, 0x42, 0x94, 0xcc, 0x8c, 0x91, 0x22, 0x2c, 0xd6, 0x01, 0xa6, 0x46, 0x4d, 0x0a, 0xba, + 0x4d, 0x1e, 0x86, 0xb4, 0x97, 0x9f, 0x4e, 0x0d, 0x7e, 0x82, 0xb0, 0xf4, 0x0a, 0x31, 0x3f, 0xa3, + 0xa6, 0x01, 0xdd, 0xd3, 0x44, 0xa1, 0x56, 0x4f, 0x06, 0x6f, 0xf6, 0x16, 0xc0, 0xea, 0x93, 0x88, + 0x07, 0x6d, 0xb7, 0x19, 0xeb, 0xc1, 0x50, 0xf5, 0xc3, 0x09, 0x6a, 0x0e, 0xb4, 0x86, 0xcc, 0x96, + 0x61, 0xb2, 0x12, 0x86, 0xdd, 0x16, 0xb7, 0xfd, 0x26, 0xaf, 0xd8, 0xeb, 0xb8, 0xef, 0x8f, 0x2d, + 0x9d, 0x39, 0xd8, 0x2f, 0x9f, 0x76, 0xb1, 0xc0, 0x09, 0xfc, 0x26, 0x77, 0xdc, 0x40, 0x9f, 0xdd, + 0x26, 0x0d, 0xbb, 0x0b, 0x70, 0xb7, 0xc3, 0xdb, 0x35, 0xee, 0x06, 0xf5, 0xdd, 0xd4, 0x36, 0x9f, + 0x14, 0x2c, 0xbd, 0x40, 0x2d, 0x9c, 0xf3, 0x3b, 0xbc, 0x1d, 0x22, 0x4c, 0xff, 0xaa, 0x04, 0x93, + 0x3d, 0x80, 0xe9, 0x6a, 0xe5, 0xce, 0x86, 0xdf, 0xf4, 0xea, 0x7b, 0x24, 0x39, 0x4d, 0xa1, 0x76, + 0xf0, 0x24, 0x71, 0x4d, 0x95, 0xca, 0xed, 0xc9, 0x73, 0x5b, 0x4e, 0x07, 0xa1, 0x0e, 0xc9, 0x4f, + 0x69, 0x2e, 0xec, 0x03, 0x31, 0x07, 0x43, 0x21, 0x0c, 0x6e, 0xba, 0x3b, 0xe1, 0xfc, 0xb4, 0xa1, + 0xed, 0xaa, 0x3c, 0xa8, 0x5d, 0xd2, 0x4a, 0xa5, 0x98, 0xb2, 0x20, 0x27, 0x22, 0x42, 0x9d, 0xc8, + 0xdd, 0x09, 0xcd, 0x89, 0x18, 0x63, 0xb3, 0x5b, 0x00, 0x2b, 0x7e, 0xbd, 0xdb, 0xe2, 0xed, 0x68, + 0x65, 0x69, 0xbe, 0x64, 0x5e, 0x05, 0xe2, 0x82, 0x64, 0x6b, 0x6b, 0xf8, 0x75, 0x63, 0x26, 0x6a, + 0xd4, 0x0b, 0xef, 0x41, 0x29, 0xfd, 0x21, 0xc7, 0x54, 0x60, 0x4d, 0x96, 0xa6, 0xb4, 0xd6, 0xaf, + 0x3e, 0xf1, 0xc2, 0x28, 0xb4, 0xbe, 0xd7, 0x58, 0x81, 0x62, 0x77, 0xb8, 0xcd, 0xf7, 0x36, 0x02, + 0xbe, 0xed, 0x3d, 0xa1, 0xcd, 0x0c, 0x77, 0x87, 0x87, 0x7c, 0xcf, 0xe9, 0x20, 0x54, 0xdf, 0x1d, + 0x62, 0x54, 0xf6, 0x19, 0x28, 0xde, 0xbe, 0x53, 0xbb, 0xcd, 0xf7, 0xaa, 0x2b, 0x74, 0x50, 0x49, + 0xb2, 0x56, 0xe8, 0x08, 0x52, 0x63, 0xae, 0xc5, 0x98, 0xd6, 0x52, 0xb2, 0x13, 0x8a, 0x9a, 0x97, + 0x9b, 0xdd, 0x30, 0xe2, 0x41, 0x75, 0x45, 0xaf, 0xb9, 0x2e, 0x81, 0xa9, 0x7d, 0x29, 0x46, 0xb5, + 0xfe, 0x55, 0x1e, 0x77, 0x41, 0x31, 0xe1, 0xab, 0xed, 0x30, 0x72, 0xdb, 0x75, 0x1e, 0x33, 0xc0, + 0x09, 0xef, 0x11, 0x34, 0x35, 0xe1, 0x13, 0x64, 0xb3, 0xea, 0xfc, 0xc0, 0x55, 0x8b, 0x2a, 0x95, + 0xe6, 0xa2, 0xba, 0xa2, 0xab, 0x57, 0x03, 0x82, 0xa6, 0xaa, 0x4c, 0x90, 0xd9, 0x79, 0x18, 0xad, + 0x56, 0xee, 0x54, 0xba, 0xd1, 0x2e, 0xee, 0xc1, 0x45, 0x29, 0x9f, 0x8b, 0xd9, 0xea, 0x76, 0xa3, + 0x5d, 0x5b, 0x15, 0xb2, 0xcb, 0x78, 0xef, 0x69, 0xf3, 0x48, 0xaa, 0x61, 0xe9, 0xd0, 0x0d, 0x25, + 0x28, 0x75, 0xed, 0x11, 0x20, 0xf6, 0x1a, 0x0c, 0xdf, 0xdf, 0x58, 0xae, 0xae, 0xd0, 0xc5, 0x19, + 0x4f, 0xa2, 0x47, 0x9d, 0xba, 0xf9, 0x25, 0x12, 0x85, 0xad, 0xc2, 0x54, 0x8d, 0xd7, 0xbb, 0x81, + 0x17, 0xed, 0xdd, 0x08, 0xfc, 0x6e, 0x27, 0x9c, 0x1f, 0xc5, 0x3a, 0x70, 0xa5, 0x87, 0x54, 0xe2, + 0xec, 0x60, 0x91, 0x46, 0x9d, 0x22, 0xb2, 0x7e, 0x33, 0x97, 0x6c, 0x93, 0xec, 0xbc, 0x21, 0xd6, + 0xa0, 0xee, 0x46, 0x88, 0x35, 0xba, 0xee, 0x06, 0x05, 0x1c, 0x1b, 0xd8, 0x72, 0x37, 0x8c, 0xfc, + 0xd6, 0x6a, 0xbb, 0xd1, 0xf1, 0xbd, 0x76, 0x84, 0x54, 0xb2, 0xf3, 0xad, 0x83, 0xfd, 0xf2, 0xd9, + 0x3a, 0x96, 0x3a, 0x9c, 0x8a, 0x9d, 0x14, 0x97, 0x0c, 0xea, 0x8f, 0x31, 0x1e, 0xd6, 0xef, 0xe6, + 0x8d, 0xe3, 0x4d, 0x7c, 0x9e, 0xcd, 0x3b, 0x4d, 0xaf, 0x8e, 0x37, 0x7a, 0x6c, 0x68, 0x3c, 0xab, + 0xf0, 0xf3, 0x82, 0xa4, 0x54, 0xf6, 0x90, 0xc9, 0x3b, 0x83, 0x9a, 0x7d, 0x01, 0x26, 0x84, 0xa4, + 0x41, 0x3f, 0xc3, 0xf9, 0x3c, 0x76, 0xf6, 0x0b, 0xa8, 0x85, 0x0b, 0x79, 0x10, 0xb3, 0x31, 0x44, + 0x14, 0x9d, 0x82, 0x35, 0x60, 0x7e, 0x33, 0x70, 0xdb, 0xa1, 0x17, 0xad, 0xb6, 0xeb, 0xc1, 0x1e, + 0x4a, 0x46, 0xab, 0x6d, 0x77, 0xab, 0xc9, 0x1b, 0xd8, 0xdc, 0xe2, 0xd2, 0x85, 0x83, 0xfd, 0xf2, + 0xcb, 0x91, 0xc4, 0x71, 0x78, 0x8c, 0xe4, 0x70, 0x89, 0xa5, 0x71, 0xee, 0xcb, 0x49, 0x48, 0x52, + 0xaa, 0x5b, 0xf1, 0x11, 0x46, 0x0a, 0x09, 0x28, 0x49, 0xc5, 0xa3, 0x21, 0xf6, 0x30, 0xfd, 0x33, + 0x75, 0x02, 0xeb, 0xff, 0xce, 0x25, 0x07, 0x30, 0x7b, 0x07, 0xc6, 0x69, 0xc5, 0x68, 0xf3, 0x02, + 0x77, 0x50, 0xb5, 0xbc, 0x52, 0x23, 0xab, 0xa3, 0x8b, 0x7b, 0x7f, 0x65, 0x79, 0x4d, 0x9b, 0x1b, + 0x78, 0xef, 0x77, 0xeb, 0xcd, 0x34, 0x95, 0x42, 0x13, 0x93, 0x60, 0x73, 0xad, 0x66, 0xf6, 0x0a, + 0x4e, 0x82, 0xa8, 0x19, 0x66, 0x74, 0x83, 0x86, 0xfc, 0xf1, 0x1b, 0xfe, 0x3f, 0xe4, 0xb2, 0xce, + 0x79, 0xb6, 0x04, 0x93, 0x0f, 0xfc, 0xe0, 0x21, 0x8e, 0xaf, 0xd6, 0x09, 0x38, 0xf2, 0x8f, 0x55, + 0x41, 0xba, 0x41, 0x26, 0x89, 0xfe, 0x6d, 0x5a, 0x6f, 0x98, 0xdf, 0x96, 0xe2, 0x60, 0x10, 0x88, + 0x71, 0x88, 0x39, 0xc6, 0xab, 0x03, 0xc7, 0x21, 0xf9, 0x04, 0x63, 0x0a, 0xeb, 0xe8, 0xd6, 0x7f, + 0x99, 0xd3, 0xcf, 0x73, 0xd1, 0xc9, 0x2b, 0x7e, 0xcb, 0xf5, 0xda, 0x5a, 0x73, 0xe4, 0xc3, 0x12, + 0x42, 0xd3, 0x5f, 0xa2, 0x21, 0xb3, 0xab, 0x50, 0x94, 0xbf, 0xe2, 0xbd, 0x16, 0xb5, 0x5a, 0x44, + 0x68, 0x1e, 0x14, 0x0a, 0xb1, 0x67, 0x64, 0x0a, 0xc7, 0x1d, 0x99, 0xdf, 0xc8, 0xe9, 0x47, 0xf1, + 0x47, 0x3d, 0x6c, 0x52, 0x87, 0x4c, 0xfe, 0x38, 0x87, 0xcc, 0xc7, 0x6e, 0xc2, 0xf7, 0xe5, 0x60, + 0x5c, 0xd3, 0x52, 0x88, 0x36, 0x6c, 0x04, 0xfe, 0x87, 0xbc, 0x1e, 0x99, 0x6d, 0xe8, 0x48, 0x60, + 0xaa, 0x0d, 0x31, 0xea, 0xc7, 0x68, 0x83, 0xf5, 0x67, 0x39, 0xba, 0x23, 0x0d, 0xbc, 0xcd, 0x9b, + 0x5b, 0x72, 0xfe, 0x38, 0x47, 0xe4, 0x17, 0x60, 0xd8, 0xe6, 0x0d, 0x2f, 0xa4, 0xfb, 0xcd, 0x8c, + 0x7e, 0x1f, 0xc3, 0x82, 0x44, 0x6e, 0x0a, 0xc4, 0x4f, 0xfd, 0x7c, 0xc3, 0x72, 0x21, 0xc8, 0x56, + 0xc3, 0xeb, 0x4d, 0xfe, 0xc4, 0x93, 0x8b, 0x91, 0x8e, 0x5a, 0x3c, 0xde, 0xbc, 0xd0, 0xd9, 0x16, + 0x25, 0x24, 0x51, 0xeb, 0x0b, 0xcf, 0xa0, 0xb1, 0x3e, 0x00, 0x48, 0xaa, 0x64, 0xb7, 0xa1, 0x44, + 0xb3, 0xc1, 0x6b, 0xef, 0x48, 0x41, 0x8a, 0xfa, 0xa0, 0x7c, 0xb0, 0x5f, 0x7e, 0xbe, 0x1e, 0x97, + 0x91, 0xd4, 0xa9, 0xf1, 0xed, 0x21, 0xb4, 0xfe, 0xc3, 0x3c, 0xe4, 0x2b, 0x38, 0x20, 0xb7, 0xf9, + 0x5e, 0xe4, 0x6e, 0x5d, 0xf7, 0x9a, 0xc6, 0x62, 0x7a, 0x88, 0x50, 0x67, 0xdb, 0x33, 0xd4, 0x15, + 0x1a, 0xb2, 0x58, 0x4c, 0xb7, 0x83, 0xad, 0x37, 0x91, 0x50, 0x5b, 0x4c, 0x0f, 0x83, 0xad, 0x37, + 0xd3, 0x64, 0x31, 0x22, 0xb3, 0x60, 0x44, 0x2e, 0x2c, 0x9a, 0x83, 0x70, 0xb0, 0x5f, 0x1e, 0x91, + 0xeb, 0xcf, 0xa6, 0x12, 0x76, 0x1a, 0x0a, 0xb5, 0x8d, 0x75, 0xda, 0x01, 0x51, 0x2d, 0x18, 0x76, + 0xda, 0xb6, 0x80, 0x89, 0x3a, 0xd7, 0x56, 0x2a, 0x1b, 0xa8, 0x08, 0x18, 0x4e, 0xea, 0x6c, 0x36, + 0xdc, 0x4e, 0x5a, 0x15, 0x10, 0x23, 0xb2, 0x77, 0x61, 0xfc, 0xf6, 0xca, 0xf2, 0x4d, 0x3f, 0x94, + 0xbb, 0xd7, 0x48, 0x32, 0xf9, 0x1f, 0x36, 0xea, 0x0e, 0x6a, 0xe2, 0xd3, 0xc7, 0x80, 0x86, 0x6f, + 0xfd, 0x60, 0x1e, 0xc6, 0x35, 0x3d, 0x19, 0xfb, 0x0c, 0x3d, 0x90, 0xe6, 0x8c, 0x1b, 0x80, 0x86, + 0x21, 0x4a, 0xa5, 0x52, 0xa5, 0xe5, 0x37, 0x38, 0x3d, 0x97, 0x26, 0x0a, 0x8c, 0xfc, 0x20, 0x0a, + 0x8c, 0xb7, 0x00, 0xe4, 0x1c, 0xc0, 0x4f, 0xd6, 0xc4, 0x09, 0xcd, 0x4e, 0x42, 0x1f, 0x97, 0x04, + 0x99, 0xdd, 0x87, 0xd9, 0xcd, 0xa0, 0x1b, 0x46, 0xb5, 0xbd, 0x30, 0xe2, 0x2d, 0xc1, 0x6d, 0xc3, + 0xf7, 0x9b, 0x34, 0xff, 0x5e, 0x3e, 0xd8, 0x2f, 0x9f, 0x8b, 0x44, 0xb1, 0x13, 0x62, 0x39, 0x7e, + 0x80, 0xd3, 0xf1, 0x7d, 0x5d, 0xad, 0x91, 0xc5, 0xc0, 0xb2, 0x61, 0x42, 0x57, 0x8a, 0x88, 0x93, + 0x85, 0x1e, 0x93, 0x48, 0xd5, 0xad, 0x9d, 0x2c, 0xf4, 0x95, 0xbd, 0x8f, 0x5b, 0x26, 0x89, 0xf5, + 0x19, 0x5d, 0x21, 0x37, 0xe8, 0xc2, 0xb6, 0xfe, 0x66, 0x2e, 0xd9, 0x46, 0xee, 0x5f, 0x61, 0x6f, + 0xc3, 0x88, 0x7c, 0xbc, 0xa3, 0x37, 0xce, 0x13, 0xf1, 0xa5, 0x56, 0x7f, 0xd9, 0x93, 0x9a, 0xf0, + 0xdf, 0x97, 0x0f, 0xfc, 0xcf, 0xd9, 0x44, 0x12, 0x2b, 0xd1, 0x4d, 0x7d, 0x9a, 0xe2, 0x8e, 0xea, + 0xe2, 0x2b, 0x59, 0x4a, 0x74, 0xeb, 0xb7, 0x86, 0x60, 0xca, 0x44, 0xd3, 0x5f, 0xf8, 0x72, 0x03, + 0xbd, 0xf0, 0x7d, 0x01, 0x8a, 0xa2, 0x3f, 0xbc, 0x3a, 0x57, 0x12, 0xd9, 0xcb, 0xf8, 0xb4, 0x40, + 0x30, 0xe3, 0xe5, 0x1a, 0xe4, 0x70, 0x88, 0x3b, 0xae, 0x1d, 0x53, 0xb1, 0x45, 0xed, 0x19, 0xaa, + 0x90, 0x08, 0x29, 0xea, 0x19, 0x4a, 0x5f, 0x0f, 0xf1, 0x83, 0xd4, 0x1b, 0x30, 0x22, 0xe4, 0xfb, + 0x58, 0x05, 0x83, 0x5f, 0x29, 0x44, 0xff, 0x94, 0x89, 0x8a, 0x44, 0x62, 0x0f, 0xa0, 0xb8, 0xe6, + 0x86, 0x51, 0x8d, 0xf3, 0xf6, 0x00, 0x6f, 0xf7, 0x65, 0xea, 0xaa, 0x59, 0x7c, 0x18, 0x0f, 0x39, + 0x6f, 0xa7, 0x1e, 0x5f, 0x63, 0x66, 0xec, 0xab, 0x00, 0xcb, 0x7e, 0x3b, 0x0a, 0xfc, 0xe6, 0x9a, + 0xbf, 0x33, 0x3f, 0x82, 0x77, 0xdf, 0xb3, 0xa9, 0x01, 0x48, 0x10, 0xe4, 0xf5, 0x37, 0x56, 0xf0, + 0xd4, 0x65, 0x81, 0xd3, 0xf4, 0x77, 0xf4, 0x75, 0x90, 0xe0, 0xb3, 0xeb, 0x50, 0x52, 0x8a, 0x85, + 0x7b, 0x9d, 0x9d, 0x00, 0x27, 0xc8, 0x68, 0x22, 0x79, 0xf0, 0x27, 0x91, 0xd3, 0x25, 0xb8, 0xbe, + 0x53, 0xa6, 0x69, 0xd8, 0x57, 0xe0, 0x54, 0x1a, 0xa6, 0x46, 0xb9, 0x98, 0xc8, 0xe4, 0x3a, 0xbb, + 0x8c, 0x79, 0xdf, 0x8f, 0x85, 0xf5, 0x9d, 0x3c, 0x9c, 0xea, 0xd3, 0x58, 0xb1, 0x1e, 0xf0, 0xb8, + 0xd6, 0xd6, 0x43, 0xea, 0x94, 0x96, 0x36, 0x47, 0xe7, 0x20, 0x4f, 0x07, 0xdc, 0xd0, 0x52, 0xe9, + 0x60, 0xbf, 0x3c, 0x61, 0x8c, 0x63, 0xbe, 0xba, 0xc2, 0x6e, 0xc1, 0x90, 0x18, 0xa2, 0x01, 0x9e, + 0xce, 0x95, 0x4e, 0x69, 0x2a, 0xf2, 0xf4, 0xe9, 0x83, 0x43, 0x87, 0x3c, 0xd8, 0x67, 0xa0, 0xb0, + 0xb9, 0xb9, 0x86, 0x73, 0xa7, 0x80, 0x6d, 0x9f, 0x8c, 0xa2, 0xa6, 0x31, 0x55, 0x27, 0x05, 0xed, + 0xa5, 0xd8, 0xd2, 0x42, 0xa0, 0xb3, 0x2f, 0xa5, 0x4c, 0x7a, 0x5e, 0x3b, 0x7c, 0xa0, 0x07, 0xb7, + 0xf0, 0xf9, 0x18, 0x86, 0x35, 0xd6, 0xcf, 0xe6, 0x93, 0x35, 0x7c, 0xdd, 0x6b, 0x46, 0x3c, 0x60, + 0x0b, 0x72, 0x49, 0x26, 0xc2, 0x99, 0x1d, 0xff, 0x66, 0xf3, 0xc9, 0xfa, 0x96, 0xac, 0xe2, 0x85, + 0xfc, 0x9a, 0xb6, 0x90, 0x0b, 0xb8, 0x90, 0xa7, 0xfa, 0x2e, 0xd9, 0xd7, 0x32, 0xe6, 0x25, 0x2e, + 0xc4, 0x8c, 0xb9, 0xf7, 0x32, 0x4c, 0xae, 0xfb, 0xab, 0x4f, 0xa2, 0x18, 0x51, 0x2c, 0xc0, 0xa2, + 0x6d, 0x02, 0x05, 0xc7, 0xbb, 0xcd, 0x06, 0x0f, 0x36, 0x77, 0xdd, 0xb6, 0xf1, 0x76, 0x6d, 0xf7, + 0xc0, 0x05, 0xee, 0x3a, 0x7f, 0x6c, 0xe2, 0x8e, 0x4a, 0xdc, 0x34, 0xdc, 0xfa, 0xfe, 0xbc, 0xea, + 0x8c, 0xfb, 0x8b, 0xcf, 0xe8, 0x1b, 0xe9, 0x9b, 0xc6, 0x1b, 0xe9, 0x6c, 0xac, 0xdd, 0x8d, 0x1f, + 0xfc, 0x17, 0x8f, 0xb0, 0x13, 0xf8, 0x1f, 0x87, 0x61, 0x42, 0x47, 0x17, 0xfd, 0x50, 0x69, 0x34, + 0x02, 0xbd, 0x1f, 0xdc, 0x46, 0x23, 0xb0, 0x11, 0x6a, 0x98, 0x05, 0x14, 0x0e, 0x35, 0x0b, 0xf8, + 0x1a, 0x8c, 0x2d, 0xb7, 0x1a, 0xc6, 0x63, 0xa5, 0x95, 0xf1, 0x79, 0x97, 0x62, 0x24, 0xb9, 0x16, + 0x62, 0xa5, 0x65, 0xbd, 0xd5, 0xe8, 0x7d, 0xa2, 0x4c, 0x58, 0x1a, 0x16, 0x05, 0xc3, 0x1f, 0xc7, + 0xa2, 0xe0, 0x1a, 0x8c, 0xdd, 0x0b, 0xf9, 0x66, 0xb7, 0xdd, 0xe6, 0x4d, 0x9c, 0x56, 0x45, 0x29, + 0xeb, 0x77, 0x43, 0xee, 0x44, 0x08, 0xd5, 0x3f, 0x20, 0x46, 0xd5, 0x07, 0x78, 0xf4, 0x90, 0x01, + 0xbe, 0x0a, 0xc5, 0x0d, 0xce, 0x03, 0xec, 0xd3, 0xf1, 0x44, 0xa4, 0xeb, 0x70, 0x1e, 0x38, 0xa2, + 0x63, 0x0d, 0x4b, 0x03, 0x42, 0x34, 0xcc, 0x13, 0x26, 0x06, 0x34, 0x4f, 0x60, 0x2f, 0xc2, 0x44, + 0xa7, 0xbb, 0xd5, 0xf4, 0xea, 0xc8, 0x97, 0xec, 0x1a, 0xec, 0x71, 0x09, 0x13, 0x6c, 0x43, 0xf6, + 0x25, 0x98, 0xc4, 0x3b, 0x4e, 0x3c, 0xe5, 0xa6, 0x8c, 0x57, 0x3d, 0xa3, 0x4c, 0x4a, 0x3a, 0x75, + 0x01, 0x72, 0x32, 0xcc, 0x6f, 0x4c, 0x46, 0x0b, 0x35, 0x98, 0x32, 0x47, 0xf2, 0x29, 0x3c, 0xee, + 0xc5, 0xa6, 0x16, 0xc5, 0xd2, 0xd8, 0xad, 0xa1, 0x22, 0x94, 0xc6, 0xa5, 0x91, 0x85, 0x0d, 0x1b, + 0x71, 0x9b, 0x6c, 0x76, 0xbb, 0xbb, 0xc5, 0x83, 0x36, 0x8f, 0x78, 0x48, 0x97, 0x80, 0xd0, 0x1e, + 0xaa, 0x74, 0x3a, 0xa1, 0xf5, 0x9f, 0xe6, 0x61, 0xb4, 0xf2, 0xa0, 0x56, 0x6d, 0x6f, 0xfb, 0xf8, + 0x44, 0x17, 0xbf, 0xcc, 0xe8, 0x4f, 0x74, 0xf1, 0xcb, 0x8c, 0xfe, 0x1e, 0x73, 0x39, 0xe3, 0x1a, + 0x87, 0x56, 0xbc, 0xda, 0x35, 0xce, 0xb8, 0x80, 0x26, 0x8f, 0x54, 0x85, 0x01, 0x1e, 0xa9, 0x62, + 0x3d, 0xe2, 0xd0, 0xd1, 0x7a, 0xc4, 0xb7, 0x61, 0xbc, 0xda, 0x8e, 0xf8, 0x4e, 0x90, 0xcc, 0xf4, + 0xf8, 0x4a, 0x19, 0x83, 0x75, 0xd1, 0x5e, 0xc3, 0x16, 0xd3, 0x48, 0xea, 0x2e, 0x63, 0x9d, 0x25, + 0x4e, 0x23, 0xa9, 0xe2, 0x4c, 0xe9, 0x03, 0x14, 0xa2, 0xb5, 0x92, 0x9a, 0x23, 0xca, 0x10, 0x40, + 0x0a, 0x9f, 0x53, 0x89, 0xf2, 0x5e, 0x74, 0xec, 0xd2, 0x4c, 0xb6, 0x21, 0x80, 0xf5, 0x43, 0x79, + 0x18, 0xaf, 0x74, 0x3a, 0xcf, 0xb8, 0x39, 0xd6, 0xe7, 0x8c, 0xed, 0x55, 0xdd, 0x85, 0xe2, 0x76, + 0x0d, 0x64, 0x89, 0xf5, 0x4b, 0x79, 0x98, 0x4e, 0x51, 0xe8, 0x5f, 0x9f, 0x1b, 0xd0, 0x08, 0x2b, + 0x3f, 0xa0, 0x11, 0x56, 0x61, 0x30, 0x23, 0xac, 0xa1, 0x8f, 0xb3, 0x65, 0xbe, 0x0a, 0x85, 0x4a, + 0xa7, 0x93, 0x7e, 0xcc, 0xed, 0x74, 0xee, 0x5f, 0x95, 0xf7, 0x59, 0xb7, 0xd3, 0xb1, 0x05, 0x86, + 0xb1, 0x8f, 0x8d, 0x0c, 0xb8, 0x8f, 0x59, 0x6f, 0xc0, 0x18, 0xf2, 0x42, 0xd3, 0xa7, 0x73, 0x80, + 0x8b, 0x99, 0xac, 0x9e, 0x8c, 0xba, 0x68, 0x99, 0xff, 0x8b, 0x1c, 0x0c, 0xe3, 0xef, 0x67, 0x74, + 0x8e, 0x2d, 0x1a, 0x73, 0xac, 0xa4, 0xcd, 0xb1, 0x41, 0x66, 0xd7, 0x3f, 0x2c, 0x00, 0x2c, 0xdf, + 0xb5, 0x6b, 0x52, 0xed, 0xc1, 0xae, 0xc3, 0xb4, 0xdb, 0x6c, 0xfa, 0x8f, 0x79, 0xc3, 0xf1, 0x03, + 0x6f, 0xc7, 0x6b, 0xcb, 0x9e, 0x53, 0x2f, 0x8c, 0x66, 0x91, 0xfe, 0xee, 0x40, 0x45, 0x77, 0x65, + 0x89, 0xce, 0xa7, 0xc5, 0xa3, 0x5d, 0xbf, 0xa1, 0x2e, 0x70, 0x06, 0x1f, 0x2a, 0xca, 0xe0, 0x73, + 0x47, 0x96, 0xe8, 0x7c, 0x76, 0xf1, 0x42, 0xaa, 0xe4, 0x47, 0x83, 0x0f, 0x15, 0x65, 0xf0, 0x91, + 0xb7, 0xd8, 0x90, 0xad, 0xc1, 0x0c, 0x42, 0x9c, 0x7a, 0xc0, 0x1b, 0xbc, 0x1d, 0x79, 0x6e, 0x33, + 0xa4, 0x2b, 0x3f, 0x2a, 0x87, 0x7a, 0x0a, 0xf5, 0x2b, 0x0f, 0x16, 0x2e, 0x27, 0x65, 0xec, 0x12, + 0x8c, 0xb6, 0xdc, 0x27, 0x8e, 0xbb, 0x23, 0xdf, 0xda, 0x27, 0xe5, 0x15, 0x91, 0x40, 0xfa, 0x86, + 0xdd, 0x72, 0x9f, 0x54, 0x76, 0xb8, 0x68, 0x05, 0x7f, 0xd2, 0xf1, 0x43, 0xad, 0x15, 0x23, 0x49, + 0x2b, 0x52, 0x45, 0x7a, 0x2b, 0xa8, 0x88, 0x5a, 0x61, 0xfd, 0x3f, 0xc3, 0x38, 0xb5, 0x69, 0x13, + 0x20, 0xf3, 0xb0, 0x5c, 0x86, 0x79, 0xd8, 0x5b, 0xa0, 0x1d, 0x71, 0xba, 0x6a, 0x4f, 0x3b, 0xe0, + 0xf5, 0x6b, 0x61, 0x82, 0xcc, 0x1e, 0xa6, 0x0d, 0xc5, 0x0a, 0xb8, 0x72, 0x5e, 0x4a, 0xcf, 0xab, + 0xa7, 0x62, 0x23, 0x76, 0x13, 0x58, 0xb5, 0x8d, 0xaf, 0x59, 0xbc, 0xf6, 0xd0, 0xeb, 0xdc, 0xe7, + 0x81, 0xb7, 0xbd, 0x47, 0xe3, 0x82, 0x42, 0x94, 0x47, 0xa5, 0x4e, 0xf8, 0xd0, 0xeb, 0x88, 0x7b, + 0xa3, 0xb7, 0xbd, 0x67, 0x67, 0xd0, 0xb0, 0xf7, 0x61, 0xd4, 0xe6, 0x8f, 0x03, 0x2f, 0x52, 0xe6, + 0x0f, 0x53, 0xb1, 0x96, 0x03, 0xa1, 0x72, 0x88, 0x02, 0xf9, 0x43, 0x5f, 0xac, 0x54, 0xce, 0x16, + 0xe5, 0x29, 0x25, 0xcd, 0x1c, 0x26, 0x93, 0xd6, 0x56, 0x1e, 0xd4, 0xfa, 0x1d, 0x52, 0xec, 0x22, + 0x0c, 0xe3, 0x51, 0x47, 0x02, 0x1c, 0xba, 0x0d, 0xa0, 0xc0, 0xa3, 0x9f, 0xc3, 0x88, 0xc1, 0xce, + 0x02, 0xc4, 0xcf, 0x45, 0xe1, 0x7c, 0x11, 0x45, 0x2b, 0x0d, 0x92, 0x3e, 0xa7, 0xc7, 0x8e, 0x75, + 0x4e, 0xaf, 0x41, 0xc9, 0xe6, 0xdf, 0xe8, 0x7a, 0x01, 0x6f, 0x54, 0x3a, 0xf8, 0x26, 0x11, 0xce, + 0x03, 0x4e, 0xb0, 0x73, 0x07, 0xfb, 0xe5, 0x17, 0x02, 0x2a, 0x73, 0xdc, 0x8e, 0x7c, 0xca, 0x30, + 0x66, 0x77, 0x9a, 0x92, 0xbd, 0x05, 0x43, 0x62, 0x47, 0x20, 0x93, 0x32, 0xa5, 0xdb, 0x4d, 0x36, + 0x09, 0x79, 0xd3, 0xae, 0xfb, 0xc6, 0x54, 0x45, 0x92, 0xef, 0x9e, 0x99, 0xd6, 0x2f, 0xe5, 0xe1, + 0xa5, 0xf8, 0x10, 0xbc, 0x1b, 0xd4, 0x2a, 0x77, 0xd6, 0xaa, 0x8d, 0x0d, 0xba, 0x33, 0x6e, 0x04, + 0xfe, 0x23, 0xaf, 0xc1, 0x83, 0xfb, 0x57, 0x8e, 0xd8, 0xc2, 0xd7, 0xe4, 0xf2, 0x91, 0x0a, 0xe7, + 0xbc, 0x61, 0xd0, 0xa2, 0xc9, 0x1a, 0x64, 0x73, 0xd3, 0xe9, 0xf4, 0xe8, 0x9f, 0x6f, 0x3e, 0x67, + 0x27, 0x0c, 0xd8, 0xdf, 0xcc, 0xc1, 0xc9, 0xec, 0x0f, 0x21, 0x3d, 0x42, 0x59, 0xdd, 0x57, 0xfa, + 0x7c, 0xed, 0xd2, 0xab, 0x07, 0xfb, 0xe5, 0x97, 0x42, 0xb7, 0xd5, 0x74, 0xbc, 0x86, 0xac, 0xcd, + 0xab, 0x73, 0xa7, 0x43, 0x08, 0x46, 0xbd, 0x7d, 0x6a, 0xfa, 0x3c, 0xa8, 0x9d, 0x7c, 0x3e, 0xb7, + 0x04, 0x50, 0x54, 0x3a, 0x3d, 0xeb, 0x57, 0x73, 0xa0, 0x4d, 0xed, 0xa2, 0xcd, 0x1b, 0x5e, 0xc0, + 0xeb, 0x11, 0xed, 0xe6, 0xe4, 0x8e, 0x23, 0x61, 0x29, 0xfb, 0x25, 0x84, 0xb1, 0xf7, 0x60, 0x94, + 0x76, 0x1d, 0xdc, 0xb8, 0x93, 0x25, 0x41, 0xda, 0x42, 0xe9, 0xb7, 0xd5, 0xb3, 0x63, 0x29, 0x22, + 0x71, 0x2b, 0xba, 0xf5, 0x60, 0x73, 0xb9, 0xe9, 0x7a, 0xad, 0x90, 0x4e, 0x3f, 0xec, 0xd6, 0x0f, + 0x1f, 0x47, 0x4e, 0x1d, 0xa1, 0xfa, 0xad, 0x28, 0x46, 0xb5, 0x6e, 0x28, 0x65, 0xe5, 0x11, 0x46, + 0x78, 0x65, 0x18, 0xbe, 0x9f, 0x28, 0x2d, 0x96, 0xc6, 0x0e, 0xf6, 0xcb, 0x72, 0xba, 0xd8, 0x12, + 0x6e, 0xfd, 0x48, 0x0e, 0xa6, 0xcc, 0xf9, 0xc4, 0x2e, 0xc1, 0x08, 0xb9, 0xc2, 0xe4, 0x50, 0x39, + 0x23, 0x7a, 0x61, 0x44, 0x3a, 0xc1, 0x18, 0xae, 0x2f, 0x84, 0x25, 0xce, 0x6f, 0xe2, 0x40, 0x87, + 0x17, 0x9e, 0xdf, 0x75, 0x09, 0xb2, 0x55, 0x19, 0xb3, 0x84, 0xf0, 0x1e, 0x76, 0x9b, 0x91, 0xae, + 0xb3, 0x0f, 0x10, 0x62, 0x53, 0x89, 0xb5, 0x0c, 0x23, 0x72, 0x2f, 0x49, 0x19, 0xff, 0xe4, 0x8e, + 0x61, 0xfc, 0x63, 0xed, 0xe7, 0x00, 0x6a, 0xb5, 0x9b, 0xb7, 0xf9, 0xde, 0x86, 0xeb, 0x05, 0xf8, + 0xc8, 0x84, 0xfb, 0xf6, 0x6d, 0x5a, 0x5c, 0x13, 0xf4, 0xc8, 0x24, 0xf7, 0xf8, 0x87, 0x7c, 0xcf, + 0x78, 0x64, 0x52, 0xa8, 0x78, 0x38, 0x04, 0xde, 0x23, 0x37, 0xe2, 0x82, 0x30, 0x8f, 0x84, 0xf2, + 0x70, 0x90, 0xd0, 0x14, 0xa5, 0x86, 0xcc, 0xbe, 0x0a, 0x53, 0xc9, 0xaf, 0xf8, 0xa9, 0x6c, 0x2a, + 0x5e, 0xc0, 0x66, 0xe1, 0xd2, 0xd9, 0x83, 0xfd, 0xf2, 0x82, 0xc6, 0x35, 0xfd, 0x88, 0x96, 0x62, + 0x66, 0xfd, 0x42, 0x0e, 0x1f, 0x88, 0x55, 0x03, 0xcf, 0xc3, 0x50, 0x6c, 0xd2, 0x38, 0x41, 0xbb, + 0x8e, 0xf9, 0x1c, 0x80, 0xe5, 0xec, 0x25, 0x28, 0x24, 0x2d, 0xc1, 0xbd, 0xda, 0x6c, 0x81, 0x28, + 0x65, 0x37, 0x60, 0x74, 0xa0, 0x6f, 0xc6, 0xa5, 0x91, 0xf1, 0xad, 0x8a, 0x1a, 0x47, 0xe1, 0xd6, + 0x83, 0xcd, 0x4f, 0xee, 0x28, 0xfc, 0x78, 0x1e, 0xa6, 0x45, 0xbf, 0x56, 0xba, 0xd1, 0xae, 0x1f, + 0x78, 0xd1, 0xde, 0x33, 0xab, 0xdd, 0x7a, 0xc7, 0x10, 0x8d, 0x17, 0xd4, 0x29, 0xa3, 0xb7, 0x6d, + 0x20, 0x25, 0xd7, 0x7f, 0x3d, 0x0c, 0xb3, 0x19, 0x54, 0xec, 0x75, 0x43, 0x01, 0x3d, 0xaf, 0x5c, + 0x5d, 0xbf, 0xb3, 0x5f, 0x9e, 0x50, 0xe8, 0x9b, 0x89, 0xeb, 0xeb, 0xa2, 0x69, 0x6d, 0x21, 0x7b, + 0x0a, 0xf5, 0xd1, 0xba, 0xb5, 0x85, 0x69, 0x63, 0x71, 0x11, 0x86, 0x6d, 0xbf, 0xc9, 0x95, 0x85, + 0x11, 0x4a, 0x18, 0x81, 0x00, 0x18, 0x2f, 0xaa, 0x02, 0xc0, 0x6e, 0xc2, 0xa8, 0xf8, 0xe3, 0x8e, + 0xdb, 0xa1, 0xb7, 0x02, 0x16, 0x5f, 0xce, 0x10, 0xda, 0xf1, 0xda, 0x3b, 0xfa, 0xfd, 0xac, 0xc9, + 0x9d, 0x96, 0xdb, 0x31, 0x44, 0x21, 0x89, 0x68, 0xdc, 0xf3, 0x8a, 0xfd, 0xef, 0x79, 0xb9, 0x23, + 0xef, 0x79, 0xdb, 0x00, 0x35, 0x6f, 0xa7, 0xed, 0xb5, 0x77, 0x2a, 0xcd, 0x1d, 0x72, 0x18, 0xbe, + 0xd8, 0x7f, 0x14, 0x2e, 0x25, 0xc8, 0x38, 0x71, 0x9f, 0xc7, 0x07, 0x3d, 0x09, 0x73, 0xdc, 0xe6, + 0x8e, 0xe1, 0xd8, 0xa0, 0x71, 0x66, 0xeb, 0x00, 0x95, 0x7a, 0xe4, 0x3d, 0x12, 0x53, 0x38, 0x24, + 0xb9, 0x45, 0x7d, 0xf2, 0x72, 0xe5, 0x36, 0xdf, 0xab, 0xf1, 0x28, 0x79, 0x1a, 0x71, 0x11, 0x55, + 0xac, 0x04, 0xc3, 0x6a, 0x3d, 0xe1, 0xc0, 0x3a, 0x70, 0xa2, 0xd2, 0x68, 0x78, 0xa2, 0x0d, 0x6e, + 0x13, 0xdf, 0xfa, 0x78, 0x03, 0x59, 0x4f, 0x64, 0xb3, 0xbe, 0x48, 0xac, 0x5f, 0x74, 0x63, 0x2a, + 0x27, 0x92, 0x64, 0xe9, 0x6a, 0xb2, 0x19, 0x5b, 0x35, 0x98, 0x32, 0x1b, 0x6f, 0x3a, 0x3a, 0x4f, + 0x40, 0xd1, 0xae, 0x55, 0x9c, 0xda, 0xcd, 0xca, 0x95, 0x52, 0x8e, 0x95, 0x60, 0x82, 0x7e, 0x2d, + 0x3a, 0x8b, 0x6f, 0x5e, 0x2b, 0xe5, 0x0d, 0xc8, 0x9b, 0x57, 0x16, 0x4b, 0x85, 0x85, 0xfc, 0x7c, + 0x2e, 0xe5, 0x63, 0x34, 0x5a, 0x2a, 0x4a, 0x25, 0x98, 0xf5, 0xcb, 0x39, 0x28, 0xaa, 0x6f, 0x67, + 0xd7, 0xa0, 0x50, 0xab, 0xdd, 0x4c, 0x79, 0x05, 0x25, 0xa7, 0x8c, 0xdc, 0x4f, 0xc3, 0x50, 0x37, + 0xfd, 0x14, 0x04, 0x82, 0x6e, 0x73, 0xad, 0x46, 0xc2, 0x81, 0xa2, 0x4b, 0x36, 0x6f, 0x49, 0x97, + 0xe1, 0x2a, 0x71, 0x0d, 0x0a, 0xb7, 0x1e, 0x6c, 0xd2, 0xad, 0x42, 0xd1, 0x25, 0xfb, 0xa9, 0xa4, + 0xfb, 0xf0, 0xb1, 0xbe, 0xcb, 0x0b, 0x02, 0xcb, 0x86, 0x71, 0x6d, 0x22, 0xcb, 0x43, 0xb7, 0xe5, + 0xc7, 0xde, 0xbd, 0x74, 0xe8, 0x0a, 0x88, 0x4d, 0x25, 0x42, 0x46, 0x58, 0xf3, 0xeb, 0x6e, 0x93, + 0x4e, 0x6f, 0x94, 0x11, 0x9a, 0x02, 0x60, 0x4b, 0xb8, 0xf5, 0x9b, 0x39, 0x28, 0xa1, 0x24, 0x85, + 0xa6, 0x9b, 0xfe, 0x43, 0xde, 0xbe, 0x7f, 0x85, 0xbd, 0xa1, 0x96, 0x5c, 0x2e, 0x56, 0x38, 0x0c, + 0xe3, 0x92, 0x4b, 0xbd, 0x58, 0xd0, 0xb2, 0xd3, 0x1c, 0xa8, 0xf3, 0x83, 0x3b, 0x5e, 0x1e, 0xe1, + 0x40, 0x5d, 0x86, 0x61, 0xfc, 0x1c, 0xda, 0x1c, 0xf1, 0xcb, 0x23, 0x01, 0xb0, 0x25, 0x5c, 0xdb, + 0x9b, 0x7e, 0x32, 0xdf, 0xd3, 0x86, 0xc5, 0x4f, 0x94, 0xf3, 0xa2, 0xd9, 0xb8, 0x81, 0xf6, 0xeb, + 0x0f, 0x60, 0x2e, 0xdd, 0x25, 0xa8, 0x0c, 0xaa, 0xc0, 0xb4, 0x09, 0x57, 0x7a, 0xa1, 0x53, 0x99, + 0x75, 0xdd, 0x5f, 0xb4, 0xd3, 0xf8, 0xd6, 0xff, 0x9a, 0x83, 0x31, 0xfc, 0xd3, 0xee, 0x36, 0xd1, + 0x84, 0xa6, 0xf2, 0xa0, 0x46, 0x8a, 0x5f, 0x5d, 0x98, 0x73, 0x1f, 0x87, 0x0e, 0xe9, 0x86, 0x8d, + 0x3d, 0x26, 0x46, 0x26, 0x52, 0xa9, 0xd1, 0x55, 0xca, 0x91, 0x98, 0x54, 0xaa, 0x7e, 0xc3, 0x14, + 0x29, 0x21, 0xa3, 0xe1, 0xdd, 0x83, 0x9a, 0x98, 0x7e, 0xfa, 0x9b, 0x36, 0xd2, 0xf9, 0x4d, 0xd3, + 0xf0, 0x4e, 0xa2, 0xe1, 0x93, 0xf6, 0x83, 0x5a, 0xc5, 0x5e, 0x37, 0x9e, 0xb4, 0xc5, 0x37, 0x1a, + 0x76, 0xe2, 0x84, 0x64, 0xfd, 0x13, 0x48, 0x77, 0x20, 0x1d, 0x78, 0xc7, 0x5c, 0x1b, 0x6f, 0xc3, + 0x70, 0xa5, 0xd9, 0xf4, 0x1f, 0xd3, 0x2e, 0xa1, 0x74, 0x53, 0x71, 0xff, 0xc9, 0xf3, 0x0c, 0xd5, + 0x2b, 0x86, 0x43, 0x96, 0x00, 0xb0, 0x65, 0x18, 0xab, 0x3c, 0xa8, 0x55, 0xab, 0x2b, 0x9b, 0x9b, + 0xd2, 0xf9, 0xa4, 0xb0, 0xf4, 0x8a, 0xea, 0x1f, 0xcf, 0x6b, 0x38, 0xe9, 0x57, 0xd5, 0x44, 0x7e, + 0x4f, 0xe8, 0xd8, 0xbb, 0x00, 0xb7, 0x7c, 0xaf, 0x2d, 0xd5, 0x49, 0xd4, 0xf8, 0x33, 0x07, 0xfb, + 0xe5, 0xf1, 0x0f, 0x7d, 0xaf, 0x4d, 0xfa, 0x27, 0xf1, 0xed, 0x09, 0x92, 0xad, 0xfd, 0x2d, 0x7a, + 0x7a, 0xc9, 0x97, 0x66, 0x31, 0xc3, 0x49, 0x4f, 0x6f, 0xf9, 0x3d, 0x16, 0x31, 0x0a, 0x8d, 0xb5, + 0x60, 0xba, 0xd6, 0xdd, 0xd9, 0xe1, 0x62, 0x67, 0x27, 0x05, 0xca, 0x08, 0xdd, 0x71, 0xe3, 0x90, + 0x1f, 0xf2, 0x3e, 0x22, 0x6e, 0x29, 0xe1, 0xd2, 0xeb, 0x62, 0x22, 0x7f, 0x7b, 0xbf, 0x4c, 0xaf, + 0xb5, 0x42, 0x54, 0x0b, 0x15, 0x7d, 0xaf, 0xfa, 0x24, 0xcd, 0x9b, 0xdd, 0x85, 0x91, 0x1b, 0x5e, + 0x74, 0xb3, 0xbb, 0x45, 0xce, 0x14, 0x2f, 0x1e, 0xb2, 0x68, 0x24, 0xa2, 0x7c, 0x2e, 0xd8, 0xf1, + 0xa2, 0xdd, 0xae, 0x6e, 0xce, 0x4e, 0x6c, 0xd8, 0x03, 0x28, 0x2e, 0x7b, 0x41, 0xbd, 0xc9, 0x97, + 0xab, 0x74, 0xf6, 0xbf, 0x74, 0x08, 0x4b, 0x85, 0x2a, 0xfb, 0xa5, 0x8e, 0xbf, 0xea, 0x9e, 0x2e, + 0x0b, 0x28, 0x0c, 0xf6, 0x6f, 0xe7, 0xe0, 0xf9, 0xf8, 0xeb, 0x2b, 0x3b, 0xbc, 0x1d, 0xdd, 0x71, + 0xa3, 0xfa, 0x2e, 0x0f, 0xa8, 0x97, 0xc6, 0x0e, 0xeb, 0xa5, 0xcf, 0xf7, 0xf4, 0xd2, 0x85, 0xa4, + 0x97, 0x5c, 0xc1, 0xcc, 0x69, 0x49, 0x6e, 0xbd, 0x7d, 0x76, 0x58, 0xad, 0xcc, 0x01, 0x48, 0xde, + 0x7f, 0xc8, 0x19, 0xef, 0x95, 0x43, 0x1a, 0x9c, 0x20, 0x93, 0x11, 0x7d, 0xfc, 0xdb, 0xb0, 0x02, + 0x8b, 0xa1, 0xec, 0xb6, 0xf2, 0x5c, 0x92, 0x52, 0xc9, 0xb9, 0x43, 0x78, 0x4b, 0x6f, 0xa6, 0xd9, + 0x43, 0x7c, 0x14, 0xe5, 0x68, 0xaf, 0xb9, 0x5b, 0x24, 0x88, 0x1c, 0x31, 0xda, 0x6b, 0x6e, 0x32, + 0xda, 0x4d, 0x37, 0x3d, 0xda, 0x6b, 0xee, 0x16, 0x5b, 0x96, 0xee, 0x96, 0xd2, 0x37, 0xef, 0xec, + 0x61, 0xdc, 0x96, 0x37, 0xe4, 0xc9, 0x9c, 0xe1, 0x76, 0xf9, 0x65, 0x18, 0xab, 0x75, 0xdc, 0x3a, + 0x6f, 0x7a, 0xdb, 0x11, 0x3d, 0x08, 0xbe, 0x7c, 0x08, 0xab, 0x18, 0x97, 0x1e, 0x93, 0xd4, 0x4f, + 0xfd, 0x9a, 0x14, 0xe3, 0x88, 0x2f, 0xdc, 0xdc, 0xb8, 0x33, 0x3f, 0x7d, 0xe4, 0x17, 0x6e, 0x6e, + 0xdc, 0x21, 0x99, 0xa3, 0xd3, 0x32, 0x64, 0x8e, 0x8d, 0x3b, 0xac, 0x03, 0x53, 0x9b, 0x3c, 0x08, + 0xdc, 0x6d, 0x3f, 0x68, 0x49, 0x85, 0x9d, 0xf4, 0xf7, 0xb8, 0x78, 0x18, 0x3f, 0x83, 0x40, 0x6a, + 0x6a, 0x23, 0x05, 0x73, 0xd2, 0x5a, 0xbe, 0x14, 0x7f, 0xeb, 0xd7, 0x0a, 0x70, 0xaa, 0xcf, 0x57, + 0xb2, 0x75, 0xb5, 0x2b, 0xe6, 0x0c, 0xcd, 0x6a, 0x1f, 0xf4, 0x4b, 0x47, 0x6e, 0x94, 0x6b, 0x50, + 0x5a, 0xbd, 0x8d, 0xe2, 0xb4, 0xd4, 0x79, 0x2f, 0x57, 0xd4, 0x79, 0x82, 0xda, 0x3f, 0xfe, 0x10, + 0x4d, 0xd8, 0x94, 0xae, 0xbc, 0x6e, 0xf8, 0x6a, 0xf6, 0x50, 0x2e, 0x7c, 0x7f, 0x1e, 0x86, 0xf0, + 0x6c, 0x4b, 0x45, 0xa8, 0xc9, 0x1d, 0x2b, 0x42, 0xcd, 0x17, 0x60, 0x62, 0xf5, 0xb6, 0xbc, 0xec, + 0xde, 0x74, 0xc3, 0x5d, 0xda, 0x79, 0xf1, 0x45, 0x98, 0x3f, 0x74, 0xe8, 0x6e, 0xbc, 0xeb, 0x1a, + 0x62, 0xa5, 0x41, 0xc1, 0xee, 0xc1, 0xac, 0xfc, 0x36, 0x6f, 0xdb, 0xab, 0xcb, 0x40, 0x17, 0x9e, + 0xdb, 0xa4, 0x6d, 0xf8, 0xa5, 0x83, 0xfd, 0x72, 0x99, 0x3f, 0x44, 0xe3, 0x3c, 0x2a, 0x77, 0x42, + 0x44, 0xd0, 0xad, 0xf4, 0x32, 0xe8, 0x75, 0xef, 0x7b, 0x7b, 0x0c, 0x2b, 0x14, 0xb5, 0x89, 0xba, + 0x05, 0xae, 0x44, 0xb2, 0x7e, 0x75, 0x18, 0x16, 0xfa, 0xef, 0xa0, 0xec, 0x8b, 0xe6, 0x00, 0x9e, + 0x3f, 0x72, 0xcf, 0x3d, 0x7a, 0x0c, 0xbf, 0x04, 0x73, 0xab, 0xed, 0x88, 0x07, 0x9d, 0xc0, 0x53, + 0xf1, 0x16, 0x6e, 0xfa, 0xa1, 0x32, 0x86, 0x44, 0xab, 0x44, 0x1e, 0x97, 0x93, 0x5e, 0x12, 0x4d, + 0x33, 0x35, 0x56, 0x99, 0x1c, 0xd8, 0x2a, 0x4c, 0x69, 0xf0, 0x66, 0x77, 0x87, 0x64, 0x06, 0xf9, + 0xf4, 0xa0, 0xf1, 0x6c, 0x76, 0x75, 0x4b, 0xb1, 0x14, 0xd1, 0xc2, 0x2f, 0x14, 0x68, 0x5a, 0xbc, + 0x04, 0x85, 0x5a, 0x77, 0x8b, 0xa6, 0x83, 0xbc, 0x1c, 0x18, 0x07, 0x89, 0x28, 0x65, 0x9f, 0x03, + 0xb0, 0x79, 0xc7, 0x0f, 0xbd, 0xc8, 0x0f, 0xf6, 0x74, 0xb7, 0x9d, 0x20, 0x86, 0x9a, 0x96, 0xc5, + 0x0a, 0xca, 0x6e, 0xc2, 0x74, 0xf2, 0xeb, 0xee, 0xe3, 0x36, 0x29, 0x53, 0xc7, 0xa4, 0x16, 0x23, + 0x21, 0x77, 0x7c, 0x51, 0xa6, 0x1f, 0x8d, 0x29, 0x32, 0xb6, 0x08, 0xc5, 0x07, 0x7e, 0xf0, 0x70, + 0x5b, 0x0c, 0xd4, 0x50, 0x72, 0x78, 0x3f, 0x26, 0x98, 0x7e, 0x48, 0x29, 0x3c, 0x31, 0xe7, 0x57, + 0xdb, 0x8f, 0xbc, 0xc0, 0x6f, 0xb7, 0x78, 0x3b, 0xd2, 0x5f, 0xcb, 0x79, 0x02, 0x36, 0x1c, 0x26, + 0x13, 0xb0, 0xb8, 0xab, 0x57, 0xea, 0x91, 0x1f, 0xd0, 0x53, 0xb9, 0x1c, 0x6e, 0x01, 0x30, 0x86, + 0x5b, 0x00, 0x44, 0x27, 0xda, 0x7c, 0x9b, 0x9e, 0x0d, 0xb0, 0x13, 0x03, 0xbe, 0x6d, 0x78, 0x83, + 0xf2, 0x6d, 0x21, 0x7c, 0xd8, 0x7c, 0x1b, 0x15, 0x0c, 0x46, 0x10, 0xa5, 0xed, 0x1e, 0xd5, 0x14, + 0xa1, 0x59, 0xbf, 0x33, 0xd6, 0x77, 0xde, 0x8a, 0xdd, 0xfe, 0x78, 0xf3, 0x76, 0xcd, 0x1d, 0x60, + 0xde, 0xbe, 0x1e, 0xdb, 0x2b, 0xeb, 0x2e, 0xd0, 0x08, 0xd1, 0x8f, 0x1b, 0x89, 0xb3, 0xf0, 0x8b, + 0xc5, 0xe3, 0x4c, 0x22, 0xea, 0xa4, 0xfc, 0xa0, 0x9d, 0x54, 0x18, 0xa8, 0x93, 0xd8, 0x12, 0x4c, + 0xc6, 0x61, 0xb8, 0x36, 0xdc, 0xc8, 0xd8, 0x9b, 0xe2, 0xd8, 0x69, 0x4e, 0xc7, 0x8d, 0xf4, 0xbd, + 0xc9, 0x24, 0x61, 0xef, 0xc0, 0x38, 0x19, 0xed, 0x23, 0x87, 0xe1, 0xc4, 0x6c, 0x52, 0x59, 0xf8, + 0xa7, 0xe8, 0x75, 0x74, 0xb1, 0x24, 0x37, 0xbc, 0x0e, 0x6f, 0x7a, 0x6d, 0x5e, 0x43, 0x6d, 0x3d, + 0xcd, 0x18, 0x5c, 0x92, 0x1d, 0x2a, 0x71, 0xa4, 0x22, 0xdf, 0xd0, 0xd3, 0x19, 0x44, 0xe9, 0xc9, + 0x3a, 0x7a, 0xac, 0xc9, 0x2a, 0xad, 0x96, 0x82, 0x35, 0x7f, 0xc7, 0x53, 0x76, 0x9a, 0xca, 0x6a, + 0x29, 0x70, 0x9a, 0x02, 0x9a, 0xb2, 0x5a, 0x92, 0xa8, 0xe2, 0x26, 0x21, 0x7e, 0x54, 0x57, 0xe8, + 0x89, 0x0a, 0x6f, 0x12, 0x48, 0x64, 0x1a, 0xc7, 0x4a, 0x24, 0x55, 0xcd, 0x6a, 0xcb, 0xf5, 0x9a, + 0xe4, 0xe9, 0x9a, 0x54, 0xc3, 0x05, 0x34, 0x5d, 0x0d, 0xa2, 0xb2, 0x3a, 0x4c, 0xd8, 0x7c, 0x7b, + 0x23, 0xf0, 0x23, 0x5e, 0x8f, 0x78, 0x83, 0xa4, 0x27, 0x75, 0x81, 0x58, 0xf2, 0x7d, 0x29, 0x19, + 0x2e, 0xbd, 0xf1, 0x3b, 0xfb, 0xe5, 0xdc, 0xb7, 0xf7, 0xcb, 0x20, 0x40, 0xd2, 0xf2, 0xfa, 0x60, + 0xbf, 0x7c, 0x4a, 0x8c, 0x7f, 0x47, 0x11, 0xeb, 0x47, 0x8c, 0xce, 0x94, 0x7d, 0xaf, 0xd8, 0x74, + 0xe3, 0x2e, 0x49, 0x2a, 0x9b, 0xe8, 0x53, 0xd9, 0x9b, 0x99, 0x95, 0x95, 0xb5, 0xde, 0xce, 0xac, + 0x34, 0xb3, 0x12, 0xf6, 0x2e, 0x8c, 0x2f, 0x57, 0x97, 0xfd, 0xf6, 0xb6, 0xb7, 0x53, 0xbb, 0x59, + 0x41, 0x11, 0x8c, 0xac, 0xee, 0xeb, 0x9e, 0x53, 0x47, 0xb8, 0x13, 0xee, 0xba, 0x86, 0xf3, 0x55, + 0x82, 0xcf, 0x6e, 0xc0, 0x94, 0xfa, 0x69, 0xf3, 0xed, 0x7b, 0x76, 0x15, 0x25, 0x2f, 0xe5, 0xea, + 0x10, 0x73, 0x10, 0x1d, 0xd1, 0x0d, 0x74, 0x89, 0x3c, 0x45, 0x26, 0x26, 0xe3, 0x0a, 0xef, 0x34, + 0xfd, 0x3d, 0xf1, 0x79, 0x9b, 0x1e, 0x0f, 0x50, 0xd6, 0xa2, 0xc9, 0xd8, 0x88, 0x4b, 0x9c, 0xc8, + 0x33, 0xb6, 0xdb, 0x14, 0x11, 0x5b, 0x87, 0x19, 0x9a, 0xe2, 0xf7, 0xbd, 0xd0, 0xdb, 0xf2, 0x9a, + 0x5e, 0xb4, 0x87, 0x52, 0x16, 0x49, 0x21, 0x6a, 0x5d, 0x3c, 0x8a, 0x4b, 0x35, 0x66, 0xbd, 0xa4, + 0xd6, 0x2f, 0xe7, 0xe1, 0x85, 0xc3, 0x6e, 0x1c, 0xac, 0x66, 0x6e, 0x66, 0x17, 0x06, 0xb8, 0xa5, + 0x1c, 0xbd, 0x9d, 0xad, 0xc2, 0xd4, 0xdd, 0x60, 0xc7, 0x6d, 0x7b, 0xdf, 0xc4, 0x9b, 0x64, 0x6c, + 0xbc, 0x85, 0x9d, 0xe1, 0x6b, 0x25, 0xe6, 0x6c, 0x4f, 0x11, 0x2d, 0x3c, 0xa2, 0x6d, 0xee, 0xa3, + 0xba, 0x01, 0x5d, 0x83, 0xb1, 0x65, 0xbf, 0x1d, 0xf1, 0x27, 0x51, 0xca, 0xe9, 0x55, 0x02, 0xd3, + 0x2e, 0x50, 0x0a, 0xd5, 0xfa, 0x57, 0x79, 0x38, 0x73, 0xa8, 0xc8, 0xcd, 0x36, 0xcd, 0x5e, 0xbb, + 0x38, 0x88, 0x9c, 0x7e, 0x74, 0xb7, 0x2d, 0xf6, 0xd8, 0x19, 0x1d, 0x69, 0x65, 0xbf, 0xf0, 0xdf, + 0xe6, 0xa8, 0x93, 0x3e, 0x0d, 0xa3, 0x58, 0x55, 0xdc, 0x45, 0x52, 0x1b, 0x85, 0xbb, 0xb0, 0x67, + 0x6a, 0xa3, 0x24, 0x1a, 0xbb, 0x0a, 0xc5, 0x65, 0xb7, 0xd9, 0xd4, 0x5c, 0x82, 0xf1, 0x26, 0x51, + 0x47, 0x58, 0xca, 0x2c, 0x4d, 0x21, 0xb2, 0xb7, 0x00, 0xe4, 0xdf, 0xda, 0x59, 0x81, 0x9b, 0x25, + 0x91, 0xa5, 0x8e, 0x0b, 0x0d, 0x19, 0x03, 0x09, 0xd6, 0xfd, 0xd8, 0xe9, 0x50, 0x06, 0x12, 0x14, + 0x00, 0x23, 0x90, 0xa0, 0x00, 0x58, 0xbf, 0x52, 0x80, 0xb3, 0x87, 0xdf, 0x1b, 0xd9, 0x3d, 0x73, + 0x08, 0x5e, 0x1b, 0xe8, 0xb6, 0x79, 0xf4, 0x18, 0xa8, 0xb0, 0x9c, 0xb2, 0x43, 0x2e, 0xf4, 0x1a, + 0xc3, 0x7f, 0x67, 0xbf, 0xac, 0xd9, 0x3a, 0xde, 0xf2, 0xbd, 0xb6, 0xf6, 0x36, 0xf1, 0x0d, 0x80, + 0x5a, 0xe4, 0x46, 0x5e, 0xfd, 0xd6, 0x83, 0xdb, 0x2a, 0x6a, 0xc5, 0xb5, 0xc1, 0xbe, 0x2c, 0xa1, + 0x93, 0xfb, 0x0a, 0xf9, 0xe1, 0x20, 0xd4, 0xf9, 0xf0, 0xf1, 0x43, 0xe3, 0x66, 0x9c, 0x20, 0x2f, + 0x7c, 0x1e, 0x4a, 0x69, 0x52, 0x76, 0x1e, 0x86, 0xf0, 0x03, 0x34, 0x8b, 0xfe, 0x14, 0x07, 0x2c, + 0x5f, 0xb8, 0x43, 0x73, 0x07, 0xbd, 0xa4, 0xf1, 0x41, 0xdc, 0xd4, 0xc1, 0x91, 0x97, 0xb4, 0x7c, + 0x4f, 0xef, 0xd5, 0xc3, 0xa5, 0x88, 0xac, 0x3f, 0xcf, 0xc1, 0xe9, 0xbe, 0x37, 0x72, 0xb6, 0x61, + 0x0e, 0xd8, 0x2b, 0x47, 0x5d, 0xe1, 0x8f, 0x1c, 0xab, 0x85, 0x1f, 0x55, 0x73, 0xff, 0x3d, 0x98, + 0xa8, 0x75, 0xb7, 0xd2, 0x97, 0x2c, 0x19, 0xc3, 0x40, 0x83, 0xeb, 0x27, 0x98, 0x8e, 0x2f, 0xda, + 0xaf, 0x5e, 0xfc, 0xc9, 0xb2, 0x44, 0xb3, 0xb2, 0x8a, 0xdd, 0xf8, 0x7a, 0xbd, 0xc4, 0x4d, 0x22, + 0xeb, 0x97, 0xf2, 0xd9, 0xb7, 0x55, 0x71, 0xbb, 0x3f, 0xc6, 0x6d, 0xf5, 0xc6, 0xf2, 0xc6, 0xd1, + 0x6d, 0xff, 0xa7, 0xaa, 0xed, 0xf8, 0x00, 0x4a, 0x3b, 0x9e, 0x52, 0x28, 0xd2, 0x03, 0xa8, 0xda, + 0x1d, 0x43, 0xf3, 0x01, 0x54, 0x21, 0xb3, 0x37, 0x61, 0x6c, 0xcd, 0x97, 0x0e, 0xdc, 0xaa, 0xc5, + 0xd2, 0xcf, 0x4d, 0x01, 0xf5, 0xed, 0x31, 0xc6, 0x14, 0x77, 0x0b, 0x73, 0xe0, 0x95, 0x31, 0x19, + 0xde, 0x2d, 0x52, 0xd3, 0xc5, 0x54, 0xbb, 0x99, 0x64, 0xd6, 0x7f, 0x32, 0x0c, 0xd6, 0xd1, 0x4a, + 0x03, 0xf6, 0x81, 0xd9, 0x77, 0x97, 0x06, 0x56, 0x37, 0x0c, 0xb4, 0xe5, 0x56, 0xba, 0x0d, 0x8f, + 0xb7, 0xeb, 0xa6, 0xf7, 0x35, 0xc1, 0xf4, 0x2d, 0x50, 0xe1, 0x7d, 0x14, 0x67, 0xa8, 0x85, 0xff, + 0xaa, 0x90, 0x2c, 0xb5, 0xd4, 0xd1, 0x98, 0xfb, 0x08, 0x47, 0x23, 0xbb, 0x0d, 0x25, 0x1d, 0xa2, + 0xbd, 0x84, 0xa2, 0xe4, 0x62, 0x30, 0x4a, 0x7d, 0x54, 0x0f, 0xa1, 0x79, 0xbe, 0x16, 0x06, 0x3f, + 0x5f, 0x13, 0xf1, 0x1d, 0xeb, 0x1f, 0xea, 0x15, 0xdf, 0xd3, 0x0e, 0x8f, 0x1a, 0xba, 0xf2, 0xd6, + 0x0e, 0xe9, 0xd0, 0x1a, 0x36, 0xbd, 0xb5, 0x33, 0x0e, 0x2e, 0x1d, 0x5d, 0x39, 0x9c, 0xe3, 0x4f, + 0xcd, 0xdf, 0x32, 0x76, 0x38, 0x97, 0xf4, 0x59, 0x0e, 0xe7, 0x31, 0x89, 0x38, 0x00, 0xed, 0x6e, + 0x5b, 0x46, 0xac, 0x1d, 0x4d, 0x0e, 0xc0, 0xa0, 0xdb, 0x76, 0xd2, 0x51, 0x6b, 0x63, 0x44, 0xeb, + 0x47, 0xf3, 0x30, 0x25, 0x37, 0x5c, 0xf9, 0x94, 0xf1, 0xcc, 0x3e, 0x13, 0xbd, 0x6d, 0x3c, 0x13, + 0xa9, 0x10, 0x3d, 0x7a, 0xd3, 0x06, 0x7a, 0x24, 0xda, 0x05, 0xd6, 0x4b, 0xc3, 0x6c, 0x98, 0xd0, + 0xa1, 0x87, 0xbf, 0x0f, 0x5d, 0x49, 0xa2, 0x39, 0xd1, 0x79, 0x87, 0x8f, 0x74, 0xa1, 0x6d, 0xf0, + 0xb0, 0x7e, 0x24, 0x0f, 0x93, 0xda, 0xa3, 0xfe, 0x33, 0xdb, 0xf1, 0x9f, 0x37, 0x3a, 0x7e, 0x3e, + 0x76, 0xfa, 0x88, 0x5b, 0x36, 0x50, 0xbf, 0x77, 0x61, 0xa6, 0x87, 0x24, 0x6d, 0x1b, 0x91, 0x1b, + 0xc4, 0x36, 0xe2, 0xf5, 0xde, 0xd0, 0x30, 0x32, 0xc2, 0x72, 0x1c, 0x28, 0x40, 0x8f, 0x45, 0xf3, + 0xe3, 0x79, 0x98, 0xa3, 0x5f, 0x18, 0x4b, 0x4d, 0x4a, 0x1c, 0xcf, 0xec, 0x58, 0x54, 0x8c, 0xb1, + 0x28, 0x9b, 0x63, 0xa1, 0x35, 0xb0, 0xff, 0x90, 0x58, 0x3f, 0x00, 0x30, 0xdf, 0x8f, 0x60, 0x60, + 0xdf, 0xca, 0xc4, 0x73, 0x25, 0x3f, 0x80, 0xe7, 0xca, 0x1a, 0x94, 0xb0, 0x2a, 0x8a, 0x96, 0x14, + 0x8a, 0x7b, 0x6b, 0x21, 0xb9, 0x24, 0xca, 0x80, 0x77, 0x14, 0xbd, 0x29, 0x4c, 0x5d, 0x5c, 0x7b, + 0x28, 0xd9, 0x2f, 0xe4, 0x60, 0x0a, 0x81, 0xab, 0x8f, 0x78, 0x3b, 0x42, 0x66, 0x43, 0xe4, 0x68, + 0x11, 0xbf, 0x22, 0xd5, 0xa2, 0xc0, 0x6b, 0xef, 0xd0, 0x33, 0xd2, 0x16, 0x3d, 0x23, 0xbd, 0x23, + 0x9f, 0xbf, 0x2e, 0xd5, 0xfd, 0xd6, 0xe5, 0x9d, 0xc0, 0x7d, 0xe4, 0x49, 0x7b, 0x15, 0xb7, 0x79, + 0x39, 0x09, 0xf0, 0xdf, 0xf1, 0x52, 0x21, 0xfb, 0x89, 0x15, 0x3e, 0xd1, 0xc9, 0x0f, 0xe5, 0x58, + 0x6d, 0xfa, 0x7e, 0x6d, 0x7e, 0x11, 0xfb, 0x1e, 0x38, 0x25, 0x63, 0x98, 0x88, 0x6b, 0x9a, 0xd7, + 0xee, 0xfa, 0xdd, 0x70, 0xc9, 0xad, 0x3f, 0x14, 0xb2, 0x9a, 0x74, 0x16, 0xc3, 0x96, 0xd7, 0xe3, + 0x42, 0x67, 0x4b, 0x96, 0x1a, 0xce, 0xb1, 0xd9, 0x0c, 0xd8, 0x4d, 0x98, 0x91, 0x45, 0x95, 0x6e, + 0xe4, 0xd7, 0xea, 0x6e, 0xd3, 0x6b, 0xef, 0xe0, 0x81, 0x50, 0x94, 0xe7, 0x91, 0xdb, 0x8d, 0x7c, + 0x27, 0x94, 0x70, 0xfd, 0xba, 0xdd, 0x43, 0xc4, 0xaa, 0x30, 0x6d, 0x73, 0xb7, 0x71, 0xc7, 0x7d, + 0xb2, 0xec, 0x76, 0xdc, 0xba, 0xb8, 0xbc, 0x17, 0xf1, 0xc9, 0x15, 0x4f, 0xe5, 0x80, 0xbb, 0x0d, + 0xa7, 0xe5, 0x3e, 0x71, 0xea, 0x54, 0x68, 0xea, 0x5d, 0x0d, 0xba, 0x98, 0x95, 0xd7, 0x8e, 0x59, + 0x8d, 0xa5, 0x59, 0x79, 0xed, 0xfe, 0xac, 0x12, 0x3a, 0xc5, 0x6a, 0xd3, 0x0d, 0x76, 0x78, 0x24, + 0xcd, 0x3d, 0xe1, 0x5c, 0xee, 0x42, 0x4e, 0x63, 0x15, 0x61, 0x99, 0x83, 0xa6, 0x9f, 0x69, 0x56, + 0x1a, 0x9d, 0x98, 0x79, 0x0f, 0x02, 0x2f, 0xe2, 0x7a, 0x0b, 0xc7, 0xf1, 0xb3, 0xb0, 0xff, 0xd1, + 0x50, 0xb6, 0x5f, 0x13, 0x7b, 0x28, 0x13, 0x6e, 0x5a, 0x23, 0x27, 0x7a, 0xb8, 0x65, 0xb7, 0xb2, + 0x87, 0x32, 0xe6, 0xa6, 0xb7, 0x73, 0x12, 0xdb, 0xa9, 0x71, 0xeb, 0xd3, 0xd0, 0x1e, 0x4a, 0xb6, + 0x2e, 0x3a, 0x2d, 0xe2, 0x6d, 0x31, 0xa3, 0xc9, 0xdc, 0x75, 0x0a, 0x3f, 0xed, 0x65, 0xb2, 0xd9, + 0x2a, 0x05, 0xaa, 0xd8, 0xc9, 0x30, 0x7e, 0x4d, 0x13, 0xb3, 0xbf, 0x06, 0xd3, 0xf7, 0x42, 0x7e, + 0xbd, 0xba, 0x51, 0x53, 0x21, 0x4f, 0x50, 0x43, 0x34, 0xb5, 0x78, 0xe5, 0x88, 0x4d, 0xe7, 0x92, + 0x4e, 0x83, 0x71, 0xf6, 0xe5, 0xb8, 0x75, 0x43, 0xee, 0x6c, 0x7b, 0x9d, 0x30, 0x8e, 0x1f, 0xa5, + 0x8f, 0x5b, 0xaa, 0x2a, 0xeb, 0x26, 0xcc, 0xf4, 0xb0, 0x61, 0x53, 0x00, 0x02, 0xe8, 0xdc, 0x5b, + 0xaf, 0xad, 0x6e, 0x96, 0x9e, 0x63, 0x25, 0x98, 0xc0, 0xdf, 0xab, 0xeb, 0x95, 0xa5, 0xb5, 0xd5, + 0x95, 0x52, 0x8e, 0xcd, 0xc0, 0x24, 0x42, 0x56, 0xaa, 0x35, 0x09, 0xca, 0xcb, 0x28, 0xcb, 0x76, + 0x49, 0x2e, 0xdd, 0x48, 0x2c, 0x00, 0x3c, 0x53, 0xac, 0xbf, 0x97, 0x87, 0xd3, 0xea, 0x58, 0xe1, + 0x91, 0x10, 0xc1, 0xbc, 0xf6, 0xce, 0x33, 0x7e, 0x3a, 0x5c, 0x37, 0x4e, 0x87, 0x97, 0x53, 0x27, + 0x75, 0xaa, 0x95, 0x87, 0x1c, 0x11, 0xbf, 0x31, 0x06, 0x67, 0x0e, 0xa5, 0x62, 0x5f, 0x14, 0xa7, + 0xb9, 0xc7, 0xdb, 0x51, 0xb5, 0xd1, 0xe4, 0x9b, 0x5e, 0x8b, 0xfb, 0xdd, 0x88, 0xcc, 0xab, 0x5f, + 0x42, 0xa5, 0x0c, 0x16, 0x3a, 0x5e, 0xa3, 0xc9, 0x9d, 0x48, 0x16, 0x1b, 0xd3, 0xad, 0x97, 0x5a, + 0xb0, 0x8c, 0x73, 0x7e, 0x54, 0xdb, 0x11, 0x0f, 0x1e, 0xa1, 0x09, 0x57, 0xcc, 0xf2, 0x21, 0xe7, + 0x1d, 0xc7, 0x15, 0xa5, 0x8e, 0x47, 0xc5, 0x26, 0xcb, 0x1e, 0x6a, 0x76, 0x5d, 0x63, 0xb9, 0x2c, + 0xae, 0x70, 0x77, 0xdc, 0x27, 0x64, 0x53, 0x42, 0x21, 0xf4, 0x62, 0x96, 0xd2, 0x9f, 0xb3, 0xe5, + 0x3e, 0xb1, 0x7b, 0x49, 0xd8, 0x57, 0xe1, 0x04, 0x1d, 0x40, 0xe4, 0x8f, 0xaf, 0x5a, 0x2c, 0xbd, + 0xfd, 0x5f, 0x3d, 0xd8, 0x2f, 0x9f, 0x52, 0xc1, 0x07, 0x55, 0x04, 0x86, 0xac, 0x56, 0x67, 0x73, + 0x61, 0x9b, 0xe2, 0x40, 0x4e, 0x75, 0xc7, 0x1d, 0x1e, 0x86, 0xca, 0xd1, 0x88, 0xae, 0x37, 0x7a, + 0x67, 0x3a, 0x2d, 0x59, 0x6e, 0xf7, 0xa5, 0x64, 0x37, 0x61, 0xea, 0x01, 0xdf, 0xd2, 0xc7, 0x67, + 0x24, 0xde, 0xaa, 0x4a, 0x8f, 0xf9, 0x56, 0xff, 0xc1, 0x49, 0xd1, 0x31, 0x0f, 0x95, 0xbc, 0x4f, + 0xf6, 0xd6, 0xbc, 0x30, 0xe2, 0x6d, 0x1e, 0x60, 0x9c, 0x97, 0x51, 0xdc, 0x0c, 0xe6, 0x13, 0x09, + 0xd9, 0x2c, 0x5f, 0x7a, 0xf1, 0x60, 0xbf, 0x7c, 0x46, 0x7a, 0xec, 0x35, 0x09, 0xee, 0xa4, 0x32, + 0x66, 0xf4, 0x72, 0x65, 0x5f, 0x87, 0x69, 0xdb, 0xef, 0x46, 0x5e, 0x7b, 0xa7, 0x16, 0x05, 0x6e, + 0xc4, 0x77, 0xe4, 0x81, 0x94, 0x04, 0x94, 0x49, 0x95, 0xd2, 0xfb, 0xa0, 0x04, 0x3a, 0x21, 0x41, + 0x8d, 0x13, 0xc1, 0x24, 0x60, 0x5f, 0x83, 0x29, 0xe9, 0x89, 0x1d, 0x57, 0x30, 0x66, 0x44, 0xfb, + 0x36, 0x0b, 0xef, 0x5f, 0x21, 0x13, 0x00, 0x84, 0x66, 0x55, 0x90, 0xe2, 0xc6, 0xbe, 0x4c, 0x9d, + 0xb5, 0xe1, 0xb5, 0x77, 0xe2, 0x69, 0x0c, 0xd8, 0xf3, 0x6f, 0x24, 0x5d, 0xd2, 0x11, 0x9f, 0xab, + 0xa6, 0x71, 0x1f, 0x7b, 0xa6, 0x5e, 0x3e, 0x2c, 0x82, 0x33, 0x95, 0x30, 0xf4, 0xc2, 0x88, 0x9c, + 0x10, 0x56, 0x9f, 0xf0, 0x7a, 0x57, 0x20, 0x8b, 0x8b, 0x22, 0x0f, 0xa4, 0x11, 0xec, 0xf0, 0xd2, + 0xa5, 0x83, 0xfd, 0xf2, 0x6b, 0x2e, 0x22, 0x3a, 0xe4, 0xb7, 0xe0, 0x70, 0x85, 0xea, 0x3c, 0x96, + 0xb8, 0x5a, 0x1b, 0x0e, 0x67, 0xca, 0xbe, 0x06, 0x27, 0x97, 0xdd, 0x90, 0x57, 0xdb, 0x21, 0x6f, + 0x87, 0x5e, 0xe4, 0x3d, 0xe2, 0xd4, 0xa9, 0x78, 0xf8, 0x15, 0x31, 0xb7, 0x88, 0x55, 0x77, 0x43, + 0xb1, 0x30, 0x63, 0x14, 0x87, 0x06, 0x45, 0xab, 0xa6, 0x0f, 0x17, 0x66, 0xc3, 0x54, 0xad, 0x76, + 0x73, 0xc5, 0x73, 0xe3, 0x75, 0x35, 0x89, 0xfd, 0xf5, 0x1a, 0xea, 0x67, 0xc2, 0x5d, 0xa7, 0xe1, + 0xb9, 0xf1, 0x82, 0xea, 0xd3, 0x59, 0x29, 0x0e, 0xd6, 0x7e, 0x0e, 0x4a, 0xe9, 0xa1, 0x64, 0x5f, + 0x82, 0x31, 0x69, 0x0c, 0xc4, 0xc3, 0x5d, 0x72, 0x4c, 0x56, 0xb6, 0x25, 0x31, 0xdc, 0x24, 0x22, + 0xa7, 0x20, 0x69, 0x6a, 0xc4, 0x75, 0xbb, 0x05, 0x74, 0x0a, 0x52, 0x44, 0xac, 0x01, 0x13, 0x72, + 0xb4, 0x38, 0x46, 0x93, 0x22, 0x9b, 0xd0, 0x17, 0xf5, 0xd5, 0x41, 0x45, 0x29, 0xfe, 0xf8, 0xf4, + 0x43, 0x73, 0x42, 0x22, 0x18, 0x55, 0x18, 0x5c, 0x97, 0x00, 0x8a, 0x8a, 0xd0, 0x3a, 0x0d, 0xa7, + 0xfa, 0x7c, 0xb3, 0xf5, 0x08, 0x9f, 0x83, 0xfb, 0xd4, 0xc8, 0xbe, 0x04, 0x73, 0x48, 0xb8, 0xec, + 0xb7, 0xdb, 0xbc, 0x1e, 0xe1, 0x76, 0xa4, 0x54, 0xa8, 0x05, 0x69, 0x73, 0x20, 0xdb, 0x5b, 0x8f, + 0x11, 0x9c, 0xb4, 0x26, 0x35, 0x93, 0x83, 0xf5, 0x33, 0x79, 0x98, 0xa7, 0x1d, 0xce, 0xe6, 0x75, + 0x3f, 0x68, 0x3c, 0xfb, 0x27, 0xea, 0xaa, 0x71, 0xa2, 0xbe, 0x14, 0x47, 0xa2, 0xc8, 0x6a, 0xe4, + 0x21, 0x07, 0xea, 0x2f, 0xe5, 0xe0, 0x85, 0xc3, 0x88, 0x44, 0xef, 0xc4, 0xd1, 0xb3, 0xc6, 0x7a, + 0xa2, 0x64, 0x75, 0x60, 0x16, 0x07, 0x74, 0x79, 0x97, 0xd7, 0x1f, 0x86, 0x37, 0xfd, 0x30, 0x42, + 0xb3, 0xf4, 0x7c, 0x9f, 0x07, 0xcb, 0xd7, 0x33, 0x1f, 0x2c, 0x4f, 0xca, 0x59, 0x56, 0x47, 0x1e, + 0x32, 0xbe, 0xd7, 0x43, 0xbe, 0x17, 0xda, 0x59, 0xac, 0xd1, 0xbc, 0xb8, 0xd2, 0x8d, 0x76, 0x37, + 0x02, 0xbe, 0xcd, 0x03, 0xde, 0xae, 0xf3, 0x4f, 0x98, 0x79, 0xb1, 0xd9, 0xb8, 0x81, 0x34, 0x18, + 0xff, 0x74, 0x12, 0xe6, 0xb2, 0xc8, 0x44, 0xbf, 0x68, 0x97, 0xe6, 0x74, 0xea, 0xb3, 0xbf, 0x95, + 0x83, 0x89, 0x1a, 0xaf, 0xfb, 0xed, 0xc6, 0x75, 0x34, 0x0b, 0xa1, 0xde, 0x71, 0xa4, 0xd0, 0x20, + 0xe0, 0xce, 0x76, 0xca, 0x5e, 0xe4, 0x3b, 0xfb, 0xe5, 0x2f, 0x0c, 0x76, 0x57, 0xad, 0xfb, 0x18, + 0x4d, 0x22, 0xc2, 0xd0, 0xdc, 0x71, 0x15, 0xf8, 0xc2, 0x63, 0x54, 0xca, 0x96, 0x60, 0x92, 0x96, + 0xab, 0xaf, 0x07, 0x4f, 0x93, 0xc1, 0x3a, 0x54, 0x41, 0x8f, 0xfe, 0xd1, 0x20, 0x61, 0x57, 0xa1, + 0x70, 0x6f, 0xf1, 0x3a, 0x8d, 0x81, 0x0a, 0x6e, 0x7e, 0x6f, 0xf1, 0x3a, 0xaa, 0xc3, 0xc4, 0x15, + 0x63, 0xb2, 0xbb, 0x68, 0x58, 0x6a, 0xdc, 0x5b, 0xbc, 0xce, 0xfe, 0x06, 0x9c, 0x58, 0xf1, 0x42, + 0xaa, 0x42, 0x1a, 0xba, 0x37, 0xd0, 0xbd, 0x6b, 0xa4, 0xcf, 0xec, 0xfd, 0x6c, 0xe6, 0xec, 0x7d, + 0xb1, 0x11, 0x33, 0x71, 0xa4, 0x15, 0x7d, 0x23, 0x1d, 0x24, 0x2e, 0xbb, 0x1e, 0xf6, 0x21, 0x4c, + 0xa1, 0xee, 0x1c, 0x6d, 0xff, 0x31, 0xbc, 0xef, 0x68, 0x9f, 0x9a, 0x3f, 0x9d, 0x59, 0xf3, 0x82, + 0x74, 0x12, 0x47, 0x0f, 0x02, 0x0c, 0x05, 0x6c, 0xdc, 0xfa, 0x0d, 0xce, 0xec, 0x16, 0x4c, 0x93, + 0xf8, 0x75, 0x77, 0x7b, 0x73, 0x97, 0xaf, 0xb8, 0x7b, 0x64, 0x64, 0x81, 0x37, 0x3a, 0x92, 0xd9, + 0x1c, 0x7f, 0xdb, 0x89, 0x76, 0xb9, 0xd3, 0x70, 0x0d, 0x41, 0x25, 0x45, 0xc8, 0xbe, 0x17, 0xc6, + 0xd7, 0xfc, 0xba, 0x90, 0xbc, 0x71, 0x67, 0x90, 0x76, 0x17, 0x1f, 0x60, 0x72, 0x2d, 0x09, 0x4e, + 0x89, 0x53, 0xdf, 0xd9, 0x2f, 0xbf, 0x7d, 0xdc, 0x49, 0xa3, 0x55, 0x60, 0xeb, 0xb5, 0xb1, 0x65, + 0x28, 0x3e, 0xe0, 0x5b, 0xa2, 0xb5, 0xe9, 0xc4, 0x3b, 0x0a, 0x4c, 0x66, 0x55, 0xf4, 0xcb, 0x30, + 0xab, 0x22, 0x18, 0x0b, 0x60, 0x06, 0xfb, 0x67, 0xc3, 0x0d, 0xc3, 0xc7, 0x7e, 0xd0, 0xc0, 0x08, + 0xeb, 0xfd, 0x4c, 0x3a, 0x16, 0x33, 0x3b, 0xff, 0x05, 0xd9, 0xf9, 0x1d, 0x8d, 0x83, 0x2e, 0x40, + 0xf6, 0xb0, 0x67, 0x5f, 0x87, 0x29, 0xf2, 0x6c, 0xbe, 0x73, 0xbd, 0x82, 0xab, 0x72, 0xc2, 0x70, + 0x92, 0x33, 0x0b, 0xa5, 0x94, 0x4a, 0x8e, 0xd2, 0x4a, 0x03, 0xe5, 0xb4, 0xb6, 0x5d, 0xf3, 0xd5, + 0x4c, 0x27, 0x61, 0x1b, 0x30, 0xbe, 0xc2, 0x1f, 0x79, 0x75, 0x8e, 0x8e, 0x3c, 0x64, 0x44, 0x1b, + 0x67, 0x0e, 0x49, 0x4a, 0xa4, 0x2e, 0xa6, 0x81, 0x00, 0xe9, 0x16, 0x64, 0x5a, 0x4d, 0xc6, 0x88, + 0xec, 0x1a, 0x14, 0xaa, 0x2b, 0x1b, 0x64, 0x43, 0xab, 0x7c, 0x63, 0xaa, 0x8d, 0x0d, 0x95, 0x67, + 0x01, 0x8d, 0xa0, 0xbc, 0x86, 0x61, 0x81, 0x5b, 0x5d, 0xd9, 0x60, 0xdb, 0x30, 0x89, 0x1d, 0x70, + 0x93, 0xbb, 0xb2, 0x6f, 0xa7, 0xfb, 0xf4, 0xed, 0xa5, 0xcc, 0xbe, 0x9d, 0x97, 0x7d, 0xbb, 0x4b, + 0xd4, 0x46, 0xe0, 0x78, 0x9d, 0xad, 0x10, 0x69, 0x29, 0x99, 0x85, 0x0a, 0x77, 0xbe, 0xb9, 0x86, + 0x46, 0x1e, 0x24, 0xd2, 0xaa, 0xdc, 0x17, 0x71, 0xfc, 0xf5, 0xbe, 0x26, 0xfa, 0xbd, 0x7c, 0xd8, + 0xe7, 0x61, 0xe8, 0xee, 0xc3, 0xc8, 0x9d, 0x9f, 0x31, 0xfa, 0x51, 0x80, 0x54, 0xf3, 0x51, 0x0b, + 0xe9, 0x3f, 0x34, 0xc2, 0x08, 0x21, 0x8d, 0x18, 0x8a, 0x9b, 0x6e, 0xd0, 0x78, 0xec, 0x06, 0xe8, + 0x4d, 0x39, 0x6b, 0xb0, 0xd0, 0x4a, 0xe4, 0x50, 0xec, 0x12, 0x20, 0xe5, 0x62, 0xa9, 0xb3, 0x60, + 0xdf, 0x03, 0xa7, 0x43, 0x6f, 0xa7, 0xed, 0x46, 0xdd, 0x80, 0x3b, 0x6e, 0x73, 0xc7, 0x0f, 0xbc, + 0x68, 0xb7, 0xe5, 0x84, 0x5d, 0x2f, 0xe2, 0xf3, 0x73, 0x46, 0xea, 0xcb, 0x9a, 0xc2, 0xab, 0x28, + 0xb4, 0x9a, 0xc0, 0xb2, 0x4f, 0x85, 0xd9, 0x05, 0xec, 0xcb, 0x30, 0xa9, 0x6f, 0xc9, 0xe1, 0xfc, + 0x89, 0x73, 0x85, 0x0b, 0x53, 0xf1, 0xc5, 0x23, 0xbd, 0x81, 0xab, 0x90, 0x91, 0xda, 0x09, 0x11, + 0x9a, 0x21, 0x23, 0x35, 0x5e, 0x71, 0x32, 0x29, 0x56, 0x9a, 0xb5, 0x67, 0x68, 0xc6, 0x52, 0x2f, + 0xdf, 0xb9, 0x5e, 0xb1, 0x47, 0x37, 0xaa, 0xf7, 0x6b, 0x4d, 0x3f, 0xb2, 0xfe, 0x8b, 0x1c, 0x6e, + 0xe2, 0xec, 0x35, 0x8c, 0x7e, 0x12, 0x3f, 0xe7, 0xa1, 0xfe, 0xd6, 0xed, 0xa4, 0xe2, 0x0d, 0x4b, + 0x14, 0xf6, 0x3a, 0x8c, 0x5c, 0x77, 0xeb, 0x3c, 0x52, 0x8f, 0xae, 0x88, 0xbc, 0x8d, 0x10, 0x5d, + 0xd9, 0x2b, 0x71, 0x84, 0x7c, 0x29, 0x27, 0x77, 0x25, 0xc9, 0x8e, 0xba, 0x5c, 0x51, 0x6f, 0xae, + 0x28, 0x5f, 0xd2, 0xa2, 0xd0, 0xd2, 0xa7, 0xa6, 0xec, 0x93, 0x33, 0x39, 0x58, 0x7f, 0x9a, 0x4b, + 0x76, 0x25, 0xf6, 0x2a, 0x0c, 0xd9, 0x1b, 0xf1, 0xf7, 0x4b, 0x0f, 0xc9, 0xd4, 0xe7, 0x23, 0x02, + 0xfb, 0x32, 0x9c, 0xd0, 0xf8, 0xf4, 0x18, 0x4b, 0xbf, 0x82, 0x0e, 0x7c, 0xda, 0x97, 0x64, 0x5b, + 0x4c, 0x67, 0xf3, 0x40, 0x61, 0x3a, 0x29, 0x58, 0xe1, 0x6d, 0x4f, 0xf2, 0xd6, 0x1a, 0xab, 0xf3, + 0x6e, 0x20, 0x42, 0xba, 0xb1, 0x59, 0x1c, 0xa4, 0xff, 0x9e, 0xf5, 0xeb, 0x39, 0x63, 0xb7, 0x89, + 0xd3, 0x50, 0xe6, 0x8e, 0x48, 0x43, 0xf9, 0x16, 0x40, 0xa5, 0x1b, 0xf9, 0xab, 0xed, 0xc0, 0x6f, + 0x4a, 0x2d, 0x0a, 0x85, 0xdc, 0x46, 0xdd, 0x30, 0x47, 0xb0, 0xe1, 0x66, 0x14, 0x23, 0x67, 0xda, + 0x95, 0x17, 0x3e, 0xaa, 0x5d, 0xb9, 0xf5, 0xbb, 0x39, 0x63, 0x8d, 0x0a, 0x29, 0x91, 0xa6, 0xa2, + 0x6e, 0xf6, 0xd3, 0xf1, 0x1e, 0x39, 0x61, 0xd3, 0xd7, 0x77, 0x48, 0x85, 0xc6, 0xfe, 0xcd, 0x1c, + 0x9c, 0x94, 0x06, 0xda, 0xeb, 0xdd, 0xd6, 0x16, 0x0f, 0xee, 0xbb, 0x4d, 0xaf, 0x21, 0xbd, 0x54, + 0xa5, 0x00, 0x7c, 0xa1, 0x77, 0xc1, 0x67, 0xe3, 0xcb, 0x8b, 0xaa, 0x34, 0x18, 0x77, 0xda, 0x58, + 0xe8, 0x3c, 0x8a, 0x4b, 0xf5, 0x8b, 0x6a, 0x36, 0xbd, 0xf5, 0xcb, 0x39, 0x78, 0xf1, 0xc8, 0x5a, + 0xd8, 0x65, 0x18, 0x55, 0xb1, 0xce, 0x73, 0xd8, 0xf1, 0x68, 0x2c, 0xd9, 0x1b, 0xe7, 0x5c, 0x61, + 0xb1, 0xaf, 0xc0, 0x09, 0x9d, 0xd5, 0x66, 0xe0, 0x7a, 0x7a, 0x44, 0xf1, 0x8c, 0xaf, 0x8e, 0x04, + 0x4a, 0x5a, 0x5a, 0xcb, 0x66, 0x62, 0xfd, 0x7f, 0x39, 0x2d, 0x31, 0xed, 0x33, 0x2a, 0xc3, 0x5f, + 0x33, 0x64, 0x78, 0x15, 0x77, 0x2e, 0x6e, 0x95, 0x28, 0xcb, 0xbc, 0x77, 0x4d, 0x6b, 0x46, 0xbf, + 0x08, 0xf8, 0xa1, 0x3c, 0x8c, 0xdf, 0x0b, 0x79, 0x20, 0x1f, 0x72, 0x3f, 0x59, 0xf1, 0xc5, 0xe2, + 0x76, 0x0d, 0x14, 0x01, 0xea, 0x8f, 0x73, 0xa8, 0xe0, 0xd7, 0x29, 0x44, 0x6f, 0x68, 0xc9, 0xa8, + 0xb0, 0x37, 0x30, 0x0d, 0x15, 0x42, 0x65, 0xe0, 0xa1, 0x35, 0x33, 0x2f, 0x1d, 0x26, 0x27, 0x5c, + 0x63, 0x5f, 0x80, 0xe1, 0x7b, 0xa8, 0xae, 0x34, 0x23, 0x12, 0xc4, 0xfc, 0xb1, 0x50, 0x6e, 0xd2, + 0xdd, 0xd0, 0x0c, 0x96, 0x24, 0x09, 0x59, 0x0d, 0x46, 0x97, 0x03, 0x8e, 0x69, 0x66, 0x87, 0x06, + 0xf7, 0xa7, 0xad, 0x4b, 0x92, 0xb4, 0x3f, 0x2d, 0x71, 0xb2, 0x7e, 0x3a, 0x0f, 0x2c, 0x69, 0x23, + 0xe6, 0x54, 0x09, 0x9f, 0xd9, 0x41, 0x7f, 0xdf, 0x18, 0xf4, 0x33, 0x3d, 0x83, 0x2e, 0x9b, 0x37, + 0xd0, 0xd8, 0xff, 0x66, 0x0e, 0x4e, 0x66, 0x13, 0xb2, 0x97, 0x60, 0xe4, 0xee, 0xe6, 0x86, 0x0a, + 0x6a, 0x41, 0x4d, 0xf1, 0x3b, 0xa8, 0x2b, 0xb0, 0xa9, 0x88, 0xbd, 0x01, 0x23, 0x5f, 0xb4, 0x97, + 0xc5, 0x39, 0xa4, 0x45, 0xed, 0xfe, 0x46, 0xe0, 0xd4, 0xcd, 0xa3, 0x88, 0x90, 0xf4, 0xb1, 0x2d, + 0x3c, 0xb5, 0xb1, 0xfd, 0xf1, 0x3c, 0x4c, 0x57, 0xea, 0x75, 0x1e, 0x86, 0x42, 0xda, 0xe1, 0x61, + 0xf4, 0xcc, 0x0e, 0x6c, 0x76, 0xb8, 0x0a, 0xa3, 0x6d, 0x03, 0x8d, 0xea, 0x6f, 0xe7, 0xe0, 0x84, + 0xa2, 0x7a, 0xe4, 0xf1, 0xc7, 0x9b, 0xbb, 0x01, 0x0f, 0x77, 0xfd, 0x66, 0x63, 0xe0, 0xd4, 0x00, + 0x42, 0xd0, 0xc3, 0x78, 0xbf, 0xfa, 0xab, 0xfe, 0x36, 0x42, 0x0c, 0x41, 0x4f, 0xc6, 0x04, 0xbe, + 0x0c, 0xa3, 0x95, 0x4e, 0x27, 0xf0, 0x1f, 0xc9, 0x65, 0x4f, 0xe1, 0xd0, 0x5c, 0x09, 0x32, 0xdc, + 0x91, 0x25, 0x48, 0x7c, 0xc6, 0x0a, 0x6f, 0xcb, 0x40, 0x5f, 0x93, 0xf2, 0x33, 0x1a, 0xbc, 0xad, + 0xcb, 0xe2, 0x58, 0x6e, 0xd5, 0x80, 0x6d, 0x04, 0x7e, 0xcb, 0x8f, 0x78, 0x43, 0xb6, 0x07, 0xbd, + 0xb8, 0x8f, 0x0c, 0x0c, 0xb4, 0xe9, 0x45, 0x4d, 0x23, 0x30, 0x50, 0x24, 0x00, 0xb6, 0x84, 0x5b, + 0xff, 0xd7, 0x30, 0x4c, 0xe8, 0xbd, 0xc3, 0x2c, 0x19, 0xef, 0xdb, 0x0f, 0xf4, 0x50, 0x02, 0x2e, + 0x42, 0x6c, 0x2a, 0x49, 0xe2, 0x70, 0xe4, 0x8f, 0x8c, 0xc3, 0xf1, 0x00, 0x26, 0x37, 0x02, 0x1f, + 0xe3, 0xb6, 0xc9, 0xf4, 0xe3, 0x72, 0x2b, 0x9c, 0xd5, 0xee, 0x9d, 0x62, 0x20, 0xf1, 0x3d, 0x14, + 0x25, 0xfb, 0x0e, 0x61, 0x3b, 0xe9, 0xe4, 0xe4, 0x26, 0x1f, 0x69, 0x6a, 0xe1, 0x86, 0x14, 0x7c, + 0x31, 0x36, 0xb5, 0x10, 0x10, 0xd3, 0xd4, 0x42, 0x40, 0xf4, 0xb5, 0x36, 0xfc, 0xb4, 0xd6, 0x1a, + 0xfb, 0xe9, 0x1c, 0x8c, 0x57, 0xda, 0x6d, 0x8a, 0xef, 0x71, 0x84, 0x6b, 0xf3, 0x57, 0xc8, 0xda, + 0xe2, 0xed, 0x8f, 0x64, 0x6d, 0x81, 0x72, 0x4b, 0x88, 0x92, 0x6a, 0x52, 0xa1, 0x7e, 0x5b, 0xd3, + 0xbe, 0x83, 0xbd, 0x0d, 0xa5, 0x78, 0x92, 0x57, 0xdb, 0x0d, 0xfe, 0x84, 0xcb, 0x7c, 0x49, 0x93, + 0x14, 0x76, 0x55, 0x97, 0x4c, 0xd3, 0x88, 0x6c, 0x13, 0xc0, 0x8d, 0x67, 0x57, 0x2a, 0xf1, 0x5b, + 0xef, 0xf4, 0x23, 0xe9, 0x19, 0x7f, 0xe3, 0x83, 0x96, 0x2e, 0x3d, 0x27, 0x7c, 0x58, 0x0b, 0xa6, + 0x65, 0xd6, 0x35, 0xcc, 0xc6, 0x8e, 0xd1, 0xc5, 0xe1, 0xc8, 0x71, 0x78, 0x95, 0xf4, 0x67, 0xcf, + 0x53, 0x2e, 0x37, 0x4c, 0xf0, 0xee, 0x64, 0x84, 0x1a, 0x4f, 0xf3, 0x96, 0x41, 0x6e, 0xed, 0x53, + 0xbd, 0xdf, 0x2b, 0x27, 0xfd, 0x8f, 0xe7, 0xe0, 0xa4, 0x3e, 0xe9, 0x6b, 0xdd, 0xad, 0x96, 0x87, + 0x97, 0x42, 0x76, 0x09, 0xc6, 0x68, 0x4e, 0xc6, 0x97, 0xa8, 0xde, 0x20, 0xe9, 0x09, 0x0a, 0x5b, + 0x15, 0xd3, 0x50, 0xf0, 0x20, 0xa9, 0x7b, 0x36, 0xb5, 0x4f, 0x89, 0xa2, 0x24, 0xa3, 0x67, 0x80, + 0xbf, 0xcd, 0xf9, 0x29, 0x20, 0xd6, 0x7b, 0x30, 0x63, 0x8e, 0x44, 0x8d, 0x47, 0xec, 0x22, 0x8c, + 0xaa, 0xe1, 0xcb, 0x65, 0x0f, 0x9f, 0x2a, 0xb7, 0x1e, 0x00, 0xeb, 0xa1, 0x0f, 0xd1, 0x2c, 0x8a, + 0x47, 0xca, 0x6c, 0x4f, 0x3d, 0x4a, 0xf6, 0x20, 0x2e, 0xcd, 0xd2, 0xf7, 0x8d, 0x1b, 0xb6, 0xe5, + 0x82, 0xd4, 0xfa, 0xd3, 0x29, 0x98, 0xcd, 0xd8, 0x73, 0x8f, 0x90, 0x89, 0xca, 0xe6, 0x06, 0x31, + 0x16, 0x47, 0x46, 0x50, 0xdb, 0xc2, 0x7b, 0x30, 0x7c, 0xe4, 0x76, 0x20, 0x3d, 0x0b, 0x52, 0xbb, + 0x80, 0x24, 0xfb, 0xae, 0xc8, 0x45, 0x7a, 0xf0, 0x92, 0xe1, 0xa7, 0x16, 0xbc, 0x64, 0x09, 0x26, + 0xa9, 0x55, 0xb4, 0x5d, 0x69, 0x16, 0xae, 0x81, 0x2c, 0x70, 0x7a, 0xb6, 0x2d, 0x93, 0x44, 0xf2, + 0x08, 0xfd, 0xe6, 0x23, 0x4e, 0x3c, 0x46, 0x75, 0x1e, 0x58, 0x90, 0xc9, 0x43, 0x23, 0x61, 0xff, + 0x11, 0x66, 0x7c, 0x42, 0x88, 0xbe, 0x67, 0x15, 0x0f, 0xdb, 0xb3, 0x1a, 0x4f, 0x67, 0xcf, 0x3a, + 0xa3, 0xbe, 0x31, 0x7b, 0xef, 0xca, 0xf8, 0x2c, 0xf6, 0x8b, 0x39, 0x98, 0x91, 0x11, 0x34, 0xf4, + 0x8f, 0x3d, 0x34, 0x2a, 0x42, 0xfd, 0xe9, 0x7c, 0xec, 0x0b, 0x94, 0xe9, 0x24, 0xfb, 0x5b, 0x7b, + 0x3f, 0x8a, 0x7d, 0x0f, 0x40, 0xbc, 0xa2, 0x64, 0xa0, 0xc9, 0xf1, 0xc5, 0x17, 0x32, 0x76, 0x81, + 0x18, 0x29, 0x89, 0xca, 0x1e, 0xc5, 0x74, 0x46, 0x9e, 0xaf, 0x18, 0xca, 0xfe, 0x06, 0xcc, 0x89, + 0xf5, 0x12, 0x43, 0x28, 0xde, 0xcf, 0xfc, 0x38, 0xd6, 0xf2, 0x99, 0xfe, 0x32, 0xd1, 0xa5, 0x2c, + 0x32, 0x19, 0x96, 0x34, 0x49, 0xb9, 0x1a, 0xe9, 0xa1, 0x01, 0x32, 0x2b, 0xc2, 0x30, 0x5a, 0xf8, + 0xf5, 0x32, 0x72, 0x7a, 0x9f, 0xfd, 0xed, 0xb4, 0x5a, 0x0b, 0x72, 0x7f, 0x0b, 0x4d, 0x47, 0x53, + 0x04, 0xb1, 0x2f, 0x02, 0x8b, 0x43, 0x4f, 0x48, 0x18, 0x57, 0x51, 0xd5, 0xa5, 0xba, 0x39, 0x09, + 0x61, 0x11, 0xa8, 0x62, 0x7d, 0x92, 0xf4, 0x12, 0x33, 0x0e, 0x73, 0xd4, 0x68, 0x01, 0x55, 0xe9, + 0x98, 0xc2, 0xf9, 0x29, 0x23, 0x9a, 0x52, 0x52, 0x92, 0xe4, 0x66, 0xd5, 0x72, 0x3a, 0x19, 0x2a, + 0xa7, 0x2c, 0x76, 0xec, 0x1a, 0x8c, 0xa1, 0xb7, 0xe7, 0x4d, 0x65, 0xec, 0x45, 0x86, 0x27, 0xe8, + 0x17, 0xea, 0xec, 0x9a, 0x26, 0x5b, 0x09, 0xaa, 0xb8, 0x0e, 0xac, 0x04, 0x7b, 0x76, 0xb7, 0x8d, + 0x4a, 0x61, 0xd2, 0x77, 0x34, 0x82, 0x3d, 0x27, 0xe8, 0x9a, 0xee, 0xc0, 0x88, 0xc4, 0xbe, 0x0e, + 0xe3, 0x77, 0xdc, 0x27, 0x4a, 0x27, 0x4c, 0x8a, 0xdf, 0xc3, 0x76, 0x20, 0x4b, 0xb5, 0xa6, 0xe5, + 0x3e, 0x71, 0x1a, 0xdd, 0x74, 0x50, 0x54, 0xdc, 0x86, 0x74, 0x96, 0xec, 0xab, 0x00, 0x9a, 0xa6, + 0x9a, 0x1d, 0x59, 0xc1, 0x8b, 0x2a, 0x46, 0x58, 0xa6, 0x06, 0x1b, 0xf9, 0x6b, 0x0c, 0x53, 0x92, + 0xc3, 0xdc, 0x77, 0x4f, 0x72, 0x38, 0xf1, 0xdd, 0x93, 0x1c, 0x16, 0xb6, 0xe0, 0x74, 0xdf, 0xa5, + 0x93, 0x11, 0xba, 0xf5, 0xb2, 0x19, 0xba, 0xf5, 0x74, 0xbf, 0x23, 0x36, 0x34, 0x03, 0xf1, 0xcf, + 0x96, 0xe6, 0xfa, 0x4b, 0x27, 0xdf, 0xce, 0xa7, 0x8e, 0x5c, 0xba, 0x58, 0xc8, 0xc4, 0x2d, 0xfd, + 0x64, 0x92, 0x3c, 0xe6, 0xea, 0x94, 0x87, 0x72, 0x3e, 0xb9, 0xd0, 0xa4, 0xd2, 0x9b, 0xcb, 0xe3, + 0xf9, 0xe3, 0x9e, 0xbe, 0xef, 0xc0, 0x94, 0x4c, 0xaf, 0x77, 0x9b, 0xef, 0x3d, 0xf6, 0x83, 0x86, + 0xca, 0x61, 0x8d, 0x32, 0x78, 0x4f, 0x6e, 0xdc, 0x14, 0x2e, 0x5b, 0x51, 0x0e, 0x84, 0xc3, 0x58, + 0xfb, 0xe9, 0xcc, 0x5d, 0x4c, 0x20, 0x1c, 0xe6, 0x5b, 0xc8, 0xde, 0x8c, 0x05, 0x35, 0x1e, 0xe8, + 0xe1, 0xf8, 0x03, 0x05, 0xcc, 0x90, 0xd7, 0x78, 0x60, 0xfd, 0x61, 0x01, 0x98, 0xac, 0x69, 0xd9, + 0xed, 0xb8, 0xe8, 0x5e, 0xeb, 0x61, 0x60, 0x9a, 0x12, 0xe1, 0xb8, 0x5b, 0x4d, 0xae, 0x47, 0x75, + 0x22, 0xe3, 0xda, 0xb8, 0xcc, 0x49, 0x5f, 0x74, 0x7a, 0x08, 0xfb, 0x6c, 0x75, 0xf9, 0x8f, 0xb3, + 0xd5, 0x7d, 0x1d, 0x9e, 0xaf, 0x74, 0x30, 0x4f, 0xa7, 0xaa, 0xe5, 0xba, 0x1f, 0xa8, 0x4d, 0xca, + 0x70, 0xdc, 0x72, 0x63, 0xb4, 0x9e, 0x2f, 0x3d, 0x8c, 0x85, 0x26, 0xa7, 0x88, 0x79, 0xd9, 0x89, + 0xf4, 0x40, 0x00, 0x4a, 0x4e, 0xe9, 0x60, 0x49, 0x86, 0x9c, 0x22, 0x49, 0x14, 0x0f, 0x2f, 0x50, + 0x72, 0x0a, 0x26, 0xa0, 0x49, 0x78, 0x78, 0x01, 0xef, 0x23, 0xeb, 0xc4, 0x24, 0xec, 0x1d, 0x18, + 0xaf, 0x74, 0x23, 0x9f, 0x18, 0x93, 0x55, 0x78, 0x62, 0xbf, 0x4d, 0x9f, 0x62, 0x5c, 0x7d, 0x12, + 0x74, 0xeb, 0x4f, 0x0a, 0x70, 0xba, 0x77, 0x78, 0xa9, 0x34, 0x5e, 0x1f, 0xb9, 0x23, 0xd6, 0x47, + 0xd6, 0x6c, 0xc8, 0x27, 0xe1, 0xd1, 0x9f, 0xc6, 0x6c, 0x90, 0xe9, 0x3e, 0x3f, 0xe2, 0x6c, 0xa8, + 0xc1, 0xb8, 0x7e, 0xde, 0x0d, 0x7d, 0xd4, 0xf3, 0x4e, 0xe7, 0x22, 0x2e, 0xf5, 0x32, 0xfe, 0xc1, + 0x70, 0xf2, 0x74, 0x94, 0x0e, 0x7d, 0x20, 0x31, 0xd8, 0xbf, 0x01, 0xe7, 0xe4, 0x9e, 0x94, 0x6e, + 0xec, 0xd2, 0x9e, 0xe2, 0x48, 0x03, 0xb7, 0x78, 0xb0, 0x5f, 0xbe, 0x24, 0x55, 0x25, 0x4e, 0x4f, + 0xb7, 0x39, 0x5b, 0x7b, 0x8e, 0xfa, 0x32, 0xad, 0x92, 0x23, 0x79, 0x63, 0x8e, 0x4f, 0x2d, 0xff, + 0xe2, 0x1b, 0x59, 0xee, 0x32, 0x32, 0x3a, 0xb1, 0x04, 0x9b, 0x9e, 0x32, 0x4a, 0x1d, 0x96, 0xcf, + 0x54, 0x87, 0x29, 0x7d, 0x4a, 0x21, 0x53, 0x9f, 0xb2, 0x02, 0xd3, 0xb5, 0xee, 0x96, 0xaa, 0x3b, + 0xed, 0x2f, 0x17, 0x76, 0xb7, 0xb2, 0x1a, 0x94, 0x26, 0xb1, 0x7e, 0x38, 0x0f, 0x13, 0x1b, 0xcd, + 0xee, 0x8e, 0xd7, 0x5e, 0x71, 0x23, 0xf7, 0x99, 0xd5, 0xd0, 0xbd, 0x65, 0x68, 0xe8, 0x62, 0xaf, + 0xb0, 0xb8, 0x61, 0x03, 0xa9, 0xe7, 0x7e, 0x2a, 0x07, 0xd3, 0x09, 0x89, 0x3c, 0x67, 0x6f, 0xc2, + 0x90, 0xf8, 0x41, 0xf7, 0xd6, 0x73, 0x3d, 0x8c, 0x65, 0xd2, 0xaf, 0xf8, 0x2f, 0xd2, 0x99, 0x99, + 0x19, 0x75, 0x90, 0xc3, 0xc2, 0x67, 0x61, 0x2c, 0x61, 0x7b, 0x9c, 0x64, 0x5f, 0xbf, 0x92, 0x83, + 0x52, 0xba, 0x25, 0xec, 0x36, 0x8c, 0x0a, 0x4e, 0x1e, 0x57, 0x57, 0xea, 0x97, 0xfb, 0xb4, 0xf9, + 0x12, 0xa1, 0xc9, 0xcf, 0xc3, 0xce, 0xe7, 0x12, 0x62, 0x2b, 0x0e, 0x0b, 0x36, 0x4c, 0xe8, 0x58, + 0x19, 0x5f, 0xf7, 0xba, 0x29, 0x5c, 0x9c, 0xcc, 0xee, 0x07, 0x23, 0x45, 0x99, 0xf1, 0xd5, 0x24, + 0x37, 0x9c, 0x37, 0x26, 0x17, 0xf6, 0x55, 0x6a, 0xde, 0xc8, 0x69, 0xb6, 0x98, 0x04, 0x4c, 0xd7, + 0xe7, 0x59, 0xc6, 0x84, 0x8e, 0xf1, 0xd8, 0xeb, 0x30, 0x22, 0xeb, 0xd3, 0x53, 0xf5, 0x74, 0x10, + 0xa2, 0x8b, 0xb8, 0x12, 0xc7, 0xfa, 0xfb, 0x05, 0x38, 0x99, 0x7c, 0xde, 0xbd, 0x4e, 0xc3, 0x8d, + 0xf8, 0x86, 0x1b, 0xb8, 0xad, 0xf0, 0x88, 0x15, 0x70, 0xa1, 0xe7, 0xd3, 0x30, 0x75, 0x8b, 0xfa, + 0x34, 0xed, 0x83, 0xac, 0xd4, 0x07, 0xa1, 0xfa, 0x52, 0x7e, 0x90, 0xfa, 0x0c, 0x76, 0x1b, 0x0a, + 0x35, 0x1e, 0xd1, 0xb6, 0x79, 0xbe, 0xa7, 0x57, 0xf5, 0xef, 0xba, 0x54, 0xe3, 0x91, 0x1c, 0x44, + 0x19, 0x97, 0x87, 0x1b, 0x91, 0x58, 0x6b, 0x3c, 0x62, 0x0f, 0x60, 0x64, 0xf5, 0x49, 0x87, 0xd7, + 0x23, 0x4a, 0x55, 0x77, 0xf1, 0x70, 0x7e, 0x12, 0x57, 0xcb, 0x54, 0xc7, 0x11, 0xa0, 0x77, 0x96, + 0x44, 0x59, 0xb8, 0x06, 0x45, 0x55, 0xf9, 0x71, 0x66, 0xee, 0xc2, 0x5b, 0x30, 0xae, 0x55, 0x72, + 0xac, 0x49, 0xff, 0x73, 0x62, 0x5f, 0xf5, 0x9b, 0x2a, 0xbb, 0xdd, 0x6a, 0x8f, 0x98, 0x97, 0xd3, + 0xb3, 0xae, 0x8b, 0x12, 0xe7, 0x21, 0x15, 0x1d, 0x22, 0xef, 0x55, 0x61, 0xba, 0xf6, 0xd0, 0xeb, + 0x24, 0x01, 0x31, 0x8d, 0xc3, 0x14, 0x53, 0x59, 0xd0, 0x9d, 0x3b, 0x7d, 0x98, 0xa6, 0xe9, 0xac, + 0x3f, 0xcf, 0xc1, 0x88, 0xf8, 0xeb, 0xfe, 0xb5, 0x67, 0x74, 0xcb, 0xbc, 0x6a, 0x6c, 0x99, 0x33, + 0x5a, 0x4c, 0x6a, 0xdc, 0x38, 0xae, 0x1d, 0xb1, 0x59, 0xee, 0xd3, 0x00, 0x49, 0x64, 0x76, 0x03, + 0x46, 0xc9, 0x1a, 0x88, 0xcc, 0xb6, 0xf5, 0x20, 0xd7, 0xca, 0x4e, 0x28, 0xbe, 0x9c, 0xfb, 0x9d, + 0xb4, 0x36, 0x43, 0x51, 0x0b, 0x91, 0x5c, 0x85, 0x26, 0x35, 0x72, 0xa2, 0xfa, 0xe8, 0x67, 0x27, + 0x43, 0x34, 0x6b, 0x59, 0x8c, 0xfb, 0x78, 0xe1, 0x57, 0xe8, 0x21, 0xa3, 0x70, 0x18, 0x93, 0x93, + 0x2a, 0x65, 0x64, 0xe6, 0x1b, 0xc7, 0x1f, 0x9c, 0x90, 0x81, 0x8d, 0xd5, 0x87, 0xbd, 0x0b, 0x13, + 0xd7, 0xfd, 0xe0, 0xb1, 0x1b, 0xc8, 0x70, 0x95, 0x64, 0x39, 0x20, 0xae, 0x8e, 0x93, 0xdb, 0x12, + 0x2e, 0x03, 0x5e, 0x7e, 0x67, 0xbf, 0x3c, 0xb4, 0xe4, 0xfb, 0x4d, 0xdb, 0x40, 0x67, 0x77, 0x61, + 0xf2, 0x8e, 0xfb, 0x44, 0xbb, 0xf4, 0x4a, 0xc7, 0x99, 0x8b, 0x62, 0x02, 0x8b, 0x5b, 0xf3, 0xd1, + 0xa6, 0x59, 0x26, 0x3d, 0xf3, 0x60, 0x6a, 0xc3, 0x0f, 0x22, 0xaa, 0xc4, 0x6b, 0xef, 0x50, 0x63, + 0x7b, 0x8d, 0xcb, 0x2e, 0x67, 0x1a, 0x97, 0x9d, 0xee, 0xf8, 0x41, 0xe4, 0x6c, 0xc7, 0xe4, 0x46, + 0x40, 0x2b, 0x83, 0x31, 0x7b, 0x17, 0x66, 0xb4, 0x80, 0x7d, 0xd7, 0xfd, 0xa0, 0xe5, 0x2a, 0xa1, + 0x1c, 0xf5, 0xc0, 0x68, 0x6f, 0xb2, 0x8d, 0x60, 0xbb, 0x17, 0x93, 0x7d, 0x39, 0xcb, 0x15, 0x69, + 0x38, 0xb1, 0x4e, 0xcb, 0x70, 0x45, 0xea, 0x67, 0x9d, 0xd6, 0xeb, 0x94, 0xb4, 0x73, 0x98, 0xf5, + 0x6a, 0x71, 0xe9, 0x0a, 0x5d, 0xbf, 0x8f, 0xb6, 0x4e, 0x8d, 0xc7, 0xad, 0x8f, 0x95, 0xea, 0x22, + 0x14, 0x96, 0x36, 0xae, 0xe3, 0xeb, 0x85, 0x32, 0xb4, 0x69, 0xef, 0xba, 0xed, 0x3a, 0x0a, 0xcb, + 0x64, 0x31, 0xae, 0xef, 0xc8, 0x4b, 0x1b, 0xd7, 0x99, 0x0b, 0xb3, 0x1b, 0x3c, 0x68, 0x79, 0xd1, + 0x97, 0xae, 0x5c, 0xd1, 0x06, 0xaa, 0x88, 0x9f, 0x76, 0x99, 0x3e, 0xad, 0xdc, 0x41, 0x14, 0xe7, + 0xc9, 0x95, 0x2b, 0x99, 0xc3, 0x11, 0x7f, 0x58, 0x16, 0x2f, 0xb1, 0x33, 0xde, 0x71, 0x9f, 0x24, + 0x86, 0xfe, 0x21, 0x39, 0x75, 0x9e, 0x51, 0x13, 0x2b, 0x71, 0x12, 0x30, 0x76, 0x46, 0x93, 0x48, + 0xdc, 0x75, 0x92, 0xe9, 0x15, 0x92, 0x3b, 0xcc, 0x82, 0x52, 0xe9, 0x28, 0xcf, 0x5f, 0x5d, 0x60, + 0xd7, 0xd0, 0xd9, 0xbd, 0xf8, 0xc6, 0x26, 0x6f, 0x3c, 0x94, 0x10, 0xf1, 0xb2, 0x7e, 0x63, 0x93, + 0x8a, 0x14, 0xa3, 0x59, 0xd3, 0xf1, 0x35, 0x5f, 0x7a, 0x3e, 0xd8, 0x26, 0x97, 0xde, 0x8b, 0xe0, + 0xc4, 0xf1, 0x2f, 0x82, 0x1c, 0x86, 0xd6, 0xfc, 0xfa, 0x43, 0x8a, 0xc2, 0xf5, 0x45, 0xb1, 0xdc, + 0x9b, 0x7e, 0xfd, 0xe1, 0xd3, 0xb3, 0xca, 0x45, 0xf6, 0x6c, 0x5d, 0x7c, 0xaa, 0x98, 0x05, 0xd4, + 0x27, 0x64, 0xe9, 0x39, 0x17, 0xdf, 0x84, 0xb4, 0x32, 0x29, 0xf8, 0xc8, 0x49, 0xa3, 0xba, 0xd6, + 0x36, 0xc9, 0x19, 0x87, 0xd2, 0x0a, 0x0f, 0x1f, 0x46, 0x7e, 0x67, 0xb9, 0xe9, 0x75, 0xb6, 0x7c, + 0x37, 0x50, 0xb1, 0x51, 0x7b, 0xd7, 0xf7, 0xab, 0x99, 0xeb, 0x7b, 0xa6, 0x21, 0xe9, 0x9d, 0xba, + 0x62, 0x60, 0xf7, 0xb0, 0x64, 0x5f, 0x86, 0x29, 0x31, 0xb9, 0x57, 0x9f, 0x44, 0xbc, 0x2d, 0x47, + 0x7e, 0x06, 0x45, 0x87, 0x39, 0x2d, 0x19, 0x40, 0x5c, 0x28, 0xe7, 0x14, 0x2e, 0x76, 0x1e, 0x13, + 0x18, 0x11, 0xcc, 0x0c, 0x56, 0xac, 0x01, 0xf3, 0x77, 0xdc, 0x27, 0x5a, 0x1a, 0x47, 0x6d, 0x92, + 0x32, 0x9c, 0x60, 0x17, 0x0e, 0xf6, 0xcb, 0x2f, 0x8b, 0x09, 0x96, 0x84, 0xeb, 0xed, 0x33, 0x5f, + 0xfb, 0x72, 0x62, 0xdf, 0x0b, 0xa7, 0xa8, 0x59, 0x2b, 0x98, 0x21, 0xc7, 0x0f, 0xf6, 0x6a, 0xbb, + 0x2e, 0xfa, 0xf8, 0xcc, 0x1e, 0x6f, 0x43, 0x54, 0x1d, 0xd6, 0x50, 0x7c, 0x9c, 0x50, 0x32, 0xb2, + 0xfb, 0xd5, 0xc0, 0x3e, 0x84, 0x29, 0xf9, 0x64, 0x73, 0xd3, 0x0f, 0x23, 0xbc, 0xd0, 0xcf, 0x1d, + 0xcf, 0x74, 0x5d, 0xbe, 0x03, 0x49, 0x67, 0x8f, 0x94, 0x02, 0x20, 0xc5, 0x99, 0xbd, 0x0d, 0xe3, + 0x1b, 0x5e, 0x5b, 0xc6, 0x18, 0xac, 0x6e, 0xa0, 0xea, 0x91, 0xce, 0x9f, 0x8e, 0xd7, 0x76, 0xd4, + 0xad, 0xba, 0x13, 0x6f, 0x17, 0x3a, 0x36, 0x7b, 0x00, 0xe3, 0xb5, 0xda, 0xcd, 0xeb, 0x9e, 0x38, + 0x00, 0x3b, 0x7b, 0xf3, 0x27, 0xfb, 0x7c, 0xe5, 0x4b, 0x99, 0x5f, 0x39, 0x19, 0x86, 0xbb, 0x98, + 0x1a, 0xdf, 0xa9, 0xfb, 0x9d, 0x3d, 0x5b, 0xe7, 0x94, 0x61, 0xce, 0x7d, 0xea, 0x29, 0x9b, 0x73, + 0x57, 0x61, 0x5a, 0x33, 0xb0, 0x44, 0xe3, 0xca, 0xf9, 0x24, 0x30, 0x8d, 0x6e, 0xbe, 0x9d, 0x76, + 0x5f, 0x4c, 0xd3, 0x29, 0x3b, 0xee, 0xd3, 0xc7, 0xb5, 0xe3, 0xf6, 0x60, 0x46, 0x0e, 0x06, 0xcd, + 0x03, 0x1c, 0xe9, 0x85, 0x3e, 0x7d, 0x78, 0x31, 0xb3, 0x0f, 0x67, 0x69, 0xa4, 0xd5, 0x24, 0xc3, + 0x27, 0xca, 0x5e, 0xae, 0x6c, 0x1b, 0x18, 0x01, 0x29, 0x31, 0x3f, 0xd6, 0xf5, 0x7c, 0x9f, 0xba, + 0x5e, 0xce, 0xac, 0x6b, 0x4a, 0xd5, 0xb5, 0x25, 0xab, 0xc9, 0xe0, 0xc8, 0xda, 0xaa, 0x1e, 0x35, + 0xbf, 0xb0, 0x63, 0x5f, 0x30, 0xf4, 0xa0, 0xbd, 0x08, 0x32, 0xc0, 0x6f, 0x7a, 0xd2, 0xa6, 0xfb, + 0x3d, 0x83, 0x33, 0x7b, 0x02, 0x27, 0x7b, 0xbf, 0x02, 0xeb, 0x3c, 0x83, 0x75, 0x9e, 0x31, 0xea, + 0x4c, 0x23, 0xc9, 0x79, 0x63, 0x36, 0x2b, 0x5d, 0x6b, 0x1f, 0xfe, 0xec, 0x07, 0x72, 0x70, 0xea, + 0xce, 0xf5, 0x0a, 0xe6, 0xa3, 0xf3, 0x64, 0xc8, 0xa9, 0xd8, 0xed, 0xf3, 0x2c, 0xe9, 0xca, 0xd3, + 0xfa, 0x7b, 0x25, 0x71, 0xe0, 0x56, 0x21, 0x64, 0xc4, 0x97, 0x5a, 0xdb, 0xae, 0x4c, 0x73, 0x47, + 0x2c, 0x32, 0x7c, 0x43, 0xbf, 0xf5, 0x47, 0xe5, 0x9c, 0xdd, 0xaf, 0x2a, 0xd6, 0x84, 0x05, 0xb3, + 0x5b, 0x94, 0xa5, 0xfd, 0x2e, 0x6f, 0x36, 0xe7, 0xcb, 0x38, 0xa3, 0x5f, 0x3f, 0xd8, 0x2f, 0x5f, + 0xe8, 0xe9, 0xdd, 0xd8, 0x7a, 0x5f, 0x60, 0x6a, 0x0d, 0x3e, 0x84, 0xdf, 0xad, 0xa1, 0xe2, 0x64, + 0x69, 0x2a, 0xc3, 0xce, 0xdc, 0xfa, 0x8d, 0x7c, 0xea, 0xa4, 0x62, 0x55, 0x18, 0xa5, 0x09, 0x48, + 0xa2, 0x7b, 0xef, 0x34, 0x3b, 0x93, 0x39, 0xcd, 0x46, 0x69, 0x2e, 0xdb, 0x8a, 0x9e, 0x3d, 0x16, + 0xac, 0xf0, 0x2b, 0xe8, 0xae, 0xf3, 0x55, 0x79, 0x10, 0x21, 0xc8, 0x38, 0x72, 0x57, 0x8e, 0xef, + 0x3d, 0x65, 0x3a, 0xe7, 0xe1, 0xd9, 0xab, 0x6a, 0x63, 0x0f, 0x65, 0xb2, 0x94, 0x42, 0xec, 0x82, + 0x63, 0x66, 0x46, 0x79, 0x6a, 0x15, 0x8a, 0x5a, 0xac, 0x5f, 0xcf, 0xc1, 0xa4, 0x71, 0xd4, 0xb1, + 0x6b, 0x9a, 0x7f, 0x59, 0xe2, 0x72, 0x6d, 0xe0, 0xe0, 0xee, 0x97, 0xf6, 0x3c, 0xbb, 0x46, 0xc6, + 0xe2, 0xf9, 0xfe, 0x74, 0x38, 0xfb, 0xd3, 0xee, 0x86, 0x87, 0x6b, 0x06, 0xe3, 0x14, 0x6c, 0x43, + 0x7d, 0x52, 0xb0, 0xfd, 0xca, 0x0b, 0x30, 0x65, 0xde, 0x85, 0xd8, 0xeb, 0x30, 0x82, 0x0a, 0x55, + 0x75, 0xb1, 0x96, 0xa9, 0xeb, 0xfd, 0x54, 0x36, 0x51, 0xc2, 0x61, 0xaf, 0x00, 0xc4, 0x56, 0xbb, + 0xea, 0x39, 0x61, 0xf8, 0x60, 0xbf, 0x9c, 0x7b, 0xc3, 0xd6, 0x0a, 0xd8, 0xd7, 0x00, 0xd6, 0xfd, + 0x06, 0x8f, 0xf3, 0x55, 0x1e, 0xf2, 0x64, 0xfe, 0x6a, 0x4f, 0x22, 0x81, 0x13, 0x6d, 0xbf, 0xc1, + 0x7b, 0xb3, 0x06, 0x68, 0x1c, 0xd9, 0xe7, 0x61, 0xd8, 0xee, 0x8a, 0x4b, 0xbc, 0xd4, 0x9f, 0x8c, + 0xab, 0x23, 0xa7, 0xdb, 0xe4, 0xc9, 0x0d, 0x31, 0xe8, 0xa6, 0xad, 0xc1, 0x04, 0x80, 0xbd, 0x2f, + 0x13, 0x0c, 0x50, 0x74, 0xbe, 0xe1, 0xe4, 0x81, 0x45, 0x13, 0x45, 0x7a, 0xe2, 0xf3, 0x69, 0x24, + 0xec, 0x2e, 0x8c, 0xea, 0x2f, 0x03, 0x9a, 0xa3, 0xb2, 0xfe, 0x7a, 0xa4, 0x5d, 0x37, 0x29, 0xd1, + 0x65, 0xfa, 0xd1, 0x40, 0x71, 0x61, 0xef, 0xc0, 0x98, 0x60, 0x2f, 0x96, 0x72, 0x48, 0xd7, 0x0c, + 0x7c, 0x46, 0xd1, 0x3e, 0x48, 0x6c, 0x07, 0x46, 0x0c, 0xbd, 0x98, 0x80, 0x7d, 0x19, 0x53, 0x28, + 0x52, 0x57, 0x1f, 0x6a, 0x4a, 0x71, 0xbe, 0xa7, 0xab, 0x31, 0xa7, 0x62, 0x6f, 0x4e, 0xf6, 0x98, + 0x1f, 0xdb, 0x89, 0xe3, 0x64, 0x0d, 0x92, 0x14, 0xe2, 0xb5, 0x9e, 0x0a, 0xe6, 0x55, 0xe8, 0xa7, + 0xde, 0xbc, 0xa3, 0x06, 0x5f, 0xd6, 0x81, 0x52, 0x22, 0xe5, 0x51, 0x5d, 0x70, 0x58, 0x5d, 0x6f, + 0xf4, 0xd4, 0xa5, 0x0f, 0x60, 0x4f, 0x75, 0x3d, 0xdc, 0x59, 0x03, 0xa6, 0xd4, 0x89, 0x41, 0xf5, + 0x8d, 0x1f, 0x56, 0xdf, 0x2b, 0x3d, 0xf5, 0xcd, 0x36, 0xb6, 0x7a, 0xeb, 0x49, 0xf1, 0x64, 0xef, + 0xc0, 0xa4, 0x82, 0xc8, 0x2c, 0xa0, 0x13, 0x49, 0xba, 0xc7, 0xc6, 0x56, 0x4f, 0xee, 0x4f, 0x13, + 0x59, 0xa7, 0x96, 0xb3, 0x63, 0xd2, 0xa0, 0x4e, 0xcf, 0x0a, 0x13, 0x99, 0x7d, 0x00, 0xe3, 0xd5, + 0x96, 0x68, 0x88, 0xdf, 0x76, 0x23, 0x4e, 0x4e, 0x6c, 0xca, 0x2c, 0x44, 0x2b, 0xd1, 0xa6, 0xaa, + 0xcc, 0x6f, 0x9a, 0x14, 0x19, 0xf9, 0x4d, 0x13, 0xb0, 0xe8, 0x3c, 0xf9, 0x14, 0x44, 0x73, 0x58, + 0x39, 0xb8, 0x9d, 0xc9, 0x30, 0xcd, 0xd0, 0xd8, 0x53, 0x14, 0x4c, 0x01, 0x55, 0x4f, 0x31, 0xa9, + 0x28, 0x98, 0x3a, 0x4f, 0xf6, 0x2e, 0x8c, 0x53, 0xbe, 0x9c, 0x8a, 0xbd, 0x1e, 0xce, 0x97, 0xb0, + 0xf1, 0xe8, 0x96, 0xaf, 0x52, 0xeb, 0x38, 0x6e, 0x90, 0xb2, 0x41, 0x4c, 0xf0, 0xd9, 0x97, 0x60, + 0xee, 0x81, 0xd7, 0x6e, 0xf8, 0x8f, 0x43, 0x3a, 0xa6, 0x68, 0xa3, 0x9b, 0x49, 0x3c, 0x80, 0x1e, + 0xcb, 0xf2, 0x58, 0x38, 0xeb, 0xd9, 0xf8, 0x32, 0x39, 0xb0, 0xbf, 0xde, 0xc3, 0x59, 0xce, 0x20, + 0x76, 0xd8, 0x0c, 0x5a, 0xec, 0x99, 0x41, 0xbd, 0xd5, 0xa7, 0xa7, 0x53, 0x66, 0x35, 0xcc, 0x07, + 0x66, 0x9e, 0xef, 0xb7, 0x7c, 0xaf, 0x3d, 0x3f, 0x8b, 0x7b, 0xe1, 0xf3, 0x69, 0x47, 0x78, 0xc4, + 0xa3, 0x3c, 0xb1, 0xd6, 0xc1, 0x7e, 0xf9, 0x6c, 0x5a, 0x08, 0xff, 0xd0, 0x37, 0x14, 0xe5, 0x19, + 0xac, 0xd9, 0x07, 0x30, 0x21, 0xfe, 0x8f, 0xb5, 0x04, 0x73, 0x86, 0x31, 0x9f, 0x86, 0x49, 0xf5, + 0xe0, 0x18, 0x61, 0x42, 0x9f, 0x0c, 0x05, 0x82, 0xc1, 0x8a, 0xbd, 0x05, 0x20, 0xe4, 0x18, 0xda, + 0x8e, 0x4f, 0x24, 0x41, 0x47, 0x51, 0x0c, 0xea, 0xdd, 0x88, 0x13, 0x64, 0xf6, 0x0e, 0x8c, 0x8b, + 0x5f, 0xb5, 0x6e, 0xc3, 0x17, 0x6b, 0xe3, 0x24, 0xd2, 0x4a, 0x7f, 0x42, 0x41, 0x1b, 0x4a, 0xb8, + 0xe1, 0x4f, 0x98, 0xa0, 0xb3, 0x9b, 0x30, 0x8d, 0xc1, 0x61, 0xab, 0x98, 0x44, 0x3a, 0xf2, 0x78, + 0x38, 0x7f, 0x4a, 0x7b, 0xc2, 0x16, 0x45, 0x8e, 0x17, 0x97, 0xe9, 0x97, 0x8b, 0x14, 0x19, 0x0b, + 0x61, 0x36, 0xd9, 0x5d, 0x92, 0x07, 0xf1, 0x79, 0xec, 0x24, 0x25, 0x52, 0xf7, 0x62, 0xc8, 0xfd, + 0x58, 0x8c, 0x88, 0xb6, 0x71, 0xa9, 0xe7, 0x04, 0xbd, 0xc2, 0x2c, 0xee, 0xcc, 0x06, 0x76, 0x63, + 0x79, 0x23, 0x1d, 0x3d, 0xf5, 0x34, 0xb6, 0x00, 0x87, 0x79, 0xa7, 0x9e, 0x24, 0xb0, 0xcd, 0x88, + 0xa0, 0x9a, 0x41, 0xcd, 0xbe, 0x09, 0x27, 0xd4, 0x0e, 0x42, 0x45, 0x34, 0xaf, 0x17, 0x8e, 0xb9, + 0x13, 0x37, 0xb6, 0xe2, 0xaa, 0x7b, 0xa6, 0x74, 0x76, 0x15, 0xcc, 0x85, 0x71, 0x1c, 0x56, 0xaa, + 0xf1, 0xf9, 0xc3, 0x6a, 0xbc, 0xd0, 0x53, 0xe3, 0x49, 0x9c, 0x28, 0xbd, 0x95, 0xe9, 0x3c, 0xd9, + 0x12, 0x4c, 0xd2, 0x3a, 0xa2, 0xd9, 0xf6, 0x02, 0xf6, 0x16, 0x6a, 0x95, 0xd4, 0x0a, 0xec, 0x99, + 0x70, 0x26, 0x89, 0xbe, 0x23, 0xcb, 0x67, 0x84, 0x33, 0xc6, 0x8e, 0x9c, 0x7e, 0x3d, 0x30, 0x91, + 0xc5, 0x8e, 0x94, 0x48, 0x31, 0xab, 0x4f, 0x3a, 0x01, 0xe9, 0x8c, 0xce, 0x26, 0x49, 0x45, 0x34, + 0xe1, 0xc7, 0xe1, 0x31, 0x86, 0xbe, 0x25, 0x64, 0x71, 0x60, 0xf7, 0x60, 0x36, 0x3e, 0xb5, 0x35, + 0xc6, 0xe5, 0x24, 0x39, 0x4b, 0x72, 0xd4, 0x67, 0xf3, 0xcd, 0xa2, 0x67, 0x2e, 0x9c, 0x32, 0xce, + 0x69, 0x8d, 0xf5, 0x39, 0x64, 0x8d, 0x09, 0x93, 0xcd, 0x43, 0x3e, 0x9b, 0x7d, 0x3f, 0x3e, 0xec, + 0x43, 0x58, 0x48, 0x9f, 0xcd, 0x5a, 0x2d, 0x2f, 0x62, 0x2d, 0xaf, 0x1d, 0xec, 0x97, 0xcf, 0xf7, + 0x1c, 0xef, 0xd9, 0x15, 0x1d, 0xc2, 0x8d, 0x7d, 0x0d, 0xe6, 0xcd, 0xf3, 0x59, 0xab, 0xc9, 0xc2, + 0x9a, 0x70, 0xe9, 0xc4, 0x07, 0x7b, 0x76, 0x0d, 0x7d, 0x79, 0xb0, 0x08, 0xca, 0x99, 0xb3, 0x5b, + 0xab, 0xe6, 0xa5, 0xa4, 0x41, 0x3d, 0xab, 0x24, 0xbb, 0xba, 0xa3, 0x58, 0xb2, 0xc7, 0x70, 0x36, + 0xeb, 0x98, 0xd0, 0x2a, 0x7d, 0x39, 0xd6, 0xca, 0x7e, 0x2a, 0xfb, 0xc8, 0xc9, 0xae, 0xf9, 0x08, + 0xb6, 0xec, 0xcb, 0x70, 0x42, 0x5b, 0x5f, 0x5a, 0x7d, 0xaf, 0x60, 0x7d, 0xe8, 0xbf, 0xab, 0x2f, + 0xcc, 0xec, 0x5a, 0xb2, 0x79, 0xb0, 0x16, 0xcc, 0xaa, 0x86, 0xa3, 0xfa, 0x9b, 0x8e, 0x9e, 0xf3, + 0xc6, 0xae, 0xda, 0x8b, 0xa1, 0xa5, 0xbc, 0xdf, 0x72, 0x3a, 0x09, 0xa1, 0x3e, 0xd3, 0x33, 0xf8, + 0xb2, 0x9b, 0x30, 0x52, 0xdb, 0xa8, 0x5e, 0xbf, 0xbe, 0x3a, 0xff, 0x2a, 0xd6, 0xa0, 0x9c, 0x7d, + 0x24, 0xd0, 0xb8, 0x34, 0x91, 0x8d, 0x59, 0xc7, 0xdb, 0xde, 0x36, 0x7c, 0xaa, 0x24, 0x2a, 0xfb, + 0xeb, 0x68, 0xdd, 0x25, 0x76, 0xd4, 0x4a, 0x18, 0x7a, 0x3b, 0x98, 0x65, 0x22, 0x9c, 0x7f, 0xcd, + 0x78, 0xe9, 0xa5, 0xd3, 0x63, 0x6f, 0x19, 0xf3, 0xfd, 0xf4, 0xa0, 0x4b, 0x69, 0xf3, 0x60, 0xbf, + 0x7c, 0x86, 0x76, 0x6e, 0xc7, 0x4d, 0x58, 0xe9, 0x9b, 0x78, 0x6f, 0x45, 0xb7, 0x86, 0x8a, 0x17, + 0x4a, 0x17, 0x6f, 0x0d, 0x15, 0x2f, 0x96, 0x5e, 0xb3, 0x5f, 0xc8, 0xce, 0x51, 0x2e, 0xfb, 0xda, + 0x3e, 0x7f, 0x58, 0x69, 0x32, 0x12, 0xd6, 0xdf, 0xcd, 0x41, 0xf9, 0x88, 0x0f, 0x16, 0x7b, 0x6b, + 0xd2, 0x9b, 0x35, 0xae, 0x5c, 0x88, 0xa5, 0x3b, 0x4d, 0x5c, 0xe0, 0x98, 0x8f, 0xd7, 0x26, 0x09, + 0x7a, 0x2d, 0x51, 0xd0, 0x78, 0xcd, 0x79, 0xad, 0x37, 0x58, 0xbc, 0xc2, 0xb2, 0x7e, 0x2e, 0x07, + 0xb3, 0x19, 0xe3, 0xc3, 0xce, 0xc3, 0x10, 0x66, 0x81, 0xd1, 0xac, 0x0d, 0x52, 0xd9, 0x5f, 0xb0, + 0x9c, 0x7d, 0x1a, 0x46, 0x57, 0xd6, 0x6b, 0xb5, 0xca, 0xba, 0xba, 0xca, 0xca, 0x6d, 0xbc, 0x1d, + 0x3a, 0xa1, 0x6b, 0x3e, 0x52, 0x12, 0x1a, 0x7b, 0x03, 0x46, 0xaa, 0x1b, 0x48, 0x20, 0xcd, 0xdd, + 0xf0, 0x0b, 0xbd, 0x4e, 0x1a, 0x9f, 0x90, 0xac, 0x1f, 0xcd, 0x01, 0xeb, 0x9d, 0x6c, 0xec, 0x0a, + 0x8c, 0xeb, 0x53, 0x5a, 0x5e, 0xbc, 0xf1, 0x41, 0x4d, 0x9b, 0xb0, 0xb6, 0x8e, 0xc3, 0x56, 0x60, + 0x18, 0xf3, 0xe4, 0xc5, 0xaf, 0xa3, 0x99, 0x07, 0xe3, 0xa9, 0x9e, 0x83, 0x71, 0x18, 0xb3, 0xf0, + 0xd9, 0x92, 0xd8, 0xfa, 0xed, 0x1c, 0xb0, 0x5e, 0x61, 0x62, 0x60, 0xeb, 0x8c, 0x37, 0x35, 0x77, + 0x65, 0x3d, 0xcf, 0x43, 0x9c, 0xa4, 0x47, 0xbf, 0x44, 0x26, 0x8e, 0xcd, 0xe7, 0x0d, 0xa5, 0x45, + 0x7f, 0x1f, 0xb7, 0x8b, 0x30, 0x7c, 0x9f, 0x07, 0x5b, 0xca, 0x92, 0x13, 0xad, 0xbf, 0x1e, 0x09, + 0x80, 0x7e, 0x89, 0x47, 0x0c, 0xeb, 0x4f, 0x72, 0x30, 0x97, 0x25, 0xe1, 0x1e, 0xe1, 0x8a, 0x66, + 0xa5, 0xbc, 0xe8, 0xd0, 0x32, 0x43, 0x9a, 0x86, 0xc5, 0xbe, 0x73, 0x65, 0x18, 0x16, 0x8d, 0x55, + 0x23, 0x8c, 0x4a, 0x14, 0xd1, 0x1b, 0xa1, 0x2d, 0xe1, 0x02, 0x41, 0x86, 0xe5, 0x1a, 0xc2, 0x88, + 0x6e, 0x88, 0x80, 0xf3, 0xd1, 0x96, 0x70, 0x81, 0x70, 0xc7, 0x6f, 0xc4, 0x29, 0xa2, 0x11, 0xa1, + 0x25, 0x00, 0xb6, 0x84, 0xb3, 0xf3, 0x30, 0x7a, 0xb7, 0xbd, 0xc6, 0xdd, 0x47, 0x2a, 0xd6, 0x38, + 0x5a, 0x92, 0xf8, 0x6d, 0xa7, 0x29, 0x60, 0xb6, 0x2a, 0xb4, 0x7e, 0x2a, 0x07, 0x33, 0x3d, 0xc2, + 0xf5, 0xd1, 0xde, 0x76, 0x87, 0xbb, 0xbd, 0x0c, 0xd2, 0x3e, 0xf9, 0xf9, 0x43, 0xd9, 0x9f, 0x6f, + 0xfd, 0xbf, 0x43, 0x70, 0xaa, 0x8f, 0xae, 0x23, 0x71, 0xcb, 0xcb, 0x1d, 0xe9, 0x96, 0xf7, 0x15, + 0x98, 0x5c, 0x6e, 0xba, 0x5e, 0x2b, 0xdc, 0xf4, 0x93, 0x2f, 0x4e, 0xac, 0xfb, 0xb1, 0x4c, 0x65, + 0xc9, 0x56, 0x66, 0xe0, 0xa7, 0xeb, 0x48, 0xe1, 0x44, 0x7e, 0xaf, 0xa8, 0x65, 0x30, 0xeb, 0x71, + 0x8c, 0x2b, 0xfc, 0x25, 0x71, 0x8c, 0x33, 0x5d, 0x35, 0x86, 0x9e, 0xaa, 0xab, 0x46, 0xb6, 0x99, + 0xe7, 0xf0, 0xc7, 0x31, 0xfa, 0x5d, 0x86, 0x49, 0x69, 0x4a, 0x53, 0x09, 0xe5, 0x20, 0x8d, 0xf4, + 0x98, 0xdf, 0xb8, 0x61, 0xef, 0x58, 0x18, 0x34, 0xec, 0xa6, 0xe9, 0x56, 0x30, 0x8a, 0x4f, 0x80, + 0xe7, 0xfb, 0xbb, 0x0d, 0x18, 0x4f, 0xff, 0x3a, 0xa9, 0xf5, 0x53, 0x79, 0xd3, 0x6b, 0xee, 0x2f, + 0xe3, 0xcc, 0xbb, 0x08, 0xc3, 0x0f, 0x76, 0x79, 0xa0, 0xf6, 0x3b, 0xfc, 0x90, 0xc7, 0x02, 0xa0, + 0x7f, 0x08, 0x62, 0xb0, 0xeb, 0x30, 0xb5, 0x21, 0x47, 0x42, 0x75, 0xef, 0x50, 0x72, 0x05, 0xed, + 0x90, 0xa2, 0x24, 0xa3, 0x7f, 0x53, 0x54, 0xd6, 0x0d, 0x38, 0x63, 0x2c, 0x48, 0x8a, 0xf2, 0x21, + 0xad, 0xfb, 0xe5, 0x89, 0x38, 0x95, 0xf8, 0x33, 0x24, 0xbb, 0x87, 0x9d, 0x82, 0x5a, 0xdb, 0x70, + 0xf6, 0x50, 0x46, 0xe2, 0x20, 0x82, 0x4e, 0xfc, 0x2b, 0x65, 0x82, 0x78, 0x28, 0xa9, 0xad, 0xd1, + 0x59, 0xdf, 0x0b, 0x13, 0x7a, 0x2f, 0xe3, 0x9e, 0x2a, 0x7e, 0xd3, 0xa6, 0x26, 0xf7, 0x54, 0x01, + 0xb0, 0x25, 0x3c, 0x51, 0x6d, 0xe7, 0xb3, 0x55, 0xdb, 0xc9, 0xf0, 0x17, 0x8e, 0x1a, 0x7e, 0x51, + 0x39, 0x2e, 0x59, 0xad, 0x72, 0xfc, 0xad, 0x57, 0x8e, 0x61, 0x3c, 0x6c, 0x09, 0x7f, 0xaa, 0x95, + 0xff, 0x96, 0xca, 0xb6, 0x82, 0xce, 0x03, 0x4a, 0x57, 0x90, 0x64, 0x6f, 0x9e, 0xcd, 0xd2, 0x00, + 0x24, 0x98, 0xc9, 0x21, 0x99, 0x3f, 0xea, 0x90, 0x3c, 0xce, 0x44, 0x44, 0xd1, 0x4b, 0x0e, 0xe9, + 0x50, 0x22, 0xd8, 0xb8, 0x3d, 0xaf, 0xf1, 0x0a, 0xcb, 0xfa, 0x56, 0x0e, 0x4e, 0x64, 0xaa, 0x10, + 0x45, 0xad, 0x52, 0x57, 0xa9, 0xad, 0xc3, 0xb4, 0xa2, 0x52, 0x62, 0x1c, 0xc7, 0x87, 0x7b, 0xf0, + 0xb6, 0x58, 0x2f, 0xc2, 0x58, 0xfc, 0x80, 0xc5, 0xe6, 0xd4, 0xd0, 0xa1, 0xd5, 0x96, 0x7a, 0x07, + 0xa9, 0x01, 0x88, 0x2f, 0x78, 0xaa, 0x36, 0x86, 0xd6, 0x6f, 0xe5, 0x65, 0x26, 0xbe, 0x67, 0x36, + 0x1c, 0x63, 0xb6, 0x61, 0xa0, 0x68, 0x52, 0xff, 0x20, 0x8c, 0x6c, 0x15, 0x46, 0x6a, 0x91, 0x1b, + 0x75, 0x95, 0xeb, 0xf9, 0xac, 0x4e, 0x86, 0x05, 0xf7, 0x17, 0x13, 0xe7, 0xe3, 0x10, 0x21, 0xc6, + 0xa5, 0x09, 0x21, 0x9a, 0x7d, 0xe1, 0xef, 0xe5, 0x60, 0x42, 0x27, 0x66, 0x1f, 0xc0, 0x94, 0x0a, + 0x32, 0x27, 0x1d, 0xf2, 0xe9, 0xb5, 0x4d, 0x99, 0xaa, 0xa8, 0x20, 0x73, 0xba, 0x03, 0xbf, 0x81, + 0xaf, 0x6f, 0xd5, 0x1d, 0x1d, 0x99, 0x35, 0x80, 0xb5, 0xb6, 0x5d, 0xe7, 0x31, 0x77, 0x1f, 0xf2, + 0x30, 0x72, 0xa4, 0x49, 0x01, 0x3d, 0xca, 0x29, 0xf6, 0x77, 0xae, 0x57, 0xa4, 0x35, 0x81, 0x18, + 0x09, 0x8a, 0x16, 0xd8, 0x43, 0xa3, 0xbf, 0x34, 0xb4, 0xb6, 0xdd, 0x07, 0xb2, 0x50, 0xd2, 0x59, + 0x7f, 0x3a, 0x22, 0xa7, 0x1b, 0xc5, 0xa4, 0xdc, 0x82, 0xa9, 0xbb, 0xd5, 0x95, 0x65, 0x4d, 0xef, + 0x68, 0xa6, 0x34, 0x59, 0x7d, 0x12, 0xf1, 0xa0, 0xed, 0x36, 0xd5, 0x95, 0x2b, 0x39, 0x82, 0x7c, + 0xaf, 0x51, 0xcf, 0xd6, 0x49, 0xa6, 0x38, 0x8a, 0x3a, 0xe4, 0xe5, 0x2e, 0xae, 0x23, 0x3f, 0x60, + 0x1d, 0xa1, 0xdb, 0x6a, 0xf6, 0xa9, 0xc3, 0xe4, 0xc8, 0x76, 0xa1, 0x74, 0x03, 0xc5, 0x25, 0xad, + 0x96, 0xc2, 0xe1, 0xb5, 0xbc, 0x44, 0xb5, 0x3c, 0x2f, 0xe5, 0xac, 0xec, 0x7a, 0x7a, 0xb8, 0x26, + 0xfb, 0xc4, 0xd0, 0x91, 0xfb, 0xc4, 0xdf, 0xce, 0xc1, 0x88, 0x94, 0xc7, 0x68, 0x1a, 0xf7, 0x91, + 0xf8, 0x1e, 0x3c, 0x1d, 0x89, 0xaf, 0x84, 0xe7, 0x84, 0x31, 0xa1, 0x65, 0x19, 0x5b, 0x49, 0xad, + 0x0b, 0x65, 0x16, 0x8b, 0x2f, 0x08, 0xb2, 0xe4, 0xe8, 0x65, 0xc1, 0xaa, 0x89, 0x3b, 0xf8, 0xe8, + 0x91, 0x1e, 0x87, 0xca, 0x85, 0x7e, 0x94, 0xdc, 0xc1, 0x4d, 0x27, 0xf0, 0x35, 0x18, 0x23, 0x27, + 0xf3, 0xa5, 0x3d, 0x7a, 0x27, 0x2c, 0x19, 0xa6, 0x17, 0x8d, 0xa5, 0xbd, 0x44, 0xd6, 0x24, 0x37, + 0x75, 0x67, 0x6b, 0xcf, 0x48, 0x6c, 0xa8, 0x10, 0xd9, 0x5d, 0x99, 0xf0, 0x4b, 0x46, 0xed, 0x34, + 0xc3, 0x74, 0xc7, 0x70, 0x0a, 0x5f, 0xa3, 0x3c, 0x55, 0x33, 0x82, 0x74, 0x26, 0x3c, 0xd8, 0x1a, + 0x94, 0xd0, 0x5c, 0x87, 0x37, 0xe4, 0xaa, 0xa9, 0xae, 0x48, 0x47, 0x66, 0x32, 0xb9, 0x8c, 0x64, + 0x19, 0x2d, 0xb7, 0x94, 0x0f, 0x51, 0x0f, 0xa5, 0xb8, 0x1f, 0x96, 0xd2, 0xb3, 0x8f, 0xbd, 0x03, + 0xe3, 0x71, 0xd4, 0xd4, 0xd8, 0x8b, 0x11, 0xdf, 0x0b, 0x92, 0x30, 0xab, 0x66, 0x9a, 0x28, 0x0d, + 0x9d, 0x2d, 0x42, 0x51, 0x2c, 0xe2, 0x74, 0x4a, 0xc5, 0x2e, 0xc1, 0x74, 0xd7, 0x04, 0x85, 0xc7, + 0x6a, 0x30, 0x2b, 0x16, 0x4d, 0xcd, 0x6b, 0xef, 0x34, 0xf9, 0x9a, 0xbf, 0xe3, 0x77, 0xa3, 0x7b, + 0xf6, 0x1a, 0xed, 0xe1, 0x52, 0x22, 0x77, 0x5b, 0x4d, 0xa3, 0x38, 0x30, 0x12, 0x66, 0x67, 0x50, + 0x6b, 0x5b, 0xe5, 0x1f, 0xe5, 0x61, 0x5c, 0x9b, 0x4f, 0xec, 0x22, 0x14, 0xab, 0xe1, 0x9a, 0x5f, + 0x7f, 0x18, 0xc7, 0x37, 0x9b, 0x3c, 0xd8, 0x2f, 0x8f, 0x79, 0xa1, 0xd3, 0x44, 0xa0, 0x1d, 0x17, + 0xb3, 0x25, 0x98, 0x94, 0x7f, 0xa9, 0x68, 0xf6, 0xf9, 0x44, 0x5f, 0x23, 0x91, 0x55, 0x1c, 0x7b, + 0x7d, 0xf7, 0x34, 0x48, 0xd8, 0x57, 0x01, 0x24, 0x00, 0x3d, 0x62, 0x0b, 0x83, 0xfb, 0xf2, 0x52, + 0x05, 0x19, 0xbe, 0xb0, 0x1a, 0x43, 0xf6, 0x75, 0x19, 0x65, 0x55, 0xcd, 0xff, 0xa1, 0xc1, 0x9d, + 0x91, 0x05, 0x7f, 0x27, 0x3b, 0x26, 0x82, 0xce, 0x92, 0x12, 0x50, 0x2c, 0xd8, 0xbc, 0xee, 0x3f, + 0xe2, 0xc1, 0x5e, 0x25, 0x42, 0x44, 0x0d, 0xc3, 0xfa, 0x9f, 0x72, 0xda, 0xaa, 0x61, 0xeb, 0x98, + 0x05, 0x54, 0xce, 0x08, 0x32, 0x99, 0x89, 0xef, 0x0c, 0x0a, 0x6e, 0xf3, 0xed, 0xa5, 0xe7, 0xc9, + 0xc0, 0x77, 0x36, 0x9e, 0x57, 0xa9, 0xec, 0xa0, 0x12, 0xc8, 0xbe, 0x00, 0x43, 0xd8, 0x75, 0xf9, + 0x23, 0x9b, 0xa6, 0x8e, 0xed, 0x21, 0xd1, 0x67, 0xd8, 0x10, 0xa4, 0x64, 0x9f, 0x26, 0x6f, 0x42, + 0xd9, 0xf9, 0x53, 0xda, 0xd9, 0x2b, 0xbe, 0x23, 0x3e, 0xaf, 0x93, 0xb0, 0x18, 0xda, 0xec, 0xf9, + 0xbb, 0x79, 0x28, 0xa5, 0xd7, 0x2a, 0x7b, 0x1f, 0x26, 0xd4, 0x79, 0x8a, 0x69, 0xe2, 0x45, 0x2b, + 0x27, 0x28, 0x14, 0xba, 0x3a, 0x54, 0xd3, 0x59, 0xe2, 0x75, 0x02, 0x21, 0xdc, 0x6c, 0x52, 0x98, + 0x2a, 0x6d, 0x95, 0x44, 0x7e, 0xd4, 0x49, 0x05, 0xf7, 0x54, 0x68, 0xec, 0x4d, 0x28, 0xdc, 0xb9, + 0x5e, 0x21, 0xd7, 0x95, 0x52, 0xfa, 0xd4, 0x95, 0xa6, 0x79, 0xa6, 0xa1, 0xa0, 0xc0, 0x67, 0x6b, + 0x5a, 0x1c, 0xdc, 0x11, 0x23, 0xff, 0x95, 0x02, 0xc7, 0x8d, 0x3b, 0x3a, 0x20, 0xae, 0xcc, 0x3f, + 0x4f, 0x91, 0x1d, 0xff, 0x9b, 0x02, 0x8c, 0xc5, 0xf5, 0x33, 0x06, 0x28, 0xbb, 0xd1, 0x85, 0x09, + 0xff, 0x66, 0xa7, 0xa1, 0xa8, 0xc4, 0x35, 0xf2, 0x60, 0x19, 0x0d, 0x49, 0x54, 0x9b, 0x07, 0x25, + 0x97, 0xc9, 0x65, 0x6e, 0xab, 0x9f, 0xec, 0x0a, 0xc4, 0x42, 0x57, 0x3f, 0xe9, 0x6c, 0x48, 0x0c, + 0x98, 0x1d, 0xa3, 0xb1, 0x29, 0xc8, 0x7b, 0x32, 0x5a, 0xd0, 0x98, 0x9d, 0xf7, 0x1a, 0xec, 0x7d, + 0x28, 0xba, 0x8d, 0x06, 0x6f, 0x38, 0xae, 0xb2, 0x3d, 0x39, 0x6c, 0xd2, 0x14, 0x05, 0x37, 0x79, + 0x08, 0x20, 0x55, 0x25, 0x62, 0x15, 0x18, 0x6b, 0xba, 0xd2, 0xbc, 0xac, 0x31, 0xc0, 0x89, 0x92, + 0x70, 0x28, 0x0a, 0xb2, 0x7b, 0x21, 0x6f, 0xb0, 0x57, 0x61, 0x48, 0x8c, 0x26, 0x1d, 0x21, 0x4a, + 0x4a, 0x14, 0x83, 0x29, 0x3b, 0xec, 0xe6, 0x73, 0x36, 0x22, 0xb0, 0x97, 0xa1, 0xd0, 0x5d, 0xdc, + 0xa6, 0xc3, 0xa1, 0x94, 0xc4, 0xa4, 0x8e, 0xd1, 0x44, 0x31, 0xbb, 0x0a, 0xc5, 0xc7, 0x66, 0x38, + 0xe3, 0x13, 0xa9, 0x61, 0x8c, 0xf1, 0x63, 0x44, 0xf6, 0x2a, 0x14, 0xc2, 0xd0, 0x27, 0x83, 0x0d, + 0xb5, 0x04, 0x6b, 0xb5, 0xbb, 0xf1, 0xa8, 0x09, 0xee, 0x61, 0xe8, 0x2f, 0x15, 0x61, 0x44, 0x9e, + 0x18, 0xd6, 0x59, 0x80, 0xe4, 0x1b, 0x7b, 0x3d, 0x92, 0xac, 0xaf, 0xc2, 0x58, 0xfc, 0x6d, 0xec, + 0x0c, 0xc0, 0x43, 0xbe, 0xe7, 0xec, 0xba, 0xed, 0x46, 0x53, 0x8a, 0x9b, 0x13, 0xf6, 0xd8, 0x43, + 0xbe, 0x77, 0x13, 0x01, 0xec, 0x14, 0x8c, 0x76, 0xc4, 0xf0, 0xd3, 0x1c, 0x9f, 0xb0, 0x47, 0x3a, + 0xdd, 0x2d, 0x31, 0x95, 0xe7, 0x61, 0x14, 0x35, 0x81, 0xb4, 0x22, 0x27, 0x6d, 0xf5, 0xd3, 0xfa, + 0xb3, 0x02, 0xe6, 0xfc, 0xd0, 0x1a, 0xc4, 0x5e, 0x82, 0xc9, 0x7a, 0xc0, 0xf1, 0x70, 0x72, 0x85, + 0xc8, 0x45, 0xf5, 0x4c, 0x24, 0xc0, 0x6a, 0x83, 0x9d, 0x87, 0xe9, 0x4e, 0x77, 0xab, 0xe9, 0xd5, + 0x45, 0x6d, 0x4e, 0x7d, 0x8b, 0x82, 0x94, 0x4f, 0xd8, 0x93, 0x12, 0x7c, 0x9b, 0xef, 0x2d, 0x6f, + 0x61, 0x38, 0xac, 0x92, 0x1e, 0xcd, 0x34, 0x8a, 0x53, 0xea, 0xda, 0xd3, 0x1a, 0x1c, 0x6d, 0xcf, + 0x4e, 0xc2, 0x88, 0xeb, 0xee, 0x74, 0x3d, 0x19, 0xb6, 0x66, 0xc2, 0xa6, 0x5f, 0xec, 0x53, 0x30, + 0x93, 0x04, 0xd8, 0x55, 0xcd, 0x18, 0xc6, 0x66, 0x94, 0xe2, 0x82, 0x65, 0x09, 0x67, 0x6f, 0x00, + 0xd3, 0xeb, 0xf3, 0xb7, 0x3e, 0xe4, 0x75, 0x39, 0x27, 0x27, 0xec, 0x19, 0xad, 0xe4, 0x2e, 0x16, + 0xb0, 0x17, 0x61, 0x22, 0xe0, 0x21, 0x8a, 0x7b, 0xd8, 0x6d, 0x98, 0x12, 0xcb, 0x1e, 0x57, 0x30, + 0xd1, 0x77, 0x17, 0xa0, 0xa4, 0x75, 0x07, 0x06, 0x8c, 0x95, 0x11, 0xba, 0xed, 0xa9, 0x04, 0x6e, + 0x77, 0xaa, 0x0d, 0xf6, 0x25, 0x58, 0xd0, 0x30, 0x65, 0x76, 0x2e, 0x87, 0x37, 0xbd, 0x1d, 0x6f, + 0xab, 0xc9, 0x69, 0xbe, 0xf5, 0xce, 0xea, 0xf8, 0x4e, 0x68, 0xcf, 0x27, 0xd4, 0x32, 0x6f, 0xd7, + 0x2a, 0xd1, 0xb2, 0x35, 0x98, 0x4b, 0x71, 0xe6, 0x0d, 0xa7, 0xdb, 0xe9, 0x1b, 0x27, 0x2a, 0xe1, + 0xc9, 0x4c, 0x9e, 0xbc, 0x71, 0xaf, 0x63, 0x7d, 0x09, 0x26, 0xf4, 0x39, 0x29, 0x3a, 0x41, 0x17, + 0x34, 0x68, 0xf6, 0x8d, 0xc7, 0xb0, 0xaa, 0xb8, 0xe8, 0x4d, 0x25, 0x28, 0x51, 0x9c, 0x3d, 0xd8, + 0x9e, 0x8c, 0xa1, 0x62, 0x08, 0xad, 0x25, 0x98, 0xe9, 0xd9, 0xe4, 0xb4, 0x44, 0xf0, 0x72, 0xd3, + 0x3e, 0x3c, 0x11, 0xbc, 0xd5, 0x86, 0x09, 0xfd, 0xd0, 0x3a, 0x22, 0x54, 0xfe, 0x49, 0x0c, 0xfc, + 0x20, 0x77, 0xf4, 0x91, 0x83, 0xfd, 0x72, 0xde, 0x6b, 0x60, 0xb8, 0x87, 0x0b, 0x50, 0x54, 0xf2, + 0x15, 0x89, 0x35, 0xa8, 0xcb, 0x26, 0xc1, 0x7e, 0xcf, 0x8e, 0x4b, 0xad, 0x57, 0x61, 0x94, 0xce, + 0xa5, 0xc3, 0x35, 0xd8, 0xd6, 0x0f, 0xe6, 0x61, 0xda, 0xe6, 0x62, 0xd7, 0xe4, 0x32, 0x3f, 0xc6, + 0x33, 0x7b, 0xa1, 0xce, 0x0e, 0x1f, 0x68, 0xb4, 0xed, 0x90, 0xcc, 0x14, 0xff, 0x28, 0x07, 0xb3, + 0x19, 0xb8, 0x1f, 0x29, 0x33, 0xe3, 0x35, 0x18, 0x5b, 0xf1, 0xdc, 0x66, 0xa5, 0xd1, 0x88, 0xa3, + 0x40, 0xa0, 0x54, 0x8e, 0xe9, 0x5b, 0x5c, 0x01, 0xd5, 0x25, 0x94, 0x18, 0x95, 0xbd, 0x46, 0x93, + 0x22, 0x49, 0x4e, 0x8b, 0x93, 0xe2, 0x3b, 0xfb, 0x65, 0x90, 0xdf, 0x94, 0x64, 0xac, 0xc6, 0x90, + 0x9e, 0x12, 0x98, 0x78, 0x69, 0x3c, 0xb3, 0x43, 0x97, 0x1d, 0xd2, 0x33, 0xdd, 0xbc, 0x81, 0x92, + 0x53, 0xfc, 0x58, 0x1e, 0x4e, 0x66, 0x13, 0x7e, 0xd4, 0x24, 0x9b, 0x98, 0x16, 0x44, 0x0b, 0x43, + 0x8c, 0x49, 0x36, 0x65, 0x0e, 0x11, 0xc4, 0x4f, 0x10, 0xd8, 0x36, 0x4c, 0xae, 0xb9, 0x61, 0x74, + 0x93, 0xbb, 0x41, 0xb4, 0xc5, 0xdd, 0x68, 0x00, 0x31, 0xfd, 0x65, 0xf5, 0x80, 0x8e, 0x92, 0xc2, + 0xae, 0xa2, 0x4c, 0x09, 0xd2, 0x26, 0xdb, 0x78, 0xa2, 0x0c, 0x0d, 0x30, 0x51, 0xbe, 0x01, 0xd3, + 0x35, 0xde, 0x72, 0x3b, 0xbb, 0x7e, 0xa0, 0xdc, 0x7c, 0x2f, 0xc1, 0x64, 0x0c, 0xca, 0x9c, 0x2d, + 0x66, 0xb1, 0x81, 0xaf, 0x75, 0x44, 0xb2, 0x95, 0x98, 0xc5, 0xd6, 0xdf, 0xcb, 0xc3, 0xa9, 0x4a, + 0x9d, 0xec, 0xda, 0xa8, 0x40, 0x99, 0xdf, 0x7e, 0x97, 0xeb, 0x66, 0x97, 0x61, 0xec, 0x8e, 0xfb, + 0x64, 0x8d, 0xbb, 0x21, 0x0f, 0x29, 0xc5, 0x99, 0x94, 0x69, 0xdd, 0x27, 0x89, 0xb9, 0x97, 0x9d, + 0xe0, 0xe8, 0x97, 0xfe, 0xa1, 0x8f, 0x79, 0xe9, 0xb7, 0x60, 0xe4, 0xa6, 0xdf, 0x6c, 0xd0, 0x41, + 0x4e, 0x0f, 0x9e, 0xbb, 0x08, 0xb1, 0xa9, 0x44, 0xdc, 0x95, 0xa7, 0xe2, 0x2f, 0xc6, 0x4f, 0xf8, + 0xae, 0x77, 0xc9, 0x79, 0x18, 0xc5, 0x8a, 0xe2, 0x24, 0xd1, 0x78, 0x68, 0x34, 0x39, 0x26, 0xaa, + 0x6a, 0xd8, 0xaa, 0x50, 0xef, 0x89, 0xe1, 0x8f, 0xd7, 0x13, 0xd6, 0x3f, 0xc4, 0xb7, 0x54, 0xbd, + 0x95, 0xe2, 0x24, 0xd2, 0x3e, 0x24, 0x37, 0xe0, 0x87, 0xe4, 0x9f, 0xda, 0x90, 0x14, 0xfa, 0x0e, + 0xc9, 0x0f, 0xe5, 0x61, 0x3c, 0xfe, 0xd8, 0x4f, 0x58, 0x2c, 0xec, 0xb8, 0x5d, 0x03, 0x85, 0xe6, + 0xa8, 0x69, 0x7b, 0x05, 0x45, 0xc0, 0xf8, 0x02, 0x8c, 0xd0, 0x62, 0xca, 0xa5, 0xcc, 0x50, 0x53, + 0xa3, 0xbb, 0x34, 0x45, 0xac, 0x47, 0x70, 0x40, 0x43, 0x9b, 0xe8, 0x30, 0xf6, 0xc9, 0x03, 0xbe, + 0x45, 0x4f, 0xeb, 0xcf, 0xec, 0x19, 0x95, 0x1d, 0xfb, 0x24, 0x69, 0xd8, 0x40, 0xa7, 0xd3, 0x3f, + 0x2b, 0x42, 0x29, 0x4d, 0x72, 0x74, 0xb4, 0xf1, 0x8d, 0xee, 0x96, 0xbc, 0x87, 0xc8, 0x68, 0xe3, + 0x9d, 0xee, 0x96, 0x2d, 0x60, 0x68, 0x79, 0x13, 0x78, 0x8f, 0xb0, 0xd5, 0x13, 0x64, 0x79, 0x13, + 0x78, 0x8f, 0x0c, 0xcb, 0x9b, 0xc0, 0x7b, 0x84, 0x5a, 0x82, 0xb5, 0x1a, 0xba, 0x6b, 0xe3, 0x25, + 0x84, 0xb4, 0x04, 0xcd, 0x30, 0x9d, 0x39, 0x48, 0xa1, 0x89, 0xa3, 0x72, 0x89, 0xbb, 0x01, 0x45, + 0xc6, 0xa6, 0xed, 0x0c, 0x8f, 0xca, 0x2d, 0x04, 0xcb, 0x44, 0xdf, 0xb6, 0x8e, 0xc4, 0x9a, 0xc0, + 0xb4, 0x9f, 0x6a, 0x01, 0x1f, 0x7d, 0x71, 0x56, 0x26, 0x64, 0x73, 0x3a, 0x6b, 0x47, 0x5f, 0xcd, + 0x19, 0x7c, 0x9f, 0xa6, 0xae, 0x76, 0x83, 0xc2, 0xfd, 0xa1, 0x76, 0xa8, 0x78, 0x24, 0x33, 0x15, + 0xcf, 0x00, 0x64, 0x38, 0xc0, 0x58, 0x47, 0x94, 0x30, 0x61, 0xef, 0xc1, 0xb8, 0xee, 0x84, 0x2f, + 0x5d, 0xc5, 0x5f, 0x90, 0x11, 0xdc, 0xfa, 0xe4, 0x9a, 0xd4, 0x09, 0xd8, 0x16, 0x9c, 0x5a, 0xf6, + 0xdb, 0x61, 0xb7, 0xa5, 0x62, 0xc5, 0x25, 0x11, 0x6a, 0x01, 0x87, 0x02, 0x3d, 0x7a, 0xeb, 0x84, + 0x42, 0x3e, 0xdf, 0xca, 0xc6, 0xdf, 0xbc, 0x80, 0xf4, 0x63, 0xc4, 0x36, 0x61, 0x1c, 0xf5, 0x9d, + 0x64, 0x44, 0x38, 0x6e, 0x6e, 0x1b, 0x49, 0xc9, 0x8a, 0x58, 0x18, 0x32, 0xd8, 0x91, 0xdb, 0x6a, + 0x2a, 0x13, 0x73, 0x5d, 0x6f, 0xab, 0x21, 0xb3, 0xaf, 0xc2, 0x94, 0xbc, 0x7f, 0x3d, 0xe0, 0x5b, + 0x72, 0xee, 0x4c, 0x18, 0x6a, 0x06, 0xb3, 0x50, 0x3e, 0xbd, 0x93, 0x96, 0xf9, 0x31, 0xdf, 0x92, + 0x63, 0x6f, 0x38, 0x78, 0x18, 0xf8, 0xec, 0x1e, 0xcc, 0xde, 0x74, 0x43, 0x09, 0xd4, 0xbc, 0xa9, + 0x27, 0x51, 0xfd, 0x8a, 0x86, 0xb7, 0xbb, 0x6e, 0xa8, 0xd4, 0xd6, 0x99, 0xde, 0xd3, 0x59, 0xf4, + 0xec, 0x07, 0x73, 0x30, 0x6f, 0x68, 0xb5, 0xc9, 0xcc, 0xa9, 0xc5, 0xdb, 0x11, 0x7a, 0x72, 0x4c, + 0xc5, 0x29, 0xc6, 0xfb, 0xa1, 0xc9, 0x21, 0x49, 0x29, 0xce, 0x83, 0xa4, 0x5c, 0xb7, 0x68, 0xed, + 0xc7, 0x83, 0x16, 0x2a, 0xae, 0xe9, 0x69, 0x73, 0xa1, 0xa6, 0xd6, 0xb5, 0x42, 0xb3, 0xae, 0xa5, + 0xfb, 0x9b, 0xb4, 0x58, 0xb9, 0x58, 0x8b, 0x35, 0x07, 0xc3, 0xd8, 0xab, 0x2a, 0xf8, 0x0b, 0xfe, + 0xb0, 0x3e, 0xad, 0xef, 0x43, 0x24, 0x16, 0x1e, 0xba, 0x0f, 0x59, 0xff, 0xdd, 0x08, 0x4c, 0xa7, + 0xa6, 0x05, 0xdd, 0x53, 0x73, 0x3d, 0xf7, 0xd4, 0x1a, 0x80, 0xd4, 0xe3, 0x0e, 0xa8, 0x70, 0x55, + 0x5e, 0x64, 0xe3, 0xe4, 0x94, 0x19, 0xaf, 0x29, 0x8d, 0x8d, 0x60, 0x2a, 0x57, 0xec, 0x80, 0x0a, + 0xf0, 0x98, 0xa9, 0x5c, 0xf4, 0x1a, 0xd3, 0x84, 0x0d, 0x2b, 0xc3, 0x30, 0x46, 0x6c, 0xd4, 0x9d, + 0xf8, 0x3c, 0x01, 0xb0, 0x25, 0x9c, 0xbd, 0x04, 0x23, 0x42, 0x88, 0xaa, 0xae, 0xd0, 0x26, 0x88, + 0x67, 0x8b, 0x90, 0xb2, 0x84, 0xc4, 0x42, 0x45, 0xec, 0x1a, 0x4c, 0xc8, 0xbf, 0x28, 0x68, 0xc7, + 0x88, 0x69, 0x7b, 0xe7, 0x78, 0x0d, 0x15, 0xb7, 0xc3, 0xc0, 0x13, 0xb7, 0x8b, 0x5a, 0x17, 0x75, + 0x36, 0xd5, 0x15, 0x0a, 0xf1, 0x8b, 0xb7, 0x8b, 0x50, 0x02, 0x31, 0x85, 0x7f, 0x8c, 0x20, 0x64, + 0x19, 0x32, 0xa5, 0x2f, 0xe2, 0x9d, 0x12, 0x65, 0x19, 0x69, 0x42, 0x6f, 0x53, 0x09, 0xbb, 0x28, + 0xdf, 0x4d, 0x50, 0x2c, 0x94, 0x99, 0xd2, 0xf0, 0x51, 0x02, 0x15, 0x13, 0x28, 0x1b, 0xc6, 0xc5, + 0xa2, 0x72, 0xf1, 0xf7, 0x6a, 0xcb, 0xf5, 0x9a, 0xb4, 0xad, 0x60, 0xe5, 0x88, 0xcb, 0x05, 0xd4, + 0x4e, 0x10, 0xd8, 0x3b, 0x30, 0x25, 0x7e, 0x2c, 0xfb, 0xad, 0x96, 0xdf, 0x46, 0xf6, 0xe3, 0x49, + 0xfc, 0x27, 0x24, 0xa9, 0x63, 0x91, 0xac, 0x25, 0x85, 0x2b, 0xce, 0x13, 0x7c, 0x93, 0xed, 0xca, + 0x17, 0x9d, 0x89, 0xe4, 0x3c, 0x41, 0xd2, 0x50, 0xc2, 0x6d, 0x1d, 0x89, 0xbd, 0x05, 0x93, 0xe2, + 0xe7, 0x0d, 0xef, 0x11, 0x97, 0x15, 0x4e, 0x26, 0xc6, 0x08, 0x48, 0xb5, 0x23, 0x4a, 0x64, 0x7d, + 0x26, 0x26, 0xfb, 0x22, 0x9c, 0x40, 0x4e, 0x75, 0xbf, 0xc3, 0x1b, 0x95, 0xed, 0x6d, 0xaf, 0xe9, + 0x49, 0x63, 0x28, 0x19, 0x9e, 0x02, 0x15, 0xec, 0xb2, 0x62, 0xc4, 0x70, 0xdc, 0x04, 0xc5, 0xce, + 0xa6, 0x64, 0x0f, 0xa0, 0xb4, 0xdc, 0x0d, 0x23, 0xbf, 0x55, 0x89, 0xa2, 0xc0, 0xdb, 0xea, 0x46, + 0x3c, 0x9c, 0x9f, 0x36, 0x82, 0x38, 0x88, 0xc5, 0x11, 0x17, 0x4a, 0x7d, 0x50, 0x1d, 0x29, 0x1c, + 0x37, 0x26, 0xb1, 0x7b, 0x98, 0x58, 0x7f, 0x90, 0x83, 0x49, 0x83, 0x94, 0xbd, 0x09, 0x13, 0xd7, + 0x03, 0x8f, 0xb7, 0x1b, 0xcd, 0x3d, 0xed, 0xa2, 0x8a, 0xb7, 0x98, 0x6d, 0x82, 0xcb, 0x56, 0x1b, + 0x68, 0xb1, 0x9e, 0x27, 0x9f, 0x69, 0xa9, 0x78, 0x59, 0xfa, 0x92, 0xd2, 0x04, 0x2d, 0x24, 0x51, + 0x65, 0x70, 0x82, 0xd2, 0xec, 0xd4, 0x50, 0xd8, 0xbb, 0x30, 0x22, 0x5f, 0x6f, 0xc9, 0x6c, 0xee, + 0x74, 0x56, 0x33, 0xa5, 0xdf, 0x32, 0x4e, 0x44, 0x34, 0xd1, 0x09, 0x6d, 0x22, 0xb2, 0x7e, 0x3a, + 0x07, 0xac, 0x17, 0xf5, 0x08, 0xbd, 0xd7, 0x91, 0xa6, 0x3f, 0x5f, 0x88, 0x57, 0x63, 0xc1, 0x50, + 0x88, 0x8b, 0x9a, 0x64, 0x81, 0xec, 0x78, 0x5a, 0x75, 0xba, 0x22, 0x4e, 0x16, 0x5b, 0x3f, 0x90, + 0x07, 0x48, 0xb0, 0xd9, 0xe7, 0x64, 0x62, 0x9c, 0x2f, 0x76, 0xdd, 0xa6, 0xb7, 0xed, 0x99, 0x91, + 0x22, 0x91, 0xc9, 0x37, 0x54, 0x89, 0x6d, 0x22, 0xb2, 0xf7, 0x61, 0xba, 0xb6, 0x61, 0xd2, 0x6a, + 0x76, 0xd4, 0x61, 0xc7, 0x49, 0x91, 0xa7, 0xb1, 0xd1, 0x3c, 0x56, 0x1f, 0x0d, 0x69, 0x1e, 0x2b, + 0x07, 0x82, 0x4a, 0xc4, 0xc6, 0x52, 0xdb, 0x20, 0x53, 0xf1, 0x46, 0x75, 0x85, 0x76, 0x29, 0xfc, + 0xba, 0xb0, 0xe3, 0x74, 0xc8, 0x86, 0x5c, 0xec, 0x13, 0x06, 0x5e, 0xd2, 0x91, 0xc3, 0x7d, 0x7c, + 0x93, 0x7f, 0x06, 0xd5, 0x7e, 0x2d, 0x3f, 0xe2, 0xa4, 0xed, 0x78, 0x66, 0xef, 0x3d, 0xc9, 0xd3, + 0xff, 0xb0, 0xe1, 0x72, 0x69, 0xb4, 0x8e, 0xcc, 0x5b, 0xae, 0x26, 0x97, 0x14, 0x69, 0x04, 0x90, + 0x61, 0x11, 0xf3, 0x0f, 0x72, 0x70, 0x22, 0x93, 0x96, 0x5d, 0x02, 0x48, 0x74, 0x4a, 0xd4, 0x4b, + 0xb8, 0x63, 0x26, 0xb1, 0x54, 0x6c, 0x0d, 0x83, 0x7d, 0x25, 0xad, 0x0d, 0x3a, 0xfa, 0x20, 0x5c, + 0x50, 0xb1, 0xb2, 0x4c, 0x6d, 0x50, 0x86, 0x0e, 0xc8, 0xfa, 0x47, 0x05, 0x98, 0xd1, 0x42, 0xb5, + 0xc8, 0x6f, 0x3d, 0xc2, 0x5c, 0xf9, 0x21, 0x4c, 0x88, 0xd6, 0x78, 0x75, 0xf2, 0xfb, 0x92, 0x66, + 0x2a, 0xaf, 0xf5, 0x38, 0xcd, 0x11, 0xb7, 0x4b, 0x3a, 0xb2, 0x8c, 0x60, 0x87, 0x5b, 0x27, 0xbe, + 0x36, 0xd4, 0x7b, 0xfd, 0xbf, 0x0c, 0xe6, 0x2c, 0x84, 0xc9, 0x95, 0xbd, 0xb6, 0xdb, 0x8a, 0x6b, + 0x93, 0xe6, 0x2a, 0x9f, 0xea, 0x5b, 0x9b, 0x81, 0x2d, 0xab, 0x4b, 0xdc, 0x4b, 0x64, 0x59, 0x86, + 0x67, 0xb3, 0x41, 0xb5, 0xf0, 0x3e, 0xcc, 0xf4, 0x7c, 0xf4, 0xb1, 0x82, 0xe9, 0x3d, 0x00, 0xd6, + 0xfb, 0x1d, 0x19, 0x1c, 0x3e, 0x65, 0x86, 0x6a, 0x3c, 0x11, 0xbf, 0x4c, 0x63, 0xea, 0x70, 0x69, + 0xfc, 0xb2, 0xa8, 0x87, 0xda, 0xfb, 0x99, 0xbc, 0xee, 0xb8, 0xf8, 0xac, 0xaf, 0xba, 0x2f, 0x18, + 0xb7, 0xe1, 0xb3, 0xfd, 0xc6, 0x74, 0x20, 0xad, 0xc3, 0xb7, 0x0b, 0x70, 0xaa, 0x0f, 0x25, 0xdb, + 0x4b, 0x4f, 0x22, 0xa9, 0x85, 0xb8, 0x72, 0x78, 0x85, 0x4f, 0x63, 0x2a, 0xb1, 0xcf, 0xc9, 0xd0, + 0x05, 0x75, 0x4c, 0x4f, 0x4d, 0xf7, 0x6f, 0x54, 0xe3, 0x3f, 0x8c, 0xa1, 0xe9, 0x98, 0x05, 0x12, + 0xca, 0xde, 0x87, 0x61, 0xf4, 0x5a, 0x4d, 0x85, 0x8a, 0x13, 0x18, 0x08, 0xd7, 0xe2, 0xea, 0x89, + 0x9f, 0x46, 0x5c, 0x3d, 0x01, 0x60, 0x9f, 0x85, 0x42, 0xe5, 0x41, 0x8d, 0xc6, 0x65, 0x4a, 0x27, + 0x7f, 0x50, 0x4b, 0xc2, 0xf9, 0xbb, 0x46, 0xdc, 0x7d, 0x41, 0x21, 0x08, 0x6f, 0x2c, 0x6f, 0xd0, + 0xa8, 0xe8, 0x84, 0x37, 0x96, 0x37, 0x12, 0xc2, 0x9d, 0xba, 0x11, 0x7a, 0xe7, 0xc6, 0xf2, 0xc6, + 0x77, 0x6f, 0xda, 0xff, 0x5b, 0x79, 0x19, 0x6f, 0x41, 0x36, 0xec, 0x7d, 0x98, 0x30, 0x42, 0xe9, + 0xe6, 0x12, 0x79, 0x2c, 0x8e, 0x58, 0x9c, 0xb2, 0xef, 0x31, 0x08, 0x54, 0x62, 0x0c, 0xf1, 0x1b, + 0x25, 0x5e, 0xdd, 0x92, 0x26, 0xe6, 0x80, 0x32, 0x71, 0x3a, 0x31, 0x46, 0x4c, 0xc2, 0xae, 0x42, + 0x71, 0x93, 0xb7, 0xdd, 0x76, 0x14, 0x2b, 0x44, 0xd1, 0x14, 0x38, 0x42, 0x98, 0x29, 0x35, 0xc4, + 0x88, 0x68, 0xb6, 0xda, 0xdd, 0x0a, 0xeb, 0x81, 0x87, 0x71, 0x59, 0xe2, 0xb3, 0x58, 0x9a, 0xad, + 0x6a, 0x25, 0x26, 0x83, 0x14, 0x91, 0xf5, 0x33, 0x39, 0x18, 0xa5, 0x81, 0x94, 0x09, 0x8d, 0x76, + 0x92, 0xb3, 0x84, 0x12, 0x1a, 0xed, 0x78, 0xe9, 0x84, 0x46, 0x3b, 0x32, 0xf8, 0xc9, 0x18, 0x79, + 0x62, 0xc5, 0x4f, 0x83, 0x32, 0x27, 0x3f, 0xf9, 0xac, 0x99, 0xf9, 0x6a, 0x62, 0xd4, 0x41, 0xfd, + 0x81, 0xac, 0xbf, 0x4f, 0x5f, 0x76, 0x63, 0x79, 0x83, 0x2d, 0x42, 0x71, 0xcd, 0x97, 0x81, 0x75, + 0xf4, 0xec, 0x94, 0x4d, 0x82, 0xe9, 0x1d, 0xa4, 0xf0, 0xc4, 0xf7, 0x6d, 0x04, 0x3e, 0xdd, 0x65, + 0xb4, 0xef, 0xeb, 0x48, 0x60, 0xea, 0xfb, 0x62, 0xd4, 0x81, 0xbf, 0x8f, 0x67, 0x6c, 0x12, 0xf7, + 0xaf, 0x62, 0xc6, 0x80, 0x5b, 0xba, 0x9f, 0x15, 0x15, 0xa9, 0x9d, 0x62, 0xa1, 0xdf, 0x4e, 0x71, + 0xff, 0xaa, 0x9d, 0x41, 0x85, 0xef, 0x6a, 0x09, 0xb8, 0xc6, 0x83, 0x47, 0xcf, 0xf0, 0x2e, 0x9d, + 0xfd, 0xae, 0x96, 0x6e, 0xde, 0x40, 0x9b, 0xf4, 0xef, 0xe5, 0xe1, 0x64, 0x36, 0xa1, 0xde, 0x96, + 0xdc, 0x21, 0x6d, 0xb9, 0x00, 0xc5, 0x9b, 0x7e, 0x18, 0x69, 0x26, 0x7d, 0xa8, 0xfe, 0xdf, 0x25, + 0x98, 0x1d, 0x97, 0x8a, 0x3b, 0xb7, 0xf8, 0x3b, 0x5e, 0x9e, 0xc8, 0x0f, 0xa3, 0x0c, 0x88, 0x3b, + 0xb7, 0x2c, 0x62, 0x37, 0xa0, 0x68, 0x93, 0x9f, 0x4f, 0xaa, 0x6b, 0x14, 0x38, 0x96, 0xa6, 0x58, + 0x40, 0x10, 0x23, 0xa2, 0x31, 0xc1, 0x58, 0x05, 0x46, 0x69, 0xf4, 0x53, 0x4f, 0xc7, 0x19, 0x53, + 0xc6, 0x0c, 0x32, 0xae, 0xe8, 0xc4, 0x8e, 0x82, 0x8f, 0x80, 0xd5, 0x15, 0xe5, 0xb2, 0x83, 0x3b, + 0x8a, 0x7c, 0x24, 0x34, 0xad, 0x27, 0x63, 0x44, 0xeb, 0x07, 0xf3, 0x00, 0x4a, 0x6b, 0xf3, 0xcc, + 0xce, 0xb0, 0xcf, 0x1a, 0x33, 0x4c, 0x33, 0x26, 0x1a, 0x3c, 0x01, 0xe7, 0x5d, 0xb4, 0xd5, 0x19, + 0x3c, 0xfd, 0x66, 0x19, 0x86, 0x37, 0x13, 0x85, 0x16, 0x39, 0x90, 0xa0, 0x3a, 0x5a, 0xc2, 0xad, + 0x2d, 0x98, 0xbb, 0xc1, 0xa3, 0x44, 0xbd, 0xa5, 0x9e, 0x1e, 0x0f, 0x67, 0xfb, 0x3a, 0x8c, 0x11, + 0x7e, 0xbc, 0x7f, 0x49, 0x5d, 0x0c, 0x05, 0xee, 0x40, 0x5d, 0x8c, 0x42, 0x10, 0xbb, 0xd1, 0x0a, + 0x6f, 0xf2, 0x88, 0x7f, 0x77, 0xab, 0xa9, 0x01, 0x93, 0x4d, 0xc1, 0x96, 0x0d, 0x56, 0xc3, 0x91, + 0xfd, 0x73, 0x1f, 0x4e, 0xc4, 0xdf, 0xfe, 0x34, 0xf9, 0x5e, 0x16, 0x57, 0x4a, 0x8a, 0xcf, 0x9d, + 0x70, 0x3c, 0xc4, 0xf6, 0xe4, 0x09, 0x2c, 0x28, 0x82, 0x07, 0x5e, 0x6c, 0x15, 0x39, 0x10, 0x2d, + 0x7b, 0x07, 0xc6, 0x35, 0x1a, 0x8a, 0x2f, 0x8d, 0x6a, 0xea, 0xc7, 0x5e, 0xb4, 0xeb, 0x84, 0x12, + 0xae, 0xab, 0xa9, 0x35, 0x74, 0xeb, 0xcb, 0xf0, 0x7c, 0xec, 0xe4, 0x93, 0x51, 0x75, 0x8a, 0x79, + 0xee, 0x78, 0xcc, 0xd7, 0x93, 0x66, 0x55, 0xdb, 0xb1, 0x63, 0xae, 0xe2, 0xcd, 0xf4, 0x66, 0x51, + 0x63, 0x5e, 0xe8, 0x71, 0xf5, 0xd5, 0x3c, 0x7a, 0xad, 0xb7, 0xb5, 0x8f, 0xcd, 0x60, 0x68, 0x10, + 0xe7, 0xd2, 0xc4, 0x3f, 0x98, 0x87, 0xe9, 0xbb, 0xd5, 0x95, 0xe5, 0xd8, 0xfa, 0xe8, 0x13, 0x96, + 0x1e, 0xd4, 0x68, 0x5b, 0xff, 0xfd, 0xc6, 0xba, 0x07, 0xb3, 0xa9, 0x6e, 0x40, 0xd1, 0xe1, 0x3d, + 0xe9, 0x1e, 0x12, 0x83, 0x95, 0xd8, 0x70, 0x32, 0x8b, 0xfd, 0xfd, 0xab, 0x76, 0x0a, 0xdb, 0xfa, + 0xc7, 0x90, 0xe2, 0x4b, 0x5b, 0xd8, 0xeb, 0x30, 0x56, 0x0d, 0xc3, 0x2e, 0x0f, 0xee, 0xd9, 0x6b, + 0xba, 0xaa, 0xc0, 0x43, 0xa0, 0xd3, 0x0d, 0x9a, 0x76, 0x82, 0xc0, 0x2e, 0x42, 0x91, 0x42, 0x2e, + 0xab, 0x3d, 0x01, 0xb5, 0xb6, 0x71, 0xc4, 0x66, 0x3b, 0x2e, 0x66, 0x6f, 0xc2, 0x84, 0xfc, 0x5b, + 0xce, 0x36, 0xea, 0x70, 0x54, 0x0e, 0x12, 0xba, 0x9c, 0x9d, 0xb6, 0x81, 0xc6, 0x5e, 0x83, 0x42, + 0x65, 0xd9, 0x26, 0x75, 0x10, 0xc9, 0x8d, 0x98, 0xf4, 0xbb, 0xcb, 0xcd, 0x4b, 0xc4, 0xb2, 0x2d, + 0xa4, 0x3f, 0x15, 0x9d, 0x80, 0x34, 0xd9, 0x32, 0x37, 0x39, 0xc1, 0x52, 0x87, 0x19, 0xc2, 0xd8, + 0x65, 0x18, 0x5d, 0xf1, 0xc2, 0x4e, 0xd3, 0xdd, 0x23, 0x3d, 0xb6, 0xcc, 0x7d, 0x25, 0x41, 0x86, + 0x6f, 0xbf, 0x04, 0xb1, 0x8b, 0x2a, 0x27, 0x50, 0x31, 0xf1, 0x32, 0xe9, 0x93, 0xf8, 0xe7, 0x75, + 0x18, 0xa1, 0xc0, 0xc4, 0x63, 0x5a, 0xca, 0x81, 0x74, 0x40, 0x62, 0xc2, 0xe9, 0x75, 0x37, 0x85, + 0xa7, 0xe9, 0x6e, 0xba, 0x05, 0xa7, 0x6e, 0xa0, 0xf6, 0xc6, 0x8c, 0xe6, 0x73, 0xcf, 0xae, 0x92, + 0x3e, 0x1c, 0x9f, 0x81, 0xa4, 0x82, 0x27, 0x1d, 0x10, 0xc8, 0xe9, 0x06, 0x7a, 0x2a, 0xc7, 0x7e, + 0x8c, 0xd8, 0x97, 0x60, 0x2e, 0xab, 0x88, 0xb4, 0xe6, 0x18, 0xb7, 0x26, 0xbb, 0x02, 0x3d, 0x6e, + 0x4d, 0x16, 0x07, 0xb6, 0x06, 0x25, 0x09, 0xaf, 0x34, 0x5a, 0x5e, 0x5b, 0x6a, 0xfe, 0xa5, 0x56, + 0x1d, 0xdd, 0x3e, 0x88, 0xab, 0x2b, 0x0a, 0xe5, 0x0b, 0x80, 0xe1, 0x28, 0x94, 0xa2, 0x64, 0x3f, + 0x91, 0x13, 0xb7, 0x39, 0x19, 0xc6, 0xf7, 0x9e, 0xbd, 0x16, 0x52, 0xcc, 0xb3, 0x93, 0x89, 0x0f, + 0x50, 0x2d, 0x0a, 0xbc, 0xf6, 0x0e, 0x39, 0x01, 0x6d, 0x92, 0x13, 0xd0, 0x3b, 0x1f, 0xc9, 0x09, + 0x48, 0xb2, 0x0a, 0x0f, 0xf6, 0xcb, 0x13, 0x01, 0xd5, 0x89, 0xab, 0xc8, 0xf8, 0x02, 0xd1, 0x75, + 0xe8, 0x09, 0x7b, 0xaf, 0x2d, 0x83, 0x88, 0xf2, 0x86, 0x6c, 0xe4, 0x34, 0xee, 0xe0, 0xd8, 0x75, + 0x18, 0xca, 0xde, 0xe9, 0xc6, 0x08, 0x3d, 0x0d, 0xcd, 0xe4, 0x20, 0x2e, 0x9e, 0xca, 0xd1, 0x44, + 0xfa, 0xce, 0x96, 0x92, 0x8b, 0xa7, 0xf2, 0x4a, 0x71, 0x70, 0x1a, 0xe9, 0x93, 0xc7, 0x20, 0x61, + 0x97, 0x61, 0xe4, 0x8e, 0xfb, 0xa4, 0xb2, 0xc3, 0x29, 0xd7, 0xdb, 0xa4, 0xda, 0xfe, 0x10, 0xb8, + 0x54, 0xfc, 0x7d, 0xe9, 0xc8, 0xf0, 0x9c, 0x4d, 0x68, 0xec, 0xfb, 0x72, 0x70, 0x52, 0x2e, 0x63, + 0xd5, 0xca, 0x1a, 0x8f, 0x22, 0xd1, 0x0f, 0x14, 0xfc, 0xec, 0x5c, 0x62, 0x8d, 0x9d, 0x8d, 0x27, + 0x93, 0xe6, 0xd3, 0xce, 0x10, 0x77, 0x5c, 0x48, 0xa5, 0x46, 0x58, 0xd7, 0x4c, 0x7a, 0xb6, 0x09, + 0xe3, 0x77, 0xae, 0x57, 0xe2, 0x6a, 0x65, 0xac, 0xe7, 0x72, 0xd6, 0xee, 0xa8, 0xa1, 0x65, 0xb9, + 0x11, 0xe8, 0x6c, 0xc8, 0xf4, 0xff, 0xb3, 0xaa, 0x3f, 0xd8, 0x1b, 0xba, 0xe3, 0x68, 0x01, 0xa5, + 0xe7, 0xd1, 0x96, 0xfb, 0xc4, 0x71, 0x77, 0xb8, 0xf1, 0x4a, 0x4e, 0xda, 0xeb, 0x9f, 0xca, 0xc1, + 0xe9, 0xbe, 0x4d, 0x66, 0xd7, 0xe0, 0x94, 0x2b, 0xdd, 0xa1, 0x9d, 0xdd, 0x28, 0xea, 0x84, 0x8e, + 0xba, 0x62, 0x90, 0xab, 0xa9, 0x7d, 0x82, 0x8a, 0x6f, 0x8a, 0x52, 0x75, 0xeb, 0x08, 0xd9, 0xfb, + 0xf0, 0x82, 0xd7, 0x0e, 0x79, 0xbd, 0x1b, 0x70, 0x47, 0x31, 0xa8, 0x7b, 0x8d, 0xc0, 0x09, 0xdc, + 0xf6, 0x8e, 0xf2, 0x9b, 0xb5, 0x4f, 0x2b, 0x1c, 0x72, 0xb9, 0x5e, 0xf6, 0x1a, 0x81, 0x8d, 0x08, + 0xd6, 0x1f, 0xe4, 0x60, 0xbe, 0x5f, 0x97, 0xb0, 0x79, 0x18, 0xe5, 0x6d, 0x77, 0xab, 0xa9, 0xbc, + 0x85, 0x6c, 0xf5, 0x93, 0x3d, 0x0f, 0xc9, 0x4e, 0x4f, 0xa7, 0x7f, 0xb1, 0x4e, 0x11, 0xf8, 0xd1, + 0x6e, 0x5d, 0xdf, 0xd7, 0xc9, 0xce, 0x7c, 0xa2, 0xae, 0xef, 0xee, 0x67, 0x00, 0x92, 0xed, 0x5c, + 0x2a, 0x26, 0xec, 0x31, 0xb7, 0x1e, 0xc8, 0x95, 0xc7, 0x4e, 0xc2, 0x88, 0xdc, 0x2e, 0xc9, 0xb9, + 0x81, 0x7e, 0x89, 0x73, 0x9b, 0x3a, 0x19, 0xf7, 0xf9, 0xc2, 0xd2, 0x84, 0xd1, 0xd9, 0x23, 0x2d, + 0x1c, 0x1c, 0xeb, 0x27, 0x27, 0xa5, 0x08, 0x51, 0xe9, 0x46, 0xbb, 0x4a, 0xe8, 0x58, 0xcc, 0xf2, + 0xee, 0x92, 0xb6, 0x94, 0x9a, 0xd1, 0xb5, 0xe9, 0xd3, 0xa5, 0xde, 0x7e, 0xf2, 0x99, 0x6f, 0x3f, + 0xaf, 0xc3, 0xd8, 0xf2, 0x2e, 0xaf, 0x3f, 0x8c, 0x3d, 0x6c, 0x8a, 0xa4, 0x5c, 0x17, 0x40, 0x19, + 0x60, 0x39, 0x41, 0x60, 0x97, 0x01, 0xd0, 0xa9, 0x54, 0x4a, 0xa4, 0x5a, 0x92, 0x04, 0xf4, 0x41, + 0x25, 0xf3, 0x14, 0x0d, 0x05, 0xd9, 0xd7, 0xec, 0xeb, 0xba, 0x3d, 0x8b, 0x64, 0x1f, 0x06, 0xdb, + 0x84, 0x9e, 0x20, 0x88, 0xe6, 0x69, 0xfb, 0x0a, 0x9d, 0x82, 0xa5, 0x9e, 0xcd, 0x47, 0x47, 0x62, + 0x97, 0x60, 0x6c, 0x43, 0x79, 0x09, 0xe0, 0x21, 0x38, 0x81, 0x14, 0x90, 0x78, 0x14, 0xcc, 0xe7, + 0xec, 0x04, 0x85, 0x7d, 0x16, 0x46, 0x97, 0x79, 0x10, 0x6d, 0x6e, 0xae, 0xa1, 0xd1, 0x89, 0xcc, + 0x25, 0x50, 0xc4, 0xb8, 0xef, 0x51, 0xd4, 0xfc, 0xce, 0x7e, 0x79, 0x32, 0xf2, 0x5a, 0x3c, 0x8e, + 0x91, 0x6c, 0x2b, 0x6c, 0xb6, 0x04, 0x25, 0xf9, 0x2c, 0x9e, 0xdc, 0x3d, 0xf0, 0x64, 0x2c, 0xca, + 0x73, 0x9a, 0xde, 0xd0, 0x1f, 0xf3, 0xad, 0x38, 0xea, 0x7d, 0x0f, 0x3e, 0x5b, 0x55, 0xc9, 0x22, + 0xf4, 0x66, 0x42, 0xa2, 0x0c, 0x4b, 0xef, 0x18, 0xa2, 0xb5, 0xbd, 0x14, 0xac, 0x02, 0x93, 0xcb, + 0x7e, 0xab, 0xe3, 0x46, 0x1e, 0x66, 0x5e, 0xdb, 0xa3, 0x43, 0x10, 0x15, 0x7a, 0x75, 0xbd, 0xc0, + 0x38, 0x51, 0xf5, 0x02, 0x76, 0x1d, 0xa6, 0x6c, 0xbf, 0x2b, 0x86, 0x49, 0xdd, 0xc2, 0xe5, 0x39, + 0x87, 0xa6, 0x21, 0x81, 0x28, 0x11, 0xc7, 0x32, 0x5d, 0xb9, 0x8d, 0xf0, 0x95, 0x06, 0x15, 0x5b, + 0xcf, 0x78, 0x0e, 0xd1, 0x0f, 0x37, 0x3d, 0xf6, 0x7d, 0x0f, 0xb3, 0x8c, 0x97, 0x94, 0xab, 0x30, + 0x5e, 0xab, 0xdd, 0xdd, 0xe4, 0x61, 0x74, 0xbd, 0xe9, 0x3f, 0xc6, 0xb3, 0xad, 0x48, 0x39, 0x81, + 0x42, 0xdf, 0x89, 0x78, 0x18, 0x39, 0xdb, 0x4d, 0xff, 0xb1, 0xad, 0x63, 0xb1, 0xaf, 0x89, 0xfe, + 0xd0, 0x24, 0x41, 0x0a, 0xd4, 0x79, 0x98, 0xb0, 0x8a, 0x27, 0x48, 0xb2, 0x68, 0x84, 0xc8, 0x6a, + 0x76, 0x96, 0x86, 0x8e, 0x0e, 0x63, 0x81, 0xff, 0x64, 0xaf, 0xd2, 0x68, 0x04, 0x3c, 0x0c, 0xe9, + 0x10, 0x92, 0x0e, 0x63, 0xa8, 0x6c, 0x70, 0x65, 0x81, 0xe1, 0x30, 0xa6, 0x11, 0xb0, 0x1f, 0xce, + 0xc1, 0x09, 0xdd, 0x95, 0x04, 0x97, 0x0b, 0x9a, 0xb9, 0xc8, 0x23, 0xe9, 0x8d, 0x4b, 0xea, 0x10, + 0xbe, 0xa4, 0xa1, 0x5d, 0x7a, 0x74, 0xe5, 0x52, 0x25, 0xf9, 0x59, 0x53, 0x44, 0x18, 0x74, 0xac, + 0x9c, 0xc9, 0x2f, 0xf9, 0x82, 0xf9, 0x9c, 0x3d, 0xe7, 0x66, 0x10, 0xb3, 0x65, 0x21, 0xa9, 0x89, + 0x19, 0x85, 0x86, 0x53, 0xd5, 0x0d, 0x3c, 0xd3, 0x48, 0xa3, 0x4a, 0xf3, 0x4f, 0x9a, 0x58, 0x79, + 0x1d, 0x53, 0x20, 0xd3, 0x68, 0x58, 0x15, 0xa6, 0x25, 0x40, 0x6c, 0x0b, 0x32, 0x65, 0xcc, 0x6c, + 0x12, 0xb6, 0x9e, 0xd8, 0xe0, 0x5b, 0x3f, 0xa6, 0x8d, 0xd1, 0x23, 0x4b, 0xa6, 0xe8, 0xd8, 0xfb, + 0x30, 0x15, 0x86, 0xbb, 0x8e, 0xb6, 0x5e, 0xe7, 0x70, 0x15, 0x63, 0x80, 0x4c, 0x2a, 0x49, 0xb9, + 0xd5, 0x4d, 0x84, 0xe1, 0x6e, 0xb2, 0xa2, 0xdf, 0x87, 0x29, 0xb4, 0xd5, 0x49, 0x18, 0x9c, 0x48, + 0x18, 0x50, 0x49, 0x9a, 0x41, 0xd4, 0x0c, 0x13, 0x06, 0x7f, 0x27, 0x07, 0xa7, 0x45, 0x45, 0xd9, + 0x23, 0x74, 0xf2, 0xa3, 0x8c, 0x10, 0x86, 0x0c, 0xec, 0xcb, 0x53, 0x17, 0x47, 0xc3, 0x70, 0x37, + 0x8b, 0x03, 0x7e, 0x94, 0xf8, 0xf8, 0xec, 0x8f, 0x3a, 0xf5, 0x91, 0x3f, 0xaa, 0x2f, 0x4f, 0xfd, + 0xa3, 0xa2, 0x66, 0x98, 0xc5, 0x01, 0xaf, 0xb5, 0xb5, 0xca, 0x9d, 0xb5, 0xe4, 0x6e, 0xf6, 0xc9, + 0x72, 0x5b, 0x31, 0xda, 0x76, 0x88, 0xdb, 0xca, 0x3d, 0xe9, 0xf3, 0xac, 0x75, 0x83, 0xba, 0xd6, + 0x1a, 0xe0, 0xf4, 0xb5, 0x36, 0x45, 0x63, 0xa7, 0xb0, 0xad, 0x5f, 0x80, 0x14, 0x5f, 0x32, 0x55, + 0xb5, 0x60, 0x44, 0xde, 0x5a, 0xa9, 0x93, 0xd1, 0x66, 0x41, 0xde, 0x69, 0x6d, 0x2a, 0x61, 0xa7, + 0xa1, 0x50, 0xab, 0xdd, 0xa5, 0x4e, 0x46, 0x83, 0xd5, 0x30, 0xf4, 0x6d, 0x01, 0x13, 0x23, 0x84, + 0x56, 0xa8, 0x5a, 0x40, 0x75, 0x71, 0xde, 0xd9, 0x08, 0x15, 0xfd, 0xad, 0xee, 0x90, 0x43, 0x49, + 0x7f, 0xd3, 0x1d, 0x32, 0xb9, 0x39, 0x2e, 0xc3, 0x7c, 0x25, 0x0c, 0x79, 0x20, 0x26, 0x04, 0x19, + 0x37, 0x06, 0x74, 0xcf, 0xa1, 0x83, 0x1d, 0x2b, 0x75, 0xeb, 0xa1, 0xdd, 0x17, 0x91, 0x5d, 0x80, + 0x62, 0xa5, 0xdb, 0xf0, 0x78, 0xbb, 0x6e, 0x44, 0x05, 0x73, 0x09, 0x66, 0xc7, 0xa5, 0xec, 0x8b, + 0x70, 0x22, 0x15, 0xb2, 0x8f, 0x7a, 0x60, 0x34, 0xd9, 0x7b, 0xd5, 0x3d, 0x2c, 0x31, 0xc8, 0x90, + 0x5d, 0x92, 0x4d, 0xc9, 0x2a, 0x50, 0x5a, 0x45, 0x37, 0xad, 0x15, 0x2e, 0xdf, 0x86, 0xfc, 0x40, + 0x3a, 0xdf, 0xc9, 0x5b, 0xb3, 0x74, 0xe1, 0x72, 0x1a, 0x71, 0xa1, 0xdd, 0x83, 0xce, 0x6e, 0xc3, + 0x6c, 0x1a, 0x26, 0x4e, 0x70, 0x79, 0x41, 0xc6, 0xfd, 0xa6, 0x87, 0x0b, 0x9e, 0xe1, 0x59, 0x54, + 0x6c, 0x0b, 0x66, 0x12, 0x83, 0x24, 0xf3, 0xda, 0xac, 0xec, 0x9c, 0xe3, 0x72, 0x75, 0x75, 0x7e, + 0x9e, 0x26, 0xe3, 0x6c, 0x62, 0xdc, 0x14, 0x5f, 0x9f, 0xed, 0x5e, 0x76, 0xac, 0x01, 0x53, 0x35, + 0x6f, 0xa7, 0xed, 0xb5, 0x77, 0x6e, 0xf3, 0xbd, 0x0d, 0xd7, 0x0b, 0xc8, 0xe2, 0x54, 0xd9, 0x93, + 0x57, 0xc2, 0xbd, 0x56, 0x8b, 0x47, 0x01, 0x6e, 0x84, 0xa2, 0x1c, 0x1d, 0xcc, 0xc5, 0x75, 0x68, + 0x21, 0x94, 0x74, 0xe8, 0x93, 0xd9, 0x71, 0x3d, 0x43, 0x08, 0x30, 0x79, 0x1a, 0xaa, 0x8b, 0x89, + 0x01, 0x55, 0x17, 0x4d, 0x98, 0x59, 0x6d, 0xd7, 0x83, 0x3d, 0x7c, 0xa2, 0x53, 0x1f, 0x37, 0x79, + 0xc4, 0xc7, 0xbd, 0x4c, 0x1f, 0xf7, 0x82, 0xab, 0x66, 0x58, 0xd6, 0xe7, 0xf5, 0x32, 0x66, 0x35, + 0x98, 0xc1, 0x8b, 0x43, 0x75, 0x65, 0xa3, 0xda, 0xf6, 0x22, 0xcf, 0x8d, 0x78, 0x83, 0x84, 0x8b, + 0x57, 0x88, 0xe7, 0x19, 0x79, 0x45, 0xf5, 0x1a, 0x1d, 0xc7, 0x53, 0x28, 0x3a, 0xd3, 0x1e, 0xfa, + 0xc3, 0xee, 0x89, 0xd3, 0x7f, 0x41, 0xf7, 0xc4, 0x2a, 0x4c, 0xa7, 0x03, 0x2f, 0x94, 0x92, 0x73, + 0x38, 0xc4, 0x22, 0x71, 0x9c, 0xfb, 0x5d, 0x14, 0x26, 0x8d, 0x9c, 0x7f, 0x26, 0x5d, 0xfa, 0xca, + 0x39, 0x63, 0x5c, 0x39, 0x8d, 0x5d, 0xe9, 0x18, 0x57, 0x4e, 0xb6, 0x01, 0x70, 0xdd, 0x0f, 0xea, + 0xbc, 0x82, 0xce, 0xcf, 0xcc, 0xc8, 0x9e, 0x23, 0x98, 0x26, 0x85, 0x72, 0xfd, 0x6c, 0x8b, 0xdf, + 0x4e, 0xda, 0x87, 0x5d, 0xe3, 0x61, 0xfd, 0x48, 0x1e, 0xe6, 0xfb, 0x7d, 0xce, 0x21, 0xd7, 0xbd, + 0x4f, 0x41, 0xef, 0x0a, 0xa7, 0x6b, 0x5f, 0x89, 0xa7, 0xd7, 0xf9, 0x22, 0x64, 0x2f, 0x64, 0xba, + 0x06, 0xce, 0xa6, 0x09, 0xee, 0x05, 0x4d, 0x76, 0x0d, 0xc6, 0xb5, 0x8f, 0xc7, 0xbd, 0xb4, 0x5f, + 0x53, 0x6d, 0xd8, 0x8e, 0xff, 0x16, 0xd7, 0x44, 0xb9, 0x6f, 0xa9, 0x6b, 0xa2, 0xfc, 0xc5, 0x4a, + 0xd2, 0xff, 0x7b, 0x44, 0x5a, 0x01, 0x84, 0xa1, 0xcf, 0x18, 0xe0, 0xbe, 0x2d, 0xb7, 0x40, 0x1b, + 0xff, 0xb6, 0x7e, 0x75, 0x42, 0x9e, 0xc8, 0xfa, 0x2d, 0xb1, 0x9f, 0x7d, 0x70, 0xea, 0xf6, 0x98, + 0x3f, 0xce, 0xed, 0xb1, 0x70, 0xf4, 0xed, 0x71, 0xe8, 0xa8, 0xdb, 0x63, 0xea, 0x7a, 0x37, 0x7c, + 0xec, 0xeb, 0xdd, 0xc8, 0xb1, 0xae, 0x77, 0xa3, 0xc7, 0xba, 0xde, 0x19, 0x37, 0xd5, 0xe2, 0x51, + 0x37, 0xd5, 0xbf, 0xba, 0x0c, 0x3e, 0xab, 0x97, 0xc1, 0x2c, 0x11, 0xef, 0x58, 0x97, 0xc1, 0x1f, + 0xea, 0x7b, 0x97, 0x2b, 0x7d, 0x14, 0xa1, 0xfc, 0xa5, 0x01, 0xee, 0x72, 0x83, 0xde, 0xe4, 0x66, + 0x9e, 0xce, 0x4d, 0x8e, 0x3d, 0xb5, 0x9b, 0xdc, 0xec, 0xc7, 0xbd, 0xc9, 0xcd, 0x3d, 0xcd, 0x9b, + 0xdc, 0x89, 0xbf, 0x8c, 0x37, 0xb9, 0x93, 0xff, 0x7a, 0x6e, 0x72, 0x7f, 0x0d, 0x4a, 0x69, 0xe1, + 0xf2, 0xe8, 0xa0, 0xbb, 0x4f, 0x2d, 0x40, 0xa4, 0x10, 0x7d, 0xd3, 0xc2, 0x1d, 0xbb, 0x0c, 0xb0, + 0x11, 0x78, 0x8f, 0xdc, 0x88, 0xdf, 0x56, 0xd6, 0x6f, 0x14, 0x30, 0x5a, 0x42, 0xc5, 0xc8, 0xdb, + 0x1a, 0x4a, 0x7c, 0xaf, 0xc9, 0x67, 0xdd, 0x6b, 0xac, 0x1f, 0xce, 0xc3, 0x8c, 0x8c, 0xb2, 0xf6, + 0xec, 0x3f, 0xc2, 0xbe, 0x67, 0xdc, 0x56, 0x95, 0xad, 0x75, 0xaa, 0x75, 0x87, 0x3c, 0xc3, 0x7e, + 0x15, 0x4e, 0xf4, 0x74, 0x05, 0xde, 0x58, 0x57, 0x54, 0x7c, 0xbb, 0x9e, 0x3b, 0xeb, 0x7c, 0x76, + 0x25, 0xf7, 0xaf, 0xda, 0x3d, 0x14, 0xd6, 0x9f, 0x0d, 0xf5, 0xf0, 0xa7, 0x07, 0x59, 0xfd, 0x89, + 0x35, 0x77, 0xbc, 0x27, 0xd6, 0xfc, 0x60, 0x4f, 0xac, 0x29, 0xa1, 0xa2, 0x30, 0x88, 0x50, 0xf1, + 0x45, 0x98, 0xdc, 0xe4, 0x6e, 0x2b, 0xdc, 0xf4, 0x29, 0x5b, 0x8e, 0xf4, 0xb5, 0x50, 0xe1, 0xeb, + 0x44, 0x99, 0xba, 0x70, 0xc5, 0x36, 0xa3, 0x91, 0x20, 0x10, 0xc7, 0xa0, 0x4c, 0x9f, 0x63, 0x9b, + 0x1c, 0xf4, 0x5b, 0xf4, 0xf0, 0x21, 0xb7, 0xe8, 0x1a, 0x4c, 0x10, 0x5d, 0x12, 0x69, 0x38, 0xb9, + 0xee, 0x89, 0x22, 0x84, 0xab, 0xda, 0xe3, 0x24, 0xce, 0x71, 0xed, 0xf2, 0xa6, 0x67, 0x30, 0x11, + 0x5d, 0xb0, 0xda, 0x6e, 0x74, 0x7c, 0xaf, 0x8d, 0x5d, 0x30, 0x9a, 0x74, 0x01, 0x27, 0xb0, 0xec, + 0x02, 0x0d, 0x89, 0xbd, 0x03, 0x53, 0x95, 0x8d, 0xaa, 0x4e, 0x56, 0x4c, 0x5e, 0x79, 0xdd, 0x8e, + 0xe7, 0x18, 0xa4, 0x29, 0xdc, 0xc3, 0x6e, 0x3e, 0x63, 0x7f, 0x31, 0x37, 0x1f, 0xeb, 0x5f, 0x4c, + 0xa8, 0xe5, 0xfd, 0xdd, 0x7d, 0x20, 0x31, 0x9f, 0x3c, 0x0a, 0xc7, 0x7c, 0xf2, 0x18, 0x3a, 0x4a, + 0x90, 0x34, 0xe4, 0xdb, 0xe1, 0x63, 0xc9, 0xb7, 0x23, 0x1f, 0xfb, 0xf9, 0x62, 0xf4, 0x98, 0x12, + 0x6b, 0x6a, 0xad, 0x15, 0x07, 0x59, 0x6b, 0x99, 0x52, 0xee, 0xd8, 0xc7, 0x97, 0x72, 0xe1, 0xd8, + 0x52, 0x6e, 0x2d, 0xf1, 0x5d, 0x1e, 0x3f, 0xd2, 0x25, 0xe4, 0x0c, 0x69, 0x05, 0x66, 0xb2, 0x43, + 0xec, 0xc5, 0x5e, 0xcc, 0x9f, 0x28, 0xd1, 0xf9, 0xeb, 0xd9, 0xa2, 0xf3, 0xe1, 0xe7, 0xcd, 0xb1, + 0x84, 0xe7, 0x1f, 0x7e, 0xba, 0xc2, 0xf3, 0xd3, 0x7d, 0x08, 0xf9, 0x2b, 0xf1, 0xf9, 0xaf, 0xc4, + 0xe7, 0x01, 0xc5, 0xe7, 0x00, 0x97, 0xd7, 0x03, 0x37, 0x68, 0xa3, 0xda, 0xe9, 0x32, 0x8c, 0xaa, + 0x18, 0xa3, 0xb9, 0x44, 0xa3, 0xdc, 0x1b, 0x5c, 0x54, 0x61, 0xb1, 0x45, 0x28, 0x2a, 0x62, 0x3d, + 0x2d, 0xcb, 0x63, 0x82, 0x19, 0xe1, 0x1b, 0x09, 0x66, 0xfd, 0x07, 0x43, 0x6a, 0x0b, 0x17, 0x73, + 0x66, 0xc3, 0x0d, 0xdc, 0x16, 0xe6, 0xfb, 0x8a, 0x57, 0x98, 0x26, 0xbc, 0xa7, 0x16, 0x65, 0xca, + 0xb4, 0xdf, 0x24, 0xf9, 0x48, 0x51, 0x5f, 0x93, 0x94, 0xaa, 0x85, 0x01, 0x52, 0xaa, 0xbe, 0x65, + 0xe4, 0x23, 0x1d, 0x4a, 0x12, 0xe0, 0x89, 0x6d, 0xed, 0xf0, 0x4c, 0xa4, 0xd7, 0xf4, 0xc4, 0xa1, + 0xc3, 0x49, 0x54, 0x2f, 0xa4, 0x3c, 0x24, 0x65, 0x68, 0x7c, 0x1b, 0x19, 0x39, 0x4e, 0x3c, 0xe5, + 0xd1, 0x7f, 0xad, 0xf1, 0x94, 0x57, 0x01, 0xe8, 0xa8, 0x4d, 0xcc, 0x13, 0x5e, 0xc1, 0xd5, 0x4f, + 0x66, 0xca, 0x51, 0xd4, 0xec, 0x93, 0x41, 0x42, 0x23, 0xb4, 0x7e, 0x97, 0xc1, 0x4c, 0xad, 0x76, + 0x77, 0xc5, 0x73, 0x77, 0xda, 0x7e, 0x18, 0x79, 0xf5, 0x6a, 0x7b, 0xdb, 0x17, 0xa2, 0x78, 0x7c, + 0x1c, 0x68, 0x81, 0x73, 0x93, 0xa3, 0x20, 0x2e, 0x16, 0x57, 0xbd, 0xd5, 0x20, 0x50, 0xfa, 0x51, + 0x79, 0xd5, 0xe3, 0x02, 0x60, 0x4b, 0xb8, 0x90, 0x76, 0x6b, 0x5d, 0x8c, 0x6c, 0x41, 0x36, 0x23, + 0x28, 0xed, 0x86, 0x12, 0x64, 0xab, 0x32, 0xc6, 0x7b, 0x27, 0x2c, 0xdd, 0x7e, 0x4e, 0x19, 0x51, + 0x99, 0x93, 0x62, 0x79, 0xd8, 0x91, 0x30, 0x82, 0xdb, 0x66, 0x07, 0xe1, 0xba, 0x45, 0x5c, 0xcf, + 0x1a, 0xd8, 0x83, 0x13, 0x86, 0xcf, 0xf3, 0xa0, 0x8f, 0x29, 0xaf, 0x91, 0x74, 0x6d, 0x61, 0x88, + 0x8d, 0x8c, 0x17, 0x15, 0x3d, 0x81, 0x57, 0x66, 0x0d, 0xe2, 0x3c, 0x3b, 0x93, 0x59, 0x12, 0xaf, + 0xee, 0x71, 0x23, 0x32, 0xb6, 0xb6, 0x69, 0xc8, 0x54, 0x65, 0xfd, 0xaa, 0x76, 0x32, 0xb6, 0x82, + 0xc3, 0x6b, 0x62, 0xbf, 0x96, 0x83, 0x53, 0x06, 0x46, 0xbc, 0x5d, 0x85, 0x71, 0x38, 0x90, 0xcc, + 0x79, 0xfd, 0xe1, 0xd3, 0x99, 0xd7, 0x2f, 0x99, 0x6d, 0x49, 0x36, 0x54, 0xbd, 0x0d, 0xfd, 0xbe, + 0x90, 0x3d, 0x82, 0x19, 0x2c, 0x52, 0x0f, 0x3b, 0x62, 0xce, 0xd2, 0x7b, 0xd0, 0x5c, 0xf2, 0xd9, + 0xd2, 0x8f, 0x1f, 0xd3, 0x4d, 0x2f, 0x7e, 0x7b, 0xbf, 0x3c, 0x69, 0xa0, 0xab, 0x58, 0xd3, 0x4e, + 0xf2, 0x3a, 0xe4, 0xb5, 0xb7, 0x7d, 0x5d, 0x50, 0xea, 0xa9, 0x82, 0xfd, 0x93, 0x9c, 0x7c, 0x4e, + 0x90, 0xcd, 0xb8, 0x1e, 0xf8, 0xad, 0xb8, 0x5c, 0x99, 0x56, 0xf6, 0xe9, 0xb6, 0xe6, 0xd3, 0xe9, + 0xb6, 0x57, 0xf0, 0x93, 0xe5, 0x9e, 0xe0, 0x6c, 0x07, 0x7e, 0x2b, 0xf9, 0x7c, 0xbd, 0xe3, 0xfa, + 0x7e, 0x24, 0xfb, 0xfe, 0x1c, 0x9c, 0x36, 0xb4, 0x9a, 0x7a, 0xe2, 0x0f, 0x8a, 0x96, 0x30, 0x1b, + 0xc7, 0x51, 0x49, 0x8a, 0x96, 0x2e, 0xd1, 0xfc, 0x3f, 0x8f, 0x5f, 0xa0, 0xc5, 0xe4, 0x14, 0x48, + 0x4e, 0x4b, 0x62, 0x69, 0x9f, 0xd0, 0xbf, 0x16, 0xe6, 0xc1, 0x0c, 0x5a, 0xd9, 0x18, 0x26, 0xc0, + 0x73, 0xfd, 0x4d, 0x80, 0xe3, 0xb4, 0xa0, 0x18, 0xee, 0xbf, 0xbf, 0x1d, 0x70, 0x2f, 0x57, 0xf6, + 0xd7, 0xe1, 0x74, 0x0f, 0x30, 0x5e, 0x6d, 0x27, 0xfa, 0xae, 0xb6, 0x4f, 0x1d, 0xec, 0x97, 0x5f, + 0xcd, 0xaa, 0x2d, 0x6b, 0xa5, 0xf5, 0xaf, 0x81, 0xb9, 0x00, 0x49, 0x21, 0x89, 0x1f, 0xd9, 0x13, + 0xf4, 0x53, 0x34, 0x3f, 0x34, 0x7c, 0xb1, 0x97, 0x6b, 0xdf, 0xa0, 0x1f, 0x79, 0x09, 0x12, 0xe3, + 0x30, 0xa1, 0xa5, 0x3a, 0xd8, 0x23, 0x63, 0x8f, 0x3e, 0x95, 0x7c, 0x7b, 0xbf, 0x6c, 0x60, 0x8b, + 0x0b, 0x91, 0x9e, 0x43, 0xc1, 0x90, 0xf6, 0x74, 0x44, 0xf6, 0x2b, 0x39, 0x98, 0x13, 0x80, 0x64, + 0x52, 0x51, 0xa3, 0xe6, 0x0f, 0x9b, 0xf5, 0xbb, 0x4f, 0x67, 0xd6, 0xbf, 0x88, 0xdf, 0xa8, 0xcf, + 0xfa, 0x9e, 0x2e, 0xc9, 0xfc, 0x38, 0x9c, 0xed, 0x86, 0x41, 0x97, 0x31, 0xdb, 0x4f, 0x0f, 0x30, + 0xdb, 0xe5, 0x00, 0x1c, 0x3d, 0xdb, 0xfb, 0xd6, 0xc2, 0x36, 0x61, 0x82, 0xee, 0x42, 0xb2, 0xc3, + 0xce, 0x1a, 0x31, 0x9a, 0xf5, 0x22, 0x79, 0x41, 0xa5, 0x4c, 0x10, 0x3d, 0x2d, 0x34, 0xb8, 0xb0, + 0x36, 0xcc, 0xca, 0xdf, 0xa6, 0x6e, 0xaa, 0xdc, 0x57, 0x37, 0x75, 0x81, 0x5a, 0x74, 0x8e, 0xf8, + 0xa7, 0x54, 0x54, 0x7a, 0xf8, 0xa5, 0x0c, 0xc6, 0xac, 0x03, 0xcc, 0x00, 0xcb, 0x45, 0x7b, 0xee, + 0x70, 0x8d, 0xd4, 0xab, 0x54, 0x67, 0x39, 0x5d, 0x67, 0x7a, 0xe5, 0x66, 0xf0, 0x66, 0x2e, 0x4c, + 0x13, 0xd4, 0x7f, 0xc8, 0xe5, 0x0e, 0xff, 0xa2, 0x11, 0x00, 0x2b, 0x55, 0x2a, 0x2f, 0x51, 0xaa, + 0x26, 0x0c, 0x50, 0x96, 0xda, 0xd0, 0xd3, 0xfc, 0xd8, 0x5d, 0x98, 0xa9, 0x74, 0x3a, 0x4d, 0x8f, + 0x37, 0xb0, 0x95, 0x32, 0x83, 0xbe, 0x95, 0x64, 0x07, 0x73, 0x65, 0x21, 0xdd, 0xec, 0xd2, 0xe9, + 0xf3, 0x7b, 0x69, 0xad, 0x1f, 0xca, 0xf5, 0x7c, 0x34, 0x7b, 0x1d, 0xc6, 0xf0, 0x87, 0x16, 0x53, + 0x05, 0x55, 0x3c, 0xf2, 0x13, 0x51, 0x79, 0x94, 0x20, 0x08, 0x61, 0x49, 0x8f, 0xab, 0x58, 0x90, + 0xc2, 0x12, 0xe9, 0x15, 0x12, 0x4d, 0x42, 0x59, 0xb9, 0x66, 0x14, 0x12, 0xa1, 0x0b, 0x5d, 0x33, + 0xc8, 0x21, 0xc3, 0xfa, 0xfe, 0xbc, 0x39, 0xed, 0xd8, 0x05, 0x4d, 0x6e, 0xd7, 0x22, 0x3b, 0x2a, + 0xb9, 0x5d, 0x93, 0xd6, 0xff, 0x41, 0x0e, 0x66, 0xef, 0x06, 0x3b, 0x6e, 0xdb, 0xfb, 0xa6, 0x8c, + 0x91, 0xed, 0xe3, 0xb8, 0x1c, 0x9e, 0x68, 0xf1, 0x69, 0x25, 0x8c, 0xf3, 0xb5, 0x8a, 0xc5, 0x4c, + 0xc1, 0x29, 0x63, 0x67, 0x7d, 0x0f, 0x3a, 0xbb, 0xe1, 0x87, 0x69, 0x79, 0xfb, 0x24, 0xba, 0x84, + 0x5b, 0x3f, 0x96, 0x87, 0x71, 0x6d, 0x09, 0xb0, 0xcf, 0xc0, 0x84, 0xce, 0x47, 0x57, 0xf8, 0xe9, + 0xd5, 0xda, 0x06, 0x16, 0x6a, 0xfc, 0xb8, 0xdb, 0x32, 0x34, 0x7e, 0x62, 0xa2, 0x23, 0xf4, 0x98, + 0x57, 0x9b, 0xf7, 0x33, 0xae, 0x36, 0xe5, 0x54, 0xa6, 0xfe, 0x43, 0x2f, 0x38, 0xef, 0xf4, 0x5e, + 0x70, 0x50, 0x79, 0xa4, 0xd1, 0xf7, 0xbf, 0xe6, 0x58, 0x3f, 0x99, 0x83, 0x52, 0x7a, 0x91, 0x7e, + 0x57, 0x7a, 0xe5, 0x18, 0xaf, 0x3b, 0x3f, 0x9a, 0x8f, 0xf3, 0x9c, 0x28, 0x17, 0xde, 0x67, 0xd5, + 0x4c, 0xf0, 0x5d, 0xe3, 0xe1, 0xe5, 0x79, 0x33, 0x1a, 0x9d, 0x1e, 0xfc, 0x22, 0x3b, 0x04, 0xe5, + 0xd0, 0xb7, 0x7e, 0xbe, 0xfc, 0x9c, 0xf5, 0x01, 0xcc, 0xa5, 0xbb, 0x03, 0x1f, 0x5f, 0x2a, 0x30, + 0x6d, 0xc2, 0xd3, 0x59, 0x92, 0xd2, 0x54, 0x76, 0x1a, 0xdf, 0xfa, 0xfd, 0x7c, 0x9a, 0x37, 0x99, + 0x0c, 0x8a, 0x4d, 0x47, 0x37, 0x84, 0xa1, 0x4d, 0x47, 0x82, 0x6c, 0x55, 0x76, 0x9c, 0xec, 0x64, + 0xb1, 0x23, 0x6a, 0x21, 0xdb, 0x11, 0x95, 0x5d, 0x4b, 0x59, 0x49, 0x6b, 0x51, 0x93, 0x1e, 0xf3, + 0x2d, 0x27, 0xb1, 0x94, 0x4e, 0x19, 0x47, 0x2f, 0xc3, 0x9c, 0x11, 0x02, 0x5c, 0xd1, 0x0f, 0x27, + 0xba, 0xf6, 0x08, 0x0b, 0x24, 0x71, 0x26, 0x32, 0xbb, 0x09, 0xa3, 0xe2, 0x33, 0xef, 0xb8, 0x1d, + 0x7a, 0x53, 0x61, 0xb1, 0x5b, 0x7a, 0x33, 0xbe, 0xf0, 0x69, 0x9e, 0xe9, 0x4d, 0x2e, 0x8e, 0x7c, + 0x7d, 0x62, 0x11, 0xa2, 0xf5, 0xcf, 0x73, 0x62, 0xfd, 0xd7, 0x1f, 0x7e, 0xc2, 0x52, 0x9c, 0x89, + 0x26, 0x1d, 0x62, 0xd1, 0xfa, 0xc7, 0x79, 0x99, 0xe8, 0x86, 0xa6, 0xcf, 0x5b, 0x30, 0xb2, 0xe9, + 0x06, 0x3b, 0x94, 0xe3, 0xd8, 0xe4, 0x22, 0x0b, 0x92, 0x98, 0x4e, 0x11, 0xfe, 0xb6, 0x89, 0x40, + 0xd7, 0x85, 0xe5, 0x07, 0xd2, 0x85, 0x69, 0x7a, 0xf9, 0xc2, 0x53, 0xd3, 0xcb, 0x7f, 0x4f, 0x9c, + 0xd3, 0xa6, 0x12, 0x0d, 0x10, 0x61, 0xfa, 0x5c, 0x3a, 0x27, 0x54, 0x4f, 0x2c, 0xf0, 0x84, 0x1d, + 0xbb, 0xa6, 0x67, 0x99, 0xd2, 0x7c, 0x3b, 0x8f, 0xc8, 0x27, 0x65, 0xfd, 0x71, 0x41, 0xf6, 0x31, + 0x75, 0xd4, 0x79, 0xc3, 0xef, 0x1b, 0xd7, 0x89, 0xd8, 0xe8, 0xf5, 0x10, 0x1c, 0x68, 0x36, 0x75, + 0x1e, 0x86, 0xc4, 0xdc, 0xa4, 0xde, 0x44, 0x3c, 0x31, 0x7f, 0x75, 0x3c, 0x51, 0x2e, 0xd6, 0x32, + 0x9e, 0x49, 0x7a, 0xfa, 0x40, 0x3c, 0xb6, 0xf4, 0xb5, 0x8c, 0x18, 0xec, 0x02, 0x0c, 0xad, 0xfb, + 0x0d, 0x15, 0xc9, 0x7c, 0x0e, 0xa3, 0x7f, 0xf8, 0x0d, 0x6e, 0x28, 0xcd, 0x11, 0x43, 0xb4, 0x35, + 0x4e, 0xee, 0xa0, 0xb7, 0xb5, 0xb5, 0xed, 0xf6, 0xa6, 0x85, 0xd3, 0x32, 0xca, 0xac, 0xc2, 0x94, + 0x99, 0x58, 0x9d, 0xec, 0x7d, 0x51, 0xbb, 0x9e, 0xca, 0xcf, 0xae, 0x3f, 0x8b, 0x98, 0x44, 0x6c, + 0x09, 0x26, 0x8d, 0x08, 0xaa, 0xf4, 0xb8, 0x89, 0xea, 0x4d, 0x33, 0xfe, 0xaa, 0xae, 0xde, 0x34, + 0x48, 0xc4, 0x79, 0x4e, 0xdf, 0xaf, 0x3d, 0x71, 0xf6, 0x7c, 0x3b, 0xe1, 0xb0, 0xab, 0x50, 0x94, + 0x61, 0x36, 0xaa, 0x2b, 0xfa, 0x33, 0x55, 0x88, 0xb0, 0x54, 0x98, 0x1a, 0x85, 0xa8, 0x85, 0x55, + 0xf8, 0x34, 0x94, 0x68, 0x4b, 0x4a, 0x52, 0x75, 0xbf, 0x00, 0x43, 0xcb, 0xd5, 0x15, 0x5b, 0xdf, + 0x46, 0xea, 0x5e, 0x23, 0xb0, 0x11, 0x8a, 0x5e, 0x75, 0xeb, 0x3c, 0x7a, 0xec, 0x07, 0x0f, 0x6d, + 0x1e, 0x46, 0x81, 0x27, 0xb3, 0x4f, 0xe2, 0x42, 0xfc, 0x0c, 0x7b, 0x07, 0x86, 0xd1, 0xf0, 0x34, + 0x75, 0x32, 0xa4, 0xeb, 0x58, 0x9a, 0xa4, 0x09, 0x3c, 0x8c, 0x56, 0xac, 0xb6, 0x24, 0x62, 0x6f, + 0xc1, 0xd0, 0x0a, 0x6f, 0xef, 0xa5, 0x12, 0xe3, 0xf5, 0x10, 0xc7, 0x1b, 0x42, 0x83, 0xb7, 0xf7, + 0x6c, 0x24, 0xb1, 0x7e, 0x32, 0x0f, 0x27, 0x32, 0x3e, 0xeb, 0xfe, 0x67, 0x9e, 0xd1, 0x5d, 0x71, + 0xc9, 0xd8, 0x15, 0xd5, 0xfb, 0x74, 0xdf, 0x8e, 0xcf, 0xdc, 0x24, 0x7f, 0x36, 0x07, 0xa7, 0xcc, + 0x09, 0x4a, 0x96, 0xe6, 0xf7, 0xaf, 0xb2, 0xb7, 0x61, 0xe4, 0x26, 0x77, 0x1b, 0x5c, 0x25, 0xcd, + 0x3a, 0x11, 0x07, 0xc4, 0x93, 0x31, 0x04, 0x64, 0xa1, 0x64, 0x9b, 0x78, 0x9c, 0x4a, 0x28, 0x5b, + 0xa1, 0x8f, 0x93, 0xf2, 0xb8, 0xa5, 0xe2, 0x79, 0x64, 0x55, 0x75, 0x88, 0x95, 0xc7, 0xb7, 0x73, + 0xf0, 0xfc, 0x21, 0x34, 0x62, 0xe0, 0xc4, 0xd0, 0xeb, 0x03, 0x87, 0x27, 0x2a, 0x42, 0xd9, 0x7b, + 0x30, 0xbd, 0x49, 0xf2, 0xbc, 0x1a, 0x8e, 0x7c, 0xb2, 0x5e, 0x94, 0xa8, 0xef, 0xa8, 0x71, 0x49, + 0x23, 0x1b, 0x81, 0x66, 0x0a, 0x87, 0x06, 0x9a, 0xd1, 0xe3, 0xb6, 0x0c, 0x0d, 0x1a, 0xb7, 0xe5, + 0x03, 0x98, 0x33, 0xdb, 0x46, 0xe1, 0x73, 0x93, 0xa8, 0x35, 0xb9, 0xfe, 0x51, 0x6b, 0x0e, 0x0d, + 0xd2, 0x69, 0xfd, 0x58, 0x0e, 0x4a, 0x26, 0xef, 0x8f, 0x3b, 0x9e, 0xef, 0x1a, 0xe3, 0xf9, 0x7c, + 0xf6, 0x78, 0xf6, 0x1f, 0xc8, 0xff, 0x33, 0x97, 0x6e, 0xec, 0x40, 0x23, 0x68, 0xc1, 0xc8, 0x8a, + 0xdf, 0x72, 0xbd, 0xb6, 0x9e, 0xf9, 0xbd, 0x81, 0x10, 0x9b, 0x4a, 0x06, 0x0b, 0xf2, 0x73, 0x0e, + 0x86, 0xd7, 0xfd, 0x76, 0x65, 0x85, 0x4c, 0x7a, 0x91, 0x4f, 0xdb, 0x6f, 0x3b, 0x6e, 0xc3, 0x96, + 0x05, 0x6c, 0x0d, 0xa0, 0x56, 0x0f, 0x38, 0x6f, 0xd7, 0xbc, 0x6f, 0xf2, 0x94, 0xa4, 0x21, 0x7a, + 0xa8, 0xd9, 0xc5, 0x8d, 0x45, 0x3e, 0x5d, 0x22, 0xa2, 0x13, 0x7a, 0xdf, 0xd4, 0xf7, 0x5b, 0x8d, + 0x1e, 0xd7, 0x15, 0xc5, 0x41, 0x4b, 0x8d, 0xc3, 0x95, 0xef, 0xc6, 0xba, 0xca, 0xac, 0x0a, 0x7b, + 0xf8, 0x4a, 0xe6, 0x70, 0xfc, 0x5e, 0x0e, 0x9e, 0x3f, 0x84, 0xe6, 0x29, 0x8c, 0xca, 0x5f, 0x74, + 0x87, 0x73, 0x80, 0x84, 0x08, 0xf3, 0x0e, 0x7b, 0x8d, 0x48, 0x26, 0xc2, 0x9b, 0xa4, 0xbc, 0xc3, + 0x02, 0x60, 0xe4, 0x1d, 0x16, 0x00, 0x71, 0x96, 0xde, 0xe4, 0xde, 0xce, 0xae, 0x34, 0xcf, 0x9a, + 0x94, 0x7b, 0xc3, 0x2e, 0x42, 0xf4, 0xb3, 0x54, 0xe2, 0x58, 0xff, 0x72, 0x18, 0x4e, 0xdb, 0x7c, + 0xc7, 0x13, 0xf7, 0x92, 0x7b, 0xa1, 0xd7, 0xde, 0x31, 0xe2, 0xde, 0x58, 0xa9, 0x95, 0x4b, 0x49, + 0x22, 0x04, 0x24, 0x9e, 0x89, 0x17, 0xa1, 0x28, 0xc4, 0x10, 0x6d, 0xf1, 0xe2, 0xa3, 0x95, 0x10, + 0x56, 0x28, 0xb0, 0xb2, 0x2a, 0x66, 0xaf, 0x91, 0x98, 0xa4, 0xa5, 0xf1, 0x11, 0x62, 0xd2, 0x77, + 0xf6, 0xcb, 0x50, 0xdb, 0x0b, 0x23, 0x8e, 0x57, 0x64, 0x12, 0x95, 0xe2, 0xbb, 0xcc, 0x50, 0x9f, + 0xbb, 0xcc, 0x1d, 0x98, 0xab, 0x34, 0xe4, 0xe9, 0xe8, 0x36, 0x37, 0x02, 0xaf, 0x5d, 0xf7, 0x3a, + 0x6e, 0x53, 0xdd, 0xcf, 0xb1, 0x97, 0xdd, 0xb8, 0xdc, 0xe9, 0xc4, 0x08, 0x76, 0x26, 0x99, 0x68, + 0xc6, 0xca, 0x7a, 0x0d, 0xc3, 0xc3, 0xd0, 0x7b, 0x24, 0x36, 0xa3, 0xd1, 0x0e, 0xb1, 0x15, 0xa1, + 0x1d, 0x17, 0xe3, 0x2d, 0x0a, 0x1f, 0xe4, 0x37, 0xd7, 0x6a, 0x89, 0x4b, 0xb3, 0xcc, 0x32, 0x20, + 0x1f, 0xf6, 0xa3, 0x66, 0x88, 0xa6, 0x90, 0x06, 0x5e, 0x42, 0x57, 0xab, 0xdd, 0x14, 0x74, 0xc5, + 0x1e, 0xba, 0x30, 0xdc, 0xd5, 0xe9, 0x24, 0x1e, 0xbb, 0x2c, 0xa6, 0x42, 0xcb, 0x8f, 0x38, 0x4e, + 0xe1, 0xb1, 0xe4, 0xce, 0x15, 0x20, 0x54, 0xde, 0xb9, 0x34, 0x14, 0xf6, 0x0e, 0xcc, 0xae, 0x2e, + 0x2f, 0x2a, 0x2d, 0xf2, 0x8a, 0x5f, 0xef, 0xe2, 0x43, 0x3c, 0x60, 0x7d, 0x38, 0x86, 0xbc, 0xbe, + 0x28, 0x76, 0x93, 0x2c, 0x34, 0x76, 0x1e, 0x46, 0xab, 0x2b, 0xb2, 0xef, 0xc7, 0xf5, 0x54, 0x5a, + 0x64, 0x19, 0xa5, 0x0a, 0xd9, 0xdd, 0xe4, 0x52, 0x30, 0x71, 0xa4, 0xf4, 0x7e, 0x7a, 0x80, 0x0b, + 0xc1, 0x5b, 0x30, 0xb9, 0xe4, 0x47, 0xd5, 0x76, 0x18, 0xb9, 0xed, 0x3a, 0xaf, 0xae, 0xe8, 0x71, + 0xad, 0xb7, 0xfc, 0xc8, 0xf1, 0xa8, 0x44, 0x7c, 0xb9, 0x89, 0xc9, 0x3e, 0x87, 0xa4, 0x37, 0x78, + 0x9b, 0x07, 0x49, 0x3c, 0xeb, 0x61, 0xd9, 0xb7, 0x82, 0x74, 0x27, 0x2e, 0xb1, 0x4d, 0x44, 0x4a, + 0xf3, 0x25, 0x33, 0x6f, 0x2e, 0xfb, 0x0d, 0x1e, 0xca, 0xdd, 0xe2, 0x13, 0x94, 0xe6, 0x4b, 0x6b, + 0xdb, 0x21, 0x3b, 0xe8, 0xbf, 0x83, 0x69, 0xbe, 0x7a, 0x70, 0xd9, 0xe7, 0x60, 0x18, 0x7f, 0x92, + 0x74, 0x3b, 0x9b, 0xc1, 0x36, 0x91, 0x6c, 0xeb, 0x02, 0xd3, 0x96, 0x04, 0xac, 0x0a, 0xa3, 0x74, + 0xb1, 0x3a, 0x4e, 0xb2, 0x1a, 0xba, 0xa1, 0xc9, 0x99, 0x41, 0xf4, 0x56, 0x03, 0x26, 0xf4, 0x0a, + 0xc5, 0x8a, 0xb8, 0xe9, 0x86, 0xbb, 0xbc, 0x21, 0x7e, 0x51, 0x9e, 0x39, 0x5c, 0x11, 0xbb, 0x08, + 0x75, 0xc4, 0x77, 0xd8, 0x1a, 0x8a, 0x38, 0x53, 0xab, 0xe1, 0xbd, 0x90, 0x3e, 0x85, 0x54, 0x2d, + 0x1e, 0xaa, 0xed, 0x1a, 0x36, 0x15, 0x59, 0xdf, 0x03, 0x73, 0xeb, 0xdd, 0x66, 0xd3, 0xdd, 0x6a, + 0x72, 0x95, 0x87, 0x04, 0xd3, 0x73, 0x2f, 0xc1, 0x70, 0x4d, 0x4b, 0xf8, 0x1d, 0x27, 0x7a, 0xd4, + 0x70, 0xd0, 0x08, 0x35, 0x87, 0xa1, 0x7a, 0x52, 0xa9, 0xbe, 0x25, 0xa9, 0xf5, 0x3b, 0x39, 0x98, + 0x53, 0xef, 0xff, 0x81, 0x5b, 0x7f, 0x18, 0x67, 0x7d, 0x3f, 0x6f, 0xcc, 0x35, 0x9c, 0xb0, 0xa9, + 0x69, 0x24, 0x67, 0xdd, 0x2d, 0xf5, 0x11, 0xa6, 0xc0, 0x92, 0xf5, 0xc1, 0x47, 0x7d, 0x0c, 0x7b, + 0x07, 0xc6, 0xe9, 0x78, 0xd4, 0x02, 0x4c, 0x62, 0x14, 0x2f, 0xba, 0xee, 0xa5, 0xad, 0x51, 0x74, + 0x74, 0x94, 0xc5, 0xcc, 0xa6, 0x7c, 0x5c, 0x19, 0x20, 0x5b, 0x16, 0x33, 0xeb, 0x38, 0x64, 0xea, + 0xfe, 0xc6, 0x78, 0xba, 0x6f, 0x69, 0xee, 0x5e, 0xd3, 0x43, 0xca, 0xe5, 0x92, 0x9b, 0x71, 0x12, + 0x52, 0x4e, 0xbf, 0x19, 0xc7, 0xa8, 0xf1, 0x98, 0xe4, 0x8f, 0x18, 0x93, 0xf7, 0xd4, 0x98, 0x14, + 0xfa, 0x4f, 0x8c, 0xd9, 0x43, 0xc6, 0xa1, 0x96, 0xac, 0x90, 0xa1, 0x81, 0xd4, 0x2a, 0xcf, 0x61, + 0xec, 0x7c, 0x49, 0x92, 0xde, 0x45, 0x89, 0x93, 0xae, 0xab, 0x19, 0x1e, 0x9c, 0xe9, 0x11, 0x5b, + 0xf3, 0xe7, 0x61, 0xa2, 0x12, 0x45, 0x6e, 0x7d, 0x97, 0x37, 0x56, 0xc4, 0xf6, 0xa4, 0x45, 0xbf, + 0x72, 0x09, 0xae, 0x3f, 0x9a, 0xe9, 0xb8, 0x32, 0x9a, 0xab, 0x1b, 0x92, 0x31, 0x6b, 0x1c, 0xcd, + 0x55, 0x40, 0xcc, 0x68, 0xae, 0x02, 0xc2, 0x2e, 0xc3, 0x68, 0xb5, 0xfd, 0xc8, 0x13, 0x7d, 0x22, + 0x03, 0x60, 0xa1, 0x6e, 0xca, 0x93, 0x20, 0x7d, 0x73, 0x25, 0x2c, 0xf6, 0x96, 0x76, 0xa9, 0x19, + 0x4b, 0x14, 0x18, 0x52, 0xe5, 0x15, 0x47, 0xb8, 0xd1, 0x2f, 0x2c, 0xf1, 0x2d, 0xe7, 0x1a, 0x8c, + 0x2a, 0x4d, 0x26, 0x24, 0x4a, 0x0b, 0xa2, 0xec, 0x0d, 0x18, 0xa1, 0x90, 0x31, 0x83, 0xb7, 0x96, + 0x2f, 0x6f, 0x5c, 0xcb, 0xe0, 0xad, 0xe5, 0xcb, 0x33, 0x32, 0x78, 0x6b, 0x99, 0xf3, 0x62, 0x25, + 0xd0, 0xc4, 0x91, 0x4a, 0xa0, 0xfb, 0x30, 0xb1, 0xe1, 0x06, 0x91, 0x27, 0x64, 0x94, 0x76, 0x14, + 0xce, 0x4f, 0x1a, 0x7a, 0x53, 0xad, 0x68, 0xe9, 0xac, 0x4a, 0x3a, 0xdd, 0xd1, 0xf0, 0xcd, 0xec, + 0xc8, 0x09, 0x3c, 0xdb, 0x94, 0x75, 0xea, 0xe3, 0x98, 0xb2, 0x62, 0xa7, 0xa2, 0xae, 0x6c, 0x3a, + 0xd1, 0xc8, 0xe0, 0xa5, 0x25, 0xa5, 0x30, 0x8b, 0x11, 0xd9, 0x57, 0x60, 0x42, 0xfc, 0xbd, 0xe1, + 0x37, 0xbd, 0xba, 0xc7, 0xc3, 0xf9, 0x12, 0x36, 0xee, 0x6c, 0xe6, 0xea, 0x47, 0xa4, 0xbd, 0x1a, + 0x8f, 0xe4, 0x02, 0x46, 0xc6, 0x69, 0x25, 0xb8, 0xc1, 0x8d, 0xbd, 0x0f, 0x13, 0x62, 0xf6, 0x6d, + 0xb9, 0xa1, 0x14, 0x4d, 0x67, 0x12, 0x63, 0xe4, 0x06, 0xc1, 0x7b, 0x02, 0x2a, 0xeb, 0x04, 0xe2, + 0x98, 0xaf, 0x74, 0xe4, 0x06, 0xc9, 0xb4, 0xd9, 0xde, 0xe9, 0xd9, 0x1c, 0x15, 0x1a, 0xfb, 0x02, + 0x4c, 0x54, 0x3a, 0x9d, 0x64, 0xc7, 0x99, 0xd5, 0x14, 0x61, 0x9d, 0x8e, 0x93, 0xb9, 0xeb, 0x18, + 0x14, 0xe9, 0x8d, 0x79, 0xee, 0x58, 0x1b, 0x33, 0x7b, 0x23, 0x96, 0xd6, 0x4f, 0x24, 0x5a, 0x5d, + 0xba, 0x38, 0x1a, 0xa2, 0xbf, 0x14, 0xdc, 0x97, 0x61, 0x52, 0xaa, 0x39, 0x95, 0x34, 0x73, 0xb2, + 0x67, 0xf5, 0x64, 0x08, 0x35, 0x26, 0x0d, 0x5b, 0x85, 0x29, 0xe9, 0x6d, 0xdd, 0xa4, 0x48, 0xd7, + 0xf3, 0xa7, 0x70, 0xd5, 0x22, 0x17, 0xe9, 0xa4, 0xdd, 0xc4, 0x04, 0x28, 0xae, 0xc1, 0x25, 0x45, + 0x64, 0xfd, 0x49, 0x0e, 0x4e, 0xf5, 0x19, 0xf1, 0x38, 0x0e, 0x72, 0xee, 0xf0, 0x38, 0xc8, 0x62, + 0xe7, 0x30, 0xb5, 0x22, 0xd8, 0x7e, 0x92, 0xb2, 0xf4, 0xf1, 0x52, 0xf2, 0x96, 0x0f, 0x8c, 0x72, + 0x0c, 0x51, 0xd5, 0xb7, 0x7c, 0x54, 0xcd, 0x16, 0x7a, 0x0f, 0x21, 0xc2, 0x93, 0x1f, 0xb5, 0x64, + 0x1d, 0xec, 0x97, 0xcf, 0x52, 0x0a, 0xa3, 0x78, 0x58, 0x3f, 0xf4, 0x8d, 0x15, 0x9c, 0xc1, 0xda, + 0xda, 0xcf, 0xc1, 0xb8, 0xb6, 0x0e, 0xd9, 0x39, 0xcd, 0x0b, 0xb8, 0x24, 0x93, 0x60, 0x69, 0x1c, + 0xf2, 0xf2, 0x24, 0xc2, 0x45, 0x95, 0x3f, 0x5a, 0x01, 0x7d, 0x47, 0x88, 0x42, 0x5a, 0xac, 0xe8, + 0x96, 0xa1, 0x2d, 0xb6, 0xb1, 0x1c, 0x73, 0xe5, 0xbb, 0x61, 0x54, 0xa9, 0x47, 0xde, 0x23, 0x3e, + 0xc0, 0xa1, 0x93, 0xe4, 0xca, 0x77, 0xc3, 0xc8, 0x71, 0x91, 0xac, 0x27, 0x57, 0x7e, 0xcc, 0xd0, + 0xfa, 0x9b, 0x39, 0x80, 0x7b, 0xd5, 0x65, 0x0c, 0xf6, 0xfe, 0x71, 0x85, 0x82, 0xec, 0x00, 0xba, + 0x8a, 0xfb, 0x21, 0xe2, 0xc0, 0x7f, 0x9f, 0x83, 0x29, 0x13, 0x8d, 0xbd, 0x07, 0xd3, 0xb5, 0x7a, + 0xe0, 0x37, 0x9b, 0x5b, 0x6e, 0xfd, 0xe1, 0x9a, 0xd7, 0xe6, 0x32, 0x74, 0xe9, 0xb0, 0x3c, 0x8b, + 0xc2, 0xb8, 0xc8, 0x69, 0x8a, 0x32, 0x3b, 0x8d, 0xcc, 0xfe, 0x56, 0x0e, 0x26, 0x6b, 0xbb, 0xfe, + 0xe3, 0x38, 0xda, 0x28, 0x0d, 0xc8, 0x57, 0xc5, 0xda, 0x0e, 0x77, 0xfd, 0xc7, 0x49, 0x06, 0x4d, + 0xc3, 0xf8, 0xf3, 0xdd, 0xc1, 0xde, 0xe5, 0xeb, 0x3e, 0xde, 0x64, 0xa2, 0xf0, 0x92, 0x51, 0x89, + 0x6d, 0xd6, 0x69, 0xfd, 0x79, 0x0e, 0xc6, 0xf1, 0xce, 0xd3, 0x6c, 0xa2, 0xcc, 0xf5, 0x49, 0x4a, + 0xc7, 0x18, 0xb7, 0xeb, 0x90, 0x81, 0x7d, 0x13, 0xa6, 0x53, 0x68, 0xcc, 0x82, 0x91, 0x1a, 0x3a, + 0xf8, 0xeb, 0x0a, 0x0a, 0xe9, 0xf2, 0x6f, 0x53, 0x89, 0xb5, 0xaa, 0x91, 0xdd, 0xbf, 0x82, 0xcf, + 0xba, 0x8b, 0x00, 0x9e, 0x02, 0xa9, 0x9b, 0x0d, 0x4b, 0x7f, 0xc9, 0xfd, 0x2b, 0xb6, 0x86, 0x65, + 0xad, 0xc3, 0x48, 0xcd, 0x0f, 0xa2, 0xa5, 0x3d, 0x79, 0x99, 0x58, 0xe1, 0x61, 0x5d, 0x7f, 0xb7, + 0xf5, 0xf0, 0xad, 0xa4, 0x6e, 0x53, 0x11, 0x2b, 0xc3, 0xf0, 0x75, 0x8f, 0x37, 0x1b, 0xba, 0x81, + 0xee, 0xb6, 0x00, 0xd8, 0x12, 0x2e, 0x2e, 0x5c, 0x27, 0x93, 0x9c, 0x28, 0x89, 0x25, 0xf0, 0xc7, + 0x5d, 0x37, 0xcb, 0x46, 0xff, 0xbe, 0x18, 0xe7, 0x21, 0xe8, 0xad, 0xe9, 0x90, 0xae, 0xfe, 0x8f, + 0x73, 0xb0, 0xd0, 0x9f, 0x44, 0x37, 0x2e, 0xce, 0x1d, 0x62, 0x5c, 0xfc, 0x4a, 0xfa, 0x9d, 0x11, + 0xd1, 0xe8, 0x9d, 0x31, 0x79, 0x5d, 0x5c, 0x41, 0xdb, 0xee, 0x3a, 0x57, 0x89, 0x50, 0xce, 0x1d, + 0xf2, 0xcd, 0x88, 0x28, 0x87, 0x39, 0x42, 0x1a, 0x9b, 0x68, 0xad, 0x5f, 0x1f, 0x82, 0xd3, 0x7d, + 0x29, 0xd8, 0x4d, 0x2d, 0xbd, 0xd2, 0x54, 0x9c, 0xd8, 0xa5, 0x2f, 0xfe, 0x25, 0xfc, 0x17, 0xcd, + 0xf7, 0xd2, 0xde, 0x66, 0x77, 0xe3, 0xb4, 0x3a, 0x79, 0xe4, 0xf5, 0xa9, 0x23, 0x79, 0x49, 0x74, + 0x64, 0x06, 0xbd, 0x19, 0x76, 0xd0, 0x2f, 0x91, 0x47, 0xae, 0xd7, 0x0c, 0xf5, 0x65, 0xd7, 0x90, + 0x20, 0x5b, 0x95, 0x25, 0x16, 0xdf, 0x43, 0xd9, 0x16, 0xdf, 0xd6, 0xbf, 0xcc, 0xc1, 0x58, 0xfc, + 0xd9, 0x6c, 0x01, 0x4e, 0x6e, 0xda, 0x95, 0xe5, 0x55, 0x67, 0xf3, 0x83, 0x8d, 0x55, 0xe7, 0xde, + 0x7a, 0x6d, 0x63, 0x75, 0xb9, 0x7a, 0xbd, 0xba, 0xba, 0x52, 0x7a, 0x8e, 0xcd, 0xc0, 0xe4, 0xbd, + 0xf5, 0xdb, 0xeb, 0x77, 0x1f, 0xac, 0x3b, 0xab, 0xb6, 0x7d, 0xd7, 0x2e, 0xe5, 0xd8, 0x24, 0x8c, + 0xd9, 0x4b, 0x95, 0x65, 0x67, 0xfd, 0xee, 0xca, 0x6a, 0x29, 0xcf, 0x4a, 0x30, 0xb1, 0x7c, 0x77, + 0x7d, 0x7d, 0x75, 0x79, 0xb3, 0x7a, 0xbf, 0xba, 0xf9, 0x41, 0xa9, 0xc0, 0x18, 0x4c, 0x21, 0xc2, + 0x86, 0x5d, 0x5d, 0x5f, 0xae, 0x6e, 0x54, 0xd6, 0x4a, 0x43, 0x02, 0x26, 0xf0, 0x35, 0xd8, 0x70, + 0xcc, 0xe8, 0xf6, 0xbd, 0xa5, 0xd5, 0xd2, 0x88, 0x40, 0x11, 0x7f, 0x69, 0x28, 0xa3, 0xa2, 0x7a, + 0x44, 0x59, 0xa9, 0x6c, 0x56, 0x96, 0x2a, 0xb5, 0xd5, 0x52, 0x91, 0x9d, 0x82, 0x59, 0x03, 0xe4, + 0xac, 0xdd, 0xbd, 0x51, 0x5d, 0x2f, 0x8d, 0xb1, 0x39, 0x28, 0xc5, 0xb0, 0x95, 0x25, 0xe7, 0x5e, + 0x6d, 0xd5, 0x2e, 0x41, 0x1a, 0xba, 0x5e, 0xb9, 0xb3, 0x5a, 0x1a, 0xb7, 0xde, 0x95, 0x7e, 0x80, + 0xb2, 0xab, 0xd9, 0x49, 0x60, 0xb5, 0xcd, 0xca, 0xe6, 0xbd, 0x5a, 0xaa, 0xf1, 0xe3, 0x30, 0x5a, + 0xbb, 0xb7, 0xbc, 0xbc, 0x5a, 0xab, 0x95, 0x72, 0x0c, 0x60, 0xe4, 0x7a, 0xa5, 0xba, 0xb6, 0xba, + 0x52, 0xca, 0x5b, 0x3f, 0x91, 0x83, 0x19, 0x25, 0x01, 0xaa, 0x47, 0xa3, 0x8f, 0xb9, 0x16, 0xdf, + 0x33, 0x2e, 0xb6, 0xca, 0x49, 0x2b, 0x55, 0xc9, 0x21, 0xcb, 0xf0, 0x67, 0x73, 0x70, 0x22, 0x13, + 0x9b, 0x7d, 0x00, 0x25, 0xf5, 0x05, 0x77, 0xdc, 0xa8, 0xbe, 0x9b, 0xec, 0x63, 0x67, 0x53, 0xb5, + 0xa4, 0xd0, 0xa4, 0x5a, 0x33, 0x49, 0xf8, 0xdc, 0xc3, 0x66, 0xf0, 0x74, 0x04, 0xd6, 0xb7, 0x72, + 0x70, 0xaa, 0x4f, 0x35, 0x6c, 0x19, 0x46, 0xe2, 0xc4, 0x34, 0x87, 0x58, 0xb0, 0xcd, 0x7d, 0x7b, + 0xbf, 0x4c, 0x88, 0x98, 0x21, 0x17, 0xff, 0xb2, 0x47, 0xe2, 0x4c, 0x33, 0x98, 0xee, 0x45, 0x76, + 0xdf, 0xe9, 0x54, 0xcf, 0x53, 0x4d, 0x95, 0x07, 0xb5, 0xa5, 0x71, 0xea, 0xbb, 0x82, 0xfb, 0x38, + 0xc4, 0x7c, 0x2f, 0xd6, 0x4f, 0xe5, 0x84, 0x70, 0x97, 0x46, 0x14, 0x32, 0x6f, 0x25, 0x0c, 0xbb, + 0x2d, 0x6e, 0xfb, 0x4d, 0x5e, 0xb1, 0xd7, 0xe9, 0xd8, 0x40, 0x69, 0xd5, 0xc5, 0x02, 0xbc, 0x56, + 0x38, 0x6e, 0xd0, 0x36, 0x5e, 0xab, 0x75, 0x1a, 0xf6, 0x16, 0xc0, 0xea, 0x93, 0x88, 0x07, 0x6d, + 0xb7, 0x19, 0xc7, 0x68, 0x91, 0x91, 0xa5, 0x08, 0x6a, 0xca, 0xdb, 0x1a, 0xb2, 0xf5, 0xb7, 0x73, + 0x30, 0x41, 0x97, 0xa6, 0x4a, 0x93, 0x07, 0xd1, 0xc7, 0x9b, 0x5e, 0x6f, 0x19, 0xd3, 0x2b, 0x76, + 0xd8, 0xd0, 0xf8, 0x8b, 0xe2, 0xcc, 0x99, 0xf5, 0xcf, 0x72, 0x50, 0x4a, 0x23, 0xb2, 0xf7, 0xa0, + 0x58, 0xe3, 0x8f, 0x78, 0xe0, 0x45, 0x7b, 0xb4, 0x51, 0xaa, 0x14, 0x7e, 0x12, 0x87, 0xca, 0xe4, + 0x7c, 0x08, 0xe9, 0x97, 0x1d, 0xd3, 0x0c, 0xba, 0xdf, 0x6b, 0x6a, 0x8f, 0xc2, 0xd3, 0x52, 0x7b, + 0x58, 0xff, 0x4b, 0x1e, 0x4e, 0xdd, 0xe0, 0x91, 0xde, 0xa6, 0xd8, 0xbc, 0xe0, 0xd3, 0x83, 0xb5, + 0x4b, 0x6b, 0xc9, 0x3c, 0x8c, 0x62, 0x91, 0x1a, 0x5f, 0x5b, 0xfd, 0x64, 0x4b, 0xf1, 0xbc, 0x2e, + 0x18, 0x39, 0xc2, 0xfa, 0xd4, 0x7d, 0x49, 0xcb, 0x1a, 0x14, 0x4f, 0xeb, 0xf3, 0x30, 0x85, 0x61, + 0xf1, 0xbb, 0x62, 0x39, 0xf0, 0x06, 0xa9, 0x7f, 0x8a, 0x76, 0x0a, 0xca, 0x5e, 0x83, 0x92, 0x80, + 0x54, 0xea, 0x0f, 0xdb, 0xfe, 0xe3, 0x26, 0x6f, 0xec, 0xf0, 0x06, 0x1e, 0xeb, 0x45, 0xbb, 0x07, + 0xae, 0x78, 0xde, 0x6b, 0xcb, 0xab, 0x1b, 0x6f, 0xa0, 0x8e, 0x86, 0x78, 0x26, 0xd0, 0x85, 0xb7, + 0x60, 0xfc, 0x23, 0x66, 0x00, 0xb3, 0xfe, 0xe7, 0x1c, 0xcc, 0x61, 0xe3, 0xb4, 0x8a, 0x55, 0x76, + 0x56, 0xd5, 0x5b, 0x5a, 0x52, 0x1c, 0x57, 0x80, 0xcc, 0xa5, 0x10, 0xf7, 0x62, 0xa2, 0x13, 0xca, + 0x0f, 0xa0, 0x13, 0xaa, 0x1d, 0x27, 0x13, 0xfd, 0x80, 0x2a, 0xad, 0x5b, 0x43, 0xc5, 0x42, 0x69, + 0x28, 0x19, 0x72, 0xeb, 0x6f, 0xe5, 0x61, 0xd4, 0xe6, 0x98, 0xa2, 0x9b, 0x9d, 0x87, 0xd1, 0x75, + 0x3f, 0xe2, 0xe1, 0x1d, 0x23, 0x1f, 0x7b, 0x5b, 0x80, 0x9c, 0x56, 0xc3, 0x56, 0x85, 0x62, 0xc2, + 0x6f, 0x04, 0x7e, 0xa3, 0x5b, 0x8f, 0xf4, 0x09, 0xdf, 0x91, 0x20, 0x5b, 0x95, 0xb1, 0xd7, 0x61, + 0x8c, 0x38, 0xc7, 0x8f, 0xba, 0x68, 0x8c, 0x1c, 0xf0, 0x38, 0xc5, 0x7b, 0x82, 0x80, 0x32, 0xad, + 0x14, 0x30, 0x86, 0x34, 0x99, 0xb6, 0x47, 0x66, 0x50, 0xa2, 0xfa, 0xf0, 0x21, 0xa2, 0xfa, 0xa7, + 0x61, 0xa4, 0x12, 0x86, 0x3c, 0x52, 0x51, 0x0c, 0x26, 0xe2, 0xb0, 0x6d, 0x21, 0x8f, 0x24, 0x63, + 0x17, 0xcb, 0x6d, 0xc2, 0xb3, 0xfe, 0x79, 0x1e, 0x86, 0xf1, 0x4f, 0x7c, 0x32, 0x0d, 0xea, 0xbb, + 0xc6, 0x93, 0x69, 0x50, 0xdf, 0xb5, 0x11, 0xca, 0xae, 0xa0, 0xa6, 0x42, 0xe5, 0x6f, 0xa2, 0xd6, + 0xa3, 0x0a, 0xbe, 0x91, 0x80, 0x6d, 0x1d, 0x27, 0x7e, 0xe1, 0x2f, 0x64, 0xc6, 0x2e, 0x39, 0x09, + 0xf9, 0xbb, 0x35, 0x6a, 0x31, 0x46, 0xc4, 0xf2, 0x43, 0x3b, 0x7f, 0xb7, 0x86, 0xbd, 0x71, 0xb3, + 0xb2, 0xf8, 0xe6, 0x35, 0x6a, 0xa8, 0xec, 0x8d, 0x5d, 0x77, 0xf1, 0xcd, 0x6b, 0x36, 0x95, 0x88, + 0xfe, 0xc5, 0x6f, 0xc6, 0x87, 0x57, 0xe9, 0x73, 0x8f, 0xfd, 0x8b, 0x6d, 0xc3, 0x47, 0x56, 0x3b, + 0x41, 0x60, 0x8b, 0x30, 0x4e, 0xb1, 0x1e, 0x10, 0x5f, 0x8b, 0xc5, 0x40, 0xb1, 0x20, 0x24, 0x85, + 0x8e, 0x24, 0x9f, 0xe0, 0x68, 0x80, 0x54, 0x96, 0x59, 0x7a, 0x82, 0x53, 0x43, 0x18, 0xda, 0x1a, + 0x8a, 0xf8, 0x24, 0xf9, 0x86, 0x97, 0xf8, 0xd2, 0x4f, 0x69, 0x41, 0x03, 0x30, 0xcd, 0x41, 0x8c, + 0x60, 0xfd, 0x62, 0x1e, 0x8a, 0x1b, 0xcd, 0xee, 0x8e, 0xd7, 0xbe, 0x7f, 0x85, 0x31, 0xc0, 0x6b, + 0x9c, 0xca, 0x83, 0x21, 0xfe, 0x66, 0xa7, 0xa1, 0xa8, 0x6e, 0x6e, 0x6a, 0x43, 0x0a, 0xe9, 0xd6, + 0x36, 0x0f, 0x6a, 0xdc, 0x29, 0xf4, 0x99, 0xfa, 0xc9, 0xae, 0x40, 0x7c, 0xff, 0xea, 0x77, 0x51, + 0x1b, 0x12, 0x8b, 0xc5, 0x8e, 0xd1, 0xd8, 0x1b, 0x80, 0x87, 0x04, 0x5d, 0x1e, 0x94, 0x42, 0x5b, + 0x7e, 0x1a, 0xc9, 0x29, 0x92, 0x04, 0xd1, 0xd8, 0x55, 0xa0, 0x89, 0x49, 0xd9, 0xcc, 0x4f, 0x98, + 0x04, 0x32, 0x3f, 0xa4, 0x22, 0x21, 0x54, 0xf6, 0x0e, 0x8c, 0xd7, 0x03, 0x8e, 0xaf, 0x8e, 0x6e, + 0x33, 0x49, 0x52, 0xae, 0x53, 0x2e, 0x27, 0xe5, 0xf7, 0xaf, 0xd8, 0x3a, 0xba, 0xf5, 0x8f, 0x47, + 0x61, 0x42, 0xff, 0x1e, 0x66, 0xc3, 0x6c, 0xd8, 0x14, 0x77, 0x77, 0x32, 0x36, 0xeb, 0x60, 0x21, + 0x1d, 0xa7, 0xe7, 0xcc, 0x0f, 0x12, 0x78, 0xd2, 0xf2, 0x4c, 0x05, 0xa9, 0xb8, 0xf9, 0x9c, 0x3d, + 0x13, 0x26, 0x60, 0x89, 0xc7, 0x2a, 0x50, 0xf4, 0x3b, 0xe1, 0x0e, 0x6f, 0x7b, 0xea, 0xbd, 0xe5, + 0x25, 0x83, 0xd1, 0x5d, 0x2a, 0xec, 0xe1, 0x15, 0x93, 0xb1, 0x37, 0x61, 0xc4, 0xef, 0xf0, 0xb6, + 0xeb, 0xd1, 0x19, 0xf7, 0x7c, 0x8a, 0x01, 0x6f, 0x57, 0xaa, 0x1a, 0x21, 0x21, 0xb3, 0xcb, 0x30, + 0xe4, 0x3f, 0x8c, 0xc7, 0xeb, 0xb4, 0x49, 0xf4, 0x30, 0x72, 0x35, 0x12, 0x44, 0x14, 0x04, 0x1f, + 0xba, 0xad, 0x6d, 0x1a, 0x31, 0x93, 0xe0, 0x96, 0xdb, 0xda, 0xd6, 0x09, 0x04, 0x22, 0x7b, 0x1f, + 0xa0, 0xe3, 0xee, 0xf0, 0xc0, 0x69, 0x74, 0xa3, 0x3d, 0x1a, 0xb7, 0xb3, 0x06, 0xd9, 0x86, 0x28, + 0x5e, 0xe9, 0x46, 0x7b, 0x1a, 0xed, 0x58, 0x47, 0x01, 0x59, 0x05, 0xa0, 0xe5, 0x46, 0x11, 0x0f, + 0x5a, 0x3e, 0x59, 0xfb, 0x25, 0x41, 0x08, 0x25, 0x83, 0x3b, 0x71, 0xb1, 0xc6, 0x41, 0x23, 0xc2, + 0x8f, 0xf6, 0x02, 0x97, 0x72, 0xca, 0xa7, 0x3e, 0xda, 0x0b, 0x8c, 0x56, 0x0a, 0x44, 0xf6, 0x39, + 0x18, 0x6d, 0x78, 0x61, 0xdd, 0x0f, 0x1a, 0x14, 0xbd, 0xe4, 0x05, 0x83, 0x66, 0x45, 0x96, 0x69, + 0x64, 0x0a, 0x5d, 0x7c, 0x2d, 0x05, 0x21, 0x5d, 0xf7, 0x1f, 0xa3, 0x9a, 0x3f, 0xfd, 0xb5, 0xb5, + 0xb8, 0x58, 0xff, 0xda, 0x84, 0x48, 0x0c, 0xe5, 0x8e, 0x17, 0x35, 0xdd, 0x2d, 0x7a, 0xe7, 0x36, + 0x87, 0xf2, 0x06, 0x16, 0xe9, 0x43, 0x29, 0x91, 0xd9, 0x5b, 0x50, 0xe4, 0xed, 0x28, 0x70, 0x1d, + 0xaf, 0x41, 0x5e, 0x92, 0xe6, 0x47, 0x8b, 0x03, 0xd8, 0xad, 0xae, 0xe8, 0x1f, 0x8d, 0xf8, 0xd5, + 0x86, 0xe8, 0x9f, 0xb0, 0xee, 0xb5, 0xc8, 0xb9, 0xd1, 0xec, 0x9f, 0xda, 0x72, 0xf5, 0x8e, 0xde, + 0x3f, 0x02, 0x91, 0xbd, 0x07, 0xa3, 0x62, 0xfd, 0x36, 0xfc, 0x1d, 0x0a, 0x08, 0x61, 0x99, 0xfd, + 0x23, 0xcb, 0x7a, 0xa6, 0xab, 0x22, 0x12, 0x0b, 0xd9, 0x7d, 0x1c, 0x3a, 0x5e, 0x9d, 0x82, 0x3c, + 0x98, 0xcb, 0xb1, 0xf2, 0xa0, 0x56, 0x5d, 0xd6, 0xc8, 0x86, 0xdd, 0xc7, 0x61, 0xb5, 0xce, 0xce, + 0x02, 0x24, 0xef, 0xea, 0xf2, 0x15, 0xc4, 0xd6, 0x20, 0x9f, 0x1f, 0xfa, 0xdf, 0x7f, 0xbe, 0x9c, + 0x5b, 0x02, 0x28, 0xaa, 0x98, 0x31, 0xd6, 0x1a, 0x9c, 0xee, 0xbb, 0x12, 0xd9, 0x45, 0x28, 0x6d, + 0xbb, 0xa4, 0x87, 0xab, 0xef, 0xba, 0xed, 0x36, 0x6f, 0xd2, 0x1e, 0x38, 0xad, 0xe0, 0xcb, 0x12, + 0x2c, 0x39, 0x5b, 0xef, 0xc3, 0x5c, 0xd6, 0x10, 0xb0, 0x17, 0x61, 0x42, 0x0f, 0x8f, 0x43, 0x4c, + 0xc6, 0xdd, 0x8e, 0xa7, 0x02, 0xe4, 0x10, 0x83, 0x5f, 0xcb, 0xc1, 0x0b, 0x87, 0x2d, 0x68, 0xb6, + 0x00, 0xc5, 0x4e, 0xe0, 0xf9, 0x28, 0x38, 0x52, 0xfe, 0x01, 0xf5, 0x1b, 0x53, 0x0b, 0xa0, 0x84, + 0x13, 0xb9, 0x3b, 0xe4, 0x72, 0x61, 0x8f, 0x21, 0x64, 0xd3, 0xdd, 0x09, 0xd9, 0xa7, 0x60, 0xa6, + 0xc1, 0xb7, 0xdd, 0x6e, 0x33, 0x72, 0xc2, 0xfa, 0x2e, 0x6f, 0xa0, 0x97, 0x13, 0x9a, 0xd2, 0xd9, + 0x25, 0x2a, 0xa8, 0x29, 0x78, 0xcf, 0x17, 0x0f, 0xf7, 0xf9, 0xe2, 0x5b, 0x43, 0xc5, 0x5c, 0x29, + 0x6f, 0xa3, 0xed, 0x92, 0xf5, 0x7d, 0x79, 0x98, 0xef, 0x37, 0x83, 0xd9, 0xbb, 0x59, 0x7d, 0x20, + 0x9f, 0x12, 0x74, 0xb8, 0xfe, 0x94, 0xa0, 0xd5, 0xc6, 0x16, 0x21, 0xf6, 0x51, 0x3a, 0x2a, 0xde, + 0x80, 0x82, 0x09, 0x9a, 0x8e, 0x1b, 0x86, 0x8f, 0xc5, 0x22, 0x2d, 0x68, 0x21, 0x66, 0x09, 0xa6, + 0xd3, 0x28, 0x18, 0xfb, 0x2c, 0x40, 0xbd, 0xe9, 0x87, 0x1c, 0x5f, 0xec, 0xe9, 0xf4, 0x97, 0x86, + 0xda, 0x31, 0x54, 0x7f, 0xa2, 0x45, 0xe8, 0xb2, 0xdf, 0xe0, 0x34, 0x80, 0x2e, 0x9c, 0xea, 0xb3, + 0x65, 0x89, 0xe1, 0x49, 0xf2, 0xb5, 0xab, 0xec, 0x4f, 0xdd, 0x38, 0x6b, 0x7b, 0xba, 0xc7, 0xf3, + 0xfd, 0xe6, 0xc8, 0x1e, 0xb0, 0xde, 0x7d, 0x49, 0x70, 0x27, 0x73, 0xe3, 0x6e, 0x10, 0x73, 0x97, + 0x90, 0x7b, 0x41, 0x93, 0x95, 0x61, 0x5c, 0x65, 0x77, 0x14, 0xd2, 0xb5, 0x64, 0x0e, 0x04, 0xba, + 0xcd, 0x71, 0xf2, 0x60, 0x0c, 0x51, 0xf4, 0x44, 0xa3, 0x73, 0x7b, 0x0c, 0x21, 0x9b, 0x7b, 0x1d, + 0xd5, 0xba, 0x17, 0xd4, 0xfc, 0x36, 0x4f, 0x0b, 0x2a, 0xfd, 0xe9, 0x9c, 0x1a, 0xfe, 0xde, 0xed, + 0xf6, 0xa8, 0xef, 0x63, 0x80, 0x7e, 0x43, 0xf4, 0x61, 0xf8, 0xb7, 0x90, 0x23, 0xd4, 0xaa, 0x23, + 0x39, 0x82, 0x7e, 0xb2, 0xf3, 0x30, 0x1d, 0x48, 0xcb, 0xd2, 0xc8, 0xa7, 0xfe, 0x94, 0x99, 0x34, + 0x26, 0x25, 0x78, 0xd3, 0xc7, 0x3e, 0xa5, 0xef, 0xba, 0x15, 0x77, 0x98, 0x76, 0xfa, 0xb0, 0x4b, + 0x30, 0x26, 0x4e, 0x1f, 0x8c, 0x3d, 0x93, 0x72, 0x58, 0x40, 0x3c, 0x3c, 0xcb, 0xed, 0xe2, 0x87, + 0xf4, 0x37, 0xf1, 0xfa, 0x56, 0x5e, 0x31, 0xd3, 0xcf, 0x3e, 0x76, 0x0a, 0x46, 0xfd, 0x60, 0x47, + 0x6b, 0xda, 0x88, 0x1f, 0xec, 0x88, 0x76, 0x5d, 0x80, 0x92, 0xf4, 0x9f, 0x91, 0x81, 0x09, 0xc2, + 0xbd, 0xb6, 0xbc, 0x1c, 0x17, 0xed, 0x29, 0x09, 0xc7, 0x14, 0xf6, 0x7b, 0xed, 0xba, 0xc0, 0x0c, + 0x43, 0xdf, 0xd1, 0x43, 0x4e, 0x51, 0xb3, 0xa7, 0xc2, 0xd0, 0x4f, 0x62, 0x4f, 0x35, 0xd8, 0x12, + 0x4c, 0x0a, 0x3e, 0x71, 0xe0, 0x2b, 0x3a, 0x9a, 0xcf, 0xf4, 0x1e, 0xcd, 0x7b, 0xed, 0xba, 0xfa, + 0x44, 0x7b, 0x22, 0xd4, 0x7e, 0xb1, 0xdb, 0x50, 0xd2, 0x64, 0x18, 0xf4, 0x90, 0x4c, 0x59, 0x39, + 0x27, 0x6c, 0x34, 0xd9, 0xa7, 0xda, 0xde, 0xf6, 0xed, 0xe9, 0xba, 0x09, 0xa0, 0xae, 0xf9, 0x77, + 0x73, 0x6a, 0x2f, 0xcd, 0x20, 0x62, 0x16, 0x4c, 0xee, 0xba, 0xa1, 0x13, 0x86, 0x2d, 0x69, 0xb5, + 0x45, 0xa1, 0x76, 0xc7, 0x77, 0xdd, 0xb0, 0x16, 0xb6, 0x54, 0x2a, 0x8f, 0x13, 0x02, 0xc7, 0x77, + 0xbb, 0xd1, 0xae, 0xa3, 0x4b, 0x64, 0xb2, 0xc7, 0x66, 0x77, 0xdd, 0xf0, 0xae, 0x28, 0xd3, 0x78, + 0xb3, 0x97, 0x61, 0x0a, 0xf9, 0xd6, 0x3d, 0xc5, 0x18, 0x83, 0x4b, 0xd8, 0x13, 0x82, 0x71, 0xdd, + 0x93, 0x9c, 0xe9, 0x0b, 0xff, 0x8f, 0x3c, 0x9c, 0xcc, 0xee, 0x1d, 0x9c, 0x9e, 0xa2, 0x4f, 0xd1, + 0x6b, 0x8e, 0xbe, 0x6d, 0x4c, 0x40, 0x64, 0x60, 0x90, 0xac, 0xc1, 0xc9, 0x67, 0x0e, 0xce, 0x6b, + 0x30, 0x83, 0x8c, 0x48, 0xf6, 0x6b, 0x7a, 0x61, 0x44, 0xf1, 0x2e, 0xec, 0x69, 0x51, 0x20, 0xf7, + 0xf3, 0x35, 0x01, 0x66, 0xaf, 0xc0, 0x94, 0xda, 0x91, 0xfd, 0xc7, 0x6d, 0x51, 0xb1, 0xdc, 0x8e, + 0x27, 0x09, 0x7a, 0x17, 0x81, 0xec, 0x04, 0x8c, 0xb8, 0x9d, 0x8e, 0xa8, 0x52, 0xee, 0xc2, 0xc3, + 0x6e, 0xa7, 0x23, 0xd3, 0xcd, 0xa0, 0x8f, 0xa0, 0xb3, 0x8d, 0x76, 0x3b, 0x64, 0x24, 0x68, 0x4f, + 0x20, 0x50, 0xda, 0xf2, 0x84, 0x62, 0xdd, 0x0b, 0x5a, 0x85, 0x32, 0x8a, 0x28, 0xe0, 0x76, 0x62, + 0x84, 0xd3, 0x50, 0x54, 0x2f, 0xc8, 0xd2, 0xd5, 0xc1, 0x1e, 0x75, 0xe9, 0xf5, 0xf8, 0x4d, 0x38, + 0xd5, 0xf0, 0x42, 0x9c, 0xbc, 0xb2, 0x49, 0x9d, 0x0e, 0x79, 0x25, 0xca, 0xb0, 0xb5, 0xf6, 0x1c, + 0x15, 0x8b, 0x9e, 0xac, 0x74, 0x3a, 0xd2, 0x37, 0x91, 0xfa, 0xfa, 0x73, 0x30, 0x4d, 0x32, 0x10, + 0x1d, 0x91, 0xf8, 0x2d, 0xb4, 0x80, 0xc5, 0xe5, 0x84, 0x12, 0xfc, 0x00, 0x81, 0xaa, 0x0d, 0x45, + 0xf9, 0x87, 0x39, 0x38, 0x91, 0x29, 0x44, 0xb1, 0xaf, 0x83, 0x74, 0xc2, 0x8a, 0x7c, 0x27, 0xe0, + 0x75, 0xaf, 0xe3, 0x61, 0x98, 0x0a, 0xa9, 0x64, 0x5c, 0x3c, 0x4c, 0xfc, 0x42, 0x87, 0xae, 0x4d, + 0xdf, 0x8e, 0x89, 0xa4, 0xf6, 0xa3, 0x14, 0xa4, 0xc0, 0x0b, 0x5f, 0x86, 0x13, 0x99, 0xa8, 0x19, + 0x5a, 0x89, 0xd7, 0xcd, 0xf4, 0xca, 0xea, 0xd9, 0x28, 0xd5, 0x68, 0x4d, 0x5b, 0x41, 0xcd, 0xfb, + 0xcd, 0xb8, 0x79, 0x29, 0x71, 0x8b, 0xad, 0xa6, 0xd7, 0x75, 0xd6, 0x8d, 0x41, 0x11, 0xf5, 0x5f, + 0xda, 0x5f, 0x86, 0x13, 0x34, 0xf9, 0x76, 0x02, 0xb7, 0xb3, 0x9b, 0xb0, 0x93, 0x1f, 0xfa, 0x6a, + 0x16, 0x3b, 0x39, 0x2b, 0x6f, 0x08, 0xfc, 0x98, 0xeb, 0xac, 0xdb, 0x0b, 0xa4, 0x36, 0xfc, 0x51, + 0xbc, 0xd4, 0x33, 0x3e, 0x27, 0x63, 0x5a, 0xe7, 0xb2, 0xa6, 0xf5, 0xe0, 0x6b, 0x6a, 0x1d, 0x98, + 0xbe, 0x59, 0x49, 0x3d, 0x24, 0x99, 0x38, 0x29, 0xc9, 0x99, 0x3e, 0x44, 0xdb, 0x1a, 0x6a, 0x32, + 0xbd, 0xe5, 0x4c, 0x3d, 0x0d, 0x62, 0xcf, 0xc3, 0x58, 0x9c, 0x41, 0x9a, 0x0e, 0x8e, 0xa2, 0x04, + 0x54, 0x1b, 0xd4, 0xc2, 0xef, 0xcf, 0xc1, 0xb9, 0xa3, 0x7a, 0x88, 0x3d, 0x80, 0x93, 0x68, 0x46, + 0x11, 0xfa, 0x71, 0x27, 0x3b, 0x75, 0xf7, 0xff, 0x67, 0xef, 0x6a, 0x7e, 0x23, 0x39, 0xae, 0x3b, + 0x7b, 0x66, 0x48, 0x0e, 0xdf, 0xf0, 0xa3, 0x59, 0xbb, 0xda, 0xa5, 0xc8, 0x5d, 0xae, 0xb6, 0xf7, + 0xc3, 0xbb, 0x23, 0x4b, 0xf2, 0xae, 0x22, 0x4b, 0x2b, 0x47, 0x96, 0x9b, 0x33, 0x3d, 0x9c, 0x5e, + 0xce, 0x97, 0xba, 0x7b, 0x48, 0xaf, 0x64, 0xbb, 0x33, 0xe2, 0x34, 0xc9, 0x89, 0x87, 0x33, 0xe3, + 0xf9, 0xd0, 0x7a, 0x85, 0x00, 0xf9, 0x02, 0x6c, 0x20, 0x89, 0xe3, 0xc4, 0x09, 0x10, 0x23, 0x08, + 0x90, 0x43, 0x84, 0x20, 0x87, 0xfc, 0x05, 0x49, 0x2e, 0xb9, 0x09, 0x30, 0x0c, 0xf8, 0x90, 0x53, + 0x02, 0x08, 0x89, 0x80, 0xe4, 0x90, 0xe4, 0x16, 0xc4, 0x07, 0x9f, 0x82, 0x7a, 0x55, 0xd5, 0x5d, + 0xfd, 0x31, 0xb3, 0x5c, 0xad, 0x94, 0xc4, 0x80, 0x4f, 0xe4, 0x54, 0xbd, 0xaa, 0xae, 0xef, 0x7a, + 0xef, 0xd5, 0x7b, 0xbf, 0x77, 0x78, 0xe2, 0xf1, 0x35, 0xa9, 0x25, 0x0e, 0xf5, 0x60, 0x60, 0xdb, + 0x75, 0x69, 0x94, 0x07, 0x03, 0x7b, 0xd4, 0x17, 0xbf, 0x0b, 0xb4, 0x38, 0x6f, 0x43, 0x1b, 0xb6, + 0x66, 0x94, 0x94, 0x8e, 0x05, 0x45, 0x3e, 0x16, 0x6e, 0x81, 0x7a, 0xe4, 0xb5, 0x29, 0xc7, 0xeb, + 0xb5, 0xb1, 0x69, 0xef, 0xdd, 0x65, 0x11, 0xd1, 0xad, 0x55, 0x3f, 0xdd, 0x1e, 0xf5, 0xf7, 0xef, + 0xf2, 0xaf, 0x9c, 0x8a, 0x0b, 0x4d, 0x66, 0xe3, 0xc9, 0x8b, 0x70, 0x2e, 0x02, 0xf0, 0x11, 0x78, + 0x8c, 0x5b, 0xeb, 0x34, 0x2b, 0x0c, 0x07, 0x75, 0x15, 0x96, 0xc5, 0x9c, 0x0f, 0x7d, 0xbf, 0x33, + 0x2b, 0xc7, 0xd3, 0xe8, 0x9e, 0xe2, 0x9f, 0x9b, 0x88, 0x4e, 0x25, 0x4a, 0x00, 0x67, 0xe0, 0x94, + 0xc9, 0x0b, 0x40, 0x7c, 0xae, 0xdc, 0x3f, 0x06, 0xf8, 0x07, 0xd7, 0x45, 0x8e, 0xbf, 0x7f, 0xf9, + 0x67, 0xff, 0x2e, 0x05, 0xe7, 0x12, 0x44, 0x07, 0xca, 0xe2, 0x77, 0x7a, 0x63, 0xef, 0x98, 0x09, + 0x08, 0x72, 0x27, 0xd7, 0xa4, 0x74, 0xae, 0x0f, 0x5a, 0x60, 0x11, 0xbf, 0xf9, 0xb7, 0xf8, 0x2f, + 0x7a, 0x34, 0xb4, 0x86, 0x42, 0xd5, 0x41, 0xff, 0x25, 0x26, 0xac, 0x63, 0x18, 0x83, 0x51, 0xa7, + 0x8f, 0xd1, 0x10, 0x90, 0xc5, 0xc8, 0x84, 0x04, 0x2e, 0x6c, 0x45, 0x43, 0x22, 0xa2, 0x3c, 0x86, + 0xa5, 0x0e, 0x22, 0x29, 0xe4, 0x4b, 0xb0, 0x29, 0xdd, 0x24, 0x6e, 0x64, 0x5f, 0xa1, 0x65, 0xb9, + 0x75, 0xb1, 0xe5, 0xdf, 0x29, 0xc5, 0xd0, 0x0e, 0xdb, 0x81, 0x6d, 0x9c, 0xc4, 0x4e, 0x7b, 0xe0, + 0xc6, 0xe2, 0x5e, 0x60, 0x57, 0x19, 0x50, 0xfc, 0x26, 0xa5, 0x32, 0xdb, 0x83, 0x48, 0x08, 0x0c, + 0xda, 0x6b, 0x3e, 0x7c, 0xef, 0xc0, 0x33, 0x89, 0x2d, 0xa6, 0xd7, 0x07, 0x1a, 0x2e, 0x05, 0x9c, + 0xcf, 0x22, 0xfd, 0x4d, 0x59, 0x9f, 0xab, 0xb0, 0xfc, 0xae, 0xd7, 0x1a, 0x7a, 0x43, 0x7e, 0x2f, + 0xf3, 0x25, 0xc1, 0xd2, 0xe4, 0x6b, 0xf9, 0x2f, 0x53, 0x42, 0xe8, 0xd9, 0xe9, 0xf7, 0xc7, 0xa3, + 0xf1, 0xb0, 0x35, 0x08, 0xa9, 0x5b, 0xc8, 0x29, 0x3c, 0x8b, 0x3c, 0xc1, 0x5d, 0x84, 0xc9, 0xef, + 0x0f, 0x05, 0x2e, 0xc0, 0xa1, 0xb0, 0xb5, 0xcd, 0xdd, 0x7d, 0x29, 0xcc, 0xb5, 0xe8, 0x94, 0x5a, + 0x97, 0x89, 0x29, 0x8f, 0x2e, 0xd5, 0x5a, 0x9e, 0xb3, 0x2e, 0xb2, 0x3a, 0x63, 0x54, 0xa4, 0x9c, + 0xd0, 0xf0, 0xa8, 0xbe, 0x65, 0x27, 0xe8, 0x45, 0xb8, 0x56, 0xb9, 0x7f, 0xe4, 0xcb, 0xb0, 0xd4, + 0x69, 0xcb, 0xd1, 0xe0, 0xa2, 0x92, 0xbe, 0xd9, 0x66, 0x88, 0xb4, 0x41, 0x1d, 0xe5, 0x39, 0x2b, + 0xdb, 0xe1, 0xa9, 0x3b, 0x2b, 0x21, 0xc5, 0x94, 0xb6, 0x23, 0xf8, 0xeb, 0x78, 0x31, 0xb2, 0x0a, + 0x29, 0xff, 0x24, 0x48, 0x75, 0xda, 0x74, 0xb5, 0x8e, 0x24, 0x4c, 0x5c, 0x8b, 0xff, 0xd2, 0x7e, + 0x0d, 0x6e, 0x9d, 0x75, 0x8c, 0xe8, 0x4e, 0x9b, 0x32, 0xe0, 0x4b, 0xd6, 0x7a, 0x2b, 0x36, 0x6e, + 0x57, 0x41, 0x86, 0xf4, 0xec, 0x88, 0x09, 0x17, 0x69, 0xcd, 0x61, 0x47, 0xfb, 0xad, 0x34, 0xac, + 0x86, 0x55, 0x71, 0xe4, 0x79, 0xc8, 0xf8, 0xd5, 0xae, 0xfa, 0x4f, 0x46, 0x32, 0x11, 0xad, 0xdc, + 0x42, 0x22, 0xca, 0xf3, 0xe0, 0x0b, 0xb3, 0x7b, 0x2a, 0xbf, 0xea, 0x58, 0xcb, 0x98, 0x28, 0x5e, + 0x73, 0xee, 0xc3, 0x2a, 0x1a, 0x07, 0xe1, 0x65, 0x3a, 0xee, 0x70, 0x05, 0xef, 0x6c, 0x1d, 0x7d, + 0xf6, 0xc3, 0x8f, 0xae, 0xcc, 0xa1, 0x3a, 0x7e, 0x99, 0x96, 0xa5, 0xf7, 0x19, 0xcd, 0x94, 0x34, + 0x2d, 0x99, 0xe9, 0x9a, 0x16, 0xde, 0x95, 0x29, 0x9a, 0x96, 0xf9, 0x19, 0x9a, 0x96, 0xa0, 0xa4, + 0xac, 0x69, 0x41, 0x7d, 0xdb, 0xe2, 0x34, 0x7d, 0x5b, 0x50, 0x86, 0xe9, 0xdb, 0xae, 0xf3, 0xee, + 0x0e, 0x5b, 0x0f, 0x5d, 0x1c, 0x07, 0xbe, 0xab, 0xb1, 0x23, 0x56, 0xeb, 0x21, 0xbe, 0xc5, 0xef, + 0x2c, 0x81, 0x78, 0xc0, 0xd7, 0xfe, 0x48, 0x89, 0xa8, 0x29, 0xc4, 0x54, 0xdc, 0x80, 0xd5, 0xce, + 0x29, 0x95, 0x9f, 0xbc, 0xb6, 0xc4, 0x08, 0xaf, 0x58, 0x2b, 0x22, 0x95, 0x31, 0xc3, 0x9f, 0x83, + 0x35, 0x9f, 0x8c, 0xf3, 0x83, 0xe8, 0xd8, 0x63, 0xf9, 0xa5, 0x39, 0x4a, 0xc5, 0xf3, 0xb0, 0xee, + 0x13, 0x72, 0x51, 0x93, 0xf1, 0xc2, 0x2b, 0x96, 0x2a, 0x32, 0x1a, 0x3c, 0x5d, 0x3b, 0x8e, 0xb2, + 0x45, 0x9f, 0x51, 0xab, 0xb4, 0xbf, 0x4f, 0x87, 0x44, 0x38, 0xf1, 0x99, 0x1d, 0xc8, 0xd1, 0xdb, + 0x92, 0x0f, 0x12, 0x3f, 0x56, 0xae, 0x4e, 0x19, 0x7e, 0x6e, 0x02, 0x61, 0xdb, 0x75, 0x0b, 0x46, + 0xa3, 0xbe, 0xb0, 0x88, 0x70, 0x19, 0x43, 0xc0, 0xd8, 0x72, 0x5c, 0x7e, 0xa2, 0x3a, 0x76, 0x86, + 0xe4, 0x67, 0x57, 0x27, 0x78, 0x68, 0xba, 0xfa, 0x90, 0x31, 0xf0, 0x7f, 0x89, 0x0f, 0x34, 0x01, + 0x35, 0x1e, 0xa3, 0x70, 0xe5, 0xe9, 0x04, 0xc6, 0x2e, 0x56, 0x39, 0x8e, 0x12, 0xd6, 0xac, 0x4e, + 0xc4, 0xbf, 0xa2, 0x5a, 0x03, 0x96, 0x51, 0x80, 0x12, 0x15, 0x66, 0x12, 0x34, 0x76, 0xf1, 0xce, + 0x17, 0xcc, 0xaa, 0x95, 0xa3, 0xe5, 0x44, 0x35, 0x27, 0xf0, 0xac, 0x2c, 0xf6, 0x84, 0x1b, 0x39, + 0x2f, 0x40, 0x37, 0x67, 0x8e, 0x40, 0x20, 0x1d, 0x61, 0x53, 0x2f, 0xb4, 0xc2, 0x09, 0x9c, 0x4c, + 0x3b, 0x81, 0xcd, 0xe9, 0x53, 0x32, 0x23, 0xa0, 0x4b, 0xc0, 0x33, 0xa5, 0x64, 0x9e, 0x49, 0x16, + 0x82, 0xd2, 0x21, 0x21, 0x48, 0xfb, 0x8b, 0x34, 0x5c, 0x3b, 0xc3, 0x74, 0xcd, 0xf8, 0xe6, 0x57, + 0x20, 0xc7, 0xde, 0x19, 0xd8, 0xf1, 0x99, 0x0a, 0xb1, 0xad, 0xb4, 0x52, 0x7e, 0xd6, 0x51, 0x16, + 0x3a, 0x38, 0xef, 0x60, 0xe4, 0xff, 0x4f, 0x7e, 0x05, 0xd6, 0xd8, 0x81, 0xc6, 0xac, 0x98, 0x8e, + 0x26, 0xdd, 0x33, 0x9c, 0x68, 0x5b, 0xc2, 0xe5, 0x22, 0x52, 0x14, 0x0f, 0x39, 0x3c, 0x31, 0x6c, + 0x3f, 0x8d, 0x38, 0x90, 0x43, 0xb2, 0xa3, 0x56, 0xa7, 0x7b, 0x26, 0xdb, 0x7f, 0xe1, 0xd0, 0x21, + 0x17, 0x63, 0xc6, 0x97, 0x34, 0xa1, 0x84, 0xbf, 0xc9, 0x4d, 0x58, 0xeb, 0x4d, 0x4e, 0xa9, 0xdc, + 0xc8, 0xd6, 0x02, 0x7f, 0x2c, 0x9e, 0xb7, 0x56, 0x7a, 0x93, 0x53, 0x7d, 0x30, 0xc0, 0x29, 0xc5, + 0x57, 0xe5, 0x75, 0x4a, 0xc7, 0x76, 0xad, 0xa0, 0x5c, 0x40, 0x4a, 0x5a, 0x01, 0xdb, 0xb7, 0x9c, + 0xf6, 0x3c, 0x30, 0x1b, 0x23, 0x1e, 0xd0, 0x86, 0xfd, 0xd0, 0x7e, 0x9a, 0x12, 0xec, 0xfa, 0xf4, + 0x75, 0xff, 0x8b, 0x29, 0x4a, 0x98, 0xa2, 0x5b, 0xa0, 0xd2, 0xa1, 0x0f, 0x0e, 0x15, 0x7f, 0x8e, + 0x56, 0x7b, 0x93, 0x53, 0x7f, 0xec, 0xe4, 0x81, 0x5f, 0x90, 0x07, 0xfe, 0x55, 0xc1, 0xce, 0x27, + 0x1e, 0x0f, 0xd3, 0x87, 0x5c, 0xfb, 0xcf, 0x34, 0xdc, 0x3c, 0xdb, 0x21, 0xf0, 0x8b, 0x79, 0x4b, + 0x98, 0xb7, 0x88, 0x5e, 0x67, 0x3e, 0xa6, 0xd7, 0x49, 0xd8, 0x7b, 0x0b, 0x49, 0x7b, 0x2f, 0xa6, + 0x45, 0x5a, 0x4c, 0xd0, 0x22, 0x25, 0x6e, 0xd0, 0xec, 0x63, 0x36, 0xe8, 0x92, 0xbc, 0x4e, 0xfe, + 0xcd, 0x97, 0xbf, 0xc2, 0xac, 0xfd, 0x3b, 0x70, 0x4e, 0xb0, 0xf6, 0xec, 0xe6, 0x08, 0x94, 0x83, + 0xb9, 0xbb, 0xb7, 0x93, 0x98, 0x7a, 0x24, 0x4b, 0x60, 0xbc, 0xd7, 0x39, 0x3b, 0x1f, 0xe4, 0xff, + 0xff, 0x61, 0xe4, 0xc9, 0x03, 0xb8, 0x80, 0x70, 0xd0, 0x87, 0xb2, 0x5a, 0xd3, 0x1d, 0x7a, 0x47, + 0x7c, 0x3d, 0x5c, 0x8d, 0xb1, 0xbd, 0x9d, 0x43, 0xa9, 0x39, 0x96, 0x77, 0x54, 0x9e, 0xb3, 0xce, + 0x8f, 0x12, 0xd2, 0xa3, 0x32, 0xc2, 0x5f, 0x2b, 0xa0, 0x3d, 0x7e, 0xbc, 0x50, 0xce, 0x8e, 0x0e, + 0x38, 0x95, 0xb3, 0xa5, 0xd1, 0xbb, 0x06, 0x2b, 0x43, 0xef, 0x68, 0xe8, 0x8d, 0x4e, 0x42, 0x02, + 0xdc, 0x32, 0x4f, 0x14, 0x03, 0x23, 0x40, 0xe9, 0x9e, 0x88, 0xc9, 0x16, 0x85, 0xb4, 0x92, 0x2f, + 0xfa, 0x25, 0xce, 0x03, 0x5d, 0x4d, 0x72, 0x03, 0xd9, 0x8f, 0xfb, 0x99, 0x6c, 0x4a, 0x4d, 0x5b, + 0x1c, 0x3a, 0xef, 0xa8, 0xd3, 0xf5, 0xb4, 0xbf, 0x51, 0x04, 0x47, 0x90, 0x34, 0x78, 0xe4, 0x1d, + 0xc9, 0xf6, 0x2f, 0x1d, 0x63, 0x43, 0x92, 0x8a, 0xc8, 0x66, 0x52, 0x1c, 0xcd, 0x0d, 0x13, 0x42, + 0x68, 0x6e, 0x98, 0xf2, 0x14, 0x06, 0x4c, 0x5c, 0x00, 0xbe, 0x27, 0x0c, 0x08, 0xe8, 0x99, 0xb7, + 0x7f, 0x87, 0xdc, 0x86, 0x45, 0x66, 0x33, 0x20, 0x9a, 0xbb, 0x16, 0x6a, 0xee, 0xfe, 0x1d, 0x4b, + 0xe4, 0x6b, 0x3f, 0xf4, 0x35, 0x71, 0xb1, 0x4e, 0xec, 0xdf, 0x21, 0xaf, 0x9e, 0xcd, 0x96, 0x2f, + 0x2b, 0x6c, 0xf9, 0x7c, 0x3b, 0xbe, 0xd7, 0x42, 0x76, 0x7c, 0xd7, 0x67, 0x8f, 0x16, 0x7f, 0x2a, + 0x61, 0xe8, 0x65, 0x01, 0xaa, 0xcd, 0x4f, 0x15, 0xb8, 0x3c, 0xb3, 0x04, 0xb9, 0x04, 0x59, 0xbd, + 0x61, 0x3a, 0xc1, 0xfc, 0xd2, 0x3d, 0x23, 0x52, 0xc8, 0x2e, 0x2c, 0xed, 0xb4, 0x46, 0x9d, 0x43, + 0xba, 0x8c, 0x13, 0x75, 0x97, 0xb1, 0x6a, 0x7d, 0xf2, 0xf2, 0x9c, 0x15, 0x94, 0x25, 0x2e, 0xac, + 0xe3, 0x5e, 0x08, 0x45, 0x8a, 0x49, 0x27, 0xa8, 0x0d, 0x62, 0x15, 0xc6, 0x8a, 0xd1, 0x73, 0x26, + 0x96, 0x18, 0xdd, 0x82, 0xef, 0x09, 0x5e, 0x64, 0x7a, 0x03, 0x9f, 0x00, 0x86, 0xf1, 0x16, 0x64, + 0x1b, 0xe2, 0x11, 0x53, 0x32, 0x7e, 0x15, 0x0f, 0x96, 0x96, 0x9f, 0xab, 0xfd, 0x9e, 0x22, 0x64, + 0xfb, 0xc7, 0x77, 0x44, 0x0a, 0xb2, 0xd3, 0x9e, 0x1d, 0x64, 0xa7, 0xfd, 0x09, 0x83, 0xec, 0x68, + 0x7f, 0xc5, 0x41, 0x92, 0xcd, 0x76, 0x23, 0xa2, 0x58, 0x7a, 0x5a, 0x23, 0x66, 0x23, 0xb4, 0x3a, + 0xaf, 0x49, 0x41, 0xda, 0xe2, 0xdf, 0x9a, 0x6e, 0xcb, 0x2c, 0x2d, 0xd5, 0x3f, 0x49, 0xc3, 0xa5, + 0x59, 0xc5, 0x13, 0xc3, 0xc0, 0x2a, 0x4f, 0x16, 0x06, 0xf6, 0x36, 0x64, 0x59, 0x9a, 0x6f, 0xa1, + 0x8b, 0x03, 0xce, 0x8b, 0xd2, 0x01, 0x17, 0xd9, 0xe4, 0x1a, 0x2c, 0xe8, 0x05, 0x3b, 0x88, 0x4c, + 0x84, 0xa6, 0x74, 0xad, 0xc3, 0x11, 0x1a, 0x69, 0xf1, 0x2c, 0xf2, 0x8d, 0x78, 0x30, 0x2e, 0x1e, + 0x92, 0x68, 0x4b, 0x1a, 0x90, 0x18, 0x7e, 0x39, 0xb6, 0x37, 0xc0, 0xdb, 0xe6, 0x10, 0xb6, 0x56, + 0x3c, 0xb0, 0x97, 0x06, 0x0b, 0x8d, 0xa1, 0x37, 0xf2, 0xc6, 0xb2, 0x99, 0xdb, 0x00, 0x53, 0x2c, + 0x9e, 0xc3, 0x8d, 0xd0, 0x5a, 0x8f, 0x98, 0xcf, 0xf1, 0x82, 0x8c, 0x03, 0x81, 0x56, 0x6b, 0x34, + 0xd9, 0x92, 0x48, 0x68, 0x81, 0x4a, 0x6b, 0xd2, 0x3b, 0x3c, 0x69, 0x5a, 0x15, 0xce, 0x6a, 0xb0, + 0x02, 0x5d, 0x4c, 0xa5, 0x1d, 0x1c, 0x59, 0x12, 0x89, 0xf6, 0x5d, 0x05, 0xce, 0x27, 0xf5, 0x83, + 0x5c, 0x82, 0x4c, 0x2f, 0x31, 0xee, 0x58, 0x8f, 0xb9, 0x4a, 0xe6, 0xe8, 0x5f, 0xf7, 0xa8, 0x3f, + 0x3c, 0x6d, 0x8d, 0x65, 0x63, 0x40, 0x29, 0xd9, 0x02, 0xfa, 0xa3, 0x84, 0xff, 0x93, 0x2b, 0xe2, + 0x8c, 0x4e, 0xc7, 0x22, 0x95, 0xe1, 0x1f, 0x4d, 0x07, 0x30, 0xdb, 0x8d, 0xfa, 0x80, 0xe1, 0x67, + 0xbf, 0x0c, 0x19, 0xda, 0xac, 0xc8, 0xea, 0xa5, 0xeb, 0x47, 0xaf, 0x56, 0x38, 0x11, 0x6b, 0xd5, + 0xa8, 0x75, 0xda, 0xb5, 0x90, 0x58, 0x3b, 0x80, 0xd5, 0x30, 0x05, 0x31, 0xc2, 0x88, 0x8b, 0xb9, + 0xbb, 0x2a, 0xaf, 0x69, 0xa7, 0xdf, 0x67, 0x06, 0xe9, 0x3b, 0xcf, 0xfe, 0xe3, 0x47, 0x57, 0x80, + 0xfe, 0x64, 0x65, 0x92, 0x10, 0x19, 0xb5, 0xef, 0xa7, 0xe0, 0x7c, 0xe0, 0x03, 0x2b, 0xf6, 0xd0, + 0xcf, 0xad, 0x43, 0x96, 0x1e, 0x72, 0x18, 0x12, 0x8c, 0x56, 0xbc, 0x83, 0x33, 0xfc, 0x14, 0x76, + 0x61, 0x63, 0x1a, 0x3d, 0x79, 0x1e, 0x96, 0x10, 0x36, 0x65, 0xd0, 0x3a, 0xf4, 0xe4, 0xb3, 0xaf, + 0x27, 0x12, 0xad, 0x20, 0x5f, 0xfb, 0xb1, 0x02, 0x9b, 0xdc, 0x8c, 0xba, 0xda, 0xea, 0xf4, 0xf0, + 0x99, 0xe8, 0xd0, 0xfb, 0x74, 0x1c, 0x0a, 0x77, 0x43, 0xe7, 0xd8, 0x8d, 0xb0, 0xb5, 0x7c, 0xec, + 0x6b, 0xd3, 0x7b, 0x4b, 0x6e, 0x23, 0x14, 0x10, 0x7f, 0x13, 0xcb, 0x30, 0x07, 0xee, 0x1e, 0x4d, + 0x90, 0x1d, 0xb8, 0x91, 0x42, 0xfb, 0x75, 0xd8, 0x9e, 0xfd, 0x01, 0xf2, 0x75, 0x58, 0xc1, 0xd8, + 0x32, 0xcd, 0xc1, 0xf1, 0xb0, 0xd5, 0xf6, 0x84, 0x2a, 0x4c, 0x68, 0x22, 0xe5, 0x3c, 0x86, 0x6c, + 0xc4, 0x1d, 0x8a, 0x8f, 0x31, 0x6a, 0x0d, 0x2f, 0x14, 0xf2, 0x55, 0x90, 0x6b, 0xd3, 0x7e, 0x43, + 0x01, 0x12, 0xaf, 0x83, 0x7c, 0x11, 0x96, 0x9b, 0x4e, 0xc1, 0x1e, 0xb7, 0x86, 0xe3, 0x72, 0x7f, + 0x32, 0xe4, 0xb0, 0x42, 0xcc, 0xbf, 0x74, 0x7c, 0x48, 0x8f, 0x92, 0xe1, 0xd8, 0x3d, 0xe9, 0x4f, + 0x86, 0x56, 0x88, 0x0e, 0x83, 0xa2, 0x78, 0xde, 0x37, 0xdb, 0xad, 0x47, 0xe1, 0xa0, 0x28, 0x3c, + 0x2d, 0x14, 0x14, 0x85, 0xa7, 0x69, 0x1f, 0x28, 0xb0, 0x25, 0x4c, 0x9d, 0xda, 0x09, 0x6d, 0x29, + 0x20, 0x8a, 0xc2, 0x50, 0xe0, 0x58, 0xce, 0x62, 0x69, 0xd7, 0x05, 0xd0, 0x08, 0x36, 0x10, 0x79, + 0x5b, 0x56, 0x96, 0x7c, 0x05, 0x32, 0xf6, 0xb8, 0x3f, 0x38, 0x03, 0xd2, 0x88, 0xea, 0xcf, 0xe8, + 0xb8, 0x3f, 0xc0, 0x2a, 0xb0, 0xa4, 0xe6, 0xc1, 0x79, 0xb9, 0x71, 0xa2, 0xc5, 0xa4, 0x0a, 0x8b, + 0x1c, 0x52, 0x2a, 0xf2, 0xce, 0x38, 0xa3, 0x4f, 0x3b, 0x6b, 0x02, 0xce, 0x84, 0xe3, 0x28, 0x5a, + 0xa2, 0x0e, 0xed, 0xf7, 0x15, 0xc8, 0x51, 0x6e, 0x03, 0xa5, 0xb8, 0xa7, 0x5d, 0xd2, 0x61, 0xc6, + 0x51, 0x3c, 0x8a, 0xfb, 0xd5, 0x9f, 0xe9, 0x36, 0x7e, 0x05, 0xd6, 0x22, 0x05, 0x88, 0x86, 0x8e, + 0xec, 0xdd, 0xce, 0x61, 0x8b, 0xc5, 0x58, 0x60, 0x0f, 0xca, 0xa1, 0x34, 0xed, 0x77, 0x14, 0x38, + 0x4f, 0x65, 0x7e, 0x13, 0xd5, 0xbd, 0xd6, 0xa4, 0x2b, 0xf6, 0x3b, 0xe5, 0xa0, 0x84, 0xcd, 0x1c, + 0x73, 0xb2, 0x65, 0x1c, 0x14, 0x4f, 0xb3, 0xfc, 0x5c, 0x52, 0x86, 0x2c, 0xbf, 0x5f, 0x46, 0x1c, + 0xfe, 0x70, 0x5b, 0x52, 0x26, 0x04, 0x15, 0x73, 0x22, 0xda, 0x13, 0x3c, 0xc2, 0x78, 0x19, 0xcb, + 0x2f, 0xad, 0xfd, 0x97, 0x02, 0x17, 0xa7, 0x94, 0x21, 0x6f, 0xc0, 0x3c, 0x3a, 0x00, 0xf1, 0xd9, + 0xbb, 0x34, 0xe5, 0x13, 0xe3, 0xc3, 0x93, 0xfd, 0x3b, 0xec, 0x22, 0x3a, 0xa5, 0x3f, 0x2c, 0x56, + 0x8a, 0xbc, 0x03, 0x4b, 0x7a, 0xbb, 0xcd, 0xc5, 0x99, 0x54, 0x48, 0x9c, 0x99, 0xf2, 0xc5, 0x17, + 0x7d, 0x7a, 0x26, 0xce, 0x30, 0x53, 0xf4, 0x76, 0xdb, 0xe5, 0xce, 0x4d, 0x41, 0x7d, 0x9b, 0xbf, + 0x0c, 0xab, 0x61, 0xe2, 0x27, 0xf2, 0xc7, 0xf8, 0xa1, 0x02, 0x6a, 0xb8, 0x0d, 0x9f, 0x0d, 0x10, + 0x4b, 0xd2, 0x34, 0x3f, 0x66, 0x51, 0xfd, 0x61, 0x0a, 0x9e, 0x49, 0x1c, 0x61, 0xf2, 0x02, 0x2c, + 0xe8, 0x83, 0x81, 0x59, 0xe4, 0xab, 0x8a, 0x73, 0x48, 0xa8, 0x25, 0x0e, 0x49, 0x7b, 0x8c, 0x88, + 0xbc, 0x0c, 0x59, 0x5c, 0x99, 0xb4, 0x40, 0x2a, 0x00, 0x22, 0x64, 0x4a, 0x94, 0x08, 0x10, 0xa1, + 0x20, 0x24, 0x25, 0x58, 0xe5, 0x98, 0x0c, 0x96, 0x77, 0xec, 0x7d, 0xdb, 0x47, 0xc4, 0x46, 0xd0, + 0x6e, 0xa1, 0x7a, 0x76, 0x87, 0x2c, 0x4f, 0x46, 0x25, 0x08, 0x97, 0x22, 0x15, 0x50, 0xb1, 0x4e, + 0xb9, 0x26, 0x86, 0x86, 0x88, 0x28, 0x19, 0xac, 0x11, 0x53, 0xea, 0x8a, 0x95, 0xf4, 0xa7, 0x4b, + 0x1f, 0x8d, 0x3a, 0xc7, 0xbd, 0x53, 0xaf, 0x37, 0xfe, 0xec, 0xa6, 0x2b, 0xf8, 0xc6, 0x99, 0xa6, + 0xeb, 0x8f, 0x33, 0x6c, 0x33, 0x47, 0x8b, 0x51, 0x8e, 0x46, 0x02, 0xc0, 0x45, 0x8e, 0x06, 0x43, + 0x86, 0x33, 0xd4, 0x81, 0x22, 0x2c, 0x32, 0x34, 0x08, 0xb1, 0x33, 0x2e, 0x27, 0x36, 0x81, 0xd1, + 0xec, 0xdf, 0x61, 0xec, 0x0b, 0xf3, 0x44, 0x1a, 0x59, 0xa2, 0x28, 0xd9, 0x87, 0x5c, 0xa1, 0xeb, + 0xb5, 0x7a, 0x93, 0x81, 0x73, 0xb6, 0xd7, 0xc3, 0x0d, 0xde, 0x97, 0xe5, 0x43, 0x56, 0x0c, 0x5f, + 0x1d, 0xf1, 0x24, 0x97, 0x2b, 0x22, 0x8e, 0xef, 0x9c, 0xc0, 0x02, 0xbd, 0x7f, 0x61, 0xc6, 0xf8, + 0x44, 0x13, 0xb1, 0x5c, 0xd8, 0xf3, 0x86, 0x7b, 0x2f, 0xb8, 0xb0, 0x5a, 0x69, 0x8d, 0xc6, 0xce, + 0xb0, 0xd5, 0x1b, 0x21, 0x8a, 0xdc, 0x19, 0x50, 0x76, 0xb6, 0x44, 0x84, 0x52, 0xd4, 0x31, 0x8e, + 0xfd, 0xa2, 0x4c, 0x83, 0x19, 0xae, 0x8e, 0xf2, 0x4b, 0xa5, 0x4e, 0xaf, 0xd5, 0xed, 0xbc, 0x2f, + 0x7c, 0xb8, 0x18, 0xbf, 0x74, 0x24, 0x12, 0xad, 0x20, 0x5f, 0xfb, 0x5a, 0x6c, 0xde, 0x58, 0x2b, + 0x73, 0xb0, 0xc8, 0x3d, 0x7c, 0x99, 0xc7, 0x6b, 0xc3, 0xa8, 0x15, 0xcd, 0xda, 0xae, 0xaa, 0x90, + 0x55, 0x80, 0x86, 0x55, 0x2f, 0x18, 0xb6, 0x4d, 0x7f, 0xa7, 0xe8, 0x6f, 0xee, 0x0e, 0x5b, 0x6a, + 0x56, 0xd4, 0xb4, 0xe4, 0x11, 0x9b, 0xd1, 0x7e, 0xa4, 0xc0, 0x85, 0xe4, 0xa9, 0x24, 0x0e, 0xa0, + 0x4f, 0x34, 0x7f, 0x47, 0xfe, 0xe2, 0xcc, 0x79, 0x4f, 0x4c, 0x8e, 0xfa, 0x56, 0x8f, 0x99, 0xcf, + 0x6e, 0x4a, 0x3c, 0x16, 0x05, 0x61, 0xf1, 0x3b, 0x6d, 0xad, 0x00, 0x1b, 0xd3, 0xea, 0x08, 0x77, + 0x75, 0x0d, 0x72, 0x7a, 0xa3, 0x51, 0x31, 0x0b, 0xba, 0x63, 0xd6, 0x6b, 0xaa, 0x42, 0x96, 0x60, + 0x7e, 0xd7, 0xaa, 0x37, 0x1b, 0x6a, 0x4a, 0xfb, 0x81, 0x02, 0x2b, 0x66, 0x60, 0x65, 0xf2, 0xb4, + 0x9b, 0xef, 0xf5, 0xd0, 0xe6, 0xdb, 0xf0, 0xd1, 0x03, 0xfc, 0x0f, 0x9c, 0x69, 0xe7, 0xfd, 0x83, + 0x02, 0xeb, 0xb1, 0x32, 0xc4, 0x86, 0x45, 0xfd, 0xc0, 0xae, 0x9b, 0xc5, 0x02, 0x6f, 0xd9, 0x95, + 0xc0, 0x90, 0x05, 0x03, 0xc4, 0xc4, 0xbe, 0xc2, 0x3c, 0xee, 0x1e, 0x8e, 0xdc, 0x7e, 0xa7, 0x2d, + 0x05, 0x77, 0x2c, 0xcf, 0x59, 0xa2, 0x26, 0xbc, 0xc9, 0xde, 0x9f, 0x0c, 0x3d, 0xac, 0x36, 0x15, + 0x52, 0x84, 0xfa, 0xe9, 0xf1, 0x8a, 0xd1, 0x1a, 0xbb, 0x45, 0xf3, 0xe3, 0x55, 0x07, 0xf5, 0xed, + 0xac, 0x40, 0x8e, 0x4b, 0x2d, 0x28, 0x10, 0x7c, 0x4f, 0x81, 0x8d, 0x69, 0x6d, 0xa5, 0x82, 0x50, + 0xd8, 0xfd, 0xf6, 0x82, 0x0f, 0xf8, 0x1e, 0xf6, 0xbb, 0x15, 0x64, 0xe4, 0x4d, 0xc8, 0x99, 0xa3, + 0xd1, 0xc4, 0x1b, 0xda, 0x2f, 0x37, 0x2d, 0x93, 0x2f, 0x90, 0xcb, 0xff, 0xfe, 0xd1, 0x95, 0x8b, + 0x68, 0x33, 0x3d, 0x74, 0x47, 0x2f, 0xbb, 0x93, 0x61, 0x27, 0x04, 0x8e, 0x2d, 0x97, 0xd0, 0xbe, + 0xa3, 0xc0, 0xe6, 0xf4, 0x4e, 0xd2, 0x5b, 0xc6, 0x61, 0x16, 0x69, 0xc2, 0xe1, 0x0f, 0x6f, 0x19, + 0xdf, 0x6c, 0x4d, 0xbe, 0x65, 0x04, 0x21, 0x2d, 0xe4, 0x07, 0x4e, 0x4e, 0xc5, 0xa2, 0xa5, 0x86, + 0x0b, 0x09, 0x42, 0xed, 0x3f, 0x52, 0x70, 0x81, 0x2e, 0xa0, 0xae, 0x37, 0x1a, 0xe9, 0x93, 0xf1, + 0x89, 0xd7, 0x1b, 0x73, 0x96, 0x8a, 0xbc, 0x0a, 0x0b, 0x27, 0x4f, 0xa6, 0x3e, 0x64, 0xe4, 0x84, + 0x00, 0x1e, 0xca, 0xc2, 0x9a, 0x9b, 0xfe, 0x4f, 0xae, 0x82, 0x1c, 0x9f, 0x36, 0x8d, 0x08, 0x79, + 0xa9, 0x0d, 0xc5, 0x5a, 0x1a, 0xf8, 0xa1, 0x24, 0x5f, 0x83, 0x79, 0x54, 0x19, 0xf0, 0xe3, 0x51, + 0xb0, 0xb5, 0xc9, 0xad, 0x43, 0x85, 0x82, 0xc5, 0x0a, 0x90, 0x97, 0x00, 0x02, 0x70, 0x71, 0x7e, + 0xfe, 0x09, 0x51, 0xda, 0xc7, 0x17, 0xb7, 0x96, 0x4e, 0x8f, 0x5a, 0x1c, 0xb1, 0x3b, 0x0f, 0xeb, + 0x62, 0x58, 0x06, 0x02, 0x58, 0x8b, 0xbf, 0x6c, 0xad, 0xb1, 0x0c, 0x73, 0x20, 0xc0, 0xb5, 0xae, + 0xc7, 0x62, 0x6c, 0x22, 0xbe, 0x66, 0x24, 0x90, 0xe6, 0xf5, 0x58, 0x20, 0xcd, 0x2c, 0xa3, 0x92, + 0xa3, 0x65, 0x6a, 0xff, 0x9a, 0x82, 0xa5, 0x03, 0xca, 0x78, 0xa0, 0x38, 0x3d, 0x5b, 0x3c, 0xbf, + 0x0b, 0xb9, 0x4a, 0xbf, 0xc5, 0x9f, 0x10, 0xb8, 0x11, 0x34, 0x73, 0x0b, 0xec, 0xf6, 0x5b, 0xe2, + 0x35, 0x62, 0x64, 0xc9, 0x44, 0x8f, 0x71, 0x69, 0xbc, 0x0f, 0x0b, 0xec, 0x49, 0x87, 0x6b, 0x8a, + 0x04, 0xeb, 0xe9, 0xb7, 0xe8, 0x45, 0x96, 0x2d, 0x69, 0xbd, 0xd9, 0xb3, 0x90, 0xcc, 0x07, 0x71, + 0x98, 0x40, 0x49, 0x79, 0x30, 0x7f, 0x36, 0xe5, 0x81, 0x04, 0x87, 0xb4, 0x70, 0x16, 0x38, 0xa4, + 0xcd, 0x7b, 0x90, 0x93, 0xda, 0xf3, 0x44, 0x9c, 0xe8, 0x6f, 0xa6, 0x60, 0x05, 0x7b, 0xe5, 0xdb, + 0x77, 0xfc, 0x7c, 0xaa, 0x42, 0x5e, 0x0f, 0xa9, 0x42, 0x36, 0xe4, 0xf9, 0x62, 0x3d, 0x9b, 0xa1, + 0x03, 0xb9, 0x0f, 0xeb, 0x31, 0x42, 0xf2, 0x0a, 0xcc, 0xd3, 0xe6, 0x0b, 0xd1, 0x51, 0x8d, 0xae, + 0x80, 0x00, 0x3a, 0x93, 0x76, 0x7c, 0x64, 0x31, 0x6a, 0xed, 0xbf, 0x15, 0x58, 0xe6, 0xc8, 0xf5, + 0xbd, 0xa3, 0xfe, 0x63, 0x87, 0xf3, 0x66, 0x74, 0x38, 0x99, 0x83, 0x3e, 0x1f, 0xce, 0xff, 0xed, + 0x41, 0xbc, 0x17, 0x1a, 0xc4, 0x8b, 0x3e, 0x90, 0x96, 0xe8, 0xce, 0x8c, 0x31, 0xfc, 0x5b, 0x84, + 0x96, 0x0c, 0x13, 0x92, 0x6f, 0xc0, 0x52, 0xcd, 0x7b, 0x18, 0x92, 0xc0, 0x6e, 0x4e, 0xa9, 0xf4, + 0x45, 0x9f, 0x90, 0xed, 0x29, 0xbc, 0xbc, 0x7a, 0xde, 0x43, 0x37, 0xf6, 0x9a, 0x14, 0x54, 0x49, + 0x85, 0xb0, 0x70, 0xb1, 0x27, 0x59, 0xfa, 0xdc, 0x23, 0x0b, 0x31, 0x27, 0xbe, 0x9b, 0x06, 0x08, + 0x9c, 0x59, 0xe8, 0x06, 0x0c, 0x3d, 0xa4, 0x0b, 0xe5, 0x35, 0x26, 0xc9, 0x6b, 0x5c, 0xbc, 0xaf, + 0xdf, 0xe4, 0x4a, 0xd6, 0xd4, 0x74, 0xa0, 0x33, 0x54, 0xb7, 0x16, 0xb8, 0xf7, 0x44, 0xdb, 0xeb, + 0xb6, 0xd8, 0xd9, 0x9e, 0xde, 0xb9, 0x8e, 0xb8, 0x96, 0x7e, 0xea, 0x94, 0x10, 0xa4, 0xe8, 0x63, + 0x51, 0xa4, 0x04, 0x31, 0x07, 0xb1, 0xcc, 0x93, 0x39, 0x88, 0x35, 0x60, 0xa9, 0xd3, 0x7b, 0xcf, + 0xeb, 0x8d, 0xfb, 0xc3, 0x47, 0xa8, 0x59, 0x0e, 0x54, 0x56, 0x74, 0x08, 0x4c, 0x91, 0xc7, 0xe6, + 0x01, 0x2f, 0x46, 0x9f, 0x5e, 0x9e, 0x06, 0x3f, 0xd1, 0x77, 0x70, 0x9b, 0x57, 0x17, 0xee, 0x67, + 0xb2, 0x0b, 0xea, 0xe2, 0xfd, 0x4c, 0x36, 0xab, 0x2e, 0xdd, 0xcf, 0x64, 0x97, 0x54, 0xb0, 0xa4, + 0xb7, 0x1a, 0xff, 0x2d, 0x46, 0x7a, 0x3e, 0x09, 0x3f, 0x8d, 0x68, 0x3f, 0x4b, 0x01, 0x89, 0x37, + 0x83, 0xbc, 0x0e, 0x39, 0x76, 0xc0, 0xba, 0xc3, 0xd1, 0xb7, 0xb8, 0x05, 0x2d, 0x43, 0xee, 0x90, + 0x92, 0x65, 0xe4, 0x0e, 0x96, 0x6c, 0x8d, 0xbe, 0xd5, 0x25, 0x5f, 0x87, 0x73, 0x38, 0xbc, 0x03, + 0x6f, 0xd8, 0xe9, 0xb7, 0x5d, 0x84, 0x59, 0x6c, 0x75, 0x79, 0xb8, 0xb0, 0x17, 0x30, 0xae, 0x65, + 0x3c, 0x7b, 0xca, 0x34, 0xa0, 0xcf, 0x4a, 0x03, 0x29, 0x1b, 0x8c, 0x90, 0x38, 0xa0, 0xca, 0xe5, + 0x8f, 0x26, 0xdd, 0x2e, 0x9f, 0xd9, 0x3c, 0x15, 0x5a, 0xa3, 0x79, 0x53, 0x2a, 0x5e, 0x0d, 0x2a, + 0x2e, 0x4d, 0xba, 0x5d, 0xf2, 0x2a, 0x40, 0xbf, 0xe7, 0x9e, 0x76, 0x46, 0x23, 0xf6, 0x5e, 0xe1, + 0xbb, 0xd7, 0x05, 0xa9, 0xf2, 0x64, 0xf4, 0x7b, 0x55, 0x96, 0x48, 0x7e, 0x09, 0xd0, 0xe1, 0x17, + 0x3d, 0xe1, 0x99, 0x85, 0x0a, 0x0f, 0x00, 0x20, 0x12, 0xc3, 0xde, 0x7c, 0xc7, 0x9e, 0xdd, 0x79, + 0x5f, 0x58, 0x2f, 0xbf, 0x0d, 0xeb, 0xdc, 0x36, 0xf4, 0xa0, 0x33, 0x3e, 0xe1, 0xdc, 0xf2, 0xd3, + 0xb0, 0xda, 0x12, 0xbb, 0xfc, 0x4f, 0x19, 0x00, 0xfd, 0xc0, 0x16, 0x20, 0x33, 0xb7, 0x61, 0x9e, + 0xca, 0x00, 0x42, 0x97, 0x80, 0x9a, 0x58, 0xac, 0x57, 0xd6, 0xc4, 0x22, 0x05, 0xdd, 0x8d, 0x16, + 0x5a, 0x90, 0x0b, 0x3d, 0x02, 0xee, 0x46, 0x66, 0x54, 0x1e, 0x02, 0xf9, 0xe4, 0x54, 0xa4, 0x02, + 0x10, 0xc0, 0xbe, 0x70, 0xa9, 0x74, 0x3d, 0xc0, 0x4f, 0xe0, 0x19, 0x1c, 0x68, 0x3c, 0x80, 0x8e, + 0x91, 0x97, 0x4f, 0x40, 0x46, 0xf6, 0x20, 0xe3, 0xb4, 0x7c, 0xe7, 0xb1, 0x29, 0x60, 0x38, 0xcf, + 0xf1, 0x70, 0x6e, 0x01, 0x20, 0xce, 0xea, 0xb8, 0x15, 0x8a, 0x7a, 0x89, 0x95, 0x10, 0x03, 0x16, + 0x78, 0xa8, 0xde, 0x29, 0x20, 0x6a, 0x3c, 0x52, 0x2f, 0x87, 0x4e, 0xc5, 0x44, 0x99, 0xa7, 0xe0, + 0x41, 0x79, 0xef, 0x42, 0xda, 0xb6, 0xab, 0xdc, 0x05, 0x7c, 0x25, 0x90, 0x30, 0x6c, 0xbb, 0x2a, + 0xe2, 0xd0, 0x9f, 0x4a, 0xc5, 0x28, 0x31, 0xf9, 0x12, 0xe4, 0x24, 0xf6, 0x99, 0x83, 0x27, 0xe0, + 0x18, 0x48, 0x06, 0xfc, 0xf2, 0xa1, 0x21, 0x51, 0x93, 0x0a, 0xa8, 0x7b, 0x93, 0x77, 0x3d, 0x7d, + 0x30, 0x40, 0xbf, 0x9d, 0xf7, 0xbc, 0x21, 0x63, 0xdb, 0xb2, 0x01, 0xea, 0x28, 0xba, 0x3d, 0xb5, + 0x45, 0xae, 0xac, 0x4f, 0x89, 0x96, 0x24, 0x0d, 0x58, 0xb7, 0xbd, 0xf1, 0x64, 0xc0, 0x6c, 0x2e, + 0x4a, 0xfd, 0x21, 0x15, 0x28, 0x18, 0xd4, 0x02, 0x02, 0x34, 0x8e, 0x68, 0xa6, 0x30, 0x74, 0x39, + 0xea, 0x0f, 0x23, 0xc2, 0x45, 0xbc, 0xb0, 0xe6, 0xc9, 0x53, 0x4e, 0x6f, 0xd5, 0xb0, 0x98, 0x82, + 0xb7, 0xaa, 0x10, 0x53, 0x02, 0xe1, 0xe4, 0xa5, 0x04, 0x38, 0x20, 0x7c, 0xfc, 0x92, 0xe0, 0x80, + 0x42, 0x20, 0x40, 0x1f, 0x64, 0x24, 0x44, 0x3a, 0x3e, 0x17, 0x6f, 0x00, 0xdc, 0xef, 0x77, 0x7a, + 0x55, 0x6f, 0x7c, 0xd2, 0x6f, 0x4b, 0xa8, 0x44, 0xb9, 0x5f, 0xed, 0x77, 0x7a, 0xee, 0x29, 0x26, + 0xff, 0xec, 0xa3, 0x2b, 0x12, 0x91, 0x25, 0xfd, 0x4f, 0x3e, 0x0f, 0x4b, 0xf4, 0x97, 0x13, 0x58, + 0x8e, 0x30, 0xb5, 0x23, 0x96, 0x66, 0xb8, 0xed, 0x01, 0x01, 0xb9, 0x87, 0x91, 0x0a, 0x3a, 0x83, + 0xb1, 0xc4, 0xbc, 0x8a, 0xb0, 0x04, 0x9d, 0xc1, 0x38, 0x0a, 0x32, 0x2a, 0x11, 0x93, 0xb2, 0xdf, + 0x74, 0x11, 0x5c, 0x84, 0x07, 0x44, 0x40, 0xdd, 0x1a, 0x5f, 0x6b, 0xae, 0x40, 0x37, 0x94, 0xc3, + 0x40, 0x46, 0x8a, 0x61, 0x23, 0xec, 0x72, 0x91, 0x3d, 0x86, 0x70, 0xa6, 0x56, 0xc4, 0xd1, 0x6f, + 0xbb, 0x87, 0x98, 0x1c, 0x6a, 0x84, 0x4f, 0x4c, 0x76, 0x60, 0x8d, 0xf1, 0xf8, 0x7e, 0x90, 0x32, + 0xce, 0xe2, 0xe2, 0xd9, 0x16, 0x44, 0x31, 0x93, 0x3f, 0x1f, 0x29, 0x40, 0x4a, 0x30, 0x8f, 0x02, + 0x21, 0xb7, 0xfc, 0xde, 0x92, 0x25, 0xe1, 0xe8, 0x3e, 0xc2, 0x73, 0x05, 0x65, 0x60, 0xf9, 0x5c, + 0x41, 0x52, 0xf2, 0x55, 0x00, 0xa3, 0x37, 0xec, 0x77, 0xbb, 0x88, 0xbf, 0x99, 0x45, 0x51, 0xea, + 0x72, 0x78, 0x3f, 0x62, 0x2d, 0x01, 0x11, 0xc7, 0x8a, 0xc2, 0xdf, 0x6e, 0x04, 0xa5, 0x53, 0xaa, + 0x4b, 0x33, 0x61, 0x81, 0x6d, 0x46, 0xc4, 0xb2, 0xe5, 0xe8, 0xfc, 0x12, 0x12, 0x2a, 0xc3, 0xb2, + 0xe5, 0xe9, 0x71, 0x2c, 0x5b, 0xa9, 0x80, 0xb6, 0x07, 0xe7, 0x93, 0x3a, 0x16, 0x12, 0x61, 0x95, + 0xb3, 0x8a, 0xb0, 0x7f, 0x9e, 0x86, 0x65, 0xac, 0x4d, 0x9c, 0xc2, 0x3a, 0xac, 0xd8, 0x93, 0x77, + 0x7d, 0xa0, 0x17, 0x71, 0x1a, 0x63, 0xfb, 0x46, 0x72, 0x86, 0xfc, 0x4c, 0x15, 0x2a, 0x41, 0x0c, + 0x58, 0x15, 0x37, 0xc1, 0xae, 0xb0, 0x26, 0xf7, 0x61, 0x64, 0x05, 0x58, 0x59, 0x3c, 0x48, 0x63, + 0xa4, 0x50, 0x70, 0x1f, 0xa4, 0x9f, 0xe4, 0x3e, 0xc8, 0x9c, 0xe9, 0x3e, 0x78, 0x07, 0x96, 0xc5, + 0xd7, 0xf0, 0x24, 0x9f, 0x7f, 0xba, 0x93, 0x3c, 0x54, 0x19, 0xa9, 0xf8, 0x27, 0xfa, 0xc2, 0xcc, + 0x13, 0x1d, 0xdf, 0xfe, 0xc4, 0x2e, 0x8b, 0xc5, 0x5d, 0xe7, 0x75, 0x60, 0x14, 0xb3, 0xdd, 0x42, + 0xe3, 0x13, 0xdc, 0x92, 0xaf, 0xc0, 0x52, 0xa5, 0x2f, 0x9e, 0x7d, 0x24, 0x7d, 0x7b, 0x57, 0x24, + 0xca, 0xec, 0x82, 0x4f, 0xe9, 0xdf, 0x6e, 0xe9, 0x4f, 0xe3, 0x76, 0xbb, 0x07, 0xc0, 0xdd, 0x14, + 0x82, 0xe8, 0x43, 0xb8, 0x65, 0x84, 0x4b, 0x7d, 0x58, 0xed, 0x2f, 0x11, 0xd3, 0xd3, 0x89, 0x5b, + 0x94, 0xe8, 0x87, 0x87, 0xfd, 0x49, 0x6f, 0x1c, 0x0a, 0xd7, 0x29, 0x9c, 0xb2, 0x5a, 0x3c, 0x4f, + 0x3e, 0x1e, 0x22, 0xc5, 0x3e, 0xdd, 0x09, 0x21, 0x6f, 0xf9, 0x06, 0x71, 0x8b, 0xb3, 0x46, 0x48, + 0x8b, 0x8d, 0xd0, 0x54, 0x33, 0x38, 0xed, 0x47, 0x8a, 0x8c, 0xe1, 0xfd, 0x09, 0xa6, 0xfa, 0x35, + 0x00, 0xff, 0xdd, 0x5d, 0xcc, 0x35, 0x93, 0x97, 0xfc, 0x54, 0x79, 0x94, 0x03, 0x5a, 0xa9, 0x37, + 0xe9, 0x4f, 0xab, 0x37, 0x0e, 0xe4, 0xea, 0xdf, 0x1c, 0xb7, 0x02, 0x43, 0x0d, 0xb0, 0x7d, 0x4e, + 0x16, 0x4f, 0xa6, 0xf4, 0xce, 0x0d, 0xbc, 0x1b, 0x02, 0x3e, 0x78, 0x0a, 0x0b, 0x2c, 0x15, 0xd4, + 0xde, 0x82, 0x35, 0xd9, 0x91, 0xf4, 0x51, 0xef, 0x90, 0x7c, 0x99, 0x21, 0x0a, 0x2a, 0x21, 0x89, + 0x45, 0x22, 0xa2, 0x27, 0xee, 0xa3, 0xde, 0x21, 0xe3, 0x7f, 0x5a, 0x0f, 0xe5, 0xb6, 0xa2, 0x8c, + 0xf7, 0x13, 0x05, 0x48, 0x9c, 0x5c, 0x3e, 0x4d, 0x94, 0xff, 0x03, 0xee, 0x32, 0xc2, 0x95, 0x65, + 0x9e, 0x84, 0x2b, 0xcb, 0xff, 0x81, 0x02, 0x6b, 0xa6, 0x5e, 0xe5, 0x80, 0xdb, 0xec, 0xfd, 0xe0, + 0x2a, 0x5c, 0x36, 0xf5, 0xaa, 0xdb, 0xa8, 0x57, 0xcc, 0xc2, 0x03, 0x37, 0x11, 0x47, 0xf3, 0x32, + 0x3c, 0x1b, 0x27, 0x09, 0xde, 0x19, 0x2e, 0xc1, 0x46, 0x3c, 0x5b, 0x60, 0x6d, 0x26, 0x17, 0x16, + 0xb0, 0x9c, 0xe9, 0xfc, 0x9b, 0xb0, 0x26, 0x70, 0x25, 0x9d, 0x8a, 0x8d, 0xc8, 0xd5, 0x6b, 0x90, + 0xdb, 0x37, 0x2c, 0xb3, 0xf4, 0xc0, 0x2d, 0x35, 0x2b, 0x15, 0x75, 0x8e, 0xac, 0xc0, 0x12, 0x4f, + 0x28, 0xe8, 0xaa, 0x42, 0x96, 0x21, 0x6b, 0xd6, 0x6c, 0xa3, 0xd0, 0xb4, 0x0c, 0x35, 0x95, 0x7f, + 0x13, 0x56, 0x1b, 0xc3, 0xce, 0x7b, 0xad, 0xb1, 0xb7, 0xe7, 0x3d, 0xc2, 0x67, 0x82, 0x45, 0x48, + 0x5b, 0xfa, 0x81, 0x3a, 0x47, 0x00, 0x16, 0x1a, 0x7b, 0x05, 0xfb, 0xce, 0x1d, 0x55, 0x21, 0x39, + 0x58, 0xdc, 0x2d, 0x34, 0xdc, 0xbd, 0xaa, 0xad, 0xa6, 0xe8, 0x0f, 0xfd, 0xc0, 0xc6, 0x1f, 0xe9, + 0xfc, 0x17, 0x60, 0x1d, 0x79, 0x85, 0x4a, 0x67, 0x34, 0xf6, 0x7a, 0xde, 0x10, 0xdb, 0xb0, 0x0c, + 0x59, 0xdb, 0xa3, 0x9b, 0x7c, 0xec, 0xb1, 0x06, 0x54, 0x27, 0xdd, 0x71, 0x67, 0xd0, 0xf5, 0xbe, + 0xad, 0x2a, 0xf9, 0x7b, 0xb0, 0x66, 0xf5, 0x27, 0xe3, 0x4e, 0xef, 0xd8, 0x1e, 0x53, 0x8a, 0xe3, + 0x47, 0xe4, 0x19, 0x58, 0x6f, 0xd6, 0xf4, 0xea, 0x8e, 0xb9, 0xdb, 0xac, 0x37, 0x6d, 0xb7, 0xaa, + 0x3b, 0x85, 0x32, 0x7b, 0xa4, 0xa8, 0xd6, 0x6d, 0xc7, 0xb5, 0x8c, 0x82, 0x51, 0x73, 0x54, 0x25, + 0xff, 0x7d, 0x54, 0x7b, 0x1c, 0xf6, 0x7b, 0xed, 0x52, 0x0b, 0x23, 0x99, 0xd3, 0x06, 0x6b, 0xb0, + 0x6d, 0x1b, 0x85, 0x7a, 0xad, 0xe8, 0x96, 0xf4, 0x82, 0x53, 0xb7, 0x92, 0x80, 0x5c, 0x37, 0xe1, + 0x42, 0x02, 0x4d, 0xdd, 0x69, 0xa8, 0x0a, 0xb9, 0x02, 0x5b, 0x09, 0x79, 0x07, 0xc6, 0x8e, 0xde, + 0x74, 0xca, 0x35, 0x35, 0x35, 0xa5, 0xb0, 0x6d, 0xd7, 0xd5, 0x74, 0xfe, 0x77, 0x15, 0x58, 0x6d, + 0x8e, 0xb8, 0x85, 0x70, 0x13, 0xfd, 0xfc, 0x9e, 0x83, 0x4b, 0x4d, 0xdb, 0xb0, 0x5c, 0xa7, 0xbe, + 0x67, 0xd4, 0xdc, 0xa6, 0xad, 0xef, 0x46, 0x5b, 0x73, 0x05, 0xb6, 0x24, 0x0a, 0xcb, 0x28, 0xd4, + 0xf7, 0x0d, 0xcb, 0x6d, 0xe8, 0xb6, 0x7d, 0x50, 0xb7, 0x8a, 0xaa, 0x42, 0xbf, 0x98, 0x40, 0x50, + 0x2d, 0xe9, 0xac, 0x35, 0xa1, 0xbc, 0x9a, 0x71, 0xa0, 0x57, 0xdc, 0x9d, 0xba, 0xa3, 0xa6, 0xf3, + 0x55, 0x7a, 0xf5, 0x22, 0x9c, 0x22, 0xb3, 0x6b, 0xcb, 0x42, 0xa6, 0x56, 0xaf, 0x19, 0xd1, 0xa7, + 0xad, 0x65, 0xc8, 0xea, 0x8d, 0x86, 0x55, 0xdf, 0xc7, 0x25, 0x06, 0xb0, 0x50, 0x34, 0x6a, 0xb4, + 0x65, 0x69, 0x9a, 0xd3, 0xb0, 0xea, 0xd5, 0xba, 0x63, 0x14, 0xd5, 0x4c, 0xde, 0x12, 0x5b, 0x58, + 0x54, 0x7a, 0xd8, 0x67, 0xef, 0x48, 0x45, 0xa3, 0xa4, 0x37, 0x2b, 0x0e, 0x9f, 0xa2, 0x07, 0xae, + 0x65, 0xbc, 0xd5, 0x34, 0x6c, 0xc7, 0x56, 0x15, 0xa2, 0xc2, 0x72, 0xcd, 0x30, 0x8a, 0xb6, 0x6b, + 0x19, 0xfb, 0xa6, 0x71, 0xa0, 0xa6, 0x68, 0x9d, 0xec, 0x7f, 0xfa, 0x85, 0xfc, 0x07, 0x0a, 0x10, + 0x06, 0x45, 0x29, 0xe2, 0x1b, 0xe0, 0x8a, 0xd9, 0x86, 0xcd, 0x32, 0x9d, 0x6a, 0xec, 0x5a, 0xb5, + 0x5e, 0x8c, 0x0e, 0xd9, 0x05, 0x20, 0x91, 0xfc, 0x7a, 0xa9, 0xa4, 0x2a, 0x64, 0x0b, 0xce, 0x45, + 0xd2, 0x8b, 0x56, 0xbd, 0xa1, 0xa6, 0x36, 0x53, 0x59, 0x85, 0x5c, 0x8c, 0x65, 0xee, 0x19, 0x46, + 0x43, 0x4d, 0xd3, 0x29, 0x8a, 0x64, 0x88, 0x2d, 0xc1, 0x8a, 0x67, 0xf2, 0xdf, 0x51, 0xe0, 0x02, + 0x6b, 0xa6, 0xd8, 0x5f, 0x7e, 0x53, 0x2f, 0xc1, 0x06, 0x07, 0xd8, 0x4d, 0x6a, 0xe8, 0x79, 0x50, + 0x43, 0xb9, 0xac, 0x99, 0xcf, 0xc0, 0x7a, 0x28, 0x15, 0xdb, 0x91, 0xa2, 0xa7, 0x47, 0x28, 0x79, + 0xc7, 0xb0, 0x1d, 0xd7, 0x28, 0x95, 0xea, 0x96, 0xc3, 0x1a, 0x92, 0xce, 0x6b, 0xb0, 0x5e, 0xf0, + 0x86, 0x63, 0x2a, 0x15, 0xf5, 0x46, 0x9d, 0x7e, 0x0f, 0x9b, 0xb0, 0x02, 0x4b, 0xc6, 0x57, 0x1d, + 0xa3, 0x66, 0x9b, 0xf5, 0x9a, 0x3a, 0x97, 0xbf, 0x14, 0xa1, 0x11, 0xfb, 0xd8, 0xb6, 0xcb, 0xea, + 0x5c, 0xbe, 0x05, 0x2b, 0xc2, 0x16, 0x97, 0xad, 0x8a, 0x6d, 0xd8, 0x14, 0x6b, 0x0d, 0x4f, 0x94, + 0x68, 0x17, 0x36, 0xe0, 0x7c, 0x3c, 0xdf, 0x70, 0x54, 0x85, 0xce, 0x42, 0x24, 0x87, 0xa6, 0xa7, + 0xf2, 0xbf, 0xad, 0xc0, 0x8a, 0xff, 0x9e, 0x81, 0x1a, 0xd4, 0x2b, 0xb0, 0x55, 0x2d, 0xe9, 0x6e, + 0xd1, 0xd8, 0x37, 0x0b, 0x86, 0xbb, 0x67, 0xd6, 0x8a, 0x91, 0x8f, 0x3c, 0x0b, 0xcf, 0x24, 0x10, + 0xe0, 0x57, 0x36, 0xe0, 0x7c, 0x34, 0xcb, 0xa1, 0x5b, 0x35, 0x45, 0x87, 0x3e, 0x9a, 0xe3, 0xef, + 0xd3, 0x74, 0xfe, 0xcf, 0x14, 0xd8, 0xe0, 0x01, 0xa4, 0xf9, 0xcb, 0x0a, 0x8b, 0x2c, 0x80, 0xd0, + 0x9b, 0x79, 0xb8, 0xe9, 0x58, 0x4d, 0xdb, 0x31, 0x8a, 0xa2, 0x38, 0x5d, 0xb4, 0xa6, 0x65, 0x54, + 0x8d, 0x9a, 0x13, 0x69, 0xdb, 0xf3, 0xf0, 0xb9, 0x19, 0xb4, 0xb5, 0xba, 0x23, 0x7e, 0xd3, 0xbd, + 0xfa, 0x39, 0xb8, 0x36, 0x83, 0xd8, 0x27, 0x4c, 0xe5, 0xf7, 0x61, 0xd5, 0xd6, 0xab, 0x95, 0x52, + 0x7f, 0x78, 0xe8, 0xe9, 0x93, 0xf1, 0x49, 0x8f, 0x6c, 0xc1, 0xc5, 0x52, 0xdd, 0x2a, 0x18, 0x2e, + 0xf6, 0x20, 0xd2, 0x88, 0x73, 0xb0, 0x26, 0x67, 0x3e, 0x30, 0xe8, 0xee, 0x22, 0xb0, 0x2a, 0x27, + 0xd6, 0xea, 0x6a, 0x2a, 0xff, 0x35, 0x58, 0x0e, 0x45, 0x61, 0xba, 0x08, 0xe7, 0xe4, 0xdf, 0x0d, + 0xaf, 0xd7, 0xee, 0xf4, 0x8e, 0xd5, 0xb9, 0x68, 0x86, 0x35, 0xe9, 0xf5, 0x68, 0x06, 0x1e, 0x37, + 0x72, 0x86, 0xe3, 0x0d, 0x4f, 0x3b, 0xbd, 0xd6, 0xd8, 0x6b, 0xab, 0xa9, 0xfc, 0x8b, 0xb0, 0x12, + 0xc2, 0x7e, 0xa5, 0xeb, 0xaa, 0x52, 0xe7, 0xf7, 0x43, 0xd5, 0x28, 0x9a, 0xcd, 0xaa, 0x3a, 0x4f, + 0x0f, 0x9a, 0xb2, 0xb9, 0x5b, 0x56, 0x21, 0xff, 0x03, 0x85, 0x4a, 0x28, 0x38, 0xee, 0xd5, 0x92, + 0x2e, 0x56, 0x22, 0xdd, 0x05, 0x0c, 0x51, 0xda, 0xb0, 0x6d, 0xf6, 0xe0, 0x7c, 0x09, 0x36, 0xf8, + 0x0f, 0x57, 0xaf, 0x15, 0xdd, 0xb2, 0x6e, 0x15, 0x0f, 0x74, 0x8b, 0x6e, 0x8d, 0x07, 0x6a, 0x0a, + 0xf7, 0xbb, 0x94, 0xe2, 0x3a, 0xf5, 0x66, 0xa1, 0xac, 0xa6, 0xe9, 0xf6, 0x0a, 0xa5, 0x37, 0xcc, + 0x9a, 0x9a, 0xc1, 0xd3, 0x23, 0x46, 0x8d, 0xd5, 0xd2, 0xfc, 0xf9, 0xfc, 0xc7, 0x0a, 0x5c, 0xb4, + 0x3b, 0xc7, 0xbd, 0xd6, 0x78, 0x32, 0xf4, 0xf4, 0xee, 0x71, 0x7f, 0xd8, 0x19, 0x9f, 0x9c, 0xda, + 0x93, 0xce, 0xd8, 0x23, 0xb7, 0xe1, 0x86, 0x6d, 0xee, 0xd6, 0x74, 0x87, 0xee, 0x7e, 0xbd, 0xb2, + 0x5b, 0xb7, 0x4c, 0xa7, 0x5c, 0x75, 0xed, 0xa6, 0x19, 0xdb, 0x18, 0xd7, 0xe1, 0xb9, 0xe9, 0xa4, + 0x15, 0x63, 0x57, 0x2f, 0x3c, 0x50, 0x95, 0xd9, 0x15, 0xee, 0xe8, 0x15, 0xbd, 0x56, 0x30, 0x8a, + 0xee, 0xfe, 0x1d, 0x35, 0x45, 0x6e, 0xc0, 0xd5, 0xe9, 0xa4, 0x25, 0xb3, 0x61, 0x53, 0xb2, 0xf4, + 0xec, 0xef, 0x96, 0xed, 0x2a, 0xa5, 0xca, 0xe4, 0xff, 0x54, 0x81, 0x8d, 0x69, 0x70, 0x23, 0xe4, + 0x26, 0x68, 0x46, 0xcd, 0xb1, 0x74, 0xb3, 0xe8, 0x16, 0x2c, 0xa3, 0x68, 0xd4, 0x1c, 0x53, 0xaf, + 0xd8, 0xae, 0x5d, 0x6f, 0xd2, 0xd5, 0x14, 0xd8, 0x05, 0x5c, 0x83, 0x2b, 0x33, 0xe8, 0xea, 0x66, + 0xb1, 0xa0, 0x2a, 0xe4, 0x0e, 0xbc, 0x30, 0x83, 0xc8, 0x7e, 0x60, 0x3b, 0x46, 0x55, 0xce, 0x51, + 0x53, 0xf9, 0x0e, 0xa8, 0x51, 0xdf, 0xf9, 0x98, 0xed, 0x85, 0xd5, 0xac, 0xd5, 0xd8, 0x05, 0xb5, + 0x06, 0xb9, 0xba, 0x53, 0x36, 0x2c, 0x8e, 0xba, 0x8e, 0x30, 0xeb, 0xcd, 0x1a, 0x5d, 0xf3, 0x75, + 0xcb, 0x7c, 0x1b, 0x6f, 0xaa, 0x0d, 0x38, 0x6f, 0x57, 0xf4, 0xc2, 0x1e, 0x6e, 0x47, 0xb3, 0xe6, + 0x16, 0xca, 0x7a, 0xad, 0x66, 0x54, 0x54, 0xc0, 0x71, 0x98, 0xe6, 0x64, 0x47, 0x3e, 0x0f, 0xb7, + 0xea, 0x7b, 0x8e, 0xee, 0x36, 0x2a, 0xcd, 0x5d, 0xb3, 0xe6, 0xda, 0x0f, 0x6a, 0x05, 0xc1, 0x55, + 0x15, 0xe2, 0x87, 0xf9, 0x2d, 0xb8, 0x3e, 0x93, 0x3a, 0xc0, 0x47, 0xbf, 0x09, 0xda, 0x4c, 0x4a, + 0xde, 0x91, 0xfc, 0x8f, 0x15, 0xd8, 0x9a, 0xf1, 0x70, 0x4c, 0x5e, 0x80, 0xdb, 0x65, 0x43, 0x2f, + 0x56, 0x0c, 0xdb, 0xc6, 0x3d, 0x4e, 0x47, 0x90, 0xd9, 0x68, 0x24, 0x1e, 0xd5, 0xb7, 0xe1, 0xc6, + 0x6c, 0xf2, 0xe0, 0xd2, 0xbf, 0x05, 0xd7, 0x67, 0x93, 0x72, 0x26, 0x20, 0x45, 0x8f, 0xca, 0xd9, + 0x94, 0x3e, 0xf3, 0x90, 0xce, 0x7f, 0x4f, 0x81, 0x0b, 0xc9, 0xda, 0x1b, 0xda, 0x36, 0xb3, 0x66, + 0x3b, 0x7a, 0xa5, 0xe2, 0x36, 0x74, 0x4b, 0xaf, 0xba, 0x46, 0xcd, 0xaa, 0x57, 0x2a, 0x49, 0x97, + 0xe6, 0x75, 0x78, 0x6e, 0x3a, 0xa9, 0x5d, 0xb0, 0xcc, 0x06, 0xbd, 0x17, 0x34, 0xd8, 0x9e, 0x4e, + 0x65, 0x98, 0x05, 0x43, 0x4d, 0xed, 0xbc, 0xf1, 0xe1, 0xbf, 0x6c, 0xcf, 0x7d, 0xf8, 0xf1, 0xb6, + 0xf2, 0x93, 0x8f, 0xb7, 0x95, 0x7f, 0xfe, 0x78, 0x5b, 0x79, 0xfb, 0xf9, 0xb3, 0x85, 0x16, 0x41, + 0x89, 0xe2, 0xdd, 0x05, 0x34, 0x4a, 0x7a, 0xf9, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xeb, 0xe8, + 0x36, 0x3e, 0x49, 0xab, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -23460,6 +23506,12 @@ func (this *PluginEntraIDSyncSettings) Equal(that interface{}) bool { if this.SsoConnectorId != that1.SsoConnectorId { return false } + if this.CredentialsSource != that1.CredentialsSource { + return false + } + if this.TenantId != that1.TenantId { + return false + } if !bytes.Equal(this.XXX_unrecognized, that1.XXX_unrecognized) { return false } @@ -43514,6 +43566,18 @@ func (m *PluginEntraIDSyncSettings) MarshalToSizedBuffer(dAtA []byte) (int, erro i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.TenantId) > 0 { + i -= len(m.TenantId) + copy(dAtA[i:], m.TenantId) + i = encodeVarintTypes(dAtA, i, uint64(len(m.TenantId))) + i-- + dAtA[i] = 0x22 + } + if m.CredentialsSource != 0 { + i = encodeVarintTypes(dAtA, i, uint64(m.CredentialsSource)) + i-- + dAtA[i] = 0x18 + } if len(m.SsoConnectorId) > 0 { i -= len(m.SsoConnectorId) copy(dAtA[i:], m.SsoConnectorId) @@ -56546,6 +56610,13 @@ func (m *PluginEntraIDSyncSettings) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + if m.CredentialsSource != 0 { + n += 1 + sovTypes(uint64(m.CredentialsSource)) + } + l = len(m.TenantId) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -116623,6 +116694,57 @@ func (m *PluginEntraIDSyncSettings) Unmarshal(dAtA []byte) error { } m.SsoConnectorId = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 0 { + return fmt.Errorf("proto: wrong wireType = %d for field CredentialsSource", wireType) + } + m.CredentialsSource = 0 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowTypes + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + m.CredentialsSource |= EntraIDCredentialsSource(b&0x7F) << shift + if b < 0x80 { + break + } + } + case 4: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field TenantId", 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.TenantId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) From 1396179c87b4117a18fef03983da1ad245ee8a66 Mon Sep 17 00:00:00 2001 From: Marco Dinis Date: Thu, 24 Oct 2024 10:52:50 +0100 Subject: [PATCH 47/70] Suppress stack trace on HostSudoers handled error (#47785) --- lib/srv/usermgmt.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/lib/srv/usermgmt.go b/lib/srv/usermgmt.go index 23397f8ef11d0..81cbd81a12ff2 100644 --- a/lib/srv/usermgmt.go +++ b/lib/srv/usermgmt.go @@ -70,7 +70,7 @@ func NewHostSudoers(uuid string) HostSudoers { backend, err := newHostSudoersBackend(uuid) switch { case trace.IsNotImplemented(err): - slog.DebugContext(context.Background(), "Skipping host sudoers management", "error", err) + slog.DebugContext(context.Background(), "Skipping host sudoers management", "error", err.Error()) return nil case err != nil: //nolint:staticcheck // linter fails on non-linux system as only linux implementation returns useful values. slog.DebugContext(context.Background(), "Error making new HostSudoersBackend", "error", err) From bad3497d70c9af9467108f355639306ec4f49073 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Thu, 24 Oct 2024 11:54:22 +0100 Subject: [PATCH 48/70] Convert `RegisterUsingToken` RPC from HTTP to gRPC (#47853) * Add proto changews for shifting RegisterUsingToken to gRPC * Implement RegisterUsingToken RPC and client fallback * Add methods to `api/client` * Adjust join/register code to try new API first and fallback to old * Rejig JoinServerGRPCServer to invoke auth.Server * Tidy up some code duplication * Fix broken build * Fix TestRegisterBot_RemoteAddr * Fix TestServer_RegisterUsingTPMMethod * Add test for new RegisterUsingToken gRPC RPC * Remove unused helper function * Fix test * Walk back switch to gRPC endpoint for registration via proxy * Remove unused code --- api/client/joinservice.go | 11 ++ api/client/proto/joinservice.pb.go | 144 +++++++++++------- .../legacy/client/proto/joinservice.proto | 3 + lib/auth/apiserver.go | 2 + lib/auth/auth_with_roles.go | 47 +----- lib/auth/authclient/http_client.go | 20 --- lib/auth/authclient/httpfallback.go | 39 +++++ lib/auth/bot_test.go | 3 +- lib/auth/grpcserver.go | 32 +--- lib/auth/join/join.go | 8 +- lib/auth/join_azure.go | 17 ++- lib/auth/join_azure_test.go | 2 +- lib/auth/join_iam.go | 17 ++- lib/auth/join_iam_test.go | 2 +- lib/auth/join_tpm.go | 2 +- lib/auth/join_tpm_test.go | 2 +- lib/joinserver/joinserver.go | 24 +++ lib/joinserver/joinserver_test.go | 91 +++++++++++ 18 files changed, 310 insertions(+), 156 deletions(-) diff --git a/api/client/joinservice.go b/api/client/joinservice.go index 71db117b4acf5..0e46ec5bacf42 100644 --- a/api/client/joinservice.go +++ b/api/client/joinservice.go @@ -22,6 +22,7 @@ import ( "github.com/gravitational/trace" "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/types" ) // JoinServiceClient is a client for the JoinService, which runs on both the @@ -200,3 +201,13 @@ func (c *JoinServiceClient) RegisterUsingTPMMethod( return certs, nil } + +// RegisterUsingToken registers the caller using a token and returns signed +// certs. +// This is used where a more specific RPC has not been introduced for the join +// method. +func (c *JoinServiceClient) RegisterUsingToken( + ctx context.Context, req *types.RegisterUsingTokenRequest, +) (*proto.Certs, error) { + return c.grpcClient.RegisterUsingToken(ctx, req) +} diff --git a/api/client/proto/joinservice.pb.go b/api/client/proto/joinservice.pb.go index 78690405a47e7..d8d425c87a891 100644 --- a/api/client/proto/joinservice.pb.go +++ b/api/client/proto/joinservice.pb.go @@ -794,56 +794,57 @@ func init() { } var fileDescriptor_d7e760ce923b836e = []byte{ - // 783 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x55, 0xc1, 0x6e, 0xdb, 0x46, - 0x10, 0x15, 0x5d, 0x5b, 0xae, 0x47, 0x6a, 0x6b, 0x2d, 0x0a, 0x57, 0x16, 0x6c, 0x59, 0x66, 0xdd, - 0x5a, 0x45, 0x51, 0xc9, 0x50, 0x7f, 0xa0, 0x92, 0x6a, 0x40, 0x6e, 0xe3, 0xc0, 0xa0, 0x9d, 0x43, - 0x72, 0x21, 0x56, 0xd4, 0x40, 0xde, 0x88, 0x26, 0x99, 0xdd, 0x95, 0x01, 0xe5, 0x67, 0xf2, 0x05, - 0xb9, 0xe5, 0x23, 0x72, 0x08, 0x82, 0x1c, 0xf2, 0x01, 0x81, 0xff, 0x21, 0xf7, 0x80, 0xbb, 0x4b, - 0x89, 0xa2, 0x25, 0x3b, 0x01, 0x82, 0x5c, 0x48, 0xec, 0xcc, 0xdb, 0x99, 0x79, 0x6f, 0x66, 0x77, - 0xa1, 0x21, 0xd1, 0xc7, 0x28, 0xe4, 0xb2, 0xe9, 0xe3, 0x90, 0x7a, 0x93, 0xa6, 0xe7, 0x33, 0x0c, - 0x64, 0x33, 0xe2, 0xa1, 0x0c, 0x9b, 0x4f, 0x43, 0x16, 0x08, 0xe4, 0xd7, 0xcc, 0xc3, 0x86, 0xb2, - 0x90, 0x35, 0xf5, 0xab, 0xd4, 0xef, 0xdc, 0xe6, 0x21, 0x97, 0x42, 0x6f, 0xa8, 0xec, 0x67, 0x91, - 0x72, 0x12, 0xa1, 0xd0, 0x5f, 0x0d, 0xb1, 0x5f, 0x59, 0xb0, 0xeb, 0xe0, 0x90, 0x09, 0x89, 0xfc, - 0x91, 0x60, 0xc1, 0xf0, 0xa4, 0x7d, 0x7a, 0x8a, 0xf2, 0x32, 0x1c, 0x38, 0xf8, 0x6c, 0x8c, 0x42, - 0x12, 0x0a, 0x3b, 0xdc, 0x00, 0xdc, 0x71, 0x8c, 0x70, 0x65, 0x38, 0xc2, 0xc0, 0xe5, 0xda, 0x5f, - 0xb6, 0x6a, 0x56, 0xbd, 0xd0, 0xaa, 0x35, 0x74, 0xd4, 0xb9, 0x58, 0x17, 0x31, 0xd0, 0xc4, 0x71, - 0xb6, 0xf9, 0x32, 0x17, 0x39, 0x82, 0x9f, 0x85, 0x14, 0x2e, 0x1b, 0x60, 0x20, 0x99, 0x9c, 0x4c, - 0x43, 0xaf, 0xd4, 0xac, 0x7a, 0xd1, 0x21, 0x42, 0x8a, 0x13, 0xe3, 0x32, 0x3b, 0xec, 0x3e, 0x54, - 0x97, 0x55, 0x2d, 0xa2, 0x30, 0x10, 0x48, 0x76, 0x60, 0xc3, 0xbb, 0xa4, 0xbe, 0x8f, 0xc1, 0x10, - 0x55, 0x8d, 0x1b, 0xce, 0xcc, 0x40, 0x6c, 0x58, 0x53, 0x42, 0xa9, 0x14, 0x85, 0x56, 0x51, 0xab, - 0xd1, 0xe8, 0xc6, 0x36, 0x47, 0xbb, 0xec, 0x37, 0x16, 0xec, 0xcd, 0x25, 0x69, 0x3f, 0x1f, 0x73, - 0xfc, 0xe6, 0xe2, 0xfc, 0x0a, 0x3f, 0x50, 0x29, 0x51, 0x48, 0x1c, 0xb8, 0x03, 0x2a, 0xa9, 0x51, - 0xa5, 0x98, 0x18, 0xff, 0xa5, 0x92, 0x92, 0x7d, 0x28, 0x52, 0xcf, 0x43, 0x21, 0x74, 0xfe, 0xf2, - 0x77, 0x8a, 0x70, 0x41, 0xdb, 0x54, 0x38, 0x7b, 0x00, 0xb5, 0xe5, 0x6c, 0xbe, 0x9a, 0x68, 0xc7, - 0x70, 0x38, 0xcf, 0xf2, 0xcc, 0x34, 0xa6, 0x9b, 0x84, 0x99, 0x26, 0xab, 0xc0, 0xf7, 0x22, 0xf4, - 0xc7, 0x92, 0x85, 0x81, 0xca, 0x55, 0x74, 0xa6, 0x6b, 0xfb, 0xa3, 0x05, 0x07, 0x8b, 0xe3, 0x9c, - 0x04, 0x4c, 0x32, 0xea, 0x27, 0xea, 0x74, 0xa1, 0x18, 0x1f, 0x94, 0x2f, 0x16, 0xbc, 0x10, 0xef, - 0x4a, 0x82, 0x6c, 0xc3, 0x3a, 0x8e, 0xdc, 0x98, 0x80, 0x16, 0xb7, 0x97, 0x73, 0xf2, 0x38, 0x8a, - 0x79, 0x91, 0x5f, 0x20, 0x8f, 0x23, 0x77, 0x84, 0x13, 0x25, 0x69, 0xec, 0x59, 0xc3, 0xd1, 0xff, - 0x38, 0x21, 0x0f, 0x81, 0xe8, 0x0e, 0xd0, 0xb8, 0x60, 0x37, 0xa2, 0x9c, 0x5e, 0x89, 0xf2, 0xaa, - 0x4a, 0xbf, 0x67, 0x94, 0xb9, 0x38, 0x3b, 0x6d, 0xcf, 0x30, 0x67, 0x31, 0x04, 0x25, 0x72, 0xe1, - 0x94, 0x68, 0xc6, 0x2c, 0x3a, 0xab, 0xb0, 0x82, 0x23, 0xfb, 0x6d, 0xf6, 0x38, 0x4e, 0x79, 0x27, - 0xb5, 0xb6, 0x61, 0x95, 0x05, 0x2c, 0x21, 0xfa, 0xa7, 0xc9, 0xf4, 0x39, 0x5a, 0xf5, 0x72, 0x8e, - 0xda, 0x4a, 0x5c, 0x20, 0xd3, 0xa6, 0xba, 0xdc, 0xb4, 0xc3, 0x34, 0xb5, 0x71, 0x67, 0xc0, 0x5b, - 0x4d, 0xec, 0xe5, 0x9c, 0x92, 0x97, 0x35, 0x76, 0x36, 0x60, 0x3d, 0xa2, 0x13, 0x3f, 0xa4, 0x03, - 0xfb, 0x85, 0x95, 0x39, 0xa9, 0x29, 0x42, 0x66, 0x0e, 0x1e, 0x40, 0x29, 0x5d, 0x4e, 0xba, 0x8f, - 0xbb, 0x33, 0x21, 0x8f, 0x03, 0x8f, 0x4f, 0x22, 0x89, 0x83, 0x2e, 0x47, 0x75, 0x19, 0x50, 0xbf, - 0x97, 0x73, 0x36, 0x53, 0xc9, 0xb5, 0x3e, 0x07, 0x77, 0x0c, 0x69, 0xdc, 0x3d, 0xe5, 0x4c, 0x57, - 0xf8, 0xd2, 0x82, 0xf2, 0xb2, 0x46, 0x91, 0x2d, 0xc8, 0x47, 0xe3, 0xbe, 0xcf, 0x3c, 0x33, 0xa1, - 0x66, 0x45, 0xf6, 0xa0, 0xe0, 0x71, 0xa4, 0x12, 0xd3, 0x47, 0x12, 0xb4, 0x49, 0x1d, 0xc8, 0xbf, - 0x80, 0x18, 0x40, 0xaa, 0xd5, 0x7a, 0x86, 0x9c, 0x92, 0xf6, 0xa4, 0x32, 0x92, 0x3f, 0x60, 0xd3, - 0xc0, 0x05, 0x1b, 0x06, 0x54, 0x8e, 0x39, 0xaa, 0x59, 0x2a, 0x3a, 0x3f, 0x69, 0xfb, 0x79, 0x62, - 0xb6, 0x1f, 0xc3, 0xd6, 0x62, 0x39, 0xc8, 0x21, 0xc4, 0x60, 0xb3, 0x72, 0xfb, 0x7e, 0xd8, 0x37, - 0x55, 0xff, 0x38, 0x33, 0x77, 0xfc, 0xb0, 0x1f, 0xb3, 0x12, 0xe8, 0x71, 0x4c, 0x6e, 0x58, 0xb3, - 0x6a, 0xbd, 0x5f, 0x81, 0xc2, 0x7f, 0x21, 0x0b, 0xce, 0xf5, 0xb3, 0x43, 0x18, 0x6c, 0x2d, 0xbe, - 0x65, 0xc9, 0xc1, 0xa2, 0x31, 0xc9, 0x3e, 0x1d, 0x95, 0xdf, 0xee, 0x41, 0xe9, 0x01, 0xa8, 0x5b, - 0x47, 0x16, 0x09, 0xa1, 0xbc, 0xec, 0x76, 0x22, 0xbf, 0x2f, 0x0a, 0x73, 0xfb, 0x32, 0xae, 0x1c, - 0xde, 0x8b, 0x4b, 0x25, 0xcc, 0x72, 0x9b, 0xce, 0xe5, 0x62, 0x6e, 0xd9, 0x73, 0xb8, 0x98, 0xdb, - 0xad, 0xe1, 0x8e, 0x53, 0x75, 0xfe, 0x79, 0x7d, 0x53, 0xb5, 0xde, 0xdd, 0x54, 0xad, 0x0f, 0x37, - 0x55, 0xeb, 0x49, 0x6b, 0xc8, 0xe4, 0xe5, 0xb8, 0xdf, 0xf0, 0xc2, 0xab, 0xe6, 0x90, 0xd3, 0x6b, - 0xa6, 0x47, 0x80, 0xfa, 0xcd, 0xe9, 0x6b, 0x4d, 0x23, 0x36, 0xf7, 0xa8, 0xf7, 0xf3, 0xea, 0xf7, - 0xf7, 0xa7, 0x00, 0x00, 0x00, 0xff, 0xff, 0xfa, 0x5a, 0x2e, 0x2f, 0x32, 0x08, 0x00, 0x00, + // 795 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xbc, 0x56, 0xcd, 0x6e, 0x22, 0x47, + 0x10, 0x66, 0xfc, 0x83, 0xe3, 0x82, 0x24, 0xa6, 0x15, 0x39, 0x18, 0xd9, 0x18, 0x4f, 0x9c, 0x98, + 0x28, 0x0a, 0x58, 0xe4, 0x05, 0x02, 0xd8, 0x12, 0x4e, 0xe2, 0xc8, 0x1a, 0x3b, 0x87, 0xe4, 0x32, + 0x6a, 0x86, 0x12, 0xee, 0x30, 0x9e, 0x99, 0x74, 0x37, 0x96, 0xc8, 0xa3, 0xe4, 0x92, 0x27, 0xd8, + 0xdb, 0x3e, 0xc4, 0x1e, 0x56, 0xab, 0x7d, 0x84, 0x95, 0xdf, 0x61, 0xef, 0xab, 0xe9, 0xee, 0x81, + 0x61, 0x00, 0x7b, 0x57, 0x5a, 0xed, 0x85, 0x51, 0x57, 0x55, 0x57, 0xd5, 0xf7, 0xd5, 0x4f, 0x03, + 0x0d, 0x89, 0x3e, 0x46, 0x21, 0x97, 0x4d, 0x1f, 0x87, 0xd4, 0x9b, 0x34, 0x3d, 0x9f, 0x61, 0x20, + 0x9b, 0x11, 0x0f, 0x65, 0xd8, 0xfc, 0x3b, 0x64, 0x81, 0x40, 0x7e, 0xcf, 0x3c, 0x6c, 0x28, 0x09, + 0xd9, 0x54, 0x9f, 0x4a, 0xfd, 0xd1, 0x6b, 0x1e, 0x72, 0x29, 0xf4, 0x85, 0xca, 0x51, 0xd6, 0x52, + 0x4e, 0x22, 0x14, 0xfa, 0x57, 0x9b, 0xd8, 0xcf, 0x2d, 0x38, 0x70, 0x70, 0xc8, 0x84, 0x44, 0xfe, + 0x87, 0x60, 0xc1, 0xf0, 0xa2, 0x7d, 0x79, 0x89, 0xf2, 0x36, 0x1c, 0x38, 0xf8, 0xcf, 0x18, 0x85, + 0x24, 0x14, 0xf6, 0xb9, 0x31, 0x70, 0xc7, 0xb1, 0x85, 0x2b, 0xc3, 0x11, 0x06, 0x2e, 0xd7, 0xfa, + 0xb2, 0x55, 0xb3, 0xea, 0x85, 0x56, 0xad, 0xa1, 0xbd, 0xce, 0xf9, 0xba, 0x89, 0x0d, 0x8d, 0x1f, + 0x67, 0x8f, 0xaf, 0x52, 0x91, 0x53, 0xf8, 0x4a, 0x48, 0xe1, 0xb2, 0x01, 0x06, 0x92, 0xc9, 0xc9, + 0xd4, 0xf5, 0x5a, 0xcd, 0xaa, 0x17, 0x1d, 0x22, 0xa4, 0xb8, 0x30, 0x2a, 0x73, 0xc3, 0xee, 0x43, + 0x75, 0x55, 0xd6, 0x22, 0x0a, 0x03, 0x81, 0x64, 0x1f, 0xb6, 0xbd, 0x5b, 0xea, 0xfb, 0x18, 0x0c, + 0x51, 0xe5, 0xb8, 0xed, 0xcc, 0x04, 0xc4, 0x86, 0x4d, 0x45, 0x94, 0x0a, 0x51, 0x68, 0x15, 0x35, + 0x1b, 0x8d, 0x6e, 0x2c, 0x73, 0xb4, 0xca, 0x7e, 0x69, 0xc1, 0xe1, 0x5c, 0x90, 0xf6, 0xbf, 0x63, + 0x8e, 0x9f, 0x9c, 0x9c, 0x6f, 0xe0, 0x73, 0x2a, 0x25, 0x0a, 0x89, 0x03, 0x77, 0x40, 0x25, 0x35, + 0xac, 0x14, 0x13, 0xe1, 0x19, 0x95, 0x94, 0x1c, 0x41, 0x91, 0x7a, 0x1e, 0x0a, 0xa1, 0xe3, 0x97, + 0xd7, 0x15, 0xe0, 0x82, 0x96, 0x29, 0x77, 0xf6, 0x00, 0x6a, 0xab, 0xd1, 0x7c, 0x34, 0xd2, 0xce, + 0xe1, 0x64, 0x1e, 0xe5, 0x95, 0x29, 0x4c, 0x37, 0x71, 0x33, 0x0d, 0x56, 0x81, 0xcf, 0x44, 0xe8, + 0x8f, 0x25, 0x0b, 0x03, 0x15, 0xab, 0xe8, 0x4c, 0xcf, 0xf6, 0x5b, 0x0b, 0x8e, 0x97, 0xfb, 0xb9, + 0x08, 0x98, 0x64, 0xd4, 0x4f, 0xd8, 0xe9, 0x42, 0x31, 0x1e, 0x94, 0x0f, 0x26, 0xbc, 0x10, 0xdf, + 0x4a, 0x9c, 0xec, 0xc1, 0x16, 0x8e, 0xdc, 0x18, 0x80, 0x26, 0xb7, 0x97, 0x73, 0xf2, 0x38, 0x8a, + 0x71, 0x91, 0xaf, 0x21, 0x8f, 0x23, 0x77, 0x84, 0x13, 0x45, 0x69, 0xac, 0xd9, 0xc4, 0xd1, 0xaf, + 0x38, 0x21, 0xbf, 0x03, 0xd1, 0x15, 0xa0, 0x71, 0xc2, 0x6e, 0x44, 0x39, 0xbd, 0x13, 0xe5, 0x0d, + 0x15, 0xfe, 0xd0, 0x30, 0x73, 0x73, 0x75, 0xd9, 0x9e, 0xd9, 0x5c, 0xc5, 0x26, 0x28, 0x91, 0x0b, + 0xa7, 0x44, 0x33, 0x62, 0xd1, 0xd9, 0x80, 0x35, 0x1c, 0xd9, 0xaf, 0xb2, 0xe3, 0x38, 0xc5, 0x9d, + 0xe4, 0xda, 0x86, 0x0d, 0x16, 0xb0, 0x04, 0xe8, 0x0f, 0x26, 0xd2, 0xfb, 0x70, 0xd5, 0xcb, 0x39, + 0xea, 0x2a, 0x71, 0x81, 0x4c, 0x8b, 0xea, 0x72, 0x53, 0x0e, 0x53, 0xd4, 0xc6, 0xa3, 0x0e, 0x17, + 0x8a, 0xd8, 0xcb, 0x39, 0x25, 0x2f, 0x2b, 0xec, 0x6c, 0xc3, 0x56, 0x44, 0x27, 0x7e, 0x48, 0x07, + 0xf6, 0xff, 0x56, 0x66, 0x52, 0x53, 0x80, 0x4c, 0x1f, 0xfc, 0x06, 0xa5, 0x74, 0x3a, 0xe9, 0x3a, + 0x1e, 0xcc, 0x88, 0x3c, 0x0f, 0x3c, 0x3e, 0x89, 0x24, 0x0e, 0xba, 0x1c, 0xd5, 0x32, 0xa0, 0x7e, + 0x2f, 0xe7, 0xec, 0xa4, 0x82, 0x6b, 0x7e, 0x8e, 0x1f, 0x69, 0xd2, 0xb8, 0x7a, 0x4a, 0x99, 0xce, + 0xf0, 0x99, 0x05, 0xe5, 0x55, 0x85, 0x22, 0xbb, 0x90, 0x8f, 0xc6, 0x7d, 0x9f, 0x79, 0xa6, 0x43, + 0xcd, 0x89, 0x1c, 0x42, 0xc1, 0xe3, 0x48, 0x25, 0xa6, 0x47, 0x12, 0xb4, 0x48, 0x0d, 0xe4, 0x8f, + 0x40, 0x8c, 0x41, 0xaa, 0xd4, 0xba, 0x87, 0x9c, 0x92, 0xd6, 0xa4, 0x22, 0x92, 0xef, 0x61, 0xc7, + 0x98, 0x0b, 0x36, 0x0c, 0xa8, 0x1c, 0x73, 0x54, 0xbd, 0x54, 0x74, 0xbe, 0xd4, 0xf2, 0xeb, 0x44, + 0x6c, 0xff, 0x09, 0xbb, 0xcb, 0xe9, 0x20, 0x27, 0x10, 0x1b, 0x9b, 0x93, 0xdb, 0xf7, 0xc3, 0xbe, + 0xc9, 0xfa, 0x8b, 0x99, 0xb8, 0xe3, 0x87, 0xfd, 0x18, 0x95, 0x40, 0x8f, 0x63, 0xb2, 0x61, 0xcd, + 0xa9, 0xf5, 0xdf, 0x3a, 0x14, 0x7e, 0x09, 0x59, 0x70, 0xad, 0x9f, 0x1d, 0xc2, 0x60, 0x77, 0xf9, + 0x96, 0x25, 0xc7, 0xcb, 0xda, 0x24, 0xfb, 0x74, 0x54, 0xbe, 0x7d, 0xc2, 0x4a, 0x37, 0x40, 0xdd, + 0x3a, 0xb5, 0x48, 0x08, 0xe5, 0x55, 0xdb, 0x89, 0x7c, 0xb7, 0xcc, 0xcd, 0xe2, 0x32, 0xae, 0x9c, + 0x3c, 0x69, 0x97, 0x0a, 0x98, 0xc5, 0x36, 0xed, 0xcb, 0xe5, 0xd8, 0xb2, 0x73, 0xb8, 0x1c, 0xdb, + 0x42, 0x73, 0xab, 0x50, 0x67, 0x40, 0x16, 0x17, 0x11, 0x79, 0x72, 0x47, 0x55, 0xe6, 0x7a, 0xb7, + 0xf3, 0xf3, 0x8b, 0x87, 0xaa, 0xf5, 0xfa, 0xa1, 0x6a, 0xbd, 0x79, 0xa8, 0x5a, 0x7f, 0xb5, 0x86, + 0x4c, 0xde, 0x8e, 0xfb, 0x0d, 0x2f, 0xbc, 0x6b, 0x0e, 0x39, 0xbd, 0x67, 0xba, 0x91, 0xa8, 0xdf, + 0x9c, 0xbe, 0xf9, 0x34, 0x62, 0x73, 0x7f, 0x0d, 0xfa, 0x79, 0xf5, 0xf9, 0xe9, 0x5d, 0x00, 0x00, + 0x00, 0xff, 0xff, 0xb7, 0xb8, 0x98, 0xf9, 0x78, 0x08, 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -867,6 +868,9 @@ type JoinServiceClient interface { // RegisterUsingTPMMethod allows registration of a new agent or Bot to the // cluster using a known TPM. RegisterUsingTPMMethod(ctx context.Context, opts ...grpc.CallOption) (JoinService_RegisterUsingTPMMethodClient, error) + // RegisterUsingToken is used to register a new node to the cluster using one + // of the legacy join methods which do not yet have their own gRPC method. + RegisterUsingToken(ctx context.Context, in *types.RegisterUsingTokenRequest, opts ...grpc.CallOption) (*Certs, error) } type joinServiceClient struct { @@ -970,6 +974,15 @@ func (x *joinServiceRegisterUsingTPMMethodClient) Recv() (*RegisterUsingTPMMetho return m, nil } +func (c *joinServiceClient) RegisterUsingToken(ctx context.Context, in *types.RegisterUsingTokenRequest, opts ...grpc.CallOption) (*Certs, error) { + out := new(Certs) + err := c.cc.Invoke(ctx, "/proto.JoinService/RegisterUsingToken", in, out, opts...) + if err != nil { + return nil, err + } + return out, nil +} + // JoinServiceServer is the server API for JoinService service. type JoinServiceServer interface { // RegisterUsingIAMMethod is used to register a new node to the cluster using @@ -981,6 +994,9 @@ type JoinServiceServer interface { // RegisterUsingTPMMethod allows registration of a new agent or Bot to the // cluster using a known TPM. RegisterUsingTPMMethod(JoinService_RegisterUsingTPMMethodServer) error + // RegisterUsingToken is used to register a new node to the cluster using one + // of the legacy join methods which do not yet have their own gRPC method. + RegisterUsingToken(context.Context, *types.RegisterUsingTokenRequest) (*Certs, error) } // UnimplementedJoinServiceServer can be embedded to have forward compatible implementations. @@ -996,6 +1012,9 @@ func (*UnimplementedJoinServiceServer) RegisterUsingAzureMethod(srv JoinService_ func (*UnimplementedJoinServiceServer) RegisterUsingTPMMethod(srv JoinService_RegisterUsingTPMMethodServer) error { return status.Errorf(codes.Unimplemented, "method RegisterUsingTPMMethod not implemented") } +func (*UnimplementedJoinServiceServer) RegisterUsingToken(ctx context.Context, req *types.RegisterUsingTokenRequest) (*Certs, error) { + return nil, status.Errorf(codes.Unimplemented, "method RegisterUsingToken not implemented") +} func RegisterJoinServiceServer(s *grpc.Server, srv JoinServiceServer) { s.RegisterService(&_JoinService_serviceDesc, srv) @@ -1079,10 +1098,33 @@ func (x *joinServiceRegisterUsingTPMMethodServer) Recv() (*RegisterUsingTPMMetho return m, nil } +func _JoinService_RegisterUsingToken_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { + in := new(types.RegisterUsingTokenRequest) + if err := dec(in); err != nil { + return nil, err + } + if interceptor == nil { + return srv.(JoinServiceServer).RegisterUsingToken(ctx, in) + } + info := &grpc.UnaryServerInfo{ + Server: srv, + FullMethod: "/proto.JoinService/RegisterUsingToken", + } + handler := func(ctx context.Context, req interface{}) (interface{}, error) { + return srv.(JoinServiceServer).RegisterUsingToken(ctx, req.(*types.RegisterUsingTokenRequest)) + } + return interceptor(ctx, in, info, handler) +} + var _JoinService_serviceDesc = grpc.ServiceDesc{ ServiceName: "proto.JoinService", HandlerType: (*JoinServiceServer)(nil), - Methods: []grpc.MethodDesc{}, + Methods: []grpc.MethodDesc{ + { + MethodName: "RegisterUsingToken", + Handler: _JoinService_RegisterUsingToken_Handler, + }, + }, Streams: []grpc.StreamDesc{ { StreamName: "RegisterUsingIAMMethod", diff --git a/api/proto/teleport/legacy/client/proto/joinservice.proto b/api/proto/teleport/legacy/client/proto/joinservice.proto index 2f173401fdd20..4448558693d58 100644 --- a/api/proto/teleport/legacy/client/proto/joinservice.proto +++ b/api/proto/teleport/legacy/client/proto/joinservice.proto @@ -173,4 +173,7 @@ service JoinService { // RegisterUsingTPMMethod allows registration of a new agent or Bot to the // cluster using a known TPM. rpc RegisterUsingTPMMethod(stream RegisterUsingTPMMethodRequest) returns (stream RegisterUsingTPMMethodResponse); + // RegisterUsingToken is used to register a new node to the cluster using one + // of the legacy join methods which do not yet have their own gRPC method. + rpc RegisterUsingToken(types.RegisterUsingTokenRequest) returns (Certs); } diff --git a/lib/auth/apiserver.go b/lib/auth/apiserver.go index 2e3deefb77ba1..6c05b49041d87 100644 --- a/lib/auth/apiserver.go +++ b/lib/auth/apiserver.go @@ -141,6 +141,7 @@ func NewAPIServer(config *APIConfig) (http.Handler, error) { srv.POST("/:version/trustedclusters/validate", srv.WithAuth(srv.validateTrustedCluster)) // Tokens + // TODO(strideynet): REMOVE IN 18.0.0 - this method is now gRPC srv.POST("/:version/tokens/register", srv.WithAuth(srv.registerUsingToken)) // Namespaces @@ -489,6 +490,7 @@ func rawMessage(data []byte, err error) (interface{}, error) { return &m, nil } +// TODO(strideynet): REMOVE IN v18.0.0 func (s *APIServer) registerUsingToken(auth *ServerWithRoles, w http.ResponseWriter, r *http.Request, _ httprouter.Params, version string) (interface{}, error) { var req types.RegisterUsingTokenRequest if err := httplib.ReadJSON(r, &req); err != nil { diff --git a/lib/auth/auth_with_roles.go b/lib/auth/auth_with_roles.go index c3a7edc28af12..15c186f54e0c2 100644 --- a/lib/auth/auth_with_roles.go +++ b/lib/auth/auth_with_roles.go @@ -573,6 +573,11 @@ func (a *ServerWithRoles) GetClusterCACert( return a.authServer.GetClusterCACert(ctx) } +// Deprecated: This method only exists to service the RegisterUsingToken HTTP +// RPC, which has been replaced by an RPC on the JoinServiceServer. +// JoinServiceServer directly invokes auth.Server and performs its own checks +// on metadata. +// TODO(strideynet): DELETE IN V18.0.0 func (a *ServerWithRoles) RegisterUsingToken(ctx context.Context, req *types.RegisterUsingTokenRequest) (*proto.Certs, error) { isProxy := a.hasBuiltinRole(types.RoleProxy) @@ -615,48 +620,6 @@ func (a *ServerWithRoles) RegisterUsingToken(ctx context.Context, req *types.Reg return a.authServer.RegisterUsingToken(ctx, req) } -// RegisterUsingIAMMethod registers the caller using the IAM join method and -// returns signed certs to join the cluster. -// -// See (*Server).RegisterUsingIAMMethod for further documentation. -// -// This wrapper does not do any extra authz checks, as the register method has -// its own authz mechanism. -func (a *ServerWithRoles) RegisterUsingIAMMethod(ctx context.Context, challengeResponse client.RegisterIAMChallengeResponseFunc) (*proto.Certs, error) { - certs, err := a.authServer.RegisterUsingIAMMethod(ctx, challengeResponse) - return certs, trace.Wrap(err) -} - -// RegisterUsingAzureMethod registers the caller using the Azure join method and -// returns signed certs to join the cluster. -// -// See (*Server).RegisterUsingAzureMethod for further documentation. -// -// This wrapper does not do any extra authz checks, as the register method has -// its own authz mechanism. -func (a *ServerWithRoles) RegisterUsingAzureMethod(ctx context.Context, challengeResponse client.RegisterAzureChallengeResponseFunc) (*proto.Certs, error) { - certs, err := a.authServer.RegisterUsingAzureMethod(ctx, challengeResponse) - return certs, trace.Wrap(err) -} - -// RegisterUsingTPMMethod registers the caller using the TPM join method and -// returns signed certs to join the cluster. -// -// See (*Server).RegisterUsingTPMMethod for further documentation. -// -// This wrapper does not do any extra authz checks, as the register method has -// its own authz mechanism. -func (a *ServerWithRoles) RegisterUsingTPMMethod( - ctx context.Context, - initReq *proto.RegisterUsingTPMMethodInitialRequest, - solveChallenge client.RegisterTPMChallengeResponseFunc, -) (*proto.Certs, error) { - certs, err := a.authServer.registerUsingTPMMethod( - ctx, initReq, solveChallenge, - ) - return certs, trace.Wrap(err) -} - // GenerateHostCerts generates new host certificates (signed // by the host certificate authority) for a node. func (a *ServerWithRoles) GenerateHostCerts(ctx context.Context, req *proto.HostCertsRequest) (*proto.Certs, error) { diff --git a/lib/auth/authclient/http_client.go b/lib/auth/authclient/http_client.go index f2a9f696fc36f..5845c6f20227f 100644 --- a/lib/auth/authclient/http_client.go +++ b/lib/auth/authclient/http_client.go @@ -33,7 +33,6 @@ import ( "github.com/gravitational/teleport" "github.com/gravitational/teleport/api/breaker" "github.com/gravitational/teleport/api/client" - "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/constants" apidefaults "github.com/gravitational/teleport/api/defaults" tracehttp "github.com/gravitational/teleport/api/observability/tracing/http" @@ -336,25 +335,6 @@ func (c *HTTPClient) ProcessKubeCSR(req KubeCSR) (*KubeCSRResponse, error) { return &re, nil } -// RegisterUsingToken calls the auth service API to register a new node using a registration token -// which was previously issued via CreateToken/UpsertToken. -func (c *HTTPClient) RegisterUsingToken(ctx context.Context, req *types.RegisterUsingTokenRequest) (*proto.Certs, error) { - if err := req.CheckAndSetDefaults(); err != nil { - return nil, trace.Wrap(err) - } - out, err := c.PostJSON(ctx, c.Endpoint("tokens", "register"), req) - if err != nil { - return nil, trace.Wrap(err) - } - - var certs proto.Certs - if err := json.Unmarshal(out.Bytes(), &certs); err != nil { - return nil, trace.Wrap(err) - } - - return &certs, nil -} - type upsertTunnelConnectionRawReq struct { TunnelConnection json.RawMessage `json:"tunnel_connection"` } diff --git a/lib/auth/authclient/httpfallback.go b/lib/auth/authclient/httpfallback.go index 58d665e12ba11..6117a003871bc 100644 --- a/lib/auth/authclient/httpfallback.go +++ b/lib/auth/authclient/httpfallback.go @@ -26,6 +26,7 @@ import ( "github.com/gravitational/trace" + "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/services" ) @@ -126,3 +127,41 @@ func (c *Client) deleteReverseTunnelLegacy(ctx context.Context, domainName strin _, err := c.Delete(ctx, c.Endpoint("reversetunnels", domainName)) return trace.Wrap(err) } + +// RegisterUsingToken calls the auth service API to register a new node using a +// registration token which was previously issued via CreateToken/UpsertToken. +func (c *Client) RegisterUsingToken( + ctx context.Context, req *types.RegisterUsingTokenRequest, +) (*proto.Certs, error) { + if err := req.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + certs, err := c.APIClient.RegisterUsingToken(ctx, req) + if err == nil { + return certs, nil + } + if !trace.IsNotImplemented(err) { + return nil, trace.Wrap(err) + } + + return c.registerUsingTokenLegacy(ctx, req) +} + +func (c *HTTPClient) registerUsingTokenLegacy( + ctx context.Context, req *types.RegisterUsingTokenRequest, +) (*proto.Certs, error) { + if err := req.CheckAndSetDefaults(); err != nil { + return nil, trace.Wrap(err) + } + out, err := c.PostJSON(ctx, c.Endpoint("tokens", "register"), req) + if err != nil { + return nil, trace.Wrap(err) + } + + var certs proto.Certs + if err := json.Unmarshal(out.Bytes(), &certs); err != nil { + return nil, trace.Wrap(err) + } + + return &certs, nil +} diff --git a/lib/auth/bot_test.go b/lib/auth/bot_test.go index 5ec0af8421dc1..a9f5a0d2e2cee 100644 --- a/lib/auth/bot_test.go +++ b/lib/auth/bot_test.go @@ -353,6 +353,7 @@ func TestRegisterBotInstance(t *testing.T) { }, cmpopts.IgnoreFields(events.Metadata{}, "Time"), cmpopts.IgnoreFields(events.Identity{}, "Logins", "Expires"), + cmpopts.IgnoreFields(events.ClientMetadata{}, "UserAgent"), cmpopts.EquateEmpty(), ), ) @@ -599,7 +600,7 @@ func TestRegisterBot_RemoteAddr(t *testing.T) { pkey, err := x509.ParsePKCS1PrivateKey(block.Bytes) require.NoError(t, err) - certs, err := a.RegisterUsingAzureMethod(context.Background(), func(challenge string) (*proto.RegisterUsingAzureMethodRequest, error) { + certs, err := a.RegisterUsingAzureMethodWithOpts(context.Background(), func(challenge string) (*proto.RegisterUsingAzureMethodRequest, error) { ad := attestedData{ Nonce: challenge, SubscriptionID: subID, diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index abab08063efab..e0e39b17de0d1 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -5164,12 +5164,7 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { } trustv1pb.RegisterTrustServiceServer(server, trust) - // create server with no-op role to pass to JoinService server - serverWithNopRole, err := serverWithNopRole(cfg) - if err != nil { - return nil, trace.Wrap(err) - } - joinServiceServer := joinserver.NewJoinServiceGRPCServer(serverWithNopRole) + joinServiceServer := joinserver.NewJoinServiceGRPCServer(cfg.AuthServer) authpb.RegisterJoinServiceServer(server, joinServiceServer) integrationServiceServer, err := integrationv1.NewService(&integrationv1.ServiceConfig{ @@ -5356,31 +5351,6 @@ func NewGRPCServer(cfg GRPCServerConfig) (*GRPCServer, error) { return authServer, nil } -func serverWithNopRole(cfg GRPCServerConfig) (*ServerWithRoles, error) { - clusterName, err := cfg.AuthServer.GetClusterName() - if err != nil { - return nil, trace.Wrap(err) - } - nopRole := authz.BuiltinRole{ - Role: types.RoleNop, - Username: string(types.RoleNop), - ClusterName: clusterName.GetClusterName(), - } - recConfig, err := cfg.AuthServer.GetSessionRecordingConfig(context.Background()) - if err != nil { - return nil, trace.Wrap(err) - } - nopCtx, err := authz.ContextForBuiltinRole(nopRole, recConfig) - if err != nil { - return nil, trace.Wrap(err) - } - return &ServerWithRoles{ - authServer: cfg.AuthServer, - context: *nopCtx, - alog: cfg.AuthServer, - }, nil -} - type grpcContext struct { *authz.Context *ServerWithRoles diff --git a/lib/auth/join/join.go b/lib/auth/join/join.go index 038a8a693283f..386a6aa3a5c9d 100644 --- a/lib/auth/join/join.go +++ b/lib/auth/join/join.go @@ -98,7 +98,8 @@ type RegisterParams struct { // CAPath is the path to the CA file. // Ignored if AuthClient is provided. CAPath string - // GetHostCredentials is a client that can fetch host credentials. + // GetHostCredentials is a client that can be used to register via the + // proxy web API. // Ignored if AuthClient is provided. GetHostCredentials HostCredentials // Clock specifies the time provider. Will be used to override the time anchor @@ -382,8 +383,8 @@ func registerThroughProxy( return nil, trace.Wrap(err) } default: - // The rest of the join methods use GetHostCredentials function passed through - // params to call proxy HTTP endpoint + // The rest of the join methods use GetHostCredentials function passed + // through params to call proxy HTTP endpoint. var err error certs, err = params.GetHostCredentials(ctx, proxyAddr, @@ -393,6 +394,7 @@ func registerThroughProxy( return nil, trace.Wrap(err) } } + return &RegisterResult{ Certs: certs, PrivateKey: hostKeys.privateKey, diff --git a/lib/auth/join_azure.go b/lib/auth/join_azure.go index e044d4e810a69..9cee8259dd4c2 100644 --- a/lib/auth/join_azure.go +++ b/lib/auth/join_azure.go @@ -351,13 +351,13 @@ func generateAzureChallenge() (string, error) { return challenge, trace.Wrap(err) } -// RegisterUsingAzureMethod registers the caller using the Azure join method +// RegisterUsingAzureMethodWithOpts registers the caller using the Azure join method // and returns signed certs to join the cluster. // // The caller must provide a ChallengeResponseFunc which returns a // *proto.RegisterUsingAzureMethodRequest with a signed attested data document // including the challenge as a nonce. -func (a *Server) RegisterUsingAzureMethod( +func (a *Server) RegisterUsingAzureMethodWithOpts( ctx context.Context, challengeResponse client.RegisterAzureChallengeResponseFunc, opts ...azureRegisterOption, @@ -422,6 +422,19 @@ func (a *Server) RegisterUsingAzureMethod( return certs, trace.Wrap(err) } +// RegisterUsingAzureMethod registers the caller using the Azure join method +// and returns signed certs to join the cluster. +// +// The caller must provide a ChallengeResponseFunc which returns a +// *proto.RegisterUsingAzureMethodRequest with a signed attested data document +// including the challenge as a nonce. +func (a *Server) RegisterUsingAzureMethod( + ctx context.Context, + challengeResponse client.RegisterAzureChallengeResponseFunc, +) (certs *proto.Certs, err error) { + return a.RegisterUsingAzureMethodWithOpts(ctx, challengeResponse) +} + // fixAzureSigningAlgorithm fixes a mismatch between the object IDs of the // hashing algorithm sent by Azure vs the ones expected by the pkcs7 library. // Specifically, Azure (incorrectly?) sends a [digest encryption algorithm] diff --git a/lib/auth/join_azure_test.go b/lib/auth/join_azure_test.go index 5fe5d487fcf3a..1e8af282de7ef 100644 --- a/lib/auth/join_azure_test.go +++ b/lib/auth/join_azure_test.go @@ -419,7 +419,7 @@ func TestAuth_RegisterUsingAzureMethod(t *testing.T) { vmClient := &mockAzureVMClient{vm: vmResult} - _, err = a.RegisterUsingAzureMethod(context.Background(), func(challenge string) (*proto.RegisterUsingAzureMethodRequest, error) { + _, err = a.RegisterUsingAzureMethodWithOpts(context.Background(), func(challenge string) (*proto.RegisterUsingAzureMethodRequest, error) { cfg := &azureChallengeResponseConfig{Challenge: challenge} for _, opt := range tc.challengeResponseOptions { opt(cfg) diff --git a/lib/auth/join_iam.go b/lib/auth/join_iam.go index a43fbe70fd920..ba2209105c7c0 100644 --- a/lib/auth/join_iam.go +++ b/lib/auth/join_iam.go @@ -328,13 +328,13 @@ func withFips(fips bool) iamRegisterOption { } } -// RegisterUsingIAMMethod registers the caller using the IAM join method and +// RegisterUsingIAMMethodWithOpts registers the caller using the IAM join method and // returns signed certs to join the cluster. // // The caller must provide a ChallengeResponseFunc which returns a // *types.RegisterUsingTokenRequest with a signed sts:GetCallerIdentity request // including the challenge as a signed header. -func (a *Server) RegisterUsingIAMMethod( +func (a *Server) RegisterUsingIAMMethodWithOpts( ctx context.Context, challengeResponse client.RegisterIAMChallengeResponseFunc, opts ...iamRegisterOption, @@ -388,3 +388,16 @@ func (a *Server) RegisterUsingIAMMethod( certs, err = a.generateCerts(ctx, provisionToken, req.RegisterUsingTokenRequest, nil) return certs, trace.Wrap(err, "generating certs") } + +// RegisterUsingIAMMethod registers the caller using the IAM join method and +// returns signed certs to join the cluster. +// +// The caller must provide a ChallengeResponseFunc which returns a +// *types.RegisterUsingTokenRequest with a signed sts:GetCallerIdentity request +// including the challenge as a signed header. +func (a *Server) RegisterUsingIAMMethod( + ctx context.Context, + challengeResponse client.RegisterIAMChallengeResponseFunc, +) (certs *proto.Certs, err error) { + return a.RegisterUsingIAMMethodWithOpts(ctx, challengeResponse) +} diff --git a/lib/auth/join_iam_test.go b/lib/auth/join_iam_test.go index 5ba3d6ae76c27..a64399d6e7136 100644 --- a/lib/auth/join_iam_test.go +++ b/lib/auth/join_iam_test.go @@ -620,7 +620,7 @@ func TestAuth_RegisterUsingIAMMethod(t *testing.T) { require.NoError(t, a.DeleteToken(ctx, token.GetName())) }() - _, err = a.RegisterUsingIAMMethod(context.Background(), func(challenge string) (*proto.RegisterUsingIAMMethodRequest, error) { + _, err = a.RegisterUsingIAMMethodWithOpts(context.Background(), func(challenge string) (*proto.RegisterUsingIAMMethodRequest, error) { templateInput := defaultIdentityRequestTemplateInput(challenge) for _, opt := range tc.challengeResponseOptions { opt(&templateInput) diff --git a/lib/auth/join_tpm.go b/lib/auth/join_tpm.go index 4304628b9d07c..05bf9e3c35a54 100644 --- a/lib/auth/join_tpm.go +++ b/lib/auth/join_tpm.go @@ -33,7 +33,7 @@ import ( "github.com/gravitational/teleport/lib/tpm" ) -func (a *Server) registerUsingTPMMethod( +func (a *Server) RegisterUsingTPMMethod( ctx context.Context, initReq *proto.RegisterUsingTPMMethodInitialRequest, solveChallenge client.RegisterTPMChallengeResponseFunc, diff --git a/lib/auth/join_tpm_test.go b/lib/auth/join_tpm_test.go index 8210a2f975185..edfe2b4481152 100644 --- a/lib/auth/join_tpm_test.go +++ b/lib/auth/join_tpm_test.go @@ -340,7 +340,7 @@ func TestServer_RegisterUsingTPMMethod(t *testing.T) { require.NoError(t, auth.CreateToken(ctx, token)) tt.initReq.JoinRequest.Token = tt.name - _, err = auth.registerUsingTPMMethod( + _, err = auth.RegisterUsingTPMMethod( ctx, tt.initReq, solver(t)) diff --git a/lib/joinserver/joinserver.go b/lib/joinserver/joinserver.go index 735dae1e6ab08..20933b02a4f99 100644 --- a/lib/joinserver/joinserver.go +++ b/lib/joinserver/joinserver.go @@ -53,6 +53,10 @@ type joinServiceClient interface { initReq *proto.RegisterUsingTPMMethodInitialRequest, solveChallenge client.RegisterTPMChallengeResponseFunc, ) (*proto.Certs, error) + RegisterUsingToken( + ctx context.Context, + req *types.RegisterUsingTokenRequest, + ) (*proto.Certs, error) } // JoinServiceGRPCServer implements proto.JoinServiceServer and is designed @@ -210,6 +214,10 @@ func setClientRemoteAddr(ctx context.Context, req *types.RegisterUsingTokenReque func setBotParameters(ctx context.Context, req *types.RegisterUsingTokenRequest) { user, err := authz.UserFromContext(ctx) if err != nil { + // No authenticated user, we don't want to trust the values provided in + // the request unless it's coming from a proxy. + req.BotInstanceID = "" + req.BotGeneration = 0 return } @@ -376,3 +384,19 @@ func (s *JoinServiceGRPCServer) registerUsingTPMMethod( }, })) } + +// RegisterUsingToken allows nodes and proxies to join the cluster using +// legacy join methods which do not yet have their own RPC. +// On the Auth server, this method will call the auth.Server's +// RegisterUsingToken method. When running on the Proxy, this method will +// forward the request to the Auth server's JoinServiceServer. +func (s *JoinServiceGRPCServer) RegisterUsingToken( + ctx context.Context, req *types.RegisterUsingTokenRequest, +) (*proto.Certs, error) { + if err := setClientRemoteAddr(ctx, req); err != nil { + return nil, trace.Wrap(err, "setting client address") + } + setBotParameters(ctx, req) + + return s.joinServiceClient.RegisterUsingToken(ctx, req) +} diff --git a/lib/joinserver/joinserver_test.go b/lib/joinserver/joinserver_test.go index bf3226b24d326..68c68757391ef 100644 --- a/lib/joinserver/joinserver_test.go +++ b/lib/joinserver/joinserver_test.go @@ -49,6 +49,7 @@ type mockJoinServiceClient struct { gotAzureChallengeResponse *proto.RegisterUsingAzureMethodRequest gotTPMChallengeResponse *proto.RegisterUsingTPMMethodChallengeResponse gotTPMInitReq *proto.RegisterUsingTPMMethodInitialRequest + gotRegisterUsingTokenReq *types.RegisterUsingTokenRequest } func (c *mockJoinServiceClient) RegisterUsingIAMMethod(ctx context.Context, challengeResponse client.RegisterIAMChallengeResponseFunc) (*proto.Certs, error) { @@ -85,6 +86,14 @@ func (c *mockJoinServiceClient) RegisterUsingTPMMethod( return c.returnCerts, c.returnError } +func (c *mockJoinServiceClient) RegisterUsingToken( + ctx context.Context, + req *types.RegisterUsingTokenRequest, +) (*proto.Certs, error) { + c.gotRegisterUsingTokenReq = req + return c.returnCerts, c.returnError +} + func ConnectionCountingStreamInterceptor(count *atomic.Int32) grpc.StreamServerInterceptor { return func(srv interface{}, ss grpc.ServerStream, info *grpc.StreamServerInfo, handler grpc.StreamHandler) error { count.Add(1) @@ -323,6 +332,88 @@ func TestJoinServiceGRPCServer_RegisterUsingAzureMethod(t *testing.T) { } } +func TestJoinServiceGRPCServer_RegisterUsingToken(t *testing.T) { + t.Parallel() + testPack := newTestPack(t) + + testCases := []struct { + desc string + req *types.RegisterUsingTokenRequest + wantReq *types.RegisterUsingTokenRequest + authErr string + certs *proto.Certs + }{ + { + desc: "unauthenticated pass case", + req: &types.RegisterUsingTokenRequest{ + Token: "xyzzy", + }, + wantReq: &types.RegisterUsingTokenRequest{ + Token: "xyzzy", + RemoteAddr: "bufconn", + }, + certs: &proto.Certs{SSH: []byte("qux")}, + }, + { + desc: "unauthenticated - faked metadata ignored", + req: &types.RegisterUsingTokenRequest{ + Token: "xyzzy", + RemoteAddr: "mauahahh", + BotInstanceID: "123-456", + BotGeneration: 1337, + }, + wantReq: &types.RegisterUsingTokenRequest{ + Token: "xyzzy", + RemoteAddr: "bufconn", + }, + certs: &proto.Certs{SSH: []byte("qux")}, + }, + { + desc: "auth error", + req: &types.RegisterUsingTokenRequest{ + Token: "xyzzy", + }, + wantReq: &types.RegisterUsingTokenRequest{ + Token: "xyzzy", + RemoteAddr: "bufconn", + }, + authErr: "test auth error", + }, + } + for _, tc := range testCases { + t.Run(tc.desc, func(t *testing.T) { + testPack.mockAuthServer.returnCerts = tc.certs + if tc.authErr != "" { + testPack.mockAuthServer.returnError = errors.New(tc.authErr) + } + + for suffix, clt := range map[string]*client.JoinServiceClient{ + "_auth": testPack.authClient, + "_proxy": testPack.proxyClient, + } { + t.Run(tc.desc+suffix, func(t *testing.T) { + certs, err := clt.RegisterUsingToken( + context.Background(), + tc.req, + ) + if tc.authErr != "" { + require.ErrorContains(t, err, tc.authErr, "authErr mismatch") + return + } + if assert.NoError(t, err) { + assert.Equal(t, tc.certs, certs) + } + assert.Equal( + t, + tc.wantReq, + testPack.mockAuthServer.gotRegisterUsingTokenReq, + ) + }) + } + }) + } +} + func TestJoinServiceGRPCServer_RegisterUsingTPMMethod(t *testing.T) { t.Parallel() testPack := newTestPack(t) From 4e560fd332fed28b730138e0242270cf5794f734 Mon Sep 17 00:00:00 2001 From: Marco Dinis Date: Thu, 24 Oct 2024 11:57:08 +0100 Subject: [PATCH 49/70] Improve message when sortBy field is missing in ListUnifiedResources (#47788) --- lib/auth/auth_with_roles_test.go | 8 ++++++++ lib/services/unified_resource.go | 4 +++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/lib/auth/auth_with_roles_test.go b/lib/auth/auth_with_roles_test.go index 06fcd9e849a09..a040e444083da 100644 --- a/lib/auth/auth_with_roles_test.go +++ b/lib/auth/auth_with_roles_test.go @@ -5351,6 +5351,14 @@ func TestListUnifiedResources_KindsFilter(t *testing.T) { r := resource.GetDatabaseServer() require.Equal(t, types.KindDatabaseServer, r.GetKind()) } + + // Check for invalid sort error message + _, err = clt.ListUnifiedResources(ctx, &proto.ListUnifiedResourcesRequest{ + Kinds: []string{types.KindDatabase}, + Limit: 5, + SortBy: types.SortBy{}, + }) + require.ErrorContains(t, err, "sort field is required") } func TestListUnifiedResources_WithPinnedResources(t *testing.T) { diff --git a/lib/services/unified_resource.go b/lib/services/unified_resource.go index 27975e6fd753a..7c06471b9d3a6 100644 --- a/lib/services/unified_resource.go +++ b/lib/services/unified_resource.go @@ -194,8 +194,10 @@ func (c *UnifiedResourceCache) getSortTree(sortField string) (*btree.BTreeG[*ite return c.nameTree, nil case sortByKind: return c.typeTree, nil + case "": + return nil, trace.BadParameter("sort field is required") default: - return nil, trace.NotImplemented("sorting by %v is not supporting in unified resources", sortField) + return nil, trace.NotImplemented("sorting by %v is not supported in unified resources", sortField) } } From de0d9f432388e6229c1c16df1afc4a1f1e878c32 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Thu, 24 Oct 2024 12:22:36 +0100 Subject: [PATCH 50/70] Convert more `lib` packages to `slog`. (#47787) * Convert `lib/observability` to `slog` from `logrus` * Inject slog into `lib/observability` * Convert `lib/release` to slog * Migrate to `slog` in `lib/cgroup` * Fix missed variable * Convert `lib/auth/join` to slog * Fix missing logutils import * Ignore sloglint * Convert `lib/auditd` to Slog * Switch `lib/player` to use `slog` --- lib/auditd/auditd_linux.go | 11 ++-- lib/auth/join/join.go | 62 ++++++++++++----------- lib/cgroup/cgroup.go | 17 +++---- lib/observability/tracing/tracing.go | 8 +-- lib/observability/tracing/tracing_test.go | 5 +- lib/player/player.go | 23 +++++---- lib/release/release.go | 4 +- lib/service/service.go | 6 +-- lib/web/desktop/playback_test.go | 5 +- lib/web/desktop_playback.go | 2 +- lib/web/tty_playback.go | 2 +- 11 files changed, 75 insertions(+), 70 deletions(-) diff --git a/lib/auditd/auditd_linux.go b/lib/auditd/auditd_linux.go index b22860b992b6c..dcff0d6c37bd7 100644 --- a/lib/auditd/auditd_linux.go +++ b/lib/auditd/auditd_linux.go @@ -20,8 +20,10 @@ package auditd import ( "bytes" + "context" "encoding/binary" "errors" + "log/slog" "math" "os" "strconv" @@ -32,7 +34,6 @@ import ( "github.com/gravitational/trace" "github.com/mdlayher/netlink" "github.com/mdlayher/netlink/nlenc" - log "github.com/sirupsen/logrus" ) // featureStatus is a 3 state boolean yes/no/unknown type. @@ -92,7 +93,7 @@ func IsLoginUIDSet() bool { client := NewClient(Message{}) defer func() { if err := client.Close(); err != nil { - log.WithError(err).Warn("Failed to close auditd client.") + slog.WarnContext(context.TODO(), "Failed to close auditd client", "error", err) } }() // We don't need to acquire the internal client mutex as the connection is @@ -108,7 +109,7 @@ func IsLoginUIDSet() bool { loginuid, err := getSelfLoginUID() if err != nil { - log.WithError(err).Debug("failed to read login UID") + slog.DebugContext(context.TODO(), "Failed to read login UID", "error", err) return false } @@ -142,7 +143,7 @@ func SendEvent(event EventType, result ResultType, msg Message) error { defer func() { err := client.Close() if err != nil { - log.WithError(err).Error("failed to close auditd client") + slog.ErrorContext(context.TODO(), "Failed to close auditd client", "error", err) } }() @@ -206,7 +207,7 @@ func NewClient(msg Message) *Client { execName, err := os.Executable() if err != nil { - log.WithError(err).Warn("failed to get executable name") + slog.WarnContext(context.TODO(), "Failed to get executable name", "error", err) execName = UnknownValue } diff --git a/lib/auth/join/join.go b/lib/auth/join/join.go index 386a6aa3a5c9d..58c98cdd6448e 100644 --- a/lib/auth/join/join.go +++ b/lib/auth/join/join.go @@ -26,7 +26,6 @@ import ( "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - log "github.com/sirupsen/logrus" "go.opentelemetry.io/otel" "golang.org/x/crypto/ssh" @@ -262,13 +261,13 @@ func Register(ctx context.Context, params RegisterParams) (result *RegisterResul // If an explicit AuthClient has been provided, we want to go straight to // using that rather than trying both proxy and auth dialing. if params.AuthClient != nil { - log.Info("Attempting registration with existing auth client.") + slog.InfoContext(ctx, "Attempting registration with existing auth client.") result, err := registerThroughAuthClient(ctx, token, params, params.AuthClient) if err != nil { - log.WithError(err).Error("Registration with existing auth client failed.") + slog.ErrorContext(ctx, "Registration with existing auth client failed.", "error", err) return nil, trace.Wrap(err) } - log.Info("Successfully registered with existing auth client.") + slog.InfoContext(ctx, "Successfully registered with existing auth client.") return result, nil } @@ -283,35 +282,35 @@ func Register(ctx context.Context, params RegisterParams) (result *RegisterResul registerMethods := []registerMethod{registerThroughAuth, registerThroughProxy} if !params.ProxyServer.IsEmpty() { - log.WithField("proxy-server", params.ProxyServer).Debugf("Registering node to the cluster.") + slog.DebugContext(ctx, "Registering node to the cluster.", "proxy_server", params.ProxyServer) registerMethods = []registerMethod{registerThroughProxy} if proxyServerIsAuth(params.ProxyServer) { - log.Debugf("The specified proxy server appears to be an auth server.") + slog.DebugContext(ctx, "The specified proxy server appears to be an auth server.") } } else { - log.WithField("auth-servers", params.AuthServers).Debugf("Registering node to the cluster.") + slog.DebugContext(ctx, "Registering node to the cluster.", "auth_servers", params.AuthServers) if params.GetHostCredentials == nil { - log.Debugf("Missing client, it is not possible to register through proxy.") + slog.DebugContext(ctx, "Missing client, it is not possible to register through proxy.") registerMethods = []registerMethod{registerThroughAuth} } else if authServerIsProxy(params.AuthServers) { - log.Debugf("The first specified auth server appears to be a proxy.") + slog.DebugContext(ctx, "The first specified auth server appears to be a proxy.") registerMethods = []registerMethod{registerThroughProxy, registerThroughAuth} } } var collectedErrs []error for _, method := range registerMethods { - log.Infof("Attempting registration %s.", method.desc) + slog.InfoContext(ctx, "Attempting registration.", "method", method.desc) result, err := method.call(ctx, token, params) if err != nil { collectedErrs = append(collectedErrs, err) - log.WithError(err).Debugf("Registration %s failed.", method.desc) + slog.DebugContext(ctx, "Registration failed.", "method", method.desc, "error", err) continue } - log.Infof("Successfully registered %s.", method.desc) + slog.InfoContext(ctx, "Successfully registered.", "method", method.desc) return result, nil } return nil, trace.NewAggregate(collectedErrs...) @@ -413,19 +412,19 @@ func registerThroughAuth( // depending on the configured values for Insecure, CAPins and CAPath. switch { case params.Insecure: - log.Warnf("Insecure mode enabled. Auth Server cert will not be validated and CAPins and CAPath value will be ignored.") - client, err = insecureRegisterClient(params) + slog.WarnContext(ctx, "Insecure mode enabled. Auth Server cert will not be validated and CAPins and CAPath value will be ignored.") + client, err = insecureRegisterClient(ctx, params) case len(params.CAPins) != 0: // CAPins takes precedence over CAPath client, err = pinRegisterClient(ctx, params) case params.CAPath != "": - client, err = caPathRegisterClient(params) + client, err = caPathRegisterClient(ctx, params) default: // We fall back to insecure mode here - this is a little odd but is // necessary to preserve the behavior of registration. At a later date, // we may consider making this an error asking the user to provide // Insecure, CAPins or CAPath. - client, err = insecureRegisterClient(params) + client, err = insecureRegisterClient(ctx, params) } if err != nil { return nil, trace.Wrap(err, "building auth client") @@ -489,11 +488,12 @@ func getHostAddresses(params RegisterParams) []string { // insecureRegisterClient attempts to connects to the Auth Server using the // CA on disk. If no CA is found on disk, Teleport will not verify the Auth // Server it is connecting to. -func insecureRegisterClient(params RegisterParams) (*authclient.Client, error) { - log.Warnf("Joining cluster without validating the identity of the Auth " + - "Server. This may open you up to a Man-In-The-Middle (MITM) attack if an " + - "attacker can gain privileged network access. To remedy this, use the CA pin " + - "value provided when join token was generated to validate the identity of " + +func insecureRegisterClient(ctx context.Context, params RegisterParams) (*authclient.Client, error) { + //nolint:sloglint // Conjoined string literals trip up the linter. + slog.WarnContext(ctx, "Joining cluster without validating the identity of the Auth "+ + "Server. This may open you up to a Man-In-The-Middle (MITM) attack if an "+ + "attacker can gain privileged network access. To remedy this, use the CA pin "+ + "value provided when join token was generated to validate the identity of "+ "the Auth Server or point to a valid Certificate via the CA Path option.") tlsConfig := utils.TLSConfig(params.CipherSuites) @@ -506,6 +506,7 @@ func insecureRegisterClient(params RegisterParams) (*authclient.Client, error) { client.LoadTLS(tlsConfig), }, CircuitBreakerConfig: params.CircuitBreakerConfig, + Context: ctx, }) if err != nil { return nil, trace.Wrap(err, "creating insecure auth client") @@ -533,6 +534,7 @@ func pinRegisterClient( client.LoadTLS(tlsConfig), }, CircuitBreakerConfig: params.CircuitBreakerConfig, + Context: ctx, }) if err != nil { return nil, trace.Wrap(err) @@ -566,7 +568,7 @@ func pinRegisterClient( } } - log.Infof("Joining remote cluster %v with CA pin.", certs[0].Subject.CommonName) + slog.InfoContext(ctx, "Joining remote cluster with CA pin.", "cluster", certs[0].Subject.CommonName) // Create another client, but this time with the CA provided to validate // that the Auth Server was issued a certificate by the same CA. @@ -584,6 +586,7 @@ func pinRegisterClient( client.LoadTLS(tlsConfig), }, CircuitBreakerConfig: params.CircuitBreakerConfig, + Context: ctx, }) if err != nil { return nil, trace.Wrap(err) @@ -592,7 +595,7 @@ func pinRegisterClient( return authClient, nil } -func caPathRegisterClient(params RegisterParams) (*authclient.Client, error) { +func caPathRegisterClient(ctx context.Context, params RegisterParams) (*authclient.Client, error) { tlsConfig := utils.TLSConfig(params.CipherSuites) tlsConfig.Time = params.Clock.Now @@ -606,15 +609,15 @@ func caPathRegisterClient(params RegisterParams) (*authclient.Client, error) { // we may wish to consider changing this to return an error - but this is a // breaking change. if trace.IsNotFound(err) { - log.Warnf("Falling back to insecurely joining because a missing or empty CA Path was provided.") - return insecureRegisterClient(params) + slog.WarnContext(ctx, "Falling back to insecurely joining because a missing or empty CA Path was provided.") + return insecureRegisterClient(ctx, params) } certPool := x509.NewCertPool() certPool.AddCert(cert) tlsConfig.RootCAs = certPool - log.Infof("Joining remote cluster %v, validating connection with certificate on disk.", cert.Subject.CommonName) + slog.InfoContext(ctx, "Joining remote cluster, validating connection with certificate on disk.", "cluster", cert.Subject.CommonName) client, err := authclient.NewClient(client.Config{ Addrs: getHostAddresses(params), @@ -622,6 +625,7 @@ func caPathRegisterClient(params RegisterParams) (*authclient.Client, error) { client.LoadTLS(tlsConfig), }, CircuitBreakerConfig: params.CircuitBreakerConfig, + Context: ctx, }) if err != nil { return nil, trace.Wrap(err) @@ -661,7 +665,7 @@ func registerUsingTokenRequestForParams(token string, hostKeys *newHostKeys, par func registerUsingIAMMethod( ctx context.Context, joinServiceClient joinServiceClient, token string, hostKeys *newHostKeys, params RegisterParams, ) (*proto.Certs, error) { - log.Infof("Attempting to register %s with IAM method using regional STS endpoint", params.ID.Role) + slog.InfoContext(ctx, "Attempting to register with IAM method using region STS endpoint.", "role", params.ID.Role) // Call RegisterUsingIAMMethod and pass a callback to respond to the challenge with a signed join request. certs, err := joinServiceClient.RegisterUsingIAMMethod(ctx, func(challenge string) (*proto.RegisterUsingIAMMethodRequest, error) { // create the signed sts:GetCallerIdentity request and include the challenge @@ -679,11 +683,11 @@ func registerUsingIAMMethod( }, nil }) if err != nil { - log.WithError(err).Infof("Failed to register %s using regional STS endpoint", params.ID.Role) + slog.InfoContext(ctx, "Failed to register using regional STS endpoint", "role", params.ID.Role, "error", err) return nil, trace.Wrap(err, "registering via IAM method streaming RPC") } - log.Infof("Successfully registered %s with IAM method using regional STS endpoint", params.ID.Role) + slog.InfoContext(ctx, "Successfully registered with IAM method using regional STS endpoint.", "role", params.ID.Role) return certs, nil } diff --git a/lib/cgroup/cgroup.go b/lib/cgroup/cgroup.go index e611aa5bb563e..da7baef34c6cb 100644 --- a/lib/cgroup/cgroup.go +++ b/lib/cgroup/cgroup.go @@ -29,6 +29,7 @@ import "C" import ( "bufio" "bytes" + "context" "encoding/binary" "os" "path/filepath" @@ -38,17 +39,15 @@ import ( "github.com/google/uuid" "github.com/gravitational/trace" - "github.com/sirupsen/logrus" "golang.org/x/sys/unix" "github.com/gravitational/teleport" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/utils" + logutils "github.com/gravitational/teleport/lib/utils/log" ) -var log = logrus.WithFields(logrus.Fields{ - teleport.ComponentKey: teleport.ComponentCgroup, -}) +var logger = logutils.NewPackageLogger(teleport.ComponentKey, teleport.ComponentCgroup) // Config holds configuration for the cgroup service. type Config struct { @@ -97,7 +96,7 @@ func New(config *Config) (*Service, error) { return nil, trace.Wrap(err) } - log.Debugf("Teleport session hierarchy mounted at: %v.", s.teleportRoot) + logger.DebugContext(context.TODO(), "Teleport session hierarchy mounted.", "hierarchy_root", s.teleportRoot) return s, nil } @@ -110,7 +109,7 @@ func (s *Service) Close(skipUnmount bool) error { } if skipUnmount { - log.Debugf("Cleaned up Teleport session hierarchy at: %v.", s.teleportRoot) + logger.DebugContext(context.TODO(), "Cleaned up Teleport session hierarchy.", "hierarchy_root", s.teleportRoot) return nil } @@ -119,7 +118,7 @@ func (s *Service) Close(skipUnmount bool) error { return trace.Wrap(err) } - log.Debugf("Cleaned up and unmounted Teleport session hierarchy at: %v.", s.teleportRoot) + logger.DebugContext(context.TODO(), "Cleaned up and unmounted Teleport session hierarchy.", "hierarchy_root", s.teleportRoot) return nil } @@ -154,7 +153,7 @@ func (s *Service) Remove(sessionID string) error { return trace.Wrap(err) } - log.Debugf("Removed cgroup for session: %v.", sessionID) + logger.DebugContext(context.TODO(), "Removed cgroup for session.", "session_id", sessionID) return nil } @@ -320,7 +319,7 @@ func (s *Service) mount() error { if err != nil { return trace.Wrap(err) } - log.Debugf("Mounted cgroup filesystem to %v.", s.MountPath) + logger.DebugContext(context.TODO(), "Mounted cgroup filesystem.", "mount_path", s.MountPath) // Create cgroup that will hold Teleport sessions. err = os.MkdirAll(s.teleportRoot, fileMode) diff --git a/lib/observability/tracing/tracing.go b/lib/observability/tracing/tracing.go index 272f54d3dff19..92809fd2b1619 100644 --- a/lib/observability/tracing/tracing.go +++ b/lib/observability/tracing/tracing.go @@ -21,13 +21,13 @@ package tracing import ( "context" "crypto/tls" + "log/slog" "net" "net/url" "strings" "time" "github.com/gravitational/trace" - "github.com/sirupsen/logrus" "go.opentelemetry.io/otel" "go.opentelemetry.io/otel/attribute" "go.opentelemetry.io/otel/propagation" @@ -73,7 +73,7 @@ type Config struct { // DialTimeout is the timeout for dialing the exporter. DialTimeout time.Duration // Logger is the logger to use. - Logger logrus.FieldLogger + Logger *slog.Logger // Client is the client to use to export traces. This takes precedence over creating a // new client with the ExporterURL. Ownership of the client is transferred to the // tracing provider. It should **NOT** be closed by the caller. @@ -99,7 +99,7 @@ func (c *Config) CheckAndSetDefaults() error { } if c.Logger == nil { - c.Logger = logrus.WithField(teleport.ComponentKey, teleport.ComponentTracing) + c.Logger = slog.With(teleport.ComponentKey, teleport.ComponentTracing) } if c.Client != nil { @@ -218,7 +218,7 @@ func NewTraceProvider(ctx context.Context, cfg Config) (*Provider, error) { // override the global logging handled with one that uses the // configured logger instead otel.SetErrorHandler(otel.ErrorHandlerFunc(func(err error) { - cfg.Logger.WithError(err).Warnf("failed to export traces.") + cfg.Logger.WarnContext(ctx, "Failed to export traces", "error", err) })) // set global provider to our provider wrapper to have all tracers use the common TracerOptions diff --git a/lib/observability/tracing/tracing_test.go b/lib/observability/tracing/tracing_test.go index b754bf7715112..ce7253b380eb1 100644 --- a/lib/observability/tracing/tracing_test.go +++ b/lib/observability/tracing/tracing_test.go @@ -38,7 +38,6 @@ import ( "github.com/google/go-cmp/cmp" "github.com/google/go-cmp/cmp/cmpopts" "github.com/gravitational/trace" - "github.com/sirupsen/logrus" "github.com/stretchr/testify/require" ) @@ -515,8 +514,8 @@ func TestConfig_CheckAndSetDefaults(t *testing.T) { } require.Empty(t, cmp.Diff(tt.expectedCfg, tt.cfg, cmpopts.IgnoreUnexported(Config{}), - cmpopts.IgnoreInterfaces(struct{ logrus.FieldLogger }{})), - ) + cmpopts.IgnoreFields(Config{}, "Logger"), + )) require.NotNil(t, tt.cfg.Logger) }) } diff --git a/lib/player/player.go b/lib/player/player.go index fa52f790d8611..e36b980d98b4b 100644 --- a/lib/player/player.go +++ b/lib/player/player.go @@ -20,15 +20,16 @@ package player import ( + "cmp" "context" "errors" + "log/slog" "math" "sync/atomic" "time" "github.com/gravitational/trace" "github.com/jonboulle/clockwork" - "github.com/sirupsen/logrus" "golang.org/x/exp/maps" "github.com/gravitational/teleport" @@ -42,7 +43,7 @@ import ( type Player struct { // read only config fields clock clockwork.Clock - log logrus.FieldLogger + log *slog.Logger sessionID session.ID streamer Streamer skipIdleTime bool @@ -108,7 +109,7 @@ type sessionPrintTranslator interface { // Config configures a session player. type Config struct { Clock clockwork.Clock - Log logrus.FieldLogger + Log *slog.Logger SessionID session.ID Streamer Streamer SkipIdleTime bool @@ -128,10 +129,10 @@ func New(cfg *Config) (*Player, error) { clk = clockwork.NewRealClock() } - var log logrus.FieldLogger = cfg.Log - if log == nil { - log = logrus.New().WithField(teleport.ComponentKey, "player") - } + log := cmp.Or( + cfg.Log, + slog.With(teleport.ComponentKey, "player"), + ) p := &Player{ clock: clk, @@ -190,19 +191,19 @@ func (p *Player) stream() { close(p.emit) return case err := <-errC: - p.log.Warn(err) + p.log.WarnContext(ctx, "Event streamer encountered error", "error", err) p.err = err close(p.emit) return case evt := <-eventsC: if evt == nil { - p.log.Debugf("reached end of playback for session %v", p.sessionID) + p.log.DebugContext(ctx, "Reached end of playback for session", "session_id", p.sessionID) close(p.emit) return } if err := p.waitWhilePaused(); err != nil { - p.log.Warn(err) + p.log.WarnContext(ctx, "Encountered error in pause state", "error", err) close(p.emit) return } @@ -238,7 +239,7 @@ func (p *Player) stream() { switch err := p.applyDelay(lastDelay, currentDelay); { case errors.Is(err, errSeekWhilePaused): - p.log.Debug("seeked during pause, will restart stream") + p.log.DebugContext(ctx, "Seeked during pause, will restart stream") go p.stream() return case err != nil: diff --git a/lib/release/release.go b/lib/release/release.go index 0e06efb90a908..4a442daf70b95 100644 --- a/lib/release/release.go +++ b/lib/release/release.go @@ -23,12 +23,12 @@ import ( "crypto/tls" "encoding/json" "fmt" + "log/slog" "net/http" "os" "github.com/gravitational/roundtrip" "github.com/gravitational/trace" - log "github.com/sirupsen/logrus" "github.com/gravitational/teleport/api/types" "github.com/gravitational/teleport/lib/utils" @@ -95,7 +95,7 @@ func (c *Client) ListReleases(ctx context.Context) ([]*types.Release, error) { resp, err := c.client.Get(ctx, c.client.Endpoint(types.EnterpriseReleaseEndpoint), nil) if err != nil { - log.WithError(err).Error("failed to retrieve releases from release server") + slog.ErrorContext(ctx, "failed to retrieve releases from release server", "error", err) return nil, trace.Wrap(err) } diff --git a/lib/service/service.go b/lib/service/service.go index 0870695cef8fd..01e4fdad21224 100644 --- a/lib/service/service.go +++ b/lib/service/service.go @@ -2018,7 +2018,7 @@ func (process *TeleportProcess) initAuthService() error { if err != nil { return trace.Wrap(err) } - traceConf.Logger = process.log.WithField(teleport.ComponentKey, teleport.ComponentTracing) + traceConf.Logger = process.logger.With(teleport.ComponentKey, teleport.ComponentTracing) clt, err := tracing.NewStartedClient(process.ExitContext(), *traceConf) if err != nil { @@ -3629,7 +3629,7 @@ func (process *TeleportProcess) initTracingService() error { if err != nil { return trace.Wrap(err) } - traceConf.Logger = process.log.WithField(teleport.ComponentKey, teleport.Component(teleport.ComponentTracing, process.id)) + traceConf.Logger = process.logger.With(teleport.ComponentKey, teleport.Component(teleport.ComponentTracing, process.id)) provider, err := tracing.NewTraceProvider(process.ExitContext(), *traceConf) if err != nil { @@ -4486,7 +4486,7 @@ func (process *TeleportProcess) initProxyEndpoint(conn *Connector) error { if err != nil { return trace.Wrap(err) } - traceConf.Logger = process.log.WithField(teleport.ComponentKey, teleport.ComponentTracing) + traceConf.Logger = process.logger.With(teleport.ComponentKey, teleport.ComponentTracing) clt, err := tracing.NewStartedClient(process.ExitContext(), *traceConf) if err != nil { diff --git a/lib/web/desktop/playback_test.go b/lib/web/desktop/playback_test.go index 43225b2b18022..12c52ad7e2862 100644 --- a/lib/web/desktop/playback_test.go +++ b/lib/web/desktop/playback_test.go @@ -81,7 +81,8 @@ func newServer(t *testing.T, streamInterval time.Duration, events []apievents.Au t.Helper() fs := eventstest.NewFakeStreamer(events, streamInterval) - log := utils.NewLoggerForTests() + log := utils.NewSlogLoggerForTests() + logrusLogger := utils.NewLoggerForTests() s := httptest.NewServer(http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) { upgrader := websocket.Upgrader{ @@ -102,7 +103,7 @@ func newServer(t *testing.T, streamInterval time.Duration, events []apievents.Au }) assert.NoError(t, err) player.Play() - desktop.PlayRecording(r.Context(), log, ws, player) + desktop.PlayRecording(r.Context(), logrusLogger, ws, player) })) t.Cleanup(s.Close) diff --git a/lib/web/desktop_playback.go b/lib/web/desktop_playback.go index 9c50cdcc153c7..f4755f18fe789 100644 --- a/lib/web/desktop_playback.go +++ b/lib/web/desktop_playback.go @@ -52,7 +52,7 @@ func (h *Handler) desktopPlaybackHandle( player, err := player.New(&player.Config{ Clock: h.clock, - Log: h.log, + Log: h.logger, SessionID: session.ID(sID), Streamer: clt, }) diff --git a/lib/web/tty_playback.go b/lib/web/tty_playback.go index 232ec37e525bf..76c603c1e49ec 100644 --- a/lib/web/tty_playback.go +++ b/lib/web/tty_playback.go @@ -85,7 +85,7 @@ func (h *Handler) ttyPlaybackHandle( player, err := player.New(&player.Config{ Clock: h.clock, - Log: h.log, + Log: h.logger, SessionID: session.ID(sID), Streamer: clt, }) From fbbcb5fe39c8b54d511ba1272f938610dcb8b37a Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Thu, 24 Oct 2024 08:08:07 -0400 Subject: [PATCH 51/70] Add AutoUpdateAgentRollout service and cache (#47833) --- api/client/client.go | 53 +++++++ api/client/events.go | 8 ++ lib/auth/authclient/api.go | 6 + lib/auth/autoupdate/autoupdatev1/service.go | 136 ++++++++++++++++++ .../autoupdate/autoupdatev1/service_test.go | 87 ++++++++--- lib/authz/permissions.go | 1 + lib/cache/cache.go | 25 ++++ lib/cache/cache_test.go | 51 +++++++ lib/cache/collections.go | 45 ++++++ lib/services/autoupdates.go | 15 ++ lib/services/local/autoupdate.go | 60 +++++++- lib/services/local/events.go | 37 +++++ lib/services/resource.go | 2 + 13 files changed, 507 insertions(+), 19 deletions(-) diff --git a/api/client/client.go b/api/client/client.go index fc08ad53467c7..86cf448bcbe77 100644 --- a/api/client/client.go +++ b/api/client/client.go @@ -3018,6 +3018,59 @@ func (c *Client) DeleteAutoUpdateVersion(ctx context.Context) error { return trace.Wrap(err) } +// CreateAutoUpdateAgentRollout creates AutoUpdateAgentRollout resource. +func (c *Client) CreateAutoUpdateAgentRollout(ctx context.Context, rollout *autoupdatev1pb.AutoUpdateAgentRollout) (*autoupdatev1pb.AutoUpdateAgentRollout, error) { + client := autoupdatev1pb.NewAutoUpdateServiceClient(c.conn) + resp, err := client.CreateAutoUpdateAgentRollout(ctx, &autoupdatev1pb.CreateAutoUpdateAgentRolloutRequest{ + Rollout: rollout, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + +// GetAutoUpdateAgentRollout gets AutoUpdateAgentRollout resource. +func (c *Client) GetAutoUpdateAgentRollout(ctx context.Context) (*autoupdatev1pb.AutoUpdateAgentRollout, error) { + client := autoupdatev1pb.NewAutoUpdateServiceClient(c.conn) + resp, err := client.GetAutoUpdateAgentRollout(ctx, &autoupdatev1pb.GetAutoUpdateAgentRolloutRequest{}) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + +// UpdateAutoUpdateAgentRollout updates AutoUpdateAgentRollout resource. +func (c *Client) UpdateAutoUpdateAgentRollout(ctx context.Context, rollout *autoupdatev1pb.AutoUpdateAgentRollout) (*autoupdatev1pb.AutoUpdateAgentRollout, error) { + client := autoupdatev1pb.NewAutoUpdateServiceClient(c.conn) + resp, err := client.UpdateAutoUpdateAgentRollout(ctx, &autoupdatev1pb.UpdateAutoUpdateAgentRolloutRequest{ + Rollout: rollout, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + +// UpsertAutoUpdateAgentRollout updates or creates AutoUpdateAgentRollout resource. +func (c *Client) UpsertAutoUpdateAgentRollout(ctx context.Context, rollout *autoupdatev1pb.AutoUpdateAgentRollout) (*autoupdatev1pb.AutoUpdateAgentRollout, error) { + client := autoupdatev1pb.NewAutoUpdateServiceClient(c.conn) + resp, err := client.UpsertAutoUpdateAgentRollout(ctx, &autoupdatev1pb.UpsertAutoUpdateAgentRolloutRequest{ + Rollout: rollout, + }) + if err != nil { + return nil, trace.Wrap(err) + } + return resp, nil +} + +// DeleteAutoUpdateAgentRollout deletes AutoUpdateAgentRollout resource. +func (c *Client) DeleteAutoUpdateAgentRollout(ctx context.Context) error { + client := autoupdatev1pb.NewAutoUpdateServiceClient(c.conn) + _, err := client.DeleteAutoUpdateAgentRollout(ctx, &autoupdatev1pb.DeleteAutoUpdateAgentRolloutRequest{}) + return trace.Wrap(err) +} + // GetClusterAccessGraphConfig retrieves the Cluster Access Graph configuration from Auth server. func (c *Client) GetClusterAccessGraphConfig(ctx context.Context) (*clusterconfigpb.AccessGraphConfig, error) { rsp, err := c.ClusterConfigClient().GetClusterAccessGraphConfig(ctx, &clusterconfigpb.GetClusterAccessGraphConfigRequest{}) diff --git a/api/client/events.go b/api/client/events.go index 0cce9664d248a..89c7260e38ac6 100644 --- a/api/client/events.go +++ b/api/client/events.go @@ -118,6 +118,11 @@ func EventToGRPC(in types.Event) (*proto.Event, error) { out.Resource = &proto.Event_ProvisioningPrincipalState{ ProvisioningPrincipalState: r, } + case *autoupdate.AutoUpdateAgentRollout: + out.Resource = &proto.Event_AutoUpdateAgentRollout{ + AutoUpdateAgentRollout: r, + } + default: return nil, trace.BadParameter("resource type %T is not supported", r) } @@ -574,6 +579,9 @@ func EventFromGRPC(in *proto.Event) (*types.Event, error) { } else if r := in.GetAutoUpdateVersion(); r != nil { out.Resource = types.Resource153ToLegacy(r) return &out, nil + } else if r := in.GetAutoUpdateAgentRollout(); r != nil { + out.Resource = types.Resource153ToLegacy(r) + return &out, nil } else if r := in.GetUserTask(); r != nil { out.Resource = types.Resource153ToLegacy(r) return &out, nil diff --git a/lib/auth/authclient/api.go b/lib/auth/authclient/api.go index 57821e8995795..efc4eab13b54d 100644 --- a/lib/auth/authclient/api.go +++ b/lib/auth/authclient/api.go @@ -314,6 +314,9 @@ type ReadProxyAccessPoint interface { // GetAutoUpdateVersion gets the AutoUpdateVersion from the backend. GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) + + // GetAutoUpdateAgentRollout gets the AutoUpdateAgentRollout from the backend. + GetAutoUpdateAgentRollout(ctx context.Context) (*autoupdate.AutoUpdateAgentRollout, error) } // SnowflakeSessionWatcher is watcher interface used by Snowflake web session watcher. @@ -1212,6 +1215,9 @@ type Cache interface { // GetAutoUpdateVersion gets the AutoUpdateVersion from the backend. GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) + // GetAutoUpdateAgentRollout gets the AutoUpdateAgentRollout from the backend. + GetAutoUpdateAgentRollout(ctx context.Context) (*autoupdate.AutoUpdateAgentRollout, error) + // GetAccessGraphSettings returns the access graph settings. GetAccessGraphSettings(context.Context) (*clusterconfigpb.AccessGraphSettings, error) diff --git a/lib/auth/autoupdate/autoupdatev1/service.go b/lib/auth/autoupdate/autoupdatev1/service.go index b14edeb13d6f9..4852edaf6707a 100644 --- a/lib/auth/autoupdate/autoupdatev1/service.go +++ b/lib/auth/autoupdate/autoupdatev1/service.go @@ -37,6 +37,9 @@ type Cache interface { // GetAutoUpdateVersion gets the AutoUpdateVersion from the backend. GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) + + // GetAutoUpdateAgentRollout gets the AutoUpdateAgentRollout from the backend. + GetAutoUpdateAgentRollout(ctx context.Context) (*autoupdate.AutoUpdateAgentRollout, error) } // ServiceConfig holds configuration options for the auto update gRPC service. @@ -268,3 +271,136 @@ func (s *Service) DeleteAutoUpdateVersion(ctx context.Context, req *autoupdate.D } return &emptypb.Empty{}, nil } + +// GetAutoUpdateAgentRollout gets the current AutoUpdateAgentRollout singleton. +func (s *Service) GetAutoUpdateAgentRollout(ctx context.Context, req *autoupdate.GetAutoUpdateAgentRolloutRequest) (*autoupdate.AutoUpdateAgentRollout, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.CheckAccessToKind(types.KindAutoUpdateAgentRollout, types.VerbRead); err != nil { + return nil, trace.Wrap(err) + } + + plan, err := s.cache.GetAutoUpdateAgentRollout(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + return plan, nil +} + +// CreateAutoUpdateAgentRollout creates AutoUpdateAgentRollout singleton. +func (s *Service) CreateAutoUpdateAgentRollout(ctx context.Context, req *autoupdate.CreateAutoUpdateAgentRolloutRequest) (*autoupdate.AutoUpdateAgentRollout, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + // Editing the AU agent plan is restricted to cluster administrators. As of today we don't have any way of having + // resources that can only be edited by Teleport Cloud (when running cloud-hosted). + // The workaround is to check if the caller has the auth system role. + // This is not ideal as it forces local tctl usage. In the future, if we expand the permission system and make cloud + // a first class citizen, we'll want to update this permission check. + if !authz.HasBuiltinRole(*authCtx, string(types.RoleAuth)) { + return nil, trace.AccessDenied("this request can be only executed by an auth server") + } + + if err := authCtx.CheckAccessToKind(types.KindAutoUpdateAgentRollout, types.VerbCreate); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminActionAllowReusedMFA(); err != nil { + return nil, trace.Wrap(err) + } + + autoUpdateAgentRollout, err := s.backend.CreateAutoUpdateAgentRollout(ctx, req.Rollout) + return autoUpdateAgentRollout, trace.Wrap(err) +} + +// UpdateAutoUpdateAgentRollout updates AutoUpdateAgentRollout singleton. +func (s *Service) UpdateAutoUpdateAgentRollout(ctx context.Context, req *autoupdate.UpdateAutoUpdateAgentRolloutRequest) (*autoupdate.AutoUpdateAgentRollout, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + // Editing the AU agent plan is restricted to cluster administrators. As of today we don't have any way of having + // resources that can only be edited by Teleport Cloud (when running cloud-hosted). + // The workaround is to check if the caller has the auth system role. + // This is not ideal as it forces local tctl usage. In the future, if we expand the permission system and make cloud + // a first class citizen, we'll want to update this permission check. + if !authz.HasBuiltinRole(*authCtx, string(types.RoleAuth)) { + return nil, trace.AccessDenied("this request can be only executed by an auth server") + } + + if err := authCtx.CheckAccessToKind(types.KindAutoUpdateAgentRollout, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminActionAllowReusedMFA(); err != nil { + return nil, trace.Wrap(err) + } + + autoUpdateAgentRollout, err := s.backend.UpdateAutoUpdateAgentRollout(ctx, req.Rollout) + return autoUpdateAgentRollout, trace.Wrap(err) +} + +// UpsertAutoUpdateAgentRollout updates or creates AutoUpdateAgentRollout singleton. +func (s *Service) UpsertAutoUpdateAgentRollout(ctx context.Context, req *autoupdate.UpsertAutoUpdateAgentRolloutRequest) (*autoupdate.AutoUpdateAgentRollout, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + // Editing the AU agent plan is restricted to cluster administrators. As of today we don't have any way of having + // resources that can only be edited by Teleport Cloud (when running cloud-hosted). + // The workaround is to check if the caller has the auth system role. + // This is not ideal as it forces local tctl usage. In the future, if we expand the permission system and make cloud + // a first class citizen, we'll want to update this permission check. + if !authz.HasBuiltinRole(*authCtx, string(types.RoleAuth)) { + return nil, trace.AccessDenied("this request can be only executed by an auth server") + } + + if err := authCtx.CheckAccessToKind(types.KindAutoUpdateAgentRollout, types.VerbCreate, types.VerbUpdate); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminActionAllowReusedMFA(); err != nil { + return nil, trace.Wrap(err) + } + + autoUpdateAgentRollout, err := s.backend.UpsertAutoUpdateAgentRollout(ctx, req.Rollout) + return autoUpdateAgentRollout, trace.Wrap(err) +} + +// DeleteAutoUpdateAgentRollout deletes AutoUpdateAgentRollout singleton. +func (s *Service) DeleteAutoUpdateAgentRollout(ctx context.Context, req *autoupdate.DeleteAutoUpdateAgentRolloutRequest) (*emptypb.Empty, error) { + authCtx, err := s.authorizer.Authorize(ctx) + if err != nil { + return nil, trace.Wrap(err) + } + + // Editing the AU agent plan is restricted to cluster administrators. As of today we don't have any way of having + // resources that can only be edited by Teleport Cloud (when running cloud-hosted). + // The workaround is to check if the caller has the auth system role. + // This is not ideal as it forces local tctl usage. In the future, if we expand the permission system and make cloud + // a first class citizen, we'll want to update this permission check. + if !authz.HasBuiltinRole(*authCtx, string(types.RoleAuth)) { + return nil, trace.AccessDenied("this request can be only executed by an auth server") + } + + if err := authCtx.CheckAccessToKind(types.KindAutoUpdateAgentRollout, types.VerbDelete); err != nil { + return nil, trace.Wrap(err) + } + + if err := authCtx.AuthorizeAdminAction(); err != nil { + return nil, trace.Wrap(err) + } + + if err := s.backend.DeleteAutoUpdateAgentRollout(ctx); err != nil { + return nil, trace.Wrap(err) + } + return &emptypb.Empty{}, nil +} diff --git a/lib/auth/autoupdate/autoupdatev1/service_test.go b/lib/auth/autoupdate/autoupdatev1/service_test.go index 24acfbf575eea..dd1d6df087db5 100644 --- a/lib/auth/autoupdate/autoupdatev1/service_test.go +++ b/lib/auth/autoupdate/autoupdatev1/service_test.go @@ -81,6 +81,7 @@ func TestServiceAccess(t *testing.T) { allowedVerbs []string allowedStates []authz.AdminActionAuthState disallowedStates []authz.AdminActionAuthState + builtinRole *authz.BuiltinRole }{ { name: "CreateAutoUpdateConfig", @@ -167,6 +168,53 @@ func TestServiceAccess(t *testing.T) { allowedStates: []authz.AdminActionAuthState{authz.AdminActionAuthNotRequired, authz.AdminActionAuthMFAVerified}, allowedVerbs: []string{types.VerbDelete}, }, + // AutoUpdate agent rollout check. + { + name: "GetAutoUpdateAgentRollout", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthUnauthorized, + authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, + authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbRead}, + }, + { + name: "CreateAutoUpdateAgentRollout", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, + authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbCreate}, + builtinRole: &authz.BuiltinRole{Role: types.RoleAuth}, + }, + { + name: "UpdateAutoUpdateAgentRollout", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, + authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbUpdate}, + builtinRole: &authz.BuiltinRole{Role: types.RoleAuth}, + }, + { + name: "UpsertAutoUpdateAgentRollout", + allowedStates: []authz.AdminActionAuthState{ + authz.AdminActionAuthNotRequired, + authz.AdminActionAuthMFAVerified, + authz.AdminActionAuthMFAVerifiedWithReuse, + }, + allowedVerbs: []string{types.VerbUpdate, types.VerbCreate}, + builtinRole: &authz.BuiltinRole{Role: types.RoleAuth}, + }, + { + name: "DeleteAutoUpdateAgentRollout", + allowedStates: []authz.AdminActionAuthState{authz.AdminActionAuthNotRequired, authz.AdminActionAuthMFAVerified}, + allowedVerbs: []string{types.VerbDelete}, + builtinRole: &authz.BuiltinRole{Role: types.RoleAuth}, + }, } for _, tt := range testCases { @@ -177,7 +225,7 @@ func TestServiceAccess(t *testing.T) { t.Run(stateToString(state), 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, state, fakeChecker{allowedVerbs: verbs}) + service := newService(t, state, fakeChecker{allowedVerbs: verbs, builtinRole: tt.builtinRole}) err := callMethod(t, service, tt.name) // expect access denied except with full set of verbs. if len(verbs) == len(tt.allowedVerbs) { @@ -201,7 +249,7 @@ func TestServiceAccess(t *testing.T) { t.Run(stateToString(state), func(t *testing.T) { // it is enough to test against tt.allowedVerbs, // this is the only different data point compared to the test cases above. - service := newService(t, state, fakeChecker{allowedVerbs: tt.allowedVerbs}) + service := newService(t, state, fakeChecker{allowedVerbs: tt.allowedVerbs, builtinRole: tt.builtinRole}) err := callMethod(t, service, tt.name) require.True(t, trace.IsAccessDenied(err)) }) @@ -210,21 +258,9 @@ func TestServiceAccess(t *testing.T) { }) } - // TODO(hugoShaka): remove this as we implement the service for the autoupdate agent rollout resource - notImplementedYetRPCs := []string{ - "GetAutoUpdateAgentRollout", - "CreateAutoUpdateAgentRollout", - "UpdateAutoUpdateAgentRollout", - "UpsertAutoUpdateAgentRollout", - "DeleteAutoUpdateAgentRollout", - } - // verify that all declared methods have matching test cases t.Run("verify coverage", func(t *testing.T) { for _, method := range autoupdate.AutoUpdateService_ServiceDesc.Methods { - if slices.Contains(notImplementedYetRPCs, method.MethodName) { - continue - } t.Run(method.MethodName, func(t *testing.T) { match := false for _, testCase := range testCases { @@ -238,11 +274,12 @@ func TestServiceAccess(t *testing.T) { type fakeChecker struct { allowedVerbs []string + builtinRole *authz.BuiltinRole services.AccessChecker } func (f fakeChecker) CheckAccessToRule(_ services.RuleContext, _ string, resource string, verb string) error { - if resource == types.KindAutoUpdateConfig || resource == types.KindAutoUpdateVersion { + if resource == types.KindAutoUpdateConfig || resource == types.KindAutoUpdateVersion || resource == types.KindAutoUpdateAgentRollout { for _, allowedVerb := range f.allowedVerbs { if allowedVerb == verb { return nil @@ -253,7 +290,21 @@ 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, authState authz.AdminActionAuthState, checker services.AccessChecker) *Service { +func (f fakeChecker) HasRole(name string) bool { + if f.builtinRole == nil { + return false + } + return name == f.builtinRole.Role.String() +} + +func (f fakeChecker) identityGetter() authz.IdentityGetter { + if f.builtinRole != nil { + return *f.builtinRole + } + return nil +} + +func newService(t *testing.T, authState authz.AdminActionAuthState, checker fakeChecker) *Service { t.Helper() bk, err := memory.New(memory.Config{}) @@ -265,7 +316,7 @@ func newService(t *testing.T, authState authz.AdminActionAuthState, checker serv return newServiceWithStorage(t, authState, checker, storage) } -func newServiceWithStorage(t *testing.T, authState authz.AdminActionAuthState, checker services.AccessChecker, storage services.AutoUpdateService) *Service { +func newServiceWithStorage(t *testing.T, authState authz.AdminActionAuthState, checker fakeChecker, storage services.AutoUpdateService) *Service { t.Helper() authorizer := authz.AuthorizerFunc(func(ctx context.Context) (*authz.Context, error) { @@ -273,10 +324,12 @@ func newServiceWithStorage(t *testing.T, authState authz.AdminActionAuthState, c if err != nil { return nil, err } + return &authz.Context{ User: user, Checker: checker, AdminActionAuthState: authState, + Identity: checker.identityGetter(), }, nil }) diff --git a/lib/authz/permissions.go b/lib/authz/permissions.go index 86375ca1bb5ba..9b045a9879eb0 100644 --- a/lib/authz/permissions.go +++ b/lib/authz/permissions.go @@ -915,6 +915,7 @@ func roleSpecForProxy(clusterName string) types.RoleSpecV6 { types.NewRule(types.KindClusterMaintenanceConfig, services.RO()), types.NewRule(types.KindAutoUpdateConfig, services.RO()), types.NewRule(types.KindAutoUpdateVersion, services.RO()), + types.NewRule(types.KindAutoUpdateAgentRollout, services.RO()), types.NewRule(types.KindIntegration, append(services.RO(), types.VerbUse)), types.NewRule(types.KindAuditQuery, services.RO()), types.NewRule(types.KindSecurityReport, services.RO()), diff --git a/lib/cache/cache.go b/lib/cache/cache.go index 312705c258198..40c71ca1094e6 100644 --- a/lib/cache/cache.go +++ b/lib/cache/cache.go @@ -190,6 +190,7 @@ func ForAuth(cfg Config) Config { {Kind: types.KindStaticHostUser}, {Kind: types.KindAutoUpdateVersion}, {Kind: types.KindAutoUpdateConfig}, + {Kind: types.KindAutoUpdateAgentRollout}, {Kind: types.KindUserTask}, {Kind: types.KindProvisioningPrincipalState}, } @@ -247,6 +248,7 @@ func ForProxy(cfg Config) Config { {Kind: types.KindKubeWaitingContainer}, {Kind: types.KindAutoUpdateConfig}, {Kind: types.KindAutoUpdateVersion}, + {Kind: types.KindAutoUpdateAgentRollout}, {Kind: types.KindUserTask}, } cfg.QueueSize = defaults.ProxyQueueSize @@ -1994,6 +1996,29 @@ func (c *Cache) GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdat return rg.reader.GetAutoUpdateVersion(ctx) } +// GetAutoUpdateAgentRollout gets the AutoUpdateAgentRollout from the backend. +func (c *Cache) GetAutoUpdateAgentRollout(ctx context.Context) (*autoupdate.AutoUpdateAgentRollout, error) { + ctx, span := c.Tracer.Start(ctx, "cache/GetAutoUpdateAgentRollout") + defer span.End() + + rg, err := readCollectionCache(c, c.collections.autoUpdateAgentRollouts) + if err != nil { + return nil, trace.Wrap(err) + } + defer rg.Release() + if !rg.IsCacheRead() { + cachedAgentRollout, err := utils.FnCacheGet(ctx, c.fnCache, autoUpdateCacheKey{"rollout"}, func(ctx context.Context) (*autoupdate.AutoUpdateAgentRollout, error) { + version, err := rg.reader.GetAutoUpdateAgentRollout(ctx) + return version, err + }) + if err != nil { + return nil, trace.Wrap(err) + } + return protobuf.Clone(cachedAgentRollout).(*autoupdate.AutoUpdateAgentRollout), nil + } + return rg.reader.GetAutoUpdateAgentRollout(ctx) +} + func (c *Cache) GetUIConfig(ctx context.Context) (types.UIConfig, error) { ctx, span := c.Tracer.Start(ctx, "cache/GetUIConfig") defer span.End() diff --git a/lib/cache/cache_test.go b/lib/cache/cache_test.go index 4176f637fc655..1139a68ecaeb4 100644 --- a/lib/cache/cache_test.go +++ b/lib/cache/cache_test.go @@ -2803,6 +2803,42 @@ func TestAutoUpdateVersion(t *testing.T) { }) } +// TestAutoUpdateAgentRollout tests that CRUD operations on AutoUpdateAgentRollout resource are +// replicated from the backend to the cache. +func TestAutoUpdateAgentRollout(t *testing.T) { + t.Parallel() + + p := newTestPack(t, ForAuth) + t.Cleanup(p.Close) + + testResources153(t, p, testFuncs153[*autoupdate.AutoUpdateAgentRollout]{ + newResource: func(name string) (*autoupdate.AutoUpdateAgentRollout, error) { + return newAutoUpdateAgentRollout(t), nil + }, + create: func(ctx context.Context, item *autoupdate.AutoUpdateAgentRollout) error { + _, err := p.autoUpdateService.UpsertAutoUpdateAgentRollout(ctx, item) + return trace.Wrap(err) + }, + list: func(ctx context.Context) ([]*autoupdate.AutoUpdateAgentRollout, error) { + item, err := p.autoUpdateService.GetAutoUpdateAgentRollout(ctx) + if trace.IsNotFound(err) { + return []*autoupdate.AutoUpdateAgentRollout{}, nil + } + return []*autoupdate.AutoUpdateAgentRollout{item}, trace.Wrap(err) + }, + cacheList: func(ctx context.Context) ([]*autoupdate.AutoUpdateAgentRollout, error) { + item, err := p.cache.GetAutoUpdateAgentRollout(ctx) + if trace.IsNotFound(err) { + return []*autoupdate.AutoUpdateAgentRollout{}, nil + } + return []*autoupdate.AutoUpdateAgentRollout{item}, trace.Wrap(err) + }, + deleteAll: func(ctx context.Context) error { + return trace.Wrap(p.autoUpdateService.DeleteAutoUpdateAgentRollout(ctx)) + }, + }) +} + // TestGlobalNotifications tests that CRUD operations on global notification resources are // replicated from the backend to the cache. func TestGlobalNotifications(t *testing.T) { @@ -3452,6 +3488,7 @@ func TestCacheWatchKindExistsInEvents(t *testing.T) { types.KindStaticHostUser: types.Resource153ToLegacy(newStaticHostUser(t, "test")), types.KindAutoUpdateConfig: types.Resource153ToLegacy(newAutoUpdateConfig(t)), types.KindAutoUpdateVersion: types.Resource153ToLegacy(newAutoUpdateVersion(t)), + types.KindAutoUpdateAgentRollout: types.Resource153ToLegacy(newAutoUpdateAgentRollout(t)), types.KindUserTask: types.Resource153ToLegacy(newUserTasks(t)), types.KindProvisioningPrincipalState: types.Resource153ToLegacy(newProvisioningPrincipalState("u-alice@example.com")), } @@ -4024,6 +4061,20 @@ func newAutoUpdateVersion(t *testing.T) *autoupdate.AutoUpdateVersion { return r } +func newAutoUpdateAgentRollout(t *testing.T) *autoupdate.AutoUpdateAgentRollout { + t.Helper() + + r, err := update.NewAutoUpdateAgentRollout(&autoupdate.AutoUpdateAgentRolloutSpec{ + StartVersion: "1.2.3", + TargetVersion: "2.3.4", + Schedule: "regular", + AutoupdateMode: "enabled", + Strategy: "time-based", + }) + require.NoError(t, err) + return r +} + func withKeepalive[T any](fn func(context.Context, T) (*types.KeepAlive, error)) func(context.Context, T) error { return func(ctx context.Context, resource T) error { _, err := fn(ctx, resource) diff --git a/lib/cache/collections.go b/lib/cache/collections.go index e072212a45784..130cfd303c23f 100644 --- a/lib/cache/collections.go +++ b/lib/cache/collections.go @@ -268,6 +268,7 @@ type cacheCollections struct { spiffeFederations collectionReader[SPIFFEFederationReader] autoUpdateConfigs collectionReader[autoUpdateConfigGetter] autoUpdateVersions collectionReader[autoUpdateVersionGetter] + autoUpdateAgentRollouts collectionReader[autoUpdateAgentRolloutGetter] provisioningStates collectionReader[provisioningStateGetter] } @@ -815,6 +816,15 @@ func setupCollections(c *Cache, watches []types.WatchKind) (*cacheCollections, e watch: watch, } collections.byKind[resourceKind] = collections.autoUpdateVersions + case types.KindAutoUpdateAgentRollout: + if c.AutoUpdateService == nil { + return nil, trace.BadParameter("missing parameter AutoUpdateService") + } + collections.autoUpdateAgentRollouts = &genericCollection[*autoupdate.AutoUpdateAgentRollout, autoUpdateAgentRolloutGetter, autoUpdateAgentRolloutExecutor]{ + cache: c, + watch: watch, + } + collections.byKind[resourceKind] = collections.autoUpdateAgentRollouts case types.KindProvisioningPrincipalState: if c.ProvisioningStates == nil { @@ -1370,6 +1380,41 @@ type autoUpdateVersionGetter interface { var _ executor[*autoupdate.AutoUpdateVersion, autoUpdateVersionGetter] = autoUpdateVersionExecutor{} +type autoUpdateAgentRolloutExecutor struct{} + +func (autoUpdateAgentRolloutExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]*autoupdate.AutoUpdateAgentRollout, error) { + plan, err := cache.AutoUpdateService.GetAutoUpdateAgentRollout(ctx) + return []*autoupdate.AutoUpdateAgentRollout{plan}, trace.Wrap(err) +} + +func (autoUpdateAgentRolloutExecutor) upsert(ctx context.Context, cache *Cache, resource *autoupdate.AutoUpdateAgentRollout) error { + _, err := cache.autoUpdateCache.UpsertAutoUpdateAgentRollout(ctx, resource) + return trace.Wrap(err) +} + +func (autoUpdateAgentRolloutExecutor) deleteAll(ctx context.Context, cache *Cache) error { + return cache.autoUpdateCache.DeleteAutoUpdateAgentRollout(ctx) +} + +func (autoUpdateAgentRolloutExecutor) delete(ctx context.Context, cache *Cache, resource types.Resource) error { + return cache.autoUpdateCache.DeleteAutoUpdateAgentRollout(ctx) +} + +func (autoUpdateAgentRolloutExecutor) isSingleton() bool { return true } + +func (autoUpdateAgentRolloutExecutor) getReader(cache *Cache, cacheOK bool) autoUpdateAgentRolloutGetter { + if cacheOK { + return cache.autoUpdateCache + } + return cache.Config.AutoUpdateService +} + +type autoUpdateAgentRolloutGetter interface { + GetAutoUpdateAgentRollout(ctx context.Context) (*autoupdate.AutoUpdateAgentRollout, error) +} + +var _ executor[*autoupdate.AutoUpdateAgentRollout, autoUpdateAgentRolloutGetter] = autoUpdateAgentRolloutExecutor{} + type userExecutor struct{} func (userExecutor) getAll(ctx context.Context, cache *Cache, loadSecrets bool) ([]types.User, error) { diff --git a/lib/services/autoupdates.go b/lib/services/autoupdates.go index 5fa7a4eed4677..72d51b4ac2338 100644 --- a/lib/services/autoupdates.go +++ b/lib/services/autoupdates.go @@ -31,6 +31,9 @@ type AutoUpdateServiceGetter interface { // GetAutoUpdateVersion gets the AutoUpdateVersion singleton resource. GetAutoUpdateVersion(ctx context.Context) (*autoupdate.AutoUpdateVersion, error) + + // GetAutoUpdateAgentRollout gets the AutoUpdateAgentRollout singleton resource. + GetAutoUpdateAgentRollout(ctx context.Context) (*autoupdate.AutoUpdateAgentRollout, error) } // AutoUpdateService stores the autoupdate service. @@ -60,4 +63,16 @@ type AutoUpdateService interface { // DeleteAutoUpdateVersion deletes the AutoUpdateVersion singleton resource. DeleteAutoUpdateVersion(ctx context.Context) error + + // CreateAutoUpdateAgentRollout creates the AutoUpdateAgentRollout singleton resource. + CreateAutoUpdateAgentRollout(ctx context.Context, plan *autoupdate.AutoUpdateAgentRollout) (*autoupdate.AutoUpdateAgentRollout, error) + + // UpdateAutoUpdateAgentRollout updates the AutoUpdateAgentRollout singleton resource. + UpdateAutoUpdateAgentRollout(ctx context.Context, plan *autoupdate.AutoUpdateAgentRollout) (*autoupdate.AutoUpdateAgentRollout, error) + + // UpsertAutoUpdateAgentRollout sets the AutoUpdateAgentRollout singleton resource. + UpsertAutoUpdateAgentRollout(ctx context.Context, plan *autoupdate.AutoUpdateAgentRollout) (*autoupdate.AutoUpdateAgentRollout, error) + + // DeleteAutoUpdateAgentRollout deletes the AutoUpdateAgentRollout singleton resource. + DeleteAutoUpdateAgentRollout(ctx context.Context) error } diff --git a/lib/services/local/autoupdate.go b/lib/services/local/autoupdate.go index 27c505d4fb505..879e5348d1d4e 100644 --- a/lib/services/local/autoupdate.go +++ b/lib/services/local/autoupdate.go @@ -32,14 +32,16 @@ import ( ) const ( - autoUpdateConfigPrefix = "auto_update_config" - autoUpdateVersionPrefix = "auto_update_version" + autoUpdateConfigPrefix = "auto_update_config" + autoUpdateVersionPrefix = "auto_update_version" + autoUpdateAgentRolloutPrefix = "auto_update_agent_rollout" ) // AutoUpdateService is responsible for managing AutoUpdateConfig and AutoUpdateVersion singleton resources. type AutoUpdateService struct { config *generic.ServiceWrapper[*autoupdate.AutoUpdateConfig] version *generic.ServiceWrapper[*autoupdate.AutoUpdateVersion] + rollout *generic.ServiceWrapper[*autoupdate.AutoUpdateAgentRollout] } // NewAutoUpdateService returns a new AutoUpdateService. @@ -74,10 +76,26 @@ func NewAutoUpdateService(b backend.Backend) (*AutoUpdateService, error) { if err != nil { return nil, trace.Wrap(err) } + rollout, err := generic.NewServiceWrapper( + generic.ServiceWrapperConfig[*autoupdate.AutoUpdateAgentRollout]{ + Backend: b, + ResourceKind: types.KindAutoUpdateAgentRollout, + BackendPrefix: backend.NewKey(autoUpdateAgentRolloutPrefix), + MarshalFunc: services.MarshalProtoResource[*autoupdate.AutoUpdateAgentRollout], + UnmarshalFunc: services.UnmarshalProtoResource[*autoupdate.AutoUpdateAgentRollout], + ValidateFunc: update.ValidateAutoUpdateAgentRollout, + KeyFunc: func(_ *autoupdate.AutoUpdateAgentRollout) string { + return types.MetaNameAutoUpdateAgentRollout + }, + }) + if err != nil { + return nil, trace.Wrap(err) + } return &AutoUpdateService{ config: config, version: version, + rollout: rollout, }, nil } @@ -156,3 +174,41 @@ func (s *AutoUpdateService) GetAutoUpdateVersion(ctx context.Context) (*autoupda func (s *AutoUpdateService) DeleteAutoUpdateVersion(ctx context.Context) error { return trace.Wrap(s.version.DeleteResource(ctx, types.MetaNameAutoUpdateVersion)) } + +// CreateAutoUpdateAgentRollout creates the AutoUpdateAgentRollout singleton resource. +func (s *AutoUpdateService) CreateAutoUpdateAgentRollout( + ctx context.Context, + v *autoupdate.AutoUpdateAgentRollout, +) (*autoupdate.AutoUpdateAgentRollout, error) { + rollout, err := s.rollout.CreateResource(ctx, v) + return rollout, trace.Wrap(err) +} + +// UpdateAutoUpdateAgentRollout updates the AutoUpdateAgentRollout singleton resource. +func (s *AutoUpdateService) UpdateAutoUpdateAgentRollout( + ctx context.Context, + v *autoupdate.AutoUpdateAgentRollout, +) (*autoupdate.AutoUpdateAgentRollout, error) { + rollout, err := s.rollout.UpdateResource(ctx, v) + return rollout, trace.Wrap(err) +} + +// UpsertAutoUpdateAgentRollout sets the AutoUpdateAgentRollout singleton resource. +func (s *AutoUpdateService) UpsertAutoUpdateAgentRollout( + ctx context.Context, + v *autoupdate.AutoUpdateAgentRollout, +) (*autoupdate.AutoUpdateAgentRollout, error) { + rollout, err := s.rollout.UpsertResource(ctx, v) + return rollout, trace.Wrap(err) +} + +// GetAutoUpdateAgentRollout gets the AutoUpdateAgentRollout singleton resource. +func (s *AutoUpdateService) GetAutoUpdateAgentRollout(ctx context.Context) (*autoupdate.AutoUpdateAgentRollout, error) { + rollout, err := s.rollout.GetResource(ctx, types.MetaNameAutoUpdateAgentRollout) + return rollout, trace.Wrap(err) +} + +// DeleteAutoUpdateAgentRollout deletes the AutoUpdateAgentRollout singleton resource. +func (s *AutoUpdateService) DeleteAutoUpdateAgentRollout(ctx context.Context) error { + return trace.Wrap(s.rollout.DeleteResource(ctx, types.MetaNameAutoUpdateAgentRollout)) +} diff --git a/lib/services/local/events.go b/lib/services/local/events.go index f0ef42d33648a..09084857dbf06 100644 --- a/lib/services/local/events.go +++ b/lib/services/local/events.go @@ -100,6 +100,8 @@ func (e *EventsService) NewWatcher(ctx context.Context, watch types.Watch) (type parser = newAutoUpdateConfigParser() case types.KindAutoUpdateVersion: parser = newAutoUpdateVersionParser() + case types.KindAutoUpdateAgentRollout: + parser = newAutoUpdateAgentRolloutParser() case types.KindNamespace: parser = newNamespaceParser(kind.Name) case types.KindRole: @@ -812,6 +814,41 @@ func (p *autoUpdateVersionParser) parse(event backend.Event) (types.Resource, er } } +func newAutoUpdateAgentRolloutParser() *autoUpdateAgentRolloutParser { + return &autoUpdateAgentRolloutParser{ + baseParser: newBaseParser(backend.NewKey(autoUpdateAgentRolloutPrefix)), + } +} + +type autoUpdateAgentRolloutParser struct { + baseParser +} + +func (p *autoUpdateAgentRolloutParser) parse(event backend.Event) (types.Resource, error) { + switch event.Type { + case types.OpDelete: + return &types.ResourceHeader{ + Kind: types.KindAutoUpdateAgentRollout, + Version: types.V1, + Metadata: types.Metadata{ + Name: types.MetaNameAutoUpdateAgentRollout, + Namespace: apidefaults.Namespace, + }, + }, nil + case types.OpPut: + autoUpdateAgentRollout, err := services.UnmarshalProtoResource[*autoupdate.AutoUpdateAgentRollout](event.Item.Value, + services.WithExpires(event.Item.Expires), + services.WithRevision(event.Item.Revision), + ) + if err != nil { + return nil, trace.Wrap(err) + } + return types.Resource153ToLegacy(autoUpdateAgentRollout), nil + default: + return nil, trace.BadParameter("event %v is not supported", event.Type) + } +} + func newNamespaceParser(name string) *namespaceParser { prefix := backend.NewKey(namespacesPrefix) if name != "" { diff --git a/lib/services/resource.go b/lib/services/resource.go index 819ec724cdc81..fdb886e0a25ca 100644 --- a/lib/services/resource.go +++ b/lib/services/resource.go @@ -253,6 +253,8 @@ func ParseShortcut(in string) (string, error) { return types.KindAutoUpdateConfig, nil case types.KindAutoUpdateVersion: return types.KindAutoUpdateVersion, nil + case types.KindAutoUpdateAgentRollout: + return types.KindAutoUpdateAgentRollout, nil } return "", trace.BadParameter("unsupported resource: %q - resources should be expressed as 'type/name', for example 'connector/github'", in) } From ae2b549f992c429159865eee68c1c5520e6b3f26 Mon Sep 17 00:00:00 2001 From: Bartosz Leper Date: Thu, 24 Oct 2024 16:52:27 +0200 Subject: [PATCH 52/70] Add Kubernetes access section to the role editor (#47674) * Add Kubernetes access section to the role editor * Review * Update the k8s operator docs This also removes the mention of valid values of the Kind field, as I don't want the external documentation to point to Teleport source files. * Update operator CRDs and Terraform resources --- api/proto/teleport/legacy/types/types.proto | 1 - api/types/constants.go | 14 +- api/types/types.pb.go | 1 - .../resources.teleport.dev_roles.mdx | 8 +- .../resources.teleport.dev_rolesv6.mdx | 4 +- .../resources.teleport.dev_rolesv7.mdx | 4 +- .../terraform-provider/data-sources/role.mdx | 4 +- .../terraform-provider/resources/role.mdx | 4 +- .../resources.teleport.dev_roles.yaml | 4 - .../resources.teleport.dev_rolesv6.yaml | 2 - .../resources.teleport.dev_rolesv7.yaml | 2 - .../bases/resources.teleport.dev_roles.yaml | 4 - .../bases/resources.teleport.dev_rolesv6.yaml | 2 - .../bases/resources.teleport.dev_rolesv7.yaml | 2 - .../terraform/tfschema/types_terraform.go | 4 +- .../Roles/RoleEditor/StandardEditor.test.tsx | 160 ++++++++++- .../src/Roles/RoleEditor/StandardEditor.tsx | 188 ++++++++++++- .../Roles/RoleEditor/standardmodel.test.ts | 172 +++++++++++- .../src/Roles/RoleEditor/standardmodel.ts | 261 ++++++++++++++++-- .../teleport/src/services/resources/types.ts | 10 + 20 files changed, 769 insertions(+), 82 deletions(-) diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index 227b0fde27e27..a51edd0cfa11c 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -3320,7 +3320,6 @@ message DatabasePermission { // KubernetesResource is the Kubernetes resource identifier. message KubernetesResource { // Kind specifies the Kubernetes Resource type. - // At the moment only "pod" is supported. string Kind = 1 [(gogoproto.jsontag) = "kind,omitempty"]; // Namespace is the resource namespace. // It supports wildcards. diff --git a/api/types/constants.go b/api/types/constants.go index b50b91c480aad..9a5efafedd766 100644 --- a/api/types/constants.go +++ b/api/types/constants.go @@ -1270,7 +1270,14 @@ var RequestableResourceKinds = []string{ KindSAMLIdPServiceProvider, } -// KubernetesResourcesKinds lists the supported Kubernetes resource kinds. +// The list below needs to be kept in sync with `kubernetesResourceKindOptions` +// in `web/packages/teleport/src/Roles/RoleEditor/standardmodel.ts`. (Keeping +// this comment separate to prevent it from being included in the official +// package docs.) + +// KubernetesResourcesKinds lists the supported Kubernetes resource kinds. This +// is for the latest version of Role resources; roles whose version is set to +// v6 or prior only support [KindKubePod]. var KubernetesResourcesKinds = []string{ KindKubePod, KindKubeSecret, @@ -1318,6 +1325,11 @@ const ( KubeVerbPortForward = "portforward" ) +// The list below needs to be kept in sync with `kubernetesResourceVerbOptions` +// in `web/packages/teleport/src/Roles/RoleEditor/standardmodel.ts`. (Keeping +// this comment separate to prevent it from being included in the official +// package docs.) + // KubernetesVerbs lists the supported Kubernetes verbs. var KubernetesVerbs = []string{ Wildcard, diff --git a/api/types/types.pb.go b/api/types/types.pb.go index 57f0a4a20bee8..ce1a982a8b029 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -8384,7 +8384,6 @@ var xxx_messageInfo_DatabasePermission proto.InternalMessageInfo // KubernetesResource is the Kubernetes resource identifier. type KubernetesResource struct { // Kind specifies the Kubernetes Resource type. - // At the moment only "pod" is supported. Kind string `protobuf:"bytes,1,opt,name=Kind,proto3" json:"kind,omitempty"` // Namespace is the resource namespace. // It supports wildcards. diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx index 1a1bd131d98ee..bcfa55b92e380 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_roles.mdx @@ -109,7 +109,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| -|kind|string|Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported.| +|kind|string|Kind specifies the Kubernetes Resource type.| |name|string|Name is the resource name. It supports wildcards.| |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| @@ -267,7 +267,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| -|kind|string|Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported.| +|kind|string|Kind specifies the Kubernetes Resource type.| |name|string|Name is the resource name. It supports wildcards.| |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| @@ -508,7 +508,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| -|kind|string|Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported.| +|kind|string|Kind specifies the Kubernetes Resource type.| |name|string|Name is the resource name. It supports wildcards.| |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| @@ -666,7 +666,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| -|kind|string|Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported.| +|kind|string|Kind specifies the Kubernetes Resource type.| |name|string|Name is the resource name. It supports wildcards.| |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx index 5a52c58697753..faf5066ed3d65 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv6.mdx @@ -109,7 +109,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| -|kind|string|Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported.| +|kind|string|Kind specifies the Kubernetes Resource type.| |name|string|Name is the resource name. It supports wildcards.| |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| @@ -267,7 +267,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| -|kind|string|Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported.| +|kind|string|Kind specifies the Kubernetes Resource type.| |name|string|Name is the resource name. It supports wildcards.| |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| diff --git a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx index 328bfa0c52c24..2c4e6e5415ea1 100644 --- a/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx +++ b/docs/pages/reference/operator-resources/resources.teleport.dev_rolesv7.mdx @@ -109,7 +109,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| -|kind|string|Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported.| +|kind|string|Kind specifies the Kubernetes Resource type.| |name|string|Name is the resource name. It supports wildcards.| |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| @@ -267,7 +267,7 @@ resource, which you can apply after installing the Teleport Kubernetes operator. |Field|Type|Description| |---|---|---| -|kind|string|Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported.| +|kind|string|Kind specifies the Kubernetes Resource type.| |name|string|Name is the resource name. It supports wildcards.| |namespace|string|Namespace is the resource namespace. It supports wildcards.| |verbs|[]string|Verbs are the allowed Kubernetes verbs for the following resource.| diff --git a/docs/pages/reference/terraform-provider/data-sources/role.mdx b/docs/pages/reference/terraform-provider/data-sources/role.mdx index b5ace20ebbbc2..ff453e50bcc19 100644 --- a/docs/pages/reference/terraform-provider/data-sources/role.mdx +++ b/docs/pages/reference/terraform-provider/data-sources/role.mdx @@ -127,7 +127,7 @@ Optional: Optional: -- `kind` (String) Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported. +- `kind` (String) Kind specifies the Kubernetes Resource type. - `name` (String) Name is the resource name. It supports wildcards. - `namespace` (String) Namespace is the resource namespace. It supports wildcards. - `verbs` (List of String) Verbs are the allowed Kubernetes verbs for the following resource. @@ -299,7 +299,7 @@ Optional: Optional: -- `kind` (String) Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported. +- `kind` (String) Kind specifies the Kubernetes Resource type. - `name` (String) Name is the resource name. It supports wildcards. - `namespace` (String) Namespace is the resource namespace. It supports wildcards. - `verbs` (List of String) Verbs are the allowed Kubernetes verbs for the following resource. diff --git a/docs/pages/reference/terraform-provider/resources/role.mdx b/docs/pages/reference/terraform-provider/resources/role.mdx index 1a48109632ced..d2d344b089650 100644 --- a/docs/pages/reference/terraform-provider/resources/role.mdx +++ b/docs/pages/reference/terraform-provider/resources/role.mdx @@ -181,7 +181,7 @@ Optional: Optional: -- `kind` (String) Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported. +- `kind` (String) Kind specifies the Kubernetes Resource type. - `name` (String) Name is the resource name. It supports wildcards. - `namespace` (String) Namespace is the resource namespace. It supports wildcards. - `verbs` (List of String) Verbs are the allowed Kubernetes verbs for the following resource. @@ -353,7 +353,7 @@ Optional: Optional: -- `kind` (String) Kind specifies the Kubernetes Resource type. At the moment only "pod" is supported. +- `kind` (String) Kind specifies the Kubernetes Resource type. - `name` (String) Name is the resource name. It supports wildcards. - `namespace` (String) Namespace is the resource namespace. It supports wildcards. - `verbs` (List of String) Verbs are the allowed Kubernetes verbs for the following resource. diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml index ef5b2d5ce6676..a51a1d9bc1f58 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_roles.yaml @@ -260,7 +260,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -797,7 +796,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -1613,7 +1611,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -2150,7 +2147,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml index 69cdeef31b1fa..bb7c899188b2b 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv6.yaml @@ -263,7 +263,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -800,7 +799,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. diff --git a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml index 0d7aceff039f0..3c28e797f76dd 100644 --- a/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml +++ b/examples/chart/teleport-cluster/charts/teleport-operator/operator-crds/resources.teleport.dev_rolesv7.yaml @@ -263,7 +263,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -800,7 +799,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml index ef5b2d5ce6676..a51a1d9bc1f58 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_roles.yaml @@ -260,7 +260,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -797,7 +796,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -1613,7 +1611,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -2150,7 +2147,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml index 69cdeef31b1fa..bb7c899188b2b 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv6.yaml @@ -263,7 +263,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -800,7 +799,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. diff --git a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml index 0d7aceff039f0..3c28e797f76dd 100644 --- a/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml +++ b/integrations/operator/config/crd/bases/resources.teleport.dev_rolesv7.yaml @@ -263,7 +263,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. @@ -800,7 +799,6 @@ spec: properties: kind: description: Kind specifies the Kubernetes Resource type. - At the moment only "pod" is supported. type: string name: description: Name is the resource name. It supports wildcards. diff --git a/integrations/terraform/tfschema/types_terraform.go b/integrations/terraform/tfschema/types_terraform.go index 7e841973780dc..13628d9ab6ee9 100644 --- a/integrations/terraform/tfschema/types_terraform.go +++ b/integrations/terraform/tfschema/types_terraform.go @@ -1722,7 +1722,7 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin "kubernetes_resources": { Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.ListNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ "kind": { - Description: "Kind specifies the Kubernetes Resource type. At the moment only \"pod\" is supported.", + Description: "Kind specifies the Kubernetes Resource type.", Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, }, @@ -2175,7 +2175,7 @@ func GenSchemaRoleV6(ctx context.Context) (github_com_hashicorp_terraform_plugin "kubernetes_resources": { Attributes: github_com_hashicorp_terraform_plugin_framework_tfsdk.ListNestedAttributes(map[string]github_com_hashicorp_terraform_plugin_framework_tfsdk.Attribute{ "kind": { - Description: "Kind specifies the Kubernetes Resource type. At the moment only \"pod\" is supported.", + Description: "Kind specifies the Kubernetes Resource type.", Optional: true, Type: github_com_hashicorp_terraform_plugin_framework_types.StringType, }, diff --git a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.test.tsx b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.test.tsx index 5f22d2bfd6635..b0009118a55a6 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.test.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.test.tsx @@ -27,12 +27,16 @@ import TeleportContextProvider from 'teleport/TeleportContextProvider'; import { createTeleportContext } from 'teleport/mocks/contexts'; import { + AccessSpec, + KubernetesAccessSpec, newRole, roleToRoleEditorModel, ServerAccessSpec, StandardEditorModel, } from './standardmodel'; import { + KubernetesAccessSpecSection, + SectionProps, ServerAccessSpecSection, StandardEditor, StandardEditorProps, @@ -126,19 +130,19 @@ const getSectionByName = (name: string) => // eslint-disable-next-line testing-library/no-node-access screen.getByRole('heading', { level: 3, name }).closest('details'); -const TestServerAccessSpecsSection = ({ +const StatefulSection = ({ + defaultValue, + component: Component, onChange, }: { - onChange(spec: ServerAccessSpec): void; + defaultValue: S; + component: React.ComponentType>; + onChange(spec: S): void; }) => { - const [model, setModel] = useState({ - kind: 'node', - labels: [], - logins: [], - }); + const [model, setModel] = useState(defaultValue); return ( - { @@ -153,7 +157,17 @@ const TestServerAccessSpecsSection = ({ test('editing server access specs', async () => { const user = userEvent.setup(); const onChange = jest.fn(); - render(); + render( + + component={ServerAccessSpecSection} + defaultValue={{ + kind: 'node', + labels: [], + logins: [], + }} + onChange={onChange} + /> + ); await user.click(screen.getByRole('button', { name: 'Add a Label' })); await user.type(screen.getByPlaceholderText('label key'), 'some-key'); await user.type(screen.getByPlaceholderText('label value'), 'some-value'); @@ -173,3 +187,131 @@ test('editing server access specs', async () => { ], } as ServerAccessSpec); }); + +describe('KubernetesAccessSpecSection', () => { + const setup = () => { + const onChange = jest.fn(); + render( + + component={KubernetesAccessSpecSection} + defaultValue={{ + kind: 'kube_cluster', + groups: [], + labels: [], + resources: [], + }} + onChange={onChange} + /> + ); + return { user: userEvent.setup(), onChange }; + }; + + test('editing the spec', async () => { + const { user, onChange } = setup(); + + await selectEvent.create(screen.getByLabelText('Groups'), 'group1', { + createOptionText: 'Group: group1', + }); + await selectEvent.create(screen.getByLabelText('Groups'), 'group2', { + createOptionText: 'Group: group2', + }); + + await user.click(screen.getByRole('button', { name: 'Add a Label' })); + await user.type(screen.getByPlaceholderText('label key'), 'some-key'); + await user.type(screen.getByPlaceholderText('label value'), 'some-value'); + + await user.click(screen.getByRole('button', { name: 'Add a Resource' })); + expect( + reactSelectValueContainer(screen.getByLabelText('Kind')) + ).toHaveTextContent('Any kind'); + expect(screen.getByLabelText('Name')).toHaveValue('*'); + expect(screen.getByLabelText('Namespace')).toHaveValue('*'); + await selectEvent.select(screen.getByLabelText('Kind'), 'Job'); + await user.clear(screen.getByLabelText('Name')); + await user.type(screen.getByLabelText('Name'), 'job-name'); + await user.clear(screen.getByLabelText('Namespace')); + await user.type(screen.getByLabelText('Namespace'), 'job-namespace'); + await selectEvent.select(screen.getByLabelText('Verbs'), [ + 'create', + 'delete', + ]); + + expect(onChange).toHaveBeenLastCalledWith({ + kind: 'kube_cluster', + groups: [ + expect.objectContaining({ value: 'group1' }), + expect.objectContaining({ value: 'group2' }), + ], + labels: [{ name: 'some-key', value: 'some-value' }], + resources: [ + { + id: expect.any(String), + kind: expect.objectContaining({ value: 'job' }), + name: 'job-name', + namespace: 'job-namespace', + verbs: [ + expect.objectContaining({ value: 'create' }), + expect.objectContaining({ value: 'delete' }), + ], + }, + ], + } as KubernetesAccessSpec); + }); + + test('adding and removing resources', async () => { + const { user, onChange } = setup(); + + await user.click(screen.getByRole('button', { name: 'Add a Resource' })); + await user.clear(screen.getByLabelText('Name')); + await user.type(screen.getByLabelText('Name'), 'res1'); + await user.click( + screen.getByRole('button', { name: 'Add Another Resource' }) + ); + await user.clear(screen.getAllByLabelText('Name')[1]); + await user.type(screen.getAllByLabelText('Name')[1], 'res2'); + await user.click( + screen.getByRole('button', { name: 'Add Another Resource' }) + ); + await user.clear(screen.getAllByLabelText('Name')[2]); + await user.type(screen.getAllByLabelText('Name')[2], 'res3'); + expect(onChange).toHaveBeenLastCalledWith( + expect.objectContaining({ + resources: [ + expect.objectContaining({ name: 'res1' }), + expect.objectContaining({ name: 'res2' }), + expect.objectContaining({ name: 'res3' }), + ], + }) + ); + + await user.click( + screen.getAllByRole('button', { name: 'Remove resource' })[1] + ); + expect(onChange).toHaveBeenLastCalledWith( + expect.objectContaining({ + resources: [ + expect.objectContaining({ name: 'res1' }), + expect.objectContaining({ name: 'res3' }), + ], + }) + ); + await user.click( + screen.getAllByRole('button', { name: 'Remove resource' })[0] + ); + expect(onChange).toHaveBeenLastCalledWith( + expect.objectContaining({ + resources: [expect.objectContaining({ name: 'res3' })], + }) + ); + await user.click( + screen.getAllByRole('button', { name: 'Remove resource' })[0] + ); + expect(onChange).toHaveBeenLastCalledWith( + expect.objectContaining({ resources: [] }) + ); + }); +}); + +const reactSelectValueContainer = (input: HTMLInputElement) => + // eslint-disable-next-line testing-library/no-node-access + input.closest('.react-select__value-container'); diff --git a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx index 553a8bfd474d0..7a19f03ca43b3 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx +++ b/web/packages/teleport/src/Roles/RoleEditor/StandardEditor.tsx @@ -17,7 +17,16 @@ */ import React, { useState } from 'react'; -import { Box, ButtonIcon, Flex, H3, Text } from 'design'; +import { + Box, + ButtonIcon, + ButtonSecondary, + Flex, + H3, + H4, + Mark, + Text, +} from 'design'; import FieldInput from 'shared/components/FieldInput'; import Validation, { Validator } from 'shared/components/Validation'; import { requiredField } from 'shared/components/Validation/rules'; @@ -27,7 +36,10 @@ import styled, { useTheme } from 'styled-components'; import { MenuButton, MenuItem } from 'shared/components/MenuAction'; -import { FieldSelectCreatable } from 'shared/components/FieldSelect'; +import { + FieldSelect, + FieldSelectCreatable, +} from 'shared/components/FieldSelect'; import { Role, RoleWithYaml } from 'teleport/services/resources'; @@ -42,6 +54,12 @@ import { AccessSpecKind, AccessSpec, ServerAccessSpec, + newAccessSpec, + KubernetesAccessSpec, + newKubernetesResourceModel, + kubernetesResourceKindOptions, + kubernetesVerbOptions, + KubernetesResourceModel, } from './standardmodel'; import { EditorSaveCancelButton } from './Shared'; import { RequiresResetToStandard } from './RequiresResetToStandard'; @@ -112,7 +130,7 @@ export const StandardEditor = ({ ...standardEditorModel.roleModel, accessSpecs: [ ...standardEditorModel.roleModel.accessSpecs, - { kind, labels: [], logins: [] }, + newAccessSpec(kind), ], }); } @@ -210,7 +228,7 @@ export const StandardEditor = ({ ); }; -type SectionProps = { +export type SectionProps = { value: T; isProcessing: boolean; onChange?(value: T): void; @@ -289,7 +307,7 @@ const Section = ({ open={expanded} border={1} borderColor={theme.colors.interactive.tonal.neutral[0]} - borderRadius={2} + borderRadius={3} > ) { + return ( + <> + `Group: ${label}`} + components={{ + DropdownIndicator: null, + }} + value={value.groups} + onChange={groups => onChange?.({ ...value, groups })} + /> + + + Labels + + onChange?.({ ...value, labels })} + /> + + + {value.resources.map((resource, index) => ( + + onChange?.({ + ...value, + resources: value.resources.map((res, i) => + i === index ? newRes : res + ), + }) + } + onRemove={() => + onChange?.({ + ...value, + resources: value.resources.toSpliced(index, 1), + }) + } + /> + ))} + + + + onChange?.({ + ...value, + resources: [...value.resources, newKubernetesResourceModel()], + }) + } + > + + {value.resources.length > 0 + ? 'Add Another Resource' + : 'Add a Resource'} + + + + + ); +} + +function KubernetesResourceView({ + value, + isProcessing, + onChange, + onRemove, +}: { + value: KubernetesResourceModel; + isProcessing: boolean; + onChange(m: KubernetesResourceModel): void; + onRemove(): void; +}) { + const { kind, name, namespace, verbs } = value; + const theme = useTheme(); + return ( + + + +

Resource

+
+ + + +
+ onChange?.({ ...value, kind: k })} + /> + + Name of the resource. Special value *{' '} + means any name. + + } + disabled={isProcessing} + value={name} + onChange={e => onChange?.({ ...value, name: e.target.value })} + /> + + Namespace that contains the resource. Special value{' '} + * means any namespace. + + } + disabled={isProcessing} + value={namespace} + onChange={e => onChange?.({ ...value, namespace: e.target.value })} + /> + onChange?.({ ...value, verbs: v })} + mb={0} + /> +
+ ); } export const EditorWrapper = styled(Box)<{ mute?: boolean }>` opacity: ${p => (p.mute ? 0.4 : 1)}; pointer-events: ${p => (p.mute ? 'none' : '')}; `; + +// TODO(bl-nero): This should ideally use tonal neutral 1 from the opposite +// theme as background. +const MarkInverse = styled(Mark)` + background: ${p => p.theme.colors.text.primaryInverse}; + color: ${p => p.theme.colors.text.main}; +`; diff --git a/web/packages/teleport/src/Roles/RoleEditor/standardmodel.test.ts b/web/packages/teleport/src/Roles/RoleEditor/standardmodel.test.ts index 311018beb8a9c..f95d9fe7c183d 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/standardmodel.test.ts +++ b/web/packages/teleport/src/Roles/RoleEditor/standardmodel.test.ts @@ -18,7 +18,13 @@ import { Role } from 'teleport/services/resources'; +import { Label as UILabel } from 'teleport/components/LabelsInput/LabelsInput'; + +import { Labels } from 'teleport/services/resources'; + import { + labelsModelToLabels, + labelsToModel, RoleEditorModel, roleEditorModelToRole, roleToRoleEditorModel, @@ -224,7 +230,7 @@ describe('roleToRoleEditorModel', () => { } as RoleEditorModel); }); - it('converts server access spec', () => { + it('creates a server access spec', () => { const minRole = minimalRole(); expect( roleToRoleEditorModel({ @@ -232,7 +238,7 @@ describe('roleToRoleEditorModel', () => { spec: { ...minRole.spec, allow: { - node_labels: { foo: 'bar', doubleFoo: ['bar1', 'bar2'] }, + node_labels: { foo: 'bar' }, logins: ['root', 'cthulhu', 'sandman'], }, }, @@ -242,11 +248,7 @@ describe('roleToRoleEditorModel', () => { accessSpecs: [ { kind: 'node', - labels: [ - { name: 'foo', value: 'bar' }, - { name: 'doubleFoo', value: 'bar1' }, - { name: 'doubleFoo', value: 'bar2' }, - ], + labels: [{ name: 'foo', value: 'bar' }], logins: [ { label: 'root', value: 'root' }, { label: 'cthulhu', value: 'cthulhu' }, @@ -256,6 +258,74 @@ describe('roleToRoleEditorModel', () => { ], } as RoleEditorModel); }); + + it('creates a Kubernetes access spec', () => { + const minRole = minimalRole(); + expect( + roleToRoleEditorModel({ + ...minRole, + spec: { + ...minRole.spec, + allow: { + kubernetes_groups: ['group1', 'group2'], + kubernetes_labels: { bar: 'foo' }, + kubernetes_resources: [ + { + kind: 'pod', + name: 'some-pod', + namespace: '*', + verbs: ['get', 'update'], + }, + { + // No namespace required for cluster-wide resources. + kind: 'kube_node', + name: 'some-node', + }, + ], + }, + }, + }) + ).toEqual({ + ...minimalRoleModel(), + accessSpecs: [ + { + kind: 'kube_cluster', + groups: [ + { label: 'group1', value: 'group1' }, + { label: 'group2', value: 'group2' }, + ], + labels: [{ name: 'bar', value: 'foo' }], + resources: [ + { + id: expect.any(String), + kind: { value: 'pod', label: 'Pod' }, + name: 'some-pod', + namespace: '*', + verbs: [ + { label: 'get', value: 'get' }, + { label: 'update', value: 'update' }, + ], + }, + { + id: expect.any(String), + kind: { value: 'kube_node', label: 'Node' }, + name: 'some-node', + namespace: '', + verbs: [], + }, + ], + }, + ], + } as RoleEditorModel); + }); +}); + +test('labelsToModel', () => { + expect(labelsToModel({ foo: 'bar', doubleFoo: ['bar1', 'bar2'] })).toEqual([ + { name: 'foo', value: 'bar' }, + { name: 'doubleFoo', value: 'bar1' }, + { name: 'doubleFoo', value: 'bar2' }, + ]); }); describe('roleEditorModelToRole', () => { @@ -287,12 +357,7 @@ describe('roleEditorModelToRole', () => { accessSpecs: [ { kind: 'node', - labels: [ - { name: 'foo', value: 'bar' }, - { name: 'tripleFoo', value: 'bar1' }, - { name: 'tripleFoo', value: 'bar2' }, - { name: 'tripleFoo', value: 'bar3' }, - ], + labels: [{ name: 'foo', value: 'bar' }], logins: [ { label: 'root', value: 'root' }, { label: 'cthulhu', value: 'cthulhu' }, @@ -306,10 +371,89 @@ describe('roleEditorModelToRole', () => { spec: { ...minRole.spec, allow: { - node_labels: { foo: 'bar', tripleFoo: ['bar1', 'bar2', 'bar3'] }, + node_labels: { foo: 'bar' }, logins: ['root', 'cthulhu', 'sandman'], }, }, } as Role); }); + + it('converts a Kubernetes access spec', () => { + const minRole = minimalRole(); + expect( + roleEditorModelToRole({ + ...minimalRoleModel(), + accessSpecs: [ + { + kind: 'kube_cluster', + groups: [ + { label: 'group1', value: 'group1' }, + { label: 'group2', value: 'group2' }, + ], + labels: [{ name: 'bar', value: 'foo' }], + resources: [ + { + id: 'dummy-id-1', + kind: { value: 'pod', label: 'Pod' }, + name: 'some-pod', + namespace: '*', + verbs: [ + { label: 'get', value: 'get' }, + { label: 'update', value: 'update' }, + ], + }, + { + id: 'dummy-id-2', + kind: { value: 'kube_node', label: 'Node' }, + name: 'some-node', + namespace: '', + verbs: [], + }, + ], + }, + ], + }) + ).toEqual({ + ...minRole, + spec: { + ...minRole.spec, + allow: { + kubernetes_groups: ['group1', 'group2'], + kubernetes_labels: { bar: 'foo' }, + kubernetes_resources: [ + { + kind: 'pod', + name: 'some-pod', + namespace: '*', + verbs: ['get', 'update'], + }, + { + kind: 'kube_node', + name: 'some-node', + namespace: '', + verbs: [], + }, + ], + }, + }, + } as Role); + }); +}); + +test('labelsModelToLabels', () => { + const model: UILabel[] = [ + { name: 'foo', value: 'bar' }, + { name: 'doubleFoo', value: 'bar1' }, + { name: 'doubleFoo', value: 'bar2' }, + // Moving from 2 to 3 values is a separate code branch, hence one more + // case. + { name: 'tripleFoo', value: 'bar1' }, + { name: 'tripleFoo', value: 'bar2' }, + { name: 'tripleFoo', value: 'bar3' }, + ]; + expect(labelsModelToLabels(model)).toEqual({ + foo: 'bar', + doubleFoo: ['bar1', 'bar2'], + tripleFoo: ['bar1', 'bar2', 'bar3'], + } as Labels); }); diff --git a/web/packages/teleport/src/Roles/RoleEditor/standardmodel.ts b/web/packages/teleport/src/Roles/RoleEditor/standardmodel.ts index 1d9066a1b93ee..9c13913315d8f 100644 --- a/web/packages/teleport/src/Roles/RoleEditor/standardmodel.ts +++ b/web/packages/teleport/src/Roles/RoleEditor/standardmodel.ts @@ -20,9 +20,14 @@ import { equalsDeep } from 'shared/utils/highbar'; import { Option } from 'shared/components/Select'; -import { Labels, Role, RoleConditions } from 'teleport/services/resources'; +import { + KubernetesResource, + Labels, + Role, + RoleConditions, +} from 'teleport/services/resources'; -import { Label } from 'teleport/components/LabelsInput/LabelsInput'; +import { Label as UILabel } from 'teleport/components/LabelsInput/LabelsInput'; import { defaultOptions } from './withDefaults'; @@ -77,11 +82,132 @@ type AccessSpecBase = { export type AccessSpecKind = 'node' | 'kube_cluster'; /** Model for the Kubernetes access specification section. */ -export type KubernetesAccessSpec = AccessSpecBase<'kube_cluster'>; +export type KubernetesAccessSpec = AccessSpecBase<'kube_cluster'> & { + groups: readonly Option[]; + labels: UILabel[]; + resources: KubernetesResourceModel[]; +}; + +export type KubernetesResourceModel = { + /** Autogenerated ID to be used with the `key` property. */ + id: string; + kind: KubernetesResourceKindOption; + name: string; + namespace: string; + verbs: readonly KubernetesVerbOption[]; +}; + +type KubernetesResourceKindOption = Option; +type KubernetesResourceKind = + | '*' + | 'pod' + | 'secret' + | 'configmap' + | 'namespace' + | 'service' + | 'serviceaccount' + | 'kube_node' + | 'persistentvolume' + | 'persistentvolumeclaim' + | 'deployment' + | 'replicaset' + | 'statefulset' + | 'daemonset' + | 'clusterrole' + | 'kube_role' + | 'clusterrolebinding' + | 'rolebinding' + | 'cronjob' + | 'job' + | 'certificatesigningrequest' + | 'ingress'; + +/** + * All possible resource kind drop-down options. This array needs to be kept in + * sync with `KubernetesResourcesKinds` in `api/types/constants.go. + */ +export const kubernetesResourceKindOptions: KubernetesResourceKindOption[] = [ + // The "any kind" option goes first. + { value: '*', label: 'Any kind' }, + + // The rest is sorted by label. + ...( + [ + { value: 'pod', label: 'Pod' }, + { value: 'secret', label: 'Secret' }, + { value: 'configmap', label: 'ConfigMap' }, + { value: 'namespace', label: 'Namespace' }, + { value: 'service', label: 'Service' }, + { value: 'serviceaccount', label: 'ServiceAccount' }, + { value: 'kube_node', label: 'Node' }, + { value: 'persistentvolume', label: 'PersistentVolume' }, + { value: 'persistentvolumeclaim', label: 'PersistentVolumeClaim' }, + { value: 'deployment', label: 'Deployment' }, + { value: 'replicaset', label: 'ReplicaSet' }, + { value: 'statefulset', label: 'Statefulset' }, + { value: 'daemonset', label: 'DaemonSet' }, + { value: 'clusterrole', label: 'ClusterRole' }, + { value: 'kube_role', label: 'Role' }, + { value: 'clusterrolebinding', label: 'ClusterRoleBinding' }, + { value: 'rolebinding', label: 'RoleBinding' }, + { value: 'cronjob', label: 'Cronjob' }, + { value: 'job', label: 'Job' }, + { + value: 'certificatesigningrequest', + label: 'CertificateSigningRequest', + }, + { value: 'ingress', label: 'Ingress' }, + ] as const + ).toSorted((a, b) => a.label.localeCompare(b.label)), +]; + +type KubernetesVerbOption = Option; +type KubernetesVerb = + | '*' + | 'get' + | 'create' + | 'update' + | 'patch' + | 'delete' + | 'list' + | 'watch' + | 'deletecollection' + | 'exec' + | 'portforward'; + +/** + * All possible Kubernetes verb drop-down options. This array needs to be kept + * in sync with `KubernetesVerbs` in `api/types/constants.go. + */ +export const kubernetesVerbOptions: KubernetesVerbOption[] = [ + // The "any kind" option goes first. + { value: '*', label: 'All verbs' }, + + // The rest is sorted. + ...( + [ + 'get', + 'create', + 'update', + 'patch', + 'delete', + 'list', + 'watch', + 'deletecollection', + + // TODO(bl-nero): These are actually not k8s verbs, but they are allowed + // in our config. We may want to explain them in the UI somehow. + 'exec', + 'portforward', + ] as const + ) + .toSorted((a, b) => a.localeCompare(b)) + .map(verb => ({ value: verb, label: verb })), +]; /** Model for the server access specification section. */ export type ServerAccessSpec = AccessSpecBase<'node'> & { - labels: Label[]; + labels: UILabel[]; logins: readonly Option[]; }; @@ -105,6 +231,27 @@ export function newRole(): Role { }; } +export function newAccessSpec(kind: AccessSpecKind): AccessSpec { + switch (kind) { + case 'node': + return { kind: 'node', labels: [], logins: [] }; + case 'kube_cluster': + return { kind: 'kube_cluster', groups: [], labels: [], resources: [] }; + default: + kind satisfies never; + } +} + +export function newKubernetesResourceModel(): KubernetesResourceModel { + return { + id: crypto.randomUUID(), + kind: kubernetesResourceKindOptions.find(k => k.value === '*'), + name: '*', + namespace: '*', + verbs: [], + }; +} + /** * Converts a role to its in-editor UI model representation. The resulting * model may be marked as requiring reset if the role contains unsupported @@ -145,12 +292,24 @@ export function roleToRoleEditorModel( }; } +/** + * Converts a `RoleConditions` instance (an "allow" or "deny" section, to be + * specific) to a list of access specification models. + */ function roleConditionsToAccessSpecs(conditions: RoleConditions): { accessSpecs: AccessSpec[]; requiresReset: boolean; } { - const { node_labels, logins, ...rest } = conditions; + const { + node_labels, + logins, + kubernetes_groups, + kubernetes_labels, + kubernetes_resources, + ...rest + } = conditions; const accessSpecs: AccessSpec[] = []; + const nodeLabelsModel = labelsToModel(node_labels); const nodeLoginsModel = (logins ?? []).map(login => ({ label: login, @@ -163,13 +322,36 @@ function roleConditionsToAccessSpecs(conditions: RoleConditions): { logins: nodeLoginsModel, }); } + + const kubeGroupsModel = (kubernetes_groups ?? []).map(group => ({ + label: group, + value: group, + })); + const kubeLabelsModel = labelsToModel(kubernetes_labels); + const kubeResourcesModel = kubernetesResourcesToModel(kubernetes_resources); + if ( + kubeGroupsModel.length > 0 || + kubeLabelsModel.length > 0 || + kubeResourcesModel.length > 0 + ) { + accessSpecs.push({ + kind: 'kube_cluster', + groups: kubeGroupsModel, + labels: kubeLabelsModel, + resources: kubeResourcesModel, + }); + } return { accessSpecs, requiresReset: !isEmpty(rest), }; } -function labelsToModel(labels: Labels | undefined) { +/** + * Converts a set of labels, as represented in the role resource, to a list of + * `LabelInput` value models. + */ +export function labelsToModel(labels: Labels | undefined): UILabel[] { if (!labels) return []; return Object.entries(labels).flatMap(([name, value]) => { if (typeof value === 'string') { @@ -183,6 +365,22 @@ function labelsToModel(labels: Labels | undefined) { }); } +function kubernetesResourcesToModel( + resources: KubernetesResource[] | undefined +): KubernetesResourceModel[] { + return (resources ?? []).map( + ({ kind, name, namespace = '', verbs = [] }) => ({ + id: crypto.randomUUID(), + kind: kubernetesResourceKindOptions.find(o => o.value === kind), + name, + namespace, + verbs: verbs.map(verb => + kubernetesVerbOptions.find(o => o.value === verb) + ), + }) + ); +} + function isEmpty(obj: object) { return Object.keys(obj).length === 0; } @@ -211,25 +409,52 @@ export function roleEditorModelToRole(roleModel: RoleEditorModel): Role { }; for (const spec of roleModel.accessSpecs) { - if (spec.kind === 'node') { - const labels = {}; - for (const { name, value } of spec.labels) { - if (!Object.hasOwn(labels, name)) { - labels[name] = value; - } else if (typeof labels[name] === 'string') { - labels[name] = [labels[name], value]; - } else { - labels[name].push(value); - } + const { kind } = spec; + switch (kind) { + case 'node': { + role.spec.allow.node_labels = labelsModelToLabels(spec.labels); + role.spec.allow.logins = spec.logins.map(opt => opt.value); + break; + } + case 'kube_cluster': { + role.spec.allow.kubernetes_groups = spec.groups.map(opt => opt.value); + role.spec.allow.kubernetes_labels = labelsModelToLabels(spec.labels); + role.spec.allow.kubernetes_resources = spec.resources.map( + ({ kind, name, namespace, verbs }) => ({ + kind: kind.value, + name, + namespace, + verbs: verbs.map(opt => opt.value), + }) + ); + break; } - role.spec.allow.node_labels = labels; - role.spec.allow.logins = spec.logins.map(opt => opt.value); + default: + kind satisfies never; } } return role; } +/** + * Converts a list of `LabelInput` value models to a set of labels, as + * represented in the role resource. + */ +export function labelsModelToLabels(uiLabels: UILabel[]): Labels { + const labels = {}; + for (const { name, value } of uiLabels) { + if (!Object.hasOwn(labels, name)) { + labels[name] = value; + } else if (typeof labels[name] === 'string') { + labels[name] = [labels[name], value]; + } else { + labels[name].push(value); + } + } + return labels; +} + /** Detects if fields were modified by comparing against the original role. */ export function hasModifiedFields( updated: RoleEditorModel, diff --git a/web/packages/teleport/src/services/resources/types.ts b/web/packages/teleport/src/services/resources/types.ts index 50a49ecdf757e..3c366d24aac01 100644 --- a/web/packages/teleport/src/services/resources/types.ts +++ b/web/packages/teleport/src/services/resources/types.ts @@ -62,10 +62,20 @@ export type Role = { export type RoleConditions = { node_labels?: Labels; logins?: string[]; + kubernetes_groups?: string[]; + kubernetes_labels?: Labels; + kubernetes_resources?: KubernetesResource[]; }; export type Labels = Record; +export type KubernetesResource = { + kind?: string; + name?: string; + namespace?: string; + verbs?: string[]; +}; + /** * Teleport role options in full format, as returned from Teleport API. Note * that its fields follow the snake case convention to match the wire format. From 94bc294831a392cf766eaa2e0d43949f2619085c Mon Sep 17 00:00:00 2001 From: Grzegorz Zdunek Date: Thu, 24 Oct 2024 17:20:58 +0200 Subject: [PATCH 53/70] Update Electron to 33.0.2 and Node.js to 20.18.0 (#47891) * Update `electron` to 33.0.2 * Update `node-abi` to 3.71.0 * Update Node.js to 20.18.0 --- build.assets/versions.mk | 2 +- pnpm-lock.yaml | 19 ++++++++++--------- web/packages/teleterm/package.json | 2 +- 3 files changed, 12 insertions(+), 11 deletions(-) diff --git a/build.assets/versions.mk b/build.assets/versions.mk index 90fc074ebfff9..08af10d8855a0 100644 --- a/build.assets/versions.mk +++ b/build.assets/versions.mk @@ -6,7 +6,7 @@ GOLANG_VERSION ?= go1.23.2 GOLANGCI_LINT_VERSION ?= v1.61.0 -NODE_VERSION ?= 20.17.0 +NODE_VERSION ?= 20.18.0 # Run lint-rust check locally before merging code after you bump this. RUST_VERSION ?= 1.81.0 diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml index 816d450b3185a..73be8e719cca5 100644 --- a/pnpm-lock.yaml +++ b/pnpm-lock.yaml @@ -449,8 +449,8 @@ importers: specifier: ^5.5.0 version: 5.5.0 electron: - specifier: 32.1.2 - version: 32.1.2 + specifier: 33.0.2 + version: 33.0.2 electron-builder: specifier: ^25.1.7 version: 25.1.7(electron-builder-squirrel-windows@25.1.7(dmg-builder@25.1.7)) @@ -3159,6 +3159,7 @@ packages: boolean@3.1.4: resolution: {integrity: sha512-3hx0kwU3uzG6ReQ3pnaFQPSktpBw6RHN3/ivDKEuU8g1XSfafowyvDnadjv1xp8IZqhtSukxlwv9bF6FhX8m0w==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. brace-expansion@1.1.11: resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} @@ -3785,8 +3786,8 @@ packages: '@swc/core': optional: true - electron@32.1.2: - resolution: {integrity: sha512-CXe6doFzhmh1U7daOvUzmF6Cj8hssdYWMeEPRnRO6rB9/bbwMlWctcQ7P8NJXhLQ88/vYUJQrJvlJPh8qM0BRQ==} + electron@33.0.2: + resolution: {integrity: sha512-C2WksfP0COsMHbYXSJG68j6S3TjuGDrw/YT42B526yXalIlNQZ2GeAYKryg6AEMkIp3p8TUfDRD0+HyiyCt/nw==} engines: {node: '>= 12.20.55'} hasBin: true @@ -5390,8 +5391,8 @@ packages: resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} engines: {node: '>= 0.6'} - node-abi@3.65.0: - resolution: {integrity: sha512-ThjYBfoDNr08AWx6hGaRbfPwxKV9kVzAzOzlLKbk2CuqXE2xnCh+cbAGnwM3t8Lq4v9rUB7VfondlkBckcJrVA==} + node-abi@3.71.0: + resolution: {integrity: sha512-SZ40vRiy/+wRTf21hxkkEjPJZpARzUMVcJoQse2EF8qkUWbbO2z7vd5oA/H6bVH6SZQ5STGcu0KRDS7biNRfxw==} engines: {node: '>=10'} node-addon-api@1.7.2: @@ -7968,7 +7969,7 @@ snapshots: detect-libc: 2.0.3 fs-extra: 10.1.0 got: 11.8.6 - node-abi: 3.65.0 + node-abi: 3.71.0 node-api-version: 0.2.0 node-gyp: 9.4.1 ora: 5.4.1 @@ -10961,7 +10962,7 @@ snapshots: transitivePeerDependencies: - supports-color - electron@32.1.2: + electron@33.0.2: dependencies: '@electron/get': 2.0.2 '@types/node': 20.16.10 @@ -13095,7 +13096,7 @@ snapshots: negotiator@0.6.3: {} - node-abi@3.65.0: + node-abi@3.71.0: dependencies: semver: 7.6.3 diff --git a/web/packages/teleterm/package.json b/web/packages/teleterm/package.json index a2212339a9e0e..e9d5872361508 100644 --- a/web/packages/teleterm/package.json +++ b/web/packages/teleterm/package.json @@ -45,7 +45,7 @@ "@types/whatwg-url": "^11.0.5", "@xterm/addon-fit": "^0.10.0", "@xterm/xterm": "^5.5.0", - "electron": "32.1.2", + "electron": "33.0.2", "electron-builder": "^25.1.7", "electron-vite": "^2.3.0", "events": "3.3.0", From 2d8a8bf73cee8c6dc65029609fb09f298281f94f Mon Sep 17 00:00:00 2001 From: Bartosz Leper Date: Thu, 24 Oct 2024 17:27:27 +0200 Subject: [PATCH 54/70] Add a multi-value input component (#47804) * Add Kubernetes access section to the role editor * Add a multi-value input component * Review * Update the k8s operator docs This also removes the mention of valid values of the Kind field, as I don't want the external documentation to point to Teleport source files. * Update operator CRDs and Terraform resources * Lint, licenses --- .../FieldMultiInput/FieldMultiInput.story.tsx | 37 +++++ .../FieldMultiInput/FieldMultiInput.test.tsx | 71 +++++++++ .../FieldMultiInput/FieldMultiInput.tsx | 139 ++++++++++++++++++ 3 files changed, 247 insertions(+) create mode 100644 web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx create mode 100644 web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx create mode 100644 web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx diff --git a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx new file mode 100644 index 0000000000000..5362236a8b24d --- /dev/null +++ b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.story.tsx @@ -0,0 +1,37 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import React, { useState } from 'react'; + +import Box from 'design/Box'; + +import { FieldMultiInput } from './FieldMultiInput'; + +export default { + title: 'Shared', +}; + +export function Story() { + const [items, setItems] = useState([]); + return ( + + + + ); +} +Story.storyName = 'FieldMultiInput'; diff --git a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx new file mode 100644 index 0000000000000..ce023a071053a --- /dev/null +++ b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.test.tsx @@ -0,0 +1,71 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import userEvent from '@testing-library/user-event'; +import React, { useState } from 'react'; + +import { render, screen } from 'design/utils/testing'; + +import { FieldMultiInput, FieldMultiInputProps } from './FieldMultiInput'; + +const TestFieldMultiInput = ({ + onChange, + ...rest +}: Partial) => { + const [items, setItems] = useState([]); + const handleChange = (it: string[]) => { + setItems(it); + onChange?.(it); + }; + return ; +}; + +test('adding, editing, and removing items', async () => { + const user = userEvent.setup(); + const onChange = jest.fn(); + render(); + + await user.type(screen.getByRole('textbox'), 'apples'); + expect(onChange).toHaveBeenLastCalledWith(['apples']); + + await user.click(screen.getByRole('button', { name: 'Add More' })); + expect(onChange).toHaveBeenLastCalledWith(['apples', '']); + + await user.type(screen.getAllByRole('textbox')[1], 'oranges'); + expect(onChange).toHaveBeenLastCalledWith(['apples', 'oranges']); + + await user.click(screen.getAllByRole('button', { name: 'Remove Item' })[0]); + expect(onChange).toHaveBeenLastCalledWith(['oranges']); + + await user.click(screen.getAllByRole('button', { name: 'Remove Item' })[0]); + expect(onChange).toHaveBeenLastCalledWith([]); +}); + +test('keyboard handling', async () => { + const user = userEvent.setup(); + const onChange = jest.fn(); + render(); + + await user.click(screen.getByRole('textbox')); + await user.keyboard('apples{Enter}oranges'); + expect(onChange).toHaveBeenLastCalledWith(['apples', 'oranges']); + + await user.click(screen.getAllByRole('textbox')[0]); + await user.keyboard('{Enter}bananas'); + expect(onChange).toHaveBeenLastCalledWith(['apples', 'bananas', 'oranges']); +}); diff --git a/web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx new file mode 100644 index 0000000000000..eaa98ef0a6511 --- /dev/null +++ b/web/packages/shared/components/FieldMultiInput/FieldMultiInput.tsx @@ -0,0 +1,139 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import Box from 'design/Box'; +import { ButtonSecondary } from 'design/Button'; +import ButtonIcon from 'design/ButtonIcon'; +import Flex from 'design/Flex'; +import * as Icon from 'design/Icon'; +import Input from 'design/Input'; +import { useRef } from 'react'; +import styled, { useTheme } from 'styled-components'; + +export type FieldMultiInputProps = { + label?: string; + value: string[]; + disabled?: boolean; + onChange?(val: string[]): void; +}; + +/** + * Allows editing a list of strings, one value per row. Use instead of + * `FieldSelectCreatable` when: + * + * - There are no predefined values to be picked from. + * - Values are expected to be relatively long and would be unreadable after + * being truncated. + */ +export function FieldMultiInput({ + label, + value, + disabled, + onChange, +}: FieldMultiInputProps) { + if (value.length === 0) { + value = ['']; + } + + const theme = useTheme(); + // Index of the input to be focused after the next rendering. + const toFocus = useRef(); + + const setFocus = element => { + element?.focus(); + toFocus.current = undefined; + }; + + function insertItem(index: number) { + onChange?.(value.toSpliced(index, 0, '')); + } + + function removeItem(index: number) { + onChange?.(value.toSpliced(index, 1)); + } + + function handleKeyDown(index: number, e: React.KeyboardEvent) { + if (e.key === 'Enter') { + insertItem(index + 1); + toFocus.current = index + 1; + } + } + + return ( + +
+ {label && {label}} + {value.map((val, i) => ( + // Note on keys: using index as a key is an anti-pattern in general, + // but here, we can safely assume that even though the list is + // editable, we don't rely on any unmanaged HTML element state other + // than focus, which we deal with separately anyway. The alternatives + // would be either to require an array with keys generated + // synthetically and injected from outside (which would make the API + // difficult to use) or to keep the array with generated IDs as local + // state (which would require us to write a prop/state reconciliation + // procedure whose complexity would probably outweigh the benefits). + + + + onChange?.( + value.map((v, j) => (j === i ? e.target.value : v)) + ) + } + onKeyDown={e => handleKeyDown(i, e)} + /> + + removeItem(i)} + disabled={disabled} + > + + + + ))} + insertItem(value.length)} + > + + Add More + +
+
+ ); +} + +const Fieldset = styled.fieldset` + border: none; + margin: 0; + padding: 0; + display: flex; + flex-direction: column; + gap: ${props => props.theme.space[2]}px; +`; + +const Legend = styled.legend` + margin: 0 0 ${props => props.theme.space[1]}px 0; + padding: 0; + ${props => props.theme.typography.body3} +`; From 55d0c7642373bfbde6aa4eaaab0348ee341018b7 Mon Sep 17 00:00:00 2001 From: Noah Stride Date: Thu, 24 Oct 2024 17:23:36 +0100 Subject: [PATCH 55/70] Workload ID: Guide for AWS JWT OIDC Federation (#47581) * Start hacking on AWS + Workload Identity JWT SVID guide * Add Roles Anywhere vs OIDC federation section * Set up links for AWS OIDC federation docs * Keep hacking on docs * Add AWS Console steps * Finish AWS OIDC federation guide * Update docs/pages/enroll-resources/workload-identity/aws-oidc-federation.mdx Co-authored-by: Paul Gottschling * Update docs/pages/enroll-resources/workload-identity/aws-oidc-federation.mdx Co-authored-by: Paul Gottschling * Use 1 for all OL elementss * Drop JWT from title * Split role and policy creation * Rewrite minimum version statement * Remove the word "simple" * Appease spell-checker --------- Co-authored-by: Paul Gottschling --- .../workload-identity/aws-oidc-federation.mdx | 461 ++++++++++++++++++ .../workload-identity/aws-roles-anywhere.mdx | 19 + .../gcp-workload-identity-federation-jwt.mdx | 5 + .../workload-identity/introduction.mdx | 5 +- .../workload-identity/jwt-svids.mdx | 4 +- 5 files changed, 491 insertions(+), 3 deletions(-) create mode 100644 docs/pages/enroll-resources/workload-identity/aws-oidc-federation.mdx diff --git a/docs/pages/enroll-resources/workload-identity/aws-oidc-federation.mdx b/docs/pages/enroll-resources/workload-identity/aws-oidc-federation.mdx new file mode 100644 index 0000000000000..6febebfaf106b --- /dev/null +++ b/docs/pages/enroll-resources/workload-identity/aws-oidc-federation.mdx @@ -0,0 +1,461 @@ +--- +title: Configuring Workload Identity and AWS OIDC Federation +description: Configuring AWS to accept Workload Identity JWTs as authentication using OIDC Federation +--- + + +Teleport Workload Identity is currently in Preview. This means that some +features may be missing. We're actively looking for design partners to help us +shape the future of Workload Identity and would love to +[hear your feedback](mailto:product@goteleport.com). + + +Teleport Workload Identity issues flexible short-lived identities in JWT format. +AWS OIDC Federation allows you to use these JWTs to authenticate to AWS +services. + +This can be useful in cases where a machine needs to securely authenticate with +AWS services without the use of a long-lived credential. This is because the +machine can authenticate with Teleport without using any shared secrets by +using one of our delegated join methods. + +In this guide, we'll configure Teleport Workload Identity and AWS to allow our +workload to authenticate to the AWS S3 API and upload content to a bucket. + +## How it works + +This implementation differs from using the Teleport Application Service to protect +AWS APIs in a few ways: + +- Requests to AWS are not proxied through the Teleport Proxy Service, meaning + reduced latency but also less visibility, as these requests will not be + recorded in Teleport's audit log. +- Workload Identity works with any AWS client, including the command-line tool + but also their SDKs. +- Using the Teleport Application Service to access AWS does not work with Machine + ID and therefore cannot be used when a machine needs to authenticate with AWS. + +## OIDC Federation vs Roles Anywhere + +The AWS platform offers two routes for workload identity federation: OIDC +Federation and Roles Anywhere. Teleport Workload Identity supports both of these +methods. + +There are a number of differences between the two methods: + +- OIDC Federation exchanges a JWT SVID for an AWS credential, whereas Roles + Anywhere exchanges an X509 SVID for an AWS credential. The use of X509 SVIDs + is generally considered more secure. +- OIDC Federation does not require the additional installation of an AWS + credential helper alongside workloads, whereas Roles Anywhere does. +- OIDC Federation requires that your Teleport Proxy Service is reachable by + AWS, whereas Roles Anywhere does not. + +This guide covers configuring OIDC federation. For Roles Anywhere, see +[Configuring Workload Identity and AWS Roles Anywhere](./aws-roles-anywhere.mdx). + +## Prerequisites + +(!docs/pages/includes/edition-prereqs-tabs.mdx!) + +- (!docs/pages/includes/tctl.mdx!) +- `tbot` must already be installed and configured on the host where the +workloads which need to access Teleport Workload Identity will run. For more +information, see the [deployment guides](../machine-id/deployment.mdx). + + +Issuing JWT SVIDs with Teleport Workload Identity requires at least Teleport +version 16.4.3. + + +### Deciding on a SPIFFE ID structure + +Within Teleport Workload Identity, all identities are represented using a +SPIFFE ID. This is a URI that uniquely identifies the entity that the identity +represents. The scheme is always `spiffe://`, and the host will be the name of +your Teleport cluster. The structure of the path of this URI is up to you. + +For the purposes of this guide, we will be granting access to AWS to the +`spiffe://example.teleport.sh/svc/example-service` SPIFFE ID. + +If you have already deployed Teleport Workload Identity, then you will already +have a SPIFFE ID structure in place. If you have not, then you will need to +decide on a structure for your SPIFFE IDs. + +If you are only using Teleport Workload Identity with AWS OIDC Federation, you +may structure your SPIFFE IDs so that they explicitly specify the AWS role they +are allowed to assume. However, it often makes more sense to name the workload +or person that will use the SPIFFE ID. See the +[best practices guide](./best-practices.mdx) for further advice. + +## Step 1/4. Configure AWS + +Configuring AWS OIDC Federation for the first time involves a few steps. Some of +these may not be necessary if you have previously configured AWS OIDC Federation +for your Teleport cluster. + +### Create an OpenID Connect Identity Provider + +First, you'll need to create an OIDC identity provider in AWS. This will define +a trust relationship between AWS and your Teleport cluster's Workload Identity +issuer. You can reuse this OIDC identity provider to grant different workloads +using Teleport Workload Identity access to AWS services. + +When configuring the provider, you need to specify the issuer URI. This will be +the public address of your Teleport Proxy Service with the path +`/workload-identity` appended. Your Teleport Proxy Service must be accessible +by AWS in order for OIDC federation to work. + + + + +Before you can configure the OIDC identity provider, you need to determine the +thumbprint of the TLS certificate used by your Teleport Proxy Service. You can +do this using `curl`: + +```code +$ curl https://example.teleport.sh/webapi/thumbprint +"example589ee4bf31a11b78c72b8d13f0example"% +``` + +Insert the following into a Terraform configuration file which has already +been configured to manage your AWS account: + +```hcl +resource "aws_iam_openid_connect_provider" "example_teleport_sh_workload_identity" { + // Replace "example.teleport.sh" with the hostname used to access your + // Teleport Proxy Service. + url = "https://example.teleport.sh/workload-identity" + + client_id_list = [ + "sts.amazonaws.com", + ] + + thumbprint_list = [ + // Replace with the thumbprint you determined using curl. + "example589ee4bf31a11b78c72b8d13f0example" + ] +} +``` + + + + +1. Browse to IAM +1. Select "Identity Providers" from the sidebar +1. Select "Add provider" +1. Select "OpenID Connect" as the "Provider type". +1. Specify the public hostname of your Teleport Proxy Service, with + "/workload-identity" appended as the "Provider URL", e.g + `https://example.teleport.sh/workload-identity` +1. Specify `sts.amazonaws.com` as the Audience +1. Click "Add Provider". + + + + +### Create an S3 bucket + +For the purposes of this guide, you'll be granting the workload access to an +AWS S3 bucket. Before we can dive into configuring the RBAC, we'll need to +create our bucket. + +You can omit this step if you wish to grant access to a different service +within AWS. + + + +```hcl +// Create an S3 bucket +resource "aws_s3_bucket" "example" { + // Replace "example" with a meaningful, unique name. + bucket = "workload-id-demo" +} +``` + + + +1. Browse to S3 +1. Select "Create bucket" +1. Enter a meaningful, unique name for your bucket, e.g `workload-id-demo` +1. Leave other settings as default +1. Click "Create bucket". + + + + +### Configure RBAC + +#### Create an IAM Policy + +First, create an IAM policy that will grant access to the S3 bucket. Later, +you'll attach this to a role that the workload will assume. + +The examples in this guide will create an IAM policy that will grant full access +to the example bucket. In a production environment, you should modify this to +grant the least privileges necessary. + + + + +Insert the following into your Terraform configuration file: + +```hcl +resource "aws_iam_policy" "example" { + // Choose a unique, meaningful name that describes what the policy grants + // access to. + name = "workload-id-s3-full-access" + path = "/" + + // This example policy grants full access to AWS S3. In production, you + // may wish to grant a less permissive policy. + policy = jsonencode({ + Version = "2012-10-17" + Statement = [{ + Action = "s3:*" + Effect = "Allow" + Resource = [ + aws_s3_bucket.workload_id_demo.arn, + "${aws_s3_bucket.workload_id_demo.arn}/*" + ] + }] + }) +} +``` + + + + +1. Browse to IAM +1. Select "Policies" from the sidebar +1. Click "Create policy" +1. Choose the "S3" service +1. Under "Actions allowed", choose "All S3 actions" +1. Under "Resources", choose "Specific" + 1. For "bucket" enter the name of the bucket you created earlier. + 1. For "object" enter the name of the bucket you created earlier and select + "All objects" +1. Click "Next" +1. Enter a unique and meaningful name for this policy, in our example, this will + be `workload-id-s3-full-access` +1. Click "Create policy" + + + + +#### Create an IAM Role + +Now, you'll create an IAM role. This role will be assumed by the workload +after it authenticates to AWS using the JWT SVID issued by Teleport Workload +Identity. + +When creating the IAM role, you'll define a trust policy that controls which +workload identities are able to assume the role. This policy will contain +conditions which will be evaluated against the claims within the JWT SVID +issued by Teleport Workload Identity. In our case, the only claim we want to +evaluate is the `sub` claim, which will contain our workload's SPIFFE ID. + +Finally, we'll attach the IAM policy we created earlier to this role to grant it +the privileges specified within the policy. + + + + +Insert the following into your Terraform configuration file: + +```hcl +// Create a role that the workload identity will assume. +resource "aws_iam_role" "example" { + // Choose a unique, meaningful name that describes the role and the workload + // that will assume it. + name = "workload-id-demo" + assume_role_policy = jsonencode({ + Version = "2012-10-17" + Statement = [{ + Effect = "Allow" + Principal = { + Federated = aws_iam_openid_connect_provider.example.arn + } + Action = "sts:AssumeRoleWithWebIdentity" + Condition = { + StringEquals = { + "${aws_iam_openid_connect_provider.example.url}:aud" = "sts.amazonaws.com" + "${aws_iam_openid_connect_provider.example.url}:sub" = "spiffe://example.teleport.sh/svc/example-service" + } + } + }] + }) +} + +// Attach the policy we created earlier to our role. +resource "aws_iam_role_policy_attachment" "example" { + role = aws_iam_role.example.name + policy_arn = aws_iam_policy.example.arn +} +``` + + + +1. Browse to IAM +1. Select "Roles" from the sidebar +1. Click "Create role" +1. Select "Web identity" for the "Trusted entity type" +1. Select your identity provider +1. Select the `sts.amazonaws.com` audience +1. Click "Add condition" + 1. Select `example.teleport.sh:sub` for the key + 1. Select "StringEquals" for the condition + 1. Enter the SPIFFE ID of your workload for the value. In our example, this + will be `spiffe://example.teleport.sh/svc/example +1. Click "Next" +1. Select the IAM policy you created earlier, and click "Next" +1. Enter a unique and meaningful name for this role, in our example, this will + be `workload-id-demo` +1. Click "Create role" + + + + +## Step 2/4. Configure Teleport RBAC + +Now we need to configure Teleport to allow a JWT to be issued containing the +SPIFFE ID we have chosen. + +Create `role.yaml` with the following content: + +```yaml +kind: role +version: v6 +metadata: + name: my-workload-aws +spec: + allow: + spiffe: + - path: /svc/example-service +``` + +Replace: + +- `my-workload-aws` with a descriptive name for the role. +- `/svc/example-service` with the path part of the SPIFFE ID you have chosen. + +Apply this role to your Teleport cluster using `tctl`: + +```code +$ tctl create -f role.yaml +``` + +You now need to assign this role to the bot: + +```code +$ tctl bots update my-bot --add-roles my-workload-aws +``` + +## Step 3/4. Issue Workload Identity JWTs + +You'll now configure `tbot` to issue and renew the short-lived JWT SVIDs for +your workload. It'll write the JWT as a file on disk, where you can then +configure AWS clients and SDKs to read it. + +Take your already deployed `tbot` service and configure it to issue SPIFFE SVIDs +by adding the following to the `tbot` configuration file: + +```yaml +outputs: + - type: spiffe-svid + destination: + type: directory + path: /opt/workload-identity + svid: + path: /svc/example-service + jwts: + - audience: sts.amazonaws.com + file_name: aws-jwt +``` + +Replace: + +- /opt/workload-identity with the directory where you want the JWT to be + written. +- /svc/example-service with the SPIFFE ID you have chosen. + +Restart your `tbot` service to apply the new configuration. You should see a +file created at `/opt/workload-identity/aws-jwt` containing the JWT. + +## Step 4/4. Configure AWS CLIs and SDKs + +Finally, you need to configure the AWS CLIs and SDKs to use the JWT SVID for +authentication. + +This can be done using the configuration file located at `~/.aws/config` or by +using environment variables. + +To proceed, you'll need to know the ARN of the role you created earlier. + + + + +Add the following to your `~/.aws/config` file: + +```ini +# You can replace "workload-id-demo" with a recognizable name that identifies +# your use-case. +[profile workload-id-demo] +# Replace with the ARN of the role you created earlier. +role_arn=arn:aws:iam:123456789012:role/workload-id-demo +# Replace with the directory and file name you configured `tbot` to write the +# JWT to. +web_identity_token_file=/opt/workload-identity/aws-jwt +``` + + + + +Configure the following environment variables: + +- `AWS_ROLE_ARN`: The ARN of the role you created earlier, e.g + `arn:aws:iam::123456789012:role/workload-id-demo` +- `AWS_WEB_IDENTITY_TOKEN_FILE`: The path to the JWT file that `tbot` is writing, + e.g `/opt/workload-identity/aws-jwt` + + + + +You can now test authenticating to the AWS S3 API. Create a file which you can +upload to your bucket: + +```code +$ echo "Hello, World!" > hello.txt +``` + +Now, use the AWS CLI to upload this file to your bucket: + +```code +$ aws s3 cp hello.txt s3://workload-id-demo +``` + +If everything is configured correctly, you should see this file uploaded to your +bucket: + +```code +$ aws s3 ls s3://workload-id-demo +``` + +Inspecting the audit logs on CloudTrail should indicate that the request +was authenticated using Workload Identity and specify the SPIFFE ID of the +workload that made the request. + +## Next steps + +- [AWS OIDC Federation](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_providers_oidc.html): +The official AWS documentation for OIDC federation. +- [AWS CLI documentation](https://docs.aws.amazon.com/cli/v1/userguide/cli-configure-role.html#cli-configure-role-oidc): +The official AWS CLI documentation for configuring a role to be assumed. +- [Workload Identity Overview](./introduction.mdx): Overview of Teleport +Workload Identity. +- [JWT SVID Overview](./jwt-svids.mdx): Overview of the JWT SVIDs issued by +Teleport Workload Identity. +- [Best Practices](./best-practices.mdx): Best practices for using Workload +Identity in Production. +- Read the [configuration reference](../../reference/machine-id/configuration.mdx) to explore +all the available configuration options. diff --git a/docs/pages/enroll-resources/workload-identity/aws-roles-anywhere.mdx b/docs/pages/enroll-resources/workload-identity/aws-roles-anywhere.mdx index bda4f7551b01f..56c7b7d23e97e 100644 --- a/docs/pages/enroll-resources/workload-identity/aws-roles-anywhere.mdx +++ b/docs/pages/enroll-resources/workload-identity/aws-roles-anywhere.mdx @@ -32,6 +32,25 @@ Whilst this guide is primarily aimed at allowing a machine to access AWS, the `tsh svid issue` command can be used in place of Machine ID to allow a human user to authenticate with using AWS Roles Anywhere. +## OIDC Federation vs Roles Anywhere + +The AWS platform offers two routes for workload identity federation: OIDC +Federation and Roles Anywhere. Teleport Workload Identity supports both of these +methods. + +There are a number of differences between the two methods: + +- Roles Anywhere exchanges an X509 SVID for an AWS credential, whereas OIDC + Federation exchanges a JWT SVID for an AWS credential. The use of X509 SVIDs + is generally considered more secure. +- Roles Anywhere requires the installation of an AWS credential helper alongside + the workloads, whereas OIDC Federation does not. +- Roles Anywhere does not require the Teleport Proxy Service to be reachable by + AWS, whereas OIDC Federation does. + +This guide covers configuring Roles Anywhere, for OIDC federation, see +[Configuring Workload Identity and AWS OIDC Federation](./aws-oidc-federation.mdx). + ## Prerequisites (!docs/pages/includes/edition-prereqs-tabs.mdx!) diff --git a/docs/pages/enroll-resources/workload-identity/gcp-workload-identity-federation-jwt.mdx b/docs/pages/enroll-resources/workload-identity/gcp-workload-identity-federation-jwt.mdx index 5126cda7a9fa0..95be984161a08 100644 --- a/docs/pages/enroll-resources/workload-identity/gcp-workload-identity-federation-jwt.mdx +++ b/docs/pages/enroll-resources/workload-identity/gcp-workload-identity-federation-jwt.mdx @@ -40,6 +40,11 @@ GCP APIs in a few ways: workloads which need to access Teleport Workload Identity will run. For more information, see the [deployment guides](../machine-id/deployment.mdx). + +Issuing JWT SVIDs with Teleport Workload Identity requires at minimum version +16.4.3. + + ### Deciding on a SPIFFE ID structure Within Teleport Workload Identity, all identities are represented using a diff --git a/docs/pages/enroll-resources/workload-identity/introduction.mdx b/docs/pages/enroll-resources/workload-identity/introduction.mdx index 000db4c9d5398..a2670483a5586 100644 --- a/docs/pages/enroll-resources/workload-identity/introduction.mdx +++ b/docs/pages/enroll-resources/workload-identity/introduction.mdx @@ -106,8 +106,9 @@ Learn how to configure Teleport Workload Identity for specific use-cases: - [Getting Started](./getting-started.mdx): How to configure Teleport for Workload Identity. - [TSH Support](./tsh.mdx): How to use `tsh` with Workload Identity to issue SVIDs to users. -- [AWS Roles Anywhere](./aws-roles-anywhere.mdx): Configuring AWS to accept Workload ID certificates as authentication using AWS Roles Anywhere. -- [GCP Workload Identity Federation](./gcp-workload-identity-federation-jwt.mdx): Configuring GCP to accept Workload ID JWTs as authentication using GCP Workload Identity Federation. +- [AWS Roles Anywhere](./aws-roles-anywhere.mdx): Configuring AWS to accept Workload Identity certificates as authentication using AWS Roles Anywhere. +- [AWS OIDC Federation](./aws-oidc-federation.mdx): Configuring AWS to accept Workload Identity JWTs as authentication using AWS OIDC Federation. +- [GCP Workload Identity Federation](./gcp-workload-identity-federation-jwt.mdx): Configuring GCP to accept Workload Identity JWTs as authentication using GCP Workload Identity Federation. ### Other resources diff --git a/docs/pages/enroll-resources/workload-identity/jwt-svids.mdx b/docs/pages/enroll-resources/workload-identity/jwt-svids.mdx index 83c6568e31822..c4a81d2023b44 100644 --- a/docs/pages/enroll-resources/workload-identity/jwt-svids.mdx +++ b/docs/pages/enroll-resources/workload-identity/jwt-svids.mdx @@ -9,6 +9,8 @@ One type of credential that can be issued by Teleport Workload Identity is a JWT SVID. This is a short-lived JSON Web Token (JWT) that contains the identity of the workload and is signed by the Teleport Workload Identity CA. +The ability is issue JWT SVIDs has been available since Teleport 16.4.3. + ## Claims The JWT contains the following claims: @@ -54,7 +56,7 @@ Teleport Proxy service as the issuer URL for OIDC configuration. We have tested Teleport Workload Identity issued JWT-SVIDs with the following platforms: -- AWS +- [AWS](./aws-oidc-federation.mdx) - [Google Cloud Platform](./gcp-workload-identity-federation-jwt.mdx) - Azure From 06622d82c77fd82ab88ef3d19305e625aab3aeb5 Mon Sep 17 00:00:00 2001 From: Sakshyam Shah Date: Thu, 24 Oct 2024 13:45:46 -0400 Subject: [PATCH 56/70] feat: support `audience` in `AWSOIDCIntegrationSpecV1` (#47725) * feat: support origin label when creating a new aws oidc integration * lint: swap require.Equal values * lint: swap require.Equal values * feat: add audiences field in AWSOIDCIntegrationSpecV1 * add more context to the audiences field commentry * make audience a single value field * run make fix-imports --- api/proto/teleport/legacy/types/types.proto | 8 + api/types/integration.go | 23 + api/types/integration_test.go | 54 ++ api/types/types.pb.go | 719 ++++++++++-------- lib/web/integrations.go | 5 +- lib/web/intgrations_test.go | 90 +++ lib/web/ui/integration.go | 9 + .../integrations/integrations.test.ts | 35 +- .../src/services/integrations/integrations.ts | 1 + .../src/services/integrations/types.ts | 14 + 10 files changed, 618 insertions(+), 340 deletions(-) create mode 100644 lib/web/intgrations_test.go diff --git a/api/proto/teleport/legacy/types/types.proto b/api/proto/teleport/legacy/types/types.proto index a51edd0cfa11c..84c235be5120e 100644 --- a/api/proto/teleport/legacy/types/types.proto +++ b/api/proto/teleport/legacy/types/types.proto @@ -7275,6 +7275,14 @@ message AWSOIDCIntegrationSpecV1 { (gogoproto.jsontag) = "issuer_s3_uri,omitempty", deprecated = true ]; + + // Audience is used to record a name of a plugin or a discover service in Teleport + // that depends on this integration. + // Audience value can be empty or configured with supported preset audience type. + // Preset audience may impose specific behavior on the integration CRUD API, + // such as preventing integration from update or deletion. Empty audience value + // should be treated as a default and backward-compatible behavior of the integration. + string audience = 3 [(gogoproto.jsontag) = "audience,omitempty"]; } // AzureOIDCIntegrationSpecV1 contains the spec properties for the Azure OIDC SubKind Integration. diff --git a/api/types/integration.go b/api/types/integration.go index 189ecd959438e..8a70b6f63337d 100644 --- a/api/types/integration.go +++ b/api/types/integration.go @@ -34,6 +34,14 @@ const ( IntegrationSubKindAzureOIDC = "azure-oidc" ) +const ( + // IntegrationAWSOIDCAudienceUnspecified denotes an empty audience value. Empty audience value + // is used to maintain default OIDC integration behavior and backward compatibility. + IntegrationAWSOIDCAudienceUnspecified = "" + // IntegrationAWSOIDCAudienceAWSIdentityCenter is an audience name for the Teleport AWS Idenity Center plugin. + IntegrationAWSOIDCAudienceAWSIdentityCenter = "aws-identity-center" +) + // Integration specifies is a connection configuration between Teleport and a 3rd party system. type Integration interface { ResourceWithLabels @@ -189,9 +197,24 @@ func (s *IntegrationSpecV1_AWSOIDC) CheckAndSetDefaults() error { } } + if err := s.ValidateAudience(); err != nil { + return trace.Wrap(err) + } + return nil } +// ValidateAudience validates if the audience field is configured with +// a supported audience value. +func (s *IntegrationSpecV1_AWSOIDC) ValidateAudience() error { + switch s.AWSOIDC.Audience { + case IntegrationAWSOIDCAudienceUnspecified, IntegrationAWSOIDCAudienceAWSIdentityCenter: + return nil + default: + return trace.BadParameter("unsupported audience value %q", s.AWSOIDC.Audience) + } +} + // Validate validates the configuration for Azure OIDC integration subkind. func (s *IntegrationSpecV1_AzureOIDC) Validate() error { if s == nil || s.AzureOIDC == nil { diff --git a/api/types/integration_test.go b/api/types/integration_test.go index b64cbc7688315..4cded6391fed7 100644 --- a/api/types/integration_test.go +++ b/api/types/integration_test.go @@ -102,6 +102,45 @@ func TestIntegrationCheckAndSetDefaults(t *testing.T) { AWSOIDC: &AWSOIDCIntegrationSpecV1{ RoleARN: "some arn role", IssuerS3URI: "s3://my-issuer/my-prefix", + Audience: "", + }, + }, + }, + } + }, + expectedErrorIs: noErrorFunc, + }, + { + name: "aws-oidc: valid with supported audience value", + integration: func(name string) (*IntegrationV1, error) { + return NewIntegrationAWSOIDC( + Metadata{ + Name: name, + }, + &AWSOIDCIntegrationSpecV1{ + RoleARN: "some arn role", + IssuerS3URI: "s3://my-issuer/my-prefix", + Audience: IntegrationAWSOIDCAudienceAWSIdentityCenter, + }, + ) + }, + expectedIntegration: func(name string) *IntegrationV1 { + return &IntegrationV1{ + ResourceHeader: ResourceHeader{ + Kind: KindIntegration, + SubKind: IntegrationSubKindAWSOIDC, + Version: V1, + Metadata: Metadata{ + Name: name, + Namespace: defaults.Namespace, + }, + }, + Spec: IntegrationSpecV1{ + SubKindSpec: &IntegrationSpecV1_AWSOIDC{ + AWSOIDC: &AWSOIDCIntegrationSpecV1{ + RoleARN: "some arn role", + IssuerS3URI: "s3://my-issuer/my-prefix", + Audience: IntegrationAWSOIDCAudienceAWSIdentityCenter, }, }, }, @@ -163,6 +202,21 @@ func TestIntegrationCheckAndSetDefaults(t *testing.T) { }, expectedErrorIs: trace.IsBadParameter, }, + { + name: "aws-oidc: error when invalid audience value is provided", + integration: func(name string) (*IntegrationV1, error) { + return NewIntegrationAWSOIDC( + Metadata{ + Name: name, + }, + &AWSOIDCIntegrationSpecV1{ + RoleARN: "some-role", + Audience: "testvalue", + }, + ) + }, + expectedErrorIs: trace.IsBadParameter, + }, { name: "azure-oidc: valid", integration: func(name string) (*IntegrationV1, error) { diff --git a/api/types/types.pb.go b/api/types/types.pb.go index ce1a982a8b029..40aae2aaf43ae 100644 --- a/api/types/types.pb.go +++ b/api/types/types.pb.go @@ -19216,7 +19216,14 @@ type AWSOIDCIntegrationSpecV1 struct { // Amazon had some whitelisted providers where the thumbprint was ignored. S3 hosted providers was in that list. // Amazon is now trusting all the root certificate authorities, and this workaround is no longer needed. // DELETE IN 18.0. - IssuerS3URI string `protobuf:"bytes,2,opt,name=IssuerS3URI,proto3" json:"issuer_s3_uri,omitempty"` // Deprecated: Do not use. + IssuerS3URI string `protobuf:"bytes,2,opt,name=IssuerS3URI,proto3" json:"issuer_s3_uri,omitempty"` // Deprecated: Do not use. + // Audience is used to record a name of a plugin or a discover service in Teleport + // that depends on this integration. + // Audience value can be empty or configured with supported preset audience type. + // Preset audience may impose specific behavior on the integration CRUD API, + // such as preventing integration from update or deletion. Empty audience value + // should be treated as a default and backward-compatible behavior of the integration. + Audience string `protobuf:"bytes,3,opt,name=audience,proto3" json:"audience,omitempty"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` XXX_sizecache int32 `json:"-"` @@ -20744,7 +20751,7 @@ func init() { func init() { proto.RegisterFile("teleport/legacy/types/types.proto", fileDescriptor_9198ee693835762e) } var fileDescriptor_9198ee693835762e = []byte{ - // 29014 bytes of a gzipped FileDescriptorProto + // 29031 bytes of a gzipped FileDescriptorProto 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xec, 0xbd, 0x6b, 0x70, 0x1c, 0x49, 0x7a, 0x20, 0x36, 0xdd, 0x8d, 0x47, 0xe3, 0xc3, 0xab, 0x91, 0x00, 0x49, 0x10, 0x33, 0x64, 0x73, 0x6a, 0x66, 0x38, 0xe4, 0xec, 0x0c, 0xb9, 0x04, 0x77, 0xb8, 0x3b, 0x3b, 0xaf, 0x6d, 0x3c, 0x48, @@ -22227,338 +22234,339 @@ var fileDescriptor_9198ee693835762e = []byte{ 0x7b, 0x66, 0x48, 0x0e, 0xdf, 0xf0, 0xa3, 0x59, 0xbb, 0xda, 0xa5, 0xc8, 0x5d, 0xae, 0xb6, 0xf7, 0xc3, 0xbb, 0x23, 0x4b, 0xf2, 0xae, 0x22, 0x4b, 0x2b, 0x47, 0x96, 0x9b, 0x33, 0x3d, 0x9c, 0x5e, 0xce, 0x97, 0xba, 0x7b, 0x48, 0xaf, 0x64, 0xbb, 0x33, 0xe2, 0x34, 0xc9, 0x89, 0x87, 0x33, 0xe3, - 0xf9, 0xd0, 0x7a, 0x85, 0x00, 0xf9, 0x02, 0x6c, 0x20, 0x89, 0xe3, 0xc4, 0x09, 0x10, 0x23, 0x08, - 0x90, 0x43, 0x84, 0x20, 0x87, 0xfc, 0x05, 0x49, 0x2e, 0xb9, 0x09, 0x30, 0x0c, 0xf8, 0x90, 0x53, - 0x02, 0x08, 0x89, 0x80, 0xe4, 0x90, 0xe4, 0x16, 0xc4, 0x07, 0x9f, 0x82, 0x7a, 0x55, 0xd5, 0x5d, - 0xfd, 0x31, 0xb3, 0x5c, 0xad, 0x94, 0xc4, 0x80, 0x4f, 0xe4, 0x54, 0xbd, 0xaa, 0xae, 0xef, 0x7a, - 0xef, 0xd5, 0x7b, 0xbf, 0x77, 0x78, 0xe2, 0xf1, 0x35, 0xa9, 0x25, 0x0e, 0xf5, 0x60, 0x60, 0xdb, - 0x75, 0x69, 0x94, 0x07, 0x03, 0x7b, 0xd4, 0x17, 0xbf, 0x0b, 0xb4, 0x38, 0x6f, 0x43, 0x1b, 0xb6, - 0x66, 0x94, 0x94, 0x8e, 0x05, 0x45, 0x3e, 0x16, 0x6e, 0x81, 0x7a, 0xe4, 0xb5, 0x29, 0xc7, 0xeb, - 0xb5, 0xb1, 0x69, 0xef, 0xdd, 0x65, 0x11, 0xd1, 0xad, 0x55, 0x3f, 0xdd, 0x1e, 0xf5, 0xf7, 0xef, - 0xf2, 0xaf, 0x9c, 0x8a, 0x0b, 0x4d, 0x66, 0xe3, 0xc9, 0x8b, 0x70, 0x2e, 0x02, 0xf0, 0x11, 0x78, - 0x8c, 0x5b, 0xeb, 0x34, 0x2b, 0x0c, 0x07, 0x75, 0x15, 0x96, 0xc5, 0x9c, 0x0f, 0x7d, 0xbf, 0x33, - 0x2b, 0xc7, 0xd3, 0xe8, 0x9e, 0xe2, 0x9f, 0x9b, 0x88, 0x4e, 0x25, 0x4a, 0x00, 0x67, 0xe0, 0x94, - 0xc9, 0x0b, 0x40, 0x7c, 0xae, 0xdc, 0x3f, 0x06, 0xf8, 0x07, 0xd7, 0x45, 0x8e, 0xbf, 0x7f, 0xf9, - 0x67, 0xff, 0x2e, 0x05, 0xe7, 0x12, 0x44, 0x07, 0xca, 0xe2, 0x77, 0x7a, 0x63, 0xef, 0x98, 0x09, - 0x08, 0x72, 0x27, 0xd7, 0xa4, 0x74, 0xae, 0x0f, 0x5a, 0x60, 0x11, 0xbf, 0xf9, 0xb7, 0xf8, 0x2f, - 0x7a, 0x34, 0xb4, 0x86, 0x42, 0xd5, 0x41, 0xff, 0x25, 0x26, 0xac, 0x63, 0x18, 0x83, 0x51, 0xa7, - 0x8f, 0xd1, 0x10, 0x90, 0xc5, 0xc8, 0x84, 0x04, 0x2e, 0x6c, 0x45, 0x43, 0x22, 0xa2, 0x3c, 0x86, - 0xa5, 0x0e, 0x22, 0x29, 0xe4, 0x4b, 0xb0, 0x29, 0xdd, 0x24, 0x6e, 0x64, 0x5f, 0xa1, 0x65, 0xb9, - 0x75, 0xb1, 0xe5, 0xdf, 0x29, 0xc5, 0xd0, 0x0e, 0xdb, 0x81, 0x6d, 0x9c, 0xc4, 0x4e, 0x7b, 0xe0, - 0xc6, 0xe2, 0x5e, 0x60, 0x57, 0x19, 0x50, 0xfc, 0x26, 0xa5, 0x32, 0xdb, 0x83, 0x48, 0x08, 0x0c, - 0xda, 0x6b, 0x3e, 0x7c, 0xef, 0xc0, 0x33, 0x89, 0x2d, 0xa6, 0xd7, 0x07, 0x1a, 0x2e, 0x05, 0x9c, - 0xcf, 0x22, 0xfd, 0x4d, 0x59, 0x9f, 0xab, 0xb0, 0xfc, 0xae, 0xd7, 0x1a, 0x7a, 0x43, 0x7e, 0x2f, - 0xf3, 0x25, 0xc1, 0xd2, 0xe4, 0x6b, 0xf9, 0x2f, 0x53, 0x42, 0xe8, 0xd9, 0xe9, 0xf7, 0xc7, 0xa3, - 0xf1, 0xb0, 0x35, 0x08, 0xa9, 0x5b, 0xc8, 0x29, 0x3c, 0x8b, 0x3c, 0xc1, 0x5d, 0x84, 0xc9, 0xef, - 0x0f, 0x05, 0x2e, 0xc0, 0xa1, 0xb0, 0xb5, 0xcd, 0xdd, 0x7d, 0x29, 0xcc, 0xb5, 0xe8, 0x94, 0x5a, - 0x97, 0x89, 0x29, 0x8f, 0x2e, 0xd5, 0x5a, 0x9e, 0xb3, 0x2e, 0xb2, 0x3a, 0x63, 0x54, 0xa4, 0x9c, - 0xd0, 0xf0, 0xa8, 0xbe, 0x65, 0x27, 0xe8, 0x45, 0xb8, 0x56, 0xb9, 0x7f, 0xe4, 0xcb, 0xb0, 0xd4, - 0x69, 0xcb, 0xd1, 0xe0, 0xa2, 0x92, 0xbe, 0xd9, 0x66, 0x88, 0xb4, 0x41, 0x1d, 0xe5, 0x39, 0x2b, - 0xdb, 0xe1, 0xa9, 0x3b, 0x2b, 0x21, 0xc5, 0x94, 0xb6, 0x23, 0xf8, 0xeb, 0x78, 0x31, 0xb2, 0x0a, - 0x29, 0xff, 0x24, 0x48, 0x75, 0xda, 0x74, 0xb5, 0x8e, 0x24, 0x4c, 0x5c, 0x8b, 0xff, 0xd2, 0x7e, - 0x0d, 0x6e, 0x9d, 0x75, 0x8c, 0xe8, 0x4e, 0x9b, 0x32, 0xe0, 0x4b, 0xd6, 0x7a, 0x2b, 0x36, 0x6e, - 0x57, 0x41, 0x86, 0xf4, 0xec, 0x88, 0x09, 0x17, 0x69, 0xcd, 0x61, 0x47, 0xfb, 0xad, 0x34, 0xac, - 0x86, 0x55, 0x71, 0xe4, 0x79, 0xc8, 0xf8, 0xd5, 0xae, 0xfa, 0x4f, 0x46, 0x32, 0x11, 0xad, 0xdc, - 0x42, 0x22, 0xca, 0xf3, 0xe0, 0x0b, 0xb3, 0x7b, 0x2a, 0xbf, 0xea, 0x58, 0xcb, 0x98, 0x28, 0x5e, - 0x73, 0xee, 0xc3, 0x2a, 0x1a, 0x07, 0xe1, 0x65, 0x3a, 0xee, 0x70, 0x05, 0xef, 0x6c, 0x1d, 0x7d, - 0xf6, 0xc3, 0x8f, 0xae, 0xcc, 0xa1, 0x3a, 0x7e, 0x99, 0x96, 0xa5, 0xf7, 0x19, 0xcd, 0x94, 0x34, - 0x2d, 0x99, 0xe9, 0x9a, 0x16, 0xde, 0x95, 0x29, 0x9a, 0x96, 0xf9, 0x19, 0x9a, 0x96, 0xa0, 0xa4, - 0xac, 0x69, 0x41, 0x7d, 0xdb, 0xe2, 0x34, 0x7d, 0x5b, 0x50, 0x86, 0xe9, 0xdb, 0xae, 0xf3, 0xee, - 0x0e, 0x5b, 0x0f, 0x5d, 0x1c, 0x07, 0xbe, 0xab, 0xb1, 0x23, 0x56, 0xeb, 0x21, 0xbe, 0xc5, 0xef, - 0x2c, 0x81, 0x78, 0xc0, 0xd7, 0xfe, 0x48, 0x89, 0xa8, 0x29, 0xc4, 0x54, 0xdc, 0x80, 0xd5, 0xce, - 0x29, 0x95, 0x9f, 0xbc, 0xb6, 0xc4, 0x08, 0xaf, 0x58, 0x2b, 0x22, 0x95, 0x31, 0xc3, 0x9f, 0x83, - 0x35, 0x9f, 0x8c, 0xf3, 0x83, 0xe8, 0xd8, 0x63, 0xf9, 0xa5, 0x39, 0x4a, 0xc5, 0xf3, 0xb0, 0xee, - 0x13, 0x72, 0x51, 0x93, 0xf1, 0xc2, 0x2b, 0x96, 0x2a, 0x32, 0x1a, 0x3c, 0x5d, 0x3b, 0x8e, 0xb2, - 0x45, 0x9f, 0x51, 0xab, 0xb4, 0xbf, 0x4f, 0x87, 0x44, 0x38, 0xf1, 0x99, 0x1d, 0xc8, 0xd1, 0xdb, - 0x92, 0x0f, 0x12, 0x3f, 0x56, 0xae, 0x4e, 0x19, 0x7e, 0x6e, 0x02, 0x61, 0xdb, 0x75, 0x0b, 0x46, - 0xa3, 0xbe, 0xb0, 0x88, 0x70, 0x19, 0x43, 0xc0, 0xd8, 0x72, 0x5c, 0x7e, 0xa2, 0x3a, 0x76, 0x86, - 0xe4, 0x67, 0x57, 0x27, 0x78, 0x68, 0xba, 0xfa, 0x90, 0x31, 0xf0, 0x7f, 0x89, 0x0f, 0x34, 0x01, - 0x35, 0x1e, 0xa3, 0x70, 0xe5, 0xe9, 0x04, 0xc6, 0x2e, 0x56, 0x39, 0x8e, 0x12, 0xd6, 0xac, 0x4e, - 0xc4, 0xbf, 0xa2, 0x5a, 0x03, 0x96, 0x51, 0x80, 0x12, 0x15, 0x66, 0x12, 0x34, 0x76, 0xf1, 0xce, - 0x17, 0xcc, 0xaa, 0x95, 0xa3, 0xe5, 0x44, 0x35, 0x27, 0xf0, 0xac, 0x2c, 0xf6, 0x84, 0x1b, 0x39, - 0x2f, 0x40, 0x37, 0x67, 0x8e, 0x40, 0x20, 0x1d, 0x61, 0x53, 0x2f, 0xb4, 0xc2, 0x09, 0x9c, 0x4c, - 0x3b, 0x81, 0xcd, 0xe9, 0x53, 0x32, 0x23, 0xa0, 0x4b, 0xc0, 0x33, 0xa5, 0x64, 0x9e, 0x49, 0x16, - 0x82, 0xd2, 0x21, 0x21, 0x48, 0xfb, 0x8b, 0x34, 0x5c, 0x3b, 0xc3, 0x74, 0xcd, 0xf8, 0xe6, 0x57, - 0x20, 0xc7, 0xde, 0x19, 0xd8, 0xf1, 0x99, 0x0a, 0xb1, 0xad, 0xb4, 0x52, 0x7e, 0xd6, 0x51, 0x16, - 0x3a, 0x38, 0xef, 0x60, 0xe4, 0xff, 0x4f, 0x7e, 0x05, 0xd6, 0xd8, 0x81, 0xc6, 0xac, 0x98, 0x8e, - 0x26, 0xdd, 0x33, 0x9c, 0x68, 0x5b, 0xc2, 0xe5, 0x22, 0x52, 0x14, 0x0f, 0x39, 0x3c, 0x31, 0x6c, - 0x3f, 0x8d, 0x38, 0x90, 0x43, 0xb2, 0xa3, 0x56, 0xa7, 0x7b, 0x26, 0xdb, 0x7f, 0xe1, 0xd0, 0x21, - 0x17, 0x63, 0xc6, 0x97, 0x34, 0xa1, 0x84, 0xbf, 0xc9, 0x4d, 0x58, 0xeb, 0x4d, 0x4e, 0xa9, 0xdc, - 0xc8, 0xd6, 0x02, 0x7f, 0x2c, 0x9e, 0xb7, 0x56, 0x7a, 0x93, 0x53, 0x7d, 0x30, 0xc0, 0x29, 0xc5, - 0x57, 0xe5, 0x75, 0x4a, 0xc7, 0x76, 0xad, 0xa0, 0x5c, 0x40, 0x4a, 0x5a, 0x01, 0xdb, 0xb7, 0x9c, - 0xf6, 0x3c, 0x30, 0x1b, 0x23, 0x1e, 0xd0, 0x86, 0xfd, 0xd0, 0x7e, 0x9a, 0x12, 0xec, 0xfa, 0xf4, - 0x75, 0xff, 0x8b, 0x29, 0x4a, 0x98, 0xa2, 0x5b, 0xa0, 0xd2, 0xa1, 0x0f, 0x0e, 0x15, 0x7f, 0x8e, - 0x56, 0x7b, 0x93, 0x53, 0x7f, 0xec, 0xe4, 0x81, 0x5f, 0x90, 0x07, 0xfe, 0x55, 0xc1, 0xce, 0x27, - 0x1e, 0x0f, 0xd3, 0x87, 0x5c, 0xfb, 0xcf, 0x34, 0xdc, 0x3c, 0xdb, 0x21, 0xf0, 0x8b, 0x79, 0x4b, - 0x98, 0xb7, 0x88, 0x5e, 0x67, 0x3e, 0xa6, 0xd7, 0x49, 0xd8, 0x7b, 0x0b, 0x49, 0x7b, 0x2f, 0xa6, - 0x45, 0x5a, 0x4c, 0xd0, 0x22, 0x25, 0x6e, 0xd0, 0xec, 0x63, 0x36, 0xe8, 0x92, 0xbc, 0x4e, 0xfe, - 0xcd, 0x97, 0xbf, 0xc2, 0xac, 0xfd, 0x3b, 0x70, 0x4e, 0xb0, 0xf6, 0xec, 0xe6, 0x08, 0x94, 0x83, - 0xb9, 0xbb, 0xb7, 0x93, 0x98, 0x7a, 0x24, 0x4b, 0x60, 0xbc, 0xd7, 0x39, 0x3b, 0x1f, 0xe4, 0xff, - 0xff, 0x61, 0xe4, 0xc9, 0x03, 0xb8, 0x80, 0x70, 0xd0, 0x87, 0xb2, 0x5a, 0xd3, 0x1d, 0x7a, 0x47, - 0x7c, 0x3d, 0x5c, 0x8d, 0xb1, 0xbd, 0x9d, 0x43, 0xa9, 0x39, 0x96, 0x77, 0x54, 0x9e, 0xb3, 0xce, - 0x8f, 0x12, 0xd2, 0xa3, 0x32, 0xc2, 0x5f, 0x2b, 0xa0, 0x3d, 0x7e, 0xbc, 0x50, 0xce, 0x8e, 0x0e, - 0x38, 0x95, 0xb3, 0xa5, 0xd1, 0xbb, 0x06, 0x2b, 0x43, 0xef, 0x68, 0xe8, 0x8d, 0x4e, 0x42, 0x02, - 0xdc, 0x32, 0x4f, 0x14, 0x03, 0x23, 0x40, 0xe9, 0x9e, 0x88, 0xc9, 0x16, 0x85, 0xb4, 0x92, 0x2f, - 0xfa, 0x25, 0xce, 0x03, 0x5d, 0x4d, 0x72, 0x03, 0xd9, 0x8f, 0xfb, 0x99, 0x6c, 0x4a, 0x4d, 0x5b, - 0x1c, 0x3a, 0xef, 0xa8, 0xd3, 0xf5, 0xb4, 0xbf, 0x51, 0x04, 0x47, 0x90, 0x34, 0x78, 0xe4, 0x1d, - 0xc9, 0xf6, 0x2f, 0x1d, 0x63, 0x43, 0x92, 0x8a, 0xc8, 0x66, 0x52, 0x1c, 0xcd, 0x0d, 0x13, 0x42, - 0x68, 0x6e, 0x98, 0xf2, 0x14, 0x06, 0x4c, 0x5c, 0x00, 0xbe, 0x27, 0x0c, 0x08, 0xe8, 0x99, 0xb7, - 0x7f, 0x87, 0xdc, 0x86, 0x45, 0x66, 0x33, 0x20, 0x9a, 0xbb, 0x16, 0x6a, 0xee, 0xfe, 0x1d, 0x4b, - 0xe4, 0x6b, 0x3f, 0xf4, 0x35, 0x71, 0xb1, 0x4e, 0xec, 0xdf, 0x21, 0xaf, 0x9e, 0xcd, 0x96, 0x2f, - 0x2b, 0x6c, 0xf9, 0x7c, 0x3b, 0xbe, 0xd7, 0x42, 0x76, 0x7c, 0xd7, 0x67, 0x8f, 0x16, 0x7f, 0x2a, - 0x61, 0xe8, 0x65, 0x01, 0xaa, 0xcd, 0x4f, 0x15, 0xb8, 0x3c, 0xb3, 0x04, 0xb9, 0x04, 0x59, 0xbd, - 0x61, 0x3a, 0xc1, 0xfc, 0xd2, 0x3d, 0x23, 0x52, 0xc8, 0x2e, 0x2c, 0xed, 0xb4, 0x46, 0x9d, 0x43, - 0xba, 0x8c, 0x13, 0x75, 0x97, 0xb1, 0x6a, 0x7d, 0xf2, 0xf2, 0x9c, 0x15, 0x94, 0x25, 0x2e, 0xac, - 0xe3, 0x5e, 0x08, 0x45, 0x8a, 0x49, 0x27, 0xa8, 0x0d, 0x62, 0x15, 0xc6, 0x8a, 0xd1, 0x73, 0x26, - 0x96, 0x18, 0xdd, 0x82, 0xef, 0x09, 0x5e, 0x64, 0x7a, 0x03, 0x9f, 0x00, 0x86, 0xf1, 0x16, 0x64, - 0x1b, 0xe2, 0x11, 0x53, 0x32, 0x7e, 0x15, 0x0f, 0x96, 0x96, 0x9f, 0xab, 0xfd, 0x9e, 0x22, 0x64, - 0xfb, 0xc7, 0x77, 0x44, 0x0a, 0xb2, 0xd3, 0x9e, 0x1d, 0x64, 0xa7, 0xfd, 0x09, 0x83, 0xec, 0x68, - 0x7f, 0xc5, 0x41, 0x92, 0xcd, 0x76, 0x23, 0xa2, 0x58, 0x7a, 0x5a, 0x23, 0x66, 0x23, 0xb4, 0x3a, - 0xaf, 0x49, 0x41, 0xda, 0xe2, 0xdf, 0x9a, 0x6e, 0xcb, 0x2c, 0x2d, 0xd5, 0x3f, 0x49, 0xc3, 0xa5, - 0x59, 0xc5, 0x13, 0xc3, 0xc0, 0x2a, 0x4f, 0x16, 0x06, 0xf6, 0x36, 0x64, 0x59, 0x9a, 0x6f, 0xa1, - 0x8b, 0x03, 0xce, 0x8b, 0xd2, 0x01, 0x17, 0xd9, 0xe4, 0x1a, 0x2c, 0xe8, 0x05, 0x3b, 0x88, 0x4c, - 0x84, 0xa6, 0x74, 0xad, 0xc3, 0x11, 0x1a, 0x69, 0xf1, 0x2c, 0xf2, 0x8d, 0x78, 0x30, 0x2e, 0x1e, - 0x92, 0x68, 0x4b, 0x1a, 0x90, 0x18, 0x7e, 0x39, 0xb6, 0x37, 0xc0, 0xdb, 0xe6, 0x10, 0xb6, 0x56, - 0x3c, 0xb0, 0x97, 0x06, 0x0b, 0x8d, 0xa1, 0x37, 0xf2, 0xc6, 0xb2, 0x99, 0xdb, 0x00, 0x53, 0x2c, - 0x9e, 0xc3, 0x8d, 0xd0, 0x5a, 0x8f, 0x98, 0xcf, 0xf1, 0x82, 0x8c, 0x03, 0x81, 0x56, 0x6b, 0x34, - 0xd9, 0x92, 0x48, 0x68, 0x81, 0x4a, 0x6b, 0xd2, 0x3b, 0x3c, 0x69, 0x5a, 0x15, 0xce, 0x6a, 0xb0, - 0x02, 0x5d, 0x4c, 0xa5, 0x1d, 0x1c, 0x59, 0x12, 0x89, 0xf6, 0x5d, 0x05, 0xce, 0x27, 0xf5, 0x83, - 0x5c, 0x82, 0x4c, 0x2f, 0x31, 0xee, 0x58, 0x8f, 0xb9, 0x4a, 0xe6, 0xe8, 0x5f, 0xf7, 0xa8, 0x3f, - 0x3c, 0x6d, 0x8d, 0x65, 0x63, 0x40, 0x29, 0xd9, 0x02, 0xfa, 0xa3, 0x84, 0xff, 0x93, 0x2b, 0xe2, - 0x8c, 0x4e, 0xc7, 0x22, 0x95, 0xe1, 0x1f, 0x4d, 0x07, 0x30, 0xdb, 0x8d, 0xfa, 0x80, 0xe1, 0x67, - 0xbf, 0x0c, 0x19, 0xda, 0xac, 0xc8, 0xea, 0xa5, 0xeb, 0x47, 0xaf, 0x56, 0x38, 0x11, 0x6b, 0xd5, - 0xa8, 0x75, 0xda, 0xb5, 0x90, 0x58, 0x3b, 0x80, 0xd5, 0x30, 0x05, 0x31, 0xc2, 0x88, 0x8b, 0xb9, - 0xbb, 0x2a, 0xaf, 0x69, 0xa7, 0xdf, 0x67, 0x06, 0xe9, 0x3b, 0xcf, 0xfe, 0xe3, 0x47, 0x57, 0x80, - 0xfe, 0x64, 0x65, 0x92, 0x10, 0x19, 0xb5, 0xef, 0xa7, 0xe0, 0x7c, 0xe0, 0x03, 0x2b, 0xf6, 0xd0, - 0xcf, 0xad, 0x43, 0x96, 0x1e, 0x72, 0x18, 0x12, 0x8c, 0x56, 0xbc, 0x83, 0x33, 0xfc, 0x14, 0x76, - 0x61, 0x63, 0x1a, 0x3d, 0x79, 0x1e, 0x96, 0x10, 0x36, 0x65, 0xd0, 0x3a, 0xf4, 0xe4, 0xb3, 0xaf, - 0x27, 0x12, 0xad, 0x20, 0x5f, 0xfb, 0xb1, 0x02, 0x9b, 0xdc, 0x8c, 0xba, 0xda, 0xea, 0xf4, 0xf0, - 0x99, 0xe8, 0xd0, 0xfb, 0x74, 0x1c, 0x0a, 0x77, 0x43, 0xe7, 0xd8, 0x8d, 0xb0, 0xb5, 0x7c, 0xec, - 0x6b, 0xd3, 0x7b, 0x4b, 0x6e, 0x23, 0x14, 0x10, 0x7f, 0x13, 0xcb, 0x30, 0x07, 0xee, 0x1e, 0x4d, - 0x90, 0x1d, 0xb8, 0x91, 0x42, 0xfb, 0x75, 0xd8, 0x9e, 0xfd, 0x01, 0xf2, 0x75, 0x58, 0xc1, 0xd8, - 0x32, 0xcd, 0xc1, 0xf1, 0xb0, 0xd5, 0xf6, 0x84, 0x2a, 0x4c, 0x68, 0x22, 0xe5, 0x3c, 0x86, 0x6c, - 0xc4, 0x1d, 0x8a, 0x8f, 0x31, 0x6a, 0x0d, 0x2f, 0x14, 0xf2, 0x55, 0x90, 0x6b, 0xd3, 0x7e, 0x43, - 0x01, 0x12, 0xaf, 0x83, 0x7c, 0x11, 0x96, 0x9b, 0x4e, 0xc1, 0x1e, 0xb7, 0x86, 0xe3, 0x72, 0x7f, - 0x32, 0xe4, 0xb0, 0x42, 0xcc, 0xbf, 0x74, 0x7c, 0x48, 0x8f, 0x92, 0xe1, 0xd8, 0x3d, 0xe9, 0x4f, - 0x86, 0x56, 0x88, 0x0e, 0x83, 0xa2, 0x78, 0xde, 0x37, 0xdb, 0xad, 0x47, 0xe1, 0xa0, 0x28, 0x3c, - 0x2d, 0x14, 0x14, 0x85, 0xa7, 0x69, 0x1f, 0x28, 0xb0, 0x25, 0x4c, 0x9d, 0xda, 0x09, 0x6d, 0x29, - 0x20, 0x8a, 0xc2, 0x50, 0xe0, 0x58, 0xce, 0x62, 0x69, 0xd7, 0x05, 0xd0, 0x08, 0x36, 0x10, 0x79, - 0x5b, 0x56, 0x96, 0x7c, 0x05, 0x32, 0xf6, 0xb8, 0x3f, 0x38, 0x03, 0xd2, 0x88, 0xea, 0xcf, 0xe8, - 0xb8, 0x3f, 0xc0, 0x2a, 0xb0, 0xa4, 0xe6, 0xc1, 0x79, 0xb9, 0x71, 0xa2, 0xc5, 0xa4, 0x0a, 0x8b, - 0x1c, 0x52, 0x2a, 0xf2, 0xce, 0x38, 0xa3, 0x4f, 0x3b, 0x6b, 0x02, 0xce, 0x84, 0xe3, 0x28, 0x5a, - 0xa2, 0x0e, 0xed, 0xf7, 0x15, 0xc8, 0x51, 0x6e, 0x03, 0xa5, 0xb8, 0xa7, 0x5d, 0xd2, 0x61, 0xc6, - 0x51, 0x3c, 0x8a, 0xfb, 0xd5, 0x9f, 0xe9, 0x36, 0x7e, 0x05, 0xd6, 0x22, 0x05, 0x88, 0x86, 0x8e, - 0xec, 0xdd, 0xce, 0x61, 0x8b, 0xc5, 0x58, 0x60, 0x0f, 0xca, 0xa1, 0x34, 0xed, 0x77, 0x14, 0x38, - 0x4f, 0x65, 0x7e, 0x13, 0xd5, 0xbd, 0xd6, 0xa4, 0x2b, 0xf6, 0x3b, 0xe5, 0xa0, 0x84, 0xcd, 0x1c, - 0x73, 0xb2, 0x65, 0x1c, 0x14, 0x4f, 0xb3, 0xfc, 0x5c, 0x52, 0x86, 0x2c, 0xbf, 0x5f, 0x46, 0x1c, - 0xfe, 0x70, 0x5b, 0x52, 0x26, 0x04, 0x15, 0x73, 0x22, 0xda, 0x13, 0x3c, 0xc2, 0x78, 0x19, 0xcb, - 0x2f, 0xad, 0xfd, 0x97, 0x02, 0x17, 0xa7, 0x94, 0x21, 0x6f, 0xc0, 0x3c, 0x3a, 0x00, 0xf1, 0xd9, - 0xbb, 0x34, 0xe5, 0x13, 0xe3, 0xc3, 0x93, 0xfd, 0x3b, 0xec, 0x22, 0x3a, 0xa5, 0x3f, 0x2c, 0x56, - 0x8a, 0xbc, 0x03, 0x4b, 0x7a, 0xbb, 0xcd, 0xc5, 0x99, 0x54, 0x48, 0x9c, 0x99, 0xf2, 0xc5, 0x17, - 0x7d, 0x7a, 0x26, 0xce, 0x30, 0x53, 0xf4, 0x76, 0xdb, 0xe5, 0xce, 0x4d, 0x41, 0x7d, 0x9b, 0xbf, - 0x0c, 0xab, 0x61, 0xe2, 0x27, 0xf2, 0xc7, 0xf8, 0xa1, 0x02, 0x6a, 0xb8, 0x0d, 0x9f, 0x0d, 0x10, - 0x4b, 0xd2, 0x34, 0x3f, 0x66, 0x51, 0xfd, 0x61, 0x0a, 0x9e, 0x49, 0x1c, 0x61, 0xf2, 0x02, 0x2c, - 0xe8, 0x83, 0x81, 0x59, 0xe4, 0xab, 0x8a, 0x73, 0x48, 0xa8, 0x25, 0x0e, 0x49, 0x7b, 0x8c, 0x88, - 0xbc, 0x0c, 0x59, 0x5c, 0x99, 0xb4, 0x40, 0x2a, 0x00, 0x22, 0x64, 0x4a, 0x94, 0x08, 0x10, 0xa1, - 0x20, 0x24, 0x25, 0x58, 0xe5, 0x98, 0x0c, 0x96, 0x77, 0xec, 0x7d, 0xdb, 0x47, 0xc4, 0x46, 0xd0, - 0x6e, 0xa1, 0x7a, 0x76, 0x87, 0x2c, 0x4f, 0x46, 0x25, 0x08, 0x97, 0x22, 0x15, 0x50, 0xb1, 0x4e, - 0xb9, 0x26, 0x86, 0x86, 0x88, 0x28, 0x19, 0xac, 0x11, 0x53, 0xea, 0x8a, 0x95, 0xf4, 0xa7, 0x4b, - 0x1f, 0x8d, 0x3a, 0xc7, 0xbd, 0x53, 0xaf, 0x37, 0xfe, 0xec, 0xa6, 0x2b, 0xf8, 0xc6, 0x99, 0xa6, - 0xeb, 0x8f, 0x33, 0x6c, 0x33, 0x47, 0x8b, 0x51, 0x8e, 0x46, 0x02, 0xc0, 0x45, 0x8e, 0x06, 0x43, - 0x86, 0x33, 0xd4, 0x81, 0x22, 0x2c, 0x32, 0x34, 0x08, 0xb1, 0x33, 0x2e, 0x27, 0x36, 0x81, 0xd1, - 0xec, 0xdf, 0x61, 0xec, 0x0b, 0xf3, 0x44, 0x1a, 0x59, 0xa2, 0x28, 0xd9, 0x87, 0x5c, 0xa1, 0xeb, - 0xb5, 0x7a, 0x93, 0x81, 0x73, 0xb6, 0xd7, 0xc3, 0x0d, 0xde, 0x97, 0xe5, 0x43, 0x56, 0x0c, 0x5f, - 0x1d, 0xf1, 0x24, 0x97, 0x2b, 0x22, 0x8e, 0xef, 0x9c, 0xc0, 0x02, 0xbd, 0x7f, 0x61, 0xc6, 0xf8, - 0x44, 0x13, 0xb1, 0x5c, 0xd8, 0xf3, 0x86, 0x7b, 0x2f, 0xb8, 0xb0, 0x5a, 0x69, 0x8d, 0xc6, 0xce, - 0xb0, 0xd5, 0x1b, 0x21, 0x8a, 0xdc, 0x19, 0x50, 0x76, 0xb6, 0x44, 0x84, 0x52, 0xd4, 0x31, 0x8e, - 0xfd, 0xa2, 0x4c, 0x83, 0x19, 0xae, 0x8e, 0xf2, 0x4b, 0xa5, 0x4e, 0xaf, 0xd5, 0xed, 0xbc, 0x2f, - 0x7c, 0xb8, 0x18, 0xbf, 0x74, 0x24, 0x12, 0xad, 0x20, 0x5f, 0xfb, 0x5a, 0x6c, 0xde, 0x58, 0x2b, - 0x73, 0xb0, 0xc8, 0x3d, 0x7c, 0x99, 0xc7, 0x6b, 0xc3, 0xa8, 0x15, 0xcd, 0xda, 0xae, 0xaa, 0x90, - 0x55, 0x80, 0x86, 0x55, 0x2f, 0x18, 0xb6, 0x4d, 0x7f, 0xa7, 0xe8, 0x6f, 0xee, 0x0e, 0x5b, 0x6a, - 0x56, 0xd4, 0xb4, 0xe4, 0x11, 0x9b, 0xd1, 0x7e, 0xa4, 0xc0, 0x85, 0xe4, 0xa9, 0x24, 0x0e, 0xa0, - 0x4f, 0x34, 0x7f, 0x47, 0xfe, 0xe2, 0xcc, 0x79, 0x4f, 0x4c, 0x8e, 0xfa, 0x56, 0x8f, 0x99, 0xcf, - 0x6e, 0x4a, 0x3c, 0x16, 0x05, 0x61, 0xf1, 0x3b, 0x6d, 0xad, 0x00, 0x1b, 0xd3, 0xea, 0x08, 0x77, - 0x75, 0x0d, 0x72, 0x7a, 0xa3, 0x51, 0x31, 0x0b, 0xba, 0x63, 0xd6, 0x6b, 0xaa, 0x42, 0x96, 0x60, - 0x7e, 0xd7, 0xaa, 0x37, 0x1b, 0x6a, 0x4a, 0xfb, 0x81, 0x02, 0x2b, 0x66, 0x60, 0x65, 0xf2, 0xb4, - 0x9b, 0xef, 0xf5, 0xd0, 0xe6, 0xdb, 0xf0, 0xd1, 0x03, 0xfc, 0x0f, 0x9c, 0x69, 0xe7, 0xfd, 0x83, - 0x02, 0xeb, 0xb1, 0x32, 0xc4, 0x86, 0x45, 0xfd, 0xc0, 0xae, 0x9b, 0xc5, 0x02, 0x6f, 0xd9, 0x95, - 0xc0, 0x90, 0x05, 0x03, 0xc4, 0xc4, 0xbe, 0xc2, 0x3c, 0xee, 0x1e, 0x8e, 0xdc, 0x7e, 0xa7, 0x2d, - 0x05, 0x77, 0x2c, 0xcf, 0x59, 0xa2, 0x26, 0xbc, 0xc9, 0xde, 0x9f, 0x0c, 0x3d, 0xac, 0x36, 0x15, - 0x52, 0x84, 0xfa, 0xe9, 0xf1, 0x8a, 0xd1, 0x1a, 0xbb, 0x45, 0xf3, 0xe3, 0x55, 0x07, 0xf5, 0xed, - 0xac, 0x40, 0x8e, 0x4b, 0x2d, 0x28, 0x10, 0x7c, 0x4f, 0x81, 0x8d, 0x69, 0x6d, 0xa5, 0x82, 0x50, - 0xd8, 0xfd, 0xf6, 0x82, 0x0f, 0xf8, 0x1e, 0xf6, 0xbb, 0x15, 0x64, 0xe4, 0x4d, 0xc8, 0x99, 0xa3, - 0xd1, 0xc4, 0x1b, 0xda, 0x2f, 0x37, 0x2d, 0x93, 0x2f, 0x90, 0xcb, 0xff, 0xfe, 0xd1, 0x95, 0x8b, - 0x68, 0x33, 0x3d, 0x74, 0x47, 0x2f, 0xbb, 0x93, 0x61, 0x27, 0x04, 0x8e, 0x2d, 0x97, 0xd0, 0xbe, - 0xa3, 0xc0, 0xe6, 0xf4, 0x4e, 0xd2, 0x5b, 0xc6, 0x61, 0x16, 0x69, 0xc2, 0xe1, 0x0f, 0x6f, 0x19, - 0xdf, 0x6c, 0x4d, 0xbe, 0x65, 0x04, 0x21, 0x2d, 0xe4, 0x07, 0x4e, 0x4e, 0xc5, 0xa2, 0xa5, 0x86, - 0x0b, 0x09, 0x42, 0xed, 0x3f, 0x52, 0x70, 0x81, 0x2e, 0xa0, 0xae, 0x37, 0x1a, 0xe9, 0x93, 0xf1, - 0x89, 0xd7, 0x1b, 0x73, 0x96, 0x8a, 0xbc, 0x0a, 0x0b, 0x27, 0x4f, 0xa6, 0x3e, 0x64, 0xe4, 0x84, - 0x00, 0x1e, 0xca, 0xc2, 0x9a, 0x9b, 0xfe, 0x4f, 0xae, 0x82, 0x1c, 0x9f, 0x36, 0x8d, 0x08, 0x79, - 0xa9, 0x0d, 0xc5, 0x5a, 0x1a, 0xf8, 0xa1, 0x24, 0x5f, 0x83, 0x79, 0x54, 0x19, 0xf0, 0xe3, 0x51, - 0xb0, 0xb5, 0xc9, 0xad, 0x43, 0x85, 0x82, 0xc5, 0x0a, 0x90, 0x97, 0x00, 0x02, 0x70, 0x71, 0x7e, - 0xfe, 0x09, 0x51, 0xda, 0xc7, 0x17, 0xb7, 0x96, 0x4e, 0x8f, 0x5a, 0x1c, 0xb1, 0x3b, 0x0f, 0xeb, - 0x62, 0x58, 0x06, 0x02, 0x58, 0x8b, 0xbf, 0x6c, 0xad, 0xb1, 0x0c, 0x73, 0x20, 0xc0, 0xb5, 0xae, - 0xc7, 0x62, 0x6c, 0x22, 0xbe, 0x66, 0x24, 0x90, 0xe6, 0xf5, 0x58, 0x20, 0xcd, 0x2c, 0xa3, 0x92, - 0xa3, 0x65, 0x6a, 0xff, 0x9a, 0x82, 0xa5, 0x03, 0xca, 0x78, 0xa0, 0x38, 0x3d, 0x5b, 0x3c, 0xbf, - 0x0b, 0xb9, 0x4a, 0xbf, 0xc5, 0x9f, 0x10, 0xb8, 0x11, 0x34, 0x73, 0x0b, 0xec, 0xf6, 0x5b, 0xe2, - 0x35, 0x62, 0x64, 0xc9, 0x44, 0x8f, 0x71, 0x69, 0xbc, 0x0f, 0x0b, 0xec, 0x49, 0x87, 0x6b, 0x8a, - 0x04, 0xeb, 0xe9, 0xb7, 0xe8, 0x45, 0x96, 0x2d, 0x69, 0xbd, 0xd9, 0xb3, 0x90, 0xcc, 0x07, 0x71, - 0x98, 0x40, 0x49, 0x79, 0x30, 0x7f, 0x36, 0xe5, 0x81, 0x04, 0x87, 0xb4, 0x70, 0x16, 0x38, 0xa4, - 0xcd, 0x7b, 0x90, 0x93, 0xda, 0xf3, 0x44, 0x9c, 0xe8, 0x6f, 0xa6, 0x60, 0x05, 0x7b, 0xe5, 0xdb, - 0x77, 0xfc, 0x7c, 0xaa, 0x42, 0x5e, 0x0f, 0xa9, 0x42, 0x36, 0xe4, 0xf9, 0x62, 0x3d, 0x9b, 0xa1, - 0x03, 0xb9, 0x0f, 0xeb, 0x31, 0x42, 0xf2, 0x0a, 0xcc, 0xd3, 0xe6, 0x0b, 0xd1, 0x51, 0x8d, 0xae, - 0x80, 0x00, 0x3a, 0x93, 0x76, 0x7c, 0x64, 0x31, 0x6a, 0xed, 0xbf, 0x15, 0x58, 0xe6, 0xc8, 0xf5, - 0xbd, 0xa3, 0xfe, 0x63, 0x87, 0xf3, 0x66, 0x74, 0x38, 0x99, 0x83, 0x3e, 0x1f, 0xce, 0xff, 0xed, - 0x41, 0xbc, 0x17, 0x1a, 0xc4, 0x8b, 0x3e, 0x90, 0x96, 0xe8, 0xce, 0x8c, 0x31, 0xfc, 0x5b, 0x84, - 0x96, 0x0c, 0x13, 0x92, 0x6f, 0xc0, 0x52, 0xcd, 0x7b, 0x18, 0x92, 0xc0, 0x6e, 0x4e, 0xa9, 0xf4, - 0x45, 0x9f, 0x90, 0xed, 0x29, 0xbc, 0xbc, 0x7a, 0xde, 0x43, 0x37, 0xf6, 0x9a, 0x14, 0x54, 0x49, - 0x85, 0xb0, 0x70, 0xb1, 0x27, 0x59, 0xfa, 0xdc, 0x23, 0x0b, 0x31, 0x27, 0xbe, 0x9b, 0x06, 0x08, - 0x9c, 0x59, 0xe8, 0x06, 0x0c, 0x3d, 0xa4, 0x0b, 0xe5, 0x35, 0x26, 0xc9, 0x6b, 0x5c, 0xbc, 0xaf, - 0xdf, 0xe4, 0x4a, 0xd6, 0xd4, 0x74, 0xa0, 0x33, 0x54, 0xb7, 0x16, 0xb8, 0xf7, 0x44, 0xdb, 0xeb, - 0xb6, 0xd8, 0xd9, 0x9e, 0xde, 0xb9, 0x8e, 0xb8, 0x96, 0x7e, 0xea, 0x94, 0x10, 0xa4, 0xe8, 0x63, - 0x51, 0xa4, 0x04, 0x31, 0x07, 0xb1, 0xcc, 0x93, 0x39, 0x88, 0x35, 0x60, 0xa9, 0xd3, 0x7b, 0xcf, - 0xeb, 0x8d, 0xfb, 0xc3, 0x47, 0xa8, 0x59, 0x0e, 0x54, 0x56, 0x74, 0x08, 0x4c, 0x91, 0xc7, 0xe6, - 0x01, 0x2f, 0x46, 0x9f, 0x5e, 0x9e, 0x06, 0x3f, 0xd1, 0x77, 0x70, 0x9b, 0x57, 0x17, 0xee, 0x67, - 0xb2, 0x0b, 0xea, 0xe2, 0xfd, 0x4c, 0x36, 0xab, 0x2e, 0xdd, 0xcf, 0x64, 0x97, 0x54, 0xb0, 0xa4, - 0xb7, 0x1a, 0xff, 0x2d, 0x46, 0x7a, 0x3e, 0x09, 0x3f, 0x8d, 0x68, 0x3f, 0x4b, 0x01, 0x89, 0x37, - 0x83, 0xbc, 0x0e, 0x39, 0x76, 0xc0, 0xba, 0xc3, 0xd1, 0xb7, 0xb8, 0x05, 0x2d, 0x43, 0xee, 0x90, - 0x92, 0x65, 0xe4, 0x0e, 0x96, 0x6c, 0x8d, 0xbe, 0xd5, 0x25, 0x5f, 0x87, 0x73, 0x38, 0xbc, 0x03, - 0x6f, 0xd8, 0xe9, 0xb7, 0x5d, 0x84, 0x59, 0x6c, 0x75, 0x79, 0xb8, 0xb0, 0x17, 0x30, 0xae, 0x65, - 0x3c, 0x7b, 0xca, 0x34, 0xa0, 0xcf, 0x4a, 0x03, 0x29, 0x1b, 0x8c, 0x90, 0x38, 0xa0, 0xca, 0xe5, - 0x8f, 0x26, 0xdd, 0x2e, 0x9f, 0xd9, 0x3c, 0x15, 0x5a, 0xa3, 0x79, 0x53, 0x2a, 0x5e, 0x0d, 0x2a, - 0x2e, 0x4d, 0xba, 0x5d, 0xf2, 0x2a, 0x40, 0xbf, 0xe7, 0x9e, 0x76, 0x46, 0x23, 0xf6, 0x5e, 0xe1, - 0xbb, 0xd7, 0x05, 0xa9, 0xf2, 0x64, 0xf4, 0x7b, 0x55, 0x96, 0x48, 0x7e, 0x09, 0xd0, 0xe1, 0x17, - 0x3d, 0xe1, 0x99, 0x85, 0x0a, 0x0f, 0x00, 0x20, 0x12, 0xc3, 0xde, 0x7c, 0xc7, 0x9e, 0xdd, 0x79, - 0x5f, 0x58, 0x2f, 0xbf, 0x0d, 0xeb, 0xdc, 0x36, 0xf4, 0xa0, 0x33, 0x3e, 0xe1, 0xdc, 0xf2, 0xd3, - 0xb0, 0xda, 0x12, 0xbb, 0xfc, 0x4f, 0x19, 0x00, 0xfd, 0xc0, 0x16, 0x20, 0x33, 0xb7, 0x61, 0x9e, - 0xca, 0x00, 0x42, 0x97, 0x80, 0x9a, 0x58, 0xac, 0x57, 0xd6, 0xc4, 0x22, 0x05, 0xdd, 0x8d, 0x16, - 0x5a, 0x90, 0x0b, 0x3d, 0x02, 0xee, 0x46, 0x66, 0x54, 0x1e, 0x02, 0xf9, 0xe4, 0x54, 0xa4, 0x02, - 0x10, 0xc0, 0xbe, 0x70, 0xa9, 0x74, 0x3d, 0xc0, 0x4f, 0xe0, 0x19, 0x1c, 0x68, 0x3c, 0x80, 0x8e, - 0x91, 0x97, 0x4f, 0x40, 0x46, 0xf6, 0x20, 0xe3, 0xb4, 0x7c, 0xe7, 0xb1, 0x29, 0x60, 0x38, 0xcf, - 0xf1, 0x70, 0x6e, 0x01, 0x20, 0xce, 0xea, 0xb8, 0x15, 0x8a, 0x7a, 0x89, 0x95, 0x10, 0x03, 0x16, - 0x78, 0xa8, 0xde, 0x29, 0x20, 0x6a, 0x3c, 0x52, 0x2f, 0x87, 0x4e, 0xc5, 0x44, 0x99, 0xa7, 0xe0, - 0x41, 0x79, 0xef, 0x42, 0xda, 0xb6, 0xab, 0xdc, 0x05, 0x7c, 0x25, 0x90, 0x30, 0x6c, 0xbb, 0x2a, - 0xe2, 0xd0, 0x9f, 0x4a, 0xc5, 0x28, 0x31, 0xf9, 0x12, 0xe4, 0x24, 0xf6, 0x99, 0x83, 0x27, 0xe0, - 0x18, 0x48, 0x06, 0xfc, 0xf2, 0xa1, 0x21, 0x51, 0x93, 0x0a, 0xa8, 0x7b, 0x93, 0x77, 0x3d, 0x7d, - 0x30, 0x40, 0xbf, 0x9d, 0xf7, 0xbc, 0x21, 0x63, 0xdb, 0xb2, 0x01, 0xea, 0x28, 0xba, 0x3d, 0xb5, - 0x45, 0xae, 0xac, 0x4f, 0x89, 0x96, 0x24, 0x0d, 0x58, 0xb7, 0xbd, 0xf1, 0x64, 0xc0, 0x6c, 0x2e, - 0x4a, 0xfd, 0x21, 0x15, 0x28, 0x18, 0xd4, 0x02, 0x02, 0x34, 0x8e, 0x68, 0xa6, 0x30, 0x74, 0x39, - 0xea, 0x0f, 0x23, 0xc2, 0x45, 0xbc, 0xb0, 0xe6, 0xc9, 0x53, 0x4e, 0x6f, 0xd5, 0xb0, 0x98, 0x82, - 0xb7, 0xaa, 0x10, 0x53, 0x02, 0xe1, 0xe4, 0xa5, 0x04, 0x38, 0x20, 0x7c, 0xfc, 0x92, 0xe0, 0x80, - 0x42, 0x20, 0x40, 0x1f, 0x64, 0x24, 0x44, 0x3a, 0x3e, 0x17, 0x6f, 0x00, 0xdc, 0xef, 0x77, 0x7a, - 0x55, 0x6f, 0x7c, 0xd2, 0x6f, 0x4b, 0xa8, 0x44, 0xb9, 0x5f, 0xed, 0x77, 0x7a, 0xee, 0x29, 0x26, - 0xff, 0xec, 0xa3, 0x2b, 0x12, 0x91, 0x25, 0xfd, 0x4f, 0x3e, 0x0f, 0x4b, 0xf4, 0x97, 0x13, 0x58, - 0x8e, 0x30, 0xb5, 0x23, 0x96, 0x66, 0xb8, 0xed, 0x01, 0x01, 0xb9, 0x87, 0x91, 0x0a, 0x3a, 0x83, - 0xb1, 0xc4, 0xbc, 0x8a, 0xb0, 0x04, 0x9d, 0xc1, 0x38, 0x0a, 0x32, 0x2a, 0x11, 0x93, 0xb2, 0xdf, - 0x74, 0x11, 0x5c, 0x84, 0x07, 0x44, 0x40, 0xdd, 0x1a, 0x5f, 0x6b, 0xae, 0x40, 0x37, 0x94, 0xc3, - 0x40, 0x46, 0x8a, 0x61, 0x23, 0xec, 0x72, 0x91, 0x3d, 0x86, 0x70, 0xa6, 0x56, 0xc4, 0xd1, 0x6f, - 0xbb, 0x87, 0x98, 0x1c, 0x6a, 0x84, 0x4f, 0x4c, 0x76, 0x60, 0x8d, 0xf1, 0xf8, 0x7e, 0x90, 0x32, - 0xce, 0xe2, 0xe2, 0xd9, 0x16, 0x44, 0x31, 0x93, 0x3f, 0x1f, 0x29, 0x40, 0x4a, 0x30, 0x8f, 0x02, - 0x21, 0xb7, 0xfc, 0xde, 0x92, 0x25, 0xe1, 0xe8, 0x3e, 0xc2, 0x73, 0x05, 0x65, 0x60, 0xf9, 0x5c, - 0x41, 0x52, 0xf2, 0x55, 0x00, 0xa3, 0x37, 0xec, 0x77, 0xbb, 0x88, 0xbf, 0x99, 0x45, 0x51, 0xea, - 0x72, 0x78, 0x3f, 0x62, 0x2d, 0x01, 0x11, 0xc7, 0x8a, 0xc2, 0xdf, 0x6e, 0x04, 0xa5, 0x53, 0xaa, - 0x4b, 0x33, 0x61, 0x81, 0x6d, 0x46, 0xc4, 0xb2, 0xe5, 0xe8, 0xfc, 0x12, 0x12, 0x2a, 0xc3, 0xb2, - 0xe5, 0xe9, 0x71, 0x2c, 0x5b, 0xa9, 0x80, 0xb6, 0x07, 0xe7, 0x93, 0x3a, 0x16, 0x12, 0x61, 0x95, - 0xb3, 0x8a, 0xb0, 0x7f, 0x9e, 0x86, 0x65, 0xac, 0x4d, 0x9c, 0xc2, 0x3a, 0xac, 0xd8, 0x93, 0x77, - 0x7d, 0xa0, 0x17, 0x71, 0x1a, 0x63, 0xfb, 0x46, 0x72, 0x86, 0xfc, 0x4c, 0x15, 0x2a, 0x41, 0x0c, - 0x58, 0x15, 0x37, 0xc1, 0xae, 0xb0, 0x26, 0xf7, 0x61, 0x64, 0x05, 0x58, 0x59, 0x3c, 0x48, 0x63, - 0xa4, 0x50, 0x70, 0x1f, 0xa4, 0x9f, 0xe4, 0x3e, 0xc8, 0x9c, 0xe9, 0x3e, 0x78, 0x07, 0x96, 0xc5, - 0xd7, 0xf0, 0x24, 0x9f, 0x7f, 0xba, 0x93, 0x3c, 0x54, 0x19, 0xa9, 0xf8, 0x27, 0xfa, 0xc2, 0xcc, - 0x13, 0x1d, 0xdf, 0xfe, 0xc4, 0x2e, 0x8b, 0xc5, 0x5d, 0xe7, 0x75, 0x60, 0x14, 0xb3, 0xdd, 0x42, - 0xe3, 0x13, 0xdc, 0x92, 0xaf, 0xc0, 0x52, 0xa5, 0x2f, 0x9e, 0x7d, 0x24, 0x7d, 0x7b, 0x57, 0x24, - 0xca, 0xec, 0x82, 0x4f, 0xe9, 0xdf, 0x6e, 0xe9, 0x4f, 0xe3, 0x76, 0xbb, 0x07, 0xc0, 0xdd, 0x14, - 0x82, 0xe8, 0x43, 0xb8, 0x65, 0x84, 0x4b, 0x7d, 0x58, 0xed, 0x2f, 0x11, 0xd3, 0xd3, 0x89, 0x5b, - 0x94, 0xe8, 0x87, 0x87, 0xfd, 0x49, 0x6f, 0x1c, 0x0a, 0xd7, 0x29, 0x9c, 0xb2, 0x5a, 0x3c, 0x4f, - 0x3e, 0x1e, 0x22, 0xc5, 0x3e, 0xdd, 0x09, 0x21, 0x6f, 0xf9, 0x06, 0x71, 0x8b, 0xb3, 0x46, 0x48, - 0x8b, 0x8d, 0xd0, 0x54, 0x33, 0x38, 0xed, 0x47, 0x8a, 0x8c, 0xe1, 0xfd, 0x09, 0xa6, 0xfa, 0x35, - 0x00, 0xff, 0xdd, 0x5d, 0xcc, 0x35, 0x93, 0x97, 0xfc, 0x54, 0x79, 0x94, 0x03, 0x5a, 0xa9, 0x37, - 0xe9, 0x4f, 0xab, 0x37, 0x0e, 0xe4, 0xea, 0xdf, 0x1c, 0xb7, 0x02, 0x43, 0x0d, 0xb0, 0x7d, 0x4e, - 0x16, 0x4f, 0xa6, 0xf4, 0xce, 0x0d, 0xbc, 0x1b, 0x02, 0x3e, 0x78, 0x0a, 0x0b, 0x2c, 0x15, 0xd4, - 0xde, 0x82, 0x35, 0xd9, 0x91, 0xf4, 0x51, 0xef, 0x90, 0x7c, 0x99, 0x21, 0x0a, 0x2a, 0x21, 0x89, - 0x45, 0x22, 0xa2, 0x27, 0xee, 0xa3, 0xde, 0x21, 0xe3, 0x7f, 0x5a, 0x0f, 0xe5, 0xb6, 0xa2, 0x8c, - 0xf7, 0x13, 0x05, 0x48, 0x9c, 0x5c, 0x3e, 0x4d, 0x94, 0xff, 0x03, 0xee, 0x32, 0xc2, 0x95, 0x65, - 0x9e, 0x84, 0x2b, 0xcb, 0xff, 0x81, 0x02, 0x6b, 0xa6, 0x5e, 0xe5, 0x80, 0xdb, 0xec, 0xfd, 0xe0, - 0x2a, 0x5c, 0x36, 0xf5, 0xaa, 0xdb, 0xa8, 0x57, 0xcc, 0xc2, 0x03, 0x37, 0x11, 0x47, 0xf3, 0x32, - 0x3c, 0x1b, 0x27, 0x09, 0xde, 0x19, 0x2e, 0xc1, 0x46, 0x3c, 0x5b, 0x60, 0x6d, 0x26, 0x17, 0x16, - 0xb0, 0x9c, 0xe9, 0xfc, 0x9b, 0xb0, 0x26, 0x70, 0x25, 0x9d, 0x8a, 0x8d, 0xc8, 0xd5, 0x6b, 0x90, - 0xdb, 0x37, 0x2c, 0xb3, 0xf4, 0xc0, 0x2d, 0x35, 0x2b, 0x15, 0x75, 0x8e, 0xac, 0xc0, 0x12, 0x4f, - 0x28, 0xe8, 0xaa, 0x42, 0x96, 0x21, 0x6b, 0xd6, 0x6c, 0xa3, 0xd0, 0xb4, 0x0c, 0x35, 0x95, 0x7f, - 0x13, 0x56, 0x1b, 0xc3, 0xce, 0x7b, 0xad, 0xb1, 0xb7, 0xe7, 0x3d, 0xc2, 0x67, 0x82, 0x45, 0x48, - 0x5b, 0xfa, 0x81, 0x3a, 0x47, 0x00, 0x16, 0x1a, 0x7b, 0x05, 0xfb, 0xce, 0x1d, 0x55, 0x21, 0x39, - 0x58, 0xdc, 0x2d, 0x34, 0xdc, 0xbd, 0xaa, 0xad, 0xa6, 0xe8, 0x0f, 0xfd, 0xc0, 0xc6, 0x1f, 0xe9, - 0xfc, 0x17, 0x60, 0x1d, 0x79, 0x85, 0x4a, 0x67, 0x34, 0xf6, 0x7a, 0xde, 0x10, 0xdb, 0xb0, 0x0c, - 0x59, 0xdb, 0xa3, 0x9b, 0x7c, 0xec, 0xb1, 0x06, 0x54, 0x27, 0xdd, 0x71, 0x67, 0xd0, 0xf5, 0xbe, - 0xad, 0x2a, 0xf9, 0x7b, 0xb0, 0x66, 0xf5, 0x27, 0xe3, 0x4e, 0xef, 0xd8, 0x1e, 0x53, 0x8a, 0xe3, - 0x47, 0xe4, 0x19, 0x58, 0x6f, 0xd6, 0xf4, 0xea, 0x8e, 0xb9, 0xdb, 0xac, 0x37, 0x6d, 0xb7, 0xaa, - 0x3b, 0x85, 0x32, 0x7b, 0xa4, 0xa8, 0xd6, 0x6d, 0xc7, 0xb5, 0x8c, 0x82, 0x51, 0x73, 0x54, 0x25, - 0xff, 0x7d, 0x54, 0x7b, 0x1c, 0xf6, 0x7b, 0xed, 0x52, 0x0b, 0x23, 0x99, 0xd3, 0x06, 0x6b, 0xb0, - 0x6d, 0x1b, 0x85, 0x7a, 0xad, 0xe8, 0x96, 0xf4, 0x82, 0x53, 0xb7, 0x92, 0x80, 0x5c, 0x37, 0xe1, - 0x42, 0x02, 0x4d, 0xdd, 0x69, 0xa8, 0x0a, 0xb9, 0x02, 0x5b, 0x09, 0x79, 0x07, 0xc6, 0x8e, 0xde, - 0x74, 0xca, 0x35, 0x35, 0x35, 0xa5, 0xb0, 0x6d, 0xd7, 0xd5, 0x74, 0xfe, 0x77, 0x15, 0x58, 0x6d, - 0x8e, 0xb8, 0x85, 0x70, 0x13, 0xfd, 0xfc, 0x9e, 0x83, 0x4b, 0x4d, 0xdb, 0xb0, 0x5c, 0xa7, 0xbe, - 0x67, 0xd4, 0xdc, 0xa6, 0xad, 0xef, 0x46, 0x5b, 0x73, 0x05, 0xb6, 0x24, 0x0a, 0xcb, 0x28, 0xd4, - 0xf7, 0x0d, 0xcb, 0x6d, 0xe8, 0xb6, 0x7d, 0x50, 0xb7, 0x8a, 0xaa, 0x42, 0xbf, 0x98, 0x40, 0x50, - 0x2d, 0xe9, 0xac, 0x35, 0xa1, 0xbc, 0x9a, 0x71, 0xa0, 0x57, 0xdc, 0x9d, 0xba, 0xa3, 0xa6, 0xf3, - 0x55, 0x7a, 0xf5, 0x22, 0x9c, 0x22, 0xb3, 0x6b, 0xcb, 0x42, 0xa6, 0x56, 0xaf, 0x19, 0xd1, 0xa7, - 0xad, 0x65, 0xc8, 0xea, 0x8d, 0x86, 0x55, 0xdf, 0xc7, 0x25, 0x06, 0xb0, 0x50, 0x34, 0x6a, 0xb4, - 0x65, 0x69, 0x9a, 0xd3, 0xb0, 0xea, 0xd5, 0xba, 0x63, 0x14, 0xd5, 0x4c, 0xde, 0x12, 0x5b, 0x58, - 0x54, 0x7a, 0xd8, 0x67, 0xef, 0x48, 0x45, 0xa3, 0xa4, 0x37, 0x2b, 0x0e, 0x9f, 0xa2, 0x07, 0xae, - 0x65, 0xbc, 0xd5, 0x34, 0x6c, 0xc7, 0x56, 0x15, 0xa2, 0xc2, 0x72, 0xcd, 0x30, 0x8a, 0xb6, 0x6b, - 0x19, 0xfb, 0xa6, 0x71, 0xa0, 0xa6, 0x68, 0x9d, 0xec, 0x7f, 0xfa, 0x85, 0xfc, 0x07, 0x0a, 0x10, - 0x06, 0x45, 0x29, 0xe2, 0x1b, 0xe0, 0x8a, 0xd9, 0x86, 0xcd, 0x32, 0x9d, 0x6a, 0xec, 0x5a, 0xb5, - 0x5e, 0x8c, 0x0e, 0xd9, 0x05, 0x20, 0x91, 0xfc, 0x7a, 0xa9, 0xa4, 0x2a, 0x64, 0x0b, 0xce, 0x45, - 0xd2, 0x8b, 0x56, 0xbd, 0xa1, 0xa6, 0x36, 0x53, 0x59, 0x85, 0x5c, 0x8c, 0x65, 0xee, 0x19, 0x46, - 0x43, 0x4d, 0xd3, 0x29, 0x8a, 0x64, 0x88, 0x2d, 0xc1, 0x8a, 0x67, 0xf2, 0xdf, 0x51, 0xe0, 0x02, - 0x6b, 0xa6, 0xd8, 0x5f, 0x7e, 0x53, 0x2f, 0xc1, 0x06, 0x07, 0xd8, 0x4d, 0x6a, 0xe8, 0x79, 0x50, - 0x43, 0xb9, 0xac, 0x99, 0xcf, 0xc0, 0x7a, 0x28, 0x15, 0xdb, 0x91, 0xa2, 0xa7, 0x47, 0x28, 0x79, - 0xc7, 0xb0, 0x1d, 0xd7, 0x28, 0x95, 0xea, 0x96, 0xc3, 0x1a, 0x92, 0xce, 0x6b, 0xb0, 0x5e, 0xf0, - 0x86, 0x63, 0x2a, 0x15, 0xf5, 0x46, 0x9d, 0x7e, 0x0f, 0x9b, 0xb0, 0x02, 0x4b, 0xc6, 0x57, 0x1d, - 0xa3, 0x66, 0x9b, 0xf5, 0x9a, 0x3a, 0x97, 0xbf, 0x14, 0xa1, 0x11, 0xfb, 0xd8, 0xb6, 0xcb, 0xea, - 0x5c, 0xbe, 0x05, 0x2b, 0xc2, 0x16, 0x97, 0xad, 0x8a, 0x6d, 0xd8, 0x14, 0x6b, 0x0d, 0x4f, 0x94, - 0x68, 0x17, 0x36, 0xe0, 0x7c, 0x3c, 0xdf, 0x70, 0x54, 0x85, 0xce, 0x42, 0x24, 0x87, 0xa6, 0xa7, - 0xf2, 0xbf, 0xad, 0xc0, 0x8a, 0xff, 0x9e, 0x81, 0x1a, 0xd4, 0x2b, 0xb0, 0x55, 0x2d, 0xe9, 0x6e, - 0xd1, 0xd8, 0x37, 0x0b, 0x86, 0xbb, 0x67, 0xd6, 0x8a, 0x91, 0x8f, 0x3c, 0x0b, 0xcf, 0x24, 0x10, - 0xe0, 0x57, 0x36, 0xe0, 0x7c, 0x34, 0xcb, 0xa1, 0x5b, 0x35, 0x45, 0x87, 0x3e, 0x9a, 0xe3, 0xef, - 0xd3, 0x74, 0xfe, 0xcf, 0x14, 0xd8, 0xe0, 0x01, 0xa4, 0xf9, 0xcb, 0x0a, 0x8b, 0x2c, 0x80, 0xd0, - 0x9b, 0x79, 0xb8, 0xe9, 0x58, 0x4d, 0xdb, 0x31, 0x8a, 0xa2, 0x38, 0x5d, 0xb4, 0xa6, 0x65, 0x54, - 0x8d, 0x9a, 0x13, 0x69, 0xdb, 0xf3, 0xf0, 0xb9, 0x19, 0xb4, 0xb5, 0xba, 0x23, 0x7e, 0xd3, 0xbd, - 0xfa, 0x39, 0xb8, 0x36, 0x83, 0xd8, 0x27, 0x4c, 0xe5, 0xf7, 0x61, 0xd5, 0xd6, 0xab, 0x95, 0x52, - 0x7f, 0x78, 0xe8, 0xe9, 0x93, 0xf1, 0x49, 0x8f, 0x6c, 0xc1, 0xc5, 0x52, 0xdd, 0x2a, 0x18, 0x2e, - 0xf6, 0x20, 0xd2, 0x88, 0x73, 0xb0, 0x26, 0x67, 0x3e, 0x30, 0xe8, 0xee, 0x22, 0xb0, 0x2a, 0x27, - 0xd6, 0xea, 0x6a, 0x2a, 0xff, 0x35, 0x58, 0x0e, 0x45, 0x61, 0xba, 0x08, 0xe7, 0xe4, 0xdf, 0x0d, - 0xaf, 0xd7, 0xee, 0xf4, 0x8e, 0xd5, 0xb9, 0x68, 0x86, 0x35, 0xe9, 0xf5, 0x68, 0x06, 0x1e, 0x37, - 0x72, 0x86, 0xe3, 0x0d, 0x4f, 0x3b, 0xbd, 0xd6, 0xd8, 0x6b, 0xab, 0xa9, 0xfc, 0x8b, 0xb0, 0x12, - 0xc2, 0x7e, 0xa5, 0xeb, 0xaa, 0x52, 0xe7, 0xf7, 0x43, 0xd5, 0x28, 0x9a, 0xcd, 0xaa, 0x3a, 0x4f, - 0x0f, 0x9a, 0xb2, 0xb9, 0x5b, 0x56, 0x21, 0xff, 0x03, 0x85, 0x4a, 0x28, 0x38, 0xee, 0xd5, 0x92, - 0x2e, 0x56, 0x22, 0xdd, 0x05, 0x0c, 0x51, 0xda, 0xb0, 0x6d, 0xf6, 0xe0, 0x7c, 0x09, 0x36, 0xf8, - 0x0f, 0x57, 0xaf, 0x15, 0xdd, 0xb2, 0x6e, 0x15, 0x0f, 0x74, 0x8b, 0x6e, 0x8d, 0x07, 0x6a, 0x0a, - 0xf7, 0xbb, 0x94, 0xe2, 0x3a, 0xf5, 0x66, 0xa1, 0xac, 0xa6, 0xe9, 0xf6, 0x0a, 0xa5, 0x37, 0xcc, - 0x9a, 0x9a, 0xc1, 0xd3, 0x23, 0x46, 0x8d, 0xd5, 0xd2, 0xfc, 0xf9, 0xfc, 0xc7, 0x0a, 0x5c, 0xb4, - 0x3b, 0xc7, 0xbd, 0xd6, 0x78, 0x32, 0xf4, 0xf4, 0xee, 0x71, 0x7f, 0xd8, 0x19, 0x9f, 0x9c, 0xda, - 0x93, 0xce, 0xd8, 0x23, 0xb7, 0xe1, 0x86, 0x6d, 0xee, 0xd6, 0x74, 0x87, 0xee, 0x7e, 0xbd, 0xb2, - 0x5b, 0xb7, 0x4c, 0xa7, 0x5c, 0x75, 0xed, 0xa6, 0x19, 0xdb, 0x18, 0xd7, 0xe1, 0xb9, 0xe9, 0xa4, - 0x15, 0x63, 0x57, 0x2f, 0x3c, 0x50, 0x95, 0xd9, 0x15, 0xee, 0xe8, 0x15, 0xbd, 0x56, 0x30, 0x8a, - 0xee, 0xfe, 0x1d, 0x35, 0x45, 0x6e, 0xc0, 0xd5, 0xe9, 0xa4, 0x25, 0xb3, 0x61, 0x53, 0xb2, 0xf4, - 0xec, 0xef, 0x96, 0xed, 0x2a, 0xa5, 0xca, 0xe4, 0xff, 0x54, 0x81, 0x8d, 0x69, 0x70, 0x23, 0xe4, - 0x26, 0x68, 0x46, 0xcd, 0xb1, 0x74, 0xb3, 0xe8, 0x16, 0x2c, 0xa3, 0x68, 0xd4, 0x1c, 0x53, 0xaf, - 0xd8, 0xae, 0x5d, 0x6f, 0xd2, 0xd5, 0x14, 0xd8, 0x05, 0x5c, 0x83, 0x2b, 0x33, 0xe8, 0xea, 0x66, - 0xb1, 0xa0, 0x2a, 0xe4, 0x0e, 0xbc, 0x30, 0x83, 0xc8, 0x7e, 0x60, 0x3b, 0x46, 0x55, 0xce, 0x51, - 0x53, 0xf9, 0x0e, 0xa8, 0x51, 0xdf, 0xf9, 0x98, 0xed, 0x85, 0xd5, 0xac, 0xd5, 0xd8, 0x05, 0xb5, - 0x06, 0xb9, 0xba, 0x53, 0x36, 0x2c, 0x8e, 0xba, 0x8e, 0x30, 0xeb, 0xcd, 0x1a, 0x5d, 0xf3, 0x75, - 0xcb, 0x7c, 0x1b, 0x6f, 0xaa, 0x0d, 0x38, 0x6f, 0x57, 0xf4, 0xc2, 0x1e, 0x6e, 0x47, 0xb3, 0xe6, - 0x16, 0xca, 0x7a, 0xad, 0x66, 0x54, 0x54, 0xc0, 0x71, 0x98, 0xe6, 0x64, 0x47, 0x3e, 0x0f, 0xb7, - 0xea, 0x7b, 0x8e, 0xee, 0x36, 0x2a, 0xcd, 0x5d, 0xb3, 0xe6, 0xda, 0x0f, 0x6a, 0x05, 0xc1, 0x55, - 0x15, 0xe2, 0x87, 0xf9, 0x2d, 0xb8, 0x3e, 0x93, 0x3a, 0xc0, 0x47, 0xbf, 0x09, 0xda, 0x4c, 0x4a, - 0xde, 0x91, 0xfc, 0x8f, 0x15, 0xd8, 0x9a, 0xf1, 0x70, 0x4c, 0x5e, 0x80, 0xdb, 0x65, 0x43, 0x2f, - 0x56, 0x0c, 0xdb, 0xc6, 0x3d, 0x4e, 0x47, 0x90, 0xd9, 0x68, 0x24, 0x1e, 0xd5, 0xb7, 0xe1, 0xc6, - 0x6c, 0xf2, 0xe0, 0xd2, 0xbf, 0x05, 0xd7, 0x67, 0x93, 0x72, 0x26, 0x20, 0x45, 0x8f, 0xca, 0xd9, - 0x94, 0x3e, 0xf3, 0x90, 0xce, 0x7f, 0x4f, 0x81, 0x0b, 0xc9, 0xda, 0x1b, 0xda, 0x36, 0xb3, 0x66, - 0x3b, 0x7a, 0xa5, 0xe2, 0x36, 0x74, 0x4b, 0xaf, 0xba, 0x46, 0xcd, 0xaa, 0x57, 0x2a, 0x49, 0x97, - 0xe6, 0x75, 0x78, 0x6e, 0x3a, 0xa9, 0x5d, 0xb0, 0xcc, 0x06, 0xbd, 0x17, 0x34, 0xd8, 0x9e, 0x4e, - 0x65, 0x98, 0x05, 0x43, 0x4d, 0xed, 0xbc, 0xf1, 0xe1, 0xbf, 0x6c, 0xcf, 0x7d, 0xf8, 0xf1, 0xb6, - 0xf2, 0x93, 0x8f, 0xb7, 0x95, 0x7f, 0xfe, 0x78, 0x5b, 0x79, 0xfb, 0xf9, 0xb3, 0x85, 0x16, 0x41, - 0x89, 0xe2, 0xdd, 0x05, 0x34, 0x4a, 0x7a, 0xf9, 0x7f, 0x02, 0x00, 0x00, 0xff, 0xff, 0xeb, 0xe8, - 0x36, 0x3e, 0x49, 0xab, 0x01, 0x00, + 0xf9, 0xd0, 0x7a, 0x85, 0x00, 0xf9, 0x02, 0x6c, 0x20, 0x5f, 0x4e, 0x9c, 0x00, 0x31, 0x82, 0x00, + 0x39, 0x44, 0x08, 0x72, 0xc8, 0x5f, 0x90, 0xe4, 0xe2, 0x9b, 0x00, 0xc3, 0x80, 0x0f, 0x39, 0x25, + 0x80, 0x90, 0x08, 0x48, 0x0e, 0x49, 0x6e, 0x41, 0x7c, 0xf0, 0x29, 0xa8, 0x57, 0x55, 0xdd, 0xd5, + 0x1f, 0x33, 0xcb, 0xd5, 0x4a, 0x49, 0x0c, 0xf8, 0x44, 0x4e, 0xd5, 0xab, 0xea, 0xfa, 0xae, 0xf7, + 0x5e, 0xbd, 0xf7, 0x7b, 0x87, 0x27, 0x1e, 0x5f, 0x93, 0x5a, 0xe2, 0x50, 0x0f, 0x06, 0xb6, 0x5d, + 0x97, 0x46, 0x79, 0x30, 0xb0, 0x47, 0x7d, 0xf1, 0xbb, 0x40, 0x8b, 0xf3, 0x36, 0xb4, 0x61, 0x6b, + 0x46, 0x49, 0xe9, 0x58, 0x50, 0xe4, 0x63, 0xe1, 0x16, 0xa8, 0x47, 0x5e, 0x9b, 0x72, 0xbc, 0x5e, + 0x1b, 0x9b, 0xf6, 0xde, 0x5d, 0x16, 0x11, 0xdd, 0x5a, 0xf5, 0xd3, 0xed, 0x51, 0x7f, 0xff, 0x2e, + 0xff, 0xca, 0xa9, 0xb8, 0xd0, 0x64, 0x36, 0x9e, 0xbc, 0x08, 0xe7, 0x22, 0x00, 0x1f, 0x81, 0xc7, + 0xb8, 0xb5, 0x4e, 0xb3, 0xc2, 0x70, 0x50, 0x57, 0x61, 0x59, 0xcc, 0xf9, 0xd0, 0xf7, 0x3b, 0xb3, + 0x72, 0x3c, 0x8d, 0xee, 0x29, 0xfe, 0xb9, 0x89, 0xe8, 0x54, 0xa2, 0x04, 0x70, 0x06, 0x4e, 0x99, + 0xbc, 0x00, 0xc4, 0xe7, 0xca, 0xfd, 0x63, 0x80, 0x7f, 0x70, 0x5d, 0xe4, 0xf8, 0xfb, 0x97, 0x7f, + 0xf6, 0xef, 0x53, 0x70, 0x2e, 0x41, 0x74, 0xa0, 0x2c, 0x7e, 0xa7, 0x37, 0xf6, 0x8e, 0x99, 0x80, + 0x20, 0x77, 0x72, 0x4d, 0x4a, 0xe7, 0xfa, 0xa0, 0x05, 0x16, 0xf1, 0x9b, 0x7f, 0x8b, 0xff, 0xa2, + 0x47, 0x43, 0x6b, 0x28, 0x54, 0x1d, 0xf4, 0x5f, 0x62, 0xc2, 0x3a, 0x86, 0x31, 0x18, 0x75, 0xfa, + 0x18, 0x0d, 0x01, 0x59, 0x8c, 0x4c, 0x48, 0xe0, 0xc2, 0x56, 0x34, 0x24, 0x22, 0xca, 0x63, 0x58, + 0xea, 0x20, 0x92, 0x42, 0xbe, 0x04, 0x9b, 0xd2, 0x4d, 0xe2, 0x46, 0xf6, 0x15, 0x5a, 0x96, 0x5b, + 0x17, 0x5b, 0xfe, 0x9d, 0x52, 0x0c, 0xed, 0xb0, 0x1d, 0xd8, 0xc6, 0x49, 0xec, 0xb4, 0x07, 0x6e, + 0x2c, 0xee, 0x05, 0x76, 0x95, 0x01, 0xc5, 0x6f, 0x52, 0x2a, 0xb3, 0x3d, 0x88, 0x84, 0xc0, 0xa0, + 0xbd, 0xe6, 0xc3, 0xf7, 0x0e, 0x3c, 0x93, 0xd8, 0x62, 0x7a, 0x7d, 0xa0, 0xe1, 0x52, 0xc0, 0xf9, + 0x2c, 0xd2, 0xdf, 0x94, 0xf5, 0xb9, 0x0a, 0xcb, 0xef, 0x7a, 0xad, 0xa1, 0x37, 0xe4, 0xf7, 0x32, + 0x5f, 0x12, 0x2c, 0x4d, 0xbe, 0x96, 0xff, 0x2a, 0x25, 0x84, 0x9e, 0x9d, 0x7e, 0x7f, 0x3c, 0x1a, + 0x0f, 0x5b, 0x83, 0x90, 0xba, 0x85, 0x9c, 0xc2, 0xb3, 0xc8, 0x13, 0xdc, 0x45, 0x98, 0xfc, 0xfe, + 0x50, 0xe0, 0x02, 0x1c, 0x0a, 0x5b, 0xdb, 0xdc, 0xdd, 0x97, 0xc2, 0x5c, 0x8b, 0x4e, 0xa9, 0x75, + 0x99, 0x98, 0xf2, 0xe8, 0x52, 0xad, 0xe5, 0x39, 0xeb, 0x22, 0xab, 0x33, 0x46, 0x45, 0xca, 0x09, + 0x0d, 0x8f, 0xea, 0x5b, 0x76, 0x82, 0x5e, 0x84, 0x6b, 0x95, 0xfb, 0x47, 0xbe, 0x0c, 0x4b, 0x9d, + 0xb6, 0x1c, 0x0d, 0x2e, 0x2a, 0xe9, 0x9b, 0x6d, 0x86, 0x48, 0x1b, 0xd4, 0x51, 0x9e, 0xb3, 0xb2, + 0x1d, 0x9e, 0xba, 0xb3, 0x12, 0x52, 0x4c, 0x69, 0x3b, 0x82, 0xbf, 0x8e, 0x17, 0x23, 0xab, 0x90, + 0xf2, 0x4f, 0x82, 0x54, 0xa7, 0x4d, 0x57, 0xeb, 0x48, 0xc2, 0xc4, 0xb5, 0xf8, 0x2f, 0xed, 0xd7, + 0xe0, 0xd6, 0x59, 0xc7, 0x88, 0xee, 0xb4, 0x29, 0x03, 0xbe, 0x64, 0xad, 0xb7, 0x62, 0xe3, 0x76, + 0x15, 0x64, 0x48, 0xcf, 0x8e, 0x98, 0x70, 0x91, 0xd6, 0x1c, 0x76, 0xb4, 0xdf, 0x4a, 0xc3, 0x6a, + 0x58, 0x15, 0x47, 0x9e, 0x87, 0x8c, 0x5f, 0xed, 0xaa, 0xff, 0x64, 0x24, 0x13, 0xd1, 0xca, 0x2d, + 0x24, 0xa2, 0x3c, 0x0f, 0xbe, 0x30, 0xbb, 0xa7, 0xf2, 0xab, 0x8e, 0xb5, 0x8c, 0x89, 0xe2, 0x35, + 0xe7, 0x3e, 0xac, 0xa2, 0x71, 0x10, 0x5e, 0xa6, 0xe3, 0x0e, 0x57, 0xf0, 0xce, 0xd6, 0xd1, 0x67, + 0x3f, 0xfc, 0xe8, 0xca, 0x1c, 0xaa, 0xe3, 0x97, 0x69, 0x59, 0x7a, 0x9f, 0xd1, 0x4c, 0x49, 0xd3, + 0x92, 0x99, 0xae, 0x69, 0xe1, 0x5d, 0x99, 0xa2, 0x69, 0x99, 0x9f, 0xa1, 0x69, 0x09, 0x4a, 0xca, + 0x9a, 0x16, 0xd4, 0xb7, 0x2d, 0x4e, 0xd3, 0xb7, 0x05, 0x65, 0x98, 0xbe, 0xed, 0x3a, 0xef, 0xee, + 0xb0, 0xf5, 0xd0, 0xc5, 0x71, 0xe0, 0xbb, 0x1a, 0x3b, 0x62, 0xb5, 0x1e, 0xe2, 0x5b, 0xfc, 0xce, + 0x12, 0x88, 0x07, 0x7c, 0xed, 0x8f, 0x95, 0x88, 0x9a, 0x42, 0x4c, 0xc5, 0x0d, 0x58, 0xed, 0x9c, + 0x52, 0xf9, 0xc9, 0x6b, 0x4b, 0x8c, 0xf0, 0x8a, 0xb5, 0x22, 0x52, 0x19, 0x33, 0xfc, 0x39, 0x58, + 0xf3, 0xc9, 0x38, 0x3f, 0x88, 0x8e, 0x3d, 0x96, 0x5f, 0x9a, 0xa3, 0x54, 0x3c, 0x0f, 0xeb, 0x3e, + 0x21, 0x17, 0x35, 0x19, 0x2f, 0xbc, 0x62, 0xa9, 0x22, 0xa3, 0xc1, 0xd3, 0xb5, 0xe3, 0x28, 0x5b, + 0xf4, 0x19, 0xb5, 0x4a, 0xfb, 0x61, 0x3a, 0x24, 0xc2, 0x89, 0xcf, 0xec, 0x40, 0x8e, 0xde, 0x96, + 0x7c, 0x90, 0xf8, 0xb1, 0x72, 0x75, 0xca, 0xf0, 0x73, 0x13, 0x08, 0xdb, 0xae, 0x5b, 0x30, 0x1a, + 0xf5, 0x85, 0x45, 0x84, 0xcb, 0x18, 0x02, 0xc6, 0x96, 0xe3, 0xf2, 0x13, 0xd5, 0xb1, 0x33, 0x24, + 0x3f, 0xbb, 0x3a, 0xc1, 0x43, 0xd3, 0xd5, 0x87, 0x8c, 0x81, 0xff, 0x4b, 0x7c, 0xa0, 0x09, 0xa8, + 0xf1, 0x18, 0x85, 0x2b, 0x4f, 0x27, 0x30, 0x76, 0xb1, 0xca, 0x71, 0x94, 0xb0, 0x66, 0x75, 0x22, + 0xfe, 0x15, 0xd5, 0x1a, 0xb0, 0x8c, 0x02, 0x94, 0xa8, 0x30, 0x93, 0xa0, 0xb1, 0x8b, 0x77, 0xbe, + 0x60, 0x56, 0xad, 0x1c, 0x2d, 0x27, 0xaa, 0x39, 0x81, 0x67, 0x65, 0xb1, 0x27, 0xdc, 0xc8, 0x79, + 0x01, 0xba, 0x39, 0x73, 0x04, 0x02, 0xe9, 0x08, 0x9b, 0x7a, 0xa1, 0x15, 0x4e, 0xe0, 0x64, 0xda, + 0x09, 0x6c, 0x4e, 0x9f, 0x92, 0x19, 0x01, 0x5d, 0x02, 0x9e, 0x29, 0x25, 0xf3, 0x4c, 0xb2, 0x10, + 0x94, 0x0e, 0x09, 0x41, 0xda, 0x5f, 0xa6, 0xe1, 0xda, 0x19, 0xa6, 0x6b, 0xc6, 0x37, 0xbf, 0x02, + 0x39, 0xf6, 0xce, 0xc0, 0x8e, 0xcf, 0x54, 0x88, 0x6d, 0xa5, 0x95, 0xf2, 0xb3, 0x8e, 0xb2, 0xd0, + 0xc1, 0x79, 0x07, 0x23, 0xff, 0x7f, 0xf2, 0x2b, 0xb0, 0xc6, 0x0e, 0x34, 0x66, 0xc5, 0x74, 0x34, + 0xe9, 0x9e, 0xe1, 0x44, 0xdb, 0x12, 0x2e, 0x17, 0x91, 0xa2, 0x78, 0xc8, 0xe1, 0x89, 0x61, 0xfb, + 0x69, 0xc4, 0x81, 0x1c, 0x92, 0x1d, 0xb5, 0x3a, 0xdd, 0x33, 0xd9, 0xfe, 0x0b, 0x87, 0x0e, 0xb9, + 0x18, 0x33, 0xbe, 0xa4, 0x09, 0x25, 0xfc, 0x4d, 0x6e, 0xc2, 0x5a, 0x6f, 0x72, 0x4a, 0xe5, 0x46, + 0xb6, 0x16, 0xf8, 0x63, 0xf1, 0xbc, 0xb5, 0xd2, 0x9b, 0x9c, 0xea, 0x83, 0x01, 0x4e, 0x29, 0xbe, + 0x2a, 0xaf, 0x53, 0x3a, 0xb6, 0x6b, 0x05, 0xe5, 0x02, 0x52, 0xd2, 0x0a, 0xd8, 0xbe, 0xe5, 0xb4, + 0xe7, 0x81, 0xd9, 0x18, 0xf1, 0x80, 0x36, 0xec, 0x87, 0xf6, 0xd3, 0x94, 0x60, 0xd7, 0xa7, 0xaf, + 0xfb, 0x5f, 0x4c, 0x51, 0xc2, 0x14, 0xdd, 0x02, 0x95, 0x0e, 0x7d, 0x70, 0xa8, 0xf8, 0x73, 0xb4, + 0xda, 0x9b, 0x9c, 0xfa, 0x63, 0x27, 0x0f, 0xfc, 0x82, 0x3c, 0xf0, 0xaf, 0x0a, 0x76, 0x3e, 0xf1, + 0x78, 0x98, 0x3e, 0xe4, 0xda, 0x7f, 0xa6, 0xe1, 0xe6, 0xd9, 0x0e, 0x81, 0x5f, 0xcc, 0x5b, 0xc2, + 0xbc, 0x45, 0xf4, 0x3a, 0xf3, 0x31, 0xbd, 0x4e, 0xc2, 0xde, 0x5b, 0x48, 0xda, 0x7b, 0x31, 0x2d, + 0xd2, 0x62, 0x82, 0x16, 0x29, 0x71, 0x83, 0x66, 0x1f, 0xb3, 0x41, 0x97, 0xe4, 0x75, 0xf2, 0x6f, + 0xbe, 0xfc, 0x15, 0x66, 0xed, 0xdf, 0x81, 0x73, 0x82, 0xb5, 0x67, 0x37, 0x47, 0xa0, 0x1c, 0xcc, + 0xdd, 0xbd, 0x9d, 0xc4, 0xd4, 0x23, 0x59, 0x02, 0xe3, 0xbd, 0xce, 0xd9, 0xf9, 0x20, 0xff, 0xff, + 0x0f, 0x23, 0x4f, 0x1e, 0xc0, 0x05, 0x84, 0x83, 0x3e, 0x94, 0xd5, 0x9a, 0xee, 0xd0, 0x3b, 0xe2, + 0xeb, 0xe1, 0x6a, 0x8c, 0xed, 0xed, 0x1c, 0x4a, 0xcd, 0xb1, 0xbc, 0xa3, 0xf2, 0x9c, 0x75, 0x7e, + 0x94, 0x90, 0x1e, 0x95, 0x11, 0xfe, 0x46, 0x01, 0xed, 0xf1, 0xe3, 0x85, 0x72, 0x76, 0x74, 0xc0, + 0xa9, 0x9c, 0x2d, 0x8d, 0xde, 0x35, 0x58, 0x19, 0x7a, 0x47, 0x43, 0x6f, 0x74, 0x12, 0x12, 0xe0, + 0x96, 0x79, 0xa2, 0x18, 0x18, 0x01, 0x4a, 0xf7, 0x44, 0x4c, 0xb6, 0x28, 0xa4, 0x95, 0x7c, 0xd1, + 0x2f, 0x71, 0x1e, 0xe8, 0x6a, 0x92, 0x1b, 0xc8, 0x7e, 0xdc, 0xcf, 0x64, 0x53, 0x6a, 0xda, 0xe2, + 0xd0, 0x79, 0x47, 0x9d, 0xae, 0xa7, 0xfd, 0xad, 0x22, 0x38, 0x82, 0xa4, 0xc1, 0x23, 0xef, 0x48, + 0xb6, 0x7f, 0xe9, 0x18, 0x1b, 0x92, 0x54, 0x44, 0x36, 0x93, 0xe2, 0x68, 0x6e, 0x98, 0x10, 0x42, + 0x73, 0xc3, 0x94, 0xa7, 0x30, 0x60, 0xe2, 0x02, 0xf0, 0x3d, 0x61, 0x40, 0x40, 0xcf, 0xbc, 0xfd, + 0x3b, 0xe4, 0x36, 0x2c, 0x32, 0x9b, 0x01, 0xd1, 0xdc, 0xb5, 0x50, 0x73, 0xf7, 0xef, 0x58, 0x22, + 0x5f, 0xfb, 0x81, 0xaf, 0x89, 0x8b, 0x75, 0x62, 0xff, 0x0e, 0x79, 0xf5, 0x6c, 0xb6, 0x7c, 0x59, + 0x61, 0xcb, 0xe7, 0xdb, 0xf1, 0xbd, 0x16, 0xb2, 0xe3, 0xbb, 0x3e, 0x7b, 0xb4, 0xf8, 0x53, 0x09, + 0x43, 0x2f, 0x0b, 0x50, 0x6d, 0x7e, 0xaa, 0xc0, 0xe5, 0x99, 0x25, 0xc8, 0x25, 0xc8, 0xea, 0x0d, + 0xd3, 0x09, 0xe6, 0x97, 0xee, 0x19, 0x91, 0x42, 0x76, 0x61, 0x69, 0xa7, 0x35, 0xea, 0x1c, 0xd2, + 0x65, 0x9c, 0xa8, 0xbb, 0x8c, 0x55, 0xeb, 0x93, 0x97, 0xe7, 0xac, 0xa0, 0x2c, 0x71, 0x61, 0x1d, + 0xf7, 0x42, 0x28, 0x52, 0x4c, 0x3a, 0x41, 0x6d, 0x10, 0xab, 0x30, 0x56, 0x8c, 0x9e, 0x33, 0xb1, + 0xc4, 0xe8, 0x16, 0x7c, 0x4f, 0xf0, 0x22, 0xd3, 0x1b, 0xf8, 0x04, 0x30, 0x8c, 0xb7, 0x20, 0xdb, + 0x10, 0x8f, 0x98, 0x92, 0xf1, 0xab, 0x78, 0xb0, 0xb4, 0xfc, 0x5c, 0xed, 0xf7, 0x14, 0x21, 0xdb, + 0x3f, 0xbe, 0x23, 0x52, 0x90, 0x9d, 0xf6, 0xec, 0x20, 0x3b, 0xed, 0x4f, 0x18, 0x64, 0x47, 0xfb, + 0x6b, 0x0e, 0x92, 0x6c, 0xb6, 0x1b, 0x11, 0xc5, 0xd2, 0xd3, 0x1a, 0x31, 0x1b, 0xa1, 0xd5, 0x79, + 0x4d, 0x0a, 0xd2, 0x16, 0xff, 0xd6, 0x74, 0x5b, 0x66, 0x69, 0xa9, 0xfe, 0x69, 0x1a, 0x2e, 0xcd, + 0x2a, 0x9e, 0x18, 0x06, 0x56, 0x79, 0xb2, 0x30, 0xb0, 0xb7, 0x21, 0xcb, 0xd2, 0x7c, 0x0b, 0x5d, + 0x1c, 0x70, 0x5e, 0x94, 0x0e, 0xb8, 0xc8, 0x26, 0xd7, 0x60, 0x41, 0x2f, 0xd8, 0x41, 0x64, 0x22, + 0x34, 0xa5, 0x6b, 0x1d, 0x8e, 0xd0, 0x48, 0x8b, 0x67, 0x91, 0x6f, 0xc4, 0x83, 0x71, 0xf1, 0x90, + 0x44, 0x5b, 0xd2, 0x80, 0xc4, 0xf0, 0xcb, 0xb1, 0xbd, 0x01, 0xde, 0x36, 0x87, 0xb0, 0xb5, 0xe2, + 0x81, 0xbd, 0x34, 0x58, 0x68, 0x0c, 0xbd, 0x91, 0x37, 0x96, 0xcd, 0xdc, 0x06, 0x98, 0x62, 0xf1, + 0x1c, 0x6e, 0x84, 0xd6, 0x7a, 0xc4, 0x7c, 0x8e, 0x17, 0x64, 0x1c, 0x08, 0xb4, 0x5a, 0xa3, 0xc9, + 0x96, 0x44, 0x42, 0x0b, 0x54, 0x5a, 0x93, 0xde, 0xe1, 0x49, 0xd3, 0xaa, 0x70, 0x56, 0x83, 0x15, + 0xe8, 0x62, 0x2a, 0xed, 0xe0, 0xc8, 0x92, 0x48, 0xb4, 0xef, 0x2a, 0x70, 0x3e, 0xa9, 0x1f, 0xe4, + 0x12, 0x64, 0x7a, 0x89, 0x71, 0xc7, 0x7a, 0xcc, 0x55, 0x32, 0x47, 0xff, 0xba, 0x47, 0xfd, 0xe1, + 0x69, 0x6b, 0x2c, 0x1b, 0x03, 0x4a, 0xc9, 0x16, 0xd0, 0x1f, 0x25, 0xfc, 0x9f, 0x5c, 0x11, 0x67, + 0x74, 0x3a, 0x16, 0xa9, 0x0c, 0xff, 0x68, 0x3a, 0x80, 0xd9, 0x6e, 0xd4, 0x07, 0x0c, 0x3f, 0xfb, + 0x65, 0xc8, 0xd0, 0x66, 0x45, 0x56, 0x2f, 0x5d, 0x3f, 0x7a, 0xb5, 0xc2, 0x89, 0x58, 0xab, 0x46, + 0xad, 0xd3, 0xae, 0x85, 0xc4, 0xda, 0x01, 0xac, 0x86, 0x29, 0x88, 0x11, 0x46, 0x5c, 0xcc, 0xdd, + 0x55, 0x79, 0x4d, 0x3b, 0xfd, 0x3e, 0x33, 0x48, 0xdf, 0x79, 0xf6, 0x1f, 0x3f, 0xba, 0x02, 0xf4, + 0x27, 0x2b, 0x93, 0x84, 0xc8, 0xa8, 0x7d, 0x2f, 0x05, 0xe7, 0x03, 0x1f, 0x58, 0xb1, 0x87, 0x7e, + 0x6e, 0x1d, 0xb2, 0xf4, 0x90, 0xc3, 0x90, 0x60, 0xb4, 0xe2, 0x1d, 0x9c, 0xe1, 0xa7, 0xb0, 0x0b, + 0x1b, 0xd3, 0xe8, 0xc9, 0xf3, 0xb0, 0x84, 0xb0, 0x29, 0x83, 0xd6, 0xa1, 0x27, 0x9f, 0x7d, 0x3d, + 0x91, 0x68, 0x05, 0xf9, 0xda, 0x8f, 0x15, 0xd8, 0xe4, 0x66, 0xd4, 0xd5, 0x56, 0xa7, 0x87, 0xcf, + 0x44, 0x87, 0xde, 0xa7, 0xe3, 0x50, 0xb8, 0x1b, 0x3a, 0xc7, 0x6e, 0x84, 0xad, 0xe5, 0x63, 0x5f, + 0x9b, 0xde, 0x5b, 0x72, 0x1b, 0xa1, 0x80, 0xf8, 0x9b, 0x58, 0x86, 0x39, 0x70, 0xf7, 0x68, 0x82, + 0xec, 0xc0, 0x8d, 0x14, 0xda, 0xaf, 0xc3, 0xf6, 0xec, 0x0f, 0x90, 0xaf, 0xc3, 0x0a, 0xc6, 0x96, + 0x69, 0x0e, 0x8e, 0x87, 0xad, 0xb6, 0x27, 0x54, 0x61, 0x42, 0x13, 0x29, 0xe7, 0x31, 0x64, 0x23, + 0xee, 0x50, 0x7c, 0x8c, 0x51, 0x6b, 0x78, 0xa1, 0x90, 0xaf, 0x82, 0x5c, 0x9b, 0xf6, 0x1b, 0x0a, + 0x90, 0x78, 0x1d, 0xe4, 0x8b, 0xb0, 0xdc, 0x74, 0x0a, 0xf6, 0xb8, 0x35, 0x1c, 0x97, 0xfb, 0x93, + 0x21, 0x87, 0x15, 0x62, 0xfe, 0xa5, 0xe3, 0x43, 0x7a, 0x94, 0x0c, 0xc7, 0xee, 0x49, 0x7f, 0x32, + 0xb4, 0x42, 0x74, 0x18, 0x14, 0xc5, 0xf3, 0xbe, 0xd9, 0x6e, 0x3d, 0x0a, 0x07, 0x45, 0xe1, 0x69, + 0xa1, 0xa0, 0x28, 0x3c, 0x4d, 0xfb, 0x40, 0x81, 0x2d, 0x61, 0xea, 0xd4, 0x4e, 0x68, 0x4b, 0x01, + 0x51, 0x14, 0x86, 0x02, 0xc7, 0x72, 0x16, 0x4b, 0xbb, 0x2e, 0x80, 0x46, 0xb0, 0x81, 0xc8, 0xdb, + 0xb2, 0xb2, 0xe4, 0x2b, 0x90, 0xb1, 0xc7, 0xfd, 0xc1, 0x19, 0x90, 0x46, 0x54, 0x7f, 0x46, 0xc7, + 0xfd, 0x01, 0x56, 0x81, 0x25, 0x35, 0x0f, 0xce, 0xcb, 0x8d, 0x13, 0x2d, 0x26, 0x55, 0x58, 0xe4, + 0x90, 0x52, 0x91, 0x77, 0xc6, 0x19, 0x7d, 0xda, 0x59, 0x13, 0x70, 0x26, 0x1c, 0x47, 0xd1, 0x12, + 0x75, 0x68, 0x7f, 0xa0, 0x40, 0x8e, 0x72, 0x1b, 0x28, 0xc5, 0x3d, 0xed, 0x92, 0x0e, 0x33, 0x8e, + 0xe2, 0x51, 0xdc, 0xaf, 0xfe, 0x4c, 0xb7, 0xf1, 0x2b, 0xb0, 0x16, 0x29, 0x40, 0x34, 0x74, 0x64, + 0xef, 0x76, 0x0e, 0x5b, 0x2c, 0xc6, 0x02, 0x7b, 0x50, 0x0e, 0xa5, 0x69, 0xbf, 0xa3, 0xc0, 0x79, + 0x2a, 0xf3, 0x9b, 0xa8, 0xee, 0xb5, 0x26, 0x5d, 0xb1, 0xdf, 0x29, 0x07, 0x25, 0x6c, 0xe6, 0x98, + 0x93, 0x2d, 0xe3, 0xa0, 0x78, 0x9a, 0xe5, 0xe7, 0x92, 0x32, 0x64, 0xf9, 0xfd, 0x32, 0xe2, 0xf0, + 0x87, 0xdb, 0x92, 0x32, 0x21, 0xa8, 0x98, 0x13, 0xd1, 0x9e, 0xe0, 0x11, 0xc6, 0xcb, 0x58, 0x7e, + 0x69, 0xed, 0xbf, 0x14, 0xb8, 0x38, 0xa5, 0x0c, 0x79, 0x03, 0xe6, 0xd1, 0x01, 0x88, 0xcf, 0xde, + 0xa5, 0x29, 0x9f, 0x18, 0x1f, 0x9e, 0xec, 0xdf, 0x61, 0x17, 0xd1, 0x29, 0xfd, 0x61, 0xb1, 0x52, + 0xe4, 0x1d, 0x58, 0xd2, 0xdb, 0x6d, 0x2e, 0xce, 0xa4, 0x42, 0xe2, 0xcc, 0x94, 0x2f, 0xbe, 0xe8, + 0xd3, 0x33, 0x71, 0x86, 0x99, 0xa2, 0xb7, 0xdb, 0x2e, 0x77, 0x6e, 0x0a, 0xea, 0xdb, 0xfc, 0x65, + 0x58, 0x0d, 0x13, 0x3f, 0x91, 0x3f, 0xc6, 0x0f, 0x14, 0x50, 0xc3, 0x6d, 0xf8, 0x6c, 0x80, 0x58, + 0x92, 0xa6, 0xf9, 0x31, 0x8b, 0xea, 0x8f, 0x52, 0xf0, 0x4c, 0xe2, 0x08, 0x93, 0x17, 0x60, 0x41, + 0x1f, 0x0c, 0xcc, 0x22, 0x5f, 0x55, 0x9c, 0x43, 0x42, 0x2d, 0x71, 0x48, 0xda, 0x63, 0x44, 0xe4, + 0x65, 0xc8, 0xe2, 0xca, 0xa4, 0x05, 0x52, 0x01, 0x10, 0x21, 0x53, 0xa2, 0x44, 0x80, 0x08, 0x05, + 0x21, 0x29, 0xc1, 0x2a, 0xc7, 0x64, 0xb0, 0xbc, 0x63, 0xef, 0xdb, 0x3e, 0x22, 0x36, 0x82, 0x76, + 0x0b, 0xd5, 0xb3, 0x3b, 0x64, 0x79, 0x32, 0x2a, 0x41, 0xb8, 0x14, 0xa9, 0x80, 0x8a, 0x75, 0xca, + 0x35, 0x31, 0x34, 0x44, 0x44, 0xc9, 0x60, 0x8d, 0x98, 0x52, 0x57, 0xac, 0xa4, 0x3f, 0x5d, 0xfa, + 0x68, 0xd4, 0x39, 0xee, 0x9d, 0x7a, 0xbd, 0xf1, 0x67, 0x37, 0x5d, 0xc1, 0x37, 0xce, 0x34, 0x5d, + 0x7f, 0x92, 0x61, 0x9b, 0x39, 0x5a, 0x8c, 0x72, 0x34, 0x12, 0x00, 0x2e, 0x72, 0x34, 0x18, 0x32, + 0x9c, 0xa1, 0x0e, 0x14, 0x61, 0x91, 0xa1, 0x41, 0x88, 0x9d, 0x71, 0x39, 0xb1, 0x09, 0x8c, 0x66, + 0xff, 0x0e, 0x63, 0x5f, 0x98, 0x27, 0xd2, 0xc8, 0x12, 0x45, 0xc9, 0x3e, 0xe4, 0x0a, 0x5d, 0xaf, + 0xd5, 0x9b, 0x0c, 0x9c, 0xb3, 0xbd, 0x1e, 0x6e, 0xf0, 0xbe, 0x2c, 0x1f, 0xb2, 0x62, 0xf8, 0xea, + 0x88, 0x27, 0xb9, 0x5c, 0x11, 0x71, 0x7c, 0xe7, 0x04, 0x16, 0xe8, 0xfd, 0x0b, 0x33, 0xc6, 0x27, + 0x9a, 0x88, 0xe5, 0xc2, 0x9e, 0x37, 0xdc, 0x7b, 0xc1, 0x85, 0xd5, 0x4a, 0x6b, 0x34, 0x76, 0x86, + 0xad, 0xde, 0x08, 0x51, 0xe4, 0xce, 0x80, 0xb2, 0xb3, 0x25, 0x22, 0x94, 0xa2, 0x8e, 0x71, 0xec, + 0x17, 0x65, 0x1a, 0xcc, 0x70, 0x75, 0x94, 0x5f, 0x2a, 0x75, 0x7a, 0xad, 0x6e, 0xe7, 0x7d, 0xe1, + 0xc3, 0xc5, 0xf8, 0xa5, 0x23, 0x91, 0x68, 0x05, 0xf9, 0xda, 0xd7, 0x62, 0xf3, 0xc6, 0x5a, 0x99, + 0x83, 0x45, 0xee, 0xe1, 0xcb, 0x3c, 0x5e, 0x1b, 0x46, 0xad, 0x68, 0xd6, 0x76, 0x55, 0x85, 0xac, + 0x02, 0x34, 0xac, 0x7a, 0xc1, 0xb0, 0x6d, 0xfa, 0x3b, 0x45, 0x7f, 0x73, 0x77, 0xd8, 0x52, 0xb3, + 0xa2, 0xa6, 0x25, 0x8f, 0xd8, 0x8c, 0xf6, 0x23, 0x05, 0x2e, 0x24, 0x4f, 0x25, 0x71, 0x00, 0x7d, + 0xa2, 0xf9, 0x3b, 0xf2, 0x17, 0x67, 0xce, 0x7b, 0x62, 0x72, 0xd4, 0xb7, 0x7a, 0xcc, 0x7c, 0x76, + 0x53, 0xe2, 0xb1, 0x28, 0x08, 0x8b, 0xdf, 0x69, 0x6b, 0x05, 0xd8, 0x98, 0x56, 0x47, 0xb8, 0xab, + 0x6b, 0x90, 0xd3, 0x1b, 0x8d, 0x8a, 0x59, 0xd0, 0x1d, 0xb3, 0x5e, 0x53, 0x15, 0xb2, 0x04, 0xf3, + 0xbb, 0x56, 0xbd, 0xd9, 0x50, 0x53, 0xda, 0xf7, 0x15, 0x58, 0x31, 0x03, 0x2b, 0x93, 0xa7, 0xdd, + 0x7c, 0xaf, 0x87, 0x36, 0xdf, 0x86, 0x8f, 0x1e, 0xe0, 0x7f, 0xe0, 0x4c, 0x3b, 0xef, 0x1f, 0x14, + 0x58, 0x8f, 0x95, 0x21, 0x36, 0x2c, 0xea, 0x07, 0x76, 0xdd, 0x2c, 0x16, 0x78, 0xcb, 0xae, 0x04, + 0x86, 0x2c, 0x18, 0x20, 0x26, 0xf6, 0x15, 0xe6, 0x71, 0xf7, 0x70, 0xe4, 0xf6, 0x3b, 0x6d, 0x29, + 0xb8, 0x63, 0x79, 0xce, 0x12, 0x35, 0xe1, 0x4d, 0xf6, 0xfe, 0x64, 0xe8, 0x61, 0xb5, 0xa9, 0x90, + 0x22, 0xd4, 0x4f, 0x8f, 0x57, 0x8c, 0xd6, 0xd8, 0x2d, 0x9a, 0x1f, 0xaf, 0x3a, 0xa8, 0x6f, 0x67, + 0x05, 0x72, 0x5c, 0x6a, 0x41, 0x81, 0xe0, 0x87, 0x0a, 0x6c, 0x4c, 0x6b, 0x2b, 0x15, 0x84, 0xc2, + 0xee, 0xb7, 0x17, 0x7c, 0xc0, 0xf7, 0xb0, 0xdf, 0xad, 0x20, 0x23, 0x6f, 0x42, 0xce, 0x1c, 0x8d, + 0x26, 0xde, 0xd0, 0x7e, 0xb9, 0x69, 0x99, 0x7c, 0x81, 0x5c, 0xfe, 0xf7, 0x8f, 0xae, 0x5c, 0x44, + 0x9b, 0xe9, 0xa1, 0x3b, 0x7a, 0xd9, 0x9d, 0x0c, 0x3b, 0x21, 0x70, 0x6c, 0xb9, 0x04, 0xe5, 0x5b, + 0x5b, 0x93, 0x76, 0xc7, 0x13, 0x5c, 0xbb, 0x70, 0x51, 0xe4, 0x69, 0xf2, 0x2d, 0x22, 0xd2, 0xb4, + 0xef, 0x28, 0xb0, 0x39, 0x7d, 0x60, 0xe8, 0xcd, 0xe4, 0x30, 0x2b, 0x36, 0xe1, 0x24, 0x88, 0x37, + 0x93, 0x6f, 0xea, 0x26, 0xd7, 0x29, 0x08, 0x69, 0x21, 0x3f, 0xd8, 0x72, 0x2a, 0x16, 0x61, 0x35, + 0x5c, 0x48, 0x10, 0x6a, 0xff, 0x91, 0x82, 0x0b, 0x74, 0xd1, 0x75, 0xbd, 0xd1, 0x48, 0x9f, 0x8c, + 0x4f, 0xbc, 0xde, 0x98, 0xb3, 0x61, 0xe4, 0x55, 0x58, 0x38, 0x79, 0x32, 0x95, 0x23, 0x23, 0x27, + 0x04, 0xf0, 0x20, 0x17, 0x16, 0xe0, 0xf4, 0x7f, 0x72, 0x15, 0xe4, 0x98, 0xb6, 0x69, 0x44, 0xd5, + 0x4b, 0x6d, 0x28, 0xd6, 0xd2, 0xc0, 0x0f, 0x3f, 0xf9, 0x1a, 0xcc, 0xa3, 0x9a, 0x81, 0x1f, 0xa9, + 0x82, 0x15, 0x4e, 0x6e, 0x1d, 0x2a, 0x21, 0x2c, 0x56, 0x80, 0xbc, 0x04, 0x10, 0x00, 0x92, 0xf3, + 0x33, 0x53, 0x88, 0xdf, 0x3e, 0x26, 0xb9, 0xb5, 0x74, 0x7a, 0xd4, 0xe2, 0x28, 0xdf, 0x79, 0x58, + 0x17, 0xc3, 0x32, 0x10, 0x60, 0x5c, 0xfc, 0x35, 0x6c, 0x8d, 0x65, 0x98, 0x03, 0x01, 0xc8, 0x75, + 0x3d, 0x16, 0x97, 0x13, 0x31, 0x39, 0x23, 0xc1, 0x37, 0xaf, 0xc7, 0x82, 0x6f, 0x66, 0x19, 0x95, + 0x1c, 0x61, 0x53, 0xfb, 0xd7, 0x14, 0x2c, 0x1d, 0x50, 0x66, 0x05, 0x45, 0xf0, 0xd9, 0x22, 0xfd, + 0x5d, 0xc8, 0x55, 0xfa, 0x2d, 0xfe, 0xec, 0xc0, 0x0d, 0xa7, 0x99, 0x2b, 0x61, 0xb7, 0xdf, 0x12, + 0x2f, 0x18, 0x23, 0x4b, 0x26, 0x7a, 0x8c, 0x1b, 0xe4, 0x7d, 0x58, 0x60, 0xcf, 0x40, 0x5c, 0xbb, + 0x24, 0xd8, 0x55, 0xbf, 0x45, 0x2f, 0xb2, 0x6c, 0x49, 0x53, 0xce, 0x9e, 0x92, 0x64, 0xde, 0x89, + 0x43, 0x0b, 0x4a, 0x0a, 0x87, 0xf9, 0xb3, 0x29, 0x1c, 0x24, 0x08, 0xa5, 0x85, 0xb3, 0x40, 0x28, + 0x6d, 0xde, 0x83, 0x9c, 0xd4, 0x9e, 0x27, 0xe2, 0x5e, 0x7f, 0x33, 0x05, 0x2b, 0xd8, 0x2b, 0xdf, + 0x26, 0xe4, 0xe7, 0x53, 0x7d, 0xf2, 0x7a, 0x48, 0x7d, 0xb2, 0x21, 0xcf, 0x17, 0xeb, 0xd9, 0x0c, + 0xbd, 0xc9, 0x7d, 0x58, 0x8f, 0x11, 0x92, 0x57, 0x60, 0x9e, 0x36, 0x5f, 0x88, 0x9b, 0x6a, 0x74, + 0x05, 0x04, 0x70, 0x9b, 0xb4, 0xe3, 0x23, 0x8b, 0x51, 0x6b, 0xff, 0xad, 0xc0, 0x32, 0x47, 0xbb, + 0xef, 0x1d, 0xf5, 0x1f, 0x3b, 0x9c, 0x37, 0xa3, 0xc3, 0xc9, 0x9c, 0xfa, 0xf9, 0x70, 0xfe, 0x6f, + 0x0f, 0xe2, 0xbd, 0xd0, 0x20, 0x5e, 0xf4, 0xc1, 0xb7, 0x44, 0x77, 0x66, 0x8c, 0xe1, 0xdf, 0x21, + 0x1c, 0x65, 0x98, 0x90, 0x7c, 0x03, 0x96, 0x6a, 0xde, 0xc3, 0x90, 0xd4, 0x76, 0x73, 0x4a, 0xa5, + 0x2f, 0xfa, 0x84, 0x6c, 0x4f, 0xe1, 0x85, 0xd7, 0xf3, 0x1e, 0xba, 0xb1, 0x17, 0xa8, 0xa0, 0x4a, + 0x2a, 0xb8, 0x85, 0x8b, 0x3d, 0xc9, 0xd2, 0xe7, 0x5e, 0x5c, 0x88, 0x53, 0xf1, 0xdd, 0x34, 0x40, + 0xe0, 0x00, 0x43, 0x37, 0x60, 0xe8, 0xf1, 0x5d, 0x28, 0xbc, 0x31, 0x49, 0x5e, 0xe3, 0xe2, 0x4d, + 0xfe, 0x26, 0x57, 0xcc, 0xa6, 0xa6, 0x83, 0xa3, 0xa1, 0x8a, 0xb6, 0xc0, 0x3d, 0x2e, 0xda, 0x5e, + 0xb7, 0xc5, 0xce, 0xf6, 0xf4, 0xce, 0x75, 0xc4, 0xc2, 0xf4, 0x53, 0xa7, 0x84, 0x2d, 0x45, 0xbf, + 0x8c, 0x22, 0x25, 0x88, 0x39, 0x95, 0x65, 0x9e, 0xcc, 0xa9, 0xac, 0x01, 0x4b, 0x9d, 0xde, 0x7b, + 0x5e, 0x6f, 0xdc, 0x1f, 0x3e, 0x42, 0x6d, 0x74, 0xa0, 0xe6, 0xa2, 0x43, 0x60, 0x8a, 0x3c, 0x36, + 0x0f, 0x78, 0x31, 0xfa, 0xf4, 0xf2, 0x34, 0xf8, 0x89, 0xbe, 0x53, 0xdc, 0xbc, 0xba, 0x70, 0x3f, + 0x93, 0x5d, 0x50, 0x17, 0xef, 0x67, 0xb2, 0x59, 0x75, 0xe9, 0x7e, 0x26, 0xbb, 0xa4, 0x82, 0x25, + 0xbd, 0xef, 0xf8, 0xef, 0x37, 0xd2, 0x93, 0x4b, 0xf8, 0x39, 0x45, 0xfb, 0x59, 0x0a, 0x48, 0xbc, + 0x19, 0xe4, 0x75, 0xc8, 0xb1, 0x03, 0xd6, 0x1d, 0x8e, 0xbe, 0xc5, 0xad, 0x6e, 0x19, 0xda, 0x87, + 0x94, 0x2c, 0xa3, 0x7d, 0xb0, 0x64, 0x6b, 0xf4, 0xad, 0x2e, 0xf9, 0x3a, 0x9c, 0xc3, 0xe1, 0x1d, + 0x78, 0xc3, 0x4e, 0xbf, 0xed, 0x22, 0x34, 0x63, 0xab, 0xcb, 0x43, 0x8c, 0xbd, 0x80, 0xb1, 0x30, + 0xe3, 0xd9, 0x53, 0xa6, 0x01, 0xfd, 0x5c, 0x1a, 0x48, 0xd9, 0x60, 0x84, 0xc4, 0x01, 0x55, 0x2e, + 0x7f, 0x34, 0xe9, 0x76, 0xf9, 0xcc, 0xe6, 0xa9, 0xa0, 0x1b, 0xcd, 0x9b, 0x52, 0xf1, 0x6a, 0x50, + 0x71, 0x69, 0xd2, 0xed, 0x92, 0x57, 0x01, 0xfa, 0x3d, 0xf7, 0xb4, 0x33, 0x1a, 0xb1, 0x37, 0x0e, + 0xdf, 0x25, 0x2f, 0x48, 0x95, 0x27, 0xa3, 0xdf, 0xab, 0xb2, 0x44, 0xf2, 0x4b, 0x80, 0x4e, 0xc2, + 0xe8, 0x3d, 0xcf, 0xac, 0x5a, 0x78, 0xd0, 0x00, 0x91, 0x18, 0xf6, 0x00, 0x3c, 0xf6, 0xec, 0xce, + 0xfb, 0xc2, 0xe2, 0xf9, 0x6d, 0x58, 0xe7, 0xf6, 0xa4, 0x07, 0x9d, 0xf1, 0x09, 0xe7, 0xb0, 0x9f, + 0x86, 0x3d, 0x97, 0x58, 0xec, 0x7f, 0xca, 0x00, 0xe8, 0x07, 0xb6, 0x00, 0xa6, 0xb9, 0x0d, 0xf3, + 0x54, 0x6e, 0x10, 0xfa, 0x07, 0xd4, 0xde, 0x62, 0xbd, 0xb2, 0xf6, 0x16, 0x29, 0xe8, 0x6e, 0xb4, + 0xd0, 0xea, 0x5c, 0xe8, 0x1e, 0x70, 0x37, 0x32, 0x43, 0xf4, 0x10, 0x30, 0x28, 0xa7, 0x22, 0x15, + 0x80, 0x00, 0x2a, 0x86, 0x4b, 0xb2, 0xeb, 0x01, 0xe6, 0x02, 0xcf, 0xe0, 0xe0, 0xe4, 0x01, 0xdc, + 0x8c, 0xbc, 0x7c, 0x02, 0x32, 0xb2, 0x07, 0x19, 0xa7, 0xe5, 0x3b, 0x9c, 0x4d, 0x01, 0xd0, 0x79, + 0x8e, 0x87, 0x80, 0x0b, 0x40, 0x74, 0x56, 0xc7, 0xad, 0x50, 0xa4, 0x4c, 0xac, 0x84, 0x18, 0xb0, + 0xc0, 0xc3, 0xfb, 0x4e, 0x01, 0x5e, 0xe3, 0xd1, 0x7d, 0x39, 0xdc, 0x2a, 0x26, 0xca, 0x3c, 0x05, + 0x0f, 0xe4, 0x7b, 0x17, 0xd2, 0xb6, 0x5d, 0xe5, 0x6e, 0xe3, 0x2b, 0x81, 0x54, 0x62, 0xdb, 0x55, + 0x11, 0xbb, 0xfe, 0x54, 0x2a, 0x46, 0x89, 0xc9, 0x97, 0x20, 0x27, 0xb1, 0xcf, 0x1c, 0x70, 0x01, + 0xc7, 0x40, 0x32, 0xfa, 0x97, 0x0f, 0x0d, 0x89, 0x9a, 0x54, 0x40, 0xdd, 0x9b, 0xbc, 0xeb, 0xe9, + 0x83, 0x01, 0xfa, 0xfa, 0xbc, 0xe7, 0x0d, 0x19, 0xdb, 0x96, 0x0d, 0x90, 0x4a, 0xd1, 0x55, 0xaa, + 0x2d, 0x72, 0x65, 0x1d, 0x4c, 0xb4, 0x24, 0x69, 0xc0, 0xba, 0xed, 0x8d, 0x27, 0x03, 0x66, 0xa7, + 0x51, 0xea, 0x0f, 0xa9, 0x10, 0xc2, 0xe0, 0x19, 0x10, 0xd4, 0x71, 0x44, 0x33, 0x85, 0x71, 0xcc, + 0x51, 0x7f, 0x18, 0x11, 0x48, 0xe2, 0x85, 0x35, 0x4f, 0x9e, 0x72, 0x7a, 0xab, 0x86, 0x45, 0x1b, + 0xbc, 0x55, 0x85, 0x68, 0x13, 0x08, 0x34, 0x2f, 0x25, 0x40, 0x08, 0xe1, 0x83, 0x99, 0x04, 0x21, + 0x14, 0x02, 0x0e, 0xfa, 0x20, 0x23, 0xa1, 0xd8, 0xf1, 0xb9, 0x78, 0x03, 0xe0, 0x7e, 0xbf, 0xd3, + 0xab, 0x7a, 0xe3, 0x93, 0x7e, 0x5b, 0x42, 0x32, 0xca, 0xfd, 0x6a, 0xbf, 0xd3, 0x73, 0x4f, 0x31, + 0xf9, 0x67, 0x1f, 0x5d, 0x91, 0x88, 0x2c, 0xe9, 0x7f, 0xf2, 0x79, 0x58, 0xa2, 0xbf, 0x9c, 0xc0, + 0xda, 0x84, 0xa9, 0x2a, 0xb1, 0x34, 0xc3, 0x7a, 0x0f, 0x08, 0xc8, 0x3d, 0x8c, 0x6e, 0xd0, 0x19, + 0x8c, 0x25, 0xe6, 0x55, 0x84, 0x32, 0xe8, 0x0c, 0xc6, 0x51, 0x60, 0x52, 0x89, 0x98, 0x94, 0xfd, + 0xa6, 0x8b, 0x80, 0x24, 0x3c, 0x88, 0x02, 0xea, 0xe3, 0xf8, 0x5a, 0x73, 0x05, 0x22, 0xa2, 0x1c, + 0x3a, 0x32, 0x52, 0x0c, 0x1b, 0x61, 0x97, 0x8b, 0xec, 0x01, 0x85, 0x33, 0xb5, 0x22, 0xf6, 0x7e, + 0xdb, 0x3d, 0xc4, 0xe4, 0x50, 0x23, 0x7c, 0x62, 0xb2, 0x03, 0x6b, 0x8c, 0xc7, 0xf7, 0x03, 0x9b, + 0x71, 0x16, 0x17, 0xcf, 0xb6, 0x20, 0xf2, 0x99, 0xfc, 0xf9, 0x48, 0x01, 0x52, 0x82, 0x79, 0x14, + 0x08, 0xb9, 0xb5, 0xf8, 0x96, 0x2c, 0x3d, 0x47, 0xf7, 0x11, 0x9e, 0x2b, 0x28, 0x37, 0xcb, 0xe7, + 0x0a, 0x92, 0x92, 0xaf, 0x02, 0x18, 0xbd, 0x61, 0xbf, 0xdb, 0x45, 0xcc, 0xce, 0x2c, 0x8a, 0x52, + 0x97, 0xc3, 0xfb, 0x11, 0x6b, 0x09, 0x88, 0x38, 0xbe, 0x14, 0xfe, 0x76, 0x23, 0xc8, 0x9e, 0x52, + 0x5d, 0x9a, 0x09, 0x0b, 0x6c, 0x33, 0x22, 0xfe, 0x2d, 0x47, 0xf4, 0x97, 0xd0, 0x53, 0x19, 0xfe, + 0x2d, 0x4f, 0x8f, 0xe3, 0xdf, 0x4a, 0x05, 0xb4, 0x3d, 0x38, 0x9f, 0xd4, 0xb1, 0x90, 0x08, 0xab, + 0x9c, 0x55, 0x84, 0xfd, 0x8b, 0x34, 0x2c, 0x63, 0x6d, 0xe2, 0x14, 0xd6, 0x61, 0xc5, 0x9e, 0xbc, + 0xeb, 0x83, 0xc3, 0x88, 0xd3, 0x18, 0xdb, 0x37, 0x92, 0x33, 0xe4, 0xa7, 0xad, 0x50, 0x09, 0x62, + 0xc0, 0xaa, 0xb8, 0x09, 0x76, 0x85, 0x05, 0xba, 0x0f, 0x3d, 0x2b, 0x00, 0xce, 0xe2, 0x81, 0x1d, + 0x23, 0x85, 0x82, 0xfb, 0x20, 0xfd, 0x24, 0xf7, 0x41, 0xe6, 0x4c, 0xf7, 0xc1, 0x3b, 0xb0, 0x2c, + 0xbe, 0x86, 0x27, 0xf9, 0xfc, 0xd3, 0x9d, 0xe4, 0xa1, 0xca, 0x48, 0xc5, 0x3f, 0xd1, 0x17, 0x66, + 0x9e, 0xe8, 0xf8, 0x5e, 0x28, 0x76, 0x59, 0x2c, 0x56, 0x3b, 0xaf, 0x03, 0x23, 0x9f, 0xed, 0x16, + 0x1a, 0x9f, 0xe0, 0x96, 0x7c, 0x05, 0x96, 0x2a, 0x7d, 0xf1, 0x54, 0x24, 0xe9, 0xe8, 0xbb, 0x22, + 0x51, 0x66, 0x17, 0x7c, 0x4a, 0xff, 0x76, 0x4b, 0x7f, 0x1a, 0xb7, 0xdb, 0x3d, 0x00, 0xee, 0xda, + 0x10, 0x44, 0x2c, 0xc2, 0x2d, 0x23, 0xdc, 0xf0, 0xc3, 0x4f, 0x05, 0x12, 0x31, 0x3d, 0x9d, 0xb8, + 0x15, 0x8a, 0x7e, 0x78, 0xd8, 0x9f, 0xf4, 0xc6, 0xa1, 0x10, 0x9f, 0xc2, 0x91, 0xab, 0xc5, 0xf3, + 0xe4, 0xe3, 0x21, 0x52, 0xec, 0xd3, 0x9d, 0x10, 0xf2, 0x96, 0x6f, 0x44, 0xb7, 0x38, 0x6b, 0x84, + 0xb4, 0xd8, 0x08, 0x4d, 0x35, 0x9d, 0xd3, 0x7e, 0xa4, 0xc8, 0xb8, 0xdf, 0x9f, 0x60, 0xaa, 0x5f, + 0x03, 0xf0, 0xdf, 0xea, 0xc5, 0x5c, 0x33, 0x79, 0xc9, 0x4f, 0x95, 0x47, 0x39, 0xa0, 0x95, 0x7a, + 0x93, 0xfe, 0xb4, 0x7a, 0xe3, 0x40, 0xae, 0xfe, 0xcd, 0x71, 0x2b, 0x30, 0xee, 0x00, 0xdb, 0xe7, + 0x64, 0xf1, 0x64, 0x4a, 0xef, 0xdc, 0xc0, 0xbb, 0x21, 0xe0, 0x83, 0xa7, 0xb0, 0xc0, 0x52, 0x41, + 0xed, 0x2d, 0x58, 0x93, 0x9d, 0x4f, 0x1f, 0xf5, 0x0e, 0xc9, 0x97, 0x19, 0x0a, 0xa1, 0x12, 0x92, + 0x58, 0x24, 0x22, 0x7a, 0xe2, 0x3e, 0xea, 0x1d, 0x32, 0xfe, 0xa7, 0xf5, 0x50, 0x6e, 0x2b, 0xca, + 0x78, 0x3f, 0x51, 0x80, 0xc4, 0xc9, 0xe5, 0xd3, 0x44, 0xf9, 0x3f, 0xe0, 0x2e, 0x23, 0x5c, 0x59, + 0xe6, 0x49, 0xb8, 0xb2, 0xfc, 0x1f, 0x2a, 0xb0, 0x66, 0xea, 0x55, 0x0e, 0xd2, 0xcd, 0xde, 0x1c, + 0xae, 0xc2, 0x65, 0x53, 0xaf, 0xba, 0x8d, 0x7a, 0xc5, 0x2c, 0x3c, 0x70, 0x13, 0xb1, 0x37, 0x2f, + 0xc3, 0xb3, 0x71, 0x92, 0xe0, 0x6d, 0xe2, 0x12, 0x6c, 0xc4, 0xb3, 0x05, 0x3e, 0x67, 0x72, 0x61, + 0x01, 0xe5, 0x99, 0xce, 0xbf, 0x09, 0x6b, 0x02, 0x8b, 0xd2, 0xa9, 0xd8, 0x88, 0x76, 0xbd, 0x06, + 0xb9, 0x7d, 0xc3, 0x32, 0x4b, 0x0f, 0xdc, 0x52, 0xb3, 0x52, 0x51, 0xe7, 0xc8, 0x0a, 0x2c, 0xf1, + 0x84, 0x82, 0xae, 0x2a, 0x64, 0x19, 0xb2, 0x66, 0xcd, 0x36, 0x0a, 0x4d, 0xcb, 0x50, 0x53, 0xf9, + 0x37, 0x61, 0xb5, 0x31, 0xec, 0xbc, 0xd7, 0x1a, 0x7b, 0x7b, 0xde, 0x23, 0x7c, 0x5a, 0x58, 0x84, + 0xb4, 0xa5, 0x1f, 0xa8, 0x73, 0x04, 0x60, 0xa1, 0xb1, 0x57, 0xb0, 0xef, 0xdc, 0x51, 0x15, 0x92, + 0x83, 0xc5, 0xdd, 0x42, 0xc3, 0xdd, 0xab, 0xda, 0x6a, 0x8a, 0xfe, 0xd0, 0x0f, 0x6c, 0xfc, 0x91, + 0xce, 0x7f, 0x01, 0xd6, 0x91, 0x57, 0xa8, 0x74, 0x46, 0x63, 0xaf, 0xe7, 0x0d, 0xb1, 0x0d, 0xcb, + 0x90, 0xb5, 0x3d, 0xba, 0xc9, 0xc7, 0x1e, 0x6b, 0x40, 0x75, 0xd2, 0x1d, 0x77, 0x06, 0x5d, 0xef, + 0xdb, 0xaa, 0x92, 0xbf, 0x07, 0x6b, 0x56, 0x7f, 0x32, 0xee, 0xf4, 0x8e, 0xed, 0x31, 0xa5, 0x38, + 0x7e, 0x44, 0x9e, 0x81, 0xf5, 0x66, 0x4d, 0xaf, 0xee, 0x98, 0xbb, 0xcd, 0x7a, 0xd3, 0x76, 0xab, + 0xba, 0x53, 0x28, 0xb3, 0x87, 0x8d, 0x6a, 0xdd, 0x76, 0x5c, 0xcb, 0x28, 0x18, 0x35, 0x47, 0x55, + 0xf2, 0xdf, 0x43, 0xb5, 0xc7, 0x61, 0xbf, 0xd7, 0x2e, 0xb5, 0x30, 0xfa, 0x39, 0x6d, 0xb0, 0x06, + 0xdb, 0xb6, 0x51, 0xa8, 0xd7, 0x8a, 0x6e, 0x49, 0x2f, 0x38, 0x75, 0x2b, 0x09, 0xfc, 0x75, 0x13, + 0x2e, 0x24, 0xd0, 0xd4, 0x9d, 0x86, 0xaa, 0x90, 0x2b, 0xb0, 0x95, 0x90, 0x77, 0x60, 0xec, 0xe8, + 0x4d, 0xa7, 0x5c, 0x53, 0x53, 0x53, 0x0a, 0xdb, 0x76, 0x5d, 0x4d, 0xe7, 0x7f, 0x57, 0x81, 0xd5, + 0xe6, 0x88, 0x5b, 0x15, 0x37, 0xd1, 0x37, 0xf0, 0x39, 0xb8, 0xd4, 0xb4, 0x0d, 0xcb, 0x75, 0xea, + 0x7b, 0x46, 0xcd, 0x6d, 0xda, 0xfa, 0x6e, 0xb4, 0x35, 0x57, 0x60, 0x4b, 0xa2, 0xb0, 0x8c, 0x42, + 0x7d, 0xdf, 0xb0, 0xdc, 0x86, 0x6e, 0xdb, 0x07, 0x75, 0xab, 0xa8, 0x2a, 0xf4, 0x8b, 0x09, 0x04, + 0xd5, 0x92, 0xce, 0x5a, 0x13, 0xca, 0xab, 0x19, 0x07, 0x7a, 0xc5, 0xdd, 0xa9, 0x3b, 0x6a, 0x3a, + 0x5f, 0xa5, 0x57, 0x2f, 0x42, 0x30, 0x32, 0x5b, 0xb8, 0x2c, 0x64, 0x6a, 0xf5, 0x9a, 0x11, 0x7d, + 0x0e, 0x5b, 0x86, 0xac, 0xde, 0x68, 0x58, 0xf5, 0x7d, 0x5c, 0x62, 0x00, 0x0b, 0x45, 0xa3, 0x46, + 0x5b, 0x96, 0xa6, 0x39, 0x0d, 0xab, 0x5e, 0xad, 0x3b, 0x46, 0x51, 0xcd, 0xe4, 0x2d, 0xb1, 0x85, + 0x45, 0xa5, 0x87, 0x7d, 0xf6, 0xf6, 0x54, 0x34, 0x4a, 0x7a, 0xb3, 0xe2, 0xf0, 0x29, 0x7a, 0xe0, + 0x5a, 0xc6, 0x5b, 0x4d, 0xc3, 0x76, 0x6c, 0x55, 0x21, 0x2a, 0x2c, 0xd7, 0x0c, 0xa3, 0x68, 0xbb, + 0x96, 0xb1, 0x6f, 0x1a, 0x07, 0x6a, 0x8a, 0xd6, 0xc9, 0xfe, 0xa7, 0x5f, 0xc8, 0x7f, 0xa0, 0x00, + 0x61, 0xf0, 0x95, 0x22, 0x26, 0x02, 0xae, 0x98, 0x6d, 0xd8, 0x2c, 0xd3, 0xa9, 0xc6, 0xae, 0x55, + 0xeb, 0xc5, 0xe8, 0x90, 0x5d, 0x00, 0x12, 0xc9, 0xaf, 0x97, 0x4a, 0xaa, 0x42, 0xb6, 0xe0, 0x5c, + 0x24, 0xbd, 0x68, 0xd5, 0x1b, 0x6a, 0x6a, 0x33, 0x95, 0x55, 0xc8, 0xc5, 0x58, 0xe6, 0x9e, 0x61, + 0x34, 0xd4, 0x34, 0x9d, 0xa2, 0x48, 0x86, 0xd8, 0x12, 0xac, 0x78, 0x26, 0xff, 0x1d, 0x05, 0x2e, + 0xb0, 0x66, 0x8a, 0xfd, 0xe5, 0x37, 0xf5, 0x12, 0x6c, 0x70, 0x50, 0xde, 0xa4, 0x86, 0x9e, 0x07, + 0x35, 0x94, 0xcb, 0x9a, 0xf9, 0x0c, 0xac, 0x87, 0x52, 0xb1, 0x1d, 0x29, 0x7a, 0x7a, 0x84, 0x92, + 0x77, 0x0c, 0xdb, 0x71, 0x8d, 0x52, 0xa9, 0x6e, 0x39, 0xac, 0x21, 0xe9, 0xbc, 0x06, 0xeb, 0x05, + 0x6f, 0x38, 0xa6, 0x52, 0x51, 0x6f, 0xd4, 0xe9, 0xf7, 0xb0, 0x09, 0x2b, 0xb0, 0x64, 0x7c, 0xd5, + 0x31, 0x6a, 0xb6, 0x59, 0xaf, 0xa9, 0x73, 0xf9, 0x4b, 0x11, 0x1a, 0xb1, 0x8f, 0x6d, 0xbb, 0xac, + 0xce, 0xe5, 0x5b, 0xb0, 0x22, 0xec, 0x77, 0xd9, 0xaa, 0xd8, 0x86, 0x4d, 0xb1, 0xd6, 0xf0, 0x44, + 0x89, 0x76, 0x61, 0x03, 0xce, 0xc7, 0xf3, 0x0d, 0x47, 0x55, 0xe8, 0x2c, 0x44, 0x72, 0x68, 0x7a, + 0x2a, 0xff, 0xdb, 0x0a, 0xac, 0xf8, 0xef, 0x19, 0xa8, 0x41, 0xbd, 0x02, 0x5b, 0xd5, 0x92, 0xee, + 0x16, 0x8d, 0x7d, 0xb3, 0x60, 0xb8, 0x7b, 0x66, 0xad, 0x18, 0xf9, 0xc8, 0xb3, 0xf0, 0x4c, 0x02, + 0x01, 0x7e, 0x65, 0x03, 0xce, 0x47, 0xb3, 0x1c, 0xba, 0x55, 0x53, 0x74, 0xe8, 0xa3, 0x39, 0xfe, + 0x3e, 0x4d, 0xe7, 0xff, 0x5c, 0x81, 0x0d, 0x1e, 0x74, 0x9a, 0xbf, 0xac, 0xb0, 0x68, 0x04, 0x08, + 0xd7, 0x99, 0x87, 0x9b, 0x8e, 0xd5, 0xb4, 0x1d, 0xa3, 0x28, 0x8a, 0xd3, 0x45, 0x6b, 0x5a, 0x46, + 0xd5, 0xa8, 0x39, 0x91, 0xb6, 0x3d, 0x0f, 0x9f, 0x9b, 0x41, 0x5b, 0xab, 0x3b, 0xe2, 0x37, 0xdd, + 0xab, 0x9f, 0x83, 0x6b, 0x33, 0x88, 0x7d, 0xc2, 0x54, 0x7e, 0x1f, 0x56, 0x6d, 0xbd, 0x5a, 0x29, + 0xf5, 0x87, 0x87, 0x9e, 0x3e, 0x19, 0x9f, 0xf4, 0xc8, 0x16, 0x5c, 0x2c, 0xd5, 0xad, 0x82, 0xe1, + 0x62, 0x0f, 0x22, 0x8d, 0x38, 0x07, 0x6b, 0x72, 0xe6, 0x03, 0x83, 0xee, 0x2e, 0x02, 0xab, 0x72, + 0x62, 0xad, 0xae, 0xa6, 0xf2, 0x5f, 0x83, 0xe5, 0x50, 0xe4, 0xa6, 0x8b, 0x70, 0x4e, 0xfe, 0xdd, + 0xf0, 0x7a, 0xed, 0x4e, 0xef, 0x58, 0x9d, 0x8b, 0x66, 0x58, 0x93, 0x5e, 0x8f, 0x66, 0xe0, 0x71, + 0x23, 0x67, 0x38, 0xde, 0xf0, 0xb4, 0xd3, 0x6b, 0x8d, 0xbd, 0xb6, 0x9a, 0xca, 0xbf, 0x08, 0x2b, + 0x21, 0xbc, 0x58, 0xba, 0xae, 0x2a, 0x75, 0x7e, 0x3f, 0x54, 0x8d, 0xa2, 0xd9, 0xac, 0xaa, 0xf3, + 0xf4, 0xa0, 0x29, 0x9b, 0xbb, 0x65, 0x15, 0xf2, 0xdf, 0x57, 0xa8, 0x84, 0x82, 0xe3, 0x5e, 0x2d, + 0xe9, 0x62, 0x25, 0xd2, 0x5d, 0xc0, 0x50, 0xa8, 0x0d, 0xdb, 0x66, 0x8f, 0xd4, 0x97, 0x60, 0x83, + 0xff, 0x70, 0xf5, 0x5a, 0xd1, 0x2d, 0xeb, 0x56, 0xf1, 0x40, 0xb7, 0xe8, 0xd6, 0x78, 0xa0, 0xa6, + 0x70, 0xbf, 0x4b, 0x29, 0xae, 0x53, 0x6f, 0x16, 0xca, 0x6a, 0x9a, 0x6e, 0xaf, 0x50, 0x7a, 0xc3, + 0xac, 0xa9, 0x19, 0x3c, 0x3d, 0x62, 0xd4, 0x58, 0x2d, 0xcd, 0x9f, 0xcf, 0x7f, 0xac, 0xc0, 0x45, + 0xbb, 0x73, 0xdc, 0x6b, 0x8d, 0x27, 0x43, 0x4f, 0xef, 0x1e, 0xf7, 0x87, 0x9d, 0xf1, 0xc9, 0xa9, + 0x3d, 0xe9, 0x8c, 0x3d, 0x72, 0x1b, 0x6e, 0xd8, 0xe6, 0x6e, 0x4d, 0x77, 0xe8, 0xee, 0xd7, 0x2b, + 0xbb, 0x75, 0xcb, 0x74, 0xca, 0x55, 0xd7, 0x6e, 0x9a, 0xb1, 0x8d, 0x71, 0x1d, 0x9e, 0x9b, 0x4e, + 0x5a, 0x31, 0x76, 0xf5, 0xc2, 0x03, 0x55, 0x99, 0x5d, 0xe1, 0x8e, 0x5e, 0xd1, 0x6b, 0x05, 0xa3, + 0xe8, 0xee, 0xdf, 0x51, 0x53, 0xe4, 0x06, 0x5c, 0x9d, 0x4e, 0x5a, 0x32, 0x1b, 0x36, 0x25, 0x4b, + 0xcf, 0xfe, 0x6e, 0xd9, 0xae, 0x52, 0xaa, 0x4c, 0xfe, 0xcf, 0x14, 0xd8, 0x98, 0x06, 0x51, 0x42, + 0x6e, 0x82, 0x66, 0xd4, 0x1c, 0x4b, 0x37, 0x8b, 0x6e, 0xc1, 0x32, 0x8a, 0x46, 0xcd, 0x31, 0xf5, + 0x8a, 0xed, 0xda, 0xf5, 0x26, 0x5d, 0x4d, 0x81, 0x2d, 0xc1, 0x35, 0xb8, 0x32, 0x83, 0xae, 0x6e, + 0x16, 0x0b, 0xaa, 0x42, 0xee, 0xc0, 0x0b, 0x33, 0x88, 0xec, 0x07, 0xb6, 0x63, 0x54, 0xe5, 0x1c, + 0x35, 0x95, 0xef, 0x80, 0x1a, 0xf5, 0xb7, 0x8f, 0xd9, 0x6b, 0x58, 0xcd, 0x5a, 0x8d, 0x5d, 0x50, + 0x6b, 0x90, 0xab, 0x3b, 0x65, 0xc3, 0xe2, 0x48, 0xed, 0x08, 0xcd, 0xde, 0xac, 0xd1, 0x35, 0x5f, + 0xb7, 0xcc, 0xb7, 0xf1, 0xa6, 0xda, 0x80, 0xf3, 0x76, 0x45, 0x2f, 0xec, 0xe1, 0x76, 0x34, 0x6b, + 0x6e, 0xa1, 0xac, 0xd7, 0x6a, 0x46, 0x45, 0x05, 0x1c, 0x87, 0x69, 0x8e, 0x79, 0xe4, 0xf3, 0x70, + 0xab, 0xbe, 0xe7, 0xe8, 0x6e, 0xa3, 0xd2, 0xdc, 0x35, 0x6b, 0xae, 0xfd, 0xa0, 0x56, 0x10, 0x5c, + 0x55, 0x21, 0x7e, 0x98, 0xdf, 0x82, 0xeb, 0x33, 0xa9, 0x03, 0x4c, 0xf5, 0x9b, 0xa0, 0xcd, 0xa4, + 0xe4, 0x1d, 0xc9, 0xff, 0x58, 0x81, 0xad, 0x19, 0x0f, 0xc7, 0xe4, 0x05, 0xb8, 0x5d, 0x36, 0xf4, + 0x62, 0xc5, 0xb0, 0x6d, 0xdc, 0xe3, 0x74, 0x04, 0x99, 0x5d, 0x47, 0xe2, 0x51, 0x7d, 0x1b, 0x6e, + 0xcc, 0x26, 0x0f, 0x2e, 0xfd, 0x5b, 0x70, 0x7d, 0x36, 0x29, 0x67, 0x02, 0x52, 0xf4, 0xa8, 0x9c, + 0x4d, 0xe9, 0x33, 0x0f, 0xe9, 0xfc, 0xef, 0x2b, 0x70, 0x21, 0x59, 0x7b, 0x43, 0xdb, 0x66, 0xd6, + 0x6c, 0x47, 0xaf, 0x54, 0xdc, 0x86, 0x6e, 0xe9, 0x55, 0xd7, 0xa8, 0x59, 0xf5, 0x4a, 0x25, 0xe9, + 0xd2, 0xbc, 0x0e, 0xcf, 0x4d, 0x27, 0xb5, 0x0b, 0x96, 0xd9, 0xa0, 0xf7, 0x82, 0x06, 0xdb, 0xd3, + 0xa9, 0x0c, 0xb3, 0x60, 0xa8, 0xa9, 0x9d, 0x37, 0x3e, 0xfc, 0x97, 0xed, 0xb9, 0x0f, 0x3f, 0xde, + 0x56, 0x7e, 0xf2, 0xf1, 0xb6, 0xf2, 0xcf, 0x1f, 0x6f, 0x2b, 0x6f, 0x3f, 0x7f, 0xb6, 0x70, 0x24, + 0x28, 0x51, 0xbc, 0xbb, 0x80, 0x86, 0x4c, 0x2f, 0xff, 0x4f, 0x00, 0x00, 0x00, 0xff, 0xff, 0x4e, + 0x6f, 0x76, 0x89, 0x7d, 0xab, 0x01, 0x00, } func (this *PluginSpecV1) Equal(that interface{}) bool { @@ -46390,6 +46398,13 @@ func (m *AWSOIDCIntegrationSpecV1) MarshalToSizedBuffer(dAtA []byte) (int, error i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.Audience) > 0 { + i -= len(m.Audience) + copy(dAtA[i:], m.Audience) + i = encodeVarintTypes(dAtA, i, uint64(len(m.Audience))) + i-- + dAtA[i] = 0x1a + } if len(m.IssuerS3URI) > 0 { i -= len(m.IssuerS3URI) copy(dAtA[i:], m.IssuerS3URI) @@ -57904,6 +57919,10 @@ func (m *AWSOIDCIntegrationSpecV1) Size() (n int) { if l > 0 { n += 1 + l + sovTypes(uint64(l)) } + l = len(m.Audience) + if l > 0 { + n += 1 + l + sovTypes(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -123903,6 +123922,38 @@ func (m *AWSOIDCIntegrationSpecV1) Unmarshal(dAtA []byte) error { } m.IssuerS3URI = string(dAtA[iNdEx:postIndex]) iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Audience", 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.Audience = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipTypes(dAtA[iNdEx:]) diff --git a/lib/web/integrations.go b/lib/web/integrations.go index 0dd063d404ed9..9e99050bc2b40 100644 --- a/lib/web/integrations.go +++ b/lib/web/integrations.go @@ -57,14 +57,15 @@ func (h *Handler) integrationsCreate(w http.ResponseWriter, r *http.Request, p h } s3Location = issuerS3URI.String() } + metadata := types.Metadata{Name: req.Name} ig, err = types.NewIntegrationAWSOIDC( - types.Metadata{Name: req.Name}, + metadata, &types.AWSOIDCIntegrationSpecV1{ RoleARN: req.AWSOIDC.RoleARN, IssuerS3URI: s3Location, + Audience: req.AWSOIDC.Audience, }, ) - if err != nil { return nil, trace.Wrap(err) } diff --git a/lib/web/intgrations_test.go b/lib/web/intgrations_test.go new file mode 100644 index 0000000000000..6baf1532b2250 --- /dev/null +++ b/lib/web/intgrations_test.go @@ -0,0 +1,90 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package web + +import ( + "context" + "encoding/json" + "testing" + + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/services" + "github.com/gravitational/teleport/lib/web/ui" +) + +func TestIntegrationsCreateWithAudience(t *testing.T) { + t.Parallel() + wPack := newWebPack(t, 1 /* proxies */) + proxy := wPack.proxies[0] + authPack := proxy.authPack(t, "user", []types.Role{services.NewPresetEditorRole()}) + ctx := context.Background() + + const integrationName = "test-integration" + cases := []struct { + name string + audience string + }{ + { + name: "without audiences", + audience: types.IntegrationAWSOIDCAudienceUnspecified, + }, + { + name: "with audiences", + audience: types.IntegrationAWSOIDCAudienceAWSIdentityCenter, + }, + } + + for _, test := range cases { + t.Run(test.name, func(t *testing.T) { + createData := ui.Integration{ + Name: integrationName, + SubKind: "aws-oidc", + AWSOIDC: &ui.IntegrationAWSOIDCSpec{ + RoleARN: "arn:aws:iam::026090554232:role/testrole", + Audience: test.audience, + }, + } + createEndpoint := authPack.clt.Endpoint("webapi", "sites", wPack.server.ClusterName(), "integrations") + createResp, err := authPack.clt.PostJSON(ctx, createEndpoint, createData) + require.NoError(t, err) + require.Equal(t, 200, createResp.Code()) + + // check origin label stored in backend + intgrationResource, err := wPack.server.Auth().GetIntegration(ctx, integrationName) + require.NoError(t, err) + require.Equal(t, test.audience, intgrationResource.GetAWSOIDCIntegrationSpec().Audience) + + // check origin label returned in the web api + getEndpoint := authPack.clt.Endpoint("webapi", "sites", wPack.server.ClusterName(), "integrations", integrationName) + getResp, err := authPack.clt.Get(ctx, getEndpoint, nil) + require.NoError(t, err) + require.Equal(t, 200, getResp.Code()) + + var resp ui.Integration + err = json.Unmarshal(getResp.Bytes(), &resp) + require.NoError(t, err) + require.Equal(t, createData, resp) + + err = wPack.server.Auth().DeleteIntegration(ctx, integrationName) + require.NoError(t, err) + }) + } +} diff --git a/lib/web/ui/integration.go b/lib/web/ui/integration.go index 6ec40951d786d..2db7010c4f450 100644 --- a/lib/web/ui/integration.go +++ b/lib/web/ui/integration.go @@ -38,6 +38,14 @@ type IntegrationAWSOIDCSpec struct { IssuerS3Bucket string `json:"issuerS3Bucket,omitempty"` // IssuerS3Prefix is the prefix for the bucket above. IssuerS3Prefix string `json:"issuerS3Prefix,omitempty"` + + // Audience is used to record a name of a plugin or a discover service in Teleport + // that depends on this integration. + // Audience value can be empty or configured with supported preset audience type. + // Preset audience may impose specific behavior on the integration CRUD API, + // such as preventing integration from update or deletion. Empty audience value + // should be treated as a default and backward-compatible behavior of the integration. + Audience string `json:"audience,omitempty"` } // CheckAndSetDefaults for the aws oidc integration spec. @@ -151,6 +159,7 @@ func MakeIntegration(ig types.Integration) (*Integration, error) { RoleARN: ig.GetAWSOIDCIntegrationSpec().RoleARN, IssuerS3Bucket: s3Bucket, IssuerS3Prefix: s3Prefix, + Audience: ig.GetAWSOIDCIntegrationSpec().Audience, } } diff --git a/web/packages/teleport/src/services/integrations/integrations.test.ts b/web/packages/teleport/src/services/integrations/integrations.test.ts index 3d647ff7a5e46..81389eda1ab58 100644 --- a/web/packages/teleport/src/services/integrations/integrations.test.ts +++ b/web/packages/teleport/src/services/integrations/integrations.test.ts @@ -20,9 +20,9 @@ import api from 'teleport/services/api'; import cfg from 'teleport/config'; import { integrationService } from './integrations'; -import { IntegrationStatusCode } from './types'; +import { IntegrationStatusCode, IntegrationAudience } from './types'; -test('fetchIntegration() response (a integration)', async () => { +test('fetch a single integration: fetchIntegration()', async () => { // test a valid response jest.spyOn(api, 'get').mockResolvedValue(awsOidcIntegration); @@ -36,6 +36,7 @@ test('fetchIntegration() response (a integration)', async () => { resourceType: 'integration', spec: { roleArn: 'arn-123', + origin: undefined, }, statusCode: IntegrationStatusCode.Running, }); @@ -51,14 +52,19 @@ test('fetchIntegration() response (a integration)', async () => { name: undefined, spec: { roleArn: undefined, + origin: undefined, }, }); }); -test('fetchIntegrations() response (list)', async () => { +test('fetch integration list: fetchIntegrations()', async () => { // test a valid response jest.spyOn(api, 'get').mockResolvedValue({ - items: [awsOidcIntegration, nonAwsOidcIntegration], + items: [ + awsOidcIntegration, + awsOidcIntegrationWithAudience, + nonAwsOidcIntegration, + ], nextKey: 'some-key', }); @@ -73,6 +79,17 @@ test('fetchIntegrations() response (list)', async () => { resourceType: 'integration', spec: { roleArn: 'arn-123', + audience: undefined, + }, + statusCode: IntegrationStatusCode.Running, + }, + { + kind: 'aws-oidc', + name: 'aws-oidc-integration2', + resourceType: 'integration', + spec: { + roleArn: 'arn-12345', + audience: 'aws-identity-center', }, statusCode: IntegrationStatusCode.Running, }, @@ -82,6 +99,7 @@ test('fetchIntegrations() response (list)', async () => { resourceType: 'integration', spec: { roleArn: undefined, + audience: undefined, }, statusCode: IntegrationStatusCode.Running, }, @@ -200,6 +218,15 @@ const awsOidcIntegration = { awsoidc: { roleArn: 'arn-123' }, }; +const awsOidcIntegrationWithAudience = { + name: 'aws-oidc-integration2', + subKind: 'aws-oidc', + awsoidc: { + roleArn: 'arn-12345', + audience: IntegrationAudience.AwsIdentityCenter, + }, +}; + const mockAwsDbs = [ { protocol: 'postgres', diff --git a/web/packages/teleport/src/services/integrations/integrations.ts b/web/packages/teleport/src/services/integrations/integrations.ts index e4da3ee126944..f67243c2943a2 100644 --- a/web/packages/teleport/src/services/integrations/integrations.ts +++ b/web/packages/teleport/src/services/integrations/integrations.ts @@ -419,6 +419,7 @@ function makeIntegration(json: any): Integration { roleArn: awsoidc?.roleArn, issuerS3Bucket: awsoidc?.issuerS3Bucket, issuerS3Prefix: awsoidc?.issuerS3Prefix, + audience: awsoidc?.audience, }, // The integration resource does not have a "status" field, but is // a required field for the table that lists both plugin and diff --git a/web/packages/teleport/src/services/integrations/types.ts b/web/packages/teleport/src/services/integrations/types.ts index 799ea1e57fb81..0d88ba8299843 100644 --- a/web/packages/teleport/src/services/integrations/types.ts +++ b/web/packages/teleport/src/services/integrations/types.ts @@ -63,10 +63,24 @@ export enum IntegrationKind { AzureOidc = 'azure-oidc', ExternalAuditStorage = 'external-audit-storage', } + +/** + * IntegrationAudience defines supported audience value for IntegrationSpecAwsOidc + * audience field. + */ +export enum IntegrationAudience { + AwsIdentityCenter = 'aws-identity-center', +} + export type IntegrationSpecAwsOidc = { roleArn: string; issuerS3Prefix?: string; issuerS3Bucket?: string; + /** + * audience is used to record name of a plugin or discover services in Teleport + * that depends on this integration. + */ + audience?: IntegrationAudience; }; export enum IntegrationStatusCode { From e208b2f4824518f08e666106c24ba9554534c42d Mon Sep 17 00:00:00 2001 From: Przemko Robakowski Date: Thu, 24 Oct 2024 20:43:03 +0200 Subject: [PATCH 57/70] Add dynamic Windows desktops registration to test plan (#47908) * Add dynamic Windows desktops registration to test plan * cleanup --- .github/ISSUE_TEMPLATE/testplan.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/.github/ISSUE_TEMPLATE/testplan.md b/.github/ISSUE_TEMPLATE/testplan.md index 288ceb286b2b9..870e9592e8b31 100644 --- a/.github/ISSUE_TEMPLATE/testplan.md +++ b/.github/ISSUE_TEMPLATE/testplan.md @@ -1335,6 +1335,17 @@ manualy testing. - [ ] Banner goes away if you reduce number of non-AD desktops to less or equal 5 (check occurs every 5 minutes so you may need to wait to confirm) - [ ] Installer in GUI mode successfully uninstalls Authentication Package (logging in is not possible) - [ ] Installer successfully uninstalls Authentication Package (logging in is not possible) when invoked from command line +- Dynamic registration + - [ ] Dynamic Windows desktop resources can be added, removed, and updated using `tctl` + - [ ] `tctl get dynamic_windows_desktop` works with all supported formats + - [ ] Adding dynamic Windows desktop that doesn't match labels for any Windows Desktop Service does not create any + Windows desktop + - [ ] Adding dynamic Windows desktop that matches some `windows_desktop_services`s creates Windows desktops for each + matching WDS + - [ ] Updating dynamic Windows desktop updates corresponding Windows desktops + - [ ] Updating dynamic Windows desktop's labels so it no longer matches `windows_desktop_services` deletes + corresponding Windows desktops + - [ ] Deleting dynamic Windows desktop deletes corresponding Windows desktops ## Binaries / OS compatibility From 05d3371584255297ce9a94ee455c1ba01a75d28a Mon Sep 17 00:00:00 2001 From: Erik Tate Date: Thu, 24 Oct 2024 15:09:59 -0400 Subject: [PATCH 58/70] checking for a valid home directory now ensures that the local user has (#47524) access and child processes fallback to the root directory ("/") in the case that they do not Co-authored-by: Tim Ross --- constants.go | 4 ++ lib/srv/exec_linux_test.go | 40 +++++++++-- lib/srv/reexec.go | 128 +++++++++++++++++++++++++++-------- lib/srv/reexec_test.go | 70 +++++++++++++++++++ lib/srv/regular/sshserver.go | 2 +- 5 files changed, 208 insertions(+), 36 deletions(-) diff --git a/constants.go b/constants.go index ba0d807abf104..af059bc1ffe54 100644 --- a/constants.go +++ b/constants.go @@ -536,6 +536,10 @@ const ( // HomeDirNotFound is returned when a the "teleport checkhomedir" command cannot // find the user's home directory. HomeDirNotFound = 254 + // HomeDirNotAccessible is returned when a the "teleport checkhomedir" command has + // found the user's home directory, but the user does NOT have permissions to + // access it. + HomeDirNotAccessible = 253 ) // MaxEnvironmentFileLines is the maximum number of lines in a environment file. diff --git a/lib/srv/exec_linux_test.go b/lib/srv/exec_linux_test.go index c9738d7305612..47eeeea3e8459 100644 --- a/lib/srv/exec_linux_test.go +++ b/lib/srv/exec_linux_test.go @@ -26,6 +26,7 @@ import ( "os" "os/exec" "os/user" + "path/filepath" "strconv" "syscall" "testing" @@ -33,20 +34,48 @@ import ( "github.com/gravitational/trace" "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/lib/utils" + "github.com/gravitational/teleport/lib/utils/host" ) func TestOSCommandPrep(t *testing.T) { + utils.RequireRoot(t) + srv := newMockServer(t) scx := newExecServerContext(t, srv) - usr, err := user.Current() + // because CheckHomeDir now inspects access to the home directory as the actual user after a rexec, + // we need to setup a real, non-root user with a valid home directory in order for this test to + // exercise the correct paths + tempHome := t.TempDir() + require.NoError(t, os.Chmod(filepath.Dir(tempHome), 0777)) + + username := "test-os-command-prep" + scx.Identity.Login = username + _, err := host.UserAdd(username, nil, host.UserOpts{ + Home: tempHome, + }) + require.NoError(t, err) + t.Cleanup(func() { + // change homedir back so user deletion doesn't fail + changeHomeDir(t, username, tempHome) + _, err := host.UserDel(username) + require.NoError(t, err) + }) + + usr, err := user.Lookup(username) require.NoError(t, err) + uid, err := strconv.Atoi(usr.Uid) + require.NoError(t, err) + + require.NoError(t, os.Chown(tempHome, uid, -1)) expectedEnv := []string{ "LANG=en_US.UTF-8", - getDefaultEnvPath(strconv.Itoa(os.Geteuid()), defaultLoginDefsPath), + getDefaultEnvPath(usr.Uid, defaultLoginDefsPath), fmt.Sprintf("HOME=%s", usr.HomeDir), - fmt.Sprintf("USER=%s", usr.Username), + fmt.Sprintf("USER=%s", username), "SHELL=/bin/sh", "SSH_CLIENT=10.0.0.5 4817 3022", "SSH_CONNECTION=10.0.0.5 4817 127.0.0.1 3022", @@ -99,12 +128,9 @@ func TestOSCommandPrep(t *testing.T) { require.Equal(t, []string{"/bin/sh", "-c", "top"}, cmd.Args) require.Equal(t, syscall.SIGKILL, cmd.SysProcAttr.Pdeathsig) - if os.Geteuid() != 0 { - t.Skip("skipping portion of test which must run as root") - } - // Missing home directory - HOME should still be set to the given // home dir, but the command should set it's CWD to root instead. + changeHomeDir(t, username, "/wrong/place") usr.HomeDir = "/wrong/place" root := string(os.PathSeparator) expectedEnv[2] = "HOME=/wrong/place" diff --git a/lib/srv/reexec.go b/lib/srv/reexec.go index 2812ee8649ba7..1bb1865c0cfe7 100644 --- a/lib/srv/reexec.go +++ b/lib/srv/reexec.go @@ -534,6 +534,8 @@ func (o *osWrapper) startNewParker(ctx context.Context, credential *syscall.Cred return nil } +const rootDirectory = "/" + func RunNetworking() (errw io.Writer, code int, err error) { // SIGQUIT is used by teleport to initiate graceful shutdown, waiting for // existing exec sessions to close before ending the process. For this to @@ -619,10 +621,13 @@ func RunNetworking() (errw io.Writer, code int, err error) { } // Create a minimal default environment for the user. - homeDir := localUser.HomeDir - if !utils.IsDir(homeDir) { - homeDir = "/" + workingDir := rootDirectory + + hasAccess, err := CheckHomeDir(localUser) + if hasAccess && err == nil { + workingDir = localUser.HomeDir } + os.Setenv("HOME", localUser.HomeDir) os.Setenv("USER", c.Login) @@ -638,8 +643,8 @@ func RunNetworking() (errw io.Writer, code int, err error) { } // Ensure that the working directory is one that the local user has access to. - if err := os.Chdir(homeDir); err != nil { - return errorWriter, teleport.RemoteCommandFailure, trace.Wrap(err, "failed to set working directory for networking process") + if err := os.Chdir(workingDir); err != nil { + return errorWriter, teleport.RemoteCommandFailure, trace.Wrap(err, "failed to set working directory for networking process: %s", workingDir) } // Build request listener from first extra file that was passed to command. @@ -872,16 +877,21 @@ func getConnFile(conn net.Conn) (*os.File, error) { } } -// runCheckHomeDir check's if the active user's $HOME dir exists. +// runCheckHomeDir checks if the active user's $HOME dir exists and is accessible. func runCheckHomeDir() (errw io.Writer, code int, err error) { - home, err := os.UserHomeDir() - if err != nil { - return io.Discard, teleport.HomeDirNotFound, nil - } - if !utils.IsDir(home) { - return io.Discard, teleport.HomeDirNotFound, nil + code = teleport.RemoteCommandSuccess + if err := hasAccessibleHomeDir(); err != nil { + switch { + case trace.IsNotFound(err), trace.IsBadParameter(err): + code = teleport.HomeDirNotFound + case trace.IsAccessDenied(err): + code = teleport.HomeDirNotAccessible + default: + code = teleport.RemoteCommandFailure + } } - return io.Discard, teleport.RemoteCommandSuccess, nil + + return io.Discard, code, nil } // runPark does nothing, forever. @@ -1055,18 +1065,20 @@ func buildCommand(c *ExecCommand, localUser *user.User, tty *os.File, pamEnviron // Set the command's cwd to the user's $HOME, or "/" if // they don't have an existing home dir. // TODO (atburke): Generalize this to support Windows. - exists, err := CheckHomeDir(localUser) + hasAccess, err := CheckHomeDir(localUser) if err != nil { return nil, trace.Wrap(err) - } else if exists { + } + + if hasAccess { cmd.Dir = localUser.HomeDir - } else if !exists { + } else { // Write failure to find home dir to stdout, same as OpenSSH. - msg := fmt.Sprintf("Could not set shell's cwd to home directory %q, defaulting to %q\n", localUser.HomeDir, string(os.PathSeparator)) + msg := fmt.Sprintf("Could not set shell's cwd to home directory %q, defaulting to %q\n", localUser.HomeDir, rootDirectory) if _, err := cmd.Stdout.Write([]byte(msg)); err != nil { return nil, trace.Wrap(err) } - cmd.Dir = string(os.PathSeparator) + cmd.Dir = rootDirectory } // Only set process credentials if the UID/GID of the requesting user are @@ -1200,16 +1212,73 @@ func copyCommand(ctx *ServerContext, cmdmsg *ExecCommand) { } } -// CheckHomeDir checks if the user's home dir exists +func coerceHomeDirError(usr *user.User, err error) error { + if os.IsNotExist(err) { + return trace.NotFound("home directory %q not found for user %q", usr.HomeDir, usr.Name) + } + + if os.IsPermission(err) { + return trace.AccessDenied("%q does not have permission to access %q", usr.Name, usr.HomeDir) + } + + return err +} + +// hasAccessibleHomeDir checks if the current user has access to an existing home directory. +func hasAccessibleHomeDir() error { + // this should usually be fetching a cached value + currentUser, err := user.Current() + if err != nil { + return trace.Wrap(err) + } + + fi, err := os.Stat(currentUser.HomeDir) + if err != nil { + return trace.Wrap(coerceHomeDirError(currentUser, err)) + } + + if !fi.IsDir() { + return trace.BadParameter("%q is not a directory", currentUser.HomeDir) + } + + cwd, err := os.Getwd() + if err != nil { + return trace.Wrap(err) + } + // make sure we return to the original working directory + defer os.Chdir(cwd) + + // attemping to cd into the target directory is the easiest, cross-platform way to test + // whether or not the current user has access + if err := os.Chdir(currentUser.HomeDir); err != nil { + return trace.Wrap(coerceHomeDirError(currentUser, err)) + } + + return nil +} + +// CheckHomeDir checks if the user's home directory exists and is accessible to the user. Only catastrophic +// errors will be returned, which means a missing, inaccessible, or otherwise invalid home directory will result +// in a return of (false, nil) func CheckHomeDir(localUser *user.User) (bool, error) { - if fi, err := os.Stat(localUser.HomeDir); err == nil { - return fi.IsDir(), nil + currentUser, err := user.Current() + if err != nil { + return false, trace.Wrap(err) + } + + // don't spawn a subcommand if already running as the user in question + if currentUser.Uid == localUser.Uid { + if err := hasAccessibleHomeDir(); err != nil { + if trace.IsNotFound(err) || trace.IsAccessDenied(err) || trace.IsBadParameter(err) { + return false, nil + } + + return false, trace.Wrap(err) + } + + return true, nil } - // In some environments, the user's home directory exists but isn't visible to - // root, e.g. /home is mounted to an nfs export with root_squash enabled. - // In case we are in that scenario, re-exec teleport as the user to check - // if the home dir actually does exist. executable, err := os.Executable() if err != nil { return false, trace.Wrap(err) @@ -1225,6 +1294,7 @@ func CheckHomeDir(localUser *user.User) (bool, error) { Path: executable, Args: []string{executable, teleport.CheckHomeDirSubCommand}, Env: []string{"HOME=" + localUser.HomeDir}, + Dir: rootDirectory, SysProcAttr: &syscall.SysProcAttr{ Setsid: true, Credential: credential, @@ -1235,11 +1305,13 @@ func CheckHomeDir(localUser *user.User) (bool, error) { reexecCommandOSTweaks(cmd) if err := cmd.Run(); err != nil { - if cmd.ProcessState.ExitCode() == teleport.HomeDirNotFound { - return false, nil + if cmd.ProcessState.ExitCode() == teleport.RemoteCommandFailure { + return false, trace.Wrap(err) } - return false, trace.Wrap(err) + + return false, nil } + return true, nil } diff --git a/lib/srv/reexec_test.go b/lib/srv/reexec_test.go index 55dd248d0adc3..a9d6934c7b233 100644 --- a/lib/srv/reexec_test.go +++ b/lib/srv/reexec_test.go @@ -36,6 +36,7 @@ import ( "syscall" "testing" + "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" "golang.org/x/crypto/ssh/agent" @@ -410,3 +411,72 @@ func testX11Forward(ctx context.Context, t *testing.T, proc *networking.Process, require.NoError(t, err) require.Equal(t, fakeXauthEntry, readXauthEntry) } + +func TestRootCheckHomeDir(t *testing.T) { + utils.RequireRoot(t) + + tmp := t.TempDir() + require.NoError(t, os.Chmod(filepath.Dir(tmp), 0777)) + require.NoError(t, os.Chmod(tmp, 0777)) + + home := filepath.Join(tmp, "home") + noAccess := filepath.Join(tmp, "no_access") + file := filepath.Join(tmp, "file") + notFound := filepath.Join(tmp, "not_found") + + require.NoError(t, os.Mkdir(home, 0700)) + require.NoError(t, os.Mkdir(noAccess, 0700)) + _, err := os.Create(file) + require.NoError(t, err) + + login := utils.GenerateLocalUsername(t) + _, err = host.UserAdd(login, nil, host.UserOpts{Home: home}) + require.NoError(t, err) + t.Cleanup(func() { + // change back to accessible home so deletion works + changeHomeDir(t, login, home) + _, err := host.UserDel(login) + require.NoError(t, err) + }) + + testUser, err := user.Lookup(login) + require.NoError(t, err) + + uid, err := strconv.Atoi(testUser.Uid) + require.NoError(t, err) + + gid, err := strconv.Atoi(testUser.Gid) + require.NoError(t, err) + + require.NoError(t, os.Chown(home, uid, gid)) + require.NoError(t, os.Chown(file, uid, gid)) + + hasAccess, err := CheckHomeDir(testUser) + require.NoError(t, err) + require.True(t, hasAccess) + + changeHomeDir(t, login, file) + hasAccess, err = CheckHomeDir(testUser) + require.NoError(t, err) + require.False(t, hasAccess) + + changeHomeDir(t, login, notFound) + hasAccess, err = CheckHomeDir(testUser) + require.NoError(t, err) + require.False(t, hasAccess) + + changeHomeDir(t, login, noAccess) + hasAccess, err = CheckHomeDir(testUser) + require.NoError(t, err) + require.False(t, hasAccess) +} + +func changeHomeDir(t *testing.T, username, home string) { + usermodBin, err := exec.LookPath("usermod") + assert.NoError(t, err, "usermod binary must be present") + + cmd := exec.Command(usermodBin, "--home", home, username) + _, err = cmd.CombinedOutput() + assert.NoError(t, err, "changing home should not error") + assert.Equal(t, 0, cmd.ProcessState.ExitCode(), "changing home should exit 0") +} diff --git a/lib/srv/regular/sshserver.go b/lib/srv/regular/sshserver.go index af50422167966..5719a56060509 100644 --- a/lib/srv/regular/sshserver.go +++ b/lib/srv/regular/sshserver.go @@ -1266,7 +1266,7 @@ func (s *Server) HandleNewConn(ctx context.Context, ccx *sshutils.ConnectionCont // Create host user. created, userCloser, err := s.termHandlers.SessionRegistry.UpsertHostUser(identityContext) if err != nil { - log.Infof("error while creating host users: %s", err) + log.Warnf("error while creating host users: %s", err) } // Indicate that the user was created by Teleport. From 123cfc96ea730b3e75e2df6fc934de802140e6f2 Mon Sep 17 00:00:00 2001 From: rosstimothy <39066650+rosstimothy@users.noreply.github.com> Date: Thu, 24 Oct 2024 20:08:07 +0000 Subject: [PATCH 59/70] Prevent go-cmp from being imported in production code (#47914) Adds a new depguard rule to limit the use of go-cmp to test code. There are a few notable exceptions for legacy code that relies on go-cmp which should find other suitable means for comparisions. However, in the interest in limiting new code from introducing more production depenency on go-cmp, the existing violations are allowed for the time being and should be refactored and removed from the list in the future. --- .golangci.yml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/.golangci.yml b/.golangci.yml index 7dcf0342101ff..26f72e90e32fc 100644 --- a/.golangci.yml +++ b/.golangci.yml @@ -185,6 +185,36 @@ linters-settings: desc: '"lib/system/signal" requires CGO' - pkg: github.com/gravitational/teleport/lib/vnet/daemon desc: '"vnet/daemon" requires CGO' + # Prevent importing go-cmp into production code. From the go-cmp docs: + # > It is intended to only be used in tests, as performance is not a goal + # > and it may panic if it cannot compare the values. Its propensity towards + # > panicking means that its unsuitable for production environments where a + # > spurious panic may be fatal. + go-cmp: + files: + # Tests can do anything + - '!$test' + # Various test helpers defined outside _test.go files are allowed + - '!**/integration/helpers/**' + - '!**/integrations/operator/controllers/resources/testlib/**' + - '!**/lib/auth/test/**' + - '!**/lib/services/suite/**' + # Non-compliant legacy code. These should be converted to compare by another mechanism + # and be removed from this list in the future. Use caution before adding any additional + # exclusions to this list. + - '!**/e/lib/accesslist/equal.go' + - '!**/e/lib/auth/saml.go' + - '!**lib/services/authority.go' + - '!**lib/services/compare.go' + - '!**/lib/services/local/access_list.go' + - '!**/lib/services/local/users.go' + - '!**/lib/services/server.go' + - '!**/lib/services/user.go' + deny: + - pkg: github.com/google/go-cmp/cmp + desc: '"github.com/google/go-cmp/cmp" should only be used in tests' + - pkg: github.com/google/go-cmp/cmp/cmpopts + desc: '"github.com/google/go-cmp/cmp/cmpopts" should only be used in tests' errorlint: comparison: true asserts: true From 4cd3f3bb9c14a6c6bb96e2d18b5b67f99f53136f Mon Sep 17 00:00:00 2001 From: Brian Joerger Date: Thu, 24 Oct 2024 13:12:59 -0700 Subject: [PATCH 60/70] feat: SSO MFA - SSO MFA challenge creation and verification (#47684) * Update e ref. * Update proto. * Handle SSO MFA challenge creation. * Handle SSO MFA challenge response validation. * Only create SSO MFA challenge if SSO MFA is an enabled second factor; Require SSO MFA for device registration when available. * Update verification logic; Add test. * Fix lint. --- api/client/proto/authservice.pb.go | 2904 ++++++++++------- .../legacy/client/proto/authservice.proto | 27 +- e | 2 +- lib/auth/auth.go | 46 +- lib/auth/grpcserver.go | 5 +- lib/auth/oidc.go | 16 + lib/auth/saml.go | 14 +- lib/auth/sso_mfa.go | 110 +- lib/auth/sso_mfa_test.go | 752 +++++ 9 files changed, 2737 insertions(+), 1139 deletions(-) create mode 100644 lib/auth/sso_mfa_test.go diff --git a/api/client/proto/authservice.pb.go b/api/client/proto/authservice.pb.go index 6076370c07e6b..3f66847c54fd5 100644 --- a/api/client/proto/authservice.pb.go +++ b/api/client/proto/authservice.pb.go @@ -6304,10 +6304,14 @@ type MFAAuthenticateChallenge struct { // If `MFA_REQUIRED_NO` is returned then the server may opt to end ongoing // communications, in case of streaming RPCs. It may also return empty // challenges for all other fields. - MFARequired MFARequired `protobuf:"varint,4,opt,name=MFARequired,proto3,enum=proto.MFARequired" json:"MFARequired,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + MFARequired MFARequired `protobuf:"varint,4,opt,name=MFARequired,proto3,enum=proto.MFARequired" json:"MFARequired,omitempty"` + // SSO Challenge is an SSO MFA challenge. If set, the client can go to the + // IdP redirect URL to perform an MFA check in the IdP and obtain an MFA token. + // This token paired with the request id can then be used as MFA verification. + SSOChallenge *SSOChallenge `protobuf:"bytes,5,opt,name=SSOChallenge,proto3" json:"SSOChallenge,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *MFAAuthenticateChallenge) Reset() { *m = MFAAuthenticateChallenge{} } @@ -6364,12 +6368,20 @@ func (m *MFAAuthenticateChallenge) GetMFARequired() MFARequired { return MFARequired_MFA_REQUIRED_UNSPECIFIED } +func (m *MFAAuthenticateChallenge) GetSSOChallenge() *SSOChallenge { + if m != nil { + return m.SSOChallenge + } + return nil +} + // MFAAuthenticateResponse is a response to MFAAuthenticateChallenge using one // of the MFA devices registered for a user. type MFAAuthenticateResponse struct { // Types that are valid to be assigned to Response: // *MFAAuthenticateResponse_TOTP // *MFAAuthenticateResponse_Webauthn + // *MFAAuthenticateResponse_SSO Response isMFAAuthenticateResponse_Response `protobuf_oneof:"Response"` XXX_NoUnkeyedLiteral struct{} `json:"-"` XXX_unrecognized []byte `json:"-"` @@ -6421,9 +6433,13 @@ type MFAAuthenticateResponse_TOTP struct { type MFAAuthenticateResponse_Webauthn struct { Webauthn *webauthn.CredentialAssertionResponse `protobuf:"bytes,3,opt,name=Webauthn,proto3,oneof" json:"Webauthn,omitempty"` } +type MFAAuthenticateResponse_SSO struct { + SSO *SSOResponse `protobuf:"bytes,4,opt,name=SSO,proto3,oneof" json:"SSO,omitempty"` +} func (*MFAAuthenticateResponse_TOTP) isMFAAuthenticateResponse_Response() {} func (*MFAAuthenticateResponse_Webauthn) isMFAAuthenticateResponse_Response() {} +func (*MFAAuthenticateResponse_SSO) isMFAAuthenticateResponse_Response() {} func (m *MFAAuthenticateResponse) GetResponse() isMFAAuthenticateResponse_Response { if m != nil { @@ -6446,11 +6462,19 @@ func (m *MFAAuthenticateResponse) GetWebauthn() *webauthn.CredentialAssertionRes return nil } +func (m *MFAAuthenticateResponse) GetSSO() *SSOResponse { + if x, ok := m.GetResponse().(*MFAAuthenticateResponse_SSO); ok { + return x.SSO + } + return nil +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*MFAAuthenticateResponse) XXX_OneofWrappers() []interface{} { return []interface{}{ (*MFAAuthenticateResponse_TOTP)(nil), (*MFAAuthenticateResponse_Webauthn)(nil), + (*MFAAuthenticateResponse_SSO)(nil), } } @@ -6542,6 +6566,122 @@ func (m *TOTPResponse) GetCode() string { return "" } +// SSOChallenge contains SSO auth request details to perform an SSO MFA check. +type SSOChallenge struct { + // RequestId is the ID of an SSO auth request. + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + // RedirectUrl is an IdP redirect URL to initate the SSO MFA flow. + RedirectUrl string `protobuf:"bytes,2,opt,name=redirect_url,json=redirectUrl,proto3" json:"redirect_url,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SSOChallenge) Reset() { *m = SSOChallenge{} } +func (m *SSOChallenge) String() string { return proto.CompactTextString(m) } +func (*SSOChallenge) ProtoMessage() {} +func (*SSOChallenge) Descriptor() ([]byte, []int) { + return fileDescriptor_0ffcffcda38ae159, []int{92} +} +func (m *SSOChallenge) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SSOChallenge) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SSOChallenge.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 *SSOChallenge) XXX_Merge(src proto.Message) { + xxx_messageInfo_SSOChallenge.Merge(m, src) +} +func (m *SSOChallenge) XXX_Size() int { + return m.Size() +} +func (m *SSOChallenge) XXX_DiscardUnknown() { + xxx_messageInfo_SSOChallenge.DiscardUnknown(m) +} + +var xxx_messageInfo_SSOChallenge proto.InternalMessageInfo + +func (m *SSOChallenge) GetRequestId() string { + if m != nil { + return m.RequestId + } + return "" +} + +func (m *SSOChallenge) GetRedirectUrl() string { + if m != nil { + return m.RedirectUrl + } + return "" +} + +// SSOResponse is a response to SSOChallenge. +type SSOResponse struct { + // RequestId is the ID of an SSO auth request. + RequestId string `protobuf:"bytes,1,opt,name=request_id,json=requestId,proto3" json:"request_id,omitempty"` + // Token is a secret token used to verify the user's SSO MFA session. + Token string `protobuf:"bytes,2,opt,name=token,proto3" json:"token,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` +} + +func (m *SSOResponse) Reset() { *m = SSOResponse{} } +func (m *SSOResponse) String() string { return proto.CompactTextString(m) } +func (*SSOResponse) ProtoMessage() {} +func (*SSOResponse) Descriptor() ([]byte, []int) { + return fileDescriptor_0ffcffcda38ae159, []int{93} +} +func (m *SSOResponse) XXX_Unmarshal(b []byte) error { + return m.Unmarshal(b) +} +func (m *SSOResponse) XXX_Marshal(b []byte, deterministic bool) ([]byte, error) { + if deterministic { + return xxx_messageInfo_SSOResponse.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 *SSOResponse) XXX_Merge(src proto.Message) { + xxx_messageInfo_SSOResponse.Merge(m, src) +} +func (m *SSOResponse) XXX_Size() int { + return m.Size() +} +func (m *SSOResponse) XXX_DiscardUnknown() { + xxx_messageInfo_SSOResponse.DiscardUnknown(m) +} + +var xxx_messageInfo_SSOResponse proto.InternalMessageInfo + +func (m *SSOResponse) GetRequestId() string { + if m != nil { + return m.RequestId + } + return "" +} + +func (m *SSOResponse) GetToken() string { + if m != nil { + return m.Token + } + return "" +} + // MFARegisterChallenge is a challenge for registering a new MFA device. type MFARegisterChallenge struct { // Request depends on the type of the MFA device being registered. @@ -6559,7 +6699,7 @@ func (m *MFARegisterChallenge) Reset() { *m = MFARegisterChallenge{} } func (m *MFARegisterChallenge) String() string { return proto.CompactTextString(m) } func (*MFARegisterChallenge) ProtoMessage() {} func (*MFARegisterChallenge) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{92} + return fileDescriptor_0ffcffcda38ae159, []int{94} } func (m *MFARegisterChallenge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6648,7 +6788,7 @@ func (m *MFARegisterResponse) Reset() { *m = MFARegisterResponse{} } func (m *MFARegisterResponse) String() string { return proto.CompactTextString(m) } func (*MFARegisterResponse) ProtoMessage() {} func (*MFARegisterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{93} + return fileDescriptor_0ffcffcda38ae159, []int{95} } func (m *MFARegisterResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6751,7 +6891,7 @@ func (m *TOTPRegisterChallenge) Reset() { *m = TOTPRegisterChallenge{} } func (m *TOTPRegisterChallenge) String() string { return proto.CompactTextString(m) } func (*TOTPRegisterChallenge) ProtoMessage() {} func (*TOTPRegisterChallenge) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{94} + return fileDescriptor_0ffcffcda38ae159, []int{96} } func (m *TOTPRegisterChallenge) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6850,7 +6990,7 @@ func (m *TOTPRegisterResponse) Reset() { *m = TOTPRegisterResponse{} } func (m *TOTPRegisterResponse) String() string { return proto.CompactTextString(m) } func (*TOTPRegisterResponse) ProtoMessage() {} func (*TOTPRegisterResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{95} + return fileDescriptor_0ffcffcda38ae159, []int{97} } func (m *TOTPRegisterResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6904,7 +7044,7 @@ func (m *AddMFADeviceRequest) Reset() { *m = AddMFADeviceRequest{} } func (m *AddMFADeviceRequest) String() string { return proto.CompactTextString(m) } func (*AddMFADeviceRequest) ProtoMessage() {} func (*AddMFADeviceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{96} + return fileDescriptor_0ffcffcda38ae159, []int{98} } func (m *AddMFADeviceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6944,7 +7084,7 @@ func (m *AddMFADeviceResponse) Reset() { *m = AddMFADeviceResponse{} } func (m *AddMFADeviceResponse) String() string { return proto.CompactTextString(m) } func (*AddMFADeviceResponse) ProtoMessage() {} func (*AddMFADeviceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{97} + return fileDescriptor_0ffcffcda38ae159, []int{99} } func (m *AddMFADeviceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -6984,7 +7124,7 @@ func (m *DeleteMFADeviceRequest) Reset() { *m = DeleteMFADeviceRequest{} func (m *DeleteMFADeviceRequest) String() string { return proto.CompactTextString(m) } func (*DeleteMFADeviceRequest) ProtoMessage() {} func (*DeleteMFADeviceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{98} + return fileDescriptor_0ffcffcda38ae159, []int{100} } func (m *DeleteMFADeviceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7024,7 +7164,7 @@ func (m *DeleteMFADeviceResponse) Reset() { *m = DeleteMFADeviceResponse func (m *DeleteMFADeviceResponse) String() string { return proto.CompactTextString(m) } func (*DeleteMFADeviceResponse) ProtoMessage() {} func (*DeleteMFADeviceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{99} + return fileDescriptor_0ffcffcda38ae159, []int{101} } func (m *DeleteMFADeviceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7079,7 +7219,7 @@ func (m *DeleteMFADeviceSyncRequest) Reset() { *m = DeleteMFADeviceSyncR func (m *DeleteMFADeviceSyncRequest) String() string { return proto.CompactTextString(m) } func (*DeleteMFADeviceSyncRequest) ProtoMessage() {} func (*DeleteMFADeviceSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{100} + return fileDescriptor_0ffcffcda38ae159, []int{102} } func (m *DeleteMFADeviceSyncRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7159,7 +7299,7 @@ func (m *AddMFADeviceSyncRequest) Reset() { *m = AddMFADeviceSyncRequest func (m *AddMFADeviceSyncRequest) String() string { return proto.CompactTextString(m) } func (*AddMFADeviceSyncRequest) ProtoMessage() {} func (*AddMFADeviceSyncRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{101} + return fileDescriptor_0ffcffcda38ae159, []int{103} } func (m *AddMFADeviceSyncRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7235,7 +7375,7 @@ func (m *AddMFADeviceSyncResponse) Reset() { *m = AddMFADeviceSyncRespon func (m *AddMFADeviceSyncResponse) String() string { return proto.CompactTextString(m) } func (*AddMFADeviceSyncResponse) ProtoMessage() {} func (*AddMFADeviceSyncResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{102} + return fileDescriptor_0ffcffcda38ae159, []int{104} } func (m *AddMFADeviceSyncResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7290,7 +7430,7 @@ func (m *GetMFADevicesRequest) Reset() { *m = GetMFADevicesRequest{} } func (m *GetMFADevicesRequest) String() string { return proto.CompactTextString(m) } func (*GetMFADevicesRequest) ProtoMessage() {} func (*GetMFADevicesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{103} + return fileDescriptor_0ffcffcda38ae159, []int{105} } func (m *GetMFADevicesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7338,7 +7478,7 @@ func (m *GetMFADevicesResponse) Reset() { *m = GetMFADevicesResponse{} } func (m *GetMFADevicesResponse) String() string { return proto.CompactTextString(m) } func (*GetMFADevicesResponse) ProtoMessage() {} func (*GetMFADevicesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{104} + return fileDescriptor_0ffcffcda38ae159, []int{106} } func (m *GetMFADevicesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7385,7 +7525,7 @@ func (m *UserSingleUseCertsRequest) Reset() { *m = UserSingleUseCertsReq func (m *UserSingleUseCertsRequest) String() string { return proto.CompactTextString(m) } func (*UserSingleUseCertsRequest) ProtoMessage() {} func (*UserSingleUseCertsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{105} + return fileDescriptor_0ffcffcda38ae159, []int{107} } func (m *UserSingleUseCertsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7425,7 +7565,7 @@ func (m *UserSingleUseCertsResponse) Reset() { *m = UserSingleUseCertsRe func (m *UserSingleUseCertsResponse) String() string { return proto.CompactTextString(m) } func (*UserSingleUseCertsResponse) ProtoMessage() {} func (*UserSingleUseCertsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{106} + return fileDescriptor_0ffcffcda38ae159, []int{108} } func (m *UserSingleUseCertsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7474,7 +7614,7 @@ func (m *IsMFARequiredRequest) Reset() { *m = IsMFARequiredRequest{} } func (m *IsMFARequiredRequest) String() string { return proto.CompactTextString(m) } func (*IsMFARequiredRequest) ProtoMessage() {} func (*IsMFARequiredRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{107} + return fileDescriptor_0ffcffcda38ae159, []int{109} } func (m *IsMFARequiredRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7612,7 +7752,7 @@ func (m *StreamSessionEventsRequest) Reset() { *m = StreamSessionEventsR func (m *StreamSessionEventsRequest) String() string { return proto.CompactTextString(m) } func (*StreamSessionEventsRequest) ProtoMessage() {} func (*StreamSessionEventsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{108} + return fileDescriptor_0ffcffcda38ae159, []int{110} } func (m *StreamSessionEventsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7670,7 +7810,7 @@ func (m *NodeLogin) Reset() { *m = NodeLogin{} } func (m *NodeLogin) String() string { return proto.CompactTextString(m) } func (*NodeLogin) ProtoMessage() {} func (*NodeLogin) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{109} + return fileDescriptor_0ffcffcda38ae159, []int{111} } func (m *NodeLogin) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7724,7 +7864,7 @@ func (m *AdminAction) Reset() { *m = AdminAction{} } func (m *AdminAction) String() string { return proto.CompactTextString(m) } func (*AdminAction) ProtoMessage() {} func (*AdminAction) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{110} + return fileDescriptor_0ffcffcda38ae159, []int{112} } func (m *AdminAction) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7769,7 +7909,7 @@ func (m *IsMFARequiredResponse) Reset() { *m = IsMFARequiredResponse{} } func (m *IsMFARequiredResponse) String() string { return proto.CompactTextString(m) } func (*IsMFARequiredResponse) ProtoMessage() {} func (*IsMFARequiredResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{111} + return fileDescriptor_0ffcffcda38ae159, []int{113} } func (m *IsMFARequiredResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7839,7 +7979,7 @@ func (m *GetEventsRequest) Reset() { *m = GetEventsRequest{} } func (m *GetEventsRequest) String() string { return proto.CompactTextString(m) } func (*GetEventsRequest) ProtoMessage() {} func (*GetEventsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{112} + return fileDescriptor_0ffcffcda38ae159, []int{114} } func (m *GetEventsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -7940,7 +8080,7 @@ func (m *GetSessionEventsRequest) Reset() { *m = GetSessionEventsRequest func (m *GetSessionEventsRequest) String() string { return proto.CompactTextString(m) } func (*GetSessionEventsRequest) ProtoMessage() {} func (*GetSessionEventsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{113} + return fileDescriptor_0ffcffcda38ae159, []int{115} } func (m *GetSessionEventsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8020,7 +8160,7 @@ func (m *Events) Reset() { *m = Events{} } func (m *Events) String() string { return proto.CompactTextString(m) } func (*Events) ProtoMessage() {} func (*Events) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{114} + return fileDescriptor_0ffcffcda38ae159, []int{116} } func (m *Events) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8078,7 +8218,7 @@ func (m *GetLocksRequest) Reset() { *m = GetLocksRequest{} } func (m *GetLocksRequest) String() string { return proto.CompactTextString(m) } func (*GetLocksRequest) ProtoMessage() {} func (*GetLocksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{115} + return fileDescriptor_0ffcffcda38ae159, []int{117} } func (m *GetLocksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8133,7 +8273,7 @@ func (m *GetLocksResponse) Reset() { *m = GetLocksResponse{} } func (m *GetLocksResponse) String() string { return proto.CompactTextString(m) } func (*GetLocksResponse) ProtoMessage() {} func (*GetLocksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{116} + return fileDescriptor_0ffcffcda38ae159, []int{118} } func (m *GetLocksResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8181,7 +8321,7 @@ func (m *GetLockRequest) Reset() { *m = GetLockRequest{} } func (m *GetLockRequest) String() string { return proto.CompactTextString(m) } func (*GetLockRequest) ProtoMessage() {} func (*GetLockRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{117} + return fileDescriptor_0ffcffcda38ae159, []int{119} } func (m *GetLockRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8229,7 +8369,7 @@ func (m *DeleteLockRequest) Reset() { *m = DeleteLockRequest{} } func (m *DeleteLockRequest) String() string { return proto.CompactTextString(m) } func (*DeleteLockRequest) ProtoMessage() {} func (*DeleteLockRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{118} + return fileDescriptor_0ffcffcda38ae159, []int{120} } func (m *DeleteLockRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8279,7 +8419,7 @@ func (m *ReplaceRemoteLocksRequest) Reset() { *m = ReplaceRemoteLocksReq func (m *ReplaceRemoteLocksRequest) String() string { return proto.CompactTextString(m) } func (*ReplaceRemoteLocksRequest) ProtoMessage() {} func (*ReplaceRemoteLocksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{119} + return fileDescriptor_0ffcffcda38ae159, []int{121} } func (m *ReplaceRemoteLocksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8335,7 +8475,7 @@ func (m *GetWindowsDesktopServicesResponse) Reset() { *m = GetWindowsDes func (m *GetWindowsDesktopServicesResponse) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopServicesResponse) ProtoMessage() {} func (*GetWindowsDesktopServicesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{120} + return fileDescriptor_0ffcffcda38ae159, []int{122} } func (m *GetWindowsDesktopServicesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8384,7 +8524,7 @@ func (m *GetWindowsDesktopServiceRequest) Reset() { *m = GetWindowsDeskt func (m *GetWindowsDesktopServiceRequest) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopServiceRequest) ProtoMessage() {} func (*GetWindowsDesktopServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{121} + return fileDescriptor_0ffcffcda38ae159, []int{123} } func (m *GetWindowsDesktopServiceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8433,7 +8573,7 @@ func (m *GetWindowsDesktopServiceResponse) Reset() { *m = GetWindowsDesk func (m *GetWindowsDesktopServiceResponse) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopServiceResponse) ProtoMessage() {} func (*GetWindowsDesktopServiceResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{122} + return fileDescriptor_0ffcffcda38ae159, []int{124} } func (m *GetWindowsDesktopServiceResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8482,7 +8622,7 @@ func (m *DeleteWindowsDesktopServiceRequest) Reset() { *m = DeleteWindow func (m *DeleteWindowsDesktopServiceRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWindowsDesktopServiceRequest) ProtoMessage() {} func (*DeleteWindowsDesktopServiceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{123} + return fileDescriptor_0ffcffcda38ae159, []int{125} } func (m *DeleteWindowsDesktopServiceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8531,7 +8671,7 @@ func (m *GetWindowsDesktopsResponse) Reset() { *m = GetWindowsDesktopsRe func (m *GetWindowsDesktopsResponse) String() string { return proto.CompactTextString(m) } func (*GetWindowsDesktopsResponse) ProtoMessage() {} func (*GetWindowsDesktopsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{124} + return fileDescriptor_0ffcffcda38ae159, []int{126} } func (m *GetWindowsDesktopsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8584,7 +8724,7 @@ func (m *DeleteWindowsDesktopRequest) Reset() { *m = DeleteWindowsDeskto func (m *DeleteWindowsDesktopRequest) String() string { return proto.CompactTextString(m) } func (*DeleteWindowsDesktopRequest) ProtoMessage() {} func (*DeleteWindowsDesktopRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{125} + return fileDescriptor_0ffcffcda38ae159, []int{127} } func (m *DeleteWindowsDesktopRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8645,7 +8785,7 @@ func (m *WindowsDesktopCertRequest) Reset() { *m = WindowsDesktopCertReq func (m *WindowsDesktopCertRequest) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopCertRequest) ProtoMessage() {} func (*WindowsDesktopCertRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{126} + return fileDescriptor_0ffcffcda38ae159, []int{128} } func (m *WindowsDesktopCertRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8708,7 +8848,7 @@ func (m *WindowsDesktopCertResponse) Reset() { *m = WindowsDesktopCertRe func (m *WindowsDesktopCertResponse) String() string { return proto.CompactTextString(m) } func (*WindowsDesktopCertResponse) ProtoMessage() {} func (*WindowsDesktopCertResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{127} + return fileDescriptor_0ffcffcda38ae159, []int{129} } func (m *WindowsDesktopCertResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8757,7 +8897,7 @@ func (m *DesktopBootstrapScriptResponse) Reset() { *m = DesktopBootstrap func (m *DesktopBootstrapScriptResponse) String() string { return proto.CompactTextString(m) } func (*DesktopBootstrapScriptResponse) ProtoMessage() {} func (*DesktopBootstrapScriptResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{128} + return fileDescriptor_0ffcffcda38ae159, []int{130} } func (m *DesktopBootstrapScriptResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8808,7 +8948,7 @@ func (m *ListSAMLIdPServiceProvidersRequest) Reset() { *m = ListSAMLIdPS func (m *ListSAMLIdPServiceProvidersRequest) String() string { return proto.CompactTextString(m) } func (*ListSAMLIdPServiceProvidersRequest) ProtoMessage() {} func (*ListSAMLIdPServiceProvidersRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{129} + return fileDescriptor_0ffcffcda38ae159, []int{131} } func (m *ListSAMLIdPServiceProvidersRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8868,7 +9008,7 @@ func (m *ListSAMLIdPServiceProvidersResponse) Reset() { *m = ListSAMLIdP func (m *ListSAMLIdPServiceProvidersResponse) String() string { return proto.CompactTextString(m) } func (*ListSAMLIdPServiceProvidersResponse) ProtoMessage() {} func (*ListSAMLIdPServiceProvidersResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{130} + return fileDescriptor_0ffcffcda38ae159, []int{132} } func (m *ListSAMLIdPServiceProvidersResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8931,7 +9071,7 @@ func (m *GetSAMLIdPServiceProviderRequest) Reset() { *m = GetSAMLIdPServ func (m *GetSAMLIdPServiceProviderRequest) String() string { return proto.CompactTextString(m) } func (*GetSAMLIdPServiceProviderRequest) ProtoMessage() {} func (*GetSAMLIdPServiceProviderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{131} + return fileDescriptor_0ffcffcda38ae159, []int{133} } func (m *GetSAMLIdPServiceProviderRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -8980,7 +9120,7 @@ func (m *DeleteSAMLIdPServiceProviderRequest) Reset() { *m = DeleteSAMLI func (m *DeleteSAMLIdPServiceProviderRequest) String() string { return proto.CompactTextString(m) } func (*DeleteSAMLIdPServiceProviderRequest) ProtoMessage() {} func (*DeleteSAMLIdPServiceProviderRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{132} + return fileDescriptor_0ffcffcda38ae159, []int{134} } func (m *DeleteSAMLIdPServiceProviderRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9031,7 +9171,7 @@ func (m *ListUserGroupsRequest) Reset() { *m = ListUserGroupsRequest{} } func (m *ListUserGroupsRequest) String() string { return proto.CompactTextString(m) } func (*ListUserGroupsRequest) ProtoMessage() {} func (*ListUserGroupsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{133} + return fileDescriptor_0ffcffcda38ae159, []int{135} } func (m *ListUserGroupsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9091,7 +9231,7 @@ func (m *ListUserGroupsResponse) Reset() { *m = ListUserGroupsResponse{} func (m *ListUserGroupsResponse) String() string { return proto.CompactTextString(m) } func (*ListUserGroupsResponse) ProtoMessage() {} func (*ListUserGroupsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{134} + return fileDescriptor_0ffcffcda38ae159, []int{136} } func (m *ListUserGroupsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9154,7 +9294,7 @@ func (m *GetUserGroupRequest) Reset() { *m = GetUserGroupRequest{} } func (m *GetUserGroupRequest) String() string { return proto.CompactTextString(m) } func (*GetUserGroupRequest) ProtoMessage() {} func (*GetUserGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{135} + return fileDescriptor_0ffcffcda38ae159, []int{137} } func (m *GetUserGroupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9203,7 +9343,7 @@ func (m *DeleteUserGroupRequest) Reset() { *m = DeleteUserGroupRequest{} func (m *DeleteUserGroupRequest) String() string { return proto.CompactTextString(m) } func (*DeleteUserGroupRequest) ProtoMessage() {} func (*DeleteUserGroupRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{136} + return fileDescriptor_0ffcffcda38ae159, []int{138} } func (m *DeleteUserGroupRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9252,7 +9392,7 @@ func (m *CertAuthorityRequest) Reset() { *m = CertAuthorityRequest{} } func (m *CertAuthorityRequest) String() string { return proto.CompactTextString(m) } func (*CertAuthorityRequest) ProtoMessage() {} func (*CertAuthorityRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{137} + return fileDescriptor_0ffcffcda38ae159, []int{139} } func (m *CertAuthorityRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9301,7 +9441,7 @@ func (m *CRL) Reset() { *m = CRL{} } func (m *CRL) String() string { return proto.CompactTextString(m) } func (*CRL) ProtoMessage() {} func (*CRL) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{138} + return fileDescriptor_0ffcffcda38ae159, []int{140} } func (m *CRL) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9371,7 +9511,7 @@ func (m *ChangeUserAuthenticationRequest) Reset() { *m = ChangeUserAuthe func (m *ChangeUserAuthenticationRequest) String() string { return proto.CompactTextString(m) } func (*ChangeUserAuthenticationRequest) ProtoMessage() {} func (*ChangeUserAuthenticationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{139} + return fileDescriptor_0ffcffcda38ae159, []int{141} } func (m *ChangeUserAuthenticationRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9457,7 +9597,7 @@ func (m *ChangeUserAuthenticationResponse) Reset() { *m = ChangeUserAuth func (m *ChangeUserAuthenticationResponse) String() string { return proto.CompactTextString(m) } func (*ChangeUserAuthenticationResponse) ProtoMessage() {} func (*ChangeUserAuthenticationResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{140} + return fileDescriptor_0ffcffcda38ae159, []int{142} } func (m *ChangeUserAuthenticationResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9530,7 +9670,7 @@ func (m *StartAccountRecoveryRequest) Reset() { *m = StartAccountRecover func (m *StartAccountRecoveryRequest) String() string { return proto.CompactTextString(m) } func (*StartAccountRecoveryRequest) ProtoMessage() {} func (*StartAccountRecoveryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{141} + return fileDescriptor_0ffcffcda38ae159, []int{143} } func (m *StartAccountRecoveryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9605,7 +9745,7 @@ func (m *VerifyAccountRecoveryRequest) Reset() { *m = VerifyAccountRecov func (m *VerifyAccountRecoveryRequest) String() string { return proto.CompactTextString(m) } func (*VerifyAccountRecoveryRequest) ProtoMessage() {} func (*VerifyAccountRecoveryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{142} + return fileDescriptor_0ffcffcda38ae159, []int{144} } func (m *VerifyAccountRecoveryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9720,7 +9860,7 @@ func (m *CompleteAccountRecoveryRequest) Reset() { *m = CompleteAccountR func (m *CompleteAccountRecoveryRequest) String() string { return proto.CompactTextString(m) } func (*CompleteAccountRecoveryRequest) ProtoMessage() {} func (*CompleteAccountRecoveryRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{143} + return fileDescriptor_0ffcffcda38ae159, []int{145} } func (m *CompleteAccountRecoveryRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9826,7 +9966,7 @@ func (m *RecoveryCodes) Reset() { *m = RecoveryCodes{} } func (m *RecoveryCodes) String() string { return proto.CompactTextString(m) } func (*RecoveryCodes) ProtoMessage() {} func (*RecoveryCodes) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{144} + return fileDescriptor_0ffcffcda38ae159, []int{146} } func (m *RecoveryCodes) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9889,7 +10029,7 @@ func (m *CreateAccountRecoveryCodesRequest) Reset() { *m = CreateAccount func (m *CreateAccountRecoveryCodesRequest) String() string { return proto.CompactTextString(m) } func (*CreateAccountRecoveryCodesRequest) ProtoMessage() {} func (*CreateAccountRecoveryCodesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{145} + return fileDescriptor_0ffcffcda38ae159, []int{147} } func (m *CreateAccountRecoveryCodesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9940,7 +10080,7 @@ func (m *GetAccountRecoveryTokenRequest) Reset() { *m = GetAccountRecove func (m *GetAccountRecoveryTokenRequest) String() string { return proto.CompactTextString(m) } func (*GetAccountRecoveryTokenRequest) ProtoMessage() {} func (*GetAccountRecoveryTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{146} + return fileDescriptor_0ffcffcda38ae159, []int{148} } func (m *GetAccountRecoveryTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -9988,7 +10128,7 @@ func (m *GetAccountRecoveryCodesRequest) Reset() { *m = GetAccountRecove func (m *GetAccountRecoveryCodesRequest) String() string { return proto.CompactTextString(m) } func (*GetAccountRecoveryCodesRequest) ProtoMessage() {} func (*GetAccountRecoveryCodesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{147} + return fileDescriptor_0ffcffcda38ae159, []int{149} } func (m *GetAccountRecoveryCodesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10030,7 +10170,7 @@ func (m *UserCredentials) Reset() { *m = UserCredentials{} } func (m *UserCredentials) String() string { return proto.CompactTextString(m) } func (*UserCredentials) ProtoMessage() {} func (*UserCredentials) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{148} + return fileDescriptor_0ffcffcda38ae159, []int{150} } func (m *UserCredentials) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10084,7 +10224,7 @@ func (m *ContextUser) Reset() { *m = ContextUser{} } func (m *ContextUser) String() string { return proto.CompactTextString(m) } func (*ContextUser) ProtoMessage() {} func (*ContextUser) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{149} + return fileDescriptor_0ffcffcda38ae159, []int{151} } func (m *ContextUser) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10124,7 +10264,7 @@ func (m *Passwordless) Reset() { *m = Passwordless{} } func (m *Passwordless) String() string { return proto.CompactTextString(m) } func (*Passwordless) ProtoMessage() {} func (*Passwordless) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{150} + return fileDescriptor_0ffcffcda38ae159, []int{152} } func (m *Passwordless) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10176,19 +10316,21 @@ type CreateAuthenticateChallengeRequest struct { // call [AuthService.IsMFARequired] in the leaf instead of setting this field. MFARequiredCheck *IsMFARequiredRequest `protobuf:"bytes,5,opt,name=MFARequiredCheck,proto3" json:"mfa_required_check,omitempty"` // ChallengeExtensions are extensions that will be apply to the issued MFA challenge. - // ChallengeExtensions only apply to webauthn challenges currently. Required, except - // for v15 clients and older. - ChallengeExtensions *v11.ChallengeExtensions `protobuf:"bytes,6,opt,name=ChallengeExtensions,proto3" json:"challenge_extensions,omitempty"` - XXX_NoUnkeyedLiteral struct{} `json:"-"` - XXX_unrecognized []byte `json:"-"` - XXX_sizecache int32 `json:"-"` + // Required, except for v15 clients and older. + ChallengeExtensions *v11.ChallengeExtensions `protobuf:"bytes,6,opt,name=ChallengeExtensions,proto3" json:"challenge_extensions,omitempty"` + // SSOClientRedirectURL should be supplied If the client supports SSO MFA checks. + // If unset, the server will only return non-SSO challenges. + SSOClientRedirectURL string `protobuf:"bytes,7,opt,name=SSOClientRedirectURL,proto3" json:"sso_client_redirect_url,omitempty"` + XXX_NoUnkeyedLiteral struct{} `json:"-"` + XXX_unrecognized []byte `json:"-"` + XXX_sizecache int32 `json:"-"` } func (m *CreateAuthenticateChallengeRequest) Reset() { *m = CreateAuthenticateChallengeRequest{} } func (m *CreateAuthenticateChallengeRequest) String() string { return proto.CompactTextString(m) } func (*CreateAuthenticateChallengeRequest) ProtoMessage() {} func (*CreateAuthenticateChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{151} + return fileDescriptor_0ffcffcda38ae159, []int{153} } func (m *CreateAuthenticateChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10294,6 +10436,13 @@ func (m *CreateAuthenticateChallengeRequest) GetChallengeExtensions() *v11.Chall return nil } +func (m *CreateAuthenticateChallengeRequest) GetSSOClientRedirectURL() string { + if m != nil { + return m.SSOClientRedirectURL + } + return "" +} + // XXX_OneofWrappers is for the internal use of the proto package. func (*CreateAuthenticateChallengeRequest) XXX_OneofWrappers() []interface{} { return []interface{}{ @@ -10322,7 +10471,7 @@ func (m *CreatePrivilegeTokenRequest) Reset() { *m = CreatePrivilegeToke func (m *CreatePrivilegeTokenRequest) String() string { return proto.CompactTextString(m) } func (*CreatePrivilegeTokenRequest) ProtoMessage() {} func (*CreatePrivilegeTokenRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{152} + return fileDescriptor_0ffcffcda38ae159, []int{154} } func (m *CreatePrivilegeTokenRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10391,7 +10540,7 @@ func (m *CreateRegisterChallengeRequest) Reset() { *m = CreateRegisterCh func (m *CreateRegisterChallengeRequest) String() string { return proto.CompactTextString(m) } func (*CreateRegisterChallengeRequest) ProtoMessage() {} func (*CreateRegisterChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{153} + return fileDescriptor_0ffcffcda38ae159, []int{155} } func (m *CreateRegisterChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10479,7 +10628,7 @@ func (m *PaginatedResource) Reset() { *m = PaginatedResource{} } func (m *PaginatedResource) String() string { return proto.CompactTextString(m) } func (*PaginatedResource) ProtoMessage() {} func (*PaginatedResource) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{154} + return fileDescriptor_0ffcffcda38ae159, []int{156} } func (m *PaginatedResource) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10720,7 +10869,7 @@ func (m *ListUnifiedResourcesRequest) Reset() { *m = ListUnifiedResource func (m *ListUnifiedResourcesRequest) String() string { return proto.CompactTextString(m) } func (*ListUnifiedResourcesRequest) ProtoMessage() {} func (*ListUnifiedResourcesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{155} + return fileDescriptor_0ffcffcda38ae159, []int{157} } func (m *ListUnifiedResourcesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10857,7 +11006,7 @@ func (m *ListUnifiedResourcesResponse) Reset() { *m = ListUnifiedResourc func (m *ListUnifiedResourcesResponse) String() string { return proto.CompactTextString(m) } func (*ListUnifiedResourcesResponse) ProtoMessage() {} func (*ListUnifiedResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{156} + return fileDescriptor_0ffcffcda38ae159, []int{158} } func (m *ListUnifiedResourcesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -10953,7 +11102,7 @@ func (m *ListResourcesRequest) Reset() { *m = ListResourcesRequest{} } func (m *ListResourcesRequest) String() string { return proto.CompactTextString(m) } func (*ListResourcesRequest) ProtoMessage() {} func (*ListResourcesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{157} + return fileDescriptor_0ffcffcda38ae159, []int{159} } func (m *ListResourcesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11089,7 +11238,7 @@ func (m *GetSSHTargetsRequest) Reset() { *m = GetSSHTargetsRequest{} } func (m *GetSSHTargetsRequest) String() string { return proto.CompactTextString(m) } func (*GetSSHTargetsRequest) ProtoMessage() {} func (*GetSSHTargetsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{158} + return fileDescriptor_0ffcffcda38ae159, []int{160} } func (m *GetSSHTargetsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11145,7 +11294,7 @@ func (m *GetSSHTargetsResponse) Reset() { *m = GetSSHTargetsResponse{} } func (m *GetSSHTargetsResponse) String() string { return proto.CompactTextString(m) } func (*GetSSHTargetsResponse) ProtoMessage() {} func (*GetSSHTargetsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{159} + return fileDescriptor_0ffcffcda38ae159, []int{161} } func (m *GetSSHTargetsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11200,7 +11349,7 @@ func (m *ListResourcesResponse) Reset() { *m = ListResourcesResponse{} } func (m *ListResourcesResponse) String() string { return proto.CompactTextString(m) } func (*ListResourcesResponse) ProtoMessage() {} func (*ListResourcesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{160} + return fileDescriptor_0ffcffcda38ae159, []int{162} } func (m *ListResourcesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11265,7 +11414,7 @@ func (m *CreateSessionTrackerRequest) Reset() { *m = CreateSessionTracke func (m *CreateSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*CreateSessionTrackerRequest) ProtoMessage() {} func (*CreateSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{161} + return fileDescriptor_0ffcffcda38ae159, []int{163} } func (m *CreateSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11314,7 +11463,7 @@ func (m *GetSessionTrackerRequest) Reset() { *m = GetSessionTrackerReque func (m *GetSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*GetSessionTrackerRequest) ProtoMessage() {} func (*GetSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{162} + return fileDescriptor_0ffcffcda38ae159, []int{164} } func (m *GetSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11363,7 +11512,7 @@ func (m *RemoveSessionTrackerRequest) Reset() { *m = RemoveSessionTracke func (m *RemoveSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*RemoveSessionTrackerRequest) ProtoMessage() {} func (*RemoveSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{163} + return fileDescriptor_0ffcffcda38ae159, []int{165} } func (m *RemoveSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11411,7 +11560,7 @@ func (m *SessionTrackerUpdateState) Reset() { *m = SessionTrackerUpdateS func (m *SessionTrackerUpdateState) String() string { return proto.CompactTextString(m) } func (*SessionTrackerUpdateState) ProtoMessage() {} func (*SessionTrackerUpdateState) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{164} + return fileDescriptor_0ffcffcda38ae159, []int{166} } func (m *SessionTrackerUpdateState) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11459,7 +11608,7 @@ func (m *SessionTrackerAddParticipant) Reset() { *m = SessionTrackerAddP func (m *SessionTrackerAddParticipant) String() string { return proto.CompactTextString(m) } func (*SessionTrackerAddParticipant) ProtoMessage() {} func (*SessionTrackerAddParticipant) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{165} + return fileDescriptor_0ffcffcda38ae159, []int{167} } func (m *SessionTrackerAddParticipant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11507,7 +11656,7 @@ func (m *SessionTrackerRemoveParticipant) Reset() { *m = SessionTrackerR func (m *SessionTrackerRemoveParticipant) String() string { return proto.CompactTextString(m) } func (*SessionTrackerRemoveParticipant) ProtoMessage() {} func (*SessionTrackerRemoveParticipant) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{166} + return fileDescriptor_0ffcffcda38ae159, []int{168} } func (m *SessionTrackerRemoveParticipant) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11556,7 +11705,7 @@ func (m *SessionTrackerUpdateExpiry) Reset() { *m = SessionTrackerUpdate func (m *SessionTrackerUpdateExpiry) String() string { return proto.CompactTextString(m) } func (*SessionTrackerUpdateExpiry) ProtoMessage() {} func (*SessionTrackerUpdateExpiry) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{167} + return fileDescriptor_0ffcffcda38ae159, []int{169} } func (m *SessionTrackerUpdateExpiry) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11611,7 +11760,7 @@ func (m *UpdateSessionTrackerRequest) Reset() { *m = UpdateSessionTracke func (m *UpdateSessionTrackerRequest) String() string { return proto.CompactTextString(m) } func (*UpdateSessionTrackerRequest) ProtoMessage() {} func (*UpdateSessionTrackerRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{168} + return fileDescriptor_0ffcffcda38ae159, []int{170} } func (m *UpdateSessionTrackerRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11729,7 +11878,7 @@ func (m *PresenceMFAChallengeRequest) Reset() { *m = PresenceMFAChalleng func (m *PresenceMFAChallengeRequest) String() string { return proto.CompactTextString(m) } func (*PresenceMFAChallengeRequest) ProtoMessage() {} func (*PresenceMFAChallengeRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{169} + return fileDescriptor_0ffcffcda38ae159, []int{171} } func (m *PresenceMFAChallengeRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11780,7 +11929,7 @@ func (m *PresenceMFAChallengeSend) Reset() { *m = PresenceMFAChallengeSe func (m *PresenceMFAChallengeSend) String() string { return proto.CompactTextString(m) } func (*PresenceMFAChallengeSend) ProtoMessage() {} func (*PresenceMFAChallengeSend) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{170} + return fileDescriptor_0ffcffcda38ae159, []int{172} } func (m *PresenceMFAChallengeSend) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11867,7 +12016,7 @@ func (m *GetDomainNameResponse) Reset() { *m = GetDomainNameResponse{} } func (m *GetDomainNameResponse) String() string { return proto.CompactTextString(m) } func (*GetDomainNameResponse) ProtoMessage() {} func (*GetDomainNameResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{171} + return fileDescriptor_0ffcffcda38ae159, []int{173} } func (m *GetDomainNameResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11916,7 +12065,7 @@ func (m *GetClusterCACertResponse) Reset() { *m = GetClusterCACertRespon func (m *GetClusterCACertResponse) String() string { return proto.CompactTextString(m) } func (*GetClusterCACertResponse) ProtoMessage() {} func (*GetClusterCACertResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{172} + return fileDescriptor_0ffcffcda38ae159, []int{174} } func (m *GetClusterCACertResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -11964,7 +12113,7 @@ func (m *GetLicenseResponse) Reset() { *m = GetLicenseResponse{} } func (m *GetLicenseResponse) String() string { return proto.CompactTextString(m) } func (*GetLicenseResponse) ProtoMessage() {} func (*GetLicenseResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{173} + return fileDescriptor_0ffcffcda38ae159, []int{175} } func (m *GetLicenseResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12012,7 +12161,7 @@ func (m *ListReleasesResponse) Reset() { *m = ListReleasesResponse{} } func (m *ListReleasesResponse) String() string { return proto.CompactTextString(m) } func (*ListReleasesResponse) ProtoMessage() {} func (*ListReleasesResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{174} + return fileDescriptor_0ffcffcda38ae159, []int{176} } func (m *ListReleasesResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12061,7 +12210,7 @@ func (m *GetOIDCAuthRequestRequest) Reset() { *m = GetOIDCAuthRequestReq func (m *GetOIDCAuthRequestRequest) String() string { return proto.CompactTextString(m) } func (*GetOIDCAuthRequestRequest) ProtoMessage() {} func (*GetOIDCAuthRequestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{175} + return fileDescriptor_0ffcffcda38ae159, []int{177} } func (m *GetOIDCAuthRequestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12110,7 +12259,7 @@ func (m *GetSAMLAuthRequestRequest) Reset() { *m = GetSAMLAuthRequestReq func (m *GetSAMLAuthRequestRequest) String() string { return proto.CompactTextString(m) } func (*GetSAMLAuthRequestRequest) ProtoMessage() {} func (*GetSAMLAuthRequestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{176} + return fileDescriptor_0ffcffcda38ae159, []int{178} } func (m *GetSAMLAuthRequestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12159,7 +12308,7 @@ func (m *GetGithubAuthRequestRequest) Reset() { *m = GetGithubAuthReques func (m *GetGithubAuthRequestRequest) String() string { return proto.CompactTextString(m) } func (*GetGithubAuthRequestRequest) ProtoMessage() {} func (*GetGithubAuthRequestRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{177} + return fileDescriptor_0ffcffcda38ae159, []int{179} } func (m *GetGithubAuthRequestRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12208,7 +12357,7 @@ func (m *CreateOIDCConnectorRequest) Reset() { *m = CreateOIDCConnectorR func (m *CreateOIDCConnectorRequest) String() string { return proto.CompactTextString(m) } func (*CreateOIDCConnectorRequest) ProtoMessage() {} func (*CreateOIDCConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{178} + return fileDescriptor_0ffcffcda38ae159, []int{180} } func (m *CreateOIDCConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12257,7 +12406,7 @@ func (m *UpdateOIDCConnectorRequest) Reset() { *m = UpdateOIDCConnectorR func (m *UpdateOIDCConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpdateOIDCConnectorRequest) ProtoMessage() {} func (*UpdateOIDCConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{179} + return fileDescriptor_0ffcffcda38ae159, []int{181} } func (m *UpdateOIDCConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12306,7 +12455,7 @@ func (m *UpsertOIDCConnectorRequest) Reset() { *m = UpsertOIDCConnectorR func (m *UpsertOIDCConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpsertOIDCConnectorRequest) ProtoMessage() {} func (*UpsertOIDCConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{180} + return fileDescriptor_0ffcffcda38ae159, []int{182} } func (m *UpsertOIDCConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12355,7 +12504,7 @@ func (m *CreateSAMLConnectorRequest) Reset() { *m = CreateSAMLConnectorR func (m *CreateSAMLConnectorRequest) String() string { return proto.CompactTextString(m) } func (*CreateSAMLConnectorRequest) ProtoMessage() {} func (*CreateSAMLConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{181} + return fileDescriptor_0ffcffcda38ae159, []int{183} } func (m *CreateSAMLConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12404,7 +12553,7 @@ func (m *UpdateSAMLConnectorRequest) Reset() { *m = UpdateSAMLConnectorR func (m *UpdateSAMLConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpdateSAMLConnectorRequest) ProtoMessage() {} func (*UpdateSAMLConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{182} + return fileDescriptor_0ffcffcda38ae159, []int{184} } func (m *UpdateSAMLConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12453,7 +12602,7 @@ func (m *UpsertSAMLConnectorRequest) Reset() { *m = UpsertSAMLConnectorR func (m *UpsertSAMLConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpsertSAMLConnectorRequest) ProtoMessage() {} func (*UpsertSAMLConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{183} + return fileDescriptor_0ffcffcda38ae159, []int{185} } func (m *UpsertSAMLConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12502,7 +12651,7 @@ func (m *CreateGithubConnectorRequest) Reset() { *m = CreateGithubConnec func (m *CreateGithubConnectorRequest) String() string { return proto.CompactTextString(m) } func (*CreateGithubConnectorRequest) ProtoMessage() {} func (*CreateGithubConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{184} + return fileDescriptor_0ffcffcda38ae159, []int{186} } func (m *CreateGithubConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12551,7 +12700,7 @@ func (m *UpdateGithubConnectorRequest) Reset() { *m = UpdateGithubConnec func (m *UpdateGithubConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpdateGithubConnectorRequest) ProtoMessage() {} func (*UpdateGithubConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{185} + return fileDescriptor_0ffcffcda38ae159, []int{187} } func (m *UpdateGithubConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12600,7 +12749,7 @@ func (m *UpsertGithubConnectorRequest) Reset() { *m = UpsertGithubConnec func (m *UpsertGithubConnectorRequest) String() string { return proto.CompactTextString(m) } func (*UpsertGithubConnectorRequest) ProtoMessage() {} func (*UpsertGithubConnectorRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{186} + return fileDescriptor_0ffcffcda38ae159, []int{188} } func (m *UpsertGithubConnectorRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12651,7 +12800,7 @@ func (m *GetSSODiagnosticInfoRequest) Reset() { *m = GetSSODiagnosticInf func (m *GetSSODiagnosticInfoRequest) String() string { return proto.CompactTextString(m) } func (*GetSSODiagnosticInfoRequest) ProtoMessage() {} func (*GetSSODiagnosticInfoRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{187} + return fileDescriptor_0ffcffcda38ae159, []int{189} } func (m *GetSSODiagnosticInfoRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12717,7 +12866,7 @@ func (m *SystemRoleAssertion) Reset() { *m = SystemRoleAssertion{} } func (m *SystemRoleAssertion) String() string { return proto.CompactTextString(m) } func (*SystemRoleAssertion) ProtoMessage() {} func (*SystemRoleAssertion) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{188} + return fileDescriptor_0ffcffcda38ae159, []int{190} } func (m *SystemRoleAssertion) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12787,7 +12936,7 @@ func (m *SystemRoleAssertionSet) Reset() { *m = SystemRoleAssertionSet{} func (m *SystemRoleAssertionSet) String() string { return proto.CompactTextString(m) } func (*SystemRoleAssertionSet) ProtoMessage() {} func (*SystemRoleAssertionSet) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{189} + return fileDescriptor_0ffcffcda38ae159, []int{191} } func (m *SystemRoleAssertionSet) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12856,7 +13005,7 @@ func (m *UpstreamInventoryOneOf) Reset() { *m = UpstreamInventoryOneOf{} func (m *UpstreamInventoryOneOf) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryOneOf) ProtoMessage() {} func (*UpstreamInventoryOneOf) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{190} + return fileDescriptor_0ffcffcda38ae159, []int{192} } func (m *UpstreamInventoryOneOf) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -12983,7 +13132,7 @@ func (m *DownstreamInventoryOneOf) Reset() { *m = DownstreamInventoryOne func (m *DownstreamInventoryOneOf) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryOneOf) ProtoMessage() {} func (*DownstreamInventoryOneOf) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{191} + return fileDescriptor_0ffcffcda38ae159, []int{193} } func (m *DownstreamInventoryOneOf) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13082,7 +13231,7 @@ func (m *DownstreamInventoryPing) Reset() { *m = DownstreamInventoryPing func (m *DownstreamInventoryPing) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryPing) ProtoMessage() {} func (*DownstreamInventoryPing) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{192} + return fileDescriptor_0ffcffcda38ae159, []int{194} } func (m *DownstreamInventoryPing) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13131,7 +13280,7 @@ func (m *UpstreamInventoryPong) Reset() { *m = UpstreamInventoryPong{} } func (m *UpstreamInventoryPong) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryPong) ProtoMessage() {} func (*UpstreamInventoryPong) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{193} + return fileDescriptor_0ffcffcda38ae159, []int{195} } func (m *UpstreamInventoryPong) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13198,7 +13347,7 @@ func (m *UpstreamInventoryHello) Reset() { *m = UpstreamInventoryHello{} func (m *UpstreamInventoryHello) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryHello) ProtoMessage() {} func (*UpstreamInventoryHello) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{194} + return fileDescriptor_0ffcffcda38ae159, []int{196} } func (m *UpstreamInventoryHello) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13298,7 +13447,7 @@ func (m *UpstreamInventoryAgentMetadata) Reset() { *m = UpstreamInventor func (m *UpstreamInventoryAgentMetadata) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryAgentMetadata) ProtoMessage() {} func (*UpstreamInventoryAgentMetadata) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{195} + return fileDescriptor_0ffcffcda38ae159, []int{197} } func (m *UpstreamInventoryAgentMetadata) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13400,7 +13549,7 @@ func (m *DownstreamInventoryHello) Reset() { *m = DownstreamInventoryHel func (m *DownstreamInventoryHello) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryHello) ProtoMessage() {} func (*DownstreamInventoryHello) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{196} + return fileDescriptor_0ffcffcda38ae159, []int{198} } func (m *DownstreamInventoryHello) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13503,7 +13652,7 @@ func (m *DownstreamInventoryHello_SupportedCapabilities) String() string { } func (*DownstreamInventoryHello_SupportedCapabilities) ProtoMessage() {} func (*DownstreamInventoryHello_SupportedCapabilities) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{196, 0} + return fileDescriptor_0ffcffcda38ae159, []int{198, 0} } func (m *DownstreamInventoryHello_SupportedCapabilities) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13676,7 +13825,7 @@ func (m *InventoryUpdateLabelsRequest) Reset() { *m = InventoryUpdateLab func (m *InventoryUpdateLabelsRequest) String() string { return proto.CompactTextString(m) } func (*InventoryUpdateLabelsRequest) ProtoMessage() {} func (*InventoryUpdateLabelsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{197} + return fileDescriptor_0ffcffcda38ae159, []int{199} } func (m *InventoryUpdateLabelsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13742,7 +13891,7 @@ func (m *DownstreamInventoryUpdateLabels) Reset() { *m = DownstreamInven func (m *DownstreamInventoryUpdateLabels) String() string { return proto.CompactTextString(m) } func (*DownstreamInventoryUpdateLabels) ProtoMessage() {} func (*DownstreamInventoryUpdateLabels) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{198} + return fileDescriptor_0ffcffcda38ae159, []int{200} } func (m *DownstreamInventoryUpdateLabels) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13807,7 +13956,7 @@ func (m *InventoryHeartbeat) Reset() { *m = InventoryHeartbeat{} } func (m *InventoryHeartbeat) String() string { return proto.CompactTextString(m) } func (*InventoryHeartbeat) ProtoMessage() {} func (*InventoryHeartbeat) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{199} + return fileDescriptor_0ffcffcda38ae159, []int{201} } func (m *InventoryHeartbeat) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13879,7 +14028,7 @@ func (m *UpstreamInventoryGoodbye) Reset() { *m = UpstreamInventoryGoodb func (m *UpstreamInventoryGoodbye) String() string { return proto.CompactTextString(m) } func (*UpstreamInventoryGoodbye) ProtoMessage() {} func (*UpstreamInventoryGoodbye) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{200} + return fileDescriptor_0ffcffcda38ae159, []int{202} } func (m *UpstreamInventoryGoodbye) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13929,7 +14078,7 @@ func (m *InventoryStatusRequest) Reset() { *m = InventoryStatusRequest{} func (m *InventoryStatusRequest) String() string { return proto.CompactTextString(m) } func (*InventoryStatusRequest) ProtoMessage() {} func (*InventoryStatusRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{201} + return fileDescriptor_0ffcffcda38ae159, []int{203} } func (m *InventoryStatusRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -13987,7 +14136,7 @@ func (m *InventoryStatusSummary) Reset() { *m = InventoryStatusSummary{} func (m *InventoryStatusSummary) String() string { return proto.CompactTextString(m) } func (*InventoryStatusSummary) ProtoMessage() {} func (*InventoryStatusSummary) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{202} + return fileDescriptor_0ffcffcda38ae159, []int{204} } func (m *InventoryStatusSummary) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14064,7 +14213,7 @@ func (m *InventoryConnectedServiceCountsRequest) Reset() { func (m *InventoryConnectedServiceCountsRequest) String() string { return proto.CompactTextString(m) } func (*InventoryConnectedServiceCountsRequest) ProtoMessage() {} func (*InventoryConnectedServiceCountsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{203} + return fileDescriptor_0ffcffcda38ae159, []int{205} } func (m *InventoryConnectedServiceCountsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14106,7 +14255,7 @@ func (m *InventoryConnectedServiceCounts) Reset() { *m = InventoryConnec func (m *InventoryConnectedServiceCounts) String() string { return proto.CompactTextString(m) } func (*InventoryConnectedServiceCounts) ProtoMessage() {} func (*InventoryConnectedServiceCounts) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{204} + return fileDescriptor_0ffcffcda38ae159, []int{206} } func (m *InventoryConnectedServiceCounts) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14160,7 +14309,7 @@ func (m *InventoryPingRequest) Reset() { *m = InventoryPingRequest{} } func (m *InventoryPingRequest) String() string { return proto.CompactTextString(m) } func (*InventoryPingRequest) ProtoMessage() {} func (*InventoryPingRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{205} + return fileDescriptor_0ffcffcda38ae159, []int{207} } func (m *InventoryPingRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14216,7 +14365,7 @@ func (m *InventoryPingResponse) Reset() { *m = InventoryPingResponse{} } func (m *InventoryPingResponse) String() string { return proto.CompactTextString(m) } func (*InventoryPingResponse) ProtoMessage() {} func (*InventoryPingResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{206} + return fileDescriptor_0ffcffcda38ae159, []int{208} } func (m *InventoryPingResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14265,7 +14414,7 @@ func (m *GetClusterAlertsResponse) Reset() { *m = GetClusterAlertsRespon func (m *GetClusterAlertsResponse) String() string { return proto.CompactTextString(m) } func (*GetClusterAlertsResponse) ProtoMessage() {} func (*GetClusterAlertsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{207} + return fileDescriptor_0ffcffcda38ae159, []int{209} } func (m *GetClusterAlertsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14312,7 +14461,7 @@ func (m *GetAlertAcksRequest) Reset() { *m = GetAlertAcksRequest{} } func (m *GetAlertAcksRequest) String() string { return proto.CompactTextString(m) } func (*GetAlertAcksRequest) ProtoMessage() {} func (*GetAlertAcksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{208} + return fileDescriptor_0ffcffcda38ae159, []int{210} } func (m *GetAlertAcksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14354,7 +14503,7 @@ func (m *GetAlertAcksResponse) Reset() { *m = GetAlertAcksResponse{} } func (m *GetAlertAcksResponse) String() string { return proto.CompactTextString(m) } func (*GetAlertAcksResponse) ProtoMessage() {} func (*GetAlertAcksResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{209} + return fileDescriptor_0ffcffcda38ae159, []int{211} } func (m *GetAlertAcksResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14404,7 +14553,7 @@ func (m *ClearAlertAcksRequest) Reset() { *m = ClearAlertAcksRequest{} } func (m *ClearAlertAcksRequest) String() string { return proto.CompactTextString(m) } func (*ClearAlertAcksRequest) ProtoMessage() {} func (*ClearAlertAcksRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{210} + return fileDescriptor_0ffcffcda38ae159, []int{212} } func (m *ClearAlertAcksRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14453,7 +14602,7 @@ func (m *UpsertClusterAlertRequest) Reset() { *m = UpsertClusterAlertReq func (m *UpsertClusterAlertRequest) String() string { return proto.CompactTextString(m) } func (*UpsertClusterAlertRequest) ProtoMessage() {} func (*UpsertClusterAlertRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{211} + return fileDescriptor_0ffcffcda38ae159, []int{213} } func (m *UpsertClusterAlertRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14502,7 +14651,7 @@ func (m *GetConnectionDiagnosticRequest) Reset() { *m = GetConnectionDia func (m *GetConnectionDiagnosticRequest) String() string { return proto.CompactTextString(m) } func (*GetConnectionDiagnosticRequest) ProtoMessage() {} func (*GetConnectionDiagnosticRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{212} + return fileDescriptor_0ffcffcda38ae159, []int{214} } func (m *GetConnectionDiagnosticRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14553,7 +14702,7 @@ func (m *AppendDiagnosticTraceRequest) Reset() { *m = AppendDiagnosticTr func (m *AppendDiagnosticTraceRequest) String() string { return proto.CompactTextString(m) } func (*AppendDiagnosticTraceRequest) ProtoMessage() {} func (*AppendDiagnosticTraceRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{213} + return fileDescriptor_0ffcffcda38ae159, []int{215} } func (m *AppendDiagnosticTraceRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14608,7 +14757,7 @@ func (m *SubmitUsageEventRequest) Reset() { *m = SubmitUsageEventRequest func (m *SubmitUsageEventRequest) String() string { return proto.CompactTextString(m) } func (*SubmitUsageEventRequest) ProtoMessage() {} func (*SubmitUsageEventRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{214} + return fileDescriptor_0ffcffcda38ae159, []int{216} } func (m *SubmitUsageEventRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14655,7 +14804,7 @@ func (m *GetLicenseRequest) Reset() { *m = GetLicenseRequest{} } func (m *GetLicenseRequest) String() string { return proto.CompactTextString(m) } func (*GetLicenseRequest) ProtoMessage() {} func (*GetLicenseRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{215} + return fileDescriptor_0ffcffcda38ae159, []int{217} } func (m *GetLicenseRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14695,7 +14844,7 @@ func (m *ListReleasesRequest) Reset() { *m = ListReleasesRequest{} } func (m *ListReleasesRequest) String() string { return proto.CompactTextString(m) } func (*ListReleasesRequest) ProtoMessage() {} func (*ListReleasesRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{216} + return fileDescriptor_0ffcffcda38ae159, []int{218} } func (m *ListReleasesRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14739,7 +14888,7 @@ func (m *CreateTokenV2Request) Reset() { *m = CreateTokenV2Request{} } func (m *CreateTokenV2Request) String() string { return proto.CompactTextString(m) } func (*CreateTokenV2Request) ProtoMessage() {} func (*CreateTokenV2Request) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{217} + return fileDescriptor_0ffcffcda38ae159, []int{219} } func (m *CreateTokenV2Request) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14816,7 +14965,7 @@ func (m *UpsertTokenV2Request) Reset() { *m = UpsertTokenV2Request{} } func (m *UpsertTokenV2Request) String() string { return proto.CompactTextString(m) } func (*UpsertTokenV2Request) ProtoMessage() {} func (*UpsertTokenV2Request) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{218} + return fileDescriptor_0ffcffcda38ae159, []int{220} } func (m *UpsertTokenV2Request) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14891,7 +15040,7 @@ func (m *GetHeadlessAuthenticationRequest) Reset() { *m = GetHeadlessAut func (m *GetHeadlessAuthenticationRequest) String() string { return proto.CompactTextString(m) } func (*GetHeadlessAuthenticationRequest) ProtoMessage() {} func (*GetHeadlessAuthenticationRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{219} + return fileDescriptor_0ffcffcda38ae159, []int{221} } func (m *GetHeadlessAuthenticationRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -14949,7 +15098,7 @@ func (m *UpdateHeadlessAuthenticationStateRequest) Reset() { func (m *UpdateHeadlessAuthenticationStateRequest) String() string { return proto.CompactTextString(m) } func (*UpdateHeadlessAuthenticationStateRequest) ProtoMessage() {} func (*UpdateHeadlessAuthenticationStateRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{220} + return fileDescriptor_0ffcffcda38ae159, []int{222} } func (m *UpdateHeadlessAuthenticationStateRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15015,7 +15164,7 @@ func (m *ExportUpgradeWindowsRequest) Reset() { *m = ExportUpgradeWindow func (m *ExportUpgradeWindowsRequest) String() string { return proto.CompactTextString(m) } func (*ExportUpgradeWindowsRequest) ProtoMessage() {} func (*ExportUpgradeWindowsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{221} + return fileDescriptor_0ffcffcda38ae159, []int{223} } func (m *ExportUpgradeWindowsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15081,7 +15230,7 @@ func (m *ExportUpgradeWindowsResponse) Reset() { *m = ExportUpgradeWindo func (m *ExportUpgradeWindowsResponse) String() string { return proto.CompactTextString(m) } func (*ExportUpgradeWindowsResponse) ProtoMessage() {} func (*ExportUpgradeWindowsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{222} + return fileDescriptor_0ffcffcda38ae159, []int{224} } func (m *ExportUpgradeWindowsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15156,7 +15305,7 @@ func (m *ListAccessRequestsRequest) Reset() { *m = ListAccessRequestsReq func (m *ListAccessRequestsRequest) String() string { return proto.CompactTextString(m) } func (*ListAccessRequestsRequest) ProtoMessage() {} func (*ListAccessRequestsRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{223} + return fileDescriptor_0ffcffcda38ae159, []int{225} } func (m *ListAccessRequestsRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15235,7 +15384,7 @@ func (m *ListAccessRequestsResponse) Reset() { *m = ListAccessRequestsRe func (m *ListAccessRequestsResponse) String() string { return proto.CompactTextString(m) } func (*ListAccessRequestsResponse) ProtoMessage() {} func (*ListAccessRequestsResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{224} + return fileDescriptor_0ffcffcda38ae159, []int{226} } func (m *ListAccessRequestsResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15291,7 +15440,7 @@ func (m *AccessRequestAllowedPromotionRequest) Reset() { *m = AccessRequ func (m *AccessRequestAllowedPromotionRequest) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotionRequest) ProtoMessage() {} func (*AccessRequestAllowedPromotionRequest) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{225} + return fileDescriptor_0ffcffcda38ae159, []int{227} } func (m *AccessRequestAllowedPromotionRequest) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15340,7 +15489,7 @@ func (m *AccessRequestAllowedPromotionResponse) Reset() { *m = AccessReq func (m *AccessRequestAllowedPromotionResponse) String() string { return proto.CompactTextString(m) } func (*AccessRequestAllowedPromotionResponse) ProtoMessage() {} func (*AccessRequestAllowedPromotionResponse) Descriptor() ([]byte, []int) { - return fileDescriptor_0ffcffcda38ae159, []int{226} + return fileDescriptor_0ffcffcda38ae159, []int{228} } func (m *AccessRequestAllowedPromotionResponse) XXX_Unmarshal(b []byte) error { return m.Unmarshal(b) @@ -15484,6 +15633,8 @@ func init() { proto.RegisterType((*MFAAuthenticateResponse)(nil), "proto.MFAAuthenticateResponse") proto.RegisterType((*TOTPChallenge)(nil), "proto.TOTPChallenge") proto.RegisterType((*TOTPResponse)(nil), "proto.TOTPResponse") + proto.RegisterType((*SSOChallenge)(nil), "proto.SSOChallenge") + proto.RegisterType((*SSOResponse)(nil), "proto.SSOResponse") proto.RegisterType((*MFARegisterChallenge)(nil), "proto.MFARegisterChallenge") proto.RegisterType((*MFARegisterResponse)(nil), "proto.MFARegisterResponse") proto.RegisterType((*TOTPRegisterChallenge)(nil), "proto.TOTPRegisterChallenge") @@ -15635,941 +15786,949 @@ func init() { } var fileDescriptor_0ffcffcda38ae159 = []byte{ - // 14935 bytes of a gzipped FileDescriptorProto - 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0x7d, 0x5b, 0x6c, 0x5c, 0x49, - 0x76, 0x18, 0x9b, 0x6f, 0x1e, 0xbe, 0x5a, 0x45, 0x52, 0x6c, 0x51, 0x94, 0x5a, 0xba, 0x9a, 0x87, - 0x46, 0x3b, 0xab, 0x07, 0xe7, 0xb1, 0xf3, 0xda, 0x99, 0x69, 0x3e, 0x24, 0x52, 0xe2, 0x6b, 0x6e, - 0x93, 0xd4, 0xbc, 0xbc, 0xbd, 0x97, 0xdd, 0x25, 0xf2, 0x5a, 0xcd, 0x7b, 0x7b, 0xef, 0xbd, 0x2d, - 0x8d, 0xd6, 0xb1, 0x03, 0xaf, 0x13, 0xc4, 0x3f, 0x49, 0x6c, 0x20, 0x36, 0x1c, 0xf8, 0xc3, 0x09, - 0x90, 0x00, 0x41, 0x80, 0x04, 0xf9, 0x09, 0xfc, 0x93, 0x7c, 0x04, 0xf9, 0xc8, 0xc6, 0x80, 0x91, - 0x04, 0xb6, 0x7f, 0xf2, 0x41, 0x27, 0x0b, 0xf8, 0x87, 0x48, 0x3e, 0x8c, 0x20, 0x01, 0xb2, 0x80, - 0x81, 0xa0, 0x4e, 0x3d, 0x6e, 0xd5, 0x7d, 0x74, 0x93, 0x92, 0x66, 0x9d, 0x1f, 0x89, 0x7d, 0xea, - 0x9c, 0x53, 0x55, 0xa7, 0xea, 0x56, 0x9d, 0x3a, 0x75, 0xea, 0x1c, 0xb8, 0x19, 0xd1, 0x26, 0x6d, - 0xf9, 0x41, 0x74, 0xab, 0x49, 0x0f, 0x9c, 0xfa, 0xb3, 0x5b, 0xf5, 0xa6, 0x4b, 0xbd, 0xe8, 0x56, - 0x2b, 0xf0, 0x23, 0xff, 0x96, 0xd3, 0x8e, 0x0e, 0x43, 0x1a, 0x3c, 0x71, 0xeb, 0xf4, 0x26, 0x42, - 0xc8, 0x00, 0xfe, 0x37, 0x37, 0x7d, 0xe0, 0x1f, 0xf8, 0x1c, 0x87, 0xfd, 0xc5, 0x0b, 0xe7, 0x2e, - 0x1e, 0xf8, 0xfe, 0x41, 0x93, 0x72, 0xe2, 0xfd, 0xf6, 0xa3, 0x5b, 0xf4, 0xa8, 0x15, 0x3d, 0x13, - 0x85, 0xe5, 0x64, 0x61, 0xe4, 0x1e, 0xd1, 0x30, 0x72, 0x8e, 0x5a, 0x02, 0xe1, 0x0d, 0xd5, 0x14, - 0x27, 0x8a, 0x58, 0x49, 0xe4, 0xfa, 0xde, 0xad, 0x27, 0x77, 0xf4, 0x9f, 0x02, 0xf5, 0x7a, 0xc7, - 0x56, 0xd7, 0x69, 0x10, 0x85, 0xa7, 0xc2, 0xa4, 0x4f, 0xa8, 0x17, 0xa5, 0xaa, 0x17, 0x98, 0xd1, - 0xb3, 0x16, 0x0d, 0x39, 0x8a, 0xfc, 0x4f, 0xa0, 0x5e, 0xcd, 0x46, 0xc5, 0x7f, 0x05, 0xca, 0x77, - 0xb3, 0x51, 0x9e, 0xd2, 0x7d, 0x26, 0x53, 0x4f, 0xfd, 0xd1, 0x05, 0x3d, 0x70, 0x5a, 0x2d, 0x1a, - 0xc4, 0x7f, 0x08, 0xf4, 0x0b, 0x0a, 0xfd, 0xe8, 0x91, 0xc3, 0x44, 0x74, 0xf4, 0xc8, 0x49, 0x75, - 0xa3, 0x1d, 0x3a, 0x07, 0x54, 0x34, 0xff, 0xc9, 0x1d, 0xfd, 0x27, 0x47, 0xb5, 0xfe, 0xa0, 0x00, - 0x03, 0x0f, 0x9d, 0xa8, 0x7e, 0x48, 0x3e, 0x81, 0x81, 0x07, 0xae, 0xd7, 0x08, 0x4b, 0x85, 0x2b, - 0x7d, 0xd7, 0x47, 0x17, 0x8a, 0x37, 0x79, 0x57, 0xb0, 0x90, 0x15, 0x2c, 0xce, 0xfe, 0xf4, 0xb8, - 0xdc, 0x73, 0x72, 0x5c, 0x9e, 0x7c, 0xcc, 0xd0, 0xde, 0xf4, 0x8f, 0xdc, 0x08, 0xc7, 0xd6, 0xe6, - 0x74, 0x64, 0x17, 0xa6, 0x2a, 0xcd, 0xa6, 0xff, 0x74, 0xdb, 0x09, 0x22, 0xd7, 0x69, 0x56, 0xdb, - 0xf5, 0x3a, 0x0d, 0xc3, 0x52, 0xef, 0x95, 0xc2, 0xf5, 0xe1, 0xc5, 0x6b, 0x27, 0xc7, 0xe5, 0xb2, - 0xc3, 0x8a, 0x6b, 0x2d, 0x5e, 0x5e, 0x0b, 0x39, 0x82, 0xc6, 0x28, 0x8b, 0xde, 0xfa, 0xa3, 0x41, - 0x28, 0xae, 0xfa, 0x61, 0xb4, 0xc4, 0x46, 0xd4, 0xa6, 0x3f, 0x6a, 0xd3, 0x30, 0x22, 0xd7, 0x60, - 0x90, 0xc1, 0xd6, 0x96, 0x4b, 0x85, 0x2b, 0x85, 0xeb, 0x23, 0x8b, 0xa3, 0x27, 0xc7, 0xe5, 0xa1, - 0x43, 0x3f, 0x8c, 0x6a, 0x6e, 0xc3, 0x16, 0x45, 0xe4, 0x0d, 0x18, 0xde, 0xf4, 0x1b, 0x74, 0xd3, - 0x39, 0xa2, 0xd8, 0x8a, 0x91, 0xc5, 0xf1, 0x93, 0xe3, 0xf2, 0x88, 0xe7, 0x37, 0x68, 0xcd, 0x73, - 0x8e, 0xa8, 0xad, 0x8a, 0xc9, 0x1e, 0xf4, 0xdb, 0x7e, 0x93, 0x96, 0xfa, 0x10, 0x6d, 0xf1, 0xe4, - 0xb8, 0xdc, 0x1f, 0xf8, 0x4d, 0xfa, 0xf3, 0xe3, 0xf2, 0xbb, 0x07, 0x6e, 0x74, 0xd8, 0xde, 0xbf, - 0x59, 0xf7, 0x8f, 0x6e, 0x1d, 0x04, 0xce, 0x13, 0x97, 0x4f, 0x42, 0xa7, 0x79, 0x2b, 0x9e, 0xaa, - 0x2d, 0x57, 0x8c, 0x7b, 0xf5, 0x59, 0x18, 0xd1, 0x23, 0xc6, 0xc9, 0x46, 0x7e, 0xe4, 0x21, 0x4c, - 0x57, 0x1a, 0x0d, 0x97, 0x53, 0x6c, 0x07, 0xae, 0x57, 0x77, 0x5b, 0x4e, 0x33, 0x2c, 0xf5, 0x5f, - 0xe9, 0xbb, 0x3e, 0x22, 0x84, 0xa2, 0xca, 0x6b, 0x2d, 0x85, 0xa0, 0x09, 0x25, 0x93, 0x01, 0x79, - 0x0b, 0x86, 0x97, 0x37, 0xab, 0xac, 0xed, 0x61, 0x69, 0x00, 0x99, 0xcd, 0x9e, 0x1c, 0x97, 0xa7, - 0x1a, 0x5e, 0x88, 0x5d, 0xd3, 0x19, 0x28, 0x44, 0xf2, 0x2e, 0x8c, 0x6d, 0xb7, 0xf7, 0x9b, 0x6e, - 0x7d, 0x67, 0xbd, 0xfa, 0x80, 0x3e, 0x2b, 0x0d, 0x5e, 0x29, 0x5c, 0x1f, 0x5b, 0x24, 0x27, 0xc7, - 0xe5, 0x89, 0x16, 0xc2, 0x6b, 0x51, 0x33, 0xac, 0x3d, 0xa6, 0xcf, 0x6c, 0x03, 0x2f, 0xa6, 0xab, - 0x56, 0x57, 0x19, 0xdd, 0x50, 0x8a, 0x2e, 0x0c, 0x0f, 0x75, 0x3a, 0x8e, 0x47, 0x6e, 0x01, 0xd8, - 0xf4, 0xc8, 0x8f, 0x68, 0xa5, 0xd1, 0x08, 0x4a, 0xc3, 0x28, 0xdb, 0xc9, 0x93, 0xe3, 0xf2, 0x68, - 0x80, 0xd0, 0x9a, 0xd3, 0x68, 0x04, 0xb6, 0x86, 0x42, 0x96, 0x60, 0xd8, 0xf6, 0xb9, 0x80, 0x4b, - 0x23, 0x57, 0x0a, 0xd7, 0x47, 0x17, 0x26, 0xc5, 0x34, 0x94, 0xe0, 0xc5, 0xf3, 0x27, 0xc7, 0x65, - 0x12, 0x88, 0x5f, 0x7a, 0x2f, 0x25, 0x06, 0x29, 0xc3, 0xd0, 0xa6, 0xbf, 0xe4, 0xd4, 0x0f, 0x69, - 0x09, 0x70, 0xee, 0x0d, 0x9c, 0x1c, 0x97, 0x0b, 0xdf, 0xb5, 0x25, 0x94, 0x3c, 0x81, 0xd1, 0x78, - 0xa0, 0xc2, 0xd2, 0x28, 0x8a, 0x6f, 0xe7, 0xe4, 0xb8, 0x7c, 0x3e, 0x44, 0x70, 0x8d, 0x0d, 0xbd, - 0x26, 0xc1, 0x17, 0x98, 0x05, 0x7a, 0x45, 0xe4, 0x6b, 0x98, 0x89, 0x7f, 0x56, 0xc2, 0x90, 0x06, - 0x8c, 0xc7, 0xda, 0x72, 0x69, 0x1c, 0x25, 0xf3, 0xda, 0xc9, 0x71, 0xd9, 0xd2, 0x5a, 0x50, 0x73, - 0x24, 0x4a, 0xcd, 0x6d, 0x68, 0x3d, 0xcd, 0x66, 0x72, 0xbf, 0x7f, 0x78, 0xac, 0x38, 0x6e, 0x5f, - 0xda, 0xf5, 0xc2, 0xc8, 0xd9, 0x6f, 0xd2, 0x4c, 0x24, 0xeb, 0xaf, 0x0a, 0x40, 0xb6, 0x5a, 0xd4, - 0xab, 0x56, 0x57, 0xd9, 0xf7, 0x24, 0x3f, 0xa7, 0x37, 0x61, 0x84, 0x0f, 0x1c, 0x1b, 0xdd, 0x5e, - 0x1c, 0xdd, 0x89, 0x93, 0xe3, 0x32, 0x88, 0xd1, 0x65, 0x23, 0x1b, 0x23, 0x90, 0x57, 0xa1, 0x6f, - 0x67, 0x67, 0x1d, 0xbf, 0x95, 0xbe, 0xc5, 0xa9, 0x93, 0xe3, 0x72, 0x5f, 0x14, 0x35, 0x7f, 0x7e, - 0x5c, 0x1e, 0x5e, 0x6e, 0x07, 0x28, 0x16, 0x9b, 0x95, 0x93, 0x57, 0x61, 0x68, 0xa9, 0xd9, 0x0e, - 0x23, 0x1a, 0x94, 0xfa, 0xe3, 0x8f, 0xb4, 0xce, 0x41, 0xb6, 0x2c, 0x23, 0xdf, 0x81, 0xfe, 0xdd, - 0x90, 0x06, 0xa5, 0x01, 0x1c, 0xef, 0x71, 0x31, 0xde, 0x0c, 0xb4, 0xb7, 0xb0, 0x38, 0xcc, 0xbe, - 0xc4, 0x76, 0x48, 0x03, 0x1b, 0x91, 0xc8, 0x4d, 0x18, 0xe0, 0x83, 0x36, 0x88, 0x8b, 0xd4, 0xb8, - 0x9a, 0x1d, 0x4d, 0xba, 0xf7, 0xee, 0xe2, 0xc8, 0xc9, 0x71, 0x79, 0x00, 0x07, 0xcf, 0xe6, 0x68, - 0xf7, 0xfb, 0x87, 0x0b, 0xc5, 0x5e, 0x7b, 0x98, 0xd1, 0xb2, 0xcf, 0xc2, 0xfa, 0x0e, 0x8c, 0x6a, - 0xdd, 0x27, 0xf3, 0xd0, 0xcf, 0xfe, 0xc7, 0x45, 0x64, 0x8c, 0x57, 0xc6, 0x36, 0x0e, 0x1b, 0xa1, - 0xd6, 0x3f, 0x9a, 0x82, 0x22, 0xa3, 0x34, 0x56, 0x9e, 0x9b, 0xba, 0xa8, 0x38, 0x5d, 0xd1, 0x14, - 0x55, 0xa9, 0xa0, 0x0b, 0xeb, 0x3a, 0xa8, 0xda, 0xc5, 0x22, 0x34, 0x76, 0x72, 0x5c, 0x1e, 0x6e, - 0x0b, 0x58, 0xdc, 0x36, 0x52, 0x85, 0xa1, 0x95, 0x6f, 0x5a, 0x6e, 0x40, 0x43, 0x14, 0xed, 0xe8, - 0xc2, 0xdc, 0x4d, 0xbe, 0x5d, 0xde, 0x94, 0xdb, 0xe5, 0xcd, 0x1d, 0xb9, 0x5d, 0x2e, 0x5e, 0x12, - 0x8b, 0xf1, 0x39, 0xca, 0x49, 0xe2, 0xf9, 0xf1, 0x5b, 0x7f, 0x5e, 0x2e, 0xd8, 0x92, 0x13, 0x79, - 0x13, 0x06, 0xef, 0xfa, 0xc1, 0x91, 0x13, 0x89, 0x31, 0x98, 0x3e, 0x39, 0x2e, 0x17, 0x1f, 0x21, - 0x44, 0x9b, 0x52, 0x02, 0x87, 0xdc, 0x85, 0x09, 0xdb, 0x6f, 0x47, 0x74, 0xc7, 0x97, 0x23, 0x37, - 0x80, 0x54, 0x97, 0x4f, 0x8e, 0xcb, 0x73, 0x01, 0x2b, 0xa9, 0x45, 0x7e, 0x4d, 0x0c, 0xa1, 0x46, - 0x9f, 0xa0, 0x22, 0x2b, 0x30, 0x51, 0xc1, 0xd5, 0x5b, 0x48, 0x8d, 0x8f, 0xd7, 0xc8, 0xe2, 0xa5, - 0x93, 0xe3, 0xf2, 0x05, 0x07, 0x4b, 0x6a, 0x81, 0x28, 0xd2, 0xd9, 0x98, 0x44, 0x64, 0x13, 0xce, - 0x3d, 0x68, 0xef, 0xd3, 0xc0, 0xa3, 0x11, 0x0d, 0x65, 0x8b, 0x86, 0xb0, 0x45, 0x57, 0x4e, 0x8e, - 0xcb, 0xf3, 0x8f, 0x55, 0x61, 0x46, 0x9b, 0xd2, 0xa4, 0x84, 0xc2, 0xa4, 0x68, 0xe8, 0xb2, 0x13, - 0x39, 0xfb, 0x4e, 0x48, 0x71, 0x51, 0x1a, 0x5d, 0x38, 0xcf, 0x45, 0x7c, 0x33, 0x51, 0xba, 0x78, - 0x4d, 0x48, 0xf9, 0xa2, 0xea, 0x7b, 0x43, 0x14, 0x69, 0x15, 0x25, 0x79, 0xb2, 0xb5, 0x59, 0xed, - 0x3b, 0x23, 0xd8, 0x5a, 0x5c, 0x9b, 0xd5, 0xbe, 0xa3, 0xaf, 0x5a, 0x6a, 0x07, 0x5a, 0x87, 0x81, - 0x5d, 0xb6, 0x3b, 0xe3, 0x9a, 0x35, 0xb1, 0x70, 0x55, 0xb4, 0x28, 0x39, 0xff, 0x6e, 0xb2, 0x1f, - 0x88, 0x88, 0x5f, 0xde, 0x24, 0xee, 0xe8, 0xfa, 0x5e, 0x8c, 0x65, 0xe4, 0x33, 0x00, 0xd1, 0xaa, - 0x4a, 0xab, 0x55, 0x1a, 0xc5, 0x4e, 0x9e, 0x33, 0x3b, 0x59, 0x69, 0xb5, 0x16, 0x2f, 0x8b, 0xfe, - 0x9d, 0x57, 0xfd, 0x73, 0x5a, 0x2d, 0x8d, 0x9b, 0xc6, 0x84, 0x7c, 0x02, 0x63, 0xb8, 0xa4, 0xc9, - 0x11, 0x1d, 0xc3, 0x11, 0xbd, 0x78, 0x72, 0x5c, 0x9e, 0xc5, 0xd5, 0x2a, 0x63, 0x3c, 0x0d, 0x02, - 0xf2, 0x6b, 0x30, 0x23, 0xd8, 0x3d, 0x74, 0xbd, 0x86, 0xff, 0x34, 0x5c, 0xa6, 0xe1, 0xe3, 0xc8, - 0x6f, 0xe1, 0xf2, 0x37, 0xba, 0x30, 0x6f, 0x36, 0xcf, 0xc4, 0x59, 0xbc, 0x21, 0x5a, 0x6a, 0xa9, - 0x96, 0x3e, 0xe5, 0x08, 0xb5, 0x06, 0xc7, 0xd0, 0x17, 0xc8, 0x4c, 0x16, 0x64, 0x0d, 0x26, 0x77, - 0x43, 0x6a, 0xf4, 0x61, 0x02, 0xf7, 0x87, 0x32, 0x1b, 0xe1, 0x76, 0x48, 0x6b, 0x79, 0xfd, 0x48, - 0xd2, 0x11, 0x1b, 0xc8, 0x72, 0xe0, 0xb7, 0x12, 0x73, 0x7c, 0x12, 0x25, 0x62, 0x9d, 0x1c, 0x97, - 0x2f, 0x37, 0x02, 0xbf, 0x55, 0xcb, 0x9f, 0xe8, 0x19, 0xd4, 0xe4, 0x07, 0x70, 0x7e, 0xc9, 0xf7, - 0x3c, 0x5a, 0x67, 0x2b, 0xe8, 0xb2, 0xeb, 0x1c, 0x78, 0x7e, 0x18, 0xb9, 0xf5, 0xb5, 0xe5, 0x52, - 0x31, 0xde, 0x1e, 0xea, 0x0a, 0xa3, 0xd6, 0x50, 0x28, 0xe6, 0xf6, 0x90, 0xc3, 0x85, 0x7c, 0x05, - 0xe3, 0xa2, 0x2e, 0x1a, 0xe0, 0xd4, 0x3c, 0xd7, 0x79, 0xa2, 0x29, 0x64, 0xbe, 0xd1, 0x07, 0xf2, - 0x27, 0x57, 0x9d, 0x4c, 0x5e, 0xe4, 0x6b, 0x18, 0xdd, 0xb8, 0x5b, 0xb1, 0x69, 0xd8, 0xf2, 0xbd, - 0x90, 0x96, 0x08, 0x8e, 0xe8, 0x65, 0xc1, 0x7a, 0xe3, 0x6e, 0xa5, 0xd2, 0x8e, 0x0e, 0xa9, 0x17, - 0xb9, 0x75, 0x27, 0xa2, 0x12, 0x6b, 0x71, 0x8e, 0xcd, 0xbc, 0xa3, 0x47, 0x4e, 0x2d, 0x10, 0x10, - 0xad, 0x17, 0x3a, 0x3b, 0x32, 0x07, 0xc3, 0xd5, 0xea, 0xea, 0xba, 0x7f, 0xe0, 0x7a, 0xa5, 0x29, - 0x26, 0x0c, 0x5b, 0xfd, 0x26, 0x8f, 0x60, 0x46, 0x3b, 0x1b, 0xd4, 0xd8, 0xff, 0xf4, 0x88, 0x7a, - 0x51, 0x69, 0x1a, 0xdb, 0xf0, 0x5d, 0x75, 0xb8, 0xb9, 0xa9, 0x1f, 0x21, 0x9e, 0xdc, 0xb9, 0x59, - 0x89, 0x7f, 0x56, 0x25, 0xd1, 0x62, 0x6f, 0xa9, 0x60, 0x4f, 0x3b, 0x19, 0x25, 0x64, 0x07, 0x86, - 0xb6, 0xdb, 0x41, 0xcb, 0x0f, 0x69, 0x69, 0x06, 0x05, 0x77, 0xad, 0xd3, 0x17, 0x2a, 0x50, 0x17, - 0x67, 0xd8, 0x12, 0xdd, 0xe2, 0x3f, 0xb4, 0xde, 0x49, 0x56, 0xe4, 0x53, 0x18, 0xab, 0x56, 0x57, - 0xe3, 0x0d, 0xe5, 0x3c, 0x6e, 0x28, 0xf3, 0x27, 0xc7, 0xe5, 0x12, 0x53, 0xa9, 0xe2, 0x4d, 0x45, - 0xff, 0xaa, 0x74, 0x0a, 0xc6, 0x61, 0x67, 0xbd, 0x1a, 0x73, 0x98, 0x8d, 0x39, 0x30, 0x65, 0x2e, - 0x9b, 0x83, 0x4e, 0x41, 0xfe, 0x45, 0x01, 0xae, 0xe8, 0x2c, 0xb3, 0x04, 0x53, 0xba, 0xf0, 0x3c, - 0xd2, 0x5c, 0x38, 0x39, 0x2e, 0xdf, 0x34, 0xfb, 0x51, 0xcb, 0x1c, 0x2c, 0xad, 0x6d, 0x5d, 0x9b, - 0x82, 0xed, 0xd5, 0x3b, 0x90, 0xd9, 0xde, 0xb9, 0xe7, 0x6e, 0xaf, 0x29, 0xb5, 0xee, 0xed, 0xed, - 0xd6, 0x14, 0xeb, 0x73, 0x18, 0x51, 0x8b, 0x36, 0x19, 0x82, 0xbe, 0x4a, 0xb3, 0x59, 0xec, 0x61, - 0x7f, 0x54, 0xab, 0xab, 0xc5, 0x02, 0x99, 0x00, 0x88, 0x77, 0xaa, 0x62, 0x2f, 0x19, 0x83, 0x61, - 0xb9, 0x93, 0x14, 0xfb, 0x10, 0xbf, 0xd5, 0x2a, 0xf6, 0x13, 0x02, 0x13, 0xe6, 0x7a, 0x56, 0x1c, - 0xb0, 0x7e, 0xbb, 0x00, 0x23, 0xea, 0x3b, 0x24, 0x93, 0x30, 0xba, 0xbb, 0x59, 0xdd, 0x5e, 0x59, - 0x5a, 0xbb, 0xbb, 0xb6, 0xb2, 0x5c, 0xec, 0x21, 0x97, 0xe0, 0xc2, 0x4e, 0x75, 0xb5, 0xb6, 0xbc, - 0x58, 0x5b, 0xdf, 0x5a, 0xaa, 0xac, 0xd7, 0xb6, 0xed, 0xad, 0xcf, 0xbf, 0xa8, 0xed, 0xec, 0x6e, - 0x6e, 0xae, 0xac, 0x17, 0x0b, 0xa4, 0x04, 0xd3, 0xac, 0xf8, 0xc1, 0xee, 0xe2, 0x8a, 0x8e, 0x50, - 0xec, 0x25, 0x57, 0xe1, 0x52, 0x56, 0x49, 0x6d, 0x75, 0xa5, 0xb2, 0xbc, 0xbe, 0x52, 0xad, 0x16, - 0xfb, 0xc8, 0x2c, 0x4c, 0x31, 0x94, 0xca, 0xf6, 0xb6, 0x41, 0xdb, 0x6f, 0x35, 0x61, 0x54, 0xfb, - 0x00, 0xc8, 0x3c, 0x94, 0x96, 0x56, 0xec, 0x9d, 0xda, 0xf6, 0xae, 0xbd, 0xbd, 0x55, 0x5d, 0xa9, - 0x99, 0x2d, 0x4c, 0x96, 0xae, 0x6f, 0xdd, 0x5b, 0xdb, 0xac, 0x31, 0x50, 0xb5, 0x58, 0x60, 0xcd, - 0x30, 0x4a, 0xab, 0x6b, 0x9b, 0xf7, 0xd6, 0x57, 0x6a, 0xbb, 0xd5, 0x15, 0x81, 0xd2, 0x6b, 0xfd, - 0xa4, 0x37, 0xb5, 0xa5, 0x93, 0x05, 0x18, 0xad, 0x72, 0x7b, 0x05, 0x2e, 0x73, 0xfc, 0x80, 0xc8, - 0x74, 0xb4, 0x31, 0x61, 0xc6, 0xe0, 0x2b, 0x98, 0x8e, 0xc4, 0xb4, 0xb4, 0x6d, 0xf6, 0x35, 0xd7, - 0xfd, 0xa6, 0xae, 0xa5, 0xb5, 0x04, 0xcc, 0x56, 0xa5, 0x64, 0x41, 0xd3, 0xe7, 0xf8, 0x69, 0x11, - 0x4f, 0x24, 0x52, 0x9f, 0xd3, 0xf7, 0x76, 0xa5, 0xd9, 0x2d, 0xc4, 0x43, 0x2a, 0xd4, 0x30, 0xa4, - 0xc9, 0xd0, 0x25, 0x14, 0x1e, 0x79, 0x43, 0x6a, 0xba, 0xfc, 0x74, 0x87, 0x9b, 0x7d, 0xe2, 0x5c, - 0x22, 0x94, 0x5c, 0xab, 0x9d, 0xb3, 0xb1, 0x92, 0x0f, 0x93, 0x73, 0x46, 0x08, 0x03, 0x99, 0x25, - 0xf6, 0x4f, 0x3b, 0x81, 0x4a, 0xca, 0x30, 0xc0, 0x57, 0x5c, 0x2e, 0x0f, 0xd4, 0xad, 0x9b, 0x0c, - 0x60, 0x73, 0xb8, 0xf5, 0xbb, 0x7d, 0xba, 0x92, 0xc1, 0x74, 0x69, 0x4d, 0xde, 0xa8, 0x4b, 0xa3, - 0x9c, 0x11, 0xca, 0x8e, 0x82, 0xfc, 0x2b, 0xc1, 0xa3, 0x60, 0x5f, 0x7c, 0x14, 0x14, 0x9f, 0x1a, - 0x3f, 0x0a, 0xc6, 0x28, 0x6c, 0x14, 0x85, 0xda, 0x86, 0x5c, 0xfb, 0xe3, 0x51, 0x14, 0xaa, 0x9e, - 0x18, 0x45, 0x0d, 0x89, 0x7c, 0x00, 0x50, 0x79, 0x58, 0xc5, 0x33, 0x8f, 0xbd, 0x29, 0x54, 0x57, - 0xdc, 0x64, 0x9c, 0xa7, 0xa1, 0x38, 0x52, 0x05, 0xfa, 0x99, 0x51, 0xc3, 0x26, 0x8b, 0x30, 0x5e, - 0xf9, 0x71, 0x3b, 0xa0, 0x6b, 0x0d, 0xb6, 0x4f, 0x45, 0xfc, 0x70, 0x3c, 0xc2, 0x17, 0x52, 0x87, - 0x15, 0xd4, 0x5c, 0x51, 0xa2, 0x31, 0x30, 0x49, 0xc8, 0x16, 0x9c, 0xbb, 0xb7, 0xb4, 0x2d, 0xe6, - 0x55, 0xa5, 0x5e, 0xf7, 0xdb, 0x5e, 0x24, 0xf4, 0xd5, 0xab, 0x27, 0xc7, 0xe5, 0x4b, 0x07, 0xf5, - 0x56, 0x4d, 0xce, 0x41, 0x87, 0x17, 0xeb, 0x0a, 0x6b, 0x8a, 0x96, 0x5c, 0x83, 0xbe, 0x5d, 0x7b, - 0x4d, 0x9c, 0x9c, 0xcf, 0x9d, 0x1c, 0x97, 0xc7, 0xdb, 0x81, 0xab, 0x91, 0xb0, 0xd2, 0xfb, 0xfd, - 0xc3, 0xbd, 0xc5, 0x3e, 0x7b, 0xa4, 0x4a, 0xc3, 0x90, 0x1f, 0xf2, 0x9a, 0x30, 0x71, 0x8f, 0x46, - 0x6c, 0xf6, 0xc9, 0x43, 0x4b, 0xe7, 0xb1, 0xf9, 0x08, 0x46, 0x1f, 0xba, 0xd1, 0x61, 0x95, 0xd6, - 0x03, 0x1a, 0x49, 0x83, 0x0d, 0xca, 0xed, 0xa9, 0x1b, 0x1d, 0xd6, 0x42, 0x0e, 0xd7, 0x37, 0x67, - 0x0d, 0xdd, 0x5a, 0x81, 0x49, 0x51, 0x9b, 0x3a, 0x23, 0x2d, 0x98, 0x0c, 0x0b, 0xc8, 0x10, 0xc7, - 0x4e, 0x67, 0x68, 0xb2, 0xf9, 0xd7, 0xbd, 0x30, 0xb3, 0x74, 0xe8, 0x78, 0x07, 0x74, 0xdb, 0x09, - 0xc3, 0xa7, 0x7e, 0xd0, 0xd0, 0x1a, 0x8f, 0x07, 0xc4, 0x54, 0xe3, 0xf1, 0x44, 0xb8, 0x00, 0xa3, - 0x5b, 0xcd, 0x86, 0xa4, 0x11, 0x87, 0x57, 0xac, 0xcb, 0x6f, 0x36, 0x6a, 0x2d, 0xc9, 0x4b, 0x47, - 0x62, 0x34, 0x9b, 0xf4, 0xa9, 0xa2, 0xe9, 0x8b, 0x69, 0x3c, 0xfa, 0x54, 0xa3, 0xd1, 0x90, 0xc8, - 0x0a, 0x9c, 0xab, 0xd2, 0xba, 0xef, 0x35, 0xee, 0x3a, 0xf5, 0xc8, 0x0f, 0x76, 0xfc, 0xc7, 0xd4, - 0x13, 0xb3, 0x12, 0xb5, 0xfb, 0x10, 0x0b, 0x6b, 0x8f, 0xb0, 0xb4, 0x16, 0xb1, 0x62, 0x3b, 0x4d, - 0x41, 0xb6, 0x60, 0xf8, 0xa1, 0x30, 0xfb, 0x89, 0x13, 0xef, 0xab, 0x37, 0x95, 0x1d, 0x70, 0x29, - 0xa0, 0x38, 0x95, 0x9c, 0xa6, 0x3a, 0xb3, 0x2b, 0x65, 0x09, 0xd7, 0x23, 0x89, 0x69, 0x2b, 0x26, - 0xd6, 0x2e, 0x8c, 0x6f, 0x37, 0xdb, 0x07, 0xae, 0xc7, 0x56, 0x8e, 0x2a, 0xfd, 0x11, 0x59, 0x06, - 0x88, 0x01, 0xc2, 0x98, 0x37, 0x25, 0xce, 0xc9, 0x71, 0xc1, 0xde, 0x5b, 0xe2, 0xf3, 0x43, 0x08, - 0x1e, 0x6b, 0x6c, 0x8d, 0xce, 0xfa, 0xbf, 0x7d, 0x40, 0xc4, 0x00, 0xe0, 0x4e, 0x56, 0xa5, 0x11, - 0xdb, 0x63, 0xce, 0x43, 0xaf, 0xb2, 0xb9, 0x0d, 0x9e, 0x1c, 0x97, 0x7b, 0xdd, 0x86, 0xdd, 0xbb, - 0xb6, 0x4c, 0xde, 0x86, 0x01, 0x44, 0x43, 0xf9, 0x4f, 0xa8, 0xfa, 0x74, 0x0e, 0x7c, 0x05, 0xc1, - 0x2d, 0xd4, 0xe6, 0xc8, 0xe4, 0x1d, 0x18, 0x59, 0xa6, 0x4d, 0x7a, 0xe0, 0x44, 0xbe, 0x5c, 0x13, - 0xb8, 0x15, 0x4b, 0x02, 0xb5, 0x39, 0x17, 0x63, 0xb2, 0x33, 0xad, 0x4d, 0x9d, 0xd0, 0xf7, 0xf4, - 0x33, 0x6d, 0x80, 0x10, 0xfd, 0x4c, 0xcb, 0x71, 0xc8, 0xef, 0x14, 0x60, 0xb4, 0xe2, 0x79, 0xc2, - 0x3a, 0x14, 0x0a, 0xa9, 0xcf, 0xdc, 0x54, 0xe6, 0xd4, 0x75, 0x67, 0x9f, 0x36, 0xf7, 0x9c, 0x66, - 0x9b, 0x86, 0x8b, 0x5f, 0xb3, 0x63, 0xc6, 0x7f, 0x3d, 0x2e, 0x7f, 0x78, 0x06, 0x7b, 0x4f, 0x6c, - 0x98, 0xdd, 0x09, 0x1c, 0x37, 0x0a, 0x4f, 0x8e, 0xcb, 0x33, 0x4e, 0x5c, 0xa1, 0xfe, 0xdd, 0x68, - 0xed, 0x88, 0x17, 0xf8, 0xc1, 0x6e, 0x0b, 0x3c, 0x39, 0x82, 0xc9, 0x4a, 0x18, 0xb6, 0x8f, 0x68, - 0x35, 0x72, 0x82, 0x68, 0xc7, 0x3d, 0xa2, 0xb8, 0xaa, 0x74, 0xb6, 0x10, 0xbc, 0xfe, 0xd3, 0xe3, - 0x72, 0x81, 0x9d, 0x6c, 0x1c, 0x24, 0x65, 0xca, 0x4b, 0x10, 0xd5, 0x22, 0x57, 0xdf, 0xa3, 0xd0, - 0x56, 0x90, 0xe4, 0x6d, 0x5d, 0x53, 0x5a, 0xc5, 0xda, 0x72, 0xde, 0x88, 0x5b, 0x4b, 0x30, 0x7f, - 0x8f, 0x46, 0x36, 0x0d, 0x69, 0x24, 0xbf, 0x11, 0x9c, 0xe1, 0xb1, 0x85, 0x76, 0x08, 0x7f, 0x2b, - 0x62, 0x1c, 0x7e, 0xfe, 0x5d, 0xc8, 0x12, 0xeb, 0x6f, 0x15, 0xa0, 0xbc, 0x14, 0x50, 0x7e, 0x28, - 0xc8, 0x61, 0xd4, 0x79, 0xed, 0x9a, 0x87, 0xfe, 0x9d, 0x67, 0x2d, 0x69, 0x5a, 0xc1, 0x52, 0x36, - 0x28, 0x36, 0x42, 0x4f, 0x69, 0xa9, 0xb2, 0x1e, 0xc1, 0x8c, 0x4d, 0x3d, 0xfa, 0xd4, 0xd9, 0x6f, - 0x52, 0xc3, 0xd8, 0x53, 0x86, 0x01, 0xfe, 0xa1, 0xa7, 0xba, 0xc0, 0xe1, 0x67, 0x33, 0x9c, 0x59, - 0xe3, 0x30, 0xba, 0xed, 0x7a, 0x07, 0x82, 0xbb, 0xf5, 0x17, 0xfd, 0x30, 0xc6, 0x7f, 0x8b, 0x73, - 0x4e, 0x62, 0xcf, 0x2b, 0x9c, 0x66, 0xcf, 0x7b, 0x0f, 0xc6, 0xd9, 0xa6, 0x41, 0x83, 0x3d, 0x1a, - 0xb0, 0xf5, 0x5f, 0x48, 0x02, 0xcf, 0x6c, 0x21, 0x16, 0xd4, 0x9e, 0xf0, 0x12, 0xdb, 0x44, 0x24, - 0xeb, 0x30, 0xc1, 0x01, 0x77, 0xa9, 0x13, 0xb5, 0x63, 0xb3, 0xd3, 0xa4, 0x38, 0xd8, 0x48, 0x30, - 0x9f, 0x9a, 0x82, 0xd7, 0x23, 0x01, 0xb4, 0x13, 0xb4, 0xe4, 0x13, 0x98, 0xdc, 0x0e, 0xfc, 0x6f, - 0x9e, 0x69, 0xbb, 0x3c, 0xff, 0x3a, 0xf9, 0x11, 0x88, 0x15, 0xd5, 0xf4, 0xbd, 0x3e, 0x89, 0x4d, - 0xde, 0x80, 0xe1, 0xb5, 0x70, 0xd1, 0x0f, 0x5c, 0xef, 0x00, 0xbf, 0xd1, 0x61, 0x6e, 0xad, 0x77, - 0xc3, 0xda, 0x3e, 0x02, 0x6d, 0x55, 0x9c, 0xb0, 0x2b, 0x0f, 0x75, 0xb7, 0x2b, 0xdf, 0x06, 0x58, - 0xf7, 0x9d, 0x46, 0xa5, 0xd9, 0x5c, 0xaa, 0x84, 0xb8, 0x9d, 0x8a, 0xfd, 0xa8, 0xe9, 0x3b, 0x8d, - 0x9a, 0xd3, 0x6c, 0xd6, 0xea, 0x4e, 0x68, 0x6b, 0x38, 0xe4, 0x4b, 0xb8, 0x10, 0xba, 0x07, 0x1e, - 0x76, 0xae, 0xe6, 0x34, 0x0f, 0xfc, 0xc0, 0x8d, 0x0e, 0x8f, 0x6a, 0x61, 0xdb, 0x8d, 0xb8, 0x51, - 0x67, 0x62, 0xe1, 0xb2, 0x58, 0xe4, 0xaa, 0x12, 0xaf, 0x22, 0xd1, 0xaa, 0x0c, 0xcb, 0x9e, 0x0d, - 0xb3, 0x0b, 0xc8, 0x43, 0x18, 0x5f, 0x77, 0xeb, 0xd4, 0x0b, 0x29, 0x5a, 0xe9, 0x9e, 0xa1, 0xc9, - 0xa7, 0xf3, 0xc7, 0xcc, 0x84, 0x38, 0xde, 0xd4, 0x89, 0xf0, 0xd3, 0x35, 0xf9, 0xdc, 0xef, 0x1f, - 0x1e, 0x2c, 0x0e, 0xd9, 0x93, 0x02, 0xf8, 0xd0, 0x09, 0x3c, 0xd7, 0x3b, 0x08, 0xad, 0x7f, 0x79, - 0x0e, 0x86, 0xd5, 0x38, 0xdd, 0xd4, 0x8f, 0x1b, 0x62, 0x6b, 0xc6, 0x29, 0x1b, 0x1b, 0xd3, 0x6c, - 0x0d, 0x83, 0x5c, 0xc0, 0x03, 0x88, 0x50, 0x0a, 0x86, 0xd8, 0x27, 0xe4, 0xb4, 0x5a, 0x36, 0x83, - 0xb1, 0xa5, 0x61, 0x79, 0x11, 0x27, 0xcd, 0x30, 0x5f, 0x1a, 0x1a, 0xfb, 0x76, 0xef, 0xf2, 0x22, - 0xfb, 0x26, 0xb7, 0xd6, 0x96, 0x97, 0x70, 0xfc, 0x87, 0xf9, 0x37, 0xe9, 0xbb, 0x8d, 0xba, 0x8d, - 0x50, 0x56, 0x5a, 0xad, 0x6c, 0xac, 0x8b, 0x31, 0xc6, 0xd2, 0xd0, 0x39, 0x6a, 0xda, 0x08, 0x65, - 0x2a, 0x2b, 0xb7, 0x8b, 0x2c, 0xf9, 0x5e, 0x14, 0xf8, 0xcd, 0x10, 0xf5, 0xb0, 0x61, 0x3e, 0x07, - 0x85, 0x41, 0xa5, 0x2e, 0x8a, 0xec, 0x04, 0x2a, 0x79, 0x08, 0xb3, 0x95, 0xc6, 0x13, 0xc7, 0xab, - 0xd3, 0x06, 0x2f, 0x79, 0xe8, 0x07, 0x8f, 0x1f, 0x35, 0xfd, 0xa7, 0x21, 0x4e, 0x92, 0x61, 0x61, - 0x7f, 0x14, 0x28, 0xd2, 0x3e, 0xf3, 0x54, 0x22, 0xd9, 0x79, 0xd4, 0x6c, 0x1d, 0x58, 0x6a, 0xfa, - 0xed, 0x86, 0x98, 0x3a, 0xb8, 0x0e, 0xd4, 0x19, 0xc0, 0xe6, 0x70, 0x26, 0xa5, 0xd5, 0xea, 0x06, - 0x4e, 0x0c, 0x21, 0xa5, 0xc3, 0xf0, 0xc8, 0x66, 0x30, 0xf2, 0x2a, 0x0c, 0x49, 0xed, 0x9b, 0x5f, - 0x47, 0xa0, 0x19, 0x5c, 0x6a, 0xdd, 0xb2, 0x8c, 0x7d, 0xc7, 0x36, 0xad, 0xfb, 0x4f, 0x68, 0xf0, - 0x6c, 0xc9, 0x6f, 0x50, 0x69, 0x9b, 0x12, 0xb6, 0x17, 0x5e, 0x50, 0xab, 0xb3, 0x12, 0xdb, 0x44, - 0x64, 0x15, 0xf0, 0x8d, 0x3b, 0x2c, 0x4d, 0xc6, 0x15, 0xf0, 0x8d, 0x3d, 0xb4, 0x65, 0x19, 0x59, - 0x86, 0x73, 0x95, 0x76, 0xe4, 0x1f, 0x39, 0x91, 0x5b, 0xdf, 0x6d, 0x1d, 0x04, 0x0e, 0xab, 0xa4, - 0x88, 0x04, 0x78, 0x1a, 0x71, 0x64, 0x61, 0xad, 0x2d, 0x4a, 0xed, 0x34, 0x01, 0x79, 0x17, 0xc6, - 0xd6, 0x42, 0x6e, 0x7f, 0x74, 0x42, 0xda, 0x40, 0x23, 0x92, 0x68, 0xa5, 0x1b, 0xd6, 0xd0, 0x1a, - 0x59, 0x63, 0xe7, 0x97, 0x86, 0x6d, 0xe0, 0x11, 0x0b, 0x06, 0x2b, 0x61, 0xe8, 0x86, 0x11, 0xda, - 0x86, 0x86, 0x17, 0xe1, 0xe4, 0xb8, 0x3c, 0xe8, 0x20, 0xc4, 0x16, 0x25, 0xe4, 0x21, 0x8c, 0x2e, - 0x53, 0xa6, 0xfe, 0xee, 0x04, 0xed, 0x30, 0x42, 0x4b, 0xcf, 0xe8, 0xc2, 0x05, 0xb1, 0x1a, 0x69, - 0x25, 0x62, 0x2e, 0x73, 0x15, 0xb5, 0x81, 0xf0, 0x5a, 0xc4, 0x0a, 0xf4, 0xad, 0x56, 0xc3, 0x67, - 0xba, 0xbd, 0xa0, 0x59, 0x75, 0x1b, 0x6c, 0x7d, 0x99, 0xc6, 0x36, 0xa0, 0x6e, 0x2f, 0x16, 0xb4, - 0xda, 0x21, 0x96, 0xe8, 0xba, 0xbd, 0x41, 0x42, 0xea, 0x29, 0x93, 0xf6, 0x8c, 0x61, 0xb6, 0x34, - 0x0b, 0x65, 0x13, 0xcf, 0x68, 0xf0, 0xfe, 0x08, 0x46, 0x97, 0xda, 0x61, 0xe4, 0x1f, 0xed, 0x1c, - 0xd2, 0x23, 0x8a, 0xd6, 0x20, 0x71, 0x82, 0xa9, 0x23, 0xb8, 0x16, 0x31, 0xb8, 0xde, 0x4d, 0x0d, - 0x9d, 0x7c, 0x06, 0x44, 0x1e, 0x45, 0xee, 0xb1, 0xf9, 0xe1, 0xb1, 0xb9, 0x8c, 0x06, 0xa1, 0x61, - 0x7e, 0xfe, 0x90, 0x27, 0x98, 0xda, 0x81, 0x2a, 0xd6, 0x8d, 0x92, 0x69, 0x62, 0xd6, 0x20, 0xde, - 0xc4, 0x7b, 0x81, 0xd3, 0x3a, 0x2c, 0x95, 0xe2, 0xa3, 0x81, 0xe8, 0xd4, 0x01, 0x83, 0x1b, 0x2a, - 0x4e, 0x8c, 0x4e, 0xaa, 0x00, 0xfc, 0xe7, 0x3a, 0x1b, 0x78, 0x6e, 0x42, 0x2a, 0x19, 0xf2, 0x62, - 0x05, 0x52, 0x56, 0x17, 0x50, 0x71, 0xe2, 0x6c, 0x9b, 0xae, 0x31, 0x9a, 0x1a, 0x1b, 0xf2, 0x18, - 0x8a, 0xfc, 0xd7, 0x86, 0xef, 0xb9, 0x11, 0xdf, 0x2f, 0xe6, 0x0c, 0x7b, 0x63, 0xb2, 0x58, 0x56, - 0x80, 0x76, 0x5e, 0x51, 0xc1, 0x91, 0x2a, 0xd5, 0xaa, 0x49, 0x31, 0x26, 0xdb, 0x30, 0xba, 0x1d, - 0xf8, 0x8d, 0x76, 0x3d, 0x42, 0x2d, 0xe3, 0x22, 0x2e, 0xfc, 0x44, 0xd4, 0xa3, 0x95, 0x70, 0x99, - 0xb4, 0x38, 0xa0, 0xc6, 0xf6, 0x05, 0x5d, 0x26, 0x1a, 0x22, 0x59, 0x84, 0xc1, 0x6d, 0xbf, 0xe9, - 0xd6, 0x9f, 0x95, 0xe6, 0xb1, 0xd1, 0xd3, 0x92, 0x19, 0x02, 0x65, 0x53, 0x51, 0xa5, 0x6d, 0x21, - 0x48, 0x57, 0x69, 0x39, 0x12, 0xa9, 0xc0, 0xf8, 0x67, 0x6c, 0xc2, 0xb8, 0xbe, 0xe7, 0x39, 0x6e, - 0x40, 0x4b, 0x97, 0x70, 0x5c, 0xd0, 0x16, 0xff, 0x23, 0xbd, 0x40, 0x9f, 0xce, 0x06, 0x05, 0x59, - 0x83, 0xc9, 0xb5, 0xb0, 0x1a, 0x05, 0x6e, 0x8b, 0x6e, 0x38, 0x9e, 0x73, 0x40, 0x1b, 0xa5, 0xcb, - 0xb1, 0x31, 0xdc, 0x0d, 0x6b, 0x21, 0x96, 0xd5, 0x8e, 0x78, 0xa1, 0x6e, 0x0c, 0x4f, 0xd0, 0x91, - 0xcf, 0x61, 0x7a, 0xe5, 0x9b, 0x88, 0xcd, 0x98, 0x66, 0xa5, 0xdd, 0x70, 0xa3, 0x6a, 0xe4, 0x07, - 0xce, 0x01, 0x2d, 0x95, 0x91, 0xdf, 0x2b, 0x27, 0xc7, 0xe5, 0x2b, 0x54, 0x94, 0xd7, 0x1c, 0x86, - 0x50, 0x0b, 0x39, 0x86, 0x7e, 0xc9, 0x9d, 0xc5, 0x81, 0x49, 0xbf, 0xda, 0x6e, 0x31, 0x6d, 0x1b, - 0xa5, 0x7f, 0xc5, 0x90, 0xbe, 0x56, 0xc2, 0xa5, 0x1f, 0x72, 0x40, 0x4a, 0xfa, 0x1a, 0x22, 0xb1, - 0x81, 0xdc, 0xf7, 0x5d, 0xaf, 0x52, 0x8f, 0xdc, 0x27, 0x54, 0x9c, 0x98, 0xc3, 0xd2, 0x55, 0x6c, - 0x29, 0x1a, 0xee, 0x7f, 0xd9, 0x77, 0xbd, 0x9a, 0x83, 0xc5, 0xb5, 0x50, 0x94, 0xeb, 0xdf, 0x48, - 0x9a, 0x9a, 0xfc, 0x00, 0xce, 0x6f, 0xf8, 0xfb, 0x6e, 0x93, 0xf2, 0x25, 0x87, 0x8b, 0x05, 0x8d, - 0x90, 0x16, 0xf2, 0x45, 0xc3, 0xfd, 0x11, 0x62, 0xd4, 0xc4, 0x6a, 0x75, 0xa4, 0x70, 0x74, 0xc3, - 0x7d, 0x36, 0x17, 0xb2, 0x02, 0x63, 0xf8, 0x5d, 0x36, 0xf1, 0x67, 0x58, 0xba, 0x86, 0x47, 0xba, - 0xab, 0x09, 0x2d, 0xed, 0xe6, 0x8a, 0x86, 0xb3, 0xe2, 0x45, 0xc1, 0x33, 0xdb, 0x20, 0x23, 0x1f, - 0xc3, 0x5c, 0x72, 0x7a, 0x2f, 0xf9, 0xde, 0x23, 0xf7, 0xa0, 0x1d, 0xd0, 0x46, 0xe9, 0x15, 0xd6, - 0x54, 0xbb, 0x03, 0xc6, 0xdc, 0x43, 0x38, 0x97, 0xaa, 0x82, 0x14, 0xa1, 0xef, 0xb1, 0xb8, 0x07, - 0x1d, 0xb1, 0xd9, 0x9f, 0xe4, 0x4d, 0x18, 0x78, 0xc2, 0xce, 0x52, 0xa8, 0x31, 0xc4, 0x37, 0x6b, - 0x1a, 0xe9, 0x9a, 0xf7, 0xc8, 0xb7, 0x39, 0xd2, 0x07, 0xbd, 0xef, 0x15, 0xee, 0xf7, 0x0f, 0x8f, - 0x16, 0xc7, 0xf8, 0xf5, 0xf5, 0xfd, 0xfe, 0xe1, 0xf1, 0xe2, 0x84, 0x55, 0x81, 0xc9, 0x04, 0x3e, - 0x29, 0xc1, 0x10, 0xf5, 0x98, 0x7e, 0xde, 0xe0, 0x3a, 0x8b, 0x2d, 0x7f, 0x92, 0x69, 0x18, 0x68, - 0xba, 0x47, 0x6e, 0x84, 0x15, 0x0e, 0xd8, 0xfc, 0x87, 0xf5, 0x7b, 0x05, 0x20, 0xe9, 0x2d, 0x83, - 0xdc, 0x4a, 0xb0, 0xe1, 0xda, 0xa9, 0x00, 0xe9, 0x06, 0x7a, 0xc9, 0xfd, 0x33, 0x98, 0xe2, 0x63, - 0x26, 0x37, 0x37, 0xad, 0x2e, 0xbe, 0xa8, 0x66, 0x14, 0xeb, 0x46, 0x1d, 0x51, 0x8c, 0x5b, 0xe1, - 0x3a, 0x36, 0xad, 0x0d, 0x33, 0x99, 0x9b, 0x05, 0xd9, 0x80, 0x99, 0x23, 0xdf, 0x8b, 0x0e, 0x9b, - 0xcf, 0xe4, 0x5e, 0x21, 0x6a, 0x2b, 0x60, 0x6d, 0xb8, 0x3e, 0x66, 0x22, 0xd8, 0x53, 0x02, 0x2c, - 0x38, 0x62, 0x3d, 0xc2, 0x2e, 0x24, 0x7b, 0x62, 0xd9, 0x70, 0x2e, 0xb5, 0xe6, 0x92, 0xef, 0xc3, - 0x58, 0x1d, 0xcf, 0x5f, 0x46, 0x4d, 0x7c, 0xc7, 0xd1, 0xe0, 0xfa, 0xe7, 0xc4, 0xe1, 0xbc, 0x2b, - 0xff, 0xb4, 0x00, 0xb3, 0x39, 0xab, 0xed, 0xd9, 0x45, 0xfd, 0x05, 0x9c, 0x3f, 0x72, 0xbe, 0xa9, - 0x05, 0x78, 0xbc, 0xae, 0x05, 0x8e, 0x97, 0x90, 0x36, 0xae, 0x24, 0xd9, 0x18, 0xba, 0x0f, 0xd1, - 0x91, 0xf3, 0x8d, 0x8d, 0x08, 0x36, 0x2b, 0xe7, 0xed, 0xfc, 0x14, 0xc6, 0x8d, 0xf5, 0xf5, 0xcc, - 0x8d, 0xb3, 0xee, 0xc0, 0xb9, 0x65, 0xda, 0xa4, 0x11, 0x3d, 0xb5, 0x59, 0xcd, 0xda, 0x06, 0xa8, - 0xd2, 0x23, 0xa7, 0x75, 0xe8, 0x33, 0xbd, 0x7b, 0x51, 0xff, 0x25, 0xcc, 0x32, 0x44, 0x9e, 0x20, - 0x64, 0xc1, 0xde, 0x5b, 0x5c, 0x17, 0x0f, 0x15, 0xa6, 0xad, 0x51, 0x59, 0x7f, 0xdc, 0x0b, 0x44, - 0x2c, 0x90, 0x01, 0x75, 0x8e, 0x64, 0x33, 0xde, 0x87, 0x31, 0x7e, 0x88, 0xe6, 0x60, 0x6c, 0xce, - 0xe8, 0xc2, 0x94, 0xf8, 0xf2, 0xf4, 0xa2, 0xd5, 0x1e, 0xdb, 0x40, 0x65, 0xa4, 0x36, 0xe5, 0xa7, - 0x7f, 0x24, 0xed, 0x35, 0x48, 0xf5, 0x22, 0x46, 0xaa, 0xff, 0x26, 0x9f, 0xc0, 0xc4, 0x92, 0x7f, - 0xd4, 0x62, 0x32, 0x11, 0xc4, 0x7d, 0xc2, 0xb2, 0x22, 0xea, 0x35, 0x0a, 0x57, 0x7b, 0xec, 0x04, - 0x3a, 0xd9, 0x84, 0xa9, 0xbb, 0xcd, 0x76, 0x78, 0x58, 0xf1, 0x1a, 0x4b, 0x4d, 0x3f, 0x94, 0x5c, - 0xfa, 0xc5, 0x61, 0x48, 0x2c, 0x6f, 0x69, 0x8c, 0xd5, 0x1e, 0x3b, 0x8b, 0x90, 0xbc, 0x0a, 0x03, - 0x2b, 0x4f, 0xd8, 0xb2, 0x2b, 0x3d, 0x49, 0x84, 0xa3, 0xdb, 0x96, 0x47, 0xb7, 0x1e, 0xad, 0xf6, - 0xd8, 0xbc, 0x74, 0x71, 0x04, 0x86, 0xe4, 0x01, 0xfc, 0x16, 0x53, 0x89, 0x95, 0x38, 0xab, 0x91, - 0x13, 0xb5, 0x43, 0x32, 0x07, 0xc3, 0xbb, 0x2d, 0x76, 0x2e, 0x94, 0x96, 0x0b, 0x5b, 0xfd, 0xb6, - 0xde, 0x34, 0x25, 0x4d, 0xe6, 0x21, 0x36, 0xbb, 0x0a, 0x64, 0xcd, 0x0e, 0xbb, 0x6a, 0x0a, 0xb7, - 0x33, 0xb6, 0x51, 0x6f, 0x6f, 0xa2, 0xde, 0x62, 0x52, 0xd6, 0xd6, 0x4c, 0xa6, 0xf0, 0xac, 0xcf, - 0xe1, 0xf2, 0x6e, 0x2b, 0xa4, 0x41, 0x54, 0x69, 0xb5, 0x9a, 0x6e, 0x9d, 0xdf, 0x44, 0xe1, 0x41, - 0x5d, 0x4e, 0x96, 0x77, 0x61, 0x90, 0x03, 0xc4, 0x34, 0x91, 0x73, 0xb0, 0xd2, 0x6a, 0x09, 0xf3, - 0xc0, 0x5b, 0x5c, 0x39, 0xe7, 0x07, 0x7e, 0x5b, 0x60, 0x5b, 0xbf, 0x55, 0x80, 0xcb, 0xfc, 0x0b, - 0xc8, 0x65, 0xfd, 0x1d, 0x18, 0x41, 0x3f, 0xb3, 0x96, 0x53, 0x97, 0xdf, 0x04, 0x77, 0xb8, 0x93, - 0x40, 0x3b, 0x2e, 0xd7, 0x3c, 0xf8, 0x7a, 0xf3, 0x3d, 0xf8, 0xe4, 0x07, 0xd6, 0x97, 0xf9, 0x81, - 0x7d, 0x06, 0x96, 0x68, 0x51, 0xb3, 0x99, 0x6a, 0x54, 0xf8, 0x3c, 0xad, 0xb2, 0xfe, 0x67, 0x2f, - 0xcc, 0xde, 0xa3, 0x1e, 0x0d, 0x1c, 0xec, 0xa7, 0x61, 0x88, 0xd2, 0x3d, 0x79, 0x0a, 0x1d, 0x3d, - 0x79, 0xca, 0xd2, 0xb4, 0xd7, 0x8b, 0xa6, 0xbd, 0x94, 0x5b, 0x12, 0x3b, 0x2e, 0xee, 0xda, 0x6b, - 0xa2, 0x5b, 0x78, 0x5c, 0x6c, 0x07, 0x2e, 0x5a, 0xf3, 0xc9, 0x5a, 0xec, 0x05, 0xd4, 0xdf, 0xd5, - 0x2c, 0x30, 0x25, 0xbc, 0x22, 0x86, 0x84, 0x17, 0x90, 0xe9, 0xfb, 0xb3, 0x09, 0x83, 0xdc, 0x22, - 0x89, 0x77, 0x48, 0xa3, 0x0b, 0x37, 0xc4, 0x37, 0x95, 0xd3, 0x41, 0x61, 0xbe, 0xc4, 0x8d, 0x9d, - 0x4f, 0x81, 0x08, 0x01, 0xb6, 0xe0, 0x32, 0xf7, 0x19, 0x8c, 0x6a, 0x28, 0xa7, 0xd9, 0xfb, 0x95, - 0x65, 0x94, 0x69, 0x8c, 0xde, 0x01, 0x37, 0xb2, 0x6a, 0x7b, 0xbf, 0xf5, 0x21, 0x94, 0xd2, 0xad, - 0x11, 0xd6, 0xb0, 0x6e, 0xc6, 0x37, 0x6b, 0x19, 0xa6, 0xef, 0xd1, 0x08, 0x27, 0x2e, 0x7e, 0x44, - 0x9a, 0x37, 0x5b, 0xe2, 0x3b, 0x93, 0xab, 0x2a, 0x02, 0xd9, 0x04, 0xd3, 0xbe, 0xd2, 0x2a, 0xcc, - 0x24, 0xb8, 0x88, 0xfa, 0x3f, 0x80, 0x21, 0x01, 0x52, 0x2b, 0xaa, 0x70, 0x89, 0xa5, 0xfb, 0xa2, - 0x60, 0x6f, 0x81, 0xcf, 0x5b, 0xc1, 0xd9, 0x96, 0x04, 0xd6, 0x21, 0x9c, 0x67, 0xdb, 0x6c, 0xcc, - 0x55, 0x4d, 0xc7, 0x8b, 0x30, 0xd2, 0x62, 0x8a, 0x42, 0xe8, 0xfe, 0x98, 0x4f, 0xa3, 0x01, 0x7b, - 0x98, 0x01, 0xaa, 0xee, 0x8f, 0x29, 0xb9, 0x04, 0x80, 0x85, 0xd8, 0x4d, 0xb1, 0x0a, 0x20, 0x3a, - 0xb7, 0x36, 0x12, 0x40, 0x5f, 0x38, 0x3e, 0x6f, 0x6c, 0xfc, 0xdb, 0x0a, 0x60, 0x36, 0x55, 0x93, - 0xe8, 0xc0, 0x2d, 0x18, 0x96, 0x2a, 0x6c, 0xe2, 0x1e, 0x40, 0xef, 0x81, 0xad, 0x90, 0xc8, 0x6b, - 0x30, 0xe9, 0xd1, 0x6f, 0xa2, 0x5a, 0xaa, 0x0d, 0xe3, 0x0c, 0xbc, 0x2d, 0xdb, 0x61, 0xfd, 0x12, - 0xda, 0x7e, 0xab, 0x9e, 0xff, 0xf4, 0x51, 0xd3, 0x79, 0x4c, 0x53, 0x15, 0x7f, 0x1f, 0x86, 0xab, - 0xdd, 0x2b, 0xe6, 0x9f, 0x8f, 0xac, 0xdc, 0x56, 0x24, 0x56, 0x13, 0xe6, 0x58, 0x97, 0xaa, 0x95, - 0x8d, 0xf5, 0xb5, 0xc6, 0xf6, 0xb7, 0x2d, 0xc0, 0x27, 0x70, 0x31, 0xb3, 0xb6, 0x6f, 0x5b, 0x88, - 0xff, 0xb6, 0x1f, 0x66, 0xf9, 0x66, 0x92, 0x9e, 0xc1, 0xa7, 0x5f, 0x6a, 0x7e, 0x21, 0xf7, 0xaa, - 0xb7, 0x33, 0xee, 0x55, 0x91, 0x44, 0xbf, 0x57, 0x35, 0x6e, 0x53, 0xdf, 0xcb, 0xbe, 0x4d, 0x45, - 0x3b, 0x91, 0x79, 0x9b, 0x9a, 0xbc, 0x43, 0x5d, 0xc9, 0xbf, 0x43, 0xc5, 0xbb, 0xa1, 0x8c, 0x3b, - 0xd4, 0xac, 0x9b, 0xd3, 0x84, 0x43, 0xd2, 0xf0, 0xcb, 0x75, 0x48, 0x7a, 0x0d, 0x86, 0x2a, 0xad, - 0x96, 0xe6, 0xe0, 0x87, 0xc3, 0xe3, 0xb4, 0x5a, 0x5c, 0x78, 0xb2, 0x50, 0xae, 0xf3, 0x90, 0xb1, - 0xce, 0xbf, 0x0f, 0xb0, 0x84, 0xcf, 0x10, 0x70, 0xe0, 0x46, 0x11, 0x03, 0x35, 0x7c, 0xfe, 0x38, - 0x01, 0x07, 0x4e, 0xb7, 0x80, 0xc4, 0xc8, 0x5c, 0xb1, 0xb7, 0xf6, 0xa0, 0x94, 0x9e, 0x3e, 0x2f, - 0x61, 0xe9, 0xfa, 0xc3, 0x02, 0x5c, 0x12, 0x4a, 0x4e, 0xe2, 0x03, 0x3f, 0xfb, 0xec, 0x7c, 0x07, - 0xc6, 0x04, 0xed, 0x4e, 0xfc, 0x21, 0xf0, 0x8b, 0x6c, 0xb9, 0x18, 0xf3, 0x15, 0xdd, 0x40, 0x23, - 0xef, 0xc0, 0x30, 0xfe, 0x11, 0xdf, 0xdd, 0x30, 0xc9, 0x8c, 0x20, 0x6a, 0x2d, 0x79, 0x83, 0xa3, - 0x50, 0xad, 0xaf, 0xe1, 0x72, 0x5e, 0xc3, 0x5f, 0x82, 0x5c, 0xfe, 0x5d, 0x01, 0x2e, 0x0a, 0xf6, - 0xc6, 0x52, 0xf1, 0x5c, 0xbb, 0xce, 0x19, 0xdc, 0x82, 0xef, 0xc3, 0x28, 0xab, 0x50, 0xb6, 0xbb, - 0x4f, 0x6c, 0xad, 0xe2, 0xe4, 0x10, 0x97, 0x2c, 0x3b, 0x91, 0x23, 0xdc, 0x5c, 0x9c, 0xa3, 0xa6, - 0x34, 0x5e, 0xd8, 0x3a, 0xb1, 0xf5, 0x25, 0xcc, 0x67, 0x77, 0xe1, 0x25, 0xc8, 0xe7, 0x3e, 0xcc, - 0x65, 0x6c, 0x0a, 0xcf, 0xb7, 0x27, 0x7f, 0x01, 0x17, 0x33, 0x79, 0xbd, 0x84, 0x66, 0xae, 0x32, - 0x8d, 0x23, 0x7a, 0x09, 0x43, 0x68, 0x3d, 0x84, 0x0b, 0x19, 0x9c, 0x5e, 0x42, 0x13, 0xef, 0xc1, - 0xac, 0xd2, 0xb4, 0x5f, 0xa8, 0x85, 0x1b, 0x70, 0x89, 0x33, 0x7a, 0x39, 0xa3, 0xf2, 0x00, 0x2e, - 0x0a, 0x76, 0x2f, 0x41, 0x7a, 0xab, 0x30, 0x1f, 0x1f, 0xa8, 0x33, 0xf4, 0xa4, 0x53, 0x2f, 0x32, - 0xd6, 0x3a, 0x5c, 0x89, 0x39, 0xe5, 0x28, 0x0d, 0xa7, 0xe7, 0xc6, 0xd5, 0xc1, 0x78, 0x94, 0x5e, - 0xca, 0x88, 0x3e, 0x84, 0xf3, 0x06, 0xd3, 0x97, 0xa6, 0x2a, 0xad, 0xc1, 0x14, 0x67, 0x6c, 0xaa, - 0xce, 0x0b, 0xba, 0xea, 0x3c, 0xba, 0x70, 0x2e, 0x66, 0x89, 0xe0, 0xbd, 0xb7, 0x32, 0xb4, 0xe9, - 0x0d, 0xd4, 0xa6, 0x25, 0x4a, 0xdc, 0xc2, 0x77, 0x60, 0x90, 0x43, 0x44, 0xfb, 0x32, 0x98, 0xf1, - 0xc3, 0x02, 0x27, 0x13, 0xc8, 0xd6, 0x0f, 0xe0, 0x12, 0x3f, 0x89, 0xc6, 0x77, 0x89, 0xe6, 0x69, - 0xf1, 0xfb, 0x89, 0x83, 0xe8, 0x05, 0xc1, 0x37, 0x89, 0x9f, 0x73, 0x1e, 0xdd, 0x97, 0x73, 0x3b, - 0x8f, 0xff, 0xa9, 0x9e, 0x88, 0xc9, 0x03, 0x66, 0x6f, 0xe6, 0x01, 0xf3, 0x1a, 0x5c, 0x55, 0x07, - 0xcc, 0x64, 0x35, 0x72, 0x6a, 0x59, 0x5f, 0xc2, 0x45, 0xde, 0x51, 0xe9, 0xba, 0x67, 0x36, 0xe3, - 0xc3, 0x44, 0x37, 0x67, 0x45, 0x37, 0x4d, 0xec, 0x9c, 0x4e, 0xfe, 0xdd, 0x82, 0xfc, 0xe4, 0xb2, - 0x99, 0xff, 0xa2, 0x4f, 0xdc, 0x9b, 0x50, 0x56, 0x02, 0x31, 0x5b, 0xf4, 0x7c, 0xc7, 0xed, 0x0d, - 0x98, 0xd1, 0xd9, 0xb8, 0x75, 0xba, 0x77, 0x07, 0x2f, 0x79, 0xde, 0x66, 0x9f, 0x05, 0x02, 0xe4, - 0xb4, 0x2b, 0x65, 0xc8, 0x0d, 0xf1, 0x6d, 0x85, 0x69, 0xd5, 0x60, 0x3e, 0x3d, 0x14, 0x6e, 0x5d, - 0xfa, 0xed, 0x93, 0x4f, 0xd8, 0x27, 0x8c, 0x10, 0x31, 0x18, 0xb9, 0x4c, 0xe5, 0x77, 0xcc, 0xc9, - 0x25, 0x95, 0x65, 0xc9, 0xa5, 0x26, 0xd1, 0x7f, 0x56, 0xbb, 0x9c, 0x0f, 0xbf, 0x0a, 0x44, 0x16, - 0x2d, 0x55, 0x6d, 0x59, 0xf5, 0x05, 0xe8, 0x5b, 0xaa, 0xda, 0xe2, 0xc1, 0x10, 0x6a, 0x82, 0xf5, - 0x30, 0xb0, 0x19, 0x2c, 0xa9, 0x91, 0xf7, 0x9e, 0x42, 0x23, 0xbf, 0xdf, 0x3f, 0xdc, 0x57, 0xec, - 0xb7, 0x49, 0xd5, 0x3d, 0xf0, 0x1e, 0xba, 0xd1, 0xa1, 0xaa, 0xb0, 0x62, 0x7d, 0x05, 0x53, 0x46, - 0xf5, 0xe2, 0x2b, 0xee, 0xf8, 0xd2, 0x89, 0xe9, 0xb3, 0x4b, 0x15, 0xf4, 0x7c, 0x41, 0x93, 0xc5, - 0x18, 0x5f, 0x6f, 0xea, 0x4e, 0x0d, 0x9f, 0xd1, 0xda, 0xb2, 0xd0, 0xfa, 0x27, 0xfd, 0x1a, 0x77, - 0xed, 0xfd, 0x58, 0x87, 0xde, 0xdd, 0x01, 0xe0, 0x33, 0x44, 0xeb, 0x1c, 0x53, 0x00, 0x47, 0x85, - 0x43, 0x09, 0x5f, 0x92, 0x6d, 0x0d, 0xe9, 0xb4, 0xef, 0xcb, 0x84, 0x9f, 0x2f, 0x27, 0x92, 0x4f, - 0x2a, 0x95, 0x9f, 0xaf, 0x60, 0x1d, 0xda, 0x3a, 0x12, 0xf9, 0x41, 0xf2, 0x11, 0xc4, 0x00, 0xde, - 0x29, 0xbd, 0x22, 0x2f, 0x99, 0xd3, 0x7d, 0x3b, 0xdb, 0x3b, 0x88, 0xa7, 0x30, 0xc3, 0x68, 0xdd, - 0x47, 0x78, 0xb0, 0x58, 0xf9, 0x26, 0xa2, 0x1e, 0x5f, 0xdb, 0x07, 0xb1, 0x9e, 0x57, 0x3b, 0xd4, - 0x13, 0x23, 0x0b, 0xfb, 0x7b, 0xcc, 0xa7, 0x46, 0x55, 0x99, 0x9d, 0xcd, 0x1f, 0x27, 0x91, 0xbd, - 0xbe, 0xe2, 0x35, 0x5a, 0xbe, 0xab, 0x0e, 0x4c, 0x7c, 0x12, 0x05, 0xcd, 0x1a, 0x15, 0x70, 0x5b, - 0x47, 0xb2, 0x5e, 0xeb, 0xe8, 0x3d, 0x3e, 0x0c, 0xfd, 0x3b, 0x4b, 0x3b, 0xeb, 0xc5, 0x82, 0x75, - 0x0b, 0x40, 0xab, 0x09, 0x60, 0x70, 0x73, 0xcb, 0xde, 0xa8, 0xac, 0x17, 0x7b, 0xc8, 0x0c, 0x9c, - 0x7b, 0xb8, 0xb6, 0xb9, 0xbc, 0xf5, 0xb0, 0x5a, 0xab, 0x6e, 0x54, 0xec, 0x9d, 0xa5, 0x8a, 0xbd, - 0x5c, 0x2c, 0x58, 0x5f, 0xc3, 0xb4, 0xd9, 0xc3, 0x97, 0x3a, 0x09, 0x23, 0x98, 0x52, 0xfa, 0xcc, - 0xfd, 0x87, 0x3b, 0x9a, 0xd3, 0xa9, 0x38, 0xfc, 0x25, 0x9d, 0xa7, 0xc4, 0x31, 0x51, 0x7c, 0x46, - 0x1a, 0x12, 0x79, 0x83, 0xab, 0x05, 0xc9, 0x17, 0xc2, 0x4c, 0x2d, 0xa8, 0xc5, 0x7a, 0x01, 0x2e, - 0x7d, 0xdf, 0x83, 0x69, 0xb3, 0xd6, 0xd3, 0x5a, 0xa9, 0x5e, 0x41, 0x6f, 0x5c, 0xed, 0xf9, 0x10, - 0x21, 0xfa, 0xb5, 0x81, 0x58, 0x59, 0xbf, 0x07, 0x45, 0x81, 0x15, 0xef, 0xbc, 0xd7, 0xa4, 0x19, - 0xb1, 0x90, 0xf1, 0xd8, 0x51, 0x3a, 0x7f, 0xfb, 0x50, 0x64, 0x2b, 0xa6, 0xa0, 0xe4, 0x15, 0x4c, - 0xc3, 0xc0, 0x7a, 0x7c, 0x9d, 0x63, 0xf3, 0x1f, 0xf8, 0x8a, 0x26, 0x72, 0x82, 0x48, 0xba, 0xaa, - 0x8d, 0xd8, 0xea, 0x37, 0x79, 0x03, 0x06, 0xef, 0xba, 0xcd, 0x48, 0x98, 0x46, 0xe2, 0x4d, 0x9e, - 0xb1, 0xe5, 0x05, 0xb6, 0x40, 0xb0, 0x6c, 0x38, 0xa7, 0x55, 0x78, 0x86, 0xa6, 0x92, 0x12, 0x0c, - 0x6d, 0xd2, 0x6f, 0xb4, 0xfa, 0xe5, 0x4f, 0xeb, 0x5d, 0x38, 0x27, 0xdc, 0x00, 0x35, 0x31, 0x5d, - 0x15, 0x6f, 0xb2, 0x0b, 0xc6, 0xc3, 0x50, 0xc1, 0x12, 0x8b, 0x18, 0xdd, 0x6e, 0xab, 0xf1, 0x9c, - 0x74, 0x6c, 0xa3, 0x38, 0x23, 0xdd, 0xeb, 0xf2, 0x16, 0xa8, 0xdb, 0x70, 0xfe, 0x71, 0x01, 0x4a, - 0x09, 0x2b, 0xc3, 0xd2, 0xa1, 0xd3, 0x6c, 0x52, 0xef, 0x80, 0x92, 0xeb, 0xd0, 0xbf, 0xb3, 0xb5, - 0xb3, 0x2d, 0xac, 0xa4, 0xd2, 0x01, 0x80, 0x81, 0x14, 0x8e, 0x8d, 0x18, 0xe4, 0x01, 0x9c, 0x93, - 0x8e, 0xbe, 0xaa, 0x48, 0x8c, 0xd0, 0xa5, 0xce, 0x6e, 0xc3, 0x69, 0x3a, 0xf2, 0xb6, 0x30, 0x89, - 0xfc, 0xa8, 0xed, 0x06, 0xb4, 0x81, 0x96, 0x9f, 0xf8, 0x36, 0x5d, 0x2b, 0xb1, 0x75, 0x34, 0xfe, - 0x82, 0xd6, 0xfa, 0x9d, 0x02, 0xcc, 0xe6, 0x58, 0x4d, 0xc8, 0x1b, 0x46, 0x77, 0xa6, 0xb4, 0xee, - 0x48, 0x94, 0xd5, 0x1e, 0xd1, 0x9f, 0x25, 0xcd, 0xfb, 0xb9, 0xef, 0x0c, 0xde, 0xcf, 0xab, 0x3d, - 0xb1, 0xc7, 0xf3, 0x22, 0xc0, 0xb0, 0x84, 0x5b, 0x93, 0x30, 0x6e, 0xc8, 0xcd, 0xb2, 0x60, 0x4c, - 0xaf, 0x99, 0x0d, 0xce, 0x92, 0xdf, 0x50, 0x83, 0xc3, 0xfe, 0xb6, 0x7e, 0xbb, 0x00, 0xd3, 0xd8, - 0xc5, 0x03, 0x97, 0x2d, 0x7d, 0xb1, 0x84, 0x16, 0x8c, 0x9e, 0xcc, 0x1b, 0x3d, 0x49, 0xe0, 0xaa, - 0x2e, 0x7d, 0x90, 0xea, 0xd2, 0x7c, 0x56, 0x97, 0x70, 0x7a, 0xbb, 0xbe, 0x67, 0xf4, 0x44, 0xbb, - 0x8a, 0xfa, 0xbd, 0x02, 0x4c, 0x69, 0x6d, 0x52, 0xed, 0xbf, 0x63, 0x34, 0xe9, 0x62, 0x46, 0x93, - 0x52, 0x42, 0x5e, 0x4c, 0xb5, 0xe8, 0x95, 0x4e, 0x2d, 0xea, 0x2a, 0xe3, 0xbf, 0x28, 0xc0, 0x4c, - 0xa6, 0x0c, 0xc8, 0x79, 0xa6, 0xdb, 0xd6, 0x03, 0x1a, 0x09, 0xf1, 0x8a, 0x5f, 0x0c, 0xbe, 0x16, - 0x86, 0x6d, 0x1a, 0x88, 0xef, 0x5c, 0xfc, 0x22, 0xaf, 0xc0, 0xf8, 0x36, 0x0d, 0x5c, 0xbf, 0xc1, - 0xfd, 0xe2, 0xb9, 0xc3, 0xe9, 0xb8, 0x6d, 0x02, 0xc9, 0x3c, 0x8c, 0x28, 0x87, 0x49, 0x6e, 0x9f, - 0xb4, 0x63, 0x00, 0xe3, 0xbd, 0xec, 0x1e, 0xf0, 0x4b, 0x0d, 0x46, 0x2c, 0x7e, 0xb1, 0xc5, 0x45, - 0x5a, 0x0b, 0x07, 0xf9, 0xe2, 0x22, 0x4d, 0x81, 0xe7, 0x61, 0xf0, 0x33, 0x1b, 0x27, 0x01, 0xc6, - 0x2d, 0xb0, 0xc5, 0x2f, 0x32, 0x81, 0x9e, 0xcd, 0xf8, 0xb6, 0x02, 0x3d, 0x9a, 0x3f, 0x80, 0xe9, - 0x2c, 0xb9, 0x66, 0x4d, 0x21, 0x41, 0xdb, 0xab, 0x68, 0xbf, 0x84, 0xa9, 0x4a, 0xa3, 0xb1, 0x71, - 0xb7, 0xc2, 0x7d, 0x0e, 0xc4, 0xa8, 0xf2, 0x8f, 0x87, 0xdb, 0xeb, 0x84, 0xca, 0xd6, 0xbf, 0xe6, - 0xb9, 0x91, 0x3d, 0xb5, 0xf2, 0x8d, 0x1b, 0x46, 0xae, 0x77, 0xa0, 0x19, 0x15, 0xed, 0xf3, 0x9b, - 0xf4, 0x69, 0xc6, 0x14, 0x60, 0xbb, 0xa9, 0xc9, 0x9b, 0xc3, 0x33, 0x98, 0x4f, 0x6b, 0x6c, 0xe3, - 0xa5, 0x64, 0xd6, 0xe4, 0x1b, 0x17, 0xf4, 0x55, 0xea, 0x8f, 0xad, 0xef, 0xc1, 0x79, 0xbe, 0xa4, - 0x75, 0x6a, 0xbc, 0x68, 0xb6, 0x6e, 0x03, 0xb5, 0xde, 0x93, 0x56, 0x8a, 0x8e, 0x2d, 0xb3, 0xc7, - 0x8c, 0xb6, 0x60, 0x95, 0xff, 0xa3, 0x00, 0x73, 0x09, 0xd2, 0xea, 0x33, 0xaf, 0x2e, 0xd7, 0xd3, - 0xd7, 0x92, 0x9e, 0xe3, 0xa8, 0x07, 0x70, 0xe3, 0x9f, 0xdb, 0x50, 0xce, 0xe3, 0xe4, 0x16, 0x00, - 0x27, 0xd6, 0xb6, 0x6f, 0x34, 0x7d, 0x0b, 0x27, 0x1b, 0xdc, 0xc0, 0x35, 0x14, 0xd2, 0x86, 0x2c, - 0xb9, 0x8b, 0x6f, 0xa4, 0x9b, 0x6d, 0x18, 0x63, 0x75, 0x50, 0x41, 0x5e, 0xcb, 0x31, 0x12, 0x67, - 0xf1, 0xb7, 0xfe, 0x5e, 0x1f, 0xcc, 0xea, 0x03, 0xf8, 0x3c, 0x7d, 0xdd, 0x86, 0xd1, 0x25, 0xdf, - 0x8b, 0xe8, 0x37, 0x91, 0x16, 0x2b, 0x81, 0xa8, 0x9b, 0x76, 0x55, 0x22, 0x54, 0x47, 0x0e, 0xa8, - 0x31, 0x3d, 0xc6, 0x70, 0x16, 0x8c, 0x11, 0xc9, 0x12, 0x8c, 0x6f, 0xd2, 0xa7, 0x29, 0x01, 0xa2, - 0xc3, 0xa2, 0x47, 0x9f, 0xd6, 0x34, 0x21, 0xea, 0x5e, 0x64, 0x06, 0x0d, 0xd9, 0x87, 0x09, 0x39, - 0xb9, 0x0c, 0x61, 0xce, 0xe9, 0xbb, 0x8a, 0x39, 0x9d, 0x79, 0x2c, 0x01, 0x56, 0x43, 0x8e, 0x0c, - 0x13, 0x1c, 0x59, 0xd7, 0x79, 0x8d, 0xfc, 0x79, 0xbc, 0xb9, 0x6d, 0x69, 0x25, 0x86, 0x3b, 0x68, - 0xf2, 0x59, 0xbc, 0xce, 0xc2, 0xda, 0x86, 0x52, 0x7a, 0x3c, 0x44, 0x6d, 0x6f, 0xc3, 0x20, 0x87, - 0x0a, 0x35, 0x40, 0x86, 0xc1, 0x51, 0xd8, 0xfc, 0x9c, 0xce, 0xab, 0xb1, 0x05, 0xae, 0xb5, 0x8a, - 0xb6, 0x13, 0x85, 0xa3, 0x14, 0xb1, 0xdb, 0xc9, 0xe1, 0x45, 0x4f, 0x5b, 0x39, 0xbc, 0xba, 0x9f, - 0x89, 0x7c, 0x11, 0xb1, 0x84, 0xe6, 0x27, 0x9d, 0x93, 0x68, 0xd8, 0x0d, 0x18, 0x12, 0xa0, 0x44, - 0x80, 0x9e, 0xf8, 0xf3, 0x93, 0x08, 0xd6, 0x07, 0x70, 0x01, 0x6d, 0x61, 0xae, 0x77, 0xd0, 0xa4, - 0xbb, 0xa1, 0xf1, 0xa6, 0xa1, 0xdb, 0x67, 0xfd, 0x11, 0xcc, 0x65, 0xd1, 0x76, 0xfd, 0xb2, 0x79, - 0xc8, 0x8c, 0x3f, 0xeb, 0x85, 0xe9, 0xb5, 0x50, 0x57, 0x26, 0x54, 0xd8, 0x8c, 0x8c, 0x50, 0x0e, - 0x28, 0x93, 0xd5, 0x9e, 0xac, 0x50, 0x0d, 0x6f, 0x6b, 0x4f, 0x26, 0x7b, 0x3b, 0xc5, 0x68, 0x60, - 0xdb, 0x96, 0x7a, 0x34, 0xf9, 0x1a, 0xf4, 0x6f, 0xb2, 0xa5, 0xba, 0x4f, 0x8c, 0x1d, 0xa7, 0x60, - 0x20, 0x7c, 0xb2, 0xc8, 0xb6, 0x48, 0xf6, 0x83, 0xdc, 0x4d, 0x3d, 0x8c, 0xec, 0xef, 0x1e, 0x83, - 0x60, 0xb5, 0x27, 0xf5, 0x46, 0xf2, 0x5d, 0x18, 0xad, 0x34, 0x8e, 0xb8, 0x47, 0xa0, 0xef, 0x25, - 0x3e, 0x4b, 0xad, 0x64, 0xb5, 0xc7, 0xd6, 0x11, 0xd9, 0x09, 0xb7, 0xd2, 0x6a, 0xe1, 0x46, 0x95, - 0x15, 0x97, 0x61, 0xb5, 0x07, 0x1d, 0xec, 0x17, 0x87, 0x61, 0x70, 0xc7, 0x09, 0x0e, 0x68, 0x64, - 0x7d, 0x09, 0x73, 0xc2, 0x49, 0x85, 0x5b, 0xfe, 0xd0, 0x95, 0x25, 0x8c, 0xfd, 0x90, 0x3a, 0x39, - 0x96, 0x5c, 0x06, 0x40, 0x3d, 0x7f, 0xcd, 0x6b, 0xd0, 0x6f, 0x84, 0x97, 0x9c, 0x06, 0xb1, 0xde, - 0x81, 0x11, 0x25, 0x21, 0x54, 0x66, 0xb5, 0xcd, 0x0e, 0xa5, 0x35, 0x6d, 0xbc, 0x04, 0x95, 0xcf, - 0x3f, 0x2f, 0x18, 0x7d, 0x17, 0x91, 0x56, 0xb8, 0xf6, 0xeb, 0xc2, 0x4c, 0x62, 0x12, 0xc4, 0x0f, - 0xf9, 0x95, 0xfe, 0xc9, 0xdd, 0xf8, 0xd4, 0xef, 0xa4, 0x7a, 0xda, 0x7b, 0x2a, 0xf5, 0xd4, 0xfa, - 0xe7, 0xbd, 0x78, 0x70, 0x4a, 0xc9, 0x23, 0x61, 0x83, 0xd2, 0xed, 0x60, 0x8b, 0x30, 0x82, 0xbd, - 0x5f, 0x96, 0xef, 0xd5, 0x3a, 0xfb, 0x58, 0x0c, 0xff, 0xf4, 0xb8, 0xdc, 0x83, 0x8e, 0x15, 0x31, - 0x19, 0xf9, 0x18, 0x86, 0x56, 0xbc, 0x06, 0x72, 0xe8, 0x3b, 0x03, 0x07, 0x49, 0xc4, 0xc6, 0x04, - 0x9b, 0xbc, 0xc3, 0x3e, 0x61, 0x6e, 0xba, 0xb0, 0x35, 0x48, 0x7c, 0x82, 0x1b, 0xc8, 0x3b, 0xc1, - 0x0d, 0x26, 0x4e, 0x70, 0x16, 0x0c, 0x6c, 0x05, 0x0d, 0x11, 0x1f, 0x65, 0x62, 0x61, 0x4c, 0x08, - 0x0e, 0x61, 0x36, 0x2f, 0xb2, 0xfe, 0x57, 0x01, 0x66, 0xef, 0xd1, 0x28, 0x73, 0x0e, 0x19, 0x52, - 0x29, 0xbc, 0xb0, 0x54, 0x7a, 0x9f, 0x47, 0x2a, 0xaa, 0xd7, 0x7d, 0x79, 0xbd, 0xee, 0xcf, 0xeb, - 0xf5, 0x40, 0x7e, 0xaf, 0xef, 0xc1, 0x20, 0xef, 0x2a, 0x3b, 0xa5, 0xae, 0x45, 0xf4, 0x28, 0x3e, - 0xa5, 0xea, 0x1e, 0x62, 0x36, 0x2f, 0x63, 0x8a, 0xe4, 0xba, 0x13, 0xea, 0xa7, 0x54, 0xf1, 0xd3, - 0xfa, 0x21, 0xbe, 0x74, 0x5d, 0xf7, 0xeb, 0x8f, 0x35, 0x6b, 0xe7, 0x10, 0xff, 0x42, 0x93, 0xd6, - 0x71, 0x86, 0xc5, 0x4b, 0x6c, 0x89, 0x41, 0xae, 0xc0, 0xe8, 0x9a, 0x77, 0xd7, 0x0f, 0xea, 0x74, - 0xcb, 0x6b, 0x72, 0xee, 0xc3, 0xb6, 0x0e, 0x12, 0x56, 0x00, 0x51, 0x43, 0x7c, 0xb4, 0x46, 0x40, - 0xe2, 0x68, 0xcd, 0x60, 0x7b, 0x0b, 0x36, 0x2f, 0x13, 0x46, 0x06, 0xf6, 0x77, 0xa7, 0x53, 0xa9, - 0x3a, 0xbe, 0x76, 0x43, 0xdc, 0x87, 0x0b, 0x36, 0x6d, 0x35, 0x1d, 0xa6, 0xd3, 0x1d, 0xf9, 0x1c, - 0x5f, 0xf5, 0xf9, 0x4a, 0xc6, 0x2b, 0x35, 0xd3, 0x5f, 0x40, 0x35, 0xb9, 0xb7, 0x43, 0x93, 0x8f, - 0xe0, 0xea, 0x3d, 0x1a, 0x99, 0x0b, 0x6a, 0x6c, 0x4b, 0x15, 0x9d, 0x5f, 0x85, 0xe1, 0xd0, 0xb4, - 0x03, 0xcb, 0x57, 0x57, 0x99, 0x84, 0x7b, 0x6f, 0xc9, 0x9b, 0x12, 0xc1, 0x47, 0xfd, 0x65, 0x7d, - 0x02, 0xe5, 0xbc, 0xea, 0x4e, 0xe7, 0xce, 0xe9, 0xc2, 0x95, 0x7c, 0x06, 0xa2, 0xb9, 0x2b, 0x20, - 0x6d, 0xc6, 0xe2, 0x13, 0xea, 0xd6, 0x5a, 0xd3, 0xcc, 0x2c, 0xfe, 0xb0, 0x16, 0xa5, 0x63, 0xdb, - 0x0b, 0x34, 0xb7, 0x86, 0xd7, 0xb1, 0x26, 0x83, 0x58, 0xae, 0x15, 0x18, 0x96, 0x30, 0x21, 0xd7, - 0xd9, 0xcc, 0x96, 0x4a, 0x81, 0x36, 0x24, 0x03, 0x45, 0x66, 0xfd, 0x50, 0x5e, 0x4d, 0x98, 0x14, - 0xa7, 0x7b, 0xb6, 0x79, 0x9a, 0xbb, 0x08, 0xcb, 0x87, 0x0b, 0x26, 0x6f, 0xdd, 0xe4, 0x5c, 0xd4, - 0x4c, 0xce, 0xdc, 0xd2, 0x7c, 0xc5, 0x34, 0x81, 0xf6, 0x8a, 0x79, 0x19, 0x83, 0xc8, 0x65, 0xdd, - 0xb0, 0x3c, 0x96, 0x7e, 0x07, 0x7a, 0x1b, 0xe6, 0xb2, 0x2a, 0xd4, 0xce, 0x81, 0xca, 0x7a, 0x29, - 0xf4, 0x9d, 0x65, 0xb8, 0x2c, 0x23, 0x14, 0xf9, 0x7e, 0x14, 0x46, 0x81, 0xd3, 0xaa, 0xd6, 0x03, - 0xb7, 0x15, 0x53, 0x59, 0x30, 0xc8, 0x21, 0x42, 0x12, 0xfc, 0x9a, 0x87, 0xe3, 0x88, 0x12, 0xeb, - 0xd7, 0x0b, 0x60, 0x19, 0x3e, 0x48, 0x38, 0xce, 0xdb, 0x81, 0xff, 0xc4, 0x6d, 0x68, 0x57, 0x2b, - 0x6f, 0x18, 0x66, 0x3d, 0xfe, 0x24, 0x2e, 0xe9, 0xfe, 0x2c, 0xd6, 0xcc, 0xdb, 0x09, 0x53, 0x1b, - 0x57, 0x3c, 0xd1, 0x2f, 0xc9, 0x0c, 0x05, 0xa3, 0x4c, 0x70, 0xff, 0xa7, 0x00, 0xd7, 0x3a, 0xb6, - 0x41, 0xf4, 0x67, 0x1f, 0x8a, 0xc9, 0x32, 0x31, 0x83, 0xca, 0x9a, 0x4f, 0x42, 0x9a, 0xc3, 0xde, - 0x1d, 0xee, 0x63, 0x2d, 0x7d, 0x77, 0x5a, 0x8a, 0x73, 0x8a, 0xdf, 0xd9, 0x5b, 0x4f, 0xde, 0x07, - 0xd8, 0xf1, 0x23, 0xa7, 0xb9, 0x84, 0x06, 0x80, 0xbe, 0xd8, 0x5f, 0x3e, 0x62, 0xd0, 0x5a, 0x32, - 0xd4, 0x82, 0x86, 0x6c, 0x7d, 0x8a, 0xdf, 0x75, 0x76, 0xa3, 0x4f, 0xf7, 0xa9, 0x2d, 0xc1, 0xb5, - 0xc4, 0xbd, 0xf8, 0x73, 0x30, 0x89, 0x60, 0x86, 0x89, 0x9f, 0xe9, 0xde, 0xf7, 0x02, 0xbf, 0xdd, - 0xfa, 0xc5, 0x8c, 0xfa, 0x1f, 0x15, 0xb8, 0xa3, 0xa2, 0x5e, 0xad, 0x18, 0xe8, 0x25, 0x80, 0x18, - 0x9a, 0x70, 0x58, 0x57, 0x05, 0x7b, 0x77, 0xf8, 0x91, 0x1b, 0x2d, 0xe6, 0x07, 0x9c, 0x81, 0x46, - 0xf6, 0x8b, 0x1d, 0xc9, 0xb7, 0xf0, 0x32, 0x5c, 0xd5, 0x7e, 0x3a, 0xb9, 0xbf, 0x2b, 0xed, 0x1f, - 0x67, 0xa4, 0x3b, 0x84, 0x69, 0xb6, 0x02, 0x54, 0xda, 0xd1, 0xa1, 0x1f, 0xb8, 0x91, 0x7c, 0x7a, - 0x41, 0xb6, 0xc5, 0x83, 0x74, 0x4e, 0xf5, 0xd1, 0xcf, 0x8f, 0xcb, 0xef, 0x9d, 0x25, 0x76, 0xa4, - 0xe4, 0xb9, 0xa3, 0x1e, 0xb1, 0x5b, 0xb3, 0xd0, 0xb7, 0x64, 0xaf, 0xe3, 0x82, 0x67, 0xaf, 0xab, - 0x05, 0xcf, 0x5e, 0xb7, 0xfe, 0xb2, 0x17, 0xca, 0x3c, 0x64, 0x06, 0xfa, 0x50, 0xc4, 0x56, 0x0b, - 0xcd, 0x29, 0xe3, 0xb4, 0x06, 0x86, 0x44, 0x48, 0x8c, 0xde, 0xd3, 0x84, 0xc4, 0xf8, 0x15, 0xc8, - 0x31, 0x59, 0x9d, 0xc2, 0x0a, 0xf0, 0xfa, 0xc9, 0x71, 0xf9, 0x5a, 0x6c, 0x05, 0xe0, 0xa5, 0x59, - 0xe6, 0x80, 0x9c, 0x2a, 0xd2, 0xf6, 0x8b, 0xfe, 0xe7, 0xb0, 0x5f, 0xdc, 0x86, 0x21, 0x3c, 0xcc, - 0xac, 0x6d, 0x0b, 0xaf, 0x46, 0x9c, 0x9e, 0x18, 0xe5, 0xa6, 0xe6, 0xea, 0x21, 0xe5, 0x24, 0x9a, - 0xf5, 0xbb, 0xbd, 0x70, 0x25, 0x5f, 0xe6, 0xa2, 0x6d, 0xcb, 0x00, 0xb1, 0xf7, 0x46, 0x27, 0x6f, - 0x11, 0xfc, 0x76, 0x9e, 0xd2, 0x7d, 0xe5, 0xad, 0xa5, 0xd1, 0x31, 0xdd, 0x47, 0x3e, 0xf4, 0x4d, - 0x5c, 0x15, 0x18, 0xef, 0x7f, 0x45, 0x44, 0x54, 0x01, 0x32, 0x22, 0xa2, 0x0a, 0x18, 0xd9, 0x87, - 0xd9, 0xed, 0xc0, 0x7d, 0xe2, 0x44, 0xf4, 0x01, 0x7d, 0xc6, 0x1f, 0xc2, 0xac, 0x88, 0xd7, 0x2f, - 0xfc, 0xf5, 0xf6, 0xf5, 0x93, 0xe3, 0xf2, 0x2b, 0x2d, 0x8e, 0x82, 0x51, 0xaf, 0xf8, 0xd3, 0xc3, - 0x5a, 0xfa, 0x41, 0x4c, 0x1e, 0x23, 0xeb, 0x3f, 0x16, 0xe0, 0x22, 0xaa, 0xe5, 0xc2, 0xec, 0x2a, - 0x2b, 0x7f, 0x2e, 0xa7, 0x41, 0xbd, 0x83, 0x62, 0x2e, 0xa2, 0xd3, 0xa0, 0xf1, 0x10, 0xda, 0x36, - 0xd0, 0xc8, 0x1a, 0x8c, 0x8a, 0xdf, 0xf8, 0xfd, 0xf5, 0xe1, 0x81, 0x60, 0x46, 0x5b, 0xb0, 0x70, - 0xaa, 0x73, 0x53, 0x11, 0x4e, 0x6c, 0xc1, 0x0c, 0xdf, 0x0b, 0xda, 0x3a, 0xad, 0xf5, 0xb3, 0x5e, - 0x98, 0xdf, 0xa3, 0x81, 0xfb, 0xe8, 0x59, 0x4e, 0x67, 0xb6, 0x60, 0x5a, 0x82, 0x78, 0xd8, 0x0c, - 0xe3, 0x13, 0xe3, 0x31, 0x11, 0x65, 0x53, 0x45, 0xdc, 0x0d, 0xf9, 0xc5, 0x65, 0x12, 0x9e, 0xc1, - 0x1d, 0xf0, 0x6d, 0x18, 0x4e, 0x04, 0xae, 0xc1, 0xf1, 0x97, 0x5f, 0x68, 0x3c, 0x54, 0xab, 0x3d, - 0xb6, 0xc2, 0x24, 0xbf, 0x91, 0x7f, 0x7f, 0x23, 0x4c, 0x1f, 0xdd, 0xec, 0x9f, 0xf8, 0xc1, 0xb2, - 0x8f, 0xd5, 0xd1, 0x4a, 0x33, 0x3e, 0xd8, 0xd5, 0x1e, 0x3b, 0xaf, 0xa6, 0xc5, 0x51, 0x18, 0xa9, - 0xe0, 0x9d, 0x14, 0x3b, 0xb9, 0xff, 0xef, 0x5e, 0xb8, 0x2c, 0x1f, 0xb5, 0xe4, 0x88, 0xf9, 0x73, - 0x98, 0x95, 0xa0, 0x4a, 0x8b, 0x29, 0x0c, 0xb4, 0x61, 0x4a, 0x9a, 0xc7, 0x25, 0x95, 0x92, 0x76, - 0x04, 0x4e, 0x2c, 0xec, 0x3c, 0xf2, 0x97, 0x63, 0xfd, 0xfc, 0x38, 0x2b, 0x8c, 0x10, 0x5a, 0x21, - 0xf5, 0x35, 0xd3, 0x10, 0x8d, 0xb1, 0x7e, 0x36, 0x52, 0xd6, 0xd3, 0xfe, 0x17, 0xb5, 0x9e, 0xae, - 0xf6, 0x24, 0xed, 0xa7, 0x8b, 0x13, 0x30, 0xb6, 0x49, 0x9f, 0xc6, 0x72, 0xff, 0xdb, 0x85, 0x44, - 0xa4, 0x01, 0xa6, 0x61, 0xf0, 0x90, 0x03, 0x85, 0x38, 0x12, 0x0d, 0x46, 0x1a, 0xd0, 0x35, 0x0c, - 0x8e, 0xba, 0x06, 0x43, 0xfc, 0xa2, 0xb6, 0x71, 0x8a, 0x13, 0xbe, 0x7a, 0x9d, 0xc2, 0x9f, 0x0c, - 0x36, 0xf8, 0x61, 0x5f, 0xd0, 0x5b, 0x0f, 0xe0, 0xaa, 0xf0, 0x5f, 0x36, 0x07, 0x1f, 0x2b, 0x3a, - 0xe3, 0xf6, 0x65, 0x39, 0x70, 0xf9, 0x1e, 0x4d, 0x2e, 0x3d, 0xc6, 0xeb, 0x9d, 0x4f, 0x60, 0xd2, - 0x80, 0x2b, 0x8e, 0xa8, 0x95, 0xaa, 0x39, 0xa4, 0x58, 0x27, 0xb1, 0xad, 0x2b, 0x59, 0x55, 0xe8, - 0x8d, 0xb5, 0x28, 0x06, 0x18, 0x0d, 0xe2, 0x2b, 0xb6, 0xf0, 0x0c, 0xab, 0xde, 0x75, 0xed, 0xbb, - 0xe6, 0x2b, 0x1e, 0x8f, 0x40, 0x27, 0x77, 0x5e, 0x55, 0x6a, 0x8d, 0x1b, 0x77, 0x01, 0xd6, 0x04, - 0x8c, 0xc9, 0xa2, 0x26, 0x0d, 0x43, 0xeb, 0x27, 0x03, 0x60, 0x09, 0xc1, 0x66, 0xdd, 0x3e, 0x4b, - 0x79, 0xec, 0xa7, 0x1a, 0x2b, 0x36, 0xaa, 0xf3, 0x7a, 0x5c, 0xcb, 0xb8, 0x94, 0xcf, 0x3c, 0xd4, - 0xf3, 0xea, 0x31, 0xd4, 0x98, 0x79, 0xa9, 0xde, 0x7f, 0x95, 0xb3, 0x4c, 0xf2, 0x8f, 0xed, 0xd5, - 0x93, 0xe3, 0xf2, 0xd5, 0x9c, 0x65, 0xd2, 0xe0, 0x9b, 0xbd, 0x64, 0xda, 0xe6, 0x95, 0x48, 0xdf, - 0xf3, 0x5c, 0x89, 0xb0, 0x2f, 0x52, 0xbf, 0x14, 0xd9, 0x35, 0x65, 0x29, 0xbe, 0x47, 0x79, 0xa5, - 0xad, 0x17, 0x89, 0x07, 0xff, 0x1a, 0xc4, 0xe0, 0x6a, 0xb0, 0x21, 0x2e, 0x14, 0x35, 0x9b, 0xe5, - 0xd2, 0x21, 0xad, 0x3f, 0x16, 0xb6, 0x62, 0x79, 0xa1, 0x9b, 0x65, 0x33, 0xe7, 0x31, 0x8e, 0xf9, - 0x77, 0xce, 0x0b, 0x6a, 0x75, 0x46, 0xaa, 0x07, 0x2c, 0x48, 0xb2, 0x25, 0x3f, 0x86, 0x29, 0x35, - 0xd4, 0x09, 0xf7, 0xa3, 0xd1, 0x85, 0x57, 0xe2, 0x70, 0x98, 0x47, 0x8f, 0x9c, 0x9b, 0x4f, 0xee, - 0xdc, 0xcc, 0xc0, 0xe5, 0xef, 0xe0, 0xeb, 0xb2, 0x40, 0xf3, 0x3d, 0xd2, 0x2f, 0xba, 0xb2, 0x08, - 0xb5, 0xeb, 0xec, 0x7f, 0xa0, 0x9c, 0xe5, 0x99, 0xbe, 0xe0, 0x36, 0xa9, 0x78, 0xf5, 0x22, 0x67, - 0x5f, 0xce, 0x55, 0x5c, 0xe1, 0x5b, 0xbe, 0x8a, 0xfb, 0x57, 0xbd, 0xf2, 0x89, 0x40, 0xfa, 0x36, - 0xf4, 0xcc, 0x37, 0x72, 0x99, 0x3d, 0x38, 0xd5, 0x66, 0x9a, 0xd9, 0x38, 0xb2, 0x28, 0xef, 0x33, - 0x55, 0x40, 0xab, 0x09, 0x75, 0x37, 0x10, 0x17, 0x18, 0x57, 0x9c, 0xa8, 0xba, 0x68, 0x54, 0xc9, - 0xcb, 0xb2, 0xbe, 0x17, 0xbf, 0x2c, 0xfb, 0x37, 0x23, 0x70, 0x6e, 0xdb, 0x39, 0x70, 0x3d, 0xb6, - 0x68, 0xdb, 0x34, 0xf4, 0xdb, 0x41, 0x9d, 0x92, 0x0a, 0x4c, 0x98, 0xfe, 0x9f, 0x5d, 0xbc, 0x5b, - 0xd9, 0xbe, 0x64, 0xc2, 0xc8, 0x02, 0x8c, 0xa8, 0x37, 0xa7, 0x62, 0x33, 0xc9, 0x78, 0x8b, 0xba, - 0xda, 0x63, 0xc7, 0x68, 0xe4, 0x7d, 0xe3, 0x7e, 0x67, 0x52, 0x3d, 0x9f, 0x46, 0xdc, 0x05, 0xee, - 0xa0, 0xe7, 0xf9, 0x0d, 0x73, 0x43, 0xe4, 0x97, 0x18, 0x3f, 0x4c, 0x5d, 0xf9, 0x0c, 0x18, 0x2d, - 0x4e, 0xd9, 0xbd, 0x50, 0x17, 0xc8, 0x0d, 0x32, 0x9d, 0x71, 0x19, 0xf4, 0x25, 0x8c, 0x3e, 0x68, - 0xef, 0x53, 0x79, 0xb9, 0x35, 0x28, 0xf6, 0xc7, 0xa4, 0x57, 0xb3, 0x28, 0xdf, 0x7b, 0x8b, 0x8f, - 0xc1, 0xe3, 0xf6, 0x3e, 0x4d, 0x47, 0x2f, 0x67, 0x0b, 0x93, 0xc6, 0x8c, 0x1c, 0x42, 0x31, 0xe9, - 0x80, 0x2c, 0x42, 0xc0, 0x75, 0x70, 0x9b, 0xc6, 0x50, 0x1e, 0x5a, 0x8c, 0x74, 0xee, 0x16, 0x69, - 0x54, 0x92, 0xe2, 0x4a, 0x7e, 0x15, 0x66, 0x32, 0xad, 0x8e, 0xea, 0x09, 0x55, 0x67, 0x83, 0x26, - 0x2e, 0xea, 0x09, 0xa9, 0xc9, 0xf7, 0x5a, 0x46, 0xcd, 0xd9, 0xb5, 0x90, 0x06, 0x4c, 0x26, 0x1c, - 0x6b, 0x45, 0x22, 0x88, 0x7c, 0x57, 0x5d, 0xdc, 0x98, 0x64, 0x2c, 0xd5, 0xcc, 0xba, 0x92, 0x2c, - 0xc9, 0x3a, 0x8c, 0xa8, 0xe3, 0xbe, 0x88, 0xbe, 0x95, 0x65, 0xda, 0x28, 0x9d, 0x1c, 0x97, 0xa7, - 0x63, 0xd3, 0x86, 0xc1, 0x33, 0x66, 0x40, 0x7e, 0x0d, 0xae, 0xaa, 0x29, 0xba, 0x15, 0x64, 0x1b, - 0x81, 0x44, 0x0c, 0xf6, 0x1b, 0xc9, 0x19, 0x9e, 0x87, 0xbf, 0x77, 0x67, 0xb1, 0xb7, 0x54, 0x58, - 0xed, 0xb1, 0xbb, 0xb3, 0x26, 0x3f, 0x29, 0xc0, 0xf9, 0x9c, 0x5a, 0xc7, 0xb0, 0xd6, 0xae, 0x96, - 0x39, 0x54, 0xee, 0xf1, 0xd9, 0x90, 0xdb, 0x88, 0x9f, 0xd7, 0x49, 0x13, 0x9d, 0xd1, 0xef, 0x9c, - 0x9a, 0xc8, 0x9b, 0x30, 0x88, 0x67, 0xe4, 0xb0, 0x34, 0x8e, 0x5a, 0x24, 0x46, 0xb0, 0xc1, 0x93, - 0xb4, 0xbe, 0x6f, 0x08, 0x1c, 0xb2, 0xca, 0xb4, 0x31, 0xdc, 0xb7, 0xa4, 0xf6, 0x24, 0xe2, 0x5d, - 0x09, 0x8d, 0x9e, 0x17, 0xc9, 0x28, 0x17, 0x46, 0xb0, 0x7d, 0x93, 0x6c, 0x11, 0x60, 0x38, 0x10, - 0xab, 0xd2, 0xfd, 0xfe, 0xe1, 0xfe, 0xe2, 0x00, 0xff, 0x70, 0xa4, 0xc7, 0xf6, 0x6f, 0x0e, 0xf3, - 0xe7, 0x9d, 0xbb, 0x9e, 0xfb, 0xc8, 0x8d, 0x17, 0x30, 0xdd, 0xba, 0x16, 0x67, 0xbd, 0x11, 0xba, - 0x6f, 0x4e, 0x7e, 0x1b, 0x65, 0x88, 0xeb, 0xed, 0x6a, 0x88, 0x7b, 0x4b, 0xbb, 0xb2, 0xd2, 0xe2, - 0x5a, 0x72, 0x1d, 0xc7, 0x34, 0x7c, 0xc5, 0x77, 0x59, 0x5f, 0xc3, 0x20, 0x86, 0xa2, 0xe4, 0xf7, - 0x81, 0xa3, 0x0b, 0x37, 0xc5, 0xb2, 0xdd, 0xa1, 0xf9, 0x3c, 0x76, 0xa5, 0x78, 0xb2, 0xcd, 0x25, - 0x8e, 0x00, 0x43, 0xe2, 0x08, 0x21, 0x3b, 0x30, 0xb5, 0x1d, 0xd0, 0x86, 0xf0, 0x1b, 0x6e, 0x05, - 0xc2, 0x38, 0xc1, 0xcd, 0x1e, 0xb8, 0xe5, 0xb7, 0x64, 0x71, 0x8d, 0xaa, 0x72, 0x7d, 0x43, 0xcd, - 0x20, 0x27, 0x2b, 0x30, 0x51, 0xa5, 0x4e, 0x50, 0x3f, 0x7c, 0x40, 0x9f, 0x31, 0x75, 0xc7, 0x48, - 0xf4, 0x10, 0x62, 0x09, 0xeb, 0x2f, 0x16, 0xe9, 0x3e, 0x1e, 0x26, 0x11, 0xf9, 0x14, 0x06, 0xab, - 0x7e, 0x10, 0x2d, 0x3e, 0x13, 0x8b, 0x9a, 0xbc, 0x31, 0xe2, 0xc0, 0xc5, 0x0b, 0x32, 0xd9, 0x45, - 0xe8, 0x07, 0x51, 0x6d, 0xdf, 0x08, 0x89, 0xc4, 0x51, 0xc8, 0x33, 0x98, 0x36, 0x17, 0x14, 0xe1, - 0xce, 0x3a, 0x2c, 0xd4, 0xac, 0xac, 0x55, 0x8b, 0xa3, 0x2c, 0x5e, 0x17, 0xdc, 0xaf, 0x24, 0x97, - 0xad, 0x47, 0x58, 0xae, 0x47, 0x29, 0xca, 0xa2, 0x27, 0x1b, 0x98, 0x25, 0x84, 0xf7, 0xa8, 0x12, - 0x72, 0x37, 0xd8, 0x91, 0x38, 0xe8, 0x56, 0x1b, 0x17, 0x25, 0x94, 0x84, 0x13, 0x26, 0x53, 0xcb, - 0xd8, 0x29, 0x52, 0xb2, 0x0d, 0xe7, 0x76, 0x43, 0xba, 0x1d, 0xd0, 0x27, 0x2e, 0x7d, 0x2a, 0xf9, - 0x41, 0x1c, 0xa1, 0x88, 0xf1, 0x6b, 0xf1, 0xd2, 0x2c, 0x86, 0x69, 0x62, 0xf2, 0x3e, 0xc0, 0xb6, - 0xeb, 0x79, 0xb4, 0x81, 0xd7, 0x8e, 0xa3, 0xc8, 0x0a, 0x4d, 0xaa, 0x2d, 0x84, 0xd6, 0x7c, 0xaf, - 0xa9, 0x8b, 0x54, 0x43, 0x26, 0x8b, 0x30, 0xbe, 0xe6, 0xd5, 0x9b, 0x6d, 0xe1, 0x1e, 0x10, 0xe2, - 0x82, 0x22, 0x22, 0xa7, 0xb9, 0xbc, 0xa0, 0x96, 0xfa, 0xc8, 0x4d, 0x12, 0xf2, 0x00, 0x88, 0x00, - 0x88, 0x59, 0xeb, 0xec, 0x37, 0xa9, 0xf8, 0xdc, 0xd1, 0x54, 0x22, 0x19, 0xe1, 0x74, 0x37, 0x02, - 0x92, 0xa5, 0xc8, 0xe6, 0xde, 0x87, 0x51, 0x6d, 0xce, 0x67, 0xc4, 0x20, 0x98, 0xd6, 0x63, 0x10, - 0x8c, 0xe8, 0xb1, 0x06, 0xfe, 0x71, 0x01, 0xe6, 0xb3, 0xbf, 0x25, 0xa1, 0x80, 0x6d, 0xc1, 0x88, - 0x02, 0xaa, 0x57, 0x27, 0x52, 0xf5, 0x4f, 0x68, 0x40, 0xfc, 0x83, 0x96, 0x2b, 0x8f, 0xde, 0xfb, - 0x98, 0xc7, 0x73, 0xd8, 0xe3, 0xff, 0xce, 0x30, 0x4c, 0xa3, 0x77, 0x75, 0x72, 0x9d, 0xfa, 0x04, - 0x63, 0x89, 0x20, 0x4c, 0x33, 0x2f, 0x0b, 0x4b, 0x13, 0x87, 0x27, 0x03, 0x5f, 0x19, 0x04, 0xe4, - 0x1d, 0xdd, 0x27, 0xa2, 0x57, 0xcb, 0x4a, 0x22, 0x81, 0x7a, 0x17, 0x62, 0x67, 0x89, 0x37, 0x8c, - 0x2b, 0xf9, 0x53, 0x2f, 0x7a, 0xfd, 0xa7, 0x5d, 0xf4, 0x76, 0xd5, 0xa2, 0xc7, 0x63, 0x54, 0xbc, - 0xae, 0x2d, 0x7a, 0x2f, 0x7f, 0xb5, 0x1b, 0x7c, 0xd9, 0xab, 0xdd, 0xd0, 0x8b, 0xad, 0x76, 0xc3, - 0xcf, 0xb9, 0xda, 0xdd, 0x85, 0x89, 0x4d, 0x4a, 0x1b, 0xda, 0x45, 0xc9, 0x48, 0xbc, 0x7b, 0x7a, - 0x14, 0x4d, 0x60, 0x59, 0xb7, 0x25, 0x09, 0xaa, 0xdc, 0x55, 0x13, 0xfe, 0x7a, 0x56, 0xcd, 0xd1, - 0x97, 0xbc, 0x6a, 0x8e, 0xbd, 0xc8, 0xaa, 0x99, 0x5a, 0xfa, 0xc6, 0xcf, 0xbc, 0xf4, 0xbd, 0xc8, - 0x6a, 0xf5, 0x31, 0xba, 0x14, 0x56, 0xab, 0xab, 0xc2, 0x7b, 0x44, 0x73, 0xd7, 0x58, 0xf5, 0x43, - 0xe9, 0x71, 0x8d, 0x7f, 0x33, 0xd8, 0xb6, 0x1f, 0xc8, 0x2b, 0x6f, 0xfc, 0xdb, 0x5a, 0x44, 0x47, - 0x42, 0x9d, 0x5e, 0xb9, 0xeb, 0x0f, 0x89, 0x27, 0x7b, 0x62, 0x8d, 0x4b, 0x1e, 0xa3, 0x6c, 0x59, - 0x6e, 0xfd, 0x59, 0x81, 0x5f, 0x4a, 0xfe, 0xff, 0xb8, 0x54, 0xbe, 0xc8, 0x45, 0xe1, 0x6f, 0xc4, - 0x4f, 0xf9, 0x45, 0xd8, 0x81, 0xc0, 0xa9, 0x3f, 0x8e, 0x6f, 0x6a, 0x7f, 0xc0, 0xbe, 0x73, 0xbd, - 0x00, 0x03, 0xab, 0xc6, 0x67, 0x45, 0xb3, 0x70, 0xef, 0x8e, 0x5c, 0x00, 0x44, 0x44, 0x03, 0x0e, - 0x36, 0x17, 0x00, 0x9d, 0x00, 0x7d, 0xe5, 0x26, 0x2d, 0x9b, 0xbf, 0x44, 0xcf, 0x6c, 0xc1, 0xbb, - 0xe9, 0xb7, 0xd4, 0x78, 0x18, 0x89, 0xdf, 0x52, 0xeb, 0x62, 0x8c, 0x5f, 0x55, 0xef, 0xc2, 0x45, - 0x9b, 0x1e, 0xf9, 0x4f, 0xe8, 0xcb, 0x65, 0xfb, 0x15, 0x5c, 0x30, 0x19, 0xf2, 0x57, 0x37, 0x3c, - 0x8a, 0xfb, 0xc7, 0xd9, 0xb1, 0xdf, 0x05, 0x01, 0x8f, 0xfd, 0xce, 0x43, 0x48, 0xb3, 0x3f, 0xf5, - 0x7d, 0x03, 0xcb, 0x2c, 0x1f, 0xe6, 0x4d, 0xe6, 0x95, 0x46, 0x03, 0x73, 0x40, 0xd6, 0xdd, 0x96, - 0xe3, 0x45, 0x64, 0x0b, 0x46, 0xb5, 0x9f, 0x09, 0x53, 0x81, 0x56, 0x22, 0x74, 0x9a, 0x18, 0x60, - 0x84, 0xe0, 0x8c, 0xc1, 0x16, 0x85, 0x72, 0x52, 0x3c, 0x4c, 0x64, 0x7a, 0x9d, 0x8b, 0x30, 0xae, - 0xfd, 0x54, 0x26, 0x4b, 0xfc, 0xf8, 0xb5, 0x1a, 0x4c, 0x81, 0x99, 0x24, 0x56, 0x1d, 0xe6, 0xb2, - 0x84, 0xc6, 0x63, 0x35, 0x93, 0x95, 0x38, 0xce, 0x53, 0x77, 0x6f, 0xbb, 0xc9, 0xbc, 0x18, 0x4f, - 0xd6, 0xdf, 0xef, 0x87, 0x8b, 0x62, 0x30, 0x5e, 0xe6, 0x88, 0x93, 0x1f, 0xc2, 0xa8, 0x36, 0xc6, - 0x42, 0xe8, 0x57, 0x64, 0xe8, 0xcd, 0xbc, 0xb9, 0xc0, 0x4d, 0x1a, 0x6d, 0x04, 0xd4, 0x12, 0xc3, - 0xbd, 0xda, 0x63, 0xeb, 0x2c, 0x49, 0x13, 0x26, 0xcc, 0x81, 0x16, 0x56, 0x9d, 0x6b, 0x99, 0x95, - 0x98, 0xa8, 0x32, 0x90, 0x73, 0xa3, 0x96, 0x39, 0xdc, 0xab, 0x3d, 0x76, 0x82, 0x37, 0xf9, 0x06, - 0xce, 0xa5, 0x46, 0x59, 0x18, 0xeb, 0x5e, 0xcb, 0xac, 0x30, 0x85, 0xcd, 0xcd, 0xb1, 0x01, 0x82, - 0x73, 0xab, 0x4d, 0x57, 0x42, 0x1a, 0x30, 0xa6, 0x0f, 0xbc, 0x30, 0x3b, 0x5d, 0xed, 0x20, 0x4a, - 0x8e, 0xc8, 0x95, 0x3b, 0x21, 0x4b, 0x1c, 0xfb, 0x67, 0xa6, 0x89, 0xd9, 0x40, 0x1e, 0x86, 0x41, - 0xfe, 0x9b, 0x2d, 0x01, 0xdb, 0x01, 0x0d, 0xa9, 0x57, 0xa7, 0x86, 0x83, 0xf6, 0x0b, 0x2e, 0x01, - 0xff, 0xa1, 0x00, 0xa5, 0x2c, 0xbe, 0x55, 0xea, 0x35, 0xc8, 0x36, 0x14, 0x93, 0x15, 0x89, 0x59, - 0x6d, 0xa9, 0x58, 0xb9, 0xb9, 0x4d, 0x5a, 0xed, 0xb1, 0x53, 0xd4, 0x64, 0x13, 0xce, 0x69, 0x30, - 0x61, 0x5c, 0xed, 0x3d, 0x8d, 0x71, 0x95, 0x8d, 0x42, 0x8a, 0x54, 0xb7, 0x4d, 0xaf, 0xe2, 0xce, - 0xb8, 0xec, 0x1f, 0x39, 0xae, 0xc7, 0x14, 0x5d, 0x2d, 0xd4, 0x13, 0xc4, 0x50, 0x21, 0x1b, 0x6e, - 0x6d, 0x45, 0xa8, 0x7c, 0x50, 0xa2, 0x50, 0xac, 0x8f, 0x70, 0x05, 0x17, 0x36, 0x3a, 0xfe, 0x3c, - 0x55, 0x31, 0xbb, 0x02, 0x03, 0x3b, 0xeb, 0xd5, 0xa5, 0x8a, 0x78, 0xec, 0xca, 0x43, 0x24, 0x34, - 0xc3, 0x5a, 0xdd, 0xb1, 0x79, 0x81, 0xf5, 0x21, 0x90, 0x7b, 0x34, 0x12, 0xc1, 0xda, 0x15, 0xdd, - 0xab, 0x30, 0x24, 0x40, 0x82, 0x12, 0x5d, 0xe3, 0x44, 0xe8, 0x77, 0x5b, 0x96, 0x59, 0xdb, 0xf2, - 0x9c, 0xd0, 0xa4, 0x4e, 0xa8, 0x6d, 0xcc, 0xef, 0xc1, 0x70, 0x20, 0x60, 0x62, 0x5f, 0x9e, 0x50, - 0xb9, 0x38, 0x10, 0xcc, 0xed, 0xd9, 0x12, 0xc7, 0x56, 0x7f, 0x59, 0xeb, 0x18, 0xce, 0x64, 0x6b, - 0x6d, 0x79, 0x89, 0x49, 0x55, 0x08, 0x4b, 0x0e, 0xc7, 0x2d, 0xf4, 0x21, 0x8f, 0xa8, 0xfe, 0xd4, - 0x15, 0x45, 0x83, 0x1f, 0xb9, 0x08, 0xe2, 0xa3, 0xa1, 0x58, 0x6f, 0xa9, 0xe0, 0x28, 0x19, 0xdc, - 0xf2, 0x72, 0x4a, 0x6c, 0x62, 0xd8, 0x97, 0x7b, 0xe8, 0x2e, 0xf3, 0x32, 0x1a, 0xe1, 0xc0, 0x1c, - 0xdf, 0xe6, 0x59, 0xaf, 0x44, 0x5a, 0x3c, 0x5f, 0x2d, 0x8d, 0x4b, 0x30, 0xa2, 0x60, 0xea, 0xee, - 0x8b, 0xcb, 0xca, 0xc0, 0xdf, 0x7b, 0x8b, 0xbf, 0x0a, 0xae, 0x2b, 0x06, 0x31, 0x1d, 0xab, 0x82, - 0x7f, 0x77, 0xdf, 0x72, 0x15, 0x21, 0x0d, 0xa2, 0x6f, 0xb5, 0x8a, 0x38, 0x2e, 0xd0, 0x59, 0xaa, - 0x30, 0xf0, 0xf7, 0x16, 0x4e, 0x23, 0xa8, 0x6f, 0xb9, 0x0a, 0x26, 0xa8, 0x6f, 0xaf, 0x0a, 0x2a, - 0x03, 0x28, 0xf1, 0x49, 0x9a, 0xaa, 0x64, 0x25, 0x5d, 0x89, 0x34, 0x5c, 0x27, 0x28, 0x3a, 0x8e, - 0x07, 0x85, 0x79, 0x2e, 0xac, 0x5f, 0x40, 0x35, 0x4c, 0x60, 0xdf, 0x6e, 0x35, 0xff, 0xb0, 0xc0, - 0xc3, 0x39, 0x55, 0xb7, 0xb4, 0x84, 0x94, 0xde, 0x23, 0x5f, 0xbb, 0x9a, 0xd7, 0xbe, 0xf6, 0x07, - 0xae, 0xd7, 0xd0, 0xaf, 0xe6, 0x9d, 0x76, 0x74, 0xa8, 0xc2, 0x1d, 0x3f, 0x76, 0xbd, 0x86, 0x9d, - 0xc4, 0x26, 0xef, 0xc3, 0xb8, 0x06, 0x52, 0xda, 0x1a, 0xcf, 0x19, 0xa1, 0x93, 0xbb, 0x0d, 0xdb, - 0xc4, 0xb4, 0xfe, 0xaa, 0x00, 0x53, 0x19, 0xa9, 0x92, 0xd1, 0x98, 0x81, 0xa7, 0x20, 0xb5, 0x50, - 0x89, 0x2c, 0x4f, 0x18, 0x59, 0xc2, 0xd8, 0x24, 0x15, 0x22, 0x46, 0xcb, 0xd7, 0xd2, 0x3a, 0xf7, - 0x6a, 0x09, 0xc8, 0xb2, 0x53, 0x39, 0xeb, 0xe8, 0x24, 0x04, 0x88, 0x5b, 0x22, 0xcc, 0xc6, 0x55, - 0xa6, 0xd2, 0x6a, 0x39, 0xa1, 0x5f, 0x4a, 0x52, 0x6a, 0xad, 0x1a, 0xeb, 0x37, 0x7a, 0xe1, 0x7c, - 0x46, 0xff, 0xab, 0x34, 0xfa, 0xeb, 0x10, 0x41, 0x22, 0x33, 0x77, 0xdf, 0x2f, 0x28, 0x33, 0xb7, - 0xf5, 0x5f, 0x7a, 0xe1, 0xfc, 0x6e, 0x2b, 0xc4, 0x17, 0x56, 0x6b, 0xde, 0x13, 0xea, 0x45, 0x7e, - 0xf0, 0x0c, 0x5f, 0x85, 0x90, 0x77, 0x60, 0x60, 0x95, 0x36, 0x9b, 0xbe, 0x98, 0xff, 0x97, 0xa4, - 0x77, 0x44, 0x12, 0x1b, 0x91, 0x56, 0x7b, 0x6c, 0x8e, 0x4d, 0xde, 0x87, 0x91, 0x55, 0xea, 0x04, - 0xd1, 0x3e, 0x75, 0xe4, 0x91, 0x45, 0x66, 0xb2, 0xd0, 0x48, 0x04, 0xc2, 0x6a, 0x8f, 0x1d, 0x63, - 0x93, 0x05, 0x76, 0x9a, 0xf7, 0x0e, 0xd4, 0x6b, 0xf2, 0x9c, 0x0a, 0x19, 0xce, 0x6a, 0x8f, 0x8d, - 0xb8, 0x64, 0x03, 0xc6, 0x2b, 0x07, 0xd4, 0x8b, 0x36, 0x68, 0xe4, 0x34, 0x9c, 0xc8, 0x11, 0xaa, - 0xed, 0xab, 0x79, 0xc4, 0x06, 0xf2, 0x6a, 0x8f, 0x6d, 0x52, 0x93, 0x0f, 0x61, 0xe8, 0x9e, 0xef, - 0x37, 0xf6, 0x9f, 0x51, 0xa1, 0xae, 0x96, 0xf3, 0x18, 0x09, 0xb4, 0xd5, 0x1e, 0x5b, 0x52, 0x2c, - 0x0e, 0x40, 0xdf, 0x46, 0x78, 0x60, 0x1d, 0x17, 0xa0, 0xb4, 0xec, 0x3f, 0xf5, 0x32, 0xa5, 0xfa, - 0x3d, 0x53, 0xaa, 0x92, 0x7d, 0x06, 0x7e, 0x42, 0xae, 0x6f, 0x43, 0xff, 0xb6, 0xeb, 0x1d, 0x24, - 0x54, 0xc1, 0x0c, 0x3a, 0x86, 0x85, 0xe2, 0x71, 0xbd, 0x03, 0xb2, 0x2e, 0x75, 0x70, 0x61, 0x6b, - 0xec, 0x33, 0x14, 0xff, 0x0c, 0x6a, 0x1d, 0x3b, 0xd6, 0xb5, 0xf9, 0x6f, 0xd9, 0xc1, 0x37, 0x60, - 0x36, 0xa7, 0x5e, 0xf1, 0x3c, 0x9c, 0xf5, 0xad, 0x1f, 0x15, 0x9b, 0xd7, 0x61, 0x26, 0x73, 0xfc, - 0x52, 0x88, 0xff, 0x2c, 0x6b, 0x22, 0xf2, 0x9e, 0x97, 0x60, 0x48, 0xa6, 0x78, 0xe2, 0xb6, 0x1f, - 0xf9, 0x13, 0x1f, 0x48, 0xc9, 0x0f, 0x55, 0x06, 0xf6, 0x90, 0xdf, 0xe3, 0x9e, 0x16, 0x48, 0x89, - 0x7f, 0x4e, 0x1f, 0xbc, 0xc0, 0x47, 0xa3, 0x78, 0xb1, 0x3a, 0x57, 0xfd, 0x30, 0xf2, 0x94, 0xe7, - 0xad, 0xad, 0x7e, 0x93, 0x1b, 0x50, 0x94, 0xe9, 0x1c, 0x44, 0xde, 0x18, 0x91, 0x47, 0xdc, 0x4e, - 0xc1, 0xc9, 0x7b, 0x30, 0x9b, 0x84, 0xc9, 0x5e, 0xf2, 0x17, 0x6e, 0x79, 0xc5, 0xd6, 0x9f, 0xf6, - 0x62, 0xac, 0xeb, 0x0e, 0xf3, 0x9a, 0x49, 0x77, 0xab, 0x2a, 0xa4, 0xd5, 0xbb, 0x55, 0x25, 0xf3, - 0x30, 0xb2, 0x55, 0x35, 0xf2, 0x64, 0xd9, 0x31, 0x80, 0x35, 0x9b, 0x75, 0xa1, 0x12, 0xd4, 0x0f, - 0xdd, 0x88, 0xd6, 0xa3, 0x76, 0x20, 0x56, 0x61, 0x3b, 0x05, 0x27, 0x16, 0x8c, 0xdd, 0x6b, 0xba, - 0xfb, 0x75, 0xc9, 0x8c, 0x8b, 0xc0, 0x80, 0x91, 0xd7, 0x60, 0x62, 0xcd, 0x0b, 0x23, 0xa7, 0xd9, - 0xdc, 0xa0, 0xd1, 0xa1, 0xdf, 0x10, 0xa9, 0x3c, 0xed, 0x04, 0x94, 0xd5, 0xbb, 0xe4, 0x7b, 0x91, - 0xe3, 0x7a, 0x34, 0xb0, 0xdb, 0x5e, 0xe4, 0x1e, 0x51, 0xd1, 0xf7, 0x14, 0x9c, 0xbc, 0x0d, 0x33, - 0x0a, 0xb6, 0x15, 0xd4, 0x0f, 0x69, 0x18, 0x05, 0x98, 0x3d, 0x0f, 0x03, 0xfe, 0xd8, 0xd9, 0x85, - 0x58, 0x43, 0xd3, 0x6f, 0x37, 0x56, 0xbc, 0x27, 0x6e, 0xe0, 0x7b, 0x98, 0x9b, 0x62, 0x58, 0xd4, - 0x90, 0x80, 0x5b, 0x7f, 0x30, 0x9c, 0xf9, 0xd9, 0xbe, 0xc8, 0x1c, 0xfc, 0x02, 0xc6, 0x96, 0x9c, - 0x96, 0xb3, 0xef, 0x36, 0xdd, 0xc8, 0x55, 0x69, 0xc6, 0xde, 0xe9, 0xf2, 0xcd, 0xcb, 0x04, 0x1f, - 0xb4, 0xa1, 0x13, 0xdb, 0x06, 0xab, 0xb9, 0xbf, 0x1c, 0x84, 0x99, 0x4c, 0x3c, 0x72, 0x5d, 0xe4, - 0x23, 0x53, 0xeb, 0xaa, 0x48, 0x76, 0x65, 0x27, 0xc1, 0x6c, 0x2c, 0x11, 0xb4, 0xd4, 0xa4, 0x8e, - 0xd7, 0x16, 0xa9, 0xae, 0x6c, 0x03, 0xc6, 0xc6, 0x92, 0xe9, 0x0d, 0x1a, 0x33, 0x74, 0x9c, 0xb6, - 0x13, 0x50, 0x72, 0x05, 0x46, 0x19, 0x44, 0xb2, 0xea, 0xe7, 0x4f, 0xfc, 0x34, 0x10, 0xe3, 0xb4, - 0xe9, 0x37, 0xa8, 0xc6, 0x69, 0x80, 0x73, 0x32, 0xa1, 0x8c, 0x13, 0x83, 0x48, 0x4e, 0x83, 0x9c, - 0x93, 0x06, 0x22, 0xaf, 0xc0, 0x78, 0xa5, 0xd5, 0xd2, 0x18, 0x61, 0x8e, 0x2b, 0xdb, 0x04, 0x92, - 0xcb, 0x00, 0x95, 0x56, 0x4b, 0xb2, 0xc1, 0xfc, 0x55, 0xb6, 0x06, 0x21, 0x37, 0xe3, 0x70, 0x65, - 0x1a, 0x2b, 0xbc, 0x4e, 0xb0, 0x33, 0x4a, 0x98, 0x5c, 0x55, 0x6c, 0x27, 0xc1, 0x14, 0xb8, 0x5c, - 0x13, 0x60, 0xf2, 0x11, 0x5c, 0x48, 0xf8, 0x5d, 0x68, 0x15, 0xa0, 0xa9, 0xdf, 0xce, 0x47, 0x20, - 0xef, 0xc2, 0xf9, 0x44, 0xa1, 0xac, 0x0e, 0xad, 0xfa, 0x76, 0x4e, 0x29, 0xf9, 0x00, 0x4a, 0x89, - 0x67, 0xdb, 0x71, 0xa5, 0x68, 0xc1, 0xb7, 0x73, 0xcb, 0xd9, 0xd7, 0x95, 0x78, 0xff, 0x25, 0xaa, - 0xc4, 0xcb, 0x4a, 0x3b, 0xbb, 0x90, 0xac, 0x42, 0x39, 0xd3, 0x97, 0x45, 0xab, 0x18, 0xf3, 0x72, - 0xd9, 0xdd, 0xd0, 0xc8, 0x22, 0xcc, 0x67, 0xa2, 0xc8, 0x66, 0x60, 0xb6, 0x2e, 0xbb, 0x23, 0x0e, - 0x59, 0x80, 0xe9, 0xd8, 0xa7, 0x47, 0x6b, 0x02, 0x26, 0xea, 0xb2, 0x33, 0xcb, 0xc8, 0x9b, 0xe6, - 0xe3, 0x7c, 0x5e, 0x19, 0xe6, 0xe9, 0xb2, 0xd3, 0x05, 0xd6, 0x49, 0x01, 0xe6, 0x33, 0x37, 0x4a, - 0xa9, 0xcf, 0xcf, 0x25, 0x15, 0x47, 0x6d, 0x2d, 0xb8, 0x01, 0xfd, 0xa8, 0xe0, 0x73, 0x5b, 0xb1, - 0xf4, 0x35, 0x45, 0x7a, 0xce, 0x8a, 0x95, 0xda, 0x88, 0x43, 0xee, 0xa9, 0xbb, 0xc1, 0x3e, 0xb4, - 0x64, 0xdc, 0x4a, 0x2a, 0x50, 0x19, 0x95, 0xeb, 0x77, 0x84, 0xf2, 0x36, 0xf0, 0x45, 0xae, 0x61, - 0xfe, 0xb4, 0x00, 0xe5, 0x2e, 0xfa, 0x81, 0xea, 0x53, 0xe1, 0x14, 0x7d, 0xba, 0xaf, 0xfa, 0xc4, - 0xdf, 0xc6, 0x2e, 0x9c, 0x4e, 0x07, 0x79, 0xd9, 0xdd, 0xfa, 0xab, 0x02, 0x90, 0xb4, 0x1e, 0x4a, - 0xbe, 0x0b, 0x23, 0xd5, 0xea, 0xaa, 0xe1, 0xd1, 0x97, 0xba, 0x1d, 0x8a, 0x31, 0xc8, 0xed, 0x53, - 0xb9, 0xf0, 0xe9, 0x0e, 0x7c, 0x9f, 0xa4, 0xfc, 0x06, 0xfb, 0x3a, 0xfa, 0x0d, 0xa6, 0xbc, 0x06, - 0x57, 0x32, 0x1c, 0xe1, 0xfa, 0xbb, 0x38, 0xc2, 0xa5, 0xbd, 0xdc, 0xac, 0x65, 0x28, 0xe5, 0xa9, - 0xb2, 0xb8, 0xc2, 0xf1, 0x20, 0x5f, 0xda, 0x0d, 0x17, 0x5f, 0xe1, 0x4c, 0xb0, 0xf5, 0x2e, 0x9c, - 0x57, 0xd4, 0x3c, 0x7b, 0x88, 0x16, 0x81, 0x40, 0x9c, 0x7f, 0x55, 0xa4, 0x83, 0x18, 0x60, 0xfd, - 0x49, 0x7f, 0x8a, 0xb0, 0xda, 0x3e, 0x3a, 0x72, 0x82, 0x67, 0xa4, 0x62, 0x12, 0xf6, 0x75, 0x3d, - 0x72, 0x2c, 0xf6, 0xff, 0xf4, 0xb8, 0xdc, 0xa3, 0x71, 0x67, 0xfb, 0x02, 0x6a, 0x18, 0x5e, 0x9d, - 0xf2, 0xbb, 0xb1, 0x5e, 0x1e, 0x65, 0xc9, 0x00, 0x92, 0x3d, 0x18, 0x17, 0x7b, 0x37, 0xfe, 0x96, - 0xdf, 0xd8, 0xed, 0xe4, 0x37, 0x66, 0x34, 0xef, 0xa6, 0x41, 0xc2, 0x67, 0xa3, 0xc9, 0x86, 0x7c, - 0x01, 0x13, 0x52, 0x53, 0x13, 0x8c, 0xb9, 0x37, 0xd3, 0x9d, 0xce, 0x8c, 0x4d, 0x1a, 0xce, 0x39, - 0xc1, 0x88, 0x35, 0x59, 0x2e, 0x76, 0x9c, 0xf3, 0xc0, 0x69, 0x9a, 0x6c, 0x90, 0x88, 0x26, 0x1b, - 0xb0, 0xb9, 0x4f, 0x81, 0xa4, 0xfb, 0xd5, 0xed, 0x73, 0x1a, 0xd7, 0x3e, 0xa7, 0xb9, 0x0a, 0x4c, - 0x65, 0x74, 0xe0, 0x4c, 0x2c, 0x3e, 0x05, 0x92, 0x6e, 0xe9, 0x59, 0x38, 0x58, 0xd7, 0xe1, 0x35, - 0x25, 0x02, 0x35, 0x1b, 0x0c, 0x9e, 0xd2, 0x02, 0xfe, 0xeb, 0xbd, 0x50, 0xee, 0x82, 0x4a, 0x7e, - 0xbf, 0x90, 0x94, 0x36, 0x9f, 0x8d, 0xef, 0x27, 0xa5, 0x9d, 0x4d, 0x9f, 0x21, 0xf6, 0xc5, 0x0f, - 0x7e, 0xf2, 0xe7, 0xcf, 0x7d, 0xf2, 0x48, 0x0f, 0xd9, 0xd9, 0xa5, 0xd5, 0xaf, 0x4b, 0xcb, 0x86, - 0x69, 0xe3, 0xcc, 0x76, 0x9a, 0xcd, 0xeb, 0x32, 0x80, 0xc8, 0x35, 0xba, 0xee, 0x1f, 0x08, 0x3d, - 0x51, 0x83, 0x58, 0x77, 0x61, 0x26, 0xc1, 0x53, 0x58, 0xe5, 0xbf, 0x0b, 0xea, 0xa5, 0x39, 0x32, - 0xed, 0x5b, 0x3c, 0xf7, 0xf3, 0xe3, 0xf2, 0x38, 0x53, 0xe9, 0x6f, 0xc6, 0x81, 0xec, 0xe5, 0x5f, - 0xd6, 0x86, 0x7e, 0xaf, 0x50, 0x69, 0xea, 0x11, 0x78, 0xc8, 0x1d, 0x18, 0xe4, 0x90, 0x44, 0xb8, - 0x68, 0x1d, 0x5b, 0xac, 0x09, 0x02, 0xd1, 0x9a, 0xc1, 0x77, 0xb1, 0xf8, 0xa3, 0x12, 0xc7, 0x71, - 0xb0, 0x76, 0x79, 0xfa, 0x94, 0x18, 0xac, 0x42, 0x52, 0xf7, 0x57, 0xe2, 0x78, 0x13, 0xd2, 0x09, - 0x44, 0xe2, 0x79, 0xfe, 0xd3, 0x26, 0x6d, 0xf0, 0xd4, 0x74, 0x8b, 0x63, 0xc2, 0x09, 0xa4, 0xdf, - 0x61, 0x0c, 0x90, 0xcc, 0xfa, 0x04, 0x66, 0x98, 0xa6, 0x10, 0x24, 0xeb, 0xc3, 0xa4, 0x09, 0x0c, - 0x66, 0x7a, 0xd6, 0x3b, 0x0c, 0x84, 0x9e, 0xf5, 0xa2, 0xd0, 0x5a, 0x87, 0x0b, 0xdc, 0x2a, 0xa9, - 0x77, 0x29, 0xbe, 0x03, 0x18, 0xc0, 0xdf, 0x89, 0x57, 0x95, 0x19, 0xbd, 0xe7, 0x78, 0xd6, 0xc7, - 0xf8, 0x6c, 0x47, 0x4c, 0x52, 0xd7, 0xf7, 0x62, 0x13, 0xe4, 0xe9, 0xde, 0xf9, 0xfe, 0x4d, 0x98, - 0xaf, 0xb4, 0x5a, 0xd4, 0x6b, 0xc4, 0x84, 0x3b, 0x81, 0x73, 0xca, 0x28, 0x0c, 0xa4, 0x02, 0x03, - 0x88, 0xad, 0x2e, 0x50, 0x45, 0x73, 0x33, 0x9a, 0x83, 0x78, 0x22, 0x7e, 0x28, 0x56, 0xc0, 0x29, - 0xad, 0x06, 0xcc, 0x56, 0xdb, 0xfb, 0x47, 0x6e, 0x84, 0xfe, 0xf8, 0x18, 0xc9, 0x44, 0xd6, 0xbd, - 0x26, 0x33, 0x5e, 0x71, 0x61, 0x5c, 0x8f, 0x9f, 0x77, 0xa0, 0x4b, 0xbf, 0x88, 0x6e, 0xf2, 0xe4, - 0xce, 0xcd, 0x98, 0x14, 0xcd, 0x2f, 0xbc, 0x16, 0x2c, 0x16, 0x59, 0xb1, 0xac, 0x29, 0x38, 0xa7, - 0x5f, 0x46, 0xf1, 0x19, 0x32, 0x03, 0x53, 0xe6, 0x25, 0x13, 0x07, 0x7f, 0x0d, 0xd3, 0xdc, 0x08, - 0xce, 0xe3, 0x7f, 0x2f, 0xc4, 0xa1, 0xae, 0x7b, 0xf7, 0x16, 0x12, 0x0f, 0x01, 0xd0, 0x3f, 0x58, - 0x65, 0x76, 0xd8, 0x5b, 0xe0, 0x4f, 0x2f, 0x9f, 0x2c, 0x18, 0x57, 0x99, 0xbd, 0x7b, 0x0b, 0x8b, - 0x43, 0x22, 0x8e, 0x2a, 0xe3, 0xce, 0x87, 0xff, 0x5b, 0xe1, 0xbe, 0x80, 0xaf, 0xfd, 0x57, 0xa9, - 0x83, 0x2f, 0x73, 0xb2, 0xdf, 0x4c, 0x4f, 0x40, 0xaf, 0xdb, 0x90, 0x66, 0x03, 0xb7, 0x61, 0xfd, - 0x61, 0x01, 0xae, 0x73, 0x65, 0x2c, 0x9b, 0x0e, 0x6f, 0x9c, 0x72, 0x88, 0xc9, 0x7b, 0xc0, 0x73, - 0xde, 0x0b, 0x8d, 0xd7, 0x12, 0x2d, 0xef, 0xc4, 0x89, 0x13, 0x90, 0x0a, 0x8c, 0xe9, 0x6f, 0x5b, - 0x4e, 0x17, 0xa7, 0xce, 0x1e, 0x3d, 0x7a, 0xe4, 0xa8, 0xf7, 0x2e, 0x8f, 0xe1, 0xe2, 0xca, 0x37, - 0x6c, 0x42, 0x88, 0xdd, 0x49, 0x9c, 0x1c, 0xe2, 0x37, 0xb9, 0x93, 0x3b, 0x62, 0xc6, 0x98, 0xc7, - 0xfa, 0x24, 0x98, 0x9d, 0x91, 0xe5, 0x06, 0xa7, 0xd4, 0xf7, 0x11, 0xdb, 0x80, 0x59, 0x7f, 0x52, - 0x80, 0xf9, 0xec, 0xda, 0xc4, 0xc2, 0xb2, 0x06, 0xe7, 0x96, 0x1c, 0xcf, 0xf7, 0xdc, 0xba, 0xd3, - 0xac, 0xd6, 0x0f, 0x69, 0xa3, 0xad, 0xa2, 0xad, 0xaa, 0x55, 0xe6, 0x80, 0x7a, 0x92, 0x5c, 0xa2, - 0xd8, 0x69, 0x2a, 0x76, 0x3a, 0xc4, 0xe7, 0x11, 0x7c, 0xed, 0x6d, 0xd2, 0x40, 0xf1, 0xe3, 0x2d, - 0xcb, 0x29, 0x25, 0xb7, 0xa5, 0xb5, 0xbf, 0xb1, 0xeb, 0xb9, 0x91, 0x22, 0xe2, 0x66, 0x9e, 0xac, - 0x22, 0xeb, 0x3f, 0x15, 0xe0, 0x02, 0x26, 0x58, 0x32, 0x52, 0x36, 0xc6, 0x41, 0x87, 0x65, 0xdc, - 0xdc, 0x82, 0xf1, 0xdc, 0xc3, 0xc0, 0x36, 0x03, 0xe8, 0x92, 0x37, 0xa1, 0xbf, 0x2a, 0xbd, 0xb5, - 0x26, 0x12, 0xf9, 0x70, 0x05, 0x05, 0x2b, 0xb7, 0x11, 0x8b, 0xed, 0x39, 0xcb, 0x34, 0xac, 0x53, - 0x0f, 0x13, 0x17, 0x73, 0xab, 0x83, 0x06, 0x89, 0x63, 0x26, 0xf5, 0xe7, 0xc5, 0x4c, 0x1a, 0x30, - 0x63, 0x26, 0x59, 0x4f, 0x78, 0x7a, 0xa5, 0x64, 0x87, 0xc4, 0x20, 0x7d, 0x9c, 0xca, 0x73, 0xcc, - 0xf7, 0x81, 0xf3, 0x59, 0x3d, 0x63, 0x0a, 0x7a, 0x22, 0x85, 0x71, 0x7e, 0x90, 0xdf, 0x6d, 0x78, - 0xc5, 0xc0, 0xad, 0x34, 0x9b, 0xfe, 0x53, 0xda, 0xd8, 0x0e, 0xfc, 0x23, 0x3f, 0x32, 0xd2, 0xcb, - 0x88, 0x44, 0xdf, 0xf1, 0x7d, 0x8e, 0x98, 0x95, 0x09, 0xb0, 0xf5, 0x37, 0xe0, 0xd5, 0x2e, 0x1c, - 0x45, 0xa7, 0xaa, 0x70, 0xce, 0x49, 0x94, 0x49, 0xb7, 0x9b, 0x57, 0xb3, 0xfa, 0x95, 0x64, 0x14, - 0xda, 0x69, 0xfa, 0x1b, 0x3b, 0x46, 0x6e, 0x60, 0x52, 0x82, 0xe9, 0x6d, 0x7b, 0x6b, 0x79, 0x77, - 0x69, 0xa7, 0xb6, 0xf3, 0xc5, 0xf6, 0x4a, 0x6d, 0x77, 0xf3, 0xc1, 0xe6, 0xd6, 0xc3, 0x4d, 0x1e, - 0x25, 0xdb, 0x28, 0xd9, 0x59, 0xa9, 0x6c, 0x14, 0x0b, 0x64, 0x1a, 0x8a, 0x06, 0x78, 0x65, 0x77, - 0xb1, 0xd8, 0x7b, 0xe3, 0x6b, 0x23, 0xe7, 0x2d, 0x99, 0x87, 0x52, 0x75, 0x77, 0x7b, 0x7b, 0xcb, - 0x56, 0x5c, 0xf5, 0x18, 0xdd, 0x33, 0x70, 0xce, 0x28, 0xbd, 0x6b, 0xaf, 0xac, 0x14, 0x0b, 0xac, - 0x29, 0x06, 0x78, 0xdb, 0x5e, 0xd9, 0x58, 0xdb, 0xdd, 0x28, 0xf6, 0xde, 0xa8, 0xe9, 0x6f, 0xcc, - 0xc8, 0x45, 0x98, 0x5d, 0x5e, 0xd9, 0x5b, 0x5b, 0x5a, 0xc9, 0xe2, 0x3d, 0x0d, 0x45, 0xbd, 0x70, - 0x67, 0x6b, 0x67, 0x9b, 0xb3, 0xd6, 0xa1, 0x0f, 0x57, 0x16, 0x2b, 0xbb, 0x3b, 0xab, 0x9b, 0xc5, - 0x3e, 0xab, 0x7f, 0xb8, 0xb7, 0xd8, 0x7b, 0xe3, 0x87, 0xc6, 0x03, 0x34, 0xd6, 0x7c, 0x81, 0xbe, - 0x5b, 0xad, 0xdc, 0xcb, 0xaf, 0x82, 0x97, 0x6e, 0xdc, 0xad, 0x14, 0x0b, 0xe4, 0x12, 0x5c, 0x30, - 0xa0, 0xdb, 0x95, 0x6a, 0xf5, 0xe1, 0x96, 0xbd, 0xbc, 0xbe, 0x52, 0xad, 0x16, 0x7b, 0x6f, 0xec, - 0x19, 0x71, 0xe2, 0x58, 0x0d, 0x1b, 0x77, 0x2b, 0x35, 0x7b, 0xe5, 0xb3, 0xdd, 0x35, 0x7b, 0x65, - 0x39, 0x5d, 0x83, 0x51, 0xfa, 0xc5, 0x4a, 0xb5, 0x58, 0x20, 0x53, 0x30, 0x69, 0x40, 0x37, 0xb7, - 0x8a, 0xbd, 0x37, 0x5e, 0x13, 0xa1, 0xc4, 0xc8, 0x04, 0xc0, 0xf2, 0x4a, 0x75, 0x69, 0x65, 0x73, - 0x79, 0x6d, 0xf3, 0x5e, 0xb1, 0x87, 0x8c, 0xc3, 0x48, 0x45, 0xfd, 0x2c, 0xdc, 0xf8, 0x00, 0x26, - 0x13, 0x47, 0x7b, 0x86, 0xa1, 0x0e, 0xc5, 0xc5, 0x1e, 0x14, 0xbf, 0xfc, 0x89, 0xf6, 0x55, 0x7e, - 0x4a, 0x2f, 0x16, 0x6e, 0x2c, 0xca, 0x1c, 0xac, 0xda, 0x77, 0x4e, 0x46, 0x61, 0x68, 0x79, 0xe5, - 0x6e, 0x65, 0x77, 0x7d, 0xa7, 0xd8, 0xc3, 0x7e, 0x2c, 0xd9, 0x2b, 0x95, 0x9d, 0x95, 0xe5, 0x62, - 0x81, 0x8c, 0xc0, 0x40, 0x75, 0xa7, 0xb2, 0xb3, 0x52, 0xec, 0x25, 0xc3, 0xd0, 0xbf, 0x5b, 0x5d, - 0xb1, 0x8b, 0x7d, 0x0b, 0xff, 0xfe, 0xf7, 0x0b, 0xdc, 0xc8, 0x28, 0x1f, 0x33, 0x7d, 0xad, 0x1d, - 0x26, 0xc5, 0x92, 0x27, 0x12, 0x4e, 0xe6, 0x9e, 0x1c, 0x51, 0x0b, 0x98, 0xeb, 0x70, 0xeb, 0x82, - 0x08, 0xd7, 0x0b, 0xb7, 0x0b, 0xc4, 0x46, 0x2f, 0x95, 0xc4, 0xd9, 0x4a, 0x71, 0xce, 0x3e, 0xfe, - 0xce, 0x5d, 0xea, 0x78, 0x24, 0x23, 0xbf, 0x02, 0x96, 0xce, 0x33, 0xe7, 0x04, 0xf2, 0xdd, 0xd3, - 0x9d, 0x34, 0x64, 0x9d, 0xaf, 0x9d, 0x0e, 0x9d, 0xdc, 0x87, 0x71, 0xa6, 0x9b, 0x2b, 0x34, 0x72, - 0x31, 0x49, 0xa8, 0x1d, 0x07, 0xe6, 0xe6, 0xb3, 0x0b, 0x55, 0x4e, 0x98, 0x31, 0xec, 0x08, 0x3f, - 0x58, 0x87, 0x44, 0x86, 0x9b, 0x90, 0x10, 0xbe, 0xe2, 0xcf, 0x9d, 0x4b, 0x80, 0xf7, 0xee, 0xdc, - 0x2e, 0x90, 0x2a, 0xc6, 0x7a, 0x33, 0x94, 0x7c, 0x22, 0x5f, 0xd7, 0xa5, 0xb5, 0x7f, 0xde, 0x9a, - 0xb2, 0xca, 0xe0, 0x98, 0x73, 0x3a, 0xd8, 0x04, 0x92, 0xd6, 0x9d, 0xc9, 0x95, 0x78, 0x1e, 0x64, - 0xab, 0xd5, 0x73, 0xe7, 0x53, 0xce, 0x87, 0x2b, 0x4c, 0x7b, 0x22, 0x2b, 0x30, 0x21, 0xde, 0x92, - 0x0b, 0x6d, 0x9e, 0x74, 0x3a, 0x0f, 0xe4, 0xb2, 0xb9, 0x87, 0x72, 0x52, 0x27, 0x02, 0x32, 0x17, - 0xf7, 0x23, 0x79, 0x4c, 0x98, 0xbb, 0x98, 0x59, 0x26, 0xfa, 0x77, 0x17, 0x26, 0xcc, 0xc3, 0x05, - 0x91, 0x03, 0x94, 0x79, 0xe6, 0xc8, 0x6d, 0x50, 0x0d, 0x66, 0x37, 0x1c, 0x17, 0xef, 0x4a, 0x84, - 0x8b, 0x9b, 0x74, 0x50, 0x23, 0xe5, 0x0e, 0x1e, 0x6b, 0x55, 0xea, 0x35, 0xd4, 0x20, 0xe4, 0xc5, - 0x77, 0xc7, 0xcf, 0xa6, 0x2a, 0x75, 0x64, 0xd3, 0xc1, 0x8f, 0x58, 0x66, 0x56, 0xde, 0x2c, 0x9f, - 0xcd, 0xb9, 0x3c, 0x37, 0x63, 0xb2, 0x81, 0x4a, 0x7a, 0x82, 0xa3, 0x36, 0x27, 0xce, 0xcc, 0xae, - 0x84, 0x11, 0x0d, 0xb4, 0x6c, 0xe6, 0xa2, 0x30, 0x24, 0x39, 0x82, 0xcb, 0x65, 0x76, 0xbb, 0x40, - 0xbe, 0xc6, 0xaf, 0x3a, 0x93, 0xdd, 0x43, 0x37, 0x3a, 0x14, 0xda, 0xcf, 0xc5, 0x4c, 0x06, 0xe2, - 0x43, 0xe9, 0xc0, 0xdd, 0x86, 0xe9, 0x2c, 0xcf, 0x66, 0x25, 0xd0, 0x0e, 0x6e, 0xcf, 0xb9, 0xb3, - 0xc0, 0x66, 0x47, 0x8d, 0x46, 0xfe, 0x20, 0x75, 0x70, 0xac, 0xcd, 0xe5, 0xf9, 0x11, 0x4c, 0xb0, - 0x59, 0xf2, 0x80, 0xd2, 0x56, 0xa5, 0xe9, 0x3e, 0xa1, 0x21, 0x91, 0x81, 0x7a, 0x15, 0x28, 0x8f, - 0xf6, 0x7a, 0x81, 0x7c, 0x07, 0x46, 0x1f, 0x3a, 0x51, 0xfd, 0x50, 0x04, 0xac, 0x94, 0xf1, 0x2c, - 0x11, 0x36, 0x27, 0x7f, 0x61, 0xe1, 0xed, 0x02, 0xf9, 0x3e, 0x0c, 0xdd, 0xa3, 0x11, 0xbe, 0x6e, - 0xbe, 0xaa, 0x9c, 0xfc, 0xb8, 0x6d, 0x72, 0xcd, 0x53, 0x4f, 0x78, 0x64, 0x83, 0x93, 0x86, 0x5c, - 0x72, 0x0b, 0x80, 0x2f, 0x08, 0xc8, 0x21, 0x59, 0x3c, 0x97, 0x6a, 0x36, 0xb9, 0xc7, 0x94, 0x87, - 0x26, 0x8d, 0xe8, 0x69, 0xab, 0xcc, 0x93, 0xd1, 0x3a, 0x4c, 0xa8, 0x34, 0x3a, 0x9b, 0x18, 0x57, - 0xc4, 0x4a, 0x30, 0x0b, 0xcf, 0xc0, 0xed, 0x03, 0xf6, 0x55, 0xf0, 0x1c, 0xb2, 0x18, 0x80, 0x02, - 0x57, 0xd2, 0x59, 0x3d, 0x8a, 0x85, 0xbe, 0x84, 0x4a, 0x21, 0x72, 0x34, 0x8d, 0x76, 0xd5, 0x0f, - 0x23, 0x93, 0x56, 0x41, 0xb2, 0x69, 0x7f, 0x19, 0xe6, 0xf4, 0x7a, 0xcd, 0x88, 0xc9, 0xf1, 0x9a, - 0x9b, 0x17, 0x88, 0x79, 0xee, 0x6a, 0x07, 0x0c, 0x71, 0x7e, 0xeb, 0xfb, 0xcd, 0xde, 0x02, 0x2e, - 0x27, 0xcb, 0x30, 0x25, 0xeb, 0xda, 0x6a, 0x51, 0xaf, 0x5a, 0x5d, 0xc5, 0x94, 0x29, 0xd2, 0xa5, - 0x44, 0x83, 0x49, 0xee, 0x24, 0x5d, 0xc4, 0xb6, 0x3e, 0x23, 0xd0, 0x04, 0xe9, 0x14, 0x7e, 0x22, - 0xde, 0xfa, 0x32, 0x43, 0xf9, 0x3e, 0xe0, 0x46, 0x25, 0x43, 0xf9, 0xdf, 0x5b, 0x20, 0x1d, 0x0e, - 0x40, 0x73, 0x39, 0x47, 0x88, 0xdb, 0x05, 0xf2, 0x05, 0x90, 0xf4, 0x91, 0x44, 0x89, 0x30, 0xf7, - 0xf8, 0xa5, 0x44, 0xd8, 0xe1, 0x3c, 0xb3, 0x02, 0x53, 0x2a, 0xcc, 0x4c, 0x5c, 0x4e, 0x72, 0xda, - 0xd2, 0x61, 0x07, 0x9b, 0xc9, 0x60, 0xb3, 0xb7, 0xd0, 0x81, 0x51, 0x26, 0x9c, 0x7c, 0x02, 0x53, - 0x62, 0xee, 0x1b, 0xed, 0x29, 0xaa, 0x65, 0x4c, 0x1c, 0x6e, 0x72, 0x5b, 0x72, 0x1f, 0x66, 0xaa, - 0x09, 0xc1, 0x73, 0x87, 0xfa, 0x0b, 0x26, 0x0b, 0x04, 0x56, 0x69, 0xc4, 0x25, 0x9f, 0xcd, 0xeb, - 0x01, 0x10, 0x6e, 0x5b, 0x92, 0xec, 0x9e, 0xb8, 0xf4, 0x29, 0xb9, 0x94, 0x68, 0x3a, 0x03, 0x22, - 0x1a, 0xae, 0x83, 0xb9, 0x3d, 0xdb, 0xe1, 0x89, 0x94, 0x11, 0x6a, 0x5c, 0xc5, 0x5f, 0x31, 0x08, - 0x8c, 0xdb, 0x7c, 0x31, 0x8e, 0x17, 0x72, 0x31, 0xc8, 0xaf, 0x61, 0x98, 0xd8, 0xce, 0xa7, 0x33, - 0xf2, 0x9d, 0xac, 0x43, 0x74, 0xce, 0xf9, 0x72, 0xee, 0xcd, 0xd3, 0x21, 0xab, 0xf3, 0xf0, 0xf8, - 0x3d, 0x1a, 0x6d, 0x37, 0xdb, 0x07, 0x2e, 0xa6, 0xd8, 0x24, 0xca, 0xf6, 0xa4, 0x40, 0x62, 0x7a, - 0xcb, 0xe8, 0x6c, 0x71, 0x41, 0x95, 0xfe, 0x88, 0xac, 0x41, 0x91, 0x6f, 0x23, 0x1a, 0x8b, 0x4b, - 0x29, 0x16, 0x02, 0xc5, 0x09, 0x9c, 0xa3, 0x30, 0x77, 0xb4, 0x6e, 0x71, 0xdf, 0x27, 0x22, 0x3f, - 0x6d, 0x5d, 0x4f, 0x9d, 0x32, 0x60, 0x2a, 0x74, 0x3e, 0x1b, 0x11, 0x9b, 0x86, 0x34, 0x92, 0xf1, - 0x68, 0x78, 0x82, 0xd5, 0x6b, 0xb1, 0xce, 0x90, 0x2e, 0x8d, 0x57, 0x90, 0x44, 0xec, 0xb4, 0xbd, - 0xb7, 0x88, 0x4a, 0x3a, 0x9b, 0xc1, 0xf4, 0x35, 0x43, 0xb5, 0x39, 0x1b, 0xdf, 0xb7, 0x71, 0x2b, - 0xc3, 0x18, 0x3c, 0x33, 0x71, 0xdb, 0xd8, 0x6f, 0x49, 0x35, 0xae, 0x51, 0xed, 0x2d, 0xe0, 0xca, - 0xc8, 0xf6, 0x5a, 0xa6, 0x09, 0xb7, 0x83, 0x80, 0x7a, 0x9c, 0x38, 0x4f, 0x6d, 0xc9, 0xa2, 0xfe, - 0x18, 0x57, 0x30, 0x8d, 0x9a, 0xbf, 0xfb, 0xeb, 0xc6, 0x82, 0x27, 0x04, 0xba, 0x5d, 0x20, 0xef, - 0xc1, 0xb0, 0x68, 0x23, 0x23, 0x32, 0x1a, 0x1d, 0x76, 0x68, 0x35, 0x52, 0x02, 0x17, 0x12, 0xb6, - 0xd9, 0xc4, 0xc9, 0x1b, 0x7d, 0xde, 0xe6, 0xf7, 0xd8, 0x9e, 0xdd, 0x78, 0x1e, 0xca, 0x25, 0xb9, - 0x79, 0x23, 0x65, 0x49, 0x85, 0x84, 0x91, 0xa0, 0x2e, 0xbb, 0x2c, 0x67, 0xc2, 0xd4, 0x6f, 0x0c, - 0x7e, 0xa8, 0x62, 0x98, 0x29, 0xf5, 0xdb, 0x00, 0x77, 0xdb, 0xb2, 0xd7, 0xa0, 0x58, 0xa9, 0xe3, - 0x86, 0x52, 0xa5, 0x47, 0x4e, 0xeb, 0xd0, 0x0f, 0xa8, 0x3a, 0xfb, 0x24, 0x0b, 0x24, 0xaf, 0x19, - 0xa5, 0xa0, 0x88, 0x82, 0x75, 0xea, 0x60, 0x84, 0xe8, 0x59, 0xa5, 0xa1, 0x24, 0x8a, 0xb2, 0x29, - 0x3a, 0x9c, 0x75, 0xa6, 0x97, 0xd8, 0xe9, 0xac, 0xf9, 0x62, 0x6c, 0x3e, 0xc0, 0x05, 0x43, 0x21, - 0x87, 0x6a, 0x87, 0x50, 0x20, 0x75, 0x2a, 0x94, 0x4f, 0x80, 0x14, 0x6a, 0x45, 0x5e, 0x3d, 0xc7, - 0x62, 0xc9, 0xa3, 0xce, 0xab, 0xfe, 0x7b, 0x30, 0xb1, 0xc2, 0x16, 0xf4, 0x76, 0xc3, 0xe5, 0x51, - 0xf1, 0x89, 0x19, 0xe6, 0x3c, 0x97, 0x70, 0x55, 0xe6, 0xe0, 0x42, 0x52, 0x61, 0x41, 0x90, 0x7b, - 0x8a, 0x06, 0x93, 0xe3, 0x31, 0x2d, 0xd9, 0x8a, 0xc4, 0x04, 0x78, 0xc2, 0x17, 0x26, 0x83, 0x59, - 0xae, 0x58, 0x56, 0x5a, 0xad, 0xa6, 0xb4, 0x6c, 0xf3, 0xeb, 0xfb, 0x57, 0x8d, 0x93, 0x68, 0xaa, - 0x5c, 0xf2, 0x4e, 0xeb, 0x9e, 0x9f, 0x6b, 0x39, 0x71, 0x73, 0x78, 0xe6, 0x94, 0x77, 0x9b, 0x8b, - 0x2a, 0x8e, 0x75, 0xa5, 0xd9, 0x4c, 0x11, 0x87, 0xe4, 0x0d, 0x93, 0x7b, 0x16, 0x4e, 0xb7, 0x1a, - 0xf0, 0xa4, 0xcf, 0x95, 0xb7, 0x4a, 0xab, 0xc5, 0x17, 0xcb, 0xcb, 0x6a, 0xc1, 0x30, 0x0b, 0xd2, - 0x27, 0xfd, 0x64, 0xb9, 0x58, 0xdb, 0xef, 0xe3, 0x34, 0x8b, 0x13, 0xe7, 0x12, 0xfd, 0xdc, 0x9c, - 0xcc, 0x1b, 0xac, 0x74, 0xb9, 0x44, 0xa1, 0xda, 0x27, 0x26, 0x51, 0x83, 0x8a, 0xb3, 0xf0, 0x2a, - 0x03, 0x4f, 0x02, 0x2e, 0xf9, 0x5d, 0xce, 0x2b, 0x56, 0x06, 0xd7, 0x62, 0x32, 0x39, 0xb9, 0xea, - 0x72, 0x4e, 0xd2, 0x7b, 0xd5, 0xe5, 0xdc, 0xac, 0xe6, 0xf7, 0xa1, 0x98, 0xcc, 0x8b, 0xac, 0x98, - 0xe6, 0x24, 0x4c, 0xce, 0x1d, 0x93, 0xbb, 0x30, 0xad, 0x8f, 0xa8, 0xea, 0x77, 0xde, 0xea, 0x9f, - 0xc7, 0x67, 0x07, 0x66, 0x32, 0xd3, 0x18, 0xab, 0x2d, 0xb6, 0x53, 0x92, 0xe3, 0x5c, 0xae, 0x14, - 0xce, 0x67, 0x67, 0x32, 0x27, 0xaf, 0x98, 0xf6, 0x83, 0xec, 0xbc, 0xce, 0x73, 0xaf, 0x76, 0xc1, - 0x12, 0x02, 0xfd, 0x1a, 0x77, 0xc0, 0x54, 0x1d, 0x57, 0x35, 0x8b, 0x42, 0x4e, 0x05, 0x56, 0x27, - 0x14, 0x35, 0x07, 0xa6, 0x33, 0x8a, 0xf3, 0x45, 0x7c, 0x2d, 0x9f, 0x67, 0x3c, 0xb1, 0xf6, 0x64, - 0xb8, 0xe6, 0x5c, 0xc9, 0x74, 0xcc, 0x78, 0xdd, 0xe1, 0x48, 0x3a, 0xa7, 0xe6, 0xc3, 0xe9, 0x9b, - 0x9c, 0xc7, 0xad, 0xa1, 0xac, 0x3f, 0x46, 0x3a, 0xea, 0xa4, 0xf5, 0x27, 0x2b, 0x8d, 0xb6, 0x12, - 0x43, 0xa7, 0x44, 0xed, 0x7c, 0x37, 0xfe, 0x8a, 0x9b, 0x83, 0xcc, 0x2a, 0x74, 0x73, 0x50, 0x26, - 0xff, 0x2b, 0xf9, 0x08, 0x3a, 0x73, 0x87, 0xdf, 0xfd, 0x26, 0xf2, 0x69, 0x13, 0xfd, 0xc4, 0x95, - 0x9d, 0x6b, 0x5b, 0xcd, 0x8d, 0x4c, 0x14, 0xbd, 0x8a, 0x87, 0xf2, 0x1b, 0xcc, 0x91, 0x52, 0x87, - 0x64, 0xe3, 0x9d, 0xd5, 0x94, 0x2d, 0x28, 0xc5, 0x83, 0x99, 0xe8, 0xc0, 0x19, 0x87, 0x52, 0x0a, - 0xe3, 0x42, 0x6e, 0x8a, 0x71, 0xf2, 0x7a, 0xea, 0x4b, 0xcf, 0x11, 0x4c, 0xc7, 0x2a, 0xf8, 0x7a, - 0xae, 0x85, 0x7f, 0xbe, 0x18, 0xdb, 0x82, 0xf5, 0x6c, 0xe4, 0xa9, 0xf5, 0x3c, 0x23, 0x55, 0xf9, - 0x3d, 0xd4, 0x8b, 0xb5, 0x74, 0xe3, 0xb9, 0xbd, 0xbe, 0x94, 0xc5, 0x27, 0x4c, 0xaf, 0xb8, 0x5a, - 0xbb, 0xa4, 0x9e, 0x96, 0x2c, 0x38, 0xcb, 0x8a, 0x7b, 0x9a, 0xa6, 0xe5, 0xf1, 0x59, 0x86, 0x51, - 0x2d, 0x4f, 0x39, 0xb9, 0x60, 0x88, 0xc9, 0xd8, 0x43, 0xe7, 0x8c, 0xce, 0x99, 0xdb, 0xe7, 0x12, - 0x5a, 0xa4, 0x55, 0xb6, 0xf3, 0xdc, 0x56, 0x5c, 0x4c, 0xf3, 0x30, 0xac, 0xd1, 0x4a, 0x0a, 0xbc, - 0x35, 0xf3, 0x49, 0xe1, 0x18, 0x0d, 0xca, 0xef, 0x12, 0xd1, 0x45, 0xd3, 0xa5, 0x49, 0xf9, 0xfa, - 0xeb, 0x94, 0x48, 0x86, 0x8a, 0x39, 0x5b, 0x64, 0xe8, 0xc0, 0xf3, 0xca, 0xb4, 0xa6, 0x41, 0x3b, - 0x58, 0x3a, 0xb6, 0xf1, 0x05, 0x4a, 0x46, 0xe2, 0x76, 0xb5, 0xc2, 0x76, 0xcc, 0xeb, 0x9e, 0xa1, - 0xbb, 0xa9, 0x35, 0x3b, 0x97, 0x63, 0xc7, 0x4c, 0xee, 0xb9, 0x2d, 0xfd, 0x81, 0xb6, 0x66, 0xa7, - 0xd2, 0xb3, 0x93, 0xeb, 0x49, 0xc5, 0x2d, 0x2f, 0x83, 0x7b, 0x87, 0x3d, 0x61, 0x3a, 0x2b, 0xb3, - 0xbb, 0x66, 0x1e, 0xce, 0x4d, 0xfb, 0x9e, 0x21, 0x05, 0x5b, 0xce, 0xff, 0x1c, 0x6e, 0x1d, 0xf2, - 0xbc, 0xe7, 0xb6, 0xf0, 0x4b, 0x6d, 0xa1, 0x4b, 0xe4, 0x63, 0x57, 0xc7, 0xf1, 0x2e, 0x09, 0xdb, - 0x73, 0x79, 0x6f, 0xe2, 0x9b, 0xa5, 0x74, 0x32, 0x75, 0xa5, 0xd9, 0x74, 0x4a, 0xb5, 0x9e, 0x69, - 0x3d, 0x9e, 0x49, 0x77, 0x91, 0xf1, 0x3b, 0x9f, 0xb0, 0xfd, 0x76, 0x6b, 0xd8, 0xd7, 0x72, 0x31, - 0xce, 0x48, 0xc2, 0x9e, 0x58, 0x8c, 0xf3, 0xd3, 0xb4, 0x77, 0x38, 0x06, 0x4d, 0x56, 0xdd, 0x03, - 0x4f, 0xcb, 0xa1, 0xae, 0x0e, 0x41, 0xe9, 0xb4, 0xee, 0x6a, 0x89, 0xc9, 0x4a, 0xb9, 0xbe, 0xc5, - 0xf4, 0x1f, 0xae, 0xbd, 0xeb, 0xd9, 0xb0, 0xc9, 0x5c, 0x7e, 0x12, 0x70, 0xb5, 0xdc, 0x64, 0xa6, - 0xcf, 0xd6, 0x18, 0xea, 0xa9, 0xa8, 0x15, 0xc3, 0x8c, 0xac, 0xd8, 0x8a, 0x61, 0x66, 0xee, 0xea, - 0x5b, 0x68, 0x75, 0xb1, 0xfd, 0x26, 0xd5, 0xad, 0x2e, 0x5a, 0x6e, 0xe3, 0x84, 0xd1, 0x83, 0x7c, - 0x88, 0x26, 0x8f, 0xce, 0x76, 0x92, 0x59, 0x93, 0x93, 0xee, 0x59, 0x32, 0xa2, 0x12, 0x47, 0x2b, - 0x1b, 0x7b, 0x32, 0x77, 0xf5, 0x5c, 0x29, 0x5d, 0x20, 0xe8, 0xdf, 0x91, 0x56, 0x13, 0x6c, 0x70, - 0xc9, 0xb4, 0x36, 0xe5, 0xb7, 0xf9, 0x1d, 0x69, 0x32, 0x31, 0xc8, 0x52, 0x69, 0xa3, 0x93, 0x64, - 0xdf, 0x83, 0xb1, 0x38, 0x45, 0xf4, 0xde, 0x82, 0x46, 0x98, 0xc8, 0x1b, 0x9d, 0x24, 0x7c, 0x4f, - 0x5e, 0xab, 0x60, 0x7d, 0x66, 0x61, 0x67, 0x15, 0xe0, 0x63, 0x69, 0xa2, 0x31, 0x5a, 0x9a, 0x4a, - 0x38, 0xdd, 0x61, 0xe5, 0x1e, 0xd3, 0xf3, 0x5a, 0xaa, 0x79, 0x91, 0x91, 0x99, 0x56, 0xcd, 0x8b, - 0xac, 0xcc, 0xb2, 0xf1, 0xb5, 0xc3, 0x17, 0xd2, 0x1e, 0x11, 0x33, 0xbd, 0x64, 0x34, 0x2b, 0xc5, - 0xf7, 0x72, 0x5e, 0x71, 0x92, 0x75, 0x15, 0x8a, 0xc9, 0x24, 0x9c, 0xea, 0x30, 0x97, 0x93, 0x2d, - 0x55, 0x9d, 0x10, 0x73, 0xb3, 0x77, 0x6e, 0x4b, 0xe3, 0xba, 0xc9, 0xf7, 0x6a, 0x76, 0xa3, 0x74, - 0xd6, 0xf9, 0xd6, 0xf6, 0x71, 0x23, 0x1f, 0xa7, 0x7e, 0xcc, 0x4e, 0xe5, 0xfb, 0xd4, 0xd5, 0xb2, - 0x8c, 0x14, 0x9e, 0xae, 0x8c, 0x3a, 0x95, 0x9d, 0x16, 0xfc, 0x0d, 0xf3, 0xfc, 0xdb, 0x21, 0x78, - 0x7b, 0xd7, 0x2b, 0x68, 0xf2, 0x4b, 0x30, 0x9b, 0x13, 0xe7, 0x9a, 0xbc, 0x9a, 0x30, 0xd3, 0x66, - 0xc7, 0xc1, 0x56, 0x13, 0x24, 0x33, 0x51, 0xf6, 0x06, 0xfa, 0x2e, 0x18, 0xf1, 0x25, 0x52, 0xf7, - 0x81, 0x0f, 0xdd, 0xe8, 0x90, 0xe7, 0x83, 0xd6, 0xd6, 0xdc, 0xcc, 0xc0, 0x14, 0xa4, 0x8a, 0x07, - 0x19, 0x03, 0x9a, 0x71, 0x25, 0x98, 0xc1, 0x70, 0x2e, 0x9b, 0x21, 0x5b, 0x3b, 0xd8, 0x5c, 0xc8, - 0x08, 0xfe, 0xa1, 0xe6, 0x42, 0x7e, 0x60, 0x90, 0xdc, 0x66, 0x6e, 0x4b, 0x05, 0x2b, 0x9b, 0x63, - 0x7e, 0x1c, 0x90, 0x5c, 0x8e, 0xf7, 0x19, 0xc7, 0x54, 0x68, 0x0f, 0x92, 0x83, 0xde, 0x79, 0xf5, - 0xb0, 0xe5, 0x7e, 0x6d, 0x52, 0x2d, 0x68, 0xed, 0xcb, 0x0b, 0x22, 0x92, 0xdb, 0xbe, 0x15, 0xf9, - 0x3d, 0x65, 0xb7, 0xef, 0xb4, 0x3b, 0xb6, 0xba, 0x3c, 0x4b, 0x44, 0x97, 0x31, 0x3a, 0xaa, 0xc1, - 0xe7, 0x72, 0xe0, 0x64, 0x13, 0x9d, 0x91, 0x92, 0x50, 0xed, 0x44, 0x9b, 0x1d, 0xbe, 0x26, 0x97, - 0x1f, 0x9f, 0xc7, 0x46, 0xf8, 0x8f, 0xb3, 0xcc, 0xe3, 0x44, 0xdc, 0x10, 0x31, 0x8f, 0x0d, 0xe8, - 0xd9, 0xe6, 0x71, 0x82, 0xa1, 0x39, 0x8f, 0x93, 0xcd, 0x4c, 0x9a, 0x09, 0x72, 0x47, 0x35, 0xd9, - 0x4c, 0x35, 0x8f, 0xb3, 0x39, 0xe6, 0x87, 0x69, 0xc9, 0xe5, 0xa8, 0xe6, 0xb1, 0xc9, 0x31, 0x07, - 0xfd, 0x94, 0xf3, 0x38, 0x59, 0x89, 0x39, 0x8f, 0xcf, 0xd4, 0x3e, 0x35, 0x8f, 0xb3, 0xdb, 0x77, - 0xe6, 0x79, 0x9c, 0x88, 0x6b, 0x64, 0x74, 0x34, 0x6b, 0x1e, 0x27, 0xf1, 0xf9, 0x3c, 0x4e, 0x42, - 0x13, 0x96, 0x99, 0x0e, 0xf3, 0x38, 0x49, 0xf9, 0x19, 0xf2, 0x4b, 0xc4, 0x64, 0x39, 0xcd, 0x4c, - 0xce, 0x0d, 0xe7, 0x42, 0x1e, 0xa2, 0x6d, 0x30, 0x01, 0x3f, 0xdd, 0x6c, 0x9e, 0xcf, 0x63, 0x8a, - 0xf3, 0x79, 0x4f, 0x0a, 0x31, 0xd9, 0x5c, 0xd3, 0xf0, 0x95, 0x1d, 0x92, 0xa6, 0x43, 0x83, 0xf7, - 0xd8, 0xbc, 0x69, 0x74, 0xe0, 0xdb, 0x29, 0xa2, 0x4e, 0x07, 0xbe, 0xea, 0x1c, 0x94, 0xe4, 0x9b, - 0x4b, 0xd2, 0x79, 0x7e, 0x7f, 0x2e, 0x6f, 0x47, 0x92, 0x74, 0x0b, 0x89, 0x93, 0xd5, 0x99, 0x5b, - 0xaa, 0x4e, 0x58, 0xc9, 0x96, 0x9e, 0x75, 0x9e, 0x6f, 0x48, 0xed, 0x21, 0x15, 0x8a, 0x2b, 0xd1, + // 15058 bytes of a gzipped FileDescriptorProto + 0x1f, 0x8b, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0xff, 0xcc, 0xbd, 0x59, 0x6c, 0x5c, 0xcb, + 0x76, 0x18, 0xca, 0xe6, 0xcc, 0xc5, 0x41, 0xad, 0x22, 0x29, 0xb6, 0xa8, 0xa1, 0xa5, 0xad, 0x33, + 0xe8, 0xe8, 0x9e, 0xab, 0x81, 0x67, 0xb8, 0x67, 0xba, 0xe7, 0x9c, 0xe6, 0x20, 0x91, 0x12, 0xa7, + 0xb3, 0x9b, 0xa4, 0xce, 0xe4, 0xdb, 0x77, 0xab, 0xbb, 0x44, 0x6e, 0xab, 0xb9, 0x77, 0xdf, 0xbd, + 0x77, 0x4b, 0x47, 0xd7, 0xcf, 0x7e, 0xb0, 0xfd, 0x06, 0xff, 0xbc, 0xf7, 0x6c, 0xe0, 0x3d, 0xc3, + 0x0f, 0xfe, 0xf0, 0x7b, 0x40, 0x02, 0x04, 0x01, 0x12, 0xe4, 0x27, 0xf0, 0x4f, 0xfc, 0x11, 0xe4, + 0x23, 0x37, 0x06, 0x82, 0x24, 0xb0, 0xfd, 0x13, 0x20, 0x74, 0x72, 0x01, 0xff, 0x10, 0xc9, 0x87, + 0x11, 0x24, 0x40, 0x2e, 0x60, 0x20, 0xa8, 0x55, 0xc3, 0xae, 0xda, 0x53, 0x93, 0x3a, 0x3a, 0xd7, + 0xf9, 0x91, 0xd8, 0xab, 0xd6, 0x5a, 0x55, 0xb5, 0xaa, 0x76, 0xd5, 0xaa, 0x55, 0xab, 0xd6, 0x82, + 0x9b, 0x11, 0x6d, 0xd3, 0x8e, 0x1f, 0x44, 0xb7, 0xda, 0x74, 0xdf, 0x69, 0x3e, 0xbf, 0xd5, 0x6c, + 0xbb, 0xd4, 0x8b, 0x6e, 0x75, 0x02, 0x3f, 0xf2, 0x6f, 0x39, 0xdd, 0xe8, 0x20, 0xa4, 0xc1, 0x53, + 0xb7, 0x49, 0x6f, 0x22, 0x84, 0x0c, 0xe1, 0x7f, 0xf3, 0x33, 0xfb, 0xfe, 0xbe, 0xcf, 0x71, 0xd8, + 0x5f, 0xbc, 0x70, 0xfe, 0xc2, 0xbe, 0xef, 0xef, 0xb7, 0x29, 0x27, 0x7e, 0xd4, 0x7d, 0x7c, 0x8b, + 0x1e, 0x76, 0xa2, 0xe7, 0xa2, 0xb0, 0x9a, 0x2c, 0x8c, 0xdc, 0x43, 0x1a, 0x46, 0xce, 0x61, 0x47, + 0x20, 0xbc, 0xa1, 0x9a, 0xe2, 0x44, 0x11, 0x2b, 0x89, 0x5c, 0xdf, 0xbb, 0xf5, 0xf4, 0x8e, 0xfe, + 0x53, 0xa0, 0x5e, 0x2f, 0x6c, 0x75, 0x93, 0x06, 0x51, 0x78, 0x22, 0x4c, 0xfa, 0x94, 0x7a, 0x51, + 0xaa, 0x7a, 0x81, 0x19, 0x3d, 0xef, 0xd0, 0x90, 0xa3, 0xc8, 0xff, 0x04, 0xea, 0xd5, 0x6c, 0x54, + 0xfc, 0x57, 0xa0, 0x7c, 0x3f, 0x1b, 0xe5, 0x19, 0x7d, 0xc4, 0x64, 0xea, 0xa9, 0x3f, 0x7a, 0xa0, + 0x07, 0x4e, 0xa7, 0x43, 0x83, 0xf8, 0x0f, 0x81, 0x7e, 0x5e, 0xa1, 0x1f, 0x3e, 0x76, 0x98, 0x88, + 0x0e, 0x1f, 0x3b, 0xa9, 0x6e, 0x74, 0x43, 0x67, 0x9f, 0x8a, 0xe6, 0x3f, 0xbd, 0xa3, 0xff, 0xe4, + 0xa8, 0xd6, 0x1f, 0x95, 0x60, 0xe8, 0xa1, 0x13, 0x35, 0x0f, 0xc8, 0x27, 0x30, 0xf4, 0xc0, 0xf5, + 0x5a, 0x61, 0xa5, 0x74, 0x65, 0xe0, 0xfa, 0xf8, 0x42, 0xf9, 0x26, 0xef, 0x0a, 0x16, 0xb2, 0x82, + 0xc5, 0xb9, 0x9f, 0x1d, 0x55, 0xfb, 0x8e, 0x8f, 0xaa, 0x67, 0x9e, 0x30, 0xb4, 0x37, 0xfd, 0x43, + 0x37, 0xc2, 0xb1, 0xb5, 0x39, 0x1d, 0xd9, 0x85, 0xe9, 0x5a, 0xbb, 0xed, 0x3f, 0xdb, 0x76, 0x82, + 0xc8, 0x75, 0xda, 0xf5, 0x6e, 0xb3, 0x49, 0xc3, 0xb0, 0xd2, 0x7f, 0xa5, 0x74, 0x7d, 0x74, 0xf1, + 0xda, 0xf1, 0x51, 0xb5, 0xea, 0xb0, 0xe2, 0x46, 0x87, 0x97, 0x37, 0x42, 0x8e, 0xa0, 0x31, 0xca, + 0xa2, 0xb7, 0xfe, 0x74, 0x18, 0xca, 0xab, 0x7e, 0x18, 0x2d, 0xb1, 0x11, 0xb5, 0xe9, 0x4f, 0xba, + 0x34, 0x8c, 0xc8, 0x35, 0x18, 0x66, 0xb0, 0xb5, 0xe5, 0x4a, 0xe9, 0x4a, 0xe9, 0xfa, 0xd8, 0xe2, + 0xf8, 0xf1, 0x51, 0x75, 0xe4, 0xc0, 0x0f, 0xa3, 0x86, 0xdb, 0xb2, 0x45, 0x11, 0x79, 0x03, 0x46, + 0x37, 0xfd, 0x16, 0xdd, 0x74, 0x0e, 0x29, 0xb6, 0x62, 0x6c, 0x71, 0xf2, 0xf8, 0xa8, 0x3a, 0xe6, + 0xf9, 0x2d, 0xda, 0xf0, 0x9c, 0x43, 0x6a, 0xab, 0x62, 0xb2, 0x07, 0x83, 0xb6, 0xdf, 0xa6, 0x95, + 0x01, 0x44, 0x5b, 0x3c, 0x3e, 0xaa, 0x0e, 0x06, 0x7e, 0x9b, 0xfe, 0xe2, 0xa8, 0xfa, 0xee, 0xbe, + 0x1b, 0x1d, 0x74, 0x1f, 0xdd, 0x6c, 0xfa, 0x87, 0xb7, 0xf6, 0x03, 0xe7, 0xa9, 0xcb, 0x27, 0xa1, + 0xd3, 0xbe, 0x15, 0x4f, 0xd5, 0x8e, 0x2b, 0xc6, 0xbd, 0xfe, 0x3c, 0x8c, 0xe8, 0x21, 0xe3, 0x64, + 0x23, 0x3f, 0xf2, 0x10, 0x66, 0x6a, 0xad, 0x96, 0xcb, 0x29, 0xb6, 0x03, 0xd7, 0x6b, 0xba, 0x1d, + 0xa7, 0x1d, 0x56, 0x06, 0xaf, 0x0c, 0x5c, 0x1f, 0x13, 0x42, 0x51, 0xe5, 0x8d, 0x8e, 0x42, 0xd0, + 0x84, 0x92, 0xc9, 0x80, 0xbc, 0x05, 0xa3, 0xcb, 0x9b, 0x75, 0xd6, 0xf6, 0xb0, 0x32, 0x84, 0xcc, + 0xe6, 0x8e, 0x8f, 0xaa, 0xd3, 0x2d, 0x2f, 0xc4, 0xae, 0xe9, 0x0c, 0x14, 0x22, 0x79, 0x17, 0x26, + 0xb6, 0xbb, 0x8f, 0xda, 0x6e, 0x73, 0x67, 0xbd, 0xfe, 0x80, 0x3e, 0xaf, 0x0c, 0x5f, 0x29, 0x5d, + 0x9f, 0x58, 0x24, 0xc7, 0x47, 0xd5, 0xa9, 0x0e, 0xc2, 0x1b, 0x51, 0x3b, 0x6c, 0x3c, 0xa1, 0xcf, + 0x6d, 0x03, 0x2f, 0xa6, 0xab, 0xd7, 0x57, 0x19, 0xdd, 0x48, 0x8a, 0x2e, 0x0c, 0x0f, 0x74, 0x3a, + 0x8e, 0x47, 0x6e, 0x01, 0xd8, 0xf4, 0xd0, 0x8f, 0x68, 0xad, 0xd5, 0x0a, 0x2a, 0xa3, 0x28, 0xdb, + 0x33, 0xc7, 0x47, 0xd5, 0xf1, 0x00, 0xa1, 0x0d, 0xa7, 0xd5, 0x0a, 0x6c, 0x0d, 0x85, 0x2c, 0xc1, + 0xa8, 0xed, 0x73, 0x01, 0x57, 0xc6, 0xae, 0x94, 0xae, 0x8f, 0x2f, 0x9c, 0x11, 0xd3, 0x50, 0x82, + 0x17, 0xcf, 0x1d, 0x1f, 0x55, 0x49, 0x20, 0x7e, 0xe9, 0xbd, 0x94, 0x18, 0xa4, 0x0a, 0x23, 0x9b, + 0xfe, 0x92, 0xd3, 0x3c, 0xa0, 0x15, 0xc0, 0xb9, 0x37, 0x74, 0x7c, 0x54, 0x2d, 0x7d, 0xdf, 0x96, + 0x50, 0xf2, 0x14, 0xc6, 0xe3, 0x81, 0x0a, 0x2b, 0xe3, 0x28, 0xbe, 0x9d, 0xe3, 0xa3, 0xea, 0xb9, + 0x10, 0xc1, 0x0d, 0x36, 0xf4, 0x9a, 0x04, 0xbf, 0xc5, 0x2c, 0xd0, 0x2b, 0x22, 0x5f, 0xc3, 0x6c, + 0xfc, 0xb3, 0x16, 0x86, 0x34, 0x60, 0x3c, 0xd6, 0x96, 0x2b, 0x93, 0x28, 0x99, 0xd7, 0x8e, 0x8f, + 0xaa, 0x96, 0xd6, 0x82, 0x86, 0x23, 0x51, 0x1a, 0x6e, 0x4b, 0xeb, 0x69, 0x36, 0x93, 0xfb, 0x83, + 0xa3, 0x13, 0xe5, 0x49, 0xfb, 0xd2, 0xae, 0x17, 0x46, 0xce, 0xa3, 0x36, 0xcd, 0x44, 0xb2, 0xfe, + 0xa6, 0x04, 0x64, 0xab, 0x43, 0xbd, 0x7a, 0x7d, 0x95, 0x7d, 0x4f, 0xf2, 0x73, 0x7a, 0x13, 0xc6, + 0xf8, 0xc0, 0xb1, 0xd1, 0xed, 0xc7, 0xd1, 0x9d, 0x3a, 0x3e, 0xaa, 0x82, 0x18, 0x5d, 0x36, 0xb2, + 0x31, 0x02, 0x79, 0x15, 0x06, 0x76, 0x76, 0xd6, 0xf1, 0x5b, 0x19, 0x58, 0x9c, 0x3e, 0x3e, 0xaa, + 0x0e, 0x44, 0x51, 0xfb, 0x17, 0x47, 0xd5, 0xd1, 0xe5, 0x6e, 0x80, 0x62, 0xb1, 0x59, 0x39, 0x79, + 0x15, 0x46, 0x96, 0xda, 0xdd, 0x30, 0xa2, 0x41, 0x65, 0x30, 0xfe, 0x48, 0x9b, 0x1c, 0x64, 0xcb, + 0x32, 0xf2, 0x3d, 0x18, 0xdc, 0x0d, 0x69, 0x50, 0x19, 0xc2, 0xf1, 0x9e, 0x14, 0xe3, 0xcd, 0x40, + 0x7b, 0x0b, 0x8b, 0xa3, 0xec, 0x4b, 0xec, 0x86, 0x34, 0xb0, 0x11, 0x89, 0xdc, 0x84, 0x21, 0x3e, + 0x68, 0xc3, 0xb8, 0x48, 0x4d, 0xaa, 0xd9, 0xd1, 0xa6, 0x7b, 0xef, 0x2e, 0x8e, 0x1d, 0x1f, 0x55, + 0x87, 0x70, 0xf0, 0x6c, 0x8e, 0x76, 0x7f, 0x70, 0xb4, 0x54, 0xee, 0xb7, 0x47, 0x19, 0x2d, 0xfb, + 0x2c, 0xac, 0xef, 0xc1, 0xb8, 0xd6, 0x7d, 0x72, 0x11, 0x06, 0xd9, 0xff, 0xb8, 0x88, 0x4c, 0xf0, + 0xca, 0xd8, 0xc6, 0x61, 0x23, 0xd4, 0xfa, 0xff, 0xa6, 0xa1, 0xcc, 0x28, 0x8d, 0x95, 0xe7, 0xa6, + 0x2e, 0x2a, 0x4e, 0x57, 0x36, 0x45, 0x55, 0x29, 0xe9, 0xc2, 0xba, 0x0e, 0xaa, 0x76, 0xb1, 0x08, + 0x4d, 0x1c, 0x1f, 0x55, 0x47, 0xbb, 0x02, 0x16, 0xb7, 0x8d, 0xd4, 0x61, 0x64, 0xe5, 0x9b, 0x8e, + 0x1b, 0xd0, 0x10, 0x45, 0x3b, 0xbe, 0x30, 0x7f, 0x93, 0x6f, 0x97, 0x37, 0xe5, 0x76, 0x79, 0x73, + 0x47, 0x6e, 0x97, 0x8b, 0x97, 0xc4, 0x62, 0x7c, 0x96, 0x72, 0x92, 0x78, 0x7e, 0xfc, 0xee, 0x5f, + 0x56, 0x4b, 0xb6, 0xe4, 0x44, 0xde, 0x84, 0xe1, 0xbb, 0x7e, 0x70, 0xe8, 0x44, 0x62, 0x0c, 0x66, + 0x8e, 0x8f, 0xaa, 0xe5, 0xc7, 0x08, 0xd1, 0xa6, 0x94, 0xc0, 0x21, 0x77, 0x61, 0xca, 0xf6, 0xbb, + 0x11, 0xdd, 0xf1, 0xe5, 0xc8, 0x0d, 0x21, 0xd5, 0xe5, 0xe3, 0xa3, 0xea, 0x7c, 0xc0, 0x4a, 0x1a, + 0x91, 0xdf, 0x10, 0x43, 0xa8, 0xd1, 0x27, 0xa8, 0xc8, 0x0a, 0x4c, 0xd5, 0x70, 0xf5, 0x16, 0x52, + 0xe3, 0xe3, 0x35, 0xb6, 0x78, 0xe9, 0xf8, 0xa8, 0x7a, 0xde, 0xc1, 0x92, 0x46, 0x20, 0x8a, 0x74, + 0x36, 0x26, 0x11, 0xd9, 0x84, 0xb3, 0x0f, 0xba, 0x8f, 0x68, 0xe0, 0xd1, 0x88, 0x86, 0xb2, 0x45, + 0x23, 0xd8, 0xa2, 0x2b, 0xc7, 0x47, 0xd5, 0x8b, 0x4f, 0x54, 0x61, 0x46, 0x9b, 0xd2, 0xa4, 0x84, + 0xc2, 0x19, 0xd1, 0xd0, 0x65, 0x27, 0x72, 0x1e, 0x39, 0x21, 0xc5, 0x45, 0x69, 0x7c, 0xe1, 0x1c, + 0x17, 0xf1, 0xcd, 0x44, 0xe9, 0xe2, 0x35, 0x21, 0xe5, 0x0b, 0xaa, 0xef, 0x2d, 0x51, 0xa4, 0x55, + 0x94, 0xe4, 0xc9, 0xd6, 0x66, 0xb5, 0xef, 0x8c, 0x61, 0x6b, 0x71, 0x6d, 0x56, 0xfb, 0x8e, 0xbe, + 0x6a, 0xa9, 0x1d, 0x68, 0x1d, 0x86, 0x76, 0xd9, 0xee, 0x8c, 0x6b, 0xd6, 0xd4, 0xc2, 0x55, 0xd1, + 0xa2, 0xe4, 0xfc, 0xbb, 0xc9, 0x7e, 0x20, 0x22, 0x7e, 0x79, 0x67, 0x70, 0x47, 0xd7, 0xf7, 0x62, + 0x2c, 0x23, 0x9f, 0x01, 0x88, 0x56, 0xd5, 0x3a, 0x9d, 0xca, 0x38, 0x76, 0xf2, 0xac, 0xd9, 0xc9, + 0x5a, 0xa7, 0xb3, 0x78, 0x59, 0xf4, 0xef, 0x9c, 0xea, 0x9f, 0xd3, 0xe9, 0x68, 0xdc, 0x34, 0x26, + 0xe4, 0x13, 0x98, 0xc0, 0x25, 0x4d, 0x8e, 0xe8, 0x04, 0x8e, 0xe8, 0x85, 0xe3, 0xa3, 0xea, 0x1c, + 0xae, 0x56, 0x19, 0xe3, 0x69, 0x10, 0x90, 0xdf, 0x80, 0x59, 0xc1, 0xee, 0xa1, 0xeb, 0xb5, 0xfc, + 0x67, 0xe1, 0x32, 0x0d, 0x9f, 0x44, 0x7e, 0x07, 0x97, 0xbf, 0xf1, 0x85, 0x8b, 0x66, 0xf3, 0x4c, + 0x9c, 0xc5, 0x1b, 0xa2, 0xa5, 0x96, 0x6a, 0xe9, 0x33, 0x8e, 0xd0, 0x68, 0x71, 0x0c, 0x7d, 0x81, + 0xcc, 0x64, 0x41, 0xd6, 0xe0, 0xcc, 0x6e, 0x48, 0x8d, 0x3e, 0x4c, 0xe1, 0xfe, 0x50, 0x65, 0x23, + 0xdc, 0x0d, 0x69, 0x23, 0xaf, 0x1f, 0x49, 0x3a, 0x62, 0x03, 0x59, 0x0e, 0xfc, 0x4e, 0x62, 0x8e, + 0x9f, 0x41, 0x89, 0x58, 0xc7, 0x47, 0xd5, 0xcb, 0xad, 0xc0, 0xef, 0x34, 0xf2, 0x27, 0x7a, 0x06, + 0x35, 0xf9, 0x11, 0x9c, 0x5b, 0xf2, 0x3d, 0x8f, 0x36, 0xd9, 0x0a, 0xba, 0xec, 0x3a, 0xfb, 0x9e, + 0x1f, 0x46, 0x6e, 0x73, 0x6d, 0xb9, 0x52, 0x8e, 0xb7, 0x87, 0xa6, 0xc2, 0x68, 0xb4, 0x14, 0x8a, + 0xb9, 0x3d, 0xe4, 0x70, 0x21, 0x5f, 0xc1, 0xa4, 0xa8, 0x8b, 0x06, 0x38, 0x35, 0xcf, 0x16, 0x4f, + 0x34, 0x85, 0xcc, 0x37, 0xfa, 0x40, 0xfe, 0xe4, 0xaa, 0x93, 0xc9, 0x8b, 0x7c, 0x0d, 0xe3, 0x1b, + 0x77, 0x6b, 0x36, 0x0d, 0x3b, 0xbe, 0x17, 0xd2, 0x0a, 0xc1, 0x11, 0xbd, 0x2c, 0x58, 0x6f, 0xdc, + 0xad, 0xd5, 0xba, 0xd1, 0x01, 0xf5, 0x22, 0xb7, 0xe9, 0x44, 0x54, 0x62, 0x2d, 0xce, 0xb3, 0x99, + 0x77, 0xf8, 0xd8, 0x69, 0x04, 0x02, 0xa2, 0xf5, 0x42, 0x67, 0x47, 0xe6, 0x61, 0xb4, 0x5e, 0x5f, + 0x5d, 0xf7, 0xf7, 0x5d, 0xaf, 0x32, 0xcd, 0x84, 0x61, 0xab, 0xdf, 0xe4, 0x31, 0xcc, 0x6a, 0x67, + 0x83, 0x06, 0xfb, 0x9f, 0x1e, 0x52, 0x2f, 0xaa, 0xcc, 0x60, 0x1b, 0xbe, 0xaf, 0x0e, 0x37, 0x37, + 0xf5, 0x23, 0xc4, 0xd3, 0x3b, 0x37, 0x6b, 0xf1, 0xcf, 0xba, 0x24, 0x5a, 0xec, 0xaf, 0x94, 0xec, + 0x19, 0x27, 0xa3, 0x84, 0xec, 0xc0, 0xc8, 0x76, 0x37, 0xe8, 0xf8, 0x21, 0xad, 0xcc, 0xa2, 0xe0, + 0xae, 0x15, 0x7d, 0xa1, 0x02, 0x75, 0x71, 0x96, 0x2d, 0xd1, 0x1d, 0xfe, 0x43, 0xeb, 0x9d, 0x64, + 0x45, 0x3e, 0x85, 0x89, 0x7a, 0x7d, 0x35, 0xde, 0x50, 0xce, 0xe1, 0x86, 0x72, 0xf1, 0xf8, 0xa8, + 0x5a, 0x61, 0x2a, 0x55, 0xbc, 0xa9, 0xe8, 0x5f, 0x95, 0x4e, 0xc1, 0x38, 0xec, 0xac, 0xd7, 0x63, + 0x0e, 0x73, 0x31, 0x07, 0xa6, 0xcc, 0x65, 0x73, 0xd0, 0x29, 0xc8, 0x3f, 0x28, 0xc1, 0x15, 0x9d, + 0x65, 0x96, 0x60, 0x2a, 0xe7, 0x5f, 0x44, 0x9a, 0x0b, 0xc7, 0x47, 0xd5, 0x9b, 0x66, 0x3f, 0x1a, + 0x99, 0x83, 0xa5, 0xb5, 0xad, 0x67, 0x53, 0xb0, 0xbd, 0x7a, 0x07, 0x32, 0xdb, 0x3b, 0xff, 0xc2, + 0xed, 0x35, 0xa5, 0xd6, 0xbb, 0xbd, 0xbd, 0x9a, 0x62, 0x7d, 0x0e, 0x63, 0x6a, 0xd1, 0x26, 0x23, + 0x30, 0x50, 0x6b, 0xb7, 0xcb, 0x7d, 0xec, 0x8f, 0x7a, 0x7d, 0xb5, 0x5c, 0x22, 0x53, 0x00, 0xf1, + 0x4e, 0x55, 0xee, 0x27, 0x13, 0x30, 0x2a, 0x77, 0x92, 0xf2, 0x00, 0xe2, 0x77, 0x3a, 0xe5, 0x41, + 0x42, 0x60, 0xca, 0x5c, 0xcf, 0xca, 0x43, 0xd6, 0xef, 0x95, 0x60, 0x4c, 0x7d, 0x87, 0xe4, 0x0c, + 0x8c, 0xef, 0x6e, 0xd6, 0xb7, 0x57, 0x96, 0xd6, 0xee, 0xae, 0xad, 0x2c, 0x97, 0xfb, 0xc8, 0x25, + 0x38, 0xbf, 0x53, 0x5f, 0x6d, 0x2c, 0x2f, 0x36, 0xd6, 0xb7, 0x96, 0x6a, 0xeb, 0x8d, 0x6d, 0x7b, + 0xeb, 0xf3, 0x2f, 0x1a, 0x3b, 0xbb, 0x9b, 0x9b, 0x2b, 0xeb, 0xe5, 0x12, 0xa9, 0xc0, 0x0c, 0x2b, + 0x7e, 0xb0, 0xbb, 0xb8, 0xa2, 0x23, 0x94, 0xfb, 0xc9, 0x55, 0xb8, 0x94, 0x55, 0xd2, 0x58, 0x5d, + 0xa9, 0x2d, 0xaf, 0xaf, 0xd4, 0xeb, 0xe5, 0x01, 0x32, 0x07, 0xd3, 0x0c, 0xa5, 0xb6, 0xbd, 0x6d, + 0xd0, 0x0e, 0x5a, 0x6d, 0x18, 0xd7, 0x3e, 0x00, 0x72, 0x11, 0x2a, 0x4b, 0x2b, 0xf6, 0x4e, 0x63, + 0x7b, 0xd7, 0xde, 0xde, 0xaa, 0xaf, 0x34, 0xcc, 0x16, 0x26, 0x4b, 0xd7, 0xb7, 0xee, 0xad, 0x6d, + 0x36, 0x18, 0xa8, 0x5e, 0x2e, 0xb1, 0x66, 0x18, 0xa5, 0xf5, 0xb5, 0xcd, 0x7b, 0xeb, 0x2b, 0x8d, + 0xdd, 0xfa, 0x8a, 0x40, 0xe9, 0xb7, 0x7e, 0xab, 0x3f, 0xb5, 0xa5, 0x93, 0x05, 0x18, 0xaf, 0x73, + 0x7b, 0x05, 0x2e, 0x73, 0xfc, 0x80, 0xc8, 0x74, 0xb4, 0x09, 0x61, 0xc6, 0xe0, 0x2b, 0x98, 0x8e, + 0xc4, 0xb4, 0xb4, 0x6d, 0xf6, 0x35, 0x37, 0xfd, 0xb6, 0xae, 0xa5, 0x75, 0x04, 0xcc, 0x56, 0xa5, + 0x64, 0x41, 0xd3, 0xe7, 0xf8, 0x69, 0x11, 0x4f, 0x24, 0x52, 0x9f, 0xd3, 0xf7, 0x76, 0xa5, 0xd9, + 0x2d, 0xc4, 0x43, 0x2a, 0xd4, 0x30, 0xa4, 0xc9, 0xd0, 0x25, 0x14, 0x1e, 0x79, 0x43, 0x6a, 0xba, + 0xfc, 0x74, 0x87, 0x9b, 0x7d, 0xe2, 0x5c, 0x22, 0x94, 0x5c, 0xab, 0x9b, 0xb3, 0xb1, 0x92, 0x0f, + 0x93, 0x73, 0x46, 0x08, 0x03, 0x99, 0x25, 0xf6, 0x4f, 0x3b, 0x81, 0x4a, 0xaa, 0x30, 0xc4, 0x57, + 0x5c, 0x2e, 0x0f, 0xd4, 0xad, 0xdb, 0x0c, 0x60, 0x73, 0xb8, 0xf5, 0xfb, 0x03, 0xba, 0x92, 0xc1, + 0x74, 0x69, 0x4d, 0xde, 0xa8, 0x4b, 0xa3, 0x9c, 0x11, 0xca, 0x8e, 0x82, 0xfc, 0x2b, 0xc1, 0xa3, + 0xe0, 0x40, 0x7c, 0x14, 0x14, 0x9f, 0x1a, 0x3f, 0x0a, 0xc6, 0x28, 0x6c, 0x14, 0x85, 0xda, 0x86, + 0x5c, 0x07, 0xe3, 0x51, 0x14, 0xaa, 0x9e, 0x18, 0x45, 0x0d, 0x89, 0x7c, 0x00, 0x50, 0x7b, 0x58, + 0xc7, 0x33, 0x8f, 0xbd, 0x29, 0x54, 0x57, 0xdc, 0x64, 0x9c, 0x67, 0xa1, 0x38, 0x52, 0x05, 0xfa, + 0x99, 0x51, 0xc3, 0x26, 0x8b, 0x30, 0x59, 0xfb, 0x69, 0x37, 0xa0, 0x6b, 0x2d, 0xb6, 0x4f, 0x45, + 0xfc, 0x70, 0x3c, 0xc6, 0x17, 0x52, 0x87, 0x15, 0x34, 0x5c, 0x51, 0xa2, 0x31, 0x30, 0x49, 0xc8, + 0x16, 0x9c, 0xbd, 0xb7, 0xb4, 0x2d, 0xe6, 0x55, 0xad, 0xd9, 0xf4, 0xbb, 0x5e, 0x24, 0xf4, 0xd5, + 0xab, 0xc7, 0x47, 0xd5, 0x4b, 0xfb, 0xcd, 0x4e, 0x43, 0xce, 0x41, 0x87, 0x17, 0xeb, 0x0a, 0x6b, + 0x8a, 0x96, 0x5c, 0x83, 0x81, 0x5d, 0x7b, 0x4d, 0x9c, 0x9c, 0xcf, 0x1e, 0x1f, 0x55, 0x27, 0xbb, + 0x81, 0xab, 0x91, 0xb0, 0xd2, 0xfb, 0x83, 0xa3, 0xfd, 0xe5, 0x01, 0x7b, 0xac, 0x4e, 0xc3, 0x90, + 0x1f, 0xf2, 0xda, 0x30, 0x75, 0x8f, 0x46, 0x6c, 0xf6, 0xc9, 0x43, 0x4b, 0xf1, 0xd8, 0x7c, 0x04, + 0xe3, 0x0f, 0xdd, 0xe8, 0xa0, 0x4e, 0x9b, 0x01, 0x8d, 0xa4, 0xc1, 0x06, 0xe5, 0xf6, 0xcc, 0x8d, + 0x0e, 0x1a, 0x21, 0x87, 0xeb, 0x9b, 0xb3, 0x86, 0x6e, 0xad, 0xc0, 0x19, 0x51, 0x9b, 0x3a, 0x23, + 0x2d, 0x98, 0x0c, 0x4b, 0xc8, 0x10, 0xc7, 0x4e, 0x67, 0x68, 0xb2, 0xf9, 0xc7, 0xfd, 0x30, 0xbb, + 0x74, 0xe0, 0x78, 0xfb, 0x74, 0xdb, 0x09, 0xc3, 0x67, 0x7e, 0xd0, 0xd2, 0x1a, 0x8f, 0x07, 0xc4, + 0x54, 0xe3, 0xf1, 0x44, 0xb8, 0x00, 0xe3, 0x5b, 0xed, 0x96, 0xa4, 0x11, 0x87, 0x57, 0xac, 0xcb, + 0x6f, 0xb7, 0x1a, 0x1d, 0xc9, 0x4b, 0x47, 0x62, 0x34, 0x9b, 0xf4, 0x99, 0xa2, 0x19, 0x88, 0x69, + 0x3c, 0xfa, 0x4c, 0xa3, 0xd1, 0x90, 0xc8, 0x0a, 0x9c, 0xad, 0xd3, 0xa6, 0xef, 0xb5, 0xee, 0x3a, + 0xcd, 0xc8, 0x0f, 0x76, 0xfc, 0x27, 0xd4, 0x13, 0xb3, 0x12, 0xb5, 0xfb, 0x10, 0x0b, 0x1b, 0x8f, + 0xb1, 0xb4, 0x11, 0xb1, 0x62, 0x3b, 0x4d, 0x41, 0xb6, 0x60, 0xf4, 0xa1, 0x30, 0xfb, 0x89, 0x13, + 0xef, 0xab, 0x37, 0x95, 0x1d, 0x70, 0x29, 0xa0, 0x38, 0x95, 0x9c, 0xb6, 0x3a, 0xb3, 0x2b, 0x65, + 0x09, 0xd7, 0x23, 0x89, 0x69, 0x2b, 0x26, 0xd6, 0x2e, 0x4c, 0x6e, 0xb7, 0xbb, 0xfb, 0xae, 0xc7, + 0x56, 0x8e, 0x3a, 0xfd, 0x09, 0x59, 0x06, 0x88, 0x01, 0xc2, 0x98, 0x37, 0x2d, 0xce, 0xc9, 0x71, + 0xc1, 0xde, 0x5b, 0xe2, 0xf3, 0x43, 0x08, 0x1e, 0x6b, 0x6c, 0x8d, 0xce, 0xfa, 0x6f, 0x03, 0x40, + 0xc4, 0x00, 0xe0, 0x4e, 0x56, 0xa7, 0x11, 0xdb, 0x63, 0xce, 0x41, 0xbf, 0xb2, 0xb9, 0x0d, 0x1f, + 0x1f, 0x55, 0xfb, 0xdd, 0x96, 0xdd, 0xbf, 0xb6, 0x4c, 0xde, 0x86, 0x21, 0x44, 0x43, 0xf9, 0x4f, + 0xa9, 0xfa, 0x74, 0x0e, 0x7c, 0x05, 0xc1, 0x2d, 0xd4, 0xe6, 0xc8, 0xe4, 0x1d, 0x18, 0x5b, 0xa6, + 0x6d, 0xba, 0xef, 0x44, 0xbe, 0x5c, 0x13, 0xb8, 0x15, 0x4b, 0x02, 0xb5, 0x39, 0x17, 0x63, 0xb2, + 0x33, 0xad, 0x4d, 0x9d, 0xd0, 0xf7, 0xf4, 0x33, 0x6d, 0x80, 0x10, 0xfd, 0x4c, 0xcb, 0x71, 0xc8, + 0xff, 0x53, 0x82, 0xf1, 0x9a, 0xe7, 0x09, 0xeb, 0x50, 0x28, 0xa4, 0x3e, 0x7b, 0x53, 0x99, 0x53, + 0xd7, 0x9d, 0x47, 0xb4, 0xbd, 0xe7, 0xb4, 0xbb, 0x34, 0x5c, 0xfc, 0x9a, 0x1d, 0x33, 0xfe, 0xed, + 0x51, 0xf5, 0xc3, 0x53, 0xd8, 0x7b, 0x62, 0xc3, 0xec, 0x4e, 0xe0, 0xb8, 0x51, 0x78, 0x7c, 0x54, + 0x9d, 0x75, 0xe2, 0x0a, 0xf5, 0xef, 0x46, 0x6b, 0x47, 0xbc, 0xc0, 0x0f, 0xf7, 0x5a, 0xe0, 0xc9, + 0x21, 0x9c, 0xa9, 0x85, 0x61, 0xf7, 0x90, 0xd6, 0x23, 0x27, 0x88, 0x76, 0xdc, 0x43, 0x8a, 0xab, + 0x4a, 0xb1, 0x85, 0xe0, 0xf5, 0x9f, 0x1d, 0x55, 0x4b, 0xec, 0x64, 0xe3, 0x20, 0x29, 0x53, 0x5e, + 0x82, 0xa8, 0x11, 0xb9, 0xfa, 0x1e, 0x85, 0xb6, 0x82, 0x24, 0x6f, 0xeb, 0x9a, 0xd2, 0x2a, 0xd6, + 0x96, 0xf3, 0x46, 0xdc, 0x5a, 0x82, 0x8b, 0xf7, 0x68, 0x64, 0xd3, 0x90, 0x46, 0xf2, 0x1b, 0xc1, + 0x19, 0x1e, 0x5b, 0x68, 0x47, 0xf0, 0xb7, 0x22, 0xc6, 0xe1, 0xe7, 0xdf, 0x85, 0x2c, 0xb1, 0xfe, + 0x97, 0x12, 0x54, 0x97, 0x02, 0xca, 0x0f, 0x05, 0x39, 0x8c, 0x8a, 0xd7, 0xae, 0x8b, 0x30, 0xb8, + 0xf3, 0xbc, 0x23, 0x4d, 0x2b, 0x58, 0xca, 0x06, 0xc5, 0x46, 0xe8, 0x09, 0x2d, 0x55, 0xd6, 0x63, + 0x98, 0xb5, 0xa9, 0x47, 0x9f, 0x39, 0x8f, 0xda, 0xd4, 0x30, 0xf6, 0x54, 0x61, 0x88, 0x7f, 0xe8, + 0xa9, 0x2e, 0x70, 0xf8, 0xe9, 0x0c, 0x67, 0xd6, 0x24, 0x8c, 0x6f, 0xbb, 0xde, 0xbe, 0xe0, 0x6e, + 0xfd, 0xd5, 0x20, 0x4c, 0xf0, 0xdf, 0xe2, 0x9c, 0x93, 0xd8, 0xf3, 0x4a, 0x27, 0xd9, 0xf3, 0xde, + 0x83, 0x49, 0xb6, 0x69, 0xd0, 0x60, 0x8f, 0x06, 0x6c, 0xfd, 0x17, 0x92, 0xc0, 0x33, 0x5b, 0x88, + 0x05, 0x8d, 0xa7, 0xbc, 0xc4, 0x36, 0x11, 0xc9, 0x3a, 0x4c, 0x71, 0xc0, 0x5d, 0xea, 0x44, 0xdd, + 0xd8, 0xec, 0x74, 0x46, 0x1c, 0x6c, 0x24, 0x98, 0x4f, 0x4d, 0xc1, 0xeb, 0xb1, 0x00, 0xda, 0x09, + 0x5a, 0xf2, 0x09, 0x9c, 0xd9, 0x0e, 0xfc, 0x6f, 0x9e, 0x6b, 0xbb, 0x3c, 0xff, 0x3a, 0xf9, 0x11, + 0x88, 0x15, 0x35, 0xf4, 0xbd, 0x3e, 0x89, 0x4d, 0xde, 0x80, 0xd1, 0xb5, 0x70, 0xd1, 0x0f, 0x5c, + 0x6f, 0x1f, 0xbf, 0xd1, 0x51, 0x6e, 0xad, 0x77, 0xc3, 0xc6, 0x23, 0x04, 0xda, 0xaa, 0x38, 0x61, + 0x57, 0x1e, 0xe9, 0x6d, 0x57, 0xbe, 0x0d, 0xb0, 0xee, 0x3b, 0xad, 0x5a, 0xbb, 0xbd, 0x54, 0x0b, + 0x71, 0x3b, 0x15, 0xfb, 0x51, 0xdb, 0x77, 0x5a, 0x0d, 0xa7, 0xdd, 0x6e, 0x34, 0x9d, 0xd0, 0xd6, + 0x70, 0xc8, 0x97, 0x70, 0x3e, 0x74, 0xf7, 0x3d, 0xec, 0x5c, 0xc3, 0x69, 0xef, 0xfb, 0x81, 0x1b, + 0x1d, 0x1c, 0x36, 0xc2, 0xae, 0x1b, 0x71, 0xa3, 0xce, 0xd4, 0xc2, 0x65, 0xb1, 0xc8, 0xd5, 0x25, + 0x5e, 0x4d, 0xa2, 0xd5, 0x19, 0x96, 0x3d, 0x17, 0x66, 0x17, 0x90, 0x87, 0x30, 0xb9, 0xee, 0x36, + 0xa9, 0x17, 0x52, 0xb4, 0xd2, 0x3d, 0x47, 0x93, 0x4f, 0xf1, 0xc7, 0xcc, 0x84, 0x38, 0xd9, 0xd6, + 0x89, 0xf0, 0xd3, 0x35, 0xf9, 0xdc, 0x1f, 0x1c, 0x1d, 0x2e, 0x8f, 0xd8, 0x67, 0x04, 0xf0, 0xa1, + 0x13, 0x78, 0xae, 0xb7, 0x1f, 0x5a, 0xff, 0xf0, 0x2c, 0x8c, 0xaa, 0x71, 0xba, 0xa9, 0x1f, 0x37, + 0xc4, 0xd6, 0x8c, 0x53, 0x36, 0x36, 0xa6, 0xd9, 0x1a, 0x06, 0x39, 0x8f, 0x07, 0x10, 0xa1, 0x14, + 0x8c, 0xb0, 0x4f, 0xc8, 0xe9, 0x74, 0x6c, 0x06, 0x63, 0x4b, 0xc3, 0xf2, 0x22, 0x4e, 0x9a, 0x51, + 0xbe, 0x34, 0xb4, 0x1e, 0xd9, 0xfd, 0xcb, 0x8b, 0xec, 0x9b, 0xdc, 0x5a, 0x5b, 0x5e, 0xc2, 0xf1, + 0x1f, 0xe5, 0xdf, 0xa4, 0xef, 0xb6, 0x9a, 0x36, 0x42, 0x59, 0x69, 0xbd, 0xb6, 0xb1, 0x2e, 0xc6, + 0x18, 0x4b, 0x43, 0xe7, 0xb0, 0x6d, 0x23, 0x94, 0xa9, 0xac, 0xdc, 0x2e, 0xb2, 0xe4, 0x7b, 0x51, + 0xe0, 0xb7, 0x43, 0xd4, 0xc3, 0x46, 0xf9, 0x1c, 0x14, 0x06, 0x95, 0xa6, 0x28, 0xb2, 0x13, 0xa8, + 0xe4, 0x21, 0xcc, 0xd5, 0x5a, 0x4f, 0x1d, 0xaf, 0x49, 0x5b, 0xbc, 0xe4, 0xa1, 0x1f, 0x3c, 0x79, + 0xdc, 0xf6, 0x9f, 0x85, 0x38, 0x49, 0x46, 0x85, 0xfd, 0x51, 0xa0, 0x48, 0xfb, 0xcc, 0x33, 0x89, + 0x64, 0xe7, 0x51, 0xb3, 0x75, 0x60, 0xa9, 0xed, 0x77, 0x5b, 0x62, 0xea, 0xe0, 0x3a, 0xd0, 0x64, + 0x00, 0x9b, 0xc3, 0x99, 0x94, 0x56, 0xeb, 0x1b, 0x38, 0x31, 0x84, 0x94, 0x0e, 0xc2, 0x43, 0x9b, + 0xc1, 0xc8, 0xab, 0x30, 0x22, 0xb5, 0x6f, 0x7e, 0x1d, 0x81, 0x66, 0x70, 0xa9, 0x75, 0xcb, 0x32, + 0xf6, 0x1d, 0xdb, 0xb4, 0xe9, 0x3f, 0xa5, 0xc1, 0xf3, 0x25, 0xbf, 0x45, 0xa5, 0x6d, 0x4a, 0xd8, + 0x5e, 0x78, 0x41, 0xa3, 0xc9, 0x4a, 0x6c, 0x13, 0x91, 0x55, 0xc0, 0x37, 0xee, 0xb0, 0x72, 0x26, + 0xae, 0x80, 0x6f, 0xec, 0xa1, 0x2d, 0xcb, 0xc8, 0x32, 0x9c, 0xad, 0x75, 0x23, 0xff, 0xd0, 0x89, + 0xdc, 0xe6, 0x6e, 0x67, 0x3f, 0x70, 0x58, 0x25, 0x65, 0x24, 0xc0, 0xd3, 0x88, 0x23, 0x0b, 0x1b, + 0x5d, 0x51, 0x6a, 0xa7, 0x09, 0xc8, 0xbb, 0x30, 0xb1, 0x16, 0x72, 0xfb, 0xa3, 0x13, 0xd2, 0x16, + 0x1a, 0x91, 0x44, 0x2b, 0xdd, 0xb0, 0x81, 0xd6, 0xc8, 0x06, 0x3b, 0xbf, 0xb4, 0x6c, 0x03, 0x8f, + 0x58, 0x30, 0x5c, 0x0b, 0x43, 0x37, 0x8c, 0xd0, 0x36, 0x34, 0xba, 0x08, 0xc7, 0x47, 0xd5, 0x61, + 0x07, 0x21, 0xb6, 0x28, 0x21, 0x0f, 0x61, 0x7c, 0x99, 0x32, 0xf5, 0x77, 0x27, 0xe8, 0x86, 0x11, + 0x5a, 0x7a, 0xc6, 0x17, 0xce, 0x8b, 0xd5, 0x48, 0x2b, 0x11, 0x73, 0x99, 0xab, 0xa8, 0x2d, 0x84, + 0x37, 0x22, 0x56, 0xa0, 0x6f, 0xb5, 0x1a, 0x3e, 0xd3, 0xed, 0x05, 0xcd, 0xaa, 0xdb, 0x62, 0xeb, + 0xcb, 0x0c, 0xb6, 0x01, 0x75, 0x7b, 0xb1, 0xa0, 0x35, 0x0e, 0xb0, 0x44, 0xd7, 0xed, 0x0d, 0x12, + 0xd2, 0x4c, 0x99, 0xb4, 0x67, 0x0d, 0xb3, 0xa5, 0x59, 0x28, 0x9b, 0x78, 0x4a, 0x83, 0xf7, 0x47, + 0x30, 0xbe, 0xd4, 0x0d, 0x23, 0xff, 0x70, 0xe7, 0x80, 0x1e, 0x52, 0xb4, 0x06, 0x89, 0x13, 0x4c, + 0x13, 0xc1, 0x8d, 0x88, 0xc1, 0xf5, 0x6e, 0x6a, 0xe8, 0xe4, 0x33, 0x20, 0xf2, 0x28, 0x72, 0x8f, + 0xcd, 0x0f, 0x8f, 0xcd, 0x65, 0x34, 0x08, 0x8d, 0xf2, 0xf3, 0x87, 0x3c, 0xc1, 0x34, 0xf6, 0x55, + 0xb1, 0x6e, 0x94, 0x4c, 0x13, 0xb3, 0x06, 0xf1, 0x26, 0xde, 0x0b, 0x9c, 0xce, 0x41, 0xa5, 0x12, + 0x1f, 0x0d, 0x44, 0xa7, 0xf6, 0x19, 0xdc, 0x50, 0x71, 0x62, 0x74, 0x52, 0x07, 0xe0, 0x3f, 0xd7, + 0xd9, 0xc0, 0x73, 0x13, 0x52, 0xc5, 0x90, 0x17, 0x2b, 0x90, 0xb2, 0x3a, 0x8f, 0x8a, 0x13, 0x67, + 0xdb, 0x76, 0x8d, 0xd1, 0xd4, 0xd8, 0x90, 0x27, 0x50, 0xe6, 0xbf, 0x36, 0x7c, 0xcf, 0x8d, 0xf8, + 0x7e, 0x31, 0x6f, 0xd8, 0x1b, 0x93, 0xc5, 0xb2, 0x02, 0xb4, 0xf3, 0x8a, 0x0a, 0x0e, 0x55, 0xa9, + 0x56, 0x4d, 0x8a, 0x31, 0xd9, 0x86, 0xf1, 0xed, 0xc0, 0x6f, 0x75, 0x9b, 0x11, 0x6a, 0x19, 0x17, + 0x70, 0xe1, 0x27, 0xa2, 0x1e, 0xad, 0x84, 0xcb, 0xa4, 0xc3, 0x01, 0x0d, 0xb6, 0x2f, 0xe8, 0x32, + 0xd1, 0x10, 0xc9, 0x22, 0x0c, 0x6f, 0xfb, 0x6d, 0xb7, 0xf9, 0xbc, 0x72, 0x11, 0x1b, 0x3d, 0x23, + 0x99, 0x21, 0x50, 0x36, 0x15, 0x55, 0xda, 0x0e, 0x82, 0x74, 0x95, 0x96, 0x23, 0x91, 0x1a, 0x4c, + 0x7e, 0xc6, 0x26, 0x8c, 0xeb, 0x7b, 0x9e, 0xe3, 0x06, 0xb4, 0x72, 0x09, 0xc7, 0x05, 0x6d, 0xf1, + 0x3f, 0xd1, 0x0b, 0xf4, 0xe9, 0x6c, 0x50, 0x90, 0x35, 0x38, 0xb3, 0x16, 0xd6, 0xa3, 0xc0, 0xed, + 0xd0, 0x0d, 0xc7, 0x73, 0xf6, 0x69, 0xab, 0x72, 0x39, 0x36, 0x86, 0xbb, 0x61, 0x23, 0xc4, 0xb2, + 0xc6, 0x21, 0x2f, 0xd4, 0x8d, 0xe1, 0x09, 0x3a, 0xf2, 0x39, 0xcc, 0xac, 0x7c, 0x13, 0xb1, 0x19, + 0xd3, 0xae, 0x75, 0x5b, 0x6e, 0x54, 0x8f, 0xfc, 0xc0, 0xd9, 0xa7, 0x95, 0x2a, 0xf2, 0x7b, 0xe5, + 0xf8, 0xa8, 0x7a, 0x85, 0x8a, 0xf2, 0x86, 0xc3, 0x10, 0x1a, 0x21, 0xc7, 0xd0, 0x2f, 0xb9, 0xb3, + 0x38, 0x30, 0xe9, 0xd7, 0xbb, 0x1d, 0xa6, 0x6d, 0xa3, 0xf4, 0xaf, 0x18, 0xd2, 0xd7, 0x4a, 0xb8, + 0xf4, 0x43, 0x0e, 0x48, 0x49, 0x5f, 0x43, 0x24, 0x36, 0x90, 0xfb, 0xbe, 0xeb, 0xd5, 0x9a, 0x91, + 0xfb, 0x94, 0x8a, 0x13, 0x73, 0x58, 0xb9, 0x8a, 0x2d, 0x45, 0xc3, 0xfd, 0xaf, 0xfa, 0xae, 0xd7, + 0x70, 0xb0, 0xb8, 0x11, 0x8a, 0x72, 0xfd, 0x1b, 0x49, 0x53, 0x93, 0x1f, 0xc1, 0xb9, 0x0d, 0xff, + 0x91, 0xdb, 0xa6, 0x7c, 0xc9, 0xe1, 0x62, 0x41, 0x23, 0xa4, 0x85, 0x7c, 0xd1, 0x70, 0x7f, 0x88, + 0x18, 0x0d, 0xb1, 0x5a, 0x1d, 0x2a, 0x1c, 0xdd, 0x70, 0x9f, 0xcd, 0x85, 0xac, 0xc0, 0x04, 0x7e, + 0x97, 0x6d, 0xfc, 0x19, 0x56, 0xae, 0xe1, 0x91, 0xee, 0x6a, 0x42, 0x4b, 0xbb, 0xb9, 0xa2, 0xe1, + 0xac, 0x78, 0x51, 0xf0, 0xdc, 0x36, 0xc8, 0xc8, 0xc7, 0x30, 0x9f, 0x9c, 0xde, 0x4b, 0xbe, 0xf7, + 0xd8, 0xdd, 0xef, 0x06, 0xb4, 0x55, 0x79, 0x85, 0x35, 0xd5, 0x2e, 0xc0, 0x98, 0x7f, 0x08, 0x67, + 0x53, 0x55, 0x90, 0x32, 0x0c, 0x3c, 0x11, 0xf7, 0xa0, 0x63, 0x36, 0xfb, 0x93, 0xbc, 0x09, 0x43, + 0x4f, 0xd9, 0x59, 0x0a, 0x35, 0x86, 0xf8, 0x66, 0x4d, 0x23, 0x5d, 0xf3, 0x1e, 0xfb, 0x36, 0x47, + 0xfa, 0xa0, 0xff, 0xbd, 0xd2, 0xfd, 0xc1, 0xd1, 0xf1, 0xf2, 0x04, 0xbf, 0xbe, 0xbe, 0x3f, 0x38, + 0x3a, 0x59, 0x9e, 0xb2, 0x6a, 0x70, 0x26, 0x81, 0x4f, 0x2a, 0x30, 0x42, 0x3d, 0xa6, 0x9f, 0xb7, + 0xb8, 0xce, 0x62, 0xcb, 0x9f, 0x64, 0x06, 0x86, 0xda, 0xee, 0xa1, 0x1b, 0x61, 0x85, 0x43, 0x36, + 0xff, 0x61, 0xfd, 0x41, 0x09, 0x48, 0x7a, 0xcb, 0x20, 0xb7, 0x12, 0x6c, 0xb8, 0x76, 0x2a, 0x40, + 0xba, 0x81, 0x5e, 0x72, 0xff, 0x0c, 0xa6, 0xf9, 0x98, 0xc9, 0xcd, 0x4d, 0xab, 0x8b, 0x2f, 0xaa, + 0x19, 0xc5, 0xba, 0x51, 0x47, 0x14, 0xe3, 0x56, 0xb8, 0x8e, 0x4d, 0xeb, 0xc2, 0x6c, 0xe6, 0x66, + 0x41, 0x36, 0x60, 0xf6, 0xd0, 0xf7, 0xa2, 0x83, 0xf6, 0x73, 0xb9, 0x57, 0x88, 0xda, 0x4a, 0x58, + 0x1b, 0xae, 0x8f, 0x99, 0x08, 0xf6, 0xb4, 0x00, 0x0b, 0x8e, 0x58, 0x8f, 0xb0, 0x0b, 0xc9, 0x9e, + 0x58, 0x36, 0x9c, 0x4d, 0xad, 0xb9, 0xe4, 0x87, 0x30, 0xd1, 0xc4, 0xf3, 0x97, 0x51, 0x13, 0xdf, + 0x71, 0x34, 0xb8, 0xfe, 0x39, 0x71, 0x38, 0xef, 0xca, 0xdf, 0x2d, 0xc1, 0x5c, 0xce, 0x6a, 0x7b, + 0x7a, 0x51, 0x7f, 0x01, 0xe7, 0x0e, 0x9d, 0x6f, 0x1a, 0x01, 0x1e, 0xaf, 0x1b, 0x81, 0xe3, 0x25, + 0xa4, 0x8d, 0x2b, 0x49, 0x36, 0x86, 0xee, 0x43, 0x74, 0xe8, 0x7c, 0x63, 0x23, 0x82, 0xcd, 0xca, + 0x79, 0x3b, 0x3f, 0x85, 0x49, 0x63, 0x7d, 0x3d, 0x75, 0xe3, 0xac, 0x3b, 0x70, 0x76, 0x99, 0xb6, + 0x69, 0x44, 0x4f, 0x6c, 0x56, 0xb3, 0xb6, 0x01, 0xea, 0xf4, 0xd0, 0xe9, 0x1c, 0xf8, 0x4c, 0xef, + 0x5e, 0xd4, 0x7f, 0x09, 0xb3, 0x0c, 0x91, 0x27, 0x08, 0x59, 0xb0, 0xf7, 0x16, 0xd7, 0xc5, 0x43, + 0x85, 0x69, 0x6b, 0x54, 0xd6, 0xbf, 0xec, 0x07, 0x22, 0x16, 0xc8, 0x80, 0x3a, 0x87, 0xb2, 0x19, + 0xef, 0xc3, 0x04, 0x3f, 0x44, 0x73, 0x30, 0x36, 0x67, 0x7c, 0x61, 0x5a, 0x7c, 0x79, 0x7a, 0xd1, + 0x6a, 0x9f, 0x6d, 0xa0, 0x32, 0x52, 0x9b, 0xf2, 0xd3, 0x3f, 0x92, 0xf6, 0x1b, 0xa4, 0x7a, 0x11, + 0x23, 0xd5, 0x7f, 0x93, 0x4f, 0x60, 0x6a, 0xc9, 0x3f, 0xec, 0x30, 0x99, 0x08, 0xe2, 0x01, 0x61, + 0x59, 0x11, 0xf5, 0x1a, 0x85, 0xab, 0x7d, 0x76, 0x02, 0x9d, 0x6c, 0xc2, 0xf4, 0xdd, 0x76, 0x37, + 0x3c, 0xa8, 0x79, 0xad, 0xa5, 0xb6, 0x1f, 0x4a, 0x2e, 0x83, 0xe2, 0x30, 0x24, 0x96, 0xb7, 0x34, + 0xc6, 0x6a, 0x9f, 0x9d, 0x45, 0x48, 0x5e, 0x85, 0xa1, 0x95, 0xa7, 0x6c, 0xd9, 0x95, 0x9e, 0x24, + 0xc2, 0xd1, 0x6d, 0xcb, 0xa3, 0x5b, 0x8f, 0x57, 0xfb, 0x6c, 0x5e, 0xba, 0x38, 0x06, 0x23, 0xf2, + 0x00, 0x7e, 0x8b, 0xa9, 0xc4, 0x4a, 0x9c, 0xf5, 0xc8, 0x89, 0xba, 0x21, 0x99, 0x87, 0xd1, 0xdd, + 0x0e, 0x3b, 0x17, 0x4a, 0xcb, 0x85, 0xad, 0x7e, 0x5b, 0x6f, 0x9a, 0x92, 0x26, 0x17, 0x21, 0x36, + 0xbb, 0x0a, 0x64, 0xcd, 0x0e, 0xbb, 0x6a, 0x0a, 0xb7, 0x18, 0xdb, 0xa8, 0xb7, 0x3f, 0x51, 0x6f, + 0x39, 0x29, 0x6b, 0x6b, 0x36, 0x53, 0x78, 0xd6, 0xe7, 0x70, 0x79, 0xb7, 0x13, 0xd2, 0x20, 0xaa, + 0x75, 0x3a, 0x6d, 0xb7, 0xc9, 0x6f, 0xa2, 0xf0, 0xa0, 0x2e, 0x27, 0xcb, 0xbb, 0x30, 0xcc, 0x01, + 0x62, 0x9a, 0xc8, 0x39, 0x58, 0xeb, 0x74, 0x84, 0x79, 0xe0, 0x2d, 0xae, 0x9c, 0xf3, 0x03, 0xbf, + 0x2d, 0xb0, 0xad, 0xdf, 0x2d, 0xc1, 0x65, 0xfe, 0x05, 0xe4, 0xb2, 0xfe, 0x1e, 0x8c, 0xa1, 0x9f, + 0x59, 0xc7, 0x69, 0xca, 0x6f, 0x82, 0x3b, 0xdc, 0x49, 0xa0, 0x1d, 0x97, 0x6b, 0x1e, 0x7c, 0xfd, + 0xf9, 0x1e, 0x7c, 0xf2, 0x03, 0x1b, 0xc8, 0xfc, 0xc0, 0x3e, 0x03, 0x4b, 0xb4, 0xa8, 0xdd, 0x4e, + 0x35, 0x2a, 0x7c, 0x91, 0x56, 0x59, 0xff, 0xa9, 0x1f, 0xe6, 0xee, 0x51, 0x8f, 0x06, 0x0e, 0xf6, + 0xd3, 0x30, 0x44, 0xe9, 0x9e, 0x3c, 0xa5, 0x42, 0x4f, 0x9e, 0xaa, 0x34, 0xed, 0xf5, 0xa3, 0x69, + 0x2f, 0xe5, 0x96, 0xc4, 0x8e, 0x8b, 0xbb, 0xf6, 0x9a, 0xe8, 0x16, 0x1e, 0x17, 0xbb, 0x81, 0x8b, + 0xd6, 0x7c, 0xb2, 0x16, 0x7b, 0x01, 0x0d, 0xf6, 0x34, 0x0b, 0x4c, 0x0b, 0xaf, 0x88, 0x11, 0xe1, + 0x05, 0x64, 0xfa, 0xfe, 0x6c, 0xc2, 0x30, 0xb7, 0x48, 0xe2, 0x1d, 0xd2, 0xf8, 0xc2, 0x0d, 0xf1, + 0x4d, 0xe5, 0x74, 0x50, 0x98, 0x2f, 0x71, 0x63, 0xe7, 0x53, 0x20, 0x42, 0x80, 0x2d, 0xb8, 0xcc, + 0x7f, 0x06, 0xe3, 0x1a, 0xca, 0x49, 0xf6, 0x7e, 0x65, 0x19, 0x65, 0x1a, 0xa3, 0xb7, 0xcf, 0x8d, + 0xac, 0xda, 0xde, 0x6f, 0x7d, 0x08, 0x95, 0x74, 0x6b, 0x84, 0x35, 0xac, 0x97, 0xf1, 0xcd, 0x5a, + 0x86, 0x99, 0x7b, 0x34, 0xc2, 0x89, 0x8b, 0x1f, 0x91, 0xe6, 0xcd, 0x96, 0xf8, 0xce, 0xe4, 0xaa, + 0x8a, 0x40, 0x36, 0xc1, 0xb4, 0xaf, 0xb4, 0x0e, 0xb3, 0x09, 0x2e, 0xa2, 0xfe, 0x0f, 0x60, 0x44, + 0x80, 0xd4, 0x8a, 0x2a, 0x5c, 0x62, 0xe9, 0x23, 0x51, 0xb0, 0xb7, 0xc0, 0xe7, 0xad, 0xe0, 0x6c, + 0x4b, 0x02, 0xeb, 0x00, 0xce, 0xb1, 0x6d, 0x36, 0xe6, 0xaa, 0xa6, 0xe3, 0x05, 0x18, 0xeb, 0x30, + 0x45, 0x21, 0x74, 0x7f, 0xca, 0xa7, 0xd1, 0x90, 0x3d, 0xca, 0x00, 0x75, 0xf7, 0xa7, 0x94, 0x5c, + 0x02, 0xc0, 0x42, 0xec, 0xa6, 0x58, 0x05, 0x10, 0x9d, 0x5b, 0x1b, 0x09, 0xa0, 0x2f, 0x1c, 0x9f, + 0x37, 0x36, 0xfe, 0x6d, 0x05, 0x30, 0x97, 0xaa, 0x49, 0x74, 0xe0, 0x16, 0x8c, 0x4a, 0x15, 0x36, + 0x71, 0x0f, 0xa0, 0xf7, 0xc0, 0x56, 0x48, 0xe4, 0x35, 0x38, 0xe3, 0xd1, 0x6f, 0xa2, 0x46, 0xaa, + 0x0d, 0x93, 0x0c, 0xbc, 0x2d, 0xdb, 0x61, 0xfd, 0x0a, 0xda, 0x7e, 0xeb, 0x9e, 0xff, 0xec, 0x71, + 0xdb, 0x79, 0x42, 0x53, 0x15, 0xff, 0x10, 0x46, 0xeb, 0xbd, 0x2b, 0xe6, 0x9f, 0x8f, 0xac, 0xdc, + 0x56, 0x24, 0x56, 0x1b, 0xe6, 0x59, 0x97, 0xea, 0xb5, 0x8d, 0xf5, 0xb5, 0xd6, 0xf6, 0x77, 0x2d, + 0xc0, 0xa7, 0x70, 0x21, 0xb3, 0xb6, 0xef, 0x5a, 0x88, 0x7f, 0x32, 0x08, 0x73, 0x7c, 0x33, 0x49, + 0xcf, 0xe0, 0x93, 0x2f, 0x35, 0xbf, 0x94, 0x7b, 0xd5, 0xdb, 0x19, 0xf7, 0xaa, 0x48, 0xa2, 0xdf, + 0xab, 0x1a, 0xb7, 0xa9, 0xef, 0x65, 0xdf, 0xa6, 0xa2, 0x9d, 0xc8, 0xbc, 0x4d, 0x4d, 0xde, 0xa1, + 0xae, 0xe4, 0xdf, 0xa1, 0xe2, 0xdd, 0x50, 0xc6, 0x1d, 0x6a, 0xd6, 0xcd, 0x69, 0xc2, 0x21, 0x69, + 0xf4, 0xe5, 0x3a, 0x24, 0xbd, 0x06, 0x23, 0xb5, 0x4e, 0x47, 0x73, 0xf0, 0xc3, 0xe1, 0x71, 0x3a, + 0x1d, 0x2e, 0x3c, 0x59, 0x28, 0xd7, 0x79, 0xc8, 0x58, 0xe7, 0xdf, 0x07, 0x58, 0xc2, 0x67, 0x08, + 0x38, 0x70, 0xe3, 0x88, 0x81, 0x1a, 0x3e, 0x7f, 0x9c, 0x80, 0x03, 0xa7, 0x5b, 0x40, 0x62, 0x64, + 0xae, 0xd8, 0x5b, 0x7b, 0x50, 0x49, 0x4f, 0x9f, 0x97, 0xb0, 0x74, 0xfd, 0x71, 0x09, 0x2e, 0x09, + 0x25, 0x27, 0xf1, 0x81, 0x9f, 0x7e, 0x76, 0xbe, 0x03, 0x13, 0x82, 0x76, 0x27, 0xfe, 0x10, 0xf8, + 0x45, 0xb6, 0x5c, 0x8c, 0xf9, 0x8a, 0x6e, 0xa0, 0x91, 0x77, 0x60, 0x14, 0xff, 0x88, 0xef, 0x6e, + 0x98, 0x64, 0xc6, 0x10, 0xb5, 0x91, 0xbc, 0xc1, 0x51, 0xa8, 0xd6, 0xd7, 0x70, 0x39, 0xaf, 0xe1, + 0x2f, 0x41, 0x2e, 0xff, 0xb4, 0x04, 0x17, 0x04, 0x7b, 0x63, 0xa9, 0x78, 0xa1, 0x5d, 0xe7, 0x14, + 0x6e, 0xc1, 0xf7, 0x61, 0x9c, 0x55, 0x28, 0xdb, 0x3d, 0x20, 0xb6, 0x56, 0x71, 0x72, 0x88, 0x4b, + 0x96, 0x9d, 0xc8, 0x11, 0x6e, 0x2e, 0xce, 0x61, 0x5b, 0x1a, 0x2f, 0x6c, 0x9d, 0xd8, 0xfa, 0x12, + 0x2e, 0x66, 0x77, 0xe1, 0x25, 0xc8, 0xe7, 0x3e, 0xcc, 0x67, 0x6c, 0x0a, 0x2f, 0xb6, 0x27, 0x7f, + 0x01, 0x17, 0x32, 0x79, 0xbd, 0x84, 0x66, 0xae, 0x32, 0x8d, 0x23, 0x7a, 0x09, 0x43, 0x68, 0x3d, + 0x84, 0xf3, 0x19, 0x9c, 0x5e, 0x42, 0x13, 0xef, 0xc1, 0x9c, 0xd2, 0xb4, 0xbf, 0x55, 0x0b, 0x37, + 0xe0, 0x12, 0x67, 0xf4, 0x72, 0x46, 0xe5, 0x01, 0x5c, 0x10, 0xec, 0x5e, 0x82, 0xf4, 0x56, 0xe1, + 0x62, 0x7c, 0xa0, 0xce, 0xd0, 0x93, 0x4e, 0xbc, 0xc8, 0x58, 0xeb, 0x70, 0x25, 0xe6, 0x94, 0xa3, + 0x34, 0x9c, 0x9c, 0x1b, 0x57, 0x07, 0xe3, 0x51, 0x7a, 0x29, 0x23, 0xfa, 0x10, 0xce, 0x19, 0x4c, + 0x5f, 0x9a, 0xaa, 0xb4, 0x06, 0xd3, 0x9c, 0xb1, 0xa9, 0x3a, 0x2f, 0xe8, 0xaa, 0xf3, 0xf8, 0xc2, + 0xd9, 0x98, 0x25, 0x82, 0xf7, 0xde, 0xca, 0xd0, 0xa6, 0x37, 0x50, 0x9b, 0x96, 0x28, 0x71, 0x0b, + 0xdf, 0x81, 0x61, 0x0e, 0x11, 0xed, 0xcb, 0x60, 0xc6, 0x0f, 0x0b, 0x9c, 0x4c, 0x20, 0x5b, 0x3f, + 0x82, 0x4b, 0xfc, 0x24, 0x1a, 0xdf, 0x25, 0x9a, 0xa7, 0xc5, 0x1f, 0x26, 0x0e, 0xa2, 0xe7, 0x05, + 0xdf, 0x24, 0x7e, 0xce, 0x79, 0xf4, 0x91, 0x9c, 0xdb, 0x79, 0xfc, 0x4f, 0xf4, 0x44, 0x4c, 0x1e, + 0x30, 0xfb, 0x33, 0x0f, 0x98, 0xd7, 0xe0, 0xaa, 0x3a, 0x60, 0x26, 0xab, 0x91, 0x53, 0xcb, 0xfa, + 0x12, 0x2e, 0xf0, 0x8e, 0x4a, 0xd7, 0x3d, 0xb3, 0x19, 0x1f, 0x26, 0xba, 0x39, 0x27, 0xba, 0x69, + 0x62, 0xe7, 0x74, 0xf2, 0xff, 0x28, 0xc9, 0x4f, 0x2e, 0x9b, 0xf9, 0x2f, 0xfb, 0xc4, 0xbd, 0x09, + 0x55, 0x25, 0x10, 0xb3, 0x45, 0x2f, 0x76, 0xdc, 0xde, 0x80, 0x59, 0x9d, 0x8d, 0xdb, 0xa4, 0x7b, + 0x77, 0xf0, 0x92, 0xe7, 0x6d, 0xf6, 0x59, 0x20, 0x40, 0x4e, 0xbb, 0x4a, 0x86, 0xdc, 0x10, 0xdf, + 0x56, 0x98, 0x56, 0x03, 0x2e, 0xa6, 0x87, 0xc2, 0x6d, 0x4a, 0xbf, 0x7d, 0xf2, 0x09, 0xfb, 0x84, + 0x11, 0x22, 0x06, 0x23, 0x97, 0xa9, 0xfc, 0x8e, 0x39, 0xb9, 0xa4, 0xb2, 0x2c, 0xb9, 0xd4, 0x24, + 0xfa, 0xcf, 0x6a, 0x97, 0xf3, 0xe1, 0xd7, 0x81, 0xc8, 0xa2, 0xa5, 0xba, 0x2d, 0xab, 0x3e, 0x0f, + 0x03, 0x4b, 0x75, 0x5b, 0x3c, 0x18, 0x42, 0x4d, 0xb0, 0x19, 0x06, 0x36, 0x83, 0x25, 0x35, 0xf2, + 0xfe, 0x13, 0x68, 0xe4, 0xf7, 0x07, 0x47, 0x07, 0xca, 0x83, 0x36, 0xa9, 0xbb, 0xfb, 0xde, 0x43, + 0x37, 0x3a, 0x50, 0x15, 0xd6, 0xac, 0xaf, 0x60, 0xda, 0xa8, 0x5e, 0x7c, 0xc5, 0x85, 0x2f, 0x9d, + 0x98, 0x3e, 0xbb, 0x54, 0x43, 0xcf, 0x17, 0x34, 0x59, 0x4c, 0xf0, 0xf5, 0xa6, 0xe9, 0x34, 0xf0, + 0x19, 0xad, 0x2d, 0x0b, 0xad, 0xbf, 0x33, 0xa8, 0x71, 0xd7, 0xde, 0x8f, 0x15, 0xf4, 0xee, 0x0e, + 0x00, 0x9f, 0x21, 0x5a, 0xe7, 0x98, 0x02, 0x38, 0x2e, 0x1c, 0x4a, 0xf8, 0x92, 0x6c, 0x6b, 0x48, + 0x27, 0x7d, 0x5f, 0x26, 0xfc, 0x7c, 0x39, 0x91, 0x7c, 0x52, 0xa9, 0xfc, 0x7c, 0x05, 0xeb, 0xd0, + 0xd6, 0x91, 0xc8, 0x8f, 0x92, 0x8f, 0x20, 0x86, 0xf0, 0x4e, 0xe9, 0x15, 0x79, 0xc9, 0x9c, 0xee, + 0xdb, 0xe9, 0xde, 0x41, 0x3c, 0x83, 0x59, 0x46, 0xeb, 0x3e, 0xc6, 0x83, 0xc5, 0xca, 0x37, 0x11, + 0xf5, 0xf8, 0xda, 0x3e, 0x8c, 0xf5, 0xbc, 0x5a, 0x50, 0x4f, 0x8c, 0x2c, 0xec, 0xef, 0x31, 0x9f, + 0x06, 0x55, 0x65, 0x76, 0x36, 0x7f, 0x9c, 0x44, 0xf6, 0xfa, 0x8a, 0xd7, 0xea, 0xf8, 0xae, 0x3a, + 0x30, 0xf1, 0x49, 0x14, 0xb4, 0x1b, 0x54, 0xc0, 0x6d, 0x1d, 0xc9, 0x7a, 0xad, 0xd0, 0x7b, 0x7c, + 0x14, 0x06, 0x77, 0x96, 0x76, 0xd6, 0xcb, 0x25, 0xeb, 0x16, 0x80, 0x56, 0x13, 0xc0, 0xf0, 0xe6, + 0x96, 0xbd, 0x51, 0x5b, 0x2f, 0xf7, 0x91, 0x59, 0x38, 0xfb, 0x70, 0x6d, 0x73, 0x79, 0xeb, 0x61, + 0xbd, 0x51, 0xdf, 0xa8, 0xd9, 0x3b, 0x4b, 0x35, 0x7b, 0xb9, 0x5c, 0xb2, 0xbe, 0x86, 0x19, 0xb3, + 0x87, 0x2f, 0x75, 0x12, 0x46, 0x30, 0xad, 0xf4, 0x99, 0xfb, 0x0f, 0x77, 0x34, 0xa7, 0x53, 0x71, + 0xf8, 0x4b, 0x3a, 0x4f, 0x89, 0x63, 0xa2, 0xf8, 0x8c, 0x34, 0x24, 0xf2, 0x06, 0x57, 0x0b, 0x92, + 0x2f, 0x84, 0x99, 0x5a, 0xd0, 0x88, 0xf5, 0x02, 0x5c, 0xfa, 0x7e, 0x00, 0x33, 0x66, 0xad, 0x27, + 0xb5, 0x52, 0xbd, 0x82, 0xde, 0xb8, 0xda, 0xf3, 0x21, 0x42, 0xf4, 0x6b, 0x03, 0xb1, 0xb2, 0xfe, + 0x00, 0xca, 0x02, 0x2b, 0xde, 0x79, 0xaf, 0x49, 0x33, 0x62, 0x29, 0xe3, 0xb1, 0xa3, 0x74, 0xfe, + 0xf6, 0xa1, 0xcc, 0x56, 0x4c, 0x41, 0xc9, 0x2b, 0x98, 0x81, 0xa1, 0xf5, 0xf8, 0x3a, 0xc7, 0xe6, + 0x3f, 0xf0, 0x15, 0x4d, 0xe4, 0x04, 0x91, 0x74, 0x55, 0x1b, 0xb3, 0xd5, 0x6f, 0xf2, 0x06, 0x0c, + 0xdf, 0x75, 0xdb, 0x91, 0x30, 0x8d, 0xc4, 0x9b, 0x3c, 0x63, 0xcb, 0x0b, 0x6c, 0x81, 0x60, 0xd9, + 0x70, 0x56, 0xab, 0xf0, 0x14, 0x4d, 0x25, 0x15, 0x18, 0xd9, 0xa4, 0xdf, 0x68, 0xf5, 0xcb, 0x9f, + 0xd6, 0xbb, 0x70, 0x56, 0xb8, 0x01, 0x6a, 0x62, 0xba, 0x2a, 0xde, 0x64, 0x97, 0x8c, 0x87, 0xa1, + 0x82, 0x25, 0x16, 0x31, 0xba, 0xdd, 0x4e, 0xeb, 0x05, 0xe9, 0xd8, 0x46, 0x71, 0x4a, 0xba, 0xd7, + 0xe5, 0x2d, 0x50, 0xaf, 0xe1, 0xfc, 0xdf, 0xfa, 0xa1, 0x92, 0xb0, 0x32, 0x2c, 0x1d, 0x38, 0xed, + 0x36, 0xf5, 0xf6, 0x29, 0xb9, 0x0e, 0x83, 0x3b, 0x5b, 0x3b, 0xdb, 0xc2, 0x4a, 0x2a, 0x1d, 0x00, + 0x18, 0x48, 0xe1, 0xd8, 0x88, 0x41, 0x1e, 0xc0, 0x59, 0xe9, 0xe8, 0xab, 0x8a, 0xc4, 0x08, 0x5d, + 0x2a, 0x76, 0x1b, 0x4e, 0xd3, 0x91, 0xb7, 0x85, 0x49, 0xe4, 0x27, 0x5d, 0x37, 0xa0, 0x2d, 0xb4, + 0xfc, 0xc4, 0xb7, 0xe9, 0x5a, 0x89, 0xad, 0xa3, 0x91, 0x1f, 0xc0, 0x44, 0xbd, 0xbe, 0x15, 0xd7, + 0x3e, 0x64, 0xdc, 0x10, 0xe9, 0x45, 0xb6, 0x81, 0xc8, 0x9f, 0xde, 0x5a, 0x7f, 0x52, 0x82, 0xb9, + 0x1c, 0x73, 0x0b, 0x79, 0xc3, 0x90, 0xc3, 0xb4, 0x26, 0x07, 0x89, 0xb2, 0xda, 0x27, 0x04, 0xb1, + 0xa4, 0xb9, 0x4d, 0x0f, 0x9c, 0xc2, 0x6d, 0x7a, 0xb5, 0x2f, 0x76, 0x95, 0x26, 0xaf, 0xc1, 0x40, + 0xbd, 0xbe, 0x25, 0xcc, 0xea, 0x24, 0xee, 0x81, 0x86, 0xcc, 0x10, 0x16, 0x01, 0x46, 0x25, 0xc8, + 0x3a, 0x03, 0x93, 0xc6, 0xc0, 0x58, 0x16, 0x4c, 0xe8, 0x2d, 0x64, 0xa3, 0xbf, 0xe4, 0xb7, 0xd4, + 0xe8, 0xb3, 0xbf, 0xad, 0x6d, 0x53, 0x66, 0xe4, 0x12, 0x80, 0xbc, 0xaf, 0x75, 0x5b, 0xf2, 0xe6, + 0x47, 0x40, 0xd6, 0x5a, 0xe4, 0x2a, 0x4c, 0x04, 0xb4, 0xe5, 0x06, 0xb4, 0x19, 0x35, 0xba, 0x81, + 0x78, 0x80, 0x62, 0x8f, 0x4b, 0xd8, 0x6e, 0xd0, 0xb6, 0x16, 0x61, 0x5c, 0x6b, 0x68, 0x2f, 0x86, + 0x33, 0x30, 0xa4, 0x1b, 0x1e, 0xf9, 0x0f, 0xeb, 0xf7, 0x4a, 0x30, 0x83, 0x23, 0xbb, 0xef, 0xb2, + 0x15, 0x3f, 0x6e, 0xde, 0x82, 0x31, 0x0e, 0x17, 0x8d, 0x71, 0x48, 0xe0, 0xaa, 0x01, 0xf9, 0x20, + 0x35, 0x20, 0x17, 0xb3, 0x06, 0x04, 0xbf, 0x6a, 0xd7, 0xf7, 0xf4, 0x71, 0xd0, 0x6f, 0xe0, 0xfe, + 0xa0, 0x04, 0xd3, 0x5a, 0x9b, 0x54, 0x07, 0xef, 0x18, 0x4d, 0xba, 0x90, 0xd1, 0xa4, 0xd4, 0x14, + 0x59, 0x4c, 0xb5, 0xe8, 0x95, 0xa2, 0x16, 0x65, 0xcd, 0x10, 0x63, 0xe4, 0xff, 0xaa, 0x04, 0xb3, + 0x99, 0x32, 0x20, 0xe7, 0x98, 0x4a, 0xdf, 0x0c, 0x68, 0x24, 0x24, 0x2f, 0x7e, 0x31, 0xf8, 0x5a, + 0x18, 0x76, 0x69, 0x20, 0xe4, 0x2e, 0x7e, 0x91, 0x57, 0x60, 0x72, 0x9b, 0x06, 0xae, 0xdf, 0xe2, + 0xcf, 0x01, 0xb8, 0x9f, 0xed, 0xa4, 0x6d, 0x02, 0xc9, 0x45, 0x18, 0x53, 0x7e, 0xa2, 0xdc, 0x2c, + 0x6b, 0xc7, 0x00, 0xc6, 0x7b, 0xd9, 0xdd, 0xe7, 0x77, 0x39, 0x8c, 0x58, 0xfc, 0x62, 0x6b, 0xaa, + 0x34, 0x92, 0x0e, 0xf3, 0x35, 0x55, 0x5a, 0x40, 0xcf, 0xc1, 0xf0, 0x67, 0x36, 0x4e, 0x4d, 0x0c, + 0xd7, 0x60, 0x8b, 0x5f, 0x64, 0x0a, 0x1d, 0xba, 0xf1, 0x49, 0x09, 0x3a, 0x72, 0x7f, 0x00, 0x33, + 0x59, 0x72, 0xcd, 0x9a, 0xd8, 0x82, 0xb6, 0x5f, 0xd1, 0x7e, 0x09, 0xd3, 0xb5, 0x56, 0x6b, 0xe3, + 0x6e, 0x8d, 0xbb, 0x5a, 0x88, 0x51, 0xe5, 0x9f, 0x3e, 0x37, 0x53, 0x0a, 0x4d, 0x75, 0x70, 0xcd, + 0x73, 0x23, 0x7b, 0x7a, 0xe5, 0x1b, 0x37, 0x8c, 0x5c, 0x6f, 0x5f, 0xb3, 0xa5, 0xda, 0xe7, 0x36, + 0xe9, 0xb3, 0x8c, 0x29, 0xc0, 0x94, 0x08, 0x93, 0x37, 0x87, 0x67, 0x30, 0x9f, 0xd1, 0xd8, 0xc6, + 0xab, 0xd1, 0x9c, 0xc9, 0x37, 0x2e, 0x18, 0xa8, 0x35, 0x9f, 0x58, 0x3f, 0x80, 0x73, 0x7c, 0x25, + 0x2f, 0x6a, 0xbc, 0x68, 0xb6, 0x6e, 0xfa, 0xb5, 0xde, 0x93, 0xc6, 0x99, 0xc2, 0x96, 0xd9, 0x13, + 0x46, 0x5b, 0xb0, 0xca, 0xff, 0x58, 0x82, 0xf9, 0x04, 0x69, 0xfd, 0xb9, 0xd7, 0x94, 0xdb, 0xc8, + 0x6b, 0x49, 0x87, 0x79, 0x54, 0x7f, 0xb8, 0xcd, 0xd3, 0x6d, 0x29, 0x9f, 0x79, 0x72, 0x0b, 0x80, + 0x13, 0x6b, 0x5a, 0x0b, 0x5a, 0xfc, 0x85, 0x6f, 0x11, 0xea, 0x2d, 0x1a, 0x0a, 0xe9, 0x42, 0x96, + 0xdc, 0xc5, 0x37, 0xd2, 0xcb, 0x24, 0x8e, 0x21, 0x4a, 0xa8, 0x20, 0x6f, 0xe4, 0xd8, 0xc6, 0xb3, + 0xf8, 0x5b, 0xff, 0xe7, 0x00, 0xcc, 0xe9, 0x03, 0xf8, 0x22, 0x7d, 0xdd, 0x86, 0xf1, 0x25, 0xdf, + 0x8b, 0xe8, 0x37, 0x91, 0x16, 0x22, 0x82, 0x28, 0x07, 0x03, 0x55, 0x22, 0x34, 0x66, 0x0e, 0x68, + 0x30, 0xf5, 0xcd, 0xf0, 0x91, 0x8c, 0x11, 0xc9, 0x12, 0x4c, 0x6e, 0xd2, 0x67, 0x29, 0x01, 0xa2, + 0x9f, 0xa6, 0x47, 0x9f, 0x35, 0x34, 0x21, 0xea, 0xce, 0x73, 0x06, 0x0d, 0x79, 0x04, 0x53, 0x72, + 0x72, 0x19, 0xc2, 0x9c, 0xd7, 0x37, 0x53, 0x73, 0x3a, 0xf3, 0x10, 0x0a, 0xac, 0x86, 0x1c, 0x19, + 0x26, 0x38, 0xb2, 0xae, 0xf3, 0x1a, 0x79, 0x54, 0x00, 0x73, 0xb7, 0xd6, 0x4a, 0x0c, 0x2f, 0xd8, + 0x64, 0x34, 0x00, 0x9d, 0x85, 0xb5, 0x0d, 0x95, 0xf4, 0x78, 0x88, 0xda, 0xde, 0x86, 0x61, 0x0e, + 0x15, 0xda, 0x8f, 0x8c, 0xfe, 0xa3, 0xb0, 0xb9, 0x79, 0x82, 0x57, 0x63, 0x0b, 0x5c, 0x6b, 0x15, + 0x4d, 0x46, 0x0a, 0x47, 0xe9, 0x9f, 0xb7, 0x93, 0xc3, 0x8b, 0x0e, 0xc6, 0x72, 0x78, 0x75, 0xf7, + 0x1a, 0xf9, 0x10, 0x64, 0x09, 0xad, 0x6e, 0x3a, 0x27, 0xd1, 0xb0, 0x1b, 0x30, 0x22, 0x40, 0x89, + 0xb8, 0x44, 0xf1, 0xe7, 0x27, 0x11, 0xac, 0x0f, 0xe0, 0x3c, 0x9a, 0x00, 0x5d, 0x6f, 0xbf, 0x4d, + 0x77, 0x43, 0xe3, 0x29, 0x47, 0xaf, 0xcf, 0xfa, 0x23, 0x98, 0xcf, 0xa2, 0xed, 0xf9, 0x65, 0xf3, + 0x48, 0x21, 0x7f, 0xd1, 0x0f, 0x33, 0x6b, 0xa1, 0xae, 0x43, 0xa9, 0x68, 0x21, 0x19, 0x11, 0x2c, + 0x50, 0x26, 0xab, 0x7d, 0x59, 0x11, 0x2a, 0xde, 0xd6, 0x5e, 0x8a, 0xf6, 0x17, 0x85, 0xa6, 0x60, + 0xdb, 0x96, 0x7a, 0x2b, 0xfa, 0x1a, 0x0c, 0x6e, 0xb2, 0xa5, 0x7a, 0x40, 0x8c, 0x1d, 0xa7, 0x60, + 0x20, 0x7c, 0xa9, 0xc9, 0xb6, 0x48, 0xf6, 0x83, 0xdc, 0x4d, 0xbd, 0x07, 0x1d, 0xec, 0x1d, 0x7a, + 0x61, 0xb5, 0x2f, 0xf5, 0x34, 0xf4, 0x5d, 0x18, 0xaf, 0xb5, 0x0e, 0xb9, 0x23, 0xa4, 0xef, 0x25, + 0x3e, 0x4b, 0xad, 0x64, 0xb5, 0xcf, 0xd6, 0x11, 0xd9, 0xc1, 0xbe, 0xd6, 0xe9, 0xe0, 0x46, 0x95, + 0x15, 0x8e, 0x82, 0xe9, 0x5f, 0xb5, 0x4e, 0x67, 0x71, 0x14, 0x86, 0x77, 0x9c, 0x60, 0x9f, 0x46, + 0xd6, 0x97, 0x30, 0x2f, 0x7c, 0x73, 0xb8, 0xc1, 0x13, 0x3d, 0x78, 0xc2, 0xd8, 0xfd, 0xaa, 0xc8, + 0x9f, 0xe6, 0x32, 0x00, 0x1e, 0x6f, 0xd6, 0xbc, 0x16, 0xfd, 0x46, 0x38, 0x07, 0x6a, 0x10, 0xeb, + 0x1d, 0x18, 0x53, 0x12, 0x42, 0x1d, 0x5e, 0xdb, 0xec, 0x50, 0x5a, 0x33, 0xc6, 0x03, 0x58, 0xf9, + 0xea, 0xf5, 0xbc, 0xd1, 0x77, 0x11, 0x60, 0x86, 0x2b, 0xfd, 0x2e, 0xcc, 0x26, 0x26, 0x41, 0x1c, + 0xbf, 0x40, 0xa9, 0xdd, 0xdc, 0x7b, 0x51, 0xfd, 0x4e, 0x6a, 0xe5, 0xfd, 0x27, 0xd2, 0xca, 0xad, + 0xbf, 0xdf, 0x8f, 0xe7, 0xc5, 0x94, 0x3c, 0x12, 0xa6, 0x37, 0xdd, 0xfc, 0xb7, 0x08, 0x63, 0xd8, + 0xfb, 0x65, 0xf9, 0x4c, 0xaf, 0xd8, 0xb5, 0x64, 0xf4, 0x67, 0x47, 0xd5, 0x3e, 0xf4, 0x27, 0x89, + 0xc9, 0xc8, 0xc7, 0x30, 0xb2, 0xe2, 0xb5, 0x90, 0xc3, 0xc0, 0x29, 0x38, 0x48, 0x22, 0x36, 0x26, + 0xd8, 0xe4, 0x1d, 0xf6, 0x09, 0x73, 0x8b, 0x8d, 0xad, 0x41, 0xe2, 0x83, 0xeb, 0x50, 0xde, 0xc1, + 0x75, 0x38, 0x71, 0x70, 0xb5, 0x60, 0x68, 0x2b, 0x68, 0x89, 0xb0, 0x30, 0x53, 0x0b, 0x13, 0x42, + 0x70, 0x08, 0xb3, 0x79, 0x91, 0xf5, 0x9f, 0x4b, 0x30, 0x77, 0x8f, 0x46, 0x99, 0x73, 0xc8, 0x90, + 0x4a, 0xe9, 0x5b, 0x4b, 0xa5, 0xff, 0x45, 0xa4, 0xa2, 0x7a, 0x3d, 0x90, 0xd7, 0xeb, 0xc1, 0xbc, + 0x5e, 0x0f, 0xe5, 0xf7, 0xfa, 0x1e, 0x0c, 0xf3, 0xae, 0xb2, 0xc3, 0xf9, 0x5a, 0x44, 0x0f, 0xe3, + 0xc3, 0xb9, 0xee, 0x18, 0x67, 0xf3, 0x32, 0xa6, 0x48, 0xae, 0x3b, 0xa1, 0x7e, 0x38, 0x17, 0x3f, + 0xad, 0x1f, 0xe3, 0x03, 0xdf, 0x75, 0xbf, 0xf9, 0x44, 0x33, 0xf2, 0x8e, 0xf0, 0x2f, 0x34, 0x79, + 0x29, 0xc0, 0xb0, 0x78, 0x89, 0x2d, 0x31, 0xc8, 0x15, 0x18, 0x5f, 0xf3, 0xee, 0xfa, 0x41, 0x93, + 0x6e, 0x79, 0x6d, 0xce, 0x7d, 0xd4, 0xd6, 0x41, 0xc2, 0xf8, 0x21, 0x6a, 0x88, 0x2d, 0x0a, 0x08, + 0x48, 0x58, 0x14, 0x18, 0x6c, 0x6f, 0xc1, 0xe6, 0x65, 0xc2, 0xb6, 0xc2, 0xfe, 0x2e, 0x3a, 0x8c, + 0xab, 0x53, 0x7b, 0x2f, 0xc4, 0x47, 0x70, 0xde, 0xa6, 0x9d, 0xb6, 0xc3, 0x74, 0xba, 0x43, 0x9f, + 0xe3, 0xab, 0x3e, 0x5f, 0xc9, 0x78, 0x9c, 0x67, 0xba, 0x49, 0xa8, 0x26, 0xf7, 0x17, 0x34, 0xf9, + 0x10, 0xae, 0xde, 0xa3, 0x91, 0xb9, 0xa0, 0xc6, 0x26, 0x64, 0xd1, 0xf9, 0x55, 0x18, 0x0d, 0x4d, + 0xf3, 0xb7, 0x7c, 0x6c, 0x96, 0x49, 0xb8, 0xf7, 0x96, 0xbc, 0x20, 0x12, 0x7c, 0xd4, 0x5f, 0xd6, + 0x27, 0x50, 0xcd, 0xab, 0xee, 0x64, 0x5e, 0xac, 0x2e, 0x5c, 0xc9, 0x67, 0x20, 0x9a, 0xbb, 0x02, + 0xd2, 0x54, 0x2e, 0x3e, 0xa1, 0x5e, 0xad, 0x35, 0xad, 0xeb, 0xe2, 0x0f, 0x6b, 0x51, 0xfa, 0xf3, + 0x7d, 0x8b, 0xe6, 0x36, 0xf0, 0x16, 0xda, 0x64, 0x10, 0xcb, 0xb5, 0x06, 0xa3, 0x12, 0x26, 0xe4, + 0x3a, 0x97, 0xd9, 0x52, 0x29, 0xd0, 0x96, 0x64, 0xa0, 0xc8, 0xac, 0x1f, 0xcb, 0x1b, 0x19, 0x93, + 0xe2, 0x64, 0xaf, 0x55, 0x4f, 0x72, 0x05, 0x63, 0xf9, 0x70, 0xde, 0xe4, 0xad, 0x5b, 0xda, 0xcb, + 0x9a, 0xa5, 0x9d, 0x1b, 0xd8, 0xaf, 0x98, 0x96, 0x5f, 0x61, 0x3c, 0xd0, 0x40, 0xe4, 0xb2, 0x6e, + 0x4f, 0x9f, 0x48, 0x3f, 0x7f, 0xbd, 0x0d, 0xf3, 0x59, 0x15, 0x6a, 0xe7, 0x40, 0x65, 0xb4, 0x15, + 0xfa, 0xce, 0x32, 0x5c, 0x96, 0x81, 0x99, 0x7c, 0x3f, 0x0a, 0xa3, 0xc0, 0xe9, 0xd4, 0x9b, 0x81, + 0xdb, 0x89, 0xa9, 0x2c, 0x18, 0xe6, 0x10, 0x21, 0x09, 0x7e, 0xbb, 0xc5, 0x71, 0x44, 0x89, 0xf5, + 0x9b, 0x25, 0xb0, 0x0c, 0xd7, 0x2b, 0x1c, 0xe7, 0xed, 0xc0, 0x7f, 0xea, 0xb6, 0xb4, 0x1b, 0xa5, + 0x37, 0x0c, 0x6b, 0x26, 0x7f, 0x09, 0x98, 0xf4, 0xfa, 0x16, 0x6b, 0xe6, 0xed, 0x84, 0x85, 0x91, + 0x2b, 0x9e, 0xe8, 0x8e, 0x65, 0x46, 0xc0, 0x51, 0x96, 0xc7, 0xff, 0x5a, 0x82, 0x6b, 0x85, 0x6d, + 0x10, 0xfd, 0x79, 0x04, 0xe5, 0x64, 0x99, 0x98, 0x41, 0x55, 0xcd, 0x15, 0x23, 0xcd, 0x61, 0xef, + 0x0e, 0x77, 0x2d, 0x97, 0x2e, 0x4b, 0x1d, 0xc5, 0x39, 0xc5, 0xef, 0xf4, 0xad, 0x27, 0xef, 0x03, + 0xec, 0xf8, 0x91, 0xd3, 0x5e, 0x42, 0x03, 0xc0, 0x40, 0xfc, 0x4c, 0x20, 0x62, 0xd0, 0x46, 0x32, + 0xc2, 0x84, 0x86, 0x6c, 0x7d, 0x8a, 0xdf, 0x75, 0x76, 0xa3, 0x4f, 0xf6, 0xa9, 0x2d, 0xc1, 0xb5, + 0x84, 0x3b, 0xc0, 0x0b, 0x30, 0x89, 0x60, 0x96, 0x89, 0x9f, 0xe9, 0xde, 0xf7, 0x02, 0xbf, 0xdb, + 0xf9, 0xe5, 0x8c, 0xfa, 0x9f, 0x96, 0xb8, 0x7f, 0xa6, 0x5e, 0xad, 0x18, 0xe8, 0x25, 0x80, 0x18, + 0x9a, 0xf0, 0xd3, 0x57, 0x05, 0x7b, 0x77, 0xf8, 0x91, 0x1b, 0x2f, 0x0a, 0xf6, 0x39, 0x03, 0x8d, + 0xec, 0x97, 0x3b, 0x92, 0x6f, 0xa1, 0x0f, 0x80, 0xaa, 0xfd, 0x64, 0x72, 0x7f, 0x57, 0xda, 0x3f, + 0x4e, 0x49, 0x77, 0x00, 0x33, 0x6c, 0x05, 0xa8, 0x75, 0xa3, 0x03, 0x3f, 0x70, 0x23, 0xf9, 0xe2, + 0x84, 0x6c, 0x8b, 0x77, 0xf8, 0x9c, 0xea, 0xa3, 0x5f, 0x1c, 0x55, 0xdf, 0x3b, 0x4d, 0xc8, 0x4c, + 0xc9, 0x73, 0x47, 0xbd, 0xdd, 0xb7, 0xe6, 0x60, 0x60, 0xc9, 0x5e, 0xc7, 0x05, 0xcf, 0x5e, 0x57, + 0x0b, 0x9e, 0xbd, 0x6e, 0xfd, 0x75, 0x3f, 0x54, 0x79, 0xa4, 0x10, 0x74, 0x1d, 0x89, 0xad, 0x16, + 0x9a, 0x2f, 0xca, 0x49, 0x0d, 0x0c, 0x89, 0x48, 0x20, 0xfd, 0x27, 0x89, 0x04, 0xf2, 0x6b, 0x90, + 0x63, 0xb2, 0x3a, 0x81, 0x15, 0xe0, 0xf5, 0xe3, 0xa3, 0xea, 0xb5, 0xd8, 0x0a, 0xc0, 0x4b, 0xb3, + 0xcc, 0x01, 0x39, 0x55, 0xa4, 0xed, 0x17, 0x83, 0x2f, 0x60, 0xbf, 0xb8, 0x0d, 0x23, 0x78, 0x98, + 0x59, 0xdb, 0x16, 0xce, 0x9c, 0x38, 0x3d, 0x31, 0xb8, 0x4f, 0xc3, 0xd5, 0x23, 0xe9, 0x49, 0x34, + 0xeb, 0xf7, 0xfb, 0xe1, 0x4a, 0xbe, 0xcc, 0x45, 0xdb, 0x96, 0x01, 0x62, 0xa7, 0x95, 0x22, 0x27, + 0x19, 0xfc, 0x76, 0x9e, 0xd1, 0x47, 0xca, 0x49, 0x4d, 0xa3, 0x63, 0xba, 0x8f, 0x7c, 0xdf, 0x9c, + 0xb8, 0x21, 0x31, 0x9e, 0x3d, 0x8b, 0x40, 0xb0, 0x02, 0x64, 0x04, 0x82, 0x15, 0x30, 0xf2, 0x08, + 0xe6, 0xb6, 0x03, 0xf7, 0xa9, 0x13, 0xd1, 0x07, 0xf4, 0x39, 0x7f, 0xff, 0xb3, 0x22, 0x1e, 0xfd, + 0xf0, 0x47, 0xeb, 0xd7, 0x8f, 0x8f, 0xaa, 0xaf, 0x74, 0x38, 0x0a, 0x06, 0xfb, 0xe2, 0x2f, 0x2e, + 0x1b, 0xe9, 0x77, 0x40, 0x79, 0x8c, 0xac, 0x7f, 0x51, 0x82, 0x0b, 0xa8, 0x96, 0x0b, 0xb3, 0xab, + 0xac, 0xfc, 0x85, 0x7c, 0x25, 0xf5, 0x0e, 0x8a, 0xb9, 0x88, 0xbe, 0x92, 0xc6, 0xfb, 0x6f, 0xdb, + 0x40, 0x23, 0x6b, 0x30, 0x2e, 0x7e, 0xe3, 0xf7, 0x37, 0x80, 0x07, 0x82, 0x59, 0x6d, 0xc1, 0xc2, + 0xa9, 0xce, 0x4d, 0x45, 0x38, 0xb1, 0x05, 0x33, 0x7c, 0x26, 0x69, 0xeb, 0xb4, 0xd6, 0xcf, 0xfb, + 0xe1, 0xe2, 0x1e, 0x0d, 0xdc, 0xc7, 0xcf, 0x73, 0x3a, 0xb3, 0x05, 0x33, 0x12, 0xc4, 0xa3, 0x85, + 0x18, 0x9f, 0x18, 0x0f, 0x05, 0x29, 0x9b, 0x2a, 0xc2, 0x8d, 0xc8, 0x2f, 0x2e, 0x93, 0xf0, 0x14, + 0x5e, 0x90, 0x6f, 0xc3, 0x68, 0x22, 0x5e, 0x0f, 0x8e, 0xbf, 0xfc, 0x42, 0xe3, 0xa1, 0x5a, 0xed, + 0xb3, 0x15, 0x26, 0xf9, 0xed, 0xfc, 0xdb, 0x27, 0x61, 0xfa, 0xe8, 0x65, 0xff, 0xc4, 0x0f, 0x96, + 0x7d, 0xac, 0x8e, 0x56, 0x9a, 0xf1, 0xc1, 0xae, 0xf6, 0xd9, 0x79, 0x35, 0x2d, 0x8e, 0xc3, 0x58, + 0x0d, 0xaf, 0xe2, 0xd8, 0xc9, 0xfd, 0xbf, 0xf4, 0xc3, 0x65, 0xf9, 0x96, 0x27, 0x47, 0xcc, 0x9f, + 0xc3, 0x9c, 0x04, 0xd5, 0x3a, 0x4c, 0x61, 0xa0, 0x2d, 0x53, 0xd2, 0x3c, 0x1c, 0xab, 0x94, 0xb4, + 0x23, 0x70, 0x62, 0x61, 0xe7, 0x91, 0xbf, 0x1c, 0xeb, 0xe7, 0xc7, 0x59, 0xd1, 0x93, 0xd0, 0x0a, + 0xa9, 0xaf, 0x99, 0x86, 0x68, 0x8c, 0xf5, 0xb3, 0x95, 0xb2, 0x9e, 0x0e, 0x7e, 0x5b, 0xeb, 0xe9, + 0x6a, 0x5f, 0xd2, 0x7e, 0xba, 0x38, 0x05, 0x13, 0x9b, 0xf4, 0x59, 0x2c, 0xf7, 0xff, 0xb5, 0x94, + 0x08, 0xb0, 0xc0, 0x34, 0x0c, 0x1e, 0x69, 0xa1, 0x14, 0x07, 0xe0, 0xc1, 0x00, 0x0b, 0xba, 0x86, + 0xc1, 0x51, 0xd7, 0x60, 0x84, 0xdf, 0x4f, 0xb7, 0x4e, 0x70, 0xc2, 0x57, 0x8f, 0x72, 0xf8, 0x4b, + 0xc9, 0x16, 0x3f, 0xec, 0x0b, 0x7a, 0xeb, 0x01, 0x5c, 0x15, 0x6e, 0xdb, 0xe6, 0xe0, 0x63, 0x45, + 0xa7, 0xdc, 0xbe, 0x2c, 0x07, 0x2e, 0xdf, 0xa3, 0xc9, 0xa5, 0xc7, 0x78, 0xb4, 0xf4, 0x09, 0x9c, + 0x31, 0xe0, 0x8a, 0x23, 0x6a, 0xa5, 0x6a, 0x0e, 0x29, 0xd6, 0x49, 0x6c, 0xeb, 0x4a, 0x56, 0x15, + 0x7a, 0x63, 0x2d, 0x8a, 0x71, 0x55, 0x83, 0xf8, 0x8a, 0x2d, 0x3c, 0xc5, 0xaa, 0x77, 0x5d, 0xfb, + 0xae, 0xf9, 0x8a, 0xc7, 0x03, 0xef, 0xc9, 0x9d, 0x57, 0x95, 0x5a, 0x93, 0xc6, 0x5d, 0x80, 0x35, + 0x05, 0x13, 0xb2, 0xa8, 0x4d, 0xc3, 0xd0, 0xfa, 0x77, 0x43, 0x60, 0x09, 0xc1, 0x66, 0x5d, 0xba, + 0x4b, 0x79, 0x3c, 0x4a, 0x35, 0x56, 0x6c, 0x54, 0xe7, 0xf4, 0x70, 0x9e, 0x71, 0x29, 0x9f, 0x79, + 0xa8, 0xe7, 0x35, 0x63, 0xa8, 0x31, 0xf3, 0x52, 0xbd, 0xff, 0x2a, 0x67, 0x99, 0xe4, 0x1f, 0xdb, + 0xab, 0xc7, 0x47, 0xd5, 0xab, 0x39, 0xcb, 0xa4, 0xc1, 0x37, 0x7b, 0xc9, 0xb4, 0xcd, 0x2b, 0x91, + 0x81, 0x17, 0xb9, 0x12, 0x61, 0x5f, 0xa4, 0x7e, 0x29, 0xb2, 0x6b, 0xca, 0x52, 0x7c, 0x8f, 0xf2, + 0x42, 0x5e, 0x2f, 0x12, 0x71, 0x0e, 0x34, 0x88, 0xc1, 0xd5, 0x60, 0x43, 0x5c, 0x28, 0x6b, 0x36, + 0xcb, 0xa5, 0x03, 0xda, 0x7c, 0x22, 0x6c, 0xc5, 0xf2, 0x42, 0x37, 0xcb, 0x66, 0xce, 0x43, 0x3b, + 0xf3, 0xef, 0x9c, 0x17, 0x34, 0x9a, 0x8c, 0x54, 0x8f, 0xd3, 0x90, 0x64, 0x4b, 0x7e, 0x0a, 0xd3, + 0x6a, 0xa8, 0x13, 0x5e, 0x57, 0xe3, 0x0b, 0xaf, 0xc4, 0x51, 0x40, 0x0f, 0x1f, 0x3b, 0x37, 0x9f, + 0xde, 0xb9, 0x99, 0x81, 0xcb, 0x9f, 0xff, 0x37, 0x65, 0x81, 0xe6, 0x72, 0xa5, 0x5f, 0x74, 0x65, + 0x10, 0x92, 0x2f, 0x60, 0xa6, 0x5e, 0xdf, 0xe2, 0xef, 0x33, 0x6c, 0x79, 0x67, 0x6f, 0xaf, 0x0b, + 0x1f, 0x2c, 0x1c, 0xee, 0x30, 0xf4, 0x1b, 0xe2, 0x5d, 0x87, 0x7e, 0xd3, 0xaf, 0x07, 0x40, 0xc8, + 0x62, 0xa1, 0xdf, 0x94, 0xff, 0xdf, 0xea, 0xf9, 0x01, 0x53, 0x45, 0xdc, 0x36, 0x15, 0xef, 0x88, + 0xe4, 0xc4, 0xce, 0xb9, 0xe5, 0x2b, 0x7d, 0xc7, 0xb7, 0x7c, 0xff, 0xa8, 0x5f, 0x3e, 0xba, 0x48, + 0x5f, 0xb4, 0x9e, 0xfa, 0xb2, 0x2f, 0xb3, 0x07, 0x27, 0xda, 0xa7, 0x33, 0x1b, 0x47, 0x16, 0xe5, + 0x55, 0xa9, 0x0a, 0x11, 0x36, 0xa5, 0xae, 0x1d, 0xe2, 0x02, 0xe3, 0xf6, 0x14, 0xb5, 0x22, 0x8d, + 0x2a, 0x79, 0x0f, 0x37, 0xf0, 0xed, 0xef, 0xe1, 0xfe, 0xc9, 0x18, 0x9c, 0xdd, 0x76, 0xf6, 0x5d, + 0x8f, 0xed, 0x07, 0x36, 0x0d, 0xfd, 0x6e, 0xd0, 0xa4, 0xa4, 0x06, 0x53, 0xa6, 0x47, 0x6d, 0x0f, + 0x7f, 0x61, 0xb6, 0xe5, 0x99, 0x30, 0xb2, 0x00, 0x63, 0xea, 0x15, 0xaf, 0xd8, 0xa7, 0x32, 0x5e, + 0xf7, 0xae, 0xf6, 0xd9, 0x31, 0x1a, 0x79, 0xdf, 0xb8, 0x3a, 0x3a, 0xa3, 0x1e, 0xa4, 0x23, 0xee, + 0x02, 0x77, 0x79, 0xf4, 0xfc, 0x96, 0xb9, 0xd7, 0xf2, 0xfb, 0x91, 0x1f, 0xa7, 0x6e, 0x93, 0x86, + 0x8c, 0x16, 0xa7, 0x4c, 0x6a, 0xa8, 0x66, 0xe4, 0x86, 0xed, 0xce, 0xb8, 0x67, 0xfa, 0x12, 0xc6, + 0x1f, 0x74, 0x1f, 0x51, 0x79, 0x6f, 0x36, 0x2c, 0xb6, 0xde, 0xa4, 0x9f, 0xb8, 0x28, 0xdf, 0x7b, + 0x8b, 0x8f, 0xc1, 0x93, 0xee, 0x23, 0x9a, 0x8e, 0x07, 0xcf, 0xd6, 0x3c, 0x8d, 0x19, 0x39, 0x80, + 0x72, 0xd2, 0xa5, 0x5b, 0x04, 0xd5, 0x2b, 0x70, 0x44, 0xc7, 0xe0, 0x28, 0x5a, 0xd4, 0x79, 0xee, + 0x68, 0x6a, 0x54, 0x92, 0xe2, 0x4a, 0x7e, 0x1d, 0x66, 0x33, 0x0d, 0x9a, 0xea, 0x51, 0x5a, 0xb1, + 0xad, 0x14, 0x17, 0x90, 0x84, 0xd4, 0xe4, 0x0b, 0x38, 0xa3, 0xe6, 0xec, 0x5a, 0x48, 0x0b, 0xce, + 0x24, 0x5c, 0x95, 0x45, 0x6a, 0x8d, 0x7c, 0xe7, 0x67, 0xdc, 0xf3, 0x64, 0x74, 0xda, 0xcc, 0xba, + 0x92, 0x2c, 0xc9, 0x3a, 0x8c, 0x29, 0x4b, 0x82, 0x88, 0x67, 0x96, 0x65, 0x35, 0xa9, 0x1c, 0x1f, + 0x55, 0x67, 0x62, 0xab, 0x89, 0xc1, 0x33, 0x66, 0x40, 0x7e, 0x03, 0xae, 0xaa, 0x29, 0xba, 0x15, + 0x64, 0xdb, 0x97, 0x44, 0x54, 0xfb, 0x1b, 0xc9, 0x19, 0x9e, 0x87, 0xbf, 0x77, 0x67, 0xb1, 0xbf, + 0x52, 0x5a, 0xed, 0xb3, 0x7b, 0xb3, 0x26, 0xbf, 0x55, 0x82, 0x73, 0x39, 0xb5, 0x4e, 0x60, 0xad, + 0x3d, 0x8d, 0x7e, 0x78, 0x6e, 0xc0, 0x87, 0x58, 0x6e, 0x2b, 0x7e, 0xb0, 0x28, 0xad, 0x7f, 0x46, + 0xbf, 0x73, 0x6a, 0x22, 0x6f, 0xc2, 0x30, 0x1e, 0xbf, 0xc3, 0xca, 0x24, 0x2a, 0xa8, 0x18, 0x13, + 0x08, 0x0f, 0xe9, 0xfa, 0x96, 0x24, 0x70, 0xc8, 0x2a, 0x53, 0xf4, 0x70, 0x4b, 0x94, 0x8a, 0x99, + 0x88, 0x20, 0x26, 0x0e, 0x0b, 0xbc, 0x48, 0xc6, 0x0d, 0x31, 0xd2, 0x17, 0x98, 0x64, 0x8b, 0x00, + 0xa3, 0x81, 0x58, 0x95, 0xee, 0x0f, 0x8e, 0x0e, 0x96, 0x87, 0xf8, 0x87, 0x23, 0x7d, 0xe0, 0x7f, + 0x67, 0x94, 0x3f, 0x98, 0xdd, 0xf5, 0xdc, 0xc7, 0x6e, 0xbc, 0x80, 0xe9, 0x86, 0xbb, 0x38, 0x8f, + 0x90, 0x50, 0xab, 0x73, 0x32, 0x06, 0x29, 0x1b, 0x5f, 0x7f, 0x4f, 0x1b, 0xdf, 0x5b, 0xda, 0x6d, + 0x98, 0x16, 0x29, 0x94, 0xab, 0x4f, 0xa6, 0x4d, 0x2d, 0xbe, 0x26, 0xfb, 0x1a, 0x86, 0x31, 0xb8, + 0x27, 0xbf, 0x6a, 0x1c, 0x5f, 0xb8, 0x29, 0x96, 0xed, 0x82, 0xe6, 0xf3, 0x68, 0xa0, 0xe2, 0x11, + 0x3c, 0x97, 0x38, 0x02, 0x0c, 0x89, 0x23, 0x84, 0xec, 0xc0, 0xf4, 0x36, 0xdb, 0xcd, 0xb9, 0x27, + 0x76, 0x27, 0x10, 0x76, 0x0f, 0x6e, 0x51, 0x41, 0x6d, 0xa2, 0x23, 0x8b, 0x1b, 0x54, 0x95, 0xeb, + 0x1b, 0x6a, 0x06, 0x39, 0x59, 0x81, 0xa9, 0x3a, 0x75, 0x82, 0xe6, 0xc1, 0x03, 0xfa, 0x9c, 0x69, + 0x52, 0x46, 0xea, 0x8c, 0x10, 0x4b, 0x58, 0x7f, 0xb1, 0x48, 0x77, 0x1f, 0x31, 0x89, 0xc8, 0xa7, + 0x30, 0x5c, 0xf7, 0x83, 0x68, 0xf1, 0xb9, 0x58, 0xd4, 0xe4, 0x65, 0x14, 0x07, 0x2e, 0x9e, 0x97, + 0xe9, 0x43, 0x42, 0x3f, 0x88, 0x1a, 0x8f, 0x8c, 0x20, 0x53, 0x1c, 0x85, 0x3c, 0x87, 0x19, 0x73, + 0x41, 0x11, 0x0e, 0xc2, 0xa3, 0x42, 0x83, 0xcb, 0x5a, 0xb5, 0x38, 0xca, 0xe2, 0x75, 0xc1, 0xfd, + 0x4a, 0x72, 0xd9, 0x7a, 0x8c, 0xe5, 0xba, 0xda, 0x93, 0x45, 0x4f, 0x36, 0x30, 0xef, 0x0a, 0xef, + 0x51, 0x2d, 0xe4, 0x8e, 0xc5, 0x63, 0x71, 0x18, 0xb3, 0x2e, 0x2e, 0x4a, 0x28, 0x09, 0x27, 0x4c, + 0x26, 0xeb, 0xb1, 0x53, 0xa4, 0x64, 0x1b, 0xce, 0xee, 0x86, 0x74, 0x3b, 0xa0, 0x4f, 0x5d, 0xfa, + 0x4c, 0xf2, 0x83, 0x38, 0xe6, 0x13, 0xe3, 0xd7, 0xe1, 0xa5, 0x59, 0x0c, 0xd3, 0xc4, 0xe4, 0x7d, + 0x80, 0x6d, 0xd7, 0xf3, 0x68, 0x0b, 0x6f, 0x34, 0xc7, 0x91, 0x15, 0x5a, 0x6b, 0x3b, 0x08, 0x6d, + 0xf8, 0x5e, 0x5b, 0x17, 0xa9, 0x86, 0x4c, 0x16, 0x61, 0x72, 0xcd, 0x6b, 0xb6, 0xbb, 0xc2, 0xf3, + 0x20, 0xc4, 0x05, 0x45, 0xc4, 0xa2, 0x73, 0x79, 0x41, 0x23, 0xf5, 0x91, 0x9b, 0x24, 0xe4, 0x01, + 0x10, 0x01, 0x10, 0xb3, 0xd6, 0x79, 0xd4, 0xa6, 0xe2, 0x73, 0x47, 0x2b, 0x8c, 0x64, 0x84, 0xd3, + 0xdd, 0x08, 0xf1, 0x96, 0x22, 0x9b, 0x7f, 0x1f, 0xc6, 0xb5, 0x39, 0x9f, 0x11, 0xd5, 0x61, 0x46, + 0x8f, 0xea, 0x30, 0xa6, 0x47, 0x6f, 0xf8, 0xff, 0x4b, 0x70, 0x31, 0xfb, 0x5b, 0x12, 0x0a, 0xd8, + 0x16, 0x8c, 0x29, 0xa0, 0x7a, 0xc7, 0x23, 0x4f, 0x15, 0x09, 0x0d, 0x88, 0x7f, 0xd0, 0x72, 0xe5, + 0xd1, 0x7b, 0x1f, 0xf3, 0x78, 0x01, 0x53, 0xff, 0xff, 0x3e, 0x0a, 0x33, 0xe8, 0xaf, 0x9e, 0x5c, + 0xa7, 0x3e, 0xc1, 0xe8, 0x2c, 0x08, 0xd3, 0x2c, 0xd7, 0xc2, 0x88, 0xc5, 0xe1, 0xc9, 0x50, 0x62, + 0x06, 0x01, 0x79, 0x47, 0x77, 0xb7, 0xe8, 0xd7, 0xf2, 0xbc, 0x48, 0xa0, 0xde, 0x85, 0xd8, 0x0f, + 0xe3, 0x0d, 0xe3, 0xb6, 0xff, 0xc4, 0x8b, 0xde, 0xe0, 0x49, 0x17, 0xbd, 0x5d, 0xb5, 0xe8, 0xf1, + 0xa8, 0x1f, 0xaf, 0x6b, 0x8b, 0xde, 0xcb, 0x5f, 0xed, 0x86, 0x5f, 0xf6, 0x6a, 0x37, 0xf2, 0xed, + 0x56, 0xbb, 0xd1, 0x17, 0x5c, 0xed, 0xee, 0xc2, 0xd4, 0x26, 0xa5, 0x2d, 0xed, 0x0e, 0x66, 0x2c, + 0xde, 0x3d, 0x3d, 0x8a, 0xd6, 0xb5, 0xac, 0x8b, 0x98, 0x04, 0x55, 0xee, 0xaa, 0x09, 0x7f, 0x3b, + 0xab, 0xe6, 0xf8, 0x4b, 0x5e, 0x35, 0x27, 0xbe, 0xcd, 0xaa, 0x99, 0x5a, 0xfa, 0x26, 0x4f, 0xbd, + 0xf4, 0x7d, 0x9b, 0xd5, 0xea, 0x63, 0xf4, 0x56, 0xac, 0xd7, 0x57, 0x85, 0x63, 0x8a, 0xe6, 0x09, + 0xb2, 0xea, 0x87, 0xd2, 0x99, 0x1b, 0xff, 0x66, 0xb0, 0x6d, 0x3f, 0x90, 0xb7, 0xe9, 0xf8, 0xb7, + 0xb5, 0x88, 0x3e, 0x8a, 0x3a, 0xbd, 0x7a, 0xc7, 0x30, 0x22, 0x1e, 0x41, 0x8a, 0x35, 0x2e, 0x79, + 0x8c, 0xb2, 0x65, 0xb9, 0xf5, 0x17, 0x25, 0x7e, 0xdf, 0xf9, 0x3f, 0xe2, 0x52, 0xf9, 0x6d, 0xee, + 0x20, 0x7f, 0x3b, 0x0e, 0x8e, 0x20, 0x02, 0x39, 0x04, 0x4e, 0xf3, 0x49, 0x7c, 0x09, 0xfc, 0x23, + 0xf6, 0x9d, 0xeb, 0x05, 0x18, 0xaa, 0x36, 0x3e, 0x2b, 0x9a, 0x85, 0x7b, 0x77, 0xe4, 0x02, 0x20, + 0x62, 0x44, 0x70, 0xb0, 0xb9, 0x00, 0xe8, 0x04, 0xe8, 0x86, 0x77, 0xc6, 0xb2, 0xf9, 0xdb, 0xfe, + 0xcc, 0x16, 0xbc, 0x9b, 0x7e, 0x9d, 0x8e, 0x87, 0x91, 0xf8, 0x75, 0xba, 0x2e, 0xc6, 0xf8, 0x9d, + 0xfa, 0x2e, 0x5c, 0xb0, 0xe9, 0xa1, 0xff, 0x94, 0xbe, 0x5c, 0xb6, 0x5f, 0xc1, 0x79, 0x93, 0x21, + 0x7f, 0xc7, 0xc4, 0xe3, 0xe2, 0x7f, 0x9c, 0x1d, 0x4d, 0x5f, 0x10, 0xf0, 0x68, 0xfa, 0x3c, 0x28, + 0x37, 0xfb, 0x53, 0xdf, 0x37, 0xb0, 0xcc, 0xf2, 0xe1, 0xa2, 0xc9, 0xbc, 0xd6, 0x6a, 0x61, 0x56, + 0xcd, 0xa6, 0xdb, 0x71, 0xbc, 0x88, 0x6c, 0xc1, 0xb8, 0xf6, 0x33, 0x61, 0x2a, 0xd0, 0x4a, 0x84, + 0x4e, 0x13, 0x03, 0x8c, 0xa0, 0xa6, 0x31, 0xd8, 0xa2, 0x50, 0x4d, 0x8a, 0x87, 0x89, 0x4c, 0xaf, + 0x73, 0x11, 0x26, 0xb5, 0x9f, 0xca, 0x1a, 0x8a, 0x1f, 0xbf, 0x56, 0x83, 0x29, 0x30, 0x93, 0xc4, + 0x6a, 0xc2, 0x7c, 0x96, 0xd0, 0x78, 0xf4, 0x6b, 0xb2, 0x12, 0x47, 0xce, 0xea, 0xed, 0xc8, 0x77, + 0x26, 0x2f, 0x6a, 0x96, 0xf5, 0x7f, 0x0d, 0xc2, 0x05, 0x31, 0x18, 0x2f, 0x73, 0xc4, 0xc9, 0x8f, + 0x61, 0x5c, 0x1b, 0x63, 0x21, 0xf4, 0x2b, 0xf2, 0x15, 0x52, 0xde, 0x5c, 0xe0, 0x26, 0x8d, 0x2e, + 0x02, 0x1a, 0x89, 0xe1, 0x5e, 0xed, 0xb3, 0x75, 0x96, 0xa4, 0x0d, 0x53, 0xe6, 0x40, 0x0b, 0xab, + 0xce, 0xb5, 0xcc, 0x4a, 0x4c, 0x54, 0x19, 0x1a, 0xbb, 0xd5, 0xc8, 0x1c, 0xee, 0xd5, 0x3e, 0x3b, + 0xc1, 0x9b, 0x7c, 0x03, 0x67, 0x53, 0xa3, 0x2c, 0x8c, 0x75, 0xaf, 0x65, 0x56, 0x98, 0xc2, 0xe6, + 0x96, 0xde, 0x00, 0xc1, 0xb9, 0xd5, 0xa6, 0x2b, 0x21, 0x2d, 0x98, 0xd0, 0x07, 0x5e, 0x98, 0x9d, + 0xae, 0x16, 0x88, 0x92, 0x23, 0x72, 0xe5, 0x4e, 0xc8, 0x12, 0xc7, 0xfe, 0xb9, 0x69, 0xbd, 0x36, + 0x90, 0x47, 0x61, 0x98, 0xff, 0x66, 0x4b, 0xc0, 0x76, 0x40, 0x43, 0xea, 0x35, 0xa9, 0xe1, 0xfb, + 0xfd, 0x2d, 0x97, 0x80, 0x7f, 0x5e, 0x82, 0x4a, 0x16, 0xdf, 0x3a, 0xf5, 0x5a, 0x64, 0x1b, 0xca, + 0xc9, 0x8a, 0xc4, 0xac, 0xb6, 0x54, 0xf4, 0xe1, 0xdc, 0x26, 0xad, 0xf6, 0xd9, 0x29, 0x6a, 0xb2, + 0x09, 0x67, 0x35, 0x98, 0x30, 0xae, 0xf6, 0x9f, 0xc4, 0xb8, 0xca, 0x46, 0x21, 0x45, 0xaa, 0xdb, + 0xa6, 0x57, 0x71, 0x67, 0x5c, 0xf6, 0x0f, 0x1d, 0xd7, 0x63, 0x8a, 0xae, 0x16, 0x3c, 0x0b, 0x62, + 0xa8, 0x90, 0x0d, 0xb7, 0xb6, 0x22, 0x54, 0xbe, 0x55, 0x51, 0x28, 0xd6, 0x47, 0xb8, 0x82, 0x0b, + 0x1b, 0x1d, 0x7f, 0xf0, 0xab, 0x98, 0x5d, 0x81, 0xa1, 0x9d, 0xf5, 0xfa, 0x52, 0x4d, 0x3c, 0x1f, + 0xe6, 0x41, 0x27, 0xda, 0x61, 0xa3, 0xe9, 0xd8, 0xbc, 0xc0, 0xfa, 0x10, 0xc8, 0x3d, 0x1a, 0x89, + 0xf0, 0xf7, 0x8a, 0xee, 0x55, 0x18, 0x11, 0x20, 0x41, 0x89, 0x5e, 0x77, 0x22, 0x98, 0xbe, 0x2d, + 0xcb, 0xac, 0x6d, 0x79, 0x4e, 0x68, 0x53, 0x27, 0xd4, 0x36, 0xe6, 0xf7, 0x60, 0x34, 0x10, 0x30, + 0xb1, 0x2f, 0x4f, 0xa9, 0xec, 0x26, 0x08, 0xe6, 0xf6, 0x6c, 0x89, 0x63, 0xab, 0xbf, 0xac, 0x75, + 0x0c, 0x10, 0xb3, 0xb5, 0xb6, 0xbc, 0xc4, 0xa4, 0x2a, 0x84, 0x25, 0x87, 0xe3, 0x16, 0xba, 0xa7, + 0x47, 0x54, 0x7f, 0x3c, 0x8c, 0xa2, 0xc1, 0x8f, 0x5c, 0x84, 0x45, 0xd2, 0x50, 0xac, 0xb7, 0x54, + 0xb8, 0x99, 0x0c, 0x6e, 0x79, 0x59, 0x3a, 0x36, 0x31, 0x90, 0xce, 0x3d, 0xf4, 0xc4, 0x79, 0x19, + 0x8d, 0x70, 0x60, 0x9e, 0x6f, 0xf3, 0xac, 0x57, 0x22, 0xd1, 0xa0, 0xaf, 0x96, 0xc6, 0x25, 0x18, + 0x53, 0x30, 0x75, 0xad, 0xc6, 0x65, 0x65, 0xe0, 0xef, 0xbd, 0xc5, 0xdf, 0x59, 0x37, 0x15, 0x83, + 0x98, 0x8e, 0x55, 0xc1, 0xbf, 0xbb, 0xef, 0xb8, 0x8a, 0x90, 0x06, 0xd1, 0x77, 0x5a, 0x45, 0x1c, + 0x69, 0xe9, 0x34, 0x55, 0x18, 0xf8, 0x7b, 0x0b, 0x27, 0x11, 0xd4, 0x77, 0x5c, 0x05, 0x13, 0xd4, + 0x77, 0x57, 0x05, 0x95, 0x21, 0xa9, 0xf8, 0x24, 0x4d, 0x55, 0xb2, 0x92, 0xae, 0x44, 0x1a, 0xae, + 0x13, 0x14, 0x85, 0xe3, 0x41, 0xe1, 0x22, 0x17, 0xd6, 0x2f, 0xa1, 0x1a, 0x26, 0xb0, 0xef, 0xb6, + 0x9a, 0xff, 0xb7, 0xc4, 0x03, 0x64, 0xd5, 0xb7, 0xb4, 0x14, 0x9f, 0xde, 0x63, 0x5f, 0xbb, 0xf5, + 0xd7, 0xbe, 0xf6, 0x07, 0xae, 0xd7, 0xd2, 0x6f, 0xfd, 0x9d, 0x6e, 0x74, 0xa0, 0x02, 0x48, 0x3f, + 0x71, 0xbd, 0x96, 0x9d, 0xc4, 0x26, 0xef, 0xc3, 0xa4, 0x06, 0x52, 0xda, 0x1a, 0xcf, 0xc2, 0xa1, + 0x93, 0xbb, 0x2d, 0xdb, 0xc4, 0xb4, 0xfe, 0xa6, 0x04, 0xd3, 0x19, 0xc9, 0xa7, 0xd1, 0x98, 0x81, + 0xa7, 0x20, 0xb5, 0x50, 0x89, 0xbc, 0x59, 0x18, 0xab, 0xc3, 0xd8, 0x24, 0x15, 0x22, 0xe6, 0x1f, + 0xd0, 0x12, 0x65, 0xf7, 0x6b, 0x29, 0xdd, 0xb2, 0x93, 0x63, 0xeb, 0xe8, 0x24, 0x04, 0x88, 0x5b, + 0x22, 0xcc, 0xc6, 0x75, 0xa6, 0xd2, 0x6a, 0x59, 0xb6, 0x5f, 0x4a, 0x9a, 0x6f, 0xad, 0x1a, 0xeb, + 0xb7, 0xfb, 0xe1, 0x5c, 0x46, 0xff, 0xeb, 0x34, 0xfa, 0xdb, 0x10, 0x41, 0x22, 0xd7, 0xf9, 0xc0, + 0x2f, 0x29, 0xd7, 0xb9, 0xf5, 0x6f, 0xfa, 0xe1, 0xdc, 0x6e, 0x27, 0xc4, 0xc7, 0x5b, 0x6b, 0xde, + 0x53, 0xea, 0x45, 0x7e, 0xf0, 0x1c, 0x1f, 0x9c, 0x90, 0x77, 0x60, 0x68, 0x95, 0xb6, 0xdb, 0xbe, + 0x98, 0xff, 0x97, 0xa4, 0xe3, 0x45, 0x12, 0x1b, 0x91, 0x56, 0xfb, 0x6c, 0x8e, 0x4d, 0xde, 0x87, + 0xb1, 0x55, 0xea, 0x04, 0xd1, 0x23, 0xea, 0xc8, 0x23, 0x8b, 0xcc, 0x0d, 0xa2, 0x91, 0x08, 0x84, + 0xd5, 0x3e, 0x3b, 0xc6, 0x26, 0x0b, 0xec, 0x34, 0xef, 0xed, 0xab, 0x87, 0xea, 0x39, 0x15, 0x32, + 0x9c, 0xd5, 0x3e, 0x1b, 0x71, 0xc9, 0x06, 0x4c, 0xd6, 0xf6, 0xa9, 0x17, 0x6d, 0xd0, 0xc8, 0x69, + 0x39, 0x91, 0x23, 0x54, 0xdb, 0x57, 0xf3, 0x88, 0x0d, 0xe4, 0xd5, 0x3e, 0xdb, 0xa4, 0x26, 0x1f, + 0xc2, 0xc8, 0x3d, 0xdf, 0x6f, 0x3d, 0x7a, 0x2e, 0x23, 0x28, 0x54, 0xf3, 0x18, 0x09, 0xb4, 0xd5, + 0x3e, 0x5b, 0x52, 0x2c, 0x0e, 0xc1, 0xc0, 0x46, 0xb8, 0x6f, 0x1d, 0x95, 0xa0, 0xb2, 0xec, 0x3f, + 0xf3, 0x32, 0xa5, 0xfa, 0x03, 0x53, 0xaa, 0x92, 0x7d, 0x06, 0x7e, 0x42, 0xae, 0x6f, 0xc3, 0xe0, + 0xb6, 0xeb, 0xed, 0x27, 0x54, 0xc1, 0x0c, 0x3a, 0x86, 0x85, 0xe2, 0x71, 0xbd, 0x7d, 0xb2, 0x2e, + 0x75, 0x70, 0x61, 0x6b, 0x1c, 0x30, 0x14, 0xff, 0x0c, 0x6a, 0x1d, 0x3b, 0xd6, 0xb5, 0xf9, 0x6f, + 0xd9, 0xc1, 0x37, 0x60, 0x2e, 0xa7, 0x5e, 0xf1, 0xf2, 0x9c, 0xf5, 0x6d, 0x10, 0x15, 0x9b, 0xd7, + 0x61, 0x36, 0x73, 0xfc, 0x52, 0x88, 0x7f, 0x2f, 0x6b, 0x22, 0xf2, 0x9e, 0x57, 0x60, 0x44, 0x26, + 0xcd, 0xe2, 0xb6, 0x1f, 0xf9, 0x13, 0xdf, 0x5e, 0xc9, 0x0f, 0x55, 0x86, 0x4a, 0x91, 0xdf, 0xe3, + 0x9e, 0x16, 0x9a, 0x8a, 0x7f, 0x4e, 0x1f, 0x7c, 0x8b, 0x8f, 0x46, 0xf1, 0x62, 0x75, 0xae, 0xfa, + 0x61, 0xe4, 0x29, 0xa7, 0x5e, 0x5b, 0xfd, 0x26, 0x37, 0xa0, 0x2c, 0x13, 0x64, 0x88, 0x4c, 0x3c, + 0x22, 0x33, 0xbb, 0x9d, 0x82, 0x93, 0xf7, 0x60, 0x2e, 0x09, 0x93, 0xbd, 0xe4, 0x8f, 0xe7, 0xf2, + 0x8a, 0xad, 0x3f, 0xef, 0xc7, 0xe8, 0xe1, 0x05, 0xf3, 0x9a, 0x49, 0x77, 0xab, 0x2e, 0xa4, 0xd5, + 0xbf, 0x55, 0x27, 0x17, 0x61, 0x6c, 0xab, 0x6e, 0x64, 0x1e, 0xb3, 0x63, 0x00, 0x6b, 0x36, 0xeb, + 0x42, 0x2d, 0x68, 0x1e, 0xb8, 0x11, 0x6d, 0x46, 0xdd, 0x40, 0xac, 0xc2, 0x76, 0x0a, 0x4e, 0x2c, + 0x98, 0xb8, 0xd7, 0x76, 0x1f, 0x35, 0x25, 0x33, 0x2e, 0x02, 0x03, 0x46, 0x5e, 0x83, 0xa9, 0x35, + 0x2f, 0x8c, 0x9c, 0x76, 0x7b, 0x83, 0x46, 0x07, 0x7e, 0x4b, 0x24, 0x47, 0xb5, 0x13, 0x50, 0x56, + 0xef, 0x92, 0xef, 0x45, 0x8e, 0xeb, 0xd1, 0xc0, 0xee, 0x7a, 0x91, 0x7b, 0x48, 0x45, 0xdf, 0x53, + 0x70, 0xf2, 0x36, 0xcc, 0x2a, 0xd8, 0x56, 0xd0, 0x3c, 0xa0, 0x61, 0x14, 0x60, 0x3e, 0x42, 0x74, + 0xdf, 0xb1, 0xb3, 0x0b, 0xb1, 0x86, 0xb6, 0xdf, 0x6d, 0xad, 0x78, 0x4f, 0xdd, 0xc0, 0xf7, 0x30, + 0xdb, 0xc7, 0xa8, 0xa8, 0x21, 0x01, 0xb7, 0xfe, 0x68, 0x34, 0xf3, 0xb3, 0xfd, 0x36, 0x73, 0xf0, + 0x0b, 0x98, 0x58, 0x72, 0x3a, 0xce, 0x23, 0xb7, 0xed, 0x46, 0xae, 0x4a, 0xdc, 0xf6, 0x4e, 0x8f, + 0x6f, 0x5e, 0xa6, 0x4c, 0xa1, 0x2d, 0x9d, 0xd8, 0x36, 0x58, 0xcd, 0xff, 0xf5, 0x30, 0xcc, 0x66, + 0xe2, 0x91, 0xeb, 0x22, 0xc3, 0x9b, 0x5a, 0x57, 0x45, 0xfa, 0x30, 0x3b, 0x09, 0x66, 0x63, 0x89, + 0xa0, 0xa5, 0x36, 0x75, 0xbc, 0xae, 0x48, 0x1e, 0x66, 0x1b, 0x30, 0x36, 0x96, 0x4c, 0x6f, 0xd0, + 0x98, 0xa1, 0x4f, 0xb6, 0x9d, 0x80, 0x92, 0x2b, 0x30, 0xce, 0x20, 0x92, 0xd5, 0x20, 0x7f, 0x3d, + 0xa8, 0x81, 0x18, 0xa7, 0x4d, 0xbf, 0x45, 0x35, 0x4e, 0x43, 0x9c, 0x93, 0x09, 0x65, 0x9c, 0x18, + 0x44, 0x72, 0x1a, 0xe6, 0x9c, 0x34, 0x10, 0x79, 0x05, 0x26, 0x6b, 0x9d, 0x8e, 0xc6, 0x08, 0xb3, + 0x86, 0xd9, 0x26, 0x90, 0x5c, 0x06, 0xa8, 0x75, 0x3a, 0x92, 0x0d, 0x66, 0x04, 0xb3, 0x35, 0x08, + 0xb9, 0x19, 0x07, 0x80, 0xd3, 0x58, 0xe1, 0x75, 0x82, 0x9d, 0x51, 0xc2, 0xe4, 0xaa, 0xa2, 0x65, + 0x09, 0xa6, 0xc0, 0xe5, 0x9a, 0x00, 0x93, 0x8f, 0xe0, 0x7c, 0xc2, 0xef, 0x42, 0xab, 0x00, 0x4d, + 0xfd, 0x76, 0x3e, 0x02, 0x79, 0x17, 0xce, 0x25, 0x0a, 0x65, 0x75, 0x68, 0xd5, 0xb7, 0x73, 0x4a, + 0xc9, 0x07, 0x50, 0x49, 0xbc, 0x08, 0x8f, 0x2b, 0x45, 0x0b, 0xbe, 0x9d, 0x5b, 0xce, 0xbe, 0xae, + 0xc4, 0xd3, 0x32, 0x51, 0x25, 0x5e, 0x56, 0xda, 0xd9, 0x85, 0x64, 0x15, 0xaa, 0x99, 0xbe, 0x2c, + 0x5a, 0xc5, 0x98, 0xe9, 0xcc, 0xee, 0x85, 0x46, 0x16, 0xe1, 0x62, 0x26, 0x8a, 0x6c, 0x06, 0xe6, + 0x3f, 0xb3, 0x0b, 0x71, 0xc8, 0x02, 0xcc, 0xc4, 0x3e, 0x3d, 0x5a, 0x13, 0x30, 0xf5, 0x99, 0x9d, + 0x59, 0x46, 0xde, 0x34, 0xdf, 0xfd, 0xf3, 0xca, 0x30, 0xf3, 0x99, 0x9d, 0x2e, 0xb0, 0x8e, 0x4b, + 0x70, 0x31, 0x73, 0xa3, 0x94, 0xfa, 0xfc, 0x7c, 0x52, 0x71, 0xd4, 0xd6, 0x82, 0x1b, 0x30, 0x88, + 0x0a, 0x3e, 0xb7, 0x15, 0x4b, 0x37, 0x56, 0xa4, 0xe7, 0xac, 0x58, 0xa9, 0x8d, 0x38, 0xe4, 0x9e, + 0xba, 0x1b, 0x1c, 0x40, 0x4b, 0xc6, 0xad, 0xa4, 0x02, 0x95, 0x51, 0xb9, 0x7e, 0x47, 0x28, 0x6f, + 0x03, 0xbf, 0xcd, 0x35, 0xcc, 0x9f, 0x97, 0xa0, 0xda, 0x43, 0x3f, 0x50, 0x7d, 0x2a, 0x9d, 0xa0, + 0x4f, 0xf7, 0x55, 0x9f, 0xf8, 0xb3, 0xdb, 0x85, 0x93, 0xe9, 0x20, 0x2f, 0xbb, 0x5b, 0x7f, 0x53, + 0x02, 0x92, 0xd6, 0x43, 0xc9, 0xf7, 0x61, 0xac, 0x5e, 0x5f, 0x35, 0x3c, 0xfa, 0x52, 0xb7, 0x43, + 0x31, 0x06, 0xb9, 0x7d, 0x22, 0x17, 0x3e, 0xdd, 0x81, 0xef, 0x93, 0x94, 0xdf, 0xe0, 0x40, 0xa1, + 0xdf, 0x60, 0xca, 0x6b, 0x70, 0x25, 0xc3, 0x11, 0x6e, 0xb0, 0x87, 0x23, 0x5c, 0xda, 0xcb, 0xcd, + 0x5a, 0x86, 0x4a, 0x9e, 0x2a, 0x8b, 0x2b, 0x1c, 0x0f, 0x9b, 0xa6, 0xdd, 0x70, 0xf1, 0x15, 0xce, + 0x04, 0x5b, 0xef, 0xc2, 0x39, 0x45, 0xcd, 0xf3, 0xb1, 0x68, 0xc1, 0x0d, 0xc4, 0xf9, 0x57, 0x05, + 0x51, 0x88, 0x01, 0xd6, 0x9f, 0x0d, 0xa6, 0x08, 0xeb, 0xdd, 0xc3, 0x43, 0x27, 0x78, 0x4e, 0x6a, + 0x26, 0xe1, 0x40, 0xcf, 0x23, 0xc7, 0xe2, 0xe0, 0xcf, 0x8e, 0xaa, 0x7d, 0x1a, 0x77, 0xb6, 0x2f, + 0xa0, 0x86, 0xe1, 0x35, 0x29, 0xbf, 0x1b, 0xeb, 0xe7, 0x01, 0x9c, 0x0c, 0x20, 0xd9, 0x83, 0x49, + 0xb1, 0x77, 0xe3, 0x6f, 0xf9, 0x8d, 0xdd, 0x4e, 0x7e, 0x63, 0x46, 0xf3, 0x6e, 0x1a, 0x24, 0x7c, + 0x36, 0x9a, 0x6c, 0xc8, 0x17, 0x30, 0x25, 0x35, 0x35, 0xc1, 0x98, 0x7b, 0x33, 0xdd, 0x29, 0x66, + 0x6c, 0xd2, 0x70, 0xce, 0x09, 0x46, 0xac, 0xc9, 0x72, 0xb1, 0xe3, 0x9c, 0x87, 0x4e, 0xd2, 0x64, + 0x83, 0x44, 0x34, 0xd9, 0x80, 0xcd, 0x7f, 0x0a, 0x24, 0xdd, 0xaf, 0x5e, 0x9f, 0xd3, 0xa4, 0xf6, + 0x39, 0xcd, 0xd7, 0x60, 0x3a, 0xa3, 0x03, 0xa7, 0x62, 0xf1, 0x29, 0x90, 0x74, 0x4b, 0x4f, 0xc3, + 0xc1, 0xba, 0x0e, 0xaf, 0x29, 0x11, 0xa8, 0xd9, 0x60, 0xf0, 0x94, 0x16, 0xf0, 0xdf, 0xec, 0x87, + 0x6a, 0x0f, 0x54, 0xf2, 0x87, 0xa5, 0xa4, 0xb4, 0xf9, 0x6c, 0x7c, 0x3f, 0x29, 0xed, 0x6c, 0xfa, + 0x0c, 0xb1, 0x2f, 0x7e, 0xf0, 0x5b, 0x7f, 0xf9, 0xc2, 0x27, 0x8f, 0xf4, 0x90, 0x9d, 0x5e, 0x5a, + 0x83, 0xba, 0xb4, 0x6c, 0x98, 0x31, 0xce, 0x6c, 0x27, 0xd9, 0xbc, 0x2e, 0x03, 0x88, 0xec, 0xad, + 0xeb, 0xfe, 0xbe, 0xd0, 0x13, 0x35, 0x88, 0x75, 0x17, 0x66, 0x13, 0x3c, 0x85, 0x55, 0xfe, 0xfb, + 0xa0, 0x1e, 0xb1, 0x23, 0xd3, 0x81, 0xc5, 0xb3, 0xbf, 0x38, 0xaa, 0x4e, 0x32, 0x95, 0xfe, 0x66, + 0x9c, 0x1a, 0x40, 0xfe, 0x65, 0x6d, 0xe8, 0xf7, 0x0a, 0xb5, 0xb6, 0x1e, 0xdc, 0x87, 0xdc, 0x81, + 0x61, 0x0e, 0x49, 0x04, 0xe0, 0xd6, 0xb1, 0xc5, 0x9a, 0x20, 0x10, 0xad, 0x59, 0x7c, 0x72, 0x8b, + 0x3f, 0x6a, 0x71, 0x88, 0x08, 0x6b, 0x97, 0x27, 0xa4, 0x89, 0xc1, 0x2a, 0xc8, 0xf7, 0x60, 0x2d, + 0x0e, 0x65, 0x21, 0x9d, 0x40, 0x24, 0x9e, 0xe7, 0x3f, 0x6b, 0xd3, 0x16, 0x4f, 0xf6, 0xb7, 0x38, + 0x21, 0x9c, 0x40, 0x06, 0x1d, 0xc6, 0x00, 0xc9, 0xac, 0x4f, 0x60, 0x96, 0x69, 0x0a, 0x41, 0xb2, + 0x3e, 0x4c, 0x43, 0xc1, 0x60, 0xa6, 0x67, 0xbd, 0xc3, 0x40, 0xe8, 0x59, 0x2f, 0x0a, 0xad, 0x75, + 0x38, 0xcf, 0xad, 0x92, 0x7a, 0x97, 0xe2, 0x3b, 0x80, 0x21, 0xfc, 0x9d, 0x78, 0xb0, 0x99, 0xd1, + 0x7b, 0x8e, 0x67, 0x7d, 0x8c, 0x2f, 0x82, 0xc4, 0x24, 0x75, 0x7d, 0x2f, 0x36, 0x41, 0x9e, 0xec, + 0x09, 0xf1, 0xff, 0x0c, 0x17, 0x6b, 0x9d, 0x0e, 0xf5, 0x5a, 0x31, 0xe1, 0x4e, 0xe0, 0x9c, 0x30, + 0xc0, 0x03, 0xa9, 0xc1, 0x10, 0x62, 0xab, 0x0b, 0x54, 0xd1, 0xdc, 0x8c, 0xe6, 0x20, 0x9e, 0x88, + 0xc8, 0x8a, 0x15, 0x70, 0x4a, 0xab, 0x05, 0x73, 0xf5, 0xee, 0xa3, 0x43, 0x37, 0x42, 0x7f, 0x7c, + 0x0c, 0x92, 0x22, 0xeb, 0x5e, 0x93, 0x39, 0xc4, 0xb8, 0x30, 0xae, 0xc7, 0x2f, 0x47, 0xd0, 0xa5, + 0x5f, 0x04, 0x4e, 0x79, 0x7a, 0xe7, 0x66, 0x4c, 0x8a, 0xe6, 0x17, 0x5e, 0x0b, 0x16, 0x8b, 0x3c, + 0x63, 0xd6, 0x34, 0x9c, 0xd5, 0x2f, 0xa3, 0xf8, 0x0c, 0x99, 0x85, 0x69, 0xf3, 0x92, 0x89, 0x83, + 0xbf, 0x86, 0x19, 0x6e, 0x04, 0xe7, 0x11, 0xd5, 0x17, 0xe2, 0xe0, 0xe1, 0xfd, 0x7b, 0x0b, 0x89, + 0x87, 0x00, 0xe8, 0x1f, 0xac, 0x72, 0x65, 0xec, 0x2d, 0xf0, 0x57, 0x9d, 0x4f, 0x17, 0x8c, 0xab, + 0xcc, 0xfe, 0xbd, 0x85, 0xc5, 0x11, 0x11, 0x99, 0x96, 0x71, 0xe7, 0xc3, 0xff, 0x9d, 0x70, 0x5f, + 0xc0, 0x40, 0x02, 0xab, 0xd4, 0xc1, 0x47, 0x3f, 0xd9, 0xcf, 0xb1, 0xa7, 0xa0, 0x5f, 0xc5, 0xa9, + 0xec, 0x77, 0x5b, 0xd6, 0x1f, 0x97, 0xe0, 0x3a, 0x57, 0xc6, 0xb2, 0xe9, 0xf0, 0xc6, 0x29, 0x87, + 0x98, 0xbc, 0x07, 0x43, 0xa1, 0xe6, 0x1d, 0x61, 0x89, 0x96, 0x17, 0x71, 0xe2, 0x04, 0xa4, 0x06, + 0x13, 0xfa, 0xdb, 0x96, 0x93, 0x85, 0xc0, 0xb3, 0xc7, 0x0f, 0x1f, 0x3b, 0xea, 0xbd, 0xcb, 0x13, + 0xb8, 0xb0, 0xf2, 0x0d, 0x9b, 0x10, 0x62, 0x77, 0x12, 0x27, 0x87, 0xf8, 0xb9, 0xef, 0x99, 0x1d, + 0x31, 0x63, 0xcc, 0x63, 0x7d, 0x12, 0xcc, 0xce, 0xc8, 0x72, 0x83, 0x53, 0xea, 0xfb, 0x98, 0x6d, + 0xc0, 0xac, 0x3f, 0x2b, 0xc1, 0xc5, 0xec, 0xda, 0xc4, 0xc2, 0xb2, 0x06, 0x67, 0x97, 0x1c, 0xcf, + 0xf7, 0xdc, 0xa6, 0xd3, 0xae, 0x37, 0x0f, 0x68, 0xab, 0xab, 0xe2, 0xd7, 0xaa, 0x55, 0x66, 0x9f, + 0x7a, 0x92, 0x5c, 0xa2, 0xd8, 0x69, 0x2a, 0x76, 0x3a, 0xc4, 0xe7, 0x11, 0x7c, 0xed, 0x6d, 0xd3, + 0x40, 0xf1, 0xe3, 0x2d, 0xcb, 0x29, 0x25, 0xb7, 0xa5, 0xb5, 0xbf, 0xb5, 0xeb, 0xb9, 0x91, 0x22, + 0xe2, 0x66, 0x9e, 0xac, 0x22, 0xeb, 0x5f, 0x95, 0xe0, 0x3c, 0xa6, 0xac, 0x32, 0x92, 0x60, 0xc6, + 0x61, 0x9c, 0x65, 0x24, 0xe2, 0x92, 0xf1, 0xdc, 0xc3, 0xc0, 0x36, 0x43, 0x12, 0x93, 0x37, 0x61, + 0xb0, 0x2e, 0xbd, 0xb5, 0xa6, 0x12, 0x19, 0x86, 0x05, 0x05, 0x2b, 0xb7, 0x11, 0x8b, 0xed, 0x39, + 0xcb, 0x34, 0x6c, 0x52, 0x0f, 0x53, 0x41, 0x73, 0xab, 0x83, 0x06, 0x89, 0xc3, 0x31, 0x0d, 0xe6, + 0x85, 0x63, 0x1a, 0x32, 0xc3, 0x31, 0x59, 0x4f, 0x79, 0xc2, 0xaa, 0x64, 0x87, 0xc4, 0x20, 0x7d, + 0x9c, 0xca, 0x1c, 0xcd, 0xf7, 0x81, 0x73, 0x59, 0x3d, 0x63, 0x0a, 0x7a, 0x22, 0x29, 0x74, 0x7e, + 0xd8, 0xe4, 0x6d, 0x78, 0xc5, 0xc0, 0xad, 0xb5, 0xdb, 0xfe, 0x33, 0xda, 0xda, 0x0e, 0xfc, 0x43, + 0x3f, 0x32, 0x12, 0xf6, 0x88, 0xd4, 0xe9, 0xf1, 0x7d, 0x8e, 0x98, 0x95, 0x09, 0xb0, 0xf5, 0x3f, + 0xc1, 0xab, 0x3d, 0x38, 0x8a, 0x4e, 0xd5, 0xe1, 0xac, 0x93, 0x28, 0x93, 0x6e, 0x37, 0xaf, 0x66, + 0xf5, 0x2b, 0xc9, 0x28, 0xb4, 0xd3, 0xf4, 0x37, 0x76, 0x8c, 0x6c, 0xcb, 0xa4, 0x02, 0x33, 0xdb, + 0xf6, 0xd6, 0xf2, 0xee, 0xd2, 0x4e, 0x63, 0xe7, 0x8b, 0xed, 0x95, 0xc6, 0xee, 0xe6, 0x83, 0xcd, + 0xad, 0x87, 0x9b, 0x3c, 0xee, 0xb8, 0x51, 0xb2, 0xb3, 0x52, 0xdb, 0x28, 0x97, 0xc8, 0x0c, 0x94, + 0x0d, 0xf0, 0xca, 0xee, 0x62, 0xb9, 0xff, 0xc6, 0xd7, 0x46, 0x16, 0x61, 0x72, 0x11, 0x2a, 0xf5, + 0xdd, 0xed, 0xed, 0x2d, 0x5b, 0x71, 0xd5, 0xa3, 0x9e, 0xcf, 0xc2, 0x59, 0xa3, 0xf4, 0xae, 0xbd, + 0xb2, 0x52, 0x2e, 0xb1, 0xa6, 0x18, 0xe0, 0x6d, 0x7b, 0x65, 0x63, 0x6d, 0x77, 0xa3, 0xdc, 0x7f, + 0xa3, 0xa1, 0xbf, 0x31, 0x23, 0x17, 0x60, 0x6e, 0x79, 0x65, 0x6f, 0x6d, 0x69, 0x25, 0x8b, 0xf7, + 0x0c, 0x94, 0xf5, 0xc2, 0x9d, 0xad, 0x9d, 0x6d, 0xce, 0x5a, 0x87, 0x3e, 0x5c, 0x59, 0xac, 0xed, + 0xee, 0xac, 0x6e, 0x96, 0x07, 0xac, 0xc1, 0xd1, 0xfe, 0x72, 0xff, 0x8d, 0x1f, 0x1b, 0x0f, 0xd0, + 0x58, 0xf3, 0x05, 0xfa, 0x6e, 0xbd, 0x76, 0x2f, 0xbf, 0x0a, 0x5e, 0xba, 0x71, 0xb7, 0x56, 0x2e, + 0x91, 0x4b, 0x70, 0xde, 0x80, 0x6e, 0xd7, 0xea, 0xf5, 0x87, 0x5b, 0xf6, 0xf2, 0xfa, 0x4a, 0xbd, + 0x5e, 0xee, 0xbf, 0xb1, 0x67, 0x84, 0xa0, 0x63, 0x35, 0x6c, 0xdc, 0xad, 0x35, 0xec, 0x95, 0xcf, + 0x76, 0xd7, 0xec, 0x95, 0xe5, 0x74, 0x0d, 0x46, 0xe9, 0x17, 0x2b, 0xf5, 0x72, 0x89, 0x4c, 0xc3, + 0x19, 0x03, 0xba, 0xb9, 0x55, 0xee, 0xbf, 0xf1, 0x9a, 0x88, 0x52, 0x46, 0xa6, 0x00, 0x96, 0x57, + 0xea, 0x4b, 0x2b, 0x9b, 0xcb, 0x6b, 0x9b, 0xf7, 0xca, 0x7d, 0x64, 0x12, 0xc6, 0x6a, 0xea, 0x67, + 0xe9, 0xc6, 0x07, 0x70, 0x26, 0x71, 0xb4, 0x67, 0x18, 0xea, 0x50, 0x5c, 0xee, 0x43, 0xf1, 0xcb, + 0x9f, 0x68, 0x5f, 0xe5, 0xa7, 0xf4, 0x72, 0xe9, 0xc6, 0xa2, 0xcc, 0x6a, 0xab, 0x7d, 0xe7, 0x64, + 0x1c, 0x46, 0x96, 0x57, 0xee, 0xd6, 0x76, 0xd7, 0x77, 0xca, 0x7d, 0xec, 0xc7, 0x92, 0xbd, 0x52, + 0xdb, 0x59, 0x59, 0x2e, 0x97, 0xc8, 0x18, 0x0c, 0xd5, 0x77, 0x6a, 0x3b, 0x2b, 0xe5, 0x7e, 0x32, + 0x0a, 0x83, 0xbb, 0xf5, 0x15, 0xbb, 0x3c, 0xb0, 0xf0, 0xcf, 0xfe, 0xb0, 0xc4, 0x8d, 0x8c, 0xf2, + 0x31, 0xd3, 0xd7, 0xda, 0x61, 0x52, 0x2c, 0x79, 0x22, 0x85, 0x67, 0xee, 0xc9, 0x11, 0xb5, 0x80, + 0xf9, 0x82, 0x5b, 0x17, 0x44, 0xb8, 0x5e, 0xba, 0x5d, 0x22, 0x36, 0x7a, 0xa9, 0x24, 0xce, 0x56, + 0x8a, 0x73, 0xf6, 0xf1, 0x77, 0xfe, 0x52, 0xe1, 0x91, 0x8c, 0xfc, 0x1a, 0x58, 0x3a, 0xcf, 0x9c, + 0x13, 0xc8, 0xf7, 0x4f, 0x76, 0xd2, 0x90, 0x75, 0xbe, 0x76, 0x32, 0x74, 0x72, 0x1f, 0x26, 0x99, + 0x6e, 0xae, 0xd0, 0xc8, 0x85, 0x24, 0xa1, 0x76, 0x1c, 0x98, 0xbf, 0x98, 0x5d, 0xa8, 0xb2, 0xec, + 0x4c, 0x60, 0x47, 0xf8, 0xc1, 0x3a, 0x24, 0x32, 0x92, 0x85, 0x84, 0xf0, 0x15, 0x7f, 0xfe, 0x6c, + 0x02, 0xbc, 0x77, 0xe7, 0x76, 0x89, 0xd4, 0x31, 0x8c, 0x9c, 0xa1, 0xe4, 0x13, 0xf9, 0xba, 0x2e, + 0xad, 0xfd, 0xf3, 0xd6, 0x54, 0x55, 0x4e, 0xcc, 0x9c, 0xd3, 0xc1, 0x26, 0x90, 0xb4, 0xee, 0x4c, + 0xae, 0xc4, 0xf3, 0x20, 0x5b, 0xad, 0x9e, 0x3f, 0x97, 0x72, 0x3e, 0x5c, 0x61, 0xda, 0x13, 0x59, + 0x81, 0x29, 0xf1, 0x4c, 0x5d, 0x68, 0xf3, 0xa4, 0xe8, 0x3c, 0x90, 0xcb, 0xe6, 0x1e, 0xca, 0x49, + 0x9d, 0x08, 0xc8, 0x7c, 0xdc, 0x8f, 0xe4, 0x31, 0x61, 0xfe, 0x42, 0x66, 0x99, 0xe8, 0xdf, 0x5d, + 0x98, 0x32, 0x0f, 0x17, 0x44, 0x0e, 0x50, 0xe6, 0x99, 0x23, 0xb7, 0x41, 0x0d, 0x98, 0xdb, 0x70, + 0x5c, 0xbc, 0x2b, 0x11, 0x2e, 0x6e, 0xd2, 0x41, 0x8d, 0x54, 0x0b, 0x3c, 0xd6, 0xea, 0xd4, 0x6b, + 0xa9, 0x41, 0xc8, 0x8b, 0x98, 0x8f, 0x9f, 0x4d, 0x5d, 0xea, 0xc8, 0xa6, 0x83, 0x1f, 0xb1, 0xcc, + 0x3c, 0xc7, 0x59, 0x3e, 0x9b, 0xf3, 0x79, 0x6e, 0xc6, 0x64, 0x03, 0x95, 0xf4, 0x04, 0x47, 0x6d, + 0x4e, 0x9c, 0x9a, 0x5d, 0x05, 0x83, 0x25, 0x68, 0xf9, 0xe1, 0x45, 0x61, 0x48, 0x72, 0x04, 0x97, + 0xcb, 0xec, 0x76, 0x89, 0x7c, 0x8d, 0x5f, 0x75, 0x26, 0xbb, 0x87, 0x6e, 0x74, 0x20, 0xb4, 0x9f, + 0x0b, 0x99, 0x0c, 0xc4, 0x87, 0x52, 0xc0, 0xdd, 0x86, 0x99, 0x2c, 0xcf, 0x66, 0x25, 0xd0, 0x02, + 0xb7, 0xe7, 0xdc, 0x59, 0x60, 0xb3, 0xa3, 0x46, 0x2b, 0x7f, 0x90, 0x0a, 0x1c, 0x6b, 0x73, 0x79, + 0x7e, 0x04, 0x53, 0x6c, 0x96, 0x3c, 0xa0, 0xb4, 0x53, 0x6b, 0xbb, 0x4f, 0x69, 0x48, 0x64, 0x0c, + 0x60, 0x05, 0xca, 0xa3, 0xbd, 0x5e, 0x22, 0xdf, 0x83, 0xf1, 0x87, 0x4e, 0xd4, 0x3c, 0x10, 0xb1, + 0x30, 0x65, 0xa8, 0x4c, 0x84, 0xcd, 0xcb, 0x5f, 0x58, 0x78, 0xbb, 0x44, 0x7e, 0x08, 0x23, 0xf7, + 0x68, 0x84, 0xaf, 0x9b, 0xaf, 0x2a, 0x27, 0x3f, 0x6e, 0x9b, 0x5c, 0xf3, 0xd4, 0x13, 0x1e, 0xd9, + 0xe0, 0xa4, 0x21, 0x97, 0xdc, 0x02, 0xe0, 0x0b, 0x02, 0x72, 0x48, 0x16, 0xcf, 0xa7, 0x9a, 0x4d, + 0xee, 0x31, 0xe5, 0xa1, 0x4d, 0x23, 0x7a, 0xd2, 0x2a, 0xf3, 0x64, 0xb4, 0x0e, 0x53, 0x2a, 0x31, + 0xd1, 0x26, 0x86, 0x2c, 0xb1, 0x12, 0xcc, 0xc2, 0x53, 0x70, 0xfb, 0x80, 0x7d, 0x15, 0x3c, 0x2b, + 0x2f, 0xc6, 0xb6, 0xc0, 0x95, 0x74, 0x4e, 0x0f, 0x90, 0xa1, 0x2f, 0xa1, 0x52, 0x88, 0x1c, 0x4d, + 0xa3, 0x5d, 0xf5, 0xc3, 0xc8, 0xa4, 0x55, 0x90, 0x6c, 0xda, 0x5f, 0x85, 0x79, 0xbd, 0x5e, 0x33, + 0x18, 0x73, 0xbc, 0xe6, 0xe6, 0xc5, 0x78, 0x9e, 0xbf, 0x5a, 0x80, 0x21, 0xce, 0x6f, 0x03, 0xbf, + 0xd3, 0x5f, 0xc2, 0xe5, 0x64, 0x19, 0xa6, 0x65, 0x5d, 0x5b, 0x1d, 0xea, 0xd5, 0xeb, 0xab, 0x98, + 0x84, 0x46, 0xba, 0x94, 0x68, 0x30, 0xc9, 0x9d, 0xa4, 0x8b, 0xd8, 0xd6, 0x67, 0xc4, 0xb0, 0x20, + 0x45, 0x91, 0x2d, 0xe2, 0xad, 0x2f, 0x33, 0x4a, 0xf0, 0x03, 0x6e, 0x54, 0x32, 0x94, 0xff, 0xbd, + 0x05, 0x52, 0x70, 0x00, 0x9a, 0xcf, 0x39, 0x42, 0xdc, 0x2e, 0x91, 0x2f, 0x80, 0xa4, 0x8f, 0x24, + 0x4a, 0x84, 0xb9, 0xc7, 0x2f, 0x25, 0xc2, 0x82, 0xf3, 0xcc, 0x0a, 0x4c, 0xab, 0x08, 0x36, 0x71, + 0x39, 0xc9, 0x69, 0x4b, 0xc1, 0x0e, 0x36, 0x9b, 0xc1, 0x66, 0x6f, 0xa1, 0x80, 0x51, 0x26, 0x9c, + 0x7c, 0x02, 0xd3, 0x62, 0xee, 0x1b, 0xed, 0x29, 0xab, 0x65, 0x4c, 0x1c, 0x6e, 0x72, 0x5b, 0x72, + 0x1f, 0x66, 0xeb, 0x09, 0xc1, 0x73, 0x87, 0xfa, 0xf3, 0x26, 0x0b, 0x04, 0xd6, 0x69, 0xc4, 0x25, + 0x9f, 0xcd, 0xeb, 0x01, 0x10, 0x6e, 0x5b, 0x92, 0xec, 0x9e, 0xba, 0xf4, 0x19, 0xb9, 0x94, 0x68, + 0x3a, 0x03, 0x22, 0x1a, 0xae, 0x83, 0xb9, 0x3d, 0xdb, 0xe1, 0xa9, 0xa9, 0x11, 0x6a, 0x5c, 0xc5, + 0x5f, 0x31, 0x08, 0x8c, 0xdb, 0x7c, 0x31, 0x8e, 0xe7, 0x73, 0x31, 0xc8, 0x6f, 0x60, 0x04, 0xda, + 0xe2, 0xd3, 0x19, 0xf9, 0x5e, 0xd6, 0x21, 0x3a, 0xe7, 0x7c, 0x39, 0xff, 0xe6, 0xc9, 0x90, 0xd5, + 0x79, 0x78, 0xf2, 0x1e, 0x8d, 0xb6, 0xdb, 0xdd, 0x7d, 0x17, 0x93, 0x96, 0x12, 0x65, 0x7b, 0x52, + 0x20, 0x31, 0xbd, 0x65, 0xe0, 0xb7, 0xb8, 0xa0, 0x4e, 0x7f, 0x42, 0xd6, 0xa0, 0xcc, 0xb7, 0x11, + 0x8d, 0xc5, 0xa5, 0x14, 0x0b, 0x81, 0xe2, 0x04, 0xce, 0x61, 0x98, 0x3b, 0x5a, 0xb7, 0xb8, 0xef, + 0x13, 0x91, 0x9f, 0xb6, 0xae, 0xa7, 0x4e, 0x1b, 0x30, 0x15, 0x95, 0x9f, 0x8d, 0x88, 0x4d, 0x43, + 0x1a, 0xc9, 0x50, 0x37, 0x3c, 0x65, 0xed, 0xb5, 0x58, 0x67, 0x48, 0x97, 0xc6, 0x2b, 0x48, 0x22, + 0x2c, 0xdb, 0xde, 0x5b, 0x44, 0xa5, 0xf1, 0xcd, 0x60, 0xfa, 0x9a, 0xa1, 0xda, 0x9c, 0x8e, 0xef, + 0xdb, 0xb8, 0x95, 0x61, 0x78, 0x9f, 0xd9, 0xb8, 0x6d, 0xec, 0xb7, 0xa4, 0x9a, 0xd4, 0xa8, 0xf6, + 0x16, 0x70, 0x65, 0x64, 0x7b, 0x2d, 0xd3, 0x84, 0xbb, 0x41, 0x40, 0x3d, 0x4e, 0x9c, 0xa7, 0xb6, + 0x64, 0x51, 0x7f, 0x8c, 0x2b, 0x98, 0x46, 0xcd, 0xdf, 0xfd, 0xf5, 0x62, 0xc1, 0x53, 0x2c, 0xdd, + 0x2e, 0x91, 0xf7, 0x60, 0x54, 0xb4, 0x91, 0x11, 0x19, 0x8d, 0x0e, 0x0b, 0x5a, 0x8d, 0x94, 0xc0, + 0x85, 0x84, 0x6d, 0x36, 0x71, 0xf2, 0x46, 0x9f, 0xb7, 0xf9, 0x3d, 0xb6, 0x67, 0xb7, 0x5e, 0x84, + 0x72, 0x49, 0x6e, 0xde, 0x48, 0x59, 0x51, 0x21, 0x61, 0x24, 0xa8, 0xc7, 0x2e, 0xcb, 0x99, 0x30, + 0xf5, 0x1b, 0xe3, 0x2a, 0xaa, 0xf0, 0x68, 0x4a, 0xfd, 0x36, 0xc0, 0xbd, 0xb6, 0xec, 0x35, 0x28, + 0xd7, 0x9a, 0xb8, 0xa1, 0xd4, 0xe9, 0xa1, 0xd3, 0x39, 0xf0, 0x03, 0xaa, 0xce, 0x3e, 0xc9, 0x02, + 0xc9, 0x6b, 0x56, 0x29, 0x28, 0xa2, 0x60, 0x9d, 0x3a, 0x18, 0x7c, 0x7a, 0x4e, 0x69, 0x28, 0x89, + 0xa2, 0x6c, 0x8a, 0x82, 0xb3, 0xce, 0xcc, 0x12, 0x3b, 0x9d, 0xb5, 0xbf, 0x1d, 0x9b, 0x0f, 0x70, + 0xc1, 0x50, 0xc8, 0xa1, 0xda, 0x21, 0x14, 0x48, 0x9d, 0x0a, 0xe5, 0x13, 0x20, 0x85, 0x5a, 0x93, + 0x57, 0xcf, 0xb1, 0x58, 0xf2, 0xa8, 0xf3, 0xaa, 0xff, 0x01, 0x4c, 0xad, 0xb0, 0x05, 0xbd, 0xdb, + 0x72, 0x79, 0xc0, 0x7d, 0x62, 0x46, 0x50, 0xcf, 0x25, 0x5c, 0x95, 0x59, 0xcd, 0x90, 0x54, 0x58, + 0x10, 0xe4, 0x9e, 0xa2, 0xc1, 0xe4, 0x78, 0xcc, 0x48, 0xb6, 0x22, 0xe7, 0x01, 0x9e, 0xf0, 0x85, + 0xc9, 0x60, 0x8e, 0x2b, 0x96, 0xb5, 0x4e, 0xa7, 0x2d, 0x2d, 0xdb, 0xfc, 0xfa, 0xfe, 0x55, 0xe3, + 0x24, 0x9a, 0x2a, 0x97, 0xbc, 0xd3, 0xba, 0xe7, 0xe7, 0x5a, 0x96, 0xe1, 0x1c, 0x9e, 0x39, 0xe5, + 0xbd, 0xe6, 0xa2, 0x0a, 0x91, 0x5d, 0x6b, 0xb7, 0x53, 0xc4, 0x21, 0x79, 0xc3, 0xe4, 0x9e, 0x85, + 0xd3, 0xab, 0x06, 0x3c, 0xe9, 0x73, 0xe5, 0xad, 0xd6, 0xe9, 0xf0, 0xc5, 0xf2, 0xb2, 0x5a, 0x30, + 0xcc, 0x82, 0xf4, 0x49, 0x3f, 0x59, 0x2e, 0xd6, 0xf6, 0xfb, 0x38, 0xcd, 0xe2, 0x54, 0xc4, 0x44, + 0x3f, 0x37, 0x27, 0x33, 0x31, 0x2b, 0x5d, 0x2e, 0x51, 0xa8, 0xf6, 0x89, 0x33, 0xa8, 0x41, 0xc5, + 0x79, 0x8d, 0x95, 0x81, 0x27, 0x01, 0x97, 0xfc, 0x2e, 0xe7, 0x15, 0x2b, 0x83, 0x6b, 0x39, 0x99, + 0xee, 0x5d, 0x75, 0x39, 0x9d, 0x07, 0xde, 0xec, 0x72, 0x6e, 0x9e, 0xf8, 0xfb, 0x50, 0x4e, 0x66, + 0x9a, 0x56, 0x4c, 0x73, 0x52, 0x50, 0xe7, 0x8e, 0xc9, 0x5d, 0x98, 0xd1, 0x47, 0x54, 0xf5, 0x3b, + 0x6f, 0xf5, 0xcf, 0xe3, 0xb3, 0x03, 0xb3, 0x99, 0x89, 0xa1, 0xd5, 0x16, 0x5b, 0x94, 0x36, 0x3a, + 0x97, 0x2b, 0x85, 0x73, 0xd9, 0xb9, 0xe1, 0xc9, 0x2b, 0xa6, 0xfd, 0x20, 0x3b, 0x53, 0xf6, 0xfc, + 0xab, 0x3d, 0xb0, 0x84, 0x40, 0xbf, 0xc6, 0x1d, 0x30, 0x55, 0xc7, 0x55, 0xcd, 0xa2, 0x90, 0x53, + 0x81, 0x55, 0x84, 0xa2, 0xe6, 0xc0, 0x4c, 0x46, 0x71, 0xbe, 0x88, 0xaf, 0xe5, 0xf3, 0x8c, 0x27, + 0xd6, 0x9e, 0x8c, 0x04, 0x9d, 0x2b, 0x99, 0xc2, 0x1c, 0xe2, 0x05, 0x47, 0xd2, 0x79, 0x35, 0x1f, + 0x4e, 0xde, 0xe4, 0x3c, 0x6e, 0x2d, 0x65, 0xfd, 0x31, 0x12, 0x7c, 0x27, 0xad, 0x3f, 0x59, 0x89, + 0xc9, 0x95, 0x18, 0x8a, 0x52, 0xdf, 0xf3, 0xdd, 0xf8, 0x2b, 0x6e, 0x0e, 0x32, 0xab, 0xd0, 0xcd, + 0x41, 0x99, 0xfc, 0xaf, 0xe4, 0x23, 0xe8, 0xcc, 0x1d, 0x7e, 0xf7, 0x9b, 0xc8, 0x50, 0x4e, 0xf4, + 0x13, 0x57, 0x76, 0xf6, 0x72, 0x35, 0x37, 0x32, 0x51, 0xf4, 0x2a, 0x1e, 0xca, 0x6f, 0x30, 0x47, + 0x4a, 0x05, 0xe9, 0xdb, 0x8b, 0xd5, 0x94, 0x2d, 0xa8, 0xc4, 0x83, 0x99, 0xe8, 0xc0, 0x29, 0x87, + 0x52, 0x0a, 0xe3, 0x7c, 0x6e, 0xd2, 0x76, 0xf2, 0x7a, 0xea, 0x4b, 0xcf, 0x11, 0x4c, 0x61, 0x15, + 0x7c, 0x3d, 0xd7, 0x22, 0x4b, 0x5f, 0x88, 0x6d, 0xc1, 0x7a, 0x7e, 0xf7, 0xd4, 0x7a, 0x9e, 0x91, + 0xfc, 0xfd, 0x1e, 0xea, 0xc5, 0x5a, 0x02, 0xf7, 0xdc, 0x5e, 0x5f, 0xca, 0xe2, 0x13, 0xa6, 0x57, + 0x5c, 0xad, 0x5d, 0x52, 0x4f, 0x4b, 0x16, 0x9c, 0x66, 0xc5, 0x3d, 0x49, 0xd3, 0xf2, 0xf8, 0x2c, + 0xc3, 0xb8, 0x96, 0xf9, 0x9d, 0x9c, 0x37, 0xc4, 0x64, 0xec, 0xa1, 0xf3, 0x46, 0xe7, 0xcc, 0xed, + 0x73, 0x09, 0x2d, 0xd2, 0x2a, 0x7f, 0x7c, 0x6e, 0x2b, 0x2e, 0xa4, 0x79, 0x18, 0xd6, 0x68, 0x25, + 0x05, 0xde, 0x9a, 0x8b, 0x49, 0xe1, 0x18, 0x0d, 0xca, 0xef, 0x12, 0xd1, 0x45, 0xd3, 0xa3, 0x49, + 0xf9, 0xfa, 0xeb, 0xb4, 0x48, 0x2f, 0x8b, 0xe9, 0x60, 0x64, 0xe8, 0xc0, 0x73, 0xca, 0xb4, 0xa6, + 0x41, 0x0b, 0x2c, 0x1d, 0xdb, 0xf8, 0x02, 0x25, 0x23, 0x15, 0xbe, 0x5a, 0x61, 0x0b, 0x33, 0xe5, + 0x67, 0xe8, 0x6e, 0x6a, 0xcd, 0xce, 0xe5, 0x58, 0x98, 0x1b, 0x3f, 0xb7, 0xa5, 0x3f, 0xd2, 0xd6, + 0xec, 0x54, 0xc2, 0x7b, 0x72, 0x3d, 0xa9, 0xb8, 0xe5, 0xe5, 0xc4, 0x2f, 0xd8, 0x13, 0x66, 0xb2, + 0x72, 0xe5, 0x6b, 0xe6, 0xe1, 0xdc, 0x44, 0xfa, 0x19, 0x52, 0xb0, 0xe5, 0xfc, 0xcf, 0xe1, 0x56, + 0x90, 0x39, 0x3f, 0xb7, 0x85, 0x5f, 0x6a, 0x0b, 0x5d, 0x22, 0xc3, 0xbd, 0x3a, 0x8e, 0xf7, 0x48, + 0x81, 0x9f, 0xcb, 0x7b, 0x13, 0xdf, 0x2c, 0xa5, 0xd3, 0xd3, 0x2b, 0xcd, 0xa6, 0x28, 0x79, 0x7d, + 0xa6, 0xf5, 0x78, 0x36, 0xdd, 0x45, 0xc6, 0xef, 0x5c, 0xc2, 0xf6, 0xdb, 0xab, 0x61, 0x5f, 0xcb, + 0xc5, 0x38, 0x23, 0xad, 0x7d, 0x62, 0x31, 0xce, 0x4f, 0x7c, 0x5f, 0x70, 0x0c, 0x3a, 0x53, 0x77, + 0xf7, 0x3d, 0x2d, 0x2b, 0xbd, 0x3a, 0x04, 0xa5, 0x13, 0xe5, 0xab, 0x25, 0x26, 0x2b, 0x89, 0xfd, + 0x16, 0xd3, 0x7f, 0xb8, 0xf6, 0xae, 0xe7, 0x17, 0x27, 0xf3, 0xf9, 0x69, 0xd5, 0xd5, 0x72, 0x93, + 0x99, 0x90, 0x5c, 0x63, 0xa8, 0x27, 0xf7, 0x56, 0x0c, 0x33, 0xf2, 0x8c, 0x2b, 0x86, 0x99, 0xd9, + 0xc0, 0x6f, 0xa1, 0xd5, 0xc5, 0xf6, 0xdb, 0x54, 0xb7, 0xba, 0x68, 0xd9, 0xa2, 0x13, 0x46, 0x0f, + 0xf2, 0x21, 0x9a, 0x3c, 0x8a, 0xed, 0x24, 0x73, 0x26, 0x27, 0xdd, 0xb3, 0x64, 0x4c, 0xa5, 0xe2, + 0x56, 0x36, 0xf6, 0x64, 0x36, 0xf0, 0xf9, 0x4a, 0xba, 0x40, 0xd0, 0xbf, 0x23, 0xad, 0x26, 0xd8, + 0xe0, 0x8a, 0x69, 0x6d, 0xca, 0x6f, 0xf3, 0x3b, 0xd2, 0x64, 0x62, 0x90, 0xa5, 0x12, 0x71, 0x27, + 0xc9, 0x7e, 0x00, 0x13, 0x71, 0xd2, 0xed, 0xbd, 0x05, 0x8d, 0x30, 0x91, 0x89, 0x3b, 0x49, 0xf8, + 0x9e, 0xbc, 0x56, 0xc1, 0xfa, 0xcc, 0xc2, 0x62, 0x15, 0xe0, 0x63, 0x69, 0xa2, 0x31, 0x5a, 0x9a, + 0x4a, 0xe1, 0x5d, 0xb0, 0x72, 0x4f, 0xe8, 0x29, 0x33, 0xd5, 0xbc, 0xc8, 0x48, 0x7a, 0xab, 0xe6, + 0x45, 0x56, 0xd2, 0xda, 0xf8, 0xda, 0xe1, 0x0b, 0x69, 0x8f, 0x88, 0x99, 0x5e, 0x32, 0x9a, 0x95, + 0xe2, 0x7b, 0x39, 0xaf, 0x38, 0xc9, 0xba, 0x0e, 0xe5, 0x64, 0x7e, 0x4f, 0x75, 0x98, 0xcb, 0x49, + 0xc4, 0xaa, 0x4e, 0x88, 0xb9, 0x89, 0x41, 0xb7, 0xa5, 0x71, 0xdd, 0xe4, 0x7b, 0x35, 0xbb, 0x51, + 0x3a, 0xeb, 0x7c, 0x6b, 0xfb, 0xa4, 0x91, 0xea, 0x53, 0x3f, 0x66, 0xa7, 0x52, 0x89, 0xea, 0x6a, + 0x59, 0x46, 0x76, 0x50, 0x57, 0x46, 0x9d, 0xca, 0x4e, 0xb4, 0xfe, 0x86, 0x79, 0xfe, 0x2d, 0x88, + 0x0b, 0xdf, 0xf3, 0x0a, 0x9a, 0xfc, 0x0a, 0xcc, 0xe5, 0xc4, 0xb9, 0x26, 0xaf, 0x26, 0xcc, 0xb4, + 0xd9, 0x71, 0xb0, 0xd5, 0x04, 0xc9, 0xcc, 0xc1, 0xbd, 0x81, 0xbe, 0x0b, 0x46, 0x7c, 0x89, 0xd4, + 0x7d, 0xe0, 0x43, 0x37, 0x3a, 0xe0, 0xa9, 0xa6, 0xb5, 0x35, 0x37, 0x33, 0x30, 0x05, 0xa9, 0xe3, + 0x41, 0xc6, 0x80, 0x66, 0x5c, 0x09, 0x66, 0x30, 0x9c, 0xcf, 0x66, 0xc8, 0xd6, 0x0e, 0x36, 0x17, + 0x32, 0x82, 0x7f, 0xa8, 0xb9, 0x90, 0x1f, 0x18, 0x24, 0xb7, 0x99, 0xdb, 0x52, 0xc1, 0xca, 0xe6, + 0x98, 0x1f, 0x07, 0x24, 0x97, 0xe3, 0x7d, 0xc6, 0x31, 0x15, 0xda, 0x83, 0xe4, 0xa0, 0x17, 0xaf, + 0x1e, 0xb6, 0xdc, 0xaf, 0x4d, 0xaa, 0x05, 0xad, 0x7d, 0x79, 0x41, 0x44, 0x72, 0xdb, 0xb7, 0x22, + 0xbf, 0xa7, 0xec, 0xf6, 0x9d, 0x74, 0xc7, 0x56, 0x97, 0x67, 0x89, 0xe8, 0x32, 0x46, 0x47, 0x35, + 0xf8, 0x7c, 0x0e, 0x9c, 0x6c, 0xa2, 0x33, 0x52, 0x12, 0xaa, 0x9d, 0x68, 0xb3, 0xc3, 0xd7, 0xe4, + 0xf2, 0xe3, 0xf3, 0xd8, 0x08, 0xff, 0x71, 0x9a, 0x79, 0x9c, 0x88, 0x1b, 0x22, 0xe6, 0xb1, 0x01, + 0x3d, 0xdd, 0x3c, 0x4e, 0x30, 0x34, 0xe7, 0x71, 0xb2, 0x99, 0x49, 0x33, 0x41, 0xee, 0xa8, 0x26, + 0x9b, 0xa9, 0xe6, 0x71, 0x36, 0xc7, 0xfc, 0x30, 0x2d, 0xb9, 0x1c, 0xd5, 0x3c, 0x36, 0x39, 0xe6, + 0xa0, 0x9f, 0x70, 0x1e, 0x27, 0x2b, 0x31, 0xe7, 0xf1, 0xa9, 0xda, 0xa7, 0xe6, 0x71, 0x76, 0xfb, + 0x4e, 0x3d, 0x8f, 0x13, 0x71, 0x8d, 0x8c, 0x8e, 0x66, 0xcd, 0xe3, 0x24, 0x3e, 0x9f, 0xc7, 0x49, + 0x68, 0xc2, 0x32, 0x53, 0x30, 0x8f, 0x93, 0x94, 0x9f, 0x21, 0xbf, 0x44, 0x4c, 0x96, 0x93, 0xcc, + 0xe4, 0xdc, 0x70, 0x2e, 0xe4, 0x21, 0xda, 0x06, 0x13, 0xf0, 0x93, 0xcd, 0xe6, 0x8b, 0x79, 0x4c, + 0x71, 0x3e, 0xef, 0x49, 0x21, 0x26, 0x9b, 0x6b, 0x1a, 0xbe, 0xb2, 0x43, 0xd2, 0x14, 0x34, 0x78, + 0x8f, 0xcd, 0x9b, 0x56, 0x01, 0xdf, 0xa2, 0x88, 0x3a, 0x05, 0x7c, 0xd5, 0x39, 0x28, 0xc9, 0x37, + 0x97, 0xa4, 0x78, 0x7e, 0x7f, 0x2e, 0x6f, 0x47, 0x92, 0x74, 0x0b, 0x89, 0x93, 0xd5, 0xa9, 0x5b, + 0xaa, 0x4e, 0x58, 0xc9, 0x96, 0x9e, 0x76, 0x9e, 0x6f, 0x48, 0xed, 0x21, 0x15, 0x8a, 0x2b, 0xd1, 0x69, 0x7d, 0xae, 0xe7, 0x96, 0x90, 0x1d, 0x34, 0x04, 0xa7, 0xe1, 0x9a, 0x11, 0x39, 0x2f, 0xe6, - 0x57, 0x57, 0xae, 0xa9, 0xa0, 0x42, 0x3a, 0xd7, 0xbc, 0x88, 0x43, 0x8a, 0x6b, 0x9a, 0xfa, 0x13, - 0x34, 0x9d, 0x89, 0x17, 0x5f, 0xde, 0x23, 0x3f, 0xff, 0x9c, 0x33, 0x65, 0x38, 0x4c, 0x31, 0x5c, - 0xf4, 0x53, 0xfb, 0x48, 0x5c, 0xff, 0x49, 0x60, 0xae, 0xf0, 0xb3, 0xe8, 0xc9, 0x27, 0x50, 0x14, - 0xcb, 0x5b, 0xcc, 0x20, 0x0b, 0x31, 0x77, 0xe8, 0x16, 0xa5, 0xc5, 0xee, 0x14, 0x2d, 0x38, 0x8d, - 0xa5, 0xee, 0x34, 0x92, 0xc8, 0x37, 0x6b, 0xb1, 0xed, 0x70, 0x27, 0x68, 0x87, 0x11, 0x6d, 0xa4, + 0x57, 0x4f, 0xae, 0xa9, 0xa0, 0x42, 0x3a, 0xd7, 0xbc, 0x88, 0x43, 0x8a, 0x6b, 0x9a, 0xfa, 0x13, + 0x34, 0x9d, 0x89, 0x17, 0x5f, 0xde, 0x63, 0x3f, 0xff, 0x9c, 0x33, 0x6d, 0x38, 0x4c, 0x31, 0x5c, + 0xf4, 0x53, 0xfb, 0x48, 0x5c, 0xff, 0x49, 0x60, 0xae, 0xf0, 0xb3, 0xe8, 0xc9, 0x27, 0x50, 0x16, + 0xcb, 0x5b, 0xcc, 0x20, 0x0b, 0x31, 0x77, 0xe8, 0x16, 0xa5, 0xc5, 0xee, 0x04, 0x2d, 0x38, 0x89, + 0xa5, 0xee, 0x24, 0x92, 0xc8, 0x37, 0x6b, 0xb1, 0xed, 0x70, 0x27, 0xe8, 0x86, 0x11, 0x6d, 0xa5, 0xcd, 0x51, 0x66, 0x63, 0xa4, 0x5b, 0x85, 0x89, 0xbe, 0xb7, 0x40, 0xd6, 0x70, 0x6d, 0x33, 0xc1, - 0x9d, 0xec, 0x75, 0xd9, 0x6c, 0x70, 0xe9, 0x59, 0x55, 0x4f, 0x8b, 0xcc, 0x36, 0xe5, 0xd5, 0x9d, - 0xdf, 0x28, 0x25, 0xa2, 0x53, 0xf6, 0x2e, 0x4f, 0x44, 0xfc, 0x40, 0xcd, 0x6d, 0x87, 0xdd, 0x24, - 0x93, 0x7c, 0xec, 0x44, 0x3e, 0x85, 0x11, 0x49, 0xdc, 0x5d, 0x20, 0x49, 0x6a, 0x14, 0xc8, 0x32, - 0x8c, 0x1b, 0x2f, 0xb9, 0xd4, 0xe9, 0x26, 0xeb, 0x7d, 0x57, 0x87, 0x71, 0x1e, 0x37, 0x5e, 0x6c, - 0x29, 0x2e, 0x59, 0xef, 0xb8, 0x72, 0xb9, 0x7c, 0x1f, 0x46, 0x85, 0x48, 0x3b, 0x4a, 0x23, 0xdf, - 0x58, 0x37, 0xa3, 0x79, 0x45, 0xb7, 0x1b, 0x6e, 0xb4, 0xe4, 0x7b, 0x8f, 0xdc, 0x83, 0xae, 0x82, - 0x49, 0x93, 0xec, 0x2d, 0x90, 0xaf, 0x30, 0x7b, 0xb2, 0xcc, 0x69, 0x4d, 0xa3, 0xa7, 0x7e, 0xf0, - 0xd8, 0xf5, 0x0e, 0xba, 0xb0, 0xbc, 0x62, 0xb2, 0x4c, 0xd2, 0x49, 0xc7, 0x93, 0xaf, 0x60, 0xae, - 0x9a, 0xcf, 0xbc, 0x2b, 0x93, 0xce, 0xdb, 0x4b, 0x15, 0xe6, 0xd1, 0xf5, 0xe6, 0xac, 0x6d, 0xef, - 0xc8, 0xf4, 0x0b, 0x1e, 0xcd, 0x51, 0x1a, 0xfa, 0xeb, 0x7e, 0xd0, 0xe8, 0xce, 0xb1, 0x6c, 0x3a, - 0xf3, 0x26, 0xc8, 0xa4, 0x30, 0xbe, 0x80, 0x0b, 0xd5, 0x5c, 0xd6, 0xdd, 0x58, 0x74, 0xd3, 0x24, - 0x2f, 0xa2, 0x28, 0xce, 0xd8, 0xee, 0x8e, 0x3c, 0xd7, 0x70, 0x4d, 0x63, 0xfb, 0xd0, 0x76, 0x40, - 0x1f, 0xd1, 0x00, 0x5d, 0xc6, 0xbb, 0x39, 0x4b, 0x9b, 0xe8, 0xb2, 0xe7, 0x6b, 0x70, 0xae, 0x9a, - 0x62, 0x95, 0x47, 0xd2, 0xed, 0xf2, 0x68, 0x0a, 0x7b, 0x7a, 0xca, 0x76, 0x75, 0x71, 0x31, 0x1a, - 0xbd, 0x47, 0xa3, 0xdd, 0xb5, 0x2e, 0x52, 0x92, 0x6f, 0x1a, 0x24, 0xe2, 0xde, 0x1d, 0x46, 0x59, - 0xd5, 0x28, 0xd3, 0x18, 0xb9, 0x1f, 0xef, 0xa7, 0xf2, 0x22, 0xa5, 0x6b, 0xb5, 0x79, 0x1c, 0xde, - 0xc2, 0xb5, 0x50, 0xb8, 0x4d, 0x6b, 0x26, 0x48, 0x0e, 0x89, 0x4d, 0x75, 0x9a, 0x07, 0x75, 0x48, - 0x2a, 0xfc, 0xf8, 0xc7, 0xa7, 0x87, 0x80, 0x5d, 0x4e, 0xb9, 0xd3, 0x77, 0x64, 0xc1, 0x4d, 0xa8, - 0xeb, 0x7e, 0xfd, 0xb1, 0x6e, 0x42, 0xd5, 0xf2, 0xeb, 0xcf, 0x99, 0xd9, 0xef, 0xc5, 0x8a, 0x8f, - 0x29, 0xf0, 0x75, 0xaf, 0x31, 0x3d, 0xc3, 0xbe, 0x6e, 0x42, 0x15, 0x70, 0x61, 0x41, 0x7a, 0x4b, - 0xda, 0x16, 0xb1, 0x42, 0x93, 0x73, 0xae, 0x68, 0x94, 0x59, 0x11, 0x89, 0x4c, 0xb3, 0xa2, 0xde, - 0xd0, 0xfc, 0x8b, 0x00, 0x62, 0xd3, 0x56, 0x13, 0x3d, 0xb1, 0x8f, 0x7c, 0x4e, 0x13, 0x3b, 0xe7, - 0xa6, 0x8b, 0xba, 0x3b, 0x7f, 0x4d, 0x09, 0x97, 0x21, 0x43, 0xf0, 0x2a, 0x22, 0x72, 0xba, 0x2c, - 0x16, 0xa5, 0xee, 0xc9, 0x74, 0xbb, 0x40, 0x36, 0xe1, 0xfc, 0x3d, 0x1a, 0x89, 0x35, 0xce, 0xa6, - 0x61, 0x14, 0xb8, 0xf5, 0xa8, 0xe3, 0xad, 0xa2, 0x3c, 0x9b, 0x64, 0xd0, 0xec, 0xbd, 0xcd, 0xf8, - 0x55, 0xb3, 0xf9, 0x75, 0xa4, 0xeb, 0xe0, 0x5f, 0x2b, 0xae, 0x2a, 0xce, 0xd2, 0xc4, 0xfc, 0x29, - 0x3e, 0xc4, 0xdd, 0x77, 0xf2, 0x49, 0x8b, 0x71, 0xf4, 0x15, 0x71, 0xda, 0xba, 0x09, 0x83, 0x9c, - 0x28, 0x77, 0x43, 0x1d, 0xd3, 0x69, 0xc8, 0x1d, 0x18, 0x51, 0xfe, 0x37, 0xc4, 0x28, 0xca, 0x6d, - 0xd7, 0x1d, 0x18, 0xe1, 0x47, 0xab, 0xd3, 0x93, 0x7c, 0x08, 0x23, 0xca, 0x61, 0xe7, 0xcc, 0x3b, - 0xfd, 0x27, 0x30, 0xae, 0xbb, 0xee, 0x9c, 0x5d, 0x90, 0xdf, 0xc7, 0xbb, 0x5f, 0x79, 0xc5, 0x92, - 0x4f, 0x3f, 0x93, 0x08, 0x4a, 0x23, 0x44, 0xca, 0x17, 0x48, 0x09, 0xcc, 0x6d, 0xfe, 0xb9, 0x14, - 0x35, 0xf9, 0x50, 0xbe, 0xa6, 0x52, 0xc4, 0x69, 0xa4, 0x0e, 0x32, 0x9b, 0xe0, 0x62, 0x7e, 0x1e, - 0x62, 0xb5, 0xc0, 0x76, 0x6d, 0xf6, 0x69, 0xee, 0xa8, 0xbb, 0x8b, 0x2e, 0x8f, 0xcb, 0x16, 0x6a, - 0x69, 0xa9, 0x64, 0x78, 0xf9, 0x8c, 0x2e, 0xe7, 0xe7, 0xcf, 0xc3, 0xc1, 0xb8, 0x8f, 0xa7, 0xc0, - 0x54, 0x69, 0x6e, 0xf7, 0x3a, 0xe4, 0xe3, 0x8b, 0x8f, 0xbd, 0x69, 0x76, 0x1d, 0xc8, 0x3a, 0x9d, - 0xa2, 0xc5, 0x1b, 0xd1, 0x97, 0xc2, 0x6e, 0x4d, 0x7a, 0x40, 0x9e, 0xbe, 0xb3, 0xf9, 0x2d, 0xbb, - 0x98, 0x71, 0x2b, 0xde, 0x75, 0x2c, 0xf2, 0xd8, 0xfd, 0x12, 0x6a, 0x87, 0x99, 0x51, 0xc9, 0xf2, - 0x99, 0x5d, 0xd7, 0x1c, 0x2b, 0x32, 0x29, 0xd5, 0xa6, 0xf7, 0x18, 0x9f, 0xa9, 0x65, 0xa7, 0x0b, - 0x7c, 0xad, 0x0b, 0x17, 0x29, 0x89, 0xd7, 0xbb, 0xe2, 0xa9, 0x3b, 0xd6, 0x8b, 0x7c, 0x87, 0xcd, - 0xae, 0xaf, 0x4b, 0xfa, 0xc3, 0x8c, 0x6b, 0x6f, 0xe5, 0x5e, 0x9a, 0xcd, 0xd0, 0x74, 0x2f, 0xed, - 0xd8, 0x87, 0x3c, 0xf1, 0x7f, 0x06, 0xe5, 0xd8, 0x7b, 0xe4, 0x6c, 0x83, 0x90, 0xef, 0xd5, 0x48, - 0x52, 0x92, 0x0a, 0x49, 0xa7, 0x7c, 0x40, 0x73, 0x57, 0xf3, 0x24, 0x1c, 0x6a, 0x6e, 0x49, 0xc2, - 0x2b, 0x2e, 0x91, 0x38, 0x33, 0x2f, 0x05, 0x67, 0x07, 0x3b, 0xac, 0x78, 0xb7, 0xf7, 0x52, 0x18, - 0xa5, 0x47, 0xfb, 0xec, 0x8c, 0x94, 0x73, 0x47, 0x82, 0x91, 0xd5, 0x61, 0x78, 0xbb, 0x5f, 0x3d, - 0x96, 0x72, 0xc6, 0xf5, 0xec, 0x03, 0xea, 0xc4, 0x6f, 0xd5, 0x12, 0x41, 0x0c, 0xf5, 0xf7, 0xc1, - 0xe9, 0xa2, 0xe4, 0x43, 0xab, 0x2c, 0x0c, 0xe5, 0x51, 0x55, 0x92, 0x55, 0x30, 0x38, 0x3b, 0x8a, - 0xf8, 0x81, 0x1b, 0x3d, 0x5b, 0xb2, 0xd7, 0x63, 0xb3, 0x82, 0x5e, 0x20, 0x79, 0x83, 0x2c, 0xb4, - 0xd7, 0xc9, 0x97, 0xb8, 0x94, 0x08, 0xf6, 0x8b, 0xbe, 0x1f, 0x85, 0x51, 0xe0, 0xb4, 0xaa, 0xf5, - 0xc0, 0x6d, 0x45, 0xb9, 0x9d, 0x8e, 0x1d, 0xc0, 0xb3, 0xc8, 0x34, 0x7f, 0x54, 0x11, 0xe4, 0x3e, - 0x2b, 0xfa, 0x8e, 0x7a, 0x93, 0x93, 0x55, 0xd8, 0xe1, 0xe4, 0x52, 0x95, 0x61, 0xed, 0x5f, 0x26, - 0xd3, 0x1a, 0xcc, 0xe6, 0xc4, 0x2c, 0x52, 0xb7, 0xb7, 0x9d, 0x63, 0x1a, 0xcd, 0x75, 0xae, 0x98, - 0x7c, 0x05, 0x33, 0x99, 0x41, 0x8d, 0x94, 0x05, 0xba, 0x53, 0xc8, 0xa3, 0x6e, 0xcc, 0x1f, 0x43, - 0x89, 0xbf, 0x06, 0x41, 0xa7, 0x67, 0x23, 0xbe, 0x4d, 0xfc, 0x46, 0x28, 0x07, 0x21, 0xb9, 0x5e, - 0xe7, 0xe3, 0xa9, 0x07, 0xef, 0xd3, 0x18, 0xd8, 0x24, 0x91, 0x97, 0x5d, 0x7d, 0x78, 0x59, 0x85, - 0x9d, 0x1e, 0x22, 0x6d, 0xc3, 0xcc, 0x1e, 0x0d, 0xdc, 0x47, 0xcf, 0x92, 0x0c, 0xa5, 0x64, 0x32, - 0x4b, 0x3b, 0x71, 0xfc, 0x1c, 0x66, 0x97, 0xfc, 0xa3, 0x96, 0x78, 0xf2, 0x67, 0xf0, 0x54, 0x57, - 0xf1, 0xd9, 0xe5, 0xdd, 0x1d, 0xa1, 0xe6, 0xf2, 0x33, 0xe8, 0x2b, 0xff, 0xb7, 0xae, 0x49, 0xf6, - 0xd5, 0xc3, 0x35, 0x93, 0x7e, 0x07, 0x27, 0x61, 0x56, 0x4a, 0x7d, 0x7d, 0x12, 0x76, 0x48, 0xb9, - 0x9f, 0xf3, 0x80, 0x6c, 0x36, 0x27, 0x8b, 0x7e, 0x07, 0xae, 0xa7, 0x68, 0xed, 0xa6, 0xdc, 0x5b, - 0xcc, 0x7c, 0xe3, 0x09, 0x8f, 0xeb, 0xcc, 0x64, 0xe4, 0x99, 0xed, 0xd4, 0x22, 0x3b, 0x34, 0x9b, - 0x1d, 0x54, 0x2c, 0xa2, 0x87, 0x76, 0x60, 0x98, 0x68, 0xc4, 0x1f, 0xd7, 0x69, 0x3b, 0xad, 0xd6, - 0x29, 0x62, 0x54, 0x6a, 0x3f, 0x80, 0xb1, 0xaa, 0x5e, 0x79, 0x46, 0x25, 0xb9, 0x93, 0x42, 0x3d, - 0x21, 0xea, 0xde, 0xf6, 0x0e, 0x8e, 0xa4, 0x6a, 0xe3, 0x39, 0x55, 0x2f, 0x72, 0x5d, 0x67, 0x8c, - 0xe4, 0x71, 0x6a, 0x17, 0xc8, 0xca, 0xed, 0xa8, 0x5c, 0x67, 0xb2, 0xf3, 0xcd, 0xd5, 0x78, 0xba, - 0x9b, 0x64, 0xea, 0x4e, 0x62, 0x75, 0xcf, 0x91, 0xab, 0x1c, 0xea, 0x3b, 0xe6, 0xfe, 0xe4, 0x7e, - 0x3e, 0x71, 0xba, 0x3c, 0xdd, 0xcf, 0x27, 0x95, 0x84, 0x4f, 0xf7, 0xf3, 0xc9, 0xc8, 0xb0, 0xb7, - 0x82, 0xbc, 0xe2, 0x3c, 0x41, 0x1d, 0x8c, 0x11, 0x8a, 0x4d, 0x46, 0x3a, 0xa2, 0x07, 0x7a, 0x80, - 0x10, 0x9e, 0x5d, 0xa8, 0x83, 0xad, 0x35, 0x19, 0x18, 0x24, 0x91, 0x8e, 0xe8, 0x2e, 0x14, 0x79, - 0xa2, 0x85, 0x38, 0xa6, 0x62, 0xec, 0x37, 0x98, 0xce, 0xff, 0xd0, 0x61, 0x50, 0x8b, 0xc9, 0x68, - 0x74, 0xca, 0x64, 0x96, 0x13, 0xa6, 0xae, 0xc3, 0x54, 0x85, 0x38, 0xe6, 0x9c, 0x32, 0x4c, 0xa5, - 0xc2, 0xd0, 0xcd, 0x5d, 0xc8, 0x28, 0x51, 0x2a, 0xe5, 0x98, 0x1e, 0xa1, 0x4e, 0x75, 0x29, 0x23, - 0x6c, 0xdd, 0xdc, 0xc5, 0xcc, 0x32, 0xc1, 0x28, 0xe2, 0x69, 0xa2, 0xb3, 0x93, 0x5b, 0xc7, 0xaf, - 0xc0, 0x3a, 0xe0, 0xc8, 0x6a, 0x6e, 0x9c, 0x06, 0x55, 0xd4, 0x4a, 0x55, 0x96, 0xa4, 0x8c, 0x8c, - 0xda, 0xaf, 0x67, 0x3c, 0xd4, 0x30, 0x30, 0x62, 0x6f, 0xb0, 0xce, 0xe9, 0xbd, 0xc9, 0x43, 0x99, - 0xb5, 0x26, 0xa7, 0xa6, 0x6e, 0x0c, 0x72, 0x47, 0xf0, 0xa1, 0xcc, 0x53, 0xf3, 0xb2, 0x19, 0xef, - 0xc3, 0x7c, 0xe2, 0xf5, 0x87, 0xc9, 0xf8, 0x46, 0xf6, 0x13, 0x91, 0x4c, 0xf1, 0xe4, 0xeb, 0xec, - 0x57, 0xd2, 0xaf, 0x44, 0x12, 0xe3, 0x7e, 0xd6, 0x35, 0x6f, 0x03, 0x26, 0x70, 0x99, 0x91, 0xb9, - 0xe1, 0xe3, 0xf8, 0x34, 0x26, 0x38, 0x19, 0x28, 0x29, 0x59, 0xaa, 0x5c, 0x66, 0xc7, 0xc4, 0x8b, - 0x62, 0x9e, 0x69, 0x7e, 0xce, 0x7c, 0x66, 0x8c, 0xc0, 0xac, 0x5d, 0x4c, 0x24, 0xb0, 0x27, 0xdf, - 0x87, 0xc9, 0xf8, 0xa1, 0x31, 0x67, 0x91, 0x81, 0xd6, 0xc1, 0x50, 0x36, 0x19, 0xbf, 0x36, 0x3e, - 0x3b, 0xf9, 0xaa, 0xdc, 0x8a, 0x62, 0xf2, 0x4b, 0xa9, 0xb7, 0x32, 0x46, 0x1f, 0x4e, 0xb3, 0x23, - 0x69, 0xb2, 0x3d, 0xeb, 0xe8, 0xd4, 0xf1, 0x73, 0xcb, 0x0e, 0xbd, 0xa8, 0x7f, 0x6e, 0x1d, 0xc3, - 0x43, 0x2a, 0xf5, 0x37, 0x87, 0xcf, 0x06, 0x5c, 0xc3, 0x70, 0x2d, 0xdb, 0x3c, 0x40, 0x5f, 0x36, - 0x56, 0x7e, 0xdb, 0x93, 0x41, 0x5e, 0x9a, 0x70, 0xb5, 0x6b, 0xec, 0x49, 0x72, 0xcb, 0x70, 0x71, - 0xe9, 0x1e, 0xa5, 0xb2, 0xc3, 0xc9, 0x63, 0x3a, 0x2b, 0x84, 0xa3, 0xda, 0x67, 0x3b, 0x44, 0x93, - 0x54, 0xfb, 0x6c, 0xc7, 0x18, 0x90, 0x9f, 0x63, 0x2a, 0x28, 0xb1, 0x47, 0x61, 0x08, 0x26, 0xea, - 0xf1, 0xa0, 0xd4, 0x1d, 0xaf, 0x7d, 0xae, 0x9a, 0x97, 0xa2, 0x29, 0x42, 0x3c, 0xd3, 0x5c, 0x16, - 0x27, 0xb1, 0x3c, 0xe6, 0xdd, 0x99, 0x74, 0x70, 0xad, 0xbe, 0xcc, 0x27, 0xe0, 0x99, 0x5b, 0x9e, - 0x03, 0x5f, 0x5c, 0xfe, 0xe9, 0x7f, 0xbf, 0x5c, 0xf8, 0xe9, 0xcf, 0x2e, 0x17, 0xfe, 0xf3, 0xcf, - 0x2e, 0x17, 0xfe, 0xdb, 0xcf, 0x2e, 0x17, 0xbe, 0x5c, 0x38, 0x5d, 0x68, 0xe4, 0x7a, 0xd3, 0xa5, - 0x5e, 0x74, 0x8b, 0xb3, 0x1b, 0xc4, 0xff, 0xde, 0xfa, 0x7f, 0x01, 0x00, 0x00, 0xff, 0xff, 0x08, - 0x38, 0xb3, 0x1f, 0xc3, 0xe9, 0x00, 0x00, + 0x45, 0xf6, 0xba, 0x6c, 0x36, 0xb8, 0xf4, 0xac, 0xaa, 0xa7, 0x45, 0x66, 0x9b, 0xf2, 0xea, 0xce, + 0x6f, 0x94, 0x12, 0xd1, 0x09, 0x7b, 0x97, 0x27, 0x22, 0x7e, 0xa0, 0xe6, 0xb6, 0xc3, 0x5e, 0x92, + 0x49, 0x3e, 0x76, 0x22, 0x9f, 0xc2, 0x98, 0x24, 0xee, 0x2d, 0x90, 0x24, 0x35, 0x0a, 0x64, 0x19, + 0x26, 0x8d, 0x97, 0x5c, 0xea, 0x74, 0x93, 0xf5, 0xbe, 0xab, 0x60, 0x9c, 0x27, 0x8d, 0x17, 0x5b, + 0x8a, 0x4b, 0xd6, 0x3b, 0xae, 0x5c, 0x2e, 0x3f, 0x84, 0x71, 0x21, 0xd2, 0x42, 0x69, 0xe4, 0x1b, + 0xeb, 0x66, 0x35, 0xaf, 0xe8, 0x6e, 0xcb, 0x8d, 0x96, 0x7c, 0xef, 0xb1, 0xbb, 0xdf, 0x53, 0x30, + 0x69, 0x92, 0xbd, 0x05, 0xf2, 0x15, 0x26, 0x66, 0x96, 0xe9, 0xb2, 0x69, 0xf4, 0xcc, 0x0f, 0x9e, + 0xb8, 0xde, 0x7e, 0x0f, 0x96, 0x57, 0x4c, 0x96, 0x49, 0x3a, 0xe9, 0x78, 0xf2, 0x15, 0xcc, 0xd7, + 0xf3, 0x99, 0xf7, 0x64, 0x52, 0xbc, 0xbd, 0xd4, 0xe1, 0x22, 0xba, 0xde, 0x9c, 0xb6, 0xed, 0x85, + 0x4c, 0xbf, 0xe0, 0xd1, 0x1c, 0xa5, 0xa1, 0xbf, 0xe9, 0x07, 0xad, 0xde, 0x1c, 0xab, 0xa6, 0x33, + 0x6f, 0x82, 0x4c, 0x0a, 0xe3, 0x0b, 0x38, 0x5f, 0xcf, 0x65, 0xdd, 0x8b, 0x45, 0x2f, 0x4d, 0xf2, + 0x02, 0x8a, 0xe2, 0x94, 0xed, 0x2e, 0xe4, 0xb9, 0x86, 0x6b, 0x1a, 0xdb, 0x87, 0xb6, 0x03, 0xfa, + 0x98, 0x06, 0xe8, 0x32, 0xde, 0xcb, 0x59, 0xda, 0x44, 0x97, 0x3d, 0x5f, 0x83, 0xb3, 0xf5, 0x14, + 0xab, 0x3c, 0x92, 0x5e, 0x97, 0x47, 0xd3, 0xd8, 0xd3, 0x13, 0xb6, 0xab, 0x87, 0x8b, 0xd1, 0xf8, + 0x3d, 0x1a, 0xed, 0xae, 0xf5, 0x90, 0x92, 0x7c, 0xd3, 0x20, 0x11, 0xf7, 0xee, 0x30, 0xca, 0xba, + 0x46, 0x99, 0xc6, 0xc8, 0xfd, 0x78, 0x3f, 0x95, 0x17, 0x29, 0x3d, 0xab, 0xcd, 0xe3, 0xf0, 0x16, + 0xae, 0x85, 0xc2, 0x6d, 0x5a, 0x33, 0x41, 0x72, 0x48, 0x6c, 0xaa, 0xd3, 0x3c, 0xa8, 0x43, 0x52, + 0xe3, 0xc7, 0x3f, 0x3e, 0x3d, 0x04, 0xec, 0x72, 0xca, 0x9d, 0xbe, 0x90, 0x05, 0x37, 0xa1, 0xae, + 0xfb, 0xcd, 0x27, 0xba, 0x09, 0x55, 0x4b, 0xdd, 0x3f, 0x6f, 0x26, 0xd6, 0x17, 0x2b, 0x3e, 0x66, + 0xd7, 0xd7, 0xbd, 0xc6, 0xf4, 0xe4, 0xfd, 0xba, 0x09, 0x55, 0xc0, 0x85, 0x05, 0xe9, 0x2d, 0x69, + 0x5b, 0xc4, 0x0a, 0x4d, 0xce, 0xb9, 0xa2, 0x51, 0x66, 0x45, 0x24, 0x32, 0xcd, 0x8a, 0x7a, 0x43, + 0xf3, 0x2f, 0x02, 0x88, 0x4d, 0x3b, 0x6d, 0xf4, 0xc4, 0x3e, 0xf4, 0x39, 0x4d, 0xec, 0x9c, 0x9b, + 0x2e, 0xea, 0xed, 0xfc, 0x35, 0x2d, 0x5c, 0x86, 0x0c, 0xc1, 0xab, 0x88, 0xc8, 0xe9, 0xb2, 0x58, + 0x94, 0xba, 0x27, 0xd3, 0xed, 0x12, 0xd9, 0x84, 0x73, 0xf7, 0x68, 0x24, 0xd6, 0x38, 0x9b, 0x86, + 0x51, 0xe0, 0x36, 0xa3, 0xc2, 0x5b, 0x45, 0x79, 0x36, 0xc9, 0xa0, 0xd9, 0x7b, 0x9b, 0xf1, 0xab, + 0x67, 0xf3, 0x2b, 0xa4, 0x2b, 0xf0, 0xaf, 0x15, 0x57, 0x15, 0xa7, 0x69, 0x62, 0xfe, 0x14, 0x1f, + 0xe1, 0xee, 0x3b, 0xf9, 0xa4, 0xe5, 0x38, 0xfa, 0x8a, 0x38, 0x6d, 0xdd, 0x84, 0x61, 0x4e, 0x94, + 0xbb, 0xa1, 0x4e, 0xe8, 0x34, 0xe4, 0x0e, 0x8c, 0x29, 0xff, 0x1b, 0x62, 0x14, 0xe5, 0xb6, 0xeb, + 0x0e, 0x8c, 0xf1, 0xa3, 0xd5, 0xc9, 0x49, 0x3e, 0x84, 0x31, 0xe5, 0xb0, 0x73, 0xea, 0x9d, 0xfe, + 0x13, 0x98, 0xd4, 0x5d, 0x77, 0x4e, 0x2f, 0xc8, 0x1f, 0xe2, 0xdd, 0xaf, 0xbc, 0x62, 0xc9, 0xa7, + 0x9f, 0x4d, 0x04, 0xa5, 0x11, 0x22, 0xe5, 0x0b, 0xa4, 0x04, 0xe6, 0x36, 0xff, 0x6c, 0x8a, 0x9a, + 0x7c, 0x28, 0x5f, 0x53, 0x29, 0xe2, 0x34, 0x52, 0x81, 0xcc, 0xa6, 0xb8, 0x98, 0x5f, 0x84, 0x58, + 0x2d, 0xb0, 0x3d, 0x9b, 0x7d, 0x92, 0x3b, 0xea, 0xde, 0xa2, 0xcb, 0xe3, 0xb2, 0x85, 0x5a, 0x5a, + 0x2a, 0x19, 0x5e, 0x3e, 0xa3, 0xcb, 0xf9, 0xf9, 0xf3, 0x70, 0x30, 0xee, 0xe3, 0x29, 0x30, 0x55, + 0x9a, 0xdb, 0xbd, 0x82, 0x7c, 0x7c, 0xf1, 0xb1, 0x37, 0xcd, 0xae, 0x80, 0xac, 0xe8, 0x14, 0x2d, + 0xde, 0x88, 0xbe, 0x14, 0x76, 0x6b, 0xd2, 0x03, 0xf2, 0xe4, 0x9d, 0xcd, 0x6f, 0xd9, 0x85, 0x8c, + 0x5b, 0xf1, 0x9e, 0x63, 0x91, 0xc7, 0xee, 0x57, 0x50, 0x3b, 0xcc, 0x8c, 0x4a, 0x96, 0xcf, 0xec, + 0xba, 0xe6, 0x58, 0x91, 0x49, 0xa9, 0x36, 0xbd, 0x27, 0xf8, 0x4c, 0x2d, 0x3b, 0x5d, 0xe0, 0x6b, + 0x3d, 0xb8, 0x48, 0x49, 0xbc, 0xde, 0x13, 0x4f, 0xdd, 0xb1, 0x5e, 0xe0, 0x3b, 0x6c, 0x76, 0x7d, + 0x3d, 0xd2, 0x1f, 0x66, 0x5c, 0x7b, 0x2b, 0xf7, 0xd2, 0x6c, 0x86, 0xa6, 0x7b, 0x69, 0x61, 0x1f, + 0xf2, 0xc4, 0xff, 0x19, 0x54, 0x63, 0xef, 0x91, 0xd3, 0x0d, 0x42, 0xbe, 0x57, 0x23, 0x49, 0x49, + 0x2a, 0x24, 0x45, 0xf9, 0x80, 0xe6, 0xaf, 0xe6, 0x49, 0x38, 0xd4, 0xdc, 0x92, 0x84, 0x57, 0x5c, + 0x22, 0x71, 0x66, 0x5e, 0x0a, 0xce, 0x02, 0x3b, 0xac, 0x78, 0xb7, 0xf7, 0x52, 0x18, 0xa5, 0x47, + 0xfb, 0xf4, 0x8c, 0x94, 0x73, 0x47, 0x82, 0x91, 0x55, 0x30, 0xbc, 0xbd, 0xaf, 0x1e, 0x2b, 0x39, + 0xe3, 0x7a, 0xfa, 0x01, 0x75, 0xe2, 0xb7, 0x6a, 0x89, 0x20, 0x86, 0xfa, 0xfb, 0xe0, 0x74, 0x51, + 0xf2, 0xa1, 0x55, 0x16, 0x86, 0xf2, 0xa8, 0xaa, 0xc8, 0x2a, 0x18, 0x9c, 0x1d, 0x45, 0xfc, 0xc0, + 0x8d, 0x9e, 0x2f, 0xd9, 0xeb, 0xb1, 0x59, 0x41, 0x2f, 0x90, 0xbc, 0x41, 0x16, 0xda, 0xeb, 0xe4, + 0x4b, 0x5c, 0x4a, 0x04, 0xfb, 0x45, 0xdf, 0x8f, 0xc2, 0x28, 0x70, 0x3a, 0xf5, 0x66, 0xe0, 0x76, + 0xa2, 0xdc, 0x4e, 0xc7, 0x0e, 0xe0, 0x59, 0x64, 0x9a, 0x3f, 0xaa, 0x08, 0x72, 0x9f, 0x15, 0x7d, + 0x47, 0xbd, 0xc9, 0xc9, 0x2a, 0x2c, 0x38, 0xb9, 0xd4, 0x65, 0x58, 0xfb, 0x97, 0xc9, 0xb4, 0x01, + 0x73, 0x39, 0x31, 0x8b, 0xd4, 0xed, 0x6d, 0x71, 0x4c, 0xa3, 0xf9, 0xe2, 0x8a, 0xc9, 0x57, 0x30, + 0x9b, 0x19, 0xd4, 0x48, 0x59, 0xa0, 0x8b, 0x42, 0x1e, 0xf5, 0x62, 0xfe, 0x04, 0x2a, 0xfc, 0x35, + 0x08, 0x3a, 0x3d, 0x1b, 0xf1, 0x6d, 0xe2, 0x37, 0x42, 0x39, 0x08, 0xc9, 0xf5, 0x3a, 0x1f, 0x4f, + 0x3d, 0x78, 0x9f, 0xc1, 0xc0, 0x26, 0x89, 0x94, 0xef, 0xea, 0xc3, 0xcb, 0x2a, 0x2c, 0x7a, 0x88, + 0xb4, 0x0d, 0xb3, 0x7b, 0x34, 0x70, 0x1f, 0x3f, 0x4f, 0x32, 0x94, 0x92, 0xc9, 0x2c, 0x2d, 0xe2, + 0xf8, 0x39, 0xcc, 0x2d, 0xf9, 0x87, 0x1d, 0xf1, 0xe4, 0xcf, 0xe0, 0xa9, 0xae, 0xe2, 0xb3, 0xcb, + 0x7b, 0x3b, 0x42, 0xcd, 0xe7, 0x27, 0xe7, 0x57, 0xfe, 0x6f, 0x3d, 0xf3, 0xf7, 0xab, 0x87, 0x6b, + 0x26, 0xfd, 0x0e, 0x4e, 0xc2, 0xac, 0x6c, 0xfd, 0xfa, 0x24, 0x2c, 0xc8, 0xe6, 0x9f, 0xf3, 0x80, + 0x6c, 0x2e, 0x27, 0x41, 0x7f, 0x01, 0xd7, 0x13, 0xb4, 0x76, 0x53, 0xee, 0x2d, 0x66, 0xbe, 0xf1, + 0x84, 0xc7, 0x75, 0x66, 0x32, 0xf2, 0xcc, 0x76, 0x6a, 0x91, 0x1d, 0xda, 0xed, 0x02, 0x15, 0x8b, + 0xe8, 0xa1, 0x1d, 0x18, 0x26, 0x1a, 0xf1, 0x27, 0x75, 0xda, 0xa2, 0xd5, 0x3a, 0x45, 0x8c, 0x4a, + 0xed, 0x07, 0x30, 0x51, 0xd7, 0x2b, 0xcf, 0xa8, 0x24, 0x77, 0x52, 0xa8, 0x27, 0x44, 0xbd, 0xdb, + 0x5e, 0xe0, 0x48, 0xaa, 0x36, 0x9e, 0x13, 0xf5, 0x22, 0xd7, 0x75, 0xc6, 0x48, 0x1e, 0xa7, 0x76, + 0x81, 0xac, 0xdc, 0x8e, 0xca, 0x75, 0x26, 0x3b, 0xdf, 0x5c, 0x83, 0xa7, 0xbb, 0x49, 0xa6, 0xee, + 0x24, 0x56, 0xef, 0x1c, 0xb9, 0xca, 0xa1, 0xbe, 0x30, 0xf7, 0x27, 0xf7, 0xf3, 0x89, 0xd3, 0xe5, + 0xe9, 0x7e, 0x3e, 0xa9, 0x24, 0x7c, 0xba, 0x9f, 0x4f, 0x46, 0x86, 0xbd, 0x15, 0xe4, 0x15, 0xe7, + 0x09, 0x2a, 0x30, 0x46, 0x28, 0x36, 0x19, 0xe9, 0x88, 0x1e, 0xe8, 0x01, 0x42, 0x78, 0x76, 0xa1, + 0x02, 0x5b, 0x6b, 0x32, 0x30, 0x48, 0x22, 0x1d, 0xd1, 0x5d, 0x28, 0xf3, 0x44, 0x0b, 0x71, 0x4c, + 0xc5, 0xd8, 0x6f, 0x30, 0x9d, 0xff, 0xa1, 0x60, 0x50, 0xcb, 0xc9, 0x68, 0x74, 0xca, 0x64, 0x96, + 0x13, 0xa6, 0xae, 0x60, 0xaa, 0x42, 0x1c, 0x73, 0x4e, 0x19, 0xa6, 0x52, 0x61, 0xe8, 0xe6, 0xcf, + 0x67, 0x94, 0x28, 0x95, 0x72, 0x42, 0x8f, 0x50, 0xa7, 0xba, 0x94, 0x11, 0xb6, 0x6e, 0xfe, 0x42, + 0x66, 0x99, 0x60, 0x14, 0xf1, 0x34, 0xd1, 0xd9, 0xc9, 0xad, 0xe3, 0x57, 0x60, 0x05, 0x38, 0xb2, + 0x9a, 0x1b, 0x27, 0x41, 0x15, 0xb5, 0x52, 0x95, 0x25, 0x29, 0x23, 0xa3, 0xf6, 0xeb, 0x19, 0x0f, + 0x35, 0x0c, 0x8c, 0xd8, 0x1b, 0xac, 0x38, 0xbd, 0x37, 0x79, 0x28, 0xb3, 0xd6, 0xe4, 0xd4, 0xd4, + 0x8b, 0x41, 0xee, 0x08, 0x3e, 0x94, 0x79, 0x6a, 0x5e, 0x36, 0xe3, 0x47, 0x70, 0x31, 0xf1, 0xfa, + 0xc3, 0x64, 0x7c, 0x23, 0xfb, 0x89, 0x48, 0xa6, 0x78, 0xf2, 0x75, 0xf6, 0x2b, 0xe9, 0x57, 0x22, + 0x89, 0x71, 0x3f, 0xed, 0x9a, 0xb7, 0x01, 0x53, 0xb8, 0xcc, 0xc8, 0xdc, 0xf0, 0x71, 0x7c, 0x1a, + 0x13, 0x9c, 0x0c, 0x94, 0x94, 0x2c, 0x55, 0x2e, 0xb3, 0x13, 0xe2, 0x45, 0x31, 0xcf, 0x34, 0x3f, + 0x6f, 0x3e, 0x33, 0x46, 0x60, 0xd6, 0x2e, 0x26, 0x12, 0xd8, 0x93, 0x1f, 0xc2, 0x99, 0xf8, 0xa1, + 0x31, 0x67, 0x91, 0x81, 0x56, 0x60, 0x28, 0x3b, 0x13, 0xbf, 0x36, 0x3e, 0x3d, 0xf9, 0xaa, 0xdc, + 0x8a, 0x62, 0xf2, 0x4b, 0xa9, 0xb7, 0x32, 0x46, 0x1f, 0x4e, 0xb2, 0x23, 0x69, 0xb2, 0x3d, 0xed, + 0xe8, 0x34, 0xf1, 0x73, 0xcb, 0x0e, 0xbd, 0xa8, 0x7f, 0x6e, 0x85, 0xe1, 0x21, 0x95, 0xfa, 0x9b, + 0xc3, 0x67, 0x03, 0xae, 0x61, 0xb8, 0x96, 0x6d, 0x1e, 0xa0, 0x2f, 0x1b, 0x2b, 0xbf, 0xed, 0xc9, + 0x20, 0x2f, 0x6d, 0xb8, 0xda, 0x33, 0xf6, 0x24, 0xb9, 0x65, 0xb8, 0xb8, 0xf4, 0x8e, 0x52, 0x59, + 0x70, 0xf2, 0x98, 0xc9, 0x0a, 0xe1, 0xa8, 0xf6, 0xd9, 0x82, 0x68, 0x92, 0x6a, 0x9f, 0x2d, 0x8c, + 0x01, 0xf9, 0x39, 0xa6, 0x82, 0x12, 0x7b, 0x14, 0x86, 0x60, 0xa2, 0x1e, 0x0f, 0x4a, 0x5d, 0x78, + 0xed, 0x73, 0xd5, 0xbc, 0x14, 0x4d, 0x11, 0xe2, 0x99, 0xe6, 0xb2, 0x38, 0x89, 0xe5, 0x31, 0xef, + 0xcd, 0xa4, 0xc0, 0xb5, 0xfa, 0x32, 0x9f, 0x80, 0xa7, 0x6e, 0x79, 0x0e, 0x7c, 0x71, 0xf9, 0x67, + 0xff, 0xe1, 0x72, 0xe9, 0x67, 0x3f, 0xbf, 0x5c, 0xfa, 0xd7, 0x3f, 0xbf, 0x5c, 0xfa, 0xf7, 0x3f, + 0xbf, 0x5c, 0xfa, 0x72, 0xe1, 0x64, 0xa1, 0x91, 0x9b, 0x6d, 0x97, 0x7a, 0xd1, 0x2d, 0xce, 0x6e, + 0x18, 0xff, 0x7b, 0xeb, 0xbf, 0x07, 0x00, 0x00, 0xff, 0xff, 0xdc, 0x66, 0x4b, 0x5c, 0x15, 0xeb, + 0x00, 0x00, } // Reference imports to suppress errors if they are not otherwise used. @@ -31791,6 +31950,18 @@ func (m *MFAAuthenticateChallenge) MarshalToSizedBuffer(dAtA []byte) (int, error i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if m.SSOChallenge != nil { + { + size, err := m.SSOChallenge.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuthservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x2a + } if m.MFARequired != 0 { i = encodeVarintAuthservice(dAtA, i, uint64(m.MFARequired)) i-- @@ -31901,6 +32072,27 @@ func (m *MFAAuthenticateResponse_Webauthn) MarshalToSizedBuffer(dAtA []byte) (in } return len(dAtA) - i, nil } +func (m *MFAAuthenticateResponse_SSO) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *MFAAuthenticateResponse_SSO) MarshalToSizedBuffer(dAtA []byte) (int, error) { + i := len(dAtA) + if m.SSO != nil { + { + size, err := m.SSO.MarshalToSizedBuffer(dAtA[:i]) + if err != nil { + return 0, err + } + i -= size + i = encodeVarintAuthservice(dAtA, i, uint64(size)) + } + i-- + dAtA[i] = 0x22 + } + return len(dAtA) - i, nil +} func (m *TOTPChallenge) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -31962,6 +32154,88 @@ func (m *TOTPResponse) MarshalToSizedBuffer(dAtA []byte) (int, error) { return len(dAtA) - i, nil } +func (m *SSOChallenge) 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 *SSOChallenge) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SSOChallenge) 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 len(m.RedirectUrl) > 0 { + i -= len(m.RedirectUrl) + copy(dAtA[i:], m.RedirectUrl) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.RedirectUrl))) + i-- + dAtA[i] = 0x12 + } + if len(m.RequestId) > 0 { + i -= len(m.RequestId) + copy(dAtA[i:], m.RequestId) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.RequestId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + +func (m *SSOResponse) 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 *SSOResponse) MarshalTo(dAtA []byte) (int, error) { + size := m.Size() + return m.MarshalToSizedBuffer(dAtA[:size]) +} + +func (m *SSOResponse) 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 len(m.Token) > 0 { + i -= len(m.Token) + copy(dAtA[i:], m.Token) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.Token))) + i-- + dAtA[i] = 0x12 + } + if len(m.RequestId) > 0 { + i -= len(m.RequestId) + copy(dAtA[i:], m.RequestId) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.RequestId))) + i-- + dAtA[i] = 0xa + } + return len(dAtA) - i, nil +} + func (m *MFARegisterChallenge) Marshal() (dAtA []byte, err error) { size := m.Size() dAtA = make([]byte, size) @@ -32991,20 +33265,20 @@ func (m *GetEventsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) { dAtA[i] = 0x22 } } - n64, err64 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndDate):]) - if err64 != nil { - return 0, err64 + n66, err66 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndDate):]) + if err66 != nil { + return 0, err66 } - i -= n64 - i = encodeVarintAuthservice(dAtA, i, uint64(n64)) + i -= n66 + i = encodeVarintAuthservice(dAtA, i, uint64(n66)) i-- dAtA[i] = 0x1a - n65, err65 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) - if err65 != nil { - return 0, err65 + n67, err67 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) + if err67 != nil { + return 0, err67 } - i -= n65 - i = encodeVarintAuthservice(dAtA, i, uint64(n65)) + i -= n67 + i = encodeVarintAuthservice(dAtA, i, uint64(n67)) i-- dAtA[i] = 0x12 if len(m.Namespace) > 0 { @@ -33058,20 +33332,20 @@ func (m *GetSessionEventsRequest) MarshalToSizedBuffer(dAtA []byte) (int, error) i-- dAtA[i] = 0x18 } - n66, err66 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndDate):]) - if err66 != nil { - return 0, err66 + n68, err68 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.EndDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.EndDate):]) + if err68 != nil { + return 0, err68 } - i -= n66 - i = encodeVarintAuthservice(dAtA, i, uint64(n66)) + i -= n68 + i = encodeVarintAuthservice(dAtA, i, uint64(n68)) i-- dAtA[i] = 0x12 - n67, err67 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) - if err67 != nil { - return 0, err67 + n69, err69 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.StartDate, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.StartDate):]) + if err69 != nil { + return 0, err69 } - i -= n67 - i = encodeVarintAuthservice(dAtA, i, uint64(n67)) + i -= n69 + i = encodeVarintAuthservice(dAtA, i, uint64(n69)) i-- dAtA[i] = 0xa return len(dAtA) - i, nil @@ -34437,12 +34711,12 @@ func (m *RecoveryCodes) MarshalToSizedBuffer(dAtA []byte) (int, error) { i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } - n74, err74 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) - if err74 != nil { - return 0, err74 + n76, err76 := github_com_gogo_protobuf_types.StdTimeMarshalTo(m.Created, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(m.Created):]) + if err76 != nil { + return 0, err76 } - i -= n74 - i = encodeVarintAuthservice(dAtA, i, uint64(n74)) + i -= n76 + i = encodeVarintAuthservice(dAtA, i, uint64(n76)) i-- dAtA[i] = 0x12 if len(m.Codes) > 0 { @@ -34671,6 +34945,13 @@ func (m *CreateAuthenticateChallengeRequest) MarshalToSizedBuffer(dAtA []byte) ( i -= len(m.XXX_unrecognized) copy(dAtA[i:], m.XXX_unrecognized) } + if len(m.SSOClientRedirectURL) > 0 { + i -= len(m.SSOClientRedirectURL) + copy(dAtA[i:], m.SSOClientRedirectURL) + i = encodeVarintAuthservice(dAtA, i, uint64(len(m.SSOClientRedirectURL))) + i-- + dAtA[i] = 0x3a + } if m.ChallengeExtensions != nil { { size, err := m.ChallengeExtensions.MarshalToSizedBuffer(dAtA[:i]) @@ -35886,12 +36167,12 @@ func (m *SessionTrackerUpdateExpiry) MarshalToSizedBuffer(dAtA []byte) (int, err copy(dAtA[i:], m.XXX_unrecognized) } if m.Expires != nil { - n99, err99 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) - if err99 != nil { - return 0, err99 + n101, err101 := github_com_gogo_protobuf_types.StdTimeMarshalTo(*m.Expires, dAtA[i-github_com_gogo_protobuf_types.SizeOfStdTime(*m.Expires):]) + if err101 != nil { + return 0, err101 } - i -= n99 - i = encodeVarintAuthservice(dAtA, i, uint64(n99)) + i -= n101 + i = encodeVarintAuthservice(dAtA, i, uint64(n101)) i-- dAtA[i] = 0xa } @@ -41006,6 +41287,10 @@ func (m *MFAAuthenticateChallenge) Size() (n int) { if m.MFARequired != 0 { n += 1 + sovAuthservice(uint64(m.MFARequired)) } + if m.SSOChallenge != nil { + l = m.SSOChallenge.Size() + n += 1 + l + sovAuthservice(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -41051,6 +41336,18 @@ func (m *MFAAuthenticateResponse_Webauthn) Size() (n int) { } return n } +func (m *MFAAuthenticateResponse_SSO) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + if m.SSO != nil { + l = m.SSO.Size() + n += 1 + l + sovAuthservice(uint64(l)) + } + return n +} func (m *TOTPChallenge) Size() (n int) { if m == nil { return 0 @@ -41079,6 +41376,46 @@ func (m *TOTPResponse) Size() (n int) { return n } +func (m *SSOChallenge) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.RequestId) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + l = len(m.RedirectUrl) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + +func (m *SSOResponse) Size() (n int) { + if m == nil { + return 0 + } + var l int + _ = l + l = len(m.RequestId) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + l = len(m.Token) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } + if m.XXX_unrecognized != nil { + n += len(m.XXX_unrecognized) + } + return n +} + func (m *MFARegisterChallenge) Size() (n int) { if m == nil { return 0 @@ -42367,6 +42704,10 @@ func (m *CreateAuthenticateChallengeRequest) Size() (n int) { l = m.ChallengeExtensions.Size() n += 1 + l + sovAuthservice(uint64(l)) } + l = len(m.SSOClientRedirectURL) + if l > 0 { + n += 1 + l + sovAuthservice(uint64(l)) + } if m.XXX_unrecognized != nil { n += len(m.XXX_unrecognized) } @@ -56213,6 +56554,42 @@ func (m *MFAAuthenticateChallenge) Unmarshal(dAtA []byte) error { break } } + case 5: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SSOChallenge", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAuthservice + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + if m.SSOChallenge == nil { + m.SSOChallenge = &SSOChallenge{} + } + if err := m.SSOChallenge.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAuthservice(dAtA[iNdEx:]) @@ -56293,15 +56670,50 @@ func (m *MFAAuthenticateResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &TOTPResponse{} + v := &TOTPResponse{} + if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { + return err + } + m.Response = &MFAAuthenticateResponse_TOTP{v} + iNdEx = postIndex + case 3: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Webauthn", wireType) + } + var msglen int + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + if iNdEx >= l { + return io.ErrUnexpectedEOF + } + b := dAtA[iNdEx] + iNdEx++ + msglen |= int(b&0x7F) << shift + if b < 0x80 { + break + } + } + if msglen < 0 { + return ErrInvalidLengthAuthservice + } + postIndex := iNdEx + msglen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + v := &webauthn.CredentialAssertionResponse{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Response = &MFAAuthenticateResponse_TOTP{v} + m.Response = &MFAAuthenticateResponse_Webauthn{v} iNdEx = postIndex - case 3: + case 4: if wireType != 2 { - return fmt.Errorf("proto: wrong wireType = %d for field Webauthn", wireType) + return fmt.Errorf("proto: wrong wireType = %d for field SSO", wireType) } var msglen int for shift := uint(0); ; shift += 7 { @@ -56328,11 +56740,11 @@ func (m *MFAAuthenticateResponse) Unmarshal(dAtA []byte) error { if postIndex > l { return io.ErrUnexpectedEOF } - v := &webauthn.CredentialAssertionResponse{} + v := &SSOResponse{} if err := v.Unmarshal(dAtA[iNdEx:postIndex]); err != nil { return err } - m.Response = &MFAAuthenticateResponse_Webauthn{v} + m.Response = &MFAAuthenticateResponse_SSO{v} iNdEx = postIndex default: iNdEx = preIndex @@ -56490,6 +56902,236 @@ func (m *TOTPResponse) Unmarshal(dAtA []byte) error { } return nil } +func (m *SSOChallenge) 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 ErrIntOverflowAuthservice + } + 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: SSOChallenge: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SSOChallenge: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RequestId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RedirectUrl", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RedirectUrl = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAuthservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAuthservice + } + 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 *SSOResponse) 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 ErrIntOverflowAuthservice + } + 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: SSOResponse: wiretype end group for non-group") + } + if fieldNum <= 0 { + return fmt.Errorf("proto: SSOResponse: illegal tag %d (wire type %d)", fieldNum, wire) + } + switch fieldNum { + case 1: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field RequestId", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.RequestId = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + case 2: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field Token", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.Token = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex + default: + iNdEx = preIndex + skippy, err := skipAuthservice(dAtA[iNdEx:]) + if err != nil { + return err + } + if (skippy < 0) || (iNdEx+skippy) < 0 { + return ErrInvalidLengthAuthservice + } + 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 *MFARegisterChallenge) Unmarshal(dAtA []byte) error { l := len(dAtA) iNdEx := 0 @@ -63162,6 +63804,38 @@ func (m *CreateAuthenticateChallengeRequest) Unmarshal(dAtA []byte) error { return err } iNdEx = postIndex + case 7: + if wireType != 2 { + return fmt.Errorf("proto: wrong wireType = %d for field SSOClientRedirectURL", wireType) + } + var stringLen uint64 + for shift := uint(0); ; shift += 7 { + if shift >= 64 { + return ErrIntOverflowAuthservice + } + 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 ErrInvalidLengthAuthservice + } + postIndex := iNdEx + intStringLen + if postIndex < 0 { + return ErrInvalidLengthAuthservice + } + if postIndex > l { + return io.ErrUnexpectedEOF + } + m.SSOClientRedirectURL = string(dAtA[iNdEx:postIndex]) + iNdEx = postIndex default: iNdEx = preIndex skippy, err := skipAuthservice(dAtA[iNdEx:]) diff --git a/api/proto/teleport/legacy/client/proto/authservice.proto b/api/proto/teleport/legacy/client/proto/authservice.proto index 0afe660915936..4f4a4dff614bf 100644 --- a/api/proto/teleport/legacy/client/proto/authservice.proto +++ b/api/proto/teleport/legacy/client/proto/authservice.proto @@ -1215,6 +1215,10 @@ message MFAAuthenticateChallenge { // communications, in case of streaming RPCs. It may also return empty // challenges for all other fields. MFARequired MFARequired = 4; + // SSO Challenge is an SSO MFA challenge. If set, the client can go to the + // IdP redirect URL to perform an MFA check in the IdP and obtain an MFA token. + // This token paired with the request id can then be used as MFA verification. + SSOChallenge SSOChallenge = 5; } // MFAAuthenticateResponse is a response to MFAAuthenticateChallenge using one @@ -1224,6 +1228,7 @@ message MFAAuthenticateResponse { // Removed: U2FResponse U2F = 1; TOTPResponse TOTP = 2; webauthn.CredentialAssertionResponse Webauthn = 3; + SSOResponse SSO = 4; } } @@ -1240,6 +1245,22 @@ message TOTPResponse { string Code = 1; } +// SSOChallenge contains SSO auth request details to perform an SSO MFA check. +message SSOChallenge { + // RequestId is the ID of an SSO auth request. + string request_id = 1; + // RedirectUrl is an IdP redirect URL to initate the SSO MFA flow. + string redirect_url = 2; +} + +// SSOResponse is a response to SSOChallenge. +message SSOResponse { + // RequestId is the ID of an SSO auth request. + string request_id = 1; + // Token is a secret token used to verify the user's SSO MFA session. + string token = 2; +} + // MFARegisterChallenge is a challenge for registering a new MFA device. message MFARegisterChallenge { // Request depends on the type of the MFA device being registered. @@ -1864,9 +1885,11 @@ message CreateAuthenticateChallengeRequest { // call [AuthService.IsMFARequired] in the leaf instead of setting this field. IsMFARequiredRequest MFARequiredCheck = 5 [(gogoproto.jsontag) = "mfa_required_check,omitempty"]; // ChallengeExtensions are extensions that will be apply to the issued MFA challenge. - // ChallengeExtensions only apply to webauthn challenges currently. Required, except - // for v15 clients and older. + // Required, except for v15 clients and older. teleport.mfa.v1.ChallengeExtensions ChallengeExtensions = 6 [(gogoproto.jsontag) = "challenge_extensions,omitempty"]; + // SSOClientRedirectURL should be supplied If the client supports SSO MFA checks. + // If unset, the server will only return non-SSO challenges. + string SSOClientRedirectURL = 7 [(gogoproto.jsontag) = "sso_client_redirect_url,omitempty"]; } // CreatePrivilegeTokenRequest defines a request to obtain a privilege token. diff --git a/e b/e index b5db15651a8d4..88c5aecb075ba 160000 --- a/e +++ b/e @@ -1 +1 @@ -Subproject commit b5db15651a8d4590601e470d3e86cc3698e011b2 +Subproject commit 88c5aecb075bae5d3c3276fa239de69fa78112f2 diff --git a/lib/auth/auth.go b/lib/auth/auth.go index 85881e3c026d7..372253e950e44 100644 --- a/lib/auth/auth.go +++ b/lib/auth/auth.go @@ -3673,7 +3673,7 @@ func (a *Server) CreateAuthenticateChallenge(ctx context.Context, req *proto.Cre } } - challenges, err := a.mfaAuthChallenge(ctx, username, challengeExtensions) + challenges, err := a.mfaAuthChallenge(ctx, username, req.SSOClientRedirectURL, challengeExtensions) if err != nil { // Do not obfuscate config-related errors. if errors.Is(err, types.ErrPasswordlessRequiresWebauthn) || errors.Is(err, types.ErrPasswordlessDisabledBySettings) { @@ -6754,7 +6754,7 @@ func (a *Server) isMFARequired(ctx context.Context, checker services.AccessCheck // mfaAuthChallenge constructs an MFAAuthenticateChallenge for all MFA devices // registered by the user. -func (a *Server) mfaAuthChallenge(ctx context.Context, user string, challengeExtensions *mfav1.ChallengeExtensions) (*proto.MFAAuthenticateChallenge, error) { +func (a *Server) mfaAuthChallenge(ctx context.Context, user string, ssoClientRedirectURL string, challengeExtensions *mfav1.ChallengeExtensions) (*proto.MFAAuthenticateChallenge, error) { isPasswordless := challengeExtensions.Scope == mfav1.ChallengeScope_CHALLENGE_SCOPE_PASSWORDLESS_LOGIN // Check what kind of MFA is enabled. @@ -6764,6 +6764,7 @@ func (a *Server) mfaAuthChallenge(ctx context.Context, user string, challengeExt } enableTOTP := apref.IsSecondFactorTOTPAllowed() enableWebauthn := apref.IsSecondFactorWebauthnAllowed() + enableSSO := apref.IsSecondFactorSSOAllowed() // Fetch configurations. The IsSecondFactor*Allowed calls above already // include the necessary checks of config empty, disabled, etc. @@ -6834,7 +6835,7 @@ func (a *Server) mfaAuthChallenge(ctx context.Context, user string, challengeExt if err != nil { return nil, trace.Wrap(err) } - groupedDevs := groupByDeviceType(devs, enableWebauthn) + groupedDevs := groupByDeviceType(devs) challenge := &proto.MFAAuthenticateChallenge{} // TOTP challenge. @@ -6843,7 +6844,7 @@ func (a *Server) mfaAuthChallenge(ctx context.Context, user string, challengeExt } // WebAuthn challenge. - if len(groupedDevs.Webauthn) > 0 { + if enableWebauthn && len(groupedDevs.Webauthn) > 0 { webLogin := &wanlib.LoginFlow{ U2F: u2fPref, Webauthn: webConfig, @@ -6856,6 +6857,14 @@ func (a *Server) mfaAuthChallenge(ctx context.Context, user string, challengeExt challenge.WebauthnChallenge = wantypes.CredentialAssertionToProto(assertion) } + // If the user has an SSO device and the client provided a redirect URL to handle + // the MFA SSO flow, create an SSO challenge. + if enableSSO && groupedDevs.SSO != nil && ssoClientRedirectURL != "" { + if challenge.SSOChallenge, err = a.beginSSOMFAChallenge(ctx, user, groupedDevs.SSO.GetSso(), ssoClientRedirectURL, challengeExtensions); err != nil { + return nil, trace.Wrap(err) + } + } + clusterName, err := a.GetClusterName() if err != nil { return nil, trace.Wrap(err) @@ -6883,20 +6892,16 @@ type devicesByType struct { SSO *types.MFADevice } -func groupByDeviceType(devs []*types.MFADevice, groupWebauthn bool) devicesByType { +func groupByDeviceType(devs []*types.MFADevice) devicesByType { res := devicesByType{} for _, dev := range devs { switch dev.Device.(type) { case *types.MFADevice_Totp: res.TOTP = true case *types.MFADevice_U2F: - if groupWebauthn { - res.Webauthn = append(res.Webauthn, dev) - } + res.Webauthn = append(res.Webauthn, dev) case *types.MFADevice_Webauthn: - if groupWebauthn { - res.Webauthn = append(res.Webauthn, dev) - } + res.Webauthn = append(res.Webauthn, dev) case *types.MFADevice_Sso: res.SSO = dev default: @@ -6914,7 +6919,7 @@ func groupByDeviceType(devs []*types.MFADevice, groupWebauthn bool) devicesByTyp // Use only for registration purposes. func (a *Server) validateMFAAuthResponseForRegister(ctx context.Context, resp *proto.MFAAuthenticateResponse, username string, requiredExtensions *mfav1.ChallengeExtensions) (hasDevices bool, err error) { // Let users without a useable device go through registration. - if resp == nil || (resp.GetTOTP() == nil && resp.GetWebauthn() == nil) { + if resp == nil || (resp.GetTOTP() == nil && resp.GetWebauthn() == nil && resp.GetSSO() == nil) { devices, err := a.Services.GetMFADevices(ctx, username, false /* withSecrets */) if err != nil { return false, trace.Wrap(err) @@ -6923,16 +6928,18 @@ func (a *Server) validateMFAAuthResponseForRegister(ctx context.Context, resp *p // Allowed, no devices registered. return false, nil } + devsByType := groupByDeviceType(devices) authPref, err := a.GetAuthPreference(ctx) if err != nil { return false, trace.Wrap(err) } - totpEnabled := authPref.IsSecondFactorTOTPAllowed() - webauthnEnabled := authPref.IsSecondFactorWebauthnAllowed() - devsByType := groupByDeviceType(devices, webauthnEnabled) - if (totpEnabled && devsByType.TOTP) || (webauthnEnabled && len(devsByType.Webauthn) > 0) { + hasTOTP := authPref.IsSecondFactorTOTPAllowed() && devsByType.TOTP + hasWebAuthn := authPref.IsSecondFactorWebauthnAllowed() && len(devsByType.Webauthn) > 0 + hasSSO := authPref.IsSecondFactorSSOAllowed() && devsByType.SSO != nil + + if hasTOTP || hasWebAuthn || hasSSO { return false, trace.BadParameter("second factor authentication required") } @@ -6960,6 +6967,10 @@ func (a *Server) ValidateMFAAuthResponse( user string, requiredExtensions *mfav1.ChallengeExtensions, ) (*authz.MFAAuthData, error) { + if requiredExtensions == nil { + return nil, trace.BadParameter("required challenge extensions parameter required") + } + authData, validateErr := a.validateMFAAuthResponseInternal(ctx, resp, user, requiredExtensions) // validateErr handled after audit. @@ -7094,6 +7105,9 @@ func (a *Server) validateMFAAuthResponseInternal( AllowReuse: mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_NO, }, nil + case *proto.MFAAuthenticateResponse_SSO: + mfaAuthData, err := a.verifySSOMFASession(ctx, user, res.SSO.RequestId, res.SSO.Token, requiredExtensions) + return mfaAuthData, trace.Wrap(err) default: return nil, trace.BadParameter("unknown or missing MFAAuthenticateResponse type %T", resp.Response) } diff --git a/lib/auth/grpcserver.go b/lib/auth/grpcserver.go index e0e39b17de0d1..e94eea9fb04f9 100644 --- a/lib/auth/grpcserver.go +++ b/lib/auth/grpcserver.go @@ -2165,8 +2165,11 @@ func (g *GRPCServer) DeleteRole(ctx context.Context, req *authpb.DeleteRoleReque func doMFAPresenceChallenge(ctx context.Context, actx *grpcContext, stream authpb.AuthService_MaintainSessionPresenceServer, challengeReq *authpb.PresenceMFAChallengeRequest) error { user := actx.User.GetName() + // TODO(Joerger): Extend SSO MFA support for moderated sessions. + var ssoClientRedirectURL string + chalExt := &mfav1pb.ChallengeExtensions{Scope: mfav1pb.ChallengeScope_CHALLENGE_SCOPE_USER_SESSION} - authChallenge, err := actx.authServer.mfaAuthChallenge(ctx, user, chalExt) + authChallenge, err := actx.authServer.mfaAuthChallenge(ctx, user, ssoClientRedirectURL, chalExt) if err != nil { return trace.Wrap(err) } diff --git a/lib/auth/oidc.go b/lib/auth/oidc.go index 3418be1942c69..fd138373f2540 100644 --- a/lib/auth/oidc.go +++ b/lib/auth/oidc.go @@ -33,6 +33,7 @@ import ( type OIDCService interface { CreateOIDCAuthRequest(ctx context.Context, req types.OIDCAuthRequest) (*types.OIDCAuthRequest, error) + CreateOIDCAuthRequestForMFA(ctx context.Context, req types.OIDCAuthRequest) (*types.OIDCAuthRequest, error) ValidateOIDCAuthCallback(ctx context.Context, q url.Values) (*authclient.OIDCAuthResponse, error) } @@ -124,6 +125,8 @@ func (a *Server) DeleteOIDCConnector(ctx context.Context, connectorName string) return nil } +// CreateOIDCAuthRequest delegates the method call to the oidcAuthService if present, +// or returns a NotImplemented error if not present. func (a *Server) CreateOIDCAuthRequest(ctx context.Context, req types.OIDCAuthRequest) (*types.OIDCAuthRequest, error) { if a.oidcAuthService == nil { return nil, errOIDCNotImplemented @@ -133,6 +136,19 @@ func (a *Server) CreateOIDCAuthRequest(ctx context.Context, req types.OIDCAuthRe return rq, trace.Wrap(err) } +// CreateOIDCAuthRequestForMFA delegates the method call to the oidcAuthService if present, +// or returns a NotImplemented error if not present. +func (a *Server) CreateOIDCAuthRequestForMFA(ctx context.Context, req types.OIDCAuthRequest) (*types.OIDCAuthRequest, error) { + if a.oidcAuthService == nil { + return nil, errOIDCNotImplemented + } + + rq, err := a.oidcAuthService.CreateOIDCAuthRequestForMFA(ctx, req) + return rq, trace.Wrap(err) +} + +// ValidateOIDCAuthCallback delegates the method call to the oidcAuthService if present, +// or returns a NotImplemented error if not present. func (a *Server) ValidateOIDCAuthCallback(ctx context.Context, q url.Values) (*authclient.OIDCAuthResponse, error) { if a.oidcAuthService == nil { return nil, errOIDCNotImplemented diff --git a/lib/auth/saml.go b/lib/auth/saml.go index dd5e381ee6730..4c11479967156 100644 --- a/lib/auth/saml.go +++ b/lib/auth/saml.go @@ -44,9 +44,8 @@ var ErrSAMLRequiresEnterprise = &trace.AccessDeniedError{Message: "SAML is only // authentication - the connector CRUD operations and Get methods are // implemented in auth.Server and provide no connector-specific logic. type SAMLService interface { - // CreateSAMLAuthRequest creates SAML AuthnRequest CreateSAMLAuthRequest(ctx context.Context, req types.SAMLAuthRequest) (*types.SAMLAuthRequest, error) - // ValidateSAMLResponse validates SAML auth response + CreateSAMLAuthRequestForMFA(ctx context.Context, req types.SAMLAuthRequest) (*types.SAMLAuthRequest, error) ValidateSAMLResponse(ctx context.Context, samlResponse, connectorID, clientIP string) (*authclient.SAMLAuthResponse, error) } @@ -214,6 +213,17 @@ func (a *Server) CreateSAMLAuthRequest(ctx context.Context, req types.SAMLAuthRe return rq, trace.Wrap(err) } +// CreateSAMLAuthRequestForMFA delegates the method call to the samlAuthService if present, +// or returns a NotImplemented error if not present. +func (a *Server) CreateSAMLAuthRequestForMFA(ctx context.Context, req types.SAMLAuthRequest) (*types.SAMLAuthRequest, error) { + if a.samlAuthService == nil { + return nil, trace.Wrap(ErrSAMLRequiresEnterprise) + } + + rq, err := a.samlAuthService.CreateSAMLAuthRequestForMFA(ctx, req) + return rq, trace.Wrap(err) +} + // ValidateSAMLResponse delegates the method call to the samlAuthService if present, // or returns a NotImplemented error if not present. func (a *Server) ValidateSAMLResponse(ctx context.Context, samlResponse, connectorID, clientIP string) (*authclient.SAMLAuthResponse, error) { diff --git a/lib/auth/sso_mfa.go b/lib/auth/sso_mfa.go index 0e430ce99d739..d53659f9d3ba9 100644 --- a/lib/auth/sso_mfa.go +++ b/lib/auth/sso_mfa.go @@ -18,18 +18,124 @@ package auth import ( "context" + "crypto/subtle" "github.com/gravitational/trace" + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/constants" mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/authz" "github.com/gravitational/teleport/lib/defaults" "github.com/gravitational/teleport/lib/services" "github.com/gravitational/teleport/lib/utils" ) -// UpsertSSOMFASession upserts a new unverified SSO MFA session for the given username, +// beginSSOMFAChallenge creates a new SSO MFA auth request and session data for the given user and sso device. +func (a *Server) beginSSOMFAChallenge(ctx context.Context, user string, sso *types.SSOMFADevice, ssoClientRedirectURL string, ext *mfav1.ChallengeExtensions) (*proto.SSOChallenge, error) { + chal := new(proto.SSOChallenge) + switch sso.ConnectorType { + case constants.SAML: + resp, err := a.CreateSAMLAuthRequestForMFA(ctx, types.SAMLAuthRequest{ + ConnectorID: sso.ConnectorId, + Type: sso.ConnectorType, + ClientRedirectURL: ssoClientRedirectURL, + CheckUser: true, + }) + if err != nil { + return nil, trace.Wrap(err) + } + chal.RequestId = resp.ID + chal.RedirectUrl = resp.RedirectURL + case constants.OIDC: + resp, err := a.CreateOIDCAuthRequestForMFA(ctx, types.OIDCAuthRequest{ + ConnectorID: sso.ConnectorId, + Type: sso.ConnectorType, + ClientRedirectURL: ssoClientRedirectURL, + CheckUser: true, + }) + if err != nil { + return nil, trace.Wrap(err) + } + chal.RequestId = resp.StateToken + chal.RedirectUrl = resp.RedirectURL + default: + return nil, trace.BadParameter("unsupported sso connector type %v", sso.ConnectorType) + } + + if err := a.upsertSSOMFASession(ctx, user, chal.RequestId, sso.ConnectorId, sso.ConnectorType, ext); err != nil { + return nil, trace.Wrap(err) + } + + return chal, nil +} + +// verifySSOMFASession verifies that the given sso mfa token matches an existing MFA session +// for the user and session ID. It also checks the required extensions, and finishes by deleting +// the MFA session if reuse is not allowed. +func (a *Server) verifySSOMFASession(ctx context.Context, username, sessionID, token string, requiredExtensions *mfav1.ChallengeExtensions) (*authz.MFAAuthData, error) { + if requiredExtensions == nil { + return nil, trace.BadParameter("requested challenge extensions must be supplied.") + } + + const notFoundErrMsg = "mfa sso session data not found" + mfaSess, err := a.GetSSOMFASessionData(ctx, sessionID) + if trace.IsNotFound(err) { + return nil, trace.AccessDenied(notFoundErrMsg) + } else if err != nil { + return nil, trace.Wrap(err) + } + + // Verify the user's name and sso device matches. + if mfaSess.Username != username { + return nil, trace.AccessDenied(notFoundErrMsg) + } + + // Check if the MFA session matches the user's SSO MFA settings. + devs, err := a.Services.GetMFADevices(ctx, username, false /* withSecrets */) + if err != nil { + return nil, trace.Wrap(err) + } + + groupedDevs := groupByDeviceType(devs) + if groupedDevs.SSO == nil { + return nil, trace.AccessDenied("invalid sso mfa session data; non-sso user") + } else if groupedDevs.SSO.GetSso().ConnectorId != mfaSess.ConnectorID || groupedDevs.SSO.GetSso().ConnectorType != mfaSess.ConnectorType { + return nil, trace.AccessDenied("invalid sso mfa session data; mismatched sso auth connector") + } + + // Verify the token matches. + if subtle.ConstantTimeCompare([]byte(mfaSess.Token), []byte(token)) == 0 { + return nil, trace.AccessDenied("invalid SSO MFA challenge response") + } + + // Check if the given scope is satisfied by the challenge scope. + if requiredExtensions.Scope != mfaSess.ChallengeExtensions.Scope { + return nil, trace.AccessDenied("required scope %q is not satisfied by the given sso mfa session with scope %q", requiredExtensions.Scope, mfaSess.ChallengeExtensions.Scope) + } + + // If this session is reusable, but this context forbids reusable sessions, return an error. + if requiredExtensions.AllowReuse == mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_NO && mfaSess.ChallengeExtensions.AllowReuse == mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_YES { + return nil, trace.AccessDenied("the given sso mfa session allows reuse, but reuse is not permitted in this context") + } + + if mfaSess.ChallengeExtensions.AllowReuse != mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_YES { + if err := a.DeleteSSOMFASessionData(ctx, sessionID); err != nil { + return nil, trace.Wrap(err) + } + } + + return &authz.MFAAuthData{ + Device: groupedDevs.SSO, + User: username, + AllowReuse: mfaSess.ChallengeExtensions.AllowReuse, + }, nil +} + +// upsertSSOMFASession upserts a new unverified SSO MFA session for the given username, // sessionID, connector details, and challenge extensions. -func (a *Server) UpsertSSOMFASession(ctx context.Context, user string, sessionID string, connectorID string, connectorType string, ext *mfav1.ChallengeExtensions) error { +func (a *Server) upsertSSOMFASession(ctx context.Context, user string, sessionID string, connectorID string, connectorType string, ext *mfav1.ChallengeExtensions) error { err := a.UpsertSSOMFASessionData(ctx, &services.SSOMFASessionData{ Username: user, RequestID: sessionID, diff --git a/lib/auth/sso_mfa_test.go b/lib/auth/sso_mfa_test.go new file mode 100644 index 0000000000000..081ffaa0ef13e --- /dev/null +++ b/lib/auth/sso_mfa_test.go @@ -0,0 +1,752 @@ +/* + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +package auth + +import ( + "context" + "net/url" + "testing" + + "github.com/google/uuid" + "github.com/gravitational/trace" + "github.com/jonboulle/clockwork" + "github.com/stretchr/testify/assert" + "github.com/stretchr/testify/require" + + "github.com/gravitational/teleport/api/client/proto" + "github.com/gravitational/teleport/api/constants" + mfav1 "github.com/gravitational/teleport/api/gen/proto/go/teleport/mfa/v1" + "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/lib/auth/authclient" + "github.com/gravitational/teleport/lib/authz" + "github.com/gravitational/teleport/lib/defaults" + "github.com/gravitational/teleport/lib/services" +) + +func TestSSOMFAChallenge_Creation(t *testing.T) { + t.Parallel() + ctx := context.Background() + + fakeClock := clockwork.NewFakeClock() + testAuthServer, err := NewTestAuthServer(TestAuthServerConfig{ + Dir: t.TempDir(), + Clock: fakeClock, + }) + require.NoError(t, err) + testServer, err := testAuthServer.NewTestTLSServer() + require.NoError(t, err) + + a := testServer.Auth() + a.SetSAMLService(&fakeSSOService{a}) + a.SetOIDCService(&fakeSSOService{a}) + + // Enable SSO MFA support. + authPref, err := types.NewAuthPreference(types.AuthPreferenceSpecV2{ + Type: constants.Local, + SecondFactors: []types.SecondFactorType{ + types.SecondFactorType_SECOND_FACTOR_TYPE_SSO, + }, + AllowLocalAuth: types.NewBoolOption(false), + }) + require.NoError(t, err) + _, err = a.UpsertAuthPreference(ctx, authPref) + require.NoError(t, err) + + // Create a standard user. + standardUser, _, err := CreateUserAndRole(a, "standard", []string{"role"}, nil) + require.NoError(t, err) + + // Create a fake saml user with MFA disabled. + noMFASAMLUser, noMFASAMLRole, err := CreateUserAndRole(a, "saml-user-no-mfa", []string{"role"}, nil) + require.NoError(t, err) + + noMFASAMLConnector, err := types.NewSAMLConnector("saml-no-mfa", types.SAMLConnectorSpecV2{ + AssertionConsumerService: "http://localhost:65535/acs", // not called + Issuer: "test", + SSO: "https://localhost:65535/sso", // not called + AttributesToRoles: []types.AttributeMapping{ + // not used. can be any name, value but role must exist + {Name: "groups", Value: "admin", Roles: []string{noMFASAMLRole.GetName()}}, + }, + }) + require.NoError(t, err) + _, err = a.UpsertSAMLConnector(ctx, noMFASAMLConnector) + require.NoError(t, err) + + noMFASAMLUser.SetCreatedBy(types.CreatedBy{ + Time: a.clock.Now(), + Connector: &types.ConnectorRef{ + ID: noMFASAMLConnector.GetName(), + Type: noMFASAMLConnector.GetKind(), + }, + }) + _, err = a.UpsertUser(ctx, noMFASAMLUser) + require.NoError(t, err) + + // Create a fake saml user with MFA enabled. + samlUser, samlRole, err := CreateUserAndRole(a, "saml-user", []string{"role"}, nil) + require.NoError(t, err) + + samlConnector, err := types.NewSAMLConnector("saml", types.SAMLConnectorSpecV2{ + AssertionConsumerService: "http://localhost:65535/acs", // not called + Issuer: "test", + SSO: "https://localhost:65535/sso", // not called + AttributesToRoles: []types.AttributeMapping{ + // not used. can be any name, value but role must exist + {Name: "groups", Value: "admin", Roles: []string{samlRole.GetName()}}, + }, + MFASettings: &types.SAMLConnectorMFASettings{ + Enabled: true, + Issuer: "test", + Sso: "https://localhost:65535/sso", // not called + }, + }) + require.NoError(t, err) + _, err = a.UpsertSAMLConnector(ctx, samlConnector) + require.NoError(t, err) + + samlUser.SetCreatedBy(types.CreatedBy{ + Time: a.clock.Now(), + Connector: &types.ConnectorRef{ + ID: samlConnector.GetName(), + Type: samlConnector.GetKind(), + }, + }) + _, err = a.UpsertUser(ctx, samlUser) + require.NoError(t, err) + + // Create a fake oidc user with MFA enabled. + oidcUser, oidcRole, err := CreateUserAndRole(a, "oidc-user", []string{"role"}, nil) + require.NoError(t, err) + + oidcConnector, err := types.NewOIDCConnector("oidc", types.OIDCConnectorSpecV3{ + ClientID: "12345", + ClientSecret: "678910", + RedirectURLs: []string{"https://proxy.example.com/v1/webapi/oidc/callback"}, + ClaimsToRoles: []types.ClaimMapping{ + { + Claim: "test", + Value: "test", + Roles: []string{oidcRole.GetName()}, + }, + }, + MFASettings: &types.OIDCConnectorMFASettings{ + Enabled: true, + ClientId: "12345", + ClientSecret: "678910", + }, + }) + require.NoError(t, err) + _, err = a.UpsertOIDCConnector(ctx, oidcConnector) + require.NoError(t, err) + + oidcUser.SetCreatedBy(types.CreatedBy{ + Time: a.clock.Now(), + Connector: &types.ConnectorRef{ + ID: oidcConnector.GetName(), + Type: oidcConnector.GetKind(), + }, + }) + _, err = a.UpsertUser(ctx, oidcUser) + require.NoError(t, err) + + for _, tt := range []struct { + name string + username string + setup func(t *testing.T) + challengeRequest *proto.CreateAuthenticateChallengeRequest + assertChallenge func(t *testing.T, chal *proto.MFAAuthenticateChallenge, err error) + }{ + { + name: "NOK non sso user", + username: standardUser.GetName(), + challengeRequest: &proto.CreateAuthenticateChallengeRequest{ + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, // which scope doesn't matter here. + }, + SSOClientRedirectURL: "/web/home", // value doesn't matter, as long as it isn't empty. + }, + assertChallenge: func(t *testing.T, chal *proto.MFAAuthenticateChallenge, err error) { + require.NoError(t, err) + assert.Nil(t, chal.SSOChallenge) + }, + }, + { + name: "NOK sso mfa not enabled by auth connector", + username: noMFASAMLUser.GetName(), + challengeRequest: &proto.CreateAuthenticateChallengeRequest{ + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, // which scope doesn't matter here. + }, + SSOClientRedirectURL: "/web/home", // value doesn't matter, as long as it isn't empty. + }, + assertChallenge: func(t *testing.T, chal *proto.MFAAuthenticateChallenge, err error) { + require.NoError(t, err) + assert.Nil(t, chal.SSOChallenge) + }, + }, + { + name: "NOK sso mfa not enabled by auth preference", + username: samlUser.GetName(), + challengeRequest: &proto.CreateAuthenticateChallengeRequest{ + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, // which scope doesn't matter here. + }, + SSOClientRedirectURL: "/web/home", // value doesn't matter, as long as it isn't empty. + }, + setup: func(t *testing.T) { + // disable SSO MFA. + authPref.SetSecondFactors() + require.NoError(t, err) + _, err = a.UpsertAuthPreference(ctx, authPref) + require.NoError(t, err) + t.Cleanup(func() { + authPref.SetSecondFactors(types.SecondFactorType_SECOND_FACTOR_TYPE_SSO) + require.NoError(t, err) + _, err = a.UpsertAuthPreference(ctx, authPref) + require.NoError(t, err) + }) + }, + assertChallenge: func(t *testing.T, chal *proto.MFAAuthenticateChallenge, err error) { + require.NoError(t, err) + assert.Nil(t, chal.SSOChallenge) + }, + }, + { + name: "NOK SSOClientRedirectURL not provided", + username: samlUser.GetName(), + challengeRequest: &proto.CreateAuthenticateChallengeRequest{ + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, // which scope doesn't matter here. + }, + SSOClientRedirectURL: "", + }, + assertChallenge: func(t *testing.T, chal *proto.MFAAuthenticateChallenge, err error) { + require.NoError(t, err) + assert.Nil(t, chal.SSOChallenge) + }, + }, + { + name: "OK saml user", + username: samlUser.GetName(), + challengeRequest: &proto.CreateAuthenticateChallengeRequest{ + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, // which scope doesn't matter here. + }, + SSOClientRedirectURL: "/web/home", // value doesn't matter, as long as it isn't empty. + }, + assertChallenge: func(t *testing.T, chal *proto.MFAAuthenticateChallenge, err error) { + require.NoError(t, err) + require.NotNil(t, chal.SSOChallenge, "expected SSO challenge to be returned") + assert.NotEmpty(t, chal.SSOChallenge.RedirectUrl) + assert.NotEmpty(t, chal.SSOChallenge.RequestId) + + // We should find an auth request with the resulting request ID. + req, err := a.GetSAMLAuthRequest(ctx, chal.SSOChallenge.RequestId) + assert.NoError(t, err) + assert.Equal(t, chal.SSOChallenge.RedirectUrl, req.RedirectURL) + assert.Equal(t, chal.SSOChallenge.RequestId, req.ID) + assert.Equal(t, "/web/home", req.ClientRedirectURL) + assert.Equal(t, samlConnector.GetName(), req.ConnectorID) + assert.Equal(t, samlConnector.GetKind(), req.Type) + assert.True(t, req.CheckUser) + + // We should find non validated SSO MFA session data tied to the challenge by auth request ID. + sd, err := a.GetSSOMFASessionData(ctx, chal.SSOChallenge.RequestId) + require.NoError(t, err) + assert.Equal(t, &services.SSOMFASessionData{ + RequestID: chal.SSOChallenge.RequestId, + Username: samlUser.GetName(), + ConnectorID: samlConnector.GetName(), + ConnectorType: samlConnector.GetKind(), + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + }, sd) + }, + }, + { + name: "OK oidc user", + username: oidcUser.GetName(), + challengeRequest: &proto.CreateAuthenticateChallengeRequest{ + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, // which scope doesn't matter here. + }, + SSOClientRedirectURL: "/web/home", // value doesn't matter, as long as it isn't empty. + }, + assertChallenge: func(t *testing.T, chal *proto.MFAAuthenticateChallenge, err error) { + require.NoError(t, err) + require.NotNil(t, chal.SSOChallenge, "expected SSO challenge to be returned") + assert.NotEmpty(t, chal.SSOChallenge.RedirectUrl) + assert.NotEmpty(t, chal.SSOChallenge.RequestId) + + // We should find an auth request with the resulting request ID. + req, err := a.GetOIDCAuthRequest(ctx, chal.SSOChallenge.RequestId) + assert.NoError(t, err) + assert.Equal(t, chal.SSOChallenge.RedirectUrl, req.RedirectURL) + assert.Equal(t, chal.SSOChallenge.RequestId, req.StateToken) + assert.Equal(t, "/web/home", req.ClientRedirectURL) + assert.Equal(t, oidcConnector.GetName(), req.ConnectorID) + assert.Equal(t, oidcConnector.GetKind(), req.Type) + assert.True(t, req.CheckUser) + + // We should find non validated SSO MFA session data tied to the challenge by auth request ID. + sd, err := a.GetSSOMFASessionData(ctx, chal.SSOChallenge.RequestId) + require.NoError(t, err) + assert.Equal(t, &services.SSOMFASessionData{ + RequestID: chal.SSOChallenge.RequestId, + Username: oidcUser.GetName(), + ConnectorID: oidcConnector.GetName(), + ConnectorType: oidcConnector.GetKind(), + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + }, sd) + }, + }, + { + name: "OK allow reuse", + username: samlUser.GetName(), + challengeRequest: &proto.CreateAuthenticateChallengeRequest{ + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, // which scope doesn't matter here. + AllowReuse: mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_YES, + }, + SSOClientRedirectURL: "/web/home", // value doesn't matter, as long as it isn't empty. + }, + assertChallenge: func(t *testing.T, chal *proto.MFAAuthenticateChallenge, err error) { + require.NoError(t, err) + require.NotNil(t, chal.SSOChallenge, "expected SSO challenge to be returned") + + // We should find non validated SSO MFA session data tied to the challenge by auth request ID. + sd, err := a.GetSSOMFASessionData(ctx, chal.SSOChallenge.RequestId) + require.NoError(t, err) + assert.Equal(t, mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_YES, sd.ChallengeExtensions.AllowReuse) + }, + }, + } { + t.Run(tt.name, func(t *testing.T) { + userClient, err := testServer.NewClient(TestUser(tt.username)) + require.NoError(t, err) + + if tt.setup != nil { + tt.setup(t) + } + + chal, err := userClient.CreateAuthenticateChallenge(ctx, tt.challengeRequest) + tt.assertChallenge(t, chal, err) + }) + } +} + +func TestSSOMFAChallenge_Validation(t *testing.T) { + t.Parallel() + ctx := context.Background() + + fakeClock := clockwork.NewFakeClock() + testAuthServer, err := NewTestAuthServer(TestAuthServerConfig{ + Dir: t.TempDir(), + Clock: fakeClock, + }) + require.NoError(t, err) + testServer, err := testAuthServer.NewTestTLSServer() + require.NoError(t, err) + + a := testServer.Auth() + + // Create a standard user. + standardUser, _, err := CreateUserAndRole(a, "standard", []string{"role"}, nil) + require.NoError(t, err) + + // Create a fake saml user with MFA enabled. + samlUser, samlRole, err := CreateUserAndRole(a, "saml-user", []string{"role"}, nil) + require.NoError(t, err) + + samlConnector, err := types.NewSAMLConnector("saml", types.SAMLConnectorSpecV2{ + AssertionConsumerService: "http://localhost:65535/acs", // not called + Issuer: "test", + SSO: "https://localhost:65535/sso", // not called + AttributesToRoles: []types.AttributeMapping{ + // not used. can be any name, value but role must exist + {Name: "groups", Value: "admin", Roles: []string{samlRole.GetName()}}, + }, + MFASettings: &types.SAMLConnectorMFASettings{ + Enabled: true, + Issuer: "test", + Sso: "https://localhost:65535/sso", // not called + }, + }) + require.NoError(t, err) + _, err = a.UpsertSAMLConnector(ctx, samlConnector) + require.NoError(t, err) + + userCreatedAt := a.clock.Now().UTC() + samlUser.SetCreatedBy(types.CreatedBy{ + Time: userCreatedAt, + Connector: &types.ConnectorRef{ + ID: samlConnector.GetName(), + Type: samlConnector.GetKind(), + }, + }) + _, err = a.UpsertUser(ctx, samlUser) + require.NoError(t, err) + + ssoDevice, err := types.NewMFADevice(samlConnector.GetDisplay(), samlConnector.GetName(), userCreatedAt, &types.MFADevice_Sso{ + Sso: &types.SSOMFADevice{ + ConnectorId: samlConnector.GetName(), + ConnectorType: samlConnector.GetKind(), + }, + }) + require.NoError(t, err) + + // Create a fake saml user with MFA disabled. + noMFASAMLUser, noMFASAMLRole, err := CreateUserAndRole(a, "saml-user-no-mfa", []string{"role"}, nil) + require.NoError(t, err) + + noMFASAMLConnector, err := types.NewSAMLConnector("saml-no-mfa", types.SAMLConnectorSpecV2{ + AssertionConsumerService: "http://localhost:65535/acs", // not called + Issuer: "test", + SSO: "https://localhost:65535/sso", // not called + AttributesToRoles: []types.AttributeMapping{ + // not used. can be any name, value but role must exist + {Name: "groups", Value: "admin", Roles: []string{noMFASAMLRole.GetName()}}, + }, + }) + require.NoError(t, err) + _, err = a.UpsertSAMLConnector(ctx, noMFASAMLConnector) + require.NoError(t, err) + + noMFASAMLUser.SetCreatedBy(types.CreatedBy{ + Time: a.clock.Now(), + Connector: &types.ConnectorRef{ + ID: noMFASAMLConnector.GetName(), + Type: noMFASAMLConnector.GetKind(), + }, + }) + _, err = a.UpsertUser(ctx, noMFASAMLUser) + require.NoError(t, err) + + for _, tt := range []struct { + name string + username string + sd *services.SSOMFASessionData + ssoResponse *proto.SSOResponse + requiredExtensions *mfav1.ChallengeExtensions + assertValidation func(t *testing.T, mad *authz.MFAAuthData, err error) + }{ + { + name: "NOK no required extensions data", + username: samlUser.GetName(), + sd: nil, + ssoResponse: nil, + assertValidation: func(t *testing.T, mad *authz.MFAAuthData, err error) { + require.True(t, trace.IsBadParameter(err), "expected bad parameter error but got %v", err) + }, + }, + { + name: "NOK no session data", + username: samlUser.GetName(), + sd: nil, + ssoResponse: &proto.SSOResponse{ + RequestId: "unknown", + Token: "token", + }, + requiredExtensions: &mfav1.ChallengeExtensions{}, + assertValidation: func(t *testing.T, mad *authz.MFAAuthData, err error) { + require.True(t, trace.IsAccessDenied(err), "expected access denied error but got %v", err) + }, + }, + { + name: "NOK mismatch user", + username: samlUser.GetName(), + sd: &services.SSOMFASessionData{ + RequestID: "request1", + Username: "wrong-user", + ConnectorID: samlConnector.GetName(), + ConnectorType: samlConnector.GetKind(), + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + Token: "token", + }, + ssoResponse: &proto.SSOResponse{ + RequestId: "request1", + Token: "token", + }, + requiredExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + assertValidation: func(t *testing.T, mad *authz.MFAAuthData, err error) { + require.True(t, trace.IsAccessDenied(err), "expected access denied error but got %v", err) + }, + }, + { + name: "NOK mismatch token", + username: samlUser.GetName(), + sd: &services.SSOMFASessionData{ + RequestID: "request2", + Username: samlUser.GetName(), + ConnectorID: samlConnector.GetName(), + ConnectorType: samlConnector.GetKind(), + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + Token: "token", + }, + ssoResponse: &proto.SSOResponse{ + RequestId: "request2", + Token: "wrong-token", + }, + requiredExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + assertValidation: func(t *testing.T, mad *authz.MFAAuthData, err error) { + require.True(t, trace.IsAccessDenied(err), "expected access denied error but got %v", err) + }, + }, + { + name: "NOK non validated session data", + username: samlUser.GetName(), + sd: &services.SSOMFASessionData{ + RequestID: "request2", + Username: samlUser.GetName(), + ConnectorID: samlConnector.GetName(), + ConnectorType: samlConnector.GetKind(), + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + }, + ssoResponse: &proto.SSOResponse{ + RequestId: "request2", + Token: "token", + }, + requiredExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + assertValidation: func(t *testing.T, mad *authz.MFAAuthData, err error) { + require.True(t, trace.IsAccessDenied(err), "expected access denied error but got %v", err) + }, + }, + { + name: "NOK mismatch scope", + username: samlUser.GetName(), + sd: &services.SSOMFASessionData{ + RequestID: "request3", + Username: samlUser.GetName(), + ConnectorID: samlConnector.GetName(), + ConnectorType: samlConnector.GetKind(), + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + Token: "token", + }, + ssoResponse: &proto.SSOResponse{ + RequestId: "request3", + Token: "token", + }, + requiredExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_ADMIN_ACTION, + }, + assertValidation: func(t *testing.T, mad *authz.MFAAuthData, err error) { + require.True(t, trace.IsAccessDenied(err), "expected access denied error but got %v", err) + }, + }, + { + name: "NOK reuse not allowed", + username: samlUser.GetName(), + sd: &services.SSOMFASessionData{ + RequestID: "request4", + Username: samlUser.GetName(), + ConnectorID: samlConnector.GetName(), + ConnectorType: samlConnector.GetKind(), + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + AllowReuse: mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_YES, + }, + Token: "token", + }, + ssoResponse: &proto.SSOResponse{ + RequestId: "request4", + Token: "token", + }, + requiredExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + AllowReuse: mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_NO, + }, + assertValidation: func(t *testing.T, mad *authz.MFAAuthData, err error) { + require.True(t, trace.IsAccessDenied(err), "expected access denied error but got %v", err) + }, + }, + { + name: "NOK sso mfa not enabled by auth connector", + username: noMFASAMLUser.GetName(), + sd: &services.SSOMFASessionData{ + RequestID: "request5", + Username: noMFASAMLUser.GetName(), + ConnectorID: noMFASAMLConnector.GetName(), + ConnectorType: noMFASAMLConnector.GetKind(), + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + Token: "token", + }, + ssoResponse: &proto.SSOResponse{ + RequestId: "request5", + Token: "token", + }, + requiredExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + assertValidation: func(t *testing.T, mad *authz.MFAAuthData, err error) { + require.True(t, trace.IsAccessDenied(err), "expected access denied error but got %v", err) + }, + }, + { + name: "NOK non sso user", + username: standardUser.GetName(), + sd: &services.SSOMFASessionData{ + RequestID: "request6", + Username: standardUser.GetName(), + ConnectorID: samlConnector.GetName(), + ConnectorType: samlConnector.GetKind(), + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + Token: "token", + }, + ssoResponse: &proto.SSOResponse{ + RequestId: "request6", + Token: "token", + }, + requiredExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + assertValidation: func(t *testing.T, mad *authz.MFAAuthData, err error) { + require.True(t, trace.IsAccessDenied(err), "expected access denied error but got %v", err) + }, + }, + { + name: "OK sso user", + username: samlUser.GetName(), + sd: &services.SSOMFASessionData{ + RequestID: "request7", + Username: samlUser.GetName(), + ConnectorID: samlConnector.GetName(), + ConnectorType: samlConnector.GetKind(), + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + AllowReuse: mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_NO, + }, + Token: "token", + }, + ssoResponse: &proto.SSOResponse{ + RequestId: "request7", + Token: "token", + }, + requiredExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + }, + assertValidation: func(t *testing.T, mad *authz.MFAAuthData, err error) { + assert.NoError(t, err) + assert.Equal(t, &authz.MFAAuthData{ + User: samlUser.GetName(), + Device: ssoDevice, + AllowReuse: mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_NO, + }, mad) + }, + }, + { + name: "OK sso user allow reuse", + username: samlUser.GetName(), + sd: &services.SSOMFASessionData{ + RequestID: "request8", + Username: samlUser.GetName(), + ConnectorID: samlConnector.GetName(), + ConnectorType: samlConnector.GetKind(), + ChallengeExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + AllowReuse: mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_YES, + }, + Token: "token", + }, + ssoResponse: &proto.SSOResponse{ + RequestId: "request8", + Token: "token", + }, + requiredExtensions: &mfav1.ChallengeExtensions{ + Scope: mfav1.ChallengeScope_CHALLENGE_SCOPE_LOGIN, + AllowReuse: mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_YES, + }, + assertValidation: func(t *testing.T, mad *authz.MFAAuthData, err error) { + assert.NoError(t, err) + assert.Equal(t, &authz.MFAAuthData{ + User: samlUser.GetName(), + Device: ssoDevice, + AllowReuse: mfav1.ChallengeAllowReuse_CHALLENGE_ALLOW_REUSE_YES, + }, mad) + }, + }, + } { + t.Run(tt.name, func(t *testing.T) { + if tt.sd != nil { + err := a.UpsertSSOMFASessionData(ctx, tt.sd) + require.NoError(t, err) + } + + data, err := a.ValidateMFAAuthResponse(ctx, &proto.MFAAuthenticateResponse{ + Response: &proto.MFAAuthenticateResponse_SSO{ + SSO: tt.ssoResponse, + }, + }, tt.username, tt.requiredExtensions) + tt.assertValidation(t, data, err) + }) + } +} + +type fakeSSOService struct { + a *Server +} + +func (s *fakeSSOService) CreateSAMLAuthRequest(ctx context.Context, req types.SAMLAuthRequest) (*types.SAMLAuthRequest, error) { + return nil, nil // unused in these tests. +} + +func (s *fakeSSOService) CreateSAMLAuthRequestForMFA(ctx context.Context, req types.SAMLAuthRequest) (*types.SAMLAuthRequest, error) { + req.ID = uuid.NewString() + req.RedirectURL = uuid.NewString() + return &req, s.a.Services.CreateSAMLAuthRequest(ctx, req, defaults.SAMLAuthRequestTTL) +} + +func (s *fakeSSOService) ValidateSAMLResponse(ctx context.Context, samlResponse, connectorID, clientIP string) (*authclient.SAMLAuthResponse, error) { + return nil, nil // unused in these tests. +} + +func (s *fakeSSOService) CreateOIDCAuthRequest(ctx context.Context, req types.OIDCAuthRequest) (*types.OIDCAuthRequest, error) { + return nil, nil // unused in these tests. +} + +func (s *fakeSSOService) CreateOIDCAuthRequestForMFA(ctx context.Context, req types.OIDCAuthRequest) (*types.OIDCAuthRequest, error) { + req.StateToken = uuid.NewString() + req.RedirectURL = uuid.NewString() + return &req, s.a.Services.CreateOIDCAuthRequest(ctx, req, defaults.OIDCAuthRequestTTL) +} + +func (s *fakeSSOService) ValidateOIDCAuthCallback(ctx context.Context, q url.Values) (*authclient.OIDCAuthResponse, error) { + return nil, nil // unused in these tests. +} From 52e2c86070b1dcdf7fc1e1a6f80120e034647d5c Mon Sep 17 00:00:00 2001 From: Nic Klaassen Date: Thu, 24 Oct 2024 14:13:16 -0700 Subject: [PATCH 61/70] set default algorithm suite when other auth pref fields are set (#47820) --- api/types/authentication.go | 3 + lib/auth/init.go | 45 +++++----- lib/auth/init_test.go | 158 +++++++++++++++++++++--------------- 3 files changed, 123 insertions(+), 83 deletions(-) diff --git a/api/types/authentication.go b/api/types/authentication.go index f423c28968841..d9fb7f924d42c 100644 --- a/api/types/authentication.go +++ b/api/types/authentication.go @@ -621,6 +621,9 @@ type SignatureAlgorithmSuiteParams struct { // brand new cluster or after resetting the auth preference. func (c *AuthPreferenceV2) SetDefaultSignatureAlgorithmSuite(params SignatureAlgorithmSuiteParams) { switch { + case c.Spec.SignatureAlgorithmSuite != SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_UNSPECIFIED && c.Metadata.Labels[OriginLabel] != OriginDefaults: + // If the suite is set and it's not a default value, return. + return case params.FIPS: c.SetSignatureAlgorithmSuite(SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_FIPS_V1) case params.UsingHSMOrKMS || params.Cloud: diff --git a/lib/auth/init.go b/lib/auth/init.go index d7c2309cd2b89..36ca37518e68b 100644 --- a/lib/auth/init.go +++ b/lib/auth/init.go @@ -791,34 +791,41 @@ func initializeAuthPreference(ctx context.Context, asrv *Server, newAuthPref typ return nil } + switch { + case storedAuthPref == nil: + // This is a brand new cluster with no stored auth pref, set a + // default signature algorithm suite. + newAuthPref = newAuthPref.Clone() + newAuthPref.SetDefaultSignatureAlgorithmSuite(types.SignatureAlgorithmSuiteParams{ + FIPS: asrv.fips, + UsingHSMOrKMS: asrv.keyStore.UsingHSMOrKMS(), + Cloud: modules.GetModules().Features().Cloud, + }) + case newAuthPref.Origin() == types.OriginDefaults: + // There is a stored auth preference which we are overwriting with a + // default auth preference. Maintain the stored signature algorithm + // suite to avoid automatically changing it on version upgrades, new + // suites should always be opt-in for existing clusters. + newAuthPref = newAuthPref.Clone() + newAuthPref.SetSignatureAlgorithmSuite(storedAuthPref.GetSignatureAlgorithmSuite()) + case newAuthPref.GetSignatureAlgorithmSuite() == types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_UNSPECIFIED: + // There is a stored auth preference and the new auth preference is + // coming from a config file where the signature_algorithm_suite is + // unset. Maintain the stored signature algorithm suite otherwise we + // would unset the default suite after the first auth restart. + newAuthPref = newAuthPref.Clone() + newAuthPref.SetSignatureAlgorithmSuite(storedAuthPref.GetSignatureAlgorithmSuite()) + } + if storedAuthPref == nil { log.Infof("Creating cluster auth preference: %v.", newAuthPref) - - if newAuthPref.Origin() == types.OriginDefaults { - // Set a default signature algorithm suite for a new cluster. - newAuthPref.SetDefaultSignatureAlgorithmSuite(types.SignatureAlgorithmSuiteParams{ - FIPS: asrv.fips, - UsingHSMOrKMS: asrv.keyStore.UsingHSMOrKMS(), - Cloud: modules.GetModules().Features().Cloud, - }) - } - _, err := asrv.CreateAuthPreference(ctx, newAuthPref) if trace.IsAlreadyExists(err) { continue } - return trace.Wrap(err) } - if newAuthPref.Origin() == types.OriginDefaults { - // Never overwrite a stored signature algorithm suite with a default - // signature algorithm suite. This prevents the suite from being - // "upgraded" by a Teleport version upgrade alone, even if defaults - // are used on both versions. - newAuthPref.SetSignatureAlgorithmSuite(storedAuthPref.GetSignatureAlgorithmSuite()) - } - newAuthPref.SetRevision(storedAuthPref.GetRevision()) _, err = asrv.UpdateAuthPreference(ctx, newAuthPref) if trace.IsCompareFailed(err) { diff --git a/lib/auth/init_test.go b/lib/auth/init_test.go index 0d9724fbecb7a..ad0b04189f3d7 100644 --- a/lib/auth/init_test.go +++ b/lib/auth/init_test.go @@ -173,6 +173,17 @@ func TestBadIdentity(t *testing.T) { func TestSignatureAlgorithmSuite(t *testing.T) { ctx := context.Background() + suiteName := func(suite types.SignatureAlgorithmSuite) string { + suiteName, err := suite.MarshalText() + require.NoError(t, err) + return string(suiteName) + } + + assertSuitesEqual := func(t *testing.T, expected, actual types.SignatureAlgorithmSuite) { + t.Helper() + assert.Equal(t, suiteName(expected), suiteName(actual)) + } + modules.SetTestModules(t, &modules.TestModules{ TestFeatures: modules.Features{ Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ @@ -181,12 +192,16 @@ func TestSignatureAlgorithmSuite(t *testing.T) { }, }) - setupInitConfig := func(t *testing.T, fips, hsm bool) InitConfig { + setupInitConfig := func(t *testing.T, capOrigin string, fips, hsm bool) InitConfig { cfg := setupConfig(t) cfg.FIPS = fips if hsm { cfg.KeyStoreConfig = keystore.HSMTestConfig(t) } + cfg.AuthPreference.SetOrigin(capOrigin) + if capOrigin != types.OriginDefaults { + cfg.AuthPreference.SetSignatureAlgorithmSuite(types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_UNSPECIFIED) + } // Pre-generate all CAs to keep tests fast esp. with SoftHSM. for _, caType := range types.CertAuthTypes { cfg.BootstrapResources = append(cfg.BootstrapResources, suite.NewTestCAWithConfig(suite.TestCAConfig{ @@ -245,73 +260,86 @@ func TestSignatureAlgorithmSuite(t *testing.T) { // suite should never overwrite a persisted signature algorithm suite for an // existing cluster, even if that was also a default. t.Run("init", func(t *testing.T) { - for desc, tc := range testCases { - t.Run(desc, func(t *testing.T) { - if tc.cloud { - modules.SetTestModules(t, &modules.TestModules{ - TestFeatures: modules.Features{ - Cloud: true, - Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ - entitlements.HSM: {Enabled: true}, - }, - }, + for _, origin := range []string{types.OriginDefaults, types.OriginConfigFile} { + t.Run(origin, func(t *testing.T) { + for desc, tc := range testCases { + t.Run(desc, func(t *testing.T) { + if tc.cloud { + modules.SetTestModules(t, &modules.TestModules{ + TestFeatures: modules.Features{ + Cloud: true, + Entitlements: map[entitlements.EntitlementKind]modules.EntitlementInfo{ + entitlements.HSM: {Enabled: true}, + }, + }, + }) + } + + // Assert that a fresh cluster with no signature_algorithm_suite + // configured gets the expected default suite, whether + // or not anything else in the cluster auth preference is set. + cfg := setupInitConfig(t, origin, tc.fips, tc.hsm) + auth1, err := Init(ctx, cfg) + require.NoError(t, err) + t.Cleanup(func() { auth1.Close() }) + authPref, err := auth1.GetAuthPreference(ctx) + require.NoError(t, err) + assert.Equal(t, origin, authPref.GetMetadata().Labels[types.OriginLabel]) + assertSuitesEqual(t, tc.expectDefaultSuite, authPref.GetSignatureAlgorithmSuite()) + + // Start a second auth server with the same backend and + // config, assert that the default suite remains. + auth2, err := Init(ctx, cfg) + require.NoError(t, err) + t.Cleanup(func() { auth2.Close() }) + authPref, err = auth2.GetAuthPreference(ctx) + require.NoError(t, err) + assert.Equal(t, origin, authPref.GetMetadata().Labels[types.OriginLabel]) + assertSuitesEqual(t, tc.expectDefaultSuite, authPref.GetSignatureAlgorithmSuite()) + + // In the stored cluster_auth_preference, reset the + // signature_algorithm_suite to unspecified (still with + // the same origin) to mimic an older cluster with the old + // defaults, in the next step it will be "upgraded". + authPref.SetSignatureAlgorithmSuite(types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_UNSPECIFIED) + _, err = auth2.UpsertAuthPreference(ctx, authPref) + require.NoError(t, err) + authPref, err = auth2.GetAuthPreference(ctx) + require.NoError(t, err) + // Sanity check it persisted. + assert.Equal(t, origin, authPref.GetMetadata().Labels[types.OriginLabel]) + assertSuitesEqual(t, types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_UNSPECIFIED, authPref.GetSignatureAlgorithmSuite()) + + // Start a third brand new auth server sharing the same + // backend and config. The new auth starting up should + // apply the new default auth preference and persist it + // to the backend, but it should not modify the existing + // signature algorithm suite even though it's + // unspecified. This is meant to test that a v16 auth + // server upgraded to v17 will still have an unspecified + // signature algorithm suite and won't get a new one + // until explicitly opting in. + auth3, err := Init(ctx, cfg) + require.NoError(t, err) + t.Cleanup(func() { auth3.Close() }) + authPref, err = auth3.GetAuthPreference(ctx) + require.NoError(t, err) + assert.Equal(t, origin, authPref.GetMetadata().Labels[types.OriginLabel]) + assertSuitesEqual(t, types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_UNSPECIFIED, authPref.GetSignatureAlgorithmSuite()) + + // Assert that the selected algorithm is RSA2048 when the suite is + // unspecified. + alg, err := cryptosuites.AlgorithmForKey(ctx, + cryptosuites.GetCurrentSuiteFromAuthPreference(auth3), + cryptosuites.UserTLS) + require.NoError(t, err) + assert.Equal(t, cryptosuites.RSA2048.String(), alg.String()) }) } - // Assert that a fresh cluster gets expected default suite. - cfg := setupInitConfig(t, tc.fips, tc.hsm) - authServer, err := Init(ctx, cfg) - require.NoError(t, err) - t.Cleanup(func() { authServer.Close() }) - authPref, err := authServer.GetAuthPreference(ctx) - require.NoError(t, err) - assert.Equal(t, types.OriginDefaults, authPref.GetMetadata().Labels[types.OriginLabel]) - assert.Equal(t, tc.expectDefaultSuite, authPref.GetSignatureAlgorithmSuite()) - - // Reset to unspecified suite and persist (still with - // OriginDefaults) to mimic an older cluster with the old defaults - // that later gets upgraded. - authPref.SetSignatureAlgorithmSuite(types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_UNSPECIFIED) - _, err = authServer.UpsertAuthPreference(ctx, authPref) - require.NoError(t, err) - authPref, err = authServer.GetAuthPreference(ctx) - require.NoError(t, err) - // Sanity check it persisted as a default. - assert.Equal(t, types.OriginDefaults, authPref.GetMetadata().Labels[types.OriginLabel]) - assert.Equal(t, types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_UNSPECIFIED, authPref.GetSignatureAlgorithmSuite()) - - // Start a second brand new auth server sharing the same config and - // backend. The new auth starting up would apply the new default - // auth preference and persist it to the backend, but it should not - // modify the existing signature algorithm suite even though it's - // unspecified. This is meant to test that a v16 auth server - // upgraded to v17 will still have an unspecified signature - // algorithm suite and won't get a new one until explicitly opting - // in. - authServer, err = Init(ctx, cfg) - require.NoError(t, err) - t.Cleanup(func() { authServer.Close() }) - authPref, err = authServer.GetAuthPreference(ctx) - require.NoError(t, err) - assert.Equal(t, types.OriginDefaults, authPref.GetMetadata().Labels[types.OriginLabel]) - assert.Equal(t, types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_UNSPECIFIED, authPref.GetSignatureAlgorithmSuite()) - - // Assert that the selected algorithm is RSA2048 when the suite is - // unspecified. - alg, err := cryptosuites.AlgorithmForKey(ctx, - cryptosuites.GetCurrentSuiteFromAuthPreference(authServer), - cryptosuites.UserTLS) - require.NoError(t, err) - require.Equal(t, cryptosuites.RSA2048, alg) }) } }) - suiteName := func(suite types.SignatureAlgorithmSuite) string { - suiteName, err := suite.MarshalText() - require.NoError(t, err) - return string(suiteName) - } - // Test that the auth preference cannot be upserted with a signature // algorithm suite incompatible with the cluster FIPS and HSM settings. t.Run("upsert", func(t *testing.T) { @@ -371,7 +399,7 @@ func TestSignatureAlgorithmSuite(t *testing.T) { authPref, err = clt.GetAuthPreference(ctx) require.NoError(t, err) assert.Equal(t, types.OriginDefaults, authPref.GetMetadata().Labels[types.OriginLabel]) - assert.Equal(t, tc.expectDefaultSuite, authPref.GetSignatureAlgorithmSuite()) + assertSuitesEqual(t, tc.expectDefaultSuite, authPref.GetSignatureAlgorithmSuite()) }) } }) @@ -513,7 +541,8 @@ func TestAuthPreference(t *testing.T) { }, withConfigFile: func(t *testing.T, conf *InitConfig) types.ResourceWithOrigin { fromConfigFile, err := types.NewAuthPreferenceFromConfigFile(types.AuthPreferenceSpecV2{ - Type: constants.OIDC, + Type: constants.OIDC, + SignatureAlgorithmSuite: types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_BALANCED_V1, }) require.NoError(t, err) conf.AuthPreference = fromConfigFile @@ -521,6 +550,7 @@ func TestAuthPreference(t *testing.T) { }, withAnotherConfigFile: func(t *testing.T, conf *InitConfig) types.ResourceWithOrigin { conf.AuthPreference = newWebauthnAuthPreferenceConfigFromFile(t) + conf.AuthPreference.SetSignatureAlgorithmSuite(types.SignatureAlgorithmSuite_SIGNATURE_ALGORITHM_SUITE_HSM_V1) return conf.AuthPreference }, setDynamic: func(t *testing.T, authServer *Server) { From db8cadfc44f5ea4022c4737190c6ac95dc2ac6dd Mon Sep 17 00:00:00 2001 From: Brian Joerger Date: Thu, 24 Oct 2024 14:50:27 -0700 Subject: [PATCH 62/70] Refactor CLI prompt and config logic (#47874) * Refactor CLI prompt and config logic. * Move CLI prompt configuration to CLIPrompt * Factor out dual prompt in CLI prompt logic. * Make cli config a field rather than embedded; Add NewCLIPromptV2. --- api/mfa/prompt.go | 2 +- lib/client/mfa.go | 13 +- lib/client/mfa/cli.go | 230 +++++++++++++++++--------- lib/client/mfa/cli_test.go | 7 +- lib/client/mfa/prompt.go | 7 +- lib/client/mfa_test.go | 13 +- tool/tctl/common/admin_action_test.go | 4 +- tool/tctl/common/tctl.go | 4 +- 8 files changed, 180 insertions(+), 100 deletions(-) diff --git a/api/mfa/prompt.go b/api/mfa/prompt.go index 3d430e20f0ecb..e139ff561fa64 100644 --- a/api/mfa/prompt.go +++ b/api/mfa/prompt.go @@ -40,7 +40,7 @@ func (f PromptFunc) Run(ctx context.Context, chal *proto.MFAAuthenticateChalleng // PromptConstructor is a function that creates a new MFA prompt. type PromptConstructor func(...PromptOpt) Prompt -// PromptConfig contains common mfa prompt config options. +// PromptConfig contains universal mfa prompt config options. type PromptConfig struct { // PromptReason is an optional message to share with the user before an MFA Prompt. // It is intended to provide context about why the user is being prompted where it may diff --git a/lib/client/mfa.go b/lib/client/mfa.go index 7ade0186f6922..90c6f975d3a1c 100644 --- a/lib/client/mfa.go +++ b/lib/client/mfa.go @@ -57,7 +57,14 @@ type WebauthnLoginFunc = libmfa.WebauthnLoginFunc func (tc *TeleportClient) NewMFAPrompt(opts ...mfa.PromptOpt) mfa.Prompt { cfg := tc.newPromptConfig(opts...) - var prompt mfa.Prompt = libmfa.NewCLIPrompt(cfg, tc.Stderr) + var prompt mfa.Prompt = libmfa.NewCLIPromptV2(&libmfa.CLIPromptConfig{ + PromptConfig: *cfg, + Writer: tc.Stderr, + PreferOTP: tc.PreferOTP, + AllowStdinHijack: tc.AllowStdinHijack, + StdinFunc: tc.StdinFunc, + }) + if tc.MFAPromptConstructor != nil { prompt = tc.MFAPromptConstructor(cfg) } @@ -68,10 +75,6 @@ func (tc *TeleportClient) NewMFAPrompt(opts ...mfa.PromptOpt) mfa.Prompt { func (tc *TeleportClient) newPromptConfig(opts ...mfa.PromptOpt) *libmfa.PromptConfig { cfg := libmfa.NewPromptConfig(tc.WebProxyAddr, opts...) cfg.AuthenticatorAttachment = tc.AuthenticatorAttachment - cfg.PreferOTP = tc.PreferOTP - cfg.AllowStdinHijack = tc.AllowStdinHijack - cfg.StdinFunc = tc.StdinFunc - if tc.WebauthnLogin != nil { cfg.WebauthnLoginFunc = tc.WebauthnLogin cfg.WebauthnSupported = true diff --git a/lib/client/mfa/cli.go b/lib/client/mfa/cli.go index 6340080ca2b23..a5e4cc8f26178 100644 --- a/lib/client/mfa/cli.go +++ b/lib/client/mfa/cli.go @@ -22,6 +22,8 @@ import ( "context" "fmt" "io" + "log/slog" + "os" "runtime" "sync" @@ -35,17 +37,53 @@ import ( "github.com/gravitational/teleport/lib/auth/webauthnwin" ) +// CLIPromptConfig contains CLI prompt config options. +type CLIPromptConfig struct { + PromptConfig + // Writer is where the prompt outputs the prompt. Defaults to os.Stderr. + Writer io.Writer + // AllowStdinHijack allows stdin hijack during MFA prompts. + // Stdin hijack provides a better login UX, but it can be difficult to reason + // about and is often a source of bugs. + // Do not set this options unless you deeply understand what you are doing. + // If false then only the strongest auth method is prompted. + AllowStdinHijack bool + // PreferOTP favors OTP challenges, if applicable. + // Takes precedence over AuthenticatorAttachment settings. + PreferOTP bool + // StdinFunc allows tests to override prompt.Stdin(). + // If nil prompt.Stdin() is used. + StdinFunc func() prompt.StdinReader +} + // CLIPrompt is the default CLI mfa prompt implementation. type CLIPrompt struct { - cfg PromptConfig - writer io.Writer + cfg CLIPromptConfig } // NewCLIPrompt returns a new CLI mfa prompt with the config and writer. +// TODO(Joerger): Delete once /e is no longer dependent on it. func NewCLIPrompt(cfg *PromptConfig, writer io.Writer) *CLIPrompt { + // If no config is provided, use defaults (zero value). + if cfg == nil { + cfg = new(PromptConfig) + } + return NewCLIPromptV2(&CLIPromptConfig{ + PromptConfig: *cfg, + Writer: writer, + }) +} + +// NewCLIPromptV2 returns a new CLI mfa prompt with the given config. +// TODO(Joerger): this is V2 because /e depends on a different function +// signature for NewCLIPrompt, so this requires a couple follow up PRs to fix. +func NewCLIPromptV2(cfg *CLIPromptConfig) *CLIPrompt { + // If no config is provided, use defaults (zero value). + if cfg == nil { + cfg = new(CLIPromptConfig) + } return &CLIPrompt{ - cfg: *cfg, - writer: writer, + cfg: *cfg, } } @@ -56,96 +94,75 @@ func (c *CLIPrompt) stdin() prompt.StdinReader { return c.cfg.StdinFunc() } +func (c *CLIPrompt) writer() io.Writer { + if c.cfg.Writer == nil { + return os.Stderr + } + return c.cfg.Writer +} + // Run prompts the user to complete an MFA authentication challenge. func (c *CLIPrompt) Run(ctx context.Context, chal *proto.MFAAuthenticateChallenge) (*proto.MFAAuthenticateResponse, error) { if c.cfg.PromptReason != "" { - fmt.Fprintln(c.writer, c.cfg.PromptReason) + fmt.Fprintln(c.writer(), c.cfg.PromptReason) } - runOpts, err := c.cfg.GetRunOptions(ctx, chal) - if err != nil { - return nil, trace.Wrap(err) - } + promptOTP := chal.TOTP != nil + promptWebauthn := chal.WebauthnChallenge != nil // No prompt to run, no-op. - if !runOpts.PromptTOTP && !runOpts.PromptWebauthn { + if !promptOTP && !promptWebauthn { return &proto.MFAAuthenticateResponse{}, nil } - // Depending on the run opts, we may spawn a TOTP goroutine, webauth goroutine, or both. - spawnGoroutines := func(ctx context.Context, wg *sync.WaitGroup, respC chan<- MFAGoroutineResponse) { - dualPrompt := runOpts.PromptTOTP && runOpts.PromptWebauthn - - // Print the prompt message directly here in case of dualPrompt. - // This avoids problems with a goroutine failing before any message is - // printed. - if dualPrompt { - var message string - if runtime.GOOS == constants.WindowsOS { - message = "Follow the OS dialogs for platform authentication, or enter an OTP code here:" - webauthnwin.SetPromptPlatformMessage("") - } else { - message = fmt.Sprintf("Tap any %ssecurity key or enter a code from a %sOTP device", c.promptDevicePrefix(), c.promptDevicePrefix()) - } - fmt.Fprintln(c.writer, message) + // Check off unsupported methods. + if promptWebauthn && !c.cfg.WebauthnSupported { + promptWebauthn = false + slog.DebugContext(ctx, "hardware device MFA not supported by your platform") + if !promptOTP { + return nil, trace.BadParameter("hardware device MFA not supported by your platform, please register an OTP device") } + } - // Fire TOTP goroutine. - var otpCancelAndWait func() - if runOpts.PromptTOTP { - otpCtx, otpCancel := context.WithCancel(ctx) - otpDone := make(chan struct{}) - otpCancelAndWait = func() { - otpCancel() - <-otpDone - } + // Prefer whatever method is requested by the client. + if c.cfg.PreferOTP && promptOTP { + promptWebauthn = false + } - wg.Add(1) - go func() { - defer func() { - wg.Done() - otpCancel() - close(otpDone) - }() - - quiet := c.cfg.Quiet || dualPrompt - resp, err := c.promptTOTP(otpCtx, quiet) - respC <- MFAGoroutineResponse{Resp: resp, Err: trace.Wrap(err, "TOTP authentication failed")} - }() - } + // Use stronger auth methods if hijack is not allowed. + if !c.cfg.AllowStdinHijack && promptWebauthn { + promptOTP = false + } - // Fire Webauthn goroutine. - if runOpts.PromptWebauthn { - wg.Add(1) - go func() { - defer func() { - wg.Done() - // Important for dual-prompt, harmless otherwise. - webauthnwin.ResetPromptPlatformMessage() - }() - - // Get webauthn prompt and wrap with otp context handler. - prompt := &webauthnPromptWithOTP{ - LoginPrompt: c.getWebauthnPrompt(ctx, dualPrompt), - otpCancelAndWait: otpCancelAndWait, - } - - resp, err := c.promptWebauthn(ctx, chal, prompt) - respC <- MFAGoroutineResponse{Resp: resp, Err: trace.Wrap(err, "Webauthn authentication failed")} - }() - } + // If a specific webauthn attachment was requested, skip OTP. + // Otherwise, allow dual prompt with OTP. + if promptWebauthn && c.cfg.AuthenticatorAttachment != wancli.AttachmentAuto { + promptOTP = false } - return HandleMFAPromptGoroutines(ctx, spawnGoroutines) + switch { + case promptOTP && promptWebauthn: + resp, err := c.promptWebauthnAndOTP(ctx, chal) + return resp, trace.Wrap(err) + case promptWebauthn: + resp, err := c.promptWebauthn(ctx, chal, c.getWebauthnPrompt(ctx)) + return resp, trace.Wrap(err) + case promptOTP: + resp, err := c.promptOTP(ctx, c.cfg.Quiet) + return resp, trace.Wrap(err) + default: + // We shouldn't reach this case as we would have hit the no-op case above. + return nil, trace.BadParameter("no MFA methods to prompt") + } } -func (c *CLIPrompt) promptTOTP(ctx context.Context, quiet bool) (*proto.MFAAuthenticateResponse, error) { +func (c *CLIPrompt) promptOTP(ctx context.Context, quiet bool) (*proto.MFAAuthenticateResponse, error) { var msg string if !quiet { msg = fmt.Sprintf("Enter an OTP code from a %sdevice", c.promptDevicePrefix()) } - otp, err := prompt.Password(ctx, c.writer, c.stdin(), msg) + otp, err := prompt.Password(ctx, c.writer(), c.stdin(), msg) if err != nil { return nil, trace.Wrap(err) } @@ -157,8 +174,8 @@ func (c *CLIPrompt) promptTOTP(ctx context.Context, quiet bool) (*proto.MFAAuthe }, nil } -func (c *CLIPrompt) getWebauthnPrompt(ctx context.Context, dualPrompt bool) wancli.LoginPrompt { - writer := c.writer +func (c *CLIPrompt) getWebauthnPrompt(ctx context.Context) *wancli.DefaultPrompt { + writer := c.writer() if c.cfg.Quiet { writer = io.Discard } @@ -167,13 +184,6 @@ func (c *CLIPrompt) getWebauthnPrompt(ctx context.Context, dualPrompt bool) wanc prompt.StdinFunc = c.cfg.StdinFunc prompt.SecondTouchMessage = fmt.Sprintf("Tap your %ssecurity key to complete login", c.promptDevicePrefix()) prompt.FirstTouchMessage = fmt.Sprintf("Tap any %ssecurity key", c.promptDevicePrefix()) - - // Skip when both OTP and WebAuthn are possible, as the prompt happens - // externally. - if dualPrompt { - prompt.FirstTouchMessage = "" - } - return prompt } @@ -194,6 +204,66 @@ func (c *CLIPrompt) promptDevicePrefix() string { return "" } +func (c *CLIPrompt) promptWebauthnAndOTP(ctx context.Context, chal *proto.MFAAuthenticateChallenge) (*proto.MFAAuthenticateResponse, error) { + spawnGoroutines := func(ctx context.Context, wg *sync.WaitGroup, respC chan<- MFAGoroutineResponse) { + var message string + if runtime.GOOS == constants.WindowsOS { + message = "Follow the OS dialogs for platform authentication, or enter an OTP code here:" + webauthnwin.SetPromptPlatformMessage("") + } else { + message = fmt.Sprintf("Tap any %ssecurity key or enter a code from a %sOTP device", c.promptDevicePrefix(), c.promptDevicePrefix()) + } + fmt.Fprintln(c.writer(), message) + + // Fire OTP goroutine. + var otpCancelAndWait func() + otpCtx, otpCancel := context.WithCancel(ctx) + otpDone := make(chan struct{}) + otpCancelAndWait = func() { + otpCancel() + <-otpDone + } + + wg.Add(1) + go func() { + defer func() { + wg.Done() + otpCancel() + close(otpDone) + }() + + resp, err := c.promptOTP(otpCtx, true /*quiet*/) + respC <- MFAGoroutineResponse{Resp: resp, Err: trace.Wrap(err, "TOTP authentication failed")} + }() + + // Fire Webauthn goroutine. + wg.Add(1) + go func() { + defer func() { + wg.Done() + // Important for dual-prompt. + webauthnwin.ResetPromptPlatformMessage() + }() + + // Skip FirstTouchMessage when both OTP and WebAuthn are possible, + // as the prompt happens externally. + defaultPrompt := c.getWebauthnPrompt(ctx) + defaultPrompt.FirstTouchMessage = "" + + // Wrap the prompt with otp context handler. + prompt := &webauthnPromptWithOTP{ + LoginPrompt: defaultPrompt, + otpCancelAndWait: otpCancelAndWait, + } + + resp, err := c.promptWebauthn(ctx, chal, prompt) + respC <- MFAGoroutineResponse{Resp: resp, Err: trace.Wrap(err, "Webauthn authentication failed")} + }() + } + + return HandleMFAPromptGoroutines(ctx, spawnGoroutines) +} + // webauthnPromptWithOTP implements wancli.LoginPrompt for MFA logins. // In most cases authenticators shouldn't require PINs or additional touches for // MFA, but the implementation exists in case we find some unusual diff --git a/lib/client/mfa/cli_test.go b/lib/client/mfa/cli_test.go index 0f0d6cc8323b2..54e0fcfd92fd9 100644 --- a/lib/client/mfa/cli_test.go +++ b/lib/client/mfa/cli_test.go @@ -239,7 +239,6 @@ Enter your security key PIN: prompt.SetStdin(stdin) cfg := mfa.NewPromptConfig("proxy.example.com") - cfg.AllowStdinHijack = true cfg.WebauthnSupported = true if tc.makeWebauthnLoginFunc != nil { cfg.WebauthnLoginFunc = tc.makeWebauthnLoginFunc(stdin) @@ -261,7 +260,11 @@ Enter your security key PIN: buffer := make([]byte, 0, 100) out := bytes.NewBuffer(buffer) - prompt := mfa.NewCLIPrompt(cfg, out) + prompt := mfa.NewCLIPromptV2(&mfa.CLIPromptConfig{ + PromptConfig: *cfg, + Writer: out, + AllowStdinHijack: true, + }) resp, err := prompt.Run(ctx, tc.challenge) if tc.expectErr != nil { diff --git a/lib/client/mfa/prompt.go b/lib/client/mfa/prompt.go index d642da998bfe0..cfbb6e1c2d1a6 100644 --- a/lib/client/mfa/prompt.go +++ b/lib/client/mfa/prompt.go @@ -29,7 +29,6 @@ import ( "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/mfa" - "github.com/gravitational/teleport/api/utils/prompt" wancli "github.com/gravitational/teleport/lib/auth/webauthncli" wantypes "github.com/gravitational/teleport/lib/auth/webauthntypes" ) @@ -44,7 +43,8 @@ type WebauthnLoginFunc func( opts *wancli.LoginOpts, ) (*proto.MFAAuthenticateResponse, string, error) -// PromptConfig contains common mfa prompt config options. +// PromptConfig contains common mfa prompt config options shared by +// different implementations of [mfa.Prompt]. type PromptConfig struct { mfa.PromptConfig // ProxyAddress is the address of the authenticating proxy. required. @@ -64,9 +64,6 @@ type PromptConfig struct { PreferOTP bool // WebauthnSupported indicates whether Webauthn is supported. WebauthnSupported bool - // StdinFunc allows tests to override prompt.Stdin(). - // If nil prompt.Stdin() is used. - StdinFunc func() prompt.StdinReader } // NewPromptConfig returns a prompt config that will induce default behavior. diff --git a/lib/client/mfa_test.go b/lib/client/mfa_test.go index 00f4d7e75b026..845e9b1f975e5 100644 --- a/lib/client/mfa_test.go +++ b/lib/client/mfa_test.go @@ -21,7 +21,6 @@ package client_test import ( "context" "errors" - "os" "testing" "time" @@ -73,7 +72,7 @@ func TestPromptMFAChallenge_usingNonRegisteredDevice(t *testing.T) { tests := []struct { name string challenge *proto.MFAAuthenticateChallenge - customizePrompt func(p *mfa.PromptConfig) + customizePrompt func(p *mfa.CLIPromptConfig) }{ { name: "webauthn only", @@ -82,7 +81,7 @@ func TestPromptMFAChallenge_usingNonRegisteredDevice(t *testing.T) { { name: "webauthn and OTP", challenge: challengeWebauthnOTP, - customizePrompt: func(p *mfa.PromptConfig) { + customizePrompt: func(p *mfa.CLIPromptConfig) { p.AllowStdinHijack = true // required for OTP+WebAuthn prompt. }, }, @@ -109,11 +108,15 @@ func TestPromptMFAChallenge_usingNonRegisteredDevice(t *testing.T) { return nil, "", wancli.ErrUsingNonRegisteredDevice } + cliConfig := &mfa.CLIPromptConfig{ + PromptConfig: *promptConfig, + } + if test.customizePrompt != nil { - test.customizePrompt(promptConfig) + test.customizePrompt(cliConfig) } - _, err := mfa.NewCLIPrompt(promptConfig, os.Stderr).Run(ctx, test.challenge) + _, err := mfa.NewCLIPromptV2(cliConfig).Run(ctx, test.challenge) if !errors.Is(err, wancli.ErrUsingNonRegisteredDevice) { t.Errorf("PromptMFAChallenge returned err=%q, want %q", err, wancli.ErrUsingNonRegisteredDevice) } diff --git a/tool/tctl/common/admin_action_test.go b/tool/tctl/common/admin_action_test.go index 4fcdd8661d522..dcd3642774b5d 100644 --- a/tool/tctl/common/admin_action_test.go +++ b/tool/tctl/common/admin_action_test.go @@ -1029,7 +1029,9 @@ func newAdminActionTestSuite(t *testing.T) *adminActionTestSuite { promptCfg := libmfa.NewPromptConfig(proxyPublicAddr.String(), opts...) promptCfg.WebauthnLoginFunc = mockWebauthnLogin promptCfg.WebauthnSupported = true - return libmfa.NewCLIPrompt(promptCfg, os.Stderr) + return libmfa.NewCLIPromptV2(&libmfa.CLIPromptConfig{ + PromptConfig: *promptCfg, + }) } // Login as the admin user. diff --git a/tool/tctl/common/tctl.go b/tool/tctl/common/tctl.go index e279645ffa880..48ad1f0b75b6d 100644 --- a/tool/tctl/common/tctl.go +++ b/tool/tctl/common/tctl.go @@ -253,7 +253,9 @@ func TryRun(commands []CLICommand, args []string) error { proxyAddr := resp.ProxyPublicAddr client.SetMFAPromptConstructor(func(opts ...mfa.PromptOpt) mfa.Prompt { promptCfg := libmfa.NewPromptConfig(proxyAddr, opts...) - return libmfa.NewCLIPrompt(promptCfg, os.Stderr) + return libmfa.NewCLIPromptV2(&libmfa.CLIPromptConfig{ + PromptConfig: *promptCfg, + }) }) // execute whatever is selected: From bb5740e30f7b8ed297c722ebd5a620aeaccd98b3 Mon Sep 17 00:00:00 2001 From: Hugo Shaka Date: Thu, 24 Oct 2024 18:36:56 -0400 Subject: [PATCH 63/70] Fix defaults on incomplete AU config or version resources (#47872) * Fix panic on incomplete AU config or version resources * lint * address tiago's feedback --- lib/web/apiserver.go | 18 +++++++++++++-- lib/web/apiserver_ping_test.go | 42 +++++++++++++++++++++++++++------- 2 files changed, 50 insertions(+), 10 deletions(-) diff --git a/lib/web/apiserver.go b/lib/web/apiserver.go index 8e1e4ba43f691..faaffa2ff3e1e 100644 --- a/lib/web/apiserver.go +++ b/lib/web/apiserver.go @@ -59,6 +59,7 @@ import ( "google.golang.org/protobuf/types/known/timestamppb" "github.com/gravitational/teleport" + "github.com/gravitational/teleport/api" apiclient "github.com/gravitational/teleport/api/client" "github.com/gravitational/teleport/api/client/proto" "github.com/gravitational/teleport/api/client/webclient" @@ -69,6 +70,7 @@ import ( "github.com/gravitational/teleport/api/mfa" apitracing "github.com/gravitational/teleport/api/observability/tracing" "github.com/gravitational/teleport/api/types" + "github.com/gravitational/teleport/api/types/autoupdate" apievents "github.com/gravitational/teleport/api/types/events" "github.com/gravitational/teleport/api/types/installers" "github.com/gravitational/teleport/api/utils/keys" @@ -1544,7 +1546,14 @@ func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Para // TODO(vapopov) DELETE IN v18.0.0 check of IsNotImplemented, must be backported to all latest supported versions. if err != nil && !trace.IsNotFound(err) && !trace.IsNotImplemented(err) { h.logger.ErrorContext(r.Context(), "failed to receive AutoUpdateConfig", "error", err) - } else if err == nil { + } + // If we can't get the AU config or tools AU are not configured, we default to "disabled". + // This ensures we fail open and don't accidentally update agents if something is going wrong. + // If we want to enable AUs by default, it would be better to create a default "autoupdate_config" resource + // than changing this logic. + if autoUpdateConfig.GetSpec().GetTools() == nil { + response.AutoUpdate.ToolsMode = autoupdate.ToolsUpdateModeDisabled + } else { response.AutoUpdate.ToolsMode = autoUpdateConfig.GetSpec().GetTools().GetMode() } @@ -1552,7 +1561,12 @@ func (h *Handler) find(w http.ResponseWriter, r *http.Request, p httprouter.Para // TODO(vapopov) DELETE IN v18.0.0 check of IsNotImplemented, must be backported to all latest supported versions. if err != nil && !trace.IsNotFound(err) && !trace.IsNotImplemented(err) { h.logger.ErrorContext(r.Context(), "failed to receive AutoUpdateVersion", "error", err) - } else if err == nil { + } + // If we can't get the AU version or tools AU version is not specified, we default to the current proxy version. + // This ensures we always advertise a version compatible with the cluster. + if autoUpdateVersion.GetSpec().GetTools() == nil { + response.AutoUpdate.ToolsVersion = api.Version + } else { response.AutoUpdate.ToolsVersion = autoUpdateVersion.GetSpec().GetTools().GetTargetVersion() } diff --git a/lib/web/apiserver_ping_test.go b/lib/web/apiserver_ping_test.go index 6e51b57305595..903a204fe2228 100644 --- a/lib/web/apiserver_ping_test.go +++ b/lib/web/apiserver_ping_test.go @@ -30,6 +30,7 @@ import ( "github.com/stretchr/testify/assert" "github.com/stretchr/testify/require" + "github.com/gravitational/teleport/api" "github.com/gravitational/teleport/api/client/webclient" "github.com/gravitational/teleport/api/constants" autoupdatev1pb "github.com/gravitational/teleport/api/gen/proto/go/teleport/autoupdate/v1" @@ -302,8 +303,11 @@ func TestPing_autoUpdateResources(t *testing.T) { expected webclient.AutoUpdateSettings }{ { - name: "resources not defined", - expected: webclient.AutoUpdateSettings{}, + name: "resources not defined", + expected: webclient.AutoUpdateSettings{ + ToolsVersion: api.Version, + ToolsMode: autoupdate.ToolsUpdateModeDisabled, + }, }, { name: "enable auto update", @@ -312,8 +316,21 @@ func TestPing_autoUpdateResources(t *testing.T) { Mode: autoupdate.ToolsUpdateModeEnabled, }, }, - expected: webclient.AutoUpdateSettings{ToolsMode: "enabled"}, - cleanup: true, + expected: webclient.AutoUpdateSettings{ + ToolsMode: autoupdate.ToolsUpdateModeEnabled, + ToolsVersion: api.Version, + }, + cleanup: true, + }, + { + name: "no autoupdate tool config nor version", + config: &autoupdatev1pb.AutoUpdateConfigSpec{}, + version: &autoupdatev1pb.AutoUpdateVersionSpec{}, + expected: webclient.AutoUpdateSettings{ + ToolsVersion: api.Version, + ToolsMode: autoupdate.ToolsUpdateModeDisabled, + }, + cleanup: true, }, { name: "set auto update version", @@ -322,8 +339,11 @@ func TestPing_autoUpdateResources(t *testing.T) { TargetVersion: "1.2.3", }, }, - expected: webclient.AutoUpdateSettings{ToolsVersion: "1.2.3"}, - cleanup: true, + expected: webclient.AutoUpdateSettings{ + ToolsVersion: "1.2.3", + ToolsMode: autoupdate.ToolsUpdateModeDisabled, + }, + cleanup: true, }, { name: "enable auto update and set version", @@ -337,7 +357,10 @@ func TestPing_autoUpdateResources(t *testing.T) { TargetVersion: "1.2.3", }, }, - expected: webclient.AutoUpdateSettings{ToolsMode: "enabled", ToolsVersion: "1.2.3"}, + expected: webclient.AutoUpdateSettings{ + ToolsMode: autoupdate.ToolsUpdateModeEnabled, + ToolsVersion: "1.2.3", + }, }, { name: "modify auto update config and version", @@ -351,7 +374,10 @@ func TestPing_autoUpdateResources(t *testing.T) { TargetVersion: "3.2.1", }, }, - expected: webclient.AutoUpdateSettings{ToolsMode: "disabled", ToolsVersion: "3.2.1"}, + expected: webclient.AutoUpdateSettings{ + ToolsMode: autoupdate.ToolsUpdateModeDisabled, + ToolsVersion: "3.2.1", + }, }, } for _, tc := range tests { From 21fb7100eec9be84e1bbd741598e3af7b74d7aa6 Mon Sep 17 00:00:00 2001 From: Tim Buckley Date: Thu, 24 Oct 2024 17:00:50 -0600 Subject: [PATCH 64/70] Fix linter errors introduced by #47841 (#47913) This fixes a few non-Linux lints introduced in #47841, where staticcheck complains about noop implementations for non-Linux OSes. It also removes an outdated TODO comment. --- lib/tbot/config/destination_directory.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/tbot/config/destination_directory.go b/lib/tbot/config/destination_directory.go index cf303a1b71a08..85c8e1733b9d8 100644 --- a/lib/tbot/config/destination_directory.go +++ b/lib/tbot/config/destination_directory.go @@ -360,6 +360,8 @@ func (dd *DestinationDirectory) Verify(keys []string) error { // verifyAndCorrectACL performs validation and attempts correction on new-style // ACLs when configured. +// +//nolint:staticcheck // staticcheck doesn't like nop implementations in fs_other.go func (dd *DestinationDirectory) verifyAndCorrectACL(ctx context.Context, subpath string) error { p := filepath.Join(dd.Path, subpath) @@ -380,8 +382,6 @@ func (dd *DestinationDirectory) verifyAndCorrectACL(ctx context.Context, subpath // as hard failures. if len(issues) > 0 { if err := botfs.ConfigureACL(p, dd.Readers); err != nil { - // TODO: should this always be a hard fail? Would we want to just - // warn on `acls: try`? return trace.Wrap(err, "unable to fix misconfigured ACL at path %s with issues %v", p, issues) } From 41ea7a529f153e05443881b3da5d654a311c5f47 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Cie=C5=9Blak?= Date: Fri, 25 Oct 2024 08:59:58 +0200 Subject: [PATCH 65/70] Clean up login modal in Connect after changes to MFA prompts (#47883) * Extract ClusterLogin reason prop stories to separate story * Convert LinearProgress to named export * Add absolute and hidden props to LinearProgress * Don't show tap prompt within ClusterLogin after creds submission * Rename webauthn stuff to passwordless * Simplify useAsync call for initAttempt --- .../ClusterLogin/ClusterLogin.story.tsx | 121 +++---------- .../ClusterLogin/ClusterLogin.tsx | 4 +- .../ClusterLogin/ClusterLoginReason.story.tsx | 171 ++++++++++++++++++ .../FormLogin/FormLocal/FormLocal.tsx | 3 + .../ClusterLogin/FormLogin/FormLogin.tsx | 15 +- .../PromptPasswordless.tsx} | 16 +- .../hardware.svg | 0 .../index.ts | 2 +- .../PromptSsoStatus/PromptSsoStatus.tsx | 2 +- .../ClusterLogin/useClusterLogin.ts | 42 +++-- .../HeadlessPrompt/HeadlessPrompt.tsx | 4 +- .../ModalsHost/modals/HardwareKeys/Touch.tsx | 4 +- .../modals/ReAuthenticate/ReAuthenticate.tsx | 4 +- .../src/ui/Search/pickers/ResultList.tsx | 2 +- web/packages/teleterm/src/ui/Tabs/TabItem.tsx | 2 +- .../LinearProgress/LinearProgress.tsx | 42 +++-- .../src/ui/components/LinearProgress/index.ts | 3 +- .../src/ui/services/clusters/types.ts | 27 +-- 18 files changed, 283 insertions(+), 181 deletions(-) create mode 100644 web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLoginReason.story.tsx rename web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/{PromptWebauthn/PromptWebauthn.tsx => PromptPasswordless/PromptPasswordless.tsx} (95%) rename web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/{PromptWebauthn => PromptPasswordless}/hardware.svg (100%) rename web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/{PromptWebauthn => PromptPasswordless}/index.ts (92%) diff --git a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.story.tsx b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.story.tsx index f7c2e53087b12..191ed831ab224 100644 --- a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.story.tsx +++ b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.story.tsx @@ -16,17 +16,16 @@ * along with this program. If not, see . */ -import React, { PropsWithChildren } from 'react'; +import { FC, PropsWithChildren } from 'react'; import { Box } from 'design'; -import { Attempt, makeErrorAttempt } from 'shared/hooks/useAsync'; +import { + Attempt, + makeErrorAttempt, + makeProcessingAttempt, +} from 'shared/hooks/useAsync'; import * as types from 'teleterm/ui/services/clusters/types'; -import { - appUri, - makeDatabaseGateway, - makeKubeGateway, -} from 'teleterm/services/tshd/testHelpers'; import { ClusterLoginPresentation, @@ -67,44 +66,11 @@ function makeProps(): ClusterLoginPresentationProps { onLoginWithPasswordless: () => Promise.resolve<[void, Error]>([null, null]), onLoginWithSso: () => null, clearLoginAttempt: () => null, - webauthnLogin: null, + passwordlessLoginState: null, reason: undefined, }; } -export const Err = () => { - const props = makeProps(); - props.initAttempt = makeErrorAttempt(new Error('some error message')); - - return ( - - - - ); -}; - -export const Processing = () => { - const props = makeProps(); - props.initAttempt.status = 'processing'; - - return ( - - - - ); -}; - -export const LocalDisabled = () => { - const props = makeProps(); - props.initAttempt.data.localAuthEnabled = false; - - return ( - - - - ); -}; - export const LocalOnly = () => { const props = makeProps(); props.initAttempt.data.allowPasswordless = false; @@ -116,14 +82,9 @@ export const LocalOnly = () => { ); }; -export const LocalOnlyWithReasonGatewayCertExpiredWithDbGateway = () => { +export const InitErr = () => { const props = makeProps(); - props.initAttempt.data.allowPasswordless = false; - props.reason = { - kind: 'reason.gateway-cert-expired', - targetUri: dbGateway.targetUri, - gateway: dbGateway, - }; + props.initAttempt = makeErrorAttempt(new Error('some error message')); return ( @@ -132,14 +93,9 @@ export const LocalOnlyWithReasonGatewayCertExpiredWithDbGateway = () => { ); }; -export const LocalOnlyWithReasonGatewayCertExpiredWithKubeGateway = () => { +export const InitProcessing = () => { const props = makeProps(); - props.initAttempt.data.allowPasswordless = false; - props.reason = { - kind: 'reason.gateway-cert-expired', - targetUri: kubeGateway.targetUri, - gateway: kubeGateway, - }; + props.initAttempt.status = 'processing'; return ( @@ -148,14 +104,9 @@ export const LocalOnlyWithReasonGatewayCertExpiredWithKubeGateway = () => { ); }; -export const LocalOnlyWithReasonGatewayCertExpiredWithoutGateway = () => { +export const LocalDisabled = () => { const props = makeProps(); - props.initAttempt.data.allowPasswordless = false; - props.reason = { - kind: 'reason.gateway-cert-expired', - targetUri: dbGateway.targetUri, - gateway: undefined, - }; + props.initAttempt.data.localAuthEnabled = false; return ( @@ -164,14 +115,14 @@ export const LocalOnlyWithReasonGatewayCertExpiredWithoutGateway = () => { ); }; -export const LocalOnlyWithReasonVnetCertExpired = () => { +// The password field is empty in this story as there's no way to change the value of a controlled +// input without touching the internals of React. +// https://stackoverflow.com/questions/23892547/what-is-the-best-way-to-trigger-change-or-input-event-in-react-js +export const LocalProcessing = () => { const props = makeProps(); props.initAttempt.data.allowPasswordless = false; - props.reason = { - kind: 'reason.vnet-cert-expired', - targetUri: appUri, - publicAddr: 'tcp-app.teleport.example.com', - }; + props.loginAttempt = makeProcessingAttempt(); + props.loggedInUserName = 'alice'; return ( @@ -277,7 +228,7 @@ export const SsoWithNoProvidersConfigured = () => { export const HardwareTapPrompt = () => { const props = makeProps(); props.loginAttempt.status = 'processing'; - props.webauthnLogin = { + props.passwordlessLoginState = { prompt: 'tap', }; return ( @@ -290,7 +241,7 @@ export const HardwareTapPrompt = () => { export const HardwarePinPrompt = () => { const props = makeProps(); props.loginAttempt.status = 'processing'; - props.webauthnLogin = { + props.passwordlessLoginState = { prompt: 'pin', }; return ( @@ -303,7 +254,7 @@ export const HardwarePinPrompt = () => { export const HardwareRetapPrompt = () => { const props = makeProps(); props.loginAttempt.status = 'processing'; - props.webauthnLogin = { + props.passwordlessLoginState = { prompt: 'retap', }; return ( @@ -316,7 +267,7 @@ export const HardwareRetapPrompt = () => { export const HardwareCredentialPrompt = () => { const props = makeProps(); props.loginAttempt.status = 'processing'; - props.webauthnLogin = { + props.passwordlessLoginState = { prompt: 'credential', loginUsernames: [ 'apple', @@ -338,7 +289,7 @@ export const HardwareCredentialPrompt = () => { export const HardwareCredentialPromptProcessing = () => { const props = makeProps(); props.loginAttempt.status = 'processing'; - props.webauthnLogin = { + props.passwordlessLoginState = { prompt: 'credential', loginUsernames: [ 'apple', @@ -350,7 +301,7 @@ export const HardwareCredentialPromptProcessing = () => { 'strawberry', ], }; - props.webauthnLogin.processing = true; + props.passwordlessLoginState.processing = true; return ( @@ -368,7 +319,7 @@ export const SsoPrompt = () => { ); }; -const TestContainer: React.FC = ({ children }) => ( +const TestContainer: FC = ({ children }) => ( <> Bordered box is not part of the component = ({ children }) => ( ); - -const dbGateway = makeDatabaseGateway({ - uri: '/gateways/gateway1', - targetName: 'postgres', - targetUri: '/clusters/teleport-local/dbs/postgres', - targetUser: 'alice', - targetSubresourceName: '', - localAddress: 'localhost', - localPort: '59116', - protocol: 'postgres', -}); - -const kubeGateway = makeKubeGateway({ - uri: '/gateways/gateway2', - targetName: 'minikube', - targetUri: '/clusters/teleport-local/kubes/minikube', - targetSubresourceName: '', - localAddress: 'localhost', - localPort: '59117', -}); diff --git a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.tsx b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.tsx index 5f80e5f5565a9..1909beaf3ebdd 100644 --- a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.tsx +++ b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLogin.tsx @@ -53,7 +53,7 @@ export function ClusterLoginPresentation({ onAbort, loggedInUserName, shouldPromptSsoStatus, - webauthnLogin, + passwordlessLoginState, reason, }: ClusterLoginPresentationProps) { return ( @@ -94,7 +94,7 @@ export function ClusterLoginPresentation({ loginAttempt={loginAttempt} clearLoginAttempt={clearLoginAttempt} shouldPromptSsoStatus={shouldPromptSsoStatus} - webauthnLogin={webauthnLogin} + passwordlessLoginState={passwordlessLoginState} /> )} diff --git a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLoginReason.story.tsx b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLoginReason.story.tsx new file mode 100644 index 0000000000000..e6e53becffc97 --- /dev/null +++ b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/ClusterLoginReason.story.tsx @@ -0,0 +1,171 @@ +/** + * Teleport + * Copyright (C) 2024 Gravitational, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +import { FC, PropsWithChildren } from 'react'; +import { Box } from 'design'; +import { Attempt } from 'shared/hooks/useAsync'; + +import * as types from 'teleterm/ui/services/clusters/types'; +import { + appUri, + makeDatabaseGateway, + makeKubeGateway, +} from 'teleterm/services/tshd/testHelpers'; + +import { + ClusterLoginPresentation, + ClusterLoginPresentationProps, +} from './ClusterLogin'; + +export default { + title: 'Teleterm/ModalsHost/ClusterLogin/Reason', +}; + +export const GatewayCertExpiredWithDbGateway = () => { + const props = makeProps(); + props.initAttempt.data.allowPasswordless = false; + props.reason = { + kind: 'reason.gateway-cert-expired', + targetUri: dbGateway.targetUri, + gateway: dbGateway, + }; + + return ( + + + + ); +}; + +export const GatewayCertExpiredWithKubeGateway = () => { + const props = makeProps(); + props.initAttempt.data.allowPasswordless = false; + props.reason = { + kind: 'reason.gateway-cert-expired', + targetUri: kubeGateway.targetUri, + gateway: kubeGateway, + }; + + return ( + + + + ); +}; + +export const GatewayCertExpiredWithoutGateway = () => { + const props = makeProps(); + props.initAttempt.data.allowPasswordless = false; + props.reason = { + kind: 'reason.gateway-cert-expired', + targetUri: dbGateway.targetUri, + gateway: undefined, + }; + + return ( + + + + ); +}; + +export const VnetCertExpired = () => { + const props = makeProps(); + props.initAttempt.data.allowPasswordless = false; + props.reason = { + kind: 'reason.vnet-cert-expired', + targetUri: appUri, + publicAddr: 'tcp-app.teleport.example.com', + }; + + return ( + + + + ); +}; + +function makeProps(): ClusterLoginPresentationProps { + return { + shouldPromptSsoStatus: false, + title: 'localhost', + loginAttempt: { + status: '', + statusText: '', + } as Attempt, + init: () => null, + initAttempt: { + status: 'success', + statusText: '', + data: { + localAuthEnabled: true, + authProviders: [], + type: '', + hasMessageOfTheDay: false, + allowPasswordless: true, + localConnectorName: '', + authType: 'local', + } as types.AuthSettings, + } as const, + + loggedInUserName: null, + onCloseDialog: () => null, + onAbort: () => null, + onLoginWithLocal: () => Promise.resolve<[void, Error]>([null, null]), + onLoginWithPasswordless: () => Promise.resolve<[void, Error]>([null, null]), + onLoginWithSso: () => null, + clearLoginAttempt: () => null, + passwordlessLoginState: null, + reason: undefined, + }; +} + +const TestContainer: FC = ({ children }) => ( + <> + Bordered box is not part of the component + props.theme.colors.levels.elevated}; + background: ${props => props.theme.colors.levels.surface}; + `} + > + {children} + + +); + +const dbGateway = makeDatabaseGateway({ + uri: '/gateways/gateway1', + targetName: 'postgres', + targetUri: '/clusters/teleport-local/dbs/postgres', + targetUser: 'alice', + targetSubresourceName: '', + localAddress: 'localhost', + localPort: '59116', + protocol: 'postgres', +}); + +const kubeGateway = makeKubeGateway({ + uri: '/gateways/gateway2', + targetName: 'minikube', + targetUri: '/clusters/teleport-local/kubes/minikube', + targetSubresourceName: '', + localAddress: 'localhost', + localPort: '59117', +}); diff --git a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormLocal/FormLocal.tsx b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormLocal/FormLocal.tsx index ef189c5d326d1..4a25bdf50f093 100644 --- a/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormLocal/FormLocal.tsx +++ b/web/packages/teleterm/src/ui/ClusterConnect/ClusterLogin/FormLogin/FormLocal/FormLocal.tsx @@ -24,6 +24,8 @@ import FieldInput from 'shared/components/FieldInput'; import { requiredField } from 'shared/components/Validation/rules'; import { useRefAutoFocus } from 'shared/hooks'; +import { LinearProgress } from 'teleterm/ui/components/LinearProgress'; + import type { Props } from '../FormLogin'; export const FormLocal = ({ @@ -83,6 +85,7 @@ export const FormLocal = ({ width="100%" disabled={isProcessing} /> +